@fragments-sdk/ui 0.9.7 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -24
- package/dist/assets/ui.css +304 -0
- package/dist/blocks/BlogEditor.block.d.ts +3 -0
- package/dist/blocks/BlogEditor.block.d.ts.map +1 -0
- package/dist/components/Editor/Editor.module.scss.cjs +57 -0
- package/dist/components/Editor/Editor.module.scss.cjs.map +1 -0
- package/dist/components/Editor/Editor.module.scss.js +57 -0
- package/dist/components/Editor/Editor.module.scss.js.map +1 -0
- package/dist/components/Editor/index.cjs +548 -0
- package/dist/components/Editor/index.cjs.map +1 -0
- package/dist/components/Editor/index.d.ts +107 -0
- package/dist/components/Editor/index.d.ts.map +1 -0
- package/dist/components/Editor/index.js +531 -0
- package/dist/components/Editor/index.js.map +1 -0
- package/dist/components/Sidebar/index.cjs +6 -11
- package/dist/components/Sidebar/index.cjs.map +1 -1
- package/dist/components/Sidebar/index.d.ts.map +1 -1
- package/dist/components/Sidebar/index.js +6 -11
- package/dist/components/Sidebar/index.js.map +1 -1
- package/dist/components/Theme/index.cjs +86 -1
- package/dist/components/Theme/index.cjs.map +1 -1
- package/dist/components/Theme/index.d.ts +44 -1
- package/dist/components/Theme/index.d.ts.map +1 -1
- package/dist/components/Theme/index.js +86 -1
- package/dist/components/Theme/index.js.map +1 -1
- package/dist/index.cjs +24 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/keyboard-shortcuts.cjs +295 -0
- package/dist/utils/keyboard-shortcuts.cjs.map +1 -0
- package/dist/utils/keyboard-shortcuts.d.ts +293 -0
- package/dist/utils/keyboard-shortcuts.d.ts.map +1 -0
- package/dist/utils/keyboard-shortcuts.js +295 -0
- package/dist/utils/keyboard-shortcuts.js.map +1 -0
- package/fragments.json +1 -1
- package/package.json +32 -3
- package/src/blocks/BlogEditor.block.ts +34 -0
- package/src/components/Editor/Editor.fragment.tsx +322 -0
- package/src/components/Editor/Editor.module.scss +333 -0
- package/src/components/Editor/Editor.test.tsx +174 -0
- package/src/components/Editor/index.tsx +815 -0
- package/src/components/Sidebar/index.tsx +7 -14
- package/src/components/Theme/index.tsx +168 -1
- package/src/index.ts +49 -0
- package/src/tokens/_seeds.scss +20 -0
- package/src/utils/keyboard-shortcuts.test.ts +357 -0
- package/src/utils/keyboard-shortcuts.ts +502 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/Editor/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Editor.module.scss';\nimport {\n TextB,\n TextItalic,\n TextStrikethrough,\n LinkSimple,\n Code,\n ListBullets,\n ListNumbers,\n TextHOne,\n TextHTwo,\n TextHThree,\n Quotes,\n ArrowCounterClockwise,\n ArrowClockwise,\n} from '@phosphor-icons/react';\nimport { KEYBOARD_SHORTCUTS } from '../../utils/keyboard-shortcuts';\n\n// ============================================\n// Lazy-loaded dependency (TipTap)\n// ============================================\n\nlet _useEditor: ((config: Record<string, unknown>) => unknown) | null = null;\nlet _EditorContent: React.ComponentType<Record<string, unknown>> | null = null;\nlet _StarterKit: unknown = null;\nlet _LinkExtension: unknown = null;\nlet _tiptapLoaded = false;\nlet _tiptapFailed = false;\n\nfunction loadTipTapDeps() {\n if (_tiptapLoaded) return;\n _tiptapLoaded = true;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const tiptapReact = require('@tiptap/react');\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const starterKit = require('@tiptap/starter-kit');\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const linkExt = require('@tiptap/extension-link');\n\n _useEditor = tiptapReact.useEditor;\n _EditorContent = tiptapReact.EditorContent;\n _StarterKit = starterKit.default ?? starterKit.StarterKit ?? starterKit;\n _LinkExtension = linkExt.default ?? linkExt.Link ?? linkExt;\n } catch {\n _tiptapFailed = true;\n }\n}\n\n// ============================================\n// Types\n// ============================================\n\nexport type EditorFormat =\n | 'bold' | 'italic' | 'strikethrough' | 'link' | 'code'\n | 'bulletList' | 'orderedList'\n | 'heading1' | 'heading2' | 'heading3'\n | 'blockquote'\n | 'undo' | 'redo';\n\nexport type EditorSaveStatus = 'idle' | 'saving' | 'saved' | 'error';\n\nexport type EditorMode = 'rich' | 'markdown';\n\nexport type EditorSize = 'sm' | 'md' | 'lg';\n\nexport interface EditorProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n children?: React.ReactNode;\n /** Controlled value */\n value?: string;\n /** Default value for uncontrolled usage */\n defaultValue?: string;\n /** Called when content changes */\n onValueChange?: (value: string) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Disable the editor */\n disabled?: boolean;\n /** Read-only mode */\n readOnly?: boolean;\n /** Which format buttons to show */\n formats?: EditorFormat[];\n /** Show default toolbar */\n toolbar?: boolean;\n /** Show default status bar */\n statusBar?: boolean;\n /** Auto-save callback */\n onAutoSave?: (value: string) => void;\n /** Auto-save interval in ms */\n autoSaveInterval?: number;\n /** Editor size preset */\n size?: EditorSize;\n /** Maximum character count (shows indicator in status bar) */\n maxLength?: number;\n}\n\nexport interface EditorToolbarProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport interface EditorToolbarGroupProps {\n children: React.ReactNode;\n 'aria-label'?: string;\n className?: string;\n}\n\nexport interface EditorToolbarButtonProps {\n /** Which format this button toggles */\n format: EditorFormat;\n className?: string;\n}\n\nexport interface EditorSeparatorProps {\n className?: string;\n}\n\nexport interface EditorStatusIndicatorProps {\n /** Override the save status from context */\n status?: EditorSaveStatus;\n /** Custom labels per status */\n labels?: Partial<Record<EditorSaveStatus, string>>;\n className?: string;\n}\n\nexport interface EditorContentProps {\n className?: string;\n}\n\nexport interface EditorStatusBarProps {\n /** Show word count */\n showWordCount?: boolean;\n /** Show character count */\n showCharCount?: boolean;\n className?: string;\n}\n\n// ============================================\n// Format metadata\n// ============================================\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst FORMAT_META: Record<EditorFormat, { icon: React.ComponentType<any>; label: string; shortcut: string }> = {\n bold: { icon: TextB, label: 'Bold', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BOLD.label },\n italic: { icon: TextItalic, label: 'Italic', shortcut: KEYBOARD_SHORTCUTS.EDITOR_ITALIC.label },\n strikethrough: { icon: TextStrikethrough, label: 'Strikethrough', shortcut: KEYBOARD_SHORTCUTS.EDITOR_STRIKETHROUGH.label },\n link: { icon: LinkSimple, label: 'Link', shortcut: KEYBOARD_SHORTCUTS.EDITOR_LINK.label },\n code: { icon: Code, label: 'Code', shortcut: KEYBOARD_SHORTCUTS.EDITOR_CODE.label },\n bulletList: { icon: ListBullets, label: 'Bullet list', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BULLET_LIST.label },\n orderedList: { icon: ListNumbers, label: 'Ordered list', shortcut: KEYBOARD_SHORTCUTS.EDITOR_ORDERED_LIST.label },\n heading1: { icon: TextHOne, label: 'Heading 1', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING1.label },\n heading2: { icon: TextHTwo, label: 'Heading 2', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING2.label },\n heading3: { icon: TextHThree, label: 'Heading 3', shortcut: KEYBOARD_SHORTCUTS.EDITOR_HEADING3.label },\n blockquote: { icon: Quotes, label: 'Blockquote', shortcut: KEYBOARD_SHORTCUTS.EDITOR_BLOCKQUOTE.label },\n undo: { icon: ArrowCounterClockwise, label: 'Undo', shortcut: KEYBOARD_SHORTCUTS.EDITOR_UNDO.label },\n redo: { icon: ArrowClockwise, label: 'Redo', shortcut: KEYBOARD_SHORTCUTS.EDITOR_REDO.label },\n};\n\nconst DEFAULT_FORMATS: EditorFormat[] = ['bold', 'italic', 'strikethrough', 'link', 'code', 'bulletList'];\n\n/** Formats that are actions (not toggles) — no aria-pressed, different disable logic */\nconst ACTION_FORMATS = new Set<EditorFormat>(['undo', 'redo']);\n\nconst DEFAULT_STATUS_LABELS: Record<EditorSaveStatus, string> = {\n idle: '',\n saving: 'SAVING...',\n saved: 'AUTO-SAVED',\n error: 'SAVE FAILED',\n};\n\n// ============================================\n// Markdown formatting helpers (textarea fallback)\n// ============================================\n\ninterface TextareaSelection {\n start: number;\n end: number;\n text: string;\n}\n\nfunction getSelection(textarea: HTMLTextAreaElement): TextareaSelection {\n return {\n start: textarea.selectionStart,\n end: textarea.selectionEnd,\n text: textarea.value.substring(textarea.selectionStart, textarea.selectionEnd),\n };\n}\n\nfunction wrapSelection(\n textarea: HTMLTextAreaElement,\n prefix: string,\n suffix: string,\n setValue: (v: string) => void,\n) {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const wrapped = `${prefix}${sel.text || 'text'}${suffix}`;\n const newValue = `${before}${wrapped}${after}`;\n setValue(newValue);\n\n requestAnimationFrame(() => {\n textarea.focus();\n const newStart = sel.start + prefix.length;\n const newEnd = newStart + (sel.text || 'text').length;\n textarea.setSelectionRange(newStart, newEnd);\n });\n}\n\nfunction applyMarkdownFormat(\n format: EditorFormat,\n textarea: HTMLTextAreaElement,\n setValue: (v: string) => void,\n) {\n switch (format) {\n case 'bold':\n wrapSelection(textarea, '**', '**', setValue);\n break;\n case 'italic':\n wrapSelection(textarea, '*', '*', setValue);\n break;\n case 'strikethrough':\n wrapSelection(textarea, '~~', '~~', setValue);\n break;\n case 'code':\n wrapSelection(textarea, '`', '`', setValue);\n break;\n case 'link': {\n const sel = getSelection(textarea);\n const linkText = sel.text || 'link text';\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const newValue = `${before}[${linkText}](url)${after}`;\n setValue(newValue);\n requestAnimationFrame(() => {\n textarea.focus();\n const urlStart = sel.start + linkText.length + 3;\n textarea.setSelectionRange(urlStart, urlStart + 3);\n });\n break;\n }\n case 'bulletList': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'item').split('\\n');\n const bulleted = lines.map((l) => `- ${l}`).join('\\n');\n const newValue = `${before}${bulleted}${after}`;\n setValue(newValue);\n break;\n }\n case 'orderedList': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'item').split('\\n');\n const numbered = lines.map((l, i) => `${i + 1}. ${l}`).join('\\n');\n const newValue = `${before}${numbered}${after}`;\n setValue(newValue);\n break;\n }\n case 'heading1':\n wrapSelection(textarea, '# ', '', setValue);\n break;\n case 'heading2':\n wrapSelection(textarea, '## ', '', setValue);\n break;\n case 'heading3':\n wrapSelection(textarea, '### ', '', setValue);\n break;\n case 'blockquote': {\n const sel = getSelection(textarea);\n const before = textarea.value.substring(0, sel.start);\n const after = textarea.value.substring(sel.end);\n const lines = (sel.text || 'quote').split('\\n');\n const quoted = lines.map((l) => `> ${l}`).join('\\n');\n const newValue = `${before}${quoted}${after}`;\n setValue(newValue);\n break;\n }\n case 'undo':\n case 'redo':\n // Undo/redo in textarea mode is handled natively by the browser\n break;\n }\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface EditorContextValue {\n value: string;\n setValue: (v: string) => void;\n placeholder: string;\n disabled: boolean;\n readOnly: boolean;\n formats: EditorFormat[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n editor: any | null;\n mode: EditorMode;\n size: EditorSize;\n maxLength?: number;\n wordCount: number;\n charCount: number;\n toggleFormat: (f: EditorFormat) => void;\n isFormatActive: (f: EditorFormat) => boolean;\n saveStatus: EditorSaveStatus;\n contentRef: React.RefObject<HTMLTextAreaElement | null>;\n}\n\nconst EditorContext = React.createContext<EditorContextValue | null>(null);\n\nfunction useEditorContext() {\n const context = React.useContext(EditorContext);\n if (!context) {\n throw new Error('Editor compound components must be used within an Editor');\n }\n return context;\n}\n\n// ============================================\n// Hooks\n// ============================================\n\nfunction useControllableState<T>(\n controlledValue: T | undefined,\n defaultValue: T,\n onChange?: (value: T) => void,\n): [T, (value: T) => void] {\n const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue);\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : uncontrolledValue;\n\n const setValue = React.useCallback(\n (newValue: T) => {\n if (!isControlled) {\n setUncontrolledValue(newValue);\n }\n onChange?.(newValue);\n },\n [isControlled, onChange],\n );\n\n return [value, setValue];\n}\n\nfunction countWords(text: string): number {\n const trimmed = text.trim();\n if (!trimmed) return 0;\n return trimmed.split(/\\s+/).length;\n}\n\n// ============================================\n// Components\n// ============================================\n\nfunction EditorRoot({\n children,\n value: controlledValue,\n defaultValue = '',\n onValueChange,\n placeholder = 'Start typing...',\n disabled = false,\n readOnly = false,\n formats = DEFAULT_FORMATS,\n toolbar = true,\n statusBar = true,\n onAutoSave,\n autoSaveInterval = 30000,\n size = 'md',\n maxLength,\n className,\n ...htmlProps\n}: EditorProps) {\n const contentRef = React.useRef<HTMLTextAreaElement>(null);\n\n const [value, setValue] = useControllableState(\n controlledValue,\n defaultValue,\n onValueChange,\n );\n\n const [saveStatus, setSaveStatus] = React.useState<EditorSaveStatus>('idle');\n\n // Try loading TipTap\n loadTipTapDeps();\n const hasTipTap = !_tiptapFailed && _useEditor && _EditorContent && _StarterKit;\n const mode: EditorMode = hasTipTap ? 'rich' : 'markdown';\n\n // TipTap editor instance (only when available)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tiptapEditor: any = hasTipTap\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_useEditor as any)({\n extensions: [\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_StarterKit as any).configure({\n heading: { levels: [1, 2, 3] },\n blockquote: {},\n codeBlock: false,\n horizontalRule: false,\n hardBreak: false,\n }),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (_LinkExtension as any).configure({\n openOnClick: false,\n HTMLAttributes: { rel: 'noopener noreferrer', target: '_blank' },\n }),\n ],\n editorProps: {\n attributes: {\n role: 'textbox',\n 'aria-label': placeholder,\n 'aria-multiline': 'true',\n },\n },\n content: defaultValue || controlledValue || '',\n editable: !disabled && !readOnly,\n onUpdate: ({ editor: e }: { editor: { getHTML: () => string } }) => {\n const html = e.getHTML();\n setValue(html);\n },\n })\n : null;\n\n // Sync controlled value to TipTap\n React.useEffect(() => {\n if (tiptapEditor && controlledValue !== undefined) {\n const currentContent = tiptapEditor.getHTML();\n if (currentContent !== controlledValue) {\n tiptapEditor.commands.setContent(controlledValue, false);\n }\n }\n }, [controlledValue, tiptapEditor]);\n\n // Update editable state\n React.useEffect(() => {\n if (tiptapEditor) {\n tiptapEditor.setEditable(!disabled && !readOnly);\n }\n }, [tiptapEditor, disabled, readOnly]);\n\n // Auto-save\n React.useEffect(() => {\n if (!onAutoSave || !value) return;\n\n const timer = setTimeout(() => {\n setSaveStatus('saving');\n try {\n onAutoSave(value);\n setSaveStatus('saved');\n } catch {\n setSaveStatus('error');\n }\n }, autoSaveInterval);\n\n return () => clearTimeout(timer);\n }, [value, onAutoSave, autoSaveInterval]);\n\n const toggleFormat = React.useCallback(\n (format: EditorFormat) => {\n if (disabled || readOnly) return;\n\n if (tiptapEditor) {\n switch (format) {\n case 'bold':\n tiptapEditor.chain().focus().toggleBold().run();\n break;\n case 'italic':\n tiptapEditor.chain().focus().toggleItalic().run();\n break;\n case 'strikethrough':\n tiptapEditor.chain().focus().toggleStrike().run();\n break;\n case 'code':\n tiptapEditor.chain().focus().toggleCode().run();\n break;\n case 'bulletList':\n tiptapEditor.chain().focus().toggleBulletList().run();\n break;\n case 'orderedList':\n tiptapEditor.chain().focus().toggleOrderedList().run();\n break;\n case 'heading1':\n tiptapEditor.chain().focus().toggleHeading({ level: 1 }).run();\n break;\n case 'heading2':\n tiptapEditor.chain().focus().toggleHeading({ level: 2 }).run();\n break;\n case 'heading3':\n tiptapEditor.chain().focus().toggleHeading({ level: 3 }).run();\n break;\n case 'blockquote':\n tiptapEditor.chain().focus().toggleBlockquote().run();\n break;\n case 'undo':\n tiptapEditor.chain().focus().undo().run();\n break;\n case 'redo':\n tiptapEditor.chain().focus().redo().run();\n break;\n case 'link': {\n const previousUrl = tiptapEditor.getAttributes('link').href;\n if (previousUrl) {\n tiptapEditor.chain().focus().unsetLink().run();\n } else {\n const url = window.prompt('Enter URL');\n if (url) {\n tiptapEditor.chain().focus().setLink({ href: url }).run();\n }\n }\n break;\n }\n }\n } else if (contentRef.current) {\n applyMarkdownFormat(format, contentRef.current, setValue);\n }\n },\n [disabled, readOnly, tiptapEditor, setValue],\n );\n\n const isFormatActive = React.useCallback(\n (format: EditorFormat): boolean => {\n if (!tiptapEditor) return false;\n switch (format) {\n case 'bold':\n return tiptapEditor.isActive('bold');\n case 'italic':\n return tiptapEditor.isActive('italic');\n case 'strikethrough':\n return tiptapEditor.isActive('strike');\n case 'code':\n return tiptapEditor.isActive('code');\n case 'bulletList':\n return tiptapEditor.isActive('bulletList');\n case 'orderedList':\n return tiptapEditor.isActive('orderedList');\n case 'heading1':\n return tiptapEditor.isActive('heading', { level: 1 });\n case 'heading2':\n return tiptapEditor.isActive('heading', { level: 2 });\n case 'heading3':\n return tiptapEditor.isActive('heading', { level: 3 });\n case 'blockquote':\n return tiptapEditor.isActive('blockquote');\n case 'link':\n return tiptapEditor.isActive('link');\n case 'undo':\n case 'redo':\n return false; // Actions don't have active state\n default:\n return false;\n }\n },\n [tiptapEditor],\n );\n\n const wordCount = React.useMemo(() => {\n if (tiptapEditor) {\n const text = tiptapEditor.getText?.() ?? '';\n return countWords(text);\n }\n return countWords(value);\n }, [value, tiptapEditor]);\n\n const charCount = React.useMemo(() => {\n if (tiptapEditor) {\n return (tiptapEditor.getText?.() ?? '').length;\n }\n return value.length;\n }, [value, tiptapEditor]);\n\n const contextValue: EditorContextValue = {\n value,\n setValue,\n placeholder,\n disabled,\n readOnly,\n formats,\n editor: tiptapEditor,\n mode,\n size,\n maxLength,\n wordCount,\n charCount,\n toggleFormat,\n isFormatActive,\n saveStatus,\n contentRef,\n };\n\n const classes = [\n styles.editor,\n disabled && styles.disabled,\n readOnly && styles.readOnly,\n className,\n ].filter(Boolean).join(' ');\n\n const hasCustomChildren = children !== undefined;\n\n return (\n <EditorContext.Provider value={contextValue}>\n <div\n {...htmlProps}\n className={classes}\n data-disabled={disabled || undefined}\n data-readonly={readOnly || undefined}\n data-size={size}\n >\n {hasCustomChildren ? (\n children\n ) : (\n <>\n {toolbar && (\n <EditorToolbar>\n <EditorToolbarGroup aria-label=\"Text formatting\">\n {formats.map((f) => (\n <EditorToolbarButton key={f} format={f} />\n ))}\n </EditorToolbarGroup>\n </EditorToolbar>\n )}\n <EditorContentArea />\n {statusBar && <EditorStatusBar showWordCount showCharCount />}\n </>\n )}\n </div>\n </EditorContext.Provider>\n );\n}\n\nfunction EditorToolbar({ children, className }: EditorToolbarProps) {\n const classes = [styles.toolbar, className].filter(Boolean).join(' ');\n return (\n <div className={classes} role=\"toolbar\" aria-label=\"Editor formatting\">\n {children}\n </div>\n );\n}\n\nfunction EditorToolbarGroup({ children, 'aria-label': ariaLabel, className }: EditorToolbarGroupProps) {\n const classes = [styles.toolbarGroup, className].filter(Boolean).join(' ');\n return (\n <div className={classes} role=\"group\" aria-label={ariaLabel}>\n {children}\n </div>\n );\n}\n\nfunction EditorToolbarButton({ format, className }: EditorToolbarButtonProps) {\n const { toggleFormat, isFormatActive, disabled, readOnly, editor, mode } = useEditorContext();\n const meta = FORMAT_META[format];\n const isAction = ACTION_FORMATS.has(format);\n const active = isAction ? false : isFormatActive(format);\n const IconComponent = meta.icon;\n\n // Action buttons (undo/redo) have special disable logic\n let isDisabled = disabled || readOnly;\n if (isAction && !isDisabled) {\n if (mode === 'markdown') {\n // Undo/redo in textarea mode is handled natively by the browser\n isDisabled = true;\n } else if (editor) {\n isDisabled = format === 'undo' ? !editor.can().undo() : !editor.can().redo();\n }\n }\n\n const classes = [\n styles.toolbarButton,\n active && styles.toolbarButtonActive,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <button\n type=\"button\"\n className={classes}\n onClick={() => toggleFormat(format)}\n disabled={isDisabled}\n aria-label={meta.label}\n title={`${meta.label} (${meta.shortcut})`}\n {...(isAction ? {} : { 'aria-pressed': active })}\n >\n <IconComponent size={16} weight={active ? 'bold' : 'regular'} />\n </button>\n );\n}\n\nfunction EditorSeparator({ className }: EditorSeparatorProps) {\n const classes = [styles.separator, className].filter(Boolean).join(' ');\n return <div className={classes} role=\"separator\" aria-orientation=\"vertical\" />;\n}\n\nfunction EditorStatusIndicator({ status: statusOverride, labels, className }: EditorStatusIndicatorProps) {\n const { saveStatus } = useEditorContext();\n const status = statusOverride ?? saveStatus;\n const mergedLabels = { ...DEFAULT_STATUS_LABELS, ...labels };\n const label = mergedLabels[status];\n\n if (!label) return null;\n\n const classes = [\n styles.statusIndicator,\n status === 'error' && styles.statusError,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <span className={classes} aria-live=\"polite\" role=\"status\">\n {label}\n </span>\n );\n}\n\nfunction EditorContentArea({ className }: EditorContentProps) {\n const { value, setValue, placeholder, disabled, readOnly, editor, mode, contentRef } =\n useEditorContext();\n\n if (mode === 'rich' && editor && _EditorContent) {\n const TipTapContent = _EditorContent;\n const classes = [styles.content, styles.contentRich, className].filter(Boolean).join(' ');\n return (\n <div className={classes} data-placeholder={placeholder}>\n <TipTapContent editor={editor} />\n </div>\n );\n }\n\n // Textarea fallback for markdown mode\n const classes = [styles.content, className].filter(Boolean).join(' ');\n return (\n <div className={classes}>\n <textarea\n ref={contentRef}\n className={styles.contentTextarea}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n aria-label={placeholder}\n />\n </div>\n );\n}\n\nfunction EditorStatusBar({ showWordCount = true, showCharCount = true, className }: EditorStatusBarProps) {\n const { wordCount, charCount, maxLength } = useEditorContext();\n\n const classes = [styles.statusBar, className].filter(Boolean).join(' ');\n\n const isOverLimit = maxLength !== undefined && charCount > maxLength;\n const isNearLimit = maxLength !== undefined && !isOverLimit && charCount >= maxLength * 0.9;\n\n const charLimitClasses = [\n styles.statusBarItem,\n isNearLimit && styles.statusBarItemWarning,\n isOverLimit && styles.statusBarItemError,\n ].filter(Boolean).join(' ');\n\n return (\n <div className={classes} aria-label=\"Editor statistics\">\n <div className={styles.statusBarLeft} />\n <div className={styles.statusBarRight}>\n {showWordCount && (\n <span className={styles.statusBarItem}>\n {wordCount} {wordCount === 1 ? 'Word' : 'Words'}\n </span>\n )}\n {showWordCount && showCharCount && (\n <EditorSeparator />\n )}\n {showCharCount && (\n <span className={charLimitClasses}>\n {maxLength !== undefined\n ? `${charCount} / ${maxLength}`\n : `${charCount} ${charCount === 1 ? 'Character' : 'Characters'}`\n }\n </span>\n )}\n </div>\n </div>\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Editor = Object.assign(EditorRoot, {\n Toolbar: EditorToolbar,\n ToolbarGroup: EditorToolbarGroup,\n ToolbarButton: EditorToolbarButton,\n Separator: EditorSeparator,\n StatusIndicator: EditorStatusIndicator,\n Content: EditorContentArea,\n StatusBar: EditorStatusBar,\n});\n\nexport {\n EditorRoot,\n EditorToolbar,\n EditorToolbarGroup,\n EditorToolbarButton,\n EditorSeparator,\n EditorStatusIndicator,\n EditorContentArea,\n EditorStatusBar,\n};\n\nexport { useEditorContext };\n"],"names":["classes"],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ const index = require("../Skeleton/index.cjs");
|
|
|
8
8
|
const index$1 = require("../Collapsible/index.cjs");
|
|
9
9
|
const index$2 = require("../ScrollArea/index.cjs");
|
|
10
10
|
const a11y = require("../../utils/a11y.cjs");
|
|
11
|
+
const keyboardShortcuts = require("../../utils/keyboard-shortcuts.cjs");
|
|
11
12
|
function _interopNamespaceDefault(e) {
|
|
12
13
|
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
|
13
14
|
if (e) {
|
|
@@ -197,17 +198,11 @@ function SidebarProvider({
|
|
|
197
198
|
setCollapsed(!collapsed);
|
|
198
199
|
}
|
|
199
200
|
}, [isMobile, open, collapsed, setOpen, setCollapsed, collapsible]);
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
toggleSidebar();
|
|
206
|
-
}
|
|
207
|
-
};
|
|
208
|
-
document.addEventListener("keydown", handleKeyDown);
|
|
209
|
-
return () => document.removeEventListener("keydown", handleKeyDown);
|
|
210
|
-
}, [enableKeyboardShortcut, toggleSidebar, collapsible]);
|
|
201
|
+
keyboardShortcuts.useKeyboardShortcut({
|
|
202
|
+
name: "SIDEBAR_TOGGLE",
|
|
203
|
+
handler: toggleSidebar,
|
|
204
|
+
enabled: enableKeyboardShortcut && collapsible !== "none"
|
|
205
|
+
});
|
|
211
206
|
React__namespace.useEffect(() => {
|
|
212
207
|
if (!isMobile || !open) return;
|
|
213
208
|
const handleEscape = (e) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/components/Sidebar/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Sidebar.module.scss';\nimport { Tooltip } from '../Tooltip';\nimport { Skeleton } from '../Skeleton';\nimport { Collapsible } from '../Collapsible';\nimport { ScrollArea } from '../ScrollArea';\nimport { useFocusTrap } from '../../utils/a11y';\n\n// ============================================\n// Types\n// ============================================\n\n/** Collapse behavior mode */\nexport type SidebarCollapsible = 'icon' | 'offcanvas' | 'none';\n\nexport interface SidebarProviderProps {\n children: React.ReactNode;\n /** Icon-only mode (desktop) - controlled */\n collapsed?: boolean;\n /** Initial collapsed state (uncontrolled) */\n defaultCollapsed?: boolean;\n /** Callback when collapsed state changes */\n onCollapsedChange?: (collapsed: boolean) => void;\n /** Mobile drawer state - controlled */\n open?: boolean;\n /** Initial open state (uncontrolled) */\n defaultOpen?: boolean;\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void;\n /** Width of expanded sidebar */\n width?: string;\n /** Width when collapsed */\n collapsedWidth?: string;\n /** Sidebar position */\n position?: 'left' | 'right';\n /** Collapse behavior: 'icon' (default), 'offcanvas', or 'none' */\n collapsible?: SidebarCollapsible;\n /** Enable Cmd/Ctrl+B keyboard shortcut to toggle sidebar */\n enableKeyboardShortcut?: boolean;\n}\n\nexport interface SidebarProps extends React.HTMLAttributes<HTMLElement> {\n children: React.ReactNode;\n /** Icon-only mode (desktop) - controlled */\n collapsed?: boolean;\n /** Initial collapsed state (uncontrolled) */\n defaultCollapsed?: boolean;\n /** Callback when collapsed state changes */\n onCollapsedChange?: (collapsed: boolean) => void;\n /** Mobile drawer state - controlled */\n open?: boolean;\n /** Initial open state (uncontrolled) */\n defaultOpen?: boolean;\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void;\n /** Width of expanded sidebar */\n width?: string;\n /** Width when collapsed */\n collapsedWidth?: string;\n /** Sidebar position */\n position?: 'left' | 'right';\n /** Collapse behavior: 'icon' (default), 'offcanvas', or 'none' */\n collapsible?: SidebarCollapsible;\n}\n\nexport interface SidebarHeaderProps {\n children: React.ReactNode;\n /** Content to show when sidebar is collapsed (e.g., just logo icon) */\n collapsedContent?: React.ReactNode;\n className?: string;\n}\n\nexport interface SidebarNavProps {\n children: React.ReactNode;\n /** Accessible label for navigation */\n 'aria-label'?: string;\n className?: string;\n}\n\nexport interface SidebarSectionProps {\n children: React.ReactNode;\n /** Optional section label */\n label?: string;\n /** Action element to display in the section header (e.g., \"Add\" button) */\n action?: React.ReactNode;\n /** Enable collapsible behavior */\n collapsible?: boolean;\n /** Default expanded state (only applies when collapsible is true) */\n defaultOpen?: boolean;\n className?: string;\n}\n\nexport interface SidebarSectionActionProps {\n children: React.ReactNode;\n /** Click handler */\n onClick?: () => void;\n /** Accessible label */\n 'aria-label'?: string;\n className?: string;\n}\n\nexport interface SidebarItemProps {\n children: React.ReactNode;\n /** Icon element (required for collapsed mode visibility) */\n icon?: React.ReactNode;\n /** Whether item is currently active/selected */\n active?: boolean;\n /** Disabled state */\n disabled?: boolean;\n /** Badge content (e.g., notification count) */\n badge?: React.ReactNode;\n /** Renders as anchor if provided */\n href?: string;\n /** Click handler (renders as button) */\n onClick?: () => void;\n /** Whether this item has a submenu */\n hasSubmenu?: boolean;\n /** Whether submenu is expanded (controlled) */\n expanded?: boolean;\n /** Initial expanded state (uncontrolled) */\n defaultExpanded?: boolean;\n /** Callback when expanded state changes */\n onExpandedChange?: (expanded: boolean) => void;\n /**\n * Render as child element (polymorphic). When true, clones the single child\n * and merges sidebar item props. Useful for rendering as Next.js Link, etc.\n */\n asChild?: boolean;\n className?: string;\n}\n\nexport interface SidebarSubItemProps {\n children: React.ReactNode;\n /** Whether item is currently active/selected */\n active?: boolean;\n /** Disabled state */\n disabled?: boolean;\n /** Renders as anchor if provided */\n href?: string;\n /** Click handler (renders as button) */\n onClick?: () => void;\n className?: string;\n}\n\nexport interface SidebarFooterProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport interface SidebarTriggerProps {\n /** Custom trigger element (uses render prop pattern) */\n children?: React.ReactNode;\n /** Accessible label */\n 'aria-label'?: string;\n className?: string;\n}\n\nexport interface SidebarOverlayProps {\n className?: string;\n}\n\nexport interface SidebarCollapseToggleProps {\n /** Accessible label */\n 'aria-label'?: string;\n className?: string;\n}\n\nexport interface SidebarRailProps {\n className?: string;\n}\n\nexport interface SidebarMenuSkeletonProps {\n /** Number of skeleton items to render */\n count?: number;\n /** Show icons in skeleton items */\n showIcon?: boolean;\n className?: string;\n}\n\n// ============================================\n// Icons\n// ============================================\n\nfunction MenuIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 256 256\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM40,72H216a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z\" />\n </svg>\n );\n}\n\nfunction CloseIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 256 256\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\" />\n </svg>\n );\n}\n\nfunction CollapsePanelIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 256 256\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM40,56H80V200H40ZM216,200H96V56H216V200Z\" />\n </svg>\n );\n}\n\nfunction ChevronRightIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 256 256\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M181.66,133.66l-80,80a8,8,0,0,1-11.32-11.32L164.69,128,90.34,53.66a8,8,0,0,1,11.32-11.32l80,80A8,8,0,0,1,181.66,133.66Z\" />\n </svg>\n );\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface SidebarContextValue {\n collapsed: boolean;\n setCollapsed: (collapsed: boolean) => void;\n open: boolean;\n setOpen: (open: boolean) => void;\n isMobile: boolean;\n position: 'left' | 'right';\n width: string;\n collapsedWidth: string;\n collapsible: SidebarCollapsible;\n hasIcons: boolean;\n toggleSidebar: () => void;\n sidebarId: string;\n}\n\nconst SidebarContext = React.createContext<SidebarContextValue | null>(null);\n\n/**\n * Hook to access sidebar state and controls.\n * Returns safe defaults if used outside a SidebarProvider/Sidebar.\n */\nfunction useSidebar() {\n const context = React.useContext(SidebarContext);\n if (!context) {\n // Return safe defaults when used outside provider\n return {\n collapsed: false,\n setCollapsed: () => {},\n open: false,\n setOpen: () => {},\n isMobile: false,\n position: 'left' as const,\n width: '240px',\n collapsedWidth: '56px',\n collapsible: 'icon' as SidebarCollapsible,\n hasIcons: true,\n toggleSidebar: () => {},\n sidebarId: 'sidebar',\n state: 'expanded' as 'expanded' | 'collapsed' | 'open' | 'closed',\n };\n }\n return {\n ...context,\n state: context.isMobile\n ? (context.open ? 'open' : 'closed')\n : (context.collapsed ? 'collapsed' : 'expanded'),\n };\n}\n\n/**\n * @deprecated Use `useSidebar` instead. This will be removed in a future version.\n */\nfunction useSidebarContext() {\n const context = React.useContext(SidebarContext);\n if (!context) {\n throw new Error('Sidebar compound components must be used within a Sidebar');\n }\n return context;\n}\n\n// ============================================\n// Hooks\n// ============================================\n\nfunction useIsMobile() {\n const [isMobile, setIsMobile] = React.useState(false);\n\n React.useEffect(() => {\n const mq = window.matchMedia('(max-width: 767px)');\n setIsMobile(mq.matches);\n const handler = (e: MediaQueryListEvent) => setIsMobile(e.matches);\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }, []);\n\n return isMobile;\n}\n\nfunction useControllableState<T>(\n controlledValue: T | undefined,\n defaultValue: T,\n onChange?: (value: T) => void\n): [T, (value: T) => void] {\n const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue);\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : uncontrolledValue;\n\n const setValue = React.useCallback(\n (newValue: T) => {\n if (!isControlled) {\n setUncontrolledValue(newValue);\n }\n onChange?.(newValue);\n },\n [isControlled, onChange]\n );\n\n return [value, setValue];\n}\n\nfunction hasSidebarItemIcons(children: React.ReactNode): boolean {\n let found = false;\n\n const visit = (nodes: React.ReactNode) => {\n React.Children.forEach(nodes, child => {\n if (found || !React.isValidElement(child)) return;\n\n if (child.type === SidebarItem) {\n const props = child.props as SidebarItemProps;\n if (props.icon) {\n found = true;\n return;\n }\n }\n\n const childProps = child.props as { children?: React.ReactNode };\n if (childProps?.children) {\n visit(childProps.children);\n }\n });\n };\n\n visit(children);\n return found;\n}\n\n// ============================================\n// Components\n// ============================================\n\n/**\n * SidebarProvider - Wrap your app layout to provide sidebar state to children.\n * This enables external triggers and keyboard shortcuts.\n */\nfunction SidebarProvider({\n children,\n collapsed: controlledCollapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n width = '240px',\n collapsedWidth = '56px',\n position = 'left',\n collapsible = 'icon',\n enableKeyboardShortcut = true,\n}: SidebarProviderProps) {\n const isMobile = useIsMobile();\n const sidebarId = React.useId();\n\n const [collapsed, setCollapsed] = useControllableState(\n controlledCollapsed,\n defaultCollapsed,\n onCollapsedChange\n );\n\n const [open, setOpen] = useControllableState(\n controlledOpen,\n defaultOpen,\n onOpenChange\n );\n\n const toggleSidebar = React.useCallback(() => {\n if (collapsible === 'none') return;\n if (isMobile) {\n setOpen(!open);\n } else {\n setCollapsed(!collapsed);\n }\n }, [isMobile, open, collapsed, setOpen, setCollapsed, collapsible]);\n\n // Handle Cmd/Ctrl+B keyboard shortcut\n React.useEffect(() => {\n if (!enableKeyboardShortcut || collapsible === 'none') return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'b') {\n e.preventDefault();\n toggleSidebar();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [enableKeyboardShortcut, toggleSidebar, collapsible]);\n\n // Handle escape key for mobile drawer\n React.useEffect(() => {\n if (!isMobile || !open) return;\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setOpen(false);\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isMobile, open, setOpen]);\n\n // Lock body scroll when mobile drawer is open\n React.useEffect(() => {\n if (!isMobile) return;\n\n if (open) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n\n return () => {\n document.body.style.overflow = '';\n };\n }, [isMobile, open]);\n\n const contextValue: SidebarContextValue = {\n collapsed,\n setCollapsed,\n open,\n setOpen,\n isMobile,\n position,\n width,\n collapsedWidth,\n collapsible,\n hasIcons: true,\n toggleSidebar,\n sidebarId,\n };\n\n return (\n <SidebarContext.Provider value={contextValue}>\n {children}\n </SidebarContext.Provider>\n );\n}\n\nfunction SidebarRoot({\n children,\n collapsed: controlledCollapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n width = '240px',\n collapsedWidth = '56px',\n position = 'left',\n collapsible = 'icon',\n className,\n style: styleProp,\n 'aria-label': ariaLabel,\n ...htmlProps\n}: SidebarProps) {\n // Check if we're inside a SidebarProvider\n const existingContext = React.useContext(SidebarContext);\n const isMobile = useIsMobile();\n\n const [internalCollapsed, setInternalCollapsed] = useControllableState(\n controlledCollapsed,\n defaultCollapsed,\n onCollapsedChange\n );\n\n const [internalOpen, setInternalOpen] = useControllableState(\n controlledOpen,\n defaultOpen,\n onOpenChange\n );\n\n // Use existing context values if inside a provider, otherwise use internal state\n const collapsed = existingContext ? existingContext.collapsed : internalCollapsed;\n const setCollapsed = existingContext ? existingContext.setCollapsed : setInternalCollapsed;\n const open = existingContext ? existingContext.open : internalOpen;\n const setOpen = existingContext ? existingContext.setOpen : setInternalOpen;\n const resolvedPosition = existingContext ? existingContext.position : position;\n const resolvedWidth = existingContext ? existingContext.width : width;\n const resolvedCollapsedWidth = existingContext ? existingContext.collapsedWidth : collapsedWidth;\n const resolvedCollapsible = existingContext ? existingContext.collapsible : collapsible;\n const hasIcons = React.useMemo(() => hasSidebarItemIcons(children), [children]);\n const shouldCollapseToZero = !isMobile && resolvedCollapsible === 'icon' && collapsed && !hasIcons;\n const isOffcanvasCollapsed = !isMobile && resolvedCollapsible === 'offcanvas' && collapsed;\n const effectiveCollapsedWidth = (shouldCollapseToZero || isOffcanvasCollapsed) ? '0px' : resolvedCollapsedWidth;\n const sidebarId = React.useId();\n const resolvedSidebarId = existingContext ? existingContext.sidebarId : sidebarId;\n const sidebarRef = React.useRef<HTMLElement>(null);\n\n useFocusTrap(sidebarRef, isMobile && open);\n\n const toggleSidebar = React.useCallback(() => {\n if (resolvedCollapsible === 'none') return;\n if (isMobile) {\n setOpen(!open);\n } else {\n setCollapsed(!collapsed);\n }\n }, [isMobile, open, collapsed, setOpen, setCollapsed, resolvedCollapsible]);\n\n // Handle escape key for mobile drawer (only if no provider)\n React.useEffect(() => {\n if (existingContext) return; // Provider handles this\n if (!isMobile || !open) return;\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setOpen(false);\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [existingContext, isMobile, open, setOpen]);\n\n // Lock body scroll when mobile drawer is open (only if no provider)\n React.useEffect(() => {\n if (existingContext) return; // Provider handles this\n if (!isMobile) return;\n\n if (open) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n\n return () => {\n document.body.style.overflow = '';\n };\n }, [existingContext, isMobile, open]);\n\n const contextValue: SidebarContextValue = {\n ...(existingContext || {\n collapsed,\n setCollapsed,\n open,\n setOpen,\n isMobile,\n position: resolvedPosition,\n width: resolvedWidth,\n collapsedWidth: resolvedCollapsedWidth,\n collapsible: resolvedCollapsible,\n hasIcons,\n toggleSidebar,\n sidebarId: resolvedSidebarId,\n }),\n hasIcons,\n };\n\n const isCollapsedForStyle = resolvedCollapsible === 'icon' && collapsed;\n\n const classes = [\n styles.root,\n isMobile && styles.mobile,\n !isMobile && isCollapsedForStyle && styles.collapsed,\n !isMobile && isCollapsedForStyle && shouldCollapseToZero && styles.collapsedNoIcons,\n isOffcanvasCollapsed && styles.offcanvasCollapsed,\n resolvedPosition === 'right' && styles.positionRight,\n className,\n ].filter(Boolean).join(' ');\n\n const style: React.CSSProperties = {\n '--sidebar-width': resolvedWidth,\n '--sidebar-collapsed-width': resolvedCollapsedWidth,\n '--sidebar-effective-collapsed-width': effectiveCollapsedWidth,\n ...styleProp,\n } as React.CSSProperties;\n\n const content = (\n <aside\n ref={sidebarRef}\n id={resolvedSidebarId}\n {...htmlProps}\n className={classes}\n style={style}\n role={isMobile ? 'dialog' : undefined}\n aria-modal={isMobile && open ? true : undefined}\n aria-hidden={isMobile && !open ? true : undefined}\n aria-label={isMobile ? (ariaLabel || 'Sidebar navigation') : ariaLabel}\n data-state={isMobile ? (open ? 'open' : 'closed') : (collapsed ? 'collapsed' : 'expanded')}\n data-position={resolvedPosition}\n data-collapsible={resolvedCollapsible}\n data-icon-collapse={resolvedCollapsible === 'icon' ? (hasIcons ? 'icons' : 'none') : undefined}\n >\n {children}\n </aside>\n );\n\n return (\n <SidebarContext.Provider value={contextValue}>\n {content}\n </SidebarContext.Provider>\n );\n}\n\nfunction SidebarHeader({ children, collapsedContent, className }: SidebarHeaderProps) {\n const { collapsed, isMobile } = useSidebarContext();\n const isCollapsed = collapsed && !isMobile;\n const classes = [styles.header, className].filter(Boolean).join(' ');\n\n // Show collapsed content when sidebar is collapsed (and we have it), otherwise show children\n const content = isCollapsed && collapsedContent ? collapsedContent : children;\n\n return <div className={classes}>{content}</div>;\n}\n\nfunction SidebarNav({ children, 'aria-label': ariaLabel = 'Main navigation', className }: SidebarNavProps) {\n const classes = [styles.nav, className].filter(Boolean).join(' ');\n return (\n <nav className={classes} aria-label={ariaLabel}>\n <ScrollArea orientation=\"vertical\" showFades className={styles.navScrollArea}>\n {children}\n </ScrollArea>\n </nav>\n );\n}\n\nfunction SidebarSection({\n children,\n label,\n action,\n collapsible: isCollapsibleProp = false,\n defaultOpen = true,\n className\n}: SidebarSectionProps) {\n const { collapsed, isMobile } = useSidebarContext();\n\n const classes = [\n styles.section,\n className\n ].filter(Boolean).join(' ');\n\n const showLabel = label && (!collapsed || isMobile);\n const showAction = action && (!collapsed || isMobile);\n const isCollapsible = isCollapsibleProp && showLabel;\n\n // Non-collapsible section\n if (!isCollapsible) {\n return (\n <div className={classes} role=\"group\" aria-label={label}>\n {(showLabel || showAction) && (\n <div className={styles.sectionHeader}>\n {showLabel && <div className={styles.sectionLabel}>{label}</div>}\n {showAction && <div className={styles.sectionActionWrapper}>{action}</div>}\n </div>\n )}\n <ul className={styles.sectionList}>\n {children}\n </ul>\n </div>\n );\n }\n\n // Collapsible section using Collapsible component\n return (\n <div className={classes} role=\"group\" aria-label={label}>\n <Collapsible defaultOpen={defaultOpen} className={styles.sectionCollapsible}>\n <div className={styles.sectionHeader}>\n <Collapsible.Trigger\n className={styles.sectionTrigger}\n chevronPosition=\"end\"\n >\n <span className={styles.sectionLabel}>{label}</span>\n </Collapsible.Trigger>\n {showAction && <div className={styles.sectionActionWrapper}>{action}</div>}\n </div>\n <Collapsible.Content className={styles.sectionContent}>\n <ul className={styles.sectionList}>\n {children}\n </ul>\n </Collapsible.Content>\n </Collapsible>\n </div>\n );\n}\n\nfunction SidebarSectionAction({\n children,\n onClick,\n 'aria-label': ariaLabel,\n className,\n}: SidebarSectionActionProps) {\n const classes = [styles.sectionAction, className].filter(Boolean).join(' ');\n\n return (\n <button\n type=\"button\"\n className={classes}\n onClick={onClick}\n aria-label={ariaLabel}\n >\n {children}\n </button>\n );\n}\n\nfunction SidebarItem({\n children,\n icon,\n active = false,\n disabled = false,\n badge,\n href,\n onClick,\n hasSubmenu = false,\n expanded: controlledExpanded,\n defaultExpanded = false,\n onExpandedChange,\n asChild = false,\n className,\n}: SidebarItemProps) {\n const { collapsed, isMobile } = useSidebarContext();\n const [expanded, setExpanded] = useControllableState(\n controlledExpanded,\n defaultExpanded,\n onExpandedChange\n );\n\n const isCollapsed = collapsed && !isMobile;\n const showLabel = !isCollapsed;\n\n const classes = [\n styles.item,\n active && styles.itemActive,\n disabled && styles.itemDisabled,\n hasSubmenu && styles.itemHasSubmenu,\n expanded && styles.itemExpanded,\n className,\n ].filter(Boolean).join(' ');\n\n const handleClick = (e: React.MouseEvent) => {\n if (disabled) {\n e.preventDefault();\n return;\n }\n if (hasSubmenu) {\n e.preventDefault();\n setExpanded(!expanded);\n }\n onClick?.();\n };\n\n // Extract text content from children for aria-label when collapsed\n // For asChild, try to extract from the child's children prop\n let labelText: string | undefined;\n if (asChild && React.isValidElement(children)) {\n const childProps = children.props as { children?: React.ReactNode };\n labelText = typeof childProps.children === 'string' ? childProps.children : undefined;\n } else {\n labelText = typeof children === 'string' ? children : undefined;\n }\n\n const itemContent = (\n <>\n {icon && <span className={styles.itemIcon}>{icon}</span>}\n {showLabel && <span className={styles.itemLabel}>{asChild && React.isValidElement(children) ? (children.props as { children?: React.ReactNode }).children : children}</span>}\n {showLabel && badge && <span className={styles.itemBadge}>{badge}</span>}\n {showLabel && hasSubmenu && (\n <span className={styles.itemChevron}>\n <ChevronRightIcon />\n </span>\n )}\n </>\n );\n\n const itemProps = {\n className: classes,\n onClick: handleClick,\n 'aria-current': active ? 'page' as const : undefined,\n 'aria-disabled': disabled || undefined,\n 'aria-expanded': hasSubmenu ? expanded : undefined,\n 'aria-label': isCollapsed ? labelText : undefined,\n tabIndex: disabled ? -1 : 0,\n };\n\n let itemElement: React.ReactElement;\n\n if (asChild && React.isValidElement(children)) {\n // Clone the child element and merge props\n itemElement = React.cloneElement(children, {\n ...itemProps,\n // Merge classNames\n className: [classes, (children.props as { className?: string }).className].filter(Boolean).join(' '),\n children: itemContent,\n } as React.HTMLAttributes<HTMLElement>);\n } else if (href) {\n itemElement = (\n <a {...itemProps} href={href}>\n {itemContent}\n </a>\n );\n } else {\n itemElement = (\n <button {...itemProps} type=\"button\">\n {itemContent}\n </button>\n );\n }\n\n // Wrap in tooltip when collapsed\n const wrappedItem = isCollapsed ? (\n <Tooltip content={labelText || children} side=\"right\" delay={100}>\n {itemElement}\n </Tooltip>\n ) : (\n itemElement\n );\n\n const wrapperClasses = [\n styles.itemWrapper,\n expanded && styles.itemExpanded,\n ].filter(Boolean).join(' ');\n\n return <li className={wrapperClasses}>{wrappedItem}</li>;\n}\n\nfunction SidebarSubItem({\n children,\n active = false,\n disabled = false,\n href,\n onClick,\n className,\n}: SidebarSubItemProps) {\n const { collapsed, isMobile } = useSidebarContext();\n\n // Don't render sub-items when collapsed (unless mobile)\n if (collapsed && !isMobile) {\n return null;\n }\n\n const classes = [\n styles.subItem,\n active && styles.subItemActive,\n disabled && styles.subItemDisabled,\n className,\n ].filter(Boolean).join(' ');\n\n const handleClick = (e: React.MouseEvent) => {\n if (disabled) {\n e.preventDefault();\n return;\n }\n onClick?.();\n };\n\n const itemProps = {\n className: classes,\n onClick: handleClick,\n 'aria-current': active ? 'page' as const : undefined,\n 'aria-disabled': disabled,\n tabIndex: disabled ? -1 : 0,\n };\n\n const itemElement = href ? (\n <a {...itemProps} href={href}>\n {children}\n </a>\n ) : (\n <button {...itemProps} type=\"button\">\n {children}\n </button>\n );\n\n return <li className={styles.subItemWrapper}>{itemElement}</li>;\n}\n\nfunction SidebarSubmenu({ children }: { children: React.ReactNode }) {\n return (\n <li className={styles.submenuWrapper}>\n <ul className={styles.submenu}>\n {children}\n </ul>\n </li>\n );\n}\n\nfunction SidebarFooter({ children, className }: SidebarFooterProps) {\n const classes = [styles.footer, className].filter(Boolean).join(' ');\n return <div className={classes}>{children}</div>;\n}\n\nfunction SidebarTrigger({ children, 'aria-label': ariaLabel = 'Toggle navigation', className }: SidebarTriggerProps) {\n const { open, setOpen, isMobile, sidebarId } = useSidebarContext();\n\n // Only render trigger on mobile\n if (!isMobile) {\n return null;\n }\n\n const classes = [styles.trigger, className].filter(Boolean).join(' ');\n\n return (\n <button\n type=\"button\"\n className={classes}\n onClick={() => setOpen(!open)}\n aria-label={ariaLabel}\n aria-expanded={open}\n aria-controls={sidebarId}\n >\n {children || (open ? <CloseIcon /> : <MenuIcon />)}\n </button>\n );\n}\n\nfunction SidebarOverlay({ className }: SidebarOverlayProps) {\n const { open, setOpen, isMobile } = useSidebarContext();\n\n // Only render overlay on mobile when open\n if (!isMobile || !open) {\n return null;\n }\n\n const classes = [styles.overlay, className].filter(Boolean).join(' ');\n\n return (\n <div\n className={classes}\n onClick={() => setOpen(false)}\n aria-hidden=\"true\"\n data-state={open ? 'open' : 'closed'}\n />\n );\n}\n\nfunction SidebarCollapseToggle({ 'aria-label': ariaLabel, className }: SidebarCollapseToggleProps) {\n const { collapsed, setCollapsed, isMobile, collapsible, hasIcons } = useSidebarContext();\n\n // Don't show on mobile or when collapsing is disabled\n if (isMobile || collapsible === 'none') {\n return null;\n }\n\n const shouldFloat = collapsed && (\n (collapsible === 'icon' && !hasIcons) ||\n collapsible === 'offcanvas'\n );\n const classes = [\n styles.collapseToggle,\n shouldFloat && styles.collapseToggleFloating,\n className,\n ].filter(Boolean).join(' ');\n const label = ariaLabel || (collapsed ? 'Expand sidebar' : 'Collapse sidebar');\n\n return (\n <button\n type=\"button\"\n className={classes}\n onClick={() => setCollapsed(!collapsed)}\n aria-label={label}\n >\n <CollapsePanelIcon />\n </button>\n );\n}\n\nfunction SidebarRail({ className }: SidebarRailProps) {\n const { collapsed, setCollapsed, isMobile, collapsible } = useSidebarContext();\n\n // Don't show on mobile or when collapsing is disabled\n if (isMobile || collapsible === 'none') {\n return null;\n }\n\n const classes = [\n styles.rail,\n collapsed && styles.railCollapsed,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <button\n type=\"button\"\n className={classes}\n onClick={() => setCollapsed(!collapsed)}\n aria-label={collapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n title={collapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n />\n );\n}\n\nfunction SidebarMenuSkeleton({\n count = 5,\n showIcon = true,\n className,\n}: SidebarMenuSkeletonProps) {\n const { collapsed, isMobile } = useSidebarContext();\n const isCollapsed = collapsed && !isMobile;\n\n const classes = [styles.menuSkeleton, className].filter(Boolean).join(' ');\n const labelWidths = ['64%', '72%', '68%', '79%', '74%', '66%', '83%', '70%'];\n\n return (\n <div className={classes} aria-hidden=\"true\">\n {Array.from({ length: count }).map((_, i) => (\n <div key={i} className={styles.skeletonItem}>\n {showIcon && <Skeleton variant=\"avatar\" size=\"sm\" />}\n {!isCollapsed && (\n <Skeleton\n variant=\"text\"\n className={styles.skeletonLabel}\n width={labelWidths[i % labelWidths.length]}\n />\n )}\n </div>\n ))}\n </div>\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Sidebar = Object.assign(SidebarRoot, {\n Header: SidebarHeader,\n Nav: SidebarNav,\n Section: SidebarSection,\n SectionAction: SidebarSectionAction,\n Item: SidebarItem,\n SubItem: SidebarSubItem,\n Submenu: SidebarSubmenu,\n Footer: SidebarFooter,\n Trigger: SidebarTrigger,\n Overlay: SidebarOverlay,\n CollapseToggle: SidebarCollapseToggle,\n Rail: SidebarRail,\n MenuSkeleton: SidebarMenuSkeleton,\n});\n\n// Re-export individual components\nexport {\n SidebarProvider,\n SidebarRoot,\n SidebarHeader,\n SidebarNav,\n SidebarSection,\n SidebarSectionAction,\n SidebarItem,\n SidebarSubItem,\n SidebarSubmenu,\n SidebarFooter,\n SidebarTrigger,\n SidebarOverlay,\n SidebarCollapseToggle,\n SidebarRail,\n SidebarMenuSkeleton,\n};\n\n// Export hooks\nexport { useSidebar };\n\n// Export context hook for backwards compatibility (deprecated)\nexport { useSidebarContext };\n"],"names":["jsx","React","useFocusTrap","styles","ScrollArea","jsxs","Collapsible","Fragment","Tooltip","Skeleton"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/components/Sidebar/index.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport styles from './Sidebar.module.scss';\nimport { Tooltip } from '../Tooltip';\nimport { Skeleton } from '../Skeleton';\nimport { Collapsible } from '../Collapsible';\nimport { ScrollArea } from '../ScrollArea';\nimport { useFocusTrap } from '../../utils/a11y';\nimport { useKeyboardShortcut } from '../../utils/keyboard-shortcuts';\n\n// ============================================\n// Types\n// ============================================\n\n/** Collapse behavior mode */\nexport type SidebarCollapsible = 'icon' | 'offcanvas' | 'none';\n\nexport interface SidebarProviderProps {\n children: React.ReactNode;\n /** Icon-only mode (desktop) - controlled */\n collapsed?: boolean;\n /** Initial collapsed state (uncontrolled) */\n defaultCollapsed?: boolean;\n /** Callback when collapsed state changes */\n onCollapsedChange?: (collapsed: boolean) => void;\n /** Mobile drawer state - controlled */\n open?: boolean;\n /** Initial open state (uncontrolled) */\n defaultOpen?: boolean;\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void;\n /** Width of expanded sidebar */\n width?: string;\n /** Width when collapsed */\n collapsedWidth?: string;\n /** Sidebar position */\n position?: 'left' | 'right';\n /** Collapse behavior: 'icon' (default), 'offcanvas', or 'none' */\n collapsible?: SidebarCollapsible;\n /** Enable Cmd/Ctrl+B keyboard shortcut to toggle sidebar */\n enableKeyboardShortcut?: boolean;\n}\n\nexport interface SidebarProps extends React.HTMLAttributes<HTMLElement> {\n children: React.ReactNode;\n /** Icon-only mode (desktop) - controlled */\n collapsed?: boolean;\n /** Initial collapsed state (uncontrolled) */\n defaultCollapsed?: boolean;\n /** Callback when collapsed state changes */\n onCollapsedChange?: (collapsed: boolean) => void;\n /** Mobile drawer state - controlled */\n open?: boolean;\n /** Initial open state (uncontrolled) */\n defaultOpen?: boolean;\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void;\n /** Width of expanded sidebar */\n width?: string;\n /** Width when collapsed */\n collapsedWidth?: string;\n /** Sidebar position */\n position?: 'left' | 'right';\n /** Collapse behavior: 'icon' (default), 'offcanvas', or 'none' */\n collapsible?: SidebarCollapsible;\n}\n\nexport interface SidebarHeaderProps {\n children: React.ReactNode;\n /** Content to show when sidebar is collapsed (e.g., just logo icon) */\n collapsedContent?: React.ReactNode;\n className?: string;\n}\n\nexport interface SidebarNavProps {\n children: React.ReactNode;\n /** Accessible label for navigation */\n 'aria-label'?: string;\n className?: string;\n}\n\nexport interface SidebarSectionProps {\n children: React.ReactNode;\n /** Optional section label */\n label?: string;\n /** Action element to display in the section header (e.g., \"Add\" button) */\n action?: React.ReactNode;\n /** Enable collapsible behavior */\n collapsible?: boolean;\n /** Default expanded state (only applies when collapsible is true) */\n defaultOpen?: boolean;\n className?: string;\n}\n\nexport interface SidebarSectionActionProps {\n children: React.ReactNode;\n /** Click handler */\n onClick?: () => void;\n /** Accessible label */\n 'aria-label'?: string;\n className?: string;\n}\n\nexport interface SidebarItemProps {\n children: React.ReactNode;\n /** Icon element (required for collapsed mode visibility) */\n icon?: React.ReactNode;\n /** Whether item is currently active/selected */\n active?: boolean;\n /** Disabled state */\n disabled?: boolean;\n /** Badge content (e.g., notification count) */\n badge?: React.ReactNode;\n /** Renders as anchor if provided */\n href?: string;\n /** Click handler (renders as button) */\n onClick?: () => void;\n /** Whether this item has a submenu */\n hasSubmenu?: boolean;\n /** Whether submenu is expanded (controlled) */\n expanded?: boolean;\n /** Initial expanded state (uncontrolled) */\n defaultExpanded?: boolean;\n /** Callback when expanded state changes */\n onExpandedChange?: (expanded: boolean) => void;\n /**\n * Render as child element (polymorphic). When true, clones the single child\n * and merges sidebar item props. Useful for rendering as Next.js Link, etc.\n */\n asChild?: boolean;\n className?: string;\n}\n\nexport interface SidebarSubItemProps {\n children: React.ReactNode;\n /** Whether item is currently active/selected */\n active?: boolean;\n /** Disabled state */\n disabled?: boolean;\n /** Renders as anchor if provided */\n href?: string;\n /** Click handler (renders as button) */\n onClick?: () => void;\n className?: string;\n}\n\nexport interface SidebarFooterProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport interface SidebarTriggerProps {\n /** Custom trigger element (uses render prop pattern) */\n children?: React.ReactNode;\n /** Accessible label */\n 'aria-label'?: string;\n className?: string;\n}\n\nexport interface SidebarOverlayProps {\n className?: string;\n}\n\nexport interface SidebarCollapseToggleProps {\n /** Accessible label */\n 'aria-label'?: string;\n className?: string;\n}\n\nexport interface SidebarRailProps {\n className?: string;\n}\n\nexport interface SidebarMenuSkeletonProps {\n /** Number of skeleton items to render */\n count?: number;\n /** Show icons in skeleton items */\n showIcon?: boolean;\n className?: string;\n}\n\n// ============================================\n// Icons\n// ============================================\n\nfunction MenuIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 256 256\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM40,72H216a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Z\" />\n </svg>\n );\n}\n\nfunction CloseIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 256 256\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\" />\n </svg>\n );\n}\n\nfunction CollapsePanelIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 256 256\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40ZM40,56H80V200H40ZM216,200H96V56H216V200Z\" />\n </svg>\n );\n}\n\nfunction ChevronRightIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 256 256\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M181.66,133.66l-80,80a8,8,0,0,1-11.32-11.32L164.69,128,90.34,53.66a8,8,0,0,1,11.32-11.32l80,80A8,8,0,0,1,181.66,133.66Z\" />\n </svg>\n );\n}\n\n// ============================================\n// Context\n// ============================================\n\ninterface SidebarContextValue {\n collapsed: boolean;\n setCollapsed: (collapsed: boolean) => void;\n open: boolean;\n setOpen: (open: boolean) => void;\n isMobile: boolean;\n position: 'left' | 'right';\n width: string;\n collapsedWidth: string;\n collapsible: SidebarCollapsible;\n hasIcons: boolean;\n toggleSidebar: () => void;\n sidebarId: string;\n}\n\nconst SidebarContext = React.createContext<SidebarContextValue | null>(null);\n\n/**\n * Hook to access sidebar state and controls.\n * Returns safe defaults if used outside a SidebarProvider/Sidebar.\n */\nfunction useSidebar() {\n const context = React.useContext(SidebarContext);\n if (!context) {\n // Return safe defaults when used outside provider\n return {\n collapsed: false,\n setCollapsed: () => {},\n open: false,\n setOpen: () => {},\n isMobile: false,\n position: 'left' as const,\n width: '240px',\n collapsedWidth: '56px',\n collapsible: 'icon' as SidebarCollapsible,\n hasIcons: true,\n toggleSidebar: () => {},\n sidebarId: 'sidebar',\n state: 'expanded' as 'expanded' | 'collapsed' | 'open' | 'closed',\n };\n }\n return {\n ...context,\n state: context.isMobile\n ? (context.open ? 'open' : 'closed')\n : (context.collapsed ? 'collapsed' : 'expanded'),\n };\n}\n\n/**\n * @deprecated Use `useSidebar` instead. This will be removed in a future version.\n */\nfunction useSidebarContext() {\n const context = React.useContext(SidebarContext);\n if (!context) {\n throw new Error('Sidebar compound components must be used within a Sidebar');\n }\n return context;\n}\n\n// ============================================\n// Hooks\n// ============================================\n\nfunction useIsMobile() {\n const [isMobile, setIsMobile] = React.useState(false);\n\n React.useEffect(() => {\n const mq = window.matchMedia('(max-width: 767px)');\n setIsMobile(mq.matches);\n const handler = (e: MediaQueryListEvent) => setIsMobile(e.matches);\n mq.addEventListener('change', handler);\n return () => mq.removeEventListener('change', handler);\n }, []);\n\n return isMobile;\n}\n\nfunction useControllableState<T>(\n controlledValue: T | undefined,\n defaultValue: T,\n onChange?: (value: T) => void\n): [T, (value: T) => void] {\n const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue);\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : uncontrolledValue;\n\n const setValue = React.useCallback(\n (newValue: T) => {\n if (!isControlled) {\n setUncontrolledValue(newValue);\n }\n onChange?.(newValue);\n },\n [isControlled, onChange]\n );\n\n return [value, setValue];\n}\n\nfunction hasSidebarItemIcons(children: React.ReactNode): boolean {\n let found = false;\n\n const visit = (nodes: React.ReactNode) => {\n React.Children.forEach(nodes, child => {\n if (found || !React.isValidElement(child)) return;\n\n if (child.type === SidebarItem) {\n const props = child.props as SidebarItemProps;\n if (props.icon) {\n found = true;\n return;\n }\n }\n\n const childProps = child.props as { children?: React.ReactNode };\n if (childProps?.children) {\n visit(childProps.children);\n }\n });\n };\n\n visit(children);\n return found;\n}\n\n// ============================================\n// Components\n// ============================================\n\n/**\n * SidebarProvider - Wrap your app layout to provide sidebar state to children.\n * This enables external triggers and keyboard shortcuts.\n */\nfunction SidebarProvider({\n children,\n collapsed: controlledCollapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n width = '240px',\n collapsedWidth = '56px',\n position = 'left',\n collapsible = 'icon',\n enableKeyboardShortcut = true,\n}: SidebarProviderProps) {\n const isMobile = useIsMobile();\n const sidebarId = React.useId();\n\n const [collapsed, setCollapsed] = useControllableState(\n controlledCollapsed,\n defaultCollapsed,\n onCollapsedChange\n );\n\n const [open, setOpen] = useControllableState(\n controlledOpen,\n defaultOpen,\n onOpenChange\n );\n\n const toggleSidebar = React.useCallback(() => {\n if (collapsible === 'none') return;\n if (isMobile) {\n setOpen(!open);\n } else {\n setCollapsed(!collapsed);\n }\n }, [isMobile, open, collapsed, setOpen, setCollapsed, collapsible]);\n\n // Handle Cmd/Ctrl+B keyboard shortcut (skips editable elements like Editor)\n useKeyboardShortcut({\n name: 'SIDEBAR_TOGGLE',\n handler: toggleSidebar,\n enabled: enableKeyboardShortcut && collapsible !== 'none',\n });\n\n // Handle escape key for mobile drawer\n React.useEffect(() => {\n if (!isMobile || !open) return;\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setOpen(false);\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isMobile, open, setOpen]);\n\n // Lock body scroll when mobile drawer is open\n React.useEffect(() => {\n if (!isMobile) return;\n\n if (open) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n\n return () => {\n document.body.style.overflow = '';\n };\n }, [isMobile, open]);\n\n const contextValue: SidebarContextValue = {\n collapsed,\n setCollapsed,\n open,\n setOpen,\n isMobile,\n position,\n width,\n collapsedWidth,\n collapsible,\n hasIcons: true,\n toggleSidebar,\n sidebarId,\n };\n\n return (\n <SidebarContext.Provider value={contextValue}>\n {children}\n </SidebarContext.Provider>\n );\n}\n\nfunction SidebarRoot({\n children,\n collapsed: controlledCollapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n width = '240px',\n collapsedWidth = '56px',\n position = 'left',\n collapsible = 'icon',\n className,\n style: styleProp,\n 'aria-label': ariaLabel,\n ...htmlProps\n}: SidebarProps) {\n // Check if we're inside a SidebarProvider\n const existingContext = React.useContext(SidebarContext);\n const isMobile = useIsMobile();\n\n const [internalCollapsed, setInternalCollapsed] = useControllableState(\n controlledCollapsed,\n defaultCollapsed,\n onCollapsedChange\n );\n\n const [internalOpen, setInternalOpen] = useControllableState(\n controlledOpen,\n defaultOpen,\n onOpenChange\n );\n\n // Use existing context values if inside a provider, otherwise use internal state\n const collapsed = existingContext ? existingContext.collapsed : internalCollapsed;\n const setCollapsed = existingContext ? existingContext.setCollapsed : setInternalCollapsed;\n const open = existingContext ? existingContext.open : internalOpen;\n const setOpen = existingContext ? existingContext.setOpen : setInternalOpen;\n const resolvedPosition = existingContext ? existingContext.position : position;\n const resolvedWidth = existingContext ? existingContext.width : width;\n const resolvedCollapsedWidth = existingContext ? existingContext.collapsedWidth : collapsedWidth;\n const resolvedCollapsible = existingContext ? existingContext.collapsible : collapsible;\n const hasIcons = React.useMemo(() => hasSidebarItemIcons(children), [children]);\n const shouldCollapseToZero = !isMobile && resolvedCollapsible === 'icon' && collapsed && !hasIcons;\n const isOffcanvasCollapsed = !isMobile && resolvedCollapsible === 'offcanvas' && collapsed;\n const effectiveCollapsedWidth = (shouldCollapseToZero || isOffcanvasCollapsed) ? '0px' : resolvedCollapsedWidth;\n const sidebarId = React.useId();\n const resolvedSidebarId = existingContext ? existingContext.sidebarId : sidebarId;\n const sidebarRef = React.useRef<HTMLElement>(null);\n\n useFocusTrap(sidebarRef, isMobile && open);\n\n const toggleSidebar = React.useCallback(() => {\n if (resolvedCollapsible === 'none') return;\n if (isMobile) {\n setOpen(!open);\n } else {\n setCollapsed(!collapsed);\n }\n }, [isMobile, open, collapsed, setOpen, setCollapsed, resolvedCollapsible]);\n\n // Handle escape key for mobile drawer (only if no provider)\n React.useEffect(() => {\n if (existingContext) return; // Provider handles this\n if (!isMobile || !open) return;\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setOpen(false);\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [existingContext, isMobile, open, setOpen]);\n\n // Lock body scroll when mobile drawer is open (only if no provider)\n React.useEffect(() => {\n if (existingContext) return; // Provider handles this\n if (!isMobile) return;\n\n if (open) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n\n return () => {\n document.body.style.overflow = '';\n };\n }, [existingContext, isMobile, open]);\n\n const contextValue: SidebarContextValue = {\n ...(existingContext || {\n collapsed,\n setCollapsed,\n open,\n setOpen,\n isMobile,\n position: resolvedPosition,\n width: resolvedWidth,\n collapsedWidth: resolvedCollapsedWidth,\n collapsible: resolvedCollapsible,\n hasIcons,\n toggleSidebar,\n sidebarId: resolvedSidebarId,\n }),\n hasIcons,\n };\n\n const isCollapsedForStyle = resolvedCollapsible === 'icon' && collapsed;\n\n const classes = [\n styles.root,\n isMobile && styles.mobile,\n !isMobile && isCollapsedForStyle && styles.collapsed,\n !isMobile && isCollapsedForStyle && shouldCollapseToZero && styles.collapsedNoIcons,\n isOffcanvasCollapsed && styles.offcanvasCollapsed,\n resolvedPosition === 'right' && styles.positionRight,\n className,\n ].filter(Boolean).join(' ');\n\n const style: React.CSSProperties = {\n '--sidebar-width': resolvedWidth,\n '--sidebar-collapsed-width': resolvedCollapsedWidth,\n '--sidebar-effective-collapsed-width': effectiveCollapsedWidth,\n ...styleProp,\n } as React.CSSProperties;\n\n const content = (\n <aside\n ref={sidebarRef}\n id={resolvedSidebarId}\n {...htmlProps}\n className={classes}\n style={style}\n role={isMobile ? 'dialog' : undefined}\n aria-modal={isMobile && open ? true : undefined}\n aria-hidden={isMobile && !open ? true : undefined}\n aria-label={isMobile ? (ariaLabel || 'Sidebar navigation') : ariaLabel}\n data-state={isMobile ? (open ? 'open' : 'closed') : (collapsed ? 'collapsed' : 'expanded')}\n data-position={resolvedPosition}\n data-collapsible={resolvedCollapsible}\n data-icon-collapse={resolvedCollapsible === 'icon' ? (hasIcons ? 'icons' : 'none') : undefined}\n >\n {children}\n </aside>\n );\n\n return (\n <SidebarContext.Provider value={contextValue}>\n {content}\n </SidebarContext.Provider>\n );\n}\n\nfunction SidebarHeader({ children, collapsedContent, className }: SidebarHeaderProps) {\n const { collapsed, isMobile } = useSidebarContext();\n const isCollapsed = collapsed && !isMobile;\n const classes = [styles.header, className].filter(Boolean).join(' ');\n\n // Show collapsed content when sidebar is collapsed (and we have it), otherwise show children\n const content = isCollapsed && collapsedContent ? collapsedContent : children;\n\n return <div className={classes}>{content}</div>;\n}\n\nfunction SidebarNav({ children, 'aria-label': ariaLabel = 'Main navigation', className }: SidebarNavProps) {\n const classes = [styles.nav, className].filter(Boolean).join(' ');\n return (\n <nav className={classes} aria-label={ariaLabel}>\n <ScrollArea orientation=\"vertical\" showFades className={styles.navScrollArea}>\n {children}\n </ScrollArea>\n </nav>\n );\n}\n\nfunction SidebarSection({\n children,\n label,\n action,\n collapsible: isCollapsibleProp = false,\n defaultOpen = true,\n className\n}: SidebarSectionProps) {\n const { collapsed, isMobile } = useSidebarContext();\n\n const classes = [\n styles.section,\n className\n ].filter(Boolean).join(' ');\n\n const showLabel = label && (!collapsed || isMobile);\n const showAction = action && (!collapsed || isMobile);\n const isCollapsible = isCollapsibleProp && showLabel;\n\n // Non-collapsible section\n if (!isCollapsible) {\n return (\n <div className={classes} role=\"group\" aria-label={label}>\n {(showLabel || showAction) && (\n <div className={styles.sectionHeader}>\n {showLabel && <div className={styles.sectionLabel}>{label}</div>}\n {showAction && <div className={styles.sectionActionWrapper}>{action}</div>}\n </div>\n )}\n <ul className={styles.sectionList}>\n {children}\n </ul>\n </div>\n );\n }\n\n // Collapsible section using Collapsible component\n return (\n <div className={classes} role=\"group\" aria-label={label}>\n <Collapsible defaultOpen={defaultOpen} className={styles.sectionCollapsible}>\n <div className={styles.sectionHeader}>\n <Collapsible.Trigger\n className={styles.sectionTrigger}\n chevronPosition=\"end\"\n >\n <span className={styles.sectionLabel}>{label}</span>\n </Collapsible.Trigger>\n {showAction && <div className={styles.sectionActionWrapper}>{action}</div>}\n </div>\n <Collapsible.Content className={styles.sectionContent}>\n <ul className={styles.sectionList}>\n {children}\n </ul>\n </Collapsible.Content>\n </Collapsible>\n </div>\n );\n}\n\nfunction SidebarSectionAction({\n children,\n onClick,\n 'aria-label': ariaLabel,\n className,\n}: SidebarSectionActionProps) {\n const classes = [styles.sectionAction, className].filter(Boolean).join(' ');\n\n return (\n <button\n type=\"button\"\n className={classes}\n onClick={onClick}\n aria-label={ariaLabel}\n >\n {children}\n </button>\n );\n}\n\nfunction SidebarItem({\n children,\n icon,\n active = false,\n disabled = false,\n badge,\n href,\n onClick,\n hasSubmenu = false,\n expanded: controlledExpanded,\n defaultExpanded = false,\n onExpandedChange,\n asChild = false,\n className,\n}: SidebarItemProps) {\n const { collapsed, isMobile } = useSidebarContext();\n const [expanded, setExpanded] = useControllableState(\n controlledExpanded,\n defaultExpanded,\n onExpandedChange\n );\n\n const isCollapsed = collapsed && !isMobile;\n const showLabel = !isCollapsed;\n\n const classes = [\n styles.item,\n active && styles.itemActive,\n disabled && styles.itemDisabled,\n hasSubmenu && styles.itemHasSubmenu,\n expanded && styles.itemExpanded,\n className,\n ].filter(Boolean).join(' ');\n\n const handleClick = (e: React.MouseEvent) => {\n if (disabled) {\n e.preventDefault();\n return;\n }\n if (hasSubmenu) {\n e.preventDefault();\n setExpanded(!expanded);\n }\n onClick?.();\n };\n\n // Extract text content from children for aria-label when collapsed\n // For asChild, try to extract from the child's children prop\n let labelText: string | undefined;\n if (asChild && React.isValidElement(children)) {\n const childProps = children.props as { children?: React.ReactNode };\n labelText = typeof childProps.children === 'string' ? childProps.children : undefined;\n } else {\n labelText = typeof children === 'string' ? children : undefined;\n }\n\n const itemContent = (\n <>\n {icon && <span className={styles.itemIcon}>{icon}</span>}\n {showLabel && <span className={styles.itemLabel}>{asChild && React.isValidElement(children) ? (children.props as { children?: React.ReactNode }).children : children}</span>}\n {showLabel && badge && <span className={styles.itemBadge}>{badge}</span>}\n {showLabel && hasSubmenu && (\n <span className={styles.itemChevron}>\n <ChevronRightIcon />\n </span>\n )}\n </>\n );\n\n const itemProps = {\n className: classes,\n onClick: handleClick,\n 'aria-current': active ? 'page' as const : undefined,\n 'aria-disabled': disabled || undefined,\n 'aria-expanded': hasSubmenu ? expanded : undefined,\n 'aria-label': isCollapsed ? labelText : undefined,\n tabIndex: disabled ? -1 : 0,\n };\n\n let itemElement: React.ReactElement;\n\n if (asChild && React.isValidElement(children)) {\n // Clone the child element and merge props\n itemElement = React.cloneElement(children, {\n ...itemProps,\n // Merge classNames\n className: [classes, (children.props as { className?: string }).className].filter(Boolean).join(' '),\n children: itemContent,\n } as React.HTMLAttributes<HTMLElement>);\n } else if (href) {\n itemElement = (\n <a {...itemProps} href={href}>\n {itemContent}\n </a>\n );\n } else {\n itemElement = (\n <button {...itemProps} type=\"button\">\n {itemContent}\n </button>\n );\n }\n\n // Wrap in tooltip when collapsed\n const wrappedItem = isCollapsed ? (\n <Tooltip content={labelText || children} side=\"right\" delay={100}>\n {itemElement}\n </Tooltip>\n ) : (\n itemElement\n );\n\n const wrapperClasses = [\n styles.itemWrapper,\n expanded && styles.itemExpanded,\n ].filter(Boolean).join(' ');\n\n return <li className={wrapperClasses}>{wrappedItem}</li>;\n}\n\nfunction SidebarSubItem({\n children,\n active = false,\n disabled = false,\n href,\n onClick,\n className,\n}: SidebarSubItemProps) {\n const { collapsed, isMobile } = useSidebarContext();\n\n // Don't render sub-items when collapsed (unless mobile)\n if (collapsed && !isMobile) {\n return null;\n }\n\n const classes = [\n styles.subItem,\n active && styles.subItemActive,\n disabled && styles.subItemDisabled,\n className,\n ].filter(Boolean).join(' ');\n\n const handleClick = (e: React.MouseEvent) => {\n if (disabled) {\n e.preventDefault();\n return;\n }\n onClick?.();\n };\n\n const itemProps = {\n className: classes,\n onClick: handleClick,\n 'aria-current': active ? 'page' as const : undefined,\n 'aria-disabled': disabled,\n tabIndex: disabled ? -1 : 0,\n };\n\n const itemElement = href ? (\n <a {...itemProps} href={href}>\n {children}\n </a>\n ) : (\n <button {...itemProps} type=\"button\">\n {children}\n </button>\n );\n\n return <li className={styles.subItemWrapper}>{itemElement}</li>;\n}\n\nfunction SidebarSubmenu({ children }: { children: React.ReactNode }) {\n return (\n <li className={styles.submenuWrapper}>\n <ul className={styles.submenu}>\n {children}\n </ul>\n </li>\n );\n}\n\nfunction SidebarFooter({ children, className }: SidebarFooterProps) {\n const classes = [styles.footer, className].filter(Boolean).join(' ');\n return <div className={classes}>{children}</div>;\n}\n\nfunction SidebarTrigger({ children, 'aria-label': ariaLabel = 'Toggle navigation', className }: SidebarTriggerProps) {\n const { open, setOpen, isMobile, sidebarId } = useSidebarContext();\n\n // Only render trigger on mobile\n if (!isMobile) {\n return null;\n }\n\n const classes = [styles.trigger, className].filter(Boolean).join(' ');\n\n return (\n <button\n type=\"button\"\n className={classes}\n onClick={() => setOpen(!open)}\n aria-label={ariaLabel}\n aria-expanded={open}\n aria-controls={sidebarId}\n >\n {children || (open ? <CloseIcon /> : <MenuIcon />)}\n </button>\n );\n}\n\nfunction SidebarOverlay({ className }: SidebarOverlayProps) {\n const { open, setOpen, isMobile } = useSidebarContext();\n\n // Only render overlay on mobile when open\n if (!isMobile || !open) {\n return null;\n }\n\n const classes = [styles.overlay, className].filter(Boolean).join(' ');\n\n return (\n <div\n className={classes}\n onClick={() => setOpen(false)}\n aria-hidden=\"true\"\n data-state={open ? 'open' : 'closed'}\n />\n );\n}\n\nfunction SidebarCollapseToggle({ 'aria-label': ariaLabel, className }: SidebarCollapseToggleProps) {\n const { collapsed, setCollapsed, isMobile, collapsible, hasIcons } = useSidebarContext();\n\n // Don't show on mobile or when collapsing is disabled\n if (isMobile || collapsible === 'none') {\n return null;\n }\n\n const shouldFloat = collapsed && (\n (collapsible === 'icon' && !hasIcons) ||\n collapsible === 'offcanvas'\n );\n const classes = [\n styles.collapseToggle,\n shouldFloat && styles.collapseToggleFloating,\n className,\n ].filter(Boolean).join(' ');\n const label = ariaLabel || (collapsed ? 'Expand sidebar' : 'Collapse sidebar');\n\n return (\n <button\n type=\"button\"\n className={classes}\n onClick={() => setCollapsed(!collapsed)}\n aria-label={label}\n >\n <CollapsePanelIcon />\n </button>\n );\n}\n\nfunction SidebarRail({ className }: SidebarRailProps) {\n const { collapsed, setCollapsed, isMobile, collapsible } = useSidebarContext();\n\n // Don't show on mobile or when collapsing is disabled\n if (isMobile || collapsible === 'none') {\n return null;\n }\n\n const classes = [\n styles.rail,\n collapsed && styles.railCollapsed,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <button\n type=\"button\"\n className={classes}\n onClick={() => setCollapsed(!collapsed)}\n aria-label={collapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n title={collapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n />\n );\n}\n\nfunction SidebarMenuSkeleton({\n count = 5,\n showIcon = true,\n className,\n}: SidebarMenuSkeletonProps) {\n const { collapsed, isMobile } = useSidebarContext();\n const isCollapsed = collapsed && !isMobile;\n\n const classes = [styles.menuSkeleton, className].filter(Boolean).join(' ');\n const labelWidths = ['64%', '72%', '68%', '79%', '74%', '66%', '83%', '70%'];\n\n return (\n <div className={classes} aria-hidden=\"true\">\n {Array.from({ length: count }).map((_, i) => (\n <div key={i} className={styles.skeletonItem}>\n {showIcon && <Skeleton variant=\"avatar\" size=\"sm\" />}\n {!isCollapsed && (\n <Skeleton\n variant=\"text\"\n className={styles.skeletonLabel}\n width={labelWidths[i % labelWidths.length]}\n />\n )}\n </div>\n ))}\n </div>\n );\n}\n\n// ============================================\n// Export compound component\n// ============================================\n\nexport const Sidebar = Object.assign(SidebarRoot, {\n Header: SidebarHeader,\n Nav: SidebarNav,\n Section: SidebarSection,\n SectionAction: SidebarSectionAction,\n Item: SidebarItem,\n SubItem: SidebarSubItem,\n Submenu: SidebarSubmenu,\n Footer: SidebarFooter,\n Trigger: SidebarTrigger,\n Overlay: SidebarOverlay,\n CollapseToggle: SidebarCollapseToggle,\n Rail: SidebarRail,\n MenuSkeleton: SidebarMenuSkeleton,\n});\n\n// Re-export individual components\nexport {\n SidebarProvider,\n SidebarRoot,\n SidebarHeader,\n SidebarNav,\n SidebarSection,\n SidebarSectionAction,\n SidebarItem,\n SidebarSubItem,\n SidebarSubmenu,\n SidebarFooter,\n SidebarTrigger,\n SidebarOverlay,\n SidebarCollapseToggle,\n SidebarRail,\n SidebarMenuSkeleton,\n};\n\n// Export hooks\nexport { useSidebar };\n\n// Export context hook for backwards compatibility (deprecated)\nexport { useSidebarContext };\n"],"names":["jsx","React","useKeyboardShortcut","useFocusTrap","styles","ScrollArea","jsxs","Collapsible","Fragment","Tooltip","Skeleton"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Sidebar/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Sidebar/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ import { Skeleton } from "../Skeleton/index.js";
|
|
|
6
6
|
import { Collapsible } from "../Collapsible/index.js";
|
|
7
7
|
import { ScrollArea } from "../ScrollArea/index.js";
|
|
8
8
|
import { useFocusTrap } from "../../utils/a11y.js";
|
|
9
|
+
import { useKeyboardShortcut } from "../../utils/keyboard-shortcuts.js";
|
|
9
10
|
function MenuIcon() {
|
|
10
11
|
return /* @__PURE__ */ jsx(
|
|
11
12
|
"svg",
|
|
@@ -178,17 +179,11 @@ function SidebarProvider({
|
|
|
178
179
|
setCollapsed(!collapsed);
|
|
179
180
|
}
|
|
180
181
|
}, [isMobile, open, collapsed, setOpen, setCollapsed, collapsible]);
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
toggleSidebar();
|
|
187
|
-
}
|
|
188
|
-
};
|
|
189
|
-
document.addEventListener("keydown", handleKeyDown);
|
|
190
|
-
return () => document.removeEventListener("keydown", handleKeyDown);
|
|
191
|
-
}, [enableKeyboardShortcut, toggleSidebar, collapsible]);
|
|
182
|
+
useKeyboardShortcut({
|
|
183
|
+
name: "SIDEBAR_TOGGLE",
|
|
184
|
+
handler: toggleSidebar,
|
|
185
|
+
enabled: enableKeyboardShortcut && collapsible !== "none"
|
|
186
|
+
});
|
|
192
187
|
React.useEffect(() => {
|
|
193
188
|
if (!isMobile || !open) return;
|
|
194
189
|
const handleEscape = (e) => {
|