* chore: fix storybook build * chore: implement theming * community list not showing properly * refactor: migrate Chip component to @cio/ui/custom/chip - Updated imports for the Chip component across multiple files to use the new location in the @cio/ui package. - Replaced the previous Chip implementation with a new version that utilizes a Badge for better styling and functionality. - Adjusted related components to ensure consistent usage of the updated Chip component. * fix: align course sidebar design to match organization design (#611) * fix: align course sidebar design to match organization design * feat: add hideSearch prop to AppHeader and update sidebar layout --------- Co-authored-by: Rotimi Best <[email protected]> * refactor: replace PrimaryButton with Button component across multiple files - Updated various components to use the new Button component from @cio/ui/base/button instead of the deprecated PrimaryButton. - Ensured consistent button usage throughout the application for improved styling and functionality. - Removed the PrimaryButton component and its associated constants from the codebase. * refactor: standardize button and input usage across components - Replaced instances of deprecated components such as TextField, TextArea, and IconButton with their updated counterparts (InputField, TextareaField, and updated IconButton). - Ensured consistent event handling by changing `onClick` to `onclick` for better alignment with Svelte's event binding conventions. - Removed unused components and streamlined imports to enhance code maintainability and readability. * chore: themeing, course card, use $features * refactor: centralize UI components and update modal implementations - Refactored various components to centralize UI elements, improving discoverability and maintainability. - Replaced deprecated modal components with the new Dialog component for consistent modal behavior across the application. - Removed unused components and streamlined imports to enhance code clarity and reduce complexity. * feat: add new documentation and refactor org and lms UI components - Introduced new documentation files for Auth Flow, Breadcrumbs Refactoring, Page and Route Creation, and Route Page Setup to enhance developer onboarding and reference. - Refactored various UI components, including the Course Sidebar and Lesson Modal, to improve layout and functionality. - Removed deprecated components and streamlined imports for better maintainability. - Updated translations across multiple languages to ensure consistency in user experience. * refactor: update UI components and improve styling consistency - Refactored various components to enhance styling consistency, including updates to button and text color classes. - Removed deprecated components and streamlined imports for better maintainability. - Replaced instances of PageBody with a more flexible Page component structure across multiple routes. - Updated translations and UI elements to align with the new design system. - Deleted unused components to reduce code complexity and improve clarity. * update output.css --------- Co-authored-by: Abdulmuizz Hamzat <[email protected]>
62 lines
2.4 KiB
Svelte
62 lines
2.4 KiB
Svelte
<script lang="ts">
|
|
import { Tabs as TabsPrimitive } from 'bits-ui';
|
|
import { cn } from '../../tools';
|
|
import { receive, send, useUnderlineTabsTrigger } from './underline-tabs-utils.svelte';
|
|
import { box } from 'svelte-toolbelt';
|
|
|
|
let {
|
|
ref = $bindable(null),
|
|
value,
|
|
class: className,
|
|
onmouseenter,
|
|
onmouseleave,
|
|
onfocus,
|
|
onblur,
|
|
children,
|
|
...restProps
|
|
}: TabsPrimitive.TriggerProps = $props();
|
|
|
|
const state = useUnderlineTabsTrigger({
|
|
value: box.with(() => value),
|
|
onmouseenter: box.with(() => onmouseenter),
|
|
onmouseleave: box.with(() => onmouseleave),
|
|
onfocus: box.with(() => onfocus),
|
|
onblur: box.with(() => onblur)
|
|
});
|
|
</script>
|
|
|
|
<div class="ui:relative ui:h-full">
|
|
<TabsPrimitive.Trigger
|
|
bind:ref
|
|
data-slot="underline-tabs-trigger"
|
|
class={cn(
|
|
"dark:data-[state=active]:text-foreground data-[state=active]:text-foreground ui:text-foreground ui:z-10 ui:relative ui:inline-flex ui:h-[calc(100%-3px)] ui:flex-1 ui:items-center ui:justify-center ui:gap-1.5 ui:whitespace-nowrap ui:px-3 ui:py-1 ui:text-sm ui:transition-colors ui:focus:outline-none ui:disabled:pointer-events-none ui:disabled:opacity-50 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0",
|
|
state.rootState.isHovered &&
|
|
state.rootState.hoveredTab === value &&
|
|
'data-[state=inactive]:text-primary-foreground ui:text-primary',
|
|
className
|
|
)}
|
|
{...state.props}
|
|
{...restProps}
|
|
>
|
|
{@render children?.()}
|
|
</TabsPrimitive.Trigger>
|
|
{#if state.rootState.hoveredTab === value}
|
|
<div
|
|
class={cn(
|
|
'ui:bg-primary-foreground ui:z-1 ui:absolute ui:top-0 ui:h-[calc(100%-3px)] ui:w-full ui:rounded-md ui:opacity-0 ui:transition-opacity ui:duration-300 ui:pointer-events-none peer-focus-visible:ui:opacity-100',
|
|
state.rootState.isHovered && 'ui:opacity-100'
|
|
)}
|
|
in:receive={{ key: `${state.rootState.opts.id.current}-tab-hover`, duration: 300 }}
|
|
out:send={{ key: `${state.rootState.opts.id.current}-tab-hover`, duration: 300 }}
|
|
></div>
|
|
{/if}
|
|
{#if state.rootState.opts.value.current === value}
|
|
<div
|
|
class="ui:bg-primary ui:z-1 ui:absolute ui:-bottom-px ui:h-0.5 ui:w-full ui:pointer-events-none"
|
|
in:receive={{ key: `${state.rootState.opts.id.current}-tab-active-border`, duration: 200 }}
|
|
out:send={{ key: `${state.rootState.opts.id.current}-tab-active-border`, duration: 200 }}
|
|
></div>
|
|
{/if}
|
|
</div>
|