@hanzo/ui 8.27.9 → 8.27.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/backends/gui/3d-card.cjs +100 -0
- package/dist/backends/gui/3d-card.d.ts +59 -0
- package/dist/backends/gui/3d-card.d.ts.map +1 -0
- package/dist/backends/gui/3d-card.js +92 -0
- package/dist/backends/gui/3d-card.js.map +1 -0
- package/dist/backends/gui/3d-marquee.cjs +225 -0
- package/dist/backends/gui/3d-marquee.d.ts +114 -0
- package/dist/backends/gui/3d-marquee.d.ts.map +1 -0
- package/dist/backends/gui/3d-marquee.js +190 -0
- package/dist/backends/gui/3d-marquee.js.map +1 -0
- package/dist/backends/gui/3d-pin.cjs +51 -0
- package/dist/backends/gui/3d-pin.d.ts +14 -0
- package/dist/backends/gui/3d-pin.d.ts.map +1 -0
- package/dist/backends/gui/3d-pin.js +49 -0
- package/dist/backends/gui/3d-pin.js.map +1 -0
- package/dist/backends/gui/advanced-chart.cjs +61 -0
- package/dist/backends/gui/advanced-chart.d.ts +38 -0
- package/dist/backends/gui/advanced-chart.d.ts.map +1 -0
- package/dist/backends/gui/advanced-chart.js +59 -0
- package/dist/backends/gui/advanced-chart.js.map +1 -0
- package/dist/backends/gui/alert.cjs +106 -0
- package/dist/backends/gui/alert.d.ts +39 -0
- package/dist/backends/gui/alert.d.ts.map +1 -0
- package/dist/backends/gui/alert.js +102 -0
- package/dist/backends/gui/alert.js.map +1 -0
- package/dist/backends/gui/android.cjs +52 -0
- package/dist/backends/gui/android.d.ts +16 -0
- package/dist/backends/gui/android.d.ts.map +1 -0
- package/dist/backends/gui/android.js +50 -0
- package/dist/backends/gui/android.js.map +1 -0
- package/dist/backends/gui/animated-beam.cjs +97 -0
- package/dist/backends/gui/animated-beam.d.ts +57 -0
- package/dist/backends/gui/animated-beam.d.ts.map +1 -0
- package/dist/backends/gui/animated-beam.js +62 -0
- package/dist/backends/gui/animated-beam.js.map +1 -0
- package/dist/backends/gui/animated-cursor.cjs +183 -0
- package/dist/backends/gui/animated-cursor.d.ts +42 -0
- package/dist/backends/gui/animated-cursor.d.ts.map +1 -0
- package/dist/backends/gui/animated-cursor.js +181 -0
- package/dist/backends/gui/animated-cursor.js.map +1 -0
- package/dist/backends/gui/animated-testimonials.cjs +109 -0
- package/dist/backends/gui/animated-testimonials.d.ts +23 -0
- package/dist/backends/gui/animated-testimonials.d.ts.map +1 -0
- package/dist/backends/gui/animated-testimonials.js +74 -0
- package/dist/backends/gui/animated-testimonials.js.map +1 -0
- package/dist/backends/gui/animated-tooltip.cjs +100 -0
- package/dist/backends/gui/animated-tooltip.d.ts +15 -0
- package/dist/backends/gui/animated-tooltip.d.ts.map +1 -0
- package/dist/backends/gui/animated-tooltip.js +65 -0
- package/dist/backends/gui/animated-tooltip.js.map +1 -0
- package/dist/backends/gui/announcement.cjs +54 -0
- package/dist/backends/gui/announcement.d.ts +26 -0
- package/dist/backends/gui/announcement.d.ts.map +1 -0
- package/dist/backends/gui/announcement.js +52 -0
- package/dist/backends/gui/announcement.js.map +1 -0
- package/dist/backends/gui/apple-cards-carousel.cjs +198 -0
- package/dist/backends/gui/apple-cards-carousel.d.ts +45 -0
- package/dist/backends/gui/apple-cards-carousel.d.ts.map +1 -0
- package/dist/backends/gui/apple-cards-carousel.js +162 -0
- package/dist/backends/gui/apple-cards-carousel.js.map +1 -0
- package/dist/backends/gui/apple-hello-effect.cjs +38 -0
- package/dist/backends/gui/apple-hello-effect.d.ts +9 -0
- package/dist/backends/gui/apple-hello-effect.d.ts.map +1 -0
- package/dist/backends/gui/apple-hello-effect.js +36 -0
- package/dist/backends/gui/apple-hello-effect.js.map +1 -0
- package/dist/backends/gui/banner.cjs +108 -0
- package/dist/backends/gui/banner.d.ts +33 -0
- package/dist/backends/gui/banner.d.ts.map +1 -0
- package/dist/backends/gui/banner.js +106 -0
- package/dist/backends/gui/banner.js.map +1 -0
- package/dist/backends/gui/calendar.cjs +152 -0
- package/dist/backends/gui/calendar.d.ts +41 -0
- package/dist/backends/gui/calendar.d.ts.map +1 -0
- package/dist/backends/gui/calendar.js +151 -0
- package/dist/backends/gui/calendar.js.map +1 -0
- package/dist/backends/gui/choicebox.cjs +50 -0
- package/dist/backends/gui/choicebox.d.ts +33 -0
- package/dist/backends/gui/choicebox.d.ts.map +1 -0
- package/dist/backends/gui/choicebox.js +49 -0
- package/dist/backends/gui/choicebox.js.map +1 -0
- package/dist/backends/gui/code-block.cjs +120 -0
- package/dist/backends/gui/code-block.d.ts +22 -0
- package/dist/backends/gui/code-block.d.ts.map +1 -0
- package/dist/backends/gui/code-block.js +118 -0
- package/dist/backends/gui/code-block.js.map +1 -0
- package/dist/backends/gui/code-editor.cjs +195 -0
- package/dist/backends/gui/code-editor.d.ts +43 -0
- package/dist/backends/gui/code-editor.d.ts.map +1 -0
- package/dist/backends/gui/code-editor.js +160 -0
- package/dist/backends/gui/code-editor.js.map +1 -0
- package/dist/backends/gui/code-tabs.cjs +21 -0
- package/dist/backends/gui/code-tabs.d.ts +22 -0
- package/dist/backends/gui/code-tabs.d.ts.map +1 -0
- package/dist/backends/gui/code-tabs.js +19 -0
- package/dist/backends/gui/code-tabs.js.map +1 -0
- package/dist/backends/gui/color-picker.cjs +141 -0
- package/dist/backends/gui/color-picker.d.ts +25 -0
- package/dist/backends/gui/color-picker.d.ts.map +1 -0
- package/dist/backends/gui/color-picker.js +139 -0
- package/dist/backends/gui/color-picker.js.map +1 -0
- package/dist/backends/gui/combobox.cjs +42 -0
- package/dist/backends/gui/combobox.d.ts +39 -0
- package/dist/backends/gui/combobox.d.ts.map +1 -0
- package/dist/backends/gui/combobox.js +40 -0
- package/dist/backends/gui/combobox.js.map +1 -0
- package/dist/backends/gui/company-profile.cjs +43 -0
- package/dist/backends/gui/company-profile.d.ts +33 -0
- package/dist/backends/gui/company-profile.d.ts.map +1 -0
- package/dist/backends/gui/company-profile.js +41 -0
- package/dist/backends/gui/company-profile.js.map +1 -0
- package/dist/backends/gui/comparison.cjs +43 -0
- package/dist/backends/gui/comparison.d.ts +16 -0
- package/dist/backends/gui/comparison.d.ts.map +1 -0
- package/dist/backends/gui/comparison.js +41 -0
- package/dist/backends/gui/comparison.js.map +1 -0
- package/dist/backends/gui/credit-card.cjs +80 -0
- package/dist/backends/gui/credit-card.d.ts +21 -0
- package/dist/backends/gui/credit-card.d.ts.map +1 -0
- package/dist/backends/gui/credit-card.js +78 -0
- package/dist/backends/gui/credit-card.js.map +1 -0
- package/dist/backends/gui/crypto-market.cjs +128 -0
- package/dist/backends/gui/crypto-market.d.ts +52 -0
- package/dist/backends/gui/crypto-market.d.ts.map +1 -0
- package/dist/backends/gui/crypto-market.js +126 -0
- package/dist/backends/gui/crypto-market.js.map +1 -0
- package/dist/backends/gui/crypto-screener.cjs +55 -0
- package/dist/backends/gui/crypto-screener.d.ts +42 -0
- package/dist/backends/gui/crypto-screener.d.ts.map +1 -0
- package/dist/backends/gui/crypto-screener.js +53 -0
- package/dist/backends/gui/crypto-screener.js.map +1 -0
- package/dist/backends/gui/cursor.cjs +40 -0
- package/dist/backends/gui/cursor.d.ts +16 -0
- package/dist/backends/gui/cursor.d.ts.map +1 -0
- package/dist/backends/gui/cursor.js +38 -0
- package/dist/backends/gui/cursor.js.map +1 -0
- package/dist/backends/gui/data-table.cjs +211 -0
- package/dist/backends/gui/data-table.d.ts +71 -0
- package/dist/backends/gui/data-table.d.ts.map +1 -0
- package/dist/backends/gui/data-table.js +175 -0
- package/dist/backends/gui/data-table.js.map +1 -0
- package/dist/backends/gui/date-picker.cjs +66 -0
- package/dist/backends/gui/date-picker.d.ts +29 -0
- package/dist/backends/gui/date-picker.d.ts.map +1 -0
- package/dist/backends/gui/date-picker.js +64 -0
- package/dist/backends/gui/date-picker.js.map +1 -0
- package/dist/backends/gui/desktop-spotlight.cjs +46 -0
- package/dist/backends/gui/desktop-spotlight.d.ts +34 -0
- package/dist/backends/gui/desktop-spotlight.d.ts.map +1 -0
- package/dist/backends/gui/desktop-spotlight.js +44 -0
- package/dist/backends/gui/desktop-spotlight.js.map +1 -0
- package/dist/backends/gui/desktop-window.cjs +180 -0
- package/dist/backends/gui/desktop-window.d.ts +51 -0
- package/dist/backends/gui/desktop-window.d.ts.map +1 -0
- package/dist/backends/gui/desktop-window.js +177 -0
- package/dist/backends/gui/desktop-window.js.map +1 -0
- package/dist/backends/gui/desktop.cjs +238 -0
- package/dist/backends/gui/desktop.d.ts +109 -0
- package/dist/backends/gui/desktop.d.ts.map +1 -0
- package/dist/backends/gui/desktop.js +199 -0
- package/dist/backends/gui/desktop.js.map +1 -0
- package/dist/backends/gui/dialog-stack.cjs +26 -0
- package/dist/backends/gui/dialog-stack.d.ts +23 -0
- package/dist/backends/gui/dialog-stack.d.ts.map +1 -0
- package/dist/backends/gui/dialog-stack.js +24 -0
- package/dist/backends/gui/dialog-stack.js.map +1 -0
- package/dist/backends/gui/dock.cjs +99 -0
- package/dist/backends/gui/dock.d.ts +41 -0
- package/dist/backends/gui/dock.d.ts.map +1 -0
- package/dist/backends/gui/dock.js +96 -0
- package/dist/backends/gui/dock.js.map +1 -0
- package/dist/backends/gui/dropzone.cjs +142 -0
- package/dist/backends/gui/dropzone.d.ts +12 -0
- package/dist/backends/gui/dropzone.d.ts.map +1 -0
- package/dist/backends/gui/dropzone.js +140 -0
- package/dist/backends/gui/dropzone.js.map +1 -0
- package/dist/backends/gui/editor.cjs +80 -0
- package/dist/backends/gui/editor.d.ts +23 -0
- package/dist/backends/gui/editor.d.ts.map +1 -0
- package/dist/backends/gui/editor.js +45 -0
- package/dist/backends/gui/editor.js.map +1 -0
- package/dist/backends/gui/empty.cjs +71 -0
- package/dist/backends/gui/empty.d.ts +43 -0
- package/dist/backends/gui/empty.d.ts.map +1 -0
- package/dist/backends/gui/empty.js +63 -0
- package/dist/backends/gui/empty.js.map +1 -0
- package/dist/backends/gui/financials.cjs +45 -0
- package/dist/backends/gui/financials.d.ts +36 -0
- package/dist/backends/gui/financials.d.ts.map +1 -0
- package/dist/backends/gui/financials.js +43 -0
- package/dist/backends/gui/financials.js.map +1 -0
- package/dist/backends/gui/forex-market.cjs +21 -0
- package/dist/backends/gui/forex-market.d.ts +17 -0
- package/dist/backends/gui/forex-market.d.ts.map +1 -0
- package/dist/backends/gui/forex-market.js +19 -0
- package/dist/backends/gui/forex-market.js.map +1 -0
- package/dist/backends/gui/forex-screener.cjs +57 -0
- package/dist/backends/gui/forex-screener.d.ts +45 -0
- package/dist/backends/gui/forex-screener.d.ts.map +1 -0
- package/dist/backends/gui/forex-screener.js +55 -0
- package/dist/backends/gui/forex-screener.js.map +1 -0
- package/dist/backends/gui/gantt.cjs +50 -0
- package/dist/backends/gui/gantt.d.ts +19 -0
- package/dist/backends/gui/gantt.d.ts.map +1 -0
- package/dist/backends/gui/gantt.js +49 -0
- package/dist/backends/gui/gantt.js.map +1 -0
- package/dist/backends/gui/index.cjs +108 -1
- package/dist/backends/gui/index.d.ts +41 -0
- package/dist/backends/gui/index.d.ts.map +1 -1
- package/dist/backends/gui/index.js +41 -0
- package/dist/backends/gui/index.js.map +1 -1
- package/dist/gallery.html +1 -1
- package/dist/index.cjs +70 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/index.node.cjs +70 -1
- package/dist/index.node.js +3 -0
- package/package.json +1 -1
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* CodeEditor — a bordered, monospace editing surface: a toolbar carrying a
|
|
5
|
+
* language menu and a copy-to-clipboard button, above a plain-text field with
|
|
6
|
+
* a gutter of line numbers that scrolls with it.
|
|
7
|
+
*
|
|
8
|
+
* The field is gui's `TextArea`, so what is edited is the text itself. Tab
|
|
9
|
+
* inserts two spaces and Escape releases focus; `wordWrap` is the field's own
|
|
10
|
+
* white-space; the gutter numbers lines of text, so a line that wraps keeps
|
|
11
|
+
* one number; there is no syntax colouring, and `minimap` is accepted and
|
|
12
|
+
* ignored because a plain field has no surface to draw one on.
|
|
13
|
+
*
|
|
14
|
+
* `theme` is the editor's own palette, independent of the surrounding gui
|
|
15
|
+
* theme the way a syntax theme is: `'light'` and `'dark'` paint a fixed set of
|
|
16
|
+
* literal colours, and `'auto'` (the default) takes the ambient `$background`,
|
|
17
|
+
* `$color` and `$borderColor` tokens, so it follows the host page.
|
|
18
|
+
*/
|
|
19
|
+
import { SizableText, TextArea, XStack, YStack } from '@hanzo/gui';
|
|
20
|
+
import { Check, Copy } from '@hanzogui/lucide-icons-2';
|
|
21
|
+
import * as React from 'react';
|
|
22
|
+
import { Button } from './button.js';
|
|
23
|
+
import { RISER } from './control.js';
|
|
24
|
+
import { Select, SelectContent, SelectItem, SelectTrigger } from './select.js';
|
|
25
|
+
import { slot } from './slot.js';
|
|
26
|
+
import { toast } from './toaster.js';
|
|
27
|
+
/** The languages the menu offers when a caller does not narrow the list. */
|
|
28
|
+
const LANGUAGES = [
|
|
29
|
+
'javascript',
|
|
30
|
+
'typescript',
|
|
31
|
+
'python',
|
|
32
|
+
'java',
|
|
33
|
+
'csharp',
|
|
34
|
+
'cpp',
|
|
35
|
+
'c',
|
|
36
|
+
'go',
|
|
37
|
+
'rust',
|
|
38
|
+
'ruby',
|
|
39
|
+
'php',
|
|
40
|
+
'swift',
|
|
41
|
+
'kotlin',
|
|
42
|
+
'dart',
|
|
43
|
+
'html',
|
|
44
|
+
'css',
|
|
45
|
+
'scss',
|
|
46
|
+
'json',
|
|
47
|
+
'xml',
|
|
48
|
+
'yaml',
|
|
49
|
+
'sql',
|
|
50
|
+
'markdown',
|
|
51
|
+
'shell',
|
|
52
|
+
'plaintext',
|
|
53
|
+
];
|
|
54
|
+
const LABEL = {
|
|
55
|
+
javascript: 'JavaScript',
|
|
56
|
+
typescript: 'TypeScript',
|
|
57
|
+
python: 'Python',
|
|
58
|
+
java: 'Java',
|
|
59
|
+
csharp: 'C#',
|
|
60
|
+
cpp: 'C++',
|
|
61
|
+
c: 'C',
|
|
62
|
+
go: 'Go',
|
|
63
|
+
rust: 'Rust',
|
|
64
|
+
ruby: 'Ruby',
|
|
65
|
+
php: 'PHP',
|
|
66
|
+
swift: 'Swift',
|
|
67
|
+
kotlin: 'Kotlin',
|
|
68
|
+
dart: 'Dart',
|
|
69
|
+
html: 'HTML',
|
|
70
|
+
css: 'CSS',
|
|
71
|
+
scss: 'SCSS',
|
|
72
|
+
json: 'JSON',
|
|
73
|
+
xml: 'XML',
|
|
74
|
+
yaml: 'YAML',
|
|
75
|
+
sql: 'SQL',
|
|
76
|
+
markdown: 'Markdown',
|
|
77
|
+
shell: 'Shell',
|
|
78
|
+
plaintext: 'Plain Text',
|
|
79
|
+
};
|
|
80
|
+
/** The two named palettes; `'auto'` paints none of this. */
|
|
81
|
+
const PALETTE = {
|
|
82
|
+
light: { bg: '#ffffff', fg: '#1f2328', border: '#d0d7de', head: '#f6f8fa', gutter: '#8c959f' },
|
|
83
|
+
dark: { bg: '#1e1e1e', fg: '#d4d4d4', border: '#3c3c3c', head: '#252526', gutter: '#858585' },
|
|
84
|
+
};
|
|
85
|
+
/** What Tab inserts. */
|
|
86
|
+
const INDENT = ' ';
|
|
87
|
+
/** Line height as a multiple of the font size. */
|
|
88
|
+
const LEADING = 1.5;
|
|
89
|
+
export function CodeEditor({ value, defaultValue = '', language = 'javascript', height = '400px', theme = 'auto', onChange, onMount, readOnly = false, lineNumbers = true, minimap: _minimap, wordWrap = 'on', fontSize = 14, showCopyButton = true, showLanguageSelector = true, availableLanguages = LANGUAGES, ...props }) {
|
|
90
|
+
const [typed, setTyped] = React.useState(defaultValue);
|
|
91
|
+
const text = value ?? typed;
|
|
92
|
+
const [selected, setSelected] = React.useState(language);
|
|
93
|
+
const [copied, setCopied] = React.useState(false);
|
|
94
|
+
const [scrollTop, setScrollTop] = React.useState(0);
|
|
95
|
+
const field = React.useRef(null);
|
|
96
|
+
const timer = React.useRef(undefined);
|
|
97
|
+
React.useEffect(() => {
|
|
98
|
+
if (field.current)
|
|
99
|
+
onMount?.(field.current);
|
|
100
|
+
return () => clearTimeout(timer.current);
|
|
101
|
+
}, []);
|
|
102
|
+
// Bound directly rather than through the gui field's `onScroll` prop: native
|
|
103
|
+
// `scroll` does not bubble, and a listener attached this way fires however
|
|
104
|
+
// the offset changed — a real drag or a test stating it outright.
|
|
105
|
+
React.useEffect(() => {
|
|
106
|
+
const el = field.current;
|
|
107
|
+
if (!el)
|
|
108
|
+
return;
|
|
109
|
+
const onScroll = () => setScrollTop(el.scrollTop);
|
|
110
|
+
el.addEventListener('scroll', onScroll);
|
|
111
|
+
return () => el.removeEventListener('scroll', onScroll);
|
|
112
|
+
}, []);
|
|
113
|
+
const change = React.useCallback((next) => {
|
|
114
|
+
setTyped(next);
|
|
115
|
+
onChange?.(next);
|
|
116
|
+
}, [onChange]);
|
|
117
|
+
const key = (e) => {
|
|
118
|
+
const el = e.currentTarget;
|
|
119
|
+
if (e.key === 'Escape')
|
|
120
|
+
el.blur();
|
|
121
|
+
if (e.key !== 'Tab' || e.shiftKey || readOnly)
|
|
122
|
+
return;
|
|
123
|
+
e.preventDefault();
|
|
124
|
+
el.setRangeText(INDENT, el.selectionStart ?? 0, el.selectionEnd ?? 0, 'end');
|
|
125
|
+
change(el.value);
|
|
126
|
+
};
|
|
127
|
+
const copy = React.useCallback(async () => {
|
|
128
|
+
try {
|
|
129
|
+
await navigator.clipboard.writeText(text);
|
|
130
|
+
setCopied(true);
|
|
131
|
+
clearTimeout(timer.current);
|
|
132
|
+
timer.current = setTimeout(() => setCopied(false), 2000);
|
|
133
|
+
toast.success('Code copied to clipboard');
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
toast.error('Failed to copy code');
|
|
137
|
+
}
|
|
138
|
+
}, [text]);
|
|
139
|
+
const named = theme === 'auto' ? undefined : PALETTE[theme];
|
|
140
|
+
const lineHeight = `${fontSize * LEADING}px`;
|
|
141
|
+
const wrap = wordWrap !== 'off';
|
|
142
|
+
const gutter = Array.from({ length: text.split('\n').length }, (_, i) => i + 1).join('\n');
|
|
143
|
+
return (_jsxs(YStack, { ...slot('code-editor'), borderWidth: 1, borderColor: "$borderColor", rounded: "$3", overflow: "hidden", bg: "$background", style: named && { backgroundColor: named.bg, borderColor: named.border }, ...props, children: [(showLanguageSelector || showCopyButton) && (_jsxs(XStack, { ...slot('code-editor-toolbar'), items: "center", justify: showLanguageSelector ? 'space-between' : 'flex-end', borderBottomWidth: 1, borderColor: "$borderColor", bg: "$panel", px: "$3", py: "$2", style: named && { backgroundColor: named.head, borderColor: named.border }, children: [showLanguageSelector && (_jsxs(Select, { value: selected, onValueChange: setSelected, children: [_jsx(SelectTrigger, { ...slot('code-editor-language-trigger'), width: "auto", minHeight: 32, borderWidth: 0, bg: "transparent", gap: "$1.5", px: "$2", children: _jsx(SizableText, { size: "$1", fontFamily: "$mono", style: named && { color: named.fg }, children: LABEL[selected] ?? selected }) }), _jsx(SelectContent, { ...slot('code-editor-language-content'), children: availableLanguages.map((lang) => (_jsx(SelectItem, { value: lang, children: LABEL[lang] ?? lang }, lang))) })] })), showCopyButton && (_jsxs(Button, { ...slot('code-editor-copy-button'), variant: "ghost", size: "sm", disabled: !text, onClick: copy, children: [copied ? _jsx(Check, { size: 14 }) : _jsx(Copy, { size: 14 }), copied ? 'Copied!' : 'Copy'] }))] })), _jsxs(XStack, { ...slot('code-editor-body'), overflow: "hidden", style: { height }, children: [lineNumbers && (_jsx(YStack, { ...slot('code-editor-gutter'), width: 48, overflow: "hidden", borderRightWidth: 1, borderColor: "$borderColor", bg: "$panel", py: RISER, style: named && { backgroundColor: named.head, borderColor: named.border }, children: _jsx(SizableText, { size: "$1", fontFamily: "$mono", color: "$soft", px: "$2", whiteSpace: "pre", style: {
|
|
144
|
+
fontSize,
|
|
145
|
+
lineHeight,
|
|
146
|
+
textAlign: 'right',
|
|
147
|
+
transform: `translateY(${-scrollTop}px)`,
|
|
148
|
+
...(named && { color: named.gutter }),
|
|
149
|
+
}, children: gutter }) })), _jsx(TextArea, { ref: field, ...slot('code-editor-textarea'), value: text, onChangeText: change, onKeyDown: key, readOnly: readOnly, unstyled: true, flex: 1, minH: 0, borderWidth: 0, rounded: 0, px: "$2", py: RISER, fontFamily: "$mono", color: "$color", bg: "transparent", style: {
|
|
150
|
+
fontSize,
|
|
151
|
+
lineHeight,
|
|
152
|
+
whiteSpace: wrap ? 'pre-wrap' : 'pre',
|
|
153
|
+
overflowWrap: wrap ? 'break-word' : 'normal',
|
|
154
|
+
overflow: 'auto',
|
|
155
|
+
resize: 'none',
|
|
156
|
+
height: '100%',
|
|
157
|
+
...(named && { color: named.fg }),
|
|
158
|
+
} })] })] }));
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=code-editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-editor.js","sourceRoot":"","sources":["../../../src/backends/gui/code-editor.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
'use client';"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.CodeTabs = CodeTabs;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
/**
|
|
7
|
+
* CodeTabs — a set of code snippets sharing one tab strip, one tab per
|
|
8
|
+
* language or variant (JavaScript, TypeScript, Python, …); choosing a tab
|
|
9
|
+
* swaps the `CodeBlock` shown beneath it. Composes the backend's own `Tabs`
|
|
10
|
+
* and `CodeBlock` rather than reimplementing either.
|
|
11
|
+
*/
|
|
12
|
+
const gui_1 = require("@hanzo/gui");
|
|
13
|
+
const code_block_1 = require("./code-block.cjs");
|
|
14
|
+
const slot_1 = require("./slot.cjs");
|
|
15
|
+
const tabs_1 = require("./tabs.cjs");
|
|
16
|
+
function CodeTabs({ tabs, defaultTab = 0, showLineNumbers, showCopyButton, theme, size, maxHeight, ...props }) {
|
|
17
|
+
if (tabs.length === 0) {
|
|
18
|
+
return ((0, jsx_runtime_1.jsx)(gui_1.YStack, { ...(0, slot_1.slot)('code-tabs'), borderWidth: 1, rounded: "$4", p: "$6", bg: "$panel", children: (0, jsx_runtime_1.jsx)(gui_1.SizableText, { size: "$2", color: "$soft", children: "No code tabs available. Add tabs to display code snippets." }) }));
|
|
19
|
+
}
|
|
20
|
+
return ((0, jsx_runtime_1.jsxs)(tabs_1.Tabs, { ...(0, slot_1.slot)('code-tabs'), defaultValue: String(defaultTab), ...props, children: [(0, jsx_runtime_1.jsx)(tabs_1.TabsList, { ...(0, slot_1.slot)('code-tabs-list'), children: tabs.map((tab, index) => ((0, jsx_runtime_1.jsx)(tabs_1.TabsTrigger, { value: String(index), children: tab.label }, index))) }), tabs.map((tab, index) => ((0, jsx_runtime_1.jsx)(tabs_1.TabsContent, { value: String(index), children: (0, jsx_runtime_1.jsx)(code_block_1.CodeBlock, { code: tab.code, language: tab.language, filename: tab.filename, theme: theme, size: size, showLineNumbers: showLineNumbers, showCopyButton: showCopyButton, maxHeight: maxHeight }) }, index)))] }));
|
|
21
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ComponentProps } from 'react';
|
|
2
|
+
import { type CodeBlockSize, type CodeBlockTheme } from './code-block.js';
|
|
3
|
+
import { Tabs } from './tabs.js';
|
|
4
|
+
export interface CodeTabsTab {
|
|
5
|
+
label: string;
|
|
6
|
+
code: string;
|
|
7
|
+
language?: string;
|
|
8
|
+
filename?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface CodeTabsProps extends Omit<ComponentProps<typeof Tabs>, 'children' | 'defaultValue' | 'theme' | 'size'> {
|
|
11
|
+
tabs: CodeTabsTab[];
|
|
12
|
+
/** Index of the tab shown first, for an uncontrolled `CodeTabs`. */
|
|
13
|
+
defaultTab?: number;
|
|
14
|
+
showLineNumbers?: boolean;
|
|
15
|
+
showCopyButton?: boolean;
|
|
16
|
+
theme?: CodeBlockTheme | null;
|
|
17
|
+
size?: CodeBlockSize | null;
|
|
18
|
+
/** The body's ceiling, in px or any CSS length; past it a tab's body scrolls. */
|
|
19
|
+
maxHeight?: number | string;
|
|
20
|
+
}
|
|
21
|
+
export declare function CodeTabs({ tabs, defaultTab, showLineNumbers, showCopyButton, theme, size, maxHeight, ...props }: CodeTabsProps): import("react").JSX.Element;
|
|
22
|
+
//# sourceMappingURL=code-tabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-tabs.d.ts","sourceRoot":"","sources":["../../../src/backends/gui/code-tabs.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAa,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AAEjF,OAAO,EAAE,IAAI,EAAsC,MAAM,QAAQ,CAAA;AAEjE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,cAAc,CAAC,OAAO,IAAI,CAAC,EAAE,UAAU,GAAG,cAAc,GAAG,OAAO,GAAG,MAAM,CAAC;IACtH,IAAI,EAAE,WAAW,EAAE,CAAA;IACnB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,KAAK,CAAC,EAAE,cAAc,GAAG,IAAI,CAAA;IAC7B,IAAI,CAAC,EAAE,aAAa,GAAG,IAAI,CAAA;IAC3B,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAC5B;AAED,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,UAAc,EACd,eAAe,EACf,cAAc,EACd,KAAK,EACL,IAAI,EACJ,SAAS,EACT,GAAG,KAAK,EACT,EAAE,aAAa,+BAoCf"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* CodeTabs — a set of code snippets sharing one tab strip, one tab per
|
|
5
|
+
* language or variant (JavaScript, TypeScript, Python, …); choosing a tab
|
|
6
|
+
* swaps the `CodeBlock` shown beneath it. Composes the backend's own `Tabs`
|
|
7
|
+
* and `CodeBlock` rather than reimplementing either.
|
|
8
|
+
*/
|
|
9
|
+
import { SizableText, YStack } from '@hanzo/gui';
|
|
10
|
+
import { CodeBlock } from './code-block.js';
|
|
11
|
+
import { slot } from './slot.js';
|
|
12
|
+
import { Tabs, TabsContent, TabsList, TabsTrigger } from './tabs.js';
|
|
13
|
+
export function CodeTabs({ tabs, defaultTab = 0, showLineNumbers, showCopyButton, theme, size, maxHeight, ...props }) {
|
|
14
|
+
if (tabs.length === 0) {
|
|
15
|
+
return (_jsx(YStack, { ...slot('code-tabs'), borderWidth: 1, rounded: "$4", p: "$6", bg: "$panel", children: _jsx(SizableText, { size: "$2", color: "$soft", children: "No code tabs available. Add tabs to display code snippets." }) }));
|
|
16
|
+
}
|
|
17
|
+
return (_jsxs(Tabs, { ...slot('code-tabs'), defaultValue: String(defaultTab), ...props, children: [_jsx(TabsList, { ...slot('code-tabs-list'), children: tabs.map((tab, index) => (_jsx(TabsTrigger, { value: String(index), children: tab.label }, index))) }), tabs.map((tab, index) => (_jsx(TabsContent, { value: String(index), children: _jsx(CodeBlock, { code: tab.code, language: tab.language, filename: tab.filename, theme: theme, size: size, showLineNumbers: showLineNumbers, showCopyButton: showCopyButton, maxHeight: maxHeight }) }, index)))] }));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=code-tabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-tabs.js","sourceRoot":"","sources":["../../../src/backends/gui/code-tabs.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;GAKG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAEhD,OAAO,EAAE,SAAS,EAA2C,MAAM,cAAc,CAAA;AACjF,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAqBjE,MAAM,UAAU,QAAQ,CAAC,EACvB,IAAI,EACJ,UAAU,GAAG,CAAC,EACd,eAAe,EACf,cAAc,EACd,KAAK,EACL,IAAI,EACJ,SAAS,EACT,GAAG,KAAK,EACM;IACd,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CACL,KAAC,MAAM,OAAK,IAAI,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAC,IAAI,EAAC,CAAC,EAAC,IAAI,EAAC,EAAE,EAAC,QAAQ,YAC5E,KAAC,WAAW,IAAC,IAAI,EAAC,IAAI,EAAC,KAAK,EAAC,OAAO,2EAEtB,GACP,CACV,CAAA;IACH,CAAC;IAED,OAAO,CACL,MAAC,IAAI,OAAK,IAAI,CAAC,WAAW,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,KAAM,KAAK,aACtE,KAAC,QAAQ,OAAK,IAAI,CAAC,gBAAgB,CAAC,YACjC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CACxB,KAAC,WAAW,IAAa,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,YAC1C,GAAG,CAAC,KAAK,IADM,KAAK,CAET,CACf,CAAC,GACO,EACV,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CACxB,KAAC,WAAW,IAAa,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,YAC3C,KAAC,SAAS,IACR,IAAI,EAAE,GAAG,CAAC,IAAI,EACd,QAAQ,EAAE,GAAG,CAAC,QAAQ,EACtB,QAAQ,EAAE,GAAG,CAAC,QAAQ,EACtB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,IAAI,EACV,eAAe,EAAE,eAAe,EAChC,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,SAAS,GACpB,IAVc,KAAK,CAWT,CACf,CAAC,IACG,CACR,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
'use client';"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.ColorPicker = void 0;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
/**
|
|
7
|
+
* ColorPicker — a swatch button that opens a hue/saturation panel and a hex
|
|
8
|
+
* field, and reports every change as a `#rrggbb` string.
|
|
9
|
+
*
|
|
10
|
+
* The panel is two custom drag surfaces (saturation-value square, hue bar)
|
|
11
|
+
* built on `drag()` from `./gesture` — the one pointer/responder contract this
|
|
12
|
+
* backend already uses for the resize handle and the scroll thumb — plus this
|
|
13
|
+
* backend's own `Popover` and `Input`. No color-math dependency exists in the
|
|
14
|
+
* workspace, so HSV/RGB/hex conversion is the ~30 lines below rather than a
|
|
15
|
+
* new package.
|
|
16
|
+
*/
|
|
17
|
+
const gui_1 = require("@hanzo/gui");
|
|
18
|
+
const react_1 = require("react");
|
|
19
|
+
const popover_1 = require("./popover.cjs");
|
|
20
|
+
const button_1 = require("./button.cjs");
|
|
21
|
+
const input_1 = require("./input.cjs");
|
|
22
|
+
const gesture_1 = require("./gesture.cjs");
|
|
23
|
+
const slot_1 = require("./slot.cjs");
|
|
24
|
+
const clamp01 = (n) => Math.min(1, Math.max(0, n));
|
|
25
|
+
/** `#rgb`, `#rrggbb`, or bare (no `#`) — anything else is not a color. */
|
|
26
|
+
const hexToRgb = (hex) => {
|
|
27
|
+
const s = hex.trim().replace(/^#/, '');
|
|
28
|
+
const full = s.length === 3 ? s.split('').map((c) => c + c).join('') : s;
|
|
29
|
+
if (!/^[0-9a-f]{6}$/i.test(full))
|
|
30
|
+
return null;
|
|
31
|
+
return {
|
|
32
|
+
r: Number.parseInt(full.slice(0, 2), 16),
|
|
33
|
+
g: Number.parseInt(full.slice(2, 4), 16),
|
|
34
|
+
b: Number.parseInt(full.slice(4, 6), 16),
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
const rgbToHex = ({ r, g, b }) => '#' + [r, g, b].map((c) => Math.round(clamp01(c / 255) * 255).toString(16).padStart(2, '0')).join('');
|
|
38
|
+
const rgbToHsv = ({ r, g, b }) => {
|
|
39
|
+
const rn = r / 255;
|
|
40
|
+
const gn = g / 255;
|
|
41
|
+
const bn = b / 255;
|
|
42
|
+
const max = Math.max(rn, gn, bn);
|
|
43
|
+
const min = Math.min(rn, gn, bn);
|
|
44
|
+
const d = max - min;
|
|
45
|
+
let h = 0;
|
|
46
|
+
if (d !== 0) {
|
|
47
|
+
if (max === rn)
|
|
48
|
+
h = ((gn - bn) / d) % 6;
|
|
49
|
+
else if (max === gn)
|
|
50
|
+
h = (bn - rn) / d + 2;
|
|
51
|
+
else
|
|
52
|
+
h = (rn - gn) / d + 4;
|
|
53
|
+
h *= 60;
|
|
54
|
+
if (h < 0)
|
|
55
|
+
h += 360;
|
|
56
|
+
}
|
|
57
|
+
return { h, s: max === 0 ? 0 : d / max, v: max };
|
|
58
|
+
};
|
|
59
|
+
const hsvToRgb = ({ h, s, v }) => {
|
|
60
|
+
const c = v * s;
|
|
61
|
+
const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
|
|
62
|
+
const m = v - c;
|
|
63
|
+
const [rp, gp, bp] = h < 60 ? [c, x, 0] : h < 120 ? [x, c, 0] : h < 180 ? [0, c, x] : h < 240 ? [0, x, c] : h < 300 ? [x, 0, c] : [c, 0, x];
|
|
64
|
+
return { r: (rp + m) * 255, g: (gp + m) * 255, b: (bp + m) * 255 };
|
|
65
|
+
};
|
|
66
|
+
const DEFAULT = '#3b82f6';
|
|
67
|
+
const SIZE = 200;
|
|
68
|
+
const HUE_H = 16;
|
|
69
|
+
const THUMB = 14;
|
|
70
|
+
/** The DOM box behind a ref, if there is one; a native view has none. */
|
|
71
|
+
const box = (el) => typeof HTMLElement !== 'undefined' && el instanceof HTMLElement ? el : null;
|
|
72
|
+
/** Position on a rect, 0..1 both axes, from whichever client coordinate the platform sent. */
|
|
73
|
+
const pointOn = (el, e) => {
|
|
74
|
+
const rect = el.getBoundingClientRect();
|
|
75
|
+
const x = (e.clientX ?? e.nativeEvent?.pageX ?? rect.left) - rect.left;
|
|
76
|
+
const y = (e.clientY ?? e.nativeEvent?.pageY ?? rect.top) - rect.top;
|
|
77
|
+
return { x: clamp01(rect.width ? x / rect.width : 0), y: clamp01(rect.height ? y / rect.height : 0) };
|
|
78
|
+
};
|
|
79
|
+
/** The 2D saturation (x) / value (y) square for the current hue. */
|
|
80
|
+
const SaturationField = ({ hue, s, v, onChange, disabled, }) => {
|
|
81
|
+
const ref = (0, react_1.useRef)(null);
|
|
82
|
+
const set = (0, react_1.useCallback)((e) => {
|
|
83
|
+
const el = box(ref.current);
|
|
84
|
+
if (!el)
|
|
85
|
+
return;
|
|
86
|
+
const { x, y } = pointOn(el, e);
|
|
87
|
+
onChange(x, 1 - y);
|
|
88
|
+
}, [onChange]);
|
|
89
|
+
const gesture = (0, gesture_1.drag)({ begin: set, move: set, end: () => { }, enabled: !disabled });
|
|
90
|
+
return ((0, jsx_runtime_1.jsx)(gui_1.XStack, { ref: ref, ...(0, slot_1.slot)('color-picker-saturation'), position: "relative", width: "100%", height: SIZE, rounded: "$2", overflow: "hidden", cursor: disabled ? 'default' : 'crosshair', style: {
|
|
91
|
+
backgroundColor: rgbToHex(hsvToRgb({ h: hue, s: 1, v: 1 })),
|
|
92
|
+
backgroundImage: 'linear-gradient(to top, #000, transparent), linear-gradient(to right, #fff, transparent)',
|
|
93
|
+
}, ...gesture, children: (0, jsx_runtime_1.jsx)(gui_1.XStack, { ...(0, slot_1.slot)('color-picker-saturation-thumb'), position: "absolute", width: THUMB, height: THUMB, rounded: 999, borderWidth: 2, style: {
|
|
94
|
+
left: `${s * 100}%`,
|
|
95
|
+
top: `${(1 - v) * 100}%`,
|
|
96
|
+
transform: 'translate(-50%, -50%)',
|
|
97
|
+
boxShadow: '0 0 0 1px rgba(0,0,0,.4)',
|
|
98
|
+
backgroundColor: rgbToHex(hsvToRgb({ h: hue, s, v })),
|
|
99
|
+
borderColor: 'white',
|
|
100
|
+
}, pointerEvents: "none" }) }));
|
|
101
|
+
};
|
|
102
|
+
/** The hue bar, 0..360, laid out as one horizontal drag strip. */
|
|
103
|
+
const HueField = ({ hue, onChange, disabled, }) => {
|
|
104
|
+
const ref = (0, react_1.useRef)(null);
|
|
105
|
+
const set = (0, react_1.useCallback)((e) => {
|
|
106
|
+
const el = box(ref.current);
|
|
107
|
+
if (!el)
|
|
108
|
+
return;
|
|
109
|
+
const { x } = pointOn(el, e);
|
|
110
|
+
onChange(x * 360);
|
|
111
|
+
}, [onChange]);
|
|
112
|
+
const gesture = (0, gesture_1.drag)({ begin: set, move: set, end: () => { }, enabled: !disabled });
|
|
113
|
+
return ((0, jsx_runtime_1.jsx)(gui_1.XStack, { ref: ref, ...(0, slot_1.slot)('color-picker-hue'), position: "relative", width: "100%", height: HUE_H, rounded: 999, overflow: "hidden", cursor: disabled ? 'default' : 'pointer', style: {
|
|
114
|
+
backgroundImage: 'linear-gradient(to right, #f00, #ff0, #0f0, #0ff, #00f, #f0f, #f00)',
|
|
115
|
+
}, ...(0, gesture_1.touch)(HUE_H, 44, 'y'), ...gesture, children: (0, jsx_runtime_1.jsx)(gui_1.XStack, { ...(0, slot_1.slot)('color-picker-hue-thumb'), position: "absolute", width: HUE_H, height: HUE_H, rounded: 999, borderWidth: 2, style: {
|
|
116
|
+
left: `${(hue / 360) * 100}%`,
|
|
117
|
+
top: '50%',
|
|
118
|
+
transform: 'translate(-50%, -50%)',
|
|
119
|
+
boxShadow: '0 0 0 1px rgba(0,0,0,.4)',
|
|
120
|
+
backgroundColor: rgbToHex(hsvToRgb({ h: hue, s: 1, v: 1 })),
|
|
121
|
+
borderColor: 'white',
|
|
122
|
+
}, pointerEvents: "none" }) }));
|
|
123
|
+
};
|
|
124
|
+
const ColorPicker = ({ value = DEFAULT, onChange, disabled = false, presets, ...props }) => {
|
|
125
|
+
const [hex, setHex] = (0, react_1.useState)(value);
|
|
126
|
+
const [hexDraft, setHexDraft] = (0, react_1.useState)(value);
|
|
127
|
+
const hsv = (0, react_1.useMemo)(() => rgbToHsv(hexToRgb(hex) ?? hexToRgb(DEFAULT)), [hex]);
|
|
128
|
+
const commit = (0, react_1.useCallback)((next) => {
|
|
129
|
+
setHex(next);
|
|
130
|
+
setHexDraft(next);
|
|
131
|
+
onChange?.(next);
|
|
132
|
+
}, [onChange]);
|
|
133
|
+
const setHsv = (0, react_1.useCallback)((patch) => commit(rgbToHex(hsvToRgb({ ...hsv, ...patch }))), [commit, hsv]);
|
|
134
|
+
const editHex = (0, react_1.useCallback)((raw) => {
|
|
135
|
+
setHexDraft(raw);
|
|
136
|
+
if (hexToRgb(raw))
|
|
137
|
+
commit(raw.startsWith('#') ? raw : `#${raw}`);
|
|
138
|
+
}, [commit]);
|
|
139
|
+
return ((0, jsx_runtime_1.jsx)(gui_1.XStack, { ...(0, slot_1.slot)('color-picker'), items: "center", gap: "$2", opacity: disabled ? 0.5 : 1, ...props, children: (0, jsx_runtime_1.jsxs)(popover_1.Popover, { children: [(0, jsx_runtime_1.jsx)(popover_1.PopoverTrigger, { asChild: true, children: (0, jsx_runtime_1.jsx)(button_1.Button, { variant: "outline", disabled: disabled, justify: "flex-start", width: 220, children: (0, jsx_runtime_1.jsxs)(gui_1.XStack, { width: "100%", items: "center", gap: "$2", children: [(0, jsx_runtime_1.jsx)(gui_1.XStack, { ...(0, slot_1.slot)('color-picker-swatch'), width: 16, height: 16, rounded: "$1", borderWidth: 1, borderColor: "$borderColor", style: { backgroundColor: hex } }), (0, jsx_runtime_1.jsx)(gui_1.SizableText, { flex: 1, numberOfLines: 1, fontFamily: "$mono", size: "$2", children: hex })] }) }) }), (0, jsx_runtime_1.jsx)(popover_1.PopoverContent, { width: SIZE + 24, children: (0, jsx_runtime_1.jsxs)(gui_1.YStack, { gap: "$3", children: [(0, jsx_runtime_1.jsx)(SaturationField, { hue: hsv.h, s: hsv.s, v: hsv.v, disabled: disabled, onChange: (s, v) => setHsv({ s, v }) }), (0, jsx_runtime_1.jsx)(HueField, { hue: hsv.h, disabled: disabled, onChange: (h) => setHsv({ h }) }), (0, jsx_runtime_1.jsx)(input_1.Input, { ...(0, slot_1.slot)('color-picker-hex-input'), value: hexDraft, onChangeText: editHex, placeholder: "#000000", disabled: disabled, fontFamily: "$mono", fontSize: "$2" }), presets?.length ? ((0, jsx_runtime_1.jsx)(gui_1.XStack, { ...(0, slot_1.slot)('color-picker-presets'), flexWrap: "wrap", gap: "$2", children: presets.map((preset) => ((0, jsx_runtime_1.jsx)(gui_1.XStack, { ...(0, slot_1.slot)('color-picker-preset'), width: 22, height: 22, rounded: "$1", borderWidth: 1, borderColor: "$borderColor", style: { backgroundColor: preset }, cursor: "pointer", "aria-label": preset, onPress: () => !disabled && commit(preset), ...(0, gesture_1.touch)(22) }, preset))) })) : null] }) })] }) }));
|
|
140
|
+
};
|
|
141
|
+
exports.ColorPicker = ColorPicker;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ColorPicker — a swatch button that opens a hue/saturation panel and a hex
|
|
3
|
+
* field, and reports every change as a `#rrggbb` string.
|
|
4
|
+
*
|
|
5
|
+
* The panel is two custom drag surfaces (saturation-value square, hue bar)
|
|
6
|
+
* built on `drag()` from `./gesture` — the one pointer/responder contract this
|
|
7
|
+
* backend already uses for the resize handle and the scroll thumb — plus this
|
|
8
|
+
* backend's own `Popover` and `Input`. No color-math dependency exists in the
|
|
9
|
+
* workspace, so HSV/RGB/hex conversion is the ~30 lines below rather than a
|
|
10
|
+
* new package.
|
|
11
|
+
*/
|
|
12
|
+
import { XStack } from '@hanzo/gui';
|
|
13
|
+
import { type ComponentProps } from 'react';
|
|
14
|
+
export type ColorPickerProps = Omit<ComponentProps<typeof XStack>, 'onChange' | 'children'> & {
|
|
15
|
+
/** Initial color, as any 3- or 6-digit hex string. The picker owns state from here on. */
|
|
16
|
+
value?: string;
|
|
17
|
+
/** Fires on every change, hue drag, saturation drag and hex edit alike, as `#rrggbb`. */
|
|
18
|
+
onChange?: (color: string) => void;
|
|
19
|
+
disabled?: boolean;
|
|
20
|
+
/** Swatches shown under the fields for one-click picks. */
|
|
21
|
+
presets?: string[];
|
|
22
|
+
};
|
|
23
|
+
declare const ColorPicker: ({ value, onChange, disabled, presets, ...props }: ColorPickerProps) => import("react").JSX.Element;
|
|
24
|
+
export { ColorPicker };
|
|
25
|
+
//# sourceMappingURL=color-picker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-picker.d.ts","sourceRoot":"","sources":["../../../src/backends/gui/color-picker.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,OAAO,EAAe,MAAM,EAA2B,MAAM,YAAY,CAAA;AACzE,OAAO,EAA0C,KAAK,cAAc,EAAE,MAAM,OAAO,CAAA;AAiMnF,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,MAAM,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC,GAAG;IAC5F,0FAA0F;IAC1F,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yFAAyF;IACzF,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB,CAAA;AAED,QAAA,MAAM,WAAW,qDAAwE,gBAAgB,gCA4FxG,CAAA;AAED,OAAO,EAAE,WAAW,EAAE,CAAA"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* ColorPicker — a swatch button that opens a hue/saturation panel and a hex
|
|
5
|
+
* field, and reports every change as a `#rrggbb` string.
|
|
6
|
+
*
|
|
7
|
+
* The panel is two custom drag surfaces (saturation-value square, hue bar)
|
|
8
|
+
* built on `drag()` from `./gesture` — the one pointer/responder contract this
|
|
9
|
+
* backend already uses for the resize handle and the scroll thumb — plus this
|
|
10
|
+
* backend's own `Popover` and `Input`. No color-math dependency exists in the
|
|
11
|
+
* workspace, so HSV/RGB/hex conversion is the ~30 lines below rather than a
|
|
12
|
+
* new package.
|
|
13
|
+
*/
|
|
14
|
+
import { SizableText, XStack, YStack } from '@hanzo/gui';
|
|
15
|
+
import { useCallback, useMemo, useRef, useState } from 'react';
|
|
16
|
+
import { Popover, PopoverContent, PopoverTrigger } from './popover.js';
|
|
17
|
+
import { Button } from './button.js';
|
|
18
|
+
import { Input } from './input.js';
|
|
19
|
+
import { drag, touch } from './gesture.js';
|
|
20
|
+
import { slot } from './slot.js';
|
|
21
|
+
const clamp01 = (n) => Math.min(1, Math.max(0, n));
|
|
22
|
+
/** `#rgb`, `#rrggbb`, or bare (no `#`) — anything else is not a color. */
|
|
23
|
+
const hexToRgb = (hex) => {
|
|
24
|
+
const s = hex.trim().replace(/^#/, '');
|
|
25
|
+
const full = s.length === 3 ? s.split('').map((c) => c + c).join('') : s;
|
|
26
|
+
if (!/^[0-9a-f]{6}$/i.test(full))
|
|
27
|
+
return null;
|
|
28
|
+
return {
|
|
29
|
+
r: Number.parseInt(full.slice(0, 2), 16),
|
|
30
|
+
g: Number.parseInt(full.slice(2, 4), 16),
|
|
31
|
+
b: Number.parseInt(full.slice(4, 6), 16),
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
const rgbToHex = ({ r, g, b }) => '#' + [r, g, b].map((c) => Math.round(clamp01(c / 255) * 255).toString(16).padStart(2, '0')).join('');
|
|
35
|
+
const rgbToHsv = ({ r, g, b }) => {
|
|
36
|
+
const rn = r / 255;
|
|
37
|
+
const gn = g / 255;
|
|
38
|
+
const bn = b / 255;
|
|
39
|
+
const max = Math.max(rn, gn, bn);
|
|
40
|
+
const min = Math.min(rn, gn, bn);
|
|
41
|
+
const d = max - min;
|
|
42
|
+
let h = 0;
|
|
43
|
+
if (d !== 0) {
|
|
44
|
+
if (max === rn)
|
|
45
|
+
h = ((gn - bn) / d) % 6;
|
|
46
|
+
else if (max === gn)
|
|
47
|
+
h = (bn - rn) / d + 2;
|
|
48
|
+
else
|
|
49
|
+
h = (rn - gn) / d + 4;
|
|
50
|
+
h *= 60;
|
|
51
|
+
if (h < 0)
|
|
52
|
+
h += 360;
|
|
53
|
+
}
|
|
54
|
+
return { h, s: max === 0 ? 0 : d / max, v: max };
|
|
55
|
+
};
|
|
56
|
+
const hsvToRgb = ({ h, s, v }) => {
|
|
57
|
+
const c = v * s;
|
|
58
|
+
const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
|
|
59
|
+
const m = v - c;
|
|
60
|
+
const [rp, gp, bp] = h < 60 ? [c, x, 0] : h < 120 ? [x, c, 0] : h < 180 ? [0, c, x] : h < 240 ? [0, x, c] : h < 300 ? [x, 0, c] : [c, 0, x];
|
|
61
|
+
return { r: (rp + m) * 255, g: (gp + m) * 255, b: (bp + m) * 255 };
|
|
62
|
+
};
|
|
63
|
+
const DEFAULT = '#3b82f6';
|
|
64
|
+
const SIZE = 200;
|
|
65
|
+
const HUE_H = 16;
|
|
66
|
+
const THUMB = 14;
|
|
67
|
+
/** The DOM box behind a ref, if there is one; a native view has none. */
|
|
68
|
+
const box = (el) => typeof HTMLElement !== 'undefined' && el instanceof HTMLElement ? el : null;
|
|
69
|
+
/** Position on a rect, 0..1 both axes, from whichever client coordinate the platform sent. */
|
|
70
|
+
const pointOn = (el, e) => {
|
|
71
|
+
const rect = el.getBoundingClientRect();
|
|
72
|
+
const x = (e.clientX ?? e.nativeEvent?.pageX ?? rect.left) - rect.left;
|
|
73
|
+
const y = (e.clientY ?? e.nativeEvent?.pageY ?? rect.top) - rect.top;
|
|
74
|
+
return { x: clamp01(rect.width ? x / rect.width : 0), y: clamp01(rect.height ? y / rect.height : 0) };
|
|
75
|
+
};
|
|
76
|
+
/** The 2D saturation (x) / value (y) square for the current hue. */
|
|
77
|
+
const SaturationField = ({ hue, s, v, onChange, disabled, }) => {
|
|
78
|
+
const ref = useRef(null);
|
|
79
|
+
const set = useCallback((e) => {
|
|
80
|
+
const el = box(ref.current);
|
|
81
|
+
if (!el)
|
|
82
|
+
return;
|
|
83
|
+
const { x, y } = pointOn(el, e);
|
|
84
|
+
onChange(x, 1 - y);
|
|
85
|
+
}, [onChange]);
|
|
86
|
+
const gesture = drag({ begin: set, move: set, end: () => { }, enabled: !disabled });
|
|
87
|
+
return (_jsx(XStack, { ref: ref, ...slot('color-picker-saturation'), position: "relative", width: "100%", height: SIZE, rounded: "$2", overflow: "hidden", cursor: disabled ? 'default' : 'crosshair', style: {
|
|
88
|
+
backgroundColor: rgbToHex(hsvToRgb({ h: hue, s: 1, v: 1 })),
|
|
89
|
+
backgroundImage: 'linear-gradient(to top, #000, transparent), linear-gradient(to right, #fff, transparent)',
|
|
90
|
+
}, ...gesture, children: _jsx(XStack, { ...slot('color-picker-saturation-thumb'), position: "absolute", width: THUMB, height: THUMB, rounded: 999, borderWidth: 2, style: {
|
|
91
|
+
left: `${s * 100}%`,
|
|
92
|
+
top: `${(1 - v) * 100}%`,
|
|
93
|
+
transform: 'translate(-50%, -50%)',
|
|
94
|
+
boxShadow: '0 0 0 1px rgba(0,0,0,.4)',
|
|
95
|
+
backgroundColor: rgbToHex(hsvToRgb({ h: hue, s, v })),
|
|
96
|
+
borderColor: 'white',
|
|
97
|
+
}, pointerEvents: "none" }) }));
|
|
98
|
+
};
|
|
99
|
+
/** The hue bar, 0..360, laid out as one horizontal drag strip. */
|
|
100
|
+
const HueField = ({ hue, onChange, disabled, }) => {
|
|
101
|
+
const ref = useRef(null);
|
|
102
|
+
const set = useCallback((e) => {
|
|
103
|
+
const el = box(ref.current);
|
|
104
|
+
if (!el)
|
|
105
|
+
return;
|
|
106
|
+
const { x } = pointOn(el, e);
|
|
107
|
+
onChange(x * 360);
|
|
108
|
+
}, [onChange]);
|
|
109
|
+
const gesture = drag({ begin: set, move: set, end: () => { }, enabled: !disabled });
|
|
110
|
+
return (_jsx(XStack, { ref: ref, ...slot('color-picker-hue'), position: "relative", width: "100%", height: HUE_H, rounded: 999, overflow: "hidden", cursor: disabled ? 'default' : 'pointer', style: {
|
|
111
|
+
backgroundImage: 'linear-gradient(to right, #f00, #ff0, #0f0, #0ff, #00f, #f0f, #f00)',
|
|
112
|
+
}, ...touch(HUE_H, 44, 'y'), ...gesture, children: _jsx(XStack, { ...slot('color-picker-hue-thumb'), position: "absolute", width: HUE_H, height: HUE_H, rounded: 999, borderWidth: 2, style: {
|
|
113
|
+
left: `${(hue / 360) * 100}%`,
|
|
114
|
+
top: '50%',
|
|
115
|
+
transform: 'translate(-50%, -50%)',
|
|
116
|
+
boxShadow: '0 0 0 1px rgba(0,0,0,.4)',
|
|
117
|
+
backgroundColor: rgbToHex(hsvToRgb({ h: hue, s: 1, v: 1 })),
|
|
118
|
+
borderColor: 'white',
|
|
119
|
+
}, pointerEvents: "none" }) }));
|
|
120
|
+
};
|
|
121
|
+
const ColorPicker = ({ value = DEFAULT, onChange, disabled = false, presets, ...props }) => {
|
|
122
|
+
const [hex, setHex] = useState(value);
|
|
123
|
+
const [hexDraft, setHexDraft] = useState(value);
|
|
124
|
+
const hsv = useMemo(() => rgbToHsv(hexToRgb(hex) ?? hexToRgb(DEFAULT)), [hex]);
|
|
125
|
+
const commit = useCallback((next) => {
|
|
126
|
+
setHex(next);
|
|
127
|
+
setHexDraft(next);
|
|
128
|
+
onChange?.(next);
|
|
129
|
+
}, [onChange]);
|
|
130
|
+
const setHsv = useCallback((patch) => commit(rgbToHex(hsvToRgb({ ...hsv, ...patch }))), [commit, hsv]);
|
|
131
|
+
const editHex = useCallback((raw) => {
|
|
132
|
+
setHexDraft(raw);
|
|
133
|
+
if (hexToRgb(raw))
|
|
134
|
+
commit(raw.startsWith('#') ? raw : `#${raw}`);
|
|
135
|
+
}, [commit]);
|
|
136
|
+
return (_jsx(XStack, { ...slot('color-picker'), items: "center", gap: "$2", opacity: disabled ? 0.5 : 1, ...props, children: _jsxs(Popover, { children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx(Button, { variant: "outline", disabled: disabled, justify: "flex-start", width: 220, children: _jsxs(XStack, { width: "100%", items: "center", gap: "$2", children: [_jsx(XStack, { ...slot('color-picker-swatch'), width: 16, height: 16, rounded: "$1", borderWidth: 1, borderColor: "$borderColor", style: { backgroundColor: hex } }), _jsx(SizableText, { flex: 1, numberOfLines: 1, fontFamily: "$mono", size: "$2", children: hex })] }) }) }), _jsx(PopoverContent, { width: SIZE + 24, children: _jsxs(YStack, { gap: "$3", children: [_jsx(SaturationField, { hue: hsv.h, s: hsv.s, v: hsv.v, disabled: disabled, onChange: (s, v) => setHsv({ s, v }) }), _jsx(HueField, { hue: hsv.h, disabled: disabled, onChange: (h) => setHsv({ h }) }), _jsx(Input, { ...slot('color-picker-hex-input'), value: hexDraft, onChangeText: editHex, placeholder: "#000000", disabled: disabled, fontFamily: "$mono", fontSize: "$2" }), presets?.length ? (_jsx(XStack, { ...slot('color-picker-presets'), flexWrap: "wrap", gap: "$2", children: presets.map((preset) => (_jsx(XStack, { ...slot('color-picker-preset'), width: 22, height: 22, rounded: "$1", borderWidth: 1, borderColor: "$borderColor", style: { backgroundColor: preset }, cursor: "pointer", "aria-label": preset, onPress: () => !disabled && commit(preset), ...touch(22) }, preset))) })) : null] }) })] }) }));
|
|
137
|
+
};
|
|
138
|
+
export { ColorPicker };
|
|
139
|
+
//# sourceMappingURL=color-picker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-picker.js","sourceRoot":"","sources":["../../../src/backends/gui/color-picker.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;;;;;;GAUG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAmB,MAAM,YAAY,CAAA;AACzE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAuB,MAAM,OAAO,CAAA;AACnF,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAkB,MAAM,WAAW,CAAA;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAK7B,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;AAE1D,0EAA0E;AAC1E,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAc,EAAE;IAC3C,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IACtC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACxE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IAC7C,OAAO;QACL,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACxC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACxC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;KACzC,CAAA;AACH,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAO,EAAE,EAAE,CACpC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAEvG,MAAM,QAAQ,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAO,EAAO,EAAE;IACzC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,CAAA;IAClB,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,CAAA;IAClB,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,CAAA;IAClB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;IAChC,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,CAAA;IACnB,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACZ,IAAI,GAAG,KAAK,EAAE;YAAE,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;aAClC,IAAI,GAAG,KAAK,EAAE;YAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;;YACrC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC1B,CAAC,IAAI,EAAE,CAAA;QACP,IAAI,CAAC,GAAG,CAAC;YAAE,CAAC,IAAI,GAAG,CAAA;IACrB,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAA;AAClD,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAO,EAAO,EAAE;IACzC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACf,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAChD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACf,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAChB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACxH,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,CAAA;AACpE,CAAC,CAAA;AAED,MAAM,OAAO,GAAG,SAAS,CAAA;AACzB,MAAM,IAAI,GAAG,GAAG,CAAA;AAChB,MAAM,KAAK,GAAG,EAAE,CAAA;AAChB,MAAM,KAAK,GAAG,EAAE,CAAA;AAEhB,yEAAyE;AACzE,MAAM,GAAG,GAAG,CAAC,EAAqB,EAAE,EAAE,CACpC,OAAO,WAAW,KAAK,WAAW,IAAI,EAAE,YAAY,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AAE7E,8FAA8F;AAC9F,MAAM,OAAO,GAAG,CAAC,EAAe,EAAE,CAAY,EAAE,EAAE;IAChD,MAAM,IAAI,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAA;IACvC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAA;IACtE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAA;IACpE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AACvG,CAAC,CAAA;AAED,oEAAoE;AACpE,MAAM,eAAe,GAAG,CAAC,EACvB,GAAG,EACH,CAAC,EACD,CAAC,EACD,QAAQ,EACR,QAAQ,GAOT,EAAE,EAAE;IACH,MAAM,GAAG,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAA;IAC3C,MAAM,GAAG,GAAG,WAAW,CACrB,CAAC,CAAY,EAAE,EAAE;QACf,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAC3B,IAAI,CAAC,EAAE;YAAE,OAAM;QACf,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;QAC/B,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;IACpB,CAAC,EACD,CAAC,QAAQ,CAAC,CACX,CAAA;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAA;IAClF,OAAO,CACL,KAAC,MAAM,IACL,GAAG,EAAE,GAAG,KACJ,IAAI,CAAC,yBAAyB,CAAC,EACnC,QAAQ,EAAC,UAAU,EACnB,KAAK,EAAC,MAAM,EACZ,MAAM,EAAE,IAAI,EACZ,OAAO,EAAC,IAAI,EACZ,QAAQ,EAAC,QAAQ,EACjB,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAC1C,KAAK,EAAE;YACL,eAAe,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3D,eAAe,EACb,0FAA0F;SAC7F,KACG,OAAO,YAEX,KAAC,MAAM,OACD,IAAI,CAAC,+BAA+B,CAAC,EACzC,QAAQ,EAAC,UAAU,EACnB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,KAAK,EACb,OAAO,EAAE,GAAG,EACZ,WAAW,EAAE,CAAC,EACd,KAAK,EAAE;gBACL,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG;gBACnB,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG;gBACxB,SAAS,EAAE,uBAAuB;gBAClC,SAAS,EAAE,0BAA0B;gBACrC,eAAe,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBACrD,WAAW,EAAE,OAAO;aACrB,EACD,aAAa,EAAC,MAAM,GACpB,GACK,CACV,CAAA;AACH,CAAC,CAAA;AAED,kEAAkE;AAClE,MAAM,QAAQ,GAAG,CAAC,EAChB,GAAG,EACH,QAAQ,EACR,QAAQ,GAKT,EAAE,EAAE;IACH,MAAM,GAAG,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAA;IAC3C,MAAM,GAAG,GAAG,WAAW,CACrB,CAAC,CAAY,EAAE,EAAE;QACf,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAC3B,IAAI,CAAC,EAAE;YAAE,OAAM;QACf,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;QAC5B,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC,CAAA;IACnB,CAAC,EACD,CAAC,QAAQ,CAAC,CACX,CAAA;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAA;IAClF,OAAO,CACL,KAAC,MAAM,IACL,GAAG,EAAE,GAAG,KACJ,IAAI,CAAC,kBAAkB,CAAC,EAC5B,QAAQ,EAAC,UAAU,EACnB,KAAK,EAAC,MAAM,EACZ,MAAM,EAAE,KAAK,EACb,OAAO,EAAE,GAAG,EACZ,QAAQ,EAAC,QAAQ,EACjB,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EACxC,KAAK,EAAE;YACL,eAAe,EACb,qEAAqE;SACxE,KACG,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,KACrB,OAAO,YAEX,KAAC,MAAM,OACD,IAAI,CAAC,wBAAwB,CAAC,EAClC,QAAQ,EAAC,UAAU,EACnB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,KAAK,EACb,OAAO,EAAE,GAAG,EACZ,WAAW,EAAE,CAAC,EACd,KAAK,EAAE;gBACL,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG;gBAC7B,GAAG,EAAE,KAAK;gBACV,SAAS,EAAE,uBAAuB;gBAClC,SAAS,EAAE,0BAA0B;gBACrC,eAAe,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC3D,WAAW,EAAE,OAAO;aACrB,EACD,aAAa,EAAC,MAAM,GACpB,GACK,CACV,CAAA;AACH,CAAC,CAAA;AAYD,MAAM,WAAW,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,KAAK,EAAE,OAAO,EAAE,GAAG,KAAK,EAAoB,EAAE,EAAE;IAC3G,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACrC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;IAE/E,MAAM,MAAM,GAAG,WAAW,CACxB,CAAC,IAAY,EAAE,EAAE;QACf,MAAM,CAAC,IAAI,CAAC,CAAA;QACZ,WAAW,CAAC,IAAI,CAAC,CAAA;QACjB,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAA;IAClB,CAAC,EACD,CAAC,QAAQ,CAAC,CACX,CAAA;IAED,MAAM,MAAM,GAAG,WAAW,CACxB,CAAC,KAAmB,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,EACzE,CAAC,MAAM,EAAE,GAAG,CAAC,CACd,CAAA;IAED,MAAM,OAAO,GAAG,WAAW,CACzB,CAAC,GAAW,EAAE,EAAE;QACd,WAAW,CAAC,GAAG,CAAC,CAAA;QAChB,IAAI,QAAQ,CAAC,GAAG,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAA;IAClE,CAAC,EACD,CAAC,MAAM,CAAC,CACT,CAAA;IAED,OAAO,CACL,KAAC,MAAM,OAAK,IAAI,CAAC,cAAc,CAAC,EAAE,KAAK,EAAC,QAAQ,EAAC,GAAG,EAAC,IAAI,EAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAM,KAAK,YAC9F,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,KAAC,MAAM,IAAC,OAAO,EAAC,SAAS,EAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAC,YAAY,EAAC,KAAK,EAAE,GAAG,YAC3E,MAAC,MAAM,IAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,QAAQ,EAAC,GAAG,EAAC,IAAI,aAC1C,KAAC,MAAM,OACD,IAAI,CAAC,qBAAqB,CAAC,EAC/B,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,OAAO,EAAC,IAAI,EACZ,WAAW,EAAE,CAAC,EACd,WAAW,EAAC,cAAc,EAC1B,KAAK,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE,GAC/B,EACF,KAAC,WAAW,IAAC,IAAI,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,UAAU,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,YACjE,GAAG,GACQ,IACP,GACF,GACM,EACjB,KAAC,cAAc,IAAC,KAAK,EAAE,IAAI,GAAG,EAAE,YAC9B,MAAC,MAAM,IAAC,GAAG,EAAC,IAAI,aACd,KAAC,eAAe,IACd,GAAG,EAAE,GAAG,CAAC,CAAC,EACV,CAAC,EAAE,GAAG,CAAC,CAAC,EACR,CAAC,EAAE,GAAG,CAAC,CAAC,EACR,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GACpC,EACF,KAAC,QAAQ,IAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,GAAI,EAC5E,KAAC,KAAK,OACA,IAAI,CAAC,wBAAwB,CAAC,EAClC,KAAK,EAAE,QAAQ,EACf,YAAY,EAAE,OAAO,EACrB,WAAW,EAAC,SAAS,EACrB,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAC,OAAO,EAClB,QAAQ,EAAC,IAAI,GACb,EACD,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CACjB,KAAC,MAAM,OAAK,IAAI,CAAC,sBAAsB,CAAC,EAAE,QAAQ,EAAC,MAAM,EAAC,GAAG,EAAC,IAAI,YAC/D,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACvB,KAAC,MAAM,OAED,IAAI,CAAC,qBAAqB,CAAC,EAC/B,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,OAAO,EAAC,IAAI,EACZ,WAAW,EAAE,CAAC,EACd,WAAW,EAAC,cAAc,EAC1B,KAAK,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,EAClC,MAAM,EAAC,SAAS,gBACJ,MAAM,EAClB,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,KACtC,KAAK,CAAC,EAAE,CAAC,IAXR,MAAM,CAYX,CACH,CAAC,GACK,CACV,CAAC,CAAC,CAAC,IAAI,IACD,GACM,IACT,GACH,CACV,CAAA;AACH,CAAC,CAAA;AAED,OAAO,EAAE,WAAW,EAAE,CAAA"}
|