feat: certificates, landing pages, ai tutor, website update, compliance
This commit is contained in:
@@ -1,23 +1,54 @@
|
||||
<script lang="ts">
|
||||
import { DotField } from '../../custom/animation/dot-field';
|
||||
import { cn, type WithElementRef } from '../../tools';
|
||||
import type { HTMLAttributes } from 'svelte/elements';
|
||||
|
||||
let {
|
||||
ref = $bindable(null),
|
||||
class: className,
|
||||
children,
|
||||
...restProps
|
||||
}: WithElementRef<HTMLAttributes<HTMLDivElement>> = $props();
|
||||
type Props = WithElementRef<HTMLAttributes<HTMLDivElement>> & {
|
||||
/** Renders the marketing-style dot-field canvas behind content (pointer-events none). */
|
||||
animatedBackground?: boolean;
|
||||
};
|
||||
|
||||
let { ref = $bindable(null), class: className, children, animatedBackground = false, ...restProps }: Props = $props();
|
||||
|
||||
const innerClass =
|
||||
'ui:relative ui:z-10 ui:flex ui:min-w-0 ui:flex-1 ui:flex-col ui:items-center ui:justify-center ui:gap-6 ui:text-balance ui:p-6 ui:text-center ui:md:p-12';
|
||||
</script>
|
||||
|
||||
<div
|
||||
bind:this={ref}
|
||||
data-slot="empty"
|
||||
class={cn(
|
||||
'ui:flex ui:min-w-0 ui:flex-1 ui:flex-col ui:items-center ui:justify-center ui:gap-6 ui:text-balance ui:rounded-lg ui:border-dashed ui:p-6 ui:text-center ui:md:p-12',
|
||||
className
|
||||
)}
|
||||
{...restProps}
|
||||
>
|
||||
{@render children?.()}
|
||||
</div>
|
||||
{#if animatedBackground}
|
||||
<div
|
||||
bind:this={ref}
|
||||
data-slot="empty"
|
||||
class={cn(
|
||||
'ui:relative ui:overflow-hidden ui:flex ui:min-w-0 ui:flex-1 ui:flex-col ui:rounded-lg ui:border ui:border-dashed ui:border-border ui:text-balance',
|
||||
className
|
||||
)}
|
||||
{...restProps}
|
||||
>
|
||||
<DotField
|
||||
dotRadius={1.5}
|
||||
dotSpacing={14}
|
||||
cursorRadius={420}
|
||||
bulgeOnly={true}
|
||||
bulgeStrength={56}
|
||||
glowRadius={140}
|
||||
sparkle={false}
|
||||
waveAmplitude={0}
|
||||
class="ui:pointer-events-none ui:absolute ui:inset-0 ui:z-0 ui:h-full ui:w-full"
|
||||
/>
|
||||
<div class={innerClass}>
|
||||
{@render children?.()}
|
||||
</div>
|
||||
</div>
|
||||
{:else}
|
||||
<div
|
||||
bind:this={ref}
|
||||
data-slot="empty"
|
||||
class={cn(
|
||||
'ui:flex ui:min-w-0 ui:flex-1 ui:flex-col ui:items-center ui:justify-center ui:gap-6 ui:text-balance ui:rounded-lg ui:border-dashed ui:p-6 ui:text-center ui:md:p-12',
|
||||
className
|
||||
)}
|
||||
{...restProps}
|
||||
>
|
||||
{@render children?.()}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
'ui:group/field-label ui:peer/field-label ui:flex ui:w-fit ui:gap-2 ui:leading-snug ui:group-data-[disabled=true]/field:opacity-50',
|
||||
'ui:has-[>[data-slot=field]]:w-full ui:has-[>[data-slot=field]]:flex-col ui:has-[>[data-slot=field]]:rounded-md ui:has-[>[data-slot=field]]:border ui:*:data-[slot=field]:p-4',
|
||||
'ui:has-data-[state=checked]:bg-primary/5 ui:has-data-[state=checked]:border-primary ui:dark:has-data-[state=checked]:bg-primary/10',
|
||||
'ui:hover:bg-primary/5 ui:cursor-pointer ui:transition-colors ui:transition-duration-200',
|
||||
'ui:has-[>[data-slot=field]]:hover:bg-primary/5 ui:has-[>[data-slot=field]]:cursor-pointer ui:[&[for]]:cursor-pointer ui:transition-colors ui:transition-duration-200',
|
||||
className
|
||||
)}
|
||||
{...restProps}
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
<span class={badgeClass} aria-hidden="true">
|
||||
{#if locked}
|
||||
<LockIcon class="ui:size-3.5" />
|
||||
<LockIcon class="ui:size-3.5 custom" />
|
||||
{:else}
|
||||
{number}
|
||||
{/if}
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
data-slot="page-header"
|
||||
class={cn(
|
||||
'ui:flex ui:my-4 ui:py-2 ui:flex-col',
|
||||
isSticky && 'ui:sticky ui:top-14 ui:z-10 ui:bg-background',
|
||||
isSticky && 'ui:sticky ui:top-11 ui:z-10 ui:bg-background',
|
||||
className
|
||||
)}
|
||||
{...restProps}
|
||||
|
||||
Reference in New Issue
Block a user