@galyan/ui 0.0.1 → 0.0.2

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 (90) hide show
  1. package/package.json +53 -22
  2. package/.turbo/turbo-build.log +0 -20
  3. package/eslint.config.mjs +0 -4
  4. package/src/accordion/Accordion.tsx +0 -88
  5. package/src/accordion/accordion.css +0 -78
  6. package/src/accordion/index.ts +0 -2
  7. package/src/animatednumber/AnimatedNumber.tsx +0 -71
  8. package/src/animatednumber/index.ts +0 -2
  9. package/src/banner/Banner.tsx +0 -84
  10. package/src/banner/banner.css +0 -56
  11. package/src/banner/index.ts +0 -2
  12. package/src/breadcrumb/Breadcrumb.tsx +0 -94
  13. package/src/breadcrumb/breadcrumb.css +0 -58
  14. package/src/breadcrumb/index.ts +0 -2
  15. package/src/button/Button.tsx +0 -98
  16. package/src/button/button.css +0 -190
  17. package/src/button/index.ts +0 -2
  18. package/src/button.tsx +0 -20
  19. package/src/calendar/Calendar.tsx +0 -190
  20. package/src/calendar/calendar.css +0 -142
  21. package/src/calendar/index.ts +0 -2
  22. package/src/card/Card.tsx +0 -88
  23. package/src/card/card.css +0 -115
  24. package/src/card/index.ts +0 -2
  25. package/src/card.tsx +0 -27
  26. package/src/chart/Chart.tsx +0 -186
  27. package/src/chart/index.ts +0 -2
  28. package/src/checkbox/Checkbox.tsx +0 -101
  29. package/src/checkbox/checkbox.css +0 -76
  30. package/src/checkbox/index.ts +0 -2
  31. package/src/chips/Chips.tsx +0 -146
  32. package/src/chips/chips.css +0 -90
  33. package/src/chips/index.ts +0 -2
  34. package/src/code.tsx +0 -11
  35. package/src/datepicker/DatePicker.tsx +0 -104
  36. package/src/datepicker/datepicker.css +0 -22
  37. package/src/datepicker/index.ts +0 -2
  38. package/src/dragdrop/DragDrop.tsx +0 -168
  39. package/src/dragdrop/dragdrop.css +0 -122
  40. package/src/dragdrop/index.ts +0 -2
  41. package/src/dropdown/Dropdown.tsx +0 -176
  42. package/src/dropdown/dropdown.css +0 -118
  43. package/src/dropdown/index.ts +0 -2
  44. package/src/fileupload/FileUpload.tsx +0 -144
  45. package/src/fileupload/fileupload.css +0 -118
  46. package/src/fileupload/index.ts +0 -2
  47. package/src/index.ts +0 -28
  48. package/src/input/Input.tsx +0 -121
  49. package/src/input/index.ts +0 -2
  50. package/src/input/input.css +0 -120
  51. package/src/menu/Menu.tsx +0 -118
  52. package/src/menu/index.ts +0 -2
  53. package/src/menu/menu.css +0 -117
  54. package/src/modal/Modal.tsx +0 -103
  55. package/src/modal/index.ts +0 -2
  56. package/src/modal/modal.css +0 -79
  57. package/src/progressbar/ProgressBar.tsx +0 -68
  58. package/src/progressbar/index.ts +0 -2
  59. package/src/progressbar/progressbar.css +0 -73
  60. package/src/radiogroup/RadioGroup.tsx +0 -73
  61. package/src/radiogroup/index.ts +0 -2
  62. package/src/radiogroup/radiogroup.css +0 -80
  63. package/src/skeleton/Skeleton.tsx +0 -61
  64. package/src/skeleton/index.ts +0 -2
  65. package/src/skeleton/skeleton.css +0 -46
  66. package/src/spinner/Spinner.tsx +0 -29
  67. package/src/spinner/index.ts +0 -2
  68. package/src/spinner/spinner.css +0 -39
  69. package/src/stepper/Stepper.tsx +0 -127
  70. package/src/stepper/index.ts +0 -2
  71. package/src/stepper/stepper.css +0 -141
  72. package/src/tab/Tabs.tsx +0 -71
  73. package/src/tab/index.ts +0 -2
  74. package/src/tab/tab.css +0 -92
  75. package/src/table/Table.tsx +0 -205
  76. package/src/table/index.ts +0 -2
  77. package/src/table/table.css +0 -119
  78. package/src/textarea/Textarea.tsx +0 -102
  79. package/src/textarea/index.ts +0 -2
  80. package/src/textarea/textarea.css +0 -85
  81. package/src/toaster/Toaster.tsx +0 -108
  82. package/src/toaster/index.ts +0 -2
  83. package/src/toaster/toaster.css +0 -113
  84. package/src/toggle/Toggle.tsx +0 -88
  85. package/src/toggle/index.ts +0 -2
  86. package/src/toggle/toggle.css +0 -63
  87. package/src/typography/Typography.tsx +0 -58
  88. package/src/typography/index.ts +0 -2
  89. package/src/typography/typography.css +0 -102
  90. package/tsconfig.json +0 -13
@@ -1,98 +0,0 @@
1
- 'use client';
2
-
3
- import React, { forwardRef, useCallback, useRef } from 'react';
4
- import './button.css';
5
-
6
- export type ButtonVariant = 'solid' | 'outline' | 'ghost' | 'soft' | 'link' | 'danger';
7
- export type ButtonSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
8
-
9
- export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
10
- variant?: ButtonVariant;
11
- size?: ButtonSize;
12
- loading?: boolean;
13
- fullWidth?: boolean;
14
- leftIcon?: React.ReactNode;
15
- rightIcon?: React.ReactNode;
16
- /** Render as a different element (e.g. 'a' for links) */
17
- as?: React.ElementType;
18
- href?: string;
19
- }
20
-
21
- export const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(
22
- {
23
- variant = 'solid',
24
- size = 'md',
25
- loading = false,
26
- fullWidth = false,
27
- leftIcon,
28
- rightIcon,
29
- disabled,
30
- children,
31
- className = '',
32
- onClick,
33
- as: Component = 'button',
34
- ...rest
35
- },
36
- ref
37
- ) {
38
- const rippleRef = useRef<HTMLSpanElement | null>(null);
39
-
40
- const handleClick = useCallback(
41
- (e: React.MouseEvent<HTMLButtonElement>) => {
42
- // Ripple effect
43
- const btn = e.currentTarget;
44
- const rect = btn.getBoundingClientRect();
45
- const size = Math.max(rect.width, rect.height);
46
- const x = e.clientX - rect.left - size / 2;
47
- const y = e.clientY - rect.top - size / 2;
48
-
49
- const ripple = document.createElement('span');
50
- ripple.className = 'gy-btn__ripple';
51
- ripple.style.width = ripple.style.height = `${size}px`;
52
- ripple.style.left = `${x}px`;
53
- ripple.style.top = `${y}px`;
54
- btn.appendChild(ripple);
55
- setTimeout(() => ripple.remove(), 600);
56
-
57
- onClick?.(e);
58
- },
59
- [onClick]
60
- );
61
-
62
- const isDisabled = disabled || loading;
63
- const iconOnly = !children && (leftIcon || rightIcon);
64
-
65
- const classes = [
66
- 'gy-btn',
67
- `gy-btn--${variant}`,
68
- `gy-btn--${size}`,
69
- fullWidth ? 'gy-btn--full' : '',
70
- loading ? 'gy-btn--loading' : '',
71
- iconOnly ? 'gy-btn--icon-only' : '',
72
- isDisabled ? 'gy-btn--disabled' : '',
73
- className,
74
- ]
75
- .filter(Boolean)
76
- .join(' ');
77
-
78
- return (
79
- <Component
80
- ref={ref}
81
- className={classes}
82
- disabled={isDisabled}
83
- onClick={handleClick}
84
- aria-busy={loading}
85
- {...rest}
86
- >
87
- {loading ? (
88
- <span className="gy-btn__spinner" aria-hidden="true" />
89
- ) : (
90
- leftIcon && <span className="gy-btn__icon gy-btn__icon--left" aria-hidden="true">{leftIcon}</span>
91
- )}
92
- {children && <span>{children}</span>}
93
- {!loading && rightIcon && (
94
- <span className="gy-btn__icon gy-btn__icon--right" aria-hidden="true">{rightIcon}</span>
95
- )}
96
- </Component>
97
- );
98
- });
@@ -1,190 +0,0 @@
1
- /* ── Button Component ─────────────────────────────────────────────────────── */
2
- .gy-btn {
3
- display: inline-flex;
4
- align-items: center;
5
- justify-content: center;
6
- gap: var(--gy-spacing-2);
7
- font-family: var(--gy-font-sans);
8
- font-weight: var(--gy-font-weight-medium);
9
- letter-spacing: var(--gy-letter-spacing-wide);
10
- border-radius: var(--gy-radius-lg);
11
- border: 1.5px solid transparent;
12
- cursor: pointer;
13
- transition:
14
- background-color var(--gy-duration-fast) var(--gy-ease-in-out),
15
- border-color var(--gy-duration-fast) var(--gy-ease-in-out),
16
- color var(--gy-duration-fast) var(--gy-ease-in-out),
17
- box-shadow var(--gy-duration-fast) var(--gy-ease-in-out),
18
- transform var(--gy-duration-fast) var(--gy-ease-out);
19
- user-select: none;
20
- white-space: nowrap;
21
- text-decoration: none;
22
- position: relative;
23
- overflow: hidden;
24
- -webkit-tap-highlight-color: transparent;
25
- }
26
-
27
- .gy-btn:focus-visible {
28
- outline: none;
29
- box-shadow: 0 0 0 3px var(--gy-focus-ring);
30
- }
31
-
32
- .gy-btn:active:not(:disabled) {
33
- transform: scale(0.97);
34
- }
35
-
36
- /* ── Sizes ────────────────────────────────────────────────────────────────── */
37
- .gy-btn--xs {
38
- height: 1.75rem;
39
- padding: 0 var(--gy-spacing-2);
40
- font-size: var(--gy-font-size-xs);
41
- border-radius: var(--gy-radius-md);
42
- }
43
-
44
- .gy-btn--sm {
45
- height: 2rem;
46
- padding: 0 var(--gy-spacing-3);
47
- font-size: var(--gy-font-size-sm);
48
- }
49
-
50
- .gy-btn--md {
51
- height: 2.5rem;
52
- padding: 0 var(--gy-spacing-4);
53
- font-size: var(--gy-font-size-sm);
54
- }
55
-
56
- .gy-btn--lg {
57
- height: 2.75rem;
58
- padding: 0 var(--gy-spacing-5);
59
- font-size: var(--gy-font-size-md);
60
- }
61
-
62
- .gy-btn--xl {
63
- height: 3.25rem;
64
- padding: 0 var(--gy-spacing-6);
65
- font-size: var(--gy-font-size-lg);
66
- }
67
-
68
- /* ── Variants ─────────────────────────────────────────────────────────────── */
69
-
70
- /* Solid */
71
- .gy-btn--solid {
72
- background-color: var(--gy-primary);
73
- border-color: var(--gy-primary);
74
- color: var(--gy-primary-fg);
75
- }
76
-
77
- .gy-btn--solid:hover:not(:disabled) {
78
- background-color: var(--gy-primary-hover);
79
- border-color: var(--gy-primary-hover);
80
- }
81
-
82
- .gy-btn--solid:active:not(:disabled) {
83
- background-color: var(--gy-primary-active);
84
- }
85
-
86
- /* Outline */
87
- .gy-btn--outline {
88
- background-color: transparent;
89
- border-color: var(--gy-primary);
90
- color: var(--gy-primary);
91
- }
92
-
93
- .gy-btn--outline:hover:not(:disabled) {
94
- background-color: var(--gy-primary-subtle);
95
- }
96
-
97
- /* Ghost */
98
- .gy-btn--ghost {
99
- background-color: transparent;
100
- border-color: transparent;
101
- color: var(--gy-primary);
102
- }
103
-
104
- .gy-btn--ghost:hover:not(:disabled) {
105
- background-color: var(--gy-primary-subtle);
106
- }
107
-
108
- /* Soft */
109
- .gy-btn--soft {
110
- background-color: var(--gy-primary-subtle);
111
- border-color: transparent;
112
- color: var(--gy-primary-hover);
113
- }
114
-
115
- .gy-btn--soft:hover:not(:disabled) {
116
- background-color: var(--gy-primary-muted);
117
- }
118
-
119
- /* Link */
120
- .gy-btn--link {
121
- background-color: transparent;
122
- border-color: transparent;
123
- color: var(--gy-text-link);
124
- text-decoration: underline;
125
- text-underline-offset: 2px;
126
- height: auto;
127
- padding: 0;
128
- }
129
-
130
- .gy-btn--link:hover:not(:disabled) {
131
- color: var(--gy-text-link-hover);
132
- }
133
-
134
- /* Danger variant */
135
- .gy-btn--danger {
136
- background-color: var(--gy-danger);
137
- border-color: var(--gy-danger);
138
- color: var(--gy-danger-fg);
139
- }
140
-
141
- .gy-btn--danger:hover:not(:disabled) {
142
- background-color: var(--gy-danger-emphasis);
143
- border-color: var(--gy-danger-emphasis);
144
- }
145
-
146
- /* ── Full width ──────────────────────────────────────────────────────────── */
147
- .gy-btn--full {
148
- width: 100%;
149
- }
150
-
151
- /* ── Disabled ────────────────────────────────────────────────────────────── */
152
- .gy-btn:disabled,
153
- .gy-btn--disabled {
154
- cursor: not-allowed;
155
- opacity: 0.5;
156
- transform: none !important;
157
- }
158
-
159
- /* ── Loading ─────────────────────────────────────────────────────────────── */
160
- .gy-btn--loading {
161
- cursor: wait;
162
- pointer-events: none;
163
- }
164
-
165
- .gy-btn__spinner {
166
- width: 1em;
167
- height: 1em;
168
- border: 2px solid currentColor;
169
- border-top-color: transparent;
170
- border-radius: 50%;
171
- animation: gy-spin var(--gy-duration-slower) linear infinite;
172
- flex-shrink: 0;
173
- }
174
-
175
- /* ── Icon-only ──────────────────────────────────────────────────────────── */
176
- .gy-btn--icon-only.gy-btn--xs { width: 1.75rem; padding: 0; }
177
- .gy-btn--icon-only.gy-btn--sm { width: 2rem; padding: 0; }
178
- .gy-btn--icon-only.gy-btn--md { width: 2.5rem; padding: 0; }
179
- .gy-btn--icon-only.gy-btn--lg { width: 2.75rem; padding: 0; }
180
- .gy-btn--icon-only.gy-btn--xl { width: 3.25rem; padding: 0; }
181
-
182
- /* ── Ripple effect ───────────────────────────────────────────────────────── */
183
- .gy-btn__ripple {
184
- position: absolute;
185
- border-radius: 50%;
186
- background: rgba(255, 255, 255, 0.3);
187
- transform: scale(0);
188
- animation: gy-ripple 0.6s linear;
189
- pointer-events: none;
190
- }
@@ -1,2 +0,0 @@
1
- export { Button } from './Button';
2
- export type { ButtonProps, ButtonVariant, ButtonSize } from './Button';
package/src/button.tsx DELETED
@@ -1,20 +0,0 @@
1
- "use client";
2
-
3
- import { ReactNode } from "react";
4
-
5
- interface ButtonProps {
6
- children: ReactNode;
7
- className?: string;
8
- appName: string;
9
- }
10
-
11
- export const Button = ({ children, className, appName }: ButtonProps) => {
12
- return (
13
- <button
14
- className={className}
15
- onClick={() => alert(`Hello from your ${appName} app!`)}
16
- >
17
- {children}
18
- </button>
19
- );
20
- };
@@ -1,190 +0,0 @@
1
- 'use client';
2
-
3
- import React, { useState } from 'react';
4
- import './calendar.css';
5
-
6
- export interface CalendarProps {
7
- mode?: 'single' | 'range';
8
- value?: Date | [Date, Date];
9
- onChange?: (date: Date | [Date, Date]) => void;
10
- minDate?: Date;
11
- maxDate?: Date;
12
- className?: string;
13
- style?: React.CSSProperties;
14
- }
15
-
16
- const getDaysInMonth = (year: number, month: number) => new Date(year, month + 1, 0).getDate();
17
- const getFirstDay = (year: number, month: number) => new Date(year, month, 1).getDay();
18
-
19
- const isSameDay = (d1?: Date, d2?: Date) => {
20
- if (!d1 || !d2) return false;
21
- return d1.getFullYear() === d2.getFullYear() && d1.getMonth() === d2.getMonth() && d1.getDate() === d2.getDate();
22
- };
23
-
24
- const isBetween = (d: Date, start?: Date, end?: Date) => {
25
- if (!start || !end) return false;
26
- return d > start && d < end;
27
- };
28
-
29
- export function Calendar({ mode = 'single', value, onChange, minDate, maxDate, className = '', style }: CalendarProps) {
30
- const [view, setView] = useState<'days' | 'months' | 'years'>('days');
31
- const [current, setCurrent] = useState(() => {
32
- if (Array.isArray(value)) return value[0] ?? new Date();
33
- return value ?? new Date();
34
- });
35
- const [hoverDate, setHoverDate] = useState<Date | null>(null);
36
-
37
- const [selStart, selEnd] = Array.isArray(value) ? value : [value, undefined];
38
-
39
- const y = current.getFullYear();
40
- const m = current.getMonth();
41
-
42
- const prevMonth = () => setCurrent(new Date(y, m - 1, 1));
43
- const nextMonth = () => setCurrent(new Date(y, m + 1, 1));
44
- const prevYear = () => setCurrent(new Date(y - 1, m, 1));
45
- const nextYear = () => setCurrent(new Date(y + 1, m, 1));
46
- const prevDecade = () => setCurrent(new Date(y - 10, m, 1));
47
- const nextDecade = () => setCurrent(new Date(y + 10, m, 1));
48
-
49
- const daysInMonth = getDaysInMonth(y, m);
50
- const firstDay = getFirstDay(y, m);
51
- const daysInPrev = getDaysInMonth(y, m - 1);
52
-
53
- const handleSelectDay = (date: Date) => {
54
- if (mode === 'single') {
55
- onChange?.(date);
56
- } else {
57
- if (!selStart || (selStart && selEnd)) {
58
- onChange?.([date, date] as any); // Reset to start
59
- } else {
60
- const start = date < selStart ? date : selStart;
61
- const end = date < selStart ? selStart : date;
62
- onChange?.([start, end]);
63
- }
64
- }
65
- };
66
-
67
- const renderDays = () => {
68
- const days = [];
69
- const today = new Date();
70
-
71
- // Prev month
72
- for (let i = firstDay - 1; i >= 0; i--) {
73
- const d = new Date(y, m - 1, daysInPrev - i);
74
- days.push(<Day key={`prev-${i}`} date={d} outside />);
75
- }
76
- // Current month
77
- for (let i = 1; i <= daysInMonth; i++) {
78
- const d = new Date(y, m, i);
79
- days.push(<Day key={`curr-${i}`} date={d} isToday={isSameDay(d, today)} />);
80
- }
81
- // Next month
82
- const total = days.length;
83
- for (let i = 1; i <= 42 - total; i++) {
84
- const d = new Date(y, m + 1, i);
85
- days.push(<Day key={`next-${i}`} date={d} outside />);
86
- }
87
-
88
- return days;
89
- };
90
-
91
- const Day = ({ date, outside, isToday }: { date: Date; outside?: boolean; isToday?: boolean }) => {
92
- const disabled = (minDate && date < minDate) || (maxDate && date > maxDate);
93
- const selected = isSameDay(date, selStart) || isSameDay(date, selEnd);
94
- const inRange = mode === 'range' && isBetween(date, selStart, selEnd ?? hoverDate ?? undefined);
95
- const isStart = mode === 'range' && isSameDay(date, selStart);
96
- const isEnd = mode === 'range' && isSameDay(date, selEnd ?? hoverDate ?? undefined) && date > (selStart as Date);
97
-
98
- const cls = [
99
- 'gy-calendar-day',
100
- outside ? 'gy-calendar-day--outside' : '',
101
- isToday ? 'gy-calendar-day--today' : '',
102
- selected ? 'gy-calendar-day--selected' : '',
103
- inRange ? 'gy-calendar-day--range-in' : '',
104
- isStart && (selEnd ?? hoverDate) ? 'gy-calendar-day--range-start' : '',
105
- isEnd ? 'gy-calendar-day--range-end' : '',
106
- disabled ? 'gy-calendar-day--disabled' : '',
107
- ]
108
- .filter(Boolean)
109
- .join(' ');
110
-
111
- return (
112
- <button
113
- type="button"
114
- className={cls}
115
- disabled={disabled}
116
- onClick={() => handleSelectDay(date)}
117
- onMouseEnter={() => mode === 'range' && selStart && !selEnd ? setHoverDate(date) : null}
118
- >
119
- {date.getDate()}
120
- </button>
121
- );
122
- };
123
-
124
- const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
125
- const monthName = current.toLocaleString('default', { month: 'long' });
126
-
127
- return (
128
- <div className={`gy-calendar ${className}`} style={style}>
129
- {view === 'days' && (
130
- <>
131
- <div className="gy-calendar-header">
132
- <button className="gy-calendar-nav" onClick={prevMonth}>‹</button>
133
- <div className="gy-calendar-title" onClick={() => setView('months')}>
134
- {monthName} {y}
135
- </div>
136
- <button className="gy-calendar-nav" onClick={nextMonth}>›</button>
137
- </div>
138
- <div className="gy-calendar-grid">
139
- {['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'].map((d) => (
140
- <div key={d} className="gy-calendar-weekday">{d}</div>
141
- ))}
142
- {renderDays()}
143
- </div>
144
- </>
145
- )}
146
-
147
- {view === 'months' && (
148
- <>
149
- <div className="gy-calendar-header">
150
- <button className="gy-calendar-nav" onClick={prevYear}>‹</button>
151
- <div className="gy-calendar-title" onClick={() => setView('years')}>{y}</div>
152
- <button className="gy-calendar-nav" onClick={nextYear}>›</button>
153
- </div>
154
- <div className="gy-calendar-picker-grid">
155
- {months.map((mon, i) => (
156
- <button
157
- key={mon}
158
- className={`gy-calendar-picker-item ${m === i ? 'gy-calendar-picker-item--selected' : ''}`}
159
- onClick={() => { setCurrent(new Date(y, i, 1)); setView('days'); }}
160
- >
161
- {mon}
162
- </button>
163
- ))}
164
- </div>
165
- </>
166
- )}
167
-
168
- {view === 'years' && (
169
- <>
170
- <div className="gy-calendar-header">
171
- <button className="gy-calendar-nav" onClick={prevDecade}>‹</button>
172
- <div className="gy-calendar-title">{y - (y % 10)} - {y - (y % 10) + 9}</div>
173
- <button className="gy-calendar-nav" onClick={nextDecade}>›</button>
174
- </div>
175
- <div className="gy-calendar-picker-grid">
176
- {Array.from({ length: 12 }, (_, i) => y - (y % 10) - 1 + i).map((year) => (
177
- <button
178
- key={year}
179
- className={`gy-calendar-picker-item ${y === year ? 'gy-calendar-picker-item--selected' : ''}`}
180
- onClick={() => { setCurrent(new Date(year, m, 1)); setView('months'); }}
181
- >
182
- {year}
183
- </button>
184
- ))}
185
- </div>
186
- </>
187
- )}
188
- </div>
189
- );
190
- }
@@ -1,142 +0,0 @@
1
- /* ── Calendar ────────────────────────────────────────────────────────────── */
2
- .gy-calendar {
3
- display: inline-flex;
4
- flex-direction: column;
5
- background: var(--gy-surface);
6
- border: 1px solid var(--gy-border);
7
- border-radius: var(--gy-radius-xl);
8
- padding: var(--gy-spacing-4);
9
- width: 320px;
10
- }
11
-
12
- .gy-calendar-header {
13
- display: flex;
14
- align-items: center;
15
- justify-content: space-between;
16
- margin-bottom: var(--gy-spacing-4);
17
- }
18
-
19
- .gy-calendar-title {
20
- font-size: var(--gy-font-size-sm);
21
- font-weight: var(--gy-font-weight-semibold);
22
- color: var(--gy-text);
23
- cursor: pointer;
24
- padding: var(--gy-spacing-1) var(--gy-spacing-2);
25
- border-radius: var(--gy-radius-md);
26
- transition: background var(--gy-duration-fast);
27
- }
28
-
29
- .gy-calendar-title:hover {
30
- background: var(--gy-background-muted);
31
- }
32
-
33
- .gy-calendar-nav {
34
- display: flex;
35
- align-items: center;
36
- justify-content: center;
37
- width: 1.75rem;
38
- height: 1.75rem;
39
- border-radius: var(--gy-radius-md);
40
- background: none;
41
- border: 1px solid transparent;
42
- color: var(--gy-text-muted);
43
- cursor: pointer;
44
- transition: background var(--gy-duration-fast), color var(--gy-duration-fast);
45
- }
46
-
47
- .gy-calendar-nav:hover {
48
- background: var(--gy-background-muted);
49
- color: var(--gy-text);
50
- }
51
-
52
- /* Grid */
53
- .gy-calendar-grid {
54
- display: grid;
55
- grid-template-columns: repeat(7, 1fr);
56
- gap: 2px;
57
- text-align: center;
58
- }
59
-
60
- .gy-calendar-weekday {
61
- font-size: var(--gy-font-size-xs);
62
- font-weight: var(--gy-font-weight-medium);
63
- color: var(--gy-text-subtle);
64
- padding-bottom: var(--gy-spacing-2);
65
- }
66
-
67
- .gy-calendar-day {
68
- display: flex;
69
- align-items: center;
70
- justify-content: center;
71
- aspect-ratio: 1;
72
- font-size: var(--gy-font-size-sm);
73
- color: var(--gy-text);
74
- background: none;
75
- border: none;
76
- border-radius: var(--gy-radius-full);
77
- cursor: pointer;
78
- transition: background var(--gy-duration-fast), color var(--gy-duration-fast);
79
- }
80
-
81
- .gy-calendar-day:hover:not(.gy-calendar-day--disabled):not(.gy-calendar-day--selected) {
82
- background: var(--gy-background-muted);
83
- }
84
-
85
- .gy-calendar-day--outside {
86
- color: var(--gy-text-subtle);
87
- opacity: 0.5;
88
- }
89
-
90
- .gy-calendar-day--today {
91
- color: var(--gy-primary);
92
- font-weight: var(--gy-font-weight-bold);
93
- }
94
-
95
- .gy-calendar-day--selected {
96
- background: var(--gy-primary);
97
- color: var(--gy-primary-fg);
98
- font-weight: var(--gy-font-weight-semibold);
99
- }
100
-
101
- .gy-calendar-day--range-in {
102
- background: var(--gy-primary-subtle);
103
- border-radius: 0;
104
- color: var(--gy-text);
105
- }
106
-
107
- .gy-calendar-day--range-start {
108
- border-radius: var(--gy-radius-full) 0 0 var(--gy-radius-full);
109
- }
110
-
111
- .gy-calendar-day--range-end {
112
- border-radius: 0 var(--gy-radius-full) var(--gy-radius-full) 0;
113
- }
114
-
115
- .gy-calendar-day--disabled {
116
- opacity: 0.3;
117
- cursor: not-allowed;
118
- }
119
-
120
- /* Month/Year Picker */
121
- .gy-calendar-picker-grid {
122
- display: grid;
123
- grid-template-columns: repeat(3, 1fr);
124
- gap: var(--gy-spacing-2);
125
- }
126
-
127
- .gy-calendar-picker-item {
128
- padding: var(--gy-spacing-2) 0;
129
- font-size: var(--gy-font-size-sm);
130
- color: var(--gy-text);
131
- background: none;
132
- border: none;
133
- border-radius: var(--gy-radius-lg);
134
- cursor: pointer;
135
- transition: background var(--gy-duration-fast);
136
- }
137
-
138
- .gy-calendar-picker-item:hover { background: var(--gy-background-muted); }
139
- .gy-calendar-picker-item--selected {
140
- background: var(--gy-primary);
141
- color: var(--gy-primary-fg);
142
- }
@@ -1,2 +0,0 @@
1
- export { Calendar } from './Calendar';
2
- export type { CalendarProps } from './Calendar';