frutjam 1.0.0-beta.0 → 1.2.0-beta.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "frutjam",
3
- "version": "1.0.0-beta.0",
3
+ "version": "1.2.0-beta.0",
4
4
  "description": "A utility-first CSS framework UI Library",
5
5
  "funding": "https://ko-fi.com/nezanuha",
6
6
  "main": "./dist/frutjam.css",
@@ -17,7 +17,7 @@
17
17
  ".": "./src/main.css",
18
18
  "./base/*": "./src/base/*",
19
19
  "./components/*": "./src/components/*",
20
- "./themes/*": "./src/themes/*",
20
+ "./themes/*": "./src/theme/*",
21
21
  "./utilities/*": "./src/utilities/*"
22
22
  },
23
23
  "scripts": {
@@ -1,7 +1,6 @@
1
1
  @import '../theme/jams/base.css';
2
- @utility accordion {
3
- @apply divide-y divide-core-200 dark:divide-core-900;
4
2
 
3
+ @utility accordion {
5
4
  display: grid;
6
5
  background: light-dark(
7
6
  var(--core-50),
@@ -15,19 +14,33 @@
15
14
  cursor: pointer;
16
15
 
17
16
  &>details {
18
- @apply text-pretty;
17
+ &:not(:last-child) {
18
+ border-bottom: 1px solid light-dark(
19
+ var(--core-200),
20
+ var(--core-900)
21
+ );
22
+ }
23
+ text-wrap: pretty;
19
24
 
20
25
  &>*:not(summary){
21
- @apply px-4 pb-4;
26
+ padding-inline: 1rem;
27
+ padding-bottom: 1rem;
22
28
  }
23
29
  &>summary::marker{
24
- @apply content-none;
30
+ content: none;
25
31
  }
26
32
  &>summary{
27
- @apply flex gap-4 items-center justify-between p-4 font-medium;
33
+ display: flex;
34
+ gap: 1rem;
35
+ align-items: center;
36
+ justify-content: space-between;
37
+ padding: 1rem;
38
+ font-weight: 500;
39
+
28
40
  &::after {
29
- @apply content-[url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCAyMCAyMCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZT0icmdiYSg1Myw1Myw1MywxKSIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ij4KICA8cGF0aCBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGQ9Im0xOS41IDguMjUtNy41IDcuNS03LjUtNy41Ii8+Cjwvc3ZnPg==')];
30
- @apply inline-block text-inherit;
41
+ content: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCAyMCAyMCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZT0icmdiYSg1Myw1Myw1MywxKSIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ij4KICA8cGF0aCBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGQ9Im0xOS41IDguMjUtNy41IDcuNS03LjUtNy41Ii8+Cjwvc3ZnPg==');
42
+ display: inline-block;
43
+ color: inherit;
31
44
  }
32
45
  }
33
46
  }
@@ -35,9 +48,11 @@
35
48
  &>details[open] {
36
49
 
37
50
  &>summary {
38
- @apply pb-4;
51
+ padding-bottom: 1rem;
39
52
  &::after {
40
- @apply rotate-180 origin-center transition-transform duration-300;
53
+ transform: rotate(180deg);
54
+ transform-origin: center;
55
+ transition: transform 300ms;
41
56
  }
42
57
  }
43
58
  }
@@ -0,0 +1,228 @@
1
+
2
+ @import "../theme/jams/base.css";
3
+
4
+ @utility badge-xs {
5
+ --badge-inline: 0.5rem;
6
+ --badge-block: 0.125rem;
7
+ --badge-text-size: 0.625rem;
8
+ }
9
+
10
+ @utility badge-sm {
11
+ --badge-inline: 0.625rem;
12
+ --badge-block: 0.25rem;
13
+ --badge-text-size: 0.75rem;
14
+ }
15
+
16
+ @utility badge-md {
17
+ --badge-inline: 0.75rem;
18
+ --badge-block: 0.375rem;
19
+ --badge-text-size: 0.875rem;
20
+ }
21
+
22
+ @utility badge-lg {
23
+ --badge-inline: 0.875rem;
24
+ --badge-block: 0.5rem;
25
+ --badge-text-size: 1rem;
26
+ }
27
+
28
+ @utility badge-xl {
29
+ --badge-inline: 1rem;
30
+ --badge-block: 0.625rem;
31
+ --badge-text-size: 1.125rem;
32
+ }
33
+
34
+ @utility badge-2xl {
35
+ --badge-inline: 1.125rem;
36
+ --badge-block: 0.75rem;
37
+ --badge-text-size: 1.25rem;
38
+ }
39
+
40
+ @utility badge-rounded {
41
+ --badge-radius: calc(infinity * 1px);
42
+ }
43
+
44
+ @utility badge-dashed {
45
+ background-color: transparent;
46
+ outline: 1px dashed light-dark(var(--badge-500), var(--badge-700));
47
+ color: light-dark(var(--badge-700), var(--badge-500));
48
+ }
49
+
50
+ @utility badge-outline {
51
+ background-color: transparent;
52
+ outline: 1px solid light-dark(var(--badge-500), var(--badge-800));
53
+ color: light-dark(var(--badge-800), var(--badge-200));
54
+ }
55
+
56
+ @utility badge-soft {
57
+ background-color: light-dark(
58
+ var(--badge-100),
59
+ color-mix(in oklab, var(--badge-900) 10%, transparent)
60
+ );
61
+ color: light-dark(var(--badge-800), var(--badge-400));
62
+ }
63
+
64
+ @utility badge-ghost {
65
+ background-color: transparent;
66
+ color: light-dark(var(--badge-600), var(--badge-300));
67
+ }
68
+
69
+ @utility badge {
70
+ @apply badge-md;
71
+ gap: 0.5rem;
72
+ border-radius: var(--badge-radius, var(--radius-badge));
73
+ display: inline-flex;
74
+ align-items: center;
75
+ justify-content: center;
76
+ vertical-align: middle;
77
+ text-align: center;
78
+ width: fit-content;
79
+
80
+ padding-inline: var(--badge-inline);
81
+ padding-block: var(--badge-block);
82
+ font-size: var(--badge-text-size);
83
+
84
+ &:where(.badge-square){
85
+ padding-inline: var(--badge-inline);
86
+ padding-block: var(--badge-inline);
87
+ width: var(--badge-block);
88
+ height: var(--badge-block);
89
+ }
90
+
91
+ /* for default badge */
92
+ &:not(
93
+ .badge-primary,
94
+ .badge-secondary,
95
+ .badge-accent,
96
+ .badge-info,
97
+ .badge-success,
98
+ .badge-warning,
99
+ .badge-error
100
+ ) {
101
+ background-color: light-dark(var(--badge-200), var(--badge-800));
102
+ color: light-dark(var(--badge-900), var(--badge-50));
103
+ }
104
+
105
+ /* for all badge exclude default badge */
106
+ &:is(
107
+ .badge-primary,
108
+ .badge-secondary,
109
+ .badge-accent,
110
+ .badge-info,
111
+ .badge-success,
112
+ .badge-warning,
113
+ .badge-error
114
+ ) {
115
+ background-color: light-dark(var(--badge-700), var(--badge-700));
116
+ color: var(--badge-50);
117
+ }
118
+
119
+ --badge-50: var(--default-50);
120
+ --badge-100: var(--default-100);
121
+ --badge-200: var(--default-200);
122
+ --badge-300: var(--default-300);
123
+ --badge-400: var(--default-400);
124
+ --badge-500: var(--default-500);
125
+ --badge-600: var(--default-600);
126
+ --badge-700: var(--default-700);
127
+ --badge-800: var(--default-800);
128
+ --badge-900: var(--default-900);
129
+ --badge-950: var(--default-950);
130
+ }
131
+
132
+ @utility badge-primary {
133
+ --badge-50: var(--primary-50);
134
+ --badge-100: var(--primary-100);
135
+ --badge-200: var(--primary-200);
136
+ --badge-300: var(--primary-300);
137
+ --badge-400: var(--primary-400);
138
+ --badge-500: var(--primary-500);
139
+ --badge-600: var(--primary-600);
140
+ --badge-700: var(--primary-700);
141
+ --badge-800: var(--primary-800);
142
+ --badge-900: var(--primary-900);
143
+ --badge-950: var(--primary-950);
144
+ }
145
+
146
+ @utility badge-secondary {
147
+ --badge-50: var(--secondary-50);
148
+ --badge-100: var(--secondary-100);
149
+ --badge-200: var(--secondary-200);
150
+ --badge-300: var(--secondary-300);
151
+ --badge-400: var(--secondary-400);
152
+ --badge-500: var(--secondary-500);
153
+ --badge-600: var(--secondary-600);
154
+ --badge-700: var(--secondary-700);
155
+ --badge-800: var(--secondary-800);
156
+ --badge-900: var(--secondary-900);
157
+ --badge-950: var(--secondary-950);
158
+ }
159
+
160
+ @utility badge-accent {
161
+ --badge-50: var(--accent-50);
162
+ --badge-100: var(--accent-100);
163
+ --badge-200: var(--accent-200);
164
+ --badge-300: var(--accent-300);
165
+ --badge-400: var(--accent-400);
166
+ --badge-500: var(--accent-500);
167
+ --badge-600: var(--accent-600);
168
+ --badge-700: var(--accent-700);
169
+ --badge-800: var(--accent-800);
170
+ --badge-900: var(--accent-900);
171
+ --badge-950: var(--accent-950);
172
+ }
173
+
174
+ @utility badge-info {
175
+ --badge-50: var(--info-50);
176
+ --badge-100: var(--info-100);
177
+ --badge-200: var(--info-200);
178
+ --badge-300: var(--info-300);
179
+ --badge-400: var(--info-400);
180
+ --badge-500: var(--info-500);
181
+ --badge-600: var(--info-600);
182
+ --badge-700: var(--info-700);
183
+ --badge-800: var(--info-800);
184
+ --badge-900: var(--info-900);
185
+ --badge-950: var(--info-950);
186
+ }
187
+
188
+ @utility badge-success {
189
+ --badge-50: var(--success-50);
190
+ --badge-100: var(--success-100);
191
+ --badge-200: var(--success-200);
192
+ --badge-300: var(--success-300);
193
+ --badge-400: var(--success-400);
194
+ --badge-500: var(--success-500);
195
+ --badge-600: var(--success-600);
196
+ --badge-700: var(--success-700);
197
+ --badge-800: var(--success-800);
198
+ --badge-900: var(--success-900);
199
+ --badge-950: var(--success-950);
200
+ }
201
+
202
+ @utility badge-warning {
203
+ --badge-50: var(--warning-50);
204
+ --badge-100: var(--warning-100);
205
+ --badge-200: var(--warning-200);
206
+ --badge-300: var(--warning-300);
207
+ --badge-400: var(--warning-400);
208
+ --badge-500: var(--warning-500);
209
+ --badge-600: var(--warning-600);
210
+ --badge-700: var(--warning-700);
211
+ --badge-800: var(--warning-800);
212
+ --badge-900: var(--warning-900);
213
+ --badge-950: var(--warning-950);
214
+ }
215
+
216
+ @utility badge-error {
217
+ --badge-50: var(--error-50);
218
+ --badge-100: var(--error-100);
219
+ --badge-200: var(--error-200);
220
+ --badge-300: var(--error-300);
221
+ --badge-400: var(--error-400);
222
+ --badge-500: var(--error-500);
223
+ --badge-600: var(--error-600);
224
+ --badge-700: var(--error-700);
225
+ --badge-800: var(--error-800);
226
+ --badge-900: var(--error-900);
227
+ --badge-950: var(--error-950);
228
+ }
@@ -1,6 +1,7 @@
1
- @utility breadcrumb {
2
- @apply py-2;
1
+ @import "../theme/jams/base.css";
3
2
 
3
+ @utility breadcrumb {
4
+ padding-block: 0.5rem;
4
5
  max-width: 100%;
5
6
  overflow-x: auto;
6
7
 
@@ -13,7 +14,7 @@
13
14
  white-space: nowrap;
14
15
 
15
16
  /* Automatically hide default separator if a custom separator is used */
16
- .breadcrumb-item {
17
+ .breadcrumb-item, li {
17
18
  display: flex;
18
19
  align-items: center;
19
20
 
@@ -23,17 +24,22 @@
23
24
  & > span {
24
25
  display: flex;
25
26
  align-items: center;
26
- @apply gap-2;
27
+ gap: 0.5rem;
27
28
 
28
29
  @media (hover: hover) {
29
30
  &:hover:not([aria-current="page"]):not(.breadcrumb-current) {
30
- @apply underline underline-offset-4;
31
+ text-decoration-line: underline;
32
+ text-underline-offset: 4px;
31
33
  cursor: pointer;
32
34
  }
33
35
  }
34
36
 
35
37
  &:focus {
36
- @apply outline-hidden;
38
+ outline-style: none;
39
+ @media (forced-colors: active) {
40
+ outline: 2px solid transparent;
41
+ outline-offset: 2px;
42
+ }
37
43
  }
38
44
 
39
45
  &:focus-visible {
@@ -43,17 +49,24 @@
43
49
  }
44
50
 
45
51
  /* Only show default separator if NOT preceded by .breadcrumb-separator */
46
- & + .breadcrumb-item::before {
52
+ & + .breadcrumb-item::before, & + li::before {
47
53
  content: "";
48
- @apply mr-3 ml-2 block h-1.5 w-1.5 opacity-40;
49
- rotate: 45deg;
54
+ margin-right: 0.75rem;
55
+ margin-left: 0.5rem;
56
+ height: 0.375rem;
57
+ width: 0.375rem;
58
+ opacity: 40%;
59
+ display: block;
60
+ transform: rotate(45deg);
61
+ transition: transform 300ms;
50
62
  border-top: 1px solid;
51
63
  border-right: 1px solid;
52
64
  background-color: #0000;
53
65
  }
54
66
 
55
- [dir="rtl"] & + .breadcrumb-item::before {
56
- rotate: -135deg;
67
+ [dir="rtl"] & + .breadcrumb-item::before, [dir="rtl"] & + li::before {
68
+ transform: rotate(-135deg);
69
+ transition: transform 300ms;
57
70
  }
58
71
 
59
72
  /* Remove default separator when preceded by custom .breadcrumb-separator */
@@ -66,7 +79,12 @@
66
79
  .breadcrumb-separator {
67
80
  display: flex;
68
81
  align-items: center;
69
- @apply mx-2 text-sm text-gray-500;
82
+ margin-inline: 0.5rem;
83
+ font-size: 0.875rem;
84
+ color: light-dark(
85
+ var(--core-200),
86
+ var(--core-900)
87
+ );
70
88
  }
71
89
  }
72
90
  }
@@ -1,79 +1,66 @@
1
1
  @import "../theme/jams/base.css";
2
2
  @import "../theme/animation/wiggle.css";
3
3
 
4
- @utility btn-size {
5
- padding-inline: var(--btn-inline);
6
- padding-block: var(--btn-block);
7
- font-size: var(--btn-text-size);
8
- }
9
-
10
4
  @utility btn-xs {
11
5
  --btn-inline: 0.875rem;
12
6
  --btn-block: 0.375rem;
13
7
  --btn-text-size: 0.75rem;
14
- @apply btn-size;
15
8
  }
16
9
 
17
10
  @utility btn-sm {
18
11
  --btn-inline: 1rem;
19
12
  --btn-block: 0.5rem;
20
13
  --btn-text-size: 0.875rem;
21
- @apply btn-size;
22
14
  }
23
15
 
24
16
  @utility btn-md {
25
17
  --btn-inline: 1.125rem;
26
18
  --btn-block: 0.625rem;
27
19
  --btn-text-size: 1rem;
28
- @apply btn-size;
29
20
  }
30
21
 
31
22
  @utility btn-lg {
32
23
  --btn-inline: 1.25rem;
33
24
  --btn-block: 0.75rem;
34
25
  --btn-text-size: 1.125rem;
35
- @apply btn-size;
36
26
  }
37
27
 
38
28
  @utility btn-xl {
39
29
  --btn-inline: 1.375rem;
40
30
  --btn-block: 0.875rem;
41
31
  --btn-text-size: 1.25rem;
42
- @apply btn-size;
43
32
  }
44
33
 
45
34
  @utility btn-2xl {
46
35
  --btn-inline: 1.5rem;
47
36
  --btn-block: 1rem;
48
- --btn-text-size: 1.5rem;
49
- @apply btn-size;
37
+ --btn-text-size: 1.375rem;
50
38
  }
51
39
 
52
- @utility btn-square {
53
- padding-inline: var(--btn-block);
54
- padding-block: var(--btn-block);
40
+ /*btn-circle deprecated*/
41
+ @utility btn-circle {
42
+ --btn-radius: calc(infinity * 1px);
55
43
  }
56
44
 
57
- @utility btn-circle {
58
- @apply btn-md rounded-full;
59
- padding-inline: var(--btn-block);
60
- padding-block: var(--btn-block);
45
+ @utility btn-rounded {
46
+ --btn-radius: calc(infinity * 1px);
61
47
  }
62
48
 
63
49
  @utility btn-wide {
64
- @apply w-full max-w-xs;
50
+ --btn-max-width: var(--container-xs);
51
+ --btn-width: 100%;
65
52
  }
66
53
 
67
54
  @utility btn-block {
68
- @apply w-full block;
55
+ --btn-width: 100%;
56
+ --btn-display: block;
69
57
  }
70
58
 
71
59
  @utility btn-link-active {
72
- background: transparent;
60
+ background-color: transparent;
73
61
  color: light-dark(var(--btn-800), var(--btn-500));
74
62
  text-decoration: underline;
75
63
  text-underline-offset: 4px;
76
- cursor: pointer;
77
64
  }
78
65
 
79
66
  @utility btn-ghost-active {
@@ -148,7 +135,7 @@
148
135
 
149
136
  @utility btn-dashed {
150
137
  &:not(.btn-active) {
151
- background: transparent;
138
+ background-color: transparent;
152
139
  outline: 1px dashed light-dark(var(--btn-500), var(--btn-700));
153
140
  color: light-dark(var(--btn-700), var(--btn-500));
154
141
  }
@@ -156,7 +143,7 @@
156
143
 
157
144
  @utility btn-outline {
158
145
  &:not(.btn-active) {
159
- background: transparent;
146
+ background-color: transparent;
160
147
  outline: 1px solid light-dark(var(--btn-500), var(--btn-800));
161
148
  color: light-dark(var(--btn-800), var(--btn-200));
162
149
  }
@@ -174,27 +161,29 @@
174
161
 
175
162
  @utility btn-ghost {
176
163
  &:not(.btn-active) {
177
- background: transparent;
164
+ background-color: transparent;
178
165
  color: light-dark(var(--btn-600), var(--btn-300));
179
166
  }
180
167
  }
181
168
 
182
169
  @utility btn-link {
183
170
  &:not(.btn-active) {
184
- background: transparent;
171
+ background-color: transparent;
185
172
  color: light-dark(var(--btn-700), var(--btn-400));
186
173
  }
187
174
  }
188
175
 
189
176
  @utility btn {
190
- @apply btn-md text-shadow-xs/5 gap-1.5 leading-normal;
191
- transition:
192
- translate 0.2s ease-out,
193
- visibility 0.2s allow-discrete,
194
- background-color 0.2s ease-out,
195
- opacity 0.1s ease-out;
177
+ @apply btn-md;
178
+
179
+ text-shadow: 0px 1px 1px color-mix(in oklab, var(--btn-900) 10%, transparent);
180
+ line-height: 1.5;
181
+ width: var(--btn-width);
182
+ max-width: var(--btn-max-width);
183
+ transition: translate 0.2s ease-out, visibility 0.2s allow-discrete, background-color 0.2s ease-out, opacity 0.1s ease-out;
196
184
  position: relative;
197
- display: inline-flex;
185
+ display: var(--btn-display, inline-flex);
186
+ gap: 0.375rem;
198
187
  flex-shrink: 0;
199
188
  align-items: center;
200
189
  justify-content: center;
@@ -203,11 +192,20 @@
203
192
  vertical-align: middle;
204
193
  font-weight: 500;
205
194
  text-align: center;
206
- border-radius: var(--radius-btn);
195
+ border-radius: var(--btn-radius, var(--radius-btn));
207
196
  overflow: hidden;
208
197
  cursor: pointer;
209
198
  box-sizing: border-box;
210
199
 
200
+ padding-inline: var(--btn-inline);
201
+ padding-block: var(--btn-block);
202
+ font-size: var(--btn-text-size);
203
+
204
+ &:where(.btn-square){
205
+ padding-inline: var(--btn-block);
206
+ padding-block: var(--btn-block);
207
+ }
208
+
211
209
  /* for default btn */
212
210
  &:not(
213
211
  .btn-primary,
@@ -237,18 +235,20 @@
237
235
  }
238
236
 
239
237
  &:is(:disabled, [disabled], .btn-disabled) {
240
- @apply opacity-20 cursor-not-allowed pointer-events-none;
238
+ opacity: 20%;
239
+ cursor: not-allowed;
240
+ pointer-events: none;
241
241
  }
242
242
 
243
243
  &:is(input[type="checkbox"], input[type="radio"]) {
244
- @apply appearance-none;
244
+ appearance: none;
245
245
 
246
246
  &::after {
247
247
  content: attr(aria-label);
248
248
  }
249
249
 
250
250
  &:checked {
251
- @apply isolate;
251
+ isolation: isolate;
252
252
  }
253
253
  }
254
254
 
@@ -1,27 +1,28 @@
1
+ @import "../theme/jams/base.css";
2
+
1
3
  @utility card-outline {
2
4
  border: 1px solid light-dark(
3
5
  var(--core-200),
4
- var(--core-900)
6
+ var(--core-950)
5
7
  );
6
8
  }
7
9
 
8
10
  @utility card-dashed {
9
11
  border: 1px dashed light-dark(
10
12
  var(--core-200),
11
- var(--core-900)
13
+ var(--core-950)
12
14
  );
13
15
  }
14
16
 
15
17
  /* card size */
16
18
 
17
19
  @utility card {
18
- @apply relative flex flex-col;
20
+ position: relative;
21
+ display: flex;
22
+ flex-direction: column;
19
23
  border-radius: var(--radius-card);
20
24
  overflow:hidden;
21
- background: light-dark(
22
- var(--core-50),
23
- var(--core-900)
24
- );
25
+ background-color: transparent;
25
26
 
26
27
  :where(figure:first-child) {
27
28
  overflow: hidden;
@@ -41,14 +42,22 @@
41
42
  }
42
43
 
43
44
  @utility card-body {
44
- @apply flex flex-auto flex-col gap-2;
45
+ display: flex;
46
+ gap: 0.5rem;
47
+ flex: auto;
48
+ flex-direction: column;
45
49
  padding: 1.5rem;
46
50
 
47
51
  :where(p){
48
- @apply text-base grow;
52
+ flex-grow: 1;
53
+ font-size: 1rem;
49
54
  }
50
55
  }
51
56
 
52
57
  @utility card-title {
53
- @apply flex items-center gap-2 font-semibold text-lg;
58
+ display: flex;
59
+ align-items: center;
60
+ gap: 0.5rem;
61
+ font-weight: 600;
62
+ font-size: 1.125rem;
54
63
  }