diff --git a/README.md b/README.md index 61b99311..426fc923 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Using Force UI as a dependency in package.json - ```json "dependencies": { - "@bsf/force-ui": "git+https://github.com/brainstormforce/force-ui#1.3.3" + "@bsf/force-ui": "git+https://github.com/brainstormforce/force-ui#1.3.4" } ``` @@ -28,7 +28,7 @@ npm install Or you can directly run the following command to install the package - ```bash -npm i -S @bsf/force-ui@git+https://github.com/brainstormforce/force-ui.git#1.3.3 +npm i -S @bsf/force-ui@git+https://github.com/brainstormforce/force-ui.git#1.3.4 ```
diff --git a/changelog.txt b/changelog.txt index cd516a27..1052b23c 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,19 +1,32 @@ +Version 1.3.4 - 31th December, 2024 +- Improvement - Enhanced the UI of the Table and Line chart component for responsive design. +- Improvement - Added option group to the Select component. +- Improvement - Updated the Table component design. +- Improvement - Added support for controlling selected dates through the 'selected' prop in DatePicker component. +- Improvement - Enhanced the UI of the Drawer component. +- Improvement - Added a new prop to the Badge component to disable hover effect. +- Fixed - Adjusted search icon size in Select combobox for better visual consistency. +- Fixed - Focus ring offset of Select, Switch, Checkbox, and dropdown component. +- Fixed - Checkbox/Switch toggle behavior with hint text and adjusted help text size. +- Fixed - DatePicker component crash when navigating through years. +- Fixed - DatePicker component UI styles for better visual consistency. + Version 1.3.3 - 20th December, 2024 -Fixed - React `Each child in a list should have a unique "key" prop` console warning. -Fixed - Toaster content overlapping with the close button. +- Fixed - React `Each child in a list should have a unique "key" prop` console warning. +- Fixed - Toaster content overlapping with the close button. Version 1.3.2 - 17th December, 2024 -Fixed - Adjusted the color of the Switch component label and help text. +- Fixed - Adjusted the color of the Switch component label and help text. Version 1.3.1 - 17th December, 2024 -Fixed - The underline issue to enhance visual consistency. -Fixed - Issue with the Select component where a check mark was displayed even when no item was selected. -Fixed - Design mismatch in the Switch component. -Fixed - Text, icon size, alignment, and color inconsistencies in the Date Picker to ensure a uniform appearance. -Fixed - Input ref not pointing to the input field. -Fixed - Icon size and alignment issues in the Menu component for better visual clarity. -Fixed - Sidebar height not being overridable. -Improvement - Removed backdrop blur to enhance performance and visual clarity. +- Fixed - The underline issue to enhance visual consistency. +- Fixed - Issue with the Select component where a check mark was displayed even when no item was selected. +- Fixed - Design mismatch in the Switch component. +- Fixed - Text, icon size, alignment, and color inconsistencies in the Date Picker to ensure a uniform appearance. +- Fixed - Input ref not pointing to the input field. +- Fixed - Icon size and alignment issues in the Menu component for better visual clarity. +- Fixed - Sidebar height not being overridable. +- Improvement - Removed backdrop blur to enhance performance and visual clarity. Version 1.3.0 - 16th December, 2024 - New - Table component. diff --git a/package.json b/package.json index e78445fe..ca50f9b9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bsf/force-ui", - "version": "1.3.3", + "version": "1.3.4", "description": "Library of components for the BSF project", "main": "./dist/force-ui.js", "module": "./dist/force-ui.js", diff --git a/src/components/accordion/accordion.stories.tsx b/src/components/accordion/accordion.stories.tsx index 60b80704..890dc4d0 100644 --- a/src/components/accordion/accordion.stories.tsx +++ b/src/components/accordion/accordion.stories.tsx @@ -11,9 +11,9 @@ export default { }, tags: [ 'autodocs' ], subcomponents: { - Item: Accordion.Item, - Trigger: Accordion.Trigger, - Content: Accordion.Content, + 'Accordion.Item': Accordion.Item, + 'Accordion.Trigger': Accordion.Trigger, + 'Accordion.Content': Accordion.Content, }, decorators: [ ( Story ) => ( diff --git a/src/components/badge/badge.tsx b/src/components/badge/badge.tsx index ccea02b4..fc5a02d3 100644 --- a/src/components/badge/badge.tsx +++ b/src/components/badge/badge.tsx @@ -27,6 +27,11 @@ export interface BadgeProps { * Custom Icon for the badge. */ icon?: ReactNode; + /** + * Disable hover effect. + * @default false + */ + disableHover?: boolean; /** * Defines if the badge is disabled. */ @@ -60,12 +65,13 @@ const Badge = forwardRef( onClose = () => {}, closable = false, onMouseDown = () => {}, + disableHover = false, }, ref ) => { // Base classes - Mandatory classes const baseClasses = - 'font-medium border-badge-border-gray flex items-center justify-center border border-solid box-border max-w-full'; + 'font-medium border-badge-border-gray flex items-center justify-center border border-solid box-border max-w-full transition-colors duration-150 ease-in-out'; // Size classes - Based on the size prop const sizeClasses = { @@ -82,18 +88,29 @@ const Badge = forwardRef( rounded: 'rounded', }; + // Hover classes - Based on the variant prop + const hoverClasses = { + neutral: 'hover:bg-badge-hover-gray', + red: 'hover:bg-badge-hover-red', + yellow: 'hover:bg-badge-hover-yellow', + green: 'hover:bg-badge-hover-green', + blue: 'hover:bg-badge-hover-sky', + inverse: 'hover:bg-badge-hover-inverse', + disabled: 'hover:bg-badge-hover-disabled', + }; + // Variant classes - Based on the variant prop const variantClasses = { neutral: - 'bg-badge-background-gray hover:bg-badge-hover-gray text-badge-color-gray border-badge-border-gray', - red: 'bg-badge-background-red hover:bg-badge-hover-red text-badge-color-red border-badge-border-red', - yellow: 'bg-badge-background-yellow hover:bg-badge-hover-yellow text-badge-color-yellow border-badge-border-yellow', - green: 'bg-badge-background-green hover:bg-badge-hover-green text-badge-color-green border-badge-border-green', - blue: 'bg-badge-background-sky hover:bg-badge-hover-sky text-badge-color-sky border-badge-border-sky', + 'bg-badge-background-gray text-badge-color-gray border-badge-border-gray', + red: 'bg-badge-background-red text-badge-color-red border-badge-border-red', + yellow: 'bg-badge-background-yellow text-badge-color-yellow border-badge-border-yellow', + green: 'bg-badge-background-green text-badge-color-green border-badge-border-green', + blue: 'bg-badge-background-sky text-badge-color-sky border-badge-border-sky', inverse: - 'bg-background-inverse hover:bg-badge-hover-inverse text-text-inverse border-background-inverse', + 'bg-background-inverse text-text-inverse border-background-inverse', disabled: - 'bg-badge-background-disabled hover:bg-badge-hover-disabled text-badge-color-disabled border-badge-border-disabled disabled cursor-not-allowed', + 'bg-badge-background-disabled text-badge-color-disabled border-badge-border-disabled disabled cursor-not-allowed', }; let filteredClasses = ''; @@ -127,6 +144,7 @@ const Badge = forwardRef( typeClasses[ type ], 'gap-0.5', filteredClasses, + ! disableHover && hoverClasses[ variant ], className ) } ref={ ref } diff --git a/src/components/checkbox/checkbox.tsx b/src/components/checkbox/checkbox.tsx index 1c6e547e..07e7dada 100644 --- a/src/components/checkbox/checkbox.tsx +++ b/src/components/checkbox/checkbox.tsx @@ -8,6 +8,7 @@ import { import { nanoid } from 'nanoid'; import { cn } from '@/utilities/functions'; import { Check, Minus } from 'lucide-react'; +import Label from '../label/label'; // Types for Component Props export declare interface CheckboxProps { @@ -59,7 +60,7 @@ export const CheckboxComponent = ( checkbox: 'size-4 rounded gap-1', icon: 'size-3', text: 'text-sm', // text class for sm - description: 'text-xs', + description: 'text-sm', gap: 'gap-0.5', }, md: { @@ -73,7 +74,7 @@ export const CheckboxComponent = ( const colorClassNames = { primary: { checkbox: - 'border-border-strong hover:border-border-interactive checked:border-border-interactive bg-white checked:bg-toggle-on checked:hover:bg-toggle-on-hover checked:hover:border-toggle-on-hover focus:ring-2 focus:ring-offset-4 focus:ring-focus', + 'border-border-strong hover:border-border-interactive checked:border-border-interactive bg-white checked:bg-toggle-on checked:hover:bg-toggle-on-hover checked:hover:border-toggle-on-hover focus:ring-2 focus:ring-offset-2 focus:ring-focus', icon: 'text-white', }, }; @@ -116,27 +117,30 @@ export const CheckboxComponent = ( return (
{ label?.heading && ( -

{ label?.heading } -

+ ) } { label?.description && ( -

{ label?.description } -

+ ) }
); @@ -187,17 +191,7 @@ export const CheckboxComponent = ( ) } - { !! label && ( - - ) } + { !! label && renderLabel() } ); }; diff --git a/src/components/datepicker/datepicker-component.tsx b/src/components/datepicker/datepicker-component.tsx index 4c45f865..c3ab1588 100644 --- a/src/components/datepicker/datepicker-component.tsx +++ b/src/components/datepicker/datepicker-component.tsx @@ -175,7 +175,7 @@ const DatePickerComponent = ( { } }; - const handleYearClick = ( { yearValue }: { yearValue: number } ) => { + const handleYearClick = ( yearValue: number ) => { setSelectedYear( yearValue ); setShowYearSelect( false ); setShowMonthSelect( true ); @@ -245,13 +245,7 @@ const DatePickerComponent = ( { diff --git a/src/components/datepicker/datepicker.tsx b/src/components/datepicker/datepicker.tsx index 6e6b5349..be85af79 100644 --- a/src/components/datepicker/datepicker.tsx +++ b/src/components/datepicker/datepicker.tsx @@ -11,6 +11,7 @@ import { subWeeks, subMonths, } from 'date-fns'; +import { getDefaultSelectedValue } from './utils'; export interface DatePickerProps { /** Defines the selection selectionType of the date picker: single, range, or multiple dates. */ @@ -33,6 +34,8 @@ export interface DatePickerProps { showOutsideDays?: boolean; /** Show or hide the footer. */ isFooter?: boolean; + /** Selected date value. */ + selected?: Date | Date[] | TDateRange | null; } const DatePicker = ( { @@ -46,17 +49,30 @@ const DatePicker = ( { cancelButtonText = 'Cancel', showOutsideDays = true, isFooter = true, + selected, ...props }: DatePickerProps ) => { const [ selectedDates, setSelectedDates ] = useState< TDateRange | Date | Date[] | null >( () => { - if ( selectionType === 'multiple' ) { - return []; - } else if ( selectionType === 'range' ) { - return { from: null, to: null }; + if ( ! selected ) { + return getDefaultSelectedValue( selectionType ); } - return null; + + // Type guards for different selection types + const isValidMultiple = + selectionType === 'multiple' && Array.isArray( selected ); + const isValidRange = + selectionType === 'range' && 'from' in selected && 'to' in selected; + const isValidSingle = + selectionType === 'single' && selected instanceof Date; + + // Return selected if valid, otherwise return default value + if ( isValidMultiple || isValidRange || isValidSingle ) { + return selected; + } + + return getDefaultSelectedValue( selectionType ); } ); const handleSelect = ( selectedDate: Date | Date[] | TDateRange | null ) => { @@ -192,13 +208,13 @@ const DatePicker = ( { if ( variant === 'presets' ) { return (
-
+
{ presets.map( ( preset, index ) => ( @@ -218,7 +234,7 @@ const DatePicker = ( { width="w-auto" numberOfMonths={ 2 } footer={ -
+