@casinogate/ui 2.0.8 → 2.0.10

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.
Files changed (49) hide show
  1. package/dist/assets/css/root.css +304 -5
  2. package/dist/assets/css/tailwind/theme.css +24 -0
  3. package/dist/assets/css/tokens/primitives.css +14 -0
  4. package/dist/internal/utils/motion.d.ts +20 -0
  5. package/dist/internal/utils/motion.js +15 -0
  6. package/dist/primitives/app-shell/styles.js +4 -5
  7. package/dist/primitives/badge/styles.js +5 -4
  8. package/dist/primitives/breadcrumb/styles.js +1 -1
  9. package/dist/primitives/button/components/button.root.svelte +1 -1
  10. package/dist/primitives/button/styles.js +5 -3
  11. package/dist/primitives/calendar/styles.js +2 -2
  12. package/dist/primitives/checkbox/components/checkbox.root.svelte +19 -6
  13. package/dist/primitives/checkbox/styles.js +1 -1
  14. package/dist/primitives/chip/styles.js +1 -1
  15. package/dist/primitives/collapsible/components/collapsaible.content.svelte +2 -1
  16. package/dist/primitives/collapsible/styles.js +2 -2
  17. package/dist/primitives/combobox/styles.js +1 -1
  18. package/dist/primitives/command/styles.js +2 -2
  19. package/dist/primitives/date-picker/styles.js +4 -3
  20. package/dist/primitives/dialog/styles.js +2 -0
  21. package/dist/primitives/drawer/styles.js +2 -2
  22. package/dist/primitives/dropdown/styles.js +2 -1
  23. package/dist/primitives/field/styles.js +1 -1
  24. package/dist/primitives/file-upload/styles.js +2 -2
  25. package/dist/primitives/input/styles.js +1 -1
  26. package/dist/primitives/navigation/components/navigation.content.svelte +2 -1
  27. package/dist/primitives/navigation/components/navigation.item.svelte +3 -2
  28. package/dist/primitives/navigation/components/navigation.root.svelte +2 -1
  29. package/dist/primitives/navigation/components/navigation.sub-content.svelte +10 -5
  30. package/dist/primitives/navigation/components/navigation.sub-trigger.svelte +18 -22
  31. package/dist/primitives/navigation/components/navigation.sub.svelte +3 -2
  32. package/dist/primitives/navigation/components/navigation.trigger.svelte +9 -11
  33. package/dist/primitives/navigation/styles.js +31 -12
  34. package/dist/primitives/pagination/styles.js +2 -2
  35. package/dist/primitives/pill/styles.js +2 -2
  36. package/dist/primitives/popover/styles.js +1 -0
  37. package/dist/primitives/segment/styles.js +4 -4
  38. package/dist/primitives/select/components/select.item.svelte +1 -1
  39. package/dist/primitives/select/styles.js +10 -5
  40. package/dist/primitives/skeleton/components/skeleton.svelte +18 -12
  41. package/dist/primitives/skeleton/styles.d.ts +40 -31
  42. package/dist/primitives/skeleton/styles.js +122 -17
  43. package/dist/primitives/skeleton/types.d.ts +4 -5
  44. package/dist/primitives/slider/styles.js +2 -2
  45. package/dist/primitives/switch/styles.js +2 -2
  46. package/dist/primitives/textarea/styles.js +1 -1
  47. package/dist/primitives/toast/styles.js +2 -2
  48. package/package.json +1 -1
  49. package/dist/assets/css/theme.css +0 -337
@@ -1,10 +1,11 @@
1
1
  <script lang="ts">
2
2
  import { Icon } from '../../../atomic/icons/index.js';
3
3
  import { useId } from '../../../internal/utils/common.js';
4
+ import { motion } from '../../../internal/utils/motion.js';
4
5
  import { cn } from '../../../internal/utils/tailwindcss.js';
5
6
  import { Checkbox } from 'bits-ui';
6
- import { cubicInOut } from 'svelte/easing';
7
- import { fly } from 'svelte/transition';
7
+ import { prefersReducedMotion } from 'svelte/motion';
8
+ import { scale } from 'svelte/transition';
8
9
  import {
9
10
  checkboxCheckedIndicatorVariants,
10
11
  checkboxIndeterminateIndicatorVariants,
@@ -25,6 +26,18 @@
25
26
  rounded = 'xs',
26
27
  ...props
27
28
  }: CheckboxRootProps = $props();
29
+
30
+ const indicatorStart = $derived(prefersReducedMotion.current ? 1 : 0.85);
31
+ const indicatorIn = $derived({
32
+ start: indicatorStart,
33
+ duration: motion.duration.fast,
34
+ easing: motion.easeOut,
35
+ });
36
+ const indicatorOut = $derived({
37
+ start: indicatorStart,
38
+ duration: motion.duration.instant,
39
+ easing: motion.easeOut,
40
+ });
28
41
  </script>
29
42
 
30
43
  <Checkbox.Root
@@ -42,16 +55,16 @@
42
55
  <span
43
56
  data-slot="indeterminate-indicator"
44
57
  data-state="indeterminate"
45
- in:fly={{ duration: 250, y: 4, easing: cubicInOut }}
46
- out:fly={{ duration: 250, y: -4, easing: cubicInOut }}
58
+ in:scale={indicatorIn}
59
+ out:scale={indicatorOut}
47
60
  class={checkboxIndeterminateIndicatorVariants({ size, rounded })}
48
61
  ></span>
49
62
  {:else if childrenProps.checked}
50
63
  <span
51
64
  data-slot="checked-indicator"
52
65
  data-state="checked"
53
- in:fly={{ duration: 250, y: 4, easing: cubicInOut }}
54
- out:fly={{ duration: 250, y: -4, easing: cubicInOut }}
66
+ in:scale={indicatorIn}
67
+ out:scale={indicatorOut}
55
68
  class={checkboxCheckedIndicatorVariants({ size, rounded })}
56
69
  >
57
70
  <Icon.Check />
@@ -5,7 +5,7 @@ export const checkboxRootVariants = tv({
5
5
  'cgui:flex cgui:items-center cgui:justify-center',
6
6
  'cgui:border cgui:border-surface-regular cgui:outline-none',
7
7
  'cgui:cursor-pointer cgui:select-none',
8
- 'cgui:transition-all cgui:duration-250 cgui:ease-in-out',
8
+ 'cgui:transition-[background-color,border-color,transform] cgui:duration-(--cg-ui-duration-fast) cgui:ease-out',
9
9
  'cgui:active:scale-95',
10
10
  'cgui:disabled:opacity-50 cgui:disabled:cursor-not-allowed',
11
11
  'cgui:data-[state=indeterminate]:border-surface-primary',
@@ -7,7 +7,7 @@ export const chipGroupVariants = tv({
7
7
  export const chipVariants = tv({
8
8
  base: [
9
9
  'cgui:inline-flex cgui:items-center cgui:justify-center cgui:gap-1 cgui:text-center cgui:overflow-hidden cgui:shrink-0 cgui:w-fit cgui:whitespace-nowrap',
10
- 'cgui:transition-all cgui:duration-250 cgui:ease-in-out',
10
+ 'cgui:transition-[color,background-color,border-color] cgui:duration-(--cg-ui-duration-base) cgui:ease-out',
11
11
  'cgui:select-none cgui:font-normal cgui:text-caption-2',
12
12
  'cgui:cursor-pointer cgui:outline-none',
13
13
  'cgui:focus-visible:ring-2 cgui:focus-visible:ring-stroke-primary cgui:focus-visible:ring-offset-2',
@@ -3,6 +3,7 @@
3
3
  import { cn } from '../../../internal/utils/tailwindcss.js';
4
4
 
5
5
  import { Collapsible as CollapsiblePrimitive } from 'bits-ui';
6
+ import { motion } from '../../../internal/utils/motion.js';
6
7
  import { fade } from 'svelte/transition';
7
8
  import { collapsibleContentVariants } from '../styles.js';
8
9
  import type { CollapsibleContentProps } from '../types.js';
@@ -31,7 +32,7 @@
31
32
  {#if childSnippet}
32
33
  {@render childSnippet?.(childProps)}
33
34
  {:else if childProps.open}
34
- <div {...childProps.props} transition:fade={{ duration: 250 }}>
35
+ <div {...childProps.props} transition:fade={{ duration: motion.duration.base, easing: motion.easeOut }}>
35
36
  {@render children?.()}
36
37
  </div>
37
38
  {/if}
@@ -5,7 +5,7 @@ export const collapsibleRootVariants = tv({
5
5
  base: [
6
6
  'cgui:relative cgui:overflow-hidden',
7
7
  'cgui:w-full',
8
- 'cgui:transition-all cgui:duration-250 cgui:ease-in-out',
8
+ 'cgui:transition-[color,background-color,border-color] cgui:duration-(--cg-ui-duration-base) cgui:ease-out',
9
9
  'cgui:data-[disabled]:opacity-50 cgui:data-[disabled]:cursor-not-allowed cgui:data-[disabled]:pointer-events-none',
10
10
  ],
11
11
  variants: {
@@ -39,7 +39,7 @@ export const collapsibleTriggerVariants = tv({
39
39
  export const collapsibleIconVariants = tv({
40
40
  base: [
41
41
  'cgui:relative cgui:inline-flex cgui:ml-auto cgui:size-6 cgui:items-center cgui:justify-center cgui:shrink-0',
42
- 'cgui:transition-all cgui:duration-250 cgui:ease-in-out',
42
+ 'cgui:transition-transform cgui:duration-(--cg-ui-duration-fast) cgui:ease-out',
43
43
  'cgui:[&>svg]:size-5',
44
44
  ],
45
45
  variants: {
@@ -4,7 +4,7 @@ export const comboboxTriggerVariants = tv({
4
4
  'cgui:group/combobox-trigger ',
5
5
  'cgui:relative cgui:flex cgui:items-center cgui:gap-1 cgui:flex-wrap',
6
6
  'cgui:text-body cgui:outline-none cgui:bg-clip-padding',
7
- 'cgui:transition-all cgui:duration-250 cgui:ease-in-out',
7
+ 'cgui:transition-[color,background-color,border-color,box-shadow,transform] cgui:duration-(--cg-ui-duration-base) cgui:ease-out',
8
8
  'cgui:[&_svg]:shrink-0 cgui:[&_svg]:pointer-events-none cgui:[&_svg]:text-icon-regular cgui:[&_svg:not([class*="size-"])]:size-4',
9
9
  'cgui:has-[data-slot=chevron]:pr-3',
10
10
  'cgui:data-[state=open]:ring-stroke-primary/50 cgui:data-[state=open]:ring-1',
@@ -37,7 +37,7 @@ export const commandInputVariants = tv({
37
37
  'cgui:placeholder:text-fg-regular/70',
38
38
  'cgui:focus-visible:ring-0 cgui:focus-visible:ring-offset-0',
39
39
  'cgui:disabled:opacity-50 cgui:disabled:cursor-not-allowed',
40
- 'cgui:transition-all cgui:duration-250 cgui:ease-in-out',
40
+ 'cgui:transition-colors cgui:duration-(--cg-ui-duration-base) cgui:ease-out',
41
41
  ],
42
42
  });
43
43
  export const commandListVariants = tv({
@@ -58,7 +58,7 @@ export const commandItemVariants = tv({
58
58
  'cgui:aria-selected:bg-surface-lightest cgui:aria-selected:text-fg-primary',
59
59
  'cgui:data-selected:text-fg-primary',
60
60
  'cgui:cursor-default cgui:text-body cgui:select-none cgui:outline-hidden cgui:rounded-xs',
61
- 'cgui:transition-all cgui:duration-250 cgui:ease-in-out',
61
+ 'cgui:transition-[color,background-color,border-color] cgui:duration-(--cg-ui-duration-base) cgui:ease-out',
62
62
  'cgui:[&_svg:not([class*="text-"])]:text-muted-foreground cgui:relative',
63
63
  'cgui:[&_kbd]:ml-auto',
64
64
  'cgui:data-[disabled]:pointer-events-none cgui:data-[disabled]:opacity-50 cgui:[&_svg]:pointer-events-none cgui:[&_svg]:shrink-0 cgui:[&_svg:not([class*="size-"])]:size-4',
@@ -6,7 +6,7 @@ export const datePickerTriggerVariants = tv({
6
6
  'cgui:group/date-picker-trigger',
7
7
  'cgui:relative cgui:inline-flex cgui:items-center cgui:gap-1',
8
8
  'cgui:text-body cgui:outline-none',
9
- 'cgui:transition-all cgui:duration-250 cgui:ease-in-out',
9
+ 'cgui:transition-[color,background-color,border-color,box-shadow,transform] cgui:duration-(--cg-ui-duration-base) cgui:ease-out',
10
10
  'cgui:[&_svg]:shrink-0 cgui:[&_svg]:pointer-events-none cgui:[&_svg]:text-icon-regular cgui:[&_svg:not([class*="size-"])]:size-4',
11
11
  'cgui:has-[data-slot=chevron]:pr-3',
12
12
  'cgui:data-[state=open]:ring-stroke-primary/50 cgui:data-[state=open]:ring-1',
@@ -71,6 +71,7 @@ export const datePickerContentVariants = tv({
71
71
  'cgui:origin-(--bits-popover-content-transform-origin) cgui:outline-hidden',
72
72
  'cgui:data-[state=open]:animate-in cgui:data-[state=closed]:animate-out cgui:data-[state=closed]:fade-out-0 cgui:data-[state=open]:fade-in-0 cgui:data-[state=closed]:zoom-out-95 cgui:data-[state=open]:zoom-in-95',
73
73
  'cgui:data-[side=bottom]:slide-in-from-top-2 cgui:data-[side=left]:slide-in-from-end-2 cgui:data-[side=right]:slide-in-from-start-2 cgui:data-[side=top]:slide-in-from-bottom-2',
74
+ 'cgui:transition-[opacity,transform] cgui:duration-(--cg-ui-duration-fast) cgui:ease-out',
74
75
  ],
75
76
  variants: {
76
77
  rounded: {
@@ -93,7 +94,7 @@ export const datePickerInputVariants = tv({
93
94
  'cgui:group/date-picker-input',
94
95
  'cgui:relative cgui:inline-flex cgui:items-center cgui:gap-0.5 cgui:w-full',
95
96
  'cgui:text-body',
96
- 'cgui:transition-all cgui:duration-250 cgui:ease-in-out',
97
+ 'cgui:transition-[color,background-color,border-color,box-shadow] cgui:duration-(--cg-ui-duration-base) cgui:ease-out',
97
98
  'cgui:data-invalid:border-stroke-error cgui:data-invalid:ring-stroke-error',
98
99
  'cgui:data-disabled:opacity-50 cgui:data-disabled:cursor-not-allowed',
99
100
  ],
@@ -135,7 +136,7 @@ export const datePickerSegmentVariants = tv({
135
136
  'cgui:inline-flex cgui:items-center cgui:justify-center',
136
137
  'cgui:rounded-xs cgui:px-0.5',
137
138
  'cgui:outline-none',
138
- 'cgui:transition-colors cgui:duration-150 cgui:ease-in-out',
139
+ 'cgui:transition-colors cgui:duration-(--cg-ui-duration-fast) cgui:ease-out',
139
140
  'cgui:focus:bg-surface-primary cgui:focus:text-fg-white',
140
141
  'cgui:data-invalid:text-fg-error',
141
142
  'cgui:data-disabled:text-fg-semilight/40 cgui:data-disabled:pointer-events-none',
@@ -19,6 +19,7 @@ export const dialogOverlayStyles = tv({
19
19
  'cgui:size-full',
20
20
  'cgui:bg-neutral-100/50',
21
21
  'cgui:data-[state=open]:animate-in cgui:data-[state=closed]:animate-out cgui:data-[state=closed]:fade-out-0 cgui:data-[state=open]:fade-in-0',
22
+ 'cgui:transition-opacity cgui:duration-(--cg-ui-duration-base) cgui:ease-out',
22
23
  ],
23
24
  });
24
25
  export const dialogContentStyles = tv({
@@ -26,6 +27,7 @@ export const dialogContentStyles = tv({
26
27
  'cgui:relative cgui:z-(--cg-ui-z-index-dialog) cgui:outline-none cgui:overflow-hidden',
27
28
  'cgui:data-[state=open]:animate-in cgui:data-[state=open]:fade-in-0 cgui:data-[state=open]:slide-in-from-bottom-20',
28
29
  'cgui:data-[state=closed]:animate-out cgui:data-[state=closed]:fade-out-0 cgui:data-[state=closed]:slide-out-to-bottom-20',
30
+ 'cgui:transition-[opacity,transform] cgui:duration-(--cg-ui-duration-base) cgui:ease-out',
29
31
  ],
30
32
  variants: {
31
33
  variant: {
@@ -1,10 +1,10 @@
1
- import { buttonVariants } from '../button/styles.js';
2
1
  import { tv } from '../../internal/utils/tailwindcss.js';
2
+ import { buttonVariants } from '../button/styles.js';
3
3
  export const drawerOverlayStyles = tv({
4
4
  base: [
5
5
  'cgui:fixed cgui:inset-0 cgui:z-(--cg-ui-z-index-dialog)',
6
6
  'cgui:bg-neutral-100/50',
7
- 'cgui:transition-all cgui:duration-250 cgui:ease-in-out',
7
+ 'cgui:transition-opacity cgui:duration-(--cg-ui-duration-base) cgui:ease-out',
8
8
  'cgui:data-[state=open]:animate-in cgui:data-[state=closed]:animate-out',
9
9
  'cgui:data-[state=open]:fade-in-0 cgui:data-[state=closed]:fade-out-0',
10
10
  ],
@@ -16,6 +16,7 @@ export const dropdownContentStyles = tv({
16
16
  'cgui:data-[state=open]:animate-in cgui:data-[state=open]:fade-in-0 cgui:data-[state=open]:zoom-in-95',
17
17
  'cgui:data-[state=closed]:animate-out cgui:data-[state=closed]:fade-out-0 cgui:data-[state=closed]:zoom-out-95',
18
18
  'cgui:data-[side=bottom]:slide-in-from-top-2 cgui:data-[side=left]:slide-in-from-end-2 cgui:data-[side=right]:slide-in-from-start-2 cgui:data-[side=top]:slide-in-from-bottom-2',
19
+ 'cgui:transition-[opacity,transform] cgui:duration-(--cg-ui-duration-fast) cgui:ease-out',
19
20
  ],
20
21
  variants: {
21
22
  variant: {
@@ -57,7 +58,7 @@ export const dropdownItemStyles = tv({
57
58
  'cgui:text-body cgui:text-fg-dark cgui:font-normal cgui:select-none',
58
59
  'cgui:overflow-hidden cgui:whitespace-nowrap cgui:outline-none',
59
60
  'cgui:[&_svg]:shrink-0 cgui:[&_svg]:pointer-events-none cgui:[&_svg]:text-icon-regular cgui:[&_svg:not([class*="size-"])]:size-4.5',
60
- 'cgui:transition-[background-color,color,ring,outline,border-color] cgui:duration-250 cgui:ease-in-out',
61
+ 'cgui:transition-[color,background-color,border-color,box-shadow] cgui:duration-(--cg-ui-duration-base) cgui:ease-out',
61
62
  'cgui:data-highlighted:bg-surface-lightest',
62
63
  'cgui:data-[disabled]:cursor-not-allowed cgui:data-[disabled]:pointer-events-none cgui:data-[disabled]:opacity-50',
63
64
  ],
@@ -14,7 +14,7 @@ export const fieldErrorVariants = tv({
14
14
  base: [
15
15
  'cgui:text-caption cgui:text-fg-error',
16
16
  'cgui:min-h-[1lh]',
17
- 'cgui:invisible cgui:opacity-0 cgui:transition-opacity cgui:duration-200',
17
+ 'cgui:invisible cgui:opacity-0 cgui:transition-opacity cgui:duration-(--cg-ui-duration-base) cgui:ease-out',
18
18
  'cgui:data-[invalid]:visible cgui:data-[invalid]:opacity-100',
19
19
  ],
20
20
  });
@@ -12,7 +12,7 @@ export const fileUploadDropzoneVariants = tv({
12
12
  'cgui:flex cgui:flex-col cgui:items-center cgui:justify-center cgui:gap-2 cgui:p-4',
13
13
  'cgui:rounded-md cgui:border cgui:border-dashed cgui:border-stroke-default',
14
14
  'cgui:cursor-pointer',
15
- 'cgui:transition-colors cgui:duration-200',
15
+ 'cgui:transition-colors cgui:duration-(--cg-ui-duration-base) cgui:ease-out',
16
16
  ],
17
17
  variants: {
18
18
  dragging: {
@@ -60,7 +60,7 @@ export const fileUploadItemDeleteTriggerVariants = tv({
60
60
  'cgui:shrink-0 cgui:size-6 cgui:flex cgui:items-center cgui:justify-center',
61
61
  'cgui:rounded-xs cgui:cursor-pointer',
62
62
  'cgui:text-fg-regular cgui:hover:text-fg-darkest',
63
- 'cgui:transition-colors cgui:duration-200',
63
+ 'cgui:transition-colors cgui:duration-(--cg-ui-duration-base) cgui:ease-out',
64
64
  'cgui:[&>svg]:size-4 cgui:text-icon-regular',
65
65
  ],
66
66
  });
@@ -12,7 +12,7 @@ export const inputStyles = tv({
12
12
  export const inputVariants = tv({
13
13
  base: [
14
14
  'cgui:outline-none cgui:py-0',
15
- 'cgui:transition-all cgui:duration-250 cgui:ease-in-out',
15
+ 'cgui:transition-[color,background-color,border-color,box-shadow] cgui:duration-(--cg-ui-duration-base) cgui:ease-out',
16
16
  'cgui:text-body',
17
17
  'cgui:disabled:opacity-50 cgui:disabled:cursor-not-allowed',
18
18
  ],
@@ -1,5 +1,6 @@
1
1
  <script lang="ts">
2
- import { cn, useId } from '../../../internal/utils/common.js';
2
+ import { useId } from '../../../internal/utils/common.js';
3
+ import { cn } from '../../../internal/utils/tailwindcss.js';
3
4
  import { boxWith, mergeProps } from 'svelte-toolbelt';
4
5
  import { navigationContentStyles } from '../styles.js';
5
6
  import type { NavigationContentProps } from '../types.js';
@@ -1,7 +1,8 @@
1
1
  <script lang="ts">
2
- import { Dropdown as DropdownPrimitive } from '../../dropdown/index.js';
3
- import { cn, useId } from '../../../internal/utils/common.js';
2
+ import { useId } from '../../../internal/utils/common.js';
3
+ import { cn } from '../../../internal/utils/tailwindcss.js';
4
4
  import { boxWith, mergeProps } from 'svelte-toolbelt';
5
+ import { Dropdown as DropdownPrimitive } from '../../dropdown/index.js';
5
6
  import { navigationItemStyles } from '../styles.js';
6
7
  import type { NavigationItemProps } from '../types.js';
7
8
  import { NavigationItemState, NavigationSubStateCtx } from './navigation.svelte.js';
@@ -4,7 +4,8 @@
4
4
 
5
5
  import { NavigationRootState } from './navigation.svelte.js';
6
6
 
7
- import { cn, useId } from '../../../internal/utils/common.js';
7
+ import { useId } from '../../../internal/utils/common.js';
8
+ import { cn } from '../../../internal/utils/tailwindcss.js';
8
9
  import { boxWith, mergeProps } from 'svelte-toolbelt';
9
10
 
10
11
  const uid = $props.id();
@@ -1,10 +1,11 @@
1
1
  <script lang="ts">
2
- import { Collapsible as CollapsiblePrimitive } from '../../collapsible/index.js';
3
- import { Dropdown as DropdownPrimitive } from '../../dropdown/index.js';
4
- import { cn, useId } from '../../../internal/utils/common.js';
2
+ import { useId } from '../../../internal/utils/common.js';
3
+ import { motion } from '../../../internal/utils/motion.js';
4
+ import { cn } from '../../../internal/utils/tailwindcss.js';
5
5
  import { boxWith, mergeProps } from 'svelte-toolbelt';
6
- import { cubicInOut } from 'svelte/easing';
7
6
  import { fade } from 'svelte/transition';
7
+ import { Collapsible as CollapsiblePrimitive } from '../../collapsible/index.js';
8
+ import { Dropdown as DropdownPrimitive } from '../../dropdown/index.js';
8
9
  import { navigationDropdownContentStyles, navigationSubContentStyles } from '../styles.js';
9
10
  import type { NavigationSubContentProps } from '../types.js';
10
11
  import { NavigationSubContentState } from './navigation.svelte.js';
@@ -62,7 +63,11 @@
62
63
  <CollapsiblePrimitive.Content>
63
64
  {#snippet child({ props: collapsibleProps, open })}
64
65
  {#if open}
65
- <ol {...collapsibleProps} {...mergedProps} transition:fade={{ duration: 250, easing: cubicInOut }}>
66
+ <ol
67
+ {...collapsibleProps}
68
+ {...mergedProps}
69
+ transition:fade={{ duration: motion.duration.base, easing: motion.easeOut }}
70
+ >
66
71
  {@render children?.({ compact: subContentState.root.isCompact })}
67
72
  </ol>
68
73
  {/if}
@@ -1,11 +1,12 @@
1
1
  <script lang="ts">
2
- import { Collapsible as CollapsiblePrimitive } from '../../collapsible/index.js';
3
- import { Dropdown as DropdownPrimitive } from '../../dropdown/index.js';
4
2
  import ChevronDown from '../../../atomic/icons/chevron-down.svelte';
5
- import { cn, useId } from '../../../internal/utils/common.js';
3
+ import { useId } from '../../../internal/utils/common.js';
4
+ import { motion } from '../../../internal/utils/motion.js';
5
+ import { cn } from '../../../internal/utils/tailwindcss.js';
6
6
  import { boxWith, mergeProps } from 'svelte-toolbelt';
7
- import { cubicInOut } from 'svelte/easing';
8
- import { slide } from 'svelte/transition';
7
+ import { fade } from 'svelte/transition';
8
+ import { Collapsible as CollapsiblePrimitive } from '../../collapsible/index.js';
9
+ import { Dropdown as DropdownPrimitive } from '../../dropdown/index.js';
9
10
  import { navigationSubTriggerStyles } from '../styles.js';
10
11
  import type { NavigationSubTriggerProps } from '../types.js';
11
12
  import { NavigationSubTriggerState } from './navigation.svelte.js';
@@ -48,10 +49,7 @@
48
49
 
49
50
  {#snippet content()}
50
51
  {#if icon}
51
- <span
52
- data-slot="icon"
53
- class={cn('cgui:inline-flex cgui:items-center cgui:justify-center cgui:shrink-0 cgui:empty:hidden')}
54
- >
52
+ <span data-slot="nav-trigger-icon">
55
53
  {@render icon?.()}
56
54
  </span>
57
55
  {/if}
@@ -60,30 +58,28 @@
60
58
  {#if typeof label === 'string'}
61
59
  {#if !subTriggerState.root.isCompact}
62
60
  <span
63
- data-slot="label"
64
- class="cgui:min-w-0 cgui:text-left cgui:whitespace-nowrap cgui:overflow-hidden cgui:flex-1"
65
- transition:slide={{ axis: 'x', duration: 250, easing: cubicInOut }}
61
+ data-slot="nav-trigger-label"
62
+ in:fade={{ delay: 120, duration: motion.duration.slow, easing: motion.easeOut }}
63
+ out:fade={{ duration: motion.duration.instant, easing: motion.easeOut }}
66
64
  >
67
- <span class="cgui:inline-block" transition:slide={{ axis: 'x', duration: 150, easing: cubicInOut }}>
65
+ <span>
68
66
  {label}
69
67
  </span>
70
68
  </span>
71
69
  {/if}
72
70
  {:else}
73
- {@render label?.({ props: { 'data-slot': 'label' } })}
71
+ {@render label?.({ props: { 'data-slot': 'nav-trigger-label' } })}
74
72
  {/if}
75
73
  {/if}
76
74
  {/snippet}
77
75
 
76
+ <!-- class={cn(
77
+ 'cgui:flex cgui:items-center cgui:justify-center cgui:shrink-0',
78
+ 'cgui:transition-transform cgui:duration-(--cg-ui-duration-base) cgui:ease-in-out'
79
+ )} -->
78
80
  {#snippet chevron()}
79
- <span
80
- data-slot="chevron"
81
- class={cn(
82
- 'cgui:flex cgui:items-center cgui:justify-center cgui:shrink-0',
83
- 'cgui:transition-transform cgui:duration-250 cgui:ease-in-out'
84
- )}
85
- >
86
- <ChevronDown width={24} height={24} />
81
+ <span data-slot="nav-trigger-chevron">
82
+ <ChevronDown />
87
83
  </span>
88
84
  {/snippet}
89
85
 
@@ -1,8 +1,9 @@
1
1
  <script lang="ts">
2
+ import { useId } from '../../../internal/utils/common.js';
3
+ import { cn } from '../../../internal/utils/tailwindcss.js';
4
+ import { boxWith, mergeProps } from 'svelte-toolbelt';
2
5
  import { Collapsible as CollapsiblePrimitive } from '../../collapsible/index.js';
3
6
  import { Dropdown as DropdownPrimitive } from '../../dropdown/index.js';
4
- import { cn, useId } from '../../../internal/utils/common.js';
5
- import { boxWith, mergeProps } from 'svelte-toolbelt';
6
7
  import { navigationSubStyles } from '../styles.js';
7
8
  import type { NavigationSubProps } from '../types.js';
8
9
  import { NavigationSubState } from './navigation.svelte.js';
@@ -1,8 +1,9 @@
1
1
  <script lang="ts">
2
- import { cn, useId } from '../../../internal/utils/common.js';
2
+ import { useId } from '../../../internal/utils/common.js';
3
+ import { motion } from '../../../internal/utils/motion.js';
4
+ import { cn } from '../../../internal/utils/tailwindcss.js';
3
5
  import { boxWith, mergeProps } from 'svelte-toolbelt';
4
- import { cubicInOut } from 'svelte/easing';
5
- import { slide } from 'svelte/transition';
6
+ import { fade } from 'svelte/transition';
6
7
  import { navigationTriggerStyles } from '../styles.js';
7
8
  import type { NavigationTriggerProps } from '../types.js';
8
9
  import { NavigationSubStateCtx, NavigationTriggerState } from './navigation.svelte.js';
@@ -48,10 +49,7 @@
48
49
 
49
50
  {#snippet content()}
50
51
  {#if icon}
51
- <span
52
- data-slot="icon"
53
- class={cn('cgui:inline-flex cgui:items-center cgui:justify-center cgui:shrink-0 cgui:empty:hidden')}
54
- >
52
+ <span data-slot="nav-trigger-icon">
55
53
  {@render icon?.()}
56
54
  </span>
57
55
  {/if}
@@ -60,11 +58,11 @@
60
58
  {#if typeof label === 'string'}
61
59
  {#if shouldShowLabel}
62
60
  <span
63
- data-slot="label"
64
- class="cgui:min-w-0 cgui:text-left cgui:whitespace-nowrap cgui:overflow-hidden cgui:flex-1"
65
- transition:slide={{ axis: 'x', duration: 250, easing: cubicInOut }}
61
+ data-slot="nav-trigger-label"
62
+ in:fade={{ delay: 120, duration: motion.duration.slow, easing: motion.easeOut }}
63
+ out:fade={{ duration: motion.duration.instant, easing: motion.easeOut }}
66
64
  >
67
- <span class="cgui:inline-block" transition:slide={{ axis: 'x', duration: 150, easing: cubicInOut }}>
65
+ <span>
68
66
  {label}
69
67
  </span>
70
68
  </span>
@@ -3,7 +3,7 @@ export const navigationRootStyles = tv({
3
3
  base: [
4
4
  'cgui:group/navigation',
5
5
  'cgui:data-[compact=true]:w-fit cgui:min-w-px cgui:w-full',
6
- 'cgui:transition-all cgui:duration-250 cgui:ease-in-out',
6
+ 'cgui:transition-[width] cgui:duration-(--cg-ui-duration-slow) cgui:ease-out',
7
7
  ],
8
8
  variants: {
9
9
  compact: {
@@ -15,20 +15,33 @@ export const navigationContentStyles = tv({
15
15
  base: [''],
16
16
  });
17
17
  export const navigationItemStyles = tv({
18
- base: ['cgui:data-highlighted:bg-transparent'],
18
+ base: [
19
+ 'cgui:data-highlighted:bg-transparent',
20
+ 'cgui:transition-[background-color,color] cgui:duration-(--cg-ui-duration-base) cgui:ease-hover',
21
+ ],
19
22
  });
20
23
  export const navigationTriggerStyles = tv({
21
24
  base: [
22
- 'cgui:flex cgui:items-center cgui:gap-2',
23
- 'cgui:overflow-hidden cgui:truncate cgui:rounded-xs',
24
- 'cgui:w-full cgui:px-3 cgui:py-4',
25
- 'cgui:group-data-[compact=true]/navigation:py-3 cgui:group-data-[compact=true]/navigation:justify-center',
26
- 'cgui:text-fg-semilight cgui:text-body',
27
- 'cgui:cursor-pointer cgui:transition-all cgui:duration-250 cgui:ease-in-out',
25
+ 'cgui:grid cgui:grid-cols-[1.5rem_minmax(0,1fr)]',
26
+ 'cgui:items-center cgui:gap-2 cgui:justify-center',
27
+ 'cgui:w-full cgui:px-3 cgui:py-4 cgui:rounded-sm',
28
+ 'cgui:[&_[data-slot="nav-trigger-icon"]]:me-auto cgui:[&_[data-slot="nav-trigger-icon"]]:pointer-events-none',
29
+ 'cgui:[&_[data-slot="nav-trigger-icon"]_svg:not([class*="size-"])]:size-6',
30
+ 'cgui:data-[active]:bg-surface-dark cgui:data-[active]:text-fg-white',
31
+ 'cgui:text-fg-semilight cgui:text-body cgui:hover:text-fg-white',
28
32
  'cgui:data-[disabled]:cursor-not-allowed cgui:data-[disabled]:opacity-50',
29
- 'cgui:[&_svg]:size-6 cgui:[&_[data-slot="icon"]]:me-auto',
30
- 'cgui:hover:text-fg-white',
31
- 'cgui:data-[active]:bg-surface-dark cgui:data-[active]:text-fg-white ',
33
+ 'cgui:cursor-pointer',
34
+ 'cgui:group-data-[compact=true]/navigation:grid-cols-[1.5rem_minmax(0,0fr)]',
35
+ 'cgui:group-data-[compact=true]/navigation:gap-0',
36
+ 'cgui:group-data-[compact=true]/navigation:py-3',
37
+ 'cgui:[&_[data-slot="nav-trigger-icon"]]:shrink-0',
38
+ 'cgui:[&_[data-slot="nav-trigger-label"]]:min-w-0 cgui:[&_[data-slot="nav-trigger-label"]]:overflow-hidden cgui:[&_[data-slot="nav-trigger-label"]]:whitespace-nowrap cgui:[&_[data-slot="nav-trigger-label"]]:text-left',
39
+ 'cgui:[&_[data-slot="nav-trigger-label"]>*]:min-w-0',
40
+ 'cgui:[&_[data-slot="nav-trigger-label"]>*]:overflow-hidden',
41
+ 'cgui:[&_[data-slot="nav-trigger-label"]>*]:whitespace-nowrap',
42
+ 'cgui:[transition:grid-template-columns_var(--cg-ui-duration-slow)_var(--ease-out),padding_var(--cg-ui-duration-slow)_var(--ease-out),gap_var(--cg-ui-duration-slow)_var(--ease-out),border-radius_var(--cg-ui-duration-slow)_var(--ease-out),background-color_var(--cg-ui-duration-base)_var(--ease-hover),color_var(--cg-ui-duration-base)_var(--ease-hover),transform_var(--cg-ui-duration-instant)_var(--ease-out)]',
43
+ 'cgui:data-[state=closed]:delay-[120ms] cgui:data-[state=open]:delay-0',
44
+ 'cgui:not-data-[disabled]:active:scale-[0.98]',
32
45
  ],
33
46
  });
34
47
  export const navigationSubStyles = tv({
@@ -36,7 +49,13 @@ export const navigationSubStyles = tv({
36
49
  });
37
50
  export const navigationSubTriggerStyles = tv({
38
51
  extend: navigationTriggerStyles,
39
- base: ['cgui:group-data-[compact=false]/navigation:data-[state=open]:[&_[data-slot="chevron"]]:rotate-180'],
52
+ base: [
53
+ 'cgui:grid-cols-[1.5rem_minmax(0,1fr)_auto]',
54
+ 'cgui:[&_[data-slot="nav-trigger-chevron"]]:inline-grid cgui:[&_[data-slot="nav-trigger-chevron"]]:place-items-center',
55
+ 'cgui:[&_[data-slot="nav-trigger-chevron"]]:shrink-0',
56
+ 'cgui:[&_[data-slot="nav-trigger-chevron"]_svg]:size-5',
57
+ 'cgui:group-data-[compact=false]/navigation:data-[state=open]:[&_[data-slot="nav-trigger-chevron"]]:rotate-180',
58
+ ],
40
59
  });
41
60
  export const navigationSubContentStyles = tv({
42
61
  base: [
@@ -21,7 +21,7 @@ export const paginationItemStyles = tv({
21
21
  'cgui:flex cgui:items-center cgui:justify-center',
22
22
  'cgui:text-fg-dark cgui:text-body-2 cgui:font-normal',
23
23
  'cgui:border cgui:border-transparent',
24
- 'cgui:transition-all cgui:duration-250 cgui:ease-in-out',
24
+ 'cgui:transition-[color,background-color,border-color] cgui:duration-(--cg-ui-duration-base) cgui:ease-out',
25
25
  'cgui:cursor-pointer cgui:select-none cgui:rounded-full',
26
26
  'cgui:data-[selected=""]:text-fg-primary cgui:data-[selected=""]:border-stroke-primary',
27
27
  'cgui:disabled:opacity-50 cgui:disabled:cursor-not-allowed cgui:disabled:pointer-events-none',
@@ -38,7 +38,7 @@ export const paginationButtonStyles = tv({
38
38
  base: [
39
39
  'cgui:flex cgui:items-center cgui:justify-center cgui:shrink-0 cgui:size-6 cgui:text-icon-regular',
40
40
  'cgui:select-none cgui:cursor-pointer',
41
- 'cgui:transition-all cgui:duration-250 cgui:ease-in-out',
41
+ 'cgui:transition-colors cgui:duration-(--cg-ui-duration-base) cgui:ease-out',
42
42
  'cgui:disabled:opacity-50 cgui:disabled:cursor-not-allowed cgui:disabled:pointer-events-none',
43
43
  ],
44
44
  });
@@ -7,7 +7,7 @@ export const pillGroupVariants = tv({
7
7
  export const pillItemVariants = tv({
8
8
  base: [
9
9
  'cgui:inline-flex cgui:items-center cgui:justify-center cgui:gap-1 cgui:text-center cgui:overflow-hidden cgui:shrink-0 cgui:w-fit cgui:whitespace-nowrap cgui:max-w-full',
10
- 'cgui:transition-all cgui:duration-250 cgui:ease-in-out',
10
+ 'cgui:transition-[color,background-color,border-color] cgui:duration-(--cg-ui-duration-base) cgui:ease-out',
11
11
  'cgui:select-none cgui:font-normal cgui:text-caption-2',
12
12
  'cgui:[&>svg]:pointer-events-none',
13
13
  ],
@@ -165,7 +165,7 @@ export const pillRemoveVariants = tv({
165
165
  base: [
166
166
  'cgui:inline-flex cgui:items-center cgui:justify-center cgui:shrink-0',
167
167
  'cgui:rounded-full cgui:cursor-pointer cgui:outline-none',
168
- 'cgui:transition-colors cgui:duration-150 cgui:ease-in-out',
168
+ 'cgui:transition-colors cgui:duration-(--cg-ui-duration-fast) cgui:ease-out',
169
169
  'cgui:bg-transparent cgui:text-inherit',
170
170
  'cgui:disabled:opacity-50 cgui:disabled:cursor-not-allowed cgui:disabled:hover:bg-transparent',
171
171
  'cgui:[&>svg]:pointer-events-none cgui:[&>svg:not([class*="size"])]:size-[80%]',
@@ -8,6 +8,7 @@ export const popoverContentVariants = tv({
8
8
  'cgui:origin-(--bits-popover-content-transform-origin) cgui:outline-hidden',
9
9
  'cgui:data-[state=open]:animate-in cgui:data-[state=closed]:animate-out cgui:data-[state=closed]:fade-out-0 cgui:data-[state=open]:fade-in-0 cgui:data-[state=closed]:zoom-out-95 cgui:data-[state=open]:zoom-in-95',
10
10
  'cgui:data-[side=bottom]:slide-in-from-top-2 cgui:data-[side=left]:slide-in-from-end-2 cgui:data-[side=right]:slide-in-from-start-2 cgui:data-[side=top]:slide-in-from-bottom-2',
11
+ 'cgui:transition-[opacity,transform] cgui:duration-(--cg-ui-duration-fast) cgui:ease-out',
11
12
  ],
12
13
  variants: {
13
14
  variant: {
@@ -4,8 +4,8 @@ import { Context } from 'runed';
4
4
  export const segmentRootVariants = tv({
5
5
  base: [
6
6
  'cgui:flex cgui:items-center cgui:p-1 cgui:w-fit',
7
- 'cgui:transition-all cgui:duration-250 cgui:ease-in-out',
8
- 'cgui:data-[disabled=""]:opacity-50 cgui:data-[disabled=""]:cursor-not-allowed cgui:data-[disabled=""]:pointer-events-none',
7
+ 'cgui:transition-[background-color,border-color,opacity] cgui:duration-(--cg-ui-duration-base) cgui:ease-out',
8
+ 'cgui:data-disabled:opacity-50 cgui:data-disabled:cursor-not-allowed cgui:data-disabled:pointer-events-none',
9
9
  ],
10
10
  variants: {
11
11
  variant: {
@@ -28,7 +28,7 @@ export const segmentItemVariants = tv({
28
28
  'cgui:font-medium cgui:text-body-2',
29
29
  'cgui:rounded-[inherit]',
30
30
  'cgui:cursor-pointer cgui:overflow-hidden cgui:select-none',
31
- 'cgui:transition-all cgui:duration-250 cgui:ease-in-out',
31
+ 'cgui:transition-[color,background-color,border-color,opacity] cgui:duration-(--cg-ui-duration-base) cgui:ease-out',
32
32
  ],
33
33
  variants: {
34
34
  variant: {
@@ -58,7 +58,7 @@ export const segmentThumbVariants = tv({
58
58
  base: [
59
59
  'cgui:rounded-[inherit] cgui:pointer-events-none',
60
60
  'cgui:shadow-segment-thumb',
61
- 'cgui:transition-all cgui:duration-250 cgui:ease-in-out',
61
+ 'cgui:transition-[background-color] cgui:duration-(--cg-ui-duration-base) cgui:ease-out',
62
62
  ],
63
63
  variants: {
64
64
  variant: {
@@ -23,7 +23,7 @@
23
23
  {label || value}
24
24
 
25
25
  {#if selected}
26
- <Icon.Checkmark width={16} height={16} />
26
+ <Icon.Checkmark class="cgui:ms-auto" />
27
27
  {/if}
28
28
  {/if}
29
29
  {/snippet}