@epoch32/visage 0.0.0-stage → 0.0.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/LICENSE +373 -0
- package/README.md +110 -2
- package/dist/bundle.dev.js +4875 -0
- package/dist/index.js +9633 -0
- package/dist/src/api/index.js +4002 -0
- package/dist/src/charts/index.js +2717 -0
- package/dist/src/devtools/index.js +4677 -0
- package/dist/src/dom/index.js +1550 -0
- package/dist/src/form/index.js +1415 -0
- package/dist/src/index.js +11826 -0
- package/dist/src/jsx-runtime/index.js +1630 -0
- package/dist/src/query/index.js +2422 -0
- package/dist/src/router/index.js +1856 -0
- package/dist/src/rpc/index.js +3484 -0
- package/dist/src/server/index.js +1173 -0
- package/dist/src/signals/index.js +1077 -0
- package/dist/src/style/index.js +2340 -0
- package/dist/src/template/index.js +1149 -0
- package/dist/src/ui/index.js +4155 -0
- package/dist/src/virtual/index.js +1955 -0
- package/dist/src/vite/index.js +984 -0
- package/dist/vite/index.js +707 -0
- package/package.json +140 -4
- package/src/api/client.ts +371 -0
- package/src/api/file-router.ts +183 -0
- package/src/api/handler.ts +326 -0
- package/src/api/index.ts +71 -0
- package/src/api/middleware.ts +54 -0
- package/src/api/pragma.ts +155 -0
- package/src/api/procedure.ts +172 -0
- package/src/api/types.ts +249 -0
- package/src/charts/Area.tsx +111 -0
- package/src/charts/Axis.tsx +126 -0
- package/src/charts/Bar.tsx +86 -0
- package/src/charts/CartesianGrid.tsx +72 -0
- package/src/charts/Chart.tsx +269 -0
- package/src/charts/Cursor.tsx +42 -0
- package/src/charts/Legend.tsx +56 -0
- package/src/charts/Line.tsx +106 -0
- package/src/charts/Pie.tsx +88 -0
- package/src/charts/Tooltip.tsx +127 -0
- package/src/charts/context.ts +30 -0
- package/src/charts/index.ts +14 -0
- package/src/charts/path.ts +155 -0
- package/src/charts/scale.ts +133 -0
- package/src/charts/types.ts +50 -0
- package/src/devtools/DomTab.tsx +134 -0
- package/src/devtools/GraphInspector.tsx +196 -0
- package/src/devtools/GraphTab.tsx +315 -0
- package/src/devtools/QueryTab.tsx +200 -0
- package/src/devtools/RpcTab.tsx +190 -0
- package/src/devtools/SignalsTab.tsx +129 -0
- package/src/devtools/component.tsx +243 -0
- package/src/devtools/highlighter.ts +134 -0
- package/src/devtools/hub.ts +175 -0
- package/src/devtools/index.ts +20 -0
- package/src/devtools/styles.ts +313 -0
- package/src/devtools/types.ts +45 -0
- package/src/dom/async.ts +232 -0
- package/src/dom/control-flow.ts +353 -0
- package/src/dom/index.ts +32 -0
- package/src/dom/lazy.ts +82 -0
- package/src/dom/render.ts +286 -0
- package/src/dom/resource.ts +120 -0
- package/src/form/form.ts +218 -0
- package/src/form/index.ts +17 -0
- package/src/form/schema.ts +299 -0
- package/src/index.ts +413 -0
- package/src/jsx-dev-runtime/index.ts +1 -0
- package/src/jsx-runtime/index.ts +112 -0
- package/src/jsx-runtime/jsx.d.ts +278 -0
- package/src/query/create-mutation.ts +64 -0
- package/src/query/create-query.ts +426 -0
- package/src/query/focus-manager.ts +68 -0
- package/src/query/index.ts +63 -0
- package/src/query/mutation-cache.ts +138 -0
- package/src/query/online-manager.ts +67 -0
- package/src/query/query-cache.ts +369 -0
- package/src/query/query-client.ts +248 -0
- package/src/query/types.ts +221 -0
- package/src/query/utils.ts +132 -0
- package/src/router/index.ts +19 -0
- package/src/router/router.tsx +352 -0
- package/src/rpc/client.ts +317 -0
- package/src/rpc/error.ts +70 -0
- package/src/rpc/index.ts +52 -0
- package/src/rpc/procedure.ts +88 -0
- package/src/rpc/router.ts +105 -0
- package/src/rpc/server.ts +511 -0
- package/src/rpc/types.ts +328 -0
- package/src/server/hydrate.ts +21 -0
- package/src/server/index.ts +10 -0
- package/src/server/render-to-stream.ts +31 -0
- package/src/server/render-to-string.ts +125 -0
- package/src/signals/computed.ts +217 -0
- package/src/signals/context.ts +89 -0
- package/src/signals/effect.ts +161 -0
- package/src/signals/index.ts +57 -0
- package/src/signals/scope.ts +132 -0
- package/src/signals/signal.ts +203 -0
- package/src/signals/store.ts +163 -0
- package/src/signals/system.ts +124 -0
- package/src/signals/types.ts +64 -0
- package/src/style/component.tsx +122 -0
- package/src/style/create-style.ts +229 -0
- package/src/style/cx.ts +75 -0
- package/src/style/hash.ts +19 -0
- package/src/style/index.ts +8 -0
- package/src/style/layout.tsx +406 -0
- package/src/style/manager.ts +87 -0
- package/src/style/parser.ts +257 -0
- package/src/style/scale.ts +237 -0
- package/src/template/index.ts +4 -0
- package/src/template/template.ts +126 -0
- package/src/ui/accordion.tsx +286 -0
- package/src/ui/command-dialog.tsx +49 -0
- package/src/ui/command.tsx +400 -0
- package/src/ui/data-table.tsx +322 -0
- package/src/ui/dialog.tsx +362 -0
- package/src/ui/dropdown-menu.tsx +381 -0
- package/src/ui/icon.tsx +69 -0
- package/src/ui/index.ts +138 -0
- package/src/ui/layout.tsx +13 -0
- package/src/ui/popover.tsx +249 -0
- package/src/ui/switch.tsx +114 -0
- package/src/ui/tabs.tsx +297 -0
- package/src/ui/toast.tsx +280 -0
- package/src/ui/tooltip.tsx +262 -0
- package/src/ui/utils.ts +110 -0
- package/src/virtual/index.ts +12 -0
- package/src/virtual/virtual-list.tsx +185 -0
- package/src/virtual/virtualizer.ts +274 -0
- package/src/vite/hmr.ts +38 -0
- package/src/vite/index.ts +3 -0
- package/src/vite/lucide.ts +124 -0
- package/src/vite/plugin.ts +102 -0
- package/src/vite/rpc-middleware.ts +82 -0
- package/src/vite/types.ts +65 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { Show } from "../dom/control-flow";
|
|
2
|
+
import type { Child } from "../dom/render";
|
|
3
|
+
import { createContext, useContext } from "../signals/context";
|
|
4
|
+
import { createControllableSignal, createId } from "./utils";
|
|
5
|
+
|
|
6
|
+
export interface AccordionContextValue {
|
|
7
|
+
isExpanded: (value: string) => boolean;
|
|
8
|
+
toggleItem: (value: string) => void;
|
|
9
|
+
type: "single" | "multiple";
|
|
10
|
+
collapsible: boolean;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const AccordionContext = createContext<AccordionContextValue | null>(null);
|
|
14
|
+
|
|
15
|
+
export function useAccordionContext(): AccordionContextValue | null {
|
|
16
|
+
return useContext(AccordionContext);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface AccordionItemData {
|
|
20
|
+
value: string;
|
|
21
|
+
trigger: Child | (() => Child);
|
|
22
|
+
content: Child | (() => Child);
|
|
23
|
+
disabled?: boolean | (() => boolean);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface AccordionBaseProps {
|
|
27
|
+
items?: AccordionItemData[];
|
|
28
|
+
itemClass?: any;
|
|
29
|
+
triggerClass?: any;
|
|
30
|
+
contentClass?: any;
|
|
31
|
+
as?: string;
|
|
32
|
+
class?: any;
|
|
33
|
+
style?: any;
|
|
34
|
+
children?: Child | (() => Child);
|
|
35
|
+
[key: string]: any;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface AccordionSingleProps extends AccordionBaseProps {
|
|
39
|
+
type: "single";
|
|
40
|
+
value?: () => string | undefined;
|
|
41
|
+
defaultValue?: string;
|
|
42
|
+
onValueChange?: (value: string) => void;
|
|
43
|
+
collapsible?: boolean;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface AccordionMultipleProps extends AccordionBaseProps {
|
|
47
|
+
type: "multiple";
|
|
48
|
+
value?: () => string[] | undefined;
|
|
49
|
+
defaultValue?: string[];
|
|
50
|
+
onValueChange?: (value: string[]) => void;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export type AccordionProps = AccordionSingleProps | AccordionMultipleProps;
|
|
54
|
+
|
|
55
|
+
export function AccordionRoot(props: AccordionProps): Child {
|
|
56
|
+
const isSingle = props.type === "single";
|
|
57
|
+
const collapsible = (props as AccordionSingleProps).collapsible ?? !isSingle;
|
|
58
|
+
|
|
59
|
+
const [singleValue, setSingleValue] = createControllableSignal<string>({
|
|
60
|
+
value: isSingle ? (props as AccordionSingleProps).value : undefined,
|
|
61
|
+
defaultValue: isSingle ? ((props as AccordionSingleProps).defaultValue ?? "") : "",
|
|
62
|
+
onChange: isSingle ? (props as AccordionSingleProps).onValueChange : undefined
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
const [multiValue, setMultiValue] = createControllableSignal<string[]>({
|
|
66
|
+
value: !isSingle ? (props as AccordionMultipleProps).value : undefined,
|
|
67
|
+
defaultValue: !isSingle ? ((props as AccordionMultipleProps).defaultValue ?? []) : [],
|
|
68
|
+
onChange: !isSingle ? (props as AccordionMultipleProps).onValueChange : undefined
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
const isExpanded = (val: string): boolean => {
|
|
72
|
+
if (isSingle) {
|
|
73
|
+
return singleValue() === val;
|
|
74
|
+
}
|
|
75
|
+
return multiValue().includes(val);
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
const toggleItem = (val: string) => {
|
|
79
|
+
if (isSingle) {
|
|
80
|
+
if (singleValue() === val) {
|
|
81
|
+
if (collapsible) {
|
|
82
|
+
setSingleValue("");
|
|
83
|
+
}
|
|
84
|
+
} else {
|
|
85
|
+
setSingleValue(val);
|
|
86
|
+
}
|
|
87
|
+
} else {
|
|
88
|
+
const current = multiValue();
|
|
89
|
+
if (current.includes(val)) {
|
|
90
|
+
setMultiValue(current.filter((item) => item !== val));
|
|
91
|
+
} else {
|
|
92
|
+
setMultiValue([...current, val]);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const ctx: AccordionContextValue = {
|
|
98
|
+
isExpanded,
|
|
99
|
+
toggleItem,
|
|
100
|
+
type: props.type,
|
|
101
|
+
collapsible
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const {
|
|
105
|
+
as: Tag = "div",
|
|
106
|
+
items,
|
|
107
|
+
itemClass,
|
|
108
|
+
triggerClass,
|
|
109
|
+
contentClass,
|
|
110
|
+
children,
|
|
111
|
+
class: className,
|
|
112
|
+
style,
|
|
113
|
+
...rest
|
|
114
|
+
} = props;
|
|
115
|
+
|
|
116
|
+
return AccordionContext.Provider({
|
|
117
|
+
value: ctx,
|
|
118
|
+
children: () => (
|
|
119
|
+
<Tag class={className} style={style} {...rest}>
|
|
120
|
+
{items
|
|
121
|
+
? items.map((item) => (
|
|
122
|
+
<AccordionItem value={item.value} disabled={item.disabled} class={itemClass}>
|
|
123
|
+
{() => (
|
|
124
|
+
<>
|
|
125
|
+
<AccordionTrigger class={triggerClass}>
|
|
126
|
+
{typeof item.trigger === "function" ? item.trigger() : item.trigger}
|
|
127
|
+
</AccordionTrigger>
|
|
128
|
+
<AccordionContent class={contentClass}>
|
|
129
|
+
{typeof item.content === "function" ? item.content() : item.content}
|
|
130
|
+
</AccordionContent>
|
|
131
|
+
</>
|
|
132
|
+
)}
|
|
133
|
+
</AccordionItem>
|
|
134
|
+
))
|
|
135
|
+
: null}
|
|
136
|
+
{typeof children === "function" ? children() : children}
|
|
137
|
+
</Tag>
|
|
138
|
+
)
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export interface AccordionItemContextValue {
|
|
143
|
+
value: string;
|
|
144
|
+
itemId: string;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export const AccordionItemContext = createContext<AccordionItemContextValue | null>(null);
|
|
148
|
+
|
|
149
|
+
export function useAccordionItemContext(): AccordionItemContextValue | null {
|
|
150
|
+
return useContext(AccordionItemContext);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export interface AccordionItemProps {
|
|
154
|
+
value: string;
|
|
155
|
+
disabled?: boolean | (() => boolean);
|
|
156
|
+
as?: string;
|
|
157
|
+
class?: any;
|
|
158
|
+
style?: any;
|
|
159
|
+
children: Child | (() => Child);
|
|
160
|
+
[key: string]: any;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export function AccordionItem(props: AccordionItemProps): Child {
|
|
164
|
+
const itemId = createId("accordion-item");
|
|
165
|
+
const ctx: AccordionItemContextValue = {
|
|
166
|
+
value: props.value,
|
|
167
|
+
itemId
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
const accordion = useContext(AccordionContext);
|
|
171
|
+
const isOpen = () => (accordion ? accordion.isExpanded(props.value) : false);
|
|
172
|
+
|
|
173
|
+
const { value, disabled, as: Tag = "div", children, class: className, style, ...rest } = props;
|
|
174
|
+
|
|
175
|
+
return AccordionItemContext.Provider({
|
|
176
|
+
value: ctx,
|
|
177
|
+
children: () => (
|
|
178
|
+
<Tag
|
|
179
|
+
data-state={() => (isOpen() ? "open" : "closed")}
|
|
180
|
+
data-disabled={disabled}
|
|
181
|
+
class={className}
|
|
182
|
+
style={style}
|
|
183
|
+
{...rest}
|
|
184
|
+
>
|
|
185
|
+
{typeof children === "function" ? children() : children}
|
|
186
|
+
</Tag>
|
|
187
|
+
)
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export interface AccordionTriggerProps {
|
|
192
|
+
as?: string;
|
|
193
|
+
class?: any;
|
|
194
|
+
style?: any;
|
|
195
|
+
onClick?: (e: MouseEvent) => void;
|
|
196
|
+
children: Child | (() => Child);
|
|
197
|
+
[key: string]: any;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export function AccordionTrigger(props: AccordionTriggerProps): Child {
|
|
201
|
+
const accordion = useContext(AccordionContext);
|
|
202
|
+
const item = useContext(AccordionItemContext);
|
|
203
|
+
const isOpen = () => (accordion && item ? accordion.isExpanded(item.value) : false);
|
|
204
|
+
|
|
205
|
+
const handleClick = (e: MouseEvent) => {
|
|
206
|
+
if (props.onClick) props.onClick(e);
|
|
207
|
+
if (!e.defaultPrevented && accordion && item) {
|
|
208
|
+
accordion.toggleItem(item.value);
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
const { as: Tag = "button", children, onClick, class: className, style, ...rest } = props;
|
|
213
|
+
|
|
214
|
+
return (
|
|
215
|
+
<Tag
|
|
216
|
+
id={item ? `${item.itemId}-trigger` : undefined}
|
|
217
|
+
type={Tag === "button" ? "button" : undefined}
|
|
218
|
+
aria-expanded={isOpen}
|
|
219
|
+
aria-controls={item ? `${item.itemId}-content` : undefined}
|
|
220
|
+
data-state={() => (isOpen() ? "open" : "closed")}
|
|
221
|
+
class={className}
|
|
222
|
+
style={style}
|
|
223
|
+
onClick={handleClick}
|
|
224
|
+
{...rest}
|
|
225
|
+
>
|
|
226
|
+
{children}
|
|
227
|
+
</Tag>
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export interface AccordionContentProps {
|
|
232
|
+
forceMount?: boolean;
|
|
233
|
+
as?: string;
|
|
234
|
+
class?: any;
|
|
235
|
+
style?: any;
|
|
236
|
+
children: Child | (() => Child);
|
|
237
|
+
[key: string]: any;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
export function AccordionContent(props: AccordionContentProps): Child {
|
|
241
|
+
const accordion = useContext(AccordionContext);
|
|
242
|
+
const item = useContext(AccordionItemContext);
|
|
243
|
+
const isOpen = () => (accordion && item ? accordion.isExpanded(item.value) : false);
|
|
244
|
+
|
|
245
|
+
const { forceMount, as: Tag = "div", children, class: className, style, ...rest } = props;
|
|
246
|
+
|
|
247
|
+
if (forceMount) {
|
|
248
|
+
return (
|
|
249
|
+
<Tag
|
|
250
|
+
id={item ? `${item.itemId}-content` : undefined}
|
|
251
|
+
role="region"
|
|
252
|
+
aria-labelledby={item ? `${item.itemId}-trigger` : undefined}
|
|
253
|
+
data-state={() => (isOpen() ? "open" : "closed")}
|
|
254
|
+
hidden={() => !isOpen()}
|
|
255
|
+
class={className}
|
|
256
|
+
style={style}
|
|
257
|
+
{...rest}
|
|
258
|
+
>
|
|
259
|
+
{children}
|
|
260
|
+
</Tag>
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
return (
|
|
265
|
+
<Show when={isOpen}>
|
|
266
|
+
<Tag
|
|
267
|
+
id={item ? `${item.itemId}-content` : undefined}
|
|
268
|
+
role="region"
|
|
269
|
+
aria-labelledby={item ? `${item.itemId}-trigger` : undefined}
|
|
270
|
+
data-state="open"
|
|
271
|
+
class={className}
|
|
272
|
+
style={style}
|
|
273
|
+
{...rest}
|
|
274
|
+
>
|
|
275
|
+
{children}
|
|
276
|
+
</Tag>
|
|
277
|
+
</Show>
|
|
278
|
+
);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
export const Accordion = Object.assign(AccordionRoot, {
|
|
282
|
+
Root: AccordionRoot,
|
|
283
|
+
Item: AccordionItem,
|
|
284
|
+
Trigger: AccordionTrigger,
|
|
285
|
+
Content: AccordionContent
|
|
286
|
+
});
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Portal } from "../dom/control-flow";
|
|
2
|
+
import type { Child } from "../dom/render";
|
|
3
|
+
import type { CommandProps } from "./command";
|
|
4
|
+
import { CommandRoot } from "./command";
|
|
5
|
+
import { createControllableSignal } from "./utils";
|
|
6
|
+
|
|
7
|
+
export interface CommandDialogProps extends CommandProps {
|
|
8
|
+
open?: () => boolean | undefined;
|
|
9
|
+
defaultOpen?: boolean;
|
|
10
|
+
onOpenChange?: (open: boolean) => void;
|
|
11
|
+
overlayClass?: any;
|
|
12
|
+
contentClass?: any;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function CommandDialog(props: CommandDialogProps): Child {
|
|
16
|
+
const [open, setOpen] = createControllableSignal<boolean>({
|
|
17
|
+
value: props.open,
|
|
18
|
+
defaultValue: props.defaultOpen ?? false,
|
|
19
|
+
onChange: props.onOpenChange
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
const { overlayClass, contentClass, style, ...rest } = props;
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<Portal>
|
|
26
|
+
<div
|
|
27
|
+
style={() => ({
|
|
28
|
+
display: open() ? "flex" : "none",
|
|
29
|
+
position: "fixed",
|
|
30
|
+
inset: 0,
|
|
31
|
+
background: "rgba(0, 0, 0, 0.6)",
|
|
32
|
+
backdropFilter: "blur(4px)",
|
|
33
|
+
alignItems: "flex-start",
|
|
34
|
+
justifyContent: "center",
|
|
35
|
+
paddingTop: "15vh",
|
|
36
|
+
zIndex: 9999
|
|
37
|
+
})}
|
|
38
|
+
class={overlayClass}
|
|
39
|
+
onClick={(e: MouseEvent) => {
|
|
40
|
+
if (e.target === e.currentTarget) setOpen(false);
|
|
41
|
+
}}
|
|
42
|
+
>
|
|
43
|
+
<div style={{ width: "100%", maxWidth: "560px" }} class={contentClass}>
|
|
44
|
+
<CommandRoot {...rest} />
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
</Portal>
|
|
48
|
+
);
|
|
49
|
+
}
|