fernwell 0.3.0 → 0.5.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/dist/fernwell.css CHANGED
@@ -1,4 +1,4 @@
1
- /*! fernwell v0.3.0 | MIT | https://github.com/JacobKnaack/fernwell */
1
+ /*! fernwell v0.5.0 | MIT | https://github.com/JacobKnaack/fernwell */
2
2
  /* src/css/tokens.css */
3
3
  @layer fw-tokens {
4
4
  :root,
@@ -30,6 +30,9 @@
30
30
  --fw-overlay: rgba(31, 36, 48, 0.55);
31
31
  --fw-overlay-soft: rgba(31, 36, 48, 0.32);
32
32
  --fw-focus-ring: 0 0 0 4px color-mix(in srgb, var(--fw-primary) 25%, transparent);
33
+ --fw-scrollbar-thumb: var(--fw-text-soft);
34
+ --fw-scrollbar-thumb-hover: color-mix(in srgb, var(--fw-text-soft), var(--fw-text) 15%);
35
+ --fw-scrollbar-track: transparent;
33
36
  --fw-font-display:
34
37
  "Plus Jakarta Sans",
35
38
  system-ui,
@@ -96,6 +99,9 @@
96
99
  --fw-overlay: rgba(0, 0, 0, 0.6);
97
100
  --fw-overlay-soft: rgba(0, 0, 0, 0.4);
98
101
  --fw-focus-ring: 0 0 0 4px color-mix(in srgb, var(--fw-primary) 25%, transparent);
102
+ --fw-scrollbar-thumb: var(--fw-text-soft);
103
+ --fw-scrollbar-thumb-hover: color-mix(in srgb, var(--fw-text-soft), var(--fw-text) 15%);
104
+ --fw-scrollbar-track: transparent;
99
105
  --fw-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
100
106
  --fw-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.35);
101
107
  --fw-shadow-lg: 0 12px 32px rgba(0, 0, 0, 0.45);
@@ -113,6 +119,10 @@
113
119
  -webkit-font-smoothing: antialiased;
114
120
  transition: background var(--fw-motion-base) var(--fw-motion-ease), color var(--fw-motion-base) var(--fw-motion-ease);
115
121
  }
122
+ [data-fw-theme-init],
123
+ [data-fw-theme-init] * {
124
+ transition: none !important;
125
+ }
116
126
  .fw-root,
117
127
  .fw-root *,
118
128
  .fw-root *::before,
@@ -147,6 +157,9 @@
147
157
  white-space: nowrap;
148
158
  border: 0;
149
159
  }
160
+ html:has(body.fw-scroll-lock) {
161
+ scrollbar-gutter: stable;
162
+ }
150
163
  .fw-scroll-lock {
151
164
  overflow: hidden;
152
165
  }
@@ -185,6 +198,155 @@
185
198
  }
186
199
  }
187
200
 
201
+ /* src/css/components/spacer.css */
202
+ .fw-spacer {
203
+ display: block;
204
+ flex-shrink: 0;
205
+ }
206
+ .fw-spacer[data-fw-axis=horizontal] {
207
+ display: inline-block;
208
+ width: var(--fw-spacer-size, var(--fw-sp-4));
209
+ height: 1px;
210
+ }
211
+ .fw-spacer:not([data-fw-axis=horizontal]):not([data-fw-axis=both]) {
212
+ width: 100%;
213
+ height: var(--fw-spacer-size, var(--fw-sp-4));
214
+ }
215
+ .fw-spacer[data-fw-axis=both] {
216
+ width: var(--fw-spacer-size, var(--fw-sp-4));
217
+ height: var(--fw-spacer-size, var(--fw-sp-4));
218
+ }
219
+ .fw-spacer[data-fw-size="1"] {
220
+ --fw-spacer-size: var(--fw-sp-1);
221
+ }
222
+ .fw-spacer[data-fw-size="2"] {
223
+ --fw-spacer-size: var(--fw-sp-2);
224
+ }
225
+ .fw-spacer[data-fw-size="3"] {
226
+ --fw-spacer-size: var(--fw-sp-3);
227
+ }
228
+ .fw-spacer[data-fw-size="4"] {
229
+ --fw-spacer-size: var(--fw-sp-4);
230
+ }
231
+ .fw-spacer[data-fw-size="5"] {
232
+ --fw-spacer-size: var(--fw-sp-5);
233
+ }
234
+ .fw-spacer[data-fw-size="6"] {
235
+ --fw-spacer-size: var(--fw-sp-6);
236
+ }
237
+ .fw-spacer[data-fw-size="7"] {
238
+ --fw-spacer-size: var(--fw-sp-7);
239
+ }
240
+ .fw-spacer[data-fw-size="8"] {
241
+ --fw-spacer-size: var(--fw-sp-8);
242
+ }
243
+ .fw-spacer[data-fw-size="9"] {
244
+ --fw-spacer-size: var(--fw-sp-9);
245
+ }
246
+ .fw-spacer[data-fw-size=auto] {
247
+ flex: 1 1 auto;
248
+ width: auto;
249
+ height: auto;
250
+ }
251
+
252
+ /* src/css/components/divider.css */
253
+ .fw-divider {
254
+ border: none;
255
+ margin: 0;
256
+ flex-shrink: 0;
257
+ background: var(--fw-bg-dim);
258
+ }
259
+ .fw-divider,
260
+ .fw-divider[aria-orientation=horizontal] {
261
+ width: 100%;
262
+ height: var(--fw-border-w);
263
+ }
264
+ .fw-divider[aria-orientation=vertical] {
265
+ width: var(--fw-border-w);
266
+ height: 100%;
267
+ align-self: stretch;
268
+ }
269
+ .fw-divider-dashed,
270
+ .fw-divider-dotted {
271
+ background: none;
272
+ height: 0;
273
+ }
274
+ .fw-divider-dashed {
275
+ border-top: var(--fw-border-w) dashed var(--fw-bg-dim);
276
+ }
277
+ .fw-divider-dotted {
278
+ border-top: var(--fw-border-w) dotted var(--fw-bg-dim);
279
+ }
280
+ .fw-divider[aria-orientation=vertical].fw-divider-dashed,
281
+ .fw-divider[aria-orientation=vertical].fw-divider-dotted {
282
+ width: 0;
283
+ border-top: none;
284
+ }
285
+ .fw-divider[aria-orientation=vertical].fw-divider-dashed {
286
+ border-left: var(--fw-border-w) dashed var(--fw-bg-dim);
287
+ }
288
+ .fw-divider[aria-orientation=vertical].fw-divider-dotted {
289
+ border-left: var(--fw-border-w) dotted var(--fw-bg-dim);
290
+ }
291
+ .fw-divider-labeled {
292
+ display: flex;
293
+ align-items: center;
294
+ gap: var(--fw-sp-3);
295
+ width: 100%;
296
+ color: var(--fw-text-soft);
297
+ font-size: 13px;
298
+ font-family: var(--fw-font-body);
299
+ }
300
+ .fw-divider-labeled::before,
301
+ .fw-divider-labeled::after {
302
+ content: "";
303
+ flex: 1;
304
+ height: var(--fw-border-w);
305
+ background: var(--fw-bg-dim);
306
+ }
307
+ .fw-divider-labeled-start::before {
308
+ flex: 0 0 var(--fw-sp-5);
309
+ }
310
+ .fw-divider-labeled-end::after {
311
+ flex: 0 0 var(--fw-sp-5);
312
+ }
313
+
314
+ /* src/css/components/aspect-ratio.css */
315
+ .fw-aspect-ratio {
316
+ position: relative;
317
+ overflow: hidden;
318
+ width: 100%;
319
+ aspect-ratio: var(--fw-aspect-ratio, 16 / 9);
320
+ }
321
+ .fw-aspect-ratio > img,
322
+ .fw-aspect-ratio > video,
323
+ .fw-aspect-ratio > iframe,
324
+ .fw-aspect-ratio > .fw-aspect-ratio-media {
325
+ display: block;
326
+ width: 100%;
327
+ height: 100%;
328
+ object-fit: cover;
329
+ object-position: var(--fw-aspect-position, 50% 50%);
330
+ }
331
+ .fw-aspect-ratio[data-fw-ratio="1:1"] {
332
+ --fw-aspect-ratio: 1 / 1;
333
+ }
334
+ .fw-aspect-ratio[data-fw-ratio="4:3"] {
335
+ --fw-aspect-ratio: 4 / 3;
336
+ }
337
+ .fw-aspect-ratio[data-fw-ratio="16:9"] {
338
+ --fw-aspect-ratio: 16 / 9;
339
+ }
340
+ .fw-aspect-ratio[data-fw-ratio="21:9"] {
341
+ --fw-aspect-ratio: 21 / 9;
342
+ }
343
+ .fw-aspect-ratio[data-fw-fit=contain] > img,
344
+ .fw-aspect-ratio[data-fw-fit=contain] > video,
345
+ .fw-aspect-ratio[data-fw-fit=contain] > iframe,
346
+ .fw-aspect-ratio[data-fw-fit=contain] > .fw-aspect-ratio-media {
347
+ object-fit: contain;
348
+ }
349
+
188
350
  /* src/css/components/button.css */
189
351
  .fw-btn {
190
352
  font-family: var(--fw-font-body);
@@ -286,6 +448,20 @@
286
448
  height: 15px;
287
449
  }
288
450
 
451
+ /* src/css/components/icon.css */
452
+ .fw-icon {
453
+ display: inline-flex;
454
+ width: 1em;
455
+ height: 1em;
456
+ color: inherit;
457
+ vertical-align: -0.125em;
458
+ }
459
+ .fw-icon svg {
460
+ width: 100%;
461
+ height: 100%;
462
+ display: block;
463
+ }
464
+
289
465
  /* src/css/components/card.css */
290
466
  .fw-card {
291
467
  background: var(--fw-surface);
@@ -1103,6 +1279,7 @@ textarea.fw-input,
1103
1279
  135deg,
1104
1280
  var(--fw-primary),
1105
1281
  var(--fw-primary-soft));
1282
+ color: var(--fw-on-primary);
1106
1283
  display: flex;
1107
1284
  align-items: center;
1108
1285
  justify-content: center;
@@ -1146,13 +1323,16 @@ textarea.fw-input,
1146
1323
  font-family: var(--fw-font-body);
1147
1324
  border-radius: var(--fw-r-xl);
1148
1325
  box-shadow: var(--fw-shadow-lg);
1326
+ overflow: hidden;
1149
1327
  width: 100%;
1150
1328
  max-width: 460px;
1329
+ transform: translateY(8px) scale(0.98);
1330
+ transition: transform var(--fw-motion-base) var(--fw-motion-ease);
1331
+ }
1332
+ .fw-modal-scroll {
1151
1333
  max-height: 88vh;
1152
1334
  overflow-y: auto;
1153
1335
  padding: var(--fw-sp-6);
1154
- transform: translateY(8px) scale(0.98);
1155
- transition: transform var(--fw-motion-base) var(--fw-motion-ease);
1156
1336
  }
1157
1337
  .fw-modal-wide {
1158
1338
  max-width: 600px;
@@ -1322,6 +1502,55 @@ textarea.fw-input,
1322
1502
  }
1323
1503
  }
1324
1504
 
1505
+ /* src/css/components/popover.css */
1506
+ .fw-popover {
1507
+ position: fixed;
1508
+ top: 0;
1509
+ left: 0;
1510
+ z-index: 40;
1511
+ width: max-content;
1512
+ max-width: min(320px, calc(100vw - 2 * var(--fw-sp-4)));
1513
+ background: var(--fw-surface);
1514
+ color: var(--fw-text);
1515
+ font-family: var(--fw-font-body);
1516
+ border: var(--fw-border-w) solid var(--fw-bg-dim);
1517
+ border-radius: var(--fw-r-lg);
1518
+ box-shadow: var(--fw-shadow-lg);
1519
+ padding: var(--fw-sp-4);
1520
+ opacity: 0;
1521
+ transform: scale(0.98);
1522
+ pointer-events: none;
1523
+ transition: opacity var(--fw-motion-base) var(--fw-motion-ease), transform var(--fw-motion-base) var(--fw-motion-ease);
1524
+ }
1525
+ .fw-popover.is-open {
1526
+ opacity: 1;
1527
+ transform: scale(1);
1528
+ pointer-events: auto;
1529
+ }
1530
+ .fw-popover-head {
1531
+ display: flex;
1532
+ align-items: flex-start;
1533
+ justify-content: space-between;
1534
+ gap: var(--fw-sp-3);
1535
+ margin-bottom: var(--fw-sp-3);
1536
+ }
1537
+ .fw-popover-title {
1538
+ font-family: var(--fw-font-display);
1539
+ font-size: 15px;
1540
+ font-weight: 700;
1541
+ color: var(--fw-text);
1542
+ margin: 0;
1543
+ }
1544
+ .fw-popover-body {
1545
+ font-size: 13px;
1546
+ color: var(--fw-text-soft);
1547
+ }
1548
+ @media (prefers-reduced-motion: reduce) {
1549
+ .fw-popover {
1550
+ transform: none;
1551
+ }
1552
+ }
1553
+
1325
1554
  /* src/css/components/toast.css */
1326
1555
  .fw-toast {
1327
1556
  position: fixed;
@@ -1709,7 +1938,7 @@ textarea.fw-input,
1709
1938
 
1710
1939
  /* src/css/components/table.css */
1711
1940
  .fw-table-wrap {
1712
- overflow-x: auto;
1941
+ overflow: hidden;
1713
1942
  background: var(--fw-surface);
1714
1943
  border: var(--fw-border-w) solid var(--fw-bg-dim);
1715
1944
  border-radius: var(--fw-r-lg);
@@ -1717,11 +1946,16 @@ textarea.fw-input,
1717
1946
  font-family: var(--fw-font-body);
1718
1947
  color: var(--fw-text);
1719
1948
  }
1720
- .fw-table-wrap:focus-visible {
1949
+ .fw-table-scroll {
1950
+ overflow-x: auto;
1951
+ }
1952
+ .fw-table-scroll:focus-visible {
1721
1953
  outline: none;
1954
+ }
1955
+ .fw-table-wrap:has(.fw-table-scroll:focus-visible) {
1722
1956
  box-shadow: var(--fw-focus-ring);
1723
1957
  }
1724
- .fw-table-wrap.fw-table-sticky {
1958
+ .fw-table-wrap.fw-table-sticky .fw-table-scroll {
1725
1959
  max-height: var(--fw-table-max-height, 460px);
1726
1960
  overflow: auto;
1727
1961
  }
@@ -1926,4 +2160,220 @@ th[aria-sort=descending] .fw-table-sort::after {
1926
2160
  }
1927
2161
  }
1928
2162
 
2163
+ /* src/css/components/tabs.css */
2164
+ .fw-tablist {
2165
+ display: flex;
2166
+ gap: var(--fw-sp-2);
2167
+ border-bottom: var(--fw-border-w) solid var(--fw-bg-dim);
2168
+ overflow-x: auto;
2169
+ scrollbar-width: none;
2170
+ }
2171
+ .fw-tablist::-webkit-scrollbar {
2172
+ display: none;
2173
+ }
2174
+ .fw-tablist[aria-orientation=vertical] {
2175
+ flex-direction: column;
2176
+ align-items: flex-start;
2177
+ border-bottom: none;
2178
+ border-right: var(--fw-border-w) solid var(--fw-bg-dim);
2179
+ overflow-x: visible;
2180
+ overflow-y: auto;
2181
+ }
2182
+ .fw-tab {
2183
+ appearance: none;
2184
+ background: transparent;
2185
+ border: none;
2186
+ border-bottom: 2px solid transparent;
2187
+ border-radius: var(--fw-r-sm) var(--fw-r-sm) 0 0;
2188
+ font-family: var(--fw-font-body);
2189
+ font-weight: 600;
2190
+ font-size: 13px;
2191
+ color: var(--fw-text-soft);
2192
+ padding: var(--fw-sp-3) var(--fw-sp-4);
2193
+ cursor: pointer;
2194
+ white-space: nowrap;
2195
+ flex-shrink: 0;
2196
+ transition:
2197
+ color var(--fw-motion-fast) var(--fw-motion-ease),
2198
+ border-color var(--fw-motion-fast) var(--fw-motion-ease),
2199
+ background var(--fw-motion-fast) var(--fw-motion-ease);
2200
+ }
2201
+ .fw-tablist[aria-orientation=vertical] .fw-tab {
2202
+ border-bottom: none;
2203
+ border-right: 2px solid transparent;
2204
+ border-radius: var(--fw-r-sm) 0 0 var(--fw-r-sm);
2205
+ text-align: left;
2206
+ width: 100%;
2207
+ }
2208
+ .fw-tab:hover:not([aria-selected=true]):not([aria-disabled=true]) {
2209
+ color: var(--fw-text);
2210
+ background: var(--fw-bg-dim);
2211
+ }
2212
+ .fw-tab[aria-selected=true] {
2213
+ color: var(--fw-text);
2214
+ border-color: var(--fw-secondary);
2215
+ }
2216
+ .fw-tab:focus-visible {
2217
+ outline: none;
2218
+ box-shadow: var(--fw-focus-ring);
2219
+ }
2220
+ .fw-tab[aria-disabled=true] {
2221
+ opacity: 0.45;
2222
+ cursor: not-allowed;
2223
+ }
2224
+ .fw-tabpanel {
2225
+ padding: var(--fw-sp-4) 0;
2226
+ }
2227
+ .fw-tabpanel:focus-visible {
2228
+ outline: none;
2229
+ border-radius: var(--fw-r-sm);
2230
+ box-shadow: var(--fw-focus-ring);
2231
+ }
2232
+ @media (prefers-reduced-motion: reduce) {
2233
+ .fw-tab {
2234
+ transition: none;
2235
+ }
2236
+ }
2237
+
2238
+ /* src/css/components/tooltip.css */
2239
+ .fw-tooltip {
2240
+ position: fixed;
2241
+ top: 0;
2242
+ left: 0;
2243
+ z-index: 50;
2244
+ max-width: 220px;
2245
+ background: var(--fw-text);
2246
+ color: var(--fw-bg);
2247
+ font-family: var(--fw-font-body);
2248
+ font-size: 12.5px;
2249
+ font-weight: 600;
2250
+ line-height: 1.4;
2251
+ border-radius: var(--fw-r-sm);
2252
+ padding: 6px 10px;
2253
+ box-shadow: var(--fw-shadow-md);
2254
+ opacity: 0;
2255
+ transform: scale(0.96);
2256
+ pointer-events: none;
2257
+ transition: opacity var(--fw-motion-fast) var(--fw-motion-ease), transform var(--fw-motion-fast) var(--fw-motion-ease);
2258
+ --fw-tooltip-arrow: 5px;
2259
+ }
2260
+ .fw-tooltip.is-open {
2261
+ opacity: 1;
2262
+ transform: scale(1);
2263
+ pointer-events: auto;
2264
+ }
2265
+ .fw-tooltip::after {
2266
+ content: "";
2267
+ position: absolute;
2268
+ width: 0;
2269
+ height: 0;
2270
+ border: var(--fw-tooltip-arrow) solid transparent;
2271
+ }
2272
+ .fw-tooltip[data-placement^=top]::after {
2273
+ top: 100%;
2274
+ left: var(--fw-tooltip-arrow-pos, 50%);
2275
+ transform: translateX(-50%);
2276
+ border-top-color: var(--fw-text);
2277
+ border-bottom-width: 0;
2278
+ }
2279
+ .fw-tooltip[data-placement^=bottom]::after {
2280
+ bottom: 100%;
2281
+ left: var(--fw-tooltip-arrow-pos, 50%);
2282
+ transform: translateX(-50%);
2283
+ border-bottom-color: var(--fw-text);
2284
+ border-top-width: 0;
2285
+ }
2286
+ .fw-tooltip[data-placement=left]::after {
2287
+ left: 100%;
2288
+ top: var(--fw-tooltip-arrow-pos, 50%);
2289
+ transform: translateY(-50%);
2290
+ border-left-color: var(--fw-text);
2291
+ border-right-width: 0;
2292
+ }
2293
+ .fw-tooltip[data-placement=right]::after {
2294
+ right: 100%;
2295
+ top: var(--fw-tooltip-arrow-pos, 50%);
2296
+ transform: translateY(-50%);
2297
+ border-right-color: var(--fw-text);
2298
+ border-left-width: 0;
2299
+ }
2300
+ @media (prefers-reduced-motion: reduce) {
2301
+ .fw-tooltip {
2302
+ transform: none;
2303
+ }
2304
+ }
2305
+
2306
+ /* src/css/components/scrollbar.css */
2307
+ .fw-root,
2308
+ .fw-modal-scroll,
2309
+ .fw-drawer-body,
2310
+ .fw-table-scroll {
2311
+ scrollbar-width: thin;
2312
+ scrollbar-color: var(--fw-scrollbar-thumb) var(--fw-scrollbar-track);
2313
+ }
2314
+ .fw-root::-webkit-scrollbar,
2315
+ .fw-modal-scroll::-webkit-scrollbar,
2316
+ .fw-drawer-body::-webkit-scrollbar,
2317
+ .fw-table-scroll::-webkit-scrollbar {
2318
+ width: var(--fw-sp-2);
2319
+ height: var(--fw-sp-2);
2320
+ }
2321
+ .fw-root::-webkit-scrollbar-track,
2322
+ .fw-modal-scroll::-webkit-scrollbar-track,
2323
+ .fw-drawer-body::-webkit-scrollbar-track {
2324
+ background: var(--fw-scrollbar-track);
2325
+ }
2326
+ .fw-root::-webkit-scrollbar-thumb,
2327
+ .fw-modal-scroll::-webkit-scrollbar-thumb,
2328
+ .fw-drawer-body::-webkit-scrollbar-thumb,
2329
+ .fw-table-scroll::-webkit-scrollbar-thumb {
2330
+ background-color: var(--fw-scrollbar-thumb);
2331
+ border-radius: var(--fw-r-full);
2332
+ border: 2px solid var(--fw-surface);
2333
+ }
2334
+ .fw-root::-webkit-scrollbar-thumb:hover,
2335
+ .fw-modal-scroll::-webkit-scrollbar-thumb:hover,
2336
+ .fw-drawer-body::-webkit-scrollbar-thumb:hover,
2337
+ .fw-table-scroll::-webkit-scrollbar-thumb:hover {
2338
+ background-color: var(--fw-scrollbar-thumb-hover);
2339
+ }
2340
+ .fw-table-scroll {
2341
+ scrollbar-color: var(--fw-scrollbar-thumb) var(--fw-bg-dim);
2342
+ }
2343
+ .fw-table-scroll::-webkit-scrollbar-track {
2344
+ background: var(--fw-bg-dim);
2345
+ }
2346
+ .fw-tablist:not([aria-orientation=vertical]) {
2347
+ mask-image:
2348
+ linear-gradient(
2349
+ to right,
2350
+ transparent,
2351
+ black 24px,
2352
+ black calc(100% - 24px),
2353
+ transparent);
2354
+ -webkit-mask-image:
2355
+ linear-gradient(
2356
+ to right,
2357
+ transparent,
2358
+ black 24px,
2359
+ black calc(100% - 24px),
2360
+ transparent);
2361
+ }
2362
+ .fw-tablist[aria-orientation=vertical] {
2363
+ mask-image:
2364
+ linear-gradient(
2365
+ to bottom,
2366
+ transparent,
2367
+ black 24px,
2368
+ black calc(100% - 24px),
2369
+ transparent);
2370
+ -webkit-mask-image:
2371
+ linear-gradient(
2372
+ to bottom,
2373
+ transparent,
2374
+ black 24px,
2375
+ black calc(100% - 24px),
2376
+ transparent);
2377
+ }
2378
+
1929
2379
  /* src/css/index.css */