Compare commits
No commits in common. 'main' and 'TabBarDesign' have entirely different histories.
main
...
TabBarDesi
23 changed files with 5709 additions and 1 deletions
@ -0,0 +1,18 @@ |
||||
module.exports = { |
||||
root: true, |
||||
env: { browser: true, es2020: true }, |
||||
extends: [ |
||||
'eslint:recommended', |
||||
'plugin:@typescript-eslint/recommended', |
||||
'plugin:react-hooks/recommended', |
||||
], |
||||
ignorePatterns: ['dist', '.eslintrc.cjs'], |
||||
parser: '@typescript-eslint/parser', |
||||
plugins: ['react-refresh'], |
||||
rules: { |
||||
'react-refresh/only-export-components': [ |
||||
'warn', |
||||
{ allowConstantExport: true }, |
||||
], |
||||
}, |
||||
} |
@ -0,0 +1,24 @@ |
||||
# Logs |
||||
logs |
||||
*.log |
||||
npm-debug.log* |
||||
yarn-debug.log* |
||||
yarn-error.log* |
||||
pnpm-debug.log* |
||||
lerna-debug.log* |
||||
|
||||
node_modules |
||||
dist |
||||
dist-ssr |
||||
*.local |
||||
|
||||
# Editor directories and files |
||||
.vscode/* |
||||
!.vscode/extensions.json |
||||
.idea |
||||
.DS_Store |
||||
*.suo |
||||
*.ntvs* |
||||
*.njsproj |
||||
*.sln |
||||
*.sw? |
@ -1,2 +1,30 @@ |
||||
# TabBar_Project |
||||
# React + TypeScript + Vite |
||||
|
||||
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. |
||||
|
||||
Currently, two official plugins are available: |
||||
|
||||
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh |
||||
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh |
||||
|
||||
## Expanding the ESLint configuration |
||||
|
||||
If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: |
||||
|
||||
- Configure the top-level `parserOptions` property like this: |
||||
|
||||
```js |
||||
export default { |
||||
// other rules... |
||||
parserOptions: { |
||||
ecmaVersion: 'latest', |
||||
sourceType: 'module', |
||||
project: ['./tsconfig.json', './tsconfig.node.json'], |
||||
tsconfigRootDir: __dirname, |
||||
}, |
||||
} |
||||
``` |
||||
|
||||
- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` |
||||
- Optionally add `plugin:@typescript-eslint/stylistic-type-checked` |
||||
- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list |
||||
|
@ -0,0 +1,12 @@ |
||||
<!doctype html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta charset="UTF-8" /> |
||||
<link rel="icon" type="image/svg+xml" href="/vite.svg" /> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
||||
</head> |
||||
<body> |
||||
<div id="root"></div> |
||||
<script type="module" src="/src/main.tsx"></script> |
||||
</body> |
||||
</html> |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,33 @@ |
||||
{ |
||||
"name": "my-react-app", |
||||
"private": true, |
||||
"version": "0.0.0", |
||||
"type": "module", |
||||
"scripts": { |
||||
"dev": "vite", |
||||
"build": "tsc -b && vite build", |
||||
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", |
||||
"preview": "vite preview" |
||||
}, |
||||
"dependencies": { |
||||
"react": "^18.3.1", |
||||
"react-dom": "^18.3.1", |
||||
"react-router-dom": "^6.24.0" |
||||
}, |
||||
"devDependencies": { |
||||
"@types/react": "^18.3.3", |
||||
"@types/react-dom": "^18.3.0", |
||||
"@typescript-eslint/eslint-plugin": "^7.13.1", |
||||
"@typescript-eslint/parser": "^7.13.1", |
||||
"@vitejs/plugin-react": "^4.3.1", |
||||
"autoprefixer": "^10.4.19", |
||||
"daisyui": "^4.12.10", |
||||
"eslint": "^8.57.0", |
||||
"eslint-plugin-react-hooks": "^4.6.2", |
||||
"eslint-plugin-react-refresh": "^0.4.7", |
||||
"postcss": "^8.4.38", |
||||
"tailwindcss": "^3.4.4", |
||||
"typescript": "^5.2.2", |
||||
"vite": "^5.3.1" |
||||
} |
||||
} |
@ -0,0 +1,6 @@ |
||||
export default { |
||||
plugins: { |
||||
tailwindcss: {}, |
||||
autoprefixer: {}, |
||||
}, |
||||
} |
After Width: | Height: | Size: 1.5 KiB |
@ -0,0 +1,69 @@ |
||||
@tailwind base; |
||||
@tailwind components; |
||||
@tailwind utilities; |
||||
|
||||
|
||||
.rtl{ |
||||
direction: rtl !important; |
||||
|
||||
} |
||||
|
||||
.ltr{ |
||||
direction: ltr !important; |
||||
|
||||
} |
||||
|
||||
:root { |
||||
--tab-bg: gray; |
||||
--tab-border-color: gray; |
||||
--color: white; |
||||
} |
||||
|
||||
#root { |
||||
max-width: 1280px; |
||||
margin: 0 auto; |
||||
padding: 2rem; |
||||
text-align: center; |
||||
} |
||||
|
||||
.logo { |
||||
height: 6em; |
||||
padding: 1.5em; |
||||
will-change: filter; |
||||
transition: filter 300ms; |
||||
} |
||||
.logo:hover { |
||||
filter: drop-shadow(0 0 2em #646cffaa); |
||||
} |
||||
.logo.react:hover { |
||||
filter: drop-shadow(0 0 2em #61dafbaa); |
||||
} |
||||
|
||||
@keyframes logo-spin { |
||||
from { |
||||
transform: rotate(0deg); |
||||
} |
||||
to { |
||||
transform: rotate(360deg); |
||||
} |
||||
} |
||||
|
||||
@media (prefers-reduced-motion: no-preference) { |
||||
a:nth-of-type(2) .logo { |
||||
animation: logo-spin infinite 20s linear; |
||||
} |
||||
} |
||||
|
||||
.card { |
||||
padding: 2em; |
||||
} |
||||
|
||||
.read-the-docs { |
||||
color: #888; |
||||
} |
||||
|
||||
#root { |
||||
width: 100%; |
||||
padding: 0; |
||||
margin: 0; |
||||
} |
@ -0,0 +1,13 @@ |
||||
import './App.css' |
||||
import TabBar from './components/TabBar' |
||||
|
||||
function App() { |
||||
|
||||
return ( |
||||
<> |
||||
<TabBar /> |
||||
</> |
||||
) |
||||
} |
||||
|
||||
export default App |
After Width: | Height: | Size: 4.0 KiB |
@ -0,0 +1,27 @@ |
||||
import React from "react"; |
||||
|
||||
interface Props { |
||||
name: string; |
||||
} |
||||
|
||||
const Tab: React.FC<Props> = ({ }) => { |
||||
|
||||
|
||||
|
||||
return( |
||||
<div className="w-2/12 min-h-10 bg-yellow-300 flex flex-row-reverse rounded-md"> |
||||
{/* sample tab */} |
||||
<div className='w-11/12 p-auto py-1/2'> |
||||
<p className="h-full text-right pr-4 pt-2">تب شماره 1</p> |
||||
</div> |
||||
<button key={1} className="relative top-0 left-2 rounded-full my-3"></button> |
||||
{/* <div className='w-2/12 h-full p-0 pl-1'> |
||||
<button className=""></button> |
||||
</div> */} |
||||
</div> |
||||
); |
||||
}; |
||||
|
||||
export default Tab; |
||||
|
||||
// ×
|
@ -0,0 +1,104 @@ |
||||
import React, { useState } from "react"; |
||||
|
||||
const TabBar: React.FC = () => { |
||||
|
||||
const [tabs, setTabs] = useState([ |
||||
{ title: "تب 1", url: "/question", props: {}, states: {} }, |
||||
{ title: "تب 2", url: "/question", props: {}, states: {} }, |
||||
{ title: "تب 3", url: "/question", props: {}, states: {} }, |
||||
{ title: "تب 4", url: "/question", props: {}, states: {} }, |
||||
|
||||
]); |
||||
const [activeTab, setActiveTab]: [number, Function] = useState(0); |
||||
|
||||
const handleTabClick = (index: number) => { |
||||
setActiveTab(index); |
||||
}; |
||||
|
||||
const newTab = () => { |
||||
let x = [...tabs]; |
||||
x.push({ title: "تب "+ (+tabs.length+1), url: "/question", props: {}, states: {} }); |
||||
setActiveTab(x.length-1); |
||||
setTabs(x); |
||||
|
||||
} |
||||
|
||||
const handleTabClose = (index: number,e: any) => { |
||||
e.preventDefault(); |
||||
|
||||
let x = [...tabs]; |
||||
x.splice(index, 1); |
||||
setTabs(x); |
||||
if (index === activeTab && activeTab === tabs.length) setActiveTab(x.length - 1); |
||||
else if (activeTab > index) setActiveTab(activeTab - 1) |
||||
e.stopPropagation() |
||||
}; |
||||
let revtabs = [...tabs].reverse(); |
||||
return ( |
||||
<div className="w-full fixed top-0 rtl bg-gray-800"> |
||||
<div role="tablist" className="tabs ltr flex justify-end tabs-lifted pt-1 px-1"> |
||||
<a role="tab"> <div className="btn my-1 btn-xs btn-ghost" onClick={()=> newTab()}>+</div></a> |
||||
{revtabs.map((tab, i) => { |
||||
let index = revtabs.length-i-1; |
||||
return ( |
||||
<a |
||||
role="tab" |
||||
key={index} |
||||
|
||||
className={`tab rtl w-40 min-w-12 ${ |
||||
activeTab === index |
||||
? "tab-active text-primary [--tab-bg:gray] " |
||||
: "" |
||||
} [--tab-padding:1px] [--tab-border-color:gray]`}
|
||||
onClick={() => handleTabClick(index)}> |
||||
<div className={`w-full px-2 py-0.5`} > |
||||
<div className={`${ activeTab === index ? "":"hover:bg-slate-700 transition-all"} flex justify-between w-full rounded-lg px-1 `}> |
||||
<span className="pr-1 text-white truncate" title={tab.title} >{tab.title}</span> |
||||
|
||||
<div className="btn my-1 btn-xs btn-ghost" onClick={(e)=> handleTabClose(index,e)}>x</div> |
||||
</div> |
||||
</div> |
||||
</a> |
||||
); |
||||
})} |
||||
|
||||
<div className="flex justify-end align-bottom absolute top-2 left-0"> |
||||
<div className="w-8 h-8 bg-red-500 rounded-md mx-2"> |
||||
<a className="w-full h-full" href="###" ></a> |
||||
</div> |
||||
<div className="w-8 h-8 bg-red-500 rounded-md mx-2"> |
||||
<a className="w-full h-full" href="###"></a> |
||||
</div> |
||||
</div> |
||||
|
||||
|
||||
<div className="dropdown rtl " role="tab"> |
||||
<div tabIndex={0} role="button" className="btn my-1 btn-xs btn-neutral mx-2 rotate-180">^</div> |
||||
<ul tabIndex={0} className="dropdown-content menu bg-base-100 rounded-box z-[1] w-52 p-2 shadow"> |
||||
{tabs.map((tab) => { |
||||
return ( |
||||
<li><a className="text-gray-50 no-underline">{tab.title}</a></li>); |
||||
})} |
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
<div className="breadcrumbs w-full text-sm bg-slate-800 !text-white"> |
||||
<ul className="flex justify-end"> |
||||
<li className="pr-2"> |
||||
<a className="text-gray-50 no-underline"> |
||||
تب 1 |
||||
</a> |
||||
</li> |
||||
<li> |
||||
<a className="text-gray-50"> |
||||
تب 2 |
||||
</a> |
||||
</li> |
||||
</ul> |
||||
</div> |
||||
</div> |
||||
); |
||||
}; |
||||
|
||||
export default TabBar; |
@ -0,0 +1,68 @@ |
||||
:root { |
||||
font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; |
||||
line-height: 1.5; |
||||
font-weight: 400; |
||||
|
||||
color-scheme: light dark; |
||||
color: rgb(0, 0, 0); |
||||
background-color: white; |
||||
|
||||
font-synthesis: none; |
||||
text-rendering: optimizeLegibility; |
||||
-webkit-font-smoothing: antialiased; |
||||
-moz-osx-font-smoothing: grayscale; |
||||
} |
||||
|
||||
a { |
||||
font-weight: 500; |
||||
color: #646cff; |
||||
text-decoration: inherit; |
||||
} |
||||
a:hover { |
||||
color: #535bf2; |
||||
} |
||||
|
||||
body { |
||||
margin: 0; |
||||
display: flex; |
||||
place-items: center; |
||||
min-width: 320px; |
||||
min-height: 100vh; |
||||
} |
||||
|
||||
h1 { |
||||
font-size: 3.2em; |
||||
line-height: 1.1; |
||||
} |
||||
|
||||
button { |
||||
border-radius: 8px; |
||||
border: 1px solid transparent; |
||||
padding: 0.6em 1.2em; |
||||
font-size: 1em; |
||||
font-weight: 500; |
||||
font-family: inherit; |
||||
background-color: #1a1a1a; |
||||
cursor: pointer; |
||||
transition: border-color 0.25s; |
||||
} |
||||
button:hover { |
||||
border-color: #646cff; |
||||
} |
||||
button:focus, |
||||
button:focus-visible { |
||||
outline: 4px auto -webkit-focus-ring-color; |
||||
} |
||||
|
||||
@media (prefers-color-scheme: light) { |
||||
:root { |
||||
color: #213547; |
||||
background-color: #ffffff; |
||||
} |
||||
a:hover { |
||||
color: #747bff; |
||||
} |
||||
button { |
||||
background-color: #f9f9f9; |
||||
} |
||||
} |
@ -0,0 +1,3 @@ |
||||
@tailwind base; |
||||
@tailwind components; |
||||
@tailwind utilities; |
@ -0,0 +1,10 @@ |
||||
import React from 'react' |
||||
import ReactDOM from 'react-dom/client' |
||||
import App from './App.tsx' |
||||
import './index.css' |
||||
|
||||
ReactDOM.createRoot(document.getElementById('root')!).render( |
||||
<React.StrictMode> |
||||
<App /> |
||||
</React.StrictMode>, |
||||
) |
@ -0,0 +1,882 @@ |
||||
/* |
||||
! tailwindcss v3.4.4 | MIT License | https://tailwindcss.com |
||||
*/ |
||||
|
||||
/* |
||||
1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) |
||||
2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) |
||||
*/ |
||||
|
||||
*, |
||||
::before, |
||||
::after { |
||||
box-sizing: border-box; |
||||
/* 1 */ |
||||
border-width: 0; |
||||
/* 2 */ |
||||
border-style: solid; |
||||
/* 2 */ |
||||
border-color: #e5e7eb; |
||||
/* 2 */ |
||||
} |
||||
|
||||
::before, |
||||
::after { |
||||
--tw-content: ''; |
||||
} |
||||
|
||||
/* |
||||
1. Use a consistent sensible line-height in all browsers. |
||||
2. Prevent adjustments of font size after orientation changes in iOS. |
||||
3. Use a more readable tab size. |
||||
4. Use the user's configured `sans` font-family by default. |
||||
5. Use the user's configured `sans` font-feature-settings by default. |
||||
6. Use the user's configured `sans` font-variation-settings by default. |
||||
7. Disable tap highlights on iOS |
||||
*/ |
||||
|
||||
html, |
||||
:host { |
||||
line-height: 1.5; |
||||
/* 1 */ |
||||
-webkit-text-size-adjust: 100%; |
||||
/* 2 */ |
||||
-moz-tab-size: 4; |
||||
/* 3 */ |
||||
-o-tab-size: 4; |
||||
tab-size: 4; |
||||
/* 3 */ |
||||
font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; |
||||
/* 4 */ |
||||
font-feature-settings: normal; |
||||
/* 5 */ |
||||
font-variation-settings: normal; |
||||
/* 6 */ |
||||
-webkit-tap-highlight-color: transparent; |
||||
/* 7 */ |
||||
} |
||||
|
||||
/* |
||||
1. Remove the margin in all browsers. |
||||
2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. |
||||
*/ |
||||
|
||||
body { |
||||
margin: 0; |
||||
/* 1 */ |
||||
line-height: inherit; |
||||
/* 2 */ |
||||
} |
||||
|
||||
/* |
||||
1. Add the correct height in Firefox. |
||||
2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) |
||||
3. Ensure horizontal rules are visible by default. |
||||
*/ |
||||
|
||||
hr { |
||||
height: 0; |
||||
/* 1 */ |
||||
color: inherit; |
||||
/* 2 */ |
||||
border-top-width: 1px; |
||||
/* 3 */ |
||||
} |
||||
|
||||
/* |
||||
Add the correct text decoration in Chrome, Edge, and Safari. |
||||
*/ |
||||
|
||||
abbr:where([title]) { |
||||
-webkit-text-decoration: underline dotted; |
||||
text-decoration: underline dotted; |
||||
} |
||||
|
||||
/* |
||||
Remove the default font size and weight for headings. |
||||
*/ |
||||
|
||||
h1, |
||||
h2, |
||||
h3, |
||||
h4, |
||||
h5, |
||||
h6 { |
||||
font-size: inherit; |
||||
font-weight: inherit; |
||||
} |
||||
|
||||
/* |
||||
Reset links to optimize for opt-in styling instead of opt-out. |
||||
*/ |
||||
|
||||
a { |
||||
color: inherit; |
||||
text-decoration: inherit; |
||||
} |
||||
|
||||
/* |
||||
Add the correct font weight in Edge and Safari. |
||||
*/ |
||||
|
||||
b, |
||||
strong { |
||||
font-weight: bolder; |
||||
} |
||||
|
||||
/* |
||||
1. Use the user's configured `mono` font-family by default. |
||||
2. Use the user's configured `mono` font-feature-settings by default. |
||||
3. Use the user's configured `mono` font-variation-settings by default. |
||||
4. Correct the odd `em` font sizing in all browsers. |
||||
*/ |
||||
|
||||
code, |
||||
kbd, |
||||
samp, |
||||
pre { |
||||
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; |
||||
/* 1 */ |
||||
font-feature-settings: normal; |
||||
/* 2 */ |
||||
font-variation-settings: normal; |
||||
/* 3 */ |
||||
font-size: 1em; |
||||
/* 4 */ |
||||
} |
||||
|
||||
/* |
||||
Add the correct font size in all browsers. |
||||
*/ |
||||
|
||||
small { |
||||
font-size: 80%; |
||||
} |
||||
|
||||
/* |
||||
Prevent `sub` and `sup` elements from affecting the line height in all browsers. |
||||
*/ |
||||
|
||||
sub, |
||||
sup { |
||||
font-size: 75%; |
||||
line-height: 0; |
||||
position: relative; |
||||
vertical-align: baseline; |
||||
} |
||||
|
||||
sub { |
||||
bottom: -0.25em; |
||||
} |
||||
|
||||
sup { |
||||
top: -0.5em; |
||||
} |
||||
|
||||
/* |
||||
1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) |
||||
2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) |
||||
3. Remove gaps between table borders by default. |
||||
*/ |
||||
|
||||
table { |
||||
text-indent: 0; |
||||
/* 1 */ |
||||
border-color: inherit; |
||||
/* 2 */ |
||||
border-collapse: collapse; |
||||
/* 3 */ |
||||
} |
||||
|
||||
/* |
||||
1. Change the font styles in all browsers. |
||||
2. Remove the margin in Firefox and Safari. |
||||
3. Remove default padding in all browsers. |
||||
*/ |
||||
|
||||
button, |
||||
input, |
||||
optgroup, |
||||
select, |
||||
textarea { |
||||
font-family: inherit; |
||||
/* 1 */ |
||||
font-feature-settings: inherit; |
||||
/* 1 */ |
||||
font-variation-settings: inherit; |
||||
/* 1 */ |
||||
font-size: 100%; |
||||
/* 1 */ |
||||
font-weight: inherit; |
||||
/* 1 */ |
||||
line-height: inherit; |
||||
/* 1 */ |
||||
letter-spacing: inherit; |
||||
/* 1 */ |
||||
color: inherit; |
||||
/* 1 */ |
||||
margin: 0; |
||||
/* 2 */ |
||||
padding: 0; |
||||
/* 3 */ |
||||
} |
||||
|
||||
/* |
||||
Remove the inheritance of text transform in Edge and Firefox. |
||||
*/ |
||||
|
||||
button, |
||||
select { |
||||
text-transform: none; |
||||
} |
||||
|
||||
/* |
||||
1. Correct the inability to style clickable types in iOS and Safari. |
||||
2. Remove default button styles. |
||||
*/ |
||||
|
||||
button, |
||||
input:where([type='button']), |
||||
input:where([type='reset']), |
||||
input:where([type='submit']) { |
||||
-webkit-appearance: button; |
||||
/* 1 */ |
||||
background-color: transparent; |
||||
/* 2 */ |
||||
background-image: none; |
||||
/* 2 */ |
||||
} |
||||
|
||||
/* |
||||
Use the modern Firefox focus style for all focusable elements. |
||||
*/ |
||||
|
||||
:-moz-focusring { |
||||
outline: auto; |
||||
} |
||||
|
||||
/* |
||||
Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) |
||||
*/ |
||||
|
||||
:-moz-ui-invalid { |
||||
box-shadow: none; |
||||
} |
||||
|
||||
/* |
||||
Add the correct vertical alignment in Chrome and Firefox. |
||||
*/ |
||||
|
||||
progress { |
||||
vertical-align: baseline; |
||||
} |
||||
|
||||
/* |
||||
Correct the cursor style of increment and decrement buttons in Safari. |
||||
*/ |
||||
|
||||
::-webkit-inner-spin-button, |
||||
::-webkit-outer-spin-button { |
||||
height: auto; |
||||
} |
||||
|
||||
/* |
||||
1. Correct the odd appearance in Chrome and Safari. |
||||
2. Correct the outline style in Safari. |
||||
*/ |
||||
|
||||
[type='search'] { |
||||
-webkit-appearance: textfield; |
||||
/* 1 */ |
||||
outline-offset: -2px; |
||||
/* 2 */ |
||||
} |
||||
|
||||
/* |
||||
Remove the inner padding in Chrome and Safari on macOS. |
||||
*/ |
||||
|
||||
::-webkit-search-decoration { |
||||
-webkit-appearance: none; |
||||
} |
||||
|
||||
/* |
||||
1. Correct the inability to style clickable types in iOS and Safari. |
||||
2. Change font properties to `inherit` in Safari. |
||||
*/ |
||||
|
||||
::-webkit-file-upload-button { |
||||
-webkit-appearance: button; |
||||
/* 1 */ |
||||
font: inherit; |
||||
/* 2 */ |
||||
} |
||||
|
||||
/* |
||||
Add the correct display in Chrome and Safari. |
||||
*/ |
||||
|
||||
summary { |
||||
display: list-item; |
||||
} |
||||
|
||||
/* |
||||
Removes the default spacing and border for appropriate elements. |
||||
*/ |
||||
|
||||
blockquote, |
||||
dl, |
||||
dd, |
||||
h1, |
||||
h2, |
||||
h3, |
||||
h4, |
||||
h5, |
||||
h6, |
||||
hr, |
||||
figure, |
||||
p, |
||||
pre { |
||||
margin: 0; |
||||
} |
||||
|
||||
fieldset { |
||||
margin: 0; |
||||
padding: 0; |
||||
} |
||||
|
||||
legend { |
||||
padding: 0; |
||||
} |
||||
|
||||
ol, |
||||
ul, |
||||
menu { |
||||
list-style: none; |
||||
margin: 0; |
||||
padding: 0; |
||||
} |
||||
|
||||
/* |
||||
Reset default styling for dialogs. |
||||
*/ |
||||
|
||||
dialog { |
||||
padding: 0; |
||||
} |
||||
|
||||
/* |
||||
Prevent resizing textareas horizontally by default. |
||||
*/ |
||||
|
||||
textarea { |
||||
resize: vertical; |
||||
} |
||||
|
||||
/* |
||||
1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) |
||||
2. Set the default placeholder color to the user's configured gray 400 color. |
||||
*/ |
||||
|
||||
input::-moz-placeholder, textarea::-moz-placeholder { |
||||
opacity: 1; |
||||
/* 1 */ |
||||
color: #9ca3af; |
||||
/* 2 */ |
||||
} |
||||
|
||||
input::placeholder, |
||||
textarea::placeholder { |
||||
opacity: 1; |
||||
/* 1 */ |
||||
color: #9ca3af; |
||||
/* 2 */ |
||||
} |
||||
|
||||
/* |
||||
Set the default cursor for buttons. |
||||
*/ |
||||
|
||||
button, |
||||
[role="button"] { |
||||
cursor: pointer; |
||||
} |
||||
|
||||
/* |
||||
Make sure disabled buttons don't get the pointer cursor. |
||||
*/ |
||||
|
||||
:disabled { |
||||
cursor: default; |
||||
} |
||||
|
||||
/* |
||||
1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) |
||||
2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) |
||||
This can trigger a poorly considered lint error in some tools but is included by design. |
||||
*/ |
||||
|
||||
img, |
||||
svg, |
||||
video, |
||||
canvas, |
||||
audio, |
||||
iframe, |
||||
embed, |
||||
object { |
||||
display: block; |
||||
/* 1 */ |
||||
vertical-align: middle; |
||||
/* 2 */ |
||||
} |
||||
|
||||
/* |
||||
Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) |
||||
*/ |
||||
|
||||
img, |
||||
video { |
||||
max-width: 100%; |
||||
height: auto; |
||||
} |
||||
|
||||
/* Make elements with the HTML hidden attribute stay hidden by default */ |
||||
|
||||
[hidden] { |
||||
display: none; |
||||
} |
||||
|
||||
:root, |
||||
[data-theme] { |
||||
background-color: var(--fallback-b1,oklch(var(--b1)/1)); |
||||
color: var(--fallback-bc,oklch(var(--bc)/1)); |
||||
} |
||||
|
||||
@supports not (color: oklch(0% 0 0)) { |
||||
:root { |
||||
color-scheme: light; |
||||
--fallback-p: #491eff; |
||||
--fallback-pc: #d4dbff; |
||||
--fallback-s: #ff41c7; |
||||
--fallback-sc: #fff9fc; |
||||
--fallback-a: #00cfbd; |
||||
--fallback-ac: #00100d; |
||||
--fallback-n: #2b3440; |
||||
--fallback-nc: #d7dde4; |
||||
--fallback-b1: #ffffff; |
||||
--fallback-b2: #e5e6e6; |
||||
--fallback-b3: #e5e6e6; |
||||
--fallback-bc: #1f2937; |
||||
--fallback-in: #00b3f0; |
||||
--fallback-inc: #000000; |
||||
--fallback-su: #00ca92; |
||||
--fallback-suc: #000000; |
||||
--fallback-wa: #ffc22d; |
||||
--fallback-wac: #000000; |
||||
--fallback-er: #ff6f70; |
||||
--fallback-erc: #000000; |
||||
} |
||||
|
||||
@media (prefers-color-scheme: dark) { |
||||
:root { |
||||
color-scheme: dark; |
||||
--fallback-p: #7582ff; |
||||
--fallback-pc: #050617; |
||||
--fallback-s: #ff71cf; |
||||
--fallback-sc: #190211; |
||||
--fallback-a: #00c7b5; |
||||
--fallback-ac: #000e0c; |
||||
--fallback-n: #2a323c; |
||||
--fallback-nc: #a6adbb; |
||||
--fallback-b1: #1d232a; |
||||
--fallback-b2: #191e24; |
||||
--fallback-b3: #15191e; |
||||
--fallback-bc: #a6adbb; |
||||
--fallback-in: #00b3f0; |
||||
--fallback-inc: #000000; |
||||
--fallback-su: #00ca92; |
||||
--fallback-suc: #000000; |
||||
--fallback-wa: #ffc22d; |
||||
--fallback-wac: #000000; |
||||
--fallback-er: #ff6f70; |
||||
--fallback-erc: #000000; |
||||
} |
||||
} |
||||
} |
||||
|
||||
html { |
||||
-webkit-tap-highlight-color: transparent; |
||||
} |
||||
|
||||
* { |
||||
scrollbar-color: color-mix(in oklch, currentColor 35%, transparent) transparent; |
||||
} |
||||
|
||||
*:hover { |
||||
scrollbar-color: color-mix(in oklch, currentColor 60%, transparent) transparent; |
||||
} |
||||
|
||||
:root { |
||||
color-scheme: light; |
||||
--in: 72.06% 0.191 231.6; |
||||
--su: 64.8% 0.150 160; |
||||
--wa: 84.71% 0.199 83.87; |
||||
--er: 71.76% 0.221 22.18; |
||||
--pc: 89.824% 0.06192 275.75; |
||||
--ac: 15.352% 0.0368 183.61; |
||||
--inc: 0% 0 0; |
||||
--suc: 0% 0 0; |
||||
--wac: 0% 0 0; |
||||
--erc: 0% 0 0; |
||||
--rounded-box: 1rem; |
||||
--rounded-btn: 0.5rem; |
||||
--rounded-badge: 1.9rem; |
||||
--animation-btn: 0.25s; |
||||
--animation-input: .2s; |
||||
--btn-focus-scale: 0.95; |
||||
--border-btn: 1px; |
||||
--tab-border: 1px; |
||||
--tab-radius: 0.5rem; |
||||
--p: 49.12% 0.3096 275.75; |
||||
--s: 69.71% 0.329 342.55; |
||||
--sc: 98.71% 0.0106 342.55; |
||||
--a: 76.76% 0.184 183.61; |
||||
--n: 32.1785% 0.02476 255.701624; |
||||
--nc: 89.4994% 0.011585 252.096176; |
||||
--b1: 100% 0 0; |
||||
--b2: 96.1151% 0 0; |
||||
--b3: 92.4169% 0.00108 197.137559; |
||||
--bc: 27.8078% 0.029596 256.847952; |
||||
} |
||||
|
||||
@media (prefers-color-scheme: dark) { |
||||
:root { |
||||
color-scheme: dark; |
||||
--in: 72.06% 0.191 231.6; |
||||
--su: 64.8% 0.150 160; |
||||
--wa: 84.71% 0.199 83.87; |
||||
--er: 71.76% 0.221 22.18; |
||||
--pc: 13.138% 0.0392 275.75; |
||||
--sc: 14.96% 0.052 342.55; |
||||
--ac: 14.902% 0.0334 183.61; |
||||
--inc: 0% 0 0; |
||||
--suc: 0% 0 0; |
||||
--wac: 0% 0 0; |
||||
--erc: 0% 0 0; |
||||
--rounded-box: 1rem; |
||||
--rounded-btn: 0.5rem; |
||||
--rounded-badge: 1.9rem; |
||||
--animation-btn: 0.25s; |
||||
--animation-input: .2s; |
||||
--btn-focus-scale: 0.95; |
||||
--border-btn: 1px; |
||||
--tab-border: 1px; |
||||
--tab-radius: 0.5rem; |
||||
--p: 65.69% 0.196 275.75; |
||||
--s: 74.8% 0.26 342.55; |
||||
--a: 74.51% 0.167 183.61; |
||||
--n: 31.3815% 0.021108 254.139175; |
||||
--nc: 74.6477% 0.0216 264.435964; |
||||
--b1: 25.3267% 0.015896 252.417568; |
||||
--b2: 23.2607% 0.013807 253.100675; |
||||
--b3: 21.1484% 0.01165 254.087939; |
||||
--bc: 74.6477% 0.0216 264.435964; |
||||
} |
||||
} |
||||
|
||||
[data-theme=light] { |
||||
color-scheme: light; |
||||
--in: 72.06% 0.191 231.6; |
||||
--su: 64.8% 0.150 160; |
||||
--wa: 84.71% 0.199 83.87; |
||||
--er: 71.76% 0.221 22.18; |
||||
--pc: 89.824% 0.06192 275.75; |
||||
--ac: 15.352% 0.0368 183.61; |
||||
--inc: 0% 0 0; |
||||
--suc: 0% 0 0; |
||||
--wac: 0% 0 0; |
||||
--erc: 0% 0 0; |
||||
--rounded-box: 1rem; |
||||
--rounded-btn: 0.5rem; |
||||
--rounded-badge: 1.9rem; |
||||
--animation-btn: 0.25s; |
||||
--animation-input: .2s; |
||||
--btn-focus-scale: 0.95; |
||||
--border-btn: 1px; |
||||
--tab-border: 1px; |
||||
--tab-radius: 0.5rem; |
||||
--p: 49.12% 0.3096 275.75; |
||||
--s: 69.71% 0.329 342.55; |
||||
--sc: 98.71% 0.0106 342.55; |
||||
--a: 76.76% 0.184 183.61; |
||||
--n: 32.1785% 0.02476 255.701624; |
||||
--nc: 89.4994% 0.011585 252.096176; |
||||
--b1: 100% 0 0; |
||||
--b2: 96.1151% 0 0; |
||||
--b3: 92.4169% 0.00108 197.137559; |
||||
--bc: 27.8078% 0.029596 256.847952; |
||||
} |
||||
|
||||
[data-theme=dark] { |
||||
color-scheme: dark; |
||||
--in: 72.06% 0.191 231.6; |
||||
--su: 64.8% 0.150 160; |
||||
--wa: 84.71% 0.199 83.87; |
||||
--er: 71.76% 0.221 22.18; |
||||
--pc: 13.138% 0.0392 275.75; |
||||
--sc: 14.96% 0.052 342.55; |
||||
--ac: 14.902% 0.0334 183.61; |
||||
--inc: 0% 0 0; |
||||
--suc: 0% 0 0; |
||||
--wac: 0% 0 0; |
||||
--erc: 0% 0 0; |
||||
--rounded-box: 1rem; |
||||
--rounded-btn: 0.5rem; |
||||
--rounded-badge: 1.9rem; |
||||
--animation-btn: 0.25s; |
||||
--animation-input: .2s; |
||||
--btn-focus-scale: 0.95; |
||||
--border-btn: 1px; |
||||
--tab-border: 1px; |
||||
--tab-radius: 0.5rem; |
||||
--p: 65.69% 0.196 275.75; |
||||
--s: 74.8% 0.26 342.55; |
||||
--a: 74.51% 0.167 183.61; |
||||
--n: 31.3815% 0.021108 254.139175; |
||||
--nc: 74.6477% 0.0216 264.435964; |
||||
--b1: 25.3267% 0.015896 252.417568; |
||||
--b2: 23.2607% 0.013807 253.100675; |
||||
--b3: 21.1484% 0.01165 254.087939; |
||||
--bc: 74.6477% 0.0216 264.435964; |
||||
} |
||||
|
||||
*, ::before, ::after { |
||||
--tw-border-spacing-x: 0; |
||||
--tw-border-spacing-y: 0; |
||||
--tw-translate-x: 0; |
||||
--tw-translate-y: 0; |
||||
--tw-rotate: 0; |
||||
--tw-skew-x: 0; |
||||
--tw-skew-y: 0; |
||||
--tw-scale-x: 1; |
||||
--tw-scale-y: 1; |
||||
--tw-pan-x: ; |
||||
--tw-pan-y: ; |
||||
--tw-pinch-zoom: ; |
||||
--tw-scroll-snap-strictness: proximity; |
||||
--tw-gradient-from-position: ; |
||||
--tw-gradient-via-position: ; |
||||
--tw-gradient-to-position: ; |
||||
--tw-ordinal: ; |
||||
--tw-slashed-zero: ; |
||||
--tw-numeric-figure: ; |
||||
--tw-numeric-spacing: ; |
||||
--tw-numeric-fraction: ; |
||||
--tw-ring-inset: ; |
||||
--tw-ring-offset-width: 0px; |
||||
--tw-ring-offset-color: #fff; |
||||
--tw-ring-color: rgb(59 130 246 / 0.5); |
||||
--tw-ring-offset-shadow: 0 0 #0000; |
||||
--tw-ring-shadow: 0 0 #0000; |
||||
--tw-shadow: 0 0 #0000; |
||||
--tw-shadow-colored: 0 0 #0000; |
||||
--tw-blur: ; |
||||
--tw-brightness: ; |
||||
--tw-contrast: ; |
||||
--tw-grayscale: ; |
||||
--tw-hue-rotate: ; |
||||
--tw-invert: ; |
||||
--tw-saturate: ; |
||||
--tw-sepia: ; |
||||
--tw-drop-shadow: ; |
||||
--tw-backdrop-blur: ; |
||||
--tw-backdrop-brightness: ; |
||||
--tw-backdrop-contrast: ; |
||||
--tw-backdrop-grayscale: ; |
||||
--tw-backdrop-hue-rotate: ; |
||||
--tw-backdrop-invert: ; |
||||
--tw-backdrop-opacity: ; |
||||
--tw-backdrop-saturate: ; |
||||
--tw-backdrop-sepia: ; |
||||
--tw-contain-size: ; |
||||
--tw-contain-layout: ; |
||||
--tw-contain-paint: ; |
||||
--tw-contain-style: ; |
||||
} |
||||
|
||||
::backdrop { |
||||
--tw-border-spacing-x: 0; |
||||
--tw-border-spacing-y: 0; |
||||
--tw-translate-x: 0; |
||||
--tw-translate-y: 0; |
||||
--tw-rotate: 0; |
||||
--tw-skew-x: 0; |
||||
--tw-skew-y: 0; |
||||
--tw-scale-x: 1; |
||||
--tw-scale-y: 1; |
||||
--tw-pan-x: ; |
||||
--tw-pan-y: ; |
||||
--tw-pinch-zoom: ; |
||||
--tw-scroll-snap-strictness: proximity; |
||||
--tw-gradient-from-position: ; |
||||
--tw-gradient-via-position: ; |
||||
--tw-gradient-to-position: ; |
||||
--tw-ordinal: ; |
||||
--tw-slashed-zero: ; |
||||
--tw-numeric-figure: ; |
||||
--tw-numeric-spacing: ; |
||||
--tw-numeric-fraction: ; |
||||
--tw-ring-inset: ; |
||||
--tw-ring-offset-width: 0px; |
||||
--tw-ring-offset-color: #fff; |
||||
--tw-ring-color: rgb(59 130 246 / 0.5); |
||||
--tw-ring-offset-shadow: 0 0 #0000; |
||||
--tw-ring-shadow: 0 0 #0000; |
||||
--tw-shadow: 0 0 #0000; |
||||
--tw-shadow-colored: 0 0 #0000; |
||||
--tw-blur: ; |
||||
--tw-brightness: ; |
||||
--tw-contrast: ; |
||||
--tw-grayscale: ; |
||||
--tw-hue-rotate: ; |
||||
--tw-invert: ; |
||||
--tw-saturate: ; |
||||
--tw-sepia: ; |
||||
--tw-drop-shadow: ; |
||||
--tw-backdrop-blur: ; |
||||
--tw-backdrop-brightness: ; |
||||
--tw-backdrop-contrast: ; |
||||
--tw-backdrop-grayscale: ; |
||||
--tw-backdrop-hue-rotate: ; |
||||
--tw-backdrop-invert: ; |
||||
--tw-backdrop-opacity: ; |
||||
--tw-backdrop-saturate: ; |
||||
--tw-backdrop-sepia: ; |
||||
--tw-contain-size: ; |
||||
--tw-contain-layout: ; |
||||
--tw-contain-paint: ; |
||||
--tw-contain-style: ; |
||||
} |
||||
|
||||
@media (hover:hover) { |
||||
.tabs-boxed :is(.tab-active, [aria-selected="true"]):not(.tab-disabled):not([disabled]):hover, .tabs-boxed :is(input:checked):hover { |
||||
--tw-text-opacity: 1; |
||||
color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity))); |
||||
} |
||||
} |
||||
|
||||
.tabs { |
||||
display: grid; |
||||
align-items: flex-end; |
||||
} |
||||
|
||||
@keyframes button-pop { |
||||
0% { |
||||
transform: scale(var(--btn-focus-scale, 0.98)); |
||||
} |
||||
|
||||
40% { |
||||
transform: scale(1.02); |
||||
} |
||||
|
||||
100% { |
||||
transform: scale(1); |
||||
} |
||||
} |
||||
|
||||
@keyframes checkmark { |
||||
0% { |
||||
background-position-y: 5px; |
||||
} |
||||
|
||||
50% { |
||||
background-position-y: -2px; |
||||
} |
||||
|
||||
100% { |
||||
background-position-y: 0; |
||||
} |
||||
} |
||||
|
||||
@keyframes modal-pop { |
||||
0% { |
||||
opacity: 0; |
||||
} |
||||
} |
||||
|
||||
@keyframes progress-loading { |
||||
50% { |
||||
background-position-x: -115%; |
||||
} |
||||
} |
||||
|
||||
@keyframes radiomark { |
||||
0% { |
||||
box-shadow: 0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset, |
||||
0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset; |
||||
} |
||||
|
||||
50% { |
||||
box-shadow: 0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset, |
||||
0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset; |
||||
} |
||||
|
||||
100% { |
||||
box-shadow: 0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset, |
||||
0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset; |
||||
} |
||||
} |
||||
|
||||
@keyframes rating-pop { |
||||
0% { |
||||
transform: translateY(-0.125em); |
||||
} |
||||
|
||||
40% { |
||||
transform: translateY(-0.125em); |
||||
} |
||||
|
||||
100% { |
||||
transform: translateY(0); |
||||
} |
||||
} |
||||
|
||||
@keyframes skeleton { |
||||
from { |
||||
background-position: 150%; |
||||
} |
||||
|
||||
to { |
||||
background-position: -50%; |
||||
} |
||||
} |
||||
|
||||
.tabs-boxed { |
||||
border-radius: var(--rounded-btn, 0.5rem); |
||||
--tw-bg-opacity: 1; |
||||
background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity))); |
||||
padding: 0.25rem; |
||||
} |
||||
|
||||
.tabs-boxed .tab { |
||||
border-radius: var(--rounded-btn, 0.5rem); |
||||
} |
||||
|
||||
.tabs-boxed :is(.tab-active, [aria-selected="true"]):not(.tab-disabled):not([disabled]), .tabs-boxed :is(input:checked) { |
||||
--tw-bg-opacity: 1; |
||||
background-color: var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity))); |
||||
--tw-text-opacity: 1; |
||||
color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity))); |
||||
} |
||||
|
||||
@keyframes toast-pop { |
||||
0% { |
||||
transform: scale(0.9); |
||||
opacity: 0; |
||||
} |
||||
|
||||
100% { |
||||
transform: scale(1); |
||||
opacity: 1; |
||||
} |
||||
} |
@ -0,0 +1 @@ |
||||
/// <reference types="vite/client" />
|
@ -0,0 +1,24 @@ |
||||
/** @type {import('tailwindcss').Config} */ |
||||
export default { |
||||
content: ['./src/**/*.{html,js,ts,jsx,tsx}'], |
||||
theme: { |
||||
extend: {}, |
||||
}, |
||||
plugins: [ |
||||
require('daisyui'), |
||||
], |
||||
|
||||
daisyui: { |
||||
themes: false, |
||||
darkTheme: "dark", |
||||
base: true, |
||||
styled: true, |
||||
utils: true, |
||||
prefix: "", |
||||
logs: true, |
||||
themeRoot: ":root", |
||||
}, |
||||
} |
||||
|
||||
|
||||
|
@ -0,0 +1,27 @@ |
||||
{ |
||||
"compilerOptions": { |
||||
"composite": true, |
||||
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", |
||||
"target": "ES2020", |
||||
"useDefineForClassFields": true, |
||||
"lib": ["ES2020", "DOM", "DOM.Iterable"], |
||||
"module": "ESNext", |
||||
"skipLibCheck": true, |
||||
|
||||
/* Bundler mode */ |
||||
"moduleResolution": "bundler", |
||||
"allowImportingTsExtensions": true, |
||||
"resolveJsonModule": true, |
||||
"isolatedModules": true, |
||||
"moduleDetection": "force", |
||||
"noEmit": true, |
||||
"jsx": "react-jsx", |
||||
|
||||
/* Linting */ |
||||
"strict": true, |
||||
"noUnusedLocals": true, |
||||
"noUnusedParameters": true, |
||||
"noFallthroughCasesInSwitch": true |
||||
}, |
||||
"include": ["src"] |
||||
} |
@ -0,0 +1,11 @@ |
||||
{ |
||||
"files": [], |
||||
"references": [ |
||||
{ |
||||
"path": "./tsconfig.app.json" |
||||
}, |
||||
{ |
||||
"path": "./tsconfig.node.json" |
||||
} |
||||
] |
||||
} |
@ -0,0 +1,13 @@ |
||||
{ |
||||
"compilerOptions": { |
||||
"composite": true, |
||||
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", |
||||
"skipLibCheck": true, |
||||
"module": "ESNext", |
||||
"moduleResolution": "bundler", |
||||
"allowSyntheticDefaultImports": true, |
||||
"strict": true, |
||||
"noEmit": true |
||||
}, |
||||
"include": ["vite.config.ts"] |
||||
} |
@ -0,0 +1,7 @@ |
||||
import { defineConfig } from 'vite' |
||||
import react from '@vitejs/plugin-react' |
||||
|
||||
// https://vitejs.dev/config/
|
||||
export default defineConfig({ |
||||
plugins: [react()], |
||||
}) |
Loading…
Reference in new issue