@thinking.tools/teff 1.0.0 → 1.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.
@@ -0,0 +1,227 @@
1
+ @layer components {
2
+ [data-sidebar-layout] {
3
+ display: grid;
4
+ grid-template-columns: 14rem 1fr;
5
+ grid-template-rows: auto 1fr;
6
+ height: 100dvh;
7
+
8
+ > main {
9
+ grid-row: 2;
10
+ min-width: 0;
11
+ overflow-y: auto;
12
+ }
13
+
14
+ > aside[data-sidebar] {
15
+ grid-row: 2;
16
+ min-height: 0;
17
+ z-index: 1;
18
+ background-color: var(--background);
19
+ border-inline-end: 1px solid var(--border);
20
+ display: flex;
21
+ flex-direction: column;
22
+
23
+ > :is(header, footer) {
24
+ flex-shrink: 0;
25
+ padding: var(--space-3);
26
+ }
27
+
28
+ > footer {
29
+ margin-block-start: auto;
30
+ }
31
+
32
+ > nav {
33
+ flex: 1;
34
+ min-height: 0;
35
+ overflow-y: auto;
36
+ padding: var(--space-3) var(--space-2);
37
+ font-size: var(--text-7);
38
+
39
+ /* Headings or [data-nav-label] act as section labels between link
40
+ groups. Prefer [data-nav-label] on a <p> when the labels shouldn't
41
+ join the page's heading outline. */
42
+ :is(h2, h3, h4, h5, h6, [data-nav-label]) {
43
+ font-size: var(--text-8);
44
+ font-weight: var(--font-semibold);
45
+ letter-spacing: 0.05em;
46
+ text-transform: uppercase;
47
+ color: var(--faint-foreground);
48
+ margin: var(--space-4) var(--space-4) var(--space-1);
49
+ }
50
+
51
+ ul {
52
+ list-style: none;
53
+ padding: 0;
54
+ margin: 0;
55
+ display: flex;
56
+ flex-direction: column;
57
+ gap: var(--space-1);
58
+
59
+ li {
60
+ margin: 0;
61
+ }
62
+ }
63
+
64
+ a {
65
+ display: flex;
66
+ align-items: center;
67
+ gap: var(--space-2);
68
+ min-height: 2.25rem;
69
+ padding: var(--space-1) var(--space-4);
70
+ color: var(--muted-foreground);
71
+ text-decoration: none;
72
+ border-radius: var(--radius-button);
73
+ transition: background-color var(--transition-fast), color var(--transition-fast);
74
+
75
+ &:is(:hover, [aria-current]) {
76
+ background-color: var(--accent);
77
+ color: var(--foreground);
78
+ }
79
+
80
+ &[aria-current] {
81
+ font-weight: var(--font-medium);
82
+ }
83
+
84
+ & svg {
85
+ display: block;
86
+ width: 1.15em;
87
+ height: 1.15em;
88
+ flex-shrink: 0;
89
+ }
90
+ }
91
+
92
+ details {
93
+ border: none;
94
+ overflow: visible;
95
+
96
+ & + details { margin-top: 0; }
97
+ &[open] summary { border-bottom: none; }
98
+ > ul { margin-inline-start: var(--space-4); padding: var(--space-1) 0; }
99
+ }
100
+
101
+ summary {
102
+ justify-content: flex-start;
103
+ padding: var(--space-2) var(--space-4);
104
+ border-radius: var(--radius-button);
105
+
106
+ &::after {
107
+ width: 0.75rem;
108
+ height: 0.75rem;
109
+ margin-inline-start: auto;
110
+ }
111
+ }
112
+ }
113
+ }
114
+
115
+ > nav[data-topnav] {
116
+ grid-column: 1 / -1;
117
+ }
118
+ }
119
+
120
+ nav[data-topnav] {
121
+ position: sticky;
122
+ top: 0;
123
+ z-index: 5;
124
+ display: flex;
125
+ flex-wrap: wrap;
126
+ align-items: center;
127
+ gap: var(--space-2) var(--space-3);
128
+ padding: var(--space-2) var(--space-4);
129
+ background-color: var(--background);
130
+ border-bottom: 1px solid var(--border);
131
+
132
+ a {
133
+ text-decoration: none;
134
+ }
135
+ }
136
+
137
+ :is([data-sidebar-toggle], [data-sidebar-header]) {
138
+ display: none;
139
+ }
140
+
141
+ [data-sidebar-toggle] {
142
+ width: 2.5rem;
143
+ flex-shrink: 0;
144
+ padding: 0;
145
+ background: none;
146
+ color: var(--foreground);
147
+ border: none;
148
+ border-radius: var(--radius-button);
149
+ box-shadow: none;
150
+
151
+ &:hover:not(:disabled) {
152
+ background-color: var(--accent);
153
+ }
154
+
155
+ /* display:block kills the inline baseline gap that nudges icons off-center. */
156
+ & svg {
157
+ display: block;
158
+ width: 1.25rem;
159
+ height: 1.25rem;
160
+ margin: auto;
161
+ }
162
+ }
163
+
164
+ @media (min-width: 769px) {
165
+ [data-sidebar-layout="always"] {
166
+ transition: grid-template-columns var(--transition);
167
+
168
+ [data-sidebar-toggle] {
169
+ display: inline-block;
170
+ }
171
+
172
+ > aside[data-sidebar] {
173
+ transform: translateX(0);
174
+ opacity: 1;
175
+ transition: transform var(--transition), opacity var(--transition), visibility var(--transition);
176
+ }
177
+
178
+ &[data-sidebar-open] {
179
+ grid-template-columns: 0px 1fr;
180
+ gap: 0;
181
+
182
+ > aside[data-sidebar] {
183
+ overflow: hidden;
184
+ min-width: 0;
185
+ transform: translateX(-100%);
186
+ opacity: 0;
187
+ visibility: hidden;
188
+ border-inline-end: none;
189
+ }
190
+ }
191
+ }
192
+ }
193
+
194
+ @media (max-width: 768px) {
195
+ [data-sidebar-layout] {
196
+ grid-template-columns: 1fr;
197
+
198
+ > main {
199
+ grid-column: 1;
200
+ }
201
+
202
+ > aside[data-sidebar] {
203
+ grid-column: 1;
204
+ z-index: 2;
205
+ width: 16rem;
206
+ transform: translateX(-100%);
207
+ visibility: hidden;
208
+ transition: transform var(--transition), visibility var(--transition);
209
+ box-shadow: var(--shadow-large);
210
+ }
211
+
212
+ &[data-sidebar-open] > aside[data-sidebar] {
213
+ transform: translateX(0);
214
+ visibility: visible;
215
+ }
216
+ }
217
+ [data-sidebar-toggle] { display: inline-block; }
218
+
219
+ [data-sidebar-header] {
220
+ display: flex;
221
+ align-items: center;
222
+ gap: var(--space-3);
223
+ padding: var(--space-3) var(--space-4);
224
+ border-bottom: 1px solid var(--border);
225
+ }
226
+ }
227
+ }
@@ -0,0 +1,47 @@
1
+ @layer components {
2
+ [role="status"].skeleton {
3
+ --_c: light-dark(
4
+ color-mix(in srgb, var(--muted) 15%, white),
5
+ color-mix(in srgb, var(--muted) 90%, var(--foreground))
6
+ );
7
+
8
+ position: relative;
9
+ overflow: hidden;
10
+ margin-block-end: var(--space-3);
11
+ background: var(--muted);
12
+ border-radius: var(--radius-medium);
13
+
14
+ /* Shimmer rides on transform only — composited, no paint per frame. */
15
+ &::after {
16
+ content: "";
17
+ position: absolute;
18
+ inset: 0;
19
+ transform: translateX(-100%);
20
+ background-image: linear-gradient(
21
+ 90deg,
22
+ transparent 0%,
23
+ var(--_c) 50%,
24
+ transparent 100%
25
+ );
26
+ animation: shimmer 2s infinite;
27
+ }
28
+
29
+ &.box {
30
+ width: 4rem;
31
+ height: 4rem;
32
+ }
33
+
34
+ &.line {
35
+ height: 1rem;
36
+ width: 100%;
37
+ }
38
+ }
39
+
40
+ [role="status"].skeleton:last-child {
41
+ margin-block-end: 0;
42
+ }
43
+
44
+ @keyframes shimmer {
45
+ to { transform: translateX(100%); }
46
+ }
47
+ }
@@ -0,0 +1,52 @@
1
+ @layer components {
2
+ [aria-busy="true"] {
3
+ &::before {
4
+ content: "";
5
+ display: inline-block;
6
+ inset: 0;
7
+ margin: auto;
8
+ width: 1.5rem;
9
+ height: 1.5rem;
10
+ border: 2px solid var(--muted);
11
+ border-top-color: var(--primary);
12
+ border-radius: var(--radius-full);
13
+ animation: spin 1s linear infinite;
14
+ text-align: center;
15
+ }
16
+
17
+ &[data-spinner~="small"]::before {
18
+ width: 1rem;
19
+ height: 1rem;
20
+ }
21
+
22
+ &[data-spinner~="large"]::before {
23
+ width: 2rem;
24
+ height: 2rem;
25
+ border-width: 3px;
26
+ }
27
+
28
+ &[data-spinner~="overlay"] {
29
+ position: relative;
30
+
31
+ > * {
32
+ opacity: 0.3;
33
+
34
+ /* "disable" all elements in the container while it's busy */
35
+ pointer-events: none;
36
+ }
37
+
38
+ &::before {
39
+ position: absolute;
40
+ inset: 0;
41
+ margin: auto;
42
+ z-index: 1;
43
+ }
44
+ }
45
+ }
46
+
47
+ @keyframes spin {
48
+ to {
49
+ transform: rotate(360deg);
50
+ }
51
+ }
52
+ }
package/css/table.css ADDED
@@ -0,0 +1,61 @@
1
+ @layer base {
2
+ /* Container to get horizontal scroll on small screens. */
3
+ .table {
4
+ min-width: 320px;
5
+ width: 100%;
6
+ overflow-x: auto;
7
+ }
8
+
9
+ table {
10
+ border-collapse: collapse;
11
+ width: 100%;
12
+ font-size: var(--text-7);
13
+ }
14
+
15
+ caption {
16
+ padding-block-end: var(--space-3);
17
+ text-align: start;
18
+ font-weight: var(--font-medium);
19
+ }
20
+
21
+ thead {
22
+ border-bottom: 1px solid var(--border);
23
+ }
24
+
25
+ th, td {
26
+ overflow-wrap: break-word;
27
+ }
28
+
29
+ th {
30
+ padding: var(--space-3) var(--space-2);
31
+ text-align: start;
32
+ font-weight: var(--font-medium);
33
+ color: var(--muted-foreground);
34
+ }
35
+
36
+ td {
37
+ padding: var(--space-3) var(--space-2);
38
+ font-variant-numeric: tabular-nums;
39
+ }
40
+
41
+ tbody tr {
42
+ border-bottom: 1px solid var(--border);
43
+ transition: background-color var(--transition-fast);
44
+
45
+ &:last-child {
46
+ border-bottom: none;
47
+ }
48
+
49
+ &:hover {
50
+ background-color: rgb(from var(--muted) r g b / 0.5);
51
+ }
52
+ }
53
+
54
+ tfoot {
55
+ border-top: 1px solid var(--border);
56
+
57
+ & :is(th, td) {
58
+ font-weight: var(--font-medium);
59
+ }
60
+ }
61
+ }
package/css/tabs.css ADDED
@@ -0,0 +1,57 @@
1
+ @layer components {
2
+ [role="tablist"] {
3
+ display: inline-flex;
4
+ align-items: center;
5
+ gap: var(--space-1);
6
+ padding: var(--space-1);
7
+ max-width: 100%;
8
+ overflow-x: auto;
9
+ background-color: var(--muted);
10
+ border-radius: var(--radius-button);
11
+ }
12
+
13
+ [role="tab"] {
14
+ display: inline-flex;
15
+ align-items: center;
16
+ justify-content: center;
17
+ gap: var(--space-2);
18
+ min-height: 2rem;
19
+ padding: var(--space-1) var(--space-4);
20
+ font-size: var(--text-7);
21
+ font-weight: var(--font-medium);
22
+ white-space: nowrap;
23
+ background-color: transparent;
24
+ color: var(--muted-foreground);
25
+ border: none;
26
+ border-radius: var(--radius-button);
27
+ cursor: pointer;
28
+ transition: background-color var(--transition-fast), color var(--transition-fast);
29
+
30
+ & svg {
31
+ display: block;
32
+ width: 1.15em;
33
+ height: 1.15em;
34
+ flex-shrink: 0;
35
+ }
36
+
37
+ &:hover:not([aria-selected="true"]) {
38
+ color: var(--foreground);
39
+ }
40
+
41
+ &[aria-selected="true"] {
42
+ background-color: light-dark(var(--background), #3d3d3d);
43
+ color: var(--foreground);
44
+ box-shadow:
45
+ 0 1px 2px light-dark(rgb(0 0 0 / 0.08), rgb(0 0 0 / 0.3)),
46
+ 0 0 0 1px light-dark(rgb(0 0 0 / 0.04), rgb(255 255 255 / 0.06));
47
+ }
48
+ }
49
+
50
+ [role="tabpanel"] {
51
+ padding: var(--space-4) 0;
52
+
53
+ &:focus-visible {
54
+ outline: none;
55
+ }
56
+ }
57
+ }
package/css/toast.css ADDED
@@ -0,0 +1,128 @@
1
+ @layer components {
2
+ .toast-container {
3
+ position: fixed;
4
+ display: flex;
5
+ flex-direction: column;
6
+ pointer-events: none;
7
+ margin: 0;
8
+ padding: 0;
9
+ border: none;
10
+ background: transparent;
11
+
12
+ overflow: visible;
13
+
14
+ &::backdrop {
15
+ display: none;
16
+ }
17
+
18
+ &[data-placement="top-left"] {
19
+ inset: var(--space-4) auto auto var(--space-4);
20
+ }
21
+
22
+ &[data-placement="top-center"] {
23
+ inset: var(--space-4) auto auto 50%;
24
+ transform: translateX(-50%);
25
+ }
26
+
27
+ &[data-placement="top-right"] {
28
+ inset: var(--space-4) var(--space-4) auto auto;
29
+ }
30
+
31
+ &[data-placement="bottom-left"] {
32
+ inset: auto auto var(--space-4) var(--space-4);
33
+ flex-direction: column-reverse;
34
+ }
35
+
36
+ &[data-placement="bottom-center"] {
37
+ inset: auto auto var(--space-4) 50%;
38
+ transform: translateX(-50%);
39
+ flex-direction: column-reverse;
40
+ }
41
+
42
+ &[data-placement="bottom-right"] {
43
+ inset: auto var(--space-4) var(--space-4) auto;
44
+ flex-direction: column-reverse;
45
+ }
46
+ }
47
+
48
+ .toast {
49
+ --transition: 300ms;
50
+ --transition-in: calc(var(--transition) - 50ms);
51
+
52
+ padding: var(--space-4) var(--space-5);
53
+ max-width: min(28rem, calc(100vw - var(--space-8)));
54
+ min-width: min(20rem, calc(100vw - var(--space-8)));
55
+ pointer-events: auto;
56
+ background-color: var(--card);
57
+ border-radius: var(--radius-large);
58
+ box-shadow: var(--shadow-large);
59
+ transition: opacity var(--transition-in), transform var(--transition-in), filter var(--transition-in), margin var(--transition-in);
60
+ line-height: var(--leading-normal);
61
+ font-size: var(--text-7);
62
+
63
+ .toast-title {
64
+ display: flex;
65
+ align-items: center;
66
+ gap: var(--space-2);
67
+ font-weight: var(--font-semibold);
68
+ margin: 0 0 var(--space-1) 0;
69
+
70
+ /* Variant colour as a leading dot instead of an edge stripe. */
71
+ &::before {
72
+ content: "";
73
+ width: 0.5rem;
74
+ height: 0.5rem;
75
+ flex-shrink: 0;
76
+ border-radius: var(--radius-full);
77
+ background-color: currentColor;
78
+ }
79
+ }
80
+ .toast-message {
81
+ color: var(--muted-foreground);
82
+ }
83
+
84
+ &[data-variant="success"] .toast-title {
85
+ color: var(--success);
86
+ }
87
+
88
+ &[data-variant="danger"] .toast-title {
89
+ color: var(--danger);
90
+ }
91
+
92
+ &[data-variant="warning"] .toast-title {
93
+ color: var(--warning);
94
+ }
95
+
96
+ & > [data-close] {
97
+ margin-inline-start: auto;
98
+ background: none;
99
+ border: none;
100
+ padding: 0;
101
+ cursor: pointer;
102
+ opacity: 0.5;
103
+
104
+ &:hover {
105
+ opacity: 1;
106
+ }
107
+ }
108
+
109
+ margin: var(--space-2) 0;
110
+
111
+ &[data-entering] {
112
+ opacity: 0;
113
+ transform: translateY(-0.75rem);
114
+ filter: blur(4px);
115
+ }
116
+
117
+ &[data-exiting] {
118
+ opacity: 0;
119
+ margin: 0;
120
+ padding-block: 0;
121
+ max-height: 0;
122
+ overflow: hidden;
123
+ transform: translateY(-0.75rem);
124
+ filter: blur(4px);
125
+ transition: opacity var(--transition), margin var(--transition), padding var(--transition), max-height var(--transition), transform var(--transition), filter var(--transition);
126
+ }
127
+ }
128
+ }
@@ -0,0 +1,72 @@
1
+ @layer components {
2
+ [data-tooltip] {
3
+ position: relative;
4
+ }
5
+
6
+ /* Pill tooltip, no arrow — fades + nudges into place. Hidden state is
7
+ display:none (not visibility) so the box doesn't widen scroll containers;
8
+ allow-discrete + @starting-style keep the enter/exit fades. */
9
+ [data-tooltip]::after {
10
+ --_from: translateX(-50%) translateY(4px);
11
+ --_to: translateX(-50%) translateY(0);
12
+ content: attr(data-tooltip);
13
+ display: none;
14
+ position: absolute;
15
+ inset-inline-start: 50%;
16
+ inset-block-end: calc(100% + 8px);
17
+ transform: var(--_from);
18
+ opacity: 0;
19
+ transition:
20
+ opacity var(--transition-fast),
21
+ transform var(--transition-fast),
22
+ display var(--transition-fast) allow-discrete;
23
+ pointer-events: none;
24
+ z-index: calc(var(--z-modal) + 10);
25
+ padding: var(--space-1) var(--space-3);
26
+ font-size: var(--text-8);
27
+ font-weight: var(--font-medium);
28
+ line-height: var(--leading-normal);
29
+ white-space: nowrap;
30
+ background: var(--foreground);
31
+ color: var(--background);
32
+ border-radius: var(--radius-full);
33
+ box-shadow: var(--shadow-medium);
34
+ }
35
+
36
+ /* Bottom */
37
+ [data-tooltip][data-tooltip-placement="bottom"]::after {
38
+ --_from: translateX(-50%) translateY(-4px);
39
+ inset-block-start: calc(100% + 8px);
40
+ inset-block-end: auto;
41
+ }
42
+
43
+ /* Left + Right */
44
+ [data-tooltip]:is([data-tooltip-placement="left"], [data-tooltip-placement="right"])::after {
45
+ --_to: translateX(0) translateY(-50%);
46
+ inset-block-start: 50%;
47
+ inset-block-end: auto;
48
+ }
49
+
50
+ [data-tooltip][data-tooltip-placement="left"]::after {
51
+ --_from: translateX(4px) translateY(-50%);
52
+ inset-inline-start: auto;
53
+ inset-inline-end: calc(100% + 8px);
54
+ }
55
+
56
+ [data-tooltip][data-tooltip-placement="right"]::after {
57
+ --_from: translateX(-4px) translateY(-50%);
58
+ inset-inline-start: calc(100% + 8px);
59
+ }
60
+
61
+ [data-tooltip]:is(:hover, :focus-visible)::after {
62
+ display: block;
63
+ opacity: 1;
64
+ transition-delay: 600ms;
65
+ transform: var(--_to);
66
+
67
+ @starting-style {
68
+ opacity: 0;
69
+ transform: var(--_from);
70
+ }
71
+ }
72
+ }