@datability/8ui 0.1.69 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/.prettierrc +8 -0
  2. package/.vscode/extensions.json +6 -0
  3. package/README.md +66 -18
  4. package/declaration.d.ts +10 -0
  5. package/docker-compose.yml +20 -0
  6. package/eslint.config.js +23 -0
  7. package/index.html +13 -0
  8. package/package.json +37 -36
  9. package/public/vite.svg +1 -0
  10. package/src/App.tsx +370 -0
  11. package/src/components/blackdrop/index.tsx +18 -0
  12. package/src/components/blackdrop/index.type.ts +7 -0
  13. package/src/components/button/index.tsx +44 -0
  14. package/src/components/button/index.type.ts +13 -0
  15. package/src/components/chip/index.tsx +39 -0
  16. package/src/components/chip/index.type.ts +12 -0
  17. package/src/components/context.tsx +26 -0
  18. package/src/components/divider/index.tsx +13 -0
  19. package/src/components/index.ts +62 -0
  20. package/{dist/components/Input/InputAutoComplete → src/components/input/input-auto-complete}/index.scss +1 -1
  21. package/src/components/input/input-auto-complete/index.tsx +140 -0
  22. package/src/components/input/input-auto-complete/index.type.tsx +13 -0
  23. package/src/components/input/input-base/index.tsx +39 -0
  24. package/src/components/input/input-base/index.type.tsx +13 -0
  25. package/src/components/input/input-basic/index.tsx +47 -0
  26. package/src/components/input/input-basic/index.type.tsx +8 -0
  27. package/src/components/input/input-checkbox/index.tsx +69 -0
  28. package/src/components/input/input-checkbox/index.type.tsx +11 -0
  29. package/src/components/input/input-date/index.tsx +354 -0
  30. package/src/components/input/input-date/index.type.tsx +11 -0
  31. package/src/components/input/input-date-range/index.tsx +284 -0
  32. package/src/components/input/input-date-range/index.type.tsx +11 -0
  33. package/src/components/input/input-date-time/index.tsx +367 -0
  34. package/src/components/input/input-date-time/index.type.tsx +11 -0
  35. package/src/components/input/input-number/index.tsx +118 -0
  36. package/src/components/input/input-number/index.type.tsx +11 -0
  37. package/src/components/input/input-password/index.tsx +60 -0
  38. package/src/components/input/input-password/index.type.tsx +8 -0
  39. package/src/components/input/input-radio/index.tsx +72 -0
  40. package/src/components/input/input-radio/index.type.tsx +12 -0
  41. package/{dist/components/Input/InputSelect → src/components/input/input-select}/index.scss +1 -1
  42. package/src/components/input/input-select/index.tsx +113 -0
  43. package/src/components/input/input-select/index.type.tsx +15 -0
  44. package/{dist/components/InputNonContext/InputSwitch → src/components/input/input-switch}/index.scss +1 -1
  45. package/src/components/input/input-switch/index.tsx +44 -0
  46. package/src/components/input/input-switch/index.type.tsx +4 -0
  47. package/src/components/input/input-textarea/index.tsx +48 -0
  48. package/src/components/input/input-textarea/index.type.tsx +10 -0
  49. package/src/components/menu/index.tsx +136 -0
  50. package/src/components/menu/index.type.ts +8 -0
  51. package/{dist/components/Modal → src/components/modal}/index.scss +0 -0
  52. package/src/components/modal/index.tsx +99 -0
  53. package/src/components/modal/index.type.tsx +8 -0
  54. package/src/index.scss +44 -0
  55. package/src/index.ts +62 -0
  56. package/src/logoDownload.svg +3 -0
  57. package/src/main.tsx +9 -0
  58. package/tsconfig.app.json +28 -0
  59. package/tsconfig.json +42 -0
  60. package/tsconfig.node.json +29 -0
  61. package/vite.config.d.ts +2 -0
  62. package/vite.config.ts +35 -0
  63. package/dist/components/Blackdrop/index.d.ts +0 -5
  64. package/dist/components/Blackdrop/index.js +0 -11
  65. package/dist/components/Blackdrop/index.js.map +0 -1
  66. package/dist/components/Blackdrop/index.type.d.ts +0 -6
  67. package/dist/components/Blackdrop/index.type.js +0 -2
  68. package/dist/components/Blackdrop/index.type.js.map +0 -1
  69. package/dist/components/Button/index.d.ts +0 -5
  70. package/dist/components/Button/index.js +0 -16
  71. package/dist/components/Button/index.js.map +0 -1
  72. package/dist/components/Button/index.type.d.ts +0 -12
  73. package/dist/components/Button/index.type.js +0 -2
  74. package/dist/components/Button/index.type.js.map +0 -1
  75. package/dist/components/Chip/index.d.ts +0 -5
  76. package/dist/components/Chip/index.js +0 -18
  77. package/dist/components/Chip/index.js.map +0 -1
  78. package/dist/components/Chip/index.type.d.ts +0 -9
  79. package/dist/components/Chip/index.type.js +0 -2
  80. package/dist/components/Chip/index.type.js.map +0 -1
  81. package/dist/components/Divider/index.d.ts +0 -4
  82. package/dist/components/Divider/index.js +0 -10
  83. package/dist/components/Divider/index.js.map +0 -1
  84. package/dist/components/Input/InputAutoComplete/index.d.ts +0 -5
  85. package/dist/components/Input/InputAutoComplete/index.js +0 -68
  86. package/dist/components/Input/InputAutoComplete/index.js.map +0 -1
  87. package/dist/components/Input/InputAutoComplete/index.type.d.ts +0 -12
  88. package/dist/components/Input/InputAutoComplete/index.type.js +0 -2
  89. package/dist/components/Input/InputAutoComplete/index.type.js.map +0 -1
  90. package/dist/components/Input/InputBase/index.d.ts +0 -5
  91. package/dist/components/Input/InputBase/index.js +0 -23
  92. package/dist/components/Input/InputBase/index.js.map +0 -1
  93. package/dist/components/Input/InputBase/index.type.d.ts +0 -9
  94. package/dist/components/Input/InputBase/index.type.js +0 -2
  95. package/dist/components/Input/InputBase/index.type.js.map +0 -1
  96. package/dist/components/Input/InputBasic/index.d.ts +0 -5
  97. package/dist/components/Input/InputBasic/index.js +0 -16
  98. package/dist/components/Input/InputBasic/index.js.map +0 -1
  99. package/dist/components/Input/InputBasic/index.type.d.ts +0 -10
  100. package/dist/components/Input/InputBasic/index.type.js +0 -2
  101. package/dist/components/Input/InputBasic/index.type.js.map +0 -1
  102. package/dist/components/Input/InputCheckbox/index.d.ts +0 -5
  103. package/dist/components/Input/InputCheckbox/index.js +0 -19
  104. package/dist/components/Input/InputCheckbox/index.js.map +0 -1
  105. package/dist/components/Input/InputCheckbox/index.type.d.ts +0 -11
  106. package/dist/components/Input/InputCheckbox/index.type.js +0 -2
  107. package/dist/components/Input/InputCheckbox/index.type.js.map +0 -1
  108. package/dist/components/Input/InputDate/index.d.ts +0 -23
  109. package/dist/components/Input/InputDate/index.js +0 -190
  110. package/dist/components/Input/InputDate/index.js.map +0 -1
  111. package/dist/components/Input/InputDate/index.type.d.ts +0 -11
  112. package/dist/components/Input/InputDate/index.type.js +0 -2
  113. package/dist/components/Input/InputDate/index.type.js.map +0 -1
  114. package/dist/components/Input/InputDateRange/index.d.ts +0 -5
  115. package/dist/components/Input/InputDateRange/index.js +0 -137
  116. package/dist/components/Input/InputDateRange/index.js.map +0 -1
  117. package/dist/components/Input/InputDateRange/index.type.d.ts +0 -11
  118. package/dist/components/Input/InputDateRange/index.type.js +0 -2
  119. package/dist/components/Input/InputDateRange/index.type.js.map +0 -1
  120. package/dist/components/Input/InputDateTime/index.d.ts +0 -5
  121. package/dist/components/Input/InputDateTime/index.js +0 -185
  122. package/dist/components/Input/InputDateTime/index.js.map +0 -1
  123. package/dist/components/Input/InputDateTime/index.type.d.ts +0 -11
  124. package/dist/components/Input/InputDateTime/index.type.js +0 -2
  125. package/dist/components/Input/InputDateTime/index.type.js.map +0 -1
  126. package/dist/components/Input/InputNumber/index.d.ts +0 -5
  127. package/dist/components/Input/InputNumber/index.js +0 -78
  128. package/dist/components/Input/InputNumber/index.js.map +0 -1
  129. package/dist/components/Input/InputNumber/index.type.d.ts +0 -10
  130. package/dist/components/Input/InputNumber/index.type.js +0 -2
  131. package/dist/components/Input/InputNumber/index.type.js.map +0 -1
  132. package/dist/components/Input/InputPassword/index.d.ts +0 -5
  133. package/dist/components/Input/InputPassword/index.js +0 -21
  134. package/dist/components/Input/InputPassword/index.js.map +0 -1
  135. package/dist/components/Input/InputPassword/index.type.d.ts +0 -8
  136. package/dist/components/Input/InputPassword/index.type.js +0 -2
  137. package/dist/components/Input/InputPassword/index.type.js.map +0 -1
  138. package/dist/components/Input/InputRadio/index.d.ts +0 -5
  139. package/dist/components/Input/InputRadio/index.js +0 -31
  140. package/dist/components/Input/InputRadio/index.js.map +0 -1
  141. package/dist/components/Input/InputRadio/index.type.d.ts +0 -12
  142. package/dist/components/Input/InputRadio/index.type.js +0 -2
  143. package/dist/components/Input/InputRadio/index.type.js.map +0 -1
  144. package/dist/components/Input/InputSelect/index.d.ts +0 -5
  145. package/dist/components/Input/InputSelect/index.js +0 -45
  146. package/dist/components/Input/InputSelect/index.js.map +0 -1
  147. package/dist/components/Input/InputSelect/index.type.d.ts +0 -14
  148. package/dist/components/Input/InputSelect/index.type.js +0 -2
  149. package/dist/components/Input/InputSelect/index.type.js.map +0 -1
  150. package/dist/components/Input/InputTextarea/index.d.ts +0 -5
  151. package/dist/components/Input/InputTextarea/index.js +0 -16
  152. package/dist/components/Input/InputTextarea/index.js.map +0 -1
  153. package/dist/components/Input/InputTextarea/index.type.d.ts +0 -10
  154. package/dist/components/Input/InputTextarea/index.type.js +0 -2
  155. package/dist/components/Input/InputTextarea/index.type.js.map +0 -1
  156. package/dist/components/InputNonContext/InputSwitch/index.d.ts +0 -5
  157. package/dist/components/InputNonContext/InputSwitch/index.js +0 -19
  158. package/dist/components/InputNonContext/InputSwitch/index.js.map +0 -1
  159. package/dist/components/InputNonContext/InputSwitch/index.type.d.ts +0 -6
  160. package/dist/components/InputNonContext/InputSwitch/index.type.js +0 -2
  161. package/dist/components/InputNonContext/InputSwitch/index.type.js.map +0 -1
  162. package/dist/components/Menu/index.d.ts +0 -5
  163. package/dist/components/Menu/index.js +0 -103
  164. package/dist/components/Menu/index.js.map +0 -1
  165. package/dist/components/Menu/index.type.d.ts +0 -11
  166. package/dist/components/Menu/index.type.js +0 -2
  167. package/dist/components/Menu/index.type.js.map +0 -1
  168. package/dist/components/Modal/index.d.ts +0 -5
  169. package/dist/components/Modal/index.js +0 -83
  170. package/dist/components/Modal/index.js.map +0 -1
  171. package/dist/components/Modal/index.type.d.ts +0 -7
  172. package/dist/components/Modal/index.type.js +0 -2
  173. package/dist/components/Modal/index.type.js.map +0 -1
  174. package/dist/components/context.d.ts +0 -8
  175. package/dist/components/context.js +0 -12
  176. package/dist/components/context.js.map +0 -1
  177. package/dist/components/index.d.ts +0 -41
  178. package/dist/components/index.js +0 -21
  179. package/dist/components/index.js.map +0 -1
  180. /package/{dist → src}/components/assets/closed.svg +0 -0
  181. /package/{dist/components/assets/expandArrow.svg → src/components/assets/expand-arrow.svg} +0 -0
  182. /package/{dist/components/assets/visibilityOff.svg → src/components/assets/visibility-off.svg} +0 -0
  183. /package/{dist → src}/components/assets/visibility.svg +0 -0
  184. /package/{dist/components/Blackdrop → src/components/blackdrop}/index.scss +0 -0
  185. /package/{dist/components/Button → src/components/button}/index.scss +0 -0
  186. /package/{dist/components/Chip → src/components/chip}/index.scss +0 -0
  187. /package/{dist/components/Divider → src/components/divider}/index.scss +0 -0
  188. /package/{dist/components/Input → src/components/input}/extend.scss +0 -0
  189. /package/{dist/components/Input/InputBase → src/components/input/input-base}/index.scss +0 -0
  190. /package/{dist/components/Input/InputBasic → src/components/input/input-basic}/index.scss +0 -0
  191. /package/{dist/components/Input/InputCheckbox → src/components/input/input-checkbox}/index.scss +0 -0
  192. /package/{dist/components/Input/InputDate → src/components/input/input-date}/index.scss +0 -0
  193. /package/{dist/components/Input/InputDateRange → src/components/input/input-date-range}/index.scss +0 -0
  194. /package/{dist/components/Input/InputDateTime → src/components/input/input-date-time}/index.scss +0 -0
  195. /package/{dist/components/Input/InputNumber → src/components/input/input-number}/index.scss +0 -0
  196. /package/{dist/components/Input/InputPassword → src/components/input/input-password}/index.scss +0 -0
  197. /package/{dist/components/Input/InputRadio → src/components/input/input-radio}/index.scss +0 -0
  198. /package/{dist/components/Input/InputTextarea → src/components/input/input-textarea}/index.scss +0 -0
  199. /package/{dist/components/Menu → src/components/menu}/index.scss +0 -0
package/.prettierrc ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "semi": false,
3
+ "trailingComma": "all",
4
+ "singleQuote": false,
5
+ "printWidth": 120,
6
+ "tabWidth": 2,
7
+ "endOfLine": "auto"
8
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "recommendations": [
3
+ "esbenp.prettier-vscode",
4
+ "dbaeumer.vscode-eslint"
5
+ ]
6
+ }
package/README.md CHANGED
@@ -1,25 +1,73 @@
1
- <br />
2
- <div align="center">
3
- <img src="https://s3.ap-southeast-1.amazonaws.com/datability.info/logo-datability.svg" alt="Logo" width="350">
4
- <br />
5
- <br />
6
- <h1>Datability UI</h1>
7
- </div>
1
+ # React + TypeScript + Vite
8
2
 
9
- **Datability UI** contains foundational React UI component base libraries.
3
+ This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
10
4
 
11
- <div align="center">
5
+ Currently, two official plugins are available:
12
6
 
13
- [![npm latest package](https://img.shields.io/npm/v/@datability/8ui/latest.svg)](https://www.npmjs.com/package/@datability/8ui)
14
- [![npm next package](https://img.shields.io/npm/v/@datability/8ui/next.svg)](https://www.npmjs.com/package/@datability/8ui)
15
- [![npm downloads](https://img.shields.io/npm/dm/@datability/8ui.svg)](https://www.npmjs.com/package/@datability/8ui)
7
+ - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh
8
+ - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
16
9
 
17
- </div>
10
+ ## React Compiler
18
11
 
19
- # Documentation
20
- ...
12
+ The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).
21
13
 
22
- # Examples
23
- ...
14
+ ## Expanding the ESLint configuration
24
15
 
25
- <br>
16
+ If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
17
+
18
+ ```js
19
+ export default defineConfig([
20
+ globalIgnores(['dist']),
21
+ {
22
+ files: ['**/*.{ts,tsx}'],
23
+ extends: [
24
+ // Other configs...
25
+
26
+ // Remove tseslint.configs.recommended and replace with this
27
+ tseslint.configs.recommendedTypeChecked,
28
+ // Alternatively, use this for stricter rules
29
+ tseslint.configs.strictTypeChecked,
30
+ // Optionally, add this for stylistic rules
31
+ tseslint.configs.stylisticTypeChecked,
32
+
33
+ // Other configs...
34
+ ],
35
+ languageOptions: {
36
+ parserOptions: {
37
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
38
+ tsconfigRootDir: import.meta.dirname,
39
+ },
40
+ // other options...
41
+ },
42
+ },
43
+ ])
44
+ ```
45
+
46
+ You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
47
+
48
+ ```js
49
+ // eslint.config.js
50
+ import reactX from 'eslint-plugin-react-x'
51
+ import reactDom from 'eslint-plugin-react-dom'
52
+
53
+ export default defineConfig([
54
+ globalIgnores(['dist']),
55
+ {
56
+ files: ['**/*.{ts,tsx}'],
57
+ extends: [
58
+ // Other configs...
59
+ // Enable lint rules for React
60
+ reactX.configs['recommended-typescript'],
61
+ // Enable lint rules for React DOM
62
+ reactDom.configs.recommended,
63
+ ],
64
+ languageOptions: {
65
+ parserOptions: {
66
+ project: ['./tsconfig.node.json', './tsconfig.app.json'],
67
+ tsconfigRootDir: import.meta.dirname,
68
+ },
69
+ // other options...
70
+ },
71
+ },
72
+ ])
73
+ ```
@@ -0,0 +1,10 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ declare module "*.scss" {
3
+ const content: Record<string, string>
4
+ export default content
5
+ }
6
+
7
+ declare module "*.svg" {
8
+ const content: any
9
+ export default content
10
+ }
@@ -0,0 +1,20 @@
1
+ services:
2
+ frontend:
3
+ container_name: npm-fe
4
+ image: node:20
5
+ volumes:
6
+ - .:/workdir
7
+ working_dir: /workdir
8
+ ports:
9
+ - 4000:3000
10
+ # command: >
11
+ # bash -c "
12
+ # npm install &&
13
+ # npm run dev
14
+ # "
15
+ command: >
16
+ bash -c "
17
+ npm install &&
18
+ npm run build &&
19
+ npm run preview
20
+ "
@@ -0,0 +1,23 @@
1
+ import js from '@eslint/js'
2
+ import globals from 'globals'
3
+ import reactHooks from 'eslint-plugin-react-hooks'
4
+ import reactRefresh from 'eslint-plugin-react-refresh'
5
+ import tseslint from 'typescript-eslint'
6
+ import { defineConfig, globalIgnores } from 'eslint/config'
7
+
8
+ export default defineConfig([
9
+ globalIgnores(['dist']),
10
+ {
11
+ files: ['**/*.{ts,tsx}'],
12
+ extends: [
13
+ js.configs.recommended,
14
+ tseslint.configs.recommended,
15
+ reactHooks.configs.flat.recommended,
16
+ reactRefresh.configs.vite,
17
+ ],
18
+ languageOptions: {
19
+ ecmaVersion: 2020,
20
+ globals: globals.browser,
21
+ },
22
+ },
23
+ ])
package/index.html ADDED
@@ -0,0 +1,13 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>8ui</title>
8
+ </head>
9
+ <body>
10
+ <div id="root"></div>
11
+ <script type="module" src="/src/main.tsx"></script>
12
+ </body>
13
+ </html>
package/package.json CHANGED
@@ -1,46 +1,47 @@
1
1
  {
2
2
  "name": "@datability/8ui",
3
- "version": "0.1.69",
4
- "description": "",
5
- "main": "dist/components/index.js",
6
- "types": "dist/components/index.d.ts",
7
- "author": "Datability",
8
- "license": "ISC",
9
- "keywords": [],
3
+ "version": "1.1.0",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": {
7
+ "types": "./dist/types/index.d.ts",
8
+ "import": "./dist/index.es.js",
9
+ "require": "./dist/index.umd.js"
10
+ },
11
+ "./dist/index.css": "./dist/index.css",
12
+ "./style.css": "./dist/index.css"
13
+ },
10
14
  "scripts": {
11
- "start": "react-scripts start",
15
+ "dev": "vite",
16
+ "build": "vite build && npm run cp-scss && npm run cp-scss-2 && npm run cp-svg",
17
+ "lint": "eslint .",
18
+ "preview": "vite preview",
12
19
  "cp-svg": "copyfiles -u 1 src/components/**/*.svg dist/",
13
20
  "cp-scss": "copyfiles -u 1 src/components/**/*.scss dist/",
14
- "cp-scss-2": "copyfiles -u 1 src/components/**/**/*.scss dist/",
15
- "build": "rm -rf dist/ && tsc && npm run cp-scss && npm run cp-scss-2 && npm run cp-svg"
21
+ "cp-scss-2": "copyfiles -u 1 src/components/**/**/*.scss dist/"
16
22
  },
17
- "files": [
18
- "/dist"
19
- ],
20
- "dependencies": {
21
- "copyfiles": "^2.4.1",
22
- "formik": "^2.4.6",
23
- "prettier": "^3.2.5",
24
- "react-scripts": "^5.0.1",
25
- "sass": "^1.77.0",
26
- "sass-loader": "^14.2.1"
23
+ "peerDependencies": {
24
+ "@hookform/resolvers": "^5.2.2",
25
+ "react": "^19.2.0",
26
+ "react-dom": "^19.2.0",
27
+ "react-hook-form": "^7.71.1",
28
+ "zod": "^4.3.6"
27
29
  },
28
30
  "devDependencies": {
29
- "@types/react": "^18.3.1",
30
- "@types/react-dom": "^18.3.0",
31
- "react": "^18.3.1",
32
- "react-dom": "^18.3.1"
33
- },
34
- "browserslist": {
35
- "production": [
36
- ">0.2%",
37
- "not dead",
38
- "not op_mini all"
39
- ],
40
- "development": [
41
- "last 1 chrome version",
42
- "last 1 firefox version",
43
- "last 1 safari version"
44
- ]
31
+ "@eslint/js": "^9.39.1",
32
+ "@types/node": "^24.10.1",
33
+ "@types/react": "^19.2.5",
34
+ "@types/react-dom": "^19.2.3",
35
+ "@vitejs/plugin-react": "^5.1.1",
36
+ "copyfiles": "^2.4.1",
37
+ "eslint": "^9.39.1",
38
+ "eslint-plugin-react-hooks": "^7.0.1",
39
+ "eslint-plugin-react-refresh": "^0.4.24",
40
+ "globals": "^16.5.0",
41
+ "sass": "^1.97.3",
42
+ "typescript": "~5.9.3",
43
+ "typescript-eslint": "^8.46.4",
44
+ "vite": "^7.2.4",
45
+ "vite-plugin-dts": "^4.5.4"
45
46
  }
46
47
  }
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
package/src/App.tsx ADDED
@@ -0,0 +1,370 @@
1
+ import { useState } from "react"
2
+ import {
3
+ Blackdrop,
4
+ Button,
5
+ Chip,
6
+ Divider,
7
+ Input,
8
+ InputNumber,
9
+ InputAutoComplete,
10
+ InputCheckbox,
11
+ InputPassword,
12
+ InputRadio,
13
+ InputSelect,
14
+ InputTextarea,
15
+ InputSwitch,
16
+ Menu,
17
+ Modal,
18
+ InputDate,
19
+ InputDateTime,
20
+ InputDateRange,
21
+ } from "./index"
22
+ import { DBuiProvider } from "./components/context"
23
+ import "./index.scss"
24
+ import LogoSVG from "./logoDownload.svg"
25
+ import { FormProvider, useForm } from "react-hook-form"
26
+ import z from "zod"
27
+ import { zodResolver } from "@hookform/resolvers/zod"
28
+
29
+ function App() {
30
+ const [isOpenBlackDrop, setIsOpenBackDrop] = useState(false)
31
+ const [isOpenModal, setIsOpenModal] = useState(false)
32
+ const [isLoading, setIsLoading] = useState(false)
33
+
34
+ const schema = z.object({
35
+ input: z.string().min(1, "too short"),
36
+ inputNumber: z.number().min(0, "not enough").max(2000, "too much"),
37
+ inputPhoneNumber: z.string().min(10, "too short").max(10, "too long"),
38
+ inputNumberMinus: z.number().min(-2000, "not enough").max(0, "too much"),
39
+ inputCheckbox: z.array(z.string()).min(1, "Please select at least one option"),
40
+ inputPassword: z.string().min(1, "Please enter"),
41
+ inputRadio: z.string().min(1, "Please enter"),
42
+ inputTextarea: z.string().min(1, "Please enter"),
43
+ inputSwitch: z.string(),
44
+ inputSelect: z.string().min(1, "Please select"),
45
+ inputAutoComplete: z.array(z.string()).min(1, "Please select").max(1),
46
+ inputAutoCompleteMultiple: z.array(z.string()).min(1, "Please select"),
47
+ inputDate: z.string().min(1, "Please enter"),
48
+ inputDateRange: z.array(z.string()).min(2, "Please select"),
49
+ inputDateTime: z.string().min(1, "Please enter"),
50
+ })
51
+
52
+ type FormValues = z.infer<typeof schema>
53
+ const methods = useForm<FormValues>({
54
+ defaultValues: {
55
+ input: "",
56
+ inputNumber: 0,
57
+ inputPhoneNumber: "",
58
+ inputNumberMinus: -0,
59
+ inputCheckbox: [],
60
+ inputPassword: "",
61
+ inputRadio: "",
62
+ inputTextarea: "",
63
+ inputSwitch: "",
64
+ inputSelect: "",
65
+ inputAutoComplete: [],
66
+ inputAutoCompleteMultiple: [],
67
+ inputDate: "",
68
+ inputDateRange: ["", ""], // ['2025-01-01', "2025-01-02"]
69
+ inputDateTime: "", // '2025-01-01T00:00',
70
+ },
71
+ mode: "onSubmit",
72
+ resolver: zodResolver(schema),
73
+ })
74
+
75
+ const onSubmit = (data: FormValues) => {
76
+ console.log("Submit", data)
77
+ }
78
+
79
+ return (
80
+ <DBuiProvider>
81
+ <FormProvider {...methods}>
82
+ <form onSubmit={methods.handleSubmit(onSubmit)}>
83
+ <div className="column">
84
+ <div className="column align-center">
85
+ <h1>Button</h1>
86
+ <div className="row gap-sm">
87
+ <Button name="Button" type="submit" />
88
+ <Button name="Button" disabled />
89
+ <Button name="Button" endIcon={LogoSVG} />
90
+ <Button
91
+ name="Asyc Action"
92
+ isLoading={isLoading}
93
+ onClick={() => {
94
+ console.log("!Click")
95
+ setIsLoading(true)
96
+ setTimeout(() => {
97
+ setIsLoading(false)
98
+ }, 2000)
99
+ }}
100
+ />
101
+ </div>
102
+ </div>
103
+
104
+ <br />
105
+ <Divider />
106
+
107
+ <div className="column align-center">
108
+ <h1>Divider</h1>
109
+ <div className="row gap-sm">
110
+ <Divider />
111
+ </div>
112
+ </div>
113
+
114
+ <br />
115
+ <Divider />
116
+
117
+ <div className="column align-center">
118
+ <h1>Blackdrop</h1>
119
+ <div className="row gap-sm">
120
+ <Button name="Open" onClick={() => setIsOpenBackDrop(true)} />
121
+ <Blackdrop open={isOpenBlackDrop} onClose={() => setIsOpenBackDrop(false)}>
122
+ <Button name="Close" onClick={() => setIsOpenBackDrop(false)} />
123
+ <Button
124
+ name="TEST print console"
125
+ onClick={(e) => {
126
+ e.stopPropagation()
127
+ console.log("TEST")
128
+ }}
129
+ />
130
+ </Blackdrop>
131
+ </div>
132
+ </div>
133
+
134
+ <br />
135
+ <Divider />
136
+
137
+ <div className="column align-center">
138
+ <h1>Chip</h1>
139
+ <div className="row gap-sm">
140
+ <Chip label="Chip" />
141
+ <Chip label="Chip" icon={LogoSVG} />
142
+ <Chip label="Chip" onDelete={() => console.log("delete")} />
143
+ </div>
144
+ </div>
145
+
146
+ <br />
147
+ <Divider />
148
+
149
+ <div className="column align-center">
150
+ <h1>Input</h1>
151
+ <div className="row gap-sm">
152
+ <Input name="input" label="Input" placeholder="placeholder" require />
153
+ </div>
154
+ </div>
155
+
156
+ <div className="column align-center">
157
+ <h1>Input Number</h1>
158
+ <div className="row gap-sm">
159
+ <InputNumber require name="inputNumber" label="Input Number" placeholder="placeholder" />
160
+ <InputNumber
161
+ require
162
+ name="inputPhoneNumber"
163
+ label="Input Phone Number"
164
+ placeholder="placeholder"
165
+ isPhoneNumber
166
+ />
167
+ <InputNumber
168
+ require
169
+ name="inputNumberMinus"
170
+ label="Input Phone Number"
171
+ placeholder="placeholder"
172
+ isAvailableMinus
173
+ />
174
+ </div>
175
+ </div>
176
+
177
+ <div className="column align-center">
178
+ <h1>Input Checkbox</h1>
179
+ <div className="row gap-sm">
180
+ <InputCheckbox
181
+ require
182
+ name="inputCheckbox"
183
+ label="Input Checkbox"
184
+ options={[
185
+ { label: "Mac", value: "mac" },
186
+ { label: "Win", value: "win" },
187
+ ]}
188
+ />
189
+ </div>
190
+ </div>
191
+
192
+ <div className="column align-center">
193
+ <h1>Input Password</h1>
194
+ <div className="row gap-sm">
195
+ <InputPassword name="inputPassword" label="Input Password" require />
196
+ </div>
197
+ </div>
198
+
199
+ <div className="column align-center">
200
+ <h1>Input Radio</h1>
201
+ <div className="row gap-sm">
202
+ <InputRadio
203
+ name="inputRadio"
204
+ label="Input Password"
205
+ options={[
206
+ {
207
+ label: "Mac",
208
+ value: "mac",
209
+ },
210
+ {
211
+ label: "Win",
212
+ value: "win",
213
+ },
214
+ ]}
215
+ require
216
+ />
217
+ </div>
218
+ </div>
219
+
220
+ <div className="column align-center">
221
+ <h1>Input Textarea</h1>
222
+ <div className="row gap-sm">
223
+ <InputTextarea name="inputTextarea" label="Input Textarea" require />
224
+ </div>
225
+ </div>
226
+
227
+ <div className="column align-center">
228
+ <h1>Input Switch</h1>
229
+ <div className="row gap-sm">
230
+ <InputSwitch name="inputSwitch" />
231
+ </div>
232
+ </div>
233
+
234
+ <div className="column align-center">
235
+ <h1>Input Select</h1>
236
+ <div className="row gap-sm">
237
+ <InputSelect
238
+ placeholder="placeholder"
239
+ name="inputSelect"
240
+ label="Input Select"
241
+ require
242
+ options={[
243
+ {
244
+ label: "Mac",
245
+ value: "MAC",
246
+ },
247
+ { label: "Win", value: "WIN" },
248
+ ]}
249
+ />
250
+ </div>
251
+ </div>
252
+
253
+ <div className="column align-center">
254
+ <h1>Input AutoComplete</h1>
255
+ <div className="row gap-sm">
256
+ <InputAutoComplete
257
+ name="inputAutoComplete"
258
+ label="Input AutoComplete"
259
+ require
260
+ options={[
261
+ { label: "Mac", value: "MAC" },
262
+ { label: "Win", value: "WIN" },
263
+ ]}
264
+ />
265
+ <InputAutoComplete
266
+ name="inputAutoCompleteMultiple"
267
+ label="Input AutoComplete Multiple"
268
+ require
269
+ options={[
270
+ { label: "Mac", value: "MAC" },
271
+ { label: "Win", value: "WIN" },
272
+ ]}
273
+ isMultiple
274
+ />
275
+ </div>
276
+ </div>
277
+
278
+ <div className="column align-center">
279
+ <h1>Input Date</h1>
280
+ <div className="row gap-sm">
281
+ <InputDate name="inputDate" label="Input Date" disabled isHideClearIcon={false} />
282
+ <InputDate name="inputDate" label="Input Date" require isHideClearIcon={false} />
283
+ <InputDate name="inputDate" label="Input Date" placeholder="placeholder" isHideClearIcon={false} />
284
+ <InputDate
285
+ name="inputDate"
286
+ label="Input Date"
287
+ fullWidth
288
+ isHideClearIcon={false}
289
+ minYear={2560}
290
+ maxYear={2570}
291
+ />
292
+ </div>
293
+ </div>
294
+
295
+ <div className="column align-center">
296
+ <h1>Input Date Range</h1>
297
+ <div className="row gap-sm">
298
+ <InputDateRange name="inputDateRange" label="Input Date Range" fullWidth isHideClearIcon={false} />
299
+ </div>
300
+ </div>
301
+
302
+ <div className="column align-center">
303
+ <h1>Input Date Time</h1>
304
+ <div className="row gap-sm">
305
+ <InputDateTime name="inputDateTime" label="Input Date Time" disabled />
306
+ <InputDateTime name="inputDateTime" label="Input Date Time" require />
307
+ <InputDateTime name="inputDateTime" label="Input Date Time" placeholder="placeholder" />
308
+ <InputDateTime name="inputDateTime" label="Input Date Time" fullWidth isHideClearIcon={false} />
309
+ </div>
310
+ </div>
311
+
312
+ <br />
313
+ <Divider />
314
+
315
+ <div className="column align-center">
316
+ <h1>Menu</h1>
317
+ <div className="row gap-sm">
318
+ <Menu trigger={() => <Button name="Click" />}>
319
+ {({ close }) =>
320
+ [
321
+ {
322
+ label:
323
+ "ExportExportExportExportExportExportExportExportExportExportExportExportExportExportExportExportExportExportExportExportExportExport",
324
+ onClick: () => {
325
+ console.log("Click Export!")
326
+ close()
327
+ },
328
+ },
329
+ {
330
+ label: "Export",
331
+ onClick: () => {
332
+ console.log("Click Export!")
333
+ close()
334
+ },
335
+ },
336
+ ].map((data, index) => {
337
+ return (
338
+ <p key={index} onClick={() => data.onClick()}>
339
+ {data.label}
340
+ </p>
341
+ )
342
+ })
343
+ }
344
+ </Menu>
345
+ </div>
346
+ </div>
347
+
348
+ <br />
349
+ <Divider />
350
+
351
+ <div className="column align-center">
352
+ <h1>Modal</h1>
353
+ <div className="row gap-sm">
354
+ <Button name="Open" onClick={() => setIsOpenModal(true)} />
355
+ <Modal id="modalTest" open={isOpenModal} onClose={() => setIsOpenModal(false)}>
356
+ <div>
357
+ <h4>Modal Parent</h4>
358
+ <p>Description</p>
359
+ </div>
360
+ </Modal>
361
+ </div>
362
+ </div>
363
+ </div>
364
+ </form>
365
+ </FormProvider>
366
+ </DBuiProvider>
367
+ )
368
+ }
369
+
370
+ export default App
@@ -0,0 +1,18 @@
1
+ // Lib
2
+ import React, { type JSX } from "react"
3
+
4
+ // Images
5
+
6
+ // Include in project
7
+ import "./index.scss"
8
+ import type { PropsBlackdrop } from "./index.type"
9
+
10
+ const Blackdrop: React.FC<PropsBlackdrop> = ({ children, open, onClose }): JSX.Element => {
11
+ return (
12
+ <div className="DBui-blackdrop" data-hidden={!open} onClick={onClose}>
13
+ {children}
14
+ </div>
15
+ )
16
+ }
17
+
18
+ export default Blackdrop
@@ -0,0 +1,7 @@
1
+ import type { JSX } from "react"
2
+
3
+ export type PropsBlackdrop = {
4
+ children: JSX.Element | JSX.Element[]
5
+ open: boolean
6
+ onClose?: () => void
7
+ }