Spaces:
Sleeping
Sleeping
Commit
·
dd7420a
1
Parent(s):
9807072
add: tailwindcss
Browse files- .postcssrc +5 -0
- eslint.config.mjs +44 -0
- index.html +66 -47
- package-lock.json +0 -0
- package.json +15 -14
- style.css +1 -78
.postcssrc
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"plugins": {
|
3 |
+
"@tailwindcss/postcss": {}
|
4 |
+
}
|
5 |
+
}
|
eslint.config.mjs
ADDED
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { defineConfig } from "eslint/config";
|
2 |
+
import globals from "globals";
|
3 |
+
import path from "node:path";
|
4 |
+
import { fileURLToPath } from "node:url";
|
5 |
+
import js from "@eslint/js";
|
6 |
+
import { FlatCompat } from "@eslint/eslintrc";
|
7 |
+
|
8 |
+
const __filename = fileURLToPath(import.meta.url);
|
9 |
+
const __dirname = path.dirname(__filename);
|
10 |
+
const compat = new FlatCompat({
|
11 |
+
baseDirectory: __dirname,
|
12 |
+
recommendedConfig: js.configs.recommended,
|
13 |
+
allConfig: js.configs.all
|
14 |
+
});
|
15 |
+
|
16 |
+
export default defineConfig([{
|
17 |
+
extends: compat.extends("eslint:recommended"),
|
18 |
+
|
19 |
+
languageOptions: {
|
20 |
+
globals: {
|
21 |
+
...globals.browser,
|
22 |
+
...globals.node,
|
23 |
+
},
|
24 |
+
|
25 |
+
ecmaVersion: 12,
|
26 |
+
sourceType: "module",
|
27 |
+
},
|
28 |
+
|
29 |
+
rules: {
|
30 |
+
indent: ["error", 2],
|
31 |
+
quotes: ["error", "single"],
|
32 |
+
semi: ["error", "always"],
|
33 |
+
|
34 |
+
"no-unused-vars": ["error", {
|
35 |
+
args: "all",
|
36 |
+
argsIgnorePattern: "^_",
|
37 |
+
caughtErrors: "all",
|
38 |
+
caughtErrorsIgnorePattern: "^_",
|
39 |
+
destructuredArrayIgnorePattern: "^_",
|
40 |
+
varsIgnorePattern: "^_",
|
41 |
+
ignoreRestSiblings: true,
|
42 |
+
}],
|
43 |
+
},
|
44 |
+
}]);
|
index.html
CHANGED
@@ -8,65 +8,84 @@
|
|
8 |
<link rel="stylesheet" href="style.css">
|
9 |
</head>
|
10 |
|
11 |
-
<body>
|
12 |
-
<h1>Quotation Generator</h1>
|
13 |
-
<div id="form-container">
|
14 |
-
<form id="quotation-form">
|
15 |
-
<fieldset>
|
16 |
-
<legend>Your Company Details</legend>
|
17 |
-
<input type="text" id="company-name" name="company-name" placeholder="Company Name" required
|
18 |
-
|
19 |
-
<
|
20 |
-
|
21 |
-
<input type="text" id="company-
|
|
|
|
|
|
|
|
|
|
|
22 |
</fieldset>
|
23 |
-
<fieldset>
|
24 |
-
<legend>Customer Company Details</legend>
|
25 |
-
<input type="text" id="customer-name" name="customer-name" placeholder="Customer Name" required
|
26 |
-
|
27 |
-
<
|
28 |
-
|
29 |
-
<input type="text" id="customer-
|
|
|
|
|
|
|
|
|
|
|
30 |
</fieldset>
|
31 |
-
<fieldset>
|
32 |
-
<legend>Quotation Details</legend>
|
33 |
-
<input type="text" id="quotation-number" name="quotation-number" placeholder="Quotation Number" required
|
34 |
-
|
|
|
|
|
35 |
</fieldset>
|
36 |
-
<fieldset>
|
37 |
-
<legend>Items</legend>
|
38 |
-
<table id="items-table">
|
39 |
<thead>
|
40 |
-
<tr>
|
41 |
-
<th>S.No</th>
|
42 |
-
<th>Description</th>
|
43 |
-
<th>HSN Code</th>
|
44 |
-
<th>Qty</th>
|
45 |
-
<th>Unit Price</th>
|
46 |
-
<th>Discount (%)</th>
|
47 |
-
<th>Amount</th>
|
48 |
-
<th></th>
|
49 |
</tr>
|
50 |
</thead>
|
51 |
<tbody>
|
52 |
</tbody>
|
53 |
</table>
|
54 |
-
<button type="button" id="add-item"
|
|
|
55 |
</fieldset>
|
56 |
-
<fieldset>
|
57 |
-
<legend>Additional Charges</legend>
|
58 |
-
<label>IGST (%)<input type="number" id="igst-rate" name="igst-rate" value="0" min="0"
|
59 |
-
|
60 |
-
|
|
|
61 |
</fieldset>
|
62 |
-
<fieldset>
|
63 |
-
<legend>Bank Details</legend>
|
64 |
-
<input type="text" id="bank-name" name="bank-name" placeholder="Bank Name" required
|
65 |
-
|
66 |
-
<input type="text" id="bank-
|
67 |
-
|
|
|
|
|
|
|
|
|
68 |
</fieldset>
|
69 |
-
<button type="submit">Generate
|
|
|
70 |
</form>
|
71 |
</div>
|
72 |
<div id="quotation-output" style="display:none;"></div>
|
|
|
8 |
<link rel="stylesheet" href="style.css">
|
9 |
</head>
|
10 |
|
11 |
+
<body class="bg-gray-100">
|
12 |
+
<h1 class="text-3xl font-bold text-center my-8">Quotation Generator</h1>
|
13 |
+
<div id="form-container" class="container mx-auto">
|
14 |
+
<form id="quotation-form" class="bg-white shadow-md rounded px-8 pt-6 pb-8 mb-4">
|
15 |
+
<fieldset class="border border-gray-300 p-4 mb-4">
|
16 |
+
<legend class="text-lg font-semibold mb-2">Your Company Details</legend>
|
17 |
+
<input type="text" id="company-name" name="company-name" placeholder="Company Name" required
|
18 |
+
class="w-full p-2 border border-gray-300 rounded mb-2">
|
19 |
+
<textarea id="company-address" name="company-address" placeholder="Address" required
|
20 |
+
class="w-full p-2 border border-gray-300 rounded mb-2"></textarea>
|
21 |
+
<input type="text" id="company-phone" name="company-phone" placeholder="Phone"
|
22 |
+
class="w-full p-2 border border-gray-300 rounded mb-2">
|
23 |
+
<input type="email" id="company-email" name="company-email" placeholder="Email"
|
24 |
+
class="w-full p-2 border border-gray-300 rounded mb-2">
|
25 |
+
<input type="text" id="company-gstin" name="company-gstin" placeholder="GSTIN"
|
26 |
+
class="w-full p-2 border border-gray-300 rounded">
|
27 |
</fieldset>
|
28 |
+
<fieldset class="border border-gray-300 p-4 mb-4">
|
29 |
+
<legend class="text-lg font-semibold mb-2">Customer Company Details</legend>
|
30 |
+
<input type="text" id="customer-name" name="customer-name" placeholder="Customer Name" required
|
31 |
+
class="w-full p-2 border border-gray-300 rounded mb-2">
|
32 |
+
<textarea id="customer-address" name="customer-address" placeholder="Address" required
|
33 |
+
class="w-full p-2 border border-gray-300 rounded mb-2"></textarea>
|
34 |
+
<input type="text" id="customer-phone" name="customer-phone" placeholder="Phone"
|
35 |
+
class="w-full p-2 border border-gray-300 rounded mb-2">
|
36 |
+
<input type="email" id="customer-email" name="customer-email" placeholder="Email"
|
37 |
+
class="w-full p-2 border border-gray-300 rounded mb-2">
|
38 |
+
<input type="text" id="customer-gstin" name="customer-gstin" placeholder="GSTIN"
|
39 |
+
class="w-full p-2 border border-gray-300 rounded">
|
40 |
</fieldset>
|
41 |
+
<fieldset class="border border-gray-300 p-4 mb-4">
|
42 |
+
<legend class="text-lg font-semibold mb-2">Quotation Details</legend>
|
43 |
+
<input type="text" id="quotation-number" name="quotation-number" placeholder="Quotation Number" required
|
44 |
+
class="w-full p-2 border border-gray-300 rounded mb-2">
|
45 |
+
<input type="date" id="quotation-date" name="quotation-date" required
|
46 |
+
class="w-full p-2 border border-gray-300 rounded">
|
47 |
</fieldset>
|
48 |
+
<fieldset class="border border-gray-300 p-4 mb-4">
|
49 |
+
<legend class="text-lg font-semibold mb-2">Items</legend>
|
50 |
+
<table id="items-table" class="w-full mb-2">
|
51 |
<thead>
|
52 |
+
<tr class="bg-gray-200">
|
53 |
+
<th class="p-2 border border-gray-300">S.No</th>
|
54 |
+
<th class="p-2 border border-gray-300">Description</th>
|
55 |
+
<th class="p-2 border border-gray-300">HSN Code</th>
|
56 |
+
<th class="p-2 border border-gray-300">Qty</th>
|
57 |
+
<th class="p-2 border border-gray-300">Unit Price</th>
|
58 |
+
<th class="p-2 border border-gray-300">Discount (%)</th>
|
59 |
+
<th class="p-2 border border-gray-300">Amount</th>
|
60 |
+
<th class="p-2 border border-gray-300"></th>
|
61 |
</tr>
|
62 |
</thead>
|
63 |
<tbody>
|
64 |
</tbody>
|
65 |
</table>
|
66 |
+
<button type="button" id="add-item"
|
67 |
+
class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">Add Item</button>
|
68 |
</fieldset>
|
69 |
+
<fieldset class="border border-gray-300 p-4 mb-4">
|
70 |
+
<legend class="text-lg font-semibold mb-2">Additional Charges</legend>
|
71 |
+
<label class="block mb-2">IGST (%)<input type="number" id="igst-rate" name="igst-rate" value="0" min="0"
|
72 |
+
class="w-full p-2 border border-gray-300 rounded"></label>
|
73 |
+
<label class="block">Freight Charges<input type="number" id="freight-charges" name="freight-charges" value="0"
|
74 |
+
min="0" class="w-full p-2 border border-gray-300 rounded"></label>
|
75 |
</fieldset>
|
76 |
+
<fieldset class="border border-gray-300 p-4 mb-4">
|
77 |
+
<legend class="text-lg font-semibold mb-2">Bank Details</legend>
|
78 |
+
<input type="text" id="bank-name" name="bank-name" placeholder="Bank Name" required
|
79 |
+
class="w-full p-2 border border-gray-300 rounded mb-2">
|
80 |
+
<input type="text" id="bank-account" name="bank-account" placeholder="Account Number" required
|
81 |
+
class="w-full p-2 border border-gray-300 rounded mb-2">
|
82 |
+
<input type="text" id="bank-ifsc" name="bank-ifsc" placeholder="IFSC Code" required
|
83 |
+
class="w-full p-2 border border-gray-300 rounded mb-2">
|
84 |
+
<input type="text" id="bank-branch" name="bank-branch" placeholder="Branch" required
|
85 |
+
class="w-full p-2 border border-gray-300 rounded">
|
86 |
</fieldset>
|
87 |
+
<button type="submit" class="bg-green-500 hover:bg-green-700 text-white font-bold py-2 px-4 rounded">Generate
|
88 |
+
Quotation</button>
|
89 |
</form>
|
90 |
</div>
|
91 |
<div id="quotation-output" style="display:none;"></div>
|
package-lock.json
CHANGED
The diff for this file is too large to render.
See raw diff
|
|
package.json
CHANGED
@@ -3,21 +3,20 @@
|
|
3 |
"version": "1.0.0",
|
4 |
"description": "Client-side quotation generator with linting setup",
|
5 |
"scripts": {
|
6 |
-
"prepare": "husky
|
|
|
|
|
7 |
"lint:js": "eslint script.js tests",
|
8 |
-
"lint
|
9 |
-
"lint:html": "htmlhint index.html",
|
10 |
-
"lint": "npm-run-all lint:html lint:css lint:js",
|
11 |
"test": "node tests/test.js"
|
12 |
},
|
13 |
"devDependencies": {
|
14 |
-
"eslint": "^
|
15 |
-
"
|
16 |
-
"
|
17 |
-
"
|
18 |
-
"
|
19 |
-
"stylelint": "^
|
20 |
-
"stylelint-config-standard": "^32.0.0"
|
21 |
},
|
22 |
"lint-staged": {
|
23 |
"*.js": [
|
@@ -25,9 +24,11 @@
|
|
25 |
],
|
26 |
"*.css": [
|
27 |
"stylelint --fix"
|
28 |
-
],
|
29 |
-
"*.html": [
|
30 |
-
"htmlhint"
|
31 |
]
|
|
|
|
|
|
|
|
|
|
|
32 |
}
|
33 |
}
|
|
|
3 |
"version": "1.0.0",
|
4 |
"description": "Client-side quotation generator with linting setup",
|
5 |
"scripts": {
|
6 |
+
"prepare": "husky",
|
7 |
+
"dev": "parcel index.html",
|
8 |
+
"build": "parcel build index.html",
|
9 |
"lint:js": "eslint script.js tests",
|
10 |
+
"lint": "npm run lint:js",
|
|
|
|
|
11 |
"test": "node tests/test.js"
|
12 |
},
|
13 |
"devDependencies": {
|
14 |
+
"eslint": "^9.3.0",
|
15 |
+
"husky": "^9.1.7",
|
16 |
+
"lint-staged": "^16.1.2",
|
17 |
+
"parcel": "^2.15.4",
|
18 |
+
"stylelint": "^16.21.0",
|
19 |
+
"stylelint-config-standard": "^38.0.0"
|
|
|
20 |
},
|
21 |
"lint-staged": {
|
22 |
"*.js": [
|
|
|
24 |
],
|
25 |
"*.css": [
|
26 |
"stylelint --fix"
|
|
|
|
|
|
|
27 |
]
|
28 |
+
},
|
29 |
+
"dependencies": {
|
30 |
+
"@tailwindcss/postcss": "^4.1.11",
|
31 |
+
"postcss": "^8.5.6",
|
32 |
+
"tailwindcss": "^4.1.11"
|
33 |
}
|
34 |
}
|
style.css
CHANGED
@@ -1,46 +1,4 @@
|
|
1 |
-
|
2 |
-
font-family: Arial, sans-serif;
|
3 |
-
margin: 20px;
|
4 |
-
}
|
5 |
-
|
6 |
-
fieldset {
|
7 |
-
margin-bottom: 15px;
|
8 |
-
border: 1px solid #ccc;
|
9 |
-
padding: 10px;
|
10 |
-
}
|
11 |
-
|
12 |
-
legend {
|
13 |
-
font-weight: bold;
|
14 |
-
}
|
15 |
-
|
16 |
-
input,
|
17 |
-
textarea {
|
18 |
-
width: 100%;
|
19 |
-
padding: 5px;
|
20 |
-
margin: 5px 0;
|
21 |
-
box-sizing: border-box;
|
22 |
-
}
|
23 |
-
|
24 |
-
#items-table,
|
25 |
-
.quotation-table {
|
26 |
-
width: 100%;
|
27 |
-
border-collapse: collapse;
|
28 |
-
margin-bottom: 10px;
|
29 |
-
}
|
30 |
-
|
31 |
-
#items-table th,
|
32 |
-
#items-table td,
|
33 |
-
.quotation-table th,
|
34 |
-
.quotation-table td {
|
35 |
-
border: 1px solid #ccc;
|
36 |
-
padding: 5px;
|
37 |
-
text-align: left;
|
38 |
-
}
|
39 |
-
|
40 |
-
button {
|
41 |
-
padding: 8px 12px;
|
42 |
-
margin: 5px;
|
43 |
-
}
|
44 |
|
45 |
.quotation-print {
|
46 |
max-width: 800px;
|
@@ -163,38 +121,3 @@ button {
|
|
163 |
margin-top: 20px;
|
164 |
font-weight: bold;
|
165 |
}
|
166 |
-
|
167 |
-
|
168 |
-
@media screen and (width <=768px) {
|
169 |
-
#items-table thead {
|
170 |
-
display: none;
|
171 |
-
}
|
172 |
-
|
173 |
-
#items-table,
|
174 |
-
#items-table tbody,
|
175 |
-
#items-table tr,
|
176 |
-
#items-table td {
|
177 |
-
display: block;
|
178 |
-
width: 100%;
|
179 |
-
}
|
180 |
-
|
181 |
-
#items-table tr {
|
182 |
-
margin-bottom: 15px;
|
183 |
-
}
|
184 |
-
|
185 |
-
#items-table td {
|
186 |
-
text-align: right;
|
187 |
-
padding-left: 50%;
|
188 |
-
position: relative;
|
189 |
-
}
|
190 |
-
|
191 |
-
#items-table td::before {
|
192 |
-
content: attr(data-label);
|
193 |
-
position: absolute;
|
194 |
-
left: 0;
|
195 |
-
width: 45%;
|
196 |
-
padding-left: 15px;
|
197 |
-
font-weight: bold;
|
198 |
-
text-align: left;
|
199 |
-
}
|
200 |
-
}
|
|
|
1 |
+
@import url("tailwindcss");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
3 |
.quotation-print {
|
4 |
max-width: 800px;
|
|
|
121 |
margin-top: 20px;
|
122 |
font-weight: bold;
|
123 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|