@macroscope/cli 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.
@@ -0,0 +1,177 @@
1
+ /**
2
+ * The locked substrate contract. The v1 control layer extends this interface;
3
+ * it never bypasses it.
4
+ *
5
+ * A `Handler` is what a blueprint exports. It declares a `kind` and zero or more
6
+ * optional async operations. Each operation returns data — never side effects —
7
+ * and never throws "not implemented"; missing methods simply mean the operation
8
+ * isn't supported for that kind.
9
+ *
10
+ * No top-level side effects on import. Importing a handler must not spawn
11
+ * processes, open ports, or read files. Side effects belong inside methods.
12
+ *
13
+ * Trust model: blueprints are USER-AUTHORED CODE in the user's own project.
14
+ * The loader imports them via jiti and runs them at full process privilege.
15
+ * This is the same trust model as a `package.json` postinstall script, an
16
+ * ESLint plugin, a Storybook addon, or a vite.config.ts — code in your repo
17
+ * runs as you. There is no sandbox. If you do not trust a blueprint, do not
18
+ * put it in your project.
19
+ */
20
+ interface Handler {
21
+ /** Required. Must match the blueprint folder name. */
22
+ kind: string;
23
+ /** Named views shown as tabs in the block-detail page. v1 ships iframe + terminal types. */
24
+ views?: Record<string, ViewSpec>;
25
+ /** Produce something the UI/CLI/MCP can display for this block. */
26
+ render?: (block: Block) => Promise<RenderResult>;
27
+ /** Run whatever counts as a test for this kind. */
28
+ test?: (block: Block) => Promise<TestResult>;
29
+ /** Produce build artifacts for this kind. */
30
+ build?: (block: Block) => Promise<BuildResult>;
31
+ /** Create a new block of this kind in `targetDir` with the given name. */
32
+ scaffold?: (targetDir: string, name: string) => Promise<void>;
33
+ /** Generate a free-form textual description of a block, used by semantic search. */
34
+ describe?: (block: Block) => Promise<string>;
35
+ }
36
+ /**
37
+ * A block is an instance of a kind: a folder somewhere in the user's project
38
+ * with a `macroscope.yaml`. Handlers receive these as input.
39
+ *
40
+ * For M0 (this PR) we don't actually load blocks yet — this type exists so the
41
+ * Handler interface can be locked.
42
+ */
43
+ interface Block {
44
+ /** Stable identifier. POSIX relative path from project root by default; overridable via the manifest `id` field. */
45
+ id: string;
46
+ /** Absolute path to the block's folder. */
47
+ path: string;
48
+ /** Parsed and validated manifest. */
49
+ manifest: BlockManifest;
50
+ }
51
+ /**
52
+ * The manifest is the data side of a block (the `macroscope.yaml`). The shape
53
+ * here is the substrate's view of it; individual blueprints may require
54
+ * additional fields under their own `kind`.
55
+ */
56
+ interface BlockManifest {
57
+ /** Must reference a registered blueprint's `kind`. */
58
+ kind: string;
59
+ /** Optional override for the auto-derived block id. */
60
+ id?: string;
61
+ name?: string;
62
+ description?: string;
63
+ tags?: string[];
64
+ source?: string;
65
+ preview?: string;
66
+ docs?: string;
67
+ tests?: string | string[];
68
+ /** Unknown fields pass through to handlers per the v0 spec — never errors. */
69
+ [field: string]: unknown;
70
+ }
71
+ /**
72
+ * A view is one tab in the block-detail page. Three view types exist:
73
+ * - iframe: embed any URL the blueprint resolves.
74
+ * - terminal: spawn the resolved command server-side and stream its
75
+ * stdin/stdout/stderr to a browser xterm.js terminal.
76
+ * - hybrid: combine a static artifact (iframe URL) with an on-demand
77
+ * command (terminal). UI shows the URL by default and a Run button
78
+ * that switches to the terminal and spawns the command.
79
+ */
80
+ type ViewSpec = IframeViewSpec | TerminalViewSpec | HybridViewSpec;
81
+ interface IframeViewSpec {
82
+ type: 'iframe';
83
+ url: string | ((block: Block) => string | Promise<string>);
84
+ /** Optional backing service. macroscope spawns this on demand the first time the
85
+ * view is opened in the UI, polls readyWhen.url, and only loads the iframe
86
+ * once the service responds. */
87
+ service?: ServiceSpec;
88
+ }
89
+ interface ServiceSpec {
90
+ /** Human-readable label shown in the "starting…" state. Defaults to command[0]. */
91
+ name?: string;
92
+ /** argv-style command. Function form is resolved server-side per block. */
93
+ command: string[] | ((block: Block) => string[] | Promise<string[]>);
94
+ /** Working directory. Defaults to project root. */
95
+ cwd?: string | ((block: Block) => string | Promise<string>);
96
+ /** Service is ready when this URL responds with any non-5xx status. */
97
+ readyWhen: {
98
+ url: string;
99
+ };
100
+ /** Max ms to wait for readiness before declaring failure. Default: 30_000. */
101
+ startupTimeoutMs?: number;
102
+ }
103
+ interface TerminalViewSpec {
104
+ type: 'terminal';
105
+ /** argv-style: ['vitest', 'run', '<file>']. Function form is resolved server-side per block. */
106
+ command: string[] | ((block: Block) => string[] | Promise<string[]>);
107
+ }
108
+ /**
109
+ * A hybrid view shows a static artifact (e.g. test source code) by default and
110
+ * lets the user switch to a terminal that runs an on-demand command (e.g.
111
+ * `vitest run`) via a Run button. Useful for "read code → press button → see
112
+ * what happens → toggle back" workflows.
113
+ */
114
+ interface HybridViewSpec {
115
+ type: 'hybrid';
116
+ /** Static artifact URL. Same semantics as IframeViewSpec.url. */
117
+ url: string | ((block: Block) => string | Promise<string>);
118
+ /** On-demand command. Same semantics as TerminalViewSpec.command. */
119
+ command: string[] | ((block: Block) => string[] | Promise<string[]>);
120
+ /** Label for the Run button. Default: "Run". */
121
+ runLabel?: string;
122
+ /** Label for the code-side toggle. Default: "Code". */
123
+ codeLabel?: string;
124
+ /** Label for the terminal-side toggle. Default: "Terminal". */
125
+ terminalLabel?: string;
126
+ }
127
+ type RenderResult = {
128
+ type: 'iframe';
129
+ entry: string;
130
+ } | {
131
+ type: 'html';
132
+ html: string;
133
+ } | {
134
+ type: 'markdown';
135
+ source: string;
136
+ } | {
137
+ type: 'image';
138
+ src: string;
139
+ } | {
140
+ type: 'error';
141
+ message: string;
142
+ } | {
143
+ type: 'none';
144
+ reason: string;
145
+ };
146
+ type TestResult = {
147
+ type: 'pass';
148
+ output?: string;
149
+ } | {
150
+ type: 'fail';
151
+ output: string;
152
+ } | {
153
+ type: 'error';
154
+ message: string;
155
+ } | {
156
+ type: 'none';
157
+ reason: string;
158
+ };
159
+ type BuildResult = {
160
+ type: 'ok';
161
+ artifacts?: string[];
162
+ } | {
163
+ type: 'error';
164
+ message: string;
165
+ } | {
166
+ type: 'none';
167
+ reason: string;
168
+ };
169
+ /**
170
+ * Convenience type guard for runtime validation. Used by the blueprint loader
171
+ * to verify that a default export looks like a Handler before accepting it.
172
+ */
173
+ declare function isHandler(value: unknown): value is Handler;
174
+
175
+ declare const VERSION = "0.0.0";
176
+
177
+ export { type Block as B, type Handler as H, type RenderResult as R, type TestResult as T, VERSION as V, type BlockManifest as a, type BuildResult as b, isHandler as i };
@@ -0,0 +1 @@
1
+ export { B as Block, a as BlockManifest, b as BuildResult, H as Handler, R as RenderResult, T as TestResult, V as VERSION } from './index-BTDioymD.js';
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ // src/core/version.ts
2
+ var VERSION = "0.0.0";
3
+ export {
4
+ VERSION
5
+ };
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/version.ts"],"sourcesContent":["export const VERSION = '0.0.0';\n"],"mappings":";AAAO,IAAM,UAAU;","names":[]}
@@ -0,0 +1 @@
1
+ .xterm{cursor:text;-webkit-user-select:none;user-select:none;position:relative}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{z-index:5;position:absolute;top:0}.xterm .xterm-helper-textarea{opacity:0;z-index:-5;white-space:nowrap;resize:none;border:0;width:0;height:0;margin:0;padding:0;position:absolute;top:0;left:-9999em;overflow:hidden}.xterm .composition-view{color:#fff;white-space:nowrap;z-index:1;background:#000;display:none;position:absolute}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{cursor:default;background-color:#000;position:absolute;inset:0;overflow-y:scroll}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;top:0;left:0}.xterm-char-measure-element{visibility:hidden;line-height:normal;display:inline-block;position:absolute;top:0;left:-9999em}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{z-index:10;color:#0000;pointer-events:none;position:absolute;inset:0}.xterm .xterm-accessibility-tree:not(.debug) ::selection{color:#0000}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre;font-family:monospace}.xterm .xterm-accessibility-tree>div{transform-origin:0;width:-moz-fit-content;width:fit-content}.xterm .live-region{width:1px;height:1px;position:absolute;left:-9999px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{-webkit-text-decoration:underline double;text-decoration:underline double}.xterm-underline-3{-webkit-text-decoration:underline wavy;text-decoration:underline wavy}.xterm-underline-4{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.xterm-underline-5{-webkit-text-decoration:underline dashed;text-decoration:underline dashed}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:underline overline}.xterm-overline.xterm-underline-2{-webkit-text-decoration:overline double underline;text-decoration:overline double underline}.xterm-overline.xterm-underline-3{-webkit-text-decoration:overline wavy underline;text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{-webkit-text-decoration:overline dotted underline;text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{-webkit-text-decoration:overline dashed underline;text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;pointer-events:none;position:absolute;top:0;right:0}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;z-index:11;background:0 0;transition:opacity .1s linear}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{display:none;position:absolute}.xterm .xterm-scrollable-element>.shadow.top{width:100%;height:3px;box-shadow:var(--vscode-scrollbar-shadow,#000) 0 6px 6px -6px inset;display:block;top:0;left:3px}.xterm .xterm-scrollable-element>.shadow.left{width:3px;height:100%;box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset;display:block;top:3px;left:0}.xterm .xterm-scrollable-element>.shadow.top-left-corner{width:3px;height:3px;display:block;top:0;left:0}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset}@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after{--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial}::backdrop{--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-amber-50:#fffbeb;--color-amber-200:#fee685;--color-rose-50:#fff1f2;--color-rose-200:#ffccd3;--color-zinc-50:#fafafa;--color-zinc-100:#f4f4f5;--color-zinc-200:#e4e4e7;--color-zinc-300:#d4d4d8;--color-zinc-500:#71717b;--color-zinc-600:#52525c;--color-zinc-700:#3f3f46;--color-zinc-800:#27272a;--color-zinc-900:#18181b;--color-white:#fff;--spacing:.25rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--tracking-wider:.05em;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}@supports (color:lab(0% 0 0)){:root,:host{--color-amber-50:lab(98.6252% -.635922 8.42309);--color-amber-200:lab(91.7203% -.505269 49.9084);--color-rose-50:lab(96.2369% 4.94155 1.28011);--color-rose-200:lab(86.806% 19.1909 4.07754);--color-zinc-50:lab(98.26% 0 0);--color-zinc-100:lab(96.1634% .0993311 -.364041);--color-zinc-200:lab(90.6853% .399232 -1.45452);--color-zinc-300:lab(84.9837% .601262 -2.17986);--color-zinc-500:lab(47.8878% 1.65477 -5.77283);--color-zinc-600:lab(35.1166% 1.78212 -6.1173);--color-zinc-700:lab(26.8019% 1.35387 -4.68303);--color-zinc-800:lab(15.7305% .613764 -2.16959);--color-zinc-900:lab(8.30603% .618205 -2.16572)}}}@layer base{*,:after,:before{box-sizing:border-box;border:0 solid;margin:0;padding:0}::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.absolute{position:absolute}.static{position:static}.mx-auto{margin-inline:auto}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.block{display:block}.flex{display:flex}.hidden{display:none}.inline-flex{display:inline-flex}.h-\[400px\]{height:400px}.h-\[600px\]{height:600px}.max-h-48{max-height:calc(var(--spacing) * 48)}.min-h-screen{min-height:100vh}.w-full{width:100%}.max-w-4xl{max-width:var(--container-4xl)}.list-disc{list-style-type:disc}.items-center{align-items:center}.justify-between{justify-content:space-between}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-zinc-200>:not(:last-child)){border-color:var(--color-zinc-200)}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.rounded{border-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-amber-200{border-color:var(--color-amber-200)}.border-rose-200{border-color:var(--color-rose-200)}.border-zinc-200{border-color:var(--color-zinc-200)}.border-zinc-300{border-color:var(--color-zinc-300)}.border-zinc-800{border-color:var(--color-zinc-800)}.border-zinc-900{border-color:var(--color-zinc-900)}.bg-\[\#0b1020\]{background-color:#0b1020}.bg-amber-50{background-color:var(--color-amber-50)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-white{background-color:var(--color-white)}.bg-zinc-50{background-color:var(--color-zinc-50)}.bg-zinc-900{background-color:var(--color-zinc-900)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-8{padding-block:calc(var(--spacing) * 8)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.text-left{text-align:left}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-pre-wrap{white-space:pre-wrap}.text-white{color:var(--color-white)}.text-zinc-100{color:var(--color-zinc-100)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-600{color:var(--color-zinc-600)}.text-zinc-700{color:var(--color-zinc-700)}.text-zinc-900{color:var(--color-zinc-900)}.uppercase{text-transform:uppercase}@media (hover:hover){.hover\:bg-zinc-50:hover{background-color:var(--color-zinc-50)}.hover\:bg-zinc-100:hover{background-color:var(--color-zinc-100)}.hover\:bg-zinc-700:hover{background-color:var(--color-zinc-700)}.hover\:text-zinc-700:hover{color:var(--color-zinc-700)}.hover\:text-zinc-900:hover{color:var(--color-zinc-900)}}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:text-zinc-300:disabled{color:var(--color-zinc-300)}@media (hover:hover){.disabled\:hover\:bg-transparent:disabled:hover{background-color:#0000}}}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}