@taicode/common-web 1.1.19 → 1.1.21
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/catalyst/alert.jsx +55 -0
- package/output/catalyst/auth-layout.jsx +7 -0
- package/output/catalyst/avatar.jsx +45 -0
- package/output/catalyst/badge.jsx +53 -0
- package/output/catalyst/button.d.ts +1 -1
- package/output/catalyst/button.d.ts.map +1 -1
- package/output/catalyst/button.jsx +187 -0
- package/output/catalyst/checkbox.jsx +105 -0
- package/output/catalyst/combobox.jsx +120 -0
- package/output/catalyst/description-list.jsx +24 -0
- package/output/catalyst/dialog.jsx +55 -0
- package/output/catalyst/divider.jsx +16 -0
- package/output/catalyst/dropdown.jsx +102 -0
- package/output/catalyst/fieldset.jsx +41 -0
- package/output/catalyst/heading.jsx +22 -0
- package/output/catalyst/input.jsx +73 -0
- package/output/catalyst/link.jsx +14 -0
- package/output/catalyst/listbox.jsx +120 -0
- package/output/catalyst/navbar.jsx +67 -0
- package/output/catalyst/pagination.jsx +52 -0
- package/output/catalyst/radio.jsx +103 -0
- package/output/catalyst/select.jsx +59 -0
- package/output/catalyst/sidebar-layout.jsx +58 -0
- package/output/catalyst/sidebar.jsx +85 -0
- package/output/catalyst/stacked-layout.jsx +55 -0
- package/output/catalyst/switch.jsx +161 -0
- package/output/catalyst/table.jsx +68 -0
- package/output/catalyst/text.jsx +29 -0
- package/output/catalyst/textarea.jsx +49 -0
- package/output/helpers/cache-api/cache-api.d.ts +13 -0
- package/output/helpers/cache-api/cache-api.d.ts.map +1 -0
- package/output/helpers/cache-api/cache-api.js +114 -0
- package/output/helpers/cache-api/cache-api.test.d.ts +2 -0
- package/output/helpers/cache-api/cache-api.test.d.ts.map +1 -0
- package/output/helpers/cache-api/cache-api.test.js +348 -0
- package/output/helpers/cache-api/index.d.ts +2 -0
- package/output/helpers/cache-api/index.d.ts.map +1 -0
- package/output/helpers/cache-api/index.js +1 -0
- package/output/helpers/service/index.d.ts +1 -0
- package/output/helpers/service/index.d.ts.map +1 -0
- package/output/helpers/service/index.js +1 -0
- package/output/helpers/service/service.d.ts +5 -0
- package/output/helpers/service/service.d.ts.map +1 -0
- package/output/helpers/service/service.js +2 -0
- package/output/helpers/side-cache/index.d.ts +2 -0
- package/output/helpers/side-cache/index.d.ts.map +1 -0
- package/output/helpers/side-cache/index.js +1 -0
- package/output/helpers/side-cache/side-cache.d.ts +10 -0
- package/output/helpers/side-cache/side-cache.d.ts.map +1 -0
- package/output/helpers/side-cache/side-cache.js +137 -0
- package/output/helpers/side-cache/side-cache.test.d.ts +2 -0
- package/output/helpers/side-cache/side-cache.test.d.ts.map +1 -0
- package/output/helpers/side-cache/side-cache.test.js +179 -0
- package/output/helpers/use-observer/index.d.ts +2 -0
- package/output/helpers/use-observer/index.d.ts.map +1 -0
- package/output/helpers/use-observer/index.js +1 -0
- package/output/helpers/use-observer/use-observer.d.ts +3 -0
- package/output/helpers/use-observer/use-observer.d.ts.map +1 -0
- package/output/helpers/use-observer/use-observer.js +16 -0
- package/output/helpers/use-observer/use-observer.test.d.ts +2 -0
- package/output/helpers/use-observer/use-observer.test.d.ts.map +1 -0
- package/output/helpers/use-observer/use-observer.test.jsx +134 -0
- package/output/loading-button/index.d.ts +26 -0
- package/output/loading-button/index.d.ts.map +1 -0
- package/output/loading-button/index.js +55 -0
- package/output/service/service.test.jsx +367 -0
- package/output/signin/index.d.ts +2 -2
- package/output/signin/index.d.ts.map +1 -1
- package/output/signin/index.js +1 -1
- package/output/signin/service.d.ts.map +1 -1
- package/output/signin/service.js +1 -2
- package/output/toaster/index.d.ts +1 -2
- package/output/toaster/index.d.ts.map +1 -1
- package/output/toaster/index.js +0 -6
- package/output/use-observer/use-observer.test.jsx +134 -0
- package/package.json +1 -1
|
@@ -0,0 +1,103 @@
|
|
|
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
|
+
export function RadioGroup(_a) {
|
|
15
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
16
|
+
return (<Headless.RadioGroup data-slot="control" {...props} className={clsx(className,
|
|
17
|
+
// Basic groups
|
|
18
|
+
'space-y-3 **:data-[slot=label]:font-normal',
|
|
19
|
+
// With descriptions
|
|
20
|
+
'has-data-[slot=description]:space-y-6 has-data-[slot=description]:**:data-[slot=label]:font-medium')}/>);
|
|
21
|
+
}
|
|
22
|
+
export function RadioField(_a) {
|
|
23
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
24
|
+
return (<Headless.Field data-slot="field" {...props} className={clsx(className,
|
|
25
|
+
// Base layout
|
|
26
|
+
'grid grid-cols-[1.125rem_1fr] gap-x-4 gap-y-1 sm:grid-cols-[1rem_1fr]',
|
|
27
|
+
// Control layout
|
|
28
|
+
'*:data-[slot=control]:col-start-1 *:data-[slot=control]:row-start-1 *:data-[slot=control]:mt-0.75 sm:*:data-[slot=control]:mt-1',
|
|
29
|
+
// Label layout
|
|
30
|
+
'*:data-[slot=label]:col-start-2 *:data-[slot=label]:row-start-1',
|
|
31
|
+
// Description layout
|
|
32
|
+
'*:data-[slot=description]:col-start-2 *:data-[slot=description]:row-start-2',
|
|
33
|
+
// With description
|
|
34
|
+
'has-data-[slot=description]:**:data-[slot=label]:font-medium')}/>);
|
|
35
|
+
}
|
|
36
|
+
const base = [
|
|
37
|
+
// Basic layout
|
|
38
|
+
'relative isolate flex size-4.75 shrink-0 rounded-full sm:size-4.25',
|
|
39
|
+
// Background color + shadow applied to inset pseudo element, so shadow blends with border in light mode
|
|
40
|
+
'before:absolute before:inset-0 before:-z-10 before:rounded-full before:bg-white before:shadow-sm',
|
|
41
|
+
// Background color when checked
|
|
42
|
+
'group-data-checked:before:bg-(--radio-checked-bg)',
|
|
43
|
+
// Background color is moved to control and shadow is removed in dark mode so hide `before` pseudo
|
|
44
|
+
'dark:before:hidden',
|
|
45
|
+
// Background color applied to control in dark mode
|
|
46
|
+
'dark:bg-white/5 dark:group-data-checked:bg-(--radio-checked-bg)',
|
|
47
|
+
// Border
|
|
48
|
+
'border border-zinc-950/15 group-data-checked:border-transparent group-data-hover:group-data-checked:border-transparent group-data-hover:border-zinc-950/30 group-data-checked:bg-(--radio-checked-border)',
|
|
49
|
+
'dark:border-white/15 dark:group-data-checked:border-white/5 dark:group-data-hover:group-data-checked:border-white/5 dark:group-data-hover:border-white/30',
|
|
50
|
+
// Inner highlight shadow
|
|
51
|
+
'after:absolute after:inset-0 after:rounded-full after:shadow-[inset_0_1px_--theme(--color-white/15%)]',
|
|
52
|
+
'dark:after:-inset-px dark:after:hidden dark:after:rounded-full dark:group-data-checked:after:block',
|
|
53
|
+
// Indicator color (light mode)
|
|
54
|
+
'[--radio-indicator:transparent] group-data-checked:[--radio-indicator:var(--radio-checked-indicator)] group-data-hover:group-data-checked:[--radio-indicator:var(--radio-checked-indicator)] group-data-hover:[--radio-indicator:var(--color-zinc-900)]/10',
|
|
55
|
+
// Indicator color (dark mode)
|
|
56
|
+
'dark:group-data-hover:group-data-checked:[--radio-indicator:var(--radio-checked-indicator)] dark:group-data-hover:[--radio-indicator:var(--color-zinc-700)]',
|
|
57
|
+
// Focus ring
|
|
58
|
+
'group-data-focus:outline group-data-focus:outline-2 group-data-focus:outline-offset-2 group-data-focus:outline-blue-500',
|
|
59
|
+
// Disabled state
|
|
60
|
+
'group-data-disabled:opacity-50',
|
|
61
|
+
'group-data-disabled:border-zinc-950/25 group-data-disabled:bg-zinc-950/5 group-data-disabled:[--radio-checked-indicator:var(--color-zinc-950)]/50 group-data-disabled:before:bg-transparent',
|
|
62
|
+
'dark:group-data-disabled:border-white/20 dark:group-data-disabled:bg-white/2.5 dark:group-data-disabled:[--radio-checked-indicator:var(--color-white)]/50 dark:group-data-checked:group-data-disabled:after:hidden',
|
|
63
|
+
];
|
|
64
|
+
const colors = {
|
|
65
|
+
'dark/zinc': [
|
|
66
|
+
'[--radio-checked-bg:var(--color-zinc-900)] [--radio-checked-border:var(--color-zinc-950)]/90 [--radio-checked-indicator:var(--color-white)]',
|
|
67
|
+
'dark:[--radio-checked-bg:var(--color-zinc-600)]',
|
|
68
|
+
],
|
|
69
|
+
'dark/white': [
|
|
70
|
+
'[--radio-checked-bg:var(--color-zinc-900)] [--radio-checked-border:var(--color-zinc-950)]/90 [--radio-checked-indicator:var(--color-white)]',
|
|
71
|
+
'dark:[--radio-checked-bg:var(--color-white)] dark:[--radio-checked-border:var(--color-zinc-950)]/15 dark:[--radio-checked-indicator:var(--color-zinc-900)]',
|
|
72
|
+
],
|
|
73
|
+
white: '[--radio-checked-bg:var(--color-white)] [--radio-checked-border:var(--color-zinc-950)]/15 [--radio-checked-indicator:var(--color-zinc-900)]',
|
|
74
|
+
dark: '[--radio-checked-bg:var(--color-zinc-900)] [--radio-checked-border:var(--color-zinc-950)]/90 [--radio-checked-indicator:var(--color-white)]',
|
|
75
|
+
zinc: '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-zinc-600)] [--radio-checked-border:var(--color-zinc-700)]/90',
|
|
76
|
+
red: '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-red-600)] [--radio-checked-border:var(--color-red-700)]/90',
|
|
77
|
+
orange: '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-orange-500)] [--radio-checked-border:var(--color-orange-600)]/90',
|
|
78
|
+
amber: '[--radio-checked-bg:var(--color-amber-400)] [--radio-checked-border:var(--color-amber-500)]/80 [--radio-checked-indicator:var(--color-amber-950)]',
|
|
79
|
+
yellow: '[--radio-checked-bg:var(--color-yellow-300)] [--radio-checked-border:var(--color-yellow-400)]/80 [--radio-checked-indicator:var(--color-yellow-950)]',
|
|
80
|
+
lime: '[--radio-checked-bg:var(--color-lime-300)] [--radio-checked-border:var(--color-lime-400)]/80 [--radio-checked-indicator:var(--color-lime-950)]',
|
|
81
|
+
green: '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-green-600)] [--radio-checked-border:var(--color-green-700)]/90',
|
|
82
|
+
emerald: '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-emerald-600)] [--radio-checked-border:var(--color-emerald-700)]/90',
|
|
83
|
+
teal: '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-teal-600)] [--radio-checked-border:var(--color-teal-700)]/90',
|
|
84
|
+
cyan: '[--radio-checked-bg:var(--color-cyan-300)] [--radio-checked-border:var(--color-cyan-400)]/80 [--radio-checked-indicator:var(--color-cyan-950)]',
|
|
85
|
+
sky: '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-sky-500)] [--radio-checked-border:var(--color-sky-600)]/80',
|
|
86
|
+
blue: '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-blue-600)] [--radio-checked-border:var(--color-blue-700)]/90',
|
|
87
|
+
indigo: '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-indigo-500)] [--radio-checked-border:var(--color-indigo-600)]/90',
|
|
88
|
+
violet: '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-violet-500)] [--radio-checked-border:var(--color-violet-600)]/90',
|
|
89
|
+
purple: '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-purple-500)] [--radio-checked-border:var(--color-purple-600)]/90',
|
|
90
|
+
fuchsia: '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-fuchsia-500)] [--radio-checked-border:var(--color-fuchsia-600)]/90',
|
|
91
|
+
pink: '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-pink-500)] [--radio-checked-border:var(--color-pink-600)]/90',
|
|
92
|
+
rose: '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-rose-500)] [--radio-checked-border:var(--color-rose-600)]/90',
|
|
93
|
+
};
|
|
94
|
+
export function Radio(_a) {
|
|
95
|
+
var { color = 'dark/zinc', className } = _a, props = __rest(_a, ["color", "className"]);
|
|
96
|
+
return (<Headless.Radio data-slot="control" {...props} className={clsx(className, 'group inline-flex focus:outline-hidden')}>
|
|
97
|
+
<span className={clsx([base, colors[color]])}>
|
|
98
|
+
<span className={clsx('size-full rounded-full border-[4.5px] border-transparent bg-(--radio-indicator) bg-clip-padding',
|
|
99
|
+
// Forced colors mode
|
|
100
|
+
'forced-colors:border-[Canvas] forced-colors:group-data-checked:border-[Highlight]')}/>
|
|
101
|
+
</span>
|
|
102
|
+
</Headless.Radio>);
|
|
103
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
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
|
+
export const Select = forwardRef(function Select(_a, ref) {
|
|
16
|
+
var { className, multiple } = _a, props = __rest(_a, ["className", "multiple"]);
|
|
17
|
+
return (<span data-slot="control" className={clsx([
|
|
18
|
+
className,
|
|
19
|
+
// Basic layout
|
|
20
|
+
'group relative block w-full',
|
|
21
|
+
// Background color + shadow applied to inset pseudo element, so shadow blends with border in light mode
|
|
22
|
+
'before:absolute before:inset-px before:rounded-[calc(var(--radius-lg)-1px)] before:bg-white before:shadow-sm',
|
|
23
|
+
// Background color is moved to control and shadow is removed in dark mode so hide `before` pseudo
|
|
24
|
+
'dark:before:hidden',
|
|
25
|
+
// Focus ring
|
|
26
|
+
'after:pointer-events-none after:absolute after:inset-0 after:rounded-lg after:ring-transparent after:ring-inset has-data-focus:after:ring-2 has-data-focus:after:ring-blue-500',
|
|
27
|
+
// Disabled state
|
|
28
|
+
'has-data-disabled:opacity-50 has-data-disabled:before:bg-zinc-950/5 has-data-disabled:before:shadow-none',
|
|
29
|
+
])}>
|
|
30
|
+
<Headless.Select ref={ref} multiple={multiple} {...props} className={clsx([
|
|
31
|
+
// Basic layout
|
|
32
|
+
'relative block w-full appearance-none rounded-lg py-[calc(--spacing(2.5)-1px)] sm:py-[calc(--spacing(1.5)-1px)]',
|
|
33
|
+
// Horizontal padding
|
|
34
|
+
multiple
|
|
35
|
+
? 'px-[calc(--spacing(3.5)-1px)] sm:px-[calc(--spacing(3)-1px)]'
|
|
36
|
+
: 'pr-[calc(--spacing(10)-1px)] pl-[calc(--spacing(3.5)-1px)] sm:pr-[calc(--spacing(9)-1px)] sm:pl-[calc(--spacing(3)-1px)]',
|
|
37
|
+
// Options (multi-select)
|
|
38
|
+
'[&_optgroup]:font-semibold',
|
|
39
|
+
// Typography
|
|
40
|
+
'text-base/6 text-zinc-950 placeholder:text-zinc-500 sm:text-sm/6 dark:text-white dark:*:text-white',
|
|
41
|
+
// Border
|
|
42
|
+
'border border-zinc-950/10 data-hover:border-zinc-950/20 dark:border-white/10 dark:data-hover:border-white/20',
|
|
43
|
+
// Background color
|
|
44
|
+
'bg-transparent dark:bg-white/5 dark:*:bg-zinc-800',
|
|
45
|
+
// Hide default focus styles
|
|
46
|
+
'focus:outline-hidden',
|
|
47
|
+
// Invalid state
|
|
48
|
+
'data-invalid:border-red-500 data-invalid:data-hover:border-red-500 dark:data-invalid:border-red-600 dark:data-invalid:data-hover:border-red-600',
|
|
49
|
+
// Disabled state
|
|
50
|
+
'data-disabled:border-zinc-950/20 data-disabled:opacity-100 dark:data-disabled:border-white/15 dark:data-disabled:bg-white/2.5 dark:data-hover:data-disabled:border-white/15',
|
|
51
|
+
])}/>
|
|
52
|
+
{!multiple && (<span className="pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2">
|
|
53
|
+
<svg className="size-5 stroke-zinc-500 group-has-data-disabled:stroke-zinc-600 sm:size-4 dark:stroke-zinc-400 forced-colors:stroke-[CanvasText]" viewBox="0 0 16 16" aria-hidden="true" fill="none">
|
|
54
|
+
<path d="M5.75 10.75L8 13L10.25 10.75" strokeWidth={1.5} strokeLinecap="round" strokeLinejoin="round"/>
|
|
55
|
+
<path d="M10.25 5.25L8 3L5.75 5.25" strokeWidth={1.5} strokeLinecap="round" strokeLinejoin="round"/>
|
|
56
|
+
</svg>
|
|
57
|
+
</span>)}
|
|
58
|
+
</span>);
|
|
59
|
+
});
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import * as Headless from '@headlessui/react';
|
|
3
|
+
import React, { useState } from 'react';
|
|
4
|
+
import { NavbarItem } from './navbar';
|
|
5
|
+
function OpenMenuIcon() {
|
|
6
|
+
return (<svg data-slot="icon" viewBox="0 0 20 20" aria-hidden="true">
|
|
7
|
+
<path d="M2 6.75C2 6.33579 2.33579 6 2.75 6H17.25C17.6642 6 18 6.33579 18 6.75C18 7.16421 17.6642 7.5 17.25 7.5H2.75C2.33579 7.5 2 7.16421 2 6.75ZM2 13.25C2 12.8358 2.33579 12.5 2.75 12.5H17.25C17.6642 12.5 18 12.8358 18 13.25C18 13.6642 17.6642 14 17.25 14H2.75C2.33579 14 2 13.6642 2 13.25Z"/>
|
|
8
|
+
</svg>);
|
|
9
|
+
}
|
|
10
|
+
function CloseMenuIcon() {
|
|
11
|
+
return (<svg data-slot="icon" viewBox="0 0 20 20" aria-hidden="true">
|
|
12
|
+
<path d="M6.28 5.22a.75.75 0 0 0-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 1 0 1.06 1.06L10 11.06l3.72 3.72a.75.75 0 1 0 1.06-1.06L11.06 10l3.72-3.72a.75.75 0 0 0-1.06-1.06L10 8.94 6.28 5.22Z"/>
|
|
13
|
+
</svg>);
|
|
14
|
+
}
|
|
15
|
+
function MobileSidebar({ open, close, children }) {
|
|
16
|
+
return (<Headless.Dialog open={open} onClose={close} className="lg:hidden">
|
|
17
|
+
<Headless.DialogBackdrop transition className="fixed inset-0 bg-black/30 transition data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in"/>
|
|
18
|
+
<Headless.DialogPanel transition className="fixed inset-y-0 w-full max-w-80 p-2 transition duration-300 ease-in-out data-closed:-translate-x-full">
|
|
19
|
+
<div className="flex h-full flex-col rounded-lg bg-white shadow-xs ring-1 ring-zinc-950/5 dark:bg-zinc-900 dark:ring-white/10">
|
|
20
|
+
<div className="-mb-3 px-4 pt-3">
|
|
21
|
+
<Headless.CloseButton as={NavbarItem} aria-label="Close navigation">
|
|
22
|
+
<CloseMenuIcon />
|
|
23
|
+
</Headless.CloseButton>
|
|
24
|
+
</div>
|
|
25
|
+
{children}
|
|
26
|
+
</div>
|
|
27
|
+
</Headless.DialogPanel>
|
|
28
|
+
</Headless.Dialog>);
|
|
29
|
+
}
|
|
30
|
+
export function SidebarLayout({ navbar, sidebar, children, }) {
|
|
31
|
+
let [showSidebar, setShowSidebar] = useState(false);
|
|
32
|
+
return (<div className="relative isolate flex min-h-svh w-full bg-white max-lg:flex-col lg:bg-zinc-100 dark:bg-zinc-900 dark:lg:bg-zinc-950">
|
|
33
|
+
{/* Sidebar on desktop */}
|
|
34
|
+
<div className="fixed inset-y-0 left-0 w-64 max-lg:hidden">{sidebar}</div>
|
|
35
|
+
|
|
36
|
+
{/* Sidebar on mobile */}
|
|
37
|
+
<MobileSidebar open={showSidebar} close={() => setShowSidebar(false)}>
|
|
38
|
+
{sidebar}
|
|
39
|
+
</MobileSidebar>
|
|
40
|
+
|
|
41
|
+
{/* Navbar on mobile */}
|
|
42
|
+
<header className="flex items-center px-4 lg:hidden">
|
|
43
|
+
<div className="py-2.5">
|
|
44
|
+
<NavbarItem onClick={() => setShowSidebar(true)} aria-label="Open navigation">
|
|
45
|
+
<OpenMenuIcon />
|
|
46
|
+
</NavbarItem>
|
|
47
|
+
</div>
|
|
48
|
+
<div className="min-w-0 flex-1">{navbar}</div>
|
|
49
|
+
</header>
|
|
50
|
+
|
|
51
|
+
{/* Content */}
|
|
52
|
+
<main className="flex flex-1 flex-col pb-2 lg:min-w-0 lg:pt-2 lg:pr-2 lg:pl-64">
|
|
53
|
+
<div className="grow 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">
|
|
54
|
+
<div className="mx-auto max-w-6xl">{children}</div>
|
|
55
|
+
</div>
|
|
56
|
+
</main>
|
|
57
|
+
</div>);
|
|
58
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
import * as Headless from '@headlessui/react';
|
|
14
|
+
import clsx from 'clsx';
|
|
15
|
+
import { LayoutGroup, motion } from 'framer-motion';
|
|
16
|
+
import React, { forwardRef, useId } from 'react';
|
|
17
|
+
import { TouchTarget } from './button';
|
|
18
|
+
import { Link } from './link';
|
|
19
|
+
export function Sidebar(_a) {
|
|
20
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
21
|
+
return <nav {...props} className={clsx(className, 'flex h-full min-h-0 flex-col')}/>;
|
|
22
|
+
}
|
|
23
|
+
export function SidebarHeader(_a) {
|
|
24
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
25
|
+
return (<div {...props} className={clsx(className, 'flex flex-col border-b border-zinc-950/5 p-4 dark:border-white/5 [&>[data-slot=section]+[data-slot=section]]:mt-2.5')}/>);
|
|
26
|
+
}
|
|
27
|
+
export function SidebarBody(_a) {
|
|
28
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
29
|
+
return (<div {...props} className={clsx(className, 'flex flex-1 flex-col overflow-y-auto p-4 [&>[data-slot=section]+[data-slot=section]]:mt-8')}/>);
|
|
30
|
+
}
|
|
31
|
+
export function SidebarFooter(_a) {
|
|
32
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
33
|
+
return (<div {...props} className={clsx(className, 'flex flex-col border-t border-zinc-950/5 p-4 dark:border-white/5 [&>[data-slot=section]+[data-slot=section]]:mt-2.5')}/>);
|
|
34
|
+
}
|
|
35
|
+
export function SidebarSection(_a) {
|
|
36
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
37
|
+
let id = useId();
|
|
38
|
+
return (<LayoutGroup id={id}>
|
|
39
|
+
<div {...props} data-slot="section" className={clsx(className, 'flex flex-col gap-0.5')}/>
|
|
40
|
+
</LayoutGroup>);
|
|
41
|
+
}
|
|
42
|
+
export function SidebarDivider(_a) {
|
|
43
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
44
|
+
return <hr {...props} className={clsx(className, 'my-4 border-t border-zinc-950/5 lg:-mx-4 dark:border-white/5')}/>;
|
|
45
|
+
}
|
|
46
|
+
export function SidebarSpacer(_a) {
|
|
47
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
48
|
+
return <div aria-hidden="true" {...props} className={clsx(className, 'mt-8 flex-1')}/>;
|
|
49
|
+
}
|
|
50
|
+
export function SidebarHeading(_a) {
|
|
51
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
52
|
+
return (<h3 {...props} className={clsx(className, 'mb-1 px-2 text-xs/6 font-medium text-zinc-500 dark:text-zinc-400')}/>);
|
|
53
|
+
}
|
|
54
|
+
export const SidebarItem = forwardRef(function SidebarItem(_a, ref) {
|
|
55
|
+
var { current, className, children } = _a, props = __rest(_a, ["current", "className", "children"]);
|
|
56
|
+
let classes = clsx(
|
|
57
|
+
// Base
|
|
58
|
+
'flex w-full items-center gap-3 rounded-lg px-2 py-2.5 text-left text-base/6 font-medium text-zinc-950 sm:py-2 sm:text-sm/5',
|
|
59
|
+
// Leading icon/icon-only
|
|
60
|
+
'*:data-[slot=icon]:size-6 *:data-[slot=icon]:shrink-0 *:data-[slot=icon]:fill-zinc-500 sm:*:data-[slot=icon]:size-5',
|
|
61
|
+
// Trailing icon (down chevron or similar)
|
|
62
|
+
'*:last:data-[slot=icon]:ml-auto *:last:data-[slot=icon]:size-5 sm:*:last:data-[slot=icon]:size-4',
|
|
63
|
+
// Avatar
|
|
64
|
+
'*:data-[slot=avatar]:-m-0.5 *:data-[slot=avatar]:size-7 sm:*:data-[slot=avatar]:size-6',
|
|
65
|
+
// Hover
|
|
66
|
+
'data-hover:bg-zinc-950/5 data-hover:*:data-[slot=icon]:fill-zinc-950',
|
|
67
|
+
// Active
|
|
68
|
+
'data-active:bg-zinc-950/5 data-active:*:data-[slot=icon]:fill-zinc-950',
|
|
69
|
+
// Current
|
|
70
|
+
'data-current:*:data-[slot=icon]:fill-zinc-950',
|
|
71
|
+
// Dark mode
|
|
72
|
+
'dark:text-white dark:*:data-[slot=icon]:fill-zinc-400', 'dark:data-hover:bg-white/5 dark:data-hover:*:data-[slot=icon]:fill-white', 'dark:data-active:bg-white/5 dark:data-active:*:data-[slot=icon]:fill-white', 'dark:data-current:*:data-[slot=icon]:fill-white');
|
|
73
|
+
return (<span className={clsx(className, 'relative')}>
|
|
74
|
+
{current && (<motion.span layoutId="current-indicator" className="absolute inset-y-2 -left-4 w-0.5 rounded-full bg-zinc-950 dark:bg-white"/>)}
|
|
75
|
+
{'href' in props ? (<Headless.CloseButton as={Link} {...props} className={classes} data-current={current ? 'true' : undefined} ref={ref}>
|
|
76
|
+
<TouchTarget>{children}</TouchTarget>
|
|
77
|
+
</Headless.CloseButton>) : (<Headless.Button {...props} className={clsx('cursor-default', classes)} data-current={current ? 'true' : undefined} ref={ref}>
|
|
78
|
+
<TouchTarget>{children}</TouchTarget>
|
|
79
|
+
</Headless.Button>)}
|
|
80
|
+
</span>);
|
|
81
|
+
});
|
|
82
|
+
export function SidebarLabel(_a) {
|
|
83
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
84
|
+
return <span {...props} className={clsx(className, 'truncate')}/>;
|
|
85
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import * as Headless from '@headlessui/react';
|
|
3
|
+
import React, { useState } from 'react';
|
|
4
|
+
import { NavbarItem } from './navbar';
|
|
5
|
+
function OpenMenuIcon() {
|
|
6
|
+
return (<svg data-slot="icon" viewBox="0 0 20 20" aria-hidden="true">
|
|
7
|
+
<path d="M2 6.75C2 6.33579 2.33579 6 2.75 6H17.25C17.6642 6 18 6.33579 18 6.75C18 7.16421 17.6642 7.5 17.25 7.5H2.75C2.33579 7.5 2 7.16421 2 6.75ZM2 13.25C2 12.8358 2.33579 12.5 2.75 12.5H17.25C17.6642 12.5 18 12.8358 18 13.25C18 13.6642 17.6642 14 17.25 14H2.75C2.33579 14 2 13.6642 2 13.25Z"/>
|
|
8
|
+
</svg>);
|
|
9
|
+
}
|
|
10
|
+
function CloseMenuIcon() {
|
|
11
|
+
return (<svg data-slot="icon" viewBox="0 0 20 20" aria-hidden="true">
|
|
12
|
+
<path d="M6.28 5.22a.75.75 0 0 0-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 1 0 1.06 1.06L10 11.06l3.72 3.72a.75.75 0 1 0 1.06-1.06L11.06 10l3.72-3.72a.75.75 0 0 0-1.06-1.06L10 8.94 6.28 5.22Z"/>
|
|
13
|
+
</svg>);
|
|
14
|
+
}
|
|
15
|
+
function MobileSidebar({ open, close, children }) {
|
|
16
|
+
return (<Headless.Dialog open={open} onClose={close} className="lg:hidden">
|
|
17
|
+
<Headless.DialogBackdrop transition className="fixed inset-0 bg-black/30 transition data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in"/>
|
|
18
|
+
<Headless.DialogPanel transition className="fixed inset-y-0 w-full max-w-80 p-2 transition duration-300 ease-in-out data-closed:-translate-x-full">
|
|
19
|
+
<div className="flex h-full flex-col rounded-lg bg-white shadow-xs ring-1 ring-zinc-950/5 dark:bg-zinc-900 dark:ring-white/10">
|
|
20
|
+
<div className="-mb-3 px-4 pt-3">
|
|
21
|
+
<Headless.CloseButton as={NavbarItem} aria-label="Close navigation">
|
|
22
|
+
<CloseMenuIcon />
|
|
23
|
+
</Headless.CloseButton>
|
|
24
|
+
</div>
|
|
25
|
+
{children}
|
|
26
|
+
</div>
|
|
27
|
+
</Headless.DialogPanel>
|
|
28
|
+
</Headless.Dialog>);
|
|
29
|
+
}
|
|
30
|
+
export function StackedLayout({ navbar, sidebar, children, }) {
|
|
31
|
+
let [showSidebar, setShowSidebar] = useState(false);
|
|
32
|
+
return (<div className="relative isolate flex min-h-svh w-full flex-col bg-white lg:bg-zinc-100 dark:bg-zinc-900 dark:lg:bg-zinc-950">
|
|
33
|
+
{/* Sidebar on mobile */}
|
|
34
|
+
<MobileSidebar open={showSidebar} close={() => setShowSidebar(false)}>
|
|
35
|
+
{sidebar}
|
|
36
|
+
</MobileSidebar>
|
|
37
|
+
|
|
38
|
+
{/* Navbar */}
|
|
39
|
+
<header className="flex items-center px-4">
|
|
40
|
+
<div className="py-2.5 lg:hidden">
|
|
41
|
+
<NavbarItem onClick={() => setShowSidebar(true)} aria-label="Open navigation">
|
|
42
|
+
<OpenMenuIcon />
|
|
43
|
+
</NavbarItem>
|
|
44
|
+
</div>
|
|
45
|
+
<div className="min-w-0 flex-1">{navbar}</div>
|
|
46
|
+
</header>
|
|
47
|
+
|
|
48
|
+
{/* Content */}
|
|
49
|
+
<main className="flex flex-1 flex-col pb-2 lg:px-2">
|
|
50
|
+
<div className="grow 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">
|
|
51
|
+
<div className="mx-auto max-w-6xl">{children}</div>
|
|
52
|
+
</div>
|
|
53
|
+
</main>
|
|
54
|
+
</div>);
|
|
55
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
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
|
+
export function SwitchGroup(_a) {
|
|
15
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
16
|
+
return (<div data-slot="control" {...props} className={clsx(className,
|
|
17
|
+
// Basic groups
|
|
18
|
+
'space-y-3 **:data-[slot=label]:font-normal',
|
|
19
|
+
// With descriptions
|
|
20
|
+
'has-data-[slot=description]:space-y-6 has-data-[slot=description]:**:data-[slot=label]:font-medium')}/>);
|
|
21
|
+
}
|
|
22
|
+
export function SwitchField(_a) {
|
|
23
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
24
|
+
return (<Headless.Field data-slot="field" {...props} className={clsx(className,
|
|
25
|
+
// Base layout
|
|
26
|
+
'grid grid-cols-[1fr_auto] gap-x-8 gap-y-1 sm:grid-cols-[1fr_auto]',
|
|
27
|
+
// Control layout
|
|
28
|
+
'*:data-[slot=control]:col-start-2 *:data-[slot=control]:self-start sm:*:data-[slot=control]:mt-0.5',
|
|
29
|
+
// Label layout
|
|
30
|
+
'*:data-[slot=label]:col-start-1 *:data-[slot=label]:row-start-1',
|
|
31
|
+
// Description layout
|
|
32
|
+
'*:data-[slot=description]:col-start-1 *:data-[slot=description]:row-start-2',
|
|
33
|
+
// With description
|
|
34
|
+
'has-data-[slot=description]:**:data-[slot=label]:font-medium')}/>);
|
|
35
|
+
}
|
|
36
|
+
const colors = {
|
|
37
|
+
'dark/zinc': [
|
|
38
|
+
'[--switch-bg-ring:var(--color-zinc-950)]/90 [--switch-bg:var(--color-zinc-900)] dark:[--switch-bg-ring:transparent] dark:[--switch-bg:var(--color-white)]/25',
|
|
39
|
+
'[--switch-ring:var(--color-zinc-950)]/90 [--switch-shadow:var(--color-black)]/10 [--switch:white] dark:[--switch-ring:var(--color-zinc-700)]/90',
|
|
40
|
+
],
|
|
41
|
+
'dark/white': [
|
|
42
|
+
'[--switch-bg-ring:var(--color-zinc-950)]/90 [--switch-bg:var(--color-zinc-900)] dark:[--switch-bg-ring:transparent] dark:[--switch-bg:var(--color-white)]',
|
|
43
|
+
'[--switch-ring:var(--color-zinc-950)]/90 [--switch-shadow:var(--color-black)]/10 [--switch:white] dark:[--switch-ring:transparent] dark:[--switch:var(--color-zinc-900)]',
|
|
44
|
+
],
|
|
45
|
+
dark: [
|
|
46
|
+
'[--switch-bg-ring:var(--color-zinc-950)]/90 [--switch-bg:var(--color-zinc-900)] dark:[--switch-bg-ring:var(--color-white)]/15',
|
|
47
|
+
'[--switch-ring:var(--color-zinc-950)]/90 [--switch-shadow:var(--color-black)]/10 [--switch:white]',
|
|
48
|
+
],
|
|
49
|
+
zinc: [
|
|
50
|
+
'[--switch-bg-ring:var(--color-zinc-700)]/90 [--switch-bg:var(--color-zinc-600)] dark:[--switch-bg-ring:transparent]',
|
|
51
|
+
'[--switch-shadow:var(--color-black)]/10 [--switch:white] [--switch-ring:var(--color-zinc-700)]/90',
|
|
52
|
+
],
|
|
53
|
+
white: [
|
|
54
|
+
'[--switch-bg-ring:var(--color-black)]/15 [--switch-bg:white] dark:[--switch-bg-ring:transparent]',
|
|
55
|
+
'[--switch-shadow:var(--color-black)]/10 [--switch-ring:transparent] [--switch:var(--color-zinc-950)]',
|
|
56
|
+
],
|
|
57
|
+
red: [
|
|
58
|
+
'[--switch-bg-ring:var(--color-red-700)]/90 [--switch-bg:var(--color-red-600)] dark:[--switch-bg-ring:transparent]',
|
|
59
|
+
'[--switch:white] [--switch-ring:var(--color-red-700)]/90 [--switch-shadow:var(--color-red-900)]/20',
|
|
60
|
+
],
|
|
61
|
+
orange: [
|
|
62
|
+
'[--switch-bg-ring:var(--color-orange-600)]/90 [--switch-bg:var(--color-orange-500)] dark:[--switch-bg-ring:transparent]',
|
|
63
|
+
'[--switch:white] [--switch-ring:var(--color-orange-600)]/90 [--switch-shadow:var(--color-orange-900)]/20',
|
|
64
|
+
],
|
|
65
|
+
amber: [
|
|
66
|
+
'[--switch-bg-ring:var(--color-amber-500)]/80 [--switch-bg:var(--color-amber-400)] dark:[--switch-bg-ring:transparent]',
|
|
67
|
+
'[--switch-ring:transparent] [--switch-shadow:transparent] [--switch:var(--color-amber-950)]',
|
|
68
|
+
],
|
|
69
|
+
yellow: [
|
|
70
|
+
'[--switch-bg-ring:var(--color-yellow-400)]/80 [--switch-bg:var(--color-yellow-300)] dark:[--switch-bg-ring:transparent]',
|
|
71
|
+
'[--switch-ring:transparent] [--switch-shadow:transparent] [--switch:var(--color-yellow-950)]',
|
|
72
|
+
],
|
|
73
|
+
lime: [
|
|
74
|
+
'[--switch-bg-ring:var(--color-lime-400)]/80 [--switch-bg:var(--color-lime-300)] dark:[--switch-bg-ring:transparent]',
|
|
75
|
+
'[--switch-ring:transparent] [--switch-shadow:transparent] [--switch:var(--color-lime-950)]',
|
|
76
|
+
],
|
|
77
|
+
green: [
|
|
78
|
+
'[--switch-bg-ring:var(--color-green-700)]/90 [--switch-bg:var(--color-green-600)] dark:[--switch-bg-ring:transparent]',
|
|
79
|
+
'[--switch:white] [--switch-ring:var(--color-green-700)]/90 [--switch-shadow:var(--color-green-900)]/20',
|
|
80
|
+
],
|
|
81
|
+
emerald: [
|
|
82
|
+
'[--switch-bg-ring:var(--color-emerald-600)]/90 [--switch-bg:var(--color-emerald-500)] dark:[--switch-bg-ring:transparent]',
|
|
83
|
+
'[--switch:white] [--switch-ring:var(--color-emerald-600)]/90 [--switch-shadow:var(--color-emerald-900)]/20',
|
|
84
|
+
],
|
|
85
|
+
teal: [
|
|
86
|
+
'[--switch-bg-ring:var(--color-teal-700)]/90 [--switch-bg:var(--color-teal-600)] dark:[--switch-bg-ring:transparent]',
|
|
87
|
+
'[--switch:white] [--switch-ring:var(--color-teal-700)]/90 [--switch-shadow:var(--color-teal-900)]/20',
|
|
88
|
+
],
|
|
89
|
+
cyan: [
|
|
90
|
+
'[--switch-bg-ring:var(--color-cyan-400)]/80 [--switch-bg:var(--color-cyan-300)] dark:[--switch-bg-ring:transparent]',
|
|
91
|
+
'[--switch-ring:transparent] [--switch-shadow:transparent] [--switch:var(--color-cyan-950)]',
|
|
92
|
+
],
|
|
93
|
+
sky: [
|
|
94
|
+
'[--switch-bg-ring:var(--color-sky-600)]/80 [--switch-bg:var(--color-sky-500)] dark:[--switch-bg-ring:transparent]',
|
|
95
|
+
'[--switch:white] [--switch-ring:var(--color-sky-600)]/80 [--switch-shadow:var(--color-sky-900)]/20',
|
|
96
|
+
],
|
|
97
|
+
blue: [
|
|
98
|
+
'[--switch-bg-ring:var(--color-blue-700)]/90 [--switch-bg:var(--color-blue-600)] dark:[--switch-bg-ring:transparent]',
|
|
99
|
+
'[--switch:white] [--switch-ring:var(--color-blue-700)]/90 [--switch-shadow:var(--color-blue-900)]/20',
|
|
100
|
+
],
|
|
101
|
+
indigo: [
|
|
102
|
+
'[--switch-bg-ring:var(--color-indigo-600)]/90 [--switch-bg:var(--color-indigo-500)] dark:[--switch-bg-ring:transparent]',
|
|
103
|
+
'[--switch:white] [--switch-ring:var(--color-indigo-600)]/90 [--switch-shadow:var(--color-indigo-900)]/20',
|
|
104
|
+
],
|
|
105
|
+
violet: [
|
|
106
|
+
'[--switch-bg-ring:var(--color-violet-600)]/90 [--switch-bg:var(--color-violet-500)] dark:[--switch-bg-ring:transparent]',
|
|
107
|
+
'[--switch:white] [--switch-ring:var(--color-violet-600)]/90 [--switch-shadow:var(--color-violet-900)]/20',
|
|
108
|
+
],
|
|
109
|
+
purple: [
|
|
110
|
+
'[--switch-bg-ring:var(--color-purple-600)]/90 [--switch-bg:var(--color-purple-500)] dark:[--switch-bg-ring:transparent]',
|
|
111
|
+
'[--switch:white] [--switch-ring:var(--color-purple-600)]/90 [--switch-shadow:var(--color-purple-900)]/20',
|
|
112
|
+
],
|
|
113
|
+
fuchsia: [
|
|
114
|
+
'[--switch-bg-ring:var(--color-fuchsia-600)]/90 [--switch-bg:var(--color-fuchsia-500)] dark:[--switch-bg-ring:transparent]',
|
|
115
|
+
'[--switch:white] [--switch-ring:var(--color-fuchsia-600)]/90 [--switch-shadow:var(--color-fuchsia-900)]/20',
|
|
116
|
+
],
|
|
117
|
+
pink: [
|
|
118
|
+
'[--switch-bg-ring:var(--color-pink-600)]/90 [--switch-bg:var(--color-pink-500)] dark:[--switch-bg-ring:transparent]',
|
|
119
|
+
'[--switch:white] [--switch-ring:var(--color-pink-600)]/90 [--switch-shadow:var(--color-pink-900)]/20',
|
|
120
|
+
],
|
|
121
|
+
rose: [
|
|
122
|
+
'[--switch-bg-ring:var(--color-rose-600)]/90 [--switch-bg:var(--color-rose-500)] dark:[--switch-bg-ring:transparent]',
|
|
123
|
+
'[--switch:white] [--switch-ring:var(--color-rose-600)]/90 [--switch-shadow:var(--color-rose-900)]/20',
|
|
124
|
+
],
|
|
125
|
+
};
|
|
126
|
+
export function Switch(_a) {
|
|
127
|
+
var { color = 'dark/zinc', className } = _a, props = __rest(_a, ["color", "className"]);
|
|
128
|
+
return (<Headless.Switch data-slot="control" {...props} className={clsx(className,
|
|
129
|
+
// Base styles
|
|
130
|
+
'group relative isolate inline-flex h-6 w-10 cursor-default rounded-full p-[3px] sm:h-5 sm:w-8',
|
|
131
|
+
// Transitions
|
|
132
|
+
'transition duration-0 ease-in-out data-changing:duration-200',
|
|
133
|
+
// Outline and background color in forced-colors mode so switch is still visible
|
|
134
|
+
'forced-colors:outline forced-colors:[--switch-bg:Highlight] dark:forced-colors:[--switch-bg:Highlight]',
|
|
135
|
+
// Unchecked
|
|
136
|
+
'bg-zinc-200 ring-1 ring-black/5 ring-inset dark:bg-white/5 dark:ring-white/15',
|
|
137
|
+
// Checked
|
|
138
|
+
'data-checked:bg-(--switch-bg) data-checked:ring-(--switch-bg-ring) dark:data-checked:bg-(--switch-bg) dark:data-checked:ring-(--switch-bg-ring)',
|
|
139
|
+
// Focus
|
|
140
|
+
'focus:not-data-focus:outline-hidden data-focus:outline-2 data-focus:outline-offset-2 data-focus:outline-blue-500',
|
|
141
|
+
// Hover
|
|
142
|
+
'data-hover:ring-black/15 data-hover:data-checked:ring-(--switch-bg-ring)', 'dark:data-hover:ring-white/25 dark:data-hover:data-checked:ring-(--switch-bg-ring)',
|
|
143
|
+
// Disabled
|
|
144
|
+
'data-disabled:bg-zinc-200 data-disabled:opacity-50 data-disabled:data-checked:bg-zinc-200 data-disabled:data-checked:ring-black/5', 'dark:data-disabled:bg-white/15 dark:data-disabled:data-checked:bg-white/15 dark:data-disabled:data-checked:ring-white/15',
|
|
145
|
+
// Color specific styles
|
|
146
|
+
colors[color])}>
|
|
147
|
+
<span aria-hidden="true" className={clsx(
|
|
148
|
+
// Basic layout
|
|
149
|
+
'pointer-events-none relative inline-block size-4.5 rounded-full sm:size-3.5',
|
|
150
|
+
// Transition
|
|
151
|
+
'translate-x-0 transition duration-200 ease-in-out',
|
|
152
|
+
// Invisible border so the switch is still visible in forced-colors mode
|
|
153
|
+
'border border-transparent',
|
|
154
|
+
// Unchecked
|
|
155
|
+
'bg-white shadow-sm ring-1 ring-black/5',
|
|
156
|
+
// Checked
|
|
157
|
+
'group-data-checked:bg-(--switch) group-data-checked:shadow-(--switch-shadow) group-data-checked:ring-(--switch-ring)', 'group-data-checked:translate-x-4 sm:group-data-checked:translate-x-3',
|
|
158
|
+
// Disabled
|
|
159
|
+
'group-data-checked:group-data-disabled:bg-white group-data-checked:group-data-disabled:shadow-sm group-data-checked:group-data-disabled:ring-black/5')}/>
|
|
160
|
+
</Headless.Switch>);
|
|
161
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
import clsx from 'clsx';
|
|
14
|
+
import { createContext, useContext, useState } from 'react';
|
|
15
|
+
import { Link } from './link';
|
|
16
|
+
const TableContext = createContext({
|
|
17
|
+
bleed: false,
|
|
18
|
+
dense: false,
|
|
19
|
+
grid: false,
|
|
20
|
+
striped: false,
|
|
21
|
+
});
|
|
22
|
+
export function Table(_a) {
|
|
23
|
+
var { bleed = false, dense = false, grid = false, striped = false, className, children } = _a, props = __rest(_a, ["bleed", "dense", "grid", "striped", "className", "children"]);
|
|
24
|
+
return (<TableContext.Provider value={{ bleed, dense, grid, striped }}>
|
|
25
|
+
<div className="flow-root">
|
|
26
|
+
<div {...props} className={clsx(className, '-mx-(--gutter) overflow-x-auto whitespace-nowrap')}>
|
|
27
|
+
<div className={clsx('inline-block min-w-full align-middle', !bleed && 'sm:px-(--gutter)')}>
|
|
28
|
+
<table className="min-w-full text-left text-sm/6 text-zinc-950 dark:text-white">{children}</table>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
</TableContext.Provider>);
|
|
33
|
+
}
|
|
34
|
+
export function TableHead(_a) {
|
|
35
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
36
|
+
return <thead {...props} className={clsx(className, 'text-zinc-500 dark:text-zinc-400')}/>;
|
|
37
|
+
}
|
|
38
|
+
export function TableBody(props) {
|
|
39
|
+
return <tbody {...props}/>;
|
|
40
|
+
}
|
|
41
|
+
const TableRowContext = createContext({
|
|
42
|
+
href: undefined,
|
|
43
|
+
target: undefined,
|
|
44
|
+
title: undefined,
|
|
45
|
+
});
|
|
46
|
+
export function TableRow(_a) {
|
|
47
|
+
var { href, target, title, className } = _a, props = __rest(_a, ["href", "target", "title", "className"]);
|
|
48
|
+
let { striped } = useContext(TableContext);
|
|
49
|
+
return (<TableRowContext.Provider value={{ href, target, title }}>
|
|
50
|
+
<tr {...props} className={clsx(className, href &&
|
|
51
|
+
'has-[[data-row-link][data-focus]]:outline-2 has-[[data-row-link][data-focus]]:-outline-offset-2 has-[[data-row-link][data-focus]]:outline-blue-500 dark:focus-within:bg-white/2.5', striped && 'even:bg-zinc-950/2.5 dark:even:bg-white/2.5', href && striped && 'hover:bg-zinc-950/5 dark:hover:bg-white/5', href && !striped && 'hover:bg-zinc-950/2.5 dark:hover:bg-white/2.5')}/>
|
|
52
|
+
</TableRowContext.Provider>);
|
|
53
|
+
}
|
|
54
|
+
export function TableHeader(_a) {
|
|
55
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
56
|
+
let { bleed, grid } = useContext(TableContext);
|
|
57
|
+
return (<th {...props} className={clsx(className, 'border-b border-b-zinc-950/10 px-4 py-2 font-medium first:pl-(--gutter,--spacing(2)) last:pr-(--gutter,--spacing(2)) dark:border-b-white/10', grid && 'border-l border-l-zinc-950/5 first:border-l-0 dark:border-l-white/5', !bleed && 'sm:first:pl-1 sm:last:pr-1')}/>);
|
|
58
|
+
}
|
|
59
|
+
export function TableCell(_a) {
|
|
60
|
+
var { className, children } = _a, props = __rest(_a, ["className", "children"]);
|
|
61
|
+
let { bleed, dense, grid, striped } = useContext(TableContext);
|
|
62
|
+
let { href, target, title } = useContext(TableRowContext);
|
|
63
|
+
let [cellRef, setCellRef] = useState(null);
|
|
64
|
+
return (<td ref={href ? setCellRef : undefined} {...props} className={clsx(className, 'relative px-4 first:pl-(--gutter,--spacing(2)) last:pr-(--gutter,--spacing(2))', !striped && 'border-b border-zinc-950/5 dark:border-white/5', grid && 'border-l border-l-zinc-950/5 first:border-l-0 dark:border-l-white/5', dense ? 'py-2.5' : 'py-4', !bleed && 'sm:first:pl-1 sm:last:pr-1')}>
|
|
65
|
+
{href && (<Link data-row-link href={href} target={target} aria-label={title} tabIndex={(cellRef === null || cellRef === void 0 ? void 0 : cellRef.previousElementSibling) === null ? 0 : -1} className="absolute inset-0 focus:outline-hidden"/>)}
|
|
66
|
+
{children}
|
|
67
|
+
</td>);
|
|
68
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
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 clsx from 'clsx';
|
|
13
|
+
import { Link } from './link';
|
|
14
|
+
export function Text(_a) {
|
|
15
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
16
|
+
return (<p data-slot="text" {...props} className={clsx(className, 'text-base/6 text-zinc-500 sm:text-sm/6 dark:text-zinc-400')}/>);
|
|
17
|
+
}
|
|
18
|
+
export function TextLink(_a) {
|
|
19
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
20
|
+
return (<Link {...props} className={clsx(className, 'text-zinc-950 underline decoration-zinc-950/50 data-hover:decoration-zinc-950 dark:text-white dark:decoration-white/50 dark:data-hover:decoration-white')}/>);
|
|
21
|
+
}
|
|
22
|
+
export function Strong(_a) {
|
|
23
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
24
|
+
return <strong {...props} className={clsx(className, 'font-medium text-zinc-950 dark:text-white')}/>;
|
|
25
|
+
}
|
|
26
|
+
export function Code(_a) {
|
|
27
|
+
var { className } = _a, props = __rest(_a, ["className"]);
|
|
28
|
+
return (<code {...props} className={clsx(className, 'rounded-sm border border-zinc-950/10 bg-zinc-950/2.5 px-0.5 text-sm font-medium text-zinc-950 sm:text-[0.8125rem] dark:border-white/20 dark:bg-white/5 dark:text-white')}/>);
|
|
29
|
+
}
|