@humain/ui 2.2.7 → 2.2.9
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/index101.js +2 -2
- package/dist/index101.js.map +1 -1
- package/dist/index103.js +3 -3
- package/dist/index103.js.map +1 -1
- package/dist/index108.js +1 -1
- package/dist/index108.js.map +1 -1
- package/dist/index117.js +1 -1
- package/dist/index117.js.map +1 -1
- package/dist/index122.js +6 -6
- package/dist/index122.js.map +1 -1
- package/dist/index126.js +1 -1
- package/dist/index126.js.map +1 -1
- package/dist/index130.js +2 -2
- package/dist/index130.js.map +1 -1
- package/dist/index146.js +4 -4
- package/dist/index146.js.map +1 -1
- package/dist/index152.js +1 -1
- package/dist/index152.js.map +1 -1
- package/dist/index154.js +2 -2
- package/dist/index154.js.map +1 -1
- package/dist/index166.js +1 -1
- package/dist/index166.js.map +1 -1
- package/dist/index168.js +1 -1
- package/dist/index168.js.map +1 -1
- package/dist/index169.js +1 -1
- package/dist/index169.js.map +1 -1
- package/dist/index173.js +2 -2
- package/dist/index173.js.map +1 -1
- package/dist/index175.js +4 -4
- package/dist/index175.js.map +1 -1
- package/dist/index176.js +2 -2
- package/dist/index176.js.map +1 -1
- package/dist/index177.js +2 -2
- package/dist/index177.js.map +1 -1
- package/dist/index184.js +1 -1
- package/dist/index184.js.map +1 -1
- package/dist/index191.js +3 -3
- package/dist/index191.js.map +1 -1
- package/dist/index192.js +2 -2
- package/dist/index192.js.map +1 -1
- package/dist/index201.js +2 -2
- package/dist/index201.js.map +1 -1
- package/dist/index204.js +4 -4
- package/dist/index204.js.map +1 -1
- package/dist/index228.js +1 -1
- package/dist/index228.js.map +1 -1
- package/dist/index229.js +1 -1
- package/dist/index229.js.map +1 -1
- package/dist/index24.js +2 -2
- package/dist/index24.js.map +1 -1
- package/dist/index5.js +1 -1
- package/dist/index5.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/wc/AICodeBlock.js +41 -41
- package/dist/wc/AICodeBlock.js.map +1 -1
- package/dist/wc/AIMermaidDiagram.js +7 -7
- package/dist/wc/AIMermaidDiagram.js.map +1 -1
- package/dist/wc/AIMessage.js +6 -6
- package/dist/wc/AIMessage.js.map +1 -1
- package/dist/wc/AISource.js +2 -2
- package/dist/wc/AISource.js.map +1 -1
- package/dist/wc/AIToolCall.js +1 -1
- package/dist/wc/AIToolCall.js.map +1 -1
- package/dist/wc/Breadcrumb.js +43 -43
- package/dist/wc/Breadcrumb.js.map +1 -1
- package/dist/wc/DropdownMenu.js +9 -9
- package/dist/wc/DropdownMenu.js.map +1 -1
- package/dist/wc/Kbd.js +22 -22
- package/dist/wc/Kbd.js.map +1 -1
- package/dist/wc/button.js +7 -7
- package/dist/wc/button.js.map +1 -1
- package/dist/wc/close-button.js +19 -19
- package/dist/wc/close-button.js.map +1 -1
- package/dist/wc/hf-ai-prompt-suggestion.js +14 -14
- package/dist/wc/hf-ai-prompt-suggestion.js.map +1 -1
- package/dist/wc/hf-ai-reasoning-block.js +13 -13
- package/dist/wc/hf-ai-reasoning-block.js.map +1 -1
- package/dist/wc/hf-ai-steps.js +53 -53
- package/dist/wc/hf-ai-steps.js.map +1 -1
- package/dist/wc/hf-ai-system-message.js +26 -26
- package/dist/wc/hf-ai-system-message.js.map +1 -1
- package/dist/wc/hf-code-snippet.js +35 -35
- package/dist/wc/hf-code-snippet.js.map +1 -1
- package/dist/wc/hf-command-menu.js +39 -39
- package/dist/wc/hf-command-menu.js.map +1 -1
- package/dist/wc/hf-data-table.js +3 -3
- package/dist/wc/hf-data-table.js.map +1 -1
- package/dist/wc/hf-display-value.js +50 -50
- package/dist/wc/hf-display-value.js.map +1 -1
- package/dist/wc/hf-nav-account-menu.js +5 -5
- package/dist/wc/hf-nav-account-menu.js.map +1 -1
- package/dist/wc/hf-rich-textarea.js +1 -1
- package/dist/wc/hf-rich-textarea.js.map +1 -1
- package/dist/wc/hf-steps.js +8 -8
- package/dist/wc/hf-steps.js.map +1 -1
- package/dist/wc/markdown-renderer.js +1 -1
- package/dist/wc/markdown-renderer.js.map +1 -1
- package/dist/wc/selection-group.js +26 -26
- package/dist/wc/selection-group.js.map +1 -1
- package/dist/wc/syntax-highlight.js +4 -4
- package/dist/wc/syntax-highlight.js.map +1 -1
- package/dist/wc/workflow-step-renderer.js +51 -51
- package/dist/wc/workflow-step-renderer.js.map +1 -1
- package/dist/wc-react/AICodeBlock.js +17 -17
- package/dist/wc-react/AICodeBlock.js.map +1 -1
- package/dist/wc-react/AIMermaidDiagram.js +16 -16
- package/dist/wc-react/AIMermaidDiagram.js.map +1 -1
- package/dist/wc-react/AIMessage.js +7 -7
- package/dist/wc-react/AIMessage.js.map +1 -1
- package/dist/wc-react/AISource.js +41 -41
- package/dist/wc-react/AISource.js.map +1 -1
- package/dist/wc-react/AIToolCall.js +6 -6
- package/dist/wc-react/AIToolCall.js.map +1 -1
- package/dist/wc-react/Breadcrumb.js +18 -18
- package/dist/wc-react/Breadcrumb.js.map +1 -1
- package/dist/wc-react/DropdownMenu.js +27 -27
- package/dist/wc-react/DropdownMenu.js.map +1 -1
- package/dist/wc-react/Kbd.js +17 -17
- package/dist/wc-react/Kbd.js.map +1 -1
- package/dist/wc-react/button.js +12 -12
- package/dist/wc-react/button.js.map +1 -1
- package/dist/wc-react/close-button.js +19 -19
- package/dist/wc-react/close-button.js.map +1 -1
- package/dist/wc-react/hf-ai-prompt-suggestion.js +1 -1
- package/dist/wc-react/hf-ai-prompt-suggestion.js.map +1 -1
- package/dist/wc-react/hf-ai-reasoning-block.js +1 -1
- package/dist/wc-react/hf-ai-reasoning-block.js.map +1 -1
- package/dist/wc-react/hf-ai-steps.js +33 -33
- package/dist/wc-react/hf-ai-steps.js.map +1 -1
- package/dist/wc-react/hf-ai-system-message.js +9 -9
- package/dist/wc-react/hf-ai-system-message.js.map +1 -1
- package/dist/wc-react/hf-code-snippet.js +3 -3
- package/dist/wc-react/hf-code-snippet.js.map +1 -1
- package/dist/wc-react/hf-command-menu.js +56 -56
- package/dist/wc-react/hf-command-menu.js.map +1 -1
- package/dist/wc-react/hf-data-table.js +3 -3
- package/dist/wc-react/hf-data-table.js.map +1 -1
- package/dist/wc-react/hf-display-value.js +58 -58
- package/dist/wc-react/hf-display-value.js.map +1 -1
- package/dist/wc-react/hf-nav-account-menu.js +7 -7
- package/dist/wc-react/hf-nav-account-menu.js.map +1 -1
- package/dist/wc-react/hf-rich-textarea.js +5 -5
- package/dist/wc-react/hf-rich-textarea.js.map +1 -1
- package/dist/wc-react/hf-steps.js +2 -2
- package/dist/wc-react/hf-steps.js.map +1 -1
- package/dist/wc-react/markdown-renderer.js +1 -1
- package/dist/wc-react/markdown-renderer.js.map +1 -1
- package/dist/wc-react/selection-group.js +7 -7
- package/dist/wc-react/selection-group.js.map +1 -1
- package/dist/wc-react/syntax-highlight.js +4 -4
- package/dist/wc-react/syntax-highlight.js.map +1 -1
- package/dist/wc-react/workflow-step-renderer.js +44 -44
- package/dist/wc-react/workflow-step-renderer.js.map +1 -1
- package/package.json +1 -1
- package/skills/humain-ui/SKILL.md +1 -1
- package/skills/humain-ui-wc/SKILL.md +1 -1
- package/skills/humain-ui-wc.skill +0 -0
- package/skills/humain-ui.skill +0 -0
- package/src/tokens.css +4 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hf-code-snippet.js","names":[],"sources":["../../src/components/molecules/data/CodeSnippet/CodeSnippet.tsx","../../src/wc/hf-code-snippet.ts"],"sourcesContent":["'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Check, Copy } from 'lucide-react';\nimport * as React from 'react';\nimport { Button } from '@/components/atoms/buttons/Button';\nimport { SUGAR_HIGH_STYLE } from '@/lib/syntax-highlight';\nimport { renderHighlightedCode } from '@/lib/syntax-highlight-react';\nimport { cn } from '@/lib/utils';\n\nconst codeSnippetVariants = cva('overflow-hidden rounded-xl bg-background', {\n variants: {\n size: {\n sm: 'text-xs',\n md: 'text-base',\n lg: 'text-lg',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n\nconst lineNumberVariants = cva(\n 'select-none font-mono font-bold leading-normal text-text-quaternary',\n {\n variants: {\n size: {\n sm: 'text-xs',\n md: 'text-base',\n lg: 'text-lg',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\nexport interface CodeSnippetProps\n extends VariantProps<typeof codeSnippetVariants> {\n /** Code content to display */\n code: string;\n /** Programming language label shown in the top-right corner */\n language?: string;\n /** Whether to show line numbers */\n showLineNumbers?: boolean;\n /** Starting line number */\n startLineNumber?: number;\n /** Whether to show a copy-to-clipboard button */\n showCopyButton?: boolean;\n /** Additional class name */\n className?: string;\n /** Responsive breakpoint for compact mode */\n breakpoint?: 'desktop' | 'mobile';\n}\n\ninterface LineNumbersProps {\n count: number;\n startLine: number;\n size?: 'sm' | 'md' | 'lg' | null;\n}\n\ninterface CopyFeedbackState {\n copied: boolean;\n resetKey: number;\n}\n\nfunction copyFeedbackReducer(\n state: CopyFeedbackState,\n copied: boolean,\n): CopyFeedbackState {\n return copied\n ? { copied: true, resetKey: state.resetKey + 1 }\n : { ...state, copied: false };\n}\n\nfunction getStartLineNumber(startLineNumber: number): number {\n return Number.isFinite(startLineNumber) ? Math.floor(startLineNumber) : 1;\n}\n\nfunction LineNumbers({ count, startLine, size }: LineNumbersProps) {\n return (\n <div aria-hidden=\"true\" className={cn(lineNumberVariants({ size }))}>\n {Array.from({ length: count }, (_, i) => (\n <span key={i} className=\"block mb-px last:mb-0\">\n {startLine + i}\n </span>\n ))}\n </div>\n );\n}\n\nconst CodeSnippet = React.forwardRef<HTMLElement, CodeSnippetProps>(\n (\n {\n code,\n language,\n showLineNumbers = true,\n startLineNumber = 1,\n showCopyButton = false,\n size,\n className,\n breakpoint = 'desktop',\n },\n ref,\n ) => {\n const highlightedContent = React.useMemo(\n () => renderHighlightedCode(code),\n [code],\n );\n const lineCount = React.useMemo(() => code.split('\\n').length, [code]);\n const safeStartLineNumber = getStartLineNumber(startLineNumber);\n\n const [copyFeedback, setCopyFeedback] = React.useReducer(\n copyFeedbackReducer,\n { copied: false, resetKey: 0 },\n );\n const { copied } = copyFeedback;\n const rootRef = React.useRef<HTMLElement>(null);\n\n // Merge forwarded ref with local ref\n React.useImperativeHandle(ref, () => rootRef.current as HTMLElement);\n\n React.useEffect(() => {\n if (!copyFeedback.copied) return;\n\n const copyResetTimer = setTimeout(() => {\n setCopyFeedback(false);\n }, 2000);\n\n return () => {\n clearTimeout(copyResetTimer);\n };\n }, [copyFeedback]);\n\n const handleCopy = React.useCallback(async () => {\n try {\n const win = rootRef.current?.ownerDocument.defaultView;\n if (!win) return;\n await win.navigator.clipboard.writeText(code);\n setCopyFeedback(true);\n } catch (err) {\n console.error('Failed to copy code:', err);\n }\n }, [code]);\n\n const containerPadding = breakpoint === 'mobile' ? 'p-4' : 'p-6';\n const contentPadding =\n breakpoint === 'mobile' ? 'py-4 px-4 pb-6' : 'py-6 px-6 pb-8';\n\n return (\n <section\n ref={rootRef}\n data-slot=\"code-snippet\"\n aria-label=\"Code snippet\"\n className={cn(\n codeSnippetVariants({ size }),\n 'relative flex items-start justify-center',\n className,\n )}\n style={SUGAR_HIGH_STYLE}\n >\n {/* Language badge & copy button */}\n {(language || showCopyButton) && (\n <div className=\"absolute top-2 end-2 flex items-center gap-2 z-10\">\n {language && (\n <span className=\"text-xs font-medium text-text-quaternary uppercase select-none\">\n {language}\n </span>\n )}\n {showCopyButton && (\n <Button\n appearance=\"ghost\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={handleCopy}\n aria-label={\n copied ? 'Copied to clipboard' : 'Copy code to clipboard'\n }\n className=\"h-7 px-2 text-text-quaternary hover:text-secondary-foreground transition-colors duration-150 ease-out\"\n >\n {copied ? (\n <Check className=\"size-3.5 text-success\" />\n ) : (\n <Copy className=\"size-3.5\" />\n )}\n </Button>\n )}\n </div>\n )}\n\n {/* Line Numbers Sidebar */}\n {showLineNumbers && (\n <div\n className={cn(\n 'shrink-0 self-stretch bg-muted border-e border-border',\n containerPadding,\n )}\n >\n <LineNumbers\n count={lineCount}\n startLine={safeStartLineNumber}\n size={size}\n />\n </div>\n )}\n\n {/* Code Content */}\n <section\n className={cn(\n 'grow min-w-0 overflow-x-auto focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring',\n contentPadding,\n )}\n // biome-ignore lint/a11y/noNoninteractiveTabindex: Focusable scroll region satisfies axe scrollable-region-focusable.\n tabIndex={0}\n aria-label=\"Code content\"\n >\n <pre\n className={cn(\n 'font-mono font-medium leading-normal !bg-transparent !p-0 !m-0 !border-0 !rounded-none',\n '[&_.sh__line]:block [&_.sh__line]:leading-normal [&_.sh__line]:mb-px [&_.sh__line:last-child]:mb-0',\n )}\n >\n {highlightedContent}\n </pre>\n </section>\n </section>\n );\n },\n);\n\nCodeSnippet.displayName = 'CodeSnippet';\n\nexport { CodeSnippet, codeSnippetVariants, lineNumberVariants };\n","/**\n * Web Component wrapper for CodeSnippet\n * Custom element: <hf-code-snippet>\n *\n * @generated by scripts/generate-wc-components.ts\n * DO NOT EDIT MANUALLY\n */\n\nimport React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { CodeSnippet } from '../components/molecules/data/CodeSnippet';\nimport { parseAttr, parseValue, type PropDefs } from './_shared';\n\n/**\n * Prop type definitions for attribute parsing\n */\nconst propTypes: PropDefs = {\n size: 'string',\n code: 'string',\n language: 'string',\n showLineNumbers: 'boolean',\n startLineNumber: 'number',\n showCopyButton: 'boolean',\n className: 'string',\n breakpoint: 'string'\n};\n\nclass CodeSnippetWC extends HTMLElement {\n private _root: ReturnType<typeof createRoot> | null = null;\n private _childrenContainer: HTMLDivElement | null = null;\n private _props: Record<string, unknown> = {};\n private _initialized = false;\n\n connectedCallback() {\n setTimeout(() => this._initialize(), 0);\n }\n\n private _initialize() {\n if (this._initialized) return;\n this._initialized = true;\n\n const originalChildren: Node[] = [];\n for (const child of Array.from(this.childNodes)) {\n if (child.nodeType === Node.TEXT_NODE && !child.textContent?.trim()) {\n continue;\n }\n originalChildren.push(child);\n }\n\n const reactContainer = this.ownerDocument.createElement('div');\n reactContainer.style.display = 'contents';\n\n this._childrenContainer = this.ownerDocument.createElement('div');\n this._childrenContainer.style.display = 'contents';\n\n originalChildren.forEach((child) => this._childrenContainer!.appendChild(child));\n\n while (this.firstChild) this.removeChild(this.firstChild);\n this.appendChild(reactContainer);\n\n this._root = createRoot(reactContainer);\n this._render();\n }\n\n disconnectedCallback() {\n this._root?.unmount();\n this._root = null;\n }\n\n attributeChangedCallback(_name: string, _oldValue: string | null, _newValue: string | null) {\n this._render();\n }\n\n static get observedAttributes() {\n return Object.keys(propTypes).map((prop) =>\n prop.replace(/([A-Z])/g, '-$1').toLowerCase(),\n );\n }\n\n _setProp(name: string, value: unknown) {\n const propType = propTypes[name] || 'string';\n this._props[name] = parseValue(value, propType);\n this._render();\n }\n\n _getProp(name: string): unknown {\n if (name in this._props) {\n return this._props[name];\n }\n const attrName = name.replace(/([A-Z])/g, '-$1').toLowerCase();\n const propType = propTypes[name] || 'string';\n return parseAttr(this.getAttribute(attrName), propType);\n }\n\n private _render() {\n if (!this._root) return;\n\n const props: Record<string, unknown> = {};\n for (const [propName, propType] of Object.entries(propTypes)) {\n if (propName in this._props) {\n props[propName] = this._props[propName];\n } else {\n const attrName = propName.replace(/([A-Z])/g, '-$1').toLowerCase();\n props[propName] = parseAttr(this.getAttribute(attrName), propType);\n }\n }\n\n const element = React.createElement(\n CodeSnippet,\n props,\n );\n\n this._root.render(element);\n }\n}\n\nfor (const propName of Object.keys(propTypes)) {\n Object.defineProperty(CodeSnippetWC.prototype, propName, {\n get() {\n return this._getProp(propName);\n },\n set(value: unknown) {\n this._setProp(propName, value);\n },\n enumerable: true,\n configurable: true,\n });\n}\n\nif (typeof customElements !== 'undefined' && !customElements.get('hf-code-snippet')) {\n customElements.define('hf-code-snippet', CodeSnippetWC);\n}\n\nexport { CodeSnippetWC };\nexport default CodeSnippetWC;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hf-code-snippet.js","names":[],"sources":["../../src/components/molecules/data/CodeSnippet/CodeSnippet.tsx","../../src/wc/hf-code-snippet.ts"],"sourcesContent":["'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Check, Copy } from 'lucide-react';\nimport * as React from 'react';\nimport { Button } from '@/components/atoms/buttons/Button';\nimport { SUGAR_HIGH_STYLE } from '@/lib/syntax-highlight';\nimport { renderHighlightedCode } from '@/lib/syntax-highlight-react';\nimport { cn } from '@/lib/utils';\n\nconst codeSnippetVariants = cva('overflow-hidden rounded-xl bg-background', {\n variants: {\n size: {\n sm: 'text-xs',\n md: 'text-base',\n lg: 'text-lg',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n\nconst lineNumberVariants = cva(\n 'select-none font-mono font-bold leading-normal text-secondary-foreground',\n {\n variants: {\n size: {\n sm: 'text-xs',\n md: 'text-base',\n lg: 'text-lg',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\nexport interface CodeSnippetProps\n extends VariantProps<typeof codeSnippetVariants> {\n /** Code content to display */\n code: string;\n /** Programming language label shown in the top-right corner */\n language?: string;\n /** Whether to show line numbers */\n showLineNumbers?: boolean;\n /** Starting line number */\n startLineNumber?: number;\n /** Whether to show a copy-to-clipboard button */\n showCopyButton?: boolean;\n /** Additional class name */\n className?: string;\n /** Responsive breakpoint for compact mode */\n breakpoint?: 'desktop' | 'mobile';\n}\n\ninterface LineNumbersProps {\n count: number;\n startLine: number;\n size?: 'sm' | 'md' | 'lg' | null;\n}\n\ninterface CopyFeedbackState {\n copied: boolean;\n resetKey: number;\n}\n\nfunction copyFeedbackReducer(\n state: CopyFeedbackState,\n copied: boolean,\n): CopyFeedbackState {\n return copied\n ? { copied: true, resetKey: state.resetKey + 1 }\n : { ...state, copied: false };\n}\n\nfunction getStartLineNumber(startLineNumber: number): number {\n return Number.isFinite(startLineNumber) ? Math.floor(startLineNumber) : 1;\n}\n\nfunction LineNumbers({ count, startLine, size }: LineNumbersProps) {\n return (\n <div aria-hidden=\"true\" className={cn(lineNumberVariants({ size }))}>\n {Array.from({ length: count }, (_, i) => (\n <span key={i} className=\"block mb-px last:mb-0\">\n {startLine + i}\n </span>\n ))}\n </div>\n );\n}\n\nconst CodeSnippet = React.forwardRef<HTMLElement, CodeSnippetProps>(\n (\n {\n code,\n language,\n showLineNumbers = true,\n startLineNumber = 1,\n showCopyButton = false,\n size,\n className,\n breakpoint = 'desktop',\n },\n ref,\n ) => {\n const highlightedContent = React.useMemo(\n () => renderHighlightedCode(code),\n [code],\n );\n const lineCount = React.useMemo(() => code.split('\\n').length, [code]);\n const safeStartLineNumber = getStartLineNumber(startLineNumber);\n\n const [copyFeedback, setCopyFeedback] = React.useReducer(\n copyFeedbackReducer,\n { copied: false, resetKey: 0 },\n );\n const { copied } = copyFeedback;\n const rootRef = React.useRef<HTMLElement>(null);\n\n // Merge forwarded ref with local ref\n React.useImperativeHandle(ref, () => rootRef.current as HTMLElement);\n\n React.useEffect(() => {\n if (!copyFeedback.copied) return;\n\n const copyResetTimer = setTimeout(() => {\n setCopyFeedback(false);\n }, 2000);\n\n return () => {\n clearTimeout(copyResetTimer);\n };\n }, [copyFeedback]);\n\n const handleCopy = React.useCallback(async () => {\n try {\n const win = rootRef.current?.ownerDocument.defaultView;\n if (!win) return;\n await win.navigator.clipboard.writeText(code);\n setCopyFeedback(true);\n } catch (err) {\n console.error('Failed to copy code:', err);\n }\n }, [code]);\n\n const containerPadding = breakpoint === 'mobile' ? 'p-4' : 'p-6';\n const contentPadding =\n breakpoint === 'mobile' ? 'py-4 px-4 pb-6' : 'py-6 px-6 pb-8';\n\n return (\n <section\n ref={rootRef}\n data-slot=\"code-snippet\"\n aria-label=\"Code snippet\"\n className={cn(\n codeSnippetVariants({ size }),\n 'relative flex items-start justify-center',\n className,\n )}\n style={SUGAR_HIGH_STYLE}\n >\n {/* Language badge & copy button */}\n {(language || showCopyButton) && (\n <div className=\"absolute top-2 end-2 flex items-center gap-2 z-10\">\n {language && (\n <span className=\"text-xs font-medium text-secondary-foreground uppercase select-none\">\n {language}\n </span>\n )}\n {showCopyButton && (\n <Button\n appearance=\"ghost\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={handleCopy}\n aria-label={\n copied ? 'Copied to clipboard' : 'Copy code to clipboard'\n }\n className=\"h-7 px-2 text-secondary-foreground hover:text-foreground transition-colors duration-150 ease-out\"\n >\n {copied ? (\n <Check className=\"size-3.5 text-success\" />\n ) : (\n <Copy className=\"size-3.5\" />\n )}\n </Button>\n )}\n </div>\n )}\n\n {/* Line Numbers Sidebar */}\n {showLineNumbers && (\n <div\n className={cn(\n 'shrink-0 self-stretch bg-muted border-e border-border',\n containerPadding,\n )}\n >\n <LineNumbers\n count={lineCount}\n startLine={safeStartLineNumber}\n size={size}\n />\n </div>\n )}\n\n {/* Code Content */}\n <section\n className={cn(\n 'grow min-w-0 overflow-x-auto focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring',\n contentPadding,\n )}\n // biome-ignore lint/a11y/noNoninteractiveTabindex: Focusable scroll region satisfies axe scrollable-region-focusable.\n tabIndex={0}\n aria-label=\"Code content\"\n >\n <pre\n className={cn(\n 'font-mono font-medium leading-normal !bg-transparent !p-0 !m-0 !border-0 !rounded-none',\n '[&_.sh__line]:block [&_.sh__line]:leading-normal [&_.sh__line]:mb-px [&_.sh__line:last-child]:mb-0',\n )}\n >\n {highlightedContent}\n </pre>\n </section>\n </section>\n );\n },\n);\n\nCodeSnippet.displayName = 'CodeSnippet';\n\nexport { CodeSnippet, codeSnippetVariants, lineNumberVariants };\n","/**\n * Web Component wrapper for CodeSnippet\n * Custom element: <hf-code-snippet>\n *\n * @generated by scripts/generate-wc-components.ts\n * DO NOT EDIT MANUALLY\n */\n\nimport React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { CodeSnippet } from '../components/molecules/data/CodeSnippet';\nimport { parseAttr, parseValue, type PropDefs } from './_shared';\n\n/**\n * Prop type definitions for attribute parsing\n */\nconst propTypes: PropDefs = {\n size: 'string',\n code: 'string',\n language: 'string',\n showLineNumbers: 'boolean',\n startLineNumber: 'number',\n showCopyButton: 'boolean',\n className: 'string',\n breakpoint: 'string'\n};\n\nclass CodeSnippetWC extends HTMLElement {\n private _root: ReturnType<typeof createRoot> | null = null;\n private _childrenContainer: HTMLDivElement | null = null;\n private _props: Record<string, unknown> = {};\n private _initialized = false;\n\n connectedCallback() {\n setTimeout(() => this._initialize(), 0);\n }\n\n private _initialize() {\n if (this._initialized) return;\n this._initialized = true;\n\n const originalChildren: Node[] = [];\n for (const child of Array.from(this.childNodes)) {\n if (child.nodeType === Node.TEXT_NODE && !child.textContent?.trim()) {\n continue;\n }\n originalChildren.push(child);\n }\n\n const reactContainer = this.ownerDocument.createElement('div');\n reactContainer.style.display = 'contents';\n\n this._childrenContainer = this.ownerDocument.createElement('div');\n this._childrenContainer.style.display = 'contents';\n\n originalChildren.forEach((child) => this._childrenContainer!.appendChild(child));\n\n while (this.firstChild) this.removeChild(this.firstChild);\n this.appendChild(reactContainer);\n\n this._root = createRoot(reactContainer);\n this._render();\n }\n\n disconnectedCallback() {\n this._root?.unmount();\n this._root = null;\n }\n\n attributeChangedCallback(_name: string, _oldValue: string | null, _newValue: string | null) {\n this._render();\n }\n\n static get observedAttributes() {\n return Object.keys(propTypes).map((prop) =>\n prop.replace(/([A-Z])/g, '-$1').toLowerCase(),\n );\n }\n\n _setProp(name: string, value: unknown) {\n const propType = propTypes[name] || 'string';\n this._props[name] = parseValue(value, propType);\n this._render();\n }\n\n _getProp(name: string): unknown {\n if (name in this._props) {\n return this._props[name];\n }\n const attrName = name.replace(/([A-Z])/g, '-$1').toLowerCase();\n const propType = propTypes[name] || 'string';\n return parseAttr(this.getAttribute(attrName), propType);\n }\n\n private _render() {\n if (!this._root) return;\n\n const props: Record<string, unknown> = {};\n for (const [propName, propType] of Object.entries(propTypes)) {\n if (propName in this._props) {\n props[propName] = this._props[propName];\n } else {\n const attrName = propName.replace(/([A-Z])/g, '-$1').toLowerCase();\n props[propName] = parseAttr(this.getAttribute(attrName), propType);\n }\n }\n\n const element = React.createElement(\n CodeSnippet,\n props,\n );\n\n this._root.render(element);\n }\n}\n\nfor (const propName of Object.keys(propTypes)) {\n Object.defineProperty(CodeSnippetWC.prototype, propName, {\n get() {\n return this._getProp(propName);\n },\n set(value: unknown) {\n this._setProp(propName, value);\n },\n enumerable: true,\n configurable: true,\n });\n}\n\nif (typeof customElements !== 'undefined' && !customElements.get('hf-code-snippet')) {\n customElements.define('hf-code-snippet', CodeSnippetWC);\n}\n\nexport { CodeSnippetWC };\nexport default CodeSnippetWC;\n"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { c as
|
|
2
|
-
import { t as
|
|
3
|
-
import { t as
|
|
4
|
-
import { t as
|
|
5
|
-
import { t as
|
|
6
|
-
import { t as
|
|
1
|
+
import { c as R, f as c, s as T } from "./_shared.js";
|
|
2
|
+
import { t as $ } from "./createLucideIcon.js";
|
|
3
|
+
import { t as W } from "./arrow-down.js";
|
|
4
|
+
import { t as Z } from "./arrow-up.js";
|
|
5
|
+
import { t as X } from "./search.js";
|
|
6
|
+
import { t as q } from "./settings.js";
|
|
7
7
|
import { t as K } from "./Avatar.js";
|
|
8
8
|
import { n as J, t as Q } from "./button.js";
|
|
9
9
|
import { t as D } from "./Kbd.js";
|
|
@@ -12,14 +12,14 @@ import * as E from "react";
|
|
|
12
12
|
import M from "react";
|
|
13
13
|
import { createRoot as ie } from "react-dom/client";
|
|
14
14
|
import { jsx as n, jsxs as s } from "react/jsx-runtime";
|
|
15
|
-
var
|
|
15
|
+
var ce = [["path", {
|
|
16
16
|
d: "M20 4v7a4 4 0 0 1-4 4H4",
|
|
17
17
|
key: "6o5b7l"
|
|
18
18
|
}], ["path", {
|
|
19
19
|
d: "m9 10-5 5 5 5",
|
|
20
20
|
key: "1kshq7"
|
|
21
|
-
}]],
|
|
22
|
-
function
|
|
21
|
+
}]], le = $("corner-down-left", ce), k = 336, L = "Type a command or search...", de = "w-full max-w-[508px] overflow-hidden rounded-xl border border-input bg-background shadow-lg";
|
|
22
|
+
function me(e) {
|
|
23
23
|
return Number.isFinite(e) && e >= 0 ? e : k;
|
|
24
24
|
}
|
|
25
25
|
function H() {
|
|
@@ -32,7 +32,7 @@ function S({ children: e, className: t }) {
|
|
|
32
32
|
return /* @__PURE__ */ n(D, {
|
|
33
33
|
variant: "solid",
|
|
34
34
|
size: "sm",
|
|
35
|
-
className:
|
|
35
|
+
className: c("shadow-xs", t),
|
|
36
36
|
children: e
|
|
37
37
|
});
|
|
38
38
|
}
|
|
@@ -41,14 +41,14 @@ function v({ children: e, className: t }) {
|
|
|
41
41
|
return /* @__PURE__ */ n(D, {
|
|
42
42
|
variant: "footer",
|
|
43
43
|
size: "sm",
|
|
44
|
-
className:
|
|
44
|
+
className: c("p-1.5", t),
|
|
45
45
|
children: e
|
|
46
46
|
});
|
|
47
47
|
}
|
|
48
48
|
v.displayName = "CommandMenu.FooterNavIcon";
|
|
49
49
|
function j({ children: e, className: t }) {
|
|
50
50
|
return /* @__PURE__ */ n("span", {
|
|
51
|
-
className:
|
|
51
|
+
className: c("text-sm font-semibold text-secondary-foreground", t),
|
|
52
52
|
children: e
|
|
53
53
|
});
|
|
54
54
|
}
|
|
@@ -57,19 +57,19 @@ var ue = [
|
|
|
57
57
|
{
|
|
58
58
|
keys: /* @__PURE__ */ s("div", {
|
|
59
59
|
className: "flex items-center gap-1",
|
|
60
|
-
children: [/* @__PURE__ */ n(v, { children: /* @__PURE__ */ n(
|
|
60
|
+
children: [/* @__PURE__ */ n(v, { children: /* @__PURE__ */ n(Z, { className: "size-2.5 text-secondary-foreground" }) }), /* @__PURE__ */ n(v, { children: /* @__PURE__ */ n(W, { className: "size-2.5 text-secondary-foreground" }) })]
|
|
61
61
|
}),
|
|
62
62
|
label: "to navigate"
|
|
63
63
|
},
|
|
64
64
|
{
|
|
65
|
-
keys: /* @__PURE__ */ n(v, { children: /* @__PURE__ */ n(
|
|
65
|
+
keys: /* @__PURE__ */ n(v, { children: /* @__PURE__ */ n(le, { className: "size-2.5 text-secondary-foreground" }) }),
|
|
66
66
|
label: "to select"
|
|
67
67
|
},
|
|
68
68
|
{
|
|
69
69
|
keys: /* @__PURE__ */ n(v, {
|
|
70
70
|
className: "px-1.5 py-1",
|
|
71
71
|
children: /* @__PURE__ */ n("span", {
|
|
72
|
-
className: "text-xs font-semibold text-
|
|
72
|
+
className: "text-xs font-semibold text-secondary-foreground",
|
|
73
73
|
children: "esc"
|
|
74
74
|
})
|
|
75
75
|
}),
|
|
@@ -79,7 +79,7 @@ var ue = [
|
|
|
79
79
|
function F({ hints: e = ue, showSettingsButton: t = !1, onSettingsClick: r, className: a }) {
|
|
80
80
|
return /* @__PURE__ */ s("div", {
|
|
81
81
|
"data-slot": "command-menu-footer",
|
|
82
|
-
className:
|
|
82
|
+
className: c("flex items-center gap-3 border-t border-border bg-card/80 py-2 pe-2 ps-[18px] supports-backdrop-filter:backdrop-blur", a),
|
|
83
83
|
children: [/* @__PURE__ */ n("div", {
|
|
84
84
|
className: "hidden flex-1 items-start gap-4 [@media(hover:hover)]:flex",
|
|
85
85
|
children: e.map((o) => /* @__PURE__ */ s("div", {
|
|
@@ -93,7 +93,7 @@ function F({ hints: e = ue, showSettingsButton: t = !1, onSettingsClick: r, clas
|
|
|
93
93
|
className: "group ms-auto rounded-full bg-muted",
|
|
94
94
|
onClick: r,
|
|
95
95
|
"aria-label": "Settings",
|
|
96
|
-
children: /* @__PURE__ */ n(
|
|
96
|
+
children: /* @__PURE__ */ n(q, { className: "size-5 text-muted-foreground transition-transform duration-300 ease-out group-hover:rotate-90 motion-reduce:transition-none" })
|
|
97
97
|
})]
|
|
98
98
|
});
|
|
99
99
|
}
|
|
@@ -104,7 +104,7 @@ function O({ option: e, onSelect: t, className: r, ...a }) {
|
|
|
104
104
|
disabled: e.disabled,
|
|
105
105
|
showCheckIndicator: !1,
|
|
106
106
|
onSelect: () => t?.(e.id, e),
|
|
107
|
-
className:
|
|
107
|
+
className: c("flex cursor-pointer items-center gap-2 transition-colors duration-150 motion-reduce:transition-none", r),
|
|
108
108
|
...a,
|
|
109
109
|
children: [
|
|
110
110
|
e.avatar && /* @__PURE__ */ n(K, {
|
|
@@ -138,7 +138,7 @@ O.displayName = "CommandMenu.Item";
|
|
|
138
138
|
function P({ children: e, className: t, ...r }) {
|
|
139
139
|
return /* @__PURE__ */ n("h3", {
|
|
140
140
|
"data-slot": "command-menu-group-header",
|
|
141
|
-
className:
|
|
141
|
+
className: c("px-2 py-1.5 text-xs font-medium text-muted-foreground", t),
|
|
142
142
|
...r,
|
|
143
143
|
children: e
|
|
144
144
|
});
|
|
@@ -168,20 +168,20 @@ function pe({ children: e, groups: t, options: r, optionRenderer: a }) {
|
|
|
168
168
|
children: r.map(a)
|
|
169
169
|
}));
|
|
170
170
|
}
|
|
171
|
-
function A({ children: e, groups: t, options: r, onSelect: a, onClose: o, placeholder: i, emptyText:
|
|
172
|
-
const y =
|
|
171
|
+
function A({ children: e, groups: t, options: r, onSelect: a, onClose: o, placeholder: i, emptyText: m, emptyState: u, showShortcut: p, shortcutText: h, showFooter: f, footerHints: C, showSettingsButton: b, onSettingsClick: g, maxHeight: N, filter: x }) {
|
|
172
|
+
const y = me(N);
|
|
173
173
|
return /* @__PURE__ */ s(oe, {
|
|
174
|
-
filter:
|
|
174
|
+
filter: x,
|
|
175
175
|
className: "rounded-none border-0 shadow-none",
|
|
176
176
|
"data-slot": "command-menu",
|
|
177
177
|
children: [
|
|
178
178
|
/* @__PURE__ */ n("search", {
|
|
179
179
|
"aria-label": "Command menu search",
|
|
180
180
|
className: "block border-b border-input bg-background",
|
|
181
|
-
children: /* @__PURE__ */ n(te, { render: ({ clearSearch:
|
|
182
|
-
const z = typeof o == "function",
|
|
183
|
-
if (
|
|
184
|
-
|
|
181
|
+
children: /* @__PURE__ */ n(te, { render: ({ clearSearch: l, value: d, ...U }) => {
|
|
182
|
+
const z = typeof o == "function", V = () => {
|
|
183
|
+
if (d) {
|
|
184
|
+
l();
|
|
185
185
|
return;
|
|
186
186
|
}
|
|
187
187
|
o?.();
|
|
@@ -191,13 +191,13 @@ function A({ children: e, groups: t, options: r, onSelect: a, onClose: o, placeh
|
|
|
191
191
|
"cmdk-input-wrapper": "",
|
|
192
192
|
className: "flex h-11 items-center gap-2 px-3",
|
|
193
193
|
children: [
|
|
194
|
-
/* @__PURE__ */ n(
|
|
194
|
+
/* @__PURE__ */ n(X, {
|
|
195
195
|
className: "size-4 shrink-0 text-muted-foreground opacity-50",
|
|
196
196
|
"aria-hidden": "true"
|
|
197
197
|
}),
|
|
198
198
|
/* @__PURE__ */ n("input", {
|
|
199
|
-
...
|
|
200
|
-
value:
|
|
199
|
+
...U,
|
|
200
|
+
value: d,
|
|
201
201
|
placeholder: i,
|
|
202
202
|
"aria-label": i,
|
|
203
203
|
className: "min-w-0 flex-1 bg-transparent text-sm leading-5 text-foreground outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50"
|
|
@@ -206,9 +206,9 @@ function A({ children: e, groups: t, options: r, onSelect: a, onClose: o, placeh
|
|
|
206
206
|
/* @__PURE__ */ n(J, {
|
|
207
207
|
size: "icon-xs",
|
|
208
208
|
className: "-me-1 rounded-sm p-0 opacity-50 hover:opacity-80 focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:size-4",
|
|
209
|
-
disabled: !
|
|
210
|
-
"aria-label":
|
|
211
|
-
onClick:
|
|
209
|
+
disabled: !d && !z,
|
|
210
|
+
"aria-label": d ? "Clear search" : z ? "Close command menu" : "Clear search",
|
|
211
|
+
onClick: V
|
|
212
212
|
})
|
|
213
213
|
]
|
|
214
214
|
});
|
|
@@ -219,58 +219,58 @@ function A({ children: e, groups: t, options: r, onSelect: a, onClose: o, placeh
|
|
|
219
219
|
className: "overflow-y-auto p-0",
|
|
220
220
|
children: [/* @__PURE__ */ n(re, {
|
|
221
221
|
className: "py-6 text-center text-sm text-muted-foreground animate-in fade-in-0 duration-200 motion-reduce:animate-none",
|
|
222
|
-
children: u ||
|
|
222
|
+
children: u || m
|
|
223
223
|
}), /* @__PURE__ */ n(pe, {
|
|
224
224
|
groups: t,
|
|
225
225
|
options: r,
|
|
226
|
-
optionRenderer: (
|
|
227
|
-
option:
|
|
226
|
+
optionRenderer: (l) => /* @__PURE__ */ n(O, {
|
|
227
|
+
option: l,
|
|
228
228
|
onSelect: a
|
|
229
|
-
},
|
|
229
|
+
}, l.id),
|
|
230
230
|
children: e
|
|
231
231
|
})]
|
|
232
232
|
}),
|
|
233
233
|
f && /* @__PURE__ */ n(F, {
|
|
234
234
|
hints: C,
|
|
235
235
|
showSettingsButton: b,
|
|
236
|
-
onSettingsClick:
|
|
236
|
+
onSettingsClick: g
|
|
237
237
|
})
|
|
238
238
|
]
|
|
239
239
|
});
|
|
240
240
|
}
|
|
241
241
|
A.displayName = "CommandMenu.Body";
|
|
242
|
-
function B({ open: e, onOpenChange: t, placeholder: r = L, emptyText: a = "No results found.", emptyState: o, options: i = [], groups:
|
|
243
|
-
const
|
|
242
|
+
function B({ open: e, onOpenChange: t, placeholder: r = L, emptyText: a = "No results found.", emptyState: o, options: i = [], groups: m = [], onSelect: u, showShortcut: p = !1, shortcutText: h, showFooter: f = !1, footerHints: C, showSettingsButton: b = !1, onSettingsClick: g, className: N, maxHeight: x = k, filter: y, children: w }) {
|
|
243
|
+
const l = H(), d = h ?? l;
|
|
244
244
|
return /* @__PURE__ */ n(se, {
|
|
245
245
|
open: e,
|
|
246
246
|
onOpenChange: t,
|
|
247
|
-
className:
|
|
247
|
+
className: c("max-w-[508px] sm:max-w-[508px]", N),
|
|
248
248
|
children: /* @__PURE__ */ n(A, {
|
|
249
249
|
placeholder: r,
|
|
250
250
|
emptyText: a,
|
|
251
251
|
emptyState: o,
|
|
252
252
|
options: i,
|
|
253
|
-
groups:
|
|
253
|
+
groups: m,
|
|
254
254
|
onSelect: u,
|
|
255
255
|
onClose: () => t?.(!1),
|
|
256
256
|
showShortcut: p,
|
|
257
|
-
shortcutText:
|
|
257
|
+
shortcutText: d,
|
|
258
258
|
showFooter: f,
|
|
259
259
|
footerHints: C,
|
|
260
260
|
showSettingsButton: b,
|
|
261
|
-
onSettingsClick:
|
|
262
|
-
maxHeight:
|
|
261
|
+
onSettingsClick: g,
|
|
262
|
+
maxHeight: x,
|
|
263
263
|
filter: y,
|
|
264
264
|
children: w
|
|
265
265
|
})
|
|
266
266
|
});
|
|
267
267
|
}
|
|
268
268
|
B.displayName = "CommandMenu";
|
|
269
|
-
function he({ placeholder: e = L, emptyText: t = "No results found.", emptyState: r, options: a = [], groups: o = [], onSelect: i, showShortcut:
|
|
269
|
+
function he({ placeholder: e = L, emptyText: t = "No results found.", emptyState: r, options: a = [], groups: o = [], onSelect: i, showShortcut: m = !1, shortcutText: u, showFooter: p = !1, footerHints: h, showSettingsButton: f = !1, onSettingsClick: C, className: b, maxHeight: g = k, filter: N, children: x }) {
|
|
270
270
|
const y = H(), w = u ?? y;
|
|
271
271
|
return /* @__PURE__ */ n("div", {
|
|
272
272
|
"data-slot": "command-menu-panel",
|
|
273
|
-
className:
|
|
273
|
+
className: c(de, b),
|
|
274
274
|
children: /* @__PURE__ */ n(A, {
|
|
275
275
|
placeholder: e,
|
|
276
276
|
emptyText: t,
|
|
@@ -278,15 +278,15 @@ function he({ placeholder: e = L, emptyText: t = "No results found.", emptyState
|
|
|
278
278
|
options: a,
|
|
279
279
|
groups: o,
|
|
280
280
|
onSelect: i,
|
|
281
|
-
showShortcut:
|
|
281
|
+
showShortcut: m,
|
|
282
282
|
shortcutText: w,
|
|
283
283
|
showFooter: p,
|
|
284
284
|
footerHints: h,
|
|
285
285
|
showSettingsButton: f,
|
|
286
286
|
onSettingsClick: C,
|
|
287
|
-
maxHeight:
|
|
288
|
-
filter:
|
|
289
|
-
children:
|
|
287
|
+
maxHeight: g,
|
|
288
|
+
filter: N,
|
|
289
|
+
children: x
|
|
290
290
|
})
|
|
291
291
|
});
|
|
292
292
|
}
|
|
@@ -341,7 +341,7 @@ var _ = {
|
|
|
341
341
|
className: "string",
|
|
342
342
|
maxHeight: "number",
|
|
343
343
|
filter: "json"
|
|
344
|
-
},
|
|
344
|
+
}, G = class extends HTMLElement {
|
|
345
345
|
_root = null;
|
|
346
346
|
_childrenContainer = null;
|
|
347
347
|
_props = {};
|
|
@@ -370,7 +370,7 @@ var _ = {
|
|
|
370
370
|
}
|
|
371
371
|
_setProp(e, t) {
|
|
372
372
|
const r = _[e] || "string";
|
|
373
|
-
this._props[e] =
|
|
373
|
+
this._props[e] = R(t, r), this._render();
|
|
374
374
|
}
|
|
375
375
|
_getProp(e) {
|
|
376
376
|
if (e in this._props) return this._props[e];
|
|
@@ -397,7 +397,7 @@ var _ = {
|
|
|
397
397
|
this._root.render(t);
|
|
398
398
|
}
|
|
399
399
|
};
|
|
400
|
-
for (const e of Object.keys(_)) Object.defineProperty(
|
|
400
|
+
for (const e of Object.keys(_)) Object.defineProperty(G.prototype, e, {
|
|
401
401
|
get() {
|
|
402
402
|
return this._getProp(e);
|
|
403
403
|
},
|
|
@@ -407,10 +407,10 @@ for (const e of Object.keys(_)) Object.defineProperty(q.prototype, e, {
|
|
|
407
407
|
enumerable: !0,
|
|
408
408
|
configurable: !0
|
|
409
409
|
});
|
|
410
|
-
typeof customElements < "u" && !customElements.get("hf-command-menu") && customElements.define("hf-command-menu",
|
|
410
|
+
typeof customElements < "u" && !customElements.get("hf-command-menu") && customElements.define("hf-command-menu", G);
|
|
411
411
|
export {
|
|
412
|
-
|
|
413
|
-
|
|
412
|
+
G as CommandMenuWC,
|
|
413
|
+
G as default
|
|
414
414
|
};
|
|
415
415
|
|
|
416
416
|
//# sourceMappingURL=hf-command-menu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hf-command-menu.js","names":[],"sources":["../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.27.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/corner-down-left.mjs","../../src/components/organisms/menus/CommandMenu/CommandMenu.tsx","../../src/wc/hf-command-menu.ts"],"sourcesContent":["/**\n * @license lucide-react v1.27.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M20 4v7a4 4 0 0 1-4 4H4\", key: \"6o5b7l\" }],\n [\"path\", { d: \"m9 10-5 5 5 5\", key: \"1kshq7\" }]\n];\nconst CornerDownLeft = createLucideIcon(\"corner-down-left\", __iconNode);\n\nexport { __iconNode, CornerDownLeft as default };\n//# sourceMappingURL=corner-down-left.mjs.map\n","'use client';\n\nimport {\n ArrowDown,\n ArrowUp,\n CornerDownLeft,\n Search,\n Settings,\n} from 'lucide-react';\nimport * as React from 'react';\nimport { Button, ClearButton } from '@/components/atoms/buttons/Button';\nimport { Avatar } from '@/components/molecules/data/Avatar';\nimport { Kbd } from '@/components/molecules/data/Kbd';\nimport {\n Command,\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from '@/components/ui/command';\nimport { cn } from '@/lib/utils';\n\nconst DEFAULT_COMMAND_MENU_MAX_HEIGHT = 336;\nconst DEFAULT_COMMAND_MENU_PLACEHOLDER = 'Type a command or search...';\nconst COMMAND_MENU_SHELL_CLASS_NAME =\n 'w-full max-w-[508px] overflow-hidden rounded-xl border border-input bg-background shadow-lg';\n\nfunction getCommandMenuMaxHeight(maxHeight: number): number {\n return Number.isFinite(maxHeight) && maxHeight >= 0\n ? maxHeight\n : DEFAULT_COMMAND_MENU_MAX_HEIGHT;\n}\n\n// ============================================\n// Types\n// ============================================\n\nexport interface CommandMenuOption {\n /** Unique identifier for the option */\n id: string;\n /** Display label for the option */\n label: string;\n /** Optional subtitle (e.g., @username, email) */\n subtitle?: string;\n /** Optional icon to display (mutually exclusive with avatar) */\n icon?: React.ReactNode;\n /** Optional avatar configuration */\n avatar?: {\n src?: string;\n fallback?: string;\n };\n /** Whether the option is disabled */\n disabled?: boolean;\n /** Keyboard shortcut to display */\n shortcut?: string;\n}\n\nexport interface CommandMenuGroup {\n /** Unique identifier for the group */\n id: string;\n /** Group label/heading */\n label: string;\n /** Options in this group */\n options: CommandMenuOption[];\n}\n\nexport interface CommandMenuFooterHint {\n /** Icon or keyboard key indicator */\n keys: React.ReactNode;\n /** Text describing the action */\n label: string;\n}\n\nexport interface CommandMenuProps {\n /** Whether the command menu is open */\n open?: boolean;\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void;\n /** Placeholder text for the search input */\n placeholder?: string;\n /** Text to show when no results found */\n emptyText?: string;\n /** Empty state content (replaces emptyText when provided) */\n emptyState?: React.ReactNode;\n /** Flat list of options */\n options?: CommandMenuOption[];\n /** Grouped options */\n groups?: CommandMenuGroup[];\n /** Callback when an option is selected */\n onSelect?: (id: string, option: CommandMenuOption) => void;\n /** Whether to show keyboard shortcut badge in input */\n showShortcut?: boolean;\n /** Keyboard shortcut text to display (auto-detects platform when omitted) */\n shortcutText?: string;\n /** Whether to show the footer with navigation hints */\n showFooter?: boolean;\n /** Custom footer hints */\n footerHints?: CommandMenuFooterHint[];\n /** Whether to show settings button in footer */\n showSettingsButton?: boolean;\n /** Callback when settings button is clicked */\n onSettingsClick?: () => void;\n /** Additional class name for the dialog */\n className?: string;\n /** Maximum height of the list */\n maxHeight?: number;\n /** Custom filter function */\n filter?: (value: string, search: string) => number;\n /** Children for custom content */\n children?: React.ReactNode;\n}\n\n// ============================================\n// Platform detection\n// ============================================\n\nfunction usePlatformShortcut() {\n const [shortcut, setShortcut] = React.useState('\\u2318/');\n React.useEffect(() => {\n if (!/Mac|iPhone|iPad/i.test(navigator.userAgent)) {\n setShortcut('Ctrl /');\n }\n }, []);\n return shortcut;\n}\n\n// ============================================\n// Keyboard Shortcut Badge (uses Kbd wrapper)\n// ============================================\n\nfunction CommandShortcutBadge({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <Kbd variant=\"solid\" size=\"sm\" className={cn('shadow-xs', className)}>\n {children}\n </Kbd>\n );\n}\nCommandShortcutBadge.displayName = 'CommandMenu.ShortcutBadge';\n\n// ============================================\n// Footer Navigation Icon (uses Kbd wrapper)\n// ============================================\n\nfunction FooterNavIcon({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <Kbd variant=\"footer\" size=\"sm\" className={cn('p-1.5', className)}>\n {children}\n </Kbd>\n );\n}\nFooterNavIcon.displayName = 'CommandMenu.FooterNavIcon';\n\nfunction FooterNavText({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <span\n className={cn('text-sm font-semibold text-text-quaternary', className)}\n >\n {children}\n </span>\n );\n}\nFooterNavText.displayName = 'CommandMenu.FooterNavText';\n\n// ============================================\n// Default Footer Hints\n// ============================================\n\nconst defaultFooterHints: CommandMenuFooterHint[] = [\n {\n keys: (\n <div className=\"flex items-center gap-1\">\n <FooterNavIcon>\n <ArrowUp className=\"size-2.5 text-text-quaternary\" />\n </FooterNavIcon>\n <FooterNavIcon>\n <ArrowDown className=\"size-2.5 text-text-quaternary\" />\n </FooterNavIcon>\n </div>\n ),\n label: 'to navigate',\n },\n {\n keys: (\n <FooterNavIcon>\n <CornerDownLeft className=\"size-2.5 text-text-quaternary\" />\n </FooterNavIcon>\n ),\n label: 'to select',\n },\n {\n keys: (\n <FooterNavIcon className=\"px-1.5 py-1\">\n <span className=\"text-xs font-semibold text-text-quaternary\">esc</span>\n </FooterNavIcon>\n ),\n label: 'to close',\n },\n];\n\n// ============================================\n// Command Menu Footer\n// ============================================\n\nexport interface CommandMenuFooterProps {\n hints?: CommandMenuFooterHint[];\n showSettingsButton?: boolean;\n onSettingsClick?: () => void;\n className?: string;\n}\n\nfunction CommandMenuFooter({\n hints = defaultFooterHints,\n showSettingsButton = false,\n onSettingsClick,\n className,\n}: CommandMenuFooterProps) {\n return (\n <div\n data-slot=\"command-menu-footer\"\n className={cn(\n 'flex items-center gap-3 border-t border-border bg-card/80 py-2 pe-2 ps-[18px] supports-backdrop-filter:backdrop-blur',\n className,\n )}\n >\n <div className=\"hidden flex-1 items-start gap-4 [@media(hover:hover)]:flex\">\n {hints.map((hint) => (\n <div key={hint.label} className=\"flex items-center gap-2\">\n {hint.keys}\n <FooterNavText>{hint.label}</FooterNavText>\n </div>\n ))}\n </div>\n {showSettingsButton && (\n <Button\n appearance=\"ghost\"\n variant=\"secondary\"\n size=\"icon\"\n className=\"group ms-auto rounded-full bg-muted\"\n onClick={onSettingsClick}\n aria-label=\"Settings\"\n >\n <Settings className=\"size-5 text-muted-foreground transition-transform duration-300 ease-out group-hover:rotate-90 motion-reduce:transition-none\" />\n </Button>\n )}\n </div>\n );\n}\nCommandMenuFooter.displayName = 'CommandMenu.Footer';\n\n// ============================================\n// Command Menu Item\n// ============================================\n\nexport interface CommandMenuItemProps\n extends Omit<\n React.ComponentProps<typeof CommandItem>,\n 'onSelect' | 'showCheckIndicator' | 'value'\n > {\n option: CommandMenuOption;\n onSelect?: (id: string, option: CommandMenuOption) => void;\n}\n\nfunction CommandMenuItem({\n option,\n onSelect,\n className,\n ...props\n}: CommandMenuItemProps) {\n return (\n <CommandItem\n value={option.id}\n disabled={option.disabled}\n showCheckIndicator={false}\n onSelect={() => onSelect?.(option.id, option)}\n className={cn(\n 'flex cursor-pointer items-center gap-2 transition-colors duration-150 motion-reduce:transition-none',\n className,\n )}\n {...props}\n >\n {option.avatar && (\n <Avatar\n src={option.avatar.src}\n fallback={option.avatar.fallback || option.label.charAt(0)}\n size=\"sm\"\n className=\"size-6 shrink-0\"\n />\n )}\n {option.icon && !option.avatar && (\n <span className=\"flex size-4 shrink-0 items-center justify-center text-muted-foreground [&_svg]:size-4\">\n {option.icon}\n </span>\n )}\n <div className=\"flex min-w-0 flex-1 items-center gap-2 text-sm leading-5\">\n <span className=\"min-w-0 truncate font-normal text-foreground\">\n {option.label}\n </span>\n {option.subtitle && (\n <span className=\"min-w-0 truncate font-normal text-muted-foreground\">\n {option.subtitle}\n </span>\n )}\n </div>\n {option.shortcut && (\n <CommandShortcutBadge className=\"transition-colors duration-150 group-data-[selected=true]/command-item:bg-primary/10 group-data-[selected=true]/command-item:text-primary\">\n {option.shortcut}\n </CommandShortcutBadge>\n )}\n </CommandItem>\n );\n}\nCommandMenuItem.displayName = 'CommandMenu.Item';\n\n// ============================================\n// Command Menu Group Header\n// ============================================\n\nfunction CommandMenuGroupHeader({\n children,\n className,\n ...props\n}: React.ComponentProps<'h3'>) {\n return (\n <h3\n data-slot=\"command-menu-group-header\"\n className={cn(\n 'px-2 py-1.5 text-xs font-medium text-muted-foreground',\n className,\n )}\n {...props}\n >\n {children}\n </h3>\n );\n}\nCommandMenuGroupHeader.displayName = 'CommandMenu.GroupHeader';\n\n// ============================================\n// Shared Command Menu Body (internal)\n// ============================================\n\ninterface CommandMenuBodyProps {\n children?: React.ReactNode;\n groups: CommandMenuGroup[];\n options: CommandMenuOption[];\n onSelect?: (id: string, option: CommandMenuOption) => void;\n onClose?: () => void;\n placeholder: string;\n emptyText: string;\n emptyState?: React.ReactNode;\n showShortcut: boolean;\n shortcutText: string;\n showFooter: boolean;\n footerHints?: CommandMenuFooterHint[];\n showSettingsButton: boolean;\n onSettingsClick?: () => void;\n maxHeight: number;\n filter?: (value: string, search: string) => number;\n}\n\ninterface CommandMenuBodyContentProps {\n children?: React.ReactNode;\n groups: CommandMenuGroup[];\n options: CommandMenuOption[];\n optionRenderer: (option: CommandMenuOption) => React.ReactNode;\n}\n\ninterface CommandMenuGroupSectionProps {\n group: CommandMenuGroup;\n optionRenderer: (option: CommandMenuOption) => React.ReactNode;\n}\n\nfunction CommandMenuGroupSection({\n group,\n optionRenderer,\n}: CommandMenuGroupSectionProps) {\n const headingId = React.useId();\n\n return (\n <CommandGroup aria-labelledby={headingId} className=\"px-2 py-1\">\n <CommandMenuGroupHeader id={headingId}>\n {group.label}\n </CommandMenuGroupHeader>\n <div className=\"flex flex-col\">{group.options.map(optionRenderer)}</div>\n </CommandGroup>\n );\n}\nCommandMenuGroupSection.displayName = 'CommandMenu.GroupSection';\n\nfunction CommandMenuBodyContent({\n children,\n groups,\n options,\n optionRenderer,\n}: CommandMenuBodyContentProps) {\n if (children) return children;\n\n if (groups.length > 0) {\n return groups.map((group, index) => (\n <React.Fragment key={group.id}>\n {index > 0 && <CommandSeparator className=\"mx-0\" />}\n <CommandMenuGroupSection\n group={group}\n optionRenderer={optionRenderer}\n />\n </React.Fragment>\n ));\n }\n\n return <div className=\"flex flex-col p-2\">{options.map(optionRenderer)}</div>;\n}\n\nfunction CommandMenuBody({\n children,\n groups,\n options,\n onSelect,\n onClose,\n placeholder,\n emptyText,\n emptyState,\n showShortcut,\n shortcutText,\n showFooter,\n footerHints,\n showSettingsButton,\n onSettingsClick,\n maxHeight,\n filter,\n}: CommandMenuBodyProps) {\n const safeMaxHeight = getCommandMenuMaxHeight(maxHeight);\n const renderOption = (option: CommandMenuOption) => (\n <CommandMenuItem key={option.id} option={option} onSelect={onSelect} />\n );\n\n return (\n <Command\n filter={filter}\n className=\"rounded-none border-0 shadow-none\"\n data-slot=\"command-menu\"\n >\n <search\n aria-label=\"Command menu search\"\n className=\"block border-b border-input bg-background\"\n >\n <CommandInput\n render={({ clearSearch, value, ...inputProps }) => {\n const canClose = typeof onClose === 'function';\n const clearOrClose = () => {\n if (value) {\n clearSearch();\n return;\n }\n onClose?.();\n };\n\n return (\n <div\n data-slot=\"command-menu-input\"\n cmdk-input-wrapper=\"\"\n className=\"flex h-11 items-center gap-2 px-3\"\n >\n <Search\n className=\"size-4 shrink-0 text-muted-foreground opacity-50\"\n aria-hidden=\"true\"\n />\n <input\n {...inputProps}\n value={value}\n placeholder={placeholder}\n aria-label={placeholder}\n className=\"min-w-0 flex-1 bg-transparent text-sm leading-5 text-foreground outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\"\n />\n {showShortcut && (\n <CommandShortcutBadge>{shortcutText}</CommandShortcutBadge>\n )}\n <ClearButton\n size=\"icon-xs\"\n className=\"-me-1 rounded-sm p-0 opacity-50 hover:opacity-80 focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:size-4\"\n disabled={!value && !canClose}\n aria-label={\n value\n ? 'Clear search'\n : canClose\n ? 'Close command menu'\n : 'Clear search'\n }\n onClick={clearOrClose}\n />\n </div>\n );\n }}\n />\n </search>\n\n <CommandList\n style={{ maxHeight: safeMaxHeight }}\n className=\"overflow-y-auto p-0\"\n >\n <CommandEmpty className=\"py-6 text-center text-sm text-muted-foreground animate-in fade-in-0 duration-200 motion-reduce:animate-none\">\n {emptyState || emptyText}\n </CommandEmpty>\n <CommandMenuBodyContent\n groups={groups}\n options={options}\n optionRenderer={renderOption}\n >\n {children}\n </CommandMenuBodyContent>\n </CommandList>\n\n {showFooter && (\n <CommandMenuFooter\n hints={footerHints}\n showSettingsButton={showSettingsButton}\n onSettingsClick={onSettingsClick}\n />\n )}\n </Command>\n );\n}\nCommandMenuBody.displayName = 'CommandMenu.Body';\n\n// ============================================\n// Main Command Menu Component\n// ============================================\n\nfunction CommandMenu({\n open,\n onOpenChange,\n placeholder = DEFAULT_COMMAND_MENU_PLACEHOLDER,\n emptyText = 'No results found.',\n emptyState,\n options = [],\n groups = [],\n onSelect,\n showShortcut = false,\n shortcutText,\n showFooter = false,\n footerHints,\n showSettingsButton = false,\n onSettingsClick,\n className,\n maxHeight = DEFAULT_COMMAND_MENU_MAX_HEIGHT,\n filter,\n children,\n}: CommandMenuProps) {\n const platformShortcut = usePlatformShortcut();\n const resolvedShortcut = shortcutText ?? platformShortcut;\n\n return (\n <CommandDialog\n open={open}\n onOpenChange={onOpenChange}\n className={cn('max-w-[508px] sm:max-w-[508px]', className)}\n >\n <CommandMenuBody\n placeholder={placeholder}\n emptyText={emptyText}\n emptyState={emptyState}\n options={options}\n groups={groups}\n onSelect={onSelect}\n onClose={() => onOpenChange?.(false)}\n showShortcut={showShortcut}\n shortcutText={resolvedShortcut}\n showFooter={showFooter}\n footerHints={footerHints}\n showSettingsButton={showSettingsButton}\n onSettingsClick={onSettingsClick}\n maxHeight={maxHeight}\n filter={filter}\n >\n {children}\n </CommandMenuBody>\n </CommandDialog>\n );\n}\nCommandMenu.displayName = 'CommandMenu';\n\n// ============================================\n// Standalone Command Menu (non-dialog version)\n// ============================================\n\nexport interface CommandMenuPanelProps\n extends Omit<CommandMenuProps, 'open' | 'onOpenChange'> {\n /** Additional class name */\n className?: string;\n}\n\nfunction CommandMenuPanel({\n placeholder = DEFAULT_COMMAND_MENU_PLACEHOLDER,\n emptyText = 'No results found.',\n emptyState,\n options = [],\n groups = [],\n onSelect,\n showShortcut = false,\n shortcutText,\n showFooter = false,\n footerHints,\n showSettingsButton = false,\n onSettingsClick,\n className,\n maxHeight = DEFAULT_COMMAND_MENU_MAX_HEIGHT,\n filter,\n children,\n}: CommandMenuPanelProps) {\n const platformShortcut = usePlatformShortcut();\n const resolvedShortcut = shortcutText ?? platformShortcut;\n\n return (\n <div\n data-slot=\"command-menu-panel\"\n className={cn(COMMAND_MENU_SHELL_CLASS_NAME, className)}\n >\n <CommandMenuBody\n placeholder={placeholder}\n emptyText={emptyText}\n emptyState={emptyState}\n options={options}\n groups={groups}\n onSelect={onSelect}\n showShortcut={showShortcut}\n shortcutText={resolvedShortcut}\n showFooter={showFooter}\n footerHints={footerHints}\n showSettingsButton={showSettingsButton}\n onSettingsClick={onSettingsClick}\n maxHeight={maxHeight}\n filter={filter}\n >\n {children}\n </CommandMenuBody>\n </div>\n );\n}\nCommandMenuPanel.displayName = 'CommandMenu.Panel';\n\n// ============================================\n// Exports\n// ============================================\n\nexport {\n CommandMenu,\n CommandMenuFooter,\n CommandMenuGroupHeader,\n CommandMenuItem,\n CommandMenuPanel,\n CommandShortcutBadge,\n defaultFooterHints,\n FooterNavIcon,\n FooterNavText,\n};\n","/**\n * Web Component wrapper for CommandMenu\n * Custom element: <hf-command-menu>\n *\n * @generated by scripts/generate-wc-components.ts\n * DO NOT EDIT MANUALLY\n */\n\nimport React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { CommandMenu } from '../components/organisms/menus/CommandMenu';\nimport { parseAttr, parseValue, type PropDefs } from './_shared';\n\n/**\n * Event wrapper that dispatches custom DOM events\n */\nfunction createEventDispatcher(element: HTMLElement) {\n return {\n onOpenChange: (open: boolean) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('open-change', {\n detail: open,\n bubbles: true,\n composed: true\n }));\n },\n onSelect: (value: unknown) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('select', {\n detail: value,\n bubbles: true,\n composed: true\n }));\n },\n onSettingsClick: (value: unknown) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('settings-click', {\n detail: value,\n bubbles: true,\n composed: true\n }));\n }\n };\n}\n\n/**\n * Wrapper component that connects React events to DOM custom events\n */\nfunction CommandMenuWrapper(props: React.ComponentProps<typeof CommandMenu> & { _hostElement?: HTMLElement }) {\n const { _hostElement, ...restProps } = props;\n\n const eventHandlers = React.useMemo(() => {\n if (!_hostElement) return {};\n return createEventDispatcher(_hostElement);\n }, [_hostElement]);\n\n return React.createElement(CommandMenu, { ...restProps, ...eventHandlers });\n}\n\n/**\n * Prop type definitions for attribute parsing\n */\nconst propTypes: PropDefs = {\n open: 'boolean',\n placeholder: 'string',\n emptyText: 'string',\n emptyState: 'json',\n options: 'json',\n groups: 'json',\n showShortcut: 'boolean',\n shortcutText: 'string',\n showFooter: 'boolean',\n footerHints: 'json',\n showSettingsButton: 'boolean',\n className: 'string',\n maxHeight: 'number',\n filter: 'json'\n};\n\nclass CommandMenuWC extends HTMLElement {\n private _root: ReturnType<typeof createRoot> | null = null;\n private _childrenContainer: HTMLDivElement | null = null;\n private _props: Record<string, unknown> = {};\n private _initialized = false;\n\n connectedCallback() {\n setTimeout(() => this._initialize(), 0);\n }\n\n private _initialize() {\n if (this._initialized) return;\n this._initialized = true;\n\n const originalChildren: Node[] = [];\n for (const child of Array.from(this.childNodes)) {\n if (child.nodeType === Node.TEXT_NODE && !child.textContent?.trim()) {\n continue;\n }\n originalChildren.push(child);\n }\n\n const reactContainer = this.ownerDocument.createElement('div');\n reactContainer.style.display = 'contents';\n\n this._childrenContainer = this.ownerDocument.createElement('div');\n this._childrenContainer.style.display = 'contents';\n\n originalChildren.forEach((child) => this._childrenContainer!.appendChild(child));\n\n while (this.firstChild) this.removeChild(this.firstChild);\n this.appendChild(reactContainer);\n\n this._root = createRoot(reactContainer);\n this._render();\n }\n\n disconnectedCallback() {\n this._root?.unmount();\n this._root = null;\n }\n\n attributeChangedCallback(_name: string, _oldValue: string | null, _newValue: string | null) {\n this._render();\n }\n\n static get observedAttributes() {\n return Object.keys(propTypes).map((prop) =>\n prop.replace(/([A-Z])/g, '-$1').toLowerCase(),\n );\n }\n\n _setProp(name: string, value: unknown) {\n const propType = propTypes[name] || 'string';\n this._props[name] = parseValue(value, propType);\n this._render();\n }\n\n _getProp(name: string): unknown {\n if (name in this._props) {\n return this._props[name];\n }\n const attrName = name.replace(/([A-Z])/g, '-$1').toLowerCase();\n const propType = propTypes[name] || 'string';\n return parseAttr(this.getAttribute(attrName), propType);\n }\n\n private _render() {\n if (!this._root || !this._childrenContainer) return;\n\n const props: Record<string, unknown> = {};\n for (const [propName, propType] of Object.entries(propTypes)) {\n if (propName in this._props) {\n props[propName] = this._props[propName];\n } else {\n const attrName = propName.replace(/([A-Z])/g, '-$1').toLowerCase();\n props[propName] = parseAttr(this.getAttribute(attrName), propType);\n }\n }\n\n const element = React.createElement(\n CommandMenuWrapper,\n { ...props, _hostElement: this },\n React.createElement('span', {\n ref: (el: HTMLSpanElement | null) => {\n if (el && this._childrenContainer) {\n el.replaceWith(this._childrenContainer);\n }\n },\n style: { display: 'contents' },\n }),\n );\n\n this._root.render(element);\n }\n}\n\nfor (const propName of Object.keys(propTypes)) {\n Object.defineProperty(CommandMenuWC.prototype, propName, {\n get() {\n return this._getProp(propName);\n },\n set(value: unknown) {\n this._setProp(propName, value);\n },\n enumerable: true,\n configurable: true,\n });\n}\n\nif (typeof customElements !== 'undefined' && !customElements.get('hf-command-menu')) {\n customElements.define('hf-command-menu', CommandMenuWC);\n}\n\nexport { CommandMenuWC };\nexport default CommandMenuWC;\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hf-command-menu.js","names":[],"sources":["../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.27.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/corner-down-left.mjs","../../src/components/organisms/menus/CommandMenu/CommandMenu.tsx","../../src/wc/hf-command-menu.ts"],"sourcesContent":["/**\n * @license lucide-react v1.27.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M20 4v7a4 4 0 0 1-4 4H4\", key: \"6o5b7l\" }],\n [\"path\", { d: \"m9 10-5 5 5 5\", key: \"1kshq7\" }]\n];\nconst CornerDownLeft = createLucideIcon(\"corner-down-left\", __iconNode);\n\nexport { __iconNode, CornerDownLeft as default };\n//# sourceMappingURL=corner-down-left.mjs.map\n","'use client';\n\nimport {\n ArrowDown,\n ArrowUp,\n CornerDownLeft,\n Search,\n Settings,\n} from 'lucide-react';\nimport * as React from 'react';\nimport { Button, ClearButton } from '@/components/atoms/buttons/Button';\nimport { Avatar } from '@/components/molecules/data/Avatar';\nimport { Kbd } from '@/components/molecules/data/Kbd';\nimport {\n Command,\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from '@/components/ui/command';\nimport { cn } from '@/lib/utils';\n\nconst DEFAULT_COMMAND_MENU_MAX_HEIGHT = 336;\nconst DEFAULT_COMMAND_MENU_PLACEHOLDER = 'Type a command or search...';\nconst COMMAND_MENU_SHELL_CLASS_NAME =\n 'w-full max-w-[508px] overflow-hidden rounded-xl border border-input bg-background shadow-lg';\n\nfunction getCommandMenuMaxHeight(maxHeight: number): number {\n return Number.isFinite(maxHeight) && maxHeight >= 0\n ? maxHeight\n : DEFAULT_COMMAND_MENU_MAX_HEIGHT;\n}\n\n// ============================================\n// Types\n// ============================================\n\nexport interface CommandMenuOption {\n /** Unique identifier for the option */\n id: string;\n /** Display label for the option */\n label: string;\n /** Optional subtitle (e.g., @username, email) */\n subtitle?: string;\n /** Optional icon to display (mutually exclusive with avatar) */\n icon?: React.ReactNode;\n /** Optional avatar configuration */\n avatar?: {\n src?: string;\n fallback?: string;\n };\n /** Whether the option is disabled */\n disabled?: boolean;\n /** Keyboard shortcut to display */\n shortcut?: string;\n}\n\nexport interface CommandMenuGroup {\n /** Unique identifier for the group */\n id: string;\n /** Group label/heading */\n label: string;\n /** Options in this group */\n options: CommandMenuOption[];\n}\n\nexport interface CommandMenuFooterHint {\n /** Icon or keyboard key indicator */\n keys: React.ReactNode;\n /** Text describing the action */\n label: string;\n}\n\nexport interface CommandMenuProps {\n /** Whether the command menu is open */\n open?: boolean;\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void;\n /** Placeholder text for the search input */\n placeholder?: string;\n /** Text to show when no results found */\n emptyText?: string;\n /** Empty state content (replaces emptyText when provided) */\n emptyState?: React.ReactNode;\n /** Flat list of options */\n options?: CommandMenuOption[];\n /** Grouped options */\n groups?: CommandMenuGroup[];\n /** Callback when an option is selected */\n onSelect?: (id: string, option: CommandMenuOption) => void;\n /** Whether to show keyboard shortcut badge in input */\n showShortcut?: boolean;\n /** Keyboard shortcut text to display (auto-detects platform when omitted) */\n shortcutText?: string;\n /** Whether to show the footer with navigation hints */\n showFooter?: boolean;\n /** Custom footer hints */\n footerHints?: CommandMenuFooterHint[];\n /** Whether to show settings button in footer */\n showSettingsButton?: boolean;\n /** Callback when settings button is clicked */\n onSettingsClick?: () => void;\n /** Additional class name for the dialog */\n className?: string;\n /** Maximum height of the list */\n maxHeight?: number;\n /** Custom filter function */\n filter?: (value: string, search: string) => number;\n /** Children for custom content */\n children?: React.ReactNode;\n}\n\n// ============================================\n// Platform detection\n// ============================================\n\nfunction usePlatformShortcut() {\n const [shortcut, setShortcut] = React.useState('\\u2318/');\n React.useEffect(() => {\n if (!/Mac|iPhone|iPad/i.test(navigator.userAgent)) {\n setShortcut('Ctrl /');\n }\n }, []);\n return shortcut;\n}\n\n// ============================================\n// Keyboard Shortcut Badge (uses Kbd wrapper)\n// ============================================\n\nfunction CommandShortcutBadge({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <Kbd variant=\"solid\" size=\"sm\" className={cn('shadow-xs', className)}>\n {children}\n </Kbd>\n );\n}\nCommandShortcutBadge.displayName = 'CommandMenu.ShortcutBadge';\n\n// ============================================\n// Footer Navigation Icon (uses Kbd wrapper)\n// ============================================\n\nfunction FooterNavIcon({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <Kbd variant=\"footer\" size=\"sm\" className={cn('p-1.5', className)}>\n {children}\n </Kbd>\n );\n}\nFooterNavIcon.displayName = 'CommandMenu.FooterNavIcon';\n\nfunction FooterNavText({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <span\n className={cn(\n 'text-sm font-semibold text-secondary-foreground',\n className,\n )}\n >\n {children}\n </span>\n );\n}\nFooterNavText.displayName = 'CommandMenu.FooterNavText';\n\n// ============================================\n// Default Footer Hints\n// ============================================\n\nconst defaultFooterHints: CommandMenuFooterHint[] = [\n {\n keys: (\n <div className=\"flex items-center gap-1\">\n <FooterNavIcon>\n <ArrowUp className=\"size-2.5 text-secondary-foreground\" />\n </FooterNavIcon>\n <FooterNavIcon>\n <ArrowDown className=\"size-2.5 text-secondary-foreground\" />\n </FooterNavIcon>\n </div>\n ),\n label: 'to navigate',\n },\n {\n keys: (\n <FooterNavIcon>\n <CornerDownLeft className=\"size-2.5 text-secondary-foreground\" />\n </FooterNavIcon>\n ),\n label: 'to select',\n },\n {\n keys: (\n <FooterNavIcon className=\"px-1.5 py-1\">\n <span className=\"text-xs font-semibold text-secondary-foreground\">\n esc\n </span>\n </FooterNavIcon>\n ),\n label: 'to close',\n },\n];\n\n// ============================================\n// Command Menu Footer\n// ============================================\n\nexport interface CommandMenuFooterProps {\n hints?: CommandMenuFooterHint[];\n showSettingsButton?: boolean;\n onSettingsClick?: () => void;\n className?: string;\n}\n\nfunction CommandMenuFooter({\n hints = defaultFooterHints,\n showSettingsButton = false,\n onSettingsClick,\n className,\n}: CommandMenuFooterProps) {\n return (\n <div\n data-slot=\"command-menu-footer\"\n className={cn(\n 'flex items-center gap-3 border-t border-border bg-card/80 py-2 pe-2 ps-[18px] supports-backdrop-filter:backdrop-blur',\n className,\n )}\n >\n <div className=\"hidden flex-1 items-start gap-4 [@media(hover:hover)]:flex\">\n {hints.map((hint) => (\n <div key={hint.label} className=\"flex items-center gap-2\">\n {hint.keys}\n <FooterNavText>{hint.label}</FooterNavText>\n </div>\n ))}\n </div>\n {showSettingsButton && (\n <Button\n appearance=\"ghost\"\n variant=\"secondary\"\n size=\"icon\"\n className=\"group ms-auto rounded-full bg-muted\"\n onClick={onSettingsClick}\n aria-label=\"Settings\"\n >\n <Settings className=\"size-5 text-muted-foreground transition-transform duration-300 ease-out group-hover:rotate-90 motion-reduce:transition-none\" />\n </Button>\n )}\n </div>\n );\n}\nCommandMenuFooter.displayName = 'CommandMenu.Footer';\n\n// ============================================\n// Command Menu Item\n// ============================================\n\nexport interface CommandMenuItemProps\n extends Omit<\n React.ComponentProps<typeof CommandItem>,\n 'onSelect' | 'showCheckIndicator' | 'value'\n > {\n option: CommandMenuOption;\n onSelect?: (id: string, option: CommandMenuOption) => void;\n}\n\nfunction CommandMenuItem({\n option,\n onSelect,\n className,\n ...props\n}: CommandMenuItemProps) {\n return (\n <CommandItem\n value={option.id}\n disabled={option.disabled}\n showCheckIndicator={false}\n onSelect={() => onSelect?.(option.id, option)}\n className={cn(\n 'flex cursor-pointer items-center gap-2 transition-colors duration-150 motion-reduce:transition-none',\n className,\n )}\n {...props}\n >\n {option.avatar && (\n <Avatar\n src={option.avatar.src}\n fallback={option.avatar.fallback || option.label.charAt(0)}\n size=\"sm\"\n className=\"size-6 shrink-0\"\n />\n )}\n {option.icon && !option.avatar && (\n <span className=\"flex size-4 shrink-0 items-center justify-center text-muted-foreground [&_svg]:size-4\">\n {option.icon}\n </span>\n )}\n <div className=\"flex min-w-0 flex-1 items-center gap-2 text-sm leading-5\">\n <span className=\"min-w-0 truncate font-normal text-foreground\">\n {option.label}\n </span>\n {option.subtitle && (\n <span className=\"min-w-0 truncate font-normal text-muted-foreground\">\n {option.subtitle}\n </span>\n )}\n </div>\n {option.shortcut && (\n <CommandShortcutBadge className=\"transition-colors duration-150 group-data-[selected=true]/command-item:bg-primary/10 group-data-[selected=true]/command-item:text-primary\">\n {option.shortcut}\n </CommandShortcutBadge>\n )}\n </CommandItem>\n );\n}\nCommandMenuItem.displayName = 'CommandMenu.Item';\n\n// ============================================\n// Command Menu Group Header\n// ============================================\n\nfunction CommandMenuGroupHeader({\n children,\n className,\n ...props\n}: React.ComponentProps<'h3'>) {\n return (\n <h3\n data-slot=\"command-menu-group-header\"\n className={cn(\n 'px-2 py-1.5 text-xs font-medium text-muted-foreground',\n className,\n )}\n {...props}\n >\n {children}\n </h3>\n );\n}\nCommandMenuGroupHeader.displayName = 'CommandMenu.GroupHeader';\n\n// ============================================\n// Shared Command Menu Body (internal)\n// ============================================\n\ninterface CommandMenuBodyProps {\n children?: React.ReactNode;\n groups: CommandMenuGroup[];\n options: CommandMenuOption[];\n onSelect?: (id: string, option: CommandMenuOption) => void;\n onClose?: () => void;\n placeholder: string;\n emptyText: string;\n emptyState?: React.ReactNode;\n showShortcut: boolean;\n shortcutText: string;\n showFooter: boolean;\n footerHints?: CommandMenuFooterHint[];\n showSettingsButton: boolean;\n onSettingsClick?: () => void;\n maxHeight: number;\n filter?: (value: string, search: string) => number;\n}\n\ninterface CommandMenuBodyContentProps {\n children?: React.ReactNode;\n groups: CommandMenuGroup[];\n options: CommandMenuOption[];\n optionRenderer: (option: CommandMenuOption) => React.ReactNode;\n}\n\ninterface CommandMenuGroupSectionProps {\n group: CommandMenuGroup;\n optionRenderer: (option: CommandMenuOption) => React.ReactNode;\n}\n\nfunction CommandMenuGroupSection({\n group,\n optionRenderer,\n}: CommandMenuGroupSectionProps) {\n const headingId = React.useId();\n\n return (\n <CommandGroup aria-labelledby={headingId} className=\"px-2 py-1\">\n <CommandMenuGroupHeader id={headingId}>\n {group.label}\n </CommandMenuGroupHeader>\n <div className=\"flex flex-col\">{group.options.map(optionRenderer)}</div>\n </CommandGroup>\n );\n}\nCommandMenuGroupSection.displayName = 'CommandMenu.GroupSection';\n\nfunction CommandMenuBodyContent({\n children,\n groups,\n options,\n optionRenderer,\n}: CommandMenuBodyContentProps) {\n if (children) return children;\n\n if (groups.length > 0) {\n return groups.map((group, index) => (\n <React.Fragment key={group.id}>\n {index > 0 && <CommandSeparator className=\"mx-0\" />}\n <CommandMenuGroupSection\n group={group}\n optionRenderer={optionRenderer}\n />\n </React.Fragment>\n ));\n }\n\n return <div className=\"flex flex-col p-2\">{options.map(optionRenderer)}</div>;\n}\n\nfunction CommandMenuBody({\n children,\n groups,\n options,\n onSelect,\n onClose,\n placeholder,\n emptyText,\n emptyState,\n showShortcut,\n shortcutText,\n showFooter,\n footerHints,\n showSettingsButton,\n onSettingsClick,\n maxHeight,\n filter,\n}: CommandMenuBodyProps) {\n const safeMaxHeight = getCommandMenuMaxHeight(maxHeight);\n const renderOption = (option: CommandMenuOption) => (\n <CommandMenuItem key={option.id} option={option} onSelect={onSelect} />\n );\n\n return (\n <Command\n filter={filter}\n className=\"rounded-none border-0 shadow-none\"\n data-slot=\"command-menu\"\n >\n <search\n aria-label=\"Command menu search\"\n className=\"block border-b border-input bg-background\"\n >\n <CommandInput\n render={({ clearSearch, value, ...inputProps }) => {\n const canClose = typeof onClose === 'function';\n const clearOrClose = () => {\n if (value) {\n clearSearch();\n return;\n }\n onClose?.();\n };\n\n return (\n <div\n data-slot=\"command-menu-input\"\n cmdk-input-wrapper=\"\"\n className=\"flex h-11 items-center gap-2 px-3\"\n >\n <Search\n className=\"size-4 shrink-0 text-muted-foreground opacity-50\"\n aria-hidden=\"true\"\n />\n <input\n {...inputProps}\n value={value}\n placeholder={placeholder}\n aria-label={placeholder}\n className=\"min-w-0 flex-1 bg-transparent text-sm leading-5 text-foreground outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\"\n />\n {showShortcut && (\n <CommandShortcutBadge>{shortcutText}</CommandShortcutBadge>\n )}\n <ClearButton\n size=\"icon-xs\"\n className=\"-me-1 rounded-sm p-0 opacity-50 hover:opacity-80 focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:size-4\"\n disabled={!value && !canClose}\n aria-label={\n value\n ? 'Clear search'\n : canClose\n ? 'Close command menu'\n : 'Clear search'\n }\n onClick={clearOrClose}\n />\n </div>\n );\n }}\n />\n </search>\n\n <CommandList\n style={{ maxHeight: safeMaxHeight }}\n className=\"overflow-y-auto p-0\"\n >\n <CommandEmpty className=\"py-6 text-center text-sm text-muted-foreground animate-in fade-in-0 duration-200 motion-reduce:animate-none\">\n {emptyState || emptyText}\n </CommandEmpty>\n <CommandMenuBodyContent\n groups={groups}\n options={options}\n optionRenderer={renderOption}\n >\n {children}\n </CommandMenuBodyContent>\n </CommandList>\n\n {showFooter && (\n <CommandMenuFooter\n hints={footerHints}\n showSettingsButton={showSettingsButton}\n onSettingsClick={onSettingsClick}\n />\n )}\n </Command>\n );\n}\nCommandMenuBody.displayName = 'CommandMenu.Body';\n\n// ============================================\n// Main Command Menu Component\n// ============================================\n\nfunction CommandMenu({\n open,\n onOpenChange,\n placeholder = DEFAULT_COMMAND_MENU_PLACEHOLDER,\n emptyText = 'No results found.',\n emptyState,\n options = [],\n groups = [],\n onSelect,\n showShortcut = false,\n shortcutText,\n showFooter = false,\n footerHints,\n showSettingsButton = false,\n onSettingsClick,\n className,\n maxHeight = DEFAULT_COMMAND_MENU_MAX_HEIGHT,\n filter,\n children,\n}: CommandMenuProps) {\n const platformShortcut = usePlatformShortcut();\n const resolvedShortcut = shortcutText ?? platformShortcut;\n\n return (\n <CommandDialog\n open={open}\n onOpenChange={onOpenChange}\n className={cn('max-w-[508px] sm:max-w-[508px]', className)}\n >\n <CommandMenuBody\n placeholder={placeholder}\n emptyText={emptyText}\n emptyState={emptyState}\n options={options}\n groups={groups}\n onSelect={onSelect}\n onClose={() => onOpenChange?.(false)}\n showShortcut={showShortcut}\n shortcutText={resolvedShortcut}\n showFooter={showFooter}\n footerHints={footerHints}\n showSettingsButton={showSettingsButton}\n onSettingsClick={onSettingsClick}\n maxHeight={maxHeight}\n filter={filter}\n >\n {children}\n </CommandMenuBody>\n </CommandDialog>\n );\n}\nCommandMenu.displayName = 'CommandMenu';\n\n// ============================================\n// Standalone Command Menu (non-dialog version)\n// ============================================\n\nexport interface CommandMenuPanelProps\n extends Omit<CommandMenuProps, 'open' | 'onOpenChange'> {\n /** Additional class name */\n className?: string;\n}\n\nfunction CommandMenuPanel({\n placeholder = DEFAULT_COMMAND_MENU_PLACEHOLDER,\n emptyText = 'No results found.',\n emptyState,\n options = [],\n groups = [],\n onSelect,\n showShortcut = false,\n shortcutText,\n showFooter = false,\n footerHints,\n showSettingsButton = false,\n onSettingsClick,\n className,\n maxHeight = DEFAULT_COMMAND_MENU_MAX_HEIGHT,\n filter,\n children,\n}: CommandMenuPanelProps) {\n const platformShortcut = usePlatformShortcut();\n const resolvedShortcut = shortcutText ?? platformShortcut;\n\n return (\n <div\n data-slot=\"command-menu-panel\"\n className={cn(COMMAND_MENU_SHELL_CLASS_NAME, className)}\n >\n <CommandMenuBody\n placeholder={placeholder}\n emptyText={emptyText}\n emptyState={emptyState}\n options={options}\n groups={groups}\n onSelect={onSelect}\n showShortcut={showShortcut}\n shortcutText={resolvedShortcut}\n showFooter={showFooter}\n footerHints={footerHints}\n showSettingsButton={showSettingsButton}\n onSettingsClick={onSettingsClick}\n maxHeight={maxHeight}\n filter={filter}\n >\n {children}\n </CommandMenuBody>\n </div>\n );\n}\nCommandMenuPanel.displayName = 'CommandMenu.Panel';\n\n// ============================================\n// Exports\n// ============================================\n\nexport {\n CommandMenu,\n CommandMenuFooter,\n CommandMenuGroupHeader,\n CommandMenuItem,\n CommandMenuPanel,\n CommandShortcutBadge,\n defaultFooterHints,\n FooterNavIcon,\n FooterNavText,\n};\n","/**\n * Web Component wrapper for CommandMenu\n * Custom element: <hf-command-menu>\n *\n * @generated by scripts/generate-wc-components.ts\n * DO NOT EDIT MANUALLY\n */\n\nimport React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { CommandMenu } from '../components/organisms/menus/CommandMenu';\nimport { parseAttr, parseValue, type PropDefs } from './_shared';\n\n/**\n * Event wrapper that dispatches custom DOM events\n */\nfunction createEventDispatcher(element: HTMLElement) {\n return {\n onOpenChange: (open: boolean) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('open-change', {\n detail: open,\n bubbles: true,\n composed: true\n }));\n },\n onSelect: (value: unknown) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('select', {\n detail: value,\n bubbles: true,\n composed: true\n }));\n },\n onSettingsClick: (value: unknown) => {\n const CustomEventConstructor =\n element.ownerDocument.defaultView?.CustomEvent ?? CustomEvent;\n element.dispatchEvent(new CustomEventConstructor('settings-click', {\n detail: value,\n bubbles: true,\n composed: true\n }));\n }\n };\n}\n\n/**\n * Wrapper component that connects React events to DOM custom events\n */\nfunction CommandMenuWrapper(props: React.ComponentProps<typeof CommandMenu> & { _hostElement?: HTMLElement }) {\n const { _hostElement, ...restProps } = props;\n\n const eventHandlers = React.useMemo(() => {\n if (!_hostElement) return {};\n return createEventDispatcher(_hostElement);\n }, [_hostElement]);\n\n return React.createElement(CommandMenu, { ...restProps, ...eventHandlers });\n}\n\n/**\n * Prop type definitions for attribute parsing\n */\nconst propTypes: PropDefs = {\n open: 'boolean',\n placeholder: 'string',\n emptyText: 'string',\n emptyState: 'json',\n options: 'json',\n groups: 'json',\n showShortcut: 'boolean',\n shortcutText: 'string',\n showFooter: 'boolean',\n footerHints: 'json',\n showSettingsButton: 'boolean',\n className: 'string',\n maxHeight: 'number',\n filter: 'json'\n};\n\nclass CommandMenuWC extends HTMLElement {\n private _root: ReturnType<typeof createRoot> | null = null;\n private _childrenContainer: HTMLDivElement | null = null;\n private _props: Record<string, unknown> = {};\n private _initialized = false;\n\n connectedCallback() {\n setTimeout(() => this._initialize(), 0);\n }\n\n private _initialize() {\n if (this._initialized) return;\n this._initialized = true;\n\n const originalChildren: Node[] = [];\n for (const child of Array.from(this.childNodes)) {\n if (child.nodeType === Node.TEXT_NODE && !child.textContent?.trim()) {\n continue;\n }\n originalChildren.push(child);\n }\n\n const reactContainer = this.ownerDocument.createElement('div');\n reactContainer.style.display = 'contents';\n\n this._childrenContainer = this.ownerDocument.createElement('div');\n this._childrenContainer.style.display = 'contents';\n\n originalChildren.forEach((child) => this._childrenContainer!.appendChild(child));\n\n while (this.firstChild) this.removeChild(this.firstChild);\n this.appendChild(reactContainer);\n\n this._root = createRoot(reactContainer);\n this._render();\n }\n\n disconnectedCallback() {\n this._root?.unmount();\n this._root = null;\n }\n\n attributeChangedCallback(_name: string, _oldValue: string | null, _newValue: string | null) {\n this._render();\n }\n\n static get observedAttributes() {\n return Object.keys(propTypes).map((prop) =>\n prop.replace(/([A-Z])/g, '-$1').toLowerCase(),\n );\n }\n\n _setProp(name: string, value: unknown) {\n const propType = propTypes[name] || 'string';\n this._props[name] = parseValue(value, propType);\n this._render();\n }\n\n _getProp(name: string): unknown {\n if (name in this._props) {\n return this._props[name];\n }\n const attrName = name.replace(/([A-Z])/g, '-$1').toLowerCase();\n const propType = propTypes[name] || 'string';\n return parseAttr(this.getAttribute(attrName), propType);\n }\n\n private _render() {\n if (!this._root || !this._childrenContainer) return;\n\n const props: Record<string, unknown> = {};\n for (const [propName, propType] of Object.entries(propTypes)) {\n if (propName in this._props) {\n props[propName] = this._props[propName];\n } else {\n const attrName = propName.replace(/([A-Z])/g, '-$1').toLowerCase();\n props[propName] = parseAttr(this.getAttribute(attrName), propType);\n }\n }\n\n const element = React.createElement(\n CommandMenuWrapper,\n { ...props, _hostElement: this },\n React.createElement('span', {\n ref: (el: HTMLSpanElement | null) => {\n if (el && this._childrenContainer) {\n el.replaceWith(this._childrenContainer);\n }\n },\n style: { display: 'contents' },\n }),\n );\n\n this._root.render(element);\n }\n}\n\nfor (const propName of Object.keys(propTypes)) {\n Object.defineProperty(CommandMenuWC.prototype, propName, {\n get() {\n return this._getProp(propName);\n },\n set(value: unknown) {\n this._setProp(propName, value);\n },\n enumerable: true,\n configurable: true,\n });\n}\n\nif (typeof customElements !== 'undefined' && !customElements.get('hf-command-menu')) {\n customElements.define('hf-command-menu', CommandMenuWC);\n}\n\nexport { CommandMenuWC };\nexport default CommandMenuWC;\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
@@ -2907,8 +2907,8 @@ function Ai({ children: e, column: n, className: t }) {
|
|
|
2907
2907
|
children: [e, /* @__PURE__ */ ee("span", {
|
|
2908
2908
|
className: "relative size-4",
|
|
2909
2909
|
children: [
|
|
2910
|
-
/* @__PURE__ */ F(Qn, { className: M("absolute inset-0 size-4 text-
|
|
2911
|
-
/* @__PURE__ */ F(Yn, { className: M("absolute inset-0 size-4 text-
|
|
2910
|
+
/* @__PURE__ */ F(Qn, { className: M("absolute inset-0 size-4 text-muted-foreground transition-[opacity,transform] duration-200 ease-out motion-reduce:transition-none", o === "asc" ? "opacity-100 translate-y-0" : "opacity-0 -translate-y-1") }),
|
|
2911
|
+
/* @__PURE__ */ F(Yn, { className: M("absolute inset-0 size-4 text-muted-foreground transition-[opacity,transform] duration-200 ease-out motion-reduce:transition-none", o === "desc" ? "opacity-100 translate-y-0" : "opacity-0 translate-y-1") }),
|
|
2912
2912
|
/* @__PURE__ */ F(go, { className: M("absolute inset-0 size-4 transition-opacity duration-200 ease-out motion-reduce:transition-none", o ? "opacity-0" : "opacity-100 text-muted-foreground") })
|
|
2913
2913
|
]
|
|
2914
2914
|
})]
|
|
@@ -3072,7 +3072,7 @@ function Tn({ columns: e, data: n, children: t, enableRowSelection: o = !1, enab
|
|
|
3072
3072
|
/* @__PURE__ */ F(Zn, { className: M("h-4 w-4 flex-shrink-0 transition-transform duration-200 ease-out motion-reduce:transition-none", R.getIsExpanded() && "rotate-90") }),
|
|
3073
3073
|
/* @__PURE__ */ F("span", { children: ve(I.column.columnDef.cell, I.getContext()) }),
|
|
3074
3074
|
/* @__PURE__ */ ee("span", {
|
|
3075
|
-
className: "text-
|
|
3075
|
+
className: "text-secondary-foreground tabular-nums",
|
|
3076
3076
|
children: [
|
|
3077
3077
|
"(",
|
|
3078
3078
|
R.subRows.length,
|