@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.
Files changed (67) hide show
  1. package/output/cache-api/cache-api.d.ts +5 -1
  2. package/output/cache-api/cache-api.d.ts.map +1 -1
  3. package/output/cache-api/cache-api.js +13 -2
  4. package/output/cache-api/cache-api.test.js +161 -0
  5. package/package.json +1 -1
  6. package/output/catalyst/alert.jsx +0 -55
  7. package/output/catalyst/auth-layout.jsx +0 -7
  8. package/output/catalyst/avatar.jsx +0 -45
  9. package/output/catalyst/badge.jsx +0 -53
  10. package/output/catalyst/button.jsx +0 -187
  11. package/output/catalyst/checkbox.jsx +0 -105
  12. package/output/catalyst/combobox.jsx +0 -120
  13. package/output/catalyst/description-list.jsx +0 -24
  14. package/output/catalyst/dialog.jsx +0 -55
  15. package/output/catalyst/divider.jsx +0 -16
  16. package/output/catalyst/dropdown.jsx +0 -102
  17. package/output/catalyst/fieldset.jsx +0 -41
  18. package/output/catalyst/heading.jsx +0 -22
  19. package/output/catalyst/input.jsx +0 -73
  20. package/output/catalyst/link.jsx +0 -14
  21. package/output/catalyst/listbox.jsx +0 -120
  22. package/output/catalyst/navbar.jsx +0 -67
  23. package/output/catalyst/pagination.jsx +0 -52
  24. package/output/catalyst/radio.jsx +0 -103
  25. package/output/catalyst/select.jsx +0 -59
  26. package/output/catalyst/sidebar-layout.jsx +0 -58
  27. package/output/catalyst/sidebar.jsx +0 -85
  28. package/output/catalyst/stacked-layout.jsx +0 -55
  29. package/output/catalyst/switch.jsx +0 -161
  30. package/output/catalyst/table.jsx +0 -68
  31. package/output/catalyst/text.jsx +0 -29
  32. package/output/catalyst/textarea.jsx +0 -49
  33. package/output/helpers/cache-api/cache-api.d.ts +0 -13
  34. package/output/helpers/cache-api/cache-api.d.ts.map +0 -1
  35. package/output/helpers/cache-api/cache-api.js +0 -114
  36. package/output/helpers/cache-api/cache-api.test.d.ts +0 -2
  37. package/output/helpers/cache-api/cache-api.test.d.ts.map +0 -1
  38. package/output/helpers/cache-api/cache-api.test.js +0 -348
  39. package/output/helpers/cache-api/index.d.ts +0 -2
  40. package/output/helpers/cache-api/index.d.ts.map +0 -1
  41. package/output/helpers/cache-api/index.js +0 -1
  42. package/output/helpers/service/index.d.ts +0 -1
  43. package/output/helpers/service/index.d.ts.map +0 -1
  44. package/output/helpers/service/index.js +0 -1
  45. package/output/helpers/service/service.d.ts +0 -5
  46. package/output/helpers/service/service.d.ts.map +0 -1
  47. package/output/helpers/service/service.js +0 -2
  48. package/output/helpers/side-cache/index.d.ts +0 -2
  49. package/output/helpers/side-cache/index.d.ts.map +0 -1
  50. package/output/helpers/side-cache/index.js +0 -1
  51. package/output/helpers/side-cache/side-cache.d.ts +0 -10
  52. package/output/helpers/side-cache/side-cache.d.ts.map +0 -1
  53. package/output/helpers/side-cache/side-cache.js +0 -137
  54. package/output/helpers/side-cache/side-cache.test.d.ts +0 -2
  55. package/output/helpers/side-cache/side-cache.test.d.ts.map +0 -1
  56. package/output/helpers/side-cache/side-cache.test.js +0 -179
  57. package/output/helpers/use-observer/index.d.ts +0 -2
  58. package/output/helpers/use-observer/index.d.ts.map +0 -1
  59. package/output/helpers/use-observer/index.js +0 -1
  60. package/output/helpers/use-observer/use-observer.d.ts +0 -3
  61. package/output/helpers/use-observer/use-observer.d.ts.map +0 -1
  62. package/output/helpers/use-observer/use-observer.js +0 -16
  63. package/output/helpers/use-observer/use-observer.test.d.ts +0 -2
  64. package/output/helpers/use-observer/use-observer.test.d.ts.map +0 -1
  65. package/output/helpers/use-observer/use-observer.test.jsx +0 -134
  66. package/output/service/service.test.jsx +0 -367
  67. 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;IAU9B,OAAO,CAAC,IAAI;IATxB,OAAO,CAAC,KAAK,CAAqB;IAGlC,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;CAalD"}
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@taicode/common-web",
3
- "version": "1.1.15",
3
+ "version": "1.1.16",
4
4
  "author": "Alain",
5
5
  "license": "ISC",
6
6
  "description": "",
@@ -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
- }