solid-element-ui 0.2.3 → 0.2.5

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 (51) hide show
  1. package/dist/index.css +1 -1
  2. package/dist/index.js +572 -579
  3. package/dist/src/alert-dialog/alert-dialog.d.ts +2 -1
  4. package/package.json +5 -5
  5. package/src/accordion/accordion.tsx +80 -0
  6. package/src/alert/alert.tsx +86 -0
  7. package/src/alert-dialog/alert-dialog.tsx +98 -0
  8. package/src/badge/badge.tsx +52 -0
  9. package/src/breadcrumbs/breadcrumbs.tsx +69 -0
  10. package/src/button/button.tsx +216 -0
  11. package/src/checkbox/checkbox.tsx +64 -0
  12. package/src/collapsible/collapsible.tsx +46 -0
  13. package/src/color-area/color-area.tsx +46 -0
  14. package/src/color-channel-field/color-channel-field.tsx +46 -0
  15. package/src/color-field/color-field.tsx +64 -0
  16. package/src/color-slider/color-slider.tsx +60 -0
  17. package/src/color-swatch/color-swatch.tsx +33 -0
  18. package/src/color-wheel/color-wheel.tsx +50 -0
  19. package/src/combobox/combobox.tsx +97 -0
  20. package/src/context-menu/context-menu.tsx +102 -0
  21. package/src/dialog/dialog.tsx +102 -0
  22. package/src/dropdown-menu/dropdown-menu.tsx +111 -0
  23. package/src/file-field/file-field.tsx +114 -0
  24. package/src/hover-card/hover-card.tsx +62 -0
  25. package/src/image/image.tsx +59 -0
  26. package/src/index.tsx +91 -0
  27. package/src/link/link.tsx +64 -0
  28. package/src/menubar/menubar.tsx +81 -0
  29. package/src/meter/meter.tsx +89 -0
  30. package/src/navigation-menu/navigation-menu.tsx +90 -0
  31. package/src/number-field/number-field.tsx +80 -0
  32. package/src/pagination/pagination.tsx +68 -0
  33. package/src/popover/popover.tsx +59 -0
  34. package/src/progress/progress.tsx +83 -0
  35. package/src/radio-group/radio-group.tsx +94 -0
  36. package/src/rating-group/rating-group.tsx +101 -0
  37. package/src/search/search.tsx +99 -0
  38. package/src/segmented-control/segmented-control.tsx +92 -0
  39. package/src/select/select.tsx +164 -0
  40. package/src/separator/separator.tsx +62 -0
  41. package/src/skeleton/skeleton.tsx +73 -0
  42. package/src/slider/slider.tsx +91 -0
  43. package/src/style/index.css +150 -0
  44. package/src/switch/switch.tsx +104 -0
  45. package/src/tabs/tabs.tsx +73 -0
  46. package/src/text-field/text-field.tsx +97 -0
  47. package/src/time-field/time-field.tsx +103 -0
  48. package/src/toast/toast.tsx +128 -0
  49. package/src/toggle-button/toggle-button.tsx +68 -0
  50. package/src/toggle-group/toggle-group.tsx +86 -0
  51. package/src/tooltip/tooltip.tsx +78 -0
@@ -0,0 +1,68 @@
1
+ import { ToggleButton as KToggle } from "@kobalte/core/toggle-button";
2
+ import { splitProps, type JSX, type ComponentProps } from "solid-js";
3
+ import { tv, type VariantProps } from "tailwind-variants";
4
+
5
+ const toggleStyles = tv(
6
+ {
7
+ base: [
8
+ "inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors",
9
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-slate-400 focus-visible:ring-offset-2",
10
+ "disabled:pointer-events-none disabled:opacity-50 select-none cursor-pointer",
11
+ ],
12
+ variants: {
13
+ variant: {
14
+ solid: "bg-slate-100 text-slate-900 hover:bg-slate-200 data-[pressed]:bg-blue-600 data-[pressed]:text-white dark:bg-slate-800 dark:text-slate-100 dark:hover:bg-slate-700 dark:data-[pressed]:bg-blue-500",
15
+ outline:
16
+ "border border-slate-200 bg-transparent hover:bg-slate-100 data-[pressed]:bg-slate-900 data-[pressed]:text-white dark:border-slate-800 dark:hover:bg-slate-800 dark:data-[pressed]:bg-slate-50 dark:data-[pressed]:text-slate-900",
17
+ ghost: "bg-transparent hover:bg-slate-100 data-[pressed]:bg-slate-200 dark:hover:bg-slate-800 dark:data-[pressed]:bg-slate-800",
18
+ },
19
+ size: {
20
+ sm: "h-8 px-3 text-xs",
21
+ md: "h-10 px-4 text-sm",
22
+ lg: "h-12 px-6 text-base",
23
+ icon: "h-10 w-10",
24
+ },
25
+ },
26
+ defaultVariants: {
27
+ variant: "solid",
28
+ size: "md",
29
+ },
30
+ },
31
+ {
32
+ twMerge: true,
33
+ },
34
+ );
35
+
36
+ type ToggleVariants = VariantProps<typeof toggleStyles>;
37
+
38
+ export interface ToggleButtonProps
39
+ extends Omit<ComponentProps<typeof KToggle>, "class">,
40
+ ToggleVariants {
41
+ class?: string;
42
+ children?: JSX.Element;
43
+ }
44
+
45
+ export const ToggleButton = (props: ToggleButtonProps) => {
46
+ const [local, variantProps, others] = splitProps(
47
+ props,
48
+ ["class", "children"],
49
+ ["variant", "size"]
50
+ );
51
+
52
+ return (
53
+ <KToggle
54
+ class={toggleStyles({
55
+ variant: variantProps.variant,
56
+ size: variantProps.size,
57
+ class: local.class,
58
+ })}
59
+ {...others}
60
+ >
61
+ {(state) =>
62
+ typeof local.children === "function"
63
+ ? (local.children as any)(state)
64
+ : local.children
65
+ }
66
+ </KToggle>
67
+ );
68
+ };
@@ -0,0 +1,86 @@
1
+ import { ToggleGroup as KToggleGroup } from "@kobalte/core/toggle-group";
2
+ import { splitProps, For, type ComponentProps, type JSX } from "solid-js";
3
+ import { tv, type VariantProps } from "tailwind-variants";
4
+
5
+
6
+ // TODO 单选,多选出现问题
7
+
8
+ const toggleGroupStyles = tv(
9
+ {
10
+ slots: {
11
+ root: "inline-flex items-center justify-center rounded-md border border-slate-200 bg-transparent p-1 dark:border-slate-800",
12
+ item: [
13
+ "inline-flex items-center justify-center rounded-sm px-3 py-1.5 text-sm font-medium transition-all cursor-pointer",
14
+ "outline-none focus-visible:ring-2 focus-visible:ring-slate-400 focus-visible:ring-offset-2",
15
+ "disabled:pointer-events-none disabled:opacity-50",
16
+ "hover:bg-slate-100 hover:text-slate-500 dark:hover:bg-slate-800 dark:hover:text-slate-400",
17
+ "data-[pressed]:bg-slate-100 data-[pressed]:text-slate-900 dark:data-[pressed]:bg-slate-800 dark:data-[pressed]:text-slate-50",
18
+ ],
19
+ },
20
+ variants: {
21
+ variant: {
22
+ default: {
23
+ root: "bg-transparent",
24
+ item: "data-[pressed]:bg-slate-200 dark:data-[pressed]:bg-slate-700",
25
+ },
26
+ outline: {
27
+ root: "border border-slate-200 dark:border-slate-800",
28
+ item: "border-r last:border-r-0 border-slate-200 dark:border-slate-800 rounded-none first:rounded-l-md last:rounded-r-md",
29
+ },
30
+ },
31
+ size: {
32
+ sm: { item: "h-8 px-2.5 text-xs" },
33
+ md: { item: "h-10 px-3 text-sm" },
34
+ lg: { item: "h-12 px-5 text-base" },
35
+ },
36
+ },
37
+ defaultVariants: {
38
+ variant: "default",
39
+ size: "md",
40
+ },
41
+ },
42
+ {
43
+ twMerge: true,
44
+ },
45
+ );
46
+
47
+ type ToggleGroupVariants = VariantProps<typeof toggleGroupStyles>;
48
+
49
+ interface Option {
50
+ label: string | JSX.Element;
51
+ value: string;
52
+ disabled?: boolean;
53
+ }
54
+
55
+ export interface ToggleGroupProps
56
+ extends Omit<ComponentProps<typeof KToggleGroup>, "class">,
57
+ ToggleGroupVariants {
58
+ options: Option[];
59
+ class?: string;
60
+ }
61
+
62
+ export const ToggleGroup = (props: ToggleGroupProps) => {
63
+ const [local, variantProps, others] = splitProps(
64
+ props,
65
+ ["options", "class"],
66
+ ["size", "variant"]
67
+ );
68
+
69
+ const styles = toggleGroupStyles(variantProps);
70
+
71
+ return (
72
+ <KToggleGroup class={styles.root({ class: local.class })} {...others}>
73
+ <For each={local.options}>
74
+ {(option) => (
75
+ <KToggleGroup.Item
76
+ value={option.value}
77
+ disabled={option.disabled}
78
+ class={styles.item()}
79
+ >
80
+ {option.label}
81
+ </KToggleGroup.Item>
82
+ )}
83
+ </For>
84
+ </KToggleGroup>
85
+ );
86
+ };
@@ -0,0 +1,78 @@
1
+ import { Tooltip as KTooltip } from "@kobalte/core/tooltip";
2
+ import { splitProps, type JSX, type ComponentProps } from "solid-js";
3
+ import { tv, type VariantProps } from "tailwind-variants";
4
+
5
+ // FIXME 为什么没有箭头
6
+
7
+ const tooltipStyles = tv(
8
+ {
9
+ slots: {
10
+ content: [
11
+ "z-50 overflow-hidden rounded-md px-3 py-1.5 text-xs shadow-md",
12
+ "animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",
13
+ ],
14
+ arrow: "",
15
+ },
16
+ variants: {
17
+ variant: {
18
+ default: {
19
+ content:
20
+ "bg-slate-900 text-slate-50 dark:bg-slate-50 dark:text-slate-900",
21
+ arrow: "text-slate-900 dark:text-slate-50",
22
+ },
23
+ danger: {
24
+ content: "bg-red-600 text-white",
25
+ arrow: "text-red-600",
26
+ },
27
+ },
28
+ },
29
+ defaultVariants: {
30
+ variant: "default",
31
+ },
32
+ },
33
+ {
34
+ twMerge: true,
35
+ },
36
+ );
37
+
38
+ type TooltipVariants = VariantProps<typeof tooltipStyles>;
39
+
40
+ export interface TooltipProps
41
+ extends Omit<ComponentProps<typeof KTooltip>, "class">, TooltipVariants {
42
+ content: JSX.Element;
43
+ children: JSX.Element;
44
+ }
45
+
46
+ export const Tooltip = (props: TooltipProps) => {
47
+ // 1. 分离属性
48
+ const [local, variantProps, others] = splitProps(
49
+ props,
50
+ ["children", "content"],
51
+ ["variant"]
52
+ );
53
+
54
+ // 2. 生成样式
55
+ const styles = tooltipStyles(variantProps);
56
+
57
+ return (
58
+ <KTooltip
59
+ gutter={4} // 必须:给箭头留出空间
60
+ openDelay={200} // 可选:稍微延迟显示,体验更好
61
+ {...others}
62
+ >
63
+ <KTooltip.Trigger class="block">
64
+ {local.children}
65
+ </KTooltip.Trigger>
66
+
67
+ <KTooltip.Portal>
68
+ <KTooltip.Content class={styles.content()}>
69
+ {/* size={8} 确保箭头有物理尺寸
70
+ fill="currentColor" 配合 styles.arrow() 里的 text 颜色实现变体同步
71
+ */}
72
+ <KTooltip.Arrow class={styles.arrow()} size={8} />
73
+ {local.content}
74
+ </KTooltip.Content>
75
+ </KTooltip.Portal>
76
+ </KTooltip>
77
+ );
78
+ };