@taicode/common-web 1.1.15 → 1.1.16
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/output/cache-api/cache-api.d.ts +5 -1
- package/output/cache-api/cache-api.d.ts.map +1 -1
- package/output/cache-api/cache-api.js +13 -2
- package/output/cache-api/cache-api.test.js +161 -0
- package/package.json +1 -1
- package/output/catalyst/alert.jsx +0 -55
- package/output/catalyst/auth-layout.jsx +0 -7
- package/output/catalyst/avatar.jsx +0 -45
- package/output/catalyst/badge.jsx +0 -53
- package/output/catalyst/button.jsx +0 -187
- package/output/catalyst/checkbox.jsx +0 -105
- package/output/catalyst/combobox.jsx +0 -120
- package/output/catalyst/description-list.jsx +0 -24
- package/output/catalyst/dialog.jsx +0 -55
- package/output/catalyst/divider.jsx +0 -16
- package/output/catalyst/dropdown.jsx +0 -102
- package/output/catalyst/fieldset.jsx +0 -41
- package/output/catalyst/heading.jsx +0 -22
- package/output/catalyst/input.jsx +0 -73
- package/output/catalyst/link.jsx +0 -14
- package/output/catalyst/listbox.jsx +0 -120
- package/output/catalyst/navbar.jsx +0 -67
- package/output/catalyst/pagination.jsx +0 -52
- package/output/catalyst/radio.jsx +0 -103
- package/output/catalyst/select.jsx +0 -59
- package/output/catalyst/sidebar-layout.jsx +0 -58
- package/output/catalyst/sidebar.jsx +0 -85
- package/output/catalyst/stacked-layout.jsx +0 -55
- package/output/catalyst/switch.jsx +0 -161
- package/output/catalyst/table.jsx +0 -68
- package/output/catalyst/text.jsx +0 -29
- package/output/catalyst/textarea.jsx +0 -49
- package/output/helpers/cache-api/cache-api.d.ts +0 -13
- package/output/helpers/cache-api/cache-api.d.ts.map +0 -1
- package/output/helpers/cache-api/cache-api.js +0 -114
- package/output/helpers/cache-api/cache-api.test.d.ts +0 -2
- package/output/helpers/cache-api/cache-api.test.d.ts.map +0 -1
- package/output/helpers/cache-api/cache-api.test.js +0 -348
- package/output/helpers/cache-api/index.d.ts +0 -2
- package/output/helpers/cache-api/index.d.ts.map +0 -1
- package/output/helpers/cache-api/index.js +0 -1
- package/output/helpers/service/index.d.ts +0 -1
- package/output/helpers/service/index.d.ts.map +0 -1
- package/output/helpers/service/index.js +0 -1
- package/output/helpers/service/service.d.ts +0 -5
- package/output/helpers/service/service.d.ts.map +0 -1
- package/output/helpers/service/service.js +0 -2
- package/output/helpers/side-cache/index.d.ts +0 -2
- package/output/helpers/side-cache/index.d.ts.map +0 -1
- package/output/helpers/side-cache/index.js +0 -1
- package/output/helpers/side-cache/side-cache.d.ts +0 -10
- package/output/helpers/side-cache/side-cache.d.ts.map +0 -1
- package/output/helpers/side-cache/side-cache.js +0 -137
- package/output/helpers/side-cache/side-cache.test.d.ts +0 -2
- package/output/helpers/side-cache/side-cache.test.d.ts.map +0 -1
- package/output/helpers/side-cache/side-cache.test.js +0 -179
- package/output/helpers/use-observer/index.d.ts +0 -2
- package/output/helpers/use-observer/index.d.ts.map +0 -1
- package/output/helpers/use-observer/index.js +0 -1
- package/output/helpers/use-observer/use-observer.d.ts +0 -3
- package/output/helpers/use-observer/use-observer.d.ts.map +0 -1
- package/output/helpers/use-observer/use-observer.js +0 -16
- package/output/helpers/use-observer/use-observer.test.d.ts +0 -2
- package/output/helpers/use-observer/use-observer.test.d.ts.map +0 -1
- package/output/helpers/use-observer/use-observer.test.jsx +0 -134
- package/output/service/service.test.jsx +0 -367
- package/output/use-observer/use-observer.test.jsx +0 -134
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
type ApiFunc<P extends unknown[], R = unknown> = (...args: P) => Promise<R>;
|
|
2
2
|
export declare class CacheApi<P extends unknown[], R> {
|
|
3
3
|
private func;
|
|
4
|
-
private cache;
|
|
4
|
+
private readonly cache;
|
|
5
5
|
private lastArgs;
|
|
6
6
|
private accessor pendingRequests;
|
|
7
7
|
constructor(func: ApiFunc<P, R>);
|
|
@@ -14,6 +14,10 @@ export declare class CacheApi<P extends unknown[], R> {
|
|
|
14
14
|
* @param force 强制刷新,清除缓存
|
|
15
15
|
*/
|
|
16
16
|
refresh(force?: boolean): Promise<R>;
|
|
17
|
+
/**
|
|
18
|
+
* 重置缓存和状态
|
|
19
|
+
*/
|
|
20
|
+
reset(): Promise<void>;
|
|
17
21
|
}
|
|
18
22
|
export {};
|
|
19
23
|
//# sourceMappingURL=cache-api.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-api.d.ts","sourceRoot":"","sources":["../../source/cache-api/cache-api.ts"],"names":[],"mappings":"AAKA,KAAK,OAAO,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;AAE3E,qBAAa,QAAQ,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"cache-api.d.ts","sourceRoot":"","sources":["../../source/cache-api/cache-api.ts"],"names":[],"mappings":"AAKA,KAAK,OAAO,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;AAE3E,qBAAa,QAAQ,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,CAAC;IAW9B,OAAO,CAAC,IAAI;IATxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAG3C,OAAO,CAAC,QAAQ,CAAe;IAI/B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAI;gBAEhB,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAIvC,IACI,OAAO,IAAI,OAAO,CAErB;IAED,IACI,KAAK,IAAI,OAAO,CAEnB;IAED,IACI,KAAK,IAAI,CAAC,GAAG,SAAS,CAEzB;IAGK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAuBlC;;;OAGG;IAEG,OAAO,CAAC,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC,CAAC,CAAC;IAcjD;;OAEG;IAEG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK7B"}
|
|
@@ -43,12 +43,12 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
|
|
|
43
43
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
44
44
|
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
45
45
|
};
|
|
46
|
-
import { action, computed, observable } from 'mobx';
|
|
46
|
+
import { action, computed, observable, when } from 'mobx';
|
|
47
47
|
import { catchIt } from '@taicode/common-base';
|
|
48
48
|
import { SideCache } from '../side-cache';
|
|
49
49
|
let CacheApi = (() => {
|
|
50
50
|
var _a, _CacheApi_pendingRequests_accessor_storage;
|
|
51
|
-
var _b, _c;
|
|
51
|
+
var _b, _c, _d;
|
|
52
52
|
let _instanceExtraInitializers = [];
|
|
53
53
|
let _pendingRequests_decorators;
|
|
54
54
|
let _pendingRequests_initializers = [];
|
|
@@ -58,6 +58,7 @@ let CacheApi = (() => {
|
|
|
58
58
|
let _get_value_decorators;
|
|
59
59
|
let _call_decorators;
|
|
60
60
|
let _refresh_decorators;
|
|
61
|
+
let _reset_decorators;
|
|
61
62
|
return _a = class CacheApi {
|
|
62
63
|
// 记录当前正在进行的请求数量
|
|
63
64
|
get pendingRequests() { return __classPrivateFieldGet(this, _CacheApi_pendingRequests_accessor_storage, "f"); }
|
|
@@ -111,6 +112,14 @@ let CacheApi = (() => {
|
|
|
111
112
|
// 重新调用最近一次的参数
|
|
112
113
|
return await this.call(...this.lastArgs);
|
|
113
114
|
}
|
|
115
|
+
/**
|
|
116
|
+
* 重置缓存和状态
|
|
117
|
+
*/
|
|
118
|
+
async reset() {
|
|
119
|
+
await when(() => this.pendingRequests === 0);
|
|
120
|
+
this.lastArgs = undefined;
|
|
121
|
+
this.cache.clear();
|
|
122
|
+
}
|
|
114
123
|
},
|
|
115
124
|
_CacheApi_pendingRequests_accessor_storage = new WeakMap(),
|
|
116
125
|
(() => {
|
|
@@ -121,12 +130,14 @@ let CacheApi = (() => {
|
|
|
121
130
|
_get_value_decorators = [computed];
|
|
122
131
|
_call_decorators = [(_b = action).bound.bind(_b)];
|
|
123
132
|
_refresh_decorators = [(_c = action).bound.bind(_c)];
|
|
133
|
+
_reset_decorators = [(_d = action).bound.bind(_d)];
|
|
124
134
|
__esDecorate(_a, null, _pendingRequests_decorators, { kind: "accessor", name: "pendingRequests", static: false, private: false, access: { has: obj => "pendingRequests" in obj, get: obj => obj.pendingRequests, set: (obj, value) => { obj.pendingRequests = value; } }, metadata: _metadata }, _pendingRequests_initializers, _pendingRequests_extraInitializers);
|
|
125
135
|
__esDecorate(_a, null, _get_loading_decorators, { kind: "getter", name: "loading", static: false, private: false, access: { has: obj => "loading" in obj, get: obj => obj.loading }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
126
136
|
__esDecorate(_a, null, _get_empty_decorators, { kind: "getter", name: "empty", static: false, private: false, access: { has: obj => "empty" in obj, get: obj => obj.empty }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
127
137
|
__esDecorate(_a, null, _get_value_decorators, { kind: "getter", name: "value", static: false, private: false, access: { has: obj => "value" in obj, get: obj => obj.value }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
128
138
|
__esDecorate(_a, null, _call_decorators, { kind: "method", name: "call", static: false, private: false, access: { has: obj => "call" in obj, get: obj => obj.call }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
129
139
|
__esDecorate(_a, null, _refresh_decorators, { kind: "method", name: "refresh", static: false, private: false, access: { has: obj => "refresh" in obj, get: obj => obj.refresh }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
140
|
+
__esDecorate(_a, null, _reset_decorators, { kind: "method", name: "reset", static: false, private: false, access: { has: obj => "reset" in obj, get: obj => obj.reset }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
130
141
|
if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
131
142
|
})(),
|
|
132
143
|
_a;
|
|
@@ -446,4 +446,165 @@ describe('CacheApi', () => {
|
|
|
446
446
|
expect(noParamMockFunc).toHaveBeenCalledTimes(2);
|
|
447
447
|
});
|
|
448
448
|
});
|
|
449
|
+
describe('reset 方法', () => {
|
|
450
|
+
it('应该清除所有缓存数据', async () => {
|
|
451
|
+
mockApiFunc.mockResolvedValue('test-result');
|
|
452
|
+
// 先调用 API 产生缓存
|
|
453
|
+
await cacheApi.call('param1', 123);
|
|
454
|
+
expect(cacheApi.value).toBe('test-result');
|
|
455
|
+
expect(cacheApi.empty).toBe(false);
|
|
456
|
+
// 重置
|
|
457
|
+
await cacheApi.reset();
|
|
458
|
+
// 验证缓存被清除
|
|
459
|
+
expect(cacheApi.value).toBeUndefined();
|
|
460
|
+
expect(cacheApi.empty).toBe(true);
|
|
461
|
+
});
|
|
462
|
+
it('应该清除 lastArgs 参数记录', async () => {
|
|
463
|
+
mockApiFunc.mockResolvedValue('test-result');
|
|
464
|
+
// 先调用 API
|
|
465
|
+
await cacheApi.call('param1', 123);
|
|
466
|
+
// 重置
|
|
467
|
+
await cacheApi.reset();
|
|
468
|
+
// 尝试刷新应该抛出错误,因为 lastArgs 已被清除
|
|
469
|
+
await expect(cacheApi.refresh()).rejects.toThrow('没有可用的参数来刷新数据,请先调用 call 方法');
|
|
470
|
+
});
|
|
471
|
+
it('应该在没有任何调用时也能正常重置', async () => {
|
|
472
|
+
// 直接重置,不应该抛出错误
|
|
473
|
+
await expect(cacheApi.reset()).resolves.toBeUndefined();
|
|
474
|
+
// 验证状态
|
|
475
|
+
expect(cacheApi.value).toBeUndefined();
|
|
476
|
+
expect(cacheApi.empty).toBe(true);
|
|
477
|
+
expect(cacheApi.loading).toBe(false);
|
|
478
|
+
});
|
|
479
|
+
it('应该等待所有进行中的请求完成后再重置', async () => {
|
|
480
|
+
let resolveFn;
|
|
481
|
+
const promise = new Promise((resolve) => {
|
|
482
|
+
resolveFn = resolve;
|
|
483
|
+
});
|
|
484
|
+
mockApiFunc.mockReturnValue(promise);
|
|
485
|
+
// 启动一个异步请求
|
|
486
|
+
const callPromise = cacheApi.call('test', 1);
|
|
487
|
+
expect(cacheApi.loading).toBe(true);
|
|
488
|
+
// 开始重置(应该等待请求完成)
|
|
489
|
+
const resetPromise = cacheApi.reset();
|
|
490
|
+
// 此时请求还在进行中,缓存应该还有值
|
|
491
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
492
|
+
// 完成请求
|
|
493
|
+
resolveFn('result');
|
|
494
|
+
await callPromise;
|
|
495
|
+
// 等待重置完成
|
|
496
|
+
await resetPromise;
|
|
497
|
+
// 验证重置后的状态
|
|
498
|
+
expect(cacheApi.value).toBeUndefined();
|
|
499
|
+
expect(cacheApi.empty).toBe(true);
|
|
500
|
+
expect(cacheApi.loading).toBe(false);
|
|
501
|
+
});
|
|
502
|
+
it('应该等待多个并发请求都完成后再重置', async () => {
|
|
503
|
+
const resolvers = [];
|
|
504
|
+
mockApiFunc.mockImplementation((param) => {
|
|
505
|
+
return new Promise((resolve) => {
|
|
506
|
+
resolvers.push((value) => resolve(`${param}-${value}`));
|
|
507
|
+
});
|
|
508
|
+
});
|
|
509
|
+
// 启动三个并发请求
|
|
510
|
+
const promise1 = cacheApi.call('req1', 1);
|
|
511
|
+
const promise2 = cacheApi.call('req2', 2);
|
|
512
|
+
const promise3 = cacheApi.call('req3', 3);
|
|
513
|
+
expect(cacheApi.loading).toBe(true);
|
|
514
|
+
// 开始重置
|
|
515
|
+
const resetPromise = cacheApi.reset();
|
|
516
|
+
// 等待一下
|
|
517
|
+
await new Promise(resolve => setTimeout(resolve, 10));
|
|
518
|
+
// 依次完成所有请求
|
|
519
|
+
resolvers[0]('result1');
|
|
520
|
+
await promise1;
|
|
521
|
+
resolvers[1]('result2');
|
|
522
|
+
await promise2;
|
|
523
|
+
resolvers[2]('result3');
|
|
524
|
+
await promise3;
|
|
525
|
+
// 等待重置完成
|
|
526
|
+
await resetPromise;
|
|
527
|
+
// 验证重置后的状态
|
|
528
|
+
expect(cacheApi.value).toBeUndefined();
|
|
529
|
+
expect(cacheApi.empty).toBe(true);
|
|
530
|
+
expect(cacheApi.loading).toBe(false);
|
|
531
|
+
});
|
|
532
|
+
it('应该在请求失败后也能正常重置', async () => {
|
|
533
|
+
const error = new Error('API Error');
|
|
534
|
+
mockApiFunc.mockRejectedValue(error);
|
|
535
|
+
// 调用失败的请求
|
|
536
|
+
try {
|
|
537
|
+
await cacheApi.call('test', 1);
|
|
538
|
+
}
|
|
539
|
+
catch (e) {
|
|
540
|
+
// 忽略错误
|
|
541
|
+
}
|
|
542
|
+
// 重置应该成功
|
|
543
|
+
await expect(cacheApi.reset()).resolves.toBeUndefined();
|
|
544
|
+
// 验证状态
|
|
545
|
+
expect(cacheApi.value).toBeUndefined();
|
|
546
|
+
expect(cacheApi.empty).toBe(true);
|
|
547
|
+
expect(cacheApi.loading).toBe(false);
|
|
548
|
+
});
|
|
549
|
+
it('重置后应该能够正常调用新的请求', async () => {
|
|
550
|
+
mockApiFunc.mockResolvedValueOnce('first-result');
|
|
551
|
+
mockApiFunc.mockResolvedValueOnce('second-result');
|
|
552
|
+
// 第一次调用
|
|
553
|
+
await cacheApi.call('param1', 123);
|
|
554
|
+
expect(cacheApi.value).toBe('first-result');
|
|
555
|
+
// 重置
|
|
556
|
+
await cacheApi.reset();
|
|
557
|
+
expect(cacheApi.value).toBeUndefined();
|
|
558
|
+
// 重置后再次调用
|
|
559
|
+
await cacheApi.call('param2', 456);
|
|
560
|
+
expect(cacheApi.value).toBe('second-result');
|
|
561
|
+
expect(cacheApi.empty).toBe(false);
|
|
562
|
+
});
|
|
563
|
+
it('重置后 refresh 应该需要先调用 call', async () => {
|
|
564
|
+
mockApiFunc.mockResolvedValue('test-result');
|
|
565
|
+
// 先调用并刷新
|
|
566
|
+
await cacheApi.call('test', 1);
|
|
567
|
+
await cacheApi.refresh();
|
|
568
|
+
// 重置
|
|
569
|
+
await cacheApi.reset();
|
|
570
|
+
// 重置后 refresh 应该抛出错误
|
|
571
|
+
await expect(cacheApi.refresh()).rejects.toThrow('没有可用的参数来刷新数据,请先调用 call 方法');
|
|
572
|
+
});
|
|
573
|
+
it('应该正确处理重置期间的 loading 状态', async () => {
|
|
574
|
+
let resolveFn;
|
|
575
|
+
const promise = new Promise((resolve) => {
|
|
576
|
+
resolveFn = resolve;
|
|
577
|
+
});
|
|
578
|
+
mockApiFunc.mockReturnValue(promise);
|
|
579
|
+
// 启动请求
|
|
580
|
+
const callPromise = cacheApi.call('test', 1);
|
|
581
|
+
expect(cacheApi.loading).toBe(true);
|
|
582
|
+
// 启动重置(会等待请求完成)
|
|
583
|
+
const resetPromise = cacheApi.reset();
|
|
584
|
+
// loading 应该还是 true
|
|
585
|
+
expect(cacheApi.loading).toBe(true);
|
|
586
|
+
// 完成请求
|
|
587
|
+
resolveFn('result');
|
|
588
|
+
await callPromise;
|
|
589
|
+
// loading 变为 false
|
|
590
|
+
expect(cacheApi.loading).toBe(false);
|
|
591
|
+
// 等待重置完成
|
|
592
|
+
await resetPromise;
|
|
593
|
+
// 重置后 loading 应该仍然是 false
|
|
594
|
+
expect(cacheApi.loading).toBe(false);
|
|
595
|
+
});
|
|
596
|
+
it('应该清除所有缓存的 key', async () => {
|
|
597
|
+
mockApiFunc.mockResolvedValue('result');
|
|
598
|
+
// 调用多次产生多个缓存
|
|
599
|
+
await cacheApi.call('param1', 1);
|
|
600
|
+
await cacheApi.call('param2', 2);
|
|
601
|
+
await cacheApi.call('param3', 3);
|
|
602
|
+
expect(cacheApi.empty).toBe(false);
|
|
603
|
+
// 重置
|
|
604
|
+
await cacheApi.reset();
|
|
605
|
+
// 验证所有缓存都被清除
|
|
606
|
+
expect(cacheApi.empty).toBe(true);
|
|
607
|
+
expect(cacheApi.value).toBeUndefined();
|
|
608
|
+
});
|
|
609
|
+
});
|
|
449
610
|
});
|
package/package.json
CHANGED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
-
var t = {};
|
|
3
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
-
t[p] = s[p];
|
|
5
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
-
t[p[i]] = s[p[i]];
|
|
9
|
-
}
|
|
10
|
-
return t;
|
|
11
|
-
};
|
|
12
|
-
import * as Headless from '@headlessui/react';
|
|
13
|
-
import clsx from 'clsx';
|
|
14
|
-
import { Text } from './text';
|
|
15
|
-
const sizes = {
|
|
16
|
-
xs: 'sm:max-w-xs',
|
|
17
|
-
sm: 'sm:max-w-sm',
|
|
18
|
-
md: 'sm:max-w-md',
|
|
19
|
-
lg: 'sm:max-w-lg',
|
|
20
|
-
xl: 'sm:max-w-xl',
|
|
21
|
-
'2xl': 'sm:max-w-2xl',
|
|
22
|
-
'3xl': 'sm:max-w-3xl',
|
|
23
|
-
'4xl': 'sm:max-w-4xl',
|
|
24
|
-
'5xl': 'sm:max-w-5xl',
|
|
25
|
-
};
|
|
26
|
-
export function Alert(_a) {
|
|
27
|
-
var { size = 'md', className, children } = _a, props = __rest(_a, ["size", "className", "children"]);
|
|
28
|
-
return (<Headless.Dialog {...props}>
|
|
29
|
-
<Headless.DialogBackdrop transition className="fixed inset-0 flex w-screen justify-center overflow-y-auto bg-zinc-950/15 px-2 py-2 transition duration-100 focus:outline-0 data-closed:opacity-0 data-enter:ease-out data-leave:ease-in sm:px-6 sm:py-8 lg:px-8 lg:py-16 dark:bg-zinc-950/50"/>
|
|
30
|
-
|
|
31
|
-
<div className="fixed inset-0 w-screen overflow-y-auto pt-6 sm:pt-0">
|
|
32
|
-
<div className="grid min-h-full grid-rows-[1fr_auto_1fr] justify-items-center p-8 sm:grid-rows-[1fr_auto_3fr] sm:p-4">
|
|
33
|
-
<Headless.DialogPanel transition className={clsx(className, sizes[size], 'row-start-2 w-full rounded-2xl bg-white p-8 shadow-lg ring-1 ring-zinc-950/10 sm:rounded-2xl sm:p-6 dark:bg-zinc-900 dark:ring-white/10 forced-colors:outline', 'transition duration-100 will-change-transform data-closed:opacity-0 data-enter:ease-out data-closed:data-enter:scale-95 data-leave:ease-in')}>
|
|
34
|
-
{children}
|
|
35
|
-
</Headless.DialogPanel>
|
|
36
|
-
</div>
|
|
37
|
-
</div>
|
|
38
|
-
</Headless.Dialog>);
|
|
39
|
-
}
|
|
40
|
-
export function AlertTitle(_a) {
|
|
41
|
-
var { className } = _a, props = __rest(_a, ["className"]);
|
|
42
|
-
return (<Headless.DialogTitle {...props} className={clsx(className, 'text-center text-base/6 font-semibold text-balance text-zinc-950 sm:text-left sm:text-sm/6 sm:text-wrap dark:text-white')}/>);
|
|
43
|
-
}
|
|
44
|
-
export function AlertDescription(_a) {
|
|
45
|
-
var { className } = _a, props = __rest(_a, ["className"]);
|
|
46
|
-
return (<Headless.Description as={Text} {...props} className={clsx(className, 'mt-2 text-center text-pretty sm:text-left')}/>);
|
|
47
|
-
}
|
|
48
|
-
export function AlertBody(_a) {
|
|
49
|
-
var { className } = _a, props = __rest(_a, ["className"]);
|
|
50
|
-
return <div {...props} className={clsx(className, 'mt-4')}/>;
|
|
51
|
-
}
|
|
52
|
-
export function AlertActions(_a) {
|
|
53
|
-
var { className } = _a, props = __rest(_a, ["className"]);
|
|
54
|
-
return (<div {...props} className={clsx(className, 'mt-6 flex flex-col-reverse items-center justify-end gap-3 *:w-full sm:mt-4 sm:flex-row sm:*:w-auto')}/>);
|
|
55
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export function AuthLayout({ children }) {
|
|
2
|
-
return (<main className="flex min-h-dvh flex-col p-2">
|
|
3
|
-
<div className="flex grow items-center justify-center p-6 lg:rounded-lg lg:bg-white lg:p-10 lg:shadow-xs lg:ring-1 lg:ring-zinc-950/5 dark:lg:bg-zinc-900 dark:lg:ring-white/10">
|
|
4
|
-
{children}
|
|
5
|
-
</div>
|
|
6
|
-
</main>);
|
|
7
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
-
var t = {};
|
|
3
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
-
t[p] = s[p];
|
|
5
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
-
t[p[i]] = s[p[i]];
|
|
9
|
-
}
|
|
10
|
-
return t;
|
|
11
|
-
};
|
|
12
|
-
import * as Headless from '@headlessui/react';
|
|
13
|
-
import clsx from 'clsx';
|
|
14
|
-
import React, { forwardRef } from 'react';
|
|
15
|
-
import { TouchTarget } from './button';
|
|
16
|
-
import { Link } from './link';
|
|
17
|
-
export function Avatar(_a) {
|
|
18
|
-
var { src = null, square = false, initials, alt = '', className } = _a, props = __rest(_a, ["src", "square", "initials", "alt", "className"]);
|
|
19
|
-
return (<span data-slot="avatar" {...props} className={clsx(className,
|
|
20
|
-
// Basic layout
|
|
21
|
-
'inline-grid shrink-0 align-middle [--avatar-radius:20%] *:col-start-1 *:row-start-1', 'outline -outline-offset-1 outline-black/10 dark:outline-white/10',
|
|
22
|
-
// Border radius
|
|
23
|
-
square ? 'rounded-(--avatar-radius) *:rounded-(--avatar-radius)' : 'rounded-full *:rounded-full')}>
|
|
24
|
-
{initials && (<svg className="size-full fill-current p-[5%] text-[48px] font-medium uppercase select-none" viewBox="0 0 100 100" aria-hidden={alt ? undefined : 'true'}>
|
|
25
|
-
{alt && <title>{alt}</title>}
|
|
26
|
-
<text x="50%" y="50%" alignmentBaseline="middle" dominantBaseline="middle" textAnchor="middle" dy=".125em">
|
|
27
|
-
{initials}
|
|
28
|
-
</text>
|
|
29
|
-
</svg>)}
|
|
30
|
-
{src && <img className="size-full" src={src} alt={alt}/>}
|
|
31
|
-
</span>);
|
|
32
|
-
}
|
|
33
|
-
export const AvatarButton = forwardRef(function AvatarButton(_a, ref) {
|
|
34
|
-
var { src, square = false, initials, alt, className } = _a, props = __rest(_a, ["src", "square", "initials", "alt", "className"]);
|
|
35
|
-
let classes = clsx(className, square ? 'rounded-[20%]' : 'rounded-full', 'relative inline-grid focus:not-data-focus:outline-hidden data-focus:outline-2 data-focus:outline-offset-2 data-focus:outline-blue-500');
|
|
36
|
-
return 'href' in props ? (<Link {...props} className={classes} ref={ref}>
|
|
37
|
-
<TouchTarget>
|
|
38
|
-
<Avatar src={src} square={square} initials={initials} alt={alt}/>
|
|
39
|
-
</TouchTarget>
|
|
40
|
-
</Link>) : (<Headless.Button {...props} className={classes} ref={ref}>
|
|
41
|
-
<TouchTarget>
|
|
42
|
-
<Avatar src={src} square={square} initials={initials} alt={alt}/>
|
|
43
|
-
</TouchTarget>
|
|
44
|
-
</Headless.Button>);
|
|
45
|
-
});
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
-
var t = {};
|
|
3
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
-
t[p] = s[p];
|
|
5
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
-
t[p[i]] = s[p[i]];
|
|
9
|
-
}
|
|
10
|
-
return t;
|
|
11
|
-
};
|
|
12
|
-
import * as Headless from '@headlessui/react';
|
|
13
|
-
import clsx from 'clsx';
|
|
14
|
-
import React, { forwardRef } from 'react';
|
|
15
|
-
import { TouchTarget } from './button';
|
|
16
|
-
import { Link } from './link';
|
|
17
|
-
const colors = {
|
|
18
|
-
red: 'bg-red-500/15 text-red-700 group-data-hover:bg-red-500/25 dark:bg-red-500/10 dark:text-red-400 dark:group-data-hover:bg-red-500/20',
|
|
19
|
-
orange: 'bg-orange-500/15 text-orange-700 group-data-hover:bg-orange-500/25 dark:bg-orange-500/10 dark:text-orange-400 dark:group-data-hover:bg-orange-500/20',
|
|
20
|
-
amber: 'bg-amber-400/20 text-amber-700 group-data-hover:bg-amber-400/30 dark:bg-amber-400/10 dark:text-amber-400 dark:group-data-hover:bg-amber-400/15',
|
|
21
|
-
yellow: 'bg-yellow-400/20 text-yellow-700 group-data-hover:bg-yellow-400/30 dark:bg-yellow-400/10 dark:text-yellow-300 dark:group-data-hover:bg-yellow-400/15',
|
|
22
|
-
lime: 'bg-lime-400/20 text-lime-700 group-data-hover:bg-lime-400/30 dark:bg-lime-400/10 dark:text-lime-300 dark:group-data-hover:bg-lime-400/15',
|
|
23
|
-
green: 'bg-green-500/15 text-green-700 group-data-hover:bg-green-500/25 dark:bg-green-500/10 dark:text-green-400 dark:group-data-hover:bg-green-500/20',
|
|
24
|
-
emerald: 'bg-emerald-500/15 text-emerald-700 group-data-hover:bg-emerald-500/25 dark:bg-emerald-500/10 dark:text-emerald-400 dark:group-data-hover:bg-emerald-500/20',
|
|
25
|
-
teal: 'bg-teal-500/15 text-teal-700 group-data-hover:bg-teal-500/25 dark:bg-teal-500/10 dark:text-teal-300 dark:group-data-hover:bg-teal-500/20',
|
|
26
|
-
cyan: 'bg-cyan-400/20 text-cyan-700 group-data-hover:bg-cyan-400/30 dark:bg-cyan-400/10 dark:text-cyan-300 dark:group-data-hover:bg-cyan-400/15',
|
|
27
|
-
sky: 'bg-sky-500/15 text-sky-700 group-data-hover:bg-sky-500/25 dark:bg-sky-500/10 dark:text-sky-300 dark:group-data-hover:bg-sky-500/20',
|
|
28
|
-
blue: 'bg-blue-500/15 text-blue-700 group-data-hover:bg-blue-500/25 dark:text-blue-400 dark:group-data-hover:bg-blue-500/25',
|
|
29
|
-
indigo: 'bg-indigo-500/15 text-indigo-700 group-data-hover:bg-indigo-500/25 dark:text-indigo-400 dark:group-data-hover:bg-indigo-500/20',
|
|
30
|
-
violet: 'bg-violet-500/15 text-violet-700 group-data-hover:bg-violet-500/25 dark:text-violet-400 dark:group-data-hover:bg-violet-500/20',
|
|
31
|
-
purple: 'bg-purple-500/15 text-purple-700 group-data-hover:bg-purple-500/25 dark:text-purple-400 dark:group-data-hover:bg-purple-500/20',
|
|
32
|
-
fuchsia: 'bg-fuchsia-400/15 text-fuchsia-700 group-data-hover:bg-fuchsia-400/25 dark:bg-fuchsia-400/10 dark:text-fuchsia-400 dark:group-data-hover:bg-fuchsia-400/20',
|
|
33
|
-
pink: 'bg-pink-400/15 text-pink-700 group-data-hover:bg-pink-400/25 dark:bg-pink-400/10 dark:text-pink-400 dark:group-data-hover:bg-pink-400/20',
|
|
34
|
-
rose: 'bg-rose-400/15 text-rose-700 group-data-hover:bg-rose-400/25 dark:bg-rose-400/10 dark:text-rose-400 dark:group-data-hover:bg-rose-400/20',
|
|
35
|
-
zinc: 'bg-zinc-600/10 text-zinc-700 group-data-hover:bg-zinc-600/20 dark:bg-white/5 dark:text-zinc-400 dark:group-data-hover:bg-white/10',
|
|
36
|
-
};
|
|
37
|
-
export function Badge(_a) {
|
|
38
|
-
var { color = 'zinc', className } = _a, props = __rest(_a, ["color", "className"]);
|
|
39
|
-
return (<span {...props} className={clsx(className, 'inline-flex items-center gap-x-1.5 rounded-md px-1.5 py-0.5 text-sm/5 font-medium sm:text-xs/5 forced-colors:outline', colors[color])}/>);
|
|
40
|
-
}
|
|
41
|
-
export const BadgeButton = forwardRef(function BadgeButton(_a, ref) {
|
|
42
|
-
var { color = 'zinc', className, children } = _a, props = __rest(_a, ["color", "className", "children"]);
|
|
43
|
-
let classes = clsx(className, 'group relative inline-flex rounded-md focus:not-data-focus:outline-hidden data-focus:outline-2 data-focus:outline-offset-2 data-focus:outline-blue-500');
|
|
44
|
-
return 'href' in props ? (<Link {...props} className={classes} ref={ref}>
|
|
45
|
-
<TouchTarget>
|
|
46
|
-
<Badge color={color}>{children}</Badge>
|
|
47
|
-
</TouchTarget>
|
|
48
|
-
</Link>) : (<Headless.Button {...props} className={classes} ref={ref}>
|
|
49
|
-
<TouchTarget>
|
|
50
|
-
<Badge color={color}>{children}</Badge>
|
|
51
|
-
</TouchTarget>
|
|
52
|
-
</Headless.Button>);
|
|
53
|
-
});
|
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
-
var t = {};
|
|
3
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
-
t[p] = s[p];
|
|
5
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
-
t[p[i]] = s[p[i]];
|
|
9
|
-
}
|
|
10
|
-
return t;
|
|
11
|
-
};
|
|
12
|
-
import * as Headless from '@headlessui/react';
|
|
13
|
-
import clsx from 'clsx';
|
|
14
|
-
import React, { forwardRef } from 'react';
|
|
15
|
-
import { Link } from './link';
|
|
16
|
-
const styles = {
|
|
17
|
-
base: [
|
|
18
|
-
// Base
|
|
19
|
-
'relative isolate inline-flex items-baseline justify-center gap-x-2 rounded-lg border text-base/6 font-semibold',
|
|
20
|
-
// Sizing
|
|
21
|
-
'px-[calc(--spacing(3.5)-1px)] py-[calc(--spacing(2.5)-1px)] sm:px-[calc(--spacing(3)-1px)] sm:py-[calc(--spacing(1.5)-1px)] sm:text-sm/6',
|
|
22
|
-
// Focus
|
|
23
|
-
'focus:not-data-focus:outline-hidden data-focus:outline-2 data-focus:outline-offset-2 data-focus:outline-blue-500',
|
|
24
|
-
// Disabled
|
|
25
|
-
'data-disabled:opacity-50',
|
|
26
|
-
// Icon
|
|
27
|
-
'*:data-[slot=icon]:-mx-0.5 *:data-[slot=icon]:my-0.5 *:data-[slot=icon]:size-5 *:data-[slot=icon]:shrink-0 *:data-[slot=icon]:self-center *:data-[slot=icon]:text-(--btn-icon) sm:*:data-[slot=icon]:my-1 sm:*:data-[slot=icon]:size-4 forced-colors:[--btn-icon:ButtonText] forced-colors:data-hover:[--btn-icon:ButtonText]',
|
|
28
|
-
],
|
|
29
|
-
solid: [
|
|
30
|
-
// Optical border, implemented as the button background to avoid corner artifacts
|
|
31
|
-
'border-transparent bg-(--btn-border)',
|
|
32
|
-
// Dark mode: border is rendered on `after` so background is set to button background
|
|
33
|
-
'dark:bg-(--btn-bg)',
|
|
34
|
-
// Button background, implemented as foreground layer to stack on top of pseudo-border layer
|
|
35
|
-
'before:absolute before:inset-0 before:-z-10 before:rounded-[calc(var(--radius-lg)-1px)] before:bg-(--btn-bg)',
|
|
36
|
-
// Drop shadow, applied to the inset `before` layer so it blends with the border
|
|
37
|
-
'before:shadow-sm',
|
|
38
|
-
// Background color is moved to control and shadow is removed in dark mode so hide `before` pseudo
|
|
39
|
-
'dark:before:hidden',
|
|
40
|
-
// Dark mode: Subtle white outline is applied using a border
|
|
41
|
-
'dark:border-white/5',
|
|
42
|
-
// Shim/overlay, inset to match button foreground and used for hover state + highlight shadow
|
|
43
|
-
'after:absolute after:inset-0 after:-z-10 after:rounded-[calc(var(--radius-lg)-1px)]',
|
|
44
|
-
// Inner highlight shadow
|
|
45
|
-
'after:shadow-[inset_0_1px_--theme(--color-white/15%)]',
|
|
46
|
-
// White overlay on hover
|
|
47
|
-
'data-active:after:bg-(--btn-hover-overlay) data-hover:after:bg-(--btn-hover-overlay)',
|
|
48
|
-
// Dark mode: `after` layer expands to cover entire button
|
|
49
|
-
'dark:after:-inset-px dark:after:rounded-lg',
|
|
50
|
-
// Disabled
|
|
51
|
-
'data-disabled:before:shadow-none data-disabled:after:shadow-none',
|
|
52
|
-
],
|
|
53
|
-
outline: [
|
|
54
|
-
// Base
|
|
55
|
-
'border-zinc-950/10 text-zinc-950 data-active:bg-zinc-950/2.5 data-hover:bg-zinc-950/2.5',
|
|
56
|
-
// Dark mode
|
|
57
|
-
'dark:border-white/15 dark:text-white dark:[--btn-bg:transparent] dark:data-active:bg-white/5 dark:data-hover:bg-white/5',
|
|
58
|
-
// Icon
|
|
59
|
-
'[--btn-icon:var(--color-zinc-500)] data-active:[--btn-icon:var(--color-zinc-700)] data-hover:[--btn-icon:var(--color-zinc-700)] dark:data-active:[--btn-icon:var(--color-zinc-400)] dark:data-hover:[--btn-icon:var(--color-zinc-400)]',
|
|
60
|
-
],
|
|
61
|
-
plain: [
|
|
62
|
-
// Base
|
|
63
|
-
'border-transparent text-zinc-950 data-active:bg-zinc-950/5 data-hover:bg-zinc-950/5',
|
|
64
|
-
// Dark mode
|
|
65
|
-
'dark:text-white dark:data-active:bg-white/10 dark:data-hover:bg-white/10',
|
|
66
|
-
// Icon
|
|
67
|
-
'[--btn-icon:var(--color-zinc-500)] data-active:[--btn-icon:var(--color-zinc-700)] data-hover:[--btn-icon:var(--color-zinc-700)] dark:[--btn-icon:var(--color-zinc-500)] dark:data-active:[--btn-icon:var(--color-zinc-400)] dark:data-hover:[--btn-icon:var(--color-zinc-400)]',
|
|
68
|
-
],
|
|
69
|
-
colors: {
|
|
70
|
-
'dark/zinc': [
|
|
71
|
-
'text-white [--btn-bg:var(--color-zinc-900)] [--btn-border:var(--color-zinc-950)]/90 [--btn-hover-overlay:var(--color-white)]/10',
|
|
72
|
-
'dark:text-white dark:[--btn-bg:var(--color-zinc-600)] dark:[--btn-hover-overlay:var(--color-white)]/5',
|
|
73
|
-
'[--btn-icon:var(--color-zinc-400)] data-active:[--btn-icon:var(--color-zinc-300)] data-hover:[--btn-icon:var(--color-zinc-300)]',
|
|
74
|
-
],
|
|
75
|
-
light: [
|
|
76
|
-
'text-zinc-950 [--btn-bg:white] [--btn-border:var(--color-zinc-950)]/10 [--btn-hover-overlay:var(--color-zinc-950)]/2.5 data-active:[--btn-border:var(--color-zinc-950)]/15 data-hover:[--btn-border:var(--color-zinc-950)]/15',
|
|
77
|
-
'dark:text-white dark:[--btn-hover-overlay:var(--color-white)]/5 dark:[--btn-bg:var(--color-zinc-800)]',
|
|
78
|
-
'[--btn-icon:var(--color-zinc-500)] data-active:[--btn-icon:var(--color-zinc-700)] data-hover:[--btn-icon:var(--color-zinc-700)] dark:[--btn-icon:var(--color-zinc-500)] dark:data-active:[--btn-icon:var(--color-zinc-400)] dark:data-hover:[--btn-icon:var(--color-zinc-400)]',
|
|
79
|
-
],
|
|
80
|
-
'dark/white': [
|
|
81
|
-
'text-white [--btn-bg:var(--color-zinc-900)] [--btn-border:var(--color-zinc-950)]/90 [--btn-hover-overlay:var(--color-white)]/10',
|
|
82
|
-
'dark:text-zinc-950 dark:[--btn-bg:white] dark:[--btn-hover-overlay:var(--color-zinc-950)]/5',
|
|
83
|
-
'[--btn-icon:var(--color-zinc-400)] data-active:[--btn-icon:var(--color-zinc-300)] data-hover:[--btn-icon:var(--color-zinc-300)] dark:[--btn-icon:var(--color-zinc-500)] dark:data-active:[--btn-icon:var(--color-zinc-400)] dark:data-hover:[--btn-icon:var(--color-zinc-400)]',
|
|
84
|
-
],
|
|
85
|
-
dark: [
|
|
86
|
-
'text-white [--btn-bg:var(--color-zinc-900)] [--btn-border:var(--color-zinc-950)]/90 [--btn-hover-overlay:var(--color-white)]/10',
|
|
87
|
-
'dark:[--btn-hover-overlay:var(--color-white)]/5 dark:[--btn-bg:var(--color-zinc-800)]',
|
|
88
|
-
'[--btn-icon:var(--color-zinc-400)] data-active:[--btn-icon:var(--color-zinc-300)] data-hover:[--btn-icon:var(--color-zinc-300)]',
|
|
89
|
-
],
|
|
90
|
-
white: [
|
|
91
|
-
'text-zinc-950 [--btn-bg:white] [--btn-border:var(--color-zinc-950)]/10 [--btn-hover-overlay:var(--color-zinc-950)]/2.5 data-active:[--btn-border:var(--color-zinc-950)]/15 data-hover:[--btn-border:var(--color-zinc-950)]/15',
|
|
92
|
-
'dark:[--btn-hover-overlay:var(--color-zinc-950)]/5',
|
|
93
|
-
'[--btn-icon:var(--color-zinc-400)] data-active:[--btn-icon:var(--color-zinc-500)] data-hover:[--btn-icon:var(--color-zinc-500)]',
|
|
94
|
-
],
|
|
95
|
-
zinc: [
|
|
96
|
-
'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-zinc-600)] [--btn-border:var(--color-zinc-700)]/90',
|
|
97
|
-
'dark:[--btn-hover-overlay:var(--color-white)]/5',
|
|
98
|
-
'[--btn-icon:var(--color-zinc-400)] data-active:[--btn-icon:var(--color-zinc-300)] data-hover:[--btn-icon:var(--color-zinc-300)]',
|
|
99
|
-
],
|
|
100
|
-
indigo: [
|
|
101
|
-
'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-indigo-500)] [--btn-border:var(--color-indigo-600)]/90',
|
|
102
|
-
'[--btn-icon:var(--color-indigo-300)] data-active:[--btn-icon:var(--color-indigo-200)] data-hover:[--btn-icon:var(--color-indigo-200)]',
|
|
103
|
-
],
|
|
104
|
-
cyan: [
|
|
105
|
-
'text-cyan-950 [--btn-bg:var(--color-cyan-300)] [--btn-border:var(--color-cyan-400)]/80 [--btn-hover-overlay:var(--color-white)]/25',
|
|
106
|
-
'[--btn-icon:var(--color-cyan-500)]',
|
|
107
|
-
],
|
|
108
|
-
red: [
|
|
109
|
-
'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-red-600)] [--btn-border:var(--color-red-700)]/90',
|
|
110
|
-
'[--btn-icon:var(--color-red-300)] data-active:[--btn-icon:var(--color-red-200)] data-hover:[--btn-icon:var(--color-red-200)]',
|
|
111
|
-
],
|
|
112
|
-
orange: [
|
|
113
|
-
'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-orange-500)] [--btn-border:var(--color-orange-600)]/90',
|
|
114
|
-
'[--btn-icon:var(--color-orange-300)] data-active:[--btn-icon:var(--color-orange-200)] data-hover:[--btn-icon:var(--color-orange-200)]',
|
|
115
|
-
],
|
|
116
|
-
amber: [
|
|
117
|
-
'text-amber-950 [--btn-hover-overlay:var(--color-white)]/25 [--btn-bg:var(--color-amber-400)] [--btn-border:var(--color-amber-500)]/80',
|
|
118
|
-
'[--btn-icon:var(--color-amber-600)]',
|
|
119
|
-
],
|
|
120
|
-
yellow: [
|
|
121
|
-
'text-yellow-950 [--btn-hover-overlay:var(--color-white)]/25 [--btn-bg:var(--color-yellow-300)] [--btn-border:var(--color-yellow-400)]/80',
|
|
122
|
-
'[--btn-icon:var(--color-yellow-600)] data-active:[--btn-icon:var(--color-yellow-700)] data-hover:[--btn-icon:var(--color-yellow-700)]',
|
|
123
|
-
],
|
|
124
|
-
lime: [
|
|
125
|
-
'text-lime-950 [--btn-hover-overlay:var(--color-white)]/25 [--btn-bg:var(--color-lime-300)] [--btn-border:var(--color-lime-400)]/80',
|
|
126
|
-
'[--btn-icon:var(--color-lime-600)] data-active:[--btn-icon:var(--color-lime-700)] data-hover:[--btn-icon:var(--color-lime-700)]',
|
|
127
|
-
],
|
|
128
|
-
green: [
|
|
129
|
-
'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-green-600)] [--btn-border:var(--color-green-700)]/90',
|
|
130
|
-
'[--btn-icon:var(--color-white)]/60 data-active:[--btn-icon:var(--color-white)]/80 data-hover:[--btn-icon:var(--color-white)]/80',
|
|
131
|
-
],
|
|
132
|
-
emerald: [
|
|
133
|
-
'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-emerald-600)] [--btn-border:var(--color-emerald-700)]/90',
|
|
134
|
-
'[--btn-icon:var(--color-white)]/60 data-active:[--btn-icon:var(--color-white)]/80 data-hover:[--btn-icon:var(--color-white)]/80',
|
|
135
|
-
],
|
|
136
|
-
teal: [
|
|
137
|
-
'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-teal-600)] [--btn-border:var(--color-teal-700)]/90',
|
|
138
|
-
'[--btn-icon:var(--color-white)]/60 data-active:[--btn-icon:var(--color-white)]/80 data-hover:[--btn-icon:var(--color-white)]/80',
|
|
139
|
-
],
|
|
140
|
-
sky: [
|
|
141
|
-
'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-sky-500)] [--btn-border:var(--color-sky-600)]/80',
|
|
142
|
-
'[--btn-icon:var(--color-white)]/60 data-active:[--btn-icon:var(--color-white)]/80 data-hover:[--btn-icon:var(--color-white)]/80',
|
|
143
|
-
],
|
|
144
|
-
blue: [
|
|
145
|
-
'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-blue-600)] [--btn-border:var(--color-blue-700)]/90',
|
|
146
|
-
'[--btn-icon:var(--color-blue-400)] data-active:[--btn-icon:var(--color-blue-300)] data-hover:[--btn-icon:var(--color-blue-300)]',
|
|
147
|
-
],
|
|
148
|
-
violet: [
|
|
149
|
-
'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-violet-500)] [--btn-border:var(--color-violet-600)]/90',
|
|
150
|
-
'[--btn-icon:var(--color-violet-300)] data-active:[--btn-icon:var(--color-violet-200)] data-hover:[--btn-icon:var(--color-violet-200)]',
|
|
151
|
-
],
|
|
152
|
-
purple: [
|
|
153
|
-
'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-purple-500)] [--btn-border:var(--color-purple-600)]/90',
|
|
154
|
-
'[--btn-icon:var(--color-purple-300)] data-active:[--btn-icon:var(--color-purple-200)] data-hover:[--btn-icon:var(--color-purple-200)]',
|
|
155
|
-
],
|
|
156
|
-
fuchsia: [
|
|
157
|
-
'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-fuchsia-500)] [--btn-border:var(--color-fuchsia-600)]/90',
|
|
158
|
-
'[--btn-icon:var(--color-fuchsia-300)] data-active:[--btn-icon:var(--color-fuchsia-200)] data-hover:[--btn-icon:var(--color-fuchsia-200)]',
|
|
159
|
-
],
|
|
160
|
-
pink: [
|
|
161
|
-
'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-pink-500)] [--btn-border:var(--color-pink-600)]/90',
|
|
162
|
-
'[--btn-icon:var(--color-pink-300)] data-active:[--btn-icon:var(--color-pink-200)] data-hover:[--btn-icon:var(--color-pink-200)]',
|
|
163
|
-
],
|
|
164
|
-
rose: [
|
|
165
|
-
'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-rose-500)] [--btn-border:var(--color-rose-600)]/90',
|
|
166
|
-
'[--btn-icon:var(--color-rose-300)] data-active:[--btn-icon:var(--color-rose-200)] data-hover:[--btn-icon:var(--color-rose-200)]',
|
|
167
|
-
],
|
|
168
|
-
},
|
|
169
|
-
};
|
|
170
|
-
export const Button = forwardRef(function Button(_a, ref) {
|
|
171
|
-
var { color, outline, plain, className, children } = _a, props = __rest(_a, ["color", "outline", "plain", "className", "children"]);
|
|
172
|
-
let classes = clsx(className, styles.base, outline ? styles.outline : plain ? styles.plain : clsx(styles.solid, styles.colors[color !== null && color !== void 0 ? color : 'dark/zinc']));
|
|
173
|
-
return 'href' in props ? (<Link {...props} className={classes} ref={ref}>
|
|
174
|
-
<TouchTarget>{children}</TouchTarget>
|
|
175
|
-
</Link>) : (<Headless.Button {...props} className={clsx(classes, 'cursor-default')} ref={ref}>
|
|
176
|
-
<TouchTarget>{children}</TouchTarget>
|
|
177
|
-
</Headless.Button>);
|
|
178
|
-
});
|
|
179
|
-
/**
|
|
180
|
-
* Expand the hit area to at least 44×44px on touch devices
|
|
181
|
-
*/
|
|
182
|
-
export function TouchTarget({ children }) {
|
|
183
|
-
return (<>
|
|
184
|
-
<span className="absolute top-1/2 left-1/2 size-[max(100%,2.75rem)] -translate-x-1/2 -translate-y-1/2 pointer-fine:hidden" aria-hidden="true"/>
|
|
185
|
-
{children}
|
|
186
|
-
</>);
|
|
187
|
-
}
|