@thinking.tools/teff 1.0.0 → 1.0.1

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/css/avatar.css ADDED
@@ -0,0 +1,61 @@
1
+ @layer components {
2
+ figure[data-variant="avatar"]:not([role="group"]) {
3
+ display: inline-flex;
4
+ align-items: center;
5
+ justify-content: center;
6
+ width: var(--sz, 2.5rem);
7
+ height: var(--sz, 2.5rem);
8
+ color: var(--primary);
9
+ background-color: var(--muted);
10
+ border-radius: var(--radius-full);
11
+ font-weight: var(--font-medium);
12
+ overflow: hidden;
13
+ box-shadow: inset 0 0 0 1px light-dark(rgb(0 0 0 / 0.1), rgb(255 255 255 / 0.1));
14
+
15
+ & > img {
16
+ width: 100%;
17
+ height: 100%;
18
+ object-fit: cover;
19
+ }
20
+
21
+ &.small {
22
+ --sz: 2rem;
23
+ }
24
+ &.large {
25
+ --sz: 3.25rem;
26
+ }
27
+ }
28
+
29
+ figure[data-variant="avatar"][role="group"] {
30
+ display: inline-flex;
31
+ align-items: center;
32
+ margin: 0;
33
+
34
+ & figure[data-variant="avatar"] {
35
+ isolation: isolate;
36
+ margin-inline-end: calc(var(--space-5) * -1);
37
+ border: 2px solid var(--background);
38
+
39
+ &:last-child {
40
+ margin-inline-end: 0;
41
+ }
42
+ }
43
+
44
+ &.small {
45
+ --sz: 2rem;
46
+
47
+ & figure[data-variant="avatar"] {
48
+ margin-inline-end: calc(var(--space-4) * -0.8);
49
+ border-width: 1px;
50
+ }
51
+ }
52
+
53
+ &.large {
54
+ --sz: 3.25rem;
55
+
56
+ & figure[data-variant="avatar"] {
57
+ margin-inline-end: calc(var(--space-6) * -1);
58
+ }
59
+ }
60
+ }
61
+ }
package/css/badge.css ADDED
@@ -0,0 +1,49 @@
1
+ @layer components {
2
+ .badge {
3
+ display: inline-flex;
4
+ align-items: center;
5
+ gap: var(--space-1);
6
+ padding: calc(var(--space-1) / 2) var(--space-3);
7
+ font-size: var(--text-8);
8
+ font-weight: var(--font-medium);
9
+ line-height: var(--leading-normal);
10
+ background-color: var(--primary);
11
+ color: var(--primary-foreground);
12
+ border-radius: var(--radius-full);
13
+
14
+ &.outline {
15
+ background-color: transparent;
16
+ color: var(--foreground);
17
+ box-shadow: inset 0 0 0 1px var(--input);
18
+ }
19
+
20
+ &[data-variant="secondary"] {
21
+ background-color: var(--secondary);
22
+ color: var(--secondary-foreground);
23
+ }
24
+
25
+ &[data-variant="success"] {
26
+ color: var(--success);
27
+ background-color: light-dark(
28
+ color-mix(in srgb, var(--success) 10%, transparent),
29
+ color-mix(in srgb, var(--success) 30%, transparent)
30
+ );
31
+ }
32
+
33
+ &[data-variant="warning"] {
34
+ color: var(--warning);
35
+ background-color: light-dark(
36
+ color-mix(in srgb, var(--warning) 10%, transparent),
37
+ color-mix(in srgb, var(--warning) 30%, transparent)
38
+ );
39
+ }
40
+
41
+ &[data-variant="danger"] {
42
+ color: var(--danger);
43
+ background-color: light-dark(
44
+ color-mix(in srgb, var(--danger) 10%, transparent),
45
+ color-mix(in srgb, var(--danger) 30%, transparent)
46
+ );
47
+ }
48
+ }
49
+ }
package/css/button.css ADDED
@@ -0,0 +1,178 @@
1
+ @layer base {
2
+ :is(button, [type=submit], [type=reset], [type=button], a.button), ::file-selector-button {
3
+ /* Hover mixes toward the page background — lightens dark fills in light
4
+ mode, darkens light fills in dark mode, for ink and accents alike. */
5
+ --_hov: color-mix(in srgb, var(--primary), var(--background) 16%);
6
+ --_px: var(--space-5);
7
+
8
+ display: inline-flex;
9
+ align-items: center;
10
+ justify-content: center;
11
+ gap: var(--space-2);
12
+ min-height: 2.5rem;
13
+ max-width: 100%;
14
+ padding: var(--space-2) var(--_px);
15
+ font-size: var(--text-7);
16
+ font-weight: var(--font-medium);
17
+ line-height: var(--leading-normal);
18
+ white-space: nowrap;
19
+ text-decoration: none;
20
+ background-color: var(--primary);
21
+ color: var(--primary-foreground);
22
+ border-radius: var(--radius-button);
23
+ border: 1px solid transparent;
24
+ box-shadow:
25
+ var(--shadow-small),
26
+ inset 0 1px 0 light-dark(rgb(255 255 255 / 0.12), rgb(255 255 255 / 0));
27
+ transition-property: background-color, border-color, box-shadow, scale;
28
+ transition-duration: 120ms;
29
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
30
+
31
+ &:not(:disabled) {
32
+ cursor: pointer;
33
+ }
34
+
35
+ &:hover:not(:disabled) {
36
+ background-color: var(--_hov);
37
+ }
38
+
39
+ &:active:not(:disabled) {
40
+ scale: 0.96;
41
+ }
42
+
43
+ /* Icons: size to the type, never squish. */
44
+ & svg {
45
+ display: block;
46
+ width: 1.2em;
47
+ height: 1.2em;
48
+ flex-shrink: 0;
49
+ }
50
+
51
+ /* Optical alignment: icon-side padding = text-side − 2px. */
52
+ &:has(> svg:first-child):not(.icon) {
53
+ padding-inline-start: calc(var(--_px) - 2px);
54
+ }
55
+ &:has(> svg:last-child):not(.icon) {
56
+ padding-inline-end: calc(var(--_px) - 2px);
57
+ }
58
+
59
+ /* Long labels: <span class="truncate"> inside the button ellipsizes. */
60
+ & > .truncate {
61
+ min-width: 0;
62
+ }
63
+
64
+ &[data-variant="secondary"] {
65
+ --_hov: color-mix(in srgb, var(--secondary), var(--secondary-foreground) 7%);
66
+ background-color: var(--secondary);
67
+ color: var(--secondary-foreground);
68
+ box-shadow: none;
69
+ }
70
+
71
+ &[data-variant="danger"] {
72
+ --_hov: color-mix(in srgb, var(--danger), var(--background) 16%);
73
+ background-color: var(--danger);
74
+ color: var(--danger-foreground);
75
+ }
76
+
77
+ &:is(.outline, .ghost) {
78
+ --_hov: var(--accent);
79
+ background-color: transparent;
80
+ color: var(--foreground);
81
+ box-shadow: none;
82
+
83
+ &[data-variant="danger"] {
84
+ --_hov: color-mix(in srgb, var(--danger), transparent 90%);
85
+ color: var(--danger);
86
+ }
87
+
88
+ &[data-variant="secondary"] {
89
+ --_hov: color-mix(in srgb, var(--secondary), transparent 80%);
90
+ color: var(--secondary-foreground);
91
+ }
92
+ }
93
+
94
+ &.outline {
95
+ border-color: var(--input);
96
+
97
+ &[data-variant="danger"] {
98
+ border-color: var(--danger);
99
+ }
100
+
101
+ &[data-variant="secondary"] {
102
+ border-color: var(--secondary);
103
+ }
104
+ }
105
+
106
+ &.ghost {
107
+ /* Same as .outline but no border. */
108
+ border-color: transparent;
109
+ }
110
+
111
+ &.small {
112
+ --_px: var(--space-4);
113
+ min-height: 2rem;
114
+ padding-block: var(--space-1);
115
+ font-size: var(--text-8);
116
+ }
117
+
118
+ &.large {
119
+ --_px: var(--space-6);
120
+ min-height: 3rem;
121
+ padding-block: 0;
122
+ font-size: var(--text-regular);
123
+ }
124
+
125
+ &.icon {
126
+ width: 2.5rem;
127
+ padding: 0;
128
+
129
+ &.small {
130
+ width: 2rem;
131
+ }
132
+
133
+ &.large {
134
+ width: 3rem;
135
+ }
136
+ }
137
+ }
138
+
139
+ ::file-selector-button {
140
+ background-color: transparent;
141
+ color: var(--foreground);
142
+ border: 1px solid var(--input);
143
+ box-shadow: none;
144
+ }
145
+ ::file-selector-button:hover {
146
+ /* pseudoelement:hover can't be nested and has to be a separate block. */
147
+ background-color: var(--accent);
148
+ }
149
+ }
150
+
151
+ @layer components {
152
+ menu.buttons {
153
+ list-style-type: none;
154
+ padding-inline-start: 0;
155
+ display: inline-flex;
156
+
157
+ /* In menu.buttons, <li> children are expected to have just one child, which is a button/or a.button */
158
+ & > li {
159
+ &:first-child > * {
160
+ border-start-start-radius: var(--radius-button);
161
+ border-end-start-radius: var(--radius-button);
162
+ }
163
+
164
+ &:last-child > * {
165
+ border-start-end-radius: var(--radius-button);
166
+ border-end-end-radius: var(--radius-button);
167
+ }
168
+
169
+ & > * {
170
+ border-radius: 0;
171
+ }
172
+
173
+ &:not(:last-child) > * {
174
+ border-inline-end: 1px solid rgb(from var(--secondary-foreground) r g b / 0.15);
175
+ }
176
+ }
177
+ }
178
+ }
package/css/card.css ADDED
@@ -0,0 +1,9 @@
1
+ @layer components {
2
+ .card {
3
+ background-color: var(--card);
4
+ color: var(--card-foreground);
5
+ border-radius: var(--radius-large);
6
+ box-shadow: var(--shadow-small);
7
+ padding: var(--space-6);
8
+ }
9
+ }
package/css/dialog.css ADDED
@@ -0,0 +1,93 @@
1
+ @layer components {
2
+ dialog {
3
+ position: fixed;
4
+ inset: 0;
5
+ z-index: var(--z-modal);
6
+ width: min(100% - 2rem, 32rem);
7
+ max-height: 85vh;
8
+ max-height: 85dvh;
9
+ margin: auto;
10
+ padding: 0;
11
+ background-color: var(--card);
12
+ border: none;
13
+ border-radius: var(--radius-large);
14
+ box-shadow: var(--shadow-large);
15
+ overflow: hidden;
16
+
17
+ opacity: 0;
18
+ transform: scale(0.96) translateY(0.5rem);
19
+ transition:
20
+ opacity 200ms var(--ease-out),
21
+ transform 200ms var(--ease-out),
22
+ overlay 200ms var(--ease-out) allow-discrete,
23
+ display 200ms var(--ease-out) allow-discrete;
24
+
25
+ &:is([open], :popover-open) {
26
+ opacity: 1;
27
+ transform: scale(1) translateY(0);
28
+ }
29
+
30
+ @starting-style {
31
+ &:is([open], :popover-open) {
32
+ opacity: 0;
33
+ transform: scale(0.96) translateY(0.5rem);
34
+ }
35
+ }
36
+
37
+ &::backdrop {
38
+ background-color: rgb(0 0 0 / 0);
39
+ backdrop-filter: blur(0px);
40
+ transition:
41
+ background-color 200ms var(--ease-out),
42
+ backdrop-filter 200ms var(--ease-out),
43
+ overlay 200ms var(--ease-out) allow-discrete,
44
+ display 200ms var(--ease-out) allow-discrete;
45
+ }
46
+
47
+ &:is([open], :popover-open)::backdrop {
48
+ background-color: rgb(0 0 0 / 0.4);
49
+ backdrop-filter: blur(4px);
50
+ }
51
+
52
+ @starting-style {
53
+ &:is([open], :popover-open)::backdrop {
54
+ background-color: rgb(0 0 0 / 0);
55
+ backdrop-filter: blur(0px);
56
+ }
57
+ }
58
+
59
+ & > header,
60
+ & > form > header {
61
+ display: flex;
62
+ flex-direction: column;
63
+ gap: var(--space-1);
64
+ padding: var(--space-6);
65
+ padding-block-end: 0;
66
+
67
+ & > h1, & > h2, & > h3, & > h4, & > h5, & > h6 {
68
+ margin-block-end: 0;
69
+ }
70
+
71
+ & > p {
72
+ font-size: var(--text-7);
73
+ color: var(--muted-foreground);
74
+ margin-block-end: 0;
75
+ }
76
+ }
77
+
78
+ & > p, & > div, & > section,
79
+ & > form > p, & > form > div, & > form > section {
80
+ padding: var(--space-6);
81
+ overflow-y: auto;
82
+ }
83
+
84
+ & > footer,
85
+ & > form > footer {
86
+ display: flex;
87
+ justify-content: flex-end;
88
+ gap: var(--space-2);
89
+ padding: var(--space-6);
90
+ padding-block-start: 0;
91
+ }
92
+ }
93
+ }
@@ -0,0 +1,72 @@
1
+ @layer components {
2
+ teff-dropdown {
3
+ [popover] {
4
+ position: fixed;
5
+ margin: 0;
6
+ /* Concentric: item radius (medium) + padding = container radius (large). */
7
+ padding: var(--space-2);
8
+ min-width: 12rem;
9
+ background-color: var(--card);
10
+ border: none;
11
+ border-radius: var(--radius-large);
12
+ box-shadow: var(--shadow-medium);
13
+ transform-origin: top;
14
+ opacity: 0;
15
+ transform: translateY(-4px) scale(0.97);
16
+ transition:
17
+ opacity 150ms var(--ease-out),
18
+ transform 150ms var(--ease-out),
19
+ display 150ms allow-discrete,
20
+ overlay 150ms allow-discrete;
21
+
22
+ &:popover-open {
23
+ opacity: 1;
24
+ transform: translateY(0) scale(1);
25
+ }
26
+
27
+ @starting-style {
28
+ &:popover-open {
29
+ opacity: 0;
30
+ transform: translateY(-4px) scale(0.97);
31
+ }
32
+ }
33
+
34
+ hr {
35
+ margin: var(--space-2) calc(var(--space-2) * -1);
36
+ }
37
+ }
38
+
39
+ [role="menuitem"] {
40
+ display: flex;
41
+ align-items: center;
42
+ justify-content: start;
43
+ gap: var(--space-2);
44
+ width: 100%;
45
+ min-height: 2.25rem;
46
+ padding: var(--space-2) var(--space-3);
47
+ font-size: var(--text-7);
48
+ font-weight: var(--font-normal);
49
+ text-align: start;
50
+ color: var(--foreground);
51
+ background: none;
52
+ border: none;
53
+ border-radius: var(--radius-medium);
54
+ box-shadow: none;
55
+ cursor: pointer;
56
+ transition: background-color var(--transition-fast);
57
+
58
+ &:hover, &:focus {
59
+ background-color: var(--accent);
60
+ outline: none;
61
+ }
62
+
63
+ &[data-variant="danger"] {
64
+ color: var(--danger);
65
+
66
+ &:hover, &:focus {
67
+ background-color: color-mix(in srgb, var(--danger) 10%, transparent);
68
+ }
69
+ }
70
+ }
71
+ }
72
+ }