diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..148c78e --- /dev/null +++ b/.env.production @@ -0,0 +1 @@ +NEXT_PUBLIC_API_URL=https://loolegostar-api.liara.run \ No newline at end of file diff --git a/.gitignore b/.gitignore index fd3dbb5..79a1f46 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,10 @@ .pnp.js .yarn/install-state.gz +*.rar +*.zip +*/*.zip +*/*/*.zip # testing /coverage diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..b58b603 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,5 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/aws.xml b/.idea/aws.xml new file mode 100644 index 0000000..03f1bb6 --- /dev/null +++ b/.idea/aws.xml @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/crm-app-ui.iml b/.idea/crm-app-ui.iml new file mode 100644 index 0000000..24643cc --- /dev/null +++ b/.idea/crm-app-ui.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..03d9549 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..32eda5c --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/components.json b/components.json new file mode 100644 index 0000000..a94867e --- /dev/null +++ b/components.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "src/app/globals.css", + "baseColor": "slate", + "cssVariables": true + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils" + } +} \ No newline at end of file diff --git a/liara.json b/liara.json new file mode 100644 index 0000000..b50b380 --- /dev/null +++ b/liara.json @@ -0,0 +1,4 @@ +{ + "platform": "next", + "app": "loolegostar-crm" +} \ No newline at end of file diff --git a/next.config.js b/next.config.js index 767719f..06048a1 100644 --- a/next.config.js +++ b/next.config.js @@ -1,4 +1,31 @@ /** @type {import('next').NextConfig} */ -const nextConfig = {} +const nextConfig = { + typescript: { + // !! WARN !! + // Dangerously allow production builds to successfully complete even if + // your project has type errors. + // !! WARN !! + ignoreBuildErrors: true, + }, + eslint: { + // Warning: This allows production builds to successfully complete even if + // your project has ESLint errors. + ignoreDuringBuilds: true, + }, + images: { + remotePatterns: [ + { + protocol: 'https', + hostname: 'loolegostar-api.liara.run', + port: '' + }, + { + protocol: 'http', + hostname: '127.0.0.1', + port: '8000' + }, + ], + }, +} module.exports = nextConfig diff --git a/package-lock.json b/package-lock.json index 317c90c..7c8a522 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,9 +8,41 @@ "name": "crm-app-ui", "version": "0.1.0", "dependencies": { + "@hookform/resolvers": "^3.3.3", + "@radix-ui/react-accordion": "^1.1.2", + "@radix-ui/react-alert-dialog": "^1.0.5", + "@radix-ui/react-dialog": "^1.0.5", + "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-popover": "^1.0.7", + "@radix-ui/react-select": "^2.0.0", + "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-switch": "^1.0.3", + "@radix-ui/react-tabs": "^1.0.4", + "@radix-ui/react-toast": "^1.1.5", + "@tanstack/react-query": "^4.36.1", + "@tanstack/react-table": "^8.10.7", + "axios": "^1.6.2", + "class-variance-authority": "^0.7.0", + "clsx": "^2.0.0", + "cmdk": "^0.2.0", + "date-fns": "^3.0.6", + "date-fns-jalali": "^2.30.0-0", + "lucide-react": "^0.292.0", + "moment-jalaali": "^0.10.0", "next": "14.0.1", + "next-themes": "^0.2.1", "react": "^18", - "react-dom": "^18" + "react-day-picker": "^8.10.0", + "react-dom": "^18", + "react-hook-form": "^7.49.2", + "react-icons": "^4.11.0", + "react-multi-date-picker": "^4.4.1", + "react-query": "^3.39.3", + "sonner": "^1.3.1", + "tailwind-merge": "^2.0.0", + "tailwindcss-animate": "^1.0.7", + "zaman": "^2.1.1", + "zod": "^3.22.4" }, "devDependencies": { "@types/node": "^20", @@ -37,7 +69,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, "engines": { "node": ">=10" }, @@ -45,11 +76,190 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/runtime": { "version": "7.23.2", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", - "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -57,6 +267,152 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/react": { + "version": "11.11.3", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.3.tgz", + "integrity": "sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz", + "integrity": "sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "node_modules/@emotion/styled": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -113,6 +469,48 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "dependencies": { + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "dependencies": { + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz", + "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==", + "dependencies": { + "@floating-ui/dom": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" + }, + "node_modules/@hookform/resolvers": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.3.3.tgz", + "integrity": "sha512-bOMxKkSD3zWcS11TKoUQ8O0ZqKslFohvUsPKSrdCHiuEuMjRo/u3cq9YRJD/+xtNGYup++XD2LkjhegP5XENiw==", + "peerDependencies": { + "react-hook-form": "^7.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.13", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", @@ -150,7 +548,6 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -164,7 +561,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -173,7 +569,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -181,14 +576,12 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.20", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -347,7 +740,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -360,7 +752,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -369,7 +760,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -378,6 +768,835 @@ "node": ">= 8" } }, + "node_modules/@radix-ui/number": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.1.tgz", + "integrity": "sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", + "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.1.2.tgz", + "integrity": "sha512-fDG7jcoNKVjSK6yfmuAs0EnPDro0WMXIhMtXdTBWqEioVW206ku+4Lw07e+13lUkFkpoEQ2PdeMIAGpdqEAmDg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collapsible": "1.0.3", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-alert-dialog": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.0.5.tgz", + "integrity": "sha512-OrVIOcZL0tl6xibeuGt5/+UxoT2N27KCFOPjFyfXMnchxSHZ/OW7cCX2nGlIYJrbHK/fczPcFzAwvNBB6XBNMA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-dialog": "1.0.5", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz", + "integrity": "sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.0.3.tgz", + "integrity": "sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz", + "integrity": "sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", + "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz", + "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.5.tgz", + "integrity": "sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.4", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-controllable-state": "1.0.1", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.1.tgz", + "integrity": "sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz", + "integrity": "sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-escape-keydown": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", + "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz", + "integrity": "sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", + "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.0.2.tgz", + "integrity": "sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.0.7.tgz", + "integrity": "sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.4", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-popper": "1.1.3", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-controllable-state": "1.0.1", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.3.tgz", + "integrity": "sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1", + "@radix-ui/react-use-rect": "1.0.1", + "@radix-ui/react-use-size": "1.0.1", + "@radix-ui/rect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.4.tgz", + "integrity": "sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.1.tgz", + "integrity": "sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", + "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz", + "integrity": "sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.0.0.tgz", + "integrity": "sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/number": "1.0.1", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.4", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-popper": "1.1.3", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1", + "@radix-ui/react-use-previous": "1.0.1", + "@radix-ui/react-visually-hidden": "1.0.3", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", + "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.0.3.tgz", + "integrity": "sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-use-previous": "1.0.1", + "@radix-ui/react-use-size": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.0.4.tgz", + "integrity": "sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-roving-focus": "1.0.4", + "@radix-ui/react-use-controllable-state": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toast": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.1.5.tgz", + "integrity": "sha512-fRLn227WHIBRSzuRzGJ8W+5YALxofH23y0MlPLddaIpLpCDqdE0NZlS2NRQDRiptfxDeeCjgFIpexB1/zkxDlw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1", + "@radix-ui/react-visually-hidden": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz", + "integrity": "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz", + "integrity": "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz", + "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz", + "integrity": "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.0.1.tgz", + "integrity": "sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz", + "integrity": "sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/rect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz", + "integrity": "sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz", + "integrity": "sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.1.tgz", + "integrity": "sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, "node_modules/@rushstack/eslint-patch": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.5.1.tgz", @@ -392,6 +1611,72 @@ "tslib": "^2.4.0" } }, + "node_modules/@tanstack/query-core": { + "version": "4.36.1", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.36.1.tgz", + "integrity": "sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "4.36.1", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-4.36.1.tgz", + "integrity": "sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw==", + "dependencies": { + "@tanstack/query-core": "4.36.1", + "use-sync-external-store": "^1.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-native": "*" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@tanstack/react-table": { + "version": "8.10.7", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.10.7.tgz", + "integrity": "sha512-bXhjA7xsTcsW8JPTTYlUg/FuBpn8MNjiEPhkNhIGCUR6iRQM2+WEco4OBpvDeVcR9SE+bmWLzdfiY7bCbCSVuA==", + "dependencies": { + "@tanstack/table-core": "8.10.7" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, + "node_modules/@tanstack/table-core": { + "version": "8.10.7", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.10.7.tgz", + "integrity": "sha512-KQk5OMg5OH6rmbHZxuNROvdI+hKDIUxANaHlV+dPlNN7ED3qYQ/WkpY2qlXww1SIdeMlkIhpN/2L00rof0fXFw==", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -407,17 +1692,22 @@ "undici-types": "~5.26.4" } }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + }, "node_modules/@types/prop-types": { "version": "15.7.9", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz", "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==", - "dev": true + "devOptional": true }, "node_modules/@types/react": { "version": "18.2.34", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.34.tgz", "integrity": "sha512-U6eW/alrRk37FU/MS2RYMjx0Va2JGIVXELTODaTIYgvWGCV4Y4TfTUzG8DdmpDNIT0Xpj/R7GfyHOJJrDttcvg==", - "dev": true, + "devOptional": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -428,7 +1718,7 @@ "version": "18.2.14", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.14.tgz", "integrity": "sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==", - "dev": true, + "devOptional": true, "dependencies": { "@types/react": "*" } @@ -437,7 +1727,7 @@ "version": "0.16.5", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.5.tgz", "integrity": "sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==", - "dev": true + "devOptional": true }, "node_modules/@typescript-eslint/parser": { "version": "6.9.1", @@ -611,14 +1901,12 @@ "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -630,8 +1918,7 @@ "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "node_modules/argparse": { "version": "2.0.1", @@ -639,6 +1926,17 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/aria-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", + "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/aria-query": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", @@ -793,6 +2091,11 @@ "has-symbols": "^1.0.3" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "node_modules/autoprefixer": { "version": "10.4.16", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", @@ -851,6 +2154,16 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/axobject-query": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", @@ -860,17 +2173,37 @@ "dequal": "^2.0.3" } }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "engines": { + "node": ">=0.6" + } }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, "engines": { "node": ">=8" } @@ -879,7 +2212,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -889,7 +2221,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -897,6 +2228,21 @@ "node": ">=8" } }, + "node_modules/broadcast-channel": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz", + "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "detect-node": "^2.1.0", + "js-sha3": "0.8.0", + "microseconds": "0.2.0", + "nano-time": "1.0.0", + "oblivious-set": "1.0.0", + "rimraf": "3.0.2", + "unload": "2.2.0" + } + }, "node_modules/browserslist": { "version": "4.22.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", @@ -958,7 +2304,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -967,7 +2312,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, "engines": { "node": ">= 6" } @@ -1011,7 +2355,6 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, "funding": [ { "type": "individual", @@ -1038,7 +2381,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -1046,11 +2388,276 @@ "node": ">= 6" } }, + "node_modules/class-variance-authority": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz", + "integrity": "sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==", + "dependencies": { + "clsx": "2.0.0" + }, + "funding": { + "url": "https://joebell.co.uk" + } + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, + "node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cmdk": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-0.2.0.tgz", + "integrity": "sha512-JQpKvEOb86SnvMZbYaFKYhvzFntWBeSZdyii0rZPhKJj9uwJBxu4DaVYDrRN7r3mPop56oPhRw+JYWTKs66TYw==", + "dependencies": { + "@radix-ui/react-dialog": "1.0.0", + "command-score": "0.1.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz", + "integrity": "sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-compose-refs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz", + "integrity": "sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-context": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz", + "integrity": "sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-dialog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.0.tgz", + "integrity": "sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-dismissable-layer": "1.0.0", + "@radix-ui/react-focus-guards": "1.0.0", + "@radix-ui/react-focus-scope": "1.0.0", + "@radix-ui/react-id": "1.0.0", + "@radix-ui/react-portal": "1.0.0", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.0", + "@radix-ui/react-slot": "1.0.0", + "@radix-ui/react-use-controllable-state": "1.0.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.4" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.0.tgz", + "integrity": "sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.0", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-escape-keydown": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-focus-guards": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz", + "integrity": "sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-focus-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.0.tgz", + "integrity": "sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-primitive": "1.0.0", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.0.tgz", + "integrity": "sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-portal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.0.tgz", + "integrity": "sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-presence": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz", + "integrity": "sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz", + "integrity": "sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-slot": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz", + "integrity": "sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz", + "integrity": "sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz", + "integrity": "sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.0.tgz", + "integrity": "sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz", + "integrity": "sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/cmdk/node_modules/react-remove-scroll": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.4.tgz", + "integrity": "sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1069,11 +2676,26 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-score": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/command-score/-/command-score-0.1.2.tgz", + "integrity": "sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w==" + }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, "engines": { "node": ">= 6" } @@ -1081,8 +2703,35 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -1102,7 +2751,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, "bin": { "cssesc": "bin/cssesc" }, @@ -1113,8 +2761,7 @@ "node_modules/csstype": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "node_modules/damerau-levenshtein": { "version": "1.0.8", @@ -1122,6 +2769,31 @@ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, + "node_modules/date-fns": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.0.6.tgz", + "integrity": "sha512-W+G99rycpKMMF2/YD064b2lE7jJGUe+EjOES7Q8BIGY8sbNdbgcs9XFTZwvzc9Jx1f3k7LB7gZaZa7f8Agzljg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/date-fns-jalali": { + "version": "2.30.0-0", + "resolved": "https://registry.npmjs.org/date-fns-jalali/-/date-fns-jalali-2.30.0-0.tgz", + "integrity": "sha512-2wz5AOzd3oQ+PnL3E/iKvJZ14i6oTp15sW047ZFCOgM9OSP8ggbb9jm/4SKI8ejdUGH96Krb5dfEQe8zbkVyZw==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + } + }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1176,6 +2848,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -1185,11 +2865,20 @@ "node": ">=6" } }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, "node_modules/dir-glob": { "version": "3.0.1", @@ -1206,8 +2895,7 @@ "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, "node_modules/doctrine": { "version": "3.0.0", @@ -1246,6 +2934,14 @@ "node": ">=10.13.0" } }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-abstract": { "version": "1.22.3", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", @@ -1374,7 +3070,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "engines": { "node": ">=10" }, @@ -1802,7 +3497,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -1818,7 +3512,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -1842,7 +3535,6 @@ "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -1863,7 +3555,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1871,6 +3562,11 @@ "node": ">=8" } }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -1907,6 +3603,25 @@ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -1916,6 +3631,19 @@ "is-callable": "^1.1.3" } }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fraction.js": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", @@ -1932,14 +3660,12 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -1953,7 +3679,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2000,6 +3725,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -2032,7 +3765,6 @@ "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2052,7 +3784,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -2211,7 +3942,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -2219,6 +3949,14 @@ "node": ">= 0.4" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, "node_modules/ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -2232,7 +3970,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -2257,7 +3994,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -2266,8 +4002,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/internal-slot": { "version": "1.0.6", @@ -2283,6 +4018,14 @@ "node": ">= 0.4" } }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -2297,6 +4040,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, "node_modules/is-async-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", @@ -2328,7 +4076,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -2368,7 +4115,6 @@ "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, "dependencies": { "hasown": "^2.0.0" }, @@ -2395,7 +4141,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -2431,7 +4176,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -2464,7 +4208,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -2634,15 +4377,24 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jalaali-js": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/jalaali-js/-/jalaali-js-1.2.6.tgz", + "integrity": "sha512-io974va+Qyu+UfuVX3UIAgJlxLhAMx9Y8VMfh+IG00Js7hXQo1qNQuwSiSa0xxco0SVgx5HWNkaiCcV+aZ8WPw==" + }, "node_modules/jiti": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", - "dev": true, "bin": { "jiti": "bin/jiti.js" } }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2666,6 +4418,11 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -2749,7 +4506,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, "engines": { "node": ">=10" } @@ -2757,8 +4513,7 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/locate-path": { "version": "6.0.0", @@ -2804,11 +4559,27 @@ "node": ">=10" } }, + "node_modules/lucide-react": { + "version": "0.292.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.292.0.tgz", + "integrity": "sha512-rRgUkpEHWpa5VCT66YscInCQmQuPCB1RFRzkkxMxg4b+jaL0V12E3riWWR2Sh5OIiUhCwGW/ZExuEO4Az32E6Q==", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/match-sorter": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.1.tgz", + "integrity": "sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "remove-accents": "0.4.2" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "engines": { "node": ">= 8" } @@ -2817,7 +4588,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -2826,11 +4596,34 @@ "node": ">=8.6" } }, + "node_modules/microseconds": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", + "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2847,6 +4640,36 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-jalaali": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/moment-jalaali/-/moment-jalaali-0.10.0.tgz", + "integrity": "sha512-XICH1+UHd3zyaE1bXWQBlhoXBqbzEyFfT0TrifNobHxLALRuTSwXn376bX8FmkYg9mZimevwwdd6EB57s5wuFA==", + "dependencies": { + "jalaali-js": "^1.1.0", + "moment": "^2.22.2", + "moment-timezone": "^0.5.21", + "rimraf": "^3.0.2" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.43", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz", + "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==", + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -2857,13 +4680,20 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, + "node_modules/nano-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", + "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==", + "dependencies": { + "big-integer": "^1.6.16" + } + }, "node_modules/nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", @@ -2932,6 +4762,16 @@ } } }, + "node_modules/next-themes": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.2.1.tgz", + "integrity": "sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==", + "peerDependencies": { + "next": "*", + "react": "*", + "react-dom": "*" + } + }, "node_modules/node-releases": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", @@ -2942,7 +4782,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -2960,7 +4799,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -2969,7 +4807,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, "engines": { "node": ">= 6" } @@ -3083,11 +4920,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/oblivious-set": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz", + "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==" + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -3143,7 +4984,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -3151,6 +4991,23 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3164,7 +5021,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -3181,14 +5037,12 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, "engines": { "node": ">=8" } @@ -3202,7 +5056,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -3214,7 +5067,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -3223,7 +5075,6 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, "engines": { "node": ">= 6" } @@ -3259,7 +5110,6 @@ "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -3276,7 +5126,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, "dependencies": { "camelcase-css": "^2.0.1" }, @@ -3295,7 +5144,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "dev": true, "dependencies": { "lilconfig": "^2.0.5", "yaml": "^2.1.1" @@ -3324,7 +5172,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.11" }, @@ -3343,7 +5190,6 @@ "version": "6.0.13", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3355,8 +5201,7 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/prelude-ls": { "version": "1.2.1", @@ -3378,6 +5223,11 @@ "react-is": "^16.13.1" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -3391,7 +5241,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -3418,6 +5267,24 @@ "node": ">=0.10.0" } }, + "node_modules/react-date-object": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/react-date-object/-/react-date-object-2.1.8.tgz", + "integrity": "sha512-94zg/9r29v/VsKsJT0E5+tPg85IyMirkU/B7qBWlhT7RDSuf9x5dczfbQOsj9TbzSVUK/Vx/ZDboOBy9hA381w==" + }, + "node_modules/react-day-picker": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.0.tgz", + "integrity": "sha512-mz+qeyrOM7++1NCb1ARXmkjMkzWVh2GL9YiPbRjKe0zHccvekk4HE+0MPOZOrosn8r8zTHIIeOUXTmXRqmkRmg==", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/gpbl" + }, + "peerDependencies": { + "date-fns": "^2.28.0 || ^3.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-dom": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", @@ -3430,17 +5297,153 @@ "react": "^18.2.0" } }, + "node_modules/react-element-popper": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/react-element-popper/-/react-element-popper-2.1.6.tgz", + "integrity": "sha512-8va7mUmrKIkUnaM2t5Dyctd8cjgVgVcrv5vVD0FRay0sN6EPBCKa0bDi1/KmVDAjfgSIn7zQnjtc4VojcGrkgQ==", + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/react-hook-form": { + "version": "7.49.2", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.49.2.tgz", + "integrity": "sha512-TZcnSc17+LPPVpMRIDNVITY6w20deMdNi6iehTFLV1x8SqThXGwu93HjlUVU09pzFgZH7qZOvLMM7UYf2ShAHA==", + "engines": { + "node": ">=18", + "pnpm": "8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18" + } + }, + "node_modules/react-icons": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.11.0.tgz", + "integrity": "sha512-V+4khzYcE5EBk/BvcuYRq6V/osf11ODUM2J8hg2FDSswRrGvqiYUYPRy4OdrWaQOBj4NcpJfmHZLNaD+VH0TyA==", + "peerDependencies": { + "react": "*" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-multi-date-picker": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/react-multi-date-picker/-/react-multi-date-picker-4.4.1.tgz", + "integrity": "sha512-z0utCiMYijt2w3UoVJkYgsReE9l1k6DkiL13Vr2RKHnBnorKK0IYq7xpfkuMimvt7sLumFr5wTKsWumCgSkXkA==", + "dependencies": { + "react-date-object": "^2.1.8", + "react-element-popper": "^2.1.6" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/react-query": { + "version": "3.39.3", + "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz", + "integrity": "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "broadcast-channel": "^3.4.1", + "match-sorter": "^6.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, "dependencies": { "pify": "^2.3.0" } @@ -3449,7 +5452,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -3480,8 +5482,7 @@ "node_modules/regenerator-runtime": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", - "dev": true + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regexp.prototype.flags": { "version": "1.5.1", @@ -3500,11 +5501,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/remove-accents": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz", + "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==" + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -3521,7 +5526,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "engines": { "node": ">=4" } @@ -3539,7 +5543,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -3549,7 +5552,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -3564,7 +5566,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -3711,6 +5712,23 @@ "node": ">=8" } }, + "node_modules/sonner": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-1.3.1.tgz", + "integrity": "sha512-+rOAO56b2eI3q5BtgljERSn2umRk63KFIvgb2ohbZ5X+Eb5u+a/7/0ZgswYqgBMg8dyl7n6OXd9KasA8QF9ToA==", + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -3847,11 +5865,15 @@ } } }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, "node_modules/sucrase": { "version": "3.34.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", @@ -3873,7 +5895,6 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3905,7 +5926,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -3913,11 +5933,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tailwind-merge": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.0.0.tgz", + "integrity": "sha512-WO8qghn9yhsldLSg80au+3/gY9E4hFxIvQ3qOmlpXnqpDKoMruKfi/56BbbMg6fHTQJ9QD3cc79PoWqlaQE4rw==", + "dependencies": { + "@babel/runtime": "^7.23.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, "node_modules/tailwindcss": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", - "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -3950,6 +5981,14 @@ "node": ">=14.0.0" } }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz", + "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -3969,7 +6008,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, "dependencies": { "any-promise": "^1.0.0" } @@ -3978,7 +6016,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -3986,11 +6023,18 @@ "node": ">=0.8" } }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -4013,8 +6057,7 @@ "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, "node_modules/tsconfig-paths": { "version": "3.14.2", @@ -4156,6 +6199,15 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, + "node_modules/unload": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz", + "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==", + "dependencies": { + "@babel/runtime": "^7.6.2", + "detect-node": "^2.0.4" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", @@ -4195,11 +6247,59 @@ "punycode": "^2.1.0" } }, + "node_modules/use-callback-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", + "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/watchpack": { "version": "2.4.0", @@ -4307,8 +6407,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/yallist": { "version": "4.0.0", @@ -4320,7 +6419,6 @@ "version": "2.3.4", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", - "dev": true, "engines": { "node": ">= 14" } @@ -4336,6 +6434,24 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zaman": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/zaman/-/zaman-2.1.1.tgz", + "integrity": "sha512-I/RJfixtwfnLfRWAwrorn1ep59lKvmT7VCncAFzUxT8mDe+9YzAv5hrIANy3i+yiuELkdGXLIYhCVfksV2zB+g==", + "dependencies": { + "@emotion/react": "^11.10.5", + "@emotion/styled": "^11.10.5", + "dayjs": "^1.11.7" + } + }, + "node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/package.json b/package.json index d03df9b..2a74ed8 100644 --- a/package.json +++ b/package.json @@ -9,19 +9,51 @@ "lint": "next lint" }, "dependencies": { + "@hookform/resolvers": "^3.3.3", + "@radix-ui/react-accordion": "^1.1.2", + "@radix-ui/react-alert-dialog": "^1.0.5", + "@radix-ui/react-dialog": "^1.0.5", + "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-popover": "^1.0.7", + "@radix-ui/react-select": "^2.0.0", + "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-switch": "^1.0.3", + "@radix-ui/react-tabs": "^1.0.4", + "@radix-ui/react-toast": "^1.1.5", + "@tanstack/react-query": "^4.36.1", + "@tanstack/react-table": "^8.10.7", + "axios": "^1.6.2", + "class-variance-authority": "^0.7.0", + "clsx": "^2.0.0", + "cmdk": "^0.2.0", + "date-fns": "^3.0.6", + "date-fns-jalali": "^2.30.0-0", + "lucide-react": "^0.292.0", + "moment-jalaali": "^0.10.0", + "next": "14.0.1", + "next-themes": "^0.2.1", "react": "^18", + "react-day-picker": "^8.10.0", "react-dom": "^18", - "next": "14.0.1" + "react-hook-form": "^7.49.2", + "react-icons": "^4.11.0", + "react-multi-date-picker": "^4.4.1", + "react-query": "^3.39.3", + "sonner": "^1.3.1", + "tailwind-merge": "^2.0.0", + "tailwindcss-animate": "^1.0.7", + "zaman": "^2.1.1", + "zod": "^3.22.4" }, "devDependencies": { - "typescript": "^5", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", "autoprefixer": "^10.0.1", + "eslint": "^8", + "eslint-config-next": "14.0.1", "postcss": "^8", "tailwindcss": "^3.3.0", - "eslint": "^8", - "eslint-config-next": "14.0.1" + "typescript": "^5" } } diff --git a/src/IranSans/IranSansX(Eco)/Farsi numerals/IRANSansXFaNum-Bold.ttf b/src/IranSans/IranSansX(Eco)/Farsi numerals/IRANSansXFaNum-Bold.ttf new file mode 100644 index 0000000..12557c4 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Farsi numerals/IRANSansXFaNum-Bold.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Farsi numerals/IRANSansXFaNum-Regular.ttf b/src/IranSans/IranSansX(Eco)/Farsi numerals/IRANSansXFaNum-Regular.ttf new file mode 100644 index 0000000..9c9f0f6 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Farsi numerals/IRANSansXFaNum-Regular.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/Fa Numral Help.html b/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/Fa Numral Help.html new file mode 100644 index 0000000..bb8a5b4 --- /dev/null +++ b/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/Fa Numral Help.html @@ -0,0 +1,534 @@ + + + + + IranSansX OpenType features in CSS + + + + + + + + + + +
+ +

فارسی کردن اعداد انگلیسی و عربی

+ +

Stylistic alternates (ss01)

+

با فعال کردن استایلستیک سری ss01 اعداد انگلیسی بصورت فارسی نمایش داده می‌شود. در مثال زیر ردیف اول اعداد فارسی است و ردیف دوم اعداد انگلیسی است که فارسی شده است.

+

+.ss01 { + -moz-font-feature-settings: "ss01"; + -webkit-font-feature-settings: "ss01"; + font-feature-settings: "ss01"; +} +
+
+

+۱۲۳۴۵۶۷۸۹۰ +
+1234567890 +

+
+ + +
+

+

هم عرض (monospace) کردن اعداد

+ +

Stylistic alternates (ss03)

+

با فعال کردن استایلستیک سری ss03 اعداد بصورت منو اسپیس تایپ می‌شود یعنی عرض همه اعداد برابر است و مناسب استفاده در لیست‌ها و جداول اطلاعات. +
+در سطر دوم اعداد انگلیسی فارسی و هم‌عرض شده است. +

+

+.ss03 { + -moz-font-feature-settings: "ss03"; + -webkit-font-feature-settings: "ss03"; + font-feature-settings: "ss03"; +} +
+
+

+ ۱۲۳۴۵۶۷۸۹۰ +
+ 1234567890 +

+
+
+ +
+

+

تغییر تراز عمودی اعداد

+ +

Stylistic alternates (ss04)

+

با فعال کردن استایلستیک سری ss04 اعداد کمی پایین‌تر از خط کرسی قرار می‌گیرد تا تراز عمودی در باکس‌های طراحی وسط باشد. +
+در مثال زیر: خط اول تراز اعداد در حالت پیش‌فرض و در خط دوم به کمک استایل ss04 تراز تغییر کرده است.

+

+.ss04 { + -moz-font-feature-settings: "ss04"; + -webkit-font-feature-settings: "ss04"; + font-feature-settings: "ss04"; +} +
+
+

+ ۱۲۳۴۵۶۷۸۹۰ ریال +

+
+

+ ۱۲۳۴۵۶۷۸۹۰ ریال +

+
+
+ + +
+ + + + + + diff --git a/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/IranSansX.html b/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/IranSansX.html new file mode 100644 index 0000000..7a68f4f --- /dev/null +++ b/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/IranSansX.html @@ -0,0 +1,422 @@ + + + + +IRANSansX Family Type face: خانواده فونت ایران‌سنس + + + + + + + + +
+ +
+
+

بِسْمِ اللهِ الرَّحْمَنِ الرَّحِيمِ

+
+
د
+
+
+ ن وَالْقَلَمِ وَ مَا يَسْطُرُون +
+ نون؛ سوگند به قلم و آنچه می نويسند. +
+ Noon. I swear by the pen and what the angels write +
+
+
+
+ +
+ +
+

نکاتی درباره تایپوگرافی وب

+
+ +
ج
+
+

از زمان پیدایش نخستین وب سایت، متن ها یکی از اجزای مهم صفحات وب بودند. هر چند به مرور زمان با ورود تصاویر، صوت و فیلم کمی از بار مسئولیت متون کم شد اما هنوز جایگاه خود را از دست نداده اند و بخش مهمی از کار را به عهده دارند.

+

بسیاری از طراحان وب سایت به صورت تجربی بهترین ترکیب و ظاهر را برای نمایش متن ها انتخاب می کنند. اما اصولی وجود دارد که با رعایت آن ها، تاثیرپذیری و زیبایی سایت چند برابر خواهد شد.

+

در ادامه مطلب قصد داریم تعدادی از اصول مقدماتی تایپوگرافی را به اختصار مرور کنیم. هرچند بسیاری از دوستان با این نکات آشنا هستند؛ اما شاید مرور آن ها خالی از لطف نباشد.

+
+ + +
+ +
+
+

تاثیر اندازه فونت و سلسله مراتب تگ‌ها

+
+
ن
+
+

فونت های داخل سایت باید به گونه ای قرار گیرند که کاربر به راحتی بتواند آن ها را بخواند. نوع فونت، وزن و کوچک (یا بزرگ) بودن اندازه آن ممکن است تمایل کاربر برای بازگشت به وب سایت را کاهش دهد. قواعد و قوانین زیادی برای انتخاب بهترین فونت وجود دارد.

+

در زیر می توانید ۱۲ وزن مختلف خانواده فونت ایران‌سنس را در شرایط یکسان مشاهده کنید. لازم به ذکر است برای این صفحه از وزن معمولی (Normal) استفاده شده است.

+
+
+ + +
+
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Thin)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (UltraLight)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Light)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Regular)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Medium)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (demiBold)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Bold)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (ExtraBold)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Black)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (ExBlack)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Heavy)
+
+
+ +
+
+ +
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Thin)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (UltraLight)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Light)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Regular)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Medium)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (demiBold)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Bold)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (ExtraBold)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Black)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (ExBlack)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Heavy)
+
+
+ + +
+
+

تگ‌های هدینگ

+
+
و
+
+

در این بین، استفاده از تگ های هدینگ مناسب و رعایت سلسله مراتب آن ها، هم مفهوم نوشته را بهتر منتقل می کند و هم تاثیر قابل توجهی در نتایج موتورهای جستجو خواهد داشت. این نکته یکی از فاکتورهای مهم در بهینه سازی وب سایت برای موتورهای جستجو (Search Engine Optimization) است.

+

نمونه ای از خروجی تگ های هدینگ با سایز استاندارد مربوطه به فونت های فونت ایران‌سنس را در زیر مشاهده می کنید.

+
+
+ +
+
+

(H1) نابرده رنج گنج میسر نمی شود. No gain without pain

+

(H2) نابرده رنج گنج میسر نمی شود. No gain without pain

+

(H3) نابرده رنج گنج میسر نمی شود. No gain without pain

+

(H4) نابرده رنج گنج میسر نمی شود. No gain without pain

+
(H5) نابرده رنج گنج میسر نمی شود. No gain without pain
+
(H6) نابرده رنج گنج میسر نمی شود. No gain without pain
+
+
+ +
+
+

(H1) نابرده رنج گنج میسر نمی شود. No gain without pain

+

(H2) نابرده رنج گنج میسر نمی شود. No gain without pain

+

(H3) نابرده رنج گنج میسر نمی شود. No gain without pain

+

(H4) نابرده رنج گنج میسر نمی شود. No gain without pain

+
(H5) نابرده رنج گنج میسر نمی شود. No gain without pain
+
(H6) نابرده رنج گنج میسر نمی شود. No gain without pain
+
+
+ +
+
+

سطر و ستون بندی

+
+
م
+
+

معمولاً هرگاه مقدار نوشته از یک سطر بیشتر شود ناگزیر به ستون بندی هستیم. و این کار ما را با چند متغییر مواجه خواهد کرد:

+

۱- عرض ستون‌های متنی که حاوی حداقل۷ کلمه باشد بهترین انتخاب است. اگر ستون کوتاه‌تر باشد چشم بیننده در اثر حرکت‌های زود به زود از پایان یک سطر به ابتدای سطر بعدی خسته خواهد شد. علاوه بر این لبه ستون‌هایی با عرض کم نیز همیشه دندانه ای و بی نظم خواهد بود. ستون‌هایی با عرض طولانی هم برای خواننده آزار دهنده است چرا که چشم در حرکت بازگشت از انتهای یک سطر به ابتدای سطر بعدی ممکن است دچار اشتباه شود. + +

۲- لدینگ یا همان فاصله سطر هم در ستون بندی اهمیت دارد. ستون‌های فشرده اگرچه به لحاظ گرافیکی منسجم و زیبا هستند اما عمل خواندن را مختل می کنند و در مقابل، فاصله سطر زیاد نیز باعث نازیبایی و خستگی چشم خواننده می‌شود. فاصله سطر همیشه می تواند با توجه به نوع فونت و عرض ستون‌ها تغییر کند. بدین ترتیب که فونت‌هایی با دندانه‌های بلند‌تر و ستون‌هایی با عرض بیشتر به لدینگ بیشتری نیاز دارند. +

۳- همترازی هم یکی از متغییرهای پر بحث در ستون بندی است. اما به طور کوتاه و خلاصه باید گفت که بهتر است در متن فارسی از همترازی یا همان Justification استفاده نکنید. این عمل اگرچه لبه پاراگراف شما را مرتب خواهد کرد اما تنظیمات فاصله حروف را تغییر خواهد داد و در نتیجه باعث کاهش خوانایی خواهد شد.

+
+ +
+
(IRANSansX Thin)
+
ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX UltraLight)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX Light)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX Regular)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX Mediume)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX DemiBold)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX Bold)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX ExtraBold)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX Black)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX ExtraBlack)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX Heavy)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ + +
+
(IRANSansX Thin)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX UltraLight)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX Light)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX Regular)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX Mediume)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX DemiBold)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX Bold)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX ExtraBold)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX Black)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX ExtraBlack)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX Heavy)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
+

اعداد و علائم در فونت فارسی

+
+
ظ
+
+

اعداد فارسی: ۱۲۳۴۵۶۷۸۹۰
+ اعداد عربی: ۱۲۳٤٥٦۷۸۹۰
+ اعداد انگلیسی: 1234567890

+

برای تایپ اعداد فارسی در محیط وب از کیبورد استاندارد فارسی استفاده کنید. در ویندوز ۸ و یا بالاتر این کیبورد، با نام Persian(Standard)Keyboard در لیست کیبوردهای ویندوز وجود دارد. همچنین می توانید از این آدرس آن را دانلود و نصب کنید.

+ +

با استفاده از کیبورد استاندارد می‌توانید ممیز فارسی را تایپ کنید.
+ میانبر این علامت کلیدهای Shift+3 است. به این شکل: ۳٫۱۴
+ ممیز فارسی با علامت اسلش تفاوت دارد :۳/۱۴ +

+

با استفاده از کیبورد استاندارد می‌توانید جداکننده هزارگان فارسی را تایپ کنید.
+ میانبر این علامت کلیدهای Shift+2 است. به این شکل: ۹٬۲۱۰٬۰۰۰
+ این علامت با جدا کننده هزارگان انگلیسی تفاوت دارد : ۹,۲۱۰,۰۰۰ +

+
+
+ +
+
+

نسبت‌های طلایی

+
+
+
+ ۳٫۷۷۷ ÷ ۱٫۶۱۸ = ۲٫۳۳۵ +
+ ۶٫۱۱۲ ÷ ۱٫۶۱۸ = ۳٫۷۷۷ +
+ ۹٫۸۸۹ ÷ ۱٫۶۱۸ = ۶٫۱۱۲ +
+ ۱۶ ÷ ۱٫۶۱۸ = ۹٫۸۸۹ +
+....................................... +
+ ۱۶ × ۱٫۶۱۸ = ۲۵٫۸۸۸ +
+ ۲۵٫۸۸۸ × ۱٫۶۱۸ = ۴۱٫۸۸۷ +
+ ۴۱٫۸۸۷ × ۱٫۶۱۸ = ۶۷٫۷۷۳ +
+ ۶۷٫۷۷۳ × ۱٫۶۱۸ = ۱۰۹٫۶۵۶ +
+
+
+

اهمیت اندازه فونت در خوانایی و زیبا شدن صفحه وب سایت بر کسی پوشیده نیست. در کنار این بحث، موارد دیگری مانند ارتفاع خطوط، فاصله ها، ابعاد قسمت های مختلف و ... نیز در بحث تایپوگرافی اهمیت زیادی دارند.

+

برای محاسبه این اعداد می توانیم از سری اعداد متناسب (Modular Scale) استفاده کنیم. در حقیقت از تعدادی عدد پشت سر هم که بر اساس مضرب خاصی تشکیل شده اند برای تنظیمات ارتفاع خط، فاصله ها، ابعاد و ... استفاده می کنیم. نسبت (عدد) طلایی همان مضرب اعداد است.

+

به عنوان مثال می خواهیم از سایز 16px فونت ایران‌سنس به عنوان فونت و سایز اصلی متن صفحات استفاده کنیم. عدد فی (phi) یونانی که معادل ۱٫۶۱۸۰۳۳۹۸۸۷ (به اختصار ۱٫۶۱۸) است را به عنوان نسبت طلایی در نظر می گیریم. بنابراین سری اعدادی به شکل روبرو خواهیم داشت:

+ +

+ به کمک این اعداد و استفاده از آن ها در صفحات وب سایت خود می توانیم خوانایی و زیبایی آن را افزایش دهیم. علاوه بر آن، اگر از واحدهای نسبی مانند em استفاده شود، امکانات بیشتری در اختیار طراح و بازدیدکننده خواهد بود. البته سری اعداد بر مبنای نسبت طلایی فقط در تایپوگرافی وب سایت کاربرد ندارد. + این اعداد می تواند ادامه داشته باشد (۱٬۲۱۵٫۹۸۱ ، ۱٬۹۶۷٫۴۵۷ ، ۳٬۱۸۳٫۳۴۵ و ...). +

+ ایران‌سنس +
+
+ + +
+
+
+در این فایل سعی کردیم همراه با یک مطلب آموزشی کوتاه، نحوه استفاده از خانواده فونت ایران‌سنس و پیش نمایشی از قسمت های مختلف آن را مرور کنیم. +
+برای مشاهده راهنمای نحوه قراردادن فونت ها در وب سایت خود، به این آدرس مراجعه کنید. +
+
+
+
+
ء
+
+ +
+ +
+ + \ No newline at end of file diff --git a/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/fontiran.css b/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/fontiran.css new file mode 100644 index 0000000..257f305 --- /dev/null +++ b/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/fontiran.css @@ -0,0 +1,109 @@ +/** +* +* Name: IRANSansX Fonts +* Version: 3 +* Author: Moslem Ebrahimi (moslemebrahimi.com) +* Created on: Apr 22, 2021 +* Updated on: Jul 12, 2023 +* Website: http://fontiran.com +* Copyright: Commercial/Proprietary Software +-------------------------------------------------------------------------------------- +فونتایران سنس Xا یک نرم افزار مالکیتی محسوب می شود. جهت آگاهی از قوانین استفاده از این فونت ها لطفا به وب سایت (فونت ایران دات کام) مراجعه نمایید +-------------------------------------------------------------------------------------- +IRANSansX fonts are considered a proprietary software. To gain information about the laws regarding the use of these fonts, please visit www.fontiran.com +-------------------------------------------------------------------------------------- +This set of fonts are used in this project under the license: (.....) +------------------------------------------------------------------------------------- fonts/- +* +**/ + + +@font-face { + font-family: IRANSansX; + font-style: normal; + font-weight: 100; + src: url('fonts/woff/IRANSansXFaNum-Thin.woff') format('woff'), + url('fonts/woff2/IRANSansXFaNum-Thin.woff2') format('woff2'); +} + +@font-face { + font-family: IRANSansX; + font-style: normal; + font-weight: 200; + src: url('fonts/woff/IRANSansXFaNum-UltraLight.woff') format('woff'), + url('fonts/woff2/IRANSansXFaNum-UltraLight.woff2') format('woff2'); +} + +@font-face { + font-family: IRANSansX; + font-style: normal; + font-weight: 300; + src: url('fonts/woff/IRANSansXFaNum-Light.woff') format('woff'), + url('fonts/woff2/IRANSansXFaNum-Light.woff2') format('woff2'); +} + +@font-face { + font-family: IRANSansX; + font-style: normal; + font-weight: 500; + src: url('fonts/woff/IRANSansXFaNum-Medium.woff') format('woff'), + url('fonts/woff2/IRANSansXFaNum-Medium.woff2') format('woff2'); +} + +@font-face { + font-family: IRANSansX; + font-style: normal; + font-weight: 600; + src: url('fonts/woff/IRANSansXFaNum-DemiBold.woff') format('woff'), + url('fonts/woff2/IRANSansXFaNum-DemiBold.woff2') format('woff2'); +} + +@font-face { + font-family: IRANSansX; + font-style: normal; + font-weight: 800; + src: url('fonts/woff/IRANSansXFaNum-ExtraBold.woff') format('woff'), + url('fonts/woff2/IRANSansXFaNum-ExtraBold.woff2') format('woff2'); +} + +@font-face { + font-family: IRANSansX; + font-style: normal; + font-weight: 900; + src: url('fonts/woff/IRANSansXFaNum-Black.woff') format('woff'), + url('fonts/woff2/IRANSansXFaNum-Black.woff2') format('woff2'); +} + +@font-face { + font-family: IRANSansX; + font-style: normal; + font-weight: 950; + src: url('fonts/woff/IRANSansXFaNum-ExtraBlack.woff') format('woff'), + url('fonts/woff2/IRANSansXFaNum-ExtraBlack.woff2') format('woff2'); +} + +@font-face { + font-family: IRANSansX; + font-style: normal; + font-weight: 1000; + src: url('fonts/woff/IRANSansXFaNum-Heavy.woff') format('woff'), + url('fonts/woff2/IRANSansXFaNum-Heavy.woff2') format('woff2'); +} + +@font-face { + font-family: IRANSansX; + font-style: normal; + font-weight: bold; + src: url('fonts/woff/IRANSansXFaNum-Bold.woff') format('woff'), + url('fonts/woff2/IRANSansXFaNum-Bold.woff2') format('woff2'); +} + +@font-face { + font-family: IRANSansX; + font-style: normal; + font-weight: normal; + src: url('fonts/woff/IRANSansXFaNum-Regular.woff') format('woff'), + url('fonts/woff2/IRANSansXFaNum-Regular.woff2') format('woff2'); +} + + diff --git a/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/fonts/Woff/IRANSansXFaNum-Bold.woff b/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/fonts/Woff/IRANSansXFaNum-Bold.woff new file mode 100644 index 0000000..162d955 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/fonts/Woff/IRANSansXFaNum-Bold.woff differ diff --git a/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/fonts/Woff/IRANSansXFaNum-Regular.woff b/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/fonts/Woff/IRANSansXFaNum-Regular.woff new file mode 100644 index 0000000..4a01edc Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/fonts/Woff/IRANSansXFaNum-Regular.woff differ diff --git a/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/fonts/Woff2/IRANSansXFaNum-Bold.woff2 b/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/fonts/Woff2/IRANSansXFaNum-Bold.woff2 new file mode 100644 index 0000000..6556372 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/fonts/Woff2/IRANSansXFaNum-Bold.woff2 differ diff --git a/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/fonts/Woff2/IRANSansXFaNum-Regular.woff2 b/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/fonts/Woff2/IRANSansXFaNum-Regular.woff2 new file mode 100644 index 0000000..e08285c Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/fonts/Woff2/IRANSansXFaNum-Regular.woff2 differ diff --git a/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/letter-spacing.png b/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/letter-spacing.png new file mode 100644 index 0000000..49c76e8 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/letter-spacing.png differ diff --git a/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/style.css b/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/style.css new file mode 100644 index 0000000..1bd5161 --- /dev/null +++ b/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/style.css @@ -0,0 +1,244 @@ +@import url(fontiran.css); /* لینک فایلی که وظیفه بارگذاری فونت ها را برعهده دارد */ +body { + font-family: IRANSansX !important; + direction: rtl; + background-color: #cdcdcd; + margin: 0; +} +h1, h2, h3, h4, h5, h6,input, textarea { + font-family: IRANSansX !important; +} +h1 { + font-weight: bold; +} +.wrapper { + max-width: 900px; + margin: 0 auto; +} +.ltr { + direction: ltr; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-left { + text-align: left; +} +.text-small { + font-size: 0.8em; +} +.text-xsmall { + font-size: 0.6em; +} +.text-large { + font-size: 1.2em; +} +.text-xlarge { + font-size: 1.4em; +} +.text-underline { + text-decoration:underline; +} + +.text-thin { + font-weight: 400; +} +.text-UltraLight { + font-weight: 400; +} +.text-light { + font-weight: 400; +} +.text-regular { + font-weight: normal; +} +.text-medium { + font-weight: 700; +} +.text-demibold { + font-weight: 700; +} +.text-bold { + font-weight: bold; +} + +.text-extrabold { + font-weight: 700; +} +.text-black { + font-weight: 700; +} +.text-extrablack { + font-weight: 700; +} +.text-heavy { + font-weight: 700; +} + +blockquote { + font-weight: 700; + padding: 10px; + border: 1px dashed #666666; +} + +.mainbox { + width: 100%; + background-color: #EFEFEF; + display: table; + margin-bottom: 30px; + border-right: 8px solid #df79ff; +} + +.mainboxnegativ { + width: 100%; + background-color: #000000; + display: table; + margin-bottom: 30px; + border-right: 8px solid #df79ff; + color: #F9F9F9; +} + +.mainbox2 { + font-size: 1em; + width: 90%; + padding-right: 20px; + padding-top: 10px; + padding-bottom: 10px; +} +.mainboxitalic { + font-size: 1em; + font-style: italic; + width: 90%; + padding-right: 20px; + padding-top: 10px; + padding-bottom: 10px; +} + +.mainbox3 { + width: 100%; + background-color: #DFDFDF; + display: table; + margin-bottom: 30px; + border-right: 8px solid #FF5EAA; +} + +.mainbox2negativ { + font-size: 1em; + color: #F9F9F9; + background-color: #000000; + padding-right: 20px; +} + + +.farsiparagraph { + font-size: 1em; + width: 47%; + float:right; + padding-right: 20px; + padding-top: 10px; + padding-bottom: 10px; + +} + +.farsiparagraph_negativ { + font-size: 1em; + color: #F9F9F9; + background-color: #000000; + width: 47%; + float:right; + padding-right: 20px; + padding-top: 10px; + padding-bottom: 10px; + +} + + +.englishparagraph { + font-size: 1em; + width: 47%; + float: left; + direction:ltr; + padding-left: 20px; + padding-top: 10px; + padding-bottom: 10px; + + +} + +.englishparagraph_negativ { + font-size: 1em; + color: #F9F9F9; + background-color: #000000; + width: 47%; + float: left; + direction:ltr; + padding-left: 20px; + padding-top: 10px; + padding-bottom: 10px; + + +} +.rightbox { + width: 60%; + padding-right: 20px; + padding-left: 5px; + float: right; + margin-left: 10px; + margin-bottom: 0px; + min-width: 0px; + background-color: #F7F7F7; + +} + +.titelbox { + width: 60%; + padding-right: 25px; + padding-left: 0px; + float: right; + margin-left: 10px; + margin-bottom: 0px; + min-width: 0px; + background-color: #d5d5d5; + color: #4B4B4B; +} + + +.lefttbox { + + padding-right: 20px; + padding-left: 4px; + float: right; + margin-bottom: 10px; + min-width: 0px; +} + +.alphabet { + width: 35%; + float: left; + font-size: 20em; + text-align: center; + font-weight: 700; + color: #999999; +} + +.alphabet2 { + width: 35%; + float: left; + direction: ltr; + font-size: 1.6em; + text-align: left; + font-weight: 700; + color: #333333; + margin-top: 100px; +} +.footer { + font-weight: 400; + font-size: 0.7em; + text-align: center; + direction: ltr; + margin-bottom: 0px; + padding-bottom: 0px; +} diff --git a/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/webfont test.html b/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/webfont test.html new file mode 100644 index 0000000..753e793 --- /dev/null +++ b/src/IranSans/IranSansX(Eco)/Farsi numerals/Webfonts/webfont test.html @@ -0,0 +1,190 @@ + + + + + IRANSansX + + + + + + +

+ Charset + +   + + +

+ +

10 +چو ایران نَباشَد تَنِ مَن مَباد +بِدين بوم و بَر زنده يِک تَن مَباد +

+ +

11 +چو ایران نَباشَد تَنِ مَن مَباد +بِدين بوم و بَر زنده يِک تَن مَباد +

+ +

12 +چو ایران نَباشَد تَنِ مَن مَباد +بِدين بوم و بَر زنده يِک تَن مَباد +

+ +

13 +چو ایران نَباشَد تَنِ مَن مَباد +بِدين بوم و بَر زنده يِک تَن مَباد +

+ +

14 +چو ایران نَباشَد تَنِ مَن مَباد +بِدين بوم و بَر زنده يِک تَن مَباد +

+ +

15 +چو ایران نَباشَد تَنِ مَن مَباد +بِدين بوم و بَر زنده يِک تَن مَباد +

+ +

16 +چو ایران نَباشَد تَنِ مَن مَباد +بِدين بوم و بَر زنده يِک تَن مَباد +

+ +

17 +چو ایران نَباشَد تَنِ مَن مَباد +بِدين بوم و بَر زنده يِک تَن مَباد +

+ +

18 +چو ایران نَباشَد تَنِ مَن مَباد +بِدين بوم و بَر زنده يِک تَن مَباد +

+ +

چو ایران نَباشَد تَنِ مَن مَباد +بِدين بوم و بَر زنده يِک تَن مَباد +

+ +

چو ایران نَباشَد تَنِ مَن مَباد +بِدين بوم و بَر زنده يِک تَن مَباد +

+ + diff --git a/src/IranSans/IranSansX(Eco)/Helps/alternateHelp.png b/src/IranSans/IranSansX(Eco)/Helps/alternateHelp.png new file mode 100644 index 0000000..38ef587 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Helps/alternateHelp.png differ diff --git a/src/IranSans/IranSansX(Eco)/Helps/stylestic set(Adobe).gif b/src/IranSans/IranSansX(Eco)/Helps/stylestic set(Adobe).gif new file mode 100644 index 0000000..37c77bb Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Helps/stylestic set(Adobe).gif differ diff --git a/src/IranSans/IranSansX(Eco)/Helps/stylestic set(MsOffice).gif b/src/IranSans/IranSansX(Eco)/Helps/stylestic set(MsOffice).gif new file mode 100644 index 0000000..3196192 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Helps/stylestic set(MsOffice).gif differ diff --git a/src/IranSans/IranSansX(Eco)/IranSansX fonts.pdf b/src/IranSans/IranSansX(Eco)/IranSansX fonts.pdf new file mode 100644 index 0000000..d080430 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/IranSansX fonts.pdf differ diff --git a/src/IranSans/IranSansX(Eco)/NonEnglish/IRANSansXNoEn-Bold.ttf b/src/IranSans/IranSansX(Eco)/NonEnglish/IRANSansXNoEn-Bold.ttf new file mode 100644 index 0000000..0728d3a Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/NonEnglish/IRANSansXNoEn-Bold.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/NonEnglish/IRANSansXNoEn-Regular.ttf b/src/IranSans/IranSansX(Eco)/NonEnglish/IRANSansXNoEn-Regular.ttf new file mode 100644 index 0000000..30e6351 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/NonEnglish/IRANSansXNoEn-Regular.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/NonEnglish/Webfont NonEn/woff/IRANSansXNoEn-Bold.woff b/src/IranSans/IranSansX(Eco)/NonEnglish/Webfont NonEn/woff/IRANSansXNoEn-Bold.woff new file mode 100644 index 0000000..6221b97 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/NonEnglish/Webfont NonEn/woff/IRANSansXNoEn-Bold.woff differ diff --git a/src/IranSans/IranSansX(Eco)/NonEnglish/Webfont NonEn/woff/IRANSansXNoEn-Regular.woff b/src/IranSans/IranSansX(Eco)/NonEnglish/Webfont NonEn/woff/IRANSansXNoEn-Regular.woff new file mode 100644 index 0000000..6ad367e Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/NonEnglish/Webfont NonEn/woff/IRANSansXNoEn-Regular.woff differ diff --git a/src/IranSans/IranSansX(Eco)/NonEnglish/Webfont NonEn/woff2/IRANSansXNoEn-Bold.woff2 b/src/IranSans/IranSansX(Eco)/NonEnglish/Webfont NonEn/woff2/IRANSansXNoEn-Bold.woff2 new file mode 100644 index 0000000..08255c8 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/NonEnglish/Webfont NonEn/woff2/IRANSansXNoEn-Bold.woff2 differ diff --git a/src/IranSans/IranSansX(Eco)/NonEnglish/Webfont NonEn/woff2/IRANSansXNoEn-Regular.woff2 b/src/IranSans/IranSansX(Eco)/NonEnglish/Webfont NonEn/woff2/IRANSansXNoEn-Regular.woff2 new file mode 100644 index 0000000..e4873f6 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/NonEnglish/Webfont NonEn/woff2/IRANSansXNoEn-Regular.woff2 differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/English to Farsi numbers help.pdf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/English to Farsi numbers help.pdf new file mode 100644 index 0000000..8ffdbeb Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/English to Farsi numbers help.pdf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/Farsi_numerals.png b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/Farsi_numerals.png new file mode 100644 index 0000000..985a9d4 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/Farsi_numerals.png differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/IRANSans(FaNum).ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/IRANSans(FaNum).ttf new file mode 100644 index 0000000..10f2a48 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/IRANSans(FaNum).ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/IRANSans(FaNum)_Black.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/IRANSans(FaNum)_Black.ttf new file mode 100644 index 0000000..5870d25 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/IRANSans(FaNum)_Black.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/IRANSans(FaNum)_Bold.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/IRANSans(FaNum)_Bold.ttf new file mode 100644 index 0000000..7030427 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/IRANSans(FaNum)_Bold.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/IRANSans(FaNum)_Light.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/IRANSans(FaNum)_Light.ttf new file mode 100644 index 0000000..fe57ae6 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/IRANSans(FaNum)_Light.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/IRANSans(FaNum)_Medium.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/IRANSans(FaNum)_Medium.ttf new file mode 100644 index 0000000..4913cd8 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/IRANSans(FaNum)_Medium.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/IRANSans(FaNum)_UltraLight.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/IRANSans(FaNum)_UltraLight.ttf new file mode 100644 index 0000000..758b923 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/IRANSans(FaNum)_UltraLight.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/MobileFonts/IRANSansMobile(FaNum).ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/MobileFonts/IRANSansMobile(FaNum).ttf new file mode 100644 index 0000000..c60002a Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/MobileFonts/IRANSansMobile(FaNum).ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/MobileFonts/IRANSansMobile(FaNum)_Black.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/MobileFonts/IRANSansMobile(FaNum)_Black.ttf new file mode 100644 index 0000000..411ef9e Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/MobileFonts/IRANSansMobile(FaNum)_Black.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/MobileFonts/IRANSansMobile(FaNum)_Bold.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/MobileFonts/IRANSansMobile(FaNum)_Bold.ttf new file mode 100644 index 0000000..09fab2b Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/MobileFonts/IRANSansMobile(FaNum)_Bold.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/MobileFonts/IRANSansMobile(FaNum)_Light.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/MobileFonts/IRANSansMobile(FaNum)_Light.ttf new file mode 100644 index 0000000..ecdac1d Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/MobileFonts/IRANSansMobile(FaNum)_Light.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/MobileFonts/IRANSansMobile(FaNum)_Medium.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/MobileFonts/IRANSansMobile(FaNum)_Medium.ttf new file mode 100644 index 0000000..3dc55d0 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/MobileFonts/IRANSansMobile(FaNum)_Medium.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/MobileFonts/IRANSansMobile(FaNum)_UltraLight.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/MobileFonts/IRANSansMobile(FaNum)_UltraLight.ttf new file mode 100644 index 0000000..6564159 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/MobileFonts/IRANSansMobile(FaNum)_UltraLight.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/MobileFonts/MobileFonts.png b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/MobileFonts/MobileFonts.png new file mode 100644 index 0000000..2aedf87 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/MobileFonts/MobileFonts.png differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/IRANSans.html b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/IRANSans.html new file mode 100644 index 0000000..89af37a --- /dev/null +++ b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/IRANSans.html @@ -0,0 +1,281 @@ + + + + +IRANSans Family Type face: خانواده فونت ایران سن سریف + + + + + + + +
+ +
+
+

بِسْمِ الله الرَّحْمَنِ الرَّحِيمِ

+
+
د
+
+
+ ن وَالْقَلَمِ وَ مَا يَسْطُرُون +
+ نون؛ سوگند به قلم و آنچه می نويسند. +
+ Noon. I swear by the pen and what the angels write +
+
+
+
+ +
+ +
+

نکاتی درباره تایپوگرافی وب

+
+ +
خ
+
+

از زمان پیدایش نخستین وب سایت، متن ها یکی از اجزای مهم صفحات وب بودند. هر چند به مرور زمان با ورود تصاویر، صوت و فیلم کمی از بار مسئولیت متون کم شد اما هنوز جایگاه خود را از دست نداده اند و بخش مهمی از کار را به عهده دارند.

+

بسیاری از طراحان وب سایت به صورت تجربی بهترین ترکیب و ظاهر را برای نمایش متن ها انتخاب می کنند. اما اصولی وجود دارد که با رعایت آن ها، تاثیرپذیری و زیبایی سایت چند برابر خواهد شد.

+

در ادامه مطلب قصد داریم تعدادی از اصول مقدماتی تایپوگرافی را به اختصار مرور کنیم. هرچند بسیاری از دوستان با این نکات آشنا هستند؛ اما شاید مرور آن ها خالی از لطف نباشد.

+
+ + +
+ +
+
+

تاثیر اندازه فونت و سلسله مراتب تگ‌ها

+
+
پ
+
+

فونت های داخل سایت باید به گونه ای قرار گیرند که کاربر به راحتی بتواند آن ها را بخواند. نوع فونت، وزن و کوچک (یا بزرگ) بودن اندازه آن ممکن است تمایل کاربر برای بازگشت به وب سایت را کاهش دهد. قواعد و قوانین زیادی برای انتخاب بهترین فونت وجود دارد.

+

در زیر می توانید ۵ وزن مختلف خانواده فونت ایران سن سریف را در شرایط یکسان مشاهده کنید. لازم به ذکر است برای این صفحه از وزن نازک (Light) استفاده شده است.

+
+
+ + +
+
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Ultra Light)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Light)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Regular)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Medium)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Bold)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Black)
+
+
+ +
+
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Ultra Light)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Light)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Regular)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Medium)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Bold)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Black)
+
+
+ +
+
+

تگ‌های هدینگ

+
+
ی
+
+

در این بین، استفاده از تگ های هدینگ مناسب و رعایت سلسله مراتب آن ها، هم مفهوم نوشته را بهتر منتقل می کند و هم تاثیر قابل توجهی در نتایج موتورهای جستجو خواهد داشت. این نکته یکی از فاکتورهای مهم در بهینه سازی وب سایت برای موتورهای جستجو (Search Engine Optimization) است.

+

نمونه ای از خروجی تگ های هدینگ با سایز استاندارد مربوطه به فونت های فونت ایران را در زیر مشاهده می کنید.

+
+
+ +
+
+

(H1) نابرده رنج گنج میسر نمی شود. No gain without pain

+

(H2) نابرده رنج گنج میسر نمی شود. No gain without pain

+

(H3) نابرده رنج گنج میسر نمی شود. No gain without pain

+

(H4) نابرده رنج گنج میسر نمی شود. No gain without pain

+
(H5) نابرده رنج گنج میسر نمی شود. No gain without pain
+
(H6) نابرده رنج گنج میسر نمی شود. No gain without pain
+
+
+ +
+
+

(H1) نابرده رنج گنج میسر نمی شود. No gain without pain

+

(H2) نابرده رنج گنج میسر نمی شود. No gain without pain

+

(H3) نابرده رنج گنج میسر نمی شود. No gain without pain

+

(H4) نابرده رنج گنج میسر نمی شود. No gain without pain

+
(H5) نابرده رنج گنج میسر نمی شود. No gain without pain
+
(H6) نابرده رنج گنج میسر نمی شود. No gain without pain
+
+
+ +
+
+

سطر و ستون بندی

+
+
م
+
+

معمولاً هرگاه مقدار نوشته از یک سطر بیشتر شود ناگزیر به ستون بندی هستیم. و این کار ما را با چند متغییر مواجه خواهد کرد:

+

۱- عرض ستون‌های متنی که حاوی حداقل۷ کلمه باشد بهترین انتخاب است. اگر ستون کوتاه‌تر باشد چشم بیننده در اثر حرکت‌های زود به زود از پایان یک سطر به ابتدای سطر بعدی خسته خواهد شد. علاوه بر این لبه ستون‌هایی با عرض کم نیز همیشه دندانه ای و بی نظم خواهد بود. ستون‌هایی با عرض طولانی هم برای خواننده آزار دهنده است چرا که چشم در حرکت بازگشت از انتهای یک سطر به ابتدای سطر بعدی ممکن است دچار اشتباه شود. + +

۲- لدینگ یا همان فاصله سطر هم در ستون بندی اهمیت دارد. ستون‌های فشرده اگرچه به لحاظ گرافیکی منسجم و زیبا هستند اما عمل خواندن را مختل می کنند و در مقابل، فاصله سطر زیاد نیز باعث نازیبایی و خستگی چشم خواننده می‌شود. فاصله سطر همیشه می تواند با توجه به نوع فونت و عرض ستون‌ها تغییر کند. بدین ترتیب که فونت‌هایی با دندانه‌های بلند‌تر و ستون‌هایی با عرض بیشتر به لدینگ بیشتری نیاز دارند. +

۳- همترازی هم یکی از متغییرهای پر بحث در ستون بندی است. اما به طور کوتاه و خلاصه باید گفت که بهتر است در متن فارسی از همترازی یا همان Justification استفاده نکنید. این عمل اگرچه لبه پاراگراف شما را مرتب خواهد کرد اما تنظیمات فاصله حروف را تغییر خواهد داد و در نتیجه باعث کاهش خوانایی خواهد شد.

+
+ +
+
(IRANSans Ultra Light)
+
ایران سن سریف IRANSans سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است. خانواده فونت ایران سن‌سریف در سال ۱۳۹۴ پرطرفدارترین فونت فارسی بوده است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types. +
+ +
+ +
+
(IRANSans Light)
+
ایران سن سریف IRANSans سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است. خانواده فونت ایران سن‌سریف در سال ۱۳۹۴ پرطرفدارترین فونت فارسی بوده است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types. +
+ +
+ +
+
(IRANSans Regular)
+
ایران سن سریف IRANSans سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است. خانواده فونت ایران سن‌سریف در سال ۱۳۹۴ پرطرفدارترین فونت فارسی بوده است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types. +
+ +
+ +
+
(IRANSans Medium)
+
ایران سن سریف IRANSans سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است. خانواده فونت ایران سن‌سریف در سال ۱۳۹۴ پرطرفدارترین فونت فارسی بوده است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types. +
+ +
+
+
(IRANSans Bold)
+
ایران سن سریف IRANSans سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است. خانواده فونت ایران سن‌سریف در سال ۱۳۹۴ پرطرفدارترین فونت فارسی بوده است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types. +
+ +
+ +
+
(IRANSans Black)
+
ایران سن سریف IRANSans سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است. خانواده فونت ایران سن‌سریف در سال ۱۳۹۴ پرطرفدارترین فونت فارسی بوده است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types. +
+ +
+ +
+
+

اعداد و علائم در فونت فارسی

+
+
ظ
+
+

اعداد فارسی: ۱۲۳۴۵۶۷۸۹۰
+ اعداد عربی: ۱۲۳٤٥٦۷۸۹۰
+ اعداد انگلیسی: 1234567890

+

برای تایپ اعداد فارسی در محیط وب از کیبورد استاندارد فارسی استفاده کنید. در ویندوز ۸ و یا بالاتر این کیبورد، با نام Persian(Standard)Keyboard در لیست کیبوردهای ویندوز وجود دارد. همچنین می توانید از این آدرس آن را دانلود و نصب کنید.

+ +

با استفاده از کیبورد استاندارد می‌توانید ممیز فارسی را تایپ کنید.
+ میانبر این علامت کلیدهای Shift+3 است. به این شکل: ۳٫۱۴
+ ممیز فارسی با علامت اسلش تفاوت دارد :۳/۱۴ +

+

با استفاده از کیبورد استاندارد می‌توانید جداکننده هزارگان فارسی را تایپ کنید.
+ میانبر این علامت کلیدهای Shift+2 است. به این شکل: ۹٬۲۱۰٬۰۰۰
+ این علامت با جدا کننده هزارگان انگلیسی تفاوت دارد : ۹,۲۱۰,۰۰۰ +

+
+
+ +
+
+

نسبت‌های طلایی

+
+
+
+ ۳٫۷۷۷ ÷ ۱٫۶۱۸ = ۲٫۳۳۵ +
+ ۶٫۱۱۲ ÷ ۱٫۶۱۸ = ۳٫۷۷۷ +
+ ۹٫۸۸۹ ÷ ۱٫۶۱۸ = ۶٫۱۱۲ +
+ ۱۶ ÷ ۱٫۶۱۸ = ۹٫۸۸۹ +
+....................................... +
+ ۱۶ × ۱٫۶۱۸ = ۲۵٫۸۸۸ +
+ ۲۵٫۸۸۸ × ۱٫۶۱۸ = ۴۱٫۸۸۷ +
+ ۴۱٫۸۸۷ × ۱٫۶۱۸ = ۶۷٫۷۷۳ +
+ ۶۷٫۷۷۳ × ۱٫۶۱۸ = ۱۰۹٫۶۵۶ +
+
+
+

اهمیت اندازه فونت در خوانایی و زیبا شدن صفحه وب سایت بر کسی پوشیده نیست. در کنار این بحث، موارد دیگری مانند ارتفاع خطوط، فاصله ها، ابعاد قسمت های مختلف و ... نیز در بحث تایپوگرافی اهمیت زیادی دارند.

+

برای محاسبه این اعداد می توانیم از سری اعداد متناسب (Modular Scale) استفاده کنیم. در حقیقت از تعدادی عدد پشت سر هم که بر اساس مضرب خاصی تشکیل شده اند برای تنظیمات ارتفاع خط، فاصله ها، ابعاد و ... استفاده می کنیم. نسبت (عدد) طلایی همان مضرب اعداد است.

+

به عنوان مثال می خواهیم از سایز 16px فونت ایران سن سریف به عنوان فونت و سایز اصلی متن صفحات استفاده کنیم. عدد فی (phi) یونانی که معادل ۱٫۶۱۸۰۳۳۹۸۸۷ (به اختصار ۱٫۶۱۸) است را به عنوان نسبت طلایی در نظر می گیریم. بنابراین سری اعدادی به شکل روبرو خواهیم داشت:

+ +

+ به کمک این اعداد و استفاده از آن ها در صفحات وب سایت خود می توانیم خوانایی و زیبایی آن را افزایش دهیم. علاوه بر آن، اگر از واحدهای نسبی مانند em استفاده شود، امکانات بیشتری در اختیار طراح و بازدیدکننده خواهد بود. البته سری اعداد بر مبنای نسبت طلایی فقط در تایپوگرافی وب سایت کاربرد ندارد. + این اعداد می تواند ادامه داشته باشد (۱٬۲۱۵٫۹۸۱ ، ۱٬۹۶۷٫۴۵۷ ، ۳٬۱۸۳٫۳۴۵ و ...). +

+ +
+
+ +
+

خوانایی لینک‌ها

+
غ
+
+

شاید بتوانیم از لینک ها (hyperlinks) به عنوان مهم ترین بخش وب سایت ها در ارتباط با سئو (SEO) و نیز یکی از پرکاربردترین اجزای وب سایت نام ببریم. بنابراین بازدیدکننده باید بتواند به راحتی آن ها را از سایر محتوای صفحه تشخیص داده و متن لینک شده را به سرعت و بدون مزاحمت مشاهده کند.

+

به صورت پیش فرض، متن هایی که داخل یک هایپرلینک قرار می گیرند، زیر خط دار یا underline می شوند (مانند این لینک یا پیوند به صفحه اصلی فونت ایران). در بسیاری از فونت های فارسی، این خط روی متن و نقطه ها قرار می گیرد (مانند این لینک یا پیوند به صفحه اصلی فونت ایران با فونت تاهوما).

+

در صورت بروز این مشکل، یا باید خط زیرین تمام تگ های «a» غیر فعال شود و یا با ترفندهایی به شکل دیگر ایجاد شود (مانند قرار دادن border-bottom برای تگ های «a»).

+

همچنین پیشنهاد می کنیم از قراردادن افکت ها و transition های آزاردهنده روی لینک ها پرهیز کرده و برای راحتی کاربر از padding و color با کانتراست مناسب نسبت به زمینه استفاده کنید.

+
+
+ + + +
+
+
+در این فایل سعی کردیم همراه با یک مطلب آموزشی کوتاه، نحوه استفاده از خانواده فونت ایران سن سریف و پیش نمایشی از قسمت های مختلف آن را مرور کنیم. +
+برای مشاهده راهنمای نحوه قراردادن فونت ها در وب سایت خود، به این آدرس مراجعه کنید. +
+
+
+
ء
+
+ +
+ +
+ + \ No newline at end of file diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/WebFonts.png b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/WebFonts.png new file mode 100644 index 0000000..82d3e21 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/WebFonts.png differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/css/fontiran.css b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/css/fontiran.css new file mode 100644 index 0000000..869e143 --- /dev/null +++ b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/css/fontiran.css @@ -0,0 +1,78 @@ +/** +* +* Name: IRAN Sans-Serif Font +* Version: 5.0 +* Author: Moslem Ebrahimi (moslemebrahimi.com) +* Created on: Dec 25, 2012 +* Updated on: Sep 01, 2017 +* Website: http://fontiran.com +* Copyright: Commercial/Proprietary Software +-------------------------------------------------------------------------------------- +فونت های ایران سن سریف یک نرم افزار مالکیتی محسوب می شود. جهت آگاهی از قوانین استفاده از این فونت ها لطفا به وب سایت (فونت ایران دات کام) مراجعه نمایید +-------------------------------------------------------------------------------------- +IRAN Sans-serif fonts are considered a proprietary software. To gain information about the laws regarding the use of these fonts, please visit www.fontiran.com +-------------------------------------------------------------------------------------- +This set of fonts are used in this project under the license: (.....) +-------------------------------------------------------------------------------------- +* +**/ +@font-face { + font-family: IRANSans; + font-style: normal; + font-weight: 900; + src: url('../fonts/eot/IRANSansWeb(FaNum)_Black.eot'); + src: url('../fonts/eot/IRANSansWeb(FaNum)_Black.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../fonts/woff2/IRANSansWeb(FaNum)_Black.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ + url('../fonts/woff/IRANSansWeb(FaNum)_Black.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../fonts/ttf/IRANSansWeb(FaNum)_Black.ttf') format('truetype'); +} +@font-face { + font-family: IRANSans; + font-style: normal; + font-weight: bold; + src: url('../fonts/eot/IRANSansWeb(FaNum)_Bold.eot'); + src: url('../fonts/eot/IRANSansWeb(FaNum)_Bold.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../fonts/woff2/IRANSansWeb(FaNum)_Bold.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ + url('../fonts/woff/IRANSansWeb(FaNum)_Bold.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../fonts/ttf/IRANSansWeb(FaNum)_Bold.ttf') format('truetype'); +} +@font-face { + font-family: IRANSans; + font-style: normal; + font-weight: 500; + src: url('../fonts/eot/IRANSansWeb(FaNum)_Medium.eot'); + src: url('../fonts/eot/IRANSansWeb(FaNum)_Medium.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../fonts/woff2/IRANSansWeb(FaNum)_Medium.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ + url('../fonts/woff/IRANSansWeb(FaNum)_Medium.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../fonts/ttf/IRANSansWeb(FaNum)_Medium.ttf') format('truetype'); +} +@font-face { + font-family: IRANSans; + font-style: normal; + font-weight: 300; + src: url('../fonts/eot/IRANSansWeb(FaNum)_Light.eot'); + src: url('../fonts/eot/IRANSansWeb(FaNum)_Light.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../fonts/woff2/IRANSansWeb(FaNum)_Light.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ + url('../fonts/woff/IRANSansWeb(FaNum)_Light.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../fonts/ttf/IRANSansWeb(FaNum)_Light.ttf') format('truetype'); +} +@font-face { + font-family: IRANSans; + font-style: normal; + font-weight: 200; + src: url('../fonts/eot/IRANSansWeb(FaNum)_UltraLight.eot'); + src: url('../fonts/eot/IRANSansWeb(FaNum)_UltraLight.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../fonts/woff2/IRANSansWeb(FaNum)_UltraLight.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ + url('../fonts/woff/IRANSansWeb(FaNum)_UltraLight.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../fonts/ttf/IRANSansWeb(FaNum)_UltraLight.ttf') format('truetype'); +} +@font-face { + font-family: IRANSans; + font-style: normal; + font-weight: normal; + src: url('../fonts/eot/IRANSansWeb(FaNum).eot'); + src: url('../fonts/eot/IRANSansWeb(FaNum).eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../fonts/woff2/IRANSansWeb(FaNum).woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ + url('../fonts/woff/IRANSansWeb(FaNum).woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../fonts/ttf/IRANSansWeb(FaNum).ttf') format('truetype'); +} diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/css/style.css b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/css/style.css new file mode 100644 index 0000000..733e06f --- /dev/null +++ b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/css/style.css @@ -0,0 +1,190 @@ +@import url(fontiran.css); /* لینک فایلی که وظیفه بارگذاری فونت ها را برعهده دارد */ +body { + font-family: IRANSans !important; + font-weight: 300; + direction: rtl; + background-color: #E2E2E2; + margin: 0; +} +h1, h2, h3, h4, h5, h6,input, textarea { + font-family: IRANSans !important; +} +h1 { + font-weight: bold; +} +.wrapper { + max-width: 900px; + margin: 0 auto; +} +.ltr { + direction: ltr; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-left { + text-align: left; +} +.text-small { + font-size: 0.8em; +} +.text-xsmall { + font-size: 0.6em; +} +.text-large { + font-size: 1.2em; +} +.text-xlarge { + font-size: 1.4em; +} +.text-underline { + text-decoration:underline; +} +.text-ultralight { + font-weight: 200; +} +.text-light { + font-weight: 300; +} +.text-regular { + font-weight: normal; +} +.text-medium { + font-weight: 500; +} +.text-bold { + font-weight: bold; +} +.text-black { + font-weight: 900; +} +blockquote { + font-weight: 500; + padding: 10px; + border: 1px dashed #666666; +} + +.mainbox { + width: 100%; + background-color: #EFEFEF; + display: table; + margin-bottom: 30px; + border-right: 8px solid #FFFF33; +} + +.mainboxnegativ { + width: 100%; + background-color: #000000; + display: table; + margin-bottom: 30px; + border-right: 8px solid #FFFF33; + color: #F9F9F9; +} + +.mainbox2 { + font-size: 1em; + width: 90%; + padding-right: 20px; + padding-top: 10px; + padding-bottom: 10px; +} + +.mainbox3 { + width: 100%; + background-color: #b8b8b8; + display: table; + margin-bottom: 30px; + border-right: 8px solid #bd70ff; +} + +.mainbox2negativ { + font-size: 1em; + color: #F9F9F9; + background-color: #000000; + padding-right: 20px; +} + +.farsiparagraph { + font-size: 1em; + width: 47%; + float:right; + padding-right: 20px; + padding-top: 10px; + padding-bottom: 10px; + +} +.englishparagraph { + font-size: 1em; + width: 47%; + float: left; + direction:ltr; + padding-left: 20px; + padding-top: 10px; + padding-bottom: 10px; + + +} +.rightbox { + width: 60%; + padding-right: 20px; + padding-left: 5px; + float: right; + margin-left: 10px; + margin-bottom: 0px; + min-width: 0px; + background-color: #F7F7F7; + +} + +.titelbox { + width: 60%; + padding-right: 25px; + padding-left: 0px; + float: right; + margin-left: 10px; + margin-bottom: 0px; + min-width: 0px; + background-color: #F2F2F2; + color: #4B4B4B; +} + + +.lefttbox { + + padding-right: 20px; + padding-left: 4px; + float: right; + margin-bottom: 10px; + min-width: 0px; +} + +.alphabet { + width: 35%; + float: left; + font-size: 21em; + text-align: center; + font-weight: 500; + color: #999999; +} + +.alphabet2 { + width: 35%; + float: left; + direction: ltr; + font-size: 1.6em; + text-align: left; + font-weight: 500; + color: #333333; + margin-top: 100px; +} +.footer { + font-weight: 300; + font-size: 0.7em; + text-align: center; + direction: ltr; + margin-bottom: 0px; + padding-bottom: 0px; +} diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/eot/IRANSansWeb(FaNum).eot b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/eot/IRANSansWeb(FaNum).eot new file mode 100644 index 0000000..5a6fdd0 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/eot/IRANSansWeb(FaNum).eot differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/eot/IRANSansWeb(FaNum)_Black.eot b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/eot/IRANSansWeb(FaNum)_Black.eot new file mode 100644 index 0000000..a012bc6 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/eot/IRANSansWeb(FaNum)_Black.eot differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/eot/IRANSansWeb(FaNum)_Bold.eot b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/eot/IRANSansWeb(FaNum)_Bold.eot new file mode 100644 index 0000000..82525e5 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/eot/IRANSansWeb(FaNum)_Bold.eot differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/eot/IRANSansWeb(FaNum)_Light.eot b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/eot/IRANSansWeb(FaNum)_Light.eot new file mode 100644 index 0000000..f899008 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/eot/IRANSansWeb(FaNum)_Light.eot differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/eot/IRANSansWeb(FaNum)_Medium.eot b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/eot/IRANSansWeb(FaNum)_Medium.eot new file mode 100644 index 0000000..117c2c8 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/eot/IRANSansWeb(FaNum)_Medium.eot differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/eot/IRANSansWeb(FaNum)_UltraLight.eot b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/eot/IRANSansWeb(FaNum)_UltraLight.eot new file mode 100644 index 0000000..9cd9b66 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/eot/IRANSansWeb(FaNum)_UltraLight.eot differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/ttf/IRANSansWeb(FaNum).ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/ttf/IRANSansWeb(FaNum).ttf new file mode 100644 index 0000000..cd74265 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/ttf/IRANSansWeb(FaNum).ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/ttf/IRANSansWeb(FaNum)_Black.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/ttf/IRANSansWeb(FaNum)_Black.ttf new file mode 100644 index 0000000..0f84dbf Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/ttf/IRANSansWeb(FaNum)_Black.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/ttf/IRANSansWeb(FaNum)_Bold.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/ttf/IRANSansWeb(FaNum)_Bold.ttf new file mode 100644 index 0000000..6fa2412 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/ttf/IRANSansWeb(FaNum)_Bold.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/ttf/IRANSansWeb(FaNum)_Light.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/ttf/IRANSansWeb(FaNum)_Light.ttf new file mode 100644 index 0000000..d9000c9 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/ttf/IRANSansWeb(FaNum)_Light.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/ttf/IRANSansWeb(FaNum)_Medium.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/ttf/IRANSansWeb(FaNum)_Medium.ttf new file mode 100644 index 0000000..e20001c Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/ttf/IRANSansWeb(FaNum)_Medium.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/ttf/IRANSansWeb(FaNum)_UltraLight.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/ttf/IRANSansWeb(FaNum)_UltraLight.ttf new file mode 100644 index 0000000..0072606 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/ttf/IRANSansWeb(FaNum)_UltraLight.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff/IRANSansWeb(FaNum).woff b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff/IRANSansWeb(FaNum).woff new file mode 100644 index 0000000..e34dfc4 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff/IRANSansWeb(FaNum).woff differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff/IRANSansWeb(FaNum)_Black.woff b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff/IRANSansWeb(FaNum)_Black.woff new file mode 100644 index 0000000..bbbca77 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff/IRANSansWeb(FaNum)_Black.woff differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff/IRANSansWeb(FaNum)_Bold.woff b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff/IRANSansWeb(FaNum)_Bold.woff new file mode 100644 index 0000000..05d933e Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff/IRANSansWeb(FaNum)_Bold.woff differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff/IRANSansWeb(FaNum)_Light.woff b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff/IRANSansWeb(FaNum)_Light.woff new file mode 100644 index 0000000..fe80d47 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff/IRANSansWeb(FaNum)_Light.woff differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff/IRANSansWeb(FaNum)_Medium.woff b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff/IRANSansWeb(FaNum)_Medium.woff new file mode 100644 index 0000000..f13a870 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff/IRANSansWeb(FaNum)_Medium.woff differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff/IRANSansWeb(FaNum)_UltraLight.woff b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff/IRANSansWeb(FaNum)_UltraLight.woff new file mode 100644 index 0000000..9c653a4 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff/IRANSansWeb(FaNum)_UltraLight.woff differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff2/IRANSansWeb(FaNum).woff2 b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff2/IRANSansWeb(FaNum).woff2 new file mode 100644 index 0000000..30a377d Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff2/IRANSansWeb(FaNum).woff2 differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff2/IRANSansWeb(FaNum)_Black.woff2 b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff2/IRANSansWeb(FaNum)_Black.woff2 new file mode 100644 index 0000000..0b15441 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff2/IRANSansWeb(FaNum)_Black.woff2 differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff2/IRANSansWeb(FaNum)_Bold.woff2 b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff2/IRANSansWeb(FaNum)_Bold.woff2 new file mode 100644 index 0000000..f2353b2 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff2/IRANSansWeb(FaNum)_Bold.woff2 differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff2/IRANSansWeb(FaNum)_Light.woff2 b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff2/IRANSansWeb(FaNum)_Light.woff2 new file mode 100644 index 0000000..562d663 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff2/IRANSansWeb(FaNum)_Light.woff2 differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff2/IRANSansWeb(FaNum)_Medium.woff2 b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff2/IRANSansWeb(FaNum)_Medium.woff2 new file mode 100644 index 0000000..a69f4d0 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff2/IRANSansWeb(FaNum)_Medium.woff2 differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff2/IRANSansWeb(FaNum)_UltraLight.woff2 b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff2/IRANSansWeb(FaNum)_UltraLight.woff2 new file mode 100644 index 0000000..1114f71 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/Farsi_numerals/webFonts/fonts/woff2/IRANSansWeb(FaNum)_UltraLight.woff2 differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/IRANSans.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/IRANSans.ttf new file mode 100644 index 0000000..2cf3495 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/IRANSans.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/IRANSans_Black.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/IRANSans_Black.ttf new file mode 100644 index 0000000..7765eb4 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/IRANSans_Black.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/IRANSans_Bold.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/IRANSans_Bold.ttf new file mode 100644 index 0000000..053ffc7 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/IRANSans_Bold.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/IRANSans_Light.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/IRANSans_Light.ttf new file mode 100644 index 0000000..2095056 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/IRANSans_Light.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/IRANSans_Medium.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/IRANSans_Medium.ttf new file mode 100644 index 0000000..4b0cf29 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/IRANSans_Medium.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/IRANSans_UltraLight.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/IRANSans_UltraLight.ttf new file mode 100644 index 0000000..30c6239 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/IRANSans_UltraLight.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/IRANSans.html b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/IRANSans.html new file mode 100644 index 0000000..89af37a --- /dev/null +++ b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/IRANSans.html @@ -0,0 +1,281 @@ + + + + +IRANSans Family Type face: خانواده فونت ایران سن سریف + + + + + + + +
+ +
+
+

بِسْمِ الله الرَّحْمَنِ الرَّحِيمِ

+
+
د
+
+
+ ن وَالْقَلَمِ وَ مَا يَسْطُرُون +
+ نون؛ سوگند به قلم و آنچه می نويسند. +
+ Noon. I swear by the pen and what the angels write +
+
+
+
+ +
+ +
+

نکاتی درباره تایپوگرافی وب

+
+ +
خ
+
+

از زمان پیدایش نخستین وب سایت، متن ها یکی از اجزای مهم صفحات وب بودند. هر چند به مرور زمان با ورود تصاویر، صوت و فیلم کمی از بار مسئولیت متون کم شد اما هنوز جایگاه خود را از دست نداده اند و بخش مهمی از کار را به عهده دارند.

+

بسیاری از طراحان وب سایت به صورت تجربی بهترین ترکیب و ظاهر را برای نمایش متن ها انتخاب می کنند. اما اصولی وجود دارد که با رعایت آن ها، تاثیرپذیری و زیبایی سایت چند برابر خواهد شد.

+

در ادامه مطلب قصد داریم تعدادی از اصول مقدماتی تایپوگرافی را به اختصار مرور کنیم. هرچند بسیاری از دوستان با این نکات آشنا هستند؛ اما شاید مرور آن ها خالی از لطف نباشد.

+
+ + +
+ +
+
+

تاثیر اندازه فونت و سلسله مراتب تگ‌ها

+
+
پ
+
+

فونت های داخل سایت باید به گونه ای قرار گیرند که کاربر به راحتی بتواند آن ها را بخواند. نوع فونت، وزن و کوچک (یا بزرگ) بودن اندازه آن ممکن است تمایل کاربر برای بازگشت به وب سایت را کاهش دهد. قواعد و قوانین زیادی برای انتخاب بهترین فونت وجود دارد.

+

در زیر می توانید ۵ وزن مختلف خانواده فونت ایران سن سریف را در شرایط یکسان مشاهده کنید. لازم به ذکر است برای این صفحه از وزن نازک (Light) استفاده شده است.

+
+
+ + +
+
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Ultra Light)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Light)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Regular)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Medium)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Bold)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Black)
+
+
+ +
+
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Ultra Light)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Light)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Regular)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Medium)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Bold)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Black)
+
+
+ +
+
+

تگ‌های هدینگ

+
+
ی
+
+

در این بین، استفاده از تگ های هدینگ مناسب و رعایت سلسله مراتب آن ها، هم مفهوم نوشته را بهتر منتقل می کند و هم تاثیر قابل توجهی در نتایج موتورهای جستجو خواهد داشت. این نکته یکی از فاکتورهای مهم در بهینه سازی وب سایت برای موتورهای جستجو (Search Engine Optimization) است.

+

نمونه ای از خروجی تگ های هدینگ با سایز استاندارد مربوطه به فونت های فونت ایران را در زیر مشاهده می کنید.

+
+
+ +
+
+

(H1) نابرده رنج گنج میسر نمی شود. No gain without pain

+

(H2) نابرده رنج گنج میسر نمی شود. No gain without pain

+

(H3) نابرده رنج گنج میسر نمی شود. No gain without pain

+

(H4) نابرده رنج گنج میسر نمی شود. No gain without pain

+
(H5) نابرده رنج گنج میسر نمی شود. No gain without pain
+
(H6) نابرده رنج گنج میسر نمی شود. No gain without pain
+
+
+ +
+
+

(H1) نابرده رنج گنج میسر نمی شود. No gain without pain

+

(H2) نابرده رنج گنج میسر نمی شود. No gain without pain

+

(H3) نابرده رنج گنج میسر نمی شود. No gain without pain

+

(H4) نابرده رنج گنج میسر نمی شود. No gain without pain

+
(H5) نابرده رنج گنج میسر نمی شود. No gain without pain
+
(H6) نابرده رنج گنج میسر نمی شود. No gain without pain
+
+
+ +
+
+

سطر و ستون بندی

+
+
م
+
+

معمولاً هرگاه مقدار نوشته از یک سطر بیشتر شود ناگزیر به ستون بندی هستیم. و این کار ما را با چند متغییر مواجه خواهد کرد:

+

۱- عرض ستون‌های متنی که حاوی حداقل۷ کلمه باشد بهترین انتخاب است. اگر ستون کوتاه‌تر باشد چشم بیننده در اثر حرکت‌های زود به زود از پایان یک سطر به ابتدای سطر بعدی خسته خواهد شد. علاوه بر این لبه ستون‌هایی با عرض کم نیز همیشه دندانه ای و بی نظم خواهد بود. ستون‌هایی با عرض طولانی هم برای خواننده آزار دهنده است چرا که چشم در حرکت بازگشت از انتهای یک سطر به ابتدای سطر بعدی ممکن است دچار اشتباه شود. + +

۲- لدینگ یا همان فاصله سطر هم در ستون بندی اهمیت دارد. ستون‌های فشرده اگرچه به لحاظ گرافیکی منسجم و زیبا هستند اما عمل خواندن را مختل می کنند و در مقابل، فاصله سطر زیاد نیز باعث نازیبایی و خستگی چشم خواننده می‌شود. فاصله سطر همیشه می تواند با توجه به نوع فونت و عرض ستون‌ها تغییر کند. بدین ترتیب که فونت‌هایی با دندانه‌های بلند‌تر و ستون‌هایی با عرض بیشتر به لدینگ بیشتری نیاز دارند. +

۳- همترازی هم یکی از متغییرهای پر بحث در ستون بندی است. اما به طور کوتاه و خلاصه باید گفت که بهتر است در متن فارسی از همترازی یا همان Justification استفاده نکنید. این عمل اگرچه لبه پاراگراف شما را مرتب خواهد کرد اما تنظیمات فاصله حروف را تغییر خواهد داد و در نتیجه باعث کاهش خوانایی خواهد شد.

+
+ +
+
(IRANSans Ultra Light)
+
ایران سن سریف IRANSans سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است. خانواده فونت ایران سن‌سریف در سال ۱۳۹۴ پرطرفدارترین فونت فارسی بوده است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types. +
+ +
+ +
+
(IRANSans Light)
+
ایران سن سریف IRANSans سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است. خانواده فونت ایران سن‌سریف در سال ۱۳۹۴ پرطرفدارترین فونت فارسی بوده است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types. +
+ +
+ +
+
(IRANSans Regular)
+
ایران سن سریف IRANSans سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است. خانواده فونت ایران سن‌سریف در سال ۱۳۹۴ پرطرفدارترین فونت فارسی بوده است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types. +
+ +
+ +
+
(IRANSans Medium)
+
ایران سن سریف IRANSans سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است. خانواده فونت ایران سن‌سریف در سال ۱۳۹۴ پرطرفدارترین فونت فارسی بوده است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types. +
+ +
+
+
(IRANSans Bold)
+
ایران سن سریف IRANSans سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است. خانواده فونت ایران سن‌سریف در سال ۱۳۹۴ پرطرفدارترین فونت فارسی بوده است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types. +
+ +
+ +
+
(IRANSans Black)
+
ایران سن سریف IRANSans سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است. خانواده فونت ایران سن‌سریف در سال ۱۳۹۴ پرطرفدارترین فونت فارسی بوده است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types. +
+ +
+ +
+
+

اعداد و علائم در فونت فارسی

+
+
ظ
+
+

اعداد فارسی: ۱۲۳۴۵۶۷۸۹۰
+ اعداد عربی: ۱۲۳٤٥٦۷۸۹۰
+ اعداد انگلیسی: 1234567890

+

برای تایپ اعداد فارسی در محیط وب از کیبورد استاندارد فارسی استفاده کنید. در ویندوز ۸ و یا بالاتر این کیبورد، با نام Persian(Standard)Keyboard در لیست کیبوردهای ویندوز وجود دارد. همچنین می توانید از این آدرس آن را دانلود و نصب کنید.

+ +

با استفاده از کیبورد استاندارد می‌توانید ممیز فارسی را تایپ کنید.
+ میانبر این علامت کلیدهای Shift+3 است. به این شکل: ۳٫۱۴
+ ممیز فارسی با علامت اسلش تفاوت دارد :۳/۱۴ +

+

با استفاده از کیبورد استاندارد می‌توانید جداکننده هزارگان فارسی را تایپ کنید.
+ میانبر این علامت کلیدهای Shift+2 است. به این شکل: ۹٬۲۱۰٬۰۰۰
+ این علامت با جدا کننده هزارگان انگلیسی تفاوت دارد : ۹,۲۱۰,۰۰۰ +

+
+
+ +
+
+

نسبت‌های طلایی

+
+
+
+ ۳٫۷۷۷ ÷ ۱٫۶۱۸ = ۲٫۳۳۵ +
+ ۶٫۱۱۲ ÷ ۱٫۶۱۸ = ۳٫۷۷۷ +
+ ۹٫۸۸۹ ÷ ۱٫۶۱۸ = ۶٫۱۱۲ +
+ ۱۶ ÷ ۱٫۶۱۸ = ۹٫۸۸۹ +
+....................................... +
+ ۱۶ × ۱٫۶۱۸ = ۲۵٫۸۸۸ +
+ ۲۵٫۸۸۸ × ۱٫۶۱۸ = ۴۱٫۸۸۷ +
+ ۴۱٫۸۸۷ × ۱٫۶۱۸ = ۶۷٫۷۷۳ +
+ ۶۷٫۷۷۳ × ۱٫۶۱۸ = ۱۰۹٫۶۵۶ +
+
+
+

اهمیت اندازه فونت در خوانایی و زیبا شدن صفحه وب سایت بر کسی پوشیده نیست. در کنار این بحث، موارد دیگری مانند ارتفاع خطوط، فاصله ها، ابعاد قسمت های مختلف و ... نیز در بحث تایپوگرافی اهمیت زیادی دارند.

+

برای محاسبه این اعداد می توانیم از سری اعداد متناسب (Modular Scale) استفاده کنیم. در حقیقت از تعدادی عدد پشت سر هم که بر اساس مضرب خاصی تشکیل شده اند برای تنظیمات ارتفاع خط، فاصله ها، ابعاد و ... استفاده می کنیم. نسبت (عدد) طلایی همان مضرب اعداد است.

+

به عنوان مثال می خواهیم از سایز 16px فونت ایران سن سریف به عنوان فونت و سایز اصلی متن صفحات استفاده کنیم. عدد فی (phi) یونانی که معادل ۱٫۶۱۸۰۳۳۹۸۸۷ (به اختصار ۱٫۶۱۸) است را به عنوان نسبت طلایی در نظر می گیریم. بنابراین سری اعدادی به شکل روبرو خواهیم داشت:

+ +

+ به کمک این اعداد و استفاده از آن ها در صفحات وب سایت خود می توانیم خوانایی و زیبایی آن را افزایش دهیم. علاوه بر آن، اگر از واحدهای نسبی مانند em استفاده شود، امکانات بیشتری در اختیار طراح و بازدیدکننده خواهد بود. البته سری اعداد بر مبنای نسبت طلایی فقط در تایپوگرافی وب سایت کاربرد ندارد. + این اعداد می تواند ادامه داشته باشد (۱٬۲۱۵٫۹۸۱ ، ۱٬۹۶۷٫۴۵۷ ، ۳٬۱۸۳٫۳۴۵ و ...). +

+ +
+
+ +
+

خوانایی لینک‌ها

+
غ
+
+

شاید بتوانیم از لینک ها (hyperlinks) به عنوان مهم ترین بخش وب سایت ها در ارتباط با سئو (SEO) و نیز یکی از پرکاربردترین اجزای وب سایت نام ببریم. بنابراین بازدیدکننده باید بتواند به راحتی آن ها را از سایر محتوای صفحه تشخیص داده و متن لینک شده را به سرعت و بدون مزاحمت مشاهده کند.

+

به صورت پیش فرض، متن هایی که داخل یک هایپرلینک قرار می گیرند، زیر خط دار یا underline می شوند (مانند این لینک یا پیوند به صفحه اصلی فونت ایران). در بسیاری از فونت های فارسی، این خط روی متن و نقطه ها قرار می گیرد (مانند این لینک یا پیوند به صفحه اصلی فونت ایران با فونت تاهوما).

+

در صورت بروز این مشکل، یا باید خط زیرین تمام تگ های «a» غیر فعال شود و یا با ترفندهایی به شکل دیگر ایجاد شود (مانند قرار دادن border-bottom برای تگ های «a»).

+

همچنین پیشنهاد می کنیم از قراردادن افکت ها و transition های آزاردهنده روی لینک ها پرهیز کرده و برای راحتی کاربر از padding و color با کانتراست مناسب نسبت به زمینه استفاده کنید.

+
+
+ + + +
+
+
+در این فایل سعی کردیم همراه با یک مطلب آموزشی کوتاه، نحوه استفاده از خانواده فونت ایران سن سریف و پیش نمایشی از قسمت های مختلف آن را مرور کنیم. +
+برای مشاهده راهنمای نحوه قراردادن فونت ها در وب سایت خود، به این آدرس مراجعه کنید. +
+
+
+
ء
+
+ +
+ +
+ + \ No newline at end of file diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/WebFonts.png b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/WebFonts.png new file mode 100644 index 0000000..82d3e21 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/WebFonts.png differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/css/fontiran.css b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/css/fontiran.css new file mode 100644 index 0000000..305e96a --- /dev/null +++ b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/css/fontiran.css @@ -0,0 +1,78 @@ +/** +* +* Name: IRAN Sans-Serif Font +* Version: 5.0 +* Author: Moslem Ebrahimi (moslemebrahimi.com) +* Created on: Dec 25, 2012 +* Updated on: Sep 01, 2017 +* Website: http://fontiran.com +* Copyright: Commercial/Proprietary Software +-------------------------------------------------------------------------------------- +فونت های ایران سن سریف یک نرم افزار مالکیتی محسوب می شود. جهت آگاهی از قوانین استفاده از این فونت ها لطفا به وب سایت (فونت ایران دات کام) مراجعه نمایید +-------------------------------------------------------------------------------------- +IRAN Sans-serif fonts are considered a proprietary software. To gain information about the laws regarding the use of these fonts, please visit www.fontiran.com +-------------------------------------------------------------------------------------- +This set of fonts are used in this project under the license: (.....) +-------------------------------------------------------------------------------------- +* +**/ +@font-face { + font-family: IRANSans; + font-style: normal; + font-weight: 900; + src: url('../fonts/eot/IRANSansWeb_Black.eot'); + src: url('../fonts/eot/IRANSansWeb_Black.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../fonts/woff2/IRANSansWeb_Black.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ + url('../fonts/woff/IRANSansWeb_Black.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../fonts/ttf/IRANSansWeb_Black.ttf') format('truetype'); +} +@font-face { + font-family: IRANSans; + font-style: normal; + font-weight: bold; + src: url('../fonts/eot/IRANSansWeb_Bold.eot'); + src: url('../fonts/eot/IRANSansWeb_Bold.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../fonts/woff2/IRANSansWeb_Bold.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ + url('../fonts/woff/IRANSansWeb_Bold.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../fonts/ttf/IRANSansWeb_Bold.ttf') format('truetype'); +} +@font-face { + font-family: IRANSans; + font-style: normal; + font-weight: 500; + src: url('../fonts/eot/IRANSansWeb_Medium.eot'); + src: url('../fonts/eot/IRANSansWeb_Medium.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../fonts/woff2/IRANSansWeb_Medium.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ + url('../fonts/woff/IRANSansWeb_Medium.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../fonts/ttf/IRANSansWeb_Medium.ttf') format('truetype'); +} +@font-face { + font-family: IRANSans; + font-style: normal; + font-weight: 300; + src: url('../fonts/eot/IRANSansWeb_Light.eot'); + src: url('../fonts/eot/IRANSansWeb_Light.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../fonts/woff2/IRANSansWeb_Light.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ + url('../fonts/woff/IRANSansWeb_Light.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../fonts/ttf/IRANSansWeb_Light.ttf') format('truetype'); +} +@font-face { + font-family: IRANSans; + font-style: normal; + font-weight: 200; + src: url('../fonts/eot/IRANSansWeb_UltraLight.eot'); + src: url('../fonts/eot/IRANSansWeb_UltraLight.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../fonts/woff2/IRANSansWeb_UltraLight.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ + url('../fonts/woff/IRANSansWeb_UltraLight.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../fonts/ttf/IRANSansWeb_UltraLight.ttf') format('truetype'); +} +@font-face { + font-family: IRANSans; + font-style: normal; + font-weight: normal; + src: url('../fonts/eot/IRANSansWeb.eot'); + src: url('../fonts/eot/IRANSansWeb.eot?#iefix') format('embedded-opentype'), /* IE6-8 */ + url('../fonts/woff2/IRANSansWeb.woff2') format('woff2'), /* FF39+,Chrome36+, Opera24+*/ + url('../fonts/woff/IRANSansWeb.woff') format('woff'), /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url('../fonts/ttf/IRANSansWeb.ttf') format('truetype'); +} diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/css/style.css b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/css/style.css new file mode 100644 index 0000000..733e06f --- /dev/null +++ b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/css/style.css @@ -0,0 +1,190 @@ +@import url(fontiran.css); /* لینک فایلی که وظیفه بارگذاری فونت ها را برعهده دارد */ +body { + font-family: IRANSans !important; + font-weight: 300; + direction: rtl; + background-color: #E2E2E2; + margin: 0; +} +h1, h2, h3, h4, h5, h6,input, textarea { + font-family: IRANSans !important; +} +h1 { + font-weight: bold; +} +.wrapper { + max-width: 900px; + margin: 0 auto; +} +.ltr { + direction: ltr; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-left { + text-align: left; +} +.text-small { + font-size: 0.8em; +} +.text-xsmall { + font-size: 0.6em; +} +.text-large { + font-size: 1.2em; +} +.text-xlarge { + font-size: 1.4em; +} +.text-underline { + text-decoration:underline; +} +.text-ultralight { + font-weight: 200; +} +.text-light { + font-weight: 300; +} +.text-regular { + font-weight: normal; +} +.text-medium { + font-weight: 500; +} +.text-bold { + font-weight: bold; +} +.text-black { + font-weight: 900; +} +blockquote { + font-weight: 500; + padding: 10px; + border: 1px dashed #666666; +} + +.mainbox { + width: 100%; + background-color: #EFEFEF; + display: table; + margin-bottom: 30px; + border-right: 8px solid #FFFF33; +} + +.mainboxnegativ { + width: 100%; + background-color: #000000; + display: table; + margin-bottom: 30px; + border-right: 8px solid #FFFF33; + color: #F9F9F9; +} + +.mainbox2 { + font-size: 1em; + width: 90%; + padding-right: 20px; + padding-top: 10px; + padding-bottom: 10px; +} + +.mainbox3 { + width: 100%; + background-color: #b8b8b8; + display: table; + margin-bottom: 30px; + border-right: 8px solid #bd70ff; +} + +.mainbox2negativ { + font-size: 1em; + color: #F9F9F9; + background-color: #000000; + padding-right: 20px; +} + +.farsiparagraph { + font-size: 1em; + width: 47%; + float:right; + padding-right: 20px; + padding-top: 10px; + padding-bottom: 10px; + +} +.englishparagraph { + font-size: 1em; + width: 47%; + float: left; + direction:ltr; + padding-left: 20px; + padding-top: 10px; + padding-bottom: 10px; + + +} +.rightbox { + width: 60%; + padding-right: 20px; + padding-left: 5px; + float: right; + margin-left: 10px; + margin-bottom: 0px; + min-width: 0px; + background-color: #F7F7F7; + +} + +.titelbox { + width: 60%; + padding-right: 25px; + padding-left: 0px; + float: right; + margin-left: 10px; + margin-bottom: 0px; + min-width: 0px; + background-color: #F2F2F2; + color: #4B4B4B; +} + + +.lefttbox { + + padding-right: 20px; + padding-left: 4px; + float: right; + margin-bottom: 10px; + min-width: 0px; +} + +.alphabet { + width: 35%; + float: left; + font-size: 21em; + text-align: center; + font-weight: 500; + color: #999999; +} + +.alphabet2 { + width: 35%; + float: left; + direction: ltr; + font-size: 1.6em; + text-align: left; + font-weight: 500; + color: #333333; + margin-top: 100px; +} +.footer { + font-weight: 300; + font-size: 0.7em; + text-align: center; + direction: ltr; + margin-bottom: 0px; + padding-bottom: 0px; +} diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/eot/IRANSansWeb.eot b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/eot/IRANSansWeb.eot new file mode 100644 index 0000000..553eec8 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/eot/IRANSansWeb.eot differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/eot/IRANSansWeb_Black.eot b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/eot/IRANSansWeb_Black.eot new file mode 100644 index 0000000..ee7c6a0 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/eot/IRANSansWeb_Black.eot differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/eot/IRANSansWeb_Bold.eot b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/eot/IRANSansWeb_Bold.eot new file mode 100644 index 0000000..746a6e6 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/eot/IRANSansWeb_Bold.eot differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/eot/IRANSansWeb_Light.eot b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/eot/IRANSansWeb_Light.eot new file mode 100644 index 0000000..f79a681 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/eot/IRANSansWeb_Light.eot differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/eot/IRANSansWeb_Medium.eot b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/eot/IRANSansWeb_Medium.eot new file mode 100644 index 0000000..8b31d6b Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/eot/IRANSansWeb_Medium.eot differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/eot/IRANSansWeb_UltraLight.eot b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/eot/IRANSansWeb_UltraLight.eot new file mode 100644 index 0000000..fd4b205 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/eot/IRANSansWeb_UltraLight.eot differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/ttf/IRANSansWeb.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/ttf/IRANSansWeb.ttf new file mode 100644 index 0000000..7416c53 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/ttf/IRANSansWeb.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/ttf/IRANSansWeb_Black.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/ttf/IRANSansWeb_Black.ttf new file mode 100644 index 0000000..df4928f Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/ttf/IRANSansWeb_Black.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/ttf/IRANSansWeb_Bold.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/ttf/IRANSansWeb_Bold.ttf new file mode 100644 index 0000000..158fbaa Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/ttf/IRANSansWeb_Bold.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/ttf/IRANSansWeb_Light.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/ttf/IRANSansWeb_Light.ttf new file mode 100644 index 0000000..3060c60 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/ttf/IRANSansWeb_Light.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/ttf/IRANSansWeb_Medium.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/ttf/IRANSansWeb_Medium.ttf new file mode 100644 index 0000000..6dd6c5d Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/ttf/IRANSansWeb_Medium.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/ttf/IRANSansWeb_UltraLight.ttf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/ttf/IRANSansWeb_UltraLight.ttf new file mode 100644 index 0000000..7ebe1bf Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/ttf/IRANSansWeb_UltraLight.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff/IRANSansWeb.woff b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff/IRANSansWeb.woff new file mode 100644 index 0000000..abb63f2 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff/IRANSansWeb.woff differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff/IRANSansWeb_Black.woff b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff/IRANSansWeb_Black.woff new file mode 100644 index 0000000..12c8a6e Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff/IRANSansWeb_Black.woff differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff/IRANSansWeb_Bold.woff b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff/IRANSansWeb_Bold.woff new file mode 100644 index 0000000..801c55d Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff/IRANSansWeb_Bold.woff differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff/IRANSansWeb_Light.woff b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff/IRANSansWeb_Light.woff new file mode 100644 index 0000000..99b8d5d Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff/IRANSansWeb_Light.woff differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff/IRANSansWeb_Medium.woff b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff/IRANSansWeb_Medium.woff new file mode 100644 index 0000000..322c396 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff/IRANSansWeb_Medium.woff differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff/IRANSansWeb_UltraLight.woff b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff/IRANSansWeb_UltraLight.woff new file mode 100644 index 0000000..31c21ca Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff/IRANSansWeb_UltraLight.woff differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff2/IRANSansWeb.woff2 b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff2/IRANSansWeb.woff2 new file mode 100644 index 0000000..21bbba5 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff2/IRANSansWeb.woff2 differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff2/IRANSansWeb_Black.woff2 b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff2/IRANSansWeb_Black.woff2 new file mode 100644 index 0000000..da34aad Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff2/IRANSansWeb_Black.woff2 differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff2/IRANSansWeb_Bold.woff2 b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff2/IRANSansWeb_Bold.woff2 new file mode 100644 index 0000000..dd1436c Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff2/IRANSansWeb_Bold.woff2 differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff2/IRANSansWeb_Light.woff2 b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff2/IRANSansWeb_Light.woff2 new file mode 100644 index 0000000..16dc9f1 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff2/IRANSansWeb_Light.woff2 differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff2/IRANSansWeb_Medium.woff2 b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff2/IRANSansWeb_Medium.woff2 new file mode 100644 index 0000000..5fb39d4 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff2/IRANSansWeb_Medium.woff2 differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff2/IRANSansWeb_UltraLight.woff2 b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff2/IRANSansWeb_UltraLight.woff2 new file mode 100644 index 0000000..eeeec11 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/WebFonts/fonts/woff2/IRANSansWeb_UltraLight.woff2 differ diff --git a/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/license.pdf b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/license.pdf new file mode 100644 index 0000000..6f9c008 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Old version/IRANSans5.5 (No support)/license.pdf differ diff --git a/src/IranSans/IranSansX(Eco)/Webfonts/Fa Numral Help.html b/src/IranSans/IranSansX(Eco)/Webfonts/Fa Numral Help.html new file mode 100644 index 0000000..bb8a5b4 --- /dev/null +++ b/src/IranSans/IranSansX(Eco)/Webfonts/Fa Numral Help.html @@ -0,0 +1,534 @@ + + + + + IranSansX OpenType features in CSS + + + + + + + + + + +
+ +

فارسی کردن اعداد انگلیسی و عربی

+ +

Stylistic alternates (ss01)

+

با فعال کردن استایلستیک سری ss01 اعداد انگلیسی بصورت فارسی نمایش داده می‌شود. در مثال زیر ردیف اول اعداد فارسی است و ردیف دوم اعداد انگلیسی است که فارسی شده است.

+

+.ss01 { + -moz-font-feature-settings: "ss01"; + -webkit-font-feature-settings: "ss01"; + font-feature-settings: "ss01"; +} +
+
+

+۱۲۳۴۵۶۷۸۹۰ +
+1234567890 +

+
+ + +
+

+

هم عرض (monospace) کردن اعداد

+ +

Stylistic alternates (ss03)

+

با فعال کردن استایلستیک سری ss03 اعداد بصورت منو اسپیس تایپ می‌شود یعنی عرض همه اعداد برابر است و مناسب استفاده در لیست‌ها و جداول اطلاعات. +
+در سطر دوم اعداد انگلیسی فارسی و هم‌عرض شده است. +

+

+.ss03 { + -moz-font-feature-settings: "ss03"; + -webkit-font-feature-settings: "ss03"; + font-feature-settings: "ss03"; +} +
+
+

+ ۱۲۳۴۵۶۷۸۹۰ +
+ 1234567890 +

+
+
+ +
+

+

تغییر تراز عمودی اعداد

+ +

Stylistic alternates (ss04)

+

با فعال کردن استایلستیک سری ss04 اعداد کمی پایین‌تر از خط کرسی قرار می‌گیرد تا تراز عمودی در باکس‌های طراحی وسط باشد. +
+در مثال زیر: خط اول تراز اعداد در حالت پیش‌فرض و در خط دوم به کمک استایل ss04 تراز تغییر کرده است.

+

+.ss04 { + -moz-font-feature-settings: "ss04"; + -webkit-font-feature-settings: "ss04"; + font-feature-settings: "ss04"; +} +
+
+

+ ۱۲۳۴۵۶۷۸۹۰ ریال +

+
+

+ ۱۲۳۴۵۶۷۸۹۰ ریال +

+
+
+ + +
+ + + + + + diff --git a/src/IranSans/IranSansX(Eco)/Webfonts/IranSansX.html b/src/IranSans/IranSansX(Eco)/Webfonts/IranSansX.html new file mode 100644 index 0000000..7a68f4f --- /dev/null +++ b/src/IranSans/IranSansX(Eco)/Webfonts/IranSansX.html @@ -0,0 +1,422 @@ + + + + +IRANSansX Family Type face: خانواده فونت ایران‌سنس + + + + + + + + +
+ +
+
+

بِسْمِ اللهِ الرَّحْمَنِ الرَّحِيمِ

+
+
د
+
+
+ ن وَالْقَلَمِ وَ مَا يَسْطُرُون +
+ نون؛ سوگند به قلم و آنچه می نويسند. +
+ Noon. I swear by the pen and what the angels write +
+
+
+
+ +
+ +
+

نکاتی درباره تایپوگرافی وب

+
+ +
ج
+
+

از زمان پیدایش نخستین وب سایت، متن ها یکی از اجزای مهم صفحات وب بودند. هر چند به مرور زمان با ورود تصاویر، صوت و فیلم کمی از بار مسئولیت متون کم شد اما هنوز جایگاه خود را از دست نداده اند و بخش مهمی از کار را به عهده دارند.

+

بسیاری از طراحان وب سایت به صورت تجربی بهترین ترکیب و ظاهر را برای نمایش متن ها انتخاب می کنند. اما اصولی وجود دارد که با رعایت آن ها، تاثیرپذیری و زیبایی سایت چند برابر خواهد شد.

+

در ادامه مطلب قصد داریم تعدادی از اصول مقدماتی تایپوگرافی را به اختصار مرور کنیم. هرچند بسیاری از دوستان با این نکات آشنا هستند؛ اما شاید مرور آن ها خالی از لطف نباشد.

+
+ + +
+ +
+
+

تاثیر اندازه فونت و سلسله مراتب تگ‌ها

+
+
ن
+
+

فونت های داخل سایت باید به گونه ای قرار گیرند که کاربر به راحتی بتواند آن ها را بخواند. نوع فونت، وزن و کوچک (یا بزرگ) بودن اندازه آن ممکن است تمایل کاربر برای بازگشت به وب سایت را کاهش دهد. قواعد و قوانین زیادی برای انتخاب بهترین فونت وجود دارد.

+

در زیر می توانید ۱۲ وزن مختلف خانواده فونت ایران‌سنس را در شرایط یکسان مشاهده کنید. لازم به ذکر است برای این صفحه از وزن معمولی (Normal) استفاده شده است.

+
+
+ + +
+
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Thin)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (UltraLight)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Light)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Regular)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Medium)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (demiBold)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Bold)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (ExtraBold)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Black)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (ExBlack)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Heavy)
+
+
+ +
+
+ +
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Thin)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (UltraLight)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Light)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Regular)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Medium)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (demiBold)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Bold)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (ExtraBold)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Black)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (ExBlack)
+
بیانِ زبان با گذشت زمان کهنه می شود و بیانِ قلم برای همیشه باقی می ماند (Heavy)
+
+
+ + +
+
+

تگ‌های هدینگ

+
+
و
+
+

در این بین، استفاده از تگ های هدینگ مناسب و رعایت سلسله مراتب آن ها، هم مفهوم نوشته را بهتر منتقل می کند و هم تاثیر قابل توجهی در نتایج موتورهای جستجو خواهد داشت. این نکته یکی از فاکتورهای مهم در بهینه سازی وب سایت برای موتورهای جستجو (Search Engine Optimization) است.

+

نمونه ای از خروجی تگ های هدینگ با سایز استاندارد مربوطه به فونت های فونت ایران‌سنس را در زیر مشاهده می کنید.

+
+
+ +
+
+

(H1) نابرده رنج گنج میسر نمی شود. No gain without pain

+

(H2) نابرده رنج گنج میسر نمی شود. No gain without pain

+

(H3) نابرده رنج گنج میسر نمی شود. No gain without pain

+

(H4) نابرده رنج گنج میسر نمی شود. No gain without pain

+
(H5) نابرده رنج گنج میسر نمی شود. No gain without pain
+
(H6) نابرده رنج گنج میسر نمی شود. No gain without pain
+
+
+ +
+
+

(H1) نابرده رنج گنج میسر نمی شود. No gain without pain

+

(H2) نابرده رنج گنج میسر نمی شود. No gain without pain

+

(H3) نابرده رنج گنج میسر نمی شود. No gain without pain

+

(H4) نابرده رنج گنج میسر نمی شود. No gain without pain

+
(H5) نابرده رنج گنج میسر نمی شود. No gain without pain
+
(H6) نابرده رنج گنج میسر نمی شود. No gain without pain
+
+
+ +
+
+

سطر و ستون بندی

+
+
م
+
+

معمولاً هرگاه مقدار نوشته از یک سطر بیشتر شود ناگزیر به ستون بندی هستیم. و این کار ما را با چند متغییر مواجه خواهد کرد:

+

۱- عرض ستون‌های متنی که حاوی حداقل۷ کلمه باشد بهترین انتخاب است. اگر ستون کوتاه‌تر باشد چشم بیننده در اثر حرکت‌های زود به زود از پایان یک سطر به ابتدای سطر بعدی خسته خواهد شد. علاوه بر این لبه ستون‌هایی با عرض کم نیز همیشه دندانه ای و بی نظم خواهد بود. ستون‌هایی با عرض طولانی هم برای خواننده آزار دهنده است چرا که چشم در حرکت بازگشت از انتهای یک سطر به ابتدای سطر بعدی ممکن است دچار اشتباه شود. + +

۲- لدینگ یا همان فاصله سطر هم در ستون بندی اهمیت دارد. ستون‌های فشرده اگرچه به لحاظ گرافیکی منسجم و زیبا هستند اما عمل خواندن را مختل می کنند و در مقابل، فاصله سطر زیاد نیز باعث نازیبایی و خستگی چشم خواننده می‌شود. فاصله سطر همیشه می تواند با توجه به نوع فونت و عرض ستون‌ها تغییر کند. بدین ترتیب که فونت‌هایی با دندانه‌های بلند‌تر و ستون‌هایی با عرض بیشتر به لدینگ بیشتری نیاز دارند. +

۳- همترازی هم یکی از متغییرهای پر بحث در ستون بندی است. اما به طور کوتاه و خلاصه باید گفت که بهتر است در متن فارسی از همترازی یا همان Justification استفاده نکنید. این عمل اگرچه لبه پاراگراف شما را مرتب خواهد کرد اما تنظیمات فاصله حروف را تغییر خواهد داد و در نتیجه باعث کاهش خوانایی خواهد شد.

+
+ +
+
(IRANSansX Thin)
+
ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX UltraLight)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX Light)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX Regular)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX Mediume)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX DemiBold)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX Bold)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX ExtraBold)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX Black)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX ExtraBlack)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX Heavy)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ + +
+
(IRANSansX Thin)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX UltraLight)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX Light)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX Regular)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX Mediume)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX DemiBold)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX Bold)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX ExtraBold)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX Black)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX ExtraBlack)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
(IRANSansX Heavy)
+
+ایران سن سریف IRANSansX سبکی ساده و ضخامت یکسان از قلم ایران است که با وجود حفظ ساختار قلم‌های رایج ایرانی حال و هوای مدرن و امروزی دارد. سادگی شکل‌ حروف و استفاده از حداقل شکستگی باعث شده است این تایپ فیس علاوه بر خوانا بودن زیبا و چشم نواز نیز باشد. این فونت با سبک‌های طراحی کمینه‌گرا Minimal سازگاری خوبی دارد و همنشین مناسبی برای فونت‌های سن‌سریف لاتین است.
+ +
+Roboto has a dual nature. It has a mechanical skeleton and the forms are largely geometric. At the same time, the font features friendly and open curves. While some grotesks distort their letterforms to force a rigid rhythm, Roboto doesn’t compromise, allowing letters to be settled into their natural width. This makes for a more natural reading rhythm more commonly found in humanist and serif types.
+
+ +
+
+

اعداد و علائم در فونت فارسی

+
+
ظ
+
+

اعداد فارسی: ۱۲۳۴۵۶۷۸۹۰
+ اعداد عربی: ۱۲۳٤٥٦۷۸۹۰
+ اعداد انگلیسی: 1234567890

+

برای تایپ اعداد فارسی در محیط وب از کیبورد استاندارد فارسی استفاده کنید. در ویندوز ۸ و یا بالاتر این کیبورد، با نام Persian(Standard)Keyboard در لیست کیبوردهای ویندوز وجود دارد. همچنین می توانید از این آدرس آن را دانلود و نصب کنید.

+ +

با استفاده از کیبورد استاندارد می‌توانید ممیز فارسی را تایپ کنید.
+ میانبر این علامت کلیدهای Shift+3 است. به این شکل: ۳٫۱۴
+ ممیز فارسی با علامت اسلش تفاوت دارد :۳/۱۴ +

+

با استفاده از کیبورد استاندارد می‌توانید جداکننده هزارگان فارسی را تایپ کنید.
+ میانبر این علامت کلیدهای Shift+2 است. به این شکل: ۹٬۲۱۰٬۰۰۰
+ این علامت با جدا کننده هزارگان انگلیسی تفاوت دارد : ۹,۲۱۰,۰۰۰ +

+
+
+ +
+
+

نسبت‌های طلایی

+
+
+
+ ۳٫۷۷۷ ÷ ۱٫۶۱۸ = ۲٫۳۳۵ +
+ ۶٫۱۱۲ ÷ ۱٫۶۱۸ = ۳٫۷۷۷ +
+ ۹٫۸۸۹ ÷ ۱٫۶۱۸ = ۶٫۱۱۲ +
+ ۱۶ ÷ ۱٫۶۱۸ = ۹٫۸۸۹ +
+....................................... +
+ ۱۶ × ۱٫۶۱۸ = ۲۵٫۸۸۸ +
+ ۲۵٫۸۸۸ × ۱٫۶۱۸ = ۴۱٫۸۸۷ +
+ ۴۱٫۸۸۷ × ۱٫۶۱۸ = ۶۷٫۷۷۳ +
+ ۶۷٫۷۷۳ × ۱٫۶۱۸ = ۱۰۹٫۶۵۶ +
+
+
+

اهمیت اندازه فونت در خوانایی و زیبا شدن صفحه وب سایت بر کسی پوشیده نیست. در کنار این بحث، موارد دیگری مانند ارتفاع خطوط، فاصله ها، ابعاد قسمت های مختلف و ... نیز در بحث تایپوگرافی اهمیت زیادی دارند.

+

برای محاسبه این اعداد می توانیم از سری اعداد متناسب (Modular Scale) استفاده کنیم. در حقیقت از تعدادی عدد پشت سر هم که بر اساس مضرب خاصی تشکیل شده اند برای تنظیمات ارتفاع خط، فاصله ها، ابعاد و ... استفاده می کنیم. نسبت (عدد) طلایی همان مضرب اعداد است.

+

به عنوان مثال می خواهیم از سایز 16px فونت ایران‌سنس به عنوان فونت و سایز اصلی متن صفحات استفاده کنیم. عدد فی (phi) یونانی که معادل ۱٫۶۱۸۰۳۳۹۸۸۷ (به اختصار ۱٫۶۱۸) است را به عنوان نسبت طلایی در نظر می گیریم. بنابراین سری اعدادی به شکل روبرو خواهیم داشت:

+ +

+ به کمک این اعداد و استفاده از آن ها در صفحات وب سایت خود می توانیم خوانایی و زیبایی آن را افزایش دهیم. علاوه بر آن، اگر از واحدهای نسبی مانند em استفاده شود، امکانات بیشتری در اختیار طراح و بازدیدکننده خواهد بود. البته سری اعداد بر مبنای نسبت طلایی فقط در تایپوگرافی وب سایت کاربرد ندارد. + این اعداد می تواند ادامه داشته باشد (۱٬۲۱۵٫۹۸۱ ، ۱٬۹۶۷٫۴۵۷ ، ۳٬۱۸۳٫۳۴۵ و ...). +

+ ایران‌سنس +
+
+ + +
+
+
+در این فایل سعی کردیم همراه با یک مطلب آموزشی کوتاه، نحوه استفاده از خانواده فونت ایران‌سنس و پیش نمایشی از قسمت های مختلف آن را مرور کنیم. +
+برای مشاهده راهنمای نحوه قراردادن فونت ها در وب سایت خود، به این آدرس مراجعه کنید. +
+
+
+
+
ء
+
+ +
+ +
+ + \ No newline at end of file diff --git a/src/IranSans/IranSansX(Eco)/Webfonts/fontiran.css b/src/IranSans/IranSansX(Eco)/Webfonts/fontiran.css new file mode 100644 index 0000000..2345a86 --- /dev/null +++ b/src/IranSans/IranSansX(Eco)/Webfonts/fontiran.css @@ -0,0 +1,109 @@ +/** +* +* Name: IRANSansX Fonts +* Version: 3 +* Author: Moslem Ebrahimi (moslemebrahimi.com) +* Created on: Apr 22, 2021 +* Updated on: Jul 12, 2023 +* Website: http://fontiran.com +* Copyright: Commercial/Proprietary Software +-------------------------------------------------------------------------------------- +فونتایران سنس Xا یک نرم افزار مالکیتی محسوب می شود. جهت آگاهی از قوانین استفاده از این فونت ها لطفا به وب سایت (فونت ایران دات کام) مراجعه نمایید +-------------------------------------------------------------------------------------- +IRANSansX fonts are considered a proprietary software. To gain information about the laws regarding the use of these fonts, please visit www.fontiran.com +-------------------------------------------------------------------------------------- +This set of fonts are used in this project under the license: (.....) +------------------------------------------------------------------------------------- fonts/- +* +**/ + + +@font-face { + font-family: IRANSansX; + font-style: normal; + font-weight: 100; + src: url('fonts/woff/IRANSansX-Thin.woff') format('woff'), + url('fonts/woff2/IRANSansX-Thin.woff2') format('woff2'); +} + +@font-face { + font-family: IRANSansX; + font-style: normal; + font-weight: 200; + src: url('fonts/woff/IRANSansX-UltraLight.woff') format('woff'), + url('fonts/woff2/IRANSansX-UltraLight.woff2') format('woff2'); +} + +@font-face { + font-family: IRANSansX; + font-style: normal; + font-weight: 300; + src: url('fonts/woff/IRANSansX-Light.woff') format('woff'), + url('fonts/woff2/IRANSansX-Light.woff2') format('woff2'); +} + +@font-face { + font-family: IRANSansX; + font-style: normal; + font-weight: 500; + src: url('fonts/woff/IRANSansX-Medium.woff') format('woff'), + url('fonts/woff2/IRANSansX-Medium.woff2') format('woff2'); +} + +@font-face { + font-family: IRANSansX; + font-style: normal; + font-weight: 600; + src: url('fonts/woff/IRANSansX-DemiBold.woff') format('woff'), + url('fonts/woff2/IRANSansX-DemiBold.woff2') format('woff2'); +} + +@font-face { + font-family: IRANSansX; + font-style: normal; + font-weight: 800; + src: url('fonts/woff/IRANSansX-ExtraBold.woff') format('woff'), + url('fonts/woff2/IRANSansX-ExtraBold.woff2') format('woff2'); +} + +@font-face { + font-family: IRANSansX; + font-style: normal; + font-weight: 900; + src: url('fonts/woff/IRANSansX-Black.woff') format('woff'), + url('fonts/woff2/IRANSansX-Black.woff2') format('woff2'); +} + +@font-face { + font-family: IRANSansX; + font-style: normal; + font-weight: 950; + src: url('fonts/woff/IRANSansX-ExtraBlack.woff') format('woff'), + url('fonts/woff2/IRANSansX-ExtraBlack.woff2') format('woff2'); +} + +@font-face { + font-family: IRANSansX; + font-style: normal; + font-weight: 1000; + src: url('fonts/woff/IRANSansX-Heavy.woff') format('woff'), + url('fonts/woff2/IRANSansX-Heavy.woff2') format('woff2'); +} + +@font-face { + font-family: IRANSansX; + font-style: normal; + font-weight: bold; + src: url('fonts/woff/IRANSansX-Bold.woff') format('woff'), + url('fonts/woff2/IRANSansX-Bold.woff2') format('woff2'); +} + +@font-face { + font-family: IRANSansX; + font-style: normal; + font-weight: normal; + src: url('fonts/woff/IRANSansX-Regular.woff') format('woff'), + url('fonts/woff2/IRANSansX-Regular.woff2') format('woff2'); +} + + diff --git a/src/IranSans/IranSansX(Eco)/Webfonts/fonts/woff/IRANSansX-Bold.woff b/src/IranSans/IranSansX(Eco)/Webfonts/fonts/woff/IRANSansX-Bold.woff new file mode 100644 index 0000000..6dacc61 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Webfonts/fonts/woff/IRANSansX-Bold.woff differ diff --git a/src/IranSans/IranSansX(Eco)/Webfonts/fonts/woff/IRANSansX-Regular.woff b/src/IranSans/IranSansX(Eco)/Webfonts/fonts/woff/IRANSansX-Regular.woff new file mode 100644 index 0000000..51780b3 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Webfonts/fonts/woff/IRANSansX-Regular.woff differ diff --git a/src/IranSans/IranSansX(Eco)/Webfonts/fonts/woff2/IRANSansX-Bold.woff2 b/src/IranSans/IranSansX(Eco)/Webfonts/fonts/woff2/IRANSansX-Bold.woff2 new file mode 100644 index 0000000..4d1fcc3 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Webfonts/fonts/woff2/IRANSansX-Bold.woff2 differ diff --git a/src/IranSans/IranSansX(Eco)/Webfonts/fonts/woff2/IRANSansX-Regular.woff2 b/src/IranSans/IranSansX(Eco)/Webfonts/fonts/woff2/IRANSansX-Regular.woff2 new file mode 100644 index 0000000..fae3f74 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Webfonts/fonts/woff2/IRANSansX-Regular.woff2 differ diff --git a/src/IranSans/IranSansX(Eco)/Webfonts/letter-spacing.png b/src/IranSans/IranSansX(Eco)/Webfonts/letter-spacing.png new file mode 100644 index 0000000..49c76e8 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/Webfonts/letter-spacing.png differ diff --git a/src/IranSans/IranSansX(Eco)/Webfonts/style.css b/src/IranSans/IranSansX(Eco)/Webfonts/style.css new file mode 100644 index 0000000..1bd5161 --- /dev/null +++ b/src/IranSans/IranSansX(Eco)/Webfonts/style.css @@ -0,0 +1,244 @@ +@import url(fontiran.css); /* لینک فایلی که وظیفه بارگذاری فونت ها را برعهده دارد */ +body { + font-family: IRANSansX !important; + direction: rtl; + background-color: #cdcdcd; + margin: 0; +} +h1, h2, h3, h4, h5, h6,input, textarea { + font-family: IRANSansX !important; +} +h1 { + font-weight: bold; +} +.wrapper { + max-width: 900px; + margin: 0 auto; +} +.ltr { + direction: ltr; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-left { + text-align: left; +} +.text-small { + font-size: 0.8em; +} +.text-xsmall { + font-size: 0.6em; +} +.text-large { + font-size: 1.2em; +} +.text-xlarge { + font-size: 1.4em; +} +.text-underline { + text-decoration:underline; +} + +.text-thin { + font-weight: 400; +} +.text-UltraLight { + font-weight: 400; +} +.text-light { + font-weight: 400; +} +.text-regular { + font-weight: normal; +} +.text-medium { + font-weight: 700; +} +.text-demibold { + font-weight: 700; +} +.text-bold { + font-weight: bold; +} + +.text-extrabold { + font-weight: 700; +} +.text-black { + font-weight: 700; +} +.text-extrablack { + font-weight: 700; +} +.text-heavy { + font-weight: 700; +} + +blockquote { + font-weight: 700; + padding: 10px; + border: 1px dashed #666666; +} + +.mainbox { + width: 100%; + background-color: #EFEFEF; + display: table; + margin-bottom: 30px; + border-right: 8px solid #df79ff; +} + +.mainboxnegativ { + width: 100%; + background-color: #000000; + display: table; + margin-bottom: 30px; + border-right: 8px solid #df79ff; + color: #F9F9F9; +} + +.mainbox2 { + font-size: 1em; + width: 90%; + padding-right: 20px; + padding-top: 10px; + padding-bottom: 10px; +} +.mainboxitalic { + font-size: 1em; + font-style: italic; + width: 90%; + padding-right: 20px; + padding-top: 10px; + padding-bottom: 10px; +} + +.mainbox3 { + width: 100%; + background-color: #DFDFDF; + display: table; + margin-bottom: 30px; + border-right: 8px solid #FF5EAA; +} + +.mainbox2negativ { + font-size: 1em; + color: #F9F9F9; + background-color: #000000; + padding-right: 20px; +} + + +.farsiparagraph { + font-size: 1em; + width: 47%; + float:right; + padding-right: 20px; + padding-top: 10px; + padding-bottom: 10px; + +} + +.farsiparagraph_negativ { + font-size: 1em; + color: #F9F9F9; + background-color: #000000; + width: 47%; + float:right; + padding-right: 20px; + padding-top: 10px; + padding-bottom: 10px; + +} + + +.englishparagraph { + font-size: 1em; + width: 47%; + float: left; + direction:ltr; + padding-left: 20px; + padding-top: 10px; + padding-bottom: 10px; + + +} + +.englishparagraph_negativ { + font-size: 1em; + color: #F9F9F9; + background-color: #000000; + width: 47%; + float: left; + direction:ltr; + padding-left: 20px; + padding-top: 10px; + padding-bottom: 10px; + + +} +.rightbox { + width: 60%; + padding-right: 20px; + padding-left: 5px; + float: right; + margin-left: 10px; + margin-bottom: 0px; + min-width: 0px; + background-color: #F7F7F7; + +} + +.titelbox { + width: 60%; + padding-right: 25px; + padding-left: 0px; + float: right; + margin-left: 10px; + margin-bottom: 0px; + min-width: 0px; + background-color: #d5d5d5; + color: #4B4B4B; +} + + +.lefttbox { + + padding-right: 20px; + padding-left: 4px; + float: right; + margin-bottom: 10px; + min-width: 0px; +} + +.alphabet { + width: 35%; + float: left; + font-size: 20em; + text-align: center; + font-weight: 700; + color: #999999; +} + +.alphabet2 { + width: 35%; + float: left; + direction: ltr; + font-size: 1.6em; + text-align: left; + font-weight: 700; + color: #333333; + margin-top: 100px; +} +.footer { + font-weight: 400; + font-size: 0.7em; + text-align: center; + direction: ltr; + margin-bottom: 0px; + padding-bottom: 0px; +} diff --git a/src/IranSans/IranSansX(Eco)/Webfonts/webfont test.html b/src/IranSans/IranSansX(Eco)/Webfonts/webfont test.html new file mode 100644 index 0000000..039af71 --- /dev/null +++ b/src/IranSans/IranSansX(Eco)/Webfonts/webfont test.html @@ -0,0 +1,190 @@ + + + + + IRANSansX + + + + + + +

+ Charset + +   + + +

+ +

10 +چو ایران نَباشَد تَنِ مَن مَباد +بِدين بوم و بَر زنده يِک تَن مَباد +

+ +

11 +چو ایران نَباشَد تَنِ مَن مَباد +بِدين بوم و بَر زنده يِک تَن مَباد +

+ +

12 +چو ایران نَباشَد تَنِ مَن مَباد +بِدين بوم و بَر زنده يِک تَن مَباد +

+ +

13 +چو ایران نَباشَد تَنِ مَن مَباد +بِدين بوم و بَر زنده يِک تَن مَباد +

+ +

14 +چو ایران نَباشَد تَنِ مَن مَباد +بِدين بوم و بَر زنده يِک تَن مَباد +

+ +

15 +چو ایران نَباشَد تَنِ مَن مَباد +بِدين بوم و بَر زنده يِک تَن مَباد +

+ +

16 +چو ایران نَباشَد تَنِ مَن مَباد +بِدين بوم و بَر زنده يِک تَن مَباد +

+ +

17 +چو ایران نَباشَد تَنِ مَن مَباد +بِدين بوم و بَر زنده يِک تَن مَباد +

+ +

18 +چو ایران نَباشَد تَنِ مَن مَباد +بِدين بوم و بَر زنده يِک تَن مَباد +

+ +

چو ایران نَباشَد تَنِ مَن مَباد +بِدين بوم و بَر زنده يِک تَن مَباد +

+ +

چو ایران نَباشَد تَنِ مَن مَباد +بِدين بوم و بَر زنده يِک تَن مَباد +

+ + diff --git a/src/IranSans/IranSansX(Eco)/iransansX family/IRANSansX-Bold.ttf b/src/IranSans/IranSansX(Eco)/iransansX family/IRANSansX-Bold.ttf new file mode 100644 index 0000000..2abf7b2 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/iransansX family/IRANSansX-Bold.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/iransansX family/IRANSansX-Regular.ttf b/src/IranSans/IranSansX(Eco)/iransansX family/IRANSansX-Regular.ttf new file mode 100644 index 0000000..27e14ca Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/iransansX family/IRANSansX-Regular.ttf differ diff --git a/src/IranSans/IranSansX(Eco)/iransansX family/Otf fonts/IRANSansX-Bold.otf b/src/IranSans/IranSansX(Eco)/iransansX family/Otf fonts/IRANSansX-Bold.otf new file mode 100644 index 0000000..4281aba Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/iransansX family/Otf fonts/IRANSansX-Bold.otf differ diff --git a/src/IranSans/IranSansX(Eco)/iransansX family/Otf fonts/IRANSansX-Regular.otf b/src/IranSans/IranSansX(Eco)/iransansX family/Otf fonts/IRANSansX-Regular.otf new file mode 100644 index 0000000..c8eda2c Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/iransansX family/Otf fonts/IRANSansX-Regular.otf differ diff --git a/src/IranSans/IranSansX(Eco)/licenses.pdf b/src/IranSans/IranSansX(Eco)/licenses.pdf new file mode 100644 index 0000000..36fe2d7 Binary files /dev/null and b/src/IranSans/IranSansX(Eco)/licenses.pdf differ diff --git a/src/app/(index)/components/nav-top.tsx b/src/app/(index)/components/nav-top.tsx new file mode 100644 index 0000000..74afd10 --- /dev/null +++ b/src/app/(index)/components/nav-top.tsx @@ -0,0 +1,54 @@ +'use client' + +import { useRouter } from 'next/navigation' +import axiosInstance from '@/axios/axiosInstance' +import { useQuery } from '@tanstack/react-query' +import Link from 'next/link' +import { useEffect, useState } from 'react' + +const NavTop = ()=>{ + + const router = useRouter(); + const [nameFamily, setNameFamily] = useState(null) + + useEffect( ()=>{ + setNameFamily(localStorage.getItem('nameFamily')) + },[]) + + const result = useQuery({ queryKey:[`cuser-info`], queryFn: async ()=>{ + return await axiosInstance.get(`cuser/info/`) + }, refetchOnWindowFocus: false, onSuccess: async (result)=>{ + + if(result.status==200){ + localStorage.setItem('nameFamily', result.data.name_family) + setNameFamily(result.data.name_family) + } + + },}) + + const onLogout = ()=>{ + localStorage.removeItem('0a'); + localStorage.removeItem('0r'); + localStorage.removeItem('access'); + localStorage.removeItem('refresh'); + document.cookie = "isAuth=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"; + setTimeout(()=>{ + router.push('/login') + }, 200) + } + return ( +
+
+
+
+ {nameFamily ? ( + {nameFamily} + ): null} +
+
خروج
+
+
+ ) +} + +export default NavTop \ No newline at end of file diff --git a/src/app/(index)/components/side-right.tsx b/src/app/(index)/components/side-right.tsx new file mode 100644 index 0000000..bcbf123 --- /dev/null +++ b/src/app/(index)/components/side-right.tsx @@ -0,0 +1,60 @@ +import Link from "next/link"; +import { AiFillAppstore, AiFillHome } from "react-icons/ai"; +import { HiShoppingCart } from "react-icons/hi"; +import { BsFillChatRightTextFill,BsFillQuestionCircleFill } from "react-icons/bs"; +import { BiSolidReport, } from "react-icons/bi"; +import { FaMoneyCheckDollar, FaHandHoldingDollar, FaUsers } from "react-icons/fa6"; +import { MdVerified, MdOutlineRepeatOn } from "react-icons/md"; +import { TbTargetArrow } from "react-icons/tb"; +import { IoNotifications } from "react-icons/io5"; + + + +const SideRight = ()=>{ + + const menuLinks = [ + {name:'خانه', link: '/', size:25, icon: }, + {name:'درخواست ها', link: '/orders', size:25, icon: }, + {name:'تایدیه ها', link: '', size:25, icon: }, + {name:'تیکت ها', link: '/tickets', size:25, icon: }, + {name:'مشتریان', link: '/customers', size:25, icon: }, + {name:'پیگیری دوره ای', link: '/marketing', size:25, icon: }, + {name:'بازاریابی', link: '/marketing', size:25, icon: }, + {name:'یادآوری', link: '/remainder', size:25, icon: }, + {name:'گزارشات', link: '', size:25, icon: }, + {name:'چک ها', link: '', size:25, icon: }, + {name:'واریزی ها', link: '', size:25, icon: }, + {name:'پایگاه دانش', link: '', size:25, icon: }, + + ] + + return ( + + ) +} + +export default SideRight \ No newline at end of file diff --git a/src/app/(index)/components/ui/date-time-button.tsx b/src/app/(index)/components/ui/date-time-button.tsx new file mode 100644 index 0000000..36b63dc --- /dev/null +++ b/src/app/(index)/components/ui/date-time-button.tsx @@ -0,0 +1,74 @@ +import DatePicker, { DateObject } from "react-multi-date-picker"; +import TimePicker from "react-multi-date-picker/plugins/time_picker"; +import persian from "react-date-object/calendars/persian" +import persian_fa from "react-date-object/locales/persian_fa" +import "react-multi-date-picker/styles/layouts/mobile.css" +import { HiBellAlert } from "react-icons/hi2"; +import { IoIosClose } from "react-icons/io"; +import { useState } from "react"; + + +interface IProps { + setDateTimeFun: any, + enableDateTime: boolean, + remainderDateTime: string | null, +} +const DateTimeButton = (props: IProps)=>{ + + const [dateTime, setDateTime] = useState(null); + const [enableDateTime, setEnableDateTime] = useState(props?.enableDateTime ? true: false) + + useState(()=>{ + + }) + const dataTimeState = ()=>{ + setEnableDateTime(!enableDateTime) + if(enableDateTime){ + setDateTime(null) + props.setDateTimeFun(null) + } + } + + const changeDateTime = (e:any)=>{ + setDateTime(e) + props.setDateTimeFun(e) + } + + return ( +
+ +
+ + { enableDateTime ? ( +
+ +
+ ): ( +
+ + فعال کردن یادآوری +
+ ) } +
+ +
+ + + ]} + value={dateTime!=null ? dateTime : props?.remainderDateTime? new DateObject(new Date(props?.remainderDateTime)) : null} onChange={changeDateTime} /> + +
+ +
+ ) +} + +export default DateTimeButton \ No newline at end of file diff --git a/src/app/(index)/components/ui/reminder-modal.tsx b/src/app/(index)/components/ui/reminder-modal.tsx new file mode 100644 index 0000000..53efdf7 --- /dev/null +++ b/src/app/(index)/components/ui/reminder-modal.tsx @@ -0,0 +1,106 @@ +import DatePicker, { DateObject } from "react-multi-date-picker"; +import TimePicker from "react-multi-date-picker/plugins/time_picker"; +import persian from "react-date-object/calendars/persian" +import persian_fa from "react-date-object/locales/persian_fa" +import "react-multi-date-picker/styles/layouts/mobile.css" +import { useEffect, useState } from "react"; +import axiosInstance from "@/axios/axiosInstance"; +import { useQueryClient } from "@tanstack/react-query"; +import moment from "moment-jalaali"; + +interface IProps { + hidden: boolean, + onOpenClose: any, + objID: number, + reminder_data: { + id: number + created_at: string + datetime: string + desc: string | number + }, +} +const RemainderModal = (props: IProps)=>{ + const [valueDT, setValueDT] = useState(null) + + const queryClient = useQueryClient() + + useEffect(()=>{ + + if(props?.reminder_data?.datetime){ + + setValueDT(new DateObject(new Date(props?.reminder_data?.datetime))) + } + + },[props?.reminder_data?.datetime]) + + const onReminder = async ()=>{ + + if(valueDT){ + + const reminder_result = await axiosInstance.post(`reminder/lead/create-update/`, { + 'lead_id': props?.objID, + 'datetime': moment(new Date(valueDT.unix * 1000)).format() + }) + if(reminder_result?.status == 201){ + queryClient.invalidateQueries({ queryKey: ['form-items-and-lead'] }) + props.onOpenClose(true) + } + + } + + } + + const onDeleteReminder = async ()=>{ + + if(props?.reminder_data?.datetime){ + + const reminder_result = await axiosInstance.delete(`reminder/lead/${props?.objID}/delete/`) + if(reminder_result?.status == 200){ + queryClient.invalidateQueries({ queryKey: ['form-items-and-lead'] }) + setValueDT(null) + props.onOpenClose(true) + } + + } + + } + + + return ( +
+
+ + +
+ + + + ]} + value={valueDT} onChange={setValueDT} /> + + ثبت + +
+ {props.onOpenClose(true)}} className='mt-2 rounded-md p-2 text-center cursor-pointer w-full bg-red-800 text-white'>لغو + + + حذف یادآوری + +
+ +
+ +
+
+ ) +} + +export default RemainderModal \ No newline at end of file diff --git a/src/app/(index)/customers/[id]/BackupPage.tsx b/src/app/(index)/customers/[id]/BackupPage.tsx new file mode 100644 index 0000000..331daa2 --- /dev/null +++ b/src/app/(index)/customers/[id]/BackupPage.tsx @@ -0,0 +1,148 @@ +'use client' + +import { Input } from "@/components/ui/input" +import CustomerHeader from "../components/customer-header" +import { Label } from "@/components/ui/label" +import { Textarea } from "@/components/ui/textarea" +import { FaRegEdit } from "react-icons/fa"; +import CustomerInfo from "../components/customer-info" +import { BiSolidNotepad } from "react-icons/bi"; +import { HiMiniSignal } from "react-icons/hi2"; +import { TbMessage2 } from "react-icons/tb"; +import { FaCartShopping } from "react-icons/fa6"; +import CustomerXBox from "../components/customer-x-box" +import { RiAlarmWarningFill } from "react-icons/ri"; +import { ISummary, ICustomer, IFormValues } from "./interfaces" +import { useState } from "react" +import { useQuery } from "@tanstack/react-query" +import axiosInstance from "@/axios/axiosInstance" +import CustomerXBoxLead from "../components/customer-x-box-lead" +import CustomerXBoxNote from "../components/customer-x-box-note" +import CustomerIDHeader from "../components/customer-id-header" + +interface IFormItems { + shive_ashenaei: [ + { + id: number, + name: string + } + ], + shahr: [ + { + id: number, + name: string, + ostan: { + id: number + } | null, + is_ostan: boolean + }, + ], + responsible_groups: [ + { + id: number, + name: string + } + ] | null, +} + +const customerPageID = ({params}:{params: {id: number} }) => { + + const [summary, setSummary] = useState(null) + const [customer, setCustomer] = useState(null) + const [formItems, setFormItems] = useState(null) + + const result = useQuery({ queryKey:['customer-summary'], queryFn: async ()=>{ + + const summary = await axiosInstance.get(`customer/${params.id}/summary/`) + const customer = await axiosInstance.get(`customer/${params.id}/`) + const formItems = await axiosInstance.get(`customer/form-item/`) + + return { + summary: summary, + customer: customer, + formItems: formItems + } + + }, onSuccess: async (result)=>{ + + if(result.formItems.status==200){ + setFormItems(result.formItems.data) + } + + if(result.customer.status==200){ + setCustomer(result.customer.data) + } + + if(result.summary.status==200){ + setSummary(result.summary.data) + } + + },}) + + + if(result.isLoading) { + return ( +

درحال دریافت اطلاعات

+ ) + } + + if(result.isError) { +

خطا در دریافت اطلاعات

+ } + + return ( +
+ + + + +
+ +
+ +
+ +
+
+ +
+ + } > + + + + } > + + + + } > + + + + } > + + + + } > + + + + {/* } + } /> + } /> + } /> + } /> + } /> + */} + +
+ +
+
+ +
+
+ ) +} + +export default customerPageID \ No newline at end of file diff --git a/src/app/(index)/customers/[id]/interfaces.tsx b/src/app/(index)/customers/[id]/interfaces.tsx new file mode 100644 index 0000000..a8f0ae6 --- /dev/null +++ b/src/app/(index)/customers/[id]/interfaces.tsx @@ -0,0 +1,76 @@ + +export interface ISummary{ + customer_notes: [ + { + id: number, + created_at: string, + desc: string + } + ], + customer_leads: [ + { + id: number, + title: string, + created_at: string + }, + ] +} + + +export interface ICustomer{ + id: number, + created_at: string, + updated_at: string, + name_family: string, + mobile: number, + phone: number, + address: string + city: number, + shive_ashenaei: number, + responsible_group: number, + cuser_role: { + id: number, + customer_panel: boolean, + cuser: { + id: number, + mobile: number, + }, + }, + sys_ws: number +} + + +export interface IFormValues { + lead_types: [ + { + id: Number, + title: String + }, + ], + product_types: [ + { + id: Number, + name: String + }, + ], + lead_source: [ + { + id: Number, + title: String + }, + ], + lead_steps: [ + { + id: Number, + name: String + }, + ], + shahr: [ + { + id: Number, + name: String + is_ostan: boolean, + ostan: any + }, + ] +} \ No newline at end of file diff --git a/src/app/(index)/customers/[id]/layout.tsx b/src/app/(index)/customers/[id]/layout.tsx new file mode 100644 index 0000000..14f7292 --- /dev/null +++ b/src/app/(index)/customers/[id]/layout.tsx @@ -0,0 +1,98 @@ +'use client' + +import { useQuery } from "@tanstack/react-query" +import CustomerIDHeader from "../components/customer-id-header" +import CustomerInfo from "../components/customer-info" +import axiosInstance from "@/axios/axiosInstance" +import { useState } from "react" +import { ISummary, ICustomer, IFormValues } from "./interfaces" +import CustomerOnlinePanel from "../components/customer-online-panel" + +interface IFormItems { + shive_ashenaei: [ + { + id: number, + name: string + } + ], + shahr: [ + { + id: number, + name: string, + ostan: { + id: number + } | null, + is_ostan: boolean + }, + ], + responsible_groups: [ + { + id: number, + name: string + } + ] | null, +} + + +export default function RootLayout({ + children, + params, +}: { + children: React.ReactNode, + params: {id: number} +}) { + + const [customer, setCustomer] = useState(null) + const [formItems, setFormItems] = useState(null) + + const result = useQuery({ queryKey:['customer-info-data-x1'], queryFn: async ()=>{ + + const customer = await axiosInstance.get(`customer/${params.id}/`) + const formItems = await axiosInstance.get(`customer/form-item/`) + + return { + customer: customer, + formItems: formItems + } + + }, onSuccess: async (result)=>{ + + if(result?.formItems?.status==200){ + setFormItems(result.formItems.data) + } + + if(result?.customer?.status==200){ + console.log(result?.customer?.data) + setCustomer(result.customer.data) + } + + },}) + + if(result.isLoading) { + return (

درحال دریافت اطلاعات

) + } + + if(result.isError) { + return (

خطا در دریافت اطلاعات

) + } + + return ( +
+ +
+ +
+ + +
+ +
+ {children} +
+ + + +
+
+ ) +} diff --git a/src/app/(index)/customers/[id]/note/[note_id]/page.tsx b/src/app/(index)/customers/[id]/note/[note_id]/page.tsx new file mode 100644 index 0000000..4b72b8e --- /dev/null +++ b/src/app/(index)/customers/[id]/note/[note_id]/page.tsx @@ -0,0 +1,173 @@ +'use client' + +import { IoMdArrowRoundBack } from "react-icons/io"; +import Link from 'next/link' +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { Textarea } from "@/components/ui/textarea"; +import { Button } from "@/components/ui/button"; +import { useEffect, useRef, useState } from "react"; +import axiosInstance from "@/axios/axiosInstance"; +import { useRouter } from 'next/navigation' +import { useQuery } from "@tanstack/react-query"; +import moment from "moment-jalaali"; +import DatePicker from "react-multi-date-picker"; +import TimePicker from "react-multi-date-picker/plugins/time_picker"; +import { IoIosClose } from "react-icons/io"; +import { Switch } from "@/components/ui/switch" +import persian from "react-date-object/calendars/persian" +import persian_fa from "react-date-object/locales/persian_fa" +import "react-multi-date-picker/styles/layouts/mobile.css" +import { HiBellAlert } from "react-icons/hi2"; + +import { MdDelete } from "react-icons/md"; +import DateTimeButton from "@/app/(index)/components/ui/date-time-button"; + + + + +const customerNoteIDPage = ({params}:{params: {note_id: number, id: number} })=>{ + + const [note, setNote] = useState(null) + const [dateTime, setDateTime] = useState(null); + const [noteRDT , setNoteRDT] = useState(null); + const [noteRDesc , setNoteRDesc] = useState(null); + const [selectedDateTime, setSelectedDateTime] = useState(null) + const [enableDateTime, setEnableDateTime] = useState(false) + const noteDesc = useRef() + const router = useRouter() + + + useEffect(()=>{ + if(dateTime){ + console.log(moment(new Date(dateTime.unix * 1000)).format()) + } + }, [dateTime,]) + + + const result = useQuery({ queryKey:[`customer-note-${params.note_id}`], queryFn: async ()=>{ + return await axiosInstance.get(`customer/${params.id}/note/${params.note_id}/`) + }, onSuccess: async (result)=>{ + + if(result.status==200){ + + if(result?.data?.customer_note_reminder?.datetime){ + setEnableDateTime(true) + setDateTime(result.data.customer_note_reminder.datetime) + }else{ + setDateTime(null) + } + setNote(result.data) + } + + },}) + + + const dateTimeFn = async (datetimeV:any)=>{ + if(datetimeV?.unix){ + const datetimestr = moment(new Date(datetimeV.unix * 1000)).format(); + setNoteRDT(datetimestr); + } + } + + const onEditNote = async ()=>{ + + if(noteDesc?.current?.value){ + + const note_result = await axiosInstance.patch(`customer/${params.id}/note/${params.note_id}/edit/`, { + desc: noteDesc?.current?.value, + reminder_datetime: noteRDT, + reminder_desc: noteRDesc, + }) + + if(note_result?.status==201){ + alert("با موفقیت ویرایش شد") + }else{ + alert("خطا در ثبت") + } + + }else{ + alert("توضیحات نمیتواند خالی باشد") + } + + } + const onDelete = async ()=>{ + if(confirm("از حذف یادداشت مطمئن هستید؟")){ + const delete_result = await axiosInstance.delete(`customer/${params.id}/note/${params.note_id}/delete/`) + if (delete_result.status==200){ + router.push(`/customers/${params.id}/note/`) + }else{ + alert("خطا در حذف") + } + } + } + + + if(result.isLoading) { + return ( +
+

درحال دریافت اطلاعات

+
+ + ) + } + + if(result.isError) { +
+

خطا در دریافت اطلاعات

+
+ } + + return ( + + <> + +
+ +
+ مشاهده یادداشت +
+ +
+ + +
+ +
+ + + + + + +
+ + + +
+ +
+ +
+
+ + + + + + + + +
+ ویرایش +
+ + +
+ +
+ + ) +} + +export default customerNoteIDPage \ No newline at end of file diff --git a/src/app/(index)/customers/[id]/note/new/page.tsx b/src/app/(index)/customers/[id]/note/new/page.tsx new file mode 100644 index 0000000..9c800c9 --- /dev/null +++ b/src/app/(index)/customers/[id]/note/new/page.tsx @@ -0,0 +1,102 @@ +'use client' + +import { IoMdArrowRoundBack } from "react-icons/io"; +import Link from 'next/link' +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { Textarea } from "@/components/ui/textarea"; +import { Button } from "@/components/ui/button"; +import { useState } from "react"; +import axiosInstance from "@/axios/axiosInstance"; +import { useRouter } from 'next/navigation' +import DateTimeButton from "@/app/(index)/components/ui/date-time-button"; +import moment from "moment-jalaali"; + + + +const customerNoteAddPage = ({params}:{params: {id: number} })=>{ + + const [noteDesc, setNoteDesc] = useState(null); + const [noteRDT , setNoteRDT] = useState(null); + const [noteRDesc , setNoteRDesc] = useState(null); + const [dateTime, setDateTime] = useState(null); + + const dateTimeFn = async (datetimeV:any)=>{ + if(datetimeV?.unix){ + const datetimestr = moment(new Date(datetimeV.unix * 1000)).format(); + setNoteRDT(datetimestr); + } + } + + const router = useRouter() + + const onAddNote = async ()=>{ + + if(noteDesc){ + + const note_result = await axiosInstance.post(`customer/${params.id}/note/create/`, { + desc: noteDesc, + reminder_datetime: noteRDT, + reminder_desc: noteRDesc, + }) + + if(note_result?.status==201){ + alert("با موفقیت ثبت شد") + setTimeout(()=>{ + router.push(`/customers/${params.id}/note/`) + }, 100) + }else{ + alert("خطا در ثبت") + } + + }else{ + alert("توضیحات نمیتواند خالی باشد") + } + + } + return ( + + <> + +
+ +
+ یادداشت جدید +
+ +
+ + + + + +
+ + + +
+ +
+ +
+
+ + + + + + + +
+ ثبت +
+ + +
+ +
+ + ) +} + +export default customerNoteAddPage \ No newline at end of file diff --git a/src/app/(index)/customers/[id]/note/page.tsx b/src/app/(index)/customers/[id]/note/page.tsx new file mode 100644 index 0000000..ace27cc --- /dev/null +++ b/src/app/(index)/customers/[id]/note/page.tsx @@ -0,0 +1,101 @@ +'use client' + +import { IoMdArrowRoundBack } from "react-icons/io"; +import Link from 'next/link' +import { useQuery } from "@tanstack/react-query"; +import axiosInstance from "@/axios/axiosInstance"; +import { useState } from "react"; +import moment from "moment-jalaali"; + +interface ICustomerNotes { + id: number, + created_at: string, + updated_at: string + customer: number + desc: string +} + +const customerNotePage = ({params}:{params: {id: number} })=>{ + + const [customerNotes, setCustomerNotes] = useState(null) + + const result = useQuery({ queryKey:[`customer-${params.id}-notes`], queryFn: async ()=>{ + return await axiosInstance.get(`customer/${params.id}/note/list/`) + }, onSuccess: async (result)=>{ + + if(result.status==200){ + setCustomerNotes(result.data) + } + + },}) + + + if(result.isLoading) { + return ( +
+

درحال دریافت اطلاعات

+
+ + ) + } + + if(result.isError) { +
+

خطا در دریافت اطلاعات

+
+ } + + return ( + + <> + +
+ +
+ یادداشت ها +
+ +
+ + + یادداشت جدید + + + + + + +
+ + + +
+ +
+ +
+ {customerNotes?.map((item,key)=>{ + return ( + +
+ +
+ {item.desc} +
+ +
+ {moment(item.created_at).format('H:m jYYYY/jM/jD')} +
+ +
+ + ) + })} +
+ +
+ + ) +} + +export default customerNotePage \ No newline at end of file diff --git a/src/app/(index)/customers/[id]/page.tsx b/src/app/(index)/customers/[id]/page.tsx new file mode 100644 index 0000000..4f66ecd --- /dev/null +++ b/src/app/(index)/customers/[id]/page.tsx @@ -0,0 +1,119 @@ +'use client' + +import { Input } from "@/components/ui/input" +import CustomerHeader from "../components/customer-header" +import { Label } from "@/components/ui/label" +import { Textarea } from "@/components/ui/textarea" +import { FaRegEdit } from "react-icons/fa"; +import CustomerInfo from "../components/customer-info" +import { BiSolidNotepad } from "react-icons/bi"; +import { HiMiniSignal } from "react-icons/hi2"; +import { TbMessage2 } from "react-icons/tb"; +import { FaCartShopping } from "react-icons/fa6"; +import CustomerXBox from "../components/customer-x-box" +import { RiAlarmWarningFill } from "react-icons/ri"; +import { ISummary, ICustomer, IFormValues } from "./interfaces" +import { useState } from "react" +import { useQuery } from "@tanstack/react-query" +import axiosInstance from "@/axios/axiosInstance" +import CustomerXBoxLead from "../components/customer-x-box-lead" +import CustomerXBoxNote from "../components/customer-x-box-note" +import CustomerIDHeader from "../components/customer-id-header" + +interface IFormItems { + shive_ashenaei: [ + { + id: number, + name: string + } + ], + shahr: [ + { + id: number, + name: string, + ostan: { + id: number + } | null, + is_ostan: boolean + }, + ], + responsible_groups: [ + { + id: number, + name: string + } + ] | null, +} + +const customerPageID = ({params}:{params: {id: number} }) => { + + const [summary, setSummary] = useState(null) + + const result = useQuery({ queryKey:['customer-summary'], queryFn: async ()=>{ + const summary = await axiosInstance.get(`customer/${params.id}/summary/`) + return { summary: summary,} + + }, onSuccess: async (result)=>{ + + if(result.summary.status==200){ + setSummary(result.summary.data) + } + + },}) + + + if(result.isLoading) { + return ( +
+

درحال دریافت اطلاعات

+
+ + ) + } + + if(result.isError) { +
+

خطا در دریافت اطلاعات

+
+ } + + return ( +
+ +
+ + } > + + + + } > + + + + } > + + + + } > + + + + } > + + + + {/* } + } /> + } /> + } /> + } /> + } /> + */} + +
+ +
+ ) +} + +export default customerPageID \ No newline at end of file diff --git a/src/app/(index)/customers/components/customer-header.tsx b/src/app/(index)/customers/components/customer-header.tsx new file mode 100644 index 0000000..e384b61 --- /dev/null +++ b/src/app/(index)/customers/components/customer-header.tsx @@ -0,0 +1,97 @@ +'use client' +import Link from 'next/link' +import { FaFilter } from "react-icons/fa"; +import { IoIosClose } from "react-icons/io"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover" +import { useRef, useState } from 'react'; + +interface IProps { + setFilters: any, + refetch: any +} + +const CustomerHeader = (props:IProps)=>{ + + + const filter_type = useRef() + const filter_value = useRef() + + const [searchActive, setSearchActive] = useState(false) + + const resetSearch = async()=>{ + await props.setFilters( (prev:any)=> ({...prev, mobile: null, name_family: null }) ) + await props.refetch() + setSearchActive(false) + } + + + const search = async ()=>{ + + const f_type = await filter_type.current.value + const f_value = await filter_value.current.value + + if (f_type=='mobile') { + await props.setFilters( (prev:any)=> ({...prev, mobile: f_value, name_family: null }) ) + } + + if (f_type=='name_family') { + await props.setFilters( (prev:any)=> ({...prev, mobile: null, name_family: f_value }) ) + } + + await props.refetch() + + setSearchActive(true) + + } + + return ( +
+ +
+ مشتریان +
+ +
+ + + +
+ + + + +
+ + + + + + جستجو + +
+
+ +
+ +
+ +
+ +
+ + مشتری جدید +
+ +
+ ) +} + +export default CustomerHeader \ No newline at end of file diff --git a/src/app/(index)/customers/components/customer-id-header.tsx b/src/app/(index)/customers/components/customer-id-header.tsx new file mode 100644 index 0000000..eb24df6 --- /dev/null +++ b/src/app/(index)/customers/components/customer-id-header.tsx @@ -0,0 +1,39 @@ +'use client' +import Link from 'next/link' +import { FaFilter } from "react-icons/fa"; +import { IoIosClose } from "react-icons/io"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover" +import { useRef, useState } from 'react'; +import { IoMdArrowRoundBack } from "react-icons/io"; + + +interface IProps { +} + +const CustomerIDHeader = (props:IProps)=>{ + + return ( +
+ +
+ پرونده مشتری +
+ +
+ + + {/**/} + لیست همه مشتریان + + +
+ +
+ ) +} + +export default CustomerIDHeader \ No newline at end of file diff --git a/src/app/(index)/customers/components/customer-info.tsx b/src/app/(index)/customers/components/customer-info.tsx new file mode 100644 index 0000000..793886b --- /dev/null +++ b/src/app/(index)/customers/components/customer-info.tsx @@ -0,0 +1,297 @@ +'use client' + +import { Label } from "@/components/ui/label"; +import { Textarea } from "@/components/ui/textarea"; +import { FaRegEdit } from "react-icons/fa"; +import { IoClose } from "react-icons/io5"; +import { Input } from "@/components/ui/input"; +import { useEffect, useState } from "react"; +import { Button } from "@/components/ui/button"; +import { IFormValues } from "../[id]/interfaces"; +import { useForm, Controller, SubmitHandler } from "react-hook-form" +import axiosInstance from "@/axios/axiosInstance"; + + + +interface ICustomer{ + id: number, + created_at: string, + updated_at: string, + name_family: string, + mobile: number, + phone: number, + address: string + city: number, + shive_ashenaei: number, + responsible_group: number, + cuser_role: number, + sys_ws: number +} + +interface IFormItems { + shive_ashenaei: [ + { + id: number, + name: string + } + ], + shahr: [ + { + id: number, + name: string, + ostan: { + id: number + } | null, + is_ostan: boolean + }, + ], + responsible_groups: [ + { + id: number, + name: string + } + ] | null, +} + +interface IProps { + customer: ICustomer, + formItems: IFormItems +} + +interface IShahr { + id: Number, + name: String + is_ostan: boolean, + "ostan": any +} + +interface ICustomerForm { + name_family: string, + mobile: number, + phone: number, + address: string, + city: number, + ostan: number, + shive_ashenaei: number, + responsible_group: number, +} + +const CustomerInfo = (props: IProps)=>{ + const [edit, setEdit] = useState(false) + const [shahr, setShahr] = useState([]) + + const onEdit = ()=>{ + setEdit(true) + } + + const changeOstan = async (e:any)=>{ + const ostan_id = await e.target.value + const shahrha = await props?.formItems?.shahr + const shahr = await shahrha.filter((item, key)=>{ + if (item?.ostan?.id){ + return item.ostan.id == ostan_id + } + + }) + setShahr(shahr) + } + + const changeOstanByID = async (ostan_id1: number)=>{ + + const tmp_shahr:any = await props?.formItems?.shahr?.filter((item, key)=>{ + if (item?.ostan?.id){ + return item.ostan.id == ostan_id1 + } + + }) + setTimeout(()=>{ + setShahr(tmp_shahr) + }, 100) + } + + const { + register, + control, + handleSubmit, + watch, + setValue, + formState: { errors }, + } = useForm({ + shouldFocusError: false, + }) + + const onSubmit: SubmitHandler = async (data) => { + + try { + + + const result = await axiosInstance.patch(`/customer/update/${props.customer.id}/`, data) + + if(result.status == 200){ + setEdit(false) + setTimeout(()=>{ + alert("با موفقیت ویرایش شد") + }, 200) + + } else { + alert("خطا در ثبت") + } + + } catch (error) { + console.log(error) + } + + } + + useEffect(()=>{ + + setValue('name_family', props.customer?.name_family) + setValue('mobile', props.customer?.mobile) + setValue('phone', props.customer?.phone) + setValue('address', props.customer?.address) + setValue('shive_ashenaei', props.customer?.shive_ashenaei) + setValue('responsible_group', props.customer?.responsible_group) + + const ostan_shahr = props?.formItems?.shahr?.filter((item, key)=>{ + if (item.id == props.customer?.city){ + + if(item.ostan?.id){ + + setValue('ostan', item.ostan.id) + changeOstanByID(item.ostan.id) + + setTimeout(()=>{ + console.log(props.customer?.city) + setValue('city', props.customer?.city) + }, 150) + + } + + + } + + }) + + }, [props?.customer]) + + return ( +
+ +
+
اطلاعات مشتری
+ +
setEdit(!edit)} className=""> + + {edit ? : } + +
+
+ +
+ + +
+ + +
+ +
+
+ + +
+ +
+ + +
+
+ + +
+ +
+ + + + +
+ +
+ + + + + +
+
+ +
+ + +
+ + + + + +
+ +
+ + + + + +
+ +
+ +
+ + +
+ + {edit ? : null} + {edit ? : null} + + +
+ +
+ ) +} + +export default CustomerInfo \ No newline at end of file diff --git a/src/app/(index)/customers/components/customer-new-header.tsx b/src/app/(index)/customers/components/customer-new-header.tsx new file mode 100644 index 0000000..6043c15 --- /dev/null +++ b/src/app/(index)/customers/components/customer-new-header.tsx @@ -0,0 +1,27 @@ +import Link from 'next/link' +import { IoMdArrowRoundBack } from "react-icons/io"; + + +const CustomerNewHeader = ()=>{ + return ( + +
+ +
+ + ایجاد مشتری جدید + +
+ +
+ + + +
+ +
+ + ) +} + +export default CustomerNewHeader \ No newline at end of file diff --git a/src/app/(index)/customers/components/customer-online-panel.tsx b/src/app/(index)/customers/components/customer-online-panel.tsx new file mode 100644 index 0000000..71b139a --- /dev/null +++ b/src/app/(index)/customers/components/customer-online-panel.tsx @@ -0,0 +1,187 @@ +'use client' + +import { Label } from "@/components/ui/label"; +import { Textarea } from "@/components/ui/textarea"; +import { FaRegEdit } from "react-icons/fa"; +import { IoClose } from "react-icons/io5"; +import { Input } from "@/components/ui/input"; +import { useEffect, useState } from "react"; +import { Button } from "@/components/ui/button"; +import { IFormValues } from "../[id]/interfaces"; +import { useForm, Controller, SubmitHandler } from "react-hook-form" +import axiosInstance from "@/axios/axiosInstance"; + + + +interface ICustomer{ + id: number, + created_at: string, + updated_at: string, + name_family: string, + mobile: number, + phone: number, + address: string + city: number, + shive_ashenaei: number, + responsible_group: number, + cuser_role: { + id: number, + customer_panel: boolean, + cuser: { + id: number, + mobile: number, + }, + }, + sys_ws: number +} + +interface IFormItems { + shive_ashenaei: [ + { + id: number, + name: string + } + ], + shahr: [ + { + id: number, + name: string, + ostan: { + id: number + } | null, + is_ostan: boolean + }, + ], + responsible_groups: [ + { + id: number, + name: string + } + ] | null, +} + +interface IProps { + customer: ICustomer, + formItems: IFormItems +} + +interface IShahr { + id: Number, + name: String + is_ostan: boolean, + "ostan": any +} + +interface IForm { + status: boolean +} + +const CustomerOnlinePanel = (props: IProps)=>{ + const [edit, setEdit] = useState(false) + const [shahr, setShahr] = useState([]) + + const onEdit = ()=>{ + setEdit(true) + } + + const { + register, + control, + handleSubmit, + watch, + setValue, + formState: { errors }, + } = useForm({ + shouldFocusError: false, + }) + + const onSubmit: SubmitHandler = async (data) => { + + try { + + + const result = await axiosInstance.post(`/customer/customer-panel/`, { + customer_id: props.customer.id, + mobile: props.customer.mobile, + status: data.status + }) + + if(result.status == 200){ + setEdit(false) + setTimeout(()=>{ + alert("با موفقیت ثبت شد") + }, 200) + } else { + alert("خطا در ثبت") + } + + } catch (error) { + console.log(error) + } + + } + + useEffect(()=>{ + + if(props.customer?.cuser_role?.customer_panel){ + setValue('status', props.customer?.cuser_role?.customer_panel) + }else{ + setValue('status', false) + } + + + }, [props?.customer]) + + return ( +
+ +
+
پنل مشتریان
+ +
setEdit(!edit)} className=""> + + {edit ? : } + +
+
+ +
+ + +
+ + +
+ + + + + +
+ {props?.customer?.cuser_role?.cuser?.mobile ? ( +
+

نام کاربری (موبایل): {props?.customer?.cuser_role?.cuser?.mobile}

+
+ ): null} + + +
+ + {edit ? : null} + {edit ? : null} + + +
+ +
+ ) +} + +export default CustomerOnlinePanel \ No newline at end of file diff --git a/src/app/(index)/customers/components/customer-pagination.tsx b/src/app/(index)/customers/components/customer-pagination.tsx new file mode 100644 index 0000000..09b82c2 --- /dev/null +++ b/src/app/(index)/customers/components/customer-pagination.tsx @@ -0,0 +1,45 @@ +interface IProps { + setPage: any, + page: number, + links: { + next: string | null, + next_page: number | null, + previous: string | null, + previous_page: number | null + } | null + refetch: any +} + +const CustomerPagination = (props: IProps)=>{ + + const changePage = async (page:number|null)=>{ + if(page){ + await props.setPage(page) + await props.refetch() + }else{ + await props.setPage(1) + await props.refetch() + } + } + + return ( +
+
+ + + + { props.links?.previous_page ? ( {changePage(props.links.previous_page)}} className="bg-blue-700 rounded-md p-2 text-white">صفحه قبل ) : null } + + { props.links?.next_page ? ( {changePage(props.links.next_page)}} className="bg-blue-700 rounded-md p-2 text-white">صفحه بعد ) : null } + +
+ +

+ {props.page ? ( `صفحه: ${props.page}` ) : null} + +

+
+ ) +} + +export default CustomerPagination \ No newline at end of file diff --git a/src/app/(index)/customers/components/customer-x-box-lead.tsx b/src/app/(index)/customers/components/customer-x-box-lead.tsx new file mode 100644 index 0000000..ad4cfd5 --- /dev/null +++ b/src/app/(index)/customers/components/customer-x-box-lead.tsx @@ -0,0 +1,37 @@ +'use client' +import Link from 'next/link' +import moment from "moment-jalaali"; + +interface IProps { + leads: [{ + id: number, + title: string, + created_at: string + }] | undefined +} + +const CustomerXBoxLead = (props: IProps)=>{ + return ( + <> + {props.leads?.map((item, key)=>{ + return ( + +
+ +
+ {item.title} +
+ +
+ {moment(item.created_at).format('H:m jYYYY/jM/jD')} +
+ +
+ + ) + })} + + ) +} + +export default CustomerXBoxLead \ No newline at end of file diff --git a/src/app/(index)/customers/components/customer-x-box-note.tsx b/src/app/(index)/customers/components/customer-x-box-note.tsx new file mode 100644 index 0000000..bf0848e --- /dev/null +++ b/src/app/(index)/customers/components/customer-x-box-note.tsx @@ -0,0 +1,41 @@ +'use client' + +import Link from 'next/link' +import moment from "moment-jalaali"; + + +interface IProps { + customer_id: number, + notes: [{ + id: number, + created_at: string, + desc: string + }] | undefined +} + +const CustomerXBoxNote = (props: IProps)=>{ + return ( + <> + {props.notes?.map((item, key)=>{ + return ( +
+ + +
+ {item.desc} +
+ + +
+ {moment(item.created_at).format('H:m jYYYY/jM/jD')} +
+ + +
+ ) + })} + + ) +} + +export default CustomerXBoxNote \ No newline at end of file diff --git a/src/app/(index)/customers/components/customer-x-box.tsx b/src/app/(index)/customers/components/customer-x-box.tsx new file mode 100644 index 0000000..0979ad3 --- /dev/null +++ b/src/app/(index)/customers/components/customer-x-box.tsx @@ -0,0 +1,73 @@ +'use client' + +import { FaCartShopping } from "react-icons/fa6"; +import { array } from "zod"; +import { IoAddOutline } from "react-icons/io5"; +import { IoIosMore } from "react-icons/io"; +import Link from "next/link"; +import { ICustomer } from "../interfaces"; + +interface IProps { + children: React.ReactNode + icon: any, + title: string, + new_link: string | null, + more_link: string | null, +} +const CustomerXBox = (props:IProps)=>{ + return ( +
+ +
+ + {props.icon} + {props.title} + +
+ + + {props.children} + + {/*props.notes?.map((item, key)=>{ + return ( +
+ +
+ {item.desc} +
+ +
+ 1402/10/20 18:30 +
+ +
+ ) + })*/} + +
+ + {props.new_link ? ( + +
+ +
+ + ) : null} + + + {props.new_link? ( + +
+ +
+ + ) : null} + + +
+ +
+ ) +} + +export default CustomerXBox \ No newline at end of file diff --git a/src/app/(index)/customers/interfaces.tsx b/src/app/(index)/customers/interfaces.tsx new file mode 100644 index 0000000..c5d3f24 --- /dev/null +++ b/src/app/(index)/customers/interfaces.tsx @@ -0,0 +1,38 @@ +export interface ICustomer { + links: { + next: string | null, + next_page: number | null, + previous: string | null, + previous_page: number | null + }, + count: number, + results: [ + { + id: number, + city: { + id: number, + name: string, + ostan: { + id: number, + name: string + } + }, + shive_ashenaei: { + id: number, + name: string + } | null, + responsible_group: { + id: number, + name: string + } | null, + created_at: string, + updated_at: string, + name_family: string, + mobile: number, + phone: number | null, + address: string | null, + cuser_role: number | null, + sys_ws: number + }, + ] +} \ No newline at end of file diff --git a/src/app/(index)/customers/new/page.tsx b/src/app/(index)/customers/new/page.tsx new file mode 100644 index 0000000..9acb9d1 --- /dev/null +++ b/src/app/(index)/customers/new/page.tsx @@ -0,0 +1,232 @@ +'use client' + +import { Input } from "@/components/ui/input" +import CustomerNewHeader from "../components/customer-new-header" +import { Label } from "@/components/ui/label" +import { Textarea } from "@/components/ui/textarea" +import { useQuery } from "@tanstack/react-query" +import { useState } from "react" +import axiosInstance from "@/axios/axiosInstance" +import { Button } from "@/components/ui/button" +import { useForm, Controller, SubmitHandler } from "react-hook-form" +import { useRouter } from 'next/navigation' +import { AlertCircle } from "lucide-react" + +import { + Alert, + AlertDescription, + AlertTitle, +} from "@/components/ui/alert" + +interface IFormItems { + shive_ashenaei: [ + { + id: number, + name: string + } + ], + shahr: [ + { + id: number, + name: string, + ostan: { + id: number + } | null, + is_ostan: boolean + }, + ], + responsible_groups: [ + { + id: number, + name: string + } + ] | null, +} + +interface IShahr { + id: number, + name: string, + ostan: { + id: number + } | null, + is_ostan: boolean +} + +interface ICustomerForm { + name_family: string, + mobile: number + phone: number + address: string + city: number + shive_ashenaei: number + responsible_group: number +} + +const newCustomerPage = ()=>{ + + const [formItems, setFormItems] = useState(null) + const [shahr, setShahr] = useState(null) + const router = useRouter() + + const { + register, + control, + handleSubmit, + watch, + formState: { errors }, + } = useForm({ + shouldFocusError: false, + }) + + const onSubmit: SubmitHandler = async (data) => { + + try { + const result = await axiosInstance.post('/customer/v2/create/', data) + + if(result.status == 201){ + router.push('/customers/') + } else { + alert("خطا در ثبت") + } + + } catch (error) { + console.log(error) + } + + } + + const changeOstan = async (e:any)=>{ + + const tmp_shahr = await formItems?.shahr.filter((item, key)=>{ + return item.ostan?.id == e.target.value + }) + + setShahr(tmp_shahr) + + } + + const result = useQuery({ queryKey:['customer-form-item'], queryFn: async ()=>{ + return await axiosInstance.get(`customer/form-item/`) + },onSuccess: async (result)=>{ + if(result.status==200){ + setFormItems(result.data) + } + },}) + + + if(result.isLoading) { + return ( +

درحال دریافت اطلاعات

+ ) + } + + if(result.isError) { +

خطا در دریافت اطلاعات

+ } + + return ( + +
+ + + +
+
+ +
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ + +
+ +
+ +
+ +
+ + { Object.keys(errors).length ? ( + + + + خطا + + {Object.keys(errors).map((item, key)=>{ + return

{errors[item]?.message}

+ })} +
+
+ + ) : null} +
+
+ +
+ ) +} + +export default newCustomerPage \ No newline at end of file diff --git a/src/app/(index)/customers/page.tsx b/src/app/(index)/customers/page.tsx new file mode 100644 index 0000000..79b2168 --- /dev/null +++ b/src/app/(index)/customers/page.tsx @@ -0,0 +1,132 @@ +'use client' + +import { useState } from "react" +import { + Table, + TableBody, + TableCaption, + TableCell, + TableHead, + TableHeader, + TableRow, + } from "@/components/ui/table" +import { BiSolidShow, } from "react-icons/bi"; +import Link from 'next/link' +import moment from "moment-jalaali"; +import CustomerHeader from "./components/customer-header"; +import { ICustomer } from './interfaces' +import { useQuery } from "@tanstack/react-query"; +import axiosInstance from "@/axios/axiosInstance"; +import { useQueryClient } from '@tanstack/react-query'; +import CustomerPagination from "./components/customer-pagination"; + + +const customersPage = ()=>{ + const [cnt,setCnt] = useState([...Array(10)]) + + const [customers, setCustomers] = useState(null) + const [page, setPage] = useState(null) + const queryClient = useQueryClient() + + const [filters, setFilters] = useState({ + name_family: null, + mobile: null + }) + + const customerFetch = useQuery({queryKey:['customers-x1',], queryFn: async ()=>{ + return await axiosInstance.get('customer/v2/list/',{ + params: { + 'name_family__contains': filters.name_family, + 'mobile__contains': filters.mobile, + 'page': page + } + }) + }, onSuccess:(result)=>{ + if(result.status == 200){ + setCustomers(result.data); + } + }}) + + if(customerFetch.isLoading) { + return ( +

درحال دریافت اطلاعات

+ ) + } + + if(customerFetch.isError) { +

خطا در دریافت اطلاعات

+ } + + return ( +
+ + + +
+ + لیست مشتریان + + + + شماره + نام مشتری + استان + شهر + تلفن همراه اصلی + تلفن ثابت + شیوه آشنایی + مشاهده + + + + + + {customers?.results.map((item, key)=>{ + return ( + + + {key+1} + + {item.name_family} + + + {item.city.ostan.name} + + + {item.city.name} + + + {item.mobile} + + + {item.phone} + + + {item.shive_ashenaei?.name} + + + + + + + + + + ) + }) } + + + + +
+ + +
+ + + +
+ ) +} + +export default customersPage \ No newline at end of file diff --git a/src/app/(index)/fonts/woff/IRANSansX-Bold.woff b/src/app/(index)/fonts/woff/IRANSansX-Bold.woff new file mode 100644 index 0000000..6dacc61 Binary files /dev/null and b/src/app/(index)/fonts/woff/IRANSansX-Bold.woff differ diff --git a/src/app/(index)/fonts/woff/IRANSansX-Regular.woff b/src/app/(index)/fonts/woff/IRANSansX-Regular.woff new file mode 100644 index 0000000..51780b3 Binary files /dev/null and b/src/app/(index)/fonts/woff/IRANSansX-Regular.woff differ diff --git a/src/app/(index)/fonts/woff2/IRANSansX-Bold.woff2 b/src/app/(index)/fonts/woff2/IRANSansX-Bold.woff2 new file mode 100644 index 0000000..4d1fcc3 Binary files /dev/null and b/src/app/(index)/fonts/woff2/IRANSansX-Bold.woff2 differ diff --git a/src/app/(index)/fonts/woff2/IRANSansX-Regular.woff2 b/src/app/(index)/fonts/woff2/IRANSansX-Regular.woff2 new file mode 100644 index 0000000..fae3f74 Binary files /dev/null and b/src/app/(index)/fonts/woff2/IRANSansX-Regular.woff2 differ diff --git a/src/app/(index)/layout.tsx b/src/app/(index)/layout.tsx new file mode 100644 index 0000000..9e4cb0f --- /dev/null +++ b/src/app/(index)/layout.tsx @@ -0,0 +1,51 @@ +import type { Metadata } from 'next' +import localFont from 'next/font/local' +import SideRight from "./components/side-right"; +import NavTop from "./components/nav-top"; + +import '../globals.css' +import ReactQueryProvider from '@/react_query/provider'; +import { Toaster } from "@/components/ui/sonner" + +export const metadata: Metadata = { + title: 'Loolegostar', + description: 'Generated by MJF', +} + +const myFont = localFont({ + src: './fonts/woff2/IRANSansX-Regular.woff2', + display: 'swap', +}) + +export default function RootLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + + + + + + + +
+ + + +
+
+ {children} + +
+ +
+ +
+
+ + + + ) +} diff --git a/src/app/(index)/leads/[id]/interfaces.tsx b/src/app/(index)/leads/[id]/interfaces.tsx new file mode 100644 index 0000000..bd81009 --- /dev/null +++ b/src/app/(index)/leads/[id]/interfaces.tsx @@ -0,0 +1,50 @@ +export interface ILead { + id: number, + customer: { + id: number, + name_family: string + }, + product_type: { + id: number, + name: string + }, + lead_reminder: { + id: number + created_at: string, + datetime: string, + desc: string | null, + }, + type: { + id: number, + title: string + }, + source: { + id: number, + title: string + }, + step: { + id: number, + name: string + }, + city: { + id: number, + name: string + ostan: { + id: number, + name: string + } + }, + created_at: string, + updated_at: string, + title: string, + desc: string, + status: any, + reason: any, + lead_comment: [{ + id: number, + desc: string + created_at: string + }], + cuser_role: number, + sys_ws: number +} \ No newline at end of file diff --git a/src/app/(index)/leads/[id]/page.tsx b/src/app/(index)/leads/[id]/page.tsx new file mode 100644 index 0000000..41c5eef --- /dev/null +++ b/src/app/(index)/leads/[id]/page.tsx @@ -0,0 +1,468 @@ +'use client' +import Link from 'next/link' +import { Input } from "@/components/ui/input" +import { Textarea } from "@/components/ui/textarea" +import { Label } from "@/components/ui/label" +import { useEffect, useState } from 'react' +import { Button } from '@/components/ui/button' +import LSearchCustomers from '../components/l-search-customers' +import axiosInstance from '@/axios/axiosInstance' +import { useQuery, useQueryClient } from '@tanstack/react-query' +import * as z from "zod" +import { useRouter } from 'next/navigation' +import { IoMdArrowRoundBack } from "react-icons/io"; +import { AlertCircle } from "lucide-react" +import { + Alert, + AlertDescription, + AlertTitle, +} from "@/components/ui/alert" +import { ILead } from './interfaces' +import { toast } from "sonner" +import { FaFaceGrinStars, FaFaceMeh, FaFaceFrown, FaFaceSmile } from "react-icons/fa6"; +import { TbTargetArrow } from "react-icons/tb"; +import { HiBellAlert } from "react-icons/hi2"; +import { useForm, Controller, SubmitHandler } from "react-hook-form" +import LeadComment from '../components/lead-comment' +import LeadCommentAdd from '../components/lead-comment-add' +import RemainderModal from '../../components/ui/reminder-modal' + + + + +interface IFormValues { + lead_types: [ + { + id: Number, + title: String + }, + ], + product_types: [ + { + id: Number, + name: String + }, + ], + lead_source: [ + { + id: Number, + title: String + }, + ], + lead_steps: [ + { + id: Number, + name: String + }, + ], + shahr: [ + { + id: Number, + name: String + is_ostan: boolean, + "ostan": any + }, + ] +} + +interface IShahr { + id: Number, + name: String + is_ostan: boolean, + "ostan": any +} + +interface IFormNewLead { + title: string, + customer_id: number, + desc: string, + product_type_id: number , + lead_type_id: number, + lead_source_id: number, + ostan: number, + city_id: number, + lead_step_id: number, +} + +const formSchema = z.object({ + title: z.string().min(5, { + message: "Username must be at least 2 characters.", + }), +}) + +const LeadIdPage = ({params}:{params: {id: number} })=>{ + + const [remainderModalHidden, setRemainderModalHidden] = useState(true) + const [cSearchOpen, setCSearchOpen] = useState(false) + const [statusButtonState, setStatusButtonState] = useState<{su:boolean, fa:boolean, un: boolean}>({su:false, fa:false, un: false}) + const [customerName, setCustomerName] = useState() + const [formValues, setFormValues] = useState(null) + const [shahr, setShahr] = useState([]) + const [leadForm, setLeadForm] = useState(null) + const [submitButtonEnable, setSubmitButtonEnable] = useState(true) + const [lead, setLead] = useState(null) + const router = useRouter() + + useEffect(()=>{ + + setValue('title', lead?.title) + setValue('customer_id', lead?.customer.id) + setCustomerName(lead?.customer.name_family) + setValue('desc', lead?.desc) + setValue('product_type_id', lead?.product_type.id) + setValue('lead_type_id', lead?.type.id) + setValue('lead_source_id', lead?.source.id) + setValue('ostan', lead?.city.ostan.id) + setValue('lead_step_id', lead?.step.id) + + changeOstanById(lead?.city.ostan.id, lead?.city.id) + + + }, [lead, ]) + + + const { + register, + control, + handleSubmit, + watch, + setValue, + formState: { errors }, + } = useForm({ + shouldFocusError: false, + }) + + const onSubmit: SubmitHandler = async (data) => { + + await setSubmitButtonEnable(false) + + try { + const result = await axiosInstance.patch(`lead/${lead?.id}/edit/`, data) + + if(result.status == 201){ + setSubmitButtonEnable(true) + queryClient.invalidateQueries({ queryKey: ['form-items-and-lead'] }) + + toast("ویرایش شد", { + description: "سرنخ با موفقیت ویرایش شد", + action: { + label: "بستن", + onClick: () => console.log("Undo"), + }, + }) + + } else { + alert("خطا در ثبت") + } + + } catch (error) { + console.log(error) + } + + } + + const onChangeStatus = async (status:string)=>{ + const editStatusRs = await axiosInstance.patch(`lead/${lead?.id}/edit-status/`, { + status: status + }) + + if(editStatusRs.status=201){ + queryClient.invalidateQueries({ queryKey: ['form-items-and-lead'] }); + setTimeout(()=>{ + alert("تغییر وضعیت سرنخ انجام شد"); + }, 400) + } + + } + + const changeOstanById = async (ostan_id:any, city_id:any)=>{ + + const shahrha = await formValues?.shahr + + if(shahrha){ + + const shahrF = await shahrha.filter((item, key)=>{ + return item.ostan == ostan_id + }) + + setShahr(shahrF) + + setTimeout(()=>{ setValue('city_id', city_id) }, 500) + + + + } + + + } + + const changeOstan = async (e:any)=>{ + const ostan_id = await e.target.value + const shahrha = await formValues?.shahr + const shahr = await shahrha.filter((item, key)=>{ + return item.ostan == ostan_id + }) + setShahr(shahr) + + setLeadForm((prevLeadForm)=>({ + ...prevLeadForm!, + ostan: ostan_id + })); + + console.log(leadForm) + } + + const queryClient = useQueryClient() + + const result = useQuery({ queryKey:['form-items-and-lead'], queryFn: async ()=>{ + + const leadData = await axiosInstance.get(`lead/${params.id}/`) + const formData = await axiosInstance.get('lead/form-items/') + + return { + leadData: leadData, + formData: formData + } + + },onSuccess: async (result)=>{ + await setFormValues(result.formData.data) + await setLead(result.leadData.data) + },}) + + if (result.isLoading){ + return (

+ درحال دریافت اطلاعات... +

) + } + + + return ( +
+ +
+ +
+ + وضعیت سرنخ: + + + {lead?.status == 'SU' ? : null} + {lead?.status == 'FA' ? : null} + {lead?.status == 'UN' || null ? : null} + +
+ +
+
+ +
{onChangeStatus('SU')}} className='' onMouseLeave={()=>{ setStatusButtonState( (prev) => ({...prev, su:false}) ) }} onMouseOver={()=>{ setStatusButtonState( (prev) => ({...prev, su:true}) ) }}> + +
+ +
{onChangeStatus("FA")}} className='' onMouseLeave={()=>{ setStatusButtonState( (prev) => ({...prev, fa:false}) ) }} onMouseOver={()=>{ setStatusButtonState( (prev) => ({...prev, fa:true}) ) }}> + +
+ +
{onChangeStatus("UN")}} className='' onMouseLeave={()=>{ setStatusButtonState( (prev) => ({...prev, un:false}) ) }} onMouseOver={()=>{ setStatusButtonState( (prev) => ({...prev, un:true}) ) }}> + +
+ + +
+ +
+ +
+ +
{setRemainderModalHidden(false)}} className='bg-gray-100 border pr-3 pl-3 pt-2 pb-2 rounded-md text-white'> + +
+ + +
+ + +
{router.back()}} className="bg-gray-100 border pr-3 pl-3 pt-2 pb-2 rounded-md text-white"> + +
+
+ +
+ +
+ + +
+ +
+ +
+ + +
+ +
+ + + + ( + <> + setCSearchOpen(!cSearchOpen)} + ref={ref} + > + {customerName ? customerName : 'برای انتخاب مشتری کلیک کنید'} + + +
+ +
+ + + )} + /> + +
+ +
+ + + +
+ +
+
+ + + ) +} + +export default LeadCommentAdd \ No newline at end of file diff --git a/src/app/(index)/leads/components/lead-comment.tsx b/src/app/(index)/leads/components/lead-comment.tsx new file mode 100644 index 0000000..8f9ef83 --- /dev/null +++ b/src/app/(index)/leads/components/lead-comment.tsx @@ -0,0 +1,89 @@ +'use client' + +import axiosInstance from "@/axios/axiosInstance"; +import { Textarea } from "@/components/ui/textarea" +import { useQueryClient } from "@tanstack/react-query"; +import { useEffect, useRef, useState } from "react"; +import { BiSolidMessageSquareEdit } from "react-icons/bi"; +import { MdDelete } from "react-icons/md"; +import { toast } from "sonner" +import moment from "moment-jalaali"; + +interface Iprops { + data: any, +} + +const LeadComment = (props: Iprops)=>{ + + const queryClient = useQueryClient() + const commentRef = useRef() + + const editComment = async ()=>{ + + if(confirm('از ویرایش مطمئن هستید؟')){ + + const editResult = await axiosInstance.patch(`lead/comment/${props.data.id}/edit/`, { + desc: commentRef.current.value + }) + + if(editResult.status==200){ + + queryClient.invalidateQueries({ queryKey: ['form-items-and-lead'] }) + + toast("ویرایش شد", { + description: "کامنت با موفقیت ویرایش شد", + action: { + label: "بستن", + onClick: () => console.log("Undo"), + }, + }) + + } + + } + } + + const deleteComment = async ()=>{ + + if(confirm('از حذف مطمئن هستید؟')){ + + const deleteResult = await axiosInstance.delete(`lead/comment/${props.data.id}/delete/`) + + if(deleteResult.status==200){ + + queryClient.invalidateQueries({ queryKey: ['form-items-and-lead', ] }) + + } + + } + } + + return ( +
+ + + + +
+
+ +
+ {moment(props.data.created_at).format('H:m jYYYY/jM/jD')} +
+ +
+ +
+ +
+ +
+ + +
+
+
+ ) +} + +export default LeadComment \ No newline at end of file diff --git a/src/app/(index)/leads/new/page.tsx b/src/app/(index)/leads/new/page.tsx new file mode 100644 index 0000000..5286a9b --- /dev/null +++ b/src/app/(index)/leads/new/page.tsx @@ -0,0 +1,325 @@ +'use client' +import Link from 'next/link' +import { Input } from "@/components/ui/input" +import { Textarea } from "@/components/ui/textarea" +import { Label } from "@/components/ui/label" +import { useState } from 'react' +import { Button } from '@/components/ui/button' +import LSearchCustomers from '../components/l-search-customers' +import axiosInstance from '@/axios/axiosInstance' +import { useQuery, useQueryClient } from '@tanstack/react-query' +import * as z from "zod" +import { useRouter } from 'next/navigation' + +import { AlertCircle } from "lucide-react" + +import { + Alert, + AlertDescription, + AlertTitle, +} from "@/components/ui/alert" + +import { useForm, Controller, SubmitHandler } from "react-hook-form" + +interface IFormValues { + lead_types: [ + { + id: Number, + title: String + }, + ], + product_types: [ + { + id: Number, + name: String + }, + ], + lead_source: [ + { + id: Number, + title: String + }, + ], + lead_steps: [ + { + id: Number, + name: String + }, + ], + shahr: [ + { + id: Number, + name: String + is_ostan: boolean, + "ostan": any + }, + ] +} + +interface IShahr { + id: Number, + name: String + is_ostan: boolean, + "ostan": any +} + +interface IFormNewLead { + title: string, + customer_id: number, + desc: string, + product_type_id: number , + lead_type_id: number, + lead_source_id: number, + ostan: number, + city_id: number, + lead_step_id: number, +} + +const formSchema = z.object({ + title: z.string().min(5, { + message: "Username must be at least 2 characters.", + }), +}) + +const newLead = ()=>{ + + const [cSearchOpen, setCSearchOpen] = useState(false) + const [customerName, setCustomerName] = useState() + const [formValues, setFormValues] = useState(null) + const [shahr, setShahr] = useState([]) + const [leadForm, setLeadForm] = useState(null) + const [submitButtonEnable, setSubmitButtonEnable] = useState(true) + + const router = useRouter() + + + const { + register, + control, + handleSubmit, + watch, + formState: { errors }, + } = useForm({ + shouldFocusError: false, + }) + + const onSubmit: SubmitHandler = async (data) => { + + await setSubmitButtonEnable(false) + + try { + const result = await axiosInstance.post('/lead/new/', data) + + if(result.status == 201){ + router.push('/leads/') + } else { + alert("خطا در ثبت") + } + + } catch (error) { + console.log(error) + } + + } + + + const changeOstan = async (e:any)=>{ + const ostan_id = await e.target.value + const shahrha = await formValues?.shahr + const shahr = await shahrha.filter((item, key)=>{ + return item.ostan == ostan_id + }) + setShahr(shahr) + + setLeadForm((prevLeadForm)=>({ + ...prevLeadForm!, + ostan: ostan_id + })); + + console.log(leadForm) + } + + const queryClient = useQueryClient() + + const result = useQuery({ queryKey:['form-items'], queryFn: async ()=>{ + return await axiosInstance.get('lead/form-items/') + + },onSuccess:(result)=>{ + setFormValues(result.data) + },}) + + if (result.isLoading){ + return (

+ درحال دریافت اطلاعات... +

) + } + + + return ( +
+ +
+ + ثبت سرنخ جدید + +
+ مشاهده همه سرنخ ها +
+ +
+ + +
+ + + +
+ + +
+ +
+ + + + ( + <> + setCSearchOpen(!cSearchOpen)} + ref={ref} + > + {customerName ? customerName : 'برای انتخاب مشتری کلیک کنید'} + + +
+ +
+ + + )} + /> + +
+ +
+ +