tccd-ui 0.0.1 → 0.0.3
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/dist/index.d.mts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -25,14 +25,15 @@ interface DropdownOption {
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
interface ButtonProps {
|
|
28
|
-
buttonText
|
|
28
|
+
buttonText?: string;
|
|
29
|
+
buttonIcon?: React.ReactNode;
|
|
29
30
|
onClick: () => void;
|
|
30
31
|
type: ButtonTypes;
|
|
31
32
|
disabled?: boolean;
|
|
32
33
|
loading?: boolean;
|
|
33
34
|
width?: ButtonWidths;
|
|
34
35
|
}
|
|
35
|
-
declare const Button: ({ buttonText, onClick, type, disabled, loading, width }: ButtonProps) => any;
|
|
36
|
+
declare const Button: ({ buttonText, buttonIcon, onClick, type, disabled, loading, width }: ButtonProps) => any;
|
|
36
37
|
|
|
37
38
|
declare function Checkbox({ label, checked, onChange }: {
|
|
38
39
|
label: string;
|
package/dist/index.d.ts
CHANGED
|
@@ -25,14 +25,15 @@ interface DropdownOption {
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
interface ButtonProps {
|
|
28
|
-
buttonText
|
|
28
|
+
buttonText?: string;
|
|
29
|
+
buttonIcon?: React.ReactNode;
|
|
29
30
|
onClick: () => void;
|
|
30
31
|
type: ButtonTypes;
|
|
31
32
|
disabled?: boolean;
|
|
32
33
|
loading?: boolean;
|
|
33
34
|
width?: ButtonWidths;
|
|
34
35
|
}
|
|
35
|
-
declare const Button: ({ buttonText, onClick, type, disabled, loading, width }: ButtonProps) => any;
|
|
36
|
+
declare const Button: ({ buttonText, buttonIcon, onClick, type, disabled, loading, width }: ButtonProps) => any;
|
|
36
37
|
|
|
37
38
|
declare function Checkbox({ label, checked, onChange }: {
|
|
38
39
|
label: string;
|
package/dist/index.js
CHANGED
|
@@ -60,7 +60,7 @@ var ButtonWidths = {
|
|
|
60
60
|
// src/components/Button.tsx
|
|
61
61
|
var import_ai = require("react-icons/ai");
|
|
62
62
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
63
|
-
var Button = ({ buttonText, onClick, type, disabled = false, loading = false, width = ButtonWidths.AUTO }) => {
|
|
63
|
+
var Button = ({ buttonText, buttonIcon, onClick, type, disabled = false, loading = false, width = ButtonWidths.AUTO }) => {
|
|
64
64
|
const isDisabled = disabled || loading;
|
|
65
65
|
const stylePresets = {
|
|
66
66
|
primary: "bg-primary text-text border-primary",
|
|
@@ -108,7 +108,8 @@ var Button = ({ buttonText, onClick, type, disabled = false, loading = false, wi
|
|
|
108
108
|
`,
|
|
109
109
|
children: [
|
|
110
110
|
loading && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "animate-spin -ml-1 mr-2 h-4 w-4 inline-block", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ai.AiOutlineLoading3Quarters, {}) }),
|
|
111
|
-
loading ? "Loading..." : buttonText
|
|
111
|
+
loading ? "Loading..." : buttonText,
|
|
112
|
+
buttonIcon && !loading && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "ml-2 inline-block", children: buttonIcon })
|
|
112
113
|
]
|
|
113
114
|
}
|
|
114
115
|
);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/types/index.ts","../src/components/Button.tsx","../src/components/Checkbox.tsx","../src/components/DatePicker.tsx","../src/components/DropdownMenu.tsx","../src/components/ErrorScreen.tsx","../src/components/InputField.tsx","../src/components/LazyImageLoader.tsx","../src/components/LoadingPage.tsx","../src/components/Modal.tsx","../src/components/NumberField.tsx","../src/components/PasswordField.tsx","../src/components/RadioButton.tsx","../src/components/SearchField.tsx","../src/components/TextAreaField.tsx","../src/components/UnauthorizedPage.tsx"],"sourcesContent":["export { default as Button } from \"./components/Button\";\r\nexport { default as Checkbox } from \"./components/Checkbox\";\r\nexport { default as DatePicker } from \"./components/DatePicker\";\r\nexport { default as DropdownMenu } from \"./components/DropdownMenu\";\r\nexport { default as ErrorScreen } from \"./components/ErrorScreen\";\r\nexport { default as InputField } from \"./components/InputField\";\r\nexport { default as LazyImageLoader } from \"./components/LazyImageLoader\";\r\nexport { default as LoadingPage } from \"./components/LoadingPage\";\r\nexport { default as Modal } from \"./components/Modal\";\r\nexport { default as NumberField } from \"./components/NumberField\";\r\nexport { default as PasswordField } from \"./components/PasswordField\";\r\nexport { default as RadioButton } from \"./components/RadioButton\";\r\nexport { default as SearchField } from \"./components/SearchField\";\r\nexport { default as TextAreaField } from \"./components/TextAreaField\";\r\nexport { default as UnauthorizedPage } from \"./components/UnauthorizedPage\";\r\nexport * from \"./types\";\r\n","export const ButtonTypes = {\r\n PRIMARY: \"primary\",\r\n SECONDARY: \"secondary\",\r\n TERTIARY: \"tertiary\",\r\n DANGER: \"danger\",\r\n GHOST: \"ghost\",\r\n BASIC: \"basic\"\r\n} as const;\r\n\r\nexport type ButtonTypes = typeof ButtonTypes[keyof typeof ButtonTypes];\r\n\r\nexport const ButtonWidths = {\r\n AUTO: \"auto\",\r\n SMALL: \"small\",\r\n MEDIUM: \"medium\",\r\n LARGE: \"large\",\r\n XL: \"xl\",\r\n FULL: \"full\"\r\n} as const;\r\n\r\nexport type ButtonWidths = typeof ButtonWidths[keyof typeof ButtonWidths];\r\n\r\nexport interface DropdownOption {\r\n value: string;\r\n label: string;\r\n disabled?: boolean;\r\n}\r\n","import { ButtonTypes, ButtonWidths } from \"../types\";\r\nimport { AiOutlineLoading3Quarters } from \"react-icons/ai\";\r\n\r\ninterface ButtonProps {\r\n buttonText: string;\r\n onClick: () => void;\r\n type: ButtonTypes;\r\n disabled?: boolean;\r\n loading?: boolean;\r\n width?: ButtonWidths;\r\n}\r\n\r\nconst Button = ({ buttonText, onClick, type, disabled = false, loading = false, width = ButtonWidths.AUTO }: ButtonProps) => {\r\n const isDisabled = disabled || loading;\r\n\r\n const stylePresets: Record<ButtonTypes, string> = {\r\n primary: \"bg-primary text-text border-primary\",\r\n secondary: \"bg-secondary text-text border-secondary\",\r\n tertiary: \"bg-contrast text-text border-contrast\",\r\n danger: \"border-primary text-primary\",\r\n ghost: \"text-secondary border-secondary\",\r\n basic: \"border-contrast\"\r\n }\r\n\r\n const hoverStyles: Record<ButtonTypes, string> = {\r\n primary: \"hover:bg-background hover:border-primary hover:text-primary\",\r\n secondary: \"hover:bg-background hover:border-secondary hover:text-secondary\",\r\n tertiary: \"hover:bg-background hover:border-tertiary hover:text-black\",\r\n danger: \"hover:bg-primary hover:text-text\",\r\n ghost: \"hover:bg-secondary/30\",\r\n basic: \"hover:bg-contrast/30\",\r\n }\r\n\r\n const disabledStyles = \"opacity-50\";\r\n\r\n const widthStyles: Record<ButtonWidths, string> = {\r\n auto: \"w-auto\",\r\n small: \"w-24\",\r\n medium: \"w-32\",\r\n large: \"w-48\",\r\n xl: \"w-64\",\r\n full: \"w-full\"\r\n }\r\n\r\n const handleClick = () => {\r\n if (!isDisabled) {\r\n onClick();\r\n }\r\n };\r\n\r\n return (\r\n <button\r\n onClick={handleClick}\r\n disabled={isDisabled}\r\n className={`\r\n ${stylePresets[type]} \r\n ${!isDisabled ? hoverStyles[type] : ''} \r\n ${isDisabled ? disabledStyles : ''} \r\n ${widthStyles[width]}\r\n rounded-full px-6 py-2 border font-bold text-[11px] lg:text-[12px] whitespace-nowrap\r\n transition-all duration-200 ease-in-out flex items-center justify-center h-fit\r\n ${isDisabled ? 'cursor-not-allowed' : 'cursor-pointer'}\r\n `}\r\n >\r\n {loading && (\r\n <span className=\"animate-spin -ml-1 mr-2 h-4 w-4 inline-block\">\r\n <AiOutlineLoading3Quarters />\r\n </span>\r\n )}\r\n {loading ? 'Loading...' : buttonText}\r\n </button>\r\n )\r\n}\r\n\r\nexport default Button;","export default function Checkbox({label, checked, onChange}: {label: string, checked: boolean, onChange: () => void}) {\r\n return (\r\n <label className=\"inline-flex items-center cursor-pointer relative pl-7 select-none\">\r\n <input\r\n type=\"checkbox\"\r\n checked={checked}\r\n onChange={() => onChange()}\r\n className=\"peer absolute left-0 top-1/2 -translate-y-1/2 w-5 h-5 opacity-0 cursor-pointer\"\r\n />\r\n <span className=\"\r\n absolute left-0 top-1/2 -translate-y-1/2 w-5 h-5 rounded-md\r\n border-2 border-gray-300 bg-white\r\n peer-checked:bg-primary peer-checked:border-primary\r\n flex items-center justify-center\r\n transition-colors\r\n pointer-events-none\r\n \">\r\n <svg\r\n className=\"w-4 h-4 text-white\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"3\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\r\n </svg>\r\n </span>\r\n <span className=\"text-sm\">{label}</span>\r\n </label>\r\n );\r\n}","import React from 'react';\r\nimport { MdCalendarToday } from 'react-icons/md';\r\n\r\ninterface DatePickerProps {\r\n label: string;\r\n id: string;\r\n value: string;\r\n onChange: (date: string) => void;\r\n error?: string;\r\n disabled?: boolean;\r\n minDate?: string;\r\n maxDate?: string;\r\n}\r\n\r\nexport default function DatePicker({\r\n label,\r\n id,\r\n value,\r\n onChange,\r\n error,\r\n disabled = false,\r\n minDate,\r\n maxDate,\r\n}: DatePickerProps) {\r\n const handleDateChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n onChange(e.target.value.toString());\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col w-full\">\r\n <label className=\"text-label text-[14px] md:text-[15px] lg:text-[16px] mb-2 font-semibold\">\r\n {label}\r\n </label>\r\n\r\n <div className=\"relative\">\r\n <input\r\n id={id}\r\n type=\"date\"\r\n value={value}\r\n onChange={handleDateChange}\r\n disabled={disabled}\r\n min={minDate}\r\n max={maxDate}\r\n className={`w-full border-contrast rounded-xl px-3 py-2 md:px-4 md:py-3 border outline-none ${error\r\n ? \"border-red-300 focus:border-red-500 focus:ring-red-500/30\"\r\n : \"focus:border-primary\"\r\n } ${disabled ? \"bg-gray-100 cursor-not-allowed opacity-60\" : \"bg-white\"\r\n } transition-all duration-300 ease-in-out text-sm pr-10 [&::-webkit-calendar-picker-indicator]:opacity-0 [&::-webkit-calendar-picker-indicator]:absolute [&::-webkit-calendar-picker-indicator]:right-3 [&::-webkit-calendar-picker-indicator]:w-5 [&::-webkit-calendar-picker-indicator]:h-5 [&::-webkit-calendar-picker-indicator]:cursor-pointer`}\r\n />\r\n\r\n <div className=\"absolute right-3 top-1/2 transform -translate-y-1/2 pointer-events-none\">\r\n <span className={`w-5 h-5 ${disabled ? \"text-gray-400\" : \"text-secondary\"}`}>\r\n <MdCalendarToday />\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {error && (\r\n <span className=\"text-red-500 text-sm font-medium mt-1\">{error}</span>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useRef, useEffect } from \"react\";\r\nimport { IoChevronDown } from \"react-icons/io5\";\r\nimport Button from \"./Button\";\r\nimport { ButtonTypes, ButtonWidths } from \"../types\";\r\nimport type { DropdownOption } from \"../types\";\r\n\r\ninterface DropdownMenuProps {\r\n label?: string;\r\n placeholder?: string;\r\n options: DropdownOption[];\r\n value?: string;\r\n onChange: (value: string) => void;\r\n error?: string;\r\n disabled?: boolean;\r\n className?: string;\r\n id?: string;\r\n}\r\n\r\nexport default function DropdownMenu({\r\n label,\r\n placeholder = \"Select an option\",\r\n options,\r\n value,\r\n onChange,\r\n error,\r\n disabled = false,\r\n className = \"\",\r\n id,\r\n}: DropdownMenuProps) {\r\n const [isOpen, setIsOpen] = useState(false);\r\n const dropdownRef = useRef<HTMLDivElement>(null);\r\n\r\n const selectedOption = options.find((option) => option.value === value);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (\r\n dropdownRef.current &&\r\n !dropdownRef.current.contains(event.target as Node)\r\n ) {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, []);\r\n\r\n const handleOptionClick = (optionValue: string) => {\r\n if (!disabled) {\r\n onChange(optionValue);\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className={`flex flex-col w-full ${className}`}>\r\n {label && (\r\n <label\r\n htmlFor={id}\r\n className=\"text-label text-[14px] md:text-[15px] lg:text-[16px] mb-2 font-semibold\"\r\n >\r\n {label}\r\n </label>\r\n )}\r\n\r\n <div className=\"relative\" ref={dropdownRef}>\r\n <div className=\"relative\">\r\n <Button\r\n buttonText={selectedOption ? selectedOption.label : placeholder}\r\n onClick={() => !disabled && setIsOpen(!isOpen)}\r\n type={ButtonTypes.BASIC}\r\n disabled={disabled}\r\n width={ButtonWidths.FULL}\r\n />\r\n <span\r\n className={`absolute right-3 top-1/2 transform -translate-y-1/2 w-5 h-5 text-secondary transition-transform duration-200 pointer-events-none ${\r\n isOpen ? \"rotate-180\" : \"\"\r\n }`}\r\n >\r\n <IoChevronDown />\r\n </span>\r\n </div>\r\n\r\n {isOpen && !disabled && (\r\n <div className=\"absolute z-50 w-full mt-1 bg-white border border-secondary/30 rounded-xl shadow-lg max-h-60 overflow-y-auto\">\r\n {options.length === 0 ? (\r\n <div className=\"px-3 py-2 text-sm text-muted-secondary\">\r\n No options available\r\n </div>\r\n ) : (\r\n options.map((option) => (\r\n <button\r\n key={option.value}\r\n type=\"button\"\r\n onClick={() => handleOptionClick(option.value)}\r\n disabled={option.disabled}\r\n className={`\r\n w-full px-3 py-2 text-left text-sm transition-colors duration-150\r\n ${\r\n option.disabled\r\n ? \"text-gray-400 cursor-not-allowed\"\r\n : \"text-gray-900 hover:bg-secondary/10 hover:text-secondary cursor-pointer\"\r\n }\r\n ${\r\n value === option.value\r\n ? \"bg-secondary/20 text-secondary font-medium\"\r\n : \"\"\r\n }\r\n first:rounded-t-xl last:rounded-b-xl\r\n `}\r\n >\r\n {option.label}\r\n </button>\r\n ))\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {error && <p className=\"mt-1 text-sm text-red-600\">{error}</p>}\r\n </div>\r\n );\r\n}\r\n","import { FaExclamationTriangle } from \"react-icons/fa\";\r\n\r\ninterface ErrorComponentProps {\r\n title: string;\r\n message: string;\r\n}\r\n\r\nexport default function ErrorComponent({\r\n title,\r\n message,\r\n}: ErrorComponentProps) {\r\n return (\r\n <div className=\"min-h-screen bg-background\">\r\n <div className=\"w-full md:w-3/4 lg:w-10/12 m-auto rounded-xl shadow-md p-5 flex flex-col gap-4\">\r\n {/* Error Container */}\r\n <div className=\"flex flex-col items-center justify-center py-16 px-4\">\r\n {/* Error Icon */}\r\n <div className=\"mb-6\">\r\n <div className=\"w-20 h-20 bg-red-100 rounded-full flex items-center justify-center\">\r\n <span className=\"text-error text-3xl\">\r\n <FaExclamationTriangle />\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Error Title */}\r\n <h1 className=\"text-2xl md:text-3xl lg:text-4xl font-bold text-error mb-4 text-center\">\r\n {title}\r\n </h1>\r\n\r\n {/* Error Message */}\r\n <p className=\"text-base md:text-lg text-center mb-8 max-w-md\">\r\n {message}\r\n </p>\r\n </div>\r\n\r\n <div className=\"mt-8 bg-red-50 border border-red-200 rounded-xl p-4\">\r\n <h3 className=\"font-semibold text-red-800 mb-2\">\r\n Technical Details\r\n </h3>\r\n <div className=\"text-red-700 text-sm space-y-1\">\r\n <p>• Check your internet connection</p>\r\n <p>• The page may be temporarily unavailable</p>\r\n <p>• Contact support if the problem persists</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport default function InputField({\r\n label,\r\n value,\r\n placeholder,\r\n onChange,\r\n error,\r\n id,\r\n}: {\r\n label: string;\r\n id: string;\r\n value: string;\r\n placeholder: string;\r\n onChange: (newValue: React.ChangeEvent<HTMLInputElement>) => void;\r\n error?: string;\r\n}) {\r\n return (\r\n <div className=\"flex flex-col w-full\">\r\n <label className=\"text-label text-[14px] md:text-[15px] lg:text-[16px] mb-2 font-semibold\">\r\n {label}\r\n </label>\r\n <input\r\n id={id}\r\n value={value}\r\n placeholder={placeholder}\r\n onChange={(e) => onChange(e)}\r\n className={`border-gray-400 rounded-xl px-3 py-2 md:px-4 md:py-3 border outline-none ${\r\n error\r\n ? \"border-red-300 focus:border-red-500 focus:ring-red-500/30\"\r\n : \"focus:border-primary\"\r\n } transition-all duration-300 ease-in-out text-sm`}\r\n />\r\n </div>\r\n );\r\n}\r\n","import { useState } from \"react\";\r\nimport { HiOutlinePhotograph } from \"react-icons/hi\";\r\n\r\ninterface LazyImageLoaderProps {\r\n src: string;\r\n alt: string;\r\n className?: string;\r\n width?: string | number;\r\n height?: string | number;\r\n}\r\n\r\nexport default function LazyImageLoader({ \r\n src, \r\n alt, \r\n className = \"\", \r\n width = \"100%\", \r\n height = \"200px\" \r\n}: LazyImageLoaderProps) {\r\n const [imageLoaded, setImageLoaded] = useState(false);\r\n const [imageError, setImageError] = useState(false);\r\n\r\n const handleImageLoad = () => {\r\n setImageLoaded(true);\r\n };\r\n\r\n const handleImageError = () => {\r\n setImageError(true);\r\n setImageLoaded(true);\r\n };\r\n\r\n return (\r\n <div \r\n className={`relative overflow-hidden ${className}`}\r\n style={{ width, height }}\r\n >\r\n {!imageLoaded && (\r\n <div className=\"absolute inset-0 bg-gray-200 animate-pulse\">\r\n <div className=\"absolute inset-0 bg-gradient-to-r from-gray-200 via-gray-100 to-gray-200 animate-shimmer\"></div>\r\n </div>\r\n )}\r\n\r\n {imageError && (\r\n <div className=\"absolute inset-0 bg-gray-100 flex items-center justify-center\">\r\n <div className=\"text-center text-gray-400\">\r\n <span className=\"w-12 h-12 mx-auto mb-2\">\r\n <HiOutlinePhotograph />\r\n </span>\r\n <p className=\"text-sm\">Failed to load</p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <img\r\n src={src}\r\n alt={alt}\r\n onLoad={handleImageLoad}\r\n onError={handleImageError}\r\n className={`w-full h-full object-cover transition-opacity duration-300 ${\r\n imageLoaded ? \"opacity-100\" : \"opacity-0\"\r\n }`}\r\n />\r\n </div>\r\n );\r\n}\r\n","import tccd_logo from \"../assets/TCCD_logo.svg\";\r\n\r\nconst LoadingPage = () => {\r\n return (\r\n <>\r\n <style>{`\r\n @keyframes custom-bounce {\r\n 0%, 100% {\r\n transform: translateY(0);\r\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\r\n }\r\n 50% {\r\n transform: translateY(-8px);\r\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\r\n }\r\n }\r\n\r\n @keyframes logoLuxury {\r\n 0% {\r\n filter: brightness(1) contrast(1) drop-shadow(0 0 15px rgba(205, 58, 56, 0.3)) saturate(1);\r\n transform: scale(1) rotate(0deg);\r\n }\r\n 25% {\r\n filter: brightness(1.2) contrast(1.2) drop-shadow(0 0 25px rgba(41, 94, 126, 0.5)) saturate(1.2);\r\n transform: scale(1.05) rotate(2deg);\r\n }\r\n 50% {\r\n filter: brightness(1.4) contrast(1.3) drop-shadow(0 0 35px rgba(205, 58, 56, 0.7)) saturate(1.4);\r\n transform: scale(1.08) rotate(0deg);\r\n }\r\n 75% {\r\n filter: brightness(1.2) contrast(1.2) drop-shadow(0 0 25px rgba(41, 94, 126, 0.5)) saturate(1.2);\r\n transform: scale(1.05) rotate(-2deg);\r\n }\r\n 100% {\r\n filter: brightness(1) contrast(1) drop-shadow(0 0 15px rgba(205, 58, 56, 0.3)) saturate(1);\r\n transform: scale(1) rotate(0deg);\r\n }\r\n }\r\n\r\n @keyframes float {\r\n 0%, 100% {\r\n transform: translateY(0px) translateX(0px) scale(1);\r\n opacity: 0.3;\r\n }\r\n 50% {\r\n transform: translateY(-20px) translateX(10px) scale(1.2);\r\n opacity: 0.8;\r\n }\r\n }\r\n\r\n @keyframes spinSlow {\r\n from {\r\n transform: rotate(0deg);\r\n }\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n\r\n @keyframes rotateSlow {\r\n from {\r\n transform: rotate(0deg);\r\n }\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n\r\n @keyframes gradientShift {\r\n 0%, 100% {\r\n background-position: 0% 50%;\r\n }\r\n 50% {\r\n background-position: 100% 50%;\r\n }\r\n }\r\n\r\n @keyframes progressWave {\r\n 0% {\r\n transform: translateX(-100%) scaleX(1);\r\n opacity: 0.8;\r\n }\r\n 50% {\r\n transform: translateX(0%) scaleX(1.5);\r\n opacity: 1;\r\n }\r\n 100% {\r\n transform: translateX(100%) scaleX(1);\r\n opacity: 0.8;\r\n }\r\n }\r\n\r\n .animate-custom-bounce {\r\n animation-name: custom-bounce;\r\n animation-duration: 2s;\r\n animation-iteration-count: infinite;\r\n }\r\n\r\n .animate-logo-luxury {\r\n animation: logoLuxury 4s ease-in-out infinite;\r\n }\r\n\r\n .animate-float {\r\n animation: float 6s ease-in-out infinite;\r\n }\r\n\r\n .animate-spin-slow {\r\n animation: spinSlow 8s linear infinite;\r\n }\r\n\r\n .animate-rotate-slow {\r\n animation: rotateSlow 12s linear infinite;\r\n }\r\n\r\n .animate-gradient-shift {\r\n background-size: 300% 300%;\r\n animation: gradientShift 3s ease infinite;\r\n }\r\n\r\n .animate-progress-wave {\r\n animation: progressWave 2s ease-in-out infinite;\r\n }\r\n\r\n .dot-container .dot:nth-child(1) { animation-delay: 0s; }\r\n .dot-container .dot:nth-child(2) { animation-delay: 0.15s; }\r\n .dot-container .dot:nth-child(3) { animation-delay: 0.3s; }\r\n .dot-container .dot:nth-child(4) { animation-delay: 0.45s; }\r\n .dot-container .dot:nth-child(5) { animation-delay: 0.6s; }\r\n .dot-container .dot:nth-child(6) { animation-delay: 0.75s; }\r\n .dot-container .dot:nth-child(7) { animation-delay: 0.9s; }\r\n .dot-container .dot:nth-child(8) { animation-delay: 1.05s; }\r\n `}</style>\r\n <div className=\"relative min-h-screen bg-gradient-to-br from-background via-dashboard-welcome-bg to-muted-secondary overflow-hidden\">\r\n <div className=\"absolute inset-0\">\r\n {[...Array(25)].map((_, i) => (\r\n <div\r\n key={i}\r\n className=\"absolute w-2 h-2 bg-primary/20 rounded-full animate-float\"\r\n style={{\r\n left: `${Math.random() * 100}%`,\r\n top: `${Math.random() * 100}%`,\r\n animationDelay: `${Math.random() * 5}s`,\r\n animationDuration: `${3 + Math.random() * 4}s`,\r\n }}\r\n />\r\n ))}\r\n </div>\r\n\r\n <div className=\"relative z-10 flex flex-col items-center justify-center min-h-screen px-4\">\r\n\r\n <div className=\"relative mb-5 md:mb-10\">\r\n <div className=\"absolute inset-0 rounded-full bg-gradient-to-r from-primary via-secondary to-primary opacity-30 blur-2xl animate-spin-slow scale-150\"></div>\r\n\r\n <div className=\"absolute inset-4 rounded-full bg-gradient-to-r from-secondary via-primary to-secondary opacity-40 blur-xl animate-pulse\"></div>\r\n\r\n <div className=\"relative bg-white/10 backdrop-blur-sm rounded-full p-8 border border-white/20 shadow-2xl\">\r\n <div className=\"relative\">\r\n <img\r\n src={tccd_logo}\r\n alt=\"TCCD logo\"\r\n className=\"relative z-10 animate-logo-luxury drop-shadow-2xl lg:w-[160px] md:w-[135px] w-[110px]\"\r\n />\r\n\r\n <div className=\"absolute inset-0 bg-gradient-to-tr from-transparent via-white/40 to-transparent animate-rotate-slow opacity-60\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"text-center mb-4\">\r\n <h1 className=\"lg:text-3xl md:text-2xl text-xl font-bold bg-gradient-to-r from-primary via-secondary to-primary bg-clip-text text-transparent animate-gradient-shift mb-4\">\r\n Loading your experience...\r\n </h1>\r\n\r\n <p className=\"text-dashboard-description lg:text-lg md:text-md text-sm font-medium opacity-80\">\r\n Please wait while we prepare everything for you\r\n </p>\r\n </div>\r\n\r\n <div className=\"relative w-80 mb-8\">\r\n <div className=\"h-2 bg-muted-secondary/30 rounded-full overflow-hidden backdrop-blur-sm\">\r\n <div className=\"h-full bg-gradient-to-r from-primary via-secondary to-primary animate-progress-wave\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"absolute top-8 left-8 w-16 h-16 border-l-2 border-t-2 border-primary/30 rounded-tl-lg\"></div>\r\n <div className=\"absolute top-8 right-8 w-16 h-16 border-r-2 border-t-2 border-secondary/30 rounded-tr-lg\"></div>\r\n <div className=\"absolute bottom-8 left-8 w-16 h-16 border-l-2 border-b-2 border-secondary/30 rounded-bl-lg\"></div>\r\n <div className=\"absolute bottom-8 right-8 w-16 h-16 border-r-2 border-b-2 border-primary/30 rounded-br-lg\"></div>\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default LoadingPage;\r\n","import { useEffect, useRef } from \"react\";\r\nimport type { ReactNode } from \"react\";\r\nimport { LuX } from \"react-icons/lu\";\r\nimport React from 'react';\r\n\r\nconst Modal = ({\r\n title,\r\n isOpen,\r\n onClose,\r\n children,\r\n}: {\r\n title: string;\r\n isOpen: boolean;\r\n onClose: () => void;\r\n children: ReactNode;\r\n}) => {\r\n const modalRef = useRef<HTMLDivElement>(null);\r\n const previousFocusRef = useRef<HTMLElement | null>(null);\r\n\r\n useEffect(() => {\r\n if (isOpen) {\r\n // Store the previously focused element\r\n previousFocusRef.current = document.activeElement as HTMLElement;\r\n\r\n // Focus the modal\r\n modalRef.current?.focus();\r\n\r\n // Prevent body scroll\r\n document.body.style.overflow = \"hidden\";\r\n } else {\r\n // Restore body scroll\r\n document.body.style.overflow = \"unset\";\r\n\r\n // Restore focus to previously focused element\r\n previousFocusRef.current?.focus();\r\n }\r\n\r\n return () => {\r\n document.body.style.overflow = \"unset\";\r\n };\r\n }, [isOpen]);\r\n\r\n useEffect(() => {\r\n const handleEscape = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\" && isOpen) {\r\n onClose();\r\n }\r\n };\r\n\r\n document.addEventListener(\"keydown\", handleEscape);\r\n return () => document.removeEventListener(\"keydown\", handleEscape);\r\n }, [isOpen, onClose]);\r\n\r\n const handleBackdropClick = (e: React.MouseEvent<HTMLDivElement>) => {\r\n if (e.target === e.currentTarget) {\r\n onClose();\r\n }\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n return (\r\n <div\r\n className=\"fixed inset-0 bg-black/30 backdrop-blur-sm flex items-center justify-center z-50\"\r\n onClick={handleBackdropClick}\r\n >\r\n <div\r\n ref={modalRef}\r\n className=\"bg-background rounded-lg shadow-xl w-full mx-4 sm:max-w-lg xl:max-w-xl max-h-[90vh] flex flex-col overflow-y-auto\"\r\n tabIndex={-1}\r\n >\r\n <div className=\"p-4 sm:p-6 flex-1 flex flex-col\">\r\n <div className=\"flex justify-between items-center mb-4\">\r\n <h2\r\n id=\"modal-title\"\r\n className=\"text-lg sm:text-xl md:text-2xl font-bold text-primary\"\r\n >\r\n {title}\r\n </h2>\r\n <span\r\n onClick={onClose}\r\n className=\"text-gray-400 hover:text-gray-600 transition-colors duration-300 p-1 text-xl sm:text-2xl md:text-3xl cursor-pointer\"\r\n >\r\n <LuX />\r\n </span>\r\n </div>\r\n {children}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default Modal;\r\n","import { useState } from \"react\";\r\nimport React from 'react';\r\n\r\nexport default function NumberField({\r\n label,\r\n value,\r\n placeholder,\r\n onChange,\r\n error,\r\n maxLength,\r\n id,\r\n}: {\r\n label: string;\r\n id: string;\r\n value: string;\r\n placeholder: string;\r\n maxLength?: number;\r\n onChange: (newValue: React.ChangeEvent<HTMLInputElement>) => void;\r\n error?: string;\r\n}) {\r\n const [lengthError, setLengthError] = useState<string | null>(null);\r\n function handleChange(e: React.ChangeEvent<HTMLInputElement>) {\r\n const inputValue = e.target.value;\r\n if (maxLength && inputValue.length > maxLength) {\r\n setLengthError(`Maximum length of ${maxLength} characters exceeded.`);\r\n return;\r\n }\r\n lengthError && setLengthError(null);\r\n onChange(e);\r\n }\r\n return (\r\n <div className=\"flex flex-col w-full\">\r\n <label className=\"text-label text-[14px] md:text-[15px] lg:text-[16px] mb-2 font-semibold\">\r\n {label}\r\n </label>\r\n <input\r\n id={id}\r\n value={value}\r\n type=\"number\"\r\n placeholder={placeholder}\r\n onChange={handleChange}\r\n className={`border-gray-400 rounded-xl px-3 py-2 md:px-4 md:py-3 border outline-none ${\r\n error || lengthError\r\n ? \"border-red-300 focus:border-red-500 focus:ring-red-500/30\"\r\n : \"focus:border-primary\"\r\n } transition-all duration-300 ease-in-out text-sm`}\r\n />\r\n </div>\r\n );\r\n}\r\n","import { useState } from \"react\";\r\nimport { LuEye, LuEyeOff } from \"react-icons/lu\";\r\nimport React from 'react';\r\n\r\nexport default function PasswordField({\r\n value,\r\n onChange,\r\n error,\r\n}: {\r\n value: string;\r\n onChange: (newValue: React.ChangeEvent<HTMLInputElement>) => void;\r\n error?: string;\r\n}) {\r\n const [show, setShow] = useState(false);\r\n\r\n return (\r\n <div className=\"flex flex-col w-full\">\r\n <label className=\"text-label text-[14px] md:text-[15px] lg:text-[16px] mb-2 font-semibold\">\r\n Password\r\n </label>\r\n <div className=\"relative\">\r\n <input\r\n id=\"password\"\r\n value={value}\r\n placeholder=\"Enter your Password\"\r\n onChange={(e) => onChange(e)}\r\n type={show ? \"text\" : \"password\"}\r\n className={`border-gray-400 rounded-xl px-3 py-2 md:px-4 md:py-3 border outline-none ${\r\n error\r\n ? \"border-red-300 focus:border-red-500 focus:ring-red-500/30\"\r\n : \"focus:border-primary\"\r\n } transition-all duration-300 ease-in-out text-sm w-full pr-10 `}\r\n />\r\n <button\r\n type=\"button\"\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 contrast-50 cursor-pointer transition duration-300 ease-in-out hover:contrast-100\"\r\n onClick={() => setShow(!show)}\r\n tabIndex={-1}\r\n >\r\n {show ? <LuEyeOff size={20} /> : <LuEye size={20} />}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","\r\n\r\nexport default function Radiobutton({label, checked, onChange}: {label: string, checked: boolean, onChange: (newValue: boolean) => void}) {\r\n return (\r\n <label className=\"inline-flex items-center cursor-pointer relative pl-7 select-none\">\r\n <input\r\n type=\"radio\"\r\n checked={checked}\r\n onChange={(e) => onChange(e.target.checked)}\r\n className=\"peer absolute left-0 top-1/2 -translate-y-1/2 w-5 h-5 opacity-0 cursor-pointer\"\r\n />\r\n <span className=\"\r\n absolute left-0 top-1/2 -translate-y-1/2 w-5 h-5 rounded-full\r\n border-2 border-gray-300 bg-background\r\n flex items-center justify-center\r\n transition-colors\r\n pointer-events-none\r\n \">\r\n <span className={`w-3 h-3 ${checked ? 'bg-primary' : 'bg-transparent'} rounded-full transition-all`} />\r\n </span>\r\n <span className=\"text-sm\">{label}</span>\r\n </label>\r\n );\r\n}","import { HiOutlineMagnifyingGlass } from \"react-icons/hi2\";\r\n\r\ninterface SearchFieldProps {\r\n value: string;\r\n onChange: (value: string) => void;\r\n placeholder?: string;\r\n className?: string;\r\n}\r\n\r\nexport default function SearchField({\r\n value,\r\n onChange,\r\n placeholder = \"Search...\",\r\n className = \"\"\r\n}: SearchFieldProps) {\r\n return (\r\n <div className={`relative w-full lg:w-96 ${className}`}>\r\n <div className=\"relative\">\r\n <span className=\"absolute left-4 top-1/2 transform -translate-y-1/2 text-muted-secondary/60 text-lg\">\r\n <HiOutlineMagnifyingGlass />\r\n </span>\r\n <input\r\n type=\"text\"\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n placeholder={placeholder}\r\n className=\"w-full bg-background/50 rounded-3xl border-contrast pl-12 pr-4 py-2 text-[14px] md:text-[15px] lg:text-[16px] border focus:border-primary focus:outline-none transition-all duration-300 ease-in-out placeholder:text-muted-secondary\"\r\n />\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState, useRef } from \"react\";\r\nimport React from 'react';\r\n\r\nexport default function TextAreaField({\r\n label,\r\n value,\r\n placeholder,\r\n onChange,\r\n error,\r\n maxLength,\r\n id,\r\n}: {\r\n label: string;\r\n id: string;\r\n value: string;\r\n placeholder: string;\r\n maxLength?: number;\r\n onChange: (newValue: React.ChangeEvent<HTMLTextAreaElement>) => void;\r\n error?: string;\r\n}) {\r\n const [lengthError, setLengthError] = useState<string | null>(null);\r\n const textareaRef = useRef<HTMLTextAreaElement>(null);\r\n function handleChange(e: React.ChangeEvent<HTMLTextAreaElement>) {\r\n const inputValue = e.target.value;\r\n if (maxLength && inputValue.length > maxLength) {\r\n setLengthError(`Maximum length of ${maxLength} characters exceeded.`);\r\n return;\r\n }\r\n lengthError && setLengthError(null);\r\n if (textareaRef.current) {\r\n textareaRef.current.style.height = \"auto\";\r\n textareaRef.current.style.height =\r\n textareaRef.current.scrollHeight + \"px\";\r\n }\r\n onChange(e);\r\n }\r\n return (\r\n <div className=\"flex flex-col w-full\">\r\n <label className=\"text-label text-[14px] md:text-[15px] lg:text-[16px] mb-2 font-semibold\">\r\n {label}\r\n </label>\r\n <textarea\r\n ref={textareaRef}\r\n id={id}\r\n onChange={handleChange}\r\n value={value}\r\n placeholder={placeholder}\r\n rows={4}\r\n className={`border-gray-400 rounded-xl px-3 py-2 md:px-4 md:py-3 border outline-none ${\r\n error || lengthError\r\n ? \"border-red-300 focus:border-red-500 focus:ring-red-500/30\"\r\n : \"focus:border-primary\"\r\n } transition-all duration-300 ease-in-out text-sm`}\r\n />\r\n {maxLength && (\r\n <p className=\"text-[9px] md:text-[10px] lg:text-[11px] p-1 text-inactive-tab-text\">\r\n {value.length}/{maxLength}\r\n </p>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { HiMiniXMark } from \"react-icons/hi2\";\r\n\r\nexport default function UnauthorizedPage() {\r\n return (\r\n <div className=\"w-screen h-screen flex flex-col justify-center items-center bg-background\">\r\n <div className=\"w-fit rounded-2xl bg-background p-8 shadow-[0_0px_20px_rgba(0,0,0,0.2)] flex flex-col items-center\">\r\n <div className=\"rounded-full bg-muted-primary md:p-4 p-2 mb-4 md:mb-6 lg:mb-8 w-fit\">\r\n <span className=\"text-[52px] md:text-[56px] lg:text-[60px] text-primary\">\r\n <HiMiniXMark />\r\n </span>\r\n </div>\r\n <p className=\"text-[24px] md:text-[28px] lg:text-[32px] font-bold mb-2 md:mb-4\">Unauthorized Access</p>\r\n <p className=\"text-[14px] md:text-[16px] text-center max-w-md text-inactive-tab-text font-medium\">\r\n Sorry, you do not have the necessary permissions to view this page .\r\n </p>\r\n </div>\r\n </div>\r\n )\r\n}"],"mappings":"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","names":["import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_lu","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_hi2","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/types/index.ts","../src/components/Button.tsx","../src/components/Checkbox.tsx","../src/components/DatePicker.tsx","../src/components/DropdownMenu.tsx","../src/components/ErrorScreen.tsx","../src/components/InputField.tsx","../src/components/LazyImageLoader.tsx","../src/components/LoadingPage.tsx","../src/components/Modal.tsx","../src/components/NumberField.tsx","../src/components/PasswordField.tsx","../src/components/RadioButton.tsx","../src/components/SearchField.tsx","../src/components/TextAreaField.tsx","../src/components/UnauthorizedPage.tsx"],"sourcesContent":["export { default as Button } from \"./components/Button\";\r\nexport { default as Checkbox } from \"./components/Checkbox\";\r\nexport { default as DatePicker } from \"./components/DatePicker\";\r\nexport { default as DropdownMenu } from \"./components/DropdownMenu\";\r\nexport { default as ErrorScreen } from \"./components/ErrorScreen\";\r\nexport { default as InputField } from \"./components/InputField\";\r\nexport { default as LazyImageLoader } from \"./components/LazyImageLoader\";\r\nexport { default as LoadingPage } from \"./components/LoadingPage\";\r\nexport { default as Modal } from \"./components/Modal\";\r\nexport { default as NumberField } from \"./components/NumberField\";\r\nexport { default as PasswordField } from \"./components/PasswordField\";\r\nexport { default as RadioButton } from \"./components/RadioButton\";\r\nexport { default as SearchField } from \"./components/SearchField\";\r\nexport { default as TextAreaField } from \"./components/TextAreaField\";\r\nexport { default as UnauthorizedPage } from \"./components/UnauthorizedPage\";\r\nexport * from \"./types\";\r\n","export const ButtonTypes = {\r\n PRIMARY: \"primary\",\r\n SECONDARY: \"secondary\",\r\n TERTIARY: \"tertiary\",\r\n DANGER: \"danger\",\r\n GHOST: \"ghost\",\r\n BASIC: \"basic\"\r\n} as const;\r\n\r\nexport type ButtonTypes = typeof ButtonTypes[keyof typeof ButtonTypes];\r\n\r\nexport const ButtonWidths = {\r\n AUTO: \"auto\",\r\n SMALL: \"small\",\r\n MEDIUM: \"medium\",\r\n LARGE: \"large\",\r\n XL: \"xl\",\r\n FULL: \"full\"\r\n} as const;\r\n\r\nexport type ButtonWidths = typeof ButtonWidths[keyof typeof ButtonWidths];\r\n\r\nexport interface DropdownOption {\r\n value: string;\r\n label: string;\r\n disabled?: boolean;\r\n}\r\n","import { ButtonTypes, ButtonWidths } from \"../types\";\r\nimport { AiOutlineLoading3Quarters } from \"react-icons/ai\";\r\nimport React from \"react\";\r\n\r\ninterface ButtonProps {\r\n buttonText?: string;\r\n buttonIcon?: React.ReactNode;\r\n onClick: () => void;\r\n type: ButtonTypes;\r\n disabled?: boolean;\r\n loading?: boolean;\r\n width?: ButtonWidths;\r\n}\r\n\r\nconst Button = ({ buttonText, buttonIcon, onClick, type, disabled = false, loading = false, width = ButtonWidths.AUTO }: ButtonProps) => {\r\n const isDisabled = disabled || loading;\r\n\r\n const stylePresets: Record<ButtonTypes, string> = {\r\n primary: \"bg-primary text-text border-primary\",\r\n secondary: \"bg-secondary text-text border-secondary\",\r\n tertiary: \"bg-contrast text-text border-contrast\",\r\n danger: \"border-primary text-primary\",\r\n ghost: \"text-secondary border-secondary\",\r\n basic: \"border-contrast\"\r\n }\r\n\r\n const hoverStyles: Record<ButtonTypes, string> = {\r\n primary: \"hover:bg-background hover:border-primary hover:text-primary\",\r\n secondary: \"hover:bg-background hover:border-secondary hover:text-secondary\",\r\n tertiary: \"hover:bg-background hover:border-tertiary hover:text-black\",\r\n danger: \"hover:bg-primary hover:text-text\",\r\n ghost: \"hover:bg-secondary/30\",\r\n basic: \"hover:bg-contrast/30\",\r\n }\r\n\r\n const disabledStyles = \"opacity-50\";\r\n\r\n const widthStyles: Record<ButtonWidths, string> = {\r\n auto: \"w-auto\",\r\n small: \"w-24\",\r\n medium: \"w-32\",\r\n large: \"w-48\",\r\n xl: \"w-64\",\r\n full: \"w-full\"\r\n }\r\n\r\n const handleClick = () => {\r\n if (!isDisabled) {\r\n onClick();\r\n }\r\n };\r\n\r\n return (\r\n <button\r\n onClick={handleClick}\r\n disabled={isDisabled}\r\n className={`\r\n ${stylePresets[type]} \r\n ${!isDisabled ? hoverStyles[type] : ''} \r\n ${isDisabled ? disabledStyles : ''} \r\n ${widthStyles[width]}\r\n rounded-full px-6 py-2 border font-bold text-[11px] lg:text-[12px] whitespace-nowrap\r\n transition-all duration-200 ease-in-out flex items-center justify-center h-fit\r\n ${isDisabled ? 'cursor-not-allowed' : 'cursor-pointer'}\r\n `}\r\n >\r\n {loading && (\r\n <span className=\"animate-spin -ml-1 mr-2 h-4 w-4 inline-block\">\r\n <AiOutlineLoading3Quarters />\r\n </span>\r\n )}\r\n {loading ? 'Loading...' : buttonText}\r\n {buttonIcon && !loading && (\r\n <span className=\"ml-2 inline-block\">\r\n {buttonIcon}\r\n </span>\r\n )}\r\n </button>\r\n )\r\n}\r\n\r\nexport default Button;","export default function Checkbox({label, checked, onChange}: {label: string, checked: boolean, onChange: () => void}) {\r\n return (\r\n <label className=\"inline-flex items-center cursor-pointer relative pl-7 select-none\">\r\n <input\r\n type=\"checkbox\"\r\n checked={checked}\r\n onChange={() => onChange()}\r\n className=\"peer absolute left-0 top-1/2 -translate-y-1/2 w-5 h-5 opacity-0 cursor-pointer\"\r\n />\r\n <span className=\"\r\n absolute left-0 top-1/2 -translate-y-1/2 w-5 h-5 rounded-md\r\n border-2 border-gray-300 bg-white\r\n peer-checked:bg-primary peer-checked:border-primary\r\n flex items-center justify-center\r\n transition-colors\r\n pointer-events-none\r\n \">\r\n <svg\r\n className=\"w-4 h-4 text-white\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"3\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\r\n </svg>\r\n </span>\r\n <span className=\"text-sm\">{label}</span>\r\n </label>\r\n );\r\n}","import React from 'react';\r\nimport { MdCalendarToday } from 'react-icons/md';\r\n\r\ninterface DatePickerProps {\r\n label: string;\r\n id: string;\r\n value: string;\r\n onChange: (date: string) => void;\r\n error?: string;\r\n disabled?: boolean;\r\n minDate?: string;\r\n maxDate?: string;\r\n}\r\n\r\nexport default function DatePicker({\r\n label,\r\n id,\r\n value,\r\n onChange,\r\n error,\r\n disabled = false,\r\n minDate,\r\n maxDate,\r\n}: DatePickerProps) {\r\n const handleDateChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n onChange(e.target.value.toString());\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col w-full\">\r\n <label className=\"text-label text-[14px] md:text-[15px] lg:text-[16px] mb-2 font-semibold\">\r\n {label}\r\n </label>\r\n\r\n <div className=\"relative\">\r\n <input\r\n id={id}\r\n type=\"date\"\r\n value={value}\r\n onChange={handleDateChange}\r\n disabled={disabled}\r\n min={minDate}\r\n max={maxDate}\r\n className={`w-full border-contrast rounded-xl px-3 py-2 md:px-4 md:py-3 border outline-none ${error\r\n ? \"border-red-300 focus:border-red-500 focus:ring-red-500/30\"\r\n : \"focus:border-primary\"\r\n } ${disabled ? \"bg-gray-100 cursor-not-allowed opacity-60\" : \"bg-white\"\r\n } transition-all duration-300 ease-in-out text-sm pr-10 [&::-webkit-calendar-picker-indicator]:opacity-0 [&::-webkit-calendar-picker-indicator]:absolute [&::-webkit-calendar-picker-indicator]:right-3 [&::-webkit-calendar-picker-indicator]:w-5 [&::-webkit-calendar-picker-indicator]:h-5 [&::-webkit-calendar-picker-indicator]:cursor-pointer`}\r\n />\r\n\r\n <div className=\"absolute right-3 top-1/2 transform -translate-y-1/2 pointer-events-none\">\r\n <span className={`w-5 h-5 ${disabled ? \"text-gray-400\" : \"text-secondary\"}`}>\r\n <MdCalendarToday />\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {error && (\r\n <span className=\"text-red-500 text-sm font-medium mt-1\">{error}</span>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useRef, useEffect } from \"react\";\r\nimport { IoChevronDown } from \"react-icons/io5\";\r\nimport Button from \"./Button\";\r\nimport { ButtonTypes, ButtonWidths } from \"../types\";\r\nimport type { DropdownOption } from \"../types\";\r\n\r\ninterface DropdownMenuProps {\r\n label?: string;\r\n placeholder?: string;\r\n options: DropdownOption[];\r\n value?: string;\r\n onChange: (value: string) => void;\r\n error?: string;\r\n disabled?: boolean;\r\n className?: string;\r\n id?: string;\r\n}\r\n\r\nexport default function DropdownMenu({\r\n label,\r\n placeholder = \"Select an option\",\r\n options,\r\n value,\r\n onChange,\r\n error,\r\n disabled = false,\r\n className = \"\",\r\n id,\r\n}: DropdownMenuProps) {\r\n const [isOpen, setIsOpen] = useState(false);\r\n const dropdownRef = useRef<HTMLDivElement>(null);\r\n\r\n const selectedOption = options.find((option) => option.value === value);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (\r\n dropdownRef.current &&\r\n !dropdownRef.current.contains(event.target as Node)\r\n ) {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, []);\r\n\r\n const handleOptionClick = (optionValue: string) => {\r\n if (!disabled) {\r\n onChange(optionValue);\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className={`flex flex-col w-full ${className}`}>\r\n {label && (\r\n <label\r\n htmlFor={id}\r\n className=\"text-label text-[14px] md:text-[15px] lg:text-[16px] mb-2 font-semibold\"\r\n >\r\n {label}\r\n </label>\r\n )}\r\n\r\n <div className=\"relative\" ref={dropdownRef}>\r\n <div className=\"relative\">\r\n <Button\r\n buttonText={selectedOption ? selectedOption.label : placeholder}\r\n onClick={() => !disabled && setIsOpen(!isOpen)}\r\n type={ButtonTypes.BASIC}\r\n disabled={disabled}\r\n width={ButtonWidths.FULL}\r\n />\r\n <span\r\n className={`absolute right-3 top-1/2 transform -translate-y-1/2 w-5 h-5 text-secondary transition-transform duration-200 pointer-events-none ${\r\n isOpen ? \"rotate-180\" : \"\"\r\n }`}\r\n >\r\n <IoChevronDown />\r\n </span>\r\n </div>\r\n\r\n {isOpen && !disabled && (\r\n <div className=\"absolute z-50 w-full mt-1 bg-white border border-secondary/30 rounded-xl shadow-lg max-h-60 overflow-y-auto\">\r\n {options.length === 0 ? (\r\n <div className=\"px-3 py-2 text-sm text-muted-secondary\">\r\n No options available\r\n </div>\r\n ) : (\r\n options.map((option) => (\r\n <button\r\n key={option.value}\r\n type=\"button\"\r\n onClick={() => handleOptionClick(option.value)}\r\n disabled={option.disabled}\r\n className={`\r\n w-full px-3 py-2 text-left text-sm transition-colors duration-150\r\n ${\r\n option.disabled\r\n ? \"text-gray-400 cursor-not-allowed\"\r\n : \"text-gray-900 hover:bg-secondary/10 hover:text-secondary cursor-pointer\"\r\n }\r\n ${\r\n value === option.value\r\n ? \"bg-secondary/20 text-secondary font-medium\"\r\n : \"\"\r\n }\r\n first:rounded-t-xl last:rounded-b-xl\r\n `}\r\n >\r\n {option.label}\r\n </button>\r\n ))\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {error && <p className=\"mt-1 text-sm text-red-600\">{error}</p>}\r\n </div>\r\n );\r\n}\r\n","import { FaExclamationTriangle } from \"react-icons/fa\";\r\n\r\ninterface ErrorComponentProps {\r\n title: string;\r\n message: string;\r\n}\r\n\r\nexport default function ErrorComponent({\r\n title,\r\n message,\r\n}: ErrorComponentProps) {\r\n return (\r\n <div className=\"min-h-screen bg-background\">\r\n <div className=\"w-full md:w-3/4 lg:w-10/12 m-auto rounded-xl shadow-md p-5 flex flex-col gap-4\">\r\n {/* Error Container */}\r\n <div className=\"flex flex-col items-center justify-center py-16 px-4\">\r\n {/* Error Icon */}\r\n <div className=\"mb-6\">\r\n <div className=\"w-20 h-20 bg-red-100 rounded-full flex items-center justify-center\">\r\n <span className=\"text-error text-3xl\">\r\n <FaExclamationTriangle />\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Error Title */}\r\n <h1 className=\"text-2xl md:text-3xl lg:text-4xl font-bold text-error mb-4 text-center\">\r\n {title}\r\n </h1>\r\n\r\n {/* Error Message */}\r\n <p className=\"text-base md:text-lg text-center mb-8 max-w-md\">\r\n {message}\r\n </p>\r\n </div>\r\n\r\n <div className=\"mt-8 bg-red-50 border border-red-200 rounded-xl p-4\">\r\n <h3 className=\"font-semibold text-red-800 mb-2\">\r\n Technical Details\r\n </h3>\r\n <div className=\"text-red-700 text-sm space-y-1\">\r\n <p>• Check your internet connection</p>\r\n <p>• The page may be temporarily unavailable</p>\r\n <p>• Contact support if the problem persists</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport default function InputField({\r\n label,\r\n value,\r\n placeholder,\r\n onChange,\r\n error,\r\n id,\r\n}: {\r\n label: string;\r\n id: string;\r\n value: string;\r\n placeholder: string;\r\n onChange: (newValue: React.ChangeEvent<HTMLInputElement>) => void;\r\n error?: string;\r\n}) {\r\n return (\r\n <div className=\"flex flex-col w-full\">\r\n <label className=\"text-label text-[14px] md:text-[15px] lg:text-[16px] mb-2 font-semibold\">\r\n {label}\r\n </label>\r\n <input\r\n id={id}\r\n value={value}\r\n placeholder={placeholder}\r\n onChange={(e) => onChange(e)}\r\n className={`border-gray-400 rounded-xl px-3 py-2 md:px-4 md:py-3 border outline-none ${\r\n error\r\n ? \"border-red-300 focus:border-red-500 focus:ring-red-500/30\"\r\n : \"focus:border-primary\"\r\n } transition-all duration-300 ease-in-out text-sm`}\r\n />\r\n </div>\r\n );\r\n}\r\n","import { useState } from \"react\";\r\nimport { HiOutlinePhotograph } from \"react-icons/hi\";\r\n\r\ninterface LazyImageLoaderProps {\r\n src: string;\r\n alt: string;\r\n className?: string;\r\n width?: string | number;\r\n height?: string | number;\r\n}\r\n\r\nexport default function LazyImageLoader({ \r\n src, \r\n alt, \r\n className = \"\", \r\n width = \"100%\", \r\n height = \"200px\" \r\n}: LazyImageLoaderProps) {\r\n const [imageLoaded, setImageLoaded] = useState(false);\r\n const [imageError, setImageError] = useState(false);\r\n\r\n const handleImageLoad = () => {\r\n setImageLoaded(true);\r\n };\r\n\r\n const handleImageError = () => {\r\n setImageError(true);\r\n setImageLoaded(true);\r\n };\r\n\r\n return (\r\n <div \r\n className={`relative overflow-hidden ${className}`}\r\n style={{ width, height }}\r\n >\r\n {!imageLoaded && (\r\n <div className=\"absolute inset-0 bg-gray-200 animate-pulse\">\r\n <div className=\"absolute inset-0 bg-gradient-to-r from-gray-200 via-gray-100 to-gray-200 animate-shimmer\"></div>\r\n </div>\r\n )}\r\n\r\n {imageError && (\r\n <div className=\"absolute inset-0 bg-gray-100 flex items-center justify-center\">\r\n <div className=\"text-center text-gray-400\">\r\n <span className=\"w-12 h-12 mx-auto mb-2\">\r\n <HiOutlinePhotograph />\r\n </span>\r\n <p className=\"text-sm\">Failed to load</p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <img\r\n src={src}\r\n alt={alt}\r\n onLoad={handleImageLoad}\r\n onError={handleImageError}\r\n className={`w-full h-full object-cover transition-opacity duration-300 ${\r\n imageLoaded ? \"opacity-100\" : \"opacity-0\"\r\n }`}\r\n />\r\n </div>\r\n );\r\n}\r\n","import tccd_logo from \"../assets/TCCD_logo.svg\";\r\n\r\nconst LoadingPage = () => {\r\n return (\r\n <>\r\n <style>{`\r\n @keyframes custom-bounce {\r\n 0%, 100% {\r\n transform: translateY(0);\r\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\r\n }\r\n 50% {\r\n transform: translateY(-8px);\r\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\r\n }\r\n }\r\n\r\n @keyframes logoLuxury {\r\n 0% {\r\n filter: brightness(1) contrast(1) drop-shadow(0 0 15px rgba(205, 58, 56, 0.3)) saturate(1);\r\n transform: scale(1) rotate(0deg);\r\n }\r\n 25% {\r\n filter: brightness(1.2) contrast(1.2) drop-shadow(0 0 25px rgba(41, 94, 126, 0.5)) saturate(1.2);\r\n transform: scale(1.05) rotate(2deg);\r\n }\r\n 50% {\r\n filter: brightness(1.4) contrast(1.3) drop-shadow(0 0 35px rgba(205, 58, 56, 0.7)) saturate(1.4);\r\n transform: scale(1.08) rotate(0deg);\r\n }\r\n 75% {\r\n filter: brightness(1.2) contrast(1.2) drop-shadow(0 0 25px rgba(41, 94, 126, 0.5)) saturate(1.2);\r\n transform: scale(1.05) rotate(-2deg);\r\n }\r\n 100% {\r\n filter: brightness(1) contrast(1) drop-shadow(0 0 15px rgba(205, 58, 56, 0.3)) saturate(1);\r\n transform: scale(1) rotate(0deg);\r\n }\r\n }\r\n\r\n @keyframes float {\r\n 0%, 100% {\r\n transform: translateY(0px) translateX(0px) scale(1);\r\n opacity: 0.3;\r\n }\r\n 50% {\r\n transform: translateY(-20px) translateX(10px) scale(1.2);\r\n opacity: 0.8;\r\n }\r\n }\r\n\r\n @keyframes spinSlow {\r\n from {\r\n transform: rotate(0deg);\r\n }\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n\r\n @keyframes rotateSlow {\r\n from {\r\n transform: rotate(0deg);\r\n }\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n\r\n @keyframes gradientShift {\r\n 0%, 100% {\r\n background-position: 0% 50%;\r\n }\r\n 50% {\r\n background-position: 100% 50%;\r\n }\r\n }\r\n\r\n @keyframes progressWave {\r\n 0% {\r\n transform: translateX(-100%) scaleX(1);\r\n opacity: 0.8;\r\n }\r\n 50% {\r\n transform: translateX(0%) scaleX(1.5);\r\n opacity: 1;\r\n }\r\n 100% {\r\n transform: translateX(100%) scaleX(1);\r\n opacity: 0.8;\r\n }\r\n }\r\n\r\n .animate-custom-bounce {\r\n animation-name: custom-bounce;\r\n animation-duration: 2s;\r\n animation-iteration-count: infinite;\r\n }\r\n\r\n .animate-logo-luxury {\r\n animation: logoLuxury 4s ease-in-out infinite;\r\n }\r\n\r\n .animate-float {\r\n animation: float 6s ease-in-out infinite;\r\n }\r\n\r\n .animate-spin-slow {\r\n animation: spinSlow 8s linear infinite;\r\n }\r\n\r\n .animate-rotate-slow {\r\n animation: rotateSlow 12s linear infinite;\r\n }\r\n\r\n .animate-gradient-shift {\r\n background-size: 300% 300%;\r\n animation: gradientShift 3s ease infinite;\r\n }\r\n\r\n .animate-progress-wave {\r\n animation: progressWave 2s ease-in-out infinite;\r\n }\r\n\r\n .dot-container .dot:nth-child(1) { animation-delay: 0s; }\r\n .dot-container .dot:nth-child(2) { animation-delay: 0.15s; }\r\n .dot-container .dot:nth-child(3) { animation-delay: 0.3s; }\r\n .dot-container .dot:nth-child(4) { animation-delay: 0.45s; }\r\n .dot-container .dot:nth-child(5) { animation-delay: 0.6s; }\r\n .dot-container .dot:nth-child(6) { animation-delay: 0.75s; }\r\n .dot-container .dot:nth-child(7) { animation-delay: 0.9s; }\r\n .dot-container .dot:nth-child(8) { animation-delay: 1.05s; }\r\n `}</style>\r\n <div className=\"relative min-h-screen bg-gradient-to-br from-background via-dashboard-welcome-bg to-muted-secondary overflow-hidden\">\r\n <div className=\"absolute inset-0\">\r\n {[...Array(25)].map((_, i) => (\r\n <div\r\n key={i}\r\n className=\"absolute w-2 h-2 bg-primary/20 rounded-full animate-float\"\r\n style={{\r\n left: `${Math.random() * 100}%`,\r\n top: `${Math.random() * 100}%`,\r\n animationDelay: `${Math.random() * 5}s`,\r\n animationDuration: `${3 + Math.random() * 4}s`,\r\n }}\r\n />\r\n ))}\r\n </div>\r\n\r\n <div className=\"relative z-10 flex flex-col items-center justify-center min-h-screen px-4\">\r\n\r\n <div className=\"relative mb-5 md:mb-10\">\r\n <div className=\"absolute inset-0 rounded-full bg-gradient-to-r from-primary via-secondary to-primary opacity-30 blur-2xl animate-spin-slow scale-150\"></div>\r\n\r\n <div className=\"absolute inset-4 rounded-full bg-gradient-to-r from-secondary via-primary to-secondary opacity-40 blur-xl animate-pulse\"></div>\r\n\r\n <div className=\"relative bg-white/10 backdrop-blur-sm rounded-full p-8 border border-white/20 shadow-2xl\">\r\n <div className=\"relative\">\r\n <img\r\n src={tccd_logo}\r\n alt=\"TCCD logo\"\r\n className=\"relative z-10 animate-logo-luxury drop-shadow-2xl lg:w-[160px] md:w-[135px] w-[110px]\"\r\n />\r\n\r\n <div className=\"absolute inset-0 bg-gradient-to-tr from-transparent via-white/40 to-transparent animate-rotate-slow opacity-60\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"text-center mb-4\">\r\n <h1 className=\"lg:text-3xl md:text-2xl text-xl font-bold bg-gradient-to-r from-primary via-secondary to-primary bg-clip-text text-transparent animate-gradient-shift mb-4\">\r\n Loading your experience...\r\n </h1>\r\n\r\n <p className=\"text-dashboard-description lg:text-lg md:text-md text-sm font-medium opacity-80\">\r\n Please wait while we prepare everything for you\r\n </p>\r\n </div>\r\n\r\n <div className=\"relative w-80 mb-8\">\r\n <div className=\"h-2 bg-muted-secondary/30 rounded-full overflow-hidden backdrop-blur-sm\">\r\n <div className=\"h-full bg-gradient-to-r from-primary via-secondary to-primary animate-progress-wave\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"absolute top-8 left-8 w-16 h-16 border-l-2 border-t-2 border-primary/30 rounded-tl-lg\"></div>\r\n <div className=\"absolute top-8 right-8 w-16 h-16 border-r-2 border-t-2 border-secondary/30 rounded-tr-lg\"></div>\r\n <div className=\"absolute bottom-8 left-8 w-16 h-16 border-l-2 border-b-2 border-secondary/30 rounded-bl-lg\"></div>\r\n <div className=\"absolute bottom-8 right-8 w-16 h-16 border-r-2 border-b-2 border-primary/30 rounded-br-lg\"></div>\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default LoadingPage;\r\n","import { useEffect, useRef } from \"react\";\r\nimport type { ReactNode } from \"react\";\r\nimport { LuX } from \"react-icons/lu\";\r\nimport React from 'react';\r\n\r\nconst Modal = ({\r\n title,\r\n isOpen,\r\n onClose,\r\n children,\r\n}: {\r\n title: string;\r\n isOpen: boolean;\r\n onClose: () => void;\r\n children: ReactNode;\r\n}) => {\r\n const modalRef = useRef<HTMLDivElement>(null);\r\n const previousFocusRef = useRef<HTMLElement | null>(null);\r\n\r\n useEffect(() => {\r\n if (isOpen) {\r\n // Store the previously focused element\r\n previousFocusRef.current = document.activeElement as HTMLElement;\r\n\r\n // Focus the modal\r\n modalRef.current?.focus();\r\n\r\n // Prevent body scroll\r\n document.body.style.overflow = \"hidden\";\r\n } else {\r\n // Restore body scroll\r\n document.body.style.overflow = \"unset\";\r\n\r\n // Restore focus to previously focused element\r\n previousFocusRef.current?.focus();\r\n }\r\n\r\n return () => {\r\n document.body.style.overflow = \"unset\";\r\n };\r\n }, [isOpen]);\r\n\r\n useEffect(() => {\r\n const handleEscape = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\" && isOpen) {\r\n onClose();\r\n }\r\n };\r\n\r\n document.addEventListener(\"keydown\", handleEscape);\r\n return () => document.removeEventListener(\"keydown\", handleEscape);\r\n }, [isOpen, onClose]);\r\n\r\n const handleBackdropClick = (e: React.MouseEvent<HTMLDivElement>) => {\r\n if (e.target === e.currentTarget) {\r\n onClose();\r\n }\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n return (\r\n <div\r\n className=\"fixed inset-0 bg-black/30 backdrop-blur-sm flex items-center justify-center z-50\"\r\n onClick={handleBackdropClick}\r\n >\r\n <div\r\n ref={modalRef}\r\n className=\"bg-background rounded-lg shadow-xl w-full mx-4 sm:max-w-lg xl:max-w-xl max-h-[90vh] flex flex-col overflow-y-auto\"\r\n tabIndex={-1}\r\n >\r\n <div className=\"p-4 sm:p-6 flex-1 flex flex-col\">\r\n <div className=\"flex justify-between items-center mb-4\">\r\n <h2\r\n id=\"modal-title\"\r\n className=\"text-lg sm:text-xl md:text-2xl font-bold text-primary\"\r\n >\r\n {title}\r\n </h2>\r\n <span\r\n onClick={onClose}\r\n className=\"text-gray-400 hover:text-gray-600 transition-colors duration-300 p-1 text-xl sm:text-2xl md:text-3xl cursor-pointer\"\r\n >\r\n <LuX />\r\n </span>\r\n </div>\r\n {children}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default Modal;\r\n","import { useState } from \"react\";\r\nimport React from 'react';\r\n\r\nexport default function NumberField({\r\n label,\r\n value,\r\n placeholder,\r\n onChange,\r\n error,\r\n maxLength,\r\n id,\r\n}: {\r\n label: string;\r\n id: string;\r\n value: string;\r\n placeholder: string;\r\n maxLength?: number;\r\n onChange: (newValue: React.ChangeEvent<HTMLInputElement>) => void;\r\n error?: string;\r\n}) {\r\n const [lengthError, setLengthError] = useState<string | null>(null);\r\n function handleChange(e: React.ChangeEvent<HTMLInputElement>) {\r\n const inputValue = e.target.value;\r\n if (maxLength && inputValue.length > maxLength) {\r\n setLengthError(`Maximum length of ${maxLength} characters exceeded.`);\r\n return;\r\n }\r\n lengthError && setLengthError(null);\r\n onChange(e);\r\n }\r\n return (\r\n <div className=\"flex flex-col w-full\">\r\n <label className=\"text-label text-[14px] md:text-[15px] lg:text-[16px] mb-2 font-semibold\">\r\n {label}\r\n </label>\r\n <input\r\n id={id}\r\n value={value}\r\n type=\"number\"\r\n placeholder={placeholder}\r\n onChange={handleChange}\r\n className={`border-gray-400 rounded-xl px-3 py-2 md:px-4 md:py-3 border outline-none ${\r\n error || lengthError\r\n ? \"border-red-300 focus:border-red-500 focus:ring-red-500/30\"\r\n : \"focus:border-primary\"\r\n } transition-all duration-300 ease-in-out text-sm`}\r\n />\r\n </div>\r\n );\r\n}\r\n","import { useState } from \"react\";\r\nimport { LuEye, LuEyeOff } from \"react-icons/lu\";\r\nimport React from 'react';\r\n\r\nexport default function PasswordField({\r\n value,\r\n onChange,\r\n error,\r\n}: {\r\n value: string;\r\n onChange: (newValue: React.ChangeEvent<HTMLInputElement>) => void;\r\n error?: string;\r\n}) {\r\n const [show, setShow] = useState(false);\r\n\r\n return (\r\n <div className=\"flex flex-col w-full\">\r\n <label className=\"text-label text-[14px] md:text-[15px] lg:text-[16px] mb-2 font-semibold\">\r\n Password\r\n </label>\r\n <div className=\"relative\">\r\n <input\r\n id=\"password\"\r\n value={value}\r\n placeholder=\"Enter your Password\"\r\n onChange={(e) => onChange(e)}\r\n type={show ? \"text\" : \"password\"}\r\n className={`border-gray-400 rounded-xl px-3 py-2 md:px-4 md:py-3 border outline-none ${\r\n error\r\n ? \"border-red-300 focus:border-red-500 focus:ring-red-500/30\"\r\n : \"focus:border-primary\"\r\n } transition-all duration-300 ease-in-out text-sm w-full pr-10 `}\r\n />\r\n <button\r\n type=\"button\"\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 contrast-50 cursor-pointer transition duration-300 ease-in-out hover:contrast-100\"\r\n onClick={() => setShow(!show)}\r\n tabIndex={-1}\r\n >\r\n {show ? <LuEyeOff size={20} /> : <LuEye size={20} />}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","\r\n\r\nexport default function Radiobutton({label, checked, onChange}: {label: string, checked: boolean, onChange: (newValue: boolean) => void}) {\r\n return (\r\n <label className=\"inline-flex items-center cursor-pointer relative pl-7 select-none\">\r\n <input\r\n type=\"radio\"\r\n checked={checked}\r\n onChange={(e) => onChange(e.target.checked)}\r\n className=\"peer absolute left-0 top-1/2 -translate-y-1/2 w-5 h-5 opacity-0 cursor-pointer\"\r\n />\r\n <span className=\"\r\n absolute left-0 top-1/2 -translate-y-1/2 w-5 h-5 rounded-full\r\n border-2 border-gray-300 bg-background\r\n flex items-center justify-center\r\n transition-colors\r\n pointer-events-none\r\n \">\r\n <span className={`w-3 h-3 ${checked ? 'bg-primary' : 'bg-transparent'} rounded-full transition-all`} />\r\n </span>\r\n <span className=\"text-sm\">{label}</span>\r\n </label>\r\n );\r\n}","import { HiOutlineMagnifyingGlass } from \"react-icons/hi2\";\r\n\r\ninterface SearchFieldProps {\r\n value: string;\r\n onChange: (value: string) => void;\r\n placeholder?: string;\r\n className?: string;\r\n}\r\n\r\nexport default function SearchField({\r\n value,\r\n onChange,\r\n placeholder = \"Search...\",\r\n className = \"\"\r\n}: SearchFieldProps) {\r\n return (\r\n <div className={`relative w-full lg:w-96 ${className}`}>\r\n <div className=\"relative\">\r\n <span className=\"absolute left-4 top-1/2 transform -translate-y-1/2 text-muted-secondary/60 text-lg\">\r\n <HiOutlineMagnifyingGlass />\r\n </span>\r\n <input\r\n type=\"text\"\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n placeholder={placeholder}\r\n className=\"w-full bg-background/50 rounded-3xl border-contrast pl-12 pr-4 py-2 text-[14px] md:text-[15px] lg:text-[16px] border focus:border-primary focus:outline-none transition-all duration-300 ease-in-out placeholder:text-muted-secondary\"\r\n />\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState, useRef } from \"react\";\r\nimport React from 'react';\r\n\r\nexport default function TextAreaField({\r\n label,\r\n value,\r\n placeholder,\r\n onChange,\r\n error,\r\n maxLength,\r\n id,\r\n}: {\r\n label: string;\r\n id: string;\r\n value: string;\r\n placeholder: string;\r\n maxLength?: number;\r\n onChange: (newValue: React.ChangeEvent<HTMLTextAreaElement>) => void;\r\n error?: string;\r\n}) {\r\n const [lengthError, setLengthError] = useState<string | null>(null);\r\n const textareaRef = useRef<HTMLTextAreaElement>(null);\r\n function handleChange(e: React.ChangeEvent<HTMLTextAreaElement>) {\r\n const inputValue = e.target.value;\r\n if (maxLength && inputValue.length > maxLength) {\r\n setLengthError(`Maximum length of ${maxLength} characters exceeded.`);\r\n return;\r\n }\r\n lengthError && setLengthError(null);\r\n if (textareaRef.current) {\r\n textareaRef.current.style.height = \"auto\";\r\n textareaRef.current.style.height =\r\n textareaRef.current.scrollHeight + \"px\";\r\n }\r\n onChange(e);\r\n }\r\n return (\r\n <div className=\"flex flex-col w-full\">\r\n <label className=\"text-label text-[14px] md:text-[15px] lg:text-[16px] mb-2 font-semibold\">\r\n {label}\r\n </label>\r\n <textarea\r\n ref={textareaRef}\r\n id={id}\r\n onChange={handleChange}\r\n value={value}\r\n placeholder={placeholder}\r\n rows={4}\r\n className={`border-gray-400 rounded-xl px-3 py-2 md:px-4 md:py-3 border outline-none ${\r\n error || lengthError\r\n ? \"border-red-300 focus:border-red-500 focus:ring-red-500/30\"\r\n : \"focus:border-primary\"\r\n } transition-all duration-300 ease-in-out text-sm`}\r\n />\r\n {maxLength && (\r\n <p className=\"text-[9px] md:text-[10px] lg:text-[11px] p-1 text-inactive-tab-text\">\r\n {value.length}/{maxLength}\r\n </p>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { HiMiniXMark } from \"react-icons/hi2\";\r\n\r\nexport default function UnauthorizedPage() {\r\n return (\r\n <div className=\"w-screen h-screen flex flex-col justify-center items-center bg-background\">\r\n <div className=\"w-fit rounded-2xl bg-background p-8 shadow-[0_0px_20px_rgba(0,0,0,0.2)] flex flex-col items-center\">\r\n <div className=\"rounded-full bg-muted-primary md:p-4 p-2 mb-4 md:mb-6 lg:mb-8 w-fit\">\r\n <span className=\"text-[52px] md:text-[56px] lg:text-[60px] text-primary\">\r\n <HiMiniXMark />\r\n </span>\r\n </div>\r\n <p className=\"text-[24px] md:text-[28px] lg:text-[32px] font-bold mb-2 md:mb-4\">Unauthorized Access</p>\r\n <p className=\"text-[14px] md:text-[16px] text-center max-w-md text-inactive-tab-text font-medium\">\r\n Sorry, you do not have the necessary permissions to view this page .\r\n </p>\r\n </div>\r\n </div>\r\n )\r\n}"],"mappings":"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","names":["import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_lu","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_hi2","import_jsx_runtime"]}
|
package/dist/index.mjs
CHANGED
|
@@ -19,7 +19,7 @@ var ButtonWidths = {
|
|
|
19
19
|
// src/components/Button.tsx
|
|
20
20
|
import { AiOutlineLoading3Quarters } from "react-icons/ai";
|
|
21
21
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
22
|
-
var Button = ({ buttonText, onClick, type, disabled = false, loading = false, width = ButtonWidths.AUTO }) => {
|
|
22
|
+
var Button = ({ buttonText, buttonIcon, onClick, type, disabled = false, loading = false, width = ButtonWidths.AUTO }) => {
|
|
23
23
|
const isDisabled = disabled || loading;
|
|
24
24
|
const stylePresets = {
|
|
25
25
|
primary: "bg-primary text-text border-primary",
|
|
@@ -67,7 +67,8 @@ var Button = ({ buttonText, onClick, type, disabled = false, loading = false, wi
|
|
|
67
67
|
`,
|
|
68
68
|
children: [
|
|
69
69
|
loading && /* @__PURE__ */ jsx("span", { className: "animate-spin -ml-1 mr-2 h-4 w-4 inline-block", children: /* @__PURE__ */ jsx(AiOutlineLoading3Quarters, {}) }),
|
|
70
|
-
loading ? "Loading..." : buttonText
|
|
70
|
+
loading ? "Loading..." : buttonText,
|
|
71
|
+
buttonIcon && !loading && /* @__PURE__ */ jsx("span", { className: "ml-2 inline-block", children: buttonIcon })
|
|
71
72
|
]
|
|
72
73
|
}
|
|
73
74
|
);
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/index.ts","../src/components/Button.tsx","../src/components/Checkbox.tsx","../src/components/DatePicker.tsx","../src/components/DropdownMenu.tsx","../src/components/ErrorScreen.tsx","../src/components/InputField.tsx","../src/components/LazyImageLoader.tsx","../src/components/LoadingPage.tsx","../src/components/Modal.tsx","../src/components/NumberField.tsx","../src/components/PasswordField.tsx","../src/components/RadioButton.tsx","../src/components/SearchField.tsx","../src/components/TextAreaField.tsx","../src/components/UnauthorizedPage.tsx"],"sourcesContent":["export const ButtonTypes = {\r\n PRIMARY: \"primary\",\r\n SECONDARY: \"secondary\",\r\n TERTIARY: \"tertiary\",\r\n DANGER: \"danger\",\r\n GHOST: \"ghost\",\r\n BASIC: \"basic\"\r\n} as const;\r\n\r\nexport type ButtonTypes = typeof ButtonTypes[keyof typeof ButtonTypes];\r\n\r\nexport const ButtonWidths = {\r\n AUTO: \"auto\",\r\n SMALL: \"small\",\r\n MEDIUM: \"medium\",\r\n LARGE: \"large\",\r\n XL: \"xl\",\r\n FULL: \"full\"\r\n} as const;\r\n\r\nexport type ButtonWidths = typeof ButtonWidths[keyof typeof ButtonWidths];\r\n\r\nexport interface DropdownOption {\r\n value: string;\r\n label: string;\r\n disabled?: boolean;\r\n}\r\n","import { ButtonTypes, ButtonWidths } from \"../types\";\r\nimport { AiOutlineLoading3Quarters } from \"react-icons/ai\";\r\n\r\ninterface ButtonProps {\r\n buttonText: string;\r\n onClick: () => void;\r\n type: ButtonTypes;\r\n disabled?: boolean;\r\n loading?: boolean;\r\n width?: ButtonWidths;\r\n}\r\n\r\nconst Button = ({ buttonText, onClick, type, disabled = false, loading = false, width = ButtonWidths.AUTO }: ButtonProps) => {\r\n const isDisabled = disabled || loading;\r\n\r\n const stylePresets: Record<ButtonTypes, string> = {\r\n primary: \"bg-primary text-text border-primary\",\r\n secondary: \"bg-secondary text-text border-secondary\",\r\n tertiary: \"bg-contrast text-text border-contrast\",\r\n danger: \"border-primary text-primary\",\r\n ghost: \"text-secondary border-secondary\",\r\n basic: \"border-contrast\"\r\n }\r\n\r\n const hoverStyles: Record<ButtonTypes, string> = {\r\n primary: \"hover:bg-background hover:border-primary hover:text-primary\",\r\n secondary: \"hover:bg-background hover:border-secondary hover:text-secondary\",\r\n tertiary: \"hover:bg-background hover:border-tertiary hover:text-black\",\r\n danger: \"hover:bg-primary hover:text-text\",\r\n ghost: \"hover:bg-secondary/30\",\r\n basic: \"hover:bg-contrast/30\",\r\n }\r\n\r\n const disabledStyles = \"opacity-50\";\r\n\r\n const widthStyles: Record<ButtonWidths, string> = {\r\n auto: \"w-auto\",\r\n small: \"w-24\",\r\n medium: \"w-32\",\r\n large: \"w-48\",\r\n xl: \"w-64\",\r\n full: \"w-full\"\r\n }\r\n\r\n const handleClick = () => {\r\n if (!isDisabled) {\r\n onClick();\r\n }\r\n };\r\n\r\n return (\r\n <button\r\n onClick={handleClick}\r\n disabled={isDisabled}\r\n className={`\r\n ${stylePresets[type]} \r\n ${!isDisabled ? hoverStyles[type] : ''} \r\n ${isDisabled ? disabledStyles : ''} \r\n ${widthStyles[width]}\r\n rounded-full px-6 py-2 border font-bold text-[11px] lg:text-[12px] whitespace-nowrap\r\n transition-all duration-200 ease-in-out flex items-center justify-center h-fit\r\n ${isDisabled ? 'cursor-not-allowed' : 'cursor-pointer'}\r\n `}\r\n >\r\n {loading && (\r\n <span className=\"animate-spin -ml-1 mr-2 h-4 w-4 inline-block\">\r\n <AiOutlineLoading3Quarters />\r\n </span>\r\n )}\r\n {loading ? 'Loading...' : buttonText}\r\n </button>\r\n )\r\n}\r\n\r\nexport default Button;","export default function Checkbox({label, checked, onChange}: {label: string, checked: boolean, onChange: () => void}) {\r\n return (\r\n <label className=\"inline-flex items-center cursor-pointer relative pl-7 select-none\">\r\n <input\r\n type=\"checkbox\"\r\n checked={checked}\r\n onChange={() => onChange()}\r\n className=\"peer absolute left-0 top-1/2 -translate-y-1/2 w-5 h-5 opacity-0 cursor-pointer\"\r\n />\r\n <span className=\"\r\n absolute left-0 top-1/2 -translate-y-1/2 w-5 h-5 rounded-md\r\n border-2 border-gray-300 bg-white\r\n peer-checked:bg-primary peer-checked:border-primary\r\n flex items-center justify-center\r\n transition-colors\r\n pointer-events-none\r\n \">\r\n <svg\r\n className=\"w-4 h-4 text-white\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"3\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\r\n </svg>\r\n </span>\r\n <span className=\"text-sm\">{label}</span>\r\n </label>\r\n );\r\n}","import React from 'react';\r\nimport { MdCalendarToday } from 'react-icons/md';\r\n\r\ninterface DatePickerProps {\r\n label: string;\r\n id: string;\r\n value: string;\r\n onChange: (date: string) => void;\r\n error?: string;\r\n disabled?: boolean;\r\n minDate?: string;\r\n maxDate?: string;\r\n}\r\n\r\nexport default function DatePicker({\r\n label,\r\n id,\r\n value,\r\n onChange,\r\n error,\r\n disabled = false,\r\n minDate,\r\n maxDate,\r\n}: DatePickerProps) {\r\n const handleDateChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n onChange(e.target.value.toString());\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col w-full\">\r\n <label className=\"text-label text-[14px] md:text-[15px] lg:text-[16px] mb-2 font-semibold\">\r\n {label}\r\n </label>\r\n\r\n <div className=\"relative\">\r\n <input\r\n id={id}\r\n type=\"date\"\r\n value={value}\r\n onChange={handleDateChange}\r\n disabled={disabled}\r\n min={minDate}\r\n max={maxDate}\r\n className={`w-full border-contrast rounded-xl px-3 py-2 md:px-4 md:py-3 border outline-none ${error\r\n ? \"border-red-300 focus:border-red-500 focus:ring-red-500/30\"\r\n : \"focus:border-primary\"\r\n } ${disabled ? \"bg-gray-100 cursor-not-allowed opacity-60\" : \"bg-white\"\r\n } transition-all duration-300 ease-in-out text-sm pr-10 [&::-webkit-calendar-picker-indicator]:opacity-0 [&::-webkit-calendar-picker-indicator]:absolute [&::-webkit-calendar-picker-indicator]:right-3 [&::-webkit-calendar-picker-indicator]:w-5 [&::-webkit-calendar-picker-indicator]:h-5 [&::-webkit-calendar-picker-indicator]:cursor-pointer`}\r\n />\r\n\r\n <div className=\"absolute right-3 top-1/2 transform -translate-y-1/2 pointer-events-none\">\r\n <span className={`w-5 h-5 ${disabled ? \"text-gray-400\" : \"text-secondary\"}`}>\r\n <MdCalendarToday />\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {error && (\r\n <span className=\"text-red-500 text-sm font-medium mt-1\">{error}</span>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useRef, useEffect } from \"react\";\r\nimport { IoChevronDown } from \"react-icons/io5\";\r\nimport Button from \"./Button\";\r\nimport { ButtonTypes, ButtonWidths } from \"../types\";\r\nimport type { DropdownOption } from \"../types\";\r\n\r\ninterface DropdownMenuProps {\r\n label?: string;\r\n placeholder?: string;\r\n options: DropdownOption[];\r\n value?: string;\r\n onChange: (value: string) => void;\r\n error?: string;\r\n disabled?: boolean;\r\n className?: string;\r\n id?: string;\r\n}\r\n\r\nexport default function DropdownMenu({\r\n label,\r\n placeholder = \"Select an option\",\r\n options,\r\n value,\r\n onChange,\r\n error,\r\n disabled = false,\r\n className = \"\",\r\n id,\r\n}: DropdownMenuProps) {\r\n const [isOpen, setIsOpen] = useState(false);\r\n const dropdownRef = useRef<HTMLDivElement>(null);\r\n\r\n const selectedOption = options.find((option) => option.value === value);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (\r\n dropdownRef.current &&\r\n !dropdownRef.current.contains(event.target as Node)\r\n ) {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, []);\r\n\r\n const handleOptionClick = (optionValue: string) => {\r\n if (!disabled) {\r\n onChange(optionValue);\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className={`flex flex-col w-full ${className}`}>\r\n {label && (\r\n <label\r\n htmlFor={id}\r\n className=\"text-label text-[14px] md:text-[15px] lg:text-[16px] mb-2 font-semibold\"\r\n >\r\n {label}\r\n </label>\r\n )}\r\n\r\n <div className=\"relative\" ref={dropdownRef}>\r\n <div className=\"relative\">\r\n <Button\r\n buttonText={selectedOption ? selectedOption.label : placeholder}\r\n onClick={() => !disabled && setIsOpen(!isOpen)}\r\n type={ButtonTypes.BASIC}\r\n disabled={disabled}\r\n width={ButtonWidths.FULL}\r\n />\r\n <span\r\n className={`absolute right-3 top-1/2 transform -translate-y-1/2 w-5 h-5 text-secondary transition-transform duration-200 pointer-events-none ${\r\n isOpen ? \"rotate-180\" : \"\"\r\n }`}\r\n >\r\n <IoChevronDown />\r\n </span>\r\n </div>\r\n\r\n {isOpen && !disabled && (\r\n <div className=\"absolute z-50 w-full mt-1 bg-white border border-secondary/30 rounded-xl shadow-lg max-h-60 overflow-y-auto\">\r\n {options.length === 0 ? (\r\n <div className=\"px-3 py-2 text-sm text-muted-secondary\">\r\n No options available\r\n </div>\r\n ) : (\r\n options.map((option) => (\r\n <button\r\n key={option.value}\r\n type=\"button\"\r\n onClick={() => handleOptionClick(option.value)}\r\n disabled={option.disabled}\r\n className={`\r\n w-full px-3 py-2 text-left text-sm transition-colors duration-150\r\n ${\r\n option.disabled\r\n ? \"text-gray-400 cursor-not-allowed\"\r\n : \"text-gray-900 hover:bg-secondary/10 hover:text-secondary cursor-pointer\"\r\n }\r\n ${\r\n value === option.value\r\n ? \"bg-secondary/20 text-secondary font-medium\"\r\n : \"\"\r\n }\r\n first:rounded-t-xl last:rounded-b-xl\r\n `}\r\n >\r\n {option.label}\r\n </button>\r\n ))\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {error && <p className=\"mt-1 text-sm text-red-600\">{error}</p>}\r\n </div>\r\n );\r\n}\r\n","import { FaExclamationTriangle } from \"react-icons/fa\";\r\n\r\ninterface ErrorComponentProps {\r\n title: string;\r\n message: string;\r\n}\r\n\r\nexport default function ErrorComponent({\r\n title,\r\n message,\r\n}: ErrorComponentProps) {\r\n return (\r\n <div className=\"min-h-screen bg-background\">\r\n <div className=\"w-full md:w-3/4 lg:w-10/12 m-auto rounded-xl shadow-md p-5 flex flex-col gap-4\">\r\n {/* Error Container */}\r\n <div className=\"flex flex-col items-center justify-center py-16 px-4\">\r\n {/* Error Icon */}\r\n <div className=\"mb-6\">\r\n <div className=\"w-20 h-20 bg-red-100 rounded-full flex items-center justify-center\">\r\n <span className=\"text-error text-3xl\">\r\n <FaExclamationTriangle />\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Error Title */}\r\n <h1 className=\"text-2xl md:text-3xl lg:text-4xl font-bold text-error mb-4 text-center\">\r\n {title}\r\n </h1>\r\n\r\n {/* Error Message */}\r\n <p className=\"text-base md:text-lg text-center mb-8 max-w-md\">\r\n {message}\r\n </p>\r\n </div>\r\n\r\n <div className=\"mt-8 bg-red-50 border border-red-200 rounded-xl p-4\">\r\n <h3 className=\"font-semibold text-red-800 mb-2\">\r\n Technical Details\r\n </h3>\r\n <div className=\"text-red-700 text-sm space-y-1\">\r\n <p>• Check your internet connection</p>\r\n <p>• The page may be temporarily unavailable</p>\r\n <p>• Contact support if the problem persists</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport default function InputField({\r\n label,\r\n value,\r\n placeholder,\r\n onChange,\r\n error,\r\n id,\r\n}: {\r\n label: string;\r\n id: string;\r\n value: string;\r\n placeholder: string;\r\n onChange: (newValue: React.ChangeEvent<HTMLInputElement>) => void;\r\n error?: string;\r\n}) {\r\n return (\r\n <div className=\"flex flex-col w-full\">\r\n <label className=\"text-label text-[14px] md:text-[15px] lg:text-[16px] mb-2 font-semibold\">\r\n {label}\r\n </label>\r\n <input\r\n id={id}\r\n value={value}\r\n placeholder={placeholder}\r\n onChange={(e) => onChange(e)}\r\n className={`border-gray-400 rounded-xl px-3 py-2 md:px-4 md:py-3 border outline-none ${\r\n error\r\n ? \"border-red-300 focus:border-red-500 focus:ring-red-500/30\"\r\n : \"focus:border-primary\"\r\n } transition-all duration-300 ease-in-out text-sm`}\r\n />\r\n </div>\r\n );\r\n}\r\n","import { useState } from \"react\";\r\nimport { HiOutlinePhotograph } from \"react-icons/hi\";\r\n\r\ninterface LazyImageLoaderProps {\r\n src: string;\r\n alt: string;\r\n className?: string;\r\n width?: string | number;\r\n height?: string | number;\r\n}\r\n\r\nexport default function LazyImageLoader({ \r\n src, \r\n alt, \r\n className = \"\", \r\n width = \"100%\", \r\n height = \"200px\" \r\n}: LazyImageLoaderProps) {\r\n const [imageLoaded, setImageLoaded] = useState(false);\r\n const [imageError, setImageError] = useState(false);\r\n\r\n const handleImageLoad = () => {\r\n setImageLoaded(true);\r\n };\r\n\r\n const handleImageError = () => {\r\n setImageError(true);\r\n setImageLoaded(true);\r\n };\r\n\r\n return (\r\n <div \r\n className={`relative overflow-hidden ${className}`}\r\n style={{ width, height }}\r\n >\r\n {!imageLoaded && (\r\n <div className=\"absolute inset-0 bg-gray-200 animate-pulse\">\r\n <div className=\"absolute inset-0 bg-gradient-to-r from-gray-200 via-gray-100 to-gray-200 animate-shimmer\"></div>\r\n </div>\r\n )}\r\n\r\n {imageError && (\r\n <div className=\"absolute inset-0 bg-gray-100 flex items-center justify-center\">\r\n <div className=\"text-center text-gray-400\">\r\n <span className=\"w-12 h-12 mx-auto mb-2\">\r\n <HiOutlinePhotograph />\r\n </span>\r\n <p className=\"text-sm\">Failed to load</p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <img\r\n src={src}\r\n alt={alt}\r\n onLoad={handleImageLoad}\r\n onError={handleImageError}\r\n className={`w-full h-full object-cover transition-opacity duration-300 ${\r\n imageLoaded ? \"opacity-100\" : \"opacity-0\"\r\n }`}\r\n />\r\n </div>\r\n );\r\n}\r\n","import tccd_logo from \"../assets/TCCD_logo.svg\";\r\n\r\nconst LoadingPage = () => {\r\n return (\r\n <>\r\n <style>{`\r\n @keyframes custom-bounce {\r\n 0%, 100% {\r\n transform: translateY(0);\r\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\r\n }\r\n 50% {\r\n transform: translateY(-8px);\r\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\r\n }\r\n }\r\n\r\n @keyframes logoLuxury {\r\n 0% {\r\n filter: brightness(1) contrast(1) drop-shadow(0 0 15px rgba(205, 58, 56, 0.3)) saturate(1);\r\n transform: scale(1) rotate(0deg);\r\n }\r\n 25% {\r\n filter: brightness(1.2) contrast(1.2) drop-shadow(0 0 25px rgba(41, 94, 126, 0.5)) saturate(1.2);\r\n transform: scale(1.05) rotate(2deg);\r\n }\r\n 50% {\r\n filter: brightness(1.4) contrast(1.3) drop-shadow(0 0 35px rgba(205, 58, 56, 0.7)) saturate(1.4);\r\n transform: scale(1.08) rotate(0deg);\r\n }\r\n 75% {\r\n filter: brightness(1.2) contrast(1.2) drop-shadow(0 0 25px rgba(41, 94, 126, 0.5)) saturate(1.2);\r\n transform: scale(1.05) rotate(-2deg);\r\n }\r\n 100% {\r\n filter: brightness(1) contrast(1) drop-shadow(0 0 15px rgba(205, 58, 56, 0.3)) saturate(1);\r\n transform: scale(1) rotate(0deg);\r\n }\r\n }\r\n\r\n @keyframes float {\r\n 0%, 100% {\r\n transform: translateY(0px) translateX(0px) scale(1);\r\n opacity: 0.3;\r\n }\r\n 50% {\r\n transform: translateY(-20px) translateX(10px) scale(1.2);\r\n opacity: 0.8;\r\n }\r\n }\r\n\r\n @keyframes spinSlow {\r\n from {\r\n transform: rotate(0deg);\r\n }\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n\r\n @keyframes rotateSlow {\r\n from {\r\n transform: rotate(0deg);\r\n }\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n\r\n @keyframes gradientShift {\r\n 0%, 100% {\r\n background-position: 0% 50%;\r\n }\r\n 50% {\r\n background-position: 100% 50%;\r\n }\r\n }\r\n\r\n @keyframes progressWave {\r\n 0% {\r\n transform: translateX(-100%) scaleX(1);\r\n opacity: 0.8;\r\n }\r\n 50% {\r\n transform: translateX(0%) scaleX(1.5);\r\n opacity: 1;\r\n }\r\n 100% {\r\n transform: translateX(100%) scaleX(1);\r\n opacity: 0.8;\r\n }\r\n }\r\n\r\n .animate-custom-bounce {\r\n animation-name: custom-bounce;\r\n animation-duration: 2s;\r\n animation-iteration-count: infinite;\r\n }\r\n\r\n .animate-logo-luxury {\r\n animation: logoLuxury 4s ease-in-out infinite;\r\n }\r\n\r\n .animate-float {\r\n animation: float 6s ease-in-out infinite;\r\n }\r\n\r\n .animate-spin-slow {\r\n animation: spinSlow 8s linear infinite;\r\n }\r\n\r\n .animate-rotate-slow {\r\n animation: rotateSlow 12s linear infinite;\r\n }\r\n\r\n .animate-gradient-shift {\r\n background-size: 300% 300%;\r\n animation: gradientShift 3s ease infinite;\r\n }\r\n\r\n .animate-progress-wave {\r\n animation: progressWave 2s ease-in-out infinite;\r\n }\r\n\r\n .dot-container .dot:nth-child(1) { animation-delay: 0s; }\r\n .dot-container .dot:nth-child(2) { animation-delay: 0.15s; }\r\n .dot-container .dot:nth-child(3) { animation-delay: 0.3s; }\r\n .dot-container .dot:nth-child(4) { animation-delay: 0.45s; }\r\n .dot-container .dot:nth-child(5) { animation-delay: 0.6s; }\r\n .dot-container .dot:nth-child(6) { animation-delay: 0.75s; }\r\n .dot-container .dot:nth-child(7) { animation-delay: 0.9s; }\r\n .dot-container .dot:nth-child(8) { animation-delay: 1.05s; }\r\n `}</style>\r\n <div className=\"relative min-h-screen bg-gradient-to-br from-background via-dashboard-welcome-bg to-muted-secondary overflow-hidden\">\r\n <div className=\"absolute inset-0\">\r\n {[...Array(25)].map((_, i) => (\r\n <div\r\n key={i}\r\n className=\"absolute w-2 h-2 bg-primary/20 rounded-full animate-float\"\r\n style={{\r\n left: `${Math.random() * 100}%`,\r\n top: `${Math.random() * 100}%`,\r\n animationDelay: `${Math.random() * 5}s`,\r\n animationDuration: `${3 + Math.random() * 4}s`,\r\n }}\r\n />\r\n ))}\r\n </div>\r\n\r\n <div className=\"relative z-10 flex flex-col items-center justify-center min-h-screen px-4\">\r\n\r\n <div className=\"relative mb-5 md:mb-10\">\r\n <div className=\"absolute inset-0 rounded-full bg-gradient-to-r from-primary via-secondary to-primary opacity-30 blur-2xl animate-spin-slow scale-150\"></div>\r\n\r\n <div className=\"absolute inset-4 rounded-full bg-gradient-to-r from-secondary via-primary to-secondary opacity-40 blur-xl animate-pulse\"></div>\r\n\r\n <div className=\"relative bg-white/10 backdrop-blur-sm rounded-full p-8 border border-white/20 shadow-2xl\">\r\n <div className=\"relative\">\r\n <img\r\n src={tccd_logo}\r\n alt=\"TCCD logo\"\r\n className=\"relative z-10 animate-logo-luxury drop-shadow-2xl lg:w-[160px] md:w-[135px] w-[110px]\"\r\n />\r\n\r\n <div className=\"absolute inset-0 bg-gradient-to-tr from-transparent via-white/40 to-transparent animate-rotate-slow opacity-60\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"text-center mb-4\">\r\n <h1 className=\"lg:text-3xl md:text-2xl text-xl font-bold bg-gradient-to-r from-primary via-secondary to-primary bg-clip-text text-transparent animate-gradient-shift mb-4\">\r\n Loading your experience...\r\n </h1>\r\n\r\n <p className=\"text-dashboard-description lg:text-lg md:text-md text-sm font-medium opacity-80\">\r\n Please wait while we prepare everything for you\r\n </p>\r\n </div>\r\n\r\n <div className=\"relative w-80 mb-8\">\r\n <div className=\"h-2 bg-muted-secondary/30 rounded-full overflow-hidden backdrop-blur-sm\">\r\n <div className=\"h-full bg-gradient-to-r from-primary via-secondary to-primary animate-progress-wave\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"absolute top-8 left-8 w-16 h-16 border-l-2 border-t-2 border-primary/30 rounded-tl-lg\"></div>\r\n <div className=\"absolute top-8 right-8 w-16 h-16 border-r-2 border-t-2 border-secondary/30 rounded-tr-lg\"></div>\r\n <div className=\"absolute bottom-8 left-8 w-16 h-16 border-l-2 border-b-2 border-secondary/30 rounded-bl-lg\"></div>\r\n <div className=\"absolute bottom-8 right-8 w-16 h-16 border-r-2 border-b-2 border-primary/30 rounded-br-lg\"></div>\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default LoadingPage;\r\n","import { useEffect, useRef } from \"react\";\r\nimport type { ReactNode } from \"react\";\r\nimport { LuX } from \"react-icons/lu\";\r\nimport React from 'react';\r\n\r\nconst Modal = ({\r\n title,\r\n isOpen,\r\n onClose,\r\n children,\r\n}: {\r\n title: string;\r\n isOpen: boolean;\r\n onClose: () => void;\r\n children: ReactNode;\r\n}) => {\r\n const modalRef = useRef<HTMLDivElement>(null);\r\n const previousFocusRef = useRef<HTMLElement | null>(null);\r\n\r\n useEffect(() => {\r\n if (isOpen) {\r\n // Store the previously focused element\r\n previousFocusRef.current = document.activeElement as HTMLElement;\r\n\r\n // Focus the modal\r\n modalRef.current?.focus();\r\n\r\n // Prevent body scroll\r\n document.body.style.overflow = \"hidden\";\r\n } else {\r\n // Restore body scroll\r\n document.body.style.overflow = \"unset\";\r\n\r\n // Restore focus to previously focused element\r\n previousFocusRef.current?.focus();\r\n }\r\n\r\n return () => {\r\n document.body.style.overflow = \"unset\";\r\n };\r\n }, [isOpen]);\r\n\r\n useEffect(() => {\r\n const handleEscape = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\" && isOpen) {\r\n onClose();\r\n }\r\n };\r\n\r\n document.addEventListener(\"keydown\", handleEscape);\r\n return () => document.removeEventListener(\"keydown\", handleEscape);\r\n }, [isOpen, onClose]);\r\n\r\n const handleBackdropClick = (e: React.MouseEvent<HTMLDivElement>) => {\r\n if (e.target === e.currentTarget) {\r\n onClose();\r\n }\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n return (\r\n <div\r\n className=\"fixed inset-0 bg-black/30 backdrop-blur-sm flex items-center justify-center z-50\"\r\n onClick={handleBackdropClick}\r\n >\r\n <div\r\n ref={modalRef}\r\n className=\"bg-background rounded-lg shadow-xl w-full mx-4 sm:max-w-lg xl:max-w-xl max-h-[90vh] flex flex-col overflow-y-auto\"\r\n tabIndex={-1}\r\n >\r\n <div className=\"p-4 sm:p-6 flex-1 flex flex-col\">\r\n <div className=\"flex justify-between items-center mb-4\">\r\n <h2\r\n id=\"modal-title\"\r\n className=\"text-lg sm:text-xl md:text-2xl font-bold text-primary\"\r\n >\r\n {title}\r\n </h2>\r\n <span\r\n onClick={onClose}\r\n className=\"text-gray-400 hover:text-gray-600 transition-colors duration-300 p-1 text-xl sm:text-2xl md:text-3xl cursor-pointer\"\r\n >\r\n <LuX />\r\n </span>\r\n </div>\r\n {children}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default Modal;\r\n","import { useState } from \"react\";\r\nimport React from 'react';\r\n\r\nexport default function NumberField({\r\n label,\r\n value,\r\n placeholder,\r\n onChange,\r\n error,\r\n maxLength,\r\n id,\r\n}: {\r\n label: string;\r\n id: string;\r\n value: string;\r\n placeholder: string;\r\n maxLength?: number;\r\n onChange: (newValue: React.ChangeEvent<HTMLInputElement>) => void;\r\n error?: string;\r\n}) {\r\n const [lengthError, setLengthError] = useState<string | null>(null);\r\n function handleChange(e: React.ChangeEvent<HTMLInputElement>) {\r\n const inputValue = e.target.value;\r\n if (maxLength && inputValue.length > maxLength) {\r\n setLengthError(`Maximum length of ${maxLength} characters exceeded.`);\r\n return;\r\n }\r\n lengthError && setLengthError(null);\r\n onChange(e);\r\n }\r\n return (\r\n <div className=\"flex flex-col w-full\">\r\n <label className=\"text-label text-[14px] md:text-[15px] lg:text-[16px] mb-2 font-semibold\">\r\n {label}\r\n </label>\r\n <input\r\n id={id}\r\n value={value}\r\n type=\"number\"\r\n placeholder={placeholder}\r\n onChange={handleChange}\r\n className={`border-gray-400 rounded-xl px-3 py-2 md:px-4 md:py-3 border outline-none ${\r\n error || lengthError\r\n ? \"border-red-300 focus:border-red-500 focus:ring-red-500/30\"\r\n : \"focus:border-primary\"\r\n } transition-all duration-300 ease-in-out text-sm`}\r\n />\r\n </div>\r\n );\r\n}\r\n","import { useState } from \"react\";\r\nimport { LuEye, LuEyeOff } from \"react-icons/lu\";\r\nimport React from 'react';\r\n\r\nexport default function PasswordField({\r\n value,\r\n onChange,\r\n error,\r\n}: {\r\n value: string;\r\n onChange: (newValue: React.ChangeEvent<HTMLInputElement>) => void;\r\n error?: string;\r\n}) {\r\n const [show, setShow] = useState(false);\r\n\r\n return (\r\n <div className=\"flex flex-col w-full\">\r\n <label className=\"text-label text-[14px] md:text-[15px] lg:text-[16px] mb-2 font-semibold\">\r\n Password\r\n </label>\r\n <div className=\"relative\">\r\n <input\r\n id=\"password\"\r\n value={value}\r\n placeholder=\"Enter your Password\"\r\n onChange={(e) => onChange(e)}\r\n type={show ? \"text\" : \"password\"}\r\n className={`border-gray-400 rounded-xl px-3 py-2 md:px-4 md:py-3 border outline-none ${\r\n error\r\n ? \"border-red-300 focus:border-red-500 focus:ring-red-500/30\"\r\n : \"focus:border-primary\"\r\n } transition-all duration-300 ease-in-out text-sm w-full pr-10 `}\r\n />\r\n <button\r\n type=\"button\"\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 contrast-50 cursor-pointer transition duration-300 ease-in-out hover:contrast-100\"\r\n onClick={() => setShow(!show)}\r\n tabIndex={-1}\r\n >\r\n {show ? <LuEyeOff size={20} /> : <LuEye size={20} />}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","\r\n\r\nexport default function Radiobutton({label, checked, onChange}: {label: string, checked: boolean, onChange: (newValue: boolean) => void}) {\r\n return (\r\n <label className=\"inline-flex items-center cursor-pointer relative pl-7 select-none\">\r\n <input\r\n type=\"radio\"\r\n checked={checked}\r\n onChange={(e) => onChange(e.target.checked)}\r\n className=\"peer absolute left-0 top-1/2 -translate-y-1/2 w-5 h-5 opacity-0 cursor-pointer\"\r\n />\r\n <span className=\"\r\n absolute left-0 top-1/2 -translate-y-1/2 w-5 h-5 rounded-full\r\n border-2 border-gray-300 bg-background\r\n flex items-center justify-center\r\n transition-colors\r\n pointer-events-none\r\n \">\r\n <span className={`w-3 h-3 ${checked ? 'bg-primary' : 'bg-transparent'} rounded-full transition-all`} />\r\n </span>\r\n <span className=\"text-sm\">{label}</span>\r\n </label>\r\n );\r\n}","import { HiOutlineMagnifyingGlass } from \"react-icons/hi2\";\r\n\r\ninterface SearchFieldProps {\r\n value: string;\r\n onChange: (value: string) => void;\r\n placeholder?: string;\r\n className?: string;\r\n}\r\n\r\nexport default function SearchField({\r\n value,\r\n onChange,\r\n placeholder = \"Search...\",\r\n className = \"\"\r\n}: SearchFieldProps) {\r\n return (\r\n <div className={`relative w-full lg:w-96 ${className}`}>\r\n <div className=\"relative\">\r\n <span className=\"absolute left-4 top-1/2 transform -translate-y-1/2 text-muted-secondary/60 text-lg\">\r\n <HiOutlineMagnifyingGlass />\r\n </span>\r\n <input\r\n type=\"text\"\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n placeholder={placeholder}\r\n className=\"w-full bg-background/50 rounded-3xl border-contrast pl-12 pr-4 py-2 text-[14px] md:text-[15px] lg:text-[16px] border focus:border-primary focus:outline-none transition-all duration-300 ease-in-out placeholder:text-muted-secondary\"\r\n />\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState, useRef } from \"react\";\r\nimport React from 'react';\r\n\r\nexport default function TextAreaField({\r\n label,\r\n value,\r\n placeholder,\r\n onChange,\r\n error,\r\n maxLength,\r\n id,\r\n}: {\r\n label: string;\r\n id: string;\r\n value: string;\r\n placeholder: string;\r\n maxLength?: number;\r\n onChange: (newValue: React.ChangeEvent<HTMLTextAreaElement>) => void;\r\n error?: string;\r\n}) {\r\n const [lengthError, setLengthError] = useState<string | null>(null);\r\n const textareaRef = useRef<HTMLTextAreaElement>(null);\r\n function handleChange(e: React.ChangeEvent<HTMLTextAreaElement>) {\r\n const inputValue = e.target.value;\r\n if (maxLength && inputValue.length > maxLength) {\r\n setLengthError(`Maximum length of ${maxLength} characters exceeded.`);\r\n return;\r\n }\r\n lengthError && setLengthError(null);\r\n if (textareaRef.current) {\r\n textareaRef.current.style.height = \"auto\";\r\n textareaRef.current.style.height =\r\n textareaRef.current.scrollHeight + \"px\";\r\n }\r\n onChange(e);\r\n }\r\n return (\r\n <div className=\"flex flex-col w-full\">\r\n <label className=\"text-label text-[14px] md:text-[15px] lg:text-[16px] mb-2 font-semibold\">\r\n {label}\r\n </label>\r\n <textarea\r\n ref={textareaRef}\r\n id={id}\r\n onChange={handleChange}\r\n value={value}\r\n placeholder={placeholder}\r\n rows={4}\r\n className={`border-gray-400 rounded-xl px-3 py-2 md:px-4 md:py-3 border outline-none ${\r\n error || lengthError\r\n ? \"border-red-300 focus:border-red-500 focus:ring-red-500/30\"\r\n : \"focus:border-primary\"\r\n } transition-all duration-300 ease-in-out text-sm`}\r\n />\r\n {maxLength && (\r\n <p className=\"text-[9px] md:text-[10px] lg:text-[11px] p-1 text-inactive-tab-text\">\r\n {value.length}/{maxLength}\r\n </p>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { HiMiniXMark } from \"react-icons/hi2\";\r\n\r\nexport default function UnauthorizedPage() {\r\n return (\r\n <div className=\"w-screen h-screen flex flex-col justify-center items-center bg-background\">\r\n <div className=\"w-fit rounded-2xl bg-background p-8 shadow-[0_0px_20px_rgba(0,0,0,0.2)] flex flex-col items-center\">\r\n <div className=\"rounded-full bg-muted-primary md:p-4 p-2 mb-4 md:mb-6 lg:mb-8 w-fit\">\r\n <span className=\"text-[52px] md:text-[56px] lg:text-[60px] text-primary\">\r\n <HiMiniXMark />\r\n </span>\r\n </div>\r\n <p className=\"text-[24px] md:text-[28px] lg:text-[32px] font-bold mb-2 md:mb-4\">Unauthorized Access</p>\r\n <p className=\"text-[14px] md:text-[16px] text-center max-w-md text-inactive-tab-text font-medium\">\r\n Sorry, you do not have the necessary permissions to view this page .\r\n </p>\r\n </div>\r\n </div>\r\n )\r\n}"],"mappings":"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","names":["jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","useEffect","useRef","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","useRef","jsx","jsxs","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/index.ts","../src/components/Button.tsx","../src/components/Checkbox.tsx","../src/components/DatePicker.tsx","../src/components/DropdownMenu.tsx","../src/components/ErrorScreen.tsx","../src/components/InputField.tsx","../src/components/LazyImageLoader.tsx","../src/components/LoadingPage.tsx","../src/components/Modal.tsx","../src/components/NumberField.tsx","../src/components/PasswordField.tsx","../src/components/RadioButton.tsx","../src/components/SearchField.tsx","../src/components/TextAreaField.tsx","../src/components/UnauthorizedPage.tsx"],"sourcesContent":["export const ButtonTypes = {\r\n PRIMARY: \"primary\",\r\n SECONDARY: \"secondary\",\r\n TERTIARY: \"tertiary\",\r\n DANGER: \"danger\",\r\n GHOST: \"ghost\",\r\n BASIC: \"basic\"\r\n} as const;\r\n\r\nexport type ButtonTypes = typeof ButtonTypes[keyof typeof ButtonTypes];\r\n\r\nexport const ButtonWidths = {\r\n AUTO: \"auto\",\r\n SMALL: \"small\",\r\n MEDIUM: \"medium\",\r\n LARGE: \"large\",\r\n XL: \"xl\",\r\n FULL: \"full\"\r\n} as const;\r\n\r\nexport type ButtonWidths = typeof ButtonWidths[keyof typeof ButtonWidths];\r\n\r\nexport interface DropdownOption {\r\n value: string;\r\n label: string;\r\n disabled?: boolean;\r\n}\r\n","import { ButtonTypes, ButtonWidths } from \"../types\";\r\nimport { AiOutlineLoading3Quarters } from \"react-icons/ai\";\r\nimport React from \"react\";\r\n\r\ninterface ButtonProps {\r\n buttonText?: string;\r\n buttonIcon?: React.ReactNode;\r\n onClick: () => void;\r\n type: ButtonTypes;\r\n disabled?: boolean;\r\n loading?: boolean;\r\n width?: ButtonWidths;\r\n}\r\n\r\nconst Button = ({ buttonText, buttonIcon, onClick, type, disabled = false, loading = false, width = ButtonWidths.AUTO }: ButtonProps) => {\r\n const isDisabled = disabled || loading;\r\n\r\n const stylePresets: Record<ButtonTypes, string> = {\r\n primary: \"bg-primary text-text border-primary\",\r\n secondary: \"bg-secondary text-text border-secondary\",\r\n tertiary: \"bg-contrast text-text border-contrast\",\r\n danger: \"border-primary text-primary\",\r\n ghost: \"text-secondary border-secondary\",\r\n basic: \"border-contrast\"\r\n }\r\n\r\n const hoverStyles: Record<ButtonTypes, string> = {\r\n primary: \"hover:bg-background hover:border-primary hover:text-primary\",\r\n secondary: \"hover:bg-background hover:border-secondary hover:text-secondary\",\r\n tertiary: \"hover:bg-background hover:border-tertiary hover:text-black\",\r\n danger: \"hover:bg-primary hover:text-text\",\r\n ghost: \"hover:bg-secondary/30\",\r\n basic: \"hover:bg-contrast/30\",\r\n }\r\n\r\n const disabledStyles = \"opacity-50\";\r\n\r\n const widthStyles: Record<ButtonWidths, string> = {\r\n auto: \"w-auto\",\r\n small: \"w-24\",\r\n medium: \"w-32\",\r\n large: \"w-48\",\r\n xl: \"w-64\",\r\n full: \"w-full\"\r\n }\r\n\r\n const handleClick = () => {\r\n if (!isDisabled) {\r\n onClick();\r\n }\r\n };\r\n\r\n return (\r\n <button\r\n onClick={handleClick}\r\n disabled={isDisabled}\r\n className={`\r\n ${stylePresets[type]} \r\n ${!isDisabled ? hoverStyles[type] : ''} \r\n ${isDisabled ? disabledStyles : ''} \r\n ${widthStyles[width]}\r\n rounded-full px-6 py-2 border font-bold text-[11px] lg:text-[12px] whitespace-nowrap\r\n transition-all duration-200 ease-in-out flex items-center justify-center h-fit\r\n ${isDisabled ? 'cursor-not-allowed' : 'cursor-pointer'}\r\n `}\r\n >\r\n {loading && (\r\n <span className=\"animate-spin -ml-1 mr-2 h-4 w-4 inline-block\">\r\n <AiOutlineLoading3Quarters />\r\n </span>\r\n )}\r\n {loading ? 'Loading...' : buttonText}\r\n {buttonIcon && !loading && (\r\n <span className=\"ml-2 inline-block\">\r\n {buttonIcon}\r\n </span>\r\n )}\r\n </button>\r\n )\r\n}\r\n\r\nexport default Button;","export default function Checkbox({label, checked, onChange}: {label: string, checked: boolean, onChange: () => void}) {\r\n return (\r\n <label className=\"inline-flex items-center cursor-pointer relative pl-7 select-none\">\r\n <input\r\n type=\"checkbox\"\r\n checked={checked}\r\n onChange={() => onChange()}\r\n className=\"peer absolute left-0 top-1/2 -translate-y-1/2 w-5 h-5 opacity-0 cursor-pointer\"\r\n />\r\n <span className=\"\r\n absolute left-0 top-1/2 -translate-y-1/2 w-5 h-5 rounded-md\r\n border-2 border-gray-300 bg-white\r\n peer-checked:bg-primary peer-checked:border-primary\r\n flex items-center justify-center\r\n transition-colors\r\n pointer-events-none\r\n \">\r\n <svg\r\n className=\"w-4 h-4 text-white\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"3\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\r\n </svg>\r\n </span>\r\n <span className=\"text-sm\">{label}</span>\r\n </label>\r\n );\r\n}","import React from 'react';\r\nimport { MdCalendarToday } from 'react-icons/md';\r\n\r\ninterface DatePickerProps {\r\n label: string;\r\n id: string;\r\n value: string;\r\n onChange: (date: string) => void;\r\n error?: string;\r\n disabled?: boolean;\r\n minDate?: string;\r\n maxDate?: string;\r\n}\r\n\r\nexport default function DatePicker({\r\n label,\r\n id,\r\n value,\r\n onChange,\r\n error,\r\n disabled = false,\r\n minDate,\r\n maxDate,\r\n}: DatePickerProps) {\r\n const handleDateChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n onChange(e.target.value.toString());\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col w-full\">\r\n <label className=\"text-label text-[14px] md:text-[15px] lg:text-[16px] mb-2 font-semibold\">\r\n {label}\r\n </label>\r\n\r\n <div className=\"relative\">\r\n <input\r\n id={id}\r\n type=\"date\"\r\n value={value}\r\n onChange={handleDateChange}\r\n disabled={disabled}\r\n min={minDate}\r\n max={maxDate}\r\n className={`w-full border-contrast rounded-xl px-3 py-2 md:px-4 md:py-3 border outline-none ${error\r\n ? \"border-red-300 focus:border-red-500 focus:ring-red-500/30\"\r\n : \"focus:border-primary\"\r\n } ${disabled ? \"bg-gray-100 cursor-not-allowed opacity-60\" : \"bg-white\"\r\n } transition-all duration-300 ease-in-out text-sm pr-10 [&::-webkit-calendar-picker-indicator]:opacity-0 [&::-webkit-calendar-picker-indicator]:absolute [&::-webkit-calendar-picker-indicator]:right-3 [&::-webkit-calendar-picker-indicator]:w-5 [&::-webkit-calendar-picker-indicator]:h-5 [&::-webkit-calendar-picker-indicator]:cursor-pointer`}\r\n />\r\n\r\n <div className=\"absolute right-3 top-1/2 transform -translate-y-1/2 pointer-events-none\">\r\n <span className={`w-5 h-5 ${disabled ? \"text-gray-400\" : \"text-secondary\"}`}>\r\n <MdCalendarToday />\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {error && (\r\n <span className=\"text-red-500 text-sm font-medium mt-1\">{error}</span>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useState, useRef, useEffect } from \"react\";\r\nimport { IoChevronDown } from \"react-icons/io5\";\r\nimport Button from \"./Button\";\r\nimport { ButtonTypes, ButtonWidths } from \"../types\";\r\nimport type { DropdownOption } from \"../types\";\r\n\r\ninterface DropdownMenuProps {\r\n label?: string;\r\n placeholder?: string;\r\n options: DropdownOption[];\r\n value?: string;\r\n onChange: (value: string) => void;\r\n error?: string;\r\n disabled?: boolean;\r\n className?: string;\r\n id?: string;\r\n}\r\n\r\nexport default function DropdownMenu({\r\n label,\r\n placeholder = \"Select an option\",\r\n options,\r\n value,\r\n onChange,\r\n error,\r\n disabled = false,\r\n className = \"\",\r\n id,\r\n}: DropdownMenuProps) {\r\n const [isOpen, setIsOpen] = useState(false);\r\n const dropdownRef = useRef<HTMLDivElement>(null);\r\n\r\n const selectedOption = options.find((option) => option.value === value);\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (\r\n dropdownRef.current &&\r\n !dropdownRef.current.contains(event.target as Node)\r\n ) {\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, []);\r\n\r\n const handleOptionClick = (optionValue: string) => {\r\n if (!disabled) {\r\n onChange(optionValue);\r\n setIsOpen(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className={`flex flex-col w-full ${className}`}>\r\n {label && (\r\n <label\r\n htmlFor={id}\r\n className=\"text-label text-[14px] md:text-[15px] lg:text-[16px] mb-2 font-semibold\"\r\n >\r\n {label}\r\n </label>\r\n )}\r\n\r\n <div className=\"relative\" ref={dropdownRef}>\r\n <div className=\"relative\">\r\n <Button\r\n buttonText={selectedOption ? selectedOption.label : placeholder}\r\n onClick={() => !disabled && setIsOpen(!isOpen)}\r\n type={ButtonTypes.BASIC}\r\n disabled={disabled}\r\n width={ButtonWidths.FULL}\r\n />\r\n <span\r\n className={`absolute right-3 top-1/2 transform -translate-y-1/2 w-5 h-5 text-secondary transition-transform duration-200 pointer-events-none ${\r\n isOpen ? \"rotate-180\" : \"\"\r\n }`}\r\n >\r\n <IoChevronDown />\r\n </span>\r\n </div>\r\n\r\n {isOpen && !disabled && (\r\n <div className=\"absolute z-50 w-full mt-1 bg-white border border-secondary/30 rounded-xl shadow-lg max-h-60 overflow-y-auto\">\r\n {options.length === 0 ? (\r\n <div className=\"px-3 py-2 text-sm text-muted-secondary\">\r\n No options available\r\n </div>\r\n ) : (\r\n options.map((option) => (\r\n <button\r\n key={option.value}\r\n type=\"button\"\r\n onClick={() => handleOptionClick(option.value)}\r\n disabled={option.disabled}\r\n className={`\r\n w-full px-3 py-2 text-left text-sm transition-colors duration-150\r\n ${\r\n option.disabled\r\n ? \"text-gray-400 cursor-not-allowed\"\r\n : \"text-gray-900 hover:bg-secondary/10 hover:text-secondary cursor-pointer\"\r\n }\r\n ${\r\n value === option.value\r\n ? \"bg-secondary/20 text-secondary font-medium\"\r\n : \"\"\r\n }\r\n first:rounded-t-xl last:rounded-b-xl\r\n `}\r\n >\r\n {option.label}\r\n </button>\r\n ))\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {error && <p className=\"mt-1 text-sm text-red-600\">{error}</p>}\r\n </div>\r\n );\r\n}\r\n","import { FaExclamationTriangle } from \"react-icons/fa\";\r\n\r\ninterface ErrorComponentProps {\r\n title: string;\r\n message: string;\r\n}\r\n\r\nexport default function ErrorComponent({\r\n title,\r\n message,\r\n}: ErrorComponentProps) {\r\n return (\r\n <div className=\"min-h-screen bg-background\">\r\n <div className=\"w-full md:w-3/4 lg:w-10/12 m-auto rounded-xl shadow-md p-5 flex flex-col gap-4\">\r\n {/* Error Container */}\r\n <div className=\"flex flex-col items-center justify-center py-16 px-4\">\r\n {/* Error Icon */}\r\n <div className=\"mb-6\">\r\n <div className=\"w-20 h-20 bg-red-100 rounded-full flex items-center justify-center\">\r\n <span className=\"text-error text-3xl\">\r\n <FaExclamationTriangle />\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Error Title */}\r\n <h1 className=\"text-2xl md:text-3xl lg:text-4xl font-bold text-error mb-4 text-center\">\r\n {title}\r\n </h1>\r\n\r\n {/* Error Message */}\r\n <p className=\"text-base md:text-lg text-center mb-8 max-w-md\">\r\n {message}\r\n </p>\r\n </div>\r\n\r\n <div className=\"mt-8 bg-red-50 border border-red-200 rounded-xl p-4\">\r\n <h3 className=\"font-semibold text-red-800 mb-2\">\r\n Technical Details\r\n </h3>\r\n <div className=\"text-red-700 text-sm space-y-1\">\r\n <p>• Check your internet connection</p>\r\n <p>• The page may be temporarily unavailable</p>\r\n <p>• Contact support if the problem persists</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React from 'react';\r\n\r\nexport default function InputField({\r\n label,\r\n value,\r\n placeholder,\r\n onChange,\r\n error,\r\n id,\r\n}: {\r\n label: string;\r\n id: string;\r\n value: string;\r\n placeholder: string;\r\n onChange: (newValue: React.ChangeEvent<HTMLInputElement>) => void;\r\n error?: string;\r\n}) {\r\n return (\r\n <div className=\"flex flex-col w-full\">\r\n <label className=\"text-label text-[14px] md:text-[15px] lg:text-[16px] mb-2 font-semibold\">\r\n {label}\r\n </label>\r\n <input\r\n id={id}\r\n value={value}\r\n placeholder={placeholder}\r\n onChange={(e) => onChange(e)}\r\n className={`border-gray-400 rounded-xl px-3 py-2 md:px-4 md:py-3 border outline-none ${\r\n error\r\n ? \"border-red-300 focus:border-red-500 focus:ring-red-500/30\"\r\n : \"focus:border-primary\"\r\n } transition-all duration-300 ease-in-out text-sm`}\r\n />\r\n </div>\r\n );\r\n}\r\n","import { useState } from \"react\";\r\nimport { HiOutlinePhotograph } from \"react-icons/hi\";\r\n\r\ninterface LazyImageLoaderProps {\r\n src: string;\r\n alt: string;\r\n className?: string;\r\n width?: string | number;\r\n height?: string | number;\r\n}\r\n\r\nexport default function LazyImageLoader({ \r\n src, \r\n alt, \r\n className = \"\", \r\n width = \"100%\", \r\n height = \"200px\" \r\n}: LazyImageLoaderProps) {\r\n const [imageLoaded, setImageLoaded] = useState(false);\r\n const [imageError, setImageError] = useState(false);\r\n\r\n const handleImageLoad = () => {\r\n setImageLoaded(true);\r\n };\r\n\r\n const handleImageError = () => {\r\n setImageError(true);\r\n setImageLoaded(true);\r\n };\r\n\r\n return (\r\n <div \r\n className={`relative overflow-hidden ${className}`}\r\n style={{ width, height }}\r\n >\r\n {!imageLoaded && (\r\n <div className=\"absolute inset-0 bg-gray-200 animate-pulse\">\r\n <div className=\"absolute inset-0 bg-gradient-to-r from-gray-200 via-gray-100 to-gray-200 animate-shimmer\"></div>\r\n </div>\r\n )}\r\n\r\n {imageError && (\r\n <div className=\"absolute inset-0 bg-gray-100 flex items-center justify-center\">\r\n <div className=\"text-center text-gray-400\">\r\n <span className=\"w-12 h-12 mx-auto mb-2\">\r\n <HiOutlinePhotograph />\r\n </span>\r\n <p className=\"text-sm\">Failed to load</p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <img\r\n src={src}\r\n alt={alt}\r\n onLoad={handleImageLoad}\r\n onError={handleImageError}\r\n className={`w-full h-full object-cover transition-opacity duration-300 ${\r\n imageLoaded ? \"opacity-100\" : \"opacity-0\"\r\n }`}\r\n />\r\n </div>\r\n );\r\n}\r\n","import tccd_logo from \"../assets/TCCD_logo.svg\";\r\n\r\nconst LoadingPage = () => {\r\n return (\r\n <>\r\n <style>{`\r\n @keyframes custom-bounce {\r\n 0%, 100% {\r\n transform: translateY(0);\r\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\r\n }\r\n 50% {\r\n transform: translateY(-8px);\r\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\r\n }\r\n }\r\n\r\n @keyframes logoLuxury {\r\n 0% {\r\n filter: brightness(1) contrast(1) drop-shadow(0 0 15px rgba(205, 58, 56, 0.3)) saturate(1);\r\n transform: scale(1) rotate(0deg);\r\n }\r\n 25% {\r\n filter: brightness(1.2) contrast(1.2) drop-shadow(0 0 25px rgba(41, 94, 126, 0.5)) saturate(1.2);\r\n transform: scale(1.05) rotate(2deg);\r\n }\r\n 50% {\r\n filter: brightness(1.4) contrast(1.3) drop-shadow(0 0 35px rgba(205, 58, 56, 0.7)) saturate(1.4);\r\n transform: scale(1.08) rotate(0deg);\r\n }\r\n 75% {\r\n filter: brightness(1.2) contrast(1.2) drop-shadow(0 0 25px rgba(41, 94, 126, 0.5)) saturate(1.2);\r\n transform: scale(1.05) rotate(-2deg);\r\n }\r\n 100% {\r\n filter: brightness(1) contrast(1) drop-shadow(0 0 15px rgba(205, 58, 56, 0.3)) saturate(1);\r\n transform: scale(1) rotate(0deg);\r\n }\r\n }\r\n\r\n @keyframes float {\r\n 0%, 100% {\r\n transform: translateY(0px) translateX(0px) scale(1);\r\n opacity: 0.3;\r\n }\r\n 50% {\r\n transform: translateY(-20px) translateX(10px) scale(1.2);\r\n opacity: 0.8;\r\n }\r\n }\r\n\r\n @keyframes spinSlow {\r\n from {\r\n transform: rotate(0deg);\r\n }\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n\r\n @keyframes rotateSlow {\r\n from {\r\n transform: rotate(0deg);\r\n }\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n\r\n @keyframes gradientShift {\r\n 0%, 100% {\r\n background-position: 0% 50%;\r\n }\r\n 50% {\r\n background-position: 100% 50%;\r\n }\r\n }\r\n\r\n @keyframes progressWave {\r\n 0% {\r\n transform: translateX(-100%) scaleX(1);\r\n opacity: 0.8;\r\n }\r\n 50% {\r\n transform: translateX(0%) scaleX(1.5);\r\n opacity: 1;\r\n }\r\n 100% {\r\n transform: translateX(100%) scaleX(1);\r\n opacity: 0.8;\r\n }\r\n }\r\n\r\n .animate-custom-bounce {\r\n animation-name: custom-bounce;\r\n animation-duration: 2s;\r\n animation-iteration-count: infinite;\r\n }\r\n\r\n .animate-logo-luxury {\r\n animation: logoLuxury 4s ease-in-out infinite;\r\n }\r\n\r\n .animate-float {\r\n animation: float 6s ease-in-out infinite;\r\n }\r\n\r\n .animate-spin-slow {\r\n animation: spinSlow 8s linear infinite;\r\n }\r\n\r\n .animate-rotate-slow {\r\n animation: rotateSlow 12s linear infinite;\r\n }\r\n\r\n .animate-gradient-shift {\r\n background-size: 300% 300%;\r\n animation: gradientShift 3s ease infinite;\r\n }\r\n\r\n .animate-progress-wave {\r\n animation: progressWave 2s ease-in-out infinite;\r\n }\r\n\r\n .dot-container .dot:nth-child(1) { animation-delay: 0s; }\r\n .dot-container .dot:nth-child(2) { animation-delay: 0.15s; }\r\n .dot-container .dot:nth-child(3) { animation-delay: 0.3s; }\r\n .dot-container .dot:nth-child(4) { animation-delay: 0.45s; }\r\n .dot-container .dot:nth-child(5) { animation-delay: 0.6s; }\r\n .dot-container .dot:nth-child(6) { animation-delay: 0.75s; }\r\n .dot-container .dot:nth-child(7) { animation-delay: 0.9s; }\r\n .dot-container .dot:nth-child(8) { animation-delay: 1.05s; }\r\n `}</style>\r\n <div className=\"relative min-h-screen bg-gradient-to-br from-background via-dashboard-welcome-bg to-muted-secondary overflow-hidden\">\r\n <div className=\"absolute inset-0\">\r\n {[...Array(25)].map((_, i) => (\r\n <div\r\n key={i}\r\n className=\"absolute w-2 h-2 bg-primary/20 rounded-full animate-float\"\r\n style={{\r\n left: `${Math.random() * 100}%`,\r\n top: `${Math.random() * 100}%`,\r\n animationDelay: `${Math.random() * 5}s`,\r\n animationDuration: `${3 + Math.random() * 4}s`,\r\n }}\r\n />\r\n ))}\r\n </div>\r\n\r\n <div className=\"relative z-10 flex flex-col items-center justify-center min-h-screen px-4\">\r\n\r\n <div className=\"relative mb-5 md:mb-10\">\r\n <div className=\"absolute inset-0 rounded-full bg-gradient-to-r from-primary via-secondary to-primary opacity-30 blur-2xl animate-spin-slow scale-150\"></div>\r\n\r\n <div className=\"absolute inset-4 rounded-full bg-gradient-to-r from-secondary via-primary to-secondary opacity-40 blur-xl animate-pulse\"></div>\r\n\r\n <div className=\"relative bg-white/10 backdrop-blur-sm rounded-full p-8 border border-white/20 shadow-2xl\">\r\n <div className=\"relative\">\r\n <img\r\n src={tccd_logo}\r\n alt=\"TCCD logo\"\r\n className=\"relative z-10 animate-logo-luxury drop-shadow-2xl lg:w-[160px] md:w-[135px] w-[110px]\"\r\n />\r\n\r\n <div className=\"absolute inset-0 bg-gradient-to-tr from-transparent via-white/40 to-transparent animate-rotate-slow opacity-60\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"text-center mb-4\">\r\n <h1 className=\"lg:text-3xl md:text-2xl text-xl font-bold bg-gradient-to-r from-primary via-secondary to-primary bg-clip-text text-transparent animate-gradient-shift mb-4\">\r\n Loading your experience...\r\n </h1>\r\n\r\n <p className=\"text-dashboard-description lg:text-lg md:text-md text-sm font-medium opacity-80\">\r\n Please wait while we prepare everything for you\r\n </p>\r\n </div>\r\n\r\n <div className=\"relative w-80 mb-8\">\r\n <div className=\"h-2 bg-muted-secondary/30 rounded-full overflow-hidden backdrop-blur-sm\">\r\n <div className=\"h-full bg-gradient-to-r from-primary via-secondary to-primary animate-progress-wave\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"absolute top-8 left-8 w-16 h-16 border-l-2 border-t-2 border-primary/30 rounded-tl-lg\"></div>\r\n <div className=\"absolute top-8 right-8 w-16 h-16 border-r-2 border-t-2 border-secondary/30 rounded-tr-lg\"></div>\r\n <div className=\"absolute bottom-8 left-8 w-16 h-16 border-l-2 border-b-2 border-secondary/30 rounded-bl-lg\"></div>\r\n <div className=\"absolute bottom-8 right-8 w-16 h-16 border-r-2 border-b-2 border-primary/30 rounded-br-lg\"></div>\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default LoadingPage;\r\n","import { useEffect, useRef } from \"react\";\r\nimport type { ReactNode } from \"react\";\r\nimport { LuX } from \"react-icons/lu\";\r\nimport React from 'react';\r\n\r\nconst Modal = ({\r\n title,\r\n isOpen,\r\n onClose,\r\n children,\r\n}: {\r\n title: string;\r\n isOpen: boolean;\r\n onClose: () => void;\r\n children: ReactNode;\r\n}) => {\r\n const modalRef = useRef<HTMLDivElement>(null);\r\n const previousFocusRef = useRef<HTMLElement | null>(null);\r\n\r\n useEffect(() => {\r\n if (isOpen) {\r\n // Store the previously focused element\r\n previousFocusRef.current = document.activeElement as HTMLElement;\r\n\r\n // Focus the modal\r\n modalRef.current?.focus();\r\n\r\n // Prevent body scroll\r\n document.body.style.overflow = \"hidden\";\r\n } else {\r\n // Restore body scroll\r\n document.body.style.overflow = \"unset\";\r\n\r\n // Restore focus to previously focused element\r\n previousFocusRef.current?.focus();\r\n }\r\n\r\n return () => {\r\n document.body.style.overflow = \"unset\";\r\n };\r\n }, [isOpen]);\r\n\r\n useEffect(() => {\r\n const handleEscape = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\" && isOpen) {\r\n onClose();\r\n }\r\n };\r\n\r\n document.addEventListener(\"keydown\", handleEscape);\r\n return () => document.removeEventListener(\"keydown\", handleEscape);\r\n }, [isOpen, onClose]);\r\n\r\n const handleBackdropClick = (e: React.MouseEvent<HTMLDivElement>) => {\r\n if (e.target === e.currentTarget) {\r\n onClose();\r\n }\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n return (\r\n <div\r\n className=\"fixed inset-0 bg-black/30 backdrop-blur-sm flex items-center justify-center z-50\"\r\n onClick={handleBackdropClick}\r\n >\r\n <div\r\n ref={modalRef}\r\n className=\"bg-background rounded-lg shadow-xl w-full mx-4 sm:max-w-lg xl:max-w-xl max-h-[90vh] flex flex-col overflow-y-auto\"\r\n tabIndex={-1}\r\n >\r\n <div className=\"p-4 sm:p-6 flex-1 flex flex-col\">\r\n <div className=\"flex justify-between items-center mb-4\">\r\n <h2\r\n id=\"modal-title\"\r\n className=\"text-lg sm:text-xl md:text-2xl font-bold text-primary\"\r\n >\r\n {title}\r\n </h2>\r\n <span\r\n onClick={onClose}\r\n className=\"text-gray-400 hover:text-gray-600 transition-colors duration-300 p-1 text-xl sm:text-2xl md:text-3xl cursor-pointer\"\r\n >\r\n <LuX />\r\n </span>\r\n </div>\r\n {children}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default Modal;\r\n","import { useState } from \"react\";\r\nimport React from 'react';\r\n\r\nexport default function NumberField({\r\n label,\r\n value,\r\n placeholder,\r\n onChange,\r\n error,\r\n maxLength,\r\n id,\r\n}: {\r\n label: string;\r\n id: string;\r\n value: string;\r\n placeholder: string;\r\n maxLength?: number;\r\n onChange: (newValue: React.ChangeEvent<HTMLInputElement>) => void;\r\n error?: string;\r\n}) {\r\n const [lengthError, setLengthError] = useState<string | null>(null);\r\n function handleChange(e: React.ChangeEvent<HTMLInputElement>) {\r\n const inputValue = e.target.value;\r\n if (maxLength && inputValue.length > maxLength) {\r\n setLengthError(`Maximum length of ${maxLength} characters exceeded.`);\r\n return;\r\n }\r\n lengthError && setLengthError(null);\r\n onChange(e);\r\n }\r\n return (\r\n <div className=\"flex flex-col w-full\">\r\n <label className=\"text-label text-[14px] md:text-[15px] lg:text-[16px] mb-2 font-semibold\">\r\n {label}\r\n </label>\r\n <input\r\n id={id}\r\n value={value}\r\n type=\"number\"\r\n placeholder={placeholder}\r\n onChange={handleChange}\r\n className={`border-gray-400 rounded-xl px-3 py-2 md:px-4 md:py-3 border outline-none ${\r\n error || lengthError\r\n ? \"border-red-300 focus:border-red-500 focus:ring-red-500/30\"\r\n : \"focus:border-primary\"\r\n } transition-all duration-300 ease-in-out text-sm`}\r\n />\r\n </div>\r\n );\r\n}\r\n","import { useState } from \"react\";\r\nimport { LuEye, LuEyeOff } from \"react-icons/lu\";\r\nimport React from 'react';\r\n\r\nexport default function PasswordField({\r\n value,\r\n onChange,\r\n error,\r\n}: {\r\n value: string;\r\n onChange: (newValue: React.ChangeEvent<HTMLInputElement>) => void;\r\n error?: string;\r\n}) {\r\n const [show, setShow] = useState(false);\r\n\r\n return (\r\n <div className=\"flex flex-col w-full\">\r\n <label className=\"text-label text-[14px] md:text-[15px] lg:text-[16px] mb-2 font-semibold\">\r\n Password\r\n </label>\r\n <div className=\"relative\">\r\n <input\r\n id=\"password\"\r\n value={value}\r\n placeholder=\"Enter your Password\"\r\n onChange={(e) => onChange(e)}\r\n type={show ? \"text\" : \"password\"}\r\n className={`border-gray-400 rounded-xl px-3 py-2 md:px-4 md:py-3 border outline-none ${\r\n error\r\n ? \"border-red-300 focus:border-red-500 focus:ring-red-500/30\"\r\n : \"focus:border-primary\"\r\n } transition-all duration-300 ease-in-out text-sm w-full pr-10 `}\r\n />\r\n <button\r\n type=\"button\"\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 contrast-50 cursor-pointer transition duration-300 ease-in-out hover:contrast-100\"\r\n onClick={() => setShow(!show)}\r\n tabIndex={-1}\r\n >\r\n {show ? <LuEyeOff size={20} /> : <LuEye size={20} />}\r\n </button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","\r\n\r\nexport default function Radiobutton({label, checked, onChange}: {label: string, checked: boolean, onChange: (newValue: boolean) => void}) {\r\n return (\r\n <label className=\"inline-flex items-center cursor-pointer relative pl-7 select-none\">\r\n <input\r\n type=\"radio\"\r\n checked={checked}\r\n onChange={(e) => onChange(e.target.checked)}\r\n className=\"peer absolute left-0 top-1/2 -translate-y-1/2 w-5 h-5 opacity-0 cursor-pointer\"\r\n />\r\n <span className=\"\r\n absolute left-0 top-1/2 -translate-y-1/2 w-5 h-5 rounded-full\r\n border-2 border-gray-300 bg-background\r\n flex items-center justify-center\r\n transition-colors\r\n pointer-events-none\r\n \">\r\n <span className={`w-3 h-3 ${checked ? 'bg-primary' : 'bg-transparent'} rounded-full transition-all`} />\r\n </span>\r\n <span className=\"text-sm\">{label}</span>\r\n </label>\r\n );\r\n}","import { HiOutlineMagnifyingGlass } from \"react-icons/hi2\";\r\n\r\ninterface SearchFieldProps {\r\n value: string;\r\n onChange: (value: string) => void;\r\n placeholder?: string;\r\n className?: string;\r\n}\r\n\r\nexport default function SearchField({\r\n value,\r\n onChange,\r\n placeholder = \"Search...\",\r\n className = \"\"\r\n}: SearchFieldProps) {\r\n return (\r\n <div className={`relative w-full lg:w-96 ${className}`}>\r\n <div className=\"relative\">\r\n <span className=\"absolute left-4 top-1/2 transform -translate-y-1/2 text-muted-secondary/60 text-lg\">\r\n <HiOutlineMagnifyingGlass />\r\n </span>\r\n <input\r\n type=\"text\"\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n placeholder={placeholder}\r\n className=\"w-full bg-background/50 rounded-3xl border-contrast pl-12 pr-4 py-2 text-[14px] md:text-[15px] lg:text-[16px] border focus:border-primary focus:outline-none transition-all duration-300 ease-in-out placeholder:text-muted-secondary\"\r\n />\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { useState, useRef } from \"react\";\r\nimport React from 'react';\r\n\r\nexport default function TextAreaField({\r\n label,\r\n value,\r\n placeholder,\r\n onChange,\r\n error,\r\n maxLength,\r\n id,\r\n}: {\r\n label: string;\r\n id: string;\r\n value: string;\r\n placeholder: string;\r\n maxLength?: number;\r\n onChange: (newValue: React.ChangeEvent<HTMLTextAreaElement>) => void;\r\n error?: string;\r\n}) {\r\n const [lengthError, setLengthError] = useState<string | null>(null);\r\n const textareaRef = useRef<HTMLTextAreaElement>(null);\r\n function handleChange(e: React.ChangeEvent<HTMLTextAreaElement>) {\r\n const inputValue = e.target.value;\r\n if (maxLength && inputValue.length > maxLength) {\r\n setLengthError(`Maximum length of ${maxLength} characters exceeded.`);\r\n return;\r\n }\r\n lengthError && setLengthError(null);\r\n if (textareaRef.current) {\r\n textareaRef.current.style.height = \"auto\";\r\n textareaRef.current.style.height =\r\n textareaRef.current.scrollHeight + \"px\";\r\n }\r\n onChange(e);\r\n }\r\n return (\r\n <div className=\"flex flex-col w-full\">\r\n <label className=\"text-label text-[14px] md:text-[15px] lg:text-[16px] mb-2 font-semibold\">\r\n {label}\r\n </label>\r\n <textarea\r\n ref={textareaRef}\r\n id={id}\r\n onChange={handleChange}\r\n value={value}\r\n placeholder={placeholder}\r\n rows={4}\r\n className={`border-gray-400 rounded-xl px-3 py-2 md:px-4 md:py-3 border outline-none ${\r\n error || lengthError\r\n ? \"border-red-300 focus:border-red-500 focus:ring-red-500/30\"\r\n : \"focus:border-primary\"\r\n } transition-all duration-300 ease-in-out text-sm`}\r\n />\r\n {maxLength && (\r\n <p className=\"text-[9px] md:text-[10px] lg:text-[11px] p-1 text-inactive-tab-text\">\r\n {value.length}/{maxLength}\r\n </p>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { HiMiniXMark } from \"react-icons/hi2\";\r\n\r\nexport default function UnauthorizedPage() {\r\n return (\r\n <div className=\"w-screen h-screen flex flex-col justify-center items-center bg-background\">\r\n <div className=\"w-fit rounded-2xl bg-background p-8 shadow-[0_0px_20px_rgba(0,0,0,0.2)] flex flex-col items-center\">\r\n <div className=\"rounded-full bg-muted-primary md:p-4 p-2 mb-4 md:mb-6 lg:mb-8 w-fit\">\r\n <span className=\"text-[52px] md:text-[56px] lg:text-[60px] text-primary\">\r\n <HiMiniXMark />\r\n </span>\r\n </div>\r\n <p className=\"text-[24px] md:text-[28px] lg:text-[32px] font-bold mb-2 md:mb-4\">Unauthorized Access</p>\r\n <p className=\"text-[14px] md:text-[16px] text-center max-w-md text-inactive-tab-text font-medium\">\r\n Sorry, you do not have the necessary permissions to view this page .\r\n </p>\r\n </div>\r\n </div>\r\n )\r\n}"],"mappings":"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","names":["jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","useEffect","useRef","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","useRef","jsx","jsxs","jsx","jsxs"]}
|