@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.
Files changed (138) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +110 -2
  3. package/dist/bundle.dev.js +4875 -0
  4. package/dist/index.js +9633 -0
  5. package/dist/src/api/index.js +4002 -0
  6. package/dist/src/charts/index.js +2717 -0
  7. package/dist/src/devtools/index.js +4677 -0
  8. package/dist/src/dom/index.js +1550 -0
  9. package/dist/src/form/index.js +1415 -0
  10. package/dist/src/index.js +11826 -0
  11. package/dist/src/jsx-runtime/index.js +1630 -0
  12. package/dist/src/query/index.js +2422 -0
  13. package/dist/src/router/index.js +1856 -0
  14. package/dist/src/rpc/index.js +3484 -0
  15. package/dist/src/server/index.js +1173 -0
  16. package/dist/src/signals/index.js +1077 -0
  17. package/dist/src/style/index.js +2340 -0
  18. package/dist/src/template/index.js +1149 -0
  19. package/dist/src/ui/index.js +4155 -0
  20. package/dist/src/virtual/index.js +1955 -0
  21. package/dist/src/vite/index.js +984 -0
  22. package/dist/vite/index.js +707 -0
  23. package/package.json +140 -4
  24. package/src/api/client.ts +371 -0
  25. package/src/api/file-router.ts +183 -0
  26. package/src/api/handler.ts +326 -0
  27. package/src/api/index.ts +71 -0
  28. package/src/api/middleware.ts +54 -0
  29. package/src/api/pragma.ts +155 -0
  30. package/src/api/procedure.ts +172 -0
  31. package/src/api/types.ts +249 -0
  32. package/src/charts/Area.tsx +111 -0
  33. package/src/charts/Axis.tsx +126 -0
  34. package/src/charts/Bar.tsx +86 -0
  35. package/src/charts/CartesianGrid.tsx +72 -0
  36. package/src/charts/Chart.tsx +269 -0
  37. package/src/charts/Cursor.tsx +42 -0
  38. package/src/charts/Legend.tsx +56 -0
  39. package/src/charts/Line.tsx +106 -0
  40. package/src/charts/Pie.tsx +88 -0
  41. package/src/charts/Tooltip.tsx +127 -0
  42. package/src/charts/context.ts +30 -0
  43. package/src/charts/index.ts +14 -0
  44. package/src/charts/path.ts +155 -0
  45. package/src/charts/scale.ts +133 -0
  46. package/src/charts/types.ts +50 -0
  47. package/src/devtools/DomTab.tsx +134 -0
  48. package/src/devtools/GraphInspector.tsx +196 -0
  49. package/src/devtools/GraphTab.tsx +315 -0
  50. package/src/devtools/QueryTab.tsx +200 -0
  51. package/src/devtools/RpcTab.tsx +190 -0
  52. package/src/devtools/SignalsTab.tsx +129 -0
  53. package/src/devtools/component.tsx +243 -0
  54. package/src/devtools/highlighter.ts +134 -0
  55. package/src/devtools/hub.ts +175 -0
  56. package/src/devtools/index.ts +20 -0
  57. package/src/devtools/styles.ts +313 -0
  58. package/src/devtools/types.ts +45 -0
  59. package/src/dom/async.ts +232 -0
  60. package/src/dom/control-flow.ts +353 -0
  61. package/src/dom/index.ts +32 -0
  62. package/src/dom/lazy.ts +82 -0
  63. package/src/dom/render.ts +286 -0
  64. package/src/dom/resource.ts +120 -0
  65. package/src/form/form.ts +218 -0
  66. package/src/form/index.ts +17 -0
  67. package/src/form/schema.ts +299 -0
  68. package/src/index.ts +413 -0
  69. package/src/jsx-dev-runtime/index.ts +1 -0
  70. package/src/jsx-runtime/index.ts +112 -0
  71. package/src/jsx-runtime/jsx.d.ts +278 -0
  72. package/src/query/create-mutation.ts +64 -0
  73. package/src/query/create-query.ts +426 -0
  74. package/src/query/focus-manager.ts +68 -0
  75. package/src/query/index.ts +63 -0
  76. package/src/query/mutation-cache.ts +138 -0
  77. package/src/query/online-manager.ts +67 -0
  78. package/src/query/query-cache.ts +369 -0
  79. package/src/query/query-client.ts +248 -0
  80. package/src/query/types.ts +221 -0
  81. package/src/query/utils.ts +132 -0
  82. package/src/router/index.ts +19 -0
  83. package/src/router/router.tsx +352 -0
  84. package/src/rpc/client.ts +317 -0
  85. package/src/rpc/error.ts +70 -0
  86. package/src/rpc/index.ts +52 -0
  87. package/src/rpc/procedure.ts +88 -0
  88. package/src/rpc/router.ts +105 -0
  89. package/src/rpc/server.ts +511 -0
  90. package/src/rpc/types.ts +328 -0
  91. package/src/server/hydrate.ts +21 -0
  92. package/src/server/index.ts +10 -0
  93. package/src/server/render-to-stream.ts +31 -0
  94. package/src/server/render-to-string.ts +125 -0
  95. package/src/signals/computed.ts +217 -0
  96. package/src/signals/context.ts +89 -0
  97. package/src/signals/effect.ts +161 -0
  98. package/src/signals/index.ts +57 -0
  99. package/src/signals/scope.ts +132 -0
  100. package/src/signals/signal.ts +203 -0
  101. package/src/signals/store.ts +163 -0
  102. package/src/signals/system.ts +124 -0
  103. package/src/signals/types.ts +64 -0
  104. package/src/style/component.tsx +122 -0
  105. package/src/style/create-style.ts +229 -0
  106. package/src/style/cx.ts +75 -0
  107. package/src/style/hash.ts +19 -0
  108. package/src/style/index.ts +8 -0
  109. package/src/style/layout.tsx +406 -0
  110. package/src/style/manager.ts +87 -0
  111. package/src/style/parser.ts +257 -0
  112. package/src/style/scale.ts +237 -0
  113. package/src/template/index.ts +4 -0
  114. package/src/template/template.ts +126 -0
  115. package/src/ui/accordion.tsx +286 -0
  116. package/src/ui/command-dialog.tsx +49 -0
  117. package/src/ui/command.tsx +400 -0
  118. package/src/ui/data-table.tsx +322 -0
  119. package/src/ui/dialog.tsx +362 -0
  120. package/src/ui/dropdown-menu.tsx +381 -0
  121. package/src/ui/icon.tsx +69 -0
  122. package/src/ui/index.ts +138 -0
  123. package/src/ui/layout.tsx +13 -0
  124. package/src/ui/popover.tsx +249 -0
  125. package/src/ui/switch.tsx +114 -0
  126. package/src/ui/tabs.tsx +297 -0
  127. package/src/ui/toast.tsx +280 -0
  128. package/src/ui/tooltip.tsx +262 -0
  129. package/src/ui/utils.ts +110 -0
  130. package/src/virtual/index.ts +12 -0
  131. package/src/virtual/virtual-list.tsx +185 -0
  132. package/src/virtual/virtualizer.ts +274 -0
  133. package/src/vite/hmr.ts +38 -0
  134. package/src/vite/index.ts +3 -0
  135. package/src/vite/lucide.ts +124 -0
  136. package/src/vite/plugin.ts +102 -0
  137. package/src/vite/rpc-middleware.ts +82 -0
  138. 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
+ }