@pixel-point/toolcraft 0.0.2

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 (257) hide show
  1. package/LICENSE.md +98 -0
  2. package/README.md +41 -0
  3. package/bin/create-toolcraft-app.mjs +8 -0
  4. package/bin/toolcraft.mjs +8 -0
  5. package/package.json +24 -0
  6. package/scripts/prepare-pack.mjs +29 -0
  7. package/src/cli.mjs +392 -0
  8. package/src/cli.test.mjs +284 -0
  9. package/src/copy-recursive.mjs +86 -0
  10. package/src/generate.mjs +212 -0
  11. package/src/generate.test.mjs +322 -0
  12. package/src/import-map.mjs +14 -0
  13. package/src/package-json.mjs +80 -0
  14. package/src/package-json.test.mjs +67 -0
  15. package/src/rewrite-imports.mjs +85 -0
  16. package/src/rewrite-imports.test.mjs +58 -0
  17. package/templates/runtime/contracts/component-contracts.test.ts +1165 -0
  18. package/templates/runtime/contracts/component-contracts.ts +1340 -0
  19. package/templates/runtime/contracts/decision-contracts.test.ts +206 -0
  20. package/templates/runtime/contracts/decision-contracts.ts +283 -0
  21. package/templates/runtime/contracts/index.test.ts +14 -0
  22. package/templates/runtime/contracts/index.ts +3 -0
  23. package/templates/runtime/contracts/types.ts +56 -0
  24. package/templates/runtime/export/export.test.ts +203 -0
  25. package/templates/runtime/export/export.ts +132 -0
  26. package/templates/runtime/export/index.ts +1 -0
  27. package/templates/runtime/index.ts +14 -0
  28. package/templates/runtime/react/canvas-shell.test.tsx +424 -0
  29. package/templates/runtime/react/canvas-shell.tsx +408 -0
  30. package/templates/runtime/react/control-renderers.ts +31 -0
  31. package/templates/runtime/react/controls-panel.test.tsx +3736 -0
  32. package/templates/runtime/react/controls-panel.tsx +2327 -0
  33. package/templates/runtime/react/curve-geometry.test.ts +70 -0
  34. package/templates/runtime/react/index.ts +15 -0
  35. package/templates/runtime/react/layer-tree.ts +96 -0
  36. package/templates/runtime/react/layers-panel.test.tsx +487 -0
  37. package/templates/runtime/react/layers-panel.tsx +1348 -0
  38. package/templates/runtime/react/media-file.ts +82 -0
  39. package/templates/runtime/react/panel-host-config.ts +80 -0
  40. package/templates/runtime/react/panel-host-geometry.test.ts +66 -0
  41. package/templates/runtime/react/panel-host-geometry.ts +109 -0
  42. package/templates/runtime/react/panel-host-types.ts +74 -0
  43. package/templates/runtime/react/panel-host.test.tsx +102 -0
  44. package/templates/runtime/react/panel-host.tsx +353 -0
  45. package/templates/runtime/react/runtime-public-api.test.tsx +132 -0
  46. package/templates/runtime/react/settings-transfer.test.ts +150 -0
  47. package/templates/runtime/react/settings-transfer.ts +279 -0
  48. package/templates/runtime/react/storage-key-migration.ts +48 -0
  49. package/templates/runtime/react/theme-runtime.tsx +177 -0
  50. package/templates/runtime/react/timeline-panel.test.tsx +668 -0
  51. package/templates/runtime/react/timeline-panel.tsx +2953 -0
  52. package/templates/runtime/react/toolbar-panel.test.tsx +212 -0
  53. package/templates/runtime/react/toolbar-panel.tsx +205 -0
  54. package/templates/runtime/react/toolcraft-app.integration.test.tsx +350 -0
  55. package/templates/runtime/react/toolcraft-app.test.tsx +339 -0
  56. package/templates/runtime/react/toolcraft-app.tsx +81 -0
  57. package/templates/runtime/react/toolcraft-root.test.tsx +347 -0
  58. package/templates/runtime/react/toolcraft-root.tsx +203 -0
  59. package/templates/runtime/react/use-toolcraft.ts +41 -0
  60. package/templates/runtime/schema/define-toolcraft.test.ts +1524 -0
  61. package/templates/runtime/schema/define-toolcraft.ts +1442 -0
  62. package/templates/runtime/schema/keyframe-capability.test.ts +90 -0
  63. package/templates/runtime/schema/keyframe-capability.ts +51 -0
  64. package/templates/runtime/schema/runtime-targets.ts +40 -0
  65. package/templates/runtime/schema/types.ts +370 -0
  66. package/templates/runtime/state/canvas-zoom.ts +8 -0
  67. package/templates/runtime/state/create-template-state.test.ts +242 -0
  68. package/templates/runtime/state/create-template-state.ts +95 -0
  69. package/templates/runtime/state/keyframe-evaluation.test.ts +141 -0
  70. package/templates/runtime/state/keyframe-evaluation.ts +203 -0
  71. package/templates/runtime/state/persistence.test.ts +217 -0
  72. package/templates/runtime/state/persistence.ts +511 -0
  73. package/templates/runtime/state/reducer.test.ts +937 -0
  74. package/templates/runtime/state/reducer.ts +1212 -0
  75. package/templates/runtime/state/timeline-readiness.ts +43 -0
  76. package/templates/runtime/state/types.ts +242 -0
  77. package/templates/runtime/styles.css +125 -0
  78. package/templates/runtime/testing/performance.test.ts +1058 -0
  79. package/templates/runtime/testing/performance.ts +1078 -0
  80. package/templates/starter/AGENTS.md +186 -0
  81. package/templates/starter/LICENSE.md +98 -0
  82. package/templates/starter/NOTICE.md +8 -0
  83. package/templates/starter/docs/toolcraft/README.md +41 -0
  84. package/templates/starter/docs/toolcraft/acceptance-testing.md +205 -0
  85. package/templates/starter/docs/toolcraft/agent-worklog.md +81 -0
  86. package/templates/starter/docs/toolcraft/assembly-workflow.md +206 -0
  87. package/templates/starter/docs/toolcraft/component-rules.md +299 -0
  88. package/templates/starter/docs/toolcraft/custom-controls.md +71 -0
  89. package/templates/starter/docs/toolcraft/decision-contract.md +71 -0
  90. package/templates/starter/docs/toolcraft/performance.md +112 -0
  91. package/templates/starter/docs/toolcraft/renderer-technique.md +48 -0
  92. package/templates/starter/docs/toolcraft/schema-reference.md +265 -0
  93. package/templates/starter/docs/toolcraft/workflow.md +87 -0
  94. package/templates/starter/e2e/app-browser-acceptance.spec.ts +785 -0
  95. package/templates/starter/e2e/app-controls.spec.ts +41 -0
  96. package/templates/starter/e2e/app-performance.spec.ts +326 -0
  97. package/templates/starter/e2e/canvas-handle-helpers.ts +244 -0
  98. package/templates/starter/e2e/performance-helpers.ts +612 -0
  99. package/templates/starter/e2e/product-observable-helpers.ts +170 -0
  100. package/templates/starter/index.html +12 -0
  101. package/templates/starter/package.json +52 -0
  102. package/templates/starter/playwright.config.ts +43 -0
  103. package/templates/starter/scripts/check-ai-skills.mjs +95 -0
  104. package/templates/starter/scripts/check-toolcraft-docs.mjs +159 -0
  105. package/templates/starter/scripts/check-toolcraft-integrity.mjs +232 -0
  106. package/templates/starter/scripts/run-vite-on-free-port.mjs +48 -0
  107. package/templates/starter/scripts/toolcraft-port.mjs +54 -0
  108. package/templates/starter/scripts/toolcraft-port.test.mjs +73 -0
  109. package/templates/starter/src/app/starter-acceptance.test.ts +5959 -0
  110. package/templates/starter/src/app/starter-acceptance.ts +2646 -0
  111. package/templates/starter/src/app/starter-performance.test.ts +1390 -0
  112. package/templates/starter/src/app/starter-performance.ts +12 -0
  113. package/templates/starter/src/app/starter-schema.test.ts +70 -0
  114. package/templates/starter/src/app/starter-schema.ts +15 -0
  115. package/templates/starter/src/main.tsx +18 -0
  116. package/templates/starter/src/router.tsx +16 -0
  117. package/templates/starter/src/routes/index.tsx +7 -0
  118. package/templates/starter/src/routes/root.tsx +19 -0
  119. package/templates/starter/src/styles.css +120 -0
  120. package/templates/starter/tsconfig.json +11 -0
  121. package/templates/starter/vite.config.ts +13 -0
  122. package/templates/ui/components/composites/accordion.tsx +73 -0
  123. package/templates/ui/components/composites/alert-dialog.tsx +190 -0
  124. package/templates/ui/components/composites/alert.tsx +74 -0
  125. package/templates/ui/components/composites/aspect-ratio.tsx +22 -0
  126. package/templates/ui/components/composites/avatar.tsx +98 -0
  127. package/templates/ui/components/composites/badge.tsx +69 -0
  128. package/templates/ui/components/composites/breadcrumb.tsx +106 -0
  129. package/templates/ui/components/composites/card.tsx +91 -0
  130. package/templates/ui/components/composites/combobox.tsx +486 -0
  131. package/templates/ui/components/composites/command.tsx +296 -0
  132. package/templates/ui/components/composites/context-menu.tsx +247 -0
  133. package/templates/ui/components/composites/dialog.tsx +282 -0
  134. package/templates/ui/components/composites/dropdown-menu.tsx +299 -0
  135. package/templates/ui/components/composites/empty.tsx +110 -0
  136. package/templates/ui/components/composites/hover-card.tsx +44 -0
  137. package/templates/ui/components/composites/index.ts +30 -0
  138. package/templates/ui/components/composites/menubar.tsx +214 -0
  139. package/templates/ui/components/composites/navigation-menu.tsx +167 -0
  140. package/templates/ui/components/composites/pagination.tsx +131 -0
  141. package/templates/ui/components/composites/progress.tsx +72 -0
  142. package/templates/ui/components/composites/radio-group.tsx +84 -0
  143. package/templates/ui/components/composites/resizable.tsx +42 -0
  144. package/templates/ui/components/composites/sheet.tsx +153 -0
  145. package/templates/ui/components/composites/sidebar-structural.tsx +310 -0
  146. package/templates/ui/components/composites/sidebar.tsx +431 -0
  147. package/templates/ui/components/composites/sonner.tsx +35 -0
  148. package/templates/ui/components/composites/spinner.tsx +43 -0
  149. package/templates/ui/components/composites/table.tsx +108 -0
  150. package/templates/ui/components/composites/tabs.tsx +83 -0
  151. package/templates/ui/components/control-layout/index.tsx +437 -0
  152. package/templates/ui/components/controls/actions/actions-control.tsx +139 -0
  153. package/templates/ui/components/controls/actions/index.ts +9 -0
  154. package/templates/ui/components/controls/anchor-grid/anchor-grid-control.tsx +107 -0
  155. package/templates/ui/components/controls/anchor-grid/index.ts +4 -0
  156. package/templates/ui/components/controls/boolean/boolean-controls.tsx +79 -0
  157. package/templates/ui/components/controls/boolean/index.ts +4 -0
  158. package/templates/ui/components/controls/channel-mixer/channel-mixer-control.tsx +95 -0
  159. package/templates/ui/components/controls/channel-mixer/index.ts +4 -0
  160. package/templates/ui/components/controls/channel-tabs/channel-tabs.tsx +42 -0
  161. package/templates/ui/components/controls/channel-tabs/index.ts +6 -0
  162. package/templates/ui/components/controls/code-textarea/code-textarea-control.tsx +90 -0
  163. package/templates/ui/components/controls/code-textarea/index.ts +4 -0
  164. package/templates/ui/components/controls/color/color-control.tsx +571 -0
  165. package/templates/ui/components/controls/color/color-picker-popover.tsx +104 -0
  166. package/templates/ui/components/controls/color/index.ts +41 -0
  167. package/templates/ui/components/controls/color/palette-control-data.ts +436 -0
  168. package/templates/ui/components/controls/color/palette-control.tsx +535 -0
  169. package/templates/ui/components/controls/color/style-guide-color-picker-channel-utils.ts +162 -0
  170. package/templates/ui/components/controls/color/style-guide-color-picker-interactions.ts +190 -0
  171. package/templates/ui/components/controls/color/style-guide-color-picker-logic.ts +485 -0
  172. package/templates/ui/components/controls/color/style-guide-color-picker-parts.tsx +710 -0
  173. package/templates/ui/components/controls/color/style-guide-color-picker.tsx +503 -0
  174. package/templates/ui/components/controls/control-types.ts +43 -0
  175. package/templates/ui/components/controls/curves/curve-geometry.ts +355 -0
  176. package/templates/ui/components/controls/curves/curve-graph.tsx +390 -0
  177. package/templates/ui/components/controls/curves/curves-control.tsx +445 -0
  178. package/templates/ui/components/controls/curves/index.ts +6 -0
  179. package/templates/ui/components/controls/file-drop/file-drop-control.tsx +191 -0
  180. package/templates/ui/components/controls/file-drop/index.ts +5 -0
  181. package/templates/ui/components/controls/font-picker/font-catalog.json +15360 -0
  182. package/templates/ui/components/controls/font-picker/font-catalog.ts +116 -0
  183. package/templates/ui/components/controls/font-picker/font-picker-control.tsx +1202 -0
  184. package/templates/ui/components/controls/font-picker/font-preview-loader.ts +336 -0
  185. package/templates/ui/components/controls/font-picker/index.ts +24 -0
  186. package/templates/ui/components/controls/font-picker/use-hover-intent.ts +46 -0
  187. package/templates/ui/components/controls/gradient/gradient-control-utils.ts +190 -0
  188. package/templates/ui/components/controls/gradient/gradient-control.tsx +612 -0
  189. package/templates/ui/components/controls/gradient/gradient-stop-list.tsx +400 -0
  190. package/templates/ui/components/controls/gradient/gradient-toolbar.tsx +152 -0
  191. package/templates/ui/components/controls/gradient/index.ts +4 -0
  192. package/templates/ui/components/controls/image-picker/image-picker-control.tsx +139 -0
  193. package/templates/ui/components/controls/image-picker/index.ts +7 -0
  194. package/templates/ui/components/controls/index.ts +192 -0
  195. package/templates/ui/components/controls/range-input/index.ts +4 -0
  196. package/templates/ui/components/controls/range-input/range-input-control.tsx +173 -0
  197. package/templates/ui/components/controls/range-slider/index.ts +4 -0
  198. package/templates/ui/components/controls/range-slider/range-slider-control.tsx +122 -0
  199. package/templates/ui/components/controls/range-slider/range-slider-value.ts +61 -0
  200. package/templates/ui/components/controls/segmented/index.ts +8 -0
  201. package/templates/ui/components/controls/segmented/segmented-control.tsx +94 -0
  202. package/templates/ui/components/controls/select/index.ts +4 -0
  203. package/templates/ui/components/controls/select/select-control.tsx +223 -0
  204. package/templates/ui/components/controls/slider/index.ts +4 -0
  205. package/templates/ui/components/controls/slider/slider-control.tsx +150 -0
  206. package/templates/ui/components/controls/slider/slider-value.ts +56 -0
  207. package/templates/ui/components/controls/text-input/index.ts +4 -0
  208. package/templates/ui/components/controls/text-input/text-input-control.tsx +158 -0
  209. package/templates/ui/components/controls/use-measured-element-width.ts +42 -0
  210. package/templates/ui/components/controls/vector/index.ts +8 -0
  211. package/templates/ui/components/controls/vector/vector-control.tsx +401 -0
  212. package/templates/ui/components/panel/index.ts +19 -0
  213. package/templates/ui/components/panel/panel-actions.tsx +165 -0
  214. package/templates/ui/components/panel/panel-header.tsx +61 -0
  215. package/templates/ui/components/panel/panel-icon-button.tsx +96 -0
  216. package/templates/ui/components/panel/panel-section.tsx +168 -0
  217. package/templates/ui/components/panel/panel-surface.tsx +206 -0
  218. package/templates/ui/components/panel/panel.tsx +210 -0
  219. package/templates/ui/components/primitives/animated-loader.tsx +61 -0
  220. package/templates/ui/components/primitives/button-group.tsx +134 -0
  221. package/templates/ui/components/primitives/button.tsx +429 -0
  222. package/templates/ui/components/primitives/checkbox.tsx +62 -0
  223. package/templates/ui/components/primitives/editable-slider-value-label.tsx +337 -0
  224. package/templates/ui/components/primitives/field.tsx +225 -0
  225. package/templates/ui/components/primitives/index.ts +82 -0
  226. package/templates/ui/components/primitives/input-group.tsx +298 -0
  227. package/templates/ui/components/primitives/input.tsx +61 -0
  228. package/templates/ui/components/primitives/internal/button-loading.tsx +178 -0
  229. package/templates/ui/components/primitives/label.tsx +16 -0
  230. package/templates/ui/components/primitives/popover.tsx +126 -0
  231. package/templates/ui/components/primitives/portal-layer-context.tsx +33 -0
  232. package/templates/ui/components/primitives/primitive-arrow-icon.tsx +38 -0
  233. package/templates/ui/components/primitives/scroll-fade-logic.ts +441 -0
  234. package/templates/ui/components/primitives/scroll-fade-render.tsx +75 -0
  235. package/templates/ui/components/primitives/scroll-fade-types.ts +41 -0
  236. package/templates/ui/components/primitives/scroll-fade.tsx +72 -0
  237. package/templates/ui/components/primitives/select.tsx +408 -0
  238. package/templates/ui/components/primitives/selection-state.ts +31 -0
  239. package/templates/ui/components/primitives/separator.tsx +21 -0
  240. package/templates/ui/components/primitives/slider/index.ts +4 -0
  241. package/templates/ui/components/primitives/slider/slider-interaction.tsx +96 -0
  242. package/templates/ui/components/primitives/slider/slider-parts.tsx +303 -0
  243. package/templates/ui/components/primitives/slider/slider-reset.ts +152 -0
  244. package/templates/ui/components/primitives/slider/slider-value.ts +114 -0
  245. package/templates/ui/components/primitives/slider/slider.tsx +511 -0
  246. package/templates/ui/components/primitives/switch.tsx +35 -0
  247. package/templates/ui/components/primitives/textarea.tsx +49 -0
  248. package/templates/ui/components/primitives/toggle-group.tsx +114 -0
  249. package/templates/ui/components/primitives/toggle.tsx +46 -0
  250. package/templates/ui/components/primitives/tooltip.tsx +100 -0
  251. package/templates/ui/hooks/use-mobile.ts +21 -0
  252. package/templates/ui/index.ts +31 -0
  253. package/templates/ui/lib/control-outline.ts +3 -0
  254. package/templates/ui/lib/input-control-style.ts +131 -0
  255. package/templates/ui/lib/style-guide-color-utils.ts +111 -0
  256. package/templates/ui/lib/utils.ts +6 -0
  257. package/templates/ui/styles.css +291 -0
@@ -0,0 +1,296 @@
1
+ "use client";
2
+
3
+ import * as React from "react";
4
+ import { Command as CommandPrimitive } from "cmdk";
5
+
6
+ import { cn } from "../../lib/utils";
7
+ import {
8
+ Dialog,
9
+ DialogContent,
10
+ DialogDescription,
11
+ DialogHeader,
12
+ DialogTitle,
13
+ } from "./dialog";
14
+ import { MagnifyingGlassIcon, CheckIcon } from "@phosphor-icons/react";
15
+ import { ScrollFade } from "../primitives";
16
+
17
+ const commandWindowFrameClassName =
18
+ "floating-popup-surface overflow-hidden rounded-3xl border popup-text-xs-plus text-[color:var(--popover-foreground)]";
19
+
20
+ const CommandWindowFrame = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(
21
+ ({ className, ...props }, ref) => {
22
+ return (
23
+ <div
24
+ data-slot="command-window-frame"
25
+ ref={ref}
26
+ className={cn(commandWindowFrameClassName, className)}
27
+ {...props}
28
+ />
29
+ );
30
+ },
31
+ );
32
+ CommandWindowFrame.displayName = "CommandWindowFrame";
33
+
34
+ function Command({ className, ...props }: React.ComponentProps<typeof CommandPrimitive>) {
35
+ return (
36
+ <CommandPrimitive
37
+ data-slot="command"
38
+ className={cn(
39
+ "floating-popup-fill flex w-full min-h-0 flex-col overflow-hidden rounded-3xl text-[color:var(--popover-foreground)]",
40
+ className,
41
+ )}
42
+ {...props}
43
+ />
44
+ );
45
+ }
46
+
47
+ function CommandDialog({
48
+ title = "Command Palette",
49
+ description = "Search for a command to run...",
50
+ children,
51
+ className,
52
+ showCloseButton = false,
53
+ ...props
54
+ }: Omit<React.ComponentProps<typeof Dialog>, "children"> & {
55
+ title?: string;
56
+ description?: string;
57
+ className?: string;
58
+ showCloseButton?: boolean;
59
+ children: React.ReactNode;
60
+ }) {
61
+ return (
62
+ <Dialog {...props}>
63
+ <DialogContent
64
+ className={cn(
65
+ commandWindowFrameClassName,
66
+ "top-1/3 translate-y-0 gap-0 rounded-3xl! p-0 ring-0",
67
+ className,
68
+ )}
69
+ showCloseButton={showCloseButton}
70
+ >
71
+ <DialogHeader className="sr-only">
72
+ <DialogTitle>{title}</DialogTitle>
73
+ <DialogDescription>{description}</DialogDescription>
74
+ </DialogHeader>
75
+ {children}
76
+ </DialogContent>
77
+ </Dialog>
78
+ );
79
+ }
80
+
81
+ const CommandInput = React.forwardRef<
82
+ React.ElementRef<typeof CommandPrimitive.Input>,
83
+ React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input> & {
84
+ leadingVisual?: React.ReactNode;
85
+ }
86
+ >(({ className, leadingVisual, ...props }, ref) => {
87
+ return (
88
+ <label
89
+ data-slot="command-input-wrapper"
90
+ className="flex w-full items-center gap-3 px-4 py-3 text-[color:var(--foreground)]"
91
+ >
92
+ <span
93
+ data-slot="command-input-leading-visual"
94
+ className="flex size-(--command-icon-size) shrink-0 items-center justify-center text-[color:var(--foreground)]"
95
+ >
96
+ {leadingVisual ?? <MagnifyingGlassIcon className="size-(--command-icon-size)" />}
97
+ </span>
98
+ <CommandPrimitive.Input
99
+ className={cn(
100
+ "w-full min-w-0 border-0 bg-transparent p-0 text-xs-plus leading-relaxed font-medium shadow-none outline-hidden placeholder:text-[color:var(--muted-foreground)] disabled:cursor-not-allowed disabled:opacity-50",
101
+ className,
102
+ )}
103
+ data-slot="command-input"
104
+ ref={ref}
105
+ {...props}
106
+ />
107
+ </label>
108
+ );
109
+ });
110
+ CommandInput.displayName = CommandPrimitive.Input.displayName;
111
+
112
+ const CommandTextInput = React.forwardRef<
113
+ HTMLInputElement,
114
+ React.ComponentPropsWithoutRef<"input"> & {
115
+ leadingVisual?: React.ReactNode;
116
+ typography?: "default" | "popup";
117
+ }
118
+ >(({ className, leadingVisual, typography = "popup", ...props }, ref) => {
119
+ return (
120
+ <label
121
+ data-slot="command-input-wrapper"
122
+ className="flex w-full items-center gap-3 px-4 py-3 text-[color:var(--foreground)]"
123
+ >
124
+ <span
125
+ data-slot="command-input-leading-visual"
126
+ className="flex size-(--command-icon-size) shrink-0 items-center justify-center text-[color:var(--foreground)]"
127
+ >
128
+ {leadingVisual ?? <MagnifyingGlassIcon className="size-(--command-icon-size)" />}
129
+ </span>
130
+ <input
131
+ aria-controls={props["aria-controls"] ?? "command-listbox"}
132
+ aria-autocomplete="list"
133
+ aria-expanded={props["aria-expanded"] ?? false}
134
+ autoComplete="off"
135
+ autoCorrect="off"
136
+ className={cn(
137
+ "w-full min-w-0 border-0 bg-transparent p-0 font-medium shadow-none outline-hidden placeholder:text-[color:var(--muted-foreground)] disabled:cursor-not-allowed disabled:opacity-50",
138
+ typography === "default" ? "text-base/relaxed" : "popup-text-xs-plus leading-relaxed",
139
+ className,
140
+ )}
141
+ data-slot="command-input"
142
+ ref={ref}
143
+ role="combobox"
144
+ spellCheck={false}
145
+ type="text"
146
+ {...props}
147
+ />
148
+ </label>
149
+ );
150
+ });
151
+ CommandTextInput.displayName = "CommandTextInput";
152
+
153
+ function CommandList({
154
+ className,
155
+ scrollFade = false,
156
+ scrollFadeClassName,
157
+ scrollFadeContainerClassName,
158
+ scrollFadeWatch = [],
159
+ ...props
160
+ }: React.ComponentProps<typeof CommandPrimitive.List> & {
161
+ scrollFade?: boolean;
162
+ scrollFadeClassName?: string;
163
+ scrollFadeContainerClassName?: string;
164
+ scrollFadeWatch?: readonly unknown[];
165
+ }) {
166
+ const commandList = (
167
+ <CommandPrimitive.List
168
+ data-slot="command-list"
169
+ className={cn(
170
+ "no-scrollbar max-h-72 min-h-0 scroll-pt-1 overflow-x-hidden overflow-y-auto outline-none **:[[cmdk-list-sizer]]:min-w-full",
171
+ scrollFade ? "max-h-none! overflow-visible!" : null,
172
+ className,
173
+ )}
174
+ {...props}
175
+ />
176
+ );
177
+
178
+ if (!scrollFade) {
179
+ return commandList;
180
+ }
181
+
182
+ return (
183
+ <ScrollFade
184
+ className={cn("max-h-72 scroll-pt-1", scrollFadeClassName)}
185
+ containerClassName={scrollFadeContainerClassName}
186
+ intensity="medium"
187
+ preset="large"
188
+ showOppositeSide
189
+ side="bottom"
190
+ watch={scrollFadeWatch}
191
+ >
192
+ {commandList}
193
+ </ScrollFade>
194
+ );
195
+ }
196
+
197
+ function CommandEmpty({
198
+ className,
199
+ ...props
200
+ }: React.ComponentProps<typeof CommandPrimitive.Empty>) {
201
+ return (
202
+ <CommandPrimitive.Empty
203
+ data-slot="command-empty"
204
+ className={cn(
205
+ "py-6 text-center popup-text-xs-plus leading-normal tracking-tight text-[color:color-mix(in_oklab,var(--foreground)_60%,transparent)]",
206
+ className,
207
+ )}
208
+ {...props}
209
+ />
210
+ );
211
+ }
212
+
213
+ function CommandGroup({
214
+ className,
215
+ ...props
216
+ }: React.ComponentProps<typeof CommandPrimitive.Group>) {
217
+ return (
218
+ <CommandPrimitive.Group
219
+ data-slot="command-group"
220
+ className={cn(
221
+ "overflow-hidden p-1.5 text-[color:var(--foreground)] **:[[cmdk-group-heading]]:px-2.5 **:[[cmdk-group-heading]]:py-1.5 **:[[cmdk-group-heading]]:font-medium **:[[cmdk-group-heading]]:text-[color:color-mix(in_oklab,var(--foreground)_60%,transparent)]",
222
+ className,
223
+ )}
224
+ {...props}
225
+ />
226
+ );
227
+ }
228
+
229
+ function CommandSeparator({
230
+ className,
231
+ ...props
232
+ }: React.ComponentProps<typeof CommandPrimitive.Separator>) {
233
+ return (
234
+ <CommandPrimitive.Separator
235
+ data-slot="command-separator"
236
+ className={cn("floating-popup-separator -mx-1 my-1 h-px", className)}
237
+ {...props}
238
+ />
239
+ );
240
+ }
241
+
242
+ function CommandItem({
243
+ active = false,
244
+ className,
245
+ children,
246
+ tintIconsOnSelect = true,
247
+ ...props
248
+ }: React.ComponentProps<typeof CommandPrimitive.Item> & {
249
+ active?: boolean;
250
+ tintIconsOnSelect?: boolean;
251
+ }) {
252
+ return (
253
+ <CommandPrimitive.Item
254
+ data-active={active ? "true" : "false"}
255
+ data-slot="command-item"
256
+ className={cn(
257
+ "group/command-item relative flex h-(--command-item-block-size) cursor-pointer items-center gap-2 rounded-md px-2.5 py-1.5 popup-text-xs-plus leading-normal tracking-tight font-medium outline-hidden select-none in-data-[slot=dialog-content]:rounded-md data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-selected:bg-[color:color-mix(in_oklab,var(--foreground)_4%,transparent)] data-selected:text-[color:var(--foreground)] data-[active=true]:bg-[color:color-mix(in_oklab,var(--foreground)_5%,transparent)] data-[active=true]:text-[color:var(--foreground)] [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-(--command-icon-size)",
258
+ tintIconsOnSelect
259
+ ? "data-selected:*:[svg]:text-[color:var(--foreground)] data-[active=true]:*:[svg]:text-[color:var(--foreground)]"
260
+ : null,
261
+ className,
262
+ )}
263
+ {...props}
264
+ >
265
+ {children}
266
+ <CheckIcon className="ml-auto opacity-0 group-has-data-[slot=command-shortcut]/command-item:hidden group-has-data-[slot=command-trailing-action]/command-item:hidden group-data-[checked=true]/command-item:opacity-100" />
267
+ </CommandPrimitive.Item>
268
+ );
269
+ }
270
+
271
+ function CommandShortcut({ className, ...props }: React.ComponentProps<"span">) {
272
+ return (
273
+ <span
274
+ data-slot="command-shortcut"
275
+ className={cn(
276
+ "ml-auto text-[0.625rem] tracking-widest text-[color:color-mix(in_oklab,var(--foreground)_60%,transparent)] group-data-selected/command-item:text-[color:color-mix(in_oklab,var(--foreground)_95%,transparent)] group-data-[active=true]/command-item:text-[color:var(--foreground)]",
277
+ className,
278
+ )}
279
+ {...props}
280
+ />
281
+ );
282
+ }
283
+
284
+ export {
285
+ Command,
286
+ CommandDialog,
287
+ CommandInput,
288
+ CommandTextInput,
289
+ CommandList,
290
+ CommandWindowFrame,
291
+ CommandEmpty,
292
+ CommandGroup,
293
+ CommandItem,
294
+ CommandShortcut,
295
+ CommandSeparator,
296
+ };
@@ -0,0 +1,247 @@
1
+ import * as React from "react";
2
+ import { ContextMenu as ContextMenuPrimitive } from "@base-ui/react/context-menu";
3
+
4
+ import { cn } from "../../lib/utils";
5
+ import { PrimitiveArrowIcon } from "../primitives";
6
+ import { CheckIcon } from "@phosphor-icons/react";
7
+
8
+ function ContextMenu({ ...props }: ContextMenuPrimitive.Root.Props) {
9
+ return <ContextMenuPrimitive.Root data-slot="context-menu" {...props} />;
10
+ }
11
+
12
+ function ContextMenuPortal({ ...props }: ContextMenuPrimitive.Portal.Props): React.JSX.Element {
13
+ return <ContextMenuPrimitive.Portal data-slot="context-menu-portal" {...props} />;
14
+ }
15
+
16
+ function ContextMenuTrigger({ className, ...props }: ContextMenuPrimitive.Trigger.Props) {
17
+ return (
18
+ <ContextMenuPrimitive.Trigger
19
+ data-slot="context-menu-trigger"
20
+ className={cn("select-none", className)}
21
+ {...props}
22
+ />
23
+ );
24
+ }
25
+
26
+ function ContextMenuContent({
27
+ className,
28
+ align = "start",
29
+ alignOffset = 4,
30
+ side = "right",
31
+ sideOffset = 0,
32
+ ...props
33
+ }: ContextMenuPrimitive.Popup.Props &
34
+ Pick<ContextMenuPrimitive.Positioner.Props, "align" | "alignOffset" | "side" | "sideOffset">) {
35
+ return (
36
+ <ContextMenuPrimitive.Portal>
37
+ <ContextMenuPrimitive.Positioner
38
+ className="isolate z-50 outline-none"
39
+ align={align}
40
+ alignOffset={alignOffset}
41
+ side={side}
42
+ sideOffset={sideOffset}
43
+ >
44
+ <ContextMenuPrimitive.Popup
45
+ data-slot="context-menu-content"
46
+ className={cn(
47
+ "floating-popup-surface z-50 max-h-(--available-height) min-w-32 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg border p-1 popup-text-xs-plus text-[color:var(--popover-foreground)] duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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",
48
+ className,
49
+ )}
50
+ {...props}
51
+ />
52
+ </ContextMenuPrimitive.Positioner>
53
+ </ContextMenuPrimitive.Portal>
54
+ );
55
+ }
56
+
57
+ function ContextMenuGroup({ ...props }: ContextMenuPrimitive.Group.Props) {
58
+ return <ContextMenuPrimitive.Group data-slot="context-menu-group" {...props} />;
59
+ }
60
+
61
+ function ContextMenuLabel({
62
+ className,
63
+ inset,
64
+ ...props
65
+ }: ContextMenuPrimitive.GroupLabel.Props & {
66
+ inset?: boolean;
67
+ }) {
68
+ return (
69
+ <ContextMenuPrimitive.GroupLabel
70
+ data-slot="context-menu-label"
71
+ data-inset={inset}
72
+ className={cn(
73
+ "px-2 py-1.5 popup-text-xs-plus text-[color:color-mix(in_oklab,var(--foreground)_60%,transparent)] data-inset:pl-7.5",
74
+ className,
75
+ )}
76
+ {...props}
77
+ />
78
+ );
79
+ }
80
+
81
+ function ContextMenuItem({
82
+ className,
83
+ inset,
84
+ variant = "default",
85
+ ...props
86
+ }: ContextMenuPrimitive.Item.Props & {
87
+ inset?: boolean;
88
+ variant?: "default" | "destructive";
89
+ }) {
90
+ return (
91
+ <ContextMenuPrimitive.Item
92
+ data-slot="context-menu-item"
93
+ data-inset={inset}
94
+ data-variant={variant}
95
+ className={cn(
96
+ "group/context-menu-item relative flex min-h-7 cursor-pointer items-center gap-2 rounded-md px-2 py-1 popup-text-xs-plus leading-normal tracking-tight font-medium outline-hidden select-none hover:bg-[color:color-mix(in_oklab,var(--foreground)_5%,transparent)] focus:bg-[color:color-mix(in_oklab,var(--foreground)_5%,transparent)] focus:text-[color:var(--accent-foreground)] not-data-[variant=destructive]:focus:**:text-[color:var(--accent-foreground)] data-inset:pl-7.5 data-[variant=destructive]:text-[color:var(--destructive)] data-[variant=destructive]:hover:bg-[color:color-mix(in_oklab,var(--destructive)_10%,transparent)] data-[variant=destructive]:focus:bg-[color:color-mix(in_oklab,var(--destructive)_10%,transparent)] data-[variant=destructive]:focus:text-[color:var(--destructive)] data-[variant=destructive]:[&_[data-slot=context-menu-shortcut]]:text-[color:var(--destructive)] data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3.5 data-[variant=destructive]:*:[svg]:text-[color:var(--destructive)]",
97
+ className,
98
+ )}
99
+ {...props}
100
+ />
101
+ );
102
+ }
103
+
104
+ function ContextMenuSub({ ...props }: ContextMenuPrimitive.SubmenuRoot.Props) {
105
+ return <ContextMenuPrimitive.SubmenuRoot data-slot="context-menu-sub" {...props} />;
106
+ }
107
+
108
+ function ContextMenuSubTrigger({
109
+ className,
110
+ inset,
111
+ children,
112
+ ...props
113
+ }: ContextMenuPrimitive.SubmenuTrigger.Props & {
114
+ inset?: boolean;
115
+ }) {
116
+ return (
117
+ <ContextMenuPrimitive.SubmenuTrigger
118
+ data-slot="context-menu-sub-trigger"
119
+ data-inset={inset}
120
+ className={cn(
121
+ "flex min-h-7 cursor-pointer items-center gap-2 rounded-md px-2 py-1 popup-text-xs-plus leading-normal tracking-tight font-medium outline-hidden select-none hover:bg-[color:color-mix(in_oklab,var(--foreground)_5%,transparent)] focus:bg-[color:color-mix(in_oklab,var(--foreground)_5%,transparent)] focus:text-[color:var(--accent-foreground)] not-data-[variant=destructive]:focus:**:text-[color:var(--accent-foreground)] data-inset:pl-7.5 data-open:bg-[color:color-mix(in_oklab,var(--foreground)_5%,transparent)] data-open:text-[color:var(--accent-foreground)] [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3.5",
122
+ className,
123
+ )}
124
+ {...props}
125
+ >
126
+ {children}
127
+ <PrimitiveArrowIcon className="ml-auto" direction="right" />
128
+ </ContextMenuPrimitive.SubmenuTrigger>
129
+ );
130
+ }
131
+
132
+ function ContextMenuSubContent({
133
+ className,
134
+ ...props
135
+ }: React.ComponentProps<typeof ContextMenuContent>) {
136
+ return (
137
+ <ContextMenuContent
138
+ data-slot="context-menu-sub-content"
139
+ className={className}
140
+ side="right"
141
+ {...props}
142
+ />
143
+ );
144
+ }
145
+
146
+ function ContextMenuCheckboxItem({
147
+ className,
148
+ children,
149
+ checked,
150
+ inset,
151
+ ...props
152
+ }: ContextMenuPrimitive.CheckboxItem.Props & {
153
+ inset?: boolean;
154
+ }) {
155
+ return (
156
+ <ContextMenuPrimitive.CheckboxItem
157
+ data-slot="context-menu-checkbox-item"
158
+ data-inset={inset}
159
+ className={cn(
160
+ "relative flex min-h-7 cursor-pointer items-center gap-2 rounded-md py-1.5 pr-8 pl-2 popup-text-xs-plus leading-normal tracking-tight font-medium outline-hidden select-none hover:bg-[color:color-mix(in_oklab,var(--foreground)_5%,transparent)] focus:bg-[color:color-mix(in_oklab,var(--foreground)_5%,transparent)] focus:text-[color:var(--accent-foreground)] focus:**:text-[color:var(--accent-foreground)] data-inset:pl-7.5 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3.5",
161
+ className,
162
+ )}
163
+ checked={checked}
164
+ {...props}
165
+ >
166
+ <span className="pointer-events-none absolute right-2 flex items-center justify-center">
167
+ <ContextMenuPrimitive.CheckboxItemIndicator>
168
+ <CheckIcon />
169
+ </ContextMenuPrimitive.CheckboxItemIndicator>
170
+ </span>
171
+ {children}
172
+ </ContextMenuPrimitive.CheckboxItem>
173
+ );
174
+ }
175
+
176
+ function ContextMenuRadioGroup({ ...props }: ContextMenuPrimitive.RadioGroup.Props) {
177
+ return <ContextMenuPrimitive.RadioGroup data-slot="context-menu-radio-group" {...props} />;
178
+ }
179
+
180
+ function ContextMenuRadioItem({
181
+ className,
182
+ children,
183
+ inset,
184
+ ...props
185
+ }: ContextMenuPrimitive.RadioItem.Props & {
186
+ inset?: boolean;
187
+ }) {
188
+ return (
189
+ <ContextMenuPrimitive.RadioItem
190
+ data-slot="context-menu-radio-item"
191
+ data-inset={inset}
192
+ className={cn(
193
+ "relative flex min-h-7 cursor-pointer items-center gap-2 rounded-md py-1.5 pr-8 pl-2 popup-text-xs-plus leading-normal tracking-tight font-medium outline-hidden select-none hover:bg-[color:color-mix(in_oklab,var(--foreground)_5%,transparent)] focus:bg-[color:color-mix(in_oklab,var(--foreground)_5%,transparent)] focus:text-[color:var(--accent-foreground)] focus:**:text-[color:var(--accent-foreground)] data-inset:pl-7.5 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3.5",
194
+ className,
195
+ )}
196
+ {...props}
197
+ >
198
+ <span className="pointer-events-none absolute right-2 flex items-center justify-center">
199
+ <ContextMenuPrimitive.RadioItemIndicator>
200
+ <CheckIcon />
201
+ </ContextMenuPrimitive.RadioItemIndicator>
202
+ </span>
203
+ {children}
204
+ </ContextMenuPrimitive.RadioItem>
205
+ );
206
+ }
207
+
208
+ function ContextMenuSeparator({ className, ...props }: ContextMenuPrimitive.Separator.Props) {
209
+ return (
210
+ <ContextMenuPrimitive.Separator
211
+ data-slot="context-menu-separator"
212
+ className={cn("floating-popup-separator -mx-1 my-1 h-px", className)}
213
+ {...props}
214
+ />
215
+ );
216
+ }
217
+
218
+ function ContextMenuShortcut({ className, ...props }: React.ComponentProps<"span">) {
219
+ return (
220
+ <span
221
+ data-slot="context-menu-shortcut"
222
+ className={cn(
223
+ "ml-auto text-[0.625rem] tracking-widest text-[color:color-mix(in_oklab,var(--foreground)_60%,transparent)] group-focus/context-menu-item:text-[color:var(--accent-foreground)]",
224
+ className,
225
+ )}
226
+ {...props}
227
+ />
228
+ );
229
+ }
230
+
231
+ export {
232
+ ContextMenu,
233
+ ContextMenuTrigger,
234
+ ContextMenuContent,
235
+ ContextMenuItem,
236
+ ContextMenuCheckboxItem,
237
+ ContextMenuRadioItem,
238
+ ContextMenuLabel,
239
+ ContextMenuSeparator,
240
+ ContextMenuShortcut,
241
+ ContextMenuGroup,
242
+ ContextMenuPortal,
243
+ ContextMenuSub,
244
+ ContextMenuSubContent,
245
+ ContextMenuSubTrigger,
246
+ ContextMenuRadioGroup,
247
+ };