atomsystem 0.1.37 → 0.1.39

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.
@@ -3,20 +3,24 @@ import clsx from "clsx";
3
3
 
4
4
  export const Button = ({
5
5
  children,
6
- type,
6
+ type = "primary",
7
+ size = "md",
8
+ className,
7
9
  style,
8
10
  disabled,
9
11
  onClick,
10
12
  }: {
11
13
  children: React.ReactNode;
12
- type: "primary" | "secondary" | "success" | "warning" | "danger" | "gray";
14
+ type?: "primary" | "secondary" | "success" | "warning" | "danger" | "gray" | "outline";
15
+ size?: "sm" | "md" | "lg";
16
+ className?: string;
13
17
  style?: React.CSSProperties;
14
18
  disabled?: boolean;
15
19
  onClick?: () => void;
16
20
  }) => {
17
21
  return (
18
22
  <button
19
- className={clsx("btn", type)}
23
+ className={clsx("btn", type, size, className)}
20
24
  style={style}
21
25
  disabled={disabled}
22
26
  onClick={onClick}
@@ -9,67 +9,127 @@
9
9
  }
10
10
 
11
11
  .btn.primary {
12
- --btn-bg: var(--color-primary);
13
- --btn-hover: var(--color-blue-600);
14
- --btn-active: var(--color-blue-700);
15
- --btn-bg-disabled: var(--button-primary-bg-disabled);
16
- --btn-text-disabled: var(--button-primary-text-disabled);
17
- --btn-border-disabled: var(--button-primary-border-disabled);
12
+ background-color: var(--color-primary);
13
+ color: var(--color-white);
14
+ }
15
+ .btn.primary:hover:not(:disabled) {
16
+ background-color: var(--color-blue-600);
17
+ }
18
+ .btn.primary:active:not(:disabled) {
19
+ background-color: var(--color-blue-700);
18
20
  }
21
+ .btn.primary:disabled {
22
+ background-color: var(--button-primary-bg-disabled);
23
+ color: var(--button-primary-text-disabled);
24
+ border: 1px solid var(--button-primary-border-disabled);
25
+ }
26
+
19
27
  .btn.secondary {
20
- --btn-bg: var(--color-secondary);
21
- --btn-hover: var(--color-indigo-600);
22
- --btn-active: var(--color-indigo-700);
23
- --btn-bg-disabled: var(--button-secondary-bg-disabled);
24
- --btn-text-disabled: var(--button-secondary-text-disabled);
25
- --btn-border-disabled: var(--button-secondary-border-disabled);
28
+ background-color: var(--color-secondary);
29
+ color: var(--color-white);
30
+ }
31
+ .btn.secondary:hover:not(:disabled) {
32
+ background-color: var(--color-indigo-600);
33
+ }
34
+ .btn.secondary:active:not(:disabled) {
35
+ background-color: var(--color-indigo-700);
26
36
  }
37
+ .btn.secondary:disabled {
38
+ background-color: var(--button-secondary-bg-disabled);
39
+ color: var(--button-secondary-text-disabled);
40
+ border: 1px solid var(--button-secondary-border-disabled);
41
+ }
42
+
27
43
  .btn.success {
28
- --btn-bg: var(--color-success);
29
- --btn-hover: var(--color-green-600);
30
- --btn-active: var(--color-green-700);
31
- --btn-bg-disabled: var(--button-success-bg-disabled);
32
- --btn-text-disabled: var(--button-success-text-disabled);
33
- --btn-border-disabled: var(--button-success-border-disabled);
44
+ background-color: var(--color-success);
45
+ color: var(--color-white);
46
+ }
47
+ .btn.success:hover:not(:disabled) {
48
+ background-color: var(--color-green-600);
49
+ }
50
+ .btn.success:active:not(:disabled) {
51
+ background-color: var(--color-green-700);
34
52
  }
53
+ .btn.success:disabled {
54
+ background-color: var(--button-success-bg-disabled);
55
+ color: var(--button-success-text-disabled);
56
+ border: 1px solid var(--button-success-border-disabled);
57
+ }
58
+
35
59
  .btn.warning {
36
- --btn-bg: var(--color-warning);
37
- --btn-hover: var(--color-yellow-600);
38
- --btn-active: var(--color-yellow-700);
39
- --btn-bg-disabled: var(--button-warning-bg-disabled);
40
- --btn-text-disabled: var(--button-warning-text-disabled);
41
- --btn-border-disabled: var(--button-warning-border-disabled);
60
+ background-color: var(--color-warning);
61
+ color: var(--color-white);
62
+ }
63
+ .btn.warning:hover:not(:disabled) {
64
+ background-color: var(--color-yellow-600);
65
+ }
66
+ .btn.warning:active:not(:disabled) {
67
+ background-color: var(--color-yellow-700);
68
+ }
69
+ .btn.warning:disabled {
70
+ background-color: var(--button-warning-bg-disabled);
71
+ color: var(--button-warning-text-disabled);
72
+ border: 1px solid var(--button-warning-border-disabled);
42
73
  }
74
+
43
75
  .btn.danger {
44
- --btn-bg: var(--color-danger);
45
- --btn-hover: var(--color-red-600);
46
- --btn-active: var(--color-red-700);
47
- --btn-bg-disabled: var(--button-danger-bg-disabled);
48
- --btn-text-disabled: var(--button-danger-text-disabled);
49
- --btn-border-disabled: var(--button-danger-border-disabled);
76
+ background-color: var(--color-danger);
77
+ color: var(--color-white);
78
+ }
79
+ .btn.danger:hover:not(:disabled) {
80
+ background-color: var(--color-red-600);
81
+ }
82
+ .btn.danger:active:not(:disabled) {
83
+ background-color: var(--color-red-700);
84
+ }
85
+ .btn.danger:disabled {
86
+ background-color: var(--button-danger-bg-disabled);
87
+ color: var(--button-danger-text-disabled);
88
+ border: 1px solid var(--button-danger-border-disabled);
50
89
  }
90
+
51
91
  .btn.gray {
52
- --btn-bg: var(--color-gray-500);
53
- --btn-hover: var(--color-gray-600);
54
- --btn-active: var(--color-gray-700);
55
- --btn-bg-disabled: var(--button-gray-bg-disabled);
56
- --btn-text-disabled: var(--button-gray-text-disabled);
57
- --btn-border-disabled: var(--button-gray-border-disabled);
92
+ background-color: var(--color-gray-500);
93
+ color: var(--color-white);
94
+ }
95
+ .btn.gray:hover:not(:disabled) {
96
+ background-color: var(--color-gray-600);
97
+ }
98
+ .btn.gray:active:not(:disabled) {
99
+ background-color: var(--color-gray-700);
100
+ }
101
+ .btn.gray:disabled {
102
+ background-color: var(--button-gray-bg-disabled);
103
+ color: var(--button-gray-text-disabled);
104
+ border: 1px solid var(--button-gray-border-disabled);
58
105
  }
59
106
 
60
- .btn {
61
- background-color: var(--btn-bg);
107
+ .btn.outline {
108
+ background-color: transparent;
109
+ border: 1px solid var(--color-border-standard);
110
+ color: var(--color-text-body);
62
111
  }
63
- .btn:hover:not(:disabled) {
64
- background-color: var(--btn-hover);
112
+ .btn.outline:hover:not(:disabled) {
113
+ background-color: var(--color-bg-hover);
65
114
  }
66
- .btn:active:not(:disabled) {
67
- background-color: var(--btn-active);
115
+ .btn.outline:active:not(:disabled) {
116
+ background-color: var(--color-bg-input-standard);
68
117
  }
118
+
119
+ .btn.sm {
120
+ padding: var(--spacing-sm-y) var(--spacing-common-x);
121
+ font-size: var(--text-sm);
122
+ }
123
+ .btn.md {
124
+ padding: var(--spacing-common-y) var(--spacing-common-x);
125
+ font-size: var(--text-body);
126
+ }
127
+ .btn.lg {
128
+ padding: var(--spacing-small) var(--spacing-common-x);
129
+ font-size: var(--text-h6);
130
+ }
131
+
69
132
  .btn:disabled {
70
- background-color: var(--btn-bg-disabled);
71
- color: var(--btn-text-disabled);
72
133
  cursor: not-allowed;
73
134
  opacity: 0.7;
74
- border: 1px solid var(--btn-border-disabled);
75
- }
135
+ }
@@ -0,0 +1,112 @@
1
+ .dropdown-container {
2
+ position: relative;
3
+ display: inline-block;
4
+ }
5
+
6
+ .dropdown-trigger {
7
+ cursor: pointer;
8
+ display: flex;
9
+ }
10
+
11
+ .dropdown-content {
12
+ position: absolute;
13
+ z-index: 100;
14
+ background-color: var(--bg-card);
15
+ border: 1px solid var(--border-standard);
16
+ border-radius: 12px;
17
+ box-shadow: 0 10px 30px -5px rgba(0, 0, 0, 0.1), 0 8px 15px -6px rgba(0, 0, 0, 0.08);
18
+ padding: 1rem;
19
+ min-width: 200px;
20
+ opacity: 0;
21
+ visibility: hidden;
22
+ transform: scale(0.95) translateY(10px);
23
+ transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
24
+ pointer-events: none;
25
+ background-clip: padding-box;
26
+ }
27
+
28
+ .dropdown-content.is-open {
29
+ opacity: 1;
30
+ visibility: visible;
31
+ transform: scale(1) translateY(0);
32
+ pointer-events: auto;
33
+ }
34
+
35
+ /* Positions with directional scaling */
36
+ .dropdown-content.bottom-right {
37
+ top: 100%;
38
+ right: 0;
39
+ margin-top: 12px;
40
+ transform-origin: top right;
41
+ }
42
+
43
+ .dropdown-content.bottom-left {
44
+ top: 100%;
45
+ left: 0;
46
+ margin-top: 12px;
47
+ transform-origin: top left;
48
+ }
49
+
50
+ .dropdown-content.top-right {
51
+ bottom: 100%;
52
+ right: 0;
53
+ margin-bottom: 12px;
54
+ transform-origin: bottom right;
55
+ }
56
+
57
+ .dropdown-content.top-left {
58
+ bottom: 100%;
59
+ left: 0;
60
+ margin-bottom: 12px;
61
+ transform-origin: bottom left;
62
+ }
63
+
64
+ /* Premium Blur and Dark Mode Polish */
65
+ @supports (backdrop-filter: blur(20px)) {
66
+ .dropdown-content {
67
+ background-color: rgba(var(--dropdown-bg, 255, 255, 255), 0.85);
68
+ backdrop-filter: blur(20px);
69
+ }
70
+ }
71
+
72
+ .dark .dropdown-content {
73
+ --dropdown-bg: 34, 34, 34;
74
+ background-color: rgba(34, 34, 34, 0.85);
75
+ box-shadow: 0 20px 40px -5px rgba(0, 0, 0, 0.4), 0 10px 20px -5px rgba(0, 0, 0, 0.3);
76
+ border-color: rgba(255, 255, 255, 0.08);
77
+ }
78
+
79
+ .dropdown-item {
80
+ display: flex;
81
+ align-items: center;
82
+ gap: var(--spacing-gap-small);
83
+ padding: var(--spacing-sm-y, 8px) var(--spacing-common-x);
84
+ border-radius: var(--radius-common);
85
+ cursor: pointer;
86
+ transition: all 0.2s ease;
87
+ border: 1px solid transparent;
88
+ color: var(--text-standard);
89
+ }
90
+
91
+
92
+ .dropdown-item:hover {
93
+ background-color: var(--color-gray-100);
94
+ border-color: var(--color-gray-200);
95
+ }
96
+
97
+ .dark .dropdown-item:hover {
98
+ background-color: var(--color-dark-400);
99
+ border-color: var(--color-dark-500);
100
+ }
101
+
102
+ .dropdown-item:active {
103
+ background-color: var(--color-gray-200);
104
+ transform: scale(0.98);
105
+ }
106
+
107
+ .dark .dropdown-item:active {
108
+ background-color: var(--color-dark-500);
109
+ }
110
+
111
+
112
+
@@ -0,0 +1,103 @@
1
+ "use client";
2
+
3
+ import { useEffect, useRef, useState } from "react";
4
+ import clsx from "clsx";
5
+ import "./Dropdown.css";
6
+
7
+ type DropdownPosition = "bottom-right" | "bottom-left" | "top-right" | "top-left";
8
+
9
+ interface DropdownProps {
10
+ trigger: React.ReactNode;
11
+ children: React.ReactNode;
12
+ className?: string;
13
+ contentClassName?: string;
14
+ position?: DropdownPosition;
15
+ isOpen?: boolean;
16
+ onOpenChange?: (open: boolean) => void;
17
+ }
18
+
19
+ export const Dropdown = ({
20
+ trigger,
21
+ children,
22
+ className,
23
+ contentClassName,
24
+ position = "bottom-right",
25
+ isOpen: controlledIsOpen,
26
+ onOpenChange,
27
+ }: DropdownProps) => {
28
+ const [internalIsOpen, setInternalIsOpen] = useState(false);
29
+ const isOpen = controlledIsOpen !== undefined ? controlledIsOpen : internalIsOpen;
30
+
31
+ const dropdownRef = useRef<HTMLDivElement>(null);
32
+
33
+ const toggle = () => {
34
+ const nextValue = !isOpen;
35
+ if (controlledIsOpen === undefined) {
36
+ setInternalIsOpen(nextValue);
37
+ }
38
+ onOpenChange?.(nextValue);
39
+ };
40
+
41
+ const close = () => {
42
+ if (controlledIsOpen === undefined) {
43
+ setInternalIsOpen(false);
44
+ }
45
+ onOpenChange?.(false);
46
+ };
47
+
48
+ useEffect(() => {
49
+ const handleClickOutside = (event: MouseEvent) => {
50
+ if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {
51
+ close();
52
+ }
53
+ };
54
+
55
+ if (isOpen) {
56
+ document.addEventListener("mousedown", handleClickOutside);
57
+ } else {
58
+ document.removeEventListener("mousedown", handleClickOutside);
59
+ }
60
+
61
+ return () => {
62
+ document.removeEventListener("mousedown", handleClickOutside);
63
+ };
64
+ }, [isOpen]);
65
+
66
+ return (
67
+ <div className={clsx("dropdown-container", className)} ref={dropdownRef}>
68
+ <div className="dropdown-trigger" onClick={toggle}>
69
+ {trigger}
70
+ </div>
71
+ <div
72
+ className={clsx(
73
+ "dropdown-content",
74
+ position,
75
+ isOpen && "is-open",
76
+ contentClassName
77
+ )}
78
+ >
79
+ {children}
80
+ </div>
81
+ </div>
82
+ );
83
+ };
84
+
85
+ export const DropdownItem = ({
86
+ children,
87
+ className,
88
+ onClick,
89
+ }: {
90
+ children: React.ReactNode;
91
+ className?: string;
92
+ onClick?: () => void;
93
+ }) => {
94
+ return (
95
+ <div
96
+ className={clsx("dropdown-item", className)}
97
+ onClick={onClick}
98
+ >
99
+ {children}
100
+ </div>
101
+ );
102
+ };
103
+
@@ -50,7 +50,7 @@ export const Input = ({
50
50
  };
51
51
 
52
52
  export const Select = ({
53
- options,
53
+ options = [],
54
54
  disabled,
55
55
  }: {
56
56
  options: string[];