@visulima/dev-toolbar 1.0.0-alpha.2 → 1.0.0-alpha.3

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 (93) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +59 -42
  3. package/dist/apps/a11y/a11y-store.d.ts +1 -1
  4. package/dist/apps/a11y/a11y-tooltip.d.ts +1 -1
  5. package/dist/apps/a11y/index.js +3 -3
  6. package/dist/apps/inspector/index.d.ts +3 -0
  7. package/dist/apps/inspector/index.js +17 -0
  8. package/dist/apps/inspector/inspector-app.d.ts +12 -0
  9. package/dist/apps/module-graph/index.js +2 -2
  10. package/dist/apps/more/index.js +2 -2
  11. package/dist/apps/performance/index.js +2 -2
  12. package/dist/apps/seo/index.js +2 -2
  13. package/dist/apps/settings/index.js +2 -2
  14. package/dist/apps/settings/settings-app.d.ts +0 -1
  15. package/dist/apps/tailwind/index.d.ts +3 -0
  16. package/dist/apps/tailwind/index.js +7 -0
  17. package/dist/apps/tailwind/tailwind-app.d.ts +5 -0
  18. package/dist/apps/timeline/index.js +2 -2
  19. package/dist/apps/vite-config/index.js +2 -2
  20. package/dist/client/overlay.js +1 -1
  21. package/dist/index.d.ts +2 -1
  22. package/dist/index.js +1 -1
  23. package/dist/packem_chunks/inject-source.js +1 -0
  24. package/dist/packem_shared/Alert-H-x1JuZ0.js +1 -0
  25. package/dist/packem_shared/Badge-C30mDKKG.js +1 -0
  26. package/dist/packem_shared/Button-DODNCTPZ.js +1 -0
  27. package/dist/packem_shared/Card-DdI7Wn3t.js +1 -0
  28. package/dist/packem_shared/Icon-DWFLZkwW.js +1 -0
  29. package/dist/packem_shared/Input-GfbOwAkK.js +1 -0
  30. package/dist/packem_shared/Label-Bzi47aUf.js +1 -0
  31. package/dist/packem_shared/Popover-o3Vkvndp.js +1 -0
  32. package/dist/packem_shared/Progress-vGfFpxRn.js +1 -0
  33. package/dist/packem_shared/Separator-DQGeJPQg.js +1 -0
  34. package/dist/packem_shared/Skeleton-BYXau6jM.js +1 -0
  35. package/dist/packem_shared/Switch-BeC78S_T.js +1 -0
  36. package/dist/packem_shared/Tabs-BBc4S-2T.js +1 -0
  37. package/dist/packem_shared/Textarea-DvbSX13V.js +1 -0
  38. package/dist/packem_shared/Tooltip-BwK-2I9P.js +1 -0
  39. package/dist/packem_shared/cn-DWLJYh3h.js +1 -0
  40. package/dist/packem_shared/createServerRPCContext-CRd6VAWp.js +1 -0
  41. package/dist/packem_shared/sharedToolbarStylesheet-DHHoFz2-.js +2 -0
  42. package/dist/packem_shared/use-theme-CX1gG6Sv.js +1 -0
  43. package/dist/rpc/functions/module-graph.d.ts +2 -2
  44. package/dist/rpc/functions/open-in-editor.d.ts +8 -3
  45. package/dist/rpc/functions/tailwind-config.d.ts +12 -0
  46. package/dist/rpc/server.d.ts +4 -1
  47. package/dist/timeline/capture.d.ts +6 -0
  48. package/dist/timeline/index.d.ts +1 -0
  49. package/dist/toolbar/app-manager.d.ts +7 -0
  50. package/dist/toolbar/components/app-button.d.ts +2 -2
  51. package/dist/toolbar/components/app-canvas.d.ts +0 -1
  52. package/dist/toolbar/components/app-tooltip-overlay.d.ts +0 -1
  53. package/dist/toolbar/components/first-visit-hint.d.ts +3 -3
  54. package/dist/toolbar/components/pinned-tooltip-card.d.ts +0 -1
  55. package/dist/toolbar/components/toolbar-bar.d.ts +0 -1
  56. package/dist/toolbar/components/vite-overlay-button.d.ts +0 -1
  57. package/dist/toolbar/context/index.d.ts +1 -1
  58. package/dist/toolbar/context/toolbar-context.d.ts +35 -35
  59. package/dist/toolbar/global-api.d.ts +1 -0
  60. package/dist/toolbar/hooks/index.d.ts +4 -4
  61. package/dist/toolbar/hooks/use-frame-state.d.ts +6 -6
  62. package/dist/toolbar/hooks/use-position.d.ts +1 -1
  63. package/dist/toolbar/index.d.ts +1 -2
  64. package/dist/toolbar/index.js +3 -4
  65. package/dist/types/app.d.ts +26 -14
  66. package/dist/types/global-api.d.ts +8 -1
  67. package/dist/types/rpc.d.ts +5 -0
  68. package/dist/ui/components/alert.d.ts +20 -0
  69. package/dist/ui/components/badge.d.ts +10 -0
  70. package/dist/ui/components/button.d.ts +12 -0
  71. package/dist/ui/components/card.d.ts +17 -0
  72. package/dist/ui/components/icon.d.ts +3 -3
  73. package/dist/ui/components/input.d.ts +8 -0
  74. package/dist/ui/components/label.d.ts +8 -0
  75. package/dist/ui/components/popover.d.ts +27 -0
  76. package/dist/ui/components/progress.d.ts +8 -0
  77. package/dist/ui/components/separator.d.ts +9 -0
  78. package/dist/ui/components/skeleton.d.ts +7 -0
  79. package/dist/ui/components/switch.d.ts +12 -0
  80. package/dist/ui/components/tabs.d.ts +29 -0
  81. package/dist/ui/components/textarea.d.ts +8 -0
  82. package/dist/ui/components/tooltip.d.ts +19 -0
  83. package/dist/ui/index.d.ts +17 -0
  84. package/dist/ui/index.js +1 -0
  85. package/dist/vite/inject-source.d.ts +25 -0
  86. package/dist/vite/matcher.d.ts +5 -0
  87. package/dist/vite-plugin.d.ts +39 -1
  88. package/dist/vite-plugin.js +2 -2
  89. package/package.json +20 -3
  90. package/dist/packem_shared/cn-BEsR6GkP.js +0 -1
  91. package/dist/packem_shared/createServerRPCContext-BVSesPXu.js +0 -1
  92. package/dist/packem_shared/icon-BUQ92HaT.js +0 -1
  93. package/dist/rpc/index.d.ts +0 -8
@@ -0,0 +1,20 @@
1
+ /** @jsxImportSource preact */
2
+ import type { ComponentChildren, JSX } from "preact";
3
+ type AlertVariant = "default" | "destructive" | "info" | "success" | "warning";
4
+ interface AlertProps extends JSX.HTMLAttributes<HTMLDivElement> {
5
+ children?: ComponentChildren;
6
+ class?: string;
7
+ variant?: AlertVariant;
8
+ }
9
+ interface AlertTitleProps extends JSX.HTMLAttributes<HTMLHeadingElement> {
10
+ children?: ComponentChildren;
11
+ class?: string;
12
+ }
13
+ interface AlertDescriptionProps extends JSX.HTMLAttributes<HTMLDivElement> {
14
+ children?: ComponentChildren;
15
+ class?: string;
16
+ }
17
+ declare const Alert: ({ children, class: className, variant, ...rest }: AlertProps) => JSX.Element;
18
+ declare const AlertTitle: ({ children, class: className, ...rest }: AlertTitleProps) => JSX.Element;
19
+ declare const AlertDescription: ({ children, class: className, ...rest }: AlertDescriptionProps) => JSX.Element;
20
+ export { Alert, AlertDescription, AlertTitle };
@@ -0,0 +1,10 @@
1
+ /** @jsxImportSource preact */
2
+ import type { ComponentChildren, JSX } from "preact";
3
+ type BadgeVariant = "default" | "destructive" | "info" | "outline" | "secondary" | "success" | "warning";
4
+ interface BadgeProps extends JSX.HTMLAttributes<HTMLDivElement> {
5
+ children?: ComponentChildren;
6
+ class?: string;
7
+ variant?: BadgeVariant;
8
+ }
9
+ declare const Badge: ({ children, class: className, variant, ...rest }: BadgeProps) => JSX.Element;
10
+ export default Badge;
@@ -0,0 +1,12 @@
1
+ /** @jsxImportSource preact */
2
+ import type { ComponentChildren, JSX } from "preact";
3
+ type ButtonSize = "default" | "icon" | "lg" | "sm";
4
+ type ButtonVariant = "default" | "destructive" | "ghost" | "link" | "outline" | "secondary";
5
+ interface ButtonProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {
6
+ children?: ComponentChildren;
7
+ class?: string;
8
+ size?: ButtonSize;
9
+ variant?: ButtonVariant;
10
+ }
11
+ declare const Button: ({ children, class: className, size, type, variant, ...rest }: ButtonProps) => JSX.Element;
12
+ export default Button;
@@ -0,0 +1,17 @@
1
+ /** @jsxImportSource preact */
2
+ import type { ComponentChildren, JSX } from "preact";
3
+ interface CardProps extends JSX.HTMLAttributes<HTMLDivElement> {
4
+ children?: ComponentChildren;
5
+ class?: string;
6
+ }
7
+ interface CardTitleProps extends JSX.HTMLAttributes<HTMLHeadingElement> {
8
+ children?: ComponentChildren;
9
+ class?: string;
10
+ }
11
+ declare const Card: ({ children, class: className, ...rest }: CardProps) => JSX.Element;
12
+ declare const CardHeader: ({ children, class: className, ...rest }: CardProps) => JSX.Element;
13
+ declare const CardTitle: ({ children, class: className, ...rest }: CardTitleProps) => JSX.Element;
14
+ declare const CardDescription: ({ children, class: className, ...rest }: CardProps) => JSX.Element;
15
+ declare const CardContent: ({ children, class: className, ...rest }: CardProps) => JSX.Element;
16
+ declare const CardFooter: ({ children, class: className, ...rest }: CardProps) => JSX.Element;
17
+ export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle };
@@ -4,7 +4,7 @@ interface IconProps {
4
4
  class?: string;
5
5
  size?: number;
6
6
  /**
7
- * CSS data-URI from a `?data-uri&encoding=css` lucide-static import.
7
+ * CSS data-URI from a `?data-uri&amp;encoding=css` lucide-static import.
8
8
  * Uses CSS mask-image so the icon inherits currentColor from the parent.
9
9
  */
10
10
  src: string;
@@ -15,7 +15,7 @@ interface IconProps {
15
15
  *
16
16
  * Usage:
17
17
  * import xIcon from "lucide-static/icons/x.d.ts";
18
- * <Icon src={xIcon} size={13} />
18
+ * &lt;Icon src={xIcon} size={13} />
19
19
  */
20
- declare const Icon: ({ src, size, class: className }: IconProps) => ComponentChildren;
20
+ declare const Icon: ({ class: className, size, src }: IconProps) => ComponentChildren;
21
21
  export default Icon;
@@ -0,0 +1,8 @@
1
+ /** @jsxImportSource preact */
2
+ import type { JSX } from "preact";
3
+ import type { ForwardRefExoticComponent, RefAttributes } from "preact/compat";
4
+ interface InputProps extends JSX.InputHTMLAttributes<HTMLInputElement> {
5
+ class?: string;
6
+ }
7
+ declare const Input: ForwardRefExoticComponent<InputProps & RefAttributes<HTMLInputElement>>;
8
+ export default Input;
@@ -0,0 +1,8 @@
1
+ /** @jsxImportSource preact */
2
+ import type { ComponentChildren, JSX } from "preact";
3
+ interface LabelProps extends JSX.LabelHTMLAttributes<HTMLLabelElement> {
4
+ children?: ComponentChildren;
5
+ class?: string;
6
+ }
7
+ declare const Label: ({ children, class: className, ...rest }: LabelProps) => JSX.Element;
8
+ export default Label;
@@ -0,0 +1,27 @@
1
+ import type { ComponentChildren, JSX } from "preact";
2
+ interface PopoverProps {
3
+ children: ComponentChildren;
4
+ defaultOpen?: boolean;
5
+ onOpenChange?: (open: boolean) => void;
6
+ open?: boolean;
7
+ }
8
+ interface PopoverTriggerProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {
9
+ children: ComponentChildren;
10
+ class?: string;
11
+ }
12
+ interface PopoverContentProps extends JSX.HTMLAttributes<HTMLDivElement> {
13
+ align?: "center" | "end" | "start";
14
+ children: ComponentChildren;
15
+ class?: string;
16
+ side?: "bottom" | "left" | "right" | "top";
17
+ sideOffset?: number;
18
+ }
19
+ interface PopoverCloseProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {
20
+ children?: ComponentChildren;
21
+ class?: string;
22
+ }
23
+ declare const Popover: ({ children, defaultOpen, onOpenChange, open }: PopoverProps) => JSX.Element;
24
+ declare const PopoverTrigger: ({ children, class: className, ...rest }: PopoverTriggerProps) => JSX.Element;
25
+ declare const PopoverContent: ({ align, children, class: className, side, sideOffset, ...rest }: PopoverContentProps) => JSX.Element | null;
26
+ declare const PopoverClose: ({ children, class: className, ...rest }: PopoverCloseProps) => JSX.Element;
27
+ export { Popover, PopoverClose, PopoverContent, PopoverTrigger };
@@ -0,0 +1,8 @@
1
+ /** @jsxImportSource preact */
2
+ import type { JSX } from "preact";
3
+ interface ProgressProps extends JSX.HTMLAttributes<HTMLDivElement> {
4
+ class?: string;
5
+ value?: number;
6
+ }
7
+ declare const Progress: ({ class: className, value, ...rest }: ProgressProps) => JSX.Element;
8
+ export default Progress;
@@ -0,0 +1,9 @@
1
+ /** @jsxImportSource preact */
2
+ import type { JSX } from "preact";
3
+ interface SeparatorProps extends JSX.HTMLAttributes<HTMLDivElement> {
4
+ class?: string;
5
+ decorative?: boolean;
6
+ orientation?: "horizontal" | "vertical";
7
+ }
8
+ declare const Separator: ({ class: className, decorative, orientation, ...rest }: SeparatorProps) => JSX.Element;
9
+ export default Separator;
@@ -0,0 +1,7 @@
1
+ /** @jsxImportSource preact */
2
+ import type { JSX } from "preact";
3
+ interface SkeletonProps extends JSX.HTMLAttributes<HTMLDivElement> {
4
+ class?: string;
5
+ }
6
+ declare const Skeleton: ({ class: className, ...rest }: SkeletonProps) => JSX.Element;
7
+ export default Skeleton;
@@ -0,0 +1,12 @@
1
+ /** @jsxImportSource preact */
2
+ import type { JSX } from "preact";
3
+ interface SwitchProps extends Omit<JSX.ButtonHTMLAttributes<HTMLButtonElement>, "onChange"> {
4
+ checked?: boolean;
5
+ class?: string;
6
+ defaultChecked?: boolean;
7
+ disabled?: boolean;
8
+ id?: string;
9
+ onCheckedChange?: (checked: boolean) => void;
10
+ }
11
+ declare const Switch: ({ checked, class: className, defaultChecked, disabled, id, onCheckedChange, ...rest }: SwitchProps) => JSX.Element;
12
+ export default Switch;
@@ -0,0 +1,29 @@
1
+ /** @jsxImportSource preact */
2
+ import type { ComponentChildren, JSX } from "preact";
3
+ interface TabsProps extends JSX.HTMLAttributes<HTMLDivElement> {
4
+ children?: ComponentChildren;
5
+ class?: string;
6
+ defaultValue?: string;
7
+ onValueChange?: (value: string) => void;
8
+ value?: string;
9
+ }
10
+ interface TabsListProps extends JSX.HTMLAttributes<HTMLDivElement> {
11
+ children?: ComponentChildren;
12
+ class?: string;
13
+ }
14
+ interface TabsTriggerProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {
15
+ children?: ComponentChildren;
16
+ class?: string;
17
+ disabled?: boolean;
18
+ value: string;
19
+ }
20
+ interface TabsContentProps extends JSX.HTMLAttributes<HTMLDivElement> {
21
+ children?: ComponentChildren;
22
+ class?: string;
23
+ value: string;
24
+ }
25
+ declare const Tabs: ({ children, class: className, defaultValue, onValueChange, value, ...rest }: TabsProps) => JSX.Element;
26
+ declare const TabsList: ({ children, class: className, ...rest }: TabsListProps) => JSX.Element;
27
+ declare const TabsTrigger: ({ children, class: className, disabled, value, ...rest }: TabsTriggerProps) => JSX.Element;
28
+ declare const TabsContent: ({ children, class: className, value, ...rest }: TabsContentProps) => JSX.Element | null;
29
+ export { Tabs, TabsContent, TabsList, TabsTrigger };
@@ -0,0 +1,8 @@
1
+ /** @jsxImportSource preact */
2
+ import type { JSX } from "preact";
3
+ import type { ForwardRefExoticComponent, RefAttributes } from "preact/compat";
4
+ interface TextareaProps extends JSX.TextareaHTMLAttributes<HTMLTextAreaElement> {
5
+ class?: string;
6
+ }
7
+ declare const Textarea: ForwardRefExoticComponent<RefAttributes<HTMLTextAreaElement> & TextareaProps>;
8
+ export default Textarea;
@@ -0,0 +1,19 @@
1
+ import type { ComponentChildren, JSX } from "preact";
2
+ interface TooltipProps {
3
+ children: ComponentChildren;
4
+ delayDuration?: number;
5
+ }
6
+ interface TooltipTriggerProps extends JSX.HTMLAttributes<HTMLSpanElement> {
7
+ children: ComponentChildren;
8
+ class?: string;
9
+ }
10
+ interface TooltipContentProps extends JSX.HTMLAttributes<HTMLDivElement> {
11
+ children: ComponentChildren;
12
+ class?: string;
13
+ side?: "bottom" | "left" | "right" | "top";
14
+ sideOffset?: number;
15
+ }
16
+ declare const Tooltip: ({ children, delayDuration: _delayDuration }: TooltipProps) => JSX.Element;
17
+ declare const TooltipTrigger: ({ children, class: className, ...rest }: TooltipTriggerProps) => JSX.Element;
18
+ declare const TooltipContent: ({ children, class: className, side, sideOffset, ...rest }: TooltipContentProps) => JSX.Element | null;
19
+ export { Tooltip, TooltipContent, TooltipTrigger };
@@ -0,0 +1,17 @@
1
+ export { default as cn } from "../utils/cn.d.ts";
2
+ export { Alert, AlertDescription, AlertTitle } from "./components/alert.d.ts";
3
+ export { default as Badge } from "./components/badge.d.ts";
4
+ export { default as Button } from "./components/button.d.ts";
5
+ export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "./components/card.d.ts";
6
+ export { default as Icon } from "./components/icon.d.ts";
7
+ export { default as Input } from "./components/input.d.ts";
8
+ export { default as Label } from "./components/label.d.ts";
9
+ export { Popover, PopoverClose, PopoverContent, PopoverTrigger } from "./components/popover.d.ts";
10
+ export { default as Progress } from "./components/progress.d.ts";
11
+ export { default as Separator } from "./components/separator.d.ts";
12
+ export { default as Skeleton } from "./components/skeleton.d.ts";
13
+ export { default as Switch } from "./components/switch.d.ts";
14
+ export { Tabs, TabsContent, TabsList, TabsTrigger } from "./components/tabs.d.ts";
15
+ export { default as Textarea } from "./components/textarea.d.ts";
16
+ export { Tooltip, TooltipContent, TooltipTrigger } from "./components/tooltip.d.ts";
17
+ export { clsx } from "clsx";
@@ -0,0 +1 @@
1
+ import{default as e}from"../packem_shared/cn-DWLJYh3h.js";import{Alert as a,AlertDescription as f,AlertTitle as p}from"../packem_shared/Alert-H-x1JuZ0.js";import{default as s}from"../packem_shared/Badge-C30mDKKG.js";import{default as x}from"../packem_shared/Button-DODNCTPZ.js";import{Card as n,CardContent as i,CardDescription as u,CardFooter as T,CardHeader as C,CardTitle as g}from"../packem_shared/Card-DdI7Wn3t.js";import{default as b}from"../packem_shared/Icon-DWFLZkwW.js";import{default as v}from"../packem_shared/Input-GfbOwAkK.js";import{default as S}from"../packem_shared/Label-Bzi47aUf.js";import{Popover as D,PopoverClose as I,PopoverContent as L,PopoverTrigger as h}from"../packem_shared/Popover-o3Vkvndp.js";import{default as w}from"../packem_shared/Progress-vGfFpxRn.js";import{default as H}from"../packem_shared/Separator-DQGeJPQg.js";import{default as q}from"../packem_shared/Skeleton-BYXau6jM.js";import{default as z}from"../packem_shared/Switch-BeC78S_T.js";import{Tabs as G,TabsContent as J,TabsList as K,TabsTrigger as M}from"../packem_shared/Tabs-BBc4S-2T.js";import{default as O}from"../packem_shared/Textarea-DvbSX13V.js";import{Tooltip as R,TooltipContent as U,TooltipTrigger as V}from"../packem_shared/Tooltip-BwK-2I9P.js";import{clsx as X}from"clsx";export{a as Alert,f as AlertDescription,p as AlertTitle,s as Badge,x as Button,n as Card,i as CardContent,u as CardDescription,T as CardFooter,C as CardHeader,g as CardTitle,b as Icon,v as Input,S as Label,D as Popover,I as PopoverClose,L as PopoverContent,h as PopoverTrigger,w as Progress,H as Separator,q as Skeleton,z as Switch,G as Tabs,J as TabsContent,K as TabsList,M as TabsTrigger,O as Textarea,R as Tooltip,U as TooltipContent,V as TooltipTrigger,X as clsx,e as cn};
@@ -0,0 +1,25 @@
1
+ import generate from "@babel/generator";
2
+ declare const gen: typeof generate;
3
+ /** The attribute name injected into each JSX opening element. */
4
+ export declare const SOURCE_ATTR = "data-vdt-source";
5
+ export interface InjectSourceIgnore {
6
+ /** Component names or patterns to skip. */
7
+ components?: (RegExp | string)[];
8
+ /** File paths or patterns to skip. */
9
+ files?: (RegExp | string)[];
10
+ }
11
+ /**
12
+ * Inject `data-vdt-source="&lt;file>:&lt;line>:&lt;col>"` into every JSX opening element
13
+ * in the given source code, enabling the inspector to resolve elements back to
14
+ * their source location.
15
+ *
16
+ * Pass `originalCode` when the received `code` may have been pre-processed by an
17
+ * SSR pipeline (e.g. Vinxi / TanStack Start) that shifts JSX line numbers relative
18
+ * to the source file on disk. Positions are then read from `originalCode` but
19
+ * injected into `code`'s AST, ensuring server and client produce identical
20
+ * attribute values and React hydration never reports a mismatch.
21
+ *
22
+ * Returns `undefined` when the file was skipped or contained no JSX to transform.
23
+ */
24
+ export declare const addSourceToJsx: (code: string, id: string, ignore?: InjectSourceIgnore, originalCode?: string) => ReturnType<typeof gen> | undefined;
25
+ export {};
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Returns true if `value` matches any of the given patterns.
3
+ * Strings are treated as glob patterns; RegExps are tested directly.
4
+ */
5
+ export declare const matcher: (patterns: (RegExp | string)[], value: string) => boolean;
@@ -1,5 +1,6 @@
1
1
  import type { Plugin } from "vite";
2
2
  import type { DevToolbarApp, ServerFunctions } from "./types/index.d.ts";
3
+ import type { InjectSourceIgnore } from "./vite/inject-source.d.ts";
3
4
  /**
4
5
  * Dev toolbar plugin options
5
6
  */
@@ -18,10 +19,12 @@ export interface DevToolbarOptions {
18
19
  apps?: {
19
20
  [key: string]: boolean | undefined;
20
21
  a11y?: boolean;
22
+ inspector?: boolean;
21
23
  moduleGraph?: boolean;
22
24
  performance?: boolean;
23
25
  seo?: boolean;
24
26
  settings?: boolean;
27
+ tailwind?: boolean;
25
28
  timeline?: boolean;
26
29
  viteConfig?: boolean;
27
30
  };
@@ -38,11 +41,38 @@ export interface DevToolbarOptions {
38
41
  * Whether toolbar is visible by default
39
42
  */
40
43
  defaultVisible?: boolean;
44
+ /**
45
+ * The editor to open when clicking "Open in editor" in the inspector.
46
+ * Accepts any value supported by `launch-editor` — an editor name/alias
47
+ * (e.g. `"code"`, `"webstorm"`, `"vim"`, `"atom"`) or the full path to
48
+ * the editor executable.
49
+ *
50
+ * If omitted, `launch-editor` auto-detects the editor from the `EDITOR`
51
+ * / `VISUAL` environment variables or from the currently running IDE
52
+ * process detected on the OS process list.
53
+ * @example "webstorm"
54
+ * @example "code"
55
+ */
56
+ editor?: string;
41
57
  /**
42
58
  * Initial panel height as a percentage of the viewport height (20–95).
43
59
  * @default 60
44
60
  */
45
61
  height?: number;
62
+ /**
63
+ * Inject `data-vdt-source="&lt;file>:&lt;line>:&lt;col>"` attributes into every JSX
64
+ * opening element during development. This lets the inspector jump directly
65
+ * to the source file when an element is clicked.
66
+ *
67
+ * Only active when `mode === 'development'`. Set `enabled: false` to opt out.
68
+ * Use `ignore.files` / `ignore.components` to exclude specific paths or
69
+ * component names (strings are treated as glob patterns).
70
+ * @default { enabled: true }
71
+ */
72
+ injectSource?: {
73
+ enabled?: boolean;
74
+ ignore?: InjectSourceIgnore;
75
+ };
46
76
  /**
47
77
  * Keyboard shortcut bindings.
48
78
  * These are project-level defaults; users can still override them via the
@@ -77,6 +107,14 @@ export interface DevToolbarOptions {
77
107
  * @default false
78
108
  */
79
109
  reduceMotion?: boolean;
110
+ /**
111
+ * Strip all @visulima/dev-toolbar imports and virtual modules when building
112
+ * for production (i.e. when `command !== 'serve'` or `mode === 'production'`).
113
+ * This guarantees the toolbar never ends up in a production bundle even if the
114
+ * user accidentally imports our package in application code.
115
+ * @default true
116
+ */
117
+ removeDevtoolsOnBuild?: boolean;
80
118
  /**
81
119
  * Only activate the toolbar when the URL contains a specific query parameter.
82
120
  * Useful for staging/production environments where you want opt-in debugging.
@@ -103,4 +141,4 @@ export interface DevToolbarOptions {
103
141
  /**
104
142
  * Dev toolbar Vite plugin
105
143
  */
106
- export declare const devToolbar: (options?: DevToolbarOptions) => Plugin;
144
+ export declare const devToolbar: (options?: DevToolbarOptions) => Plugin[];
@@ -1,2 +1,2 @@
1
- var g=Object.defineProperty;var p=(e,r)=>g(e,"name",{value:r,configurable:!0});import{createRequire as b}from"node:module";import{normalizePath as $}from"vite";import{createServerRPCContext as j}from"./packem_shared/createServerRPCContext-BVSesPXu.js";const h=b(import.meta.url),s=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,u=p(e=>{if(typeof s<"u"&&s.versions&&s.versions.node){const[r,o]=s.versions.node.split(".").map(Number);if(r>22||r===22&&o>=3||r===20&&o>=16)return s.getBuiltinModule(e)}return h(e)},"__cjs_getBuiltinModule"),y=u("node:fs"),_=u("node:path"),{fileURLToPath:T}=u("node:url");var P=Object.defineProperty,c=p((e,r)=>P(e,"name",{value:r,configurable:!0}),"o");const F=c(()=>$(_.dirname(T(import.meta.url))),"getDevToolbarPath"),C=c(e=>e.replace(/\?.*$/,""),"removeUrlQuery"),d="?__visulima-dev-toolbar-resource",f="virtual:visulima-dev-toolbar-options",m=`\0${f}`,a="virtual:visulima-dev-toolbar-path:",x=c((e={})=>{const r=F();let o;return{apply:"serve",configResolved(t){o=t},configureServer(t){j(t,e.serverFunctions),t.ws.on("connection",()=>{t.ws.send({event:"dev-toolbar:init",type:"custom"})})},enforce:"pre",async load(t){if(t===m)return`export default ${JSON.stringify({apps:{a11y:e.apps?.a11y??!0,moduleGraph:e.apps?.moduleGraph??!0,performance:e.apps?.performance??!0,seo:e.apps?.seo??!0,settings:e.apps?.settings??!0,timeline:e.apps?.timeline??!0,viteConfig:e.apps?.viteConfig??!0},base:o.base,closeOnOutsideClick:e.closeOnOutsideClick??!0,defaultVisible:e.defaultVisible??!0,height:e.height??60,keybindings:e.keybindings??{},minimizePanelInactive:e.minimizePanelInactive??5e3,placement:e.placement??"bottom-center",position:e.position??"bottom",reduceMotion:e.reduceMotion??!1,requireUrlFlag:e.requireUrlFlag??!1,urlFlagName:e.urlFlagName??"devtools",width:e.width??80})};`;if(t.endsWith(d)){const n=C(t);return this.addWatchFile(n),await y.promises.readFile(n,"utf8")}},name:"@visulima/dev-toolbar",resolveId(t){if(t===f)return m;if(t.startsWith(a))return`${t.replace(a,`${r}/`)}${d}`},transform(t,n,v){if(v?.ssr)return;const{appendTo:i}=e,l=n.split("?",2)[0];if(i&&l&&(typeof i=="string"&&l.endsWith(i)||i instanceof RegExp&&i.test(l)))return`import '${a}client/overlay.js';
2
- ${t}`},transformIndexHtml(){return e.appendTo?void 0:{html:"",tags:[{attrs:{src:`${o.base||"/"}@id/${a}client/overlay.js`,type:"module"},injectTo:"head-prepend",tag:"script"}]}}}},"devToolbar");export{x as devToolbar};
1
+ var j=Object.defineProperty;var c=(e,o)=>j(e,"name",{value:o,configurable:!0});import{createRequire as w}from"node:module";import{normalizePath as F}from"vite";import{createServerRPCContext as C}from"./packem_shared/createServerRPCContext-CRd6VAWp.js";const T=w(import.meta.url),a=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,v=c(e=>{if(typeof a<"u"&&a.versions&&a.versions.node){const[o,u]=a.versions.node.split(".").map(Number);if(o>22||o===22&&u>=3||o===20&&u>=16)return a.getBuiltinModule(e)}return T(e)},"__cjs_getBuiltinModule"),$=v("node:fs"),P=v("node:path"),{fileURLToPath:x}=v("node:url");var O=Object.defineProperty,f=c((e,o)=>O(e,"name",{value:o,configurable:!0}),"s");const I=f(()=>F(P.dirname(x(import.meta.url))),"getDevToolbarPath"),R=f(e=>e.replace(/\?.*$/,""),"removeUrlQuery"),g="?__visulima-dev-toolbar-resource",m="virtual:visulima-dev-toolbar-options",h=`\0${m}`,l="virtual:visulima-dev-toolbar-path:",y="\0__visulima-dev-toolbar-empty",M=f((e={})=>{const o=I(),u=e.removeDevtoolsOnBuild??!0,_=e.injectSource?.enabled??!0;let d;return[{apply:"serve",configResolved(t){d=t},configureServer(t){C(t,e.serverFunctions,{editor:e.editor}),t.ws.on("connection",()=>{t.ws.send({event:"dev-toolbar:init",type:"custom"})})},enforce:"pre",async load(t){if(t===h)return`export default ${JSON.stringify({apps:{a11y:e.apps?.a11y??!0,inspector:e.apps?.inspector??!0,moduleGraph:e.apps?.moduleGraph??!0,performance:e.apps?.performance??!0,seo:e.apps?.seo??!0,settings:e.apps?.settings??!0,tailwind:e.apps?.tailwind??!0,timeline:e.apps?.timeline??!0,viteConfig:e.apps?.viteConfig??!0},base:d.base,closeOnOutsideClick:e.closeOnOutsideClick??!0,defaultVisible:e.defaultVisible??!0,height:e.height??60,keybindings:e.keybindings??{},minimizePanelInactive:e.minimizePanelInactive??5e3,placement:e.placement??"bottom-center",position:e.position??"bottom",reduceMotion:e.reduceMotion??!1,requireUrlFlag:e.requireUrlFlag??!1,urlFlagName:e.urlFlagName??"devtools",width:e.width??80})};`;if(t.endsWith(g)){const r=R(t);return this.addWatchFile(r),await $.promises.readFile(r,"utf8")}},name:"@visulima/dev-toolbar",resolveId(t){if(t===m)return h;if(t.startsWith(l))return`${t.replace(l,`${o}/`)}${g}`},transform(t,r,s){if(s?.ssr)return;const{appendTo:i}=e,n=r.split("?",2)[0];if(i&&n&&(typeof i=="string"&&n.endsWith(i)||i instanceof RegExp&&i.test(n)))return`import '${l}client/overlay.js';
2
+ ${t}`},transformIndexHtml(){return e.appendTo?void 0:{html:"",tags:[{attrs:{src:`${d.base||"/"}@id/${l}client/overlay.js`,type:"module"},injectTo:"head-prepend",tag:"script"}]}}},{enforce:"pre",name:"@visulima/dev-toolbar:inject-source",async transform(t,r){if(!_||d.mode!=="development"||r.includes("node_modules")||r.includes("?raw")||/\/dist\/|\/build\//.test(r)||!/\.[jt]sx$/.test(r.split("?")[0]??""))return;const{readFile:s}=await import("node:fs/promises");let i;try{const b=await s(r.split("?")[0]??r,"utf-8");b!==t&&(i=b)}catch{}const{addSourceToJsx:n}=await import("./packem_chunks/inject-source.js"),p=n(t,r,e.injectSource?.ignore,i);if(p)return{code:p.code??t,map:p.map??null}}},{apply(t,{command:r,mode:s}){return u&&(r!=="serve"||s==="production")},load(t){if(t===y)return"export default {};"},name:"@visulima/dev-toolbar:remove-on-build",resolveId(t){if(t===m||t.startsWith(l))return y}}]},"devToolbar");export{M as devToolbar};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visulima/dev-toolbar",
3
- "version": "1.0.0-alpha.2",
3
+ "version": "1.0.0-alpha.3",
4
4
  "description": "Devtools is a set of tools for building advanced devtools for your application",
5
5
  "keywords": [
6
6
  "visulima",
@@ -49,6 +49,14 @@
49
49
  "types": "./dist/apps/a11y/index.d.ts",
50
50
  "default": "./dist/apps/a11y/index.js"
51
51
  },
52
+ "./apps/inspector": {
53
+ "types": "./dist/apps/inspector/index.d.ts",
54
+ "default": "./dist/apps/inspector/index.js"
55
+ },
56
+ "./apps/tailwind": {
57
+ "types": "./dist/apps/tailwind/index.d.ts",
58
+ "default": "./dist/apps/tailwind/index.js"
59
+ },
52
60
  "./apps/module-graph": {
53
61
  "types": "./dist/apps/module-graph/index.d.ts",
54
62
  "default": "./dist/apps/module-graph/index.js"
@@ -81,6 +89,10 @@
81
89
  "types": "./dist/toolbar/index.d.ts",
82
90
  "default": "./dist/toolbar/index.js"
83
91
  },
92
+ "./ui": {
93
+ "types": "./dist/ui/index.d.ts",
94
+ "default": "./dist/ui/index.js"
95
+ },
84
96
  "./package.json": "./package.json"
85
97
  },
86
98
  "files": [
@@ -89,11 +101,16 @@
89
101
  "CHANGELOG.md"
90
102
  ],
91
103
  "dependencies": {
104
+ "@babel/generator": "^7.29.1",
105
+ "@babel/parser": "^7.29.0",
106
+ "@babel/traverse": "^7.29.0",
107
+ "@babel/types": "^7.29.0",
108
+ "@floating-ui/dom": "^1.7.6",
92
109
  "axe-core": "^4.11.1",
93
110
  "clsx": "^2.1.1",
111
+ "launch-editor": "^2.13.1",
94
112
  "preact": "^10.28.4",
95
- "tailwind-merge": "^3.5.0",
96
- "tw-animate-css": "1.4.0"
113
+ "tailwind-merge": "^3.5.0"
97
114
  },
98
115
  "peerDependencies": {
99
116
  "vite": "^6 || ^7"
@@ -1 +0,0 @@
1
- var t=Object.defineProperty;var o=(r,e)=>t(r,"name",{value:e,configurable:!0});import{clsx as m}from"clsx";import{twMerge as a}from"tailwind-merge";var c=Object.defineProperty,n=o((r,e)=>c(r,"name",{value:e,configurable:!0}),"t");const l=n((...r)=>a(m(r)),"cn");export{l as m};
@@ -1 +0,0 @@
1
- var p=Object.defineProperty;var l=(e,r)=>p(e,"name",{value:r,configurable:!0});var g=Object.defineProperty,v=l((e,r)=>g(e,"name",{value:r,configurable:!0}),"u");const f=v(async e=>{const{moduleGraph:r}=e,t=[];return r.idToModuleMap.forEach(o=>{const n=[];o.importers.forEach(a=>{const s=a.url??a.id;s&&n.push(s)});const c=o.id??o.url,i=o.url??o.id;!c||!i||t.push({id:c,importerCount:o.importers.size,importerUrls:n,url:i})}),t},"getModuleGraph");var h=Object.defineProperty,m=l((e,r)=>h(e,"name",{value:r,configurable:!0}),"n$1");const b=m(async(e,r,t,o)=>{const n=e;if(n.openInEditor){await n.openInEditor(r,{column:o,line:t});return}const c=process.env.EDITOR||process.env.VISUAL||"code",i=r.startsWith("/")?r:`${e.config.root}/${r}`,a=t&&o?`:${t}:${o}`:t?`:${t}`:"",{spawn:s}=require("node:child_process");s(c,[`${i}${a}`],{detached:!0,stdio:"ignore"})},"openInEditor");var y=Object.defineProperty,$=l((e,r)=>y(e,"name",{value:r,configurable:!0}),"t");const C=$(async e=>({base:e.config.base,build:{outDir:e.config.build?.outDir},mode:e.config.mode,resolve:{alias:e.config.resolve.alias},root:e.config.root,server:{host:e.config.server?.host,https:e.config.server?.https,port:e.config.server?.port}}),"getViteConfig");var E=Object.defineProperty,d=l((e,r)=>E(e,"name",{value:r,configurable:!0}),"n");const I=d(e=>({getModuleGraph:d(async()=>f(e),"getModuleGraph"),getViteConfig:d(async()=>C(e),"getViteConfig"),openInEditor:d(async(r,t,o)=>b(e,r,t,o),"openInEditor"),readFile:d(async r=>{const{readFile:t}=await import("node:fs/promises"),o=r.startsWith("/")?r:`${e.config.root}/${r}`;return t(o,"utf-8")},"readFile")}),"createDefaultServerFunctions"),P=d((e,r)=>{const t={...I(e),...r};return e.ws.on("dev-toolbar:rpc",async(o,n)=>{const{args:c,id:i,method:a}=o,s=t[a];if(!s){n.send("dev-toolbar:rpc:error",{error:`Unknown RPC method: ${a}`,id:i});return}try{const u=await s(e,...c);n.send("dev-toolbar:rpc:response",{id:i,result:u})}catch(u){n.send("dev-toolbar:rpc:error",{error:u instanceof Error?u.message:String(u),id:i})}}),{callClient(o,...n){e.ws.send({data:{args:n,method:o},event:"dev-toolbar:client",type:"custom"})},registerFunction(o,n){t[o]=n},server:e}},"createServerRPCContext");export{P as createServerRPCContext};
@@ -1 +0,0 @@
1
- var S=Object.defineProperty;var l=(e,t)=>S(e,"name",{value:t,configurable:!0});import{addHookName as g}from"preact/devtools";import{useState as f,useEffect as v}from"preact/hooks";import{m as w}from"./cn-BEsR6GkP.js";import{jsx as T}from"preact/jsx-runtime";var O=Object.defineProperty,s=l((e,t)=>O(e,"name",{value:t,configurable:!0}),"t$2");const _={toggle:"Alt+Shift+D",close:"Escape"},k="__v_dt__frame_state",a={closeOnOutsideClick:!0,height:60,isPip:!1,isFirstVisit:!0,keybindings:_,left:50,minimizePanelInactive:5e3,open:!1,position:"bottom",preferShowFloatingPanel:!0,reduceMotion:!1,route:"/",top:0,viewMode:"default",width:80},I=s(()=>{const e=globalThis.__VISULIMA_DEV_TOOLBAR_OPTIONS__;return e?{...a,closeOnOutsideClick:e.closeOnOutsideClick??a.closeOnOutsideClick,height:e.height??a.height,keybindings:{..._,...e.keybindings},minimizePanelInactive:e.minimizePanelInactive??a.minimizePanelInactive,position:e.position??a.position,reduceMotion:e.reduceMotion??a.reduceMotion,width:e.width??a.width}:{...a}},"buildEffectiveDefaults"),L=s(()=>{const e=I();if(globalThis.window===void 0)return e;try{const t=localStorage.getItem(k);if(t){const i=JSON.parse(t);return{...e,...i,keybindings:{...e.keybindings,...i.keybindings},open:!1}}}catch{}return e},"loadState"),M=s(e=>{if(globalThis.window!==void 0)try{localStorage.setItem(k,JSON.stringify(e))}catch{}},"saveState");let c=L();const d=new Set,$=s(()=>{for(const e of d)e()},"notifyListeners"),P=s(e=>{c={...c,...e},M(c),$()},"updateSharedState"),V=s(()=>{const[,e]=g(f(0),"forceUpdate");return v(()=>{const t=s(()=>{e(i=>i+1)},"listener");return d.add(t),()=>{d.delete(t)}},[]),{state:c,updateState:P}},"useFrameState");var E=Object.defineProperty,o=l((e,t)=>E(e,"name",{value:t,configurable:!0}),"t$1");const b="__v_dt__theme",h=o(()=>globalThis.window===void 0?"light":globalThis.window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light","getSystemTheme"),z=o(()=>{if(globalThis.window===void 0)return"system";try{const e=localStorage.getItem(b);if(e==="light"||e==="dark"||e==="system")return e}catch(e){console.warn("[dev-toolbar] Failed to load theme:",e)}return"system"},"loadTheme"),C=o(e=>{if(globalThis.window!==void 0)try{localStorage.setItem(b,e)}catch(t){console.warn("[dev-toolbar] Failed to save theme:",t)}},"saveTheme");let n=z(),r=n==="system"?h():n;const m=new Set,p=o(()=>{for(const e of m)e()},"notifyThemeListeners"),y=o(e=>{try{localStorage.setItem("__v-o__theme",e)}catch{}const t=globalThis.__v_o__current?.shadowRoot?.querySelector("#__v_o__root");t&&(e==="dark"?t.classList.add("dark"):t.classList.remove("dark"))},"syncViteOverlayTheme"),u=o(e=>{n=e,r=e==="system"?h():e,C(e),y(r),p()},"setSharedTheme");if(globalThis.window!==void 0){const e=globalThis.window.matchMedia("(prefers-color-scheme: dark)"),t=o(()=>{n==="system"&&(r=h(),y(r),p())},"handleSystemChange");e.addEventListener?e.addEventListener("change",t):e.addListener&&e.addListener(t)}const W=o(()=>{const[,e]=g(f(0),"forceUpdate");return v(()=>{const t=o(()=>{e(i=>i+1)},"listener");return m.add(t),()=>{m.delete(t)}},[]),{resolvedTheme:r,setTheme:u,theme:n,toggleTheme:o(()=>{u(r==="dark"?"light":"dark")},"toggleTheme")}},"useTheme");var F=Object.defineProperty,D=l((e,t)=>F(e,"name",{value:t,configurable:!0}),"o");const x=D(({src:e,size:t=13,class:i})=>T("span",{class:w("inline-block shrink-0",i),style:{backgroundColor:"currentColor",height:t,maskImage:`url(${e})`,maskRepeat:"no-repeat",maskSize:"contain",WebkitMaskImage:`url(${e})`,WebkitMaskRepeat:"no-repeat",WebkitMaskSize:"contain",width:t}}),"Icon");export{_ as D,W as a,x as i,V as u};
@@ -1,8 +0,0 @@
1
- /**
2
- * RPC layer exports
3
- */
4
- export { createClientRPCContext } from "./client.d.ts";
5
- export { getModuleGraph, type SerializableModuleNode } from "./functions/module-graph.d.ts";
6
- export { openInEditor } from "./functions/open-in-editor.d.ts";
7
- export { getViteConfig } from "./functions/vite-config.d.ts";
8
- export { createServerRPCContext } from "./server.d.ts";