@tradalab/lyra 3.4.0 → 3.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blocks/index.d.ts +22 -71
- package/dist/blocks/index.js +18 -179
- package/dist/blocks/index.js.map +1 -1
- package/dist/chunk-7MZ73OVI.js +3776 -0
- package/dist/chunk-7MZ73OVI.js.map +1 -0
- package/dist/chunk-AIULLZYM.js +21 -0
- package/dist/chunk-AIULLZYM.js.map +1 -0
- package/dist/{chunk-FHM6VOPQ.js → chunk-AM6UJ666.js} +105 -3
- package/dist/chunk-AM6UJ666.js.map +1 -0
- package/dist/chunk-D7DMRCDY.js +115 -0
- package/dist/chunk-D7DMRCDY.js.map +1 -0
- package/dist/{chunk-VDO6PQ5L.js → chunk-L4LQCVOF.js} +144 -8
- package/dist/chunk-L4LQCVOF.js.map +1 -0
- package/dist/{chunk-BTZYRWFX.js → chunk-RNKXFELK.js} +223 -17
- package/dist/chunk-RNKXFELK.js.map +1 -0
- package/dist/{chunk-2HDU26FC.js → chunk-VXW3K5O5.js} +99 -3
- package/dist/chunk-VXW3K5O5.js.map +1 -0
- package/dist/data-table/index.js +1 -2
- package/dist/data-table/index.js.map +1 -1
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.js +2 -1
- package/dist/people/index.js +2 -4
- package/dist/people/index.js.map +1 -1
- package/dist/plate-BJ19iaVV.d.ts +38 -0
- package/dist/plate-picker-CXxUGyNz.d.ts +20 -0
- package/dist/preference-script-Dm-LEoYX.d.ts +5 -0
- package/dist/shell/index.d.ts +19 -5
- package/dist/shell/index.js +39 -13
- package/dist/shell/index.js.map +1 -1
- package/dist/ui/index.d.ts +5 -2
- package/dist/ui/index.js +7 -3176
- package/dist/ui/index.js.map +1 -1
- package/dist/use-compact-BvI4sJf9.d.ts +15 -0
- package/package.json +1 -1
- package/dist/chunk-2HDU26FC.js.map +0 -1
- package/dist/chunk-BTZYRWFX.js.map +0 -1
- package/dist/chunk-CV3UXQBT.js +0 -110
- package/dist/chunk-CV3UXQBT.js.map +0 -1
- package/dist/chunk-EJP7F42V.js +0 -679
- package/dist/chunk-EJP7F42V.js.map +0 -1
- package/dist/chunk-F2ET7EL2.js +0 -104
- package/dist/chunk-F2ET7EL2.js.map +0 -1
- package/dist/chunk-FHM6VOPQ.js.map +0 -1
- package/dist/chunk-QYA2HGKW.js +0 -20
- package/dist/chunk-QYA2HGKW.js.map +0 -1
- package/dist/chunk-VDO6PQ5L.js.map +0 -1
- package/dist/chunk-XJJQAQWJ.js +0 -119
- package/dist/chunk-XJJQAQWJ.js.map +0 -1
- package/dist/chunk-XWGYXLIA.js +0 -147
- package/dist/chunk-XWGYXLIA.js.map +0 -1
- package/dist/{breadcrumb-CgEcSonR.d.ts → account-menu-D9M_kEzN.d.ts} +12 -12
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { useStoredSetting, PLATE_KEY, isPlate, useRootAttribute, COMPACT_KEY } from './chunk-D7DMRCDY.js';
|
|
2
|
+
import { useCallback } from 'react';
|
|
3
|
+
|
|
4
|
+
// src/hooks/use-plate.ts
|
|
5
|
+
function usePlate() {
|
|
6
|
+
const [stored, store] = useStoredSetting(PLATE_KEY);
|
|
7
|
+
const plate = stored !== null && isPlate(stored) ? stored : null;
|
|
8
|
+
useRootAttribute("data-plate", plate);
|
|
9
|
+
return [plate, store];
|
|
10
|
+
}
|
|
11
|
+
function useCompact() {
|
|
12
|
+
const [stored, store] = useStoredSetting(COMPACT_KEY);
|
|
13
|
+
const compact = stored === "true";
|
|
14
|
+
const setCompact = useCallback((next) => store(next ? "true" : null), [store]);
|
|
15
|
+
useRootAttribute("data-compact", compact ? "true" : null);
|
|
16
|
+
return [compact, setCompact];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export { useCompact, usePlate };
|
|
20
|
+
//# sourceMappingURL=chunk-AIULLZYM.js.map
|
|
21
|
+
//# sourceMappingURL=chunk-AIULLZYM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-plate.ts","../src/hooks/use-compact.ts"],"names":[],"mappings":";;;;AAaO,SAAS,QAAA,GAA0D;AACxE,EAAA,MAAM,CAAC,MAAA,EAAQ,KAAK,CAAA,GAAI,iBAAiB,SAAS,CAAA;AAClD,EAAA,MAAM,QAAQ,MAAA,KAAW,IAAA,IAAQ,OAAA,CAAQ,MAAM,IAAI,MAAA,GAAS,IAAA;AAC5D,EAAA,gBAAA,CAAiB,cAAc,KAAK,CAAA;AACpC,EAAA,OAAO,CAAC,OAAO,KAAK,CAAA;AACtB;ACbO,SAAS,UAAA,GAAoD;AAClE,EAAA,MAAM,CAAC,MAAA,EAAQ,KAAK,CAAA,GAAI,iBAAiB,WAAW,CAAA;AACpD,EAAA,MAAM,UAAU,MAAA,KAAW,MAAA;AAC3B,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,CAAC,IAAA,KAAkB,KAAA,CAAM,IAAA,GAAO,MAAA,GAAS,IAAI,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACtF,EAAA,gBAAA,CAAiB,cAAA,EAAgB,OAAA,GAAU,MAAA,GAAS,IAAI,CAAA;AACxD,EAAA,OAAO,CAAC,SAAS,UAAU,CAAA;AAC7B","file":"chunk-AIULLZYM.js","sourcesContent":["\"use client\"\n\nimport { PLATE_KEY, useRootAttribute, useStoredSetting } from \"./device-setting.js\"\nimport { isPlate, type Plate } from \"./plate.js\"\n\n/**\n * The plate this device is set to, and a way to change it.\n *\n * A stored name that is no longer a plate - a rename, a downgrade to an older lyra - reads as no\n * plate. The alternative is an attribute no rule matches, which looks identical to the neutral\n * default on screen while the picker shows nothing selected at all, so the reader cannot tell that\n * their choice was dropped or get back to a known state.\n */\nexport function usePlate(): [Plate | null, (plate: Plate | null) => void] {\n const [stored, store] = useStoredSetting(PLATE_KEY)\n const plate = stored !== null && isPlate(stored) ? stored : null\n useRootAttribute(\"data-plate\", plate)\n return [plate, store]\n}\n","\"use client\"\n\nimport { useCallback } from \"react\"\nimport { COMPACT_KEY, useRootAttribute, useStoredSetting } from \"./device-setting.js\"\n\nexport function useCompact(): [boolean, (compact: boolean) => void] {\n const [stored, store] = useStoredSetting(COMPACT_KEY)\n const compact = stored === \"true\"\n const setCompact = useCallback((next: boolean) => store(next ? \"true\" : null), [store])\n useRootAttribute(\"data-compact\", compact ? \"true\" : null)\n return [compact, setCompact]\n}\n"]}
|
|
@@ -66,7 +66,109 @@ function NativeSelectOptGroup({
|
|
|
66
66
|
}
|
|
67
67
|
);
|
|
68
68
|
}
|
|
69
|
+
function Table({ className, ...props }) {
|
|
70
|
+
return /* @__PURE__ */ jsx(
|
|
71
|
+
"div",
|
|
72
|
+
{
|
|
73
|
+
"data-slot": "table-container",
|
|
74
|
+
className: "relative w-full overflow-x-auto",
|
|
75
|
+
children: /* @__PURE__ */ jsx(
|
|
76
|
+
"table",
|
|
77
|
+
{
|
|
78
|
+
"data-slot": "table",
|
|
79
|
+
className: cn("w-full caption-bottom text-xs", className),
|
|
80
|
+
...props
|
|
81
|
+
}
|
|
82
|
+
)
|
|
83
|
+
}
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
function TableHeader({ className, ...props }) {
|
|
87
|
+
return /* @__PURE__ */ jsx(
|
|
88
|
+
"thead",
|
|
89
|
+
{
|
|
90
|
+
"data-slot": "table-header",
|
|
91
|
+
className: cn("[&_tr]:border-b", className),
|
|
92
|
+
...props
|
|
93
|
+
}
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
function TableBody({ className, ...props }) {
|
|
97
|
+
return /* @__PURE__ */ jsx(
|
|
98
|
+
"tbody",
|
|
99
|
+
{
|
|
100
|
+
"data-slot": "table-body",
|
|
101
|
+
className: cn("[&_tr:last-child]:border-0", className),
|
|
102
|
+
...props
|
|
103
|
+
}
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
function TableFooter({ className, ...props }) {
|
|
107
|
+
return /* @__PURE__ */ jsx(
|
|
108
|
+
"tfoot",
|
|
109
|
+
{
|
|
110
|
+
"data-slot": "table-footer",
|
|
111
|
+
className: cn(
|
|
112
|
+
"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",
|
|
113
|
+
className
|
|
114
|
+
),
|
|
115
|
+
...props
|
|
116
|
+
}
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
function TableRow({ className, ...props }) {
|
|
120
|
+
return /* @__PURE__ */ jsx(
|
|
121
|
+
"tr",
|
|
122
|
+
{
|
|
123
|
+
"data-slot": "table-row",
|
|
124
|
+
className: cn(
|
|
125
|
+
"border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted",
|
|
126
|
+
className
|
|
127
|
+
),
|
|
128
|
+
...props
|
|
129
|
+
}
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
function TableHead({ className, ...props }) {
|
|
133
|
+
return /* @__PURE__ */ jsx(
|
|
134
|
+
"th",
|
|
135
|
+
{
|
|
136
|
+
"data-slot": "table-head",
|
|
137
|
+
className: cn(
|
|
138
|
+
"h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0",
|
|
139
|
+
className
|
|
140
|
+
),
|
|
141
|
+
...props
|
|
142
|
+
}
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
function TableCell({ className, ...props }) {
|
|
146
|
+
return /* @__PURE__ */ jsx(
|
|
147
|
+
"td",
|
|
148
|
+
{
|
|
149
|
+
"data-slot": "table-cell",
|
|
150
|
+
className: cn(
|
|
151
|
+
"p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0",
|
|
152
|
+
className
|
|
153
|
+
),
|
|
154
|
+
...props
|
|
155
|
+
}
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
function TableCaption({
|
|
159
|
+
className,
|
|
160
|
+
...props
|
|
161
|
+
}) {
|
|
162
|
+
return /* @__PURE__ */ jsx(
|
|
163
|
+
"caption",
|
|
164
|
+
{
|
|
165
|
+
"data-slot": "table-caption",
|
|
166
|
+
className: cn("mt-4 text-xs text-muted-foreground", className),
|
|
167
|
+
...props
|
|
168
|
+
}
|
|
169
|
+
);
|
|
170
|
+
}
|
|
69
171
|
|
|
70
|
-
export { NativeSelect, NativeSelectOptGroup, NativeSelectOption };
|
|
71
|
-
//# sourceMappingURL=chunk-
|
|
72
|
-
//# sourceMappingURL=chunk-
|
|
172
|
+
export { NativeSelect, NativeSelectOptGroup, NativeSelectOption, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow };
|
|
173
|
+
//# sourceMappingURL=chunk-AM6UJ666.js.map
|
|
174
|
+
//# sourceMappingURL=chunk-AM6UJ666.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/primitives/native-select.tsx","../src/ui/primitives/table.tsx"],"names":["jsx"],"mappings":"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","file":"chunk-AM6UJ666.js","sourcesContent":["import * as React from \"react\"\nimport { ChevronDownIcon } from \"lucide-react\"\n\nimport { cn } from \"~/utils/cn.js\"\n\ntype NativeSelectProps = Omit<React.ComponentProps<\"select\">, \"size\"> & {\n size?: \"sm\" | \"default\"\n}\n\nfunction NativeSelect({\n className,\n size = \"default\",\n ...props\n}: NativeSelectProps) {\n return (\n <div\n className={cn(\n // w-full, like Input and Textarea. This wrapper shipped `w-fit`, which made\n // NativeSelect the only control in the kit that shrank to its content - so a form\n // field sat narrow beside full-width inputs and every caller had to remember to pass\n // `w-full` back. Twelve of twenty-one call sites in one app did; four forms did not,\n // and looked broken. A default that most callers override is the wrong default.\n //\n // A caller that WANTS a compact select - a filter above a table - passes `w-fit` or a\n // fixed width, which is the case that should carry the extra word.\n \"group/native-select relative w-full has-[select:disabled]:opacity-50\",\n className\n )}\n data-slot=\"native-select-wrapper\"\n data-size={size}\n >\n <select\n data-slot=\"native-select\"\n data-size={size}\n className=\"h-8 w-full min-w-0 appearance-none rounded-none border border-input bg-transparent py-1 pr-8 pl-2.5 text-xs transition-colors outline-none select-none selection:bg-primary selection:text-primary-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed aria-invalid:border-destructive aria-invalid:ring-1 aria-invalid:ring-destructive/20 data-[size=sm]:h-7 data-[size=sm]:rounded-none data-[size=sm]:py-0.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\"\n {...props}\n />\n <ChevronDownIcon className=\"pointer-events-none absolute top-1/2 right-2.5 size-4 -translate-y-1/2 text-muted-foreground select-none\" aria-hidden=\"true\" data-slot=\"native-select-icon\" />\n </div>\n )\n}\n\nfunction NativeSelectOption({\n className,\n ...props\n}: React.ComponentProps<\"option\">) {\n return (\n <option\n data-slot=\"native-select-option\"\n className={cn(\"bg-[Canvas] text-[CanvasText]\", className)}\n {...props}\n />\n )\n}\n\nfunction NativeSelectOptGroup({\n className,\n ...props\n}: React.ComponentProps<\"optgroup\">) {\n return (\n <optgroup\n data-slot=\"native-select-optgroup\"\n className={cn(\"bg-[Canvas] text-[CanvasText]\", className)}\n {...props}\n />\n )\n}\n\nexport { NativeSelect, NativeSelectOptGroup, NativeSelectOption }\n","import * as React from \"react\"\n\nimport { cn } from \"~/utils/cn.js\"\n\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n return (\n <div\n data-slot=\"table-container\"\n className=\"relative w-full overflow-x-auto\"\n >\n <table\n data-slot=\"table\"\n className={cn(\"w-full caption-bottom text-xs\", className)}\n {...props}\n />\n </div>\n )\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return (\n <thead\n data-slot=\"table-header\"\n className={cn(\"[&_tr]:border-b\", className)}\n {...props}\n />\n )\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn(\n \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\n \"border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\n \"h-10 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n \"p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCaption({\n className,\n ...props\n}: React.ComponentProps<\"caption\">) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn(\"mt-4 text-xs text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n"]}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { useCallback, useSyncExternalStore, useEffect } from 'react';
|
|
3
|
+
|
|
4
|
+
// src/hooks/use-mobile.ts
|
|
5
|
+
var DEFAULT_BREAKPOINT_PX = 768;
|
|
6
|
+
function useMobile(breakpointPx = DEFAULT_BREAKPOINT_PX) {
|
|
7
|
+
const [isMobile, setIsMobile] = React.useState(false);
|
|
8
|
+
React.useEffect(() => {
|
|
9
|
+
if (typeof window === "undefined" || !window.matchMedia) return;
|
|
10
|
+
const mql = window.matchMedia(`(max-width: ${breakpointPx - 1}px)`);
|
|
11
|
+
const onChange = () => setIsMobile(mql.matches);
|
|
12
|
+
onChange();
|
|
13
|
+
mql.addEventListener("change", onChange);
|
|
14
|
+
return () => mql.removeEventListener("change", onChange);
|
|
15
|
+
}, [breakpointPx]);
|
|
16
|
+
return isMobile;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// src/hooks/plate.ts
|
|
20
|
+
var PLATES = [
|
|
21
|
+
"pink",
|
|
22
|
+
"rose",
|
|
23
|
+
"crimson",
|
|
24
|
+
"rust",
|
|
25
|
+
"orange",
|
|
26
|
+
"ochre",
|
|
27
|
+
"amber",
|
|
28
|
+
"honey",
|
|
29
|
+
"gold",
|
|
30
|
+
"olive",
|
|
31
|
+
"lime",
|
|
32
|
+
"green",
|
|
33
|
+
"teal",
|
|
34
|
+
"cyan",
|
|
35
|
+
"azure",
|
|
36
|
+
"blue",
|
|
37
|
+
"indigo",
|
|
38
|
+
"violet",
|
|
39
|
+
"magenta"
|
|
40
|
+
];
|
|
41
|
+
var BEARING_PLATES = [
|
|
42
|
+
"pink",
|
|
43
|
+
"rust",
|
|
44
|
+
"amber",
|
|
45
|
+
"olive",
|
|
46
|
+
"green",
|
|
47
|
+
"teal",
|
|
48
|
+
"azure",
|
|
49
|
+
"blue",
|
|
50
|
+
"violet"
|
|
51
|
+
];
|
|
52
|
+
function isPlate(s) {
|
|
53
|
+
return PLATES.includes(s);
|
|
54
|
+
}
|
|
55
|
+
function derivePlate(id) {
|
|
56
|
+
let h = 2166136261;
|
|
57
|
+
for (let i = 0; i < id.length; i++) {
|
|
58
|
+
h ^= id.charCodeAt(i);
|
|
59
|
+
h = Math.imul(h, 16777619) >>> 0;
|
|
60
|
+
}
|
|
61
|
+
return BEARING_PLATES[h % BEARING_PLATES.length];
|
|
62
|
+
}
|
|
63
|
+
var PLATE_KEY = "lyra.plate";
|
|
64
|
+
var COMPACT_KEY = "lyra.compact";
|
|
65
|
+
var listeners = /* @__PURE__ */ new Map();
|
|
66
|
+
function read(key) {
|
|
67
|
+
try {
|
|
68
|
+
return localStorage.getItem(key);
|
|
69
|
+
} catch {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function useStoredSetting(key) {
|
|
74
|
+
const subscribe = useCallback(
|
|
75
|
+
(onChange) => {
|
|
76
|
+
const set = listeners.get(key) ?? /* @__PURE__ */ new Set();
|
|
77
|
+
listeners.set(key, set);
|
|
78
|
+
set.add(onChange);
|
|
79
|
+
const onStorage = (e) => {
|
|
80
|
+
if (e.key === key) onChange();
|
|
81
|
+
};
|
|
82
|
+
window.addEventListener("storage", onStorage);
|
|
83
|
+
return () => {
|
|
84
|
+
set.delete(onChange);
|
|
85
|
+
window.removeEventListener("storage", onStorage);
|
|
86
|
+
};
|
|
87
|
+
},
|
|
88
|
+
[key]
|
|
89
|
+
);
|
|
90
|
+
const value = useSyncExternalStore(
|
|
91
|
+
subscribe,
|
|
92
|
+
() => read(key),
|
|
93
|
+
() => null
|
|
94
|
+
);
|
|
95
|
+
const store = useCallback((next) => {
|
|
96
|
+
try {
|
|
97
|
+
if (next === null) localStorage.removeItem(key);
|
|
98
|
+
else localStorage.setItem(key, next);
|
|
99
|
+
} catch {
|
|
100
|
+
}
|
|
101
|
+
listeners.get(key)?.forEach((l) => l());
|
|
102
|
+
}, [key]);
|
|
103
|
+
return [value, store];
|
|
104
|
+
}
|
|
105
|
+
function useRootAttribute(name, value) {
|
|
106
|
+
useEffect(() => {
|
|
107
|
+
const root = document.documentElement;
|
|
108
|
+
if (value === null) root.removeAttribute(name);
|
|
109
|
+
else root.setAttribute(name, value);
|
|
110
|
+
}, [name, value]);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export { BEARING_PLATES, COMPACT_KEY, PLATES, PLATE_KEY, derivePlate, isPlate, useMobile, useRootAttribute, useStoredSetting };
|
|
114
|
+
//# sourceMappingURL=chunk-D7DMRCDY.js.map
|
|
115
|
+
//# sourceMappingURL=chunk-D7DMRCDY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-mobile.ts","../src/hooks/plate.ts","../src/hooks/device-setting.ts"],"names":["useEffect"],"mappings":";;;;AAIA,IAAM,qBAAA,GAAwB,GAAA;AAQvB,SAAS,SAAA,CAAU,eAAuB,qBAAA,EAAgC;AAC/E,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAU,eAAS,KAAK,CAAA;AAEpD,EAAM,gBAAU,MAAM;AACpB,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,UAAA,EAAY;AACzD,IAAA,MAAM,MAAM,MAAA,CAAO,UAAA,CAAW,CAAA,YAAA,EAAe,YAAA,GAAe,CAAC,CAAA,GAAA,CAAK,CAAA;AAClE,IAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AAC9C,IAAA,QAAA,EAAS;AACT,IAAA,GAAA,CAAI,gBAAA,CAAiB,UAAU,QAAQ,CAAA;AACvC,IAAA,OAAO,MAAM,GAAA,CAAI,mBAAA,CAAoB,QAAA,EAAU,QAAQ,CAAA;AAAA,EACzD,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,OAAO,QAAA;AACT;;;ACfO,IAAM,MAAA,GAAS;AAAA,EACpB,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF;AAYO,IAAM,cAAA,GAAiB;AAAA,EAC5B,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF;AAIO,SAAS,QAAQ,CAAA,EAAuB;AAC7C,EAAA,OAAQ,MAAA,CAA6B,SAAS,CAAC,CAAA;AACjD;AAcO,SAAS,YAAY,EAAA,EAA0B;AACpD,EAAA,IAAI,CAAA,GAAI,UAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,QAAQ,CAAA,EAAA,EAAK;AAClC,IAAA,CAAA,IAAK,EAAA,CAAG,WAAW,CAAC,CAAA;AACpB,IAAA,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAA,EAAG,QAAU,CAAA,KAAM,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,cAAA,CAAe,CAAA,GAAI,cAAA,CAAe,MAAM,CAAA;AACjD;AC/DO,IAAM,SAAA,GAAY;AAClB,IAAM,WAAA,GAAc;AAE3B,IAAM,SAAA,uBAAgB,GAAA,EAA6B;AAEnD,SAAS,KAAK,GAAA,EAA4B;AACxC,EAAA,IAAI;AACF,IAAA,OAAO,YAAA,CAAa,QAAQ,GAAG,CAAA;AAAA,EACjC,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAaO,SAAS,iBAAiB,GAAA,EAA8D;AAC7F,EAAA,MAAM,SAAA,GAAY,WAAA;AAAA,IAChB,CAAC,QAAA,KAAyB;AACxB,MAAA,MAAM,MAAM,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,wBAAS,GAAA,EAAgB;AACtD,MAAA,SAAA,CAAU,GAAA,CAAI,KAAK,GAAG,CAAA;AACtB,MAAA,GAAA,CAAI,IAAI,QAAQ,CAAA;AAChB,MAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAoB;AACrC,QAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,GAAA,EAAK,QAAA,EAAS;AAAA,MAC9B,CAAA;AACA,MAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC5C,MAAA,OAAO,MAAM;AACX,QAAA,GAAA,CAAI,OAAO,QAAQ,CAAA;AACnB,QAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAAA,MACjD,CAAA;AAAA,IACF,CAAA;AAAA,IACA,CAAC,GAAG;AAAA,GACN;AAEA,EAAA,MAAM,KAAA,GAAQ,oBAAA;AAAA,IACZ,SAAA;AAAA,IACA,MAAM,KAAK,GAAG,CAAA;AAAA,IACd,MAAM;AAAA,GACR;AAEA,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,CAAC,IAAA,KAAwB;AACjD,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,KAAS,IAAA,EAAM,YAAA,CAAa,UAAA,CAAW,GAAG,CAAA;AAAA,WACzC,YAAA,CAAa,OAAA,CAAQ,GAAA,EAAK,IAAI,CAAA;AAAA,IACrC,CAAA,CAAA,MAAQ;AAAA,IAKR;AACA,IAAA,SAAA,CAAU,IAAI,GAAG,CAAA,EAAG,OAAA,CAAQ,CAAA,CAAA,KAAK,GAAG,CAAA;AAAA,EACtC,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,EAAA,OAAO,CAAC,OAAO,KAAK,CAAA;AACtB;AAUO,SAAS,gBAAA,CAAiB,MAAc,KAAA,EAAsB;AACnE,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,OAAO,QAAA,CAAS,eAAA;AACtB,IAAA,IAAI,KAAA,KAAU,IAAA,EAAM,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AAAA,SACxC,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,KAAK,CAAA;AAAA,EACpC,CAAA,EAAG,CAAC,IAAA,EAAM,KAAK,CAAC,CAAA;AAClB","file":"chunk-D7DMRCDY.js","sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\n\nconst DEFAULT_BREAKPOINT_PX = 768\n\n/**\n * Returns `true` when viewport width is below the given mobile breakpoint.\n *\n * SSR-safe: returns `false` on the server / initial render, then updates after\n * mount. Listens to `matchMedia` change events for live updates.\n */\nexport function useMobile(breakpointPx: number = DEFAULT_BREAKPOINT_PX): boolean {\n const [isMobile, setIsMobile] = React.useState(false)\n\n React.useEffect(() => {\n if (typeof window === \"undefined\" || !window.matchMedia) return\n const mql = window.matchMedia(`(max-width: ${breakpointPx - 1}px)`)\n const onChange = () => setIsMobile(mql.matches)\n onChange()\n mql.addEventListener(\"change\", onChange)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [breakpointPx])\n\n return isMobile\n}\n","/**\n * Plates: the palette a reader picks, applied by putting `data-plate` on any element.\n *\n * This module holds NAMES and nothing else. The colours live once, in `styles/globals.css`, and a\n * swatch reads them the same way the rest of the UI does - by sitting inside a `data-plate` scope\n * and using `bg-primary`. Copying the values here would be the second table that drifts.\n *\n * Absent `data-plate`, `--primary` is lyra's neutral. That is the default every app ships with, so\n * adopting plates costs an app nothing until a reader chooses.\n */\nexport const PLATES = [\n \"pink\",\n \"rose\",\n \"crimson\",\n \"rust\",\n \"orange\",\n \"ochre\",\n \"amber\",\n \"honey\",\n \"gold\",\n \"olive\",\n \"lime\",\n \"green\",\n \"teal\",\n \"cyan\",\n \"azure\",\n \"blue\",\n \"indigo\",\n \"violet\",\n \"magenta\",\n] as const\n\nexport type Plate = (typeof PLATES)[number]\n\n/**\n * The plates certified to be told apart from each other, not merely from the status tokens.\n *\n * Only these may carry MEANING. The distinction is not decorative: a plate a reader picks for\n * pleasure needs no relation to anyone else's, but a plate that says \"which space you are typing\n * into\" stops working the moment two of them look alike - so that use gets the subset measured at\n * dE76 >= 29.7 pairwise, in both themes.\n */\nexport const BEARING_PLATES = [\n \"pink\",\n \"rust\",\n \"amber\",\n \"olive\",\n \"green\",\n \"teal\",\n \"azure\",\n \"blue\",\n \"violet\",\n] as const\n\nexport type BearingPlate = (typeof BEARING_PLATES)[number]\n\nexport function isPlate(s: string): s is Plate {\n return (PLATES as readonly string[]).includes(s)\n}\n\n/**\n * The plate for an id, from the certified subset.\n *\n * Derived, never chosen, and that is the point when the colour is a fence rather than a preference:\n * if two organisations could both pick blue the signal stops working for both of them. Deriving on\n * the CLIENT is deliberate too - the alternative is every server that shows a coloured surface\n * keeping its own copy of the name list, which is the shape chat ended up in (a Go slice, a CSS\n * block and a TS union, with nothing holding them together).\n *\n * FNV-1a rather than a cryptographic hash: this picks a colour, so spreading matters and secrecy\n * does not, and it stays synchronous - SubtleCrypto would make every call site async for nothing.\n */\nexport function derivePlate(id: string): BearingPlate {\n let h = 0x811c9dc5\n for (let i = 0; i < id.length; i++) {\n h ^= id.charCodeAt(i)\n h = Math.imul(h, 0x01000193) >>> 0\n }\n return BEARING_PLATES[h % BEARING_PLATES.length]!\n}\n","\"use client\"\n\nimport { useCallback, useEffect, useSyncExternalStore } from \"react\"\n\n/**\n * Preferences that belong to the DEVICE, not the account.\n *\n * Same granularity as the theme, and stored the same way, so a reader who has learned what \"dark\n * mode here but not on my laptop\" means already knows what a plate does. The account-wide version\n * would need a session, which a scorix shell does not have.\n *\n * ABSENT MEANS DEFAULT, in the store as well as in the markup. Turning a preference off removes its\n * key instead of writing \"off\", so there is one representation of \"no plate\" rather than two - the\n * stylesheet already says so (no `data-plate` resolves to lyra's neutral), and a store that\n * disagreed would make `null` and `\"\"` behave differently for no reason a caller could see.\n */\nexport const PLATE_KEY = \"lyra.plate\"\nexport const COMPACT_KEY = \"lyra.compact\"\n\nconst listeners = new Map<string, Set<() => void>>()\n\nfunction read(key: string): string | null {\n try {\n return localStorage.getItem(key)\n } catch {\n // Private windows and blocked site data throw on access rather than returning null.\n return null\n }\n}\n\n/**\n * Reads go through `useSyncExternalStore`, not `useState` plus an effect.\n *\n * localStorage is an external store in the precise sense React means: another tab can change it\n * underneath us. The `storage` event covers that, but it does NOT fire in the tab that wrote, so a\n * same-tab write needs its own notification or the picker would show the old swatch until something\n * else re-rendered it. One subscribe carries both paths.\n *\n * The server snapshot is `null` so SSR renders the default and the inline script (see\n * `preference-script.tsx`) is what paints the stored value.\n */\nexport function useStoredSetting(key: string): [string | null, (value: string | null) => void] {\n const subscribe = useCallback(\n (onChange: () => void) => {\n const set = listeners.get(key) ?? new Set<() => void>()\n listeners.set(key, set)\n set.add(onChange)\n const onStorage = (e: StorageEvent) => {\n if (e.key === key) onChange()\n }\n window.addEventListener(\"storage\", onStorage)\n return () => {\n set.delete(onChange)\n window.removeEventListener(\"storage\", onStorage)\n }\n },\n [key],\n )\n\n const value = useSyncExternalStore(\n subscribe,\n () => read(key),\n () => null,\n )\n\n const store = useCallback((next: string | null) => {\n try {\n if (next === null) localStorage.removeItem(key)\n else localStorage.setItem(key, next)\n } catch {\n // A refused write means the choice does not take effect at all, not merely that it fails to\n // survive a reload: the next read returns the old value and the swatch snaps back. Measured,\n // not assumed. It is left that way because the theme does exactly the same under the same\n // condition, and a session-only copy here would make the plate outlive a theme set beside it.\n }\n listeners.get(key)?.forEach(l => l())\n }, [key])\n\n return [value, store]\n}\n\n/**\n * Applied to `<html>`, never to a wrapper element.\n *\n * A Radix portal mounts as a child of `body`, so it inherits custom properties from `body` and from\n * `html` but from no div in between. A plate scoped to an app frame therefore leaves every dialog,\n * popover and toast on the neutral default while the page behind them is tinted. chat does exactly\n * that with its space accent.\n */\nexport function useRootAttribute(name: string, value: string | null) {\n useEffect(() => {\n const root = document.documentElement\n if (value === null) root.removeAttribute(name)\n else root.setAttribute(name, value)\n }, [name, value])\n}\n"]}
|
|
@@ -1,12 +1,148 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { InputGroup, InputGroupAddon } from './chunk-VXW3K5O5.js';
|
|
2
|
+
import { Button } from './chunk-VGOGWZCF.js';
|
|
3
3
|
import { cn } from './chunk-XH55BHUU.js';
|
|
4
4
|
import 'react';
|
|
5
|
-
import {
|
|
6
|
-
import { SearchIcon, CheckIcon } from 'lucide-react';
|
|
5
|
+
import { Dialog as Dialog$1, Popover as Popover$1 } from 'radix-ui';
|
|
6
|
+
import { XIcon, SearchIcon, CheckIcon } from 'lucide-react';
|
|
7
7
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
8
|
-
import {
|
|
8
|
+
import { Command as Command$1 } from 'cmdk';
|
|
9
9
|
|
|
10
|
+
function Dialog({
|
|
11
|
+
...props
|
|
12
|
+
}) {
|
|
13
|
+
return /* @__PURE__ */ jsx(Dialog$1.Root, { "data-slot": "dialog", ...props });
|
|
14
|
+
}
|
|
15
|
+
function DialogTrigger({
|
|
16
|
+
...props
|
|
17
|
+
}) {
|
|
18
|
+
return /* @__PURE__ */ jsx(Dialog$1.Trigger, { "data-slot": "dialog-trigger", ...props });
|
|
19
|
+
}
|
|
20
|
+
function DialogPortal({
|
|
21
|
+
...props
|
|
22
|
+
}) {
|
|
23
|
+
return /* @__PURE__ */ jsx(Dialog$1.Portal, { "data-slot": "dialog-portal", ...props });
|
|
24
|
+
}
|
|
25
|
+
function DialogClose({
|
|
26
|
+
...props
|
|
27
|
+
}) {
|
|
28
|
+
return /* @__PURE__ */ jsx(Dialog$1.Close, { "data-slot": "dialog-close", ...props });
|
|
29
|
+
}
|
|
30
|
+
function DialogOverlay({
|
|
31
|
+
className,
|
|
32
|
+
...props
|
|
33
|
+
}) {
|
|
34
|
+
return /* @__PURE__ */ jsx(
|
|
35
|
+
Dialog$1.Overlay,
|
|
36
|
+
{
|
|
37
|
+
"data-slot": "dialog-overlay",
|
|
38
|
+
className: cn(
|
|
39
|
+
"fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",
|
|
40
|
+
className
|
|
41
|
+
),
|
|
42
|
+
...props
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
function DialogContent({
|
|
47
|
+
className,
|
|
48
|
+
children,
|
|
49
|
+
showCloseButton = true,
|
|
50
|
+
...props
|
|
51
|
+
}) {
|
|
52
|
+
return /* @__PURE__ */ jsxs(DialogPortal, { children: [
|
|
53
|
+
/* @__PURE__ */ jsx(DialogOverlay, {}),
|
|
54
|
+
/* @__PURE__ */ jsxs(
|
|
55
|
+
Dialog$1.Content,
|
|
56
|
+
{
|
|
57
|
+
"data-slot": "dialog-content",
|
|
58
|
+
className: cn(
|
|
59
|
+
"fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-none bg-popover p-4 text-xs/relaxed text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
|
|
60
|
+
className
|
|
61
|
+
),
|
|
62
|
+
...props,
|
|
63
|
+
children: [
|
|
64
|
+
children,
|
|
65
|
+
showCloseButton && /* @__PURE__ */ jsx(Dialog$1.Close, { "data-slot": "dialog-close", asChild: true, children: /* @__PURE__ */ jsxs(
|
|
66
|
+
Button,
|
|
67
|
+
{
|
|
68
|
+
variant: "ghost",
|
|
69
|
+
className: "absolute top-2 right-2",
|
|
70
|
+
size: "icon-sm",
|
|
71
|
+
children: [
|
|
72
|
+
/* @__PURE__ */ jsx(
|
|
73
|
+
XIcon,
|
|
74
|
+
{}
|
|
75
|
+
),
|
|
76
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
|
|
77
|
+
]
|
|
78
|
+
}
|
|
79
|
+
) })
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
)
|
|
83
|
+
] });
|
|
84
|
+
}
|
|
85
|
+
function DialogHeader({ className, ...props }) {
|
|
86
|
+
return /* @__PURE__ */ jsx(
|
|
87
|
+
"div",
|
|
88
|
+
{
|
|
89
|
+
"data-slot": "dialog-header",
|
|
90
|
+
className: cn("flex flex-col gap-1 text-left", className),
|
|
91
|
+
...props
|
|
92
|
+
}
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
function DialogFooter({
|
|
96
|
+
className,
|
|
97
|
+
showCloseButton = false,
|
|
98
|
+
children,
|
|
99
|
+
...props
|
|
100
|
+
}) {
|
|
101
|
+
return /* @__PURE__ */ jsxs(
|
|
102
|
+
"div",
|
|
103
|
+
{
|
|
104
|
+
"data-slot": "dialog-footer",
|
|
105
|
+
className: cn(
|
|
106
|
+
"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",
|
|
107
|
+
className
|
|
108
|
+
),
|
|
109
|
+
...props,
|
|
110
|
+
children: [
|
|
111
|
+
children,
|
|
112
|
+
showCloseButton && /* @__PURE__ */ jsx(Dialog$1.Close, { asChild: true, children: /* @__PURE__ */ jsx(Button, { variant: "outline", children: "Close" }) })
|
|
113
|
+
]
|
|
114
|
+
}
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
function DialogTitle({
|
|
118
|
+
className,
|
|
119
|
+
...props
|
|
120
|
+
}) {
|
|
121
|
+
return /* @__PURE__ */ jsx(
|
|
122
|
+
Dialog$1.Title,
|
|
123
|
+
{
|
|
124
|
+
"data-slot": "dialog-title",
|
|
125
|
+
className: cn("font-heading text-sm font-medium", className),
|
|
126
|
+
...props
|
|
127
|
+
}
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
function DialogDescription({
|
|
131
|
+
className,
|
|
132
|
+
...props
|
|
133
|
+
}) {
|
|
134
|
+
return /* @__PURE__ */ jsx(
|
|
135
|
+
Dialog$1.Description,
|
|
136
|
+
{
|
|
137
|
+
"data-slot": "dialog-description",
|
|
138
|
+
className: cn(
|
|
139
|
+
"text-xs/relaxed text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",
|
|
140
|
+
className
|
|
141
|
+
),
|
|
142
|
+
...props
|
|
143
|
+
}
|
|
144
|
+
);
|
|
145
|
+
}
|
|
10
146
|
function Command({
|
|
11
147
|
className,
|
|
12
148
|
...props
|
|
@@ -232,6 +368,6 @@ function PopoverDescription({
|
|
|
232
368
|
);
|
|
233
369
|
}
|
|
234
370
|
|
|
235
|
-
export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, Popover, PopoverAnchor, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger };
|
|
236
|
-
//# sourceMappingURL=chunk-
|
|
237
|
-
//# sourceMappingURL=chunk-
|
|
371
|
+
export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Popover, PopoverAnchor, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger };
|
|
372
|
+
//# sourceMappingURL=chunk-L4LQCVOF.js.map
|
|
373
|
+
//# sourceMappingURL=chunk-L4LQCVOF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/primitives/dialog.tsx","../src/ui/primitives/command.tsx","../src/ui/primitives/popover.tsx"],"names":["DialogPrimitive","jsx","CommandPrimitive","jsxs","PopoverPrimitive"],"mappings":"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","file":"chunk-L4LQCVOF.js","sourcesContent":["import * as React from \"react\"\nimport { Dialog as DialogPrimitive } from \"radix-ui\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"~/utils/cn.js\"\nimport { Button } from \"./button.js\"\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 \"fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-none bg-popover p-4 text-xs/relaxed text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close data-slot=\"dialog-close\" asChild>\n <Button\n variant=\"ghost\"\n className=\"absolute top-2 right-2\"\n size=\"icon-sm\"\n >\n <XIcon\n />\n <span className=\"sr-only\">Close</span>\n </Button>\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(\"flex flex-col gap-1 text-left\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({\n className,\n showCloseButton = false,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showCloseButton?: boolean\n}) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close asChild>\n <Button variant=\"outline\">Close</Button>\n </DialogPrimitive.Close>\n )}\n </div>\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(\"font-heading text-sm font-medium\", className)}\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-xs/relaxed text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-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 React from \"react\"\nimport { Command as CommandPrimitive } from \"cmdk\"\nimport { SearchIcon, CheckIcon } from \"lucide-react\"\n\nimport { cn } from \"~/utils/cn.js\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from \"./dialog.js\"\nimport {\n InputGroup,\n InputGroupAddon,\n} from \"./input-group.js\"\n\nfunction Command({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n data-slot=\"command\"\n className={cn(\n \"flex size-full flex-col overflow-hidden rounded-none bg-popover text-popover-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandDialog({\n title = \"Command Palette\",\n description = \"Search for a command to run...\",\n children,\n className,\n showCloseButton = false,\n ...props\n}: React.ComponentProps<typeof Dialog> & {\n title?: string\n description?: string\n className?: string\n showCloseButton?: boolean\n}) {\n return (\n <Dialog {...props}>\n <DialogHeader className=\"sr-only\">\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogContent\n className={cn(\n \"top-1/3 translate-y-0 overflow-hidden rounded-none p-0\",\n className\n )}\n showCloseButton={showCloseButton}\n >\n {children}\n </DialogContent>\n </Dialog>\n )\n}\n\nfunction CommandInput({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div data-slot=\"command-input-wrapper\" className=\"border-b pb-0\">\n <InputGroup className=\"h-8 border-none border-input/30 bg-input/30 shadow-none! *:data-[slot=input-group-addon]:pl-2!\">\n <CommandPrimitive.Input\n data-slot=\"command-input\"\n className={cn(\n \"w-full text-xs outline-hidden disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n />\n <InputGroupAddon>\n <SearchIcon className=\"size-4 shrink-0 opacity-50\" />\n </InputGroupAddon>\n </InputGroup>\n </div>\n )\n}\n\nfunction CommandList({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n data-slot=\"command-list\"\n className={cn(\n \"no-scrollbar max-h-72 scroll-py-0 overflow-x-hidden overflow-y-auto outline-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandEmpty({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return (\n <CommandPrimitive.Empty\n data-slot=\"command-empty\"\n className={cn(\"py-6 text-center text-xs\", className)}\n {...props}\n />\n )\n}\n\nfunction CommandGroup({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n \"overflow-hidden text-foreground **:[[cmdk-group-heading]]:px-2 **:[[cmdk-group-heading]]:py-1.5 **:[[cmdk-group-heading]]:text-xs **:[[cmdk-group-heading]]:text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n data-slot=\"command-separator\"\n className={cn(\"-mx-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction CommandItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n className={cn(\n \"group/command-item relative flex cursor-default items-center gap-2 rounded-none px-2 py-2 text-xs outline-hidden select-none in-data-[slot=dialog-content]:rounded-none! data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-selected:bg-muted data-selected:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-selected:*:[svg]:text-foreground\",\n className\n )}\n {...props}\n >\n {children}\n <CheckIcon className=\"ml-auto opacity-0 group-has-data-[slot=command-shortcut]/command-item:hidden group-data-[checked=true]/command-item:opacity-100\" />\n </CommandPrimitive.Item>\n )\n}\n\nfunction CommandShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"command-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground group-data-selected/command-item:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n}\n","import * as React from \"react\"\nimport { Popover as PopoverPrimitive } from \"radix-ui\"\n\nimport { cn } from \"~/utils/cn.js\"\n\nfunction Popover({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />\n}\n\nfunction PopoverTrigger({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />\n}\n\nfunction PopoverContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 flex w-72 origin-(--radix-popover-content-transform-origin) flex-col gap-2.5 rounded-none bg-popover p-2.5 text-xs text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n )\n}\n\nfunction PopoverAnchor({\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\n return <PopoverPrimitive.Anchor data-slot=\"popover-anchor\" {...props} />\n}\n\nfunction PopoverHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"popover-header\"\n className={cn(\"flex flex-col gap-1 text-xs\", className)}\n {...props}\n />\n )\n}\n\nfunction PopoverTitle({ className, ...props }: React.ComponentProps<\"h2\">) {\n return (\n <div\n data-slot=\"popover-title\"\n className={cn(\"text-sm font-medium\", className)}\n {...props}\n />\n )\n}\n\nfunction PopoverDescription({\n className,\n ...props\n}: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"popover-description\"\n className={cn(\"text-xs/relaxed text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Popover,\n PopoverAnchor,\n PopoverContent,\n PopoverDescription,\n PopoverHeader,\n PopoverTitle,\n PopoverTrigger,\n}\n"]}
|