@manafishrov/ui 1.0.4 → 1.1.0

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 (156) hide show
  1. package/dist/Theme.js +6 -6
  2. package/dist/Theme.js.map +1 -1
  3. package/dist/_virtual/calendar-month.js +10 -0
  4. package/dist/_virtual/calendar-month.js.map +1 -0
  5. package/dist/_virtual/check-circle.js +10 -0
  6. package/dist/_virtual/check-circle.js.map +1 -0
  7. package/dist/_virtual/check.js +10 -0
  8. package/dist/_virtual/check.js.map +1 -0
  9. package/dist/_virtual/{outline-check.js → chevron-left.js} +4 -4
  10. package/dist/_virtual/chevron-left.js.map +1 -0
  11. package/dist/_virtual/{outline-expand-more.js → chevron-right.js} +4 -4
  12. package/dist/_virtual/chevron-right.js.map +1 -0
  13. package/dist/_virtual/close.js +10 -0
  14. package/dist/_virtual/close.js.map +1 -0
  15. package/dist/_virtual/error.js +10 -0
  16. package/dist/_virtual/error.js.map +1 -0
  17. package/dist/_virtual/{outline-expand-less.js → expand-less.js} +2 -2
  18. package/dist/_virtual/expand-less.js.map +1 -0
  19. package/dist/_virtual/expand-more.js +10 -0
  20. package/dist/_virtual/expand-more.js.map +1 -0
  21. package/dist/_virtual/info.js +10 -0
  22. package/dist/_virtual/info.js.map +1 -0
  23. package/dist/_virtual/more-horiz.js +10 -0
  24. package/dist/_virtual/more-horiz.js.map +1 -0
  25. package/dist/_virtual/progress-activity.js +10 -0
  26. package/dist/_virtual/progress-activity.js.map +1 -0
  27. package/dist/_virtual/search.js +10 -0
  28. package/dist/_virtual/search.js.map +1 -0
  29. package/dist/_virtual/side-navigation.js +10 -0
  30. package/dist/_virtual/side-navigation.js.map +1 -0
  31. package/dist/_virtual/visibility-off.js +10 -0
  32. package/dist/_virtual/visibility-off.js.map +1 -0
  33. package/dist/_virtual/visibility.js +10 -0
  34. package/dist/_virtual/visibility.js.map +1 -0
  35. package/dist/_virtual/warning.js +10 -0
  36. package/dist/_virtual/warning.js.map +1 -0
  37. package/dist/components/Accordion.js +1 -1
  38. package/dist/components/Accordion.js.map +1 -1
  39. package/dist/components/Breadcrumb.js +28 -24
  40. package/dist/components/Breadcrumb.js.map +1 -1
  41. package/dist/components/Carousel.js +23 -23
  42. package/dist/components/Carousel.js.map +1 -1
  43. package/dist/components/Checkbox.js +11 -11
  44. package/dist/components/Checkbox.js.map +1 -1
  45. package/dist/components/Combobox.js +15 -15
  46. package/dist/components/Combobox.js.map +1 -1
  47. package/dist/components/DatePicker.js +21 -21
  48. package/dist/components/DatePicker.js.map +1 -1
  49. package/dist/components/Dialog.js +7 -7
  50. package/dist/components/Dialog.js.map +1 -1
  51. package/dist/components/Menu.js +5 -5
  52. package/dist/components/Menu.js.map +1 -1
  53. package/dist/components/MenuCombobox.js +29 -29
  54. package/dist/components/MenuCombobox.js.map +1 -1
  55. package/dist/components/NavigationMenu.js +5 -5
  56. package/dist/components/NavigationMenu.js.map +1 -1
  57. package/dist/components/NumberInput.js +2 -2
  58. package/dist/components/NumberInput.js.map +1 -1
  59. package/dist/components/Pagination.js +18 -18
  60. package/dist/components/Pagination.js.map +1 -1
  61. package/dist/components/PasswordInput.js +11 -11
  62. package/dist/components/PasswordInput.js.map +1 -1
  63. package/dist/components/PinInput.js +24 -24
  64. package/dist/components/PinInput.js.map +1 -1
  65. package/dist/components/Select.js +8 -8
  66. package/dist/components/Select.js.map +1 -1
  67. package/dist/components/Sheet.js +10 -10
  68. package/dist/components/Sheet.js.map +1 -1
  69. package/dist/components/Spinner.js +17 -13
  70. package/dist/components/Spinner.js.map +1 -1
  71. package/dist/components/TagsInput.js +6 -6
  72. package/dist/components/TagsInput.js.map +1 -1
  73. package/dist/components/TreeView.js +1 -1
  74. package/dist/components/TreeView.js.map +1 -1
  75. package/dist/components/sidebar/Sidebar.d.ts +1 -0
  76. package/dist/components/sidebar/Sidebar.js +25 -18
  77. package/dist/components/sidebar/Sidebar.js.map +1 -1
  78. package/dist/components/sidebar/SidebarDesktop.js +24 -23
  79. package/dist/components/sidebar/SidebarDesktop.js.map +1 -1
  80. package/dist/components/sidebar/SidebarMenu.d.ts +5 -1
  81. package/dist/components/sidebar/SidebarMenu.js +96 -89
  82. package/dist/components/sidebar/SidebarMenu.js.map +1 -1
  83. package/dist/components/sidebar/SidebarMobile.js +30 -31
  84. package/dist/components/sidebar/SidebarMobile.js.map +1 -1
  85. package/dist/components/sidebar/SidebarProvider.js +48 -46
  86. package/dist/components/sidebar/SidebarProvider.js.map +1 -1
  87. package/dist/components/sidebar/SidebarSubComponents.js +24 -24
  88. package/dist/components/sidebar/SidebarSubComponents.js.map +1 -1
  89. package/dist/components/sidebar/context.d.ts +1 -0
  90. package/dist/components/sidebar/context.js.map +1 -1
  91. package/dist/components/toaster/Toaster.js +11 -11
  92. package/dist/components/toaster/Toaster.js.map +1 -1
  93. package/dist/paraglide/messages/ui_breadcrumb_label.js +21 -0
  94. package/dist/paraglide/messages/ui_breadcrumb_label.js.map +1 -0
  95. package/dist/theme.css +1 -1
  96. package/package.json +3 -3
  97. package/src/Theme.tsx +2 -2
  98. package/src/components/Accordion.tsx +2 -2
  99. package/src/components/Breadcrumb.tsx +12 -5
  100. package/src/components/Carousel.tsx +4 -4
  101. package/src/components/Checkbox.tsx +2 -2
  102. package/src/components/Combobox.tsx +8 -8
  103. package/src/components/DatePicker.tsx +6 -6
  104. package/src/components/Dialog.tsx +2 -2
  105. package/src/components/Menu.tsx +8 -8
  106. package/src/components/MenuCombobox.tsx +7 -7
  107. package/src/components/NavigationMenu.tsx +6 -6
  108. package/src/components/NumberInput.tsx +4 -4
  109. package/src/components/Pagination.tsx +6 -6
  110. package/src/components/PasswordInput.tsx +4 -4
  111. package/src/components/PinInput.tsx +3 -3
  112. package/src/components/Select.tsx +6 -6
  113. package/src/components/Sheet.tsx +6 -6
  114. package/src/components/Spinner.tsx +2 -9
  115. package/src/components/TagsInput.tsx +9 -9
  116. package/src/components/TreeView.tsx +2 -2
  117. package/src/components/sidebar/Sidebar.tsx +19 -3
  118. package/src/components/sidebar/SidebarDesktop.tsx +7 -2
  119. package/src/components/sidebar/SidebarMenu.tsx +64 -17
  120. package/src/components/sidebar/SidebarMobile.tsx +6 -2
  121. package/src/components/sidebar/SidebarProvider.tsx +15 -2
  122. package/src/components/sidebar/SidebarSubComponents.tsx +3 -3
  123. package/src/components/sidebar/context.ts +1 -0
  124. package/src/components/toaster/Toaster.tsx +12 -12
  125. package/src/theme.css +7 -7
  126. package/dist/_virtual/outline-calendar-month.js +0 -10
  127. package/dist/_virtual/outline-calendar-month.js.map +0 -1
  128. package/dist/_virtual/outline-check-circle.js +0 -10
  129. package/dist/_virtual/outline-check-circle.js.map +0 -1
  130. package/dist/_virtual/outline-check.js.map +0 -1
  131. package/dist/_virtual/outline-chevron-left.js +0 -10
  132. package/dist/_virtual/outline-chevron-left.js.map +0 -1
  133. package/dist/_virtual/outline-chevron-right.js +0 -10
  134. package/dist/_virtual/outline-chevron-right.js.map +0 -1
  135. package/dist/_virtual/outline-close.js +0 -10
  136. package/dist/_virtual/outline-close.js.map +0 -1
  137. package/dist/_virtual/outline-error.js +0 -10
  138. package/dist/_virtual/outline-error.js.map +0 -1
  139. package/dist/_virtual/outline-expand-less.js.map +0 -1
  140. package/dist/_virtual/outline-expand-more.js.map +0 -1
  141. package/dist/_virtual/outline-info.js +0 -10
  142. package/dist/_virtual/outline-info.js.map +0 -1
  143. package/dist/_virtual/outline-more-horiz.js +0 -10
  144. package/dist/_virtual/outline-more-horiz.js.map +0 -1
  145. package/dist/_virtual/outline-remove.js +0 -10
  146. package/dist/_virtual/outline-remove.js.map +0 -1
  147. package/dist/_virtual/outline-search.js +0 -10
  148. package/dist/_virtual/outline-search.js.map +0 -1
  149. package/dist/_virtual/outline-view-sidebar.js +0 -10
  150. package/dist/_virtual/outline-view-sidebar.js.map +0 -1
  151. package/dist/_virtual/outline-visibility-off.js +0 -10
  152. package/dist/_virtual/outline-visibility-off.js.map +0 -1
  153. package/dist/_virtual/outline-visibility.js +0 -10
  154. package/dist/_virtual/outline-visibility.js.map +0 -1
  155. package/dist/_virtual/outline-warning.js +0 -10
  156. package/dist/_virtual/outline-warning.js.map +0 -1
@@ -1,5 +1,6 @@
1
1
  import { type Component, type ComponentProps, splitProps } from 'solid-js';
2
2
  import { cn } from 'tailwind-variants';
3
+ import ProgressActivityIcon from '~icons/material-symbols/progress-activity';
3
4
 
4
5
  import * as messages from '@/paraglide/messages';
5
6
 
@@ -13,15 +14,7 @@ export const Spinner: Component<ComponentProps<'span'>> = (props) => {
13
14
  class={cn('inline-flex items-center justify-center', local.class)}
14
15
  {...others}
15
16
  >
16
- <svg
17
- xmlns='http://www.w3.org/2000/svg'
18
- viewBox='0 -960 960 960'
19
- fill='currentColor'
20
- class='size-4 animate-spin'
21
- aria-hidden='true'
22
- >
23
- <path d='M325-111.5q-73-31.5-127.5-86t-86-127.5Q80-398 80-480.5t31.5-155q31.5-72.5 86-127t127.5-86Q398-880 480-880q17 0 28.5 11.5T520-840q0 17-11.5 28.5T480-800q-133 0-226.5 93.5T160-480q0 133 93.5 226.5T480-160q133 0 226.5-93.5T800-480q0-17 11.5-28.5T840-520q17 0 28.5 11.5T880-480q0 82-31.5 155t-86 127.5q-54.5 54.5-127 86T480.5-80Q398-80 325-111.5Z' />
24
- </svg>
17
+ <ProgressActivityIcon class='size-4 animate-spin' aria-hidden='true' />
25
18
  </span>
26
19
  );
27
20
  };
@@ -1,7 +1,7 @@
1
1
  import { TagsInput as TagsInputPrimitive } from '@ark-ui/solid/tags-input';
2
2
  import { type Component, splitProps } from 'solid-js';
3
3
  import { cn } from 'tailwind-variants';
4
- import OutlineCloseIcon from '~icons/ic/outline-close';
4
+ import CloseIcon from '~icons/material-symbols/close';
5
5
 
6
6
  export const TagsInput = TagsInputPrimitive.Root;
7
7
  export const TagsInputContext = TagsInputPrimitive.Context;
@@ -23,7 +23,7 @@ export const TagsInputControl: Component<TagsInputPrimitive.ControlProps> = (pro
23
23
  return (
24
24
  <TagsInputPrimitive.Control
25
25
  class={cn(
26
- 'group relative min-h-10 py-1.5 pr-8 pl-2.5 text-sm [&_svg:not([class*="size-"])]:size-4 gap-1 shadow-sm flex w-full flex-wrap items-center rounded-lg border border-input bg-transparent transition-colors outline-none disabled:cursor-not-allowed disabled:opacity-50 dark:bg-input/30 dark:hover:bg-input/50 [&_svg]:pointer-events-none [&_svg]:shrink-0',
26
+ 'group min-h-10 py-1.5 pr-8 pl-2.5 text-sm [&_svg:not([class*="size-"])]:size-4 gap-1 shadow-sm relative flex w-full flex-wrap items-center rounded-lg border border-input bg-transparent transition-colors outline-none disabled:cursor-not-allowed disabled:opacity-50 dark:bg-input/30 dark:hover:bg-input/50 [&_svg]:pointer-events-none [&_svg]:shrink-0',
27
27
  'focus-within:border-ring focus-within:ring-[3px] focus-within:ring-ring/50',
28
28
  'data-[invalid=true]:border-destructive data-[invalid=true]:ring-[3px] data-[invalid=true]:ring-destructive/20 dark:data-[invalid=true]:ring-destructive/40',
29
29
  'data-[disabled=true]:bg-input/50 data-[disabled=true]:opacity-50 dark:data-[disabled=true]:bg-input/80',
@@ -57,12 +57,12 @@ export const TagsInputClearTrigger: Component<TagsInputPrimitive.ClearTriggerPro
57
57
  return (
58
58
  <TagsInputPrimitive.ClearTrigger
59
59
  class={cn(
60
- 'right-2 top-1/2 p-0.5 absolute -translate-y-1/2 rounded-sm text-muted-foreground transition-colors hover:text-foreground',
60
+ 'right-2 p-0.5 absolute top-1/2 -translate-y-1/2 rounded-sm text-muted-foreground transition-colors hover:text-foreground',
61
61
  local.class,
62
62
  )}
63
63
  {...others}
64
64
  >
65
- {local.children ?? <OutlineCloseIcon class='size-3.5 pointer-events-none' />}
65
+ {local.children ?? <CloseIcon class='size-3.5 pointer-events-none' />}
66
66
  </TagsInputPrimitive.ClearTrigger>
67
67
  );
68
68
  };
@@ -71,7 +71,7 @@ export const TagsInputItem: Component<TagsInputPrimitive.ItemProps> = (props) =>
71
71
  const [local, others] = splitProps(props, ['class', 'children']);
72
72
  return (
73
73
  <TagsInputPrimitive.Item
74
- class={cn('inline-flex items-center outline-none cursor-default', local.class)}
74
+ class={cn('inline-flex cursor-default items-center outline-none', local.class)}
75
75
  {...others}
76
76
  >
77
77
  {local.children}
@@ -85,8 +85,8 @@ export const TagsInputItemPreview: Component<TagsInputPrimitive.ItemPreviewProps
85
85
  <TagsInputPrimitive.ItemPreview
86
86
  data-slot='tags-input-item-preview'
87
87
  class={cn(
88
- 'h-6 gap-1 px-1.5 text-xs font-medium border border-transparent has-data-[slot=tags-input-item-delete-trigger]:pr-0 inline-flex items-center justify-center rounded-md bg-muted whitespace-nowrap text-foreground transition-colors',
89
- 'data-highlighted:bg-accent data-highlighted:text-accent-foreground data-highlighted:border-ring',
88
+ 'h-6 gap-1 px-1.5 text-xs font-medium has-data-[slot=tags-input-item-delete-trigger]:pr-0 inline-flex items-center justify-center rounded-md border border-transparent bg-muted whitespace-nowrap text-foreground transition-colors',
89
+ 'data-highlighted:border-ring data-highlighted:bg-accent data-highlighted:text-accent-foreground',
90
90
  'data-disabled:pointer-events-none data-[disabled=true]:cursor-not-allowed data-[disabled=true]:opacity-50',
91
91
  local.class,
92
92
  )}
@@ -106,7 +106,7 @@ export const TagsInputItemInput: Component<TagsInputPrimitive.ItemInputProps> =
106
106
  <TagsInputPrimitive.ItemInput
107
107
  class={cn(
108
108
  'py-0 px-1.5 h-6 text-xs rounded-md border border-input bg-background text-foreground outline-none',
109
- 'focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:border-ring',
109
+ 'focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50',
110
110
  local.class,
111
111
  )}
112
112
  {...others}
@@ -127,7 +127,7 @@ export const TagsInputItemDeleteTrigger: Component<TagsInputPrimitive.ItemDelete
127
127
  )}
128
128
  {...others}
129
129
  >
130
- {local.children ?? <OutlineCloseIcon class='size-3 pointer-events-none' />}
130
+ {local.children ?? <CloseIcon class='size-3 pointer-events-none' />}
131
131
  </TagsInputPrimitive.ItemDeleteTrigger>
132
132
  );
133
133
  };
@@ -1,7 +1,7 @@
1
1
  import { TreeView as TreeViewPrimitive, createTreeCollection } from '@ark-ui/solid/tree-view';
2
2
  import { Show, splitProps, type Component } from 'solid-js';
3
3
  import { cn } from 'tailwind-variants';
4
- import OutlineChevronRightIcon from '~icons/ic/outline-chevron-right';
4
+ import ChevronRightIcon from '~icons/material-symbols/chevron-right';
5
5
 
6
6
  export const TreeView = TreeViewPrimitive.Root;
7
7
  export const TreeViewLabel = TreeViewPrimitive.Label;
@@ -46,7 +46,7 @@ export const TreeViewBranchControl: Component<TreeViewPrimitive.BranchControlPro
46
46
  {...others}
47
47
  >
48
48
  <TreeViewPrimitive.BranchIndicator class='text-muted-foreground transition-transform data-[state=open]:rotate-90'>
49
- <OutlineChevronRightIcon class='size-4' />
49
+ <ChevronRightIcon class='size-4' />
50
50
  </TreeViewPrimitive.BranchIndicator>
51
51
  <Show when={local.children} fallback={<TreeViewPrimitive.BranchText />}>
52
52
  {local.children}
@@ -1,4 +1,6 @@
1
- import { type Component, type ComponentProps, createEffect } from 'solid-js';
1
+ import { type Component, type ComponentProps, createEffect, onCleanup } from 'solid-js';
2
+
3
+ import { createMediaQuery } from '@/primitives/createMediaQuery';
2
4
 
3
5
  import { useSidebar } from './context';
4
6
  import { SidebarDesktop } from './SidebarDesktop';
@@ -8,16 +10,30 @@ export type SidebarProps = ComponentProps<'div'> & {
8
10
  side?: 'left' | 'right';
9
11
  variant?: 'sidebar' | 'floating' | 'inset';
10
12
  collapsible?: 'offcanvas' | 'icon' | 'none';
13
+ disableMobileSidebar?: boolean;
11
14
  };
12
15
 
13
16
  export const Sidebar: Component<SidebarProps> = (props) => {
14
- const { isMobile, setSide } = useSidebar();
17
+ const { isMobile, setMobileDisabled, setOpen, setSide } = useSidebar();
18
+ const isViewportMobile = createMediaQuery('(max-width: 768px)');
19
+
20
+ onCleanup(() => {
21
+ setMobileDisabled(false);
22
+ });
15
23
 
16
- // Set side on initial render and track changes
17
24
  createEffect(() => {
18
25
  const currentSide = props.side ?? 'left';
26
+ const mobileDisabled = props.disableMobileSidebar ?? false;
19
27
  setSide(currentSide);
28
+ setMobileDisabled(mobileDisabled);
20
29
  });
30
+
31
+ createEffect(() => {
32
+ if (props.disableMobileSidebar === true && props.collapsible === 'icon') {
33
+ setOpen(!isViewportMobile());
34
+ }
35
+ });
36
+
21
37
  return (
22
38
  <Show
23
39
  when={!isMobile()}
@@ -46,13 +46,18 @@ export const SidebarDesktop: Component<SidebarProps> = (props) => {
46
46
  'side',
47
47
  'variant',
48
48
  'collapsible',
49
+ 'disableMobileSidebar',
49
50
  'class',
50
51
  'children',
51
52
  ]);
52
53
 
53
54
  return (
54
55
  <div
55
- class='group peer md:block hidden text-sidebar-foreground'
56
+ class={cn(
57
+ local.disableMobileSidebar === true
58
+ ? 'group peer block text-sidebar-foreground'
59
+ : 'group peer md:block hidden text-sidebar-foreground',
60
+ )}
56
61
  data-state={state()}
57
62
  data-collapsible={state() === 'collapsed' ? (local.collapsible ?? 'offcanvas') : ''}
58
63
  data-variant={local.variant ?? 'sidebar'}
@@ -73,7 +78,7 @@ export const SidebarDesktop: Component<SidebarProps> = (props) => {
73
78
  <SidebarDesktopContainer
74
79
  variant={local.variant ?? 'sidebar'}
75
80
  side={local.side ?? 'left'}
76
- class={local.class}
81
+ class={cn(local.disableMobileSidebar === true ? 'flex' : 'md:flex hidden', local.class)}
77
82
  {...others}
78
83
  >
79
84
  {local.children}
@@ -1,4 +1,5 @@
1
- import { createMemo, type Component, type ComponentProps } from 'solid-js';
1
+ import { ark } from '@ark-ui/solid/factory';
2
+ import { createMemo, type Component, type ComponentProps, type JSX } from 'solid-js';
2
3
  import { type VariantProps, tv, cn } from 'tailwind-variants';
3
4
 
4
5
  import { Skeleton } from '@/components/Skeleton';
@@ -57,12 +58,20 @@ export const sidebarMenuButtonVariants = tv({
57
58
  },
58
59
  });
59
60
 
60
- export type SidebarMenuButtonProps = ComponentProps<'button'> &
61
+ type SidebarMenuButtonAsChild = ComponentProps<typeof ark.button>['asChild'];
62
+
63
+ export type SidebarMenuButtonProps = Omit<ComponentProps<'button'>, 'asChild'> &
61
64
  VariantProps<typeof sidebarMenuButtonVariants> & {
65
+ asChild?: SidebarMenuButtonAsChild;
62
66
  isActive?: boolean;
63
67
  tooltip?: string | ComponentProps<typeof TooltipContent>;
64
68
  };
65
69
 
70
+ type SidebarMenuButtonStyleProps = Pick<
71
+ SidebarMenuButtonProps,
72
+ 'size' | 'isActive' | 'variant' | 'class'
73
+ >;
74
+
66
75
  type SidebarMenuButtonDataProps = {
67
76
  'data-slot': 'sidebar-menu-button';
68
77
  'data-sidebar': 'menu-button';
@@ -88,32 +97,70 @@ const getTooltipChildren = (
88
97
  return tooltip.children;
89
98
  };
90
99
 
100
+ const getSidebarMenuButtonDataProps = (
101
+ local: SidebarMenuButtonStyleProps,
102
+ ): SidebarMenuButtonDataProps => ({
103
+ 'data-slot': 'sidebar-menu-button',
104
+ 'data-sidebar': 'menu-button',
105
+ 'data-size': local.size ?? 'default',
106
+ 'data-active': local.isActive,
107
+ class: sidebarMenuButtonVariants({
108
+ variant: local.variant,
109
+ size: local.size,
110
+ class: local.class,
111
+ }),
112
+ });
113
+
114
+ const getSidebarMenuButtonAsChildProps = (
115
+ asChild: SidebarMenuButtonProps['asChild'],
116
+ ): Pick<ComponentProps<typeof ark.button>, 'asChild'> => (asChild ? { asChild } : {});
117
+
118
+ const renderSidebarMenuButton = (
119
+ asChild: SidebarMenuButtonProps['asChild'],
120
+ props: ComponentProps<'button'>,
121
+ children: SidebarMenuButtonProps['children'],
122
+ ): JSX.Element => (
123
+ <ark.button {...props} {...getSidebarMenuButtonAsChildProps(asChild)}>
124
+ {children}
125
+ </ark.button>
126
+ );
127
+
91
128
  export const SidebarMenuButton: Component<SidebarMenuButtonProps> = (props) => {
92
- const [local, others] = splitProps(props, ['isActive', 'variant', 'size', 'tooltip', 'class']);
129
+ const [local, others] = splitProps(props, [
130
+ 'asChild',
131
+ 'children',
132
+ 'isActive',
133
+ 'variant',
134
+ 'size',
135
+ 'tooltip',
136
+ 'class',
137
+ ]);
93
138
  const { isMobile, state, side } = useSidebar();
94
139
 
95
140
  const tooltipPlacement = createMemo(() => (side() === 'left' ? 'right' : 'left'));
96
-
97
- const buttonProps = (): SidebarMenuButtonDataProps => ({
98
- 'data-slot': 'sidebar-menu-button',
99
- 'data-sidebar': 'menu-button',
100
- 'data-size': local.size ?? 'default',
101
- 'data-active': local.isActive,
102
- class: sidebarMenuButtonVariants({
103
- variant: local.variant,
104
- size: local.size,
105
- class: local.class,
106
- }),
107
- });
141
+ const buttonDataProps = createMemo(() => getSidebarMenuButtonDataProps(local));
108
142
 
109
143
  return (
110
- <Show when={local.tooltip} fallback={<button {...buttonProps()} {...others} />}>
144
+ <Show
145
+ when={local.tooltip}
146
+ fallback={renderSidebarMenuButton(
147
+ local.asChild,
148
+ { ...buttonDataProps(), ...others },
149
+ local.children,
150
+ )}
151
+ >
111
152
  <Tooltip
112
153
  positioning={{ placement: tooltipPlacement() }}
113
154
  openDelay={100}
114
155
  disabled={state() !== 'collapsed' || isMobile()}
115
156
  >
116
- <TooltipTrigger {...buttonProps()} {...others} />
157
+ <TooltipTrigger
158
+ {...buttonDataProps()}
159
+ {...others}
160
+ asChild={(triggerProps) =>
161
+ renderSidebarMenuButton(local.asChild, triggerProps(), local.children)
162
+ }
163
+ />
117
164
  <Portal>
118
165
  <TooltipPositioner>
119
166
  <TooltipContent {...getTooltipContentProps(local.tooltip)}>
@@ -2,6 +2,7 @@ import type { Component } from 'solid-js';
2
2
 
3
3
  import {
4
4
  Sheet,
5
+ SheetCloseButton,
5
6
  SheetContent,
6
7
  SheetDescription,
7
8
  SheetHeader,
@@ -18,6 +19,7 @@ import { useSidebar } from './context';
18
19
  export const SidebarMobile: Component<SidebarProps> = (props) => {
19
20
  const [local] = splitProps(props, ['side', 'children']);
20
21
  const { openMobile, setOpenMobile } = useSidebar();
22
+ const side = local.side ?? 'left';
21
23
 
22
24
  return (
23
25
  <Sheet
@@ -26,16 +28,18 @@ export const SidebarMobile: Component<SidebarProps> = (props) => {
26
28
  setOpenMobile(event.open);
27
29
  }}
28
30
  >
29
- <SheetPositioner side={local.side ?? 'left'}>
31
+ <SheetPositioner side={side}>
30
32
  <SheetContent
33
+ side={side}
31
34
  data-sidebar='sidebar'
32
35
  data-slot='sidebar'
33
36
  data-mobile='true'
34
- class='p-0 w-(--sidebar-width) bg-sidebar text-sidebar-foreground [&>button]:hidden'
37
+ class='p-0 w-(--sidebar-width) bg-sidebar text-sidebar-foreground'
35
38
  style={{
36
39
  '--sidebar-width': SIDEBAR_WIDTH_MOBILE,
37
40
  }}
38
41
  >
42
+ <SheetCloseButton />
39
43
  <div class='sr-only'>
40
44
  <SheetHeader>
41
45
  <SheetTitle>{messages.ui_sidebar_title()}</SheetTitle>
@@ -26,6 +26,7 @@ const useSidebarState = (
26
26
  props: SidebarProviderProps,
27
27
  ): {
28
28
  isMobile: () => boolean;
29
+ setMobileDisabled: (value: boolean) => void;
29
30
  openMobile: () => boolean;
30
31
  setOpenMobile: (value: boolean | ((prev: boolean) => boolean)) => void;
31
32
  open: () => boolean;
@@ -33,7 +34,9 @@ const useSidebarState = (
33
34
  side: () => 'left' | 'right';
34
35
  setSide: (value: 'left' | 'right') => void;
35
36
  } => {
36
- const isMobile = createMediaQuery('(max-width: 768px)');
37
+ const isViewportMobile = createMediaQuery('(max-width: 768px)');
38
+ const [mobileDisabled, setMobileDisabled] = createSignal(false);
39
+ const isMobile = (): boolean => isViewportMobile() && !mobileDisabled();
37
40
  const [openMobile, setOpenMobile] = createSignal(false);
38
41
  const [internalOpen, setInternalOpen] = createSignal(props.defaultOpen ?? true);
39
42
  const [side, setSide] = createSignal<'left' | 'right'>('left');
@@ -49,7 +52,16 @@ const useSidebarState = (
49
52
  setSidebarCookie(value);
50
53
  };
51
54
 
52
- return { isMobile, openMobile, setOpenMobile, open, setOpen, side, setSide };
55
+ return {
56
+ isMobile,
57
+ setMobileDisabled,
58
+ openMobile,
59
+ setOpenMobile,
60
+ open,
61
+ setOpen,
62
+ side,
63
+ setSide,
64
+ };
53
65
  };
54
66
  const useSidebarEvents = (stateSet: ReturnType<typeof useSidebarState>): { toggle: () => void } => {
55
67
  const toggle = (): void => {
@@ -84,6 +96,7 @@ const createSidebarContextValue = (
84
96
  open: stateSet.open,
85
97
  setOpen: stateSet.setOpen,
86
98
  isMobile: stateSet.isMobile,
99
+ setMobileDisabled: stateSet.setMobileDisabled,
87
100
  openMobile: stateSet.openMobile,
88
101
  setOpenMobile: stateSet.setOpenMobile,
89
102
  toggleSidebar: toggle,
@@ -1,7 +1,7 @@
1
1
  import type { Component, ComponentProps } from 'solid-js';
2
2
 
3
3
  import { cn } from 'tailwind-variants';
4
- import OutlineViewSidebarIcon from '~icons/ic/outline-view-sidebar';
4
+ import ViewSidebarIcon from '~icons/material-symbols/side-navigation';
5
5
 
6
6
  import { Button } from '@/components/Button';
7
7
  import { ScrollArea } from '@/components/ScrollArea';
@@ -34,7 +34,7 @@ export const SidebarTrigger: Component<ComponentProps<typeof Button>> = (props)
34
34
  onClick={handleClick}
35
35
  {...others}
36
36
  >
37
- <OutlineViewSidebarIcon aria-hidden='true' />
37
+ <ViewSidebarIcon aria-hidden='true' />
38
38
  </Button>
39
39
  );
40
40
  };
@@ -170,7 +170,7 @@ export const SidebarGroupLabel: Component<ComponentProps<'div'>> = (props) => {
170
170
  data-slot='sidebar-group-label'
171
171
  data-sidebar='group-label'
172
172
  class={cn(
173
- 'h-8 px-2 text-xs font-medium group-data-[collapsible=icon]:-mt-8 [&>svg]:size-4 flex shrink-0 items-center rounded-md text-sidebar-foreground/70 ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:opacity-0 focus-visible:ring-2 [&>svg]:shrink-0',
173
+ 'h-8 px-2 text-xs font-medium group-data-[collapsible=icon]:-mt-8 [&>svg]:size-4 flex shrink-0 items-center rounded-md font-heading text-sidebar-foreground/70 ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:opacity-0 focus-visible:ring-2 [&>svg]:shrink-0',
174
174
  local.class,
175
175
  )}
176
176
  {...others}
@@ -5,6 +5,7 @@ export type SidebarContextProps = {
5
5
  openMobile: () => boolean;
6
6
  setOpenMobile: (open: boolean) => void;
7
7
  isMobile: () => boolean;
8
+ setMobileDisabled: (mobileDisabled: boolean) => void;
8
9
  toggleSidebar: () => void;
9
10
  side: () => 'left' | 'right';
10
11
  setSide: (side: 'left' | 'right') => void;
@@ -7,11 +7,11 @@ import {
7
7
  import { type Component, type Accessor, Show } from 'solid-js';
8
8
  import { Portal } from 'solid-js/web';
9
9
  import { cn } from 'tailwind-variants';
10
- import OutlineCheckCircleIcon from '~icons/ic/outline-check-circle';
11
- import OutlineCloseIcon from '~icons/ic/outline-close';
12
- import OutlineErrorIcon from '~icons/ic/outline-error';
13
- import OutlineInfoIcon from '~icons/ic/outline-info';
14
- import OutlineWarningIcon from '~icons/ic/outline-warning';
10
+ import CheckCircleIcon from '~icons/material-symbols/check-circle';
11
+ import CloseIcon from '~icons/material-symbols/close';
12
+ import ErrorIcon from '~icons/material-symbols/error';
13
+ import InfoIcon from '~icons/material-symbols/info';
14
+ import WarningIcon from '~icons/material-symbols/warning';
15
15
 
16
16
  import { Spinner } from '@/components/Spinner';
17
17
 
@@ -24,22 +24,22 @@ export const toast = createToaster({
24
24
  const ToastItem: Component<{ toast: Accessor<ToastOptions> }> = (props) => (
25
25
  <Toast.Root
26
26
  class={cn(
27
- 'group gap-3 p-4 pr-10 shadow-lg pointer-events-auto relative flex min-w-72 w-full items-center rounded-lg border bg-popover transition-all',
28
- 'data-[state=open]:animate-in data-[state=open]:sm:slide-in-from-bottom-full data-[state=open]:slide-in-from-top-full',
27
+ 'group gap-3 p-4 pr-10 shadow-lg min-w-72 pointer-events-auto relative flex w-full items-center rounded-lg border bg-popover transition-all',
28
+ 'data-[state=open]:sm:slide-in-from-bottom-full data-[state=open]:animate-in data-[state=open]:slide-in-from-top-full',
29
29
  'border-border text-popover-foreground',
30
30
  )}
31
31
  >
32
32
  <Show when={props.toast().type === 'success'}>
33
- <OutlineCheckCircleIcon class={cn('size-5 text-green-500 shrink-0')} aria-hidden='true' />
33
+ <CheckCircleIcon class={cn('size-5 text-green-500 shrink-0')} aria-hidden='true' />
34
34
  </Show>
35
35
  <Show when={props.toast().type === 'info'}>
36
- <OutlineInfoIcon class={cn('size-5 text-blue-500 shrink-0')} aria-hidden='true' />
36
+ <InfoIcon class={cn('size-5 text-blue-500 shrink-0')} aria-hidden='true' />
37
37
  </Show>
38
38
  <Show when={props.toast().type === 'warning'}>
39
- <OutlineWarningIcon class={cn('size-5 text-amber-500 shrink-0')} aria-hidden='true' />
39
+ <WarningIcon class={cn('size-5 text-amber-500 shrink-0')} aria-hidden='true' />
40
40
  </Show>
41
41
  <Show when={props.toast().type === 'error'}>
42
- <OutlineErrorIcon class={cn('size-5 text-red-500 shrink-0')} aria-hidden='true' />
42
+ <ErrorIcon class={cn('size-5 text-red-500 shrink-0')} aria-hidden='true' />
43
43
  </Show>
44
44
  <Show when={props.toast().type === 'loading'}>
45
45
  <Spinner class={cn('size-5 text-muted-foreground')} />
@@ -57,7 +57,7 @@ const ToastItem: Component<{ toast: Accessor<ToastOptions> }> = (props) => (
57
57
  </Show>
58
58
  </div>
59
59
  <Toast.CloseTrigger class='top-2 right-2 p-1 absolute cursor-pointer rounded-md text-foreground/50 opacity-0 transition-opacity group-hover:opacity-100 hover:text-foreground focus:opacity-100 focus:outline-none'>
60
- <OutlineCloseIcon class='size-4' />
60
+ <CloseIcon class='size-4' />
61
61
  </Toast.CloseTrigger>
62
62
  </Toast.Root>
63
63
  );
package/src/theme.css CHANGED
@@ -1,6 +1,6 @@
1
1
  @import 'tw-animate-css';
2
2
  @import '@fontsource/rajdhani';
3
- @import '@fontsource/roboto';
3
+ @import '@fontsource-variable/google-sans-flex/index.css';
4
4
  @import '@fontsource/chakra-petch/500';
5
5
  @import './components/marquee/marquee.css';
6
6
  @import './components/toaster/toaster.css';
@@ -79,14 +79,14 @@
79
79
 
80
80
  @theme inline {
81
81
  --font-default:
82
- 'Roboto', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
83
- 'Segoe UI Symbol', 'Noto Color Emoji';
82
+ 'Google Sans Flex Variable', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji',
83
+ 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
84
84
  --font-heading:
85
- 'Rajdhani', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
86
- 'Segoe UI Symbol', 'Noto Color Emoji';
85
+ 'Rajdhani', 'Google Sans Flex Variable', ui-sans-serif, system-ui, sans-serif,
86
+ 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
87
87
  --font-branding:
88
- 'Chakra Petch', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
89
- 'Segoe UI Symbol', 'Noto Color Emoji';
88
+ 'Chakra Petch', 'Google Sans Flex Variable', ui-sans-serif, system-ui, sans-serif,
89
+ 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
90
90
  --radius-sm: calc(var(--radius) - 4px);
91
91
  --radius-md: calc(var(--radius) - 2px);
92
92
  --radius-lg: var(--radius);
@@ -1,10 +0,0 @@
1
- import { template as t, spread as r } from "solid-js/web";
2
- var m = /* @__PURE__ */ t('<svg viewBox="0 0 24 24"width=1.2em height=1.2em><path fill=currentColor d="M19 4h-1V2h-2v2H8V2H6v2H5c-1.11 0-1.99.9-1.99 2L3 20a2 2 0 0 0 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2m0 16H5V10h14zm0-12H5V6h14zM9 14H7v-2h2zm4 0h-2v-2h2zm4 0h-2v-2h2zm-8 4H7v-2h2zm4 0h-2v-2h2zm4 0h-2v-2h2z">');
3
- const a = (e = {}) => (() => {
4
- var h = m();
5
- return r(h, e, !0, !0), h;
6
- })();
7
- export {
8
- a as default
9
- };
10
- //# sourceMappingURL=outline-calendar-month.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"outline-calendar-month.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -1,10 +0,0 @@
1
- import { template as r, spread as l } from "solid-js/web";
2
- var s = /* @__PURE__ */ r('<svg viewBox="0 0 24 24"width=1.2em height=1.2em><path fill=currentColor d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10s10-4.48 10-10S17.52 2 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8s8 3.59 8 8s-3.59 8-8 8m4.59-12.42L10 14.17l-2.59-2.58L6 13l4 4l8-8z">');
3
- const o = (t = {}) => (() => {
4
- var e = s();
5
- return l(e, t, !0, !0), e;
6
- })();
7
- export {
8
- o as default
9
- };
10
- //# sourceMappingURL=outline-check-circle.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"outline-check-circle.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"outline-check.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -1,10 +0,0 @@
1
- import { template as r, spread as l } from "solid-js/web";
2
- var o = /* @__PURE__ */ r('<svg viewBox="0 0 24 24"width=1.2em height=1.2em><path fill=currentColor d="M15.41 7.41L14 6l-6 6l6 6l1.41-1.41L10.83 12z">');
3
- const i = (t = {}) => (() => {
4
- var e = o();
5
- return l(e, t, !0, !0), e;
6
- })();
7
- export {
8
- i as default
9
- };
10
- //# sourceMappingURL=outline-chevron-left.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"outline-chevron-left.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -1,10 +0,0 @@
1
- import { template as r, spread as l } from "solid-js/web";
2
- var o = /* @__PURE__ */ r('<svg viewBox="0 0 24 24"width=1.2em height=1.2em><path fill=currentColor d="M10 6L8.59 7.41L13.17 12l-4.58 4.59L10 18l6-6z">');
3
- const i = (t = {}) => (() => {
4
- var e = o();
5
- return l(e, t, !0, !0), e;
6
- })();
7
- export {
8
- i as default
9
- };
10
- //# sourceMappingURL=outline-chevron-right.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"outline-chevron-right.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -1,10 +0,0 @@
1
- import { template as r, spread as L } from "solid-js/web";
2
- var l = /* @__PURE__ */ r('<svg viewBox="0 0 24 24"width=1.2em height=1.2em><path fill=currentColor d="M19 6.41L17.59 5L12 10.59L6.41 5L5 6.41L10.59 12L5 17.59L6.41 19L12 13.41L17.59 19L19 17.59L13.41 12z">');
3
- const a = (t = {}) => (() => {
4
- var e = l();
5
- return L(e, t, !0, !0), e;
6
- })();
7
- export {
8
- a as default
9
- };
10
- //# sourceMappingURL=outline-close.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"outline-close.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -1,10 +0,0 @@
1
- import { template as t, spread as o } from "solid-js/web";
2
- var h = /* @__PURE__ */ t('<svg viewBox="0 0 24 24"width=1.2em height=1.2em><path fill=currentColor d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10s10-4.48 10-10S17.52 2 12 2m1 15h-2v-2h2zm0-4h-2V7h2z">');
3
- const m = (e = {}) => (() => {
4
- var r = h();
5
- return o(r, e, !0, !0), r;
6
- })();
7
- export {
8
- m as default
9
- };
10
- //# sourceMappingURL=outline-error.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"outline-error.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"outline-expand-less.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"outline-expand-more.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -1,10 +0,0 @@
1
- import { template as r, spread as m } from "solid-js/web";
2
- var o = /* @__PURE__ */ r('<svg viewBox="0 0 24 24"width=1.2em height=1.2em><path fill=currentColor d="M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.48 2 2 6.48 2 12s4.48 10 10 10s10-4.48 10-10S17.52 2 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8s8 3.59 8 8s-3.59 8-8 8">');
3
- const h = (t = {}) => (() => {
4
- var e = o();
5
- return m(e, t, !0, !0), e;
6
- })();
7
- export {
8
- h as default
9
- };
10
- //# sourceMappingURL=outline-info.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"outline-info.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -1,10 +0,0 @@
1
- import { template as t, spread as s } from "solid-js/web";
2
- var o = /* @__PURE__ */ t('<svg viewBox="0 0 24 24"width=1.2em height=1.2em><path fill=currentColor d="M6 10c-1.1 0-2 .9-2 2s.9 2 2 2s2-.9 2-2s-.9-2-2-2m12 0c-1.1 0-2 .9-2 2s.9 2 2 2s2-.9 2-2s-.9-2-2-2m-6 0c-1.1 0-2 .9-2 2s.9 2 2 2s2-.9 2-2s-.9-2-2-2">');
3
- const m = (r = {}) => (() => {
4
- var e = o();
5
- return s(e, r, !0, !0), e;
6
- })();
7
- export {
8
- m as default
9
- };
10
- //# sourceMappingURL=outline-more-horiz.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"outline-more-horiz.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}