@abstraks-dev/ui-library 1.0.1
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.
- package/LICENSE +21 -0
- package/README.md +708 -0
- package/dist/__tests__/Anchor.test.js +145 -0
- package/dist/__tests__/ArrowRight.test.js +91 -0
- package/dist/__tests__/Avatar.test.js +123 -0
- package/dist/__tests__/Button.test.js +82 -0
- package/dist/__tests__/Card.test.js +198 -0
- package/dist/__tests__/CheckCircle.test.js +98 -0
- package/dist/__tests__/Checkbox.test.js +161 -0
- package/dist/__tests__/ChevronDown.test.js +73 -0
- package/dist/__tests__/Close.test.js +98 -0
- package/dist/__tests__/EditSquare.test.js +99 -0
- package/dist/__tests__/Error.test.js +74 -0
- package/dist/__tests__/Footer.test.js +66 -0
- package/dist/__tests__/Heading.test.js +227 -0
- package/dist/__tests__/Hero.test.js +74 -0
- package/dist/__tests__/Label.test.js +123 -0
- package/dist/__tests__/Loader.test.js +115 -0
- package/dist/__tests__/MenuHover.test.js +137 -0
- package/dist/__tests__/Paragraph.test.js +93 -0
- package/dist/__tests__/PlusCircle.test.js +99 -0
- package/dist/__tests__/Radio.test.js +153 -0
- package/dist/__tests__/Select.test.js +187 -0
- package/dist/__tests__/Tabs.test.js +162 -0
- package/dist/__tests__/TextArea.test.js +127 -0
- package/dist/__tests__/TextInput.test.js +181 -0
- package/dist/__tests__/Toggle.test.js +120 -0
- package/dist/__tests__/TrashX.test.js +99 -0
- package/dist/__tests__/useHeadingAccessibility.test.js +144 -0
- package/dist/components/Anchor.js +131 -0
- package/dist/components/Animation.js +129 -0
- package/dist/components/AnimationGroup.js +207 -0
- package/dist/components/AnimationToggle.js +216 -0
- package/dist/components/Avatar.js +153 -0
- package/dist/components/Button.js +218 -0
- package/dist/components/Card.js +222 -0
- package/dist/components/Checkbox.js +305 -0
- package/dist/components/Crud.js +564 -0
- package/dist/components/DragAndDrop.js +337 -0
- package/dist/components/Error.js +206 -0
- package/dist/components/Footer.js +99 -0
- package/dist/components/Form.js +412 -0
- package/dist/components/Header.js +372 -0
- package/dist/components/Heading.js +134 -0
- package/dist/components/Hero.js +181 -0
- package/dist/components/Label.js +256 -0
- package/dist/components/Loader.js +302 -0
- package/dist/components/MenuHover.js +114 -0
- package/dist/components/Paragraph.js +128 -0
- package/dist/components/Prompt.js +61 -0
- package/dist/components/Radio.js +254 -0
- package/dist/components/Select.js +422 -0
- package/dist/components/SideMenu.js +313 -0
- package/dist/components/Tabs.js +297 -0
- package/dist/components/TextArea.js +370 -0
- package/dist/components/TextInput.js +286 -0
- package/dist/components/Toggle.js +186 -0
- package/dist/components/crudFiles/CrudEditBase.js +150 -0
- package/dist/components/crudFiles/CrudViewBase.js +39 -0
- package/dist/components/crudFiles/crudDevelopment.js +118 -0
- package/dist/components/crudFiles/crudEditHandlers.js +50 -0
- package/dist/constants/animation.js +30 -0
- package/dist/icons/ArrowIcon.js +32 -0
- package/dist/icons/ArrowRight.js +33 -0
- package/dist/icons/CheckCircle.js +33 -0
- package/dist/icons/ChevronDown.js +28 -0
- package/dist/icons/Close.js +33 -0
- package/dist/icons/EditSquare.js +33 -0
- package/dist/icons/Ellipses.js +34 -0
- package/dist/icons/Hamburger.js +39 -0
- package/dist/icons/LoadingSpinner.js +42 -0
- package/dist/icons/PlusCircle.js +33 -0
- package/dist/icons/SaveIcon.js +32 -0
- package/dist/icons/TrashX.js +33 -0
- package/dist/icons/__tests__/CheckCircle.test.js +9 -0
- package/dist/icons/__tests__/ChevronDown.test.js +9 -0
- package/dist/icons/__tests__/Close.test.js +9 -0
- package/dist/icons/__tests__/EditSquare.test.js +9 -0
- package/dist/icons/__tests__/PlusCircle.test.js +9 -0
- package/dist/icons/__tests__/TrashX.test.js +9 -0
- package/dist/icons/index.js +89 -0
- package/dist/index.js +332 -0
- package/dist/setupTests.js +3 -0
- package/dist/styles/_variables.scss +286 -0
- package/dist/styles/anchor.scss +40 -0
- package/dist/styles/animation-accessibility.scss +96 -0
- package/dist/styles/animation-toggle.scss +233 -0
- package/dist/styles/animation.scss +3781 -0
- package/dist/styles/avatar.scss +285 -0
- package/dist/styles/button.scss +430 -0
- package/dist/styles/card.scss +210 -0
- package/dist/styles/checkbox.scss +160 -0
- package/dist/styles/crud.scss +474 -0
- package/dist/styles/dragAndDrop.scss +312 -0
- package/dist/styles/error.scss +232 -0
- package/dist/styles/footer.scss +58 -0
- package/dist/styles/form.scss +420 -0
- package/dist/styles/grid.scss +29 -0
- package/dist/styles/header.scss +276 -0
- package/dist/styles/heading.scss +118 -0
- package/dist/styles/hero.scss +185 -0
- package/dist/styles/htmlElements.scss +20 -0
- package/dist/styles/image.scss +9 -0
- package/dist/styles/label.scss +340 -0
- package/dist/styles/list-item.scss +5 -0
- package/dist/styles/loader.scss +354 -0
- package/dist/styles/logo.scss +19 -0
- package/dist/styles/main.css +9056 -0
- package/dist/styles/main.css.map +1 -0
- package/dist/styles/main.scss +0 -0
- package/dist/styles/menu-hover.scss +30 -0
- package/dist/styles/paragraph.scss +88 -0
- package/dist/styles/prompt.scss +51 -0
- package/dist/styles/radio.scss +202 -0
- package/dist/styles/select.scss +363 -0
- package/dist/styles/side-menu.scss +334 -0
- package/dist/styles/tabs.scss +540 -0
- package/dist/styles/text-area.scss +388 -0
- package/dist/styles/text-input.scss +171 -0
- package/dist/styles/toggle.scss +0 -0
- package/dist/styles/unordered-list.scss +8 -0
- package/dist/utils/ScrollHandler.js +30 -0
- package/dist/utils/accessibility.js +128 -0
- package/dist/utils/heroUtils.js +316 -0
- package/dist/utils/index.js +104 -0
- package/dist/utils/inputValidation.js +29 -0
- package/dist/utils/keyboardNavigation.js +536 -0
- package/dist/utils/labelUtils.js +708 -0
- package/dist/utils/loaderUtils.js +387 -0
- package/dist/utils/menuUtils.js +575 -0
- package/dist/utils/useHeadingAccessibility.js +298 -0
- package/dist/utils/useRadioGroup.js +260 -0
- package/dist/utils/useSelectAccessibility.js +426 -0
- package/dist/utils/useTabsAccessibility.js +278 -0
- package/dist/utils/useTextAreaAccessibility.js +255 -0
- package/dist/utils/useTextInputAccessibility.js +295 -0
- package/dist/utils/useTypographyAccessibility.js +168 -0
- package/dist/utils/useWindowSize.js +32 -0
- package/dist/utils/utils/ScrollHandler.js +26 -0
- package/dist/utils/utils/accessibility.js +133 -0
- package/dist/utils/utils/heroUtils.js +348 -0
- package/dist/utils/utils/index.js +9 -0
- package/dist/utils/utils/inputValidation.js +22 -0
- package/dist/utils/utils/keyboardNavigation.js +664 -0
- package/dist/utils/utils/labelUtils.js +772 -0
- package/dist/utils/utils/loaderUtils.js +436 -0
- package/dist/utils/utils/menuUtils.js +651 -0
- package/dist/utils/utils/useHeadingAccessibility.js +334 -0
- package/dist/utils/utils/useRadioGroup.js +311 -0
- package/dist/utils/utils/useSelectAccessibility.js +498 -0
- package/dist/utils/utils/useTabsAccessibility.js +316 -0
- package/dist/utils/utils/useTextAreaAccessibility.js +303 -0
- package/dist/utils/utils/useTextInputAccessibility.js +338 -0
- package/dist/utils/utils/useTypographyAccessibility.js +180 -0
- package/dist/utils/utils/useWindowSize.js +26 -0
- package/dist/utils/utils/validation.js +131 -0
- package/dist/utils/validation.js +139 -0
- package/package.json +90 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.validateUrl = exports.validatePhone = exports.validatePasswordStrength = exports.validateField = exports.validateEmail = exports.VALIDATION_PATTERNS = exports.EMAIL_REGEX_STRICT = exports.EMAIL_REGEX = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Validation utilities for form inputs
|
|
9
|
+
* Contains common validation patterns and functions
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
// Common email validation regex pattern
|
|
13
|
+
// This pattern checks for basic email format: user@domain.extension
|
|
14
|
+
const EMAIL_REGEX = exports.EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
15
|
+
|
|
16
|
+
// More comprehensive email regex (RFC 5322 compliant, simplified)
|
|
17
|
+
const EMAIL_REGEX_STRICT = exports.EMAIL_REGEX_STRICT = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
|
|
18
|
+
|
|
19
|
+
// Common validation patterns
|
|
20
|
+
const VALIDATION_PATTERNS = exports.VALIDATION_PATTERNS = {
|
|
21
|
+
email: EMAIL_REGEX,
|
|
22
|
+
phone: /^[\+]?[1-9][\d]{0,15}$/,
|
|
23
|
+
url: /^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)$/,
|
|
24
|
+
postalCode: /^[A-Za-z0-9\s-]{3,10}$/,
|
|
25
|
+
creditCard: /^[0-9]{13,19}$/,
|
|
26
|
+
strongPassword: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Validates an email address
|
|
31
|
+
* @param {string} email - The email address to validate
|
|
32
|
+
* @param {boolean} strict - Whether to use strict RFC 5322 validation
|
|
33
|
+
* @returns {boolean} - True if email is valid
|
|
34
|
+
*/
|
|
35
|
+
const validateEmail = (email, strict = false) => {
|
|
36
|
+
if (!email || typeof email !== 'string') {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
const pattern = strict ? EMAIL_REGEX_STRICT : EMAIL_REGEX;
|
|
40
|
+
return pattern.test(email.trim());
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Validates a phone number
|
|
45
|
+
* @param {string} phone - The phone number to validate
|
|
46
|
+
* @returns {boolean} - True if phone is valid
|
|
47
|
+
*/
|
|
48
|
+
exports.validateEmail = validateEmail;
|
|
49
|
+
const validatePhone = phone => {
|
|
50
|
+
if (!phone || typeof phone !== 'string') {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
return VALIDATION_PATTERNS.phone.test(phone.replace(/[\s\-\(\)]/g, ''));
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Validates a URL
|
|
58
|
+
* @param {string} url - The URL to validate
|
|
59
|
+
* @returns {boolean} - True if URL is valid
|
|
60
|
+
*/
|
|
61
|
+
exports.validatePhone = validatePhone;
|
|
62
|
+
const validateUrl = url => {
|
|
63
|
+
if (!url || typeof url !== 'string') {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
return VALIDATION_PATTERNS.url.test(url.trim());
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Validates password strength
|
|
71
|
+
* @param {string} password - The password to validate
|
|
72
|
+
* @returns {boolean} - True if password meets strength requirements
|
|
73
|
+
*/
|
|
74
|
+
exports.validateUrl = validateUrl;
|
|
75
|
+
const validatePasswordStrength = password => {
|
|
76
|
+
if (!password || typeof password !== 'string') {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
return VALIDATION_PATTERNS.strongPassword.test(password);
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Generic field validation function
|
|
84
|
+
* @param {string} value - The value to validate
|
|
85
|
+
* @param {Object} rules - Validation rules object
|
|
86
|
+
* @param {string} fieldName - Name of the field for error messages
|
|
87
|
+
* @returns {string|null} - Error message or null if valid
|
|
88
|
+
*/
|
|
89
|
+
exports.validatePasswordStrength = validatePasswordStrength;
|
|
90
|
+
const validateField = (value, rules, fieldName) => {
|
|
91
|
+
if (!rules) return null;
|
|
92
|
+
|
|
93
|
+
// Required validation
|
|
94
|
+
if (rules.required && (!value || value.trim() === '')) {
|
|
95
|
+
return `${fieldName} is required`;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Skip other validations if field is empty and not required
|
|
99
|
+
if (!value || value.trim() === '') {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Email validation
|
|
104
|
+
if (rules.email && !validateEmail(value, rules.strict)) {
|
|
105
|
+
return 'Please enter a valid email address';
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Phone validation
|
|
109
|
+
if (rules.phone && !validatePhone(value)) {
|
|
110
|
+
return 'Please enter a valid phone number';
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// URL validation
|
|
114
|
+
if (rules.url && !validateUrl(value)) {
|
|
115
|
+
return 'Please enter a valid URL';
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Password strength validation
|
|
119
|
+
if (rules.strongPassword && !validatePasswordStrength(value)) {
|
|
120
|
+
return 'Password must contain at least 8 characters with uppercase, lowercase, number, and special character';
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Minimum length validation
|
|
124
|
+
if (rules.minLength && value.length < rules.minLength) {
|
|
125
|
+
return `${fieldName} must be at least ${rules.minLength} characters`;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Maximum length validation
|
|
129
|
+
if (rules.maxLength && value.length > rules.maxLength) {
|
|
130
|
+
return `${fieldName} must not exceed ${rules.maxLength} characters`;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Pattern validation
|
|
134
|
+
if (rules.pattern && !rules.pattern.test(value)) {
|
|
135
|
+
return rules.patternMessage || `${fieldName} format is invalid`;
|
|
136
|
+
}
|
|
137
|
+
return null;
|
|
138
|
+
};
|
|
139
|
+
exports.validateField = validateField;
|
package/package.json
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@abstraks-dev/ui-library",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "User Interface library",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"files": [
|
|
7
|
+
"dist"
|
|
8
|
+
],
|
|
9
|
+
"scripts": {
|
|
10
|
+
"test": "jest",
|
|
11
|
+
"test:watch": "jest --watch",
|
|
12
|
+
"test:coverage": "jest --coverage",
|
|
13
|
+
"storybook": "concurrently \"npm run build-css:watch\" \"storybook dev -p 6006\"",
|
|
14
|
+
"build-storybook": "storybook build && npm run format-storybook-json",
|
|
15
|
+
"build-storybook:dev": "storybook build --webpack-stats-json --debug-webpack && npm run enhance-build",
|
|
16
|
+
"build-storybook:prod": "storybook build",
|
|
17
|
+
"build": "babel src --out-dir dist --extensions \".js,.jsx\"",
|
|
18
|
+
"postbuild": "cp -R src/styles dist/styles && cp -R src/utils dist/utils && npm run build-css",
|
|
19
|
+
"build-css": "sass src/main.scss dist/styles/main.css",
|
|
20
|
+
"build-css:watch": "sass src/main.scss dist/styles/main.css --watch",
|
|
21
|
+
"build-css:compressed": "sass src/main.scss dist/styles/main.css --style compressed",
|
|
22
|
+
"format-storybook-json": "node scripts/format-storybook-json.js",
|
|
23
|
+
"enhance-build": "node scripts/post-build-enhance.js",
|
|
24
|
+
"debug-info": "node scripts/post-build-enhance.js",
|
|
25
|
+
"release": "auto shipit",
|
|
26
|
+
"changeset": "changeset",
|
|
27
|
+
"version-packages": "changeset version"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"ui",
|
|
31
|
+
"library"
|
|
32
|
+
],
|
|
33
|
+
"author": "Abstraks",
|
|
34
|
+
"homepage": "https://github.com/Abstraks-co/ui-library",
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "git+https://github.com/Abstraks-co/ui-library.git"
|
|
38
|
+
},
|
|
39
|
+
"registry": "https://www.npmjs.com/~Abstraks-co",
|
|
40
|
+
"license": "ISC",
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@babel/cli": "^7.28.0",
|
|
43
|
+
"@babel/preset-env": "^7.28.0",
|
|
44
|
+
"@babel/preset-react": "^7.27.1",
|
|
45
|
+
"@chromatic-com/storybook": "^4.0.1",
|
|
46
|
+
"@storybook/addon-a11y": "^9.0.17",
|
|
47
|
+
"@storybook/addon-docs": "^9.0.17",
|
|
48
|
+
"@storybook/addon-jest": "^9.0.17",
|
|
49
|
+
"@storybook/addon-links": "^9.0.17",
|
|
50
|
+
"@storybook/addon-onboarding": "^9.0.17",
|
|
51
|
+
"@storybook/addon-styling-webpack": "^1.0.1",
|
|
52
|
+
"@storybook/addon-webpack5-compiler-swc": "^3.0.0",
|
|
53
|
+
"@storybook/addons": "^7.6.17",
|
|
54
|
+
"@storybook/react": "^9.0.18",
|
|
55
|
+
"@storybook/react-webpack5": "^9.0.17",
|
|
56
|
+
"@testing-library/jest-dom": "^6.6.3",
|
|
57
|
+
"@testing-library/react": "^16.3.0",
|
|
58
|
+
"@testing-library/user-event": "^14.6.1",
|
|
59
|
+
"auto": "^11.3.0",
|
|
60
|
+
"axe-core": "^4.10.3",
|
|
61
|
+
"concurrently": "^9.2.0",
|
|
62
|
+
"css-loader": "^7.1.2",
|
|
63
|
+
"identity-obj-proxy": "^3.0.0",
|
|
64
|
+
"jest": "^29.7.0",
|
|
65
|
+
"jest-environment-jsdom": "^29.7.0",
|
|
66
|
+
"jsdom": "^26.1.0",
|
|
67
|
+
"postcss": "^8.5.6",
|
|
68
|
+
"postcss-cli": "^11.0.1",
|
|
69
|
+
"postcss-import": "^16.1.1",
|
|
70
|
+
"prop-types": "^15.8.1",
|
|
71
|
+
"sass": "^1.89.2",
|
|
72
|
+
"sass-loader": "^16.0.5",
|
|
73
|
+
"storybook": "^9.0.17",
|
|
74
|
+
"style-loader": "^4.0.0"
|
|
75
|
+
},
|
|
76
|
+
"dependencies": {
|
|
77
|
+
"animate.css": "^4.1.1",
|
|
78
|
+
"libphonenumber-js": "^1.12.10",
|
|
79
|
+
"react-transition-group": "^4.4.5",
|
|
80
|
+
"uuid": "^11.1.0",
|
|
81
|
+
"validator": "^13.15.15"
|
|
82
|
+
},
|
|
83
|
+
"bugs": {
|
|
84
|
+
"url": "https://github.com/Abstraks-co/ui-library/issues"
|
|
85
|
+
},
|
|
86
|
+
"peerDependencies": {
|
|
87
|
+
"react": ">=17.0.0",
|
|
88
|
+
"react-dom": ">=17.0.0"
|
|
89
|
+
}
|
|
90
|
+
}
|