@tale-ui/react-styles 0.0.3

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.
package/src/slider.css ADDED
@@ -0,0 +1,139 @@
1
+ /*
2
+ * Slider — @tale-ui/react
3
+ *
4
+ * Styled with @tale-ui/core design tokens.
5
+ * Base-ui Slider exposes:
6
+ * Root: [data-disabled] [data-dragging] [data-orientation]
7
+ * [data-valid] [data-invalid] [data-touched] [data-dirty] [data-focused]
8
+ * Thumb: [data-index] [data-dragging] [data-orientation]
9
+ * [data-disabled] [data-focused]
10
+ * Track: (inherits root orientation)
11
+ * Indicator: (filled portion of track)
12
+ *
13
+ * Usage:
14
+ * <Slider.Root className="tale-slider">
15
+ * <Slider.Control className="tale-slider__control">
16
+ * <Slider.Track className="tale-slider__track">
17
+ * <Slider.Indicator className="tale-slider__indicator" />
18
+ * <Slider.Thumb className="tale-slider__thumb" />
19
+ * </Slider.Track>
20
+ * </Slider.Control>
21
+ * </Slider.Root>
22
+ */
23
+
24
+ /* ─── Root ─────────────────────────────────────────────────────────────────── */
25
+
26
+ .tale-slider {
27
+ display: flex;
28
+ flex-direction: column;
29
+ gap: var(--space-4xs);
30
+ width: 100%;
31
+ touch-action: none;
32
+ }
33
+
34
+ /* ─── Control — touch-active area ────────────────────────────────────────── */
35
+
36
+ .tale-slider__control {
37
+ display: flex;
38
+ align-items: center;
39
+ width: 100%;
40
+ height: 2rem;
41
+ cursor: pointer;
42
+ }
43
+
44
+ .tale-slider[data-orientation="vertical"] .tale-slider__control {
45
+ flex-direction: column;
46
+ width: 2rem;
47
+ height: 16rem;
48
+ }
49
+
50
+ .tale-slider[data-disabled] .tale-slider__control {
51
+ cursor: not-allowed;
52
+ }
53
+
54
+ /* ─── Track ───────────────────────────────────────────────────────────────── */
55
+
56
+ .tale-slider__track {
57
+ position: relative;
58
+ flex: 1;
59
+ height: 0.4rem;
60
+ border-radius: 9999px;
61
+ background-color: var(--neutral-22);
62
+ overflow: hidden;
63
+ }
64
+
65
+ .tale-slider[data-orientation="vertical"] .tale-slider__track {
66
+ width: 0.4rem;
67
+ height: 100%;
68
+ flex: 1;
69
+ }
70
+
71
+ /* ─── Indicator — filled portion ──────────────────────────────────────────── */
72
+
73
+ .tale-slider__indicator {
74
+ position: absolute;
75
+ top: 0;
76
+ left: 0;
77
+ height: 100%;
78
+ background-color: var(--color-60);
79
+ border-radius: 9999px;
80
+ transition: background-color 0.15s ease;
81
+ }
82
+
83
+ .tale-slider[data-orientation="vertical"] .tale-slider__indicator {
84
+ width: 100%;
85
+ height: auto;
86
+ bottom: 0;
87
+ top: auto;
88
+ }
89
+
90
+ .tale-slider[data-disabled] .tale-slider__indicator {
91
+ background-color: var(--neutral-40);
92
+ }
93
+
94
+ /* ─── Thumb ───────────────────────────────────────────────────────────────── */
95
+
96
+ .tale-slider__thumb {
97
+ position: absolute;
98
+ width: 1.8rem;
99
+ height: 1.8rem;
100
+ border-radius: 50%;
101
+ background-color: var(--neutral-100);
102
+ border: 2px solid var(--color-60);
103
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.15);
104
+ top: 50%;
105
+ transform: translateY(-50%);
106
+ outline: none;
107
+ transition: box-shadow 0.15s ease, border-color 0.15s ease, transform 0.1s ease;
108
+ cursor: grab;
109
+ }
110
+
111
+ .tale-slider__thumb:focus-visible {
112
+ box-shadow: 0 0 0 2px var(--neutral-100), 0 0 0 4px var(--color-60);
113
+ }
114
+
115
+ .tale-slider__thumb[data-dragging] {
116
+ cursor: grabbing;
117
+ transform: translateY(-50%) scale(1.15);
118
+ }
119
+
120
+ .tale-slider[data-orientation="vertical"] .tale-slider__thumb {
121
+ left: 50%;
122
+ top: auto;
123
+ transform: translateX(-50%);
124
+ }
125
+
126
+ .tale-slider[data-orientation="vertical"] .tale-slider__thumb[data-dragging] {
127
+ transform: translateX(-50%) scale(1.15);
128
+ }
129
+
130
+ /* ─── Disabled state ──────────────────────────────────────────────────────── */
131
+
132
+ .tale-slider[data-disabled] {
133
+ opacity: 0.45;
134
+ }
135
+
136
+ .tale-slider[data-disabled] .tale-slider__thumb {
137
+ cursor: not-allowed;
138
+ border-color: var(--neutral-40);
139
+ }
package/src/switch.css ADDED
@@ -0,0 +1,90 @@
1
+ /*
2
+ * Switch — @tale-ui/react
3
+ *
4
+ * Styled with @tale-ui/core design tokens.
5
+ * Base-ui Switch exposes:
6
+ * Root: [data-checked] [data-unchecked] [data-disabled]
7
+ * [data-readonly] [data-required] [data-valid] [data-invalid]
8
+ * [data-focused]
9
+ * Thumb: [data-checked] [data-unchecked] [data-disabled]
10
+ *
11
+ * Usage:
12
+ * <Switch.Root className="tale-switch">
13
+ * <Switch.Thumb className="tale-switch__thumb" />
14
+ * </Switch.Root>
15
+ */
16
+
17
+ /* ─── Root — pill-shaped track ────────────────────────────────────────────── */
18
+
19
+ .tale-switch {
20
+ display: inline-flex;
21
+ align-items: center;
22
+ width: 4rem;
23
+ height: 2.2rem;
24
+ border-radius: 9999px;
25
+ border: 1.5px solid var(--neutral-30);
26
+ background-color: var(--neutral-20);
27
+ padding: 0 0.2rem;
28
+ cursor: pointer;
29
+ outline: none;
30
+ transition:
31
+ background-color 0.2s ease,
32
+ border-color 0.2s ease,
33
+ box-shadow 0.2s ease;
34
+ flex-shrink: 0;
35
+ }
36
+
37
+ .tale-switch:focus-visible {
38
+ box-shadow: 0 0 0 2px var(--neutral-100), 0 0 0 4px var(--color-60);
39
+ }
40
+
41
+ /* ─── Checked (on) state ──────────────────────────────────────────────────── */
42
+
43
+ .tale-switch[data-checked] {
44
+ background-color: var(--color-60);
45
+ border-color: var(--color-60);
46
+ }
47
+
48
+ .tale-switch[data-checked]:hover:not([data-disabled]) {
49
+ background-color: var(--color-50);
50
+ border-color: var(--color-50);
51
+ }
52
+
53
+ /* ─── Hover (off) ─────────────────────────────────────────────────────────── */
54
+
55
+ .tale-switch:hover:not([data-disabled]):not([data-checked]) {
56
+ border-color: var(--neutral-50);
57
+ background-color: var(--neutral-26);
58
+ }
59
+
60
+ /* ─── Invalid state ───────────────────────────────────────────────────────── */
61
+
62
+ .tale-switch[data-invalid] {
63
+ border-color: var(--red-60);
64
+ }
65
+
66
+ /* ─── Disabled state ──────────────────────────────────────────────────────── */
67
+
68
+ .tale-switch[data-disabled] {
69
+ opacity: 0.45;
70
+ cursor: not-allowed;
71
+ pointer-events: none;
72
+ }
73
+
74
+ /* ─── Thumb — sliding circle ──────────────────────────────────────────────── */
75
+
76
+ .tale-switch__thumb {
77
+ width: 1.4rem;
78
+ height: 1.4rem;
79
+ border-radius: 50%;
80
+ background-color: var(--neutral-80);
81
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
82
+ transition: transform 0.2s ease, background-color 0.2s ease;
83
+ transform: translateX(0);
84
+ flex-shrink: 0;
85
+ }
86
+
87
+ .tale-switch__thumb[data-checked] {
88
+ transform: translateX(1.6rem);
89
+ background-color: var(--neutral-100);
90
+ }
package/src/tabs.css ADDED
@@ -0,0 +1,126 @@
1
+ /*
2
+ * Tabs — @tale-ui/react
3
+ *
4
+ * Styled with @tale-ui/core design tokens.
5
+ * Base-ui Tabs exposes:
6
+ * Root: [data-orientation] [data-activation-direction]
7
+ * Tab: [data-active] [data-disabled] [data-orientation] [data-activation-direction]
8
+ * Panel: [data-hidden] [data-index] [data-orientation]
9
+ * Indicator: (active tab highlight bar)
10
+ *
11
+ * Usage:
12
+ * <Tabs.Root className="tale-tabs">
13
+ * <Tabs.List className="tale-tabs__list">
14
+ * <Tabs.Tab className="tale-tabs__tab">Tab 1</Tabs.Tab>
15
+ * <Tabs.Indicator className="tale-tabs__indicator" />
16
+ * </Tabs.List>
17
+ * <Tabs.Panel className="tale-tabs__panel">Content</Tabs.Panel>
18
+ * </Tabs.Root>
19
+ */
20
+
21
+ /* ─── Root ─────────────────────────────────────────────────────────────────── */
22
+
23
+ .tale-tabs {
24
+ display: flex;
25
+ flex-direction: column;
26
+ gap: 0;
27
+ }
28
+
29
+ .tale-tabs[data-orientation="vertical"] {
30
+ flex-direction: row;
31
+ }
32
+
33
+ /* ─── List ─────────────────────────────────────────────────────────────────── */
34
+
35
+ .tale-tabs__list {
36
+ position: relative;
37
+ display: flex;
38
+ flex-direction: row;
39
+ border-bottom: 2px solid var(--neutral-18);
40
+ gap: 0;
41
+ }
42
+
43
+ .tale-tabs[data-orientation="vertical"] .tale-tabs__list {
44
+ flex-direction: column;
45
+ border-bottom: none;
46
+ border-right: 2px solid var(--neutral-18);
47
+ }
48
+
49
+ /* ─── Tab ──────────────────────────────────────────────────────────────────── */
50
+
51
+ .tale-tabs__tab {
52
+ display: inline-flex;
53
+ align-items: center;
54
+ justify-content: center;
55
+ padding: var(--space-xs) var(--space-m);
56
+ border: none;
57
+ background-color: transparent;
58
+ color: var(--neutral-60);
59
+ font-family: var(--label-font-family);
60
+ font-size: var(--label-m-font-size);
61
+ font-weight: var(--label-font-weight);
62
+ cursor: pointer;
63
+ outline: none;
64
+ transition: color 0.15s ease, background-color 0.15s ease;
65
+ white-space: nowrap;
66
+ position: relative;
67
+ }
68
+
69
+ .tale-tabs__tab:hover:not([data-disabled]):not([data-active]) {
70
+ color: var(--neutral-80);
71
+ background-color: var(--neutral-12);
72
+ }
73
+
74
+ .tale-tabs__tab:focus-visible {
75
+ box-shadow: inset 0 0 0 2px var(--color-60);
76
+ border-radius: 0.4rem;
77
+ }
78
+
79
+ .tale-tabs__tab[data-active] {
80
+ color: var(--color-60);
81
+ }
82
+
83
+ .tale-tabs__tab[data-disabled] {
84
+ opacity: 0.45;
85
+ cursor: not-allowed;
86
+ pointer-events: none;
87
+ }
88
+
89
+ /* ─── Indicator ────────────────────────────────────────────────────────────── */
90
+
91
+ .tale-tabs__indicator {
92
+ position: absolute;
93
+ bottom: -2px;
94
+ height: 2px;
95
+ background-color: var(--color-60);
96
+ border-radius: 9999px 9999px 0 0;
97
+ transition: left 0.25s ease, width 0.25s ease, top 0.25s ease, height 0.25s ease;
98
+ }
99
+
100
+ .tale-tabs[data-orientation="vertical"] .tale-tabs__indicator {
101
+ bottom: auto;
102
+ right: -2px;
103
+ left: auto;
104
+ width: 2px;
105
+ height: auto;
106
+ border-radius: 0 9999px 9999px 0;
107
+ }
108
+
109
+ /* ─── Panel ────────────────────────────────────────────────────────────────── */
110
+
111
+ .tale-tabs__panel {
112
+ padding: var(--space-m) 0;
113
+ color: var(--neutral-80);
114
+ font-family: var(--body-font-family);
115
+ font-size: var(--text-m-font-size);
116
+ line-height: 1.6;
117
+ outline: none;
118
+ }
119
+
120
+ .tale-tabs[data-orientation="vertical"] .tale-tabs__panel {
121
+ padding: 0 var(--space-m);
122
+ }
123
+
124
+ .tale-tabs__panel[data-hidden] {
125
+ display: none;
126
+ }
package/src/toast.css ADDED
@@ -0,0 +1,162 @@
1
+ /*
2
+ * Toast — @tale-ui/react
3
+ *
4
+ * Styled with @tale-ui/core design tokens.
5
+ * Base-ui Toast exposes:
6
+ * Root: [data-expanded] [data-limited] [data-type] [data-swiping]
7
+ * [data-swipe-direction] [data-starting-style] [data-ending-style]
8
+ * Positioner: [data-side] [data-align] [data-anchor-hidden]
9
+ *
10
+ * Usage (via useToastManager hook):
11
+ * <Toast.Provider>
12
+ * <Toast.Viewport className="tale-toast__viewport" />
13
+ * </Toast.Provider>
14
+ *
15
+ * // To show a toast:
16
+ * const { add } = useToastManager();
17
+ * add({ title: 'Saved!', type: 'success' });
18
+ */
19
+
20
+ /* ─── Positioner — fixed stack container ──────────────────────────────────── */
21
+
22
+ .tale-toast__positioner {
23
+ position: fixed;
24
+ z-index: 200;
25
+ display: flex;
26
+ flex-direction: column-reverse;
27
+ gap: var(--space-2xs);
28
+ padding: var(--space-m);
29
+ pointer-events: none;
30
+
31
+ /* Default: bottom-right */
32
+ bottom: 0;
33
+ right: 0;
34
+ max-width: 36rem;
35
+ width: 100%;
36
+ }
37
+
38
+ /* ─── Root — individual toast card ───────────────────────────────────────── */
39
+
40
+ .tale-toast__root {
41
+ position: relative;
42
+ display: flex;
43
+ align-items: flex-start;
44
+ gap: var(--space-xs);
45
+ padding: var(--space-s) var(--space-m);
46
+ background-color: var(--neutral-14);
47
+ border: 1px solid var(--neutral-22);
48
+ border-radius: 1rem;
49
+ box-shadow:
50
+ 0 2px 4px rgba(0, 0, 0, 0.06),
51
+ 0 8px 20px rgba(0, 0, 0, 0.1);
52
+ color: var(--neutral-90);
53
+ pointer-events: all;
54
+ user-select: none;
55
+ transition: opacity 0.2s ease, transform 0.2s ease;
56
+ overflow: hidden;
57
+ }
58
+
59
+ .tale-toast__root[data-starting-style],
60
+ .tale-toast__root[data-ending-style] {
61
+ opacity: 0;
62
+ transform: translateY(0.8rem) scale(0.97);
63
+ }
64
+
65
+ /* ─── Type variants ───────────────────────────────────────────────────────── */
66
+
67
+ .tale-toast__root[data-type="success"] {
68
+ border-color: var(--green-60, #22c55e);
69
+ border-left: 4px solid var(--green-60, #22c55e);
70
+ }
71
+
72
+ .tale-toast__root[data-type="error"] {
73
+ border-color: var(--red-60);
74
+ border-left: 4px solid var(--red-60);
75
+ }
76
+
77
+ .tale-toast__root[data-type="warning"] {
78
+ border-color: var(--yellow-60, #f59e0b);
79
+ border-left: 4px solid var(--yellow-60, #f59e0b);
80
+ }
81
+
82
+ /* ─── Title ────────────────────────────────────────────────────────────────── */
83
+
84
+ .tale-toast__title {
85
+ font-family: var(--label-font-family);
86
+ font-size: var(--label-m-font-size);
87
+ font-weight: var(--label-font-weight);
88
+ color: var(--neutral-90);
89
+ line-height: 1.3;
90
+ }
91
+
92
+ /* ─── Description ──────────────────────────────────────────────────────────── */
93
+
94
+ .tale-toast__description {
95
+ font-family: var(--body-font-family);
96
+ font-size: var(--text-s-font-size);
97
+ color: var(--neutral-70);
98
+ line-height: 1.5;
99
+ margin-top: var(--space-4xs);
100
+ }
101
+
102
+ /* ─── Content — wraps title + description ─────────────────────────────────── */
103
+
104
+ .tale-toast__content {
105
+ flex: 1;
106
+ display: flex;
107
+ flex-direction: column;
108
+ }
109
+
110
+ /* ─── Close button ─────────────────────────────────────────────────────────── */
111
+
112
+ .tale-toast__close {
113
+ display: flex;
114
+ align-items: center;
115
+ justify-content: center;
116
+ width: 2.4rem;
117
+ height: 2.4rem;
118
+ border: none;
119
+ border-radius: 0.4rem;
120
+ background-color: transparent;
121
+ color: var(--neutral-60);
122
+ cursor: pointer;
123
+ outline: none;
124
+ flex-shrink: 0;
125
+ transition: background-color 0.15s ease, color 0.15s ease;
126
+ }
127
+
128
+ .tale-toast__close:hover {
129
+ background-color: var(--neutral-20);
130
+ color: var(--neutral-90);
131
+ }
132
+
133
+ .tale-toast__close:focus-visible {
134
+ box-shadow: 0 0 0 2px var(--color-60);
135
+ }
136
+
137
+ /* ─── Action button ────────────────────────────────────────────────────────── */
138
+
139
+ .tale-toast__action {
140
+ display: inline-flex;
141
+ align-items: center;
142
+ padding: var(--space-4xs) var(--space-3xs);
143
+ border: 1px solid var(--neutral-30);
144
+ border-radius: 0.4rem;
145
+ background-color: transparent;
146
+ color: var(--neutral-80);
147
+ font-family: var(--label-font-family);
148
+ font-size: var(--label-s-font-size);
149
+ font-weight: var(--label-font-weight);
150
+ cursor: pointer;
151
+ outline: none;
152
+ margin-top: var(--space-3xs);
153
+ transition: background-color 0.15s ease;
154
+ }
155
+
156
+ .tale-toast__action:hover {
157
+ background-color: var(--neutral-18);
158
+ }
159
+
160
+ .tale-toast__action:focus-visible {
161
+ box-shadow: 0 0 0 2px var(--color-60);
162
+ }
package/src/toggle.css ADDED
@@ -0,0 +1,118 @@
1
+ /*
2
+ * Toggle — @tale-ui/react
3
+ *
4
+ * Styled with @tale-ui/core design tokens.
5
+ * Base-ui Toggle exposes: [data-pressed] [data-disabled]
6
+ * Toggle.Group has no direct data attributes.
7
+ *
8
+ * Sizes: .tale-toggle--sm
9
+ * .tale-toggle--md (default)
10
+ * .tale-toggle--lg
11
+ *
12
+ * Usage:
13
+ * <Toggle className="tale-toggle tale-toggle--md">B</Toggle>
14
+ */
15
+
16
+ /* ─── Base ─────────────────────────────────────────────────────────────────── */
17
+
18
+ .tale-toggle {
19
+ display: inline-flex;
20
+ align-items: center;
21
+ justify-content: center;
22
+ gap: var(--space-3xs);
23
+ border: 1px solid var(--neutral-22);
24
+ border-radius: 0.6rem;
25
+ background-color: transparent;
26
+ color: var(--neutral-70);
27
+ font-family: var(--label-font-family);
28
+ font-size: var(--label-m-font-size);
29
+ font-weight: var(--label-font-weight);
30
+ line-height: 1;
31
+ cursor: pointer;
32
+ outline: none;
33
+ transition:
34
+ background-color 0.15s ease,
35
+ border-color 0.15s ease,
36
+ color 0.15s ease,
37
+ box-shadow 0.15s ease;
38
+ user-select: none;
39
+
40
+ /* Default size: md */
41
+ padding: var(--space-3xs) var(--space-xs);
42
+ min-height: 3.6rem;
43
+ }
44
+
45
+ .tale-toggle:focus-visible {
46
+ box-shadow: 0 0 0 2px var(--neutral-100), 0 0 0 4px var(--color-60);
47
+ }
48
+
49
+ /* ─── Hover ───────────────────────────────────────────────────────────────── */
50
+
51
+ .tale-toggle:hover:not([data-disabled]):not([data-pressed]) {
52
+ background-color: var(--neutral-14);
53
+ border-color: var(--neutral-28);
54
+ color: var(--neutral-90);
55
+ }
56
+
57
+ /* ─── Pressed (active/on) state ───────────────────────────────────────────── */
58
+
59
+ .tale-toggle[data-pressed] {
60
+ background-color: var(--neutral-18);
61
+ border-color: var(--neutral-30);
62
+ color: var(--neutral-90);
63
+ }
64
+
65
+ .tale-toggle[data-pressed]:hover:not([data-disabled]) {
66
+ background-color: var(--neutral-22);
67
+ }
68
+
69
+ /* ─── Disabled state ──────────────────────────────────────────────────────── */
70
+
71
+ .tale-toggle[data-disabled] {
72
+ opacity: 0.45;
73
+ cursor: not-allowed;
74
+ pointer-events: none;
75
+ }
76
+
77
+ /* ─── Size modifiers ──────────────────────────────────────────────────────── */
78
+
79
+ .tale-toggle--sm {
80
+ font-size: var(--label-s-font-size);
81
+ padding: var(--space-4xs) var(--space-3xs);
82
+ min-height: 2.8rem;
83
+ gap: var(--space-4xs);
84
+ }
85
+
86
+ .tale-toggle--md {
87
+ font-size: var(--label-m-font-size);
88
+ padding: var(--space-3xs) var(--space-xs);
89
+ min-height: 3.6rem;
90
+ }
91
+
92
+ .tale-toggle--lg {
93
+ font-size: var(--label-l-font-size);
94
+ padding: var(--space-2xs) var(--space-s);
95
+ min-height: 4.4rem;
96
+ gap: var(--space-2xs);
97
+ }
98
+
99
+ /* ─── Toggle Group ─────────────────────────────────────────────────────────── */
100
+
101
+ .tale-toggle-group {
102
+ display: inline-flex;
103
+ align-items: center;
104
+ gap: 0;
105
+ border-radius: 0.6rem;
106
+ overflow: hidden;
107
+ border: 1px solid var(--neutral-22);
108
+ }
109
+
110
+ .tale-toggle-group .tale-toggle {
111
+ border-radius: 0;
112
+ border: none;
113
+ border-right: 1px solid var(--neutral-22);
114
+ }
115
+
116
+ .tale-toggle-group .tale-toggle:last-child {
117
+ border-right: none;
118
+ }