@akira-io/ui 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -10
- package/dist/blocks.d.ts +159 -6
- package/dist/blocks.js +1388 -29
- package/dist/blocks.js.map +1 -1
- package/dist/button-B6wQRe7p.d.ts +16 -0
- package/dist/chunk-5AJFQ6C4.js +35 -0
- package/dist/chunk-5AJFQ6C4.js.map +1 -0
- package/dist/chunk-6QM5BA7B.js +148 -0
- package/dist/chunk-6QM5BA7B.js.map +1 -0
- package/dist/chunk-6X4TKSF6.js +21 -0
- package/dist/chunk-6X4TKSF6.js.map +1 -0
- package/dist/chunk-DSD7MVLL.js +287 -0
- package/dist/chunk-DSD7MVLL.js.map +1 -0
- package/dist/chunk-IQMRJXEO.js +59 -0
- package/dist/chunk-IQMRJXEO.js.map +1 -0
- package/dist/chunk-JAHTUAQL.js +82 -0
- package/dist/chunk-JAHTUAQL.js.map +1 -0
- package/dist/{chunk-A2SIZOEA.js → chunk-KYWA5UYN.js} +125 -45
- package/dist/chunk-KYWA5UYN.js.map +1 -0
- package/dist/chunk-L2H5GIF7.js +22 -0
- package/dist/chunk-L2H5GIF7.js.map +1 -0
- package/dist/chunk-LKSM3WLK.js +44 -0
- package/dist/chunk-LKSM3WLK.js.map +1 -0
- package/dist/{chunk-5MQWJVM2.js → chunk-MNGNBEYN.js} +168 -200
- package/dist/chunk-MNGNBEYN.js.map +1 -0
- package/dist/chunk-SA5LM2GD.js +102 -0
- package/dist/chunk-SA5LM2GD.js.map +1 -0
- package/dist/chunk-UUEWFCKT.js +28 -0
- package/dist/chunk-UUEWFCKT.js.map +1 -0
- package/dist/{chunk-42BJBH56.js → chunk-UUTXPPRN.js} +521 -107
- package/dist/chunk-UUTXPPRN.js.map +1 -0
- package/dist/{chunk-UXL33CZ4.js → chunk-YOVY3KT6.js} +13 -11
- package/dist/chunk-YOVY3KT6.js.map +1 -0
- package/dist/code.d.ts +6 -0
- package/dist/code.js +651 -0
- package/dist/code.js.map +1 -0
- package/dist/context-VgHq4U98.d.ts +384 -0
- package/dist/editor.d.ts +126 -0
- package/dist/editor.js +436 -0
- package/dist/editor.js.map +1 -0
- package/dist/index.d.ts +93 -17
- package/dist/index.js +996 -472
- package/dist/index.js.map +1 -1
- package/dist/inertia.d.ts +47 -2
- package/dist/inertia.js +138 -7
- package/dist/inertia.js.map +1 -1
- package/dist/input-4uxAHW6y.d.ts +5 -0
- package/dist/json-viewer-BTHBACj9.d.ts +50 -0
- package/dist/{language-Bft6rBBt.d.ts → language-Dgjr9bm3.d.ts} +1 -1
- package/dist/locales/pt.d.ts +26 -4
- package/dist/locales/pt.js +127 -1
- package/dist/locales/pt.js.map +1 -1
- package/dist/password-input-r39y2pCT.d.ts +50 -0
- package/dist/shells.d.ts +45 -7
- package/dist/shells.js +95 -60
- package/dist/shells.js.map +1 -1
- package/dist/{sidebar-BDhG9SUU.d.ts → sidebar-BhOIlSjt.d.ts} +4 -12
- package/dist/{types-Cno1_Ijx.d.ts → types-B4QS3h5p.d.ts} +9 -1
- package/dist/types-CT0rBsFc.d.ts +110 -0
- package/package.json +170 -130
- package/theme.css +20 -0
- package/themes/nosferry.css +4 -0
- package/dist/chunk-42BJBH56.js.map +0 -1
- package/dist/chunk-5MQWJVM2.js.map +0 -1
- package/dist/chunk-A2SIZOEA.js.map +0 -1
- package/dist/chunk-POE7OYET.js +0 -96
- package/dist/chunk-POE7OYET.js.map +0 -1
- package/dist/chunk-UXL33CZ4.js.map +0 -1
- package/dist/date-range-filter-QEa8fhUM.d.ts +0 -149
- package/dist/types-cOieac8G.d.ts +0 -77
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
2
|
+
import { VariantProps } from 'class-variance-authority';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
|
|
5
|
+
declare const buttonVariants: (props?: ({
|
|
6
|
+
variant?: "default" | "link" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
|
|
7
|
+
size?: "sm" | "default" | "lg" | "icon" | "icon-sm" | "icon-lg" | null | undefined;
|
|
8
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
9
|
+
interface ButtonProps extends React.ComponentProps<'button'>, VariantProps<typeof buttonVariants> {
|
|
10
|
+
asChild?: boolean;
|
|
11
|
+
loading?: boolean;
|
|
12
|
+
loadingLabel?: string;
|
|
13
|
+
}
|
|
14
|
+
declare function Button({ className, variant, size, asChild, loading, loadingLabel, disabled, children, onClick, ...props }: ButtonProps): React.JSX.Element;
|
|
15
|
+
|
|
16
|
+
export { Button as B, type ButtonProps as a, buttonVariants as b };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
// src/locales/context.tsx
|
|
5
|
+
var EMPTY = {};
|
|
6
|
+
var UiLocaleContext = createContext(EMPTY);
|
|
7
|
+
function UiLocaleProvider({
|
|
8
|
+
labels,
|
|
9
|
+
children
|
|
10
|
+
}) {
|
|
11
|
+
return /* @__PURE__ */ jsx(UiLocaleContext.Provider, { value: labels, children });
|
|
12
|
+
}
|
|
13
|
+
function useUiLocale() {
|
|
14
|
+
return useContext(UiLocaleContext);
|
|
15
|
+
}
|
|
16
|
+
function defined(source) {
|
|
17
|
+
if (!source) {
|
|
18
|
+
return {};
|
|
19
|
+
}
|
|
20
|
+
return Object.fromEntries(
|
|
21
|
+
Object.entries(source).filter(([, value]) => value !== void 0)
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
function useUiLabels(section, defaults, overrides) {
|
|
25
|
+
const locale = useUiLocale();
|
|
26
|
+
return {
|
|
27
|
+
...defaults,
|
|
28
|
+
...defined(locale[section]),
|
|
29
|
+
...defined(overrides)
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export { UiLocaleProvider, useUiLabels, useUiLocale };
|
|
34
|
+
//# sourceMappingURL=chunk-5AJFQ6C4.js.map
|
|
35
|
+
//# sourceMappingURL=chunk-5AJFQ6C4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/locales/context.tsx"],"names":[],"mappings":";;;;AAgDA,IAAM,QAAkB,EAAC;AAEzB,IAAM,eAAA,GAAkB,cAAwB,KAAK,CAAA;AAE9C,SAAS,gBAAA,CAAiB;AAAA,EAC7B,MAAA;AAAA,EACA;AACJ,CAAA,EAGG;AACC,EAAA,2BACK,eAAA,CAAgB,QAAA,EAAhB,EAAyB,KAAA,EAAO,QAC5B,QAAA,EACL,CAAA;AAER;AAEO,SAAS,WAAA,GAAwB;AACpC,EAAA,OAAO,WAAW,eAAe,CAAA;AACrC;AAEA,SAAS,QAAQ,MAAA,EAAqD;AAClE,EAAA,IAAI,CAAC,MAAA,EAAQ;AACT,IAAA,OAAO,EAAC;AAAA,EACZ;AAEA,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACV,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,MAAA,CAAO,CAAC,GAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GACpE;AACJ;AAEO,SAAS,WAAA,CACZ,OAAA,EACA,QAAA,EACA,SAAA,EACwB;AACxB,EAAA,MAAM,SAAS,WAAA,EAAY;AAE3B,EAAA,OAAO;AAAA,IACH,GAAG,QAAA;AAAA,IACH,GAAG,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,IAC1B,GAAG,QAAQ,SAAS;AAAA,GACxB;AACJ","file":"chunk-5AJFQ6C4.js","sourcesContent":["import type { CommandPaletteLabels } from '@/blocks/command-palette';\nimport type {\n DateFilterLabels,\n DateFilterOption,\n} from '@/blocks/date-filter/types';\nimport type { SettingsLabels } from '@/blocks/settings-page';\nimport type { TourLabels } from '@/blocks/tour/types';\nimport type { AppearanceToggleLabels } from '@/components/ui/appearance-toggle';\nimport type { CodeBlockLabels } from '@/components/ui/code-block';\nimport type { ComboboxLabels } from '@/components/ui/combobox';\nimport type { ConfirmDialogLabels } from '@/components/ui/confirm-dialog';\nimport type { CopyButtonLabels } from '@/components/ui/copy-button';\nimport type { DataTableLabels } from '@/components/ui/data-table';\nimport type { DataTableFacetedFilterLabels } from '@/components/ui/data-table-faceted-filter';\nimport type { DatePickerLabels } from '@/components/ui/date-picker';\nimport type { DateRangeFilterLabels } from '@/components/ui/date-range-filter';\nimport type { FloatingSheetLabels } from '@/components/ui/floating-sheet-context';\nimport type { JsonViewerLabels } from '@/components/ui/json-viewer';\nimport type { SaveStatusLabels } from '@/components/ui/save-status';\nimport { createContext, useContext, type ReactNode } from 'react';\n\nexport interface UiLabelSections {\n appearanceToggle: AppearanceToggleLabels;\n codeBlock: CodeBlockLabels;\n combobox: ComboboxLabels;\n commandPalette: CommandPaletteLabels;\n confirmDialog: ConfirmDialogLabels;\n copyButton: CopyButtonLabels;\n dataTable: DataTableLabels;\n dataTableFacetedFilter: DataTableFacetedFilterLabels;\n dateFilter: DateFilterLabels;\n datePicker: DatePickerLabels;\n dateRangeFilter: DateRangeFilterLabels;\n floatingSheet: FloatingSheetLabels;\n jsonViewer: JsonViewerLabels;\n saveStatus: SaveStatusLabels;\n settings: SettingsLabels;\n tour: TourLabels;\n}\n\nexport type UiLabels = {\n [Section in keyof UiLabelSections]?: Partial<UiLabelSections[Section]>;\n} & {\n dateFilterPresets?: DateFilterOption[];\n dateFilterOperators?: DateFilterOption[];\n dateFilterUnits?: DateFilterOption[];\n};\n\nconst EMPTY: UiLabels = {};\n\nconst UiLocaleContext = createContext<UiLabels>(EMPTY);\n\nexport function UiLocaleProvider({\n labels,\n children,\n}: {\n labels: UiLabels;\n children: ReactNode;\n}) {\n return (\n <UiLocaleContext.Provider value={labels}>\n {children}\n </UiLocaleContext.Provider>\n );\n}\n\nexport function useUiLocale(): UiLabels {\n return useContext(UiLocaleContext);\n}\n\nfunction defined(source: object | undefined): Record<string, unknown> {\n if (!source) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(source).filter(([, value]) => value !== undefined),\n );\n}\n\nexport function useUiLabels<Section extends keyof UiLabelSections>(\n section: Section,\n defaults: UiLabelSections[Section],\n overrides?: Partial<UiLabelSections[Section]>,\n): UiLabelSections[Section] {\n const locale = useUiLocale();\n\n return {\n ...defaults,\n ...defined(locale[section]),\n ...defined(overrides),\n } as UiLabelSections[Section];\n}\n"]}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { cn, modalSurface } from './chunk-DSD7MVLL.js';
|
|
2
|
+
import { XIcon } from 'lucide-react';
|
|
3
|
+
import { Dialog as Dialog$1 } from 'radix-ui';
|
|
4
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
|
+
import * as LabelPrimitive from '@radix-ui/react-label';
|
|
6
|
+
|
|
7
|
+
function Dialog({
|
|
8
|
+
...props
|
|
9
|
+
}) {
|
|
10
|
+
return /* @__PURE__ */ jsx(Dialog$1.Root, { "data-slot": "dialog", ...props });
|
|
11
|
+
}
|
|
12
|
+
function DialogTrigger({
|
|
13
|
+
...props
|
|
14
|
+
}) {
|
|
15
|
+
return /* @__PURE__ */ jsx(Dialog$1.Trigger, { "data-slot": "dialog-trigger", ...props });
|
|
16
|
+
}
|
|
17
|
+
function DialogPortal({
|
|
18
|
+
...props
|
|
19
|
+
}) {
|
|
20
|
+
return /* @__PURE__ */ jsx(Dialog$1.Portal, { "data-slot": "dialog-portal", ...props });
|
|
21
|
+
}
|
|
22
|
+
function DialogClose({
|
|
23
|
+
...props
|
|
24
|
+
}) {
|
|
25
|
+
return /* @__PURE__ */ jsx(Dialog$1.Close, { "data-slot": "dialog-close", ...props });
|
|
26
|
+
}
|
|
27
|
+
function DialogOverlay({
|
|
28
|
+
className,
|
|
29
|
+
...props
|
|
30
|
+
}) {
|
|
31
|
+
return /* @__PURE__ */ jsx(
|
|
32
|
+
Dialog$1.Overlay,
|
|
33
|
+
{
|
|
34
|
+
"data-slot": "dialog-overlay",
|
|
35
|
+
className: cn(
|
|
36
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 inset-0 bg-black/60 backdrop-blur-sm fixed z-50",
|
|
37
|
+
className
|
|
38
|
+
),
|
|
39
|
+
...props
|
|
40
|
+
}
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
function DialogContent({
|
|
44
|
+
className,
|
|
45
|
+
children,
|
|
46
|
+
hideCloseButton = false,
|
|
47
|
+
...props
|
|
48
|
+
}) {
|
|
49
|
+
return /* @__PURE__ */ jsxs(DialogPortal, { "data-slot": "dialog-portal", children: [
|
|
50
|
+
/* @__PURE__ */ jsx(DialogOverlay, {}),
|
|
51
|
+
/* @__PURE__ */ jsxs(
|
|
52
|
+
Dialog$1.Content,
|
|
53
|
+
{
|
|
54
|
+
"data-slot": "dialog-content",
|
|
55
|
+
className: cn(
|
|
56
|
+
`${modalSurface} data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 gap-6 p-6 sm:w-full sm:max-w-lg fixed top-[50%] left-[50%] z-50 grid w-[calc(100%-2rem)] max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] overflow-hidden duration-200`,
|
|
57
|
+
className
|
|
58
|
+
),
|
|
59
|
+
...props,
|
|
60
|
+
children: [
|
|
61
|
+
children,
|
|
62
|
+
!hideCloseButton && /* @__PURE__ */ jsxs(Dialog$1.Close, { className: "top-6 right-6 h-10 w-10 shadow-xs absolute z-50 flex items-center justify-center rounded-full border border-border bg-muted text-muted-foreground transition-colors hover:bg-accent hover:text-foreground", children: [
|
|
63
|
+
/* @__PURE__ */ jsx(XIcon, { className: "h-5 w-5" }),
|
|
64
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
|
|
65
|
+
] })
|
|
66
|
+
]
|
|
67
|
+
}
|
|
68
|
+
)
|
|
69
|
+
] });
|
|
70
|
+
}
|
|
71
|
+
function DialogHeader({ className, ...props }) {
|
|
72
|
+
return /* @__PURE__ */ jsx(
|
|
73
|
+
"div",
|
|
74
|
+
{
|
|
75
|
+
"data-slot": "dialog-header",
|
|
76
|
+
className: cn(
|
|
77
|
+
"gap-2 p-6 md:p-8 flex flex-col text-center",
|
|
78
|
+
className
|
|
79
|
+
),
|
|
80
|
+
...props
|
|
81
|
+
}
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
function DialogFooter({ className, ...props }) {
|
|
85
|
+
return /* @__PURE__ */ jsx(
|
|
86
|
+
"div",
|
|
87
|
+
{
|
|
88
|
+
"data-slot": "dialog-footer",
|
|
89
|
+
className: cn(
|
|
90
|
+
"gap-3 p-6 md:p-8 sm:flex-row sm:justify-end flex flex-col-reverse border-t border-border",
|
|
91
|
+
className
|
|
92
|
+
),
|
|
93
|
+
...props
|
|
94
|
+
}
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
function DialogTitle({
|
|
98
|
+
className,
|
|
99
|
+
...props
|
|
100
|
+
}) {
|
|
101
|
+
return /* @__PURE__ */ jsx(
|
|
102
|
+
Dialog$1.Title,
|
|
103
|
+
{
|
|
104
|
+
"data-slot": "dialog-title",
|
|
105
|
+
className: cn(
|
|
106
|
+
"text-2xl font-bold tracking-tight md:text-3xl text-foreground",
|
|
107
|
+
className
|
|
108
|
+
),
|
|
109
|
+
...props
|
|
110
|
+
}
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
function DialogDescription({
|
|
114
|
+
className,
|
|
115
|
+
...props
|
|
116
|
+
}) {
|
|
117
|
+
return /* @__PURE__ */ jsx(
|
|
118
|
+
Dialog$1.Description,
|
|
119
|
+
{
|
|
120
|
+
"data-slot": "dialog-description",
|
|
121
|
+
className: cn(
|
|
122
|
+
"text-base font-medium leading-relaxed text-muted-foreground",
|
|
123
|
+
className
|
|
124
|
+
),
|
|
125
|
+
...props
|
|
126
|
+
}
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
function Label({
|
|
130
|
+
className,
|
|
131
|
+
...props
|
|
132
|
+
}) {
|
|
133
|
+
return /* @__PURE__ */ jsx(
|
|
134
|
+
LabelPrimitive.Root,
|
|
135
|
+
{
|
|
136
|
+
"data-slot": "label",
|
|
137
|
+
className: cn(
|
|
138
|
+
"text-sm font-medium text-foreground select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
|
|
139
|
+
className
|
|
140
|
+
),
|
|
141
|
+
...props
|
|
142
|
+
}
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Label };
|
|
147
|
+
//# sourceMappingURL=chunk-6QM5BA7B.js.map
|
|
148
|
+
//# sourceMappingURL=chunk-6QM5BA7B.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/dialog.tsx","../src/components/ui/label.tsx"],"names":["DialogPrimitive","jsx"],"mappings":";;;;;;AAOA,SAAS,MAAA,CAAO;AAAA,EACZ,GAAG;AACP,CAAA,EAAsD;AAClD,EAAA,2BAAQA,QAAA,CAAgB,IAAA,EAAhB,EAAqB,WAAA,EAAU,QAAA,EAAU,GAAG,KAAA,EAAO,CAAA;AAC/D;AAEA,SAAS,aAAA,CAAc;AAAA,EACnB,GAAG;AACP,CAAA,EAAyD;AACrD,EAAA,2BAAQA,QAAA,CAAgB,OAAA,EAAhB,EAAwB,WAAA,EAAU,gBAAA,EAAkB,GAAG,KAAA,EAAO,CAAA;AAC1E;AAEA,SAAS,YAAA,CAAa;AAAA,EAClB,GAAG;AACP,CAAA,EAAwD;AACpD,EAAA,2BAAQA,QAAA,CAAgB,MAAA,EAAhB,EAAuB,WAAA,EAAU,eAAA,EAAiB,GAAG,KAAA,EAAO,CAAA;AACxE;AAEA,SAAS,WAAA,CAAY;AAAA,EACjB,GAAG;AACP,CAAA,EAAuD;AACnD,EAAA,2BAAQA,QAAA,CAAgB,KAAA,EAAhB,EAAsB,WAAA,EAAU,cAAA,EAAgB,GAAG,KAAA,EAAO,CAAA;AACtE;AAEA,SAAS,aAAA,CAAc;AAAA,EACnB,SAAA;AAAA,EACA,GAAG;AACP,CAAA,EAAyD;AACrD,EAAA,uBACI,GAAA;AAAA,IAACA,QAAA,CAAgB,OAAA;AAAA,IAAhB;AAAA,MACG,WAAA,EAAU,gBAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACP,yKAAA;AAAA,QACA;AAAA,OACJ;AAAA,MACC,GAAG;AAAA;AAAA,GACR;AAER;AAQA,SAAS,aAAA,CAAc;AAAA,EACnB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB,GAAG;AACP,CAAA,EAAuB;AACnB,EAAA,uBACI,IAAA,CAAC,YAAA,EAAA,EAAa,WAAA,EAAU,eAAA,EACpB,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,CAAA;AAAA,oBACf,IAAA;AAAA,MAACA,QAAA,CAAgB,OAAA;AAAA,MAAhB;AAAA,QACG,WAAA,EAAU,gBAAA;AAAA,QACV,SAAA,EAAW,EAAA;AAAA,UACP,GAAG,YAAY,CAAA,yWAAA,CAAA;AAAA,UACf;AAAA,SACJ;AAAA,QACC,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,QAAA;AAAA,UACA,CAAC,eAAA,oBACE,IAAA,CAACA,SAAgB,KAAA,EAAhB,EAAsB,WAAU,2MAAA,EAC7B,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,KAAA,EAAA,EAAM,WAAU,SAAA,EAAU,CAAA;AAAA,4BAC3B,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,OAAA,EAAK;AAAA,WAAA,EACnC;AAAA;AAAA;AAAA;AAER,GAAA,EACJ,CAAA;AAER;AAEA,SAAS,YAAA,CAAa,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACxE,EAAA,uBACI,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,WAAA,EAAU,eAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACP,4CAAA;AAAA,QACA;AAAA,OACJ;AAAA,MACC,GAAG;AAAA;AAAA,GACR;AAER;AAEA,SAAS,YAAA,CAAa,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACxE,EAAA,uBACI,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,WAAA,EAAU,eAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACP,0FAAA;AAAA,QACA;AAAA,OACJ;AAAA,MACC,GAAG;AAAA;AAAA,GACR;AAER;AAEA,SAAS,WAAA,CAAY;AAAA,EACjB,SAAA;AAAA,EACA,GAAG;AACP,CAAA,EAAuD;AACnD,EAAA,uBACI,GAAA;AAAA,IAACA,QAAA,CAAgB,KAAA;AAAA,IAAhB;AAAA,MACG,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACP,+DAAA;AAAA,QACA;AAAA,OACJ;AAAA,MACC,GAAG;AAAA;AAAA,GACR;AAER;AAEA,SAAS,iBAAA,CAAkB;AAAA,EACvB,SAAA;AAAA,EACA,GAAG;AACP,CAAA,EAA6D;AACzD,EAAA,uBACI,GAAA;AAAA,IAACA,QAAA,CAAgB,WAAA;AAAA,IAAhB;AAAA,MACG,WAAA,EAAU,oBAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACP,6DAAA;AAAA,QACA;AAAA,OACJ;AAAA,MACC,GAAG;AAAA;AAAA,GACR;AAER;ACrIA,SAAS,KAAA,CAAM;AAAA,EACX,SAAA;AAAA,EACA,GAAG;AACP,CAAA,EAAqD;AACjD,EAAA,uBACIC,GAAAA;AAAA,IAAgB,cAAA,CAAA,IAAA;AAAA,IAAf;AAAA,MACG,WAAA,EAAU,OAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACP,gMAAA;AAAA,QACA;AAAA,OACJ;AAAA,MACC,GAAG;AAAA;AAAA,GACR;AAER","file":"chunk-6QM5BA7B.js","sourcesContent":["import { XIcon } from 'lucide-react';\nimport { Dialog as DialogPrimitive } from 'radix-ui';\nimport * as React from 'react';\n\nimport { modalSurface } from '@/lib/language';\nimport { cn } from '@/lib/utils';\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 inset-0 bg-black/60 backdrop-blur-sm fixed z-50',\n className,\n )}\n {...props}\n />\n );\n}\n\ninterface DialogContentProps extends React.ComponentProps<\n typeof DialogPrimitive.Content\n> {\n hideCloseButton?: boolean;\n}\n\nfunction DialogContent({\n className,\n children,\n hideCloseButton = false,\n ...props\n}: DialogContentProps) {\n return (\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n `${modalSurface} data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 gap-6 p-6 sm:w-full sm:max-w-lg fixed top-[50%] left-[50%] z-50 grid w-[calc(100%-2rem)] max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] overflow-hidden duration-200`,\n className,\n )}\n {...props}\n >\n {children}\n {!hideCloseButton && (\n <DialogPrimitive.Close className=\"top-6 right-6 h-10 w-10 shadow-xs absolute z-50 flex items-center justify-center rounded-full border border-border bg-muted text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\">\n <XIcon className=\"h-5 w-5\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\n 'gap-2 p-6 md:p-8 flex flex-col text-center',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n 'gap-3 p-6 md:p-8 sm:flex-row sm:justify-end flex flex-col-reverse border-t border-border',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\n 'text-2xl font-bold tracking-tight md:text-3xl text-foreground',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\n 'text-base font-medium leading-relaxed text-muted-foreground',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n};\n","import * as LabelPrimitive from '@radix-ui/react-label';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n 'text-sm font-medium text-foreground select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50',\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Label };\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { cn, fieldSurface, focusRing } from './chunk-DSD7MVLL.js';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
function Input({ className, type, ...props }) {
|
|
5
|
+
return /* @__PURE__ */ jsx(
|
|
6
|
+
"input",
|
|
7
|
+
{
|
|
8
|
+
type,
|
|
9
|
+
"data-slot": "input",
|
|
10
|
+
className: cn(
|
|
11
|
+
`h-11 min-w-0 px-4 text-sm font-medium flex w-full transition-all placeholder:text-muted-foreground focus:bg-muted disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 ${fieldSurface} ${focusRing}`,
|
|
12
|
+
className
|
|
13
|
+
),
|
|
14
|
+
...props
|
|
15
|
+
}
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export { Input };
|
|
20
|
+
//# sourceMappingURL=chunk-6X4TKSF6.js.map
|
|
21
|
+
//# sourceMappingURL=chunk-6X4TKSF6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/input.tsx"],"names":[],"mappings":";;;AAKA,SAAS,MAAM,EAAE,SAAA,EAAW,IAAA,EAAM,GAAG,OAAM,EAAkC;AACzE,EAAA,uBACI,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACG,IAAA;AAAA,MACA,WAAA,EAAU,OAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACP,CAAA,oOAAA,EAAuO,YAAY,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,QAChQ;AAAA,OACJ;AAAA,MACC,GAAG;AAAA;AAAA,GACR;AAER","file":"chunk-6X4TKSF6.js","sourcesContent":["import * as React from 'react';\n\nimport { fieldSurface, focusRing } from '@/lib/language';\nimport { cn } from '@/lib/utils';\n\nfunction Input({ className, type, ...props }: React.ComponentProps<'input'>) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n `h-11 min-w-0 px-4 text-sm font-medium flex w-full transition-all placeholder:text-muted-foreground focus:bg-muted disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 ${fieldSurface} ${focusRing}`,\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n"]}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import { clsx } from 'clsx';
|
|
2
|
+
import { twMerge } from 'tailwind-merge';
|
|
3
|
+
import { cva } from 'class-variance-authority';
|
|
4
|
+
import { LoaderCircle } from 'lucide-react';
|
|
5
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
+
import { Slot } from '@radix-ui/react-slot';
|
|
7
|
+
import * as React from 'react';
|
|
8
|
+
|
|
9
|
+
// src/lib/utils.ts
|
|
10
|
+
function cn(...inputs) {
|
|
11
|
+
return twMerge(clsx(inputs));
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// src/lib/language.ts
|
|
15
|
+
var surfaceRadius = "rounded-3xl";
|
|
16
|
+
var controlRadius = "rounded-2xl";
|
|
17
|
+
var compactRadius = "rounded-xl";
|
|
18
|
+
var glassEdge = "ring-1 ring-surface-ring backdrop-blur-2xl backdrop-saturate-150";
|
|
19
|
+
var elevatedSurface = `${glassEdge} ${surfaceRadius} border-0 shadow-(--glass-elevation)`;
|
|
20
|
+
var floatingSurface = `${glassEdge} border-0 bg-popover/85 text-popover-foreground shadow-(--glass-elevation)`;
|
|
21
|
+
var modalSurface = `${floatingSurface} ${surfaceRadius}`;
|
|
22
|
+
var panelSurface = `${floatingSurface} ${controlRadius}`;
|
|
23
|
+
var menuSurface = `${panelSurface} bg-popover/80`;
|
|
24
|
+
var recessedSurface = `${controlRadius} border-0 bg-surface-recessed/30 text-foreground shadow-none ring-0 backdrop-blur-none`;
|
|
25
|
+
var nestedRadius = controlRadius;
|
|
26
|
+
var nestedSurfaceReset = "nested-surface:border-0 nested-surface:ring-0 nested-surface:bg-transparent nested-surface:shadow-none nested-surface:backdrop-blur-none";
|
|
27
|
+
var nestedEdgeToEdge = "nested-surface:rounded-none";
|
|
28
|
+
var glassControl = "ring-1 ring-surface-ring border-0 shadow-(--glass-shadow) backdrop-blur-md backdrop-saturate-150";
|
|
29
|
+
var controlFill = "bg-surface-control";
|
|
30
|
+
var fieldSurface = `${glassControl} ${controlFill} ${controlRadius} text-foreground`;
|
|
31
|
+
var focusRing = "outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50";
|
|
32
|
+
var menuHighlight = "outline-hidden focus:bg-accent focus:text-accent-foreground";
|
|
33
|
+
function surface(inset) {
|
|
34
|
+
return inset ? `${elevatedSurface} ${recessedSurface}` : elevatedSurface;
|
|
35
|
+
}
|
|
36
|
+
var spinnerVariants = cva("inline-flex shrink-0", {
|
|
37
|
+
variants: {
|
|
38
|
+
size: {
|
|
39
|
+
sm: "size-3.5",
|
|
40
|
+
default: "size-4",
|
|
41
|
+
lg: "size-5"
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
defaultVariants: {
|
|
45
|
+
size: "default"
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
function Spinner({
|
|
49
|
+
className,
|
|
50
|
+
label = "Loading",
|
|
51
|
+
size = "default",
|
|
52
|
+
...props
|
|
53
|
+
}) {
|
|
54
|
+
return /* @__PURE__ */ jsxs(
|
|
55
|
+
"span",
|
|
56
|
+
{
|
|
57
|
+
...props,
|
|
58
|
+
"data-slot": "spinner",
|
|
59
|
+
"data-size": size,
|
|
60
|
+
role: "status",
|
|
61
|
+
className: cn(spinnerVariants({ size }), className),
|
|
62
|
+
children: [
|
|
63
|
+
/* @__PURE__ */ jsx(
|
|
64
|
+
LoaderCircle,
|
|
65
|
+
{
|
|
66
|
+
"aria-hidden": "true",
|
|
67
|
+
className: "animate-spin size-full text-current motion-reduce:animate-none"
|
|
68
|
+
}
|
|
69
|
+
),
|
|
70
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: label })
|
|
71
|
+
]
|
|
72
|
+
}
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
var buttonVariants = cva(
|
|
76
|
+
`inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-2xl text-sm font-semibold transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 aria-invalid:ring-destructive/20 aria-invalid:border-destructive ${focusRing}`,
|
|
77
|
+
{
|
|
78
|
+
variants: {
|
|
79
|
+
variant: {
|
|
80
|
+
default: "bg-primary text-primary-foreground shadow-xl hover:bg-primary/90 hover:scale-[1.02] active:scale-[0.98]",
|
|
81
|
+
destructive: "bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/40",
|
|
82
|
+
outline: `${glassControl} ${controlFill} hover:bg-accent hover:text-accent-foreground`,
|
|
83
|
+
secondary: `${glassControl} bg-secondary/80 text-secondary-foreground hover:bg-secondary`,
|
|
84
|
+
ghost: "hover:bg-accent hover:text-accent-foreground",
|
|
85
|
+
link: "text-primary underline-offset-4 hover:underline"
|
|
86
|
+
},
|
|
87
|
+
size: {
|
|
88
|
+
default: "h-11 px-4 has-[>svg]:px-3",
|
|
89
|
+
sm: "h-9 gap-1.5 rounded-xl px-3 has-[>svg]:px-2.5",
|
|
90
|
+
lg: "h-12 px-6 has-[>svg]:px-5 text-base",
|
|
91
|
+
icon: "size-11",
|
|
92
|
+
"icon-sm": "size-9 rounded-xl",
|
|
93
|
+
"icon-lg": "size-12"
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
defaultVariants: {
|
|
97
|
+
variant: "default",
|
|
98
|
+
size: "default"
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
);
|
|
102
|
+
function spinnerSize(size) {
|
|
103
|
+
if (size === "sm" || size === "icon-sm") return "sm";
|
|
104
|
+
if (size === "lg" || size === "icon-lg") return "lg";
|
|
105
|
+
return "default";
|
|
106
|
+
}
|
|
107
|
+
function loadingPadding(size) {
|
|
108
|
+
if (size === "sm") return "px-2.5";
|
|
109
|
+
if (size === "lg") return "px-5";
|
|
110
|
+
if (size === "default") return "px-3";
|
|
111
|
+
return void 0;
|
|
112
|
+
}
|
|
113
|
+
function Button({
|
|
114
|
+
className,
|
|
115
|
+
variant = "default",
|
|
116
|
+
size = "default",
|
|
117
|
+
asChild = false,
|
|
118
|
+
loading,
|
|
119
|
+
loadingLabel = "Loading",
|
|
120
|
+
disabled,
|
|
121
|
+
children,
|
|
122
|
+
onClick,
|
|
123
|
+
...props
|
|
124
|
+
}) {
|
|
125
|
+
const isLoading = loading === true;
|
|
126
|
+
const hasLoadingState = loading !== void 0;
|
|
127
|
+
const resolvedSize = size ?? "default";
|
|
128
|
+
const baseClasses = buttonVariants({ variant, size: resolvedSize });
|
|
129
|
+
const classes = cn(baseClasses, className);
|
|
130
|
+
const loadingClasses = cn(
|
|
131
|
+
baseClasses,
|
|
132
|
+
loadingPadding(resolvedSize),
|
|
133
|
+
className
|
|
134
|
+
);
|
|
135
|
+
if (asChild) {
|
|
136
|
+
const Comp = asChild ? Slot : "button";
|
|
137
|
+
const mappedSpinnerSize2 = spinnerSize(resolvedSize);
|
|
138
|
+
const slottedChild = React.isValidElement(children) ? children : void 0;
|
|
139
|
+
const items2 = React.Children.toArray(slottedChild?.props.children);
|
|
140
|
+
const first2 = items2[0];
|
|
141
|
+
const iconOnly2 = resolvedSize.startsWith("icon");
|
|
142
|
+
const hasLeadingVisual2 = React.isValidElement(first2) && (items2.length > 1 || iconOnly2);
|
|
143
|
+
const leadingVisual2 = hasLeadingVisual2 ? first2 : void 0;
|
|
144
|
+
const label2 = hasLeadingVisual2 ? items2.slice(1) : items2;
|
|
145
|
+
const slottedChildren = hasLoadingState && slottedChild ? React.cloneElement(
|
|
146
|
+
slottedChild,
|
|
147
|
+
isLoading ? {
|
|
148
|
+
onClick(event) {
|
|
149
|
+
event.preventDefault();
|
|
150
|
+
event.stopPropagation();
|
|
151
|
+
}
|
|
152
|
+
} : void 0,
|
|
153
|
+
/* @__PURE__ */ jsxs(
|
|
154
|
+
"span",
|
|
155
|
+
{
|
|
156
|
+
"data-slot": "button-content",
|
|
157
|
+
className: "inline-flex items-center gap-[inherit]",
|
|
158
|
+
children: [
|
|
159
|
+
/* @__PURE__ */ jsx(
|
|
160
|
+
"span",
|
|
161
|
+
{
|
|
162
|
+
"data-slot": "button-leading",
|
|
163
|
+
className: cn(
|
|
164
|
+
"inline-grid shrink-0 place-items-center",
|
|
165
|
+
spinnerVariants({ size: mappedSpinnerSize2 })
|
|
166
|
+
),
|
|
167
|
+
children: isLoading ? /* @__PURE__ */ jsx(
|
|
168
|
+
Spinner,
|
|
169
|
+
{
|
|
170
|
+
size: mappedSpinnerSize2,
|
|
171
|
+
label: loadingLabel,
|
|
172
|
+
className: "size-full"
|
|
173
|
+
}
|
|
174
|
+
) : leadingVisual2
|
|
175
|
+
}
|
|
176
|
+
),
|
|
177
|
+
/* @__PURE__ */ jsx("span", { "data-slot": "button-label", children: label2 }),
|
|
178
|
+
!hasLeadingVisual2 && !iconOnly2 && /* @__PURE__ */ jsx(
|
|
179
|
+
"span",
|
|
180
|
+
{
|
|
181
|
+
"aria-hidden": "true",
|
|
182
|
+
"data-slot": "button-balance",
|
|
183
|
+
className: spinnerVariants({
|
|
184
|
+
size: mappedSpinnerSize2
|
|
185
|
+
})
|
|
186
|
+
}
|
|
187
|
+
)
|
|
188
|
+
]
|
|
189
|
+
}
|
|
190
|
+
)
|
|
191
|
+
) : children;
|
|
192
|
+
return /* @__PURE__ */ jsx(
|
|
193
|
+
Comp,
|
|
194
|
+
{
|
|
195
|
+
...props,
|
|
196
|
+
"data-slot": "button",
|
|
197
|
+
"data-variant": variant,
|
|
198
|
+
"data-size": resolvedSize,
|
|
199
|
+
"data-loading": isLoading || void 0,
|
|
200
|
+
className: hasLoadingState ? loadingClasses : classes,
|
|
201
|
+
disabled: disabled || isLoading,
|
|
202
|
+
"aria-busy": isLoading ? true : props["aria-busy"],
|
|
203
|
+
"aria-disabled": isLoading ? true : props["aria-disabled"],
|
|
204
|
+
onClick: isLoading ? void 0 : onClick,
|
|
205
|
+
children: slottedChildren
|
|
206
|
+
}
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
if (loading === void 0) {
|
|
210
|
+
return /* @__PURE__ */ jsx(
|
|
211
|
+
"button",
|
|
212
|
+
{
|
|
213
|
+
...props,
|
|
214
|
+
"data-slot": "button",
|
|
215
|
+
"data-variant": variant,
|
|
216
|
+
"data-size": resolvedSize,
|
|
217
|
+
className: classes,
|
|
218
|
+
disabled,
|
|
219
|
+
onClick,
|
|
220
|
+
children
|
|
221
|
+
}
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
const items = React.Children.toArray(children);
|
|
225
|
+
const first = items[0];
|
|
226
|
+
const iconOnly = resolvedSize.startsWith("icon");
|
|
227
|
+
const hasLeadingVisual = React.isValidElement(first) && (items.length > 1 || iconOnly);
|
|
228
|
+
const leadingVisual = hasLeadingVisual ? first : void 0;
|
|
229
|
+
const label = hasLeadingVisual ? items.slice(1) : items;
|
|
230
|
+
const mappedSpinnerSize = spinnerSize(resolvedSize);
|
|
231
|
+
return /* @__PURE__ */ jsx(
|
|
232
|
+
"button",
|
|
233
|
+
{
|
|
234
|
+
...props,
|
|
235
|
+
"data-slot": "button",
|
|
236
|
+
"data-variant": variant,
|
|
237
|
+
"data-size": resolvedSize,
|
|
238
|
+
"data-loading": isLoading || void 0,
|
|
239
|
+
className: loadingClasses,
|
|
240
|
+
disabled: disabled || isLoading,
|
|
241
|
+
"aria-busy": isLoading ? true : props["aria-busy"],
|
|
242
|
+
onClick,
|
|
243
|
+
children: /* @__PURE__ */ jsxs(
|
|
244
|
+
"span",
|
|
245
|
+
{
|
|
246
|
+
"data-slot": "button-content",
|
|
247
|
+
className: "inline-flex items-center gap-[inherit]",
|
|
248
|
+
children: [
|
|
249
|
+
/* @__PURE__ */ jsx(
|
|
250
|
+
"span",
|
|
251
|
+
{
|
|
252
|
+
"data-slot": "button-leading",
|
|
253
|
+
className: cn(
|
|
254
|
+
"inline-grid shrink-0 place-items-center",
|
|
255
|
+
spinnerVariants({ size: mappedSpinnerSize })
|
|
256
|
+
),
|
|
257
|
+
children: isLoading ? /* @__PURE__ */ jsx(
|
|
258
|
+
Spinner,
|
|
259
|
+
{
|
|
260
|
+
size: mappedSpinnerSize,
|
|
261
|
+
label: loadingLabel,
|
|
262
|
+
className: "size-full"
|
|
263
|
+
}
|
|
264
|
+
) : leadingVisual
|
|
265
|
+
}
|
|
266
|
+
),
|
|
267
|
+
/* @__PURE__ */ jsx("span", { "data-slot": "button-label", children: label }),
|
|
268
|
+
!hasLeadingVisual && !iconOnly && /* @__PURE__ */ jsx(
|
|
269
|
+
"span",
|
|
270
|
+
{
|
|
271
|
+
"aria-hidden": "true",
|
|
272
|
+
"data-slot": "button-balance",
|
|
273
|
+
className: spinnerVariants({
|
|
274
|
+
size: mappedSpinnerSize
|
|
275
|
+
})
|
|
276
|
+
}
|
|
277
|
+
)
|
|
278
|
+
]
|
|
279
|
+
}
|
|
280
|
+
)
|
|
281
|
+
}
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
export { Button, Spinner, buttonVariants, cn, compactRadius, controlFill, controlRadius, elevatedSurface, fieldSurface, floatingSurface, focusRing, glassControl, menuHighlight, menuSurface, modalSurface, nestedEdgeToEdge, nestedRadius, nestedSurfaceReset, panelSurface, recessedSurface, spinnerVariants, surface };
|
|
286
|
+
//# sourceMappingURL=chunk-DSD7MVLL.js.map
|
|
287
|
+
//# sourceMappingURL=chunk-DSD7MVLL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts","../src/lib/language.ts","../src/components/ui/spinner.tsx","../src/components/ui/button.tsx"],"names":["cva","mappedSpinnerSize","items","first","iconOnly","hasLeadingVisual","leadingVisual","label","jsxs","jsx"],"mappings":"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","file":"chunk-DSD7MVLL.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","export const surfaceRadius = 'rounded-3xl';\n\nexport const controlRadius = 'rounded-2xl';\n\nexport const compactRadius = 'rounded-xl';\n\nexport const glassEdge =\n 'ring-1 ring-surface-ring backdrop-blur-2xl backdrop-saturate-150';\n\nexport const elevatedSurface = `${glassEdge} ${surfaceRadius} border-0 shadow-(--glass-elevation)`;\n\nexport const floatingSurface = `${glassEdge} border-0 bg-popover/85 text-popover-foreground shadow-(--glass-elevation)`;\n\nexport const modalSurface = `${floatingSurface} ${surfaceRadius}`;\n\nexport const panelSurface = `${floatingSurface} ${controlRadius}`;\n\nexport const menuSurface = `${panelSurface} bg-popover/80`;\n\nexport const recessedSurface = `${controlRadius} border-0 bg-surface-recessed/30 text-foreground shadow-none ring-0 backdrop-blur-none`;\n\nexport const nestedRadius = controlRadius;\n\nexport const nestedSurfaceReset =\n 'nested-surface:border-0 nested-surface:ring-0 nested-surface:bg-transparent nested-surface:shadow-none nested-surface:backdrop-blur-none';\n\nexport const nestedEdgeToEdge = 'nested-surface:rounded-none';\n\nexport const glassControl =\n 'ring-1 ring-surface-ring border-0 shadow-(--glass-shadow) backdrop-blur-md backdrop-saturate-150';\n\nexport const controlFill = 'bg-surface-control';\n\nexport const fieldSurface = `${glassControl} ${controlFill} ${controlRadius} text-foreground`;\n\nexport const focusRing =\n 'outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50';\n\nexport const menuHighlight =\n 'outline-hidden focus:bg-accent focus:text-accent-foreground';\n\nexport interface SurfaceProps {\n inset?: boolean;\n}\n\nexport function surface(inset?: boolean | null): string {\n return inset ? `${elevatedSurface} ${recessedSurface}` : elevatedSurface;\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\nimport { LoaderCircle } from 'lucide-react';\nimport * as React from 'react';\n\nimport { cn } from '@/lib/utils';\n\nconst spinnerVariants = cva('inline-flex shrink-0', {\n variants: {\n size: {\n sm: 'size-3.5',\n default: 'size-4',\n lg: 'size-5',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n});\n\ninterface SpinnerProps\n extends React.ComponentProps<'span'>, VariantProps<typeof spinnerVariants> {\n label?: string;\n}\n\nfunction Spinner({\n className,\n label = 'Loading',\n size = 'default',\n ...props\n}: SpinnerProps) {\n return (\n <span\n {...props}\n data-slot=\"spinner\"\n data-size={size}\n role=\"status\"\n className={cn(spinnerVariants({ size }), className)}\n >\n <LoaderCircle\n aria-hidden=\"true\"\n className=\"animate-spin size-full text-current motion-reduce:animate-none\"\n />\n <span className=\"sr-only\">{label}</span>\n </span>\n );\n}\n\nexport { Spinner, spinnerVariants, type SpinnerProps };\n","import { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\n\nimport {\n Spinner,\n spinnerVariants,\n type SpinnerProps,\n} from '@/components/ui/spinner';\nimport { controlFill, focusRing, glassControl } from '@/lib/language';\nimport { cn } from '@/lib/utils';\n\nconst buttonVariants = cva(\n `inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-2xl text-sm font-semibold transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 aria-invalid:ring-destructive/20 aria-invalid:border-destructive ${focusRing}`,\n {\n variants: {\n variant: {\n default:\n 'bg-primary text-primary-foreground shadow-xl hover:bg-primary/90 hover:scale-[1.02] active:scale-[0.98]',\n destructive:\n 'bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/40',\n outline: `${glassControl} ${controlFill} hover:bg-accent hover:text-accent-foreground`,\n secondary: `${glassControl} bg-secondary/80 text-secondary-foreground hover:bg-secondary`,\n ghost: 'hover:bg-accent hover:text-accent-foreground',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-11 px-4 has-[>svg]:px-3',\n sm: 'h-9 gap-1.5 rounded-xl px-3 has-[>svg]:px-2.5',\n lg: 'h-12 px-6 has-[>svg]:px-5 text-base',\n icon: 'size-11',\n 'icon-sm': 'size-9 rounded-xl',\n 'icon-lg': 'size-12',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\ntype ButtonSize = NonNullable<VariantProps<typeof buttonVariants>['size']>;\n\ninterface ButtonProps\n extends\n React.ComponentProps<'button'>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n loading?: boolean;\n loadingLabel?: string;\n}\n\nfunction spinnerSize(size: ButtonSize): SpinnerProps['size'] {\n if (size === 'sm' || size === 'icon-sm') return 'sm';\n if (size === 'lg' || size === 'icon-lg') return 'lg';\n return 'default';\n}\n\nfunction loadingPadding(size: ButtonSize): string | undefined {\n if (size === 'sm') return 'px-2.5';\n if (size === 'lg') return 'px-5';\n if (size === 'default') return 'px-3';\n return undefined;\n}\n\nfunction Button({\n className,\n variant = 'default',\n size = 'default',\n asChild = false,\n loading,\n loadingLabel = 'Loading',\n disabled,\n children,\n onClick,\n ...props\n}: ButtonProps) {\n const isLoading = loading === true;\n const hasLoadingState = loading !== undefined;\n const resolvedSize: ButtonSize = size ?? 'default';\n const baseClasses = buttonVariants({ variant, size: resolvedSize });\n const classes = cn(baseClasses, className);\n const loadingClasses = cn(\n baseClasses,\n loadingPadding(resolvedSize),\n className,\n );\n\n if (asChild) {\n const Comp = asChild ? Slot : 'button';\n const mappedSpinnerSize = spinnerSize(resolvedSize);\n const slottedChild = React.isValidElement<\n React.HTMLAttributes<HTMLElement>\n >(children)\n ? children\n : undefined;\n const items = React.Children.toArray(slottedChild?.props.children);\n const first = items[0];\n const iconOnly = resolvedSize.startsWith('icon');\n const hasLeadingVisual =\n React.isValidElement(first) && (items.length > 1 || iconOnly);\n const leadingVisual = hasLeadingVisual ? first : undefined;\n const label = hasLeadingVisual ? items.slice(1) : items;\n const slottedChildren =\n hasLoadingState && slottedChild\n ? React.cloneElement(\n slottedChild,\n isLoading\n ? {\n onClick(event) {\n event.preventDefault();\n event.stopPropagation();\n },\n }\n : undefined,\n <span\n data-slot=\"button-content\"\n className=\"inline-flex items-center gap-[inherit]\"\n >\n <span\n data-slot=\"button-leading\"\n className={cn(\n 'inline-grid shrink-0 place-items-center',\n spinnerVariants({ size: mappedSpinnerSize }),\n )}\n >\n {isLoading ? (\n <Spinner\n size={mappedSpinnerSize}\n label={loadingLabel}\n className=\"size-full\"\n />\n ) : (\n leadingVisual\n )}\n </span>\n <span data-slot=\"button-label\">{label}</span>\n {!hasLeadingVisual && !iconOnly && (\n <span\n aria-hidden=\"true\"\n data-slot=\"button-balance\"\n className={spinnerVariants({\n size: mappedSpinnerSize,\n })}\n />\n )}\n </span>,\n )\n : children;\n\n return (\n <Comp\n {...props}\n data-slot=\"button\"\n data-variant={variant}\n data-size={resolvedSize}\n data-loading={isLoading || undefined}\n className={hasLoadingState ? loadingClasses : classes}\n disabled={disabled || isLoading}\n aria-busy={isLoading ? true : props['aria-busy']}\n aria-disabled={isLoading ? true : props['aria-disabled']}\n onClick={isLoading ? undefined : onClick}\n >\n {slottedChildren}\n </Comp>\n );\n }\n\n if (loading === undefined) {\n return (\n <button\n {...props}\n data-slot=\"button\"\n data-variant={variant}\n data-size={resolvedSize}\n className={classes}\n disabled={disabled}\n onClick={onClick}\n >\n {children}\n </button>\n );\n }\n\n const items = React.Children.toArray(children);\n const first = items[0];\n const iconOnly = resolvedSize.startsWith('icon');\n const hasLeadingVisual =\n React.isValidElement(first) && (items.length > 1 || iconOnly);\n const leadingVisual = hasLeadingVisual ? first : undefined;\n const label = hasLeadingVisual ? items.slice(1) : items;\n const mappedSpinnerSize = spinnerSize(resolvedSize);\n\n return (\n <button\n {...props}\n data-slot=\"button\"\n data-variant={variant}\n data-size={resolvedSize}\n data-loading={isLoading || undefined}\n className={loadingClasses}\n disabled={disabled || isLoading}\n aria-busy={isLoading ? true : props['aria-busy']}\n onClick={onClick}\n >\n <span\n data-slot=\"button-content\"\n className=\"inline-flex items-center gap-[inherit]\"\n >\n <span\n data-slot=\"button-leading\"\n className={cn(\n 'inline-grid shrink-0 place-items-center',\n spinnerVariants({ size: mappedSpinnerSize }),\n )}\n >\n {isLoading ? (\n <Spinner\n size={mappedSpinnerSize}\n label={loadingLabel}\n className=\"size-full\"\n />\n ) : (\n leadingVisual\n )}\n </span>\n <span data-slot=\"button-label\">{label}</span>\n {!hasLeadingVisual && !iconOnly && (\n <span\n aria-hidden=\"true\"\n data-slot=\"button-balance\"\n className={spinnerVariants({\n size: mappedSpinnerSize,\n })}\n />\n )}\n </span>\n </button>\n );\n}\n\nexport { Button, buttonVariants, type ButtonProps };\n"]}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { useState, useCallback, useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
// src/hooks/use-appearance.tsx
|
|
4
|
+
var prefersDark = () => {
|
|
5
|
+
if (typeof window === "undefined") {
|
|
6
|
+
return false;
|
|
7
|
+
}
|
|
8
|
+
return window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
9
|
+
};
|
|
10
|
+
var setCookie = (name, value, days = 365) => {
|
|
11
|
+
if (typeof document === "undefined") {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const maxAge = days * 24 * 60 * 60;
|
|
15
|
+
document.cookie = `${name}=${value};path=/;max-age=${maxAge};SameSite=Lax`;
|
|
16
|
+
};
|
|
17
|
+
var applyTheme = (appearance) => {
|
|
18
|
+
const isDark = appearance === "dark" || appearance === "system" && prefersDark();
|
|
19
|
+
document.documentElement.classList.toggle("dark", isDark);
|
|
20
|
+
document.documentElement.style.colorScheme = isDark ? "dark" : "light";
|
|
21
|
+
};
|
|
22
|
+
var mediaQuery = () => {
|
|
23
|
+
if (typeof window === "undefined") {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
return window.matchMedia("(prefers-color-scheme: dark)");
|
|
27
|
+
};
|
|
28
|
+
var handleSystemThemeChange = () => {
|
|
29
|
+
const currentAppearance = localStorage.getItem("appearance");
|
|
30
|
+
applyTheme(currentAppearance || "system");
|
|
31
|
+
};
|
|
32
|
+
function initializeTheme() {
|
|
33
|
+
const savedAppearance = localStorage.getItem("appearance") || "system";
|
|
34
|
+
applyTheme(savedAppearance);
|
|
35
|
+
mediaQuery()?.addEventListener("change", handleSystemThemeChange);
|
|
36
|
+
}
|
|
37
|
+
function useAppearance() {
|
|
38
|
+
const [appearance, setAppearance] = useState("system");
|
|
39
|
+
const updateAppearance = useCallback((mode) => {
|
|
40
|
+
setAppearance(mode);
|
|
41
|
+
localStorage.setItem("appearance", mode);
|
|
42
|
+
setCookie("appearance", mode);
|
|
43
|
+
applyTheme(mode);
|
|
44
|
+
}, []);
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
const savedAppearance = localStorage.getItem(
|
|
47
|
+
"appearance"
|
|
48
|
+
);
|
|
49
|
+
updateAppearance(savedAppearance || "system");
|
|
50
|
+
const query = mediaQuery();
|
|
51
|
+
query?.addEventListener("change", handleSystemThemeChange);
|
|
52
|
+
return () => query?.removeEventListener("change", handleSystemThemeChange);
|
|
53
|
+
}, [updateAppearance]);
|
|
54
|
+
return { appearance, updateAppearance };
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export { initializeTheme, useAppearance };
|
|
58
|
+
//# sourceMappingURL=chunk-IQMRJXEO.js.map
|
|
59
|
+
//# sourceMappingURL=chunk-IQMRJXEO.js.map
|