{
  "src/AgentPatterns.tsx": "'use client';\nimport {RiGitBranchLine,RiInfinityLine,RiDownloadCloud2Line,RiGitPullRequestLine,RiShieldCheckLine,RiUserAddLine,RiMenuLine,RiPushpinLine,RiShare2Line,RiMoreFill} from '@remixicon/react';\nimport creatorArtwork from './board-native-agents/creator-artwork.json';\nimport agentSectionCopy from './board-native-agents/source-section-copy.json';\nimport {CreatorAppearance} from './CreatorAppearance.js';\nimport {CreatorAvatar} from './CreatorAvatar.js';\nimport { UIIcon, renderIcon } from './icons.js';\nimport {useDirection} from './Direction.js';\nimport {SocialBrandMark} from './BoardExtras.js';\n\n\nimport { createContext, useContext, createElement, isValidElement, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport type { ReactNode, CSSProperties } from 'react';\nimport {Popover,Dialog as AriaDialog,Menu,MenuItem} from 'react-aria-components';\nimport {Select as CreatorSelect,SelectItem as CreatorSelectItem} from './board-native/components/base/select/select.js';\nimport {Switch as CreatorSwitch} from './board-native/components/base/switch/switch.js';\nimport {SegmentedControl as CreatorSegments,SegmentedControlItem as CreatorSegment} from './board-native/components/base/segmented-control/segmented-control.js';\nimport {Dropdown,DropdownTrigger,DropdownPopover,DropdownGroup,DropdownItem} from './board-native/components/base/dropdown/dropdown.js';\nimport { motion } from 'motion/react';\nimport { useMotionPreference as useReducedMotion } from './useMotionPreference.js';\nimport { Button, Checkbox, DataState, Dialog, Input, Select, Tabs } from './components.js';\nimport { FileUpload } from './ApplicationFamilies.js';\nimport type { FamilyProps } from './family-types.js';\nimport {NativeScope} from './board-native/NativeScope.js';\nimport {AgentThinking as NativeAgentThinking} from './board-native-agents/components/application/agent-thinking/agent-thinking.js';\nimport {AuthCard as NativeAuthCard,AuthMediaCarousel as NativeAuthMediaCarousel} from './board-native-agents/components/application/auth/auth-card.js';\nimport {ComposerLoader as NativeComposerLoader} from './board-native-agents/components/application/composer-loader/composer-loader.js';\nimport {NotificationCenter as NativeNotificationCenter,type NotificationCenterItem as NativeNotificationItem} from './board-native-agents/components/application/notification-center/notification-center.js';\n\n\n\nexport type PublicAgentIcon=ReactNode|React.ComponentType<{size?:number}>;\nfunction renderAgentIcon(icon:PublicAgentIcon){return typeof icon==='function'||icon&&typeof icon==='object'&&!isValidElement(icon)&&'$$typeof'in icon?createElement(icon as React.ElementType,{size:16}):typeof icon==='string'?renderIcon(icon):icon;}\n\nexport type AgentProfile = {\n  name: string;\n  label: string;\n  description: string;\n  shape:\n    | 'cloud'\n    | 'circle'\n    | 'square'\n    | 'diamond'\n    | 'heart'\n    | 'star'\n    | 'shield'\n    | 'hexagon'\n    | 'pill' | 'petal' | 'flower' | 'slender' | 'pocket';\n  expression: 'neutral'|'happy'|'angry'|'thinking'|'shook'|'curious'|'wink'|'sleepy'|'sad'|'worried'|'skeptical'|'focused'|'excited'|'calm'|'shy'|'confused'|'surprised';\n  color: string;\n  language: string;\n  notify: boolean;\n  speed: string;\n  voice?: string;\n};\nexport const avatarExpressions:AgentProfile['expression'][]=['neutral','happy','angry','thinking','shook','curious','wink','sleepy','sad','worried','skeptical','focused','excited','calm','shy','confused'];\nexport const avatarShapes:AgentProfile['shape'][]=['petal','flower','star','heart','cloud','diamond','shield','slender','pocket'];\nexport const defaultAgent: AgentProfile = {\n  name: 'Cloud engineer',\n  label: 'Cloud',\n  description:\n    'Helps with server architecture, cloud infrastructure and practical deployment planning.',\n  shape: 'cloud',\n  expression: 'happy',\n  color: '#3392ff',\n  language: 'Auto-detect',\n  notify: true,\n  speed: '1',\n};\nexport function AgentAvatar({\n  shape = 'cloud',\n  expression = 'happy',\n  color = '#3392ff',\n  name = 'Agent',\n  animated = true,\n}: {\n  shape?: AgentProfile['shape'];\n  expression?: AgentProfile['expression'];\n  color?: string;\n  name?: string;\n  animated?: boolean;\n}) {\n  const reduce = useReducedMotion();\n  return (\n    <motion.div\n      className={`hp-avatar hp-avatar-${shape}`}\n      style={{ '--agent-color': color } as React.CSSProperties}\n      role=\"img\"\n      aria-label={`${name}, ${expression} ${shape} avatar`}\n      animate={animated && !reduce ? { y: [0, -4, 0], rotate: [-2, 2, -2] } : { y: 0, rotate: 0 }}\n      transition={{ duration: 4.5, repeat: animated && !reduce ? Infinity : 0, ease: 'easeInOut' }}\n    >\n      <span className={`hp-face hp-face-${expression}`} aria-hidden=\"true\">\n        <i />\n        <i />\n        <b />\n      </span>\n    </motion.div>\n  );\n}\nconst creatorSwatchGradients=[\"radial-gradient(circle closest-side, rgb(67, 126, 247) 0%, rgb(0, 77, 233) 100%)\",\"radial-gradient(circle closest-side, rgb(39, 181, 162) 0%, rgb(0, 149, 124) 100%)\",\"radial-gradient(circle closest-side, rgb(133, 84, 246) 0%, rgb(62, 0, 205) 100%)\",\"radial-gradient(circle closest-side, rgb(227, 71, 152) 0%, rgb(211, 0, 109) 100%)\",\"radial-gradient(circle closest-side, rgb(231, 66, 65) 0%, rgb(207, 1, 0) 100%)\",\"radial-gradient(circle closest-side, rgb(244, 115, 39) 0%, rgb(216, 63, 0) 100%)\",\"radial-gradient(circle closest-side, rgb(27, 180, 206) 0%, rgb(0, 147, 173) 100%)\",\"radial-gradient(circle closest-side, rgb(136, 200, 28) 0%, rgb(106, 164, 0) 100%)\",\"radial-gradient(circle closest-side, rgb(54, 193, 92) 0%, rgb(0, 159, 19) 100%)\"];\nfunction creatorColorHsv(hex:string){\n const rgb=(/^#[0-9a-f]{6}$/i.test(hex)?hex:'#f0af93').slice(1).match(/../g)!.map(x=>parseInt(x,16)/255),max=Math.max(...rgb),min=Math.min(...rgb),d=max-min;\n const hue=!d?0:((max===rgb[0]?(rgb[1]-rgb[2])/d+(rgb[1]<rgb[2]?6:0):max===rgb[1]?(rgb[2]-rgb[0])/d+2:(rgb[0]-rgb[1])/d+4)*60);\n return {h:hue,s:max?d/max*100:0,v:max*100};\n}\nfunction creatorHsvHex(h:number,s:number,v:number){const chroma=v/100*s/100,x=chroma*(1-Math.abs((h/60)%2-1)),m=v/100-chroma,rgb=h<60?[chroma,x,0]:h<120?[x,chroma,0]:h<180?[0,chroma,x]:h<240?[0,x,chroma]:h<300?[x,0,chroma]:[chroma,0,x];return '#'+rgb.map(c=>Math.round((c+m)*255).toString(16).padStart(2,'0')).join('');}\n/** The native browser color dialog cannot reproduce the in-editor saturation/hue controls. */\nexport function SourceColorPicker({value,disabled=false,onChange,label='Custom color',normalizeAvatar=false}:{value:string;disabled?:boolean;onChange:(value:string)=>void;label?:string;normalizeAvatar?:boolean}){\n const[open,setOpen]=useState(false),[draft,setDraft]=useState(''),trigger=useRef<HTMLButtonElement>(null),display=normalizeAvatar&&value.toLowerCase()==='#f8b193'?'#f0af93':value,hsv=creatorColorHsv(display);\n useEffect(()=>setDraft(display),[display]);useEffect(()=>{if(disabled)setOpen(false)},[disabled]);\n const changeOpen=(next:boolean)=>{setOpen(next);if(!next)requestAnimationFrame(()=>trigger.current?.focus())};\n const change=(patch:Partial<typeof hsv>)=>{const next={...hsv,...patch};onChange(creatorHsvHex(next.h,next.s,next.v))};\n const point=(event:React.PointerEvent<HTMLDivElement>,area:boolean)=>{if(disabled)return;const box=event.currentTarget.getBoundingClientRect(),x=Math.max(0,Math.min(1,(event.clientX-box.left)/box.width)),y=Math.max(0,Math.min(1,(event.clientY-box.top)/box.height));change(area?{s:x*100,v:(1-y)*100}:{h:x*360})};\n const keyboard=(event:React.KeyboardEvent<HTMLDivElement>,area:boolean)=>{const step=event.shiftKey?10:1;let patch:Partial<typeof hsv>|undefined;if(area){if(event.key==='ArrowRight')patch={s:Math.min(100,hsv.s+step)};if(event.key==='ArrowLeft')patch={s:Math.max(0,hsv.s-step)};if(event.key==='ArrowUp')patch={v:Math.min(100,hsv.v+step)};if(event.key==='ArrowDown')patch={v:Math.max(0,hsv.v-step)};if(event.key==='Home')patch={s:0,v:100};if(event.key==='End')patch={s:100,v:0};}else{if(event.key==='ArrowRight'||event.key==='ArrowUp')patch={h:Math.min(360,hsv.h+step)};if(event.key==='ArrowLeft'||event.key==='ArrowDown')patch={h:Math.max(0,hsv.h-step)};if(event.key==='Home')patch={h:0};if(event.key==='End')patch={h:360};}if(patch){event.preventDefault();change(patch)}};\n return <><button ref={trigger} type=\"button\" disabled={disabled} className=\"hp-avatar-custom-color\" aria-label={label} aria-haspopup=\"dialog\" aria-expanded={open} onClick={()=>changeOpen(!open)}><span aria-hidden=\"true\" className=\"hp-creator-rainbow-art\"/></button><Popover triggerRef={trigger} isOpen={open} onOpenChange={changeOpen} placement=\"bottom end\" offset={10} className=\"hp-creator-color-popover\"><NativeScope><AriaDialog aria-label={label} className=\"hp-creator-color-dialog\"><div className=\"hp-creator-color-area\" role=\"slider\" tabIndex={0} aria-label=\"Saturation and brightness\" aria-valuemin={0} aria-valuemax={100} aria-valuenow={Math.round(hsv.v)} aria-valuetext={`saturation ${Math.round(hsv.s)}%, brightness ${Math.round(hsv.v)}%`} style={{background:`linear-gradient(to top,#000,transparent),linear-gradient(to right,#fff,${creatorHsvHex(hsv.h,100,100)})`}} onKeyDown={e=>keyboard(e,true)} onPointerDown={e=>{e.currentTarget.setPointerCapture(e.pointerId);point(e,true)}} onPointerMove={e=>{if(e.currentTarget.hasPointerCapture(e.pointerId))point(e,true)}}><span style={{left:`${hsv.s}%`,top:`${100-hsv.v}%`,background:display}}/></div><div className=\"hp-creator-color-hue\" role=\"slider\" tabIndex={0} aria-label=\"Hue\" aria-valuemin={0} aria-valuemax={360} aria-valuenow={Math.round(hsv.h)} onKeyDown={e=>keyboard(e,false)} onPointerDown={e=>{e.currentTarget.setPointerCapture(e.pointerId);point(e,false)}} onPointerMove={e=>{if(e.currentTarget.hasPointerCapture(e.pointerId))point(e,false)}}><span style={{left:`${hsv.h/3.6}%`,background:creatorHsvHex(hsv.h,100,100)}}/></div><div className=\"hp-creator-color-value\"><span aria-hidden=\"true\" style={{background:display}}><i className=\"hp-creator-gloss-body\"/><i className=\"hp-creator-gloss-top\"/><i className=\"hp-creator-gloss-point\"/><i className=\"hp-creator-gloss-base\"/></span><input aria-label=\"Hex color\" dir=\"ltr\" spellCheck={false} value={draft} onChange={e=>{const next=e.target.value;setDraft(next);if(/^#[0-9a-f]{6}$/i.test(next))onChange(next)}} onBlur={()=>setDraft(display)} onKeyDown={e=>{if(e.key==='Enter'){e.preventDefault();if(/^#[0-9a-f]{6}$/i.test(draft))changeOpen(false)}}}/></div></AriaDialog></NativeScope></Popover></>;\n}\nexport function AgentCreator({\n  agent,\n  onChange,\n  disabled = false,onClose,renderAvatar,renderShape,presentation='interactive',\n}: {\n  agent?: AgentProfile;\n  onChange?: (agent: AgentProfile) => void;\n  disabled?: boolean;onClose?:()=>void;presentation?:'interactive'|'source';\n  renderAvatar?:(profile:Pick<AgentProfile,'shape'|'expression'|'color'|'name'>&{animated?:boolean})=>ReactNode;\n  renderShape?:(shape:AgentProfile['shape'],color:string)=>ReactNode;\n}) {\n  const {direction}=useDirection();\n  const [local, setLocal] = useState(defaultAgent),\n    [status, setStatus] = useState(''),\n    [voices,setVoices]=useState<SpeechSynthesisVoice[]>([]),\n    current = agent ?? local;\n  const preferredVoice=voices.find(voice=>voice.name==='Alice')||voices.find(voice=>voice.default)||voices[0];\n  const voiceKey=current.voice??preferredVoice?.voiceURI??'system';\n  const sourceVoices=voices.filter(voice=>/^en(?:-|$)/i.test(voice.lang)).slice(0,12);\n  for(const voice of voices.filter(voice=>voice.name==='Alice'||voice.voiceURI===voiceKey)){\n    if(!sourceVoices.some(item=>item.voiceURI===voice.voiceURI))sourceVoices.push(voice);\n  }\n  useEffect(()=>{if(typeof speechSynthesis==='undefined')return;const refresh=()=>setVoices(speechSynthesis.getVoices());refresh();speechSynthesis.addEventListener('voiceschanged',refresh);return()=>speechSynthesis.removeEventListener('voiceschanged',refresh)},[]);\n  const update = (patch: Partial<AgentProfile>) => {\n    const next = { ...current, ...patch };\n    setLocal(next);\n    onChange?.(next);\n    setStatus('Agent preferences updated locally.');\n  };\n  useEffect(\n    () => () => {\n      if (typeof speechSynthesis !== 'undefined') speechSynthesis.cancel();\n    },\n    [],\n  );\n  return (\n    <section className=\"hp-agent-creator\" style={presentation==='source'?{'--agent-color':current.color}as React.CSSProperties:undefined}>\n      <div className=\"hp-agent-editor-heading\"><h3>{current.name || 'Untitled agent'}</h3>{onClose&&<Button variant=\"tertiary\" size=\"sm\" iconOnly leadingIcon={<UIIcon name=\"close\"/>} aria-label=\"Close agent editor\" onClick={onClose}><UIIcon name=\"close\"/></Button>}</div>\n      {presentation==='source'&&renderAvatar&&renderShape?<CreatorAppearance profile={current} disabled={disabled} renderAvatar={renderAvatar} renderShape={renderShape} direction={direction} onChange={update}/>:<>\n      <div className=\"hp-avatar-stage\">\n        {renderAvatar?renderAvatar(current):<AgentAvatar {...current} name={current.name} />}\n        <div className=\"hp-expression-orbit\" role=\"group\" aria-label=\"Avatar expression\">\n          {avatarExpressions.map((expression,index)=><button key={expression} type=\"button\" disabled={disabled} aria-label={expression} aria-pressed={current.expression===expression} style={{'--orbit-angle':`${index*360/avatarExpressions.length-90}deg`} as React.CSSProperties} onClick={()=>update({expression})}>{renderAvatar?renderAvatar({shape:current.shape,expression,color:current.color,name:expression,animated:false}):<AgentAvatar shape={current.shape} expression={expression} color={current.color} name={expression} animated={false}/>}</button>)}\n        </div>\n      </div>\n      <div className=\"hp-shape-picker\" role=\"group\" aria-label=\"Avatar shape\" onKeyDown={event=>{if(!renderShape||disabled||!['ArrowLeft','ArrowRight','Home','End'].includes(event.key))return;event.preventDefault();const index=avatarShapes.indexOf(current.shape),step=event.key==='ArrowLeft'?(direction==='rtl'?1:-1):(direction==='rtl'?-1:1),next=event.key==='Home'?0:event.key==='End'?avatarShapes.length-1:(index+step+avatarShapes.length)%avatarShapes.length;update({shape:avatarShapes[next]});const node=event.currentTarget;requestAnimationFrame(()=>node.querySelectorAll<HTMLButtonElement>('button')[next]?.focus())}} onPointerDown={event=>{if(renderShape)event.currentTarget.dataset.dragStart=String(event.clientX)}} onPointerUp={event=>{if(!renderShape||disabled)return;const shift=event.clientX-Number(event.currentTarget.dataset.dragStart||event.clientX);if(Math.abs(shift)>24){const next=(avatarShapes.indexOf(current.shape)+(shift<0?1:-1)+avatarShapes.length)%avatarShapes.length;update({shape:avatarShapes[next]})}}}>\n        {avatarShapes.map((shape,index) => (\n          <button\n            type=\"button\"\n            key={shape}\n            disabled={disabled}\n            aria-label={`${shape} shape`}\n            data-shape-offset={(index-avatarShapes.indexOf(current.shape)+13)%9-4}\n            tabIndex={renderShape?(shape===current.shape?0:-1):undefined}\n            aria-pressed={shape === current.shape}\n            onClick={() => update({ shape })}\n          >\n            {renderShape?renderShape(shape,current.color):<span\n              className={`hp-shape-swatch hp-shape-${shape}`}\n              style={{ backgroundColor: current.color }}\n            />}\n          </button>\n        ))}\n      </div>\n      </>}\n      <div className=\"hp-colors\" role=\"group\" aria-label=\"Agent color\">\n        {(presentation==='source'?['#8eb0f6','#a4dfe0','#b194f0','#ef95cf','#f29292','#f8c48b','#92ddf2','#d3ee96','#a3e1bd']:['#3392ff', '#00CED1', '#7847EB', '#DD3992', '#E5484D', '#EF962D', '#06B6D4', '#A3E635', '#24A46D']).map(\n          (color,index) => (\n            <button\n              type=\"button\"\n              key={color}\n              disabled={disabled}\n              aria-label={presentation==='source'?`${['Blue','Teal','Violet','Pink','Red','Orange','Cyan','Lime','Green'][index]} avatar`:`Agent color ${color}`}\n              aria-pressed={color === current.color}\n              style={{ background: presentation==='source'?creatorSwatchGradients[index]:color }}\n              onClick={() => update({ color })}\n            >{presentation==='source'&&<><span aria-hidden=\"true\" className=\"hp-creator-gloss-body\"/><span aria-hidden=\"true\" className=\"hp-creator-gloss-top\"/><span aria-hidden=\"true\" className=\"hp-creator-gloss-point\"/><span aria-hidden=\"true\" className=\"hp-creator-gloss-base\"/></>}</button>\n          ),\n        )}\n        {presentation==='source'?<SourceColorPicker value={current.color} disabled={disabled} onChange={color=>update({color})} label=\"Custom avatar color\" normalizeAvatar/>:<label className=\"hp-avatar-custom-color\"><input aria-label=\"Custom avatar color\" type=\"color\" value={current.color} disabled={disabled} onChange={event=>update({color:event.target.value})}/><span aria-hidden=\"true\">✣</span></label>}\n      </div>\n      <Input\n        label={presentation==='source'?'Name':'Agent name'}\n        maxLength={presentation==='source'?48:undefined}\n        value={current.name}\n        disabled={disabled}\n        onChange={(event) => update({ name: event.target.value })}\n      />\n      <Input\n        label={presentation==='source'?'Label':'Agent label'}\n        maxLength={presentation==='source'?60:undefined}\n        value={current.label}\n        disabled={disabled}\n        onChange={(event) => update({ label: event.target.value })}\n      />\n      <label className=\"hp-textarea-label\">\n        {presentation==='source'?'Description':'Agent description'}\n        <textarea\n          value={current.description}\n          maxLength={presentation==='source'?500:undefined}\n          disabled={disabled}\n          onChange={(event) => update({ description: event.target.value })}\n          rows={3}\n        />\n      </label>\n      {presentation==='source'?<div className=\"hp-creator-preferences\"><div className=\"hp-creator-language-notifications\"><div className=\"hp-creator-language\"><span><UIIcon name=\"globe\"/>Language</span><CreatorSelect size=\"sm\" aria-label=\"Agent language\" selectedKey={current.language} isDisabled={disabled} onSelectionChange={key=>update({language:String(key)})}>{['Auto-detect','English','Turkish','Spanish','French','German','Japanese','Portuguese','Hindi','Tamil','Kannada','Marathi'].map(language=><CreatorSelectItem key={language} id={language} textValue={language}>{language}</CreatorSelectItem>)}</CreatorSelect></div><div className=\"hp-creator-notifications\"><UIIcon name=\"notification\"/><div><span>Notifications</span><p>Show a notice when a reply is ready.</p></div><CreatorSwitch size=\"sm\" aria-label=\"Notify when this agent finishes\" isSelected={current.notify} isDisabled={disabled} onChange={notify=>update({notify})}/></div></div><div className=\"hp-creator-voice-card\"><div className=\"hp-creator-voice-heading\"><span><UIIcon name=\"microphone\"/>Voice</span><div><Button variant=\"tertiary\" size=\"sm\" iconOnly leadingIcon={<UIIcon name=\"play\"/>} aria-label=\"Preview voice\" disabled={disabled||current.voice==='off'} onClick={() => {\n            if (typeof speechSynthesis === 'undefined') {\n              setStatus('Voice preview is not available in this browser.');\n              return;\n            }\n            speechSynthesis.cancel();\n            const utterance = new SpeechSynthesisUtterance(\n              `Hello, I am ${current.name}. I can help with your next project.`,\n            );\n            utterance.rate = Number(current.speed);\n            const selectedVoice=voiceKey==='system'?undefined:voices.find(voice=>voice.voiceURI===voiceKey);if(selectedVoice)utterance.voice=selectedVoice;\n            utterance.lang = selectedVoice?.lang || ({Hindi:'hi-IN',Tamil:'ta-IN',Kannada:'kn-IN',Marathi:'mr-IN',English:'en-IN'} as Record<string,string>)[current.language] || navigator.language;\n            utterance.onend = () => setStatus('Voice preview finished.');\n            utterance.onerror = () =>\n              setStatus('Voice preview could not play. Try another browser voice.');\n            speechSynthesis.speak(utterance);\n            setStatus('Playing this browser’s local voice preview.');\n          }}/><CreatorSelect size=\"sm\" aria-label=\"Agent voice\" className=\"hp-creator-voice-select\" selectedKey={voiceKey} isDisabled={disabled} onSelectionChange={key=>update({voice:String(key)})} renderValue={voiceKey==='off'?'Off':voiceKey==='system'?'System voice':voices.find(voice=>voice.voiceURI===voiceKey)?.name||voiceKey}><CreatorSelectItem id=\"off\" textValue=\"Off\">Off</CreatorSelectItem><CreatorSelectItem id=\"system\" textValue=\"System voice\">System voice</CreatorSelectItem>{sourceVoices.map(voice=><CreatorSelectItem key={voice.voiceURI} id={voice.voiceURI} textValue={voice.name}>{voice.name}</CreatorSelectItem>)}</CreatorSelect></div></div><div className=\"hp-creator-speed\"><span>Playback speed</span><CreatorSegments aria-label=\"Playback speed\" selectedKeys={[current.speed]} isDisabled={disabled} onSelectionChange={keys=>{const speed=[...keys][0];if(speed!==undefined)update({speed:String(speed)})}}>{['0.75','1','1.25','1.5'].map(speed=><CreatorSegment key={speed} id={speed}>{speed}×</CreatorSegment>)}</CreatorSegments></div></div></div>:<>      <Select\n        label=\"Language\"\n        value={current.language}\n        disabled={disabled}\n        onChange={(event) => update({ language: event.target.value })}\n        options={['Auto-detect', 'English', 'Hindi', 'Tamil', 'Kannada', 'Marathi'].map(\n          (value) => ({ value, label: value }),\n        )}\n      />\n      <Checkbox\n        label=\"Notify when this agent finishes\"\n        checked={current.notify}\n        disabled={disabled}\n        onChange={(event) => update({ notify: event.target.checked })}\n      />\n      <Select label=\"Voice\" value={current.voice??'system'} disabled={disabled} onChange={event=>update({voice:event.target.value})} options={[{value:'system',label:'System voice'},...voices.map(voice=>({value:voice.voiceURI,label:`${voice.name} · ${voice.lang}`}))]}/>\n      <div className=\"hp-voice\">\n        <Select\n          label=\"Playback speed\"\n          value={current.speed}\n          disabled={disabled}\n          onChange={(event) => update({ speed: event.target.value })}\n          options={['0.75', '1', '1.25', '1.5'].map((value) => ({ value, label: value + '×' }))}\n        />\n        <Button\n          variant=\"secondary\"\n          disabled={disabled}\n          onClick={() => {\n            if (typeof speechSynthesis === 'undefined') {\n              setStatus('Voice preview is not available in this browser.');\n              return;\n            }\n            speechSynthesis.cancel();\n            const utterance = new SpeechSynthesisUtterance(\n              `Hello, I am ${current.name}. I can help with your next project.`,\n            );\n            utterance.rate = Number(current.speed);\n            const selectedVoice=current.voice&&current.voice!=='system'?voices.find(voice=>voice.voiceURI===current.voice):(voices.find(voice=>voice.name==='Alice')||voices.find(voice=>voice.default)||voices[0]);if(selectedVoice)utterance.voice=selectedVoice;\n            utterance.lang = selectedVoice?.lang || ({Hindi:'hi-IN',Tamil:'ta-IN',Kannada:'kn-IN',Marathi:'mr-IN',English:'en-IN'} as Record<string,string>)[current.language] || navigator.language;\n            utterance.onend = () => setStatus('Voice preview finished.');\n            utterance.onerror = () =>\n              setStatus('Voice preview could not play. Try another browser voice.');\n            speechSynthesis.speak(utterance);\n            setStatus('Playing this browser’s local voice preview.');\n          }}\n        >\n          Preview voice\n        </Button>\n      </div>\n</>}\n      <p className=\"hp-note\">\n        Preferences stay in this local preview. No agent or voice service is connected.\n      </p>\n      <p className=\"hp-status\" role=\"status\">\n        {status}\n      </p>\n    </section>\n  );\n}\n\nexport type ContextSegment = { label: string; tokens: number; color: string; deferred?: boolean };\nconst defaultSegments: ContextSegment[] = [\n  { label: 'Messages', tokens: 520000, color: '#328BFF' },\n  { label: 'System tools', tokens: 96000, color: '#B477FF' },\n  { label: 'MCP tools', tokens: 68000, color: '#EF65BF' },\n  { label: 'Skills', tokens: 54000, color: '#EAB308' },\n  { label: 'System prompt', tokens: 42000, color: '#00B884' },\n  { label: 'Memory files', tokens: 24000, color: '#06B6D4' },\n  { label: 'Custom agents', tokens: 16000, color: '#14B8A6' },\n  { label: 'MCP tools (deferred)', tokens: 69900, color: '#A3A3A3', deferred: true },\n];\nconst compact = (value: number) =>\n  new Intl.NumberFormat('en-US', { notation: 'compact', maximumFractionDigits: 1 }).format(value);\nexport function AgentLimitsCard({\n  segments = defaultSegments,\n  max = 1000000,\n  disabled = false,\n  defaultExpanded = false,\n  expanded:controlledExpanded,\n  onExpandedChange,\n  plan='Example plan',\n  planHref,\n  groups=[{label:'Tool context groups',items:[{label:'Browser',tokens:54200},{label:'Design tools',tokens:48100},{label:'Project files',tokens:35600}]}],\n  limits=[{label:'5-hour limit',value:38,reset:'Resets in 2 hr 46 min'},{label:'Weekly · all models',value:3,reset:'Resets Tue 3:00 PM'},{label:'Weekly · Pro',value:5,reset:'Resets Tue 3:00 PM'}],\n}: {\n  segments?: ContextSegment[];\n  max?: number;\n  disabled?: boolean;\n  defaultExpanded?: boolean;\n  expanded?:boolean;\n  onExpandedChange?:(expanded:boolean)=>void;\n  plan?:string;\n  planHref?:string;\n  groups?:{label:string;items:{label:string;tokens:number}[]}[];\n  limits?:{label:string;value:number;reset:string}[];\n}) {\n  const [localExpanded, setExpanded] = useState(defaultExpanded),\n    [extra, setExtra] = useState(0);\n  const expanded=controlledExpanded??localExpanded;\n  const safeMax = Math.max(1, max),\n    active = segments.filter((segment) => !segment.deferred),\n    base = active.reduce((total, segment) => total + segment.tokens, 0),\n    used = Math.min(safeMax, base + extra),\n    percent = Math.round((used / safeMax) * 100);\n  return (\n    <section className=\"hp-limits\">\n      <button\n        type=\"button\"\n        className=\"hp-limits-heading\"\n        disabled={disabled}\n        aria-expanded={expanded}\n        onClick={() => {setExpanded(!expanded);onExpandedChange?.(!expanded)}}\n      >\n        <span>Context window</span>\n        <strong>\n          {compact(used)} / {compact(safeMax)} ({percent}%)\n        </strong>\n        <span aria-hidden=\"true\">{expanded ? <UIIcon name=\"chevron-up\" /> : <UIIcon name=\"chevron-down\" />}</span>\n      </button>\n      <div\n        className=\"hp-context-bar\"\n        role=\"meter\"\n        aria-label=\"Context usage\"\n        aria-valuenow={used}\n        aria-valuemin={0}\n        aria-valuemax={safeMax}\n      >\n        {active.map((segment, index) => (\n          <span\n            key={segment.label}\n            style={{\n              width: `${((segment.tokens + (index === 0 ? extra : 0)) / safeMax) * 100}%`,\n              backgroundColor: segment.color,\n            }}\n          />\n        ))}\n        {active.length===0&&extra>0&&<span style={{width:`${(used/safeMax)*100}%`,backgroundColor:'var(--hu-brand)'}}/>}\n      </div>\n      {expanded && (\n        <div className=\"hp-context-breakdown\">\n          {segments.map((segment, index) => (\n            <div key={segment.label}>\n              <i style={{ background: segment.color }} />\n              <span>{segment.label}</span>\n              <strong>{compact(segment.tokens + (index === 0 ? extra : 0))}</strong>\n              <small>\n                {segment.deferred\n                  ? 'Deferred'\n                  : (((segment.tokens + (index === 0 ? extra : 0)) / safeMax) * 100).toFixed(1) +\n                    '%'}\n              </small>\n            </div>\n          ))}\n          {active.length===0&&extra>0&&<div><i style={{background:'var(--hu-brand)'}}/><span>Simulated context</span><strong>{compact(used)}</strong><small>{percent}%</small></div>}\n          <div>\n            <i />\n            <span>Free space</span>\n            <strong>{compact(Math.max(0, safeMax - used))}</strong>\n            <small>{100 - percent}%</small>\n          </div>\n          {groups.map(group=><details key={group.label}><summary>{group.label}</summary><ul>{group.items.map(item=><li key={item.label}>{item.label} · {compact(item.tokens)} tokens</li>)}</ul></details>)}\n        </div>\n      )}\n      <div className=\"hp-usage-limits\">\n        <h4>Plan usage limits · {plan}{planHref&&<a href={planHref} aria-label=\"Manage plan\" aria-disabled={disabled||undefined} tabIndex={disabled?-1:undefined} onClick={event=>{if(disabled)event.preventDefault()}}><UIIcon name=\"arrow-right\"/></a>}</h4>\n        {limits.map((limit) => (\n          <div key={limit.label}>\n            <div>\n              <strong>{limit.label}</strong>\n              <span>{limit.reset}</span>\n              <b>{limit.value}%</b>\n            </div>\n            <progress max={100} value={limit.value} aria-label={limit.label} />\n          </div>\n        ))}\n      </div>\n      <label className=\"hp-range-label\">\n        Simulated added context: {compact(extra)}\n        <input\n          type=\"range\"\n          min={0}\n          max={Math.max(0, safeMax - base)}\n          step={1000}\n          value={extra}\n          disabled={disabled}\n          onChange={(event) => setExtra(Number(event.target.value))}\n        />\n      </label>\n      <p className=\"hp-note\">Illustrative usage only. This does not read your account limits.</p>\n    </section>\n  );\n}\n\nexport type AgentStep = { id: string; label: string; detail?: string };\nconst defaultSteps: AgentStep[] = [\n  { id: 'plan', label: 'Understand the request', detail: 'Reviewing the example brief' },\n  { id: 'source', label: 'Inspect project context', detail: 'Reading local fixture files' },\n  { id: 'build', label: 'Build the component', detail: 'Composing reusable UI primitives' },\n  { id: 'check', label: 'Verify the result', detail: 'Checking states and keyboard behavior' },\n];\nexport function AgentProgress({\n  steps: suppliedSteps = defaultSteps,\n  disabled = false,\n  onComplete,\n  stepDuration=2400,\n  completionDelay=1000,\n  onFinished,\n  autoRun=false,\n  suspended=false,\n  presentation='interactive',\n}: {\n  presentation?:'interactive'|'source';\n  steps?: (AgentStep|string)[];\n  disabled?: boolean;\n  onComplete?: () => void;\n  stepDuration?:number;completionDelay?:number;onFinished?:()=>void;autoRun?:boolean;suspended?:boolean;\n}) {\n  const steps=useMemo(()=>suppliedSteps.map((step,index)=>typeof step==='string'?{id:`step-${index}`,label:step}:step),[suppliedSteps]);\n  const completion = useRef(onComplete),finishedCallback=useRef(onFinished),didFinish=useRef(false),stepBudget=useRef({index:0,remaining:Math.max(100,stepDuration)});finishedCallback.current=onFinished;\n  completion.current = onComplete;\n  const [index, setIndex] = useState(0),\n    [running, setRunning] = useState(autoRun),\n    [elapsed,setElapsed]=useState(0),\n    [collapsed,setCollapsed]=useState(false),\n    complete = index >= steps.length;\n  useEffect(() => {\n    if (!running || complete || disabled || suspended) return;\n    if(stepBudget.current.index!==index)stepBudget.current={index,remaining:Math.max(100,stepDuration)};const started=performance.now(),budget=stepBudget.current.remaining;\n    const timer = setTimeout(() => {setIndex((current) => current + 1);setElapsed(value=>value+Math.max(100,stepDuration))},budget);\n    return () => {clearTimeout(timer);stepBudget.current.remaining=Math.max(0,budget-(performance.now()-started))};\n  }, [running, index, complete,stepDuration,disabled,suspended]);\n  useEffect(() => {\n    if (complete && steps.length>0) {\n      setRunning(false);\n      completion.current?.();\n    }\n  }, [complete]);\n  useEffect(()=>{if(!complete||!steps.length){didFinish.current=false;return;}if(suspended||didFinish.current)return;const timer=setTimeout(()=>{didFinish.current=true;finishedCallback.current?.()},Math.max(0,completionDelay));return()=>clearTimeout(timer)},[complete,completionDelay,suspended]);\n  return (\n    <section className=\"hp-agent-progress\" data-presentation={presentation} data-running={running&&!complete&&!disabled&&!suspended} style={{'--step-duration':`${Math.max(100,stepDuration)}ms`} as React.CSSProperties}>\n      <header>\n        <button className=\"hp-progress-disclosure\" type=\"button\" disabled={disabled} aria-expanded={!collapsed} onClick={()=>setCollapsed(!collapsed)}><strong>{!steps.length?'No task steps yet':complete ? 'Example task complete' : presentation==='source'?`${steps.length-index} ${steps.length-index===1?'step':'steps'} left`:'Preparing your interface'}</strong><span aria-hidden=\"true\">{presentation==='source'?<UIIcon name={collapsed?'plus':'minus'}/>:collapsed ? <UIIcon name=\"chevron-down\" /> : <UIIcon name=\"chevron-up\" />}</span></button>\n        <span>\n          {Math.min(index, steps.length)} / {steps.length} · {(elapsed/1000).toFixed(1)}s\n        </span>\n      </header>\n      <progress className={presentation==='source'?'hu-sr-only':undefined} max={Math.max(1, steps.length)} value={Math.min(index,steps.length)} aria-label=\"Agent task progress\" />\n      <ol data-collapsed={collapsed} aria-hidden={collapsed}>\n        {steps.map((step, stepIndex) => (\n          <li\n            key={step.id}\n            aria-current={stepIndex === index ? 'step' : undefined}\n            data-complete={stepIndex < index}\n          >\n            <span aria-hidden=\"true\">\n              {stepIndex < index ? '✓' : stepIndex === index ? '◌' : '○'}\n            </span>\n            <div>\n              <strong>{step.label}</strong>\n              <small>{step.detail}</small>\n            </div>\n          </li>\n        ))}\n      </ol>\n      <div className=\"hu-actions\">\n        <Button\n          variant=\"secondary\"\n          disabled={disabled||!steps.length}\n          onClick={() => {\n            stepBudget.current={index:0,remaining:Math.max(100,stepDuration)};setIndex(0);setElapsed(0);\n            setRunning(false);\n          }}\n        >\n          Reset\n        </Button>\n        <Button\n          variant=\"secondary\"\n          disabled={disabled || complete || suspended}\n          onClick={() => setRunning(!running)}\n        >\n          {running&&!complete&&!suspended ? 'Pause' : 'Run example'}\n        </Button>\n        <Button disabled={disabled || complete || suspended} onClick={() => setIndex(index + 1)}>\n          Next step\n        </Button>\n      </div>\n      <p className=\"hp-status\" role=\"status\">\n        {!steps.length?'Add steps to start a local progress example.':complete\n          ? 'All local example steps completed.'\n          : suspended\n            ? 'Paused after a local example error. Retry to continue.'\n          : running\n            ? 'Playing a timed local simulation.'\n            : 'Paused local example. Advance manually or run the sequence.'}\n      </p>\n    </section>\n  );\n}\n\nexport function AgentThinking({\n  label = 'Thinking',\n  disabled = false,\n  defaultVariant = 'wave',\n  showTimer=true,\n  shimmer=true,\n  tone,active:controlledActive,onActiveChange,\n}: {\n  active?:boolean;onActiveChange?:(active:boolean)=>void;\n  label?: string;\n  disabled?: boolean;\n  defaultVariant?: 'wave' | 'spin' | 'stars' | 'infinity';\n  showTimer?:boolean;shimmer?:boolean;tone?:'accent'|'subtle';\n}) {\n  const [variant, setVariant] = useState(defaultVariant),\n    [localActive, setLocalActive] = useState(true),\n    [seconds, setSeconds] = useState(0),\n    reduce = useReducedMotion(),active=controlledActive??localActive;\n  const setActive=(next:boolean)=>{setLocalActive(next);onActiveChange?.(next)};\n  useEffect(() => {\n    if (!active) return;\n    const timer = setInterval(() => setSeconds((value) => value + 1), 1000);\n    return () => clearInterval(timer);\n  }, [active]);\n  return (\n    <section className=\"hp-thinking-example\">\n      <div className=\"hp-thinking-conversation\"><p className=\"hp-user-bubble\">Redesign the pricing page and improve the call to action copy.</p>\n      <div className={`hp-thinking hp-thinking-${variant}`} data-active={active} data-shimmer={shimmer&&!reduce&&active} data-tone={tone??(variant==='stars'?'subtle':'accent')} role=\"status\">\n        <div className=\"hp-thinking-symbol\" aria-hidden=\"true\">\n          {variant === 'infinity' ? (\n            <svg viewBox=\"0 0 60 30\" aria-hidden=\"true\"><path className=\"hp-infinity-track\" d=\"M30 15C8-12 0 8 5 18C12 38 42-8 53 8C69 32 45 40 30 15Z\"/><path className={active&&!reduce?'hp-infinity-trace hp-infinity-running':'hp-infinity-trace'} d=\"M30 15C8-12 0 8 5 18C12 38 42-8 53 8C69 32 45 40 30 15Z\"/></svg>\n          ) : (\n            Array.from({ length: variant === 'stars' ? 5 : 9 }, (_, index) => (\n              <motion.i\n                key={index}\n                initial={false}\n                animate={\n                  active && !reduce\n                    ? variant === 'spin'\n                      ? { opacity: index===4?.2:[.15,1,.15] }\n                      : { y: [0, -5, 0], opacity: [0.35, 1, 0.35] }\n                    : { y: 0, opacity: 1 }\n                }\n                transition={{\n                  duration: variant === 'spin' ? 2 : 1.2,\n                  repeat: active && !reduce ? Infinity : 0,\n                  delay: variant==='wave'?((index%3)+Math.floor(index/3))*.12:variant==='spin'?Math.max(0,[0,1,2,5,8,7,6,3].indexOf(index))*.16:index*.15,\n                }}\n              >\n                {variant === 'stars' ? '✦' : null}\n              </motion.i>\n            ))\n          )}\n        </div>\n        <strong>\n          {label}\n          {active ? '…' : ' paused'}\n        </strong>\n        <span aria-live=\"off\" hidden={!showTimer}>{seconds}s</span>\n      </div>\n      <Composer disabled={disabled} working={active} onStop={()=>setActive(false)} onSend={()=>setActive(true)}/></div>\n      <div className=\"hp-thinking-controls\" role=\"group\" aria-label=\"Thinking animation style\">\n        {(['wave', 'spin', 'stars', 'infinity'] as const).map((value) => (\n          <Button\n            key={value}\n            variant=\"secondary\"\n            size=\"sm\"\n            disabled={disabled}\n            aria-pressed={variant === value}\n            onClick={() => setVariant(value)}\n          >\n            {value}\n          </Button>\n        ))}\n      </div>\n      <Button variant=\"tertiary\" disabled={disabled} onClick={() => setActive(!active)}>\n        {active ? 'Pause motion' : 'Resume motion'}\n      </Button>\n      <p className=\"hp-note\">Local animation example. Reduced-motion preferences are respected.</p>\n    </section>\n  );\n}\n\nexport type AuthCardSubmission =\n  | { mode: 'signin' | 'signup'; email: string; name: string; password: string; remember: boolean }\n  | { mode: 'verify'; code: string };\nexport function AuthCard({\n  mode = 'signin',\n  disabled:givenDisabled = false,loading=false,\n  onSubmit,\n  layout='stacked',\n  providers=['Google','Apple','GitHub'],\n  media,\n  logo,\n  centered=false,\n  title,description,footnote,\n  email:initialEmail='',\n  codeLength=6,\n  onComplete,onProvider,\n  confirmPassword=true,\n}: {\n  mode?: 'signin' | 'signup' | 'verify';\n  disabled?: boolean;loading?:boolean;\n  onSubmit?: (values: AuthCardSubmission) => void;\n  layout?:'stacked'|'inline'|'grid';providers?:string[];media?:ReactNode;logo?:ReactNode;centered?:boolean;title?:string;description?:string;footnote?:ReactNode;email?:string;codeLength?:number;onComplete?:(code:string)=>void;onProvider?:(provider:string)=>void|Promise<void>;confirmPassword?:boolean;\n}) {\n  const disabled=givenDisabled||loading;\n  const safeCodeLength=Number.isFinite(codeLength)?Math.min(10,Math.max(4,Math.trunc(codeLength))):6;\n  const [tab, setTab] = useState(mode),\n    [name, setName] = useState(''),\n    [email, setEmail] = useState(initialEmail),\n    [password, setPassword] = useState(''),\n    [confirm, setConfirm] = useState(''),\n    [remember, setRemember] = useState(true),\n    [code, setCode] = useState(''),\n    [error, setError] = useState(''),\n    [status, setStatus] = useState(''),\n    [resetOpen,setResetOpen]=useState(false),\n    [resetMessage,setResetMessage]=useState('');\n  const clearFeedback=()=>{setError('');setStatus('');setResetMessage('')};\n  const submit = () => {\n    clearFeedback();\n    if (tab === 'verify') {\n      if (!new RegExp(`^\\\\d{${safeCodeLength}}$`).test(code)) {\n        setError(`Enter the ${safeCodeLength}-digit example code.`);\n        return;\n      }\n      setStatus('Example code format verified. No account was authenticated.');\n      setError('');\n      onSubmit?.({ mode: 'verify', code });\n      return;\n    }\n    if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) {\n      setError('Enter a valid email address.');\n      return;\n    }\n    if (password.length < 8) {\n      setError('Use at least eight password characters.');\n      return;\n    }\n    if (tab === 'signup' && confirmPassword && password !== confirm) {\n      setError('Passwords must match.');\n      return;\n    }\n    setError('');\n    setStatus(\n      tab === 'signup'\n        ? 'Sign-up values validated locally. No account was created.'\n        : 'Sign-in values validated locally. No authentication request was sent.',\n    );\n    onSubmit?.({ mode: tab, email, name, password, remember });\n  };\n  const formContent = (\n    <>\n      {' '}\n      <h3>\n        {title || (tab === 'signin'\n          ? 'Welcome back'\n          : tab === 'signup'\n            ? 'Create an account'\n            : 'Check your email')}\n      </h3>\n      <p>\n        {description || (tab === 'verify'\n          ? `Enter a ${safeCodeLength}-digit example code${email?` for ${email}`:''} to try the verification layout.`\n          : 'Use fictional values to explore this local form.')}\n      </p>\n      <form\n        noValidate\n        onSubmit={(event) => {\n          event.preventDefault();\n          submit();\n        }}\n      >\n        {tab === 'verify' ? (\n          <Input\n            label=\"Verification code\"\n            inputMode=\"numeric\"\n            autoComplete=\"one-time-code\"\n            value={code}\n            maxLength={safeCodeLength}\n            disabled={disabled}\n            onChange={event=>{const next=event.target.value.replace(/\\D/g,'').slice(0,safeCodeLength);clearFeedback();setCode(next);if(next.length===safeCodeLength)onComplete?.(next)}}\n          />\n        ) : (\n          <>\n            {tab === 'signup' && (\n              <Input\n                label=\"Full name\"\n                value={name}\n                disabled={disabled}\n                onChange={(event) => {clearFeedback();setName(event.target.value)}}\n              />\n            )}\n            <Input\n              label=\"Email address\"\n              type=\"email\"\n              autoComplete=\"email\"\n              value={email}\n              disabled={disabled}\n              onChange={(event) => {clearFeedback();setEmail(event.target.value)}}\n            />\n            <Input\n              label=\"Password\"\n              type=\"password\"\n              autoComplete={tab === 'signup' ? 'new-password' : 'current-password'}\n              value={password}\n              disabled={disabled}\n              onChange={(event) => {clearFeedback();setPassword(event.target.value)}}\n            />\n            {tab === 'signup' && confirmPassword ? (\n              <Input\n                label=\"Confirm password\"\n                type=\"password\"\n                autoComplete=\"new-password\"\n                value={confirm}\n                disabled={disabled}\n                onChange={(event) => {clearFeedback();setConfirm(event.target.value)}}\n              />\n            ) : (\n              tab==='signin'?<div className=\"hp-auth-options\"><Checkbox label=\"Remember me\" checked={remember} disabled={disabled} onChange={event=>{clearFeedback();setRemember(event.target.checked)}}/><Button variant=\"link-color\" size=\"sm\" disabled={disabled} onClick={()=>{setResetMessage('');setResetOpen(true)}}>Forgot password?</Button></div>:null\n            )}\n          </>\n        )}\n        {error && (\n          <p role=\"alert\" className=\"hp-error\">\n            {error}\n          </p>\n        )}\n        <Button type=\"submit\" loading={loading} disabled={disabled}>\n          {tab === 'verify'\n            ? 'Verify example'\n            : tab === 'signup'\n              ? 'Create example account'\n              : 'Sign in to example'}\n        </Button>\n      </form>\n      <div className=\"hp-auth-providers\">\n        <span>or continue with</span>\n        <div>\n          {providers.filter(provider=>provider.trim()).map((provider) => (\n            <Button\n              key={provider}\n              variant=\"secondary\"\n              disabled={disabled}\n              aria-label={`Continue with ${provider[0].toUpperCase()+provider.slice(1)}`}\n              onClick={async()=>{clearFeedback();if(!onProvider){setStatus(`${provider} is a layout preview. No identity provider is configured.`);return;}try{await onProvider(provider);setStatus(`${provider} sign-in was requested through your application callback.`)}catch{setStatus(`${provider} could not start. Try again.`)}}}\n            >\n              <span className={`hp-provider-mark hp-provider-${provider.toLowerCase()}`} aria-hidden=\"true\"><SocialBrandMark provider={provider} size={16}/></span><span className=\"hp-provider-name\">Continue with {provider[0].toUpperCase()+provider.slice(1)}</span>\n            </Button>\n          ))}\n        </div>\n      </div>\n      <p className=\"hp-status\" role=\"status\">{status}</p>\n      <Dialog open={resetOpen} onOpenChange={setResetOpen} title=\"Reset your password\" description=\"Explore the recovery form with a fictional email address. No email will be sent.\" footer={<Button disabled={disabled} onClick={()=>setResetMessage(/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)?'Recovery email format validated locally. Connect your authentication service to send a reset link.':'Enter a valid email address.')}>Validate recovery email</Button>}><Input label=\"Recovery email address\" type=\"email\" value={email} disabled={disabled} onChange={event=>{clearFeedback();setEmail(event.target.value)}}/><p role=\"status\">{resetMessage}</p></Dialog>\n    </>\n  );\n  return (\n    <section className={`hp-auth-card${media?' hp-auth-split':''}${centered?' hp-auth-centered':''}`} data-layout={layout}>\n      {media&&<aside className=\"hp-auth-media\">{media}</aside>}\n      <div className=\"hp-auth-main\">\n      {logo!==null&&<div className=\"hp-auth-brand\">{logo??<><UIIcon name=\"grid\" /><strong>Helios UI</strong></>}</div>}\n      <Tabs\n        label=\"Authentication example\"\n        value={tab}\n        onValueChange={(value) => {\n          setTab(value as typeof tab);\n          clearFeedback();\n        }}\n        items={[\n          {\n            id: 'signin',\n            label: 'Sign in',\n            content: tab === 'signin' ? formContent : null,\n            disabled,\n          },\n          {\n            id: 'signup',\n            label: 'Sign up',\n            content: tab === 'signup' ? formContent : null,\n            disabled,\n          },\n          {\n            id: 'verify',\n            label: 'Verify',\n            content: tab === 'verify' ? formContent : null,\n            disabled,\n          },\n        ]}\n      />\n      {footnote&&<p className=\"hp-auth-footnote\">{footnote}</p>}\n      </div>\n    </section>\n  );\n}\n\nexport type AuthMediaSlide={src?:string;alt?:string;title?:string;color?:string};\nexport function AuthMediaCarousel({slides=[{title:'Build with clarity',color:'#00CED1'},{title:'Make it yours',color:'#7847EB'},{title:'Bring ideas to life',color:'#DD3992'},{title:'A system that grows',color:'#24A46D'}],interval=4000,disabled=false}:{slides?:AuthMediaSlide[];interval?:number;disabled?:boolean}){\n  const [index,setIndex]=useState(0),[paused,setPaused]=useState(false),reduce=useReducedMotion();\n  useEffect(()=>{if(paused||reduce!==false||disabled||slides.length<2)return;const timer=setInterval(()=>setIndex(current=>(current+1)%slides.length),Math.max(800,interval));return()=>clearInterval(timer)},[paused,reduce,disabled,slides.length,interval]);\n  const current=slides[index%Math.max(1,slides.length)];if(!current)return <div className=\"hp-auth-art\" role=\"status\">No artwork slides were supplied.</div>;\n  return <section className=\"hp-auth-carousel\" aria-label=\"Authentication artwork\" onKeyDown={event=>{if(disabled)return;if(event.key==='ArrowRight'){event.preventDefault();setIndex((index+1)%slides.length)}if(event.key==='ArrowLeft'){event.preventDefault();setIndex((index-1+slides.length)%slides.length)}}}><div className=\"hp-auth-art\" key={index} style={{'--art-color':current.color||'var(--hu-brand)'} as React.CSSProperties}>{current.src?<img src={current.src} alt={current.alt||''}/>:<div className=\"hp-auth-art-shapes\" aria-hidden=\"true\"><i/><i/><i/></div>}{current.title&&<h3>{current.title}</h3>}</div><footer><button type=\"button\" disabled={disabled} aria-label=\"Previous artwork\" onClick={()=>setIndex((index-1+slides.length)%slides.length)}><UIIcon name=\"chevron-left\" /></button><span>{index+1} / {slides.length}</span><button type=\"button\" disabled={disabled} aria-label=\"Next artwork\" onClick={()=>setIndex((index+1)%slides.length)}><UIIcon name=\"chevron-right\" /></button><button type=\"button\" disabled={disabled} onClick={()=>setPaused(!paused)}>{paused?'Play artwork':'Pause artwork'}</button></footer></section>;\n}\n\nexport type ComposerAttachmentKind='image'|'document'|'spreadsheet'|'presentation'|'code'|'video';\nexport type ComposerAttachment={id:string;name:string;kind:ComposerAttachmentKind;src?:string;progress?:number;file?:File};\nexport function ComposerAttachmentTile({attachment,onRemove,disabled=false}:{attachment:ComposerAttachment;onRemove?:()=>void;disabled?:boolean}){\n const progress=attachment.progress,preparing=progress!==undefined&&progress<100;\n return <figure className=\"hp-attachment-tile\" data-kind={attachment.kind} data-preparing={preparing} aria-label={`${attachment.name}${preparing?`, ${Math.round(progress)}% prepared locally`:''}`}>\n  {attachment.kind==='image'&&attachment.src?<img src={attachment.src} alt={`Preview of ${attachment.name}`}/>:<span className=\"hp-document-icon\" aria-hidden=\"true\">{({document:'W',spreadsheet:'X',presentation:'P',code:'</>',video:'▶',image:'▧'} as const)[attachment.kind]}</span>}\n  <svg viewBox=\"0 0 60 60\" className=\"hp-file-progress\" aria-hidden=\"true\"><rect x=\"2\" y=\"2\" width=\"56\" height=\"56\" rx=\"10\" pathLength=\"100\" strokeDasharray={`${Math.min(100,Math.max(0,progress??100))} 100`}/></svg>\n  {preparing&&<span className=\"hp-file-percent\">{Math.round(progress)}%</span>}<button type=\"button\" disabled={disabled||!onRemove} aria-label={`Remove ${attachment.name}`} onClick={onRemove}><UIIcon name=\"close\" /></button>\n  <figcaption title={attachment.name}>{attachment.name}</figcaption>\n </figure>;\n}\nexport function ComposerAttachmentStrip({attachments,onRemove,disabled=false}:{attachments:ComposerAttachment[];onRemove?:(id:string)=>void;disabled?:boolean}){return <div className=\"hp-attachment-strip hp-attachment-previews\" aria-label=\"Attachments\">{attachments.map(attachment=><ComposerAttachmentTile key={attachment.id} attachment={attachment} onRemove={onRemove?()=>onRemove(attachment.id):undefined} disabled={disabled}/>)}</div>}\nfunction ComposerPopover({label,trigger,disabled=false,children}:{label:string;trigger:ReactNode;disabled?:boolean;children:(close:()=>void)=>ReactNode}){\n const {direction,locale}=useDirection();const [open,setOpen]=useState(false),anchor=useRef<HTMLSpanElement>(null);\n useEffect(()=>{if(disabled)setOpen(false)},[disabled]);\n return <span className=\"hp-picker-trigger\" ref={anchor}><Button variant=\"tertiary\" size=\"sm\" disabled={disabled} aria-label={label} aria-haspopup=\"dialog\" aria-expanded={open} onClick={()=>setOpen(!open)}>{trigger}</Button><Popover dir={direction} lang={locale} triggerRef={anchor} isOpen={open} onOpenChange={setOpen} placement=\"top start\" className=\"hp-composer-popover\"><AriaDialog aria-label={label}>{children(()=>setOpen(false))}</AriaDialog></Popover></span>;\n}\nexport const COMPOSER_PERMISSIONS=[{value:'Auto',description:'Follow the application’s configured permission rules.'},{value:'Manual',description:'Ask before each action in the application.'},{value:'Plan mode',description:'Prepare a plan before requesting any action.'},{value:'Bypass all',description:'Local UI preference only; service authorization still applies.'}];\nexport function ComposerPermissionPicker({value,onChange,disabled=false,learnMoreHref,onLearnMore}:{value:string;onChange:(value:string)=>void;disabled?:boolean;learnMoreHref?:string;onLearnMore?:()=>void}){\n const name=useId();return <ComposerPopover label=\"Permission\" trigger={<>{value==='Bypass all'&&<RiShieldCheckLine className=\"hp-source-permission-shield\" aria-hidden=\"true\"/>}{value}<UIIcon name=\"chevron-down\" /></>} disabled={disabled}>{close=><div className=\"hp-permission-picker\"><header><h4>Permission</h4>{onLearnMore?<Button variant=\"link-color\" size=\"sm\" onClick={()=>{close();onLearnMore()}}>Learn more</Button>:learnMoreHref&&/^(https?:\\/\\/|\\/(?!\\/)|#)/.test(learnMoreHref)?<a href={learnMoreHref} target=\"_blank\" rel=\"noreferrer\">Learn more</a>:null}</header><div role=\"radiogroup\" aria-label=\"Permission mode\">{COMPOSER_PERMISSIONS.map(item=><label key={item.value}><input type=\"radio\" name={name} checked={item.value===value} onChange={()=>{onChange(item.value);close()}}/><span><strong>{item.value}</strong><small>{item.description}</small></span></label>)}</div><details><summary>Learn about permissions</summary><p>These controls choose application preferences. They do not grant access, approve a tool, or change service authorization in this local example.</p></details></div>}</ComposerPopover>;\n}\nexport type ComposerModelProvider={id:string;name:string;models:{id:string;name:string}[]};\n/** Provider/model labels observed in BoardUI’s public picker on26October2026. UI fixtures, not an availability or connection claim. */\nexport const COMPOSER_MODEL_PROVIDERS:ComposerModelProvider[]=[{\"id\": \"helios\", \"name\": \"Helios\", \"models\": [{\"id\": \"Helios Fast\", \"name\": \"Helios Fast\"}, {\"id\": \"Helios Balanced\", \"name\": \"Helios Balanced\"}, {\"id\": \"Helios Deep\", \"name\": \"Helios Deep\"}]}, {\"id\": \"openai\", \"name\": \"OpenAI\", \"models\": [{\"id\": \"openai/gpt-5.6-mini\", \"name\": \"GPT-5.6 Mini\"}, {\"id\": \"openai/gpt-5.6-terra\", \"name\": \"GPT-5.6 Terra\"}, {\"id\": \"openai/gpt-5.6-sol\", \"name\": \"GPT-5.6 Sol\"}, {\"id\": \"openai/gpt-5.5\", \"name\": \"GPT-5.5\"}, {\"id\": \"openai/gpt-5.5-mini\", \"name\": \"GPT-5.5 Mini\"}, {\"id\": \"openai/gpt-5.4\", \"name\": \"GPT-5.4\"}, {\"id\": \"openai/gpt-5.4-mini\", \"name\": \"GPT-5.4 Mini\"}, {\"id\": \"openai/gpt-5.4-nano\", \"name\": \"GPT-5.4 Nano\"}, {\"id\": \"openai/o5\", \"name\": \"o5\"}, {\"id\": \"openai/o5-mini\", \"name\": \"o5 Mini\"}, {\"id\": \"openai/gpt-oss-120b\", \"name\": \"GPT-OSS 120B\"}, {\"id\": \"openai/gpt-oss-20b\", \"name\": \"GPT-OSS 20B\"}]}, {\"id\": \"anthropic\", \"name\": \"Anthropic\", \"models\": [{\"id\": \"anthropic/fable-5.1\", \"name\": \"Fable 5.1\"}, {\"id\": \"anthropic/fable-5\", \"name\": \"Fable 5\"}, {\"id\": \"anthropic/opus-5\", \"name\": \"Opus 5\"}, {\"id\": \"anthropic/sonnet-5\", \"name\": \"Sonnet 5\"}, {\"id\": \"anthropic/haiku-4.5\", \"name\": \"Haiku 4.5\"}, {\"id\": \"anthropic/opus-4.1\", \"name\": \"Opus 4.1\"}, {\"id\": \"anthropic/sonnet-4.5\", \"name\": \"Sonnet 4.5\"}, {\"id\": \"anthropic/opus-4\", \"name\": \"Opus 4\"}, {\"id\": \"anthropic/sonnet-4\", \"name\": \"Sonnet 4\"}, {\"id\": \"anthropic/haiku-3.5\", \"name\": \"Haiku 3.5\"}]}, {\"id\": \"perplexity\", \"name\": \"Perplexity\", \"models\": [{\"id\": \"perplexity/sonar-pro\", \"name\": \"Sonar Pro\"}, {\"id\": \"perplexity/sonar-reasoning-pro\", \"name\": \"Sonar Reasoning Pro\"}, {\"id\": \"perplexity/sonar-reasoning\", \"name\": \"Sonar Reasoning\"}, {\"id\": \"perplexity/sonar-deep-research\", \"name\": \"Sonar Deep Research\"}, {\"id\": \"perplexity/sonar\", \"name\": \"Sonar\"}, {\"id\": \"perplexity/r1-1776\", \"name\": \"R1 1776\"}, {\"id\": \"perplexity/sonar-large\", \"name\": \"Sonar Large\"}, {\"id\": \"perplexity/sonar-small\", \"name\": \"Sonar Small\"}]}, {\"id\": \"cursor\", \"name\": \"Cursor\", \"models\": [{\"id\": \"cursor/composer-2.5\", \"name\": \"Composer 2.5\"}, {\"id\": \"cursor/composer-2\", \"name\": \"Composer 2\"}, {\"id\": \"cursor/composer-1.5\", \"name\": \"Composer 1.5\"}, {\"id\": \"cursor/composer-1\", \"name\": \"Composer 1\"}, {\"id\": \"cursor/tab-3\", \"name\": \"Tab 3\"}, {\"id\": \"cursor/tab-2\", \"name\": \"Tab 2\"}, {\"id\": \"cursor/apply-2\", \"name\": \"Apply 2\"}, {\"id\": \"cursor/fast-apply\", \"name\": \"Fast Apply\"}]}, {\"id\": \"openrouter\", \"name\": \"OpenRouter\", \"models\": [{\"id\": \"openrouter/auto-router\", \"name\": \"Auto Router\"}, {\"id\": \"openrouter/llama-4-maverick\", \"name\": \"Llama 4 Maverick\"}, {\"id\": \"openrouter/llama-4-scout\", \"name\": \"Llama 4 Scout\"}, {\"id\": \"openrouter/qwen-3.5-coder\", \"name\": \"Qwen 3.5 Coder\"}, {\"id\": \"openrouter/kimi-k2.5\", \"name\": \"Kimi K2.5\"}, {\"id\": \"openrouter/glm-5\", \"name\": \"GLM 5\"}, {\"id\": \"openrouter/deepseek-v4\", \"name\": \"DeepSeek V4\"}, {\"id\": \"openrouter/mistral-large-3\", \"name\": \"Mistral Large 3\"}, {\"id\": \"openrouter/hermes-4\", \"name\": \"Hermes 4\"}, {\"id\": \"openrouter/nemotron-ultra\", \"name\": \"Nemotron Ultra\"}]}, {\"id\": \"deepseek\", \"name\": \"DeepSeek\", \"models\": [{\"id\": \"deepseek/deepseek-v4\", \"name\": \"DeepSeek V4\"}, {\"id\": \"deepseek/deepseek-r2\", \"name\": \"DeepSeek R2\"}, {\"id\": \"deepseek/deepseek-v3.2\", \"name\": \"DeepSeek V3.2\"}, {\"id\": \"deepseek/deepseek-v3.1\", \"name\": \"DeepSeek V3.1\"}, {\"id\": \"deepseek/deepseek-r1\", \"name\": \"DeepSeek R1\"}, {\"id\": \"deepseek/deepseek-v3\", \"name\": \"DeepSeek V3\"}, {\"id\": \"deepseek/deepseek-coder-v3\", \"name\": \"DeepSeek Coder V3\"}, {\"id\": \"deepseek/deepseek-prover-v2\", \"name\": \"DeepSeek Prover V2\"}, {\"id\": \"deepseek/janus-pro\", \"name\": \"Janus Pro\"}]}, {\"id\": \"jina\", \"name\": \"Jina\", \"models\": [{\"id\": \"jina/embeddings-v4\", \"name\": \"Embeddings v4\"}, {\"id\": \"jina/embeddings-v3\", \"name\": \"Embeddings v3\"}, {\"id\": \"jina/reranker-v3\", \"name\": \"Reranker v3\"}, {\"id\": \"jina/reranker-v2\", \"name\": \"Reranker v2\"}, {\"id\": \"jina/clip-v2\", \"name\": \"CLIP v2\"}, {\"id\": \"jina/readerlm-v2\", \"name\": \"ReaderLM v2\"}, {\"id\": \"jina/colbert-v2\", \"name\": \"ColBERT v2\"}, {\"id\": \"jina/segmenter\", \"name\": \"Segmenter\"}, {\"id\": \"jina/classifier\", \"name\": \"Classifier\"}]}, {\"id\": \"ollama\", \"name\": \"Ollama\", \"models\": [{\"id\": \"ollama/llama-4-scout\", \"name\": \"Llama 4 Scout\"}, {\"id\": \"ollama/gemma-4\", \"name\": \"Gemma 4\"}, {\"id\": \"ollama/qwen-3.5\", \"name\": \"Qwen 3.5\"}, {\"id\": \"ollama/qwen-3.5-coder\", \"name\": \"Qwen 3.5 Coder\"}, {\"id\": \"ollama/phi-5\", \"name\": \"Phi 5\"}, {\"id\": \"ollama/mistral-small-4\", \"name\": \"Mistral Small 4\"}, {\"id\": \"ollama/deepseek-r2\", \"name\": \"DeepSeek R2\"}, {\"id\": \"ollama/gpt-oss-20b\", \"name\": \"GPT-OSS 20B\"}, {\"id\": \"ollama/llama-3.3\", \"name\": \"Llama 3.3\"}, {\"id\": \"ollama/nomic-embed-v2\", \"name\": \"Nomic Embed v2\"}]}, {\"id\": \"google\", \"name\": \"Google\", \"models\": [{\"id\": \"google/gemini-3.5-pro\", \"name\": \"Gemini 3.5 Pro\"}, {\"id\": \"google/gemini-3.5-flash\", \"name\": \"Gemini 3.5 Flash\"}, {\"id\": \"google/gemini-3.5-flash-lite\", \"name\": \"Gemini 3.5 Flash Lite\"}, {\"id\": \"google/gemini-3-pro\", \"name\": \"Gemini 3 Pro\"}, {\"id\": \"google/gemini-3-flash\", \"name\": \"Gemini 3 Flash\"}, {\"id\": \"google/gemini-3-flash-lite\", \"name\": \"Gemini 3 Flash Lite\"}, {\"id\": \"google/gemma-4\", \"name\": \"Gemma 4\"}, {\"id\": \"google/gemma-4-nano\", \"name\": \"Gemma 4 Nano\"}, {\"id\": \"google/imagen-5\", \"name\": \"Imagen 5\"}, {\"id\": \"google/veo-4\", \"name\": \"Veo 4\"}]}, {\"id\": \"meta\", \"name\": \"Meta\", \"models\": [{\"id\": \"meta/llama-5\", \"name\": \"Llama 5\"}, {\"id\": \"meta/llama-4-behemoth\", \"name\": \"Llama 4 Behemoth\"}, {\"id\": \"meta/llama-4-maverick\", \"name\": \"Llama 4 Maverick\"}, {\"id\": \"meta/llama-4-scout\", \"name\": \"Llama 4 Scout\"}, {\"id\": \"meta/llama-3.3-70b\", \"name\": \"Llama 3.3 70B\"}, {\"id\": \"meta/llama-3.2-vision\", \"name\": \"Llama 3.2 Vision\"}, {\"id\": \"meta/llama-3.2-3b\", \"name\": \"Llama 3.2 3B\"}, {\"id\": \"meta/code-llama-2\", \"name\": \"Code Llama 2\"}, {\"id\": \"meta/llama-guard-4\", \"name\": \"Llama Guard 4\"}]}, {\"id\": \"mistral\", \"name\": \"Mistral\", \"models\": [{\"id\": \"mistral/mistral-large-3\", \"name\": \"Mistral Large 3\"}, {\"id\": \"mistral/mistral-medium-3.5\", \"name\": \"Mistral Medium 3.5\"}, {\"id\": \"mistral/magistral-medium\", \"name\": \"Magistral Medium\"}, {\"id\": \"mistral/magistral-small\", \"name\": \"Magistral Small\"}, {\"id\": \"mistral/codestral-2\", \"name\": \"Codestral 2\"}, {\"id\": \"mistral/devstral-2\", \"name\": \"Devstral 2\"}, {\"id\": \"mistral/mistral-small-4\", \"name\": \"Mistral Small 4\"}, {\"id\": \"mistral/ministral-8b\", \"name\": \"Ministral 8B\"}, {\"id\": \"mistral/pixtral-large\", \"name\": \"Pixtral Large\"}, {\"id\": \"mistral/mistral-ocr\", \"name\": \"Mistral OCR\"}]}, {\"id\": \"xai\", \"name\": \"xAI\", \"models\": [{\"id\": \"xai/grok-5\", \"name\": \"Grok 5\"}, {\"id\": \"xai/grok-4.2\", \"name\": \"Grok 4.2\"}, {\"id\": \"xai/grok-4.1\", \"name\": \"Grok 4.1\"}, {\"id\": \"xai/grok-4-fast\", \"name\": \"Grok 4 Fast\"}, {\"id\": \"xai/grok-4-heavy\", \"name\": \"Grok 4 Heavy\"}, {\"id\": \"xai/grok-4\", \"name\": \"Grok 4\"}, {\"id\": \"xai/grok-code-fast\", \"name\": \"Grok Code Fast\"}, {\"id\": \"xai/grok-3\", \"name\": \"Grok 3\"}, {\"id\": \"xai/grok-3-mini\", \"name\": \"Grok 3 Mini\"}]}, {\"id\": \"qwen\", \"name\": \"Qwen\", \"models\": [{\"id\": \"qwen/qwen-3.5-max\", \"name\": \"Qwen 3.5 Max\"}, {\"id\": \"qwen/qwen-3.5-plus\", \"name\": \"Qwen 3.5 Plus\"}, {\"id\": \"qwen/qwen-3.5-flash\", \"name\": \"Qwen 3.5 Flash\"}, {\"id\": \"qwen/qwen-3.5-coder\", \"name\": \"Qwen 3.5 Coder\"}, {\"id\": \"qwen/qwen-3.5-vl\", \"name\": \"Qwen 3.5 VL\"}, {\"id\": \"qwen/qwen-3-235b\", \"name\": \"Qwen 3 235B\"}, {\"id\": \"qwen/qwen-3-32b\", \"name\": \"Qwen 3 32B\"}, {\"id\": \"qwen/qwen-3-omni\", \"name\": \"Qwen 3 Omni\"}, {\"id\": \"qwen/qwq-32b\", \"name\": \"QwQ 32B\"}]}, {\"id\": \"groq\", \"name\": \"Groq\", \"models\": [{\"id\": \"groq/llama-4-scout\", \"name\": \"Llama 4 Scout\"}, {\"id\": \"groq/llama-4-maverick\", \"name\": \"Llama 4 Maverick\"}, {\"id\": \"groq/kimi-k2\", \"name\": \"Kimi K2\"}, {\"id\": \"groq/gpt-oss-120b\", \"name\": \"GPT-OSS 120B\"}, {\"id\": \"groq/gpt-oss-20b\", \"name\": \"GPT-OSS 20B\"}, {\"id\": \"groq/qwen-3-32b\", \"name\": \"Qwen 3 32B\"}, {\"id\": \"groq/llama-3.3-70b\", \"name\": \"Llama 3.3 70B\"}, {\"id\": \"groq/llama-3.1-8b\", \"name\": \"Llama 3.1 8B\"}, {\"id\": \"groq/gemma-2-9b\", \"name\": \"Gemma 2 9B\"}]}, {\"id\": \"cohere\", \"name\": \"Cohere\", \"models\": [{\"id\": \"cohere/command-a\", \"name\": \"Command A\"}, {\"id\": \"cohere/command-a-reasoning\", \"name\": \"Command A Reasoning\"}, {\"id\": \"cohere/command-a-vision\", \"name\": \"Command A Vision\"}, {\"id\": \"cohere/command-r+\", \"name\": \"Command R+\"}, {\"id\": \"cohere/command-r\", \"name\": \"Command R\"}, {\"id\": \"cohere/command-r7b\", \"name\": \"Command R7B\"}, {\"id\": \"cohere/embed-v4\", \"name\": \"Embed v4\"}, {\"id\": \"cohere/rerank-v3.5\", \"name\": \"Rerank v3.5\"}, {\"id\": \"cohere/aya-expanse-32b\", \"name\": \"Aya Expanse 32B\"}]}, {\"id\": \"moonshot\", \"name\": \"Moonshot\", \"models\": [{\"id\": \"moonshot/kimi-k2.5\", \"name\": \"Kimi K2.5\"}, {\"id\": \"moonshot/kimi-k2-thinking\", \"name\": \"Kimi K2 Thinking\"}, {\"id\": \"moonshot/kimi-k2\", \"name\": \"Kimi K2\"}, {\"id\": \"moonshot/kimi-k1.5\", \"name\": \"Kimi K1.5\"}, {\"id\": \"moonshot/kimi-vl\", \"name\": \"Kimi VL\"}, {\"id\": \"moonshot/kimi-dev-72b\", \"name\": \"Kimi Dev 72B\"}, {\"id\": \"moonshot/moonshot-v1-128k\", \"name\": \"Moonshot v1 128K\"}, {\"id\": \"moonshot/moonshot-v1-32k\", \"name\": \"Moonshot v1 32K\"}]}, {\"id\": \"zhipu\", \"name\": \"Zhipu\", \"models\": [{\"id\": \"zhipu/glm-5\", \"name\": \"GLM 5\"}, {\"id\": \"zhipu/glm-4.6\", \"name\": \"GLM 4.6\"}, {\"id\": \"zhipu/glm-4.5\", \"name\": \"GLM 4.5\"}, {\"id\": \"zhipu/glm-4.5-air\", \"name\": \"GLM 4.5 Air\"}, {\"id\": \"zhipu/glm-4.5v\", \"name\": \"GLM 4.5V\"}, {\"id\": \"zhipu/glm-4-plus\", \"name\": \"GLM 4 Plus\"}, {\"id\": \"zhipu/glm-4-flash\", \"name\": \"GLM 4 Flash\"}, {\"id\": \"zhipu/cogview-4\", \"name\": \"CogView 4\"}, {\"id\": \"zhipu/codegeex-4\", \"name\": \"CodeGeeX 4\"}]}, {\"id\": \"amazon\", \"name\": \"Amazon\", \"models\": [{\"id\": \"amazon/nova-premier\", \"name\": \"Nova Premier\"}, {\"id\": \"amazon/nova-pro\", \"name\": \"Nova Pro\"}, {\"id\": \"amazon/nova-lite\", \"name\": \"Nova Lite\"}, {\"id\": \"amazon/nova-micro\", \"name\": \"Nova Micro\"}, {\"id\": \"amazon/nova-canvas\", \"name\": \"Nova Canvas\"}, {\"id\": \"amazon/nova-reel\", \"name\": \"Nova Reel\"}, {\"id\": \"amazon/nova-sonic\", \"name\": \"Nova Sonic\"}, {\"id\": \"amazon/titan-text-premier\", \"name\": \"Titan Text Premier\"}, {\"id\": \"amazon/titan-embed-v2\", \"name\": \"Titan Embed v2\"}]}];\nexport function ComposerModelPicker({value,onChange,effort:controlledEffort,onEffortChange,providers=COMPOSER_MODEL_PROVIDERS,disabled=false}:{value:string;onChange:(value:string)=>void;effort?:number;onEffortChange?:(value:number)=>void;providers?:ComposerModelProvider[];disabled?:boolean}){\n const {direction,locale}=useDirection();const [localEffort,setLocalEffort]=useState(1),effort=controlledEffort??localEffort,initial=providers.find(p=>p.models.some(m=>m.id===value)),[providerId,setProviderId]=useState(initial?.id||providers[0]?.id||''),[query,setQuery]=useState(''),[effortOpen,setEffortOpen]=useState(false),search=useRef<HTMLInputElement>(null),effortAnchor=useRef<HTMLSpanElement>(null),name=useId();\n const provider=providers.find(p=>p.id===providerId)||providers[0]||{id:'empty',name:'No providers',models:[]},current=providers.flatMap(p=>p.models).find(m=>m.id===value),efforts=['Low','Medium','High','XHigh','Max','Ultra'],matches=query.trim()?providers.flatMap(p=>p.models.filter(m=>(m.name+' '+p.name).toLowerCase().includes(query.toLowerCase())).map(model=>({provider:p,model}))):provider.models.map(model=>({provider,model}));\n const changeEffort=(next:number)=>{setLocalEffort(next);onEffortChange?.(next)};useEffect(()=>{if(disabled)setEffortOpen(false)},[disabled]);\n return <ComposerPopover label=\"Model\" trigger={<>{current?.name||value}<UIIcon name=\"chevron-down\"/></>} disabled={disabled}>{close=><div className=\"hp-model-picker\" onKeyDown={event=>{if(event.key==='/'&&!(event.target as HTMLElement).matches('input:not([type=radio]),textarea')){event.preventDefault();event.stopPropagation();search.current?.focus()}}}><header><h4>Models</h4><Button variant=\"tertiary\" size=\"sm\" aria-keyshortcuts=\"/\" onClick={()=>search.current?.focus()}>Quick Search models</Button><p>Illustrative reference catalog · no model service connected</p></header><div className=\"hp-model-body\"><div role=\"tablist\" aria-label=\"Model providers\" aria-orientation=\"vertical\" className=\"hp-provider-rail\">{providers.map((item,index)=><button key={item.id} type=\"button\" role=\"tab\" id={`${name}-${item.id}`} aria-controls={`${name}-models`} aria-selected={item.id===provider.id} tabIndex={item.id===provider.id?0:-1} onClick={()=>setProviderId(item.id)} onKeyDown={event=>{if(!['ArrowDown','ArrowUp','Home','End'].includes(event.key))return;event.preventDefault();const next=event.key==='Home'?0:event.key==='End'?providers.length-1:(index+(event.key==='ArrowDown'?1:-1)+providers.length)%providers.length;setProviderId(providers[next].id);(event.currentTarget.parentElement?.children[next] as HTMLElement)?.focus()}}>{item.name}</button>)}</div><div role=\"tabpanel\" id={`${name}-models`} aria-labelledby={provider.id==='empty'?undefined:`${name}-${provider.id}`} aria-label={`${provider.name} models`}><Input ref={search} label=\"Search models\" type=\"search\" value={query} onChange={event=>setQuery(event.target.value)}/><div role=\"radiogroup\" aria-label={query?'Matching models':`${provider.name} models`} className=\"hp-model-choices\">{matches.map(entry=><div key={entry.provider.id+entry.model.id} className=\"hp-model-row\"><label title={entry.model.name}><input type=\"radio\" name={name} checked={value===entry.model.id} onChange={()=>{onChange(entry.model.id);setProviderId(entry.provider.id);setQuery('')}}/><span>{entry.model.name}{query&&<small>{entry.provider.name}</small>}</span>{value===entry.model.id&&<span className=\"hp-current-model\"><UIIcon name=\"tick\"/></span>}</label>{value===entry.model.id&&<span ref={effortAnchor}><Button variant=\"tertiary\" size=\"sm\" className=\"hp-model-effort-chip\" aria-label={`Effort for ${entry.model.name}`} aria-haspopup=\"dialog\" aria-expanded={effortOpen} onClick={()=>setEffortOpen(true)}>{efforts[Math.min(5,Math.max(0,effort))]}<UIIcon name=\"chevron-down\"/></Button></span>}</div>)}</div>{!matches.length&&<p role=\"status\">No models match this search.</p>}<fieldset className=\"hp-model-effort\"><legend>Effort · {efforts[Math.min(5,Math.max(0,effort))]}</legend>{efforts.map((label,index)=><button type=\"button\" key={label} aria-pressed={effort===index} onClick={()=>changeEffort(index)}>{label}</button>)}</fieldset><Button variant=\"secondary\" size=\"sm\" onClick={close}>Done</Button></div></div><Popover dir={direction} lang={locale} triggerRef={effortAnchor} isOpen={effortOpen} onOpenChange={setEffortOpen} placement=\"bottom end\" className=\"hp-composer-popover hp-effort-popover\"><AriaDialog aria-label=\"Model effort\"><label>Model effort<input type=\"range\" min={0} max={5} step={1} value={effort} aria-valuetext={efforts[Math.min(5,Math.max(0,effort))]} onChange={event=>changeEffort(Number(event.target.value))}/></label><div className=\"hp-effort-axis\"><span>Faster</span><strong>{efforts[Math.min(5,Math.max(0,effort))]}</strong><span>Smarter</span></div><Button variant=\"secondary\" size=\"sm\" onClick={()=>setEffortOpen(false)}>Done</Button></AriaDialog></Popover></div>}</ComposerPopover>;\n}\nexport function ComposerStatusBar({branch,project,mode,context,onBranchChange,onProjectChange,onModeChange,onContextChange,disabled=false}:{branch:string;project:string;mode:string;context:number;onBranchChange:(value:string)=>void;onProjectChange:(value:string)=>void;onModeChange:(value:string)=>void;onContextChange:(value:number)=>void;disabled?:boolean}){\n const picker=(label:string,value:string,items:string[],change:(value:string)=>void)=><ComposerPopover label={label} trigger={<>{label==='Branch'?<RiGitBranchLine aria-hidden=\"true\"/>:label==='Project'?<UIIcon name=\"folder\"/>:<RiInfinityLine aria-hidden=\"true\"/>}{value}<UIIcon name=\"chevron-down\"/></>} disabled={disabled}>{close=><div className=\"hp-status-picker\"><h4>{label}</h4>{items.map(item=><Button key={item} variant=\"tertiary\" size=\"sm\" aria-pressed={value===item} onClick={()=>{change(item);close()}}>{item}</Button>)}</div>}</ComposerPopover>;\n return <div className=\"hp-composer-status-bar\">{picker('Branch',branch,['Main','Design review','Release preview'],onBranchChange)}{picker('Project',project,['helios-ui','component-library','local-example'],onProjectChange)}{picker('Agent mode',mode,['Agent','Ask','Plan'],onModeChange)}<ComposerPopover label=\"Context usage\" trigger={<><svg className=\"hp-context-ring\" viewBox=\"0 0 20 20\" aria-hidden=\"true\"><circle cx=\"10\" cy=\"10\" r=\"7\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" opacity=\".2\"/><circle cx=\"10\" cy=\"10\" r=\"7\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" pathLength=\"100\" strokeDasharray={`${context} 100`} transform=\"rotate(-90 10 10)\"/></svg>{context}%</>} disabled={disabled}>{()=> <label className=\"hp-status-context\">Simulated context usage<input type=\"range\" min={0} max={100} value={context} onChange={event=>onContextChange(Number(event.target.value))}/><strong>{context}%</strong></label>}</ComposerPopover></div>;\n}\n\nexport type ComposerMessage={id:string;text:string;model:string;permission:string;files:string[];attachments:File[];effort?:number;branch?:string;project?:string;agentMode?:string};\nexport type ComposerProps={state?:FamilyProps['state'];onRetry?:()=>void;disabled?:boolean;onSend?:(message:ComposerMessage)=>void;showAttachments?:boolean;showPanel?:boolean;showLocalMessages?:boolean;simulateAttachments?:boolean;working?:boolean;loadingLight?:boolean;onStop?:()=>void;placeholder?:string;value?:string;onValueChange?:(value:string)=>void;permission?:string;onPermissionChange?:(value:string)=>void;model?:string;onModelChange?:(value:string)=>void;effort?:number;onEffortChange?:(value:number)=>void;providers?:ComposerModelProvider[];attachments?:ComposerAttachment[];onRemoveAttachment?:(id:string)=>void;onAttachmentsChange?:(attachments:ComposerAttachment[])=>void;uploadDuration?:number;uploadGap?:number;status?:ReactNode;inputRef?:React.Ref<HTMLTextAreaElement>;minRows?:number;maxRows?:number;defaultPermission?:string;learnMoreHref?:string;onLearnMore?:()=>void;onSubmit?:(text:string)=>void;onUploadComplete?:(attachment:ComposerAttachment)=>void;onAllUploaded?:()=>void};\nfunction ComposerSurface({loadingLight,children,...props}:React.HTMLAttributes<HTMLDivElement>&{loadingLight?:boolean}){const card=<div {...props}>{children}</div>;return loadingLight?<NativeScope><div className=\"hp-native-composer-light\"><NativeComposerLoader active>{card}</NativeComposerLoader></div></NativeScope>:card;}\nexport function Composer({state='ready',onRetry,disabled=false,onSend,showAttachments=false,showPanel=false,showLocalMessages=true,simulateAttachments=false,working:givenWorking=false,loadingLight=false,onStop,placeholder='Hi, what do you need today?',value,onValueChange,permission:controlledPermission,onPermissionChange,model:controlledModel,onModelChange,effort:controlledEffort,onEffortChange,providers=COMPOSER_MODEL_PROVIDERS,attachments:externalAttachments,onRemoveAttachment,onAttachmentsChange,uploadDuration=1100,uploadGap=240,status:statusSlot,inputRef,minRows,maxRows=10,defaultPermission='Auto',learnMoreHref,onLearnMore,onSubmit,onUploadComplete,onAllUploaded}:ComposerProps){\n const working=givenWorking||state==='loading';\n const [localDraft,setLocalDraft]=useState(''),draft=value??localDraft,[localModel,setLocalModel]=useState('Helios Fast'),model=controlledModel??localModel,[localPermission,setLocalPermission]=useState(defaultPermission),permission=controlledPermission??localPermission,[localEffort,setLocalEffort]=useState(1),effort=controlledEffort??localEffort,[files,setFiles]=useState<File[]>([]),[messages,setMessages]=useState<ComposerMessage[]>([]),[status,setStatus]=useState(''),[context,setContext]=useState(57),[branch,setBranch]=useState('Main'),[project,setProject]=useState('helios-ui'),[mode,setMode]=useState('Agent'),[attachmentOpen,setAttachmentOpen]=useState(showAttachments),[previews,setPreviews]=useState<{name:string;url:string}[]>([]),[progress,setProgress]=useState<Record<string,number>>({}),[voiceActive,setVoiceActive]=useState(false),input=useRef<HTMLInputElement>(null),textarea=useRef<HTMLTextAreaElement>(null),recognition=useRef<any>(null),id=useId();\n const rows=Math.max(1,minRows??(showPanel||showAttachments?3:1)),maxLines=Math.max(rows,maxRows);\n const resize=()=>{const element=textarea.current;if(!element)return;const style=getComputedStyle(element),line=parseFloat(style.lineHeight)||20,extra=parseFloat(style.paddingTop)+parseFloat(style.paddingBottom)+parseFloat(style.borderTopWidth)+parseFloat(style.borderBottomWidth);element.style.height='auto';element.style.minHeight=`${line*rows+extra}px`;element.style.maxHeight=`${line*maxLines+extra}px`;element.style.height=`${Math.min(line*maxLines+extra,Math.max(line*rows+extra,element.scrollHeight+parseFloat(style.borderTopWidth)+parseFloat(style.borderBottomWidth)))}px`;element.style.overflowY=element.scrollHeight>line*maxLines+extra?'auto':'hidden';if(!element.value){element.scrollLeft=0;element.scrollTop=0}};\n useEffect(()=>{resize();window.addEventListener('resize',resize);return()=>window.removeEventListener('resize',resize)},[draft,rows,maxLines]);\n const fileId=(file:File)=>`${file.name}:${file.size}:${file.lastModified}`;\n const changeDraft=(next:string)=>{setLocalDraft(next);onValueChange?.(next)};\n const imageFiles=[...new Map([...files,...(externalAttachments?.flatMap(item=>item.file?[item.file]:[])||[])].filter(file=>file.type.startsWith('image/')).map(file=>[fileId(file),file])).values()],imageKey=imageFiles.map(fileId).join('|');\n useEffect(()=>{const next=imageFiles.map(file=>({name:fileId(file),url:URL.createObjectURL(file)}));setPreviews(next);return()=>next.forEach(item=>URL.revokeObjectURL(item.url))},[imageKey]);\n useEffect(()=>()=>recognition.current?.abort(),[]);\n useEffect(()=>{if(state==='empty')setMessages([])},[state]);\n const kindOf=(file:File):ComposerAttachmentKind=>file.type.startsWith('image/')?'image':file.type.startsWith('video/')?'video':/\\.(csv|xlsx?|ods)$/i.test(file.name)?'spreadsheet':/\\.(pptx?|key|odp)$/i.test(file.name)?'presentation':/\\.(tsx?|jsx?|json|css|html|py|java|md)$/i.test(file.name)?'code':'document';\n const attachments=externalAttachments?.map(item=>({...item,src:item.src||(item.file?previews.find(preview=>preview.name===fileId(item.file!))?.url:undefined),...(simulateAttachments&&item.progress===0?{progress:progress[item.id]??0}:{})}))??files.map(file=>({id:fileId(file),name:file.name,kind:kindOf(file),src:previews.find(item=>item.name===fileId(file))?.url,progress:progress[fileId(file)]??0,file}));\n const pending=externalAttachments?undefined:files.find(file=>(progress[fileId(file)]??0)<100),pendingId=externalAttachments?(simulateAttachments?attachments.find(item=>externalAttachments.find(source=>source.id===item.id)?.progress===0&&(item.progress??100)<100)?.id||'':''):pending?fileId(pending):'';\n useEffect(()=>{if(!pendingId)return;const interval=45,increment=100*interval/Math.max(100,uploadDuration);let timer:ReturnType<typeof setInterval>|undefined;const delay=setTimeout(()=>{timer=setInterval(()=>setProgress(old=>({...old,[pendingId]:Math.min(100,(old[pendingId]??0)+increment)})),interval)},completedIds.current.size?Math.max(0,uploadGap):0);return()=>{clearTimeout(delay);clearInterval(timer)}},[pendingId,uploadDuration,uploadGap]);\n const completedIds=useRef(new Set<string>()),allCompleted=useRef(false);\n useEffect(()=>{for(const item of attachments){if(item.progress===100&&!completedIds.current.has(item.id)){completedIds.current.add(item.id);onUploadComplete?.(item)}}const complete=attachments.length>0&&attachments.every(item=>item.progress===undefined||item.progress>=100);if(complete&&!allCompleted.current){allCompleted.current=true;setStatus(current=>/^Preparing (?:remaining )?local attachments\\./.test(current)?'All local attachments are ready. No remote upload was performed.':current);onAllUploaded?.()}if(!complete)allCompleted.current=false},[attachments,onUploadComplete,onAllUploaded]);\n const addFiles=(incoming:File[])=>{if(disabled||working)return;const errors:string[]=[],accepted=incoming.filter(file=>{if(file.size>10*1024*1024){errors.push(`${file.name} exceeds 10 MB.`);return false}if(file.type&&!(/^(image\\/(png|jpeg|webp|gif|svg\\+xml)|video\\/(mp4|webm|quicktime)|text\\/.+|application\\/(pdf|json|javascript|msword|vnd\\..+))$/i.test(file.type)||file.type==='application/octet-stream'&&/\\.(tsx?|jsx?|json|css|html|py|java|md)$/i.test(file.name))){errors.push(`${file.name} has an unsupported MIME type.`);return false}if(!/\\.(png|jpe?g|webp|gif|svg|pdf|txt|md|csv|docx?|xlsx?|pptx?|key|tsx?|jsx?|json|css|html|py|java|mp4|webm|mov)$/i.test(file.name)){errors.push(`${file.name} is not a supported attachment type.`);return false}return true});const merged=[...files];accepted.forEach(file=>{if(!merged.some(item=>fileId(item)===fileId(file)))merged.push(file)});if(merged.length>8)errors.push('Up to 8 attachments fit this local example.');setFiles(merged.slice(0,8));if(externalAttachments)onAttachmentsChange?.([...externalAttachments,...accepted.map(file=>({id:fileId(file),name:file.name,kind:kindOf(file),file,...(simulateAttachments?{progress:0}:{})}))].slice(0,8));setStatus(errors.join(' ')||'Preparing local attachments. No remote upload is running.');setAttachmentOpen(false)};\n const remove=(attachmentId:string)=>{const remaining=attachments.filter(item=>item.id!==attachmentId);setStatus(remaining.some(item=>item.progress!==undefined&&item.progress<100)?'Preparing remaining local attachments. No remote upload is running.':remaining.length?'Remaining local attachments are ready. No remote upload was performed.':'Attachment removed locally. No remote upload was performed.');if(externalAttachments){onRemoveAttachment?.(attachmentId);onAttachmentsChange?.(externalAttachments.filter(item=>item.id!==attachmentId));}else {setFiles(old=>old.filter(file=>fileId(file)!==attachmentId));setProgress(old=>{const next={...old};delete next[attachmentId];return next});completedIds.current.delete(attachmentId)}};\n const submit=()=>{if(disabled||working||!draft.trim())return;const message:ComposerMessage={id:String(Date.now()),text:draft.trim(),model,permission,files:attachments.map(item=>item.name),attachments:attachments.flatMap(item=>item.file?[item.file]:[]),effort,branch,project,agentMode:mode};if(showLocalMessages)setMessages(old=>[...old,message]);changeDraft('');setStatus('Added to this local example. No AI or external service was contacted.');onSend?.(message);onSubmit?.(message.text)};\n const statusBar=<ComposerStatusBar branch={branch} project={project} mode={mode} context={context} onBranchChange={setBranch} onProjectChange={setProject} onModeChange={setMode} onContextChange={setContext} disabled={disabled}/>;\n const renderedStatus=statusSlot===undefined?statusBar:statusSlot;\n return <section className={`hp-composer-example ${showPanel?'hp-composer-panel':''}`}>\n  {showPanel&&renderedStatus&&<div className=\"hp-composer-context\">{renderedStatus}</div>}\n  {state==='empty'&&!messages.length&&<p className=\"hp-empty-context\">Start a local conversation. Your draft stays editable.</p>}\n  {state==='error'&&<div className=\"hp-native-error\" role=\"alert\"><strong>Message could not complete</strong><p>Your draft is preserved. No provider request is running.</p>{onRetry&&<Button variant=\"secondary\" size=\"sm\" disabled={disabled} onClick={onRetry}>Try again</Button>}</div>}\n  <ComposerSurface loadingLight={loadingLight} className=\"hp-composer-card\" aria-busy={working} onDragOver={event=>{if(!disabled&&!working){event.preventDefault();event.dataTransfer.dropEffect='copy'}}} onDrop={event=>{event.preventDefault();addFiles(Array.from(event.dataTransfer.files))}}>\n   {attachments.length>0&&<ComposerAttachmentStrip attachments={attachments} onRemove={remove} disabled={disabled||working||!!externalAttachments&&!onRemoveAttachment&&!onAttachmentsChange}/>}\n   {attachmentOpen&&<div className=\"hp-composer-uploads\"><button type=\"button\" disabled={disabled||working} onClick={()=>input.current?.click()}>Click to choose attachments or drop files here</button><small>Images, documents, spreadsheets, presentations, code and video · 10 MB each</small><Button variant=\"tertiary\" size=\"sm\" disabled={disabled||working} onClick={()=>addFiles([new File(['Helios UI local sample document'],'brief.txt',{type:'text/plain'}),new File(['month,value\\nJan,24\\nFeb,32'],'sample.csv',{type:'text/csv'}),new File(['<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"80\" height=\"80\"><rect width=\"80\" height=\"80\" rx=\"18\" fill=\"#00CED1\"/><circle cx=\"40\" cy=\"40\" r=\"20\" fill=\"white\"/></svg>'],'sample.svg',{type:'image/svg+xml'})])}>Attach 3 local sample files</Button></div>}\n   <input ref={input} type=\"file\" multiple className=\"hu-sr-only\" aria-label=\"Choose attachments\" disabled={disabled||working} accept=\".png,.jpg,.jpeg,.webp,.gif,.svg,.pdf,.txt,.md,.csv,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.key,.ts,.tsx,.js,.jsx,.json,.css,.html,.py,.java,.mp4,.webm,.mov\" onChange={event=>{addFiles(Array.from(event.target.files||[]));event.target.value=''}}/>\n   <label htmlFor={id} className=\"hu-sr-only\">Message</label><textarea id={id} ref={node=>{textarea.current=node;if(typeof inputRef==='function')return inputRef(node);if(inputRef)inputRef.current=node}} rows={rows} value={draft} disabled={disabled||working} placeholder={placeholder} onChange={event=>changeDraft(event.target.value)} onKeyDown={event=>{if(event.key==='Enter'&&!event.shiftKey&&!event.nativeEvent.isComposing){event.preventDefault();submit()}}}/>\n   {working&&<div className=\"hp-composer-working\"><span className=\"hu-spinner\" aria-hidden=\"true\"/><strong>Working on the local example…</strong></div>}\n   <div className=\"hp-composer-toolbar\"><div><Button variant=\"tertiary\" size=\"sm\" iconOnly leadingIcon=\"+\" aria-label={attachmentOpen?'Hide attachments':'Attach files'} aria-expanded={attachmentOpen} disabled={disabled||working} onClick={()=>setAttachmentOpen(!attachmentOpen)}><UIIcon name=\"plus\" /></Button><ComposerPermissionPicker value={permission} learnMoreHref={learnMoreHref} onLearnMore={onLearnMore} disabled={disabled||working} onChange={next=>{setLocalPermission(next);onPermissionChange?.(next)}}/><ComposerModelPicker value={model} effort={effort} providers={providers} disabled={disabled||working} onChange={next=>{setLocalModel(next);onModelChange?.(next)}} onEffortChange={next=>{setLocalEffort(next);onEffortChange?.(next)}}/></div><div className=\"hp-composer-end\"><Button variant=\"tertiary\" size=\"sm\" iconOnly leadingIcon={<UIIcon name=\"microphone\" />} aria-label={voiceActive?'Stop voice input':'Voice input'} disabled={disabled||working} onClick={()=>{if(voiceActive){recognition.current?.stop();setVoiceActive(false);return;}const API=(window as any).SpeechRecognition||(window as any).webkitSpeechRecognition;if(!API){setStatus('This browser has no speech-recognition input. You can type your message.');return;}const reader=new API();recognition.current=reader;reader.lang=navigator.language;reader.interimResults=false;reader.onresult=(event:any)=>changeDraft(draft+(draft?' ':'')+event.results[0][0].transcript);reader.onend=()=>setVoiceActive(false);reader.onerror=()=>{setVoiceActive(false);setStatus('Voice input could not start. Type your message or retry with browser microphone permission.')};reader.start();setVoiceActive(true)}}><UIIcon name=\"microphone\" /></Button>{working?<Button className=\"hp-composer-stop\" variant=\"secondary\" disabled={disabled} onClick={()=>{onStop?.();setStatus('Local example stopped. Your draft is preserved.')}}>Stop</Button>:<Button disabled={disabled||!draft.trim()} onClick={submit} aria-label=\"Send message\"><UIIcon name=\"arrow-up\" /></Button>}</div></div>\n  </ComposerSurface>\n  {!showPanel&&renderedStatus}\n  <p className=\"hp-status\" role=\"status\">{status}</p>\n  {messages.length>0&&<ol className=\"hp-composer-messages\" aria-label=\"Submitted local messages\">{messages.map(message=><li key={message.id}><strong>You · {message.model} · {message.permission} · {message.agentMode}</strong><p>{message.text}</p>{message.files.length>0&&<small>Attachments: {message.files.join(', ')}</small>}</li>)}</ol>}\n  <p className=\"hp-note\">Enter sends; Shift+Enter adds a line. Model, permission and workspace choices are local preferences. Attachment progress is a simulated local preparation queue.</p>\n </section>;\n}\n\nexport function ComposerAttachments(props:ComposerProps){\n const [queue,setQueue]=useState(props.attachments),seen=useRef(new Set(props.attachments?.map(item=>item.id)||[]));\n useEffect(()=>{if(props.attachments===undefined)return;setQueue(old=>{const existing=new Map((old||[]).map(item=>[item.id,item]));const next=[...(old||[])];for(const item of props.attachments||[]){if(!seen.current.has(item.id)){seen.current.add(item.id);next.push(item)}else if(existing.has(item.id)){const index=next.findIndex(value=>value.id===item.id);next[index]={...next[index],...item}}}return next})},[props.attachments]);\n return <Composer {...props} attachments={queue} simulateAttachments showAttachments onAttachmentsChange={next=>{setQueue(next);props.onAttachmentsChange?.(next)}}/>;\n}\nexport const ComposerWithAttachments=ComposerAttachments;\nexport const ComposerStatusTab=ComposerStatusBar;\nexport function ComposerPanel(props: ComposerProps) {\n  return <Composer {...props} showPanel />;\n}\nexport type ComposerLoaderProps={disabled?:boolean;active?:boolean;onActiveChange?:(active:boolean)=>void;children?:ReactNode;colors?:string[];speed?:number;arc?:number;intensity?:number;bloom?:number;bloomStrength?:number;reverse?:boolean;radius?:number};\nexport function ComposerLoader({disabled=false,active,onActiveChange,children,colors=['#5eead4','#46baec','#e633a4','#00faa7'],speed=4.5,arc=120,intensity=.7,bloom=16,bloomStrength=.3,reverse=false,radius=26}:ComposerLoaderProps){\n const [localWorking,setLocalWorking]=useState(true),[paused,setPaused]=useState(false),reduce=useReducedMotion(),working=active??localWorking;\n const setWorking=(value:boolean)=>{setLocalWorking(value);onActiveChange?.(value)},safeArc=Math.min(360,Math.max(10,arc)),stops=colors.length?colors:['#00CED1'];\n const gradient=`conic-gradient(from var(--hp-rim-angle),transparent0deg ${360-safeArc}deg,${stops.map((color,index)=>`${color} ${360-safeArc+safeArc*index/Math.max(1,stops.length-1)}deg`).join(',')})`.replace('from0deg','from 0deg').replace('transparent0deg','transparent 0deg');\n return <div className=\"hp-composer-loader\" data-active={working} data-motion-paused={paused||!working||reduce===true} data-reverse={reverse} style={{'--loader-gradient':gradient,'--loader-speed':`${Math.max(.5,speed)}s`,'--loader-intensity':Math.min(1,Math.max(0,intensity)),'--loader-bloom':`${Math.max(0,bloom)}px`,'--loader-bloom-strength':Math.min(1,Math.max(0,bloomStrength)),'--loader-radius':`${Math.max(0,radius)}px`,'--loader-play':working&&!paused&&reduce!==true?'running':'paused'} as React.CSSProperties}>\n {!children&&<div className=\"hp-loader-stage\"><span className=\"hp-loader-orbit\" aria-hidden=\"true\" style={{animationPlayState:working&&!paused&&reduce!==true?'running':'paused'}}/><div className=\"hp-loader-avatar-row\" role=\"group\" aria-label={working?'Preparing a response':'Ready for your next message'}>{['#00CED1','#2168FF','#7847EB','#DD3992','#24A46D','#EF962D'].map((color,index)=><AgentAvatar key={color} shape={(['cloud','circle','diamond','heart','hexagon','square'] as const)[index]} color={color} animated={working&&!paused&&reduce!==true} name={`Example agent ${index+1}`}/>)}</div></div>}\n <div className=\"hp-loader-surface\"><span className=\"hp-loader-rim\" aria-hidden=\"true\"/>{children||<Composer disabled={disabled} working={working} onStop={()=>setWorking(false)} onSend={()=>setWorking(true)}/>}</div>\n {!children&&<div className=\"hu-actions\"><Button variant=\"secondary\" disabled={disabled} onClick={()=>setWorking(!working)}>{working?'Finish example':'Start working example'}</Button><Button variant=\"tertiary\" disabled={disabled} onClick={()=>setPaused(!paused)}>{paused?'Resume motion':'Pause motion'}</Button></div>}\n </div>;\n}\n\nexport type CenterNotification = {\n  id: string;\n  title: string;\n  description: string;\n  time: string;\n  read?: boolean;unread?:boolean;avatar?:ReactNode;icon?:ReactNode;\n  archived?: boolean;\n  category?:'mentions'|'system'|'activity';group?:string;status?:'neutral'|'information'|'success'|'error';actions?:{id:string;label:string}[];\n};\nconst defaultNotifications: CenterNotification[] = [\n  {\n    id: 'one',\n    title: 'Diya mentioned you',\n    description: 'Can you review the new component states?',\n    time: '5 minutes ago',\n    read: false,\n  },\n  {\n    id: 'two',\n    title: 'Design review ready',\n    description: 'The Helios UI library is ready to inspect.',\n    time: '1 hour ago',\n    read: false,\n  },\n  {\n    id: 'three',\n    title: 'Project milestone completed',\n    description: 'The React foundation has passed its local checks.',\n    time: 'Yesterday',\n    read: true,\n  },\n];\nexport function NotificationCenter({items=defaultNotifications,notifications:controlledNotifications,disabled=false,onChange,tab:controlledTab,defaultTab='all',onTabChange,onAction}:{items?:CenterNotification[];notifications?:CenterNotification[];disabled?:boolean;onChange?:(items:CenterNotification[])=>void;tab?:string;defaultTab?:string;onTabChange?:(tab:string)=>void;onAction?:(actionId:string,item:CenterNotification)=>void|Promise<void>}){\n const [local,setLocal]=useState(items),notifications=(controlledNotifications??local).map(item=>({...item,read:item.read??!item.unread})),[localFilter,setFilter]=useState(defaultTab),filter=controlledTab??localFilter,[query,setQuery]=useState(''),[selected,setSelected]=useState<CenterNotification|null>(null),[action,setAction]=useState('View thread'),[reply,setReply]=useState(''),[actionStatus,setActionStatus]=useState('');\n const category=(item:CenterNotification)=>item.category??(/mention/i.test(item.title)?'mentions':'system'),update=(next:CenterNotification[])=>{const normalized=next.map(item=>({...item,unread:!item.read}));setLocal(normalized);onChange?.(normalized)};\n const shown=notifications.filter(item=>(filter==='archive'?item.archived:!item.archived)&&(filter!=='unread'||!item.read)&&(filter!=='mentions'||category(item)==='mentions')&&(filter!=='system'||category(item)==='system')&&(item.title+' '+item.description).toLowerCase().includes(query.toLowerCase()));\n const defaultActions=(item:CenterNotification)=>item.actions??(item.status==='error'?[{id:'retry',label:'Retry'},{id:'logs',label:'View logs'}]:category(item)==='mentions'?[{id:'reply',label:'Reply'},{id:'thread',label:'View thread'}]:/review/i.test(item.title)?[{id:'review',label:'Review changes'}]:[{id:'download',label:'Download'}]);\n const runAction=async(item:CenterNotification,choice:{id:string;label:string})=>{if(disabled)return;update(notifications.map(value=>value.id===item.id?{...value,read:true}:value));if(onAction){try{await onAction(choice.id,item);setActionStatus(`${choice.label} requested through your application callback.`)}catch{setActionStatus(`${choice.label} could not complete. Retry the action.`)}return;}if(choice.id==='download'){const url=URL.createObjectURL(new Blob([`Helios UI local notification example\\n${item.title}\\n${item.description}`],{type:'text/plain'})),link=document.createElement('a');link.href=url;link.download='helios-notification-example.txt';link.click();setTimeout(()=>URL.revokeObjectURL(url),0);setActionStatus('Local example report downloaded.');return;}if(choice.id==='retry'){update(notifications.map(value=>value.id===item.id?{...value,read:true,status:'success',description:'Local validation recovered. No deployment or external service was started.'}:value));setActionStatus('Local retry completed. No deployment was started.');return;}setAction(choice.label);setReply('');setSelected(item)};\n const content=<div className=\"hp-notifications-panel\" key={filter}><Input label=\"Search notifications\" type=\"search\" value={query} disabled={disabled} onChange={event=>setQuery(event.target.value)}/><ul>{shown.length?shown.map((item,index)=><li key={item.id} data-unread={!item.read} data-status={item.status||'neutral'}>{(index===0||shown[index-1]?.group!==item.group)&&<h4 className=\"hp-notification-group\">{item.group||'Recent'}</h4>}<button type=\"button\" disabled={disabled} onClick={()=>{setAction('View thread');setSelected(item);update(notifications.map(value=>value.id===item.id?{...value,read:true}:value))}}><span className=\"hp-notification-avatar\" aria-hidden=\"true\">{item.avatar||item.icon||(item.status==='error'?<UIIcon name=\"warning\"/>:item.status==='success'?<UIIcon name=\"tick\"/>:category(item)==='mentions'?item.title[0]:<UIIcon name=\"sparkles\"/>)}</span><strong>{!item.read&&<i aria-label=\"Unread\"/>}{item.title}</strong><p>{item.description}</p><small>{item.time}</small></button><div className=\"hp-notification-tools\">{defaultActions(item).map(choice=><Button key={choice.id} variant={choice.id==='reply'||choice.id==='retry'?'primary':'secondary'} size=\"sm\" disabled={disabled} onClick={()=>runAction(item,choice)}>{choice.label}</Button>)}</div><Button variant=\"tertiary\" size=\"sm\" disabled={disabled} onClick={()=>update(notifications.map(value=>value.id===item.id?{...value,archived:!item.archived}:value))}>{item.archived?'Restore':'Archive'}</Button></li>):<li><DataState state=\"empty\" emptyMessage=\"No notifications match this view.\"/></li>}</ul></div>;\n return <section className=\"hp-notification-center\"><header><h3>Notifications <span className=\"hu-badge\">{notifications.filter(item=>!item.read&&!item.archived).length} unread</span></h3><Button variant=\"link-color\" disabled={disabled||!notifications.some(item=>!item.read&&!item.archived)} onClick={()=>update(notifications.map(item=>({...item,read:true})))}>Mark all read</Button></header><Tabs label=\"Notification filter\" value={filter} onValueChange={value=>{setFilter(value);onTabChange?.(value)}} items={[['all','All'],['mentions','Mentions'],['system','System'],['unread','Unread'],['archive','Archived']].map(([id,label])=>({id,label,content:filter===id?content:null,disabled}))}/><Dialog open={!!selected} onOpenChange={open=>{if(!open)setSelected(null)}} title={action==='Reply'?`Reply to ${selected?.title.split(' ')[0]}`:selected?.title||'Notification'} description={selected?.description} footer={<Button variant=\"secondary\" onClick={()=>setSelected(null)}>Close</Button>}><p>{selected?.time} · Local example notification</p>{action==='Reply'&&<form onSubmit={event=>{event.preventDefault();if(!reply.trim())return;setActionStatus(`Local reply saved: ${reply.trim()}`);setSelected(null)}}><label className=\"hp-textarea-label\">Reply message<textarea value={reply} disabled={disabled} onChange={event=>setReply(event.target.value)}/></label><Button type=\"submit\" disabled={disabled||!reply.trim()}>Save local reply</Button></form>}{action==='Review changes'&&<ul><li>Added keyboard focus states</li><li>Updated responsive component layouts</li><li>Added local failure and recovery examples</li></ul>}{action==='View logs'&&<pre>Local example log: validation failed → retry available.\\nNo provider or deployment request was made.</pre>}</Dialog><p className=\"hp-status\" role=\"status\">{actionStatus}</p></section>;\n}\n\nexport type QuestionOption = { value: string; label: string; description?: string };\nexport type Question = {\n  id: string;\n  title: string;\n  options: QuestionOption[];\n  multiple?: boolean;\n  select?:'single'|'multiple';required?:boolean;\n  other?: boolean;\n};\nconst defaultQuestions: Question[] = [\n  {\n    id: 'controls',\n    title: 'Which controls should stay in the top bar?',\n    multiple: true,\n    other: true,\n    options: [\n      {\n        value: 'theme',\n        label: 'Theme switch',\n        description: 'Keep the light and dark appearance control.',\n      },\n      {\n        value: 'search',\n        label: 'Quick search',\n        description: 'Jump to components and documentation.',\n      },\n      {\n        value: 'account',\n        label: 'Workspace menu',\n        description: 'Switch workspace and account preferences.',\n      },\n    ],\n  },\n  {\n    id: 'permission',\n    title: 'How should permission changes behave?',\n    options: [\n      {\n        value: 'next',\n        label: 'Apply to the next turn',\n        description: 'Keep the current example step intact.',\n      },\n      {\n        value: 'pause',\n        label: 'Pause and confirm',\n        description: 'Review the change before continuing.',\n      },\n      {\n        value: 'manual',\n        label: 'Ask each time',\n        description: 'Keep every action under manual control.',\n      },\n    ],\n  },\n  {\n    id: 'delivery',\n    title: 'What should the completed result include?',\n    multiple: true,\n    options: [\n      { value: 'source', label: 'Reusable source' },\n      { value: 'states', label: 'Interactive states' },\n      { value: 'tests', label: 'Verification evidence' },\n    ],\n  },\n];\nexport type QuestionnaireAnswer = { values: string[]; other: string; otherSelected?: boolean };\nexport type QuestionnaireProps={otherAsChoice?:boolean;questions?:Question[];disabled?:boolean;onComplete?:(answers:Record<string,QuestionnaireAnswer>)=>void;step?:number;onStepChange?:(step:number)=>void;answers?:Record<string,QuestionnaireAnswer>;onAnswersChange?:(answers:Record<string,QuestionnaireAnswer>)=>void;defaultStep?:number;defaultAnswers?:Record<string,QuestionnaireAnswer>;autoAdvance?:boolean;advanceDelay?:number;onDismiss?:()=>void;select?:'single'|'multiple';labels?:Partial<Record<'next'|'previous'|'done'|'other'|'otherPlaceholder'|'dismiss'|'review'|'reopen'|'complete',string>>};\nexport function Questionnaire({otherAsChoice=false,questions=defaultQuestions,disabled=false,onComplete,step:controlledStep,onStepChange,answers:controlledAnswers,onAnswersChange,defaultStep=0,defaultAnswers={},autoAdvance=true,advanceDelay=180,onDismiss,select,labels={}}:QuestionnaireProps){\n const questionnaireId=useId(),[localStep,setLocalStep]=useState(defaultStep),step=Math.min(Math.max(0,controlledStep??localStep),Math.max(0,questions.length-1)),[localAnswers,setLocalAnswers]=useState<Record<string,QuestionnaireAnswer>>(defaultAnswers),answers=controlledAnswers??localAnswers,[complete,setComplete]=useState(false),[dismissed,setDismissed]=useState(false),[error,setError]=useState(''),[direction,setDirection]=useState(1),timer=useRef<ReturnType<typeof setTimeout>|undefined>(undefined),heading=useRef<HTMLHeadingElement>(null),reduce=useReducedMotion(),current=questions[step],answer=answers[current?.id]||{values:[],other:''};\n const multiple=current?.select?current.select==='multiple':select?select==='multiple':!!current?.multiple;\n const valid=(question:Question,selected:QuestionnaireAnswer)=>question.required===false||selected.values.some(value=>question.options.some(option=>option.value===value))||!!question.other&&(otherAsChoice?!!selected.otherSelected:!!selected.other.trim());\n const lastFocusedStep=useRef(step);useEffect(()=>{if(lastFocusedStep.current!==step){heading.current?.focus();lastFocusedStep.current=step}},[step]);\n useEffect(()=>()=>clearTimeout(timer.current),[step,complete]);\n const go=(next:number)=>{clearTimeout(timer.current);setDirection(next>=step?1:-1);setLocalStep(next);onStepChange?.(next);setError('')};\n const next=(nextAnswers=answers)=>{const selected=nextAnswers[current.id]||{values:[],other:''};if(!valid(current,selected)){setError('Choose at least one answer before continuing.');return;}if(step<questions.length-1)go(step+1);else{const missing=questions.findIndex(question=>!valid(question,nextAnswers[question.id]||{values:[],other:''}));if(missing>=0){go(missing);setError('Choose at least one answer before continuing.');return;}clearTimeout(timer.current);setComplete(true);onComplete?.(nextAnswers)}};\n const update=(patch:Partial<QuestionnaireAnswer>,advance=false)=>{const nextAnswers={...answers,[current.id]:{...answer,...patch}};setLocalAnswers(nextAnswers);onAnswersChange?.(nextAnswers);setError('');if(advance&&autoAdvance&&!multiple){clearTimeout(timer.current);timer.current=setTimeout(()=>next(nextAnswers),Math.max(0,advanceDelay))}};\n const pick=(value:string)=>{const picked=multiple?(answer.values.includes(value)?answer.values.filter(item=>item!==value):[...answer.values,value]):[value];update({values:current.options.map(option=>option.value).filter(value=>picked.includes(value)),...(!multiple&&otherAsChoice?{otherSelected:false,other:''}:{})},true)};\n if(!current)return <section className=\"hp-questionnaire hp-questionnaire-empty\"><h3>No questions yet</h3><p role=\"status\">Add questions to begin this questionnaire.</p></section>;\n if(dismissed)return <section className=\"hp-questionnaire\"><p role=\"status\">Questionnaire dismissed.</p><Button variant=\"secondary\" onClick={()=>setDismissed(false)}>{labels.reopen||'Reopen questionnaire'}</Button></section>;\n return <motion.section layout initial={false} transition={{layout:{duration:reduce?0:.22}}} className=\"hp-questionnaire\" style={{'--question-direction':direction} as React.CSSProperties} onKeyDown={event=>{if(disabled||complete||(event.target as HTMLElement).matches('input:not([type=radio]):not([type=checkbox]),textarea,select'))return;const index=Number(event.key)-1;if(Number.isInteger(index)&&index>=0&&index<current.options.length){event.preventDefault();pick(current.options[index].value)}}}>\n {complete?<><h3>{labels.complete||'Your preferences are ready'}</h3><dl>{questions.map(question=><div key={question.id}><dt>{question.title}</dt><dd>{[...(answers[question.id]?.values||[]).map(value=>question.options.find(option=>option.value===value)?.label||value),otherAsChoice?(answers[question.id]?.otherSelected?answers[question.id]?.other.trim()||labels.other||'Other':undefined):answers[question.id]?.other].filter(Boolean).join(', ')}</dd></div>)}</dl><Button variant=\"secondary\" disabled={disabled} onClick={()=>{setComplete(false);go(0)}}>{labels.review||'Review answers'}</Button></>:<><header><h3 ref={heading} tabIndex={-1}>{current.title}</h3><span>{step+1}/{questions.length}</span><Button variant=\"tertiary\" size=\"sm\" iconOnly leadingIcon=\"×\" aria-label={labels.dismiss||\"Dismiss questionnaire\"} disabled={disabled} onClick={()=>{clearTimeout(timer.current);setDismissed(true);onDismiss?.()}}><UIIcon name=\"close\" /></Button></header><fieldset key={current.id} disabled={disabled} className=\"hp-question-step\"><legend className=\"hu-sr-only\">{current.title}</legend>{current.options.map((option,index)=><label className=\"hp-answer\" key={option.value} data-selected={answer.values.includes(option.value)}><input type={multiple?'checkbox':'radio'} name={questionnaireId+current.id} checked={answer.values.includes(option.value)} onChange={()=>pick(option.value)}/><span><strong>{option.label}</strong>{option.description&&<small>{option.description}</small>}</span>{!multiple&&<b>{index+1}</b>}</label>)}{current.other&&(otherAsChoice?<div className=\"hp-answer hp-other-answer\" data-selected={!!answer.otherSelected}><label className=\"hp-other-hit\" htmlFor={questionnaireId+current.id+'-other'}><span className=\"hu-sr-only\">{labels.other||'Other'}</span></label><span className=\"hp-other-copy\"><label htmlFor={questionnaireId+current.id+'-other-text'}>{labels.other||'Other'}</label><input id={questionnaireId+current.id+'-other-text'} aria-label={labels.other||'Other'} placeholder={labels.otherPlaceholder} value={answer.other} disabled={disabled} onChange={event=>update({other:event.target.value,otherSelected:true,...(!multiple?{values:[]}:{})})} onKeyDown={event=>{if(event.key==='Enter'){event.preventDefault();next()}}}/></span><input id={questionnaireId+current.id+'-other'} type={multiple?'checkbox':'radio'} name={questionnaireId+current.id} checked={!!answer.otherSelected} onChange={()=>update({otherSelected:multiple?!answer.otherSelected:true,...(multiple&&answer.otherSelected?{other:''}:{}),...(!multiple?{values:[]}:{})})}/></div>:<Input label={labels.other||\"Other answer\"} placeholder={labels.otherPlaceholder} value={answer.other} disabled={disabled} onChange={event=>update({other:event.target.value})} onKeyDown={event=>{if(event.key==='Enter'){event.preventDefault();next()}}}/>)}</fieldset>{error&&<p className=\"hp-error\" role=\"alert\">{error}</p>}<footer><nav aria-label=\"Question steps\">{questions.map((question,index)=><button key={question.id} type=\"button\" disabled={disabled} aria-current={index===step?'step':undefined} onClick={()=>go(index)}>Step {index+1}</button>)}</nav><div><Button variant=\"secondary\" size=\"sm\" disabled={disabled||step===0} onClick={()=>go(step-1)}>{labels.previous||'Previous'}</Button><Button size=\"sm\" disabled={disabled} onClick={()=>next()}>{step===questions.length-1?(labels.done||'Done'):(labels.next||'Next')}</Button></div></footer></>}\n </motion.section>;\n}\n\nexport type TaskChip = string|{label:string;icon?:PublicAgentIcon;href?:string};\nexport type Task = {id:string;label:string;done:boolean;resource?:string;chips?:TaskChip[];steps?:{label:string;resources?:string[];chips?:TaskChip[]}[]};\nconst defaultTasks:Task[]=[{id:'brief',label:'Review the design brief',done:true,resource:'Brief.md'},{id:'components',label:'Build shared React components',done:false,resource:'components.tsx'},{id:'states',label:'Check keyboard and empty states',done:false,resource:'verification.md'},{id:'handoff',label:'Prepare the final handoff',done:false}];\nexport type TaskListProps={items?:Task[];tasks?:Task[];disabled?:boolean;onChange?:(tasks:Task[])=>void;mode?:'stream'|'editor';revealed?:number;suspended?:boolean;startDelay?:number;stepInterval?:number;autoRun?:boolean;collapseOnComplete?:boolean|'all';onComplete?:()=>void;initialRevealed?:number};\nfunction TaskResources({chips=[]}:{chips?:TaskChip[]}){return <>{chips.map((chip,index)=>{const value=typeof chip==='string'?{label:chip}:chip,content=<>{value.icon?renderAgentIcon(value.icon):<UIIcon name=\"file\"/>}{value.label}</>;return value.href&&/^(https?:\\/\\/|\\/(?!\\/)|#)/.test(value.href)?<a key={index} className=\"hp-resource\" href={value.href} target=\"_blank\" rel=\"noreferrer\">{content}</a>:<span key={index} className=\"hp-resource\">{content}</span>})}</>}\nexport function TaskList({items=defaultTasks,tasks:controlledTasks,disabled=false,onChange,mode='stream',revealed,suspended=false,startDelay=0,stepInterval=850,autoRun=true,collapseOnComplete=false,onComplete,initialRevealed=0}:TaskListProps){\n const [localTasks,setTasks]=useState(items),tasks=controlledTasks??localTasks,[collapsed,setCollapsed]=useState(false),[folds,setFolds]=useState<Record<string,boolean>>({}),[draft,setDraft]=useState(''),[query,setQuery]=useState(''),[running,setRunning]=useState(autoRun),[elapsed,setElapsed]=useState(0),[turn,setTurn]=useState(''),[localUnits,setUnits]=useState(initialRevealed),[started,setStarted]=useState(startDelay<=0),didComplete=useRef(false),completeCallback=useRef(onComplete);completeCallback.current=onComplete;\n const readonly=!!controlledTasks&&!onChange||revealed!==undefined,totalUnits=tasks.reduce((total,t)=>total+1+(t.steps?.length||0),0),units=Math.max(0,Math.min(totalUnits,revealed??(mode==='stream'&&running&&!readonly?localUnits:totalUnits))),positions=tasks.map((task,index)=>({task,start:tasks.slice(0,index).reduce((n,t)=>n+1+(t.steps?.length||0),0),end:tasks.slice(0,index+1).reduce((n,t)=>n+1+(t.steps?.length||0),0)})),isDone=(task:Task,end:number)=>task.done||(revealed!==undefined&&units>=end),completed=positions.filter(({task,end})=>isDone(task,end)).length,complete=tasks.length>0&&completed===tasks.length;\n const update=(next:Task[])=>{setTasks(next);onChange?.(next)};\n useEffect(()=>{if(!running||disabled||suspended||readonly||started)return;const timer=setTimeout(()=>setStarted(true),Math.max(0,startDelay));return()=>clearTimeout(timer)},[running,disabled,suspended,readonly,started,startDelay]);\n useEffect(()=>{if(!running||disabled||suspended||readonly||!started)return;const timer=setTimeout(()=>{const nextUnits=Math.min(totalUnits,localUnits+1);setUnits(nextUnits);const next=positions.map(({task,end})=>end<=nextUnits&&!task.done?{...task,done:true}:task);if(next.some((task,index)=>task!==tasks[index]))update(next);setElapsed(value=>value+Math.max(50,stepInterval)/1000);if(nextUnits>=totalUnits)setRunning(false)},Math.max(50,stepInterval));return()=>clearTimeout(timer)},[running,disabled,suspended,readonly,started,localUnits,totalUnits,stepInterval,tasks]);\n useEffect(()=>{if(!complete){didComplete.current=false;return;}setRunning(false);if(collapseOnComplete==='all')setCollapsed(true);if(!didComplete.current){didComplete.current=true;completeCallback.current?.()}},[complete,collapseOnComplete]);\n const restart=()=>{if(complete){update(tasks.map(t=>({...t,done:false})));setUnits(0);setElapsed(0);setFolds({});setStarted(startDelay<=0);setCollapsed(false)}setRunning(!running)};\n const editor=<><Input label=\"Filter tasks\" type=\"search\" value={query} disabled={disabled} onChange={e=>setQuery(e.target.value)}/><form onSubmit={e=>{e.preventDefault();if(!draft.trim()||readonly)return;update([...tasks,{id:'task-'+Date.now(),label:draft.trim(),done:false}]);setDraft('')}}><Input label=\"New task\" value={draft} disabled={disabled||readonly} onChange={e=>setDraft(e.target.value)}/><Button type=\"submit\" disabled={disabled||readonly||!draft.trim()}>Add task</Button></form></>;\n return <section className={`hp-task-list hp-task-${mode}`} data-running={running&&!disabled&&!suspended&&!readonly&&!complete&&tasks.length>0}><header><button type=\"button\" disabled={disabled} aria-expanded={!collapsed} onClick={()=>setCollapsed(!collapsed)}><strong>{running&&!suspended&&!complete&&tasks.length?'Working through local tasks':'Tasks'}</strong><span>{completed}/{tasks.length} completed · {elapsed.toFixed(1)}s {collapsed?<UIIcon name=\"chevron-down\"/>:<UIIcon name=\"chevron-up\"/>}</span></button><progress value={completed} max={Math.max(1,tasks.length)} aria-label=\"Completed tasks\"/><Button variant=\"tertiary\" size=\"sm\" disabled={disabled||suspended||readonly||!tasks.length} onClick={restart}>{running?'Pause local run':'Run local example'}</Button></header>{turn&&<p className=\"hp-note\">Example turn: {turn}</p>}{!collapsed&&<>{mode==='editor'&&editor}<ul aria-live={mode==='stream'?'polite':'off'} aria-label=\"Local task updates\">{positions.filter(({task})=>task.label.toLowerCase().includes(query.toLowerCase())).map(({task,start,end})=>{if(mode==='stream'&&start>=units)return null;const done=isDone(task,end),hasSteps=!!task.steps?.length,folded=folds[task.id]??(collapseOnComplete===true&&done);return <li key={task.id} data-complete={done} data-active={running&&!done}><div className=\"hp-task-row\"><Checkbox label={task.label} checked={done} disabled={disabled||readonly} onChange={e=>update(tasks.map(t=>t.id===task.id?{...t,done:e.target.checked}:t))}/>{hasSteps&&<Button variant=\"tertiary\" size=\"sm\" iconOnly leadingIcon={<UIIcon name={folded?'chevron-down':'chevron-up'}/>} aria-label={`Toggle steps for ${task.label}`} aria-expanded={!folded} disabled={disabled} onClick={()=>setFolds(old=>({...old,[task.id]:!folded}))}><UIIcon name={folded?'chevron-down':'chevron-up'}/></Button>}</div><TaskResources chips={[...(task.resource?[task.resource]:[]),...(task.chips||[])]}/>{mode==='editor'&&<Button variant=\"tertiary\" size=\"sm\" iconOnly leadingIcon={<UIIcon name=\"close\"/>} disabled={disabled||readonly} aria-label={`Remove task ${task.label}`} onClick={()=>update(tasks.filter(t=>t.id!==task.id))}><UIIcon name=\"close\"/></Button>}{hasSteps&&!folded&&<ol className=\"hp-task-steps\">{task.steps!.slice(0,mode==='editor'?undefined:Math.max(0,units-start-1)).map((step,index)=><li key={index}><span><UIIcon name=\"branch\"/>{step.label}</span><TaskResources chips={[...(step.resources||[]),...(step.chips||[])]}/></li>)}</ol>}</li>})}</ul>{!tasks.length&&<DataState state=\"empty\" emptyMessage=\"Add a task in the local editor to begin.\"/>}{mode==='stream'&&<details className=\"hp-task-editor\"><summary>Edit local tasks</summary>{editor}<div>{tasks.map(task=><Button key={task.id} variant=\"tertiary\" size=\"sm\" disabled={disabled||readonly} onClick={()=>update(tasks.filter(t=>t.id!==task.id))}>Remove task {task.label}</Button>)}</div></details>}</>}<p className=\"hp-status\" role=\"status\">{completed} of {tasks.length} local tasks completed.</p><details className=\"hp-run-conversation\"><summary>Try in a conversation</summary><Composer disabled={disabled||readonly} placeholder=\"Describe a local example task…\" onSend={message=>{setTurn(message.text);update(tasks.map(t=>({...t,done:false})));setUnits(0);setElapsed(0);setFolds({});setStarted(startDelay<=0);setCollapsed(false);setRunning(true)}}/>{complete&&turn&&<p>Local example steps completed. No AI response was generated.</p>}</details></section>;\n}\n\nexport type WebSearchSource={id?:string;title:string;domain?:string;brand?:string;icon?:PublicAgentIcon;href?:string};\nexport type WebSearchStep={id?:string;label:string;query?:string;meta?:string;heading?:boolean;brand?:string;icon?:PublicAgentIcon;dwell?:number;sources?:WebSearchSource[]};\nfunction SearchSourceStack({sources,label,disabled=false,buttonLabel='Sources'}:{sources:WebSearchSource[];label:string;disabled?:boolean;buttonLabel?:string}){\n const {direction,locale}=useDirection();const anchor=useRef<HTMLButtonElement>(null),[open,setOpen]=useState(false);useEffect(()=>{if(disabled)setOpen(false)},[disabled]);\n const mark=(source:WebSearchSource)=>source.brand?<SocialBrandMark provider={source.brand} size={18}/>:source.icon?renderAgentIcon(source.icon):<UIIcon name=\"link\"/>;\n return <div className=\"hp-search-source-branch\"><button ref={anchor} type=\"button\" disabled={disabled} aria-label={`Sources for ${label}`} aria-haspopup=\"dialog\" aria-expanded={open} onClick={()=>setOpen(!open)}>{buttonLabel}</button><div className=\"hp-source-stack\">{sources.slice(0,6).map((source,index)=>{const href=source.href?safeSourceURL(source.href)?.href:undefined,domain=source.domain||(href?new URL(href).hostname:'Reference source'),text=`${source.title} · ${domain}`;return href?<a key={source.id||index} href={href} target=\"_blank\" rel=\"noreferrer\" title={text} aria-label={text} aria-disabled={disabled||undefined} tabIndex={disabled?-1:0} onClick={e=>{if(disabled)e.preventDefault()}}>{mark(source)}</a>:<span key={source.id||index} title={text}>{mark(source)}</span>})}{sources.length>6&&<button type=\"button\" disabled={disabled} aria-label={`Show all ${sources.length} sources for ${label}`} onClick={()=>setOpen(true)}>+{sources.length-6}</button>}</div><Popover dir={direction} lang={locale} triggerRef={anchor} isOpen={open} onOpenChange={setOpen} placement=\"bottom start\" className=\"hp-composer-popover hp-sources-popover\"><AriaDialog aria-label={`Sources for ${label}`}><h4>{sources.length} reference sources</h4><ul>{sources.map((source,index)=>{const href=source.href?safeSourceURL(source.href)?.href:undefined;return <li key={source.id||index}>{mark(source)}<span>{href?<a href={href} target=\"_blank\" rel=\"noreferrer\">{source.title}</a>:<strong>{source.title}</strong>}<small>{source.domain||(href?new URL(href).hostname:'No navigable URL supplied')}</small></span></li>})}</ul></AriaDialog></Popover></div>;\n}\nexport type WebSearchTrailProps={steps:WebSearchStep[];disabled?:boolean;suspended?:boolean;revealed?:number;stepInterval?:number;startDelay?:number;autoRun?:boolean;working?:string|false;onComplete?:()=>void;title?:string;presentation?:'interactive'|'source'};\nexport function WebSearchTrail({steps,disabled=false,suspended=false,revealed,stepInterval=850,startDelay=0,autoRun=true,working='Working',onComplete,title='Local research trail',presentation='interactive'}:WebSearchTrailProps){\n const units=useMemo(()=>steps.flatMap((step,index)=>[{step,index,source:false},...(step.sources?.length?[{step,index,source:true}]:[])]),[steps]),[seen,setSeen]=useState(autoRun?0:units.length),[running,setRunning]=useState(autoRun),[started,setStarted]=useState(autoRun),[elapsed,setElapsed]=useState(0),[collapsed,setCollapsed]=useState(false),callback=useRef(onComplete),didComplete=useRef(false);callback.current=onComplete;\n const count=Math.max(0,Math.min(units.length,revealed??seen)),complete=units.length>0&&count>=units.length,active=(revealed!==undefined?!complete:running)&&!disabled&&!suspended&&units.length>0;\n useEffect(()=>{if(revealed!==undefined||!active)return;const next=units[count],previous=units[count-1],delay=count===0?Math.max(0,startDelay):next?.source?Math.max(30,Math.min(400,stepInterval)):Math.max(30,previous?.step.dwell??stepInterval);const timer=setTimeout(()=>setSeen(value=>Math.min(units.length,value+1)),delay);return()=>clearTimeout(timer)},[revealed,active,count,units,stepInterval,startDelay]);\n useEffect(()=>{if(!active||working===false)return;const timer=setInterval(()=>setElapsed(value=>value+.1),100);return()=>clearInterval(timer)},[active,working]);\n useEffect(()=>{if(!complete){didComplete.current=false;return;}setRunning(false);if((started||revealed!==undefined)&&!didComplete.current){didComplete.current=true;callback.current?.()}},[complete,started,revealed]);\n return <section className=\"hp-web-search hp-web-trail\" data-running={active} data-revealed={count}><button type=\"button\" className=\"hp-search-heading\" disabled={disabled} aria-expanded={!collapsed} onClick={()=>setCollapsed(!collapsed)}><strong>{title}</strong><span>{count}/{units.length} rows {collapsed?<UIIcon name=\"chevron-down\"/>:<UIIcon name=\"chevron-up\"/>}</span></button>{!collapsed&&<ol className=\"hp-source-trail\">{units.slice(0,count).map((unit,index)=>unit.source?<li key={`${unit.index}-sources`} className=\"hp-source-step hp-source-row\"><SearchSourceStack sources={unit.step.sources||[]} label={unit.step.label} disabled={disabled} buttonLabel={presentation==='source'?`${unit.step.sources?.length||0} results`:undefined}/></li>:<li key={`${unit.index}-step`} className=\"hp-source-step\" data-heading={!!unit.step.heading}><span className=\"hp-site-mark\" aria-hidden=\"true\">{unit.step.brand?<SocialBrandMark provider={unit.step.brand} size={18}/>:unit.step.icon?renderAgentIcon(unit.step.icon):<UIIcon name=\"search\"/>}</span><div><strong>{unit.step.label}</strong>{unit.step.query&&<p>{unit.step.query}</p>}{unit.step.meta&&<small>{unit.step.meta}</small>}</div></li>)}</ol>}{active&&working!==false&&<p className=\"hp-web-working\" role=\"status\"><span className=\"hu-spinner\" aria-hidden=\"true\"/>{working} <span>{elapsed.toFixed(1)}s</span></p>}{!units.length&&<p role=\"status\">No search steps have been supplied.</p>}{suspended&&<p role=\"status\">Local source discovery is paused. Retry to continue.</p>}{revealed===undefined&&<Button variant=\"tertiary\" size=\"sm\" disabled={disabled||suspended||!units.length} onClick={()=>{if(complete||!started){setSeen(0);setElapsed(0);setStarted(true);setRunning(true)}else setRunning(!running)}}>{active?'Pause trail':complete?'Replay trail':'Run local trail'}</Button>}<p className=\"hp-note\">Illustrative source trail. No live search or provider request runs.</p></section>;\n}\n\nexport type SearchSource = { id: string; title: string; url: string; description: string;brand?:string;icon?:ReactNode;dwell?:number };\nconst defaultSources: SearchSource[] = [\n  {\n    id: 'react',\n    title: 'React documentation',\n    url: 'https://react.dev/',\n    description: 'Reusable components, state and rendering guidance.',\n  },\n  {\n    id: 'aria',\n    title: 'React Aria accessibility patterns',\n    url: 'https://react-spectrum.adobe.com/react-aria/',\n    description: 'Keyboard, focus and accessible component primitives.',\n  },\n  {\n    id: 'tailwind',\n    title: 'Tailwind CSS documentation',\n    url: 'https://tailwindcss.com/docs',\n    description: 'Utility-first styling and CSS theme tokens.',\n  },\n];\nfunction safeSourceURL(value: string) {\n  try {\n    const url = new URL(value);\n    return ['https:', 'http:'].includes(url.protocol) ? url : undefined;\n  } catch {\n    return undefined;\n  }\n}\nexport function WebSearch({\n  sources = defaultSources,\n  disabled = false,\n  onSearch,\n  revealed,stepInterval=850,autoRun=true,onComplete,steps,working,startDelay=0,suspended=false,\n}: {\n  steps?:WebSearchStep[];working?:string|false;startDelay?:number;suspended?:boolean;\n  sources?: SearchSource[];\n  disabled?: boolean;\n  onSearch?: (query: string) => void;\n  revealed?:number;stepInterval?:number;autoRun?:boolean;onComplete?:()=>void;\n}) {\n  if(steps)return <WebSearchTrail steps={steps} revealed={revealed} stepInterval={stepInterval} startDelay={startDelay} autoRun={autoRun} onComplete={onComplete} working={working} disabled={disabled} suspended={suspended}/>;\n  return <WebSearchList sources={sources} disabled={disabled} onSearch={onSearch} revealed={revealed} stepInterval={stepInterval} autoRun={autoRun} onComplete={onComplete} suspended={suspended}/>;\n}\nfunction WebSearchList({sources,disabled,onSearch,revealed,stepInterval,autoRun,onComplete,suspended}:{sources:SearchSource[];disabled:boolean;onSearch?: (query:string)=>void;revealed?:number;stepInterval:number;autoRun:boolean;onComplete?:()=>void;suspended:boolean}){\n  const [query, setQuery] = useState('React accessible components'),\n    [searched, setSearched] = useState(''),\n    [expanded, setExpanded] = useState(true),\n    [active, setActive] = useState<string | null>(null),\n    [running,setRunning]=useState(autoRun),\n    [localRevealed,setRevealed]=useState(0);\n  const filtered = sources.filter((source) =>\n    (source.title + ' ' + source.description)\n      .toLowerCase()\n      .includes((searched || '').split(' ')[0].toLowerCase()),\n  );\n  const shown = searched ? filtered : sources;\n  useEffect(()=>{if(!running||suspended||revealed!==undefined)return;if(localRevealed>=shown.length){setRunning(false);return;}const timer=setTimeout(()=>setRevealed(value=>value+1),Math.max(50,shown[localRevealed]?.dwell??stepInterval));return()=>clearTimeout(timer)},[running,suspended,localRevealed,shown.length,stepInterval,revealed]);\n  const didComplete=useRef(false),completion=useRef(onComplete);completion.current=onComplete;\n  useEffect(()=>{const complete=!suspended&&(shown.length>0||!!searched)&&(revealed!==undefined?revealed>=shown.length:!running);if(!complete){didComplete.current=false;return;}if(!didComplete.current){didComplete.current=true;completion.current?.()}},[running,suspended,searched,revealed,shown.length]);\n  return (\n    <section className=\"hp-web-search\" data-running={running&&!suspended}>\n      <form\n        onSubmit={(event) => {\n          event.preventDefault();\n          if (!query.trim()) return;\n          setSearched(query);\n          setRevealed(0);setRunning(true);\n          setExpanded(true);\n          onSearch?.(query);\n        }}\n      >\n        <Input\n          label=\"Search query\"\n          value={query}\n          disabled={disabled}\n          onChange={(event) => setQuery(event.target.value)}\n        />\n        <Button type=\"submit\" disabled={disabled || suspended || !query.trim()}>\n          Search example sources\n        </Button>\n      </form>\n      <button\n        type=\"button\"\n        className=\"hp-search-heading\"\n        disabled={disabled}\n        aria-expanded={expanded}\n        onClick={() => setExpanded(!expanded)}\n      >\n        <strong><UIIcon name=\"search\" />{searched ? `Results for “${searched}”` : 'Example web sources'}</strong>\n        <span>\n          {running&&!suspended?'Checking bundled sources…':`${shown.length} sources`} {expanded ? <UIIcon name=\"chevron-up\" /> : <UIIcon name=\"chevron-down\" />}\n        </span>\n      </button>\n      <div className=\"hp-web-trail-query\"><span aria-hidden=\"true\"><UIIcon name=\"search\" /></span><span><strong>{suspended?'Paused local reference sources':running?'Checking bundled sources':'Checked local reference sources'}</strong><small>{searched||query}</small></span></div>\n      {expanded && (\n        <ol aria-busy={running}>\n          {(revealed!==undefined?shown.slice(0,revealed):running?shown.slice(0,localRevealed):shown).map((source, index) => (\n            <li key={source.id}>\n              <button\n                type=\"button\"\n                disabled={disabled}\n                aria-expanded={active === source.id}\n                onClick={() => setActive(active === source.id ? null : source.id)}\n              >\n                <span className=\"hp-site-mark\" aria-hidden=\"true\">\n                  {source.icon||({react:'⚛',tailwind:'≈',github:'◉',reddit:'●',linkedin:'in',x:'𝕏',google:'G'} as Record<string,string>)[source.brand||source.id]||source.title[0]}\n                </span>\n                <span>\n                  <strong>{source.title}</strong>\n                  <small>{safeSourceURL(source.url)?.hostname || 'Source URL unavailable'}</small>\n                </span>\n                <b>{index + 1}</b>\n              </button>\n              {active === source.id && (\n                <div>\n                  <p>{source.description}</p>\n                  <a href={safeSourceURL(source.url)?.href} target=\"_blank\" rel=\"noreferrer\">Open source <UIIcon name=\"arrow-up-right\" /></a>\n                </div>\n              )}\n            </li>\n          ))}\n        </ol>\n      )}\n      <p className=\"hp-status\" role=\"status\">\n        {searched\n          ? `Showing ${shown.length} bundled example sources for “${searched}”.`\n          : 'This is a local source-discovery demonstration, not a live web search.'}\n      </p>\n      <details className=\"hp-run-conversation\"><summary>Try in a conversation</summary><WebSearchTrail disabled={disabled||suspended} autoRun={false} steps={[{label:'Ran bundled reference lookups',heading:true,icon:<UIIcon name=\"search\"/>},...sources.map(source=>({label:`Checked ${source.title}`,query:source.description,dwell:600,sources:[{title:source.title,href:source.url,brand:source.brand,icon:source.icon}]}))]}/><Composer disabled={disabled||suspended} placeholder=\"Search the bundled reference library…\" onSend={message=>{setQuery(message.text);setSearched(message.text);setRevealed(0);setRunning(true);setExpanded(true);onSearch?.(message.text)}}/></details>\n    </section>\n  );\n}\n\nexport type AgentConversation = {\n  id: string;\n  name: string;\n  role: string;\n  color: string;\n  messages: { author: string; text: string }[];\n  members?:AgentChatParticipant[];profile?:AgentProfile;customTitle?:string;pinned?:boolean;\n};\nconst defaultConversations: AgentConversation[] = [\n  {\n    id: 'design',\n    name: 'Design partner',\n    role: 'Design',\n    color: '#00CED1',\n    messages: [\n      {\n        author: 'Design partner',\n        text: 'I can help review the example interface. What should we improve first?',\n      },\n    ],\n  },\n  {\n    id: 'code',\n    name: 'Code assistant',\n    role: 'Code',\n    color: '#7847EB',\n    messages: [\n      { author: 'Code assistant', text: 'Share an example component to inspect its structure.' },\n    ],\n  },\n  {\n    id: 'research',\n    name: 'Research guide',\n    role: 'Research',\n    color: '#EF962D',\n    messages: [\n      {\n        author: 'Research guide',\n        text: 'Let’s collect the sources we need for the next decision.',\n      },\n    ],\n  },\n];\nexport type AgentChatParticipant = {id:string;name:string;role?:string;color?:string;profile?:AgentProfile};\nexport type AgentChatMessage = {author:string;text:string};\nexport type AgentWorkspace = {conversations?:AgentConversation[];agents?:AgentChatParticipant[];drafts?:Record<string,string>;selectedId?:string};\nexport type MultiAgentChatProps = {\n presentation?:'interactive'|'source';mobileSidebar?:boolean;availableAgents?:AgentChatParticipant[];sidebarActions?:ReactNode|((controls:{startChat:(members?:AgentChatParticipant[])=>void;createAgent:()=>void;closeSidebar:()=>void})=>ReactNode);sidebarFooter?:ReactNode|((controls:{clearSavedChat:()=>void;storageEnabled:boolean;storageNote:string;closeSidebar:()=>void})=>ReactNode);onEditorToggle?:(open:boolean,participant?:AgentChatParticipant)=>void;onMarketplace?:()=>void;\n disabled?:boolean;conversations?:AgentConversation[];threads?:AgentConversation[];onThreadsChange?:(threads:AgentConversation[])=>void;\n initialWorkspace?:AgentWorkspace;defaultEditorId?:string|null;storageKey?:string|null;\n onRespond?:(agent:AgentChatParticipant,messages:AgentChatMessage[],signal:AbortSignal)=>string|Promise<string>;\n};\nfunction validSavedWorkspace(value:unknown):value is {version:1;threads:AgentConversation[];agents?:AgentChatParticipant[];drafts:Record<string,string>;selected:string}{\n const v=value as any;return v?.version===1&&Array.isArray(v.threads)&&v.threads.every((t:any)=>t&&typeof t.id==='string'&&typeof t.name==='string'&&typeof t.role==='string'&&typeof t.color==='string'&&Array.isArray(t.messages)&&t.messages.every((m:any)=>typeof m.author==='string'&&typeof m.text==='string')&&(t.customTitle===undefined||typeof t.customTitle==='string')&&(t.pinned===undefined||typeof t.pinned==='boolean')&&(!t.members||Array.isArray(t.members)&&t.members.every((a:any)=>typeof a.id==='string'&&typeof a.name==='string')))&&(!v.agents||Array.isArray(v.agents)&&v.agents.every((a:any)=>a&&typeof a.id==='string'&&typeof a.name==='string'))&&v.drafts&&typeof v.drafts==='object'&&!Array.isArray(v.drafts)&&Object.values(v.drafts).every(x=>typeof x==='string')&&typeof v.selected==='string';\n}\nfunction useSourceModalDismiss(ref:React.RefObject<HTMLDivElement|null>,onClose:()=>void){const close=useRef(onClose);close.current=onClose;useEffect(()=>{const dialog=ref.current?.closest('dialog');if(!dialog)return;const click=(event:MouseEvent)=>{if(event.target!==dialog)return;const box=dialog.getBoundingClientRect();if(event.clientX<box.left||event.clientX>box.right||event.clientY<box.top||event.clientY>box.bottom)close.current()};dialog.addEventListener('click',click);return()=>dialog.removeEventListener('click',click)},[ref])}\nfunction SourceChatRename({value,disabled,onChange,onClose,onSave}:{value:string;disabled:boolean;onChange:(value:string)=>void;onClose:()=>void;onSave:()=>void}){const body=useRef<HTMLDivElement>(null);useSourceModalDismiss(body,onClose);useEffect(()=>{const input=body.current?.querySelector('input');input?.focus();input?.select()},[]);return <Dialog open onOpenChange={open=>{if(!open)onClose()}} title=\"Rename chat\" footer={<Button disabled={disabled||!value.trim()} onClick={onSave}>Save name</Button>}><div className=\"hp-source-rename\" ref={body}><button type=\"button\" className=\"hp-source-dialog-close\" aria-label=\"Close rename chat\" onClick={onClose}>×</button><Input label=\"Chat name\" value={value} maxLength={100} disabled={disabled} onChange={event=>onChange(event.target.value)} onKeyDown={event=>{if(event.key==='Enter'&&value.trim()&&!disabled){event.preventDefault();onSave()}}}/></div></Dialog>}\nfunction SourceChatContextMenu({position,onClose,onAction,disabled,readOnly,pinned,group}:{position:{x:number;y:number};onClose:()=>void;onAction:(action:string)=>void;disabled:boolean;readOnly:boolean;pinned:boolean;group:boolean}){const anchor=useRef<HTMLSpanElement>(null);return <><span ref={anchor} style={{position:'fixed',left:position.x,top:position.y,width:1,height:1,pointerEvents:'none'}}/><Popover {...{disableFocusManagement:true}} isOpen onOpenChange={open=>{if(!open)onClose()}} triggerRef={anchor} placement=\"bottom start\" offset={0} className=\"hp-source-context-popover\"><Menu aria-label=\"Chat actions\" autoFocus=\"first\" disabledKeys={disabled?['pin','rename','edit','copy','id','remove']:readOnly?['pin','rename','edit','remove']:[]} onAction={key=>onAction(String(key))} className=\"hp-source-context-menu\">{[['pin',pinned?'Unpin chat':'Pin chat','pin'],['rename','Rename chat','edit'],['edit',group?'Edit group':'Edit bot','users'],['copy','Copy conversation','copy'],['id','Copy conversation ID','copy'],['remove','Remove chat','trash']].map(([id,label,icon])=><MenuItem key={id} id={id} textValue={label} className=\"hp-source-context-item\">{icon==='pin'?<RiPushpinLine size={20} aria-hidden=\"true\"/>:<UIIcon name={icon as React.ComponentProps<typeof UIIcon>['name']}/>}<span>{label}</span></MenuItem>)}</Menu></Popover></>}\nfunction SourceChatPicker({mode,agents,ids,disabled,onToggle,onClose,onSave}:{mode:'start'|'edit';agents:AgentChatParticipant[];ids:string[];disabled:boolean;onToggle:(id:string)=>void;onClose:()=>void;onSave:()=>void}){const body=useRef<HTMLDivElement>(null);useSourceModalDismiss(body,onClose);const title=mode==='edit'?'Edit group':'Chat with your agents',picked=agents.filter(member=>ids.includes(member.id));return <Dialog open onOpenChange={open=>{if(!open)onClose()}} title={title} footer={<Button disabled={disabled||!ids.length} onClick={onSave}>{mode==='edit'?'Save changes':'Start chat'}{ids.length?` · ${ids.length} ${ids.length===1?'agent':'agents'}`:''}</Button>}><div className=\"hp-source-chat-picker\" ref={body}><button type=\"button\" className=\"hp-source-dialog-close\" aria-label={`Close ${title.toLowerCase()}`} onClick={onClose}>×</button><div className=\"hp-source-picker-intro\"><div className=\"hp-source-picker-art\" role=\"img\" aria-label={picked.length?`Selected agents: ${picked.map(a=>a.name).join(', ')}`:'No agents selected'}>{picked.slice(0,3).map((member,index)=><SourceAgentArtwork key={member.id} shape={member.profile?.shape||(['shield','star','diamond']as const)[index]} expression={member.profile?.expression||'neutral'} color={member.color||member.profile?.color||'#a5dfde'} name={member.name} animated={false}/>)}</div><p>Choose who’s joining the conversation.</p></div><div className=\"hp-source-picker-scroll\" tabIndex={0} aria-label={`${title} content`}><div role=\"group\" aria-label=\"Choose agents\" className=\"hp-source-picker-chips\">{agents.map(member=><button type=\"button\" key={member.id} aria-label={member.name} aria-pressed={ids.includes(member.id)} disabled={disabled} onClick={()=>onToggle(member.id)}><SourceAgentArtwork shape={member.profile?.shape||'cloud'} expression={member.profile?.expression||'neutral'} color={member.color||member.profile?.color||'#a5dfde'} name={member.name} animated={false}/><span>{member.name}</span></button>)}</div></div></div></Dialog>}\nconst SourceConversationArtworkColors=createContext(false);\nexport function MultiAgentChat({disabled=false,conversations=defaultConversations,threads:controlledThreads,onThreadsChange,initialWorkspace,defaultEditorId=null,storageKey=null,onRespond,presentation='interactive',mobileSidebar=false,availableAgents=[],sidebarActions,sidebarFooter,onEditorToggle,onMarketplace}:MultiAgentChatProps){\n const seed=useRef<AgentConversation[]>(initialWorkspace?.conversations??(initialWorkspace?.agents?.map(agent=>({id:agent.id,name:agent.name,role:agent.role||'Agent',color:agent.color||'#3392ff',profile:agent.profile,messages:[]})))??controlledThreads??conversations),seedDrafts=useRef(initialWorkspace?.drafts||{}),seedSelected=useRef(initialWorkspace?.selectedId||seed.current[0]?.id||'');\n const [localThreads,setLocalThreads]=useState(seed.current),threads=controlledThreads??localThreads,[selected,setSelected]=useState(seedSelected.current),[drafts,setDrafts]=useState<Record<string,string>>(seedDrafts.current),[showCreator,setShowCreator]=useState(!!defaultEditorId),[editingId,setEditingId]=useState<string|null>(defaultEditorId),[agentQuery,setAgentQuery]=useState(''),[agent,setAgent]=useState<AgentProfile>(()=>{const a=seed.current.find(t=>t.id===defaultEditorId)||seed.current.flatMap(t=>t.members||[]).find(a=>a.id===defaultEditorId);return a?.profile??{...defaultAgent,...(a?{name:a.name,label:a.role||'Agent',color:a.color||defaultAgent.color}:{})}}),[replyState,setReplyState]=useState<Record<string,'working'|'error'|undefined>>({}),[replyNotes,setReplyNotes]=useState<Record<string,string>>({}),[storageNote,setStorageNote]=useState(''),[hydratedKey,setHydratedKey]=useState<string|null>(null),[persistenceEnabled,setPersistenceEnabled]=useState(true);\n const liveThreads=useRef(threads),changeCallback=useRef(onThreadsChange),respondCallback=useRef(onRespond),aborters=useRef<Record<string,AbortController>>({}),retryRequests=useRef<Record<string,{members:AgentChatParticipant[];history:AgentChatMessage[]}>>({});liveThreads.current=threads;changeCallback.current=onThreadsChange;respondCallback.current=onRespond;\n const readonly=controlledThreads!==undefined&&!onThreadsChange,current=threads.find(t=>t.id===selected),draft=drafts[selected]||'',participants=(thread:AgentConversation):AgentChatParticipant[]=>thread.members?.length?thread.members:[{id:thread.id,name:thread.name,role:thread.role,color:thread.color,profile:thread.profile}];\n const conversationTitle=(thread:AgentConversation)=>presentation==='source'&&thread.members?.length?thread.members.map(member=>member.profile?.label||member.role||member.name).join(' + '):thread.name;\n const updateThreads=(next:AgentConversation[]|((old:AgentConversation[])=>AgentConversation[]))=>{const value=typeof next==='function'?next(liveThreads.current):next;liveThreads.current=value;setLocalThreads(value);changeCallback.current?.(value)};\n const enablePersistence=()=>{if(storageKey)setPersistenceEnabled(true)};\n const stopAll=()=>{Object.values(aborters.current).forEach(controller=>controller.abort());aborters.current={};setReplyState({})};\n useEffect(()=>()=>Object.values(aborters.current).forEach(controller=>controller.abort()),[]);\n useEffect(()=>{if(!storageKey){setHydratedKey(null);return;}let restoredThreads=seed.current,restoredAgents:AgentChatParticipant[]=initialWorkspace?.agents||[],restoredDrafts=seedDrafts.current,restoredSelected=seedSelected.current,enabled=true;try{const raw=localStorage.getItem(storageKey);if(raw){const stored=JSON.parse(raw);if(!validSavedWorkspace(stored))throw Error('Invalid saved workspace');restoredThreads=stored.threads;restoredAgents=stored.agents||[];restoredDrafts=stored.drafts;restoredSelected=stored.threads.some(t=>t.id===stored.selected)?stored.selected:stored.threads[0]?.id||'';setStorageNote('Saved chat restored in this browser.')}else setStorageNote('Browser saving is enabled for this local workspace.')}catch{enabled=false;setStorageNote('Saved chat could not be restored. The starting local example is available; clear the saved chat to recover.')}stopAll();catalogRef.current.clear();for(const member of restoredAgents)catalogRef.current.set(member.id,member);updateThreads(restoredThreads);setDrafts(restoredDrafts);setSelected(restoredSelected);setPersistenceEnabled(enabled);setHydratedKey(storageKey)},[storageKey]);\n useEffect(()=>{if(!storageKey||hydratedKey!==storageKey||!persistenceEnabled)return;try{localStorage.setItem(storageKey,JSON.stringify({version:1,threads,agents:[...catalogRef.current.values()],drafts,selected}))}catch{setStorageNote('Browser saving is unavailable or full. This conversation remains in memory.')}},[storageKey,hydratedKey,persistenceEnabled,threads,drafts,selected]);\n const append=(id:string,messages:AgentChatMessage[])=>updateThreads(list=>list.map(t=>t.id===id?{...t,messages:[...t.messages,...messages]}:t));\n const runResponse=async(id:string,members:AgentChatParticipant[],history:AgentChatMessage[])=>{const callback=respondCallback.current;if(!callback)return;aborters.current[id]?.abort();const controller=new AbortController();aborters.current[id]=controller;setReplyState(old=>({...old,[id]:'working'}));setReplyNotes(old=>({...old,[id]:''}));const failed:AgentChatParticipant[]=[];await Promise.all(members.map(async member=>{try{const text=await callback(member,history,controller.signal);if(controller.signal.aborted)return;if(typeof text!=='string'||!text.trim())throw Error('Empty response');append(id,[{author:member.name,text}])}catch{if(!controller.signal.aborted)failed.push(member)}}));if(controller.signal.aborted)return;delete aborters.current[id];retryRequests.current[id]={members:failed,history};setReplyState(old=>({...old,[id]:failed.length?'error':undefined}));setReplyNotes(old=>({...old,[id]:failed.length?'A response could not complete. Retry the failed participant responses.':'Responses received through your application callback.'}))};\n const send=(text=draft)=>{if(!text.trim()||disabled||readonly||!current||replyState[current.id]==='working')return;enablePersistence();const id=current.id,history=[...current.messages,{author:'You',text:text.trim()}],members=participants(current);append(id,[history[history.length-1]]);setDrafts(old=>({...old,[id]:''}));if(respondCallback.current){void runResponse(id,members,history)}else{append(id,members.map(member=>({author:member.name,text:`Local example from ${member.name} received “${text.trim().slice(0,60)}”. Connect an authorized provider to generate real responses.`})));setReplyNotes(old=>({...old,[id]:'Deterministic local example replies; no AI or external service ran.'}))}};\n const stop=(id:string)=>{aborters.current[id]?.abort();delete aborters.current[id];setReplyState(old=>({...old,[id]:undefined}));setReplyNotes(old=>({...old,[id]:'Response stopped. The conversation and other drafts are preserved.'}))};\n const edit=(participant:AgentChatParticipant)=>{setEditingId(participant.id);setAgent(participant.profile??{...defaultAgent,name:participant.name,label:participant.role||'Agent',color:participant.color||defaultAgent.color});if(presentation!=='source'||!onEditorToggle)setShowCreator(true);onEditorToggle?.(true,participant)};\n const clearSaved=()=>{if(disabled||readonly)return;stopAll();catalogRef.current.clear();setPersistenceEnabled(false);if(storageKey)try{localStorage.removeItem(storageKey)}catch{}updateThreads(seed.current);setDrafts(seedDrafts.current);setSelected(seedSelected.current);setReplyNotes({});setStorageNote('Saved chat cleared. The starting local workspace is restored; saving resumes on your next change.')};\n const [picker,setPicker]=useState<{mode:'start'|'edit';targetId?:string;ids:string[]}|null>(null),[rename,setRename]=useState<{id:string;value:string}|null>(null),[context,setContext]=useState<{id:string;x:number;y:number}|null>(null),[optionsOpen,setOptionsOpen]=useState(false),[toast,setToast]=useState('');\n const contextFocusFrame=useRef(0),dialogReturn=useRef<HTMLElement|null>(null),contextReturn=useRef<HTMLButtonElement|null>(null),toastTimer=useRef<ReturnType<typeof setTimeout>|null>(null);\n useEffect(()=>()=>{if(toastTimer.current)clearTimeout(toastTimer.current);cancelAnimationFrame(contextFocusFrame.current)},[]);\n const notify=(message:string)=>{setToast(message);if(toastTimer.current)clearTimeout(toastTimer.current);toastTimer.current=setTimeout(()=>setToast(''),3500)};\n const catalogRef=useRef(new Map<string,AgentChatParticipant>()),catalog=catalogRef.current;\n for(const member of [...availableAgents,...(initialWorkspace?.agents||[]),...threads.filter(t=>!t.members?.length).map(t=>participants(t)[0]),...threads.flatMap(t=>t.members||[])])catalog.set(member.id,member);\n const agents=[...catalog.values()],orderedThreads=presentation==='source'?[...threads.filter(t=>t.pinned),...threads.filter(t=>!t.pinned)]:threads;\n const startChat=(members:AgentChatParticipant[]=[])=>{if(disabled||readonly)return;dialogReturn.current=document.activeElement as HTMLElement;setOptionsOpen(false);setPicker({mode:'start',ids:members.map(member=>member.id)})};\n const createAgent=()=>{if(disabled||readonly)return;enablePersistence();const base=agents.find(a=>a.id===editingId)||agents.find(a=>a.profile?.shape==='diamond')||agents[0],baseName=base?.name||'New agent';let number=2,name=`${baseName} ${number}`;while(threads.some(t=>t.name===name))name=`${baseName} ${++number}`;const profile={...(base?.profile||defaultAgent),name,label:'',description:''},id='agent-'+crypto.randomUUID(),participant={id,name,role:'',color:profile.color,profile};updateThreads(list=>[{...participant,messages:[]},...list]);setSelected(id);setAgentQuery('');setNavOpen(false);edit(participant)};\n const savePicker=()=>{if(!picker||!picker.ids.length||disabled||readonly)return;enablePersistence();const members=picker.ids.map(id=>catalog.get(id)).filter((a):a is AgentChatParticipant=>!!a);if(!members.length)return;const title=members.map(a=>a.profile?.label||a.role||a.name).join(' + ');if(picker.mode==='edit'&&picker.targetId){stop(picker.targetId);updateThreads(list=>list.map(t=>t.id===picker.targetId?{...t,name:title,members}:t));setSelected(picker.targetId)}else if(members.length===1){const member=members[0],existing=threads.find(t=>!t.members?.length&&(t.id===member.id||t.name===member.name));if(existing)setSelected(existing.id);else{const id=member.id;updateThreads(list=>[{id,name:member.name,role:member.role||'',color:member.color||member.profile?.color||'#3392ff',profile:member.profile,messages:[]},...list]);setSelected(id)}}else{const id='group-'+crypto.randomUUID();updateThreads(list=>[{id,name:title,role:'Group conversation',color:members[0].color||members[0].profile?.color||'#3392ff',members,messages:[]},...list]);setSelected(id)}setPicker(null);setAgentQuery('');setNavOpen(false)};\n const copyConversation=async(thread:AgentConversation,idOnly=false)=>{try{await navigator.clipboard.writeText(idOnly?thread.id:thread.messages.map(message=>`${message.author}: ${message.text}`).join('\\n\\n'));notify(idOnly?'Conversation ID copied':'Conversation copied')}catch{notify('Clipboard unavailable. Allow clipboard access and try again.')}};\n const closeContext=(restore=true)=>{setContext(null);cancelAnimationFrame(contextFocusFrame.current);if(restore)contextFocusFrame.current=requestAnimationFrame(()=>contextReturn.current?.focus())};\n const openContext=(id:string,x:number,y:number,target:HTMLButtonElement)=>{cancelAnimationFrame(contextFocusFrame.current);contextReturn.current=target;setContext({id,x,y})};\n const contextAction=(action:string)=>{if(disabled)return;const target=threads.find(t=>t.id===context?.id);if(!target)return;closeContext(action!=='remove');if(action==='copy'||action==='id'){void copyConversation(target,action==='id');return}if(disabled||readonly)return;enablePersistence();if(action==='pin')updateThreads(list=>list.map(t=>t.id===target.id?{...t,pinned:!t.pinned}:t));if(action==='rename'){dialogReturn.current=contextReturn.current;setRename({id:target.id,value:target.customTitle??target.name})}if(action==='edit'){if(target.members?.length){dialogReturn.current=contextReturn.current;setPicker({mode:'edit',targetId:target.id,ids:target.members.map(member=>member.id)})}else edit(participants(target)[0])}if(action==='remove'){stop(target.id);const index=orderedThreads.findIndex(t=>t.id===target.id),next=orderedThreads[index-1]||orderedThreads[index+1];updateThreads(list=>list.filter(t=>t.id!==target.id));setDrafts(old=>{const copy={...old};delete copy[target.id];return copy});if(selected===target.id)setSelected(next?.id||'')}};\n const closePicker=()=>{setPicker(null);requestAnimationFrame(()=>dialogReturn.current?.isConnected&&dialogReturn.current.focus())};\n const closeRename=()=>{setRename(null);requestAnimationFrame(()=>dialogReturn.current?.isConnected&&dialogReturn.current.focus())};\n const contextThread=threads.find(t=>t.id===context?.id);\n const[sourceSearchOpen,setSourceSearchOpen]=useState(false);\n const[narrow,setNarrow]=useState(false),[navOpen,setNavOpen]=useState(false),[sourceModel,setSourceModel]=useState('anthropic/fable-5');\n useEffect(()=>{if(!mobileSidebar||presentation!=='source'){setNarrow(false);return}const query=window.matchMedia('(max-width:639px)'),update=()=>setNarrow(query.matches);update();query.addEventListener('change',update);return()=>query.removeEventListener('change',update)},[mobileSidebar,presentation]);\n const mobileNav=presentation==='source'&&mobileSidebar&&narrow;\n useEffect(()=>{if(!mobileNav)setNavOpen(false)},[mobileNav]);\n const storageControls=storageKey?<div className=\"hp-chat-storage\"><Button variant=\"tertiary\" size=\"sm\" disabled={disabled||readonly} onClick={clearSaved}>Clear saved chat</Button><p role=\"status\">{storageNote}</p></div>:null;\n const footerControls={clearSavedChat:clearSaved,storageEnabled:!!storageKey,storageNote,closeSidebar:()=>setNavOpen(false)};\nconst sourceEmptyGroup=presentation==='source'&&!!current?.members?.length&&current.messages.length===0;\nconst sidebar=<aside className=\"hp-source-agent-navigation\">{presentation==='source'&&<div className=\"hp-source-multi-actions\"><Button variant=\"tertiary\" size=\"sm\" iconOnly leadingIcon={<UIIcon name=\"search\"/>} aria-label=\"Search agents\" aria-expanded={sourceSearchOpen} disabled={disabled} onClick={()=>setSourceSearchOpen(!sourceSearchOpen)}><UIIcon name=\"search\"/></Button>{typeof sidebarActions==='function'?sidebarActions({startChat,createAgent,closeSidebar:()=>setNavOpen(false)}):sidebarActions}{!sidebarActions&&onMarketplace&&<Button variant=\"tertiary\" size=\"sm\" iconOnly leadingIcon={<UIIcon name=\"grid\"/>} aria-label=\"Plugin marketplace\" disabled={disabled} onClick={()=>{setNavOpen(false);onMarketplace()}}><UIIcon name=\"grid\"/></Button>}</div>}<strong>Your agents</strong><Input label=\"Search agents\" type=\"search\" value={agentQuery} disabled={disabled} onChange={e=>setAgentQuery(e.target.value)}/>{orderedThreads.filter(t=>((t.customTitle||conversationTitle(t))+' '+t.role).toLowerCase().includes(agentQuery.toLowerCase())).map(t=><button key={t.id} type=\"button\" disabled={disabled} onContextMenu={event=>{if(presentation!=='source')return;event.preventDefault();openContext(t.id,event.clientX,event.clientY,event.currentTarget)}} onKeyDown={event=>{if(presentation!=='source'||!(event.key==='ContextMenu'||event.shiftKey&&event.key==='F10'))return;event.preventDefault();const box=event.currentTarget.getBoundingClientRect();openContext(t.id,box.left+Math.min(box.width,120),box.bottom,event.currentTarget)}} aria-haspopup={presentation==='source'?'menu':undefined} aria-expanded={presentation==='source'?context?.id===t.id:undefined} aria-current={t.id===selected?'page':undefined} onClick={()=>{enablePersistence();setSelected(t.id);setNavOpen(false)}}>{presentation==='source'?(t.members?.length?<span className=\"hp-source-group-avatar\" aria-hidden=\"true\">{t.members.slice(0,3).map((member,index)=><SourceAgentArtwork key={member.id} shape={member.profile?.shape||(['shield','star','diamond']as const)[index]} expression={member.profile?.expression||(index===1?'happy':'neutral')} color={member.color||member.profile?.color||['#d3ee97','#a5dfde','#97bbed'][index]} name={member.name} animated={false}/>)}</span>:<SourceAgentArtwork shape={t.profile?.shape||'cloud'} expression={t.profile?.expression||'thinking'} color={t.color} name={t.name} animated={false}/>):<span style={{backgroundColor:t.color}}/>}<span className=\"hp-source-thread-label\"><strong>{t.customTitle??conversationTitle(t)}</strong><small>{presentation==='source'?(t.messages.at(-1)?.text||'Start a conversation'):<>{t.role}{t.members?.length?` · ${t.members.length} participants`:''}</>}</small></span>{presentation==='source'&&t.pinned&&<span className=\"hp-source-pinned\" role=\"img\" aria-label=\"Pinned chat\"><RiPushpinLine size={16}/></span>}</button>)}{!threads.some(t=>((t.customTitle||conversationTitle(t))+' '+t.role).toLowerCase().includes(agentQuery.toLowerCase()))&&<p className=\"hp-note\">No agents match this search.</p>}<Button variant=\"secondary\" disabled={disabled||readonly} onClick={()=>{if(presentation==='source'){createAgent();return}setEditingId(null);setAgent(defaultAgent);setShowCreator(true);onEditorToggle?.(true)}}>Create agent</Button>{presentation==='source'&&storageKey&&typeof sidebarFooter!=='function'&&<details className=\"hp-source-chat-data\"><summary>Chat data</summary><div>{storageControls}<p>Replies are local examples. Only this demo’s saved chat key is cleared.</p></div></details>}{sidebarFooter&&<div className=\"hp-source-sidebar-footer\">{typeof sidebarFooter==='function'?sidebarFooter(footerControls):sidebarFooter}</div>}{context&&contextThread&&<NativeScope><SourceChatContextMenu position={context} onClose={()=>closeContext()} onAction={contextAction} disabled={disabled} readOnly={readonly} pinned={!!contextThread.pinned} group={!!contextThread.members?.length}/></NativeScope>}</aside>;\nreturn <SourceConversationArtworkColors.Provider value={presentation==='source'}><section className=\"hp-multi-chat\" data-presentation={presentation} data-search-open={sourceSearchOpen} data-mobile-sidebar={mobileNav||undefined}>{mobileNav?(navOpen&&<Dialog open onOpenChange={setNavOpen} title=\"Agent navigation\"><NativeScope><div className=\"hp-source-mobile-nav-content\"><button type=\"button\" className=\"hp-source-mobile-nav-close\" aria-label=\"Close conversations\" onClick={()=>setNavOpen(false)}><UIIcon name=\"close\"/></button>{sidebar}</div></NativeScope></Dialog>):sidebar}<div className=\"hp-multi-conversation\"><header>{mobileNav&&<Button variant=\"tertiary\" size=\"sm\" iconOnly leadingIcon={<RiMenuLine size={20}/>} aria-label=\"Open conversations\" aria-haspopup=\"dialog\" aria-expanded={navOpen} disabled={disabled} onClick={()=>setNavOpen(true)}/>}{presentation==='source'?<><button type=\"button\" className=\"hp-source-conversation-title\" disabled={disabled||readonly||!current} onClick={()=>{if(current){if(current.members?.length)startChat(participants(current));else edit(participants(current)[0])}}}>{current&&(current.members?.length?<span className=\"hp-source-title-group-avatar\" aria-hidden=\"true\">{current.members.slice(0,3).map((member,index)=><SourceAgentArtwork key={member.id} shape={member.profile?.shape||(['shield','star','diamond']as const)[index]} expression={member.profile?.expression||(index===1?'happy':'neutral')} color={member.color||member.profile?.color||['#d3ee97','#a5dfde','#97bbed'][index]} name={member.name} animated={false}/>)}</span>:<SourceAgentArtwork shape={current.profile?.shape||'cloud'} expression={current.profile?.expression||'thinking'} color={current.color} name={current.name} animated={false}/>)}<span>{current?conversationTitle(current):'Choose an agent'}</span></button><div className=\"hp-source-conversation-tools\"><Button variant=\"tertiary\" size=\"sm\" iconOnly leadingIcon={<RiShare2Line size={16}/>} aria-label=\"Copy conversation\" title=\"Copy conversation\" disabled={disabled||!current} onClick={()=>current&&void copyConversation(current)}/><NativeScope><Dropdown isOpen={optionsOpen} onOpenChange={setOptionsOpen}><DropdownTrigger className=\"hp-source-options-trigger\" aria-label=\"Conversation options\" isDisabled={disabled||readonly||!current}><RiMoreFill size={16} aria-hidden=\"true\"/></DropdownTrigger><DropdownPopover aria-label=\"Conversation options\" placement=\"bottom end\" className=\"hp-source-conversation-popover\" dialogClassName=\"hp-source-conversation-menu\"><DropdownGroup label=\"In this conversation\">{current&&participants(current).map(member=><DropdownItem key={member.id} onSelect={()=>{setOptionsOpen(false);edit(member)}}><span className=\"hp-source-options-art\" aria-hidden=\"true\"><SourceAgentArtwork shape={member.profile?.shape||'cloud'} expression={member.profile?.expression||'neutral'} color={member.color||member.profile?.color||'#a5dfde'} name={member.name} animated={false}/></span><span>Edit {member.name}</span></DropdownItem>)}<DropdownItem onSelect={()=>current&&startChat(participants(current))}><RiUserAddLine size={16} aria-hidden=\"true\"/><span>Start a group chat</span></DropdownItem></DropdownGroup></DropdownPopover></Dropdown></NativeScope></div></>:<><h3>{current?.name||'Choose an agent'}</h3><div className=\"hp-multi-header-actions\"><span className=\"hu-badge\">{onRespond?'Application callback':'Local example'}</span>{current&&!current.members?.length&&<Button variant=\"tertiary\" size=\"sm\" disabled={disabled||readonly} onClick={()=>edit(participants(current)[0])}>Edit agent</Button>}</div></>}</header>{current?.members?.length&&!sourceEmptyGroup&&<ul className=\"hp-chat-members\" aria-label=\"Conversation participants\">{current.members.map(member=><li key={member.id}><span className=\"hp-chat-member-avatar\" style={{background:member.color||'var(--hu-brand)'}} aria-hidden=\"true\"/><span>{member.name}<small>{member.role}</small></span><Button variant=\"tertiary\" size=\"sm\" iconOnly leadingIcon={<UIIcon name=\"edit\"/>} aria-label={`Edit ${member.name}`} disabled={disabled||readonly} onClick={()=>edit(member)}><UIIcon name=\"edit\"/></Button></li>)}</ul>}<div role=\"log\" tabIndex={0} aria-label=\"Agent conversation\" data-source-empty-group={sourceEmptyGroup||undefined}>{presentation==='source'&&!!current?.messages.length&&<div className=\"hp-source-chat-day\"><span>Today</span></div>}{sourceEmptyGroup&&<div className=\"hp-source-chat-empty\"><div className=\"hp-source-chat-empty-art\" role=\"img\" aria-label={`Selected agents: ${current!.members!.map(member=>member.name).join(', ')}`}>{current!.members!.slice(0,3).map((member,index)=><div key={member.id} aria-hidden=\"true\"><SourceAgentArtwork shape={member.profile?.shape||(['shield','star','diamond']as const)[index]} expression={member.profile?.expression||(index===1?'happy':'neutral')} color={member.color||member.profile?.color||['#d3ee97','#a5dfde','#97bbed'][index]} name={member.name}/></div>)}</div><div className=\"hp-source-chat-empty-copy\"><h2>A few minds. One conversation.</h2><p>{current!.members!.map(member=>member.name).join(', ')} are here. Send a message to get everyone’s perspective.</p></div></div>}{current?.messages.map((message,index)=><article key={index} data-author={message.author==='You'?'user':'agent'}><strong>{message.author}</strong><p>{message.text}</p></article>)}</div>{current&&replyState[current.id]==='error'&&<div role=\"alert\" className=\"hp-native-error\"><p>{replyNotes[current.id]}</p><Button variant=\"secondary\" disabled={disabled||readonly} onClick={()=>{const request=retryRequests.current[current.id];if(request)void runResponse(current.id,request.members,current.messages)}}>Retry response</Button></div>}<div className=\"hp-multi-composer\">{presentation==='source'?<SourceComposer layout=\"panel\" minRows={1} defaultPermission=\"Bypass all\" model={sourceModel} onModelChange={setSourceModel} status={null} disabled={disabled||readonly||!current} working={!!current&&replyState[current.id]==='working'} onStop={()=>current&&stop(current.id)} value={draft} onValueChange={value=>{enablePersistence();setDrafts(old=>({...old,[selected]:value}))}} placeholder=\"Hi, what do you need today?\" showLocalMessages={false} onSend={message=>send(message.text)}/>:<ComposerPanel disabled={disabled||readonly||!current} working={!!current&&replyState[current.id]==='working'} onStop={()=>current&&stop(current.id)} value={draft} onValueChange={value=>{enablePersistence();setDrafts(old=>({...old,[selected]:value}))}} placeholder=\"How can your agents help?\" showLocalMessages={false} onSend={message=>send(message.text)}/> }</div><p className=\"hp-note\">{onRespond?'Responses use your application callback. This component does not configure or activate a provider.':'Replies are deterministic local fixtures. No AI inference or external service runs.'}</p>{current&&replyState[current.id]!=='error'&&<p className=\"hp-status\" role=\"status\">{replyNotes[current.id]}</p>}{presentation!=='source'&&typeof sidebarFooter!=='function'&&storageControls}</div>{picker&&<SourceChatPicker mode={picker.mode} agents={agents} ids={picker.ids} disabled={disabled||readonly} onToggle={id=>setPicker(old=>old?{...old,ids:old.ids.includes(id)?old.ids.filter(value=>value!==id):[...old.ids,id]}:old)} onClose={closePicker} onSave={savePicker}/>} {rename&&<SourceChatRename value={rename.value} disabled={disabled||readonly} onChange={value=>setRename({...rename,value})} onClose={closeRename} onSave={()=>{enablePersistence();updateThreads(list=>list.map(t=>t.id===rename.id?{...t,customTitle:rename.value.trim()}:t));closeRename()}}/>}{toast&&<div className=\"hp-source-chat-toast\" role=\"status\"><UIIcon name=\"check\"/>{toast}</div>}<Dialog open={showCreator} onOpenChange={open=>{setShowCreator(open);onEditorToggle?.(open)}} title={editingId?'Edit an example agent':'Create an example agent'} footer={<><Button variant=\"secondary\" onClick={()=>setShowCreator(false)}>Cancel</Button><Button disabled={disabled||readonly||!agent.name.trim()} onClick={()=>{enablePersistence();if(editingId){updateThreads(list=>list.map(t=>({...t,...(t.id===editingId?{name:agent.name,role:agent.label,color:agent.color,profile:agent}:{}),members:t.members?.map(member=>member.id===editingId?{...member,name:agent.name,role:agent.label,color:agent.color,profile:agent}:member)})))}else{const id='agent-'+Date.now();updateThreads(list=>[...list,{id,name:agent.name,role:agent.label,color:agent.color,profile:agent,messages:[{author:agent.name,text:'This local agent is ready to explore the interface.'}]}]);setSelected(id);setAgentQuery('')}setShowCreator(false)}}>{editingId?'Save agent':'Add agent'}</Button></>}><div className={presentation==='source'?'hp-source-internal-editor':undefined}>{presentation==='source'?<SourceAgentCreator agent={agent} onChange={setAgent} onClose={()=>{setShowCreator(false);onEditorToggle?.(false)}} disabled={disabled||readonly}/>:<AgentCreator agent={agent} onChange={setAgent} onClose={()=>setShowCreator(false)} disabled={disabled||readonly}/>}</div></Dialog></section></SourceConversationArtworkColors.Provider>;\n}\n\nexport const agentPatternIds = [\n  'agent-creator',\n  'agent-limits-card',\n  'agent-progress',\n  'agent-thinking',\n  'auth-card',\n  'composer',\n  'composer-attachments',\n  'composer-loader',\n  'composer-panel',\n  'notification-center',\n  'questionnaire',\n  'task-list',\n  'web-search',\n  'multi-agent-chat',\n] as const;\nexport function AgentPattern({\n  id,\n  state = 'ready',\n  onRetry,\n  disabled = false,\n  size = 'md',\n  ...props\n}: FamilyProps & { id: string; [key:string]:unknown }) {\n  const [emptyAgent,setEmptyAgent]=useState<AgentProfile>({...defaultAgent,name:'',label:'',description:''}),[emptyTasks,setEmptyTasks]=useState<Task[]>([]),[emptyNotifications,setEmptyNotifications]=useState<CenterNotification[]>([]),[emptyActive,setEmptyActive]=useState(false);\n  useEffect(()=>{if(state==='empty'){setEmptyAgent({...defaultAgent,name:'',label:'',description:''});setEmptyTasks([]);setEmptyNotifications([]);setEmptyActive(false)}},[state,id]);\n  const loading=state==='loading',empty=state==='empty',processFamily=['agent-progress','agent-thinking','composer','composer-attachments','composer-loader','composer-panel','task-list','web-search'].includes(id),nativeDisabled=disabled||(loading&&!processFamily)||(id==='agent-thinking'&&state==='error'&&!onRetry);\n  const typed=props as any,restore=()=>onRetry?.();\n  const extra:Record<string,any>={};\n  if(id==='agent-creator'&&empty)Object.assign(extra,{agent:emptyAgent,onChange:(next:AgentProfile)=>{setEmptyAgent(next);typed.onChange?.(next)}});\n  if(id==='agent-limits-card'&&empty)Object.assign(extra,{segments:[],limits:[]});\n  if(id==='agent-progress'&&empty)extra.steps=[];\n  if(['agent-progress','task-list','web-search'].includes(id)&&state==='error')extra.suspended=true;\n  if(id==='agent-thinking'&&state==='error')Object.assign(extra,{active:false,onActiveChange:(next:boolean)=>{typed.onActiveChange?.(next);if(next)restore()}});\n  if(id==='agent-thinking'&&empty)Object.assign(extra,{active:emptyActive,onActiveChange:(next:boolean)=>{setEmptyActive(next);typed.onActiveChange?.(next)}});\n  if(id==='auth-card')extra.loading=loading;\n  if(['composer','composer-attachments','composer-panel'].includes(id))Object.assign(extra,{state,onRetry,onStop:()=>{typed.onStop?.();restore()}});\n  if(id==='composer-loader'&&state!=='ready')Object.assign(extra,{active:loading,onActiveChange:(next:boolean)=>{typed.onActiveChange?.(next);restore()}});\n  if(id==='notification-center'&&empty)Object.assign(extra,{notifications:emptyNotifications,onChange:(next:CenterNotification[])=>{setEmptyNotifications(next);typed.onChange?.(next)}});\n  if(id==='questionnaire'&&empty)extra.questions=[];\n  if(id==='task-list'&&empty)Object.assign(extra,{tasks:emptyTasks,autoRun:false,onChange:(next:Task[])=>{setEmptyTasks(next);typed.onChange?.(next)}});\n  if(id==='web-search'&&empty)Object.assign(extra,{sources:[],autoRun:false});\n  if(id==='multi-agent-chat'&&empty)extra.conversations=[];\n  const nativeProps={...props,...extra};\n  let content: ReactNode;\n  switch (id) {\n    case 'agent-creator':\n      content = <AgentCreator {...(nativeProps as React.ComponentProps<typeof AgentCreator>)} disabled={nativeDisabled} />;\n      break;\n    case 'agent-limits-card':\n      content = <AgentLimitsCard {...(nativeProps as React.ComponentProps<typeof AgentLimitsCard>)} disabled={nativeDisabled} />;\n      break;\n    case 'agent-progress':\n      content = <AgentProgress {...(nativeProps as React.ComponentProps<typeof AgentProgress>)} disabled={nativeDisabled} />;\n      break;\n    case 'agent-thinking':\n      content = <AgentThinking {...(nativeProps as React.ComponentProps<typeof AgentThinking>)} disabled={nativeDisabled} />;\n      break;\n    case 'auth-card':\n      content = <AuthCard {...(nativeProps as React.ComponentProps<typeof AuthCard>)} disabled={nativeDisabled} />;\n      break;\n    case 'composer':\n      content = <Composer {...(nativeProps as React.ComponentProps<typeof Composer>)} disabled={nativeDisabled} />;\n      break;\n    case 'composer-attachments':\n      content = <ComposerAttachments {...(nativeProps as React.ComponentProps<typeof ComposerAttachments>)} disabled={nativeDisabled} />;\n      break;\n    case 'composer-loader':\n      content = <ComposerLoader {...(nativeProps as React.ComponentProps<typeof ComposerLoader>)} disabled={nativeDisabled} />;\n      break;\n    case 'composer-panel':\n      content = <ComposerPanel {...(nativeProps as React.ComponentProps<typeof ComposerPanel>)} disabled={nativeDisabled} />;\n      break;\n    case 'notification-center':\n      content = <NotificationCenter {...(nativeProps as React.ComponentProps<typeof NotificationCenter>)} disabled={nativeDisabled} />;\n      break;\n    case 'questionnaire':\n      content = <Questionnaire {...(nativeProps as React.ComponentProps<typeof Questionnaire>)} disabled={nativeDisabled} />;\n      break;\n    case 'task-list':\n      content = <TaskList {...(nativeProps as React.ComponentProps<typeof TaskList>)} disabled={nativeDisabled} />;\n      break;\n    case 'web-search':\n      content = <WebSearch {...(nativeProps as React.ComponentProps<typeof WebSearch>)} disabled={nativeDisabled} />;\n      break;\n    case 'multi-agent-chat':\n      content = <MultiAgentChat key={empty?'empty':'native'} {...(nativeProps as React.ComponentProps<typeof MultiAgentChat>)} disabled={nativeDisabled} />;\n      break;\n    default:\n      throw new Error(`Unknown agent pattern: ${id}`);\n  }\n  return (\n    <div className={`hp-pattern hp-size-${size} hp-state-${state}`} data-agent-pattern={id} data-agent-state={state} aria-busy={loading}>\n      {state==='error'&&!['composer','composer-attachments','composer-panel'].includes(id)&&<div className=\"hp-native-error\" role=\"alert\"><strong>{id.replaceAll('-',' ')} unavailable</strong><p>The local example could not complete. Your current inputs are preserved.</p>{onRetry&&<Button variant=\"secondary\" size=\"sm\" disabled={disabled} onClick={restore}>Try again</Button>}</div>}\n      {loading&&!['composer','composer-attachments','composer-loader','composer-panel','agent-thinking'].includes(id)&&<p className=\"hp-native-loading\" role=\"status\"><span className=\"hu-spinner\" aria-hidden=\"true\"/>Refreshing {id.replaceAll('-',' ')} · local example</p>}\n      {empty&&!(id==='agent-thinking'&&emptyActive)&&['agent-creator','agent-limits-card','agent-thinking','auth-card'].includes(id)&&<p className=\"hp-empty-context\" role=\"status\">{id==='agent-creator'?'No saved agent. Start with an editable local profile.':id==='agent-limits-card'?'No supplied context or usage limits.':id==='agent-thinking'?'No task is running. Start the local example when ready.':'No authenticated account. Enter example details to begin.'}</p>}\n      <div className=\"hp-native-content\">{content}</div>\n      {empty&&onRetry&&<Button className=\"hp-state-restore\" variant=\"tertiary\" size=\"sm\" disabled={disabled} onClick={restore}>Load example data</Button>}\n    </div>\n  );\n}\n\nexport type SourceAgentPreviewProps=FamilyProps&{id:string;example?:string;assetsBase?:string};\nexport type SourceAgentSection={id:string;title:string;example:string;code:string;preview?:boolean;description?:string;descriptionOnly?:boolean;previewStyle?:CSSProperties};\nexport{NativeAgentThinking,NativeAuthCard,NativeAuthMediaCarousel,NativeComposerLoader,NativeNotificationCenter};\nconst sourceProgressSteps=['Read project files','Update light mode tokens','Implement dark mode tokens','Register the theme toggle','Run lint and production build'];\nconst sourceQuestionnaire:Question[]=[\n {id:'harness',title:'Which harness controls should stay in the top bar?',multiple:true,other:true,options:[{value:'upsell',label:'Show up sell toggle',description:'Forces the upsell card up without spending the 4-turn allowance first.'},{value:'wallpaper',label:'Wallpaper picker',description:'The chat wallpaper choices.'},{value:'level',label:'Play level-up',description:'Replays the free and premium animations'}]},\n {id:'permissions',title:'How should the permission pill behave while an agent is running?',other:true,options:[{value:'lock',label:'Lock it',description:'Changes wait until the run finishes.'},{value:'queue',label:'Queue the change',description:'Applies from the next turn.'},{value:'apply',label:'Apply immediately',description:'Interrupts the current tool call.'}]},\n {id:'surfaces',title:'Which surfaces need dark mode this sprint?',multiple:true,required:false,other:true,options:[{value:'composer',label:'Composer panel',description:'Prompt, controls row, and the status tab.'},{value:'model',label:'Model picker',description:'Provider rail and the effort popover.'},{value:'attachments',label:'Attachment tiles',description:'Image, document, and code previews.'}]},\n {id:'destination',title:'Where should the work land?',options:[{value:'pr',label:'Open a pull request',description:'One PR against main with the summary above.'},{value:'main',label:'Commit to main',description:'Push straight to production.'},{value:'uncommitted',label:'Leave it uncommitted',description:'I will review the diff first.'}]},\n];\nconst sourceNotifications:NativeNotificationItem[]=[\n {id:'mention-notes',category:'mentions',group:'Today',title:'Livia mentioned you',description:'Can you review the new empty state before we ship the dashboard?',timestamp:'2m',unread:true,avatar:{src:'https://www.boardui.com/avatars/livia-saris.webp',alt:'Livia Saris'},actions:[{id:'reply',label:'Reply',variant:'primary'},{id:'view',label:'View thread',variant:'secondary'}]},\n {id:'backup-ready',category:'system',group:'Today',title:'Workspace backup is ready',description:'The July 23 backup finished successfully and is ready to download.',timestamp:'18m',unread:true,status:'success',icon:RiDownloadCloud2Line,actions:[{id:'download',label:'Download',variant:'secondary'}]},\n {id:'project-invite',category:'activity',group:'Today',title:'You joined Project Sea',description:'Maria added you as an editor. You now have access to all project files.',timestamp:'1h',unread:true,status:'information',icon:RiUserAddLine},\n {id:'pull-request',category:'mentions',group:'Earlier this week',title:'Jaydon requested your review',description:'Pull request #284 updates the notification preferences flow.',timestamp:'Mon',avatar:{src:'https://www.boardui.com/avatars/jaydon-aminoff.webp',alt:'Jaydon Aminoff'},actions:[{id:'review',label:'Review changes',variant:'secondary'}]},\n {id:'security-check',category:'system',group:'Earlier this week',title:'Security check completed',description:'No exposed credentials or vulnerable dependencies were found.',timestamp:'Sun',status:'success',icon:RiShieldCheckLine},\n {id:'deploy-failed',category:'system',group:'Earlier this week',title:'Preview deployment failed',description:'The build stopped while validating the application routes.',timestamp:'Sat',unread:true,status:'error',icon:RiGitPullRequestLine,actions:[{id:'retry',label:'Retry',variant:'primary'},{id:'logs',label:'View logs',variant:'secondary'}]},\n];\nfunction artworkColorFilter(color:string){\n if(color.toLowerCase()==='#f8b193')return undefined;const match=/^#([0-9a-f]{6})$/i.exec(color);if(!match)return undefined;\n const channels=[0,2,4].map(i=>parseInt(match[1].slice(i,i+2),16)/255),max=Math.max(...channels),min=Math.min(...channels),delta=max-min,light=(max+min)/2;\n const hue=delta===0?18:((max===channels[0]?(channels[1]-channels[2])/delta+(channels[1]<channels[2]?6:0):max===channels[1]?(channels[2]-channels[0])/delta+2:(channels[0]-channels[1])/delta+4)*60),sat=delta===0?0:delta/(1-Math.abs(2*light-1));\n return `hue-rotate(${hue-18}deg) saturate(${sat/.8}) brightness(${Math.max(.85,light/.78)})`;\n}\nfunction artworkColorMatrix(color:string){\n if(color.toLowerCase()==='#f8b193')return undefined;const match=/^#([0-9a-f]{6})$/i.exec(color);if(!match)return undefined;\n // The published artwork has a peach body (240,175,147) and neutral dark eyes.\n // Map its body to the supplied color while anchoring the eye value at 17/255.\n const target=[0,2,4].map(i=>parseInt(match[1].slice(i,i+2),16)),base=[240,175,147],slope=target.map((value,index)=>(value-17)/(base[index]-17)),offset=slope.map(value=>(17/255)*(1-value));\n return `${slope[0]} 0 0 0 ${offset[0]} 0 ${slope[1]} 0 0 ${offset[1]} 0 0 ${slope[2]} 0 ${offset[2]} 0 0 0 1 0`;\n}\nexport function SourceAgentArtwork({shape='cloud',expression='happy',color='#f8b193',name='Agent',animated=true,thumbnail=false,expressionOnly=false,size,assetsBase='/react/assets/board-native-agents/creator'}:{shape?:AgentProfile['shape'];expression?:AgentProfile['expression'];color?:string;name?:string;animated?:boolean;thumbnail?:boolean;expressionOnly?:boolean;size?:number;assetsBase?:string}){\n const [ready,setReady]=useState(false),bodyColors=useContext(SourceConversationArtworkColors),filterId='hp-art-'+useId().replace(/[^a-zA-Z0-9_-]/g,''),matrix=bodyColors?artworkColorMatrix(color):undefined,file=thumbnail?(creatorArtwork.shapes as Record<string,string>)[shape]:expressionOnly?(creatorArtwork.expressions as Record<string,string>)[expression]:(creatorArtwork.main as Record<string,string>)[shape+'-'+expression],fallback=(creatorArtwork.main as Record<string,string>)['cloud-happy'];\n return <span className={`hp-avatar hp-source-artwork${thumbnail?' hp-source-artwork-thumbnail':''}`} role=\"img\" aria-label={`${name}, ${expression} ${shape} illustration`} data-procedural={ready||undefined}>{matrix&&<svg aria-hidden=\"true\" focusable=\"false\" className=\"hp-source-art-filter\" width=\"0\" height=\"0\"><defs><filter id={filterId} colorInterpolationFilters=\"sRGB\"><feColorMatrix type=\"matrix\" values={matrix}/></filter></defs></svg>}<img src={`${assetsBase.replace(/\\/$/,'')}/${file||fallback}`} alt=\"\" draggable={false} width={thumbnail?56:expressionOnly?34:162} height={thumbnail?56:expressionOnly?34:162} style={{visibility:ready?'hidden':undefined,filter:matrix?`url(#${filterId})`:artworkColorFilter(color)}}/><span className=\"hp-creator-canvas-layer\" aria-hidden=\"true\"><CreatorAvatar shape={shape} expression={expression} color={color} name={name} animated={animated} thumbnail={thumbnail} expressionOnly={expressionOnly} size={size??(expressionOnly?34:thumbnail?56:undefined)} onReady={()=>setReady(true)}/></span></span>;\n}\nfunction SourceAuthExample({example='default',disabled=false}:{example?:string;disabled?:boolean}){const[mode,setMode]=useState<'signin'|'signup'|'verify'>(example==='verify'?'verify':['signup','split','logo-signup','providers-signup'].includes(example)?'signup':'signin'),[status,setStatus]=useState('');return <div className={`hp-source-auth${example==='split'?' hp-source-auth-split':''}`} onChange={()=>setStatus('')} onInvalidCapture={()=>setStatus('')}><NativeAuthCard key={`${mode}-${example}`} mode={mode} layout={example==='inline'?'inline':['grid','split','providers-signup'].includes(example)?'grid':'stacked'} centered={['split','logo'].includes(example)} confirmPassword={example==='split'} title={example==='logo'?'Sign in to Helios UI Pro':undefined} description={example==='split'?'Enter your email below to create your account':example==='logo'?'Explore the complete component and template collection.':undefined} footnote={example==='split'?'This is a local authentication preview. No account or external session is created.':undefined} media={example==='split'?<NativeAuthMediaCarousel slides={[{src:'https://www.boardui.com/carousel/space-squid.webp',alt:'Space squid artwork'},{src:'https://www.boardui.com/carousel/floral.webp',alt:'Floral artwork'},{src:'https://www.boardui.com/carousel/shark-collage.webp',alt:'Shark collage artwork'},{src:'https://www.boardui.com/carousel/sunrise.webp',alt:'Sunrise artwork'}]}/>:undefined} providers={example==='inline'?['google','apple','github','x','figma','slack']:example==='split'?['apple','google','figma']:example==='logo-signup'?['google','apple']:example==='providers-signup'?['google','microsoft','okta']:example==='providers-git'?['gitlab','bitbucket','github']:['google','apple','github']} headingLevel={3} onSwitchMode={()=>{if(!disabled){setStatus('');setMode(mode==='signin'?'signup':'signin')}}} onForgotPassword={()=>setStatus('Password reset is a local preview. Connect your own identity provider to send a reset email.')} logo={example==='logo'||example==='logo-signup'?<span className=\"hp-source-auth-logo\" role=\"img\" aria-label=\"Helios UI\"><UIIcon name=\"grid\"/></span>:undefined} onSubmit={data=>{setStatus(`Values validated locally for ${mode}. No authentication request was sent.`)}} onProvider={provider=>setStatus(`${provider} selected locally. Connect your own identity provider to authenticate.`)} onResend={()=>setStatus('Resend previewed locally. No email was sent.')}/>{status&&<p role=\"status\" className=\"hp-source-feedback\">{status}</p>}{disabled&&<span className=\"hu-sr-only\">This is a disabled preview.</span>}</div>}\nexport type SourceComposerProps=ComposerProps&{layout?:'pill'|'panel';fluid?:boolean};\n/** Source pill or panel anatomy around the same controlled, upload-safe Composer export. */\nexport function SourceComposer({layout='pill',fluid=true,model,onModelChange,...props}:SourceComposerProps){\n const[localModel,setLocalModel]=useState(layout==='panel'?'openai/gpt-5.6-mini':'anthropic/fable-5');\n return <NativeScope><div className={`hp-source-composer${layout==='panel'?' hp-source-panel':''}${fluid?' hp-source-composer-fluid':''}`}><Composer {...props} loadingLight={props.loadingLight??props.working} model={model??localModel} onModelChange={next=>{setLocalModel(next);onModelChange?.(next)}} showPanel={layout==='panel'}/></div></NativeScope>;\n}\nexport type SourceAgentCreatorProps=Omit<React.ComponentProps<typeof AgentCreator>,'renderAvatar'|'renderShape'>&{assetsBase?:string};\nexport function SourceAgentCreator({assetsBase='/react/assets/board-native-agents/creator',agent,onChange,...props}:SourceAgentCreatorProps){\n const[local,setLocal]=useState<AgentProfile>({...defaultAgent,description:'Helps with server architecture, cloud infrastructure, deployments, and reliable services.',color:'#f8b193',expression:'thinking'});\n return <NativeScope><div className=\"hp-source-example\" data-source-agent=\"agent-creator\"><AgentCreator {...props} presentation=\"source\" agent={agent??local} onChange={next=>{setLocal(next);onChange?.(next)}} renderAvatar={profile=><SourceAgentArtwork {...profile} expressionOnly={profile.animated===false} size={profile.animated===false?34:162} assetsBase={assetsBase}/>} renderShape={(shape,color)=><SourceAgentArtwork shape={shape} expression=\"happy\" color={color} name={shape} thumbnail assetsBase={assetsBase}/>}/></div></NativeScope>;\n}\nfunction SourceComposerExample({panel=false,attachments=false,disabled=false,state='ready',onRetry,placeholder='Ask me anything',status=true,onSend,queue=false,showLocalMessages=true}:{showLocalMessages?:boolean;queue?:boolean;panel?:boolean;attachments?:boolean;disabled?:boolean;state?:FamilyProps['state'];onRetry?:()=>void;placeholder?:string;status?:boolean;onSend?:(message:ComposerMessage)=>void}){\n const [sourceModel,setSourceModel]=useState(panel||attachments?'openai/gpt-5.6-mini':'anthropic/fable-5');\n const [items,setItems]=useState<ComposerAttachment[]>(attachments?[{id:'source-photo',name:'cat.jpg',kind:'image',src:'https://www.boardui.com/composer-panel/attachment-cat.jpg',progress:queue?0:100},{id:'source-document',name:'payrollz-2026.docx',kind:'document',progress:0},{id:'source-spreadsheet',name:'budget-2026.xlsx',kind:'spreadsheet',progress:0},{id:'source-presentation',name:'launch-plan.pptx',kind:'presentation',progress:0},{id:'source-code',name:'components.tsx',kind:'code',progress:0}]:[]);\n return <div className={`hp-source-composer${panel||attachments?' hp-source-panel':''}`}><Composer state={state} onRetry={onRetry} disabled={disabled} model={sourceModel} onModelChange={setSourceModel} defaultPermission={attachments?'Bypass all':'Auto'} showPanel={panel||attachments} showAttachments={false} showLocalMessages={showLocalMessages} onSend={onSend} placeholder={placeholder} minRows={panel||attachments?2:1} status={status?undefined:null} attachments={attachments?items:undefined} simulateAttachments={attachments} onAttachmentsChange={setItems} onRemoveAttachment={id=>setItems(old=>old.filter(item=>item.id!==id))}/></div>;\n}\nfunction SourceWorkingStatus(){const[elapsed,setElapsed]=useState(0);useEffect(()=>{const started=performance.now(),timer=setInterval(()=>setElapsed((performance.now()-started)/1000),100);return()=>clearInterval(timer)},[]);return <p className=\"hp-source-working\" role=\"status\"><span className=\"hu-spinner\" aria-hidden=\"true\"/>Working<span aria-live=\"off\">{elapsed.toFixed(1)}s</span></p>}\nfunction SourceAttachmentKinds({disabled=false}:{disabled?:boolean}){const[attachments,setAttachments]=useState<ComposerAttachment[]>([{id:'photo',name:'cat.jpg',kind:'image',src:'https://www.boardui.com/composer-panel/attachment-cat.jpg'},{id:'document',name:'brief.docx',kind:'document'},{id:'sheet',name:'budget.xlsx',kind:'spreadsheet'},{id:'slides',name:'pitch.pptx',kind:'presentation'},{id:'code',name:'page.tsx',kind:'code'},{id:'video',name:'preview.mp4',kind:'video'}]);return <div className=\"hp-source-attachment-kinds\"><ComposerAttachmentStrip attachments={attachments} disabled={disabled} onRemove={id=>setAttachments(old=>old.filter(item=>item.id!==id))}/></div>}\nfunction SourceThinkingExample({example='default',disabled=false}:{example?:string;disabled?:boolean}){const[variant,setVariant]=useState<'wave'|'spin'|'stars'|'infinity'>(['spin','stars','infinity'].includes(example)?example as 'spin'|'stars'|'infinity':'wave'),[message,setMessage]=useState('Redesign the pricing page hero and tighten the CTA copy.'),[turn,setTurn]=useState(0);if(example!=='default')return <NativeAgentThinking key={example} variant={variant} label={example==='label'?'Searching the docs':'Thinking'} tone={example==='label'?'accent':undefined} showTimer={example!=='label'}/>;return <div className=\"hp-source-thinking\"><div className=\"hp-source-thinking-variants\" role=\"group\" aria-label=\"Thinking animation style\">{(['wave','spin','stars','infinity']as const).map(value=><button key={value} type=\"button\" disabled={disabled} aria-pressed={variant===value} onClick={()=>{setVariant(value);setTurn(turn+1)}}>{({wave:'Dot wave',spin:'Dot spin',stars:'Stars',infinity:'Infinity'})[value]}</button>)}</div><div className=\"hp-source-thinking-conversation\"><div className=\"hp-source-thinking-prompt\"><p className=\"hp-source-user-message\">{message}</p></div><div className=\"hp-source-thinking-response\"><NativeAgentThinking key={`${variant}-${turn}`} variant={variant}/><SourceComposerExample showLocalMessages={false} disabled={disabled} onSend={value=>{setMessage(value.text);setTurn(turn+1)}}/></div></div></div>}\nfunction SourceLoaderExample({disabled=false,conversation=false}:{disabled?:boolean;conversation?:boolean}){const[colors,setColors]=useState<[string,string,string,string]>(['#5eead4','#46baec','#e633a4','#00faa7']),[active,setActive]=useState(true);return <div className={`hp-source-loader${conversation?' hp-source-loader-conversation':''}`}>{conversation&&<p className=\"hp-source-user-message\">Help me polish this interface.</p>}<div className=\"hp-source-color-wells\" role=\"group\" aria-label=\"Loader color\">{['rainbow','#3392ff','#7847eb','#dd3992','#24a46d','#ef962d'].map(color=><button key={color} type=\"button\" disabled={disabled} aria-label={color==='rainbow'?'Multicolour light':`${color} light`} aria-pressed={color==='rainbow'?!colors.every(value=>value===colors[0]):colors.every(value=>value===color)} style={{background:color==='rainbow'?'conic-gradient(#5eead4,#46baec,#e633a4,#00faa7,#5eead4)':color}} onClick={()=>setColors(color==='rainbow'?['#5eead4','#46baec','#e633a4','#00faa7']:[color,color,color,color])}/>)}</div><NativeComposerLoader colors={colors} active={active}><SourceComposerExample disabled={disabled} status={false} onSend={()=>setActive(value=>!value)}/></NativeComposerLoader></div>}\nfunction SourcePanelParts({example,disabled=false}:{example:string;disabled?:boolean}){const[permission,setPermission]=useState('Auto'),[model,setModel]=useState('openai/gpt-5.6-mini'),[effort,setEffort]=useState(1),[branch,setBranch]=useState('release/2.0'),[project,setProject]=useState('helios-ui'),[mode,setMode]=useState('Agent'),[context,setContext]=useState(82);if(example==='status')return <div className=\"hp-source-panel-parts\"><SourceComposer layout=\"panel\" minRows={2} disabled={disabled} status={<ComposerStatusBar branch={branch} project={project} mode={mode} context={context} onBranchChange={setBranch} onProjectChange={setProject} onModeChange={setMode} onContextChange={setContext} disabled={disabled}/>} placeholder=\"Hi, what do you need today?\"/><SourceComposer layout=\"panel\" minRows={2} disabled={disabled} status={null} placeholder=\"Hi, what do you need today?\"/></div>;return <div className=\"hp-source-composer hp-source-panel hp-source-picker-example\">{example==='permissions'?<ComposerPermissionPicker value={permission} disabled={disabled} onChange={setPermission}/>:<ComposerModelPicker value={model} effort={effort} disabled={disabled} onChange={setModel} onEffortChange={setEffort}/>}</div>;}\nfunction SourceWorkingComposer({disabled=false}:{disabled?:boolean}){const[working,setWorking]=useState(true);return <div className=\"hp-source-working-composer\">{working&&<NativeAgentThinking/>}<SourceComposer disabled={disabled} working={working} loadingLight={working} onStop={()=>setWorking(false)} onSend={()=>setWorking(true)}/></div>;}\n/** Public in-chat run anatomy; all messages and answers are local demonstration fixtures. */\nfunction SourceRunChat({search=false,disabled=false}:{search?:boolean;disabled?:boolean}){\n const[draft,setDraft]=useState(search?'What do teams actually pay for in a component library?':'Add a dark mode toggle to the dashboard'),[runs,setRuns]=useState<{id:number;text:string;complete:boolean}[]>([]),next=useRef(0),log=useRef<HTMLDivElement>(null);\n const complete=(id:number)=>setRuns(rows=>rows.map(row=>row.id===id?{...row,complete:true}:row));\n useEffect(()=>{const node=log.current;if(node)node.scrollTop=node.scrollHeight},[runs]);\n return <div className=\"hp-source-run-chat\" data-search={search||undefined}><div ref={log} role=\"log\" tabIndex={0} aria-label={search?'Local search conversation':'Local task conversation'}>{!runs.length&&<p className=\"hp-source-run-empty\">Send the message to start the {search?'search':'run'}.</p>}{runs.map(run=><div className=\"hp-source-run-turn\" key={run.id}><p className=\"hp-source-user-message\">{run.text}</p>{search?<WebSearchTrail presentation=\"source\" title=\"Ran 3 searches\" steps={[{label:'Searching for what teams actually pay for in a component library',sources:[{title:'React',href:'https://react.dev/',brand:'github'},{title:'MDN',href:'https://developer.mozilla.org/'},{title:'TypeScript',href:'https://www.typescriptlang.org/'}]},{label:'Comparing published plans',sources:[{title:'Design systems',href:'https://www.w3.org/'}]},{label:'Summarizing the sources'}]} stepInterval={900} onComplete={()=>complete(run.id)} disabled={disabled}/>:<TaskList items={[{id:'search',label:'Searching project files',done:false,steps:[{label:'Searching \"app/page.tsx, components structure\"',chips:[{label:'Read',icon:<UIIcon name=\"file\"/>},{label:'page.tsx'}]}]},{id:'read',label:'Reading component styles',done:false,steps:[{label:'Reviewing source design tokens',resources:['styles.css']}]},{id:'build',label:'Building the interface',done:false}]} mode=\"stream\" stepInterval={900} collapseOnComplete=\"all\" onComplete={()=>complete(run.id)} disabled={disabled}/>} {run.complete&&<p className=\"hp-source-run-answer\">{search?'The local example search is complete. Teams value accessible controls, consistent design tokens, useful examples and code they can maintain. These are bundled demonstration sources.':'The local example run is complete. The dashboard theme control is ready to review in this demonstration. No project files were changed.'}</p>}</div>)}</div><SourceComposer value={draft} onValueChange={setDraft} minRows={1} status={null} showLocalMessages={false} disabled={disabled} onSend={message=>{setRuns(rows=>[...rows,{id:++next.current,text:message.text,complete:false}]);setDraft('')}}/><span className=\"hu-sr-only\">Messages, progress and answers are local fixtures; no search or AI provider is connected.</span></div>;\n}\nexport function SourceAgentPreview({id,example='default',state='ready',onRetry,disabled=false,size='md',assetsBase='/react/assets/board-native-agents/creator'}:SourceAgentPreviewProps){\n const[agent,setAgent]=useState<AgentProfile>({...defaultAgent,description:'Helps with server architecture, cloud infrastructure, deployments, and reliable services.',color:'#f8b193',expression:'thinking'}),[feedback,setFeedback]=useState(''),[taskRunning,setTaskRunning]=useState(true);let content:ReactNode;\n if(state!=='ready')return <AgentPattern id={id} state={state} onRetry={onRetry} disabled={disabled} size={size}/>;\n switch(id){\n case'agent-creator':content=<AgentCreator presentation=\"source\" agent={agent} onChange={setAgent} disabled={disabled} renderAvatar={profile=><SourceAgentArtwork {...profile} expressionOnly={profile.animated===false} size={profile.animated===false?34:162} assetsBase={assetsBase}/>} renderShape={(shape,color)=><SourceAgentArtwork shape={shape} expression=\"happy\" color={color} name={shape} thumbnail assetsBase={assetsBase}/>}/>;break;\n case'agent-limits-card':content=<AgentLimitsCard plan=\"Max (5x)\" planHref=\"/?section=pricing\" defaultExpanded={example==='expanded'} disabled={disabled}/>;break;\n case'agent-progress':content=<AgentProgress presentation=\"source\" steps={example==='custom'?['Read the project','Build the interface','Review the result']:sourceProgressSteps} autoRun stepDuration={6000} disabled={disabled}/>;break;\n case'agent-thinking':content=<SourceThinkingExample example={example} disabled={disabled}/>;break;\n case'auth-card':if(example==='logo'||example==='providers'){content=<div className=\"hp-source-auth-row\"><SourceAuthExample example={example==='logo'?'logo':'providers-signup'} disabled={disabled}/><SourceAuthExample example={example==='logo'?'logo-signup':'providers-git'} disabled={disabled}/></div>;break;}content=example==='layouts'||example==='modes'?<div className=\"hp-source-auth-row\"><SourceAuthExample example=\"default\" disabled={disabled}/><SourceAuthExample example={example==='modes'?'signup':'inline'} disabled={disabled}/></div>:<SourceAuthExample example={example} disabled={disabled}/>;break;\n case'composer':content=example==='working'?<SourceWorkingComposer disabled={disabled}/>:<SourceComposerExample disabled={disabled}/>;break;\n case'composer-attachments':content=example==='kinds'?<SourceAttachmentKinds disabled={disabled}/>:<SourceComposerExample panel attachments queue={example==='queue'} disabled={disabled} placeholder=\"Hi, what do you need today?\"/>;break;\n case'composer-panel':if(['permissions','models','status'].includes(example)){content=<SourcePanelParts example={example} disabled={disabled}/>;break;}content=<SourceComposerExample panel attachments={example==='attachments'} disabled={disabled} placeholder=\"Hi, what do you need today?\"/>;break;\n case'composer-loader':content=example==='composer'?<SourceComposerExample status={false} disabled={disabled}/>:<SourceLoaderExample conversation={example==='conversation'} disabled={disabled}/>;break;\n case'notification-center':content=<><NativeNotificationCenter notifications={sourceNotifications} defaultTab={example==='filtering'?'mentions':'all'} onAction={(notification,action)=>setFeedback(`${action} selected for this fictional notification. No external request was sent.`)}/>{feedback&&<p role=\"status\" className=\"hp-source-feedback\">{feedback}</p>}</>;break;\n case'questionnaire':content=<Questionnaire otherAsChoice questions={sourceQuestionnaire} disabled={disabled} defaultStep={example==='multiple'?2:example==='single'?1:0} select={example==='single'?'single':undefined} labels={{other:'Other',otherPlaceholder:'Enter your custom answer here',complete:'Answers received',review:'Start over'}}/>;break;\n case'task-list':if(example==='in-a-chat'){content=<SourceRunChat disabled={disabled}/>;break;}content=<div className=\"hp-source-task-frame\"><TaskList initialRevealed={example==='resources'?5:2} onComplete={()=>setTaskRunning(false)} items={[{id:'search',label:'Searching project files',done:false,steps:[{label:'Searching \"app/page.tsx, components structure\"',chips:[{label:'Read',icon:<UIIcon name=\"file\"/>},{label:'page.tsx'}]}]},{id:'read',label:'Reading component styles',done:false,steps:[{label:'Reviewing source design tokens',resources:['styles.css']}]},{id:'build',label:'Building the interface',done:false}]} mode=\"stream\" autoRun={example!=='resources'} stepInterval={4500} disabled={disabled}/>{taskRunning&&example!=='resources'&&<SourceWorkingStatus/>}</div>;break;\n case'web-search':if(example==='in-a-chat'){content=<SourceRunChat search disabled={disabled}/>;break;}content=<WebSearchTrail presentation=\"source\" title={example==='marks'?'Site marks':'Ran 3 searches'} steps={[{label:'Searching for what teams actually pay for in a component library',sources:[{title:'React',href:'https://react.dev/',brand:'github'},{title:'Figma',href:'https://www.figma.com/',brand:'figma'},{title:'MDN',href:'https://developer.mozilla.org/'},{title:'Design systems',href:'https://www.w3.org/'},{title:'TypeScript',href:'https://www.typescriptlang.org/'}]},{label:example==='marks'?'Site identity marks follow the supplied source brand.':'Comparing published plans'},...(example==='marks'?[]:[{label:'Summarizing the sources'}])]} autoRun={example!=='sources'&&example!=='marks'} stepInterval={1500} disabled={disabled}/>;break;\n case'multi-agent-chat':content=<MultiAgentChat presentation=\"source\" disabled={disabled}/>;break;\n default:content=<DataState state=\"empty\" emptyMessage=\"This agent block is not in the public source catalogue.\"/>;\n }\n return <NativeScope><fieldset disabled={disabled} className=\"hp-source-example\" data-source-agent={id} data-source-example={example}>{content}<span className=\"hu-sr-only\">Interactive local fixture. No external authentication, inference, upload or search service is connected.</span></fieldset></NativeScope>;\n}\nconst sourceAgentSectionTitles:Record<string,[string,string,boolean?][]>= {\n 'agent-creator':[['use','Use it in your product',false],['voice','Voice and preferences',false],['template','Part of Multi-agent Chat',false]],'agent-limits-card':[['expanded','Expanded']],\n 'agent-progress':[['custom','Custom steps',false],['timing','Timing and completion',false]],'agent-thinking':[['wave','Dot wave'],['spin','Dot spin'],['stars','Stars'],['infinity','Infinity'],['label','Label, tone, and timer']],\n 'auth-card':[['layouts','Layouts'],['split','Split with artwork'],['logo','With a logo'],['modes','Sign in and sign up'],['verify','Verification code'],['providers','Providers'],['wiring','Wiring it up',false]],\n 'composer':[['working','Working state'],['parts','The parts',false]],'composer-attachments':[['queue','Upload queue'],['kinds','Tile kinds'],['uploader','Bring your own uploader',false]],\n 'composer-loader':[['conversation','In a conversation'],['composer','The composer itself',false],['tuning','Tuning',false]],\n 'composer-panel':[['permissions','Permissions'],['models','Model picker'],['status','Status tab'],['wiring','Wiring it up',false],['attachments','Attachments',false]],\n 'notification-center':[['filtering','Filtering',false],['actions','Notification data and actions',false]],'questionnaire':[['multiple','Multiple select'],['single','Single select'],['answers','Answers and steps',false]],\n 'task-list':[['in-a-chat','In a chat'],['resources','Resource chips',false],['timing','Timing and collapse',false],['events','Driving it from real events',false]],'web-search':[['in-a-chat','In a chat'],['sources','Sources',false],['marks','Site marks',false],['pacing','Pacing',false],['events','Driving it from real events',false]],\n};\nfunction sourceAgentCode(id:string,example:string){\n const make=(imports:string,body:string)=>`import {useState} from 'react';\\nimport {${imports}} from '@helios-ui/react';\\nimport '@helios-ui/react/styles.css';\\n\\nexport default function Example(){${body}}`;\n if(id==='agent-creator'&&['use','voice'].includes(example))return make('AgentCreator,defaultAgent',`const[agent,setAgent]=useState(defaultAgent);return <AgentCreator agent={agent} onChange={setAgent}/>;`);\n if(id==='auth-card'&&example==='wiring')return make('NativeScope,NativeAuthCard',`const[status,setStatus]=useState('');return <NativeScope><NativeAuthCard headingLevel={3} onSubmit={data=>setStatus('Validated locally for '+String(data.get('email')))} onProvider={provider=>setStatus(provider+' selected locally; connect your own provider.')}/><p role=\"status\">{status}</p></NativeScope>;`);\n if(id==='composer-panel'&&example==='permissions')return make('ComposerPermissionPicker',`const[value,setValue]=useState('Auto');return <ComposerPermissionPicker value={value} onChange={setValue}/>;`);\n if(id==='composer-panel'&&example==='models'||id==='composer'&&example==='parts')return make('ComposerModelPicker',`const[value,setValue]=useState('openai/gpt-5.6-mini');return <ComposerModelPicker value={value} onChange={setValue}/>;`);\n if(id==='composer-panel'&&example==='status')return make('ComposerStatusBar',`const[branch,setBranch]=useState('Main'),[project,setProject]=useState('project-sea'),[mode,setMode]=useState('Agent'),[context,setContext]=useState(57);return <ComposerStatusBar branch={branch} project={project} mode={mode} context={context} onBranchChange={setBranch} onProjectChange={setProject} onModeChange={setMode} onContextChange={setContext}/>;`);\n if(id==='notification-center'&&example==='actions')return make('NativeScope,NativeNotificationCenter',`const[status,setStatus]=useState('');return <NativeScope><NativeNotificationCenter notifications={[{id:'review',category:'mentions',group:'Today',title:'Review requested',description:'Review this local example.',timestamp:'Now',unread:true,actions:[{id:'review',label:'Review changes'}]}]} onAction={(id,action)=>setStatus(action+' selected for '+id)}/><p role=\"status\">{status}</p></NativeScope>;`);\n if(id==='questionnaire'&&example==='answers')return make('Questionnaire',`const[status,setStatus]=useState('');return <><Questionnaire questions={[{id:'theme',title:'Choose an appearance',options:[{value:'light',label:'Light'},{value:'dark',label:'Dark'}]}]} onComplete={answers=>setStatus(JSON.stringify(answers))}/><p role=\"status\">{status}</p></>;`);\n if(id==='task-list'&&example==='events')return make('TaskList',`const[revealed,setRevealed]=useState(0);return <><TaskList tasks={[{id:'read',label:'Read files',done:false},{id:'build',label:'Build interface',done:false}]} revealed={revealed}/><button type=\"button\" onClick={()=>setRevealed(value=>Math.min(2,value+1))}>Advance local event</button></>;`);\n if(id==='task-list'&&example==='timing')return make('TaskList',`const[status,setStatus]=useState('');return <><TaskList items={[{id:'read',label:'Read files',done:false},{id:'build',label:'Build interface',done:false}]} startDelay={600} stepInterval={1200} collapseOnComplete=\"all\" onComplete={()=>setStatus('Local steps completed')}/><p role=\"status\">{status}</p></>;`);\n if(id==='web-search'&&example==='events')return make('WebSearchTrail',`const[revealed,setRevealed]=useState(0);return <><WebSearchTrail steps={[{label:'Reading bundled sources'},{label:'Comparing references'}]} revealed={revealed}/><button type=\"button\" onClick={()=>setRevealed(value=>Math.min(2,value+1))}>Reveal local event</button></>;`);\n if(id==='web-search'&&example==='pacing')return make('WebSearchTrail',`const[status,setStatus]=useState('');return <><WebSearchTrail steps={[{label:'Reading bundled sources'},{label:'Comparing references'}]} startDelay={500} stepInterval={1200} onComplete={()=>setStatus('Local trail completed')}/><p role=\"status\">{status}</p></>;`);\n if(id==='agent-progress'&&example==='timing')return `import {AgentProgress} from '@helios-ui/react';\\nimport '@helios-ui/react/styles.css';\\n\\nexport default function Example(){return <AgentProgress steps={['Read files','Build UI','Verify']} stepDuration={1800} completionDelay={500} autoRun onFinished={()=>console.info('Local sequence completed')}/>;}`;\n if(id==='composer-loader'&&example==='tuning')return `import {NativeScope,NativeComposerLoader,SourceAgentPreview} from '@helios-ui/react';\\nimport '@helios-ui/react/styles.css';\\n\\nexport default function Example(){return <NativeScope><NativeComposerLoader speed={4.5} arc={120} bloom={16} intensity={0.7} reverse={false}><SourceAgentPreview id=\"composer\"/></NativeComposerLoader></NativeScope>;}`;\n if(['wiring','uploader','parts','permissions','models','status'].includes(example)&&['composer','composer-panel','composer-attachments'].includes(id))return `import {useState} from 'react';\\nimport {Composer} from '@helios-ui/react';\\nimport '@helios-ui/react/styles.css';\\n\\nexport default function Example(){const [message,setMessage]=useState('');return <><Composer showPanel onSubmit={setMessage}/><p role=\"status\">{message}</p></>;}`;\n return `import {SourceAgentPreview} from '@helios-ui/react';\\nimport '@helios-ui/react/styles.css';\\n\\nexport default function Example(){return <SourceAgentPreview id=\"${id}\"${example==='default'?'':` example=\"${example}\"`}/>;}`;\n}\nexport const sourceAgentSections:Record<string,SourceAgentSection[]>=Object.fromEntries(agentPatternIds.map(id=>[id,[['default','Preview',true]as [string,string,boolean],...(sourceAgentSectionTitles[id]||[])].map(([example,title,preview])=>({id:example==='default'?'preview':example,title,example,preview:preview!==false,previewStyle:id==='agent-thinking'?{padding:24,minHeight:100,height:100}:example==='in-a-chat'?{padding:8,minHeight:id==='web-search'?560:520}:id==='composer-panel'&&['permissions','models'].includes(example)?{padding:32,minHeight:160}:undefined,description:(agentSectionCopy as Record<string,Record<string,string>>)[id]?.[example],descriptionOnly:id==='agent-creator'&&example==='template'||undefined,code:id==='agent-creator'&&example==='template'?'':sourceAgentCode(id,example)}))]));\n",
  "src/AllComponents.tsx": "import type { FamilyProps } from './family-types.js';\nimport { baseFamilyIds, BaseFamilyPreview } from './BaseFamilies.js';\nimport { applicationFamilyIds, ApplicationFamilyPreview } from './ApplicationFamilies.js';\nimport { BoardExtra, boardExtraIds } from './BoardExtras.js';\nimport { AgentPattern, agentPatternIds } from './AgentPatterns.js';\nimport { ModernChart, chartDefinitions } from './ChartFamilies.js';\nimport { BoardTemplate } from './BoardTemplates.js';\nimport type { BoardTemplateId } from './BoardTemplates.js';\nexport type FamilyPreviewProps = FamilyProps & { id: string };\nexport function FamilyPreview({ id, ...props }: FamilyPreviewProps) {\n  if ((baseFamilyIds as readonly string[]).includes(id))\n    return <BaseFamilyPreview id={id} {...props} />;\n  if ((applicationFamilyIds as readonly string[]).includes(id))\n    return <ApplicationFamilyPreview id={id} {...props} />;\n  if ((boardExtraIds as readonly string[]).includes(id)) return <BoardExtra id={id} {...props} />;\n  if ((agentPatternIds as readonly string[]).includes(id))\n    return <AgentPattern id={id} {...props} />;\n  if (chartDefinitions.some((chart) => chart.id === id)) return <ModernChart id={id} {...props} />;\n  if (id.startsWith('template-'))\n    return <BoardTemplate id={id.slice(9) as BoardTemplateId} {...props} />;\n  throw new Error('Unknown React family: ' + id);\n}\n",
  "src/ApplicationFamilies.tsx": "'use client';\nimport { UNSAFE_PortalProvider } from 'react-aria';\nimport { UIIcon } from './icons.js';\nimport { useDirection } from './Direction.js';\n\n\nimport { useEffect, useId, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { AnimatePresence, motion } from 'motion/react';\nimport { useMotionPreference as useReducedMotion } from './useMotionPreference.js';\nimport {\n  Calendar as AriaCalendar,\n  CalendarCell,\n  CalendarGrid,\n  CalendarGridBody,\n  CalendarGridHeader,\n  CalendarHeaderCell,\n  Heading,\n  Button as AriaButton,\n  DatePicker as AriaDatePicker,\n  DateInput,\n  DateSegment,\n  Group,\n  Label,\n  Popover,\n  Dialog as AriaDialog,\n  I18nProvider,\n  Tree,\n  TreeItem,\n  TreeItemContent,\n} from 'react-aria-components';\nimport { parseDate } from '@internationalized/date';\nimport { Button, Checkbox, DataState, Dialog, Input, Select, Tabs } from './components.js';\nimport { DataTable } from './DataTable.js';\nimport {DateRangePicker,MeetingScheduler} from './DateRangeExamples.js';\nimport type { Column } from './DataTable.js';\nimport type { FamilyProps } from './family-types.js';\n\nexport type Activity = {\n  id: string;\n  name: string;\n  action: string;\n  time: string;\n  kind: 'update' | 'comment';\n  detail?: string;\n};\nconst activityItems: Activity[] = [\n  {\n    id: 'a1',\n    name: 'Aarav Shah',\n    action: 'updated the design library',\n    time: '10 minutes ago',\n    kind: 'update',\n  },\n  {\n    id: 'a2',\n    name: 'Diya Rao',\n    action: 'left a comment',\n    time: '25 minutes ago',\n    kind: 'comment',\n    detail: 'These components are ready for review.',\n  },\n  { id: 'a3', name: 'Kavya Nair', action: 'completed a task', time: '1 hour ago', kind: 'update' },\n];\nexport function ActivityFeed({\n  items = activityItems,\n  disabled = false,\n}: {\n  items?: Activity[];\n  disabled?: boolean;\n}) {\n  const [filter, setFilter] = useState('all');\n  const filtered = items.filter((item) => filter === 'all' || item.kind === 'comment');\n  const feed = (\n    <>\n      {filtered.length ? (\n        <ol>\n          {filtered.map((item) => (\n            <li key={item.id}>\n              <span className=\"hu-avatar\" aria-hidden=\"true\">\n                {item.name\n                  .split(' ')\n                  .map((x) => x[0])\n                  .join('')}\n              </span>\n              <div>\n                <strong>{item.name}</strong> {item.action}\n                {item.detail && <p>{item.detail}</p>}\n                <small>\n                  {item.time} · {item.kind === 'comment' ? 'Comment' : 'Updated'}\n                </small>\n              </div>\n            </li>\n          ))}\n        </ol>\n      ) : (\n        <DataState state=\"empty\" emptyMessage=\"No activity matches this filter.\" />\n      )}\n    </>\n  );\n  return (\n    <div className=\"ha-activity\">\n      <Tabs\n        label=\"Activity filter\"\n        value={filter}\n        onValueChange={setFilter}\n        items={[\n          { id: 'all', label: 'All activity', content: filter === 'all' ? feed : null, disabled },\n          {\n            id: 'comments',\n            label: 'Comments',\n            content: filter === 'comments' ? feed : null,\n            disabled,\n          },\n        ]}\n      />\n    </div>\n  );\n}\n\nexport type NotificationPosition = 'top-left'|'top-center'|'top-right'|'bottom-left'|'bottom-center'|'bottom-right';\nexport type NotificationProps = {\n  title?: string; description?: string; tone?: 'success'|'info'|'warning'|'error';\n  dismissible?: boolean; disabled?: boolean; onDismiss?: ()=>void;\n  icon?: ReactNode; avatar?: {src:string;name:string};\n  actions?: {label:string;onPress:()=>void;variant?:'primary'|'secondary'}[];\n  position?: NotificationPosition; autoDismiss?: number; open?: boolean; onOpenChange?: (open:boolean)=>void;\n};\nexport function Notification({title='Your changes have been saved',description='The latest version is ready for your team.',tone='success',dismissible=true,disabled=false,onDismiss,icon,avatar,actions=[],position,autoDismiss=0,open,onOpenChange}:NotificationProps){\n  const [local,setLocal]=useState(true),[paused,setPaused]=useState(false),reduce=useReducedMotion(),visible=open??local;\n  const dismiss=()=>{setPaused(false);setLocal(false);onOpenChange?.(false);onDismiss?.();};\n  useEffect(()=>{if(!visible||paused||disabled||autoDismiss<=0)return;const timer=setTimeout(dismiss,autoDismiss);return()=>clearTimeout(timer);},[visible,paused,disabled,autoDismiss]);\n  return <div className={`ha-notification-example ${position?'ha-notification-floating ha-position-'+position:''}`}>\n    <AnimatePresence initial={false}>{visible&&<motion.div className={`ha-notification ha-tone-${tone}`} role={tone==='error'?'alert':'status'} initial={{opacity:0,y:reduce?0:position?.startsWith('bottom')?8:-8}} animate={{opacity:1,y:0}} exit={{opacity:0,y:reduce?0:-8}} transition={{duration:reduce?0:0.18}} onMouseEnter={()=>setPaused(true)} onMouseLeave={()=>setPaused(false)} onFocusCapture={()=>setPaused(true)} onBlurCapture={event=>{if(!event.currentTarget.contains(event.relatedTarget))setPaused(false);}}>\n      {avatar?<img className=\"ha-notification-avatar\" src={avatar.src} alt={avatar.name}/>:<span aria-hidden=\"true\">{icon??(tone==='success'?'✓':tone==='error'?'!':'i')}</span>}\n      <div><strong>{title}</strong><p>{description}</p>{actions.length>0&&<div className=\"ha-notification-actions\">{actions.map(action=><Button key={action.label} variant={action.variant||'secondary'} size=\"sm\" disabled={disabled} onClick={action.onPress}>{action.label}</Button>)}</div>}</div>\n      {dismissible&&<Button variant=\"tertiary\" size=\"sm\" iconOnly leadingIcon=\"×\" aria-label=\"Dismiss notification\" disabled={disabled} onClick={dismiss}>Dismiss</Button>}\n    </motion.div>}</AnimatePresence>\n    {!visible&&open===undefined&&<Button variant=\"secondary\" disabled={disabled} onClick={()=>{setLocal(true);onOpenChange?.(true);}}>Show notification</Button>}\n  </div>;\n}\nfunction NotificationExample({disabled=false}:{disabled?:boolean}){\n const [open,setOpen]=useState(true),[tone,setTone]=useState<NonNullable<NotificationProps['tone']>>('success'),[avatar,setAvatar]=useState(false),[actions,setActions]=useState(true),[position,setPosition]=useState<NotificationPosition|'inline'>('inline'),[timed,setTimed]=useState(false),[message,setMessage]=useState('');\n return <div className=\"ha-notification-demo\"><Notification open={open} onOpenChange={setOpen} title={avatar?'Kavya Nair':'Your changes have been saved'} description={avatar?\"I've finished adding my notes. Happy for you to review whenever you're ready.\":'The latest version is ready for your team.'} tone={tone} disabled={disabled} avatar={avatar?{name:'Kavya Nair',src:'/assets/334-517-SizeMdBorderFalse.png'}:undefined} position={position==='inline'?undefined:position} autoDismiss={timed?5000:0} actions={actions?[{label:'Dismiss',onPress:()=>setOpen(false)},{label:'View changelog',variant:'primary',onPress:()=>setMessage('Version 1.0: reusable React components, keyboard interactions and Indian pricing previews.')}]:[]}/>\n <div className=\"ha-notification-controls\"><Button variant=\"secondary\" size=\"sm\" disabled={disabled} onClick={()=>setOpen(true)}>Replay notification</Button><Select label=\"Notification tone\" disabled={disabled} value={tone} options={['success','info','warning','error'].map(value=>({value,label:value}))} onChange={event=>{setTone(event.target.value as typeof tone);setOpen(true);}}/><Select label=\"Notification position\" disabled={disabled} value={position} options={['inline','top-left','top-center','top-right','bottom-left','bottom-center','bottom-right'].map(value=>({value,label:value}))} onChange={event=>{setPosition(event.target.value as typeof position);setOpen(true);}}/><Checkbox label=\"With avatar\" disabled={disabled} checked={avatar} onChange={event=>setAvatar(event.target.checked)}/><Checkbox label=\"With actions\" disabled={disabled} checked={actions} onChange={event=>setActions(event.target.checked)}/><Checkbox label=\"Dismiss after 5 seconds\" disabled={disabled} checked={timed} onChange={event=>{setTimed(event.target.checked);setOpen(true);}}/></div><p className=\"ha-status\" role=\"status\">{message}</p></div>;\n}\n\nexport type NavigationItem = { id: string; label: string; description?: string; count?: number };\nconst navigationItems: NavigationItem[] = [\n  { id: 'home', label: 'Home', description: 'Your workspace overview and recent activity.' },\n  {\n    id: 'projects',\n    label: 'Projects',\n    description: 'Manage your active projects and milestones.',\n    count: 8,\n  },\n  {\n    id: 'tasks',\n    label: 'Tasks',\n    description: 'Review upcoming work and completed tasks.',\n    count: 12,\n  },\n  { id: 'settings', label: 'Settings', description: 'Update your workspace preferences.' },\n];\nexport function ApplicationNavigation({\n  items = navigationItems,\n  value,\n  onValueChange,\n  disabled = false,\n}: {\n  items?: NavigationItem[];\n  value?: string;\n  onValueChange?: (value: string) => void;\n  disabled?: boolean;\n}) {\n  const [local, setLocal] = useState(items[0]?.id),\n    current = value ?? local,\n    active = items.find((item) => item.id === current);\n  return (\n    <div className=\"ha-navigation\">\n      <nav aria-label=\"Example application\">\n        {items.map((item) => (\n          <button\n            type=\"button\"\n            key={item.id}\n            disabled={disabled}\n            aria-current={item.id === current ? 'page' : undefined}\n            onClick={() => {\n              setLocal(item.id);\n              onValueChange?.(item.id);\n            }}\n          >\n            <span>{item.label}</span>\n            {item.count !== undefined && <small>{item.count}</small>}\n          </button>\n        ))}\n      </nav>\n      <section aria-live=\"polite\">\n        <h3>{active?.label}</h3>\n        <p>{active?.description}</p>\n      </section>\n    </div>\n  );\n}\n\nexport type BreadcrumbItem = {label:string;href?:string;leading?:ReactNode};\nexport type BreadcrumbsProps={items?:BreadcrumbItem[];onNavigate?:(item:BreadcrumbItem)=>void;disabled?:boolean;label?:string};\nexport function Breadcrumbs({items=[{label:'Home',href:'/'},{label:'Projects',href:'/components'},{label:'Design system'}],onNavigate,disabled=false,label='Breadcrumb'}:BreadcrumbsProps){\n const {direction}=useDirection();\n return <nav aria-label={label} className=\"ha-breadcrumbs\"><ol>{items.map((item,index)=><li key={index}>{index>0&&<span aria-hidden=\"true\"><UIIcon name={direction==='rtl'?'chevron-left':'chevron-right'} /></span>}{index===items.length-1?<span aria-current=\"page\">{item.leading&&<span className=\"ha-breadcrumb-leading\" aria-hidden=\"true\">{item.leading}</span>}{item.label}</span>:onNavigate?<Button variant=\"link-gray\" disabled={disabled} onClick={()=>onNavigate(item)}>{item.leading&&<span className=\"ha-breadcrumb-leading\" aria-hidden=\"true\">{item.leading}</span>}{item.label}</Button>:<a href={disabled?undefined:item.href} aria-disabled={disabled||undefined} tabIndex={disabled?-1:undefined} onClick={event=>{if(disabled||!item.href)event.preventDefault();}}>{item.leading&&<span className=\"ha-breadcrumb-leading\" aria-hidden=\"true\">{item.leading}</span>}{item.label}</a>}</li>)}</ol></nav>;\n}\nfunction BreadcrumbExample({disabled=false}:{disabled?:boolean}){const[message,setMessage]=useState('');return <div className=\"ha-breadcrumb-demo\"><Breadcrumbs disabled={disabled}/><Breadcrumbs label=\"Team breadcrumb\" disabled={disabled} onNavigate={item=>setMessage(item.label+' opened in this local example.')} items={[{label:'Helios team',leading:<span className=\"ha-breadcrumb-avatar\">H</span>},{label:'Kavya',leading:<span className=\"ha-breadcrumb-avatar\">K</span>},{label:'Home',leading:'⌂'}]}/><p role=\"status\" className=\"ha-status\">{message}</p></div>;}\n\nfunction CalendarBody() {\n  const {direction}=useDirection();\n  return (\n    <>\n      <header>\n        <AriaButton\n          slot=\"previous\"\n          aria-label=\"Previous month\"\n          className=\"hu-button hu-secondary hu-sm\"\n        ><UIIcon name={direction==='rtl'?'chevron-right':'chevron-left'} /></AriaButton>\n        <Heading />\n        <AriaButton slot=\"next\" aria-label=\"Next month\" className=\"hu-button hu-secondary hu-sm\"><UIIcon name={direction==='rtl'?'chevron-left':'chevron-right'} /></AriaButton>\n      </header>\n      <CalendarGrid>\n        <CalendarGridHeader>\n          {(day) => <CalendarHeaderCell>{day}</CalendarHeaderCell>}\n        </CalendarGridHeader>\n        <CalendarGridBody>{(date) => <CalendarCell date={date} />}</CalendarGridBody>\n      </CalendarGrid>\n    </>\n  );\n}\nexport type CalendarProps = {\n  value?: string;\n  defaultValue?: string;\n  onChange?: (date: string) => void;\n  disabled?: boolean;\n  minValue?: string;\n  maxValue?: string;\n};\nexport function Calendar({\n  value,\n  defaultValue = '2026-10-26',\n  onChange,\n  disabled = false,\n  minValue,\n  maxValue,\n}: CalendarProps) {\n  const {locale,direction}=useDirection();\n  const [local, setLocal] = useState(defaultValue),\n    current = value ?? local;\n  return (\n    <I18nProvider locale={locale}>\n      <div className=\"ha-calendar\">\n        <AriaCalendar\n          aria-label=\"Choose a date\"\n          value={current ? parseDate(current) : null}\n          onChange={(date) => {\n            const next = date.toString();\n            setLocal(next);\n            onChange?.(next);\n          }}\n          isDisabled={disabled}\n          minValue={minValue ? parseDate(minValue) : undefined}\n          maxValue={maxValue ? parseDate(maxValue) : undefined}\n        >\n          <CalendarBody />\n        </AriaCalendar>\n        <p role=\"status\" className=\"ha-status\">\n          {current ? `Selected date: ${current}` : 'No date selected'}\n        </p>\n      </div>\n    </I18nProvider>\n  );\n}\nexport function DatePicker({\n  label = 'Choose a date',\n  value,\n  defaultValue = '2026-10-26',\n  onChange,\n  disabled = false,\n  minValue,\n  maxValue,\n}: { label?: string } & CalendarProps) {\n  const {locale,direction}=useDirection();\n  const [local, setLocal] = useState(defaultValue),\n    [open,setOpen] = useState(false), [pending,setPending] = useState(value ?? defaultValue),\n    current = value ?? local;\n  return (\n    <I18nProvider locale={locale}>\n      <AriaDatePicker\n        className=\"ha-date-picker\"\n        value={current ? parseDate(current) : null}\n        onChange={(date) => {\n          const next = date?.toString() || '';\n          setLocal(next);\n          onChange?.(next);\n        }}\n        isDisabled={disabled}\n        isOpen={open}\n        onOpenChange={next=>{if(next)setPending(current);setOpen(next)}}\n        minValue={minValue ? parseDate(minValue) : undefined}\n        maxValue={maxValue ? parseDate(maxValue) : undefined}\n      >\n        <Label>{label}</Label>\n        <Group>\n          <DateInput>{(segment) => <DateSegment segment={segment} />}</DateInput>\n          <AriaButton aria-label=\"Open calendar\"><UIIcon name=\"calendar\" /></AriaButton>\n        </Group>\n        <Popover dir={direction} lang={locale} className=\"ha-date-popover\">\n          <AriaDialog aria-label={label+' calendar'}>\n            <AriaCalendar slot={null} aria-label={label} value={pending?parseDate(pending):null} onChange={date=>setPending(date?.toString()||'')} isDisabled={disabled} minValue={minValue?parseDate(minValue):undefined} maxValue={maxValue?parseDate(maxValue):undefined}>\n              <CalendarBody />\n            </AriaCalendar>\n            <div className=\"hu-actions ha-date-actions\"><Button variant=\"secondary\" onClick={()=>{setPending(current);setOpen(false)}}>Cancel</Button><Button disabled={disabled||!pending} onClick={()=>{setLocal(pending);onChange?.(pending);setOpen(false)}}>Apply date</Button></div>\n          </AriaDialog>\n        </Popover>\n        <p className=\"ha-status\" role=\"status\">\n          {current\n            ? `Selected date: ${current}`\n            : 'Choose a date using the calendar or date segments.'}\n        </p>\n      </AriaDatePicker>\n    </I18nProvider>\n  );\n}\n\nexport type HeaderProps = {\n  title?: string;\n  description?: string;\n  count?: number;\n  actionLabel?: string;\n  onAction?: () => void;\n  disabled?: boolean;\n  eyebrow?: string;\n};\nfunction HeaderContent({\n  title = 'Team members',\n  description = 'Manage the people who have access to your workspace.',\n  count = 5,\n  actionLabel = 'Add member',\n  onAction,\n  disabled = false,\n  eyebrow = 'WORKSPACE',\n  variant = 'section',\n}: HeaderProps & { variant?: 'card' | 'section' | 'page' }) {\n  const [open, setOpen] = useState(false),\n    [email, setEmail] = useState(''),\n    [error, setError] = useState(''),\n    [members, setMembers] = useState(count),\n    [message, setMessage] = useState('');\n  return (\n    <div className={`ha-header ha-header-${variant}`}>\n      <div className=\"ha-header-row\">\n        <div>\n          <span className=\"ha-eyebrow\">{eyebrow}</span>\n          <h3>\n            {title} <span className=\"hu-badge\">{members} members</span>\n          </h3>\n          <p>{description}</p>\n        </div>\n        <Button\n          disabled={disabled}\n          onClick={() => {\n            if (onAction) onAction();\n            else {\n              setOpen(true);\n              setError('');\n            }\n          }}\n        >\n          {actionLabel}\n        </Button>\n      </div>\n      <p className=\"ha-status\" role=\"status\">\n        {message}\n      </p>\n      <Dialog\n        open={open}\n        onOpenChange={setOpen}\n        title=\"Add team member\"\n        description=\"Invite a fictional member to this local example.\"\n        footer={\n          <>\n            <Button variant=\"secondary\" onClick={() => setOpen(false)}>\n              Cancel\n            </Button>\n            <Button\n              onClick={() => {\n                if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) {\n                  setError('Enter a valid email address.');\n                  return;\n                }\n                setMembers(members + 1);\n                setMessage(`${email} added to this example.`);\n                setEmail('');\n                setOpen(false);\n              }}\n            >\n              Add member\n            </Button>\n          </>\n        }\n      >\n        <Input\n          label=\"Email address\"\n          type=\"email\"\n          value={email}\n          onChange={(event) => setEmail(event.target.value)}\n          error={error}\n          required\n        />\n      </Dialog>\n    </div>\n  );\n}\nexport function CardHeader(props: HeaderProps) {\n  return <HeaderContent {...props} variant=\"card\" />;\n}\nexport function SectionHeader(props: HeaderProps) {\n  return <HeaderContent {...props} variant=\"section\" />;\n}\nexport function PageHeader(props: HeaderProps) {\n  return <HeaderContent {...props} variant=\"page\" />;\n}\n\nexport function CodeSnippet({\n  code = \"import { Button } from '@helios-ui/react';\\n\\n<Button onClick={() => alert('Continue')}>Continue</Button>\",\n  language = 'tsx',\n  disabled = false,\n}: {\n  code?: string;\n  language?: string;\n  disabled?: boolean;\n}) {\n  const [status, setStatus] = useState('');\n  return (\n    <div className=\"ha-code\">\n      <header>\n        <span>{language}</span>\n        <Button\n          variant=\"secondary\"\n          size=\"sm\"\n          disabled={disabled}\n          onClick={async () => {\n            try {\n              await navigator.clipboard.writeText(code);\n              setStatus('Code copied.');\n            } catch {\n              setStatus('Clipboard unavailable. Select the code below to copy.');\n            }\n          }}\n        >\n          Copy code\n        </Button>\n      </header>\n      <pre tabIndex={0} aria-label={`${language} code`}>\n        <code>{code}</code>\n      </pre>\n      <p role=\"status\">{status}</p>\n    </div>\n  );\n}\n\nexport function ColorPicker({\n  value,\n  onChange,\n  defaultValue = '#00CED1',\n  disabled = false,\n  swatches = ['#00CED1', '#007274', '#171717', '#16A34A', '#D97706', '#DC2626'],\n}: {\n  value?: string;\n  defaultValue?: string;\n  onChange?: (value: string) => void;\n  disabled?: boolean;\n  swatches?: string[];\n}) {\n  const [local, setLocal] = useState(defaultValue),\n    [draft, setDraft] = useState(value ?? defaultValue),\n    [error, setError] = useState(''),\n    current = value ?? local,\n    id = useId();\n  useEffect(() => setDraft(current), [current]);\n  const change = (next: string) => {\n    setLocal(next.toUpperCase());\n    setDraft(next.toUpperCase());\n    setError('');\n    onChange?.(next.toUpperCase());\n  };\n  return (\n    <div className=\"ha-color-picker\">\n      <div\n        className=\"ha-color-preview\"\n        role=\"img\"\n        style={{ backgroundColor: current }}\n        aria-label={`Current color ${current}`}\n      />\n      <div>\n        <label htmlFor={id}>Choose color</label>\n        <input\n          id={id}\n          type=\"color\"\n          value={current}\n          disabled={disabled}\n          onChange={(event) => change(event.target.value)}\n        />\n        <Input\n          label=\"Hex value\"\n          value={draft}\n          disabled={disabled}\n          error={error}\n          maxLength={7}\n          onChange={(event) => {\n            const next = event.target.value;\n            setDraft(next);\n            if (/^#[0-9a-f]{6}$/i.test(next)) change(next);\n            else setError('Use a six-digit hex color such as #00CED1.');\n          }}\n        />\n      </div>\n      <div className=\"ha-color-swatches\">\n        {swatches.map((color) => (\n          <button\n            key={color}\n            type=\"button\"\n            disabled={disabled}\n            style={{ backgroundColor: color }}\n            aria-label={`Use ${color}`}\n            aria-pressed={color.toUpperCase() === current.toUpperCase()}\n            onClick={() => change(color)}\n          />\n        ))}\n      </div>\n      <p className=\"ha-status\" role=\"status\">\n        Selected color: {current}\n      </p>\n    </div>\n  );\n}\n\nexport type Command = { id: string; label: string; description?: string; onSelect?: () => void };\nconst commandItems: Command[] = [\n  { id: 'dashboard', label: 'Go to dashboard', description: 'Open your workspace overview' },\n  { id: 'projects', label: 'Open projects', description: 'Browse active projects' },\n  { id: 'task', label: 'Create a task', description: 'Add a task to your workspace' },\n  { id: 'settings', label: 'View settings', description: 'Update account preferences' },\n];\nexport function CommandMenu({\n  items = commandItems,\n  disabled = false,\n  onSelect,\n}: {\n  items?: Command[];\n  disabled?: boolean;\n  onSelect?: (command: Command) => void;\n}) {\n  const [open, setOpen] = useState(false),\n    [query, setQuery] = useState(''),\n    [active, setActive] = useState(0),\n    [status, setStatus] = useState(''),\n    input = useRef<HTMLInputElement>(null),\n    uid = useId(),\n    matches = items.filter((item) =>\n      (item.label + ' ' + item.description).toLowerCase().includes(query.toLowerCase()),\n    );\n  const choose = (item: Command) => {\n    item.onSelect?.();\n    onSelect?.(item);\n    setStatus(`${item.label} selected.`);\n    setOpen(false);\n  };\n  useEffect(() => {\n    if (open) requestAnimationFrame(() => input.current?.focus());\n  }, [open]);\n  return (\n    <div className=\"ha-command-example\">\n      <Button\n        variant=\"secondary\"\n        disabled={disabled}\n        onClick={() => {\n          setOpen(true);\n          setQuery('');\n          setActive(0);\n        }}\n      >\n        <UIIcon name=\"search\" /> Search workspace\n      </Button>\n      <p role=\"status\" className=\"ha-status\">\n        {status}\n      </p>\n      <Dialog\n        open={open}\n        onOpenChange={setOpen}\n        title=\"Search workspace\"\n        description=\"Type to filter. Use arrows to choose a command and Enter to run it.\"\n      >\n        <Input\n          ref={input}\n          label=\"Search commands\"\n          type=\"search\"\n          value={query}\n          role=\"combobox\"\n          aria-expanded={open}\n          aria-controls={uid}\n          aria-autocomplete=\"list\"\n          aria-activedescendant={matches[active] ? uid + '-' + matches[active].id : undefined}\n          onChange={(event) => {\n            setQuery(event.target.value);\n            setActive(0);\n          }}\n          onKeyDown={(event) => {\n            if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n              event.preventDefault();\n              setActive((index) =>\n                matches.length\n                  ? (index + (event.key === 'ArrowDown' ? 1 : -1) + matches.length) % matches.length\n                  : 0,\n              );\n            }\n            if (event.key === 'Enter' && matches[active]) {\n              event.preventDefault();\n              choose(matches[active]);\n            }\n          }}\n        />\n        <div id={uid} role=\"listbox\" aria-label=\"Commands\" className=\"ha-command-list\">\n          {matches.length ? (\n            matches.map((item, index) => (\n              <div\n                id={uid + '-' + item.id}\n                role=\"option\"\n                key={item.id}\n                aria-selected={index === active}\n                onMouseEnter={() => setActive(index)}\n                onClick={() => choose(item)}\n              >\n                <strong>{item.label}</strong>\n                <small>{item.description}</small>\n              </div>\n            ))\n          ) : (\n            <p role=\"status\">No commands found. Try another search.</p>\n          )}\n        </div>\n      </Dialog>\n    </div>\n  );\n}\n\nexport type ContentDividerProps={label?:ReactNode;children?:ReactNode;orientation?:'horizontal'|'vertical';variant?:'single'|'double'|'filled';align?:'start'|'center'|'end';className?:string};\nexport function ContentDivider({label='or continue with',children,orientation='horizontal',variant='single',align='center',className=''}:ContentDividerProps){\n const content=children??label;\n return <div className={`ha-divider ha-divider-${orientation} ha-divider-${variant} ha-divider-align-${align} ${className}`} role={content?'group':'separator'} aria-label={typeof content==='string'?content:undefined} aria-orientation={content?undefined:orientation}>{content&&<span>{content}</span>}</div>;\n}\nfunction DividerExample({disabled=false}:{disabled?:boolean}){const[message,setMessage]=useState('');return <div className=\"ha-divider-demo\"><ContentDivider label=\"Notifications\"/><ContentDivider label=\"Today\" variant=\"double\"/><ContentDivider label=\"Latest activity\" variant=\"filled\"/><ContentDivider align=\"start\"><Button variant=\"tertiary\" size=\"sm\" disabled={disabled} onClick={()=>setMessage('Earlier activity loaded locally.')}>Load earlier activity <UIIcon name=\"arrow-up\" /></Button></ContentDivider><ContentDivider label=\"\"/><p role=\"status\" className=\"ha-status\">{message}</p></div>;}\nexport function EmptyState({\n  title = 'No projects yet',\n  description = 'Start a project to organize your work.',\n  actionLabel = 'Create project',\n  onAction,\n  disabled = false,\n}: {\n  title?: string;\n  description?: string;\n  actionLabel?: string;\n  onAction?: () => void;\n  disabled?: boolean;\n}) {\n  const [projects, setProjects] = useState<string[]>([]);\n  return (\n    <div className=\"ha-empty\">\n      <span aria-hidden=\"true\"><UIIcon name=\"plus\" /></span>\n      <h3>{projects.length ? 'Your projects' : title}</h3>\n      {!projects.length ? (\n        <p>{description}</p>\n      ) : (\n        <ul>\n          {projects.map((project) => (\n            <li key={project}>{project}</li>\n          ))}\n        </ul>\n      )}\n      <Button\n        disabled={disabled}\n        onClick={() => {\n          if (onAction) onAction();\n          else setProjects([...projects, `Project ${projects.length + 1}`]);\n        }}\n      >\n        {actionLabel}\n      </Button>\n      <p className=\"ha-status\" role=\"status\">\n        {projects.length\n          ? `${projects.length} local project${projects.length === 1 ? '' : 's'} created.`\n          : ''}\n      </p>\n    </div>\n  );\n}\n\nexport type UploadItem = { id: string; name: string; size: number; type: string; file: File };\nexport type FileUploadProps = {\n  accept?: string;\n  maxSize?: number;\n  multiple?: boolean;\n  disabled?: boolean;\n  onFilesChange?: (files: File[]) => void;\n  onComplete?: (files:File[])=>void;\n  renderFileIcon?: (file:File)=>ReactNode;\n  onUpload?: (file:File,onProgress:(percent:number)=>void,signal:AbortSignal)=>Promise<void>;\n};\nexport function FileUpload({\n  accept = '.png,.jpg,.jpeg,.svg,.pdf',\n  maxSize = 10 * 1024 * 1024,\n  multiple = true,\n  disabled = false,\n  onFilesChange,\n  renderFileIcon,\n  onComplete,\n  onUpload,\n}: FileUploadProps) {\n  const [files, setFiles] = useState<UploadItem[]>([]),\n    [errors, setErrors] = useState<string[]>([]),\n    [drag, setDrag] = useState(false),\n    [progress,setProgress] = useState<number|null>(null),\n    [uploading,setUploading] = useState(false),\n    [uploadMessage,setUploadMessage] = useState(''),\n    controller=useRef<AbortController|null>(null),\n    id = useId(),\n    sequence = useRef(0);\n  useEffect(()=>()=>controller.current?.abort(),[]);\n  const allowed = accept.split(',').map((x) => x.trim().toLowerCase());\n  const supportedMime: Record<string, string[]> = {\n    '.png': ['image/png'],\n    '.jpg': ['image/jpeg'],\n    '.jpeg': ['image/jpeg'],\n    '.svg': ['image/svg+xml'],\n    '.pdf': ['application/pdf'],\n  };\n  const add = (incoming: File[]) => {\n    if (disabled||uploading) return;\n    const rejected: string[] = [],\n      valid: UploadItem[] = [];\n    for (const file of incoming) {\n      const extension = '.' + file.name.split('.').pop()?.toLowerCase();\n      const matches = allowed.some((pattern) =>\n        pattern.startsWith('.')\n          ? pattern === extension\n          : pattern.endsWith('/*')\n            ? file.type.startsWith(pattern.slice(0, -1))\n            : file.type === pattern,\n      );\n      const known = supportedMime[extension];\n      if (!matches || (known && file.type && !known.includes(file.type))) {\n        rejected.push(`${file.name}: unsupported file type.`);\n        continue;\n      }\n      if (file.size > maxSize) {\n        rejected.push(`${file.name}: file exceeds ${Math.round(maxSize / 1024 / 1024)} MB.`);\n        continue;\n      }\n      valid.push({\n        id: `${id}-${++sequence.current}`,\n        name: file.name,\n        size: file.size,\n        type: file.type,\n        file,\n      });\n    }\n    const next = multiple ? [...files, ...valid] : valid.slice(0, 1);\n    setFiles(next);\n    setErrors(rejected);\n    onFilesChange?.(next.map((x) => x.file));\n    if(!onUpload&&valid.length)onComplete?.(next.map(item=>item.file));\n    setProgress(null);setUploadMessage('');\n  };\n  const upload=async()=>{\n    if(!onUpload||disabled||!files.length||uploading)return;\n    controller.current?.abort();const request=new AbortController();controller.current=request;setUploading(true);setErrors([]);setProgress(0);\n    try{for(let index=0;index<files.length;index++){await onUpload(files[index].file,percent=>{if(!request.signal.aborted)setProgress(Math.max(0,Math.min(100,(index+Math.max(0,Math.min(100,percent))/100)/files.length*100)));},request.signal);if(request.signal.aborted)return;}setProgress(100);setUploadMessage('Upload complete.');onComplete?.(files.map(item=>item.file));}catch(error){if(!request.signal.aborted){setErrors([error instanceof Error?error.message:'Upload failed. Try again.']);setProgress(null);}}finally{if(controller.current===request)setUploading(false);}\n  };\n  return (\n    <div className=\"ha-upload-example\">\n      <label\n        className={`ha-upload ${drag ? 'ha-dragging' : ''} ${disabled ? 'ha-disabled' : ''}`}\n        htmlFor={id}\n        style={{'--ha-upload-progress':`${progress??0}%`} as import('react').CSSProperties}\n        data-upload-progress={progress===null?undefined:progress}\n        onDragOver={(event) => {\n          event.preventDefault();\n          if (!disabled) setDrag(true);\n        }}\n        onDragLeave={() => setDrag(false)}\n        onDrop={(event) => {\n          event.preventDefault();\n          setDrag(false);\n          add(Array.from(event.dataTransfer.files));\n        }}\n      >\n        <input\n          id={id}\n          type=\"file\"\n          multiple={multiple}\n          accept={accept}\n          disabled={disabled||uploading}\n          onChange={(event) => {\n            add(Array.from(event.target.files || []));\n            event.target.value = '';\n          }}\n        />\n        <span aria-hidden=\"true\"><UIIcon name=\"arrow-up\" /></span>\n        <strong>Click to upload or drag and drop</strong>\n        <small>\n          {accept} · maximum {Math.round(maxSize / 1024 / 1024)} MB each\n        </small>\n      </label>\n      {progress!==null&&<progress className=\"ha-upload-progress\" aria-label=\"Upload progress\" value={progress} max={100}/>}\n      {onUpload&&<div className=\"ha-upload-actions\"><Button disabled={disabled||!files.length||uploading} loading={uploading} onClick={upload}>Upload selected files</Button>{uploading&&<Button variant=\"secondary\" onClick={()=>{controller.current?.abort();setUploading(false);setProgress(null);setUploadMessage('Upload cancelled.');}}>Cancel upload</Button>}</div>}\n      {errors.length > 0 && (\n        <ul className=\"ha-upload-errors\" role=\"alert\">\n          {errors.map((error, index) => (\n            <li key={index}>{error}</li>\n          ))}\n        </ul>\n      )}\n      <ul className=\"ha-upload-list\">\n        {files.map((file) => (\n          <li key={file.id}>\n            <span aria-hidden=\"true\">{renderFileIcon?.(file.file) || file.name.split('.').pop()?.toUpperCase().slice(0,4)||'FILE'}</span>\n            <div>\n              <strong>{file.name}</strong>\n              <small>{Math.max(1, Math.round(file.size / 1024))} KB · Selected locally</small>\n            </div>\n            <Button\n              variant=\"tertiary\"\n              size=\"sm\"\n              iconOnly\n              leadingIcon=\"×\"\n              aria-label={`Remove ${file.name}`}\n              disabled={disabled}\n              onClick={() => {\n                const next = files.filter((x) => x.id !== file.id);\n                setFiles(next);\n                onFilesChange?.(next.map((x) => x.file));\n              }}\n            >\n              Remove\n            </Button>\n          </li>\n        ))}\n      </ul>\n      <p className=\"ha-status\" role=\"status\">\n        {uploadMessage||(files.length\n          ? `${files.length} file${files.length === 1 ? '' : 's'} selected locally. Nothing is uploaded.`\n          : 'No files selected.')}\n      </p>\n    </div>\n  );\n}\n\nexport type FilterRecord = { id: string; name: string; status: string; team: string };\nconst filterRecords: FilterRecord[] = [\n  { id: '1', name: 'Aarav Shah', status: 'Active', team: 'Design' },\n  { id: '2', name: 'Diya Rao', status: 'Active', team: 'Engineering' },\n  { id: '3', name: 'Kavya Nair', status: 'Invited', team: 'Design' },\n  { id: '4', name: 'Rohan Mehta', status: 'Inactive', team: 'Engineering' },\n  { id: '5', name: 'Sana Ali', status: 'Active', team: 'Operations' },\n];\nconst filterColumns: Column<FilterRecord>[] = [\n  { key: 'name', header: 'Member', value: (item) => item.name, sortable: true },\n  { key: 'status', header: 'Status', value: (item) => item.status, sortable: true },\n  { key: 'team', header: 'Team', value: (item) => item.team, sortable: true },\n];\nexport function Filters({\n  records = filterRecords,\n  disabled = false,\n}: {\n  records?: FilterRecord[];\n  disabled?: boolean;\n}) {\n  const [status, setStatus] = useState('All'),\n    [team, setTeam] = useState('All');\n  const filtered = records.filter(\n    (item) =>\n      (status === 'All' || item.status === status) && (team === 'All' || item.team === team),\n  );\n  return (\n    <div className=\"ha-filters\">\n      <div className=\"ha-filter-bar\">\n        <Select\n          label=\"Status filter\"\n          value={status}\n          disabled={disabled}\n          onChange={(event) => setStatus(event.target.value)}\n          options={['All', 'Active', 'Invited', 'Inactive'].map((value) => ({\n            value,\n            label: value,\n          }))}\n        />\n        <Select\n          label=\"Team filter\"\n          value={team}\n          disabled={disabled}\n          onChange={(event) => setTeam(event.target.value)}\n          options={['All', 'Design', 'Engineering', 'Operations'].map((value) => ({\n            value,\n            label: value,\n          }))}\n        />\n        <Button\n          variant=\"secondary\"\n          disabled={disabled}\n          onClick={() => {\n            setStatus('All');\n            setTeam('All');\n          }}\n        >\n          Clear filters\n        </Button>\n      </div>\n      <p className=\"ha-status\" role=\"status\">\n        {filtered.length} matching members\n      </p>\n      <DataTable\n        rows={filtered}\n        columns={filterColumns}\n        rowKey={(row) => row.id}\n        rowLabel={(row) => row.name}\n        disabled={disabled}\n        caption=\"Filtered team members\"\n        onRetry={() => {\n          setStatus('All');\n          setTeam('All');\n        }}\n      />\n    </div>\n  );\n}\n\nexport function InlineCTA({\n  title = 'Keep your team in sync',\n  description = 'Add your next milestone to this workspace.',\n  actionLabel = 'Add milestone',\n  onAction,\n  disabled = false,\n}: {\n  title?: string;\n  description?: string;\n  actionLabel?: string;\n  onAction?: () => void;\n  disabled?: boolean;\n}) {\n  const [milestones, setMilestones] = useState<string[]>([]);\n  return (\n    <div>\n      <div className=\"ha-inline-cta\">\n        <div>\n          <h3>{title}</h3>\n          <p>{description}</p>\n        </div>\n        <Button\n          disabled={disabled}\n          onClick={() => {\n            if (onAction) onAction();\n            else setMilestones([...milestones, `Milestone ${milestones.length + 1}`]);\n          }}\n        >\n          {actionLabel}\n        </Button>\n      </div>\n      <ul className=\"ha-milestones\" aria-live=\"polite\">\n        {milestones.map((item) => (\n          <li key={item}><UIIcon name=\"tick\" />{item}</li>\n        ))}\n      </ul>\n    </div>\n  );\n}\nexport function LoadingIndicator({\n  label = 'Loading example data',\n  disabled = false,\n  delay = 1200,\n}: {\n  label?: string;\n  disabled?: boolean;\n  delay?: number;\n}) {\n  const [phase, setPhase] = useState<'idle' | 'loading' | 'complete'>('idle'),\n    timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n  useEffect(() => () => clearTimeout(timer.current), []);\n  return (\n    <div className=\"ha-loading\">\n      <div role=\"status\" aria-busy={phase === 'loading'}>\n        {phase === 'loading' ? (\n          <>\n            <span className=\"hu-spinner\" aria-hidden=\"true\" />\n            <strong>{label}<UIIcon name=\"more\" /></strong>\n          </>\n        ) : phase === 'complete' ? (\n          <>\n            <span aria-hidden=\"true\"><UIIcon name=\"tick\" /></span>\n            <strong>Local example loaded</strong>\n          </>\n        ) : (\n          <strong>Ready to load</strong>\n        )}\n      </div>\n      <Button\n        disabled={disabled}\n        loading={phase === 'loading'}\n        onClick={() => {\n          clearTimeout(timer.current);\n          setPhase('loading');\n          timer.current = setTimeout(() => setPhase('complete'), Math.max(0, delay));\n        }}\n      >\n        {phase === 'complete' ? 'Load again' : 'Load example'}\n      </Button>\n    </div>\n  );\n}\n\nexport type Metric = {\n  label: string;\n  value: string;\n  change: string;\n  trend?: 'up' | 'down';\n  description?: string;\n};\nexport function Metrics({\n  items = [\n    { label: 'Total revenue', value: '₹18,880', change: '7.4%', trend: 'up' },\n    { label: 'Active members', value: '4,862', change: '9.2%', trend: 'up' },\n    { label: 'Open rate', value: '82%', change: '8.1%', trend: 'up' },\n  ],\n}: {\n  items?: Metric[];\n}) {\n  return (\n    <div className=\"ha-metrics\">\n      {items.map((item) => (\n        <article key={item.label}>\n          <span>{item.label}</span>\n          <strong>{item.value}</strong>\n          <small className={item.trend === 'down' ? 'ha-negative' : 'ha-positive'}>\n            {item.trend === 'down' ? <UIIcon name=\"arrow-down\" /> : <UIIcon name=\"arrow-up\" />} {item.change}{' '}\n            <span>{item.description || 'vs. last period'}</span>\n          </small>\n        </article>\n      ))}\n    </div>\n  );\n}\n\nexport type PaginationProps = {\n  page?: number;\n  defaultPage?: number;\n  pageCount?: number;\n  onPageChange?: (page: number) => void;\n  disabled?: boolean;\n  label?: string;\n};\nexport function Pagination({\n  page,\n  defaultPage = 1,\n  pageCount = 5,\n  onPageChange,\n  disabled = false,\n  label = 'Pagination',\n}: PaginationProps) {\n  const {direction}=useDirection();\n  const [local, setLocal] = useState(defaultPage),\n    pages = Math.max(1, Math.floor(pageCount)),\n    current = Math.min(pages, Math.max(1, page ?? local));\n  const choose = (next: number) => {\n    const selected = Math.min(pages, Math.max(1, next));\n    setLocal(selected);\n    onPageChange?.(selected);\n  };\n  return (\n    <nav className=\"ha-pagination\" aria-label={label}>\n      <Button\n        variant=\"secondary\"\n        size=\"sm\"\n        disabled={disabled || current === 1}\n        onClick={() => choose(current - 1)}\n      ><UIIcon name={direction==='rtl'?'arrow-right':'arrow-left'} /> Previous</Button>\n      <div>\n        {Array.from({ length: pages }, (_, index) => index + 1)\n          .filter(\n            (number) =>\n              pages <= 7 || number === 1 || number === pages || Math.abs(number - current) <= 1,\n          )\n          .flatMap((number,index,visible) => [index>0&&number-visible[index-1]>1?<span key={'gap-'+number} className=\"ha-pagination-gap\" aria-hidden=\"true\"><UIIcon name=\"more\" /></span>:null,\n            <button\n              key={number}\n              type=\"button\"\n              disabled={disabled}\n              aria-label={`Page ${number}`}\n              aria-current={current === number ? 'page' : undefined}\n              onClick={() => choose(number)}\n            >\n              {number}\n            </button>\n          ])}\n      </div>\n      <Button\n        variant=\"secondary\"\n        size=\"sm\"\n        disabled={disabled || current === pages}\n        onClick={() => choose(current + 1)}\n      >Next <UIIcon name={direction==='rtl'?'arrow-left':'arrow-right'} /></Button>\n    </nav>\n  );\n}\nfunction PaginationExample({ disabled = false }: { disabled?: boolean }) {\n  const [page, setPage] = useState(1);\n  return (\n    <div className=\"ha-pagination-example\">\n      <h3>Workspace projects</h3>\n      <ol start={(page - 1) * 3 + 1}>\n        {Array.from({ length: 3 }, (_, i) => (\n          <li key={(page - 1) * 3 + i}>Project {(page - 1) * 3 + i + 1}</li>\n        ))}\n      </ol>\n      <Pagination page={page} pageCount={181} onPageChange={setPage} disabled={disabled} />\n      <p role=\"status\" className=\"ha-status\">\n        Page {page} of 181\n      </p>\n    </div>\n  );\n}\nexport type ProgressStep = { id: string; label: string; description: string };\nexport function ProgressSteps({\n  steps = [\n    { id: 'details', label: 'Details', description: 'Enter your workspace details.' },\n    {\n      id: 'team',\n      label: 'Invite team',\n      description: 'Add members who will collaborate in this workspace.',\n    },\n    { id: 'finish', label: 'Finish', description: 'Review your workspace and confirm the setup.' },\n  ],\n  disabled = false,\n  onComplete,\n}: {\n  steps?: ProgressStep[];\n  disabled?: boolean;\n  onComplete?: () => void;\n}) {\n  const [step, setStep] = useState(0),\n    [completed, setCompleted] = useState(false),\n    [workspace, setWorkspace] = useState('Helios team'),\n    [email, setEmail] = useState(''),\n    [error, setError] = useState('');\n  const forward = () => {\n    if (step === 0 && !workspace.trim()) {\n      setError('Enter a workspace name.');\n      return;\n    }\n    if (step === 1 && email && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) {\n      setError('Enter a valid team email address.');\n      return;\n    }\n    setError('');\n    if (step < steps.length - 1) setStep(step + 1);\n    else {\n      setCompleted(true);\n      onComplete?.();\n    }\n  };\n  return (\n    <div className=\"ha-progress-steps\">\n      <ol aria-label=\"Setup progress\">\n        {steps.map((item, index) => (\n          <li\n            key={item.id}\n            aria-current={index === step ? 'step' : undefined}\n            data-completed={index < step || completed}\n          >\n            <span>{index < step || completed ? '✓' : index + 1}</span>\n            <strong>{item.label}</strong>\n          </li>\n        ))}\n      </ol>\n      {completed ? (\n        <div role=\"status\">\n          <h3>Workspace example ready</h3>\n          <p>{workspace} has been configured locally.</p>\n          <Button\n            variant=\"secondary\"\n            disabled={disabled}\n            onClick={() => {\n              setCompleted(false);\n              setStep(0);\n            }}\n          >\n            Start again\n          </Button>\n        </div>\n      ) : (\n        <section aria-live=\"polite\">\n          <h3>{steps[step]?.label}</h3>\n          <p>{steps[step]?.description}</p>\n          {step === 0 ? (\n            <Input\n              label=\"Workspace name\"\n              value={workspace}\n              onChange={(event) => setWorkspace(event.target.value)}\n              error={error}\n              disabled={disabled}\n              required\n            />\n          ) : step === 1 ? (\n            <Input\n              label=\"Team email\"\n              value={email}\n              onChange={(event) => setEmail(event.target.value)}\n              error={error}\n              disabled={disabled}\n              hint=\"Optional. This example sends no invitation.\"\n            />\n          ) : (\n            <dl>\n              <dt>Workspace</dt>\n              <dd>{workspace}</dd>\n              <dt>Team email</dt>\n              <dd>{email || 'No email added'}</dd>\n            </dl>\n          )}\n          <div className=\"hu-actions\">\n            <Button\n              variant=\"secondary\"\n              disabled={disabled || step === 0}\n              onClick={() => {\n                setStep(step - 1);\n                setError('');\n              }}\n            >\n              Back\n            </Button>\n            <Button disabled={disabled} onClick={forward}>\n              {step === steps.length - 1 ? 'Finish' : 'Continue'}\n            </Button>\n          </div>\n        </section>\n      )}\n    </div>\n  );\n}\n\nexport function SectionFooter({\n  defaultValue = 'Helios team',\n  label = 'Workspace name',\n  disabled = false,\n  onSave,\n}: {\n  defaultValue?: string;\n  label?: string;\n  disabled?: boolean;\n  onSave?: (value: string) => void;\n}) {\n  const [value, setValue] = useState(defaultValue),\n    [saved, setSaved] = useState(defaultValue),\n    [status, setStatus] = useState(''),\n    [error, setError] = useState('');\n  return (\n    <form\n      className=\"ha-section-footer\"\n      noValidate\n      onSubmit={(event) => {\n        event.preventDefault();\n        if (!value.trim()) {\n          setError('Enter a workspace name.');\n          return;\n        }\n        setSaved(value);\n        setError('');\n        setStatus('Changes saved in this local example.');\n        onSave?.(value);\n      }}\n    >\n      <Input\n        label={label}\n        value={value}\n        disabled={disabled}\n        required\n        error={error}\n        onChange={(event) => {\n          setValue(event.target.value);\n          setStatus('');\n        }}\n      />\n      <footer>\n        <span>Changes apply to this preview.</span>\n        <Button\n          variant=\"secondary\"\n          disabled={disabled}\n          onClick={() => {\n            setValue(saved);\n            setError('');\n            setStatus('Last saved value restored.');\n          }}\n        >\n          Cancel\n        </Button>\n        <Button type=\"submit\" disabled={disabled}>\n          Save changes\n        </Button>\n      </footer>\n      <p role=\"status\" className=\"ha-status\">\n        {status}\n      </p>\n    </form>\n  );\n}\n\nexport function SlideoutMenu({\n  title = 'Activity details',\n  description = 'Review the latest workspace activity.',\n  children,\n  disabled = false,\n  triggerLabel = 'Open slideout',\n}: {\n  title?: string;\n  description?: string;\n  children?: ReactNode;\n  disabled?: boolean;\n  triggerLabel?: string;\n}) {\n  const {direction}=useDirection();\n  const [open, setOpen] = useState(false),\n    reduce = useReducedMotion();\n  return (\n    <div className=\"ha-slideout\">\n      <Button disabled={disabled} onClick={() => setOpen(true)}>\n        {triggerLabel}\n      </Button>\n      <Dialog\n        open={open}\n        onOpenChange={setOpen}\n        title={title}\n        description={description}\n        footer={<Button onClick={() => setOpen(false)}>Done</Button>}\n      >\n        <motion.div\n          className=\"ha-drawer-panel\"\n          initial={false}\n          animate={{ x: open ? 0 : reduce ? 0 : direction==='rtl'?-24:24, opacity: open ? 1 : 0 }}\n          transition={{ duration: reduce ? 0 : 0.2 }}\n        >\n          {children || (\n            <dl className=\"hu-record\">\n              <dt>Created by</dt>\n              <dd>Aarav Shah</dd>\n              <dt>Status</dt>\n              <dd>Ready for review</dd>\n              <dt>Project</dt>\n              <dd>Helios UI</dd>\n            </dl>\n          )}\n        </motion.div>\n      </Dialog>\n    </div>\n  );\n}\n\nexport type TreeNode = { id: string; label: string; children?: TreeNode[]; icon?: ReactNode; disabled?: boolean };\nconst treeNodes: TreeNode[] = [\n  {\n    id: 'workspace',\n    label: 'Workspace',\n    children: [\n      {\n        id: 'design',\n        label: 'Design',\n        children: [\n          { id: 'foundations', label: 'Foundations' },\n          { id: 'components', label: 'Components' },\n        ],\n      },\n      {\n        id: 'development',\n        label: 'Development',\n        children: [\n          { id: 'web', label: 'Web application' },\n          { id: 'mobile', label: 'Mobile application' },\n        ],\n      },\n      { id: 'resources', label: 'Resources', children: [{ id: 'docs', label: 'Documentation' }] },\n    ],\n  },\n];\nfunction renderTreeNode(node: TreeNode,rtl=false) {\n  return (\n    <TreeItem key={node.id} id={node.id} textValue={node.label}>\n      <TreeItemContent>\n        {({ hasChildItems, isExpanded }) => (\n          <>\n            {hasChildItems?<AriaButton\n              slot=\"chevron\"\n              className=\"ha-tree-chevron\"\n              aria-label={`${isExpanded ? 'Collapse' : 'Expand'} ${node.label}`}\n            >\n              {hasChildItems ? <UIIcon name={isExpanded?'chevron-down':rtl?'chevron-left':'chevron-right'}/> : null}\n            </AriaButton>:<span className=\"ha-tree-chevron ha-tree-leaf-spacer\" aria-hidden=\"true\"/>}\n            <span className=\"ha-tree-custom-icon\" aria-hidden=\"true\">{node.icon || <svg className=\"ha-tree-file-icon\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" aria-hidden=\"true\">{hasChildItems?<path d={isExpanded?'M3 7h6l2 2h10l-3 11H2L3 7Zm0 2V4h6l2 3h9v2':'M3 5h7l2 3h9v12H3V5Z'}/>:<><path d=\"M5 3h9l5 5v13H5V3Z\"/><path d=\"M14 3v6h5\"/></>}</svg>}</span><span>{node.label}</span>\n          </>\n        )}\n      </TreeItemContent>\n      {node.children?.map(child=>renderTreeNode(child,rtl))}\n    </TreeItem>\n  );\n}\nexport type TreeViewProps = {\n  items?: TreeNode[]; dir?: 'ltr'|'rtl'; disabled?: boolean; size?: 'sm'|'md'|'lg';\n  selectionMode?: 'none'|'single'|'multiple';\n  selectedKeys?: Iterable<string>; defaultSelectedKeys?: Iterable<string>;\n  expandedKeys?: Iterable<string>; defaultExpandedKeys?: Iterable<string>;\n  onSelectionChange?: (keys: string[]) => void; onExpandedChange?: (keys: string[]) => void;\n};\nexport function TreeView({items = treeNodes, disabled = false, onSelectionChange, onExpandedChange,\n  dir, size='md', selectionMode='multiple', selectedKeys, defaultSelectedKeys=[],\n  expandedKeys, defaultExpandedKeys=['workspace','design'],\n}: TreeViewProps) {\n  const inherited=useDirection(),resolvedDir=dir??inherited.direction,locale=dir&&dir!==inherited.direction?(dir==='rtl'?'ar-AE':'en-IN'):inherited.locale;\n  const [selected, setSelected] = useState(()=>Array.from(defaultSelectedKeys)),\n    [expanded, setExpanded] = useState(()=>Array.from(defaultExpandedKeys)), reduce = useReducedMotion();\n  const currentSelected = Array.from(selectedKeys ?? selected), currentExpanded = new Set(expandedKeys ?? expanded), disabledKeys: string[]=[];\n  const keys: string[]=[];\n  const collect=(nodes:TreeNode[])=>nodes.forEach(node=>{keys.push(node.id);if(disabled||node.disabled)disabledKeys.push(node.id);if(node.children)collect(node.children)});\n  collect(items);\n  const countVisible=(nodes:TreeNode[]):number=>nodes.reduce((sum,node)=>sum+1+(node.children&&currentExpanded.has(node.id)?countVisible(node.children):0),0);\n  const rowHeight=size==='sm'?28:size==='lg'?44:36;\n  return <I18nProvider locale={locale}><div className=\"ha-tree-example\" dir={resolvedDir}>\n    <motion.div className=\"ha-tree-frame\" initial={false} animate={{height:countVisible(items)*rowHeight+26}} transition={{duration:reduce?0:0.18,ease:'easeOut'}}>\n      <Tree aria-label=\"Workspace files\" className={'ha-tree ha-tree-'+size} selectionMode={selectionMode}\n        expandedKeys={currentExpanded} onExpandedChange={selection=>{const next=Array.from(selection,String);setExpanded(next);onExpandedChange?.(next)}}\n        disabledKeys={disabledKeys} selectedKeys={selectionMode==='none'?[]:currentSelected}\n        onSelectionChange={selection=>{const next=selection==='all'?keys:Array.from(selection,String);setSelected(next);onSelectionChange?.(next)}}>\n        {items.map(node=>renderTreeNode(node,resolvedDir==='rtl'))}\n      </Tree>\n    </motion.div>\n    <p role=\"status\" className=\"ha-status\">{currentSelected.length&&selectionMode!=='none'?`${currentSelected.length} item${currentSelected.length===1?'':'s'} selected: ${currentSelected.join(', ')}`:`Use arrows to navigate, ${resolvedDir==='rtl'?'Left':'Right'} to expand and Space to select.`}</p>\n  </div></I18nProvider>;\n}\nfunction TreeExample({disabled=false}:{disabled?:boolean}) {\n  const inherited=useDirection();\n  const [overrideDir,setDir]=useState<'ltr'|'rtl'|undefined>(),[mode,setMode]=useState<'single'|'multiple'|'none'>('multiple'),[size,setSize]=useState<'sm'|'md'|'lg'>('md'),[expanded,setExpanded]=useState(['workspace','design']),[selected,setSelected]=useState<string[]>([]);\n  const dir=overrideDir??inherited.direction;\n  return <div className=\"ha-tree-demo\"><TreeView disabled={disabled} dir={dir} size={size} selectionMode={mode} expandedKeys={expanded} onExpandedChange={setExpanded} selectedKeys={selected} onSelectionChange={setSelected}/><details className=\"ha-tree-controls\"><summary>Tree options</summary><div className=\"hu-actions\">\n    <Select label=\"Tree direction\" value={dir} disabled={disabled} onChange={event=>setDir(event.target.value as 'ltr'|'rtl')} options={[{value:'ltr',label:'Left to right'},{value:'rtl',label:'Right to left'}]}/>\n    <Select label=\"Tree selection\" value={mode} disabled={disabled} onChange={event=>{setMode(event.target.value as typeof mode);setSelected([])}} options={[{value:'single',label:'Single selection'},{value:'multiple',label:'Multiple selection'},{value:'none',label:'Navigation only'}]}/>\n    <Select label=\"Tree size\" value={size} disabled={disabled} onChange={event=>setSize(event.target.value as typeof size)} options={['sm','md','lg'].map(value=>({value,label:value.toUpperCase()}))}/>\n  </div><div className=\"hu-actions\"><Button variant=\"secondary\" size=\"sm\" disabled={disabled} onClick={()=>setExpanded(['workspace','design','development','resources'])}>Expand all</Button><Button variant=\"secondary\" size=\"sm\" disabled={disabled} onClick={()=>setExpanded([])}>Collapse all</Button></div>\n  </details></div>;\n}\n\nexport const applicationFamilyIds = [\n  'activity-feeds',\n  'alerts-and-notifications',\n  'application-navigation',\n  'breadcrumbs',\n  'calendars',\n  'card-headers',\n  'code-snippets',\n  'color-pickers',\n  'command-menus',\n  'content-dividers',\n  'date-pickers',\n  'empty-states',\n  'file-upload',\n  'filters',\n  'inline-ctas',\n  'loading-indicators',\n  'metrics',\n  'page-headers',\n  'pagination',\n  'progress-steps',\n  'section-footers',\n  'section-headers',\n  'slideout-menus',\n  'tree-views',\n] as const;\nexport type ApplicationFamilyId = (typeof applicationFamilyIds)[number];\nexport function ApplicationFamilyPreview({\n  id,\n  state = 'ready',\n  onRetry,\n  disabled: configuredDisabled = false,\n  size = 'md',\n}: FamilyProps & { id: string }) {\n  const overlayHost=useRef<HTMLDivElement>(null);\n  const disabled=configuredDisabled||state!=='ready';\n  let content: ReactNode;\n  switch (id) {\n    case 'activity-feeds':\n      content = <ActivityFeed disabled={disabled} />;\n      break;\n    case 'alerts-and-notifications':\n      content = <NotificationExample disabled={disabled} />;\n      break;\n    case 'application-navigation':\n      content = <ApplicationNavigation disabled={disabled} />;\n      break;\n    case 'breadcrumbs':\n      content = <BreadcrumbExample disabled={disabled} />;\n      break;\n    case 'calendars':\n      content = <Calendar disabled={disabled} />;\n      break;\n    case 'card-headers':\n      content = <CardHeader disabled={disabled} />;\n      break;\n    case 'code-snippets':\n      content = <CodeSnippet disabled={disabled} />;\n      break;\n    case 'color-pickers':\n      content = <ColorPicker disabled={disabled} />;\n      break;\n    case 'command-menus':\n      content = <CommandMenu disabled={disabled} />;\n      break;\n    case 'content-dividers':\n      content = <DividerExample disabled={disabled} />;\n      break;\n    case 'date-pickers':\n      content = <div className=\"ha-date-examples\"><section><h3>Date range</h3><DateRangePicker disabled={disabled}/></section><section><h3>Single date</h3><DatePicker disabled={disabled}/></section><section><h3>Meeting scheduler</h3><MeetingScheduler disabled={disabled}/></section></div>;\n      break;\n    case 'empty-states':\n      content = <EmptyState disabled={disabled} />;\n      break;\n    case 'file-upload':\n      content = <FileUpload disabled={disabled} />;\n      break;\n    case 'filters':\n      content = <Filters disabled={disabled} />;\n      break;\n    case 'inline-ctas':\n      content = <InlineCTA disabled={disabled} />;\n      break;\n    case 'loading-indicators':\n      content = <LoadingIndicator disabled={disabled} />;\n      break;\n    case 'metrics':\n      content = <Metrics />;\n      break;\n    case 'page-headers':\n      content = <PageHeader disabled={disabled} />;\n      break;\n    case 'pagination':\n      content = <PaginationExample disabled={disabled} />;\n      break;\n    case 'progress-steps':\n      content = <ProgressSteps disabled={disabled} />;\n      break;\n    case 'section-footers':\n      content = <SectionFooter disabled={disabled} />;\n      break;\n    case 'section-headers':\n      content = <SectionHeader disabled={disabled} />;\n      break;\n    case 'slideout-menus':\n      content = <SlideoutMenu disabled={disabled} />;\n      break;\n    case 'tree-views':\n      content = <TreeExample disabled={disabled} />;\n      break;\n    default:\n      throw new Error(`Unknown application family: ${id}`);\n  }\n  return (\n    <div className={`ha-family ha-size-${size}`} data-application-family={id}>\n      {state!=='ready'&&<DataState state={state} onRetry={onRetry}/>}\n      <div style={{display:state==='ready'?'contents':'none'}} hidden={state!=='ready'} inert={state!=='ready'||undefined}><UNSAFE_PortalProvider getContainer={()=>overlayHost.current}>{content}<div ref={overlayHost} style={{display:'contents'}}/></UNSAFE_PortalProvider></div>\n    </div>\n  );\n}\n",
  "src/AriaPrimitives.tsx": "'use client';\n/** Keep composition primitives in the same Aria context as the source-native controls. */\nexport{RangeCalendar as NativeRangeCalendar}from'react-aria-components';\nexport{parseDate as parseNativeDate}from'@internationalized/date';\n",
  "src/BaseFamilies.tsx": "'use client';\nimport { UNSAFE_PortalProvider } from 'react-aria';\nimport { UIIcon } from './icons.js';\nimport { useDirection } from './Direction.js';\n\nimport { renderIcon } from './icons.js';\n\nimport { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport {\n  Button as AriaButton,\n  Label,\n  Menu,\n  MenuItem,\n  MenuTrigger,\n  OverlayArrow,\n  Popover,\n  Radio as AriaRadio,\n  RadioGroup as AriaRadioGroup,\n  Slider as AriaSlider,\n  SliderOutput,\n  SliderThumb,\n  SliderTrack,\n  Switch as AriaSwitch,\n  Tooltip as AriaTooltip,\n  TooltipTrigger,\n} from 'react-aria-components';\nimport { motion } from 'motion/react';\nimport { useMotionPreference as useReducedMotion } from './useMotionPreference.js';\nimport { Button, DataState, Input, Select } from './components.js';\nimport type { FamilyProps } from './family-types.js';\n\nfunction useValue<T>(value: T | undefined, initial: T, onChange?: (value: T) => void) {\n  const [local, setLocal] = useState(initial);\n  return [\n    value === undefined ? local : value,\n    (next: T) => {\n      setLocal(next);\n      onChange?.(next);\n    },\n  ] as const;\n}\nexport type BaseSize = 'sm' | 'md' | 'lg';\nexport type AvatarProps = {\n  name: string;\n  src?: string;\n  tone?: 'neutral' | 'brand';\n  size?: BaseSize | 'xs';\n  status?: 'online' | 'offline' | 'away';\n  selected?: boolean;\n  disabled?: boolean;\n  onPress?: () => void;\n};\n/** Initials remain available when the supplied image cannot be loaded. */\nexport function Avatar({\n  name,\n  src,\n  tone = 'brand',\n  size = 'md',\n  status,\n  selected = false,\n  disabled = false,\n  onPress,\n}: AvatarProps) {\n  const [broken, setBroken] = useState(false),\n    reduce = useReducedMotion();\n  useEffect(() => setBroken(false), [src]);\n  const initials =\n    name\n      .trim()\n      .split(/\\s+/)\n      .slice(0, 2)\n      .map((part) => part[0])\n      .join('')\n      .toUpperCase() || '?';\n  const content = (\n    <>\n      {src && !broken ? (\n        <img src={src} alt=\"\" onError={() => setBroken(true)} />\n      ) : (\n        <span aria-hidden=\"true\">{initials}</span>\n      )}\n      {status && <i className={`hb-avatar-status hb-${status}`} aria-hidden=\"true\" />}\n    </>\n  );\n  const className = `hb-avatar hb-${size} hb-avatar-${tone} ${selected ? 'hb-selected' : ''}`;\n  return onPress ? (\n    <motion.button\n      type=\"button\"\n      className={className}\n      disabled={disabled}\n      aria-label={`Select ${name}${status ? ', ' + status : ''}`}\n      aria-pressed={selected}\n      onClick={onPress}\n      whileHover={!reduce && !disabled ? { scale: 1.04 } : undefined}\n      whileTap={!reduce && !disabled ? { scale: 0.96 } : undefined}\n    >\n      {content}\n    </motion.button>\n  ) : (\n    <span className={className} role=\"img\" aria-label={`${name}${status ? ', ' + status : ''}`}>\n      {content}\n    </span>\n  );\n}\nexport type AvatarItem = { id: string; name: string; src?: string; status?: AvatarProps['status'] };\nexport const sampleAvatars: AvatarItem[] = [\n  { id: 'aarav', name: 'Aarav Shah', status: 'online' },\n  { id: 'diya', name: 'Diya Rao', status: 'away' },\n  { id: 'kavya', name: 'Kavya Nair', status: 'online' },\n  { id: 'rohan', name: 'Rohan Mehta', status: 'offline' },\n];\nexport type AvatarGroupProps = {\n  items?: AvatarItem[];\n  value?: string;\n  defaultValue?: string;\n  onValueChange?: (id: string) => void;\n  size?: BaseSize | 'xs';\n  disabled?: boolean;\n  allowUpload?: boolean;\n  onImageChange?: (file: File) => void;\n};\nexport function AvatarGroup({\n  items = sampleAvatars,\n  value,\n  defaultValue = items[0]?.id || '',\n  onValueChange,\n  size = 'md',\n  disabled = false,\n  allowUpload = true,\n  onImageChange,\n}: AvatarGroupProps) {\n  const [selected, select] = useValue(value, defaultValue, onValueChange),\n    [file, setFile] = useState<File | null>(null),\n    [url, setUrl] = useState(''),\n    [message, setMessage] = useState('');\n  const inputId = useId();\n  useEffect(() => {\n    if (!file) {\n      setUrl('');\n      return;\n    }\n    const objectUrl = URL.createObjectURL(file);\n    setUrl(objectUrl);\n    return () => URL.revokeObjectURL(objectUrl);\n  }, [file]);\n  const chooseFile = (next?: File) => {\n    if (!next) return;\n    if (!['image/png', 'image/jpeg', 'image/webp'].includes(next.type)) {\n      setMessage('Choose a PNG, JPEG or WebP image.');\n      return;\n    }\n    if (next.size > 5 * 1024 * 1024) {\n      setMessage('Choose an image smaller than 5 MB.');\n      return;\n    }\n    setFile(next);\n    select('uploaded');\n    onImageChange?.(next);\n    setMessage(`${next.name} selected locally. Nothing was uploaded.`);\n  };\n  return (\n    <div className=\"hb-avatar-picker\">\n      <div className=\"hb-avatar-group\" role=\"group\" aria-label=\"Choose a profile avatar\">\n        {items.map((item) => (\n          <Avatar\n            key={item.id}\n            {...item}\n            size={size}\n            selected={selected === item.id}\n            disabled={disabled}\n            onPress={() => {\n              select(item.id);\n              setMessage(`${item.name} selected.`);\n            }}\n          />\n        ))}\n        {url && (\n          <Avatar\n            name=\"Uploaded photo\"\n            src={url}\n            size={size}\n            selected={selected === 'uploaded'}\n            disabled={disabled}\n            onPress={() => {\n              select('uploaded');\n              setMessage('Uploaded photo selected locally.');\n            }}\n          />\n        )}\n        {allowUpload && (\n          <label\n            className={`hb-avatar-upload hb-${size} ${disabled ? 'hb-disabled' : ''}`}\n            htmlFor={inputId}\n          >\n            <span aria-hidden=\"true\"><UIIcon name=\"plus\" /></span>\n            <span className=\"hu-sr-only\">Choose an avatar image</span>\n            <input\n              id={inputId}\n              type=\"file\"\n              accept=\"image/png,image/jpeg,image/webp\"\n              disabled={disabled}\n              onChange={(event) => {\n                chooseFile(event.target.files?.[0]);\n                event.target.value = '';\n              }}\n            />\n          </label>\n        )}\n      </div>\n      <p role=\"status\" className=\"hb-status\">\n        {message || 'Select a teammate or choose an image. Images stay on this device.'}\n      </p>\n    </div>\n  );\n}\n\nexport type BadgeTone = 'neutral' | 'success' | 'warning' | 'error' | 'info' | 'brand';\nexport type BadgeProps = {\n  children: ReactNode;\n  tone?: BadgeTone;\n  size?: BaseSize;\n  leadingIcon?: ReactNode;\n  onDismiss?: () => void;\n  dismissLabel?: string;\n  disabled?: boolean;\n};\nexport function Badge({\n  children,\n  tone = 'neutral',\n  size = 'md',\n  leadingIcon,\n  onDismiss,\n  dismissLabel = 'Dismiss badge',\n  disabled = false,\n}: BadgeProps) {\n  return (\n    <span className={`hb-badge hb-tone-${tone} hb-${size}`}>\n      {leadingIcon && (\n        <span className=\"hb-badge-icon\" aria-hidden=\"true\">\n          {renderIcon(leadingIcon)}\n        </span>\n      )}\n      <span>{children}</span>\n      {onDismiss && (\n        <button type=\"button\" aria-label={dismissLabel} disabled={disabled} onClick={onDismiss}><UIIcon name=\"close\" /></button>\n      )}\n    </span>\n  );\n}\nexport function Kbd({ children, label }: { children: ReactNode; label?: string }) {\n  return (\n    <kbd className=\"hb-kbd\" aria-label={label}>\n      {children}\n    </kbd>\n  );\n}\nfunction AvatarExample(props: FamilyProps) {\n  return (\n    <div className=\"hb-example-stack\">\n      <div className=\"hb-inline\">\n        <Avatar name=\"Extra small avatar\" size=\"xs\" />\n        <Avatar name=\"Kavya Nair\" src=\"/assets/322-236-Avatar.png\" size={props.size} />\n        <Avatar name=\"Helios team\" tone=\"brand\" size={props.size} />\n        <Avatar name=\"Design team\" tone=\"neutral\" size={props.size} />\n      </div>\n      <AvatarGroup {...props} />\n    </div>\n  );\n}\nexport type ButtonGroupItem = {\n  id: string;\n  label: string;\n  disabled?: boolean;\n  icon?: ReactNode;\n  iconOnly?: boolean;\n};\nexport type ButtonGroupProps = {\n  label: string;\n  items: ButtonGroupItem[];\n  value?: string;\n  defaultValue?: string;\n  onValueChange?: (id: string) => void;\n  disabled?: boolean;\n  size?: BaseSize;\n};\nexport function ButtonGroup({\n  label,\n  items,\n  value,\n  defaultValue = items.find((item) => !item.disabled)?.id || '',\n  onValueChange,\n  disabled = false,\n  size = 'md',\n}: ButtonGroupProps) {\n  const {direction}=useDirection();\n  const [selected, select] = useValue(value, defaultValue, onValueChange),\n    root = useRef<HTMLDivElement>(null),\n    enabled = items.filter((item) => !item.disabled),\n    current = enabled.some((item) => item.id === selected) ? selected : enabled[0]?.id;\n  return (\n    <div\n      ref={root}\n      className={`hb-button-group hb-${size}`}\n      role=\"group\"\n      aria-label={label}\n      onKeyDown={(event) => {\n        if (disabled || !['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key)) return;\n        const index = enabled.findIndex((item) => item.id === current),\n          next =\n            event.key === 'Home'\n              ? enabled[0]\n              : event.key === 'End'\n                ? enabled.at(-1)\n                : enabled[\n                    (index + (event.key === (direction==='rtl'?'ArrowLeft':'ArrowRight') ? 1 : -1) + enabled.length) %\n                      enabled.length\n                  ];\n        if (next) {\n          event.preventDefault();\n          select(next.id);\n          root.current\n            ?.querySelector<HTMLButtonElement>(`[data-group-id=\"${CSS.escape(next.id)}\"]`)\n            ?.focus();\n        }\n      }}\n    >\n      {items.map((item) => (\n        <button\n          key={item.id}\n          type=\"button\"\n          data-group-id={item.id}\n          disabled={disabled || item.disabled}\n          aria-label={item.iconOnly ? item.label : undefined}\n          title={item.iconOnly ? item.label : undefined}\n          aria-pressed={current === item.id}\n          tabIndex={current === item.id ? 0 : -1}\n          onClick={() => select(item.id)}\n        >\n          {item.icon && <span aria-hidden=\"true\">{renderIcon(item.icon)}</span>}\n          {!item.iconOnly && item.label}\n        </button>\n      ))}\n    </div>\n  );\n}\n\nexport type DropdownItem = {\n  id: string;\n  label: string;\n  description?: string;\n  disabled?: boolean;\n  destructive?: boolean;\n  icon?: ReactNode;\n  avatar?: string;\n  shortcut?: string;\n  trailing?: ReactNode;\n  content?: ReactNode;\n  separator?: boolean;\n};\nexport type DropdownMenuProps = {\n  label?: string;\n  items: DropdownItem[];\n  onAction: (id: string) => void;\n  disabled?: boolean;\n  size?: BaseSize;\n  selectedKey?: string;\n  header?: ReactNode;\n  footer?: ReactNode;\n  triggerContent?: ReactNode;\n};\n/** React Aria supplies focus movement, typeahead, Escape and non-modal popover behavior. */\nexport function DropdownMenu({\n  label = 'Account options',\n  items,\n  onAction,\n  disabled = false,\n  size = 'md',\n  selectedKey,\n  header, footer, triggerContent,\n}: DropdownMenuProps) {\n  const {direction,locale}=useDirection();\n  const [open, setOpen] = useState(false),\n    triggerRef=useRef<HTMLButtonElement>(null),footerRef=useRef<HTMLDivElement>(null),menuRef=useRef<HTMLDivElement>(null);\n  useEffect(()=>{if(disabled)setOpen(false)},[disabled]);\n  return (\n    <MenuTrigger isOpen={open} onOpenChange={setOpen}>\n      <AriaButton\n        className={`hu-button hu-secondary hu-${size} hb-menu-trigger`}\n        ref={triggerRef}\n        aria-label={triggerContent?label:undefined}\n        isDisabled={disabled}\n        onKeyDown={(event) => {\n          if (event.key === 'Escape') {\n            event.preventDefault();\n            setOpen(false);\n          }\n        }}\n      >\n        {triggerContent||label}\n        {!triggerContent && <span aria-hidden=\"true\"><UIIcon name=\"chevron-down\" /></span>}\n      </AriaButton>\n      <Popover dir={direction} lang={locale} className=\"hb-popover\" placement=\"bottom start\" offset={8}>\n        {header&&<div className=\"hb-menu-header\">{header}</div>}\n        <div onKeyDownCapture={event=>{if(event.key==='Tab'&&!event.shiftKey&&footer){const first=footerRef.current?.querySelector<HTMLElement>('button:not(:disabled),a[href],input:not(:disabled)');if(first){event.preventDefault();event.stopPropagation();first.focus()}}}}><Menu ref={menuRef}\n          aria-label={label}\n          className=\"hb-menu\"\n          selectionMode={selectedKey !== undefined ? 'single' : 'none'}\n          selectedKeys={selectedKey !== undefined ? new Set([selectedKey]) : undefined}\n          disabledKeys={items.filter((item) => disabled || item.disabled).map((item) => item.id)}\n          onAction={(key) => {\n            onAction(String(key));\n            setOpen(false);\n          }}\n        >\n          {items.map((item) => (\n            <MenuItem\n              key={item.id}\n              id={item.id}\n              textValue={item.label}\n              className={`hb-menu-item ${item.destructive ? 'hb-menu-danger' : ''} ${item.separator ? 'hb-menu-separator' : ''}`}\n              aria-label={item.label}\n            >\n              <div className=\"hb-menu-row\">\n                {item.avatar ? (\n                  <Avatar name={item.label} src={item.avatar} size=\"sm\" />\n                ) : (\n                  item.icon && <span aria-hidden=\"true\">{renderIcon(item.icon)}</span>\n                )}\n                <div>\n                  {item.content || <strong>{item.label}</strong>}\n                  {item.description && <small>{item.description}</small>}\n                </div>\n                {item.trailing}\n                {item.shortcut && <Kbd>{item.shortcut}</Kbd>}\n                {selectedKey !== undefined && (\n                  <span className=\"hb-menu-radio\" aria-hidden=\"true\">\n                    <UIIcon name={selectedKey === item.id ? 'tick' : 'circle'} />\n                  </span>\n                )}\n              </div>\n            </MenuItem>\n          ))}\n        </Menu></div>\n        {footer&&<div ref={footerRef} className=\"hb-menu-footer\" onKeyDown={event=>{if(event.key!=='Tab')return;const controls=Array.from(footerRef.current?.querySelectorAll<HTMLElement>('button:not(:disabled),a[href],input:not(:disabled)')||[]);if(event.shiftKey&&event.target===controls[0]){event.preventDefault();event.stopPropagation();const items=menuRef.current?.querySelectorAll<HTMLElement>('.hb-menu-item:not([aria-disabled=true])');items?.[items.length-1]?.focus()}else if(!event.shiftKey&&event.target===controls.at(-1)){setOpen(false);triggerRef.current?.focus()}}}>{footer}</div>}\n      </Popover>\n    </MenuTrigger>\n  );\n}\n\nexport type ProgressIndicatorProps = {\n  label: string;\n  value?: number;\n  max?: number;\n  indeterminate?: boolean;\n  size?: BaseSize;\n  variant?: 'line' | 'circle';\n  showValue?: boolean;\n};\nexport function ProgressIndicator({\n  label,\n  value = 0,\n  max = 100,\n  indeterminate = false,\n  size = 'md',\n  variant = 'line',\n  showValue = true,\n}: ProgressIndicatorProps) {\n  const boundedMax = Math.max(1, max),\n    bounded = Math.max(0, Math.min(value, boundedMax)),\n    percent = Math.round((bounded / boundedMax) * 100),\n    uid = useId();\n  return (\n    <div className={`hb-progress hb-${size} hb-progress-${variant}`}>\n      <div className=\"hb-progress-heading\">\n        <label id={uid}>{label}</label>\n        {showValue && (\n          <output aria-live=\"polite\">{indeterminate ? 'In progress…' : `${percent}%`}</output>\n        )}\n      </div>\n      {variant === 'circle' ? (\n        <div\n          className={`hb-progress-ring ${indeterminate ? 'hb-indeterminate' : ''}`}\n          role=\"progressbar\"\n          aria-labelledby={uid}\n          aria-valuemin={0}\n          aria-valuemax={boundedMax}\n          aria-valuenow={indeterminate ? undefined : bounded}\n          style={{ '--hb-progress': `${percent}%` } as CSSProperties}\n        >\n          <span>{indeterminate ? '…' : percent + '%'}</span>\n        </div>\n      ) : (\n        <progress\n          aria-labelledby={uid}\n          value={indeterminate ? undefined : bounded}\n          max={boundedMax}\n        >\n          {percent}%\n        </progress>\n      )}\n    </div>\n  );\n}\nexport type RadioOption = {\n  value: string;\n  label: string;\n  description?: string;\n  disabled?: boolean;\n};\nexport type RadioGroupProps = {\n  label: string;\n  options: RadioOption[];\n  value?: string;\n  defaultValue?: string;\n  onValueChange?: (value: string) => void;\n  disabled?: boolean;\n  size?: BaseSize;\n  description?: string;\n  variant?: 'row' | 'card';\n};\nexport function RadioGroup({\n  label,\n  options,\n  value,\n  defaultValue = options.find((option) => !option.disabled)?.value || '',\n  onValueChange,\n  disabled = false,\n  size = 'md',\n  description,\n  variant = 'card',\n}: RadioGroupProps) {\n  const [selected, select] = useValue(value, defaultValue, onValueChange),\n    id = useId();\n  return (\n    <AriaRadioGroup\n      className={`hb-radio-group hb-${size} hb-radio-${variant}`}\n      value={selected}\n      onChange={select}\n      isDisabled={disabled}\n      aria-describedby={description ? id : undefined}\n    >\n      <Label>{label}</Label>\n      {description && <p id={id}>{description}</p>}\n      {options.map((option) => (\n        <AriaRadio\n          key={option.value}\n          value={option.value}\n          isDisabled={option.disabled}\n          className=\"hb-radio\"\n        >\n          <span className=\"hb-radio-dot\" aria-hidden=\"true\" />\n          <span>\n            <strong>{option.label}</strong>\n            {option.description && <small>{option.description}</small>}\n          </span>\n        </AriaRadio>\n      ))}\n    </AriaRadioGroup>\n  );\n}\nexport type SliderProps = {\n  label: string;\n  value?: number;\n  defaultValue?: number;\n  min?: number;\n  max?: number;\n  step?: number;\n  onValueChange?: (value: number) => void;\n  disabled?: boolean;\n  size?: BaseSize;\n  formatValue?: (value: number) => string;\n  showBubble?: boolean;\n  onChangeEnd?: (value: number) => void;\n};\nexport function Slider({\n  label,\n  value,\n  defaultValue = 50,\n  min = 0,\n  max = 100,\n  step = 1,\n  onValueChange,\n  disabled = false,\n  size = 'md',\n  formatValue = (next: number) => `${next}%`,\n  showBubble = true,\n  onChangeEnd,\n}: SliderProps) {\n  const [selected, select] = useValue(value, defaultValue, onValueChange);\n  return (\n    <AriaSlider<number>\n      className={`hb-slider hb-${size}`}\n      minValue={min}\n      maxValue={max}\n      step={step}\n      value={selected}\n      onChange={select}\n      onChangeEnd={onChangeEnd}\n      isDisabled={disabled}\n    >\n      <div className=\"hb-slider-heading\">\n        <Label>{label}</Label>\n        <SliderOutput>{({ state }) => formatValue(state.values[0])}</SliderOutput>\n      </div>\n      <SliderTrack className=\"hb-slider-track\">\n        {({ state }) => (\n          <>\n            <div className=\"hb-slider-rail\" />\n            <div\n              className=\"hb-slider-fill\"\n              style={{ width: state.getThumbPercent(0) * 100 + '%' }}\n            />\n            <SliderThumb className=\"hb-slider-thumb\">\n              {showBubble && (\n                <span className=\"hb-slider-bubble\" aria-hidden=\"true\">\n                  {formatValue(state.values[0])}\n                </span>\n              )}\n            </SliderThumb>\n          </>\n        )}\n      </SliderTrack>\n    </AriaSlider>\n  );\n}\n\nexport type RangeSliderProps = Omit<SliderProps, 'value' | 'defaultValue' | 'onValueChange' | 'onChangeEnd'> & {\n  value?: [number, number];\n  defaultValue?: [number, number];\n  onValueChange?: (value: [number, number]) => void;\n  onChangeEnd?: (value: [number, number]) => void;\n};\n/** Two separately named native range inputs, with ordered values and keyboard/RTL support. */\nexport function RangeSlider({\n  label,\n  value,\n  defaultValue = [25, 75],\n  onValueChange,\n  min = 0,\n  max = 100,\n  step = 1,\n  disabled = false,\n  size = 'md',\n  formatValue = (next) => String(next),\n  showBubble = true,\n  onChangeEnd,\n}: RangeSliderProps) {\n  const [selected, select] = useValue(value, defaultValue, onValueChange);\n  return (\n    <AriaSlider<number[]>\n      className={`hb-slider hb-range-slider hb-${size}`}\n      value={selected}\n      onChange={(next) => select([next[0], next[1]])}\n      onChangeEnd={next => onChangeEnd?.([next[0],next[1]])}\n      minValue={min}\n      maxValue={max}\n      step={step}\n      isDisabled={disabled}\n    >\n      <div className=\"hb-slider-heading\">\n        <Label>{label}</Label>\n        <SliderOutput>{({ state }) => state.values.map(formatValue).join(' – ')}</SliderOutput>\n      </div>\n      <SliderTrack className=\"hb-slider-track\">\n        {({ state }) => (\n          <>\n            <div className=\"hb-slider-rail\" />\n            <div\n              className=\"hb-slider-fill\"\n              style={{\n                insetInlineStart: state.getThumbPercent(0) * 100 + '%',\n                width: (state.getThumbPercent(1) - state.getThumbPercent(0)) * 100 + '%',\n              }}\n            />\n            {[0, 1].map((index) => (\n              <SliderThumb\n                key={index}\n                index={index}\n                aria-label={index === 0 ? 'Minimum' : 'Maximum'}\n                className=\"hb-slider-thumb\"\n              >\n                {showBubble && (\n                  <span className=\"hb-slider-bubble\" aria-hidden=\"true\">\n                    {formatValue(state.values[index])}\n                  </span>\n                )}\n              </SliderThumb>\n            ))}\n          </>\n        )}\n      </SliderTrack>\n    </AriaSlider>\n  );\n}\n\nexport type ChipColor = 'lime' | 'rose' | 'yellow' | 'cyan' | 'neutral' | 'gray' | 'soft';\nexport type ChipProps = {\n  children: ReactNode;\n  variant?: 'bold' | 'subtle' | 'caption';\n  color?: ChipColor;\n  leadingIcon?: ReactNode;\n};\nexport function Chip({ children, variant = 'subtle', color = 'neutral', leadingIcon }: ChipProps) {\n  return (\n    <span className={`hb-chip hb-chip-${variant} hb-chip-${color}`}>\n      {leadingIcon && <span aria-hidden=\"true\">{renderIcon(leadingIcon)}</span>}\n      {children}\n    </span>\n  );\n}\nexport function StatusDot({\n  color = 'green',\n  label,\n}: {\n  color?: 'green' | 'yellow' | 'indigo';\n  label?: string;\n}) {\n  return (\n    <span\n      className={`hb-status-dot hb-status-dot-${color}`}\n      role={label ? 'img' : undefined}\n      aria-label={label}\n      aria-hidden={label ? undefined : true}\n    />\n  );\n}\nfunction ChipExample(props: FamilyProps) {\n  const [color, setColor] = useState<ChipColor>('lime'),\n    [variant, setVariant] = useState<'bold' | 'subtle' | 'caption'>('bold');\n  return (\n    <div className=\"hb-example-stack\">\n      <div className=\"hb-inline\">\n        <Select\n          label=\"Chip color\"\n          value={color}\n          disabled={props.disabled}\n          options={['lime', 'rose', 'yellow', 'cyan', 'neutral', 'gray', 'soft'].map((value) => ({\n            value,\n            label: value,\n          }))}\n          onChange={(event) => setColor(event.target.value as ChipColor)}\n        />\n        <Select\n          label=\"Chip emphasis\"\n          value={variant}\n          disabled={props.disabled}\n          options={['bold', 'subtle', 'caption'].map((value) => ({ value, label: value }))}\n          onChange={(event) => setVariant(event.target.value as typeof variant)}\n        />\n      </div>\n      <div className=\"hb-inline\">\n        <Chip color={color} variant={variant}>\n          +12.5%\n        </Chip>\n        <Chip color={color} variant={variant}>\n          ₹3,252\n        </Chip>\n        <Chip color={color} variant={variant} leadingIcon={<StatusDot label=\"Active\" />}>\n          Backend Engineer\n        </Chip>\n      </div>\n      <div className=\"hb-inline\">\n        <StatusDot color=\"green\" label=\"Healthy\" />\n        <StatusDot color=\"yellow\" label=\"Needs review\" />\n        <StatusDot color=\"indigo\" label=\"In progress\" />\n      </div>\n      <TagsInput {...props} />\n    </div>\n  );\n}\nexport type TagProps = {\n  children: ReactNode;\n  onRemove?: () => void;\n  removeLabel?: string;\n  disabled?: boolean;\n  size?: BaseSize;\n};\nexport function Tag({\n  children,\n  onRemove,\n  removeLabel = 'Remove tag',\n  disabled = false,\n  size = 'md',\n}: TagProps) {\n  return (\n    <span className={`hb-tag hb-${size}`}>\n      <span>{children}</span>\n      {onRemove && (\n        <button type=\"button\" onClick={onRemove} aria-label={removeLabel} disabled={disabled}><UIIcon name=\"close\" /></button>\n      )}\n    </span>\n  );\n}\nexport type TagsInputProps = {\n  label?: string;\n  value?: string[];\n  defaultValue?: string[];\n  onValueChange?: (tags: string[]) => void;\n  disabled?: boolean;\n  size?: BaseSize;\n  maxTags?: number;\n  maxTagLength?: number;\n};\nexport function TagsInput({\n  label = 'Project tags',\n  value,\n  defaultValue = ['Design', 'Engineering', 'Research'],\n  onValueChange,\n  disabled = false,\n  size = 'md',\n  maxTags = 8,\n  maxTagLength = 24,\n}: TagsInputProps) {\n  const [tags, change] = useValue(value, defaultValue, onValueChange),\n    [draft, setDraft] = useState(''),\n    [message, setMessage] = useState(''),\n    input = useRef<HTMLInputElement>(null);\n  const remove = (tag: string) => {\n    change(tags.filter((item) => item !== tag));\n    setMessage(`${tag} removed.`);\n    requestAnimationFrame(() => input.current?.focus());\n  };\n  const add = () => {\n    const text = draft.trim();\n    if (!text) {\n      setMessage('Enter a tag.');\n      return;\n    }\n    if (tags.length >= maxTags) {\n      setMessage(`Use up to ${maxTags} tags.`);\n      return;\n    }\n    if (tags.some((tag) => tag.toLocaleLowerCase() === text.toLocaleLowerCase())) {\n      setMessage('This tag is already added.');\n      return;\n    }\n    change([...tags, text]);\n    setDraft('');\n    setMessage(`${text} added.`);\n  };\n  return (\n    <div className=\"hb-tags-input\">\n      <div className=\"hb-tag-list\" role=\"group\" aria-label={label}>\n        {tags.length ? (\n          tags.map((tag) => (\n            <Tag\n              key={tag}\n              size={size}\n              disabled={disabled}\n              onRemove={() => remove(tag)}\n              removeLabel={`Remove ${tag}`}\n            >\n              {tag}\n            </Tag>\n          ))\n        ) : (\n          <span className=\"hb-muted\">No tags yet. Add one below.</span>\n        )}\n      </div>\n      <form\n        onSubmit={(event) => {\n          event.preventDefault();\n          if (!disabled) add();\n        }}\n      >\n        <Input\n          ref={input}\n          label={`Add to ${label.toLowerCase()}`}\n          size={size}\n          value={draft}\n          maxLength={maxTagLength}\n          disabled={disabled || tags.length >= maxTags}\n          placeholder=\"Add a tag…\"\n          onChange={(event) => setDraft(event.target.value)}\n          onKeyDown={(event) => {\n            if (event.key === 'Backspace' && !draft && tags.length && !disabled)\n              remove(tags[tags.length - 1]);\n          }}\n        />\n        <Button\n          type=\"submit\"\n          variant=\"secondary\"\n          size={size}\n          disabled={disabled || !draft.trim() || tags.length >= maxTags}\n        >\n          Add tag\n        </Button>\n      </form>\n      <p role=\"status\" className=\"hb-status\">\n        {message || `${tags.length} of ${maxTags} tags`}\n      </p>\n    </div>\n  );\n}\n\nexport type TextEditorValue = { text: string; html: string };\nexport type TextEditorProps = {\n  label?: string;\n  defaultValue?: string;\n  disabled?: boolean;\n  onChange?: (value: TextEditorValue) => void;\n  onSave?: (value: TextEditorValue) => void;\n  maxLength?: number;\n};\n/** Browser editing commands retain native undo/selection. Pasted content is inserted as plain text. */\nexport function TextEditor({\n  label = 'Rich text editor',\n  defaultValue = 'Write something worth sharing.\\nSelect text and use the formatting controls.',\n  disabled = false,\n  onChange,\n  onSave,\n  maxLength = 5000,\n}: TextEditorProps) {\n  const root = useRef<HTMLDivElement>(null),\n    range = useRef<Range | null>(null),\n    initial = useRef(defaultValue),\n    id = useId(),\n    [count, setCount] = useState(defaultValue.length),\n    [message, setMessage] = useState(''),\n    [formats, setFormats] = useState<Record<string, boolean>>({});\n  const initialParagraphs = useMemo(\n    () => initial.current.split('\\n').map((text, index) => <p key={index}>{text || <br />}</p>),\n    [],\n  );\n  const read = useCallback(\n    () => ({ text: root.current?.innerText || '', html: root.current?.innerHTML || '' }),\n    [],\n  );\n  const remainingCapacity = () => {\n    const selection = window.getSelection();\n    const selected = selection?.rangeCount && root.current?.contains(selection.anchorNode) && root.current?.contains(selection.focusNode)\n      ? selection.toString().length : 0;\n    return Math.max(0, maxLength - (read().text.length - selected));\n  };\n  const record = () => {\n    const next = read();\n    setCount(next.text.length);\n    onChange?.(next);\n  };\n  const remember = useCallback(() => {\n    const selection = window.getSelection();\n    if (selection?.rangeCount && root.current?.contains(selection.anchorNode)) {\n      range.current = selection.getRangeAt(0).cloneRange();\n      setFormats(\n        Object.fromEntries(\n          ['bold', 'italic', 'underline', 'insertUnorderedList'].map((command) => [\n            command,\n            document.queryCommandState(command),\n          ]),\n        ),\n      );\n    }\n  }, []);\n  useEffect(() => {\n    setCount(root.current?.innerText.length || initial.current.length);\n    document.addEventListener('selectionchange', remember);\n    return () => document.removeEventListener('selectionchange', remember);\n  }, [remember]);\n  const format = (command: string) => {\n    if (disabled) return;\n    root.current?.focus();\n    if (range.current) {\n      const selection = window.getSelection();\n      selection?.removeAllRanges();\n      selection?.addRange(range.current);\n    }\n    document.execCommand(command, false);\n    remember();\n    record();\n    setMessage('Text formatting updated.');\n  };\n  return (\n    <div className=\"hb-editor\">\n      <div id={id} className=\"hb-editor-label\">\n        {label}\n      </div>\n      <div className=\"hb-editor-toolbar\" role=\"toolbar\" aria-label=\"Text formatting\">\n        {[\n          ['B', 'bold', 'Bold'],\n          ['I', 'italic', 'Italic'],\n          ['U', 'underline', 'Underline'],\n          ['• List', 'insertUnorderedList', 'Bullet list'],\n        ].map(([text, command, name]) => (\n          <button\n            key={command}\n            type=\"button\"\n            disabled={disabled}\n            aria-label={name}\n            aria-pressed={Boolean(formats[command])}\n            onMouseDown={(event) => event.preventDefault()}\n            onClick={() => format(command)}\n          >\n            {<UIIcon name={command === 'bold' ? 'bold' : command === 'italic' ? 'italic' : command === 'underline' ? 'underline' : 'list'} />}\n          </button>\n        ))}\n      </div>\n      <div\n        ref={root}\n        className=\"hb-editor-content\"\n        contentEditable={!disabled}\n        suppressContentEditableWarning\n        role=\"textbox\"\n        aria-labelledby={id}\n        aria-multiline=\"true\"\n        aria-disabled={disabled || undefined}\n        aria-describedby={id + '-count'}\n        tabIndex={disabled ? -1 : 0}\n        spellCheck\n        onInput={record}\n        onKeyUp={remember}\n        onMouseUp={remember}\n        onPaste={(event) => {\n          event.preventDefault();\n          if (!disabled)\n            document.execCommand(\n              'insertText',\n              false,\n              event.clipboardData.getData('text/plain').slice(0, remainingCapacity()),\n            );\n        }}\n        onBeforeInput={(event) => {\n          const inputEvent = event.nativeEvent as InputEvent;\n          if (\n            (inputEvent.inputType?.startsWith('insert') || inputEvent.data) &&\n            (inputEvent.data?.length || 1) > remainingCapacity() &&\n            !inputEvent.isComposing\n          ) {\n            event.preventDefault();\n            setMessage(`Keep the document within ${maxLength} characters.`);\n          }\n        }}\n      >\n        {initialParagraphs}\n      </div>\n      <div className=\"hb-editor-footer\">\n        <span id={id + '-count'} dir=\"ltr\">\n          {count} / {maxLength} characters\n        </span>\n        {onSave && (\n          <Button\n            variant=\"secondary\"\n            size=\"sm\"\n            disabled={disabled}\n            onClick={() => {\n              onSave(read());\n              setMessage('Document saved in this local example.');\n            }}\n          >\n            Save document\n          </Button>\n        )}\n      </div>\n      <p role=\"status\" className=\"hb-status\">\n        {message}\n      </p>\n    </div>\n  );\n}\n\nexport type VideoPlayerProps = {\n  src: string;\n  title?: string;\n  caption?: string;\n  poster?: string;\n  disabled?: boolean;\n  onPlaybackChange?: (playing: boolean) => void;\n};\nexport function VideoPlayer({\n  src,\n  title = 'Helios motion demonstration',\n  caption = 'A silent motion study. Use the native video controls to play, pause, seek and change playback speed.',\n  poster,\n  disabled = false,\n  onPlaybackChange,\n}: VideoPlayerProps) {\n  const video = useRef<HTMLVideoElement>(null),\n    [error, setError] = useState(false),\n    [playing, setPlaying] = useState(false),\n    id = useId();\n  useEffect(() => {\n    setError(false);\n    setPlaying(false);\n  }, [src]);\n  useEffect(() => {\n    if (disabled) {\n      video.current?.pause();\n      setPlaying(false);\n    }\n  }, [disabled]);\n  return (\n    <figure className={`hb-video ${disabled ? 'hb-disabled' : ''}`}>\n      <video\n        ref={video}\n        src={src}\n        poster={poster}\n        controls={!disabled}\n        preload=\"metadata\"\n        playsInline\n        aria-label={title}\n        aria-describedby={id}\n        tabIndex={disabled ? -1 : 0}\n        onPlay={() => {\n          if (disabled) {\n            video.current?.pause();\n            return;\n          }\n          setPlaying(true);\n          onPlaybackChange?.(true);\n        }}\n        onPause={() => {\n          setPlaying(false);\n          onPlaybackChange?.(false);\n        }}\n        onError={() => setError(true)}\n      />\n      <figcaption id={id}>{caption}</figcaption>\n      {error ? (\n        <div role=\"alert\">\n          <p>The video could not be loaded.</p>\n          <Button\n            variant=\"secondary\"\n            size=\"sm\"\n            disabled={disabled}\n            onClick={() => {\n              setError(false);\n              video.current?.load();\n            }}\n          >\n            Retry video\n          </Button>\n        </div>\n      ) : (\n        <p className=\"hb-status\" role=\"status\">\n          {disabled\n            ? 'Playback is disabled.'\n            : playing\n              ? 'Playing the local motion study.'\n              : 'Ready to play.'}\n        </p>\n      )}\n    </figure>\n  );\n}\n\nexport type ToggleProps = {\n  label: string;\n  description?: string;\n  selected?: boolean;\n  defaultSelected?: boolean;\n  onSelectedChange?: (selected: boolean) => void;\n  disabled?: boolean;\n  size?: BaseSize;\n  shape?: 'pill' | 'rounded';\n  card?: boolean;\n};\nexport function Toggle({\n  label,\n  description,\n  selected,\n  defaultSelected = false,\n  onSelectedChange,\n  disabled = false,\n  size = 'md',\n  shape = 'pill',\n  card = false,\n}: ToggleProps) {\n  const [checked, change] = useValue(selected, defaultSelected, onSelectedChange);\n  return (\n    <AriaSwitch\n      isSelected={checked}\n      onChange={change}\n      isDisabled={disabled}\n      className={`hb-toggle hb-${size} hb-toggle-${shape} ${card ? 'hb-toggle-card' : ''}`}\n    >\n      <span className=\"hb-toggle-track\" aria-hidden=\"true\">\n        <span />\n      </span>\n      <span>\n        <strong>{label}</strong>\n        {description && <small>{description}</small>}\n      </span>\n    </AriaSwitch>\n  );\n}\nexport type TooltipProps = {\n  label: string;\n  content: ReactNode;\n  trigger?: ReactNode;\n  disabled?: boolean;\n  placement?: 'top' | 'bottom' | 'left' | 'right';\n  delay?: number;\n  size?: 'sm' | 'md';\n  showArrow?: boolean;\n};\nexport function Tooltip({\n  label,\n  content,\n  trigger,\n  disabled = false,\n  placement = 'top',\n  delay = 150,\n  size = 'md',\n  showArrow = true,\n}: TooltipProps) {\n  const {direction,locale}=useDirection();\n  return (\n    <TooltipTrigger delay={delay} closeDelay={0} isDisabled={disabled}>\n      <AriaButton\n        isDisabled={disabled}\n        className=\"hu-button hu-secondary\"\n        aria-label={trigger ? label : undefined}\n      >\n        {trigger ?? label}\n      </AriaButton>\n      <AriaTooltip dir={direction} lang={locale} className={`hb-tooltip hb-tooltip-${size}`} placement={placement} offset={8}>\n        {showArrow && (\n          <OverlayArrow className=\"hb-tooltip-arrow\">\n            <svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\">\n              <path d=\"M0 0L5 6L10 0Z\" />\n            </svg>\n          </OverlayArrow>\n        )}\n        {content}\n      </AriaTooltip>\n    </TooltipTrigger>\n  );\n}\n\nfunction BadgeExample({ disabled, size }: FamilyProps) {\n  const [tone, setTone] = useState<BadgeTone>('brand'),\n    [labels, setLabels] = useState(['Design', 'Ready', 'New']);\n  return (\n    <div className=\"hb-example-stack\">\n      <Select\n        label=\"Badge tone\"\n        value={tone}\n        disabled={disabled}\n        options={['neutral', 'success', 'warning', 'error', 'info', 'brand'].map((value) => ({\n          value,\n          label: value,\n        }))}\n        onChange={(event) => setTone(event.target.value as BadgeTone)}\n      />\n      <div className=\"hb-inline\">\n        <Badge>91</Badge>\n        <Badge tone=\"brand\">152</Badge>\n        <Kbd>⌘L</Kbd>\n        <Kbd>⌘K</Kbd>\n        <Kbd>esc</Kbd>\n        <Badge tone={tone} size={size} leadingIcon=\"●\">\n          Current tone\n        </Badge>\n        {labels.map((label) => (\n          <Badge\n            key={label}\n            tone={tone}\n            size={size}\n            disabled={disabled}\n            dismissLabel={`Dismiss ${label}`}\n            onDismiss={() => setLabels((previous) => previous.filter((item) => item !== label))}\n          >\n            {label}\n          </Badge>\n        ))}\n      </div>\n      <Button\n        size=\"sm\"\n        variant=\"secondary\"\n        disabled={disabled || labels.length === 3}\n        onClick={() => setLabels(['Design', 'Ready', 'New'])}\n      >\n        Restore badges\n      </Button>\n    </div>\n  );\n}\nfunction ButtonGroupExample({ disabled, size }: FamilyProps) {\n  const [selected, setSelected] = useState('overview'),\n    [alignment, setAlignment] = useState('left');\n  const content: Record<string, string> = {\n    overview: '24 projects across your workspace.',\n    activity: '6 updates are ready for your review.',\n    settings: 'Manage the preferences for this local workspace.',\n  };\n  return (\n    <div className=\"hb-example-stack\">\n      <ButtonGroup\n        label=\"Workspace view\"\n        size={size}\n        disabled={disabled}\n        items={[\n          { id: 'overview', label: 'Overview' },\n          { id: 'activity', label: 'Activity' },\n          { id: 'settings', label: 'Settings' },\n        ]}\n        value={selected}\n        onValueChange={setSelected}\n      />\n      <ButtonGroup\n        label=\"Text alignment\"\n        value={alignment}\n        onValueChange={setAlignment}\n        disabled={disabled}\n        size={size}\n        items={[\n          { id: 'left', label: 'Align left', icon: <UIIcon name=\"align-left\" />, iconOnly: true },\n          { id: 'center', label: 'Align center', icon: <UIIcon name=\"align-center\" />, iconOnly: true },\n          { id: 'right', label: 'Align right', icon: <UIIcon name=\"align-right\" />, iconOnly: true },\n        ]}\n      />\n      <div className=\"hb-group-panel\" role=\"status\" style={{ textAlign: alignment as CSSProperties['textAlign'] }}>\n        <strong>{selected[0].toUpperCase() + selected.slice(1)}</strong>\n        <p>{content[selected]}</p>\n      </div>\n    </div>\n  );\n}\nfunction DropdownExample({ disabled, size }: FamilyProps) {\n  const [message, setMessage] = useState('Choose an account action.'),\n    [model, setModel] = useState('helios-fast'),\n    [team, setTeam] = useState('design');\n  const items = [\n    { id: 'profile', label: 'View profile', description: 'Read your local example profile.' },\n    { id: 'settings', label: 'Account settings', description: 'Review personal preferences.' },\n    { id: 'help', label: 'Help and support' },\n    { id: 'restricted', label: 'Organization billing', disabled: true },\n  ];\n  return (\n    <div className=\"hb-example-stack\">\n      <DropdownMenu\n        disabled={disabled}\n        size={size}\n        items={items}\n        header={<><strong>Users with access</strong><small>Helios workspace · local example</small></>}\n        footer={<div className=\"hb-inline\"><Button size=\"sm\" variant=\"secondary\" disabled={disabled} onClick={()=>setMessage('Add user requested locally. No invitation was sent.')}>Add user</Button><Button size=\"sm\" variant=\"secondary\" disabled={disabled} onClick={()=>setMessage('Manage access requested in this local preview.')}>Manage access</Button></div>}\n        onAction={(id) =>\n          setMessage(`${items.find((item) => item.id === id)?.label} selected in this preview.`)\n        }\n      />\n      <DropdownMenu\n        label={model === 'helios-fast' ? 'Helios Fast' : 'Helios Pro'}\n        disabled={disabled}\n        size={size}\n        selectedKey={model}\n        items={[\n          {\n            id: 'helios-fast',\n            label: 'Helios Fast',\n            description: 'Quick local exploration',\n            icon: '✦',\n          },\n          { id: 'helios-pro', label: 'Helios Pro', description: 'Detailed reasoning', icon: '◈' },\n          { id: 'unavailable', label: 'Custom model', disabled: true },\n        ]}\n        onAction={(id) => {\n          setModel(id);\n          setMessage('Model changed locally. No AI request was sent.');\n        }}\n      />\n      <DropdownMenu\n        label={team === 'design' ? 'Design team' : 'Engineering team'}\n        disabled={disabled}\n        size={size}\n        selectedKey={team}\n        items={[\n          { id: 'design', label: 'Design team', description: '8 members', icon: 'D' },\n          { id: 'engineering', label: 'Engineering team', description: '12 members', icon: 'E' },\n        ]}\n        onAction={(id) => {\n          setTeam(id);\n          setMessage('Workspace switched locally.');\n        }}\n      />\n      <p className=\"hb-status\" role=\"status\">\n        {message}\n      </p>\n    </div>\n  );\n}\nfunction ProgressExample({ disabled, size }: FamilyProps) {\n  const [value, setValue] = useState(25),\n    [variant, setVariant] = useState<'line' | 'circle'>('line');\n  return (\n    <div className=\"hb-example-stack\">\n      <Select\n        label=\"Progress style\"\n        value={variant}\n        disabled={disabled}\n        options={[\n          { value: 'line', label: 'Linear' },\n          { value: 'circle', label: 'Circular' },\n        ]}\n        onChange={(event) => setVariant(event.target.value as 'line' | 'circle')}\n      />\n      <ProgressIndicator\n        label=\"Example upload progress\"\n        value={value}\n        size={size}\n        variant={variant}\n      />\n      <div className=\"hb-inline\">\n        <Button\n          size={size}\n          disabled={disabled || value === 100}\n          onClick={() => setValue((previous) => Math.min(100, previous + 25))}\n        >\n          Advance progress\n        </Button>\n        <Button\n          size={size}\n          variant=\"secondary\"\n          disabled={disabled || value === 0}\n          onClick={() => setValue(0)}\n        >\n          Reset progress\n        </Button>\n      </div>\n      <p className=\"hb-status\" role=\"status\">\n        {value === 100\n          ? 'Example upload complete. Nothing was sent to a server.'\n          : `${value}% complete in this local example.`}\n      </p>\n    </div>\n  );\n}\nfunction RadioExample({ disabled, size }: FamilyProps) {\n  const [value, setValue] = useState('starter');\n  return (\n    <div className=\"hb-example-stack\">\n      <RadioGroup\n        label=\"Billing frequency\"\n        variant=\"row\"\n        size={size}\n        disabled={disabled}\n        options={[\n          { value: 'monthly', label: 'Monthly billing' },\n          { value: 'yearly', label: 'Yearly billing' },\n          { value: 'usage', label: 'Usage based', disabled: true },\n        ]}\n      />\n      <RadioGroup\n        label=\"Choose a plan\"\n        size={size}\n        disabled={disabled}\n        value={value}\n        onValueChange={setValue}\n        description=\"Plan selection is a local preview; checkout is closed.\"\n        options={[\n          { value: 'starter', label: 'Starter', description: 'Free · personal exploration' },\n          {\n            value: 'professional',\n            label: 'Professional',\n            description: '₹9,999 preview · growing teams',\n          },\n          {\n            value: 'enterprise',\n            label: 'Enterprise',\n            description: 'Organization controls',\n            disabled: true,\n          },\n        ]}\n      />\n      <p role=\"status\" className=\"hb-status\">\n        {value === 'starter' ? 'Starter' : 'Professional'} selected.\n      </p>\n    </div>\n  );\n}\nfunction SliderExample({ disabled, size }: FamilyProps) {\n  const [value, setValue] = useState(50);\n  const [range, setRange] = useState<[number, number]>([2500, 7500]);\n  return (\n    <div className=\"hb-example-stack\">\n      <Slider\n        label=\"Volume\"\n        showBubble\n        value={value}\n        onValueChange={setValue}\n        disabled={disabled}\n        size={size}\n      />\n      <RangeSlider\n        label=\"Monthly budget\"\n        min={0}\n        max={10000}\n        step={100}\n        value={range}\n        onValueChange={setRange}\n        disabled={disabled}\n        size={size}\n        formatValue={(amount) =>\n          new Intl.NumberFormat('en-IN', {\n            style: 'currency',\n            currency: 'INR',\n            maximumFractionDigits: 0,\n          }).format(amount)\n        }\n      />\n      <p role=\"status\" className=\"hb-status\">\n        Volume is {value}%.\n      </p>\n      <Button\n        variant=\"secondary\"\n        size=\"sm\"\n        disabled={disabled || value === 50}\n        onClick={() => setValue(50)}\n      >\n        Reset volume\n      </Button>\n    </div>\n  );\n}\nfunction ToggleExample({ disabled, size }: FamilyProps) {\n  const [selected, setSelected] = useState(true);\n  return (\n    <div className=\"hb-example-stack\">\n      <Toggle\n        label=\"Rounded switch\"\n        shape=\"rounded\"\n        disabled={disabled}\n        size={size}\n        defaultSelected\n      />\n      <Toggle\n        label=\"Email notifications\"\n        card\n        description=\"Receive updates about your workspace.\"\n        selected={selected}\n        onSelectedChange={setSelected}\n        disabled={disabled}\n        size={size}\n      />\n      <p role=\"status\" className=\"hb-status\">\n        Notifications {selected ? 'enabled' : 'disabled'} in this local example.\n      </p>\n    </div>\n  );\n}\nfunction EditorExample({ disabled }: FamilyProps) {\n  const [saved, setSaved] = useState('');\n  return (\n    <div className=\"hb-example-stack hb-editor-example\">\n      <TextEditor\n        disabled={disabled}\n        onSave={(value) => setSaved(`${value.text.length} characters saved in this local example.`)}\n      />\n      <p className=\"hb-status\" role=\"status\">\n        {saved}\n      </p>\n    </div>\n  );\n}\nexport const baseFamilyIds = [\n  'avatars',\n  'badges',\n  'button-groups',\n  'dropdowns',\n  'progress-indicators',\n  'radio-groups',\n  'sliders',\n  'tags',\n  'text-editors',\n  'video-players',\n  'toggles',\n  'tooltips',\n] as const;\nexport type BaseFamilyId = (typeof baseFamilyIds)[number];\nexport function BaseFamilyPreview({\n  id,\n  state = 'ready',\n  onRetry,\n  disabled: configuredDisabled = false,\n  size = 'md',\n}: FamilyProps & { id: BaseFamilyId | string }) {\n  const overlayHost=useRef<HTMLDivElement>(null);\n  const disabled=configuredDisabled||state!=='ready';\n  const props = { disabled, size };\n  const content =\n    id === 'avatars' ? (\n      <AvatarExample {...props} />\n    ) : id === 'badges' ? (\n      <BadgeExample {...props} />\n    ) : id === 'button-groups' ? (\n      <ButtonGroupExample {...props} />\n    ) : id === 'dropdowns' ? (\n      <DropdownExample {...props} />\n    ) : id === 'progress-indicators' ? (\n      <ProgressExample {...props} />\n    ) : id === 'radio-groups' ? (\n      <RadioExample {...props} />\n    ) : id === 'sliders' ? (\n      <SliderExample {...props} />\n    ) : id === 'tags' ? (\n      <ChipExample {...props} />\n    ) : id === 'text-editors' ? (\n      <EditorExample {...props} />\n    ) : id === 'video-players' ? (\n      <VideoPlayer src=\"/assets/helios-demo.webm\" disabled={disabled} />\n    ) : id === 'toggles' ? (\n      <ToggleExample {...props} />\n    ) : id === 'tooltips' ? (\n      <div className=\"hb-tooltip-example\">\n        <Tooltip\n          label=\"Hover or focus\"\n          content=\"Helpful information appears here.\"\n          disabled={disabled}\n        />\n        <div className=\"hb-inline\">\n          <Tooltip label=\"Small\" content=\"Compact contextual help\" size=\"sm\" disabled={disabled} />\n          <Tooltip label=\"Medium\" content=\"Helpful information appears here.\" disabled={disabled} />\n          <Tooltip\n            label=\"No arrow\"\n            content=\"A simple floating label\"\n            showArrow={false}\n            disabled={disabled}\n          />\n        </div>\n        <div className=\"hb-inline\">\n          {(['top', 'bottom', 'left', 'right'] as const).map((placement) => (\n            <Tooltip\n              key={placement}\n              label={placement[0].toUpperCase() + placement.slice(1)}\n              content={`${placement} placement`}\n              placement={placement}\n              disabled={disabled}\n            />\n          ))}\n        </div>\n        <p className=\"hb-status\">Focus a button with Tab; Escape dismisses the tooltip.</p>\n      </div>\n    ) : null;\n  return (\n    <div className={`hb-family hb-family-${id}`} data-base-family={id}>\n      {state!=='ready'&&<DataState state={state} onRetry={onRetry} emptyMessage=\"No example data. Reset to restore this component.\"/>}\n      <div style={{display:state==='ready'?'contents':'none'}} hidden={state!=='ready'} inert={state!=='ready'||undefined}><UNSAFE_PortalProvider getContainer={()=>overlayHost.current}>{content}<div ref={overlayHost} style={{display:'contents'}}/></UNSAFE_PortalProvider></div>\n    </div>\n  );\n}\n\nexport const baseFamilyMetadata = {\n  avatars: {\n    exportName: 'AvatarGroup',\n    props: {\n      items: 'AvatarItem[]',\n      value: 'string',\n      onValueChange: '(id:string)=>void',\n      size: 'sm | md | lg',\n      disabled: 'boolean',\n      allowUpload: 'boolean',\n      onImageChange: '(file:File)=>void',\n    },\n    example: '<AvatarGroup />',\n  },\n  badges: {\n    exportName: 'Badge',\n    props: {\n      children: 'ReactNode',\n      tone: 'neutral | success | warning | error | info | brand',\n      size: 'sm | md | lg',\n      leadingIcon: 'ReactNode',\n      onDismiss: '()=>void',\n      dismissLabel: 'string',\n      disabled: 'boolean',\n    },\n    example: '<Badge tone=\"success\">Active</Badge>',\n  },\n  'button-groups': {\n    exportName: 'ButtonGroup',\n    props: {\n      label: 'string',\n      items: 'ButtonGroupItem[]',\n      value: 'string',\n      onValueChange: '(id:string)=>void',\n      size: 'sm | md | lg',\n      disabled: 'boolean',\n    },\n    example:\n      '<ButtonGroup label=\"View\" items={[{id:\"overview\",label:\"Overview\"},{id:\"activity\",label:\"Activity\"}]} />',\n  },\n  dropdowns: {\n    exportName: 'DropdownMenu',\n    props: {\n      label: 'string',\n      items: 'DropdownItem[]',\n      onAction: '(id:string)=>void',\n      size: 'sm | md | lg',\n      disabled: 'boolean',\n    },\n    example:\n      '<DropdownMenu items={[{id:\"profile\",label:\"View profile\"}]} onAction={id=>console.log(id)} />',\n  },\n  'progress-indicators': {\n    exportName: 'ProgressIndicator',\n    props: {\n      label: 'string',\n      value: 'number',\n      max: 'number',\n      indeterminate: 'boolean',\n      variant: 'line | circle',\n      size: 'sm | md | lg',\n      showValue: 'boolean',\n    },\n    example: '<ProgressIndicator label=\"Upload\" value={50} />',\n  },\n  'radio-groups': {\n    exportName: 'RadioGroup',\n    props: {\n      label: 'string',\n      variant: 'row | card',\n      options: 'RadioOption[]',\n      value: 'string',\n      onValueChange: '(value:string)=>void',\n      disabled: 'boolean',\n      size: 'sm | md | lg',\n    },\n    example:\n      '<RadioGroup label=\"Plan\" options={[{value:\"starter\",label:\"Starter\"},{value:\"team\",label:\"Team\"}]} />',\n  },\n  sliders: {\n    exportName: 'Slider',\n    props: {\n      label: 'string',\n      value: 'number',\n      defaultValue: 'number',\n      min: 'number',\n      max: 'number',\n      step: 'number',\n      onValueChange: '(value:number)=>void',\n      disabled: 'boolean',\n      formatValue: '(value:number)=>string',\n      showBubble: 'boolean',\n      rangeVariant: 'RangeSlider accepts [number,number] values and change callback',\n    },\n    example:\n      '<><Slider label=\"Volume\" defaultValue={50} showBubble/><RangeSlider label=\"Monthly budget\" defaultValue={[25,75]}/></>',\n  },\n  tags: {\n    exportName: 'Chip',\n    props: {\n      children: 'ReactNode',\n      variant: 'bold | subtle | caption',\n      color: 'lime | rose | yellow | cyan | neutral | gray | soft',\n      leadingIcon: 'ReactNode',\n      relatedExports: 'StatusDot, Tag, TagsInput',\n    },\n    example:\n      '<><Chip color=\"lime\" variant=\"bold\">+12.5%</Chip><Chip color=\"soft\" variant=\"caption\">Backend Engineer</Chip></>',\n  },\n  'text-editors': {\n    exportName: 'TextEditor',\n    props: {\n      label: 'string',\n      defaultValue: 'string; plain text',\n      onChange: '(value:TextEditorValue)=>void',\n      onSave: '(value:TextEditorValue)=>void',\n      disabled: 'boolean',\n      maxLength: 'number',\n    },\n    example: '<TextEditor onSave={value=>console.log(value.text)} />',\n  },\n  'video-players': {\n    exportName: 'VideoPlayer',\n    props: {\n      src: 'string; caller-owned media URL',\n      title: 'string',\n      caption: 'string',\n      poster: 'string',\n      disabled: 'boolean',\n      onPlaybackChange: '(playing:boolean)=>void',\n    },\n    example: '<VideoPlayer src=\"/assets/helios-demo.webm\" />',\n  },\n  toggles: {\n    exportName: 'Toggle',\n    props: {\n      label: 'string',\n      description: 'string',\n      shape: 'pill | rounded',\n      card: 'boolean',\n      selected: 'boolean',\n      onSelectedChange: '(selected:boolean)=>void',\n      disabled: 'boolean',\n      size: 'sm | md | lg',\n    },\n    example: '<Toggle label=\"Email notifications\" defaultSelected />',\n  },\n  tooltips: {\n    exportName: 'Tooltip',\n    props: {\n      label: 'string; trigger label',\n      content: 'ReactNode',\n      placement: 'top | bottom | left | right',\n      size: 'sm | md',\n      showArrow: 'boolean',\n      delay: 'number',\n      disabled: 'boolean',\n    },\n    example: '<Tooltip label=\"More information\" content=\"Helpful information appears here.\" />',\n  },\n} as const;\n",
  "src/BoardExtras.tsx": "'use client';\nimport { UNSAFE_PortalProvider } from 'react-aria';\nimport { UIIcon } from './icons.js';\nimport { useDirection } from './Direction.js';\nimport { changeTheme } from './theme-transition.js';\n\nimport { renderIcon } from './icons.js';\n\nimport { Fragment, forwardRef, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport type { AnchorHTMLAttributes, CSSProperties, ReactNode, TextareaHTMLAttributes } from 'react';\nimport { Button, Checkbox, DataState, Dialog, Input, Select, Tabs } from './components.js';\nimport type { ButtonProps } from './components.js';\nimport { Avatar, Badge, ButtonGroup, Toggle, Tooltip, DropdownMenu } from './BaseFamilies.js';\nimport type { BaseSize } from './BaseFamilies.js';\nimport type { FamilyProps } from './family-types.js';\nimport { AnimatePresence, motion } from 'motion/react';\nimport { useMotionPreference as useReducedMotion } from './useMotionPreference.js';\nimport {\n  Select as AriaSelect,\n  SelectValue,\n  Button as AriaButton,\n  Popover,\n  ListBox,\n  ListBoxItem,\n  Text as AriaText,\n  Label,\n} from 'react-aria-components';\n\nexport type AnnouncementProps = {\n  title: string;\n  description?: string;\n  actionLabel?: string;\n  onAction?: () => void;\n  onDismiss?: () => void;\n  disabled?: boolean;\n  tone?: 'neutral' | 'brand' | 'success';\n  icon?: ReactNode;\n  dismissible?: boolean;\n  layout?: 'banner' | 'card';\n};\nexport function Announcement({\n  title,\n  description,\n  actionLabel = 'Learn more',\n  onAction,\n  onDismiss,\n  disabled = false,\n  tone = 'brand',\n  icon = '✦',\n  dismissible = true,\n  layout = 'banner',\n}: AnnouncementProps) {\n  const [dismissed, setDismissed] = useState(false),\n    reduce = useReducedMotion();\n  return (\n    <AnimatePresence initial={false}>\n      {!dismissed && (\n        <motion.section\n          className={`he-announcement he-tone-${tone} he-announcement-${layout}`}\n          aria-label=\"Announcement\"\n          initial={false}\n          exit={{\n            opacity: 0,\n            height: 0,\n            scale: reduce ? 1 : 0.96,\n            marginTop: 0,\n            marginBottom: 0,\n            paddingTop: 0,\n            paddingBottom: 0,\n          }}\n          transition={{ duration: reduce ? 0 : 0.18, ease: 'easeOut' }}\n        >\n          <span className=\"he-announcement-mark\" aria-hidden=\"true\">\n            {renderIcon(icon)}\n          </span>\n          <div>\n            <strong>{title}</strong>\n            {description && <p>{description}</p>}\n            {onAction && (\n              <Button\n                variant={layout === 'card' ? 'secondary' : 'link-color'}\n                size=\"sm\"\n                disabled={disabled}\n                onClick={onAction}\n              >\n                {actionLabel}\n                {layout === 'banner' && <span aria-hidden=\"true\"><UIIcon name=\"arrow-right\" /></span>}\n              </Button>\n            )}\n          </div>\n          {dismissible && (\n            <CloseButton\n              label=\"Dismiss announcement\"\n              disabled={disabled}\n              onClick={() => {\n                setDismissed(true);\n                onDismiss?.();\n              }}\n            />\n          )}\n        </motion.section>\n      )}\n    </AnimatePresence>\n  );\n}\nexport type CarouselItem = {\n  id: string;\n  title: string;\n  description?: string;\n  image?: string;\n  imageAlt?: string;\n  content?: ReactNode;\n};\nexport type CarouselProps = {\n  label: string;\n  items: CarouselItem[];\n  value?: number;\n  defaultValue?: number;\n  onValueChange?: (index: number) => void;\n  disabled?: boolean;\n  cardWidth?: string;\n  align?: 'start' | 'center';\n  showArrows?: boolean;\n  showDots?: boolean;\n  gap?: number;\n};\nexport function Carousel({\n  label,\n  items,\n  value,\n  defaultValue = 0,\n  onValueChange,\n  disabled = false,\n  cardWidth = 'calc(50% - 8px)',\n  align = 'start',\n  showArrows = true,\n  showDots = true,\n  gap = 16,\n}: CarouselProps) {\n  const {direction}=useDirection();\n  const [local, setLocal] = useState(defaultValue),\n    track = useRef<HTMLDivElement>(null),\n    timer = useRef<ReturnType<typeof setTimeout> | null>(null),\n    reduce = useReducedMotion(),\n    current = Math.max(0, Math.min(value ?? local, items.length - 1));\n  const select = (index: number) => {\n    const next = Math.max(0, Math.min(index, items.length - 1));\n    setLocal(next);\n    onValueChange?.(next);\n  };\n  const move=(index:number,behavior:ScrollBehavior)=>{const parent=track.current,child=parent?.children[index] as HTMLElement|undefined;if(!parent||!child)return;const viewport=parent.getBoundingClientRect(),card=child.getBoundingClientRect(),rtl=getComputedStyle(parent).direction==='rtl',offset=align==='center'?(card.left+card.right-viewport.left-viewport.right)/2:rtl?card.right-viewport.right:card.left-viewport.left;parent.scrollTo({left:parent.scrollLeft+offset,behavior})};\n  const scroll = (index: number) => {\n    const next = Math.max(0, Math.min(index, items.length - 1));\n    select(next);move(next,reduce?'instant':'smooth');\n  };\n  useEffect(\n    () => () => {\n      if (timer.current) clearTimeout(timer.current);\n    },\n    [],\n  );\n  useEffect(() => {if(value!==undefined)move(current,'instant')}, [value,align,cardWidth,gap]);\n  if (!items.length) return <DataState state=\"empty\" emptyMessage=\"Add carousel items to begin.\" />;\n  return (\n    <section\n      className=\"he-carousel\"\n      role=\"region\"\n      aria-roledescription=\"carousel\"\n      aria-label={label}\n    >\n      <div className=\"he-carousel-head\">\n        <strong>{label}</strong>\n        {showArrows && <div>\n          <IconButton\n            label=\"Previous slide\"\n            icon={direction==='rtl'?'→':'←'}\n            disabled={disabled || current === 0}\n            onClick={() => scroll(current - 1)}\n          />\n          <IconButton\n            label=\"Next slide\"\n            icon={direction==='rtl'?'←':'→'}\n            disabled={disabled || current === items.length - 1}\n            onClick={() => scroll(current + 1)}\n          />\n        </div>}\n      </div>\n      <div\n        ref={track}\n        className=\"he-carousel-track\"\n        data-align={align}\n        style={{ '--he-card-width': cardWidth, '--he-carousel-gap': `${Math.max(0, gap)}px` } as CSSProperties}\n        tabIndex={disabled ? -1 : 0}\n        aria-label=\"Slides; use left and right arrow keys\"\n        onKeyDown={(event) => {\n          if (disabled || !['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key)) return;\n          event.preventDefault();\n          scroll(\n            event.key === 'Home'\n              ? 0\n              : event.key === 'End'\n                ? items.length - 1\n                : current + (event.key === (getComputedStyle(event.currentTarget).direction==='rtl'?'ArrowLeft':'ArrowRight') ? 1 : -1),\n          );\n        }}\n        onScroll={() => {\n          if (timer.current) clearTimeout(timer.current);\n          timer.current = setTimeout(() => {\n            const parent = track.current;\n            if (!parent) return;\n            let nearest=0;\n            const viewport=parent.getBoundingClientRect(),rtl=getComputedStyle(parent).direction==='rtl',distance=(index:number)=>{const card=(parent.children[index] as HTMLElement).getBoundingClientRect();return Math.abs(align==='center'?(card.left+card.right-viewport.left-viewport.right)/2:rtl?card.right-viewport.right:card.left-viewport.left)};\n            for(let index=1;index<parent.children.length;index++)if(distance(index)<distance(nearest))nearest=index;\n            select(nearest);\n          }, 160);\n        }}\n      >\n        {items.map((item, index) => (\n          <article\n            key={item.id}\n            className=\"he-carousel-card\"\n            role=\"group\"\n            aria-roledescription=\"slide\"\n            aria-label={`${index + 1} of ${items.length}: ${item.title}`}\n          >\n            {item.image && <img src={item.image} alt={item.imageAlt || item.title} />}\n            <div>\n              {item.content}\n              <h3>{item.title}</h3>\n              {item.description && <p>{item.description}</p>}\n            </div>\n          </article>\n        ))}\n      </div>\n      <div className=\"he-carousel-bottom\">\n        <span role=\"status\">\n          Slide {current + 1} of {items.length}\n        </span>\n        {showDots && <div role=\"group\" aria-label=\"Choose a slide\">\n          {items.map((item, index) => (\n            <button\n              key={item.id}\n              type=\"button\"\n              disabled={disabled}\n              aria-label={`Show ${item.title}`}\n              aria-current={current === index ? 'true' : undefined}\n              onClick={() => scroll(index)}\n            />\n          ))}\n        </div>}\n      </div>\n    </section>\n  );\n}\n\nexport type InputOTPProps = {\n  length?: number;\n  groupEvery?: number;\n  value?: string;\n  defaultValue?: string;\n  onValueChange?: (value: string) => void;\n  onComplete?: (value: string) => void;\n  disabled?: boolean;\n  error?: string;\n  label?: string;\n  name?: string;\n};\nexport function InputOTP({\n  length = 6,\n  groupEvery = 0,\n  value,\n  defaultValue = '',\n  onValueChange,\n  onComplete,\n  disabled = false,\n  error,\n  label = 'Verification code',\n  name = 'code',\n}: InputOTPProps) {\n  const count = Math.max(1, Math.min(12, Math.trunc(length))),\n    [local, setLocal] = useState(defaultValue.replace(/\\D/g, '').slice(0, count)),\n    digits = (value ?? local).replace(/\\D/g, '').slice(0, count),\n    refs = useRef<(HTMLInputElement | null)[]>([]),\n    id = useId(),\n    complete = useRef('');\n  useEffect(() => {\n    if (digits.length < count) complete.current = '';\n  }, [digits, count]);\n  const focus = (index: number) => {\n    const input = refs.current[Math.max(0, Math.min(index, count - 1))];\n    input?.focus();\n    input?.select();\n  };\n  const update = (next: string) => {\n    const safe = next.replace(/\\D/g, '').slice(0, count);\n    setLocal(safe);\n    onValueChange?.(safe);\n    if (safe.length === count && complete.current !== safe) {\n      complete.current = safe;\n      onComplete?.(safe);\n    } else if (safe.length < count) complete.current = '';\n  };\n  const fill = (text: string, index: number) => {\n    const incoming = text.replace(/\\D/g, '');\n    if (!incoming) return;\n    const start = Math.min(index, digits.length);\n    const next = digits.slice(0, start) + incoming + digits.slice(start + incoming.length);\n    update(next);\n    focus(Math.min(count - 1, start + incoming.length));\n  };\n  return (\n    <div className={`he-otp ${error ? 'he-invalid' : ''}`}>\n      <span id={id} className=\"he-label\">\n        {label}\n      </span>\n      <div\n        role=\"group\"\n        aria-labelledby={id}\n        aria-describedby={id + '-message'}\n        className=\"he-otp-fields\"\n        dir=\"ltr\"\n      >\n        {Array.from({ length: count }, (_, index) => (\n          <Fragment key={index}>\n            <input\n              ref={(node) => {\n                refs.current[index] = node;\n              }}\n              type=\"text\"\n              inputMode=\"numeric\"\n              pattern=\"[0-9]*\"\n              maxLength={count}\n              autoComplete=\"one-time-code\"\n              aria-label={`Digit ${index + 1} of ${count}`}\n              aria-invalid={Boolean(error) || undefined}\n              disabled={disabled}\n              value={digits[index] || ''}\n              onFocus={(event) => event.target.select()}\n              onChange={(event) => {\n                const raw = event.target.value;\n                const next = raw.replace(/\\D/g, '');\n                if (raw && !next) return;\n                if (next.length > 1) fill(next, index);\n                else if (next) {\n                  update(digits.slice(0, index) + next + digits.slice(index + 1));\n                  focus(index + 1);\n                } else update(digits.slice(0, index) + digits.slice(index + 1));\n              }}\n              onPaste={(event) => {\n                event.preventDefault();\n                fill(event.clipboardData.getData('text'), index);\n              }}\n              onKeyDown={(event) => {\n                if (['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key)) {\n                  event.preventDefault();\n                  focus(\n                    event.key === 'Home'\n                      ? 0\n                      : event.key === 'End'\n                        ? count - 1\n                        : index + (event.key === 'ArrowRight' ? 1 : -1),\n                  );\n                } else if (event.key === 'Backspace') {\n                  event.preventDefault();\n                  const at = digits[index] ? index : Math.max(0, index - 1);\n                  update(digits.slice(0, at) + digits.slice(at + 1));\n                  focus(at);\n                } else if (event.key === 'Delete') {\n                  event.preventDefault();\n                  update(digits.slice(0, index) + digits.slice(index + 1));\n                }\n              }}\n            />\n            {groupEvery > 0 &&\n              (index + 1) % Math.max(1, Math.trunc(groupEvery)) === 0 &&\n              index < count - 1 && (\n                <span className=\"he-otp-separator\" aria-hidden=\"true\"><UIIcon name=\"minus\" /></span>\n              )}\n          </Fragment>\n        ))}\n      </div>\n      <input type=\"hidden\" name={name} value={digits} disabled={disabled} />\n      <p id={id + '-message'} role={error ? 'alert' : undefined} className=\"he-hint\">\n        {error ||\n          `${digits.length} of ${count} digits entered. Paste a full code or type one digit per field.`}\n      </p>\n    </div>\n  );\n}\n\nexport type SocialProvider = 'Google' | 'GitHub' | 'Slack' | 'Okta SSO' | 'SSO' | (string & {});\nexport type SocialButtonProps = {\n  provider: SocialProvider;\n  onPress?: () => void;\n  label?: string;\n  disabled?: boolean;\n  loading?: boolean;\n  size?: BaseSize;\n  appearance?: 'brand' | 'neutral' | 'colorful' | 'black' | 'white';\n  fullWidth?: boolean;\n  children?: ReactNode;\n  iconOnly?: boolean;\n  logo?: ReactNode;\n  brandColor?: string;\n  href?: string;\n  target?: string;\n};\nconst socialProviderMarks: Record<string, ReactNode> = {\n  Google: (\n    <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" width=\"18\" height=\"18\" fill=\"currentColor\">\n      <path\n        d=\"M12.48 10.92v3.28h7.84c-.24 1.84-.853 3.187-1.787 4.133-1.147 1.147-2.933 2.4-6.053 2.4-4.827 0-8.6-3.893-8.6-8.72s3.773-8.72 8.6-8.72c2.6 0 4.507 1.027 5.907 2.347l2.307-2.307C18.747 1.44 16.133 0 12.48 0 5.867 0 .307 5.387.307 12s5.56 12 12.173 12c3.573 0 6.267-1.173 8.373-3.36 2.16-2.16 2.84-5.213 2.84-7.667 0-.76-.053-1.467-.173-2.053H12.48z\"\n        fill=\"currentColor\"\n      ></path>\n    </svg>\n  ),\n  GitHub: (\n    <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" width=\"18\" height=\"18\" fill=\"currentColor\">\n      <path\n        d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"\n        fill=\"currentColor\"\n      ></path>\n    </svg>\n  ),\n  Slack: (\n    <svg viewBox=\"0 0 256 256\" aria-hidden=\"true\" width=\"18\" height=\"18\" fill=\"currentColor\">\n      <path\n        fill=\"#e01e5a\"\n        d=\"M53.841 161.32c0 14.832-11.987 26.82-26.819 26.82S.203 176.152.203 161.32c0-14.831 11.987-26.818 26.82-26.818H53.84zm13.41 0c0-14.831 11.987-26.818 26.819-26.818s26.819 11.987 26.819 26.819v67.047c0 14.832-11.987 26.82-26.82 26.82c-14.83 0-26.818-11.988-26.818-26.82z\"\n      ></path>\n      <path\n        fill=\"#36c5f0\"\n        d=\"M94.07 53.638c-14.832 0-26.82-11.987-26.82-26.819S79.239 0 94.07 0s26.819 11.987 26.819 26.819v26.82zm0 13.613c14.832 0 26.819 11.987 26.819 26.819s-11.987 26.819-26.82 26.819H26.82C11.987 120.889 0 108.902 0 94.069c0-14.83 11.987-26.818 26.819-26.818z\"\n      ></path>\n      <path\n        fill=\"#2eb67d\"\n        d=\"M201.55 94.07c0-14.832 11.987-26.82 26.818-26.82s26.82 11.988 26.82 26.82s-11.988 26.819-26.82 26.819H201.55zm-13.41 0c0 14.832-11.988 26.819-26.82 26.819c-14.831 0-26.818-11.987-26.818-26.82V26.82C134.502 11.987 146.489 0 161.32 0s26.819 11.987 26.819 26.819z\"\n      ></path>\n      <path\n        fill=\"#ecb22e\"\n        d=\"M161.32 201.55c14.832 0 26.82 11.987 26.82 26.818s-11.988 26.82-26.82 26.82c-14.831 0-26.818-11.988-26.818-26.82V201.55zm0-13.41c-14.831 0-26.818-11.988-26.818-26.82c0-14.831 11.987-26.818 26.819-26.818h67.25c14.832 0 26.82 11.987 26.82 26.819s-11.988 26.819-26.82 26.819z\"\n      ></path>\n    </svg>\n  ),\n  Apple: (\n    <svg viewBox=\"0 0 256 315\" aria-hidden=\"true\" width=\"18\" height=\"18\" fill=\"currentColor\">\n      <path d=\"M213.803 167.03c.442 47.58 41.74 63.413 42.197 63.615c-.35 1.116-6.599 22.563-21.757 44.716c-13.104 19.153-26.705 38.235-48.13 38.63c-21.05.388-27.82-12.483-51.888-12.483c-24.061 0-31.582 12.088-51.51 12.871c-20.68.783-36.428-20.71-49.64-39.793c-27-39.033-47.633-110.3-19.928-158.406c13.763-23.89 38.36-39.017 65.056-39.405c20.307-.387 39.475 13.662 51.889 13.662c12.406 0 35.699-16.895 60.186-14.414c10.25.427 39.026 4.14 57.503 31.186c-1.49.923-34.335 20.044-33.978 59.822M174.24 50.199c10.98-13.29 18.369-31.79 16.353-50.199c-15.826.636-34.962 10.546-46.314 23.828c-10.173 11.763-19.082 30.589-16.678 48.633c17.64 1.365 35.66-8.964 46.64-22.262\"></path>\n    </svg>\n  ),\n  GitLab: (\n    <svg viewBox=\"0 0 256 247\" aria-hidden=\"true\" width=\"18\" height=\"18\" fill=\"currentColor\">\n      <path\n        fill=\"#e24329\"\n        d=\"m251.845 97.642l-.328-.986l-34.85-90.903c-.657-1.808-1.972-3.287-3.616-4.274Q210.586 0 207.627 0c-1.973 0-3.78.822-5.26 1.973a8.73 8.73 0 0 0-3.124 4.767l-23.506 71.999H80.56l-23.506-72c-.493-1.808-1.644-3.451-3.123-4.766C52.45.822 50.643 0 48.67 0s-3.781.329-5.425 1.48c-1.644.986-2.96 2.465-3.617 4.273L4.781 96.656l-.33.986c-10.355 26.959-1.479 57.37 21.535 74.794h.328c0 .164 53.096 39.944 53.096 39.944l26.3 19.89l15.946 12c3.78 2.96 9.205 2.96 12.986 0l15.945-12l26.3-19.89l53.424-39.944c23.014-17.425 31.726-47.835 21.37-74.794z\"\n      ></path>\n      <path\n        fill=\"#fc6d26\"\n        d=\"m251.845 97.642l-.328-.986c-17.26 3.616-33.205 10.85-46.849 21.04c-.164 0-41.424 31.398-76.602 57.863a18377 18377 0 0 0 48.657 36.821l53.424-39.944c23.013-17.425 31.726-47.835 21.37-74.794z\"\n      ></path>\n      <path\n        fill=\"#fca326\"\n        d=\"m79.245 212.38l26.301 19.89l15.945 12c3.78 2.96 9.206 2.96 12.986 0l15.945-12l26.301-19.89s-22.684-17.095-48.657-36.82c-26.136 19.725-48.82 36.82-48.82 36.82\"\n      ></path>\n      <path\n        fill=\"#fc6d26\"\n        d=\"M51.465 117.697c-13.644-10.192-29.589-17.589-46.849-21.04l-.329.985c-10.356 26.959-1.479 57.37 21.534 74.794h.33c0 .164 53.094 39.944 53.094 39.944s22.685-17.095 48.821-36.82c-35.013-26.466-76.272-57.699-76.601-57.863\"\n      ></path>\n    </svg>\n  ),\n  Microsoft: (\n    <svg viewBox=\"0 0 256 256\" aria-hidden=\"true\" width=\"18\" height=\"18\" fill=\"currentColor\">\n      <path fill=\"#f1511b\" d=\"M121.666 121.666H0V0h121.666z\"></path>\n      <path fill=\"#80cc28\" d=\"M256 121.666H134.335V0H256z\"></path>\n      <path fill=\"#00adef\" d=\"M121.663 256.002H0V134.336h121.663z\"></path>\n      <path fill=\"#fbbc09\" d=\"M256 256.002H134.335V134.336H256z\"></path>\n    </svg>\n  ),\n  X: (\n    <svg viewBox=\"0 0 251 256\" aria-hidden=\"true\" width=\"18\" height=\"18\" fill=\"currentColor\">\n      <path d=\"M149.079 108.399L242.33 0h-22.098l-80.97 94.12L74.59 0H0l97.796 142.328L0 256h22.1l85.507-99.395L175.905 256h74.59L149.073 108.399zM118.81 143.58l-9.909-14.172l-78.84-112.773h33.943l63.625 91.011l9.909 14.173l82.705 118.3H186.3l-67.49-96.533z\"></path>\n    </svg>\n  ),\n  Facebook: (\n    <svg viewBox=\"0 0 256 256\" aria-hidden=\"true\" width=\"18\" height=\"18\" fill=\"currentColor\">\n      <path\n        fill=\"#1877f2\"\n        d=\"M256 128C256 57.308 198.692 0 128 0S0 57.308 0 128c0 63.888 46.808 116.843 108 126.445V165H75.5v-37H108V99.8c0-32.08 19.11-49.8 48.348-49.8C170.352 50 185 52.5 185 52.5V84h-16.14C152.959 84 148 93.867 148 103.99V128h35.5l-5.675 37H148v89.445c61.192-9.602 108-62.556 108-126.445\"\n      ></path>\n      <path\n        fill=\"#fff\"\n        d=\"m177.825 165l5.675-37H148v-24.01C148 93.866 152.959 84 168.86 84H185V52.5S170.352 50 156.347 50C127.11 50 108 67.72 108 99.8V128H75.5v37H108v89.445A129 129 0 0 0 128 256a129 129 0 0 0 20-1.555V165z\"\n      ></path>\n    </svg>\n  ),\n  LinkedIn: (\n    <svg viewBox=\"0 0 256 256\" aria-hidden=\"true\" width=\"18\" height=\"18\" fill=\"currentColor\">\n      <path\n        fill=\"#0a66c2\"\n        d=\"M218.123 218.127h-37.931v-59.403c0-14.165-.253-32.4-19.728-32.4c-19.756 0-22.779 15.434-22.779 31.369v60.43h-37.93V95.967h36.413v16.694h.51a39.91 39.91 0 0 1 35.928-19.733c38.445 0 45.533 25.288 45.533 58.186zM56.955 79.27c-12.157.002-22.014-9.852-22.016-22.009s9.851-22.014 22.008-22.016c12.157-.003 22.014 9.851 22.016 22.008A22.013 22.013 0 0 1 56.955 79.27m18.966 138.858H37.95V95.967h37.97zM237.033.018H18.89C8.58-.098.125 8.161-.001 18.471v219.053c.122 10.315 8.576 18.582 18.89 18.474h218.144c10.336.128 18.823-8.139 18.966-18.474V18.454c-.147-10.33-8.635-18.588-18.966-18.453\"\n      ></path>\n    </svg>\n  ),\n  Discord: (\n    <svg viewBox=\"0 0 256 199\" aria-hidden=\"true\" width=\"18\" height=\"18\" fill=\"currentColor\">\n      <path\n        fill=\"#5865f2\"\n        d=\"M216.856 16.597A208.5 208.5 0 0 0 164.042 0c-2.275 4.113-4.933 9.645-6.766 14.046q-29.538-4.442-58.533 0c-1.832-4.4-4.55-9.933-6.846-14.046a207.8 207.8 0 0 0-52.855 16.638C5.618 67.147-3.443 116.4 1.087 164.956c22.169 16.555 43.653 26.612 64.775 33.193A161 161 0 0 0 79.735 175.3a136.4 136.4 0 0 1-21.846-10.632a109 109 0 0 0 5.356-4.237c42.122 19.702 87.89 19.702 129.51 0a132 132 0 0 0 5.355 4.237a136 136 0 0 1-21.886 10.653c4.006 8.02 8.638 15.67 13.873 22.848c21.142-6.58 42.646-16.637 64.815-33.213c5.316-56.288-9.08-105.09-38.056-148.36M85.474 135.095c-12.645 0-23.015-11.805-23.015-26.18s10.149-26.2 23.015-26.2s23.236 11.804 23.015 26.2c.02 14.375-10.148 26.18-23.015 26.18m85.051 0c-12.645 0-23.014-11.805-23.014-26.18s10.148-26.2 23.014-26.2c12.867 0 23.236 11.804 23.015 26.2c0 14.375-10.148 26.18-23.015 26.18\"\n      ></path>\n    </svg>\n  ),\n  Figma: (\n    <svg viewBox=\"0 0 256 384\" aria-hidden=\"true\" width=\"18\" height=\"18\" fill=\"currentColor\">\n      <path\n        fill=\"#0acf83\"\n        d=\"M64 384c35.328 0 64-28.672 64-64v-64H64c-35.328 0-64 28.672-64 64s28.672 64 64 64\"\n      ></path>\n      <path\n        fill=\"#a259ff\"\n        d=\"M0 192c0-35.328 28.672-64 64-64h64v128H64c-35.328 0-64-28.672-64-64\"\n      ></path>\n      <path\n        fill=\"#f24e1e\"\n        d=\"M0 64C0 28.672 28.672 0 64 0h64v128H64C28.672 128 0 99.328 0 64\"\n      ></path>\n      <path fill=\"#ff7262\" d=\"M128 0h64c35.328 0 64 28.672 64 64s-28.672 64-64 64h-64z\"></path>\n      <path\n        fill=\"#1abcfe\"\n        d=\"M256 192c0 35.328-28.672 64-64 64s-64-28.672-64-64s28.672-64 64-64s64 28.672 64 64\"\n      ></path>\n    </svg>\n  ),\n  Notion: (\n    <svg viewBox=\"0 0 256 268\" aria-hidden=\"true\" width=\"18\" height=\"18\" fill=\"currentColor\">\n      <path\n        fill=\"#fff\"\n        d=\"M16.092 11.538L164.09.608c18.179-1.56 22.85-.508 34.28 7.801l47.243 33.282C253.406 47.414 256 48.975 256 55.207v182.527c0 11.439-4.155 18.205-18.696 19.24L65.44 267.378c-10.913.517-16.11-1.043-21.825-8.327L8.826 213.814C2.586 205.487 0 199.254 0 191.97V29.726c0-9.352 4.155-17.153 16.092-18.188\"\n      ></path>\n      <path d=\"M164.09.608L16.092 11.538C4.155 12.573 0 20.374 0 29.726v162.245c0 7.284 2.585 13.516 8.826 21.843l34.789 45.237c5.715 7.284 10.912 8.844 21.825 8.327l171.864-10.404c14.532-1.035 18.696-7.801 18.696-19.24V55.207c0-5.911-2.336-7.614-9.21-12.66l-1.185-.856L198.37 8.409C186.94.1 182.27-.952 164.09.608M69.327 52.22c-14.033.945-17.216 1.159-25.186-5.323L23.876 30.778c-2.06-2.086-1.026-4.69 4.163-5.207l142.274-10.395c11.947-1.043 18.17 3.12 22.842 6.758l24.401 17.68c1.043.525 3.638 3.637.517 3.637L71.146 52.095zm-16.36 183.954V81.222c0-6.767 2.077-9.887 8.3-10.413L230.02 60.93c5.724-.517 8.31 3.12 8.31 9.879v153.917c0 6.767-1.044 12.49-10.387 13.008l-161.487 9.361c-9.343.517-13.489-2.594-13.489-10.921M212.377 89.53c1.034 4.681 0 9.362-4.681 9.897l-7.783 1.542v114.404c-6.758 3.637-12.981 5.715-18.18 5.715c-8.308 0-10.386-2.604-16.609-10.396l-50.898-80.079v77.476l16.1 3.646s0 9.362-12.989 9.362l-35.814 2.077c-1.043-2.086 0-7.284 3.63-8.318l9.351-2.595V109.823l-12.98-1.052c-1.044-4.68 1.55-11.439 8.826-11.965l38.426-2.585l52.958 81.113v-71.76l-13.498-1.552c-1.043-5.733 3.111-9.896 8.3-10.404z\"></path>\n    </svg>\n  ),\n  Dropbox: (\n    <svg viewBox=\"0 0 256 218\" aria-hidden=\"true\" width=\"18\" height=\"18\" fill=\"currentColor\">\n      <path\n        fill=\"#0061ff\"\n        d=\"M63.995 0L0 40.771l63.995 40.772L128 40.771zM192 0l-64 40.775l64 40.775l64.001-40.775zM0 122.321l63.995 40.772L128 122.321L63.995 81.55zM192 81.55l-64 40.775l64 40.774l64-40.774zM64 176.771l64.005 40.772L192 176.771L128.005 136z\"\n      ></path>\n    </svg>\n  ),\n  Spotify: (\n    <svg viewBox=\"0 0 256 256\" aria-hidden=\"true\" width=\"18\" height=\"18\" fill=\"currentColor\">\n      <path\n        fill=\"#1ed760\"\n        d=\"M128 0C57.308 0 0 57.309 0 128c0 70.696 57.309 128 128 128c70.697 0 128-57.304 128-128C256 57.314 198.697.007 127.998.007zm58.699 184.614c-2.293 3.76-7.215 4.952-10.975 2.644c-30.053-18.357-67.885-22.515-112.44-12.335a7.98 7.98 0 0 1-9.552-6.007a7.97 7.97 0 0 1 6-9.553c48.76-11.14 90.583-6.344 124.323 14.276c3.76 2.308 4.952 7.215 2.644 10.975m15.667-34.853c-2.89 4.695-9.034 6.178-13.726 3.289c-34.406-21.148-86.853-27.273-127.548-14.92c-5.278 1.594-10.852-1.38-12.454-6.649c-1.59-5.278 1.386-10.842 6.655-12.446c46.485-14.106 104.275-7.273 143.787 17.007c4.692 2.89 6.175 9.034 3.286 13.72zm1.345-36.293C162.457 88.964 94.394 86.71 55.007 98.666c-6.325 1.918-13.014-1.653-14.93-7.978c-1.917-6.328 1.65-13.012 7.98-14.935C93.27 62.027 168.434 64.68 215.929 92.876c5.702 3.376 7.566 10.724 4.188 16.405c-3.362 5.69-10.73 7.565-16.4 4.187z\"\n      ></path>\n    </svg>\n  ),\n  Twitch: (\n    <svg viewBox=\"0 0 256 268\" aria-hidden=\"true\" width=\"18\" height=\"18\" fill=\"currentColor\">\n      <path\n        fill=\"#5a3e85\"\n        d=\"M17.458 0L0 46.556v186.201h63.983v34.934h34.931l34.898-34.934h52.36L256 162.954V0zm23.259 23.263H232.73v128.029l-40.739 40.741H128L93.113 226.92v-34.886H40.717zm64.008 116.405H128V69.844h-23.275zm63.997 0h23.27V69.844h-23.27z\"\n      ></path>\n    </svg>\n  ),\n  Reddit: (\n    <svg viewBox=\"0 0 256 256\" aria-hidden=\"true\" width=\"18\" height=\"18\" fill=\"currentColor\">\n      <circle cx=\"128\" cy=\"128\" r=\"128\" fill=\"#ff4500\"></circle>\n      <path\n        fill=\"#fff\"\n        d=\"M213.15 129.22c0-10.376-8.391-18.617-18.617-18.617a18.74 18.74 0 0 0-12.97 5.189c-12.818-9.157-30.368-15.107-49.9-15.87l8.544-39.981l27.773 5.95c.307 7.02 6.104 12.667 13.278 12.667c7.324 0 13.275-5.95 13.275-13.278c0-7.324-5.95-13.275-13.275-13.275c-5.188 0-9.768 3.052-11.904 7.478l-30.976-6.562c-.916-.154-1.832 0-2.443.458c-.763.458-1.22 1.22-1.371 2.136l-9.464 44.558c-19.837.612-37.692 6.562-50.662 15.872a18.74 18.74 0 0 0-12.971-5.188c-10.377 0-18.617 8.391-18.617 18.617c0 7.629 4.577 14.037 10.988 16.939a33.6 33.6 0 0 0-.458 5.646c0 28.686 33.42 52.036 74.621 52.036c41.202 0 74.622-23.196 74.622-52.036a35 35 0 0 0-.458-5.646c6.408-2.902 10.985-9.464 10.985-17.093M85.272 142.495c0-7.324 5.95-13.275 13.278-13.275c7.324 0 13.275 5.95 13.275 13.275s-5.95 13.278-13.275 13.278c-7.327.15-13.278-5.953-13.278-13.278m74.317 35.251c-9.156 9.157-26.553 9.768-31.588 9.768c-5.188 0-22.584-.765-31.59-9.768c-1.371-1.373-1.371-3.51 0-4.883c1.374-1.371 3.51-1.371 4.884 0c5.8 5.8 18.008 7.782 26.706 7.782s21.058-1.983 26.704-7.782c1.374-1.371 3.51-1.371 4.884 0c1.22 1.373 1.22 3.51 0 4.883m-2.443-21.822c-7.325 0-13.275-5.95-13.275-13.275s5.95-13.275 13.275-13.275c7.327 0 13.277 5.95 13.277 13.275c0 7.17-5.95 13.275-13.277 13.275\"\n      ></path>\n    </svg>\n  ),\n  TikTok: (\n    <svg viewBox=\"0 0 256 290\" aria-hidden=\"true\" width=\"18\" height=\"18\" fill=\"currentColor\">\n      <path\n        fill=\"#ff004f\"\n        d=\"M189.72 104.421c18.678 13.345 41.56 21.197 66.273 21.197v-47.53a67 67 0 0 1-13.918-1.456v37.413c-24.711 0-47.59-7.851-66.272-21.195v96.996c0 48.523-39.356 87.855-87.9 87.855c-18.113 0-34.949-5.473-48.934-14.86c15.962 16.313 38.222 26.432 62.848 26.432c48.548 0 87.905-39.332 87.905-87.857v-96.995zm17.17-47.952c-9.546-10.423-15.814-23.893-17.17-38.785v-6.113h-13.189c3.32 18.927 14.644 35.097 30.358 44.898M69.673 225.607a40 40 0 0 1-8.203-24.33c0-22.192 18.001-40.186 40.21-40.186a40.3 40.3 0 0 1 12.197 1.883v-48.593c-4.61-.631-9.262-.9-13.912-.801v37.822a40.3 40.3 0 0 0-12.203-1.882c-22.208 0-40.208 17.992-40.208 40.187c0 15.694 8.997 29.281 22.119 35.9\"\n      ></path>\n      <path d=\"M175.803 92.849c18.683 13.344 41.56 21.195 66.272 21.195V76.631c-13.794-2.937-26.005-10.141-35.186-20.162c-15.715-9.802-27.038-25.972-30.358-44.898h-34.643v189.843c-.079 22.132-18.049 40.052-40.21 40.052c-13.058 0-24.66-6.221-32.007-15.86c-13.12-6.618-22.118-20.206-22.118-35.898c0-22.193 18-40.187 40.208-40.187c4.255 0 8.356.662 12.203 1.882v-37.822c-47.692.985-86.047 39.933-86.047 87.834c0 23.912 9.551 45.589 25.053 61.428c13.985 9.385 30.82 14.86 48.934 14.86c48.545 0 87.9-39.335 87.9-87.857z\"></path>\n      <path\n        fill=\"#00f2ea\"\n        d=\"M242.075 76.63V66.516a66.3 66.3 0 0 1-35.186-10.047a66.47 66.47 0 0 0 35.186 20.163M176.53 11.57a68 68 0 0 1-.728-5.457V0h-47.834v189.845c-.076 22.13-18.046 40.05-40.208 40.05a40.06 40.06 0 0 1-18.09-4.287c7.347 9.637 18.949 15.857 32.007 15.857c22.16 0 40.132-17.918 40.21-40.05V11.571zM99.966 113.58v-10.769a89 89 0 0 0-12.061-.818C39.355 101.993 0 141.327 0 189.845c0 30.419 15.467 57.227 38.971 72.996c-15.502-15.838-25.053-37.516-25.053-61.427c0-47.9 38.354-86.848 86.048-87.833\"\n      ></path>\n    </svg>\n  ),\n  Instagram: (\n    <svg viewBox=\"0 0 256 256\" aria-hidden=\"true\" width=\"18\" height=\"18\" fill=\"currentColor\">\n      <path\n        fill=\"#0a0a08\"\n        d=\"M128 23.064c34.177 0 38.225.13 51.722.745c12.48.57 19.258 2.655 23.769 4.408c5.974 2.322 10.238 5.096 14.717 9.575s7.253 8.743 9.575 14.717c1.753 4.511 3.838 11.289 4.408 23.768c.615 13.498.745 17.546.745 51.723s-.13 38.226-.745 51.723c-.57 12.48-2.655 19.257-4.408 23.768c-2.322 5.974-5.096 10.239-9.575 14.718s-8.743 7.253-14.717 9.574c-4.511 1.753-11.289 3.839-23.769 4.408c-13.495.616-17.543.746-51.722.746s-38.228-.13-51.723-.746c-12.48-.57-19.257-2.655-23.768-4.408c-5.974-2.321-10.239-5.095-14.718-9.574c-4.479-4.48-7.253-8.744-9.574-14.718c-1.753-4.51-3.839-11.288-4.408-23.768c-.616-13.497-.746-17.545-.746-51.723s.13-38.225.746-51.722c.57-12.48 2.655-19.258 4.408-23.769c2.321-5.974 5.095-10.238 9.574-14.717c4.48-4.48 8.744-7.253 14.718-9.575c4.51-1.753 11.288-3.838 23.768-4.408c13.497-.615 17.545-.745 51.723-.745M128 0C93.237 0 88.878.147 75.226.77c-13.625.622-22.93 2.786-31.071 5.95c-8.418 3.271-15.556 7.648-22.672 14.764S9.991 35.738 6.72 44.155C3.555 52.297 1.392 61.602.77 75.226C.147 88.878 0 93.237 0 128s.147 39.122.77 52.774c.622 13.625 2.785 22.93 5.95 31.071c3.27 8.417 7.647 15.556 14.763 22.672s14.254 11.492 22.672 14.763c8.142 3.165 17.446 5.328 31.07 5.95c13.653.623 18.012.77 52.775.77s39.122-.147 52.774-.77c13.624-.622 22.929-2.785 31.07-5.95c8.418-3.27 15.556-7.647 22.672-14.763s11.493-14.254 14.764-22.672c3.164-8.142 5.328-17.446 5.95-31.07c.623-13.653.77-18.012.77-52.775s-.147-39.122-.77-52.774c-.622-13.624-2.786-22.929-5.95-31.07c-3.271-8.418-7.648-15.556-14.764-22.672S220.262 9.99 211.845 6.72c-8.142-3.164-17.447-5.328-31.071-5.95C167.122.147 162.763 0 128 0m0 62.27c-36.302 0-65.73 29.43-65.73 65.73s29.428 65.73 65.73 65.73c36.301 0 65.73-29.428 65.73-65.73c0-36.301-29.429-65.73-65.73-65.73m0 108.397c-23.564 0-42.667-19.103-42.667-42.667S104.436 85.333 128 85.333s42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667m83.686-110.994c0 8.484-6.876 15.36-15.36 15.36s-15.36-6.876-15.36-15.36s6.877-15.36 15.36-15.36s15.36 6.877 15.36 15.36\"\n      ></path>\n    </svg>\n  ),\n  Telegram: (\n    <svg viewBox=\"0 0 256 256\" aria-hidden=\"true\" width=\"18\" height=\"18\" fill=\"currentColor\">\n      <defs>\n        <linearGradient id=\"SVG6DaOZcwt\" x1=\"50%\" x2=\"50%\" y1=\"0%\" y2=\"100%\">\n          <stop offset=\"0%\" stopColor=\"#2aabee\"></stop>\n          <stop offset=\"100%\" stopColor=\"#229ed9\"></stop>\n        </linearGradient>\n      </defs>\n      <path\n        fill=\"url(#SVG6DaOZcwt)\"\n        d=\"M128 0C94.06 0 61.48 13.494 37.5 37.49A128.04 128.04 0 0 0 0 128c0 33.934 13.5 66.514 37.5 90.51C61.48 242.506 94.06 256 128 256s66.52-13.494 90.5-37.49c24-23.996 37.5-56.576 37.5-90.51s-13.5-66.514-37.5-90.51C194.52 13.494 161.94 0 128 0\"\n      ></path>\n      <path\n        fill=\"#fff\"\n        d=\"M57.94 126.648q55.98-24.384 74.64-32.152c35.56-14.786 42.94-17.354 47.76-17.441c1.06-.017 3.42.245 4.96 1.49c1.28 1.05 1.64 2.47 1.82 3.467c.16.996.38 3.266.2 5.038c-1.92 20.24-10.26 69.356-14.5 92.026c-1.78 9.592-5.32 12.808-8.74 13.122c-7.44.684-13.08-4.912-20.28-9.63c-11.26-7.386-17.62-11.982-28.56-19.188c-12.64-8.328-4.44-12.906 2.76-20.386c1.88-1.958 34.64-31.748 35.26-34.45c.08-.338.16-1.598-.6-2.262c-.74-.666-1.84-.438-2.64-.258c-1.14.256-19.12 12.152-54 35.686c-5.1 3.508-9.72 5.218-13.88 5.128c-4.56-.098-13.36-2.584-19.9-4.708c-8-2.606-14.38-3.984-13.82-8.41c.28-2.304 3.46-4.662 9.52-7.072\"\n      ></path>\n    </svg>\n  ),\n  WhatsApp: (\n    <svg viewBox=\"0 0 256 258\" aria-hidden=\"true\" width=\"18\" height=\"18\" fill=\"currentColor\">\n      <defs>\n        <linearGradient id=\"SVGK3KZq49U\" x1=\"50%\" x2=\"50%\" y1=\"100%\" y2=\"0%\">\n          <stop offset=\"0%\" stopColor=\"#1faf38\"></stop>\n          <stop offset=\"100%\" stopColor=\"#60d669\"></stop>\n        </linearGradient>\n        <linearGradient id=\"SVGefMkoEOd\" x1=\"50%\" x2=\"50%\" y1=\"100%\" y2=\"0%\">\n          <stop offset=\"0%\" stopColor=\"#f9f9f9\"></stop>\n          <stop offset=\"100%\" stopColor=\"#fff\"></stop>\n        </linearGradient>\n      </defs>\n      <path\n        fill=\"url(#SVGK3KZq49U)\"\n        d=\"M5.463 127.456c-.006 21.677 5.658 42.843 16.428 61.499L4.433 252.697l65.232-17.104a123 123 0 0 0 58.8 14.97h.054c67.815 0 123.018-55.183 123.047-123.01c.013-32.867-12.775-63.773-36.009-87.025c-23.23-23.25-54.125-36.061-87.043-36.076c-67.823 0-123.022 55.18-123.05 123.004\"\n      ></path>\n      <path\n        fill=\"url(#SVGefMkoEOd)\"\n        d=\"M1.07 127.416c-.007 22.457 5.86 44.38 17.014 63.704L0 257.147l67.571-17.717c18.618 10.151 39.58 15.503 60.91 15.511h.055c70.248 0 127.434-57.168 127.464-127.423c.012-34.048-13.236-66.065-37.3-90.15C194.633 13.286 162.633.014 128.536 0C58.276 0 1.099 57.16 1.071 127.416m40.24 60.376l-2.523-4.005c-10.606-16.864-16.204-36.352-16.196-56.363C22.614 69.029 70.138 21.52 128.576 21.52c28.3.012 54.896 11.044 74.9 31.06c20.003 20.018 31.01 46.628 31.003 74.93c-.026 58.395-47.551 105.91-105.943 105.91h-.042c-19.013-.01-37.66-5.116-53.922-14.765l-3.87-2.295l-40.098 10.513z\"\n      ></path>\n      <path\n        fill=\"#fff\"\n        d=\"M96.678 74.148c-2.386-5.303-4.897-5.41-7.166-5.503c-1.858-.08-3.982-.074-6.104-.074c-2.124 0-5.575.799-8.492 3.984c-2.92 3.188-11.148 10.892-11.148 26.561s11.413 30.813 13.004 32.94c1.593 2.123 22.033 35.307 54.405 48.073c26.904 10.609 32.379 8.499 38.218 7.967c5.84-.53 18.844-7.702 21.497-15.139c2.655-7.436 2.655-13.81 1.859-15.142c-.796-1.327-2.92-2.124-6.105-3.716s-18.844-9.298-21.763-10.361c-2.92-1.062-5.043-1.592-7.167 1.597c-2.124 3.184-8.223 10.356-10.082 12.48c-1.857 2.129-3.716 2.394-6.9.801c-3.187-1.598-13.444-4.957-25.613-15.806c-9.468-8.442-15.86-18.867-17.718-22.056c-1.858-3.184-.199-4.91 1.398-6.497c1.431-1.427 3.186-3.719 4.78-5.578c1.588-1.86 2.118-3.187 3.18-5.311c1.063-2.126.531-3.986-.264-5.579c-.798-1.593-6.987-17.343-9.819-23.64\"\n      ></path>\n    </svg>\n  ),\n  Amazon: (\n    <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\" width=\"18\" height=\"18\" fill=\"currentColor\">\n      <path\n        d=\"M10.813 11.968c.157.083.36.074.5-.05l.005.005a90 90 0 0 1 1.623-1.405c.173-.143.143-.372.006-.563l-.125-.17c-.345-.465-.673-.906-.673-1.791v-3.3l.001-.335c.008-1.265.014-2.421-.933-3.305C10.404.274 9.06 0 8.03 0 6.017 0 3.77.75 3.296 3.24c-.047.264.143.404.316.443l2.054.22c.19-.009.33-.196.366-.387.176-.857.896-1.271 1.703-1.271.435 0 .929.16 1.188.55.264.39.26.91.257 1.376v.432q-.3.033-.621.065c-1.113.114-2.397.246-3.36.67C3.873 5.91 2.94 7.08 2.94 8.798c0 2.2 1.387 3.298 3.168 3.298 1.506 0 2.328-.354 3.489-1.54l.167.246c.274.405.456.675 1.047 1.166ZM6.03 8.431C6.03 6.627 7.647 6.3 9.177 6.3v.57c.001.776.002 1.434-.396 2.133-.336.595-.87.961-1.465.961-.812 0-1.286-.619-1.286-1.533M.435 12.174c2.629 1.603 6.698 4.084 13.183.997.28-.116.475.078.199.431C13.538 13.96 11.312 16 7.57 16 3.832 16 .968 13.446.094 12.386c-.24-.275.036-.4.199-.299z M13.828 11.943c.567-.07 1.468-.027 1.645.204.135.176-.004.966-.233 1.533-.23.563-.572.961-.762 1.115s-.333.094-.23-.137c.105-.23.684-1.663.455-1.963-.213-.278-1.177-.177-1.625-.13l-.09.009q-.142.013-.233.024c-.193.021-.245.027-.274-.032-.074-.209.779-.556 1.347-.623\"\n        fill=\"currentColor\"\n      ></path>\n    </svg>\n  ),\n  Bitbucket: (\n    <svg viewBox=\"0 0 256 231\" aria-hidden=\"true\" width=\"18\" height=\"18\" fill=\"currentColor\">\n      <defs>\n        <linearGradient id=\"SVGR9diIphF\" x1=\"108.633%\" x2=\"46.927%\" y1=\"13.818%\" y2=\"78.776%\">\n          <stop offset=\"18%\" stopColor=\"#0052cc\"></stop>\n          <stop offset=\"100%\" stopColor=\"#2684ff\"></stop>\n        </linearGradient>\n      </defs>\n      <g fill=\"none\">\n        <path d=\"M101.272 152.561h53.449l12.901-75.319H87.06z\"></path>\n        <path\n          fill=\"#2684ff\"\n          d=\"M8.308 0A8.202 8.202 0 0 0 .106 9.516l34.819 211.373a11.155 11.155 0 0 0 10.909 9.31h167.04a8.2 8.2 0 0 0 8.201-6.89l34.82-213.752a8.202 8.202 0 0 0-8.203-9.514zm146.616 152.768h-53.315l-14.436-75.42h80.67z\"\n        ></path>\n        <path\n          fill=\"url(#SVGR9diIphF)\"\n          d=\"M244.61 77.242h-76.916l-12.909 75.36h-53.272l-62.902 74.663a11.1 11.1 0 0 0 7.171 2.704H212.73a8.196 8.196 0 0 0 8.196-6.884z\"\n        ></path>\n      </g>\n    </svg>\n  ),\n  Auth0: (\n    <svg viewBox=\"0 0 256 285\" aria-hidden=\"true\" width=\"18\" height=\"18\" fill=\"currentColor\">\n      <path d=\"M220.412 0h-92.415l28.562 89.006h92.416l-74.77 53.077l28.57 89.511c48.128-35.06 63.854-88.12 46.208-142.588zM7.018 89.006h92.416L127.997 0H35.589zc-17.655 54.468-1.92 107.529 46.207 142.588l28.563-89.51zm46.208 142.588l74.77 52.97l74.77-52.97l-74.77-53.847z\"></path>\n    </svg>\n  ),\n  Okta: (\n    <svg viewBox=\"0 0 256 256\" aria-hidden=\"true\" width=\"18\" height=\"18\" fill=\"currentColor\">\n      <path d=\"m140.844 1.778l-5.266 64.853a66 66 0 0 0-7.542-.427c-3.203 0-6.334.214-9.393.712l-2.99-31.432a1.72 1.72 0 0 1 1.709-1.848h5.337l-2.562-31.787C120.066.853 120.848 0 121.774 0h17.434c.996 0 1.779.853 1.636 1.849zm-43.976 3.2c-.285-.925-1.281-1.494-2.206-1.138L78.295 9.813c-.925.356-1.352 1.423-.925 2.276l13.307 29.013l-5.052 1.85c-.926.355-1.352 1.421-.926 2.275l13.592 28.515a61 61 0 0 1 15.868-6.044L96.94 4.978zM56.734 23.04l37.643 53.049c-4.768 3.129-9.108 6.827-12.809 11.093L59.011 64.996a1.72 1.72 0 0 1 .071-2.49l4.127-3.413L40.794 36.41c-.711-.711-.64-1.849.142-2.489l13.307-11.164c.783-.64 1.85-.498 2.42.284zM25.139 53.76c-.783-.569-1.921-.284-2.42.569l-8.68 15.075c-.499.854-.143 1.92.71 2.347L43.64 85.404l-2.704 4.623c-.498.853-.142 1.99.783 2.346l28.749 13.156a60.2 60.2 0 0 1 8.254-14.791zM3.862 94.72c.143-.996 1.139-1.564 2.064-1.351l62.976 16.427a62.3 62.3 0 0 0-2.704 16.782l-31.524-2.56a1.642 1.642 0 0 1-1.494-1.991l.925-5.263l-31.808-2.986c-.996-.071-1.637-.996-1.495-1.991l2.99-17.138zm-2.348 42.524c-.996.072-1.637.996-1.494 1.992l3.06 17.137c.142.996 1.138 1.565 2.063 1.351l30.883-8.035l.925 5.262c.143.996 1.139 1.565 2.064 1.351l30.456-8.39c-1.779-5.263-2.917-10.88-3.202-16.64l-64.826 5.972zM11.62 182.33c-.498-.853-.143-1.92.711-2.347l58.778-27.875c2.206 5.262 5.195 10.169 8.753 14.577L54.1 185.031c-.783.569-1.921.356-2.42-.498l-2.704-4.693l-26.257 18.133c-.783.57-1.922.285-2.42-.569l-8.752-15.075zm71.23-12.231L37.094 216.39c-.712.711-.64 1.849.142 2.489l13.378 11.164c.783.64 1.85.498 2.42-.284l18.501-26.027l4.127 3.485c.783.64 1.922.498 2.49-.356l17.933-26.026c-4.839-2.987-9.322-6.614-13.165-10.738zm-9.037 74.31c-.925-.355-1.352-1.421-.925-2.275L100 182.97c4.98 2.56 10.389 4.48 16.01 5.547l-7.97 30.577c-.213.925-1.28 1.494-2.205 1.138l-5.052-1.849l-8.468 30.791c-.285.925-1.281 1.494-2.206 1.138l-16.367-5.973zm46.68-55.11l-5.265 64.853c-.071.996.711 1.849 1.637 1.849h17.434c.996 0 1.779-.853 1.636-1.849l-2.561-31.787h5.336a1.72 1.72 0 0 0 1.708-1.848l-2.988-31.432c-3.06.498-6.191.712-9.393.712c-2.562 0-5.053-.143-7.543-.498m62.763-175.574c.427-.924 0-1.92-.925-2.275l-16.366-5.973c-.926-.356-1.922.213-2.206 1.137l-8.468 30.791l-5.053-1.848c-.925-.356-1.921.213-2.206 1.137l-7.97 30.578c5.693 1.138 11.03 3.058 16.011 5.547zm35.722 25.814L173.222 85.83a62 62 0 0 0-13.165-10.738l17.933-26.026c.569-.783 1.707-.996 2.49-.356l4.127 3.485l18.502-26.027c.57-.782 1.708-.925 2.42-.285l13.377 11.165c.783.64.783 1.778.143 2.489zm24.764 36.409c.925-.427 1.21-1.494.711-2.347L235.7 58.524c-.498-.853-1.637-1.066-2.42-.568l-26.257 18.133l-2.704-4.622c-.499-.854-1.637-1.138-2.42-.498l-25.76 18.347c3.558 4.408 6.476 9.315 8.753 14.577l58.778-27.875zm9.25 23.609l2.99 17.137c.142.996-.499 1.85-1.495 1.991l-64.826 6.045c-.285-5.831-1.424-11.378-3.203-16.64l30.457-8.391c.925-.285 1.921.355 2.063 1.35l.925 5.263l30.884-8.035c.925-.214 1.92.355 2.063 1.35zm-2.917 62.933c.925.213 1.921-.356 2.064-1.351L255.126 144c.143-.996-.498-1.849-1.494-1.991l-31.808-2.987l.925-5.262c.142-.996-.498-1.849-1.495-1.991l-31.523-2.56a62.3 62.3 0 0 1-2.704 16.782l62.976 16.427zM233.28 201.6c-.498.853-1.636 1.067-2.419.569l-53.583-36.978a60.2 60.2 0 0 0 8.254-14.791l28.749 13.156c.925.426 1.28 1.493.783 2.346l-2.704 4.622l28.89 13.654c.854.426 1.21 1.493.712 2.346zm-71.657-21.831l37.643 53.049c.57.782 1.708.924 2.42.284l13.306-11.164c.783-.64.783-1.778.143-2.49l-22.415-22.684l4.127-3.413c.783-.64.783-1.778.07-2.489l-22.557-22.186c-3.771 4.266-8.04 8.035-12.808 11.093zm-.356 72.249c-.925.355-1.921-.214-2.206-1.138l-17.22-62.72a61 61 0 0 0 15.868-6.044l13.592 28.515c.426.925 0 1.991-.926 2.276l-5.052 1.849l13.307 29.013c.427.924 0 1.92-.925 2.275l-16.367 5.974z\"></path>\n    </svg>\n  ),\n};\nexport const socialProviders = [\n  'Google',\n  'GitHub',\n  'Slack',\n  'Apple',\n  'GitLab',\n  'Microsoft',\n  'X',\n  'Facebook',\n  'LinkedIn',\n  'Discord',\n  'Figma',\n  'Notion',\n  'Dropbox',\n  'Spotify',\n  'Twitch',\n  'Reddit',\n  'TikTok',\n  'Instagram',\n  'Telegram',\n  'WhatsApp',\n  'Amazon',\n  'Bitbucket',\n  'Auth0',\n  'Okta',\n] as const;\nfunction SocialLogo({ provider }: { provider: string }) {\n  if (provider !== 'Google' && socialProviderMarks[provider]) return socialProviderMarks[provider];\n  if (provider === 'Google')\n    return (\n      <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" aria-hidden=\"true\">\n        <path\n          fill=\"#4285F4\"\n          d=\"M21.6 12.2c0-.7-.1-1.4-.2-2.1H12v4h5.4c-.2 1.2-.9 2.2-2 2.9v2.4h3.2c1.9-1.7 3-4.2 3-7.2Z\"\n        />\n        <path\n          fill=\"#34A853\"\n          d=\"M12 22c2.7 0 5-.9 6.6-2.5l-3.2-2.4c-.9.6-2 1-3.4 1-2.6 0-4.8-1.8-5.6-4.1H3.1v2.5C4.8 19.8 8.1 22 12 22Z\"\n        />\n        <path fill=\"#FBBC05\" d=\"M6.4 14a6 6 0 0 1 0-4V7.5H3.1a10 10 0 0 0 0 9L6.4 14Z\" />\n        <path\n          fill=\"#EA4335\"\n          d=\"M12 5.9c1.5 0 2.8.5 3.8 1.5l2.8-2.8A9.5 9.5 0 0 0 12 2a10 10 0 0 0-8.9 5.5L6.4 10c.8-2.4 3-4.1 5.6-4.1Z\"\n        />\n      </svg>\n    );\n  if (provider === 'GitHub')\n    return (\n      <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"currentColor\" aria-hidden=\"true\">\n        <path d=\"M12 .5a12 12 0 0 0-3.8 23.4c.6.1.8-.3.8-.6v-2.4c-3.3.7-4-1.4-4-1.4-.5-1.4-1.3-1.8-1.3-1.8-1.1-.7.1-.7.1-.7 1.2.1 1.8 1.2 1.8 1.2 1.1 1.8 2.8 1.3 3.5 1 .1-.8.4-1.3.8-1.6-2.6-.3-5.4-1.3-5.4-5.9 0-1.3.5-2.4 1.2-3.2-.1-.3-.5-1.5.1-3.2 0 0 1-.3 3.3 1.2a11.5 11.5 0 0 1 6 0C17.5 5 18.5 5.3 18.5 5.3c.6 1.7.2 2.9.1 3.2.8.8 1.2 1.9 1.2 3.2 0 4.6-2.8 5.6-5.5 5.9.5.4.9 1.1.9 2.2v3.5c0 .3.2.7.8.6A12 12 0 0 0 12 .5Z\" />\n      </svg>\n    );\n  if (provider === 'Slack')\n    return (\n      <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" aria-hidden=\"true\">\n        <g strokeWidth=\"4\" strokeLinecap=\"round\">\n          <path stroke=\"#36C5F0\" d=\"M4 10h5M9 4v1\" />\n          <path stroke=\"#2EB67D\" d=\"M14 4v5M20 9h-1\" />\n          <path stroke=\"#ECB22E\" d=\"M20 14h-5M15 20v-1\" />\n          <path stroke=\"#E01E5A\" d=\"M10 20v-5M4 15h1\" />\n        </g>\n      </svg>\n    );\n  return (\n    <span aria-hidden=\"true\">\n      {provider === 'SSO'\n        ? '↗'\n        : provider\n            .split(/\\s+/)\n            .map((word) => word[0])\n            .join('')\n            .slice(0, 2)}\n    </span>\n  );\n}\n// Monochrome geometry and provider fills from BoardUI public install registry, 26 October 2026.\nconst publicSocialProviders: Record<string,{label:string;brand:string;viewBox:string;path:string}> = {\n  \"Google\": {\n    \"label\": \"Google\",\n    \"brand\": \"var(--color-accent-500)\",\n    \"viewBox\": \"0 0 24 24\",\n    \"path\": \"M12.48 10.92v3.28h7.84c-.24 1.84-.853 3.187-1.787 4.133-1.147 1.147-2.933 2.4-6.053 2.4-4.827 0-8.6-3.893-8.6-8.72s3.773-8.72 8.6-8.72c2.6 0 4.507 1.027 5.907 2.347l2.307-2.307C18.747 1.44 16.133 0 12.48 0 5.867 0 .307 5.387.307 12s5.56 12 12.173 12c3.573 0 6.267-1.173 8.373-3.36 2.16-2.16 2.84-5.213 2.84-7.667 0-.76-.053-1.467-.173-2.053H12.48z\"\n  },\n  \"Apple\": {\n    \"label\": \"Apple\",\n    \"brand\": \"#000000\",\n    \"viewBox\": \"0 0 24 24\",\n    \"path\": \"M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701\"\n  },\n  \"GitHub\": {\n    \"label\": \"GitHub\",\n    \"brand\": \"#181717\",\n    \"viewBox\": \"0 0 24 24\",\n    \"path\": \"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"\n  },\n  \"GitLab\": {\n    \"label\": \"GitLab\",\n    \"brand\": \"#FC6D26\",\n    \"viewBox\": \"0 0 24 24\",\n    \"path\": \"m23.6004 9.5927-.0337-.0862L20.3.9814a.851.851 0 0 0-.3362-.405.8748.8748 0 0 0-.9997.0539.8748.8748 0 0 0-.29.4399l-2.2055 6.748H7.5375l-2.2057-6.748a.8573.8573 0 0 0-.29-.4412.8748.8748 0 0 0-.9997-.0537.8585.8585 0 0 0-.3362.4049L.4332 9.5015l-.0325.0862a6.0657 6.0657 0 0 0 2.0119 7.0105l.0113.0087.03.0213 4.976 3.7264 2.462 1.8633 1.4995 1.1321a1.0085 1.0085 0 0 0 1.2197 0l1.4995-1.1321 2.4619-1.8633 5.006-3.7489.0125-.01a6.0682 6.0682 0 0 0 2.0094-7.003z\"\n  },\n  \"Microsoft\": {\n    \"label\": \"Microsoft\",\n    \"brand\": \"#5E5E5E\",\n    \"viewBox\": \"0 0 16 16\",\n    \"path\": \"M7.462 0H0v7.19h7.462zM16 0H8.538v7.19H16zM7.462 8.211H0V16h7.462zm8.538 0H8.538V16H16z\"\n  },\n  \"X\": {\n    \"label\": \"X\",\n    \"brand\": \"#000000\",\n    \"viewBox\": \"0 0 24 24\",\n    \"path\": \"M14.234 10.162 22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299-.929-1.329L3.076 1.56h3.182l5.965 8.532.929 1.329 7.754 11.09h-3.182z\"\n  },\n  \"Facebook\": {\n    \"label\": \"Facebook\",\n    \"brand\": \"#0866FF\",\n    \"viewBox\": \"0 0 24 24\",\n    \"path\": \"M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z\"\n  },\n  \"LinkedIn\": {\n    \"label\": \"LinkedIn\",\n    \"brand\": \"#0A66C2\",\n    \"viewBox\": \"0 0 16 16\",\n    \"path\": \"M0 1.146C0 .513.526 0 1.175 0h13.65C15.474 0 16 .513 16 1.146v13.708c0 .633-.526 1.146-1.175 1.146H1.175C.526 16 0 15.487 0 14.854zm4.943 12.248V6.169H2.542v7.225zm-1.2-8.212c.837 0 1.358-.554 1.358-1.248-.015-.709-.52-1.248-1.342-1.248S2.4 3.226 2.4 3.934c0 .694.521 1.248 1.327 1.248zm4.908 8.212V9.359c0-.216.016-.432.08-.586.173-.431.568-.878 1.232-.878.869 0 1.216.662 1.216 1.634v3.865h2.401V9.25c0-2.22-1.184-3.252-2.764-3.252-1.274 0-1.845.7-2.165 1.193v.025h-.016l.016-.025V6.169h-2.4c.03.678 0 7.225 0 7.225z\"\n  },\n  \"Discord\": {\n    \"label\": \"Discord\",\n    \"brand\": \"#5865F2\",\n    \"viewBox\": \"0 0 24 24\",\n    \"path\": \"M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189Z\"\n  },\n  \"Slack\": {\n    \"label\": \"Slack\",\n    \"brand\": \"#4A154B\",\n    \"viewBox\": \"0 0 16 16\",\n    \"path\": \"M3.362 10.11c0 .926-.756 1.681-1.681 1.681S0 11.036 0 10.111.756 8.43 1.68 8.43h1.682zm.846 0c0-.924.756-1.68 1.681-1.68s1.681.756 1.681 1.68v4.21c0 .924-.756 1.68-1.68 1.68a1.685 1.685 0 0 1-1.682-1.68zM5.89 3.362c-.926 0-1.682-.756-1.682-1.681S4.964 0 5.89 0s1.68.756 1.68 1.68v1.682zm0 .846c.924 0 1.68.756 1.68 1.681S6.814 7.57 5.89 7.57H1.68C.757 7.57 0 6.814 0 5.89c0-.926.756-1.682 1.68-1.682zm6.749 1.682c0-.926.755-1.682 1.68-1.682S16 4.964 16 5.889s-.756 1.681-1.68 1.681h-1.681zm-.848 0c0 .924-.755 1.68-1.68 1.68A1.685 1.685 0 0 1 8.43 5.89V1.68C8.43.757 9.186 0 10.11 0c.926 0 1.681.756 1.681 1.68zm-1.681 6.748c.926 0 1.682.756 1.682 1.681S11.036 16 10.11 16s-1.681-.756-1.681-1.68v-1.682h1.68zm0-.847c-.924 0-1.68-.755-1.68-1.68s.756-1.681 1.68-1.681h4.21c.924 0 1.68.756 1.68 1.68 0 .926-.756 1.681-1.68 1.681z\"\n  },\n  \"Figma\": {\n    \"label\": \"Figma\",\n    \"brand\": \"#F24E1E\",\n    \"viewBox\": \"0 0 24 24\",\n    \"path\": \"M15.852 8.981h-4.588V0h4.588c2.476 0 4.49 2.014 4.49 4.49s-2.014 4.491-4.49 4.491zM12.735 7.51h3.117c1.665 0 3.019-1.355 3.019-3.019s-1.355-3.019-3.019-3.019h-3.117V7.51zm0 1.471H8.148c-2.476 0-4.49-2.014-4.49-4.49S5.672 0 8.148 0h4.588v8.981zm-4.587-7.51c-1.665 0-3.019 1.355-3.019 3.019s1.354 3.02 3.019 3.02h3.117V1.471H8.148zm4.587 15.019H8.148c-2.476 0-4.49-2.014-4.49-4.49s2.014-4.49 4.49-4.49h4.588v8.98zM8.148 8.981c-1.665 0-3.019 1.355-3.019 3.019s1.355 3.019 3.019 3.019h3.117V8.981H8.148zM8.172 24c-2.489 0-4.515-2.014-4.515-4.49s2.014-4.49 4.49-4.49h4.588v4.441c0 2.503-2.047 4.539-4.563 4.539zm-.024-7.51a3.023 3.023 0 0 0-3.019 3.019c0 1.665 1.365 3.019 3.044 3.019 1.705 0 3.093-1.376 3.093-3.068v-2.97H8.148zm7.704 0h-.098c-2.476 0-4.49-2.014-4.49-4.49s2.014-4.49 4.49-4.49h.098c2.476 0 4.49 2.014 4.49 4.49s-2.014 4.49-4.49 4.49zm-.097-7.509c-1.665 0-3.019 1.355-3.019 3.019s1.355 3.019 3.019 3.019h.098c1.665 0 3.019-1.355 3.019-3.019s-1.355-3.019-3.019-3.019h-.098z\"\n  },\n  \"Notion\": {\n    \"label\": \"Notion\",\n    \"brand\": \"#000000\",\n    \"viewBox\": \"0 0 24 24\",\n    \"path\": \"M4.459 4.208c.746.606 1.026.56 2.428.466l13.215-.793c.28 0 .047-.28-.046-.326L17.86 1.968c-.42-.326-.981-.7-2.055-.607L3.01 2.295c-.466.046-.56.28-.374.466zm.793 3.08v13.904c0 .747.373 1.027 1.214.98l14.523-.84c.841-.046.935-.56.935-1.167V6.354c0-.606-.233-.933-.748-.887l-15.177.887c-.56.047-.747.327-.747.933zm14.337.745c.093.42 0 .84-.42.888l-.7.14v10.264c-.608.327-1.168.514-1.635.514-.748 0-.935-.234-1.495-.933l-4.577-7.186v6.952L12.21 19s0 .84-1.168.84l-3.222.186c-.093-.186 0-.653.327-.746l.84-.233V9.854L7.822 9.76c-.094-.42.14-1.026.793-1.073l3.456-.233 4.764 7.279v-6.44l-1.215-.139c-.093-.514.28-.887.747-.933zM1.936 1.035l13.31-.98c1.634-.14 2.055-.047 3.082.7l4.249 2.986c.7.513.934.653.934 1.213v16.378c0 1.026-.373 1.634-1.68 1.726l-15.458.934c-.98.047-1.448-.093-1.962-.747l-3.129-4.06c-.56-.747-.793-1.306-.793-1.96V2.667c0-.839.374-1.54 1.447-1.632z\"\n  },\n  \"Dropbox\": {\n    \"label\": \"Dropbox\",\n    \"brand\": \"#0061FF\",\n    \"viewBox\": \"0 0 24 24\",\n    \"path\": \"M6 1.807L0 5.629l6 3.822 6.001-3.822L6 1.807zM18 1.807l-6 3.822 6 3.822 6-3.822-6-3.822zM0 13.274l6 3.822 6.001-3.822L6 9.452l-6 3.822zM18 9.452l-6 3.822 6 3.822 6-3.822-6-3.822zM6 18.371l6.001 3.822 6-3.822-6-3.822L6 18.371z\"\n  },\n  \"Spotify\": {\n    \"label\": \"Spotify\",\n    \"brand\": \"#1ED760\",\n    \"viewBox\": \"0 0 24 24\",\n    \"path\": \"M12 0C5.4 0 0 5.4 0 12s5.4 12 12 12 12-5.4 12-12S18.66 0 12 0zm5.521 17.34c-.24.359-.66.48-1.021.24-2.82-1.74-6.36-2.101-10.561-1.141-.418.122-.779-.179-.899-.539-.12-.421.18-.78.54-.9 4.56-1.021 8.52-.6 11.64 1.32.42.18.479.659.301 1.02zm1.44-3.3c-.301.42-.841.6-1.262.3-3.239-1.98-8.159-2.58-11.939-1.38-.479.12-1.02-.12-1.14-.6-.12-.48.12-1.021.6-1.141C9.6 9.9 15 10.561 18.72 12.84c.361.181.54.78.241 1.2zm.12-3.36C15.24 8.4 8.82 8.16 5.16 9.301c-.6.179-1.2-.181-1.38-.721-.18-.601.18-1.2.72-1.381 4.26-1.26 11.28-1.02 15.721 1.621.539.3.719 1.02.419 1.56-.299.421-1.02.599-1.559.3z\"\n  },\n  \"Twitch\": {\n    \"label\": \"Twitch\",\n    \"brand\": \"#9146FF\",\n    \"viewBox\": \"0 0 24 24\",\n    \"path\": \"M11.571 4.714h1.715v5.143H11.57zm4.715 0H18v5.143h-1.714zM6 0L1.714 4.286v15.428h5.143V24l4.286-4.286h3.428L22.286 12V0zm14.571 11.143l-3.428 3.428h-3.429l-3 3v-3H6.857V1.714h13.714Z\"\n  },\n  \"Reddit\": {\n    \"label\": \"Reddit\",\n    \"brand\": \"#FF4500\",\n    \"viewBox\": \"0 0 24 24\",\n    \"path\": \"M12 0C5.373 0 0 5.373 0 12c0 3.314 1.343 6.314 3.515 8.485l-2.286 2.286C.775 23.225 1.097 24 1.738 24H12c6.627 0 12-5.373 12-12S18.627 0 12 0Zm4.388 3.199c1.104 0 1.999.895 1.999 1.999 0 1.105-.895 2-1.999 2-.946 0-1.739-.657-1.947-1.539v.002c-1.147.162-2.032 1.15-2.032 2.341v.007c1.776.067 3.4.567 4.686 1.363.473-.363 1.064-.58 1.707-.58 1.547 0 2.802 1.254 2.802 2.802 0 1.117-.655 2.081-1.601 2.531-.088 3.256-3.637 5.876-7.997 5.876-4.361 0-7.905-2.617-7.998-5.87-.954-.447-1.614-1.415-1.614-2.538 0-1.548 1.255-2.802 2.803-2.802.645 0 1.239.218 1.712.585 1.275-.79 2.881-1.291 4.64-1.365v-.01c0-1.663 1.263-3.034 2.88-3.207.188-.911.993-1.595 1.959-1.595Zm-8.085 8.376c-.784 0-1.459.78-1.506 1.797-.047 1.016.64 1.429 1.426 1.429.786 0 1.371-.369 1.418-1.385.047-1.017-.553-1.841-1.338-1.841Zm7.406 0c-.786 0-1.385.824-1.338 1.841.047 1.017.634 1.385 1.418 1.385.785 0 1.473-.413 1.426-1.429-.046-1.017-.721-1.797-1.506-1.797Zm-3.703 4.013c-.974 0-1.907.048-2.77.135-.147.015-.241.168-.183.305.483 1.154 1.622 1.964 2.953 1.964 1.33 0 2.47-.81 2.953-1.964.057-.137-.037-.29-.184-.305-.863-.087-1.795-.135-2.769-.135Z\"\n  },\n  \"TikTok\": {\n    \"label\": \"TikTok\",\n    \"brand\": \"#000000\",\n    \"viewBox\": \"0 0 24 24\",\n    \"path\": \"M12.525.02c1.31-.02 2.61-.01 3.91-.02.08 1.53.63 3.09 1.75 4.17 1.12 1.11 2.7 1.62 4.24 1.79v4.03c-1.44-.05-2.89-.35-4.2-.97-.57-.26-1.1-.59-1.62-.93-.01 2.92.01 5.84-.02 8.75-.08 1.4-.54 2.79-1.35 3.94-1.31 1.92-3.58 3.17-5.91 3.21-1.43.08-2.86-.31-4.08-1.03-2.02-1.19-3.44-3.37-3.65-5.71-.02-.5-.03-1-.01-1.49.18-1.9 1.12-3.72 2.58-4.96 1.66-1.44 3.98-2.13 6.15-1.72.02 1.48-.04 2.96-.04 4.44-.99-.32-2.15-.23-3.02.37-.63.41-1.11 1.04-1.36 1.75-.21.51-.15 1.07-.14 1.61.24 1.64 1.82 3.02 3.5 2.87 1.12-.01 2.19-.66 2.77-1.61.19-.33.4-.67.41-1.06.1-1.79.06-3.57.07-5.36.01-4.03-.01-8.05.02-12.07z\"\n  },\n  \"Instagram\": {\n    \"label\": \"Instagram\",\n    \"brand\": \"#FF0069\",\n    \"viewBox\": \"0 0 24 24\",\n    \"path\": \"M7.0301.084c-1.2768.0602-2.1487.264-2.911.5634-.7888.3075-1.4575.72-2.1228 1.3877-.6652.6677-1.075 1.3368-1.3802 2.127-.2954.7638-.4956 1.6365-.552 2.914-.0564 1.2775-.0689 1.6882-.0626 4.947.0062 3.2586.0206 3.6671.0825 4.9473.061 1.2765.264 2.1482.5635 2.9107.308.7889.72 1.4573 1.388 2.1228.6679.6655 1.3365 1.0743 2.1285 1.38.7632.295 1.6361.4961 2.9134.552 1.2773.056 1.6884.069 4.9462.0627 3.2578-.0062 3.668-.0207 4.9478-.0814 1.28-.0607 2.147-.2652 2.9098-.5633.7889-.3086 1.4578-.72 2.1228-1.3881.665-.6682 1.0745-1.3378 1.3795-2.1284.2957-.7632.4966-1.636.552-2.9124.056-1.2809.0692-1.6898.063-4.948-.0063-3.2583-.021-3.6668-.0817-4.9465-.0607-1.2797-.264-2.1487-.5633-2.9117-.3084-.7889-.72-1.4568-1.3876-2.1228C21.2982 1.33 20.628.9208 19.8378.6165 19.074.321 18.2017.1197 16.9244.0645 15.6471.0093 15.236-.005 11.977.0014 8.718.0076 8.31.0215 7.0301.0839m.1402 21.6932c-1.17-.0509-1.8053-.2453-2.2287-.408-.5606-.216-.96-.4771-1.3819-.895-.422-.4178-.6811-.8186-.9-1.378-.1644-.4234-.3624-1.058-.4171-2.228-.0595-1.2645-.072-1.6442-.079-4.848-.007-3.2037.0053-3.583.0607-4.848.05-1.169.2456-1.805.408-2.2282.216-.5613.4762-.96.895-1.3816.4188-.4217.8184-.6814 1.3783-.9003.423-.1651 1.0575-.3614 2.227-.4171 1.2655-.06 1.6447-.072 4.848-.079 3.2033-.007 3.5835.005 4.8495.0608 1.169.0508 1.8053.2445 2.228.408.5608.216.96.4754 1.3816.895.4217.4194.6816.8176.9005 1.3787.1653.4217.3617 1.056.4169 2.2263.0602 1.2655.0739 1.645.0796 4.848.0058 3.203-.0055 3.5834-.061 4.848-.051 1.17-.245 1.8055-.408 2.2294-.216.5604-.4763.96-.8954 1.3814-.419.4215-.8181.6811-1.3783.9-.4224.1649-1.0577.3617-2.2262.4174-1.2656.0595-1.6448.072-4.8493.079-3.2045.007-3.5825-.006-4.848-.0608M16.953 5.5864A1.44 1.44 0 1 0 18.39 4.144a1.44 1.44 0 0 0-1.437 1.4424M5.8385 12.012c.0067 3.4032 2.7706 6.1557 6.173 6.1493 3.4026-.0065 6.157-2.7701 6.1506-6.1733-.0065-3.4032-2.771-6.1565-6.174-6.1498-3.403.0067-6.156 2.771-6.1496 6.1738M8 12.0077a4 4 0 1 1 4.008 3.9921A3.9996 3.9996 0 0 1 8 12.0077\"\n  },\n  \"Telegram\": {\n    \"label\": \"Telegram\",\n    \"brand\": \"#26A5E4\",\n    \"viewBox\": \"0 0 24 24\",\n    \"path\": \"M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z\"\n  },\n  \"WhatsApp\": {\n    \"label\": \"WhatsApp\",\n    \"brand\": \"#25D366\",\n    \"viewBox\": \"0 0 24 24\",\n    \"path\": \"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413Z\"\n  },\n  \"Amazon\": {\n    \"label\": \"Amazon\",\n    \"brand\": \"#FF9900\",\n    \"viewBox\": \"0 0 16 16\",\n    \"path\": \"M10.813 11.968c.157.083.36.074.5-.05l.005.005a90 90 0 0 1 1.623-1.405c.173-.143.143-.372.006-.563l-.125-.17c-.345-.465-.673-.906-.673-1.791v-3.3l.001-.335c.008-1.265.014-2.421-.933-3.305C10.404.274 9.06 0 8.03 0 6.017 0 3.77.75 3.296 3.24c-.047.264.143.404.316.443l2.054.22c.19-.009.33-.196.366-.387.176-.857.896-1.271 1.703-1.271.435 0 .929.16 1.188.55.264.39.26.91.257 1.376v.432q-.3.033-.621.065c-1.113.114-2.397.246-3.36.67C3.873 5.91 2.94 7.08 2.94 8.798c0 2.2 1.387 3.298 3.168 3.298 1.506 0 2.328-.354 3.489-1.54l.167.246c.274.405.456.675 1.047 1.166ZM6.03 8.431C6.03 6.627 7.647 6.3 9.177 6.3v.57c.001.776.002 1.434-.396 2.133-.336.595-.87.961-1.465.961-.812 0-1.286-.619-1.286-1.533M.435 12.174c2.629 1.603 6.698 4.084 13.183.997.28-.116.475.078.199.431C13.538 13.96 11.312 16 7.57 16 3.832 16 .968 13.446.094 12.386c-.24-.275.036-.4.199-.299z M13.828 11.943c.567-.07 1.468-.027 1.645.204.135.176-.004.966-.233 1.533-.23.563-.572.961-.762 1.115s-.333.094-.23-.137c.105-.23.684-1.663.455-1.963-.213-.278-1.177-.177-1.625-.13l-.09.009q-.142.013-.233.024c-.193.021-.245.027-.274-.032-.074-.209.779-.556 1.347-.623\"\n  },\n  \"Bitbucket\": {\n    \"label\": \"Bitbucket\",\n    \"brand\": \"#0052CC\",\n    \"viewBox\": \"0 0 24 24\",\n    \"path\": \"M.778 1.213a.768.768 0 00-.768.892l3.263 19.81c.084.5.515.868 1.022.873H19.95a.772.772 0 00.77-.646l3.27-20.03a.768.768 0 00-.768-.891zM14.52 15.53H9.522L8.17 8.466h7.561z\"\n  },\n  \"Auth0\": {\n    \"label\": \"Auth0\",\n    \"brand\": \"#EB5424\",\n    \"viewBox\": \"0 0 24 24\",\n    \"path\": \"M21.98 7.448L19.62 0H4.347L2.02 7.448c-1.352 4.312.03 9.206 3.815 12.015L12.007 24l6.157-4.552c3.755-2.81 5.182-7.688 3.815-12.015l-6.16 4.58 2.343 7.45-6.157-4.597-6.158 4.58 2.358-7.433-6.188-4.55 7.63-.045L12.008 0l2.356 7.404 7.615.044z\"\n  },\n  \"Okta\": {\n    \"label\": \"Okta\",\n    \"brand\": \"#007DC1\",\n    \"viewBox\": \"0 0 24 24\",\n    \"path\": \"M12 0C5.389 0 0 5.35 0 12s5.35 12 12 12 12-5.35 12-12S18.611 0 12 0zm0 18c-3.325 0-6-2.675-6-6s2.675-6 6-6 6 2.675 6 6-2.675 6-6 6z\"\n  }\n};\nexport type SocialBrandMarkProps = { provider: SocialProvider; size?: number; monochrome?: boolean };\n/** Decorative provider artwork. The containing link or control supplies its accessible name. */\nexport function SocialBrandMark({provider,size=18,monochrome=false}:SocialBrandMarkProps){\n  const meta=Object.values(publicSocialProviders).find(item=>item.label.toLowerCase()===provider.toLowerCase()),name=meta?.label||provider;\n  return <span className={'he-social-mark he-provider-'+name.toLowerCase().replace(/[^a-z]/g,'')} aria-hidden=\"true\" style={{width:size,height:size}}>{monochrome&&meta?<svg viewBox={meta.viewBox} width={size} height={size}><path d={meta.path} fill=\"currentColor\"/></svg>:<SocialLogo provider={name}/>}</span>;\n}\nexport function SocialButton({provider,onPress,label,disabled=false,loading=false,size='md',appearance='brand',iconOnly=false,logo,brandColor,href,target,fullWidth=false,children}:SocialButtonProps) {\n  const meta=Object.values(publicSocialProviders).find(item=>item.label.toLowerCase()===provider.toLowerCase()), providerName=meta?.label||provider,\n    mode=appearance==='brand'?'colorful':appearance==='neutral'?'white':appearance,\n    text=children??label??`Continue with ${providerName}`,\n    fill=brandColor||(meta?.brand.startsWith('var(')?'var(--hu-action)':meta?.brand)||'#000000';\n  let ink='#fff',end=fill;\n  if(/^#[a-f\\d]{6}$/i.test(fill)){\n    const rgb=[1,3,5].map(index=>parseInt(fill.slice(index,index+2),16)),\n      luminance=(channels:number[])=>channels.map(value=>{const channel=value/255;return channel<=.04045?channel/12.92:((channel+.055)/1.055)**2.4}).reduce((sum,value,index)=>sum+value*[.2126,.7152,.0722][index],0);\n    ink=1.05/(luminance(rgb)+.05)>=4.5?'#fff':'#000';\n    // Preserve the public brand fill, with a readable label throughout its gradient.\n    let factor=.9;\n    while(ink==='#000'&&(luminance(rgb.map(value=>Math.round(value*factor)))+.05)/.05<4.5&&factor<1)factor+=.005;\n    end='#'+rgb.map(value=>Math.round(value*Math.min(1,factor)).toString(16).padStart(2,'0')).join('');\n  }else if(fill.startsWith('var(')){ink='var(--hu-on-action)';end='color-mix(in srgb, var(--hu-action) 90%, #000)';}\n  const mark=<span className=\"he-social-mark\" aria-hidden=\"true\">{logo||(mode==='white'?<SocialLogo provider={providerName}/>:meta?<svg viewBox={meta.viewBox} width=\"18\" height=\"18\" aria-hidden=\"true\"><path d={meta.path} fill=\"currentColor\"/></svg>:<SocialLogo provider={providerName}/>)}</span>,\n    className=`he-social-button he-social-${mode} he-social-${appearance} he-provider-${providerName.toLowerCase().replace(/[^a-z]/g,'')} ${iconOnly?'he-social-icon-only':''} ${fullWidth?'he-social-full-width':''}`,\n    style={'--he-social-brand':fill,'--he-social-brand-end':end,'--he-social-ink':ink,'--he-social-width':size==='sm'?'250px':size==='lg'?'320px':'300px'} as CSSProperties,\n    accessibleName=iconOnly?(typeof text==='string'?text:`Continue with ${providerName}`):undefined;\n  if(href)return <a className={`hu-button hu-secondary hu-${size} ${className}`} style={style} href={disabled||loading?undefined:href} target={target} rel={target==='_blank'?'noopener noreferrer':undefined} aria-label={accessibleName} aria-disabled={disabled||loading||undefined} tabIndex={disabled||loading?-1:0} onClick={event=>{if(disabled||loading)event.preventDefault();else onPress?.()}}>{mark}{!iconOnly&&text}</a>;\n  return <Button variant=\"secondary\" className={className} style={style} disabled={disabled} loading={loading} size={size} onClick={onPress} leadingIcon={mark} iconOnly={iconOnly} aria-label={accessibleName}>{text}</Button>;\n}\n\nexport type TextareaProps = TextareaHTMLAttributes<HTMLTextAreaElement> & {\n  label: string;\n  hint?: string;\n  error?: string;\n  size?: BaseSize;\n  autoResize?: boolean;\n  showCount?: boolean;\n  maxRows?: number;\n  resize?: CSSProperties['resize'];\n};\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n  {\n    label,\n    hint,\n    error,\n    size = 'md',\n    autoResize = false,\n    showCount = true,\n    id,\n    value,\n    defaultValue,\n    onChange,\n    maxLength,\n    rows = 4,\n    maxRows = 12,\n    resize: resizeMode,\n    className = '',\n    ...props\n  },\n  forwarded,\n) {\n  const ref = useRef<HTMLTextAreaElement | null>(null),\n    uid = useId(),\n    field = id || uid,\n    [count, setCount] = useState(String(value ?? defaultValue ?? '').length);\n  const resize = () => {\n    if(!autoResize&&ref.current){ref.current.style.height='';ref.current.style.minHeight='0px';ref.current.style.overflowY='';}\n    if (autoResize && ref.current) {\n      const style=getComputedStyle(ref.current),line=parseFloat(style.lineHeight)||22,\n        inset=parseFloat(style.paddingTop)+parseFloat(style.paddingBottom)+parseFloat(style.borderTopWidth)+parseFloat(style.borderBottomWidth),\n        ceiling=Math.max(rows,maxRows)*line+inset;\n      ref.current.style.minHeight=rows*line+inset+'px';\n      ref.current.style.height='0px';\n      ref.current.style.height=Math.max(rows*line+inset,Math.min(ceiling,ref.current.scrollHeight+parseFloat(style.borderTopWidth)+parseFloat(style.borderBottomWidth)))+'px';\n      ref.current.style.overflowY=ref.current.scrollHeight>ceiling?'auto':'hidden';\n    }\n  };\n  useEffect(() => {\n    setCount(String(value ?? ref.current?.value ?? '').length);\n    resize();\n  }, [value, autoResize, rows, maxRows]);\n  return (\n    <div className={`he-textarea he-${size} ${error ? 'he-invalid' : ''} ${className}`}>\n      <label htmlFor={field}>\n        {label}\n        {props.required && <span aria-hidden=\"true\"> *</span>}\n      </label>\n      <textarea\n        {...props}\n        ref={(node) => {\n          ref.current = node;\n          if (typeof forwarded === 'function') forwarded(node);\n          else if (forwarded) forwarded.current = node;\n        }}\n        id={field}\n        rows={rows}\n        value={value}\n        defaultValue={defaultValue}\n        maxLength={maxLength}\n        aria-describedby={\n          [\n            props['aria-describedby'],\n            hint || error ? field + '-hint' : undefined,\n            showCount ? field + '-count' : undefined,\n          ]\n            .filter(Boolean)\n            .join(' ') || undefined\n        }\n        aria-invalid={error ? true : props['aria-invalid']}\n        onChange={(event) => {\n          setCount(event.target.value.length);\n          onChange?.(event);\n          resize();\n        }}\n        style={{ ...props.style, minHeight: props.style?.minHeight ?? 0, maxHeight: autoResize ? 'none' : props.style?.maxHeight, resize: autoResize ? 'none' : resizeMode ?? props.style?.resize }}\n      />\n      <div className=\"he-textarea-bottom\">\n        {(hint || error) && (\n          <span id={field + '-hint'} className=\"he-hint\" role={error ? 'alert' : undefined}>\n            {error || hint}\n          </span>\n        )}\n        {showCount && (\n          <span id={field + '-count'} className=\"he-hint\" dir=\"ltr\">\n            {count}{maxLength !== undefined ? ` / ${maxLength}` : ''}\n          </span>\n        )}\n      </div>\n    </div>\n  );\n});\nexport type IconButtonProps = Omit<ButtonProps, 'children' | 'iconOnly' | 'leadingIcon'> & {\n  label: string;\n  icon: ReactNode;\n};\nexport function IconButton({ label, icon, variant = 'secondary', ...props }: IconButtonProps) {\n  return (\n    <Button {...props} variant={variant} iconOnly aria-label={label} leadingIcon={icon}>\n      {label}\n    </Button>\n  );\n}\nexport type CloseButtonProps = Omit<ButtonProps, 'children' | 'leadingIcon' | 'iconOnly'> & {\n  label?: string;\n};\nexport function CloseButton({\n  label = 'Close',\n  variant = 'tertiary',\n  size = 'sm',\n  ...props\n}: CloseButtonProps) {\n  return <IconButton {...props} label={label} variant={variant} size={size} icon=\"×\" />;\n}\nexport type LinkButtonProps = AnchorHTMLAttributes<HTMLAnchorElement> & {\n  disabled?: boolean;\n  size?: BaseSize;\n  leadingIcon?: ReactNode;\n  trailingIcon?: ReactNode;\n};\nexport function LinkButton({\n  children,\n  disabled = false,\n  size = 'md',\n  leadingIcon,\n  trailingIcon,\n  href,\n  onClick,\n  className = '',\n  ...props\n}: LinkButtonProps) {\n  return (\n    <a\n      {...props}\n      className={`he-link-button he-${size} ${className}`}\n      href={disabled ? undefined : href}\n      aria-disabled={disabled || undefined}\n      tabIndex={disabled ? -1 : props.tabIndex}\n      onClick={(event) => {\n        if (disabled) {\n          event.preventDefault();\n          return;\n        }\n        onClick?.(event);\n      }}\n    >\n      {leadingIcon && <span aria-hidden=\"true\">{renderIcon(leadingIcon)}</span>}\n      {children}\n      {trailingIcon && <span aria-hidden=\"true\">{renderIcon(trailingIcon)}</span>}\n    </a>\n  );\n}\nexport type ThemeToggleProps = {\n  disabled?: boolean;\n  compact?: boolean;\n  label?: string;\n  onValueChange?: (dark: boolean) => void;\n  storageKey?: string;\n};\nexport function ThemeToggle({\n  disabled = false,\n  compact = false,\n  label = 'Dark mode',\n  onValueChange,\n  storageKey = 'helios-ui-theme',\n}: ThemeToggleProps) {\n  const [dark, setDark] = useState(false);\n  useEffect(() => {\n    const sync = () => setDark(document.body.classList.contains('dark'));\n    sync();\n    const observer = new MutationObserver(sync);\n    observer.observe(document.body, { attributes: true, attributeFilter: ['class'] });\n    return () => observer.disconnect();\n  }, []);\n  const change = (next: boolean) => {\n    void changeTheme(next, { storageKey, onChange: value => {\n      setDark(value);\n      onValueChange?.(value);\n    }});\n  };\n  if (compact)\n    return (\n      <IconButton\n        label={dark ? 'Use light mode' : 'Use dark mode'}\n        icon={dark ? '☾' : '☀'}\n        aria-pressed={dark}\n        disabled={disabled}\n        onClick={() => change(!dark)}\n      />\n    );\n  return (\n    <Toggle\n      label={label}\n      description=\"Changes the actual Helios UI theme.\"\n      selected={dark}\n      disabled={disabled}\n      onSelectedChange={change}\n    />\n  );\n}\n\nexport type RichSelectOption = {\n  value: string;\n  label: string;\n  description?: string;\n  avatar?: string;\n  icon?: ReactNode;\n  disabled?: boolean;\n};\nexport type RichSelectProps = {\n  label: string;\n  options: RichSelectOption[];\n  value?: string;\n  defaultValue?: string;\n  onValueChange?: (value: string) => void;\n  placeholder?: string;\n  size?: BaseSize;\n  disabled?: boolean;\n  loading?: boolean;\n  error?: string;\n  hint?: string;\n  leadingIcon?: ReactNode;\n  name?: string;\n  required?: boolean;\n};\n/** React Aria owns collection navigation, typeahead, form participation and dismiss behavior. */\nexport function RichSelect({\n  label,\n  options,\n  value,\n  defaultValue = '',\n  onValueChange,\n  placeholder = 'Choose an option',\n  size = 'md',\n  disabled = false,\n  loading = false,\n  error,\n  hint,\n  leadingIcon,\n  name,\n  required = false,\n}: RichSelectProps) {\n  const {locale,direction}=useDirection();\n  const [local, setLocal] = useState(defaultValue),\n    [portalStyle, setPortalStyle] = useState<CSSProperties>({}),\n    root = useRef<HTMLDivElement>(null),\n    uid = useId(),\n    current = value ?? local,\n    selected = options.find((option) => option.value === current);\n  const appearance = () => {\n    const node = root.current;\n    if (!node) return;\n    const style = getComputedStyle(node);\n    // Resolve both compatibility aliases and audited semantic roles at the trigger.\n    // Portals otherwise inherit the document theme rather than a nested light/dark panel.\n    const names = Array.from(style).filter(\n      (key) => key.startsWith('--color-') || key.startsWith('--hu-') || key.startsWith('--accent-'),\n    );\n    setPortalStyle(\n      Object.fromEntries(names.map((key) => [key, style.getPropertyValue(key)])) as CSSProperties,\n    );\n  };\n  const leading = (option: RichSelectOption) =>\n    option.avatar ? (\n      <span className=\"he-rich-avatar\" aria-hidden=\"true\">\n        <Avatar name={option.label} src={option.avatar} size=\"sm\" />\n      </span>\n    ) : option.icon ? (\n      <span className=\"he-rich-icon\" aria-hidden=\"true\">\n        {renderIcon(option.icon)}\n      </span>\n    ) : null;\n  return (\n    <AriaSelect<RichSelectOption>\n      ref={root}\n      className={`he-rich-select he-${size}`}\n      selectedKey={selected?.value || null}\n      disabledKeys={options.filter((option) => option.disabled).map((option) => option.value)}\n      onSelectionChange={(key) => {\n        if (key === null) return;\n        const next = String(key);\n        setLocal(next);\n        onValueChange?.(next);\n      }}\n      name={name}\n      isRequired={required}\n      isDisabled={disabled || loading}\n      isInvalid={Boolean(error)}\n      validationBehavior=\"aria\"\n      placeholder={placeholder}\n      aria-busy={loading || undefined}\n      onOpenChange={(open) => {\n        if (open) appearance();\n      }}\n    >\n      <Label className=\"he-rich-label\">\n        {label}\n        {required && <span aria-hidden=\"true\"> *</span>}\n      </Label>\n      <AriaButton\n        className=\"he-rich-trigger\"\n        render={(buttonProps) => (\n          <button\n            {...buttonProps}\n            aria-invalid={Boolean(error) || undefined}\n            aria-busy={loading || undefined}\n          />\n        )}\n        aria-invalid={Boolean(error) || undefined}\n        aria-describedby={error || hint ? uid + '-message' : undefined}\n      >\n        {leadingIcon && (\n          <span className=\"he-rich-icon\" aria-hidden=\"true\">\n            {renderIcon(leadingIcon)}\n          </span>\n        )}\n        <SelectValue<RichSelectOption> className=\"he-rich-value\">\n          {({ isPlaceholder, selectedItems }) => {\n            const option = selectedItems[0] || selected;\n            return loading ? (\n              <span className=\"he-rich-placeholder\">Loading options…</span>\n            ) : isPlaceholder || !option ? (\n              <span className=\"he-rich-placeholder\">{placeholder}</span>\n            ) : (\n              <span className=\"he-rich-selection\">\n                {leading(option)}\n                <span className=\"he-rich-selection-copy\">\n                  <span>{option.label}</span>\n                  {option.description && (\n                    <span className=\"he-rich-selection-description\">{option.description}</span>\n                  )}\n                </span>\n              </span>\n            );\n          }}\n        </SelectValue>\n        <span className=\"he-rich-chevron\" aria-hidden=\"true\"><UIIcon name=\"chevron-down\" /></span>\n      </AriaButton>\n      {(error || hint) && (\n        <AriaText\n          id={uid + '-message'}\n          slot=\"description\"\n          className={`he-hint ${error ? 'he-error' : ''}`}\n          role={error ? 'alert' : undefined}\n        >\n          {error || hint}\n        </AriaText>\n      )}\n      <Popover dir={direction} lang={locale}\n        className=\"he-rich-popover\"\n        placement=\"bottom start\"\n        offset={6}\n        isNonModal\n        style={portalStyle}\n      >\n        <ListBox<RichSelectOption>\n          className=\"he-rich-listbox\"\n          items={options}\n          aria-label={`${label} options`}\n          disabledKeys={options.filter((option) => option.disabled).map((option) => option.value)}\n          renderEmptyState={() => <p className=\"he-hint he-rich-empty\">No options available.</p>}\n        >\n          {(option) => (\n            <ListBoxItem id={option.value} textValue={option.label} className=\"he-rich-option\">\n              {({ isSelected }) => (\n                <>\n                  {leading(option)}\n                  <span className=\"he-rich-option-copy\">\n                    <AriaText slot=\"label\">{option.label}</AriaText>\n                    {option.description && (\n                      <AriaText slot=\"description\">{option.description}</AriaText>\n                    )}\n                  </span>\n                  <span className=\"he-rich-check\" aria-hidden=\"true\">\n                    {isSelected ? '✓' : ''}\n                  </span>\n                </>\n              )}\n            </ListBoxItem>\n          )}\n        </ListBox>\n      </Popover>\n    </AriaSelect>\n  );\n}\nexport const richSelectMetadata = {\n  exportName: 'RichSelect',\n  props: {\n    label: 'string',\n    options: 'RichSelectOption[]; label, value, description, avatar, icon, disabled',\n    value: 'string',\n    defaultValue: 'string',\n    onValueChange: '(value:string)=>void',\n    placeholder: 'string',\n    size: 'sm | md | lg; 36/40/44px',\n    disabled: 'boolean',\n    loading: 'boolean',\n    error: 'string',\n    hint: 'string',\n    leadingIcon: 'ReactNode',\n    name: 'string; native hidden form control',\n    required: 'boolean',\n  },\n  example:\n    '<RichSelect label=\"Team member\" options={[{value:\"aarav\",label:\"Aarav Shah\",description:\"Designer\"},{value:\"diya\",label:\"Diya Rao\",description:\"Developer\"}]} />',\n} as const;\n\nexport type GridRow = { id: string; [key: string]: string | number };\nexport type GridColumn = {\n  key: string;\n  label: string;\n  width?: number;\n  type?: 'text' | 'number' | 'select';\n  options?: string[];\n  required?: boolean;\n  min?: number;\n  max?: number;\n  editable?: boolean;\n  validate?: (value:string|number,row:GridRow)=>string|undefined;\n  format?: (value:string|number,row:GridRow)=>ReactNode;\n  summary?: 'sum'|'average'|'count';\n  formatSummary?: (value:number)=>ReactNode;\n};\nexport type DataGridProps = {\n  label: string;\n  rows: GridRow[];\n  columns: GridColumn[];\n  onRowsChange?: (rows: GridRow[]) => void;\n  disabled?: boolean;\n  readOnly?: boolean;\n  dir?: 'ltr' | 'rtl';\n  virtualize?: boolean;\n  viewportHeight?: number;\n  rowHeight?: number;\n};\nconst csvCell = (value: string | number) =>\n  '\"' +\n  String(value)\n    .replace(/^[=+@\\-\\t\\r]/, \"'$&\")\n    .replaceAll('\"', '\"\"') +\n  '\"';\nexport function DataGrid({\n  label,\n  rows,\n  columns,\n  onRowsChange,\n  disabled = false,\n  virtualize = true,\n  readOnly = false,\n  dir,\n  viewportHeight = 360,\n  rowHeight = 46,\n}: DataGridProps) {\n  const [data, setData] = useState(rows),\n    [query, setQuery] = useState(''),\n    [sort, setSort] = useState<{ key: string; direction: 'ascending' | 'descending' } | null>(null),\n    [filter, setFilter] = useState(''),\n    [hidden, setHidden] = useState<string[]>([]),\n    [columnWidths,setColumnWidths]=useState<Record<string,number>>({}),\n    [dense, setDense] = useState(false),\n    [panel, setPanel] = useState<'filter' | 'columns' | null>(null),\n    [history, setHistory] = useState<GridRow[][]>([]),\n    [future, setFuture] = useState<GridRow[][]>([]),\n    [anchor, setAnchor] = useState<{ row: number; column: number } | null>(null),\n    [selected, setSelected] = useState<Set<string>>(new Set()),\n    [active, setActive] = useState({ row: 0, column: 0 }),\n    [editing, setEditing] = useState<{ id: string; key: string; value: string } | null>(null),\n    [error, setError] = useState(''),\n    [message, setMessage] = useState(''),\n    [scrollTop, setScrollTop] = useState(0),\n    [gridViewportWidth,setGridViewportWidth]=useState(0),\n    root = useRef<HTMLDivElement>(null),\n    lastEmitted = useRef(rows),\n    originalRows = useRef(rows),\n    resizing = useRef<{key:string;x:number;width:number;rtl:boolean}|null>(null),\n    dragSelection = useRef<{row:number;column:number;dragging:boolean;moved:boolean}|null>(null),\n    id = useId();\n  useEffect(() => {\n    if (rows !== lastEmitted.current) {\n      setData(rows);\n      originalRows.current=rows;\n      setHistory([]);\n      setFuture([]);\n      lastEmitted.current = rows;\n    }\n  }, [rows]);\n  useEffect(()=>{const stop=()=>{if(dragSelection.current)dragSelection.current.dragging=false;resizing.current=null};window.addEventListener('pointerup',stop);return()=>window.removeEventListener('pointerup',stop)},[]);\n  const visibleColumns = columns.filter((column) => !hidden.includes(column.key));\n  const columnWidth=(column:GridColumn)=>columnWidths[column.key]??column.width??(column.key===columns[0]?.key?220:160);\n  const setWidth=(key:string,width:number)=>setColumnWidths(previous=>({...previous,[key]:Math.max(80,Math.min(600,width))}));\n  const filterColumn = columns.find((column) => column.type === 'select');\n  const filtered = useMemo(\n    () =>\n      data\n        .filter(\n          (row) =>\n            (!filter || !filterColumn || row[filterColumn.key] === filter) &&\n            columns.some((column) =>\n              String(row[column.key]).toLowerCase().includes(query.toLowerCase()),\n            ),\n        )\n        .sort((left, right) => {\n          if (!sort) return 0;\n          const x = left[sort.key],\n            y = right[sort.key];\n          const order =\n            typeof x === 'number' && typeof y === 'number'\n              ? x - y\n              : String(x).localeCompare(String(y), undefined, { numeric: true });\n          return sort.direction === 'ascending' ? order : -order;\n        }),\n    [data, columns, query, filter, filterColumn, sort],\n  );\n  const hasFilteredRows=filtered.length>0;\n  useEffect(()=>{const viewport=root.current;if(!viewport)return;const measure=()=>setGridViewportWidth(viewport.clientWidth);measure();const observer=new ResizeObserver(measure);observer.observe(viewport);return()=>observer.disconnect()},[hasFilteredRows]);\n  const firstDataWidth=visibleColumns[0]?columnWidth(visibleColumns[0]):0,\n    widestScrollableColumn=Math.max(0,...visibleColumns.slice(1).map(columnWidth)),\n    freezeFirstDataColumn=gridViewportWidth>=46+firstDataWidth+widestScrollableColumn;\n  const selectedRows = useMemo(() => data.filter((row) => selected.has(row.id)), [data, selected]);\n  const cellHeight = Math.max(dense ? 34 : 46, dense ? 34 : rowHeight),\n    height = Math.max(180, viewportHeight),\n    windowed = virtualize && filtered.length > 100,\n    count = Math.ceil(height / cellHeight) + 10;\n  const start = windowed\n      ? Math.min(\n          Math.max(0, filtered.length - count),\n          Math.max(0, Math.floor(scrollTop / cellHeight) - 5),\n        )\n      : 0,\n    end = windowed ? Math.min(filtered.length, start + count) : filtered.length,\n    visibleRows = filtered.slice(start, end);\n  const resetQuery = (next: string) => {\n    setQuery(next);\n    setAnchor(null);\n    setScrollTop(0);\n    setActive({ row: 0, column: 0 });\n    if (root.current) root.current.scrollTop = 0;\n  };\n  const change = (next: GridRow[]) => {\n    setHistory((previous) => [...previous.slice(-99), data]);\n    setFuture([]);\n    setData(next);\n    lastEmitted.current = next;\n    onRowsChange?.(next);\n  };\n  const restore = (direction: 'undo' | 'redo') => {\n    const stack = direction === 'undo' ? history : future;\n    if (!stack.length || disabled || readOnly) return;\n    const next = stack[stack.length - 1];\n    if (direction === 'undo') {\n      setHistory(stack.slice(0, -1));\n      setFuture((previous) => [...previous, data]);\n    } else {\n      setFuture(stack.slice(0, -1));\n      setHistory((previous) => [...previous, data]);\n    }\n    setData(next);\n    lastEmitted.current = next;\n    onRowsChange?.(next);\n    setEditing(null);\n    setError('');\n    setMessage(direction === 'undo' ? 'Change undone.' : 'Change redone.');\n  };\n  const range = {\n    top: Math.min(active.row, anchor?.row ?? active.row),\n    bottom: Math.max(active.row, anchor?.row ?? active.row),\n    left: Math.min(active.column, anchor?.column ?? active.column),\n    right: Math.max(active.column, anchor?.column ?? active.column),\n  };\n  const rangeRows = filtered.slice(range.top, range.bottom + 1),\n    rangeColumns = visibleColumns.slice(range.left, range.right + 1);\n  const numbers = rangeRows\n    .flatMap((row) => rangeColumns.map((column) => row[column.key]))\n    .filter((value): value is number => typeof value === 'number');\n  const commit = () => {\n    if (disabled || readOnly || !editing) return false;\n    const column = columns.find((item) => item.key === editing.key)!;\n    if(column.editable===false)return false;\n    const text = editing.value.trim();\n    let next: string | number = text;\n    if (column.required && !text) {\n      setError(`${column.label} is required.`);\n      return false;\n    }\n    if (column.type === 'number') {\n      next = Number(text);\n      if (\n        !text ||\n        !Number.isFinite(next) ||\n        (column.min !== undefined && next < column.min) ||\n        (column.max !== undefined && next > column.max)\n      ) {\n        setError(\n          `${column.label} must be a number${column.min !== undefined ? ' of at least ' + column.min : ''}${column.max !== undefined ? ' and at most ' + column.max : ''}.`,\n        );\n        return false;\n      }\n    }\n    const record=data.find(row=>row.id===editing.id)!;\n    const rejected=column.validate?.(next,{...record,[editing.key]:next});\n    if(rejected){setError(rejected);return false;}\n    change(data.map((row) => (row.id === editing.id ? { ...row, [editing.key]: next } : row)));\n    setEditing(null);\n    setError('');\n    setMessage(`${column.label} updated locally.`);\n    return true;\n  };\n  const begin = (row: GridRow, column: GridColumn) => {\n    if (disabled || readOnly || column.editable===false) return false;\n    setEditing({ id: row.id, key: column.key, value: String(row[column.key]) });\n    setError('');\n  };\n  const focusCell = (row: number, column: number) => {\n    const next = {\n      row: Math.max(0, Math.min(filtered.length - 1, row)),\n      column: Math.max(0, Math.min(visibleColumns.length - 1, column)),\n    };\n    setActive(next);\n    if (windowed && root.current) {\n      const first = Math.floor(root.current.scrollTop / cellHeight),\n        last = first + Math.max(1, Math.floor((height - 40) / cellHeight));\n      if (next.row < first || next.row >= last) {\n        const top = Math.max(0, next.row * cellHeight - 40);\n        root.current.scrollTop = top;\n        setScrollTop(top);\n      }\n    }\n    requestAnimationFrame(() =>\n      root.current\n        ?.querySelector<HTMLButtonElement>(`[data-grid-cell=\"${next.row}-${next.column}\"]`)\n        ?.focus(),\n    );\n  };\n  const exportData = () => {\n    const values = selectedRows.length ? selectedRows : filtered;\n    const csv = [\n      visibleColumns.map((column) => csvCell(column.label)).join(','),\n      ...values.map((row) => visibleColumns.map((column) => csvCell(row[column.key])).join(',')),\n    ].join('\\r\\n');\n    const url = URL.createObjectURL(new Blob([csv], { type: 'text/csv;charset=utf-8' }));\n    const a = document.createElement('a');\n    a.href = url;\n    a.download = 'helios-renewals.csv';\n    a.click();\n    setTimeout(() => URL.revokeObjectURL(url), 1000);\n    setMessage(`${values.length} rows exported.`);\n  };\n  return (\n    <section\n      className=\"he-grid\"\n      aria-label={label}\n      dir={dir}\n      data-readonly={readOnly || undefined}\n      data-density={dense ? 'compact' : 'comfortable'}\n    >\n      <div className=\"he-grid-title\">\n        <strong>{label}</strong>\n        <span>{new Intl.NumberFormat('en-IN').format(data.length)} rows</span>\n      </div>\n      <div className=\"he-grid-toolbar\">\n        <IconButton\n          label=\"Undo grid change\"\n          size=\"xs\"\n          icon=\"↶\"\n          disabled={disabled || readOnly || !history.length}\n          onClick={() => restore('undo')}\n        />\n        <IconButton\n          label=\"Redo grid change\"\n          size=\"xs\"\n          icon=\"↷\"\n          disabled={disabled || readOnly || !future.length}\n          onClick={() => restore('redo')}\n        />\n        <Button\n          variant=\"secondary\"\n          size=\"xs\" iconOnly aria-label=\"Filter\" title=\"Filter\" leadingIcon={<UIIcon name=\"filter\"/>}\n          disabled={disabled || !filterColumn}\n          aria-expanded={panel === 'filter'}\n          onClick={() => setPanel(panel === 'filter' ? null : 'filter')}\n        >\n          Filter{filter ? ' · 1' : ''}\n        </Button>\n        <Button\n          variant=\"secondary\"\n          size=\"xs\" iconOnly aria-label=\"Columns\" title=\"Columns\" leadingIcon={<UIIcon name=\"table\"/>}\n          disabled={disabled}\n          aria-expanded={panel === 'columns'}\n          onClick={() => setPanel(panel === 'columns' ? null : 'columns')}\n        >\n          Columns\n        </Button>\n        <Button\n          variant=\"secondary\"\n          size=\"xs\" iconOnly aria-label=\"Density\" title=\"Density\" leadingIcon={<UIIcon name=\"list\"/>}\n          disabled={disabled}\n          aria-pressed={dense}\n          onClick={() => {\n            setDense(!dense);\n            setScrollTop(0);\n            if (root.current) root.current.scrollTop = 0;\n          }}\n        >\n          Density\n        </Button>\n        <Input\n          label={`Search ${label}`}\n          className=\"he-grid-search\" size=\"sm\"\n          type=\"search\"\n          value={query}\n          disabled={disabled}\n          onChange={(event) => {\n            resetQuery(event.target.value);\n          }}\n        />\n        <Button\n          variant=\"secondary\" size=\"xs\" iconOnly aria-label={selectedRows.length?'Export selected':'Export CSV'} title={selectedRows.length?'Export selected':'Export CSV'} leadingIcon={<UIIcon name=\"download\"/>}\n          disabled={disabled || (!filtered.length && !selectedRows.length)}\n          onClick={exportData}\n        >\n          Export {selectedRows.length ? 'selected' : 'CSV'}\n        </Button>\n        {selectedRows.length>0&&!readOnly&&<IconButton label=\"Delete selected rows\" icon={<UIIcon name=\"trash\"/>} size=\"xs\" variant=\"danger\" disabled={disabled} onClick={()=>{change(data.filter(row=>!selected.has(row.id)));setEditing(null);setError('');setMessage(`${selectedRows.length} example rows deleted locally. Undo restores them.`)}}/>}\n        <Button\n          variant=\"tertiary\" size=\"xs\" iconOnly aria-label=\"Reset grid\" title=\"Reset grid\" leadingIcon={<UIIcon name=\"undo\"/>}\n          disabled={disabled || !(data!==originalRows.current || query || filter || sort || hidden.length || selected.size || editing || error)}\n          onClick={() => {\n            change(originalRows.current);\n            resetQuery('');\n            setFilter('');\n            setSort(null);\n            setHidden([]);\n            setAnchor(null);\n            setSelected(new Set());\n            setEditing(null);\n            setError('');\n            setMessage('Original example values restored.');\n          }}\n        >\n          Reset grid\n        </Button>\n      </div>\n      {panel === 'filter' && filterColumn && (\n        <div className=\"he-grid-options\">\n          <Select\n            label={`Filter by ${filterColumn.label}`}\n            value={filter}\n            disabled={disabled}\n            options={[\n              { value: '', label: 'All ' + filterColumn.label.toLowerCase() + ' values' },\n              ...(filterColumn.options || []).map((value) => ({ value, label: value })),\n            ]}\n            onChange={(event) => {\n              setFilter(event.target.value);\n              resetQuery(query);\n            }}\n          />\n          <Button\n            variant=\"tertiary\"\n            onClick={() => {\n              setFilter('');\n              resetQuery(query);\n            }}\n            disabled={disabled || !filter}\n          >\n            Clear filter\n          </Button>\n        </div>\n      )}\n      {panel === 'columns' && (\n        <fieldset className=\"he-grid-options\">\n          <legend>Visible columns</legend>\n          {columns.map((column) => (\n            <Checkbox\n              key={column.key}\n              label={column.label}\n              checked={!hidden.includes(column.key)}\n              disabled={disabled || (!hidden.includes(column.key) && visibleColumns.length === 1)}\n              onChange={(event) => {\n                setHidden((previous) =>\n                  event.target.checked\n                    ? previous.filter((key) => key !== column.key)\n                    : [...previous, column.key],\n                );\n                setActive({ row: 0, column: 0 });\n                setAnchor(null);\n              }}\n            />\n          ))}\n        </fieldset>\n      )}\n      <p className=\"he-hint\" id={id + '-help'}>\n        {readOnly\n          ? 'Read-only cells. Arrow keys navigate; search, selection and export remain available.'\n          : 'Arrow keys move between cells. Enter or F2 edits a cell; Enter saves and Escape cancels. Shift + arrows select a range; copy and paste use tab-separated cells.'}\n        {' Selection stays pinned; the first data column pins when space allows.'}\n      </p>\n      {filtered.length ? (\n        <div\n          ref={root}\n          className=\"he-grid-scroll\"\n          data-freeze-first-column={freezeFirstDataColumn?'true':'false'}\n          role=\"region\"\n          aria-label={`${label}; horizontally scrollable`}\n          tabIndex={0}\n          data-virtualized={windowed || undefined}\n          style={\n            {\n              height: windowed ? height : undefined,\n              maxHeight: height,\n              '--he-row-height': cellHeight + 'px',\n            } as CSSProperties\n          }\n          onScroll={(event) => setScrollTop(event.currentTarget.scrollTop)}\n        >\n          <table\n            role=\"grid\"\n            style={{tableLayout:'fixed',minWidth:0,width:visibleColumns.reduce((sum,column)=>sum+columnWidth(column),46)}}\n            aria-readonly={readOnly || undefined}\n            aria-label={label}\n            aria-describedby={id + '-help'}\n            aria-rowcount={filtered.length + 1 + (visibleColumns.some(column=>column.summary)?1:0)}\n            aria-colcount={visibleColumns.length + 1}\n          >\n            <thead>\n              <tr>\n                <th scope=\"col\">\n                  <Checkbox\n                    label=\"Select all filtered rows\"\n                    className=\"hu-check-only\"\n                    disabled={disabled}\n                    checked={filtered.length > 0 && filtered.every((row) => selected.has(row.id))}\n                    indeterminate={\n                      filtered.some((row) => selected.has(row.id)) &&\n                      !filtered.every((row) => selected.has(row.id))\n                    }\n                    onChange={(event) =>\n                      setSelected((previous) => {\n                        const next = new Set(previous);\n                        filtered.forEach((row) =>\n                          event.target.checked ? next.add(row.id) : next.delete(row.id),\n                        );\n                        return next;\n                      })\n                    }\n                  />\n                </th>\n                {visibleColumns.map((column) => (\n                  <th\n                    key={column.key}\n                    style={{width:columnWidth(column),minWidth:columnWidth(column)}}\n                    scope=\"col\"\n                    aria-sort={sort?.key === column.key ? sort.direction : 'none'}\n                  >\n                    <button\n                      type=\"button\"\n                      disabled={disabled}\n                      onClick={() => {\n                        setSort({\n                          key: column.key,\n                          direction:\n                            sort?.key === column.key && sort.direction === 'ascending'\n                              ? 'descending'\n                              : 'ascending',\n                        });\n                        setActive({ row: 0, column: 0 });\n                        setAnchor(null);\n                      }}\n                    >\n                      {column.label}\n                      <span aria-hidden=\"true\">\n                        <UIIcon name={sort?.key === column.key ? sort.direction === 'ascending' ? 'arrow-up' : 'arrow-down' : 'sort'} />\n                      </span>\n                    </button>\n                    <button type=\"button\" role=\"separator\" aria-orientation=\"vertical\" aria-label={'Resize '+column.label} aria-valuenow={columnWidth(column)} aria-valuemin={80} aria-valuemax={600} disabled={disabled} className=\"he-grid-column-resizer\"\n                      onDoubleClick={()=>setWidth(column.key,column.width??(column.key===columns[0]?.key?220:160))}\n                      onPointerDown={event=>{if(disabled)return;event.preventDefault();event.stopPropagation();resizing.current={key:column.key,x:event.clientX,width:columnWidth(column),rtl:getComputedStyle(root.current!).direction==='rtl'};event.currentTarget.setPointerCapture(event.pointerId)}}\n                      onPointerMove={event=>{const current=resizing.current;if(current?.key===column.key)setWidth(column.key,current.width+(event.clientX-current.x)*(current.rtl?-1:1))}}\n                      onPointerUp={event=>{resizing.current=null;if(event.currentTarget.hasPointerCapture(event.pointerId))event.currentTarget.releasePointerCapture(event.pointerId)}}\n                      onKeyDown={event=>{if(['ArrowLeft','ArrowRight','Home','End'].includes(event.key)){event.preventDefault();const rtl=getComputedStyle(root.current!).direction==='rtl';setWidth(column.key,event.key==='Home'?80:event.key==='End'?600:columnWidth(column)+(event.key==='ArrowRight'?(rtl?-16:16):(rtl?16:-16)))}}}/>\n                  </th>\n                ))}\n              </tr>\n            </thead>\n            <tbody>\n              {start > 0 && (\n                <tr aria-hidden=\"true\" role=\"presentation\">\n                  <td\n                    colSpan={visibleColumns.length + 1}\n                    style={{ height: start * cellHeight, padding: 0, border: 0 }}\n                  />\n                </tr>\n              )}\n              {visibleRows.map((row, localIndex) => {\n                const rowIndex = start + localIndex;\n                return (\n                  <tr\n                    key={row.id}\n                    aria-rowindex={rowIndex + 2}\n                    aria-selected={selected.has(row.id)}\n                    style={{ height: cellHeight }}\n                  >\n                    <td>\n                      <Checkbox\n                        className=\"hu-check-only\"\n                        label={`Select row ${rowIndex + 1}`}\n                        disabled={disabled}\n                        checked={selected.has(row.id)}\n                        onChange={() =>\n                          setSelected((previous) => {\n                            const next = new Set(previous);\n                            next.has(row.id) ? next.delete(row.id) : next.add(row.id);\n                            return next;\n                          })\n                        }\n                      />\n                    </td>\n                    {visibleColumns.map((column, columnIndex) => (\n                      <td\n                        aria-readonly={readOnly || column.editable===false || undefined}\n                        key={column.key}\n                        data-range-selected={\n                          (rowIndex >= range.top &&\n                            rowIndex <= range.bottom &&\n                            columnIndex >= range.left &&\n                            columnIndex <= range.right) ||\n                          undefined\n                        }\n                      >\n                        {editing?.id === row.id && editing.key === column.key ? (\n                          <div className=\"he-grid-edit\">\n                            {column.type === 'select' ? (\n                              <select\n                                aria-label={`Edit ${column.label} row ${rowIndex + 1}`}\n                                aria-invalid={Boolean(error)||undefined} aria-describedby={error?id+'-error':undefined}\n                                disabled={disabled || readOnly}\n                                autoFocus\n                                value={editing.value}\n                                onChange={(event) =>\n                                  setEditing({ ...editing, value: event.target.value })\n                                }\n                                onKeyDown={(event) => {\n                                  if (event.key === 'Enter' || event.key === 'Tab') {\n                                    event.preventDefault();\n                                    if(commit()){\n                                      const step=event.shiftKey?-1:1,nextColumn=columnIndex+step;\n                                      focusCell(event.key==='Enter'?rowIndex+step:nextColumn<0?rowIndex-1:nextColumn>=visibleColumns.length?rowIndex+1:rowIndex,event.key==='Enter'?columnIndex:nextColumn<0?visibleColumns.length-1:nextColumn>=visibleColumns.length?0:nextColumn);\n                                    }\n                                  }\n                                  if (event.key === 'Escape') {\n                                    event.preventDefault();setEditing(null);\n                                    setError('');focusCell(rowIndex,columnIndex);\n                                  }\n                                }}\n                              >\n                                {column.options?.map((option) => (\n                                  <option key={option}>{option}</option>\n                                ))}\n                              </select>\n                            ) : (\n                              <input\n                                aria-label={`Edit ${column.label} row ${rowIndex + 1}`}\n                                disabled={disabled}\n                                type={column.type === 'number' ? 'number' : 'text'}\n                                readOnly={readOnly}\n                                autoFocus\n                                value={editing.value}\n                                aria-invalid={Boolean(error) || undefined}\n                                aria-describedby={error ? id + '-error' : undefined}\n                                onChange={(event) => {\n                                  setEditing({ ...editing, value: event.target.value });\n                                  setError('');\n                                }}\n                                onKeyDown={(event) => {\n                                  if (event.key === 'Enter' || event.key === 'Tab') {\n                                    event.preventDefault();\n                                    if(commit()){\n                                      const step=event.shiftKey?-1:1,nextColumn=columnIndex+step;\n                                      focusCell(event.key==='Enter'?rowIndex+step:nextColumn<0?rowIndex-1:nextColumn>=visibleColumns.length?rowIndex+1:rowIndex,event.key==='Enter'?columnIndex:nextColumn<0?visibleColumns.length-1:nextColumn>=visibleColumns.length?0:nextColumn);\n                                    }\n                                  }\n                                  if (event.key === 'Escape') {\n                                    event.preventDefault();setEditing(null);\n                                    setError('');focusCell(rowIndex,columnIndex);\n                                  }\n                                }}\n                              />\n                            )}\n                            <div>\n                              <Button\n                                variant=\"tertiary\" iconOnly aria-label=\"Save cell\" title=\"Save cell\" leadingIcon={<UIIcon name=\"tick\"/>}\n                                size=\"xs\"\n                                disabled={disabled || readOnly}\n                                onClick={()=>{if(commit())focusCell(rowIndex,columnIndex)}}\n                              >\n                                Save cell\n                              </Button>\n                              <CloseButton\n                                label=\"Cancel cell edit\"\n                                size=\"xs\"\n                                disabled={disabled}\n                                onClick={() => {\n                                  setEditing(null);\n                                  setError('');focusCell(rowIndex,columnIndex);\n                                }}\n                              />\n                            </div>\n                          </div>\n                        ) : (\n                          <button\n                            type=\"button\"\n                            className=\"he-grid-cell\"\n                            data-grid-cell={`${rowIndex}-${columnIndex}`}\n                            disabled={disabled}\n                            tabIndex={\n                              (active.row >= start && active.row < end ? active.row : start) ===\n                                rowIndex && active.column === columnIndex\n                                ? 0\n                                : -1\n                            }\n                            aria-label={`${column.label} row ${rowIndex + 1}: ${row[column.key]}`}\n                            onMouseDown={(event) => {\n                              if (event.shiftKey) event.preventDefault();\n                            }}\n                            onFocus={() => setActive({ row: rowIndex, column: columnIndex })}\n                            onPointerDown={()=>{dragSelection.current={row:rowIndex,column:columnIndex,dragging:true,moved:false}}}\n                            onPointerEnter={()=>{const drag=dragSelection.current;if(drag?.dragging&&(drag.row!==rowIndex||drag.column!==columnIndex)){drag.moved=true;setAnchor({row:drag.row,column:drag.column});setActive({row:rowIndex,column:columnIndex})}}}\n                            onClick={(event) => {\n                              if(dragSelection.current?.moved){dragSelection.current=null;return;}\n                              if (event.shiftKey) {\n                                setAnchor(anchor || active);\n                                setActive({ row: rowIndex, column: columnIndex });\n                              } else {\n                                setAnchor(null);\n                                begin(row, column);\n                              }\n                            }}\n                            onCopy={(event) => {\n                              event.preventDefault();\n                              event.clipboardData.setData(\n                                'text/plain',\n                                rangeRows\n                                  .map((item) =>\n                                    rangeColumns.map((col) => String(item[col.key])).join('\\t'),\n                                  )\n                                  .join('\\n'),\n                              );\n                              setMessage(`${rangeRows.length * rangeColumns.length} cells copied.`);\n                            }}\n                            onPaste={(event) => {\n                              if (disabled || readOnly) return;\n                              event.preventDefault();\n                              const lines = event.clipboardData\n                                .getData('text/plain')\n                                .replace(/\\r/g, '')\n                                .replace(/\\n$/, '')\n                                .split('\\n')\n                                .map((line) => line.split('\\t'));\n                              const edits = new Map<string, GridRow>();\n                              let failure = '';\n                              lines.forEach((line, r) =>\n                                line.forEach((text, c) => {\n                                  const item = filtered[rowIndex + r],\n                                    col = visibleColumns[columnIndex + c];\n                                  if (!item || !col) return;\n                                  let next: string | number = text.trim();\n                                  if(col.editable===false){failure=col.label+' is read-only.';return;}\n                                  if (col.required && !next) failure = col.label + ' is required.';\n                                  if (col.type === 'number') {\n                                    next = Number(next);\n                                    if (\n                                      !text.trim() ||\n                                      !Number.isFinite(next) ||\n                                      (col.min !== undefined && next < col.min) ||\n                                      (col.max !== undefined && next > col.max)\n                                    )\n                                      failure =\n                                        col.label + ' is outside its allowed numeric range.';\n                                  }\n                                  if (col.type === 'select' && !col.options?.includes(String(next)))\n                                    failure = col.label + ' must match an available option.';\n                                  const invalid=col.validate?.(next,{...(edits.get(item.id)||item),[col.key]:next});if(invalid)failure=invalid;\n                                  edits.set(item.id, {\n                                    ...(edits.get(item.id) || item),\n                                    [col.key]: next,\n                                  });\n                                }),\n                              );\n                              if (failure) {\n                                setError(failure);\n                                return;\n                              }\n                              change(data.map((item) => edits.get(item.id) || item));\n                              setError('');\n                              setMessage(`${edits.size} rows pasted locally.`);\n                            }}\n                            onKeyDown={(event) => {\n                              if(['ArrowLeft','ArrowRight','ArrowUp','ArrowDown','Home','End','PageUp','PageDown'].includes(event.key)){\n                                event.preventDefault();if(event.shiftKey)setAnchor(anchor||active);else setAnchor(null);\n                                const whole=event.ctrlKey||event.metaKey,page=Math.max(1,Math.floor(height/cellHeight)),rtl=getComputedStyle(root.current!).direction==='rtl';\n                                focusCell(event.key==='Home'&&whole?0:event.key==='End'&&whole?filtered.length-1:rowIndex+(event.key==='ArrowDown'?1:event.key==='ArrowUp'?-1:event.key==='PageDown'?page:event.key==='PageUp'?-page:0),event.key==='Home'?0:event.key==='End'?visibleColumns.length-1:columnIndex+(event.key==='ArrowRight'?(rtl?-1:1):event.key==='ArrowLeft'?(rtl?1:-1):0));\n                              } else if (\n                                (event.ctrlKey || event.metaKey) &&\n                                event.key.toLowerCase() === 'z'\n                              ) {\n                                event.preventDefault();\n                                restore(event.shiftKey ? 'redo' : 'undo');\n                              } else if (event.key === 'F2' || event.key === 'Enter') {\n                                event.preventDefault();\n                                begin(row, column);\n                              }\n                            }}\n                          >\n                            <bdi dir={column.type==='number'?'ltr':'auto'}>{column.format?column.format(row[column.key],row):column.type === 'number'\n                              ? new Intl.NumberFormat('en-IN').format(Number(row[column.key]))\n                              : row[column.key]}</bdi>\n                          </button>\n                        )}\n                      </td>\n                    ))}\n                  </tr>\n                );\n              })}\n              {end < filtered.length && (\n                <tr aria-hidden=\"true\" role=\"presentation\">\n                  <td\n                    colSpan={visibleColumns.length + 1}\n                    style={{ height: (filtered.length - end) * cellHeight, padding: 0, border: 0 }}\n                  />\n                </tr>\n              )}\n            </tbody>\n            {visibleColumns.some(column=>column.summary)&&<tfoot><tr aria-rowindex={filtered.length+2}><td>Summary</td>{visibleColumns.map(column=>{const numbers=filtered.map(row=>Number(row[column.key])).filter(Number.isFinite),total=column.summary==='count'?filtered.length:column.summary==='average'?(numbers.length?numbers.reduce((sum,n)=>sum+n,0)/numbers.length:0):numbers.reduce((sum,n)=>sum+n,0);return <td key={column.key}>{column.summary?(column.formatSummary?.(total)??new Intl.NumberFormat('en-IN',{maximumFractionDigits:2}).format(total)):null}</td>})}</tr></tfoot>}\n          </table>\n        </div>\n      ) : (\n        <DataState\n          state=\"empty\"\n          onRetry={() => {if(!data.length)change(originalRows.current);setFilter('');resetQuery('')}}\n          emptyMessage=\"No rows match this search.\"\n        />\n      )}\n      {error && (\n        <p id={id + '-error'} role=\"alert\" className=\"he-error\">\n          {error}\n        </p>\n      )}\n      <div className=\"he-grid-footer\">\n        <span>\n          {selectedRows.length} selected · {filtered.length} results · Cell{' '}\n          {String.fromCharCode(65 + active.column)}\n          {active.row + 1} · Count {rangeRows.length * rangeColumns.length}\n          {numbers.length\n            ? ` · Sum ${new Intl.NumberFormat('en-IN').format(numbers.reduce((sum, value) => sum + value, 0))} · Average ${new Intl.NumberFormat('en-IN', { maximumFractionDigits: 2 }).format(numbers.reduce((sum, value) => sum + value, 0) / numbers.length)}`\n            : ''}\n          {windowed ? ` · Rendering rows ${start + 1}–${end}` : ''}\n        </span>\n        {selectedRows.length > 0 && (\n          <Button\n            variant=\"tertiary\"\n            size=\"sm\"\n            disabled={disabled}\n            onClick={() => setSelected(new Set())}\n          >\n            Clear selection\n          </Button>\n        )}\n      </div>\n      <p role=\"status\" className=\"he-hint\">\n        {message}\n      </p>\n    </section>\n  );\n}\nexport const renewalColumns: GridColumn[] = [\n  { key: 'account', label: 'Account', required: true },\n  { key: 'owner', label: 'Owner', required: true },\n  { key: 'region', label: 'Region', type: 'select', options: ['India', 'Europe', 'Americas'] },\n  { key: 'stage', label: 'Stage', type: 'select', options: ['Healthy', 'Review', 'At risk'] },\n  { key: 'seats', label: 'Seats', type: 'number', min: 1, max: 10000 },\n  { key: 'arr', label: 'ARR (INR)', type: 'number', min: 0 },\n];\nexport const renewalRows: GridRow[] = [\n  {\n    id: '1',\n    account: 'Aster Studio',\n    owner: 'Aarav Shah',\n    region: 'India',\n    stage: 'Healthy',\n    seats: 24,\n    arr: 240000,\n  },\n  {\n    id: '2',\n    account: 'Harbour Design',\n    owner: 'Diya Rao',\n    region: 'Europe',\n    stage: 'Review',\n    seats: 12,\n    arr: 120000,\n  },\n  {\n    id: '3',\n    account: 'Northstar Labs',\n    owner: 'Kavya Nair',\n    region: 'India',\n    stage: 'Healthy',\n    seats: 48,\n    arr: 480000,\n  },\n  {\n    id: '4',\n    account: 'Orbit Systems',\n    owner: 'Rohan Mehta',\n    region: 'Americas',\n    stage: 'At risk',\n    seats: 8,\n    arr: 80000,\n  },\n  {\n    id: '5',\n    account: 'Paperplane',\n    owner: 'Sana Ali',\n    region: 'India',\n    stage: 'Review',\n    seats: 16,\n    arr: 160000,\n  },\n];\n\nexport type SettingsValue = {\n  name: string;\n  email: string;\n  notifications: boolean;\n  mentions: boolean;\n  theme: 'light' | 'dark' | 'system';\n  language?: string;\n  timezone?: string;\n  tools?: string[];\n  files?: { id: string; name: string; bytes: number }[];\n};\nconst sampleStorageFiles = [\n  { id: 'guide', name: 'Helios component guide.pdf', bytes: 2400000 },\n  { id: 'tokens', name: 'Design tokens.json', bytes: 18000 },\n];\nconst defaultSettings: SettingsValue = {\n  name: 'Aarav Shah',\n  email: 'aarav@example.com',\n  notifications: true,\n  mentions: true,\n  theme: 'light',\n};\nexport type SettingsModalProps = {\n  open: boolean;\n  onOpenChange: (open: boolean) => void;\n  initialValue?: SettingsValue;\n  initialTab?: 'general' | 'profile' | 'tools' | 'storage' | 'notifications' | 'appearance';\n  onSave?: (value: SettingsValue) => void;\n  planArtSrc?: string;\n  disabled?: boolean;\n};\nexport function SettingsModal({\n  open,\n  onOpenChange,\n  initialValue = defaultSettings,\n  initialTab = 'general',\n  planArtSrc,\n  onSave,\n  disabled = false,\n}: SettingsModalProps) {\n  const [draft, setDraft] = useState(initialValue),\n    [tab, setTab] = useState(initialTab),\n    [errors, setErrors] = useState<Record<string, string>>({}),\n    [toolMessage, setToolMessage] = useState(''),\n    nameRef = useRef<HTMLInputElement>(null),\n    emailRef = useRef<HTMLInputElement>(null);\n  useEffect(() => {\n    if (open) {\n      setDraft(initialValue);\n      setTab(initialTab);\n      setErrors({});\n      setToolMessage('');\n    }\n  }, [open]);\n  const save = () => {\n    const next: Record<string, string> = {};\n    if (!draft.name.trim()) next.name = 'Enter your full name.';\n    if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(draft.email))\n      next.email = 'Enter a valid email address.';\n    setErrors(next);\n    if (Object.keys(next).length) {\n      setTab('profile');\n      requestAnimationFrame(() =>\n        next.name ? nameRef.current?.focus() : emailRef.current?.focus(),\n      );\n      return;\n    }\n    const dark =\n      draft.theme === 'dark' ||\n      (draft.theme === 'system' && matchMedia('(prefers-color-scheme: dark)').matches);\n    document.body.classList.toggle('dark', dark);\n    try {\n      localStorage.setItem('helios-ui-theme', dark ? 'dark' : 'light');\n    } catch {}\n    onSave?.(draft);\n    onOpenChange(false);\n  };\n  return (\n    <Dialog\n      open={open}\n      onOpenChange={onOpenChange}\n      title=\"Workspace settings\"\n      description=\"Changes apply to this local example.\"\n      footer={\n        <>\n          <Button variant=\"secondary\" onClick={() => onOpenChange(false)}>\n            Cancel\n          </Button>\n          <Button disabled={disabled} onClick={save}>\n            Save settings\n          </Button>\n        </>\n      }\n    >\n      <Tabs\n        label=\"Settings sections\"\n        value={tab}\n        onValueChange={(value) => setTab(value as typeof tab)}\n        items={[\n          {\n            id: 'general',\n            label: 'General',\n            content: (\n              <div className=\"he-settings-fields\">\n                <Select\n                  label=\"Language\"\n                  value={draft.language || 'en-IN'}\n                  disabled={disabled}\n                  options={[\n                    { value: 'en-IN', label: 'English (India)' },\n                    { value: 'hi-IN', label: 'हिन्दी (भारत)' },\n                  ]}\n                  onChange={(event) => setDraft({ ...draft, language: event.target.value })}\n                />\n                <Select\n                  label=\"Timezone\"\n                  value={draft.timezone || 'Asia/Kolkata'}\n                  disabled={disabled}\n                  options={[\n                    { value: 'Asia/Kolkata', label: 'India Standard Time (UTC +05:30)' },\n                    { value: 'UTC', label: 'Coordinated Universal Time' },\n                    { value: 'Europe/London', label: 'London' },\n                  ]}\n                  onChange={(event) => setDraft({ ...draft, timezone: event.target.value })}\n                />\n                <div className=\"he-settings-plan\">\n                  <span className=\"he-settings-plan-art\" aria-hidden=\"true\">{planArtSrc?<img src={planArtSrc} alt=\"\" onError={event=>{event.currentTarget.hidden=true}}/>:<><i/><i/><i/></>}</span>\n                  <div>\n                    <strong>Helios UI · Starter</strong>\n                    <p className=\"he-hint\">\n                      Your local component workspace. Preview plan prices are shown in INR; checkout\n                      is closed.\n                    </p>\n                  </div>\n                  <Badge tone=\"brand\">Free</Badge>\n                </div>\n                <p className=\"he-hint\">\n                  Language and timezone are saved as preferences in this local example.\n                </p>\n              </div>\n            ),\n          },\n          {\n            id: 'tools',\n            label: 'Tools',\n            content: (\n              <div className=\"he-settings-fields\">\n                {['Figma', 'GitHub', 'Slack'].map((tool) => (\n                  <div key={tool} className=\"he-settings-tool\">\n                    <div>\n                      <strong>{tool}</strong>\n                      <p className=\"he-hint\">\n                        {(draft.tools || []).includes(tool)\n                          ? 'Enabled for this local preview'\n                          : 'Optional workspace integration'}\n                      </p>\n                    </div>\n                    <Button\n                      variant=\"secondary\"\n                      size=\"sm\"\n                      disabled={disabled}\n                      onClick={() => {\n                        const enabled = (draft.tools || []).includes(tool);\n                        setDraft({\n                          ...draft,\n                          tools: enabled\n                            ? (draft.tools || []).filter((item) => item !== tool)\n                            : [...(draft.tools || []), tool],\n                        });\n                        setToolMessage(\n                          tool +\n                            (enabled ? ' disabled' : ' enabled') +\n                            ' locally. No external account was connected.',\n                        );\n                      }}\n                    >\n                      {(draft.tools || []).includes(tool) ? 'Disable preview' : 'Enable preview'}\n                    </Button>\n                  </div>\n                ))}\n                <p role=\"status\" className=\"he-hint\">\n                  {toolMessage ||\n                    'These settings demonstrate local integration preferences. External services are not connected.'}\n                </p>\n              </div>\n            ),\n          },\n          {\n            id: 'storage',\n            label: 'Storage',\n            content: (\n              <div className=\"he-settings-fields\">\n                <strong>Workspace storage</strong>\n                <progress\n                  aria-label=\"Workspace storage used\"\n                  value={(draft.files || sampleStorageFiles).reduce(\n                    (sum, file) => sum + file.bytes,\n                    0,\n                  )}\n                  max={100000000}\n                />\n                <p className=\"he-hint\">\n                  {new Intl.NumberFormat('en-IN', { maximumFractionDigits: 2 }).format(\n                    (draft.files || sampleStorageFiles).reduce((sum, file) => sum + file.bytes, 0) /\n                      1000000,\n                  )}{' '}\n                  MB of 100 MB · fictional local files\n                </p>\n                {(draft.files || sampleStorageFiles).map((file) => (\n                  <div className=\"he-settings-tool\" key={file.id}>\n                    <div>\n                      <strong>{file.name}</strong>\n                      <p className=\"he-hint\">\n                        {new Intl.NumberFormat('en-IN').format(Math.ceil(file.bytes / 1000))} KB\n                      </p>\n                    </div>\n                    <Button\n                      variant=\"tertiary\"\n                      size=\"sm\"\n                      disabled={disabled}\n                      aria-label={'Remove ' + file.name}\n                      onClick={() =>\n                        setDraft({\n                          ...draft,\n                          files: (draft.files || sampleStorageFiles).filter(\n                            (item) => item.id !== file.id,\n                          ),\n                        })\n                      }\n                    >\n                      Remove\n                    </Button>\n                  </div>\n                ))}\n                {draft.files?.length === 0 && (\n                  <p role=\"status\" className=\"he-hint\">\n                    No files in this local workspace.\n                  </p>\n                )}\n              </div>\n            ),\n          },\n          {\n            id: 'profile',\n            label: 'Profile',\n            content: (\n              <div className=\"he-settings-fields\">\n                <Input\n                  ref={nameRef}\n                  label=\"Full name\"\n                  value={draft.name}\n                  required\n                  disabled={disabled}\n                  error={errors.name}\n                  onChange={(event) => setDraft({ ...draft, name: event.target.value })}\n                />\n                <Input\n                  ref={emailRef}\n                  label=\"Email address\"\n                  value={draft.email}\n                  type=\"email\"\n                  required\n                  disabled={disabled}\n                  error={errors.email}\n                  onChange={(event) => setDraft({ ...draft, email: event.target.value })}\n                />\n                <p className=\"he-hint\">Account details stay in this preview.</p>\n              </div>\n            ),\n          },\n          {\n            id: 'notifications',\n            label: 'Notifications',\n            content: (\n              <div className=\"he-settings-fields\">\n                <Toggle\n                  label=\"Product updates\"\n                  selected={draft.notifications}\n                  disabled={disabled}\n                  onSelectedChange={(notifications) => setDraft({ ...draft, notifications })}\n                />\n                <Toggle\n                  label=\"Mentions\"\n                  selected={draft.mentions}\n                  disabled={disabled}\n                  onSelectedChange={(mentions) => setDraft({ ...draft, mentions })}\n                />\n              </div>\n            ),\n          },\n          {\n            id: 'appearance',\n            label: 'Appearance',\n            content: (\n              <div className=\"he-settings-fields\">\n                <Select\n                  label=\"Theme preference\"\n                  value={draft.theme}\n                  disabled={disabled}\n                  options={[\n                    { value: 'light', label: 'Light' },\n                    { value: 'dark', label: 'Dark' },\n                    { value: 'system', label: 'System' },\n                  ]}\n                  onChange={(event) =>\n                    setDraft({ ...draft, theme: event.target.value as SettingsValue['theme'] })\n                  }\n                />\n                <p className=\"he-hint\">Save to apply this preference to the actual page.</p>\n              </div>\n            ),\n          },\n        ]}\n      />\n    </Dialog>\n  );\n}\nexport type SidebarItem = {\n  id: string;\n  label: string;\n  icon?: ReactNode;\n  badge?: string;\n  disabled?: boolean;\n};\nexport type SidebarProps = {\n  label?: string;\n  brand?: string;\n  items: SidebarItem[];\n  value?: string;\n  defaultValue?: string;\n  onValueChange?: (id: string) => void;\n  collapsed?: boolean;\n  onCollapsedChange?: (collapsed: boolean) => void;\n  disabled?: boolean;\n  variant?: 'workspace' | 'chat';\n  onNewChat?: () => void;\n  footer?: ReactNode;\n  onAccountAction?: (action: string) => void;\n  onTeamChange?: (team: string) => void;\n};\nexport function Sidebar({\n  label = 'Workspace navigation',\n  brand = 'Helios UI',\n  items,\n  value,\n  defaultValue = items[0]?.id || '',\n  onValueChange,\n  collapsed,\n  onCollapsedChange,\n  disabled = false,\n  variant = 'workspace',\n  onNewChat,\n  footer,\n  onAccountAction,\n  onTeamChange,\n}: SidebarProps) {\n  const [local, setLocal] = useState(defaultValue),\n    [localCollapsed, setCollapsed] = useState(false),\n    [query, setQuery] = useState(''),\n    [accountStatus, setAccountStatus] = useState(''),\n    [team, setTeam] = useState(brand),\n    active = value ?? local,\n    compact = collapsed ?? localCollapsed,\n    filtered = items.filter((item) => item.label.toLowerCase().includes(query.toLowerCase()));\n  useEffect(() => setQuery(''), [variant]);\n  return (\n    <aside className={`he-sidebar ${compact ? 'he-collapsed' : ''}`} aria-label={label}>\n      <div className=\"he-sidebar-brand\">\n        {compact ? (\n          <span>H</span>\n        ) : (\n          <DropdownMenu\n            label={team}\n            disabled={disabled}\n            size=\"sm\"\n            selectedKey={team}\n            items={[\n              { id: brand, label: brand, description: 'Current workspace' },\n              { id: 'Design team', label: 'Design team', description: '8 fictional members' },\n              {\n                id: 'Engineering team',\n                label: 'Engineering team',\n                description: '12 fictional members',\n              },\n            ]}\n            onAction={(next) => {\n              setTeam(next);\n              setAccountStatus('Switched to ' + next + ' locally.');\n              onTeamChange?.(next);\n            }}\n          />\n        )}\n        <IconButton\n          label={compact ? 'Expand sidebar' : 'Collapse sidebar'}\n          icon={compact ? '›' : '‹'}\n          size=\"xs\"\n          variant=\"tertiary\"\n          disabled={disabled}\n          onClick={() => {\n            setCollapsed(!compact);\n            onCollapsedChange?.(!compact);\n          }}\n        />\n      </div>\n      {!compact && (\n        <Input\n          label=\"Search navigation\"\n          type=\"search\"\n          size=\"sm\"\n          value={query}\n          disabled={disabled}\n          onChange={(event) => setQuery(event.target.value)}\n          placeholder=\"Find a page…\"\n        />\n      )}\n      {variant === 'chat' && (\n        <div className=\"he-sidebar-chat-head\">\n          <Button\n            variant=\"secondary\"\n            size=\"sm\"\n            disabled={disabled || !onNewChat}\n            onClick={onNewChat}\n            aria-label=\"New chat\"\n          >\n            {compact ? '＋' : '＋ New chat'}\n          </Button>\n          {!compact && <p className=\"he-hint\">Your conversations</p>}\n        </div>\n      )}\n      <nav aria-label={label}>\n        {filtered.map((item) => (\n          <button\n            key={item.id}\n            type=\"button\"\n            disabled={disabled || item.disabled}\n            aria-label={item.label}\n            aria-current={active === item.id ? 'page' : undefined}\n            onClick={() => {\n              setLocal(item.id);\n              onValueChange?.(item.id);\n            }}\n          >\n            <span aria-hidden=\"true\">{renderIcon(item.icon) || <UIIcon name=\"grid\" />}</span>\n            <span className={compact ? 'hu-sr-only' : ''}>{item.label}</span>\n            {item.badge && !compact && <Badge size=\"sm\">{item.badge}</Badge>}\n          </button>\n        ))}\n        {!filtered.length && <p className=\"he-hint\">No navigation items match.</p>}\n      </nav>\n      {!compact && footer && <div className=\"he-sidebar-footer\">{footer}</div>}\n      <ThemeToggle compact={compact} disabled={disabled} />\n      {!compact && (\n        <div className=\"he-sidebar-user\">\n          <Avatar name=\"Aarav Shah\" size=\"sm\" />\n          <span>\n            <strong>Aarav Shah</strong>\n            <small>aarav@example.com</small>\n          </span>\n          <DropdownMenu\n            label=\"Account\"\n            size=\"sm\"\n            disabled={disabled}\n            items={[\n              { id: 'profile', label: 'View profile' },\n              { id: 'settings', label: 'Account settings' },\n              { id: 'signout', label: 'Sign out', separator: true },\n            ]}\n            onAction={(action) => {\n              setAccountStatus(\n                action === 'profile'\n                  ? 'Local profile: Aarav Shah · aarav@example.com.'\n                  : action === 'signout'\n                    ? 'Sign out selected locally. No active session was changed.'\n                    : 'Account settings selected.',\n              );\n              onAccountAction?.(action);\n            }}\n          />\n        </div>\n      )}\n      {accountStatus && (\n        <p role=\"status\" className=\"he-hint\">\n          {accountStatus}\n        </p>\n      )}\n    </aside>\n  );\n}\nexport type StatPeriod = '7d' | '30d';\nexport type StatMetric = {\n  id: string;\n  label: string;\n  icon?: ReactNode;\n  description?: string;\n  tone?: 'blue'|'orange'|'purple'|'pink'|'sky'|'emerald';\n  caption?: string;\n  format?: 'number' | 'currency' | 'percent';\n  periods: Record<StatPeriod, { value: number; previous: number; series?: number[] }>;\n};\nexport type StatCardsProps = {\n  items: StatMetric[];\n  period?: StatPeriod;\n  defaultPeriod?: StatPeriod;\n  onPeriodChange?: (period: StatPeriod) => void;\n  disabled?: boolean;\n  variant?: 'compact' | 'footer';\n};\nexport function StatCards({\n  items,\n  period,\n  defaultPeriod = '30d',\n  onPeriodChange,\n  disabled = false,\n  variant = 'compact',\n}: StatCardsProps) {\n  const [local, setLocal] = useState(defaultPeriod),\n    current = period ?? local,\n    reduce = useReducedMotion();\n  const format = (value: number, kind: StatMetric['format']) =>\n    kind === 'currency'\n      ? new Intl.NumberFormat('en-IN', {\n          style: 'currency',\n          currency: 'INR',\n          maximumFractionDigits: 0,\n        }).format(value)\n      : kind === 'percent'\n        ? value + '%'\n        : new Intl.NumberFormat('en-IN').format(value);\n  return (\n    <section className={`he-stats he-stats-${variant}`}>\n      <div className=\"he-stats-head\">\n        <strong>Workspace performance</strong>\n        <ButtonGroup\n          label=\"Statistics period\"\n          disabled={disabled}\n          value={current}\n          items={[\n            { id: '7d', label: '7 days' },\n            { id: '30d', label: '30 days' },\n          ]}\n          onValueChange={(value) => {\n            setLocal(value as StatPeriod);\n            onPeriodChange?.(value as StatPeriod);\n          }}\n        />\n      </div>\n      <div className=\"he-stats-grid\">\n        {items.map((item) => {\n          const data = item.periods[current],\n            change =\n              data.previous === 0\n                ? null\n                : ((data.value - data.previous) / Math.abs(data.previous)) * 100,\n            series = data.series || [],\n            max = Math.max(1, ...series),\n            min = Math.min(0, ...series),\n            points = series\n              .map(\n                (value, index) =>\n                  `${(index / Math.max(1, series.length - 1)) * 100},${44 - ((value - min) / (max - min || 1)) * 40}`,\n              )\n              .join(' ');\n          return (\n            <motion.article\n              key={item.id}\n              initial={false}\n              animate={reduce ? undefined : { opacity: 1 }}\n            >\n              {variant === 'footer' && (\n                <div className=\"he-stat-tile-row\">\n                  <span className={'he-stat-icon'+(item.tone?' he-stat-tone-'+item.tone:'')} aria-hidden=\"true\">\n                    {renderIcon(item.icon) || <UIIcon name=\"arrow-up-right\" />}\n                  </span>\n                  <span className=\"he-stat-info\">\n                    <Tooltip\n                      label={`${item.label} information`}\n                      trigger={<UIIcon name=\"info\" />}\n                      content={\n                        item.description ||\n                        `Total ${item.label.toLowerCase()} during the selected period; change compares the previous period.`\n                      }\n                      disabled={disabled}\n                    />\n                  </span>\n                </div>\n              )}\n              <span>{item.label}</span>\n              <strong>{format(data.value, item.format)}</strong>\n              <small\n                className={`${change !== null && change < 0 ? 'he-stat-negative' : 'he-stat-positive'} ${variant === 'footer' ? 'he-stat-footer' : ''}`}\n              >\n                {variant === 'footer' && (\n                  <span className=\"he-stat-period\">\n                    {item.caption || ('From '+(current === '7d' ? 'last week' : 'last month'))}\n                  </span>\n                )}\n                <b>\n                  {change === null\n                    ? 'No prior comparison'\n                    : `${change < 0 ? '↓' : '↑'} ${Math.abs(change).toFixed(1)}%`}\n                </b>{' '}\n                {variant !== 'footer' && (\n                  <span>\n                    {change !== null\n                      ? 'vs. previous ' + (current === '7d' ? '7 days' : '30 days')\n                      : ''}\n                  </span>\n                )}\n              </small>\n              {variant === 'compact' && series.length > 1 && (\n                <svg\n                  viewBox=\"0 0 100 48\"\n                  role=\"img\"\n                  aria-label={`${item.label} trend for ${current === '7d' ? '7' : '30'} days`}\n                >\n                  <polyline\n                    points={points}\n                    fill=\"none\"\n                    stroke=\"currentColor\"\n                    strokeWidth=\"2\"\n                    vectorEffect=\"non-scaling-stroke\"\n                  />\n                </svg>\n              )}\n            </motion.article>\n          );\n        })}\n      </div>\n    </section>\n  );\n}\nexport const statMetrics: StatMetric[] = [\n  {\n    id: 'revenue',\n    label: 'Total revenue',\n    format: 'currency',\n    periods: {\n      '7d': { value: 48200, previous: 44100, series: [3, 4, 3, 6, 5, 8, 9] },\n      '30d': { value: 188800, previous: 175800, series: [2, 4, 3, 6, 5, 8, 7, 10] },\n    },\n  },\n  {\n    id: 'members',\n    label: 'Active members',\n    periods: {\n      '7d': { value: 1228, previous: 1180, series: [3, 3, 4, 3, 5, 6, 7] },\n      '30d': { value: 4862, previous: 4452, series: [2, 3, 4, 3, 5, 6, 6, 8] },\n    },\n  },\n  {\n    id: 'rate',\n    label: 'Email open rate',\n    format: 'percent',\n    periods: {\n      '7d': { value: 78, previous: 81, series: [8, 7, 8, 6, 7, 5, 6] },\n      '30d': { value: 82, previous: 76, series: [3, 4, 4, 6, 5, 7, 7, 8] },\n    },\n  },\n];\n\nfunction StatCardsExample({ disabled }: FamilyProps) {\n  const [variant, setVariant] = useState<'compact' | 'footer'>('footer');\n  return (\n    <div className=\"he-stat-example\">\n      <Select\n        label=\"Stat card style\"\n        value={variant}\n        disabled={disabled}\n        options={[\n          { value: 'footer', label: 'Footer cards' },\n          { value: 'compact', label: 'Compact cards' },\n        ]}\n        onChange={(event) => setVariant(event.target.value as typeof variant)}\n      />\n      <StatCards\n        items={[\n          ...statMetrics,\n          {\n            id: 'refunds',\n            label: 'Refunds',\n            format: 'currency',\n            icon: '↩',\n            periods: {\n              '7d': { value: 1200, previous: 1250 },\n              '30d': { value: 4290, previous: 4395 },\n            },\n          },\n        ]}\n        disabled={disabled}\n        variant={variant}\n      />\n    </div>\n  );\n}\nfunction AnnouncementExample({ disabled }: FamilyProps) {\n  const [version, setVersion] = useState(0),\n    [message, setMessage] = useState(''),\n    [open, setOpen] = useState(false);\n  return (\n    <div className=\"he-stack\">\n      <Announcement\n        key={version}\n        layout=\"card\"\n        tone=\"neutral\"\n        disabled={disabled}\n        title=\"Your new workspace is ready\"\n        description=\"Explore reusable Helios UI components and updated examples.\"\n        actionLabel=\"Take the tour\"\n        onAction={() => setOpen(true)}\n        onDismiss={() => setMessage('Announcement dismissed.')}\n      />\n      {message && (\n        <>\n          <p role=\"status\" className=\"he-hint\">\n            {message}\n          </p>\n          <Button\n            variant=\"secondary\"\n            disabled={disabled}\n            onClick={() => {\n              setVersion(version + 1);\n              setMessage('');\n            }}\n          >\n            Restore announcement\n          </Button>\n        </>\n      )}\n      <Dialog\n        open={open}\n        onOpenChange={setOpen}\n        title=\"A quick tour of Helios UI\"\n        description=\"Explore components, templates and source from the navigation.\"\n        footer={<Button onClick={() => setOpen(false)}>Got it</Button>}\n      >\n        <p className=\"he-hint\">This tour is a local example, not a product onboarding service.</p>\n      </Dialog>\n    </div>\n  );\n}\nfunction OTPExample({ disabled }: FamilyProps) {\n  const [value, setValue] = useState(''),\n    [length, setLength] = useState(6),\n    [grouped, setGrouped] = useState(false),\n    [error, setError] = useState(''),\n    [message, setMessage] = useState('');\n  return (\n    <div className=\"he-stack\">\n      <div className=\"he-inline\">\n        <Select\n          label=\"OTP length\"\n          value={String(length)}\n          disabled={disabled}\n          options={[4, 6, 8].map((value) => ({ value: String(value), label: value + ' digits' }))}\n          onChange={(event) => {\n            setLength(Number(event.target.value));\n            setValue('');\n            setError('');\n            setMessage('');\n          }}\n        />\n        <Checkbox\n          label=\"Group OTP digits\"\n          checked={grouped}\n          disabled={disabled}\n          onChange={(event) => setGrouped(event.target.checked)}\n        />\n      </div>\n      <InputOTP\n        length={length}\n        groupEvery={grouped ? 3 : 0}\n        value={value}\n        disabled={disabled}\n        error={error}\n        onValueChange={(next) => {\n          setValue(next);\n          setError('');\n          setMessage('');\n        }}\n        onComplete={() =>\n          setMessage(length + ' digits entered. Submit to check the format locally.')\n        }\n      />\n      <div className=\"he-inline\">\n        <Button\n          disabled={disabled}\n          onClick={() => {\n            if (value.length !== length) {\n              setError('Enter all ' + length + ' digits.');\n              return;\n            }\n            setError('');\n            setMessage('Code format checked locally. No identity verification was performed.');\n          }}\n        >\n          Check code format\n        </Button>\n        <Button\n          variant=\"secondary\"\n          disabled={disabled || !value}\n          onClick={() => {\n            setValue('');\n            setError('');\n            setMessage('Code cleared.');\n          }}\n        >\n          Clear code\n        </Button>\n      </div>\n      <p role=\"status\" className=\"he-hint\">\n        {message}\n      </p>\n    </div>\n  );\n}\nfunction SocialExample({ disabled, size }: FamilyProps) {\n  const [message, setMessage] = useState(''),\n    [appearance, setAppearance] = useState<NonNullable<SocialButtonProps['appearance']>>('brand');\n  return (\n    <div className=\"he-stack\">\n      <Select\n        label=\"Social appearance\"\n        value={appearance}\n        disabled={disabled}\n        options={[\n          { value: 'brand', label: 'Brand' },\n          { value: 'neutral', label: 'White · outlined' },\n          { value: 'black', label: 'Black' },\n        ]}\n        onChange={(event) => setAppearance(event.target.value as typeof appearance)}\n      />\n      <div className=\"he-social-buttons\">\n        {(['Google', 'GitHub', 'Slack'] as SocialProvider[]).map((provider) => (\n          <SocialButton\n            key={provider}\n            provider={provider}\n            appearance={appearance}\n            disabled={disabled}\n            size={size}\n            onPress={() =>\n              setMessage(`${provider} selected. This preview does not connect an OAuth account.`)\n            }\n          />\n        ))}\n      </div>\n      <div className=\"he-social-provider-grid\" role=\"group\" aria-label=\"All 24 social providers\">\n        {socialProviders.map((provider) => (\n          <SocialButton\n            key={provider}\n            provider={provider}\n            iconOnly\n            appearance=\"neutral\"\n            disabled={disabled}\n            size={size}\n            onPress={() =>\n              setMessage(provider + ' selected locally. Authentication is not configured.')\n            }\n          />\n        ))}\n      </div>\n      <p role=\"status\" className=\"he-hint\">\n        {message || 'Provider actions use a local callback; authentication is not configured.'}\n      </p>\n    </div>\n  );\n}\nfunction TextareaExample({ disabled, size }: FamilyProps) {\n  const [value, setValue] = useState(''),\n    [auto, setAuto] = useState(true);\n  return (\n    <div className=\"he-stack\">\n      <Textarea\n        label=\"What changed in this version?\"\n        value={value}\n        onChange={(event) => setValue(event.target.value)}\n        disabled={disabled}\n        size={size}\n        maxLength={240}\n        autoResize={auto}\n        hint=\"Describe the update in 240 characters or fewer.\"\n      />\n      <Checkbox\n        label=\"Auto resize\"\n        disabled={disabled}\n        checked={auto}\n        onChange={(event) => setAuto(event.target.checked)}\n      />\n    </div>\n  );\n}\nfunction IconButtonsExample({ id, disabled, size }: FamilyProps & { id: string }) {\n  const [message, setMessage] = useState(''),\n    [visible, setVisible] = useState(true),\n    [saved, setSaved] = useState(false);\n  return (\n    <div className=\"he-stack\">\n      <div className=\"he-inline\">\n        {id === 'close-button' ? (\n          visible ? (\n            <div className=\"he-close-example\">\n              <span>A dismissible example</span>\n              <CloseButton\n                label=\"Close example\"\n                disabled={disabled}\n                size={size}\n                onClick={() => {\n                  setVisible(false);\n                  setMessage('Example closed.');\n                }}\n              />\n            </div>\n          ) : (\n            <Button variant=\"secondary\" disabled={disabled} onClick={() => setVisible(true)}>\n              Restore example\n            </Button>\n          )\n        ) : (\n          <>\n            <IconButton\n              label={saved ? 'Unsave item' : 'Save item'}\n              icon={saved ? '★' : '☆'}\n              aria-pressed={saved}\n              size={size}\n              disabled={disabled}\n              onClick={() => {\n                setSaved(!saved);\n                setMessage(saved ? 'Item unsaved.' : 'Item saved in this local example.');\n              }}\n            />\n            <IconButton\n              label=\"Add item\"\n              icon=\"+\"\n              size={size}\n              disabled={disabled}\n              onClick={() => setMessage('An item was added in this local example.')}\n            />\n            <IconButton\n              label=\"Open options\"\n              icon=\"•••\"\n              size={size}\n              disabled={disabled}\n              onClick={() => setMessage('Options selected in this local example.')}\n            />\n          </>\n        )}\n      </div>\n      <p role=\"status\" className=\"he-hint\">\n        {message || 'Icon-only controls keep meaningful accessible names.'}\n      </p>\n    </div>\n  );\n}\nfunction LinkExample({ disabled, size }: FamilyProps) {\n  const [message, setMessage] = useState('');\n  return (\n    <div className=\"he-stack\">\n      <div className=\"he-inline\">\n        <LinkButton href=\"#/components\" size={size} disabled={disabled} trailingIcon=\"→\">\n          Browse components\n        </LinkButton>\n        <LinkButton\n          href=\"data:text/csv;charset=utf-8,Name%2CStatus%0AAarav%20Shah%2CActive\"\n          download=\"helios-example.csv\"\n          size={size}\n          disabled={disabled}\n          leadingIcon=\"↓\"\n          onClick={() => setMessage('Example report downloaded.')}\n        >\n          Download report\n        </LinkButton>\n        <LinkButton disabled>Unavailable</LinkButton>\n      </div>\n      <p role=\"status\" className=\"he-hint\">\n        {message}\n      </p>\n    </div>\n  );\n}\nfunction DataGridExample({ disabled }: FamilyProps) {\n  const inherited=useDirection();\n  const [mode, setMode] = useState('large'),\n    [readOnly, setReadOnly] = useState(false),\n    [overrideRtl, setRtl] = useState<boolean|null>(null);\n  const rows = useMemo(\n    () =>\n      mode === 'large'\n        ? Array.from({ length: 10000 }, (_, index) => {\n            const item = renewalRows[index % renewalRows.length];\n            return {\n              ...item,\n              id: 'row-' + (index + 1),\n              account: item.account + ' ' + (index + 1),\n              seats: 8 + (index % 93),\n              arr: (8 + (index % 93)) * 10000,\n            };\n          })\n        : renewalRows,\n    [mode],\n  );\n  const rtl=overrideRtl??(inherited.direction==='rtl');\n  return (\n    <div className=\"he-grid-example\">\n      <DataGrid\n        key={mode}\n        label=\"Renewals\"\n        rows={rows}\n        columns={renewalColumns}\n        disabled={disabled}\n        readOnly={readOnly}\n        dir={rtl ? 'rtl' : 'ltr'}\n      />\n      <details className=\"he-grid-example-options\"><summary>Grid options</summary>      <Select\n        label=\"Grid dataset\"\n        value={mode}\n        disabled={disabled}\n        options={[\n          { value: 'small', label: 'Five example accounts' },\n          { value: 'large', label: '10,000 example accounts' },\n        ]}\n        onChange={(event) => setMode(event.target.value)}\n      />\n      <div className=\"he-inline\">\n        <Checkbox\n          label=\"Read-only cells\"\n          checked={readOnly}\n          disabled={disabled}\n          onChange={(event) => setReadOnly(event.target.checked)}\n        />\n        <Checkbox\n          label=\"Right-to-left layout\"\n          checked={rtl}\n          disabled={disabled}\n          onChange={(event) => setRtl(event.target.checked)}\n        />\n      </div>\n      </details>\n      <p className=\"he-hint\">\n        Large mode renders a moving row window. Search, selection and CSV include the full dataset.\n      </p>\n    </div>\n  );\n}\nfunction CarouselExample({ disabled }: FamilyProps) {\n  const [cardWidth, setCardWidth] = useState('100%'),\n    [align, setAlign] = useState<'start' | 'center'>('start'),\n    [gap, setGap] = useState('16'),\n    [showArrows, setShowArrows] = useState(true),\n    [showDots, setShowDots] = useState(true);\n  return <div className=\"he-stack he-carousel-demo\">\n    <Carousel key={cardWidth+align+gap} label=\"Explore Helios UI\" items={carouselItems} disabled={disabled} cardWidth={cardWidth} align={align} gap={Number(gap)} showArrows={showArrows} showDots={showDots}/>\n    <details className=\"he-carousel-controls\"><summary>Carousel options</summary><div className=\"he-inline\">\n      <Select label=\"Carousel card width\" value={cardWidth} disabled={disabled} onChange={event=>setCardWidth(event.target.value)} options={[{value:'100%',label:'Full width'},{value:'80%',label:'Peek at next card'},{value:'calc(50% - 8px)',label:'Two-card gallery'}]}/>\n      <Select label=\"Carousel alignment\" value={align} disabled={disabled} onChange={event=>setAlign(event.target.value as 'start'|'center')} options={[{value:'start',label:'Start'},{value:'center',label:'Center'}]}/>\n      <Select label=\"Carousel gap\" value={gap} disabled={disabled} onChange={event=>setGap(event.target.value)} options={['8','16','24'].map(value=>({value,label:value+' px'}))}/>\n    </div>\n    <div className=\"he-inline\"><Checkbox label=\"Show carousel arrows\" checked={showArrows} disabled={disabled} onChange={event=>setShowArrows(event.target.checked)}/><Checkbox label=\"Show carousel dots\" checked={showDots} disabled={disabled} onChange={event=>setShowDots(event.target.checked)}/></div>\n    </details>\n  </div>;\n}\nfunction SettingsExample({ disabled }: FamilyProps) {\n  const [open, setOpen] = useState(false),\n    [values, setValues] = useState(defaultSettings),\n    [message, setMessage] = useState('');\n  return (\n    <div className=\"he-stack\">\n      <Button disabled={disabled} onClick={() => setOpen(true)}>\n        Open settings\n      </Button>\n      <SettingsModal\n        open={open}\n        onOpenChange={setOpen}\n        initialValue={values}\n        disabled={disabled}\n        onSave={(next) => {\n          setValues(next);\n          setMessage(`Settings saved locally for ${next.name}.`);\n        }}\n      />\n      <p role=\"status\" className=\"he-hint\">\n        {message || 'Open settings to edit profile, notifications and appearance.'}\n      </p>\n    </div>\n  );\n}\nfunction SidebarExample({ disabled }: FamilyProps) {\n  const [active, setActive] = useState('overview'),\n    [tourOpen, setTourOpen] = useState(false),\n    [settingsOpen, setSettingsOpen] = useState(false),\n    [settingsValue, setSettingsValue] = useState(defaultSettings),\n    exampleRef = useRef<HTMLDivElement>(null),\n    settingsOpener = useRef<HTMLElement | null>(null),\n    [variant, setVariant] = useState<'workspace' | 'chat'>('workspace'),\n    [chats, setChats] = useState([\n      {\n        id: 'chat-1',\n        label: 'Design system review',\n        description: 'Reviewing component states and keyboard access.',\n      },\n      {\n        id: 'chat-2',\n        label: 'Dashboard exploration',\n        description: 'Exploring a responsive Helios dashboard.',\n      },\n    ]);\n  const pages: Record<string, { title: string; description: string }> = {\n    overview: {\n      title: 'Workspace overview',\n      description: 'Your workspace activity and current projects.',\n    },\n    projects: { title: 'Projects', description: 'Three example projects are ready to review.' },\n    messages: {\n      title: 'Team messages',\n      description: 'Two example conversations have new replies.',\n    },\n    settings: { title: 'Settings', description: 'Manage your workspace preferences.' },\n  };\n  return (\n    <div className=\"he-sidebar-example\" ref={exampleRef}>\n      <Select\n        label=\"Sidebar variant\"\n        value={variant}\n        disabled={disabled}\n        options={[\n          { value: 'workspace', label: 'Workspace' },\n          { value: 'chat', label: 'AI chat' },\n        ]}\n        onChange={(event) => {\n          const next = event.target.value as typeof variant;\n          setVariant(next);\n          setActive(next === 'chat' ? chats[0]?.id || '' : 'overview');\n        }}\n      />\n      <Sidebar\n        footer={\n          <Announcement\n            title=\"Setting up your workspace\"\n            actionLabel=\"Take the tour\"\n            description=\"Take the tour and explore Helios UI.\"\n            layout=\"card\"\n            tone=\"neutral\"\n            disabled={disabled}\n            onAction={() => setTourOpen(true)}\n          />\n        }\n        onAccountAction={(action) => {\n          if (action === 'settings') {\n            settingsOpener.current = exampleRef.current?.querySelector<HTMLElement>('.he-sidebar-user .hb-menu-trigger') || null;\n            setSettingsOpen(true);\n          }\n        }}\n        variant={variant}\n        onNewChat={() => {\n          const next = {\n            id: 'chat-' + (chats.length + 1),\n            label: 'New conversation ' + (chats.length + 1),\n            description: 'Start a new conversation in this local example.',\n          };\n          setChats((previous) => [next, ...previous]);\n          setActive(next.id);\n        }}\n        disabled={disabled}\n        value={active}\n        onValueChange={(next) => {\n          if (next === 'settings') {\n            settingsOpener.current = exampleRef.current?.querySelector<HTMLElement>('nav button[aria-label=\"Settings\"]') || null;\n            setSettingsOpen(true);\n          }\n          else setActive(next);\n        }}\n        items={\n          variant === 'chat'\n            ? chats.map((chat) => ({ id: chat.id, label: chat.label, icon: <UIIcon name=\"file\" /> }))\n            : [\n                { id: 'overview', label: 'Overview', icon: <UIIcon name=\"home\" /> },\n                { id: 'projects', label: 'Projects', icon: <UIIcon name=\"layers\" />, badge: '3' },\n                { id: 'messages', label: 'Messages', icon: '✉', badge: '2' },\n                { id: 'settings', label: 'Settings', icon: '⚙' },\n              ]\n        }\n      />\n      <p className=\"he-sidebar-selection he-hint\" role=\"status\">\n        {variant === 'chat'\n          ? chats.find((chat) => chat.id === active)?.label\n          : pages[active]?.title} selected in this local example.\n      </p>\n      <SettingsModal\n        open={settingsOpen}\n        onOpenChange={(next) => {\n          setSettingsOpen(next);\n          if (!next) requestAnimationFrame(() => settingsOpener.current?.focus());\n        }}\n        initialValue={settingsValue}\n        onSave={setSettingsValue}\n        disabled={disabled}\n      />\n      <Dialog\n        open={tourOpen}\n        onOpenChange={setTourOpen}\n        title=\"A quick tour of Helios UI\"\n        description=\"Explore this local workspace preview. No external account is connected.\"\n        footer={<Button onClick={() => setTourOpen(false)}>Got it</Button>}\n      >\n        <ol>\n          <li>Use the navigation to explore example workspace pages.</li>\n          <li>Switch to the AI chat sidebar to create a local conversation.</li>\n          <li>Try the theme and account menu, then browse the reusable React components.</li>\n        </ol>\n      </Dialog>\n    </div>\n  );\n}\nexport const boardExtraIds = [\n  'announcement',\n  'carousel',\n  'input-otp',\n  'social-button',\n  'textarea',\n  'close-button',\n  'icon-button',\n  'link-button',\n  'theme-toggle',\n  'data-grid',\n  'settings-modal',\n  'sidebar',\n  'stat-cards',\n] as const;\nexport type BoardExtraId = (typeof boardExtraIds)[number];\nconst carouselItems: CarouselItem[] = [\n  {\n    id: 'foundations',\n    title: 'Figma foundations',\n    description: 'A shared language for color, type and spacing.',\n    content: (\n      <span className=\"he-carousel-illustration\" aria-hidden=\"true\">\n        Aa\n      </span>\n    ),\n  },\n  {\n    id: 'components',\n    title: 'Reusable React components',\n    description: 'Real props, accessible behavior and usable source.',\n    content: (\n      <span className=\"he-carousel-illustration\" aria-hidden=\"true\"><UIIcon name=\"grid\" /></span>\n    ),\n  },\n  {\n    id: 'templates',\n    title: 'Composed application templates',\n    description: 'Complete pages made from shared components.',\n    content: (\n      <span className=\"he-carousel-illustration\" aria-hidden=\"true\"><UIIcon name=\"calendar\" /></span>\n    ),\n  },\n];\nexport function BoardExtra({\n  id,\n  state = 'ready',\n  onRetry,\n  disabled: configuredDisabled = false,\n  size = 'md',\n}: FamilyProps & { id: BoardExtraId | string }) {\n  const overlayHost=useRef<HTMLDivElement>(null);\n  const disabled=configuredDisabled||state!=='ready';\n  const props = { disabled, size };\n  return (\n    <div className={`he-extra he-extra-${id}`} data-board-extra={id}>\n      {state!=='ready'&&<DataState state={state} onRetry={onRetry} emptyMessage=\"No example data. Reset to restore this component.\"/>}\n      <div style={{display:state==='ready'?'contents':'none'}} hidden={state!=='ready'} inert={state!=='ready'||undefined}><UNSAFE_PortalProvider getContainer={()=>overlayHost.current}>\n      {id === 'announcement' ? (\n        <AnnouncementExample {...props} />\n      ) : id === 'carousel' ? (\n        <CarouselExample {...props}/>\n      ) : id === 'input-otp' ? (\n        <OTPExample {...props} />\n      ) : id === 'social-button' ? (\n        <SocialExample {...props} />\n      ) : id === 'textarea' ? (\n        <TextareaExample {...props} />\n      ) : id === 'close-button' || id === 'icon-button' ? (\n        <IconButtonsExample id={id} {...props} />\n      ) : id === 'link-button' ? (\n        <LinkExample {...props} />\n      ) : id === 'theme-toggle' ? (\n        <ThemeToggle disabled={disabled} />\n      ) : id === 'data-grid' ? (\n        <DataGridExample disabled={disabled} />\n      ) : id === 'settings-modal' ? (\n        <SettingsExample {...props} />\n      ) : id === 'sidebar' ? (\n        <SidebarExample {...props} />\n      ) : id === 'stat-cards' ? (\n        <StatCardsExample disabled={disabled} />\n      ) : null}\n      <div ref={overlayHost} style={{display:'contents'}}/></UNSAFE_PortalProvider></div>\n    </div>\n  );\n}\nexport const boardExtraMetadata = {\n  announcement: {\n    exportName: 'Announcement',\n    props: {\n      title: 'string',\n      description: 'string',\n      actionLabel: 'string',\n      onAction: '()=>void',\n      onDismiss: '()=>void',\n      tone: 'neutral | brand | success',\n      disabled: 'boolean',\n    },\n    example:\n      '<Announcement title=\"Your workspace is ready\" description=\"Explore the new components.\" onAction={()=>console.log(\"Tour\")} />',\n  },\n  carousel: {\n    exportName: 'Carousel',\n    props: {\n      label: 'string',\n      items: 'CarouselItem[]',\n      value: 'number',\n      onValueChange: '(index:number)=>void',\n      cardWidth: 'string; CSS width per item',\n      align: 'start | center',\n      showArrows: 'boolean',\n      showDots: 'boolean',\n      gap: 'number; pixels between cards',\n      disabled: 'boolean',\n    },\n    example:\n      '<Carousel label=\"Examples\" items={[{id:\"one\",title:\"First example\"},{id:\"two\",title:\"Second example\"}]} />',\n  },\n  'input-otp': {\n    exportName: 'InputOTP',\n    props: {\n      length: 'number; 1–12, default 6',\n      value: 'string',\n      onValueChange: '(value:string)=>void',\n      onComplete: '(value:string)=>void',\n      error: 'string',\n      label: 'string',\n      disabled: 'boolean',\n    },\n    example: '<InputOTP label=\"Verification code\" onComplete={code=>console.log(code)} />',\n  },\n  'social-button': {\n    exportName: 'SocialButton',\n    props: {\n      provider: 'Google | GitHub | Slack | Okta SSO | SSO | custom brand name',\n      appearance: 'colorful | black | white; brand/neutral remain aliases',\n      fullWidth: 'boolean; replace fixed300/250px width with container width',\n      children: 'ReactNode; optional custom label',\n      iconOnly: 'boolean',\n      logo: 'ReactNode; custom provider mark',\n      brandColor: 'string; custom brand background',\n      href: 'string; renders native anchor when supplied',\n      onPress: '()=>void; caller supplies authentication',\n      label: 'string',\n      size: 'sm | md | lg',\n      disabled: 'boolean',\n      loading: 'boolean',\n    },\n    example: '<SocialButton provider=\"Google\" onPress={()=>console.log(\"Choose provider\")} />',\n  },\n  textarea: {\n    exportName: 'Textarea',\n    props: {\n      label: 'string',\n      value: 'string',\n      onChange: 'native textarea event',\n      hint: 'string',\n      error: 'string',\n      maxLength: 'number',\n      autoResize: 'boolean',\n      showCount: 'boolean',\n      size: 'sm | md | lg',\n      disabled: 'boolean',\n    },\n    example: '<Textarea label=\"Version notes\" autoResize maxLength={240} />',\n  },\n  'close-button': {\n    exportName: 'CloseButton',\n    props: {\n      label: 'string; default Close',\n      onClick: 'native button handler',\n      size: 'xs | sm | md | lg | xl',\n      disabled: 'boolean',\n    },\n    example: '<CloseButton label=\"Dismiss example\" onClick={()=>console.log(\"Closed\")} />',\n  },\n  'icon-button': {\n    exportName: 'IconButton',\n    props: {\n      label: 'string; accessible name',\n      icon: 'ReactNode',\n      onClick: 'native button handler',\n      size: 'xs | sm | md | lg | xl',\n      disabled: 'boolean',\n    },\n    example: '<IconButton label=\"Add item\" icon=\"+\" onClick={()=>console.log(\"Added\")} />',\n  },\n  'link-button': {\n    exportName: 'LinkButton',\n    props: {\n      href: 'string',\n      children: 'ReactNode',\n      leadingIcon: 'ReactNode',\n      trailingIcon: 'ReactNode',\n      disabled: 'boolean',\n      size: 'sm | md | lg',\n    },\n    example: '<LinkButton href=\"#/components\" trailingIcon=\"→\">Browse components</LinkButton>',\n  },\n  'theme-toggle': {\n    exportName: 'ThemeToggle',\n    props: {\n      label: 'string',\n      onValueChange: '(dark:boolean)=>void',\n      storageKey: 'string',\n      disabled: 'boolean',\n    },\n    example: '<ThemeToggle />',\n  },\n  'data-grid': {\n    exportName: 'DataGrid',\n    props: {\n      label: 'string',\n      rows: 'GridRow[]',\n      columns: 'GridColumn[]',\n      onRowsChange: '(rows:GridRow[])=>void',\n      virtualize: 'boolean; default true above 100 rows',\n      readOnly: 'boolean; editing disabled while search/selection/export remain available',\n      dir: 'ltr | rtl; layout and horizontal keyboard direction',\n      viewportHeight: 'number; default 360',\n      rowHeight: 'number; minimum 46, default 46',\n      disabled: 'boolean',\n    },\n    example:\n      '<DataGrid label=\"Renewals\" rows={[{id:\"1\",account:\"Aster Studio\",seats:24}]} columns={[{key:\"account\",label:\"Account\",required:true},{key:\"seats\",label:\"Seats\",type:\"number\",min:1}]} />',\n  },\n  'settings-modal': {\n    exportName: 'SettingsModal',\n    props: {\n      open: 'boolean',\n      onOpenChange: '(open:boolean)=>void',\n      initialValue: 'SettingsValue',\n      initialTab: 'general | profile | tools | storage | notifications | appearance',\n      onSave: '(value:SettingsValue)=>void',\n      disabled: 'boolean',\n    },\n    example: '<SettingsModal open={open} onOpenChange={setOpen} />',\n  },\n  sidebar: {\n    exportName: 'Sidebar',\n    props: {\n      items: 'SidebarItem[]',\n      value: 'string',\n      onValueChange: '(id:string)=>void',\n      collapsed: 'boolean',\n      onCollapsedChange: '(collapsed:boolean)=>void',\n      variant: 'workspace | chat',\n      onNewChat: '()=>void; required to enable New chat action',\n      disabled: 'boolean',\n    },\n    example:\n      '<Sidebar items={[{id:\"overview\",label:\"Overview\"},{id:\"projects\",label:\"Projects\"}]} />',\n  },\n  'stat-cards': {\n    exportName: 'StatCards',\n    props: {\n      items: 'StatMetric[]; values and prior periods',\n      period: '7d | 30d',\n      onPeriodChange: '(period:StatPeriod)=>void',\n      variant: 'compact | footer',\n      disabled: 'boolean',\n    },\n    example:\n      '<StatCards items={[{id:\"members\",label:\"Members\",periods:{\"7d\":{value:50,previous:40},\"30d\":{value:200,previous:180}}}]} />',\n  },\n} as const;\n",
  "src/BoardNativeExamples.tsx": "'use client';\nimport type{ComponentType}from'react';\nimport nativeContractCode from'./board-native/contract-code.json';\nimport nativeSectionCopy from'./board-native/section-copy.json';\nimport{BoardNativeSectionExample,sectionFrames}from'./BoardNativeVariants.js';\nexport{BoardNativeSectionExample}from'./BoardNativeVariants.js';\nimport{nativeCatalogPreviews}from'./board-native/catalog-previews.js';\nexport{DataTablePreview as NativeDataTableCatalogPreview,SidebarPreview as NativeSidebarCatalogPreview,DropdownPreview as NativeDropdownCatalogPreview,FileUploadPreview as NativeFileUploadCatalogPreview,MeetingSchedulePreview as NativeMeetingSchedulePreview}from'./board-native/landing-previews.js';\nimport{NativeScope}from'./board-native/NativeScope.js';\nexport{NativeScope}from'./board-native/NativeScope.js';\nexport*from'./board-native/exports.js';\nexport type BoardNativeSectionDescriptor={id:string;title:string;description?:string;descriptionParts?:{kind:string;text:string}[];code?:string;hasPreview:boolean};\nexport type BoardNativePage={slug:string;title:string;description:string;Preview:ComponentType;code:string;sections:BoardNativeSectionDescriptor[]};\nimport{NativeAnnouncementExample}from\"./board-native/examples/announcement-example.js\";\nexport{NativeAnnouncementExample}from\"./board-native/examples/announcement-example.js\";\nimport{NativeAvatarExample}from\"./board-native/examples/avatar-example.js\";\nexport{NativeAvatarExample}from\"./board-native/examples/avatar-example.js\";\nimport{NativeBreadcrumbExample}from\"./board-native/examples/breadcrumb-example.js\";\nexport{NativeBreadcrumbExample}from\"./board-native/examples/breadcrumb-example.js\";\nimport{NativeButtonExample}from\"./board-native/examples/button-example.js\";\nexport{NativeButtonExample}from\"./board-native/examples/button-example.js\";\nimport{NativeButtonGroupExample}from\"./board-native/examples/button-group-example.js\";\nexport{NativeButtonGroupExample}from\"./board-native/examples/button-group-example.js\";\nimport{NativeCarouselExample}from\"./board-native/examples/carousel-example.js\";\nexport{NativeCarouselExample}from\"./board-native/examples/carousel-example.js\";\nimport{NativeCheckboxExample}from\"./board-native/examples/checkbox-example.js\";\nexport{NativeCheckboxExample}from\"./board-native/examples/checkbox-example.js\";\nimport{NativeChipExample}from\"./board-native/examples/chip-example.js\";\nexport{NativeChipExample}from\"./board-native/examples/chip-example.js\";\nimport{NativeCloseButtonExample}from\"./board-native/examples/close-button-example.js\";\nexport{NativeCloseButtonExample}from\"./board-native/examples/close-button-example.js\";\nimport{NativeDatePickerExample}from\"./board-native/examples/date-picker-example.js\";\nexport{NativeDatePickerExample}from\"./board-native/examples/date-picker-example.js\";\nimport{NativeDividerExample}from\"./board-native/examples/divider-example.js\";\nexport{NativeDividerExample}from\"./board-native/examples/divider-example.js\";\nimport{NativeDropdownExample}from\"./board-native/examples/dropdown-example.js\";\nexport{NativeDropdownExample}from\"./board-native/examples/dropdown-example.js\";\nimport{NativeFileUploadExample}from\"./board-native/examples/file-upload-example.js\";\nexport{NativeFileUploadExample}from\"./board-native/examples/file-upload-example.js\";\nimport{NativeIconButtonExample}from\"./board-native/examples/icon-button-example.js\";\nexport{NativeIconButtonExample}from\"./board-native/examples/icon-button-example.js\";\nimport{NativeInputExample}from\"./board-native/examples/input-example.js\";\nexport{NativeInputExample}from\"./board-native/examples/input-example.js\";\nimport{NativeInputOtpExample}from\"./board-native/examples/input-otp-example.js\";\nexport{NativeInputOtpExample}from\"./board-native/examples/input-otp-example.js\";\nimport{NativeLinkButtonExample}from\"./board-native/examples/link-button-example.js\";\nexport{NativeLinkButtonExample}from\"./board-native/examples/link-button-example.js\";\nimport{NativeNotificationExample}from\"./board-native/examples/notification-example.js\";\nexport{NativeNotificationExample}from\"./board-native/examples/notification-example.js\";\nimport{NativePaginationExample}from\"./board-native/examples/pagination-example.js\";\nexport{NativePaginationExample}from\"./board-native/examples/pagination-example.js\";\nimport{NativeRadioExample}from\"./board-native/examples/radio-example.js\";\nexport{NativeRadioExample}from\"./board-native/examples/radio-example.js\";\nimport{NativeSegmentedControlExample}from\"./board-native/examples/segmented-control-example.js\";\nexport{NativeSegmentedControlExample}from\"./board-native/examples/segmented-control-example.js\";\nimport{NativeSelectExample}from\"./board-native/examples/select-example.js\";\nexport{NativeSelectExample}from\"./board-native/examples/select-example.js\";\nimport{NativeSliderExample}from\"./board-native/examples/slider-example.js\";\nexport{NativeSliderExample}from\"./board-native/examples/slider-example.js\";\nimport{NativeSocialButtonExample}from\"./board-native/examples/social-button-example.js\";\nexport{NativeSocialButtonExample}from\"./board-native/examples/social-button-example.js\";\nimport{NativeSwitchExample}from\"./board-native/examples/switch-example.js\";\nexport{NativeSwitchExample}from\"./board-native/examples/switch-example.js\";\nimport{NativeTableExample}from\"./board-native/examples/table-example.js\";\nexport{NativeTableExample}from\"./board-native/examples/table-example.js\";\nimport{NativeTabsExample}from\"./board-native/examples/tabs-example.js\";\nexport{NativeTabsExample}from\"./board-native/examples/tabs-example.js\";\nimport{NativeTextareaExample}from\"./board-native/examples/textarea-example.js\";\nexport{NativeTextareaExample}from\"./board-native/examples/textarea-example.js\";\nimport{NativeTreeViewExample}from\"./board-native/examples/tree-view-example.js\";\nexport{NativeTreeViewExample}from\"./board-native/examples/tree-view-example.js\";\nimport{NativeTooltipExample}from\"./board-native/examples/tooltip-example.js\";\nexport{NativeTooltipExample}from\"./board-native/examples/tooltip-example.js\";\nimport{NativeDataGridDemo as NativeDataGridExample}from\"./board-native/examples/data-grid-example.js\";\nexport{NativeDataGridDemo}from\"./board-native/examples/data-grid-example.js\";\nimport{NativeSettingsModalExample}from\"./board-native/examples/settings-modal-example.js\";\nexport{NativeSettingsModalExample}from\"./board-native/examples/settings-modal-example.js\";\nimport{NativeSidebarExample}from\"./board-native/examples/sidebar-example.js\";\nexport{NativeSidebarExample}from\"./board-native/examples/sidebar-example.js\";\nimport{NativeStatCardsExample}from\"./board-native/examples/stat-cards-example.js\";\nexport{NativeStatCardsExample}from\"./board-native/examples/stat-cards-example.js\";\nimport{NativeDataTableDemo as NativeDataTableExample}from\"./board-native/examples/data-table-example.js\";\nexport{NativeDataTableDemo}from\"./board-native/examples/data-table-example.js\";\nexport const boardNativePages:Record<string,BoardNativePage>={\n\"announcement\":{slug:\"announcement\",title:\"Announcement\",description:\"Dismissible announcement card used in the sidebar footer.\",Preview:NativeAnnouncementExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeAnnouncementExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeAnnouncementExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add this announcement component using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"in-sidebar\", \"title\": \"In the sidebar\", \"description\": \"The card is designed for the foot of the 260px sidebar panel - it's what the sidebar block renders above the user menu.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"variations\", \"title\": \"Variations\", \"description\": \"Every part is optional - swap the icon, drop the description or actionLabel, and toggle dismissible.\", \"code\": \"\", \"hasPreview\": false}]},\n\"avatar\":{slug:\"avatar\",title:\"Avatar\",description:\"Image or initials avatar in multiple sizes and tints.\",Preview:NativeAvatarExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeAvatarExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeAvatarExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add this avatar component using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"sizes\", \"title\": \"Sizes\", \"description\": \"Four sizes via the size prop - xs (20px) through lg (36px). The initials type scale follows the container.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"tints\", \"title\": \"Initial tints\", \"description\": \"Initials render on a neutral or blue surface via the color prop.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"photo\", \"title\": \"Photo\", \"description\": \"Pass src and alt for a photo avatar. Initials act as the fallback while the image loads or if it fails.\", \"code\": \"\", \"hasPreview\": false}]},\n\"breadcrumb\":{slug:\"breadcrumb\",title:\"Breadcrumb\",description:\"Icon-capable breadcrumb trail.\",Preview:NativeBreadcrumbExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeBreadcrumbExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeBreadcrumbExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add this breadcrumb component using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"avatars\", \"title\": \"With avatars\", \"description\": \"Items accept arbitrary leading content - pass an xs Avatar for team/user trails, or an icon component reference for glyphs.\", \"code\": \"\", \"hasPreview\": false}]},\n\"button\":{slug:\"button\",title:\"Button\",description:\"Primary, secondary, ghost, and danger buttons in three sizes with icon support.\",Preview:NativeButtonExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeButtonExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeButtonExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add this button component using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"variants\", \"title\": \"Variants\", \"description\": \"Four variants via the variant prop. Primary and danger use vertical gradients, secondary is a bordered surface, and ghost uses the subtle blue action surface.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"sizes\", \"title\": \"Sizes\", \"description\": \"Three sizes - medium (36px, the default), small (32px), and xs (24px). Icon-only buttons become square at every size.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"icons\", \"title\": \"Icons\", \"description\": \"Pass any Remix Icon component reference to leadingIcon / trailingIcon. Combine iconOnly with an aria-label for square icon buttons.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"disabled\", \"title\": \"Disabled\", \"description\": \"The native disabled attribute switches every variant to its muted disabled surface.\", \"code\": \"\", \"hasPreview\": false}]},\n\"button-group\":{slug:\"button-group\",title:\"Button Group\",description:\"Row of secondary-style buttons fused into one bordered control with hairline dividers and selectable items.\",Preview:NativeButtonGroupExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeButtonGroupExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeButtonGroupExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add this button group component using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"selected\", \"title\": \"Selected item\", \"description\": \"selected keeps an item on its hover fill and sets aria-pressed - drive it from state for single or multi-select toolbars.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"icon-only\", \"title\": \"Icon only\", \"description\": \"iconOnly items collapse to squares - give each an aria-label since there's no visible text.\", \"code\": \"\", \"hasPreview\": false}]},\n\"carousel\":{slug:\"carousel\",title:\"Carousel\",description:\"Gallery carousel built on CSS scroll-snap: swipe, arrows and a position indicator.\",Preview:NativeCarouselExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeCarouselExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeCarouselExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add this carousel using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"sizing\", \"title\": \"Card widths\", \"description\": \"Each item fills the track by default, so exactly one card is in view per slide. Width lives on CarouselItem rather than on the track, so overriding it gives a peek of the next card or a run of mixed widths. Positions are read back from the DOM rather than calculated from a fixed card width, so nothing needs telling when those widths change.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"options\", \"title\": \"Alignment and controls\", \"description\": \"align=\\\"center\\\" rests each card in the middle of the track instead of the left edge, which suits a gallery with one hero card in view. showArrows and showDots strip the chrome back to a bare swipeable track, and gap sets the spacing in pixels.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"accessibility\", \"title\": \"Accessibility\", \"description\": \"The region announces itself as a carousel and takes its name from aria-label, which is required. Each card is labelled with its position, so a screen reader reads \\\"3 of 7\\\" without you numbering anything. The track is focusable, so the arrow keys scroll it, and the prev/next buttons disable at the ends rather than silently doing nothing. Sliding respects prefers-reduced-motion, jumping instead of animating.\", \"code\": \"\", \"hasPreview\": false}]},\n\"checkbox\":{slug:\"checkbox\",title:\"Checkbox\",description:\"React Aria checkbox with animated tick and indeterminate state.\",Preview:NativeCheckboxExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeCheckboxExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeCheckboxExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add this checkbox component using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"sizes\", \"title\": \"Sizes\", \"description\": \"Two sizes via the size prop - md (16px, the default) and sm (14px, used in dense tables).\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"labels\", \"title\": \"Labels & control\", \"description\": \"Pass children for a label - React Aria associates it with the input automatically. Use isSelected + onChange for controlled state, or defaultSelected for uncontrolled.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"card\", \"title\": \"Card\", \"description\": \"Selectable card with a title and optional description - the whole card toggles the checkbox and shows a hover background. It's a separate registry item: npx boardui add checkbox-card.\", \"code\": \"\", \"hasPreview\": false}]},\n\"chip\":{slug:\"chip\",title:\"Chip\",description:\"Status/delta chips in bold and soft variants across the accent palette.\",Preview:NativeChipExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeChipExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeChipExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add this chip component using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"variants\", \"title\": \"Variants & colors\", \"description\": \"Three emphasis levels via variant - each available in seven color pairs via color.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"status-dot\", \"title\": \"StatusDot\", \"description\": \"The StatusDot indicator pairs with chips inside selects and tables. It's a separate registry item: npx boardui add status-dot.\", \"code\": \"\", \"hasPreview\": false}]},\n\"close-button\":{slug:\"close-button\",title:\"Close Button\",description:\"Compact dismiss button for banners, modals, and chips.\",Preview:NativeCloseButtonExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeCloseButtonExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeCloseButtonExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add this close button component using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"sizes\", \"title\": \"Sizes\", \"description\": \"Four sizes via the size prop - 16, 20, 24, and 32px. Always pass an aria-label, the control has no visible text.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"in-context\", \"title\": \"In a modal header\", \"description\": \"Modal title\", \"code\": \"\", \"hasPreview\": false}]},\n\"date-picker\":{slug:\"date-picker\",title:\"Date Picker\",description:\"Single-date picker with month navigation, built on React Aria.\",Preview:NativeDatePickerExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeDatePickerExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeDatePickerExample/></NativeScope>}\",sections:[{\"id\": \"meeting-scheduler\", \"title\": \"Meeting scheduler\", \"description\": \"A Calendly/Cal.com-style booking panel \\u2014 Figma node 3881:7618. Host card and meeting summary on the left, a single-month calendar in the middle (the same MonthPanel from shared.tsx), and a timezone / hour-format / time-slot sidebar on the right. Not a popover \\u2014 a disclosure: the \\\"Schedule a meeting\\\" trigger toggles the whole panel open/closed, with the time-slot list scrolling within a fixed height instead of growing the panel.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add these date pickers using our CLI or manually. Both DateRangePicker and DatePicker import their shared chrome (chevrons, day cell, month panel, editable date chip, trigger/popover surfaces) from shared.tsx, so add that file first.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"quick-select\", \"title\": \"Quick select\", \"description\": \"The sidebar presets are computed from @internationalized/date each time the popover opens (so \\\"Today\\\" stays today). Selecting one updates the pending range and highlights the two months to match \\u2014 it still requires Apply to commit, same as dragging a range directly on the calendar.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"value\", \"title\": \"Controlled & uncontrolled value\", \"description\": \"Pass value + onChange for a controlled range, or defaultValue for uncontrolled. Either way, the popover keeps its own pending draft internally \\u2014 onChange only fires when the user presses Apply; Cancel discards the draft and reverts to the last committed value. The start/end chips in the footer are editable inputs (DD/MM/YYYY) that update the same pending draft.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"disabled\", \"title\": \"Disabled\", \"description\": \"isDisabled dims the trigger button and blocks opening the popover.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"single-date\", \"title\": \"Single date\", \"description\": \"DatePicker is the non-range sibling \\u2014 Figma node 3879:6708. Same trigger, popover, month panel, day-cell rendering, and editable date chip as DateRangePicker (see shared.tsx below), built on a plain react-aria Calendar instead of RangeCalendar. There's only one month, so \\u2014 unlike the dual view, where the two inner chevrons are inert spacers \\u2014 both nav chevrons are fully functional. The Figma frame has no quick-select sidebar.\", \"code\": \"\", \"hasPreview\": false}]},\n\"divider\":{slug:\"divider\",title:\"Divider\",description:\"Horizontal content divider with single-line, double-line, filled, and aligned variants.\",Preview:NativeDividerExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeDividerExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeDividerExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add the divider component using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"variants\", \"title\": \"Variants\", \"description\": \"Choose single, double, or fill. Every treatment uses BoardUI semantic border and surface tokens, so it follows the active theme automatically.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"alignment\", \"title\": \"Alignment\", \"description\": \"The align prop positions content at the start, center, or end. Single-line dividers keep the hairline on the open side.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"custom-content\", \"title\": \"Icons, chips, buttons and avatars\", \"description\": \"Children are not restricted to text. An icon, a chip, a button, a button group, or a stack of avatars all sit in the same slot, and the line closes around whatever width they take. No extra props are involved: the content is composed as children, so anything compact belongs here.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"without-content\", \"title\": \"Without content\", \"description\": \"Omit children for a purely structural separator. In this form the component exposes the native separator role and horizontal orientation to assistive technology.\", \"code\": \"\", \"hasPreview\": false}]},\n\"dropdown\":{slug:\"dropdown\",title:\"Dropdown\",description:\"Composable popover menu (trigger, panel, groups, rows, dividers) built on React Aria \\u2014 the recipe behind the sidebar team/account menus.\",Preview:NativeDropdownExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeDropdownExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeDropdownExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add this dropdown component using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"model-picker\", \"title\": \"Model picker\", \"description\": \"The AI chat composer's model menu: rows act as a radio group - selected keeps the current row highlighted and a radio glyph sits at the row's end via justify-between.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"team-menu\", \"title\": \"Team menu\", \"description\": \"The sidebar's team card menu: a header and footer live alongside DropdownGroups as plain siblings, rows carry trailing badges, and DropdownDivider bleeds through the panel padding between sections.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"account-menu\", \"title\": \"Account menu\", \"description\": \"The sidebar's account switcher: rows render avatars instead of icons, and the panel closes with a pair of secondary buttons - row content is free-form, so anything goes inside a DropdownItem.\", \"code\": \"\", \"hasPreview\": false}]},\n\"file-upload\":{slug:\"file-upload\",title:\"File Upload\",description:\"Drag-and-drop file upload with validation, animated progress, and a completion callback.\",Preview:NativeFileUploadExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeFileUploadExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeFileUploadExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add the file upload component using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"validation\", \"title\": \"Validation\", \"description\": \"Configure accepted file types with allowedExtensions and the size ceiling with maxBytes. The component updates its own helper text and rejection message from those props.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"file-icon\", \"title\": \"File icon\", \"description\": \"The built-in icon follows the selected extension. Use renderFileIcon when your product has its own file-type artwork or icon system.\", \"code\": \"\", \"hasPreview\": false}]},\n\"icon-button\":{slug:\"icon-button\",title:\"Icon Button\",description:\"Square icon-only button in two sizes.\",Preview:NativeIconButtonExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeIconButtonExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeIconButtonExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add this icon button component using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"sizes\", \"title\": \"Sizes & states\", \"description\": \"Pass any Remix Icon component reference via icon, pick a size, and always provide an aria-label - there's no visible text.\", \"code\": \"\", \"hasPreview\": false}]},\n\"input\":{slug:\"input\",title:\"Input\",description:\"Text input with label, hint text, error states, and leading icon support.\",Preview:NativeInputExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeInputExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeInputExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add this input component using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"sizes\", \"title\": \"Sizes\", \"description\": \"\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"states\", \"title\": \"States\", \"description\": \"\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"phone\", \"title\": \"Phone number\", \"description\": \"\", \"code\": \"\", \"hasPreview\": false}]},\n\"input-otp\":{slug:\"input-otp\",title:\"Input OTP\",description:\"One-time-code field with a monospace box per digit, paste distribution and autofill support.\",Preview:NativeInputOtpExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeInputOtpExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeInputOtpExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add this OTP input using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"controlled\", \"title\": \"Controlled value\", \"description\": \"The value is a single string, not an array of characters. Pass value + onChange to control it, or defaultValue to leave it uncontrolled. onComplete fires the moment the last box fills, which is usually where you submit.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"options\", \"title\": \"Length, grouping and states\", \"description\": \"length sets the number of boxes and groupEvery splits them into runs, which makes a long code easier to read back. isInvalid gives the boxes a red edge over the same tint a failed Input uses.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"behaviour\", \"title\": \"Paste and autofill\", \"description\": \"Pasting into any box distributes the digits from that point onward rather than dropping everything but the first character. The same path handles OS autofill: iOS and Chrome deliver the whole code into a single box, so each box carries autoComplete=\\\"one-time-code\\\" and accepts more than one character. Non-digits are stripped throughout, and the boxes use inputMode=\\\"numeric\\\" so phones show a number pad without the spinners and stray characters a number input would bring.\", \"code\": \"\", \"hasPreview\": false}]},\n\"link-button\":{slug:\"link-button\",title:\"Link Button\",description:\"Inline text action styled like a link \\u2014 primary/secondary variants, three sizes, icon support, renders <a> or <button>.\",Preview:NativeLinkButtonExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeLinkButtonExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeLinkButtonExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add this link button component using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"icons-sizes\", \"title\": \"Icons and sizes\", \"description\": \"leadingIcon / trailingIcon take a Remix Icon reference and render at the size's icon scale - 20px for medium, 18px for small, 14px for xs.\", \"code\": \"\", \"hasPreview\": false}]},\n\"notification\":{slug:\"notification\",title:\"Notification\",description:\"Dismissible notification with status icons, avatars, action buttons, and timed countdown.\",Preview:NativeNotificationExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeNotificationExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeNotificationExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add the notification component using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"states\", \"title\": \"States\", \"description\": \"Set status to information, success, or error. Each state supplies the semantic live-region role, default icon, and accent colors.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"visuals\", \"title\": \"Icons and avatars\", \"description\": \"Pass any Remix icon through icon, or replace the icon with an avatar. Avatar notifications can show online, busy, or offline presence.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"actions\", \"title\": \"Action buttons\", \"description\": \"The actions array renders small BoardUI buttons and supports primary, secondary, and danger variants.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"position\", \"title\": \"Position\", \"description\": \"Use the position prop on NotificationViewport to anchor the stack to any corner or horizontal center of the browser viewport.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"countdown\", \"title\": \"Timed dismissal\", \"description\": \"Set autoDismissDuration in milliseconds to show a synchronized 3px countdown bar and dismiss the notification when it reaches zero. Use NotificationViewport to portal repeated notifications to a smoothly animated stack at the edge of the browser viewport.\", \"code\": \"\", \"hasPreview\": false}]},\n\"pagination\":{slug:\"pagination\",title:\"Pagination\",description:\"Numbered pagination with prev/next and ellipsis collapsing.\",Preview:NativePaginationExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativePaginationExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativePaginationExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add this pagination component using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}]},\n\"radio\":{slug:\"radio\",title:\"Radio\",description:\"React Aria radio group with the gradient selected dot, two sizes, and the bare RadioDot glyph for menu rows.\",Preview:NativeRadioExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeRadioExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeRadioExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add this radio component using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"sizes\", \"title\": \"Sizes\", \"description\": \"Two sizes via the size prop - md (16px, the default) and sm (14px, the Figma radio_selected_sm glyph used inside menus), paired with Body 2 labels.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"card\", \"title\": \"Radio card\", \"description\": \"Selectable card with a title and optional description - the whole card selects the radio, matching Checkbox Card's surface. Cards live inside a RadioGroup for single selection and arrow-key navigation. It's a separate registry item: npx boardui add radio-card.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"menu-rows\", \"title\": \"In menu rows\", \"description\": \"Menu rows that act as a radio group (like the Dropdown component's model picker) manage selection on the row itself, so they render the bare RadioDot glyph - presentation only, no nested focusable control.\", \"code\": \"\", \"hasPreview\": false}]},\n\"segmented-control\":{slug:\"segmented-control\",title:\"Segmented Control\",description:\"Pill-style segmented control (Weekly / Monthly / Yearly switchers).\",Preview:NativeSegmentedControlExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeSegmentedControlExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeSegmentedControlExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add this segmented control using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"controlled\", \"title\": \"Controlled selection\", \"description\": \"Selection uses React Aria's key-set API: pass selectedKeys + onSelectionChange to control it, or defaultSelectedKeys for uncontrolled. Guard against empty sets to keep one segment always active.\", \"code\": \"\", \"hasPreview\": false}]},\n\"select\":{slug:\"select\",title:\"Select\",description:\"React Aria select with styled trigger, non-modal popover, and free-form item content.\",Preview:NativeSelectExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeSelectExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeSelectExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add this select component using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"status\", \"title\": \"With status dot\", \"description\": \"Items render arbitrary children next to the label - always pass textValue so typeahead and the trigger label stay correct.\", \"code\": \"\", \"hasPreview\": false}]},\n\"slider\":{slug:\"slider\",title:\"Slider\",description:\"Single-value and min/max range sliders with exact-value bubbles and keyboard controls.\",Preview:NativeSliderExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeSliderExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeSliderExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add the slider component using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"range\", \"title\": \"Min and max range\", \"description\": \"RangeSlider renders two labeled thumbs. The selected interval fills between them, each bubble shows its exact value, and the thumbs cannot cross. Use minValue, maxValue, and step to define the allowed range.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"controlled\", \"title\": \"Controlled values\", \"description\": \"Use value and onChange for live controlled state. onChangeEnd fires after dragging or keyboard input finishes, which is useful for saving a value without sending an update for every movement.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"states\", \"title\": \"Value bubbles and states\", \"description\": \"Exact-value bubbles are visible by default. Format them with formatValue, or set showTooltip=false when the value already appears elsewhere. Disabled sliders retain their values and accessible labels while preventing input.\", \"code\": \"\", \"hasPreview\": false}]},\n\"social-button\":{slug:\"social-button\",title:\"Social Button\",description:\"Sign-in buttons for 24 providers, with brand logos, three colour treatments and an icon-only form.\",Preview:NativeSocialButtonExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeSocialButtonExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeSocialButtonExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add the social button component using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"brands\", \"title\": \"Brands\", \"description\": \"All 24 logos ship inline with the component, so an install pulls no icon package. The full-colour marks come from SVG Logos (CC0), the monochrome glyphs from Simple Icons (CC0), and the four brands Simple Icons no longer carries from Bootstrap Icons (MIT). Amazon has no full-colour mark upstream, so under white it falls back to its brand-tinted glyph.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"appearance\", \"title\": \"Appearance\", \"description\": \"colorful is the default: the brand's own colour in the same gradient-and-shadow recipe as the primary Button, so it reads as a BoardUI control rather than a pasted-in widget. black is the same shape in high-contrast solid. white is outlined, and the only one that shows each provider's real multi-colour mark, since on a saturated fill that artwork would fight the background. For a stack of several providers, prefer white: a column of competing brand fills makes no single option readable.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"sizes\", \"title\": \"Sizes\", \"description\": \"medium (36px) and small(32px) are the base Button's own sizes to the pixel, radius and glyph size included, so these sit in a form beside a Button without a half-step in the rhythm. Both carry a fixed width (300px and 250px) so a column of providers lines up on its own; fullWidth hands that back to the container.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"icon-only\", \"title\": \"Icon only\", \"description\": \"A square button showing just the logo, for the row of alternatives under an email field. The brand name moves to aria-label, so the control still announces itself.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"custom-brand\", \"title\": \"Custom brand\", \"description\": \"For an identity provider that is not built in, pass brand=\\\"custom\\\" with a config. Only icon is required: label defaults to SSO and color to black.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"labels\", \"title\": \"Labels\", \"description\": \"The default label is Continue with <Brand>. Pass children to say something else, since a sign-up screen and a login screen usually want different wording.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"links\", \"title\": \"Buttons and links\", \"description\": \"Passing href renders an anchor instead of a button. Most OAuth flows start by navigating to a provider URL, and an anchor gives that the right semantics, middle-click and keyboard behaviour for free.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"trademarks\", \"title\": \"Trademarks\", \"description\": \"The logos are trademarks of their respective owners, included here so you can build a sign-in screen. Several providers publish rules for their login buttons covering colour, clear space and wording, Google and Apple in particular, so check those before shipping a production login.\", \"code\": \"\", \"hasPreview\": false}]},\n\"switch\":{slug:\"switch\",title:\"Switch\",description:\"Skeuomorphic toggle switch in two sizes.\",Preview:NativeSwitchExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeSwitchExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeSwitchExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add this switch component using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"shapes\", \"title\": \"Shapes\", \"description\": \"Two shapes via the shape prop. pill (the default) is fully rounded; rectangle uses radius/md on the track and radius/xs on the thumb, both scaled per size. The thumb's inner chip follows the same shape.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"sizes\", \"title\": \"Sizes\", \"description\": \"Three sizes via the size prop - lg (56\\u00d732), md (42\\u00d724, the default) and sm (28\\u00d716). The thumb, padding, travel distance and the on-state ring all scale together.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"states\", \"title\": \"States & labels\", \"description\": \"Use isSelected + onChange for a controlled switch, or defaultSelected for uncontrolled. isDisabled dims the control to 50%. Pass children for a label - React Aria associates it with the input, so clicking the text toggles the switch.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"card\", \"title\": \"Card\", \"description\": \"Selectable settings card - an optional 24\\u00d724 leading icon, a title and short description on the left, and the switch on the right. The whole card toggles and shows a hover background, the switch counterpart to CheckboxCard. Pass any Remix icon via icon to SwitchCard.\", \"code\": \"\", \"hasPreview\": false}]},\n\"table\":{slug:\"table\",title:\"Table\",description:\"Static table primitives matching the dashboard tables.\",Preview:NativeTableExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeTableExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeTableExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add this table component using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"sizes\", \"title\": \"Sizes\", \"description\": \"The table comes in 2 sizes: md (normal) and sm (compact, with tighter padding and smaller avatars). Switch between them by changing the size prop on the Table component - try the Normal / Compact toggle in the preview above.\", \"code\": \"\", \"hasPreview\": false}]},\n\"tabs\":{slug:\"tabs\",title:\"Tabs\",description:\"Underline and pill tab variants built on React Aria.\",Preview:NativeTabsExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeTabsExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeTabsExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add this tabs component using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"pill-tabs\", \"title\": \"Pill tabs\", \"description\": \"PillTab is the fully-rounded sibling for switching local views rather than routed panels. It ships in two styles: blue (the default - the AI chat panel's Changes/Browser switcher) and the quieter gray, used for scope and filter rows like the settings Tools page. Both share the same idle and hover treatment; only the selected pill differs.\", \"code\": \"\", \"hasPreview\": false}]},\n\"textarea\":{slug:\"textarea\",title:\"Textarea\",description:\"Multiline text field with auto-grow, character count, and Input's label, hint and states.\",Preview:NativeTextareaExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeTextareaExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeTextareaExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add the textarea component using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"sizes\", \"title\": \"Sizes\", \"description\": \"medium and small match Input's insets, so the two components stack in a form without a seam. rows sets the resting height.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"auto-resize\", \"title\": \"Auto resize\", \"description\": \"autoResize grows the field with its text, one line at a time, between rows and maxRows. Past the ceiling it scrolls. The height is measured from zero on every change, so the field shrinks back when text is deleted.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"character-count\", \"title\": \"Character count\", \"description\": \"showCount puts the counter on the hint row. With maxLength it reads 12/160 and the browser enforces the limit; without one it just counts.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"states\", \"title\": \"States\", \"description\": \"Hover and focus cross-fade the ring. isDisabled and isInvalid override both and repaint the field, hint and label. resize=\\\"none\\\" removes the native grab handle when a fixed height matters more than the reader's comfort.\", \"code\": \"\", \"hasPreview\": false}]},\n\"tree-view\":{slug:\"tree-view\",title:\"Tree View\",description:\"Nested folders and structured content with expandable branches, selection, guide lines, and keyboard navigation.\",Preview:NativeTreeViewExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeTreeViewExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeTreeViewExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add the tree view using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"controlled\", \"title\": \"Controlled and data-driven\", \"description\": \"Keep expansion and selection in your own state with expandedKeys and selectedKeys. Use TreeViewCollection to recursively render nested data. Every item needs a unique, stable id.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"multiple-selection\", \"title\": \"Multiple selection\", \"description\": \"Set selectionMode=\\\"multiple\\\" to toggle items independently. Hold Shift to select a range with the keyboard. Single selection is the default; use selectionMode=\\\"none\\\" with onAction for an action-only tree.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"sizes-and-states\", \"title\": \"Sizes, icons, and states\", \"description\": \"Use size=\\\"sm\\\" for compact rows and showGuides={false} to hide guide lines. Branches get folder icons automatically; pass a Remix Icon component to icon or expandedIcon to customize them. Disabled items prevent interaction, and renderEmptyState supplies an empty message.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"rtl\", \"title\": \"Right-to-left\", \"description\": \"Set the locale with DirectionProvider. Indentation, guide lines, disclosure icons, and horizontal keyboard navigation follow the reading direction.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"keyboard\", \"title\": \"Keyboard navigation\", \"description\": \"Tab into the tree, then use Up and Down to move through visible items. Right expands a branch or moves to its first child; Left collapses it or returns to its parent. Home and End jump to the first and last visible items. Type a label to find it, and press Space to select.\", \"code\": \"\", \"hasPreview\": false}]},\n\"tooltip\":{slug:\"tooltip\",title:\"Tooltip\",description:\"Light-surface tooltip built on React Aria.\",Preview:NativeTooltipExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeTooltipExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeTooltipExample/></NativeScope>}\",sections:[{\"id\": \"positions\", \"title\": \"Positions\", \"description\": \"A tooltip can sit on any side of its trigger - set the placement prop on Tooltip to top (default), bottom, left or right. The caret and the blur-in transform rotate to match, and React Aria automatically flips to the opposite side if there isn't room on-screen. Hover the buttons below.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add this tooltip component using our CLI or manually:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"sizes\", \"title\": \"Sizes\", \"description\": \"The tooltip comes in 2 sizes: sm (12px Caption 1, the default - used by the Contributions heatmap) and md (14px Body 1, with roomier padding). Switch by changing the size prop on the Tooltip - compare the Small and Medium triggers in the preview above.\", \"code\": \"\", \"hasPreview\": false}]},\n\"data-grid\":{slug:\"data-grid\",title:\"Data Grid\",description:\"Virtualized spreadsheet with editable cells, range selection, filters, resizable columns, undo and redo, summaries, and CSV export.\",Preview:NativeDataGridExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeDataGridDemo}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeDataGridDemo/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"Add the free Data Grid with our CLI. It includes the BoardUI controls and private data helpers it uses:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"columns\", \"title\": \"Columns and editing\", \"description\": \"Pass typed columns, your data, and a unique, stable getRowId. Provide onDataChange to enable editing. Text, number, and select editors reuse BoardUI inputs and selects. Set bounds with min and max, or reject values with validate.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"controls\", \"title\": \"Search, filter, and export\", \"description\": \"Search across all columns, click a heading to cycle through ascending, descending, and original order, or filter by exact values. Select columns automatically appear in the Filter menu; add filterable to other columns. Hide columns, resize their dividers, and switch between comfortable and compact rows.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"keyboard\", \"title\": \"Keyboard and clipboard\", \"description\": \"Tab into the grid and use arrow keys to move between cells. Hold Shift to extend a range, or drag across cells with the mouse. Home and End move across a row; add \\u2318 or Ctrl to jump to the first or last record. Page Up and Page Down move by a viewport. \\u2318/Ctrl+A selects all cells.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"large-datasets\", \"title\": \"10,000 rows, a small viewport\", \"description\": \"The preview above contains 10,000 actual records. Fixed-height virtualization mounts only the rows in and around the viewport. The header and summary remain outside the scrolling body; a progressive blur softens the top edge as you scroll. Set height to change the viewport height.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"rtl\", \"title\": \"Right-to-left and read-only\", \"description\": \"Use DirectionProvider to set the reading direction. This read-only example freezes the first column on the right and mirrors horizontal keyboard navigation. Your column labels and record values can use any language.\", \"code\": \"\", \"hasPreview\": false}]},\n\"settings-modal\":{slug:\"settings-modal\",title:\"Settings Modal\",description:\"Controlled multi-page settings dialog with General, Profile, Tools, and Storage views.\",Preview:NativeSettingsModalExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeSettingsModalExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeSettingsModalExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"Settings Modal is a multi-file application block with several base-component dependencies. Install it through the CLI so the complete settings folder, shared components, hooks, styles, and npm packages are resolved together:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"triggering\", \"title\": \"Triggering the modal\", \"description\": \"The block deliberately does not render its own trigger. Keep isOpen in the host that owns the action - such as a sidebar, user menu, or settings button - and close it through onClose. Backdrop presses, Escape, and the close button all call the same handler.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"initial-page\", \"title\": \"Initial page\", \"description\": \"Use defaultPage when a contextual action should open directly to General, Profile, Tools, or Storage. The selected page resets to that value each time the dialog opens.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"plan-artwork\", \"title\": \"Plan artwork\", \"description\": \"The General view includes a component-native abstract treatment by default. Pass your own public image through planArtSrc to feed the animated Current plan artwork without coupling the installed block to BoardUI assets.\", \"code\": \"\", \"hasPreview\": false}]},\n\"sidebar\":{slug:\"sidebar\",title:\"Sidebar\",description:\"The floating dashboard sidebar with team menu, nav, announcement, and user menu.\",Preview:NativeSidebarExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeSidebarExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeSidebarExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add this sidebar block using our CLI or manually. The CLI also installs the avatar, badge, kbd, and announcement components it composes:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"ai-chat-variant\", \"title\": \"AI chat variant\", \"description\": \"The same floating panel tweaked for the AI Chat template: quick actions up top (New agent, Automations, Customize), a Repositories tree whose open repo lists recent chats with relative-time chips and a curved tree connector, and a plan card with an Upgrade button instead of the team menu. Ships with the AI Chat Pro template.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"composition\", \"title\": \"Composition\", \"description\": \"The sidebar composes several smaller registry items - avatar, badge, kbd, announcement, and the chevron glyphs - plus its own team and user menus. Installing it with the CLI pulls the whole chain automatically; swap the nav items and menus with your own routes and data.\", \"code\": \"\", \"hasPreview\": false}]},\n\"stat-cards\":{slug:\"stat-cards\",title:\"Stat Cards\",description:\"KPI stat card row with delta chips.\",Preview:NativeStatCardsExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeStatCardsExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeStatCardsExample/></NativeScope>}\",sections:[{\"id\": \"installation\", \"title\": \"Installation\", \"description\": \"You can add the stat cards using our CLI or manually. The CLI also pulls the chip and tooltip primitives they compose:\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"variants\", \"title\": \"Variants\", \"description\": \"Two looks via the variant prop. plain (the default) is the compact card from the dashboard templates - neutral icon tile, label, value, and a delta chip. footer leads with a tinted gradient icon tile beside the label, sets the value at display size, and moves the comparison into a footer band with a white delta pill whose glyph follows deltaColor.\", \"code\": \"\", \"hasPreview\": false}, {\"id\": \"data\", \"title\": \"Bring your own data\", \"description\": \"Pass stats to replace the demo metrics. The footer variant reads three extra optional fields per stat: tone tints the icon tile (blue, orange, purple, pink, sky, or emerald), caption swaps the footer text, and hint adds an info glyph with a tooltip.\", \"code\": \"\", \"hasPreview\": false}]},\n\"data-table\":{slug:\"data-table\",title:\"Data Table\",description:\"TanStack-powered data table with sorting, selection, and pagination.\",Preview:NativeDataTableExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeDataTableDemo}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeDataTableDemo/></NativeScope>}\",sections:[]}\n};\nimport{NativeBadgeExample}from'./board-native/examples/badge-example.js';\nexport{NativeBadgeExample}from'./board-native/examples/badge-example.js';\nboardNativePages.badge={slug:'badge',title:'Badge',description:'Compact counter pills and keyboard shortcut hints.',Preview:NativeBadgeExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeBadgeExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeBadgeExample/></NativeScope>}\",sections:[{id:'colors',title:'Colors',description:'Neutral counters sit on light surfaces; primary is tuned for gradient surfaces and selected navigation items.',hasPreview:false,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeBadge}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeBadge>91</NativeBadge><NativeBadge color='primary'>152</NativeBadge></NativeScope>}\"},{id:'kbd',title:'Kbd',description:'The Kbd shortcut hint shares the badge shape.',hasPreview:true}]};\nimport{NativeThemeToggleExample}from'./board-native/examples/theme-toggle-example.js';\nexport{NativeThemeToggleExample}from'./board-native/examples/theme-toggle-example.js';\nboardNativePages['theme-toggle']={slug:'theme-toggle',title:'Theme Toggle',description:'A manual light/dark control for application sidebars. The next theme reveals smoothly from the exact interaction point, the user’s choice persists locally, and reduced-motion or unsupported browsers fall back to an immediate switch.',Preview:NativeThemeToggleExample,code:\"import '@helios-ui/react/styles.css';\\nimport{NativeScope,NativeThemeToggleExample}from'@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeThemeToggleExample/></NativeScope>}\",sections:[{\"id\": \"project-setup\", \"title\": \"Project setup\", \"description\": \"Light is the default. Restore the saved helios-ui-theme value on document.body before React hydrates, and add suppressHydrationWarning to the body because its theme class is set in the browser.\", \"hasPreview\": false, \"code\": \"import type {ReactNode} from 'react';\\nimport '@helios-ui/react/styles.css';\\nconst themeScript='(function(){try{document.body.classList.toggle(\\\"dark\\\",localStorage.getItem(\\\"helios-ui-theme\\\")===\\\"dark\\\")}catch(e){document.body.classList.remove(\\\"dark\\\")}})();';\\nexport default function RootLayout({children}:{children:ReactNode}){return <html lang=\\\"en\\\"><body suppressHydrationWarning><script dangerouslySetInnerHTML={{__html:themeScript}}/>{children}</body></html>}\\n\"}, {\"id\": \"collapsed\", \"title\": \"Collapsed sidebar\", \"description\": \"Set collapsed for a 36px icon-only control that fits a compact sidebar rail while keeping the same accessible pressed state.\", \"hasPreview\": false, \"code\": \"import '@helios-ui/react/styles.css';\\nimport {NativeScope,NativeThemeToggle} from '@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeThemeToggle collapsed/></NativeScope>}\"}]};\nfor(const page of Object.values(boardNativePages)){page.sections=page.sections.filter(section=>section.id!=='table-of-contents');for(const section of page.sections){const copy=(nativeSectionCopy as Record<string,{description:string;descriptionParts:{kind:string;text:string}[]}>)[page.slug+'/'+section.id];if(copy){section.description=copy.description;section.descriptionParts=copy.descriptionParts}if((nativeContractCode as Record<string,string>)[page.slug+'/'+section.id])section.code=(nativeContractCode as Record<string,string>)[page.slug+'/'+section.id];if(sectionFrames[page.slug+'/'+section.id]){section.hasPreview=true;section.code=\"import '@helios-ui/react/styles.css';\\nimport{BoardNativeSectionExample}from'@helios-ui/react';\\nexport function Example(){return <BoardNativeSectionExample slug=\"+JSON.stringify(page.slug)+\" id=\"+JSON.stringify(section.id)+\"/>}\";}}}\nboardNativePages['date-picker'].description='Dual-month date range picker with quick-select presets, editable dates and Cancel/Apply, plus a single-date variant.';\nexport function getBoardNativePage(slug:string){return boardNativePages[slug.replace('/components/','')]}\nexport function BoardNativePreview({slug}:{slug:string}){const page=getBoardNativePage(slug);if(!page)return null;const Preview=page.Preview;return <NativeScope><Preview/></NativeScope>}\nexport function BoardNativeSection({slug,id}:{slug:string;id:string}){const page=getBoardNativePage(slug);const section=page?.sections.find(section=>section.id===id);if(!section?.hasPreview)return null;return <BoardNativeSectionExample slug={slug}id={id}/>}\nexport function BoardNativeCatalogPreview({slug}:{slug:string}){const Preview=nativeCatalogPreviews['/components/'+slug.replace('/components/','')];return <NativeScope><div className=\"relative size-full group/card\">{Preview?<Preview/>:<BoardNativePreview slug={slug}/>}</div></NativeScope>}\n",
  "src/BoardNativeVariants.tsx": "'use client';\n/* Source-observed public documentation compositions. MIT upstream primitives: board-native/LICENSE. */\nimport{useState,type ReactNode}from'react';\nimport{Focusable,TooltipTrigger,type Selection,type Key}from'react-aria-components';\nimport{RiAddLine,RiArrowRightLine,RiBold,RiItalic,RiUnderline,RiListCheck,RiGridLine,RiTableLine,RiHomeLine,RiEditLine,RiExternalLinkLine,RiDownloadLine,RiSparklingFill,RiShieldKeyholeLine,RiMoonLine,RiNotification4Line,RiFolder3Line,RiArrowDownLine,RiArrowUpLine,RiMailLine,RiInformationLine,RiGroupLine,RiBox3Line,RiEmotionHappyLine,RiQuestionLine}from'@remixicon/react';\nimport*as N from'./board-native/exports.js';\nimport{ObservedListIcon,ObservedGridIcon,ObservedTableIcon,ObservedChangesIcon,ObservedBrowserIcon,ObservedIconNotifications,ObservedIconEdit,ObservedIconDisabled,ObservedIconDelete,ObservedIconMore,ObservedBackupIcon,ObservedWeeklyIcon}from'./board-native/observed-doc-icons.js';\nimport{NativeScope}from'./board-native/NativeScope.js';\nimport{useNativeAction}from'./board-native/NativeEnvironment.js';\nimport countries from'./board-native/phone-countries.json';\nimport{RepositorySidebarSnippet}from'./BoardTemplates.js';\nimport{NativeCarouselExample}from'./board-native/examples/carousel-example.js';\nconst avatar='/react/assets/board-native/avatars/livia-saris.webp';\nconst row='flex flex-wrap items-center justify-center gap-3';\nconst stack='flex w-full max-w-[420px] flex-col gap-4';\nfunction download(){const url=URL.createObjectURL(new Blob(['name,status\\nHelios preview,ready\\n'],{type:'text/csv'}));const a=document.createElement('a');a.href=url;a.download='helios-preview.csv';a.click();setTimeout(()=>URL.revokeObjectURL(url),1000)}\nfunction CountryFlag({code}:{code:string}){return <img src={'/react/assets/board-native/flags/'+code+'.svg'}alt={code}className=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"/>}\nfunction PhoneField({filled=false}:{filled?:boolean}){const[country,setCountry]=useState('US');const item=countries.find(c=>c.value===country)??countries[0];return <N.NativeInput label=\"Phone Number\"isRequired tooltip hint=\"This is a hint about this input.\"type=\"tel\"trailingIcon={RiQuestionLine}placeholder=\"(123) 000-0000\"defaultValue={filled?'(415) 555-0132':undefined}leadingAddon={<N.NativeSelect aria-label=\"Country code\"selectedKey={country}onSelectionChange={key=>setCountry(String(key))}renderValue={()=><span className=\"flex items-center gap-1.5\"><CountryFlag code={country}/><span>{item.trigger}</span></span>}triggerClassName=\"h-7 border-0 bg-transparent px-1.5 shadow-none\">{countries.map(c=><N.NativeSelectItem key={c.value}id={c.value}textValue={c.label}><CountryFlag code={c.value}/>{c.label}<span className=\"ms-auto text-text-secondary\">{c.trigger}</span></N.NativeSelectItem>)}</N.NativeSelect>}/>}\nfunction PhoneInputs(){return <div className=\"flex w-[280px] flex-col gap-5\"><PhoneField/><PhoneField filled/></div>}\nfunction TreeSection({id}:{id:string}){const[multiple,setMultiple]=useState<Selection>(new Set(['overview','guidelines']));const[expanded,setExpanded]=useState<Set<Key>>(new Set(['design','brand']));const[selected,setSelected]=useState<Selection>(new Set(['logo']));if(id==='multiple-selection')return <div className=\"flex w-full max-w-sm flex-col gap-3\"><N.NativeTreeView aria-label=\"Documents to share\"selectionMode=\"multiple\"defaultExpandedKeys={['documents']}selectedKeys={multiple}onSelectionChange={setMultiple}className=\"w-full max-w-sm\"><N.NativeTreeViewItem id=\"documents\"label=\"Documents\"trailingContent=\"3 files\"><N.NativeTreeViewItem id=\"overview\"label=\"Overview.md\"/><N.NativeTreeViewItem id=\"guidelines\"label=\"Guidelines.md\"/><N.NativeTreeViewItem id=\"changelog\"label=\"Changelog.md\"/></N.NativeTreeViewItem></N.NativeTreeView><output className=\"text-body-2-regular text-text-tertiary\">{multiple==='all'?3:multiple.size} items selected</output></div>;\nif(id==='rtl')return <N.NativeDirectionProvider locale=\"ar\"><N.NativeTreeView aria-label=\"ملفات المشروع\"defaultExpandedKeys={['project']}className=\"w-full max-w-sm\"><N.NativeTreeViewItem id=\"project\"label=\"المشروع\"><N.NativeTreeViewItem id=\"design\"label=\"التصميم\"><N.NativeTreeViewItem id=\"logo\"label=\"الشعار.svg\"/></N.NativeTreeViewItem><N.NativeTreeViewItem id=\"notes\"label=\"الملاحظات.md\"/></N.NativeTreeViewItem></N.NativeTreeView></N.NativeDirectionProvider>;\nif(id==='sizes-and-states')return <div className=\"grid w-full gap-4 sm:grid-cols-2\"><N.NativeTreeView aria-label=\"Repository files\"defaultExpandedKeys={['project']}size=\"sm\"showGuides={false}><N.NativeTreeViewItem id=\"project\"label=\"Project\"><N.NativeTreeViewItem id=\"index\"label=\"index.tsx\"/></N.NativeTreeViewItem><N.NativeTreeViewItem id=\"private\"label=\"Private files\"isDisabled trailingContent=\"Restricted\"/><N.NativeTreeViewItem id=\"archive\"label=\"Archive\"icon={RiFolder3Line}trailingContent=\"Empty\"/></N.NativeTreeView><N.NativeTreeView aria-label=\"Search results\"renderEmptyState={()=>'No matching files.'}>{[]}</N.NativeTreeView></div>;\nreturn <div className=\"flex w-full max-w-sm flex-col gap-3\"><div className=\"flex items-center justify-between\"><span className=\"text-body-medium text-text-primary\">Workspace</span><N.NativeButton variant=\"secondary\"size=\"xs\"onClick={()=>setExpanded(expanded.size?new Set():new Set(['design','brand']))}>{expanded.size?'Collapse all':'Expand all'}</N.NativeButton></div><N.NativeTreeView aria-label=\"Workspace files\"expandedKeys={expanded}onExpandedChange={setExpanded}selectedKeys={selected}onSelectionChange={setSelected}><N.NativeTreeViewItem id=\"design\"label=\"Design\"><N.NativeTreeViewItem id=\"brand\"label=\"Brand assets\"><N.NativeTreeViewItem id=\"logo\"label=\"Logo.svg\"/><N.NativeTreeViewItem id=\"colors\"label=\"Colors.fig\"/></N.NativeTreeViewItem><N.NativeTreeViewItem id=\"wireframes\"label=\"Wireframes.fig\"/></N.NativeTreeViewItem><N.NativeTreeViewItem id=\"notes\"label=\"Project notes.md\"/></N.NativeTreeView><output className=\"text-body-2-regular text-text-tertiary\">Selected: {selected==='all'?'all':[...selected].join(', ')||'none'}</output></div>}\nfunction NotificationSection({id}:{id:string}){const[visible,setVisible]=useState(true),[position,setPosition]=useState<N.NativeNotificationPosition>('top-center'),[notifications,setNotifications]=useState<{id:number,status:N.NativeNotificationStatus,kind?:string}[]>([]);if(id==='states')return <div className=\"grid w-full gap-4 xl:grid-cols-3\">{([['information','New version available','Refresh to start using the latest dashboard updates.'],['success','Changes saved','Your workspace settings have been updated.'],['error','Upload failed','The file could not be uploaded. Check its size and try again.']]as const).map(([status,title,description])=><N.NativeNotification key={status}dismissible={false}status={status}title={title}description={description}/>)}</div>;\nif(id==='visuals')return <div className=\"grid w-full gap-4 lg:grid-cols-2\"><N.NativeNotification dismissible={false}icon={RiSparklingFill}title=\"Custom icon\"description=\"Use any Remix icon while keeping the selected status colors.\"/><N.NativeNotification dismissible={false}avatar={{src:avatar,alt:'Livia Saris',presence:'busy'}}title=\"Livia Saris\"timestamp=\"just now\"description=\"Mentioned you in the launch checklist.\"/></div>;\nif(id==='actions')return <div className=\"w-full max-w-[520px]\">{visible?<N.NativeNotification dismissible={false}icon={ObservedBackupIcon}status=\"information\"title=\"Backup ready\"description=\"Your latest workspace backup is ready to download.\"actions={[{label:'Not now',variant:'secondary',onClick:()=>setVisible(false)},{label:'Download',variant:'primary',onClick:download}]}onDismiss={()=>setVisible(false)}/>:<N.NativeButton variant=\"secondary\"onClick={()=>setVisible(true)}>Replay notification</N.NativeButton>}</div>;\nconst show=(kind:string)=>setNotifications(current=>[...current,{id:Date.now()+Math.random(),status:kind==='error'?'error':kind==='information'?'information':'success',kind}]);return <><div className={id==='position'?'flex min-h-32 w-full flex-wrap items-center justify-center gap-2':'flex min-h-28 w-full flex-wrap items-center justify-center gap-2'}>{id==='position'?(['top-left','top-center','top-right','bottom-left','bottom-center','bottom-right']as const).map(p=><N.NativeButton key={p}size=\"small\"variant=\"secondary\"onClick={()=>{setPosition(p);show('information')}}>{p.replaceAll('-',' ').replace(/^./,char=>char.toUpperCase())}</N.NativeButton>):['Replay notification','Information','Error','With avatar','With buttons'].map((label,index)=><N.NativeButton key={label}size=\"small\"variant=\"secondary\"onClick={()=>show(['success','information','error','avatar','actions'][index])}>{label}</N.NativeButton>)}</div><N.NativeNotificationViewport position={position}>{notifications.map(item=><N.NativeNotification key={item.id}status={item.status}title={item.kind==='avatar'?'Livia Saris':'New version available'}description=\"Your local preview is ready.\"avatar={item.kind==='avatar'?{src:avatar,alt:'Livia Saris'}:undefined}actions={item.kind==='actions'?[{label:'Download',onClick:download}]:undefined}autoDismissDuration={2500}introDelay={0}onDismiss={()=>setNotifications(current=>current.filter(n=>n.id!==item.id))}/>)}</N.NativeNotificationViewport></>}\nfunction SectionBody({slug,id}:{slug:string;id:string}){const report=useNativeAction();const[choice,setChoice]=useState('list'),[secondaryChoice,setSecondaryChoice]=useState('Home'),[closed,setClosed]=useState(false),[open,setOpen]=useState(false),[range,setRange]=useState<N.NativeDateRangeValue|null>(null),[model,setModel]=useState('Fable 5'),[format,setFormat]=useState<string[]>([]);const action=(label:string)=>()=>report({label,description:'This is a local component preview. No external provider was connected and checkout remains closed.'});const key=slug+'/'+id;\nif(slug==='tree-view')return <TreeSection id={id}/>;if(slug==='notification')return <NotificationSection id={id}/>;\nswitch(key){\ncase'sidebar/ai-chat-variant':return <div className=\"flex h-[780px] w-full items-stretch justify-center overflow-hidden rounded-2xl bg-background-secondary-default p-2\"><RepositorySidebarSnippet/></div>;\ncase'carousel/options':return <NativeCarouselExample/>;\ncase'input-otp/options':return <div className=\"flex flex-col gap-5\"><N.NativeInputOtp length={4}defaultValue=\"8213\"aria-label=\"Four digit PIN\"/><N.NativeInputOtp groupEvery={3}defaultValue=\"204915\"aria-label=\"Grouped code\"/><N.NativeInputOtp isInvalid defaultValue=\"204915\"aria-label=\"Invalid code\"/><N.NativeInputOtp isDisabled defaultValue=\"204915\"aria-label=\"Disabled code\"/></div>;\ncase'data-grid/rtl':return <N.NativeDirectionProvider locale=\"ar\"><N.NativeDataGrid aria-label=\"الحسابات\"data={[{id:'northwind',account:'نورث ويند',region:'أوروبا',seats:40},{id:'lumen',account:'لومن',region:'آسيا',seats:105}]}columns={[{key:'account',header:'الحساب',width:220},{key:'region',header:'المنطقة',width:180},{key:'seats',header:'المقاعد',type:'number',width:120,summary:'sum'}]}getRowId={row=>row.id}height={132}/></N.NativeDirectionProvider>;\n\ncase'announcement/in-sidebar':return <div className=\"flex w-[260px] flex-col justify-end rounded-3xl border border-border-button-white bg-background-secondary-default p-3 shadow-sidebar\"><N.NativeAnnouncement title=\"Setting up your account\"description=\"Take the tour and learn how to use our product.\"actionLabel=\"Take the tour\"dismissible onAction={action('Take the tour')}/></div>;\ncase'announcement/variations':return <div className=\"flex flex-wrap items-start justify-center gap-6\">{[{title:\"What's new in v2\",description:'Charts, command menu, and a brand-new data table.',actionLabel:'See the changelog',icon:RiSparklingFill},{title:\"You're all set\",description:'Your workspace is ready to go.',dismissible:true},{title:'2 seats left on your plan',actionLabel:'Upgrade'}].map(p=><div key={p.title}className=\"w-[236px]\"><N.NativeAnnouncement {...p}onAction={action(p.actionLabel??p.title)}/></div>)}</div>;\ncase'avatar/sizes':case'avatar/tints':case'avatar/photo':return <div className=\"contents\">{(['xs','sm','md','lg']as const).map(size=><N.NativeAvatar key={size}size={size}color={id==='tints'?'blue':'neutral'}initials={id==='tints'?'B':'M'}src={id==='photo'?avatar:undefined}alt={id==='photo'?'Livia Saris':undefined}/>)}</div>;\ncase'badge/colors':return <div className={row}><N.NativeBadge>91</N.NativeBadge><N.NativeBadge color=\"primary\">152</N.NativeBadge></div>;\ncase'badge/kbd':return <div className={row}><N.NativeKbd>⌘L</N.NativeKbd><N.NativeKbd>⌘K</N.NativeKbd><N.NativeKbd>esc</N.NativeKbd></div>;\ncase'breadcrumb/avatars':return <N.NativeBreadcrumb aria-label=\"Team\"><N.NativeBreadcrumbItem href=\"/templates/hr\"><N.NativeAvatar size=\"xs\"color=\"blue\"initials=\"H\"/>Helios team</N.NativeBreadcrumbItem><N.NativeBreadcrumbItem href=\"/templates/ai-profile\"><N.NativeAvatar size=\"xs\"initials=\"A\"/>Aarav</N.NativeBreadcrumbItem><N.NativeBreadcrumbItem current icon={RiHomeLine}>Home</N.NativeBreadcrumbItem></N.NativeBreadcrumb>;\ncase'button/variants':case'button/disabled':return <div className={row}>{(['primary','secondary','ghost','danger']as const).map(variant=><N.NativeButton key={variant}variant={variant}disabled={id==='disabled'}onClick={action(variant+' button')}>Button text</N.NativeButton>)}</div>;\ncase'button/sizes':return <div className=\"contents\">{(['medium','small','xs']as const).map(size=><N.NativeButton key={size}size={size}onClick={action(size+' button')}>{size==='xs'?'Xs':size[0].toUpperCase()+size.slice(1)}</N.NativeButton>)}{(['medium','small','xs']as const).map(size=><N.NativeButton key={'icon-'+size}size={size}iconOnly leadingIcon={RiAddLine}aria-label={'Add '+size}onClick={action('Add')}/>)}</div>;\ncase'button/icons':return <div className={row}><N.NativeButton leadingIcon={RiAddLine}onClick={action('New project')}>New project</N.NativeButton><N.NativeButton variant=\"secondary\"trailingIcon={RiArrowRightLine}onClick={action('Continue')}>Continue</N.NativeButton><N.NativeButton variant=\"secondary\"iconOnly leadingIcon={RiAddLine}aria-label=\"Add\"onClick={action('Add')}/></div>;\ncase'button-group/selected':return <N.NativeButtonGroup aria-label=\"View\">{[{id:'list',label:'List',icon:ObservedListIcon},{id:'grid',label:'Grid',icon:ObservedGridIcon},{id:'table',label:'Table',icon:ObservedTableIcon}].map(v=><N.NativeButtonGroupItem key={v.id}leadingIcon={v.icon}selected={choice===v.id}onClick={()=>setChoice(v.id)}>{v.label}</N.NativeButtonGroupItem>)}</N.NativeButtonGroup>;\ncase'button-group/icon-only':return <N.NativeButtonGroup size=\"small\"aria-label=\"Formatting\">{[[RiBold,'Bold'],[RiItalic,'Italic'],[RiUnderline,'Underline']].map(([Icon,label])=><N.NativeButtonGroupItem key={String(label)}iconOnly leadingIcon={Icon as typeof RiBold}aria-label={String(label)}selected={format.includes(String(label))}onClick={()=>setFormat(current=>current.includes(String(label))?current.filter(f=>f!==label):[...current,String(label)])}/>)}</N.NativeButtonGroup>;\ncase'checkbox/sizes':return <div className=\"flex items-center gap-8\">{(['md','sm']as const).map(size=><div key={size}className=\"flex items-center gap-3\"><div className=\"flex gap-3\"><N.NativeCheckbox size={size}defaultSelected aria-label={size+' selected'}/><N.NativeCheckbox size={size}aria-label={size+' unchecked'}/></div><span className=\"text-caption-1 text-text-secondary\">{size} - {size==='md'?16:14}px</span></div>)}</div>;\ncase'checkbox/labels':return <div className=\"flex flex-col gap-3\"><N.NativeCheckbox defaultSelected>Remember me</N.NativeCheckbox><N.NativeCheckbox>Send me product updates</N.NativeCheckbox><N.NativeCheckbox size=\"sm\">Small with label</N.NativeCheckbox></div>;\ncase'checkbox/card':return <div className=\"flex w-full max-w-sm flex-col gap-4\"><N.NativeCheckboxCard title=\"Item title\"description=\"This is for you to check.\"/><N.NativeCheckboxCard defaultSelected title=\"Item title\"description=\"This is for you to check.\"/><N.NativeCheckboxCard title=\"No description\"/></div>;\ncase'chip/variants':return <div className=\"contents\">{(['bold','subtle','caption']as const).map(variant=><div key={variant}className={row}>{(['lime','rose','yellow','cyan','neutral','gray','soft']as const).map(color=><N.NativeChip key={color}variant={variant}color={color}>{variant==='bold'?color:variant==='subtle'?'₹3,252':'Backend Engineer'}</N.NativeChip>)}</div>)}</div>;\ncase'chip/status-dot':return <div className={row}>{(['green','yellow','indigo']as const).map(color=><N.NativeStatusDot key={color}color={color}/>)}</div>;\ncase'close-button/in-context':return closed?<N.NativeButton variant=\"secondary\"onClick={()=>setClosed(false)}>Restore modal header</N.NativeButton>:<header className=\"flex w-96 max-w-full items-center justify-between rounded-xl border border-border-button-default bg-background-secondary-default p-4 shadow-xs\"><p className=\"text-body-medium text-text-primary\">Modal title</p><N.NativeCloseButton size=\"md\"aria-label=\"Close modal\"onClick={()=>setClosed(true)}/></header>;\ncase'date-picker/meeting-scheduler':return <N.NativeMeetingScheduler/>;\ncase'date-picker/value':return <div className=\"flex flex-col items-center gap-3 py-8\"><N.NativeDateRangePicker aria-label=\"Report period\"value={range}onChange={setRange}/><output className=\"text-body-2-medium text-text-secondary\">{range?range.start.toString()+' — '+range.end.toString():'No range committed yet'}</output></div>;\ncase'date-picker/single-date':return <div className=\"flex justify-center py-10\"><N.NativeDatePicker aria-label=\"Meeting date\"/></div>;\ncase'divider/variants':return <div className=\"contents\"><N.NativeDivider>Single line</N.NativeDivider><N.NativeDivider variant=\"double\">Double line</N.NativeDivider><N.NativeDivider variant=\"fill\">Background fill</N.NativeDivider></div>;\ncase'divider/alignment':return <div className=\"contents\">{(['start','center','end']as const).map(align=><N.NativeDivider key={align}align={align}>{align[0].toUpperCase()+align.slice(1)}</N.NativeDivider>)}</div>;\ncase'divider/without-content':return <div className=\"contents\">{(['single','double','fill']as const).map(variant=><N.NativeDivider key={variant}variant={variant}aria-label=\"Section break\"/>)}</div>;\ncase'divider/custom-content':return <div className=\"contents\"><N.NativeDivider><RiAddLine className=\"size-5 text-foreground-icon-secondary\"/></N.NativeDivider><N.NativeDivider><N.NativeChip variant=\"bold\" color=\"neutral\">NEW</N.NativeChip></N.NativeDivider><N.NativeDivider><N.NativeButton variant=\"secondary\"size=\"small\"onClick={action('Button')}>Button</N.NativeButton></N.NativeDivider><N.NativeDivider><N.NativeButtonGroup size=\"small\"aria-label=\"Move item\">{[[RiArrowDownLine,'Move down'],[RiAddLine,'Add between'],[RiArrowUpLine,'Move up']].map(([Icon,label])=><N.NativeButtonGroupItem key={String(label)}size=\"small\"aria-label={String(label)}onClick={action(String(label))}><Icon className=\"size-5\"/></N.NativeButtonGroupItem>)}</N.NativeButtonGroup></N.NativeDivider><N.NativeDivider><div className=\"flex items-center\"><N.NativeAvatar src=\"/react/assets/board-native/avatars/aspen-lubin.webp\"alt=\"Aspen Lubin\"className=\"ring-2 ring-background-primary-default\"/><N.NativeAvatar src=\"/react/assets/board-native/avatars/john-clarkson.webp\"alt=\"John Clarkson\"className=\"-ms-2 ring-2 ring-background-primary-default\"/><span className=\"-ms-2 inline-flex size-8 items-center justify-center rounded-full bg-neutral-900 text-caption-1-semibold text-white ring-2 ring-background-primary-default dark:bg-neutral-700\">+7</span></div></N.NativeDivider><N.NativeDivider variant=\"fill\"><N.NativeButtonGroup size=\"small\"aria-label=\"Activity filter\">{['All','Unread','Archived'].map(label=><N.NativeButtonGroupItem key={label}size=\"small\"selected={choice===label||(choice==='list'&&label==='All')}onClick={()=>setChoice(label)}>{label}</N.NativeButtonGroupItem>)}</N.NativeButtonGroup></N.NativeDivider></div>;\ncase'dropdown/model-picker':return <N.NativeDropdown isOpen={open}onOpenChange={setOpen}><N.NativeDropdownTrigger className=\"flex h-8 shrink-0 cursor-pointer items-center justify-center gap-0.5 rounded-xl bg-background-primary-default py-1.5 pe-1 ps-2 text-body-medium text-text-secondary shadow-xs outline-none transition-colors duration-150 hover:bg-background-primary-hover focus-visible:ring-2 focus-visible:ring-border-focus-ring\">{model}<N.NativeChevronDownSmall className=\"size-4\"/></N.NativeDropdownTrigger><N.NativeDropdownPopover aria-label=\"Models\"><N.NativeDropdownGroup label=\"Models\">{['Composer 2.5','GPT-5.6 Sol','Fable 5','Sonnet 5'].map(name=><N.NativeDropdownItem key={name}selected={model===name}onSelect={()=>{setModel(name);setOpen(false)}}className=\"justify-between gap-2.5\"><span>{name}</span><N.NativeRadioDot selected={model===name}/></N.NativeDropdownItem>)}</N.NativeDropdownGroup></N.NativeDropdownPopover></N.NativeDropdown>;\ncase'dropdown/team-menu':return <div className=\"w-[236px]\"><N.NativeDashboardTeamMenu/></div>;\ncase'dropdown/account-menu':return <N.NativeDashboardUserMenu userName=\"Aarav\"userInitials=\"A\"onAccountAction={label=>action(label)()}/>;\ncase'icon-button/sizes':return <div className=\"contents\"><N.NativeIconButton icon={ObservedIconNotifications}size=\"medium\"aria-label=\"Notifications\"onClick={action('Notifications')}/><N.NativeIconButton icon={ObservedIconEdit}size=\"medium\"aria-label=\"Edit\"onClick={action('Edit')}/><N.NativeIconButton icon={ObservedIconDisabled}size=\"medium\"aria-label=\"Disabled\"disabled/><N.NativeIconButton icon={ObservedIconDelete}size=\"small\"aria-label=\"Delete\"onClick={action('Delete')}/><N.NativeIconButton icon={ObservedIconMore}size=\"small\"aria-label=\"More\"onClick={action('More')}/></div>;\ncase'input/sizes':return <div className=\"flex w-[280px] flex-col gap-5\">{(['medium','small']as const).map(size=><N.NativeInput key={size}size={size}label=\"Email\"isRequired tooltip placeholder=\"Enter your email\"hint=\"This is a hint about this input.\"leadingIcon={RiEmotionHappyLine}trailingIcon={RiQuestionLine}className=\"w-full\"/>)}</div>;\ncase'input/states':return <div className=\"grid w-full max-w-[524px] gap-6 sm:grid-cols-2\">{['Default','Populated','Disabled','Invalid'].map((label,index)=><N.NativeInput key={label}aria-label={label+' email'}label=\"Email\"placeholder=\"Enter your email\"isRequired tooltip hint=\"This is a hint about this input.\"defaultValue={index===1?'hello@example.com':index===3?'not-a-real-email':undefined}isDisabled={index===2}isInvalid={index===3}leadingIcon={RiEmotionHappyLine}trailingIcon={RiQuestionLine}/>)}</div>;\ncase'input/phone':return <PhoneInputs/>;\ncase'link-button/icons-sizes':return <div className=\"contents\"><N.NativeLinkButton href=\"/?section=pricing\"trailingIcon={RiExternalLinkLine}>View changelog</N.NativeLinkButton><N.NativeLinkButton size=\"small\"leadingIcon={RiDownloadLine}onClick={download}>Download report</N.NativeLinkButton><N.NativeLinkButton size=\"xs\"variant=\"secondary\"trailingIcon={RiArrowRightLine}onClick={action('See all')}>See all</N.NativeLinkButton></div>;\ncase'radio/sizes':return <div className=\"contents\">{(['md','sm']as const).map(size=><div key={size}className=\"flex items-center gap-3\"><N.NativeRadioGroup aria-label={size+' radio sizes'}defaultValue=\"selected\"className=\"flex-row gap-3\"><N.NativeRadio size={size}value=\"selected\"aria-label={size==='md'?'Medium selected':'Small selected'}/><N.NativeRadio size={size}value=\"other\"aria-label={size==='md'?'Medium':'Small'}/></N.NativeRadioGroup><span className=\"text-body-medium text-text-secondary\">{size} - {size==='md'?16:14}px</span></div>)}</div>;\ncase'radio/card':return <N.NativeRadioGroup aria-label=\"Plan\"defaultValue=\"pro\"className=\"w-full max-w-sm gap-4\"><N.NativeRadioCard value=\"starter\"title=\"Starter\"description=\"For side projects and experiments.\"/><N.NativeRadioCard value=\"pro\"title=\"Pro\"description=\"For growing teams that need more.\"/><N.NativeRadioCard value=\"enterprise\"title=\"Enterprise\"description=\"Custom limits and support.\"isDisabled/></N.NativeRadioGroup>;\ncase'radio/menu-rows':return <div className=\"contents\"><span className=\"flex items-center gap-2 text-body-medium text-text-primary\"><N.NativeRadioDot/> default</span><span className=\"flex items-center gap-2 text-body-medium text-text-primary\"><N.NativeRadioDot selected/> selected</span></div>;\ncase'select/status':return <N.NativeSelect aria-label=\"Purchase status\"defaultSelectedKey=\"completed\"className=\"w-[142px]\">{([['completed','Completed','green'],['waiting','Waiting','yellow'],['processing','Processing','indigo']]as const).map(([value,label,color])=><N.NativeSelectItem key={value}id={value}textValue={label}><N.NativeStatusDot color={color}/>{label}</N.NativeSelectItem>)}</N.NativeSelect>;\ncase'slider/range':return <div className=\"w-full max-w-[440px]\"><N.NativeRangeSlider label=\"Price range\"defaultValue={[200,800]}minValue={0}maxValue={1000}step={50}formatValue={value=>'₹'+value.toLocaleString('en-IN')}/></div>;\ncase'slider/states':return <div className=\"flex w-full max-w-[440px] flex-col gap-9\"><N.NativeSlider label=\"Exact value\"defaultValue={64}/><N.NativeSlider label=\"Without value bubble\"defaultValue={36}showTooltip={false}/><N.NativeRangeSlider label=\"Disabled range\"defaultValue={[20,70]}isDisabled/></div>;\ncase'social-button/brands':return <div className=\"contents\">{Object.keys(N.NativeSOCIAL_PROVIDERS).map(brand=><N.NativeSocialButton key={brand}brand={brand as N.NativeSocialBrand}appearance=\"white\"size=\"small\"iconOnly onClick={action('Continue with '+brand)}/>)}</div>;\ncase'social-button/appearance':return <div className=\"contents\">{(['colorful','black','white']as const).map(appearance=><N.NativeSocialButton key={appearance}brand=\"google\"appearance={appearance}onClick={action('Continue with Google')}/>)}</div>;\ncase'social-button/sizes':return <div className=\"contents\">{(['medium','small']as const).map(size=><N.NativeSocialButton key={size}brand=\"slack\"appearance=\"white\"size={size}onClick={action('Continue with Slack')}/>)}</div>;\ncase'social-button/icon-only':return <div className=\"contents\">{(['google','apple','github','x','figma','discord','slack']as const).map(brand=><N.NativeSocialButton key={brand}brand={brand}appearance={brand==='discord'?'colorful':brand==='slack'?'black':'white'}iconOnly onClick={action('Continue with '+brand)}/>)}</div>;\ncase'social-button/custom-brand':return <div className=\"contents\"><N.NativeSocialButton brand=\"custom\"config={{icon:<RiShieldKeyholeLine className=\"size-5\"/>,label:'Okta SSO',color:'#0f172a'}}onClick={action('Okta SSO')}/><N.NativeSocialButton brand=\"custom\"appearance=\"white\"config={{icon:<RiShieldKeyholeLine className=\"size-5\"/>}}onClick={action('SSO')}/></div>;\ncase'social-button/labels':return <div className=\"contents\"><N.NativeSocialButton brand=\"google\"appearance=\"white\"onClick={action('Continue with Google')}/><N.NativeSocialButton brand=\"google\"appearance=\"white\"onClick={action('Sign up with Google')}>Sign up with Google</N.NativeSocialButton><N.NativeSocialButton brand=\"google\"appearance=\"white\"onClick={action('Log in')}>Log in</N.NativeSocialButton></div>;\ncase'social-button/links':return <div className=\"contents\"><N.NativeSocialButton brand=\"github\"appearance=\"white\"href=\"/?section=pricing\"onClick={event=>{event.preventDefault();action('GitHub sign-in preview')()}}/><N.NativeSocialButton brand=\"gitlab\"appearance=\"white\"onClick={action('GitHub sign-in preview')}/></div>;\ncase'switch/card':return <div className=\"flex w-full max-w-md flex-col gap-4\"><N.NativeSwitchCard icon={RiNotification4Line}title=\"Push notifications\"description=\"Alerts for important activity.\"defaultSelected/><N.NativeSwitchCard icon={ObservedWeeklyIcon}title=\"Weekly digest\"description=\"A recap every Monday.\"/><N.NativeSwitchCard icon={RiMoonLine}title=\"Dark mode\"/></div>;\ncase'textarea/sizes':return <div className=\"flex w-full max-w-[420px] flex-col gap-5\">{(['medium','small']as const).map(size=><N.NativeTextarea key={size}size={size}label=\"Description\"placeholder=\"Tell us about this workspace\"hint={size==='medium'?'Medium is the default, 14px type in a 8px shell.':'Small tightens the horizontal inset to match a small input.'}rows={3}/>)}</div>;\ncase'textarea/auto-resize':return <div className=\"w-full max-w-[420px]\"><N.NativeTextarea label=\"Message\"placeholder=\"Write as much as you need\"hint=\"The field grows to eight lines, then scrolls.\"autoResize rows={2}maxRows={8}/></div>;\ncase'textarea/character-count':return <div className=\"w-full max-w-[420px]\"><N.NativeTextarea label=\"Bio\"defaultValue=\"Design engineer. I build dashboards for a living.\"showCount maxLength={160}hint=\"Appears on your public profile.\"rows={3}/></div>;\ncase'textarea/states':return <div className=\"grid w-full gap-6 sm:grid-cols-2\">{['Default','Populated','Disabled','Invalid'].map((label,index)=><N.NativeTextarea key={label}aria-label={label+' cover letter'}label=\"Cover letter\"isRequired tooltip placeholder=\"Why are you a good fit?\"hint={index===3?'Please write at least 200 characters.':'This is a hint about this field.'}defaultValue={index===1?'I have shipped design systems for six years.':index===3?'Too short.':undefined}resize=\"none\"isDisabled={index===2}isInvalid={index===3}rows={3}/>)}</div>;\ncase'tooltip/positions':return <div className=\"flex flex-wrap justify-center gap-4 py-8\">{(['top','bottom','left','right']as const).map(placement=><N.NativeTooltipTrigger key={placement}delay={0}><Focusable><N.NativeButton variant=\"secondary\">{placement[0].toUpperCase()+placement.slice(1)}</N.NativeButton></Focusable><N.NativeTooltip placement={placement}>{placement[0].toUpperCase()+placement.slice(1)}</N.NativeTooltip></N.NativeTooltipTrigger>)}</div>;\ncase'tabs/pill-tabs':return <div className=\"flex w-full items-center justify-center rounded-2xl bg-background-primary-default py-6\"><div className=\"flex w-full max-w-[720px] flex-col gap-6 py-2\">{(['blue','gray']as const).map(variant=><N.NativePillTabList key={variant}aria-label={variant+' view'}>{(variant==='blue'?['Changes','Browser']:['Home','helios-ui','iospoke','Cloud']).map((label,index)=><N.NativePillTab key={label}variant={variant}icon={variant==='blue'?(index===0?ObservedChangesIcon:ObservedBrowserIcon):undefined}isSelected={variant==='blue'?(choice===label||(choice==='list'&&index===0)):secondaryChoice===label}onSelect={()=>variant==='blue'?setChoice(label):setSecondaryChoice(label)}>{label}</N.NativePillTab>)}</N.NativePillTabList>)}</div></div>;\ncase'stat-cards/variants':return <N.NativeStatCards columns={2}stats={[{icon:RiGroupLine,label:'Customers',value:'14,592',delta:'+5.3%',deltaColor:'lime'},{icon:RiBox3Line,label:'Unit sold',value:'385',delta:'-2.1%',deltaColor:'rose'}]}className=\"grid-cols-2\"/>;\ndefault:return null;\n}}\nexport function BoardNativeSectionExample({slug,id}:{slug:string;id:string}){const className=sectionFrames[slug+'/'+id];if(!className)return null;return <NativeScope><div className={className}data-native-section={slug+'/'+id}><SectionBody slug={slug}id={id}/></div></NativeScope>}\n\nexport const sectionFrames:Record<string,string>={\n\"sidebar/ai-chat-variant\":\"flex flex-col gap-4\",\n\"carousel/options\":\"flex flex-col gap-6\",\n\"input-otp/options\":\"flex flex-col gap-6\",\n\"data-grid/rtl\":\"flex flex-col gap-4\",\n\"badge/kbd\":\"flex justify-center rounded-3xl border border-border-button-default p-8\",\n  \"announcement/in-sidebar\": \"flex justify-center rounded-3xl border border-border-button-default p-8\",\n  \"announcement/variations\": \"flex justify-center rounded-3xl border border-border-button-default p-8\",\n  \"avatar/sizes\": \"flex items-center justify-center gap-4 rounded-3xl border border-border-button-default p-8\",\n  \"avatar/tints\": \"flex items-center justify-center gap-4 rounded-3xl border border-border-button-default p-8\",\n  \"avatar/photo\": \"flex items-center justify-center gap-4 rounded-3xl border border-border-button-default p-8\",\n  \"breadcrumb/avatars\": \"flex justify-center rounded-3xl border border-border-button-default p-8\",\n  \"button/variants\": \"flex flex-wrap items-center justify-center gap-3 rounded-3xl border border-border-button-default p-8\",\n  \"button/sizes\": \"flex flex-wrap items-center justify-center gap-3 rounded-3xl border border-border-button-default p-8\",\n  \"button/icons\": \"flex flex-wrap items-center justify-center gap-3 rounded-3xl border border-border-button-default p-8\",\n  \"button/disabled\": \"flex flex-wrap items-center justify-center gap-3 rounded-3xl border border-border-button-default p-8\",\n  \"button-group/selected\": \"flex justify-center rounded-3xl border border-border-button-default p-8\",\n  \"button-group/icon-only\": \"flex justify-center rounded-3xl border border-border-button-default p-8\",\n  \"checkbox/sizes\": \"flex items-center justify-center gap-8 rounded-3xl border border-border-button-default p-8\",\n  \"checkbox/labels\": \"flex justify-center rounded-3xl border border-border-button-default p-8\",\n  \"checkbox/card\": \"flex justify-center rounded-3xl border border-border-button-default p-8\",\n  \"chip/variants\": \"flex flex-col gap-5 rounded-3xl border border-border-button-default p-8\",\n  \"chip/status-dot\": \"flex items-center justify-center gap-4 rounded-3xl border border-border-button-default p-8\",\n  \"close-button/in-context\": \"flex justify-center rounded-3xl border border-border-button-default p-8\",\n  \"date-picker/meeting-scheduler\": \"flex justify-center rounded-3xl border border-border-button-default p-8\",\n  \"date-picker/value\": \"flex justify-center rounded-3xl border border-border-button-default p-8\",\n  \"date-picker/single-date\": \"flex justify-center rounded-3xl border border-border-button-default p-8\",\n  \"divider/variants\": \"flex flex-col gap-8 rounded-3xl border border-border-button-default p-8\",\n  \"divider/alignment\": \"flex flex-col gap-8 rounded-3xl border border-border-button-default p-8\",\n  \"divider/custom-content\": \"flex flex-col gap-8 rounded-3xl border border-border-button-default p-8\",\n  \"divider/without-content\": \"flex flex-col gap-8 rounded-3xl border border-border-button-default p-8\",\n  \"dropdown/model-picker\": \"flex min-h-[340px] items-center justify-center rounded-3xl border border-border-button-default p-8\",\n  \"dropdown/team-menu\": \"flex min-h-[480px] items-center justify-center rounded-3xl border border-border-button-default p-8\",\n  \"dropdown/account-menu\": \"flex min-h-[340px] items-center justify-center rounded-3xl border border-border-button-default p-8\",\n  \"icon-button/sizes\": \"flex items-center justify-center gap-3 rounded-3xl border border-border-button-default p-8\",\n  \"input/sizes\": \"flex items-center justify-center rounded-3xl border border-border-component-detail-container p-8 min-h-[240px]\",\n  \"input/states\": \"flex items-center justify-center rounded-3xl border border-border-component-detail-container p-8 min-h-[300px]\",\n  \"input/phone\": \"flex items-center justify-center rounded-3xl border border-border-component-detail-container p-8 min-h-[240px]\",\n  \"link-button/icons-sizes\": \"flex flex-wrap items-center justify-center gap-6 rounded-3xl border border-border-button-default p-8\",\n  \"notification/states\": \"rounded-3xl border border-border-button-default p-6\",\n  \"notification/visuals\": \"rounded-3xl border border-border-button-default p-6\",\n  \"notification/actions\": \"flex justify-center rounded-3xl border border-border-button-default p-6\",\n  \"notification/position\": \"flex justify-center rounded-3xl border border-border-button-default p-6\",\n  \"notification/countdown\": \"flex justify-center rounded-3xl border border-border-button-default p-6\",\n  \"radio/sizes\": \"flex items-center justify-center gap-8 rounded-3xl border border-border-button-default p-8\",\n  \"radio/card\": \"flex justify-center rounded-3xl border border-border-button-default p-8\",\n  \"radio/menu-rows\": \"flex items-center justify-center gap-6 rounded-3xl border border-border-button-default p-8\",\n  \"select/status\": \"flex justify-center rounded-3xl border border-border-button-default p-8\",\n  \"slider/range\": \"flex justify-center rounded-3xl border border-border-button-default p-8 pt-10\",\n  \"slider/states\": \"flex justify-center rounded-3xl border border-border-button-default p-8 pt-10\",\n  \"social-button/brands\": \"flex flex-wrap gap-2 rounded-3xl border border-border-button-default p-8\",\n  \"social-button/appearance\": \"flex flex-col items-start gap-3 rounded-3xl border border-border-button-default p-8\",\n  \"social-button/sizes\": \"flex flex-col items-start gap-3 rounded-3xl border border-border-button-default p-8\",\n  \"social-button/icon-only\": \"flex flex-wrap items-center gap-2 rounded-3xl border border-border-button-default p-8\",\n  \"social-button/custom-brand\": \"flex flex-col items-start gap-3 rounded-3xl border border-border-button-default p-8\",\n  \"social-button/labels\": \"flex flex-col items-start gap-3 rounded-3xl border border-border-button-default p-8\",\n  \"social-button/links\": \"flex flex-col items-start gap-3 rounded-3xl border border-border-button-default p-8\",\n  \"switch/card\": \"flex justify-center rounded-3xl border border-border-button-default p-8\",\n  \"textarea/sizes\": \"flex items-center justify-center rounded-3xl border border-border-component-detail-container p-8 min-h-[320px]\",\n  \"textarea/auto-resize\": \"flex items-center justify-center rounded-3xl border border-border-component-detail-container p-8 min-h-[240px]\",\n  \"textarea/character-count\": \"flex items-center justify-center rounded-3xl border border-border-component-detail-container p-8 min-h-[240px]\",\n  \"textarea/states\": \"flex items-center justify-center rounded-3xl border border-border-component-detail-container p-8 min-h-[420px]\",\n  \"tree-view/controlled\": \"flex justify-center rounded-3xl border border-border-button-default bg-background-secondary-default p-6 sm:p-8\",\n  \"tree-view/multiple-selection\": \"flex justify-center rounded-3xl border border-border-button-default bg-background-secondary-default p-6 sm:p-8\",\n  \"tree-view/sizes-and-states\": \"rounded-3xl border border-border-button-default bg-background-secondary-default p-6 sm:p-8\",\n  \"tree-view/rtl\": \"flex justify-center rounded-3xl border border-border-button-default bg-background-secondary-default p-6 sm:p-8\",\n  \"stat-cards/variants\": \"rounded-3xl border border-border-button-default p-4 sm:p-6\",\n  \"tooltip/positions\": \"rounded-2xl border border-border-button-default\",\n  \"tabs/pill-tabs\": \"rounded-3xl bg-background-secondary-default p-2\"\n};\n",
  "src/BoardTemplates.tsx": "'use client';\nimport { boardTemplateDefinitions } from './template-definitions.js';\nexport { boardTemplateDefinitions } from './template-definitions.js';\nimport { UIIcon, type UIIconName } from './icons.js';\nimport {BoundedChartText} from './BoundedChartText.js';\n\nimport { createContext, useContext, useEffect, useId, useMemo, useRef, useState, isValidElement } from 'react';\nimport type { ReactNode } from 'react';\nimport {useDirection} from './Direction.js';\nimport {\n  ResponsiveContainer,\n  RadarChart,\n  Radar,\n  PolarGrid,\n  PolarAngleAxis,\n  BarChart,\n  Bar,\n  AreaChart,\n  Area,\n  PieChart,\n  Pie,\n  Cell,\n  Tooltip as ChartTooltip,\n} from 'recharts';\nimport {\n  DialogTrigger,\n  Calendar as AriaCalendar,\n  Button as AriaButton,\n  Popover,\n  Dialog as AriaDialog,\n} from 'react-aria-components';\nimport { UNSAFE_PortalProvider } from 'react-aria';\nimport { parseDate } from '@internationalized/date';\nimport { MonthPanel } from './board-native/components/base/date-picker/shared.js';\nimport { motion } from 'motion/react';\nimport { useMotionPreference as useReducedMotion } from './useMotionPreference.js';\nimport { Button, Checkbox, DataState, Dialog, Input, Select, Tabs } from './components.js';\nimport { DataTable } from './DataTable.js';\nimport type { DataTableProps, Column } from './DataTable.js';\nimport { SourceChartPreview } from './ChartFamilies.js';\nimport type { ModernChartProps } from './ChartFamilies.js';\nimport {\n  SourceComposer,\n  SourceAgentCreator,\n  SourceAgentArtwork,\n  AgentProgress,\n  NativeAgentThinking,\n  MultiAgentChat,\n  NotificationCenter,\n  AgentCreator,\n  AuthCard,\n  defaultAgent,\n  avatarExpressions,\n  avatarShapes,\n} from './AgentPatterns.js';\nimport type { ComposerMessage } from './AgentPatterns.js';\nimport { TextEditor, DropdownMenu } from './BaseFamilies.js';\nimport type { FamilyState } from './family-types.js';\nimport { DashboardSidebar, DASHBOARD_NAV, type DashboardNavItem } from './board-native/components/application/dashboard/dashboard-sidebar.js';\nimport { NativeScope } from './board-native/NativeScope.js';\nimport { DashboardTeamMenu } from './board-native/components/application/dashboard/dashboard-team-menu.js';\nimport { Button as NativeButton } from './board-native/components/base/buttons/button.js';\nimport {Input as NativeInput} from './board-native/components/base/input/input.js';\nimport { Select as NativeChartSelect, SelectItem as NativeChartSelectItem } from './board-native/components/base/select/select.js';\nimport { Switch as NativeTemplateSwitch } from './board-native/components/base/switch/switch.js';\nimport { SettingsModal as NativeSettingsModal } from './board-native/components/application/settings/settings-modal.js';\nimport { RiNotification4Line, RiCloseLine, RiMenuLine, RiFilter3Line, RiAddLine, RiChat3Line, RiDashboardLine, RiGridLine, RiLoginCircleLine, RiUserAddLine, RiArrowRightSLine, RiShare2Line, RiMoreLine, RiTerminalBoxLine, RiExpandDiagonalLine, RiSideBarLine, RiSortDesc, RiEqualizer2Line, RiLayoutColumnLine, RiInboxLine, RiMenLine, RiDropLine, RiHeartPulseFill, RiEditBoxLine, RiGoogleFill, RiMetaLine, RiTwitterXLine, RiLinkedinBoxFill, RiMailLine, RiStore2Line, RiSearchLine, RiRobot2Line, RiGitBranchLine, RiSettings4Line, RiCustomerServiceLine, RiCarLine, RiPhoneLine, RiShakeHandsLine, RiGroupLine, RiWallet3Line, RiHandCoinLine, RiBankCardLine, RiStockLine, RiCoinsLine, RiEyeLine, RiUserFollowLine, RiCursorLine, RiBox3Line, RiShoppingBasket2Line, RiChat4Line, RiUserSearchLine, RiTimeLine, RiUserUnfollowLine, RiStethoscopeLine, RiAsterisk, RiLinksLine, RiGlobalLine, RiGalleryLine, RiMagicLine, RiMore2Line, RiCodeSLine } from '@remixicon/react';\n\nconst TemplateChromeContext = createContext<{mobile:boolean;suspended:boolean;navigationOpen:boolean;toggleNavigation:()=>void;notify:()=>void;settings:()=>void;navigationTrigger?:React.RefObject<HTMLButtonElement|null>}>({mobile:false,suspended:false,navigationOpen:false,toggleNavigation:()=>{},notify:()=>{},settings:()=>{}});\nfunction NavigationToggle() { const chrome=useContext(TemplateChromeContext); if(!chrome.mobile)return null; return <NativeScope><NativeButton ref={chrome.navigationTrigger} className=\"bt-source-menu\" variant=\"secondary\" size=\"medium\" iconOnly leadingIcon={RiMenuLine} aria-label={chrome.navigationOpen?'Close workspace navigation':'Open workspace navigation'} aria-expanded={chrome.navigationOpen} onClick={chrome.toggleNavigation}/></NativeScope>; }\nconst templateCopy=(text:string)=>text.replaceAll('BoardUI','Helios UI').replaceAll('Board UI','Helios UI').replaceAll('Board team','Helios team').replaceAll('hi@boardui.com','team@example.com').replaceAll('Mertcan Esmergul','Aarav Shah').replaceAll('Mertcan Esmergül','Aarav Shah').replace(/[$€]([\\d,.]+)/g,(_,value)=>'₹'+Number(value.replaceAll(',','')).toLocaleString('en-IN',{maximumFractionDigits:2}));\n\n\nexport type BoardTemplateId = (typeof boardTemplateDefinitions)[number]['id'];\nexport type BoardTemplateProps = {\n  /** Opt-in browser persistence for normal chat templates. Never supply for decorative previews. */\n  storageKey?: string;\n  initialGroup?: boolean;\n  initialEditorOpen?: boolean;\n  state?: FamilyState;\n  onRetry?: () => void;\n  assetsBase?: string;\n  onNavigate?: (id: BoardTemplateId) => void;\n  /** Render only the application content, retaining scoped overlays and controls. */\n  chrome?: boolean;\n  /** Contain the application in an inline documentation preview. */\n  embedded?: boolean;\n  /** Local marketplace events; supplying this callback does not activate any integration. */\n  onMarketplaceAction?: (event:MarketplaceAction)=>void|Promise<void>;\n};\nconst names = [\n  'Aarav Shah',\n  'Diya Rao',\n  'Ishaan Patel',\n  'Kavya Nair',\n  'Rohan Mehta',\n  'Sana Ali',\n  'Vihaan Das',\n  'Anaya Iyer',\n  'Arjun Sen',\n  'Mira Jain',\n  'Neel Roy',\n  'Tara Kapoor',\n];\nconst inr = (value: number, digits = 0) =>\n  new Intl.NumberFormat('en-IN', {\n    style: 'currency',\n    currency: 'INR',\n    maximumFractionDigits: digits,\n    minimumFractionDigits: digits,\n  }).format(value);\nconst readableDate=(value:string)=>{const date=new Date(value+'T00:00:00Z');return Number.isFinite(date.getTime())?date.toLocaleDateString('en-US',{month:'short',day:'2-digit',year:'numeric',timeZone:'UTC'}):value;};\n// ICU versions disagree on September's short en-GB spelling (Sep/Sept).\n// Fixed English labels keep initial server HTML identical across browser engines.\nconst shortUTCMonths=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];\nconst shortUTCDate=(date:Date)=>Number.isFinite(date.getTime())?`${date.getUTCDate()} ${shortUTCMonths[date.getUTCMonth()]}`:'Invalid date';\n\nconst asset = (base: string, filename: string) => `${base.replace(/\\/$/, '')}/${filename}`;\nfunction BIcon({ name }: { name: string }) {\n  return <UIIcon name={name as UIIconName} className=\"bt-icon\" />;\n}\nfunction Avatar({\n  name,\n  index,\n  assetsBase,\n  secondary,\n}: {\n  name: string;\n  index: number;\n  assetsBase: string;\n  secondary?: string;\n}) {\n  return (\n    <span className=\"bt-person\">\n      <img\n        src={asset(\n          assetsBase,\n          index % 6 === 0\n            ? '334-517-SizeMdBorderFalse.png'\n            : `322-236-Avatar${index % 6 === 1 ? '' : Math.max(0, (index % 6) - 1)}.png`,\n        )}\n        alt=\"\"\n      />\n      <span>\n        <strong>{name}</strong>\n        {secondary !== '' && (\n          <small>{secondary ?? name.toLowerCase().replaceAll(' ', '.') + '@example.com'}</small>\n        )}\n      </span>\n    </span>\n  );\n}\nfunction downloadCSV(name: string, columns: string[], rows: (string | number)[][]) {\n  const escape = (value: string | number) =>\n    '\"' +\n    String(value)\n      .replace(/^[\\s]*[=+@-]|^[\\t\\r]/, \"'$&\")\n      .replaceAll('\"', '\"\"') +\n    '\"';\n  const url = URL.createObjectURL(\n    new Blob([[columns, ...rows].map((row) => row.map(escape).join(',')).join('\\r\\n')], {\n      type: 'text/csv;charset=utf-8',\n    }),\n  );\n  const anchor = document.createElement('a');\n  anchor.href = url;\n  anchor.download = name;\n  anchor.click();\n  setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\nfunction Status({ value }: { value: string }) {\n  return (\n    <span className={`bt-status bt-status-${value.toLowerCase().replaceAll(' ', '-')}`}>\n      {value}\n    </span>\n  );\n}\nfunction InlineTemplateSelect({\n  label,\n  value,\n  values,\n  onChange,\n}: {\n  label: string;\n  value: string;\n  values: string[];\n  onChange: (value: string) => void;\n}) {\n  return (\n    <div className=\"bt-inline-select-slot\" data-value={value}><Select\n      className=\"bt-inline-select\"\n      label={label}\n      size=\"sm\"\n      value={value}\n      options={values.map((value) => ({ value, label: value }))}\n      onChange={(event) => onChange(event.target.value)}\n    /></div>\n  );\n}\nfunction TemplatePopover({ label, children, icon }: { label: string; children: ReactNode; icon?: ReactNode }) {\n  return (\n    <DialogTrigger>\n      <AriaButton className=\"hu-button hu-secondary hu-sm bt-menu-trigger\" aria-label={label}>{icon||label}</AriaButton>\n      <Popover className=\"hb-popover bt-control-popover\" placement=\"bottom end\" offset={6}>\n        <AriaDialog aria-label={label}>{children}</AriaDialog>\n      </Popover>\n    </DialogTrigger>\n  );\n}\nfunction TemplateTable<T>({\n  onDelete,\n  documentAction,\n  ...props\n}: DataTableProps<T> & { onDelete: (row: T) => void; documentAction?:(row:T)=>void }) {\n  const [pending, setPending] = useState<T | null>(null),\n    [notice, setNotice] = useState('');\n  const cols: Column<T>[] = [\n    ...props.columns,\n    {\n      key: 'template-actions',\n      header: 'Actions',\n      value: () => '',\n      render: (row) => (\n        <div className=\"bt-row-actions\">\n          <Button\n            variant=\"secondary\"\n            size=\"sm\"\n            iconOnly\n            leadingIcon={<BIcon name={documentAction?\"file\":\"trash\"} />}\n            aria-label={`${documentAction?\"Download record for\":\"Delete\"} ${props.rowLabel(row)}`}\n            onClick={() => documentAction?documentAction(row):setPending(row)}\n          >\n            Delete\n          </Button>\n          <Button\n            variant=\"secondary\"\n            size=\"sm\"\n            iconOnly\n            leadingIcon={<BIcon name=\"edit\" />}\n            aria-label={`Edit ${props.rowLabel(row)}`}\n            onClick={() => props.onRowAction?.(row)}\n          >\n            Edit\n          </Button>\n          <DropdownMenu\n            size=\"sm\"\n            label={`More actions for ${props.rowLabel(row)}`}\n            triggerContent={<RiMore2Line size={16}/>}\n            items={[\n              { id: 'view', label: 'View details' },\n              { id: 'copy', label: 'Copy record ID' },\n              { id: 'export', label: 'Export this record' },\n            ]}\n            onAction={async (action) => {\n              if (action === 'view') props.onRowAction?.(row);\n              if (action === 'copy') {\n                try {\n                  await navigator.clipboard.writeText(props.rowKey(row));\n                  setNotice('Record ID copied.');\n                } catch {\n                  setNotice('Clipboard unavailable. Record ID: ' + props.rowKey(row));\n                }\n              }\n              if (action === 'export')\n                downloadCSV(\n                  'helios-record.csv',\n                  props.columns.map((c) => c.header),\n                  [props.columns.map((c) => c.value(row))],\n                );\n            }}\n          />\n        </div>\n      ),\n    },\n  ];\n  return (\n    <>\n      <DataTable {...props} columns={cols} onRowAction={undefined} />\n      <span className=\"hu-sr-only\" role=\"status\">\n        {notice}\n      </span>\n      <Dialog\n        open={pending !== null}\n        onOpenChange={(open) => {\n          if (!open) setPending(null);\n        }}\n        title=\"Delete example record?\"\n        description={\n          pending ? props.rowLabel(pending) + ' will be removed from this local example.' : ''\n        }\n        destructive\n        footer={\n          <>\n            <Button variant=\"secondary\" onClick={() => setPending(null)}>\n              Cancel\n            </Button>\n            <Button\n              variant=\"danger\"\n              onClick={() => {\n                if (pending !== null) onDelete(pending);\n                setPending(null);\n                setNotice('Example record deleted.');\n              }}\n            >\n              Delete record\n            </Button>\n          </>\n        }\n      />\n    </>\n  );\n}\nfunction ProfileHistoryChart({\n  title,\n  points,\n  kind = 'bar',\n  action,\n  valueLabel,\n  comparison,\n}: {\n  title: string;\n  points: { name: string; value: number }[];\n  kind?: 'bar' | 'area';\n  action?: ReactNode;\n  valueLabel?: string;\n  comparison?: string;\n}) {\n  const reduced = useReducedMotion();\n  const total = points.reduce((sum, point) => sum + point.value, 0),\n    peak = Math.max(0, ...points.map((point) => point.value));\n  const format = (value: number) =>\n    new Intl.NumberFormat('en', { notation: 'compact', maximumFractionDigits: 1 }).format(value);\n  return (\n    <section className=\"bt-profile-history\" data-kind={kind}>\n      <header>\n        <div>\n          <h2>{title}</h2>\n          <strong>\n            {format(kind === 'bar' ? peak : total)}{' '}\n            {valueLabel ?? (kind === 'bar' ? 'agents' : 'tokens')}\n            {comparison && <small className=\"bt-fixture-delta\" title=\"Illustrative comparison with the previous period\">{comparison}</small>}\n          </strong>\n        </div>\n        {action}\n      </header>\n      <div\n        className=\"bt-profile-history-plot\"\n        role=\"img\"\n        aria-label={`${title}: ${kind === 'bar' ? 'peak daily value ' + peak : 'total ' + total}. Open chart data for exact values.`}\n      >\n        <ResponsiveContainer\n          width=\"100%\"\n          height=\"100%\"\n          initialDimension={{ width: 620, height: kind === 'area' ? 150 : 200 }}\n        >\n          {kind === 'bar' ? (\n            <BarChart data={points} margin={{ top: 8, left: 0, right: 0, bottom: 0 }}>\n              <Bar\n                dataKey=\"value\"\n                fill=\"var(--color-chart-agents-bar,var(--hu-brand))\"\n                radius={[4, 4, 0, 0]}\n                isAnimationActive={reduced === false}\n                animationDuration={360}\n              />\n              <ChartTooltip formatter={(value) => Number(value).toLocaleString('en-IN')} />\n            </BarChart>\n          ) : (\n            <AreaChart data={points} margin={{ top: 8, left: 0, right: 0, bottom: 0 }}>\n              <Area\n                dataKey=\"value\"\n                type=\"monotone\"\n                stroke=\"var(--color-chart-5,var(--hu-brand))\"\n                fill=\"var(--color-chart-5,var(--hu-brand))\"\n                fillOpacity={0.09}\n                strokeWidth={1.5}\n                isAnimationActive={reduced === false}\n                animationDuration={360}\n              />\n              <ChartTooltip formatter={(value) => Number(value).toLocaleString('en-IN')} />\n            </AreaChart>\n          )}\n        </ResponsiveContainer>\n      </div>\n      <div className=\"bt-profile-history-axis\">\n        <span>{points[0]?.name}</span>\n        <span>{points.at(-1)?.name}</span>\n      </div>\n      <details>\n        <summary>Chart data</summary>\n        <div className=\"hu-table-scroll\" tabIndex={0}>\n          <table>\n            <caption>{title} — fictional local data</caption>\n            <thead>\n              <tr>\n                <th scope=\"col\">Date</th>\n                <th scope=\"col\">Value</th>\n              </tr>\n            </thead>\n            <tbody>\n              {points.map((point) => (\n                <tr key={point.name}>\n                  <th scope=\"row\">{point.name}</th>\n                  <td>{point.value.toLocaleString('en-IN')}</td>\n                </tr>\n              ))}\n            </tbody>\n          </table>\n        </div>\n      </details>\n    </section>\n  );\n}\n\n/** Independent local period fixtures; the chart renders the selected supplied snapshot. */\nfunction TemplateChart({data,ranges,...props}:ModernChartProps){const temporal=['combo-chart-card','area-chart-card','line-chart-card','revenue-chart-card'].includes(props.id);const localRanges=ranges??(data?[{id:'current',label:temporal?'This year':props.id==='funnel-chart-card'?'Last 30 days':'This month',data},{id:'previous',label:temporal?'Last year':props.id==='funnel-chart-card'?'Previous 30 days':'Last month',data:data.map(row=>({...row,...('value'in row&&typeof row.value==='number'?{value:Math.round(row.value*.92*100)/100}:{}),...('secondary'in row&&typeof row.secondary==='number'?{secondary:Math.round(row.secondary*.96*100)/100}:{})}))}]:undefined);return <SourceChartPreview fluid delta={props.delta??({'combo-chart-card':8.4,'area-chart-card':8.8,'line-chart-card':6.2,'radial-chart-card':2.4,'scatter-chart-card':6.2,'funnel-chart-card':5.8} as Record<string,number>)[props.id]} {...(data!==undefined?{data}:{})} {...(localRanges?{ranges:localRanges}:{})} {...props}/>}\nfunction Tile({\n  label,\n  value,\n  trend,\n  icon = 'chart',\n}: {\n  label: string;\n  value: ReactNode;\n  trend?: string;\n  icon?: string | ReactNode;\n}) {\n  return (\n    <article className=\"bt-tile\">\n      <span className=\"bt-tile-icon\">\n        {typeof icon==='string'?<BIcon name={icon}/>:icon}\n      </span>\n      <span>{label}</span>\n      <div>\n        <strong>{value}</strong>\n        {trend && <small data-tone={label==='Expenses'||label==='Cost per click'?'negative':label==='Open roles'?'neutral':'positive'} title=\"Illustrative change from the comparison period\">{trend}</small>}\n      </div>\n    </article>\n  );\n}\nfunction Panel({\n  title,\n  children,\n  action,\n  className = '',\n}: {\n  title: string;\n  children: ReactNode;\n  action?: ReactNode;\n  className?: string;\n}) {\n  return (\n    <section className={`bt-panel ${className}`}>\n      <header>\n        <h2>{title}</h2>\n        {action}\n      </header>\n      {children}\n    </section>\n  );\n}\nfunction Period({\n  value,\n  onChange,\n  label = 'Report period',\n}: {\n  value: string;\n  onChange: (value: string) => void;\n  label?: string;\n}) {\n  return (\n    <Select\n      label={label}\n      size=\"sm\"\n      value={value}\n      options={[\n        { value: '12', label: 'This year' },\n        { value: '6', label: 'Last 6 months' },\n        { value: '3', label: 'Last quarter' },\n      ]}\n      onChange={(event) => onChange(event.target.value)}\n    />\n  );\n}\nfunction ProgressList({\n  values,\n  unit = '',\n  showShare = false,\n}: {\n  values: { label: string; value: number; color?: string; icon?: ReactNode;barIcon?:ReactNode }[];\n  unit?: string;\n  showShare?: boolean;\n}) {\n  const [expanded,setExpanded]=useState(false);\n  const maximum = Math.max(1, ...values.map((value) => value.value));\n  const total=values.reduce((sum,item)=>sum+item.value,0);\n  return (\n    <div className={`bt-expandable-list ${expanded?'bt-list-expanded':''}`}><ul className=\"bt-progress-list\">\n      {(expanded?values:values.slice(0,5)).map((value) => (\n        <li key={value.label} style={{\"--row-width\":`${value.value/maximum*100}%`} as React.CSSProperties}>\n          <span>{value.icon}{value.label}</span>\n          <div>\n            <i\n              style={{\n                width: `${(value.value / maximum) * 100}%`,\n                background: value.color || 'var(--color-chart-6,var(--hu-brand))',\n              }}\n            />{value.barIcon&&<b className=\"bt-pipeline-icon\">{value.barIcon}</b>}\n          </div>\n          <strong>\n            {value.value.toLocaleString('en-IN')}\n            {unit}{showShare&&<small className=\"bt-progress-share\">{Math.round(value.value/maximum*100)}%</small>}\n          </strong>\n        </li>\n      ))}\n    </ul>{values.length>5&&<button type=\"button\" className=\"bt-list-expand\" aria-label={expanded?'Show fewer categories':'Show all categories'} aria-expanded={expanded} onClick={()=>setExpanded(!expanded)}><UIIcon name={expanded?'chevron-up':'chevron-down'}/></button>}</div>\n  );\n}\nconst activityValue = (index: number) => (index * 13 + (index % 4)) % 17;\nconst activityTotal = (weeks: number) =>\n  Array.from({ length: weeks * 7 }, (_, index) => activityValue(index)).reduce(\n    (sum, value) => sum + value,\n    0,\n  );\nfunction Heatmap({\n  label,\n  weeks = 38,\n  data,\n  currency = false,\n}: {\n  label: string;\n  weeks?: number;\n  data?: { label: string; value: number }[];\n  currency?: boolean;\n}) {\n  const [selected, setSelected] = useState(0);\n  const points =\n    data ??\n    Array.from({ length: weeks * 7 }, (_, index) => ({\n      label: `Day ${index + 1}`,\n      value: activityValue(index),\n    }));\n  const peak = Math.max(1, ...points.map((point) => point.value));\n  const current = points[Math.min(selected, points.length - 1)];\n  const describe = (point: { label: string; value: number }) =>\n    `${point.label}: ${currency ? inr(point.value) : point.value + ' illustrative events'}`;\n  return (\n    <div className=\"bt-heatmap\">\n      <div className=\"bt-heatmap-axis\">{Array.from({length:currency?weeks:12},(_,index)=><span key={index}>{currency?`W${index+1}`:['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'][index]}</span>)}</div>\n      <div\n        className=\"bt-heatmap-grid\"\n        role=\"group\"\n        aria-label={label}\n        style={{ gridTemplateColumns: `repeat(${weeks},minmax(0,1fr))` }}\n      >\n        {points.map((point, index) => (\n          <button\n            type=\"button\"\n            key={point.label}\n            aria-label={describe(point)}\n            title={describe(point)}\n            aria-pressed={selected === index}\n            data-active={point.value > 0 || undefined}\n            onClick={() => setSelected(index)}\n            style={{\n              animationDelay:`${(index*73+41)%800}ms`,\n              background:currency?(point.value===0?'var(--color-chart-neutral)':`var(--color-blue-${[200,300,400,500][Math.min(3,Math.floor(point.value/peak*4))]})`):`var(--bt-contribution-tier-${point.value===0?0:point.value<=4?1:point.value<=9?2:point.value<=15?3:point.value<=24?4:5})`,\n            }}\n          />\n        ))}\n      </div>\n      <p role=\"status\" className=\"hu-sr-only\">{current ? describe(current) : 'No activity in this period.'}</p>\n    </div>\n  );\n}\nfunction ContributionCard(){const[period,setPeriod]=useState('weekly');const points=Array.from({length:266},(_,index)=>({label:`${period} day ${index+1}`,value:activityValue(index+(period==='monthly'?7:period==='yearly'?14:0))}));const total=points.reduce((sum,point)=>sum+point.value,0),baseline=Array.from({length:266},(_,index)=>activityValue(index)).reduce((sum,value)=>sum+value,0)/1.148,delta=(total-baseline)/baseline*100;return <Panel title=\"Contributions this year\" className=\"bt-contribution-card\"><strong className=\"bt-number\">{points.reduce((sum,point)=>sum+point.value,0).toLocaleString('en-IN')} <small className=\"bt-fixture-delta\" title=\"Illustrative comparison with the previous period\">{delta>=0?'+':''}{delta.toFixed(1)}%</small></strong><div className=\"bt-mini-stats\"><span><strong>9B</strong><small>Lifetime tokens</small></span><span><strong>562.7M</strong><small>Peak tokens</small></span><span><strong>12h 54m</strong><small>Longest task</small></span><span><strong>62 days</strong><small>Top streak</small></span></div><div className=\"bt-profile-activity-heading\"><span>Activity</span><div className=\"bt-period-buttons\" role=\"group\" aria-label=\"Contribution activity period\">{['weekly','monthly','yearly'].map(value=><button type=\"button\" key={value} aria-pressed={period===value} onClick={()=>setPeriod(value)}>{value[0].toUpperCase()+value.slice(1)}</button>)}</div></div><Heatmap label={`${period} contribution activity`} weeks={38} data={points}/></Panel>}\nfunction DailySpending({ rows }: { rows: FinanceRow[] }) {\n  const [weeks,setWeeks]=useState(12);\n  const end = Date.UTC(2026, 9, 26),\n    day = 86400000;\n  const points = Array.from({ length: weeks*7 }, (_, index) => {\n    const label = new Date(end - (weeks*7-1 - index) * day).toISOString().slice(0, 10);\n    return {\n      label,\n      value: rows\n        .filter((row) => row.date === label)\n        .reduce((sum, row) => sum + Math.max(0, -row.amount), 0),\n    };\n  });\n  return (\n    <Panel className=\"bt-daily-spending\" title=\"Daily spending\" action={<Select label=\"Daily spending period\" size=\"sm\" leadingIcon={<UIIcon name=\"calendar\"/>} value={String(weeks)} options={[{value:'12',label:'Last 12 weeks'},{value:'24',label:'Last 24 weeks'}]} onChange={event=>setWeeks(Number(event.target.value))}/>}>\n      <strong className=\"bt-number\">\n        {inr(points.reduce((sum, point) => sum + point.value, 0))}\n      </strong>\n      <Heatmap\n        label={`Daily spending in INR, last ${weeks} weeks through 26 October 2026`}\n        weeks={weeks}\n        data={points}\n        currency\n      />\n    </Panel>\n  );\n}\nfunction RecentHires({\n  assetsBase,\n  employees = names,\n}: {\n  assetsBase: string;\n  employees?: string[];\n}) {\n  const [page,setPage]=useState(0),[team,setTeam]=useState('all');\n  const visibleEmployees=employees.filter((_,index)=>team==='all'||(team==='design'?[1,2].includes(index%4):[0,3].includes(index%4)));\n  const pages=Math.max(1,Math.ceil(visibleEmployees.length/4));\n  return (\n    <Panel className=\"bt-recent-hires\" title=\"Recent hires\" action={<Select label=\"Hiring team\" size=\"sm\" options={[{value:\"all\",label:\"Helios team\"},{value:\"design\",label:\"Design\"},{value:\"engineering\",label:\"Engineering\"}]} value={team} onChange={event=>{setTeam(event.target.value);setPage(0)}}/>}>\n      <strong className=\"bt-number\">{visibleEmployees.length}</strong>\n      <div className=\"bt-hires\">\n        {visibleEmployees.slice(page * 4, page * 4 + 4).map((name, index) => (\n          <article key={name}>\n            <Avatar\n              name={name}\n              index={index + page * 4}\n              assetsBase={assetsBase}\n              secondary={['Joined today', '2 days ago', '5 days ago', 'A week ago'][index]}\n            />\n            <span>\n              {['Backend Engineer', 'UI Designer', 'User Researcher', 'DevOps Engineer'][index]}\n            </span>\n          </article>\n        ))}\n      </div>\n      <div className=\"bt-paging\">\n        <Button\n          variant=\"secondary\"\n          size=\"sm\"\n          onClick={() => setPage((page+pages-1)%pages)}\n        ><UIIcon name=\"arrow-left\" /> Previous</Button>\n        <span>\n          {page + 1}/{pages}\n        </span>\n        <Button\n          variant=\"secondary\"\n          size=\"sm\"\n          onClick={() => setPage((page+1)%pages)}\n        >Next <UIIcon name=\"arrow-right\" /></Button>\n      </div>\n    </Panel>\n  );\n}\nexport function RepositoryNavigation({\n  query,\n  id,\n  navigate,\n  onCreate,\n  collapsed=false,\n}: {\n  collapsed?:boolean;\n  query: string;\n  id: BoardTemplateId;\n  navigate: (id: BoardTemplateId) => void;\n  onCreate: () => void;\n}) {\n  const [selected, setSelected] = useState(\n    id === 'ai-image-generation' ? 'image generation' : 'coding scenario',\n  );\n  const tasks = [\n    'landing page design',\n    'image generation',\n    'coding scenario',\n    'mobile app UI',\n    'code refactor',\n  ];\n  return (\n    <div className={`bt-repository-nav ${collapsed?'bt-repository-collapsed':''}`}>\n      <button type=\"button\" onClick={onCreate}>\n        <RiAddLine size={20}/><span>New agent</span>\n      </button>\n      <button type=\"button\" onClick={() => navigate('multi-agent-chat')}>\n        <RiRobot2Line size={20}/><span>Automations</span>\n      </button>\n      <button type=\"button\" onClick={onCreate}>\n        <RiGitBranchLine size={20}/><span>Customize</span>\n      </button>\n      <p>Repositories</p>\n      {['helios-ui', 'helios coding project', 'studio landing page', 'mobile app study']\n        .filter(\n          (name) =>\n            name.toLowerCase().includes(query.toLowerCase()) ||\n            tasks.some((task) => task.includes(query.toLowerCase())),\n        )\n        .map((project, index) => (\n          <details key={project} open={index === 1}>\n            <summary><UIIcon name=\"folder\" />{project}</summary>\n            <div>\n              {tasks\n                .filter((task) => task.includes(query.toLowerCase()))\n                .map((task) => (\n                  <button\n                    type=\"button\"\n                    key={task}\n                    aria-current={selected === task ? 'page' : undefined}\n                    onClick={() => {\n                      setSelected(task);\n                      navigate(task === 'image generation' ? 'ai-image-generation' : 'ai-chat');\n                    }}\n                  >\n                    <span>{task}</span><small>{['34m','now','now','5h','18h'][tasks.indexOf(task)]}</small>\n                  </button>\n                ))}\n            </div>\n          </details>\n        ))}\n      <p className=\"bt-note\" role=\"status\">\n        Selected: {selected}\n      </p>\n    </div>\n  );\n}\n\nfunction useNarrowTemplate(threshold = 760) {\n  const ref = useRef<HTMLElement | null>(null);\n  const [narrow, setNarrow] = useState(false);\n  useEffect(() => {\n    const node = ref.current;\n    if (!node) return;\n    const update = () => setNarrow(threshold===1000 ? window.innerWidth<1280 : node.getBoundingClientRect().width <= threshold);\n    update();\n    const observer = new ResizeObserver(update);\n    observer.observe(node);\n    return () => observer.disconnect();\n  }, [threshold]);\n  return { ref, narrow };\n}\nfunction ResponsiveTemplatePanel({\n  open,\n  onOpenChange,\n  narrow,\n  title,\n  className,\n  children,\n}: {\n  open: boolean;\n  onOpenChange: (open: boolean) => void;\n  narrow: boolean;\n  title: string;\n  className: string;\n  children: ReactNode;\n}) {\n  const panelOverlayHost = useRef<HTMLDivElement>(null);\n  if (narrow)\n    return (\n      <Dialog open={open} onOpenChange={onOpenChange} title={title}>\n        <UNSAFE_PortalProvider getContainer={() => panelOverlayHost.current}>\n          <div className={`bt-mobile-panel bt-source-right-panel ${className}`}>{children}</div>\n          <div ref={panelOverlayHost} className=\"bt-panel-portal-host\" />\n        </UNSAFE_PortalProvider>\n      </Dialog>\n    );\n  return open ? <aside className={className}>{children}</aside> : null;\n}\n\nfunction BoardFrame({\n  id,\n  navigate,\n  children,\n  assetsBase,\n  chrome = true,\n  embedded = false,\n  suspended = false,\n}: {\n  id: BoardTemplateId;\n  navigate: (id: BoardTemplateId) => void;\n  children: ReactNode;\n  assetsBase: string;\n  chrome?: boolean;\n  embedded?: boolean;\n  suspended?: boolean;\n}) {\n  const MainElement = embedded ? 'div' : 'main';\n  const [query, setQuery] = useState(''),\n    [collapsed, setCollapsed] = useState(false),\n    [mobileNavOpen, setMobileNavOpen] = useState(false),\n    [theme, setTheme] = useState<'light' | 'dark' | undefined>(),\n    [notifications, setNotifications] = useState(false),\n    [settings, setSettings] = useState(false);\n  const [auth, setAuth] = useState<'signin' | 'signup' | null>(null),\n    [create, setCreate] = useState(false),\n    [agent, setAgent] = useState(defaultAgent),\n    [agentNotice, setAgentNotice] = useState('');\n  const overlayHost = useRef<HTMLDivElement>(null);\n  const [mobile,setMobile]=useState(false);\n  useEffect(()=>{const media=matchMedia('(max-width:1023px)');const update=()=>setMobile(media.matches);update();media.addEventListener('change',update);return()=>media.removeEventListener('change',update)},[]);\n  useEffect(() => {\n    if (!suspended) return;\n    setSettings(false);setNotifications(false);setAuth(null);setCreate(false);setMobileNavOpen(false);\n    if ('speechSynthesis' in window) speechSynthesis.cancel();\n    const shell = overlayHost.current?.closest('.bt-shell');\n    const active = document.activeElement;\n    if (active instanceof HTMLElement && shell?.contains(active))\n      active.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));\n    shell?.querySelectorAll<HTMLDialogElement>('dialog[open]').forEach((dialog) => dialog.close());\n  }, [suspended]);\n  const sidebarId = useId(),\n    menuRef = useRef<HTMLButtonElement>(null),\n    searchRef = useRef<HTMLInputElement>(null);\n  useEffect(() => {\n    if(mobileNavOpen)requestAnimationFrame(()=>document.getElementById(sidebarId)?.querySelector<HTMLButtonElement>('button')?.focus());\n  }, [mobileNavOpen]);\n  const go = (target: BoardTemplateId) => {\n    setMobileNavOpen(false);\n    navigate(target);\n  };\n  const isRepository = id === 'ai-chat' || id === 'ai-image-generation';\n  const definition = boardTemplateDefinitions.find((item) => item.id === id)!;\n  const CrumbIcon=id==='hr'?RiGroupLine:DASHBOARD_NAV.find(item=>item.key===({dashboard:'home','medical-profile':'medical','ai-image-generation':'ai-image','ai-profile':'profile'} as Record<string,string>)[id]||item.key===id)?.icon||RiChat3Line;\n  const nav = [\n    ['dashboard', 'Home', 'home'],\n    ['project-board', 'Project board', 'layers'],\n    ['hr', 'HR Team', 'users'],\n    ['marketing', 'Marketing', 'chart'],\n    ['calendar', 'Calendar', 'calendar'],\n    ['finance', 'Finance', 'pie'],\n    ['medical-profile', 'Medical Profile', 'plus'],\n    ['ai-chat', 'AI Chat', 'mail'],\n    ['ai-image-generation', 'AI Image Generation', 'file'],\n    ['ai-profile', 'Profile', 'user-plus'],\n  ] as const;\n  return (\n    <UNSAFE_PortalProvider getContainer={() => overlayHost.current}>\n      <TemplateChromeContext.Provider value={{mobile,suspended,navigationTrigger:menuRef,navigationOpen:mobileNavOpen,toggleNavigation:()=>setMobileNavOpen(value=>!value),notify:()=>setNotifications(true),settings:()=>setSettings(true)}}><div\n        className={`bt-shell ${chrome ? '' : 'bt-bare'} ${collapsed ? 'bt-collapsed' : ''} ${mobileNavOpen ? 'bt-mobile-nav-open' : ''} ${theme || ''} ${isRepository?'bt-repository-shell':''}`}\n        onKeyDown={(event) => {\n          if (event.key === 'Escape' && mobileNavOpen) {\n            setMobileNavOpen(false);\n            requestAnimationFrame(()=>menuRef.current?.focus());\n          }\n        }}\n        data-helios-theme={theme}\n        data-template-suspended={suspended || undefined}\n      >\n        {chrome && <NativeScope translate={templateCopy}><div className=\"bt-native-sidebar\" id={sidebarId} inert={mobile&&!mobileNavOpen} aria-hidden={mobile&&!mobileNavOpen||undefined}>\n          <DashboardSidebar mobile={mobile} flat={mobile} selected={id==='dashboard'?'home':id==='medical-profile'?'medical':id==='ai-profile'?'profile':id}\n            userName=\"Aarav Shah\" userInitials=\"A\" teamName=\"Helios team\" teamEmail=\"team@example.com\" teamAvatarSrc=\"/favicon.svg\"\n            teamPlan={isRepository?'Pro Plan':undefined} onUpgrade={isRepository?()=>location.assign('/?section=pricing'):undefined}\n            renderNavigation={isRepository ? ({query,collapsed})=><RepositoryNavigation collapsed={collapsed} query={query} id={id} navigate={go} onCreate={()=>setCreate(true)}/> : undefined}\n            items={id==='chat-starter' ? [\n              {key:'chat-starter',label:'Chat',icon:RiChat3Line,href:'/templates/chat-starter'},\n              {key:'dashboard',label:'Dashboard',icon:RiDashboardLine,href:'/templates/dashboard'},\n              {key:'components',label:'Components and Blocks',icon:RiGridLine,href:'/components'},\n              {key:'login',label:'Sign in',icon:RiLoginCircleLine,href:'/login'},\n              {key:'signup',label:'Sign up',icon:RiUserAddLine,href:'/signup'},\n            ] : DASHBOARD_NAV.map(item=>({...item,href:'/templates/'+(({home:'dashboard',medical:'medical-profile','ai-image':'ai-image-generation',profile:'ai-profile'} as Record<string,string>)[item.key]||item.key)}))}\n            onNavigate={item=>{const target=({home:'dashboard',medical:'medical-profile','ai-image':'ai-image-generation',profile:'ai-profile'} as Record<string,string>)[item.key]||item.key;if(['components','login','signup'].includes(target)){location.assign('/'+target);return;}go(target as BoardTemplateId)}}\n            onClose={()=>setMobileNavOpen(false)} onCollapsedChange={setCollapsed} onSettings={()=>setSettings(true)}\n            onAccountAction={action=>{if(action==='profile')go('ai-profile');else setSettings(true)}} />\n        </div></NativeScope>}\n        <MainElement className=\"bt-main\">\n          {chrome && <header className=\"bt-breadcrumb\">\n            <button\n              className=\"bt-mobile-menu\"\n              type=\"button\"\n              ref={menuRef}\n              aria-label={\n                mobileNavOpen ? 'Close workspace navigation' : 'Open workspace navigation'\n              }\n              aria-expanded={mobileNavOpen}\n              aria-controls={sidebarId}\n              onClick={() => setMobileNavOpen(!mobileNavOpen)}\n            ><UIIcon name=\"menu\" /></button>\n            <span className=\"bt-user-mark\">H</span>\n            <span>Helios team</span>\n            <span><UIIcon name=\"chevron-right\" /></span>\n            <span className=\"bt-breadcrumb-person\"><i>A</i>Aarav</span>\n            <span><UIIcon name=\"chevron-right\" /></span>\n            <strong><CrumbIcon className=\"bt-crumb-icon\"/>{id==='dashboard'?'Home':id==='medical-profile'?'Medical Profile':id==='finance'?'Finance':id==='marketing'?'Marketing':definition.name}</strong>\n\n          </header>}\n          <div className=\"bt-app-body\" inert={mobile&&mobileNavOpen}>{children}</div>\n          {mobile&&mobileNavOpen&&<button type=\"button\" className=\"bt-drawer-dismiss\" aria-label=\"Close workspace navigation\" aria-expanded=\"true\" onClick={()=>setMobileNavOpen(false)}/> }\n          {chrome && <footer className=\"bt-example-note\">\n            Local React example · fictional data ·{' '}\n            <a href=\"#/components\">Browse Helios UI components</a>\n          </footer>}\n        </MainElement>\n        <Dialog\n          open={notifications}\n          onOpenChange={setNotifications}\n          title=\"Workspace notifications\"\n          footer={\n            <Button variant=\"secondary\" onClick={() => setNotifications(false)}>\n              Close\n            </Button>\n          }\n        >\n          <NotificationCenter />\n        </Dialog>\n        <NativeScope translate={templateCopy}><NativeSettingsModal isOpen={settings} onClose={()=>setSettings(false)} /></NativeScope>\n        <Dialog\n          open={auth !== null}\n          onOpenChange={(open) => {\n            if (!open) setAuth(null);\n          }}\n          title={auth === 'signup' ? 'Sign up example' : 'Sign in example'}\n          description=\"Local authentication layout; no identity service is configured.\"\n          footer={\n            <Button variant=\"secondary\" onClick={() => setAuth(null)}>\n              Close\n            </Button>\n          }\n        >\n          {auth && <AuthCard mode={auth} />}\n        </Dialog>\n        <Dialog\n          open={create}\n          onOpenChange={setCreate}\n          title=\"Create an example agent\"\n          footer={\n            <>\n              <Button variant=\"secondary\" onClick={() => setCreate(false)}>\n                Cancel\n              </Button>\n              <Button\n                onClick={() => {\n                  setAgentNotice(\n                    `${agent.name} saved locally. Open Your agents to explore conversations.`,\n                  );\n                  setCreate(false);\n                }}\n              >\n                Save local agent\n              </Button>\n            </>\n          }\n        >\n          <SourceAgentCreator agent={agent} onChange={setAgent} />\n        </Dialog>\n        {agentNotice && (\n          <p className=\"bt-workspace-notice\" role=\"status\">\n            {agentNotice}\n          </p>\n        )}\n        <div ref={overlayHost} className=\"bt-portal-host\" />\n      </div>\n      </TemplateChromeContext.Provider></UNSAFE_PortalProvider>\n  );\n}\nfunction PageHeading({title,action,onFilter,notification=true}:{title:string;action?:ReactNode;onFilter?:()=>void;notification?:boolean}) {\n const chrome=useContext(TemplateChromeContext);\n const sourceAction=isValidElement<{onClick?:()=>void;disabled?:boolean;children?:ReactNode}>(action)&&action.props.onClick?<NativeButton variant=\"primary\" size=\"medium\" leadingIcon={RiAddLine} onClick={action.props.onClick} disabled={action.props.disabled}>{typeof action.props.children==='string'?action.props.children.replace(/^[＋+\\s]+/,''):action.props.children}</NativeButton>:action;\n return <NativeScope translate={templateCopy}><div className=\"bt-page-heading\"><div className=\"bt-source-title\"><NavigationToggle/><h1>{title}</h1></div><div className=\"bt-source-actions\">{notification&&<span className=\"bt-source-notification\"><NativeButton variant=\"secondary\" size=\"medium\" iconOnly leadingIcon={RiNotification4Line} aria-label=\"Open notifications\" onClick={chrome.notify}/><i>5</i></span>}{onFilter&&<NativeButton variant=\"secondary\" size=\"medium\" leadingIcon={RiFilter3Line} onClick={onFilter}>Filters</NativeButton>}{sourceAction}</div></div></NativeScope>;\n}\n\nexport type Employee = {\n  id: string;\n  name: string;\n  role: string;\n  department: string;\n  status: string;\n  salary: number;\n  date: string;\n};\nconst departments = ['Engineering', 'Operations', 'Design', 'Sales', 'Support', 'Marketing'];\nconst employeeSeed: Employee[] = Array.from({ length: 24 }, (_, index) => ({\n  id: 'emp-' + index,\n  name: names[index % names.length] + (index >= 12 ? ` ${index - 11}` : ''),\n  role: [\n    'Backend Engineer',\n    'Legal Counsel',\n    'Design Lead',\n    'Sales Associate',\n    'Support Specialist',\n    'Content Lead',\n  ][index % 6],\n  department: departments[index % 6],\n  status: index === 4 ? 'Contract' : index === 6 ? 'On leave' : 'Active',\n  salary: [780000, 1250000, 640000, 1470000, 1030000, 880000][index % 6],\n  date: `2026-${String(1 + (index % 10)).padStart(2, '0')}-${String(3 + (index % 24)).padStart(2, '0')}`,\n}));\nfunction HRContent({ assetsBase }: { assetsBase: string }) {\n  const [tableSearch,setTableSearch]=useState('');\n  const [employees, setEmployees] = useState(employeeSeed),\n    [department, setDepartment] = useState('All'),\n    [status, setStatus] = useState('All'),\n    [salary, setSalary] = useState('All'),\n    [period, setPeriod] = useState('12'),\n    [view, setView] = useState('departments'),\n    [survey, setSurvey] = useState('q3'),[pipelinePeriod,setPipelinePeriod]=useState('30'),\n    [edit, setEdit] = useState<Employee | null>(null),\n    [adding, setAdding] = useState(false),\n    [notice, setNotice] = useState('');\n  const [draft, setDraft] = useState<Employee>({\n    id: '',\n    name: '',\n    role: 'Product Designer',\n    department: 'Design',\n    status: 'Active',\n    salary: 900000,\n    date: '2026-10-26',\n  });\n  const formId = useId(),\n    filterRef = useRef<HTMLSelectElement>(null),\n    reduce = useReducedMotion();\n  const rows = employees.filter(\n    (employee) =>\n      (department === 'All' || employee.department === department) &&\n      (status === 'All' || employee.status === status) &&\n      (salary === 'All' ||\n        (salary === 'high' ? employee.salary >= 1000000 : employee.salary < 1000000)),\n  );\n  const counts = departments.map((label) => ({\n    label,\n    value: employees.filter((employee) => employee.department === label).length,\n  }));\n  const radar = ['Growth', 'Compensation', 'Culture', 'Management', 'Balance', 'Tools'].map(\n    (name, index) => ({\n      name,\n      value: [84, 71, 88, 79, 66, 91][index] + (survey === 'q4' ? [2, 3, -1, 4, 5, -2][index] : 0),\n    }),\n  );\n  const hiresData=Array.from({length:12},(_,index)=>({name:['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'][index],value:[6,8,10,7,9,12,8,10,11,9,10,8][index],secondary:[4.8,4.5,4.2,4.4,4,4.1,4.2,4,3.9,3.9,3.8,3.7][index]}));\n  const pipelineRows=['Applications','Screens','Interviews','Offers','Hires'].map((label,index)=>({label,value:(pipelinePeriod==='30'?[412,156,68,21,12]:[1124,416,201,56,33])[index],color:['var(--color-chart-2)','var(--color-chart-6)','var(--color-chart-5)','var(--color-chart-3)','var(--color-chart-8)'][index],barIcon:[<RiInboxLine size={16}/>,<RiPhoneLine size={16}/>,<RiChat3Line size={16}/>,<RiShakeHandsLine size={16}/>,<RiUserAddLine size={16}/>][index]}));\n  const columns: Column<Employee>[] = [\n    {\n      key: 'name',\n      header: 'Employee',\n      value: (row) => row.name,\n      sortable: true,\n      render: (row) => (\n        <div>\n          <Avatar\n            name={row.name}\n            index={Number(row.id.replace(/\\D/g, '')) % 6}\n            assetsBase={assetsBase}\n            secondary=\"\"\n          />\n          <small className=\"bt-row-role\">{row.role}</small>\n        </div>\n      ),\n    },\n    {\n      key: 'status',\n      header: 'Status',\n      value: (row) => row.status,\n      render: (row) => (\n        <InlineTemplateSelect\n          label={`Employment status for ${row.name}`}\n          value={row.status}\n          values={['Active', 'Contract', 'On leave']}\n          onChange={(value) =>\n            setEmployees((previous) =>\n              previous.map((item) => (item.id === row.id ? { ...item, status: value } : item)),\n            )\n          }\n        />\n      ),\n    },\n    {\n      key: 'department',\n      header: 'Department',\n      value: (row) => row.department,\n      sortable: true,\n      render: (row) => <span className=\"bt-chip\" data-category={row.department}>{row.department}</span>,\n    },\n    { key: 'date', header: 'Start date', value: (row) => row.date, render:row=>readableDate(row.date), sortable: true },\n    {\n      key: 'salary',\n      header: 'Salary',\n      value: (row) => row.salary,\n      sortable: true,\n      render: (row) => inr(row.salary),\n    },\n  ];\n  const searchedRows=rows.filter(row=>JSON.stringify(row).toLocaleLowerCase().includes(tableSearch.toLocaleLowerCase()));\n  return (\n    <>\n      <PageHeading\n        title=\"HR Team\"\n        onFilter={() => filterRef.current?.focus()}\n        action={\n          <Button\n            size=\"sm\"\n            onClick={() => {\n              setAdding(true);\n              setDraft({\n                id: '',\n                name: '',\n                role: 'Product Designer',\n                department: 'Design',\n                status: 'Active',\n                salary: 900000,\n                date: '2026-10-26',\n              });\n            }}\n          >\n            ＋ Add employee\n          </Button>\n        }\n      />\n      <div className=\"bt-tiles\">\n        <Tile label=\"Employees\" value={employees.length} trend=\"+4.2%\" icon={<RiGroupLine size={20}/>} />\n        <Tile label=\"Open roles\" value=\"12\" trend=\"+8.3%\" icon={<RiUserSearchLine size={20}/>} />\n        <Tile label=\"Time to hire\" value=\"24 days\" trend=\"-8.3%\" icon={<RiTimeLine size={20}/>} />\n        <Tile label=\"Attrition\" value=\"3.8%\" trend=\"-0.6%\" icon={<RiUserUnfollowLine size={20}/>} />\n      </div>\n      <div className=\"bt-grid-three\">\n        <RecentHires\n          assetsBase={assetsBase}\n          employees={employees.slice(-12).map((employee) => employee.name)}\n        />\n        <Panel className=\"bt-pipeline-panel\" title=\"Hiring pipeline\" action={<Select label=\"Hiring pipeline period\" leadingIcon={<UIIcon name=\"calendar\"/>} size=\"sm\" value={pipelinePeriod} options={[{value:'30',label:'Last 30 days'},{value:'90',label:'Last 90 days'}]} onChange={event=>setPipelinePeriod(event.target.value)}/>}><strong className=\"bt-number\">{pipelineRows[0].value} <small className=\"bt-fixture-delta\">+6.2%</small></strong><ProgressList values={pipelineRows} showShare/><div className=\"bt-source-legend-tiles\">{pipelineRows.map(item=><span key={item.label}><small><i style={{background:item.color}}/>{item.label}</small><strong>{item.value}</strong></span>)}</div></Panel>\n        <Panel\n          className=\"bt-engagement-panel\"\n          title=\"Team engagement\"\n          action={\n            <Select\n              label=\"Survey period\" leadingIcon={<UIIcon name=\"calendar\"/>}\n              size=\"sm\"\n              value={survey}\n              options={[\n                { value: 'q3', label: 'Q3 survey' },\n                { value: 'q4', label: 'Q4 survey' },\n              ]}\n              onChange={(event) => setSurvey(event.target.value)}\n            />\n          }\n        >\n          <div\n            className=\"bt-radar\"\n            role=\"img\"\n            aria-label={radar.map((item) => `${item.name} ${item.value}`).join(', ')}\n          >\n            <ResponsiveContainer width=\"100%\" height=\"100%\">\n              <RadarChart data={radar}>\n                <PolarGrid stroke=\"var(--hu-line)\" />\n                <PolarAngleAxis dataKey=\"name\" tick={({x,y,payload,index,textAnchor}:any)=><BoundedChartText x={x} y={y-6} textAnchor={textAnchor} fontSize={11} fill=\"var(--hu-muted)\"><tspan x={x}>{payload.value}</tspan><tspan x={x} dy={16} fontSize={14} fill=\"var(--hu-text)\">{radar[index]?.value}</tspan></BoundedChartText>} />\n                <Radar\n                  dataKey=\"value\"\n                  fill=\"var(--color-chart-2)\"\n                  fillOpacity={0.18}\n                  stroke=\"var(--color-chart-2-active)\"\n                  isAnimationActive={reduce === false}\n                />\n              </RadarChart>\n            </ResponsiveContainer>\n          </div>\n          <div className=\"bt-radar-center\"><strong>{Math.round(radar.reduce((sum,item)=>sum+item.value,0)/radar.length)}</strong><span>Strong</span></div>\n        </Panel>\n      </div>\n      <div className=\"bt-grid-two\">\n        <TemplateChart\n          id=\"combo-chart-card\"\n          title=\"Hires · Attrition\"\n          unit=\"count\"\n          data={hiresData} bar={{key:'value',name:'Hires',color:'var(--color-chart-2)'}} line={{key:'secondary',name:'Attrition',color:'var(--color-chart-3)',format:value=>`${value.toFixed(1)}%`}} ranges={[{id:'12',label:'This year',data:hiresData},{id:'6',label:'Last 6 months',data:hiresData.slice(-6)},{id:'3',label:'Last quarter',data:hiresData.slice(-3)}]} range={period} onRangeChange={value=>setPeriod(value)}\n        />\n        <Panel title=\"\" className=\"bt-breakdown-panel bt-people-panel\">\n          <Tabs\n            label=\"People distribution\"\n            value={view}\n            onValueChange={setView}\n            items={[\n              {\n                id: 'departments',\n                label: 'Departments',\n                content: <ProgressList values={counts} />,\n              },\n              {\n                id: 'sources',\n                label: 'Hiring sources',\n                content: (\n                  <ProgressList\n                    values={[\n                      { label: 'Referral', value: 10 },\n                      { label: 'Careers page', value: 8 },\n                      { label: 'Recruiter', value: 6 },\n                    ]}\n                  />\n                ),\n              },\n              {\n                id: 'locations',\n                label: 'Locations',\n                content: (\n                  <ProgressList\n                    values={[\n                      { label: 'Bengaluru', value: 10 },\n                      { label: 'Mumbai', value: 8 },\n                      { label: 'Remote', value: 6 },\n                    ]}\n                  />\n                ),\n              },\n            ]}\n          />\n        </Panel>\n      </div>\n      <section className=\"bt-data-section\">\n        <header>\n          <div>\n            <small>Total results</small>\n            <strong>{searchedRows.length} employees</strong>\n          </div>\n          <div>\n            <Select\n              ref={filterRef}\n              label=\"Department\"\n              size=\"sm\"\n              value={department}\n              options={['All', ...departments].map((value) => ({\n                value,\n                label: value === 'All' ? 'All departments' : value,\n              }))}\n              onChange={(event) => setDepartment(event.target.value)}\n            />\n            <Select\n              label=\"Employee status\"\n              size=\"sm\"\n              value={status}\n              options={['All', 'Active', 'Contract', 'On leave'].map((value) => ({\n                value,\n                label: value === 'All' ? 'All statuses' : value,\n              }))}\n              onChange={(event) => setStatus(event.target.value)}\n            />\n            <Select\n              label=\"Salary range\"\n              size=\"sm\"\n              value={salary}\n              options={[\n                { value: 'All', label: 'All salaries' },\n                { value: 'high', label: '₹10 lakh or more' },\n                { value: 'low', label: 'Below ₹10 lakh' },\n              ]}\n              onChange={(event) => setSalary(event.target.value)}\n            />\n            <Input className=\"bt-source-table-search\" label=\"Search records\" type=\"search\" size=\"sm\" leadingIcon={<BIcon name=\"search\"/>} placeholder=\"Search\" value={tableSearch} onChange={event=>setTableSearch(event.target.value)}/>\n          </div>\n        </header>\n        <TemplateTable presentation=\"board\" hideToolbar\n          onDelete={(row) =>\n            setEmployees((previous) => previous.filter((item) => item.id !== row.id))\n          }\n          rows={searchedRows}\n          columns={columns}\n          rowKey={(row) => row.id}\n          rowLabel={(row) => row.name}\n          caption=\"Example employee directory\"\n          pageSize={10}\n          onRetry={() => { setTableSearch('');\n            setDepartment('All');\n            setStatus('All');\n            setSalary('All');\n          }}\n          onRowAction={(row) => {\n            setEdit(row);\n            setDraft(row);\n          }}\n        />\n      </section>\n      <p className=\"bt-status-message\" role=\"status\">\n        {notice}\n      </p>\n      <Dialog\n        open={adding || edit !== null}\n        onOpenChange={(open) => {\n          if (!open) {\n            setAdding(false);\n            setEdit(null);\n          }\n        }}\n        title={adding ? 'Add employee' : 'Edit employee'}\n        description=\"Fictional employee record; no HR system is connected.\"\n        footer={\n          <>\n            <Button\n              variant=\"secondary\"\n              onClick={() => {\n                setAdding(false);\n                setEdit(null);\n              }}\n            >\n              Cancel\n            </Button>\n            {edit && (\n              <Button\n                variant=\"danger\"\n                onClick={() => {\n                  setEmployees((previous) =>\n                    previous.filter((employee) => employee.id !== edit.id),\n                  );\n                  setNotice('Employee removed from this example.');\n                  setEdit(null);\n                }}\n              >\n                Remove example\n              </Button>\n            )}\n            <Button type=\"submit\" form={formId}>\n              Save employee\n            </Button>\n          </>\n        }\n      >\n        <form\n          id={formId}\n          className=\"bt-dialog-fields\"\n          onSubmit={(event) => {\n            event.preventDefault();\n            const next = { ...draft, id: adding ? 'emp-' + Date.now() : draft.id };\n            setEmployees((previous) =>\n              adding\n                ? [...previous, next]\n                : previous.map((employee) => (employee.id === next.id ? next : employee)),\n            );\n            setNotice(`${next.name} saved in this local example.`);\n            setAdding(false);\n            setEdit(null);\n          }}\n        >\n          <Input\n            label=\"Employee name\"\n            required\n            value={draft.name}\n            onChange={(event) =>\n              setDraft((previous) => ({ ...previous, name: event.target.value }))\n            }\n          />\n          <Input\n            label=\"Employee role\"\n            required\n            value={draft.role}\n            onChange={(event) =>\n              setDraft((previous) => ({ ...previous, role: event.target.value }))\n            }\n          />\n          <Select\n            label=\"Employee department\"\n            value={draft.department}\n            options={departments.map((value) => ({ value, label: value }))}\n            onChange={(event) =>\n              setDraft((previous) => ({ ...previous, department: event.target.value }))\n            }\n          />\n          <Select\n            label=\"Employment status\"\n            value={draft.status}\n            options={['Active', 'Contract', 'On leave'].map((value) => ({ value, label: value }))}\n            onChange={(event) =>\n              setDraft((previous) => ({ ...previous, status: event.target.value }))\n            }\n          />\n          <Input\n            label=\"Annual salary INR\"\n            type=\"number\"\n            min=\"0\"\n            required\n            value={String(draft.salary)}\n            onChange={(event) =>\n              setDraft((previous) => ({ ...previous, salary: Number(event.target.value) }))\n            }\n          />\n        </form>\n      </Dialog>\n    </>\n  );\n}\n\ntype FinanceRow = {\n  id: string;\n  name: string;\n  account: string;\n  category: string;\n  date: string;\n  amount: number;\n};\nconst financeSeed: FinanceRow[] = Array.from({ length: 20 }, (_, index) => ({\n  id: 'txn-' + index,\n  name: [\n    'Fresh market',\n    'Music subscription',\n    'Example Corp payroll',\n    'Cloud storage',\n    'Electricity utility',\n    'Studio invoice',\n    'Transport pass',\n    'Design tools',\n  ][index % 8],\n  account: ['Savings', 'Checking', 'Credit card'][index % 3],\n  category: [\n    'Groceries',\n    'Subscriptions',\n    'Income',\n    'Subscriptions',\n    'Utilities',\n    'Income',\n    'Transport',\n    'Subscriptions',\n  ][index % 8],\n  date: `2026-${String((index % 10) + 1).padStart(2, '0')}-${String((index % 24) + 3).padStart(2, '0')}`,\n  amount: [-1350, -120, 62000, -300, -910, 12860, -760, -1800][index % 8],\n}));\nfunction CashFlow() {\n  const nodes = [\n    'Salary',\n    'Freelance',\n    'Dividends',\n    'Housing',\n    'Groceries',\n    'Transport',\n    'Subscriptions',\n    'Dining',\n    'Investing',\n    'Savings',\n  ].map((name) => ({ name }));\n  const links = [\n    { source: 0, target: 3, value: 2600 },\n    { source: 0, target: 4, value: 1200 },\n    { source: 0, target: 5, value: 600 },\n    { source: 0, target: 8, value: 4500 },\n    { source: 0, target: 9, value: 3500 },\n    { source: 1, target: 6, value: 500 },\n    { source: 1, target: 7, value: 900 },\n    { source: 1, target: 8, value: 1200 },\n    { source: 1, target: 9, value: 1200 },\n    { source: 2, target: 8, value: 900 },\n    { source: 2, target: 9, value: 1320 },\n  ];\n  return (\n    <TemplateChart\n      id=\"sankey-chart-card\"\n      title=\"Cash flow\"\n      axisLabels={['Income','Spending']}\n      unit=\"currency\"\n      data={[...links].sort((a,b)=>a.target-b.target||a.source-b.source).map((link) => ({\n        name: `${nodes[link.source].name} → ${nodes[link.target].name}`,\n        source: nodes[link.source].name,\n        sourceColor: ['var(--color-chart-7)','var(--color-chart-6)','var(--color-chart-5)'][link.source],\n        target: nodes[link.target].name,\n        value: link.value,\n      }))}\n    />\n  );\n}\nfunction FinanceContent() {\n  const [tableSearch,setTableSearch]=useState('');\n  const [rows, setRows] = useState(financeSeed),\n    [account, setAccount] = useState('All'),\n    [category, setCategory] = useState('All'),\n    [amountFilter, setAmountFilter] = useState('All'),\n    [edit, setEdit] = useState<FinanceRow | null>(null),\n    [adding, setAdding] = useState(false),\n    [draft, setDraft] = useState<FinanceRow>({\n      id: '',\n      name: '',\n      account: 'Savings',\n      category: 'Income',\n      date: '2026-10-26',\n      amount: 0,\n    }),\n    [notice, setNotice] = useState('');\n  const formId = useId(),\n    filter = useRef<HTMLSelectElement>(null);\n  const filtered = rows.filter(\n    (row) =>\n      (account === 'All' || row.account === account) &&\n      (category === 'All' || row.category === category) &&\n      (amountFilter === 'All' || (amountFilter === 'income' ? row.amount > 0 : row.amount < 0)),\n  );\n  const income = filtered.reduce((sum, row) => sum + Math.max(row.amount, 0), 0),\n    expenses = -filtered.reduce((sum, row) => sum + Math.min(row.amount, 0), 0);\n  const portfolio=[{name:'Stocks A',group:'Stocks',x:19,value:5,z:110},{name:'Stocks B',group:'Stocks',x:24,value:6,z:150},{name:'Stocks C',group:'Stocks',x:32,value:9,z:190},{name:'Stocks D',group:'Stocks',x:41,value:11,z:110},{name:'Funds A',group:'Funds',x:6,value:2,z:90},{name:'Funds B',group:'Funds',x:8,value:3,z:100},{name:'Funds C',group:'Funds',x:11,value:4,z:130},{name:'Funds D',group:'Funds',x:13,value:4.3,z:90},{name:'Crypto A',group:'Crypto',x:67,value:14.8,z:70},{name:'Crypto B',group:'Crypto',x:78,value:10,z:55}];\n  const columns: Column<FinanceRow>[] = [\n    { key: 'name', header: 'Transaction', value: (row) => row.name, sortable: true,render:row=><span className=\"bt-transaction-name\"><span>{row.category==='Transport'?<RiCarLine size={18}/>:<UIIcon name={row.amount>0?'users':'credit-card'}/>}</span><b className=\"bt-record-name\" title={row.name}>{row.name}</b></span> },\n    {\n      key: 'account',\n      header: 'Account',\n      value: (row) => row.account,\n      render: (row) => (\n        <InlineTemplateSelect\n          label={`Account for ${row.name}`}\n          value={row.account}\n          values={['Savings', 'Checking', 'Credit card']}\n          onChange={(value) =>\n            setRows((previous) =>\n              previous.map((item) => (item.id === row.id ? { ...item, account: value } : item)),\n            )\n          }\n        />\n      ),\n    },\n    {\n      key: 'category',\n      header: 'Category',\n      value: (row) => row.category,\n      render: (row) => <span className=\"bt-chip\" data-category={row.category}>{row.category}</span>,\n    },\n    { key: 'date', header: 'Date', value: (row) => row.date, render:row=>readableDate(row.date), sortable: true },\n    {\n      key: 'amount',\n      header: 'Amount',\n      value: (row) => row.amount,\n      sortable: true,\n      render: (row) => (\n        <span className={`bt-money ${row.amount >= 0 ? 'bt-positive' : ''}`}>\n          {row.amount > 0 ? '+' : ''}\n          {inr(row.amount)}\n        </span>\n      ),\n    },\n  ];\n  const searchedRows=filtered.filter(row=>JSON.stringify(row).toLocaleLowerCase().includes(tableSearch.toLocaleLowerCase()));\n  return (\n    <>\n      <PageHeading\n        title=\"Finance\"\n        onFilter={() => filter.current?.focus()}\n        action={\n          <Button\n            size=\"sm\"\n            onClick={() => {\n              setAdding(true);\n              setDraft({\n                id: '',\n                name: '',\n                account: 'Savings',\n                category: 'Income',\n                date: '2026-10-26',\n                amount: 0,\n              });\n            }}\n          >\n            ＋ Add transaction\n          </Button>\n        }\n      />\n      <div className=\"bt-tiles\">\n        <Tile\n          label=\"Total balance\"\n          value={inr(84230 + income - expenses)}\n          trend=\"+3.2%\"\n          icon={<RiWallet3Line size={20}/>}\n        />\n        <Tile label=\"Income\" value={inr(income)} trend=\"+6.1%\" icon={<RiHandCoinLine size={20}/>} />\n        <Tile label=\"Expenses\" value={inr(expenses)} trend=\"+2.4%\" icon={<RiBankCardLine size={20}/>} />\n        <Tile label=\"Invested\" value={inr(32400)} trend=\"+8.4%\" icon={<RiStockLine size={20}/>} />\n      </div>\n      <div className=\"bt-finance-cash-flow\"><CashFlow /></div>\n      <div className=\"bt-grid-three\">\n        <TemplateChart\n          id=\"radial-chart-card\"\n          title=\"Spending by category\"\n          unit=\"currency\" tiles={false}\n          data={[\n            { name: 'Housing', value: 2600 },\n            { name: 'Groceries', value: 1200 },\n            { name: 'Transport', value: 600 },\n            { name: 'Subscriptions', value: 500 },\n            { name: 'Dining', value: 900 },\n          ]}\n        />\n        <TemplateChart\n          id=\"scatter-chart-card\"\n          title=\"Portfolio\"\n          unit=\"percent\"\n          axisLabels={['Risk score', 'Return']}\n          data={portfolio} headline={Math.round(portfolio.reduce((sum,row)=>sum+row.value,0)/portfolio.length)} ranges={[{id:'current',label:'Year to date',data:portfolio},{id:'previous',label:'Last year',data:portfolio.map(row=>({...row,value:Math.round(row.value*.92*10)/10}))}]}\n        />\n        <DailySpending rows={filtered} />\n      </div>\n      <section className=\"bt-data-section\">\n        <header>\n          <div>\n            <small>Total results</small>\n            <strong>{searchedRows.length} transactions</strong>\n          </div>\n          <div>\n            <Select\n              ref={filter}\n              label=\"Account\"\n              size=\"sm\"\n              value={account}\n              options={['All', 'Savings', 'Checking', 'Credit card'].map((value) => ({\n                value,\n                label: value === 'All' ? 'All accounts' : value,\n              }))}\n              onChange={(event) => setAccount(event.target.value)}\n            />\n            <Select\n              label=\"Transaction category\"\n              size=\"sm\"\n              value={category}\n              options={['All', ...Array.from(new Set(rows.map((row) => row.category)))].map(\n                (value) => ({ value, label: value === 'All' ? 'All categories' : value }),\n              )}\n              onChange={(event) => setCategory(event.target.value)}\n            />\n            <Select\n              label=\"Transaction amount\"\n              size=\"sm\"\n              value={amountFilter}\n              options={[\n                { value: 'All', label: 'All amounts' },\n                { value: 'income', label: 'Income only' },\n                { value: 'expense', label: 'Expenses only' },\n              ]}\n              onChange={(event) => setAmountFilter(event.target.value)}\n            />\n            <Input className=\"bt-source-table-search\" label=\"Search records\" type=\"search\" size=\"sm\" leadingIcon={<BIcon name=\"search\"/>} placeholder=\"Search\" value={tableSearch} onChange={event=>setTableSearch(event.target.value)}/>\n          </div>\n        </header>\n        <TemplateTable presentation=\"board\" hideToolbar\n          onDelete={(row) => setRows((previous) => previous.filter((item) => item.id !== row.id))}\n          rows={searchedRows}\n          columns={columns}\n          rowKey={(row) => row.id}\n          rowLabel={(row) => row.name}\n          caption=\"Example finance transactions\"\n          pageSize={10}\n          onRetry={() => { setTableSearch('');\n            setAccount('All');\n            setCategory('All');\n            setAmountFilter('All');\n          }}\n          onRowAction={(row) => {\n            setEdit(row);\n            setDraft(row);\n          }}\n        />\n      </section>\n      <p role=\"status\" className=\"bt-status-message\">\n        {notice}\n      </p>\n      <Dialog\n        open={adding || edit !== null}\n        onOpenChange={(open) => {\n          if (!open) {\n            setAdding(false);\n            setEdit(null);\n          }\n        }}\n        title={adding ? 'Add transaction' : 'Edit transaction'}\n        description=\"Local fictional ledger; no banking or payment service is contacted.\"\n        footer={\n          <>\n            <Button\n              variant=\"secondary\"\n              onClick={() => {\n                setAdding(false);\n                setEdit(null);\n              }}\n            >\n              Cancel\n            </Button>\n            {edit && (\n              <Button\n                variant=\"danger\"\n                onClick={() => {\n                  setRows((previous) => previous.filter((row) => row.id !== edit.id));\n                  setNotice('Transaction removed locally.');\n                  setEdit(null);\n                }}\n              >\n                Delete example\n              </Button>\n            )}\n            <Button type=\"submit\" form={formId}>\n              Save transaction\n            </Button>\n          </>\n        }\n      >\n        <form\n          id={formId}\n          className=\"bt-dialog-fields\"\n          onSubmit={(event) => {\n            event.preventDefault();\n            const next = { ...draft, id: adding ? 'txn-' + Date.now() : draft.id };\n            setRows((previous) =>\n              adding\n                ? [next, ...previous]\n                : previous.map((row) => (row.id === next.id ? next : row)),\n            );\n            setAdding(false);\n            setEdit(null);\n            setNotice('Transaction saved in this local example.');\n          }}\n        >\n          <Input\n            label=\"Transaction name\"\n            required\n            value={draft.name}\n            onChange={(event) =>\n              setDraft((previous) => ({ ...previous, name: event.target.value }))\n            }\n          />\n          <Select\n            label=\"Transaction account\"\n            value={draft.account}\n            options={['Savings', 'Checking', 'Credit card'].map((value) => ({\n              value,\n              label: value,\n            }))}\n            onChange={(event) =>\n              setDraft((previous) => ({ ...previous, account: event.target.value }))\n            }\n          />\n          <Select\n            label=\"Transaction category\"\n            value={draft.category}\n            options={[\n              'Income',\n              'Groceries',\n              'Subscriptions',\n              'Utilities',\n              'Transport',\n              'Housing',\n              'Dining',\n            ].map((value) => ({ value, label: value }))}\n            onChange={(event) =>\n              setDraft((previous) => ({ ...previous, category: event.target.value }))\n            }\n          />\n          <Input\n            label=\"Amount INR\"\n            type=\"number\"\n            step=\"0.01\"\n            required\n            value={String(draft.amount)}\n            hint=\"Use negative amounts for expenses.\"\n            onChange={(event) =>\n              setDraft((previous) => ({ ...previous, amount: Number(event.target.value) }))\n            }\n          />\n          <Input\n            label=\"Transaction date\"\n            type=\"date\"\n            required\n            value={draft.date}\n            onChange={(event) =>\n              setDraft((previous) => ({ ...previous, date: event.target.value }))\n            }\n          />\n        </form>\n      </Dialog>\n    </>\n  );\n}\n\ntype Campaign = {\n  id: string;\n  name: string;\n  channel: string;\n  status: string;\n  objective: string;\n  date: string;\n  spend: number;\n};\nconst campaignSeed: Campaign[] = Array.from({ length: 20 }, (_, index) => ({\n  id: 'campaign-' + index,\n  name:\n    [\n      'Founder story video',\n      'Holiday gift guide',\n      'Newsletter promotion',\n      'Spring launch',\n      'Brand search',\n      'Cart retargeting',\n      'Webinar signups',\n      'Case study promo',\n    ][index % 8] + [' · India', ' · Global'][index % 2],\n  channel: ['Google Ads', 'Meta', 'LinkedIn', 'Email', 'X Ads'][index % 5],\n  status: ['Active', 'Paused', 'Draft'][index % 3],\n  objective: ['Awareness', 'Traffic', 'Conversions', 'Leads', 'Retargeting'][index % 5],\n  date: `2026-${String((index % 10) + 1).padStart(2, '0')}-${String((index % 24) + 3).padStart(2, '0')}`,\n  spend: index % 3 === 2 ? 0 : [34800, 30884, 1330, 34445, 19116, 28095, 25305, 333][index % 8],\n}));\n// Independent local snapshots keep template controls tied to the displayed dataset.\nconst marketingMonths=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];\nconst marketingSpendData=marketingMonths.map((name,index)=>({name,value:[11000,15000,12000,18000,17000,18000,19000,20000,21000,23000,22000,21700][index],secondary:[3,3.3,3.1,3.5,3.2,3.4,3.7,3.6,3.8,3.7,4,3.9][index]}));\nconst marketingVisitorsData=marketingMonths.map((name,index)=>({name,value:[8200,9100,8700,10500,9900,11000,11600,12100,12800,13400,13000,14100][index],series:[{name:'Organic',value:[4600,5000,4800,5800,5500,6100,6400,6700,7100,7400,7200,7900][index]},{name:'Paid',value:[2300,2600,2500,3000,2800,3100,3300,3400,3700,3800,3700,4100][index]},{name:'Social',value:[1300,1500,1400,1700,1600,1800,1900,2000,2000,2200,2100,2100][index]}]}));\nconst marketingSpendRanges=[{id:'year',label:'This year',data:marketingSpendData,headline:217700,delta:9.4},{id:'half',label:'Last 6 months',data:marketingSpendData.slice(-6),delta:7.2},{id:'previous',label:'Last year',data:marketingSpendData.map(row=>({...row,value:Math.round(row.value*.91),secondary:row.secondary*.95})),delta:6.8}];\nconst marketingVisitorRanges=[{id:'year',label:'This year',data:marketingVisitorsData,headline:134400,delta:8.8},{id:'half',label:'Last 6 months',data:marketingVisitorsData.slice(-6),delta:6.2},{id:'previous',label:'Last year',data:marketingVisitorsData.map(row=>({...row,value:Math.round(row.value*.92),series:row.series.map(part=>({...part,value:Math.round(part.value*.92)}))})),delta:5.4}];\nfunction MarketingContent() {\n  const [tableSearch,setTableSearch]=useState('');\n  const [rows, setRows] = useState(campaignSeed),\n    [channel, setChannel] = useState('All'),\n    [objective, setObjective] = useState('All'),\n    [spendFilter, setSpendFilter] = useState('All'),\n    [view, setView] = useState('channels'),\n    [spendPeriod,setSpendPeriod]=useState('30'),\n    [spendingEmphasis,setSpendingEmphasis]=useState<number|null>(null),\n    [adding, setAdding] = useState(false),\n    [edit, setEdit] = useState<Campaign | null>(null),\n    [draft, setDraft] = useState<Campaign>({\n      id: '',\n      name: '',\n      channel: 'Google Ads',\n      status: 'Draft',\n      objective: 'Awareness',\n      date: '2026-10-26',\n      spend: 0,\n    }),\n    [notice, setNotice] = useState('');\n  const form = useId(),\n    filter = useRef<HTMLSelectElement>(null);\n  const filtered = rows.filter(\n      (row) =>\n        (channel === 'All' || row.channel === channel) &&\n        (objective === 'All' || row.objective === objective) &&\n        (spendFilter === 'All' || (spendFilter === 'spent' ? row.spend > 0 : row.spend === 0)),\n    ),\n    spend = filtered.reduce((sum, row) => sum + row.spend, 0);\n  const channels = ['Google Ads', 'Meta', 'LinkedIn', 'Email', 'X Ads'].map((label) => ({\n    label,\n    value: rows.filter((row) => row.channel === label).reduce((sum, row) => sum + row.spend, 0),\n  }));\n  const spendingMix=[{label:'Paid search',value:11400},{label:'Paid social',value:7620},{label:'Email',value:3180},{label:'Affiliates',value:2680}].map(item=>({...item,value:item.value*(spendPeriod==='90'?3:1)}));\n  const paidSearchShare=Math.round(spendingMix[spendingEmphasis??0].value/spendingMix.reduce((sum,item)=>sum+item.value,0)*100);\n  const marketingReduced=useReducedMotion();\n  const columns: Column<Campaign>[] = [\n    { key: 'name', header: 'Campaign', value: (row) => row.name, sortable: true, render:row=><span className=\"bt-transaction-name\"><span>{row.channel==='Google Ads'?<RiGoogleFill size={18}/>:row.channel==='Meta'?<RiMetaLine size={18}/>:row.channel==='LinkedIn'?<RiLinkedinBoxFill size={18}/>:row.channel==='X Ads'?<RiTwitterXLine size={18}/>:<RiMailLine size={18}/>}</span><b className=\"bt-record-name\" title={row.name}>{row.name}</b></span> },\n    {\n      key: 'status',\n      header: 'Delivery',\n      value: (row) => row.status,\n      render: (row) => (\n        <InlineTemplateSelect\n          label={`Delivery status for ${row.name}`}\n          value={row.status}\n          values={['Active', 'Paused', 'Draft']}\n          onChange={(value) =>\n            setRows((previous) =>\n              previous.map((item) => (item.id === row.id ? { ...item, status: value } : item)),\n            )\n          }\n        />\n      ),\n    },\n    {\n      key: 'objective',\n      header: 'Objective',\n      value: (row) => row.objective,\n      render: (row) => <span className=\"bt-chip\" data-category={row.objective}>{row.objective}</span>,\n    },\n    { key: 'date', header: 'Last updated', value: (row) => row.date, render:row=>readableDate(row.date), sortable: true },\n    {\n      key: 'spend',\n      header: 'Spend',\n      value: (row) => row.spend,\n      sortable: true,\n      render: (row) => inr(row.spend),\n    },\n  ];\n  const searchedRows=filtered.filter(row=>JSON.stringify(row).toLocaleLowerCase().includes(tableSearch.toLocaleLowerCase()));\n  return (\n    <>\n      <PageHeading\n        title=\"Marketing\"\n        onFilter={() => filter.current?.focus()}\n        action={\n          <Button\n            size=\"sm\"\n            onClick={() => {\n              setAdding(true);\n              setDraft({\n                id: '',\n                name: '',\n                channel: 'Google Ads',\n                status: 'Draft',\n                objective: 'Awareness',\n                date: '2026-10-26',\n                spend: 0,\n              });\n            }}\n          >\n            ＋ New campaign\n          </Button>\n        }\n      />\n      <div className=\"bt-tiles\">\n        <Tile label=\"Ad spend\" value={inr(spend)} trend=\"+8.4%\" icon={<RiCoinsLine size={20}/>} />\n        <Tile label=\"Impressions\" value=\"1.94M\" trend=\"+12.6%\" icon={<RiEyeLine size={20}/>} />\n        <Tile\n          label=\"Conversions\"\n          value=\"1,286\"\n          trend=\"+5.2%\"\n          icon={<RiUserFollowLine size={20}/>}\n        />\n        <Tile label=\"Cost per click\" value={inr(12.4, 2)} trend=\"-3.1%\" icon={<RiCursorLine size={20}/>} />\n      </div>\n      <div className=\"bt-grid-three\">\n        <TemplateChart\n          id=\"funnel-chart-card\"\n          title=\"Acquisition funnel\"\n          unit=\"count\"\n          data={[\n            { name: 'Visits', value: 96400 },\n            { name: 'Sign-ups', value: 38600 },\n            { name: 'Trials', value: 14100 },\n            { name: 'Customers', value: 5200 },\n          ]}\n        />\n        <section className=\"bt-panel bt-spend-channel\">\n          <header><div><h2>Spend by channel</h2><div className=\"bt-spending-headline\"><strong className=\"bt-number\">{inr(spendingMix.reduce((sum,row)=>sum+row.value,0))}</strong><small>+8.4%</small></div></div><NativeScope><NativeChartSelect aria-label=\"Channel spend period\" selectedKey={spendPeriod} onSelectionChange={key=>key!==null&&setSpendPeriod(String(key))} className=\"hc-source-range-select\" triggerClassName=\"hc-source-range-trigger\" renderValue={<><UIIcon name=\"calendar\"/>{spendPeriod==='30'?'Last 30 days':'Last 90 days'}</>}><NativeChartSelectItem id=\"30\" textValue=\"Last 30 days\">Last 30 days</NativeChartSelectItem><NativeChartSelectItem id=\"90\" textValue=\"Last 90 days\">Last 90 days</NativeChartSelectItem></NativeChartSelect></NativeScope></header>\n          <div className=\"bt-gauge\" role=\"group\" tabIndex={0} aria-label=\"Channel spending distribution\" onKeyDown={event=>{if(event.key==='ArrowRight'||event.key==='ArrowLeft'){event.preventDefault();setSpendingEmphasis(value=>((value??0)+(event.key==='ArrowRight'?1:spendingMix.length-1))%spendingMix.length)}if(event.key==='Escape')setSpendingEmphasis(null)}}>\n            <ResponsiveContainer width=\"100%\" height={165} initialDimension={{width:339,height:165}}><PieChart accessibilityLayer>\n              <Pie data={[{value:1}]} dataKey=\"value\" cx=\"50%\" cy=\"78%\" startAngle={180} endAngle={0} innerRadius={92} outerRadius={123} cornerRadius={15.5} fill=\"var(--color-chart-track)\" stroke=\"none\" isAnimationActive={false}/>\n              <Pie data={spendingMix} dataKey=\"value\" nameKey=\"label\" cx=\"50%\" cy=\"78%\" startAngle={180} endAngle={0} innerRadius={92} outerRadius={123} cornerRadius={15.5} paddingAngle={3} stroke=\"none\" isAnimationActive={marketingReduced===false} animationDuration={450} onMouseEnter={(_,index)=>setSpendingEmphasis(index)} onMouseLeave={()=>setSpendingEmphasis(null)}>{spendingMix.map((item,index)=><Cell key={item.label} fill={['var(--color-chart-2)','var(--color-chart-6)','var(--color-chart-5)','var(--color-chart-3)'][index]} opacity={spendingEmphasis===null||spendingEmphasis===index?1:.3}/>)}</Pie>\n            </PieChart></ResponsiveContainer>\n            <strong>{paidSearchShare}%<small>{spendingMix[spendingEmphasis??0].label}</small></strong>\n          </div>\n          <div className=\"bt-channel-legend\">\n            {spendingMix.map((item, index) => (\n              <span key={item.label}>\n                <i\n                  aria-hidden=\"true\"\n                  style={{\n                    background: [\n                      'var(--color-chart-2)',\n                      'var(--color-chart-6)',\n                      'var(--color-chart-5)',\n                      'var(--color-chart-3)',\n                      'var(--color-chart-7)',\n                    ][index],\n                  }}\n                />\n                {item.label}\n                <strong>{inr(item.value)}</strong>\n              </span>\n            ))}\n          </div>\n        </section>\n        <Panel title=\"\" className=\"bt-breakdown-panel bt-traffic-panel\">\n          <Tabs\n            label=\"Marketing breakdown\"\n            value={view}\n            onValueChange={setView}\n            items={[\n              { id: 'channels', label: 'Channels', content: <ProgressList unit=\"%\" values={[{label:\"Google Ads\",value:39,icon:<RiGoogleFill size={16}/>},{label:\"Meta\",value:25,icon:<RiMetaLine size={16}/>},{label:\"X Ads\",value:14,icon:<RiTwitterXLine size={16}/>},{label:\"LinkedIn\",value:8,icon:<RiLinkedinBoxFill size={16}/>},{label:\"Email\",value:7,icon:<RiMailLine size={16}/>},{label:\"Direct\",value:5},{label:\"Referral\",value:2}]} /> },\n              {\n                id: 'campaigns',\n                label: 'Campaigns',\n                content: (\n                  <ProgressList\n                    values={rows.map((row) => ({ label: row.name, value: row.spend }))}\n                  />\n                ),\n              },\n              {\n                id: 'pages',\n                label: 'Landing pages',\n                content: (\n                  <ProgressList\n                    values={[\n                      { label: 'Homepage', value: 4800 },\n                      { label: 'Product', value: 3200 },\n                      { label: 'Pricing', value: 1800 },\n                      { label: 'Blog', value: 1100 },\n                    ]}\n                  />\n                ),\n              },\n            ]}\n          />\n        </Panel>\n      </div>\n      <div className=\"bt-grid-two\">\n        <TemplateChart id=\"combo-chart-card\" title=\"Ad spend · ROAS 3.6x\" unit=\"currency\" data={marketingSpendData} bar={{key:'value',name:'Ad spend',color:'var(--color-chart-2)'}} line={{key:'secondary',name:'ROAS',color:'var(--color-chart-6)',format:value=>`${value.toFixed(1)}x`}} ranges={marketingSpendRanges} />\n        <TemplateChart id=\"area-chart-card\" title=\"Visitors\" unit=\"count\" data={marketingVisitorsData} ranges={marketingVisitorRanges} />\n      </div>\n      <section className=\"bt-data-section\">\n        <header>\n          <div>\n            <small>Total results</small>\n            <strong>{searchedRows.length} campaigns</strong>\n          </div>\n          <div>\n            <Select\n              ref={filter}\n              label=\"Campaign channel\"\n              size=\"sm\"\n              value={channel}\n              options={['All', ...channels.map((item) => item.label)].map((value) => ({\n                value,\n                label: value === 'All' ? 'All channels' : value,\n              }))}\n              onChange={(event) => setChannel(event.target.value)}\n            />\n            <Select\n              label=\"Campaign objective\"\n              size=\"sm\"\n              value={objective}\n              options={['All', 'Awareness', 'Traffic', 'Conversions', 'Leads', 'Retargeting'].map(\n                (value) => ({ value, label: value === 'All' ? 'All objectives' : value }),\n              )}\n              onChange={(event) => setObjective(event.target.value)}\n            />\n            <Select\n              label=\"Campaign spend\"\n              size=\"sm\"\n              value={spendFilter}\n              options={[\n                { value: 'All', label: 'All spend' },\n                { value: 'spent', label: 'With spend' },\n                { value: 'none', label: 'No spend' },\n              ]}\n              onChange={(event) => setSpendFilter(event.target.value)}\n            />\n            <Input className=\"bt-source-table-search\" label=\"Search records\" type=\"search\" size=\"sm\" leadingIcon={<BIcon name=\"search\"/>} placeholder=\"Search\" value={tableSearch} onChange={event=>setTableSearch(event.target.value)}/>\n          </div>\n        </header>\n        <TemplateTable presentation=\"board\" hideToolbar\n          onDelete={(row) => setRows((previous) => previous.filter((item) => item.id !== row.id))}\n          rows={searchedRows}\n          columns={columns}\n          rowKey={(row) => row.id}\n          rowLabel={(row) => row.name}\n          caption=\"Example marketing campaigns\"\n          pageSize={10}\n          onRetry={() => { setTableSearch('');\n            setChannel('All');\n            setObjective('All');\n            setSpendFilter('All');\n          }}\n          onRowAction={(row) => {\n            setEdit(row);\n            setDraft(row);\n          }}\n        />\n      </section>\n      <p role=\"status\" className=\"bt-status-message\">\n        {notice}\n      </p>\n      <Dialog\n        open={adding || edit !== null}\n        onOpenChange={(open) => {\n          if (!open) {\n            setAdding(false);\n            setEdit(null);\n          }\n        }}\n        title={adding ? 'New campaign' : 'Edit campaign'}\n        description=\"This saves a local example. No ads are created or published.\"\n        footer={\n          <>\n            <Button\n              variant=\"secondary\"\n              onClick={() => {\n                setAdding(false);\n                setEdit(null);\n              }}\n            >\n              Cancel\n            </Button>\n            {edit && (\n              <Button\n                variant=\"danger\"\n                onClick={() => {\n                  setRows((previous) => previous.filter((row) => row.id !== edit.id));\n                  setNotice('Example campaign removed.');\n                  setEdit(null);\n                }}\n              >\n                Delete example\n              </Button>\n            )}\n            <Button type=\"submit\" form={form}>\n              Save campaign\n            </Button>\n          </>\n        }\n      >\n        <form\n          id={form}\n          className=\"bt-dialog-fields\"\n          onSubmit={(event) => {\n            event.preventDefault();\n            const next = { ...draft, id: adding ? 'campaign-' + Date.now() : draft.id };\n            setRows((previous) =>\n              adding\n                ? [next, ...previous]\n                : previous.map((row) => (row.id === next.id ? next : row)),\n            );\n            setAdding(false);\n            setEdit(null);\n            setNotice('Campaign saved in this local example. No ad service was contacted.');\n          }}\n        >\n          <Input\n            label=\"Campaign name\"\n            required\n            value={draft.name}\n            onChange={(event) =>\n              setDraft((previous) => ({ ...previous, name: event.target.value }))\n            }\n          />\n          <Select\n            label=\"Campaign channel\"\n            value={draft.channel}\n            options={channels.map((item) => ({ value: item.label, label: item.label }))}\n            onChange={(event) =>\n              setDraft((previous) => ({ ...previous, channel: event.target.value }))\n            }\n          />\n          <Select\n            label=\"Delivery status\"\n            value={draft.status}\n            options={['Draft', 'Active', 'Paused'].map((value) => ({ value, label: value }))}\n            onChange={(event) =>\n              setDraft((previous) => ({ ...previous, status: event.target.value }))\n            }\n          />\n          <Select\n            label=\"Campaign objective\"\n            value={draft.objective}\n            options={['Awareness', 'Traffic', 'Conversions', 'Leads', 'Retargeting'].map(\n              (value) => ({ value, label: value }),\n            )}\n            onChange={(event) =>\n              setDraft((previous) => ({ ...previous, objective: event.target.value }))\n            }\n          />\n          <Input\n            label=\"Campaign spend INR\"\n            type=\"number\"\n            min=\"0\"\n            required\n            value={String(draft.spend)}\n            onChange={(event) =>\n              setDraft((previous) => ({ ...previous, spend: Number(event.target.value) }))\n            }\n          />\n        </form>\n      </Dialog>\n    </>\n  );\n}\n\ntype Customer = {\n  id: string;\n  name: string;\n  purchase: string;\n  status: string;\n  date: string;\n  price: number;\n  product: string;\n  region: string;\n};\nconst customerSeed: Customer[] = Array.from({ length: 24 }, (_, index) => ({\n  id: 'customer-' + index,\n  name: names[index % 12] + (index >= 12 ? ` ${index - 11}` : ''),\n  purchase: ['Waiting', 'Completed', 'Processing'][index % 3],\n  status: ['Delivery failed', 'Shipped', 'Delivery waiting', 'Confirmed'][index % 4],\n  date: `2026-${String((index % 10) + 1).padStart(2, '0')}-${String((index % 24) + 3).padStart(2, '0')}`,\n  price: [3412, 1899, 2752, 145, 708, 224, 2959, 2646, 3770, 3740, 1747, 3976][index % 12],\n  product: ['Core','Pro','Enterprise'][index%3],region:['India','Europe','Americas','Asia Pacific'][index%4],\n}));\nfunction HomeContent({ assetsBase }: { assetsBase: string }) {\n  const [tableSearch,setTableSearch]=useState('');\n  const [customerDraft,setCustomerDraft]=useState<Customer|null>(null);\n  const [rows, setRows] = useState(customerSeed),\n    [purchase, setPurchase] = useState('All'),\n    [price, setPrice] = useState('All'),\n    [product,setProduct]=useState('All'),[region,setRegion]=useState('All'),\n    [detail, setDetail] = useState<Customer | null>(null),\n    [ticket, setTicket] = useState(false),\n    [draft, setDraft] = useState(''),\n    [tickets, setTickets] = useState<string[]>([]),\n    [notice, setNotice] = useState('');\n  const form = useId(),\n    filter = useRef<HTMLSelectElement>(null);\n  const filtered = rows.filter(\n    (row) =>\n      (purchase === 'All' || row.purchase === purchase) && (product==='All'||row.product===product) && (region==='All'||row.region===region) &&\n      (price === 'All' || (price === 'high' ? row.price >= 2000 : row.price < 2000)),\n  );\n  const columns: Column<Customer>[] = [\n    {\n      key: 'name',\n      header: 'Customer name',\n      value: (row) => row.name,\n      sortable: true,\n      render: (row) => (\n        <Avatar\n          name={row.name}\n          index={Number(row.id.replace(/\\D/g, '')) % 6}\n          assetsBase={assetsBase}\n          secondary=\"\"\n        />\n      ),\n    },\n    {\n      key: 'purchase',\n      header: 'Purchase',\n      value: (row) => row.purchase,\n      render: (row) => (\n        <InlineTemplateSelect\n          label={`Purchase status for ${row.name}`}\n          value={row.purchase}\n          values={['Waiting', 'Completed', 'Processing']}\n          onChange={(value) =>\n            setRows((previous) =>\n              previous.map((item) => (item.id === row.id ? { ...item, purchase: value } : item)),\n            )\n          }\n        />\n      ),\n    },\n    {\n      key: 'status',\n      header: 'Status',\n      value: (row) => row.status,\n      render: (row) => <Status value={row.status} />,\n    },\n    { key: 'date', header: 'Last updated', value: (row) => row.date, render:row=>readableDate(row.date), sortable: true },\n    {\n      key: 'price',\n      header: 'Price',\n      value: (row) => row.price,\n      sortable: true,\n      render: (row) => <span className=\"bt-money\">{inr(row.price)}</span>,\n    },\n  ];\n  const searchedRows=filtered.filter(row=>JSON.stringify(row).toLocaleLowerCase().includes(tableSearch.toLocaleLowerCase()));\n  return (\n    <>\n      <PageHeading\n        title=\"Welcome Aarav\"\n        onFilter={() => filter.current?.focus()}\n        action={\n          <Button size=\"sm\" onClick={() => setTicket(true)}>\n            ＋ Create ticket\n          </Button>\n        }\n      />\n      <div className=\"bt-dashboard-top\">\n        <RecentHires assetsBase={assetsBase} />\n        <SourceChartPreview fluid id=\"earnings-chart-card\" title=\"Earned so far\" />\n      </div>\n      <div className=\"bt-grid-two\">\n        <div className=\"bt-home-revenue\"><SourceChartPreview fluid id=\"revenue-chart-card\" title=\"Revenue\" delta={9.4} periodPresentation=\"segmented\" ranges={['Weekly','Monthly','Yearly'].map((label,rangeIndex)=>({id:label.toLowerCase(),label,data:[1400,1900,2600,2300,3400,3100,2700,3800,5000,4700,4000,5600].map((value,index)=>({name:['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'][index],value:Math.round(value*[1,1.12,1.26][rangeIndex])}))}))}/></div>\n        <ContributionCard />\n      </div>\n      <div className=\"bt-tiles\">\n        <Tile label=\"Customers\" value={rows.length} trend=\"+5.3%\" icon={<RiGroupLine size={20}/>} />\n        <Tile label=\"Units sold\" value={385} trend=\"-2.1%\" icon={<RiBox3Line size={20}/>} />\n        <Tile\n          label=\"Orders\"\n          value={rows.filter((row) => row.purchase === 'Completed').length}\n          trend=\"0.00%\"\n          icon={<RiShoppingBasket2Line size={20}/>}\n        />\n        <Tile\n          label=\"Support tickets\"\n          value={tickets.length}\n          trend=\"+12.8%\"\n          icon={<RiChat4Line size={20}/>}\n        />\n      </div>\n      {tickets.length > 0 && (\n        <Panel title=\"New local tickets\">\n          <ul className=\"bt-local-list\">\n            {tickets.map((ticket, index) => (\n              <li key={index}>{ticket}</li>\n            ))}\n          </ul>\n        </Panel>\n      )}\n      <section className=\"bt-data-section\">\n        <header>\n          <div>\n            <small>Total results</small>\n            <strong>{searchedRows.length} customers</strong>\n          </div>\n          <div>\n            <Select\n              label=\"Customer price\"\n              size=\"sm\"\n              value={price}\n              options={[\n                { value: 'All', label: 'All prices' },\n                { value: 'high', label: '₹2,000 or more' },\n                { value: 'low', label: 'Below ₹2,000' },\n              ]}\n              onChange={(event) => setPrice(event.target.value)}\n            />\n            <Select ref={filter} label=\"Customer product\" size=\"sm\" value={product} options={['All','Core','Pro','Enterprise'].map(value=>({value,label:value==='All'?'All products':value}))} onChange={event=>setProduct(event.target.value)}/>\n            <Select label=\"Customer region\" size=\"sm\" value={region} options={['All','India','Europe','Americas','Asia Pacific'].map(value=>({value,label:value==='All'?'All regions':value}))} onChange={event=>setRegion(event.target.value)}/>\n            <Input className=\"bt-source-table-search\" label=\"Search records\" type=\"search\" size=\"sm\" leadingIcon={<BIcon name=\"search\"/>} placeholder=\"Search\" value={tableSearch} onChange={event=>setTableSearch(event.target.value)}/>\n          </div>\n        </header>\n        <TemplateTable presentation=\"board\" hideToolbar\n          onDelete={(row) => setRows((previous) => previous.filter((item) => item.id !== row.id))}\n          rows={searchedRows}\n          columns={columns}\n          rowKey={(row) => row.id}\n          rowLabel={(row) => row.name}\n          caption=\"Example customer orders\"\n          pageSize={12}\n          onRetry={() => { setTableSearch('');\n            setPurchase('All');setProduct('All');setRegion('All');\n            setPrice('All');\n          }}\n          onRowAction={row=>{setDetail(row);setCustomerDraft({...row})}}\n        />\n      </section>\n      <p className=\"bt-status-message\" role=\"status\">\n        {notice}\n      </p>\n      <Dialog\n        open={ticket}\n        onOpenChange={setTicket}\n        title=\"Create ticket\"\n        description=\"A local task example; no external project system is contacted.\"\n        footer={\n          <>\n            <Button variant=\"secondary\" onClick={() => setTicket(false)}>\n              Cancel\n            </Button>\n            <Button type=\"submit\" form={form}>\n              Create example ticket\n            </Button>\n          </>\n        }\n      >\n        <form\n          id={form}\n          onSubmit={(event) => {\n            event.preventDefault();\n            setTickets((previous) => [...previous, draft.trim()]);\n            setDraft('');\n            setTicket(false);\n            setNotice('Ticket added to this local dashboard.');\n          }}\n        >\n          <Input\n            label=\"Ticket title\"\n            required\n            maxLength={180}\n            value={draft}\n            onChange={(event) => setDraft(event.target.value)}\n          />\n        </form>\n      </Dialog>\n      <Dialog\n        open={detail !== null}\n        onOpenChange={(open) => {\n          if (!open) setDetail(null);\n        }}\n        title={detail?.name || 'Customer details'}\n        description=\"Fictional customer record.\"\n        footer={\n          <>\n            <Button variant=\"secondary\" onClick={() => setDetail(null)}>\n              Close\n            </Button>\n            <Button\n              onClick={() => {\n                if (!detail) return;\n                setRows((previous) =>\n                  previous.map((row) =>\n                    row.id === detail.id\n                      ? { ...row, purchase: 'Completed', status: 'Confirmed' }\n                      : row,\n                  ),\n                );\n                setNotice('Example order marked completed.');\n                setDetail(null);\n              }}\n            >\n              Complete example order\n            </Button>\n            <Button type=\"submit\" form={form+'-customer'}>Save customer</Button>\n          </>\n        }\n      >\n        {customerDraft&&<form id={form+'-customer'} className=\"bt-dialog-fields\" onSubmit={event=>{event.preventDefault();setRows(previous=>previous.map(row=>row.id===customerDraft.id?customerDraft:row));setDetail(null);setNotice('Customer saved in this local example.')}}>\n          <Input label=\"Customer name\" required value={customerDraft.name} onChange={event=>setCustomerDraft({...customerDraft,name:event.target.value})}/>\n          <Select label=\"Purchase status\" value={customerDraft.purchase} options={['Waiting','Completed','Processing'].map(value=>({value,label:value}))} onChange={event=>setCustomerDraft({...customerDraft,purchase:event.target.value})}/>\n          <Select label=\"Delivery status\" value={customerDraft.status} options={['Delivery failed','Shipped','Delivery waiting','Confirmed'].map(value=>({value,label:value}))} onChange={event=>setCustomerDraft({...customerDraft,status:event.target.value})}/>\n          <Input label=\"Customer price INR\" type=\"number\" min=\"0\" required value={String(customerDraft.price)} onChange={event=>setCustomerDraft({...customerDraft,price:Number(event.target.value)})}/>\n          <Input label=\"Customer last updated\" type=\"date\" required value={customerDraft.date} onChange={event=>setCustomerDraft({...customerDraft,date:event.target.value})}/>\n        </form>}\n      </Dialog>\n    </>\n  );\n}\n\ntype CalendarEvent = {\n  id: string;\n  title: string;\n  date: string;\n  time: string;\n  category: string;\n  endTime?: string;\n  participants?: string;\n  location?: string;\n  reminder?: string;\n  color?: 'blue' | 'pink' | 'purple' | 'lime' | 'emerald';\n};\nconst clockMinutes = (value: string) => {\n  const [hour, minute] = value.split(':').map(Number);\n  return hour * 60 + minute;\n};\nconst clockAfter = (value: string, minutes = 45) => {\n  const total = Math.min(1439, clockMinutes(value) + minutes);\n  return `${String(Math.floor(total / 60)).padStart(2, '0')}:${String(total % 60).padStart(2, '0')}`;\n};\nconst calendarSeed: CalendarEvent[] = [\n  { id: 'event-1', title: 'Coffee', date: '2026-08-04', time: '09:30', category: 'Personal' },\n  { id: 'event-2', title: 'Stand-up', date: '2026-08-02', time: '11:30', category: 'Work' },\n  { id: 'event-3', title: '1:1 sync', date: '2026-08-02', time: '16:30', category: 'Work' },\n  { id: 'event-4', title: 'Design review', date: '2026-08-20', time: '14:30', category: 'Design' },\n  { id: 'event-5', title: 'Team lunch', date: '2026-08-20', time: '13:00', category: 'Personal' },\n  { id: 'event-6', title: 'Planning', date: '2026-08-17', time: '10:00', category: 'Work' },\n  { id: 'event-7', title: 'Haircut', date: '2026-08-17', time: '16:00', category: 'Personal' },\n  { id: 'event-8', title: 'Game night', date: '2026-08-08', time: '19:00', category: 'Design' },\n  { id: 'event-9', title: 'Retro', date: '2026-08-14', time: '15:00', category: 'Work' },\n  { id: 'event-10', title: 'Brunch', date: '2026-08-29', time: '11:00', category: 'Personal' },\n  { id: 'event-11', title: 'Payday', date: '2026-08-31', time: '09:00', category: 'Work' },\n  { id: 'event-12', title: 'Yoga', date: '2026-08-27', time: '07:30', category: 'Personal' },\n  { id: 'event-13', title: 'Research sync', date: '2026-08-20', time: '09:00', category: 'Work' },\n  { id: 'event-14', title: 'Portfolio review', date: '2026-08-20', time: '11:30', category: 'Design' },\n  { id: 'event-15', title: '1:1 catch-up', date: '2026-08-20', time: '16:30', category: 'Work' },\n].map((event, index) => ({\n  ...event,\n  color: (\n    [\n      'lime',\n      'pink',\n      'lime',\n      'purple',\n      'pink',\n      'blue',\n      'emerald',\n      'purple',\n      'blue',\n      'lime',\n      'lime',\n      'pink',\n    ] as const\n  )[index],\n}));\nconst isoDate = (date: Date) => date.toISOString().slice(0, 10);\nfunction CalendarContent() {\n  const [month, setMonth] = useState(new Date(Date.UTC(2026, 7, 1))),\n    [selected, setSelected] = useState('2026-08-20'),\n    [expandedDay, setExpandedDay] = useState<string | null>(null),\n    [events, setEvents] = useState(calendarSeed),\n    [editing, setEditing] = useState<CalendarEvent | null>(null),\n    [adding, setAdding] = useState(false),\n    [detailsOpen, setDetailsOpen] = useState(false),\n    [eventError, setEventError] = useState(''),\n    [meetingNotice, setMeetingNotice] = useState(''),\n    [draft, setDraft] = useState<CalendarEvent>({\n      id: '',\n      title: '',\n      date: '2026-08-20',\n      time: '09:00',\n      category: 'Work',\n    }),\n    [notice, setNotice] = useState('');\n  const monthAnchor=useRef<HTMLDivElement>(null);\n  const [monthMenu,setMonthMenu]=useState(false),[inboxOpen,setInboxOpen]=useState(false);\n  const [feed, setFeed] = useState('All'),\n    [accounts, setAccounts] = useState(['aarav@example.com', 'team@example.com', 'design@example.com']),\n    [addAccount, setAddAccount] = useState(false),\n    [accountEmail, setAccountEmail] = useState(''),\n    [notificationItems, setNotificationItems] = useState<import('./AgentPatterns.js').CenterNotification[] | undefined>();\n  const accountForm = useId();\n  const unread = notificationItems ? notificationItems.filter(item => !item.read && !item.archived).length : 2;\n  const eventAnchor = useRef<HTMLButtonElement | null>(null);\n  const form = useId(),\n    uid = useId();\n  const title = month.toLocaleDateString('en-IN', {\n      month: 'long',\n      year: 'numeric',\n      timeZone: 'UTC',\n    }),\n    first = new Date(Date.UTC(month.getUTCFullYear(), month.getUTCMonth(), 1 - month.getUTCDay())),\n    days = Array.from({ length: 42 }, (_, index) => new Date(first.getTime() + index * 86400000));\n  const moveMonth = (change: number) => {\n    const next = new Date(Date.UTC(month.getUTCFullYear(), month.getUTCMonth() + change, 1));\n    setMonth(next);\n    setSelected(isoDate(next));\n  };\n  const openNew = (date = selected) => {\n    setDraft({\n      id: '',\n      title: '',\n      date,\n      time: '09:00',\n      endTime: '09:45',\n      category: 'Work',\n      participants: 'aarav@example.com,diya@example.com',\n      location: 'Bengaluru',\n      reminder: '2 hours before',\n    });\n    setDetailsOpen(false);\n    setEventError('');\n    setAdding(true);\n  };\n  const focusDate = (date: Date) => {\n    const key = isoDate(date);\n    setSelected(key);\n    if (\n      date.getUTCMonth() !== month.getUTCMonth() ||\n      date.getUTCFullYear() !== month.getUTCFullYear()\n    )\n      setMonth(new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1)));\n    const existing = document.getElementById(uid + '-' + key);\n    if (existing) existing.focus();\n    else requestAnimationFrame(() => document.getElementById(uid + '-' + key)?.focus());\n  };\n  return (\n    <>\n      <PageHeading\n        notification={false}\n        title={title}\n        action={\n          <>\n            <div className=\"bt-calendar-feeds\">\n              <DialogTrigger>\n                <AriaButton className=\"bt-calendar-tool\" aria-label=\"Calendar notifications\">\n                  <RiNotification4Line size={20}/>{unread > 0 && <i>{unread}</i>}\n                </AriaButton>\n                <Popover className=\"hb-popover bt-control-popover bt-calendar-notifications\" placement=\"bottom end\">\n                  <AriaDialog aria-label=\"Calendar notifications\">\n                    <NotificationCenter notifications={notificationItems} onChange={setNotificationItems} />\n                  </AriaDialog>\n                </Popover>\n              </DialogTrigger>\n              <DialogTrigger isOpen={inboxOpen} onOpenChange={setInboxOpen}>\n                <AriaButton className=\"bt-calendar-tool\" aria-label=\"Calendar inbox\"><RiInboxLine size={20}/></AriaButton>\n                <Popover className=\"hb-popover bt-control-popover bt-calendar-inbox\" placement=\"bottom end\">\n                  <AriaDialog aria-label=\"Calendar inbox\">\n                    {accounts.map((email, index) => <section key={email}>\n                      <h3>{email}</h3>\n                      {(['All', index === 0 ? 'Personal' : index === 1 ? 'Work' : 'Design']).map(category => <button key={category} type=\"button\" aria-pressed={feed === category} onClick={() => {\n                        setFeed(category);\n                        setNotice(`${category === 'All' ? 'All incoming events' : category + ' events'} shown from local fixtures. No provider is connected.`);\n                      }}><span className={`bt-feed-icon bt-feed-icon-${index}`}><UIIcon name=\"calendar\" /></span>{category === 'All' ? 'Incoming events' : category + ' calendar'}</button>)}\n                    </section>)}\n                    <Button variant=\"secondary\" size=\"sm\" onClick={() => { setAccountEmail(''); setInboxOpen(false); requestAnimationFrame(()=>setAddAccount(true)); }}>＋ Add new account</Button>\n                    <p className=\"bt-note\">Local account labels and feeds only. No account is connected.</p>\n                  </AriaDialog>\n                </Popover>\n              </DialogTrigger>\n            </div>\n            <div ref={monthAnchor} className={`bt-month-controls ${monthMenu?'bt-month-menu-open':''}`}>\n              <Button\n                variant=\"secondary\"\n                size=\"sm\"\n                aria-label=\"Previous month\"\n                onClick={() => moveMonth(-1)}\n              ><UIIcon name=\"chevron-left\" /></Button>\n              <AriaButton className=\"bt-month-label\" aria-label={`Choose a date in ${title}`} aria-haspopup=\"dialog\" aria-expanded={monthMenu} onPress={()=>setMonthMenu(!monthMenu)}><span className=\"bt-month-long\">{title}</span><span className=\"bt-month-short\">{shortUTCMonths[month.getUTCMonth()]}</span></AriaButton><Popover triggerRef={monthAnchor} isOpen={monthMenu} onOpenChange={setMonthMenu} placement=\"bottom end\" offset={0} className=\"bt-month-popup\" isNonModal><AriaDialog aria-label=\"Choose calendar date\"><AriaCalendar key={month.toISOString()} aria-label=\"Calendar month picker\" value={parseDate(selected)} onChange={date=>{setMonth(new Date(Date.UTC(date.year,date.month-1,1)));setSelected(date.toString());setMonthMenu(false);}}><MonthPanel offset={0} bare hideHeader/></AriaCalendar></AriaDialog></Popover>\n              <Button\n                variant=\"secondary\"\n                size=\"sm\"\n                aria-label=\"Next month\"\n                onClick={() => moveMonth(1)}\n              ><UIIcon name=\"chevron-right\" /></Button>\n            </div>\n            <NativeButton size=\"medium\" leadingIcon={RiAddLine} onClick={() => openNew()}>New event</NativeButton>\n          </>\n        }\n      />\n      <Dialog open={addAccount} onOpenChange={setAddAccount} title=\"Add a local calendar account\" description=\"Save a label in this example only. No sign-in, calendar connection or remote request takes place.\" footer={<><Button variant=\"secondary\" onClick={() => setAddAccount(false)}>Cancel</Button><Button type=\"submit\" form={accountForm}>Add local account</Button></>}>\n        <form id={accountForm} onSubmit={event => { event.preventDefault(); if (!accounts.includes(accountEmail.trim())) setAccounts(previous => [...previous, accountEmail.trim()]); setNotice('Local calendar account label added. No provider was connected.'); setAddAccount(false); }}>\n          <Input label=\"Calendar account email\" type=\"email\" value={accountEmail} onChange={event => setAccountEmail(event.target.value)} required />\n        </form>\n      </Dialog>\n      <div className=\"bt-calendar\" role=\"grid\" aria-label={`${title} calendar`}>\n        <div role=\"row\" className=\"bt-calendar-week\">\n          {['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'].map(\n            (day) => (\n              <span key={day} role=\"columnheader\" aria-label={day}>\n                {day.slice(0, 3)}\n              </span>\n            ),\n          )}\n        </div>\n        {Array.from({ length: 6 }, (_, week) => (\n          <div role=\"row\" className=\"bt-calendar-row\" key={week}>\n            {days.slice(week * 7, week * 7 + 7).map((date) => {\n              const key = isoDate(date),\n                dayEvents = events\n                  .filter((event) => event.date === key && (feed === 'All' || event.category === feed))\n                  .sort((a, b) => a.time.localeCompare(b.time));\n              return (\n                <div\n                  key={key}\n                  role=\"gridcell\"\n                  className={`bt-calendar-cell ${date.getUTCMonth() !== month.getUTCMonth() ? 'bt-outside-month' : ''}`}\n                  aria-selected={selected === key}\n                >\n                  <button\n                    type=\"button\"\n                    className=\"bt-calendar-day\"\n                    id={uid + '-' + key}\n                    tabIndex={selected === key ? 0 : -1}\n                    aria-label={date.toLocaleDateString('en-IN', {\n                      weekday: 'long',\n                      day: 'numeric',\n                      month: 'long',\n                      year: 'numeric',\n                      timeZone: 'UTC',\n                    })}\n                    onClick={() => {\n                      setSelected(key);\n                      openNew(key);\n                    }}\n                    onKeyDown={(event) => {\n                      if (\n                        ![\n                          'ArrowLeft',\n                          'ArrowRight',\n                          'ArrowUp',\n                          'ArrowDown',\n                          'Home',\n                          'End',\n                          'PageUp',\n                          'PageDown',\n                        ].includes(event.key)\n                      )\n                        return;\n                      event.preventDefault();\n                      const next = new Date(date);\n                      if (event.key === 'PageUp' || event.key === 'PageDown')\n                        next.setUTCMonth(next.getUTCMonth() + (event.key === 'PageDown' ? 1 : -1));\n                      else\n                        next.setUTCDate(\n                          next.getUTCDate() +\n                            (event.key === 'ArrowLeft'\n                              ? -1\n                              : event.key === 'ArrowRight'\n                                ? 1\n                                : event.key === 'ArrowUp'\n                                  ? -7\n                                  : event.key === 'ArrowDown'\n                                    ? 7\n                                    : event.key === 'Home'\n                                      ? -next.getUTCDay()\n                                      : 6 - next.getUTCDay()),\n                        );\n                      focusDate(next);\n                    }}\n                  >\n                    {date.getUTCDate()}\n                  </button>\n                  {dayEvents.length > 4 && (\n                    <button\n                      type=\"button\"\n                      className=\"bt-calendar-more\"\n                      aria-expanded={expandedDay === key}\n                      aria-controls={uid + '-' + key + '-events'}\n                      aria-label={`${expandedDay === key ? 'Show fewer events' : `Show ${dayEvents.length - 4} more events`} for ${date.toLocaleDateString('en-IN', { day: 'numeric', month: 'long', year: 'numeric', timeZone: 'UTC' })}`}\n                      onClick={() => setExpandedDay(expandedDay === key ? null : key)}\n                    >\n                      {expandedDay === key ? 'Show less' : `+${dayEvents.length - 4} more`}\n                    </button>\n                  )}\n                  <div className=\"bt-calendar-events\" id={uid + '-' + key + '-events'}>\n                    {(expandedDay === key ? dayEvents : dayEvents.slice(0, 4)).map((item) => (\n                      <button\n                        key={item.id}\n                        type=\"button\"\n                        className={`bt-event bt-event-${item.color ?? (item.category === 'Personal' ? 'lime' : item.category === 'Design' ? 'purple' : 'blue')}`}\n                        aria-haspopup=\"dialog\"\n                        aria-expanded={detailsOpen && editing?.id === item.id}\n                        onClick={(event) => {\n                          eventAnchor.current = event.currentTarget;\n                          setEditing(item);\n                          setEventError('');\n                          setMeetingNotice('');\n                          setDraft({\n                            ...item,\n                            endTime: item.endTime ?? clockAfter(item.time),\n                            participants:\n                              item.participants ??\n                              'aarav@example.com,diya@example.com,kavya@example.com',\n                            location: item.location ?? 'Bengaluru',\n                            reminder: item.reminder ?? '2 hours before',\n                          });\n                          setDetailsOpen(true);\n                        }}\n                      >\n                        <span>{item.title}</span>\n                        <small>{item.time}</small>\n                      </button>\n                    ))}\n                  </div>\n                </div>\n              );\n            })}\n          </div>\n        ))}\n      </div>\n      <p className=\"bt-status-message\" role=\"status\">\n        {notice ||\n          'Keyboard: arrows move by day/week; Home/End move within a week; Page Up/Down change month. Enter adds an event.'}\n      </p>\n      <Popover\n        className=\"bt-event-popover\"\n        triggerRef={eventAnchor}\n        isOpen={detailsOpen && editing !== null}\n        onOpenChange={(open) => {\n          setDetailsOpen(open);\n          if (!open) setEditing(null);\n        }}\n        placement=\"bottom start\"\n        offset={7}\n        isNonModal\n      >\n        <AriaDialog aria-label={draft.title || 'Event details'}>\n          <header>\n            <h2>{draft.title}</h2>\n            <Button\n              variant=\"tertiary\"\n              size=\"sm\"\n              iconOnly\n              leadingIcon=\"×\"\n              aria-label=\"Close event details\"\n              onClick={() => {\n                setDetailsOpen(false);\n                setEditing(null);\n              }}\n            >\n              Close\n            </Button>\n          </header>\n          <p className=\"bt-meeting-date\">\n            {new Date(draft.date + 'T00:00:00Z').toLocaleDateString('en-IN', {\n              weekday: 'short',\n              month: 'short',\n              day: 'numeric',\n              timeZone: 'UTC',\n            })}\n          </p>\n          <div className=\"bt-meeting-link\">\n            <span>\n              <strong>Local meeting</strong>\n              <small>meet.example.com/{draft.id}</small>\n            </span>\n            <Button\n              variant=\"secondary\"\n              size=\"sm\"\n              onClick={async () => {\n                try {\n                  await navigator.clipboard.writeText('https://meet.example.com/' + draft.id);\n                  setMeetingNotice('Example meeting link copied.');\n                } catch {\n                  setMeetingNotice('Example link: meet.example.com/' + draft.id);\n                }\n              }}\n            >\n              Copy link\n            </Button>\n          </div>\n          <div className=\"bt-meeting-time\">\n            <strong>{draft.time}</strong>\n            <span><UIIcon name=\"arrow-right\" /></span>\n            <strong>{draft.endTime ?? clockAfter(draft.time)}</strong>\n            <span>\n              {clockMinutes(draft.endTime ?? clockAfter(draft.time)) - clockMinutes(draft.time)}m\n            </span>\n          </div>\n          <p className=\"bt-meeting-zone\">UTC+05:30 · {draft.location || 'Bengaluru'}</p>\n          <h3>Participants</h3>\n          <ul className=\"bt-meeting-participants\">\n            {(draft.participants ?? 'aarav@example.com,diya@example.com')\n              .split(',')\n              .filter((email) => email.trim())\n              .map((email) => (\n                <li key={email}>\n                  <span className=\"bt-user-mark\">{email.trim()[0]?.toUpperCase()}</span>\n                  {email.trim()}\n                </li>\n              ))}\n          </ul>\n          <h3>Reminders</h3>\n          <p>{draft.reminder || '2 hours before'}</p>\n          <p role=\"status\" className=\"bt-note\">\n            {meetingNotice || 'Fictional event · no invitation or call is sent.'}\n          </p>\n          <footer>\n            <Button variant=\"secondary\" size=\"sm\" onClick={() => setDetailsOpen(false)}>\n              Edit event\n            </Button>\n            <Button\n              variant=\"danger\"\n              size=\"sm\"\n              onClick={() => {\n                if (editing)\n                  setEvents((previous) => previous.filter((item) => item.id !== editing.id));\n                setEditing(null);\n                setDetailsOpen(false);\n                setNotice('Event removed from this local calendar.');\n              }}\n            >\n              Delete event\n            </Button>\n          </footer>\n        </AriaDialog>\n      </Popover>\n      <Dialog\n        open={adding || (editing !== null && !detailsOpen)}\n        onOpenChange={(open) => {\n          if (!open) {\n            setAdding(false);\n            setEditing(null);\n          }\n        }}\n        title={adding ? 'New event' : 'Edit event'}\n        description=\"A local calendar example. Invitations and reminders are not sent.\"\n        footer={\n          <>\n            <Button\n              variant=\"secondary\"\n              onClick={() => {\n                setAdding(false);\n                setEditing(null);\n              }}\n            >\n              Cancel\n            </Button>\n            {editing && (\n              <Button\n                variant=\"danger\"\n                onClick={() => {\n                  setEvents((previous) => previous.filter((event) => event.id !== editing.id));\n                  setEditing(null);\n                  setNotice('Event removed from this local calendar.');\n                }}\n              >\n                Delete event\n              </Button>\n            )}\n            <Button type=\"submit\" form={form}>\n              Save event\n            </Button>\n          </>\n        }\n      >\n        <form\n          id={form}\n          className=\"bt-dialog-fields\"\n          onSubmit={(event) => {\n            event.preventDefault();\n            if (clockMinutes(draft.endTime ?? clockAfter(draft.time)) <= clockMinutes(draft.time)) {\n              setEventError('End time must be after the start time.');\n              return;\n            }\n            if (\n              (draft.participants ?? '')\n                .split(',')\n                .some((value) => value.trim() && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value.trim()))\n            ) {\n              setEventError('Enter participant emails separated by commas.');\n              return;\n            }\n            setEventError('');\n            const next = { ...draft, id: adding ? 'event-' + Date.now() : draft.id };\n            setEvents((previous) =>\n              adding\n                ? [...previous, next]\n                : previous.map((event) => (event.id === next.id ? next : event)),\n            );\n            setSelected(next.date);\n            const d = new Date(next.date + 'T00:00:00Z');\n            setMonth(new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), 1)));\n            setAdding(false);\n            setEditing(null);\n            setNotice(`${next.title} saved in this local calendar.`);\n            requestAnimationFrame(() => document.getElementById(uid + '-' + next.date)?.focus());\n          }}\n        >\n          <Input\n            label=\"Event title\"\n            required\n            value={draft.title}\n            onChange={(event) =>\n              setDraft((previous) => ({ ...previous, title: event.target.value }))\n            }\n          />\n          <Input\n            label=\"Event date\"\n            type=\"date\"\n            required\n            value={draft.date}\n            onChange={(event) =>\n              setDraft((previous) => ({ ...previous, date: event.target.value }))\n            }\n          />\n          <Input\n            label=\"Event time\"\n            type=\"time\"\n            required\n            value={draft.time}\n            onChange={(event) =>\n              setDraft((previous) => ({ ...previous, time: event.target.value }))\n            }\n          />\n          <Input\n            label=\"Event end time\"\n            type=\"time\"\n            required\n            min={draft.time}\n            value={draft.endTime ?? clockAfter(draft.time)}\n            onChange={(event) =>\n              setDraft((previous) => ({ ...previous, endTime: event.target.value }))\n            }\n          />\n          <Select\n            label=\"Event color\"\n            value={draft.color ?? 'blue'}\n            options={['blue', 'pink', 'purple', 'lime', 'emerald'].map((value) => ({\n              value,\n              label: value[0].toUpperCase() + value.slice(1),\n            }))}\n            onChange={(event) =>\n              setDraft((previous) => ({\n                ...previous,\n                color: event.target.value as CalendarEvent['color'],\n              }))\n            }\n          />\n          <Input\n            label=\"Event participants\"\n            value={draft.participants ?? ''}\n            placeholder=\"aarav@example.com,diya@example.com\"\n            onChange={(event) =>\n              setDraft((previous) => ({ ...previous, participants: event.target.value }))\n            }\n          />\n          <Input\n            label=\"Event location\"\n            value={draft.location ?? 'Bengaluru'}\n            onChange={(event) =>\n              setDraft((previous) => ({ ...previous, location: event.target.value }))\n            }\n          />\n          <Select\n            label=\"Event reminder\"\n            value={draft.reminder ?? '2 hours before'}\n            options={[\n              'At start time',\n              '15 minutes before',\n              '1 hour before',\n              '2 hours before',\n              '1 day before',\n            ].map((value) => ({ value, label: value }))}\n            onChange={(event) =>\n              setDraft((previous) => ({ ...previous, reminder: event.target.value }))\n            }\n          />\n          {eventError && (\n            <p role=\"alert\" className=\"bt-form-error\">\n              {eventError}\n            </p>\n          )}\n          <Select\n            label=\"Event category\"\n            value={draft.category}\n            options={['Work', 'Personal', 'Design'].map((value) => ({ value, label: value }))}\n            onChange={(event) =>\n              setDraft((previous) => ({ ...previous, category: event.target.value }))\n            }\n          />\n        </form>\n      </Dialog>\n    </>\n  );\n}\n\ntype ProjectTask = {\n  id: string;\n  title: string;\n  status: string;\n  priority: string;\n  project: string;\n  date: string;\n  description?: string;\n  assignee?: string;\n};\nconst taskColumns = [\n  ['backlog', 'Backlog'],\n  ['todo', 'To do'],\n  ['progress', 'In progress'],\n  ['review', 'Review'],\n  ['done', 'Done'],\n];\nconst taskTitles = [\n  'Explore approval cards for agent handoffs',\n  'Add saved views for each project team',\n  'Record an audit trail for agent actions',\n  'Define semantic tokens for elevated surfaces',\n  'Add keyboard navigation to model picker',\n  'Return rolling limits with reset timestamps',\n  'Animate nested task groups as they stream',\n  'Tune chart contrast on dark dashboard cards',\n  'Polish the transition between plan questions',\n  'Ship overlapping avatar groups for cards',\n  'Keep generated screens aligned while zooming',\n  'Validate template dependencies during build',\n  'Document reduced-motion behavior for blocks',\n];\nconst taskSeed: ProjectTask[] = taskTitles.map((title, index) => ({\n  id: ['DS-', 'FE-', 'BE-'][index % 3] + (38 + index),\n  title,\n  status:\n    index < 3\n      ? 'backlog'\n      : index < 6\n        ? 'todo'\n        : index < 8\n          ? 'progress'\n          : index === 8\n            ? 'review'\n            : 'done',\n  priority: ['Low', 'Medium', 'High', 'Urgent'][index % 4],\n  assignee: names[index % 5],\n  project: ['Helios UI', 'Foundation', 'Platform'][index % 3],\n  date: `2026-09-${String(14 - index).padStart(2, '0')}`,\n}));\nfunction ProjectBoardContent({ assetsBase }: { assetsBase: string }) {\n  const [ticketPopoverContainer,setTicketPopoverContainer]=useState<HTMLDivElement|null>(null),[ticketTouched,setTicketTouched]=useState<string[]>([]);\n  const [selectedTicket,setSelectedTicket]=useState<string|null>(null),[keepCreating,setKeepCreating]=useState(false),[favoriteTickets,setFavoriteTickets]=useState<string[]>([]);\n  const [tasks, setTasks] = useState(taskSeed),\n    [query, setQuery] = useState(''),\n    [priority, setPriority] = useState('All'),\n    [project, setProject] = useState('All');\n  const [sortMode, setSortMode] = useState('manual'),\n    [list, setList] = useState(false),\n    [showDone, setShowDone] = useState(true),\n    [fillWidth, setFillWidth] = useState(false);\n  const [adding, setAdding] = useState(false),\n    [editing, setEditing] = useState<ProjectTask | null>(null),\n    [draft, setDraft] = useState<ProjectTask>({\n      id: '',\n      title: '',\n      status: 'backlog',\n      priority: 'Medium',\n      project: 'Helios UI',\n      date: '2026-10-26',\n    });\n  const [limits, setLimits] = useState<Record<string, number>>({\n      backlog: 8,\n      todo: 5,\n      progress: 4,\n      review: 3,\n      done: 6,\n    }),\n    [limitColumn, setLimitColumn] = useState<string | null>(null),\n    [limitDraft, setLimitDraft] = useState('8');\n  const [dragging, setDragging] = useState<string | null>(null),\n    [over, setOver] = useState<string | null>(null),\n    [notice, setNotice] = useState(''),\n    [comment, setComment] = useState(''),\n    [inbox, setInbox] = useState(false);\n  const [comments, setComments] = useState<\n    Record<string, { id: string; author: string; body: string; time: string }[]>\n  >({});\n  const newTicketRef = useRef<HTMLButtonElement>(null);\n  const pointerDrag=useRef<{id:string;x:number;y:number;active:boolean}|null>(null),suppressDragClick=useRef(false);\n  const [dragPreview,setDragPreview]=useState<{id:string;x:number;y:number;width:number}|null>(null);\n  const form = useId(),\n    commentId = useId(),\n    descriptionId = useId(),\n    reduced = useReducedMotion();\n  const projects = ['Helios UI', 'Foundation', 'Platform'];\n  const rank = ['Urgent', 'High', 'Medium', 'Low'];\n  const visible = tasks.filter(\n    (task) =>\n      task.title.toLowerCase().includes(query.toLowerCase()) &&\n      (priority === 'All' || task.priority === priority) &&\n      (project === 'All' || task.project === project),\n  );\n  if (sortMode === 'title') visible.sort((a, b) => a.title.localeCompare(b.title));\n  if (sortMode === 'priority')\n    visible.sort((a, b) => rank.indexOf(a.priority) - rank.indexOf(b.priority));\n  const openTask = (task: ProjectTask) => {\n    setEditing(task);\n    setDraft({\n      ...task,\n      description:\n        task.description ??\n        'Explore the interaction, document its states, and keep the next action clear. Review keyboard access, loading, empty, and recovery behavior before completing this task.',\n      assignee: task.assignee ?? names[Number(task.id.replace(/\\D/g, '')) % 5],\n    });\n    setComment('');\n  };\n  const openAdd = (status = 'backlog') => {\n    setTicketTouched([]);\n    setDraft({\n      id: '',\n      title: '',\n      status,\n      priority: 'Medium',\n      project: 'Helios UI',\n      date: '2026-10-26',\n      description: '',\n      assignee: names[0],\n    });\n    setEditing(null);\n    setAdding(true);\n  };\n  const updateDraft=(change:Partial<ProjectTask>)=>{setDraft(previous=>({...previous,...change}));if(editing)setTasks(previous=>previous.map(task=>task.id===editing.id?{...task,...change}:task));};\n  const move = (id: string, status: string) => {\n    setTasks((previous) => previous.map((task) => (task.id === id ? { ...task, status } : task)));\n    setNotice(`Task moved to ${taskColumns.find((column) => column[0] === status)?.[1]}.`);\n    setDragging(null);\n    setOver(null);\n  };\n  const dragMove=(event:React.PointerEvent<HTMLElement>)=>{\n    const drag=pointerDrag.current;if(!drag)return;\n    if(!drag.active&&Math.hypot(event.clientX-drag.x,event.clientY-drag.y)<8)return;\n    event.preventDefault();\n    if(!drag.active){drag.active=true;event.currentTarget.setPointerCapture(event.pointerId);setDragging(drag.id);}\n    const column=document.elementFromPoint(event.clientX,event.clientY)?.closest<HTMLElement>('[data-ticket-stage]');\n    setOver(column?.dataset.ticketStage??null);\n    const width=event.currentTarget.getBoundingClientRect().width;\n    setDragPreview({id:drag.id,x:Math.max(12,Math.min(event.clientX+12,window.innerWidth-width-12)),y:Math.max(12,Math.min(event.clientY+12,window.innerHeight-150)),width});\n  };\n  const finishDrag=(event:React.PointerEvent<HTMLElement>)=>{\n    const drag=pointerDrag.current;pointerDrag.current=null;setDragPreview(null);\n    if(!drag?.active)return;\n    event.preventDefault();suppressDragClick.current=true;\n    const stage=document.elementFromPoint(event.clientX,event.clientY)?.closest<HTMLElement>('[data-ticket-stage]')?.dataset.ticketStage;\n    if(stage)move(drag.id,stage);else{setDragging(null);setOver(null)}\n    requestAnimationFrame(()=>{suppressDragClick.current=false});\n  };\n  const close = () => {\n    setAdding(false);\n    setEditing(null);\n  };\n  const thread = editing\n    ? (comments[editing.id] ?? [\n        {\n          id: 'review',\n          author: names[1],\n          body: 'This is ready for the next review. Add any blockers or context here.',\n          time: '2 hours ago',\n        },\n        {\n          id: 'direction',\n          author: names[3],\n          body: 'Start with a compact summary and keep detailed actions available when needed.',\n          time: '5 hours ago',\n        },\n      ])\n    : [];\n  const tokenPoints = Array.from({ length: 16 }, (_, index) => ({\n    name: `Sep ${index + 1}`,\n    value: (((Number(draft.id.replace(/\\D/g, '')) || 1) * 3 + index * 7) % 14) * 1000000,\n  }));\n  const columns: Column<ProjectTask>[] = [\n    { key: 'id', header: 'Ticket', value: (row) => row.id },\n    { key: 'title', header: 'Task', value: (row) => row.title, sortable: true },\n    {\n      key: 'status',\n      header: 'Stage',\n      value: (row) => taskColumns.find((column) => column[0] === row.status)?.[1] ?? row.status,\n    },\n    { key: 'priority', header: 'Priority', value: (row) => row.priority },\n  ];\n  return (\n    <>\n      <PageHeading\n        title=\"Helios Design Tasks\"\n        action={\n          <>\n            <NativeButton className=\"bt-project-inbox\" variant=\"secondary\" size=\"medium\" iconOnly leadingIcon={RiInboxLine} aria-label=\"Open project inbox\" onClick={()=>setInbox(true)}/>\n            <DropdownMenu\n              label=\"Sort tickets\"\n              triggerContent={<RiSortDesc size={20}/>}\n              size=\"sm\"\n              selectedKey={sortMode}\n              items={[\n                { id: 'manual', label: 'Manual order' },\n                { id: 'priority', label: 'Priority' },\n                { id: 'title', label: 'Title' },\n              ]}\n              onAction={setSortMode}\n            />\n            <TemplatePopover label=\"Filter tickets\" icon={<RiEqualizer2Line size={20}/>}>\n              <div className=\"bt-dialog-fields\">\n                <Input\n                  label=\"Search tasks\"\n                  type=\"search\"\n                  value={query}\n                  onChange={(event) => setQuery(event.target.value)}\n                />\n                <Select\n                  label=\"Task priority\"\n                  value={priority}\n                  options={['All', ...rank].map((value) => ({\n                    value,\n                    label: value === 'All' ? 'All priorities' : value,\n                  }))}\n                  onChange={(event) => setPriority(event.target.value)}\n                />\n                <Select\n                  label=\"Task project\"\n                  value={project}\n                  options={['All', ...projects].map((value) => ({\n                    value,\n                    label: value === 'All' ? 'All projects' : value,\n                  }))}\n                  onChange={(event) => setProject(event.target.value)}\n                />\n                <Button\n                  variant=\"tertiary\"\n                  onClick={() => {\n                    setQuery('');\n                    setPriority('All');\n                    setProject('All');\n                  }}\n                >\n                  Reset filters\n                </Button>\n              </div>\n            </TemplatePopover>\n            <TemplatePopover label=\"Display options\" icon={<RiLayoutColumnLine size={20}/>}>\n              <div className=\"bt-dialog-fields\">\n                <Checkbox\n                  label=\"Show done column\"\n                  checked={showDone}\n                  onChange={(event) => setShowDone(event.target.checked)}\n                />\n                <Checkbox\n                  label=\"Fill wide screens\"\n                  checked={fillWidth}\n                  onChange={(event) => setFillWidth(event.target.checked)}\n                /><Button variant=\"secondary\" size=\"sm\" aria-pressed={list} onClick={()=>setList(!list)} leadingIcon={<RiLayoutColumnLine size={20}/>}>{list?'Board view':'List view'}</Button>\n              </div>\n            </TemplatePopover>\n            <NativeButton ref={newTicketRef} size=\"medium\" leadingIcon={RiAddLine} onClick={()=>openAdd()}>New ticket</NativeButton>\n          </>\n        }\n      />\n      {visible.length===0&&<div className=\"bt-filter-empty\" role=\"status\"><strong>No tickets match these filters.</strong><Button variant=\"secondary\" size=\"sm\" onClick={()=>{setQuery('');setPriority('All');setProject('All')}}>Reset task filters</Button></div>}\n      {list ? (\n        <DataTable\n          caption=\"Example project tasks\"\n          rows={visible}\n          columns={columns}\n          rowKey={(row) => row.id}\n          rowLabel={(row) => row.title}\n          onRowAction={openTask}\n        />\n      ) : (\n        <div\n          className={`bt-kanban ${fillWidth ? 'bt-kanban-fill' : ''}`}\n          role=\"region\"\n          aria-label=\"Project board; scroll horizontally for all stages\"\n          tabIndex={0}\n        >\n          {taskColumns\n            .filter(([status]) => showDone || status !== 'done')\n            .map(([status, label]) => (\n              <section\n                key={status}\n                className=\"bt-kanban-column\"\n                data-ticket-stage={status}\n                data-drag-over={over === status && dragging !== null}\n                onDragOver={(event) => {\n                  event.preventDefault();\n                  setOver(status);\n                }}\n                onDragLeave={(event) => {\n                  if (!event.currentTarget.contains(event.relatedTarget as Node)) setOver(null);\n                }}\n                onDrop={(event) => {\n                  event.preventDefault();\n                  const id = event.dataTransfer.getData('text/plain');\n                  if (tasks.some((task) => task.id === id)) move(id, status);\n                }}\n              >\n                <header>\n                  <h2>\n                    {label}\n                    <span\n                      aria-label={`${visible.filter((task) => task.status === status).length} tickets, limit ${limits[status]}`}\n                    >\n                      {visible.filter((task) => task.status === status).length}/{limits[status]}\n                    </span>\n                  </h2>\n                  <div className=\"bt-column-actions\">\n                    <DropdownMenu\n                      size=\"sm\"\n                      label={`More options for ${label}`} triggerContent={<RiMoreLine size={16}/>}\n                      items={[\n                        { id: 'add', label: 'Add ticket' },\n                        { id: 'limit', label: 'Set work-in-progress limit' },\n                        { id: 'sort', label: 'Sort tickets by title' },\n                      ]}\n                      onAction={(action) => {\n                        if (action === 'add') openAdd(status);\n                        if (action === 'sort') setSortMode('title');\n                        if (action === 'limit') {\n                          setLimitColumn(status);\n                          setLimitDraft(String(limits[status]));\n                        }\n                      }}\n                    />\n                    <button\n                      type=\"button\"\n                      aria-label={`Add ticket to ${label}`}\n                      onClick={() => openAdd(status)}\n                    ><UIIcon name=\"plus\" /></button>\n                  </div>\n                </header>\n                {visible\n                  .filter((task) => task.status === status)\n                  .map((task, index) => (\n                    <motion.article\n                      className=\"bt-task\"\n                      key={task.id}\n                      draggable={false}\n                      onPointerDownCapture={event=>{if(event.button===0&&!event.ctrlKey&&!event.metaKey)pointerDrag.current={id:task.id,x:event.clientX,y:event.clientY,active:false};}}\n                      onPointerMoveCapture={dragMove}\n                      onPointerUpCapture={finishDrag}\n                      onPointerCancelCapture={()=>{pointerDrag.current=null;setDragging(null);setOver(null);setDragPreview(null)}}\n                      onClickCapture={event=>{if(suppressDragClick.current){event.preventDefault();event.stopPropagation();suppressDragClick.current=false}}}\n                      layout={reduced === false ? 'position' : false}\n                      layoutId={`${form}-${task.id}`}\n                      transition={{ layout: { duration: reduced === false ? 0.2 : 0 } }}\n                      data-dragging={dragging === task.id}\n                      data-selected={selectedTicket===task.id}\n                      onDragStartCapture={(event) => {\n                        event.dataTransfer.setData('text/plain', task.id);\n                        event.dataTransfer.effectAllowed = 'move';\n                        setDragging(task.id);\n                      }}\n                      onDragEndCapture={() => {\n                        setDragging(null);\n                        setOver(null);\n                      }}\n                    >\n                      <button\n                        type=\"button\"\n                        className=\"bt-task-open\"\n                        id={`${form}-${task.id}-open`}\n                        aria-label={`Open ${task.id}: ${task.title}. Press Enter for local details.`}\n                        aria-pressed={selectedTicket===task.id}\n                        onClick={()=>{setSelectedTicket(task.id);openTask(task)}}\n                        onKeyDown={event=>{if(event.key==='Enter'){event.preventDefault();openTask(task)}}}\n                      >\n                        <span className=\"bt-ticket-top\">\n                          <span>\n                            {task.id}<UIIcon name=\"chevron-right\" />{task.project}\n                          </span>\n                          <span\n                            className=\"bt-ticket-assignees\"\n                            role=\"img\"\n                            aria-label={task.assignee ?? names[index % 5]}\n                          >\n                            <Avatar\n                              name={task.assignee ?? names[index % 5]}\n                              index={index % 5}\n                              assetsBase={assetsBase}\n                              secondary=\"\"\n                            />\n                          </span>\n                        </span>\n                        <span className=\"bt-task-labels\">\n                          <Status value={task.priority} />\n                          <span className=\"bt-chip\">{task.project}</span>\n                        </span>\n                        <h3>{task.title}</h3>\n                        <small>\n                          {status === 'done' ? 'Completed' : 'Since'}{' '}\n                          {shortUTCDate(new Date(task.date + 'T00:00:00Z'))}\n                        </small>\n                      </button>\n                    </motion.article>\n                  ))}\n                {!visible.some((task) => task.status === status) && (\n                  <p className=\"bt-column-empty\">Drop a ticket here or use ＋ to add one.</p>\n                )}\n              </section>\n            ))}\n        </div>\n      )}\n      <p className=\"bt-status-message bt-board-announcement\" role=\"status\">\n        {notice ||\n          `${visible.length} local tasks. Open a card to change its stage with the keyboard, or drag it between columns.`}\n      </p>\n      {dragPreview&&<div className=\"bt-ticket-drag-preview\" aria-hidden=\"true\" style={{left:dragPreview.x,top:dragPreview.y,width:dragPreview.width}}><small>{dragPreview.id}</small><strong>{tasks.find(task=>task.id===dragPreview.id)?.title}</strong></div>}\n      <Dialog\n        open={adding || editing !== null}\n        onOpenChange={(open) => {\n          if (!open) close();\n        }}\n        title={adding ? 'New ticket' : draft.id}\n        \n        footer={adding?<><NativeScope><NativeTemplateSwitch size=\"sm\" isSelected={keepCreating} onChange={setKeepCreating}>Keep creating</NativeTemplateSwitch></NativeScope><Button variant=\"secondary\" onClick={close}>Cancel</Button><Button type=\"submit\" form={form}>Create ticket</Button></>:undefined}\n      >\n        <div className={`bt-ticket-layout ${adding ? 'bt-ticket-new' : 'bt-ticket-detail'}`}>\n          <header className=\"bt-ticket-sheet-header\"><span>Helios Design Tasks <UIIcon name=\"chevron-right\"/> {adding?'UI-'+(tasks.length+101):draft.id} <UIIcon name=\"chevron-right\"/> {adding?'New ticket':'Agent handoff'}</span>{editing&&<div><Button variant=\"secondary\" size=\"sm\" iconOnly leadingIcon={<UIIcon name=\"star\"/>} aria-label={favoriteTickets.includes(editing.id)?'Remove from favorites':'Add to favorites'} aria-pressed={favoriteTickets.includes(editing.id)} onClick={()=>setFavoriteTickets(previous=>previous.includes(editing.id)?previous.filter(id=>id!==editing.id):[...previous,editing.id])}><UIIcon name=\"star\"/></Button><Button variant=\"secondary\" size=\"sm\" iconOnly leadingIcon={<UIIcon name=\"link\"/>} aria-label=\"Copy ticket link\" onClick={async()=>{try{await navigator.clipboard.writeText(location.href+'#'+editing.id);setNotice('Local ticket link copied.')}catch{setNotice('Clipboard unavailable. Ticket ID: '+editing.id)}}}><UIIcon name=\"link\"/></Button><DropdownMenu label=\"Ticket actions\" triggerContent={<RiMoreLine size={16}/>} items={[{id:'delete',label:'Delete ticket'},{id:'copy',label:'Copy ticket ID'}]} onAction={async action=>{if(action==='delete'){setTasks(previous=>previous.filter(task=>task.id!==editing.id));close();requestAnimationFrame(()=>newTicketRef.current?.focus())}else{try{await navigator.clipboard.writeText(editing.id);setNotice('Ticket ID copied.')}catch{setNotice('Ticket ID: '+editing.id)}}}}/></div>}<button type=\"button\" className=\"bt-ticket-sheet-close\" aria-label={adding?'Close create ticket':'Close ticket details'} onClick={close}><RiCloseLine size={16}/></button></header>\n          <form\n            id={form}\n            className=\"bt-dialog-fields bt-ticket-properties\"\n            onSubmit={(event) => {\n              event.preventDefault();\n              const next = { ...draft, id: adding ? 'UI-' + (tasks.length + 101) : draft.id };\n              setTasks((previous) =>\n                adding\n                  ? [...previous, next]\n                  : previous.map((task) => (task.id === next.id ? next : task)),\n              );\n              if(adding&&keepCreating){setDraft(previous=>({...previous,id:'',title:'',description:''}));requestAnimationFrame(()=>document.querySelector<HTMLInputElement>(`#${CSS.escape(form)} input`)?.focus());}else close();\n              setNotice(`${next.id} saved in this local board.`);\n              requestAnimationFrame(() =>\n                document.getElementById(`${form}-${next.id}-open`)?.focus(),\n              );\n            }}\n          >\n            {editing && (\n              <p className=\"bt-ticket-creator\">\n                Created by <strong>{names[0]}</strong>\n              </p>\n            )}\n            <Input\n              label=\"Ticket title\"\n              required\n              maxLength={180}\n              placeholder=\"Enter ticket title\"\n              value={draft.title}\n              onChange={(event) =>\n                updateDraft({title:event.target.value})\n              }\n            />\n            <div className=\"bt-native-field\">\n              <label htmlFor={descriptionId}>Description</label>\n              <textarea\n                id={descriptionId}\n                value={draft.description ?? ''}\n                rows={3}\n                placeholder=\"Description area\"\n                maxLength={2000}\n                onChange={(event) =>\n                  updateDraft({description:event.target.value})\n                }\n              />\n            </div>\n            <h3>Properties</h3>\n            <div className=\"bt-ticket-property-grid\"><NativeScope>{[{label:'Status',aria:'Ticket stage',value:draft.status,options:taskColumns.map(([id,label])=>({id,label})),change:(value:string)=>updateDraft({status:value}),icon:'plus'}, {label:'Urgency',aria:'Ticket priority',value:draft.priority,options:rank.map(value=>({id:value,label:value})),change:(value:string)=>updateDraft({priority:value}),icon:'chart'}, {label:'Assignee',aria:'Ticket assignee',value:draft.assignee||names[0],options:names.slice(0,5).map(value=>({id:value,label:value})),change:(value:string)=>updateDraft({assignee:value}),icon:'user'}, {label:'Project',aria:'Ticket project',value:draft.project,options:projects.map(value=>({id:value,label:value})),change:(value:string)=>updateDraft({project:value}),icon:'folder'}].map(field=><NativeChartSelect key={field.label} popoverContainer={ticketPopoverContainer??undefined} aria-label={field.aria} selectedKey={field.value} onSelectionChange={key=>{if(key!==null){field.change(String(key));setTicketTouched(previous=>previous.includes(field.aria)?previous:[...previous,field.aria]);}}} className=\"bt-ticket-source-select\" triggerClassName=\"bt-ticket-source-select-trigger\" renderValue={<><UIIcon name={field.icon as React.ComponentProps<typeof UIIcon>['name']}/>{adding&&!ticketTouched.includes(field.aria)?field.label:field.options.find(option=>option.id===field.value)?.label||field.label}</>}>{field.options.map(option=><NativeChartSelectItem key={option.id} id={option.id} textValue={option.label}>{option.label}</NativeChartSelectItem>)}</NativeChartSelect>)}<div ref={setTicketPopoverContainer} style={{display:'contents'}}/></NativeScope></div>\n            {editing && (\n              <>\n                <h3>Resources</h3>\n                <div className=\"bt-ticket-resources\">\n                  <a href=\"/components/dialog\">Dialog guidelines <UIIcon name=\"arrow-up-right\" /></a>\n                  <Button\n                    variant=\"tertiary\"\n                    size=\"sm\"\n                    onClick={async () => {\n                      try {\n                        await navigator.clipboard.writeText(draft.id);\n                        setNotice('Ticket ID copied.');\n                      } catch {\n                        setNotice('Ticket ID: ' + draft.id);\n                      }\n                    }}\n                  >\n                    Copy ticket ID\n                  </Button>\n                </div>\n                <ProfileHistoryChart title=\"Tokens burned\" points={tokenPoints} kind=\"area\" />\n              </>\n            )}\n          </form>\n          {editing && (\n            <aside className=\"bt-ticket-comments\" aria-label=\"Ticket comments\">\n\n              <div role=\"log\" aria-label={`Comments for ${editing.id}`}>\n                {thread.map((item) => (\n                  <article key={item.id}>\n                    <header>\n                      <strong>{item.author}</strong>\n                      <small>{item.time}</small>\n                    </header>\n                    <p>{item.body}</p>\n                  </article>\n                ))}\n              </div>\n              <form\n                onSubmit={(event) => {\n                  event.preventDefault();\n                  if (!comment.trim()) return;\n                  setComments((previous) => ({\n                    ...previous,\n                    [editing.id]: [\n                      ...thread,\n                      {\n                        id: 'comment-' + Date.now(),\n                        author: names[0],\n                        body: comment.trim(),\n                        time: 'Just now',\n                      },\n                    ],\n                  }));\n                  setComment('');\n                  document.getElementById(commentId)?.focus();\n                }}\n              >\n                <label htmlFor={commentId}>Add a comment</label>\n                <textarea\n                  id={commentId}\n                  value={comment}\n                  rows={1}\n                  maxLength={1000}\n                  placeholder=\"Enter your comment\"\n                  onChange={(event) => setComment(event.target.value)}\n                />\n                <Button type=\"submit\" size=\"sm\" disabled={!comment.trim()}>\n                  <UIIcon name=\"arrow-up\"/><span className=\"hu-sr-only\">Post comment</span>\n                </Button>\n              </form>\n            </aside>\n          )}\n        </div>\n      </Dialog>\n      <Dialog\n        open={limitColumn !== null}\n        onOpenChange={(open) => {\n          if (!open) setLimitColumn(null);\n        }}\n        title=\"Column limit\"\n        footer={\n          <>\n            <Button variant=\"secondary\" onClick={() => setLimitColumn(null)}>\n              Cancel\n            </Button>\n            <Button\n              disabled={\n                !Number.isInteger(Number(limitDraft)) ||\n                Number(limitDraft) < 1 ||\n                Number(limitDraft) > 30\n              }\n              onClick={() => {\n                if (limitColumn)\n                  setLimits((previous) => ({ ...previous, [limitColumn]: Number(limitDraft) }));\n                setLimitColumn(null);\n              }}\n            >\n              Save limit\n            </Button>\n          </>\n        }\n      >\n        <Input\n          label=\"Work-in-progress limit\"\n          type=\"number\"\n          min={1}\n          max={30}\n          required\n          value={limitDraft}\n          onChange={(event) => setLimitDraft(event.target.value)}\n        />\n      </Dialog>\n      <Dialog open={inbox} onOpenChange={setInbox} title=\"Project inbox\">\n        <div className=\"bt-inbox-list\">\n          {tasks.slice(0, 5).map((task) => (\n            <Button\n              key={task.id}\n              variant=\"secondary\"\n              onClick={() => {\n                setInbox(false);\n                openTask(task);\n              }}\n            >\n              {task.id} · {task.title}\n            </Button>\n          ))}\n        </div>\n      </Dialog>\n    </>\n  );\n}\n\ntype Patient = {\n  id: string;\n  name: string;\n  admission: string;\n  status: string;\n  condition: string;\n  appointment: string;\n};\nconst patientSeed: Patient[] = Array.from({ length: 24 }, (_, index) => ({\n  id: 'patient-' + index,\n  name: names[index % 12] + (index >= 12 ? ` ${index - 11}` : ''),\n  admission: ['Outpatient', 'Inpatient', 'Emergency', 'Discharged'][index % 4],\n  status: ['Recovering', 'In treatment', 'Under observation', 'Stable'][index % 4],\n  condition: ['Follow-up', 'Review', 'Routine', 'Post-op'][index % 4],\n  appointment: `2026-${String((index % 3) + 10).padStart(2, '0')}-${String((index % 24) + 3).padStart(2, '0')}`,\n}));\nfunction ActivityRings({day}:{day:string}) {\n  const values = [\n    {\n      label: 'Move',\n      value: 816 + Number(day) * 3,\n      goal: 1000,\n      unit: 'kcal',\n      color: 'var(--color-chart-3)',\n    },\n    {\n      label: 'Exercise',\n      value: 101 + (Number(day) % 10),\n      goal: 120,\n      unit: 'min',\n      color: 'var(--color-chart-2)',\n    },\n    {\n      label: 'Running',\n      value: 5.2 + (Number(day) % 3) / 10,\n      goal: 10,\n      unit: 'km',\n      color: 'var(--color-chart-4)',\n    },\n  ];\n  return (\n    <Panel\n      title={`Activity for July ${day}, 2026`}\n      className=\"bt-activity-card\"\n\n    >\n      <div className=\"bt-mini-stats\">\n        {values.map((item) => (\n          <span key={item.label}>\n            <small>{item.label}</small>\n            <strong>\n              {item.value.toFixed(item.unit === 'km' ? 1 : 0)} {item.unit}\n            </strong>\n          </span>\n        ))}\n      </div>\n      <svg\n        className=\"bt-activity-rings\"\n        viewBox=\"0 0 220 220\"\n        role=\"img\"\n        aria-label={values\n          .map((item) => `${item.label}: ${item.value} of ${item.goal} ${item.unit}`)\n          .join('; ')}\n      >\n        {values.map((item, index) => {\n          const radius = 88 - index * 24,\n            circumference = 2 * Math.PI * radius;\n          return (\n            <g key={item.label}>\n              <circle\n                cx=\"110\"\n                cy=\"110\"\n                r={radius}\n                fill=\"none\"\n                stroke={item.color}\n                opacity=\"0.16\"\n                strokeWidth=\"18\"\n              />\n              <circle\n                cx=\"110\"\n                cy=\"110\"\n                r={radius}\n                fill=\"none\"\n                stroke={item.color}\n                strokeWidth=\"18\"\n                strokeLinecap=\"round\"\n                strokeDasharray={`${Math.min(1, item.value / item.goal) * circumference} ${circumference}`}\n                transform=\"rotate(-90 110 110)\"\n              />\n            </g>\n          );\n        })}\n      </svg>\n    </Panel>\n  );\n}\nfunction MedicalContent({assetsBase}:{assetsBase:string}) {\n  const [tableSearch,setTableSearch]=useState('');\n  const [patientDraft,setPatientDraft]=useState<Patient|null>(null);\n  const [photo,setPhoto]=useState(''),[activityDay,setActivityDay]=useState('10'),[alertWeek,setAlertWeek]=useState(0);const photoInput=useRef<HTMLInputElement>(null);\n  const [patients, setPatients] = useState(patientSeed),\n    [status, setStatus] = useState('All'),\n    [condition, setCondition] = useState('All'),\n    [report, setReport] = useState(false),\n    [reports, setReports] = useState<string[]>([]),\n    [subject, setSubject] = useState(''),\n    [notes, setNotes] = useState(''),\n    [detail, setDetail] = useState<Patient | null>(null),\n    [alert, setAlert] = useState<string | null>(null),\n    [notice, setNotice] = useState('');\n  const form = useId(),\n    filter = useRef<HTMLSelectElement>(null);\n  const filtered = patients.filter(\n    (patient) =>\n      (status === 'All' || patient.status === status) &&\n      (condition === 'All' || patient.condition === condition),\n  );\n  const columns: Column<Patient>[] = [\n    { key: 'name', header: 'Patient', value: (row) => row.name, sortable: true,render:row=><Avatar name={row.name} assetsBase={assetsBase} index={Number(row.id.replace(/\\D/g,''))%6} secondary=\"\"/> },\n    {\n      key: 'admission',\n      header: 'Admission',\n      value: (row) => row.admission,\n      render: (row) => (\n        <InlineTemplateSelect\n          label={`Admission for ${row.name}`}\n          value={row.admission}\n          values={['Outpatient', 'Inpatient', 'Emergency', 'Discharged']}\n          onChange={(value) =>\n            setPatients((previous) =>\n              previous.map((item) => (item.id === row.id ? { ...item, admission: value } : item)),\n            )\n          }\n        />\n      ),\n    },\n    {\n      key: 'status',\n      header: 'Status',\n      value: (row) => row.status,\n      render: (row) => <Status value={row.status} />,\n    },\n    {\n      key: 'condition',\n      header: 'Condition',\n      value: (row) => row.condition,\n      render: (row) => <span className=\"bt-chip\" data-category={row.condition}>{row.condition}</span>,\n    },\n    {\n      key: 'appointment',\n      header: 'Next appointment',\n      value: (row) => row.appointment,\n      render:row=>readableDate(row.appointment),\n      sortable: true,\n    },\n  ];\n  const alertTitles = alertWeek===0?['High heart rate','Medical ID','Activity reminder','Sleep summary','Lab results ready','Hydration reminder','Weekly activity report','Resting heart rate update','Appointment reminder','Medication list updated','Profile information updated','Move streak']:alertWeek<0?['Weekly activity summary','Sleep schedule update','Medical ID']:['Upcoming appointment','Activity reminder'];\n  const alertStart=new Date(Date.UTC(2026,5,29+alertWeek*7)),alertEnd=new Date(Date.UTC(2026,5,35+alertWeek*7));\n  const alertRange=alertStart.toLocaleDateString('en-GB',{day:'numeric',month:'short',timeZone:'UTC'})+' – '+alertEnd.toLocaleDateString('en-GB',{day:'numeric',month:'short',timeZone:'UTC'});\n  const searchedRows=filtered.filter(row=>JSON.stringify(row).toLocaleLowerCase().includes(tableSearch.toLocaleLowerCase()));\n  return (\n    <>\n      <PageHeading\n        title=\"Medical Profile\"\n        onFilter={() => filter.current?.focus()}\n        action={\n          <Button\n            size=\"sm\"\n            onClick={() => {\n              setSubject('');\n              setNotes('');\n              setReport(true);\n            }}\n          >\n            ＋ File a report\n          </Button>\n        }\n      />\n      <div className=\"bt-grid-three bt-medical-grid\">\n        <Panel title=\"\" className=\"bt-patient-card\">\n          <div className=\"bt-medical-identity\">\n            <span className=\"bt-patient-avatar\">{photo?<img src={photo} alt=\"Local profile photo\"/>:<span>A</span>}<button type=\"button\" aria-label=\"Update profile photo\" onClick={()=>photoInput.current?.click()}>+</button></span><input ref={photoInput} type=\"file\" accept=\"image/*\" className=\"hu-sr-only\" aria-label=\"Profile photo file\" onChange={event=>{const file=event.target.files?.[0];if(!file)return;if(!file.type.startsWith('image/')||file.size>5*1024*1024){setNotice('Choose an image smaller than5MB.');return;}const reader=new FileReader();reader.onload=()=>{setPhoto(String(reader.result));setNotice('Profile photo updated locally.');};reader.readAsDataURL(file);}}/>\n            <h2>Aarav Shah</h2>\n            \n          </div>\n          <dl className=\"bt-profile-facts\">\n            <dt><RiAsterisk size={16}/>Date of Birth</dt>\n            <dd>28 July, 1997</dd>\n            <dt><RiMenLine size={16}/>Gender</dt>\n            <dd>Male</dd>\n            <dt><RiDropLine size={16}/>Blood Type</dt>\n            <dd>A rh+</dd>\n            <dt><RiStethoscopeLine size={16}/>GP Doctor</dt>\n            <dd>Dr. Meera Shah</dd>\n          </dl>\n        </Panel>\n        <SourceChartPreview\n          fluid\n          id=\"steps-card\"\n          title=\"Steps\"\n        />\n        <SourceChartPreview fluid id=\"sleep-score-card\" title=\"Sleep score\" />\n        <SourceChartPreview fluid id=\"most-active-days-card\" title=\"Most active days\" onSelect={(row,index)=>setActivityDay(String(/^\\d{4}-/.test(row.name)?new Date(row.name).getUTCDate():Number(row.name.match(/(?:^|\\D)(\\d{1,2})(?:\\D|$)/)?.[1])||index+1))}/>\n        <ActivityRings day={activityDay}/>\n        <Panel title=\"Important alerts\" className=\"bt-alerts-card\" action={<div className=\"bt-alert-period\"><button type=\"button\" aria-label=\"Previous alert week\" onClick={()=>setAlertWeek(value=>value-1)}><UIIcon name=\"chevron-left\"/></button><span>{alertRange}</span><button type=\"button\" aria-label=\"Next alert week\" onClick={()=>setAlertWeek(value=>value+1)}><UIIcon name=\"chevron-right\"/></button></div>}>\n          <strong className=\"bt-number\">{alertTitles.length + reports.length} <small>this week</small></strong>\n          <div className=\"bt-alert-list\">\n            {[...alertTitles, ...reports].map((title, index) => (\n              <button type=\"button\" key={`${alertWeek}-${index}`} onClick={() => setAlert(title)}>\n                <span className=\"bt-alert-icon\" data-tone={index===0?'danger':'warning'}>{index===0?<RiHeartPulseFill size={18}/>:<UIIcon name=\"plus\"/>}</span><time>{new Intl.DateTimeFormat('en-US',{month:'long',day:'numeric',timeZone:'UTC'}).format(new Date(Date.UTC(2026,5,12-index*3+alertWeek*7)))}</time>\n                <strong>{title}</strong>\n                <p>{index===0?'A fictional heart-rate observation was recorded after ten minutes of inactivity. Open this local example to review its details.':index===1?'Review the emergency contact and allergy fields in this example medical profile.':'Your local activity summary is available. Open this example update to review it.'}</p>\n              </button>\n            ))}\n          </div>\n        </Panel>\n      </div>\n      <section className=\"bt-data-section\">\n        <header>\n          <div>\n            <small>Total results</small>\n            <strong>{searchedRows.length} patients</strong>\n          </div>\n          <div>\n            <Select\n              ref={filter}\n              label=\"Patient status\"\n              size=\"sm\"\n              value={status}\n              options={['All', 'Recovering', 'In treatment', 'Under observation', 'Stable'].map(\n                (value) => ({ value, label: value === 'All' ? 'All statuses' : value }),\n              )}\n              onChange={(event) => setStatus(event.target.value)}\n            />\n            <Select\n              label=\"Patient condition\"\n              size=\"sm\"\n              value={condition}\n              options={['All', 'Follow-up', 'Review', 'Routine', 'Post-op'].map((value) => ({\n                value,\n                label: value === 'All' ? 'All conditions' : value,\n              }))}\n              onChange={(event) => setCondition(event.target.value)}\n            />\n            <Input className=\"bt-source-table-search\" label=\"Search records\" type=\"search\" size=\"sm\" leadingIcon={<BIcon name=\"search\"/>} placeholder=\"Search\" value={tableSearch} onChange={event=>setTableSearch(event.target.value)}/>\n          </div>\n        </header>\n        <TemplateTable documentAction={row=>downloadCSV('helios-example-profile.csv',['Name','Admission','Status','Condition','Appointment'],[[row.name,row.admission,row.status,row.condition,row.appointment]])} presentation=\"board\" hideToolbar\n          onDelete={(row) =>\n            setPatients((previous) => previous.filter((item) => item.id !== row.id))\n          }\n          caption=\"Fictional patient directory\"\n          rows={searchedRows}\n          columns={columns}\n          rowKey={(row) => row.id}\n          rowLabel={(row) => row.name}\n          pageSize={12}\n          onRetry={() => { setTableSearch('');\n            setStatus('All');\n            setCondition('All');\n          }}\n          onRowAction={row=>{setDetail(row);setPatientDraft({...row})}}\n        />\n      </section>\n      <p className=\"bt-status-message\" role=\"status\">\n        {notice}\n      </p>\n      <Dialog\n        open={report}\n        onOpenChange={setReport}\n        title=\"File an example report\"\n        description=\"This creates a local note only. No clinical or medical record system is connected.\"\n        footer={\n          <>\n            <Button variant=\"secondary\" onClick={() => setReport(false)}>\n              Cancel\n            </Button>\n            <Button type=\"submit\" form={form}>\n              Save example report\n            </Button>\n          </>\n        }\n      >\n        <form\n          id={form}\n          className=\"bt-dialog-fields\"\n          onSubmit={(event) => {\n            event.preventDefault();\n            setReports((previous) => [...previous, subject]);\n            setNotice('Example report saved locally.');\n            setReport(false);\n          }}\n        >\n          <Input\n            label=\"Report subject\"\n            required\n            value={subject}\n            onChange={(event) => setSubject(event.target.value)}\n          />\n          <label className=\"bt-field\">\n            Example notes\n            <textarea required value={notes} onChange={(event) => setNotes(event.target.value)} />\n          </label>\n        </form>\n      </Dialog>\n      <Dialog\n        open={detail !== null}\n        onOpenChange={(open) => {\n          if (!open) setDetail(null);\n        }}\n        title={detail?.name || 'Patient details'}\n        description=\"Fictional UI example. This interface does not provide clinical recommendations.\"\n        footer={\n          <>\n            <Button variant=\"secondary\" onClick={() => setDetail(null)}>\n              Close\n            </Button>\n            <Button\n              onClick={() => {\n                if (detail)\n                  downloadCSV(\n                    'helios-example-profile.csv',\n                    ['Name', 'Admission', 'Status', 'Condition', 'Appointment'],\n                    [\n                      [\n                        detail.name,\n                        detail.admission,\n                        detail.status,\n                        detail.condition,\n                        detail.appointment,\n                      ],\n                    ],\n                  );\n              }}\n            >\n              Download example\n            </Button>\n            <Button type=\"submit\" form={form+'-patient'}>Save patient</Button>\n          </>\n        }\n      >\n        {patientDraft&&<form id={form+'-patient'} className=\"bt-dialog-fields\" onSubmit={event=>{event.preventDefault();setPatients(previous=>previous.map(row=>row.id===patientDraft.id?patientDraft:row));setDetail(null);setNotice('Fictional patient saved locally.')}}>\n          <Input label=\"Patient name\" required value={patientDraft.name} onChange={event=>setPatientDraft({...patientDraft,name:event.target.value})}/>\n          <Select label=\"Patient admission\" value={patientDraft.admission} options={['Outpatient','Inpatient','Emergency','Discharged'].map(value=>({value,label:value}))} onChange={event=>setPatientDraft({...patientDraft,admission:event.target.value})}/>\n          <Select label=\"Patient status\" value={patientDraft.status} options={['Recovering','In treatment','Under observation','Stable'].map(value=>({value,label:value}))} onChange={event=>setPatientDraft({...patientDraft,status:event.target.value})}/>\n          <Input label=\"Patient condition\" required value={patientDraft.condition} onChange={event=>setPatientDraft({...patientDraft,condition:event.target.value})}/>\n          <Input label=\"Next appointment\" type=\"date\" required value={patientDraft.appointment} onChange={event=>setPatientDraft({...patientDraft,appointment:event.target.value})}/>\n        </form>}\n      </Dialog>\n      <Dialog\n        open={alert !== null}\n        onOpenChange={(open) => {\n          if (!open) setAlert(null);\n        }}\n        title={alert || 'Activity details'}\n        description=\"A fictional example update used to demonstrate the interface.\"\n        footer={\n          <Button variant=\"secondary\" onClick={() => setAlert(null)}>\n            Close\n          </Button>\n        }\n      >\n        <p>\n          This activity is part of the local Helios UI template study. No real patient or clinical\n          event is represented.\n        </p>\n      </Dialog>\n    </>\n  );\n}\n\ntype StarterMessage = { author: string; text: string };\ntype StarterThread = { id: string; title: string; messages: StarterMessage[]; draft: string };\nfunction ChatStarterContent({ storageKey }: { storageKey?: string }) {\n  const { ref, narrow } = useNarrowTemplate(950);\n  const [demo, setDemo] = useState(false),\n    [threads, setThreads] = useState<StarterThread[]>([{ id: 'starter', title: 'New chat', messages: [], draft: '' }]),\n    [selected, setSelected] = useState('starter'),\n    [hydrated, setHydrated] = useState(false),\n    [persistenceEnabled, setPersistenceEnabled] = useState(true),\n    [history, setHistory] = useState<boolean|null>(null),\n    [historyQuery, setHistoryQuery] = useState(''),\n    [notice, setNotice] = useState(''),\n    [auth, setAuth] = useState<'signin' | 'signup' | null>(null),\n    [session, setSession] = useState(0);\n  const historyOpen=demo&&(history??!narrow);\n  const current = threads.find(thread => thread.id === selected) || threads[0];\n  const messages = current?.messages || [];\n  const historyRows = threads.filter(thread => (thread.messages.length > 0 || thread.draft.trim()) && thread.title.toLowerCase().includes(historyQuery.toLowerCase()));\n  useEffect(() => {\n    setHydrated(false);\n    if (storageKey) {\n      try {\n        const saved: unknown = JSON.parse(localStorage.getItem(storageKey) || 'null');\n        if (saved && typeof saved === 'object' && 'threads' in saved && Array.isArray(saved.threads)) {\n          const restored = saved.threads.slice(0, 20).flatMap((thread: unknown): StarterThread[] => {\n            if (!thread || typeof thread !== 'object') return [];\n            const value = thread as Record<string, unknown>;\n            if (typeof value.id !== 'string' || typeof value.title !== 'string' || !Array.isArray(value.messages)) return [];\n            return [{ id: value.id.slice(0, 100), title: value.title.slice(0, 80), draft: typeof value.draft === 'string' ? value.draft.slice(0, 10000) : '', messages: value.messages.slice(-100).flatMap((item: unknown): StarterMessage[] => {\n              if (!item || typeof item !== 'object') return [];\n              const message = item as Record<string, unknown>;\n              return typeof message.author === 'string' && typeof message.text === 'string' ? [{ author: message.author.slice(0, 80), text: message.text.slice(0, 10000) }] : [];\n            }) }];\n          });\n          if (restored.length) { setThreads(restored); setSelected('selected' in saved && typeof saved.selected === 'string' && restored.some(thread => thread.id === saved.selected) ? saved.selected : restored[0].id); setDemo(true); }\n        }\n      } catch { setNotice('Saved chat history could not be read. This session remains editable.'); }\n    }\n    setHydrated(true);\n  }, [storageKey]);\n  useEffect(() => {\n    if (!storageKey || !hydrated || !persistenceEnabled) return;\n    try { localStorage.setItem(storageKey, JSON.stringify({ version: 1, threads, selected })); }\n    catch { setNotice('Browser storage is unavailable. This conversation remains in memory.'); }\n  }, [storageKey, hydrated, threads, selected, persistenceEnabled]);\n  useEffect(() => () => { if ('speechSynthesis' in window) speechSynthesis.cancel(); }, []);\n  const update = (change: Partial<StarterThread>) => { setPersistenceEnabled(true); setThreads(previous => previous.map(thread => thread.id === current.id ? { ...thread, ...change } : thread)); };\n  const newChat = () => {\n    setPersistenceEnabled(true);\n    const id = crypto.randomUUID();\n    setThreads(previous => [{ id, title: 'New chat', messages: [], draft: '' }, ...previous].slice(0, 20));\n    setSelected(id); setSession(previous => previous + 1);\n  };\n  const clearHistory = () => {\n    setPersistenceEnabled(false);\n    setThreads([{ id: 'starter', title: 'New chat', messages: [], draft: '' }]); setSelected('starter'); setSession(previous => previous + 1);\n    if (storageKey) { try { localStorage.removeItem(storageKey); } catch {} }\n    setNotice('Saved chat history and drafts cleared for this local example.');\n  };\n  return (\n    <section ref={ref} data-demo={demo} className={`bt-chat-starter ${historyOpen && !narrow ? 'bt-starter-history-open' : ''}`}>\n      <header>\n        <span className=\"bt-starter-title\"><NativeScope><NavigationToggle/></NativeScope><h1>{messages.length ? current.title : 'New chat'}</h1></span>\n        <div className=\"bt-starter-header-actions\"><NativeScope translate={templateCopy}><NativeButton variant=\"ghost\" size=\"small\" iconOnly leadingIcon={RiShare2Line} aria-label=\"Share conversation\" disabled={!demo||!messages.length} onClick={async()=>{try{await navigator.clipboard.writeText(location.href);setNotice('Local conversation URL copied. Conversation text stays in this browser.');}catch{setNotice('Copy the URL from your browser.');}}}/></NativeScope><div className=\"bt-source-chat-menu\"><DropdownMenu label=\"Chat options\" disabled={!demo} size=\"sm\" items={[{id:'new',label:'New chat'},{id:'history',label:'Chat history'},{id:'clear',label:'Clear saved history'},{id:'signin',label:'Sign in'},{id:'signup',label:'Sign up'}]} onAction={id=>{if(id==='new')newChat();if(id==='history')setHistory(true);if(id==='clear')clearHistory();if(id==='signin'||id==='signup')location.assign(id==='signin'?'/login':'/signup');}}/></div></div>\n      </header>\n      <div className=\"bt-starter-conversation\">\n        {!demo ? <div className=\"bt-provider-card\">\n          <h2>Add a model provider to start</h2>\n          <p>The chat interface is ready. This preview uses local replies; live answers need your application’s model provider.</p>\n          <ol><li>Configure a model provider in your application’s server environment.</li><li>Keep credentials on the server and authorize every request.</li><li>Deploy your application with that provider configuration.</li></ol>\n          <p className=\"bt-note\">No provider key is requested or stored by this website.</p>\n          <NativeScope><NativeButton onClick={() => setDemo(true)}>Skip, show me the local demo</NativeButton></NativeScope>\n        </div> : <>\n          <div className=\"bt-message-log\" role=\"log\" aria-label=\"Starter conversation\">\n            {messages.length ? messages.map((message, index) => <article key={index} data-author={message.author === 'You' ? 'user' : 'assistant'}>\n              <strong>{message.author}</strong><p>{message.text}</p>\n              {message.author !== 'You' && <div className=\"bt-message-actions\">\n                <Button variant=\"tertiary\" size=\"sm\" aria-label={`Copy reply ${index + 1}`} onClick={async () => { try { await navigator.clipboard.writeText(message.text); setNotice('Reply copied.'); } catch { setNotice('Clipboard unavailable. Select and copy the reply text.'); } }}><UIIcon name=\"copy\" /> Copy</Button>\n                <Button variant=\"tertiary\" size=\"sm\" aria-label={`Read reply ${index + 1} aloud`} onClick={() => {\n                  if (!('speechSynthesis' in window)) { setNotice('Read aloud is unavailable in this browser. The reply text remains available.'); return; }\n                  speechSynthesis.cancel(); speechSynthesis.speak(new SpeechSynthesisUtterance(message.text)); setNotice('Reading with your browser voice.');\n                }}><UIIcon name=\"microphone\" /> Read aloud</Button>\n                <Button variant=\"tertiary\" size=\"sm\" onClick={() => { if ('speechSynthesis' in window) speechSynthesis.cancel(); setNotice('Read aloud stopped.'); }}>Stop reading</Button>\n              </div>}\n            </article>) : <div className=\"bt-chat-welcome\"><h2>What can I help with?</h2><p>This preview uses local replies. History stays in this browser.</p><div className=\"bt-starter-suggestions\">{[\"Explain what this starter does\",\"Write a product update in three sentences\",\"Give me five names for a scheduling app\"].map(text=><button type=\"button\" key={text} onClick={()=>update({draft:text})}>{text}</button>)}</div></div>}\n          </div>\n          <div className=\"bt-template-composer\"><SourceComposer key={current.id + session} minRows={1} status={null} value={current.draft} onValueChange={draft => update({ draft })} onSend={message => update({ title: messages.length ? current.title : message.text.slice(0, 60), draft: '', messages: [...messages, { author: 'You', text: message.text }, { author: 'Helios demo', text: 'This local conversation demonstrates the React composer, message history and keyboard behavior. No model provider was contacted.' }].slice(-100) })} /></div>\n        </>}\n        <p className=\"bt-note bt-chat-storage-note\">{storageKey ? 'Chat text and drafts are saved in this browser. Use Clear saved history to remove them. Avoid entering sensitive information in this demo.' : 'This embedded example keeps chat text in memory only.'}</p>\n        <p className=\"bt-status-message\" role=\"status\">{notice}</p>\n      </div>\n      <ResponsiveTemplatePanel open={historyOpen} onOpenChange={setHistory} narrow={narrow} title=\"Chat history\" className=\"bt-chat-history\">\n        <header><Button variant=\"tertiary\" size=\"sm\" onClick={newChat}><RiAddLine size={16}/>New chat</Button><Button variant=\"tertiary\" size=\"sm\" aria-label=\"Close chat history\" onClick={() => setHistory(false)}><RiCloseLine size={16}/></Button></header>\n        <Input label=\"Search chat history\" type=\"search\" value={historyQuery} onChange={event => setHistoryQuery(event.target.value)} />\n        <div className=\"bt-chat-history-list\">{historyRows.map(thread => <Button key={thread.id} variant=\"tertiary\" aria-pressed={thread.id === current.id} onClick={() => { setSelected(thread.id); setDemo(true); if (narrow) setHistory(false); }}>{thread.title}</Button>)}{historyRows.length === 0 && <p role=\"status\" className=\"bt-note\">{historyQuery ? 'No saved conversations match your search.' : 'No saved conversations yet. Send a message to begin.'}</p>}</div>\n        <Button variant=\"secondary\" size=\"sm\" onClick={clearHistory}>Clear saved history</Button>\n      </ResponsiveTemplatePanel>\n      <Dialog open={auth !== null} onOpenChange={open => { if (!open) setAuth(null); }} title={auth === 'signup' ? 'Create an example account' : 'Sign in to the example'} description=\"Authentication layout and validation only; no account service is connected.\" footer={<Button variant=\"secondary\" onClick={() => setAuth(null)}>Close</Button>}>{auth && <AuthCard mode={auth} />}</Dialog>\n    </section>\n  );\n}\n\nconst codeExample = '\\'use client\\';\\n\\nimport { useState, type FormEvent } from \\'react\\';\\nimport { Button, Input, Select } from \\'@helios-ui/react\\';\\nimport \\'@helios-ui/react/styles.css\\';\\n\\n/** A reusable local React form. No service connection is required. */\\nexport default function Example() {\\n  const [project, setProject] = useState(\\'Helios UI\\');\\n  const [variant, setVariant] = useState<\\'primary\\' | \\'secondary\\'>(\\'primary\\');\\n  const [updates, setUpdates] = useState<string[]>([]);\\n\\n  function saveProject(event: FormEvent<HTMLFormElement>) {\\n    event.preventDefault();\\n    if (!project.trim()) return;\\n    setUpdates(previous => [project.trim(), ...previous]);\\n  }\\n\\n  return (\\n    <main style={{ maxWidth: 720, padding: 24, margin: \\'auto\\' }}>\\n      <header>\\n        <h1>Component playground</h1>\\n        <p>Build accessible interfaces with shared React components.</p>\\n      </header>\\n\\n      <section aria-labelledby=\"project-heading\">\\n        <h2 id=\"project-heading\">Your project</h2>\\n        <form onSubmit={saveProject}>\\n          <Input\\n            label=\"Project name\"\\n            required\\n            value={project}\\n            onChange={event => setProject(event.target.value)}\\n          />\\n          <Select\\n            label=\"Button style\"\\n            value={variant}\\n            options={[\\n              { value: \\'primary\\', label: \\'Primary\\' },\\n              { value: \\'secondary\\', label: \\'Secondary\\' },\\n            ]}\\n            onChange={event => setVariant(\\n              event.target.value === \\'secondary\\' ? \\'secondary\\' : \\'primary\\'\\n            )}\\n          />\\n          <Button type=\"submit\" variant={variant}>\\n            Save project\\n          </Button>\\n        </form>\\n      </section>\\n\\n      <section aria-label=\"Saved projects\" aria-live=\"polite\">\\n        <h2>Recent updates</h2>\\n        {updates.length ? (\\n          <ul>{updates.map((name, index) => <li key={index}>{name}</li>)}</ul>\\n        ) : (\\n          <p>No saved projects yet. Submit the form to create one.</p>\\n        )}\\n      </section>\\n    </main>\\n  );\\n}\\n';\nfunction CodeTokens({line}:{line:string}){\n return <>{line.split(/('[^']*'|\"[^\"]*\"|\\b(?:import|from|export|default|function|return|const|if|type)\\b)/g).map((token,index)=><span key={index} data-code-token={/^['\"]/.test(token)?'string':/^(import|from|export|default|function|return|const|if|type)$/.test(token)?'keyword':undefined}>{token}</span>)}</>;\n}\nfunction SourceWorkspaceHeader({label,onNew,onPanel,panelOpen,compact=false}:{label:string;onNew:()=>void;onPanel:()=>void;panelOpen:boolean;compact?:boolean}){\n const chrome=useContext(TemplateChromeContext),[notice,setNotice]=useState('');\n const title=label==='coding scenario'?'Agentic chat':'Image generation';\n const actions=<div className=\"bt-workspace-actions\"><NativeScope><NativeButton className=\"bt-workspace-header-share\" variant=\"ghost\" size=\"small\" iconOnly leadingIcon={RiShare2Line} aria-label=\"Share workspace\" onClick={async()=>{try{await navigator.clipboard.writeText(location.href);setNotice('Local workspace URL copied.');}catch{setNotice('Copy the workspace URL from your browser.');}}}/></NativeScope><DropdownMenu label=\"Workspace actions\" triggerContent={<RiMoreLine size={20}/>} size=\"sm\" items={[{id:'new',label:'New chat'},{id:'panel',label:panelOpen?'Hide workspace panel':'Show workspace panel'}]} onAction={id=>id==='new'?onNew():onPanel()}/></div>;\n const locationLabel=<span className=\"bt-workspace-location-label\"><UIIcon name=\"folder\"/>helios coding project<UIIcon name=\"chevron-right\"/>{label}</span>;\n return <header className=\"bt-source-workspace-header\" data-compact={compact}>\n   {compact?<><div className=\"bt-workspace-mobile-title\"><span><NavigationToggle/><strong>{title}</strong></span><NativeScope><NativeButton className=\"bt-workspace-panel-toggle\" variant=\"secondary\" size=\"medium\" iconOnly leadingIcon={label==='coding scenario'?RiCodeSLine:RiGalleryLine} aria-label={label==='coding scenario'?'Open code panel':'Open gallery'} aria-expanded={panelOpen} onClick={onPanel}/></NativeScope></div><div className=\"bt-workspace-location\">{locationLabel}{actions}</div></>:<>{locationLabel}{actions}</>}\n   <span className=\"hu-sr-only\" role=\"status\">{notice}</span>\n </header>;\n}\nfunction WorkspacePanelTools({expanded,onExpand,onTerminal,onClose}:{expanded:boolean;onExpand:()=>void;onTerminal?:()=>void;onClose:()=>void}){return <div className=\"bt-panel-tools\"><NativeScope>{onTerminal&&<NativeButton size=\"small\" variant=\"ghost\" iconOnly leadingIcon={RiTerminalBoxLine} aria-label=\"Toggle terminal preview\" onClick={onTerminal}/>}<NativeButton size=\"small\" variant=\"ghost\" iconOnly leadingIcon={RiExpandDiagonalLine} aria-label={expanded?'Restore workspace panel':'Expand workspace panel'} aria-pressed={expanded} onClick={onExpand}/><NativeButton size=\"small\" variant=\"ghost\" iconOnly leadingIcon={RiSideBarLine} aria-label=\"Hide workspace panel\" onClick={onClose}/></NativeScope></div>}\nfunction LocalTerminalDialog({open,onOpenChange}:{open:boolean;onOpenChange:(open:boolean)=>void}){return <Dialog open={open} onOpenChange={onOpenChange} title=\"Terminal preview\" description=\"Read-only bundled output. No commands run and no local files are changed.\" footer={<Button variant=\"secondary\" onClick={()=>onOpenChange(false)}>Close terminal</Button>}><pre className=\"bt-terminal-preview\"><code>{`$ npm run build\\n\\nLocal interface example\\nSource files are displayed in the Changes panel.\\nConnect your own application harness to execute commands.`}</code></pre></Dialog>}\nfunction PanelResizeHandle({onChange}:{onChange:(value:number)=>void}){const[width,setWidth]=useState(410);const update=(value:number)=>{const next=Math.max(320,Math.min(620,value));setWidth(next);onChange(next)};return <div role=\"separator\" tabIndex={0} aria-label=\"Resize workspace panel\" aria-orientation=\"vertical\" aria-valuemin={320} aria-valuemax={620} aria-valuenow={width} className=\"bt-panel-resize\" onPointerDown={event=>{event.currentTarget.setPointerCapture(event.pointerId)}} onPointerMove={event=>{if(event.currentTarget.hasPointerCapture(event.pointerId))update(event.currentTarget.closest('.bt-root')?.matches(':dir(rtl)')?event.clientX-12:window.innerWidth-event.clientX-12)}} onKeyDown={event=>{if(event.key==='ArrowLeft'||event.key==='ArrowRight'){event.preventDefault();update(width+(event.key==='ArrowLeft'?20:-20))}}}/>}\nfunction CodeChatContent() {\n  const { ref, narrow } = useNarrowTemplate(1000);\n  const [panelWidth,setPanelWidth]=useState(410),[expanded,setExpanded]=useState(false),[terminal,setTerminal]=useState(false),[workActive,setWorkActive]=useState(true),[progressTurn,setProgressTurn]=useState(0);\n  const [messages, setMessages] = useState<{ author: string; text: string }[]>([\n      {\n        author: 'You',\n        text: 'Update our color tokens for dark mode and add a reusable theme toggle.',\n      },\n    ]),\n    [tab, setTab] = useState('changes'),\n    [panelPreference, setPanelPreference] = useState<boolean|null>(null),\n    [notice, setNotice] = useState(''),\n    [variant, setVariant] = useState('primary'),\n    [session, setSession] = useState(0),\n    [attachments, setAttachments] = useState(false);\n  const send = (message: ComposerMessage) => {\n    setWorkActive(true);setProgressTurn(value=>value+1);\n    setMessages((previous) => [\n      ...previous,\n      { author: 'You', text: message.text },\n      {\n        author: 'Helios demo',\n        text: 'The example source panel shows reusable Helios components and a runnable local preview. This reply is a fixture; no files were modified and no AI model was called.',\n      },\n    ]);\n    setTab('changes');\n  };\n  // Derive the initial responsive state without briefly opening a modal in an iframe.\n  const open=panelPreference??!narrow,setOpen=(value:boolean)=>setPanelPreference(value);\n  return (\n    <section ref={ref} className={`bt-ai-workspace ${open && !narrow ? '' : 'bt-panel-closed'} ${expanded?'bt-panel-expanded':''}`} style={{\"--panel-width\":`${panelWidth}px`} as React.CSSProperties}>\n      <h1 className=\"hu-sr-only\">Agentic chat</h1>\n      <div className=\"bt-ai-conversation\" inert={expanded}>\n        <SourceWorkspaceHeader compact={narrow} label=\"coding scenario\" panelOpen={open} onPanel={()=>setOpen(!open)} onNew={()=>{setMessages([]);setWorkActive(false);setSession(previous=>previous+1)}}/>\n        <div className=\"bt-message-log\" role=\"log\" aria-label=\"Coding conversation\">\n          {messages.map((message, index) => (\n            <article key={index} data-author={message.author === 'You' ? 'user' : 'assistant'}>\n              <strong>{message.author}</strong>\n              <p>{message.text}</p>\n            </article>\n          ))}\n          {messages.length>0&&<div className=\"bt-code-progress\"><AgentProgress key={progressTurn} presentation=\"source\" autoRun stepDuration={6000} onFinished={()=>setWorkActive(false)} steps={['Reading project files','Reviewing the theme tokens','Updating the interface','Checking reusable components','Preparing the local preview']}/>{workActive&&<NativeScope><NativeAgentThinking label=\"Thinking\" showTimer tone=\"subtle\" variant=\"infinity\"/></NativeScope>}<p className=\"hu-sr-only\">Illustrative local workflow. No files are changed by this animation.</p></div>}\n        </div>\n        <div className={`bt-template-composer ${attachments ? 'bt-attachments-open' : ''}`}>\n          <SourceComposer\n            loadingLight={workActive}\n            key={session}\n            showPanel\n            onSend={send}\n            placeholder=\"Ask me anything…\"\n          />\n        </div>\n      </div>\n      <ResponsiveTemplatePanel\n        open={open}\n        onOpenChange={setOpen}\n        narrow={narrow}\n        title=\"Code and interactive preview\"\n        className=\"bt-ai-panel\"\n      >\n        {!narrow&&<PanelResizeHandle onChange={setPanelWidth}/>}\n        <WorkspacePanelTools expanded={expanded} onExpand={()=>setExpanded(!expanded)} onTerminal={()=>setTerminal(!terminal)} onClose={()=>{setOpen(false);setExpanded(false)}}/>\n        <Tabs\n          label=\"Coding workspace panel\"\n          value={tab}\n          onValueChange={setTab}\n          items={[\n            {\n              id: 'changes',\n              label: 'Changes', icon: <RiLinksLine size={16}/>,\n              content: (\n                <>\n                  <div className=\"bt-code-summary\"><strong>12 example files</strong><span className=\"bt-code-counts\">+48 <i>−12</i></span></div>\n                  <div className=\"bt-source-diffs\">{['app/components/button.tsx','components/theme-toggle.tsx','styles/tokens.css','app/layout.tsx','components/input.tsx','components/button.tsx','components/dialog.tsx','components/select.tsx','components/tabs.tsx','components/checkbox.tsx','lib/utils.ts','index.ts'].map((file,index)=><details key={file} open={index===0}><summary><UIIcon name=\"chevron-right\"/><span>{file}</span><small>{index<3?'Example':'Reference'}</small><b>+{index<3?16:0}</b></summary><pre tabIndex={0} aria-label={`Bundled source for ${file}`}><code>{(index===0?codeExample:index===1?`import { useState } from 'react';\\nimport { Button } from '@helios-ui/react';\\n\\nexport function ThemeToggle() {\\n  const [dark, setDark] = useState(false);\\n  return <Button onClick={() => setDark(!dark)}>\\n    {dark ? 'Dark' : 'Light'}\\n  </Button>;\\n}`:index===2?`:root {\\n  --surface: #ffffff;\\n  --text: #121212;\\n  --accent: #2b7fff;\\n}\\n[data-theme=\"dark\"] {\\n  --surface: #262626;\\n  --text: #f7f7f7;\\n}`:`export { Button, Input, Select, Dialog } from '@helios-ui/react';`).split('\\n').map((line,lineIndex)=><span className=\"bt-code-line\" key={lineIndex}><i>{lineIndex+1}</i><span><CodeTokens line={line}/></span></span>)}</code></pre></details>)}</div>\n                  <Button\n                    variant=\"secondary\"\n                    size=\"sm\"\n                    onClick={async () => {\n                      try {\n                        await navigator.clipboard.writeText(codeExample);\n                        setNotice('Usable React example copied.');\n                      } catch {\n                        setNotice('Clipboard unavailable. Select the source to copy.');\n                      }\n                    }}\n                  >\n                    Copy React source\n                  </Button>\n                  <p className=\"bt-note\" role=\"status\">\n                    {notice}\n                  </p>\n                </>\n              ),\n            },\n            {\n              id: 'browser',\n              label: 'Browser', icon: <RiGlobalLine size={16}/>,\n              content: (\n                <div className=\"bt-code-browser\">\n                  <h2>Browser preview</h2>\n                  <details><summary>Open local React example</summary>\n                  <Select\n                    label=\"Button variant\"\n                    value={variant}\n                    options={['primary', 'secondary', 'tertiary', 'danger'].map((value) => ({\n                      value,\n                      label: value,\n                    }))}\n                    onChange={(event) => setVariant(event.target.value)}\n                  />\n                  <form\n                    onSubmit={(event) => {\n                      event.preventDefault();\n                      setNotice('Example form handled by React.');\n                    }}\n                  >\n                    <Input label=\"Project name\" defaultValue=\"Helios UI\" />\n                    <Button type=\"submit\" variant={variant as 'primary'}>\n                      Save example\n                    </Button>\n                  </form>\n                  <p role=\"status\">{notice}</p>\n                  <a href=\"/components/button\">Open Button documentation <UIIcon name=\"arrow-right\" /></a></details>\n                </div>\n              ),\n            },\n          ]}\n        />\n      </ResponsiveTemplatePanel>\n      <LocalTerminalDialog open={terminal} onOpenChange={setTerminal}/>\n    </section>\n  );\n}\nconst gallerySeed = ['green-ape', 'cloud-crown', 'cat-with-beer', 'hanok-bookshop', 'nairobi-vibes', 'ronin-red', 'bloom-swirl', 'hoopoes', 'girls-and-blooms', 'biker-rest', 'beach-kid', 'reader-pink', 'underwater-highway', 'perfume-still-life', 'yellow-cabs', 'goldfish-living-room', 'linen-campaign', 'helmet-portraits', 'racing-suit', 'massive-box'].map((id,index)=>({id,title:id.split('-').map(word=>word[0].toUpperCase()+word.slice(1)).join(' '),file:`boardui-reference/${id}.webp`,style:([6,12,15].includes(index)?'Abstract':index%3===0?'Illustration':'Photography')}));\nfunction ImageStudioContent({ assetsBase }: { assetsBase: string }) {\n  const { ref, narrow } = useNarrowTemplate(1000);\n  const [panelWidth,setPanelWidth]=useState(410),[expanded,setExpanded]=useState(false),[terminal,setTerminal]=useState(false);\n  const [messages, setMessages] = useState<{ author: string; text: string }[]>([\n      { author: 'You', text: 'Create a vintage editorial illustration of a footballer dribbling in a blue-and-white kit against a blue background.' },\n    ]),\n    [tab, setTab] = useState('gallery'),\n    [filter, setFilter] = useState('All'),\n    [ratio, setRatio] = useState('original'),\n    [selected, setSelected] = useState<(typeof gallerySeed)[number] | null>(null),\n    [notice, setNotice] = useState(''),\n    [panelPreference, setPanelPreference] = useState<boolean|null>(null),\n    [session, setSession] = useState(0);\n  const reduced = useReducedMotion();\n  const [results, setResults] = useState<{ id: string; prompt: string; image: typeof gallerySeed[number]; status: 'preparing' | 'ready' | 'cancelled' }[]>([{id:'seeded-footballer',prompt:'Bundled reference preview',image:{id:'footballer',title:'Footballer portrait',file:'boardui-reference/generated-footballer.jpg',style:'Photography'},status:'preparing'}]),\n    [running, setRunning] = useState<string | null>('seeded-footballer'),\n    [countdown, setCountdown] = useState(5);\n  useEffect(() => {\n    if (!running) return;\n    const timer = setTimeout(() => {\n      if (countdown > 1) setCountdown(value => value - 1);\n      else {\n        setResults(previous => previous.map(result => result.id === running ? { ...result, status: 'ready' } : result));\n        setRunning(null);\n        setNotice('Bundled artwork preview revealed. No image-generation service was called.');\n      }\n    }, 1000);\n    return () => clearTimeout(timer);\n  }, [running, countdown]);\n  const stopPreview = () => {\n    setResults(previous => previous.map(result => result.id === running ? { ...result, status: 'cancelled' } : result));\n    setRunning(null);\n    setNotice('Local artwork preview stopped. You can retry the same preview.');\n  };\n  const images = gallerySeed.filter((image) => filter === 'All' || image.style === filter);\n  // Derive the initial responsive state without briefly opening a modal in an iframe.\n  const open=panelPreference??!narrow,setOpen=(value:boolean)=>setPanelPreference(value);\n  return (\n    <section ref={ref} className={`bt-ai-workspace ${open && !narrow ? '' : 'bt-panel-closed'} ${expanded?'bt-panel-expanded':''}`} style={{\"--panel-width\":`${panelWidth}px`} as React.CSSProperties}>\n      <h1 className=\"hu-sr-only\">Image generation</h1>\n      <div className=\"bt-ai-conversation\" inert={expanded}>\n        <SourceWorkspaceHeader compact={narrow} label=\"image generation\" panelOpen={open} onPanel={()=>setOpen(!open)} onNew={()=>{setMessages([]);setResults([]);setRunning(null);setSession(previous=>previous+1)}}/>\n        <div className=\"bt-message-log\" role=\"log\" aria-label=\"Image studio conversation\">\n          {messages.map((message, index) => (\n            <article key={index} data-author={message.author === 'You' ? 'user' : 'assistant'}>\n              <strong>{message.author}</strong>\n              <p>{message.text}</p>\n            </article>\n          ))}\n          {results.map(result => <article key={result.id} className=\"bt-image-result\" data-result-state={result.status} aria-busy={result.status === 'preparing'}>\n            <strong>Bundled image preview</strong>\n            <p>{result.prompt}</p>\n            {result.status === 'preparing' ? <div className=\"bt-image-countdown\" role=\"status\"><span className=\"bt-image-ripple\" aria-hidden=\"true\" /><strong>{countdown}s</strong><span>Revealing a bundled reference asset. No live generation is running.</span></div> : result.status === 'cancelled' ? <div><p>Preview stopped. Your prompt is preserved.</p><Button variant=\"secondary\" size=\"sm\" onClick={() => { setCountdown(3); setResults(previous => previous.map(item => item.id === result.id ? { ...item, status: 'preparing' } : item)); setRunning(result.id); }}>Retry local preview</Button></div> : <>\n              <motion.img src={asset(assetsBase, result.image.file)} alt={result.image.title + ' — bundled local reference'} initial={reduced !== false ? false : { opacity: 0, filter: 'blur(18px)', clipPath: 'circle(0% at 50% 50%)' }} animate={{ opacity: 1, filter: 'blur(0px)', clipPath: 'circle(75% at 50% 50%)' }} transition={{ duration: reduced !== false ? 0 : 0.7 }} />\n              <div className=\"bt-message-actions\"><Button variant=\"tertiary\" size=\"sm\" leadingIcon={<UIIcon name=\"copy\"/>} aria-label=\"Copy preview prompt\" onClick={async () => { try { await navigator.clipboard.writeText(result.prompt); setNotice('Preview prompt copied.'); } catch { setNotice('Clipboard unavailable. Select the visible prompt text to copy it.'); } }}>Copy prompt</Button><a className=\"hu-button hu-secondary hu-sm\" href={asset(assetsBase, result.image.file)} download aria-label=\"Download preview asset\"><UIIcon name=\"download\"/>Download preview asset</a><Button variant=\"tertiary\" size=\"sm\" leadingIcon={<RiExpandDiagonalLine size={16}/>} aria-label=\"Open image preview\" onClick={() => setSelected(result.image)}>Open preview</Button></div>\n              <p className=\"bt-note\">Curated Helios artwork, not generated from this prompt.</p>\n            </>}\n          </article>)}\n        </div>\n        <div className=\"bt-template-composer\">\n          <SourceComposer\n            loadingLight={running!==null}\n            key={session}\n            showPanel\n            placeholder=\"Describe your image idea…\"\n            working={running !== null}\n            onStop={stopPreview}\n            onSend={(message) => {\n              const id = crypto.randomUUID();\n              const image = images[0] || gallerySeed[0];\n              setMessages(previous => [...previous, { author: 'You', text: message.text }]);\n              setResults(previous => [...previous, { id, prompt: message.text, image, status: 'preparing' }]);\n              setCountdown(3);\n              setRunning(id);\n              setNotice('Preparing a local reference preview. No image-generation service is connected.');\n            }}\n          />\n        </div>\n      </div>\n      <ResponsiveTemplatePanel\n        open={open}\n        onOpenChange={setOpen}\n        narrow={narrow}\n        title=\"Image reference gallery\"\n        className=\"bt-ai-panel\"\n      >\n        {!narrow&&<PanelResizeHandle onChange={setPanelWidth}/>}\n        <WorkspacePanelTools expanded={expanded} onExpand={()=>setExpanded(!expanded)} onTerminal={()=>setTerminal(!terminal)} onClose={()=>{setOpen(false);setExpanded(false)}}/>\n        <Tabs\n          label=\"Image studio panel\"\n          value={tab}\n          onValueChange={setTab}\n          items={[\n            {\n              id: 'gallery',\n              label: 'Gallery', icon: <RiGalleryLine size={16}/>,\n              content: (\n                <>\n                  <Select\n                    label=\"Gallery style\"\n                    size=\"sm\"\n                    value={filter}\n                    options={['All', 'Illustration', 'Photography', 'Abstract'].map((value) => ({\n                      value,\n                      label: value === 'All' ? 'All styles' : value,\n                    }))}\n                    onChange={(event) => setFilter(event.target.value)}\n                  />\n                  <div className={`bt-image-gallery bt-ratio-${ratio}`}>\n                    {[0,1,2].map(column=><div className=\"bt-gallery-column\" key={column}>{[...(column===0?results.filter(result=>result.status==='ready').map(result=>result.image):[]),...images.slice(column*7,(column+1)*7)].map((image) => (\n                      <article key={image.id} className=\"bt-image-gallery-item\">\n                        <button type=\"button\" onClick={() => setSelected(image)} aria-label={`Open ${image.title}`}>\n                          <img src={asset(assetsBase, image.file)} alt={image.title} />\n                          <span>{image.title}</span>\n                        </button>\n                        <div className=\"bt-image-tile-actions\">\n                          <a className=\"hu-button hu-secondary hu-sm hu-icon-only\" href={asset(assetsBase, image.file)} download aria-label={`Download ${image.title}`}><UIIcon name=\"download\" /></a>\n                          <DropdownMenu label={`More actions for ${image.title}`} size=\"sm\" items={[{ id: 'open', label: 'Open preview' }, { id: 'copy', label: 'Copy local asset path' }]} onAction={async action => {\n                            if (action === 'open') setSelected(image);\n                            else { try { await navigator.clipboard.writeText(asset(assetsBase, image.file)); setNotice('Local asset path copied.'); } catch { setNotice('Clipboard unavailable. Open the preview to use its download link.'); } }\n                          }} />\n                        </div>\n                      </article>\n                    ))}</div>)}\n                  </div>\n                  <p className=\"bt-note\" role=\"status\">\n                    {notice || 'Curated local reference assets, not live generated images.'}\n                  </p>\n                </>\n              ),\n            },\n            {\n              id: 'styles',\n              label: 'Styles', icon: <RiMagicLine size={16}/>,\n              content: (\n                <div className=\"bt-dialog-fields bt-style-placeholder\">\n                  <h2>Style presets</h2><details><summary>Local preview settings</summary>\n                  <Select\n                    label=\"Preferred visual style\"\n                    value={filter}\n                    options={['All', 'Illustration', 'Photography', 'Abstract'].map((value) => ({\n                      value,\n                      label: value,\n                    }))}\n                    onChange={(event) => setFilter(event.target.value)}\n                  />\n                  <Select\n                    label=\"Gallery crop\"\n                    value={ratio}\n                    options={[\n                      { value: 'original', label: 'Original aspect ratio' },\n                      { value: 'square', label: 'Square preview' },\n                      { value: 'portrait', label: 'Portrait preview' },\n                    ]}\n                    onChange={(event) => setRatio(event.target.value)}\n                  />\n                  <Button\n                    onClick={() => {\n                      setTab('gallery');\n                      setNotice('Local gallery preferences applied.');\n                    }}\n                  >\n                    Apply preview settings\n                  </Button></details>\n                </div>\n              ),\n            },\n          ]}\n        />\n      </ResponsiveTemplatePanel>\n      <Dialog\n        open={selected !== null}\n        onOpenChange={(value) => {\n          if (!value) setSelected(null);\n        }}\n        title={selected?.title || 'Reference image'}\n        description=\"A local reference asset used by Helios UI.\"\n        footer={\n          <>\n            <Button variant=\"secondary\" onClick={() => setSelected(null)}>\n              Close\n            </Button>\n            {selected && (\n              <a className=\"hu-button hu-primary\" href={asset(assetsBase, selected.file)} download>\n                Download asset\n              </a>\n            )}\n          </>\n        }\n      >\n        {selected && (\n          <img\n            className=\"bt-image-detail\"\n            src={asset(assetsBase, selected.file)}\n            alt={selected.title}\n          />\n        )}\n      </Dialog>\n      <LocalTerminalDialog open={terminal} onOpenChange={setTerminal}/>\n    </section>\n  );\n}\nconst templateSecurityAgent: import('./AgentPatterns.js').AgentProfile = {\n  ...defaultAgent,\n  name: 'Security agent', label: 'Security',\n  description: 'A careful second pair of eyes for permissions, privacy and operational boundaries.',\n  shape: 'shield', expression: 'focused', color: '#b3e4e5',\n};\n// Provider artwork observed in the public BoardUI marketplace; see research/template-fidelity-2026-10-26/marketplace-artwork-provenance.json.\nconst marketplaceLogoData:Record<string,{svg:string;invert:boolean}>={\"Notion\":{\"svg\":\"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" aria-hidden=\\\"true\\\" viewBox=\\\"0 0 256 268\\\" class=\\\"h-[60%] w-[60%]\\\"><path fill=\\\"#fff\\\" d=\\\"M16.092 11.538L164.09.608c18.179-1.56 22.85-.508 34.28 7.801l47.243 33.282C253.406 47.414 256 48.975 256 55.207v182.527c0 11.439-4.155 18.205-18.696 19.24L65.44 267.378c-10.913.517-16.11-1.043-21.825-8.327L8.826 213.814C2.586 205.487 0 199.254 0 191.97V29.726c0-9.352 4.155-17.153 16.092-18.188\\\"></path><path d=\\\"M164.09.608L16.092 11.538C4.155 12.573 0 20.374 0 29.726v162.245c0 7.284 2.585 13.516 8.826 21.843l34.789 45.237c5.715 7.284 10.912 8.844 21.825 8.327l171.864-10.404c14.532-1.035 18.696-7.801 18.696-19.24V55.207c0-5.911-2.336-7.614-9.21-12.66l-1.185-.856L198.37 8.409C186.94.1 182.27-.952 164.09.608M69.327 52.22c-14.033.945-17.216 1.159-25.186-5.323L23.876 30.778c-2.06-2.086-1.026-4.69 4.163-5.207l142.274-10.395c11.947-1.043 18.17 3.12 22.842 6.758l24.401 17.68c1.043.525 3.638 3.637.517 3.637L71.146 52.095zm-16.36 183.954V81.222c0-6.767 2.077-9.887 8.3-10.413L230.02 60.93c5.724-.517 8.31 3.12 8.31 9.879v153.917c0 6.767-1.044 12.49-10.387 13.008l-161.487 9.361c-9.343.517-13.489-2.594-13.489-10.921M212.377 89.53c1.034 4.681 0 9.362-4.681 9.897l-7.783 1.542v114.404c-6.758 3.637-12.981 5.715-18.18 5.715c-8.308 0-10.386-2.604-16.609-10.396l-50.898-80.079v77.476l16.1 3.646s0 9.362-12.989 9.362l-35.814 2.077c-1.043-2.086 0-7.284 3.63-8.318l9.351-2.595V109.823l-12.98-1.052c-1.044-4.68 1.55-11.439 8.826-11.965l38.426-2.585l52.958 81.113v-71.76l-13.498-1.552c-1.043-5.733 3.111-9.896 8.3-10.404z\\\"></path></svg>\",\"invert\":false},\"Figma\":{\"svg\":\"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" aria-hidden=\\\"true\\\" viewBox=\\\"0 0 256 384\\\" class=\\\"h-[60%] w-[60%]\\\"><path fill=\\\"#0acf83\\\" d=\\\"M64 384c35.328 0 64-28.672 64-64v-64H64c-35.328 0-64 28.672-64 64s28.672 64 64 64\\\"></path><path fill=\\\"#a259ff\\\" d=\\\"M0 192c0-35.328 28.672-64 64-64h64v128H64c-35.328 0-64-28.672-64-64\\\"></path><path fill=\\\"#f24e1e\\\" d=\\\"M0 64C0 28.672 28.672 0 64 0h64v128H64C28.672 128 0 99.328 0 64\\\"></path><path fill=\\\"#ff7262\\\" d=\\\"M128 0h64c35.328 0 64 28.672 64 64s-28.672 64-64 64h-64z\\\"></path><path fill=\\\"#1abcfe\\\" d=\\\"M256 192c0 35.328-28.672 64-64 64s-64-28.672-64-64s28.672-64 64-64s64 28.672 64 64\\\"></path></svg>\",\"invert\":false},\"Linear\":{\"svg\":\"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" aria-hidden=\\\"true\\\" viewBox=\\\"0 0 256 255.999966\\\" class=\\\"h-[60%] w-[60%] dark:invert\\\">\\n    <title>Linear</title>\\n    <g>\\n        <path d=\\\"M8.17351507,102.61269 L153.38731,247.826434 C155.506492,249.945871 154.484163,253.546047 151.537796,254.096394 C146.624112,255.014493 141.611832,255.651912 136.517857,255.991749 C135.430224,256.064224 134.367944,255.654216 133.5971,254.883372 L1.11657404,122.4029 C0.345783548,121.632056 -0.0643290124,120.569776 0.0082341699,119.482143 C0.348078154,114.388168 0.985591977,109.375888 1.9035369,104.462204 C2.45395044,101.515837 6.05412868,100.493508 8.17351507,102.61269 Z M4.08163806,161.409157 C3.11270474,157.795152 7.38226007,155.515399 10.0279718,158.161111 L97.8388892,245.972054 C100.484601,248.617766 98.2048481,252.887372 94.5908433,251.918311 C50.5602697,240.113381 15.8867212,205.43973 4.08163806,161.409157 Z M16.8085843,64.1644626 C18.0417047,62.028635 20.9559826,61.7013463 22.6999089,63.4453494 L192.554651,233.299989 C194.298654,235.043992 193.971621,237.958347 191.835537,239.191441 C188.24202,241.266062 184.538382,243.171405 180.73538,244.896457 C179.304068,245.545401 177.625881,245.218112 176.514687,244.106918 L11.8930308,79.4853127 C10.7818114,78.3741189 10.4544971,76.695932 11.1036452,75.2646202 C12.828595,71.4616177 14.7338864,67.7579799 16.8085843,64.1644626 Z M127.860072,0 C198.629979,0 256,57.3702771 256,128.139928 C256,165.709238 239.831733,199.502437 214.07401,222.940712 C212.587126,224.293659 210.305837,224.204026 208.884257,222.782702 L33.2172979,47.1157434 C31.7959738,45.6941631 31.7063407,43.4128738 33.0592877,41.9259895 C56.4975633,16.1681897 90.2907616,0 127.860072,0 Z\\\" fill=\\\"#222326\\\"></path>\\n    </g>\\n</svg>\",\"invert\":true},\"Appwrite\":{\"svg\":\"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" aria-hidden=\\\"true\\\" viewBox=\\\"0 0 256 171\\\" class=\\\"h-[60%] w-[60%]\\\">\\n    <title>Appwrite</title>\\n    <g>\\n        <path d=\\\"M128.018861,11.4976205 C140.57991,4.20943701 155.173787,0.0362230359 170.742783,0.0362230359 C217.829688,0.0362230359 256,38.206535 256,85.2934403 C256,132.380346 217.829688,170.550658 170.742783,170.550658 C155.179965,170.550658 140.591368,166.380836 128.0331,159.097776 C99.2684359,175.733361 62.1434132,174.623064 33.9508568,153.348374 C9.61305016,135.009282 -3.08589011,105.074565 0.641534125,74.8296075 C4.36895836,44.5846499 23.9559075,18.6288844 52.0181053,6.74762994 C76.8681001,-3.7736098 105.017682,-1.8412185 128.018861,11.4976205 Z M29.8152259,43.4190301 C6.68862775,74.0656663 12.7848231,117.657486 43.4314593,140.784084 C74.0780955,163.910682 117.669915,157.814487 140.796513,127.16785 C156.288306,106.638616 158.667113,80.3005602 149.337382,58.1964063 C142.483862,42.0628925 129.709538,29.0520757 113.741119,21.8909269 L113.777489,21.857143 C84.8408261,8.83821324 49.7358247,17.0208829 29.8152259,43.4190301 Z M91.355197,55.446856 C93.9640678,55.446856 94.8192633,55.5963841 94.6684236,56.0475915 C94.5946532,56.2180264 94.3796632,57.0131582 94.092073,58.1647871 L93.9809576,58.612835 C93.6953314,59.7721124 93.3534354,61.215252 93.0118103,62.7212641 C92.4587314,65.1509636 91.2595282,70.2251176 90.0256204,75.4308007 L89.8010273,76.3781785 C89.4265216,77.9576923 89.0522319,79.535299 88.6951718,81.0410726 C87.0897128,87.8157423 85.0815774,96.4490193 84.1765393,100.212142 L84.1765393,100.212142 L82.6222346,107.140274 L79.1581683,107.140274 C77.2523416,107.140274 75.6954136,106.936969 75.6954136,106.687755 C75.6954136,105.784029 77.2011873,98.9582048 79.712996,88.5699407 C81.015464,82.8983683 83.3239671,73.3128338 84.7812097,67.2398966 C85.5639113,63.8530663 86.3156087,60.7628157 86.8451929,58.6480367 L86.9515301,58.2246377 C87.312179,56.7930154 87.549446,55.8974581 87.5907629,55.7957548 C87.6891366,55.5963841 89.3969043,55.446856 91.355197,55.446856 Z M69.4729484,72.5087927 C71.7814515,72.5087927 73.6885899,72.6596324 73.6885899,72.8603147 C73.6885899,73.1108398 71.8811369,75.2212838 69.6736308,77.679315 C67.464813,80.0888151 65.65736,82.3461639 65.65736,82.6976859 C65.65736,82.9980537 67.6143411,85.4088655 69.9753102,87.9154276 L69.9753102,87.9154276 L74.290637,92.5835882 L65.1563099,92.5835882 L61.9440803,89.1719879 C60.1877816,87.3146922 58.1271803,85.0547201 57.3769168,84.1523052 L57.3769168,84.1523052 L56.0206712,82.5468463 L60.6376774,77.5271636 L65.3071496,72.5087927 Z M104.555637,72.5087927 L109.070335,77.3789472 C111.580832,80.0376608 113.587656,82.3973182 113.587656,82.6465316 C113.587656,82.9468994 111.681829,85.2593374 109.32086,87.8668966 L109.32086,87.8668966 L105.056688,92.5337455 L100.388527,92.5835882 L95.7229898,92.5835882 L99.8874769,88.0164247 C102.194668,85.5570818 104.103118,83.2000477 104.202804,82.847214 C104.353643,82.1966358 101.593933,78.8820976 97.6760359,74.9681355 C96.624093,73.9135693 95.7702092,72.9613117 95.7702092,72.8091604 C95.7702092,72.6596324 97.7271902,72.5087927 100.186533,72.5087927 L100.186533,72.5087927 L104.555637,72.5087927 Z\\\" fill=\\\"#F02E65\\\"></path>\\n    </g>\\n</svg>\",\"invert\":false},\"Gmail\":{\"svg\":\"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" aria-hidden=\\\"true\\\" viewBox=\\\"0 0 256 193\\\" class=\\\"h-[60%] w-[60%]\\\">\\n    <g>\\n        <path d=\\\"M58.1818182,192.049515 L58.1818182,93.1404244 L27.5066233,65.0770089 L0,49.5040608 L0,174.59497 C0,184.253152 7.82545455,192.049515 17.4545455,192.049515 L58.1818182,192.049515 Z\\\" fill=\\\"#4285F4\\\"></path>\\n        <path d=\\\"M197.818182,192.049515 L238.545455,192.049515 C248.203636,192.049515 256,184.224061 256,174.59497 L256,49.5040608 L224.844415,67.3422767 L197.818182,93.1404244 L197.818182,192.049515 Z\\\" fill=\\\"#34A853\\\"></path>\\n        <polygon fill=\\\"#EA4335\\\" points=\\\"58.1818182 93.1404244 54.0077618 54.4932827 58.1818182 17.5040608 128 69.8676972 197.818182 17.5040608 202.487488 52.4960089 197.818182 93.1404244 128 145.504061\\\"></polygon>\\n        <path d=\\\"M197.818182,17.5040608 L197.818182,93.1404244 L256,49.5040608 L256,26.2313335 C256,4.64587897 231.36,-7.65957557 214.109091,5.28587897 L197.818182,17.5040608 Z\\\" fill=\\\"#FBBC04\\\"></path>\\n        <path d=\\\"M0,49.5040608 L26.7588051,69.5731646 L58.1818182,93.1404244 L58.1818182,17.5040608 L41.8909091,5.28587897 C24.6109091,-7.65957557 0,4.64587897 0,26.2313335 L0,49.5040608 Z\\\" fill=\\\"#C5221F\\\"></path>\\n    </g>\\n</svg>\",\"invert\":false},\"Google Calendar\":{\"svg\":\"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" aria-hidden=\\\"true\\\" viewBox=\\\"0 0 256 256\\\" class=\\\"h-[60%] w-[60%]\\\">\\n    <g>\\n        <polygon fill=\\\"#FFFFFF\\\" points=\\\"195.368421 60.6315789 60.6315789 60.6315789 60.6315789 195.368421 195.368421 195.368421\\\"></polygon>\\n        <polygon fill=\\\"#EA4335\\\" points=\\\"195.368421 256 256 195.368421 225.684211 190.196005 195.368421 195.368421 189.835162 223.098002\\\"></polygon>\\n        <path d=\\\"M1.42108547e-14,195.368421 L1.42108547e-14,235.789474 C1.42108547e-14,246.955789 9.04421053,256 20.2105263,256 L60.6315789,256 L66.8568645,225.684211 L60.6315789,195.368421 L27.5991874,190.196005 L1.42108547e-14,195.368421 Z\\\" fill=\\\"#188038\\\"></path>\\n        <path d=\\\"M256,60.6315789 L256,20.2105263 C256,9.04421053 246.955789,1.42108547e-14 235.789474,1.42108547e-14 L195.368421,1.42108547e-14 C191.679582,15.0358547 189.835162,26.1010948 189.835162,33.1957202 C189.835162,40.2903456 191.679582,49.4356319 195.368421,60.6315789 C208.777986,64.4714866 218.883249,66.3914404 225.684211,66.3914404 C232.485172,66.3914404 242.590435,64.4714866 256,60.6315789 Z\\\" fill=\\\"#1967D2\\\"></path>\\n        <polygon fill=\\\"#FBBC04\\\" points=\\\"256 60.6315789 195.368421 60.6315789 195.368421 195.368421 256 195.368421\\\"></polygon>\\n        <polygon fill=\\\"#34A853\\\" points=\\\"195.368421 195.368421 60.6315789 195.368421 60.6315789 256 195.368421 256\\\"></polygon>\\n        <path d=\\\"M195.368421,0 L20.2105263,0 C9.04421053,0 0,9.04421053 0,20.2105263 L0,195.368421 L60.6315789,195.368421 L60.6315789,60.6315789 L195.368421,60.6315789 L195.368421,0 Z\\\" fill=\\\"#4285F4\\\"></path>\\n        <path d=\\\"M88.2694737,165.153684 C83.2336842,161.751579 79.7473684,156.783158 77.8442105,150.214737 L89.5326316,145.397895 C90.5936842,149.44 92.4463158,152.572632 95.0905263,154.795789 C97.7178947,157.018947 100.917895,158.113684 104.656842,158.113684 C108.48,158.113684 111.764211,156.951579 114.509474,154.627368 C117.254737,152.303158 118.635789,149.338947 118.635789,145.751579 C118.635789,142.08 117.187368,139.082105 114.290526,136.757895 C111.393684,134.433684 107.755789,133.271579 103.410526,133.271579 L96.6568421,133.271579 L96.6568421,121.701053 L102.72,121.701053 C106.458947,121.701053 109.608421,120.690526 112.168421,118.669474 C114.728421,116.648421 116.008421,113.886316 116.008421,110.366316 C116.008421,107.233684 114.863158,104.741053 112.572632,102.871579 C110.282105,101.002105 107.385263,100.058947 103.865263,100.058947 C100.429474,100.058947 97.7010526,100.968421 95.68,102.804211 C93.6602819,104.644885 92.1418208,106.968942 91.2673684,109.557895 L79.6968421,104.741053 C81.2294737,100.395789 84.0421053,96.5557895 88.1684211,93.2378947 C92.2947368,89.92 97.5663158,88.2526316 103.966316,88.2526316 C108.698947,88.2526316 112.96,89.1621053 116.732632,90.9978947 C120.505263,92.8336842 123.469474,95.3768421 125.608421,98.6105263 C127.747368,101.861053 128.808421,105.498947 128.808421,109.541053 C128.808421,113.667368 127.814737,117.153684 125.827368,120.016842 C123.84,122.88 121.397895,125.069474 118.501053,126.602105 L118.501053,127.292632 C122.241568,128.834789 125.490747,131.367752 127.898947,134.618947 C130.341053,137.903158 131.570526,141.827368 131.570526,146.408421 C131.570526,150.989474 130.408421,155.082105 128.084211,158.669474 C125.76,162.256842 122.543158,165.086316 118.467368,167.141053 C114.374737,169.195789 109.776842,170.240124 104.673684,170.240124 C98.7621053,170.256842 93.3052632,168.555789 88.2694737,165.153684 L88.2694737,165.153684 Z M160.067368,107.149474 L147.233684,116.429474 L140.816842,106.694737 L163.84,90.0884211 L172.665263,90.0884211 L172.665263,168.421053 L160.067368,168.421053 L160.067368,107.149474 Z\\\" fill=\\\"#4285F4\\\"></path>\\n    </g>\\n</svg>\",\"invert\":false},\"Google Drive\":{\"svg\":\"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" aria-hidden=\\\"true\\\" viewBox=\\\"0 0 256 229\\\" class=\\\"h-[60%] w-[60%]\\\">\\n    <g>\\n        <path d=\\\"M19.3542312,196.033928 L30.644172,215.534816 C32.9900287,219.64014 36.3622164,222.86588 40.3210929,225.211737 C51.6602421,210.818376 59.5534225,199.772864 64.000634,192.075201 C68.5137119,184.263529 74.0609657,172.045039 80.6423954,155.41973 C62.9064315,153.085282 49.4659974,151.918058 40.3210929,151.918058 C31.545465,151.918058 18.1051007,153.085282 0,155.41973 C0,159.964996 1.17298825,164.510261 3.51893479,168.615586 L19.3542312,196.033928 Z\\\" fill=\\\"#0066DA\\\"></path>\\n        <path d=\\\"M215.681443,225.211737 C219.64032,222.86588 223.012507,219.64014 225.358364,215.534816 L230.050377,207.470615 L252.483511,168.615586 C254.829368,164.510261 256.002446,159.964996 256.002446,155.41973 C237.79254,153.085282 224.376613,151.918058 215.754667,151.918058 C206.488712,151.918058 193.072785,153.085282 175.506888,155.41973 C182.010479,172.136093 187.484394,184.354584 191.928633,192.075201 C196.412073,199.863919 204.329677,210.909431 215.681443,225.211737 Z\\\" fill=\\\"#EA4335\\\"></path>\\n        <path d=\\\"M128.001268,73.3111515 C141.121182,57.4655263 150.162898,45.2470011 155.126415,36.6555757 C159.123121,29.7376196 163.521739,18.6920726 168.322271,3.51893479 C164.363395,1.1729583 159.818129,0 155.126415,0 L100.876121,0 C96.1841079,0 91.638842,1.31958557 87.6799655,3.51893479 C93.7861943,20.9210065 98.9675428,33.3058067 103.224011,40.6733354 C107.927832,48.8151881 116.186918,59.6944602 128.001268,73.3111515 Z\\\" fill=\\\"#00832D\\\"></path>\\n        <path d=\\\"M175.360141,155.41973 L80.6420959,155.41973 L40.3210929,225.211737 C44.2799694,227.557893 48.8252352,228.730672 53.5172481,228.730672 L202.485288,228.730672 C207.177301,228.730672 211.722567,227.411146 215.681443,225.211737 L175.360141,155.41973 Z\\\" fill=\\\"#2684FC\\\"></path>\\n        <path d=\\\"M128.001268,73.3111515 L87.680265,3.51893479 C83.7213885,5.86488134 80.3489013,9.09044179 78.0030446,13.1960654 L3.51893479,142.223575 C1.17298825,146.329198 0,150.874464 0,155.41973 L80.6423954,155.41973 L128.001268,73.3111515 Z\\\" fill=\\\"#00AC47\\\"></path>\\n        <path d=\\\"M215.241501,77.7099697 L177.999492,13.1960654 C175.653635,9.09044179 172.281148,5.86488134 168.322271,3.51893479 L128.001268,73.3111515 L175.360141,155.41973 L255.855999,155.41973 C255.855999,150.874464 254.682921,146.329198 252.337064,142.223575 L215.241501,77.7099697 Z\\\" fill=\\\"#FFBA00\\\"></path>\\n    </g>\\n</svg>\",\"invert\":false},\"Slack\":{\"svg\":\"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" aria-hidden=\\\"true\\\" viewBox=\\\"0 0 256 256\\\" class=\\\"h-[60%] w-[60%]\\\"><path fill=\\\"#e01e5a\\\" d=\\\"M53.841 161.32c0 14.832-11.987 26.82-26.819 26.82S.203 176.152.203 161.32c0-14.831 11.987-26.818 26.82-26.818H53.84zm13.41 0c0-14.831 11.987-26.818 26.819-26.818s26.819 11.987 26.819 26.819v67.047c0 14.832-11.987 26.82-26.82 26.82c-14.83 0-26.818-11.988-26.818-26.82z\\\"></path><path fill=\\\"#36c5f0\\\" d=\\\"M94.07 53.638c-14.832 0-26.82-11.987-26.82-26.819S79.239 0 94.07 0s26.819 11.987 26.819 26.819v26.82zm0 13.613c14.832 0 26.819 11.987 26.819 26.819s-11.987 26.819-26.82 26.819H26.82C11.987 120.889 0 108.902 0 94.069c0-14.83 11.987-26.818 26.819-26.818z\\\"></path><path fill=\\\"#2eb67d\\\" d=\\\"M201.55 94.07c0-14.832 11.987-26.82 26.818-26.82s26.82 11.988 26.82 26.82s-11.988 26.819-26.82 26.819H201.55zm-13.41 0c0 14.832-11.988 26.819-26.82 26.819c-14.831 0-26.818-11.987-26.818-26.82V26.82C134.502 11.987 146.489 0 161.32 0s26.819 11.987 26.819 26.819z\\\"></path><path fill=\\\"#ecb22e\\\" d=\\\"M161.32 201.55c14.832 0 26.82 11.987 26.82 26.818s-11.988 26.82-26.82 26.82c-14.831 0-26.818-11.988-26.818-26.82V201.55zm0-13.41c-14.831 0-26.818-11.988-26.818-26.82c0-14.831 11.987-26.818 26.819-26.818h67.25c14.832 0 26.82 11.987 26.82 26.819s-11.988 26.819-26.82 26.819z\\\"></path></svg>\",\"invert\":false},\"GitHub\":{\"svg\":\"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" aria-hidden=\\\"true\\\" viewBox=\\\"0 0 256 250\\\" class=\\\"h-[60%] w-[60%] dark:invert\\\"><path fill=\\\"#161614\\\" d=\\\"M128.001 0C57.317 0 0 57.307 0 128.001c0 56.554 36.676 104.535 87.535 121.46c6.397 1.185 8.746-2.777 8.746-6.158c0-3.052-.12-13.135-.174-23.83c-35.61 7.742-43.124-15.103-43.124-15.103c-5.823-14.795-14.213-18.73-14.213-18.73c-11.613-7.944.876-7.78.876-7.78c12.853.902 19.621 13.19 19.621 13.19c11.417 19.568 29.945 13.911 37.249 10.64c1.149-8.272 4.466-13.92 8.127-17.116c-28.431-3.236-58.318-14.212-58.318-63.258c0-13.975 5-25.394 13.188-34.358c-1.329-3.224-5.71-16.242 1.24-33.874c0 0 10.749-3.44 35.21 13.121c10.21-2.836 21.16-4.258 32.038-4.307c10.878.049 21.837 1.47 32.066 4.307c24.431-16.56 35.165-13.12 35.165-13.12c6.967 17.63 2.584 30.65 1.255 33.873c8.207 8.964 13.173 20.383 13.173 34.358c0 49.163-29.944 59.988-58.447 63.157c4.591 3.972 8.682 11.762 8.682 23.704c0 17.126-.148 30.91-.148 35.126c0 3.407 2.304 7.398 8.792 6.14C219.37 232.5 256 184.537 256 128.002C256 57.307 198.691 0 128.001 0m-80.06 182.34c-.282.636-1.283.827-2.194.39c-.929-.417-1.45-1.284-1.15-1.922c.276-.655 1.279-.838 2.205-.399c.93.418 1.46 1.293 1.139 1.931m6.296 5.618c-.61.566-1.804.303-2.614-.591c-.837-.892-.994-2.086-.375-2.66c.63-.566 1.787-.301 2.626.591c.838.903 1 2.088.363 2.66m4.32 7.188c-.785.545-2.067.034-2.86-1.104c-.784-1.138-.784-2.503.017-3.05c.795-.547 2.058-.055 2.861 1.075c.782 1.157.782 2.522-.019 3.08m7.304 8.325c-.701.774-2.196.566-3.29-.49c-1.119-1.032-1.43-2.496-.726-3.27c.71-.776 2.213-.558 3.315.49c1.11 1.03 1.45 2.505.701 3.27m9.442 2.81c-.31 1.003-1.75 1.459-3.199 1.033c-1.448-.439-2.395-1.613-2.103-2.626c.301-1.01 1.747-1.484 3.207-1.028c1.446.436 2.396 1.602 2.095 2.622m10.744 1.193c.036 1.055-1.193 1.93-2.715 1.95c-1.53.034-2.769-.82-2.786-1.86c0-1.065 1.202-1.932 2.733-1.958c1.522-.03 2.768.818 2.768 1.868m10.555-.405c.182 1.03-.875 2.088-2.387 2.37c-1.485.271-2.861-.365-3.05-1.386c-.184-1.056.893-2.114 2.376-2.387c1.514-.263 2.868.356 3.061 1.403\\\"></path></svg>\",\"invert\":true},\"Amazon Location Service\":{\"svg\":\"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" aria-hidden=\\\"true\\\" viewBox=\\\"0 0 256 153\\\" class=\\\"h-[60%] w-[60%] dark:[&amp;_path:first-child]:fill-text-primary\\\">\\n\\t\\t<g>\\n\\t\\t\\t\\t<path d=\\\"M72.392053,55.4384106 C72.392053,58.5748344 72.7311258,61.1178808 73.3245033,62.9827815 C74.002649,64.8476821 74.8503311,66.8821192 76.0370861,69.0860927 C76.4609272,69.7642384 76.6304636,70.4423841 76.6304636,71.0357616 C76.6304636,71.8834437 76.1218543,72.7311258 75.0198675,73.5788079 L69.6794702,77.1390728 C68.9165563,77.6476821 68.1536424,77.9019868 67.4754967,77.9019868 C66.6278146,77.9019868 65.7801325,77.4781457 64.9324503,76.7152318 C63.7456954,75.4437086 62.7284768,74.0874172 61.8807947,72.7311258 C61.0331126,71.2900662 60.1854305,69.6794702 59.2529801,67.7298013 C52.6410596,75.5284768 44.3337748,79.4278146 34.3311258,79.4278146 C27.210596,79.4278146 21.5311258,77.3933775 17.3774834,73.3245033 C13.2238411,69.2556291 11.1046358,63.8304636 11.1046358,57.0490066 C11.1046358,49.8437086 13.6476821,43.994702 18.818543,39.586755 C23.989404,35.1788079 30.8556291,32.9748344 39.586755,32.9748344 C42.4688742,32.9748344 45.4357616,33.2291391 48.5721854,33.6529801 C51.7086093,34.0768212 54.9298013,34.7549669 58.3205298,35.5178808 L58.3205298,29.3298013 C58.3205298,22.8874172 56.9642384,18.394702 54.3364238,15.7668874 C51.6238411,13.1390728 47.0463576,11.8675497 40.5192053,11.8675497 C37.5523179,11.8675497 34.5006623,12.2066225 31.3642384,12.9695364 C28.2278146,13.7324503 25.1761589,14.6649007 22.2092715,15.8516556 C20.8529801,16.4450331 19.8357616,16.784106 19.2423841,16.9536424 C18.6490066,17.1231788 18.2251656,17.207947 17.8860927,17.207947 C16.6993377,17.207947 16.1059603,16.3602649 16.1059603,14.5801325 L16.1059603,10.4264901 C16.1059603,9.07019868 16.2754967,8.05298013 16.6993377,7.45960265 C17.1231788,6.86622517 17.8860927,6.27284768 19.0728477,5.6794702 C22.0397351,4.15364238 25.6,2.88211921 29.7536424,1.86490066 C33.9072848,0.762913907 38.3152318,0.254304636 42.9774834,0.254304636 C53.0649007,0.254304636 60.4397351,2.54304636 65.186755,7.1205298 C69.8490066,11.6980132 72.2225166,18.6490066 72.2225166,27.9735099 L72.2225166,55.4384106 L72.392053,55.4384106 Z M37.9761589,68.3231788 C40.7735099,68.3231788 43.6556291,67.8145695 46.7072848,66.797351 C49.7589404,65.7801325 52.4715232,63.9152318 54.7602649,61.3721854 C56.1165563,59.7615894 57.1337748,57.981457 57.6423841,55.9470199 C58.1509934,53.9125828 58.4900662,51.4543046 58.4900662,48.5721854 L58.4900662,45.0119205 C56.0317881,44.418543 53.4039735,43.9099338 50.6913907,43.5708609 C47.9788079,43.2317881 45.3509934,43.0622517 42.7231788,43.0622517 C37.0437086,43.0622517 32.8900662,44.1642384 30.0927152,46.4529801 C27.2953642,48.7417219 25.9390728,51.9629139 25.9390728,56.2013245 C25.9390728,60.1854305 26.9562914,63.1523179 29.0754967,65.186755 C31.1099338,67.3059603 34.0768212,68.3231788 37.9761589,68.3231788 Z M106.045033,77.4781457 C104.519205,77.4781457 103.501987,77.2238411 102.823841,76.6304636 C102.145695,76.1218543 101.552318,74.9350993 101.043709,73.3245033 L81.1231788,7.7986755 C80.6145695,6.10331126 80.3602649,5.0013245 80.3602649,4.40794702 C80.3602649,3.05165563 81.0384106,2.28874172 82.394702,2.28874172 L90.7019868,2.28874172 C92.3125828,2.28874172 93.4145695,2.54304636 94.007947,3.13642384 C94.6860927,3.64503311 95.194702,4.83178808 95.7033113,6.44238411 L109.944371,62.5589404 L123.168212,6.44238411 C123.592053,4.74701987 124.100662,3.64503311 124.778808,3.13642384 C125.456954,2.62781457 126.643709,2.28874172 128.169536,2.28874172 L134.950993,2.28874172 C136.561589,2.28874172 137.663576,2.54304636 138.341722,3.13642384 C139.019868,3.64503311 139.613245,4.83178808 139.952318,6.44238411 L153.345695,63.2370861 L168.010596,6.44238411 C168.519205,4.74701987 169.112583,3.64503311 169.70596,3.13642384 C170.384106,2.62781457 171.486093,2.28874172 173.011921,2.28874172 L180.895364,2.28874172 C182.251656,2.28874172 183.01457,2.96688742 183.01457,4.40794702 C183.01457,4.83178808 182.929801,5.25562914 182.845033,5.76423841 C182.760265,6.27284768 182.590728,6.95099338 182.251656,7.88344371 L161.822517,73.4092715 C161.313907,75.1046358 160.72053,76.2066225 160.042384,76.7152318 C159.364238,77.2238411 158.262252,77.5629139 156.821192,77.5629139 L149.531126,77.5629139 C147.92053,77.5629139 146.818543,77.3086093 146.140397,76.7152318 C145.462252,76.1218543 144.868874,75.0198675 144.529801,73.3245033 L131.390728,18.6490066 L118.336424,73.2397351 C117.912583,74.9350993 117.403974,76.0370861 116.725828,76.6304636 C116.047682,77.2238411 114.860927,77.4781457 113.335099,77.4781457 L106.045033,77.4781457 Z M214.972185,79.7668874 C210.564238,79.7668874 206.156291,79.2582781 201.917881,78.2410596 C197.67947,77.2238411 194.37351,76.1218543 192.169536,74.8503311 C190.813245,74.0874172 189.880795,73.2397351 189.541722,72.4768212 C189.202649,71.7139073 189.033113,70.8662252 189.033113,70.1033113 L189.033113,65.7801325 C189.033113,64 189.711258,63.1523179 190.982781,63.1523179 C191.491391,63.1523179 192,63.2370861 192.508609,63.4066225 C193.017219,63.5761589 193.780132,63.9152318 194.627815,64.2543046 C197.509934,65.5258278 200.646358,66.5430464 203.952318,67.2211921 C207.343046,67.8993377 210.649007,68.2384106 214.039735,68.2384106 C219.380132,68.2384106 223.533775,67.3059603 226.415894,65.4410596 C229.298013,63.5761589 230.823841,60.8635762 230.823841,57.3880795 C230.823841,55.0145695 230.060927,53.0649007 228.535099,51.4543046 C227.009272,49.8437086 224.127152,48.402649 219.97351,47.0463576 L207.682119,43.2317881 C201.49404,41.2821192 196.916556,38.4 194.119205,34.5854305 C191.321854,30.8556291 189.880795,26.7019868 189.880795,22.2940397 C189.880795,18.7337748 190.643709,15.597351 192.169536,12.8847682 C193.695364,10.1721854 195.729801,7.7986755 198.272848,5.93377483 C200.815894,3.98410596 203.698013,2.54304636 207.088742,1.52582781 C210.47947,0.508609272 214.039735,0.0847682119 217.769536,0.0847682119 C219.634437,0.0847682119 221.584106,0.169536424 223.449007,0.42384106 C225.398675,0.678145695 227.178808,1.01721854 228.95894,1.35629139 C230.654305,1.78013245 232.264901,2.20397351 233.790728,2.71258278 C235.316556,3.22119205 236.503311,3.72980132 237.350993,4.2384106 C238.537748,4.91655629 239.38543,5.59470199 239.89404,6.35761589 C240.402649,7.03576159 240.656954,7.96821192 240.656954,9.15496689 L240.656954,13.1390728 C240.656954,14.9192053 239.978808,15.8516556 238.707285,15.8516556 C238.029139,15.8516556 236.927152,15.5125828 235.486093,14.8344371 C230.654305,12.6304636 225.229139,11.5284768 219.210596,11.5284768 C214.378808,11.5284768 210.564238,12.2913907 207.936424,13.9019868 C205.308609,15.5125828 203.952318,17.9708609 203.952318,21.4463576 C203.952318,23.8198675 204.8,25.8543046 206.495364,27.4649007 C208.190728,29.0754967 211.327152,30.6860927 215.819868,32.1271523 L227.856954,35.9417219 C233.960265,37.8913907 238.368212,40.6039735 240.996026,44.0794702 C243.623841,47.5549669 244.895364,51.5390728 244.895364,55.9470199 C244.895364,59.592053 244.13245,62.8980132 242.691391,65.7801325 C241.165563,68.6622517 239.131126,71.205298 236.503311,73.2397351 C233.875497,75.3589404 230.739073,76.8847682 227.09404,77.986755 C223.27947,79.1735099 219.295364,79.7668874 214.972185,79.7668874 Z\\\" fill=\\\"#252F3E\\\" fill-rule=\\\"nonzero\\\"></path>\\n\\t\\t\\t\\t<path d=\\\"M230.993377,120.964238 C203.104636,141.562914 162.58543,152.498013 127.745695,152.498013 C78.9192053,152.498013 34.9245033,134.442384 1.69536424,104.434437 C-0.932450331,102.060927 1.4410596,98.8397351 4.57748344,100.704636 C40.5192053,121.557616 84.8529801,134.188079 130.712583,134.188079 C161.65298,134.188079 195.645033,127.745695 226.924503,114.521854 C231.586755,112.402649 235.570861,117.57351 230.993377,120.964238 Z M242.606623,107.740397 C239.046358,103.162914 219.04106,105.536424 209.970861,106.638411 C207.258278,106.977483 206.834437,104.603974 209.292715,102.823841 C225.229139,91.6344371 251.422517,94.8556291 254.474172,98.5854305 C257.525828,102.4 253.62649,128.593377 238.707285,141.139073 C236.418543,143.088742 234.21457,142.071523 235.231788,139.528477 C238.622517,131.136424 246.166887,112.233113 242.606623,107.740397 Z\\\" fill=\\\"#FF9900\\\"></path>\\n\\t\\t</g>\\n</svg>\",\"invert\":false}};\nexport type MarketplaceAction = { action: 'add' | 'remove' | 'share' | 'open-website'; kind: 'plugin' | 'bot'; id: string };\ntype MarketplaceEntry = { id: string; kind: 'plugin' | 'bot'; name: string; category: string; description: string; website?: string; shape?: import('./AgentPatterns.js').AgentProfile['shape']; expression?:import('./AgentPatterns.js').AgentProfile['expression']; color?: string };\nconst marketplaceEntries: MarketplaceEntry[] = [\n  { id:'pitch-partner',kind:'bot',name:'Pitch partner',category:'Writing',description:'Shape a clear story for your next idea.',shape:'petal',expression:'happy',color:'#f8b193' },\n  { id:'meeting-notes',kind:'bot',name:'Meeting notes',category:'Productivity',description:'Turn discussion into notes and next steps.',shape:'pocket',color:'#b3e4cf' },\n  { id:'launch-planner',kind:'bot',name:'Launch planner',category:'Marketing',description:'Organize a launch from first draft to release.',shape:'star',expression:'angry',color:'#c7b7f0' },\n  { id:'code-reviewer',kind:'bot',name:'Code reviewer',category:'Development',description:'Review a change with a second perspective.',shape:'flower',color:'#a5d4ed' },\n  { id:'design-partner',kind:'bot',name:'Design partner',category:'Design',description:'Develop an interface from a rough concept.',shape:'shield',color:'#d3ee97' },\n  { id:'research-scout',kind:'bot',name:'Research scout',category:'Research',description:'Find patterns worth exploring in your research.',shape:'petal',color:'#f6df8b' },\n  { id:'data-analyst',kind:'bot',name:'Data analyst',category:'Analytics',description:'Explore what the numbers can tell your team.',shape:'diamond',color:'#97bbed' },\n  { id:'support-guide',kind:'bot',name:'Support guide',category:'Support',description:'Draft helpful answers to customer questions.',shape:'heart',color:'#efb9d0' },\n  { id:'notion',kind:'plugin',name:'Notion',category:'Productivity',description:'Explore notes, documents and project context.',website:'https://www.notion.com/' },\n  { id:'figma',kind:'plugin',name:'Figma',category:'Design',description:'Discuss design context and component decisions.',website:'https://www.figma.com/' },\n  { id:'linear',kind:'plugin',name:'Linear',category:'Project management',description:'Organize issues and the next practical task.',website:'https://linear.app/' },\n  { id:'appwrite',kind:'plugin',name:'Appwrite',category:'Development',description:'Explore application backend workflows.',website:'https://appwrite.io/' },\n  { id:'gmail',kind:'plugin',name:'Gmail',category:'Communication',description:'Find useful context in an email workflow.',website:'https://mail.google.com/' },\n  { id:'google-calendar',kind:'plugin',name:'Google Calendar',category:'Productivity',description:'Plan time and review a calendar workflow.',website:'https://calendar.google.com/' },\n  { id:'google-drive',kind:'plugin',name:'Google Drive',category:'Productivity',description:'Keep file context close to the conversation.',website:'https://drive.google.com/' },\n  { id:'slack',kind:'plugin',name:'Slack',category:'Communication',description:'Explore updates from a team conversation.',website:'https://slack.com/' },\n  { id:'github',kind:'plugin',name:'GitHub',category:'Development',description:'Review code, issues and change context.',website:'https://github.com/' },\n  { id:'amazon-location-service',kind:'plugin',name:'Amazon Location Service',category:'Infrastructure',description:'Explore a workflow for places and routes.',website:'https://aws.amazon.com/location/' },\n];\nconst defaultMarketplaceInstalled = ['gmail','google-calendar','google-drive','slack'];\nfunction MarketplaceArtwork({item,size=32}:{item:MarketplaceEntry;size?:number}) {\n  if(item.kind==='bot') return <SourceAgentArtwork shape={item.shape||'cloud'} expression={item.expression||'neutral'} color={item.color||'#b3e4e5'} name={item.name} animated={false}/>;\n  const artwork=marketplaceLogoData[item.name];\n  return <span className={`bt-marketplace-logo bt-marketplace-logo-${item.id}`} style={{width:size,height:size}} aria-hidden=\"true\">{artwork?<img alt=\"\" src={'data:image/svg+xml,'+encodeURIComponent(artwork.svg)} data-invert={artwork.invert||undefined}/>:<UIIcon name=\"link\"/>}</span>;\n}\nexport type AgentMarketplaceProps = {\n  installedIds?: string[];\n  onInstalledIdsChange?: (ids:string[])=>void;\n  /** Observer boundary only: local Add never configures or authenticates an external service. */\n  onAction?: (event:MarketplaceAction)=>void|Promise<void>;\n  onClose?:()=>void;\n  initialItemId?:string;\n};\n/** Local marketplace composition, usable in the shared native SettingsModal marketplace slot. */\nexport function AgentMarketplace({installedIds,onInstalledIdsChange,onAction,onClose,initialItemId}:AgentMarketplaceProps) {\n  const marketplaceId=useId(),{direction}=useDirection();\n  const [localInstalled,setLocalInstalled]=useState(defaultMarketplaceInstalled),[tab,setTab]=useState<'Discover'|'Plugins'|'Bots'|'Installed'>('Discover'),[query,setQuery]=useState(''),[detail,setDetail]=useState<string|undefined>(initialItemId),[notice,setNotice]=useState('');\n  const installed=installedIds??localInstalled,readonly=installedIds!==undefined&&!onInstalledIdsChange;\n  useEffect(()=>{if(initialItemId&&marketplaceEntries.some(item=>item.id===initialItemId))setDetail(initialItemId)},[initialItemId]);\n  const active=marketplaceEntries.find(item=>item.id===detail),matches=(item:MarketplaceEntry)=>(item.name+' '+item.category+' '+item.description).toLowerCase().includes(query.toLowerCase());\n  const emit=(event:MarketplaceAction)=>{try{const result=onAction?.(event);if(result&&typeof result.then==='function')void result.catch(()=>setNotice('The host notification did not complete. This remains a local preview.'));}catch{setNotice('The host notification did not complete. This remains a local preview.')}};\n  const toggle=(item:MarketplaceEntry)=>{if(readonly)return;const added=!installed.includes(item.id),next=added?[...installed,item.id]:installed.filter(id=>id!==item.id);setLocalInstalled(next);onInstalledIdsChange?.(next);setNotice(`${item.name} ${added?'added':'removed'} locally. No external account was connected.`);emit({action:added?'add':'remove',kind:item.kind,id:item.id});};\n  const share=async(item:MarketplaceEntry)=>{const url=new URL(location.href);url.searchParams.set('marketplace',item.id);try{await navigator.clipboard.writeText(url.href);setNotice('Local marketplace preview link copied.');emit({action:'share',kind:item.kind,id:item.id});}catch{setNotice('Clipboard unavailable. Copy this page URL to share the local preview.')}};\n  const card=(item:MarketplaceEntry,compact=false)=><article key={item.id} className={`bt-marketplace-card ${compact?'bt-marketplace-bot-mini':''}`}><button type=\"button\" aria-label={`View ${item.name}`} className=\"bt-marketplace-card-title\" onClick={()=>setDetail(item.id)}><MarketplaceArtwork item={item}/><span><strong>{item.name}</strong><small>{item.category}</small></span></button>{!compact&&<><p>{item.description}</p><NativeButton size=\"small\" variant=\"secondary\" disabled={readonly} aria-label={installed.includes(item.id)?`View added ${item.name}`:`Add ${item.name}`} onClick={()=>installed.includes(item.id)?setDetail(item.id):toggle(item)}>{installed.includes(item.id)?'Added':'Add'}</NativeButton></>}</article>;\n  const section=(title:string,items:MarketplaceEntry[],compact=false,viewAll?:'Bots'|'Plugins')=><section className=\"bt-marketplace-section\"><header><h3>{title}</h3>{viewAll&&<button type=\"button\" onClick={()=>setTab(viewAll)}>View all <UIIcon name=\"chevron-right\"/></button>}</header><div className={compact?'bt-marketplace-bot-grid':'bt-marketplace-grid'}>{items.map(item=>card(item,compact))}</div></section>;\n  const filtered=marketplaceEntries.filter(item=>matches(item)&&(tab==='Installed'?installed.includes(item.id):tab==='Bots'?item.kind==='bot':tab==='Plugins'?item.kind==='plugin':true));\n  return <NativeScope><section className=\"bt-agent-marketplace\" aria-label=\"Marketplace\"><header className=\"bt-marketplace-heading\">{active&&<NativeButton variant=\"ghost\" size=\"small\" iconOnly leadingIcon={RiArrowRightSLine} className=\"bt-marketplace-back\" aria-label=\"Back to marketplace\" onClick={()=>setDetail(undefined)}/>}<h2>Marketplace</h2>{onClose&&<NativeButton variant=\"ghost\" size=\"small\" iconOnly aria-label=\"Close marketplace\" leadingIcon={RiCloseLine} onClick={onClose}/>}</header>{active?<div className=\"bt-marketplace-scroll bt-marketplace-detail\"><div className=\"bt-marketplace-detail-title\"><MarketplaceArtwork item={active} size={48}/><div><h3>{active.name}</h3><p>{active.category} · by {active.kind==='plugin'?active.name:'Helios community'}</p></div></div><p>{active.description} Explore this example without connecting an external account.</p><div className=\"bt-marketplace-detail-actions\"><NativeButton variant=\"secondary\" size=\"small\" disabled={readonly} onClick={()=>toggle(active)}>{installed.includes(active.id)?'Remove':'Add'}</NativeButton><NativeButton variant=\"ghost\" size=\"small\" leadingIcon={RiShare2Line} onClick={()=>void share(active)}>Share</NativeButton>{active.website&&<a href={active.website} target=\"_blank\" rel=\"noopener noreferrer\" onClick={()=>emit({action:'open-website',kind:active.kind,id:active.id})}>Website <UIIcon name=\"external\"/></a>}</div><section><h4>Skills · 1</h4><article className=\"bt-marketplace-feature\"><strong>{active.kind==='bot'?active.category+' assistance':active.category+' collaboration'}</strong><p>{active.description}</p></article></section><section><h4>{active.kind==='plugin'?'Apps · 1':'Bot · 1'}</h4><article className=\"bt-marketplace-feature\"><MarketplaceArtwork item={active}/><span><strong>{active.name}</strong><small>{active.kind==='plugin'?'Connector':'Local teammate'}</small></span></article></section><section><h4>Details</h4><dl><div><dt>Developer</dt><dd>{active.kind==='plugin'?active.name:'Helios community'}</dd></div><div><dt>Category</dt><dd>{active.category}</dd></div><div><dt>Includes</dt><dd>{active.kind==='plugin'?'1 app, 1 skill':'1 bot, 1 skill'}</dd></div><div><dt>Availability</dt><dd>Local preview</dd></div></dl></section><p className=\"bt-marketplace-local-note\">Adding saves a local selection only. No account, plugin, provider or external tool is connected.</p></div>:<><div className=\"bt-marketplace-controls\"><div className=\"bt-marketplace-search\"><NativeInput type=\"search\" aria-label=\"Search marketplace\" leadingIcon={RiSearchLine} fieldClassName=\"bg-background-secondary-default border-transparent shadow-none\" placeholder=\"Find your next tool or teammate\" value={query} onChange={setQuery}/></div><div role=\"tablist\" aria-label=\"Marketplace categories\">{(['Discover','Plugins','Bots','Installed']as const).map((value,index)=><button type=\"button\" key={value} id={`${marketplaceId}-tab-${value}`} role=\"tab\" aria-selected={tab===value} aria-controls={`${marketplaceId}-results`} tabIndex={tab===value?0:-1} onClick={()=>setTab(value)} onKeyDown={event=>{if(['ArrowRight','ArrowLeft','Home','End'].includes(event.key)){event.preventDefault();const next=event.key==='Home'?0:event.key==='End'?3:(index+((event.key==='ArrowRight')!==(direction==='rtl')?1:3))%4;setTab((['Discover','Plugins','Bots','Installed']as const)[next]);event.currentTarget.parentElement?.querySelectorAll<HTMLButtonElement>('[role=tab]')[next]?.focus()}}}>{value}</button>)}</div></div><div id={`${marketplaceId}-results`} role=\"tabpanel\" aria-labelledby={`${marketplaceId}-tab-${tab}`} className=\"bt-marketplace-scroll\">{!filtered.length?<div className=\"bt-marketplace-empty\"><h3>{query?'No matches found':'Nothing added yet'}</h3><p>{query?'Try another name or category.':'Explore the catalog to add a local tool or teammate.'}</p><NativeButton variant=\"secondary\" size=\"small\" onClick={()=>{setQuery('');setTab('Plugins')}}>{query?'Clear search':'Explore plugins'}</NativeButton></div>:tab==='Discover'&&!query?<>{section('Meet your next teammate',filtered.filter(item=>item.kind==='bot').slice(0,4),true,'Bots')}{section('Tools for your workflow',filtered.filter(item=>item.kind==='plugin').slice(0,4),false,'Plugins')}{section('Everyday essentials',filtered.filter(item=>defaultMarketplaceInstalled.includes(item.id)))}</>:section(tab==='Bots'?'Find your next teammate':tab==='Installed'?'Added to your workspace':'Explore plugins',filtered)}</div></>}<span className=\"hu-sr-only\" role=\"status\">{notice}</span></section></NativeScope>;\n}\n\nconst templateAvailableAgents: import('./AgentPatterns.js').AgentChatParticipant[] = [\n  {id:'design',name:'Landing page designer',role:'Design',color:'#d3ee97',profile:{...defaultAgent,name:'Landing page designer',label:'Design',shape:'shield',expression:'neutral',color:'#d3ee97'}},\n  {id:'content',name:'Content reviewer',role:'Writing',color:'#f3c6a1',profile:{...defaultAgent,name:'Content reviewer',label:'Writing',shape:'pocket',expression:'neutral',color:'#f3c6a1'}},\n  {id:'marketing',name:'Marketing bot',role:'Marketing',color:'#a5dfde',profile:{...defaultAgent,name:'Marketing bot',label:'Marketing',shape:'star',expression:'happy',color:'#a5dfde'}},\n  {id:'seo',name:'SEO bot',role:'SEO',color:'#c7b7f0',profile:{...defaultAgent,name:'SEO bot',label:'SEO',shape:'flower',expression:'neutral',color:'#c7b7f0'}},\n  {id:'research',name:'Research assistant',role:'Research',color:'#f6df8b',profile:{...defaultAgent,name:'Research assistant',label:'Research',shape:'petal',expression:'happy',color:'#f6df8b'}},\n  {id:'security',name:'Security agent',role:'Security',color:templateSecurityAgent.color,profile:templateSecurityAgent},\n  {id:'product',name:'Product planner',role:'Product',color:'#97bbed',profile:{...defaultAgent,name:'Product planner',label:'Product',shape:'diamond',expression:'neutral',color:'#97bbed'}},\n  {id:'cloud',name:'Cloud engineer',role:'Cloud',color:'#f8b193',profile:{...defaultAgent,name:'Cloud engineer',label:'Cloud',shape:'cloud',expression:'thinking',color:'#f8b193'}},\n  {id:'support',name:'Support guide',role:'Support',color:'#efb9d0',profile:{...defaultAgent,name:'Support guide',label:'Support',shape:'heart',expression:'calm',color:'#efb9d0'}},\n  {id:'data',name:'Data analyst',role:'Analytics',color:'#b3e4e5',profile:{...defaultAgent,name:'Data analyst',label:'Analytics',shape:'slender',expression:'focused',color:'#b3e4e5'}},\n];\n\nfunction WorkspaceSidebarFooter({onSettings}:{onSettings?:()=>void}){const chrome=useContext(TemplateChromeContext);return <NativeScope translate={templateCopy}><div className=\"bt-source-sidebar-footer\"><a href=\"/docs\"><RiCustomerServiceLine size={20}/>Support</a><button type=\"button\" onClick={onSettings||chrome.settings}><RiSettings4Line size={20}/>Settings</button><DashboardTeamMenu teamName=\"Helios team\" teamEmail=\"team@example.com\" teamAvatarSrc=\"/favicon.svg\"/></div></NativeScope>}\nfunction MultiAgentContent({ storageKey, initialGroup = false, initialEditorOpen = true, onMarketplaceAction }: { storageKey?: string; initialGroup?: boolean; initialEditorOpen?: boolean; onMarketplaceAction?:BoardTemplateProps['onMarketplaceAction'] }) {\n  const { ref, narrow } = useNarrowTemplate(1100);\n  const chrome=useContext(TemplateChromeContext);\n  const [creator, setCreator] = useState(initialEditorOpen),\n    [agent, setAgent] = useState(templateSecurityAgent),\n    [notice, setNotice] = useState(''),[editingAgentId,setEditingAgentId]=useState<string|null>('security');\n  const group: import('./AgentPatterns.js').AgentConversation = {\n    id: 'design-marketing-product', name: 'Design + Marketing + Product', role: 'Group conversation', color: '#A3E635',\n    members: [\n      { id: 'design', name: 'Landing page designer', role: 'Design', color: '#d3ee97', profile: { ...defaultAgent, name: 'Landing page designer', label: 'Design', shape: 'shield', expression: 'neutral', color: '#d3ee97' } },\n      { id: 'marketing', name: 'Marketing bot', role: 'Marketing', color: '#a5dfde', profile: { ...defaultAgent, name: 'Marketing bot', label: 'Marketing', shape: 'star', expression: 'happy', color: '#a5dfde' } },\n      { id: 'product', name: 'Product planner', role: 'Product', color: '#97bbed', profile: { ...defaultAgent, name: 'Product planner', label: 'Product', shape: 'diamond', expression: 'neutral', color: '#97bbed' } },\n    ], messages: [],\n  };\n  const [threads, setThreads] = useState<import('./AgentPatterns.js').AgentConversation[]>(() => {\n    const individuals: import('./AgentPatterns.js').AgentConversation[] = [\n            {\n              id: 'design',\n              name: 'Landing page designer',\n              role: 'Design',\n              color: '#00CED1',\n              messages: [\n                { author: 'You', text: 'How can we make the landing page feel clearer?' },\n                {\n                  author: 'Landing page designer',\n                  text: 'Give the hero one clear action. Lead with the outcome, pair it with a focused product preview, and move the secondary links below the fold.\\n\\nFor the next section, show three concrete benefits with short examples. That creates a natural path from understanding the product to trying it.',\n                },\n              ],\n            },\n            {\n              id: 'content',\n              name: 'Content reviewer',\n              role: 'Content',\n              color: '#ed9a64',\n              messages: [\n                {\n                  author: 'Content reviewer',\n                  text: 'Share the copy you want to review in this local example.',\n                },\n              ],\n            },\n            {\n              id: 'marketing',\n              name: 'Marketing bot',\n              role: 'Marketing',\n              color: '#60a5fa',\n              messages: [\n                {\n                  author: 'Marketing bot',\n                  text: 'Lead with the problem your product solves. This example does not run AI inference.',\n                },\n              ],\n            },\n            {\n              id: 'seo',\n              name: 'SEO bot',\n              role: 'Discovery',\n              color: 'var(--color-chart-5)',\n              messages: [\n                {\n                  author: 'SEO bot',\n                  text: 'Start with the search intent and a useful page structure.',\n                },\n              ],\n            },\n            {\n              id: 'research',\n              name: 'Research assistant',\n              role: 'Research',\n              color: '#eab308',\n              messages: [\n                {\n                  author: 'Research assistant',\n                  text: 'Ask about the last time a user encountered the problem.',\n                },\n              ],\n            },\n            {\n              id: 'security',\n              name: agent.name,\n              role: agent.label,\n              color: agent.color,\n              messages: [\n                {\n                  author: agent.name,\n                  text: 'Review permissions, data boundaries and recovery behavior.',\n                },\n              ],\n            },\n            {\n              id: 'cloud',\n              name: 'Cloud engineer',\n              role: 'Cloud',\n              color: 'var(--color-chart-8)',\n              messages: [\n                {\n                  author: 'Cloud engineer',\n                  text: 'Give staging its own environment and verify the deployed revision.',\n                },\n              ],\n            },\n          ];\n    return [...(initialGroup?[group]:[]),...individuals.map(thread=>{const source=templateAvailableAgents.find(agent=>agent.id===thread.id);return source?{...thread,role:source.role||thread.role,color:source.color||thread.color,profile:{...source.profile!,name:thread.name}}:thread;})];\n  });\n  useEffect(() => {\n    if (!editingAgentId) return;\n    const profile = threads.find(thread => thread.id === editingAgentId)?.profile\n      || threads.flatMap(thread => thread.members || []).find(member => member.id === editingAgentId)?.profile;\n    if (profile) setAgent(previous => JSON.stringify(previous) === JSON.stringify(profile) ? previous : profile);\n  }, [threads, editingAgentId]);\n  const [marketplace, setMarketplace] = useState(false),\n    [marketplacePage,setMarketplacePage]=useState<'marketplace'|'general'>('marketplace'),\n    [marketplaceItem,setMarketplaceItem]=useState<string|undefined>(),\n    [plugins, setPlugins] = useState<string[]>(defaultMarketplaceInstalled),\n    [preferencesReady, setPreferencesReady] = useState(false),\n    [preferencesEnabled, setPreferencesEnabled] = useState(true);\n  useEffect(()=>{if(chrome.suspended)setMarketplace(false)},[chrome.suspended]);\n  const pluginOptions=marketplaceEntries;\n  const availableAgents=useMemo(()=>{\n    const catalog:import('./AgentPatterns.js').AgentChatParticipant[]=[...templateAvailableAgents,...marketplaceEntries.filter(item=>item.kind==='bot'&&plugins.includes(item.id)).map(item=>({id:'marketplace-'+item.id,name:item.name,role:item.category,color:item.color||'#b3e4e5',profile:{...defaultAgent,name:item.name,label:item.category,shape:item.shape||'cloud',expression:item.expression||'neutral',color:item.color||'#b3e4e5'}}))];\n    const edited=editingAgentId?{id:editingAgentId,name:agent.name,role:agent.label,color:agent.color,profile:agent}:undefined;\n    if(edited&&!catalog.some(item=>item.id===edited.id))catalog.push(edited);\n    return catalog.map(item=>{if(edited?.id===item.id)return edited;const live=threads.find(thread=>thread.id===item.id)||threads.flatMap(thread=>thread.members||[]).find(member=>member.id===item.id);return live?{...item,...live,profile:live.profile||item.profile}:item;});\n  },[plugins,threads,agent,editingAgentId]);\n  useEffect(()=>{const id=new URLSearchParams(location.search).get('marketplace');if(id&&marketplaceEntries.some(item=>item.id===id)){setMarketplaceItem(id);setMarketplacePage('marketplace');setMarketplace(true)}},[]);\n  useEffect(() => {\n    if (storageKey) {\n      try {\n        const saved = JSON.parse(localStorage.getItem(storageKey + ':preferences') || 'null');\n        if (saved && typeof saved === 'object') {\n          if (Array.isArray(saved.plugins)) setPlugins(saved.plugins.filter((id: unknown) => typeof id === 'string' && pluginOptions.some(plugin => plugin.id === id)));\n          if (saved.agent && typeof saved.agent.name === 'string' && typeof saved.agent.label === 'string' && typeof saved.agent.description === 'string') { setEditingAgentId(typeof saved.agentId==='string'?saved.agentId:'security'); setAgent(previous => ({ ...previous, name: saved.agent.name.slice(0, 80), label: saved.agent.label.slice(0, 80), description: saved.agent.description.slice(0, 2000), ...(avatarShapes.includes(saved.agent.shape) ? { shape: saved.agent.shape } : {}), ...(avatarExpressions.includes(saved.agent.expression) ? { expression: saved.agent.expression } : {}), ...(['Auto-detect','English','Turkish','Spanish','French','German','Japanese','Portuguese','Hindi','Tamil','Kannada','Marathi'].includes(saved.agent.language) ? { language: saved.agent.language } : {}), ...(['0.75','1','1.25','1.5'].includes(saved.agent.speed) ? { speed: saved.agent.speed } : {}), ...(typeof saved.agent.notify === 'boolean' ? { notify: saved.agent.notify } : {}), ...(typeof saved.agent.voice === 'string' ? { voice: saved.agent.voice.slice(0, 200) } : {}), ...(typeof saved.agent.color === 'string' && /^#[0-9a-f]{6}$/i.test(saved.agent.color) ? { color: saved.agent.color } : {}) })); }\n        }\n      } catch { setNotice('Saved workspace preferences could not be read. This session remains editable.'); }\n    }\n    setPreferencesReady(true);\n  }, [storageKey]);\n  useEffect(() => {\n    if (!storageKey || !preferencesReady || !preferencesEnabled) return;\n    try { localStorage.setItem(storageKey + ':preferences', JSON.stringify({ version: 2, agentId:editingAgentId, agent, plugins })); }\n    catch { setNotice('Browser storage is unavailable. Workspace preferences remain in memory.'); }\n  }, [storageKey, preferencesReady, editingAgentId, agent, plugins, preferencesEnabled]);\n  return (\n    <section\n      ref={ref}\n      className={`bt-multi-workspace ${creator && !narrow ? '' : 'bt-multi-panel-closed'}`}\n    >\n      <div className=\"bt-multi-main\">\n        <h1 className=\"hu-sr-only\">Your Helios agents</h1>\n        <MultiAgentChat\n          presentation=\"source\"\n          mobileSidebar\n          availableAgents={availableAgents}\n          onMarketplace={()=>{setMarketplaceItem(undefined);setMarketplacePage('marketplace');setMarketplace(true)}}\n          sidebarFooter={({closeSidebar,clearSavedChat,storageEnabled,storageNote})=><>{storageEnabled&&<details className=\"hp-source-chat-data\"><summary>Chat data</summary><div><Button variant=\"tertiary\" size=\"sm\" onClick={clearSavedChat}>Clear saved chat</Button><p role=\"status\">{storageNote}</p><p>Browser data is local to this demo. No provider is connected.</p></div></details>}<WorkspaceSidebarFooter onSettings={()=>{closeSidebar();setMarketplacePage('general');setMarketplace(true)}}/></>}\n          sidebarActions={({startChat,createAgent,closeSidebar}:{startChat:()=>void;createAgent:()=>void;closeSidebar:()=>void})=><><NativeScope><NativeButton variant=\"secondary\" iconOnly size=\"medium\" leadingIcon={RiStore2Line} aria-label=\"Marketplace\" onClick={()=>{closeSidebar();setMarketplaceItem(undefined);setMarketplacePage('marketplace');setMarketplace(true)}}/></NativeScope><DropdownMenu label=\"Create bot or chat\" triggerContent={<RiAddLine size={20}/>} items={[{id:'agent',label:'Create a new bot',description:'Customize a new teammate.'},{id:'chat',label:'Chat with your agents',description:'Bring your agents into one chat.'}]} onAction={action=>action==='agent'?createAgent():startChat()}/></>}\n\n\n          onEditorToggle={(open,participant)=>{if(participant){setEditingAgentId(participant.id);setAgent(participant.profile??{...defaultAgent,name:participant.name,label:participant.role||'Agent',color:participant.color||defaultAgent.color});}else if(open){setEditingAgentId(null);setAgent(defaultAgent);}setCreator(open);}}\n          conversations={threads}\n          initialWorkspace={{conversations:threads,selectedId:initialGroup?group.id:'design'}}\n          threads={threads}\n          onThreadsChange={setThreads}\n          storageKey={storageKey}\n        />\n      </div>\n      <ResponsiveTemplatePanel\n        open={creator}\n        onOpenChange={setCreator}\n        narrow={narrow}\n        title={agent.name}\n        className=\"bt-agent-editor\"\n      >\n        <SourceAgentCreator agent={agent} onClose={()=>setCreator(false)} onChange={next => { setPreferencesEnabled(true); setAgent(next); setThreads(previous => previous.map(thread => thread.id === editingAgentId ? { ...thread, name: next.name, role: next.label, color: next.color, profile: next } : {...thread,members:thread.members?.map(member=>member.id===editingAgentId?{...member,name:next.name,role:next.label,color:next.color,profile:next}:member)})); }} />\n        <span className=\"hu-sr-only\" role=\"status\">{notice}</span>\n      </ResponsiveTemplatePanel>\n      <NativeScope translate={templateCopy}><NativeSettingsModal isOpen={marketplace} onClose={()=>setMarketplace(false)} defaultPage={marketplacePage} marketplace={<AgentMarketplace installedIds={plugins} onInstalledIdsChange={ids=>{setPreferencesEnabled(true);setPlugins(ids)}} onAction={onMarketplaceAction} initialItemId={marketplaceItem} onClose={()=>setMarketplace(false)}/>}/></NativeScope>\n    </section>\n  );\n}\nfunction AIProfileContent({ assetsBase, snippet=false }: { assetsBase: string; snippet?:boolean }) {\n  const [profile, setProfile] = useState({\n      name: 'Aarav Shah',\n      handle: '@aarav',\n      bio: '',\n    }),\n    [edit, setEdit] = useState(false),\n    [editorSession, setEditorSession] = useState(0),\n    [draft, setDraft] = useState(profile),\n    [period, setPeriod] = useState('weekly'),\n    [notice, setNotice] = useState(''),\n    [month, setMonth] = useState(11);\n  const form = useId();\n  const activityPoints=useMemo(()=>Array.from({length:266},(_,index)=>({label:`${period} day ${index+1}`,value:activityValue(index+(period==='monthly'?7:period==='yearly'?14:0))})),[period]);\n  return (\n    <section className=\"bt-ai-profile\">\n      <article className=\"bt-profile-card\">\n        <img\n          className=\"bt-profile-cover\"\n          src={asset(assetsBase, 'boardui-reference/ai-profile-cover.png')}\n          alt=\"Friendly robots against a bright blue sky\"\n        />\n        <div className=\"bt-profile-body\">\n          <div className=\"bt-profile-actions\">\n            <span className=\"bt-large-avatar\">{profile.name[0]}</span>\n            <div><NativeScope>\n              <NativeButton\n                variant=\"secondary\"\n                size=\"small\" leadingIcon={RiShare2Line}\n                onClick={async () => {\n                  try {\n                    await navigator.clipboard.writeText(location.href);\n                    setNotice('Profile preview link copied.');\n                  } catch {\n                    setNotice('Clipboard unavailable. Copy the URL from your browser.');\n                  }\n                }}\n              >\n                Share\n              </NativeButton>\n              <NativeButton\n                variant=\"secondary\"\n                size=\"small\" leadingIcon={RiEditBoxLine}\n                onClick={() => {\n                  setDraft(profile);\n                  setEditorSession((session) => session + 1);\n                  setEdit(true);\n                }}\n              >Edit</NativeButton></NativeScope>\n            </div>\n          </div>\n          <h1>{profile.name}</h1>\n          <p>\n            {profile.handle} <span className=\"bt-chip\">Local example</span>\n          </p>\n          {profile.bio&&<p className=\"bt-note\">{profile.bio}</p>}\n          <small>Contributions this year</small>\n          <strong className=\"bt-number\">{activityPoints.reduce((sum,point)=>sum+point.value,0).toLocaleString('en-IN')} <small className=\"bt-fixture-delta\" title=\"Illustrative comparison with the previous period\">+14.8%</small></strong>\n          <div className=\"bt-mini-stats\">\n            <span>\n              <strong>9B</strong>\n              <small>Lifetime tokens</small>\n            </span>\n            <span>\n              <strong>562.7M</strong>\n              <small>Peak tokens</small>\n            </span>\n            <span>\n              <strong>12h 54m</strong>\n              <small>Longest task</small>\n            </span>\n            <span>\n              <strong>62 days</strong>\n              <small>Top streak</small>\n            </span>\n          </div>\n          <div className=\"bt-profile-activity-heading\">\n            <span>Activity</span>\n            <div className=\"bt-period-buttons\" role=\"group\" aria-label=\"Profile activity period\">\n              {['weekly', 'monthly', 'yearly'].map((value) => (\n                <button\n                  type=\"button\"\n                  key={value}\n                  aria-pressed={period === value}\n                  onClick={() => setPeriod(value)}\n                >\n                  {value[0].toUpperCase() + value.slice(1)}\n                </button>\n              ))}\n            </div>\n          </div>\n          <Heatmap label={`${period} profile activity`} weeks={38} data={activityPoints} />\n        </div>\n      </article>\n      {!snippet&&<>\n      <ProfileHistoryChart\n        title=\"Agents\"\n        action={\n          <div className=\"bt-month-controls\">\n            <Button\n              variant=\"secondary\"\n              size=\"sm\"\n              aria-label=\"Previous agent month\"\n              onClick={() => setMonth((previous) => (previous + 11) % 12)}\n            ><UIIcon name=\"chevron-left\" /></Button>\n            <span>\n              {\n                [\n                  'January',\n                  'February',\n                  'March',\n                  'April',\n                  'May',\n                  'June',\n                  'July',\n                  'August',\n                  'September',\n                  'October',\n                  'November',\n                  'December',\n                ][month]\n              }\n            </span>\n            <Button\n              variant=\"secondary\"\n              size=\"sm\"\n              aria-label=\"Next agent month\"\n              onClick={() => setMonth((previous) => (previous + 1) % 12)}\n            ><UIIcon name=\"chevron-right\" /></Button>\n          </div>\n        }\n        points={Array.from(\n          { length: new Date(Date.UTC(2026, month + 1, 0)).getUTCDate() },\n          (_, index) => ({\n            name: `${month + 1}/${index + 1}`,\n            value: (index * 7 + month * 3) % 32,\n          }),\n        )}\n      />\n      <ProfileHistoryChart\n        title=\"Tokens\"\n        comparison=\"+9.4%\"\n        kind=\"area\"\n        points={Array.from({ length: 24 }, (_, index) => ({\n          name: shortUTCDate(new Date(Date.UTC(2026, 5, 14 + index))),\n          value: [38, 17, 0, 0, 0, 32, 8, 4, 54, 22, 33, 26][index % 12] * 1000000,\n        }))}\n      />\n      </>}\n      <p className=\"bt-status-message\" role=\"status\">\n        {notice}\n      </p>\n      <Dialog\n        open={edit}\n        onOpenChange={setEdit}\n        title=\"Edit profile\"\n        description=\"Changes are stored only in this local preview.\"\n        footer={\n          <>\n            <Button variant=\"secondary\" onClick={() => setEdit(false)}>\n              Cancel\n            </Button>\n            <Button type=\"submit\" form={form}>\n              Save profile\n            </Button>\n          </>\n        }\n      >\n        <form\n          id={form}\n          className=\"bt-dialog-fields\"\n          onSubmit={(event) => {\n            event.preventDefault();\n            setProfile(draft);\n            setEdit(false);\n            setNotice('Profile updated locally.');\n          }}\n        >\n          <Input\n            label=\"Profile name\"\n            required\n            value={draft.name}\n            onChange={(event) =>\n              setDraft((previous) => ({ ...previous, name: event.target.value }))\n            }\n          />\n          <Input\n            label=\"Profile handle\"\n            required\n            value={draft.handle}\n            onChange={(event) =>\n              setDraft((previous) => ({ ...previous, handle: event.target.value }))\n            }\n          />\n          <TextEditor\n            key={editorSession}\n            label=\"Profile bio\"\n            defaultValue={draft.bio}\n            onChange={(value) => setDraft((previous) => ({ ...previous, bio: value.text }))}\n          />\n        </form>\n      </Dialog>\n    </section>\n  );\n}\n\n/** Standalone source-shaped AI navigation, shared by template and documentation previews. */\nexport function RepositorySidebarSnippet({id='ai-chat',onNavigate,assetsBase='/assets'}:{id?:'ai-chat'|'ai-image-generation';onNavigate?:(id:BoardTemplateId)=>void;assetsBase?:string}){const[current,setCurrent]=useState<BoardTemplateId>(id),[create,setCreate]=useState(false),[profile,setProfile]=useState(defaultAgent);return <div className=\"bt-root bt-repository-sidebar-snippet\"><NativeScope translate={templateCopy}><DashboardSidebar fluid selected={current} userName=\"Aarav Shah\" userInitials=\"A\" teamName=\"Helios team\" teamEmail=\"team@example.com\" teamAvatarSrc=\"/favicon.svg\" teamPlan=\"Pro Plan\" onUpgrade={()=>location.assign('/?section=pricing')} renderNavigation={({query,collapsed})=><RepositoryNavigation query={query} collapsed={collapsed} id={current} navigate={next=>{setCurrent(next);onNavigate?.(next)}} onCreate={()=>setCreate(true)}/>} onNavigate={item=>onNavigate?.(item.key as BoardTemplateId)}/><Dialog open={create} onOpenChange={setCreate} title=\"Create a local agent\" footer={<><Button variant=\"secondary\" onClick={()=>setCreate(false)}>Cancel</Button><Button disabled={!profile.name.trim()} onClick={()=>setCreate(false)}>Save local agent</Button></>}><SourceAgentCreator agent={profile} onChange={setProfile} onClose={()=>setCreate(false)}/></Dialog></NativeScope><span className=\"hu-sr-only\">Navigation preview uses fictional local repositories.</span></div>}\n/** Card-only application snippets used by the homepage's live component gallery. */\nexport function ContributorProfileSnippet({assetsBase='/assets'}:{assetsBase?:string}){return <div className=\"bt-root bt-profile-snippet bt-template-ai-profile\"><AIProfileContent assetsBase={assetsBase} snippet/></div>}\nexport function CalendarSnippet(){return <div className=\"bt-root bt-calendar-snippet\"><CalendarContent/></div>}\nexport function ImageGenerationLoaderSnippet({assetsBase='/assets'}:{assetsBase?:string}){\n const[seconds,setSeconds]=useState(5),[ready,setReady]=useState(false),[visible,setVisible]=useState(true);const reduced=useReducedMotion(),frame=useRef<HTMLDivElement>(null);\n useEffect(()=>{const node=frame.current;if(!node)return;let inView=true;const update=()=>setVisible(inView&&document.visibilityState!=='hidden');const observer=new IntersectionObserver(entries=>{inView=entries[0]?.isIntersecting??true;update()});observer.observe(node);document.addEventListener('visibilitychange',update);return()=>{observer.disconnect();document.removeEventListener('visibilitychange',update)}},[]);\n useEffect(()=>{if(reduced===null||!visible)return;if(reduced){setReady(true);return;}const timer=setTimeout(()=>{if(ready){setSeconds(5);setReady(false)}else if(seconds>1)setSeconds(value=>value-1);else setReady(true)},ready?3500:1000);return()=>clearTimeout(timer)},[seconds,ready,reduced,visible]);\n return <div ref={frame} className=\"bt-root bt-image-loader-snippet\"><div className=\"bt-image-snippet-stage\"><motion.div className=\"bt-image-snippet-track\" initial={false} animate={{x:ready?-200:0}} transition={{duration:reduced===false?.7:0,ease:[.16,1,.3,1]}}><div className=\"bt-image-countdown\" role=\"status\"><span className=\"bt-image-ripple\" aria-hidden=\"true\"/><strong>{seconds}s</strong><span>Generating image</span></div><img src={asset(assetsBase,'boardui-reference/generated-footballer.jpg')} alt=\"Bundled football illustration\"/></motion.div></div><span className=\"hu-sr-only\">Looping local artwork animation; no image-generation service is called. Reduced motion shows the completed artwork.</span><button className=\"bt-snippet-replay\" type=\"button\" onClick={()=>{setSeconds(5);setReady(false)}} aria-label=\"Replay image preview\"><UIIcon name=\"refresh\"/></button></div>\n}\n\nexport function BoardTemplate({\n  id,\n  state = 'ready',\n  storageKey,\n  initialGroup,\n  initialEditorOpen,\n  onRetry,\n  assetsBase = '/assets',\n  onNavigate,\n  chrome = true,\n  embedded = false,\n  onMarketplaceAction,\n}: BoardTemplateProps & { id: BoardTemplateId }) {\n  const [interactive,setInteractive]=useState(false);\n  useEffect(()=>setInteractive(true),[]);\n  const [current, setCurrent] = useState<BoardTemplateId>(id),\n    [presentation, setPresentation] = useState(state),\n    [readyMounted, setReadyMounted] = useState(state === 'ready');\n  const reduce = useReducedMotion();\n  useEffect(() => setCurrent(id), [id]);\n  useEffect(() => {\n    setPresentation(state);\n    if (state === 'ready') setReadyMounted(true);\n  }, [state]);\n  const navigate = (next: BoardTemplateId) => {\n    setCurrent(next);\n    onNavigate?.(next);\n  };\n  const content =\n    current === 'dashboard' ? (\n      <HomeContent assetsBase={assetsBase} />\n    ) : current === 'hr' ? (\n      <HRContent assetsBase={assetsBase} />\n    ) : current === 'finance' ? (\n      <FinanceContent />\n    ) : current === 'marketing' ? (\n      <MarketingContent />\n    ) : current === 'medical-profile' ? (\n      <MedicalContent assetsBase={assetsBase} />\n    ) : current === 'calendar' ? (\n      <CalendarContent />\n    ) : current === 'project-board' ? (\n      <ProjectBoardContent assetsBase={assetsBase} />\n    ) : current === 'chat-starter' ? (\n      <ChatStarterContent storageKey={storageKey} />\n    ) : current === 'ai-chat' ? (\n      <CodeChatContent />\n    ) : current === 'ai-image-generation' ? (\n      <ImageStudioContent assetsBase={assetsBase} />\n    ) : current === 'multi-agent-chat' ? (\n      <MultiAgentContent storageKey={storageKey} initialGroup={initialGroup} initialEditorOpen={initialEditorOpen} onMarketplaceAction={onMarketplaceAction} />\n    ) : (\n      <AIProfileContent assetsBase={assetsBase} />\n    );\n  return (\n    <div className={`bt-root bt-template-${current}${embedded?' bt-document-embed':''}`} data-board-template={current} data-template-interactive={interactive}>\n      <BoardFrame id={current} navigate={navigate} assetsBase={assetsBase} chrome={chrome} embedded={embedded} suspended={presentation !== 'ready'}>\n        {presentation !== 'ready' && (\n          <DataState\n            state={presentation}\n            onRetry={() => {\n              setReadyMounted(true);\n              setPresentation('ready');\n              onRetry?.();\n            }}\n            emptyMessage=\"No local example records. Reset the template to explore it.\"\n          />\n        )}\n        {readyMounted && <motion.div\n          hidden={presentation !== 'ready'}\n          inert={presentation !== 'ready'}\n          className=\"bt-page-content\"\n          key={current}\n          initial={reduce !== false ? false : { opacity: 0 }}\n          animate={{ opacity: 1 }}\n          transition={{ duration: 0.15 }}\n        >\n          {content}\n        </motion.div>}\n      </BoardFrame>\n    </div>\n  );\n}\nexport function HomeDashboardTemplate(props: BoardTemplateProps) {\n  return <BoardTemplate {...props} id=\"dashboard\" />;\n}\nexport function HRTemplate(props: BoardTemplateProps) {\n  return <BoardTemplate {...props} id=\"hr\" />;\n}\nexport function FinanceTemplate(props: BoardTemplateProps) {\n  return <BoardTemplate {...props} id=\"finance\" />;\n}\nexport function MarketingTemplate(props: BoardTemplateProps) {\n  return <BoardTemplate {...props} id=\"marketing\" />;\n}\nexport function MedicalProfileTemplate(props: BoardTemplateProps) {\n  return <BoardTemplate {...props} id=\"medical-profile\" />;\n}\nexport function CalendarTemplate(props: BoardTemplateProps) {\n  return <BoardTemplate {...props} id=\"calendar\" />;\n}\nexport function ProjectBoardTemplate(props: BoardTemplateProps) {\n  return <BoardTemplate {...props} id=\"project-board\" />;\n}\nexport function ChatStarterTemplate(props: BoardTemplateProps) {\n  return <BoardTemplate {...props} id=\"chat-starter\" />;\n}\nexport function AIChatTemplate(props: BoardTemplateProps) {\n  return <BoardTemplate {...props} id=\"ai-chat\" />;\n}\nexport function MultiAgentChatTemplate(props: BoardTemplateProps) {\n  return <BoardTemplate {...props} id=\"multi-agent-chat\" />;\n}\nexport function AIImageGenerationTemplate(props: BoardTemplateProps) {\n  return <BoardTemplate {...props} id=\"ai-image-generation\" />;\n}\nexport function AIProfileTemplate(props: BoardTemplateProps) {\n  return <BoardTemplate {...props} id=\"ai-profile\" />;\n}\n",
  "src/BoundedChartText.tsx": "'use client';\nimport {useLayoutEffect,useRef,type SVGProps} from 'react';\n\n/** Keep polar-axis labels readable without reducing the chart or its type size. */\nexport function BoundedChartText({children,...props}:SVGProps<SVGTextElement>){\n  const ref=useRef<SVGTextElement>(null);\n  useLayoutEffect(()=>{\n    const label=ref.current,svg=label?.ownerSVGElement;\n    if(!label||!svg)return;\n    let active=true;\n    const measure=()=>{\n      if(!active)return;\n      label.removeAttribute('transform');\n      const bounds=label.getBBox(),view=svg.viewBox.baseVal;\n      const width=view.width||svg.clientWidth,height=view.height||svg.clientHeight;\n      const dx=bounds.x<2?2-bounds.x:bounds.x+bounds.width>width-2?width-2-bounds.x-bounds.width:0;\n      const dy=bounds.y<2?2-bounds.y:bounds.y+bounds.height>height-2?height-2-bounds.y-bounds.height:0;\n      if(dx||dy)label.setAttribute('transform',`translate(${dx},${dy})`);\n    };\n    measure();\n    const observer=new ResizeObserver(measure);observer.observe(svg);\n    void document.fonts.ready.then(measure);\n    return()=>{active=false;observer.disconnect()};\n  },[props.x,props.y,children]);\n  return <text {...props} ref={ref}>{children}</text>;\n}\n",
  "src/ChartFamilies.tsx": "'use client';\nimport {RiFocus2Line,RiUserAddLine,RiFlashlightLine,RiVipCrown2Line,RiGroupLine,RiBuildingLine,RiComputerLine,RiSmartphoneLine,RiTabletLine} from '@remixicon/react';\nimport observedSourceCharts from './board-native-charts/source-chart-data.json';\nimport chartSectionCopy from './board-native-charts/source-section-copy.json';\nimport { UIIcon, renderIcon } from './icons.js';\nimport {BoundedChartText} from './BoundedChartText.js';\nimport {useDirection} from './Direction.js';\nimport {OrdersChartCard as NativeOrdersChartCard} from './board-native-charts/orders-chart-card.js';\nimport {RevenueChartCard as NativeRevenueChartCard} from './board-native-charts/revenue-chart-card.js';\nexport{NativeOrdersChartCard,NativeRevenueChartCard};\nimport {Select as SourceSelect,SelectItem as SourceSelectItem} from './board-native/components/base/select/select.js';\nimport {NativeScope} from './board-native/NativeScope.js';\nimport {normalizePublicChartInput} from './ModernCharts.js';\nimport type {ChartInputDatum,ChartSeries,ChartStage,ChartListTab,ChartMatrixRow,ChartFlowNode,ChartFlowLink,ChartRange} from './ModernCharts.js';\nexport type {ChartInputDatum,ChartSeries,ChartStage,ChartListTab,ChartMatrixRow,ChartFlowNode,ChartFlowLink,ChartRange} from './ModernCharts.js';\n\n\nimport {createElement,isValidElement, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport {\n  ResponsiveContainer,\n  AreaChart,\n  Area,\n  LineChart,\n  Line,\n  BarChart,\n  Bar,\n  ComposedChart,\n  CartesianGrid,\n  XAxis,\n  YAxis,\n  Tooltip as ChartTooltip,\n  RadarChart,\n  Radar,\n  PolarGrid,\n  PolarAngleAxis,\n  PolarRadiusAxis,\n  PieChart,\n  Pie,\n  Cell,\n  ScatterChart,\n  Scatter,\n  ZAxis,\n  FunnelChart,\n  Funnel,\n  Sankey,\n} from 'recharts';\nimport {Popover,Dialog as AriaDialog} from 'react-aria-components';\nimport { useMotionPreference as useReducedMotion } from './useMotionPreference.js';\nimport { Checkbox, DataState, Select } from './components.js';\nimport type { FamilyProps } from './family-types.js';\n\n\n\nexport type ChartUnit = 'currency' | 'count' | 'percent';\ntype PlotType =\n  | 'rings'\n  | 'area'\n  | 'list'\n  | 'combo'\n  | 'contributions'\n  | 'bar'\n  | 'funnel'\n  | 'heatmap'\n  | 'line'\n  | 'days'\n  | 'radar'\n  | 'radial'\n  | 'sankey'\n  | 'scatter'\n  | 'score'\n  | 'stages';\nexport type ChartDefinition = { id: string; name: string; type: PlotType; unit: ChartUnit };\nexport const chartDefinitions: ChartDefinition[] = [\n  { id: 'activity-rings-card', name: 'Activity rings', type: 'rings', unit: 'count' },\n  { id: 'area-chart-card', name: 'Area chart', type: 'area', unit: 'currency' },\n  { id: 'bar-list-card', name: 'Bar list', type: 'list', unit: 'count' },\n  { id: 'combo-chart-card', name: 'Combo chart', type: 'combo', unit: 'currency' },\n  { id: 'contributions-card', name: 'Contributions', type: 'contributions', unit: 'count' },\n  { id: 'earnings-chart-card', name: 'Earnings chart', type: 'bar', unit: 'currency' },\n  { id: 'funnel-chart-card', name: 'Funnel chart', type: 'funnel', unit: 'count' },\n  { id: 'heatmap-chart-card', name: 'Heatmap chart', type: 'heatmap', unit: 'count' },\n  { id: 'line-chart-card', name: 'Line chart', type: 'line', unit: 'currency' },\n  { id: 'most-active-days-card', name: 'Most active days', type: 'days', unit: 'count' },\n  { id: 'orders-chart-card', name: 'Orders chart', type: 'bar', unit: 'count' },\n  { id: 'radar-chart-card', name: 'Radar chart', type: 'radar', unit: 'count' },\n  { id: 'radial-chart-card', name: 'Radial chart', type: 'radial', unit: 'count' },\n  { id: 'revenue-chart-card', name: 'Revenue chart', type: 'area', unit: 'currency' },\n  { id: 'sankey-chart-card', name: 'Sankey chart', type: 'sankey', unit: 'count' },\n  { id: 'scatter-chart-card', name: 'Scatter chart', type: 'scatter', unit: 'count' },\n  { id: 'sleep-score-card', name: 'Sleep score', type: 'score', unit: 'percent' },\n  { id: 'stage-bars-card', name: 'Stage bars', type: 'stages', unit: 'count' },\n  { id: 'steps-card', name: 'Steps chart', type: 'bar', unit: 'count' },\n];\nexport type ChartVariant = 'default'|'comparison'|'speedometer'|'overlap'|'percent'|'dots'|'lines'|'score'|'labels'|'grid'|'gauge'|'solid'|'stacked';\nexport const chartVariantOptions: Record<string,{value:ChartVariant;label:string}[]> = {\n  'area-chart-card':[{value:'default',label:'Stacked'},{value:'overlap',label:'Overlapping'},{value:'percent',label:'100% stacked'}],\n  'radar-chart-card':[{value:'default',label:'Filled'},{value:'dots',label:'Dots'},{value:'lines',label:'Lines'},{value:'score',label:'Centre score'},{value:'comparison',label:'Comparison'}],\n  'radial-chart-card':[{value:'default',label:'Rings'},{value:'labels',label:'Arc labels'},{value:'grid',label:'Circular grid'},{value:'gauge',label:'Gauge'},{value:'solid',label:'Solid gauge'},{value:'stacked',label:'Stacked half gauge'},{value:'speedometer',label:'Speedometer'}],\n};\nexport type ChartKind = string;\n/** A flat source row. Goal/unit describe ring metrics; x describes a scatter coordinate; source/target describe a flow. */\nexport type ChartDatum = {\n  name: string;\n  value: number;\n  previous?: number;\n  goal?: number;\n  unit?: string;\n  x?: number;\n  source?: string;\n  target?: string;\n  /** Optional independent conversion-rate percentage for the combo chart. */\n  secondary?: number;\n  /** Explicit composition parts; their sum is the canonical row total. */\n  series?: {name:string;value:number;color?:string}[];\n  z?: number;\n  group?: string;\n  progress?:number;intensity?:number;\n  activity?:[number,number,number];\n  date?:string;\n  color?: string;\n  icon?: ReactNode|React.ComponentType<{size?:number}>;matrixRow?:number;matrixColumn?:number;sourceColor?:string;\n};\nexport type ModernChartProps = FamilyProps & {\n  id: ChartKind;\n  /** Source-shaped canonical presentation; advanced inspection stays available in the interactive library. */\n  presentation?: 'interactive'|'source';periodPresentation?:'segmented'|'date';\n  /** @internal Keeps canonical documentation tick placement separate from fluid and supplied-data cards. */\n  sourceDefaultLayout?:boolean;\n  data?: (ChartDatum|ChartInputDatum)[];\n  series?:ChartSeries[];bar?:ChartSeries;line?:ChartSeries;stages?:ChartStage[];items?:ChartStage[];tabs?:ChartListTab[];rows?:ChartMatrixRow[];columns?:string[];nodes?:ChartFlowNode[];links?:ChartFlowLink[];max?:number;color?:string;metric?:'value'|'share';tiles?:boolean;showIcons?:boolean;\n  ranges?:ChartRange[];range?:string;defaultRange?:string;onRangeChange?:(id:string,range:ChartRange)=>void;tab?:string;defaultTab?:string;onTabChange?:(id:string)=>void;headline?:string|number;delta?:number;\n  onSelect?:(row:ChartDatum,index:number)=>void;\n  title?: string;\n  unit?: ChartUnit;\n  /** Use straight chart segments instead of the default smooth curve. */\n  shape?: 'curved' | 'sharp';\n  /** Dashboard composition without repeated documentation labels. */\n  compact?: boolean;\n  variant?: ChartVariant;\n  mono?: boolean;\n  limit?: number;\n  bubble?: boolean;\n  axisLabels?: [string,string];\n  defaultSelected?:number;\n};\nexport type ResolvedChartDatum = ChartDatum & { key: string; color: string; goal?: number };\nexport type ChartSnapshot = {\n  spec: ChartDefinition;\n  unit: ChartUnit;\n  rows: ResolvedChartDatum[];\n  supportsComparison: boolean;\n  periods: { value: string; label: string }[];\n  periodLabel: string;\n  categoryLabel: string;\n};\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst palette=Array.from({length:9},(_,index)=>`var(--color-chart-${index+1})`);\nconst familyChartColors:Record<string,number[]>={\n 'activity-rings-card':[3,2,4],'area-chart-card':[2,6,5],'bar-list-card':[6],\n 'combo-chart-card':[2,6],'contributions-card':[5],'earnings-chart-card':[2],\n 'funnel-chart-card':[2,6,5,3,8,7],'heatmap-chart-card':[6],'line-chart-card':[2],\n 'most-active-days-card':[3,2,4],'orders-chart-card':[9,6],'radar-chart-card':[2,6],\n 'radial-chart-card':[2,6,5,3,8],'revenue-chart-card':[2,6],\n 'sankey-chart-card':[7,5,8,6,3],'scatter-chart-card':[2,6,5],\n 'sleep-score-card':[5,3,4],'stage-bars-card':[2,6,5,3,8,7],'steps-card':[1]\n};\nconst familyPalette=(id:string)=>(familyChartColors[id]||[1,2,3]).map(index=>`var(--color-chart-${index})`);\nconst activeChartColor=(color:string)=>color==='var(--color-foreground-icon-secondary)'?'var(--color-foreground-icon-primary)':color.replace(/--color-chart-(\\d+)\\)/,'--color-chart-$1-active)');\n\nconst monthly: ChartDatum[] = months.map((name, index) => ({\n  name,\n  value: [420, 510, 460, 680, 590, 720, 640, 850, 760, 940, 830, 920][index],\n  previous: [360, 460, 390, 590, 520, 660, 570, 730, 690, 800, 790, 850][index],\n}));\nconst sum = (rows: ChartDatum[], key: 'value' | 'previous' | 'secondary' = 'value') =>\n  rows.reduce((total, row) => total + (key === 'value' ? row.value : (row[key] ?? 0)), 0);\nconst round = (value: number, decimals = 0) => Math.round(value * 10 ** decimals) / 10 ** decimals;\nconst cleanNumber = (value: number | undefined) => (Number.isFinite(value) ? (value as number) : 0);\nconst number = new Intl.NumberFormat('en-IN', { maximumFractionDigits: 2 });\nexport const formatChartValue = (value: number, unit: ChartUnit, pointUnit?: string) =>\n  pointUnit\n    ? `${number.format(value)} ${pointUnit}`\n    : unit === 'currency'\n      ? new Intl.NumberFormat('en-IN', {\n          style: 'currency',\n          currency: 'INR',\n          maximumFractionDigits: 2,\n          minimumFractionDigits: 0,\n        }).format(value)\n      : unit === 'percent'\n        ? `${number.format(value)}%`\n        : number.format(value);\n\nfunction fixture(spec: ChartDefinition): ChartDatum[] {\n  switch (spec.id) {\n    case 'area-chart-card':\n      return monthly.map((row,index)=>{const organic=round(row.value*(.48+(index%4)*.025),2),referral=round(row.value*(.25+(index%3)*.015),2);return {...row,series:[{name:'Organic',value:organic},{name:'Referral',value:referral},{name:'Paid',value:round(row.value-organic-referral,2)}]}});\n    case 'combo-chart-card':\n      return monthly.map((row,index)=>({...row,secondary:[2.4,2.6,2.8,2.7,3,3.2,3.4,3.3,3.6,3.5,3.8,4.1][index]}));\n    case 'activity-rings-card':\n      return [\n        { name: 'Move', value: 1592, goal: 2000, unit: 'kcal' },\n        { name: 'Exercise', value: 105, goal: 120, unit: 'min' },\n        { name: 'Running', value: 5.2, goal: 8, unit: 'km' },\n      ];\n    case 'bar-list-card':\n      return [\n        { name: 'Organic search', value: 7823 },\n        { name: 'Direct', value: 6220 },\n        { name: 'Social', value: 4180 },\n        { name: 'Referral', value: 2890 },\n        { name: 'Email', value: 1460 },\n      ];\n    case 'funnel-chart-card':\n      return [\n        { name: 'Link opened', value: 197 },\n        { name: 'Started', value: 110 },\n        { name: 'Completed', value: 77 },\n        { name: 'Converted', value: 38 },\n      ];\n    case 'radar-chart-card':\n      return ['January', 'February', 'March', 'April', 'May', 'June'].map((name, index) => ({\n        name,\n        value: [186, 305, 237, 273, 209, 214][index],\n        previous: [80, 200, 120, 190, 130, 140][index],\n      }));\n    case 'radial-chart-card':\n      return [\n        { name: 'Other', value: 90, goal: 300 },\n        { name: 'Edge', value: 173, goal: 300 },\n        { name: 'Firefox', value: 187, goal: 300 },\n        { name: 'Safari', value: 200, goal: 300 },\n        { name: 'Chrome', value: 275, goal: 300 },\n      ];\n    case 'sankey-chart-card':\n      return [\n        { name: 'Focus → Browsing', source: 'Focus', target: 'Browsing', value: 16.2, unit: 'h' },\n        { name: 'Focus → Writing', source: 'Focus', target: 'Writing', value: 11.6, unit: 'h' },\n        { name: 'Focus → Email', source: 'Focus', target: 'Email', value: 4.2, unit: 'h' },\n        {\n          name: 'Meetings → Video calls',\n          source: 'Meetings',\n          target: 'Video calls',\n          value: 12,\n          unit: 'h',\n        },\n        {\n          name: 'Meetings → Messaging',\n          source: 'Meetings',\n          target: 'Messaging',\n          value: 6,\n          unit: 'h',\n        },\n        { name: 'Breaks → Browsing', source: 'Breaks', target: 'Browsing', value: 2.4, unit: 'h' },\n        {\n          name: 'Breaks → Everything else',\n          source: 'Breaks',\n          target: 'Everything else',\n          value: 9.6,\n          unit: 'h',\n        },\n        { name: 'Admin → Email', source: 'Admin', target: 'Email', value: 6, unit: 'h' },\n        {\n          name: 'Admin → Productivity',\n          source: 'Admin',\n          target: 'Productivity',\n          value: 8,\n          unit: 'h',\n        },\n        { name: 'Learning → Writing', source: 'Learning', target: 'Writing', value: 4, unit: 'h' },\n        {\n          name: 'Learning → Everything else',\n          source: 'Learning',\n          target: 'Everything else',\n          value: 6,\n          unit: 'h',\n        },\n      ];\n    case 'sleep-score-card':\n      return [\n        { name: 'Duration', value: 49, goal: 50 },\n        { name: 'Bedtime', value: 29, goal: 30 },\n        { name: 'Interruptions', value: 20, goal: 20 },\n      ];\n    case 'stage-bars-card':\n      return [\n        { name: 'Visits', value: 1180 },\n        { name: 'Sign-up', value: 790 },\n        { name: 'Active', value: 460 },\n        { name: 'Pro', value: 250 },\n        { name: 'Team', value: 120 },\n        { name: 'Enterprise', value: 40 },\n      ];\n    case 'scatter-chart-card':\n      return Array.from({ length: 12 }, (_, index) => ({\n        name: `Sample ${index + 1}`,\n        z: [40,60,32,48,75,53,94,66,101,79,122,110][index],\n        x: [18, 25, 33, 41, 46, 54, 62, 68, 75, 82, 89, 96][index],\n        value: [70, 110, 130, 180, 160, 240, 220, 290, 310, 280, 360, 390][index],\n      }));\n    case 'contributions-card':\n      return Array.from({ length: 371 }, (_, index) => ({\n        name: `Week ${Math.floor(index / 7) + 1} · ${['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'][index % 7]}`,\n        value: (index * 7 + (index % 5) * 3) % 24,\n      }));\n    case 'heatmap-chart-card':\n      return Array.from({ length: 168 }, (_, index) => ({\n        name: `${['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'][Math.floor(index / 24)]} ${String(index % 24).padStart(2, '0')}:00`,\n        value: (index * 11 + (index % 4) * 3) % 40,\n      }));\n    case 'most-active-days-card':\n      return Array.from({ length: 31 }, (_, index) => ({\n        name: `Oct ${index + 1}`,\n        value: 350 + ((index * 127 + (index % 5) * 63) % 1300),\n      }));\n    case 'orders-chart-card':\n      return monthly.map((row, index) => ({\n        ...row,\n        value: [42, 51, 46, 68, 59, 72, 64, 85, 76, 94, 83, 92][index],\n        previous: [36, 46, 39, 59, 52, 66, 57, 73, 69, 80, 79, 85][index],\n      }));\n    case 'steps-card':\n      return ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'].map((name, index) => ({\n        name,\n        value: [3300, 3800, 3600, 4200, 3900, 4500, 4100][index],\n        previous: [3000, 3400, 3250, 3800, 3600, 4100, 3700][index],\n      }));\n    case 'revenue-chart-card':\n      return monthly.map((row) => ({\n        ...row,\n        value: row.value * 10,\n        previous: (row.previous ?? 0) * 10,\n      }));\n    default:\n      return monthly.map((row) => ({ ...row }));\n  }\n}\nconst standardPeriods = [\n  { value: '12', label: '12 months' },\n  { value: '6', label: '6 months' },\n  { value: '3', label: 'Last quarter' },\n];\nconst categoryPeriods = [\n  { value: '12', label: 'Latest sample' },\n  { value: '6', label: 'Previous sample' },\n  { value: '3', label: 'Earlier sample' },\n];\n/** One canonical dataset drives the Recharts marks, headline, keyboard inspection and table. */\nexport function resolveChartSnapshot(\n  id: string,\n  data: ChartDatum[] | undefined,\n  period = '12',\n  unitOverride?: ChartUnit,\n  preserveData = false,\n): ChartSnapshot {\n  const spec = chartDefinitions.find((item) => item.id === id);\n  if (!spec) throw new Error(`Unknown chart family: ${id}`);\n  let rows = (data ?? fixture(spec)).map((row) => ({\n    ...row,\n    series: row.series?.map(part=>({...part,value:Math.max(0,cleanNumber(part.value))})),\n    secondary:row.secondary===undefined?undefined:cleanNumber(row.secondary),\n    z:row.z===undefined?undefined:Math.max(0,cleanNumber(row.z)),\n    value: row.series?.length?row.series.reduce((total,part)=>total+Math.max(0,cleanNumber(part.value)),0):['area', 'line', 'bar', 'combo', 'scatter'].includes(spec.type)\n      ? cleanNumber(row.value)\n      : Math.max(0, cleanNumber(row.value)),\n    previous: row.previous === undefined ? undefined : cleanNumber(row.previous),\n    goal: row.goal === undefined ? undefined : cleanNumber(row.goal),\n    x: row.x === undefined ? undefined : cleanNumber(row.x),\n  }));\n  const canonicalRows=rows;\n  let periods = standardPeriods,\n    categoryLabel = 'Period';\n  const categorical = ['rings', 'list', 'funnel', 'radial', 'sankey', 'score', 'stages'].includes(\n    spec.type,\n  );\n  if (categorical) {\n    periods = categoryPeriods;\n    categoryLabel =\n      spec.type === 'sankey'\n        ? 'Flow'\n        : spec.type === 'stages' || spec.type === 'funnel'\n          ? 'Stage'\n          : 'Metric';\n    const factor = period === '6' ? 0.86 : period === '3' ? 0.72 : 1;\n    rows = rows.map((row) => ({\n      ...row,\n      value:\n        factor === 1\n          ? row.value\n          : round(\n              row.value * factor,\n              data ||\n                unitOverride === 'currency' ||\n                spec.unit === 'currency' ||\n                row.unit === 'h' ||\n                row.unit === 'km'\n                ? 2\n                : 0,\n            ),\n      previous: row.previous === undefined ? undefined : round(row.previous * factor),\n    }));\n  } else if (spec.type === 'radar') {\n    categoryLabel = 'Axis';\n    periods = [\n      { value: '12', label: 'H1 sample' },\n      { value: '6', label: 'H2 sample' },\n      { value: '3', label: 'Year sample' },\n    ];\n    if (data) {\n      const factor = period === '6' ? 1.13 : period === '3' ? 1.9 : 1;\n      rows = rows.map((row) => ({\n        ...row,\n        value: round(row.value * factor),\n        previous: row.previous === undefined ? undefined : round(row.previous * factor),\n      }));\n    } else if (period !== '12') {\n      const second = rows.map((row, index) => ({\n        ...row,\n        name: ['July', 'August', 'September', 'October', 'November', 'December'][index],\n        value: round(row.value * 1.13),\n        previous: round((row.previous ?? 0) * 1.08),\n      }));\n      rows = period === '3' ? [...rows, ...second] : second;\n    }\n  } else if (spec.type === 'contributions') {\n    periods = [\n      { value: '12', label: 'Yearly' },\n      { value: '6', label: '6 months' },\n      { value: '3', label: '3 months' },\n    ];\n    rows = rows.slice(-(period==='12'?371:period==='6'?182:91));\n    categoryLabel = 'Day';\n  } else if (spec.type === 'heatmap') {\n    periods = [\n      { value: '12', label: '24 daily hours' },\n      { value: '6', label: '12 daily hours' },\n      { value: '3', label: '6 daily hours' },\n    ];\n    rows = rows.filter((_, index) => index % 24 >= 24 - Number(period)*2);\n    categoryLabel = 'Day and hour';\n  } else if (spec.type === 'days') {\n    periods = [\n      { value: '12', label: 'This month' },\n      { value: '6', label: 'Last 14 days' },\n      { value: '3', label: 'Last 7 days' },\n    ];\n    rows = rows.slice(-(period === '12' ? 31 : period === '6' ? 14 : 7));\n    categoryLabel = 'Day';\n  } else if (id === 'steps-card') {\n    periods = [\n      { value: '12', label: 'This week' },\n      { value: '6', label: 'Last 5 days' },\n      { value: '3', label: 'Last 3 days' },\n    ];\n    rows = rows.slice(-(period === '12' ? 7 : period === '6' ? 5 : 3));\n    categoryLabel = 'Day';\n  } else {\n    rows = rows.slice(-Number(period));\n    if (spec.type === 'scatter') categoryLabel = 'Sample';\n  }\n  if(preserveData)rows=canonicalRows;\n  if (['rings', 'radial', 'score'].includes(spec.type)) {\n    const fallbackGoal =\n      spec.type === 'score'\n        ? 100 / Math.max(1, rows.length)\n        : Math.max(1, ...rows.map((row) => row.value)) * 1.1;\n    rows = rows.map((row) => ({ ...row, goal: Math.max(1, row.goal ?? fallbackGoal) }));\n  }\n  if (spec.type === 'sankey')\n    rows = rows\n      .map((row) => {\n        const [from, to] = row.name.split(/\\s*→\\s*/);\n        return {\n          ...row,\n          source: row.source || (to ? from : 'Source'),\n          target: row.target || to || row.name,\n        };\n      })\n      .filter((row) => row.source !== row.target);\n  if (spec.type === 'scatter')\n    rows = rows.map((row, index) => ({ ...row, x: row.x ?? row.previous ?? index + 1 }));\n  const supportsComparison =\n    ['area', 'bar', 'combo', 'line', 'radar'].includes(spec.type) &&\n    rows.some((row) => row.previous !== undefined);\n  return {\n    spec,\n    unit: unitOverride ?? spec.unit,\n    rows: rows.map((row, index) => ({\n      ...row,\n      key: `${index}-${row.name}`,\n      color: row.color || familyPalette(id)[index%familyPalette(id).length],\n      unit: unitOverride ? undefined : row.unit,\n    })),\n    supportsComparison,\n    periods,\n    periodLabel: periods.find((item) => item.value === period)?.label ?? periods[0].label,\n    categoryLabel,\n  };\n}\nfunction goalPercent(rows: ChartDatum[]) {\n  return rows.length\n    ? (rows.reduce(\n        (total, row) => total + Math.min(1, row.value / Math.max(1, row.goal ?? 100)),\n        0,\n      ) /\n        rows.length) *\n        100\n    : 0;\n}\nfunction weightedScore(rows: ChartDatum[]) {\n  const goal = rows.reduce((total, row) => total + (row.goal ?? 0), 0);\n  return goal ? (sum(rows) / goal) * 100 : 0;\n}\nfunction flowData(rows: ResolvedChartDatum[],colors=palette,sourcePresentation=false) {\n  const preferred=['Browsing','Writing','Messaging','Productivity','Email','Video calls','Everything else'];\n  const sourcesOnly=[...new Set(rows.map(row=>row.source||'Source'))],targetsOnly=[...new Set(rows.map(row=>row.target||row.name))];\n  const names=sourcePresentation?[...new Set([...sourcesOnly,...(targetsOnly.every(name=>preferred.includes(name))?preferred.filter(name=>targetsOnly.includes(name)):targetsOnly)])]:[...new Set(rows.flatMap(row=>[row.source||'Source',row.target||row.name]))];\n  const sources=[...new Set(rows.map(row=>row.source||'Source'))];\n  return {\n    nodes: names.map((name) => ({ name, isSource: rows.some((row) => row.source === name),color:rows.find(row=>row.source===name)?.sourceColor||colors[Math.max(0,sources.indexOf(name))%colors.length] })),\n    links: rows.map((row,rowIndex) => ({\n      rowIndex,\n      source: names.indexOf(row.source || 'Source'),\n      target: names.indexOf(row.target || row.name),\n      value: row.value,\n      color:row.sourceColor||colors[sources.indexOf(row.source || 'Source') % colors.length],\n    })),\n  };\n}\n\nfunction useAnimatedHeadline(value: string, reduced: boolean) {\n  const [display,setDisplay] = useState(value), previous=useRef('0');\n  useEffect(()=>{\n    const end=Number(value.replace(/[^0-9.\\-]/g,'')), start=Number(previous.current.replace(/[^0-9.\\-]/g,''));\n    previous.current=value;\n    if(reduced || !/[0-9]/.test(value) || value.includes('-') || !Number.isFinite(end) || !Number.isFinite(start) || value.includes('/')) {setDisplay(value);return;}\n    let frame=0, started=0;\n    const animate=(now:number)=>{if(!started)started=now;const t=Math.min(1,(now-started)/500),numberValue=start+(end-start)*(1-Math.pow(1-t,3));setDisplay(t===1?value:value.replace(/[0-9][0-9,.]*/,number.format(round(numberValue,end%1?1:0))));if(t<1)frame=requestAnimationFrame(animate)};\n    frame=requestAnimationFrame(animate);return()=>cancelAnimationFrame(frame);\n  },[value,reduced]);\n  return reduced ? value : display;\n}\n\n/** A stable element type keeps keyboard focus when inspecting a polar-axis label. */\nfunction RadarAxisTick({x,y,payload,index=0,textAnchor,rows,hovered,selected,disabled,sourcePresentation,variant,formatValue,onInspect,onClear}:{x?:number|string;y?:number|string;payload?:{value?:string|number};index?:number;textAnchor?:'start'|'middle'|'end'|'inherit';rows:ResolvedChartDatum[];hovered:boolean;selected:number;disabled:boolean;sourcePresentation:boolean;variant:ChartVariant;formatValue:(row:ChartDatum)=>string;onInspect:(index:number,emphasize?:boolean,notify?:boolean)=>void;onClear:()=>void}){\n const value=payload?.value??rows[index]?.name??'';\n return <BoundedChartText x={x} y={y} textAnchor={textAnchor} dominantBaseline=\"middle\" fill={hovered&&selected===index?'var(--hu-text)':'var(--hu-muted)'} fontSize={sourcePresentation&&variant==='score'?11:sourcePresentation?12:10} role=\"button\" aria-disabled={disabled} tabIndex={disabled?-1:0} aria-label={`${value}: ${rows[index]?formatValue(rows[index]):''}`} onFocus={()=>onInspect(index,true,false)} onBlur={onClear} onMouseEnter={()=>onInspect(index,true,false)} onClick={()=>onInspect(index,true,true)} onKeyDown={event=>{if(!disabled&&(event.key==='Enter'||event.key===' ')){event.preventDefault();onInspect(index,true,true)}}}>{sourcePresentation&&variant==='score'&&rows[index]?<><tspan x={x} dy={-5}>{value}</tspan><tspan x={x} dy={17} fontSize={16} fill={rows[index].value<30?'var(--color-status-rose-text)':'var(--color-text-primary)'}>{formatValue(rows[index])}</tspan></>:<>{value}{variant==='score'&&rows[index]?` ${formatValue(rows[index])}`:''}</>}</BoundedChartText>;\n}\n\n/** Nineteen Recharts-backed families. Every mark and alternative uses the same resolved source rows. */\nexport function ModernChart({\n  id,\n  data: rawData,series,bar,line,stages,items,tabs,rows:matrixRows,columns,nodes,links,max,color,metric='value',tiles=true,showIcons=true,ranges,range:controlledRange,defaultRange,onRangeChange,tab:controlledTab,defaultTab,onTabChange,headline:providedHeadline,delta:providedDelta,\n  title,onSelect,\n  unit: unitOverride,\n  shape = 'curved',\n  compact = false,\n  variant = 'default',\n  mono = false,\n  limit = 4,\n  bubble: bubbleOverride,\n  axisLabels,\n  defaultSelected=0,\n  presentation = 'interactive',periodPresentation,sourceDefaultLayout=false,\n  state = 'ready',\n  onRetry,\n  disabled = false,\n}: ModernChartProps) {\n  const sourcePresentation=presentation==='source';\n  const [sourcePhone,setSourcePhone]=useState(false);\n  useEffect(()=>{if(!sourcePresentation||!['earnings-chart-card','line-chart-card'].includes(id)){setSourcePhone(false);return}const query=window.matchMedia('(max-width:639px)'),update=()=>setSourcePhone(query.matches);update();query.addEventListener('change',update);return()=>query.removeEventListener('change',update)},[id,sourcePresentation]);\n  const {direction,locale}=useDirection();\n  const uid = useId().replaceAll(':', ''),\n    reduced = useReducedMotion();\n  const [periodValue,setPeriodValue]=useState(defaultRange||'12'),\n    [currentVisible, setCurrentVisible] = useState(true),\n    [previousVisible, setPreviousVisible] = useState(\n      (variant === 'comparison'||variant==='lines') || ['combo-chart-card', 'orders-chart-card', 'revenue-chart-card'].includes(id),\n    ),\n    [selected, setSelected] = useState(defaultSelected),\n    [listCategoryValue,setListCategoryValue]=useState(defaultTab||'Devices'),\n    [hovered, setHovered] = useState(false),\n    [dataOpen,setDataOpen]=useState(false),\n    [plotWidth,setPlotWidth]=useState(500),\n    [monthOffset,setMonthOffset]=useState(0),\n    [listExpanded,setListExpanded]=useState(false),\n    [hoverOverride,setHoverOverride]=useState<ChartDatum|null>(null),\n    [flowFocus,setFlowFocus]=useState<{node?:string;link?:number}|null>(null);\n  const rangeKey=(item:ChartRange,index:number)=>item.id||item.value||String(index),customRanges=!!ranges?.length,activeRange=customRanges?(ranges!.find((item,index)=>rangeKey(item,index)===(controlledRange??periodValue))||ranges![0]):undefined,period=activeRange?rangeKey(activeRange,ranges!.indexOf(activeRange)):periodValue,listCategory=controlledTab??listCategoryValue;\n  const setPeriod=(next:string)=>{setPeriodValue(next);const choice=ranges?.find((item,index)=>rangeKey(item,index)===next);if(choice)onRangeChange?.(next,choice)},setListCategory=(next:string)=>{setListCategoryValue(next);onTabChange?.(next)};\n  const publicInput=useMemo(()=>normalizePublicChartInput(id,{data:rawData,series,bar,line,stages,items,tabs,rows:matrixRows,columns,nodes,links,max,color},activeRange,listCategory),[id,rawData,series,bar,line,stages,items,tabs,matrixRows,columns,nodes,links,max,color,activeRange,listCategory]);\n  const data=publicInput.data??(customRanges?[]:undefined),customData=publicInput.custom||customRanges,basePalette=familyPalette(id),plotPalette=mono?['var(--color-foreground-icon-secondary)']:publicInput.colors?.length?publicInput.colors.map((value,index)=>value||basePalette[index%basePalette.length]):bar?.color||line?.color?[bar?.color||basePalette[0],line?.color||basePalette[1%basePalette.length]]:color?[color,...basePalette.slice(1)]:basePalette;\n  useEffect(()=>{if(disabled){setHovered(false);setHoverOverride(null);setFlowFocus(null);setDataOpen(false)}},[disabled]);\n  const sourceComparison=['orders-chart-card','revenue-chart-card'].includes(id),currentSeriesColor=!mono&&sourceComparison?activeChartColor(plotPalette[0]):plotPalette[0],previousSeriesColor=!mono&&sourceComparison?'var(--color-chart-neutral)':plotPalette[1%plotPalette.length];\n  const dataTrigger=useRef<HTMLButtonElement>(null);\n  const calendarRef=useRef<HTMLDivElement>(null),monthWheel=useRef(0);\n  useEffect(()=>{const element=calendarRef.current;if(!element||id!=='most-active-days-card'||data||disabled)return;const wheel=(event:WheelEvent)=>{const boundary=event.deltaY>0?element.scrollTop+element.clientHeight>=element.scrollHeight-3:element.scrollTop<=1;if(!boundary||Math.abs(event.deltaY)<20||performance.now()-monthWheel.current<550)return;event.preventDefault();monthWheel.current=performance.now();setMonthOffset(value=>value+(event.deltaY>0?1:-1));setSelected(0);requestAnimationFrame(()=>{element.scrollTop=event.deltaY>0?0:element.scrollHeight})};element.addEventListener('wheel',wheel,{passive:false});return()=>element.removeEventListener('wheel',wheel)},[id,data,disabled,state]);\n  const categoryData: Record<string, ChartDatum[]> = {\n    Devices: [{name:'Desktop',value:61,icon:'▱'},{name:'Mobile',value:31,icon:'▯'},{name:'Tablet',value:8,icon:'▭'}],\n    Browsers: [{name:'Chrome',value:58},{name:'Safari',value:24},{name:'Firefox',value:12},{name:'Edge',value:6}],\n    Countries: [{name:'India',value:2160,icon:'🇮🇳'},{name:'United States',value:3120,icon:'🇺🇸'},{name:'Germany',value:1320,icon:'🇩🇪'},{name:'United Kingdom',value:980,icon:'🇬🇧'},{name:'France',value:620,icon:'🇫🇷'},{name:'Japan',value:410,icon:'🇯🇵'}],\n    Sources: [{name:'Direct',value:5240},{name:'Organic search',value:4180},{name:'Referral',value:2780},{name:'Social',value:1830},{name:'Email',value:940},{name:'Other',value:310}],\n    'Operating systems': [{name:'macOS',value:45},{name:'Windows',value:34},{name:'iOS',value:14},{name:'Android',value:7}],\n  };\n  const monthDate=new Date(2026,9+monthOffset,1), monthName=monthDate.toLocaleDateString('en-IN',{month:'long',year:'numeric'});\n  const monthRows=Array.from({length:new Date(2026,10+monthOffset,0).getDate()},(_,index)=>({name:`${monthDate.toLocaleDateString('en-IN',{month:'short'})} ${index+1}`,value:350+((index*127+(index%5)*63+Math.abs(monthOffset)*89)%1300)}));\n  const plottedData = id==='most-active-days-card'&&!data?monthRows:id === 'bar-list-card' && !data && listCategory !== 'Traffic' ? categoryData[listCategory] : data;\n  useEffect(()=>{setPreviousVisible(variant==='comparison'||variant==='lines'||['combo-chart-card','orders-chart-card','revenue-chart-card'].includes(id))},[variant,id]);\n  const snapshot = useMemo(\n    () => resolveChartSnapshot(id, plottedData, customRanges?'12':period, unitOverride,customData),\n    [id, plottedData, period, unitOverride,customRanges,customData],\n  );\n  const {spec,unit,supportsComparison:comparisonAvailable,categoryLabel}=snapshot,periods=customRanges?ranges!.map((item,index)=>({value:rangeKey(item,index),label:item.label})):snapshot.periods,periodLabel=activeRange?.label||snapshot.periodLabel;\n  const rows=useMemo(()=>mono?snapshot.rows.map(row=>({...row,color:'var(--color-foreground-icon-secondary)',sourceColor:undefined})):snapshot.rows,[mono,snapshot.rows]),bubble=bubbleOverride??rows.some(row=>row.z!==undefined);\n  const secondaryMode=spec.type==='combo'&&rows.some(row=>row.secondary!==undefined);\n  const supportsComparison=(comparisonAvailable||secondaryMode)&&!(['area-chart-card','radar-chart-card'].includes(id)&&rows.some(row=>row.series?.length));\n  const areaNames=[...new Set(rows.flatMap(row=>row.series?.map(part=>part.name)||[]))];if(!areaNames.length)areaNames.push('Current');\n  const areaValue=(row:ChartDatum,name:string)=>row.series?.length?(row.series.find(part=>part.name===name)?.value??0):row.value;\n  const formatSeries=(name:string,value:number)=>publicInput.series?.find(part=>(part.label||part.name||part.key||part.dataKey||part.field)===name)?.format?.(value)??formatChartValue(value,unit);\n  const scatterGroup=(row:ChartDatum,index:number)=>row.group??['Starter','Growth','Scale'][Math.min(2,Math.floor(index*3/Math.max(1,rows.length)))];\n  const scatterGroups=[...new Set(rows.map(scatterGroup))];\n  const scatterPercentMax=Math.max(4,Math.ceil(Math.max(0,...rows.map(row=>row.value))/4)*4),customScatter=rawData!==undefined||series!==undefined||unit==='percent';\n\n  const areaRows=rows.map(row=>({...row,...Object.fromEntries(areaNames.map((name,index)=>[`part${index}`,variant==='percent'?(row.value?areaValue(row,name)/row.value*100:0):areaValue(row,name)]))}));\n  const sourceRadarComparison=sourcePresentation&&spec.type==='radar'&&supportsComparison&&['comparison','lines'].includes(variant);\n  const previousShown = supportsComparison && previousVisible,\n    visible = currentVisible || previousShown,\n    goals = ['rings', 'radial', 'score'].includes(spec.type)&&variant!=='stacked',\n    primary = currentVisible ? 'value' : secondaryMode?'secondary':'previous';\n  const inspectableRows = currentVisible\n    ? rows\n    : previousShown\n      ? rows.filter((row) => secondaryMode?row.secondary!==undefined:row.previous !== undefined)\n      : [];\n  const candidate = rows[Math.min(selected, rows.length - 1)];\n  const active = inspectableRows.includes(candidate) ? candidate : inspectableRows[0];\n  const secondaryLegendValue=sourcePresentation&&hovered&&active?active.secondary??0:round(sum(rows,'secondary')/Math.max(1,rows.filter(row=>row.secondary!==undefined).length),sourcePresentation?1:2);\n  const flowSources=new Set(rows.map(row=>row.source)),flowTargets=new Set(rows.map(row=>row.target)),rootFlowRows=rows.filter(row=>flowSources.has(row.source)&&!flowTargets.has(row.source));\n  const primaryTotal = secondaryMode&&primary==='secondary'?sum(rows,'secondary')/Math.max(1,rows.filter(row=>row.secondary!==undefined).length):spec.type==='sankey'?sum(rootFlowRows,primary):sum(rows,primary),\n    pointValue = (point: ChartDatum, key: 'value' | 'previous' | 'secondary' = primary) =>\n      key === 'value' ? point.value : (point[key] ?? 0);\n  const pointUnit = spec.type === 'score' && unit === 'percent' ? 'count' : unit;\n  const formatPoint = (point: ChartDatum, key: 'value' | 'previous' | 'secondary' = primary) =>\n    sourcePresentation&&point.unit==='min'&&key==='value'?`${Math.floor(point.value/60)}h ${number.format(point.value%60)}m`:key === 'previous' && point.previous === undefined\n      ? '—'\n      : key==='secondary'?(line?.format?.(pointValue(point,key))??`${number.format(pointValue(point,key))}%`):(bar?.format?.(pointValue(point,key))??formatChartValue(pointValue(point, key), pointUnit, point.unit));\n  const radarHandlers=useRef<{inspect:(index:number,emphasize?:boolean,notify?:boolean)=>void;clear:()=>void}|null>(null);\n  const radarAngleAxis=useMemo(()=><PolarAngleAxis dataKey=\"name\" tick={<RadarAxisTick rows={rows} hovered={false} selected={-1} disabled={disabled} sourcePresentation={sourcePresentation} variant={variant} formatValue={row=>formatPoint(row,'value')} onInspect={(index,emphasize,notify)=>radarHandlers.current?.inspect(index,emphasize,notify)} onClear={()=>radarHandlers.current?.clear()}/>}/>,[rows,disabled,sourcePresentation,variant,unit,bar?.format]);\n  const radarRadiusAxis=useMemo(()=><PolarRadiusAxis tick={false} domain={sourcePresentation?[0,'dataMax']:undefined}/>,[sourcePresentation]);\n  let headline = visible ? formatChartValue(primaryTotal, unit, rows[0]?.unit) : '—',\n    headlineLabel = currentVisible\n      ? 'Current period total'\n      : previousShown\n        ? 'Previous period total'\n        : 'No visible series';\n  if(visible&&primary==='secondary'){headline=line?.format?.(primaryTotal)??`${number.format(round(primaryTotal,2))}%`;headlineLabel='Average conversion rate';}\n  if (currentVisible && (spec.type === 'funnel' || spec.type === 'stages')) {\n    headline = formatChartValue(rows[0]?.value ?? 0, unit);\n    headlineLabel = spec.type === 'funnel' ? 'Top of funnel' : 'Entered pipeline';\n  }\n  if (currentVisible && spec.type === 'rings') {\n    headline = `${number.format(round(goalPercent(rows), 1))}%`;\n    headlineLabel = 'Average goal completion';\n  }\n  if (currentVisible && spec.type === 'score') {\n    headline = `${number.format(round(weightedScore(rows), 1))}/100`;\n    headlineLabel = `${number.format(sum(rows))} of ${number.format(rows.reduce((total, row) => total + (row.goal ?? 0), 0))} score points`;\n  }\n  if(currentVisible&&bar?.format){headline=bar.format(primaryTotal)}\n  const customHeadline=activeRange?.headline??providedHeadline;if(currentVisible&&customHeadline!==undefined){headline=typeof customHeadline==='number'?formatChartValue(customHeadline,unit):customHeadline;headlineLabel='Provided headline';}\n  if (currentVisible && customHeadline===undefined && spec.type === 'sankey') headlineLabel = 'Total flow across source links';\n  if (currentVisible && customHeadline===undefined && spec.type === 'scatter') headlineLabel = 'Sum of plotted Y values';\n  const comparisonRows = !customData&&!rows.some(row=>row.previous!==undefined) && period!=='3' && ['funnel','stages','radial','sankey'].includes(spec.type) ? resolveChartSnapshot(id,plottedData,period==='12'?'6':'3',unitOverride).rows : undefined;\n  const firstMetric=['funnel','stages'].includes(spec.type), previousTotal=comparisonRows ? (firstMetric?comparisonRows[0]?.value??0:sum(comparisonRows)) : sum(rows,'previous'), currentTotal=firstMetric?rows[0]?.value??0:sum(rows);\n  const delta=activeRange?.delta??providedDelta??(previousTotal>0?((currentTotal-previousTotal)/previousTotal)*100:undefined);\n  const curve = shape === 'sharp' ? 'linear' : 'monotone';\n  const plotHeight = sourcePresentation ? (sourcePhone&&['earnings-chart-card','line-chart-card'].includes(id)?181:!tiles&&id==='radar-chart-card'?(variant==='lines'?189:variant==='score'?253:229):!tiles&&id==='radial-chart-card'?(variant==='stacked'?189:229):(sourceChartProfiles[id]?.plotHeight??221)) : spec.type==='score' ? (compact?130:190) : compact ? 210 : 230;\n  if(!disabled&&hovered && active && visible && !['score','rings','days'].includes(spec.type)){headline=formatPoint(active);headlineLabel=active.name;}\n  if(!disabled&&hoverOverride&&visible){headline=formatChartValue(hoverOverride.value,unit,hoverOverride.unit);headlineLabel=hoverOverride.name;}\n  const animatedHeadline = useAnimatedHeadline(headline, !!reduced);\n  const commonUnit = rows.every((row) => row.unit === rows[0]?.unit) ? rows[0]?.unit : undefined;\n  const valueFormat = (value: unknown) =>\n    bar?.format?.(cleanNumber(Number(value)))??(sourcePresentation&&commonUnit==='h'?`${number.format(cleanNumber(Number(value)))}h`:formatChartValue(cleanNumber(Number(value)), pointUnit, commonUnit));\n  const tooltip = (\n    <ChartTooltip\n      content={sourcePresentation?()=>null:undefined}\n      active={disabled||!visible?false:undefined}\n      cursor={['bar','combo'].includes(spec.type)?{fill:'var(--color-chart-cursor)',fillOpacity:.15}:{stroke:'var(--color-chart-cursor)',strokeDasharray:'3 3'}}\n      isAnimationActive={reduced===false} animationDuration={sourcePresentation?450:undefined}\n      formatter={(value,name) => name==='Conversion'?(line?.format?.(Number(value))??`${number.format(Number(value))}%`):spec.type==='area'&&variant==='percent'?`${number.format(Number(value))}%`:publicInput.series?.length?formatSeries(String(name),Number(value)):valueFormat(value)}\n      contentStyle={{\n        background: 'var(--hu-bg)',\n        border: '1px solid var(--hu-line)',\n        borderRadius: 8,\n        color: 'var(--hu-text)',\n        fontSize: 12,\n      }}\n      itemStyle={{ color: 'var(--hu-text)' }}\n      labelStyle={{ color: 'var(--hu-text)' }}\n    />\n  );\n  const chartProps = {\n    data: rows,\n    accessibilityLayer: !disabled,\n    margin: sourcePresentation?{top:4,right:0,bottom:0,left:0}:{ top: 12, right: 8, bottom: 0, left: 0 },\n    onMouseMove: (event: any) => {if(disabled)return;const index=Number(event?.activeTooltipIndex);if(Number.isFinite(index)&&rows[index]){setSelected(index);setHovered(true)}},\n    onMouseLeave:()=>{setHovered(false);setHoverOverride(null)},\n  };\n  const sourceAxisValues=spec.type==='area'&&variant==='overlap'?rows.flatMap(row=>areaNames.map(name=>areaValue(row,name))):rows.map(row=>row.value),sourceAxisLow=Math.min(0,...sourceAxisValues),sourceAxisHigh=Math.max(0,...sourceAxisValues),sourceAxisSpan=Math.max(1,sourceAxisHigh-sourceAxisLow),sourceAxisQuantum=10**Math.floor(Math.log10(sourceAxisSpan/3))/2,sourceAxisStep=Math.ceil(sourceAxisSpan/3/sourceAxisQuantum)*sourceAxisQuantum,sourceAxisLower=Math.floor(sourceAxisLow/sourceAxisStep)*sourceAxisStep,sourceAxisUpper=Math.max(sourceAxisLower+sourceAxisStep*3,Math.ceil(sourceAxisHigh/sourceAxisStep)*sourceAxisStep),sourceAxisTicks=Array.from({length:Math.round((sourceAxisUpper-sourceAxisLower)/sourceAxisStep)+1},(_,i)=>round(sourceAxisLower+i*sourceAxisStep,6));\n  // Match the observed canonical fixture without imposing its scale on supplied data or ranges.\n  const canonicalAxisRows=(observedSourceCharts.data as Record<string,ChartDatum[]>)[id],sourceCanonicalAxes=sourcePresentation&&activeRange?.id==='source-0'&&!!canonicalAxisRows&&rows.length===canonicalAxisRows.length&&rows.every((row,index)=>row.name===canonicalAxisRows[index].name&&row.value===canonicalAxisRows[index].value),sourceEarningsAxes=sourceCanonicalAxes&&id==='earnings-chart-card',sourceLineAxes=sourceCanonicalAxes&&id==='line-chart-card';\n  const axes = (\n    <>\n      {!((compact||sourcePresentation)&&id==='steps-card')&&<CartesianGrid stroke=\"var(--color-chart-track)\" strokeDasharray={sourcePresentation?'3 5':undefined} vertical={false} />}\n      <XAxis\n        dataKey=\"name\"\n        height={sourcePresentation&&id==='steps-card'?26:undefined}\n        interval={sourcePresentation?sourceDefaultLayout&&sourceEarningsAxes?'preserveEnd':'preserveStartEnd':undefined}\n        tick={{ fill: 'var(--hu-muted)', fontSize: sourcePresentation?13:11 }}\n        tickMargin={sourcePresentation?(id==='steps-card'?7:12):undefined}\n        axisLine={false}\n        tickLine={false}\n      />\n      <YAxis\n        ticks={spec.type==='area'&&variant==='percent'?[0,25,50,75,100]:sourceEarningsAxes?[0,3000,5000,10000]:sourceLineAxes?[0,2000,4000,6000]:sourcePresentation?sourceAxisTicks:undefined}\n        allowDataOverflow={spec.type==='area'&&variant==='percent'||sourceLineAxes}\n        hide={(compact||sourcePresentation)&&id==='steps-card'}\n        domain={spec.type==='area'&&variant==='percent'?[0,100]:sourceLineAxes?[0,5720]:sourcePresentation?[sourceAxisLower,id==='steps-card'&&rows.some(row=>row.goal!==undefined)?Math.max(sourceAxisHigh,...rows.map(row=>row.goal??0)):sourceAxisUpper]:undefined}\n        tickFormatter={spec.type==='area'&&variant==='percent'?value=>`${Math.round(value)}%`:bar?.format||(sourcePresentation?(value:number)=>unit==='currency'?`${value<0?'-':''}₹${Math.abs(value)>=1000?`${number.format(Math.abs(value)/1000)}K`:number.format(Math.abs(value))}`:Math.abs(value)>=1000?`${number.format(value/1000)}K`:number.format(value):undefined)}\n        width={sourcePresentation?44:48}\n        tick={{ fill: 'var(--hu-muted)', fontSize: sourcePresentation?12:11 }}\n        axisLine={false}\n        tickLine={false}\n      />\n      {tooltip}\n    </>\n  );\n  let chart: ReactNode;\n  switch (spec.type) {\n    case 'area':\n      chart = (\n        <AreaChart {...chartProps} data={id==='area-chart-card'?areaRows:rows}>\n          {axes}\n          <defs>\n            {id==='area-chart-card'&&areaNames.map((name,index)=><linearGradient key={name} id={`${uid}-area-${index}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop stopColor={plotPalette[index%plotPalette.length]} stopOpacity={.3}/><stop offset=\"1\" stopColor={plotPalette[index%plotPalette.length]} stopOpacity={0}/></linearGradient>)}\n            <linearGradient id={uid} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n              <stop stopColor=\"var(--hc-chart-primary)\" stopOpacity={0.35} />\n              <stop offset=\"1\" stopColor=\"var(--hc-chart-primary)\" stopOpacity={0.02} />\n            </linearGradient>\n          </defs>\n          {currentVisible && (id==='area-chart-card' ? areaNames.map((name,index)=><Area key={name} name={name} type={curve} dataKey={`part${index}`} stackId={variant==='overlap'?undefined:'composition'} stroke={plotPalette[index%plotPalette.length]} strokeWidth={sourcePresentation?2:1} fill={sourcePresentation&&variant==='default'?`url(#${uid}-area-${index})`:plotPalette[index%plotPalette.length]} fillOpacity={sourcePresentation&&variant==='default'?1:variant==='overlap'?.22:.16} activeDot={{r:4}} isAnimationActive={reduced===false} animationDuration={sourcePresentation?450:undefined}/>) : <Area name=\"Current period\" type={curve} dataKey=\"value\" stroke={currentSeriesColor} activeDot={{r:5,stroke:'var(--hu-bg)',strokeWidth:2}} fill={`url(#${uid})`} isAnimationActive={reduced===false} animationDuration={sourcePresentation?450:undefined}/>)}\n          {previousShown && (\n            <Area\n              name=\"Previous period\"\n              type={curve}\n              dataKey=\"previous\"\n              stroke={previousSeriesColor}\n              strokeDasharray={id==='revenue-chart-card'?'4 4':undefined}\n              fill=\"none\"\n              isAnimationActive={reduced===false} animationDuration={sourcePresentation?450:undefined}\n            />\n          )}\n        </AreaChart>\n      );\n      break;\n    case 'line':\n      chart = (\n        <ComposedChart {...chartProps}>\n          {axes}\n          <defs><linearGradient id={`${uid}-line`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop stopColor=\"var(--hc-chart-primary)\" stopOpacity={0.24}/><stop offset=\"1\" stopColor=\"var(--hc-chart-primary)\" stopOpacity={0}/></linearGradient></defs>\n          {currentVisible && <Area type={curve} dataKey=\"value\" fill={`url(#${uid}-line)`} stroke=\"none\" tooltipType=\"none\" isAnimationActive={reduced===false} animationDuration={sourcePresentation?450:undefined}/>}\n          {currentVisible && (\n            <Line\n              name=\"Current period\"\n              type={curve}\n              dataKey=\"value\"\n              stroke=\"var(--hc-chart-primary)\"\n              dot={rows.length === 1}\n              activeDot={{ r: 5, stroke: 'var(--hu-bg)', strokeWidth: 2 }}\n              strokeWidth={2}\n              isAnimationActive={reduced===false} animationDuration={sourcePresentation?450:undefined}\n            />\n          )}{' '}\n          {previousShown && (\n            <Line\n              name=\"Previous period\"\n              type={curve}\n              dataKey=\"previous\"\n              stroke={previousSeriesColor}\n              dot={rows.length === 1}\n              activeDot={{ r: 5, stroke: 'var(--hu-bg)', strokeWidth: 2 }}\n              strokeWidth={2}\n              isAnimationActive={reduced===false} animationDuration={sourcePresentation?450:undefined}\n            />\n          )}\n        </ComposedChart>\n      );\n      break;\n    case 'combo':\n      chart = (\n        <ComposedChart {...chartProps}>\n          {axes}\n          {secondaryMode&&<YAxis yAxisId=\"secondary\" orientation=\"right\" domain={sourcePresentation?[0,(maximum:number)=>Math.ceil(maximum/2)*2]:undefined} ticks={sourcePresentation?Array.from({length:Math.ceil(Math.max(0,...rows.map(row=>row.secondary??0))/2)+1},(_,i)=>i*2):undefined} width={sourcePresentation?40:36} tickFormatter={value=>line?.format?.(Number(value))??`${value}%`} tick={{fill:'var(--hu-muted)',fontSize:10}} axisLine={false} tickLine={false}/>}\n          {currentVisible && (\n            <Bar               name=\"Current period\"\n              dataKey=\"value\"\n              fill={currentSeriesColor}\n              maxBarSize={sourcePresentation?(id==='steps-card'?50:id==='combo-chart-card'?21:32):undefined}\n              radius={id === 'steps-card' || id === 'earnings-chart-card' ? (sourcePresentation?[10,10,10,10]:[9,9,9,9]) : sourcePresentation?[8,8,8,8]:[4,4,0,0]}\n              background={id === 'steps-card' || id === 'earnings-chart-card' ? { fill: 'var(--hc-chart-track)', radius: 9 } : undefined}\n              isAnimationActive={reduced===false} animationDuration={sourcePresentation?450:undefined}\n            >\n              {rows.map((row,index)=><Cell key={row.key} fill={hovered&&selected===index?activeChartColor(currentSeriesColor):currentSeriesColor} opacity={hovered&&selected!==index?.35:1} stroke={hovered&&selected===index?'var(--hu-text)':'none'} strokeWidth={2}/>)}\n            </Bar>\n          )}{' '}\n          {previousShown && (\n            <Line\n              name={secondaryMode?'Conversion':'Previous period'}\n              type={curve}\n              dataKey={secondaryMode?'secondary':'previous'}\n              yAxisId={secondaryMode?'secondary':0}\n              activeDot={{r:5}}\n              stroke={previousSeriesColor}\n              strokeWidth={2}\n              isAnimationActive={reduced===false} animationDuration={sourcePresentation?450:undefined}\n            />\n          )}\n        </ComposedChart>\n      );\n      break;\n    case 'radar':\n      chart = (\n        <RadarChart {...chartProps} margin={sourcePresentation?{top:8,right:8,bottom:0,left:8}:chartProps.margin} outerRadius={sourcePresentation?(variant==='score'&&plotWidth<360?'54%':plotWidth<280?'62%':'74%'):'68%'}>\n          <PolarGrid stroke={sourcePresentation?'var(--color-chart-cursor)':'var(--hu-line)'} />\n          {radarAngleAxis}\n          {radarRadiusAxis}\n          {currentVisible&&(publicInput.series?.length&&rows.some(row=>row.series?.length)?areaNames.map((name,index)=><Radar key={name} name={name} dataKey={(row:ResolvedChartDatum)=>areaValue(row,name)} stroke={plotPalette[index%plotPalette.length]} fill={plotPalette[index%plotPalette.length]} fillOpacity={variant==='lines'?0:.16} dot={variant==='dots'||variant==='score'?{r:3,fill:plotPalette[index%plotPalette.length]}:false} isAnimationActive={reduced===false} animationDuration={sourcePresentation?450:undefined}/>):<Radar name=\"Current period\" dataKey=\"value\" stroke=\"var(--hc-chart-primary)\" fill=\"var(--hc-chart-primary)\" fillOpacity={variant==='lines'||sourceRadarComparison?0:.18} dot={variant==='dots'||variant==='score'?{r:3,fill:'var(--hc-chart-primary)'}:false} isAnimationActive={reduced===false} animationDuration={sourcePresentation?450:undefined}/>)}\n          {previousShown && (\n            <Radar\n              name=\"Previous period\"\n              type={curve}\n              dataKey=\"previous\"\n              stroke={previousSeriesColor}\n              fill={previousSeriesColor}\n              fillOpacity={variant==='lines'||sourceRadarComparison?0:0.08}\n              dot={variant==='dots'?{r:3}:false}\n              isAnimationActive={reduced===false} animationDuration={sourcePresentation?450:undefined}\n            />\n          )}{' '}\n          {variant==='score'&&currentVisible&&sourcePresentation&&<circle cx=\"50%\" cy=\"50%\" r={36} fill=\"var(--color-background-primary-default)\" className=\"hc-source-radar-score-disc\"/>}{variant==='score'&&currentVisible&&!sourcePresentation&&<text x=\"50%\" y=\"50%\" textAnchor=\"middle\" dominantBaseline=\"middle\" fill=\"var(--hu-text)\" fontSize={22}>{number.format(round(sum(rows)/Math.max(1,rows.length),sourcePresentation?0:1))}<tspan x=\"50%\" dy=\"20\" fontSize={12} fill=\"var(--hu-muted)\">{sourcePresentation?'Strong':'Average axis value'}</tspan></text>}\n          {tooltip}\n        </RadarChart>\n      );\n      break;\n    case 'scatter':\n      chart = (\n        <ScatterChart\n          margin={{ top: 12, right: 20, bottom: 12, left: 0 }}\n          accessibilityLayer={!disabled}\n        >\n          <CartesianGrid stroke=\"var(--color-chart-track)\" strokeDasharray={sourcePresentation?'3 5':undefined} />\n          <XAxis\n            type=\"number\"\n            dataKey=\"x\"\n            name=\"X\"\n            domain={sourcePresentation?[0,100]:undefined} ticks={sourcePresentation?[0,25,50,75,100]:undefined} axisLine={!sourcePresentation} tickLine={!sourcePresentation}\n            tick={{ fill: 'var(--hu-muted)', fontSize: sourcePresentation?12:11 }}\n          />\n          <YAxis\n            type=\"number\"\n            dataKey=\"value\"\n            name=\"Y\"\n            domain={sourcePresentation?(unit==='percent'?[0,scatterPercentMax]:customScatter?[0,'auto']:[0,1650]):undefined} ticks={sourcePresentation?(unit==='percent'?Array.from({length:5},(_,index)=>index*scatterPercentMax/4):customScatter?undefined:[0,550,1100,1650]):undefined} tickFormatter={sourcePresentation?value=>unit==='percent'?`${number.format(value)}%`:value>=1000?`${number.format(value/1000)}K`:number.format(value):undefined} axisLine={!sourcePresentation} tickLine={!sourcePresentation}\n            width={48}\n            tick={{ fill: 'var(--hu-muted)', fontSize: sourcePresentation?12:11 }}\n          />\n          <ZAxis dataKey=\"z\" range={bubble&&rows.some(row=>row.z!==undefined)?sourcePresentation?[140,620]:[35,140]:[45,45]} />\n          {tooltip}\n          {currentVisible && scatterGroups.map((tier,index)=><Scatter key={tier} name={tier} data={rows.filter((_,rowIndex)=>scatterGroup(rows[rowIndex],rowIndex)===tier).map(row=>({...row,z:row.z??1}))} fill={rows.find((row,rowIndex)=>scatterGroup(row,rowIndex)===tier)?.color||plotPalette[index%plotPalette.length]} fillOpacity={sourcePresentation?.85:1} stroke={sourcePresentation?activeChartColor(rows.find((row,rowIndex)=>scatterGroup(row,rowIndex)===tier)?.color||plotPalette[index%plotPalette.length]):undefined} strokeWidth={sourcePresentation?1.5:undefined} onMouseEnter={(node:any)=>{const point=node?.payload??node,pointIndex=rows.findIndex(row=>row.key===point?.key);if(pointIndex>=0)inspect(pointIndex,true)}} onMouseLeave={()=>clearEmphasis()} onClick={(node:any)=>{const point=node?.payload??node,pointIndex=rows.findIndex(row=>row.key===point?.key);if(pointIndex>=0)inspect(pointIndex,true,true)}} isAnimationActive={reduced===false} animationDuration={sourcePresentation?450:undefined}/>)}\n        </ScatterChart>\n      );\n      break;\n    case 'funnel':\n      chart = (\n        <FunnelChart\n          accessibilityLayer={!disabled}\n          margin={{ top: 12, right: 18, bottom: 12, left: 18 }}\n        >\n          {tooltip}\n          {currentVisible && (\n            <Funnel\n              dataKey=\"value\"\n              nameKey=\"name\"\n              data={rows.map((row) => ({ ...row, fill: row.color }))}\n              isAnimationActive={reduced===false} animationDuration={sourcePresentation?450:undefined}\n            />\n          )}\n        </FunnelChart>\n      );\n      break;\n    case 'sankey': {\n      const flows = flowData(rows,plotPalette,sourcePresentation),compactFlow=sourcePresentation&&plotWidth<300;\n      chart = (\n        <Sankey\n          data={flows}\n          node={({\n            x,\n            y,\n            width,\n            height,\n            payload,\n            index,\n          }: {\n            x: number;\n            y: number;\n            width: number;\n            height: number;\n            payload: { name?: string; value?: number };\n            index: number;\n          }) => {\n            const source = flows.nodes[index]?.isSource, nodeName=payload.name||'', nodeValue=rows.filter(row=>source?row.source===nodeName:row.target===nodeName).reduce((total,row)=>total+row.value,0);\n            const activate=()=>{if(disabled)return;setHovered(true);setFlowFocus({node:nodeName});setHoverOverride({name:nodeName,value:nodeValue,unit:rows[0]?.unit})};\n            return (\n              <g role=\"button\" tabIndex={disabled?-1:0} aria-disabled={disabled} aria-label={`${nodeName}: ${valueFormat(nodeValue)}`} onFocus={activate} onBlur={clearEmphasis} onMouseEnter={activate} onClick={activate} onKeyDown={event=>{if(event.key==='Enter'||event.key===' '){event.preventDefault();activate()}}}>\n                {sourcePresentation?<path d={source?`M${x+Math.min(5,height/2)},${y} H${x+width} V${y+height} H${x+Math.min(5,height/2)} A${Math.min(5,height/2)},${Math.min(5,height/2)} 0 0 1 ${x},${y+height-Math.min(5,height/2)} V${y+Math.min(5,height/2)} A${Math.min(5,height/2)},${Math.min(5,height/2)} 0 0 1 ${x+Math.min(5,height/2)},${y} Z`:`M${x},${y} H${x+width-Math.min(5,height/2)} A${Math.min(5,height/2)},${Math.min(5,height/2)} 0 0 1 ${x+width},${y+Math.min(5,height/2)} V${y+height-Math.min(5,height/2)} A${Math.min(5,height/2)},${Math.min(5,height/2)} 0 0 1 ${x+width-Math.min(5,height/2)},${y+height} H${x} Z`} fill={source?flows.nodes[index]?.color:'light-dark(var(--color-neutral-400), var(--color-neutral-300))'}/>:<rect x={x} y={y} width={width} height={height} rx={2} fill={source?flows.nodes[index]?.color:'var(--hc-chart-track)'}/>}\n                <text x={source?x-8:x+width+8} y={y+height/2} dy={sourcePresentation?(source?-2:compactFlow?-4:4):undefined} textAnchor={source?'end':'start'} dominantBaseline={sourcePresentation?undefined:'middle'} fill={sourcePresentation?'var(--color-text-primary)':'var(--hu-muted)'} fontSize={sourcePresentation?(compactFlow?11:13):9} fontWeight={sourcePresentation?500:undefined}>\n                  {sourcePresentation&&!source?<><tspan>{payload.name}</tspan><tspan x={compactFlow?x+width+8:undefined} dy={compactFlow?13:undefined} fontSize={compactFlow?10:undefined} fill=\"var(--color-text-tertiary)\" fontWeight={400}>{compactFlow?'':' · '}{Math.round(nodeValue/Math.max(1,sum(rootFlowRows))*100)}%</tspan></>:payload.name}\n                </text>\n                {(!sourcePresentation||source)&&<text x={source ? x - 8 : x + width + 8} y={y + height / 2 + (sourcePresentation?14:13)} textAnchor={source ? 'end':'start'} fill=\"var(--hu-muted)\" fontSize={sourcePresentation?(compactFlow?11:12):9}>{source?valueFormat(nodeValue):`${number.format(round(nodeValue/Math.max(1,sum(rootFlowRows))*100,1))}%`}</text>}\n              </g>\n            );\n          }}\n          link={({sourceX,sourceY,targetX,targetY,linkWidth,payload}: any) => {\n            const index=payload.rowIndex??0, row=rows[index], related=!flowFocus||(flowFocus.link!==undefined?flowFocus.link===index:flowFocus.node===payload.source?.name||flowFocus.node===payload.target?.name),activate=()=>{if(disabled||!row)return;setSelected(index);setHovered(true);setFlowFocus({link:index});setHoverOverride(row)};\n            return <path className=\"hc-react-flow-link\" role=\"button\" tabIndex={disabled?-1:0} aria-disabled={disabled} aria-label={`${row?.name||'Flow'}: ${row?formatPoint(row,'value'):''}`} onFocus={activate} onBlur={clearEmphasis} onPointerMove={activate} onClick={()=>{activate();if(!disabled&&row)onSelect?.(row,index)}} onKeyDown={event=>{if(event.key==='Enter'||event.key===' '){event.preventDefault();activate();if(!disabled&&row)onSelect?.(row,index)}}} d={`M${sourceX},${sourceY} C${sourceX+(targetX-sourceX)*(sourcePresentation?.55:.5)},${sourceY} ${targetX-(targetX-sourceX)*(sourcePresentation?.55:.5)},${targetY} ${targetX},${targetY}`} fill=\"none\" stroke={payload.color || plotPalette[Math.max(0,flows.nodes.findIndex(node=>node.name===payload.source?.name))%plotPalette.length]} strokeWidth={linkWidth} strokeOpacity={flowFocus?(related?.85:.1):sourcePresentation?.3:.46}/>;\n          }}\n          sort={sourcePresentation?false:undefined}\n          nodePadding={sourcePresentation?14:13}\n          nodeWidth={sourcePresentation?12:8}\n          margin={sourcePresentation?{top:2,right:compactFlow?96:150,bottom:2,left:compactFlow?62:88}:{top:18,right:100,bottom:18,left:78}}\n          iterations={32}\n        >\n          {tooltip}\n        </Sankey>\n      );\n      break;\n    }\n    case 'rings':\n    case 'radial': {\n      if(['speedometer','gauge','solid','stacked'].includes(variant)) {\n        const value=sum(rows), target=Math.max(value,rows.reduce((total,row)=>total+(row.goal??row.value),0),1);\n        const half=variant==='speedometer'||variant==='stacked', percentage=variant==='stacked'?(active?.value??rows[0]?.value??0)/Math.max(1,value)*100:value/target*100, sourceOuter=variant==='stacked'?Math.min(128,Math.max(32,plotWidth/2-12)):variant==='solid'?97.04:100.52, parts=variant==='stacked'?rows.map(row=>({name:row.name,value:row.value,color:row.color})):[{name:'Used',value,color:'var(--hc-chart-primary)'},{name:'Available',value:target-value,color:'var(--hc-chart-track)'}];\n        chart=<PieChart accessibilityLayer={!disabled}>{variant==='solid'&&<circle cx=\"50%\" cy=\"50%\" r={sourcePresentation?64:94} fill={sourcePresentation?'var(--color-background-inner-default)':'var(--hu-bg)'} stroke={sourcePresentation?'none':'var(--hu-line)'}/>}{currentVisible&&<Pie stroke=\"none\" data={parts} dataKey=\"value\" startAngle={half?180:90} endAngle={half?0:-270} cx=\"50%\" cy={half?(sourcePresentation?'78%':'85%'):'50%'} innerRadius={sourcePresentation?(variant==='stacked'?sourceOuter*.75:variant==='solid'?sourceOuter-18:sourceOuter-9):variant==='solid'?58:70} outerRadius={sourcePresentation?sourceOuter:92} cornerRadius={sourcePresentation?(variant==='stacked'?16:variant==='solid'?9:4.5):variant==='stacked'?0:8} onMouseEnter={(_point,index)=>{if(variant==='stacked'&&index<rows.length)inspect(index,true)}} onClick={(_point,index)=>{if(variant==='stacked'&&index<rows.length)inspect(index,true,true)}} isAnimationActive={reduced===false} animationDuration={sourcePresentation?450:undefined}>{parts.map((part,index)=><Cell key={part.name} fill={part.color} opacity={hovered&&variant==='stacked'&&selected!==index?.3:1}/>)}</Pie>}{currentVisible&&<text x=\"50%\" y={half?(sourcePresentation?'65%':'75%'):'50%'} textAnchor=\"middle\" dominantBaseline=\"middle\" fill=\"var(--hu-text)\" fontSize={sourcePresentation?32:28} fontWeight={500}>{variant==='gauge'||variant==='solid'||sourcePresentation&&variant==='stacked'?`${number.format(round(percentage,sourcePresentation?0:1))}%`:formatChartValue(value,unit)}{sourcePresentation&&<tspan x=\"50%\" dy={20} fontSize={12} fill=\"var(--color-text-tertiary)\">{variant==='stacked'?active?.name||rows[0]?.name:'of goal'}</tspan>}</text>}{tooltip}</PieChart>;\n        break;\n      }\n      const thickness = sourcePresentation?(variant==='labels'?12:7):Math.max(3, Math.min(18, 80 / Math.max(1, rows.length) - 4));\n      chart = (\n        <PieChart accessibilityLayer={!disabled}>\n          {variant==='grid'&&rows.map((row,index)=><circle key={row.key} cx=\"50%\" cy=\"50%\" r={sourcePresentation?50.2+index*12.4:28+index*(thickness+4)} fill=\"none\" stroke={sourcePresentation?'var(--color-chart-cursor)':'var(--hu-line)'} strokeDasharray={sourcePresentation?undefined:'2 3'}/>)}{variant==='grid'&&sourcePresentation&&Array.from({length:12},(_,index)=><line key={index} x1=\"50%\" y1=\"50%\" x2={`${50+99.8*Math.cos(index*Math.PI/6)/Math.max(1,plotWidth)*100}%`} y2={`${50+99.8*Math.sin(index*Math.PI/6)/plotHeight*100}%`} stroke=\"var(--color-chart-cursor)\"/>)}\n          {currentVisible &&\n            rows.map((row, index) => {\n              const goal = Math.max(row.value, row.goal ?? row.value, 1),\n                outer = spec.type === 'rings' ? 96 - index * 25 : sourcePresentation?(variant==='labels'?40.24+index*16:53.728+index*(rows.length>1?49.6/(rows.length-1):0)):24 + index * (thickness + 4),\n                inner = Math.max(2, outer - (spec.type === 'rings' ? 20 : thickness));\n              return (\n                <Pie\n                  stroke=\"none\"\n                  key={row.key}\n                  nameKey=\"name\"\n                  data={[\n                    { name: row.name, value: row.value },\n                    { name: `${row.name} remaining`, value: Math.max(0, goal - row.value) },\n                  ]}\n                  dataKey=\"value\"\n                  innerRadius={inner}\n                  outerRadius={outer}\n                  startAngle={90}\n                  endAngle={-270}\n                  cornerRadius={spec.type === 'radial' ? thickness / 2 : 8}\n                  isAnimationActive={reduced===false} animationDuration={sourcePresentation?450:undefined}\n                  onMouseEnter={() => inspect(index,true)}\n                  labelLine={false}\n                  label={variant==='labels'?({cx,cy,index:segmentIndex}:any)=>segmentIndex===0?<g><defs><path id={`${uid}-arc-${index}`} d={`M${cx},${cy-outer+3} a${outer-3},${outer-3} 0 1,1 -0.01,0`}/></defs><text fontSize={sourcePresentation?10:9} fill={sourcePresentation?'var(--color-background-secondary-default)':'var(--hu-text)'}><textPath href={`#${uid}-arc-${index}`} startOffset=\"2%\">{row.name}</textPath></text></g>:null:undefined}\n                >\n                  <Cell fill={hovered&&selected===index?activeChartColor(row.color):row.color} opacity={hovered&&selected!==index?.28:1}/>\n                  <Cell fill={variant==='grid'?'transparent':'var(--hc-chart-track)'} />\n                </Pie>\n              );\n            })}\n          {tooltip}\n        </PieChart>\n      );\n      break;\n    }\n    case 'score': {\n      const goal = rows.reduce((total, row) => total + (row.goal ?? 0), 0),\n        parts = [\n          ...rows.map((row) => ({ name: row.name, value: row.value, color: row.color })),\n          {\n            name: 'Remaining score',\n            value: Math.max(0, goal - sum(rows)),\n            color: sourcePresentation?'transparent':'var(--hc-chart-track)',\n          },\n        ];\n      chart = (\n        <PieChart accessibilityLayer={!disabled}>\n          {sourcePresentation&&<Pie stroke=\"none\" data={[{value:100}]} dataKey=\"value\" innerRadius={37} outerRadius={52} fill=\"var(--hc-chart-track)\" isAnimationActive={false}/>}\n          {currentVisible && (\n            <Pie\n                  stroke=\"none\"\n              data={parts}\n              nameKey=\"name\"\n              dataKey=\"value\"\n              innerRadius={sourcePresentation?37:compact?43:55}\n              outerRadius={sourcePresentation?52:compact?58:73}\n              paddingAngle={sourcePresentation?6:0}\n              cornerRadius={sourcePresentation?7.5:0}\n              startAngle={90}\n              endAngle={-270}\n              isAnimationActive={reduced===false} animationDuration={sourcePresentation?450:undefined}\n              onMouseEnter={(_point, index) => {\n                if (index < rows.length) inspect(index,true);\n              }}\n            >\n              {parts.map((part) => (\n                <Cell key={part.name} fill={part.color} opacity={hovered&&part.name!==rows[selected]?.name&&part.name!=='Remaining score'?.25:1}/>\n              ))}\n            </Pie>\n          )}\n          {currentVisible && <text x=\"50%\" y=\"50%\" textAnchor=\"middle\" dominantBaseline=\"middle\" fill=\"var(--hu-text)\" fontSize={34} fontWeight={600}>{number.format(round(weightedScore(rows),1))}</text>}\n          {tooltip}\n        </PieChart>\n      );\n      break;\n    }\n    default:\n      chart = (\n        <BarChart {...chartProps}>\n          {axes}\n          {currentVisible && (\n            <Bar               name=\"Current period\"\n              dataKey=\"value\"\n              fill={currentSeriesColor}\n              maxBarSize={sourcePresentation?(id==='steps-card'?50:id==='combo-chart-card'?21:32):undefined}\n              radius={id === 'steps-card' || id === 'earnings-chart-card' ? (sourcePresentation?[10,10,10,10]:[9,9,9,9]) : sourcePresentation?[8,8,8,8]:[4,4,0,0]}\n              background={id === 'steps-card' || id === 'earnings-chart-card' ? { fill: 'var(--hc-chart-track)', radius: 9 } : undefined}\n              isAnimationActive={reduced===false} animationDuration={sourcePresentation?450:undefined}\n            >\n              {rows.map((row,index)=><Cell key={row.key} fill={hovered&&selected===index?activeChartColor(currentSeriesColor):currentSeriesColor} opacity={hovered&&selected!==index?.35:1} stroke={hovered&&selected===index?'var(--hu-text)':'none'} strokeWidth={2}/>)}\n            </Bar>\n          )}{' '}\n          {previousShown && (\n            <Bar               name=\"Previous period\"\n              dataKey=\"previous\"\n              fill={previousSeriesColor}\n              maxBarSize={sourcePresentation?(id==='steps-card'?50:id==='combo-chart-card'?21:32):undefined}\n              radius={id === 'steps-card' || id === 'earnings-chart-card' ? (sourcePresentation?[10,10,10,10]:[9,9,9,9]) : sourcePresentation?[8,8,8,8]:[4,4,0,0]}\n              background={id === 'steps-card' || id === 'earnings-chart-card' ? { fill: 'var(--hc-chart-track)', radius: 9 } : undefined}\n              isAnimationActive={reduced===false} animationDuration={sourcePresentation?450:undefined}\n            >\n              {rows.map((row,index)=><Cell key={row.key} fill={hovered&&selected===index?activeChartColor(previousSeriesColor):previousSeriesColor} opacity={hovered&&selected!==index?.35:1} stroke={hovered&&selected===index?'var(--hu-text)':'none'} strokeWidth={2}/>)}\n            </Bar>\n          )}\n        </BarChart>\n      );\n  }\n  const inspect = (index: number,emphasize=false,notify=!emphasize) => {if(disabled)return;setSelected(index);setHovered(emphasize);setHoverOverride(null);if(notify&&rows[index])onSelect?.(rows[index],index);};\n  const clearEmphasis=()=>{setHovered(false);setHoverOverride(null);setFlowFocus(null)};\n  radarHandlers.current={inspect,clear:clearEmphasis};\n  const maxValue = max??Math.max(1, ...rows.map((row) => row.value));\n  const displayPlot = () => {\n    if (!visible)\n      return (\n        <div className=\"hc-react-hidden\" role=\"status\">\n          No series are visible. Enable a period above to restore the chart.\n        </div>\n      );\n    if(sourcePresentation&&spec.type==='rings')return <div className=\"hc-source-activity-plot\" style={{height:200}}><svg viewBox=\"0 0 200 200\" aria-label={`${title||spec.name} progress`} role=\"group\">{currentVisible&&rows.map((row,index)=>{const step=rows.length>3?70/Math.max(1,rows.length-1):24,radius=82-index*step,percent=Math.max(0,Math.min(100,row.progress??row.value/Math.max(1,row.goal??row.value)*100));return <g key={row.key} role=\"button\" tabIndex={disabled?-1:0} aria-disabled={disabled} aria-label={`${row.name}: ${formatPoint(row,'value')}, ${number.format(percent)}%`} transform=\"rotate(-90 100 100)\" onPointerMove={()=>inspect(index,true)} onPointerLeave={clearEmphasis} onFocus={()=>inspect(index,true)} onBlur={clearEmphasis} onClick={()=>inspect(index,false,true)} onKeyDown={event=>{if(!disabled&&['Enter',' '].includes(event.key)){event.preventDefault();inspect(index,false,true)}}}><circle cx=\"100\" cy=\"100\" r={radius} fill=\"none\" stroke={row.color} strokeWidth={Math.min(18,step*.75)} opacity={hovered&&selected!==index?.06:.16}/><circle cx=\"100\" cy=\"100\" r={radius} pathLength={100} fill=\"none\" stroke={row.color} strokeWidth={Math.min(18,step*.75)} strokeLinecap=\"round\" strokeDasharray={`${percent} ${100-percent}`} opacity={hovered&&selected!==index?.3:1}/></g>})}</svg></div>;\n    if (spec.type === 'funnel') {\n      const w=sourcePresentation?640:600, h=sourcePresentation?160:180, count=Math.max(1,rows.length), gap=sourcePresentation?3:0,segment=(w-gap*(count-1))/count;\n      return <div className=\"hc-react-funnel\" style={{'--funnel-columns':count} as CSSProperties} onPointerLeave={clearEmphasis} role=\"group\" aria-label=\"Horizontal funnel plotted values\"><svg viewBox={`0 0 ${w} ${h}`} preserveAspectRatio={sourcePresentation?'none':undefined} style={sourcePresentation?{height:plotHeight}:undefined} aria-label=\"Stage widths show share of the first stage\">\n        {currentVisible && rows.map((row,index)=>{\n          const x=index*(segment+gap),next=rows[index+1]?.value??row.value,half=sourcePresentation?12+Math.max(0,row.value)/Math.max(1,rows[0].value)*68:Math.max(10,row.value/Math.max(1,rows[0].value)*70),nextHalf=sourcePresentation?12+Math.max(0,next)/Math.max(1,rows[0].value)*68:Math.max(10,next/Math.max(1,rows[0].value)*70),cy=h/2,plateau=x+segment*(sourcePresentation?.42:0),control=sourcePresentation?(plateau+x+segment)/2:x+segment*.8;\n          return <g key={row.key} role=\"button\" tabIndex={disabled?-1:0} aria-disabled={disabled} aria-label={`${row.name}: ${formatPoint(row,'value')}, ${number.format(round(row.value/Math.max(1,rows[0].value)*100))}%`} onFocus={()=>inspect(index,true)} onPointerMove={()=>inspect(index,true)} onClick={()=>{if(!disabled)inspect(index)}} onKeyDown={event=>{if(!disabled&&(event.key==='Enter'||event.key===' ')){event.preventDefault();inspect(index,true,true)}}}>\n            {[...(sourcePresentation&&shape!=='sharp'?[{scale:1,opacity:.14},{scale:.88,opacity:.3}]:[]),{scale:sourcePresentation&&shape!=='sharp'?.72:1,opacity:1}].map((band,bandIndex)=><path key={bandIndex} d={shape==='sharp'?`M${x},${cy-half} L${x+segment},${cy-nextHalf} L${x+segment},${cy+nextHalf} L${x},${cy+half}Z`:`M${x},${cy-half} L${plateau},${cy-half} C${control},${cy-half} ${control},${cy-nextHalf} ${x+segment},${cy-nextHalf} L${x+segment},${cy+nextHalf} C${control},${cy+nextHalf} ${control},${cy+half} ${plateau},${cy+half} L${x},${cy+half}Z`} transform={band.scale===1?undefined:`translate(0 ${cy*(1-band.scale)}) scale(1 ${band.scale})`} fill={hovered&&selected===index?activeChartColor(row.color):row.color} opacity={band.opacity*(hovered?(selected===index?1:.28):sourcePresentation?1:.85)}/>)}\n            {!sourcePresentation&&<><rect x={x+segment/2-24} y={cy-12} width={48} height={24} rx={12} fill=\"var(--hu-bg)\"/>\n            <text x={x+segment/2} y={cy+4} textAnchor=\"middle\" fill=\"var(--hu-text)\" fontSize={12}>{number.format(round(row.value/Math.max(1,rows[0].value)*100))}%</text></>}\n          </g>;\n        })}\n      </svg>{sourcePresentation&&<div className=\"hc-source-funnel-labels\" aria-hidden=\"true\" style={{height:plotHeight,aspectRatio:'auto',gridTemplateColumns:`repeat(${count},minmax(0,1fr))`}}>{rows.map(row=><span key={row.key}><b>{number.format(round(row.value/Math.max(1,rows[0].value)*100))}%</b></span>)}</div>}<div className=\"hc-react-mini-legend\">{rows.map(row=><span key={row.key}><i style={{background:row.color}}/>{row.name}<strong>{formatPoint(row,'value')}</strong></span>)}</div></div>;\n    }\n    if (spec.type === 'days') {\n      const selectedDay=active ?? rows[0], goal=10000, average=sum(rows)/Math.max(1,rows.length), metrics=[{label:'Daily target',value:selectedDay?.value??0,target:goal},{label:'Month peak',value:selectedDay?.value??0,target:maxValue},{label:'Month average',value:selectedDay?.value??0,target:average}];\n      const ring=(value:number,target:number,r:number,color:string)=><circle r={r} cx={50} cy={50} fill=\"none\" stroke={color} strokeWidth={8} strokeDasharray={`${Math.min(1,value/Math.max(1,target))*2*Math.PI*r} ${2*Math.PI*r}`} transform=\"rotate(-90 50 50)\" strokeLinecap=\"round\"/>;\n      return <div className=\"hc-react-activity-days\"><div className=\"hc-react-days-calendar\" ref={calendarRef} tabIndex={0} role=\"region\" aria-label=\"Scrollable activity calendar\" onKeyDown={event=>{if(!disabled&&!data&&(event.key==='PageDown'||event.key==='PageUp')){event.preventDefault();setMonthOffset(value=>value+(event.key==='PageDown'?1:-1));setSelected(0)}}}><div className=\"hc-react-month-navigation\"><span className=\"hc-react-small-label\">{sourcePresentation?periodLabel.slice(0,3):data?'Recorded activity':monthName}{sourcePresentation?'':' · daily steps'}</span>{!data&&<span><button type=\"button\" aria-label=\"Previous activity month\" disabled={disabled} onClick={()=>{setMonthOffset(monthOffset-1);setSelected(0)}}><UIIcon name=\"chevron-left\" /></button><button type=\"button\" aria-label=\"Next activity month\" disabled={disabled} onClick={()=>{setMonthOffset(monthOffset+1);setSelected(0)}}><UIIcon name=\"chevron-right\" /></button></span>}</div><div className=\"hc-react-heatmap hc-react-days\" role=\"group\" aria-label=\"Select activity day\">{currentVisible&&rows.map((row,index)=><button key={row.key} type=\"button\" disabled={disabled} aria-pressed={selected===index} aria-label={`${row.name}: ${formatPoint(row,'value')}`} onFocus={()=>inspect(index,true)} onPointerMove={()=>inspect(index,true)} onClick={()=>inspect(index,true,true)}><span>{row.name.replace(/^\\w+ /,'')}</span><svg viewBox=\"0 0 100 100\" aria-hidden=\"true\">{sourcePresentation?[36,25,14].map((radius,metricIndex)=>{const color=plotPalette[metricIndex%plotPalette.length],completion=Math.min(1,(row.value/maxValue)*(.8+metricIndex*.12));return <g key={radius}><circle r={radius} cx=\"50\" cy=\"50\" fill=\"none\" stroke={color} strokeOpacity={.12} strokeWidth=\"8\"/>{ring(completion,1,radius,color)}</g>}):<><circle r=\"36\" cx=\"50\" cy=\"50\" fill=\"none\" stroke=\"var(--hc-chart-track)\" strokeWidth=\"8\"/>{ring(row.value,goal,36,'var(--hc-chart-primary)')}</>}</svg></button>)}</div></div><div className=\"hc-react-day-detail\"><span className=\"hc-react-small-label\">Activity for {selectedDay?.name}</span><strong>{selectedDay?formatPoint(selectedDay,'value'):'—'} steps</strong><svg viewBox=\"0 0 100 100\" aria-hidden=\"true\">{metrics.map((metric,i)=><g key={metric.label}><circle r={40-i*12} cx=\"50\" cy=\"50\" fill=\"none\" stroke=\"var(--hc-chart-track)\" strokeWidth=\"8\"/>{ring(metric.value,metric.target,40-i*12,plotPalette[i%plotPalette.length])}</g>)}</svg><div className=\"hc-react-day-targets\">{metrics.map((metric,i)=><span key={metric.label}><i style={{background:plotPalette[i%plotPalette.length]}}/>{metric.label}<strong>{number.format(round(metric.target))}</strong></span>)}</div></div></div>;\n    }\n    if(spec.type==='heatmap') {\n      const inferredHours=new Set(rows.map(row=>row.name.match(/\\d{2}:00$/)?.[0]).filter(Boolean)).size;\n      const columns=publicInput.matrix?.columns.length||Math.max(1,Math.min(rows.length,inferredHours||(Number.isFinite(Number(period))?Number(period)*2:24))), rowCount=publicInput.matrix?.rowLabels.length||Math.ceil(rows.length/columns), colLabels=publicInput.matrix?.columns||rows.slice(0,columns).map((row,index)=>row.name.includes(' ')?(row.name.split(' ').at(-1)||''):String(index+1));\n      return <div className=\"hc-react-matrix\" onPointerLeave={clearEmphasis}><div className=\"hc-react-matrix-y\" aria-hidden=\"true\">{Array.from({length:rowCount},(_,index)=><span key={index} data-active={hovered&&Math.floor(selected/columns)===index}>{publicInput.matrix?.rowLabels[index]||(rows[index*columns]?.name.includes(' ')?rows[index*columns].name.split(' ').slice(0,-1).join(' '):'Samples')}</span>)}</div><div><div className=\"hc-react-heatmap hc-react-heatmap-matrix\" style={{gridTemplateColumns:`repeat(${columns},minmax(0,1fr))`,gridTemplateRows:`repeat(${Math.max(1,rowCount)},minmax(12px,1fr))`}} role=\"group\" aria-label=\"Heatmap plotted values\">{currentVisible&&rows.map((row,index)=><button type=\"button\" key={row.key} disabled={disabled} aria-label={`${row.name}: ${formatPoint(row,'value')}`} aria-pressed={selected===index&&(!sourcePresentation||hovered)} onFocus={()=>inspect(index,true)} onBlur={clearEmphasis} onPointerMove={()=>inspect(index,true)} onClick={()=>inspect(index,true,true)} style={{'--cell-intensity':`${sourcePresentation&&row.intensity!==undefined?row.intensity:round(12+row.value/maxValue*75)}%`,...(row.matrixRow!==undefined?{gridRow:row.matrixRow+1,gridColumn:(row.matrixColumn??0)+1}:{})} as CSSProperties}/>)}</div><div className=\"hc-react-matrix-x\" style={{gridTemplateColumns:`repeat(${columns},minmax(0,1fr))`}} aria-hidden=\"true\">{colLabels.map((name,index)=><span key={index} data-active={hovered&&selected%columns===index}>{index%Math.max(1,Math.ceil(columns/12))===0?(name||'').replace(':00',''):''}</span>)}</div></div></div>;\n    }\n    if (spec.type === 'contributions')\n      return (\n        <div className=\"hc-react-contribution-scroll\" tabIndex={0} role=\"region\" aria-label=\"Scrollable contributions calendar\"><div className=\"hc-react-contribution-calendar\" style={{'--contribution-weeks':Math.max(1,Math.ceil(rows.length/7))} as CSSProperties}><div\n          className={`hc-react-heatmap hc-react-${spec.type}`}\n          data-source-contributions={sourcePresentation||undefined}\n          role=\"group\"\n          aria-label={`${spec.name} plotted values`}\n          onPointerLeave={clearEmphasis}\n          style={{gridTemplateColumns:`repeat(${Math.max(1,Math.ceil(rows.length/7))},minmax(0,1fr))`}}\n        >\n          {currentVisible &&\n            rows.map((row, index) => (\n              <button\n                type=\"button\"\n                key={row.key}\n                disabled={disabled}\n                aria-label={`${row.name}: ${formatPoint(row, 'value')}`}\n                aria-pressed={selected === index}\n                onFocus={() => inspect(index,true)}\n                onPointerMove={() => inspect(index,true)}\n                onClick={() => inspect(index,true,true)}\n                style={\n                  {\n                    '--cell-intensity': `${round(12 + (row.value / maxValue) * 75)}%`,\n                    ...(sourcePresentation&&!mono&&!color?{background:`var(--hc-contribution-tier-${Math.min(5,Math.max(0,Math.round(row.intensity!==undefined?row.intensity/20:row.value/maxValue*5)))})`}:{}),\n                  } as CSSProperties\n                }\n              >\n                {''}\n              </button>\n            ))}\n        </div><div className=\"hc-react-month-axis\" aria-hidden=\"true\">{(sourcePresentation?months:period==='12'?months:period==='6'?months.slice(6):months.slice(9)).map(month=><span key={month}>{month}</span>)}</div></div></div>\n      );\n    if (spec.type === 'list' || spec.type === 'stages')\n      return (\n        <div className={`hc-react-list hc-react-${spec.type}-list`} onPointerLeave={clearEmphasis} role=\"group\" aria-label={`${spec.name} plotted values`}>\n          {currentVisible &&\n            (spec.type==='list'&&!listExpanded?rows.slice(0,Math.max(1,limit)):rows).map((row, index) => (\n              <button\n                type=\"button\"\n                key={row.key}\n                disabled={disabled}\n                aria-pressed={selected === index}\n                onFocus={() => inspect(index,true)}\n                onPointerMove={() => inspect(index,true)}\n                onClick={() => inspect(index,true,true)}\n                style={\n                  { '--bar': Math.max(0, (row.value / maxValue) * 100) + '%', '--stage-color': row.color } as CSSProperties\n                }\n              >\n                <span>{row.icon&&spec.type!=='stages'&&<i className=\"hc-row-icon\" aria-hidden=\"true\">{typeof row.icon==='function'||row.icon&&typeof row.icon==='object'&&!isValidElement(row.icon)&&'$$typeof'in row.icon?createElement(row.icon as React.ElementType,{size:16}):renderIcon(row.icon as ReactNode)}</i>}{row.name}</span>\n                {spec.type === 'stages' && <span className=\"hc-react-stage-track\"><span>{showIcons&&(row.icon||!customData)&&<i aria-hidden=\"true\">{row.icon?typeof row.icon==='function'||row.icon&&typeof row.icon==='object'&&!isValidElement(row.icon)&&'$$typeof'in row.icon?createElement(row.icon as React.ElementType,{size:16}):renderIcon(row.icon as ReactNode):<UIIcon name={(['circle','users','sparkles','grid','users','chart'] as const)[index%6]}/>}</i>}</span></span>}\n                <strong>\n                  {spec.type==='list'&&metric==='share'?`${number.format(round(row.value/Math.max(1,sum(rows))*100,1))}%`:formatPoint(row, 'value')}\n                  {spec.type === 'stages' && (\n                    <small>\n                      {number.format(\n                        round((row.value / Math.max(1, rows[0]?.value ?? 1)) * 100, sourcePresentation?0:1),\n                      )}\n                      %\n                    </small>\n                  )}\n                </strong>\n              </button>\n            ))}\n        </div>\n      );\n    return (\n      <div className=\"hc-react-plot\" onPointerLeave={clearEmphasis} style={{height:plotHeight}} aria-label={`${spec.name} visualization`} role=\"group\">\n        <ResponsiveContainer\n          width=\"100%\"\n          height={plotHeight}\n          minWidth={0}\n          initialDimension={{ width: 500, height: plotHeight }} onResize={width=>setPlotWidth(width)}\n        >\n          {chart as React.ReactElement}\n        </ResponsiveContainer>\n        {sourcePresentation&&spec.type==='radar'&&variant==='score'&&currentVisible&&<div className=\"hc-source-radar-score-overlay\" aria-hidden=\"true\"><strong>{number.format(round(sum(rows)/Math.max(1,rows.length)))}</strong><span>Strong</span></div>}\n      </div>\n    );\n  };\n  const changePeriod=(next:string)=>{setPeriod(next);setSelected(0);setHovered(false);setHoverOverride(null)};\n  const nativeState=state==='ready'&&publicInput.error?'error':state==='ready'&&!rows.length?'empty':state;\n  const stateHeight=['list','stages'].includes(spec.type)?Math.max(150,Math.min(6,rows.length||4)*32):spec.type==='contributions'?168:spec.type==='days'?245:spec.type==='heatmap'?190:plotHeight;\n  const stateShape=()=>{\n    if(['rings','radial','score'].includes(spec.type))return <svg viewBox=\"0 0 240 180\"><circle cx=\"120\" cy=\"90\" r=\"66\"/><circle cx=\"120\" cy=\"90\" r=\"48\"/><circle cx=\"120\" cy=\"90\" r=\"30\"/></svg>;\n    if(spec.type==='radar')return <svg viewBox=\"0 0 240 180\"><polygon points=\"120,18 183,54 183,126 120,162 57,126 57,54\"/><polygon points=\"120,45 160,67 160,113 120,135 80,113 80,67\"/></svg>;\n    if(spec.type==='sankey')return <svg viewBox=\"0 0 480 180\">{[30,65,100,135].map((y,index)=><path key={y} d={`M20 ${y} C170 ${y},310 ${160-y},460 ${160-y}`} strokeWidth={index+7}/>)}</svg>;\n    if(['heatmap','contributions','days'].includes(spec.type))return <div className=\"hc-state-grid\">{Array.from({length:56},(_,index)=><i key={index}/>)}</div>;\n    if(['list','stages','funnel'].includes(spec.type))return <div className=\"hc-state-list\">{[92,76,57,38,22].map(width=><i key={width} style={{width:`${width}%`}}/>)}</div>;\n    if(spec.type==='scatter')return <svg viewBox=\"0 0 480 180\">{[35,70,105,140,175,210,245,280,315,350,385,420].map((x,index)=><circle key={x} cx={x} cy={145-index*10} r={5+index%3}/>)}</svg>;\n    if(['area','line'].includes(spec.type))return <svg viewBox=\"0 0 480 180\"><path d=\"M15 145L80 120L145 130L210 80L275 95L340 50L405 65L465 25\"/></svg>;\n    return <div className=\"hc-state-bars\">{[35,52,43,68,57,78,64,88,72,94,82,90].map((height,index)=><i key={index} style={{height:`${height}%`}}/>)}</div>;\n  };\n  const statePlot=<div className=\"hc-native-state\" data-state={nativeState} style={{minHeight:stateHeight}}>\n    <div className=\"hc-state-structure\" aria-hidden=\"true\">{stateShape()}</div>\n    <div className=\"hc-state-message\" role={nativeState==='error'?'alert':'status'}>\n      {nativeState==='loading'&&<span className=\"hu-spinner\" aria-hidden=\"true\"/>}\n      <strong>{nativeState==='loading'?`Loading ${title||spec.name}`:nativeState==='error'?`${title||spec.name} unavailable`:`No ${title||spec.name.toLowerCase()} data`}</strong>\n      <p>{nativeState==='loading'?'Preparing the local chart example.':nativeState==='error'?(publicInput.error||'The example could not load. Your selected period is preserved.'):'There are no observations for this view. Choose a period or load data.'}</p>\n      {nativeState!=='loading'&&onRetry&&<button type=\"button\" disabled={disabled} onClick={onRetry}>{nativeState==='error'?'Try again':'Load example data'}</button>}\n    </div>\n  </div>;\n  const sourceSegmented=sourcePresentation&&(periodPresentation==='segmented'||periodPresentation!=='date'&&['earnings-chart-card','line-chart-card','contributions-card'].includes(id));\n  const sourceDateControl=sourcePresentation&&customRanges&&!sourceSegmented;\n  const sourceArrowPeriod=periodPresentation==='date'||['steps-card','sleep-score-card','activity-rings-card'].includes(id);\n  const periodControl=sourceDateControl&&!sourceArrowPeriod?<SourceSelect aria-label=\"Chart range\" selectedKey={period} isDisabled={disabled||controlledRange!==undefined&&!onRangeChange} onSelectionChange={key=>{if(key!==null)changePeriod(String(key))}} className=\"hc-source-range-select\" triggerClassName=\"hc-source-range-trigger\" renderValue={<><UIIcon name=\"calendar\"/>{periodLabel}</>}>{periods.map(option=><SourceSelectItem key={option.value} id={option.value} textValue={option.label}>{option.label}</SourceSelectItem>)}</SourceSelect>:sourceDateControl?<div className=\"hc-source-date-control\" data-period-arrows={sourceArrowPeriod}>{!sourceArrowPeriod&&<span aria-hidden=\"true\"><UIIcon name=\"calendar\"/></span>}<button type=\"button\" aria-label=\"Previous chart period\" disabled={disabled||controlledRange!==undefined&&!onRangeChange} onClick={()=>{const index=periods.findIndex(option=>option.value===period);changePeriod(periods[(index+1)%periods.length].value)}}><UIIcon name=\"chevron-left\"/></button><select aria-label=\"Chart range\" style={{width:Math.min(145,Math.max(54,periodLabel.length*7+4))}} value={period} disabled={disabled||controlledRange!==undefined&&!onRangeChange} onChange={event=>changePeriod(event.target.value)}>{periods.map(option=><option key={option.value} value={option.value}>{option.label}</option>)}</select>{!sourceArrowPeriod&&<span aria-hidden=\"true\"><UIIcon name=\"chevron-down\"/></span>}<button type=\"button\" aria-label=\"Next chart period\" disabled={disabled||controlledRange!==undefined&&!onRangeChange} onClick={()=>{const index=periods.findIndex(option=>option.value===period);changePeriod(periods[(index-1+periods.length)%periods.length].value)}}><UIIcon name=\"chevron-right\"/></button></div>:sourceSegmented?<div className=\"hc-react-periods\" role=\"group\" aria-label=\"Chart period\">{periods.map(option=><button key={option.value} type=\"button\" disabled={disabled||controlledRange!==undefined&&!onRangeChange} aria-pressed={period===option.value} onClick={()=>changePeriod(option.value)}>{option.label}</button>)}</div>:customData&&!customRanges?<span className=\"hc-react-small-label\">Provided dataset</span>:customRanges?<Select label=\"Chart range\" size=\"sm\" value={period} disabled={disabled||controlledRange!==undefined&&!onRangeChange} options={periods} onChange={event=>changePeriod(event.target.value)}/>:compact? <label className=\"hc-react-compact-period\"><span aria-hidden=\"true\"><UIIcon name=\"calendar\" /></span><select aria-label=\"Chart period\" title={periodLabel} value={period} disabled={disabled||controlledRange!==undefined&&!onRangeChange} onChange={event=>changePeriod(event.target.value)}>{periods.map(option=><option key={option.value} value={option.value}>{option.label}</option>)}</select></label> : (\n        <div className=\"hc-react-periods\" role=\"group\" aria-label=\"Chart period\">\n          {periods.map(option => <button key={option.value} type=\"button\" disabled={disabled||controlledRange!==undefined&&!onRangeChange} aria-pressed={period===option.value} onClick={()=>{setPeriod(option.value);setSelected(0);setHovered(false);setHoverOverride(null)}}>{option.label}</button>)}\n        </div>\n  );\n  const dataControls=<>\n          <details className=\"hc-react-inspect-details\">\n            <summary>Inspect data and series</summary>{!compact&&['list','rings'].includes(spec.type)&&periodControl}\n            <div className=\"hc-react-legend\"><Checkbox label=\"Current period\" checked={currentVisible} disabled={disabled} onChange={event=>setCurrentVisible(event.target.checked)}/>{supportsComparison && <Checkbox label={secondaryMode?'Conversion rate':'Previous period'} checked={previousVisible} disabled={disabled} onChange={event=>setPreviousVisible(event.target.checked)}/>}</div>\n          {visible && (\n            <>\n              <div className=\"hc-react-inspection\" role=\"group\" aria-label=\"Inspect chart data\">\n                {inspectableRows.map((point) => {\n                  const index = rows.indexOf(point);\n                  return (\n                    <button\n                      type=\"button\"\n                      key={point.key}\n                      disabled={disabled}\n                      aria-pressed={active?.key === point.key}\n                      onFocus={() => inspect(index,true)}\n                      onBlur={clearEmphasis}\n                      onPointerMove={() => inspect(index,true)}\n                      onClick={() => inspect(index)}\n                    >\n                      <span>{point.name}</span>\n                      <strong>{formatPoint(point)}</strong>\n                    </button>\n                  );\n                })}\n              </div>\n              <p className=\"hc-react-status\" role=\"status\">\n                {active?.name}: {active ? formatPoint(active) : '—'}\n                {active?.goal !== undefined\n                  ? ` of ${formatChartValue(active.goal, pointUnit, active.unit)}`\n                  : ''}\n                {spec.type === 'scatter' ? ` · X: ${number.format(active?.x ?? 0)}` : ''}\n                {!currentVisible && previousShown ? secondaryMode?' · Conversion rate':' · Previous period' : ''}\n              </p>\n            </>\n          )}\n          </details>\n          <details>\n            <summary>Accessible data table</summary>\n            <div\n              className=\"hu-table-scroll\"\n              tabIndex={0}\n              role=\"region\"\n              aria-label=\"Chart data table\"\n            >\n              <table>\n                <caption>\n                  {spec.name} — {periodLabel}, full illustrative dataset\n                </caption>\n                <thead>\n                  <tr>\n                    <th scope=\"col\">{categoryLabel}</th>\n                    {spec.type === 'scatter' && <th scope=\"col\">X</th>}\n                    <th scope=\"col\">Current{!currentVisible ? ' (hidden)' : ''}</th>\n                    {supportsComparison && !secondaryMode && (\n                      <th scope=\"col\">Previous{!previousShown ? ' (hidden)' : ''}</th>\n                    )}\n                    {secondaryMode&&<th scope=\"col\">Conversion rate{!previousShown?' (hidden)':''}</th>}\n                    {['area-chart-card','radar-chart-card'].includes(id)&&rows.some(row=>row.series?.length)&&areaNames.map(name=><th scope=\"col\" key={name}>{name}{variant==='percent'?' (raw and share)':''}</th>)}\n                    {spec.type==='scatter'&&rows.some(row=>row.z!==undefined)&&<th scope=\"col\">Bubble size</th>}\n                    {goals && (\n                      <>\n                        <th scope=\"col\">Target</th>\n                        <th scope=\"col\">Remaining</th>\n                      </>\n                    )}\n                    {spec.type === 'stages' && <th scope=\"col\">Share of top stage</th>}\n                  </tr>\n                </thead>\n                <tbody>\n                  {rows.map((point) => (\n                    <tr key={point.key}>\n                      <th scope=\"row\">{point.name}</th>\n                      {spec.type === 'scatter' && <td>{number.format(point.x ?? 0)}</td>}\n                      <td data-value={point.value}>{formatPoint(point, 'value')}</td>\n                      {supportsComparison && !secondaryMode && (\n                        <td data-previous={point.previous}>\n                          {point.previous === undefined ? '—' : formatPoint(point, 'previous')}\n                        </td>\n                      )}\n                      {secondaryMode&&<td data-secondary={point.secondary}>{point.secondary===undefined?'—':formatPoint(point,'secondary')}</td>}\n                      {['area-chart-card','radar-chart-card'].includes(id)&&rows.some(row=>row.series?.length)&&areaNames.map(name=><td key={name}>{formatSeries(name,areaValue(point,name))}{variant==='percent'?` (${number.format(round(point.value?areaValue(point,name)/point.value*100:0,2))}%)`:''}</td>)}\n                      {spec.type==='scatter'&&rows.some(row=>row.z!==undefined)&&<td>{point.z??'—'}</td>}\n                      {goals && (\n                        <>\n                          <td>{formatChartValue(point.goal ?? 0, pointUnit, point.unit)}</td>\n                          <td>\n                            {formatChartValue(\n                              Math.max(0, (point.goal ?? 0) - point.value),\n                              pointUnit,\n                              point.unit,\n                            )}\n                          </td>\n                        </>\n                      )}\n                      {spec.type === 'stages' && (\n                        <td>\n                          {number.format(\n                            round((point.value / Math.max(1, rows[0]?.value ?? 1)) * 100, 1),\n                          )}\n                          %\n                        </td>\n                      )}\n                    </tr>\n                  ))}\n                </tbody>\n              </table>\n            </div>\n          </details>\n  </>;\n  return (\n    <section\n      className={`hc-react-card${compact ? ' hc-react-compact' : ''}`}\n      data-chart-state={nativeState}\n      data-presentation={presentation}\n      aria-busy={nativeState==='loading'}\n      data-chart-tools-open={dataOpen}\n      data-chart-shape={shape}\n      data-chart-mono={mono}\n      style={{'--hc-chart-primary':plotPalette[0],'--hc-chart-active':activeChartColor(plotPalette[0]),'--hc-chart-track':'var(--color-chart-track)'} as CSSProperties}\n      data-custom-title={Boolean(title)}\n      data-plot-hovered={hovered}\n      data-chart-variant={variant}\n      data-chart-id={id}\n      data-chart-period={period}\n      data-period-presentation={periodPresentation}\n      data-list-truncated={spec.type==='list'&&rows.length>limit&&!listExpanded||undefined}\n      data-current-visible={currentVisible}\n      data-previous-visible={previousShown}\n    >\n      <div className=\"hc-react-card-header\">\n        <div className=\"hc-react-title-block\"><h3>{sourcePresentation&&hovered&&active?(['earnings-chart-card','line-chart-card'].includes(id)?({Jan:'January',Feb:'February',Mar:'March',Apr:'April',May:'May',Jun:'June',Jul:'July',Aug:'August',Sep:'September',Oct:'October',Nov:'November',Dec:'December'}as Record<string,string>)[active.name]||active.name:id==='steps-card'?({Mon:'Monday',Tue:'Tuesday',Wed:'Wednesday',Thu:'Thursday',Fri:'Friday',Sat:'Saturday',Sun:'Sunday'}as Record<string,string>)[active.name]||active.name:id==='combo-chart-card'?`${active.name} · ${line?.label||line?.name||'Conversion'} ${line?.format?.(active.secondary??0)??`${number.format(active.secondary??0)}%`}`:id==='scatter-chart-card'?`${active.name} · ${number.format(active.x??0)}`:active.name):title || (compact&&id==='steps-card'?'Steps':spec.name)}</h3>\n          {!compact&&<span className=\"hc-react-fixture-note\">{customData?'Provided data':`Illustrative ${unit==='currency'?'INR ':''}data`}</span>}\n          {state === 'ready' && rows.length > 0 && <div className=\"hc-react-headline\"><strong className=\"hu-chart-total\" role=\"img\" aria-label={compact&&spec.type==='score'&&weightedScore(rows)>=90?'Excellent':headline}><span aria-hidden=\"true\">{compact&&spec.type==='score'&&weightedScore(rows)>=90?'Excellent':animatedHeadline}</span></strong>{delta !== undefined && currentVisible && !(sourcePresentation&&hovered) && !(compact&&id==='steps-card') && <span className=\"hc-react-delta\" data-negative={delta<0}>{delta>0?'+':''}{number.format(round(delta,1))}%</span>}{sourcePresentation&&['steps-card','most-active-days-card'].includes(id)&&<span className=\"hc-source-total-label\">{hovered?'steps':'total steps'}</span>}</div>}\n        </div>\n        <div className=\"hc-react-header-tools\">{!(sourcePresentation&&spec.type==='contributions')&&(compact||!['list','rings'].includes(spec.type))&&periodControl}{compact&&!sourcePresentation&&<><button ref={dataTrigger} className=\"hc-react-data-trigger\" type=\"button\" title=\"Chart data and settings\" aria-label=\"Chart data and settings\" aria-haspopup=\"dialog\" aria-expanded={dataOpen} disabled={disabled||state!=='ready'||!rows.length} onClick={()=>setDataOpen(!dataOpen)}><UIIcon name=\"more\" /></button><Popover dir={direction} lang={locale} triggerRef={dataTrigger} isOpen={dataOpen&&state==='ready'&&rows.length>0} onOpenChange={setDataOpen} placement=\"bottom end\" className=\"hc-react-data-popover\"><AriaDialog aria-label=\"Chart data and settings\">{dataControls}</AriaDialog></Popover></>}</div>\n      </div>\n      {state !== 'ready' || !rows.length ? (\n        statePlot\n      ) : (\n        <>\n          <span className=\"hc-sr-only\">{headlineLabel} · {periodLabel}. {customData?'Data supplied by the application.':'Illustrative data; no live data service.'}</span>\n          {spec.type==='list'&&(tabs?.length||!data)?<div className=\"hc-react-list-heading\"><div className=\"hc-react-list-tabs\" role=\"group\" aria-label=\"Breakdown category\">{(tabs||['Devices','Browsers','Operating systems','Countries','Sources','Traffic'].map(name=>({id:name,label:name}))).map(tab=><button type=\"button\" key={tab.id} disabled={disabled} aria-pressed={(publicInput.tab?.id||listCategory)===tab.id} onClick={()=>{setListCategory(tab.id);setSelected(0);setListExpanded(false);clearEmphasis()}}>{tab.label}</button>)}</div><span>Visitors</span></div>:spec.type==='list'?<div className=\"hc-react-list-heading\"><strong>{title||'Pages'}</strong><span>Views</span></div>:null}\n          {spec.type === 'contributions' && (sourcePresentation?<div className=\"hc-react-summary hc-source-contribution-summary\"><span><strong>9B</strong>Lifetime tokens</span><span><strong>562.7M</strong>Peak tokens</span><span><strong>12h 54m</strong>Longest task</span><span><strong>62 days</strong>Top streak</span></div>:<div className=\"hc-react-summary\"><span><strong>{number.format(rows.length)}</strong>Recorded days</span><span><strong>{number.format(Math.max(0,...rows.map(row=>row.value)))}</strong>Peak activity</span><span><strong>{number.format(Math.round(sum(rows)/Math.max(1,rows.length)))}</strong>Daily average</span></div>)}\n          {sourcePresentation&&spec.type==='contributions'&&<div className=\"hc-source-activity-heading\"><span>Activity</span>{periodControl}</div>}\n          {tiles&&currentVisible && spec.type==='rings' && <div className={`hc-react-mini-legend hc-react-metric-legend `}>{rows.map(row=><button type=\"button\" key={row.key} disabled={disabled} aria-pressed={active?.key===row.key} onFocus={()=>inspect(rows.indexOf(row),true)} onBlur={clearEmphasis} onPointerMove={()=>inspect(rows.indexOf(row),true)} onClick={()=>inspect(rows.indexOf(row),true,true)}><span><i style={{background:row.color}}/>{row.name}</span><strong>{formatPoint(row,'value')}{spec.type==='score'?`/${number.format(row.goal??0)}`:''}</strong></button>)}</div>}\n          {displayPlot()}\n          {sourcePresentation&&spec.type==='stages'&&tiles&&currentVisible&&<div className=\"hc-react-mini-legend hc-source-stage-legend\">{rows.map(row=><span key={row.key}><i style={{background:row.color}}/>{row.name}<strong>{formatPoint(row,'value')}</strong></span>)}</div>}\n          {sourcePresentation&&spec.type==='sankey'&&<div className=\"hc-source-flow-captions\"><span>{axisLabels?.[0]||(rows[0]?.unit==='h'?'Tracked time':'Inflow')}</span><span>{axisLabels?.[1]||(rows[0]?.unit==='h'?'Share of tracked time':'Outflow')}</span></div>}\n          {spec.type==='scatter'&&<div className=\"hc-react-axis-captions\"><span>{axisLabels?.[1]||'Y measure'}</span><span>{axisLabels?.[0]||'X measure'}</span></div>}\n          {tiles&&currentVisible && !sourceRadarComparison && ['radial','score','radar'].includes(spec.type) && <div className={`hc-react-mini-legend hc-react-metric-legend ${spec.type==='score'?'hc-react-score-legend':''}`}>{rows.map(row=><button type=\"button\" key={row.key} disabled={disabled} aria-pressed={active?.key===row.key} onFocus={()=>inspect(rows.indexOf(row),true)} onBlur={clearEmphasis} onPointerMove={()=>inspect(rows.indexOf(row),true)} onClick={()=>inspect(rows.indexOf(row),true,true)}><span><i style={{background:spec.type==='radar'?plotPalette[0]:row.color}}/>{row.name}</span><strong>{formatPoint(row,'value')}{spec.type==='score'?`/${number.format(row.goal??0)}`:''}</strong></button>)}</div>}\n          {(tiles||sourcePresentation)&&sourceRadarComparison&&<div className=\"hc-react-mini-legend hc-source-radar-comparison\"><button type=\"button\" disabled={disabled} aria-pressed={currentVisible} onClick={()=>setCurrentVisible(!currentVisible)}><span><i style={{background:currentSeriesColor}}/>Desktop</span><strong>{formatChartValue(sum(rows),unit)}</strong></button><button type=\"button\" disabled={disabled} aria-pressed={previousShown} onClick={()=>setPreviousVisible(!previousVisible)}><span><i style={{background:previousSeriesColor}}/>Mobile</span><strong>{formatChartValue(sum(rows,'previous'),unit)}</strong></button></div>}\n          {sourcePresentation&&spec.type==='radial'&&variant==='stacked'&&<div className=\"hc-source-stacked-legend\">{rows.map((row,index)=><button key={row.key} type=\"button\" disabled={disabled} onFocus={()=>inspect(index,true)} onBlur={clearEmphasis} onPointerMove={()=>inspect(index,true)} onClick={()=>inspect(index,true,true)}><i style={{background:row.color}}/>{row.name}<strong>{formatPoint(row,'value')}</strong></button>)}</div>}\n          {spec.type==='list'&&rows.length>Math.max(1,limit)&&<button className=\"hc-react-show-more\" type=\"button\" disabled={disabled} aria-expanded={listExpanded} aria-label={listExpanded?'Show fewer':`Show ${rows.length-Math.max(1,limit)} more`} onClick={()=>setListExpanded(!listExpanded)}>{sourcePresentation?<UIIcon name={listExpanded?'chevron-up':'chevron-down'}/>:listExpanded?'Show fewer':`Show ${rows.length-Math.max(1,limit)} more`}</button>}\n          {(id==='orders-chart-card'||id==='revenue-chart-card')&&supportsComparison&&<div className=\"hc-react-comparison-legend\"><button type=\"button\" disabled={disabled} aria-pressed={currentVisible} onClick={()=>setCurrentVisible(!currentVisible)}><i style={{background:currentSeriesColor}}/>This period</button><button type=\"button\" disabled={disabled} aria-pressed={previousShown} onClick={()=>setPreviousVisible(!previousVisible)}><i style={{background:previousSeriesColor}}/>Previous period</button><span>{formatChartValue(sum(rows,'previous'),unit)} previous period</span></div>}\n          {tiles&&secondaryMode&&currentVisible&&<div className=\"hc-react-mini-legend\"><span><i style={{background:currentSeriesColor}}/>{bar?.label||bar?.name||(sourcePresentation?'Sessions':'Volume')} · total<strong>{formatChartValue(sourcePresentation&&hovered&&active?active.value:sum(rows),unit)}</strong></span><span><i style={{background:previousSeriesColor}}/>{line?.label||line?.name||'Conversion'} · {sourcePresentation&&hovered?'this month':'average'}<strong>{line?.format?.(secondaryLegendValue)??`${number.format(secondaryLegendValue)}%`}</strong></span></div>}\n\n\n          {spec.type==='heatmap'&&(sourcePresentation?<div className=\"hc-source-heatmap-scale\" aria-hidden=\"true\"><span>Less</span>{[10,30,50,70,90].map(percent=><i key={percent} style={{background:`color-mix(in srgb,var(--hc-chart-primary) ${percent}%,var(--color-chart-track))`}}/>)}<span>More</span></div>:<div className=\"hc-react-month-axis\" aria-hidden=\"true\"><span>Mon — Sun</span><span>{period==='12'?'00:00 — 23:00':period==='6'?'12:00 — 23:00':'18:00 — 23:00'}</span></div>)}\n\n          {currentVisible&&spec.type==='scatter'&&<div className=\"hc-react-mini-legend\">{scatterGroups.map((tier,index)=>{const tierRows=rows.filter((_,rowIndex)=>scatterGroup(rows[rowIndex],rowIndex)===tier);return <span key={tier}><i style={{background:tierRows[0]?.color||plotPalette[index%plotPalette.length]}}/>{tier} · avg<strong>{formatChartValue(sourcePresentation?Math.round(sum(tierRows)/Math.max(1,tierRows.length)):sum(tierRows)/Math.max(1,tierRows.length),unit)}</strong></span>})}</div>}\n          {id==='area-chart-card'&&currentVisible&&<div className=\"hc-react-mini-legend\">{areaNames.map((name,index)=><span key={name}><i style={{background:plotPalette[index%plotPalette.length]}}/>{name}<strong>{formatSeries(name,sourcePresentation&&hovered&&active?areaValue(active,name):rows.reduce((total,row)=>total+areaValue(row,name),0))}</strong></span>)}</div>}\n          {!compact&&!sourcePresentation&&dataControls}\n          {sourcePresentation&&<div className=\"hc-sr-only\"><table><caption>{title||spec.name}: illustrative source-shaped fixture data</caption><thead><tr><th scope=\"col\">Category</th><th scope=\"col\">Value</th>{supportsComparison&&<th scope=\"col\">Previous value</th>}</tr></thead><tbody>{rows.map(row=><tr key={row.key}><th scope=\"row\">{row.name}</th><td>{formatPoint(row,'value')}</td>{supportsComparison&&<td>{row.previous===undefined?'Not supplied':formatPoint(row,'previous')}</td>}</tr>)}</tbody></table></div>}\n        </>\n      )}\n    </section>\n  );\n}\n\nexport type SourceChartProfile={title:string;width:number;height:number;plotHeight:number;headline:string|number;delta?:number;period:string;unit:ChartUnit};\n/** Public rendered BoardUI card dimensions and default labels, observed 26 October 2026. */\nexport const sourceChartProfiles:Record<string,SourceChartProfile>={\n 'activity-rings-card':{title:'Activity',width:448,height:330,plotHeight:200,headline:'',period:'',unit:'count'},\n 'area-chart-card':{title:'Visitors',width:576,height:365,plotHeight:196,headline:94700,delta:8.2,period:'This year',unit:'count'},\n 'bar-list-card':{title:'Visitors',width:448,height:177,plotHeight:100,headline:'',period:'',unit:'count'},\n 'combo-chart-card':{title:'Sessions · Conversion 3.7%',width:576,height:365,plotHeight:196,headline:83200,delta:9.4,period:'This year',unit:'count'},\n 'contributions-card':{title:'Contributions this year',width:672,height:337,plotHeight:130,headline:958,delta:14.8,period:'Weekly',unit:'count'},\n 'earnings-chart-card':{title:'Earned so far',width:673,height:329,plotHeight:221,headline:7462,delta:14.8,period:'Weekly',unit:'currency'},\n 'funnel-chart-card':{title:'Sign-up funnel',width:672,height:329,plotHeight:157,headline:197,delta:5.2,period:'Last 7 days',unit:'count'},\n 'heatmap-chart-card':{title:'Active users',width:448,height:329,plotHeight:210,headline:1892,delta:5.2,period:'Last 7 days',unit:'count'},\n 'line-chart-card':{title:'Revenue',width:576,height:329,plotHeight:221,headline:18240,delta:9.4,period:'Weekly',unit:'currency'},\n 'most-active-days-card':{title:'Most active days',width:363,height:330,plotHeight:232,headline:32459,period:'July',unit:'count'},\n 'orders-chart-card':{title:'Orders',width:720,height:344,plotHeight:221,headline:25162,delta:20,period:'This year',unit:'count'},\n 'radar-chart-card':{title:'Visitors',width:448,height:465,plotHeight:231,headline:1424,delta:5.2,period:'H1 2024',unit:'count'},\n 'radial-chart-card':{title:'Visitors',width:448,height:465,plotHeight:231,headline:925,delta:5.2,period:'Last 7 days',unit:'count'},\n 'revenue-chart-card':{title:'Revenue',width:720,height:344,plotHeight:221,headline:152314,delta:16,period:'This year',unit:'currency'},\n 'sankey-chart-card':{title:'Tracked time',width:672,height:480,plotHeight:344,headline:'86h',period:'This week',unit:'count'},\n 'scatter-chart-card':{title:'Revenue per account',width:576,height:397,plotHeight:221,headline:742,delta:6.8,period:'This quarter',unit:'count'},\n 'sleep-score-card':{title:'Sleep score',width:448,height:330,plotHeight:104,headline:'Excellent',period:'29 Jun - 5 Jul',unit:'percent'},\n 'stage-bars-card':{title:'Pipeline',width:448,height:430,plotHeight:256,headline:1180,delta:2.4,period:'Last 7 days',unit:'count'},\n 'steps-card':{title:'Steps',width:587,height:330,plotHeight:232,headline:31600,period:'29 Jun - 5 Jul',unit:'count'},\n};\nfunction sourceActivityYear(){\n return Array.from({length:12},(_,month)=>{\n  const count=new Date(2026,month+1,0).getDate(),recorded=month<6?count:month===6?10:0;\n  const values=Array.from({length:count},(_,index)=>index<recorded?350+((index*127+month*73+(index%5)*63)%1300):0),target=month===6?32459:recorded?29000+month*413:0;\n  const scale=target/Math.max(1,values.reduce((a,b)=>a+b,0)),rounded=values.map(value=>Math.floor(value*scale));\n  for(let i=0,left=target-rounded.reduce((a,b)=>a+b,0);left>0;i++,left--)rounded[i%Math.max(1,recorded)]++;\n  return rounded.map((value,index)=>({name:`${months[month]} ${index+1}`,date:`2026-${String(month+1).padStart(2,'0')}-${String(index+1).padStart(2,'0')}`,value,activity:(index>=recorded?[0,0,0]:[.25+((index*13+month*7)%70)/100,.35+((index*7+month*11)%60)/100,.3+((index*17+month*5)%65)/100]) as[number,number,number]}));\n });\n}\nconst sourceDatedActivity=sourceActivityYear();\nexport function SourceActivityCalendar({disabled=false,onSelect,defaultSelected=9}:{disabled?:boolean;onSelect?:(row:ChartDatum,index:number)=>void;defaultSelected?:number}){\n const[month,setMonth]=useState(6),[selected,setSelected]=useState(sourceDatedActivity[6][Math.min(30,Math.max(0,defaultSelected))].date),scroll=useRef<HTMLDivElement>(null),sections=useRef<(HTMLDivElement|null)[]>([]),reduced=useReducedMotion();\n const monthTop=(index:number)=>{const host=scroll.current,node=sections.current[index];return host&&node?node.getBoundingClientRect().top-host.getBoundingClientRect().top+host.scrollTop:0};\n const go=(next:number)=>{const index=Math.max(0,Math.min(11,next));setMonth(index);scroll.current?.scrollTo({top:monthTop(index),behavior:reduced===false?'smooth':'instant'})};\n useEffect(()=>{const host=scroll.current;if(!host)return;let ready=false,frame=0;const position=()=>{if(ready||host.clientHeight<1)return;frame=requestAnimationFrame(()=>{const top=monthTop(6);if(top>0){host.scrollTo({top,behavior:'instant'});setMonth(6);ready=true}})};const observer=new ResizeObserver(position);observer.observe(host);position();return()=>{observer.disconnect();cancelAnimationFrame(frame)}},[]);\n const choose=(row:typeof sourceDatedActivity[number][number],index:number)=>{if(disabled)return;setSelected(row.date);onSelect?.(row,index)};\n return <section className=\"hc-react-card hc-source-calendar-card\" data-presentation=\"source\"><header className=\"hc-source-calendar-header\"><div><h3>Most active days</h3><div><strong>{number.format(sum(sourceDatedActivity[month]))}</strong><span>total steps</span></div></div><div className=\"hc-source-date-control\"><button type=\"button\" disabled={disabled||month===0} aria-label=\"Previous activity month\" onClick={()=>go(month-1)}><UIIcon name=\"chevron-left\"/></button><select value={month} aria-label=\"Activity month\" disabled={disabled} onChange={event=>go(Number(event.target.value))}>{months.map((name,index)=><option key={name} value={index}>{new Date(2026,index,1).toLocaleString('en-US',{month:'long'})}</option>)}</select><button type=\"button\" disabled={disabled||month===11} aria-label=\"Next activity month\" onClick={()=>go(month+1)}><UIIcon name=\"chevron-right\"/></button></div></header><div ref={scroll} className=\"hc-source-year-scroll\" role=\"region\" aria-label=\"Scrollable activity calendar for 2026\" tabIndex={0} onScroll={()=>{const top=scroll.current?.scrollTop??0,index=sections.current.reduce((found,node,i)=>node&&(node.getBoundingClientRect().top-(scroll.current?.getBoundingClientRect().top??0)+top<=top+35)?i:found,0);setMonth(index)}}>{sourceDatedActivity.map((days,monthIndex)=><div key={monthIndex} ref={node=>{sections.current[monthIndex]=node}} className=\"hc-source-month\"><h4>{months[monthIndex]}</h4><div className=\"hc-source-day-grid\">{days.map((row,index)=><button key={row.date} type=\"button\" data-source-date={row.date} disabled={disabled} tabIndex={selected===row.date?0:-1} aria-pressed={selected===row.date} aria-label={`${new Date(row.date+'T12:00:00').toLocaleDateString('en-US',{month:'long',day:'numeric',year:'numeric'})}: ${number.format(row.value)} steps`} onClick={()=>choose(row,index)} onKeyDown={event=>{if(disabled)return;let offset=event.key==='ArrowRight'?1:event.key==='ArrowLeft'?-1:event.key==='ArrowDown'?7:event.key==='ArrowUp'?-7:0;if(event.key==='PageDown'||event.key==='PageUp'){event.preventDefault();go(monthIndex+(event.key==='PageDown'?1:-1));return}if(event.key==='Home')offset=-index;if(event.key==='End')offset=days.length-1-index;if(offset||event.key==='Home'||event.key==='End'){event.preventDefault();const date=new Date(row.date+'T12:00:00');date.setDate(date.getDate()+offset);if(date.getFullYear()!==2026)return;const target=date.toISOString().slice(0,10);if(date.getMonth()!==monthIndex)go(date.getMonth());requestAnimationFrame(()=>scroll.current?.querySelector<HTMLButtonElement>(`button[data-source-date=\"${target}\"]`)?.focus())}}}><span>{index+1}</span><svg viewBox=\"0 0 28 28\" aria-hidden=\"true\">{[11,7.5,4].map((radius,metricIndex)=><g key={radius} transform=\"rotate(-90 14 14)\"><circle cx=\"14\" cy=\"14\" r={radius} fill=\"none\" stroke={`var(--color-chart-${[3,2,4][metricIndex]})`} strokeOpacity={.14} strokeWidth={2}/><circle cx=\"14\" cy=\"14\" r={radius} pathLength={100} fill=\"none\" stroke={`var(--color-chart-${[3,2,4][metricIndex]})`} strokeWidth={2} strokeLinecap=\"round\" strokeDasharray={`${row.activity[metricIndex]*100} ${100-row.activity[metricIndex]*100}`}/></g>)}</svg></button>)}</div></div>)}</div><div className=\"hc-sr-only\"><table><caption>Illustrative activity for {months[month]}, 2026</caption><thead><tr><th scope=\"col\">Date</th><th scope=\"col\">Steps</th></tr></thead><tbody>{sourceDatedActivity[month].map(row=><tr key={row.date}><th scope=\"row\">{row.date}</th><td>{row.value}</td></tr>)}</tbody></table></div></section>;\n}\nexport type SourceChartPreviewProps=Omit<ModernChartProps,'presentation'>&{example?:string;fluid?:boolean};\nexport function SourceChartPreview({id,example='default',fluid=false,...props}:SourceChartPreviewProps){\n const [chosenVariant,setChosenVariant]=useState<ChartVariant>('default'),[selectedSourceDay,setSelectedSourceDay]=useState<ChartDatum|undefined>(undefined);\n const profile=sourceChartProfiles[id],spec=chartDefinitions.find(item=>item.id===id);\n if(!profile||!spec)return <DataState state=\"empty\" emptyMessage=\"This chart is not in the public source catalogue.\"/>;\n if(example!=='in-row'&&(id==='orders-chart-card'||id==='revenue-chart-card')&&!props.ranges&&!props.onSelect&&(!props.state||props.state==='ready')&&(!props.data||props.data.length>0&&props.data.every(row=>typeof row.previous==='number'))){const cardData=props.data?.map(row=>({label:String(row.name??('label'in row?row.label:'')),current:Number(row.value??('current'in row?row.current:0)),previous:Number(row.previous)}));const Card=id==='orders-chart-card'?NativeOrdersChartCard:NativeRevenueChartCard;return <NativeScope><div className={`hc-source-example${fluid?' hc-source-fluid':''}`} style={{'--source-chart-width':`${profile.width}px`,'--source-chart-height':`${profile.height}px`}as CSSProperties}><Card title={props.title||profile.title} data={example==='numbers'?[{label:'Jan',current:120,previous:100},{label:'Feb',current:180,previous:150},{label:'Mar',current:160,previous:140}]:cardData} disabled={props.disabled}/></div></NativeScope>;}\n if(id==='most-active-days-card'&&!fluid)return <div className=\"hc-source-days-pair\"><SourceChartPreview id={id} fluid defaultSelected={9} {...props} onSelect={(row,index)=>{setSelectedSourceDay(row);props.onSelect?.(row,index)}}/><SourceChartPreview id=\"activity-rings-card\" fluid disabled={props.disabled} state={props.state} onRetry={props.onRetry} title={`Activity for ${selectedSourceDay?.name||'Jul 10'}, 2026`} data={[{name:'Move',value:selectedSourceDay?Math.round(selectedSourceDay.value*.2):816,goal:2000,unit:'kcal'},{name:'Exercise',value:selectedSourceDay?Math.round(selectedSourceDay.value/25):101,goal:120,unit:'min'},{name:'Running',value:selectedSourceDay?Math.round(selectedSourceDay.value/850*10)/10:5.2,goal:8,unit:'km'}]}/></div>;\n if(id==='most-active-days-card'&&!props.data&&!props.ranges&&(!props.unit||props.unit==='count')&&(!props.state||props.state==='ready'))return <NativeScope><div className={`hc-source-example${fluid?' hc-source-fluid':''}`} data-source-chart={id} style={{'--source-chart-width':`${profile.width}px`,'--source-chart-height':`${profile.height}px`}as CSSProperties}><SourceActivityCalendar defaultSelected={props.defaultSelected??9} disabled={props.disabled} onSelect={props.onSelect}/></div></NativeScope>;\n if(example==='numbers')return <SourceChartPreview id={id} data={[{name:'Jan',value:120,previous:100},{name:'Feb',value:180,previous:150},{name:'Mar',value:160,previous:140}]} {...props}/>;\n if(example==='in-row')return <div className=\"hc-source-row\"><SourceChartPreview id={id} fluid {...props}/><SourceChartPreview id={id} fluid {...props}/></div>;\n if(example==='shapes'){const hiring=[{name:'Applied',value:1240},{name:'Screened',value:420},{name:'Phone',value:95},{name:'Offer',value:18},{name:'Hired',value:11}],checkout=[{name:'Viewed',value:41800},{name:'Basket',value:18400},{name:'Checkout',value:9400},{name:'Payment',value:6200},{name:'Paid',value:5200}];return <div className=\"hc-source-example-stack\"><SourceChartPreview id={id} shape=\"sharp\" title=\"Hiring\" ranges={[{id:'q',label:'This quarter',data:hiring,headline:1240}]} {...props}/><SourceChartPreview id={id} title=\"Checkout\" mono ranges={[{id:'7d',label:'Last 7 days',data:checkout,headline:41800,delta:-1.8}]} {...props}/><SourceChartPreview id={id} shape=\"sharp\" title=\"Hiring\" mono ranges={[{id:'q',label:'This quarter',data:hiring,headline:1240}]} {...props}/></div>;}\n if(example==='single')return <div className=\"hc-source-row\"><SourceChartPreview id={id} fluid title=\"Pages\" items={[{label:'/',value:12480},{label:'/pricing',value:6210},{label:'/components',value:4880},{label:'/blog/launch',value:2140},{label:'/docs',value:1260}]} metric=\"value\" limit={4} {...props}/><SourceChartPreview id={id} fluid mono {...props}/></div>;\n if(example==='without-bubbles')return <SourceChartPreview id={id} bubble={false} {...props}/>;\n if(example==='sharp')return <SourceChartPreview id={id} shape=\"sharp\" {...props}/>;\n if(example==='mono')return <SourceChartPreview id={id} mono {...props}/>;\n if(example==='with-tiles')return <SourceChartPreview id={id} tiles {...props}/>;\n if(example==='variants'&&id==='area-chart-card'){const data=(observedSourceCharts.data as Record<string,ChartDatum[]>)[id],ranges=[{id:'year',label:'This year',data,headline:50500,delta:8.2},{id:'prior',label:'Last year',data:data.map(row=>({...row,value:row.value*.86,series:row.series?.map(part=>({...part,value:part.value*.86}))})),headline:43430,delta:8.2}];return <div className=\"hc-source-variant-stack\"><SourceChartPreview id={id} fluid variant=\"overlap\" tiles={false} ranges={ranges} {...props}/><SourceChartPreview id={id} fluid variant=\"percent\" tiles={false} {...props}/></div>;}\n if(example==='variants'&&id==='radar-chart-card'){const score=[{name:'Focus',value:100},{name:'Consistency',value:9},{name:'Target',value:100},{name:'Balance',value:100},{name:'Deep work',value:97}];return <div className=\"hc-source-variant-grid\"><SourceChartPreview id={id} fluid variant=\"dots\" tiles={false} {...props}/><SourceChartPreview id={id} fluid variant=\"lines\" tiles={false} {...props}/><SourceChartPreview id={id} fluid variant=\"score\" title=\"Weekly score\" tiles={false} ranges={[{id:'week',label:'This week',data:score}]} {...props}/></div>;}\n if(example==='variants'&&id==='radial-chart-card'){const solo=[{name:'Visitors',value:1260,goal:2000,color:'var(--color-chart-2)'}],parts=[{name:'Desktop',value:1260,color:'var(--color-chart-2)'},{name:'Mobile',value:570,color:'var(--color-chart-6)'}],range=(data:ChartDatum[])=>[{id:'week',label:'Last 7 days',data,delta:5.2}];return <div className=\"hc-source-variant-grid\"><SourceChartPreview id={id} fluid variant=\"labels\" tiles={false} {...props}/><SourceChartPreview id={id} fluid variant=\"grid\" tiles={false} {...props}/><SourceChartPreview id={id} fluid variant=\"gauge\" tiles={false} ranges={range(solo)} {...props}/><SourceChartPreview id={id} fluid variant=\"solid\" tiles={false} ranges={range(solo)} {...props}/><SourceChartPreview id={id} fluid variant=\"stacked\" tiles={false} ranges={range(parts)} {...props}/></div>;}\n if(example==='data'&&id==='combo-chart-card')return <SourceChartPreview id={id} title=\"Revenue · Conversion 3.7%\" tiles={false} {...props}/>;\n if(example==='data'&&id==='funnel-chart-card'){const data=[{name:'Viewed',value:41800},{name:'Basket',value:18400},{name:'Checkout',value:9400},{name:'Payment',value:6200},{name:'Paid',value:5200}];return <SourceChartPreview id={id} title=\"Checkout funnel\" ranges={[{id:'7d',label:'Last 7 days',data,delta:-1.8},{id:'30d',label:'Last 30 days',data:data.map(row=>({...row,value:row.value*3})),delta:4.2},{id:'90d',label:'Last 90 days',data:data.map(row=>({...row,value:row.value*9})),delta:9.7}]} {...props}/>;}\n if(example==='data'&&id==='heatmap-chart-card'){const rows=[{label:'EMEA',values:[42,48,55,61,70,74]},{label:'AMER',values:[38,40,47,52,58,66]},{label:'APAC',values:[21,25,29,36,41,49]},{label:'LATAM',values:[12,14,15,19,24,27]}];return <SourceChartPreview id={id} title=\"Revenue by region\" columns={['Jan','Feb','Mar','Apr','May','Jun']} max={80} color=\"var(--color-chart-7)\" ranges={[{id:'h1',label:'H1 2024',rows,delta:11.8},{id:'h2',label:'H2 2024',rows:rows.map(row=>({...row,values:row.values.map(value=>Math.round(value*.86))})),delta:6.4}]} {...props}/>;}\n if(example==='tabs'&&id==='bar-list-card'){const names=['United States of America','India','Brazil','Japan','Türkiye','Germany','France','United Kingdom','Canada','Australia'],flags=['🇺🇸','🇮🇳','🇧🇷','🇯🇵','🇹🇷','🇩🇪','🇫🇷','🇬🇧','🇨🇦','🇦🇺'],values=[3120,2160,1400,980,960,760,620,480,240,180];return <SourceChartPreview id={id} tabs={[{id:'countries',label:'Countries',items:names.map((label,index)=>({label,value:values[index],icon:flags[index]}))},{id:'sources',label:'Sources',items:[{label:'Direct',value:5240},{label:'Organic search',value:4180},{label:'Referral',value:2780},{label:'Social',value:1830},{label:'Email',value:940}]}]} defaultTab=\"countries\" limit={5} {...props}/>;}\n const sourceData:ChartDatum[]=(observedSourceCharts.data as Record<string,ChartDatum[]>)[id]||fixture(spec).map((row,index)=>id==='stage-bars-card'?{...row,icon:[<RiFocus2Line size={16}/>,<RiUserAddLine size={16}/>,<RiFlashlightLine size={16}/>,<RiVipCrown2Line size={16}/>,<RiGroupLine size={16}/>,<RiBuildingLine size={16}/>][index]}:id==='activity-rings-card'?{...row,progress:[82,60,75][index]}:id==='sleep-score-card'?{...row,name:row.name==='Duration'?'Duration: 7h 50m':row.name==='Bedtime'?'Bedtime: 20m earlier':'Interruptions: 5m wake up',color:row.name==='Duration'?'var(--color-chart-5)':row.name==='Bedtime'?'var(--color-chart-3)':'var(--color-chart-6)'}:id==='most-active-days-card'?{...row,name:row.name.replace('Oct','Jul')}:row),segmented=['earnings-chart-card','line-chart-card','contributions-card'].includes(id),labels=segmented?['Weekly','Monthly','Yearly']:['area-chart-card','combo-chart-card'].includes(id)?['This year','Last 6 months','Last year']:id==='radar-chart-card'?['H1 2024','H2 2024','2024']:id==='sankey-chart-card'?['This week','Last week','This month']:id==='scatter-chart-card'?['This quarter','Last quarter','This year']:['sleep-score-card','steps-card','activity-rings-card'].includes(id)?['29 Jun - 5 Jul','22 Jun - 28 Jun','15 Jun - 21 Jun']:['Last 7 days','Last 30 days','Last 90 days'];\n const ranges:ChartRange[]=labels.map((label,index)=>{const factor=index===1?.86:index===2?.73:1,rangeData=sourceData.map(row=>({...row,...(index?{value:round(row.value*factor,2),previous:row.previous===undefined?undefined:round(row.previous*factor,2),series:row.series?.map(part=>({...part,value:round(part.value*factor,2)}))}:{})}));return{id:`source-${index}`,label,data:rangeData,headline:id==='sankey-chart-card'?`${number.format(round(sum(rangeData),2))}h`:typeof profile.headline==='number'?round(profile.headline*factor,2):profile.headline,delta:profile.delta}});\n const listTabs:ChartListTab[]=[{id:'Devices',label:'Devices',items:[{label:'Desktop',value:61,icon:<RiComputerLine size={16}/>},{label:'Mobile',value:31,icon:<RiSmartphoneLine size={16}/>},{label:'Tablet',value:8,icon:<RiTabletLine size={16}/>}]},{id:'Browsers',label:'Browsers',items:[{label:'Chrome',value:65},{label:'Safari',value:24},{label:'Firefox',value:11}]},{id:'Operating systems',label:'Operating systems',items:[{label:'macOS',value:52},{label:'Windows',value:38},{label:'Linux',value:10}]},{id:'Screen sizes',label:'Screen sizes',items:[{label:'Desktop',value:66},{label:'Laptop',value:23},{label:'Mobile',value:11}]}];\n const hasInput=props.data!==undefined||props.series!==undefined||props.rows!==undefined||props.stages!==undefined||props.links!==undefined||props.items!==undefined||props.tabs!==undefined;\n return <NativeScope><div className={`hc-source-example${fluid?' hc-source-fluid':''}`} data-source-chart={id} data-source-example={example} data-source-default={!hasInput&&!props.ranges?true:undefined} style={{'--source-chart-width':`${profile.width}px`,'--source-chart-height':`${props.tiles===false&&['area-chart-card','combo-chart-card','radar-chart-card','radial-chart-card'].includes(id)?329:id==='bar-list-card'&&props.tabs?257:id==='bar-list-card'&&props.items?217:profile.height}px`} as CSSProperties}>{example==='variants'&&<div className=\"hc-source-variant-controls\" role=\"group\" aria-label=\"Chart variant\">{(chartVariantOptions[id]||[]).map(option=><button key={option.value} type=\"button\" disabled={props.disabled} aria-pressed={chosenVariant===option.value} onClick={()=>setChosenVariant(option.value)}>{option.label}</button>)}</div>}<ModernChart id={id} sourceDefaultLayout={!fluid&&!hasInput&&!props.ranges} variant={example==='variants'?chosenVariant:undefined} presentation=\"source\" title={profile.title} unit={['activity-rings-card','sankey-chart-card'].includes(id)?undefined:profile.unit} ranges={hasInput?undefined:ranges} defaultRange=\"source-0\" {...(id==='bar-list-card'?{...(props.items?{}:{tabs:listTabs.slice(0,2)}),metric:'share' as const,limit:10}:id==='scatter-chart-card'?{axisLabels:['Sessions','Revenue']as[string,string]}:null)} {...props}/></div></NativeScope>;\n}\nexport type SourceChartSection={id:string;title:string;example:string;code:string;preview?:boolean;description?:string;previewStyle?:CSSProperties};\nconst chartSectionExamples:Record<string,[string,string,boolean?][]>= {\n 'area-chart-card':[['variants','Variants'],['data','Data',false]],'bar-list-card':[['tabs','Tabbed lists'],['single','Single list and mono']],\n 'combo-chart-card':[['data','Data']],'funnel-chart-card':[['shapes','Shapes and mono'],['data','Data']],'heatmap-chart-card':[['data','Data']],\n 'line-chart-card':[['sharp','Sharp corners']],'orders-chart-card':[['numbers','Your own numbers',false],['in-row','In a row',false]],\n 'radar-chart-card':[['variants','Variants'],['data','Data',false]],'radial-chart-card':[['variants','Variants'],['with-tiles','With tiles'],['data','Data',false]],\n 'revenue-chart-card':[['numbers','Your own numbers',false],['in-row','In a row',false]],'sankey-chart-card':[['data','Data',false]],\n 'scatter-chart-card':[['without-bubbles','Without bubbles'],['data','Data',false]],'stage-bars-card':[['mono','Mono'],['data','Data',false]],\n};\nfunction sourceChartCode(id:string,example:string){\n const data=id==='sankey-chart-card'?`nodes={[{name:'Income'},{name:'Savings'},{name:'Expenses'}]} links={[{source:0,target:1,value:40},{source:0,target:2,value:60}]}`:id==='heatmap-chart-card'?`rows={[{label:'Mon',values:[2,5,8]},{label:'Tue',values:[4,3,6]}]} columns={['08','12','16']}`:id==='radar-chart-card'?`data={[{name:'Design',value:80},{name:'Code',value:65},{name:'Research',value:90}]}`:id==='scatter-chart-card'?`series={[{name:'Starter',color:'var(--color-chart-2)',points:[{x:12,y:80,z:20},{x:24,y:160,z:45}]}]}`:id==='funnel-chart-card'||id==='stage-bars-card'?`stages={[{label:'Visited',value:100},{label:'Signed up',value:60},{label:'Activated',value:32}]}`:`data={[{name:'Jan',value:120,previous:100},{name:'Feb',value:180,previous:150},{name:'Mar',value:160,previous:140}]}`;\n const extra=example==='data'||example==='numbers'?' '+data:example==='sharp'?' shape=\"sharp\"':example==='mono'?' mono':example==='without-bubbles'?' bubble={false}':example==='with-tiles'?' tiles':example==='default'?'':` example=\"${example}\"`;\n return `import {SourceChartPreview} from '@helios-ui/react';\\nimport '@helios-ui/react/styles.css';\\n\\nexport default function Example(){return <SourceChartPreview id=\"${id}\"${extra}/>;}`;\n}\nexport const sourceChartSections:Record<string,SourceChartSection[]>=Object.fromEntries(chartDefinitions.map(spec=>[spec.id,[['default','Preview',true]as [string,string,boolean],...(chartSectionExamples[spec.id]||[])].map(([example,title,preview])=>({id:example==='default'?'preview':example,title,example,preview:preview!==false,previewStyle:{padding:24},code:sourceChartCode(spec.id,example),description:(chartSectionCopy as Record<string,Record<string,string>>)[spec.id]?.[example]}))]));\n",
  "src/CreatorAppearance.tsx": "'use client';\nimport {useEffect,useId,useRef,useState,type ReactNode} from 'react';\nimport {motion,useAnimationFrame,useMotionValue,useSpring,useTransform,type MotionValue} from 'motion/react';\nimport {useMotionPreference} from './useMotionPreference.js';\nimport type {AgentProfile} from './AgentPatterns.js';\n\nconst expressions:AgentProfile['expression'][]=['neutral','happy','angry','thinking','shook','curious','wink','sleepy','sad','worried','skeptical','focused','excited','calm','shy','confused'];\nconst shapes:AgentProfile['shape'][]=['slender','pocket','petal','flower','star','heart','cloud','diamond','shield'];\nconst wrap=(index:number)=>((index%shapes.length)+shapes.length)%shapes.length;\nconst spring={stiffness:180,damping:28};\nconst title=(value:string)=>value.charAt(0).toUpperCase()+value.slice(1);\nfunction Emotion({index,rotation,expression,selected,disabled,color,render,onSelect}:{index:number;rotation:MotionValue<number>;expression:AgentProfile['expression'];selected:boolean;disabled:boolean;color:string;render:(expression:AgentProfile['expression'])=>ReactNode;onSelect:()=>void}){\n const angle=index*360/expressions.length,counter=useTransform(rotation,value=>-value-angle);\n return <div className=\"hp-creator-emotion-position\" style={{transform:`rotate(${angle}deg) translateY(-116px)`}}><motion.div style={{rotate:counter}}><button type=\"button\" disabled={disabled} aria-label={title(expression)} aria-pressed={selected} style={{backgroundColor:color}} onClick={onSelect}>{render(expression)}</button></motion.div></div>;\n}\nfunction EmotionOrbit({profile,disabled,render,onChange}:{profile:AgentProfile;disabled:boolean;render:(profile:Pick<AgentProfile,'shape'|'expression'|'color'|'name'>&{animated?:boolean})=>ReactNode;onChange:(patch:Partial<AgentProfile>)=>void}){\n const reduced=useMotionPreference(),target=useMotionValue(0),rotation=useSpring(target,spring),ref=useRef<HTMLDivElement>(null),hover=useRef(false),focus=useRef(false),visible=useRef(true),gesture=useRef<{angle:number;moved:boolean}|null>(null),suppressClick=useRef(false);\n useAnimationFrame((_time,delta)=>{if(reduced===false&&!disabled&&!hover.current&&!focus.current&&!gesture.current&&visible.current&&!document.hidden)target.set(target.get()+.003*Math.min(delta,64))});\n const adjust=(value:number)=>{target.set(value);if(reduced!==false)rotation.jump(value)};\n useEffect(()=>{const node=ref.current;if(!node)return;const observer=new IntersectionObserver(([entry])=>{visible.current=entry.isIntersecting});observer.observe(node);const wheel=(event:WheelEvent)=>{if(event.ctrlKey||disabled)return;event.preventDefault();event.stopPropagation();const delta=Math.abs(event.deltaX)>Math.abs(event.deltaY)?event.deltaX:event.deltaY;const unit=event.deltaMode===1?16:event.deltaMode===2?120:1;adjust(target.get()+delta*unit*.2)};node.addEventListener('wheel',wheel,{passive:false});return()=>{observer.disconnect();node.removeEventListener('wheel',wheel)}},[disabled,reduced,target,rotation]);\n const angle=(x:number,y:number,node:HTMLElement)=>{const box=node.getBoundingClientRect();return Math.atan2(y-box.top-box.height/2,x-box.left-box.width/2)*180/Math.PI};\n const wells:Record<string,string>={'#f8b193':'hsl(18 76% 80%)','#8eb0f6':'hsl(220 85% 80%)','#a4dfe0':'hsl(181 49% 80%)','#b194f0':'hsl(259 75% 80%)','#ef95cf':'hsl(321 74% 80%)','#f29292':'hsl(0 78% 80%)','#f8c48b':'hsl(31 89% 80%)','#92ddf2':'hsl(193 78% 80%)','#d3ee96':'hsl(78 72% 80%)','#a3e1bd':'hsl(145 51% 80%)'};\n const wellColor=wells[profile.color.toLowerCase()]||profile.color;\n return <div ref={ref} className=\"hp-creator-emotions\" role=\"group\" aria-label=\"Agent emotion\" onPointerEnter={()=>{hover.current=true}} onPointerLeave={()=>{hover.current=false}} onFocusCapture={()=>{focus.current=true}} onBlurCapture={event=>{if(!event.currentTarget.contains(event.relatedTarget))focus.current=false}} onClickCapture={event=>{if(event.detail>0&&suppressClick.current){event.preventDefault();event.stopPropagation()}}} onPointerDown={event=>{if(disabled||event.button!==0)return;target.set(rotation.get());suppressClick.current=false;gesture.current={angle:angle(event.clientX,event.clientY,event.currentTarget),moved:false}}} onPointerMove={event=>{const drag=gesture.current;if(!drag)return;const next=angle(event.clientX,event.clientY,event.currentTarget),delta=((next-drag.angle+540)%360)-180;if(Math.abs(delta)>2||drag.moved){drag.moved=true;suppressClick.current=true;drag.angle=next;event.currentTarget.setPointerCapture(event.pointerId);adjust(target.get()+delta)}}} onPointerUp={event=>{if(event.currentTarget.hasPointerCapture(event.pointerId))event.currentTarget.releasePointerCapture(event.pointerId);gesture.current=null}} onPointerCancel={()=>{gesture.current=null}} onLostPointerCapture={()=>{gesture.current=null}}><motion.div className=\"hp-creator-emotion-ring\" style={{rotate:rotation}}>{expressions.map((expression,index)=><Emotion key={expression} index={index} rotation={rotation} expression={expression} selected={expression===profile.expression} disabled={disabled} color={wellColor} render={expression=>render({shape:profile.shape,expression,color:profile.color,name:expression,animated:false})} onSelect={()=>{if(!gesture.current?.moved)onChange({expression})}}/>)}</motion.div></div>;\n}\nfunction ShapeCarousel({profile,disabled,render,onChange,direction}:{profile:AgentProfile;disabled:boolean;render:(shape:AgentProfile['shape'],color:string)=>ReactNode;onChange:(patch:Partial<AgentProfile>)=>void;direction:'ltr'|'rtl'}){\n const reduced=useMotionPreference(),sign=direction==='rtl'?-1:1,initial=Math.max(0,shapes.indexOf(profile.shape)),target=useMotionValue(initial),position=useSpring(target,spring),[offset,setOffset]=useState(initial),id=useId(),ref=useRef<HTMLDivElement>(null),drag=useRef<{x:number;start:number;moved:boolean}|null>(null),suppressed=useRef(false);\n useEffect(()=>position.on('change',setOffset),[position]);\n const move=(next:number)=>{target.set(next);if(reduced!==false)position.jump(next)};\n useEffect(()=>{const previous=Math.round(target.get()),current=wrap(previous),next=shapes.indexOf(profile.shape);if(next>=0&&next!==current){let delta=next-current;if(delta>4)delta-=9;if(delta< -4)delta+=9;move(previous+delta)}},[profile.shape]);\n useEffect(()=>{const node=ref.current;if(!node)return;const wheel=(event:WheelEvent)=>{if(event.ctrlKey||disabled)return;event.preventDefault();event.stopPropagation();const delta=Math.abs(event.deltaX)>Math.abs(event.deltaY)?event.deltaX*sign:event.deltaY;move(target.get()+delta*(event.deltaMode===1?16:event.deltaMode===2?120:1)/110)};node.addEventListener('wheel',wheel,{passive:false});return()=>node.removeEventListener('wheel',wheel)},[disabled,sign,reduced,target,position]);\n const indices=Array.from({length:9},(_,i)=>Math.round(offset)+i-4),selected=indices.find(i=>shapes[wrap(i)]===profile.shape);\n return <div ref={ref} className=\"hp-creator-shapes\" role=\"listbox\" aria-label=\"Avatar shape\" aria-disabled={disabled||undefined} aria-activedescendant={selected===undefined?undefined:`${id}-${selected}`} tabIndex={disabled?-1:0} onKeyDown={event=>{if(disabled)return;const delta=event.key==='ArrowRight'?sign:event.key==='ArrowLeft'?-sign:event.key==='ArrowDown'?1:event.key==='ArrowUp'?-1:0;if(!delta&&event.key!=='Home'&&event.key!=='End')return;event.preventDefault();const next=delta?Math.round(target.get())+delta:event.key==='Home'?0:8;move(next);onChange({shape:shapes[wrap(next)]})}} onClickCapture={event=>{if(event.detail>0&&suppressed.current){event.preventDefault();event.stopPropagation()}}} onPointerDown={event=>{if(disabled||event.button!==0)return;suppressed.current=false;drag.current={x:event.clientX,start:target.get(),moved:false}}} onPointerMove={event=>{const gesture=drag.current;if(gesture&&Math.abs(event.clientX-gesture.x)>5){gesture.moved=true;suppressed.current=true;event.currentTarget.setPointerCapture(event.pointerId);move(gesture.start-(event.clientX-gesture.x)*sign/70)}}} onPointerUp={event=>{if(event.currentTarget.hasPointerCapture(event.pointerId))event.currentTarget.releasePointerCapture(event.pointerId);drag.current=null}} onPointerCancel={()=>{drag.current=null}}>{indices.map(index=>{const shape=shapes[wrap(index)],angle=.34*(index-offset);return <div key={index} className=\"hp-creator-shape-position\" style={{transform:`translate(${210*Math.sin(angle)*sign}px,${210*Math.cos(angle)-176}px)`}}><button id={`${id}-${index}`} type=\"button\" role=\"option\" aria-selected={shape===profile.shape} aria-label={`${title(shape)} shape`} tabIndex={-1} disabled={disabled} onClick={()=>{if(!drag.current?.moved){move(index);onChange({shape})}}}>{render(shape,profile.color)}</button></div>})}</div>;\n}\nexport function CreatorAppearance({profile,disabled=false,renderAvatar,renderShape,onChange,direction='ltr'}:{profile:AgentProfile;disabled?:boolean;direction?:'ltr'|'rtl';renderAvatar:(profile:Pick<AgentProfile,'shape'|'expression'|'color'|'name'>&{animated?:boolean})=>ReactNode;renderShape:(shape:AgentProfile['shape'],color:string)=>ReactNode;onChange:(patch:Partial<AgentProfile>)=>void}){\n return <div className=\"hp-creator-appearance\"><EmotionOrbit profile={profile} disabled={disabled} render={renderAvatar} onChange={onChange}/><div className=\"hp-creator-main-avatar\">{renderAvatar(profile)}</div><ShapeCarousel profile={profile} disabled={disabled} render={renderShape} onChange={onChange} direction={direction}/></div>;\n}\n",
  "src/CreatorAvatar.tsx": "'use client';\nimport {useEffect,useRef} from 'react';\nimport {avatarGaze,clamp,expressionPose,renderAvatarFrame,type FacePose,type AvatarMorphState} from './creator-avatar-renderer.js';\nexport type CreatorAvatarProps={shape?:string;expression?:string;color?:string;name?:string;animated?:boolean;thumbnail?:boolean;expressionOnly?:boolean;size?:number;onReady?:()=>void;className?:string};\nconst TAU=Math.PI*2;\nfunction randomSeed(){try{return crypto.getRandomValues(new Uint32Array(1))[0]}catch{return Math.floor(Math.random()*4294967296)}}\nfunction generator(seed:number){const random=()=>{seed=(Math.imul(seed,1664525)+1013904223)>>>0;return seed/4294967296};random.seed=()=>seed;return random}\ntype MotionState={morph:AvatarMorphState;phase:number;pose:FacePose;renderedPose?:FacePose;velocity:Partial<FacePose>;shape:string;oldShape?:string;shapeStart:number;blinkWait:number;blinkElapsed:number;blinkDuration:number;blinking:boolean;doubleBlink:boolean;gazeFrom:[number,number];gazeTarget:[number,number];gaze:[number,number];angles?:[number,number];gazeElapsed:number;gazeTravel:number;gazeHold:number;microTime:number;microElapsed:number;microDuration:number;microFrom:number[];microTo:number[];microOffset:number};\n/** Animated procedural paper avatar; props update the existing canvas and motion state. */\nexport function CreatorAvatar({shape='cloud',expression='thinking',color='#f8b193',name='Agent',animated=true,thumbnail=false,expressionOnly=false,size:requestedSize,onReady,className}:CreatorAvatarProps){\n const canvas=useRef<HTMLCanvasElement>(null),refreshDrawing=useRef<()=>void>(()=>{}),latest=useRef({shape,expression,color,animated,thumbnail,expressionOnly,onReady}),state=useRef<MotionState|null>(null),dimensions=useRef(requestedSize??(expressionOnly?34:thumbnail?56:162)),rng=useRef<{blink:ReturnType<typeof generator>;gaze:ReturnType<typeof generator>;micro:ReturnType<typeof generator>;phase:number;offset:number}|null>(null);\n latest.current={shape,expression,color,animated,thumbnail,expressionOnly,onReady};\n useEffect(()=>{\n  const node=canvas.current;if(!node)return;const context=node.getContext('2d');if(!context)return;\n  const media=window.matchMedia('(prefers-reduced-motion: reduce)');\n  if(!rng.current){const gazeSeed=randomSeed()^82,blinkSeed=randomSeed(),microSeed=randomSeed()^82;rng.current={blink:generator(blinkSeed),gaze:generator(gazeSeed),micro:generator(microSeed),phase:blinkSeed/4294967296*TAU,offset:(microSeed>>>0)/4294967296*TAU}}\n  const random=rng.current.blink,gazeRandom=rng.current.gaze,microRandom=rng.current.micro,micro=()=>[(microRandom()-.5)*.18,(microRandom()-.5)*.22,(microRandom()-.5)*.07,.14*microRandom()];\n  const firstMicro=state.current?null:micro();\n  state.current??={morph:{},phase:rng.current.phase,pose:expressionPose(expression),velocity:{},shape,shapeStart:0,blinkWait:.4+4.4*random(),blinkElapsed:0,blinkDuration:.18,blinking:false,doubleBlink:false,gazeFrom:[0,0],gazeTarget:[0,0],gaze:[0,0],gazeElapsed:0,gazeTravel:.2,gazeHold:.35+.55*gazeRandom(),microTime:0,microElapsed:0,microDuration:1.8+1.8*microRandom(),microFrom:[0,0,0,0],microTo:firstMicro!,microOffset:rng.current.offset};\n  let frame=0,previous=0,visible=true,ready=false,fast=true,size=dimensions.current;\n  const resize=()=>{const measured=node.getBoundingClientRect().width;size=requestedSize??(measured>0?measured:(expressionOnly?34:thumbnail?56:162));dimensions.current=size;const dpr=Math.min(window.devicePixelRatio||1,2),pixels=Math.round(size*dpr);if(node.width!==pixels||node.height!==pixels)node.width=node.height=pixels};resize();\n  const draw=(now:number,advance:boolean)=>{\n   const current=latest.current,s=state.current!,target=expressionPose(current.expression),dt=advance?Math.min(Math.max(now-previous,0),64)/1000:0;\n   if(current.shape!==s.shape){s.oldShape=s.shape;s.shape=current.shape;s.shapeStart=now}\n   const playing=current.animated&&!current.thumbnail&&!current.expressionOnly&&!media.matches;\n   if(!playing){s.pose=target;s.velocity={};s.oldShape=undefined;s.morph={shape:current.shape}}\n   if(playing&&advance){\n    const decay=Math.exp(-16*dt);for(const key of Object.keys(target)as(keyof FacePose)[]){const displacement=s.pose[key]-target[key],velocity=s.velocity[key]??0,momentum=velocity+16*displacement;let value=target[key]+(displacement+momentum*dt)*decay,nextVelocity=(velocity-16*momentum*dt)*decay;if(['leftOpen','rightOpen','width','bounce','tremble','smile','brow'].includes(key)&&value<0){value=0;nextVelocity=0}if((key==='smile'||key==='brow')&&value>1){value=1;nextVelocity=0}if(Math.abs(value-target[key])<.0005&&Math.abs(nextVelocity)<.005){value=target[key];nextVelocity=0}s.pose[key]=value;s.velocity[key]=nextVelocity}\n    s.phase=(s.phase+dt*TAU/8)%TAU;\n    if(!s.blinking){s.blinkWait-=dt;if(s.blinkWait<=0){s.blinking=true;s.blinkElapsed=0;s.blinkDuration=.14+.09*random()}}\n    if(s.blinking){s.blinkElapsed+=dt;if(s.blinkElapsed>=s.blinkDuration){s.blinking=false;s.doubleBlink=!s.doubleBlink&&random()<.12;s.blinkWait=s.doubleBlink?.14+.12*random():2.1+5.2*random()}}\n    s.gazeElapsed+=dt;\n    while(s.gazeElapsed>=s.gazeTravel+s.gazeHold){s.gazeElapsed-=s.gazeTravel+s.gazeHold;s.gazeFrom=s.gazeTarget;if(gazeRandom()<.68)s.gazeTarget=[clamp(.72*s.gazeFrom[0]+(gazeRandom()-.5)*.85,-.9,.9),clamp(.72*s.gazeFrom[1]+(gazeRandom()-.5)*.7,-.9,.9)];else s.gazeTarget=[(2*gazeRandom()-1)*.9,(2*gazeRandom()-1)*.8];s.gazeTravel=.38+.24*gazeRandom()+.22*Math.hypot(s.gazeTarget[0]-s.gazeFrom[0],s.gazeTarget[1]-s.gazeFrom[1]);s.gazeHold=.45+1.05*gazeRandom()}\n    const travel=clamp(s.gazeElapsed/s.gazeTravel),ease=travel*travel*(3-2*travel);s.gaze=s.gazeFrom.map((v,i)=>v+(s.gazeTarget[i]-v)*ease)as[number,number];\n    if(s.gazeElapsed>s.gazeTravel){const holdProgress=(s.gazeElapsed-s.gazeTravel)/s.gazeHold,envelope=Math.sin(holdProgress*Math.PI)**2*.035,offset=gazeRandom.seed()%97;s.gaze=[s.gaze[0]+Math.sin(3*holdProgress+offset)*envelope,s.gaze[1]+Math.cos(2*holdProgress+offset)*envelope]}\n    if(current.expression!=='sleepy'){s.microTime+=dt;s.microElapsed+=dt;while(s.microElapsed>=s.microDuration){s.microElapsed-=s.microDuration;s.microFrom=s.microTo;s.microTo=micro();s.microDuration=1.8+1.8*microRandom()}}\n   }\n   let pose={...s.pose};\n   if(playing&&current.expression!=='sleepy'){\n    const t=s.microElapsed/s.microDuration,ease=t*t*(3-2*t),strength=.7,values=s.microFrom.map((v,i)=>(v+(s.microTo[i]-v)*ease)*strength),smile=Math.max(0,(pose.smile-.2)/.8)*strength*Math.min(1,s.microTime/.8),p=s.microTime,f=s.microOffset,leftWave=.7*Math.sin(1.65*p+f)+.3*Math.sin(1.13*p+.7*f),rightWave=.7*Math.sin(1.48*p+f+.9)+.3*Math.sin(2.05*p+.4*f),soften=(1+Math.sin(1.31*p+f+.4))*.5;\n    pose={...pose,leftOpen:pose.leftOpen*(1+values[0]+values[1]+leftWave*smile*.13),rightOpen:pose.rightOpen*(1+values[0]-values[1]+rightWave*smile*.13),width:pose.width*(1+(leftWave+rightWave)*smile*.035),leftAngle:pose.leftAngle+.6*values[2]+leftWave*smile*.045,rightAngle:pose.rightAngle+.6*values[2]-rightWave*smile*.045,headTilt:pose.headTilt+values[2],smile:clamp(pose.smile-soften*smile*.09+(['neutral','curious'].includes(current.expression)?values[3]:0))};\n   }\n   if(playing&&!advance&&s.renderedPose)pose={...s.renderedPose};else{pose.blink=playing&&s.blinking?Math.max(.07,1-Math.sin(Math.PI*s.blinkElapsed/s.blinkDuration)**2):1;s.renderedPose={...pose}}\n   const gazeGoal=avatarGaze(pose,size,s.gaze),smoothing=1-Math.exp(-dt*1000/85);s.angles=!playing||!s.angles?gazeGoal:s.angles.map((v,i)=>v+(gazeGoal[i]-v)*smoothing)as[number,number];\n   renderAvatarFrame(context,{gazeAngles:s.angles,timestamp:now,morphState:s.morph,shape:current.shape,expression:current.expression,color:current.color,size,phase:s.phase,motion:current.thumbnail||current.expressionOnly?0:28,blink:pose.blink,lookX:s.gaze[0],lookY:s.gaze[1],previousShape:s.oldShape,shapeProgress:(now-s.shapeStart)/480,expressionPose:pose,thumbnail:current.thumbnail,expressionOnly:current.expressionOnly});\n   if(!ready){ready=true;current.onReady?.()}\n  };\n  const tick=(now:number)=>{if(!previous)previous=now;if(now-previous>=(fast?16:32)){if(!document.hidden&&visible){const morphWasActive=!!state.current!.morph.from;draw(now,true);const s=state.current!,target=expressionPose(latest.current.expression);fast=s.blinking||morphWasActive||(Object.keys(target)as(keyof FacePose)[]).some(key=>s.pose[key]!==target[key])}previous=now}frame=requestAnimationFrame(tick)};\n  const refresh=()=>{cancelAnimationFrame(frame);previous=0;fast=true;draw(performance.now(),false);if(latest.current.animated&&!latest.current.thumbnail&&!latest.current.expressionOnly&&!media.matches)frame=requestAnimationFrame(tick)};\n  refreshDrawing.current=refresh;\n  const resizeObserver=new ResizeObserver(()=>{resize();draw(performance.now(),false)});resizeObserver.observe(node);\n  const observer=new IntersectionObserver(([entry])=>{visible=entry.isIntersecting;previous=0});observer.observe(node);media.addEventListener('change',refresh);window.addEventListener('resize',resize);document.addEventListener('visibilitychange',refresh);refresh();\n  return()=>{refreshDrawing.current=()=>{};cancelAnimationFrame(frame);observer.disconnect();resizeObserver.disconnect();media.removeEventListener('change',refresh);window.removeEventListener('resize',resize);document.removeEventListener('visibilitychange',refresh)};\n },[animated,thumbnail,expressionOnly,requestedSize]);\n useEffect(()=>{refreshDrawing.current()},[shape,expression,color]);\n const size=requestedSize??(expressionOnly?34:thumbnail?56:162);\n return <span className={className} style={{display:'block',width:size,height:size,maxWidth:'100%'}}><canvas ref={canvas} role=\"img\" aria-label={`${name}, ${expression} ${shape} avatar`} style={{display:'block',width:'100%',height:'100%',objectFit:'contain'}}/></span>;\n}\n",
  "src/DataTable.tsx": "import { UIIcon } from './icons.js';\nimport { useEffect, useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport {\n  useReactTable,\n  getCoreRowModel,\n  getFilteredRowModel,\n  getSortedRowModel,\n  getPaginationRowModel,\n  flexRender,\n} from '@tanstack/react-table';\nimport type { ColumnDef, SortingState, RowSelectionState } from '@tanstack/react-table';\nimport { Button, Checkbox, DataState, Input, Select } from './components.js';\nexport type Column<T> = {\n  key: string;\n  header: string;\n  value: (row: T) => string | number;\n  render?: (row: T) => ReactNode;\n  sortable?: boolean;\n};\nexport type DataTableProps<T> = {\n  rows: T[];\n  columns: Column<T>[];\n  rowKey: (row: T) => string;\n  rowLabel: (row: T) => string;\n  caption: string;\n  pageSize?: number;\n  presentation?: 'advanced' | 'board';\n  hideToolbar?: boolean;\n  searchValue?: string;\n  onSearchValueChange?: (value:string)=>void;\n  state?: 'ready' | 'loading' | 'empty' | 'error';\n  onRetry?: () => void;\n  onRowAction?: (row: T) => void;\n  filters?: Record<string, string>;\n  disabled?: boolean;\n};\n/** TanStack Table owns filtering, numeric sorting, stable selection and pagination. */\nexport function DataTable<T>({\n  rows,\n  columns,\n  rowKey,\n  rowLabel,\n  caption,\n  pageSize = 5,\n  presentation='advanced',\n  hideToolbar=false,\n  searchValue,\n  onSearchValueChange,\n  state = 'ready',\n  onRetry,\n  onRowAction,\n  filters = {},\n  disabled = false,\n}: DataTableProps<T>) {\n  const [localQuery, setLocalQuery] = useState(''),\n    [sorting, setSorting] = useState<SortingState>([]),\n    [selection, setSelection] = useState<RowSelectionState>({}),\n    [pagination, setPagination] = useState({ pageIndex: 0, pageSize });\n  const query=searchValue??localQuery;\n  const setQuery=(next:string|((previous:string)=>string))=>{const value=typeof next==='function'?next(query):next;setLocalQuery(value);onSearchValueChange?.(value);};\n  useEffect(()=>{setPagination(previous=>previous.pageSize===pageSize?previous:{pageIndex:0,pageSize})},[pageSize]);\n  const filterSignature = JSON.stringify(filters),\n    sortingSignature = JSON.stringify(sorting),\n    columnSignature = columns.map((column) => column.key).join('|');\n  // Unrelated parent updates and local cell edits preserve the current page.\n  // Only explicit search/filter/sort changes reset pagination.\n  useEffect(()=>{setPagination(previous=>previous.pageIndex===0?previous:{...previous,pageIndex:0})},[query,filterSignature,sortingSignature]);\n  const columnFilters = useMemo(\n    () =>\n      Object.entries(filters)\n        .filter(([key, value]) => value && columns.some((column) => column.key === key))\n        .map(([id, value]) => ({ id, value })),\n    [filterSignature, columnSignature],\n  );\n  const definitions = useMemo<ColumnDef<T>[]>(\n    () =>\n      columns.map((column) => ({\n        id: column.key,\n        accessorFn: column.value,\n        header: column.header,\n        enableSorting: Boolean(column.sortable),\n        filterFn: 'equalsString',\n        sortDescFirst: false,\n        cell: (context) =>\n          column.render ? column.render(context.row.original) : String(context.getValue() ?? ''),\n      })),\n    [columns],\n  );\n  const table = useReactTable({\n    data: rows,\n    columns: definitions,\n    getRowId: rowKey,\n    state: { globalFilter: query, columnFilters, sorting, rowSelection: selection, pagination },\n    onGlobalFilterChange: setQuery,\n    onSortingChange: setSorting,\n    onRowSelectionChange: setSelection,\n    onPaginationChange: setPagination,\n    getCoreRowModel: getCoreRowModel(),\n    getFilteredRowModel: getFilteredRowModel(),\n    getSortedRowModel: getSortedRowModel(),\n    getPaginationRowModel: getPaginationRowModel(),\n    autoResetPageIndex: false,\n    enableRowSelection: !disabled,\n    sortDescFirst: false,\n    globalFilterFn: 'includesString',\n  });\n  const visible = table.getRowModel().rows,\n    filtered = table.getFilteredRowModel().rows,\n    selected = table.getSelectedRowModel().rows,\n    selectedCount = selected.length,\n    pages = Math.max(1, table.getPageCount());\n  useEffect(()=>{setPagination(previous=>previous.pageIndex<pages?previous:{...previous,pageIndex:pages-1})},[pages]);\n  const exportRows = () => {\n    const selectedRows = selectedCount ? selected : table.getPrePaginationRowModel().rows;\n    const cell = (value: string | number) =>\n      '\"' +\n      String(value)\n        .replace(/^[=+@\\-\\t\\r]/, \"'$&\")\n        .replaceAll('\"', '\"\"') +\n      '\"';\n    const csv = [\n      columns.map((c) => cell(c.header)).join(','),\n      ...selectedRows.map((row) => columns.map((c) => cell(c.value(row.original))).join(',')),\n    ].join('\\r\\n');\n    const url = URL.createObjectURL(new Blob([csv], { type: 'text/csv;charset=utf-8' }));\n    const a = document.createElement('a');\n    a.href = url;\n    a.download = 'helios-example.csv';\n    a.click();\n    setTimeout(() => URL.revokeObjectURL(url), 1000);\n  };\n  return (\n    <section className=\"hu-table-card\" data-presentation={presentation} aria-label={caption}>\n      {!hideToolbar&&<div className=\"hu-table-toolbar\">\n        <Input\n          label=\"Search records\"\n          type=\"search\"\n          value={query}\n          disabled={disabled}\n          placeholder=\"Search any column…\"\n          onChange={(e) => {\n            table.setGlobalFilter(e.target.value);\n            table.setPageIndex(0);\n          }}\n        />\n        <Button\n          variant=\"secondary\"\n          onClick={exportRows}\n          disabled={disabled || state !== 'ready' || (!selectedCount && !filtered.length)}\n        >\n          Export {selectedCount ? 'selected' : 'CSV'}\n        </Button>\n      </div>}\n      {state !== 'ready' ? (\n        <DataState state={state} onRetry={onRetry} />\n      ) : !filtered.length ? (\n        <DataState\n          state=\"empty\"\n          onRetry={() => {\n            table.setGlobalFilter('');\n            onRetry?.();\n          }}\n        />\n      ) : (\n        <div\n          className=\"hu-table-scroll\"\n          role=\"region\"\n          tabIndex={0}\n          aria-label={`${caption}; scroll horizontally on smaller screens`}\n        >\n          <table>\n            <caption className=\"hu-sr-only\">{caption}</caption>\n            <thead>\n              {table.getHeaderGroups().map((group) => (\n                <tr key={group.id}>\n                  <th scope=\"col\">\n                    <Checkbox\n                      label=\"Select visible rows\"\n                      className=\"hu-check-only\"\n                      checked={table.getIsAllPageRowsSelected()}\n                      indeterminate={table.getIsSomePageRowsSelected()}\n                      disabled={disabled}\n                      onChange={table.getToggleAllPageRowsSelectedHandler()}\n                    />\n                  </th>\n                  {group.headers.map((header) => (\n                    <th\n                      key={header.id}\n                      scope=\"col\"\n                      aria-sort={\n                        header.column.getCanSort()\n                          ? header.column.getIsSorted() === 'asc'\n                            ? 'ascending'\n                            : header.column.getIsSorted() === 'desc'\n                              ? 'descending'\n                              : 'none'\n                          : undefined\n                      }\n                    >\n                      {header.column.getCanSort() ? (\n                        <button\n                          type=\"button\"\n                          disabled={disabled}\n                          onClick={header.column.getToggleSortingHandler()}\n                        >\n                          {flexRender(header.column.columnDef.header, header.getContext())}{' '}\n                          <span aria-hidden=\"true\">\n                            <UIIcon name={header.column.getIsSorted() === 'asc' ? 'arrow-up' : header.column.getIsSorted() === 'desc' ? 'arrow-down' : 'sort'} />\n                          </span>\n                        </button>\n                      ) : (\n                        flexRender(header.column.columnDef.header, header.getContext())\n                      )}\n                    </th>\n                  ))}\n                  {onRowAction && <th scope=\"col\">Action</th>}\n                </tr>\n              ))}\n            </thead>\n            <tbody>\n              {visible.map((row) => (\n                <tr key={row.id} data-selected={row.getIsSelected()}>\n                  <td>\n                    <Checkbox\n                      label={`Select ${rowLabel(row.original)}`}\n                      className=\"hu-check-only\"\n                      checked={row.getIsSelected()}\n                      disabled={disabled}\n                      onChange={row.getToggleSelectedHandler()}\n                    />\n                  </td>\n                  {row.getVisibleCells().map((cell) => {\n                    const column=columns.find(column=>column.key===cell.column.id);\n                    return <td key={cell.id}>\n                      {/* Invoke our owned cell callback as a render function. Treating its new closure as a component type remounts focused controls on parent updates. */}\n                      {column?.render ? column.render(row.original) : String(cell.getValue() ?? '')}\n                    </td>;\n                  })}\n                  {onRowAction && (\n                    <td>\n                      <Button\n                        variant=\"link-color\"\n                        size=\"sm\"\n                        disabled={disabled}\n                        onClick={() => onRowAction(row.original)}\n                        aria-label={`View ${rowLabel(row.original)}`}\n                      >\n                        View\n                      </Button>\n                    </td>\n                  )}\n                </tr>\n              ))}\n            </tbody>\n          </table>\n        </div>\n      )}\n      {presentation==='board'?<nav className=\"hu-board-pagination\" aria-label={caption+' pagination'}>\n        <button type=\"button\" disabled={disabled||state!=='ready'||!table.getCanPreviousPage()} onClick={()=>table.previousPage()}><UIIcon name=\"arrow-left\"/>Previous</button>\n        <div>{Array.from({length:pages},(_,i)=>i+1).filter(n=>pages<=7||n===1||n===pages||Math.abs(n-(pagination.pageIndex+1))<=1).map((n,i,shown)=><span key={n}>{i>0&&n>shown[i-1]+1&&<span className=\"hu-board-page-ellipsis\" aria-hidden=\"true\">…</span>}<button type=\"button\" aria-label={'Page '+n} aria-current={n===pagination.pageIndex+1?'page':undefined} disabled={disabled||state!=='ready'} onClick={()=>table.setPageIndex(n-1)}>{n}</button></span>)}</div>\n        <button type=\"button\" disabled={disabled||state!=='ready'||!table.getCanNextPage()} onClick={()=>table.nextPage()}>Next<UIIcon name=\"arrow-right\"/></button>\n        <span className=\"hu-sr-only\" role=\"status\">Page {Math.min(pagination.pageIndex+1,pages)} of {pages}; {selectedCount} selected</span>\n      </nav>:<footer className=\"hu-table-footer\">\n        <span role=\"status\">\n          {selectedCount} selected · {state === 'ready' ? filtered.length : 0} results\n        </span>\n        {selectedCount > 0 && (\n          <Button\n            variant=\"tertiary\"\n            size=\"sm\"\n            disabled={disabled}\n            onClick={() => table.resetRowSelection()}\n          >\n            Clear selection\n          </Button>\n        )}\n        <Select\n          label=\"Rows per page\"\n          disabled={disabled}\n          value={String(pagination.pageSize)}\n          options={[5, 10, 20].map((value) => ({ value: String(value), label: String(value) }))}\n          onChange={(e) => table.setPageSize(Number(e.target.value))}\n        />\n        <div>\n          <Button\n            variant=\"secondary\"\n            size=\"sm\"\n            disabled={disabled || !table.getCanPreviousPage() || state !== 'ready'}\n            onClick={() => table.previousPage()}\n          >\n            Previous\n          </Button>\n          <span>\n            Page {Math.min(pagination.pageIndex + 1, pages)} of {pages}\n          </span>\n          <Button\n            variant=\"secondary\"\n            size=\"sm\"\n            disabled={disabled || !table.getCanNextPage() || state !== 'ready'}\n            onClick={() => table.nextPage()}\n          >\n            Next\n          </Button>\n        </div>\n      </footer>}\n    </section>\n  );\n}\n",
  "src/DateRangeExamples.tsx": "'use client';\nimport { UIIcon } from './icons.js';\nimport { useDirection } from './Direction.js';\n\nimport { useEffect, useId, useState } from 'react';\nimport {\n  Calendar,\n  RangeCalendar,\n  CalendarCell,\n  CalendarGrid,\n  CalendarGridHeader,\n  CalendarHeaderCell,\n  CalendarGridBody,\n  Heading,\n  Button as AriaButton,\n  I18nProvider,\n  DialogTrigger,\n  Popover,\n  Dialog,\n} from 'react-aria-components';\nimport {\n  parseDate,\n  today,\n  getLocalTimeZone,\n  startOfMonth,\n  endOfMonth,\n  startOfYear,\n  endOfYear,\n} from '@internationalized/date';\nimport { Button, Input, Select } from './components.js';\nexport type DateRangeValue = { start: string; end: string };\nexport type DateRangePickerProps = {\n  label?: string;\n  value?: DateRangeValue;\n  defaultValue?: DateRangeValue;\n  onChange?: (value: DateRangeValue) => void;\n  disabled?: boolean;\n  inline?: boolean;\n  minValue?: string;\n  maxValue?: string;\n  referenceDate?: string;\n};\nconst initialRange = { start: '2026-10-12', end: '2026-10-26' };\nconst validDate = (value?: string) => {\n  try {\n    return value ? parseDate(value) : null;\n  } catch {\n    return null;\n  }\n};\nexport function DateRangePicker({\n  label = 'Booking dates',\n  value,\n  defaultValue = initialRange,\n  onChange,\n  disabled = false,\n  inline = false,\n  minValue,\n  maxValue,\n  referenceDate,\n}: DateRangePickerProps) {\n  const {locale,direction}=useDirection();\n  const [local, setLocal] = useState(defaultValue),\n    committed = value ?? local,\n    [draft, setDraft] = useState(committed),\n    [open, setOpen] = useState(false),\n    [error, setError] = useState(''),\n    [status, setStatus] = useState(''),\n    [months, setMonths] = useState(2),\n    [calendarReady, setCalendarReady] = useState(false),\n    [now, setNow] = useState(referenceDate || initialRange.end);\n  const start = validDate(draft.start),\n    end = validDate(draft.end),\n    minimum = validDate(minValue),\n    maximum = validDate(maxValue),\n    uid = useId();\n  useEffect(() => {\n    const media = matchMedia('(max-width:600px)'),\n      update = () => setMonths(media.matches ? 1 : 2);\n    update();\n    setCalendarReady(true);\n    setNow(referenceDate || today(getLocalTimeZone()).toString());\n    media.addEventListener('change', update);\n    return () => media.removeEventListener('change', update);\n  }, [referenceDate]);\n  useEffect(() => {\n    setDraft(committed);\n  }, [committed.start, committed.end]);\n  const choose = (next: DateRangeValue) => {\n    setDraft(next);\n    setError('');\n    setStatus('Unapplied date range. Choose Apply to confirm.');\n  };\n  const apply = () => {\n    if (disabled) return;\n    if (!start || !end || start.compare(end) > 0) {\n      setError('Choose a valid start date on or before the end date.');\n      return;\n    }\n    if ((minimum && start.compare(minimum) < 0) || (maximum && end.compare(maximum) > 0)) {\n      setError('Choose dates within the allowed range.');\n      return;\n    }\n    setLocal(draft);\n    onChange?.(draft);\n    setStatus(`Applied ${draft.start} to ${draft.end}.`);\n    setOpen(false);\n  };\n  const cancel = () => {\n    setDraft(committed);\n    setError('');\n    setStatus('Draft discarded. The applied range is unchanged.');\n    setOpen(false);\n  };\n  const date = validDate(now) || parseDate(initialRange.end),\n    lastMonth = date.subtract({ months: 1 }),\n    lastYear = date.subtract({ years: 1 });\n  const presets = [\n    { label: 'Today', start: date, end: date },\n    { label: 'Yesterday', start: date.subtract({ days: 1 }), end: date.subtract({ days: 1 }) },\n    { label: 'Last week', start: date.subtract({ days: 7 }), end: date.subtract({ days: 1 }) },\n    { label: 'This month', start: startOfMonth(date), end: endOfMonth(date) },\n    { label: 'Last month', start: startOfMonth(lastMonth), end: endOfMonth(lastMonth) },\n    { label: 'This year', start: startOfYear(date), end: endOfYear(date) },\n    { label: 'Last year', start: startOfYear(lastYear), end: endOfYear(lastYear) },\n    { label: 'All time', start: date.subtract({ years: 10 }), end: date },\n  ];\n  const surface = (\n    <div className=\"hd-range-surface\">\n      <aside aria-label=\"Quick date ranges\">\n        {presets.map((p) => (\n          <Button\n            key={p.label}\n            size=\"sm\"\n            variant=\"tertiary\"\n            disabled={\n              disabled ||\n              !!(minimum && p.start.compare(minimum) < 0) ||\n              !!(maximum && p.end.compare(maximum) > 0)\n            }\n            aria-pressed={draft.start === p.start.toString() && draft.end === p.end.toString()}\n            onClick={() => choose({ start: p.start.toString(), end: p.end.toString() })}\n          >\n            {p.label}\n          </Button>\n        ))}\n      </aside>\n      <div className=\"hd-range-body\">\n        {calendarReady ? (\n          <I18nProvider locale={locale}>\n            <RangeCalendar\n              aria-label={label}\n              className=\"hd-range-calendar\"\n              visibleDuration={{ months }}\n              value={start && end && start.compare(end) <= 0 ? { start, end } : null}\n              defaultFocusedValue={validDate(defaultValue.start) || date}\n              minValue={minimum || undefined}\n              maxValue={maximum || undefined}\n              isDisabled={disabled}\n              onChange={(range) =>\n                choose({ start: range.start.toString(), end: range.end.toString() })\n              }\n            >\n              <header>\n                <AriaButton slot=\"previous\" aria-label=\"Previous months\"><UIIcon name={direction==='rtl'?'chevron-right':'chevron-left'} /></AriaButton>\n                <Heading />\n                <AriaButton slot=\"next\" aria-label=\"Next months\"><UIIcon name={direction==='rtl'?'chevron-left':'chevron-right'} /></AriaButton>\n              </header>\n              <div className=\"hd-range-months\">\n                {Array.from({ length: months }, (_, i) => (\n                  <CalendarGrid key={i} offset={{ months: i }}>\n                    <CalendarGridHeader>\n                      {(day) => <CalendarHeaderCell>{day}</CalendarHeaderCell>}\n                    </CalendarGridHeader>\n                    <CalendarGridBody>{(day) => <CalendarCell date={day} />}</CalendarGridBody>\n                  </CalendarGrid>\n                ))}\n              </div>\n            </RangeCalendar>\n          </I18nProvider>\n        ) : (\n          <div className=\"hd-calendar-pending\" role=\"status\" aria-busy=\"true\">\n            Loading calendar…\n          </div>\n        )}\n        <div className=\"hd-range-footer\">\n          <Input\n            label=\"Range start\"\n            type=\"date\"\n            size=\"sm\"\n            value={draft.start}\n            disabled={disabled}\n            onChange={(event) => choose({ ...draft, start: event.target.value })}\n          />\n          <Input\n            label=\"Range end\"\n            type=\"date\"\n            size=\"sm\"\n            value={draft.end}\n            disabled={disabled}\n            onChange={(event) => choose({ ...draft, end: event.target.value })}\n          />\n          <span className=\"hd-day-count\">\n            {start && end && start.compare(end) <= 0\n              ? end.calendar.toJulianDay(end) - start.calendar.toJulianDay(start) + 1\n              : 0}{' '}\n            days selected\n          </span>\n          <Button size=\"sm\" variant=\"secondary\" disabled={disabled} onClick={cancel}>\n            Cancel\n          </Button>\n          <Button size=\"sm\" disabled={disabled} onClick={apply}>\n            Apply range\n          </Button>\n        </div>\n        {error && (\n          <p role=\"alert\" className=\"hd-range-error\">\n            {error}\n          </p>\n        )}\n      </div>\n    </div>\n  );\n  return (\n    <section className=\"hd-date-range\" aria-labelledby={uid}>\n      <div className=\"hu-example-heading\">\n        <h3 id={uid}>{label}</h3>\n        {!inline && (\n          <DialogTrigger\n            isOpen={open}\n            onOpenChange={(next) => {\n              if (next) {\n                setDraft(committed);\n                setError('');\n                setNow(referenceDate || today(getLocalTimeZone()).toString());\n                setOpen(true);\n              } else cancel();\n            }}\n          >\n            <AriaButton isDisabled={disabled} className=\"hu-button hu-secondary hd-range-trigger\">\n              <bdi dir=\"ltr\">{committed.start} — {committed.end}</bdi>\n              <span aria-hidden=\"true\"><UIIcon name=\"chevron-down\" /></span>\n            </AriaButton>\n            <Popover dir={direction} lang={locale} className=\"hd-range-popover\" placement=\"bottom end\" offset={8}>\n              <Dialog aria-label={label} className=\"hd-range-dialog\">\n                {surface}\n              </Dialog>\n            </Popover>\n          </DialogTrigger>\n        )}\n      </div>\n      {inline && surface}\n      <p className=\"ha-status\" role=\"status\">\n        {status || `Applied range: ${committed.start} to ${committed.end}.`}\n      </p>\n    </section>\n  );\n}\nexport type MeetingSchedulerProps = {\n  date?: string;\n  onConfirm?: (meeting: { date: string; time: string; timeZone: string }) => void;\n  disabled?: boolean;\n  hostName?: string;\n  title?: string;\n  duration?: number;\n  defaultOpen?: boolean;\n};\nexport function MeetingScheduler({\n  date = '2026-10-26',\n  onConfirm,\n  disabled = false,\n  hostName = 'Kavya Nair',\n  title = 'Design system review',\n  duration = 30,\n  defaultOpen = false,\n}: MeetingSchedulerProps) {\n  const {locale,direction}=useDirection();\n  const [day, setDay] = useState(date),\n    [zone, setZone] = useState('Asia/Kolkata'),\n    [slot, setSlot] = useState(''),\n    [status, setStatus] = useState(''),\n    [open, setOpen] = useState(defaultOpen),\n    [hourFormat, setHourFormat] = useState('24'),\n    [ready, setReady] = useState(false),\n    uid = useId();\n  useEffect(() => setReady(true), []);\n  const slots = [\n    '09:00',\n    '09:30',\n    '10:00',\n    '10:30',\n    '11:00',\n    '11:30',\n    '13:00',\n    '13:30',\n    '14:00',\n    '14:30',\n    '15:00',\n    '15:30',\n  ];\n  const format = (time: string) => {\n    const [h, m] = time.split(':').map(Number);\n    return hourFormat === '24'\n      ? time\n      : `${h % 12 || 12}:${String(m).padStart(2, '0')} ${h < 12 ? 'AM' : 'PM'}`;\n  };\n  return (\n    <section className=\"hd-meeting-disclosure\" id=\"meeting-scheduler\">\n      <Button\n        variant=\"secondary\"\n        disabled={disabled}\n        aria-expanded={open}\n        aria-controls={uid}\n        onClick={() => setOpen(!open)}\n      >\n        Schedule a meeting <span aria-hidden=\"true\">{open ? <UIIcon name=\"chevron-up\" /> : <UIIcon name=\"chevron-down\" />}</span>\n      </Button>\n      {open && (\n        <div id={uid} className=\"hd-meeting\">\n          <aside className=\"hd-meeting-host\">\n            <span className=\"hd-host-avatar\" aria-hidden=\"true\">\n              {hostName\n                .split(' ')\n                .map((word) => word[0])\n                .join('')}\n            </span>\n            <p>{hostName}</p>\n            <h3>{title}</h3>\n            <p><UIIcon name=\"clock\" />{duration} minutes</p>\n            <p>▣ Video meeting</p>\n            <p>Choose a date and time to prepare a local booking. No invitation is sent.</p>\n          </aside>\n          <div className=\"hd-meeting-calendar\">\n            {ready && (\n              <I18nProvider locale={locale}>\n                <Calendar\n                  aria-label=\"Meeting date\"\n                  className=\"hd-range-calendar\"\n                  value={validDate(day)}\n                  defaultFocusedValue={validDate(date) || parseDate(initialRange.end)}\n                  isDisabled={disabled}\n                  onChange={(value) => {\n                    setDay(value.toString());\n                    setSlot('');\n                    setStatus('');\n                  }}\n                >\n                  <header>\n                    <AriaButton slot=\"previous\" aria-label=\"Previous meeting month\"><UIIcon name={direction==='rtl'?'chevron-right':'chevron-left'} /></AriaButton>\n                    <Heading />\n                    <AriaButton slot=\"next\" aria-label=\"Next meeting month\"><UIIcon name={direction==='rtl'?'chevron-left':'chevron-right'} /></AriaButton>\n                  </header>\n                  <div className=\"hd-range-months\">\n                    <CalendarGrid>\n                      <CalendarGridHeader>\n                        {(weekday) => <CalendarHeaderCell>{weekday}</CalendarHeaderCell>}\n                      </CalendarGridHeader>\n                      <CalendarGridBody>\n                        {(value) => <CalendarCell date={value} />}\n                      </CalendarGridBody>\n                    </CalendarGrid>\n                  </div>\n                </Calendar>\n              </I18nProvider>\n            )}\n            <Input\n              label=\"Meeting date\"\n              type=\"date\"\n              value={day}\n              disabled={disabled}\n              onChange={(event) => {\n                setDay(event.target.value);\n                setSlot('');\n                setStatus('');\n              }}\n            />\n          </div>\n          <div className=\"hd-meeting-times\">\n            <Select\n              label=\"Time zone\"\n              value={zone}\n              disabled={disabled}\n              onChange={(event) => {\n                setZone(event.target.value);\n                setSlot('');\n                setStatus('');\n              }}\n              options={[\n                { value: 'Asia/Kolkata', label: 'India · IST (UTC+5:30)' },\n                { value: 'Europe/London', label: 'London · Europe/London' },\n                { value: 'America/New_York', label: 'New York · America/New_York' },\n              ]}\n            />\n            <Select\n              label=\"Hour format\"\n              value={hourFormat}\n              disabled={disabled}\n              options={[\n                { value: '12', label: '12 hour' },\n                { value: '24', label: '24 hour' },\n              ]}\n              onChange={(event) => setHourFormat(event.target.value)}\n            />\n            <div className=\"hd-time-slots\" role=\"group\" aria-label=\"Available meeting times\">\n              {slots.map((time) => (\n                <Button\n                  key={time}\n                  variant={slot === time ? 'primary' : 'secondary'}\n                  aria-pressed={slot === time}\n                  disabled={disabled || !validDate(day) || time === '11:00'}\n                  size=\"sm\"\n                  onClick={() => {\n                    setSlot(time);\n                    setStatus('');\n                  }}\n                >\n                  {format(time)}\n                  {time === '11:00' ? ' · booked' : ''}\n                </Button>\n              ))}\n            </div>\n            <Button\n              disabled={disabled || !validDate(day) || !slot}\n              onClick={() => {\n                const meeting = { date: day, time: slot, timeZone: zone };\n                onConfirm?.(meeting);\n                setStatus(\n                  `Meeting prepared for ${day} at ${slot} (${zone}). No invitation was sent.`,\n                );\n              }}\n            >\n              Confirm meeting time\n            </Button>\n          </div>\n          <p className=\"ha-status hd-meeting-status\" role=\"status\">\n            {status || 'Select an available time to continue.'}\n          </p>\n        </div>\n      )}\n    </section>\n  );\n}\n",
  "src/Direction.tsx": "'use client';\nimport { createContext, useContext } from 'react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { I18nProvider, useLocale } from 'react-aria';\n\nexport type DirectionValue = { locale:string; direction:'ltr'|'rtl' };\nexport type DirectionProviderProps = {\n  children:ReactNode;\n  /** BCP 47 language tag. Set this together with the host document's lang/dir. */\n  locale?:string;\n  className?:string;\n  style?:CSSProperties;\n};\nconst DirectionContext=createContext<DirectionValue>({locale:'en-IN',direction:'ltr'});\nfunction DirectionRegion({children,className,style}:Omit<DirectionProviderProps,'locale'>){\n  const {locale,direction}=useLocale();\n  return <DirectionContext.Provider value={{locale,direction}}><div lang={locale} dir={direction} className={className} style={{display:'contents',...style}}>{children}</div></DirectionContext.Provider>;\n}\n/** Coordinates inherited layout with React Aria keyboard, calendar and portal locale. */\nexport function DirectionProvider({locale='en-IN',...props}:DirectionProviderProps){\n  return <I18nProvider locale={locale}><DirectionRegion {...props}/></I18nProvider>;\n}\n/** Carry direction onto custom portals that render outside their original DOM region. */\nexport function useDirection():DirectionValue{return useContext(DirectionContext);}\n",
  "src/Examples.tsx": "import { useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { Button, Checkbox, DataState, Dialog, Input, Select, Tabs } from './components.js';\nimport { DataTable } from './DataTable.js';\nimport type { Column } from './DataTable.js';\n\nexport type ExampleState = 'ready' | 'loading' | 'empty' | 'error';\nexport type Member = {\n  id: string;\n  name: string;\n  email: string;\n  role: string;\n  status: string;\n  amount: number;\n};\nexport const members: Member[] = [\n  ['Aarav Shah', 'aarav@example.com', 'Designer', 'Active'],\n  ['Diya Rao', 'diya@example.com', 'Developer', 'Active'],\n  ['Ishaan Patel', 'ishaan@example.com', 'Admin', 'Invited'],\n  ['Kavya Nair', 'kavya@example.com', 'Designer', 'Active'],\n  ['Rohan Mehta', 'rohan@example.com', 'Developer', 'Inactive'],\n  ['Sana Ali', 'sana@example.com', 'Admin', 'Active'],\n  ['Vihaan Das', 'vihaan@example.com', 'Developer', 'Invited'],\n  ['Anaya Iyer', 'anaya@example.com', 'Designer', 'Active'],\n  ['Arjun Sen', 'arjun@example.com', 'Developer', 'Active'],\n  ['Mira Jain', 'mira@example.com', 'Admin', 'Inactive'],\n  ['Neel Roy', 'neel@example.com', 'Designer', 'Active'],\n  ['Tara Kapoor', 'tara@example.com', 'Developer', 'Active'],\n].map(([name, email, role, status], i) => ({\n  id: String(i + 1),\n  name,\n  email,\n  role,\n  status,\n  amount: (i + 1) * 1250,\n}));\nconst money = (value: number) =>\n  new Intl.NumberFormat('en-IN', {\n    style: 'currency',\n    currency: 'INR',\n    maximumFractionDigits: 0,\n  }).format(value);\nexport const memberColumns: Column<Member>[] = [\n  {\n    key: 'name',\n    header: 'Team member',\n    value: (row) => row.name,\n    sortable: true,\n    render: (row) => (\n      <div className=\"hu-member\">\n        <span className=\"hu-avatar\" aria-hidden=\"true\">\n          {row.name\n            .split(' ')\n            .map((x) => x[0])\n            .join('')}\n        </span>\n        <span>\n          <strong>{row.name}</strong>\n          <small>{row.email}</small>\n        </span>\n      </div>\n    ),\n  },\n  {\n    key: 'status',\n    header: 'Status',\n    value: (row) => row.status,\n    sortable: true,\n    render: (row) => (\n      <span className={`hu-badge hu-status-${row.status.toLowerCase()}`}>{row.status}</span>\n    ),\n  },\n  { key: 'role', header: 'Role', value: (row) => row.role, sortable: true },\n  {\n    key: 'amount',\n    header: 'Example spend',\n    value: (row) => row.amount,\n    sortable: true,\n    render: (row) => money(row.amount),\n  },\n];\nexport function TableExample({\n  state = 'ready',\n  onRetry,\n  density = 'comfortable',\n}: {\n  state?: ExampleState;\n  onRetry?: () => void;\n  density?: 'compact' | 'comfortable';\n}) {\n  const [member, setMember] = useState<Member | null>(null);\n  const [rows,setRows] = useState(members), [roleFilter,setRoleFilter] = useState('all'), [statusFilter,setStatusFilter] = useState('all');\n  const columns = useMemo(() => memberColumns.map(column => column.key === 'status' ? {...column,render:(row:Member)=><Select className=\"hu-table-status\" size=\"sm\" label={'Status for '+row.name} value={row.status} options={['Active','Invited','Inactive'].map(value=>({value,label:value}))} onChange={event=>setRows(previous=>previous.map(item=>item.id===row.id?{...item,status:event.target.value}:item))}/>} : column),[]);\n  return (\n    <div className={`hu-example hu-density-${density}`}>\n      <div className=\"hu-example-heading\">\n        <div>\n          <h3>Team members</h3>\n          <p>Fictional records · client-side sorting, selection and export</p>\n        </div>\n        <span className=\"hu-badge\">12 members</span>\n      </div>\n      <div className=\"hu-table-filters\">\n        <Select label=\"Filter by role\" size=\"sm\" value={roleFilter} onChange={event=>setRoleFilter(event.target.value)} options={[{value:'all',label:'All roles'},...['Designer','Developer','Admin'].map(value=>({value,label:value}))]}/>\n        <Select label=\"Filter by status\" size=\"sm\" value={statusFilter} onChange={event=>setStatusFilter(event.target.value)} options={[{value:'all',label:'All statuses'},...['Active','Invited','Inactive'].map(value=>({value,label:value}))]}/>\n        {(roleFilter!=='all'||statusFilter!=='all')&&<Button variant=\"tertiary\" size=\"sm\" onClick={()=>{setRoleFilter('all');setStatusFilter('all');}}>Clear filters</Button>}\n      </div>\n      <DataTable\n        rows={rows}\n        filters={{...(roleFilter!=='all'?{role:roleFilter}:{}),...(statusFilter!=='all'?{status:statusFilter}:{})}}\n        columns={columns}\n        rowKey={(row) => row.id}\n        rowLabel={(row) => row.name}\n        caption=\"Example team members\"\n        state={state}\n        onRetry={onRetry}\n        onRowAction={setMember}\n      />\n      <Dialog\n        open={Boolean(member)}\n        onOpenChange={(open) => {\n          if (!open) setMember(null);\n        }}\n        title={member?.name || 'Team member'}\n        description=\"Local example record; no account changes are made.\"\n        footer={\n          <Button variant=\"secondary\" onClick={() => setMember(null)}>\n            Close\n          </Button>\n        }\n      >\n        <dl className=\"hu-record\">\n          <dt>Email</dt>\n          <dd>{member?.email}</dd>\n          <dt>Role</dt>\n          <dd>{member?.role}</dd>\n          <dt>Status</dt>\n          <dd>{member?.status}</dd>\n        </dl>\n      </Dialog>\n    </div>\n  );\n}\n\nexport function SettingsForm({\n  state = 'ready',\n  onRetry,\n}: {\n  state?: ExampleState;\n  onRetry?: () => void;\n}) {\n  const [name, setName] = useState('Aarav Shah'),\n    [email, setEmail] = useState('aarav@example.com'),\n    [role, setRole] = useState('designer'),\n    [consent, setConsent] = useState(true),\n    [errors, setErrors] = useState<Record<string, string>>({}),\n    [saved, setSaved] = useState(false);\n  const nameRef = useRef<HTMLInputElement>(null),\n    emailRef = useRef<HTMLInputElement>(null);\n  if (state !== 'ready')\n    return (\n      <DataState\n        state={state}\n        onRetry={onRetry}\n        emptyMessage=\"Create a profile to begin this example.\"\n      />\n    );\n  return (\n    <form\n      className=\"hu-settings\"\n      noValidate\n      onSubmit={(event) => {\n        event.preventDefault();\n        const next: Record<string, string> = {};\n        if (!name.trim()) next.name = 'Enter your full name.';\n        if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) next.email = 'Enter a valid email address.';\n        setErrors(next);\n        setSaved(!Object.keys(next).length);\n        if (next.name) nameRef.current?.focus();\n        else if (next.email) emailRef.current?.focus();\n      }}\n    >\n      <h3>Personal information</h3>\n      <p>Try validation and recovery. Changes stay in this example.</p>\n      <Input\n        ref={nameRef}\n        label=\"Full name\"\n        autoComplete=\"name\"\n        value={name}\n        required\n        error={errors.name}\n        onChange={(event) => {\n          setName(event.target.value);\n          setSaved(false);\n        }}\n      />\n      <Input\n        ref={emailRef}\n        label=\"Email address\"\n        autoComplete=\"email\"\n        type=\"email\"\n        value={email}\n        required\n        error={errors.email}\n        hint=\"Used for example notifications.\"\n        onChange={(event) => {\n          setEmail(event.target.value);\n          setSaved(false);\n        }}\n      />\n      <Select\n        label=\"Role\"\n        value={role}\n        options={[\n          { value: 'designer', label: 'Designer' },\n          { value: 'developer', label: 'Developer' },\n          { value: 'admin', label: 'Admin' },\n        ]}\n        onChange={(event) => {\n          setRole(event.target.value);\n          setSaved(false);\n        }}\n      />\n      <Checkbox\n        label=\"Receive product updates\"\n        hint=\"You can change this preference later.\"\n        checked={consent}\n        onChange={(event) => {\n          setConsent(event.target.checked);\n          setSaved(false);\n        }}\n      />\n      <div className=\"hu-actions\">\n        <Button\n          variant=\"secondary\"\n          onClick={() => {\n            setName('Aarav Shah');\n            setEmail('aarav@example.com');\n            setRole('designer');\n            setConsent(true);\n            setErrors({});\n            setSaved(false);\n          }}\n        >\n          Reset\n        </Button>\n        <Button type=\"submit\">Save example</Button>\n      </div>\n      <p role=\"status\">{saved ? 'Example saved locally in this preview.' : ''}</p>\n    </form>\n  );\n}\n\nexport function DialogExample({\n  destructive = false,\n  state = 'ready',\n  onRetry,\n}: {\n  destructive?: boolean;\n  state?: ExampleState;\n  onRetry?: () => void;\n}) {\n  const [open, setOpen] = useState(false),\n    [result, setResult] = useState(''),\n    [projectName, setProjectName] = useState('Helios design system'),\n    [draftName, setDraftName] = useState('Helios design system'),\n    [nameError, setNameError] = useState('');\n  const nameRef = useRef<HTMLInputElement>(null);\n  const projectFormId = useId();\n  const saveProject = () => {\n    if (!destructive && !draftName.trim()) {\n      setNameError('Enter a project name.');\n      nameRef.current?.focus();\n      return;\n    }\n    if (!destructive) setProjectName(draftName.trim());\n    setResult(destructive ? 'Example project deleted.' : 'Example changes saved.');\n    setOpen(false);\n  };\n  return (\n    <div className=\"hu-dialog-example\">\n      <Button\n        variant={destructive ? 'danger' : 'primary'}\n        onClick={() => {\n          setOpen(true);\n          setResult('');\n          setDraftName(projectName);\n          setNameError('');\n        }}\n      >\n        {destructive ? 'Delete project' : 'Edit project'}\n      </Button>\n      <p role=\"status\">\n        {result || 'Open the dialog, try Tab and Escape, then check focus returns here.'}\n      </p>\n      <Dialog\n        open={open}\n        onOpenChange={setOpen}\n        title={destructive ? 'Delete this project?' : 'Edit project'}\n        description={\n          destructive\n            ? 'This is a local example. No real project will be deleted.'\n            : 'Update the example project details.'\n        }\n        destructive={destructive}\n        footer={\n          <>\n            <Button variant=\"secondary\" onClick={() => setOpen(false)}>\n              Cancel\n            </Button>\n            <Button\n              disabled={state !== 'ready'}\n              variant={destructive ? 'danger' : 'primary'}\n              type={destructive ? 'button' : 'submit'}\n              form={destructive ? undefined : projectFormId}\n              onClick={destructive ? saveProject : undefined}\n            >\n              {destructive ? 'Delete example' : 'Save changes'}\n            </Button>\n          </>\n        }\n      >\n        {state === 'ready' ? (\n          destructive ? (\n            <p>This action demonstrates a destructive confirmation.</p>\n          ) : (\n            <form id={projectFormId} noValidate onSubmit={(event) => { event.preventDefault(); saveProject(); }}><Input\n              ref={nameRef}\n              label=\"Project name\"\n              value={draftName}\n              required\n              error={nameError}\n              onChange={(event) => {\n                setDraftName(event.target.value);\n                setNameError('');\n              }}\n            /></form>\n          )\n        ) : (\n          <DataState state={state} onRetry={onRetry} />\n        )}\n      </Dialog>\n    </div>\n  );\n}\n\nexport type RevenuePoint = { label: string; value: number };\nexport const revenue: RevenuePoint[] = [\n  { label: 'Jan', value: 4200 },\n  { label: 'Feb', value: 5100 },\n  { label: 'Mar', value: 4600 },\n  { label: 'Apr', value: 6800 },\n  { label: 'May', value: 5900 },\n  { label: 'Jun', value: 7200 },\n];\nexport function RevenueChart({\n  data = revenue,\n  state = 'ready',\n  onRetry,\n}: {\n  data?: RevenuePoint[];\n  state?: ExampleState;\n  onRetry?: () => void;\n}) {\n  const [period, setPeriod] = useState('all'),\n    [active, setActive] = useState(0),\n    [show, setShow] = useState(true);\n  const points = period === 'quarter' ? data.slice(-3) : data,\n    maximum = Math.max(1, ...points.map((x) => x.value)),\n    total = points.reduce((sum, x) => sum + x.value, 0),\n    selected = points[Math.min(active, points.length - 1)];\n  return (\n    <section className=\"hu-chart\">\n      <div className=\"hu-example-heading\">\n        <div>\n          <h3>Revenue overview</h3>\n          <p>Illustrative INR data · totals match the visible period</p>\n        </div>\n        <Select\n          label=\"Chart period\"\n          value={period}\n          options={[\n            { value: 'all', label: 'Six months' },\n            { value: 'quarter', label: 'Last quarter' },\n          ]}\n          onChange={(event) => {\n            setPeriod(event.target.value);\n            setActive(0);\n          }}\n        />\n      </div>\n      {state !== 'ready' || !points.length ? (\n        <DataState state={state === 'ready' ? 'empty' : state} onRetry={onRetry} />\n      ) : (\n        <>\n          <strong className=\"hu-chart-total\">{money(total)}</strong>\n          <Checkbox\n            label=\"Show revenue series\"\n            checked={show}\n            onChange={(event) => setShow(event.target.checked)}\n          />\n          {show ? (\n            <>\n              <div\n                className=\"hu-bars\"\n                role=\"group\"\n                aria-label=\"Revenue by month; focus a bar to inspect\"\n              >\n                {points.map((point, index) => (\n                  <button\n                    key={point.label}\n                    type=\"button\"\n                    aria-label={`${point.label}: ${money(point.value)}`}\n                    aria-pressed={active === index}\n                    onFocus={() => setActive(index)}\n                    onMouseEnter={() => setActive(index)}\n                    onClick={() => setActive(index)}\n                  >\n                    <span style={{ height: Math.max(2, (point.value / maximum) * 100) + '%' }} />\n                    <small>{point.label}</small>\n                  </button>\n                ))}\n              </div>\n              <p role=\"status\" className=\"hu-chart-inspect\">\n                {selected?.label}: {money(selected?.value || 0)}\n              </p>\n              <details>\n                <summary>Accessible data table</summary>\n                <table>\n                  <caption>Revenue in INR</caption>\n                  <thead>\n                    <tr>\n                      <th scope=\"col\">Month</th>\n                      <th scope=\"col\">Revenue</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    {points.map((point) => (\n                      <tr key={point.label}>\n                        <th scope=\"row\">{point.label}</th>\n                        <td>{money(point.value)}</td>\n                      </tr>\n                    ))}\n                  </tbody>\n                </table>\n              </details>\n            </>\n          ) : (\n            <p role=\"status\">Revenue series hidden. Enable it above to restore the chart.</p>\n          )}\n        </>\n      )}\n    </section>\n  );\n}\n\nexport function ChatComposer({\n  state = 'ready',\n  onRetry,\n}: {\n  state?: ExampleState;\n  onRetry?: () => void;\n}) {\n  const draftId = useId();\n  const [draft, setDraft] = useState(''),\n    [messages, setMessages] = useState<string[]>([]),\n    [status, setStatus] = useState(''),\n    [failed, setFailed] = useState(false);\n  useEffect(() => {\n    if (state === 'empty') {\n      setMessages([]);\n      setStatus('');\n    }\n  }, [state]);\n  const send = () => {\n    if (!draft.trim()) {\n      setStatus('Write a message before sending.');\n      return;\n    }\n    if (failed) {\n      setStatus('Example send failed. Your draft is preserved. Use Retry send.');\n      return;\n    }\n    setMessages((previous) => [...previous, draft.trim()]);\n    setDraft('');\n    setStatus('Added to this local example. No AI or external service was contacted.');\n  };\n  if (state === 'loading' || state === 'error')\n    return <DataState state={state} onRetry={onRetry} />;\n  return (\n    <section className=\"hu-chat\">\n      <h3>Team conversation</h3>\n      <p>Local composer example · Enter sends, Shift+Enter adds a line</p>\n      <div role=\"log\" aria-label=\"Example messages\" className=\"hu-chat-log\">\n        {messages.length ? (\n          messages.map((message, index) => (\n            <div key={index}>\n              <strong>You</strong>\n              <p>{message}</p>\n            </div>\n          ))\n        ) : (\n          <p>No messages yet. Start a conversation below.</p>\n        )}\n      </div>\n      <label htmlFor={draftId}>Message</label>\n      <textarea\n        id={draftId}\n        value={draft}\n        placeholder=\"Write a message…\"\n        rows={3}\n        onChange={(event) => setDraft(event.target.value)}\n        onKeyDown={(event) => {\n          if (event.key === 'Enter' && !event.shiftKey && !event.nativeEvent.isComposing) {\n            event.preventDefault();\n            send();\n          }\n        }}\n      />\n      <div className=\"hu-actions\">\n        <Checkbox\n          label=\"Simulate send failure\"\n          checked={failed}\n          onChange={(event) => setFailed(event.target.checked)}\n        />\n        {failed ? (\n          <Button\n            onClick={() => {\n              setFailed(false);\n              if (draft.trim()) {\n                setMessages((previous) => [...previous, draft.trim()]);\n                setDraft('');\n                setStatus('Retry succeeded in this local example.');\n              }\n            }}\n          >\n            Retry send\n          </Button>\n        ) : (\n          <Button onClick={send} disabled={!draft.trim()}>\n            Send message\n          </Button>\n        )}\n      </div>\n      <p role=\"status\">{status}</p>\n    </section>\n  );\n}\nexport function CompositionExample({\n  state = 'ready',\n  onRetry,\n}: {\n  state?: ExampleState;\n  onRetry?: () => void;\n}) {\n  return (\n    <Tabs\n      label=\"Composed React examples\"\n      items={[\n        { id: 'form', label: 'Form', content: <SettingsForm state={state} onRetry={onRetry} /> },\n        {\n          id: 'table',\n          label: 'Data table',\n          content: <TableExample state={state} onRetry={onRetry} />,\n        },\n        { id: 'chart', label: 'Chart', content: <RevenueChart state={state} onRetry={onRetry} /> },\n        {\n          id: 'chat',\n          label: 'Composer',\n          content: <ChatComposer state={state} onRetry={onRetry} />,\n        },\n      ]}\n    />\n  );\n}\n",
  "src/ModernCharts.tsx": "/** Public chart input contracts. The renderer consumes the canonical rows below. */\nimport type {ReactNode,ComponentType} from 'react';\nexport type ChartIcon=ReactNode|ComponentType<{size?:number}>;\nimport type {ChartDatum} from './ChartFamilies.js';\nexport type ChartInputDatum = {name?:string;label?:string;value?:number;current?:number;previous?:number;x?:number;y?:number;z?:number;[key:string]:unknown};\nexport type ChartSeries = {key?:string;dataKey?:string;field?:string;name?:string;label?:string;color?:string;format?:(value:number)=>string;points?:{x:number;y:number;z?:number;label?:string}[]};\nexport type ChartStage = {label?:string;name?:string;value:number;color?:string;icon?:ChartIcon};\nexport type ChartListTab = {id:string;label:string;items:ChartStage[]};\nexport type ChartMatrixRow = {label:string;values:(number|null|undefined)[]};\nexport type ChartFlowNode = {name:string;color?:string};\nexport type ChartFlowLink = {source:string|number;target:string|number;value:number};\nexport type ChartRange = {id?:string;value?:string;label:string;data?:(ChartDatum|ChartInputDatum)[];stages?:ChartStage[];rows?:ChartMatrixRow[];columns?:string[];nodes?:ChartFlowNode[];links?:ChartFlowLink[];series?:ChartSeries[];headline?:string|number;delta?:number};\nexport type PublicChartInputProps = {data?:(ChartDatum|ChartInputDatum)[];series?:ChartSeries[];bar?:ChartSeries;line?:ChartSeries;stages?:ChartStage[];items?:ChartStage[];tabs?:ChartListTab[];rows?:ChartMatrixRow[];columns?:string[];nodes?:ChartFlowNode[];links?:ChartFlowLink[];max?:number;color?:string};\nconst numeric=(value:unknown):number|undefined=>typeof value==='number'&&Number.isFinite(value)?value:undefined;\nconst text=(value:unknown,fallback:string)=>typeof value==='string'?value:fallback;\nconst field=(raw:ChartInputDatum,descriptor:ChartSeries)=>{const key=descriptor.key||descriptor.dataKey||descriptor.field||descriptor.name||descriptor.label||'';return numeric(raw[key]??raw[Object.keys(raw).find(name=>name.toLowerCase()===key.toLowerCase())||''])};\nexport function normalizePublicChartInput(id:string,props:PublicChartInputProps,range:ChartRange|undefined,tabId:string){\n const series=range?.series??props.series,stages=range?.stages??props.stages,matrixRows=range?.rows??props.rows,columns=range?.columns??props.columns,nodes=range?.nodes??props.nodes,links=range?.links??props.links,tab=props.tabs?.find(tab=>tab.id===tabId)||props.tabs?.[0],raw=range?.data??props.data;\n const custom=raw!==undefined||stages!==undefined||matrixRows!==undefined||links!==undefined||props.items!==undefined||!!props.tabs||!!series?.some(s=>s.points);\n let data:ChartDatum[]|undefined,error:string|undefined;if(props.max!==undefined&&(!Number.isFinite(props.max)||props.max<=0))error='The chart maximum must be a positive finite number.';\n if(matrixRows){const labels=columns||Array.from({length:Math.max(0,...matrixRows.map(row=>row.values.length))},(_,i)=>String(i+1));data=matrixRows.flatMap((row,rowIndex)=>labels.flatMap((label,colIndex)=>{const value=numeric(row.values[colIndex]);return value===undefined?[]:[{name:`${row.label} · ${label}`,value,matrixRow:rowIndex,matrixColumn:colIndex}]}));}\n else if(links){const names=nodes?.map(node=>node.name);if(names&&new Set(names).size!==names.length)error='Flow node names must be unique.';const nodeName=(key:string|number)=>typeof key==='number'?nodes?.[key]?.name:key;data=links.flatMap(link=>{const source=nodeName(link.source),target=nodeName(link.target),value=numeric(link.value);if(!source||!target||value===undefined||value<0||names&&(!names.includes(source)||!names.includes(target))){error='Flow links must reference existing nodes and contain non-negative finite values.';return [];}return [{name:`${source} → ${target}`,source,target,value,sourceColor:nodes?.find(node=>node.name===source)?.color}]});const degrees=new Map<string,number>(),edges=new Map<string,string[]>();for(const row of data){degrees.set(row.source!,degrees.get(row.source!)||0);degrees.set(row.target!,(degrees.get(row.target!)||0)+1);edges.set(row.source!,[...(edges.get(row.source!)||[]),row.target!]);}const queue=[...degrees.keys()].filter(name=>degrees.get(name)===0);let visited=0;for(let i=0;i<queue.length;i++){visited++;for(const target of edges.get(queue[i])||[]){degrees.set(target,(degrees.get(target)||0)-1);if(degrees.get(target)===0)queue.push(target)}}if(visited<degrees.size)error='A Sankey chart requires an acyclic flow graph.';}\n else if(id==='scatter-chart-card'&&series?.some(s=>s.points)){data=series.flatMap((s,seriesIndex)=>(s.points||[]).flatMap((point,index)=>numeric(point.x)===undefined||numeric(point.y)===undefined?[]:[{name:point.label||`${s.label||s.name||`Series ${seriesIndex+1}`} ${index+1}`,x:point.x,value:point.y,z:numeric(point.z),group:s.label||s.name||`Series ${seriesIndex+1}`,color:s.color}]));}\n else{const source=stages??(id==='bar-list-card'?(tab?.items??props.items):undefined)??raw;if(source)data=source.flatMap((item,index)=>{const row=item as ChartInputDatum,parts=Array.isArray(row.series)?row.series.filter((part:any)=>numeric(part?.value)!==undefined).map((part:any)=>({name:text(part.name,'Series'),value:part.value,color:part.color})):series?.filter(s=>!s.points).flatMap((s,i)=>{const value=field(row,s);return value===undefined?[]:[{name:s.label||s.name||s.key||s.dataKey||s.field||`Series ${i+1}`,value,color:s.color}]});const value=props.bar?field(row,props.bar):parts?.length?parts.reduce((sum,part)=>sum+part.value,0):numeric(row.value)??numeric(row.current)??numeric(row.y);if(value===undefined)return [];return [{...row,name:text(row.name,text(row.label,String(index+1))),value,previous:numeric(row.previous),secondary:props.line?field(row,props.line):numeric(row.secondary),goal:numeric(row.goal)??(id==='radial-chart-card'?props.max:undefined),series:parts,color:typeof row.color==='string'?row.color:undefined,sourceColor:typeof row.sourceColor==='string'?row.sourceColor:typeof row.color==='string'?row.color:undefined} as ChartDatum]});}\n if(error)data=[];\n return {data,error,custom,tab,series,matrix:matrixRows?{rowLabels:matrixRows.map(row=>row.label),columns:columns||Array.from({length:Math.max(0,...matrixRows.map(row=>row.values.length))},(_,i)=>String(i+1))}:undefined,colors:series?.map(s=>s.color),bar:props.bar,line:props.line};\n}\n",
  "src/Playground.tsx": "import { UIIcon } from './icons.js';\nimport { useEffect, useRef, useState } from 'react';\nimport { createRoot } from 'react-dom/client';\nimport type { ReactNode } from 'react';\nimport { Button, Checkbox, Input, Select, Tabs } from './components.js';\nimport {\n  ChatComposer,\n  CompositionExample,\n  DialogExample,\n  RevenueChart,\n  SettingsForm,\n  TableExample,\n} from './Examples.js';\nimport type { ExampleState } from './Examples.js';\nimport { defaults, dependencyInfo, registry, teamOptions } from './registry.js';\nimport type { Kind, Config } from './registry.js';\nimport sources from '../sources.json';\nimport publicPropMetadata from '../public-props.json';\nimport { FamilyPreview } from './AllComponents.js';\nimport { RichSelect } from './BoardExtras.js';\nimport { ModernChart, chartVariantOptions } from './ChartFamilies.js';\nimport type { ChartVariant } from './ChartFamilies.js';\nimport { isExtendedKind } from './extended-registry.js';\nimport { PrimitiveExamples } from './PrimitiveExamples.js';\nimport { AgentPattern } from './AgentPatterns.js';\nimport { agentControls } from './agent-controls.js';\nimport {useDirection} from './Direction.js';\n\nconst PlaceholderIcon = () => <UIIcon name=\"star\" />;\nimport { exampleFor, isComposed } from './example-code.js';\n\nfunction TemplateViewport({ kind, state, onRetry }: { kind: string; state: string; onRetry: () => void }) {\n  const {locale}=useDirection();\n  const [device, setDevice] = useState('auto'), [available, setAvailable] = useState(800);\n  const container = useRef<HTMLDivElement>(null);\n  const iframe = useRef<HTMLIFrameElement>(null);\n  const initial = useRef({kind,state}), requestedState = useRef(state), retry = useRef(onRetry);\n  if(initial.current.kind!==kind)initial.current={kind,state};\n  requestedState.current=state;retry.current=onRetry;\n  const synchronizeState=()=>iframe.current?.contentWindow?.postMessage({type:'helios-template-control',state:requestedState.current},location.origin);\n  useEffect(() => { const receive=(event:MessageEvent)=>{ if(event.origin!==location.origin||event.source!==iframe.current?.contentWindow)return;if(event.data?.type==='helios-template-ready')synchronizeState();if(event.data?.type==='helios-template-state'&&event.data?.state==='ready')retry.current(); }; window.addEventListener('message',receive); return()=>window.removeEventListener('message',receive); }, []);\n  useEffect(()=>{synchronizeState();},[state]);\n  useEffect(() => { const node=container.current; if(!node)return; const observer=new ResizeObserver(([entry]) => setAvailable(entry.contentRect.width)); observer.observe(node); return()=>observer.disconnect(); }, []);\n  const automatic=device==='auto', width=automatic?Math.max(1,Math.floor(available/.8)):device==='mobile'?390:device==='tablet'?1024:1440;\n  const scale=automatic?.8:Math.min(1,available/width), height=automatic?855:900;\n  return <div className=\"hr-template-viewport\" ref={container}>\n    <div className=\"hr-template-device-controls\"><Select label=\"Template preview device\" size=\"sm\" value={device} options={['auto','desktop','tablet','mobile'].map(value=>({value,label:value}))} onChange={event=>setDevice(event.target.value)}/></div>\n    <div className=\"hr-template-browser\" style={{width:width*scale}}>\n      {!automatic&&<div className=\"hr-template-browser-bar\"><span aria-hidden=\"true\">● ● ●</span><small>Helios UI · {device} · {width}px</small></div>}\n      <div className=\"hr-template-screen\" style={{height:height*scale}}>\n        <iframe ref={iframe} key={kind} onLoad={synchronizeState} title={registry[kind].name+' interactive '+device+' preview'} src={'/templates/'+kind.slice(9)+'?preview=1&state='+initial.current.state+'&locale='+encodeURIComponent(locale)+(kind==='template-calendar'?'&chrome=0':'')+(kind==='template-multi-agent-chat'?'&group=1&editor=0':'')} width={width} height={height} style={{transform:`scale(${scale})`,transformOrigin:'top left',border:0}} />\n      </div>\n    </div>\n  </div>;\n}\n\nfunction Preview({\n  kind,\n  config: c,\n  update,\n  onRetry,\n}: {\n  kind: Kind;\n  config: Config;\n  update: (c: Partial<Config>) => void;\n  onRetry: () => void;\n}) {\n  const [status, setStatus] = useState('');\n  const state: ExampleState = ['default', 'ready'].includes(c.state)\n    ? 'ready'\n    : (c.state as ExampleState);\n  const icon = c.icon !== 'none' ? <PlaceholderIcon /> : undefined;\n  if (kind === 'buttons')\n    return (\n      <div className=\"hu-centered\">\n        <div className=\"hr-button-showcase\">\n        <Button\n          size={c.size as 'md'}\n          variant={c.variant as 'primary'}\n          loading={c.state === 'loading'}\n          disabled={c.state === 'disabled'}\n          leadingIcon={['leading', 'both', 'only'].includes(c.icon) ? icon : undefined}\n          trailingIcon={['trailing', 'both'].includes(c.icon) ? icon : undefined}\n          iconOnly={c.icon === 'only'}\n          aria-label={c.icon === 'only' ? c.label : undefined}\n          onClick={() => setStatus('Action handled by the React export.')}\n        >\n          {c.label}\n        </Button>\n        <Button variant=\"secondary\" trailingIcon={<UIIcon name=\"arrow-right\" />} onClick={() => setStatus('Continue action handled locally.')}>\n          Continue\n        </Button>\n        <Button variant=\"ghost\" onClick={() => setStatus('Marked as done locally.')}>\n          Mark as done\n        </Button>\n        <Button variant=\"danger\" onClick={() => setStatus('Delete action previewed locally.')}>\n          Delete\n        </Button>\n        </div>\n        <p role=\"status\">{status}</p>\n      </div>\n    );\n  if (kind === 'inputs')\n    return (\n      <Input\n        size={c.size as 'md'}\n        label={c.label}\n        value={c.value}\n        onChange={(event) => update({ value: event.target.value })}\n        placeholder=\"name@example.com\"\n        hint=\"Your email stays in this local example.\"\n        error={c.state === 'error' ? 'Please check this value.' : undefined}\n        disabled={c.state === 'disabled'}\n        leadingIcon={icon}\n      />\n    );\n  if (kind === 'select')\n    return (\n      <RichSelect\n        size={c.size as 'md'}\n        label={c.label}\n        value={['placeholder', 'loading'].includes(c.state) ? '' : c.value}\n        onValueChange={(value) => update({ value, state: 'default' })}\n        options={teamOptions}\n        placeholder=\"Choose a team member\"\n        hint=\"Use keyboard arrows or type to select.\"\n        error={c.state === 'error' ? 'Please check this value.' : undefined}\n        disabled={c.state === 'disabled'}\n        loading={c.state === 'loading'}\n        leadingIcon={icon}\n      />\n    );\n  if (kind === 'checkboxes')\n    return (\n      <Checkbox\n        size={c.size === 'md' ? 'md' : 'sm'}\n        label={c.label}\n        checked={c.checked}\n        indeterminate={c.state === 'indeterminate'}\n        disabled={c.state === 'disabled'}\n        onChange={(event) => update({ checked: event.target.checked, state: 'default' })}\n      />\n    );\n  if (kind === 'tabs')\n    return (\n      <Tabs\n        label=\"Example sections\"\n        value={c.value || 'overview'}\n        onValueChange={(value) => update({ value })}\n        items={[\n          { id: 'overview', label: 'Overview', content: 'Overview content' },\n          { id: 'activity', label: 'Activity', content: 'Activity content' },\n          {\n            id: 'settings',\n            label: 'Settings',\n            content: 'Settings content',\n            disabled: c.state === 'disabled',\n          },\n        ]}\n      />\n    );\n  if (kind === 'modals')\n    return <DialogExample destructive={c.destructive} state={state} onRetry={onRetry} />;\n  if (kind === 'tables')\n    return <TableExample density={c.density as 'comfortable'} state={state} onRetry={onRetry} />;\n  if (kind === 'charts') return <RevenueChart state={state} onRetry={onRetry} />;\n  if (kind === 'messaging') return <ChatComposer state={state} onRetry={onRetry} />;\n  if (registry[kind].group === 'Charts')\n    return <ModernChart id={kind} shape={c.shape} variant={c.variant as ChartVariant} mono={c.mono} limit={c.limit} bubble={c.bubble} state={c.state === 'disabled' ? 'ready' : state} disabled={c.state === 'disabled'} onRetry={onRetry} />;\n  if (registry[kind].file === 'src/AgentPatterns.tsx')\n    return <AgentPattern key={kind+JSON.stringify(c.options)} id={kind} {...c.options} state={c.state==='disabled'?'ready':state} disabled={c.state==='disabled'} onRetry={onRetry}/>;\n  if (isExtendedKind(kind))\n    return (\n      <FamilyPreview\n        id={kind}\n        state={c.state === 'disabled' ? 'ready' : state}\n        disabled={c.state === 'disabled'}\n        size={['sm', 'md', 'lg'].includes(c.size) ? (c.size as 'md') : 'md'}\n        onRetry={onRetry}\n      />\n    );\n  return <SettingsForm state={state} onRetry={onRetry} />;\n}\n\nexport default function Playground({ kind, title }: { kind: Kind; title?: string }) {\n  const [config, setConfig] = useState<Config>(defaults(kind)),\n    [view, setView] = useState('preview'),\n    [file, setFile] = useState('example'),\n    [copy, setCopy] = useState(''),\n    [compositionState, setCompositionState] = useState<ExampleState>('ready');\n  const ref = useRef<HTMLDivElement>(null),\n    spec = title ? {...registry[kind],name:title} : registry[kind];\n  const update = (partial: Partial<Config>) => {\n    setConfig((previous) => ({ ...previous, ...partial }));\n    setCopy('');\n  };\n  const states = kind.startsWith('template-')\n    ? ['ready', 'loading', 'empty', 'error']\n    : isExtendedKind(kind)\n      ? (spec.group === 'Charts' || spec.file === 'src/AgentPatterns.tsx' ||\n          ['activity-feeds', 'filters', 'data-grid', 'metrics', 'calendars'].includes(kind)\n          ? ['ready', 'loading', 'empty', 'error', 'disabled']\n          : ['ready', 'disabled'])\n      : isComposed(kind)\n        ? ['ready', 'loading', 'empty', 'error']\n        : kind === 'buttons'\n          ? ['default', 'loading', 'disabled']\n          : kind === 'inputs'\n            ? ['default', 'error', 'disabled']\n            : kind === 'select'\n              ? ['default', 'placeholder', 'loading', 'error', 'disabled']\n              : kind === 'checkboxes'\n                ? ['default', 'indeterminate', 'disabled']\n                : ['default', 'disabled'];\n  const configuredKind = useRef(kind);\n  useEffect(() => {\n    if (configuredKind.current === kind) return;\n    configuredKind.current = kind;\n    setConfig(defaults(kind));\n    setView('preview');\n    setFile('example');\n  }, [kind]);\n  const publicAPI = (publicPropMetadata as Record<string, {exportName: string; props: Record<string, string>}>)[kind];\n  const code = exampleFor(kind, config),\n    sourceFiles = sources as Record<string, string>,\n    displayed = file === 'example' ? code : sourceFiles[file] || '';\n  const copyText = async () => {\n    try {\n      await navigator.clipboard.writeText(displayed);\n      setCopy('Copied ' + (file === 'example' ? 'current example' : file));\n    } catch {\n      setCopy('Clipboard unavailable. Select the code below to copy.');\n    }\n  };\n  const focusPreview = () => {\n    setView('preview');\n    requestAnimationFrame(() => {\n      ref.current\n        ?.querySelector<HTMLElement>(\n          'button:not(:disabled),input:not(:disabled),select:not(:disabled)',\n        )\n        ?.focus();\n    });\n  };\n  return (\n    <div className=\"hr-playground\" data-react-family={kind}>\n      <div className=\"hr-breadcrumb\">\n        <a href=\"/components\">Components</a>\n        <span> / </span>\n        <span>{spec.name}</span>\n      </div>\n      <div className=\"hr-heading\">\n        <div>\n          <span className=\"hr-kicker\">REACT COMPONENT</span>\n          <h1>{spec.name}</h1>\n          <p>{spec.description || 'Reusable React exports, live props, and complete source.'}</p>\n        </div>\n        <a\n          className=\"hu-button hu-secondary\"\n          href={\n            spec.node\n              ? dependencyInfo.figma + '?node-id=' + spec.node.replace(':', '-')\n              : spec.reference || '/source'\n          }\n          target=\"_blank\"\n          rel=\"noreferrer\"\n        >\n          {spec.node ? 'Figma source ↗' : 'Reference ↗'}\n        </a>\n      </div>\n      <div className=\"hr-layout\">\n        <div className=\"hr-content\">\n          {kind.startsWith('template-')&&<p><a className=\"hu-button hu-secondary\" href={'/templates/'+kind.slice(9)}>Open full-screen interactive template <UIIcon name=\"arrow-up-right\" /></a></p>}\n          {kind==='calendars'&&<p><a className=\"hu-button hu-secondary\" href=\"/templates/calendar\">Open the event calendar template <UIIcon name=\"arrow-up-right\" /></a></p>}\n        <div className=\"hr-preview-toolbar\">\n            <div role=\"tablist\" aria-label=\"Example display\">\n              {['preview', 'code'].map((name) => (\n                <button\n                  key={name}\n                  type=\"button\"\n                  role=\"tab\"\n                  id={'hr-tab-' + name}\n                  aria-controls={'hr-' + name}\n                  aria-selected={view === name}\n                  tabIndex={view === name ? 0 : -1}\n                  onClick={() => setView(name)}\n                  onKeyDown={(event) => {\n                    if (['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key)) {\n                      event.preventDefault();\n                      const next =\n                        event.key === 'Home'\n                          ? 'preview'\n                          : event.key === 'End'\n                            ? 'code'\n                            : name === 'preview'\n                              ? 'code'\n                              : 'preview';\n                      setView(next);\n                      document.getElementById('hr-tab-' + next)?.focus();\n                    }\n                  }}\n                >\n                  {name === 'preview' ? 'Preview' : 'Code'}\n                </button>\n              ))}\n            </div>\n            <span>React 19 · TypeScript</span>\n          </div>\n          <div\n            className={`hr-preview ${isComposed(kind) ? 'hr-composed' : ''}`}\n            ref={ref}\n            id=\"hr-preview\"\n            tabIndex={0}\n            role=\"tabpanel\"\n            aria-labelledby=\"hr-tab-preview\"\n            hidden={view !== 'preview'}\n          >\n            {kind.startsWith('template-') ? <TemplateViewport kind={kind} state={config.state} onRetry={() => update({state:'ready'})}/> : <Preview\n              kind={kind}\n              config={config}\n              update={update}\n              onRetry={() => update({ state: 'ready' })}\n            />}\n          </div>\n          <div\n            className=\"hr-code\"\n            id=\"hr-code\"\n            role=\"tabpanel\"\n            aria-labelledby=\"hr-tab-code\"\n            hidden={view !== 'code'}\n          >\n            <div>\n              <Select\n                label=\"Source file\"\n                size=\"sm\"\n                value={file}\n                options={[\n                  { value: 'example', label: 'Current example.tsx' },\n                  ...Object.keys(sourceFiles)\n                    .filter((path) => !path.startsWith('assets/'))\n                    .map((path) => ({ value: path, label: path })),\n                ]}\n                onChange={(event) => {setFile(event.target.value);setCopy('');}}\n              />\n              <Button variant=\"secondary\" size=\"sm\" onClick={copyText}>\n                Copy {file === 'example' ? 'example' : 'source'}\n              </Button>\n            </div>\n            <pre tabIndex={0} dir=\"ltr\">\n              <code>{displayed}</code>\n            </pre>\n            <p role=\"status\">{copy}</p>\n          </div>\n          <section className=\"hr-customize\" aria-label=\"Customize this example\">\n            <h2>Customize this example</h2>\n            {kind === 'buttons' && <p className=\"hr-note\">Controls customize the first button. The companion actions show secondary, ghost and danger treatments.</p>}\n          <div className=\"hr-controls\" role=\"group\" aria-label=\"Playground controls\">\n            {(agentControls[kind]||[]).map(control=>typeof control.defaultValue==='boolean' ? <Checkbox key={control.key} label={control.label} checked={Boolean(config.options[control.key]??control.defaultValue)} onChange={event=>update({options:{...config.options,[control.key]:event.target.checked}})}/> : <Select key={control.key} label={control.label} size=\"sm\" value={String(config.options[control.key]??control.defaultValue)} options={(control.values||[]).map(value=>({value:String(value),label:String(value)}))} onChange={event=>update({options:{...config.options,[control.key]:typeof control.defaultValue==='number'?Number(event.target.value):event.target.value}})}/>)}\n            {[\n              'buttons',\n              'inputs',\n              'select',\n              'checkboxes',\n              'avatars',\n              'badges',\n              'button-groups',\n              'dropdowns',\n              'progress-indicators',\n              'radio-groups',\n              'sliders',\n              'tags',\n              'toggles',\n            ].includes(kind) && (\n              <Select\n                label=\"Size\"\n                size=\"sm\"\n                value={config.size}\n                options={(kind === 'buttons'\n                  ? ['xs', 'sm', 'md', 'lg', 'xl']\n                  : kind === 'checkboxes'\n                    ? ['sm', 'md']\n                    : ['sm', 'md', 'lg']\n                ).map((value) => ({ value, label: value.toUpperCase() }))}\n                onChange={(event) => update({ size: event.target.value })}\n              />\n            )}\n            {kind === 'buttons' && (\n              <Select\n                label=\"Variant\"\n                size=\"sm\"\n                value={config.variant}\n                options={[\n                  'primary',\n                  'secondary',\n                  'tertiary',\n                  'ghost',\n                  'link-gray',\n                  'link-color',\n                  'danger',\n                ].map((value) => ({ value, label: value }))}\n                onChange={(event) => update({ variant: event.target.value })}\n              />\n            )}\n            <Select\n              label=\"State\"\n              size=\"sm\"\n              value={config.state}\n              options={states.map((value) => ({ value, label: value }))}\n              onChange={(event) => update({ state: event.target.value })}\n            />\n            {['buttons', 'inputs', 'select'].includes(kind) && (\n              <Select\n                label=\"Icons\"\n                size=\"sm\"\n                value={config.icon}\n                options={(kind === 'buttons'\n                  ? ['none', 'leading', 'trailing', 'both', 'only']\n                  : ['none', 'leading']\n                ).map((value) => ({ value, label: value }))}\n                onChange={(event) => update({ icon: event.target.value })}\n              />\n            )}\n            {kind === 'tables' && (\n              <Select\n                label=\"Density\"\n                size=\"sm\"\n                value={config.density}\n                options={['comfortable', 'compact'].map((value) => ({ value, label: value }))}\n                onChange={(event) => update({ density: event.target.value })}\n              />\n            )}\n            {registry[kind].group === 'Charts' && ['area-chart-card', 'line-chart-card', 'combo-chart-card', 'earnings-chart-card', 'revenue-chart-card', 'orders-chart-card','funnel-chart-card'].includes(kind) && (\n              <Select label=\"Line shape\" size=\"sm\" value={config.shape}\n                options={[{ value: 'curved', label: 'Curved' }, { value: 'sharp', label: 'Sharp corners' }]}\n                onChange={(event) => update({ shape: event.target.value as Config['shape'] })} />\n            )}\n            {chartVariantOptions[kind] && (\n              <Select label=\"Chart variant\" size=\"sm\" value={config.variant}\n                options={chartVariantOptions[kind]}\n                onChange={(event) => update({ variant: event.target.value })} />\n            )}\n            {registry[kind].group==='Charts'&&<Checkbox label=\"Monochrome chart\" checked={config.mono} onChange={event=>update({mono:event.target.checked})}/>}\n            {kind==='bar-list-card'&&<Select label=\"Visible rows\" size=\"sm\" value={String(config.limit)} options={[3,4,6].map(value=>({value:String(value),label:String(value)}))} onChange={event=>update({limit:Number(event.target.value)})}/>}\n            {kind==='scatter-chart-card'&&<Checkbox label=\"Bubble sizes\" checked={config.bubble} onChange={event=>update({bubble:event.target.checked})}/>}\n            {kind === 'modals' && (\n              <Checkbox\n                label=\"Destructive action\"\n                checked={config.destructive}\n                onChange={(event) => update({ destructive: event.target.checked })}\n              />\n            )}\n            <Button variant=\"tertiary\" size=\"sm\" onClick={() => setConfig(defaults(kind))}>\n              Reset props\n            </Button>\n          </div>\n          {['buttons', 'inputs', 'select', 'checkboxes'].includes(kind) && (\n            <div className=\"hr-label-control\">\n              <Input\n                label=\"Label\"\n                size=\"sm\"\n                value={config.label}\n                onChange={(event) => update({ label: event.target.value })}\n              />\n              <Button\n                variant=\"secondary\"\n                size=\"sm\"\n                disabled={config.state === 'disabled' || config.state === 'loading'}\n                onClick={focusPreview}\n              >\n                Focus component\n              </Button>\n            </div>\n          )}\n          </section>\n          <section className=\"hr-section\" id=\"installation\">\n            <h2>Use in your React app</h2>\n            <p>\n              Download the local package, install its React peers, then import the export and\n              stylesheet. This package is not published to npm.\n            </p>\n            <pre tabIndex={0} role=\"region\" aria-label=\"Install React package\">\n              <code>npm install react@^19 react-dom@^19 ./helios-ui-react-0.1.0.tgz</code>\n            </pre>\n            <a className=\"hu-button hu-secondary\" href=\"/react/helios-ui-react-0.1.0.tgz\" download>\n              Download React package ↓\n            </a>\n            <a className=\"hu-button hu-tertiary\" href=\"/react/sources.json\" download>\n              Download all source (JSON) ↓\n            </a>\n            <p className=\"hr-note\">\n              The Code tab renders the same exports used in this preview. Source files include typed\n              props, behavior, styles, and dependency details.\n            </p>\n          </section>\n          <PrimitiveExamples kind={kind}/>\n          {title==='Table'&&<section className=\"hr-section\"><h2>Sizes</h2><p>The Density control switches the same table between comfortable and compact rows. Sorting, filtering, selection and keyboard access remain available in both presentations.</p><pre tabIndex={0}><code>{\"'use client';\\nimport {TableExample} from '@helios-ui/react';\\nimport '@helios-ui/react/styles.css';\\nexport default function Example(){return <TableExample density=\\\"compact\\\"/>;}\"}</code></pre></section>}\n          <section className=\"hr-section\" id=\"props\">\n            <h2>Props</h2>\n            <p className=\"hr-note\">Generated from the TypeScript export <code>{publicAPI?.exportName || spec.exportName}</code>. Configure this example with the preview controls above.</p>\n            <div className=\"hr-props-scroll\">\n              <table className=\"hr-props\">\n                <thead>\n                  <tr>\n                    <th scope=\"col\">Prop</th>\n                    <th scope=\"col\">Type / behavior</th>\n                  </tr>\n                </thead>\n                <tbody>\n                  {Object.entries(publicAPI?.props || {}).map(([name, type]) => (\n                    <tr key={name}>\n                      <th scope=\"row\">\n                        <code>{name}</code>\n                      </th>\n                      <td>{type}</td>\n                    </tr>\n                  ))}\n                </tbody>\n              </table>\n            </div>\n          </section>\n          <details className=\"hr-section hr-compositions\" id=\"compositions\">\n            <summary>Explore composed examples</summary>\n            <div className=\"hu-example-heading\">\n              <div>\n                <h2>Built from the same components</h2>\n                <p>\n                  Forms, tables, charts and composers share Button, Input, Select, Checkbox, Tabs\n                  and Dialog.\n                </p>\n              </div>\n              <Select\n                label=\"Composition state\"\n                value={compositionState}\n                options={['ready', 'loading', 'empty', 'error'].map((value) => ({\n                  value,\n                  label: value,\n                }))}\n                onChange={(event) => setCompositionState(event.target.value as ExampleState)}\n              />\n            </div>\n            <CompositionExample\n              state={compositionState}\n              onRetry={() => setCompositionState('ready')}\n            />\n          </details>\n          <section className=\"hr-section\" id=\"accessibility\">\n            <h2>Keyboard and motion</h2>\n            <p>\n              Tab reaches controls; Space and Enter activate buttons. Native Select supports\n              keyboard selection and mobile pickers. Tabs use arrows, Home and End. Dialog contains\n              focus, closes with Escape, and restores focus. Data tables expose sort and selection\n              state. Reduced motion removes spinners and chart transitions.\n            </p>\n            <p className=\"hr-note\">\n              Primary labels adapt to the chosen accent for contrast. This accessibility adjustment\n              differs from Figma’s white-on-cyan example. The Select example uses a React Aria\n              popover with rich option content and keyboard typeahead. Native Select remains\n              available for simple platform-picker integrations.\n            </p>\n          </section>\n        </div>\n        <aside className=\"hr-onpage\">\n          <strong>On this page</strong>\n          {[\n            ['preview', 'Playground'],\n            ['installation', 'Installation'],\n            ['props', 'Props'],\n            ['compositions', 'Composed examples'],\n            ['accessibility', 'Accessibility'],\n          ].map(([id, label]) => (\n            <a\n              key={id}\n              href={'#' + id}\n              onClick={(event) => {\n                event.preventDefault();\n                const target = document.getElementById(id === 'preview' ? 'hr-preview' : id);\n                if (target instanceof HTMLDetailsElement) target.open = true;\n                if (id === 'preview') setView('preview');\n                requestAnimationFrame(() => target?.scrollIntoView({\n                  behavior: matchMedia('(prefers-reduced-motion: reduce)').matches\n                    ? 'instant'\n                    : 'smooth',\n                }));\n              }}\n            >\n              {label}\n            </a>\n          ))}\n          <span className=\"hr-note\">Figma is read-only in this implementation.</span>\n        </aside>\n      </div>\n    </div>\n  );\n}\n\nconst aliases: Record<string, Kind> = {\n  button: 'buttons',\n  input: 'inputs',\n  select: 'select',\n  dialog: 'modals',\n  'data-table': 'tables',\n  table: 'tables',\n  checkbox: 'checkboxes',\n  tabs: 'tabs',\n  charts: 'charts',\n  'chat-composer': 'messaging',\n  'settings-form': 'settings-form',\n};\nfunction resolve(route: string): Kind | undefined {\n  const [, group, id] = route.split('/');\n  if (group === 'components') return aliases[id] || (Object.hasOwn(registry, id) ? id : undefined);\n  if (group === 'library' && Object.hasOwn(registry, id)) return id as Kind;\n}\nfunction mount(host: HTMLElement, kind: Kind) {\n  const root = createRoot(host);\n  root.render(<Playground kind={kind} />);\n  return () => root.unmount();\n}\nif (typeof window !== 'undefined')\n  (window as unknown as { HeliosReact: unknown }).HeliosReact = { resolve, mount, registry };\n",
  "src/PrimitiveExamples.tsx": "'use client';\nimport { UIIcon } from './icons.js';\n\nimport { useId, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { Button, Checkbox, Input, Select, Tabs } from './components.js';\nimport type { ButtonProps } from './components.js';\nimport { RichSelect } from './BoardExtras.js';\nimport { StatusDot } from './BaseFamilies.js';\n\nconst source = (imports: string, body: string, setup = '') =>\n  `'use client';\\nimport {useState} from 'react';\\nimport {${imports}} from '@helios-ui/react';\\nimport '@helios-ui/react/styles.css';\\n\\nexport default function Example(){\\n  ${setup}\\n  return (${body});\\n}\\n`;\nfunction ExampleBlock({\n  title,\n  description,\n  code,\n  children,\n}: {\n  title: string;\n  description: string;\n  code: string;\n  children: ReactNode;\n}) {\n  const id = useId(),\n    [view, setView] = useState('preview'),\n    [status, setStatus] = useState('');\n  return (\n    <section className=\"hp-example\" aria-labelledby={id}>\n      <h2 id={id}>{title}</h2>\n      <p>{description}</p>\n      <div className=\"hp-example-toolbar\">\n        <div className=\"hp-display-tabs\" role=\"tablist\" aria-label={title + ' display'}>\n          {['preview', 'code'].map((value) => (\n            <button\n              key={value}\n              type=\"button\"\n              role=\"tab\"\n              id={id + '-' + value + '-tab'}\n              aria-controls={id + '-' + value}\n              aria-selected={view === value}\n              tabIndex={view === value ? 0 : -1}\n              onClick={() => setView(value)}\n              onKeyDown={(event) => {\n                if (['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key)) {\n                  event.preventDefault();\n                  const next =\n                    event.key === 'Home'\n                      ? 'preview'\n                      : event.key === 'End'\n                        ? 'code'\n                        : value === 'preview'\n                          ? 'code'\n                          : 'preview';\n                  setView(next);\n                  document.getElementById(id + '-' + next + '-tab')?.focus();\n                }\n              }}\n            >\n              {value === 'preview' ? 'Preview' : 'Code'}\n            </button>\n          ))}\n        </div>\n        <Button\n          size=\"sm\"\n          variant=\"tertiary\"\n          onClick={async () => {\n            try {\n              await navigator.clipboard.writeText(code);\n              setStatus('Complete example copied.');\n            } catch {\n              setView('code');\n              setStatus('Clipboard unavailable. Select the source below.');\n            }\n          }}\n        >\n          Copy example\n        </Button>\n      </div>\n      <div\n        className=\"hp-example-preview\"\n        id={id + '-preview'}\n        role=\"tabpanel\"\n        aria-labelledby={id + '-preview-tab'}\n        tabIndex={0}\n        hidden={view !== 'preview'}\n      >\n        {children}\n      </div>\n      <pre\n        className=\"hp-example-code\"\n        id={id + '-code'}\n        role=\"tabpanel\"\n        aria-labelledby={id + '-code-tab'}\n        tabIndex={0}\n        hidden={view !== 'code'}\n        aria-label={title + ' complete React source'}\n      >\n        <code>{code}</code>\n      </pre>\n      <p className=\"hp-example-status\" role=\"status\">\n        {status}\n      </p>\n    </section>\n  );\n}\nfunction VariantButtons() {\n  const [status, setStatus] = useState('');\n  return (\n    <>\n      <div className=\"hp-example-row\">\n        {(['primary', 'secondary', 'ghost', 'danger'] as const).map((variant) => (\n          <Button\n            key={variant}\n            variant={variant}\n            onClick={() => setStatus(variant + ' action handled locally.')}\n          >\n            Button text\n          </Button>\n        ))}\n      </div>\n      <p role=\"status\">{status}</p>\n    </>\n  );\n}\nfunction SizeButtons() {\n  const [status, setStatus] = useState('');\n  return (\n    <>\n      <div className=\"hp-example-row\">\n        {(['xs', 'sm', 'md', 'lg', 'xl'] as const).map((size) => (\n          <Button\n            key={size}\n            size={size}\n            onClick={() => setStatus(size + ' action handled locally.')}\n          >\n            {size.toUpperCase()}\n          </Button>\n        ))}\n      </div>\n      <p role=\"status\">{status}</p>\n    </>\n  );\n}\nfunction IconButtons() {\n  const [status, setStatus] = useState('');\n  return (\n    <>\n      <div className=\"hp-example-row\">\n        <Button\n          leadingIcon={<span aria-hidden=\"true\"><UIIcon name=\"plus\" /></span>}\n          onClick={() => setStatus('New project selected.')}\n        >\n          New project\n        </Button>\n        <Button\n          variant=\"secondary\"\n          trailingIcon={<span aria-hidden=\"true\"><UIIcon name=\"arrow-right\" /></span>}\n          onClick={() => setStatus('Continue selected.')}\n        >\n          Continue\n        </Button>\n        <Button\n          iconOnly\n          aria-label=\"Add project\"\n          leadingIcon={<span aria-hidden=\"true\"><UIIcon name=\"plus\" /></span>}\n          onClick={() => setStatus('Add project selected.')}\n        />\n      </div>\n      <p role=\"status\">{status}</p>\n    </>\n  );\n}\nconst demoTabs = [\n  {\n    id: 'banners',\n    label: 'Banners',\n    icon: '▣',\n    count: 152,\n    content: '152 example banners are available in this local workspace.',\n  },\n  {\n    id: 'posts',\n    label: 'Posts',\n    icon: '▤',\n    count: 32,\n    content: '32 example posts are ready to review.',\n  },\n  {\n    id: 'codes',\n    label: 'QR codes',\n    icon: '▦',\n    count: 14,\n    content: '14 example QR codes are available.',\n  },\n  { id: 'members', label: 'Members', content: 'Manage the members of this sample workspace.' },\n  { id: 'settings', label: 'Settings', content: 'Adjust this local example’s settings.' },\n];\nexport function PrimitiveExamples({ kind }: { kind: string }) {\n  const [checked, setChecked] = useState(false),\n    [country, setCountry] = useState('IN'),\n    [phone, setPhone] = useState(''),\n    [purchase, setPurchase] = useState('completed');\n  const variants: NonNullable<ButtonProps['variant']>[] = [\n    'primary',\n    'secondary',\n    'ghost',\n    'danger',\n  ];\n  if (kind === 'buttons')\n    return (\n      <div className=\"hp-examples\" role=\"group\" aria-label=\"Button reference examples\">\n        <ExampleBlock\n          title=\"Variants\"\n          description=\"Primary, bordered, soft accent and destructive actions share the same component and focus behavior.\"\n          code={source(\n            'Button',\n            `<><div style={{display:'flex',gap:12,flexWrap:'wrap'}}>{(['primary','secondary','ghost','danger'] as const).map(variant=><Button key={variant} variant={variant} onClick={()=>setStatus(variant+' action handled locally.')}>Button text</Button>)}</div><p role=\"status\">{status}</p></>`,\n            \"const [status,setStatus]=useState('');\",\n          )}\n        >\n          <VariantButtons />\n        </ExampleBlock>\n        <ExampleBlock\n          title=\"Sizes\"\n          description=\"Five Helios sizes retain the recorded design-system geometry. Icon actions remain square at every size.\"\n          code={source(\n            'Button',\n            `<div style={{display:'flex',alignItems:'center',gap:12,flexWrap:'wrap'}}>{(['xs','sm','md','lg','xl'] as const).map(size=><Button size={size} key={size} onClick={()=>setStatus(size+' action handled locally.')}>{size.toUpperCase()}</Button>)}<p role=\"status\">{status}</p></div>`,\n            \"const [status,setStatus]=useState('');\",\n          )}\n        >\n          <SizeButtons />\n        </ExampleBlock>\n        <ExampleBlock\n          title=\"Icons\"\n          description=\"Use leading and trailing React nodes, or an icon-only action with an accessible label.\"\n          code={source(\n            'Button, UIIcon',\n            `<><Button leadingIcon={<UIIcon name=\"plus\" />} onClick={()=>setStatus('New project selected.')}>New project</Button><Button variant=\"secondary\" trailingIcon={<UIIcon name=\"arrow-right\" />} onClick={()=>setStatus('Continue selected.')}>Continue</Button><Button iconOnly aria-label=\"Add project\" leadingIcon={<UIIcon name=\"plus\" />} onClick={()=>setStatus('Add project selected.')}/><p role=\"status\">{status}</p></>`,\n            \"const [status,setStatus]=useState('');\",\n          )}\n        >\n          <IconButtons />\n        </ExampleBlock>\n        <ExampleBlock\n          title=\"Disabled and loading\"\n          description=\"Disabled actions cannot activate. Loading replaces the leading icon and exposes its busy state.\"\n          code={source(\n            'Button',\n            `<div>{(['primary','secondary','ghost','danger'] as const).map(variant=><Button key={variant} variant={variant} disabled>Unavailable</Button>)}<Button loading>Saving changes</Button></div>`,\n          )}\n        >\n          <div className=\"hp-example-row\">\n            {variants.map((variant) => (\n              <Button variant={variant} key={variant} disabled>\n                Unavailable\n              </Button>\n            ))}\n            <Button loading>Saving changes</Button>\n          </div>\n        </ExampleBlock>\n      </div>\n    );\n  if (kind === 'inputs')\n    return (\n      <div className=\"hp-examples\" role=\"group\" aria-label=\"Input reference examples\">\n        <ExampleBlock\n          title=\"Sizes\"\n          description=\"Labeled fields with consistent hint spacing in each Helios size.\"\n          code={source(\n            'Input',\n            `<div>{(['sm','md','lg'] as const).map(size=><Input key={size} label={'Email '+size} size={size} type=\"email\" placeholder=\"you@example.com\" hint=\"Your email stays in this local example.\"/>)}</div>`,\n          )}\n        >\n          <div className=\"hp-example-stack\">\n            {(['sm', 'md', 'lg'] as const).map((size) => (\n              <Input\n                key={size}\n                label={'Email ' + size}\n                size={size}\n                type=\"email\"\n                placeholder=\"you@example.com\"\n                hint=\"Your email stays in this local example.\"\n              />\n            ))}\n          </div>\n        </ExampleBlock>\n        <ExampleBlock\n          title=\"States\"\n          description=\"Empty, populated, disabled and invalid fields expose their state through native semantics.\"\n          code={source(\n            'Input',\n            `<div><Input label=\"Empty email\" type=\"email\" placeholder=\"you@example.com\" hint=\"Use your work email.\"/><Input label=\"Populated email\" type=\"email\" defaultValue=\"hello@example.com\"/><Input label=\"Disabled email\" type=\"email\" disabled placeholder=\"you@example.com\"/><Input label=\"Invalid email\" type=\"email\" defaultValue=\"not-an-email\" error=\"Enter a valid email address.\" required/></div>`,\n          )}\n        >\n          <div className=\"hp-example-grid\">\n            <Input\n              label=\"Empty email\"\n              type=\"email\"\n              placeholder=\"you@example.com\"\n              hint=\"Use your work email.\"\n            />\n            <Input label=\"Populated email\" type=\"email\" defaultValue=\"hello@example.com\" />\n            <Input label=\"Disabled email\" type=\"email\" disabled placeholder=\"you@example.com\" />\n            <Input\n              label=\"Invalid email\"\n              type=\"email\"\n              defaultValue=\"not-an-email\"\n              error=\"Enter a valid email address.\"\n              required\n            />\n          </div>\n        </ExampleBlock>\n        <ExampleBlock\n          title=\"Phone number\"\n          description=\"A country picker and telephone field compose a local input. The country code changes without submitting data.\"\n          code={source(\n            'Input,Select',\n            `<><Select label=\"Country calling code\" value={country} onChange={event=>setCountry(event.target.value)} options={[{value:'IN',label:'India +91'},{value:'US',label:'United States +1'},{value:'GB',label:'United Kingdom +44'}]}/><Input label=\"Phone number\" type=\"tel\" autoComplete=\"tel-national\" value={phone} onChange={event=>setPhone(event.target.value)} placeholder={country==='IN'?'98765 43210':'Phone number'}/></>`,\n            \"const [country,setCountry]=useState('IN'),[phone,setPhone]=useState('');\",\n          )}\n        >\n          <div className=\"hp-example-phone\">\n            <Select\n              label=\"Country calling code\"\n              value={country}\n              onChange={(event) => setCountry(event.target.value)}\n              options={[\n                { value: 'IN', label: 'India +91' },\n                { value: 'US', label: 'United States +1' },\n                { value: 'GB', label: 'United Kingdom +44' },\n              ]}\n            />\n            <Input\n              label=\"Phone number\"\n              type=\"tel\"\n              autoComplete=\"tel-national\"\n              value={phone}\n              onChange={(event) => setPhone(event.target.value)}\n              placeholder={country === 'IN' ? '98765 43210' : 'Phone number'}\n            />\n          </div>\n        </ExampleBlock>\n      </div>\n    );\n  if (kind === 'checkboxes')\n    return (\n      <div className=\"hp-examples\" role=\"group\" aria-label=\"Checkbox reference examples\">\n        <ExampleBlock\n          title=\"Sizes\"\n          description=\"Native checkbox semantics with an animated check and a visible focus ring.\"\n          code={source(\n            'Checkbox',\n            `<><Checkbox label=\"Medium checkbox\" size=\"md\" defaultChecked/><Checkbox label=\"Small checkbox\" size=\"sm\" defaultChecked/></>`,\n          )}\n        >\n          <div className=\"hp-example-row\">\n            <Checkbox label=\"Medium checkbox\" size=\"md\" defaultChecked />\n            <Checkbox label=\"Small checkbox\" size=\"sm\" defaultChecked />\n          </div>\n        </ExampleBlock>\n        <ExampleBlock\n          title=\"Labels & control\"\n          description=\"Clicking the label changes the value. Controlled, mixed and disabled states use the same export.\"\n          code={source(\n            'Checkbox',\n            `<><Checkbox label=\"Remember me\" defaultChecked/><Checkbox label=\"Send product updates\" checked={checked} onChange={event=>setChecked(event.target.checked)}/><Checkbox label=\"Partially selected\" indeterminate/><Checkbox label=\"Disabled selection\" defaultChecked disabled/></>`,\n            'const [checked,setChecked]=useState(false);',\n          )}\n        >\n          <div className=\"hp-example-stack\">\n            <Checkbox label=\"Remember me\" defaultChecked />\n            <Checkbox\n              label=\"Send product updates\"\n              checked={checked}\n              onChange={(event) => setChecked(event.target.checked)}\n            />\n            <Checkbox label=\"Partially selected\" indeterminate />\n            <Checkbox label=\"Disabled selection\" defaultChecked disabled />\n          </div>\n        </ExampleBlock>\n        <ExampleBlock\n          title=\"Card\"\n          description=\"The entire bordered card toggles its checkbox. A description remains associated with the control.\"\n          code={source(\n            'Checkbox',\n            `<div><Checkbox card label=\"Product updates\" hint=\"Receive new component announcements.\"/><Checkbox card label=\"Team activity\" hint=\"Keep up with changes to your workspace.\" defaultChecked/><Checkbox card label=\"No description\"/></div>`,\n          )}\n        >\n          <div className=\"hp-example-stack\">\n            <Checkbox card label=\"Product updates\" hint=\"Receive new component announcements.\" />\n            <Checkbox\n              card\n              label=\"Team activity\"\n              hint=\"Keep up with changes to your workspace.\"\n              defaultChecked\n            />\n            <Checkbox card label=\"No description\" />\n          </div>\n        </ExampleBlock>\n      </div>\n    );\n  if (kind === 'select')\n    return (\n      <div className=\"hp-examples\">\n        <ExampleBlock\n          title=\"With status dot\"\n          description=\"Rich options support a colored status marker and keyboard typeahead. The selected option updates the trigger.\"\n          code={source(\n            'RichSelect,StatusDot',\n            `<RichSelect label=\"Purchase status\" value={purchase} onValueChange={setPurchase} options={[{value:'completed',label:'Completed',icon:<StatusDot color=\"green\"/>},{value:'waiting',label:'Waiting',icon:<StatusDot color=\"yellow\"/>},{value:'processing',label:'Processing',icon:<StatusDot color=\"indigo\"/>}]}/>`,\n            \"const [purchase,setPurchase]=useState('completed');\",\n          )}\n        >\n          <RichSelect\n            label=\"Purchase status\"\n            value={purchase}\n            onValueChange={setPurchase}\n            options={[\n              { value: 'completed', label: 'Completed', icon: <StatusDot color=\"green\" /> },\n              { value: 'waiting', label: 'Waiting', icon: <StatusDot color=\"yellow\" /> },\n              { value: 'processing', label: 'Processing', icon: <StatusDot color=\"indigo\" /> },\n            ]}\n          />\n        </ExampleBlock>\n      </div>\n    );\n  if (kind === 'tabs')\n    return (\n      <div className=\"hp-examples\">\n        <ExampleBlock\n          title=\"Icons & counts\"\n          description=\"Underline tabs connect each control with its own panel. Arrows, Home and End move selection and focus.\"\n          code={source(\n            'Tabs',\n            `<Tabs label=\"Workspace content\" items={${JSON.stringify(demoTabs)}}/>`,\n          )}\n        >\n          <Tabs label=\"Workspace content\" items={demoTabs} />\n        </ExampleBlock>\n        <ExampleBlock\n          title=\"Pill tabs\"\n          description=\"Rounded blue-accent and gray treatments support local view switching with the same keyboard behavior.\"\n          code={source(\n            'Tabs',\n            `<><Tabs label=\"Agent view\" variant=\"pill\" items={[{id:'changes',label:'Changes',content:'Review the local change list.'},{id:'browser',label:'Browser',content:'Preview this sample browser view.'}]}/><Tabs label=\"Source scope\" variant=\"gray\" items={[{id:'home',label:'Home',content:'Home source selected.'},{id:'local',label:'Local',content:'Local source selected.'},{id:'cloud',label:'Cloud',content:'Cloud example selected; no external service is connected.'}]}/></>`,\n          )}\n        >\n          <div className=\"hp-example-stack\">\n            <Tabs\n              label=\"Agent view\"\n              variant=\"pill\"\n              items={[\n                { id: 'changes', label: 'Changes', content: 'Review the local change list.' },\n                { id: 'browser', label: 'Browser', content: 'Preview this sample browser view.' },\n              ]}\n            />\n            <Tabs\n              label=\"Source scope\"\n              variant=\"gray\"\n              items={[\n                { id: 'home', label: 'Home', content: 'Home source selected.' },\n                { id: 'local', label: 'Local', content: 'Local source selected.' },\n                {\n                  id: 'cloud',\n                  label: 'Cloud',\n                  content: 'Cloud example selected; no external service is connected.',\n                },\n              ]}\n            />\n          </div>\n        </ExampleBlock>\n      </div>\n    );\n  return null;\n}\n",
  "src/Templates.tsx": "'use client';\nimport { UIIcon, type UIIconName } from './icons.js';\n\nimport { useEffect, useId, useMemo, useRef, useState } from 'react';\nimport type { CSSProperties, FormEvent, ReactNode } from 'react';\nimport {\n  Area,\n  AreaChart,\n  CartesianGrid,\n  ResponsiveContainer,\n  Tooltip,\n  XAxis,\n  YAxis,\n} from 'recharts';\nimport { motion } from 'motion/react';\nimport { useMotionPreference as useReducedMotion } from './useMotionPreference.js';\nimport { Button, Checkbox, DataState, Dialog, Input, Select, Tabs } from './components.js';\nimport { DataTable } from './DataTable.js';\nimport { TextEditor } from './BaseFamilies.js';\nimport type { Column } from './DataTable.js';\nimport type { FamilyState } from './family-types.js';\n\nimport { templateDefinitions } from './template-definitions.js';\nexport { templateDefinitions } from './template-definitions.js';\n\nexport type TemplateProps = {\n  assetsBase?: string;\n  state?: FamilyState;\n  onRetry?: () => void;\n  onNavigate?: (index: number) => void;\n  preview?: boolean;\n};\nexport type TemplatePreviewProps = TemplateProps & { index?: number };\nconst asset = (base: string, name: string) => `${base.replace(/\\/$/, '')}/${name}`;\nconst money = (value: number, decimals = 2) =>\n  new Intl.NumberFormat('en-IN', {\n    style: 'currency',\n    currency: 'INR',\n    minimumFractionDigits: decimals,\n    maximumFractionDigits: decimals,\n  }).format(value);\nconst people = [\n  'Aarav Shah',\n  'Diya Rao',\n  'Ishaan Patel',\n  'Kavya Nair',\n  'Rohan Mehta',\n  'Sana Ali',\n  'Vihaan Das',\n  'Anaya Iyer',\n  'Arjun Sen',\n  'Mira Jain',\n];\nconst emails = people.map((name) => name.toLowerCase().replaceAll(' ', '.') + '@example.com');\nfunction Icon({ name }: { name: string }) {\n  return <UIIcon name={name as UIIconName} className=\"hx-icon\" />;\n}\nfunction Photo({\n  index = 0,\n  assetsBase,\n  size = '',\n  src,\n  alt,\n}: {\n  index?: number;\n  assetsBase: string;\n  size?: string;\n  src?: string;\n  alt?: string;\n}) {\n  return (\n    <img\n      className={`hx-avatar ${size}`}\n      src={\n        src ||\n        asset(\n          assetsBase,\n          index === 0\n            ? '334-517-SizeMdBorderFalse.png'\n            : `322-236-Avatar${index === 1 ? '' : index - 1}.png`,\n        )\n      }\n      alt={alt || people[index % people.length]}\n    />\n  );\n}\nfunction HXButton({\n  children,\n  onClick,\n  primary = false,\n  disabled,\n  type = 'button',\n  label,\n}: {\n  children: ReactNode;\n  onClick?: () => void;\n  primary?: boolean;\n  disabled?: boolean;\n  type?: 'button' | 'submit' | 'reset';\n  label?: string;\n}) {\n  return (\n    <Button\n      type={type}\n      variant={primary ? 'primary' : 'secondary'}\n      className={`hx-button ${primary ? 'primary' : ''}`}\n      size=\"sm\"\n      onClick={onClick}\n      disabled={disabled}\n      aria-label={label}\n    >\n      {children}\n    </Button>\n  );\n}\nfunction download(filename: string, columns: string[], rows: (string | number)[][]) {\n  const cell = (value: string | number) =>\n    '\"' +\n    String(value)\n      .replace(/^[\\s]*[=+@-]|^[\\t\\r]/, \"'$&\")\n      .replaceAll('\"', '\"\"') +\n    '\"';\n  const url = URL.createObjectURL(\n    new Blob([[columns, ...rows].map((row) => row.map(cell).join(',')).join('\\r\\n')], {\n      type: 'text/csv;charset=utf-8',\n    }),\n  );\n  const link = document.createElement('a');\n  link.href = url;\n  link.download = filename;\n  link.click();\n  setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\nfunction Periods({\n  value,\n  onChange,\n  label = 'Date range',\n}: {\n  value: number;\n  onChange: (value: number) => void;\n  label?: string;\n}) {\n  return (\n    <div className=\"hx-periods\" role=\"group\" aria-label={label}>\n      {['12 months', '30 days', '7 days', '24 hours'].map((period, index) => (\n        <button\n          type=\"button\"\n          key={period}\n          aria-pressed={value === index}\n          onClick={() => onChange(index)}\n        >\n          {period}\n        </button>\n      ))}\n    </div>\n  );\n}\nfunction Metric({ label, value, trend }: { label: string; value: string; trend?: string }) {\n  return (\n    <div className=\"hx-metric\">\n      <span>{label}</span>\n      <div>\n        <strong>{value}</strong>\n        {trend && <small><UIIcon name=\"arrow-up-right\" />{trend}</small>}\n      </div>\n    </div>\n  );\n}\n\nexport type TemplateChartPoint = { label: string; value: number; previous: number };\nconst monthlyPoints: TemplateChartPoint[] = [\n  980, 1120, 1080, 1360, 1490, 1540, 1580, 1760, 1850, 1940, 2070, 2114,\n].map((value, index) => ({\n  label: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][\n    index\n  ],\n  value,\n  previous: Math.round(value * (0.8 + (index % 3) * 0.03)),\n}));\nfunction periodData(period: number) {\n  return period === 0\n    ? monthlyPoints\n    : period === 1\n      ? monthlyPoints.slice(-6).map((point, index) => ({ ...point, label: `${2 + index * 5} Jan` }))\n      : period === 2\n        ? monthlyPoints.slice(-7).map((point, index) => ({ ...point, label: `${8 + index} Jan` }))\n        : monthlyPoints\n            .slice(-6)\n            .map((point, index) => ({ ...point, label: `${8 + index * 2}:00` }));\n}\nfunction rangeData(start: string, end: string): TemplateChartPoint[] {\n  const begin = new Date(start + 'T00:00:00Z'),\n    finish = new Date(end + 'T00:00:00Z'),\n    days = Math.max(1, Math.round((finish.getTime() - begin.getTime()) / 86400000) + 1),\n    count = Math.min(12, days);\n  return Array.from({ length: count }, (_, index) => {\n    const d = new Date(\n      begin.getTime() + Math.round((index * (days - 1)) / Math.max(1, count - 1)) * 86400000,\n    );\n    const point = monthlyPoints[index % monthlyPoints.length];\n    return {\n      ...point,\n      label: d.toLocaleDateString('en-IN', { day: 'numeric', month: 'short', timeZone: 'UTC' }),\n    };\n  });\n}\nexport function TemplateRevenueChart({\n  data,\n  comparison = false,\n  label = 'Illustrative revenue in INR',\n}: {\n  data: TemplateChartPoint[];\n  comparison?: boolean;\n  label?: string;\n}) {\n  const reduce = useReducedMotion(),\n    uid = useId().replaceAll(':', ''),\n    [inspect, setInspect] = useState(0),\n    [show, setShow] = useState(true);\n  const point = data[Math.min(inspect, data.length - 1)];\n  return (\n    <section className=\"hxr-chart\" aria-label={label}>\n      <div\n        className=\"hxr-chart-plot\"\n        role=\"img\"\n        aria-label={`${label}. ${data.map((point) => `${point.label}: ${money(point.value)}`).join('; ')}`}\n      >\n        <ResponsiveContainer width=\"100%\" height=\"100%\" minWidth={0}>\n          <AreaChart data={data} margin={{ top: 12, right: 8, bottom: 0, left: 4 }}>\n            <defs>\n              <linearGradient id={`hxr-${uid}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n                <stop stopColor=\"var(--color-chart-1,#00bba7)\" stopOpacity={0.16} />\n                <stop offset=\"1\" stopColor=\"var(--color-chart-1,#00bba7)\" stopOpacity={0} />\n              </linearGradient>\n            </defs>\n            <CartesianGrid vertical={false} stroke=\"var(--hx-line,#e5e5e5)\" />\n            <XAxis\n              dataKey=\"label\"\n              tickLine={false}\n              axisLine={false}\n              tick={{ fontSize: 10, fill: 'var(--hx-muted,#525252)' }}\n              minTickGap={12}\n            />\n            <YAxis hide domain={[0, 'auto']} />\n            <Tooltip\n              formatter={(value) => money(Number(value))}\n              contentStyle={{\n                background: 'var(--hx-surface,#fff)',\n                borderColor: 'var(--hx-line,#e5e5e5)',\n                borderRadius: 8,\n                fontSize: 12,\n                color: 'var(--hx-text,#171717)',\n              }}\n            />\n            {comparison && show && (\n              <Area\n                type=\"monotone\"\n                dataKey=\"previous\"\n                name=\"Previous period\"\n                stroke=\"var(--color-chart-6,#3392ff)\"\n                fill=\"transparent\"\n                strokeWidth={2}\n                isAnimationActive={reduce === false}\n              />\n            )}\n            {show && (\n              <Area\n                type=\"monotone\"\n                dataKey=\"value\"\n                name=\"Revenue\"\n                stroke=\"var(--color-chart-1,#00bba7)\"\n                fill={`url(#hxr-${uid})`}\n                strokeWidth={2}\n                isAnimationActive={reduce === false}\n              />\n            )}\n          </AreaChart>\n        </ResponsiveContainer>\n      </div>\n      <div className=\"hxr-chart-controls\">\n        <Checkbox\n          label=\"Show revenue\"\n          checked={show}\n          onChange={(event) => setShow(event.target.checked)}\n          size=\"sm\"\n        />\n        <Select\n          label=\"Inspect data point\"\n          size=\"sm\"\n          value={String(Math.min(inspect, data.length - 1))}\n          options={data.map((point, index) => ({ value: String(index), label: point.label }))}\n          onChange={(event) => setInspect(Number(event.target.value))}\n        />\n        <p role=\"status\">{point ? `${point.label}: ${money(point.value)}` : 'No data'}</p>\n      </div>\n      <details className=\"hxr-chart-data\">\n        <summary>View chart data</summary>\n        <div className=\"hxr-table-scroll\" tabIndex={0}>\n          <table>\n            <caption>{label}</caption>\n            <thead>\n              <tr>\n                <th scope=\"col\">Period</th>\n                <th scope=\"col\">Revenue</th>\n                {comparison && <th scope=\"col\">Previous period</th>}\n              </tr>\n            </thead>\n            <tbody>\n              {data.map((point) => (\n                <tr key={point.label}>\n                  <th scope=\"row\">{point.label}</th>\n                  <td>{money(point.value)}</td>\n                  {comparison && <td>{money(point.previous)}</td>}\n                </tr>\n              ))}\n            </tbody>\n          </table>\n        </div>\n      </details>\n    </section>\n  );\n}\n\nfunction TemplateFrame({\n  index,\n  assetsBase,\n  preview,\n  navigate,\n  children,\n}: {\n  index: number;\n  assetsBase: string;\n  preview: boolean;\n  navigate: (index: number) => void;\n  children: ReactNode;\n}) {\n  const definition = templateDefinitions[index],\n    top = [1, 4, 5].includes(index),\n    [query, setQuery] = useState(''),\n    [feature, setFeature] = useState(true),\n    [video, setVideo] = useState(false);\n  const navigation = [\n    ['home', 'Home', 0],\n    ['chart', 'Dashboard', 1],\n    ['layers', 'Projects', 2],\n    ['check', 'Tasks', 2],\n    ['pie', 'Reporting', 1],\n    ['users', 'Users', 3],\n  ] as const;\n  const active = index < 2 ? 'Dashboard' : index === 2 || index === 4 ? 'Projects' : 'Users';\n  const nav = (\n    <nav aria-label={top ? 'Application preview navigation' : 'Application example navigation'}>\n      {navigation\n        .filter(([, label]) => label.toLowerCase().includes(query.toLowerCase()))\n        .map(([icon, label, target]) => (\n          <button\n            type=\"button\"\n            key={label}\n            aria-current={active === label ? 'page' : undefined}\n            onClick={() => navigate(target)}\n          >\n            <Icon name={icon} />\n            {label}\n            {label === 'Tasks' && <small>8</small>}\n          </button>\n        ))}\n    </nav>\n  );\n  return (\n    <div\n      className={`hx-root hxr-root ${top ? 'hx-top-navigation' : ''} ${preview ? 'hx-preview' : ''}`}\n      data-example={index}\n    >\n      {!preview && (\n        <div className=\"hx-example-bar\">\n          <a href=\"#/\">\n            <Icon name=\"arrow-left\" /> Helios UI\n          </a>\n          <Select\n            label=\"Application example\"\n            size=\"sm\"\n            value={String(index)}\n            options={templateDefinitions.map((item, index) => ({\n              value: String(index),\n              label: `${item.name} · ${item.title}`,\n            }))}\n            onChange={(event) => navigate(Number(event.target.value))}\n          />\n          <a\n            href={`https://www.figma.com/design/D8Eh9V5qa4zDhll8RimlU6?node-id=${definition.node}`}\n            target=\"_blank\"\n            rel=\"noreferrer\"\n          >\n            Figma source <Icon name=\"external\" />\n          </a>\n        </div>\n      )}\n      {top ? (\n        <header className=\"hx-header\">\n          <a className=\"hx-brand\" href=\"#/\">\n            Helios\n          </a>\n          {nav}\n          <a href=\"#/\">Back to website</a>\n          <HXButton onClick={() => navigate(3)} label=\"Open settings\">\n            <Icon name=\"settings\" />\n          </HXButton>\n          <Photo assetsBase={assetsBase} />\n        </header>\n      ) : (\n        <aside className=\"hx-sidebar\">\n          <a className=\"hx-brand\" href=\"#/\">\n            Helios\n          </a>\n          <label className=\"hx-side-search\">\n            <Icon name=\"search\" />\n            <input\n              type=\"search\"\n              value={query}\n              onChange={(event) => setQuery(event.target.value)}\n              placeholder=\"Search\"\n              aria-label=\"Search example navigation\"\n            />\n            <kbd>⌘ K</kbd>\n          </label>\n          {nav}\n          {query &&\n            !navigation.some(([, label]) => label.toLowerCase().includes(query.toLowerCase())) && (\n              <p className=\"hxr-note\" role=\"status\">\n                No navigation matches.\n              </p>\n            )}\n          <div className=\"hx-sidebar-bottom\">\n            <a href=\"#/docs\">\n              <Icon name=\"help\" />\n              Support\n            </a>\n            <button type=\"button\" onClick={() => navigate(3)}>\n              <Icon name=\"settings\" />\n              Settings\n            </button>\n            <a className=\"hx-back\" href=\"#/\"><UIIcon name=\"arrow-left\" /> Back to Helios UI</a>\n            {index === 0 && feature && (\n              <div className=\"hx-sidebar-feature\">\n                <button\n                  type=\"button\"\n                  className=\"hx-feature-close\"\n                  onClick={() => setFeature(false)}\n                  aria-label=\"Dismiss featured update\"\n                ><UIIcon name=\"close\" /></button>\n                <strong>New features available!</strong>\n                <p>Explore the business overview and reusable React components.</p>\n                <button type=\"button\" className=\"hx-feature-preview\" onClick={() => setVideo(true)}>\n                  <img\n                    src={asset(assetsBase, '322-236-VideoPreview.png')}\n                    alt=\"Dashboard update video preview\"\n                  />\n                  <span aria-hidden=\"true\"><UIIcon name=\"play\" /></span>\n                </button>\n                <div>\n                  <button type=\"button\" onClick={() => setFeature(false)}>\n                    Dismiss\n                  </button>\n                  <button type=\"button\" onClick={() => navigate(1)}>\n                    What’s new?\n                  </button>\n                </div>\n              </div>\n            )}\n            <div className=\"hx-user\">\n              <Photo assetsBase={assetsBase} />\n              <span>\n                <strong>{people[0]}</strong>\n                <small>{emails[0]}</small>\n              </span>\n            </div>\n          </div>\n        </aside>\n      )}\n      <main className=\"hx-main\">{children}</main>\n      <Dialog\n        open={video}\n        onOpenChange={setVideo}\n        title=\"Helios motion study\"\n        description=\"A local motion demonstration, with native playback controls.\"\n        footer={\n          <Button variant=\"secondary\" onClick={() => setVideo(false)}>\n            Close\n          </Button>\n        }\n      >\n        <video\n          className=\"hxr-video\"\n          src={asset(assetsBase, 'helios-demo.webm')}\n          controls\n          playsInline\n        />\n      </Dialog>\n    </div>\n  );\n}\n\nfunction DateRange({\n  start,\n  end,\n  onChange,\n}: {\n  start: string;\n  end: string;\n  onChange: (start: string, end: string) => void;\n}) {\n  const formId = useId();\n  const [open, setOpen] = useState(false),\n    [draftStart, setDraftStart] = useState(start),\n    [draftEnd, setDraftEnd] = useState(end),\n    [error, setError] = useState('');\n  return (\n    <>\n      <HXButton\n        onClick={() => {\n          setDraftStart(start);\n          setDraftEnd(end);\n          setError('');\n          setOpen(true);\n        }}\n      >\n        <Icon name=\"calendar\" />\n        {start} – {end}\n      </HXButton>\n      <Dialog\n        open={open}\n        onOpenChange={setOpen}\n        title=\"Select date range\"\n        description=\"This range updates the local example data.\"\n        footer={\n          <>\n            <Button variant=\"secondary\" onClick={() => setOpen(false)}>\n              Cancel\n            </Button>\n            <Button type=\"submit\" form={formId}>\n              Apply range\n            </Button>\n          </>\n        }\n      >\n        <form\n          id={formId}\n          className=\"hxr-dialog-form\"\n          onSubmit={(event) => {\n            event.preventDefault();\n            if (!draftStart || !draftEnd || draftEnd < draftStart) {\n              setError('End date must be on or after the start date.');\n              return;\n            }\n            onChange(draftStart, draftEnd);\n            setOpen(false);\n          }}\n        >\n          <Input\n            label=\"Start date\"\n            type=\"date\"\n            required\n            value={draftStart}\n            onChange={(event) => setDraftStart(event.target.value)}\n          />\n          <Input\n            label=\"End date\"\n            type=\"date\"\n            required\n            value={draftEnd}\n            min={draftStart}\n            error={error || undefined}\n            onChange={(event) => setDraftEnd(event.target.value)}\n          />\n        </form>\n      </Dialog>\n    </>\n  );\n}\n\nfunction MembershipContent({ assetsBase }: { assetsBase: string }) {\n  const formId = useId();\n  const [customRange, setCustomRange] = useState<TemplateChartPoint[] | null>(null);\n  const [period, setPeriod] = useState(0),\n    [start, setStart] = useState('2027-01-08'),\n    [end, setEnd] = useState('2027-01-14'),\n    [filter, setFilter] = useState('all'),\n    [filterOpen, setFilterOpen] = useState(false),\n    [dialog, setDialog] = useState<'member' | 'post' | 'read' | 'menu' | null>(null),\n    [notice, setNotice] = useState('');\n  const [members, setMembers] = useState(\n    people.map((name, index) => ({\n      name,\n      email: emails[index],\n      paid: index % 3 !== 0,\n      active: index !== 8,\n    })),\n  );\n  const [posts, setPosts] = useState([\n    {\n      title: 'UX review presentations',\n      text: 'How do you create compelling presentations that help your team make clearer decisions?',\n      author: people[0],\n      image: '322-236-EditorialLandscape1.svg',\n    },\n    {\n      title: 'Migrating to Linear 101',\n      text: 'A practical guide to software projects, sprints, tasks, and issue tracking.',\n      author: people[1],\n      image: '322-236-EditorialLandscape2.svg',\n    },\n  ]);\n  const [currentPost, setCurrentPost] = useState(0),\n    [draftName, setDraftName] = useState(''),\n    [draftEmail, setDraftEmail] = useState(''),\n    [draftTitle, setDraftTitle] = useState(''),\n    [draftBody, setDraftBody] = useState('');\n  const data = customRange || periodData(period),\n    visibleMembers = members.filter((member) =>\n      filter === 'paid' ? member.paid : filter === 'active' ? member.active : true,\n    ),\n    total = data.reduce((sum, point) => sum + point.value, 0);\n  const submit = (event: FormEvent) => {\n    event.preventDefault();\n    if (dialog === 'member') {\n      setMembers((previous) => [\n        ...previous,\n        { name: draftName.trim(), email: draftEmail, paid: false, active: true },\n      ]);\n      setNotice(`${draftName.trim()} added to this example.`);\n    } else {\n      setPosts((previous) => [\n        ...previous,\n        {\n          title: draftTitle.trim(),\n          text: draftBody.trim(),\n          author: people[0],\n          image: '322-236-EditorialLandscape1.svg',\n        },\n      ]);\n      setNotice('Post added to this example.');\n    }\n    setDialog(null);\n  };\n  return (\n    <>\n      <div className=\"hx-page-title\">\n        <div>\n          <h1>Dashboard</h1>\n          <p className=\"hxr-note\">Membership workspace · fictional local data</p>\n        </div>\n      </div>\n      <div className=\"hx-controls\">\n        <Periods\n          value={period}\n          onChange={(value) => {\n            setPeriod(value);\n            setCustomRange(null);\n          }}\n        />\n        <div>\n          <DateRange\n            start={start}\n            end={end}\n            onChange={(start, end) => {\n              setStart(start);\n              setEnd(end);\n              setPeriod(2);\n              setCustomRange(rangeData(start, end));\n              setNotice(`Date range ${start} to ${end} applied to this example.`);\n            }}\n          />\n          <HXButton onClick={() => setFilterOpen(true)}>\n            <Icon name=\"filter\" />\n            Filters\n          </HXButton>\n        </div>\n      </div>\n      <div className=\"hx-membership-chart\">\n        <Metric label=\"Period revenue\" value={money(total, 0)} trend=\"Illustrative period total\" />\n        <TemplateRevenueChart data={data} />\n        <div className=\"hx-membership-stats\">\n          <Metric label=\"Total members\" value={String(members.length)} trend=\"Local example\" />\n          <Metric\n            label=\"Paid members\"\n            value={String(members.filter((member) => member.paid).length)}\n          />\n          <Metric label=\"Email open rate\" value=\"82%\" trend=\"Fixture metric\" />\n        </div>\n      </div>\n      <div className=\"hx-membership-columns\">\n        <div>\n          <div className=\"hx-section-heading\">\n            <h2>Start creating content</h2>\n            <HXButton onClick={() => setDialog('menu')} label=\"Content options\"><UIIcon name=\"more\" /></HXButton>\n          </div>\n          <div className=\"hx-create-cards\">\n            <HXButton\n              onClick={() => {\n                setDraftName('');\n                setDraftEmail('');\n                setDialog('member');\n              }}\n            >\n              <Icon name=\"user-plus\" />\n              <span>\n                <strong>Create your first member</strong>\n                <small>Add a member to this local workspace</small>\n              </span>\n            </HXButton>\n            <HXButton\n              onClick={() => {\n                setDraftTitle('');\n                setDraftBody('');\n                setDialog('post');\n              }}\n            >\n              <Icon name=\"edit\" />\n              <span>\n                <strong>Create a new post</strong>\n                <small>Dive into the editor and start creating</small>\n              </span>\n            </HXButton>\n          </div>\n          <div className=\"hx-section-heading\">\n            <h2>Recent posts</h2>\n            <HXButton\n              onClick={() => {\n                setCurrentPost(0);\n                setDialog('read');\n              }}\n            >\n              View all →\n            </HXButton>\n          </div>\n          <div className=\"hx-post-grid\">\n            {posts.map((post, index) => (\n              <article key={index}>\n                <img\n                  className=\"hx-post-image\"\n                  src={asset(assetsBase, post.image)}\n                  alt=\"Editorial landscape artwork\"\n                />\n                <small>{post.author} · Example post</small>\n                <button\n                  type=\"button\"\n                  onClick={() => {\n                    setCurrentPost(index);\n                    setDialog('read');\n                  }}\n                >\n                  {post.title}\n                  <Icon name=\"external\" />\n                </button>\n                <p>{post.text}</p>\n                <div>\n                  <span>Design</span>\n                  <span>Research</span>\n                </div>\n              </article>\n            ))}\n          </div>\n        </div>\n        <aside className=\"hx-members-list\">\n          <h2>\n            {filter === 'all'\n              ? 'Top members'\n              : filter === 'paid'\n                ? 'Paid members'\n                : 'Active members'}\n          </h2>\n          {visibleMembers.map((member, index) => (\n            <div key={member.email}>\n              <Photo assetsBase={assetsBase} index={index % 6} alt={member.name} />\n              <span>\n                <strong>{member.name}</strong>\n                <small>{member.email}</small>\n              </span>\n              <i\n                role=\"img\"\n                aria-label={member.active ? 'Active' : 'Inactive'}\n                style={{\n                  background: member.active ? 'var(--color-status-lime-text)' : 'var(--hx-muted)',\n                }}\n              />\n            </div>\n          ))}\n        </aside>\n      </div>\n      <p className=\"hxr-status\" role=\"status\">\n        {notice}\n      </p>\n      <Dialog\n        open={filterOpen}\n        onOpenChange={setFilterOpen}\n        title=\"Filter membership\"\n        footer={<Button onClick={() => setFilterOpen(false)}>Apply filters</Button>}\n      >\n        <Select\n          label=\"Member status\"\n          value={filter}\n          options={[\n            { value: 'all', label: 'All members' },\n            { value: 'paid', label: 'Paid members' },\n            { value: 'active', label: 'Active members' },\n          ]}\n          onChange={(event) => setFilter(event.target.value)}\n        />\n      </Dialog>\n      <Dialog\n        open={dialog !== null}\n        onOpenChange={(open) => {\n          if (!open) setDialog(null);\n        }}\n        title={\n          dialog === 'member'\n            ? 'Add member'\n            : dialog === 'post'\n              ? 'Create post'\n              : dialog === 'menu'\n                ? 'Content options'\n                : posts[currentPost]?.title || 'Recent posts'\n        }\n        description={\n          dialog === 'member' || dialog === 'post'\n            ? 'Changes apply only to this local example.'\n            : undefined\n        }\n        footer={\n          <>\n            <Button variant=\"secondary\" onClick={() => setDialog(null)}>\n              Close\n            </Button>\n            {(dialog === 'member' || dialog === 'post') && (\n              <Button type=\"submit\" form={formId}>\n                {dialog === 'member' ? 'Add member' : 'Create post'}\n              </Button>\n            )}\n          </>\n        }\n      >\n        {dialog === 'member' || dialog === 'post' ? (\n          <form id={formId} className=\"hxr-dialog-form\" onSubmit={submit}>\n            {dialog === 'member' ? (\n              <>\n                <Input\n                  label=\"Member name\"\n                  required\n                  value={draftName}\n                  onChange={(event) => setDraftName(event.target.value)}\n                />\n                <Input\n                  label=\"Member email\"\n                  type=\"email\"\n                  required\n                  value={draftEmail}\n                  onChange={(event) => setDraftEmail(event.target.value)}\n                />\n              </>\n            ) : (\n              <>\n                <Input\n                  label=\"Post title\"\n                  required\n                  value={draftTitle}\n                  onChange={(event) => setDraftTitle(event.target.value)}\n                />\n                <label className=\"hxr-field\">\n                  Post body\n                  <textarea\n                    required\n                    value={draftBody}\n                    onChange={(event) => setDraftBody(event.target.value)}\n                  />\n                </label>\n              </>\n            )}\n          </form>\n        ) : dialog === 'menu' ? (\n          <div className=\"hxr-dialog-form\">\n            <Button\n              variant=\"secondary\"\n              onClick={() => {\n                setDraftName('');\n                setDraftEmail('');\n                setDialog('member');\n              }}\n            >\n              Add member\n            </Button>\n            <Button\n              variant=\"secondary\"\n              onClick={() => {\n                setDraftTitle('');\n                setDraftBody('');\n                setDialog('post');\n              }}\n            >\n              Create post\n            </Button>\n          </div>\n        ) : (\n          <div className=\"hxr-post-reader\">\n            <Select\n              label=\"Choose post\"\n              value={String(currentPost)}\n              options={posts.map((post, index) => ({ value: String(index), label: post.title }))}\n              onChange={(event) => setCurrentPost(Number(event.target.value))}\n            />\n            <img\n              src={asset(assetsBase, posts[currentPost]?.image || posts[0].image)}\n              alt=\"Editorial landscape artwork\"\n            />\n            <p>{posts[currentPost]?.text}</p>\n          </div>\n        )}\n      </Dialog>\n    </>\n  );\n}\n\nexport type TemplateOrder = {\n  id: string;\n  date: string;\n  amount: number;\n  status: 'Paid' | 'Refunded';\n  customer: string;\n  email: string;\n  rating: number;\n  avatar: string | null;\n};\nconst orderSeeds = [\n  [100.14, '442-773-Avatar.png'],\n  [96.32, '442-853-Avatar.png'],\n  [104.24, null],\n  [88.48, null],\n  [96.32, '442-1065-Avatar.png'],\n  [107.1, null],\n  [82.04, '442-1206-Avatar.png'],\n] as const;\nexport const templateOrders: TemplateOrder[] = Array.from({ length: 24 }, (_, index) => ({\n  id: '#' + (26678 - index),\n  date: `2027-01-${String(16 - (index % 8)).padStart(2, '0')}`,\n  amount: orderSeeds[index % 7][0],\n  status: index % 9 === 8 ? 'Refunded' : 'Paid',\n  customer: people[index % 10],\n  email: emails[index % 10],\n  rating: index % 3 === 0 ? 5 : 4,\n  avatar: orderSeeds[index % 7][1],\n}));\nfunction BusinessContent({ assetsBase }: { assetsBase: string }) {\n  const [period, setPeriod] = useState(0),\n    [start, setStart] = useState('2027-01-08'),\n    [end, setEnd] = useState('2027-01-16'),\n    [query, setQuery] = useState(''),\n    [status, setStatus] = useState('all'),\n    [detail, setDetail] = useState<TemplateOrder | null>(null),\n    [chartView, setChartView] = useState('data'),\n    [notice, setNotice] = useState('');\n  const data = periodData(period),\n    rows = templateOrders.filter(\n      (order) =>\n        (status === 'all' || order.status === status) &&\n        `${order.customer} ${order.email} ${order.id}`\n          .toLowerCase()\n          .includes(query.toLowerCase()) &&\n        order.date >= start &&\n        order.date <= end,\n    ),\n    sales = rows\n      .filter((order) => order.status === 'Paid')\n      .reduce((sum, order) => sum + order.amount, 0);\n  const columns: Column<TemplateOrder>[] = useMemo(\n    () => [\n      { key: 'id', header: 'Order', value: (row) => row.id, sortable: true },\n      { key: 'date', header: 'Date', value: (row) => row.date, sortable: true },\n      {\n        key: 'status',\n        header: 'Status',\n        value: (row) => row.status,\n        sortable: true,\n        render: (row) => (\n          <span className={`hx-status ${row.status.toLowerCase()}`}>{row.status}</span>\n        ),\n      },\n      {\n        key: 'amount',\n        header: 'Amount',\n        value: (row) => row.amount,\n        sortable: true,\n        render: (row) => money(row.amount),\n      },\n      {\n        key: 'rating',\n        header: 'Rating',\n        value: (row) => row.rating,\n        sortable: true,\n        render: (row) => (\n          <span className=\"hx-rating\" role=\"img\" aria-label={`${row.rating} out of 5 stars`}>\n            {Array.from({ length: 5 }, (_, index) => (\n              <img\n                key={index}\n                src={asset(\n                  assetsBase,\n                  `442-773-ColorYellowFill${index < row.rating ? '100' : '0'}.svg`,\n                )}\n                alt=\"\"\n              />\n            ))}\n          </span>\n        ),\n      },\n      {\n        key: 'customer',\n        header: 'Customer',\n        value: (row) => row.customer,\n        sortable: true,\n        render: (row) => (\n          <div className=\"hx-person\">\n            {row.avatar ? (\n              <img className=\"hx-avatar\" src={asset(assetsBase, row.avatar)} alt={row.customer} />\n            ) : (\n              <span className=\"hx-avatar initials\" aria-hidden=\"true\">\n                {row.customer\n                  .split(' ')\n                  .map((x) => x[0])\n                  .join('')}\n              </span>\n            )}\n            <span>\n              <strong>{row.customer}</strong>\n              <small>{row.email}</small>\n            </span>\n          </div>\n        ),\n      },\n    ],\n    [assetsBase],\n  );\n  return (\n    <>\n      <div className=\"hx-welcome\">\n        <div>\n          <Photo assetsBase={assetsBase} size=\"large\" />\n          <span>\n            <h1>Welcome back, Aarav</h1>\n            <p>16 January, 2027 · fictional example</p>\n          </span>\n        </div>\n        <Input\n          label=\"Search orders\"\n          type=\"search\"\n          placeholder=\"Search orders\"\n          value={query}\n          onChange={(event) => setQuery(event.target.value)}\n        />\n      </div>\n      <div className=\"hx-controls\">\n        <Periods value={period} onChange={setPeriod} />\n        <DateRange\n          start={start}\n          end={end}\n          onChange={(start, end) => {\n            setStart(start);\n            setEnd(end);\n            setNotice('Order date range updated.');\n          }}\n        />\n      </div>\n      <div className=\"hx-business-metrics\">\n        {[\n          ['Sales', money(sales), 'MetricSparkline'],\n          ['Orders', String(rows.length), 'MetricSparkline1'],\n          [\n            'Average order value',\n            money(\n              rows.length ? sales / rows.filter((row) => row.status === 'Paid').length || 0 : 0,\n            ),\n            'MetricSparkline2',\n          ],\n        ].map(([name, value, file]) => (\n          <article key={name}>\n            <header>{name}</header>\n            <Metric label=\"\" value={value} trend=\"Current filter\" />\n            <img\n              src={asset(assetsBase, '442-642-' + file + '.svg')}\n              alt={`${name} source-design trend illustration`}\n            />\n          </article>\n        ))}\n      </div>\n      <section className=\"hx-bordered-chart\">\n        <div className=\"hx-section-heading\">\n          <h2>Sales</h2>\n          <div className=\"hx-periods\" role=\"group\" aria-label=\"Chart view\">\n            <button\n              type=\"button\"\n              aria-pressed={chartView === 'data'}\n              onClick={() => setChartView('data')}\n            >\n              Data preview\n            </button>\n            <button\n              type=\"button\"\n              aria-pressed={chartView === 'source'}\n              onClick={() => setChartView('source')}\n            >\n              Figma reference\n            </button>\n          </div>\n        </div>\n        <div className=\"hx-sales-summary\">\n          <Metric\n            label=\"Current chart period\"\n            value={money(data.reduce((sum, point) => sum + point.value, 0))}\n            trend=\"Sum of visible example data\"\n          />\n          <Periods value={period} onChange={setPeriod} label=\"Sales chart period\" />\n        </div>\n        {chartView === 'source' ? (\n          <>\n            <img\n              className=\"hx-daily-sales\"\n              src={asset(assetsBase, '442-670-DailySales.svg')}\n              alt=\"Figma source sales chart with two comparison series\"\n            />\n            <p className=\"hxr-note\">\n              Source design illustration. Switch to Data preview for the interactive React chart.\n            </p>\n          </>\n        ) : (\n          <TemplateRevenueChart\n            data={data}\n            comparison\n            label=\"Illustrative sales and previous period in INR\"\n          />\n        )}\n      </section>\n      <section className=\"hxr-business-table\">\n        <div className=\"hx-section-heading\">\n          <h2>\n            Orders <span>{rows.length} matching orders</span>\n          </h2>\n        </div>\n        <div className=\"hx-order-summary\">\n          <Metric label=\"Filtered sales\" value={money(sales)} />\n          <div className=\"hx-periods\" role=\"group\" aria-label=\"Order status\">\n            {[\n              ['all', 'All orders'],\n              ['Paid', 'Paid'],\n              ['Refunded', 'Refunded'],\n            ].map(([value, label]) => (\n              <button\n                type=\"button\"\n                key={value}\n                aria-pressed={status === value}\n                onClick={() => setStatus(value)}\n              >\n                {label}\n              </button>\n            ))}\n          </div>\n        </div>\n        <div className=\"hxr-search-external\">\n          <DataTable\n            rows={rows}\n            columns={columns}\n            rowKey={(row) => row.id}\n            rowLabel={(row) => `order ${row.id}`}\n            caption=\"Example customer orders\"\n            pageSize={5}\n            onRetry={() => {\n              setQuery('');\n              setStatus('all');\n              setStart('2027-01-08');\n              setEnd('2027-01-16');\n            }}\n            onRowAction={setDetail}\n          />\n        </div>\n      </section>\n      <p role=\"status\" className=\"hxr-status\">\n        {notice}\n      </p>\n      <Dialog\n        open={detail !== null}\n        onOpenChange={(open) => {\n          if (!open) setDetail(null);\n        }}\n        title={detail ? `Order ${detail.id}` : 'Order details'}\n        description=\"Fictional order. No payment service is connected.\"\n        footer={\n          <>\n            <Button variant=\"secondary\" onClick={() => setDetail(null)}>\n              Close\n            </Button>\n            <Button\n              onClick={() => {\n                if (detail)\n                  download(\n                    `helios-order-${detail.id.slice(1)}.csv`,\n                    ['Order', 'Date', 'Amount INR', 'Status', 'Customer'],\n                    [[detail.id, detail.date, detail.amount, detail.status, detail.customer]],\n                  );\n              }}\n            >\n              Download order\n            </Button>\n          </>\n        }\n      >\n        <dl className=\"hxr-detail\">\n          <dt>Customer</dt>\n          <dd>{detail?.customer}</dd>\n          <dt>Email</dt>\n          <dd>{detail?.email}</dd>\n          <dt>Status</dt>\n          <dd>{detail?.status}</dd>\n          <dt>Amount</dt>\n          <dd>{money(detail?.amount || 0)}</dd>\n        </dl>\n      </Dialog>\n    </>\n  );\n}\n\nexport type TemplateTrade = {\n  id: string;\n  symbol: string;\n  type: 'BUY' | 'SELL';\n  company: string;\n  amount: number;\n  date: string;\n  status: 'Processing' | 'Success' | 'Declined';\n  person: number;\n};\nconst tradeSeeds: Omit<TemplateTrade, 'id' | 'date'>[] = [\n  {\n    symbol: 'TSLA',\n    type: 'BUY',\n    company: 'Tesla, Inc.',\n    amount: 30021.23,\n    status: 'Processing',\n    person: 0,\n  },\n  {\n    symbol: 'MTCH',\n    type: 'SELL',\n    company: 'Match Group, Inc.',\n    amount: 10045,\n    status: 'Success',\n    person: 1,\n  },\n  {\n    symbol: 'DDOG',\n    type: 'BUY',\n    company: 'Datadog, Inc.',\n    amount: 40132.16,\n    status: 'Success',\n    person: 2,\n  },\n  {\n    symbol: 'ARKG',\n    type: 'BUY',\n    company: 'ARK Genomic Revolution ETF',\n    amount: 22665.12,\n    status: 'Declined',\n    person: 3,\n  },\n  {\n    symbol: 'SQ',\n    type: 'BUY',\n    company: 'Square, Inc.',\n    amount: 18221.3,\n    status: 'Success',\n    person: 4,\n  },\n  {\n    symbol: 'MSTR',\n    type: 'SELL',\n    company: 'MicroStrategy Inc.',\n    amount: 24118.18,\n    status: 'Success',\n    person: 5,\n  },\n];\nexport const templateTrades: TemplateTrade[] = Array.from({ length: 58 }, (_, index) => ({\n  ...tradeSeeds[index % 6],\n  id: String(index + 1),\n  amount: tradeSeeds[index % 6].amount + Math.floor(index / 6) * 147,\n  date: `2027-01-${String(13 - (index % 5)).padStart(2, '0')}`,\n}));\nfunction TradeContent({ assetsBase }: { assetsBase: string }) {\n  const [rows, setRows] = useState(templateTrades),\n    [type, setType] = useState('all'),\n    [status, setStatus] = useState('All'),\n    [query, setQuery] = useState(''),\n    [start, setStart] = useState('2027-01-08'),\n    [end, setEnd] = useState('2027-01-14'),\n    [detail, setDetail] = useState<TemplateTrade | null>(null),\n    [adding, setAdding] = useState(false),\n    [symbol, setSymbol] = useState(''),\n    [tradeType, setTradeType] = useState('BUY'),\n    [amount, setAmount] = useState(''),\n    [formError, setFormError] = useState(''),\n    [notice, setNotice] = useState('');\n  const addForm = useId();\n  const filtered = rows.filter(\n    (row) =>\n      (type === 'all' || row.type === type) &&\n      (status === 'All' || row.status === status) &&\n      `${row.symbol} ${row.company} ${row.type}`.toLowerCase().includes(query.toLowerCase()) &&\n      row.date >= start &&\n      row.date <= end,\n  );\n  const columns: Column<TemplateTrade>[] = useMemo(\n    () => [\n      {\n        key: 'symbol',\n        header: 'Trade',\n        value: (row) => `${row.symbol} ${row.type}`,\n        sortable: true,\n        render: (row) => (\n          <span className=\"hxr-trade-name\">\n            <strong>\n              {row.symbol} {row.type}\n            </strong>\n            <small>{row.company}</small>\n          </span>\n        ),\n      },\n      {\n        key: 'amount',\n        header: 'Order amount',\n        value: (row) => row.amount,\n        sortable: true,\n        render: (row) => money(row.amount),\n      },\n      { key: 'date', header: 'Delivery date', value: (row) => row.date, sortable: true },\n      {\n        key: 'status',\n        header: 'Status',\n        value: (row) => row.status,\n        sortable: true,\n        render: (row) => (\n          <span className={`hx-status ${row.status.toLowerCase()}`}>{row.status}</span>\n        ),\n      },\n      {\n        key: 'person',\n        header: 'Executed by',\n        value: (row) => people[row.person],\n        sortable: true,\n        render: (row) => (\n          <div className=\"hx-person\">\n            <Photo assetsBase={assetsBase} index={row.person} />\n            <span>\n              <strong>{people[row.person]}</strong>\n              <small>{emails[row.person]}</small>\n            </span>\n          </div>\n        ),\n      },\n      {\n        key: 'download',\n        header: 'Download',\n        value: (row) => row.id,\n        render: (row) => (\n          <Button\n            variant=\"tertiary\"\n            size=\"sm\"\n            iconOnly\n            leadingIcon={<Icon name=\"download\" />}\n            aria-label={`Download ${row.symbol} trade ${row.id}`}\n            onClick={() =>\n              download(\n                `helios-trade-${row.id}.csv`,\n                ['Symbol', 'Type', 'Amount INR', 'Date', 'Status'],\n                [[row.symbol, row.type, row.amount, row.date, row.status]],\n              )\n            }\n          >\n            Download\n          </Button>\n        ),\n      },\n    ],\n    [assetsBase],\n  );\n  const table = (\n    <div className=\"hxr-search-external\">\n      <DataTable\n        rows={filtered}\n        columns={columns}\n        rowKey={(row) => row.id}\n        rowLabel={(row) => `${row.symbol} trade ${row.id}`}\n        caption=\"Example trade history\"\n        pageSize={5}\n        onRowAction={setDetail}\n        onRetry={() => {\n          setQuery('');\n          setType('all');\n          setStatus('All');\n          setStart('2027-01-08');\n          setEnd('2027-01-14');\n        }}\n      />\n    </div>\n  );\n  return (\n    <>\n      <div className=\"hx-crumb\">\n        Helios <span>/</span> {people[0]} <span>/</span> Trade history\n      </div>\n      <div className=\"hx-page-title\">\n        <div>\n          <h1>Trade history</h1>\n          <p>View your team’s fictional trades and transactions.</p>\n        </div>\n        <div>\n          <HXButton\n            onClick={() =>\n              download(\n                'helios-trades.csv',\n                ['Symbol', 'Type', 'Company', 'Amount INR', 'Date', 'Status'],\n                filtered.map((row) => [\n                  row.symbol,\n                  row.type,\n                  row.company,\n                  row.amount,\n                  row.date,\n                  row.status,\n                ]),\n              )\n            }\n            disabled={!filtered.length}\n          >\n            <Icon name=\"download\" />\n            Export\n          </HXButton>\n          <HXButton\n            primary\n            onClick={() => {\n              setSymbol('');\n              setAmount('');\n              setTradeType('BUY');\n              setFormError('');\n              setAdding(true);\n            }}\n          >\n            <Icon name=\"plus\" />\n            Add trade\n          </HXButton>\n        </div>\n      </div>\n      <Tabs\n        label=\"Trade type\"\n        value={type}\n        onValueChange={setType}\n        items={[\n          {\n            id: 'all',\n            label: 'All trades',\n            content: <p className=\"hxr-tab-context\">All buy and sell transactions.</p>,\n          },\n          {\n            id: 'BUY',\n            label: 'Buy',\n            content: <p className=\"hxr-tab-context\">Buy transactions only.</p>,\n          },\n          {\n            id: 'SELL',\n            label: 'Sell',\n            content: <p className=\"hxr-tab-context\">Sell transactions only.</p>,\n          },\n        ]}\n      />\n      <div className=\"hx-trade-toolbar\">\n        <Input\n          label=\"Search trades\"\n          type=\"search\"\n          placeholder=\"Search for trades\"\n          value={query}\n          onChange={(event) => setQuery(event.target.value)}\n        />\n        <div>\n          <DateRange\n            start={start}\n            end={end}\n            onChange={(start, end) => {\n              setStart(start);\n              setEnd(end);\n            }}\n          />\n          <Select\n            label=\"Trade status\"\n            size=\"sm\"\n            value={status}\n            options={['All', 'Processing', 'Success', 'Declined'].map((value) => ({\n              value,\n              label: value,\n            }))}\n            onChange={(event) => setStatus(event.target.value)}\n          />\n        </div>\n      </div>\n      <div className=\"hx-section-heading\">\n        <h2>\n          {type === 'all' ? 'All trades' : type === 'BUY' ? 'Buy trades' : 'Sell trades'}{' '}\n          <span>{filtered.length} trades</span>\n        </h2>\n      </div>\n      {table}\n      <p className=\"hxr-status\" role=\"status\">\n        {notice}\n      </p>\n      <Dialog\n        open={adding}\n        onOpenChange={setAdding}\n        title=\"Add trade\"\n        description=\"Add a fictional transaction to this local example. This does not place an order.\"\n        footer={\n          <>\n            <Button variant=\"secondary\" onClick={() => setAdding(false)}>\n              Cancel\n            </Button>\n            <Button type=\"submit\" form={addForm}>\n              Add example trade\n            </Button>\n          </>\n        }\n      >\n        <form\n          id={addForm}\n          className=\"hxr-dialog-form\"\n          onSubmit={(event) => {\n            event.preventDefault();\n            if (\n              !/^[A-Za-z][A-Za-z0-9.-]{0,9}$/.test(symbol.trim()) ||\n              !Number.isFinite(Number(amount)) ||\n              Number(amount) <= 0\n            ) {\n              setFormError('Enter a valid symbol and an amount greater than zero.');\n              return;\n            }\n            const row: TemplateTrade = {\n              id: String(Date.now()),\n              symbol: symbol.toUpperCase().trim(),\n              type: tradeType as 'BUY' | 'SELL',\n              company: 'Example company',\n              amount: Number(amount),\n              status: 'Processing',\n              date: end,\n              person: 0,\n            };\n            setRows((previous) => [row, ...previous]);\n            setType('all');\n            setStatus('All');\n            setQuery(row.symbol);\n            setNotice(`${row.symbol} added to this local example.`);\n            setAdding(false);\n          }}\n        >\n          <Input\n            label=\"Trade symbol\"\n            required\n            maxLength={10}\n            value={symbol}\n            onChange={(event) => setSymbol(event.target.value)}\n          />\n          <Select\n            label=\"Trade direction\"\n            value={tradeType}\n            options={[\n              { value: 'BUY', label: 'Buy' },\n              { value: 'SELL', label: 'Sell' },\n            ]}\n            onChange={(event) => setTradeType(event.target.value)}\n          />\n          <Input\n            label=\"Amount INR\"\n            type=\"number\"\n            min=\"0.01\"\n            step=\"0.01\"\n            required\n            value={amount}\n            error={formError || undefined}\n            onChange={(event) => setAmount(event.target.value)}\n          />\n        </form>\n      </Dialog>\n      <Dialog\n        open={detail !== null}\n        onOpenChange={(open) => {\n          if (!open) setDetail(null);\n        }}\n        title={detail ? `${detail.symbol} ${detail.type}` : 'Trade details'}\n        description=\"Fictional example; no broker is connected.\"\n        footer={\n          <>\n            <Button variant=\"secondary\" onClick={() => setDetail(null)}>\n              Close\n            </Button>\n            <Button\n              variant=\"danger\"\n              onClick={() => {\n                if (!detail) return;\n                setRows((previous) => previous.filter((row) => row.id !== detail.id));\n                setNotice(`${detail.symbol} removed from this local example.`);\n                setDetail(null);\n              }}\n            >\n              Delete example trade\n            </Button>\n          </>\n        }\n      >\n        <dl className=\"hxr-detail\">\n          <dt>Company</dt>\n          <dd>{detail?.company}</dd>\n          <dt>Amount</dt>\n          <dd>{money(detail?.amount || 0)}</dd>\n          <dt>Delivery date</dt>\n          <dd>{detail?.date}</dd>\n          <dt>Status</dt>\n          <dd>{detail?.status}</dd>\n        </dl>\n      </Dialog>\n    </>\n  );\n}\n\ntype ProfileValues = {\n  firstName: string;\n  lastName: string;\n  email: string;\n  role: string;\n  country: string;\n  timezone: string;\n  bio: string;\n};\nconst originalProfile: ProfileValues = {\n  firstName: 'Aarav',\n  lastName: 'Shah',\n  email: 'aarav.shah@example.com',\n  role: 'Product Designer',\n  country: 'India',\n  timezone: 'Asia/Kolkata',\n  bio: 'I’m a Product Designer based in Bengaluru, India. I specialise in UX/UI design, strategy, and building clear product experiences.',\n};\ntype LocalPortfolioFile = { id: string; name: string; size: number; example?: boolean };\nfunction SettingRow({\n  title,\n  help,\n  children,\n}: {\n  title: string;\n  help?: string;\n  children: ReactNode;\n}) {\n  return (\n    <div className=\"hx-setting-row\">\n      <div>\n        <strong>{title}</strong>\n        {help && <p>{help}</p>}\n      </div>\n      <div className=\"hxr-setting-control\">{children}</div>\n    </div>\n  );\n}\nfunction ProfileForm({ profile, assetsBase }: { profile: boolean; assetsBase: string }) {\n  const [values, setValues] = useState<ProfileValues>(originalProfile),\n    [errors, setErrors] = useState<Record<string, string>>({}),\n    [notice, setNotice] = useState('Changes apply to this local preview.'),\n    [photo, setPhoto] = useState(''),\n    [files, setFiles] = useState<LocalPortfolioFile[]>([\n      { id: 'example-pdf', name: 'Tech design requirements.pdf', size: 200 * 1024, example: true },\n    ]),\n    [reset, setReset] = useState(0),\n    [font, setFont] = useState('Inter'),\n    [fontSize, setFontSize] = useState('16');\n  const firstRef = useRef<HTMLInputElement>(null),\n    emailRef = useRef<HTMLInputElement>(null),\n    formRef = useRef<HTMLFormElement>(null),\n    photoInput = useRef<HTMLInputElement>(null),\n    portfolioInput = useRef<HTMLInputElement>(null);\n  useEffect(\n    () => () => {\n      if (photo.startsWith('blob:')) URL.revokeObjectURL(photo);\n    },\n    [photo],\n  );\n  const update = (key: keyof ProfileValues, value: string) => {\n    setValues((previous) => ({ ...previous, [key]: value }));\n    setNotice('Unsaved changes in this local preview.');\n  };\n  const resetForm = () => {\n    setValues(originalProfile);\n    setPhoto('');\n    setFiles([\n      { id: 'example-pdf', name: 'Tech design requirements.pdf', size: 200 * 1024, example: true },\n    ]);\n    setErrors({});\n    setFont('Inter');\n    setFontSize('16');\n    setReset((previous) => previous + 1);\n    setNotice('Original example values restored.');\n    if (photoInput.current) photoInput.current.value = '';\n    if (portfolioInput.current) portfolioInput.current.value = '';\n  };\n  const selectPhoto = (file?: File) => {\n    if (!file) return;\n    if (\n      !['image/png', 'image/jpeg', 'image/webp', 'image/svg+xml'].includes(file.type) ||\n      file.size > 5 * 1024 * 1024\n    ) {\n      setErrors((previous) => ({\n        ...previous,\n        photo: 'Choose PNG, JPG, WEBP or SVG smaller than 5 MB.',\n      }));\n      return;\n    }\n    setPhoto(URL.createObjectURL(file));\n    setErrors((previous) => ({ ...previous, photo: '' }));\n    setNotice('Photo selected locally. Save to apply it to this preview.');\n  };\n  const selectPortfolio = (incoming: FileList | File[]) => {\n    const accepted: LocalPortfolioFile[] = [];\n    const rejected: string[] = [];\n    for (const file of Array.from(incoming)) {\n      if (!/\\.(png|jpe?g|pdf|mp4|fig)$/i.test(file.name) || file.size > 10 * 1024 * 1024)\n        rejected.push(file.name);\n      else\n        accepted.push({\n          id: `${file.name}-${file.size}-${file.lastModified}`,\n          name: file.name,\n          size: file.size,\n        });\n    }\n    setFiles((previous) => [\n      ...previous,\n      ...accepted.filter((file) => !previous.some((existing) => existing.id === file.id)),\n    ]);\n    setErrors((previous) => ({\n      ...previous,\n      portfolio: rejected.length\n        ? `Not selected: ${rejected.join(', ')}. Use an allowed format up to 10 MB.`\n        : '',\n    }));\n    setNotice(\n      accepted.length\n        ? `${accepted.length} file${accepted.length === 1 ? '' : 's'} selected locally; no upload service was contacted.`\n        : 'No new files selected.',\n    );\n  };\n  const save = (event: FormEvent) => {\n    event.preventDefault();\n    const next: Record<string, string> = {};\n    if (!values.firstName.trim()) next.firstName = 'Enter your first name.';\n    if (!values.lastName.trim()) next.lastName = 'Enter your last name.';\n    if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(values.email))\n      next.email = 'Enter a valid email address.';\n    if (!values.bio.trim()) next.bio = 'Write a short introduction.';\n    if (values.bio.length > 1000) next.bio = 'Keep your introduction within 1,000 characters.';\n    setErrors(next);\n    if (Object.keys(next).length) {\n      setNotice('Check the highlighted fields. Your changes are preserved.');\n      if (next.firstName) firstRef.current?.focus();\n      else if (next.lastName)\n        formRef.current?.querySelector<HTMLInputElement>('[name=lastName]')?.focus();\n      else if (next.email) emailRef.current?.focus();\n      else formRef.current?.querySelector<HTMLElement>('[contenteditable=true],textarea')?.focus();\n      return;\n    }\n    setNotice(\n      'Your personal details are saved in this local preview. No remote account was changed.',\n    );\n  };\n  return (\n    <form\n      ref={formRef}\n      className=\"hx-settings-form\"\n      noValidate\n      onSubmit={save}\n      onReset={(event) => {\n        event.preventDefault();\n        resetForm();\n      }}\n    >\n      <div className=\"hx-setting-heading\">\n        <div>\n          <h2>{profile ? 'Profile details' : 'Personal info'}</h2>\n          <p>Update your photo and personal details here.</p>\n        </div>\n        <div>\n          <HXButton type=\"reset\">Cancel</HXButton>\n          <HXButton type=\"submit\" primary>\n            Save\n          </HXButton>\n        </div>\n      </div>\n      <SettingRow title=\"Name *\">\n        <div className=\"hx-name-fields\">\n          <Input\n            ref={firstRef}\n            label=\"First name\"\n            name=\"firstName\"\n            required\n            autoComplete=\"given-name\"\n            value={values.firstName}\n            error={errors.firstName}\n            onChange={(event) => update('firstName', event.target.value)}\n          />\n          <Input\n            label=\"Last name\"\n            name=\"lastName\"\n            required\n            autoComplete=\"family-name\"\n            value={values.lastName}\n            error={errors.lastName}\n            onChange={(event) => update('lastName', event.target.value)}\n          />\n        </div>\n      </SettingRow>\n      <SettingRow title=\"Email address *\">\n        <Input\n          ref={emailRef}\n          label=\"Email address\"\n          type=\"email\"\n          autoComplete=\"email\"\n          required\n          leadingIcon={<Icon name=\"mail\" />}\n          value={values.email}\n          error={errors.email}\n          onChange={(event) => update('email', event.target.value)}\n        />\n      </SettingRow>\n      <SettingRow title=\"Your photo\" help=\"This will be displayed on your profile.\">\n        <div className=\"hx-photo-upload\">\n          <Photo\n            assetsBase={assetsBase}\n            size=\"large\"\n            src={photo || undefined}\n            alt={`${values.firstName} ${values.lastName}`}\n          />\n          <label\n            className=\"hx-upload hxr-upload\"\n            onDragOver={(event) => event.preventDefault()}\n            onDrop={(event) => {\n              event.preventDefault();\n              selectPhoto(event.dataTransfer.files[0]);\n            }}\n          >\n            <input\n              ref={photoInput}\n              type=\"file\"\n              aria-label=\"Choose profile photo\"\n              accept=\"image/png,image/jpeg,image/webp,image/svg+xml\"\n              onChange={(event) => selectPhoto(event.target.files?.[0])}\n            />\n            <span>\n              <Icon name=\"upload\" />\n            </span>\n            <strong>\n              Click to upload <small>or drag and drop</small>\n            </strong>\n            <small>SVG, PNG, JPG or WEBP · max. 5 MB</small>\n          </label>\n        </div>\n        {errors.photo && (\n          <p className=\"hxr-error\" role=\"alert\">\n            {errors.photo}\n          </p>\n        )}\n      </SettingRow>\n      <SettingRow title=\"Role\">\n        <Input\n          label=\"Role\"\n          value={values.role}\n          onChange={(event) => update('role', event.target.value)}\n        />\n      </SettingRow>\n      <SettingRow title=\"Country\">\n        <Select\n          label=\"Country\"\n          value={values.country}\n          options={['India', 'Australia', 'United States', 'United Kingdom'].map((value) => ({\n            value,\n            label: value,\n          }))}\n          onChange={(event) => update('country', event.target.value)}\n        />\n      </SettingRow>\n      <SettingRow title=\"Timezone\">\n        <Select\n          label=\"Timezone\"\n          value={values.timezone}\n          options={[\n            { value: 'Asia/Kolkata', label: 'India Standard Time (IST) UTC+05:30' },\n            { value: 'Australia/Melbourne', label: 'Australia/Melbourne' },\n            { value: 'America/Los_Angeles', label: 'Pacific Time (PT)' },\n            { value: 'UTC', label: 'Coordinated Universal Time (UTC)' },\n          ]}\n          onChange={(event) => update('timezone', event.target.value)}\n        />\n      </SettingRow>\n      <SettingRow title=\"Bio *\" help=\"Write a short introduction.\">\n        {profile ? (\n          <div\n            className=\"hxr-bio\"\n            style={{ '--hxr-bio-font': font, '--hxr-bio-size': fontSize + 'px' } as CSSProperties}\n          >\n            <div className=\"hxr-bio-options\">\n              <Select\n                label=\"Bio font\"\n                size=\"sm\"\n                value={font}\n                options={['Inter', 'Georgia', 'Arial'].map((value) => ({ value, label: value }))}\n                onChange={(event) => setFont(event.target.value)}\n              />\n              <Select\n                label=\"Bio font size\"\n                size=\"sm\"\n                value={fontSize}\n                options={['14', '16', '18', '24'].map((value) => ({ value, label: value + 'px' }))}\n                onChange={(event) => setFontSize(event.target.value)}\n              />\n            </div>\n            <TextEditor\n              key={reset}\n              label=\"Your bio\"\n              defaultValue={values.bio}\n              maxLength={1000}\n              onChange={(value) => update('bio', value.text)}\n            />\n            {errors.bio && (\n              <p className=\"hxr-error\" role=\"alert\">\n                {errors.bio}\n              </p>\n            )}\n          </div>\n        ) : (\n          <label className=\"hxr-field\">\n            <span className=\"hu-sr-only\">Your bio</span>\n            <textarea\n              value={values.bio}\n              required\n              maxLength={1000}\n              aria-invalid={Boolean(errors.bio)}\n              onChange={(event) => update('bio', event.target.value)}\n            />\n            {errors.bio && (\n              <span className=\"hxr-error\" role=\"alert\">\n                {errors.bio}\n              </span>\n            )}\n          </label>\n        )}\n        <small>{Math.max(0, 1000 - values.bio.length)} characters left</small>\n      </SettingRow>\n      <SettingRow title=\"Portfolio projects\" help=\"Share a few snippets of your work.\">\n        {profile && (\n          <div className=\"hx-profile-projects\">\n            <div className=\"hx-portfolio-mockup\">\n              <div className=\"hx-browser-toolbar\">\n                <i />\n                <i />\n                <i />\n                <span>helios.app</span>\n              </div>\n              <div className=\"hx-portfolio-article\">\n                <small>OUR BLOG</small>\n                <h3>A conversation with Lucy Bond</h3>\n                <p>Stories, ideas, and the people behind the work.</p>\n                <div>\n                  <img\n                    src={asset(assetsBase, '557-2-PublicEditorialPhotographKatrinBolovtsova.png')}\n                    alt=\"Woman seated in a bright studio\"\n                  />\n                  <img\n                    src={asset(assetsBase, '557-2-PublicEditorialPhotographKatrinBolovtsova.png')}\n                    alt=\"Editorial portrait\"\n                  />\n                </div>\n              </div>\n            </div>\n            <div className=\"hx-portfolio-thumbnails\">\n              {[0, 1, 2].map((index) => (\n                <img\n                  key={index}\n                  src={asset(assetsBase, '557-2-PublicEditorialPhotographKatrinBolovtsova.png')}\n                  alt={`Editorial project ${index + 1}`}\n                />\n              ))}\n            </div>\n          </div>\n        )}\n        <label\n          className=\"hx-upload hxr-upload\"\n          onDragOver={(event) => event.preventDefault()}\n          onDrop={(event) => {\n            event.preventDefault();\n            selectPortfolio(event.dataTransfer.files);\n          }}\n        >\n          <input\n            ref={portfolioInput}\n            type=\"file\"\n            aria-label=\"Choose portfolio files\"\n            multiple\n            accept=\".png,.jpg,.jpeg,.pdf,.mp4,.fig\"\n            onChange={(event) => {\n              if (event.target.files) selectPortfolio(event.target.files);\n            }}\n          />\n          <span>\n            <Icon name=\"upload\" />\n          </span>\n          <strong>\n            Click to upload <small>or drag and drop</small>\n          </strong>\n          <small>PDF, PNG, JPG, MP4 or FIG · max. 10 MB each</small>\n        </label>\n        {errors.portfolio && (\n          <p className=\"hxr-error\" role=\"alert\">\n            {errors.portfolio}\n          </p>\n        )}\n        <ul className=\"hx-portfolio-files\">\n          {files.map((file) => (\n            <li key={file.id}>\n              <span className=\"hx-file-icon\">{file.name.split('.').at(-1)?.toUpperCase()}</span>\n              <span>\n                <strong>{file.name}</strong>\n                <small>\n                  {Math.round(file.size / 1024)} KB ·{' '}\n                  {file.example ? 'Example document' : 'Selected locally'}\n                </small>\n              </span>\n              <Button\n                iconOnly\n                leadingIcon={<Icon name=\"trash\" />}\n                variant=\"tertiary\"\n                size=\"sm\"\n                aria-label={`Remove ${file.name}`}\n                onClick={() => {\n                  setFiles((previous) => previous.filter((existing) => existing.id !== file.id));\n                  setNotice(`${file.name} removed from this example.`);\n                }}\n              >\n                Remove\n              </Button>\n            </li>\n          ))}\n        </ul>\n      </SettingRow>\n      <div className=\"hx-settings-bottom\">\n        <p role=\"status\">{notice}</p>\n        <HXButton type=\"reset\">Cancel</HXButton>\n        <HXButton type=\"submit\" primary>\n          Save\n        </HXButton>\n      </div>\n    </form>\n  );\n}\n\nfunction PasswordSettings() {\n  const [current, setCurrent] = useState(''),\n    [password, setPassword] = useState(''),\n    [confirmation, setConfirmation] = useState(''),\n    [error, setError] = useState(''),\n    [notice, setNotice] = useState('');\n  return (\n    <form\n      className=\"hxr-panel-form\"\n      noValidate\n      onSubmit={(event) => {\n        event.preventDefault();\n        if (!current || password.length < 12 || password !== confirmation) {\n          setError(\n            'Enter the current example value, use at least 12 characters, and match the confirmation.',\n          );\n          return;\n        }\n        setError('');\n        setCurrent('');\n        setPassword('');\n        setConfirmation('');\n        setNotice('Password format validated locally. No account password was changed.');\n      }}\n    >\n      <h2>Password</h2>\n      <p className=\"hxr-note\">Local validation example; no credentials are sent or stored.</p>\n      <Input\n        label=\"Current password\"\n        type=\"password\"\n        autoComplete=\"current-password\"\n        value={current}\n        onChange={(event) => setCurrent(event.target.value)}\n        required\n      />\n      <Input\n        label=\"New password\"\n        type=\"password\"\n        autoComplete=\"new-password\"\n        value={password}\n        onChange={(event) => setPassword(event.target.value)}\n        required\n        hint=\"Use at least 12 characters.\"\n        error={error || undefined}\n      />\n      <Input\n        label=\"Confirm new password\"\n        type=\"password\"\n        autoComplete=\"new-password\"\n        value={confirmation}\n        onChange={(event) => setConfirmation(event.target.value)}\n        required\n      />\n      <Button type=\"submit\">Validate example</Button>\n      <p role=\"status\">{notice}</p>\n    </form>\n  );\n}\nfunction TeamSettings() {\n  const [rows, setRows] = useState(\n      people.slice(0, 5).map((name, index) => ({\n        id: String(index),\n        name,\n        email: emails[index],\n        role: index === 0 ? 'Admin' : 'Member',\n      })),\n    ),\n    [open, setOpen] = useState(false),\n    [email, setEmail] = useState(''),\n    [notice, setNotice] = useState('');\n  const form = useId();\n  return (\n    <section>\n      <div className=\"hx-section-heading\">\n        <h2>Team members</h2>\n        <Button onClick={() => setOpen(true)}>Invite member</Button>\n      </div>\n      <DataTable\n        rows={rows}\n        columns={[\n          { key: 'name', header: 'Name', value: (row) => row.name, sortable: true },\n          { key: 'email', header: 'Email', value: (row) => row.email },\n          { key: 'role', header: 'Role', value: (row) => row.role },\n        ]}\n        rowKey={(row) => row.id}\n        rowLabel={(row) => row.name}\n        caption=\"Example team members\"\n      />\n      <p role=\"status\" className=\"hxr-status\">\n        {notice}\n      </p>\n      <Dialog\n        open={open}\n        onOpenChange={setOpen}\n        title=\"Invite a member\"\n        description=\"This adds an example invitation locally; no email is sent.\"\n        footer={\n          <>\n            <Button variant=\"secondary\" onClick={() => setOpen(false)}>\n              Cancel\n            </Button>\n            <Button type=\"submit\" form={form}>\n              Add invitation\n            </Button>\n          </>\n        }\n      >\n        <form\n          id={form}\n          onSubmit={(event) => {\n            event.preventDefault();\n            setRows((previous) => [\n              ...previous,\n              { id: String(Date.now()), name: 'Invited member', email, role: 'Invited' },\n            ]);\n            setNotice(`Example invitation added for ${email}. No email was sent.`);\n            setEmail('');\n            setOpen(false);\n          }}\n        >\n          <Input\n            label=\"Invite email\"\n            type=\"email\"\n            required\n            value={email}\n            onChange={(event) => setEmail(event.target.value)}\n          />\n        </form>\n      </Dialog>\n    </section>\n  );\n}\nfunction PlanSettings() {\n  const [selected, setSelected] = useState('starter'),\n    [notice, setNotice] = useState('');\n  const options = [\n    ['starter', 'Starter', 'Free'],\n    ['year', '1 Year of Updates', '₹9,999'],\n    ['lifetime', 'Lifetime Access', '₹14,999'],\n    ['team', 'Unlimited for Startups', '₹24,999'],\n  ];\n  return (\n    <section className=\"hxr-panel-form\">\n      <h2>Plan preview</h2>\n      <p>Rounded INR proposals. Checkout and tax treatment are not configured.</p>\n      <fieldset className=\"hxr-plan-options\">\n        <legend>Choose a proposed plan</legend>\n        {options.map(([value, label, price]) => (\n          <label key={value}>\n            <input\n              type=\"radio\"\n              name=\"hxr-plan\"\n              checked={selected === value}\n              onChange={() => setSelected(value)}\n            />\n            <strong>{label}</strong>\n            <span>{price}</span>\n          </label>\n        ))}\n      </fieldset>\n      <Button\n        onClick={() =>\n          setNotice(\n            `${options.find((option) => option[0] === selected)?.[1]} selected in this local preview. No purchase was made.`,\n          )\n        }\n      >\n        Save preview preference\n      </Button>\n      <p role=\"status\">{notice}</p>\n    </section>\n  );\n}\nfunction BillingSettings() {\n  return (\n    <section>\n      <h2>Billing history</h2>\n      <p className=\"hxr-note\">\n        Fictional invoices. No payment method or billing service is connected.\n      </p>\n      <DataTable\n        caption=\"Example billing history\"\n        rows={[\n          { id: 'INV-2027-001', date: '2027-01-16', amount: 9999, status: 'Example' },\n          { id: 'INV-2026-012', date: '2026-12-16', amount: 9999, status: 'Example' },\n        ]}\n        columns={[\n          { key: 'id', header: 'Invoice', value: (row) => row.id },\n          { key: 'date', header: 'Date', value: (row) => row.date, sortable: true },\n          {\n            key: 'amount',\n            header: 'Amount',\n            value: (row) => row.amount,\n            render: (row) => money(row.amount),\n          },\n          { key: 'status', header: 'Status', value: (row) => row.status },\n        ]}\n        rowKey={(row) => row.id}\n        rowLabel={(row) => row.id}\n      />\n    </section>\n  );\n}\nfunction PreferencesSettings({ kind }: { kind: 'Email' | 'Notifications' | 'Integrations' }) {\n  const labels =\n    kind === 'Email'\n      ? ['Product updates', 'Weekly digest', 'Security alerts']\n      : kind === 'Notifications'\n        ? ['Browser notifications', 'Team activity', 'Mentions only']\n        : ['Calendar sync example', 'Workspace chat example', 'Project tracking example'];\n  const [enabled, setEnabled] = useState<string[]>([labels[0]]),\n    [notice, setNotice] = useState('');\n  return (\n    <section className=\"hxr-panel-form\">\n      <h2>{kind}</h2>\n      <p className=\"hxr-note\">\n        These preferences apply only to this example. No provider is contacted.\n      </p>\n      {labels.map((label) => (\n        <Checkbox\n          key={label}\n          label={label}\n          checked={enabled.includes(label)}\n          onChange={(event) =>\n            setEnabled((previous) =>\n              event.target.checked\n                ? [...previous, label]\n                : previous.filter((value) => value !== label),\n            )\n          }\n        />\n      ))}\n      <Button onClick={() => setNotice(`${kind} preferences saved in this local preview.`)}>\n        Save preferences\n      </Button>\n      <p role=\"status\">{notice}</p>\n    </section>\n  );\n}\nfunction APISettings() {\n  const [key, setKey] = useState('helios_example_key_not_valid'),\n    [notice, setNotice] = useState('');\n  return (\n    <section className=\"hxr-panel-form\">\n      <h2>API example</h2>\n      <p className=\"hxr-note\">This is an invalid illustrative key. No API credential is issued.</p>\n      <code className=\"hxr-key\">{key}</code>\n      <div className=\"hu-actions\">\n        <Button\n          variant=\"secondary\"\n          onClick={async () => {\n            try {\n              await navigator.clipboard.writeText(key);\n              setNotice('Invalid example key copied.');\n            } catch {\n              setNotice('Clipboard unavailable. Select and copy the example key.');\n            }\n          }}\n        >\n          Copy example\n        </Button>\n        <Button\n          onClick={() => {\n            setKey('helios_example_' + crypto.randomUUID().slice(0, 8) + '_not_valid');\n            setNotice('New invalid example value generated locally.');\n          }}\n        >\n          Generate example value\n        </Button>\n      </div>\n      <p role=\"status\">{notice}</p>\n    </section>\n  );\n}\nfunction SettingsContent({ assetsBase, profile }: { assetsBase: string; profile: boolean }) {\n  const [tab, setTab] = useState(profile ? 'profile' : 'details');\n  const panels = [\n    {\n      id: 'details',\n      label: 'My details',\n      content: <ProfileForm profile={false} assetsBase={assetsBase} />,\n    },\n    { id: 'profile', label: 'Profile', content: <ProfileForm profile assetsBase={assetsBase} /> },\n    { id: 'password', label: 'Password', content: <PasswordSettings /> },\n    { id: 'team', label: 'Team', content: <TeamSettings /> },\n    { id: 'plan', label: 'Plan', content: <PlanSettings /> },\n    { id: 'billing', label: 'Billing', content: <BillingSettings /> },\n    { id: 'email', label: 'Email', content: <PreferencesSettings kind=\"Email\" /> },\n    {\n      id: 'notifications',\n      label: 'Notifications',\n      content: <PreferencesSettings kind=\"Notifications\" />,\n    },\n    {\n      id: 'integrations',\n      label: 'Integrations',\n      content: <PreferencesSettings kind=\"Integrations\" />,\n    },\n    { id: 'api', label: 'API', content: <APISettings /> },\n  ];\n  return (\n    <>\n      {profile ? (\n        <>\n          <div className=\"hx-profile-cover\">\n            <img\n              src={asset(assetsBase, '557-2-ApprovedSubstituteProfileCover.png')}\n              alt=\"Abstract blue and violet profile cover\"\n            />\n          </div>\n          <div className=\"hx-profile-identity\">\n            <Photo assetsBase={assetsBase} size=\"xl\" />\n            <span>\n              <small>Settings › Profile</small>\n              <h1>{people[0]}</h1>\n              <p>@aarav</p>\n            </span>\n          </div>\n        </>\n      ) : (\n        <div className=\"hx-page-title\">\n          <h1>Settings</h1>\n        </div>\n      )}\n      <div className=\"hxr-settings-tabs\">\n        <Tabs label=\"Settings sections\" value={tab} onValueChange={setTab} items={panels} />\n      </div>\n    </>\n  );\n}\n\n/** All page transitions, forms and data changes are local React state. No legacy mount bridge. */\nexport function TemplatePreview({\n  index = 0,\n  assetsBase = '/assets',\n  state = 'ready',\n  onRetry,\n  onNavigate,\n  preview = false,\n}: TemplatePreviewProps) {\n  const [current, setCurrent] = useState(Math.max(0, Math.min(5, Math.floor(index)))),\n    [presentation, setPresentation] = useState(state),\n    [readyMounted, setReadyMounted] = useState(state === 'ready');\n  const reduce = useReducedMotion();\n  useEffect(() => setCurrent(Math.max(0, Math.min(5, Math.floor(index)))), [index]);\n  useEffect(() => {\n    setPresentation(state);\n    if (state === 'ready') setReadyMounted(true);\n  }, [state]);\n  const contentRef = useRef<HTMLDivElement>(null);\n  useEffect(() => {\n    if (presentation !== 'ready')\n      contentRef.current?.querySelectorAll<HTMLDialogElement>('dialog[open]').forEach((dialog) => dialog.close());\n  }, [presentation]);\n  const navigate = (next: number) => {\n    setCurrent(next);\n    onNavigate?.(next);\n  };\n  const retry = () => {\n    setReadyMounted(true);\n    setPresentation('ready');\n    onRetry?.();\n  };\n  return (\n    <TemplateFrame index={current} assetsBase={assetsBase} preview={preview} navigate={navigate}>\n      {presentation !== 'ready' && (\n        <DataState\n          state={presentation}\n          onRetry={retry}\n          emptyMessage=\"There are no records in this example. Reset it to explore the template.\"\n        />\n      )}\n      {readyMounted && (\n        <motion.div\n          ref={contentRef}\n          hidden={presentation !== 'ready'}\n          inert={presentation !== 'ready'}\n          key={current}\n          className=\"hxr-page-content\"\n          initial={reduce !== false ? false : { opacity: 0, y: 4 }}\n          animate={{ opacity: 1, y: 0 }}\n          transition={{ duration: 0.18 }}\n        >\n          {current === 0 ? (\n            <MembershipContent assetsBase={assetsBase} />\n          ) : current === 1 ? (\n            <BusinessContent assetsBase={assetsBase} />\n          ) : current === 2 || current === 4 ? (\n            <TradeContent assetsBase={assetsBase} />\n          ) : (\n            <SettingsContent assetsBase={assetsBase} profile={current === 5} />\n          )}\n        </motion.div>\n      )}\n    </TemplateFrame>\n  );\n}\nexport function MembershipDashboard(props: TemplateProps) {\n  return <TemplatePreview {...props} index={0} />;\n}\nexport function BusinessDashboard(props: TemplateProps) {\n  return <TemplatePreview {...props} index={1} />;\n}\nexport function TradeHistory(props: TemplateProps) {\n  return <TemplatePreview {...props} index={2} />;\n}\nexport function PersonalInformation(props: TemplateProps) {\n  return <TemplatePreview {...props} index={3} />;\n}\nexport function TradeHistoryHeader(props: TemplateProps) {\n  return <TemplatePreview {...props} index={4} />;\n}\nexport function ProfileEditor(props: TemplateProps) {\n  return <TemplatePreview {...props} index={5} />;\n}\n",
  "src/agent-controls.ts": "/** Serializable, uncontrolled initial props for the public agent-pattern playgrounds. */\nexport type AgentControl = {\n  key: string;\n  label: string;\n  defaultValue: string | number | boolean;\n  values?: readonly (string | number)[];\n};\nexport const agentControls: Record<string, AgentControl[]> = {\n  'auth-card': [\n    {\n      key: 'layout',\n      label: 'Provider layout',\n      defaultValue: 'stacked',\n      values: ['stacked', 'inline', 'grid'],\n    },\n    {\n      key: 'mode',\n      label: 'Initial auth view',\n      defaultValue: 'signin',\n      values: ['signin', 'signup', 'verify'],\n    },\n    { key: 'codeLength', label: 'Verification digits', defaultValue: 6, values: [4, 6, 8] },\n    { key: 'centered', label: 'Centered heading', defaultValue: false },\n  ],\n  'agent-thinking': [\n    {\n      key: 'defaultVariant',\n      label: 'Thinking animation',\n      defaultValue: 'wave',\n      values: ['wave', 'spin', 'stars', 'infinity'],\n    },\n    { key: 'tone', label: 'Animation tone', defaultValue: 'accent', values: ['accent', 'subtle'] },\n    { key: 'showTimer', label: 'Show elapsed time', defaultValue: true },\n    { key: 'shimmer', label: 'Shimmer text', defaultValue: true },\n  ],\n  'agent-limits-card': [\n    { key: 'defaultExpanded', label: 'Initially expanded', defaultValue: false },\n  ],\n  'agent-progress': [\n    { key: 'autoRun', label: 'Auto-run steps', defaultValue: true },\n    {\n      key: 'stepDuration',\n      label: 'Step duration',\n      defaultValue: 2400,\n      values: [800, 1600, 2400, 4000],\n    },\n  ],\n  'composer-loader': [\n    { key: 'speed', label: 'Rim duration', defaultValue: 4.5, values: [3, 4.5, 6] },\n    { key: 'reverse', label: 'Reverse rim direction', defaultValue: false },\n    { key: 'radius', label: 'Composer radius', defaultValue: 26, values: [16, 26, 40] },\n  ],\n  questionnaire: [{ key: 'autoAdvance', label: 'Auto-advance answers', defaultValue: true }],\n  'task-list': [\n    {\n      key: 'mode',\n      label: 'Task presentation',\n      defaultValue: 'stream',\n      values: ['stream', 'editor'],\n    },\n    { key: 'autoRun', label: 'Auto-reveal tasks', defaultValue: true },\n    { key: 'collapseOnComplete', label: 'Collapse completed tasks', defaultValue: false },\n  ],\n  'web-search': [{ key: 'autoRun', label: 'Auto-reveal sources', defaultValue: true }],\n};\n",
  "src/agent-patterns.css": ".hp-pattern,\n.hp-pattern * {\n  box-sizing: border-box;\n}\n.hp-pattern {\n  width: 100%;\n  min-width: 0;\n  font: 14px/20px var(--hu-font);\n  color: var(--hu-text);\n}\n.hp-pattern h3 {\n  font-size: 18px;\n  line-height: 28px;\n  letter-spacing: -0.02em;\n  margin: 0;\n  font-weight: 600;\n}\n.hp-pattern p {\n  line-height: 22px;\n  color: var(--hu-muted);\n}\n.hp-note,\n.hp-status {\n  font-size: 12px;\n  line-height: 20px !important;\n  color: var(--hu-muted);\n  margin: 12px 0 0;\n}\n.hp-status {\n  min-height: 20px;\n}\n.hp-error {\n  color: var(--hu-error) !important;\n  font-size: 13px;\n}\n.hp-textarea-label {\n  display: grid;\n  gap: 6px;\n  font-size: 14px;\n  font-weight: 500;\n}\n.hp-textarea-label textarea,\n.hp-pattern textarea {\n  font: 14px/22px var(--hu-font);\n  padding: 10px 12px;\n  border: 1px solid var(--hu-border);\n  border-radius: 8px;\n  background: var(--hu-bg);\n  color: var(--hu-text);\n  width: 100%;\n  resize: vertical;\n}\n.hp-pattern button:focus-visible,\n.hp-pattern input:focus-visible,\n.hp-pattern textarea:focus-visible,\n.hp-pattern a:focus-visible,\n.hp-pattern summary:focus-visible {\n  outline: 2px solid var(--hu-brand-text);\n  outline-offset: 3px;\n}\n.hp-pattern button:disabled,\n.hp-pattern input:disabled,\n.hp-pattern textarea:disabled {\n  opacity: 0.5;\n  cursor: not-allowed;\n}\n.hp-agent-creator {\n  display: grid;\n  gap: 16px;\n  max-width: 390px;\n  margin: auto;\n  padding: 24px;\n  border: 1px solid var(--hu-line);\n  border-radius: 20px;\n  background: var(--hu-bg);\n}\n.hp-agent-creator > h3 {\n  text-align: center;\n  font-size: 16px;\n}\n.hp-avatar-stage {\n  display: grid;\n  place-items: center;\n  min-height: 150px;\n  padding: 20px;\n}\n.hp-avatar {\n  --agent-color: #00ced1;\n  position: relative;\n  width: 110px;\n  height: 100px;\n  display: grid;\n  place-items: center;\n  background: var(--agent-color);\n  box-shadow:\n    inset 0 0 0 1px #0002,\n    inset 0 -8px 10px #0001,\n    0 8px 18px #0000000d;\n  border-radius: 38% 42% 30% 30%;\n}\n.hp-avatar-cloud:before,\n.hp-avatar-cloud:after {\n  content: '';\n  position: absolute;\n  border-radius: 50%;\n  background: var(--agent-color);\n  z-index: 0;\n}\n.hp-avatar-cloud:before {\n  width: 65px;\n  height: 65px;\n  top: -19px;\n  left: 17px;\n}\n.hp-avatar-cloud:after {\n  width: 45px;\n  height: 45px;\n  top: -5px;\n  right: -6px;\n}\n.hp-avatar-circle {\n  border-radius: 50%;\n  height: 110px;\n}\n.hp-avatar-square {\n  border-radius: 20px;\n}\n.hp-avatar-diamond {\n  border-radius: 20px;\n  clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);\n  height: 110px;\n}\n.hp-avatar-heart {\n  border-radius: 40% 40% 25% 25%;\n  clip-path: polygon(50% 95%, 5% 48%, 5% 20%, 25% 5%, 50% 20%, 75% 5%, 95% 20%, 95% 48%);\n}\n.hp-avatar-star {\n  clip-path: polygon(\n    50% 0,\n    65% 32%,\n    100% 38%,\n    75% 62%,\n    80% 100%,\n    50% 80%,\n    20% 100%,\n    25% 62%,\n    0 38%,\n    35% 32%\n  );\n  height: 110px;\n}\n.hp-avatar-shield {\n  border-radius: 20px 20px 50% 50%;\n  height: 115px;\n}\n.hp-avatar-hexagon {\n  clip-path: polygon(25% 5%, 75% 5%, 100% 50%, 75% 95%, 25% 95%, 0 50%);\n}\n.hp-avatar-pill {\n  border-radius: 55px;\n  height: 85px;\n}\n.hp-face {\n  position: relative;\n  z-index: 1;\n  display: flex;\n  align-items: center;\n  gap: 18px;\n}\n.hp-face > i {\n  height: 17px;\n  width: 10px;\n  background: #102020;\n  border-radius: 50%;\n  display: block;\n}\n.hp-face > b {\n  position: absolute;\n  width: 22px;\n  height: 9px;\n  border-bottom: 3px solid #102020;\n  border-radius: 50%;\n  left: 9px;\n  top: 24px;\n}\n.hp-face-focused > i {\n  border-radius: 3px;\n  height: 13px;\n}\n.hp-face-focused > b {\n  border-radius: 0;\n  height: 0;\n  top: 25px;\n  border-width: 2px;\n}\n.hp-face-surprised > b {\n  width: 12px;\n  height: 16px;\n  background: #102020;\n  border: 0;\n  border-radius: 50%;\n  left: 15px;\n  top: 22px;\n}\n.hp-face-sleepy > i {\n  height: 3px;\n  border-radius: 2px;\n}\n.hp-face-sleepy > b {\n  width: 12px;\n  left: 15px;\n  height: 6px;\n}\n.hp-shape-picker {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: center;\n  gap: 8px;\n}\n.hp-shape-picker > button {\n  display: grid;\n  place-items: center;\n  padding: 5px;\n  border: 1px solid transparent;\n  background: transparent;\n  border-radius: 8px;\n  cursor: pointer;\n  width: 34px;\n  height: 34px;\n}\n.hp-shape-picker > button[aria-pressed='true'] {\n  background: var(--hu-bg-secondary);\n  border-color: var(--hu-border);\n}\n.hp-shape-swatch {\n  display: block;\n  width: 23px;\n  height: 23px;\n  border-radius: 6px;\n}\n.hp-shape-circle {\n  border-radius: 50%;\n}\n.hp-shape-cloud {\n  border-radius: 45% 50% 28% 28%;\n}\n.hp-shape-diamond {\n  transform: rotate(45deg);\n  width: 19px;\n  height: 19px;\n}\n.hp-shape-heart {\n  clip-path: polygon(50% 95%, 5% 48%, 5% 20%, 25% 5%, 50% 20%, 75% 5%, 95% 20%, 95% 48%);\n}\n.hp-shape-star {\n  clip-path: polygon(\n    50% 0,\n    65% 32%,\n    100% 38%,\n    75% 62%,\n    80% 100%,\n    50% 80%,\n    20% 100%,\n    25% 62%,\n    0 38%,\n    35% 32%\n  );\n}\n.hp-shape-shield {\n  border-radius: 6px 6px 50% 50%;\n}\n.hp-shape-hexagon {\n  clip-path: polygon(25% 5%, 75% 5%, 100% 50%, 75% 95%, 25% 95%, 0 50%);\n}\n.hp-shape-pill {\n  border-radius: 14px;\n  height: 17px;\n}\n.hp-expression-picker {\n  display: flex;\n  gap: 6px;\n  flex-wrap: wrap;\n  justify-content: center;\n}\n.hp-expression-picker .hu-button {\n  font-size: 11px;\n  padding-inline: 8px;\n  min-height: 30px;\n}\n.hp-expression-picker .hu-button[aria-pressed='true'] {\n  border-color: var(--hu-brand-text);\n}\n.hp-colors {\n  display: flex;\n  gap: 10px;\n  justify-content: center;\n  border: 1px solid var(--hu-line);\n  padding: 10px;\n  border-radius: 24px;\n}\n.hp-colors > button {\n  height: 23px;\n  width: 23px;\n  border-radius: 50%;\n  border: 2px solid var(--hu-bg);\n  box-shadow: 0 0 0 1px var(--hu-border);\n  cursor: pointer;\n  flex-shrink: 0;\n}\n.hp-colors > button[aria-pressed='true'] {\n  box-shadow: 0 0 0 2px var(--hu-text);\n}\n.hp-voice {\n  display: flex;\n  align-items: flex-end;\n  gap: 12px;\n}\n.hp-voice > .hu-field {\n  flex: 1;\n}\n.hp-limits {\n  max-width: 460px;\n  margin: auto;\n  background: var(--hu-bg-secondary);\n  border-radius: 12px;\n  padding: 18px;\n}\n.hp-limits-heading {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  justify-content: space-between;\n  width: 100%;\n  padding: 0;\n  border: 0;\n  background: none;\n  color: var(--hu-muted);\n  font: 12px/20px var(--hu-font);\n  cursor: pointer;\n}\n.hp-limits-heading > strong {\n  font-weight: 500;\n  margin-inline-start: auto;\n  color: var(--hu-text);\n}\n.hp-context-bar {\n  height: 6px;\n  border-radius: 3px;\n  background: var(--hu-line);\n  display: flex;\n  overflow: hidden;\n  margin: 10px 0 16px;\n}\n.hp-context-bar > span {\n  display: block;\n  height: 100%;\n  flex-shrink: 0;\n}\n.hp-context-breakdown {\n  display: grid;\n  gap: 9px;\n  padding: 0 0 16px;\n}\n.hp-context-breakdown > div {\n  display: grid;\n  grid-template-columns: 8px 1fr auto 60px;\n  align-items: center;\n  gap: 8px;\n  font-size: 12px;\n  line-height: 18px;\n}\n.hp-context-breakdown i {\n  width: 7px;\n  height: 7px;\n  border-radius: 2px;\n  background: var(--hu-border);\n}\n.hp-context-breakdown strong {\n  font-size: 11px;\n  color: var(--hu-muted);\n  font-weight: 400;\n}\n.hp-context-breakdown small {\n  text-align: right;\n  font-size: 11px;\n}\n.hp-context-breakdown details {\n  font-size: 12px;\n  color: var(--hu-muted);\n  margin-top: 6px;\n}\n.hp-context-breakdown summary {\n  cursor: pointer;\n}\n.hp-context-breakdown ul {\n  padding-inline-start: 20px;\n  line-height: 24px;\n}\n.hp-usage-limits {\n  border-top: 1px solid var(--hu-line);\n  padding-top: 12px;\n  display: grid;\n  gap: 12px;\n}\n.hp-usage-limits h4 {\n  font-size: 11px;\n  color: var(--hu-muted);\n  font-weight: 500;\n  margin: 0;\n}\n.hp-usage-limits > div > div {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  font-size: 11px;\n  line-height: 18px;\n  margin-bottom: 4px;\n}\n.hp-usage-limits span {\n  margin-inline-start: auto;\n  color: var(--hu-muted);\n  font-size: 10px;\n}\n.hp-usage-limits b {\n  font-weight: 500;\n}\n.hp-usage-limits progress,\n.hp-agent-progress > progress,\n.hp-task-list progress {\n  appearance: none;\n  width: 100%;\n  height: 5px;\n  border: 0;\n  background: var(--hu-line);\n  border-radius: 4px;\n  display: block;\n  accent-color: var(--hu-brand);\n}\n.hp-usage-limits progress::-webkit-progress-bar,\n.hp-agent-progress > progress::-webkit-progress-bar,\n.hp-task-list progress::-webkit-progress-bar {\n  background: var(--hu-line);\n  border-radius: 4px;\n}\n.hp-usage-limits progress::-webkit-progress-value,\n.hp-agent-progress > progress::-webkit-progress-value,\n.hp-task-list progress::-webkit-progress-value {\n  background: var(--hu-brand);\n  border-radius: 4px;\n}\n.hp-range-label {\n  display: grid;\n  gap: 6px;\n  font-size: 11px;\n  color: var(--hu-muted);\n  margin-top: 16px;\n}\n.hp-range-label input {\n  width: 100%;\n  accent-color: var(--hu-brand);\n}\n.hp-agent-progress {\n  max-width: 480px;\n  margin: auto;\n  padding: 20px;\n  border: 1px solid var(--hu-line);\n  border-radius: 12px;\n  background: var(--hu-bg);\n}\n.hp-agent-progress > header {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 16px;\n  font-size: 13px;\n  margin-bottom: 12px;\n}\n.hp-agent-progress > header > span {\n  color: var(--hu-muted);\n  font-size: 12px;\n}\n.hp-agent-progress > ol {\n  list-style: none;\n  margin: 24px 0;\n  padding: 0;\n  display: grid;\n  gap: 20px;\n}\n.hp-agent-progress > ol > li {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  color: var(--hu-muted);\n}\n.hp-agent-progress > ol > li > span {\n  height: 28px;\n  width: 28px;\n  display: grid;\n  place-items: center;\n  border: 1px solid var(--hu-border);\n  border-radius: 50%;\n  flex-shrink: 0;\n}\n.hp-agent-progress > ol > li[aria-current='step'] {\n  color: var(--hu-text);\n}\n.hp-agent-progress > ol > li[aria-current='step'] > span {\n  border-color: var(--hu-brand-text);\n  color: var(--hu-brand-text);\n}\n.hp-agent-progress > ol > li[data-complete='true'] > span {\n  background: var(--hu-brand);\n  color: var(--hu-on-brand);\n  border-color: var(--hu-brand);\n}\n.hp-agent-progress > ol strong {\n  font-size: 13px;\n  font-weight: 500;\n}\n.hp-agent-progress > ol small {\n  display: block;\n  font-size: 12px;\n  margin-top: 2px;\n  color: var(--hu-muted);\n}\n.hp-thinking-example {\n  display: grid;\n  justify-items: center;\n  gap: 20px;\n  padding: 24px 0;\n}\n.hp-thinking {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n}\n.hp-thinking > strong {\n  font-weight: 500;\n}\n.hp-thinking > span {\n  font-size: 12px;\n  color: var(--hu-muted);\n}\n.hp-thinking-symbol {\n  display: flex;\n  align-items: center;\n  gap: 3px;\n  color: var(--hu-brand-text);\n  min-width: 34px;\n  min-height: 28px;\n  justify-content: center;\n}\n.hp-thinking-symbol > i {\n  display: block;\n  height: 5px;\n  width: 5px;\n  background: currentColor;\n  border-radius: 50%;\n}\n.hp-thinking-stars .hp-thinking-symbol > i {\n  height: auto;\n  width: auto;\n  background: none;\n  font-size: 18px;\n  font-style: normal;\n}\n.hp-thinking-infinity .hp-thinking-symbol > span {\n  font-size: 36px;\n  line-height: 30px;\n}\n.hp-pulse {\n  animation: hp-pulse 1.4s ease-in-out infinite;\n}\n@keyframes hp-pulse {\n  50% {\n    opacity: 0.35;\n    transform: scale(0.9);\n  }\n}\n.hp-thinking-controls {\n  display: flex;\n  gap: 8px;\n  flex-wrap: wrap;\n  justify-content: center;\n}\n.hp-thinking-controls [aria-pressed='true'] {\n  border-color: var(--hu-brand-text);\n}\n.hp-auth-card {\n  max-width: 380px;\n  margin: auto;\n  padding: 28px;\n  border: 1px solid var(--hu-line);\n  border-radius: 16px;\n  background: var(--hu-bg);\n}\n.hp-auth-brand {\n  display: flex;\n  gap: 8px;\n  align-items: center;\n  font-size: 22px;\n  color: var(--hu-brand-text);\n  margin-bottom: 24px;\n}\n.hp-auth-brand > strong {\n  color: var(--hu-text);\n  font-size: 16px;\n}\n.hp-auth-card > .hu-tabs {\n  margin-bottom: 24px;\n}\n.hp-auth-card .hu-tabs [role='tabpanel'] {\n  padding: 0;\n}\n.hp-auth-card p {\n  margin: 8px 0 20px;\n  font-size: 13px;\n}\n.hp-auth-card form {\n  display: grid;\n  gap: 16px;\n}\n.hp-auth-card form > .hu-button {\n  width: 100%;\n}\n.hp-auth-providers {\n  margin-top: 24px;\n  text-align: center;\n}\n.hp-auth-providers > span {\n  display: block;\n  font-size: 12px;\n  color: var(--hu-muted);\n  margin-bottom: 16px;\n}\n.hp-auth-providers > div {\n  display: flex;\n  gap: 12px;\n}\n.hp-auth-providers .hu-button {\n  flex: 1;\n}\n.hp-composer-example {\n  max-width: 660px;\n  margin: auto;\n}\n.hp-composer-card {\n  position: relative;\n  border: 1px solid var(--hu-border);\n  border-radius: 24px;\n  background: var(--hu-bg);\n  box-shadow: 0 2px 6px #00000008;\n  padding: 16px;\n}\n.hp-composer-card > textarea {\n  border: 0;\n  background: transparent;\n  resize: vertical;\n  min-height: 72px;\n  padding: 4px 0;\n  font-size: 14px;\n  outline-offset: 4px;\n}\n.hp-composer-toolbar {\n  display: flex;\n  align-items: flex-end;\n  justify-content: space-between;\n  gap: 16px;\n}\n.hp-composer-toolbar > div {\n  display: flex;\n  align-items: flex-end;\n  gap: 10px;\n  flex-wrap: wrap;\n}\n.hp-composer-toolbar .hu-field {\n  width: 145px;\n}\n.hp-composer-toolbar .hu-field > label {\n  font-size: 10px;\n  line-height: 16px;\n  color: var(--hu-muted);\n}\n.hp-composer-toolbar .hu-input-wrap {\n  height: 32px;\n  border: 0;\n  border-radius: 16px;\n  background: var(--hu-bg-secondary);\n  padding-inline: 10px;\n  box-shadow: none;\n}\n.hp-composer-toolbar .hu-field select {\n  font-size: 12px;\n}\n.hp-composer-toolbar > .hu-button {\n  border-radius: 50%;\n  min-height: 36px;\n  min-width: 36px;\n  padding-inline: 10px;\n}\n.hp-composer-context {\n  height: 34px;\n  margin: 0 20px;\n  padding: 8px 12px;\n  border-radius: 12px 12px 0 0;\n  background: var(--hu-bg-secondary);\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  font-size: 10px;\n  color: var(--hu-muted);\n}\n.hp-composer-context > label {\n  margin-inline-start: auto;\n  display: flex;\n  align-items: center;\n  gap: 6px;\n}\n.hp-composer-context input {\n  width: 60px;\n  accent-color: var(--hu-brand);\n  height: 8px;\n}\n.hp-composer-context b {\n  font-weight: 500;\n  min-width: 24px;\n}\n.hp-composer-working {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  margin: 0 0 16px;\n  color: var(--hu-muted);\n  font-size: 12px;\n}\n.hp-composer-uploads {\n  margin-bottom: 16px;\n}\n.hp-composer-uploads .ha-upload {\n  padding: 16px;\n}\n.hp-composer-uploads .ha-upload > span {\n  height: 28px;\n  width: 28px;\n  font-size: 18px;\n}\n.hp-composer-uploads .ha-upload small {\n  font-size: 10px;\n}\n.hp-composer-uploads .ha-status {\n  font-size: 10px;\n  min-height: 0;\n  margin-top: 8px;\n}\n.hp-composer-messages {\n  list-style: none;\n  display: grid;\n  gap: 10px;\n  padding: 0;\n  margin: 16px 0;\n}\n.hp-composer-messages > li {\n  border: 1px solid var(--hu-line);\n  border-radius: 10px;\n  padding: 12px;\n  background: var(--hu-bg-secondary);\n}\n.hp-composer-messages strong {\n  font-size: 12px;\n  font-weight: 500;\n}\n.hp-composer-messages p {\n  margin: 6px 0;\n  white-space: pre-wrap;\n  overflow-wrap: anywhere;\n}\n.hp-composer-messages small {\n  font-size: 11px;\n  color: var(--hu-muted);\n  overflow-wrap: anywhere;\n}\n.hp-composer-loader {\n  max-width: 660px;\n  margin: auto;\n}\n.hp-loader-stage {\n  position: relative;\n  overflow: hidden;\n  min-height: 130px;\n  display: grid;\n  place-items: center;\n  text-align: center;\n  margin-bottom: 16px;\n  border: 1px solid var(--hu-line);\n  border-radius: 16px;\n  background: var(--hu-bg-secondary);\n}\n.hp-loader-stage > div {\n  position: relative;\n  padding: 24px;\n  background: var(--hu-bg-secondary);\n  border-radius: 16px;\n  z-index: 1;\n}\n.hp-loader-stage p {\n  font-size: 12px;\n  margin: 4px 0 0;\n}\n.hp-loader-orbit {\n  position: absolute;\n  width: 220px;\n  height: 220px;\n  border-radius: 50%;\n  background: conic-gradient(\n    from 20deg,\n    transparent 0 55%,\n    color-mix(in srgb, var(--hu-brand), transparent 70%) 65%,\n    var(--hu-brand) 95%,\n    transparent 100%\n  );\n}\n.hp-composer-loader > .hu-actions {\n  margin-top: 12px;\n}\n.hp-notification-center {\n  max-width: 620px;\n  margin: auto;\n  border: 1px solid var(--hu-line);\n  border-radius: 16px;\n  padding: 20px;\n  background: var(--hu-bg);\n}\n.hp-notification-center > header {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 16px;\n  margin-bottom: 20px;\n}\n.hp-notification-center h3 {\n  display: flex;\n  align-items: center;\n  flex-wrap: wrap;\n  gap: 8px;\n}\n.hp-notification-center > .hu-tabs {\n  margin-bottom: 16px;\n}\n.hp-notification-center .hu-tabs [role='tabpanel'] {\n  padding: 0;\n}\n.hp-notification-center ul {\n  list-style: none;\n  padding: 0;\n  margin: 16px 0 0;\n}\n.hp-notification-center ul > li {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  padding: 14px 0;\n  border-top: 1px solid var(--hu-line);\n}\n.hp-notification-center ul > li > button:first-child {\n  flex: 1;\n  text-align: start;\n  background: none;\n  border: 0;\n  padding: 0;\n  font: inherit;\n  color: var(--hu-text);\n  cursor: pointer;\n  min-width: 0;\n}\n.hp-notification-center li strong {\n  font-size: 13px;\n  font-weight: 500;\n  display: flex;\n  align-items: center;\n  gap: 8px;\n}\n.hp-notification-center li strong > i {\n  height: 6px;\n  width: 6px;\n  background: var(--hu-brand);\n  border-radius: 50%;\n  display: block;\n  flex-shrink: 0;\n}\n.hp-notification-center li p {\n  font-size: 12px;\n  margin: 4px 0;\n}\n.hp-notification-center li small {\n  font-size: 11px;\n  color: var(--hu-muted);\n}\n.hp-questionnaire {\n  max-width: 600px;\n  margin: auto;\n  padding: 20px;\n  border: 1px solid var(--hu-line);\n  border-radius: 16px;\n  background: var(--hu-bg);\n}\n.hp-questionnaire > header {\n  display: flex;\n  align-items: flex-start;\n  justify-content: space-between;\n  gap: 16px;\n  margin-bottom: 20px;\n}\n.hp-questionnaire > header > span {\n  font-size: 12px;\n  color: var(--hu-muted);\n  white-space: nowrap;\n}\n.hp-questionnaire > fieldset {\n  border: 0;\n  padding: 0;\n  margin: 0;\n  display: grid;\n  gap: 10px;\n}\n.hp-answer {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  padding: 12px;\n  border: 1px solid var(--hu-line);\n  border-radius: 8px;\n  cursor: pointer;\n}\n.hp-answer[data-selected='true'] {\n  border-color: var(--hu-brand-text);\n  background: var(--hu-bg-secondary);\n}\n.hp-answer > input {\n  accent-color: var(--hu-brand);\n  height: 16px;\n  width: 16px;\n  flex-shrink: 0;\n}\n.hp-answer > span {\n  flex: 1;\n}\n.hp-answer strong {\n  display: block;\n  font-size: 13px;\n  font-weight: 500;\n}\n.hp-answer small {\n  display: block;\n  color: var(--hu-muted);\n  font-size: 12px;\n  margin-top: 3px;\n}\n.hp-answer > b {\n  font-size: 11px;\n  color: var(--hu-muted);\n  font-weight: 400;\n}\n.hp-questionnaire > footer {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 16px;\n  margin-top: 20px;\n}\n.hp-questionnaire > footer nav {\n  display: flex;\n  gap: 4px;\n  flex-wrap: wrap;\n}\n.hp-questionnaire > footer nav > button {\n  font: 10px/18px var(--hu-font);\n  color: var(--hu-muted);\n  padding: 2px 6px;\n  border: 0;\n  border-radius: 10px;\n  background: transparent;\n  cursor: pointer;\n}\n.hp-questionnaire > footer nav > [aria-current='step'] {\n  background: var(--hu-bg-secondary);\n  color: var(--hu-brand-text);\n}\n.hp-questionnaire > footer > div {\n  display: flex;\n  gap: 6px;\n}\n.hp-questionnaire dl {\n  display: grid;\n  gap: 16px;\n}\n.hp-questionnaire dt {\n  font-weight: 500;\n  font-size: 13px;\n}\n.hp-questionnaire dd {\n  margin: 4px 0 0;\n  font-size: 12px;\n  color: var(--hu-muted);\n}\n.hp-task-list {\n  max-width: 640px;\n  margin: auto;\n  border: 1px solid var(--hu-line);\n  border-radius: 12px;\n  padding: 20px;\n  background: var(--hu-bg);\n}\n.hp-task-list > header > button {\n  width: 100%;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 16px;\n  border: 0;\n  background: none;\n  color: var(--hu-text);\n  padding: 0 0 12px;\n  font: inherit;\n  cursor: pointer;\n}\n.hp-task-list > header > button > span {\n  font-size: 12px;\n  color: var(--hu-muted);\n}\n.hp-task-list > .hu-field {\n  margin-top: 20px;\n}\n.hp-task-list > ul {\n  list-style: none;\n  padding: 0;\n  margin: 16px 0;\n  display: grid;\n  gap: 8px;\n}\n.hp-task-list > ul > li {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  border: 1px solid var(--hu-line);\n  border-radius: 8px;\n  padding: 10px;\n}\n.hp-task-list > ul > li > .hu-checkbox {\n  flex: 1;\n  min-width: 0;\n}\n.hp-task-list > ul > li > .hu-checkbox span {\n  font-size: 13px;\n}\n.hp-resource {\n  font-size: 10px;\n  color: var(--hu-muted);\n  border: 1px solid var(--hu-line);\n  border-radius: 4px;\n  padding: 3px 5px;\n  white-space: nowrap;\n}\n.hp-task-list > form {\n  display: flex;\n  align-items: flex-end;\n  gap: 12px;\n}\n.hp-task-list > form > .hu-field {\n  flex: 1;\n}\n.hp-web-search {\n  max-width: 640px;\n  margin: auto;\n  border: 1px solid var(--hu-line);\n  border-radius: 12px;\n  padding: 20px;\n  background: var(--hu-bg);\n}\n.hp-web-search > form {\n  display: flex;\n  align-items: flex-end;\n  gap: 12px;\n  margin-bottom: 20px;\n}\n.hp-web-search > form > .hu-field {\n  flex: 1;\n}\n.hp-search-heading {\n  width: 100%;\n  display: flex;\n  align-items: flex-start;\n  justify-content: space-between;\n  gap: 12px;\n  padding: 0 0 14px;\n  font: inherit;\n  color: var(--hu-text);\n  border: 0;\n  border-bottom: 1px solid var(--hu-line);\n  background: none;\n  text-align: start;\n  cursor: pointer;\n}\n.hp-search-heading > span {\n  font-size: 11px;\n  color: var(--hu-muted);\n  white-space: nowrap;\n}\n.hp-web-search > ol {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n.hp-web-search > ol > li {\n  border-bottom: 1px solid var(--hu-line);\n  padding: 14px 0;\n}\n.hp-web-search > ol > li > button {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  width: 100%;\n  padding: 0;\n  background: none;\n  border: 0;\n  font: inherit;\n  color: var(--hu-text);\n  text-align: start;\n  cursor: pointer;\n}\n.hp-site-mark {\n  height: 30px;\n  width: 30px;\n  display: grid;\n  place-items: center;\n  border: 1px solid var(--hu-border);\n  border-radius: 8px;\n  background: var(--hu-bg-secondary);\n  font-size: 14px;\n  font-weight: 600;\n  flex-shrink: 0;\n}\n.hp-web-search li button > span:nth-child(2) {\n  flex: 1;\n  min-width: 0;\n}\n.hp-web-search li strong {\n  font-size: 13px;\n  font-weight: 500;\n}\n.hp-web-search li small {\n  display: block;\n  font-size: 11px;\n  color: var(--hu-muted);\n  margin-top: 2px;\n}\n.hp-web-search li b {\n  font-weight: 400;\n  font-size: 11px;\n  color: var(--hu-muted);\n}\n.hp-web-search li > div {\n  padding-inline-start: 42px;\n}\n.hp-web-search li p {\n  font-size: 12px;\n  margin: 10px 0;\n}\n.hp-web-search li a {\n  color: var(--hu-brand-text);\n  font-size: 12px;\n}\n.hp-multi-chat {\n  display: grid;\n  grid-template-columns: 190px minmax(0, 1fr);\n  border: 1px solid var(--hu-line);\n  border-radius: 16px;\n  overflow: hidden;\n  min-height: 480px;\n  background: var(--hu-bg);\n}\n.hp-multi-chat > aside {\n  background: var(--hu-bg-secondary);\n  border-right: 1px solid var(--hu-line);\n  padding: 16px;\n  display: flex;\n  flex-direction: column;\n  gap: 8px;\n}\n.hp-multi-chat .hp-source-agent-navigation > strong {\n  font-size: 12px;\n  color: var(--hu-muted);\n  font-weight: 500;\n  margin-bottom: 12px;\n}\n.hp-multi-chat .hp-source-agent-navigation > button:not(.hu-button) {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  padding: 10px 8px;\n  border: 0;\n  background: none;\n  color: var(--hu-text);\n  text-align: start;\n  border-radius: 8px;\n  font: inherit;\n  cursor: pointer;\n}\n.hp-multi-chat .hp-source-agent-navigation > button[aria-current='page'] {\n  background: var(--hu-bg);\n  box-shadow: 0 1px 3px #00000012;\n}\n.hp-multi-chat .hp-source-agent-navigation > button > span:first-child {\n  height: 24px;\n  width: 24px;\n  border-radius: 8px;\n  flex-shrink: 0;\n}\n.hp-multi-chat .hp-source-agent-navigation strong {\n  font-size: 12px;\n  font-weight: 500;\n}\n.hp-multi-chat .hp-source-agent-navigation small {\n  display: block;\n  font-size: 10px;\n  color: var(--hu-muted);\n}\n.hp-multi-chat .hp-source-agent-navigation > .hu-button {\n  margin-top: auto;\n  font-size: 12px;\n}\n.hp-multi-conversation {\n  display: flex;\n  flex-direction: column;\n  padding: 20px;\n  min-width: 0;\n}\n.hp-multi-conversation > header {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 12px;\n  padding-bottom: 16px;\n  border-bottom: 1px solid var(--hu-line);\n}\n.hp-multi-conversation h3 {\n  font-size: 16px;\n}\n.hp-multi-conversation > [role='log'] {\n  flex: 1;\n  max-height: 350px;\n  overflow: auto;\n  padding: 16px 0;\n}\n.hp-multi-conversation article {\n  padding: 12px;\n  border: 1px solid var(--hu-line);\n  border-radius: 10px;\n  background: var(--hu-bg-secondary);\n  margin-bottom: 12px;\n  max-width: 94%;\n}\n.hp-multi-conversation article[data-author='user'] {\n  margin-inline-start: auto;\n  background: color-mix(in srgb, var(--hu-brand), var(--hu-bg) 92%);\n}\n.hp-multi-conversation article strong {\n  font-size: 12px;\n  font-weight: 500;\n}\n.hp-multi-conversation article p {\n  font-size: 13px;\n  line-height: 22px;\n  overflow-wrap: anywhere;\n  white-space: pre-wrap;\n  margin: 6px 0 0;\n}\n.hp-multi-conversation > form {\n  display: flex;\n  align-items: flex-end;\n  gap: 12px;\n  margin-top: 16px;\n}\n.hp-multi-conversation > form > .hu-field {\n  flex: 1;\n}\n@media (max-width: 700px) {\n  .hp-agent-creator {\n    padding: 20px;\n  }\n  .hp-colors {\n    gap: 8px;\n  }\n  .hp-colors > button {\n    height: 21px;\n    width: 21px;\n  }\n  .hp-limits {\n    padding: 16px;\n  }\n  .hp-limits-heading {\n    font-size: 11px;\n    gap: 4px;\n  }\n  .hp-usage-limits > div > div {\n    flex-wrap: wrap;\n    gap: 4px;\n  }\n  .hp-usage-limits span {\n    font-size: 9px;\n  }\n  .hp-usage-limits b {\n    margin-inline-start: auto;\n  }\n  .hp-auth-card {\n    padding: 20px;\n  }\n  .hp-composer-card {\n    padding: 14px;\n    border-radius: 18px;\n  }\n  .hp-composer-toolbar {\n    gap: 8px;\n  }\n  .hp-composer-toolbar > div {\n    gap: 6px;\n    flex: 1;\n  }\n  .hp-composer-toolbar .hu-field {\n    width: 100%;\n    max-width: 140px;\n  }\n  .hp-composer-context {\n    margin-inline: 12px;\n    gap: 8px;\n  }\n  .hp-composer-context > span:nth-child(2) {\n    display: none;\n  }\n  .hp-composer-context input {\n    width: 40px;\n  }\n  .hp-notification-center {\n    padding: 16px;\n  }\n  .hp-notification-center > header {\n    align-items: flex-start;\n    flex-direction: column;\n    gap: 8px;\n  }\n  .hp-notification-center ul > li {\n    gap: 6px;\n  }\n  .hp-notification-center li .hu-button {\n    font-size: 10px;\n    padding-inline: 6px;\n  }\n  .hp-questionnaire {\n    padding: 16px;\n  }\n  .hp-questionnaire > footer {\n    flex-wrap: wrap;\n    gap: 12px;\n  }\n  .hp-questionnaire > footer > div {\n    margin-inline-start: auto;\n  }\n  .hp-task-list {\n    padding: 16px;\n  }\n  .hp-task-list > ul > li {\n    flex-wrap: wrap;\n  }\n  .hp-resource {\n    order: 3;\n    margin-inline-start: 28px;\n  }\n  .hp-task-list > form {\n    flex-wrap: wrap;\n  }\n  .hp-task-list > form > .hu-field {\n    min-width: 100%;\n  }\n  .hp-web-search {\n    padding: 16px;\n  }\n  .hp-web-search > form {\n    flex-wrap: wrap;\n  }\n  .hp-web-search > form > .hu-field {\n    min-width: 100%;\n  }\n  .hp-search-heading {\n    flex-wrap: wrap;\n  }\n  .hp-multi-chat {\n    grid-template-columns: 1fr;\n  }\n  .hp-multi-chat > aside {\n    border-right: 0;\n    border-bottom: 1px solid var(--hu-line);\n    flex-direction: row;\n    overflow: auto;\n    align-items: center;\n    gap: 6px;\n    padding: 12px;\n  }\n  .hp-multi-chat > aside > strong {\n    display: none;\n  }\n  .hp-multi-chat > aside > button:not(.hu-button) {\n    white-space: nowrap;\n    flex-shrink: 0;\n    padding: 8px;\n  }\n  .hp-multi-chat > aside > button > span:first-child {\n    height: 20px;\n    width: 20px;\n  }\n  .hp-multi-chat > aside > .hu-button {\n    margin-top: 0;\n    white-space: nowrap;\n    flex-shrink: 0;\n  }\n  .hp-multi-conversation {\n    padding: 16px;\n  }\n  .hp-multi-conversation > header {\n    flex-wrap: wrap;\n  }\n  .hp-multi-conversation > form {\n    flex-wrap: wrap;\n  }\n  .hp-multi-conversation > form > .hu-field {\n    min-width: 100%;\n  }\n}\n@media (prefers-reduced-motion: reduce) {\n  .hp-pattern * {\n    animation-duration: 0s !important;\n    transition-duration: 0s !important;\n    scroll-behavior: auto !important;\n  }\n  .hp-pulse {\n    animation: none !important;\n  }\n}\n.hp-loader-orbit {\n  animation: hp-loader-rotate 4.5s linear infinite;\n  animation-play-state: paused;\n}\n.hp-composer-loader[data-motion-paused='true'] .hu-spinner {\n  animation-play-state: paused;\n}\n@keyframes hp-loader-rotate {\n  to {\n    transform: rotate(360deg);\n  }\n}\n@media (prefers-reduced-motion: reduce) {\n  .hp-loader-orbit {\n    animation: none !important;\n  }\n}\n/* Compact BoardUI-inspired agent surfaces, implemented with the shared React controls. */\n.hp-agent-creator{max-width:330px;gap:10px;padding:18px;border-radius:16px}\n.hp-agent-creator .hu-field label,.hp-agent-creator .hp-textarea-label{font-size:11px;line-height:16px}.hp-agent-creator .hu-input-wrap{min-height:30px}.hp-agent-creator .hu-field input,.hp-agent-creator .hu-field select{font-size:12px}.hp-agent-creator textarea{font-size:11px;line-height:16px;min-height:50px;padding:7px 9px}\n.hp-avatar-stage{position:relative;min-height:210px;padding:35px}.hp-avatar-stage>.hp-avatar{width:86px;height:78px;transform:scale(.85)}\n.hp-expression-orbit{position:absolute;inset:0;pointer-events:none}.hp-expression-orbit>button{position:absolute;left:50%;top:50%;width:38px;height:38px;margin:-19px;border:2px solid transparent;border-radius:50%;background:var(--hu-bg-secondary);padding:0;display:grid;place-items:center;transform:rotate(var(--orbit-angle)) translateX(85px) rotate(calc(-1*var(--orbit-angle)));pointer-events:auto;cursor:pointer}\n.hp-expression-orbit>button[aria-pressed=true]{border-color:var(--hu-brand-text)}.hp-expression-orbit .hp-avatar{width:27px;height:25px;box-shadow:none}.hp-expression-orbit .hp-avatar:before{width:17px;height:17px;top:-5px;left:5px}.hp-expression-orbit .hp-avatar:after{width:12px;height:12px;top:-2px;right:-2px}.hp-expression-orbit .hp-face{transform:scale(.3);transform-origin:center;width:90px;position:absolute;left:calc(50% - 45px)}\n.hp-agent-creator .hp-shape-picker{gap:4px}.hp-agent-creator .hp-note{font-size:10px;line-height:16px!important}.hp-agent-creator .hp-status:empty{display:none}.hp-agent-creator .hp-colors{gap:6px}\n.hp-progress-disclosure{display:flex;justify-content:space-between;align-items:center;gap:12px;border:0;padding:0;background:none;color:inherit;font:inherit;text-align:start;cursor:pointer;flex:1}.hp-progress-disclosure strong{font-weight:500}.hp-progress-disclosure span{color:var(--hu-muted)}\n.hp-agent-progress{padding:16px;max-width:460px}.hp-agent-progress>ol{gap:13px}.hp-agent-progress>ol>li>span{width:22px;height:22px}.hp-agent-progress>ol strong{font-size:12px}.hp-agent-progress>ol small{font-size:10px}.hp-agent-progress .hu-actions{gap:5px}.hp-agent-progress .hu-actions>.hu-button{font-size:11px;padding:5px 9px;min-height:28px}\n.hp-thinking-example{gap:12px;padding:8px 0}.hp-thinking-conversation{width:100%;max-width:560px;background:var(--hu-bg-secondary);padding:16px;border-radius:16px;display:grid;gap:14px}.hp-user-bubble{justify-self:end;max-width:230px;padding:10px 14px;background:var(--hu-bg);border-radius:14px;font-size:12px;margin:0!important}.hp-thinking{font-size:12px;gap:9px}.hp-thinking-symbol{position:relative;width:25px;height:25px;min-width:25px;min-height:25px}.hp-thinking-wave .hp-thinking-symbol{display:grid;grid-template-columns:repeat(3,4px);grid-template-rows:repeat(3,4px);gap:3px;align-content:center}.hp-thinking-wave .hp-thinking-symbol>i{height:4px;width:4px}.hp-thinking-spin .hp-thinking-symbol{display:grid;place-items:center}.hp-thinking-spin .hp-thinking-symbol>i{width:4px;height:4px}.hp-thinking-controls{gap:3px;order:-1}.hp-thinking-controls .hu-button{border:0;box-shadow:none;font-size:10px;padding:4px 7px;min-height:25px;background:none;color:var(--hu-muted)}.hp-thinking-controls [aria-pressed=true]{color:var(--hu-text);background:var(--hu-bg-secondary)}\n.hp-auth-card{max-width:340px;padding:22px}.hp-auth-brand{margin-bottom:14px}.hp-auth-card .hu-tabs [role=tablist]{gap:4px}.hp-auth-card .hu-tabs [role=tab]{font-size:11px;padding:5px 7px}.hp-auth-card form{gap:12px}.hp-auth-card p{font-size:11px;margin:5px 0 14px}.hp-auth-options{display:flex;align-items:center;justify-content:space-between;gap:5px;flex-wrap:wrap}.hp-auth-options>.hu-button{font-size:11px;min-height:20px;padding:0}.hp-auth-options .hu-checkbox-label{font-size:11px}.hp-auth-providers{margin-top:18px}.hp-auth-providers>div{display:grid;gap:7px}.hp-auth-providers .hu-button{font-size:12px;min-height:30px;padding:5px 8px}.hp-auth-providers>span{font-size:10px;margin-bottom:10px}.hp-provider-mark{font-weight:700;margin-inline-end:5px}.hp-provider-google{color:#2563eb}\n.hp-composer-card{border-radius:22px;padding:12px}.hp-composer-card>textarea{min-height:28px;font-size:12px;line-height:20px;padding:0}.hp-composer-panel .hp-composer-card>textarea,.hp-composer-uploads+textarea{min-height:60px}\n.hp-composer-toolbar{gap:8px;align-items:center}.hp-composer-toolbar>div{gap:4px;flex-wrap:nowrap;align-items:center;min-width:0}.hp-composer-toolbar .hu-field{width:auto;max-width:135px;min-width:0}.hp-composer-toolbar .hu-field>label{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}.hp-composer-toolbar .hu-input-wrap{height:28px;min-height:28px;padding-inline:6px;background:transparent}.hp-composer-toolbar .hu-field select{font-size:11px;padding-right:16px}.hp-composer-toolbar>div>.hu-button{border-radius:50%;font-size:18px;width:26px;min-width:26px;height:26px;min-height:26px;padding:0;background:var(--hu-bg-secondary)}.hp-composer-toolbar>.hu-button{min-width:30px;min-height:30px;height:30px;padding:0 8px;font-size:12px}\n.hp-composer-context{margin:0 16px;height:27px;padding:5px 8px}.hp-composer-context input{width:36px}.hp-composer-context>label{gap:3px}.hp-composer-context{gap:8px}\n.hp-composer-status-tab{margin:0 14px;color:var(--hu-muted);font-size:10px}.hp-composer-status-tab>button{border:0;background:none;color:inherit;font:inherit;display:flex;justify-content:space-between;width:100%;padding:6px 0;cursor:pointer}.hp-composer-status-tab>label{display:flex;gap:12px;align-items:center}.hp-composer-status-tab input{width:100px;accent-color:var(--hu-brand)}\n.hp-composer-example>.hp-status:empty{display:none}.hp-composer-example>.hp-note{font-size:10px;line-height:16px!important;margin-top:6px}.hp-composer-uploads{margin-bottom:8px}.hp-composer-uploads .ha-upload{padding:8px;border-radius:10px}.hp-composer-uploads .ha-upload>span{display:none}.hp-composer-uploads .ha-upload strong{font-size:11px}.hp-composer-uploads .ha-upload small{font-size:9px}.hp-composer-uploads .ha-upload-list{display:flex;flex-wrap:wrap;gap:5px;margin-top:5px}.hp-composer-uploads .ha-upload-list>li{font-size:10px;padding:4px 7px;max-width:100%}.hp-composer-uploads .ha-upload-list small{display:none}\n.hp-attachment-previews{display:flex;gap:7px;overflow:auto;margin-bottom:8px}.hp-attachment-previews figure{margin:0;width:64px;flex-shrink:0}.hp-attachment-previews img{width:64px;height:64px;object-fit:cover;border-radius:9px}.hp-attachment-previews figcaption{font-size:9px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.hp-loader-stage{min-height:70px;overflow:visible;border:0;background:none;margin-bottom:5px}.hp-loader-stage>.hp-loader-avatar-row{display:flex;justify-content:center;gap:12px;background:none;padding:10px;z-index:1}.hp-loader-avatar-row>.hp-avatar{width:25px;height:25px;box-shadow:none;border-radius:40%}.hp-loader-avatar-row>.hp-avatar:before{width:14px;height:14px;top:-5px;left:4px}.hp-loader-avatar-row>.hp-avatar:after{width:11px;height:11px;top:-2px;right:-2px}.hp-loader-avatar-row .hp-face{transform:scale(.25);transform-origin:center;width:90px;position:absolute;left:calc(50% - 45px)}.hp-loader-orbit{width:150px;height:50px;opacity:.28;filter:blur(12px);inset:18px auto auto calc(50% - 75px)}.hp-composer-loader>.hu-actions .hu-button{font-size:10px;min-height:25px;padding:4px 8px}.hp-composer-working{margin:5px 0 8px;font-size:10px}.hp-thinking-conversation .hp-composer-example{width:100%}\n.hp-notification-center{max-width:390px;padding:14px}.hp-notification-center>header{gap:7px;margin-bottom:10px;align-items:center}.hp-notification-center h3{font-size:14px;line-height:20px;gap:5px}.hp-notification-center .hu-badge{font-size:9px;line-height:15px}.hp-notification-center>header>.hu-button{font-size:10px;min-height:25px;padding:3px 6px}.hp-notification-center [role=tablist]{gap:2px;flex-wrap:wrap}.hp-notification-center [role=tab]{font-size:10px;padding:4px 6px;min-height:23px}.hp-notification-center .hu-field label{font-size:10px}.hp-notification-center .hu-input-wrap{min-height:27px}.hp-notification-center ul{margin-top:8px;display:grid;gap:6px}.hp-notification-center ul>li{position:relative;display:grid;grid-template-columns:minmax(0,1fr) auto;gap:5px;border:1px solid var(--hu-line);border-radius:10px;padding:9px}.hp-notification-center ul>li>button:first-child{grid-column:1/-1;display:grid;grid-template-columns:27px minmax(0,1fr);column-gap:7px}.hp-notification-avatar{grid-column:1;grid-row:1/4;width:26px;height:26px;display:grid;place-items:center;border-radius:50%;background:color-mix(in srgb,var(--hu-brand),var(--hu-bg) 80%);color:var(--hu-brand-text);font-size:11px}.hp-notification-center li strong{grid-column:2;font-size:11px;line-height:16px;gap:4px}.hp-notification-center li p{grid-column:2;font-size:10px;line-height:15px;margin:3px 0}.hp-notification-center li small{grid-column:2;font-size:9px}.hp-notification-tools{grid-column:1;display:flex;gap:4px;margin-inline-start:34px}.hp-notification-tools>.hu-button,.hp-notification-center li>.hu-button{font-size:9px;line-height:14px;min-height:22px;padding:3px 5px}.hp-notification-center>.hp-status:empty{display:none}\n.hp-questionnaire{max-width:500px;padding:16px}.hp-questionnaire>header{margin-bottom:12px;gap:8px}.hp-questionnaire h3{font-size:14px;line-height:21px}.hp-questionnaire>fieldset{gap:6px}.hp-answer{padding:8px;gap:8px}.hp-answer strong{font-size:11px}.hp-answer small{font-size:10px;line-height:15px;margin-top:1px}.hp-questionnaire>footer{margin-top:12px;gap:6px}.hp-questionnaire>footer .hu-button{font-size:10px;min-height:26px;padding:4px 7px}\n.hp-task-list,.hp-web-search{max-width:560px;padding:14px;font-size:12px;border-radius:14px}.hp-task-list>ul>li{padding:7px;border-radius:7px;gap:5px}.hp-task-list>ul>li>.hu-checkbox span{font-size:11px}.hp-task-list .hu-field>label,.hp-web-search .hu-field>label{font-size:10px}.hp-task-list .hu-input-wrap,.hp-web-search .hu-input-wrap{min-height:29px}.hp-task-list>header>.hu-button{font-size:10px;margin-top:4px;min-height:24px;padding:2px 0}.hp-task-list>ul{gap:5px;margin:10px 0}.hp-task-list>form{gap:7px}.hp-task-list>form>.hu-button,.hp-web-search>form>.hu-button{font-size:10px;min-height:29px;padding:5px 8px}.hp-task-list>header>button>span{font-size:10px}.hp-web-search>ol>li{padding:9px 0}.hp-web-search li strong{font-size:11px}.hp-web-search li small{font-size:10px}.hp-site-mark{height:24px;width:24px;font-size:11px;border-radius:6px}.hp-search-heading{font-size:12px;padding-bottom:9px}.hp-web-search>.hp-status,.hp-task-list>.hp-status{font-size:10px;line-height:16px!important}\n.hp-multi-chat>aside>.hu-field{margin-bottom:6px}.hp-multi-chat>aside .hu-field>label{font-size:10px}.hp-multi-chat>aside .hu-input-wrap{min-height:29px}.hp-multi-conversation>form{display:flex;position:relative;border:1px solid var(--hu-line);border-radius:18px;padding:12px;align-items:flex-end;gap:8px;background:var(--hu-bg);margin-top:auto}.hp-multi-draft{font-size:10px;flex:1;min-width:0;color:var(--hu-muted)}.hp-multi-draft>textarea{display:block;width:100%;border:0;padding:6px 0;font-size:13px;line-height:21px;min-height:80px;resize:vertical}.hp-multi-conversation>form>.hu-button{border-radius:50%;height:32px;min-height:32px;min-width:32px;font-size:11px;padding:5px 8px}.hp-multi-conversation>[role=log]{min-height:230px}\n@media(max-width:700px){.hp-agent-creator{padding:14px;gap:8px}.hp-agent-creator .hp-avatar-stage{min-height:190px}.hp-expression-orbit>button{transform:rotate(var(--orbit-angle)) translateX(75px) rotate(calc(-1*var(--orbit-angle)))}.hp-composer-toolbar .hu-field{width:auto;max-width:105px}.hp-composer-toolbar .hu-field select{font-size:10px;padding-right:10px}.hp-composer-toolbar>div{gap:0;flex-wrap:nowrap;min-width:0}.hp-composer-toolbar .hu-input-wrap{padding-inline:2px}.hp-composer-toolbar>div>.hu-button{min-width:22px;width:22px;flex-shrink:0}.hp-composer-toolbar{gap:3px}.hp-composer-context{margin-inline:10px}.hp-composer-card{padding:10px}.hp-notification-center>header{flex-direction:row;align-items:center;flex-wrap:wrap}.hp-notification-center{padding:10px}.hp-multi-chat>aside{flex-wrap:wrap}.hp-multi-chat>aside>.hu-field{width:100%;flex-shrink:0}.hp-multi-conversation>form{flex-wrap:nowrap}.hp-multi-draft>textarea{min-height:95px}.hp-loader-stage>.hp-loader-avatar-row{gap:9px}.hp-task-list>form>.hu-field{min-width:0}.hp-task-list>form{flex-wrap:nowrap}.hp-thinking-conversation{padding:12px}.hp-user-bubble{font-size:11px;max-width:180px}}\n.hp-thinking-infinity .hp-thinking-symbol{width:42px;min-width:42px}.hp-thinking-infinity svg{width:42px;height:25px;overflow:visible}.hp-infinity-track,.hp-infinity-trace{fill:none;stroke:var(--hu-brand-text);stroke-width:3;stroke-linecap:round}.hp-infinity-track{opacity:.2}.hp-infinity-trace{stroke-dasharray:35 150}.hp-infinity-running{animation:hp-infinity-flow 2s linear infinite}@keyframes hp-infinity-flow{to{stroke-dashoffset:-185}}\n/* Fresh live BoardUI comparison: complete face, picker, media, trail and working-state depth. */\n.hp-agent-creator{gap:8px;padding:16px;max-width:330px}.hp-agent-creator .hp-avatar-stage{height:218px;min-height:218px;padding:40px}\n.hp-expression-orbit>button{width:25px;height:25px;margin:-12.5px;border-width:1px;transform:rotate(var(--orbit-angle)) translateX(94px) rotate(calc(-1*var(--orbit-angle)))}\n.hp-expression-orbit .hp-avatar{width:21px;height:20px}.hp-expression-orbit .hp-face{transform:scale(.22)}\n.hp-agent-creator .hp-shape-picker{flex-wrap:nowrap;gap:1px}.hp-agent-creator .hp-shape-picker>button{width:27px;height:27px;padding:3px}.hp-shape-swatch{width:21px;height:21px}\n.hp-agent-creator>.hu-field{display:grid;grid-template-columns:60px minmax(0,1fr);align-items:center;gap:6px}.hp-agent-creator>.hu-field>.hu-input-wrap{height:30px;min-height:30px}.hp-agent-creator>.hp-textarea-label{display:grid;grid-template-columns:60px minmax(0,1fr);align-items:start;gap:6px}.hp-agent-creator .hp-voice{gap:5px}.hp-agent-creator .hp-voice .hu-field{max-width:125px}\n.hp-avatar-petal,.hp-shape-petal{border-radius:65% 25% 65% 25%}.hp-avatar-flower,.hp-shape-flower{clip-path:polygon(50% 3%,63% 15%,81% 10%,86% 29%,98% 40%,88% 55%,94% 73%,75% 80%,66% 98%,48% 88%,30% 96%,23% 77%,5% 69%,14% 51%,2% 33%,21% 25%,28% 7%)}.hp-avatar-slender,.hp-shape-slender{border-radius:48%;width:78px!important}.hp-shape-slender{width:14px!important}.hp-avatar-pocket,.hp-shape-pocket{border-radius:17% 17% 46% 46%}\n.hp-face-neutral>b{height:0;border-radius:0}.hp-face-angry>i:first-child{transform:rotate(-18deg)}.hp-face-angry>i:nth-child(2){transform:rotate(18deg)}.hp-face-angry>b,.hp-face-sad>b,.hp-face-worried>b{border-bottom:0;border-top:3px solid #102020;top:27px;height:10px}.hp-face-angry>i:before,.hp-face-worried>i:before,.hp-face-skeptical>i:before{content:'';position:absolute;width:15px;height:3px;background:#102020;top:-7px;left:-2px;border-radius:3px}.hp-face-thinking>i:first-child{height:9px}.hp-face-thinking>b{width:12px;left:22px;transform:rotate(-12deg)}.hp-face-shook>b{width:13px;height:17px;background:#102020;border:0;border-radius:50%;left:14px;top:22px}.hp-face-shook>i{height:20px}.hp-face-curious>i:first-child{height:20px}.hp-face-curious>i:nth-child(2){height:12px}.hp-face-curious>b{width:12px;left:17px}.hp-face-wink>i:first-child{height:3px;border-radius:2px}.hp-face-worried>i:first-child:before{transform:rotate(-20deg)}.hp-face-worried>i:nth-child(2):before{transform:rotate(20deg)}.hp-face-skeptical>i:first-child{height:5px}.hp-face-skeptical>b{height:0;transform:rotate(7deg);border-radius:0}.hp-face-excited>b{width:22px;height:16px;background:#102020;border-radius:25% 25% 50% 50%;border:0}.hp-face-calm>i{height:5px;border-radius:50% 50% 0 0;background:none;border-top:3px solid #102020}.hp-face-shy>i{height:11px}.hp-face-shy:after{content:'';position:absolute;width:13px;height:7px;background:#e2697d;opacity:.5;border-radius:50%;left:-7px;top:20px;box-shadow:42px 0 #e2697d}.hp-face-confused>i:first-child{transform:rotate(-22deg);height:12px}.hp-face-confused>i:nth-child(2){height:19px}.hp-face-confused>b{height:0;transform:rotate(-17deg);border-radius:0}\n.hp-avatar-custom-color{width:22px;height:22px;border-radius:50%;position:relative;overflow:hidden;background:conic-gradient(#06b6d4,#7847eb,#dd3992,#ef962d,#a3e635,#06b6d4);display:grid;place-items:center;cursor:pointer}.hp-avatar-custom-color input{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer}.hp-avatar-custom-color span{color:white;font-size:13px;pointer-events:none}\n@property --hp-step-angle{syntax:'<angle>';inherits:false;initial-value:0deg}\n.hp-agent-progress>ol{transition:opacity .2s ease;overflow:hidden}.hp-agent-progress>ol[data-collapsed=true]{height:0;margin:0;opacity:0;pointer-events:none}.hp-agent-progress>ol>li{animation:hp-task-enter .25s ease both}.hp-agent-progress>ol>li[aria-current=step]>span{position:relative;border:0;font-size:0;background:conic-gradient(var(--hu-brand-text) var(--hp-step-angle),var(--hu-line) 0);animation:hp-step-fill var(--step-duration) linear both}.hp-agent-progress>ol>li[aria-current=step]>span:after{content:'';position:absolute;inset:2px;border-radius:50%;background:var(--hu-bg)}.hp-agent-progress[data-running=false]>ol>li[aria-current=step]>span{animation-play-state:paused}@keyframes hp-step-fill{to{--hp-step-angle:360deg}}\n.hp-thinking-spin .hp-thinking-symbol{display:grid;grid-template-columns:repeat(3,4px);grid-template-rows:repeat(3,4px);gap:3px;align-content:center;justify-content:center}.hp-thinking-spin .hp-thinking-symbol>i{position:static!important;margin:0!important}.hp-thinking-stars .hp-thinking-symbol{min-width:64px;width:64px;gap:1px}.hp-thinking-stars .hp-thinking-symbol>i{font-size:15px}.hp-thinking[data-tone=subtle]{color:var(--hu-muted)}.hp-thinking[data-tone=subtle] .hp-thinking-symbol{color:var(--hu-muted)}.hp-thinking[data-shimmer=true]>strong{background:linear-gradient(110deg,var(--hu-muted) 20%,var(--hu-text) 40%,var(--hu-muted) 60%);background-size:200% 100%;background-clip:text;color:transparent;animation:hp-label-shimmer 2.4s linear infinite}@keyframes hp-label-shimmer{to{background-position:-200% 0}}\n.hp-auth-card.hp-auth-split{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);max-width:760px;padding:0;overflow:hidden}.hp-auth-main{min-width:0}.hp-auth-split .hp-auth-main{padding:24px}.hp-auth-media{background:var(--hu-bg-secondary);min-height:100%;min-width:0;overflow:hidden}.hp-auth-centered .hp-auth-brand{justify-content:center}.hp-auth-centered h3,.hp-auth-centered .hp-auth-main>.hu-tabs p{text-align:center}.hp-auth-card[data-layout=inline] .hp-auth-providers>div,.hp-auth-card[data-layout=grid] .hp-auth-providers>div{display:flex;gap:8px;justify-content:center}.hp-auth-card[data-layout=inline] .hp-auth-providers .hu-button{flex:0 0 34px;min-width:34px;width:34px;padding:4px}.hp-auth-card[data-layout=grid] .hp-auth-providers .hu-button{flex:1}.hp-auth-card[data-layout=inline] .hp-provider-name,.hp-auth-card[data-layout=grid] .hp-provider-name{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}.hp-auth-card[data-layout=inline] .hp-provider-mark,.hp-auth-card[data-layout=grid] .hp-provider-mark{margin:0}.hp-auth-footnote{font-size:10px!important;line-height:16px!important;color:var(--hu-muted)}\n.hp-auth-carousel{height:100%;min-height:320px;position:relative;background:var(--hu-bg-secondary);display:flex;flex-direction:column}.hp-auth-art{flex:1;position:relative;isolation:isolate;min-height:300px;background:color-mix(in srgb,var(--art-color),var(--hu-bg) 75%);overflow:hidden;display:grid;align-items:end;padding:25px;animation:hp-art-fade .45s ease}.hp-auth-art>img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:-1}.hp-auth-art>h3{font-size:28px;line-height:32px;letter-spacing:-1px;position:relative;z-index:2;color:var(--hu-text);max-width:210px}.hp-auth-art-shapes{position:absolute;inset:0}.hp-auth-art-shapes>i{position:absolute;display:block;background:var(--art-color);width:180px;height:180px;border-radius:40%;transform:rotate(32deg);top:40px;left:30px;box-shadow:inset 3px 3px 20px #ffffff70,15px 22px 30px #00000017}.hp-auth-art-shapes>i:nth-child(2){width:100px;height:100px;top:180px;left:160px;border-radius:50%;background:var(--hu-bg)}.hp-auth-art-shapes>i:nth-child(3){width:70px;height:70px;top:70px;left:220px;border-radius:20%}.hp-auth-carousel>footer{display:flex;align-items:center;justify-content:center;gap:10px;padding:10px;font-size:10px}.hp-auth-carousel button{border:1px solid var(--hu-line);background:var(--hu-bg);color:var(--hu-text);padding:2px 7px;border-radius:6px;cursor:pointer;font:inherit}@keyframes hp-art-fade{from{opacity:.3}to{opacity:1}}\n.hp-picker-trigger{display:inline-flex;min-width:0}.hp-picker-trigger>.hu-button{font-size:11px;min-height:26px;line-height:18px;padding:3px 5px;white-space:nowrap;color:var(--hu-muted);font-weight:400}\n.hp-composer-popover{border:1px solid var(--hu-line);border-radius:13px;background:var(--hu-bg);color:var(--hu-text);box-shadow:0 15px 35px #0002;font:12px/18px var(--hu-font);width:max-content;max-width:calc(100vw - 28px);max-height:min(480px,75vh);overflow:auto;padding:12px;outline:none;z-index:100}.hp-composer-popover[data-entering]{animation:hp-popover-in .16s ease-out}.hp-composer-popover [role=dialog]{outline:none}.hp-composer-popover h4{font-size:12px;line-height:18px;margin:0 0 8px;font-weight:500}.hp-composer-popover button:focus-visible,.hp-composer-popover input:focus-visible,.hp-composer-popover summary:focus-visible{outline:2px solid var(--hu-brand-text);outline-offset:2px}.hp-composer-popover .hu-button{font-size:11px}.hp-permission-picker{width:260px}.hp-permission-picker label{display:flex;gap:8px;padding:9px;border-radius:7px;cursor:pointer}.hp-permission-picker label:has(input:checked){background:var(--hu-bg-secondary)}.hp-permission-picker strong{font-weight:500;font-size:12px}.hp-permission-picker small{display:block;color:var(--hu-muted);font-size:10px;line-height:15px;margin-top:2px}.hp-permission-picker input,.hp-model-choices input{accent-color:var(--hu-brand-text)}.hp-permission-picker details{font-size:10px;margin-top:7px;color:var(--hu-muted)}.hp-permission-picker summary{cursor:pointer}.hp-permission-picker p{font-size:10px;line-height:15px}\n.hp-model-picker{width:470px;max-width:calc(100vw - 54px)}.hp-model-picker>header{padding-bottom:8px}.hp-model-picker>header p{font-size:9px;line-height:14px;color:var(--hu-muted);margin:0}.hp-model-body{display:grid;grid-template-columns:105px minmax(0,1fr);gap:12px}.hp-provider-rail{display:flex;flex-direction:column;gap:2px;max-height:290px;overflow:auto;border-right:1px solid var(--hu-line);padding-right:7px;scrollbar-width:thin}.hp-provider-rail>button{display:block;padding:6px 7px;text-align:start;border:0;border-radius:6px;background:none;color:var(--hu-muted);font:11px/17px var(--hu-font);cursor:pointer;flex-shrink:0}.hp-provider-rail>button[aria-selected=true]{background:var(--hu-bg-secondary);color:var(--hu-text)}.hp-model-body>[role=tabpanel]{min-width:0}.hp-model-body .hu-field label{font-size:10px}.hp-model-body .hu-input-wrap{height:29px;min-height:29px}.hp-model-choices{max-height:190px;overflow:auto;scrollbar-width:thin;margin-top:7px}.hp-model-choices label{display:flex;align-items:center;gap:6px;padding:7px 5px;font-size:11px;border-radius:6px;cursor:pointer}.hp-model-choices label:has(input:checked){background:var(--hu-bg-secondary)}.hp-current-model{margin-inline-start:auto;color:var(--hu-brand-text)}.hp-model-effort{border:0;margin:10px 0 7px;padding:0;display:flex;flex-wrap:wrap;gap:3px}.hp-model-effort legend{font-size:10px;color:var(--hu-muted);margin-bottom:4px}.hp-model-effort button{font:9px/15px var(--hu-font);padding:2px 4px;border:1px solid var(--hu-line);border-radius:5px;color:var(--hu-muted);background:var(--hu-bg);cursor:pointer}.hp-model-effort button[aria-pressed=true]{color:var(--hu-brand-text);border-color:var(--hu-brand-text)}\n.hp-composer-status-bar{display:flex;align-items:center;gap:2px;color:var(--hu-muted);min-width:0;flex-wrap:wrap;padding:3px 8px}.hp-composer-status-bar .hp-picker-trigger>.hu-button{font-size:9px;line-height:15px;min-height:20px;padding:1px 3px}.hp-composer-status-bar>.hp-picker-trigger:last-child{margin-inline-start:auto}.hp-composer-context{height:auto;min-height:26px;margin:0 14px;padding:1px 4px}.hp-composer-context>.hp-composer-status-bar{width:100%;padding:0}.hp-status-picker{display:grid;gap:4px;min-width:180px}.hp-status-picker>.hu-button{justify-content:flex-start}.hp-status-context{display:grid;gap:10px;font-size:11px;min-width:180px}.hp-status-context input{accent-color:var(--hu-brand-text);width:100%}.hp-composer-end{display:flex;align-items:center;gap:4px;flex-shrink:0}.hp-composer-end>.hu-button{border-radius:50%;min-width:28px;min-height:28px;padding:2px 7px}.hp-composer-uploads{padding:8px;border:1px dashed var(--hu-line);border-radius:10px;display:grid;gap:4px;margin-bottom:8px}.hp-composer-uploads>button:first-child{border:0;background:none;color:var(--hu-text);font:11px/17px var(--hu-font);cursor:pointer}.hp-composer-uploads>small{font-size:9px;color:var(--hu-muted);text-align:center}.hp-composer-uploads>.hu-button{font-size:10px;min-height:24px;padding:3px 7px}\n.hp-attachment-strip{display:flex;gap:7px;overflow:auto;padding:3px 2px 14px;margin:0 0 8px;scrollbar-width:thin}.hp-attachment-tile{position:relative;flex:0 0 56px;width:56px;height:56px;border-radius:10px;margin:0;background:var(--hu-bg-secondary);border:1px solid var(--hu-line);display:grid;place-items:center}.hp-attachment-tile>img{width:100%;height:100%;border-radius:9px;object-fit:cover}.hp-document-icon{font-size:20px;font-weight:600;color:var(--hu-brand-text)}.hp-attachment-tile[data-kind=spreadsheet] .hp-document-icon{color:var(--hu-success)}.hp-attachment-tile[data-kind=presentation] .hp-document-icon{color:#a16207}.hp-attachment-tile[data-kind=code] .hp-document-icon{font-size:14px}.hp-attachment-tile figcaption{font-size:8px;line-height:11px;max-width:56px;position:absolute;top:58px;left:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--hu-muted)}.hp-attachment-tile>button{position:absolute;right:-3px;top:-3px;background:var(--hu-bg);color:var(--hu-text);border:1px solid var(--hu-line);border-radius:50%;width:16px;height:16px;padding:0;font:11px/13px var(--hu-font);cursor:pointer;animation:hp-attachment-ready .2s ease}.hp-file-progress{position:absolute;inset:-2px;width:60px;height:60px;pointer-events:none;fill:none;stroke:var(--hu-brand-text);stroke-width:1.5px;transform:rotate(-90deg)}.hp-file-progress rect{transition:stroke-dasharray .045s linear}.hp-file-percent{position:absolute;right:0;top:0;font-size:9px;background:var(--hu-bg);border-radius:4px;padding:0 2px;color:var(--hu-brand-text)}@keyframes hp-attachment-ready{from{filter:blur(3px);opacity:0}to{filter:blur(0);opacity:1}}\n.hp-loader-surface{position:relative;border-radius:var(--loader-radius,26px)}.hp-loader-rim,.hp-loader-surface .hp-composer-card:before{content:'';position:absolute;inset:-1px;border:1.5px solid transparent;border-radius:inherit;background:var(--loader-gradient) border-box;mask:linear-gradient(#fff 0 0) padding-box,linear-gradient(#fff 0 0);mask-composite:exclude;pointer-events:none;opacity:0;transition:opacity .3s ease;z-index:1;animation:hp-rim-travel var(--loader-speed,4.5s) linear infinite;animation-play-state:var(--loader-play,paused);transform-origin:center}\n.hp-loader-surface:has(.hp-composer-card)>.hp-loader-rim{display:none}.hp-composer-loader[data-active=true] .hp-composer-card{background:color-mix(in srgb,var(--hu-bg),transparent 5%);backdrop-filter:blur(12px) saturate(1.2);box-shadow:inset 0 0 var(--loader-bloom,16px) color-mix(in srgb,var(--hu-brand),transparent 88%)}.hp-composer-loader[data-active=true] .hp-loader-rim,.hp-composer-loader[data-active=true] .hp-composer-card:before{opacity:var(--loader-intensity,.7)}.hp-composer-loader[data-reverse=true] .hp-loader-rim,.hp-composer-loader[data-reverse=true] .hp-composer-card:before{animation-direction:reverse}.hp-composer-loader[data-motion-paused=true] .hp-loader-rim,.hp-composer-loader[data-motion-paused=true] .hp-composer-card:before{animation-play-state:paused}\n@property --hp-rim-angle{syntax:'<angle>';inherits:false;initial-value:0deg}@keyframes hp-rim-travel{to{--hp-rim-angle:360deg}}\n.hp-loader-rim,.hp-loader-surface .hp-composer-card:before{background:conic-gradient(from var(--hp-rim-angle),transparent 0 240deg,#5eead4 270deg,#46baec 300deg,#e633a4 330deg,#00faa7 360deg) border-box}\n.hp-notification-group{grid-column:1/-1;margin:0 0 5px;color:var(--hu-muted);font-size:9px;font-weight:400;line-height:14px}.hp-notification-center li[data-status=error] .hp-notification-avatar{background:var(--hu-error-bg);color:var(--hu-error)}.hp-notification-center li[data-status=success] .hp-notification-avatar{background:color-mix(in srgb,var(--hu-success),var(--hu-bg) 88%);color:var(--hu-success)}.hp-notifications-panel{animation:hp-panel-in .18s ease}.hp-question-step{animation:hp-question-in .2s ease}@keyframes hp-question-in{from{opacity:0;transform:translateX(calc(var(--question-direction,1)*14px))}to{opacity:1;transform:translateX(0)}}.hp-questionnaire>header>.hu-button{min-height:20px;min-width:20px;padding:0;font-size:13px;margin-inline-start:auto}.hp-questionnaire>header>span{margin-inline-start:auto}.hp-questionnaire>header{align-items:center}\n.hp-task-stream>ul{border-inline-start:1px solid var(--hu-line);margin-inline-start:6px;padding-inline-start:13px}.hp-task-stream>ul>li{border:0;background:none;padding:7px 0;animation:hp-task-enter .24s ease}.hp-task-stream>ul>li .hu-checkbox{font-size:11px}.hp-task-stream>ul>li[data-active=true] .hu-checkbox-label{animation:hp-label-shimmer 2s linear infinite;background:linear-gradient(110deg,var(--hu-muted) 20%,var(--hu-text) 40%,var(--hu-muted) 60%);background-size:200% 100%;background-clip:text;color:transparent}.hp-task-steps{padding:5px 0 0 17px;list-style:none;width:100%;display:grid;gap:5px}.hp-task-steps>li{display:flex;flex-wrap:wrap;gap:5px;color:var(--hu-muted);font-size:10px;line-height:16px;animation:hp-task-enter .24s ease}.hp-task-editor,.hp-run-conversation{font-size:10px;color:var(--hu-muted);margin-top:10px}.hp-task-editor summary,.hp-run-conversation summary{cursor:pointer}.hp-task-editor>.hu-field{margin-top:10px}.hp-task-editor>form{display:flex;gap:8px;align-items:end;margin-top:8px}.hp-task-editor>form>.hu-field{flex:1;min-width:0}.hp-task-editor>form>.hu-button{font-size:10px;min-height:28px;padding:5px 8px}.hp-task-editor>div{margin-top:8px;display:flex;flex-wrap:wrap;gap:4px}.hp-task-editor>div>.hu-button{font-size:9px;min-height:22px;padding:2px 4px}.hp-run-conversation>.hp-composer-example{margin-top:12px}.hp-web-trail-query{display:flex;gap:8px;align-items:center;padding:8px 0;color:var(--hu-muted);font-size:11px}.hp-web-trail-query strong{font-size:11px;font-weight:500}.hp-web-trail-query small{display:block;font-size:10px;margin-top:2px}.hp-web-search>ol{margin-inline-start:7px;padding-inline-start:14px;border-inline-start:1px solid var(--hu-line)}.hp-web-search>ol>li{position:relative;animation:hp-task-enter .24s ease}.hp-web-search>ol>li:before{content:'';position:absolute;width:10px;height:1px;background:var(--hu-line);inset-inline-start:-14px;top:21px}.hp-web-search[data-running=true] .hp-search-heading strong{animation:hp-label-shimmer 2s linear infinite}\n@keyframes hp-task-enter{from{opacity:0;transform:translateY(5px);filter:blur(2px)}to{opacity:1;transform:translateY(0);filter:blur(0)}}@keyframes hp-popover-in{from{opacity:0;transform:translateY(5px)}to{opacity:1;transform:translateY(0)}}@keyframes hp-panel-in{from{opacity:0;transform:translateX(5px)}to{opacity:1;transform:translateX(0)}}\n@media(max-width:700px){.hp-agent-creator .hp-avatar-stage{min-height:210px;height:210px}.hp-expression-orbit>button{transform:rotate(var(--orbit-angle)) translateX(89px) rotate(calc(-1*var(--orbit-angle)))}.hp-model-picker{width:310px}.hp-model-body{grid-template-columns:82px minmax(0,1fr);gap:7px}.hp-provider-rail>button{font-size:10px;padding:5px 4px}.hp-model-choices label{font-size:10px;padding:6px 1px;gap:4px}.hp-composer-toolbar>.hp-composer-end{gap:1px;flex:0 0 auto}.hp-composer-end>.hu-button{min-width:23px;width:23px;padding:2px 4px}.hp-picker-trigger>.hu-button{font-size:10px;padding:3px 2px;max-width:105px;overflow:hidden;text-overflow:ellipsis}.hp-composer-status-bar{padding:3px}.hp-composer-status-bar .hp-picker-trigger>.hu-button{font-size:8px}.hp-auth-card.hp-auth-split{grid-template-columns:minmax(0,1fr);max-width:380px}.hp-auth-media{display:none}.hp-auth-split .hp-auth-main{padding:20px}.hp-agent-creator>.hu-field{grid-template-columns:53px minmax(0,1fr)}.hp-agent-creator>.hp-textarea-label{grid-template-columns:53px minmax(0,1fr)}.hp-agent-creator .hp-colors{gap:5px}}\n@media(prefers-reduced-motion:reduce){.hp-pattern *,.hp-composer-popover,.hp-composer-popover *,.hp-loader-rim,.hp-loader-surface .hp-composer-card:before{animation:none!important;transition:none!important;scroll-behavior:auto!important}.hp-thinking[data-shimmer=true]>strong{background:none;color:var(--hu-text)}.hp-task-stream>ul>li[data-active=true] .hu-checkbox-label{background:none;color:var(--hu-text)}}\n/* The rim's animated angle is evaluated on the wrapper, so custom palettes and arc lengths remain live. */\n.hp-composer-loader{animation:hp-rim-travel var(--loader-speed,4.5s) linear infinite;animation-play-state:var(--loader-play,paused)}.hp-composer-loader[data-reverse=true]{animation-direction:reverse}\n.hp-loader-rim,.hp-loader-surface .hp-composer-card:before{background:var(--loader-gradient) border-box;animation:none}\n.hp-composer-loader[data-active=true] .hp-composer-card{border-radius:var(--loader-radius,26px);box-shadow:inset 0 0 var(--loader-bloom,16px) color-mix(in srgb,var(--hu-brand) calc(var(--loader-bloom-strength,.3)*100%),transparent)}\n.hp-multi-composer{margin-top:auto;padding-top:16px}.hp-multi-composer .hp-composer-example{width:100%}.hp-multi-composer .hp-composer-card>textarea{min-height:90px}.hp-multi-composer .hp-note{font-size:9px}.hp-multi-composer .hp-composer-context{margin-inline:12px}\n@media(prefers-reduced-motion:reduce){.hp-composer-loader{animation:none!important}}\n.hp-notification-center ul>li>button:not(.hu-button){grid-column:1/-1;display:grid;grid-template-columns:27px minmax(0,1fr);column-gap:7px;text-align:start;background:transparent;border:0;padding:0;color:var(--hu-text);font:inherit;cursor:pointer;min-width:0;width:100%}\n/* BoardUI theme-role audit adoption; status and data identities do not follow action accent. */\n.hp-notification-center{background:var(--color-notification-center-background)}\n.hp-notification-avatar{background:var(--color-notification-information-background);color:var(--color-notification-information-foreground)}\n.hp-notification-center li[data-status=information] .hp-notification-avatar{background:var(--color-notification-information-background);color:var(--color-notification-information-foreground)}\n.hp-notification-center li[data-status=success] .hp-notification-avatar{background:var(--color-notification-success-background);color:var(--color-notification-success-foreground)}\n.hp-notification-center li[data-status=error] .hp-notification-avatar{background:var(--color-notification-error-background);color:var(--color-notification-error-foreground)}\n.hp-agent-progress>ol>li[aria-current=step]>span{background:conic-gradient(var(--color-agent-progress-ring) var(--hp-step-angle),var(--color-chart-track) 0)}\n.hp-composer-toolbar>div>.hu-button{background:var(--color-ai-chat-composer-add-background)}.hp-composer-toolbar>div>.hu-button:hover{background:var(--color-ai-chat-composer-add-hover-background)}\n.hp-composer-panel .hp-composer-toolbar>div>.hu-button{background:var(--color-composer-panel-add-background)}.hp-composer-panel .hp-composer-toolbar>div>.hu-button:hover{background:var(--color-composer-panel-add-hover-background)}\n.hp-composer-context{background:var(--color-composer-panel-tab-background)}.hp-attachment-tile{border-color:var(--color-composer-panel-tile-border)}.hp-provider-rail{background:var(--color-composer-panel-rail-background)}\n.hp-answer>b{background:var(--color-questionnaire-key-background);padding:2px 5px;border-radius:4px}.hp-answer:hover>b{background:var(--color-questionnaire-key-hover-background)}\n.hp-status-context input,.hp-permission-picker input,.hp-model-choices input{accent-color:var(--color-accent-500)}\n/* The primary Send action keeps its own audited action surface, separate from Add controls. */\n.hp-composer-toolbar>.hp-composer-end>.hu-button.hu-primary{background:var(--hu-action);color:var(--hu-on-action)}\n/* Resource states retain the actual native form, composer, list and navigation. */\n.hp-native-content{min-width:0;width:100%}.hp-native-error{border:1px solid var(--hu-error);background:var(--hu-error-bg);border-radius:9px;padding:11px 12px;margin:0 0 12px;color:var(--hu-text);font:12px/18px var(--hu-font)}\n.hp-native-error>strong{font-weight:600;text-transform:capitalize}.hp-native-error>p{margin:4px 0 9px;color:var(--hu-muted);font-size:11px;line-height:17px}\n.hp-native-loading{display:flex;align-items:center;gap:8px;font-size:12px;line-height:20px;margin:0 0 12px;color:var(--hu-muted)}\n.hp-empty-context{padding:9px 11px;background:var(--hu-bg-secondary);border:1px solid var(--hu-line);border-radius:8px;font-size:11px;line-height:17px;color:var(--hu-muted);margin:0 0 12px}.hp-state-restore{margin-top:12px}\n.hp-state-loading[data-agent-pattern=agent-creator] .hp-native-content,.hp-state-loading[data-agent-pattern=agent-limits-card] .hp-native-content{opacity:.6}\n.hp-questionnaire-empty{min-height:160px;display:grid;align-content:center;gap:8px;text-align:center}\n.hp-composer-toolbar>.hp-composer-end>.hu-button.hp-composer-stop{width:auto;min-width:48px;height:28px;min-height:28px;padding:2px 8px;border-radius:6px;font-size:12px;line-height:20px;flex-shrink:0}\n\n/* Keep preparation progress and its available cancel action separate. */\n.hp-attachment-tile[data-preparing=true]>.hp-file-percent{top:auto;bottom:0}\n\n.hp-agent-editor-heading,.hp-multi-header-actions{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap}.hp-chat-members{list-style:none;padding:8px 0;margin:0;display:flex;flex-wrap:wrap;gap:6px}.hp-chat-members>li{display:flex;gap:5px;align-items:center;border:1px solid var(--hu-line);border-radius:20px;padding:3px 7px;font-size:11px}.hp-chat-members small{display:block;color:var(--hu-muted);font-size:9px}.hp-chat-member-avatar{width:16px;height:16px;border-radius:50%;flex-shrink:0}.hp-chat-members .hu-button{min-height:22px;min-width:22px;padding:2px}.hp-chat-storage{margin-top:10px;border-top:1px solid var(--hu-line);padding-top:8px}.hp-chat-storage p{font-size:11px;color:var(--hu-muted);margin:5px 0 0}\n\n.hp-model-row{display:flex;align-items:center;gap:3px;min-width:0}.hp-model-row>label{flex:1;min-width:0}.hp-model-row>label>span:nth-child(2){min-width:0;overflow:hidden;text-overflow:ellipsis}.hp-model-row small{display:block;color:var(--hu-muted);font-size:9px}.hp-model-effort-chip.hu-button{font-size:9px;padding:2px;min-height:23px;gap:1px}.hp-model-picker>header{display:flex;justify-content:space-between;align-items:center;gap:4px;flex-wrap:wrap}.hp-model-picker>header p{width:100%}.hp-effort-popover{min-width:230px}.hp-effort-popover label{font-size:12px;display:block}.hp-effort-popover input{display:block;width:100%;accent-color:var(--hu-brand-text);margin:12px 0}.hp-effort-axis{display:flex;justify-content:space-between;gap:9px;font-size:10px;color:var(--hu-muted);margin:6px 0}.hp-notification-avatar>.hu-svg-icon{width:16px;height:16px}\n\n.hp-task-row{display:flex;align-items:center;justify-content:space-between;gap:6px}.hp-task-row>.hu-button{padding:2px;min-height:24px;min-width:24px}.hp-task-steps .hp-resource{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.hp-resource>.hu-svg-icon{width:14px;height:14px;flex-shrink:0}\n\n.hp-source-trail{list-style:none;margin:12px 0;padding:0 0 0 8px;border-inline-start:1px solid var(--hu-line)}.hp-source-trail>.hp-source-step{display:flex;align-items:flex-start;gap:8px;padding:7px 8px;position:relative;animation:hp-source-enter .2s ease-out}.hp-source-trail>.hp-source-step:before{content:'';position:absolute;inset-inline-start:-9px;top:16px;width:8px;height:8px;border-inline-start:1px solid var(--hu-line);border-bottom:1px solid var(--hu-line);border-radius:0 0 0 7px}.hp-source-step strong{font-size:12px;font-weight:500}.hp-source-step p,.hp-source-step small{font-size:11px;color:var(--hu-muted);margin:2px 0}.hp-source-step[data-heading=true]{font-weight:600}.hp-search-source-branch{display:flex;align-items:center;gap:7px;min-width:0;flex-wrap:wrap}.hp-search-source-branch>button,.hp-source-stack>button{font:11px var(--hu-font);border:1px solid var(--hu-line);background:var(--hu-bg);color:var(--hu-text);border-radius:5px;padding:3px 6px;cursor:pointer}.hp-source-stack{display:flex;align-items:center;padding-inline-start:4px}.hp-source-stack>a,.hp-source-stack>span{position:relative;width:25px;height:25px;display:grid;place-items:center;border:2px solid var(--hu-bg);border-radius:50%;background:var(--hu-bg-secondary);color:var(--hu-text);margin-inline-start:-4px;transition:transform .15s ease}.hp-source-stack>a:hover,.hp-source-stack>a:focus-visible{transform:translateY(-4px);z-index:2}.hp-source-stack>button{margin-inline-start:4px}.hp-sources-popover{width:300px}.hp-sources-popover ul{list-style:none;padding:0;margin:0}.hp-sources-popover li{display:flex;align-items:center;gap:8px;padding:7px 0;font-size:12px}.hp-sources-popover small{display:block;color:var(--hu-muted);font-size:10px}.hp-sources-popover a{color:var(--hu-brand-text);text-decoration:none}.hp-web-working{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--hu-muted)}.hp-web-working .hu-spinner{width:12px;height:12px}@keyframes hp-source-enter{from{opacity:0;transform:translateY(5px)}to{opacity:1;transform:none}}@media(prefers-reduced-motion:reduce){.hp-source-trail>.hp-source-step{animation:none}.hp-source-stack>a,.hp-source-stack>span{transition:none}.hp-source-stack>a:hover,.hp-source-stack>a:focus-visible{transform:none}}\n\n@media(max-width:767px){.hp-auth-card.hp-auth-split{grid-template-columns:minmax(0,1fr);max-width:380px}.hp-auth-media{display:none}.hp-auth-split .hp-auth-main{padding:20px}}\n/* The public provider list can contain all supported marks, so every supplied action must remain reachable. */\n.hp-auth-card[data-layout=inline] .hp-auth-providers>div{flex-wrap:wrap}\n.hp-auth-card[data-layout=grid] .hp-auth-providers>div{display:grid;grid-template-columns:repeat(auto-fit,minmax(34px,1fr));gap:8px}\n.hp-auth-card[data-layout=grid] .hp-auth-providers .hu-button{min-width:0;width:100%}\n/* Source-shaped canonical agent blocks; advanced demo tools remain in /library. */\n.hp-source-example{width:100%;min-width:0;font:14px/20px var(--hu-font);color:var(--color-text-primary)}\n.hp-source-example>.hp-note,.hp-source-example .hp-note,.hp-source-example .hp-range-label,.hp-source-example .hp-composer-working{display:none}\n.hp-source-example .hp-status:empty{display:none}.hp-source-feedback{font:12px/18px var(--hu-font);color:var(--hu-muted);margin:12px 0 0}\n.hp-source-example[data-source-agent=agent-creator]{max-width:356px;margin-inline:auto;height:760px;border:1px solid var(--color-border-button-default);border-radius:24px;padding:8px;overflow:hidden;background:var(--color-background-full)}\n.hp-source-example .hp-agent-creator{width:100%;max-width:none;height:742px;border:0;border-radius:0;padding:0 8px 20px 4px;display:grid;grid-auto-rows:max-content;gap:12px;overflow:auto;scrollbar-width:none;background:var(--color-background-full)}\n.hp-source-example .hp-agent-editor-heading{justify-content:center;padding-top:16px;min-height:32px}.hp-source-example .hp-agent-editor-heading h3{font:500 14px/20px var(--hu-font)}\n.hp-source-example .hp-avatar-stage{height:268px;min-height:268px;padding:55px;display:grid;place-items:center;margin-top:10px}.hp-source-example .hp-avatar-stage>.hp-avatar{width:144px;height:108px;transform:none;background:linear-gradient(145deg,color-mix(in srgb,var(--agent-color),white 14%),var(--agent-color) 55%,color-mix(in srgb,var(--agent-color),#d38a4a 18%));box-shadow:3px 4px 0 color-mix(in srgb,var(--agent-color),#a85b16 30%),inset 2px 2px 3px #ffffff44;border-radius:35% 40% 30% 30%}\n.hp-source-example .hp-expression-orbit>button{width:34px;height:34px;margin:-17px;transform:rotate(var(--orbit-angle)) translateX(116px) rotate(calc(-1*var(--orbit-angle)));background:var(--agent-color);border:2px solid transparent}.hp-source-example .hp-expression-orbit .hp-avatar{width:28px;height:28px;border-radius:50%;background:var(--agent-color)}.hp-source-example .hp-expression-orbit .hp-avatar:before,.hp-source-example .hp-expression-orbit .hp-avatar:after{display:none}\n.hp-source-example .hp-shape-picker{height:60px;gap:2px;align-items:center}.hp-source-example .hp-shape-picker>button{height:56px;width:56px;flex:0 0 56px;border-radius:14px}.hp-source-example .hp-shape-picker .hp-shape-swatch{height:40px;width:40px;filter:drop-shadow(2px 2px 0 #d48b51)}\n.hp-source-example .hp-colors{gap:5px;padding:5px;border:1px solid var(--hu-line);border-radius:24px;justify-content:space-between}.hp-source-example .hp-colors>button{width:26px;height:26px;min-width:26px;box-shadow:inset 0 3px 4px #ffffff55,inset 0 -2px 5px #0002}.hp-source-example .hp-avatar-custom-color{width:26px;height:26px}\n.hp-source-example .hp-agent-creator>.hu-field,.hp-source-example .hp-agent-creator>.hp-textarea-label{grid-template-columns:84px minmax(0,1fr);gap:12px;padding:9px 10px;background:var(--color-background-secondary-default);margin:0;border-radius:12px;min-width:0;align-items:start}\n.hp-source-example .hp-agent-creator .hu-field>label,.hp-source-example .hp-agent-creator .hp-textarea-label{font:400 14px/20px var(--hu-font)}.hp-source-example .hp-agent-creator .hu-input-wrap{min-height:32px;border:0;background:var(--color-background-tertiary-default);box-shadow:none;padding-inline:10px}.hp-source-example .hp-agent-creator .hu-field input,.hp-source-example .hp-agent-creator .hu-field select,.hp-source-example .hp-agent-creator textarea{font:400 14px/20px var(--hu-font)}\n.hp-source-example .hp-agent-creator textarea{border:0;min-height:62px;background:var(--color-background-tertiary-default);padding:8px 10px;resize:none}.hp-source-example .hp-agent-creator>.hu-checkbox-label{padding:12px 10px;border-radius:12px;background:var(--color-background-secondary-default);font-size:14px}\n.hp-source-example .hp-limits{max-width:448px;padding:10px 16px 16px;border-radius:16px;font:400 14px/20px var(--hu-font)}.hp-source-example .hp-limits-heading{font:400 14px/20px var(--hu-font);gap:8px}.hp-source-example .hp-limits-heading strong{font-weight:400}.hp-source-example .hp-usage-limits{padding-top:16px;margin-top:12px}.hp-source-example .hp-usage-limits h4{font:400 14px/20px var(--hu-font);margin-bottom:12px;color:var(--color-text-secondary)}.hp-source-example .hp-usage-limits>div{margin-top:12px}.hp-source-example .hp-usage-limits>div>div{font:400 14px/20px var(--hu-font)}.hp-source-example .hp-usage-limits strong,.hp-source-example .hp-usage-limits b{font-weight:400}.hp-source-example .hp-limits progress,.hp-source-example .hp-context-bar{height:6px;margin-top:8px}\n.hp-source-example .hp-agent-progress{max-width:341px;padding:10px;border-radius:16px;box-shadow:0 1px 2px #0000000d;font:400 14px/20px var(--hu-font)}.hp-source-example .hp-agent-progress>header{gap:0;margin:0 2px 8px}.hp-source-example .hp-agent-progress>header>span{display:none}.hp-source-example .hp-progress-disclosure{font:400 14px/20px var(--hu-font)}.hp-source-example .hp-progress-disclosure>strong{font-weight:400;color:var(--color-text-secondary)}.hp-source-example .hp-progress-disclosure:before{content:'';width:16px;height:16px;border:3px solid var(--color-chart-track);border-top-color:var(--color-agent-progress-ring);border-radius:50%;box-sizing:border-box;margin-inline-end:8px}.hp-source-example .hp-progress-disclosure>span{margin-inline-start:auto;background:var(--color-background-tertiary-default);border-radius:4px;width:18px;height:18px}.hp-source-example .hp-agent-progress>ol{gap:4px;margin:0}.hp-source-example .hp-agent-progress>ol>li{padding:5px 4px;gap:8px;min-height:30px;border:1px solid transparent;border-radius:20px}.hp-source-example .hp-agent-progress>ol>li[aria-current=step]{border-color:var(--color-border-button-default);background:var(--color-background-primary-default)}.hp-source-example .hp-agent-progress>ol>li>span{width:16px;height:16px;font-size:14px;color:var(--color-text-tertiary);background:none;border:1px dashed var(--color-border-button-default)}.hp-source-example .hp-agent-progress>ol strong{font:500 14px/20px var(--hu-font);color:var(--color-text-secondary)}.hp-source-example .hp-agent-progress>ol small,.hp-source-example .hp-agent-progress>.hu-actions,.hp-source-example .hp-agent-progress>.hp-status{display:none}\n.hp-source-auth{max-width:400px;margin-inline:auto}.hp-source-example[data-source-agent=notification-center]{max-width:430px;margin-inline:auto}\n.hp-source-composer{width:100%;max-width:560px;margin-inline:auto}.hp-source-composer .hp-composer-example{max-width:none}.hp-source-composer .hp-composer-card{display:grid;grid-template-columns:34px minmax(0,1fr) auto 36px 36px;grid-template-rows:auto;align-items:center;gap:6px;padding:8px;border-radius:28px;min-height:52px;box-shadow:0 10px 50px #00000009;border:0;background:var(--color-background-primary-default)}\n.hp-source-composer .hp-composer-card>textarea{grid-column:2;grid-row:1;font:400 14px/20px var(--hu-font);min-height:20px!important;resize:none;padding:0;border:0;background:none}.hp-source-composer .hp-composer-toolbar,.hp-source-composer .hp-composer-toolbar>div{display:contents}.hp-source-composer .hp-composer-toolbar .hp-picker-trigger{grid-row:1}.hp-source-composer .hp-picker-trigger:has(>[aria-label=Permission]){display:none}.hp-source-composer .hp-picker-trigger:has(>[aria-label=Model]){grid-column:3}.hp-source-composer .hp-composer-toolbar>div>.hu-button[aria-label='Attach files'],.hp-source-composer .hp-composer-toolbar>div>.hu-button[aria-label='Hide attachments']{grid-column:1;grid-row:1;width:34px;height:34px;min-width:34px;min-height:34px;background:var(--color-ai-chat-composer-add-background)}\n.hp-source-composer .hp-composer-end>.hu-button[aria-label='Voice input'],.hp-source-composer .hp-composer-end>.hu-button[aria-label='Stop voice input']{grid-column:4;grid-row:1;width:36px;height:36px;min-height:36px;border-radius:50%;background:var(--color-background-primary-default);box-shadow:0 1px 2px #0001}\n.hp-source-composer .hp-composer-end>.hu-primary{grid-column:5;grid-row:1;min-width:36px;width:36px;height:36px;min-height:36px;padding:0;border-radius:50%;opacity:1}.hp-source-composer .hp-picker-trigger>.hu-button{font:400 14px/20px var(--hu-font);padding:3px 6px}.hp-source-composer .hp-composer-status-bar{font:400 14px/20px var(--hu-font);padding:8px 0}.hp-source-composer .hp-composer-status-bar .hp-picker-trigger>.hu-button{font:400 14px/20px var(--hu-font)}.hp-source-composer .hp-composer-status-bar .hp-status-context{margin-inline-start:auto}.hp-source-composer .hp-composer-status-bar .hp-picker-trigger:has(>[aria-label='Agent mode']){margin-inline-start:auto}\n.hp-source-composer .hp-composer-card>input,.hp-source-composer .hp-composer-card>label{position:absolute}.hp-source-composer .hp-composer-uploads,.hp-source-composer .hp-attachment-strip{grid-column:1/-1}.hp-source-composer .hp-composer-uploads~textarea{grid-column:1/-1;grid-row:auto}.hp-source-composer .hp-attachment-strip~textarea{grid-row:2}\n.hp-source-panel{max-width:699px}.hp-source-panel .hp-composer-card{grid-template-columns:36px minmax(0,1fr) auto 36px 36px;min-height:102px;border-radius:24px}.hp-source-panel .hp-composer-card>textarea{grid-column:1/-1;grid-row:1;padding:3px 8px;min-height:40px!important}.hp-source-panel .hp-composer-toolbar .hp-picker-trigger{grid-row:2}.hp-source-panel .hp-picker-trigger:has(>[aria-label=Permission]){display:block;grid-column:2}.hp-source-panel .hp-composer-toolbar>div>.hu-button[aria-label='Attach files'],.hp-source-panel .hp-composer-toolbar>div>.hu-button[aria-label='Hide attachments'],.hp-source-panel .hp-composer-end>.hu-button{grid-row:2}.hp-source-panel .hp-composer-context{margin:0 28px;padding:0 8px;height:34px;border-radius:12px 12px 0 0}.hp-source-panel .hp-composer-context .hp-composer-status-bar{padding:7px 0}\n.hp-source-panel .hp-attachment-strip{grid-row:1;gap:10px;margin:0}.hp-source-panel .hp-attachment-strip~textarea{grid-row:2}.hp-source-panel:has(.hp-attachment-strip) .hp-composer-toolbar>div>.hu-button,.hp-source-panel:has(.hp-attachment-strip) .hp-composer-toolbar .hp-picker-trigger{grid-row:3}.hp-source-panel .hp-attachment-tile{width:54px;height:54px;min-width:54px;border-radius:9px}.hp-source-panel .hp-attachment-tile img{width:54px;height:54px}\n.hp-source-thinking{max-width:560px;margin-inline:auto;display:grid;gap:16px}.hp-source-thinking-variants{justify-self:center;display:flex;padding:4px;background:var(--color-segmented-control-background);border-radius:10px;gap:2px}.hp-source-thinking-variants>button{font:400 14px/20px var(--hu-font);padding:4px 10px;border:0;background:none;color:var(--color-text-secondary);border-radius:6px;cursor:pointer}.hp-source-thinking-variants>button[aria-pressed=true]{background:var(--color-segmented-control-selected-background);color:var(--color-text-primary);font-weight:500;box-shadow:0 1px 2px #0001}.hp-source-thinking-conversation{background:var(--color-background-secondary-default);padding:20px 10px 0;border-radius:24px;display:grid;gap:12px}.hp-source-user-message{max-width:270px;justify-self:end;margin:0 0 4px;padding:12px;font:400 14px/20px var(--hu-font);background:var(--color-background-primary-default);border-radius:20px;color:var(--color-text-primary)}.hp-source-thinking-conversation>[role=status]{margin-inline:6px}.hp-source-thinking .hp-source-composer{max-width:none}.hp-source-thinking .hp-composer-status-bar{padding-bottom:8px}\n.hp-source-loader{width:100%;max-width:560px;margin-inline:auto;display:grid;gap:28px}.hp-source-color-wells{display:flex;justify-content:center;gap:12px}.hp-source-color-wells>button{height:28px;width:28px;border-radius:50%;border:1px solid #00000010;box-shadow:inset 0 3px 4px #ffffff66,inset 0 -2px 5px #0002;cursor:pointer}.hp-source-loader .hp-composer-card{background:transparent;box-shadow:none}\n/* The full-size public preview uses the same rows and type scale as the reference. */\n.hp-source-example .hp-questionnaire{width:min(648px,100%);max-width:648px;padding:12px;border:0;border-radius:20px}\n.hp-source-example .hp-questionnaire>header{font:500 14px/20px var(--hu-font);margin-bottom:10px;min-height:20px;padding-inline-start:2px;align-items:flex-start}\n.hp-source-example .hp-questionnaire h3{font:500 14px/20px var(--hu-font)}\n.hp-source-example .hp-questionnaire>header>span{display:none}\n.hp-source-example .hp-questionnaire>header>.hu-button{width:20px;height:20px;min-height:20px;border:0;border-radius:50%;background:var(--color-background-tertiary-default)}\n.hp-source-example .hp-questionnaire>header>.hu-button .hu-icon,.hp-source-example .hp-questionnaire>header>.hu-button svg{width:14px;height:14px}\n.hp-source-example .hp-questionnaire>fieldset{gap:8px}\n.hp-source-example .hp-questionnaire .hp-answer{padding:9px 19px 9px 11px;border-radius:16px;min-height:60px;font:400 14px/20px var(--hu-font)}\n.hp-source-example .hp-questionnaire .hp-answer strong{font:500 14px/20px var(--hu-font)}\n.hp-source-example .hp-questionnaire .hp-answer small{font:400 14px/20px var(--hu-font);margin:0}\n.hp-source-example .hp-questionnaire footer{font:400 14px/20px var(--hu-font);margin-top:10px;padding-top:2px;gap:16px}\n.hp-source-example .hp-questionnaire footer nav{gap:8px}\n.hp-source-example .hp-questionnaire footer nav button{font:500 14px/20px var(--hu-font);padding:5px 8px;border-radius:999px}\n.hp-source-example .hp-questionnaire>footer .hu-button{--hu-height:32px;min-height:32px;font:500 14px/20px var(--hu-font);padding:5px 11px}\n.hp-other-answer{position:relative}\n.hp-other-hit{position:absolute;inset:0;border-radius:inherit;cursor:pointer}\n.hp-answer>.hp-other-copy{position:relative;pointer-events:none;display:flex;flex-direction:column;min-width:0;flex:1}\n.hp-other-copy>label{font:500 14px/20px var(--hu-font)}\n.hp-other-copy>input{position:relative;pointer-events:auto;width:100%;min-width:0;height:20px;margin:0;padding:0;border:0;border-radius:0;background:none;font:400 14px/20px var(--hu-font);color:var(--hu-text)}\n.hp-other-copy>input::placeholder{color:var(--hu-muted)}\n.hp-other-copy>input:focus-visible{outline:2px solid var(--hu-brand-text);outline-offset:2px;border-radius:2px}\n.hp-other-answer>input{position:relative}\n.hp-other-answer:has(input:disabled) .hp-other-hit{cursor:not-allowed}\n\n.hp-source-example .hp-task-list{max-width:420px;border:0;background:none;box-shadow:none;padding:0}.hp-source-example .hp-task-list>header>strong,.hp-source-example .hp-task-list>header>span,.hp-source-example .hp-task-list>header>button:not(:first-child),.hp-source-example .hp-task-list>.hu-actions,.hp-source-example .hp-task-list>.hp-note{display:none}.hp-source-example .hp-task-list>header{display:none}.hp-source-example .hp-task-steps>li{font:400 14px/20px var(--hu-font);padding:4px 0}.hp-source-example .hp-task-steps strong,.hp-source-example .hp-task-steps small{font:400 14px/20px var(--hu-font)}.hp-source-example .hp-resource{font:400 12px/18px var(--hu-font)}.hp-source-example .hp-task-row>.hu-button{display:none}\n.hp-source-example .hp-web-search{max-width:648px;border:0;box-shadow:none;background:none;padding:0;margin-inline:auto}.hp-source-example .hp-source-step strong,.hp-source-example .hp-source-step p{font:400 14px/20px var(--hu-font)}.hp-source-example .hp-web-working{font:400 14px/20px var(--hu-font);margin-top:10px}.hp-source-example[data-source-agent=multi-agent-chat]{max-width:none}\n@media(max-width:639px){.hp-source-example[data-source-agent=agent-creator]{width:min(356px,100%)}.hp-source-example .hp-agent-creator .hp-avatar-stage{height:268px;min-height:268px}.hp-source-example .hp-expression-orbit>button{transform:rotate(var(--orbit-angle)) translateX(110px) rotate(calc(-1*var(--orbit-angle)))}.hp-source-example .hp-agent-creator>.hu-field,.hp-source-example .hp-agent-creator>.hp-textarea-label{grid-template-columns:70px minmax(0,1fr);gap:8px}.hp-source-composer .hp-picker-trigger>.hu-button{font-size:12px;padding-inline:2px}.hp-source-composer .hp-composer-card{grid-template-columns:30px minmax(0,1fr) auto 30px 30px;gap:3px;padding:6px}.hp-source-composer .hp-composer-card>textarea{font-size:13px}.hp-source-composer .hp-composer-end>.hu-button,.hp-source-composer .hp-composer-toolbar>div>.hu-button[aria-label='Attach files']{width:30px;height:30px;min-width:30px;min-height:30px}.hp-source-composer .hp-composer-status-bar .hp-picker-trigger>.hu-button{font-size:10px}.hp-source-composer .hp-composer-status-bar{gap:3px}.hp-source-thinking-conversation{padding:12px 8px 0}.hp-source-thinking-variants>button{font-size:12px;padding-inline:7px}.hp-source-example .hp-limits{padding:10px 16px 16px}.hp-source-example .hp-usage-limits>div>div{font-size:12px}.hp-source-example .hp-questionnaire .hp-answer small{font-size:14px}}\n\n\n.hp-source-example{border:0;padding:0;margin:0;min-inline-size:0}.hp-source-auth-row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:24px;width:100%}.hp-source-auth-row>.hp-source-auth{width:100%}.hp-source-loader-conversation{max-width:560px;background:var(--color-background-secondary-default);padding:16px;border-radius:24px}.hp-source-loader-conversation .hp-source-color-wells{display:none}@media(max-width:639px){.hp-source-auth-row{grid-template-columns:1fr}}\n.hp-source-artwork{position:relative;display:block;background:none!important;box-shadow:none!important;border-radius:0!important;flex-shrink:0}.hp-source-artwork:before,.hp-source-artwork:after{display:none!important}.hp-source-artwork>img{display:block;width:100%;height:100%;object-fit:contain;user-select:none}.hp-source-example .hp-avatar-stage>.hp-source-artwork{width:162px;height:162px;transform:none}.hp-source-example .hp-expression-orbit .hp-source-artwork{width:34px;height:34px}.hp-source-example .hp-shape-picker{display:block;position:relative;height:60px;overflow:visible}.hp-source-example .hp-shape-picker>button{position:absolute;top:2px;left:calc(50% - 28px);padding:0;display:grid;place-items:center}.hp-source-example .hp-shape-picker>button:nth-child(1){transform:translate(-206px,-167px)}.hp-source-example .hp-shape-picker>button:nth-child(2){transform:translate(-179px,-101px)}.hp-source-example .hp-shape-picker>button:nth-child(3){transform:translate(-132px,-47px)}.hp-source-example .hp-shape-picker>button:nth-child(4){transform:translate(-70px,-12px)}.hp-source-example .hp-shape-picker>button:nth-child(6){transform:translate(70px,-12px)}.hp-source-example .hp-shape-picker>button:nth-child(7){transform:translate(132px,-47px)}.hp-source-example .hp-shape-picker>button:nth-child(8){transform:translate(179px,-101px)}.hp-source-example .hp-shape-picker>button:nth-child(9){transform:translate(206px,-167px)}.hp-source-example .hp-shape-picker .hp-source-artwork{width:56px;height:56px}\n.hp-source-example .hp-shape-picker>button[data-shape-offset='-4']{transform:translate(-206px,-167px)}.hp-source-example .hp-shape-picker>button[data-shape-offset='-3']{transform:translate(-179px,-101px)}.hp-source-example .hp-shape-picker>button[data-shape-offset='-2']{transform:translate(-132px,-47px)}.hp-source-example .hp-shape-picker>button[data-shape-offset='-1']{transform:translate(-70px,-12px)}.hp-source-example .hp-shape-picker>button[data-shape-offset='0']{transform:none}.hp-source-example .hp-shape-picker>button[data-shape-offset='1']{transform:translate(70px,-12px)}.hp-source-example .hp-shape-picker>button[data-shape-offset='2']{transform:translate(132px,-47px)}.hp-source-example .hp-shape-picker>button[data-shape-offset='3']{transform:translate(179px,-101px)}.hp-source-example .hp-shape-picker>button[data-shape-offset='4']{transform:translate(206px,-167px)}\n.hp-source-example .hp-web-trail>.hp-search-heading>span,.hp-source-example .hp-web-trail>.hu-button,.hp-source-example .hp-task-editor,.hp-source-example .hp-run-conversation,.hp-source-example .hp-task-list>.hp-status{display:none}.hp-source-example .hp-source-trail{margin-top:12px}.hp-source-example .hp-search-heading{font:500 14px/20px var(--hu-font)}.hp-source-example .hp-web-trail{max-width:648px;padding:0}.hp-source-attachment-kinds{max-width:648px;margin-inline:auto}.hp-source-attachment-kinds .hp-attachment-tile{width:64px;height:64px}.hp-source-example .hp-task-list .hu-checkbox-label{font:400 14px/20px var(--hu-font)}\n.hp-source-composer.hp-source-composer-fluid{max-width:none}.hp-source-composer .hp-composer-end>.hp-composer-stop{grid-column:5;grid-row:1;width:36px;height:36px;min-width:36px;min-height:36px;padding:0;border-radius:50%;font-size:0;line-height:0;display:grid;place-items:center}.hp-source-composer .hp-composer-end>.hp-composer-stop:after{content:'';display:block;width:12px;height:12px;border-radius:3px;background:currentColor}.hp-source-panel .hp-composer-end>.hp-composer-stop{grid-row:2}.hp-source-composer:not(.hp-source-panel):has(.hp-composer-uploads) .hp-composer-card>textarea,.hp-source-composer:not(.hp-source-panel):has(.hp-attachment-strip) .hp-composer-card>textarea,.hp-source-composer:not(.hp-source-panel):has(.hp-composer-uploads) .hp-composer-toolbar .hp-picker-trigger,.hp-source-composer:not(.hp-source-panel):has(.hp-attachment-strip) .hp-composer-toolbar .hp-picker-trigger,.hp-source-composer:not(.hp-source-panel):has(.hp-composer-uploads) .hp-composer-toolbar>div>.hu-button,.hp-source-composer:not(.hp-source-panel):has(.hp-attachment-strip) .hp-composer-toolbar>div>.hu-button{grid-row:2}\n.hp-multi-chat[data-presentation=source]{grid-template-columns:260px minmax(0,1fr);min-height:630px;font:14px/20px var(--hu-font);border:0;border-radius:0;overflow:hidden}.hp-multi-chat[data-presentation=source] .hp-source-agent-navigation{padding:12px;background:var(--color-background-secondary-default);border:0;display:flex;flex-direction:column;gap:4px}.hp-multi-chat[data-presentation=source] .hp-source-agent-navigation>strong{display:none}.hp-source-multi-actions{display:flex;align-items:center;gap:6px;min-height:32px;margin-bottom:8px}.hp-source-multi-actions .hu-button{min-width:30px;min-height:30px;padding:5px}.hp-multi-chat[data-presentation=source] .hp-source-agent-navigation>button:not(.hu-button){padding:8px 10px;border-radius:10px;gap:10px;align-items:center;font:400 14px/20px var(--hu-font)}.hp-multi-chat[data-presentation=source] .hp-source-agent-navigation>button>.hp-source-artwork{width:32px;height:32px}.hp-multi-chat[data-presentation=source] .hp-source-agent-navigation strong{font:500 14px/20px var(--hu-font)}.hp-multi-chat[data-presentation=source] .hp-source-agent-navigation small{font:400 12px/18px var(--hu-font)}.hp-multi-chat[data-presentation=source] .hp-source-agent-navigation .hu-field{margin:0 0 8px}.hp-multi-chat[data-presentation=source] .hp-source-agent-navigation .hu-field>label{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}.hp-multi-chat[data-presentation=source] .hp-multi-conversation{padding:24px;min-width:0}.hp-multi-chat[data-presentation=source] .hp-multi-conversation>header{padding:0 0 16px}.hp-multi-chat[data-presentation=source] .hp-multi-conversation h3{font:500 16px/24px var(--hu-font)}.hp-multi-chat[data-presentation=source] .hp-multi-composer{padding:20px 0 0}.hp-multi-chat[data-presentation=source] .hp-multi-conversation article p{font:400 14px/22px var(--hu-font)}.hp-multi-chat[data-presentation=source] .hp-multi-conversation>.hp-note{font-size:11px;margin-top:12px}.hu-dialog:has(.hp-source-internal-editor){position:fixed;inset-block:0;inset-inline-start:auto;inset-inline-end:0;margin:0;width:min(340px,100vw);max-width:none;height:100dvh;max-height:none;border-radius:0;padding:0;animation:hp-source-editor-enter .22s ease-out}.hu-dialog:has(.hp-source-internal-editor)>header{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}.hu-dialog:has(.hp-source-internal-editor)>.hu-dialog-body{padding:0;overflow:auto;max-height:calc(100dvh - 70px)}.hp-source-internal-editor .hp-source-example[data-source-agent=agent-creator]{border:0;border-radius:0;max-width:none;width:100%}.hu-dialog:has(.hp-source-internal-editor)>footer{padding:12px;border-top:1px solid var(--hu-line)}@keyframes hp-source-editor-enter{from{transform:translateX(100%);opacity:.7}to{transform:none;opacity:1}}@media(prefers-reduced-motion:reduce){.hu-dialog:has(.hp-source-internal-editor){animation:none}}@media(max-width:700px){.hp-multi-chat[data-presentation=source]{grid-template-columns:1fr}.hp-multi-chat[data-presentation=source] .hp-source-agent-navigation{max-height:235px;overflow:auto}.hp-multi-chat[data-presentation=source] .hp-multi-conversation{padding:16px}}\n.hp-source-task-frame{max-width:420px;margin-inline:auto}.hp-source-working{display:flex;align-items:center;gap:7px;font:400 14px/20px var(--hu-font);margin:12px 0 0;color:var(--color-text-secondary)}.hp-source-working>.hu-spinner{height:12px;width:12px}.hp-source-working>span:last-child{font:400 12px/18px var(--hu-mono,monospace);color:var(--color-text-tertiary)}\n\n/* Source creator expression faces sit on the same colored circular wells. */\n.hp-source-example .hp-expression-orbit>button{background:var(--agent-color,#f8b193)}\n.hp-source-example .hp-agent-creator>.hu-field:has(input){border-radius:0;padding-block:5px;margin-top:-12px}\n.hp-source-example .hp-agent-creator>.hu-field:has(input):first-of-type{margin-top:0;border-radius:12px 12px 0 0;padding-top:10px}\n.hp-source-example .hp-agent-creator>.hp-textarea-label{margin-top:-12px;border-radius:0 0 12px 12px;padding-top:5px;padding-bottom:10px}\n\n.hp-multi-chat[data-presentation=source][data-search-open=false] .hp-source-agent-navigation>.hu-field{display:none}\n.hp-multi-chat[data-presentation=source] .hp-multi-header-actions>.hu-badge{display:none}\n.hp-multi-chat[data-presentation=source] .hp-multi-conversation>.hp-note{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}\n.hp-multi-chat[data-presentation=source] .hp-chat-storage>p:empty{display:none}\n\n.hp-source-sidebar-footer{margin-top:auto;padding-top:16px}\n.hp-multi-chat[data-presentation=source] .hp-multi-conversation{background:var(--color-background-secondary-default);border-radius:24px}\n.hp-multi-chat[data-presentation=source] .hp-multi-conversation>header h3{display:flex;align-items:center;gap:6px;background:var(--color-background-primary-default);padding:5px 10px;border-radius:30px;font-size:14px;font-weight:400}\n.hp-multi-chat[data-presentation=source] .hp-multi-conversation>header h3>.hp-source-artwork{height:20px;width:20px}\n.hp-multi-chat[data-presentation=source] .hp-multi-conversation article{display:flex;flex-direction:column;background:transparent;padding:0;max-width:520px;margin-bottom:16px}\n.hp-multi-chat[data-presentation=source] .hp-multi-conversation article>p{order:0;background:var(--color-background-tertiary-default);padding:12px 16px;border-radius:18px}\n.hp-multi-chat[data-presentation=source] .hp-multi-conversation article>strong{order:1;font:400 12px/18px var(--hu-font);padding:6px 8px}\n.hp-multi-chat[data-presentation=source] .hp-multi-conversation article[data-author=user]{max-width:350px;margin-inline-start:auto}\n.hp-multi-chat[data-presentation=source] .hp-multi-conversation article[data-author=user]>p{background:var(--color-background-primary-default)}\n.hp-multi-chat[data-presentation=source] .hp-multi-conversation article[data-author=user]>strong{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}\n\n.hp-source-panel .hp-composer-end>.hu-button[aria-label='Voice input']{grid-row:2}\n.hp-source-panel:has(.hp-attachment-strip) .hp-composer-end>.hu-button[aria-label='Voice input'],.hp-source-panel:has(.hp-attachment-strip) .hp-composer-end>.hp-composer-stop{grid-row:3}\n.hp-source-example .hp-limits-heading{margin:0 -8px;padding:4px 8px;gap:12px;width:calc(100% + 16px)}\n.hp-source-example .hp-limits-heading>span:first-child,.hp-source-example .hp-limits-heading>strong{font-weight:500}\n.hp-source-example .hp-context-bar{margin:6px 0 12px;gap:1px}\n.hp-source-example .hp-usage-limits{padding-top:12px;margin-top:0;gap:12px}\n.hp-source-example .hp-usage-limits h4{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:32px;padding:4px 0;margin:0 0 -8px;font-weight:500}\n.hp-usage-limits h4>a{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:6px;color:var(--hu-muted)}\n.hp-usage-limits h4>a:hover{background:var(--hu-bg-secondary);color:var(--hu-text)}\n.hp-usage-limits h4>a:focus-visible{outline:2px solid var(--hu-brand-text);outline-offset:2px}\n.hp-source-example .hp-usage-limits>div{margin:0}\n.hp-source-example .hp-usage-limits>div>div{margin:0 0 6px;align-items:baseline;flex-wrap:nowrap;gap:8px;font:400 14px/20px var(--hu-font)}\n.hp-source-example .hp-usage-limits>div>div>strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.hp-source-example .hp-usage-limits>div>div>span{flex-shrink:0;font:400 14px/20px var(--hu-font)}\n.hp-source-example .hp-usage-limits strong,.hp-source-example .hp-usage-limits b{font-weight:500}\n.hp-source-example .hp-usage-limits b{min-width:36px;flex-shrink:0;text-align:end;font-variant-numeric:tabular-nums}\n.hp-source-example .hp-limits progress{display:block;height:6px;margin:0}\n\n/* Canonical stream rows follow the public vertical tree rather than the editor grid. */\n.hp-source-example .hp-task-list>ul>li{display:block;padding:0;border:0;background:none;box-shadow:none}\n.hp-source-example .hp-task-row{justify-content:flex-start}\n.hp-source-example .hp-task-list>ul{margin:0;gap:6px}\n.hp-source-example .hp-task-steps{margin:3px 0 0 8px;padding-inline-start:8px;border-inline-start:1px solid var(--color-border-button-default)}\n.hp-source-example .hp-questionnaire .hp-answer>input{order:2;margin-inline-start:auto;flex-shrink:0}\n.hp-source-example .hp-questionnaire .hp-answer>span{flex:1;min-width:0}\n.hp-source-example .hp-web-trail>.hp-search-heading{border:0;padding:0;justify-content:flex-start;gap:6px;color:var(--color-text-secondary)}\n.hp-source-example .hp-web-trail>.hp-search-heading:before{content:'⌕';font-size:16px;line-height:20px}\n.hp-source-example .hp-web-trail>.hp-search-heading strong{font:400 14px/20px var(--hu-font)}\n.hp-source-example .hp-source-trail>.hp-source-step{padding-block:3px}\n.hp-source-example .hp-source-trail>.hp-source-row{padding-block:0;margin-top:-23px;margin-bottom:3px;justify-content:flex-end;min-height:20px;pointer-events:none}\n.hp-source-example .hp-source-trail>.hp-source-row:before{display:none}\n.hp-source-example .hp-source-row .hp-search-source-branch>button{border:0;padding:0;background:none;font:400 12px/20px var(--hu-font);pointer-events:auto}\n.hp-source-example .hp-source-row .hp-source-stack{display:none}\n\n.hp-source-color-wells>button[aria-pressed=true]{outline:1px solid var(--color-foreground-icon-secondary);outline-offset:3px}\n\n.hp-native-composer-light{min-width:0;width:100%}.hp-native-composer-light .hp-composer-card{background:transparent!important}\n\n.hp-multi-chat[data-presentation=source] .hp-multi-conversation>.hp-status{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}\n.hp-source-chat-data{margin-top:auto;font:400 12px/18px var(--hu-font);color:var(--color-text-secondary)}.hp-source-chat-data>summary{cursor:pointer;padding:6px 8px;border-radius:8px}.hp-source-chat-data>div{padding:8px;border:1px solid var(--hu-line);border-radius:10px;background:var(--hu-bg)}.hp-source-chat-data p{font:400 12px/18px var(--hu-font);margin-top:6px}\n\n.hp-source-auth.hp-source-auth-split{max-width:760px;width:100%}\n\n/* The public pill keeps a single clipped line and full-sized touch targets on narrow screens. */\n.hp-source-composer:not(.hp-source-panel) .hp-composer-card>textarea{white-space:pre;overflow-x:hidden;overflow-wrap:normal}\n@media(max-width:639px){.hp-source-composer:not(.hp-source-panel) .hp-composer-card{grid-template-columns:34px minmax(0,1fr) auto 36px 36px;gap:6px;padding:8px}.hp-source-composer:not(.hp-source-panel) .hp-composer-card>textarea{font-size:14px}.hp-source-composer:not(.hp-source-panel) .hp-picker-trigger>.hu-button{font-size:14px;padding-inline:6px}.hp-source-composer:not(.hp-source-panel) .hp-composer-end>.hu-button{width:36px;height:36px;min-width:36px;min-height:36px}.hp-source-composer:not(.hp-source-panel) .hp-composer-toolbar>div>.hu-button[aria-label='Attach files']{width:34px;height:34px;min-width:34px;min-height:34px}}\n\n.hp-source-panel .hp-attachment-strip{flex-wrap:wrap;overflow:visible;padding:3px 2px 4px}.hp-source-panel .hp-attachment-tile figcaption{display:none}\n\n.hp-source-example .hp-limits-heading>strong{white-space:nowrap;flex-shrink:0}\n\n.hp-source-composer .hp-composer-status-bar{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;min-width:0}.hp-source-composer .hp-composer-status-bar>.hp-picker-trigger{flex-shrink:0}\n@media(max-width:639px){.hp-source-panel .hp-picker-trigger:has(>[aria-label=Permission]){display:none}.hp-source-panel .hp-picker-trigger:has(>[aria-label=Model]){grid-column:2/4;justify-self:start}.hp-source-panel .hp-picker-trigger:has(>[aria-label=Model])>.hu-button{max-width:145px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}}\n\n.hp-source-composer .hp-composer-status-bar .hp-picker-trigger>.hu-button{white-space:nowrap;padding:0 3px;min-height:20px;height:20px;line-height:20px}.hp-source-composer .hp-composer-status-bar>.hp-status-context{min-height:20px;height:20px}\n@media(max-width:639px){.hp-source-panel .hp-composer-card{grid-template-columns:34px minmax(0,1fr) auto 36px 36px;gap:6px;padding:8px}.hp-source-panel .hp-composer-end>.hu-button{width:36px;height:36px;min-width:36px;min-height:36px}.hp-source-panel .hp-composer-toolbar>div>.hu-button[aria-label='Attach files']{width:34px;height:34px;min-width:34px;min-height:34px}}\n\n/* Public group conversation empty state; populated/individual and advanced views retain their layout. */\n.hp-multi-chat[data-presentation=source] .hp-multi-conversation>[role=log]{max-height:none}\n.hp-multi-chat[data-presentation=source] .hp-multi-conversation>[data-source-empty-group=true]{display:grid;place-items:center;min-height:280px}\n.hp-source-chat-empty{display:flex;width:100%;min-width:0;flex-direction:column;align-items:center;justify-content:center;gap:16px;padding:32px 16px;text-align:center}\n.hp-source-chat-empty-art{position:relative;flex-shrink:0;width:160px;height:112px}\n.hp-source-chat-empty-art>div{position:absolute;inset:0 auto auto 0;width:62px;height:62px}\n.hp-source-chat-empty-art>div:nth-child(1){transform:translate(22px,8px)}.hp-source-chat-empty-art>div:nth-child(2){transform:translate(76px,8px)}.hp-source-chat-empty-art>div:nth-child(3){transform:translate(49px,46px)}\n.hp-source-chat-empty-art .hp-source-artwork{width:62px;height:62px}.hp-source-chat-empty-art .hp-source-artwork>img{width:62px;height:62px;object-fit:contain}\n.hp-source-chat-empty-copy{display:flex;flex-direction:column;align-items:center;gap:6px;max-width:420px}\n.hp-source-chat-empty-copy h2{margin:0;font:600 18px/26px var(--hu-font);color:var(--color-text-primary)}\n.hp-source-chat-empty-copy p{margin:0;font:400 14px/20px var(--hu-font);color:var(--color-text-secondary)}\n\n.hp-multi-chat[data-presentation=source][data-mobile-sidebar=true]{grid-template-columns:minmax(0,1fr)}\n.hp-multi-chat[data-mobile-sidebar=true] .hp-multi-conversation>header{justify-content:flex-start;gap:8px}.hp-multi-chat[data-mobile-sidebar=true] .hp-multi-conversation>header h3{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.hu-dialog:has(.hp-source-mobile-nav-content){position:fixed;inset-block:0;inset-inline-start:0;inset-inline-end:auto;margin:0;width:min(320px,calc(100vw - 32px));height:100dvh;max-height:100dvh;border-radius:0;padding:12px;background:var(--color-background-secondary-default)}\n.hu-dialog:has(.hp-source-mobile-nav-content)>.hu-dialog-body{padding:0;max-height:calc(100dvh - 72px);overflow:auto}\n.hp-source-mobile-nav-content .hp-source-agent-navigation{max-height:none!important;overflow:visible!important;padding:0!important;background:none!important}\n.hp-source-mobile-nav-content .hp-source-agent-navigation>button:not(.hu-button){width:100%}.hp-source-mobile-nav-content .hp-source-agent-navigation .hp-source-sidebar-footer{margin-top:20px}\n\n/* Observed source mobile navigation: a 260 px panel inset 12 px in its own viewport. */\n.hu-dialog:has(.hp-source-mobile-nav-content){inset-block:12px;inset-inline-start:12px;inset-inline-end:auto;width:260px;max-width:calc(100vw - 24px);height:calc(100dvh - 24px);max-height:calc(100dvh - 24px);padding:0;border:0;border-radius:24px;background:transparent;box-shadow:none;overflow:visible}\n.hu-dialog:has(.hp-source-mobile-nav-content)::backdrop{background:rgb(0 0 0 / 40%);backdrop-filter:none}\n.hu-dialog:has(.hp-source-mobile-nav-content)>header{position:absolute;inset:0 0 auto;height:0;padding:0;margin:0;border:0;z-index:2}\n.hu-dialog:has(.hp-source-mobile-nav-content)>header h2{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}\n.hu-dialog:has(.hp-source-mobile-nav-content)>header>.hu-button{top:12px;right:auto;inset-inline-end:12px}\n.hu-dialog:has(.hp-source-mobile-nav-content)>.hu-dialog-body{height:100%;max-height:none;padding:0;border-radius:24px;overflow:visible}\n.hp-source-mobile-nav-content{height:100%}\n.hp-source-mobile-nav-content .hp-source-agent-navigation{box-sizing:border-box;width:100%;height:100%;padding:7px!important;overflow-y:auto!important;max-height:none!important;border:1px solid var(--color-border-button-white)!important;border-radius:24px;box-shadow:var(--shadow-sidebar,0 10px 30px #0002);background:var(--color-background-secondary-default)!important}\n.hp-source-mobile-nav-content .hp-source-agent-navigation .hp-source-sidebar-footer{margin-top:auto}\n\n.hu-dialog:has(.hp-source-mobile-nav-content)::backdrop{background:color-mix(in srgb,var(--color-background-secondary-default) 70%,transparent);backdrop-filter:blur(8px)}\n.hu-dialog:has(.hp-source-mobile-nav-content)>header>.hu-button{top:8px;inset-inline-end:-40px;width:20px;height:20px;min-width:20px;min-height:20px;padding:0;border:0;border-radius:4px}\n\n.hp-multi-chat[data-presentation=source] .hp-source-agent-navigation>button:not(.hu-button){height:44px;min-height:44px;padding:4px 8px;gap:8px;flex-shrink:0}\n.hp-multi-chat[data-presentation=source] .hp-source-agent-navigation>button:not(.hu-button)>span:last-child{flex:1;min-width:0;text-align:start}\n.hp-multi-chat[data-presentation=source] .hp-source-agent-navigation>button:not(.hu-button) strong,.hp-multi-chat[data-presentation=source] .hp-source-agent-navigation>button:not(.hu-button) small{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.hp-multi-chat[data-presentation=source] .hp-source-agent-navigation>button:not(.hu-button) strong{font:500 14px/20px var(--hu-font)}.hp-multi-chat[data-presentation=source] .hp-source-agent-navigation>button:not(.hu-button) small{font:400 12px/16px var(--hu-font)}\n dialog.hu-dialog:has(.hp-source-mobile-nav-content){animation:none!important;transform:none!important;transition:none}\n\n.hp-multi-chat[data-presentation=source] .hp-source-agent-navigation>button>.hp-source-group-avatar{position:relative;display:block;width:32px;height:32px;flex:0 0 32px;background:none}\n.hp-source-group-avatar>.hp-source-artwork{position:absolute!important;width:20px!important;height:20px!important}.hp-source-group-avatar>.hp-source-artwork:nth-child(1){inset:0 auto auto 0}.hp-source-group-avatar>.hp-source-artwork:nth-child(2){inset:0 0 auto auto}.hp-source-group-avatar>.hp-source-artwork:nth-child(3){inset:auto auto 0 6px}.hp-source-group-avatar>.hp-source-artwork>img{width:20px;height:20px;object-fit:contain}\n\n.hp-multi-chat[data-presentation=source] .hp-multi-conversation>header{border-bottom:0}\n.hp-multi-chat[data-presentation=source] .hp-source-panel .hp-picker-trigger:has(>[aria-label=Permission]){display:block;grid-column:2;min-width:0}\n.hp-multi-chat[data-presentation=source] .hp-source-panel .hp-picker-trigger:has(>[aria-label=Model]){grid-column:3;justify-self:start}\n\n/* Public source conversation controls; advanced workspace remains unchanged. */\n.hp-multi-chat[data-presentation=source] .hp-source-thread-label{flex:1;min-width:0;text-align:start}\n.hp-multi-chat[data-presentation=source] .hp-source-agent-navigation>button>.hp-source-pinned{background:none;display:grid;place-items:center;flex:0 0 16px;width:16px;height:16px;border-radius:0;color:var(--color-text-tertiary)}\n.hp-multi-chat[data-presentation=source] .hp-source-conversation-title{display:flex;align-items:center;gap:8px;min-width:0;max-width:calc(100% - 88px);padding:4px 8px;border:0;border-radius:999px;background:transparent;color:var(--color-text-primary);font:500 14px/20px var(--hu-font);text-align:start;cursor:pointer}\n.hp-source-conversation-title>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hp-source-conversation-title>.hp-source-artwork{width:24px;height:24px;flex:0 0 24px}.hp-source-conversation-title>.hp-source-artwork img{width:24px;height:24px}\n.hp-source-conversation-tools{margin-inline-start:auto;display:flex;align-items:center;gap:8px;flex-shrink:0}\n.hp-source-conversation-tools>.hu-button,.hp-source-options-trigger{width:24px;height:24px;min-width:24px;padding:2px;border:0;background:transparent;color:var(--color-text-secondary);display:grid;place-items:center;border-radius:8px;cursor:pointer}.hp-source-options-trigger:disabled,.hp-source-conversation-title:disabled{opacity:.5;cursor:not-allowed}\n.hp-source-conversation-tools svg{width:16px;height:16px}.hp-source-options-trigger:hover,.hp-source-conversation-title:hover{background:var(--color-background-tertiary-default)}\n.hp-source-context-popover{box-sizing:border-box;width:208px;padding:4px;border:1px solid var(--color-border-button-default);border-radius:16px;background:var(--color-background-primary-default);color:var(--color-text-primary);box-shadow:var(--shadow-dropdown,0 8px 24px #0002);outline:none;z-index:100}\n.hp-source-context-menu{display:flex;flex-direction:column;gap:4px;outline:none}.hp-source-context-item{display:flex;align-items:center;gap:8px;min-height:32px;padding:6px 8px;border-radius:12px;outline:none;font:500 14px/20px var(--hu-font);cursor:pointer}.hp-source-context-item svg{width:16px;height:16px;flex-shrink:0}.hp-source-context-item[data-focused],.hp-source-context-item[data-hovered]{background:var(--color-background-secondary-hover)}.hp-source-context-item[data-disabled]{opacity:.45;cursor:not-allowed}\n.hu-dialog:has(.hp-source-chat-picker),.hu-dialog:has(.hp-source-rename){box-sizing:border-box;width:520px;max-width:calc(100vw - 24px);max-height:85dvh;padding:16px;border:1px solid var(--color-border-button-default);border-radius:24px;background:var(--color-background-primary-default);color:var(--color-text-primary);box-shadow:0 20px 40px #0003}\n.hu-dialog:has(.hp-source-chat-picker)>header,.hu-dialog:has(.hp-source-rename)>header{margin:0 0 16px;padding:0;border:0;display:block}.hu-dialog:has(.hp-source-chat-picker)>header h2,.hu-dialog:has(.hp-source-rename)>header h2{margin:0;font:500 16px/24px var(--hu-font)}\n.hu-dialog:has(.hp-source-chat-picker)>header>.hu-button,.hu-dialog:has(.hp-source-rename)>header>.hu-button{display:none}\n.hu-dialog:has(.hp-source-chat-picker)>.hu-dialog-body,.hu-dialog:has(.hp-source-rename)>.hu-dialog-body{padding:0;max-height:none;overflow:visible}\n.hp-source-dialog-close{position:absolute;inset-block-start:16px;inset-inline-end:16px;width:24px;height:24px;padding:0;border:0;border-radius:999px;display:grid;place-items:center;background:var(--color-background-tertiary-default);color:var(--color-text-secondary);font:400 20px/20px var(--hu-font);cursor:pointer}\n.hp-source-picker-intro{display:flex;flex-direction:column;align-items:center;gap:8px;padding-bottom:20px}.hp-source-picker-intro p{margin:0;font:400 14px/20px var(--hu-font);color:var(--color-text-secondary);text-align:center}\n.hp-source-picker-art{position:relative;width:160px;height:112px}.hp-source-picker-art>.hp-source-artwork{position:absolute!important;width:62px!important;height:62px!important}.hp-source-picker-art>.hp-source-artwork:nth-child(1){left:22px;top:8px}.hp-source-picker-art>.hp-source-artwork:nth-child(2){left:76px;top:8px}.hp-source-picker-art>.hp-source-artwork:nth-child(3){left:49px;top:46px}.hp-source-picker-art>.hp-source-artwork img{width:62px;height:62px;object-fit:contain}\n.hp-source-picker-scroll{max-height:calc(85dvh - 284px);overflow-y:auto;overscroll-behavior:contain;padding:4px;outline:none}.hp-source-picker-chips{display:flex;flex-wrap:wrap;justify-content:center;gap:8px}.hp-source-picker-chips>button{display:inline-flex;align-items:center;gap:8px;height:40px;max-width:100%;padding:0 12px;border:1px solid transparent;border-radius:999px;background:var(--color-background-secondary-default);color:var(--color-text-secondary);font:500 14px/20px var(--hu-font);cursor:pointer}.hp-source-picker-chips>button[aria-pressed=true]{background:var(--color-background-tertiary-default);border-color:var(--color-border-icon-secondary-default)}.hp-source-picker-chips>button:hover{background:var(--color-background-tertiary-hover)}.hp-source-picker-chips>button>.hp-source-artwork{width:24px;height:24px;flex:0 0 24px}.hp-source-picker-chips .hp-source-artwork img{width:24px;height:24px;object-fit:contain}\n.hu-dialog:has(.hp-source-chat-picker)>footer,.hu-dialog:has(.hp-source-rename)>footer{display:block;border:0;margin-top:16px;padding:0}.hu-dialog:has(.hp-source-chat-picker)>footer>.hu-button{width:100%;height:36px;min-height:36px;border-radius:999px}\n.hu-dialog:has(.hp-source-rename){width:440px}.hp-source-rename .hu-field{margin:0}.hu-dialog:has(.hp-source-rename)>footer{display:flex;justify-content:flex-end}.hu-dialog:has(.hp-source-rename)>footer>.hu-button{height:36px;min-height:36px;border-radius:999px}\n.hp-source-chat-toast{position:fixed;z-index:200;inset-inline-start:50%;transform:translateX(-50%);bottom:20px;display:flex;align-items:center;gap:8px;max-width:calc(100vw - 24px);padding:12px 16px;border:1px solid var(--color-border-button-default);border-radius:12px;background:var(--color-background-primary-default);color:var(--color-text-primary);box-shadow:0 4px 16px #0002;font:400 14px/20px var(--hu-font)}.hp-source-chat-toast svg{width:16px;height:16px;flex-shrink:0}\n.hp-source-conversation-popover{padding:4px!important;border-radius:14px!important}.hp-source-conversation-menu>div{padding-top:0;gap:4px}.hp-source-conversation-menu>div>span{padding:4px 8px;font:500 12px/16px var(--hu-font)}.hp-source-conversation-menu button{min-height:32px;height:32px;padding:6px 8px;border-radius:10px;font:500 14px/20px var(--hu-font)}.hp-source-conversation-menu button svg{width:20px;height:20px}\n.hp-source-context-popover{border-radius:14px}.hp-source-context-item svg{width:20px;height:20px}.hp-source-context-item[data-key=remove]{color:var(--color-text-error-primary)}\n.hu-dialog:has(.hp-source-rename)>footer>.hu-button{width:100%}.hp-source-conversation-tools>.hu-button,.hp-source-options-trigger{border-radius:4px;padding:4px}\n\n.hp-source-artwork>.hp-source-art-filter{position:absolute!important;width:0!important;height:0!important;pointer-events:none;overflow:hidden}\n\n.hp-source-conversation-menu>div{padding-top:4px;gap:6px}.hp-source-conversation-menu>div>span{padding:0 8px;font:500 14px/20px var(--hu-font)}.hp-source-options-art,.hp-source-options-art>.hp-source-artwork{display:block;width:20px;height:20px;flex:0 0 20px}.hp-source-options-art img{width:20px;height:20px;object-fit:contain}\n.hu-dialog:has(.hp-source-rename){min-height:194px}\n.hp-source-mobile-nav-content{position:relative}.hu-dialog:has(.hp-source-mobile-nav-content)>header>.hu-button{display:none}.hp-source-mobile-nav-close{position:absolute;inset-block-start:8px;inset-inline-end:-40px;z-index:3;width:20px;height:20px;min-width:20px;min-height:20px;padding:0;display:grid;place-items:center;border:0;border-radius:4px;background:transparent;color:var(--color-foreground-icon-secondary);cursor:pointer}.hp-source-mobile-nav-close svg{width:20px;height:20px}\n\n/* Final measured source-Multi geometry; generic Composer and advanced chat keep their layouts. */\n.hp-multi-chat[data-presentation=source] .hp-source-agent-navigation{padding:7px;gap:8px}\n.hp-multi-chat[data-presentation=source] .hp-source-agent-navigation>button:not(.hu-button){height:54px;min-height:54px;padding:6px;gap:8px}\n.hp-multi-chat[data-presentation=source] .hp-source-thread-label{display:flex;flex-direction:column;gap:2px}\n.hp-multi-chat[data-presentation=source] .hp-source-agent-navigation>button:not(.hu-button) small{font:400 14px/20px var(--hu-font)}\n.hp-multi-chat[data-presentation=source] .hp-multi-conversation{padding:0}\n.hp-multi-chat[data-presentation=source] .hp-multi-conversation>header{padding:12px;min-height:55px;flex-shrink:0;gap:8px}\n.hp-multi-chat[data-presentation=source] .hp-source-conversation-title{height:31px;min-height:31px;padding:0 12px 0 8px;color:var(--color-text-secondary);background:transparent;gap:8px;font:500 14px/20px var(--hu-font)}\n.hp-multi-chat[data-presentation=source] .hp-source-conversation-title:hover{background:transparent}\n.hp-source-title-group-avatar{position:relative!important;display:block;width:20px;height:20px;flex:0 0 20px}\n.hp-source-title-group-avatar>.hp-source-artwork{position:absolute!important;width:13px!important;height:13px!important}.hp-source-title-group-avatar>.hp-source-artwork:nth-child(1){inset:0 auto auto 0}.hp-source-title-group-avatar>.hp-source-artwork:nth-child(2){inset:0 auto auto 8px}.hp-source-title-group-avatar>.hp-source-artwork:nth-child(3){inset:8px auto auto 4px}.hp-source-title-group-avatar>.hp-source-artwork img{width:13px;height:13px;object-fit:contain}\n.hp-multi-chat[data-presentation=source] .hp-multi-composer{padding:4px;flex-shrink:0}\n.hp-multi-chat[data-presentation=source] .hp-multi-composer .hp-composer-example{position:relative}\n.hp-multi-chat[data-presentation=source] .hp-multi-composer .hp-composer-example>.hp-note,.hp-multi-chat[data-presentation=source] .hp-multi-composer .hp-composer-working{position:absolute!important;width:1px;height:1px;min-height:0;padding:0;margin:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap}\n.hp-multi-chat[data-presentation=source] .hp-multi-composer .hp-composer-example>.hp-status:not(:empty){position:absolute;inset-inline:8px;bottom:calc(100% + 8px);z-index:2;min-height:0;margin:0;padding:8px 12px;border:1px solid var(--color-border-button-default);border-radius:12px;background:var(--color-background-primary-default);box-shadow:0 2px 10px #0001;color:var(--color-text-secondary);font:400 12px/18px var(--hu-font)}\n.hp-multi-chat[data-presentation=source] .hp-source-panel .hp-composer-card{--multi-input-row:1;--multi-tools-row:2;grid-template-columns:36px max-content max-content minmax(0,1fr) 36px 36px;grid-template-rows:auto;gap:20px 4px;padding:16px 10px 10px;min-height:102px}\n.hp-multi-chat[data-presentation=source] .hp-source-panel .hp-composer-card>textarea{grid-column:1/-1;grid-row:var(--multi-input-row);width:calc(100% - 12px);margin-inline:6px;padding:0;min-height:20px!important;font:400 14px/20px var(--hu-font)}\n.hp-multi-chat[data-presentation=source] .hp-source-panel .hp-composer-toolbar .hp-picker-trigger,.hp-multi-chat[data-presentation=source] .hp-source-panel .hp-composer-toolbar>div>.hu-button,.hp-multi-chat[data-presentation=source] .hp-source-panel .hp-composer-end>.hu-button{grid-row:var(--multi-tools-row)}\n.hp-multi-chat[data-presentation=source] .hp-source-panel .hp-composer-end>.hu-button:first-child{grid-column:5}.hp-multi-chat[data-presentation=source] .hp-source-panel .hp-composer-end>.hu-button:last-child{grid-column:6}\n.hp-multi-chat[data-presentation=source] .hp-source-panel .hp-composer-toolbar>div>.hu-button,.hp-multi-chat[data-presentation=source] .hp-source-panel .hp-composer-end>.hu-button{width:36px;height:36px;min-width:36px;min-height:36px}\n.hp-multi-chat[data-presentation=source] .hp-source-panel .hp-picker-trigger>.hu-button{font:400 14px/20px var(--hu-font);padding-inline:6px}\n.hp-multi-chat[data-presentation=source] .hp-source-panel .hp-composer-card:has(.hp-attachment-strip),.hp-multi-chat[data-presentation=source] .hp-source-panel .hp-composer-card:has(.hp-composer-uploads){--multi-input-row:2;--multi-tools-row:3}\n.hp-multi-chat[data-presentation=source] .hp-source-panel .hp-composer-card>.hp-attachment-strip,.hp-multi-chat[data-presentation=source] .hp-source-panel .hp-composer-card>.hp-composer-uploads{grid-column:1/-1;grid-row:1}\n.hp-multi-chat[data-presentation=source] .hp-source-panel .hp-composer-card:has(.hp-attachment-strip):has(.hp-composer-uploads){--multi-input-row:3;--multi-tools-row:4}.hp-multi-chat[data-presentation=source] .hp-source-panel .hp-composer-card:has(.hp-attachment-strip)>.hp-composer-uploads{grid-row:2}\n.hp-multi-chat[data-presentation=source] .hp-multi-conversation>header{height:55px;flex-wrap:nowrap}\n.hp-multi-chat[data-presentation=source] .hp-source-conversation-title{flex:0 1 auto;max-width:none;min-width:0}\n.hp-source-conversation-title>.hp-source-title-group-avatar{overflow:visible}\n.hp-source-conversation-tools>.hu-button,.hp-source-options-trigger{min-height:24px}\n.hp-multi-chat[data-mobile-sidebar=true] .hp-multi-conversation>header>.hu-button{width:24px;height:24px;min-width:24px;min-height:24px;padding:2px;flex:0 0 24px}\n.hp-multi-chat[data-presentation=source] .hp-source-conversation-title>.hp-source-artwork{width:20px;height:20px;flex-basis:20px}.hp-multi-chat[data-presentation=source] .hp-source-conversation-title>.hp-source-artwork img{width:20px;height:20px}\n.hp-multi-chat[data-presentation=source] .hp-multi-conversation>header{align-items:flex-start}\n\n/* Public Multi composer chrome; the standalone picker keeps its existing presentation. */\n.hp-source-permission-shield{display:none}\n.hp-multi-chat[data-presentation=source] .hp-source-permission-shield{display:inline-block;width:14px!important;height:14px!important;flex-shrink:0}\n.hp-multi-chat[data-presentation=source] [aria-label=\"Permission\"] [data-ui-icon=\"chevron-down\"]{display:none}\n.hp-multi-chat[data-presentation=source] .hp-source-panel .hp-composer-end>.hu-button[aria-label=\"Voice input\"],.hp-multi-chat[data-presentation=source] .hp-source-panel .hp-composer-end>.hu-button[aria-label=\"Stop voice input\"]{width:36px!important;height:36px!important;min-width:36px!important;min-height:36px!important;border-radius:50%!important;border:1px solid var(--color-border-button-default)!important;background:var(--color-background-primary-default)!important;box-shadow:0 1px 2px #0000000d}\n.hp-multi-chat[data-presentation=source] .hp-source-panel .hp-composer-end>.hu-button[aria-label=\"Voice input\"] svg,.hp-multi-chat[data-presentation=source] .hp-source-panel .hp-composer-end>.hu-button[aria-label=\"Stop voice input\"] svg{width:20px!important;height:20px!important}\n\n/* Creator controls reconstructed from the public canvas preview. */\n.hp-creator-appearance{position:relative;height:360px;min-height:360px;overflow:hidden;isolation:isolate;margin-top:-12px}\n.hp-creator-emotions{position:absolute;left:calc(50% - 134px);top:30px;width:268px;height:268px;border-radius:50%;touch-action:none;z-index:2}\n.hp-creator-emotion-ring{position:absolute;inset:0;pointer-events:none}\n.hp-creator-emotion-position{position:absolute;left:50%;top:50%;margin:-17px;width:34px;height:34px}\n.hp-creator-emotion-position button{pointer-events:auto;display:flex;align-items:center;justify-content:center;overflow:hidden;width:34px;height:34px;padding:0;border:2px solid transparent;border-radius:50%;cursor:pointer;outline:none}\n.hp-creator-emotion-position button[aria-pressed=true]{border-color:var(--color-foreground-icon-secondary)}\n.hp-creator-emotion-position button:hover{box-shadow:0 0 0 2px var(--color-border-button-hover)}\n.hp-creator-emotion-position button:focus-visible{box-shadow:0 0 0 2px var(--color-border-focus-ring)}\n.hp-creator-emotion-position button:disabled{cursor:default;opacity:.5}\n.hp-creator-emotion-position .hp-source-artwork{width:34px;height:34px;flex:0 0 34px}\n.hp-creator-main-avatar{position:absolute;left:calc(50% - 81px);top:83px;width:162px;height:162px;pointer-events:none}\n.hp-creator-main-avatar>.hp-source-artwork{width:162px;height:162px}\n.hp-creator-shapes{position:absolute;inset:auto 0 0;height:126px;touch-action:pan-y;user-select:none;overflow:hidden;outline:none;mask-image:linear-gradient(to right,transparent,black 8%,black 92%,transparent);clip-path:polygon(0 0,15% 0,30% 36%,50% 50%,70% 36%,85% 0,100% 0,100% 100%,0 100%)}\n.hp-creator-shapes:focus-visible{box-shadow:inset 0 0 0 2px var(--color-border-focus-ring)}\n.hp-creator-shape-position{position:absolute;left:calc(50% - 28px);top:35px;width:56px;height:56px}\n.hp-creator-shape-position button{display:flex;align-items:center;justify-content:center;padding:0;width:56px;height:56px;border:0;background:transparent;border-radius:16px;cursor:grab;outline:none}\n.hp-creator-shape-position button:hover,.hp-creator-shape-position button[aria-selected=true]{background:var(--color-background-secondary-default)}\n.hp-creator-shape-position button[aria-selected=true]{box-shadow:0 0 0 1px var(--color-border-button-default)}\n.hp-creator-shape-position button:active{cursor:grabbing}\n.hp-creator-shape-position .hp-source-artwork{width:56px;height:56px}\n.hp-source-example .hp-creator-appearance+.hp-colors{height:38px;min-height:38px;margin-top:3px;justify-self:center;width:max-content;gap:4px}\n.hp-source-example .hp-creator-appearance+.hp-colors>button{border:0}\n.hp-source-artwork canvas{display:block;width:100%;height:100%;object-fit:contain}\n.hp-source-artwork>.hp-creator-canvas-layer{position:absolute;inset:0;display:block;width:100%;height:100%;pointer-events:none}\n.hp-source-artwork>.hp-creator-canvas-layer>span{width:100%!important;height:100%!important;max-width:none!important}\n.hp-source-example .hp-agent-editor-heading{height:32px;min-height:32px;align-items:flex-start;flex-wrap:nowrap;position:relative}\n.hp-source-example .hp-agent-editor-heading>.hu-button{position:absolute;inset-inline-end:0;top:14px}\n.hp-source-example .hp-agent-creator{grid-template-columns:minmax(0,1fr)}\n.hp-creator-main-avatar{left:50%;transform:translateX(-50%);width:min(162px,50%)}\n.hp-creator-main-avatar>.hp-source-artwork{width:100%;max-width:100%}\n/* Keep every color reachable when the documentation canvas is narrower than the full Creator. */\n.hp-source-example .hp-creator-appearance+.hp-colors{max-width:100%;min-width:0}\n.hp-source-example .hp-creator-appearance+.hp-colors>button,.hp-source-example .hp-creator-appearance+.hp-colors>.hp-avatar-custom-color{flex:0 1 26px;min-width:0;aspect-ratio:1;height:auto}\n.hp-source-example .hp-creator-appearance+.hp-colors>button{position:relative;overflow:hidden;box-shadow:none;transition:transform .15s ease-out}\n.hp-source-example .hp-creator-appearance+.hp-colors>button:hover{transform:scale(1.1)}\n.hp-source-example .hp-creator-appearance+.hp-colors>button[aria-pressed=true]{outline:1px solid var(--color-border-icon-secondary-default);outline-offset:2px}\n.hp-creator-gloss-body,.hp-creator-gloss-top,.hp-creator-gloss-point,.hp-creator-gloss-base{position:absolute;pointer-events:none}\n.hp-creator-gloss-body{inset:0;background:linear-gradient(#fff0,#ffffff4d)}\n.hp-creator-gloss-top{top:0;left:7.7%;width:84.6%;height:38.5%;border-radius:50%;background:linear-gradient(#ffffff80,#fff0);filter:blur(.5px)}\n.hp-creator-gloss-point{top:0;left:34.6%;width:30.8%;height:11.5%;border-radius:50%;background:linear-gradient(#ffffff80,#fff0);filter:blur(1px)}\n.hp-creator-gloss-base{top:73.1%;left:-23.1%;width:138.5%;height:53.8%;border-radius:50%;background:linear-gradient(#fff0,#ffffff80);filter:blur(.5px)}\n.hp-avatar-custom-color>.hp-creator-rainbow-art{position:absolute;inset:0;border-radius:50%;background:radial-gradient(ellipse at 50% 10%,#fff9,transparent 55%),conic-gradient(#fa928b,#f6d781,#c4eca5,#8eebd0,#90d7ee,#a9a4ed,#e499ed,#fa928b);pointer-events:none}\n/* Canonical Creator preferences, measured from the public editor. */\n.hp-creator-preferences{display:flex;flex-direction:column;gap:12px;margin-top:4px;padding-bottom:12px;font:400 14px/20px var(--hu-font)}\n.hp-creator-language-notifications,.hp-creator-voice-card{border-radius:16px;background:var(--color-background-secondary-default);padding-inline:12px}\n.hp-creator-language{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:56px;padding-block:12px;border-bottom:1px solid var(--color-separator-border)}\n.hp-creator-language>span,.hp-creator-voice-heading>span{display:flex;align-items:center;gap:8px;font-weight:500;flex-shrink:0}\n.hp-creator-language svg,.hp-creator-notifications>svg,.hp-creator-voice-heading>span>svg{width:20px;height:20px;color:var(--color-foreground-icon-secondary)}\n.hp-creator-notifications{display:flex;align-items:center;gap:12px;padding-block:12px}\n.hp-creator-notifications>div{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}\n.hp-creator-notifications>div>span{font-weight:500}\n.hp-creator-notifications p{font:400 12px/18px var(--hu-font);color:var(--color-text-secondary);margin:0}\n.hp-creator-voice-card{display:flex;flex-direction:column;gap:12px;padding:8px 12px 12px}\n.hp-creator-voice-heading{display:flex;justify-content:space-between;align-items:center;gap:12px}\n.hp-creator-voice-heading>div{display:flex;align-items:center;gap:4px;min-width:0}\n.hp-creator-voice-heading .hu-button{width:32px;height:32px;min-width:32px;min-height:32px;padding:0;color:var(--color-text-secondary)}\n.hp-creator-voice-select{min-width:0;max-width:144px}\n.hp-creator-speed{display:flex;flex-direction:column;gap:8px}\n.hp-creator-speed>span{font:400 12px/18px var(--hu-font);color:var(--color-text-secondary)}\n.hp-creator-speed>[role=radiogroup]{width:100%;background:var(--color-background-tertiary-default)}\n.hp-creator-speed [role=radio]{flex:1;min-width:0;padding-inline:4px}\n.dark .hp-creator-speed>[role=radiogroup]{background:var(--color-segmented-control-background)}\n.hp-source-example .hp-agent-creator>.hp-note{font-size:11px;margin:0;color:var(--color-text-secondary)}\n.hp-creator-color-popover{width:248px;max-width:calc(100vw - 24px);padding:10px;border:1px solid var(--color-border-button-default,var(--hu-line));border-radius:24px;background:var(--color-background-primary-default,var(--hu-panel));box-shadow:var(--shadow-dropdown,0 12px 24px #0002);outline:none;z-index:100}\n.hp-creator-color-dialog{display:flex;flex-direction:column;gap:10px;outline:none;color:var(--color-text-primary)}\n.hp-creator-color-area{position:relative;width:100%;aspect-ratio:3/2;border-radius:16px;touch-action:none;cursor:crosshair;outline:none;box-shadow:inset 0 0 0 1px #0000000f,inset 0 1px #ffffff1f}\n.hp-creator-color-hue{position:relative;width:100%;height:12px;background:linear-gradient(to right,red,#ff0,#0f0,#0ff,#00f,#f0f,red);border-radius:100px;touch-action:none;cursor:pointer;outline:none}\n.hp-creator-color-area>span,.hp-creator-color-hue>span{position:absolute;width:16px;height:16px;border:1px solid white;border-radius:50%;transform:translate(-50%,-50%);pointer-events:none;box-shadow:0 2px 4px #0003,inset 0 0 0 1px #0000000f}\n.hp-creator-color-hue>span{top:50%}\n.hp-creator-color-area:focus-visible,.hp-creator-color-hue:focus-visible{box-shadow:0 0 0 2px var(--color-border-focus-ring)}\n.hp-creator-color-value{display:flex;align-items:center;gap:8px}\n.hp-creator-color-value>span{position:relative;flex:0 0 32px;height:32px;overflow:hidden;border-radius:50%;box-shadow:inset 0 0 0 1px #0000000f}\n.hp-creator-color-value>input{width:100%;min-width:0;height:32px;border:0;border-radius:10px;padding:0 10px;background:var(--color-background-tertiary-default);color:var(--color-text-primary);font:13px/20px ui-monospace,monospace;text-transform:uppercase;outline:none}\n.hp-creator-color-value>input:focus{box-shadow:inset 0 0 0 2px var(--color-border-focus-ring);background:var(--color-background-primary-default)}\n/* Keep the public editor's fixed label column and contiguous 52/52/82px form rows. */\n.hp-source-example .hp-agent-creator>.hu-field:has(input){height:52px;min-height:52px;margin-top:-12px;padding:0 10px 0 12px;grid-template-columns:96px minmax(0,1fr);gap:0;align-items:center;border-radius:0;border-bottom:1px solid var(--color-border-button-default)}\n.hp-source-example .hp-agent-creator>.hp-colors+.hu-field{margin-top:3px;border-radius:16px 16px 0 0}\n.hp-source-example .hp-agent-creator>.hu-field>label{font-weight:400}\n.hp-source-example .hp-agent-creator>.hp-textarea-label{height:82px;min-height:82px;margin-top:-12px;padding:10px 10px 10px 12px;grid-template-columns:96px minmax(0,1fr);gap:0;align-items:start;border-radius:0 0 16px 16px;font-weight:400}\n.hp-source-example .hp-agent-creator>.hp-textarea-label textarea{height:62px;min-height:62px;max-height:62px}\n.hp-source-example .hp-agent-creator>.hp-textarea-label{line-height:20px}\n.hp-source-example .hp-agent-editor-heading{z-index:3}\n.hp-source-example .hp-creator-appearance+.hp-colors{max-width:none}\n.hp-source-example .hp-creator-appearance+.hp-colors>button,.hp-source-example .hp-creator-appearance+.hp-colors>.hp-avatar-custom-color{flex:0 0 26px;width:26px;min-width:26px;height:26px}\n.hp-source-run-chat{display:flex;flex-direction:column;width:min(560px,100%);height:500px;margin-inline:auto;padding:12px;border:1px solid var(--color-border-button-default);border-radius:16px;background:var(--color-background-full);box-shadow:0 1px 2px #0000000d;font:400 14px/20px var(--hu-font)}\n.hp-source-run-chat[data-search]{width:min(620px,100%);height:540px}\n.hp-source-run-chat>[role=log]{flex:1;min-height:0;overflow-y:auto;padding:4px 8px 16px;outline:none}\n.hp-source-run-empty{margin:40px 0 0;text-align:center;color:var(--color-text-tertiary);font:400 14px/20px var(--hu-font)}\n.hp-source-run-turn{display:flex;flex-direction:column;gap:16px;margin-bottom:20px}\n.hp-source-run-turn>.hp-source-user-message{align-self:flex-end;max-width:85%;margin:0;padding:10px 12px;border-radius:12px;background:var(--color-background-secondary-default)}\n.hp-source-run-answer{margin:0;color:var(--color-text-primary);font:400 14px/22px var(--hu-font)}\n.hp-source-run-chat>.bn-source,.hp-source-run-chat .hp-source-composer{width:100%;min-width:0}\n.hp-source-run-chat .hp-source-composer .hp-composer-card{padding:6px}\n@media(max-width:639px){.hp-source-run-chat{padding:8px}.hp-source-run-chat>[role=log]{padding-inline:4px}}\n.hp-source-auth-row{display:flex;flex-direction:column;align-items:center;gap:24px}.hp-source-auth-row>.hp-source-auth{width:100%;max-width:400px}\n.hp-source-panel-parts{width:100%;display:flex;flex-direction:column;gap:24px;align-items:center}\n.hp-source-picker-example{display:flex;justify-content:center;align-items:center;width:auto}\n.hp-source-working-composer{display:flex;flex-direction:column;gap:12px;width:min(560px,100%);margin-inline:auto}.hp-source-working-composer>.bn-source{width:100%}\n.hp-source-run-chat>[role=log]:focus-visible{outline:2px solid var(--color-border-focus-ring);outline-offset:-2px;border-radius:8px}\n.hp-source-auth-logo{display:grid;place-items:center;width:40px;height:40px;border-radius:12px;background:linear-gradient(160deg,var(--color-accent-400),var(--color-accent-600));color:white;box-shadow:inset 0 1px #ffffff60,0 2px 3px #0002}.hp-source-auth-logo>svg{width:24px;height:24px}\n.hp-source-panel.hp-source-picker-example .hp-picker-trigger:has(>[aria-label=Permission]){display:inline-flex}\n@media(max-width:639px){.hp-source-example .hp-questionnaire>footer{flex-wrap:nowrap;align-items:flex-start}.hp-source-example .hp-questionnaire>footer nav{flex-direction:column;align-items:flex-start;min-width:0}.hp-source-example .hp-questionnaire>footer>div{flex-shrink:0;margin-inline-start:auto}}\n\n.hp-source-example .hp-agent-progress>ol>li:not([data-complete=true])>span{font-size:0}\n.hp-source-example .hp-agent-progress>ol>li[aria-current=step]>span{border:0;background:conic-gradient(var(--color-agent-progress-ring) var(--hp-step-angle),var(--color-chart-track) 0)}\n.hp-source-example .hp-agent-progress>ol>li[data-complete=true]>span{border:0}\n@media(prefers-reduced-motion:no-preference){.hp-source-example .hp-agent-progress[data-running=true] .hp-progress-disclosure:before{animation:hu-spin 1s linear infinite}}\n\n/* Keep the prompt and response gutters distinct, including on narrow previews. */\n.hp-source-thinking{display:flex;flex-direction:column;align-items:center;width:100%}\n.hp-source-thinking-conversation{display:flex;flex-direction:column;width:100%;gap:0;padding:0;overflow:hidden}\n.hp-source-thinking-prompt{display:flex;flex-direction:column;gap:12px;padding:20px 16px 0}\n.hp-source-thinking-prompt>.hp-source-user-message{max-width:calc(50% + 6px);margin:0 -6px 0 auto;padding:11px 12px;border-radius:16px}\n.hp-source-thinking-response{display:flex;flex-direction:column;gap:10px;padding:16px 10px 10px}\n.hp-source-thinking-response>[role=status]{margin-inline:6px}\n.hp-source-thinking-variants>button{font-size:14px;padding-inline:10px;white-space:nowrap;flex-shrink:0}\n/* Source previews also honor reduced motion when used outside this website. */\n@media(prefers-reduced-motion:reduce){.hp-source-example *,.hp-source-example *:before,.hp-source-example *:after{animation:none!important;transition:none!important;scroll-behavior:auto!important}}\n\n/* Status glyphs share the source's 14px grid instead of font-dependent symbols. */\n.hp-composer-status-bar .hp-picker-trigger>.hu-button>svg{display:block;width:14px;height:14px;flex-shrink:0}\n.hp-composer-status-bar .hp-picker-trigger>.hu-button{display:inline-flex;align-items:center;gap:4px}\n.hp-composer-status-bar .hp-picker-trigger:last-child{margin-inline-start:auto}\n\n/* Match the circular voice control across plain, panel and loading composers. */\n.hp-source-composer .hp-composer-end>.hu-button:is([aria-label=\"Voice input\"],[aria-label=\"Stop voice input\"]){border:1px solid var(--color-border-button-default);padding:7px}\n.hp-source-composer .hp-composer-end>.hu-button:is([aria-label=\"Voice input\"],[aria-label=\"Stop voice input\"]) svg{width:20px;height:20px}\n",
  "src/application-families.css": ".ha-family {\n  width: 100%;\n  min-width: 0;\n  font-family: var(--hu-font);\n  color: var(--hu-text);\n  font-size: 14px;\n  line-height: 20px;\n}\n.ha-family h3 {\n  font-size: 18px;\n  line-height: 28px;\n  font-weight: 600;\n  margin: 0 0 8px;\n  letter-spacing: -0.02em;\n}\n.ha-family p {\n  color: var(--hu-muted);\n  line-height: 22px;\n}\n.ha-status {\n  font-size: 12px;\n  line-height: 20px;\n  min-height: 20px;\n  color: var(--hu-muted);\n  margin: 12px 0 0;\n}\n.ha-activity ol {\n  list-style: none;\n  margin: 20px 0 0;\n  padding: 0;\n  display: grid;\n  gap: 24px;\n}\n.ha-activity ol > li {\n  display: flex;\n  gap: 12px;\n  align-items: flex-start;\n}\n.ha-activity li strong {\n  font-weight: 500;\n}\n.ha-activity li p {\n  margin: 6px 0;\n}\n.ha-activity li small {\n  display: block;\n  color: var(--hu-muted);\n  font-size: 12px;\n  margin-top: 4px;\n}\n.ha-activity .hu-avatar {\n  flex-shrink: 0;\n}\n.ha-activity .hu-tabs > [role='tabpanel'] {\n  padding: 0;\n}\n.ha-notification {\n  display: flex;\n  align-items: flex-start;\n  gap: 12px;\n  padding: 16px;\n  border: 1px solid var(--hu-line);\n  border-radius: 12px;\n  background: var(--hu-bg-secondary);\n  color: var(--hu-text);\n}\n.ha-notification > span {\n  display: grid;\n  place-items: center;\n  border: 1px solid currentColor;\n  width: 24px;\n  height: 24px;\n  border-radius: 50%;\n  flex-shrink: 0;\n}\n.ha-notification > div {\n  flex: 1;\n}\n.ha-notification p {\n  margin: 4px 0 0;\n}\n.ha-tone-success > span {\n  color: #15803d;\n}\n.ha-tone-warning > span {\n  color: #a16207;\n}\n.ha-tone-error > span {\n  color: var(--hu-error);\n}\n.dark .ha-tone-success > span {\n  color: #86efac;\n}\n.dark .ha-tone-warning > span {\n  color: #fde047;\n}\n.ha-navigation {\n  display: grid;\n  grid-template-columns: 180px minmax(0, 1fr);\n  border: 1px solid var(--hu-line);\n  border-radius: 12px;\n  overflow: hidden;\n}\n.ha-navigation nav {\n  padding: 12px;\n  background: var(--hu-bg-secondary);\n  border-inline-end: 1px solid var(--hu-line);\n  display: grid;\n  gap: 4px;\n}\n.ha-navigation nav > button {\n  display: flex;\n  justify-content: space-between;\n  text-align: start;\n  align-items: center;\n  gap: 12px;\n  padding: 10px 12px;\n  border: 0;\n  border-radius: 6px;\n  background: transparent;\n  color: var(--hu-muted);\n  font: inherit;\n  cursor: pointer;\n}\n.ha-navigation nav > button[aria-current='page'] {\n  background: var(--hu-bg);\n  color: var(--hu-text);\n  box-shadow: 0 1px 3px #0001;\n}\n.ha-navigation nav small {\n  border: 1px solid var(--hu-border);\n  border-radius: 4px;\n  min-width: 20px;\n  text-align: center;\n  font-size: 11px;\n}\n.ha-navigation > section {\n  padding: 24px;\n}\n.ha-breadcrumbs ol {\n  display: flex;\n  align-items: center;\n  flex-wrap: wrap;\n  gap: 12px;\n  list-style: none;\n  padding: 0;\n  margin: 0;\n}\n.ha-breadcrumbs li {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  color: var(--hu-muted);\n}\n.ha-breadcrumbs li[aria-current],\n.ha-breadcrumbs span[aria-current] {\n  color: var(--hu-text);\n}\n.ha-breadcrumbs .hu-button {\n  font-size: 14px;\n}\n.ha-calendar {\n  max-width: 350px;\n  margin: auto;\n}\n.ha-calendar header,\n.ha-date-popover header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  gap: 16px;\n  margin-bottom: 16px;\n}\n.ha-calendar h2,\n.ha-date-popover h2 {\n  font-size: 16px;\n  line-height: 24px;\n  margin: 0;\n  font-weight: 600;\n}\n.ha-calendar table,\n.ha-date-popover table {\n  width: 100%;\n  border-collapse: separate;\n  border-spacing: 3px;\n  table-layout: fixed;\n}\n.ha-calendar th,\n.ha-date-popover th {\n  font-size: 12px;\n  color: var(--hu-muted);\n  font-weight: 500;\n  height: 28px;\n}\n.ha-calendar td,\n.ha-date-popover td {\n  padding: 0;\n}\n.ha-calendar [data-react-aria-pressable],\n.ha-date-popover .react-aria-CalendarCell {\n  display: grid;\n  place-items: center;\n  min-height: 36px;\n  border-radius: 6px;\n  cursor: pointer;\n  outline-offset: 2px;\n}\n.ha-calendar .react-aria-CalendarCell[data-selected],\n.ha-date-popover .react-aria-CalendarCell[data-selected] {\n  background: var(--hu-brand);\n  color: var(--hu-on-brand);\n  font-weight: 600;\n}\n.ha-calendar .react-aria-CalendarCell[data-outside-month],\n.ha-date-popover .react-aria-CalendarCell[data-outside-month] {\n  color: var(--hu-muted);\n  opacity: 0.5;\n}\n.ha-calendar .react-aria-CalendarCell[data-disabled],\n.ha-date-popover .react-aria-CalendarCell[data-disabled] {\n  opacity: 0.4;\n  cursor: not-allowed;\n}\n.ha-date-picker {\n  display: grid;\n  gap: 6px;\n  max-width: 320px;\n  margin: auto;\n}\n.ha-date-picker > label {\n  font-weight: 500;\n}\n.ha-date-picker > .react-aria-Group {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 8px;\n  border: 1px solid var(--hu-border);\n  border-radius: 8px;\n  padding: 8px 12px;\n  background: var(--hu-bg);\n  min-height: 40px;\n}\n.ha-date-picker .react-aria-DateInput {\n  display: flex;\n  gap: 2px;\n}\n.ha-date-picker .react-aria-DateSegment {\n  padding: 1px;\n  border-radius: 2px;\n  font-variant-numeric: tabular-nums;\n}\n.ha-date-picker .react-aria-DateSegment[data-placeholder] {\n  color: var(--hu-muted);\n}\n.ha-date-picker .react-aria-Button {\n  border: 0;\n  background: none;\n  color: var(--hu-muted);\n  font: inherit;\n  cursor: pointer;\n  padding: 0 4px;\n}\n.ha-date-picker[data-disabled] {\n  opacity: 0.5;\n}\n.ha-date-popover {\n  background: var(--hu-bg);\n  border: 1px solid var(--hu-border);\n  border-radius: 12px;\n  padding: 20px;\n  box-shadow: 0 12px 32px #0002;\n  z-index: 100;\n  max-width: calc(100vw - 24px);\n  min-width: 280px;\n  font: 14px/20px var(--hu-font);\n  color: var(--hu-text);\n}\n.ha-date-popover .react-aria-Dialog {\n  outline: none;\n}\n.ha-header {\n  width: 100%;\n}\n.ha-header-card {\n  border: 1px solid var(--hu-line);\n  border-radius: 12px;\n  padding: 24px;\n  background: var(--hu-bg);\n}\n.ha-header-row {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  gap: 24px;\n}\n.ha-header-row h3 {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  flex-wrap: wrap;\n  margin: 8px 0;\n}\n.ha-header-row p {\n  margin: 0;\n  font-size: 14px;\n}\n.ha-header-page h3 {\n  font-size: 28px;\n  line-height: 36px;\n}\n.ha-eyebrow {\n  font-size: 10px;\n  letter-spacing: 0.1em;\n  color: var(--hu-brand-text);\n  font-weight: 600;\n}\n.ha-code {\n  border: 1px solid var(--hu-line);\n  border-radius: 10px;\n  background: var(--hu-bg-secondary);\n  overflow: hidden;\n}\n.ha-code > header {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  padding: 12px 16px;\n  border-bottom: 1px solid var(--hu-line);\n  font-size: 12px;\n}\n.ha-code pre {\n  padding: 16px;\n  margin: 0;\n  overflow: auto;\n  color: var(--hu-text);\n  font:\n    12px/1.7 ui-monospace,\n    SFMono-Regular,\n    monospace;\n}\n.ha-code > p {\n  padding: 0 16px;\n  min-height: 20px;\n  font-size: 12px;\n}\n.ha-color-picker {\n  display: grid;\n  grid-template-columns: 100px minmax(0, 1fr);\n  gap: 20px;\n  max-width: 450px;\n  margin: auto;\n}\n.ha-color-preview {\n  border: 1px solid var(--hu-border);\n  border-radius: 12px;\n  min-height: 140px;\n}\n.ha-color-picker > div:nth-child(2) {\n  display: grid;\n  gap: 8px;\n}\n.ha-color-picker label {\n  font-size: 14px;\n  font-weight: 500;\n}\n.ha-color-picker input[type='color'] {\n  width: 100%;\n  height: 36px;\n  padding: 3px;\n  border: 1px solid var(--hu-border);\n  border-radius: 8px;\n  background: var(--hu-bg);\n}\n.ha-color-swatches {\n  grid-column: 1/-1;\n  display: flex;\n  gap: 10px;\n  flex-wrap: wrap;\n}\n.ha-color-swatches button {\n  width: 32px;\n  height: 32px;\n  border: 2px solid var(--hu-bg);\n  border-radius: 50%;\n  box-shadow: 0 0 0 1px var(--hu-border);\n  cursor: pointer;\n}\n.ha-color-swatches button[aria-pressed='true'] {\n  box-shadow: 0 0 0 2px var(--hu-text);\n}\n.ha-color-picker > .ha-status {\n  grid-column: 1/-1;\n}\n.ha-command-example {\n  display: grid;\n  justify-items: center;\n}\n.ha-command-list {\n  display: grid;\n  gap: 4px;\n  margin-top: 16px;\n}\n.ha-command-list > [role='option'] {\n  border-radius: 6px;\n  padding: 10px 12px;\n  cursor: pointer;\n  outline-offset: 2px;\n}\n.ha-command-list > [aria-selected='true'] {\n  background: var(--hu-bg-secondary);\n}\n.ha-command-list strong {\n  display: block;\n  font-weight: 500;\n}\n.ha-command-list small {\n  color: var(--hu-muted);\n  font-size: 12px;\n}\n.ha-divider-example {\n  width: 100%;\n}\n.ha-divider {\n  height: 1px;\n  background: var(--hu-line);\n  margin: 32px 0;\n  position: relative;\n  text-align: center;\n}\n.ha-divider > span {\n  position: relative;\n  top: -10px;\n  background: var(--hu-bg);\n  padding: 0 12px;\n  color: var(--hu-muted);\n  font-size: 12px;\n}\n.ha-divider-vertical {\n  display: flex;\n  gap: 32px;\n  align-items: center;\n}\n.ha-divider-vertical .ha-divider {\n  height: 120px;\n  width: 1px;\n  margin: 0;\n}\n.ha-divider-vertical .ha-divider > span {\n  display: none;\n}\n.ha-empty {\n  text-align: center;\n  max-width: 420px;\n  margin: auto;\n  display: grid;\n  justify-items: center;\n  gap: 12px;\n}\n.ha-empty > span {\n  width: 48px;\n  height: 48px;\n  border: 1px solid var(--hu-border);\n  border-radius: 12px;\n  display: grid;\n  place-items: center;\n  font-size: 24px;\n}\n.ha-empty p,\n.ha-empty h3 {\n  margin: 0;\n}\n.ha-empty ul {\n  text-align: start;\n  margin: 0;\n  padding-inline-start: 20px;\n}\n.ha-upload {\n  position: relative;\n  border: 1px dashed var(--hu-border);\n  border-radius: 12px;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  gap: 8px;\n  padding: 28px 20px;\n  background: var(--hu-bg);\n  cursor: pointer;\n  text-align: center;\n}\n.ha-upload input {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  clip: rect(0, 0, 0, 0);\n  overflow: hidden;\n}\n.ha-upload:focus-within {\n  outline: 2px solid var(--hu-brand-text);\n  outline-offset: 3px;\n}\n.ha-upload > span {\n  width: 40px;\n  height: 40px;\n  border: 1px solid var(--hu-border);\n  border-radius: 8px;\n  display: grid;\n  place-items: center;\n  font-size: 22px;\n}\n.ha-upload small {\n  font-size: 12px;\n  color: var(--hu-muted);\n}\n.ha-upload.ha-dragging {\n  border-color: var(--hu-brand-text);\n  background: var(--hu-bg-secondary);\n}\n.ha-disabled {\n  opacity: 0.5;\n  cursor: not-allowed;\n}\n.ha-upload-list {\n  list-style: none;\n  margin: 16px 0 0;\n  padding: 0;\n  display: grid;\n  gap: 10px;\n}\n.ha-upload-list > li {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  padding: 12px;\n  border: 1px solid var(--hu-line);\n  border-radius: 8px;\n}\n.ha-upload-list > li > span {\n  font-size: 10px;\n  border: 1px solid var(--hu-border);\n  padding: 6px;\n  border-radius: 4px;\n}\n.ha-upload-list > li > div {\n  flex: 1;\n  min-width: 0;\n}\n.ha-upload-list strong {\n  display: block;\n  font-size: 13px;\n  overflow-wrap: anywhere;\n}\n.ha-upload-list small {\n  font-size: 12px;\n  color: var(--hu-muted);\n}\n.ha-upload-errors {\n  color: var(--hu-error);\n  font-size: 12px;\n  line-height: 20px;\n}\n.ha-filter-bar {\n  display: flex;\n  align-items: flex-end;\n  gap: 12px;\n  flex-wrap: wrap;\n  margin-bottom: 16px;\n}\n.ha-filter-bar > .hu-field {\n  flex: 1;\n  min-width: 130px;\n  max-width: 220px;\n}\n.ha-inline-cta {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  gap: 20px;\n  border: 1px solid var(--hu-line);\n  padding: 20px;\n  border-radius: 12px;\n  background: var(--hu-bg-secondary);\n}\n.ha-inline-cta h3 {\n  font-size: 16px;\n  margin-bottom: 4px;\n}\n.ha-inline-cta p {\n  margin: 0;\n}\n.ha-milestones {\n  margin: 16px 0;\n  padding-inline-start: 24px;\n  line-height: 28px;\n}\n.ha-loading {\n  display: grid;\n  justify-items: center;\n  gap: 24px;\n}\n.ha-loading > div {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  min-height: 40px;\n}\n.ha-loading > div > span:not(.hu-spinner) {\n  font-size: 24px;\n  color: var(--hu-brand-text);\n}\n.ha-metrics {\n  display: grid;\n  grid-template-columns: repeat(3, minmax(0, 1fr));\n  gap: 16px;\n}\n.ha-metrics > article {\n  display: grid;\n  gap: 16px;\n  border: 1px solid var(--hu-line);\n  border-radius: 12px;\n  padding: 20px;\n  min-width: 0;\n  background: var(--hu-bg);\n}\n.ha-metrics > article > span {\n  color: var(--hu-muted);\n  font-size: 13px;\n}\n.ha-metrics strong {\n  font-size: 28px;\n  line-height: 36px;\n  letter-spacing: -0.04em;\n  font-weight: 600;\n}\n.ha-metrics small {\n  font-size: 12px;\n  line-height: 20px;\n}\n.ha-metrics small > span {\n  display: block;\n  color: var(--hu-muted);\n}\n.ha-positive {\n  color: #15803d;\n}\n.ha-negative {\n  color: var(--hu-error);\n}\n.dark .ha-positive {\n  color: #86efac;\n}\n.ha-pagination {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 12px;\n  flex-wrap: wrap;\n  padding-top: 16px;\n  border-top: 1px solid var(--hu-line);\n}\n.ha-pagination > div {\n  display: flex;\n  align-items: center;\n  gap: 4px;\n}\n.ha-pagination > div > button {\n  height: 32px;\n  min-width: 32px;\n  border: 0;\n  border-radius: 6px;\n  color: var(--hu-muted);\n  background: transparent;\n  font: inherit;\n  cursor: pointer;\n}\n.ha-pagination > div > button[aria-current='page'] {\n  color: var(--hu-text);\n  background: var(--hu-bg-secondary);\n  font-weight: 600;\n}\n.ha-pagination-example > ol {\n  display: grid;\n  gap: 12px;\n  margin-bottom: 24px;\n}\n.ha-progress-steps > ol {\n  list-style: none;\n  display: flex;\n  gap: 12px;\n  padding: 0;\n  margin: 0 0 28px;\n}\n.ha-progress-steps > ol > li {\n  flex: 1;\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  position: relative;\n  color: var(--hu-muted);\n}\n.ha-progress-steps > ol > li > span {\n  width: 28px;\n  height: 28px;\n  display: grid;\n  place-items: center;\n  border: 1px solid var(--hu-border);\n  border-radius: 50%;\n  flex-shrink: 0;\n}\n.ha-progress-steps > ol > li[aria-current='step'] {\n  color: var(--hu-brand-text);\n}\n.ha-progress-steps > ol > li[aria-current='step'] > span,\n.ha-progress-steps > ol > li[data-completed='true'] > span {\n  background: var(--hu-brand);\n  color: var(--hu-on-brand);\n  border-color: var(--hu-brand);\n}\n.ha-progress-steps > section {\n  display: grid;\n  gap: 16px;\n  max-width: 420px;\n  margin: auto;\n}\n.ha-progress-steps > section h3,\n.ha-progress-steps > section p {\n  margin: 0;\n}\n.ha-progress-steps dl {\n  display: grid;\n  grid-template-columns: 120px minmax(0, 1fr);\n  gap: 12px;\n  margin: 0;\n}\n.ha-progress-steps dd {\n  margin: 0;\n  overflow-wrap: anywhere;\n}\n.ha-section-footer {\n  display: grid;\n  gap: 20px;\n}\n.ha-section-footer > .hu-field {\n  max-width: 360px;\n}\n.ha-section-footer > footer {\n  display: flex;\n  align-items: center;\n  justify-content: flex-end;\n  gap: 12px;\n  padding-top: 20px;\n  border-top: 1px solid var(--hu-line);\n}\n.ha-section-footer > footer > span {\n  margin-inline-end: auto;\n  font-size: 12px;\n  color: var(--hu-muted);\n}\n.ha-slideout {\n  display: grid;\n  justify-items: center;\n}\n.hu-dialog:has(.ha-drawer-panel) {\n  margin: 0 0 0 auto;\n  height: 100dvh;\n  max-height: 100dvh;\n  width: 400px;\n  max-width: calc(100vw - 24px);\n  border-radius: 12px 0 0 12px;\n  display: none;\n}\n.hu-dialog[open]:has(.ha-drawer-panel) {\n  display: flex;\n  flex-direction: column;\n}\n.hu-dialog:has(.ha-drawer-panel) > .hu-dialog-body {\n  flex: 1;\n}\n.hu-dialog:has(.ha-drawer-panel) > footer {\n  margin-top: auto;\n}\n.ha-tree {\n  border: 1px solid var(--hu-line);\n  border-radius: 10px;\n  padding: 12px;\n  background: var(--hu-bg);\n}\n.ha-tree .react-aria-TreeItem {\n  border-radius: 6px;\n  padding: 8px 12px 8px calc(12px + (var(--tree-item-level) - 1) * 20px);\n  cursor: pointer;\n  outline-offset: 2px;\n}\n.ha-tree .react-aria-TreeItem[data-selected] {\n  background: var(--hu-bg-secondary);\n  color: var(--hu-brand-text);\n}\n.ha-tree .react-aria-TreeItem[data-disabled] {\n  opacity: 0.5;\n  cursor: not-allowed;\n}\n.ha-tree-chevron {\n  width: 24px;\n  height: 24px;\n  display: inline-grid;\n  place-items: center;\n  padding: 0;\n  margin-inline-end: 6px;\n  border: 0;\n  border-radius: 4px;\n  background: none;\n  font: inherit;\n  color: var(--hu-muted);\n  cursor: pointer;\n}\n.ha-tree .react-aria-TreeItemContent {\n  display: flex;\n  align-items: center;\n}\n.ha-family button:focus-visible,\n.ha-family [data-focus-visible],\n.ha-date-popover [data-focus-visible],\n.ha-family pre:focus-visible,\n.ha-date-picker [data-focus-visible] {\n  outline: 2px solid var(--hu-brand-text);\n  outline-offset: 2px;\n}\n.ha-family button:disabled {\n  cursor: not-allowed;\n  opacity: 0.5;\n}\n.ha-size-sm {\n  font-size: 13px;\n}\n.ha-size-lg {\n  font-size: 16px;\n}\n@media (max-width: 700px) {\n  .ha-header-row,\n  .ha-inline-cta {\n    align-items: flex-start;\n    flex-direction: column;\n    gap: 16px;\n  }\n  .ha-metrics {\n    grid-template-columns: 1fr;\n  }\n  .ha-metrics > article {\n    gap: 10px;\n  }\n  .ha-navigation {\n    grid-template-columns: 1fr;\n  }\n  .ha-navigation nav {\n    display: flex;\n    overflow: auto;\n    border-inline-end: 0;\n    border-bottom: 1px solid var(--hu-line);\n  }\n  .ha-navigation nav > button {\n    white-space: nowrap;\n  }\n  .ha-navigation > section {\n    padding: 20px;\n  }\n  .ha-color-picker {\n    grid-template-columns: 70px minmax(0, 1fr);\n    gap: 14px;\n  }\n  .ha-section-footer > footer {\n    flex-wrap: wrap;\n  }\n  .ha-section-footer > footer > span {\n    width: 100%;\n  }\n  .ha-progress-steps > ol {\n    gap: 8px;\n  }\n  .ha-progress-steps > ol > li {\n    flex-direction: column;\n    align-items: flex-start;\n    font-size: 12px;\n  }\n  .ha-pagination {\n    gap: 10px;\n  }\n  .ha-pagination > div {\n    order: 3;\n    justify-content: center;\n    width: 100%;\n  }\n  .ha-divider-vertical {\n    gap: 16px;\n  }\n  .ha-header-card {\n    padding: 20px;\n  }\n}\n@media (prefers-reduced-motion: reduce) {\n  .ha-family *,\n  .ha-date-popover * {\n    scroll-behavior: auto !important;\n    animation-duration: 0s !important;\n    transition-duration: 0s !important;\n  }\n}\n.ha-family,\n.ha-family *,\n.ha-date-popover,\n.ha-date-popover * {\n  box-sizing: border-box;\n}\n.ha-family table,\n.ha-date-popover table {\n  color: var(--hu-text);\n  font: inherit;\n}\n/* Additional public application patterns preserve reusable composition. */\n.ha-breadcrumb-demo,\n.ha-divider-demo,\n.ha-notification-demo {\n  display: grid;\n  gap: 24px;\n  width: 100%;\n  min-width: 0;\n}\n.ha-breadcrumbs li > a,\n.ha-breadcrumbs li > span[aria-current],\n.ha-breadcrumbs .hu-button {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  padding: 5px 7px;\n  border-radius: 6px;\n  font-size: 12px;\n  text-decoration: none;\n  color: var(--hu-muted);\n}\n.ha-breadcrumbs li > a:hover,\n.ha-breadcrumbs .hu-button:hover {\n  background: var(--hu-bg-secondary);\n  color: var(--hu-text);\n}\n.ha-breadcrumbs li > a:focus-visible {\n  outline: 2px solid var(--hu-brand-text);\n  outline-offset: 2px;\n}\n.ha-breadcrumbs [aria-disabled='true'] {\n  opacity: 0.5;\n  cursor: not-allowed;\n}\n.ha-breadcrumb-leading {\n  display: inline-flex;\n  align-items: center;\n}\n.ha-breadcrumb-avatar {\n  display: grid;\n  place-items: center;\n  width: 18px;\n  height: 18px;\n  border-radius: 50%;\n  font-size: 10px;\n  background: color-mix(in srgb, var(--hu-brand) 15%, var(--hu-bg));\n  color: var(--hu-brand-text);\n}\n.ha-divider-demo {\n  gap: 18px;\n}\n.ha-divider {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  margin: 12px 0;\n  background: transparent;\n  height: auto;\n  min-height: 1px;\n}\n.ha-divider:before,\n.ha-divider:after {\n  content: '';\n  flex: 1;\n  height: 1px;\n  background: var(--hu-line);\n}\n.ha-divider > span {\n  position: static;\n  top: auto;\n  padding: 0;\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  max-width: 100%;\n  background: var(--hu-bg);\n}\n.ha-divider-double {\n  padding-block: 8px;\n  border-block: 1px solid var(--hu-line);\n}\n.ha-divider-double:before,\n.ha-divider-double:after {\n  background: transparent;\n}\n.ha-divider-filled {\n  padding: 10px 14px;\n  background: var(--hu-bg-secondary);\n  border-radius: 8px;\n}\n.ha-divider-filled:before,\n.ha-divider-filled:after {\n  background: transparent;\n}\n.ha-divider-filled > span {\n  background: transparent;\n}\n.ha-divider-align-start:before {\n  flex: 0;\n}\n.ha-divider-align-end:after {\n  flex: 0;\n}\n.ha-divider-vertical {\n  min-height: 80px;\n  min-width: 1px;\n  width: 1px;\n  flex-direction: column;\n}\n.ha-divider-vertical:before,\n.ha-divider-vertical:after {\n  width: 1px;\n  min-height: 20px;\n}\n.ha-divider-vertical > span {\n  writing-mode: vertical-rl;\n}\n.ha-notification-controls {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  flex-wrap: wrap;\n}\n.ha-notification-controls > .hu-field {\n  flex: 1;\n  min-width: 160px;\n  max-width: 230px;\n}\n.ha-notification-avatar {\n  width: 36px;\n  height: 36px;\n  object-fit: cover;\n  border-radius: 50%;\n  flex-shrink: 0;\n}\n.ha-notification-actions {\n  display: flex;\n  gap: 8px;\n  flex-wrap: wrap;\n  margin-top: 12px;\n}\n.ha-notification-floating {\n  position: fixed;\n  z-index: 1000;\n  width: min(430px, calc(100vw - 32px));\n  filter: drop-shadow(0 8px 20px #00000018);\n}\n.ha-position-top-left {\n  top: 24px;\n  left: 24px;\n}\n.ha-position-top-center {\n  top: 24px;\n  left: 50%;\n  transform: translateX(-50%);\n}\n.ha-position-top-right {\n  top: 24px;\n  right: 24px;\n}\n.ha-position-bottom-left {\n  bottom: 24px;\n  left: 24px;\n}\n.ha-position-bottom-center {\n  bottom: 24px;\n  left: 50%;\n  transform: translateX(-50%);\n}\n.ha-position-bottom-right {\n  bottom: 24px;\n  right: 24px;\n}\n.ha-notification-floating .ha-notification {\n  background: var(--hu-bg);\n}\n.ha-notification > div {\n  min-width: 0;\n}\n.ha-notification p {\n  overflow-wrap: anywhere;\n}\n.ha-pagination-gap {\n  display: grid;\n  place-items: center;\n  width: 24px;\n  color: var(--hu-muted);\n}\n.ha-upload {\n  position: relative;\n  isolation: isolate;\n}\n.ha-upload[data-upload-progress]:after {\n  content: '';\n  position: absolute;\n  inset: -2px;\n  border-radius: 12px;\n  padding: 2px;\n  background: conic-gradient(var(--hu-brand-text) var(--ha-upload-progress), transparent 0);\n  mask:\n    linear-gradient(#000 0 0) content-box,\n    linear-gradient(#000 0 0);\n  mask-composite: exclude;\n  pointer-events: none;\n}\n.ha-upload-progress {\n  width: 100%;\n  accent-color: var(--hu-brand);\n  height: 5px;\n  margin-top: 12px;\n}\n.ha-upload-actions {\n  display: flex;\n  gap: 10px;\n  flex-wrap: wrap;\n  margin-top: 12px;\n}\n.ha-upload-list > li > span {\n  font-size: 9px;\n  letter-spacing: 0.02em;\n}\n.ha-tree-file-icon {\n  flex-shrink: 0;\n  color: var(--hu-muted);\n}\n.ha-tree [role='treeitem'][aria-expanded] .ha-tree-file-icon {\n  color: var(--hu-brand-text);\n}\n.ha-tree [role='treeitem'] {\n  position: relative;\n}\n.ha-tree [role='treeitem']:before {\n  content: '';\n  position: absolute;\n  inset-inline-start: calc((var(--tree-item-level, 1) - 1) * 20px + 6px);\n  top: 0;\n  bottom: 0;\n  border-inline-start: 1px solid var(--hu-border);\n  pointer-events: none;\n  opacity: 0.6;\n}\n.ha-date-examples {\n  display: grid;\n  gap: 32px;\n  width: 100%;\n  min-width: 0;\n}\n.ha-date-examples > section {\n  min-width: 0;\n}\n.ha-date-examples h3 {\n  font: 500 14px/20px var(--hu-font);\n  margin: 0 0 14px;\n}\n@media (max-width: 600px) {\n  .ha-notification-floating {\n    left: 16px;\n    right: auto;\n    transform: none;\n  }\n  .ha-notification-controls > .hu-field {\n    max-width: 100%;\n  }\n  .ha-pagination {\n    gap: 8px;\n  }\n  .ha-pagination > .hu-button {\n    padding-inline: 8px;\n  }\n  .ha-pagination > div {\n    gap: 2px;\n  }\n  .ha-pagination > div > button {\n    width: 28px;\n    min-width: 28px;\n  }\n  .ha-pagination-gap {\n    width: 16px;\n  }\n}\n\n.ha-tree .react-aria-TreeItem {\n  padding-block: 8px;\n  padding-inline: calc(12px + (var(--tree-item-level) - 1) * 20px) 12px;\n}\n.ha-tree-chevron {\n  margin-inline-end: 0;\n  margin-inline-end: 6px;\n}\n.ha-tree-file-icon {\n  margin-inline-end: 7px;\n}\n.ha-tree-leaf-spacer {\n  pointer-events: none;\n}\n\n/* Audited notification/status and control semantics; disabled contrast remains intentionally muted. */\n.ha-notification,\n.ha-notification-floating .ha-notification {\n  background: var(--color-background-primary-default);\n  border-color: var(--color-border-button-default);\n  color: var(--color-text-primary);\n}\n.ha-tone-info > span {\n  background: var(--color-notification-information-background);\n  color: var(--color-notification-information-foreground);\n  border-color: transparent;\n}\n.ha-tone-success > span,\n.dark .ha-tone-success > span {\n  background: var(--color-notification-success-background);\n  color: var(--color-notification-success-foreground);\n  border-color: transparent;\n}\n.ha-tone-error > span {\n  background: var(--color-notification-error-background);\n  color: var(--color-notification-error-foreground);\n  border-color: transparent;\n}\n.ha-tone-warning > span,\n.dark .ha-tone-warning > span {\n  background: var(--color-status-yellow-background);\n  color: var(--color-status-yellow-text);\n  border-color: transparent;\n}\n.ha-positive,\n.dark .ha-positive {\n  color: var(--color-status-lime-text);\n}\n.ha-negative {\n  color: var(--color-status-rose-text);\n}\n.ha-breadcrumb-avatar {\n  background: var(--color-badge-new-background);\n  color: var(--color-accent-700);\n}\n.dark .ha-breadcrumb-avatar {\n  color: var(--color-accent-300);\n}\n.ha-upload {\n  background: var(--color-background-primary-default);\n  border-color: var(--color-border-button-default);\n}\n.ha-upload > span {\n  background: var(--color-file-upload-icon-background);\n  color: var(--color-file-upload-icon-foreground);\n}\n.ha-upload:hover > span {\n  color: var(--color-file-upload-icon-foreground-hover);\n}\n.ha-upload.ha-dragging {\n  background: var(--color-pill-tab-blue-selected-background);\n  border-color: var(--color-accent-500);\n}\n.ha-command-list [aria-selected='true'],\n.ha-navigation button[aria-current='page'] {\n  background: var(--color-segmented-control-selected-background);\n  color: var(--color-text-primary);\n}\n.ha-color-swatch {\n  border-color: var(--color-border-button-default);\n}\n.ha-pagination > div > button[aria-current='page'] {\n  background: var(--color-segmented-control-selected-background);\n  color: var(--color-text-primary);\n}\n.ha-breadcrumb-avatar,\n.dark .ha-breadcrumb-avatar {\n  color: var(--hu-avatar-tint-ink);\n}\n.ha-negative {\n  color: var(--hu-status-rose-readable);\n}\n\n/* RAC TreeItemContent renders a display:contents gridcell, not a styled wrapper. */\n.ha-tree-example { width: 100%; max-width: 384px; margin-inline: auto; }\n.ha-tree .react-aria-TreeItem { display: flex; align-items: center; min-height: 36px; padding-block: 6px; position: relative; }\n.ha-tree .react-aria-TreeItem > [role='gridcell'] { display: contents; }\n.ha-tree .react-aria-TreeItem > [role='gridcell'] > span:last-child { min-width: 0; overflow-wrap: anywhere; }\n.ha-tree .react-aria-TreeItem[aria-level]:not([aria-level='1']):before {\n  content: ''; position: absolute;\n  inset-inline-start: calc((var(--tree-item-level, 1) - 1) * 20px + 6px);\n  inset-block: 0; border-inline-start: 1px solid var(--hu-border); pointer-events: none; opacity: .6;\n}\n/* Public controlled tree contracts retain native keyboard removal while branches resize. */\n.ha-tree-frame { overflow: hidden; }\n.ha-tree, .ha-tree .react-aria-TreeItem { box-sizing: border-box; }\n.ha-tree-custom-icon { display: inline-flex; flex: 0 0 16px; width: 16px; height: 16px; margin-inline-end: 7px; }\n.ha-tree-custom-icon > svg { flex: 0 0 auto; width: 16px; height: 16px; margin-inline-end: 0; }\n.ha-tree.ha-tree-sm .react-aria-TreeItem { height: 28px; min-height: 28px; padding-block: 2px; }\n.ha-tree.ha-tree-md .react-aria-TreeItem { height: 36px; }\n.ha-tree.ha-tree-lg .react-aria-TreeItem { height: 44px; min-height: 44px; }\n.ha-tree .react-aria-TreeItem { animation: ha-tree-branch-in 180ms ease-out; }\n.ha-tree-demo { display: grid; gap: 14px; width: 100%; }\n@keyframes ha-tree-branch-in { from { opacity: 0; filter: blur(3px); } to { opacity: 1; filter: blur(0); } }\n@media (prefers-reduced-motion: reduce) { .ha-tree .react-aria-TreeItem { animation: none; } }\n.ha-tree-controls summary { color: var(--hu-muted); cursor: pointer; font-size: 12px; padding-block: 4px; }\n.ha-tree-controls[open] > .hu-actions { margin-block-start: 12px; }\n.ha-tree-controls summary:focus-visible { outline: 2px solid var(--hu-brand-text); outline-offset: 3px; border-radius: 4px; }\n.ha-date-actions { justify-content: flex-end; padding-top: 12px; }\n.ha-code pre, .ha-code code, .ha-code-snippet pre { direction: ltr; text-align: left; unicode-bidi: isolate; }\n.hu-dialog:has(.ha-drawer-panel) { margin-block: 0; margin-inline-start: auto; margin-inline-end: 0; border-radius: 0; border-start-start-radius: 12px; border-end-start-radius: 12px; }\n",
  "src/assets.d.ts": "declare module '*.svg' {\n  const url: string;\n  export default url;\n}\ndeclare module '*.css';\n",
  "src/base-families.css": "/* Reusable Helios base families. All selectors are scoped; no host CSS reset is required. */\n.hb-family,\n.hb-family *,\n.hb-popover,\n.hb-popover *,\n.hb-tooltip {\n  box-sizing: border-box;\n}\n.hb-family,\n.hb-popover,\n.hb-tooltip {\n  font-family: var(--hu-font);\n  font-size: 14px;\n  line-height: 20px;\n  color: var(--hu-text);\n}\n.hb-family {\n  width: 100%;\n  min-width: 0;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n}\n.hb-family button,\n.hb-family input,\n.hb-popover {\n  font-family: inherit;\n}\n.hb-example-stack {\n  width: 100%;\n  max-width: 440px;\n  display: grid;\n  gap: 20px;\n  justify-items: start;\n}\n.hb-inline {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  flex-wrap: wrap;\n}\n.hb-muted,\n.hb-status {\n  color: var(--hu-muted);\n  font-size: 12px;\n  line-height: 20px;\n}\n.hb-status {\n  margin: 0;\n  min-height: 20px;\n  max-width: 100%;\n  overflow-wrap: anywhere;\n}\n.hb-family :where(button, input, [contenteditable='true']):focus-visible,\n.hb-avatar-upload:focus-within,\n.hb-menu-item[data-focus-visible],\n.hb-radio[data-focus-visible] .hb-radio-dot,\n.hb-slider-thumb[data-focus-visible],\n.hb-toggle[data-focus-visible] .hb-toggle-track {\n  outline: 2px solid var(--hu-brand-text);\n  outline-offset: 3px;\n}\n.hb-family :disabled,\n.hb-disabled {\n  cursor: not-allowed;\n  opacity: 0.5;\n}\n.hb-avatar-picker {\n  display: grid;\n  gap: 20px;\n  max-width: 100%;\n}\n.hb-avatar-group {\n  display: flex;\n  gap: 10px;\n  align-items: center;\n  flex-wrap: wrap;\n}\n.hb-avatar {\n  --hb-avatar-size: 40px;\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  flex-shrink: 0;\n  width: var(--hb-avatar-size);\n  height: var(--hb-avatar-size);\n  border-radius: 50%;\n  border: 1px solid var(--hu-border);\n  background: var(--hu-bg-secondary);\n  color: var(--hu-text);\n  font-size: 14px;\n  font-weight: 500;\n  vertical-align: middle;\n  text-decoration: none;\n  padding: 0;\n}\nbutton.hb-avatar {\n  cursor: pointer;\n}\n.hb-avatar.hb-sm {\n  --hb-avatar-size: 32px;\n  font-size: 12px;\n}\n.hb-avatar.hb-lg {\n  --hb-avatar-size: 56px;\n  font-size: 18px;\n}\n.hb-avatar img {\n  width: 100%;\n  height: 100%;\n  object-fit: cover;\n  border-radius: inherit;\n}\n.hb-avatar.hb-selected {\n  outline: 2px solid var(--hu-brand-text);\n  outline-offset: 3px;\n}\n.hb-avatar-status {\n  width: 11px;\n  height: 11px;\n  border: 2px solid var(--hu-bg);\n  border-radius: 50%;\n  position: absolute;\n  bottom: 0;\n  right: 0;\n  background: #737373;\n}\n.hb-avatar-status.hb-online {\n  background: #16a34a;\n}\n.hb-avatar-status.hb-away {\n  background: #d97706;\n}\n.hb-avatar-upload {\n  position: relative;\n  width: 40px;\n  height: 40px;\n  border: 1px dashed var(--hu-border);\n  border-radius: 50%;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background: var(--hu-bg-secondary);\n  font-size: 22px;\n  cursor: pointer;\n}\n.hb-avatar-upload.hb-sm {\n  width: 32px;\n  height: 32px;\n}\n.hb-avatar-upload.hb-lg {\n  width: 56px;\n  height: 56px;\n}\n.hb-avatar-upload input {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  clip-path: inset(50%);\n  overflow: hidden;\n}\n.hb-badge {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  gap: 5px;\n  border: 1px solid var(--hu-border);\n  border-radius: 20px;\n  padding: 2px 8px;\n  background: var(--hu-bg-secondary);\n  color: var(--hu-text);\n  font-size: 12px;\n  line-height: 18px;\n  font-weight: 500;\n  white-space: nowrap;\n}\n.hb-badge.hb-sm {\n  font-size: 11px;\n  line-height: 16px;\n  padding: 1px 6px;\n}\n.hb-badge.hb-lg {\n  font-size: 14px;\n  line-height: 20px;\n  padding: 3px 10px;\n}\n.hb-badge button,\n.hb-tag button {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: 18px;\n  height: 18px;\n  padding: 0;\n  background: none;\n  border: 0;\n  border-radius: 50%;\n  font: inherit;\n  font-size: 16px;\n  color: inherit;\n  cursor: pointer;\n}\n.hb-badge-icon {\n  font-size: 8px;\n  line-height: 1;\n}\n.hb-tone-success {\n  background: #f0fdf4;\n  border-color: #bbf7d0;\n  color: #166534;\n}\n.hb-tone-warning {\n  background: #fffbeb;\n  border-color: #fde68a;\n  color: #92400e;\n}\n.hb-tone-error {\n  background: #fef2f2;\n  border-color: #fecaca;\n  color: #b91c1c;\n}\n.hb-tone-info {\n  background: #eff6ff;\n  border-color: #bfdbfe;\n  color: #1e40af;\n}\n.hb-tone-brand {\n  background: color-mix(in srgb, var(--hu-brand), var(--hu-bg) 93%);\n  border-color: color-mix(in srgb, var(--hu-brand), var(--hu-border) 75%);\n  color: var(--hu-brand-text);\n}\n.dark .hb-tone-success,\n[data-helios-theme='dark'] .hb-tone-success {\n  background: #143522;\n  border-color: #22563b;\n  color: #86efac;\n}\n.dark .hb-tone-warning,\n[data-helios-theme='dark'] .hb-tone-warning {\n  background: #3a2d11;\n  border-color: #6b4d16;\n  color: #fde68a;\n}\n.dark .hb-tone-error,\n[data-helios-theme='dark'] .hb-tone-error {\n  background: #3a1717;\n  border-color: #7f1d1d;\n  color: #fca5a5;\n}\n.dark .hb-tone-info,\n[data-helios-theme='dark'] .hb-tone-info {\n  background: #16274c;\n  border-color: #2a4675;\n  color: #93c5fd;\n}\n.hb-button-group {\n  display: inline-flex;\n  max-width: 100%;\n  border: 1px solid var(--hu-border);\n  border-radius: 8px;\n  background: var(--hu-bg);\n  overflow: hidden;\n  box-shadow: 0 1px 2px #0000000d;\n}\n.hb-button-group button {\n  padding: 9px 14px;\n  display: inline-flex;\n  gap: 6px;\n  align-items: center;\n  justify-content: center;\n  border: 0;\n  border-inline-end: 1px solid var(--hu-border);\n  background: transparent;\n  color: var(--hu-muted);\n  font: inherit;\n  font-weight: 500;\n  cursor: pointer;\n}\n.hb-button-group button:last-child {\n  border-inline-end: 0;\n}\n.hb-button-group button[aria-pressed='true'] {\n  background: var(--hu-bg-secondary);\n  color: var(--hu-text);\n  box-shadow: inset 0 -2px var(--hu-brand);\n}\n.hb-button-group.hb-sm button {\n  padding: 7px 10px;\n  font-size: 12px;\n}\n.hb-button-group.hb-lg button {\n  padding: 11px 16px;\n  font-size: 16px;\n}\n.hb-button-group button:focus-visible {\n  outline-offset: -4px;\n}\n.hb-group-panel {\n  border: 1px solid var(--hu-line);\n  background: var(--hu-bg-secondary);\n  border-radius: 8px;\n  padding: 16px;\n  width: 100%;\n}\n.hb-group-panel p {\n  color: var(--hu-muted);\n  font-size: 14px;\n  margin: 6px 0 0;\n}\n.hb-menu-trigger {\n  gap: 16px;\n}\n.hb-menu-trigger[data-disabled] {\n  opacity: 0.5;\n  cursor: not-allowed;\n}\n.hb-popover {\n  background: var(--hu-bg);\n  color: var(--hu-text);\n  border: 1px solid var(--hu-line);\n  border-radius: 10px;\n  box-shadow: 0 8px 24px #0002;\n  min-width: 240px;\n  max-width: calc(100vw - 24px);\n  z-index: 100;\n}\n.hb-menu {\n  padding: 5px;\n  outline: 0;\n  max-height: 320px;\n  overflow: auto;\n}\n.hb-menu-item {\n  display: grid;\n  gap: 2px;\n  padding: 10px 12px;\n  border-radius: 6px;\n  cursor: pointer;\n  outline: none;\n}\n.hb-menu-item strong {\n  font-size: 14px;\n  font-weight: 500;\n  line-height: 20px;\n}\n.hb-menu-item > span {\n  font-size: 12px;\n  color: var(--hu-muted);\n  line-height: 18px;\n}\n.hb-menu-item[data-focused] {\n  background: var(--hu-bg-secondary);\n}\n.hb-menu-item[data-disabled] {\n  opacity: 0.45;\n  cursor: not-allowed;\n}\n.hb-menu-danger {\n  color: var(--hu-error);\n}\n.hb-progress {\n  width: 100%;\n  display: grid;\n  gap: 10px;\n}\n.hb-progress-heading {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 12px;\n}\n.hb-progress-heading label {\n  font-weight: 500;\n}\n.hb-progress-heading output {\n  color: var(--hu-muted);\n  font-size: 12px;\n  font-variant-numeric: tabular-nums;\n}\n.hb-progress progress {\n  width: 100%;\n  height: 8px;\n  appearance: none;\n  border: 0;\n  border-radius: 10px;\n  overflow: hidden;\n  background: var(--hu-bg-secondary);\n  accent-color: var(--hu-brand);\n}\n.hb-progress progress::-webkit-progress-bar {\n  background: var(--hu-bg-secondary);\n  border-radius: 10px;\n}\n.hb-progress progress::-webkit-progress-value {\n  background: var(--hu-brand);\n  border-radius: 10px;\n  transition: width 0.2s;\n}\n.hb-progress progress::-moz-progress-bar {\n  background: var(--hu-brand);\n  border-radius: 10px;\n}\n.hb-progress.hb-sm progress {\n  height: 6px;\n}\n.hb-progress.hb-lg progress {\n  height: 12px;\n}\n.hb-progress-ring {\n  --hb-progress: 0%;\n  width: 96px;\n  height: 96px;\n  border-radius: 50%;\n  display: grid;\n  place-items: center;\n  background: conic-gradient(var(--hu-brand) var(--hb-progress), var(--hu-bg-secondary) 0);\n  position: relative;\n  isolation: isolate;\n}\n.hb-progress-ring:before {\n  content: '';\n  position: absolute;\n  inset: 8px;\n  border-radius: 50%;\n  background: var(--hu-bg);\n  z-index: -1;\n}\n.hb-progress-ring > span {\n  font-size: 18px;\n  font-weight: 500;\n}\n.hb-progress-ring.hb-indeterminate {\n  background: conic-gradient(var(--hu-brand) 0 25%, var(--hu-bg-secondary) 25% 100%);\n  animation: hb-progress-spin 1s linear infinite;\n}\n.hb-progress-ring.hb-indeterminate > span {\n  animation: hb-progress-spin 1s linear infinite reverse;\n}\n@keyframes hb-progress-spin {\n  to {\n    transform: rotate(360deg);\n  }\n}\n.hb-radio-group {\n  display: grid;\n  gap: 12px;\n  width: 100%;\n}\n.hb-radio-group > label {\n  font-weight: 500;\n}\n.hb-radio-group > p {\n  margin: 0;\n  font-size: 12px;\n  color: var(--hu-muted);\n}\n.hb-radio {\n  display: flex;\n  align-items: flex-start;\n  gap: 10px;\n  border: 1px solid var(--hu-border);\n  border-radius: 8px;\n  background: var(--hu-bg);\n  padding: 14px;\n  cursor: pointer;\n}\n.hb-radio[data-selected] {\n  border-color: var(--hu-brand-text);\n  background: color-mix(in srgb, var(--hu-brand), var(--hu-bg) 95%);\n}\n.hb-radio[data-disabled] {\n  opacity: 0.5;\n  cursor: not-allowed;\n}\n.hb-radio-dot {\n  width: 18px;\n  height: 18px;\n  border-radius: 50%;\n  border: 1px solid var(--hu-border);\n  flex-shrink: 0;\n  margin-top: 1px;\n  display: grid;\n  place-items: center;\n}\n.hb-radio[data-selected] .hb-radio-dot {\n  border: 5px solid var(--hu-brand-text);\n}\n.hb-radio strong {\n  font-size: 14px;\n  font-weight: 500;\n}\n.hb-radio small {\n  display: block;\n  color: var(--hu-muted);\n  font-size: 12px;\n  line-height: 20px;\n  margin-top: 2px;\n}\n.hb-radio-group.hb-sm .hb-radio {\n  padding: 10px;\n}\n.hb-radio-group.hb-lg .hb-radio {\n  padding: 18px;\n}\n.hb-slider {\n  width: 100%;\n  display: grid;\n  gap: 10px;\n  touch-action: none;\n}\n.hb-slider-heading {\n  display: flex;\n  justify-content: space-between;\n  gap: 16px;\n  font-weight: 500;\n}\n.hb-slider-heading output {\n  font-size: 12px;\n  color: var(--hu-muted);\n  font-variant-numeric: tabular-nums;\n}\n.hb-slider-track {\n  height: 30px;\n  position: relative;\n  width: 100%;\n}\n.hb-slider-rail,\n.hb-slider-fill {\n  position: absolute;\n  height: 6px;\n  top: 12px;\n  border-radius: 10px;\n}\n.hb-slider-rail {\n  width: 100%;\n  background: var(--hu-bg-secondary);\n  border: 1px solid var(--hu-border);\n}\n.hb-slider-fill {\n  background: var(--hu-brand-text);\n}\n.hb-slider-thumb {\n  top: 15px;\n  width: 20px;\n  height: 20px;\n  border-radius: 50%;\n  border: 2px solid var(--hu-brand-text);\n  background: var(--hu-bg);\n  box-shadow: 0 1px 3px #0002;\n  cursor: grab;\n  outline: none;\n}\n.hb-slider-thumb[data-dragging] {\n  cursor: grabbing;\n}\n.hb-slider[data-disabled] {\n  opacity: 0.5;\n}\n.hb-slider.hb-sm .hb-slider-thumb {\n  width: 16px;\n  height: 16px;\n}\n.hb-slider.hb-lg .hb-slider-thumb {\n  width: 24px;\n  height: 24px;\n}\n.hb-tags-input {\n  display: grid;\n  gap: 16px;\n  width: 100%;\n  max-width: 480px;\n}\n.hb-tag-list {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 8px;\n  min-height: 28px;\n}\n.hb-tag {\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  border: 1px solid var(--hu-border);\n  border-radius: 6px;\n  background: var(--hu-bg);\n  color: var(--hu-text);\n  font-size: 12px;\n  line-height: 18px;\n  font-weight: 500;\n  padding: 3px 6px 3px 8px;\n}\n.hb-tag.hb-sm {\n  font-size: 11px;\n  padding: 1px 4px 1px 6px;\n}\n.hb-tag.hb-lg {\n  font-size: 14px;\n  padding: 5px 8px 5px 10px;\n}\n.hb-tags-input form {\n  display: flex;\n  gap: 12px;\n  align-items: flex-end;\n}\n.hb-tags-input form .hu-field {\n  flex: 1;\n}\n.hb-tags-input form > .hu-button {\n  flex-shrink: 0;\n}\n.hb-editor-example {\n  max-width: 100%;\n}\n.hb-editor {\n  width: 100%;\n  border: 1px solid var(--hu-border);\n  border-radius: 10px;\n  overflow: hidden;\n  background: var(--hu-bg);\n}\n.hb-editor-label {\n  font-size: 14px;\n  font-weight: 500;\n  padding: 12px 16px;\n  border-bottom: 1px solid var(--hu-line);\n}\n.hb-editor-toolbar {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 5px;\n  padding: 8px 12px;\n  border-bottom: 1px solid var(--hu-line);\n  background: var(--hu-bg-secondary);\n}\n.hb-editor-toolbar button {\n  background: transparent;\n  color: var(--hu-text);\n  font: inherit;\n  border: 1px solid transparent;\n  border-radius: 5px;\n  height: 32px;\n  min-width: 32px;\n  padding: 4px 8px;\n  cursor: pointer;\n}\n.hb-editor-toolbar button[aria-pressed='true'] {\n  background: var(--hu-bg);\n  border-color: var(--hu-border);\n  color: var(--hu-brand-text);\n}\n.hb-editor-toolbar button[aria-label='Bold'] {\n  font-weight: 700;\n}\n.hb-editor-toolbar button[aria-label='Italic'] {\n  font-style: italic;\n}\n.hb-editor-toolbar button[aria-label='Underline'] {\n  text-decoration: underline;\n}\n.hb-editor-content {\n  min-height: 180px;\n  padding: 12px 16px;\n  color: var(--hu-text);\n  font: 14px/24px var(--hu-font);\n  overflow-wrap: anywhere;\n  outline-offset: -4px !important;\n  white-space: pre-wrap;\n}\n.hb-editor-content p {\n  margin: 0 0 8px;\n  color: inherit;\n}\n.hb-editor-content[aria-disabled='true'] {\n  background: var(--hu-bg-secondary);\n  color: var(--hu-muted);\n  cursor: not-allowed;\n}\n.hb-editor-footer {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 12px;\n  align-items: center;\n  justify-content: space-between;\n  padding: 10px 16px;\n  border-top: 1px solid var(--hu-line);\n  font-size: 12px;\n  color: var(--hu-muted);\n}\n.hb-editor > .hb-status {\n  padding: 0 16px 10px;\n}\n.hb-video {\n  margin: 0;\n  width: 100%;\n  max-width: 560px;\n}\n.hb-video video {\n  display: block;\n  width: 100%;\n  max-height: 360px;\n  aspect-ratio: 16/9;\n  background: #0a0a0a;\n  border: 1px solid var(--hu-line);\n  border-radius: 10px;\n  object-fit: contain;\n}\n.hb-video figcaption {\n  font-size: 12px;\n  line-height: 20px;\n  color: var(--hu-muted);\n  margin: 12px 0;\n}\n.hb-video [role='alert'] {\n  border: 1px solid var(--hu-error);\n  border-radius: 8px;\n  padding: 12px;\n  color: var(--hu-error);\n}\n.hb-toggle {\n  position: relative;\n  display: flex;\n  align-items: flex-start;\n  gap: 12px;\n  cursor: pointer;\n}\n.hb-toggle-track {\n  width: 40px;\n  height: 24px;\n  display: inline-flex;\n  align-items: center;\n  border: 1px solid var(--hu-border);\n  border-radius: 20px;\n  background: var(--hu-bg-secondary);\n  padding: 2px;\n  flex-shrink: 0;\n  transition: background 0.15s;\n}\n.hb-toggle-track > span {\n  width: 18px;\n  height: 18px;\n  background: var(--hu-bg);\n  border: 1px solid var(--hu-border);\n  border-radius: 50%;\n  box-shadow: 0 1px 3px #0002;\n  transform: translateX(0);\n  transition: transform 0.15s;\n}\n.hb-toggle[data-selected] .hb-toggle-track {\n  background: var(--hu-brand);\n  border-color: transparent;\n}\n.hb-toggle[data-selected] .hb-toggle-track > span {\n  transform: translateX(16px);\n  border-color: transparent;\n  background: var(--hu-on-brand);\n}\n.hb-toggle strong {\n  font-size: 14px;\n  font-weight: 500;\n  line-height: 20px;\n}\n.hb-toggle small {\n  display: block;\n  font-size: 12px;\n  color: var(--hu-muted);\n  line-height: 20px;\n  margin-top: 2px;\n}\n.hb-toggle[data-disabled] {\n  opacity: 0.5;\n  cursor: not-allowed;\n}\n.hb-toggle.hb-sm .hb-toggle-track {\n  width: 36px;\n  height: 20px;\n}\n.hb-toggle.hb-sm .hb-toggle-track > span {\n  width: 14px;\n  height: 14px;\n}\n.hb-toggle.hb-lg .hb-toggle-track {\n  width: 48px;\n  height: 28px;\n}\n.hb-toggle.hb-lg .hb-toggle-track > span {\n  width: 22px;\n  height: 22px;\n}\n.hb-toggle.hb-lg[data-selected] .hb-toggle-track > span {\n  transform: translateX(20px);\n}\n.hb-tooltip-example {\n  display: grid;\n  gap: 20px;\n  justify-items: center;\n  max-width: 420px;\n  text-align: center;\n}\n.hb-tooltip {\n  max-width: 260px;\n  padding: 9px 12px;\n  border: 1px solid var(--hu-border);\n  border-radius: 8px;\n  background: var(--hu-text);\n  color: var(--hu-bg);\n  font-size: 12px;\n  line-height: 18px;\n  box-shadow: 0 4px 14px #0002;\n  z-index: 110;\n}\n.hb-tooltip[data-entering] {\n  animation: hb-tooltip-in 0.15s ease-out;\n}\n@keyframes hb-tooltip-in {\n  from {\n    opacity: 0;\n    transform: translateY(3px);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n@media (max-width: 600px) {\n  .hb-example-stack {\n    max-width: 100%;\n  }\n  .hb-tags-input form {\n    flex-wrap: wrap;\n  }\n  .hb-tags-input form > .hu-button {\n    width: 100%;\n  }\n  .hb-button-group button {\n    padding-inline: 10px;\n    font-size: 12px;\n  }\n  .hb-button-group.hb-lg button {\n    padding-inline: 12px;\n    font-size: 14px;\n  }\n  .hb-editor-footer {\n    align-items: flex-start;\n  }\n  .hb-avatar-group {\n    gap: 10px;\n  }\n  .hb-menu {\n    max-height: 260px;\n  }\n  .hb-popover {\n    min-width: 220px;\n  }\n}\n@media (prefers-reduced-motion: reduce) {\n  .hb-family *,\n  .hb-tooltip {\n    animation: none !important;\n    transition: none !important;\n  }\n  .hb-progress-ring.hb-indeterminate,\n  .hb-progress-ring.hb-indeterminate > span {\n    animation: none;\n  }\n}\n/* Public exports retain typography and geometry outside the showcase wrapper. */\n:where([class^='hb-'], [class*=' hb-']) {\n  box-sizing: border-box;\n  font-family: var(--hu-font);\n}\n:where(\n  .hb-avatar-picker,\n  .hb-button-group,\n  .hb-progress,\n  .hb-radio-group,\n  .hb-slider,\n  .hb-tags-input,\n  .hb-editor,\n  .hb-video,\n  .hb-toggle,\n  .hb-tooltip-example\n) {\n  color: var(--hu-text);\n  font-size: 14px;\n  line-height: 20px;\n}\n\n/* Public component variants share the same semantic Helios tokens. */\n.hb-radio-row .hb-radio {\n  border: 0;\n  background: transparent;\n  padding: 3px 0;\n  gap: 8px;\n}\n.hb-radio-row .hb-radio[data-selected] {\n  background: transparent;\n  border: 0;\n}\n.hb-slider:has(.hb-slider-bubble) .hb-slider-track {\n  margin-top: 34px;\n}\n.hb-slider-bubble {\n  position: absolute;\n  bottom: calc(100% + 8px);\n  inset-inline-start: 50%;\n  transform: translateX(-50%);\n  padding: 3px 7px;\n  border: 1px solid var(--hu-border);\n  border-radius: 6px;\n  box-shadow: 0 2px 4px #0000000a;\n  background: var(--hu-bg);\n  color: var(--hu-text);\n  font: 500 12px/18px var(--hu-font);\n  white-space: nowrap;\n  pointer-events: none;\n}\n.hb-range-slider .hb-slider-fill {\n  inset-inline-end: auto;\n}\n.hb-toggle-rounded .hb-toggle-track {\n  border-radius: 7px;\n}\n.hb-toggle-rounded .hb-toggle-track > span {\n  border-radius: 4px;\n}\n.hb-toggle-card {\n  padding: 14px;\n  border: 1px solid var(--hu-border);\n  border-radius: 10px;\n  width: 100%;\n}\n.hb-tooltip-sm {\n  padding: 4px 8px;\n  font-size: 12px;\n}\n.hb-tooltip-arrow svg {\n  display: block;\n  fill: var(--hu-text);\n}\n.hb-tooltip[data-placement='bottom'] .hb-tooltip-arrow svg {\n  transform: rotate(180deg);\n}\n.hb-tooltip[data-placement='left'] .hb-tooltip-arrow svg {\n  transform: rotate(-90deg);\n}\n.hb-tooltip[data-placement='right'] .hb-tooltip-arrow svg {\n  transform: rotate(90deg);\n}\n\n.hb-button-group button[title] {\n  min-width: 38px;\n  padding-inline: 10px;\n}\n.hb-avatar.hb-xs {\n  width: 20px;\n  height: 20px;\n  font-size: 9px;\n}\n.hb-avatar-neutral {\n  background: var(--hu-bg-secondary);\n  color: var(--hu-text);\n  border-color: var(--hu-border);\n}\n.hb-kbd {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  border: 1px solid var(--hu-border);\n  border-radius: 5px;\n  padding: 1px 5px;\n  background: var(--hu-bg-secondary);\n  color: var(--hu-muted);\n  font: 500 11px/16px var(--hu-font);\n  box-shadow: 0 1px 0 var(--hu-border);\n  white-space: nowrap;\n}\n.hb-menu-row {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  min-width: 0;\n}\n.hb-menu-row > div {\n  flex: 1;\n}\n.hb-menu-row small {\n  display: block;\n  color: var(--hu-muted);\n  font-size: 12px;\n  margin-top: 3px;\n}\n.hb-menu-row > .hb-kbd {\n  flex-shrink: 0;\n}\n.hb-menu-radio {\n  color: var(--hu-brand-text);\n}\n.hb-menu-item[data-selected] {\n  background: var(--hu-bg-secondary);\n}\n.hb-menu-separator {\n  border-top: 1px solid var(--hu-border);\n  margin-top: 5px;\n}\n.hb-popover {\n  transform-origin: var(--trigger-anchor-point);\n}\n.hb-popover[data-entering] {\n  animation: hb-popup-in 0.15s ease-out;\n}\n.hb-popover[data-exiting] {\n  animation: hb-popup-out 0.15s ease-in;\n}\n.hb-tooltip {\n  background: var(--hu-bg);\n  color: var(--hu-text);\n  transform-origin: var(--trigger-anchor-point);\n}\n.hb-tooltip-arrow svg {\n  fill: var(--hu-bg);\n  filter: drop-shadow(0 1px 0 var(--hu-border));\n}\n.hb-tooltip[data-entering] {\n  animation: hb-tip-in 0.15s ease-out;\n}\n.hb-tooltip[data-exiting] {\n  animation: hb-tip-out 0.15s ease-in;\n}\n@keyframes hb-popup-in {\n  from {\n    opacity: 0;\n    transform: scale(0.95);\n    filter: blur(2px);\n  }\n  to {\n    opacity: 1;\n    transform: scale(1);\n    filter: blur(0);\n  }\n}\n@keyframes hb-popup-out {\n  to {\n    opacity: 0;\n    transform: scale(0.95);\n    filter: blur(2px);\n  }\n}\n@keyframes hb-tip-in {\n  from {\n    opacity: 0;\n    transform: scale(0.9);\n    filter: blur(2px);\n  }\n  to {\n    opacity: 1;\n    transform: scale(1);\n    filter: blur(0);\n  }\n}\n@keyframes hb-tip-out {\n  to {\n    opacity: 0;\n    transform: scale(0.9);\n    filter: blur(2px);\n  }\n}\n.hb-chip {\n  --hb-chip-ink: var(--hu-text);\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  border-radius: 6px;\n  padding: 3px 7px;\n  font: 500 12px/18px var(--hu-font);\n  white-space: nowrap;\n  color: var(--hb-chip-ink);\n  background: color-mix(in srgb, var(--hb-chip-ink) 10%, var(--hu-bg));\n}\n.hb-chip-bold {\n  background: var(--hb-chip-ink);\n  color: var(--hu-bg);\n}\n.hb-chip-caption {\n  background: transparent;\n  border: 1px solid color-mix(in srgb, var(--hb-chip-ink) 25%, var(--hu-border));\n}\n.hb-chip-lime {\n  --hb-chip-ink: #365314;\n}\n.hb-chip-rose {\n  --hb-chip-ink: #9f1239;\n}\n.hb-chip-yellow {\n  --hb-chip-ink: #854d0e;\n}\n.hb-chip-cyan {\n  --hb-chip-ink: #155e75;\n}\n.hb-chip-gray {\n  --hb-chip-ink: var(--hu-muted);\n}\n.hb-chip-soft {\n  --hb-chip-ink: var(--hu-brand-text);\n}\n\n.hb-status-dot {\n  width: 8px;\n  height: 8px;\n  display: inline-block;\n  border-radius: 50%;\n  background: #16a34a;\n  flex-shrink: 0;\n}\n.hb-status-dot-yellow {\n  background: #ca8a04;\n}\n.hb-status-dot-indigo {\n  background: #6366f1;\n}\n@media (prefers-reduced-motion: reduce) {\n  .hb-popover,\n  .hb-tooltip {\n    animation: none !important;\n    transition: none !important;\n  }\n}\n\n/* BoardUI audited semantic palette, blob 4db0e69 — geometry and interaction rules above are retained. */\n.hb-avatar {\n  background: var(--color-avatar-neutral-background);\n  color: var(--color-neutral-600);\n  border-color: var(--color-border-button-default);\n}\n.hb-avatar-brand {\n  background: var(--color-blue-100);\n  color: var(--color-blue-700);\n  border-color: var(--color-blue-200);\n}\n.hb-avatar-neutral {\n  background: var(--color-avatar-neutral-background);\n  color: var(--color-neutral-600);\n}\n.dark .hb-avatar-brand,\n[data-helios-theme='dark'] .hb-avatar-brand {\n  background: var(--color-blue-950);\n  color: var(--color-blue-300);\n  border-color: var(--color-blue-800);\n}\n.dark .hb-avatar-neutral,\n[data-helios-theme='dark'] .hb-avatar-neutral {\n  color: var(--color-neutral-300);\n}\n.hb-avatar-status {\n  background: var(--color-foreground-icon-secondary);\n  border-color: var(--color-background-full);\n}\n.hb-avatar-status.hb-online {\n  background: var(--color-green-600);\n}\n.hb-avatar-status.hb-away {\n  background: var(--color-yellow-500);\n}\n.hb-badge {\n  background: var(--color-badge-neutral-background);\n  color: var(--color-neutral-600);\n  border-color: var(--color-border-button-default);\n}\n.dark .hb-badge,\n[data-helios-theme='dark'] .hb-badge {\n  color: var(--color-neutral-300);\n}\n.hb-tone-success,\n.dark .hb-tone-success,\n[data-helios-theme='dark'] .hb-tone-success {\n  background: var(--color-status-lime-background);\n  color: var(--color-status-lime-text);\n  border-color: var(--color-status-lime-background);\n}\n.hb-tone-warning,\n.dark .hb-tone-warning,\n[data-helios-theme='dark'] .hb-tone-warning {\n  background: var(--color-status-yellow-background);\n  color: var(--color-status-yellow-text);\n  border-color: var(--color-status-yellow-background);\n}\n.hb-tone-error,\n.dark .hb-tone-error,\n[data-helios-theme='dark'] .hb-tone-error {\n  background: var(--color-status-rose-background);\n  color: var(--color-status-rose-text);\n  border-color: var(--color-status-rose-background);\n}\n.hb-tone-info,\n.dark .hb-tone-info,\n[data-helios-theme='dark'] .hb-tone-info {\n  background: var(--color-status-blue-background);\n  color: var(--color-status-blue-text);\n  border-color: var(--color-status-blue-background);\n}\n.hb-tone-brand {\n  background: var(--color-badge-new-background);\n  color: var(--color-accent-700);\n  border-color: var(--color-badge-new-background);\n}\n.dark .hb-tone-brand,\n[data-helios-theme='dark'] .hb-tone-brand {\n  color: var(--color-badge-new-text);\n}\n.hb-button-group {\n  background: var(--color-segmented-control-background);\n  border-color: var(--color-border-button-default);\n}\n.hb-button-group button {\n  color: var(--hu-muted);\n  border-color: var(--color-border-button-default);\n}\n.hb-button-group button[aria-pressed='true'] {\n  background: var(--color-segmented-control-selected-background);\n  color: var(--color-text-primary);\n  box-shadow: inset 0 -2px var(--color-accent-500);\n}\n.hb-popover,\n.hb-tooltip {\n  background: var(--color-background-secondary-default);\n  color: var(--color-text-primary);\n  border-color: var(--color-border-button-default);\n}\n.hb-tooltip-arrow svg {\n  fill: var(--color-background-secondary-default);\n  filter: drop-shadow(0 1px 0 var(--color-border-button-default));\n}\n.hb-menu-item[data-focused],\n.hb-menu-item[data-selected] {\n  background: var(--color-background-primary-hover);\n}\n.hb-menu-danger {\n  color: var(--color-text-destructive);\n}\n.hb-menu-radio {\n  color: var(--color-accent-600);\n}\n.hb-radio {\n  background: var(--color-background-primary-default);\n  border-color: var(--color-border-button-default);\n}\n.hb-radio[data-selected] {\n  background: var(--color-pill-tab-blue-selected-background);\n  border-color: var(--color-accent-500);\n}\n.hb-radio-dot {\n  border-color: var(--color-border-checkbox-default);\n  background: var(--color-foreground-full);\n}\n.hb-radio[data-selected] .hb-radio-dot {\n  border-color: var(--color-accent-600);\n}\n.hb-slider-rail {\n  background: var(--color-background-tertiary-default);\n  border-color: var(--color-border-button-default);\n}\n.hb-slider-fill {\n  background: var(--color-accent-500);\n}\n.hb-slider-thumb {\n  background: var(--color-white);\n  border-color: var(--color-accent-600);\n}\n.hb-toggle-track {\n  background: var(--color-background-tertiary-default);\n  border-color: var(--color-border-checkbox-default);\n}\n.hb-toggle-track > span {\n  position: relative;\n  background: linear-gradient(var(--color-switch-off-chip-start), var(--color-switch-off-chip-end));\n  border-color: var(--color-border-checkbox-white);\n}\n.hb-toggle[data-selected] .hb-toggle-track {\n  background: linear-gradient(var(--color-accent-500), var(--color-accent-600));\n  border-color: var(--color-accent-600);\n}\n.hb-toggle[data-selected] .hb-toggle-track > span {\n  background: var(--color-white);\n  border-color: var(--color-border-checkbox-white);\n}\n.hb-toggle[data-selected] .hb-toggle-track > span:after {\n  content: '';\n  position: absolute;\n  inset: 5px;\n  border-radius: inherit;\n  background: linear-gradient(var(--color-switch-on-chip-start), var(--color-switch-on-chip-end));\n}\n.hb-kbd {\n  background: var(--color-kbd-background);\n  color: var(--color-neutral-600);\n  border-color: var(--color-border-button-default);\n}\n.dark .hb-kbd,\n[data-helios-theme='dark'] .hb-kbd {\n  color: var(--color-neutral-300);\n}\n.hb-chip {\n  --hb-chip-ink: var(--color-text-primary);\n  --hb-chip-surface: var(--color-badge-neutral-background);\n  color: var(--hb-chip-ink);\n  background: color-mix(\n    in srgb,\n    var(--hb-chip-surface) 65%,\n    var(--color-background-primary-default)\n  );\n}\n.hb-chip-bold {\n  background: var(--hb-chip-surface);\n  color: var(--hb-chip-ink);\n}\n.hb-chip-caption {\n  background: transparent;\n  border-color: var(--color-border-button-default);\n}\n.hb-chip-lime {\n  --hb-chip-ink: var(--color-status-lime-text);\n  --hb-chip-surface: var(--color-status-lime-background);\n}\n.hb-chip-rose {\n  --hb-chip-ink: var(--color-status-rose-text);\n  --hb-chip-surface: var(--color-status-rose-background);\n}\n.hb-chip-yellow {\n  --hb-chip-ink: var(--color-status-yellow-text);\n  --hb-chip-surface: var(--color-status-yellow-background);\n}\n.hb-chip-cyan {\n  --hb-chip-ink: var(--color-status-cyan-text);\n  --hb-chip-surface: var(--color-status-cyan-background);\n}\n.hb-chip-gray {\n  --hb-chip-ink: var(--hu-muted);\n  --hb-chip-surface: var(--color-background-secondary-default);\n}\n.hb-chip-soft {\n  --hb-chip-ink: var(--color-status-blue-text);\n  --hb-chip-surface: var(--color-status-blue-background);\n}\n.hb-status-dot {\n  background: var(--color-green-600);\n  box-shadow: 0 0 0 2px var(--color-status-dot-green-halo);\n}\n.hb-status-dot-yellow {\n  background: var(--color-yellow-500);\n  box-shadow: 0 0 0 2px var(--color-status-dot-yellow-halo);\n}\n.hb-status-dot-indigo {\n  background: var(--color-indigo-500);\n  box-shadow: 0 0 0 2px var(--color-status-dot-indigo-halo);\n}\n/* Readable small-type exceptions use adjacent audited stops; inherited mode aliases\n   keep independent light/dark panels correct, including a portalled RichSelect. */\n:root,\n[data-helios-theme='light'] {\n  --hu-compact-muted: var(--color-neutral-600);\n  --hu-popup-muted: var(--color-neutral-600);\n  --hu-avatar-tint-surface: var(--color-blue-100);\n  --hu-avatar-tint-border: var(--color-blue-200);\n  --hu-avatar-tint-ink: var(--color-blue-700);\n  --hu-badge-accent-ink: var(--color-accent-700);\n}\n.dark,\n[data-helios-theme='dark'] {\n  --hu-compact-muted: var(--color-neutral-300);\n  --hu-popup-muted: var(--color-neutral-400);\n  --hu-avatar-tint-surface: var(--color-blue-950);\n  --hu-avatar-tint-border: var(--color-blue-800);\n  --hu-avatar-tint-ink: var(--color-blue-300);\n  --hu-badge-accent-ink: var(--color-badge-new-text);\n}\n.hb-avatar-neutral,\n.dark .hb-avatar-neutral,\n[data-helios-theme='dark'] .hb-avatar-neutral {\n  color: var(--hu-compact-muted);\n}\n.hb-avatar-brand,\n.dark .hb-avatar-brand,\n[data-helios-theme='dark'] .hb-avatar-brand {\n  background: var(--hu-avatar-tint-surface);\n  border-color: var(--hu-avatar-tint-border);\n  color: var(--hu-avatar-tint-ink);\n}\n.hb-badge.hb-tone-neutral,\n.dark .hb-badge.hb-tone-neutral {\n  color: var(--hu-compact-muted);\n}\n.hb-tone-brand,\n.dark .hb-tone-brand,\n[data-helios-theme='dark'] .hb-tone-brand {\n  color: var(--hu-badge-accent-ink);\n}\n.hb-kbd,\n.dark .hb-kbd,\n[data-helios-theme='dark'] .hb-kbd {\n  color: var(--hu-compact-muted);\n}\n.hb-menu-row small,\n.hb-radio small {\n  color: var(--hu-popup-muted);\n}\n:root,\n[data-helios-theme='light'] {\n  --hu-status-rose-readable: var(--color-status-rose-text);\n}\n.dark,\n[data-helios-theme='dark'] {\n  --hu-status-rose-readable: var(--color-rose-400);\n}\n.hb-tone-error,\n.dark .hb-tone-error,\n[data-helios-theme='dark'] .hb-tone-error {\n  color: var(--hu-status-rose-readable);\n}\n.hb-chip-rose {\n  --hb-chip-ink: var(--hu-status-rose-readable);\n}\n.hb-chip-gray {\n  --hb-chip-ink: var(--hu-popup-muted);\n}\n/* Neutral avatar/counter text needs only the adjacent 400 stop in dark mode;\n   Kbd retains 300 because its 700 surface is lighter. */\n.hb-avatar-neutral,\n.dark .hb-avatar-neutral,\n[data-helios-theme='dark'] .hb-avatar-neutral,\n.hb-badge.hb-tone-neutral,\n.dark .hb-badge.hb-tone-neutral {\n  color: var(--hu-popup-muted);\n}\n.hb-avatar.hb-xs { width: 20px; height: 20px; min-width: 20px; font-size: 9px; }\n.hb-menu-header { display: grid; gap: 3px; padding: 8px 10px 10px; border-bottom: 1px solid var(--hu-line); }\n.hb-menu-header small { color: var(--hu-muted); font-size: 12px; }\n.hb-menu-footer { border-top: 1px solid var(--hu-line); padding: 10px; }\n.hb-menu-footer .hb-inline { gap: 8px; }\n.hb-menu-footer .hu-button { flex: 1; }\n.hb-avatar-status { right: auto; inset-inline-end: 0; }\n.hb-slider-fill { inset-inline-start: 0; }\n.hb-slider-heading output { direction: ltr; unicode-bidi: isolate; }\n",
  "src/board-extras.css": ".he-extra,\n.he-extra * {\n  box-sizing: border-box;\n}\n.he-extra {\n  font: 14px/20px var(--hu-font);\n  color: var(--hu-text);\n  width: 100%;\n  min-width: 0;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n.he-stack {\n  display: grid;\n  gap: 20px;\n  width: 100%;\n  max-width: 540px;\n  justify-items: start;\n}\n.he-inline {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  flex-wrap: wrap;\n}\n.he-hint {\n  color: var(--hu-muted);\n  font-size: 12px;\n  line-height: 20px;\n  margin: 0;\n  overflow-wrap: anywhere;\n}\n.he-error {\n  color: var(--hu-error);\n  font-size: 12px;\n  line-height: 20px;\n}\n.he-label {\n  font-size: 14px;\n  font-weight: 500;\n  line-height: 20px;\n}\n.he-extra :where(button, a, input, textarea, select):focus-visible,\n.he-carousel-track:focus-visible,\n.he-grid-scroll:focus-visible {\n  outline: 2px solid var(--hu-brand-text);\n  outline-offset: 3px;\n}\n.he-extra :disabled {\n  cursor: not-allowed;\n  opacity: 0.5;\n}\n.he-announcement {\n  display: flex;\n  gap: 12px;\n  padding: 18px;\n  border: 1px solid var(--hu-border);\n  border-radius: 12px;\n  background: var(--hu-bg-secondary);\n  width: 100%;\n  align-items: flex-start;\n}\n.he-announcement-mark {\n  width: 32px;\n  height: 32px;\n  display: grid;\n  place-items: center;\n  flex-shrink: 0;\n  border: 1px solid var(--hu-border);\n  border-radius: 8px;\n  background: var(--hu-bg);\n  color: var(--hu-brand-text);\n}\n.he-announcement > div {\n  flex: 1;\n  min-width: 0;\n}\n.he-announcement strong {\n  font-weight: 500;\n  font-size: 14px;\n}\n.he-announcement p {\n  font-size: 13px;\n  line-height: 20px;\n  color: var(--hu-muted);\n  margin: 4px 0 10px;\n}\n.he-announcement > .hu-button {\n  flex-shrink: 0;\n}\n.he-announcement.he-tone-brand {\n  border-color: color-mix(in srgb, var(--hu-brand), var(--hu-border) 70%);\n  background: color-mix(in srgb, var(--hu-brand), var(--hu-bg) 96%);\n}\n.he-announcement.he-tone-success {\n  border-color: #bbf7d0;\n}\n.he-carousel {\n  width: 100%;\n  max-width: 720px;\n  min-width: 0;\n}\n.he-carousel-head {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 16px;\n  margin-bottom: 16px;\n}\n.he-carousel-head > strong {\n  font-weight: 500;\n}\n.he-carousel-head > div {\n  display: flex;\n  gap: 8px;\n}\n.he-carousel-track {\n  position: relative;\n  display: flex;\n  gap: var(--he-carousel-gap, 16px);\n  overflow-x: auto;\n  scroll-snap-type: x mandatory;\n  scrollbar-width: thin;\n  padding: 4px 0 12px;\n  overscroll-behavior-x: contain;\n}\n.he-carousel-card {\n  scroll-snap-align: start;\n  flex: 0 0 calc(50% - 8px);\n  min-width: 0;\n  border: 1px solid var(--hu-line);\n  border-radius: 12px;\n  overflow: hidden;\n  background: var(--hu-bg);\n}\n.he-carousel-card > img {\n  width: 100%;\n  height: 160px;\n  object-fit: cover;\n  display: block;\n}\n.he-carousel-card > div {\n  padding: 20px;\n}\n.he-carousel-card h3 {\n  font-size: 16px;\n  line-height: 24px;\n  font-weight: 500;\n  margin: 14px 0 8px;\n}\n.he-carousel-card p {\n  font-size: 13px;\n  line-height: 20px;\n  color: var(--hu-muted);\n  margin: 0;\n}\n.he-carousel-illustration {\n  display: grid;\n  place-items: center;\n  height: 140px;\n  border: 1px solid var(--hu-line);\n  border-radius: 8px;\n  background: color-mix(in srgb, var(--hu-brand), var(--hu-bg) 94%);\n  color: var(--hu-brand-text);\n  font-size: 64px;\n  line-height: 1;\n  font-weight: 500;\n}\n.he-carousel-bottom {\n  display: flex;\n  justify-content: space-between;\n  gap: 20px;\n  align-items: center;\n  font-size: 12px;\n  color: var(--hu-muted);\n  margin-top: 12px;\n}\n.he-carousel-bottom > div {\n  display: flex;\n  gap: 8px;\n}\n.he-carousel-bottom button {\n  width: 8px;\n  height: 8px;\n  border-radius: 50%;\n  padding: 0;\n  border: 0;\n  background: var(--hu-border);\n  cursor: pointer;\n}\n.he-carousel-bottom button[aria-current='true'] {\n  background: var(--hu-brand-text);\n}\n.he-otp {\n  display: grid;\n  gap: 10px;\n  width: 100%;\n  max-width: 480px;\n}\n.he-otp-fields {\n  display: flex;\n  gap: 10px;\n  max-width: 100%;\n}\n.he-otp-fields input {\n  height: 56px;\n  width: 48px;\n  min-width: 0;\n  flex: 1 1 0;\n  max-width: 56px;\n  padding: 0;\n  text-align: center;\n  background: var(--hu-bg);\n  border: 1px solid var(--hu-border);\n  border-radius: 8px;\n  color: var(--hu-text);\n  font: 500 24px/32px var(--hu-font);\n  caret-color: var(--hu-brand-text);\n}\n.he-otp-fields input:focus {\n  border-color: var(--hu-brand-text);\n}\n.he-otp.he-invalid .he-otp-fields input {\n  border-color: var(--hu-error);\n}\n.he-otp.he-invalid .he-hint {\n  color: var(--hu-error);\n}\n.he-social-buttons {\n  display: flex;\n  gap: 12px;\n  flex-wrap: wrap;\n}\n.he-social-mark {\n  font-size: 14px;\n  line-height: 20px;\n  font-weight: 700;\n  width: 20px;\n  display: inline-flex;\n  justify-content: center;\n}\n.he-textarea {\n  display: grid;\n  gap: 6px;\n  width: 100%;\n}\n.he-textarea > label {\n  font-size: 14px;\n  line-height: 20px;\n  font-weight: 500;\n}\n.he-textarea > label > span {\n  color: var(--hu-brand-text);\n}\n.he-textarea textarea {\n  width: 100%;\n  min-height: 112px;\n  max-height: 420px;\n  border: 1px solid var(--hu-border);\n  border-radius: 8px;\n  padding: 12px;\n  color: var(--hu-text);\n  background: var(--hu-bg);\n  font: 14px/22px var(--hu-font);\n  box-shadow: 0 1px 2px #0000000d;\n}\n.he-textarea textarea::placeholder {\n  color: var(--hu-muted);\n}\n.he-textarea.he-sm textarea {\n  min-height: 88px;\n  padding: 10px;\n  font-size: 13px;\n  line-height: 20px;\n}\n.he-textarea.he-lg textarea {\n  min-height: 144px;\n  padding: 16px;\n  font-size: 16px;\n  line-height: 24px;\n}\n.he-textarea textarea:disabled {\n  background: var(--hu-bg-secondary);\n  opacity: 0.6;\n}\n.he-textarea-bottom {\n  display: flex;\n  gap: 12px;\n  justify-content: space-between;\n}\n.he-textarea-bottom > span:last-child {\n  margin-inline-start: auto;\n  white-space: nowrap;\n}\n.he-textarea.he-invalid textarea {\n  border-color: var(--hu-error);\n}\n.he-textarea.he-invalid .he-hint {\n  color: var(--hu-error);\n}\n.he-close-example {\n  display: flex;\n  justify-content: space-between;\n  gap: 24px;\n  align-items: center;\n  border: 1px solid var(--hu-line);\n  border-radius: 8px;\n  padding: 12px 16px;\n  width: 100%;\n  background: var(--hu-bg);\n}\n.he-link-button {\n  display: inline-flex;\n  gap: 6px;\n  align-items: center;\n  font: 600 14px/20px var(--hu-font);\n  color: var(--hu-brand-text);\n  text-decoration: none;\n  border-radius: 4px;\n  cursor: pointer;\n}\n.he-link-button:hover {\n  text-decoration: underline;\n}\n.he-link-button.he-sm {\n  font-size: 12px;\n  line-height: 18px;\n}\n.he-link-button.he-lg {\n  font-size: 16px;\n  line-height: 24px;\n}\n.he-link-button[aria-disabled='true'] {\n  color: var(--hu-muted);\n  opacity: 0.5;\n  cursor: not-allowed;\n  text-decoration: none;\n}\n.he-grid {\n  width: 100%;\n  min-width: 0;\n  border: 1px solid var(--hu-line);\n  border-radius: 12px;\n  background: var(--hu-bg);\n  overflow: hidden;\n}\n.he-grid-toolbar {\n  padding: 16px;\n  display: flex;\n  align-items: flex-end;\n  gap: 12px;\n  flex-wrap: wrap;\n}\n.he-grid-toolbar .hu-field {\n  flex: 1;\n  min-width: 180px;\n  max-width: 320px;\n}\n.he-grid > .he-hint {\n  padding: 0 16px 12px;\n}\n.he-grid-scroll {\n  overflow: auto;\n  max-height: 420px;\n  max-width: 100%;\n}\n.he-grid table {\n  border-collapse: collapse;\n  width: 100%;\n  font-size: 13px;\n  line-height: 20px;\n  text-align: start;\n}\n.he-grid th {\n  position: sticky;\n  top: 0;\n  background: var(--hu-bg-secondary);\n  color: var(--hu-muted);\n  font-size: 12px;\n  font-weight: 500;\n  padding: 12px;\n  border-block: 1px solid var(--hu-line);\n  white-space: nowrap;\n  z-index: 1;\n}\n.he-grid td {\n  border-inline-end: 1px solid var(--hu-line);\n  border-bottom: 1px solid var(--hu-line);\n  padding: 0;\n  height: 46px;\n  min-width: 120px;\n}\n.he-grid th:first-child,\n.he-grid td:first-child {\n  width: 46px;\n  min-width: 46px;\n  padding: 12px;\n}\n.he-grid tbody tr[aria-selected='true'] td {\n  background: color-mix(in srgb, var(--hu-brand), var(--hu-bg) 94%);\n}\n.he-grid-cell {\n  border: 0;\n  background: transparent;\n  color: var(--hu-text);\n  font: inherit;\n  text-align: start;\n  display: block;\n  width: 100%;\n  min-height: 46px;\n  white-space: nowrap;\n  padding: 12px;\n  cursor: text;\n}\n.he-grid-cell:focus-visible {\n  outline-offset: -3px !important;\n  background: var(--hu-bg-secondary);\n}\n.he-grid-edit {\n  display: grid;\n  gap: 4px;\n  padding: 6px;\n  min-width: 170px;\n}\n.he-grid-edit > input,\n.he-grid-edit > select {\n  height: 34px;\n  border: 1px solid var(--hu-brand-text);\n  border-radius: 4px;\n  padding: 5px 8px;\n  width: 100%;\n  font: inherit;\n  color: var(--hu-text);\n  background: var(--hu-bg);\n}\n.he-grid-edit > div {\n  display: flex;\n  justify-content: space-between;\n  gap: 6px;\n}\n.he-grid-edit [aria-invalid='true'] {\n  border-color: var(--hu-error);\n}\n.he-grid > .he-error {\n  padding: 0 16px;\n}\n.he-grid-footer {\n  padding: 12px 16px;\n  display: flex;\n  align-items: center;\n  gap: 16px;\n  color: var(--hu-muted);\n  font-size: 12px;\n  border-top: 1px solid var(--hu-line);\n}\n.he-settings-fields {\n  display: grid;\n  gap: 20px;\n}\n.he-sidebar-example {\n  width: 100%;\n  display: grid;\n  grid-template-columns: 220px minmax(0, 1fr);\n  border: 1px solid var(--hu-line);\n  border-radius: 12px;\n  overflow: hidden;\n  min-height: 340px;\n}\n.he-sidebar {\n  min-width: 0;\n  background: var(--hu-bg-secondary);\n  border-inline-end: 1px solid var(--hu-line);\n  padding: 16px;\n  display: flex;\n  flex-direction: column;\n  gap: 18px;\n}\n.he-sidebar-brand {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 10px;\n  font-size: 16px;\n  font-weight: 600;\n}\n.he-sidebar-brand > span {\n  white-space: nowrap;\n}\n.he-sidebar nav {\n  display: grid;\n  gap: 4px;\n}\n.he-sidebar nav > button {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  background: transparent;\n  color: var(--hu-muted);\n  font: 500 13px/20px var(--hu-font);\n  border: 0;\n  border-radius: 6px;\n  cursor: pointer;\n  text-align: start;\n  padding: 9px 10px;\n}\n.he-sidebar nav > button[aria-current='page'] {\n  background: var(--hu-bg);\n  color: var(--hu-text);\n  box-shadow: 0 1px 2px #0000000d;\n}\n.he-sidebar nav > button > .hb-badge {\n  margin-inline-start: auto;\n}\n.he-sidebar nav > button > span:first-child {\n  width: 20px;\n  flex-shrink: 0;\n  text-align: center;\n}\n.he-sidebar-user {\n  display: flex;\n  gap: 10px;\n  align-items: center;\n  border-top: 1px solid var(--hu-line);\n  padding-top: 16px;\n  margin-top: auto;\n}\n.he-sidebar-user strong {\n  font-size: 12px;\n  font-weight: 500;\n}\n.he-sidebar-user small {\n  font-size: 10px;\n  color: var(--hu-muted);\n  display: block;\n}\n.he-sidebar-panel {\n  padding: 28px;\n  min-width: 0;\n  background: var(--hu-bg);\n}\n.he-sidebar-panel h3 {\n  font-size: 20px;\n  line-height: 28px;\n  letter-spacing: -0.03em;\n  margin: 0 0 10px;\n  font-weight: 500;\n}\n.he-sidebar-panel p {\n  font-size: 14px;\n  line-height: 22px;\n  color: var(--hu-muted);\n  margin: 0 0 20px;\n}\n.he-sidebar.he-collapsed {\n  width: 72px;\n  padding: 12px;\n  gap: 18px;\n}\n.he-sidebar.he-collapsed .he-sidebar-brand {\n  flex-wrap: wrap;\n  gap: 8px;\n  justify-content: center;\n}\n.he-sidebar.he-collapsed nav > button {\n  padding-inline: 10px;\n}\n.he-sidebar-example:has(.he-collapsed) {\n  grid-template-columns: 72px minmax(0, 1fr);\n}\n.he-stats {\n  width: 100%;\n  min-width: 0;\n}\n.he-stats-head {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  gap: 16px;\n  margin-bottom: 20px;\n  flex-wrap: wrap;\n}\n.he-stats-head > strong {\n  font-size: 16px;\n  font-weight: 500;\n}\n.he-stats-grid {\n  display: grid;\n  grid-template-columns: repeat(3, minmax(0, 1fr));\n  gap: 14px;\n}\n.he-stats-grid article {\n  position: relative;\n  border: 1px solid var(--hu-line);\n  border-radius: 12px;\n  background: var(--hu-bg);\n  padding: 20px;\n  min-width: 0;\n  overflow: hidden;\n}\n.he-stats-grid article > span {\n  font-size: 12px;\n  line-height: 18px;\n  color: var(--hu-muted);\n}\n.he-stats-grid article > strong {\n  font-size: 28px;\n  line-height: 36px;\n  letter-spacing: -0.04em;\n  font-weight: 500;\n  display: block;\n  margin: 10px 0;\n}\n.he-stats-grid article > small {\n  display: block;\n  font-size: 12px;\n  line-height: 20px;\n}\n.he-stats-grid article > small > span {\n  color: var(--hu-muted);\n  display: block;\n}\n.he-stat-positive {\n  color: #166534;\n}\n.he-stat-negative {\n  color: var(--hu-error);\n}\n.dark .he-stat-positive,\n[data-helios-theme='dark'] .he-stat-positive {\n  color: #86efac;\n}\n.he-stats-grid svg {\n  width: 100%;\n  height: 48px;\n  margin-top: 16px;\n  color: var(--hu-brand-text);\n  display: block;\n}\n@media (max-width: 720px) {\n  .he-stats-grid {\n    grid-template-columns: 1fr;\n  }\n  .he-sidebar-example {\n    grid-template-columns: 180px minmax(0, 1fr);\n  }\n  .he-sidebar {\n    padding: 12px;\n  }\n  .he-sidebar-panel {\n    padding: 20px;\n  }\n  .he-sidebar-panel h3 {\n    font-size: 18px;\n    line-height: 26px;\n  }\n  .he-carousel-card {\n    flex-basis: 82%;\n  }\n}\n@media (max-width: 480px) {\n  .he-announcement {\n    padding: 14px;\n    gap: 10px;\n  }\n  .he-announcement-mark {\n    display: none;\n  }\n  .he-carousel-card {\n    flex-basis: 88%;\n  }\n  .he-carousel-card > div {\n    padding: 16px;\n  }\n  .he-otp-fields {\n    gap: 6px;\n  }\n  .he-otp-fields input {\n    height: 48px;\n    font-size: 22px;\n    line-height: 28px;\n  }\n  .he-social-buttons,\n  .he-social-buttons > .hu-button {\n    width: 100%;\n  }\n  .he-textarea textarea {\n    font-size: 16px;\n  }\n  .he-grid-toolbar .hu-field {\n    min-width: 100%;\n    max-width: 100%;\n  }\n  .he-grid-toolbar > .hu-button {\n    flex: 1;\n  }\n  .he-sidebar-example {\n    grid-template-columns: 1fr;\n  }\n  .he-sidebar {\n    border-inline-end: 0;\n    border-bottom: 1px solid var(--hu-line);\n  }\n  .he-sidebar nav {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n  }\n  .he-sidebar-user {\n    display: flex;\n    flex-wrap: wrap;\n  }\n  .he-sidebar-panel {\n    padding: 20px;\n  }\n  .he-sidebar.he-collapsed {\n    width: 100%;\n  }\n  .he-sidebar.he-collapsed .he-sidebar-brand {\n    justify-content: space-between;\n  }\n  .he-sidebar.he-collapsed nav {\n    display: flex;\n    flex-wrap: wrap;\n  }\n  .he-sidebar-example:has(.he-collapsed) {\n    grid-template-columns: 1fr;\n  }\n  .he-stats-head .hb-button-group {\n    width: 100%;\n  }\n  .he-stats-head .hb-button-group button {\n    flex: 1;\n  }\n}\n@media (prefers-reduced-motion: reduce) {\n  .he-extra * {\n    scroll-behavior: auto !important;\n    transition: none !important;\n    animation: none !important;\n  }\n}\n/* A trailing snap spacer lets the final card reach the same alignment as the first. */\n.he-carousel-track::after {\n  content: '';\n  flex: 0 0 calc(50% - 8px);\n}\n.he-carousel-track:has(> article:only-of-type)::after {\n  display: none;\n}\n.he-carousel-track:has(> article:only-of-type) > .he-carousel-card {\n  flex-basis: 100%;\n}\n@media (max-width: 720px) {\n  .he-carousel-track::after {\n    flex-basis: 18%;\n  }\n}\n@media (max-width: 480px) {\n  .he-carousel-track::after {\n    flex-basis: 12%;\n  }\n}\n:where([class^='he-'], [class*=' he-']) {\n  box-sizing: border-box;\n  font-family: var(--hu-font);\n}\n:where(.he-announcement, .he-carousel, .he-otp, .he-textarea, .he-grid, .he-sidebar, .he-stats) {\n  color: var(--hu-text);\n  font-size: 14px;\n  line-height: 20px;\n}\n.he-grid-example {\n  display: grid;\n  gap: 16px;\n  width: 100%;\n  min-width: 0;\n}\n.he-grid-example > .hu-field {\n  max-width: 260px;\n}\n.he-grid td {\n  position: relative;\n  height: var(--he-row-height, 46px);\n}\n.he-grid-cell {\n  min-height: var(--he-row-height, 46px);\n}\n.he-grid-edit {\n  position: absolute;\n  top: 0;\n  inset-inline-start: 0;\n  z-index: 5;\n  width: max(100%, 180px);\n  background: var(--hu-bg);\n  border: 1px solid var(--hu-brand-text);\n  border-radius: 4px;\n  box-shadow: 0 5px 15px #0002;\n}\n.he-rich-select {\n  display: grid;\n  gap: 6px;\n  width: 100%;\n  min-width: 0;\n  font: 14px/20px var(--hu-font);\n  color: var(--hu-text);\n}\n.he-rich-label {\n  font-size: 14px;\n  line-height: 20px;\n  font-weight: 500;\n}\n.he-rich-label > span {\n  color: var(--hu-brand-text);\n}\n.he-rich-trigger {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  min-width: 0;\n  width: 100%;\n  height: 40px;\n  padding: 0 12px;\n  border: 1px solid var(--hu-border);\n  border-radius: 8px;\n  background: var(--hu-bg);\n  color: var(--hu-text);\n  font: 16px/24px var(--hu-font);\n  box-shadow: 0 1px 2px #0000000d;\n  text-align: start;\n  cursor: pointer;\n  outline: none;\n}\n.he-rich-select.he-sm .he-rich-trigger {\n  height: 36px;\n}\n.he-rich-select.he-lg .he-rich-trigger {\n  height: 44px;\n}\n.he-rich-trigger[data-focus-visible],\n.he-rich-select[data-open] .he-rich-trigger {\n  border-color: var(--hu-brand-text);\n  outline: 2px solid var(--hu-brand-text);\n  outline-offset: 2px;\n}\n.he-rich-select[data-invalid] .he-rich-trigger {\n  border-color: var(--hu-error);\n}\n.he-rich-select[data-invalid] .he-rich-trigger[data-focus-visible] {\n  outline-color: var(--hu-error);\n}\n.he-rich-select[data-disabled] .he-rich-trigger {\n  background: var(--hu-bg-secondary);\n  cursor: not-allowed;\n  opacity: 0.6;\n}\n.he-rich-value {\n  display: flex;\n  align-items: center;\n  flex: 1;\n  min-width: 0;\n  overflow: hidden;\n}\n.he-rich-placeholder {\n  font-size: 16px;\n  color: var(--hu-muted);\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.he-rich-selection {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  min-width: 0;\n  width: 100%;\n}\n.he-rich-selection-copy {\n  display: flex;\n  align-items: baseline;\n  gap: 5px;\n  min-width: 0;\n  white-space: nowrap;\n  overflow: hidden;\n}\n.he-rich-selection-copy > span:first-child {\n  font-weight: 500;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.he-rich-selection-description {\n  font-size: 14px;\n  color: var(--hu-muted);\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.he-rich-icon {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  flex-shrink: 0;\n  width: 20px;\n  height: 20px;\n  color: var(--hu-muted);\n}\n.he-rich-avatar {\n  display: inline-flex;\n  flex-shrink: 0;\n}\n.he-rich-trigger .he-rich-avatar > .hb-avatar {\n  width: 24px;\n  height: 24px;\n  font-size: 11px;\n}\n.he-rich-chevron {\n  flex-shrink: 0;\n  color: var(--hu-muted);\n  font-size: 18px;\n  line-height: 20px;\n}\n.he-rich-popover {\n  box-sizing: border-box;\n  z-index: 100;\n  background: var(--hu-bg);\n  color: var(--hu-text);\n  border: 1px solid var(--hu-line);\n  border-radius: 10px;\n  box-shadow: 0 8px 24px #0002;\n  width: var(--trigger-width);\n  min-width: 220px;\n  max-width: calc(100vw - 24px);\n  font: 14px/20px var(--hu-font);\n}\n.he-rich-listbox {\n  padding: 5px;\n  outline: none;\n  max-height: 280px;\n  overflow: auto;\n  box-sizing: border-box;\n  scroll-padding: 5px;\n}\n.he-rich-option {\n  display: flex;\n  gap: 10px;\n  align-items: center;\n  min-height: 44px;\n  padding: 10px;\n  border-radius: 6px;\n  outline: none;\n  cursor: pointer;\n  color: var(--hu-text);\n  box-sizing: border-box;\n}\n.he-rich-option[data-focused] {\n  background: var(--hu-bg-secondary);\n}\n.he-rich-option[data-focus-visible] {\n  outline: 2px solid var(--hu-brand-text);\n  outline-offset: -2px;\n}\n.he-rich-option[data-selected] {\n  background: color-mix(in srgb, var(--hu-brand), var(--hu-bg) 94%);\n}\n.he-rich-option[data-disabled] {\n  opacity: 0.45;\n  cursor: not-allowed;\n}\n.he-rich-option-copy {\n  display: grid;\n  gap: 2px;\n  min-width: 0;\n  flex: 1;\n}\n.he-rich-option-copy > [slot='label'] {\n  font-size: 14px;\n  line-height: 20px;\n  font-weight: 500;\n  overflow-wrap: anywhere;\n}\n.he-rich-option-copy > [slot='description'] {\n  font-size: 12px;\n  line-height: 18px;\n  color: var(--hu-muted);\n  overflow-wrap: anywhere;\n}\n.he-rich-check {\n  width: 16px;\n  flex-shrink: 0;\n  color: var(--hu-brand-text);\n  font-size: 16px;\n}\n.he-rich-empty {\n  padding: 10px;\n}\n.he-rich-popover[data-entering] {\n  animation: he-rich-in 0.12s ease-out;\n}\n@keyframes he-rich-in {\n  from {\n    opacity: 0;\n    transform: translateY(-3px);\n  }\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n@media (prefers-reduced-motion: reduce) {\n  .he-rich-popover[data-entering] {\n    animation: none;\n  }\n}\n.he-grid[data-readonly] .he-grid-cell {\n  cursor: default;\n}\n.he-grid td {\n  border-inline-end: 0;\n  border-inline-end: 1px solid var(--hu-line);\n}\n\n.he-grid-title {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  padding: 16px 16px 0;\n}\n.he-grid-title > span {\n  font-size: 12px;\n  color: var(--hu-muted);\n}\n.he-grid-toolbar {\n  gap: 8px;\n  padding: 12px 16px;\n}\n.he-grid-toolbar .hu-field {\n  min-width: 150px;\n}\n.he-grid-toolbar > .hu-button {\n  font-size: 12px;\n  min-height: 32px;\n  padding: 6px 10px;\n}\n.he-grid-options {\n  border: 0;\n  border-block: 1px solid var(--hu-border);\n  margin: 0;\n  padding: 12px 16px;\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: 14px;\n  background: var(--hu-bg-secondary);\n}\n.he-grid-options legend {\n  font-size: 12px;\n  font-weight: 500;\n  padding: 0;\n}\n.he-grid-options .hu-field {\n  max-width: 260px;\n}\n.he-grid th > button {\n  border: 0;\n  background: transparent;\n  color: inherit;\n  font: inherit;\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  padding: 0;\n  cursor: pointer;\n}\n.he-grid th > button:focus-visible {\n  outline: 2px solid var(--hu-brand-text);\n  outline-offset: 4px;\n}\n.he-grid th:nth-child(-n + 2),\n.he-grid td:nth-child(-n + 2) {\n  position: sticky;\n  inset-inline-start: 0;\n  background: var(--hu-bg);\n  z-index: 2;\n}\n.he-grid th:nth-child(2),\n.he-grid td:nth-child(2) {\n  inset-inline-start: 46px;\n  box-shadow: 1px 0 var(--hu-border);\n}\n.he-grid th:nth-child(-n + 2) {\n  z-index: 4;\n  background: var(--hu-bg-secondary);\n}\n.he-grid td[data-range-selected] {\n  background: color-mix(in srgb, var(--hu-brand) 10%, var(--hu-bg));\n  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--hu-brand) 35%, transparent);\n}\n.he-grid[data-density='compact'] td,\n.he-grid[data-density='compact'] .he-grid-cell {\n  height: 34px;\n  min-height: 34px;\n}\n.he-grid[data-density='compact'] .he-grid-cell {\n  padding-block: 6px;\n}\n.he-grid[data-density='compact'] td:first-child {\n  padding-block: 5px;\n}\n.he-social-buttons {\n  max-width: 320px;\n  width: 100%;\n  display: grid;\n  gap: 10px;\n}\n.he-social-button {\n  justify-content: center;\n  text-decoration: none;\n}\n.he-social-brand.he-provider-google {\n  background: #fff;\n  color: #252525;\n  border-color: #d4d4d4;\n}\n.he-social-brand.he-provider-github {\n  background: #171717;\n  color: #fff;\n  border-color: #171717;\n}\n.he-social-brand.he-provider-slack {\n  background: #fff;\n  color: #252525;\n  border-color: #d4d4d4;\n}\n.he-social-brand[style] {\n  background: var(--he-social-brand);\n  color: #fff;\n  border-color: var(--he-social-brand);\n}\n.he-social-mark svg {\n  display: block;\n}\n.he-social-icon-only {\n  width: 40px;\n  min-width: 40px;\n  padding-inline: 0;\n}\n.he-grid td .he-grid-cell {\n  min-height: calc(var(--he-row-height, 46px) - 1px);\n  height: calc(var(--he-row-height, 46px) - 1px);\n}\n.he-settings-tool {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 12px;\n  padding: 12px 0;\n  border-bottom: 1px solid var(--hu-border);\n}\n.he-settings-tool > div {\n  min-width: 0;\n}\n.he-settings-tool strong {\n  font-weight: 500;\n  overflow-wrap: anywhere;\n}\n.he-settings-plan {\n  padding: 18px;\n  border: 1px solid var(--hu-border);\n  border-radius: 12px;\n  background:\n    radial-gradient(\n      ellipse at top right,\n      color-mix(in srgb, var(--hu-brand) 15%, transparent),\n      transparent 70%\n    ),\n    var(--hu-bg-secondary);\n  display: flex;\n  align-items: center;\n  gap: 12px;\n}\n.he-settings-plan > span:first-child {\n  font-size: 30px;\n  color: var(--hu-brand-text);\n}\n.he-settings-plan > div {\n  flex: 1;\n}\n.he-settings-fields > progress {\n  width: 100%;\n  accent-color: var(--hu-brand);\n  height: 8px;\n}\n.he-sidebar-example > .hu-field {\n  grid-column: 1/-1;\n  max-width: 260px;\n}\n.he-sidebar-chat-head {\n  display: grid;\n  gap: 14px;\n  padding: 8px 0 14px;\n}\n.he-settings-fields {\n  min-width: 0;\n}\n.he-grid[data-density='compact'] td .he-grid-cell {\n  min-height: 33px;\n  height: 33px;\n}\n.he-carousel-demo {\n  width: 100%;\n  max-width: 420px;\n}\n.he-carousel-track > .he-carousel-card {\n  flex-basis: var(--he-card-width, calc(50% - 8px));\n}\n.he-carousel-track::after {\n  flex-basis: max(0px, calc(100% - var(--he-card-width, calc(50% - 8px)) - var(--he-carousel-gap, 16px)));\n}\n.he-carousel-track[data-align='center']::before {\n  content: '';\n  flex: 0 0 max(0px, calc((100% - var(--he-card-width)) / 2 - var(--he-carousel-gap, 16px)));\n}\n.he-carousel-track[data-align='center']::after {\n  flex-basis: max(0px, calc((100% - var(--he-card-width)) / 2 - var(--he-carousel-gap, 16px)));\n}\n.he-carousel-track[data-align='center'] > .he-carousel-card {\n  scroll-snap-align: center;\n}\n.he-stat-example {\n  display: grid;\n  gap: 18px;\n  width: 100%;\n}\n.he-stat-example > .hu-field {\n  max-width: 240px;\n}\n.he-stats-footer .he-stats-grid {\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n  gap: 14px;\n}\n.he-stats-footer .he-stats-grid article {\n  background: var(--hu-bg-secondary);\n  padding: 16px 16px 10px;\n}\n.he-stat-tile-row {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  margin-bottom: 16px;\n}\n.he-stat-icon {\n  display: grid;\n  place-items: center;\n  width: 36px;\n  height: 36px;\n  border-radius: 10px;\n  color: var(--hu-brand-text);\n  background: linear-gradient(\n    145deg,\n    color-mix(in srgb, var(--hu-brand) 18%, var(--hu-bg)),\n    color-mix(in srgb, var(--hu-brand) 5%, var(--hu-bg))\n  );\n  box-shadow: inset 0 1px 0 #ffffff66;\n  font-size: 19px;\n}\n.he-stat-info .hu-button {\n  width: 24px;\n  min-height: 24px;\n  height: 24px;\n  padding: 0;\n  border: 0;\n  background: transparent;\n  color: var(--hu-muted);\n}\n.he-stats-grid article > .he-stat-footer {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 8px;\n  background: var(--hu-bg);\n  border-radius: 7px;\n  padding: 6px 8px;\n  margin-top: 12px;\n}\n.he-stats-grid article > .he-stat-footer > .he-stat-period {\n  display: inline;\n  color: var(--hu-muted);\n  font-size: 11px;\n}\n.he-stat-footer > b {\n  display: inline-block;\n  padding: 0 6px;\n  border-radius: 12px;\n  background: color-mix(in srgb, currentColor 10%, transparent);\n  font-size: 11px;\n  font-weight: 500;\n}\n.he-stats-grid article > small > b {\n  font-weight: 500;\n}\n@media (max-width: 480px) {\n  .he-stats-footer .he-stats-grid {\n    grid-template-columns: 1fr;\n  }\n  .he-stats-footer .he-stats-grid article {\n    padding: 14px;\n  }\n}\n/* Provider surfaces must win over the shared secondary-button background. */\n.hu-button.he-social-button.he-social-brand.he-provider-google,\n.hu-button.he-social-button.he-social-brand.he-provider-slack {\n  background: #fff;\n  color: #252525;\n  border-color: #d4d4d4;\n}\n.hu-button.he-social-button.he-social-brand.he-provider-github {\n  background: #171717;\n  color: #fff;\n  border-color: #171717;\n}\n.hu-button.he-social-button.he-social-brand[style] {\n  background: var(--he-social-brand);\n  color: var(--he-social-ink, #fff);\n  border-color: var(--he-social-brand);\n}\n.he-announcement-card {\n  position: relative;\n  display: grid;\n  grid-template-columns: 1fr;\n  gap: 6px;\n  width: 100%;\n  max-width: 260px;\n  padding: 12px;\n  overflow: hidden;\n  background: var(--hu-bg);\n}\n.he-announcement-card > .he-announcement-mark {\n  width: 18px;\n  height: 18px;\n  border: 0;\n  border-radius: 0;\n  background: none;\n  font-size: 14px;\n}\n.he-announcement-card > .hu-button {\n  position: absolute;\n  inset-inline-end: 6px;\n  top: 5px;\n  width: 24px;\n  height: 24px;\n  min-height: 24px;\n  padding: 0;\n}\n.he-announcement-card > div {\n  width: 100%;\n}\n.he-announcement-card > div > .hu-button {\n  width: 100%;\n  justify-content: center;\n}\n.he-announcement-card p {\n  font-size: 12px;\n  line-height: 18px;\n  margin: 4px 0 12px;\n}\n.he-announcement-card strong {\n  font-size: 12px;\n}\n.he-sidebar-footer {\n  margin-top: auto;\n  padding-top: 20px;\n}\n.he-sidebar-user {\n  flex-wrap: wrap;\n}\n.he-sidebar-user > .hb-menu-trigger {\n  min-height: 28px;\n  font-size: 11px;\n}\n.he-sidebar > .hb-toggle {\n  font-size: 11px;\n  margin-top: 14px;\n}\n.he-sidebar > .hb-toggle small {\n  display: none;\n}\n.he-social-provider-grid {\n  display: grid;\n  grid-template-columns: repeat(6, minmax(0, 1fr));\n  gap: 10px;\n  width: 100%;\n  max-width: 320px;\n}\n.he-social-provider-grid .he-social-icon-only {\n  width: 100%;\n  min-width: 0;\n}\n.he-social-provider-grid .he-social-mark {\n  width: 18px;\n  height: 18px;\n}\n.he-otp-separator {\n  align-self: center;\n  flex: 0 0 8px;\n  text-align: center;\n  color: var(--hu-muted);\n  font-size: 16px;\n}\n.he-otp-fields:has(.he-otp-separator) {\n  gap: 6px;\n}\n.he-sidebar-brand > .hb-menu-trigger {\n  max-width: calc(100% - 28px);\n  min-height: 30px;\n  font-size: 12px;\n  gap: 6px;\n  padding: 4px 6px;\n  border: 0;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n/* The reference monochrome Instagram path needs the semantic icon ink in dark surfaces. */\n.dark .he-social-white.he-provider-instagram .he-social-mark path {\n  fill: currentColor;\n}\n.he-provider-notion .he-social-mark path:not([fill]) {\n  fill: #0a0a08;\n}\n\n/* The audited surface/control roles inherit light/dark declarations from board-palette.css. */\n.he-announcement,\n.he-announcement-card {\n  background: var(--color-background-primary-default);\n  border-color: var(--color-border-button-default);\n  color: var(--color-text-primary);\n}\n.he-announcement.he-tone-brand {\n  background: var(--color-pill-tab-blue-selected-background);\n  border-color: var(--color-badge-new-background);\n}\n.he-announcement.he-tone-success {\n  border-color: var(--color-status-lime-background);\n}\n.he-otp-fields input,\n.he-textarea textarea {\n  background: var(--color-background-primary-default);\n  border-color: var(--color-border-button-default);\n  color: var(--color-text-primary);\n}\n.he-otp-fields input:focus,\n.he-textarea textarea:focus {\n  border-color: var(--color-accent-500);\n}\n.he-otp.he-invalid .he-otp-fields input,\n.he-textarea [aria-invalid='true'] {\n  background: var(--color-background-tertiary-error);\n  border-color: var(--color-border-error-default);\n}\n.he-otp-fields input:disabled,\n.he-textarea textarea:disabled {\n  background: var(--color-input-disabled-background);\n  color: var(--color-input-disabled-text);\n}\n.he-stat-positive,\n.dark .he-stat-positive,\n[data-helios-theme='dark'] .he-stat-positive {\n  color: var(--color-status-lime-text);\n}\n.he-stat-negative {\n  color: var(--color-status-rose-text);\n}\n.he-stats-grid svg {\n  color: var(--color-chart-1);\n}\n.he-stat-icon {\n  background: var(--color-stat-card-icon-background);\n  color: var(--color-accent-600);\n}\n.he-rich-trigger {\n  background: var(--color-background-primary-default);\n  border-color: var(--color-border-button-default);\n  color: var(--color-text-primary);\n}\n.he-rich-trigger[data-focus-visible] {\n  outline-color: var(--color-accent-500);\n}\n.he-rich-trigger[aria-invalid='true'] {\n  border-color: var(--color-border-error-default);\n  background: var(--color-background-tertiary-error);\n}\n.he-rich-popover {\n  background: var(--color-background-secondary-default);\n  color: var(--color-text-primary);\n  border-color: var(--color-border-button-default);\n}\n.he-rich-option[data-focused] {\n  background: var(--color-background-primary-hover);\n}\n.he-rich-option[data-selected] {\n  background: var(--color-pill-tab-blue-selected-background);\n}\n.he-rich-check {\n  color: var(--color-accent-600);\n}\n.he-grid td[data-range-selected] {\n  background: var(--color-date-range-background);\n  box-shadow: inset 0 0 0 1px var(--color-date-range-edge-background);\n}\n.he-grid td .he-grid-cell {\n  color: var(--color-text-primary);\n}\n.he-sidebar nav button[aria-current='page'] {\n  background: var(--color-pill-tab-blue-selected-background);\n  color: var(--color-text-primary);\n}\n.he-rich-option-copy > [slot='description'] {\n  color: var(--hu-popup-muted);\n}\n.he-rich-select {\n  color: var(--color-text-primary);\n}\n.he-rich-selection-description {\n  color: var(--hu-popup-muted);\n}\n.he-stat-negative {\n  color: var(--hu-status-rose-readable);\n}\n\n/* The component preview demonstrates a floating sidebar, not a blank application page. */\n.he-sidebar-example { display: flex; flex-direction: column; gap: 12px; max-width: 280px; border: 0; border-radius: 0; min-height: 0; overflow: visible; }\n.he-sidebar-example > .hu-field { max-width: none; }\n.he-sidebar-example .he-sidebar { width: 100%; padding: 12px; gap: 12px; border: 1px solid var(--hu-line); border-radius: 20px; }\n.he-sidebar-example .he-sidebar.he-collapsed { width: 72px; align-self: center; }\n.he-sidebar-example .he-sidebar-user { display: flex; flex-wrap: wrap; gap: 8px; padding-top: 12px; }\n.he-sidebar-example .he-sidebar-user > span:not(.hb-avatar) { min-width: 0; flex: 1; }\n.he-sidebar-example .he-sidebar-user > .hb-avatar { flex: 0 0 var(--hb-avatar-size); }\n.he-sidebar-example .he-sidebar-user small { overflow-wrap: anywhere; }\n.he-sidebar-example .he-sidebar nav { display: grid; grid-template-columns: 1fr; }\n.he-sidebar-example .he-sidebar.he-collapsed nav { display: grid; }\n.he-sidebar-selection { width: 100%; }\n.he-carousel-controls summary { color: var(--hu-muted); cursor: pointer; font-size: 12px; padding-block: 4px; }\n.he-carousel-controls[open] > .he-inline { margin-block-start: 12px; }\n.he-carousel-controls summary:focus-visible { outline: 2px solid var(--hu-brand-text); outline-offset: 3px; border-radius: 4px; }\n/* Three public social appearances; legacy brand/neutral names remain aliases. */\n.hu-button.hu-secondary.he-social-button[class] { width: var(--he-social-width, 300px); max-width: 100%; }\n.hu-button.hu-secondary.he-social-button.he-social-full-width[class] { width: 100%; }\n.hu-button.hu-secondary.he-social-button.he-social-colorful[style] {\n  background: linear-gradient(180deg, var(--he-social-brand), var(--he-social-brand-end));\n  color: var(--he-social-ink); border-color: #ffffff1f;\n  box-shadow: 0 1px 2px #0000000d, inset 0 -2px 0 #0000000d, inset 0 0 0 1px #00000012;\n}\n.hu-button.hu-secondary.he-social-button.he-social-black[class] { background: var(--color-neutral-950, #0a0a0a); color: #fff; border-color: #ffffff1f; }\n.hu-button.hu-secondary.he-social-button.he-social-white[class] { background: var(--hu-bg); color: var(--hu-text); border-color: var(--hu-border); }\n.hu-button.hu-secondary.he-social-button.he-social-icon-only[class] { width: var(--hu-height); }\n.hu-button.hu-secondary.he-social-button.he-social-colorful:hover:not(:disabled) { filter: none; box-shadow: 0 2px 4px #0000001a, inset 0 -2px 0 #0000000d; }\n.hu-button.hu-secondary.he-social-button.he-social-black:hover:not(:disabled) { background: var(--color-neutral-800, #262626); }\n.he-social-mark > svg { width: 100%; height: 100%; }\n.dark .he-social-mark.he-provider-apple svg path,\n.dark .he-social-mark.he-provider-github svg path,\n.dark .he-social-mark.he-provider-x svg path { fill: currentColor; }\n.he-settings-plan-art { position: relative; display: grid; place-items: center; overflow: hidden; width: 64px; height: 56px; flex: 0 0 64px; border-radius: 9px; background: var(--hu-bg-secondary); }\n.he-settings-plan-art img { width: 100%; height: 100%; object-fit: cover; }\n.he-settings-plan-art i { position: absolute; width: 38px; height: 38px; border: 5px solid var(--color-accent-500); border-radius: 50%; transform: rotate(-25deg); animation: he-plan-orbit 5s ease-in-out infinite alternate; }\n.he-settings-plan-art i:nth-child(2) { inset-inline-start: -8px; top: -10px; border-color: var(--color-accent-300); animation-delay: -2s; }\n.he-settings-plan-art i:nth-child(3) { inset-inline-end: -8px; bottom: -10px; border-color: var(--color-accent-700); animation-delay: -4s; }\n@keyframes he-plan-orbit { to { transform: translateY(4px) rotate(25deg); } }\n@media (prefers-reduced-motion: reduce) { .he-settings-plan-art i { animation: none; } }\n.he-stat-tone-blue { --he-stat-tone: var(--color-blue-600); }\n.he-stat-tone-orange { --he-stat-tone: var(--color-orange-600); }\n.he-stat-tone-purple { --he-stat-tone: var(--color-purple-600); }\n.he-stat-tone-pink { --he-stat-tone: var(--color-pink-600); }\n.he-stat-tone-sky { --he-stat-tone: var(--color-sky-600); }\n.he-stat-tone-emerald { --he-stat-tone: var(--color-emerald-600); }\n.he-stat-icon[class*='he-stat-tone-'] { color: var(--he-stat-tone); background: color-mix(in srgb,var(--he-stat-tone) 15%,var(--hu-bg)); }\n.he-grid-toolbar { gap: 6px; padding: 10px 12px; align-items: center; }\n.he-grid-toolbar .he-grid-search { min-width: 120px; max-width: none; flex: 1 1 140px; }\n.he-grid-search > label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }\n.he-grid-example-options summary { color: var(--hu-muted); cursor: pointer; font-size: 12px; padding-block: 6px; }\n.he-grid-example-options[open] > .hu-field, .he-grid-example-options[open] > .he-inline { margin-top: 10px; }\n.he-grid tfoot { position: sticky; bottom: 0; z-index: 2; background: var(--hu-bg); font-weight: 500; }\n.he-grid tfoot td { border-top: 1px solid var(--hu-line); }\n@media(max-width:600px) { .he-grid-toolbar .he-grid-search { min-width: 120px; max-width: none; flex: 1 1 140px; } }\n/* Editors stay inside the fixed virtual row, including their real mouse actions. */\n.he-grid-edit { display: flex; align-items: center; gap: 4px; min-width: 0; padding: 6px; }\n.he-grid-edit > input, .he-grid-edit > select { min-width: 0; width: 0; flex: 1 1 auto; height: 32px; padding: 4px 6px; }\n.he-grid-edit > div { display: flex; flex: 0 0 auto; gap: 2px; }\n.he-grid[data-density='compact'] .he-grid-edit { padding: 0 2px; gap: 2px; }\n.he-grid-column-resizer { position: absolute; inset-block: 0; inset-inline-end: -3px; width: 8px; padding: 0; border: 0; background: transparent; cursor: col-resize; touch-action: none; z-index: 4; }\n.he-grid-column-resizer::after { content: ''; display: block; width: 1px; height: 20px; margin: auto; background: var(--hu-line); }\n.he-grid-column-resizer:hover::after, .he-grid-column-resizer:focus-visible::after { background: var(--hu-brand-text); width: 2px; }\n.he-grid, .he-grid * { box-sizing: border-box; }\n.he-grid-column-resizer { width: 24px; inset-inline-end: -12px; }\n.he-grid-column-resizer:focus-visible { outline: 2px solid var(--hu-brand-text); outline-offset: -3px; }\n\n/* Keep a full scrolling cell usable beside pinned columns at narrow/custom widths. */\n.he-grid-scroll[data-freeze-first-column='false'] th:nth-child(2),\n.he-grid-scroll[data-freeze-first-column='false'] td:nth-child(2) {\n  inset-inline-start: auto;\n  box-shadow: none;\n}\n.he-grid-scroll[data-freeze-first-column='false'] th:nth-child(2) { z-index: 2; }\n.he-grid-scroll[data-freeze-first-column='false'] td:nth-child(2) { position: static; }\n",
  "src/board-native-agents/components/application/agent-thinking/agent-thinking.tsx": "/* Adapted from the public BoardUI registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { useTemplateCopy } from \"../../../../board-native/components/foundations/template-copy/template-copy\";\n\nimport { useEffect, useState } from \"react\";\nimport {useMotionPreference} from \"../../../../useMotionPreference.js\";\nimport type { CSSProperties } from \"react\";\nimport { cx } from \"../../../../board-native/utils/cx\";\n\n/**\n * Agent Thinking — the agent \"thinking\" state that sits above a chat composer\n * while a response is being worked on.\n *\n * Four curated variants:\n * - `wave`     dot grid with a diagonal wavefront gliding top-left → bottom-right\n * - `spin`     dot grid with a bright head orbiting the grid clockwise\n * - `stars`    sparkles twinkling in and out with a stagger\n * - `infinity` a comet trail sweeping a figure-eight\n *\n * Every variant pairs the indicator with a shimmering label and an elapsed\n * timer that starts when the loader mounts. Shimmer and CSS animations fall\n * back to static rendering under `prefers-reduced-motion` (see globals.css).\n */\n\nexport type AgentThinkingVariant = \"wave\" | \"spin\" | \"stars\" | \"infinity\";\nexport type AgentThinkingTone = \"subtle\" | \"default\" | \"primary\" | \"accent\";\n\nexport interface AgentThinkingProps {\n  variant?: AgentThinkingVariant;\n  /** Status label, e.g. \"Thinking\" or \"Searching the docs\". */\n  label?: string;\n  /** Tone of the indicator + label. Defaults per variant (`stars` is subtle). */\n  tone?: AgentThinkingTone;\n  /** Animated highlight traveling across the label. */\n  shimmer?: boolean;\n  /** Elapsed seconds since mount, rendered after the label. */\n  showTimer?: boolean;\n  className?: string;\n}\n\nconst TONE_COLORS: Record<AgentThinkingTone, string> = {\n  subtle: \"var(--color-text-tertiary)\",\n  default: \"var(--color-text-secondary)\",\n  primary: \"var(--color-text-primary)\",\n  accent: \"var(--hu-brand-text)\",\n};\n\nconst VARIANT_TONE: Record<AgentThinkingVariant, AgentThinkingTone> = {\n  wave: \"default\",\n  spin: \"default\",\n  stars: \"subtle\",\n  infinity: \"default\",\n};\n\n/* ------------------------------------------------------------------- dots */\n\nconst DOTS_GRID = 3;\nconst DOTS_SIZE = 4;\nconst DOTS_GAP = 2;\nconst DOTS_TICK_MS = 80;\nconst DOTS_FADE_MS = 220;\nconst DOTS_TRAIL = 0.3;\nconst DOTS_MIN_OPACITY = 0.12;\nconst DOTS_PHASE_STEP = 1 / 8;\n\n// Static first frame: identical on server and client, and the resting state\n// under prefers-reduced-motion.\nconst DOTS_SEED = [0.55, 0.3, 0.15, 0.85, 0.55, 0.3, 1, 0.85, 0.55];\n\n/**\n * How far along the pattern's travel direction each cell sits, in [0, 1).\n * The wave scalar is compressed below 1 so the phase wrap reads as the front\n * leaving the grid and re-entering; the spin angle is naturally cyclic.\n */\nfunction dotScalar(variant: \"wave\" | \"spin\", col: number, row: number) {\n  const m = DOTS_GRID - 1;\n  if (variant === \"wave\") {\n    return ((col + row) / (2 * m)) * (DOTS_GRID / (DOTS_GRID + 1));\n  }\n  const center = m / 2;\n  return (Math.atan2(row - center, col - center) / (2 * Math.PI) + 1) % 1;\n}\n\nfunction dotOpacities(variant: \"wave\" | \"spin\", phase: number) {\n  return Array.from({ length: DOTS_GRID * DOTS_GRID }, (_, i) => {\n    const s = dotScalar(variant, i % DOTS_GRID, Math.floor(i / DOTS_GRID));\n    // Comet: bright head at the phase front, tail fading behind it.\n    const behind = (phase - s + 1) % 1;\n    const lit = Math.max(0, 1 - behind / DOTS_TRAIL) ** 1.5;\n    return DOTS_MIN_OPACITY + (1 - DOTS_MIN_OPACITY) * lit;\n  });\n}\n\nfunction DotsIndicator({ variant }: { variant: \"wave\" | \"spin\" }) {\n  const localize = useTemplateCopy();\n  const [opacities, setOpacities] = useState<number[]>(DOTS_SEED),reduced=useMotionPreference();\n\n  useEffect(() => {\n    if (reduced!==false){setOpacities(DOTS_SEED);return;}\n    let phase = 0;\n    const id = window.setInterval(() => {\n      phase = (phase + DOTS_PHASE_STEP) % 1;\n      setOpacities(dotOpacities(variant, phase));\n    }, DOTS_TICK_MS);\n    return () => window.clearInterval(id);\n  }, [variant,reduced]);\n\n  return localize((\n    <span\n      aria-hidden\n      className=\"grid shrink-0\"\n      style={{\n        gridTemplateColumns: `repeat(${DOTS_GRID}, ${DOTS_SIZE}px)`,\n        gap: DOTS_GAP,\n      }}\n    >\n      {opacities.map((opacity, i) => (\n        <span\n          key={i}\n          className=\"rounded-[1px] bg-current\"\n          style={{\n            width: DOTS_SIZE,\n            height: DOTS_SIZE,\n            opacity,\n            transition: reduced!==false?\"none\":`opacity ${DOTS_FADE_MS}ms ease`,\n          }}\n        />\n      ))}\n    </span>\n  ));\n}\n\n/* ------------------------------------------------------------------ stars */\n\nconst STAR_PERIOD_S = 1.4;\nconst STAR_SIZE = 14;\nconst STAR_COUNT = 5;\nconst STAR_LAYOUT = [\n  { x: 50, y: 46, scale: 1 },\n  { x: 18, y: 22, scale: 0.55 },\n  { x: 82, y: 26, scale: 0.45 },\n  { x: 78, y: 76, scale: 0.55 },\n  { x: 22, y: 78, scale: 0.4 },\n];\nconst STAR_PATH = \"M12 0C13 7 17 11 24 12C17 13 13 17 12 24C11 17 7 13 0 12C7 11 11 7 12 0Z\";\n\nfunction StarsIndicator() {\n  const localize = useTemplateCopy();\n  const box = STAR_SIZE * 1.5;\n  return localize((\n    <span\n      aria-hidden\n      className=\"bui-agent-thinking-stars relative block shrink-0\"\n      style={{ width: box, height: box }}\n    >\n      {STAR_LAYOUT.slice(0, STAR_COUNT).map((star, i) => {\n        const size = STAR_SIZE * star.scale;\n        return (\n          <svg\n            key={i}\n            viewBox=\"0 0 24 24\"\n            className=\"bui-agent-thinking-star absolute\"\n            style={{\n              width: size,\n              height: size,\n              left: `${star.x}%`,\n              top: `${star.y}%`,\n              marginLeft: -size / 2,\n              marginTop: -size / 2,\n              animationDuration: `${STAR_PERIOD_S}s`,\n              animationDelay: `${(i * STAR_PERIOD_S * 0.7) / STAR_COUNT}s`,\n            }}\n          >\n            <path d={STAR_PATH} fill=\"currentColor\" />\n          </svg>\n        );\n      })}\n    </span>\n  ));\n}\n\n/* --------------------------------------------------------------- infinity */\n\nconst INFINITY_WIDTH = 32;\nconst INFINITY_TRAIL = 11;\nconst INFINITY_STROKE = 2.75;\nconst INFINITY_DURATION_S = 1.2;\nconst INFINITY_PATH =\n  \"M28 14C33 5 47 5 47 14C47 23 33 23 28 14C23 5 9 5 9 14C9 23 23 23 28 14Z\";\n\nfunction InfinityIndicator() {\n  const localize = useTemplateCopy();\n  return localize((\n    <svg\n      aria-hidden\n      viewBox=\"0 0 56 28\"\n      className=\"shrink-0\"\n      // The figure-eight spans x 9-47 of the 56-wide viewBox, so the svg box\n      // carries ~4px of dead space per side at this width; pull it back in so\n      // the label sits at the loader's real gap.\n      style={{ width: INFINITY_WIDTH, height: INFINITY_WIDTH / 2, margin: \"0 -4px\" }}\n    >\n      <path\n        d={INFINITY_PATH}\n        fill=\"none\"\n        stroke=\"currentColor\"\n        strokeWidth={INFINITY_STROKE}\n        opacity={0.15}\n      />\n      <path\n        d={INFINITY_PATH}\n        pathLength={100}\n        fill=\"none\"\n        stroke=\"currentColor\"\n        strokeWidth={INFINITY_STROKE}\n        strokeLinecap=\"round\"\n        strokeDasharray={`${INFINITY_TRAIL} ${100 - INFINITY_TRAIL}`}\n        className=\"bui-agent-thinking-comet\"\n        style={{ animationDuration: `${INFINITY_DURATION_S}s` }}\n      />\n    </svg>\n  ));\n}\n\n/* ------------------------------------------------------------------ timer */\n\nfunction ElapsedTimer() {\n  const localize = useTemplateCopy();\n  const [elapsed, setElapsed] = useState(0);\n\n  useEffect(() => {\n    const started = performance.now();\n    const id = window.setInterval(\n      () => setElapsed((performance.now() - started) / 1000),\n      100,\n    );\n    return () => window.clearInterval(id);\n  }, []);\n\n  return localize((\n    <span className=\"font-mono text-caption-1-regular text-text-tertiary tabular-nums\">\n      {elapsed.toFixed(1)}s\n    </span>\n  ));\n}\n\n/* ----------------------------------------------------------------- loader */\n\nexport function AgentThinking({\n  variant = \"wave\",\n  label = \"Thinking\",\n  tone,\n  shimmer = true,\n  showTimer = true,\n  className,\n}: AgentThinkingProps) {\n  const localize = useTemplateCopy();\n  const color = TONE_COLORS[tone ?? VARIANT_TONE[variant]];\n\n  return localize((\n    <div\n      role=\"status\"\n      className={cx(\"flex items-center gap-2.5\", className)}\n      style={{ color, \"--bui-agent-thinking-tone\": color } as CSSProperties}\n    >\n      {(variant === \"wave\" || variant === \"spin\") && <DotsIndicator variant={variant} />}\n      {variant === \"stars\" && <StarsIndicator />}\n      {variant === \"infinity\" && <InfinityIndicator />}\n      <span\n        aria-label={label}\n        className={cx(\"text-body-medium\", shimmer && \"bui-agent-thinking-label\")}\n      >\n        {label}\n      </span>\n      {showTimer && <ElapsedTimer />}\n    </div>\n  ));\n}\n",
  "src/board-native-agents/components/application/auth/auth-card.tsx": "/* Adapted from the public BoardUI registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport type { FormEvent, ReactNode } from \"react\";\nimport { useState } from \"react\";\nimport { RiMailCheckLine } from \"@remixicon/react\";\nimport { Button } from \"../../../../board-native/components/base/buttons/button\";\nimport { Checkbox } from \"../../../../board-native/components/base/checkbox/checkbox\";\nimport { Divider } from \"../../../../board-native/components/base/divider/divider\";\nimport { Input } from \"../../../../board-native/components/base/input/input\";\nimport { InputOtp } from \"../../../../board-native/components/base/input-otp/input-otp\";\nimport { LinkButton } from \"../../../../board-native/components/base/buttons/link-button\";\nimport { SocialButton } from \"../../../../board-native/components/base/social-button/social-button\";\nimport { SOCIAL_PROVIDERS, type SocialProvider } from \"../../../../board-native/components/base/social-button/social-providers\";\nimport { useTemplateCopy } from \"../../../../board-native/components/foundations/template-copy/template-copy\";\nimport { cx } from \"../../../../board-native/utils/cx\";\n\n// Re-exported so `media` has a batteries-included option and the registry\n// installs it alongside the card. Nothing here imports it otherwise.\nexport {\n  AuthMediaCarousel,\n  type AuthMediaSlide,\n} from \"./auth-media-carousel\";\n\n/**\n * Sign-in and sign-up cards built on the social buttons.\n *\n * The providers render one of three ways, because each is right somewhere:\n *\n *   layout=\"stacked\"  full-width buttons with labels, one per row. Names each\n *                     provider, so it suits a dedicated sign-in page with the\n *                     room to spell them out.\n *   layout=\"inline\"   icon-only squares side by side. Compact enough for a\n *                     modal or a narrow panel, and carries more providers in\n *                     the same space.\n *   layout=\"grid\"     icon-only across equal columns, so a small set reads as\n *                     one row of controls rather than loose squares.\n *\n * All three sit below the email form, never above it, and all three take the\n * same `providers` array, so switching is one prop and the set never has to\n * be written twice.\n *\n * `media` turns the whole thing into a two-column split with artwork beside\n * the form — pass `AuthMediaCarousel` for a set of images that cycles on its\n * own — and `logo` puts a mark above the title.\n *\n * `mode=\"verify\"` is the step after either one: OTP boxes instead of email\n * and password, a resend action instead of a link to the other mode, and no\n * providers at all, since the visitor has already chosen how they sign in.\n *\n * The form is deliberately uncontrolled and `onSubmit`-based: an auth card is\n * the shell around whatever the host app's auth library does, not an opinion\n * about it. Pass `onSubmit` and `onProvider`, or swap the CTA for your own.\n */\n\nexport type AuthLayout = \"stacked\" | \"inline\" | \"grid\";\nexport type AuthMode = \"signin\" | \"signup\" | \"verify\";\n\nexport interface AuthCardProps {\n  /**\n   * `signin` (default), `signup`, or `verify` for the one-time-code step.\n   * `verify` swaps the email fields for OTP boxes and drops the providers:\n   * the visitor has already chosen how they are signing in.\n   */\n  mode?: AuthMode;\n  /** `verify` only: the address the code went to, shown in the description. */\n  email?: string;\n  /** `verify` only: how many digits. Defaults to 6. */\n  codeLength?: number;\n  /** `verify` only: fires once the last box is filled. */\n  onComplete?: (code: string) => void;\n  /** `verify` only: the resend action. */\n  onResend?: () => void;\n  /** How the provider buttons are arranged. Defaults to `stacked`. */\n  layout?: AuthLayout;\n  providers?: SocialProvider[];\n  title?: ReactNode;\n  description?: ReactNode;\n  /**\n   * Artwork for the right half. Passing it turns the card into the split\n   * layout: form on the left, media on the right, which drops to the form\n   * alone below `md` rather than stacking a tall image above the fields.\n   */\n  media?: ReactNode;\n  /**\n   * Mark above the title — a wordmark, an app icon, anything. Deliberately a\n   * node rather than a src, so the card stays brand-agnostic and an installed\n   * copy pulls none of BoardUI's own artwork with it.\n   */\n  logo?: ReactNode;\n  /** Centre the heading, as the split layout usually wants. */\n  centered?: boolean;\n  /** Sign-up only: adds a stacked confirm-password field. */\n  confirmPassword?: boolean;\n  /** Small print under the card, outside its border. */\n  footnote?: ReactNode;\n  /** Fires with the form's own FormData; wire it to your auth library. */\n  onSubmit?: (data: FormData) => void;\n  onProvider?: (provider: SocialProvider) => void;\n  /** Password recovery route, or a callback for an application-owned flow. */\n  forgotHref?: string;\n  onForgotPassword?: () => void;\n  /** Footer link target, e.g. to the opposite mode. */\n  switchHref?: string;\n  /** Switch mode locally instead of navigating to a route. */\n  onSwitchMode?: () => void;\n  /**\n   * Heading level for the card title. Defaults to `1`, because on a real\n   * sign-in screen the card *is* the page. Drop it to `2`+ wherever the card\n   * is embedded as a preview inside a page that already has an `<h1>` — two\n   * `<h1>`s in one document flattens the outline for screen readers and for\n   * anything reading the page as a document.\n   */\n  headingLevel?: 1 | 2 | 3 | 4 | 5 | 6;\n  className?: string;\n}\n\nconst COPY = {\n  signin: {\n    title: \"Welcome back\",\n    description: \"Sign in to pick up where you left off.\",\n    cta: \"Sign in\",\n    switchLead: \"New here?\",\n    switchAction: \"Create an account\",\n  },\n  signup: {\n    title: \"Create your account\",\n    description: \"Start building with BoardUI in a couple of minutes.\",\n    cta: \"Create account\",\n    switchLead: \"Already have an account?\",\n    switchAction: \"Sign in\",\n  },\n  verify: {\n    title: \"Check your inbox\",\n    description: \"Enter the code we sent to finish signing in.\",\n    cta: \"Verify and continue\",\n    switchLead: \"Code not arriving?\",\n    switchAction: \"Send a new one\",\n  },\n} as const;\n\nexport function AuthCard({\n  mode = \"signin\",\n  email,\n  codeLength = 6,\n  onComplete,\n  onResend,\n  layout = \"stacked\",\n  providers = [\"google\", \"apple\", \"github\"],\n  title,\n  description,\n  media,\n  logo,\n  centered = false,\n  confirmPassword = false,\n  footnote,\n  onSubmit,\n  onProvider,\n  forgotHref = \"#\",\n  onForgotPassword,\n  switchHref = \"#\",\n  onSwitchMode,\n  headingLevel = 1,\n  className,\n}: AuthCardProps) {\n  const localize = useTemplateCopy();\n  const TitleHeading = `h${headingLevel}` as const;\n  const [remember, setRemember] = useState(true);\n  const [code, setCode] = useState(\"\");\n  const copy = COPY[mode];\n  const signup = mode === \"signup\";\n  const verify = mode === \"verify\";\n\n  const submit = (event: FormEvent<HTMLFormElement>) => {\n    event.preventDefault();\n    onSubmit?.(new FormData(event.currentTarget));\n  };\n\n  const social = (\n    <div\n      className={cx(\n        layout === \"stacked\" && \"flex flex-col gap-2.5\",\n        // Wraps rather than scrolls: six providers on a narrow card should\n        // fall to a second row, not clip.\n        layout === \"inline\" && \"flex flex-wrap justify-center gap-2\",\n        // Equal columns that share the full width, so three providers read as\n        // one row of controls rather than three loose squares.\n        layout === \"grid\" && \"grid grid-flow-col auto-cols-fr gap-2.5\",\n      )}\n    >\n      {providers.map((provider) => (\n        <SocialButton\n          key={provider}\n          brand={provider}\n          appearance=\"white\"\n          iconOnly={layout !== \"stacked\"}\n          fullWidth={layout === \"stacked\"}\n          // `iconOnly` fixes a square width; the grid needs it to stretch,\n          // and `className` is last into `cx` so it wins.\n          className={layout === \"grid\" ? \"w-full\" : undefined}\n          aria-label={layout !== \"stacked\" ? `Continue with ${SOCIAL_PROVIDERS[provider].label}` : undefined}\n          onClick={() => onProvider?.(provider)}\n        >\n          {`Continue with ${SOCIAL_PROVIDERS[provider].label}`}\n        </SocialButton>\n      ))}\n    </div>\n  );\n\n  // The code step centres itself and carries a mark by default: it is a\n  // single-purpose screen, and the icon is what says at a glance which one.\n  // Left-aligned like the other two modes: a centred column with a hairline\n  // was the reference's shape, and this one should read as the same family\n  // as the sign-in card it follows, not as a different screen.\n  const centerContent = centered;\n  const mark =\n    logo ??\n    (verify ? (\n      <RiMailCheckLine className=\"size-8 text-foreground-icon-primary\" aria-hidden />\n    ) : null);\n\n  const body = (\n    <>\n      {mark ? (\n        <div className={cx(\"mb-5 flex\", centerContent ? \"justify-center\" : \"justify-start\")}>\n          {mark}\n        </div>\n      ) : null}\n\n      <div className={cx(\"flex flex-col gap-1.5\", centerContent && \"text-center\")}>\n        <TitleHeading className=\"text-title-2-medium text-text-primary\">\n          {title ?? copy.title}\n        </TitleHeading>\n        <p className=\"text-body-regular text-text-secondary\">\n          {description ??\n            (verify && email ? (\n              <>\n                Enter the code we sent to{\" \"}\n                <span className=\"text-body-medium text-text-primary\">{email}</span>{\" \"}\n                to finish signing in.\n              </>\n            ) : (\n              copy.description\n            ))}\n        </p>\n      </div>\n\n      <form onSubmit={submit} className=\"mt-6 flex flex-col gap-4\">\n        {verify ? (\n          <div className=\"flex flex-col gap-1.5\">\n            <span className=\"text-body-medium text-text-secondary\">\n              Verification code\n            </span>\n            <InputOtp\n              value={code}\n              onChange={setCode}\n              onComplete={onComplete}\n              length={codeLength}\n              groupEvery={codeLength % 2 === 0 ? codeLength / 2 : undefined}\n              aria-label=\"Verification code\"\n              className=\"justify-start\"\n            />\n          </div>\n        ) : null}\n\n        {signup && !confirmPassword ? (\n          <Input name=\"name\" label=\"Full name\" placeholder=\"Ada Lovelace\" isRequired />\n        ) : null}\n\n        {verify ? null : (\n        <Input\n          name=\"email\"\n          type=\"email\"\n          label=\"Email\"\n          placeholder=\"you@company.com\"\n          autoComplete=\"email\"\n          hint={signup ? \"We use this to contact you, and never share it.\" : undefined}\n          isRequired\n        />\n        )}\n\n        {verify ? null : signup && confirmPassword ? (\n          // Stacked, full width: a password field pair is easier to fill at\n          // full width than in two half-width columns, and it keeps the whole\n          // form on one rhythm.\n          <>\n            <Input\n              name=\"password\"\n              type=\"password\"\n              label=\"Password\"\n              placeholder=\"At least 8 characters\"\n              autoComplete=\"new-password\"\n              isRequired\n            />\n            <Input\n              name=\"confirmPassword\"\n              type=\"password\"\n              label=\"Confirm password\"\n              placeholder=\"Repeat your password\"\n              autoComplete=\"new-password\"\n              isRequired\n            />\n          </>\n        ) : (\n          <Input\n            name=\"password\"\n            type=\"password\"\n            label=\"Password\"\n            placeholder={signup ? \"At least 8 characters\" : \"Enter your password\"}\n            autoComplete={signup ? \"new-password\" : \"current-password\"}\n            isRequired\n          />\n        )}\n\n        {signup || verify ? null : (\n          <div className=\"flex items-center justify-between\">\n            <Checkbox size=\"sm\" isSelected={remember} onChange={setRemember}>\n              Remember me\n            </Checkbox>\n            {onForgotPassword ? <LinkButton onClick={onForgotPassword}>Forgot password?</LinkButton> : <LinkButton href={forgotHref}>Forgot password?</LinkButton>}\n          </div>\n        )}\n\n        <Button type=\"submit\" className=\"w-full\">\n          {copy.cta}\n        </Button>\n\n        {/* The split layout carries its terms line under the card instead,\n            through `footnote`, so it does not crowd the CTA. */}\n        {signup && !footnote ? (\n          <p className=\"text-caption-1-regular text-text-tertiary\">\n            By creating an account you agree to our Terms of Service and Privacy Policy.\n          </p>\n        ) : null}\n      </form>\n\n      {/* Providers always follow the form, in every layout: the email fields\n          are the path this card is built around, and a bank of provider\n          buttons above them buries the thing people came to fill in. The\n          code step shows none — the visitor has already picked a method. */}\n      {!verify && providers.length > 0 ? (\n        <>\n          <div className=\"my-5\">\n            <Divider>or continue with</Divider>\n          </div>\n          {social}\n        </>\n      ) : null}\n\n      {/* Resend is an action, not a destination, so on the code step the\n          footer is a button. `LinkButton` renders one when given no href. */}\n      {verify ? (\n        <p className=\"mt-6 text-center text-body-regular text-text-secondary\">\n          {copy.switchLead}{\" \"}\n          <LinkButton onClick={onResend}>{copy.switchAction}</LinkButton>\n        </p>\n      ) : (\n        <p className=\"mt-6 text-center text-body-regular text-text-secondary\">\n          {copy.switchLead} {onSwitchMode ? <LinkButton onClick={onSwitchMode}>{copy.switchAction}</LinkButton> : <LinkButton href={switchHref}>{copy.switchAction}</LinkButton>}\n        </p>\n      )}\n    </>\n  );\n\n  const card = media ? (\n    <div\n      className={cx(\n        \"grid w-full max-w-[880px] overflow-hidden rounded-3xl border border-border-button-default bg-background-primary-default shadow-xs md:grid-cols-2 dark:bg-background-secondary-default\",\n        className,\n      )}\n    >\n      <div className=\"flex flex-col p-6 sm:p-8\">{body}</div>\n      {/* Hidden rather than stacked below `md`: a tall image above the fields\n          pushes the form off a phone screen for no gain. */}\n      <div className=\"relative hidden bg-background-secondary-default md:block\">{media}</div>\n    </div>\n  ) : (\n    <div\n      className={cx(\n        \"flex w-full max-w-[400px] flex-col rounded-3xl border border-border-button-default bg-background-primary-default p-6 shadow-xs sm:p-8 dark:bg-background-secondary-default\",\n        className,\n      )}\n    >\n      {body}\n    </div>\n  );\n\n  if (!footnote) return localize(card);\n\n  return localize(\n    <div className=\"flex w-full flex-col items-center gap-4\">\n      {card}\n      <p className=\"max-w-[520px] text-center text-caption-1-regular text-text-tertiary\">\n        {footnote}\n      </p>\n    </div>\n  );\n}\n",
  "src/board-native-agents/components/application/auth/auth-media-carousel.tsx": "/* Adapted from the public BoardUI registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport {useMotionPreference} from \"../../../../useMotionPreference.js\";\nimport { useDirection } from \"../../../../board-native/components/foundations/direction/direction\";\nimport { cx } from \"../../../../board-native/utils/cx\";\n\n/**\n * Auto-advancing artwork for the auth card's `media` slot.\n *\n * The transition is a four-beat cycle rather than a plain slide. The image\n * fills the panel edge to edge; when its turn is up it shrinks and rounds off\n * into a card, holds there long enough to read as a deliberate pause, and only\n * then travels left. The next image rides in beside it already card-sized, and\n * grows back out to fill the panel once it has landed. Shrinking first is what\n * makes the movement legible: a full-bleed image sliding under a hard edge\n * reads as a cut, while a card that detaches, moves, and settles reads as one\n * object being replaced by another.\n *\n * The travel happens in depth, not flat across the panel. The panel holds a\n * perspective, and the cards leave and arrive pushed back along Z and turned\n * on their vertical axis, so the outgoing one banks away to the left while the\n * next swings in from the right and squares up as it lands. Both are angled\n * away from the middle, as though they sit on a drum turning past the viewer,\n * which is what gives the movement a front and a back instead of a left and a\n * right.\n *\n * Every slide is placed by where it sits relative to the current one, so the\n * set travels in one direction forever and the wrap back to the first image is\n * just another step left. The cost of that arrangement is that the slide\n * leaving the frame has to jump from the left side to the back of the queue on\n * the right, so transitions are enabled only for the slides actually moving in\n * a given beat; everything else is repositioned with them switched off.\n *\n * Plain `<img>` rather than `next/image`: this file installs into other\n * people's projects, and it should not decide their image pipeline for them.\n * The first slide is eager and the rest lazy, so the card paints immediately\n * without pulling four files at once.\n *\n * It advances on its own and offers no controls. The artwork beside a sign-in\n * form is atmosphere, not content — a visitor is there to get in, and giving\n * them arrows to click is inviting them away from the thing they came to do.\n * Honouring `prefers-reduced-motion` means holding on the first slide.\n */\n\nconst REDUCED_MOTION_QUERY = \"(prefers-reduced-motion: reduce)\";\n\n/** Card state: shrunk to a rounded tile, and the size it rides in at. */\nconst CARD_SCALE = 0.82;\nconst ENTER_SCALE = 0.8;\nconst CARD_RADIUS = 24;\n\n/** How deep the drum is, and how far the cards turn on it. */\nconst PERSPECTIVE = 850;\nconst DEPTH = 220;\nconst TILT = 48;\n\nconst SHRINK_MS = 450;\n/** The deliberate pause once it has become a card, before it moves. */\nconst HOLD_MS = 200;\nconst SLIDE_MS = 700;\nconst GROW_MS = 500;\n\n/**\n * `idle`   at rest, full bleed\n * `shrink` pulling back into a card, then holding\n * `slide`  travelling left while the next one rides in\n * `enter`  the frame where the new slide takes over, before it grows\n */\ntype Phase = \"idle\" | \"shrink\" | \"slide\" | \"enter\";\n\nconst NEXT_PHASE: Record<Phase, Phase> = {\n  idle: \"shrink\",\n  shrink: \"slide\",\n  slide: \"enter\",\n  enter: \"idle\",\n};\n\nexport interface AuthMediaSlide {\n  src: string;\n  /** Decorative by default: the artwork carries no information the form needs. */\n  alt?: string;\n}\n\nexport function AuthMediaCarousel({\n  slides,\n  interval = 3200,\n  className,\n}: {\n  slides: AuthMediaSlide[];\n  /** Milliseconds a slide rests at full bleed, before the transition begins. */\n  interval?: number;\n  className?: string;\n}) {\n  const [index, setIndex] = useState(0);\n  const [phase, setPhase] = useState<Phase>(\"idle\");\n  const inlineSign = useDirection() === \"rtl\" ? -1 : 1;\n  const count = slides.length,reduced=useMotionPreference();\n\n  useEffect(() => {\n    if (count < 2) return;\n    if (reduced!==false){setIndex(0);setPhase(\"idle\");return;}\n\n    // `enter` is only a re-labelling: the outgoing slide is dropped and the\n    // incoming one takes position 0 at the size it was already drawn at, so it\n    // needs a frame to paint before the grow can transition from it.\n    const delay = {\n      idle: interval,\n      shrink: SHRINK_MS + HOLD_MS,\n      slide: SLIDE_MS,\n      enter: 20,\n    }[phase];\n\n    const timer = window.setTimeout(() => {\n      if (phase === \"slide\") setIndex((current) => (current + 1) % count);\n      setPhase(NEXT_PHASE[phase]);\n    }, delay);\n\n    return () => window.clearTimeout(timer);\n  }, [phase, count, interval,reduced]);\n\n  return (\n    <div\n      style={{ perspective: `${PERSPECTIVE}px` }}\n      className={cx(\"absolute inset-0 overflow-hidden\", className)}\n    >\n      {slides.map((slide, slideIndex) => {\n        // 0 is the slide in play, 1 is next in the queue, and everything else\n        // waits off to the right until its turn comes round.\n        const position = (slideIndex - index + count) % count;\n        const current = position === 0;\n        const upNext = position === 1;\n\n        // Where this slide sits on the drum. `arrived` is square to the\n        // viewer but still card-sized: growing is the beat after.\n        const transform = current\n          ? phase === \"slide\"\n            ? `translateX(${-100 * inlineSign}%) translateZ(${-DEPTH}px) rotateY(${-TILT * inlineSign}deg) scale(${CARD_SCALE})`\n            : phase === \"shrink\"\n              ? `scale(${CARD_SCALE})`\n              : phase === \"enter\"\n                ? `scale(${ENTER_SCALE})`\n                : \"scale(1)\"\n          : upNext && phase === \"slide\"\n            ? `scale(${ENTER_SCALE})`\n            : `translateX(${100 * inlineSign}%) translateZ(${-DEPTH}px) rotateY(${TILT * inlineSign}deg) scale(${ENTER_SCALE})`;\n\n        // Only the slides in motion this beat may transition. The rest are\n        // being repositioned, and a transition would streak them across.\n        const moving = current || (upNext && phase === \"slide\");\n\n        return (\n          // Deliberate: this file installs into other projects and should not\n          // require next/image. Swap it for your own loader if you have one.\n          // eslint-disable-next-line @next/next/no-img-element\n          <img\n            key={slide.src}\n            src={slide.src}\n            alt={slide.alt ?? \"\"}\n            aria-hidden={slide.alt ? undefined : true}\n            loading={slideIndex === 0 ? \"eager\" : \"lazy\"}\n            style={{\n              transform,\n              borderRadius: current && phase === \"idle\" ? 0 : CARD_RADIUS,\n              transitionDuration:\n                phase === \"slide\" ? `${SLIDE_MS}ms` : phase === \"shrink\" ? `${SHRINK_MS}ms` : `${GROW_MS}ms`,\n            }}\n            className={cx(\n              \"absolute inset-0 size-full object-cover\",\n              moving && phase !== \"enter\"\n                ? \"transition-[transform,border-radius] ease-in-out\"\n                : \"transition-none\",\n            )}\n          />\n        );\n      })}\n\n      {slides.length > 1 ? (\n        <div className=\"absolute inset-x-0 bottom-4 flex justify-center gap-1.5\">\n          {slides.map((slide, slideIndex) => (\n            <span\n              key={slide.src}\n              aria-hidden\n              className={cx(\n                \"h-1.5 rounded-full bg-white transition-all duration-500 ease-out\",\n                slideIndex === index ? \"w-5 opacity-90\" : \"w-1.5 opacity-45\",\n              )}\n            />\n          ))}\n        </div>\n      ) : null}\n    </div>\n  );\n}\n",
  "src/board-native-agents/components/application/composer-loader/composer-loader.tsx": "/* Adapted from the public BoardUI registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { useTemplateCopy } from \"../../../../board-native/components/foundations/template-copy/template-copy\";\n\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport type { CSSProperties, ReactNode } from \"react\";\nimport { cx } from \"../../../../board-native/utils/cx\";\n\n/**\n * Composer Loader — a loading state that wraps a chat composer while the agent\n * works: an iridescent light band orbiting the pill's rim with a soft bloom\n * bleeding inward.\n *\n * The band is dash segments on an SVG stroke of the pill shape\n * (pathLength-normalized, so it travels at constant speed and bends around\n * the end caps), drawn at three scales — crisp line, tight glow, wide bloom —\n * with the sharp line leading and every soft layer's head pulled back behind\n * the tip.\n *\n * The component paints the pill surface itself and layers the light above\n * it, so the wrapped composer must not paint its own background:\n *\n *   <ComposerLoader active={isWaitingForReply}>\n *     <Composer className=\"bg-transparent shadow-none\" />\n *   </ComposerLoader>\n *\n * `active` fades the whole effect in and out (450ms), so toggling it on\n * send / reply reads as the composer lighting up rather than snapping.\n */\n\nexport interface ComposerLoaderProps {\n  children: ReactNode;\n  /** Show the light. Fades in/out — flip it while awaiting a response. */\n  active?: boolean;\n  /** Four gradient colors, spread across the pill left → right. */\n  colors?: [string, string, string, string];\n  /** Seconds per full lap. */\n  speed?: number;\n  /** Overall light opacity. */\n  intensity?: number;\n  /** How far the bloom bleeds inward from the rim, px. */\n  bloom?: number;\n  /** Bloom layer opacity. */\n  bloomStrength?: number;\n  /** How much of the perimeter the band occupies, degrees (of 360). */\n  arc?: number;\n  /** Reverse the travel direction. */\n  reverse?: boolean;\n  /** Corner radius, px. Defaults to a full pill. */\n  radius?: number;\n  /** Width of the crisp line, px; the tight glow scales with it. */\n  line?: number;\n  /** Draw the wide bloom alone, no line or tight glow: a soft wash for a beam to lead. */\n  bloomOnly?: boolean;\n  /** Paint the pill surface behind the light (on by default). */\n  surface?: boolean;\n  /**\n   * Fade the band's two ends instead of cutting them, 0–1: the fraction of\n   * the band's length that ramps. Each layer is stacked as shorter, centred\n   * copies at a fraction of its opacity; the blur melts the steps together.\n   */\n  taper?: number;\n  /** How the light composites over what's beneath, e.g. `screen` to read as light on a surface. */\n  blend?: CSSProperties[\"mixBlendMode\"];\n  /**\n   * Moves the band forward along the lap, as a fraction of the perimeter\n   * (0–1). Lets two loaders on one pill line up: a short beam with\n   * `offset` equal to the difference of the two arcs (as fractions) leads\n   * a wider glow tip to tip.\n   */\n  offset?: number;\n  className?: string;\n}\n\nconst DEFAULT_COLORS: [string, string, string, string] = [\n  \"#5eead4\",\n  \"#46baec\",\n  \"#e633a4\",\n  \"#00faa7\",\n];\n\nfunction hexTriplet(hex: string) {\n  return [\n    parseInt(hex.slice(1, 3), 16),\n    parseInt(hex.slice(3, 5), 16),\n    parseInt(hex.slice(5, 7), 16),\n  ];\n}\n\nexport function ComposerLoader({\n  children,\n  active = true,\n  colors = DEFAULT_COLORS,\n  speed = 4.5,\n  intensity = 0.7,\n  bloom = 16,\n  bloomStrength = 0.3,\n  arc = 120,\n  reverse = false,\n  radius,\n  line = 2.5,\n  bloomOnly = false,\n  surface = true,\n  taper = 0,\n  blend,\n  offset = 0,\n  className,\n}: ComposerLoaderProps) {\n  const localize = useTemplateCopy();\n  const gradientId = `bui-cl-${useId().replace(/[^a-zA-Z0-9]/g, \"\")}`;\n  const clipRef = useRef<HTMLSpanElement>(null);\n  const [box, setBox] = useState({ w: 640, h: 52 });\n\n  useEffect(() => {\n    const el = clipRef.current;\n    if (!el) return;\n    const observer = new ResizeObserver(() =>\n      setBox({ w: Math.max(1, el.clientWidth), h: Math.max(1, el.clientHeight) }),\n    );\n    observer.observe(el);\n    return () => observer.disconnect();\n  }, []);\n\n  const [c0, c1, c2, c3] = colors;\n  // Gradient center: pure blend of the middle colors, so the band never\n  // washes out to white.\n  const mid = `rgb(${hexTriplet(c1)\n    .map((v, i) => Math.round((v + hexTriplet(c2)[i]) / 2))\n    .join(\",\")})`;\n\n  const band = (arc / 360) * 100;\n  const rx = radius ?? box.h / 2;\n  const cornerRadius = radius ?? 9999;\n  const direction = reverse ? \"reverse\" : \"normal\";\n\n  // Path units per px, for pulling each soft layer's head behind the tip.\n  // Rounded-rect perimeter: straight runs plus the four corner arcs (for the\n  // default pill, rx = h/2 and this reduces to 2(w−h) + πh).\n  const cornerR = Math.min(rx, box.w / 2, box.h / 2);\n  const perimeter = Math.max(1, 2 * (box.w + box.h) - 8 * cornerR + 2 * Math.PI * cornerR);\n  const pxUnits = (px: number) => (px * 100) / perimeter;\n  // A layer's delay is its phase: the larger the phase, the further BACK\n  // along the lap the band sits (a negative delay is a head start). So\n  // moving a band forward, `offset` included, means subtracting.\n  const dashPhase = (len: number, backPx: number) =>\n    (reverse ? pxUnits(backPx) : len - band + pxUnits(backPx)) - offset * 100;\n\n  // Tapering stacks each layer as shorter, centred copies: the ramp at each\n  // end is a staircase with one step per copy, so it takes many copies and\n  // a little blur on the crisp line for the steps to melt into a gradient.\n  const TAPER_STEPS = 14;\n  const CRISP_BLUR = taper > 0 ? Math.max(0.5, line * 0.8) : 0.5;\n  const stroke = (width: number, blur: number, opacity: number, dashLen: number, backPx: number) => {\n    const copies = taper > 0 ? TAPER_STEPS : 1;\n    return Array.from({ length: copies }, (_, index) => {\n      // Copy 0 is the full band; each next one is shorter and moved forward\n      // by half the difference, so all of them share one midpoint and the\n      // ends thin out step by step.\n      const len = dashLen * (1 - (taper * index) / copies);\n      const phase = dashPhase(dashLen, backPx) - (dashLen - len) / 2;\n      return (\n        <rect\n          key={index}\n          x={0}\n          y={0}\n          width={box.w}\n          height={box.h}\n          rx={rx}\n          pathLength={100}\n          fill=\"none\"\n          stroke={`url(#${gradientId})`}\n          strokeWidth={width}\n          strokeLinecap=\"round\"\n          strokeDasharray={`${len} ${100 - len}`}\n          className=\"bui-composer-loader-rect\"\n          // SVG-native blur, not CSS filter: WebKit (iOS Safari and every iPhone\n          // browser) ignores CSS filters on individual SVG elements, which\n          // rendered the whole light razor-sharp on phones.\n          filter={blur > 0 ? `url(#${gradientId}-b${String(blur).replace(\".\", \"_\")})` : undefined}\n          style={{\n            opacity: opacity / copies,\n            animation: `bui-composer-loader-dash ${speed}s linear ${(phase * speed) / 100}s infinite ${direction}`,\n          }}\n        />\n      );\n    });\n  };\n\n  /** One feGaussianBlur per blur radius the layers use. The region is\n   *  widened well past the stroke so the blur never clips at the filter\n   *  bounds. */\n  const blurFilter = (radius: number) => (\n    <filter\n      key={radius}\n      id={`${gradientId}-b${String(radius).replace(\".\", \"_\")}`}\n      x=\"-50%\"\n      y=\"-50%\"\n      width=\"200%\"\n      height=\"200%\"\n    >\n      <feGaussianBlur stdDeviation={radius} />\n    </filter>\n  );\n\n  return localize((\n    <div className={cx(\"relative\", className)}>\n      {surface && (\n        <span\n          aria-hidden\n          className=\"absolute inset-0 bg-background-primary-default shadow-xs\"\n          style={{ borderRadius: cornerRadius }}\n        />\n      )}\n\n      <span\n        ref={clipRef}\n        aria-hidden\n        className=\"pointer-events-none absolute inset-0 overflow-hidden\"\n        style={{\n          borderRadius: cornerRadius,\n          opacity: active ? 1 : 0,\n          transition: \"opacity 450ms ease\",\n          mixBlendMode: blend,\n        }}\n      >\n        <svg\n          width=\"100%\"\n          height=\"100%\"\n          viewBox={`0 0 ${box.w} ${box.h}`}\n          preserveAspectRatio=\"none\"\n          style={{ opacity: intensity }}\n        >\n          <defs>\n            <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n              <stop offset=\"0%\" stopColor={c0} />\n              <stop offset=\"30%\" stopColor={c1} />\n              <stop offset=\"50%\" stopColor={mid} />\n              <stop offset=\"70%\" stopColor={c2} />\n              <stop offset=\"100%\" stopColor={c3} />\n            </linearGradient>\n            {[14, 6, CRISP_BLUR].map(blurFilter)}\n          </defs>\n          {/* wide bloom bleeding inward (outer half clipped by the pill) */}\n          {bloom > 0 && stroke(bloom * 2, 14, bloomStrength, band * 0.9, bloom + 16)}\n          {/* tight glow */}\n          {!bloomOnly && stroke(line * 3.2, 6, 0.8, band * 0.95, 10)}\n          {/* crisp refraction line, tip leading */}\n          {!bloomOnly && stroke(line, CRISP_BLUR, 1, band, 0)}\n        </svg>\n      </span>\n\n      <div className=\"relative\">{children}</div>\n    </div>\n  ));\n}\n",
  "src/board-native-agents/components/application/notification-center/notification-center.tsx": "/* Adapted from the public BoardUI registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { useTemplateCopy } from \"../../../../board-native/components/foundations/template-copy/template-copy\";\n\nimport type { ComponentType, HTMLAttributes, Ref } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport {\n  RiCheckboxCircleFill,\n  RiErrorWarningFill,\n  RiInformationFill,\n  RiNotification3Fill,\n  RiNotificationOffLine,\n} from \"@remixicon/react\";\nimport { Avatar, type AvatarProps } from \"../../../../board-native/components/base/avatar/avatar\";\nimport { Button, type ButtonProps } from \"../../../../board-native/components/base/buttons/button\";\nimport {\n  SegmentedControl,\n  SegmentedControlItem,\n} from \"../../../../board-native/components/base/segmented-control/segmented-control\";\nimport { cx, sortCx } from \"../../../../board-native/utils/cx\";\n\nexport type NotificationCenterTab = \"all\" | \"mentions\" | \"system\";\nexport type NotificationCenterCategory = Exclude<NotificationCenterTab, \"all\"> | \"activity\";\nexport type NotificationCenterStatus = \"neutral\" | \"information\" | \"success\" | \"error\";\n\ntype IconComponent = ComponentType<{\n  className?: string;\n  \"aria-hidden\"?: boolean | \"true\" | \"false\";\n}>;\n\nexport type NotificationCenterAction = {\n  id: string;\n  label: string;\n  variant?: ButtonProps[\"variant\"];\n};\n\nexport type NotificationCenterItem = {\n  id: string;\n  category: NotificationCenterCategory;\n  group: string;\n  title: string;\n  description: string;\n  timestamp: string;\n  unread?: boolean;\n  status?: NotificationCenterStatus;\n  icon?: IconComponent;\n  avatar?: Pick<AvatarProps, \"src\" | \"alt\" | \"initials\" | \"color\">;\n  actions?: NotificationCenterAction[];\n};\n\nexport interface NotificationCenterProps\n  extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n  notifications: NotificationCenterItem[];\n  defaultTab?: NotificationCenterTab;\n  tab?: NotificationCenterTab;\n  onTabChange?: (tab: NotificationCenterTab) => void;\n  onAction?: (notificationId: string, actionId: string) => void;\n  title?: string;\n  emptyMessage?: string;\n  ref?: Ref<HTMLDivElement>;\n}\n\nconst STATUS_ICON: Record<NotificationCenterStatus, IconComponent> = {\n  neutral: RiNotification3Fill,\n  information: RiInformationFill,\n  success: RiCheckboxCircleFill,\n  error: RiErrorWarningFill,\n};\n\nconst styles = sortCx({\n  status: {\n    neutral: \"bg-background-tertiary-default text-text-secondary\",\n    information:\n      \"bg-notification-information-background text-notification-information-foreground\",\n    success: \"bg-notification-success-background text-notification-success-foreground\",\n    error: \"bg-notification-error-background text-notification-error-foreground\",\n  },\n});\n\nconst TABS: { id: NotificationCenterTab; label: string }[] = [\n  { id: \"all\", label: \"All\" },\n  { id: \"mentions\", label: \"Mentions\" },\n  { id: \"system\", label: \"System\" },\n];\n\nfunction NotificationVisual({ item }: { item: NotificationCenterItem }) {\n  const localize = useTemplateCopy();\n  if (item.avatar) {\n    return localize(<Avatar {...item.avatar} size=\"lg\" className=\"size-10\" />);\n  }\n\n  const status = item.status ?? \"neutral\";\n  const Icon = item.icon ?? STATUS_ICON[status];\n\n  return localize((\n    <span\n      className={cx(\n        \"flex size-10 shrink-0 items-center justify-center rounded-full\",\n        styles.status[status],\n      )}\n    >\n      <Icon className=\"size-5\" aria-hidden />\n    </span>\n  ));\n}\n\nfunction TabLabel({\n  label,\n  count,\n}: {\n  label: string;\n  count: number;\n}) {\n  const localize = useTemplateCopy();\n  return localize((\n    <span className=\"inline-flex items-center gap-1.5\">\n      {label}\n      <span className=\"inline-flex min-w-5 items-center justify-center rounded-sm bg-badge-neutral-background px-1 py-px text-caption-1-medium text-text-secondary\">\n        {count}\n      </span>\n    </span>\n  ));\n}\n\nexport function NotificationCenter({\n  notifications,\n  defaultTab = \"all\",\n  tab,\n  onTabChange,\n  onAction,\n  title = \"Notifications\",\n  emptyMessage = \"You’re all caught up.\",\n  className,\n  ref,\n  ...props\n}: NotificationCenterProps) {\n  const localize = useTemplateCopy();\n  const [internalTab, setInternalTab] = useState<NotificationCenterTab>(defaultTab);\n  const [readIds, setReadIds] = useState<Set<string>>(() => new Set());\n  const activeTab = tab ?? internalTab;\n\n  const setTab = (nextTab: NotificationCenterTab) => {\n    if (tab === undefined) setInternalTab(nextTab);\n    onTabChange?.(nextTab);\n  };\n\n  const isUnread = (item: NotificationCenterItem) => item.unread === true && !readIds.has(item.id);\n  const unreadCount = notifications.filter(isUnread).length;\n\n  const tabCounts = useMemo(\n    () => ({\n      all: notifications.length,\n      mentions: notifications.filter((item) => item.category === \"mentions\").length,\n      system: notifications.filter((item) => item.category === \"system\").length,\n    }),\n    [notifications],\n  );\n\n  const visibleNotifications = useMemo(\n    () =>\n      activeTab === \"all\"\n        ? notifications\n        : notifications.filter((item) => item.category === activeTab),\n    [activeTab, notifications],\n  );\n\n  const markAllRead = () => {\n    setReadIds(new Set(notifications.filter((item) => item.unread).map((item) => item.id)));\n  };\n\n  return localize((\n    <section\n      ref={ref}\n      aria-label={title}\n      data-notification-center=\"\"\n      className={cx(\n        \"flex w-full max-w-[430px] flex-col overflow-hidden rounded-3xl border border-border-button-default bg-notification-center-background shadow-dropdown\",\n        className,\n      )}\n      {...props}\n    >\n      <div className=\"flex flex-col gap-3 p-4 pb-1.5\">\n        <div className=\"flex items-start justify-between gap-4\">\n          <div className=\"flex min-w-0 flex-col gap-0.5\">\n            <h2 className=\"text-title-3-medium text-text-primary\">{title}</h2>\n            <p className=\"text-body-regular text-text-secondary\">\n              {unreadCount === 0 ? \"No unread notifications\" : `${unreadCount} unread`}\n            </p>\n          </div>\n          <Button\n            variant=\"ghost\"\n            size=\"small\"\n            onClick={markAllRead}\n            disabled={unreadCount === 0}\n          >\n            Mark all read\n          </Button>\n        </div>\n\n        <SegmentedControl\n          aria-label=\"Notification category\"\n          selectedKeys={[activeTab]}\n          onSelectionChange={(keys) => {\n            const next = [...(keys as Set<string>)][0] as NotificationCenterTab | undefined;\n            if (next) setTab(next);\n          }}\n          className=\"flex w-full\"\n        >\n          {TABS.map(({ id, label }) => (\n            <SegmentedControlItem\n              key={id}\n              id={id}\n              className=\"flex-1\"\n            >\n              <TabLabel label={label} count={tabCounts[id]} />\n            </SegmentedControlItem>\n          ))}\n        </SegmentedControl>\n      </div>\n\n      <div className=\"bg-notification-center-background p-1.5\">\n        <div className=\"overflow-hidden rounded-2xl bg-background-secondary-default\">\n          <div className=\"max-h-[516px] overflow-y-auto overscroll-contain bg-background-secondary-default p-2\">\n            {visibleNotifications.length === 0 ? (\n              <div className=\"flex min-h-64 flex-col items-center justify-center gap-2 rounded-2xl bg-background-primary-default px-6 text-center\">\n                <span className=\"flex size-11 items-center justify-center rounded-full bg-background-secondary-default text-foreground-icon-secondary\">\n                  <RiNotificationOffLine className=\"size-5\" aria-hidden />\n                </span>\n                <p className=\"text-body-medium text-text-primary\">{emptyMessage}</p>\n                <p className=\"max-w-64 text-body-regular text-text-secondary\">\n                  New activity will appear here when it arrives.\n                </p>\n              </div>\n            ) : (\n              <div className=\"flex flex-col gap-2\">\n                {visibleNotifications.map((item) => {\n                  const unread = isUnread(item);\n                  return (\n                    <article\n                      key={item.id}\n                      className=\"group/item relative flex gap-3 rounded-notification-card bg-background-primary-default px-3 py-3\"\n                    >\n                      <NotificationVisual item={item} />\n                      <div className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n                        <div className=\"flex min-w-0 items-start justify-between gap-3\">\n                          <p className=\"min-w-0 text-body-medium text-text-primary\">{item.title}</p>\n                          <div className=\"flex shrink-0 items-center gap-2\">\n                            <span className=\"text-caption-1-medium whitespace-nowrap text-text-tertiary\">\n                              {item.timestamp}\n                            </span>\n                            {unread ? (\n                              <span\n                                className=\"size-2 rounded-full bg-accent-500\"\n                                role=\"img\" aria-label=\"Unread\"\n                              />\n                            ) : null}\n                          </div>\n                        </div>\n                        <p className=\"text-body-regular text-text-secondary\">{item.description}</p>\n                        {item.actions?.length ? (\n                          <div className=\"mt-1.5 flex flex-wrap items-center gap-2\">\n                            {item.actions.map((action) => (\n                              <Button\n                                key={action.id}\n                                size=\"small\"\n                                variant={action.variant ?? \"secondary\"}\n                                onClick={() => {\n                                  setReadIds((current) => new Set(current).add(item.id));\n                                  onAction?.(item.id, action.id);\n                                }}\n                              >\n                                {action.label}\n                              </Button>\n                            ))}\n                          </div>\n                        ) : null}\n                      </div>\n                    </article>\n                  );\n                })}\n              </div>\n            )}\n          </div>\n        </div>\n      </div>\n    </section>\n  ));\n}\n",
  "src/board-native-agents/creator-artwork.json": "{\n  \"source\": \"https://www.boardui.com/components/agent-creator\",\n  \"scope\": \"Public rendered avatar illustration canvases only; no widget, text, controls or Pro source captured.\",\n  \"baseColor\": \"#f8b193\",\n  \"main\": {\n    \"petal-neutral\": \"petal-neutral.webp\",\n    \"petal-happy\": \"petal-happy.webp\",\n    \"petal-angry\": \"petal-angry.webp\",\n    \"petal-thinking\": \"petal-thinking.webp\",\n    \"petal-shook\": \"petal-shook.webp\",\n    \"petal-curious\": \"petal-curious.webp\",\n    \"petal-wink\": \"petal-wink.webp\",\n    \"petal-sleepy\": \"petal-sleepy.webp\",\n    \"petal-sad\": \"petal-sad.webp\",\n    \"petal-worried\": \"petal-worried.webp\",\n    \"petal-skeptical\": \"petal-skeptical.webp\",\n    \"petal-focused\": \"petal-focused.webp\",\n    \"petal-excited\": \"petal-excited.webp\",\n    \"petal-calm\": \"petal-calm.webp\",\n    \"petal-shy\": \"petal-shy.webp\",\n    \"petal-confused\": \"petal-confused.webp\",\n    \"flower-neutral\": \"flower-neutral.webp\",\n    \"flower-happy\": \"flower-happy.webp\",\n    \"flower-angry\": \"flower-angry.webp\",\n    \"flower-thinking\": \"flower-thinking.webp\",\n    \"flower-shook\": \"flower-shook.webp\",\n    \"flower-curious\": \"flower-curious.webp\",\n    \"flower-wink\": \"flower-wink.webp\",\n    \"flower-sleepy\": \"flower-sleepy.webp\",\n    \"flower-sad\": \"flower-sad.webp\",\n    \"flower-worried\": \"flower-worried.webp\",\n    \"flower-skeptical\": \"flower-skeptical.webp\",\n    \"flower-focused\": \"flower-focused.webp\",\n    \"flower-excited\": \"flower-excited.webp\",\n    \"flower-calm\": \"flower-calm.webp\",\n    \"flower-shy\": \"flower-shy.webp\",\n    \"flower-confused\": \"flower-confused.webp\",\n    \"star-neutral\": \"star-neutral.webp\",\n    \"star-happy\": \"star-happy.webp\",\n    \"star-angry\": \"star-angry.webp\",\n    \"star-thinking\": \"star-thinking.webp\",\n    \"star-shook\": \"star-shook.webp\",\n    \"star-curious\": \"star-curious.webp\",\n    \"star-wink\": \"star-wink.webp\",\n    \"star-sleepy\": \"star-sleepy.webp\",\n    \"star-sad\": \"star-sad.webp\",\n    \"star-worried\": \"star-worried.webp\",\n    \"star-skeptical\": \"star-skeptical.webp\",\n    \"star-focused\": \"star-focused.webp\",\n    \"star-excited\": \"star-excited.webp\",\n    \"star-calm\": \"star-calm.webp\",\n    \"star-shy\": \"star-shy.webp\",\n    \"star-confused\": \"star-confused.webp\",\n    \"heart-neutral\": \"heart-neutral.webp\",\n    \"heart-happy\": \"heart-happy.webp\",\n    \"heart-angry\": \"heart-angry.webp\",\n    \"heart-thinking\": \"heart-thinking.webp\",\n    \"heart-shook\": \"heart-shook.webp\",\n    \"heart-curious\": \"heart-curious.webp\",\n    \"heart-wink\": \"heart-wink.webp\",\n    \"heart-sleepy\": \"heart-sleepy.webp\",\n    \"heart-sad\": \"heart-sad.webp\",\n    \"heart-worried\": \"heart-worried.webp\",\n    \"heart-skeptical\": \"heart-skeptical.webp\",\n    \"heart-focused\": \"heart-focused.webp\",\n    \"heart-excited\": \"heart-excited.webp\",\n    \"heart-calm\": \"heart-calm.webp\",\n    \"heart-shy\": \"heart-shy.webp\",\n    \"heart-confused\": \"heart-confused.webp\",\n    \"cloud-neutral\": \"cloud-neutral.webp\",\n    \"cloud-happy\": \"cloud-happy.webp\",\n    \"cloud-angry\": \"cloud-angry.webp\",\n    \"cloud-thinking\": \"cloud-thinking.webp\",\n    \"cloud-shook\": \"cloud-shook.webp\",\n    \"cloud-curious\": \"cloud-curious.webp\",\n    \"cloud-wink\": \"cloud-wink.webp\",\n    \"cloud-sleepy\": \"cloud-sleepy.webp\",\n    \"cloud-sad\": \"cloud-sad.webp\",\n    \"cloud-worried\": \"cloud-worried.webp\",\n    \"cloud-skeptical\": \"cloud-skeptical.webp\",\n    \"cloud-focused\": \"cloud-focused.webp\",\n    \"cloud-excited\": \"cloud-excited.webp\",\n    \"cloud-calm\": \"cloud-calm.webp\",\n    \"cloud-shy\": \"cloud-shy.webp\",\n    \"cloud-confused\": \"cloud-confused.webp\",\n    \"diamond-neutral\": \"diamond-neutral.webp\",\n    \"diamond-happy\": \"diamond-happy.webp\",\n    \"diamond-angry\": \"diamond-angry.webp\",\n    \"diamond-thinking\": \"diamond-thinking.webp\",\n    \"diamond-shook\": \"diamond-shook.webp\",\n    \"diamond-curious\": \"diamond-curious.webp\",\n    \"diamond-wink\": \"diamond-wink.webp\",\n    \"diamond-sleepy\": \"diamond-sleepy.webp\",\n    \"diamond-sad\": \"diamond-sad.webp\",\n    \"diamond-worried\": \"diamond-worried.webp\",\n    \"diamond-skeptical\": \"diamond-skeptical.webp\",\n    \"diamond-focused\": \"diamond-focused.webp\",\n    \"diamond-excited\": \"diamond-excited.webp\",\n    \"diamond-calm\": \"diamond-calm.webp\",\n    \"diamond-shy\": \"diamond-shy.webp\",\n    \"diamond-confused\": \"diamond-confused.webp\",\n    \"shield-neutral\": \"shield-neutral.webp\",\n    \"shield-happy\": \"shield-happy.webp\",\n    \"shield-angry\": \"shield-angry.webp\",\n    \"shield-thinking\": \"shield-thinking.webp\",\n    \"shield-shook\": \"shield-shook.webp\",\n    \"shield-curious\": \"shield-curious.webp\",\n    \"shield-wink\": \"shield-wink.webp\",\n    \"shield-sleepy\": \"shield-sleepy.webp\",\n    \"shield-sad\": \"shield-sad.webp\",\n    \"shield-worried\": \"shield-worried.webp\",\n    \"shield-skeptical\": \"shield-skeptical.webp\",\n    \"shield-focused\": \"shield-focused.webp\",\n    \"shield-excited\": \"shield-excited.webp\",\n    \"shield-calm\": \"shield-calm.webp\",\n    \"shield-shy\": \"shield-shy.webp\",\n    \"shield-confused\": \"shield-confused.webp\",\n    \"slender-neutral\": \"slender-neutral.webp\",\n    \"slender-happy\": \"slender-happy.webp\",\n    \"slender-angry\": \"slender-angry.webp\",\n    \"slender-thinking\": \"slender-thinking.webp\",\n    \"slender-shook\": \"slender-shook.webp\",\n    \"slender-curious\": \"slender-curious.webp\",\n    \"slender-wink\": \"slender-wink.webp\",\n    \"slender-sleepy\": \"slender-sleepy.webp\",\n    \"slender-sad\": \"slender-sad.webp\",\n    \"slender-worried\": \"slender-worried.webp\",\n    \"slender-skeptical\": \"slender-skeptical.webp\",\n    \"slender-focused\": \"slender-focused.webp\",\n    \"slender-excited\": \"slender-excited.webp\",\n    \"slender-calm\": \"slender-calm.webp\",\n    \"slender-shy\": \"slender-shy.webp\",\n    \"slender-confused\": \"slender-confused.webp\",\n    \"pocket-neutral\": \"pocket-neutral.webp\",\n    \"pocket-happy\": \"pocket-happy.webp\",\n    \"pocket-angry\": \"pocket-angry.webp\",\n    \"pocket-thinking\": \"pocket-thinking.webp\",\n    \"pocket-shook\": \"pocket-shook.webp\",\n    \"pocket-curious\": \"pocket-curious.webp\",\n    \"pocket-wink\": \"pocket-wink.webp\",\n    \"pocket-sleepy\": \"pocket-sleepy.webp\",\n    \"pocket-sad\": \"pocket-sad.webp\",\n    \"pocket-worried\": \"pocket-worried.webp\",\n    \"pocket-skeptical\": \"pocket-skeptical.webp\",\n    \"pocket-focused\": \"pocket-focused.webp\",\n    \"pocket-excited\": \"pocket-excited.webp\",\n    \"pocket-calm\": \"pocket-calm.webp\",\n    \"pocket-shy\": \"pocket-shy.webp\",\n    \"pocket-confused\": \"pocket-confused.webp\"\n  },\n  \"expressions\": {\n    \"neutral\": \"neutral-expression.webp\",\n    \"happy\": \"happy-expression.webp\",\n    \"angry\": \"angry-expression.webp\",\n    \"thinking\": \"thinking-expression.webp\",\n    \"shook\": \"shook-expression.webp\",\n    \"curious\": \"curious-expression.webp\",\n    \"wink\": \"wink-expression.webp\",\n    \"sleepy\": \"sleepy-expression.webp\",\n    \"sad\": \"sad-expression.webp\",\n    \"worried\": \"worried-expression.webp\",\n    \"skeptical\": \"skeptical-expression.webp\",\n    \"focused\": \"focused-expression.webp\",\n    \"excited\": \"excited-expression.webp\",\n    \"calm\": \"calm-expression.webp\",\n    \"shy\": \"shy-expression.webp\",\n    \"confused\": \"confused-expression.webp\"\n  },\n  \"shapes\": {\n    \"petal\": \"petal-shape.webp\",\n    \"flower\": \"flower-shape.webp\",\n    \"star\": \"star-shape.webp\",\n    \"heart\": \"heart-shape.webp\",\n    \"cloud\": \"cloud-shape.webp\",\n    \"diamond\": \"diamond-shape.webp\",\n    \"shield\": \"shield-shape.webp\",\n    \"slender\": \"slender-shape.webp\",\n    \"pocket\": \"pocket-shape.webp\"\n  },\n  \"files\": [\n    {\n      \"name\": \"petal-neutral.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"d8b16b46aa3b71a497a4da88f6aaaace9ef0f6022a5d2cb1f8dbce95e7c6d0de\"\n    },\n    {\n      \"name\": \"petal-happy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"d35a261ce13513d80a21e9f11be6a845ede06cb500f9bd29c0f9e26dfde7ec1d\"\n    },\n    {\n      \"name\": \"petal-angry.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"7adf78634625ab40751a9e6258d2755d8d2a84ddaeaacb802836074fe9dc6895\"\n    },\n    {\n      \"name\": \"petal-thinking.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"b4eac720e551228b6ed4febac6dd277193fe8907f95c56938a322d6d44c8f744\"\n    },\n    {\n      \"name\": \"petal-shook.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"1283f0ee5d51f092d9a0d6cebb17dbbab02b24cb8b14c99277e5d462bafc7a62\"\n    },\n    {\n      \"name\": \"petal-curious.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"01eade10cabd446f701f23b0710f4b25407dae554c63cdc5d26d071e74bda404\"\n    },\n    {\n      \"name\": \"petal-wink.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"50051d394cad4dc47d3a6c698058fec823a214df07804e6e7e6ae7527e1f74f1\"\n    },\n    {\n      \"name\": \"petal-sleepy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"46b5396b4c16c4643c1d271df7adac94773c32b44470facd7fcc1d9c05d43520\"\n    },\n    {\n      \"name\": \"petal-sad.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"cc5070ebcb58a97dfdcbfb6ae9f49467cfa55682c5d1c4f124a8748a27e71d01\"\n    },\n    {\n      \"name\": \"petal-worried.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"1395fa6efdaa3fac68e2a5c5b59e40b8ad597c3a6bb309220b07a354fbad16e0\"\n    },\n    {\n      \"name\": \"petal-skeptical.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"4f8f22a59b3dd1a71c3b448f58dbdc205cfbbb3e2d7afabef35b4d63f52fb113\"\n    },\n    {\n      \"name\": \"petal-focused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"ce0fd29eecfa6ab5fc6b96dcbd6343f82b3d0aa0e3a8746a2fec048a526d767e\"\n    },\n    {\n      \"name\": \"petal-excited.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"3d3d001e9449fbb343d508dc9413211661fa756857b0773987ab492b2f1250d2\"\n    },\n    {\n      \"name\": \"petal-calm.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"f0996ed561b148c6b06d1612e5098502a8ae44eb8f875a288d8a1564faffc8b3\"\n    },\n    {\n      \"name\": \"petal-shy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"ffa84eb2d8258884862644a6865577c02b124a4b0e2213ed500c4f46af7e2fd4\"\n    },\n    {\n      \"name\": \"petal-confused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"a6b8e566d44e7e588df756d58f7cb3e935cfb10123239568f5e77890ca7ba203\"\n    },\n    {\n      \"name\": \"flower-neutral.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"8c17ee876d405680870dbf32589720177b7214f138291ce796b8bb7cbf430833\"\n    },\n    {\n      \"name\": \"flower-happy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"c85b8ad920c1c85636e6006a06a39e24e79bda59fd0085d0b2fabc69b77b6a83\"\n    },\n    {\n      \"name\": \"flower-angry.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"86e96abea5458fba9e4fb4c997bfa167ef59513ab5ee8f1be0c09202f98b9888\"\n    },\n    {\n      \"name\": \"flower-thinking.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"7f50e0d7d35ab48ae21789efeffb5529b1b6c49ca54e4c4595a1463efcc7c464\"\n    },\n    {\n      \"name\": \"flower-shook.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"56bf8438f8a5cd84f34bf3206898042399589b2196c64724be2e505fda704849\"\n    },\n    {\n      \"name\": \"flower-curious.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"5cfb90abc292f051a9049ba2d599085d78c09b608d422a6a8fa9b5bb2d5cf29a\"\n    },\n    {\n      \"name\": \"flower-wink.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"ab0b7fae2ce7b83057b772ec0e7ca9d8e9083dd2a05a884b5e780f69472b2421\"\n    },\n    {\n      \"name\": \"flower-sleepy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"19ff8c9836c111922982b65bd3dcea67bc55c11a753f59ee37b95700a95029df\"\n    },\n    {\n      \"name\": \"flower-sad.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"c18e53eb07af8d8c9e77a539e1413b70a66f03efba6e1beef186f53bbc01d142\"\n    },\n    {\n      \"name\": \"flower-worried.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"88c058aa30e20131a9523ec4d4103f3c75ce2e2d340d45db72d81ec87de56294\"\n    },\n    {\n      \"name\": \"flower-skeptical.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"84bab52c98e02955da2a0f77cba7240de0f3844bd847f8309d18d4bc05da87fd\"\n    },\n    {\n      \"name\": \"flower-focused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"6c45d449853b92ac4668d570df6303f02caba5b404841974f42826864c3fc1fa\"\n    },\n    {\n      \"name\": \"flower-excited.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"c0ab08329902f5d3fb0d57e6e1a5b7b9b4cd6305ca6398863d90af232016a5da\"\n    },\n    {\n      \"name\": \"flower-calm.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"66780e10646028922dbde998f9c798e9b47d47362b60e74e096d48f3c5d3e2f3\"\n    },\n    {\n      \"name\": \"flower-shy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"50ae0812c514d471c48ad51c0db1969ced6ac293203d911b0e227916742c192f\"\n    },\n    {\n      \"name\": \"flower-confused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"bfc480ff197553c765a30c5d7cc1c53bee0645fe16f7c3288ab61d8077b603f1\"\n    },\n    {\n      \"name\": \"star-neutral.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"752785d9dbcc47a9c103122c954e41787f05dd1475f1df305ee3018ff8725776\"\n    },\n    {\n      \"name\": \"star-happy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"a75270520f66d3c48db77b807f0c3a915e5ef5b05f3a3c6d861249a4307f15a5\"\n    },\n    {\n      \"name\": \"star-angry.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"756f1b1466e6070a0dbefd90433ee4a70de0594de4994861b790fba81f3a4c2d\"\n    },\n    {\n      \"name\": \"star-thinking.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"8043e44e5fee1d16bca4540dae5141e6f81c78b79cb4cecf86f609a69f409558\"\n    },\n    {\n      \"name\": \"star-shook.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"bd99694c0b3e290e4728fc9282d014479e0d356e4cc52b53a96a4caf784c050b\"\n    },\n    {\n      \"name\": \"star-curious.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"f60d0e06d12ff1a721a72d4da85ffc7a6355bb20c53f7efdcffca7d0b6d6dcb9\"\n    },\n    {\n      \"name\": \"star-wink.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"5358e4f67ac0469e236e75321512bfea270124309e4e45a7850676612a73747c\"\n    },\n    {\n      \"name\": \"star-sleepy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"7b7339122dd63f8d68a3b8a3f80ba45cea8f5a02ae29821feb37c5c898c7e351\"\n    },\n    {\n      \"name\": \"star-sad.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"4624c9246dd0d79740df9ca2ca3e00e84e33eccc1d18ab985a6c8cb82e2d2345\"\n    },\n    {\n      \"name\": \"star-worried.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"89c9dcd65df4887625f945f3f031a77fb9d7aba636aa3dad118153ee2939b291\"\n    },\n    {\n      \"name\": \"star-skeptical.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"ded654d65a55343c0b3c2a7224d880ece052c0f931270415eefb4521cb5ff4ac\"\n    },\n    {\n      \"name\": \"star-focused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"6df3276ba4b1d5952e4c0b47334e92e253151ad8c8a48b43dd11bbe1026adc2b\"\n    },\n    {\n      \"name\": \"star-excited.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"f424798cec975cfeb2394ea20f75a05c5696346c130605975d003b9d452541aa\"\n    },\n    {\n      \"name\": \"star-calm.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"9d947fa2078f414ecb243c3e88c528290c03f592dc7ce17cfcd4118faf95db25\"\n    },\n    {\n      \"name\": \"star-shy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"37bb8dbc10efa09b39d7b417b9c7c176c1dd79127ab770615cc9bd14cd21b9b7\"\n    },\n    {\n      \"name\": \"star-confused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"7bbd242a8b8fa886c0d65ebbea5c46fb09c45a6599ef168d179da036238637f8\"\n    },\n    {\n      \"name\": \"heart-neutral.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"0f8399208944779abfb5c9d4e3095557cc053fe72cab10083fcc739fc821b2e8\"\n    },\n    {\n      \"name\": \"heart-happy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"2a640e2d787c08e0e7b8c452372293be5495f319e2c105f828e9ab2634d96cb5\"\n    },\n    {\n      \"name\": \"heart-angry.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"9e835cd2069403db16336f3a07d1912ef5de03d17a0f491b5b4608726a4295c3\"\n    },\n    {\n      \"name\": \"heart-thinking.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"6a3fb13ea446fbd29537a1c0ada22a2aac271f13c4500b40f6d9a6fa5ca07f41\"\n    },\n    {\n      \"name\": \"heart-shook.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"7fc423880d9de9b0c43ca28a95d19c88edfee64599736f5ec7d9ad7e9e227f81\"\n    },\n    {\n      \"name\": \"heart-curious.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"0f06781acbd267672b21eb75de8e4a24e59284ddbf54269cd3f0ab77e08c4c1f\"\n    },\n    {\n      \"name\": \"heart-wink.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"a7d3ffef15b71544271d8fe3f31196c36523c45dc7f0534ed69328a72b735bd3\"\n    },\n    {\n      \"name\": \"heart-sleepy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"4fc9dc3e15630b55e3b6ad9ed77adf5fcdbc1f7cf30cc3e20d042aeaa380ddf3\"\n    },\n    {\n      \"name\": \"heart-sad.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"5f0ec82d99f3d0c68ff37432a036ab7161cdc71a803c77990f5d85704f6873e5\"\n    },\n    {\n      \"name\": \"heart-worried.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"8cf597fdb7951694370b86982583972382c66e80991fbbd614c7b582312820ed\"\n    },\n    {\n      \"name\": \"heart-skeptical.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"7b15554a3cb90277e12ef0784b58403477aaa5205988577eb6d51166f6f31064\"\n    },\n    {\n      \"name\": \"heart-focused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"45e0ae49d7880d6d6ea73981ef041014495c8215af0f400de2568594e1b2a511\"\n    },\n    {\n      \"name\": \"heart-excited.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"fe98dc6b7821903d0a9ad68524d6629992ec5b428a936bceba41226ded99ea56\"\n    },\n    {\n      \"name\": \"heart-calm.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"93e1cb32427a0aec8f63c367c96572cce90460cc314d60e7f0d921d97d9fa7c9\"\n    },\n    {\n      \"name\": \"heart-shy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"9606be4361274bd7810e1ec0a25e2c1c00714ff470a5da156d10dbe8339ddbe2\"\n    },\n    {\n      \"name\": \"heart-confused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"11df17ec8a26fb5f0eb2db4b2653cc5680f469a23336131e8d23746394f97a57\"\n    },\n    {\n      \"name\": \"cloud-neutral.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"9d1bb0437e2ee290001f2f947a7c48d71a4f2bbdc7aab1898e0c7ff16aa2400c\"\n    },\n    {\n      \"name\": \"cloud-happy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"5fa569f6a42c76fe2a0cbf84ec73c3e4bd18def4251695caa5438195c8d0bfce\"\n    },\n    {\n      \"name\": \"cloud-angry.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"aad83913243bff2c274c5f27e98bc6f28c5f95729bbdde9fd7915c974e0527d5\"\n    },\n    {\n      \"name\": \"cloud-thinking.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"5b4b4c2897cb93c0ba11ead49202e39ac9303cbcb40c40a3f7aedddc94d55f60\"\n    },\n    {\n      \"name\": \"cloud-shook.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"4e08323a4b5064d59fe0ffa4fdec253a585675919b1261ae56480a484579cf10\"\n    },\n    {\n      \"name\": \"cloud-curious.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"35b59714a8413a2b0672b58531da32169ee9e789a5d72a2b6b4cc3bf6b36f94d\"\n    },\n    {\n      \"name\": \"cloud-wink.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"ca803834f06338b02e38fb9c072f1e606f7c553888256294e278ffc310075505\"\n    },\n    {\n      \"name\": \"cloud-sleepy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"8d84550b4eee4f11de9654ff4187b4391ad45ce898fa08a60b25528041e36b46\"\n    },\n    {\n      \"name\": \"cloud-sad.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"4b5307e09a9171fd16f219bb0c71d80cfa8cc9e72d6b20e68d1cda2d467cd624\"\n    },\n    {\n      \"name\": \"cloud-worried.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"ebc683493e16246afcf8a74b1706851f753d626a44c45629711caf7ab4778a9c\"\n    },\n    {\n      \"name\": \"cloud-skeptical.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"06411254c4b0cc4894fe32c4979592a8f33c4100906381f680274cf38cd84614\"\n    },\n    {\n      \"name\": \"cloud-focused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"427c79255002f3896d4fad4e4a44564028db4bdeb8a7810ee70e440126659884\"\n    },\n    {\n      \"name\": \"cloud-excited.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"e7042865d17302f3c9466bb4a42dfd331b9e1ffd5e09cb0a9307268532cc8e88\"\n    },\n    {\n      \"name\": \"cloud-calm.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"9a60d507c80c605263322339dc40ba3a8bec26e1c2c950206205804fd092fe2a\"\n    },\n    {\n      \"name\": \"cloud-shy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"96a3476c8a70c7b88d6cc46790c797739f4ab059f22e70fbe4844a0a8927d531\"\n    },\n    {\n      \"name\": \"cloud-confused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"3a86bc801c5ec506aa94564d476f8dc5d5854fd029511b3a2a10ab3d912dea7f\"\n    },\n    {\n      \"name\": \"diamond-neutral.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"0be4053273b519b4fba4036862d97a19baaff838b222255e17ef0ad585a057d2\"\n    },\n    {\n      \"name\": \"diamond-happy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"ccd5b68e3751847889fa28591f3dc93190708fc2a564f9147dfd85bf86cb38b7\"\n    },\n    {\n      \"name\": \"diamond-angry.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"38e6480c32f53ea0272a622ff84c60d4f845e861153d6d1bbd803770e249a808\"\n    },\n    {\n      \"name\": \"diamond-thinking.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"ed7554c3fd4a2228bf212131afac8bf17dffa88cf47a99358a98190a55f9b93a\"\n    },\n    {\n      \"name\": \"diamond-shook.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"be7b0e343cb2ce4c1dac39b3b0c083ee6aaa813dac5624e69c5710e3b2095852\"\n    },\n    {\n      \"name\": \"diamond-curious.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"4889b82b549d1321124c1be0cdb71a7183eb1e6a5b85f3ee4aa26378698522ec\"\n    },\n    {\n      \"name\": \"diamond-wink.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"00e26af3ac1ce8dfe30ee45397872694513d6e828cb4ad7618d4253e8cf404a8\"\n    },\n    {\n      \"name\": \"diamond-sleepy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"b0fb0f7a64176d9e4b3865ea700e83c6f6697f90746bbd8c2dbc8f62b34c1746\"\n    },\n    {\n      \"name\": \"diamond-sad.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"35fc4abefb3dafc81071f8b84c20ef3ef997bd548cc9c48db932cbbda1ccc1bc\"\n    },\n    {\n      \"name\": \"diamond-worried.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"c60e0698d062609712f964911982104ef52fa2b2c1d7c9d852b2a8df3abae3f2\"\n    },\n    {\n      \"name\": \"diamond-skeptical.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"f081a33ffb8cb9e518d020e06baeaba236ee7c4d8a9038d6a98e6878fec2f248\"\n    },\n    {\n      \"name\": \"diamond-focused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"d5526702765862a7f1c7d762029936d89716cad9bd100c3557709c9af736b45b\"\n    },\n    {\n      \"name\": \"diamond-excited.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"a79b3ffaed1d4f2049f9ebfb477dc3bdf372aa496346abc59b7e3c0f42312e94\"\n    },\n    {\n      \"name\": \"diamond-calm.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"b44bc1905fa62fd5423fcea917a2fd233e1f78669b1f43bd67e6ce6fb22ebeb3\"\n    },\n    {\n      \"name\": \"diamond-shy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"f0e6c85f4a1d44aa764d4692bbcff5e56b3d87d3d2a48523d14fe4c4dd3cc5a5\"\n    },\n    {\n      \"name\": \"diamond-confused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"1aecff8603a2e406396da30ec13f4c1469fd69ebfbd85ab6d01a5e75b7b7819d\"\n    },\n    {\n      \"name\": \"shield-neutral.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"9715034254f23b261af12bcc709d440b7e2016eaf6a87507723f6d6f1792fcdc\"\n    },\n    {\n      \"name\": \"shield-happy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"9db7577c4b4298d06fc598400191db10833173012afd04ee9a76289f46f6a975\"\n    },\n    {\n      \"name\": \"shield-angry.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"645f70148d060b6de7dc32b0615735c75191db167e441ee49077c77cbf1cc504\"\n    },\n    {\n      \"name\": \"shield-thinking.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"50adf9a276d669fb911b1808b91540dbe37dee7ec6e0520b1b50f85d76834180\"\n    },\n    {\n      \"name\": \"shield-shook.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"b866a16226ea78016bfeb0390b3109a0a85c718ac1cfc51081827165abfcf39e\"\n    },\n    {\n      \"name\": \"shield-curious.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"22b1c45d60073da8344883cc0f0d31e60094a47d28cf2707ea8d51a0925b9a4a\"\n    },\n    {\n      \"name\": \"shield-wink.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"cef03c992f12b2321e442e630a48e4f183768178afbf1ce4669af76e60226444\"\n    },\n    {\n      \"name\": \"shield-sleepy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"a077e7a45c94ce3e4c77f3e93e44eb3a4517ad209df262705880f5880b22664c\"\n    },\n    {\n      \"name\": \"shield-sad.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"598a27c642fed7ade7b6e97e4bb154a31bc99ce65b4fac7bc124d7fac6fad5f9\"\n    },\n    {\n      \"name\": \"shield-worried.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"408f12f08cf2a2067c5118aa22d39fc4b2981e6ea690f81cc5bb545ebe7305c9\"\n    },\n    {\n      \"name\": \"shield-skeptical.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"b12461449b815b56937abb9713d7595b3b1e658d99cdc4db03acf3cf3924a6b9\"\n    },\n    {\n      \"name\": \"shield-focused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"5eaaf96a538e8c63318424a5f6d7731cc762c0c0c7cd548176a05e7a59edca52\"\n    },\n    {\n      \"name\": \"shield-excited.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"de392539de811530c1d40676aeedcad0a4d6456efdf2e46d0d83e1f4095983c1\"\n    },\n    {\n      \"name\": \"shield-calm.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"5ac87b83cc3ddae6fbdf24bf6135a78bcd3902d2da37169ca0c9c9e77ce7291d\"\n    },\n    {\n      \"name\": \"shield-shy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"b16343ca85dc121491cd03ef8881ca83b1509202d729a044e1555f697524a6f5\"\n    },\n    {\n      \"name\": \"shield-confused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"12a7a0a1acd331b2eb021df5bfa6ecaa491f4fa2b83fd13840752e107fe878af\"\n    },\n    {\n      \"name\": \"slender-neutral.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"7ddc141396eb9d5ba3304133f1b0e6f3d5b4e80003dce8a4bd71a44265cd0506\"\n    },\n    {\n      \"name\": \"slender-happy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"c6202c91d572663274dffeeac6f9044dabbaef7493468940cb7bc1fd25426ff4\"\n    },\n    {\n      \"name\": \"slender-angry.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"5c8e2335228b382d2fe08053ddd2453ab5773a089775559954f801c6ee73f98d\"\n    },\n    {\n      \"name\": \"slender-thinking.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"0fa8e11af2f9cb9f3fb96c043663ecb912ee6d087707022e5a9d096d861ada48\"\n    },\n    {\n      \"name\": \"slender-shook.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"1d1aeaf6324b983c08ca6cfc6ed6c5f1e1cab73721324bbd0c1fbd21d904cca6\"\n    },\n    {\n      \"name\": \"slender-curious.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"454eb1fe2222a93a24e008c0f751e37ccf3ffbc9a76efc17b9ccbcdbd42be546\"\n    },\n    {\n      \"name\": \"slender-wink.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"f71e8c8f190091bda7b89d29803217b16e720955884cce94f0f8ccd0f240278a\"\n    },\n    {\n      \"name\": \"slender-sleepy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"2f64a8c4cc4d94fd6d6902d46ccec6556ea34f8bebc4e50195703f80fd0d6878\"\n    },\n    {\n      \"name\": \"slender-sad.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"be470cdbafa627fc361ab1787cf9a14bbc6dba29719dc0de3d22ed2f68d295af\"\n    },\n    {\n      \"name\": \"slender-worried.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"cbb9226cc5396b1620f16df13dd7de3d9dd84354091c7528918ee515195ab66a\"\n    },\n    {\n      \"name\": \"slender-skeptical.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"6a90412030d2128349c5b3aefe9aee6b3546e5e5f8a1c17145cb9bac42fde267\"\n    },\n    {\n      \"name\": \"slender-focused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"7df6fa320bac7cce4a1715061b7f8a9e1cd8cc8cf1715dacb5f6a2370b864a59\"\n    },\n    {\n      \"name\": \"slender-excited.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"d6fb68278afe1dbb91033753890f86ea9b1405e8a97982b37b3f9370a2f90702\"\n    },\n    {\n      \"name\": \"slender-calm.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"0e38993fbb43ac75d557085d9c4aea9e5b9c03486109184dcd775a61c62c5c23\"\n    },\n    {\n      \"name\": \"slender-shy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"5a8e9af89564dcf31548967b0764816439978477232767dac1070d7cc69b5417\"\n    },\n    {\n      \"name\": \"slender-confused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"41ae9c31963af569c5fb71240fd12a4fc526ecb45bce49181791ab5624a1fbe3\"\n    },\n    {\n      \"name\": \"pocket-neutral.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"f0357d95409b063506894769d8c98c6d973e3b35778634be80eb8d86ce15ef59\"\n    },\n    {\n      \"name\": \"pocket-happy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"b4a4c81b53072102e022b6c4afadf565d462d8e213dda1e2cf8f2a4bfaca92bc\"\n    },\n    {\n      \"name\": \"pocket-angry.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"1d5f6f1937f29817bce97b42950c0047f9d90c9886493db3849a8c3ae94d7f68\"\n    },\n    {\n      \"name\": \"pocket-thinking.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"6ed7ab5c858063c7576aab3f040f6befdc79171abc1e1ae4d4ad8ce2cda92bd0\"\n    },\n    {\n      \"name\": \"pocket-shook.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"8e01c06b228b9183a01a5c297aaebba5805761fc4e137a14cf911123b58e3d69\"\n    },\n    {\n      \"name\": \"pocket-curious.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"8880b1e67dfd49344623660ed979027a536a749fc4aba145ed6dcc27915e1fc8\"\n    },\n    {\n      \"name\": \"pocket-wink.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"a409a00f3ae62f12ba4ee526c008341c84773f4e4c02fdf03483029365d7900f\"\n    },\n    {\n      \"name\": \"pocket-sleepy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"e7de1d3c339d3d3c00c13196bf79391a66a935896d7979cdf91ee5a832b9e65a\"\n    },\n    {\n      \"name\": \"pocket-sad.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"3aac1690decb6fea593ee685639bf69f0c823ef77e0dfee2c53dd11c1f044faf\"\n    },\n    {\n      \"name\": \"pocket-worried.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"f3a0ff0c9018f39bf6a93d067b31cf53085f3e09ef2660bb46d232ac11c7d639\"\n    },\n    {\n      \"name\": \"pocket-skeptical.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"c723ae9a6545d39187479529dd99b5bdb432c8c9eb452d87b2e9b4161c3f0890\"\n    },\n    {\n      \"name\": \"pocket-focused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"1736a7477d840b04e0122ae4ce802d70df621abb9b8167d9903a7e64bf900248\"\n    },\n    {\n      \"name\": \"pocket-excited.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"a6607b9bed29ffe8b9b2410d380141c8e8c5f8240fef66fc1fa2d5ec85ad7f71\"\n    },\n    {\n      \"name\": \"pocket-calm.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"b7b350d609bea7e82436390a89eb39654c0dccd1a4fccff3833289037ecef317\"\n    },\n    {\n      \"name\": \"pocket-shy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"76a0424553d0b56cab63fc9e8478720f14b7ce83bb1334badf1e49b7faf9d3b3\"\n    },\n    {\n      \"name\": \"pocket-confused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"b150108e145a8b01886c54c4a794da498de479f4f6c029bcbcc2f6597091b1c9\"\n    },\n    {\n      \"name\": \"neutral-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"20dd64f26d57ec9689404992c1cc79ec47d7658bc7cdc0e6a528cafdc62d5874\"\n    },\n    {\n      \"name\": \"happy-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"a29d62ed88daa32c74fcfb554703272a0f22065f4779a0624ca42267a38b1298\"\n    },\n    {\n      \"name\": \"angry-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"3f608cc98039d52c14fa913bd5516ddf026e5fadc0d00a8c0a8b05fdba2edf3e\"\n    },\n    {\n      \"name\": \"thinking-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"13cf6b332e4c47c81c32d4dace7d7931e59cef06c24a1786d6a94f62bf5687c7\"\n    },\n    {\n      \"name\": \"shook-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"62066c591c00dfd4eff26ac4042e42572982cedf25242921447ab4150b2b911e\"\n    },\n    {\n      \"name\": \"curious-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"99ef2efbbf2af76c7926e3d58ecb7c51f432e8436ade7ec82ba208f44b9022c9\"\n    },\n    {\n      \"name\": \"wink-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"3bfdfce813952fcdb23b2de31358cb7f05e1cb3fd7796627d62313e78fd6bc43\"\n    },\n    {\n      \"name\": \"sleepy-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"c89005227bbe168dcf3feb40c2a6a95144a8d7e23cadaec75bb19446da5258ed\"\n    },\n    {\n      \"name\": \"sad-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"ab41d4302da327e0a46e72b83310e6223dac6c726c74ad66c66e71b2d5db05a8\"\n    },\n    {\n      \"name\": \"worried-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"4d8560c8afd909ac3ac386d3ebeb0c7bfd84805ab98e66cf91e41bdc1f0c40e8\"\n    },\n    {\n      \"name\": \"skeptical-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"6ec8169e3464e9a571c01e156c7e89d3b44c8f91fcc5b8eba9d9cd6d08cb1588\"\n    },\n    {\n      \"name\": \"focused-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"373bf328d9f3c749a0b277cfe76f339feb0dadffc742dfd2890e56acad291caf\"\n    },\n    {\n      \"name\": \"excited-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"19b04c72b7fc04b8e5a5f62a3cbda77cd040f0f2862a845fa39dee3f847d298f\"\n    },\n    {\n      \"name\": \"calm-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"4d94333cba3926ad78cdae94b5906a13ddcac585b502cbe21b18d0cf2fd6bdec\"\n    },\n    {\n      \"name\": \"shy-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"1d6ddaf4276a8bde870cfa8297ad3d083b02d6da7a632a75288dca2a147912ff\"\n    },\n    {\n      \"name\": \"confused-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"a5dd7b931cb77ea89baae4372ef31ec96598cfe09c02c4730bc1d84868817d75\"\n    },\n    {\n      \"name\": \"petal-shape.webp\",\n      \"width\": 56,\n      \"height\": 56,\n      \"sha256\": \"15f904f9a047a7d2056eff8431041fe3563badcf6f504d814c3e3257300948f4\"\n    },\n    {\n      \"name\": \"flower-shape.webp\",\n      \"width\": 56,\n      \"height\": 56,\n      \"sha256\": \"60c326ef325901603c61858783681d00da8522e88f9b634fe3cfa47205a24124\"\n    },\n    {\n      \"name\": \"star-shape.webp\",\n      \"width\": 56,\n      \"height\": 56,\n      \"sha256\": \"51f710897458ffb1d61b6f3e07cc1bc3ff747bd0858796420d483668f2b03e30\"\n    },\n    {\n      \"name\": \"heart-shape.webp\",\n      \"width\": 56,\n      \"height\": 56,\n      \"sha256\": \"42f59afb202af43d03b5447734487da0ea5f42a83f70948a8af710e72157323e\"\n    },\n    {\n      \"name\": \"cloud-shape.webp\",\n      \"width\": 56,\n      \"height\": 56,\n      \"sha256\": \"a13517c790ee85393a030411edaeb46d31615c428d3c541d56af27a9ca1083f7\"\n    },\n    {\n      \"name\": \"diamond-shape.webp\",\n      \"width\": 56,\n      \"height\": 56,\n      \"sha256\": \"10a907dd5ebecad04d7c36efc697874a4a1d25407af711d48dd183025be3d9ba\"\n    },\n    {\n      \"name\": \"shield-shape.webp\",\n      \"width\": 56,\n      \"height\": 56,\n      \"sha256\": \"1cbeacb3939bc554ccc1543dd08c3d77628bc770a96f0f591b44f50f5b7063da\"\n    },\n    {\n      \"name\": \"slender-shape.webp\",\n      \"width\": 56,\n      \"height\": 56,\n      \"sha256\": \"71620562d424d6518bafd7cb2f9041af78aebdf7c17971daee2ea5b7db68ba90\"\n    },\n    {\n      \"name\": \"pocket-shape.webp\",\n      \"width\": 56,\n      \"height\": 56,\n      \"sha256\": \"a4e018d73bbba7f7772eda5a8640b22d8f693923463046e49c2522e3a2c96dc3\"\n    }\n  ]\n}\n",
  "src/board-native-agents/registry-manifest.json": "[\n  {\n    \"originalPath\": \"components/application/agent-thinking/agent-thinking.tsx\",\n    \"localPath\": \"/Users/rouge/HeliosUI/helios-ui-site/react/src/board-native-agents/components/application/agent-thinking/agent-thinking.tsx\",\n    \"registry\": \"https://www.boardui.com/r/agent-thinking.json\"\n  },\n  {\n    \"originalPath\": \"components/application/auth/auth-card.tsx\",\n    \"localPath\": \"/Users/rouge/HeliosUI/helios-ui-site/react/src/board-native-agents/components/application/auth/auth-card.tsx\",\n    \"registry\": \"https://www.boardui.com/r/auth-card.json\"\n  },\n  {\n    \"originalPath\": \"components/application/auth/auth-media-carousel.tsx\",\n    \"localPath\": \"/Users/rouge/HeliosUI/helios-ui-site/react/src/board-native-agents/components/application/auth/auth-media-carousel.tsx\",\n    \"registry\": \"https://www.boardui.com/r/auth-card.json\"\n  },\n  {\n    \"originalPath\": \"components/application/composer-loader/composer-loader.tsx\",\n    \"localPath\": \"/Users/rouge/HeliosUI/helios-ui-site/react/src/board-native-agents/components/application/composer-loader/composer-loader.tsx\",\n    \"registry\": \"https://www.boardui.com/r/composer-loader.json\"\n  },\n  {\n    \"originalPath\": \"components/application/notification-center/notification-center.tsx\",\n    \"localPath\": \"/Users/rouge/HeliosUI/helios-ui-site/react/src/board-native-agents/components/application/notification-center/notification-center.tsx\",\n    \"registry\": \"https://www.boardui.com/r/notification-center.json\"\n  }\n]\n",
  "src/board-native-agents/source-section-copy.json": "{\n  \"agent-creator\": {\n    \"use\": \"Keep a profile in application state by passing `agent` and `onChange`. Your application decides when to save it; the creator does not persist changes by itself. Place it in a parent with a defined height, such as a sidebar, drawer or dialog. Supply `onClose` to add the close control.\",\n    \"voice\": \"Voice preview uses speech voices available on the current device. Alice is preferred when available, with a device voice as fallback. Language, notification and playback settings remain controlled profile values for your application. This preview neither requests notification permission nor connects an external voice service.\",\n    \"template\": \"The [Multi-agent Chat template](/components/multi-agent-chat) uses this creator too. Choose the standalone block for an existing product, or explore the workspace with group chats, a local marketplace and animated agent avatars.\"\n  },\n  \"agent-limits-card\": {\n    \"expanded\": \"Start with `defaultExpanded` to show the context breakdown. Each context group can open independently. Deferred entries display a dash and are excluded from both the total and the usage bar.\"\n  },\n  \"agent-progress\": {\n    \"custom\": \"Provide an ordered `steps` array to define the sequence. The component derives the expanded size, remaining steps, current task and overall progress from that array.\",\n    \"timing\": \"Use `stepDuration` to set each task’s duration. Once the last checkmark appears, `completionDelay` determines the pause before the component calls `onFinished`.\"\n  },\n  \"agent-thinking\": {\n    \"wave\": \"Nine dots form a 3×3 grid. A diagonal highlight passes from the upper left to the lower right, leaving a short fading trail before repeating. This is the default animation.\",\n    \"spin\": \"A bright point circles the same dot grid clockwise. Its trailing dots suggest continuous rotation while retaining the grid’s compact shape.\",\n    \"stars\": \"Five four-point stars brighten and fade at different times. Their subtle default tone gives this treatment a softer appearance than either dot grid.\",\n    \"infinity\": \"A moving highlight follows a figure-eight path over a quiet background track. The loop has no visual beginning or end, making it suitable for longer agent tasks.\",\n    \"label\": \"The variants share one set of controls. Set the status text with `label`, show elapsed seconds with `showTimer`, and enable the moving text highlight with `shimmer`. Use `tone` to change the default color. Reduced-motion preferences replace the moving treatments with a still state.\"\n  },\n  \"auth-card\": {\n    \"layouts\": \"Providers follow the email form in each layout. Choose `stacked` for full-width provider buttons with visible names, suited to a dedicated sign-in screen. Choose `inline` for compact icon buttons that fit a dialog or narrow panel and accommodate more providers. Both arrangements use the same `providers` list, so the surrounding authentication flow stays consistent when the layout changes.\",\n    \"split\": \"Supplying `media` adds a second column beside the form. This leaves room for artwork and the extra fields of a dedicated account-creation page. On narrow screens, the media column is hidden so the form remains close to the top of the page.\\n\\nThe media slot accepts any React node. Use an image, video, or `AuthMediaCarousel` with a collection of images. The carousel crossfades automatically, keeps the first image still for reduced motion, and leaves navigation controls out of the form area.\\n\\nCommon companion options include `centered` headings, `confirmPassword` for a paired password row, and `footnote` for supporting text below the card. A `grid` provider layout distributes icon buttons across equal-width columns.\",\n    \"logo\": \"Add a React node with `logo` to place a brand mark above the heading. Its alignment follows `centered`. The component accepts your own artwork directly, so an installed copy can use the identity of the surrounding application.\",\n    \"modes\": \"Choose `signin` or `signup` through `mode`. Sign-in includes a remember-me option and password recovery link. Sign-up adds the name field and terms text, while removing controls intended for returning users.\",\n    \"verify\": \"The `verify` mode replaces the email and password form with one-time-code fields. It includes resend behavior and removes provider choices, since the person has already selected a sign-in method. The heading and optional logo remain aligned with the preceding steps.\\n\\nUse `email` to identify the destination address. The `onComplete` callback receives the code as soon as all digits are entered, allowing your application to verify it without waiting for another button press.\",\n    \"providers\": \"List supported social providers in the order you want them displayed. Their outlined appearance retains recognizable multicolor marks while keeping the choices visually balanced. The provider callback lets your own authentication flow handle the selected brand.\",\n    \"wiring\": \"Connect authentication through application callbacks. The form supplies `FormData` to `onSubmit`, and a provider press reports its brand through `onProvider`. Route those values to your existing identity service or endpoint. The local preview only validates input and reports the choice.\"\n  },\n  \"composer\": {\n    \"working\": \"Combine the thinking indicator, perimeter light and translucent control treatment while a reply is being prepared. A working state can drive the complete composition, then return the controls to their resting appearance when the turn finishes.\",\n    \"parts\": \"Compose the input pill, status bar, attachment controls and model picker separately when a full composer does not fit your layout. The exported menus retain their keyboard behavior and the provider catalog remains editable application data.\"\n  },\n  \"composer-attachments\": {\n    \"queue\": \"Attachments with `progress: 0` enter the sequential local queue. Each tile appears, draws its progress ring and settles before the next file starts. An attachment without a progress value appears complete. Adjust `uploadDuration` and `uploadGap`, observe `onUploadComplete` or `onAllUploaded`, and append more files while the queue is running. The demonstration does not upload files to a server.\",\n    \"kinds\": \"The six tile kinds cover images, documents, spreadsheets, presentations, code and video. An image uses its `src`; the remaining kinds use recognizable file glyphs. Filenames sit below the icon and truncate within the tile. Use the attachment strip or individual attachment tile exports in other surfaces as needed.\",\n    \"uploader\": \"For a real upload, supply your own attachments and update each file’s `progress` as its transfer advances. The ring follows the numeric value. Clear progress once the file has landed; the component does not choose an upload endpoint or send the file itself.\"\n  },\n  \"composer-loader\": {\n    \"conversation\": \"A conversation can use one working flag for its thinking indicator and composer light. Show the user’s turn first, keep the input treatment active while waiting, and restore the resting composer when the response arrives. The local example demonstrates these visual states without requesting an AI response.\",\n    \"composer\": \"The input shown here is the reusable Composer block: attachment and model menus, voice and send controls, and its optional status bar. Composer Loader can wrap an existing input too. Use the exported source composer when you want the same arrangement as this preview.\",\n    \"tuning\": \"The default light uses four color stops. Set `colors` for another palette, `arc` for the illuminated portion of the rim, and the bloom controls for its inward glow. `speed` specifies seconds per circuit. The band follows the rounded ends at a constant pace and stops moving when reduced motion is requested.\"\n  },\n  \"composer-panel\": {\n    \"permissions\": \"The permission trigger gains a surface on hover, press or while its menu is open. Four modes include short explanations, alongside a Learn more action controlled by `learnMoreHref` or `onLearnMore`. The initial value is Auto; change it with `defaultPermission`, or use `permission` and `onPermissionChange` for controlled state. The picker is also available independently from the full panel.\",\n    \"models\": \"The model panel pairs a scrollable provider rail with radio rows for that provider’s models. Only the chosen model displays its effort control. Its popover offers six positions from faster responses to more deliberation. Quick Search, including the `/` shortcut, searches across provider catalogs and identifies the provider on each result. Selecting a match opens the relevant lineup. Supply `providers` to replace the bundled examples with your own available models; selecting a model here does not activate a remote provider.\",\n    \"status\": \"The compact status strip sits above the card with rounded top corners. It contains the branch, project and a context-usage ring. Render your own status values, replace the `status` slot with another node, or pass `null` to keep only the input card.\",\n    \"wiring\": \"The prompt grows with its content. Enter submits the message and Shift+Enter inserts a line break. Receive text through `onSubmit`, or use the richer message callback. An uncontrolled draft clears after submission. Use `disabled` while required, and pass `inputRef` to focus the field from your application.\",\n    \"attachments\": \"A row of file tiles can sit above the prompt inside the same card. Progress rings remain attached to the files as they appear. The separate Attachments page covers the tile kinds, removable strip and sequential local queue.\"\n  },\n  \"notification-center\": {\n    \"filtering\": \"The component manages its filter locally unless you provide controlled state. Choose the initial view with `defaultTab`, or pair `tab` with `onTabChange` to coordinate filtering with the rest of your application.\",\n    \"actions\": \"Each notification specifies a category and timeline group. Add an avatar or meaningful status icon, mark unread items, and provide compact actions. Pressing an action marks that notification read and passes the item and action identifiers to `onAction`.\"\n  },\n  \"questionnaire\": {\n    \"multiple\": \"Multiple selection is the default. Each option is a full-row checkbox card, allowing more than one choice. Next advances, Previous returns with earlier choices preserved, and the step pills jump to another question. The last step uses Done and sends the collected answers through `onComplete`.\",\n    \"single\": \"Set `select=\\\"single\\\"` on the questionnaire or an individual question. Rows become numbered choices and can be selected by pointer or digit key. The next step follows after `advanceDelay`, leaving time to see the selection. A previous answer remains highlighted when revisited. Other waits for typed text and submits with Enter.\",\n    \"answers\": \"Answers use question IDs as keys. Each answer contains selected option `values` in their declared order and the selected Other text. Control them with `answers` and `onAnswersChange`, and control navigation with `step` and `onStepChange`. The corresponding default props seed local state. `onDismiss` enables dismissal, and `labels` customizes button and Other copy.\"\n  },\n  \"task-list\": {\n    \"in-a-chat\": \"Sending the prepared message begins a local run beneath the user’s turn. Progress streams into the thread and the demonstration answer appears after `onComplete`. A new turn creates a separately keyed task list, so every message starts its own sequence.\",\n    \"resources\": \"Use a step’s `chips` to identify the files or resources involved. Chips sit beside the step label and can include a file glyph. Long resource names truncate within the row so the log stays compact.\",\n    \"timing\": \"Set `startDelay` to pause before the first entry and `stepInterval` to pace subsequent entries. With `collapseOnComplete`, an individual task folds after its own steps finish. Set the value to `\\\"all\\\"` to keep every task open until the complete run finishes, then fold the group before showing an answer. Completed task headers remain available so readers can reopen the details.\",\n    \"events\": \"Replace the demonstration interval with real application events by controlling `revealed`. Advance it as work completes or tool calls resolve. Controlled reveal disables the internal timer while retaining the same entry and completion behavior.\"\n  },\n  \"web-search\": {\n    \"in-a-chat\": \"Start the local trail by sending the prepared message. Source rows appear below that turn and the answer follows `onComplete`. Its reveal and guide styling match Task List, allowing both progress types to share a conversation without changing the thread’s visual rhythm.\",\n    \"sources\": \"Attach `sources` to a step to add a branch containing an overlapping stack of site marks. The compact stack shows where the agent looked without placing a long URL list in the middle of the run. Hover reveals a source’s title and domain. A supplied `href` makes its mark a link, and sources beyond the first six are collected behind a count.\",\n    \"marks\": \"Use `brand` for a supported site’s recognizable mark. Marks retain their brand colors, while monochrome marks follow the current text color for light and dark themes. Supply an `icon` for a source outside the supported brand set.\",\n    \"pacing\": \"Search steps can use different durations. Set a step’s `dwell` to keep it visible longer before revealing the next entry. A step containing sources reveals its main entry first, then brings in the source row after a short pause.\\n\\nA working indicator follows the end of the trail while progress continues, keeping attention on the active work. It disappears on completion. Change its text with `working`, or set that value to `false` to omit it.\",\n    \"events\": \"When real queries are available, control `revealed` as each one resolves. This replaces the demonstration timer and preserves the reveal treatment. The count refers to visible rows: a search step with a source stack contributes two rows.\"\n  }\n}\n",
  "src/board-native-charts/orders-chart-card.tsx": "/* Adapted from public BoardUI MIT source; see ../board-native/LICENSE. */\n\"use client\";\nimport {useMotionPreference} from '../useMotionPreference.js';\n\nimport { useState } from \"react\";\nimport { Bar, BarChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from \"recharts\";\n\nimport { Chip } from \"../board-native/components/base/badges/chip.js\";\nimport { useCountUp } from \"./use-count-up.js\";\nimport { cx } from \"../board-native/utils/cx.js\";\n\n/**\n * Orders Chart Card: a year of monthly orders as bars, this year beside last\n * year for every month, so the comparison is read bar to bar rather than\n * against a line. The header is the same as the revenue chart's: a count-up\n * total with a delta chip, the year-earlier figure under it, and a legend.\n * Hovering a month swaps the headline for that month.\n */\n\nconst MONTHS = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\nconst MONTHS_FULL = [\n  \"January\",\n  \"February\",\n  \"March\",\n  \"April\",\n  \"May\",\n  \"June\",\n  \"July\",\n  \"August\",\n  \"September\",\n  \"October\",\n  \"November\",\n  \"December\",\n];\n\nexport type OrdersPoint = {\n  /** Short month label on the axis. */\n  label: string;\n  /** Orders this year. */\n  current: number;\n  /** Orders in the same month a year earlier. */\n  previous: number;\n};\n\n/** Twelve months that add up to the stat cards' total orders. */\nexport const ORDERS_DATA: OrdersPoint[] = [\n  { label: \"Jan\", current: 1680, previous: 1510 },\n  { label: \"Feb\", current: 1740, previous: 1480 },\n  { label: \"Mar\", current: 1920, previous: 1650 },\n  { label: \"Apr\", current: 1850, previous: 1620 },\n  { label: \"May\", current: 2040, previous: 1710 },\n  { label: \"Jun\", current: 2110, previous: 1760 },\n  { label: \"Jul\", current: 2290, previous: 1840 },\n  { label: \"Aug\", current: 2180, previous: 1890 },\n  { label: \"Sep\", current: 2320, previous: 1930 },\n  { label: \"Oct\", current: 2410, previous: 1970 },\n  { label: \"Nov\", current: 2280, previous: 1810 },\n  { label: \"Dec\", current: 2342, previous: 1798 },\n];\n\nconst formatK = (value: number) => (value >= 1000 ? `${(value / 1000).toFixed(value % 1000 === 0 ? 0 : 1)}k` : `${value}`);\n\nfunction describeDelta(current: number, previous: number) {\n  if (previous === 0) return { label: \"New\", color: \"neutral\" as const };\n  const change = ((current - previous) / previous) * 100;\n  const rounded = Math.round(change * 10) / 10;\n  if (rounded === 0) return { label: \"0%\", color: \"neutral\" as const };\n  return {\n    label: `${rounded > 0 ? \"+\" : \"\"}${rounded}%`,\n    color: rounded > 0 ? (\"lime\" as const) : (\"rose\" as const),\n  };\n}\n\nexport function OrdersChartCard({\n  data = ORDERS_DATA,\n  title = \"Orders\",\n  className,\n  disabled=false,\n}: {\n  /** Twelve points, one per month; defaults to the demo year. */\n  data?: OrdersPoint[];\n  disabled?:boolean;\n  /** Headline label when no month is hovered. */\n  title?: string;\n  className?: string;\n} = {}) {\n  const reduced=useMotionPreference();\n  const [activeIndex, setActiveIndex] = useState<number | null>(null);\n\n  const totalCurrent = data.reduce((sum, point) => sum + point.current, 0);\n  const totalPrevious = data.reduce((sum, point) => sum + point.previous, 0);\n  const hovering = !disabled && activeIndex !== null && activeIndex < data.length;\n  const point = hovering ? data[activeIndex] : null;\n\n  const headlineValue = point ? point.current : totalCurrent;\n  const comparison = point ? point.previous : totalPrevious;\n  const delta = describeDelta(headlineValue, comparison);\n  const monthIndex = point ? MONTHS.indexOf(point.label) : -1;\n  const label = point ? (monthIndex >= 0 ? MONTHS_FULL[monthIndex] : point.label) : title;\n  const display = useCountUp(headlineValue);\n\n  const yMax = Math.max(1,...data.map((d) => Math.max(d.current, d.previous)));\n\n  return (\n    <section\n      className={cx(\n        \"flex h-[344px] min-w-0 flex-1 flex-col gap-6 rounded-2xl bg-background-secondary-default px-4 pt-4 pb-3\",\n        className,\n      )}\n    >\n      {/* Header: label over the count-up figure and its delta; legend on the right */}\n      <div className=\"flex w-full flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n        <div className=\"flex min-w-0 flex-col gap-0.5\">\n          <p className=\"w-full text-body-medium text-text-secondary\">{label}</p>\n          <div className=\"flex w-full items-center gap-2\">\n            <p\n              key={activeIndex ?? \"total\"}\n              className=\"animate-number-fade text-title-1-medium whitespace-nowrap text-text-primary tabular-nums\"\n            >\n              {display.toLocaleString(\"en-US\")}\n            </p>\n            <Chip variant=\"bold\" color={delta.color}>\n              {delta.label}\n            </Chip>\n          </div>\n          <p className=\"text-body-2-medium text-text-tertiary tabular-nums\">\n            {comparison.toLocaleString(\"en-US\")} {point ? \"a year earlier\" : \"last year\"}\n          </p>\n        </div>\n        <dl className=\"flex shrink-0 items-center gap-4 text-body-2-medium text-text-secondary\">\n          <div className=\"flex items-center gap-1.5\">\n            <span className=\"size-2 rounded-full bg-chart-9-active\" aria-hidden />\n            <dt>This year</dt>\n          </div>\n          <div className=\"flex items-center gap-1.5\">\n            <span className=\"size-2 rounded-full bg-chart-neutral\" aria-hidden />\n            <dt>Last year</dt>\n          </div>\n        </dl>\n      </div>\n\n      {/* Chart */}\n      <div className=\"min-h-0 w-full flex-1\">\n        <ResponsiveContainer width=\"100%\" height=\"100%\">\n          <BarChart\n            data={data}\n            accessibilityLayer={!disabled}\n            margin={{ top: 4, right: 6, bottom: 0, left: 0 }}\n            barCategoryGap=\"28%\"\n            barGap={3}\n            onMouseMove={(state) => {\n              if(disabled)return;\n              const index = Number(state?.activeTooltipIndex);\n              if (state?.isTooltipActive && Number.isFinite(index)) setActiveIndex(index);\n            }}\n            onMouseLeave={() => setActiveIndex(null)}\n          >\n            <YAxis\n              width={40}\n              domain={[0, yMax * 1.1]}\n              tickCount={4}\n              tickFormatter={formatK}\n              tickLine={false}\n              axisLine={false}\n              tick={{ fontSize: 12, fill: \"var(--color-text-tertiary)\" }}\n            />\n            <XAxis\n              dataKey=\"label\"\n              tickLine={false}\n              axisLine={false}\n              tickMargin={12}\n              interval=\"preserveStartEnd\"\n              tick={{ fontSize: 13, fill: \"var(--color-text-tertiary)\" }}\n            />\n            <Tooltip content={() => null} cursor={{ fill: \"var(--color-chart-track)\", opacity: 0.5 }} />\n            <Bar\n              dataKey=\"previous\"\n              fill=\"var(--color-chart-neutral)\"\n              radius={[4, 4, 0, 0]}\n              isAnimationActive={reduced===false}\n              animationDuration={450}\n            />\n            <Bar\n              dataKey=\"current\"\n              fill=\"var(--color-chart-9-active)\"\n              radius={[4, 4, 0, 0]}\n              isAnimationActive={reduced===false}\n              animationDuration={450}\n            />\n          </BarChart>\n        </ResponsiveContainer>\n      </div>\n      <div className=\"sr-only\"><table><caption>{title}: source data</caption><thead><tr><th scope=\"col\">Period</th><th scope=\"col\">This year</th><th scope=\"col\">Last year</th></tr></thead><tbody>{data.map((point,index)=><tr key={index}><th scope=\"row\">{point.label}</th><td>{point.current}</td><td>{point.previous}</td></tr>)}</tbody></table></div>\n    </section>\n  );\n}\n\n",
  "src/board-native-charts/revenue-chart-card.tsx": "/* Adapted from public BoardUI MIT source; see ../board-native/LICENSE. */\n\"use client\";\nimport {useMotionPreference} from '../useMotionPreference.js';\n\nimport { useId, useState } from \"react\";\nimport { Area, ComposedChart, Line, ResponsiveContainer, Tooltip, XAxis, YAxis } from \"recharts\";\n\nimport { Chip } from \"../board-native/components/base/badges/chip.js\";\nimport { useCountUp } from \"./use-count-up.js\";\nimport { cx } from \"../board-native/utils/cx.js\";\n\n/**\n * Revenue Chart Card: a year of monthly revenue drawn against the year before.\n *\n * The current year is the filled area and solid line, last year the dashed\n * line behind it, so the gap between them is the story. Hovering a month\n * swaps the headline for that month's figure and shows what it was a year\n * earlier. The frame, the count-up headline and the delta chip follow the\n * stat cards and the other chart cards, so it sits in any dashboard row.\n */\n\nconst MONTHS = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\nconst MONTHS_FULL = [\n  \"January\",\n  \"February\",\n  \"March\",\n  \"April\",\n  \"May\",\n  \"June\",\n  \"July\",\n  \"August\",\n  \"September\",\n  \"October\",\n  \"November\",\n  \"December\",\n];\n\nexport type RevenuePoint = {\n  /** Short month label on the axis. */\n  label: string;\n  /** Revenue this year, in the card's currency. */\n  current: number;\n  /** Revenue for the same month a year earlier. */\n  previous: number;\n};\n\n/** Twelve months that add up to the stat cards' total revenue. */\nexport const REVENUE_DATA: RevenuePoint[] = [\n  { label: \"Jan\", current: 9840, previous: 8210 },\n  { label: \"Feb\", current: 10120, previous: 8460 },\n  { label: \"Mar\", current: 11380, previous: 9950 },\n  { label: \"Apr\", current: 10960, previous: 10240 },\n  { label: \"May\", current: 12210, previous: 10880 },\n  { label: \"Jun\", current: 12740, previous: 11020 },\n  { label: \"Jul\", current: 13980, previous: 11760 },\n  { label: \"Aug\", current: 13120, previous: 12030 },\n  { label: \"Sep\", current: 14210, previous: 12190 },\n  { label: \"Oct\", current: 14690, previous: 12480 },\n  { label: \"Nov\", current: 14360, previous: 12160 },\n  { label: \"Dec\", current: 14703.92, previous: 11924 },\n];\n\nconst formatK = (value: number) => (value >= 1000 ? `₹${Math.round(value / 1000)}k` : `₹${value}`);\nconst formatMoney = (value: number) =>\n  value.toLocaleString(\"en-US\", { minimumFractionDigits: 0, maximumFractionDigits: 0 });\n\nfunction describeDelta(current: number, previous: number) {\n  if (previous === 0) return { label: \"New\", color: \"neutral\" as const };\n  const change = ((current - previous) / previous) * 100;\n  const rounded = Math.round(change * 10) / 10;\n  if (rounded === 0) return { label: \"0%\", color: \"neutral\" as const };\n  return {\n    label: `${rounded > 0 ? \"+\" : \"\"}${rounded}%`,\n    color: rounded > 0 ? (\"lime\" as const) : (\"rose\" as const),\n  };\n}\n\n/** The active month's marker on the current-year line. */\nfunction ActiveDot({ cx: x, cy: y }: { cx?: number; cy?: number }) {\n  if (x === undefined || y === undefined) return null;\n  return (\n    <g>\n      <circle cx={x} cy={y} r={7} fill=\"var(--color-chart-2-active)\" opacity={0.25} />\n      <circle cx={x} cy={y} r={4} fill=\"var(--color-chart-2-active)\" stroke=\"var(--color-background-secondary-default)\" strokeWidth={2} />\n    </g>\n  );\n}\n\nexport function RevenueChartCard({\n  data = REVENUE_DATA,\n  title = \"Revenue\",\n  className,\n  disabled=false,\n}: {\n  /** Twelve points, one per month; defaults to the demo year. */\n  data?: RevenuePoint[];\n  disabled?:boolean;\n  /** Headline label when no month is hovered. */\n  title?: string;\n  className?: string;\n} = {}) {\n  const reduced=useMotionPreference();\n  const [activeIndex, setActiveIndex] = useState<number | null>(null);\n  const gradientId = useId();\n\n  const totalCurrent = data.reduce((sum, point) => sum + point.current, 0);\n  const totalPrevious = data.reduce((sum, point) => sum + point.previous, 0);\n  const hovering = !disabled && activeIndex !== null && activeIndex < data.length;\n  const point = hovering ? data[activeIndex] : null;\n\n  const headlineValue = point ? point.current : totalCurrent;\n  const comparison = point ? point.previous : totalPrevious;\n  const delta = describeDelta(headlineValue, comparison);\n  const monthIndex = point ? MONTHS.indexOf(point.label) : -1;\n  const label = point ? (monthIndex >= 0 ? MONTHS_FULL[monthIndex] : point.label) : title;\n  const display = useCountUp(Math.round(headlineValue));\n\n  const yMax = Math.max(1,...data.map((d) => Math.max(d.current, d.previous)));\n\n  return (\n    <section\n      className={cx(\n        \"flex h-[344px] min-w-0 flex-1 flex-col gap-6 rounded-2xl bg-background-secondary-default px-4 pt-4 pb-3\",\n        className,\n      )}\n    >\n      {/* Header: label over the count-up figure and its delta; legend on the right */}\n      <div className=\"flex w-full flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n        <div className=\"flex min-w-0 flex-col gap-0.5\">\n          <p className=\"w-full text-body-medium text-text-secondary\">{label}</p>\n          <div className=\"flex w-full items-center gap-2\">\n            <p\n              key={activeIndex ?? \"total\"}\n              className=\"animate-number-fade text-title-1-medium whitespace-nowrap text-text-primary tabular-nums\"\n            >\n              ₹{formatMoney(display)}\n            </p>\n            <Chip variant=\"bold\" color={delta.color}>\n              {delta.label}\n            </Chip>\n          </div>\n          <p className=\"text-body-2-medium text-text-tertiary tabular-nums\">\n            ₹{formatMoney(comparison)} {point ? \"a year earlier\" : \"last year\"}\n          </p>\n        </div>\n        <dl className=\"flex shrink-0 items-center gap-4 text-body-2-medium text-text-secondary\">\n          <div className=\"flex items-center gap-1.5\">\n            <span className=\"size-2 rounded-full bg-chart-2-active\" aria-hidden />\n            <dt>This year</dt>\n          </div>\n          <div className=\"flex items-center gap-1.5\">\n            <span className=\"size-2 rounded-full bg-chart-neutral\" aria-hidden />\n            <dt>Last year</dt>\n          </div>\n        </dl>\n      </div>\n\n      {/* Chart */}\n      <div className=\"min-h-0 w-full flex-1\">\n        <ResponsiveContainer width=\"100%\" height=\"100%\">\n          <ComposedChart\n            data={data}\n            accessibilityLayer={!disabled}\n            margin={{ top: 4, right: 6, bottom: 0, left: 0 }}\n            onMouseMove={(state) => {\n              if(disabled)return;\n              const index = Number(state?.activeTooltipIndex);\n              if (state?.isTooltipActive && Number.isFinite(index)) setActiveIndex(index);\n            }}\n            onMouseLeave={() => setActiveIndex(null)}\n          >\n            <defs>\n              <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n                <stop offset=\"0%\" stopColor=\"var(--color-chart-2)\" stopOpacity={0.35} />\n                <stop offset=\"100%\" stopColor=\"var(--color-chart-2)\" stopOpacity={0} />\n              </linearGradient>\n            </defs>\n            <YAxis\n              width={44}\n              domain={[0, yMax * 1.1]}\n              tickCount={4}\n              tickFormatter={formatK}\n              tickLine={false}\n              axisLine={false}\n              tick={{ fontSize: 12, fill: \"var(--color-text-tertiary)\" }}\n            />\n            <XAxis\n              dataKey=\"label\"\n              tickLine={false}\n              axisLine={false}\n              tickMargin={12}\n              interval=\"preserveStartEnd\"\n              tick={{ fontSize: 13, fill: \"var(--color-text-tertiary)\" }}\n            />\n            <Tooltip\n              content={() => null}\n              cursor={{ stroke: \"var(--color-chart-cursor)\", strokeWidth: 1, strokeDasharray: \"4 4\" }}\n            />\n            <Line\n              type=\"monotone\"\n              dataKey=\"previous\"\n              stroke=\"var(--color-chart-neutral)\"\n              strokeWidth={2}\n              strokeDasharray=\"5 5\"\n              dot={false}\n              activeDot={false}\n              isAnimationActive={reduced===false}\n              animationDuration={450}\n            />\n            <Area\n              type=\"monotone\"\n              dataKey=\"current\"\n              stroke=\"none\"\n              fill={`url(#${gradientId})`}\n              isAnimationActive={reduced===false}\n              animationDuration={450}\n            />\n            <Line\n              type=\"monotone\"\n              dataKey=\"current\"\n              stroke=\"var(--color-chart-2-active)\"\n              strokeWidth={2.5}\n              dot={false}\n              activeDot={<ActiveDot />}\n              isAnimationActive={reduced===false}\n              animationDuration={450}\n            />\n          </ComposedChart>\n        </ResponsiveContainer>\n      </div>\n      <div className=\"sr-only\"><table><caption>{title}: source data</caption><thead><tr><th scope=\"col\">Period</th><th scope=\"col\">This year</th><th scope=\"col\">Last year</th></tr></thead><tbody>{data.map((point,index)=><tr key={index}><th scope=\"row\">{point.label}</th><td>{point.current}</td><td>{point.previous}</td></tr>)}</tbody></table></div>\n    </section>\n  );\n}\n\n",
  "src/board-native-charts/source-chart-data.json": "{\n  \"provenance\": \"Observed public rendered hover labels, 26 October 2026. No private Pro source read.\",\n  \"data\": {\n    \"earnings-chart-card\": [\n      {\n        \"name\": \"Jan\",\n        \"value\": 3240.0\n      },\n      {\n        \"name\": \"Feb\",\n        \"value\": 7420.0\n      },\n      {\n        \"name\": \"Mar\",\n        \"value\": 9650.0\n      },\n      {\n        \"name\": \"Apr\",\n        \"value\": 7130.0\n      },\n      {\n        \"name\": \"May\",\n        \"value\": 3670.0\n      },\n      {\n        \"name\": \"Jun\",\n        \"value\": 2300.0\n      },\n      {\n        \"name\": \"Jul\",\n        \"value\": 3820.0\n      },\n      {\n        \"name\": \"Aug\",\n        \"value\": 5040.0\n      },\n      {\n        \"name\": \"Sep\",\n        \"value\": 6840.0\n      },\n      {\n        \"name\": \"Oct\",\n        \"value\": 4540.0\n      },\n      {\n        \"name\": \"Nov\",\n        \"value\": 11520.0\n      },\n      {\n        \"name\": \"Dec\",\n        \"value\": 8210.0\n      }\n    ],\n    \"line-chart-card\": [\n      {\n        \"name\": \"Jan\",\n        \"value\": 1400.0\n      },\n      {\n        \"name\": \"Feb\",\n        \"value\": 1900.0\n      },\n      {\n        \"name\": \"Mar\",\n        \"value\": 2600.0\n      },\n      {\n        \"name\": \"Apr\",\n        \"value\": 2300.0\n      },\n      {\n        \"name\": \"May\",\n        \"value\": 3400.0\n      },\n      {\n        \"name\": \"Jun\",\n        \"value\": 3100.0\n      },\n      {\n        \"name\": \"Jul\",\n        \"value\": 2700.0\n      },\n      {\n        \"name\": \"Aug\",\n        \"value\": 3800.0\n      },\n      {\n        \"name\": \"Sep\",\n        \"value\": 4600.0\n      },\n      {\n        \"name\": \"Oct\",\n        \"value\": 4200.0\n      },\n      {\n        \"name\": \"Nov\",\n        \"value\": 3600.0\n      },\n      {\n        \"name\": \"Dec\",\n        \"value\": 5200.0\n      }\n    ],\n    \"area-chart-card\": [\n      {\n        \"name\": \"Jan\",\n        \"value\": 4400.0,\n        \"series\": [\n          {\n            \"name\": \"Organic\",\n            \"value\": 2400.0\n          },\n          {\n            \"name\": \"Referral\",\n            \"value\": 1200.0\n          },\n          {\n            \"name\": \"Paid\",\n            \"value\": 800.0\n          }\n        ]\n      },\n      {\n        \"name\": \"Feb\",\n        \"value\": 4900.0,\n        \"series\": [\n          {\n            \"name\": \"Organic\",\n            \"value\": 2800.0\n          },\n          {\n            \"name\": \"Referral\",\n            \"value\": 1400.0\n          },\n          {\n            \"name\": \"Paid\",\n            \"value\": 700.0\n          }\n        ]\n      },\n      {\n        \"name\": \"Mar\",\n        \"value\": 5600.0,\n        \"series\": [\n          {\n            \"name\": \"Organic\",\n            \"value\": 3200.0\n          },\n          {\n            \"name\": \"Referral\",\n            \"value\": 1300.0\n          },\n          {\n            \"name\": \"Paid\",\n            \"value\": 1100.0\n          }\n        ]\n      },\n      {\n        \"name\": \"Apr\",\n        \"value\": 5600.0,\n        \"series\": [\n          {\n            \"name\": \"Organic\",\n            \"value\": 3000.0\n          },\n          {\n            \"name\": \"Referral\",\n            \"value\": 1700.0\n          },\n          {\n            \"name\": \"Paid\",\n            \"value\": 900.0\n          }\n        ]\n      },\n      {\n        \"name\": \"May\",\n        \"value\": 6800.0,\n        \"series\": [\n          {\n            \"name\": \"Organic\",\n            \"value\": 3600.0\n          },\n          {\n            \"name\": \"Referral\",\n            \"value\": 1900.0\n          },\n          {\n            \"name\": \"Paid\",\n            \"value\": 1300.0\n          }\n        ]\n      },\n      {\n        \"name\": \"Jun\",\n        \"value\": 7500.0,\n        \"series\": [\n          {\n            \"name\": \"Organic\",\n            \"value\": 4200.0\n          },\n          {\n            \"name\": \"Referral\",\n            \"value\": 1800.0\n          },\n          {\n            \"name\": \"Paid\",\n            \"value\": 1500.0\n          }\n        ]\n      },\n      {\n        \"name\": \"Jul\",\n        \"value\": 8200.0,\n        \"series\": [\n          {\n            \"name\": \"Organic\",\n            \"value\": 4600.0\n          },\n          {\n            \"name\": \"Referral\",\n            \"value\": 2200.0\n          },\n          {\n            \"name\": \"Paid\",\n            \"value\": 1400.0\n          }\n        ]\n      },\n      {\n        \"name\": \"Aug\",\n        \"value\": 8700.0,\n        \"series\": [\n          {\n            \"name\": \"Organic\",\n            \"value\": 4400.0\n          },\n          {\n            \"name\": \"Referral\",\n            \"value\": 2500.0\n          },\n          {\n            \"name\": \"Paid\",\n            \"value\": 1800.0\n          }\n        ]\n      },\n      {\n        \"name\": \"Sep\",\n        \"value\": 9500.0,\n        \"series\": [\n          {\n            \"name\": \"Organic\",\n            \"value\": 5100.0\n          },\n          {\n            \"name\": \"Referral\",\n            \"value\": 2400.0\n          },\n          {\n            \"name\": \"Paid\",\n            \"value\": 2000.0\n          }\n        ]\n      },\n      {\n        \"name\": \"Oct\",\n        \"value\": 10400.0,\n        \"series\": [\n          {\n            \"name\": \"Organic\",\n            \"value\": 5600.0\n          },\n          {\n            \"name\": \"Referral\",\n            \"value\": 2900.0\n          },\n          {\n            \"name\": \"Paid\",\n            \"value\": 1900.0\n          }\n        ]\n      },\n      {\n        \"name\": \"Nov\",\n        \"value\": 10900.0,\n        \"series\": [\n          {\n            \"name\": \"Organic\",\n            \"value\": 5400.0\n          },\n          {\n            \"name\": \"Referral\",\n            \"value\": 3200.0\n          },\n          {\n            \"name\": \"Paid\",\n            \"value\": 2300.0\n          }\n        ]\n      },\n      {\n        \"name\": \"Dec\",\n        \"value\": 12200.0,\n        \"series\": [\n          {\n            \"name\": \"Organic\",\n            \"value\": 6200.0\n          },\n          {\n            \"name\": \"Referral\",\n            \"value\": 3400.0\n          },\n          {\n            \"name\": \"Paid\",\n            \"value\": 2600.0\n          }\n        ]\n      }\n    ],\n    \"combo-chart-card\": [\n      {\n        \"name\": \"Jan\",\n        \"value\": 4200.0,\n        \"secondary\": 2.4\n      },\n      {\n        \"name\": \"Feb\",\n        \"value\": 4800.0,\n        \"secondary\": 2.6\n      },\n      {\n        \"name\": \"Mar\",\n        \"value\": 5600.0,\n        \"secondary\": 3.1\n      },\n      {\n        \"name\": \"Apr\",\n        \"value\": 5200.0,\n        \"secondary\": 2.9\n      },\n      {\n        \"name\": \"May\",\n        \"value\": 6400.0,\n        \"secondary\": 3.4\n      },\n      {\n        \"name\": \"Jun\",\n        \"value\": 7100.0,\n        \"secondary\": 3.8\n      },\n      {\n        \"name\": \"Jul\",\n        \"value\": 6800.0,\n        \"secondary\": 3.6\n      },\n      {\n        \"name\": \"Aug\",\n        \"value\": 7600.0,\n        \"secondary\": 4.1\n      },\n      {\n        \"name\": \"Sep\",\n        \"value\": 8400.0,\n        \"secondary\": 4.4\n      },\n      {\n        \"name\": \"Oct\",\n        \"value\": 8100.0,\n        \"secondary\": 4.2\n      },\n      {\n        \"name\": \"Nov\",\n        \"value\": 9200.0,\n        \"secondary\": 4.8\n      },\n      {\n        \"name\": \"Dec\",\n        \"value\": 9800.0,\n        \"secondary\": 5.2\n      }\n    ],\n    \"steps-card\": [\n      {\n        \"name\": \"Mon\",\n        \"value\": 5600.0,\n        \"goal\": 8000\n      },\n      {\n        \"name\": \"Tue\",\n        \"value\": 2200.0,\n        \"goal\": 8000\n      },\n      {\n        \"name\": \"Wed\",\n        \"value\": 1900.0,\n        \"goal\": 8000\n      },\n      {\n        \"name\": \"Thu\",\n        \"value\": 6300.0,\n        \"goal\": 8000\n      },\n      {\n        \"name\": \"Fri\",\n        \"value\": 7100.0,\n        \"goal\": 8000\n      },\n      {\n        \"name\": \"Sat\",\n        \"value\": 5300.0,\n        \"goal\": 8000\n      },\n      {\n        \"name\": \"Sun\",\n        \"value\": 3200.0,\n        \"goal\": 8000\n      }\n    ],\n    \"scatter-chart-card\": [\n      {\n        \"name\": \"Acme\",\n        \"x\": 12,\n        \"value\": 180,\n        \"z\": 40.0,\n        \"group\": \"Starter\",\n        \"color\": \"var(--color-chart-2)\"\n      },\n      {\n        \"name\": \"Bolt\",\n        \"x\": 18,\n        \"value\": 240,\n        \"z\": 60.0,\n        \"group\": \"Starter\",\n        \"color\": \"var(--color-chart-2)\"\n      },\n      {\n        \"name\": \"Corvus\",\n        \"x\": 24,\n        \"value\": 210,\n        \"z\": 30.0,\n        \"group\": \"Starter\",\n        \"color\": \"var(--color-chart-2)\"\n      },\n      {\n        \"name\": \"Delta\",\n        \"x\": 31,\n        \"value\": 320,\n        \"z\": 80.0,\n        \"group\": \"Starter\",\n        \"color\": \"var(--color-chart-2)\"\n      },\n      {\n        \"name\": \"Ember\",\n        \"x\": 38,\n        \"value\": 290,\n        \"z\": 50.0,\n        \"group\": \"Starter\",\n        \"color\": \"var(--color-chart-2)\"\n      },\n      {\n        \"name\": \"Flux\",\n        \"x\": 45,\n        \"value\": 380,\n        \"z\": 70.0,\n        \"group\": \"Starter\",\n        \"color\": \"var(--color-chart-2)\"\n      },\n      {\n        \"name\": \"Gale\",\n        \"x\": 42,\n        \"value\": 620,\n        \"z\": 90.0,\n        \"group\": \"Growth\",\n        \"color\": \"var(--color-chart-6)\"\n      },\n      {\n        \"name\": \"Helio\",\n        \"x\": 55,\n        \"value\": 740,\n        \"z\": 120.0,\n        \"group\": \"Growth\",\n        \"color\": \"var(--color-chart-6)\"\n      },\n      {\n        \"name\": \"Ionic\",\n        \"x\": 61,\n        \"value\": 690,\n        \"z\": 70.0,\n        \"group\": \"Growth\",\n        \"color\": \"var(--color-chart-6)\"\n      },\n      {\n        \"name\": \"Juno\",\n        \"x\": 68,\n        \"value\": 880,\n        \"z\": 150.0,\n        \"group\": \"Growth\",\n        \"color\": \"var(--color-chart-6)\"\n      },\n      {\n        \"name\": \"Kite\",\n        \"x\": 74,\n        \"value\": 810,\n        \"z\": 100.0,\n        \"group\": \"Growth\",\n        \"color\": \"var(--color-chart-6)\"\n      },\n      {\n        \"name\": \"Lumen\",\n        \"x\": 83,\n        \"value\": 960,\n        \"z\": 130.0,\n        \"group\": \"Growth\",\n        \"color\": \"var(--color-chart-6)\"\n      },\n      {\n        \"name\": \"Meridian\",\n        \"x\": 78,\n        \"value\": 1240,\n        \"z\": 180.0,\n        \"group\": \"Scale\",\n        \"color\": \"var(--color-chart-5)\"\n      },\n      {\n        \"name\": \"Nova\",\n        \"x\": 86,\n        \"value\": 1420,\n        \"z\": 220.0,\n        \"group\": \"Scale\",\n        \"color\": \"var(--color-chart-5)\"\n      },\n      {\n        \"name\": \"Orbit\",\n        \"x\": 92,\n        \"value\": 1310,\n        \"z\": 160.0,\n        \"group\": \"Scale\",\n        \"color\": \"var(--color-chart-5)\"\n      },\n      {\n        \"name\": \"Prism\",\n        \"x\": 97,\n        \"value\": 1580,\n        \"z\": 260.0,\n        \"group\": \"Scale\",\n        \"color\": \"var(--color-chart-5)\"\n      }\n    ],\n    \"heatmap-chart-card\": [\n      {\n        \"name\": \"Mon 00:00\",\n        \"value\": 4,\n        \"intensity\": 14\n      },\n      {\n        \"name\": \"Mon 02:00\",\n        \"value\": 2,\n        \"intensity\": 11\n      },\n      {\n        \"name\": \"Mon 04:00\",\n        \"value\": 1,\n        \"intensity\": 9\n      },\n      {\n        \"name\": \"Mon 06:00\",\n        \"value\": 6,\n        \"intensity\": 17\n      },\n      {\n        \"name\": \"Mon 08:00\",\n        \"value\": 28,\n        \"intensity\": 48\n      },\n      {\n        \"name\": \"Mon 10:00\",\n        \"value\": 46,\n        \"intensity\": 74\n      },\n      {\n        \"name\": \"Mon 12:00\",\n        \"value\": 52,\n        \"intensity\": 83\n      },\n      {\n        \"name\": \"Mon 14:00\",\n        \"value\": 58,\n        \"intensity\": 91\n      },\n      {\n        \"name\": \"Mon 16:00\",\n        \"value\": 44,\n        \"intensity\": 71\n      },\n      {\n        \"name\": \"Mon 18:00\",\n        \"value\": 30,\n        \"intensity\": 51\n      },\n      {\n        \"name\": \"Mon 20:00\",\n        \"value\": 18,\n        \"intensity\": 34\n      },\n      {\n        \"name\": \"Mon 22:00\",\n        \"value\": 9,\n        \"intensity\": 21\n      },\n      {\n        \"name\": \"Tue 00:00\",\n        \"value\": 3,\n        \"intensity\": 12\n      },\n      {\n        \"name\": \"Tue 02:00\",\n        \"value\": 2,\n        \"intensity\": 11\n      },\n      {\n        \"name\": \"Tue 04:00\",\n        \"value\": 2,\n        \"intensity\": 11\n      },\n      {\n        \"name\": \"Tue 06:00\",\n        \"value\": 8,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Tue 08:00\",\n        \"value\": 32,\n        \"intensity\": 54\n      },\n      {\n        \"name\": \"Tue 10:00\",\n        \"value\": 50,\n        \"intensity\": 80\n      },\n      {\n        \"name\": \"Tue 12:00\",\n        \"value\": 55,\n        \"intensity\": 87\n      },\n      {\n        \"name\": \"Tue 14:00\",\n        \"value\": 62,\n        \"intensity\": 97\n      },\n      {\n        \"name\": \"Tue 16:00\",\n        \"value\": 48,\n        \"intensity\": 77\n      },\n      {\n        \"name\": \"Tue 18:00\",\n        \"value\": 33,\n        \"intensity\": 55\n      },\n      {\n        \"name\": \"Tue 20:00\",\n        \"value\": 20,\n        \"intensity\": 37\n      },\n      {\n        \"name\": \"Tue 22:00\",\n        \"value\": 10,\n        \"intensity\": 22\n      },\n      {\n        \"name\": \"Wed 00:00\",\n        \"value\": 5,\n        \"intensity\": 15\n      },\n      {\n        \"name\": \"Wed 02:00\",\n        \"value\": 3,\n        \"intensity\": 12\n      },\n      {\n        \"name\": \"Wed 04:00\",\n        \"value\": 1,\n        \"intensity\": 9\n      },\n      {\n        \"name\": \"Wed 06:00\",\n        \"value\": 7,\n        \"intensity\": 18\n      },\n      {\n        \"name\": \"Wed 08:00\",\n        \"value\": 30,\n        \"intensity\": 51\n      },\n      {\n        \"name\": \"Wed 10:00\",\n        \"value\": 48,\n        \"intensity\": 77\n      },\n      {\n        \"name\": \"Wed 12:00\",\n        \"value\": 57,\n        \"intensity\": 90\n      },\n      {\n        \"name\": \"Wed 14:00\",\n        \"value\": 60,\n        \"intensity\": 94\n      },\n      {\n        \"name\": \"Wed 16:00\",\n        \"value\": 47,\n        \"intensity\": 76\n      },\n      {\n        \"name\": \"Wed 18:00\",\n        \"value\": 31,\n        \"intensity\": 53\n      },\n      {\n        \"name\": \"Wed 20:00\",\n        \"value\": 19,\n        \"intensity\": 35\n      },\n      {\n        \"name\": \"Wed 22:00\",\n        \"value\": 8,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Thu 00:00\",\n        \"value\": 4,\n        \"intensity\": 14\n      },\n      {\n        \"name\": \"Thu 02:00\",\n        \"value\": 2,\n        \"intensity\": 11\n      },\n      {\n        \"name\": \"Thu 04:00\",\n        \"value\": 2,\n        \"intensity\": 11\n      },\n      {\n        \"name\": \"Thu 06:00\",\n        \"value\": 9,\n        \"intensity\": 21\n      },\n      {\n        \"name\": \"Thu 08:00\",\n        \"value\": 34,\n        \"intensity\": 57\n      },\n      {\n        \"name\": \"Thu 10:00\",\n        \"value\": 52,\n        \"intensity\": 83\n      },\n      {\n        \"name\": \"Thu 12:00\",\n        \"value\": 60,\n        \"intensity\": 94\n      },\n      {\n        \"name\": \"Thu 14:00\",\n        \"value\": 64,\n        \"intensity\": 100\n      },\n      {\n        \"name\": \"Thu 16:00\",\n        \"value\": 50,\n        \"intensity\": 80\n      },\n      {\n        \"name\": \"Thu 18:00\",\n        \"value\": 35,\n        \"intensity\": 58\n      },\n      {\n        \"name\": \"Thu 20:00\",\n        \"value\": 22,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Thu 22:00\",\n        \"value\": 11,\n        \"intensity\": 24\n      },\n      {\n        \"name\": \"Fri 00:00\",\n        \"value\": 6,\n        \"intensity\": 17\n      },\n      {\n        \"name\": \"Fri 02:00\",\n        \"value\": 3,\n        \"intensity\": 12\n      },\n      {\n        \"name\": \"Fri 04:00\",\n        \"value\": 2,\n        \"intensity\": 11\n      },\n      {\n        \"name\": \"Fri 06:00\",\n        \"value\": 8,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Fri 08:00\",\n        \"value\": 29,\n        \"intensity\": 50\n      },\n      {\n        \"name\": \"Fri 10:00\",\n        \"value\": 44,\n        \"intensity\": 71\n      },\n      {\n        \"name\": \"Fri 12:00\",\n        \"value\": 49,\n        \"intensity\": 78\n      },\n      {\n        \"name\": \"Fri 14:00\",\n        \"value\": 46,\n        \"intensity\": 74\n      },\n      {\n        \"name\": \"Fri 16:00\",\n        \"value\": 36,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Fri 18:00\",\n        \"value\": 24,\n        \"intensity\": 43\n      },\n      {\n        \"name\": \"Fri 20:00\",\n        \"value\": 15,\n        \"intensity\": 30\n      },\n      {\n        \"name\": \"Fri 22:00\",\n        \"value\": 9,\n        \"intensity\": 21\n      },\n      {\n        \"name\": \"Sat 00:00\",\n        \"value\": 8,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Sat 02:00\",\n        \"value\": 5,\n        \"intensity\": 15\n      },\n      {\n        \"name\": \"Sat 04:00\",\n        \"value\": 3,\n        \"intensity\": 12\n      },\n      {\n        \"name\": \"Sat 06:00\",\n        \"value\": 4,\n        \"intensity\": 14\n      },\n      {\n        \"name\": \"Sat 08:00\",\n        \"value\": 12,\n        \"intensity\": 25\n      },\n      {\n        \"name\": \"Sat 10:00\",\n        \"value\": 20,\n        \"intensity\": 37\n      },\n      {\n        \"name\": \"Sat 12:00\",\n        \"value\": 26,\n        \"intensity\": 45\n      },\n      {\n        \"name\": \"Sat 14:00\",\n        \"value\": 28,\n        \"intensity\": 48\n      },\n      {\n        \"name\": \"Sat 16:00\",\n        \"value\": 25,\n        \"intensity\": 44\n      },\n      {\n        \"name\": \"Sat 18:00\",\n        \"value\": 22,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Sat 20:00\",\n        \"value\": 16,\n        \"intensity\": 31\n      },\n      {\n        \"name\": \"Sat 22:00\",\n        \"value\": 12,\n        \"intensity\": 25\n      },\n      {\n        \"name\": \"Sun 00:00\",\n        \"value\": 7,\n        \"intensity\": 18\n      },\n      {\n        \"name\": \"Sun 02:00\",\n        \"value\": 4,\n        \"intensity\": 14\n      },\n      {\n        \"name\": \"Sun 04:00\",\n        \"value\": 2,\n        \"intensity\": 11\n      },\n      {\n        \"name\": \"Sun 06:00\",\n        \"value\": 3,\n        \"intensity\": 12\n      },\n      {\n        \"name\": \"Sun 08:00\",\n        \"value\": 10,\n        \"intensity\": 22\n      },\n      {\n        \"name\": \"Sun 10:00\",\n        \"value\": 17,\n        \"intensity\": 32\n      },\n      {\n        \"name\": \"Sun 12:00\",\n        \"value\": 22,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Sun 14:00\",\n        \"value\": 24,\n        \"intensity\": 43\n      },\n      {\n        \"name\": \"Sun 16:00\",\n        \"value\": 23,\n        \"intensity\": 41\n      },\n      {\n        \"name\": \"Sun 18:00\",\n        \"value\": 20,\n        \"intensity\": 37\n      },\n      {\n        \"name\": \"Sun 20:00\",\n        \"value\": 14,\n        \"intensity\": 28\n      },\n      {\n        \"name\": \"Sun 22:00\",\n        \"value\": 10,\n        \"intensity\": 22\n      }\n    ],\n    \"contributions-card\": [\n      {\n        \"name\": \"Jan 1\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Jan 11\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Jan 21\",\n        \"value\": 23,\n        \"intensity\": 80\n      },\n      {\n        \"name\": \"Jan 31\",\n        \"value\": 3,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Feb 10\",\n        \"value\": 1,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Feb 19\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Mar 1\",\n        \"value\": 10,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Mar 11\",\n        \"value\": 3,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Mar 21\",\n        \"value\": 12,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Mar 31\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Apr 10\",\n        \"value\": 4,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Apr 20\",\n        \"value\": 2,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Apr 30\",\n        \"value\": 12,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"May 9\",\n        \"value\": 2,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"May 19\",\n        \"value\": 13,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"May 29\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Jun 8\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Jun 18\",\n        \"value\": 20,\n        \"intensity\": 80\n      },\n      {\n        \"name\": \"Jun 28\",\n        \"value\": 1,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Jul 8\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Jul 18\",\n        \"value\": 4,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Jul 27\",\n        \"value\": 9,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Aug 6\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Aug 16\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Aug 26\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Sep 5\",\n        \"value\": 3,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Sep 15\",\n        \"value\": 13,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Sep 25\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Oct 5\",\n        \"value\": 2,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Oct 14\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Oct 24\",\n        \"value\": 4,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Nov 3\",\n        \"value\": 19,\n        \"intensity\": 80\n      },\n      {\n        \"name\": \"Nov 13\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Nov 23\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Dec 3\",\n        \"value\": 11,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Dec 13\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Dec 23\",\n        \"value\": 9,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Jan 2\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Jan 12\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Jan 22\",\n        \"value\": 36,\n        \"intensity\": 100\n      },\n      {\n        \"name\": \"Feb 1\",\n        \"value\": 4,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Feb 11\",\n        \"value\": 3,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Feb 21\",\n        \"value\": 1,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Mar 3\",\n        \"value\": 3,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Mar 13\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Mar 22\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Apr 1\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Apr 11\",\n        \"value\": 9,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Apr 21\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"May 1\",\n        \"value\": 9,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"May 11\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"May 21\",\n        \"value\": 3,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"May 31\",\n        \"value\": 3,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Jun 9\",\n        \"value\": 3,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Jun 19\",\n        \"value\": 10,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Jun 29\",\n        \"value\": 13,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Jul 9\",\n        \"value\": 18,\n        \"intensity\": 80\n      },\n      {\n        \"name\": \"Jul 19\",\n        \"value\": 9,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Jul 29\",\n        \"value\": 2,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Aug 8\",\n        \"value\": 3,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Aug 18\",\n        \"value\": 1,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Aug 27\",\n        \"value\": 4,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Sep 6\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Sep 16\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Sep 26\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Oct 6\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Oct 16\",\n        \"value\": 1,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Oct 26\",\n        \"value\": 8,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Nov 5\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Nov 14\",\n        \"value\": 24,\n        \"intensity\": 80\n      },\n      {\n        \"name\": \"Nov 24\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Dec 4\",\n        \"value\": 11,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Dec 14\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Dec 24\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Jan 4\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Jan 14\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Jan 24\",\n        \"value\": 1,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Feb 2\",\n        \"value\": 1,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Feb 12\",\n        \"value\": 20,\n        \"intensity\": 80\n      },\n      {\n        \"name\": \"Feb 22\",\n        \"value\": 19,\n        \"intensity\": 80\n      },\n      {\n        \"name\": \"Mar 4\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Mar 14\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Mar 24\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Apr 3\",\n        \"value\": 26,\n        \"intensity\": 100\n      },\n      {\n        \"name\": \"Apr 13\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Apr 22\",\n        \"value\": 2,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"May 2\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"May 12\",\n        \"value\": 9,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"May 22\",\n        \"value\": 1,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Jun 1\",\n        \"value\": 3,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Jun 11\",\n        \"value\": 2,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Jun 21\",\n        \"value\": 2,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Jul 1\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Jul 10\",\n        \"value\": 21,\n        \"intensity\": 80\n      },\n      {\n        \"name\": \"Jul 20\",\n        \"value\": 9,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Jul 30\",\n        \"value\": 3,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Aug 9\",\n        \"value\": 21,\n        \"intensity\": 80\n      },\n      {\n        \"name\": \"Aug 19\",\n        \"value\": 22,\n        \"intensity\": 80\n      },\n      {\n        \"name\": \"Aug 29\",\n        \"value\": 4,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Sep 8\",\n        \"value\": 9,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Sep 18\",\n        \"value\": 13,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Sep 27\",\n        \"value\": 15,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Oct 7\",\n        \"value\": 29,\n        \"intensity\": 100\n      },\n      {\n        \"name\": \"Oct 17\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Oct 27\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Nov 6\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Nov 16\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Nov 26\",\n        \"value\": 30,\n        \"intensity\": 100\n      },\n      {\n        \"name\": \"Dec 6\",\n        \"value\": 1,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Dec 15\",\n        \"value\": 10,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Dec 25\",\n        \"value\": 27,\n        \"intensity\": 100\n      },\n      {\n        \"name\": \"Jan 5\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Jan 15\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Jan 25\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Feb 4\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Feb 14\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Feb 24\",\n        \"value\": 38,\n        \"intensity\": 100\n      },\n      {\n        \"name\": \"Mar 5\",\n        \"value\": 15,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Mar 15\",\n        \"value\": 4,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Mar 25\",\n        \"value\": 9,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Apr 4\",\n        \"value\": 3,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Apr 14\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Apr 24\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"May 4\",\n        \"value\": 10,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"May 14\",\n        \"value\": 34,\n        \"intensity\": 100\n      },\n      {\n        \"name\": \"May 23\",\n        \"value\": 3,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Jun 2\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Jun 12\",\n        \"value\": 1,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Jun 22\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Jul 2\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Jul 12\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Jul 22\",\n        \"value\": 9,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Aug 1\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Aug 11\",\n        \"value\": 1,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Aug 20\",\n        \"value\": 1,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Aug 30\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Sep 9\",\n        \"value\": 2,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Sep 19\",\n        \"value\": 1,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Sep 29\",\n        \"value\": 1,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Oct 9\",\n        \"value\": 4,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Oct 19\",\n        \"value\": 16,\n        \"intensity\": 80\n      },\n      {\n        \"name\": \"Oct 29\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Nov 7\",\n        \"value\": 1,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Nov 17\",\n        \"value\": 2,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Nov 27\",\n        \"value\": 11,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Dec 7\",\n        \"value\": 14,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Dec 17\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Dec 27\",\n        \"value\": 21,\n        \"intensity\": 80\n      },\n      {\n        \"name\": \"Jan 7\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Jan 17\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Jan 26\",\n        \"value\": 14,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Feb 5\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Feb 15\",\n        \"value\": 10,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Feb 25\",\n        \"value\": 1,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Mar 7\",\n        \"value\": 9,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Mar 17\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Mar 27\",\n        \"value\": 34,\n        \"intensity\": 100\n      },\n      {\n        \"name\": \"Apr 6\",\n        \"value\": 9,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Apr 15\",\n        \"value\": 13,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Apr 25\",\n        \"value\": 2,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"May 5\",\n        \"value\": 3,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"May 15\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"May 25\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Jun 4\",\n        \"value\": 17,\n        \"intensity\": 80\n      },\n      {\n        \"name\": \"Jun 14\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Jun 24\",\n        \"value\": 33,\n        \"intensity\": 100\n      },\n      {\n        \"name\": \"Jul 3\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Jul 13\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Jul 23\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Aug 2\",\n        \"value\": 2,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Aug 12\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Aug 22\",\n        \"value\": 9,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Sep 1\",\n        \"value\": 9,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Sep 11\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Sep 20\",\n        \"value\": 1,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Sep 30\",\n        \"value\": 12,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Oct 10\",\n        \"value\": 2,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Oct 20\",\n        \"value\": 9,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Oct 30\",\n        \"value\": 2,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Nov 9\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Nov 19\",\n        \"value\": 4,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Nov 29\",\n        \"value\": 12,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Dec 8\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Dec 18\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Dec 28\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Jan 8\",\n        \"value\": 3,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Jan 18\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Jan 28\",\n        \"value\": 4,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Feb 7\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Feb 17\",\n        \"value\": 9,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Feb 26\",\n        \"value\": 2,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Mar 8\",\n        \"value\": 9,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Mar 18\",\n        \"value\": 2,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Mar 28\",\n        \"value\": 12,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Apr 7\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Apr 17\",\n        \"value\": 14,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Apr 27\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"May 7\",\n        \"value\": 3,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"May 16\",\n        \"value\": 3,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"May 26\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Jun 5\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Jun 15\",\n        \"value\": 15,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Jun 25\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Jul 5\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Jul 15\",\n        \"value\": 24,\n        \"intensity\": 80\n      },\n      {\n        \"name\": \"Jul 25\",\n        \"value\": 1,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Aug 3\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Aug 13\",\n        \"value\": 3,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Aug 23\",\n        \"value\": 4,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Sep 2\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Sep 12\",\n        \"value\": 3,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Sep 22\",\n        \"value\": 4,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Oct 2\",\n        \"value\": 3,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Oct 12\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Oct 21\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Oct 31\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Nov 10\",\n        \"value\": 2,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Nov 20\",\n        \"value\": 3,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Nov 30\",\n        \"value\": 15,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Dec 10\",\n        \"value\": 14,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Dec 20\",\n        \"value\": 9,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Dec 30\",\n        \"value\": 4,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Jan 9\",\n        \"value\": 15,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Jan 19\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Jan 29\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Feb 8\",\n        \"value\": 15,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Feb 18\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Feb 28\",\n        \"value\": 11,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Mar 10\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Mar 20\",\n        \"value\": 10,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Mar 29\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Apr 8\",\n        \"value\": 23,\n        \"intensity\": 80\n      },\n      {\n        \"name\": \"Apr 18\",\n        \"value\": 35,\n        \"intensity\": 100\n      },\n      {\n        \"name\": \"Apr 28\",\n        \"value\": 12,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"May 8\",\n        \"value\": 9,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"May 18\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"May 28\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Jun 7\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Jun 16\",\n        \"value\": 11,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Jun 26\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Jul 6\",\n        \"value\": 33,\n        \"intensity\": 100\n      },\n      {\n        \"name\": \"Jul 16\",\n        \"value\": 11,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Jul 26\",\n        \"value\": 1,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Aug 5\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Aug 15\",\n        \"value\": 2,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Aug 25\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Sep 3\",\n        \"value\": 13,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Sep 13\",\n        \"value\": 9,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Sep 23\",\n        \"value\": 21,\n        \"intensity\": 80\n      },\n      {\n        \"name\": \"Oct 3\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Oct 13\",\n        \"value\": 4,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Oct 23\",\n        \"value\": 6,\n        \"intensity\": 40\n      },\n      {\n        \"name\": \"Nov 2\",\n        \"value\": 12,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Nov 12\",\n        \"value\": 3,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Nov 21\",\n        \"value\": 3,\n        \"intensity\": 20\n      },\n      {\n        \"name\": \"Dec 1\",\n        \"value\": 10,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Dec 11\",\n        \"value\": 15,\n        \"intensity\": 60\n      },\n      {\n        \"name\": \"Dec 21\",\n        \"value\": 0,\n        \"intensity\": 0\n      },\n      {\n        \"name\": \"Dec 31\",\n        \"value\": 2,\n        \"intensity\": 20\n      }\n    ],\n    \"sankey-chart-card\": [\n      {\n        \"name\": \"Focus \\u2192 Browsing\",\n        \"source\": \"Focus\",\n        \"target\": \"Browsing\",\n        \"value\": 10.4,\n        \"unit\": \"h\"\n      },\n      {\n        \"name\": \"Focus \\u2192 Writing\",\n        \"source\": \"Focus\",\n        \"target\": \"Writing\",\n        \"value\": 8.2,\n        \"unit\": \"h\"\n      },\n      {\n        \"name\": \"Focus \\u2192 Messaging\",\n        \"source\": \"Focus\",\n        \"target\": \"Messaging\",\n        \"value\": 6.1,\n        \"unit\": \"h\"\n      },\n      {\n        \"name\": \"Focus \\u2192 Productivity\",\n        \"source\": \"Focus\",\n        \"target\": \"Productivity\",\n        \"value\": 5,\n        \"unit\": \"h\"\n      },\n      {\n        \"name\": \"Focus \\u2192 Email\",\n        \"source\": \"Focus\",\n        \"target\": \"Email\",\n        \"value\": 2.3,\n        \"unit\": \"h\"\n      },\n      {\n        \"name\": \"Meetings \\u2192 Video calls\",\n        \"source\": \"Meetings\",\n        \"target\": \"Video calls\",\n        \"value\": 9.6,\n        \"unit\": \"h\"\n      },\n      {\n        \"name\": \"Meetings \\u2192 Everything else\",\n        \"source\": \"Meetings\",\n        \"target\": \"Everything else\",\n        \"value\": 3.8,\n        \"unit\": \"h\"\n      },\n      {\n        \"name\": \"Meetings \\u2192 Writing\",\n        \"source\": \"Meetings\",\n        \"target\": \"Writing\",\n        \"value\": 3,\n        \"unit\": \"h\"\n      },\n      {\n        \"name\": \"Meetings \\u2192 Email\",\n        \"source\": \"Meetings\",\n        \"target\": \"Email\",\n        \"value\": 1.6,\n        \"unit\": \"h\"\n      },\n      {\n        \"name\": \"Breaks \\u2192 Everything else\",\n        \"source\": \"Breaks\",\n        \"target\": \"Everything else\",\n        \"value\": 5.6,\n        \"unit\": \"h\"\n      },\n      {\n        \"name\": \"Breaks \\u2192 Browsing\",\n        \"source\": \"Breaks\",\n        \"target\": \"Browsing\",\n        \"value\": 3.6,\n        \"unit\": \"h\"\n      },\n      {\n        \"name\": \"Breaks \\u2192 Video calls\",\n        \"source\": \"Breaks\",\n        \"target\": \"Video calls\",\n        \"value\": 2.8,\n        \"unit\": \"h\"\n      },\n      {\n        \"name\": \"Admin \\u2192 Productivity\",\n        \"source\": \"Admin\",\n        \"target\": \"Productivity\",\n        \"value\": 5.2,\n        \"unit\": \"h\"\n      },\n      {\n        \"name\": \"Admin \\u2192 Writing\",\n        \"source\": \"Admin\",\n        \"target\": \"Writing\",\n        \"value\": 4,\n        \"unit\": \"h\"\n      },\n      {\n        \"name\": \"Admin \\u2192 Messaging\",\n        \"source\": \"Admin\",\n        \"target\": \"Messaging\",\n        \"value\": 3.2,\n        \"unit\": \"h\"\n      },\n      {\n        \"name\": \"Admin \\u2192 Everything else\",\n        \"source\": \"Admin\",\n        \"target\": \"Everything else\",\n        \"value\": 1.6,\n        \"unit\": \"h\"\n      },\n      {\n        \"name\": \"Learning \\u2192 Browsing\",\n        \"source\": \"Learning\",\n        \"target\": \"Browsing\",\n        \"value\": 4.6,\n        \"unit\": \"h\"\n      },\n      {\n        \"name\": \"Learning \\u2192 Email\",\n        \"source\": \"Learning\",\n        \"target\": \"Email\",\n        \"value\": 3.4,\n        \"unit\": \"h\"\n      },\n      {\n        \"name\": \"Learning \\u2192 Messaging\",\n        \"source\": \"Learning\",\n        \"target\": \"Messaging\",\n        \"value\": 2,\n        \"unit\": \"h\"\n      }\n    ]\n  },\n  \"scatterEvidence\": \"Sixteen public SVG x/z attributes and settled 650ms hover headers, observed on 2026-10-26.\",\n  \"heatmapEvidence\": \"Eighty-four public rendered role=img labels and cell intensity percentages observed on 2026-10-26.\",\n  \"finiteVisualEvidence\": {\n    \"reference\": \"https://www.boardui.com/components/\",\n    \"date\": \"2026-10-27\",\n    \"contributions\": \"259 publicly rendered aria labels and tier states in DOM order.\",\n    \"sankey\": \"19 public rendered link widths / public source-node totals (86h); geometry and labels measured from visible SVG.\"\n  }\n}\n",
  "src/board-native-charts/source-section-copy.json": "{\n  \"area-chart-card\": {\n    \"variants\": \"Use stacked areas to read combined volume, overlapping areas to compare series, or the percent variant to express every category as shares of 100%. `shape` controls whether the connecting segments are curved or straight.\",\n    \"data\": \"Provide flat data rows with a label and numeric fields for each series. `series` identifies those fields and their colors. The component derives totals, legend values, tiles and hover readouts. Supply `ranges` for a period dropdown; the default preview includes three illustrative periods.\"\n  },\n  \"bar-list-card\": {\n    \"tabs\": \"Define `tabs` as objects containing an ID, label and item list. Items can include a small icon, flag or site mark. Percentages use the active tab’s total, while each bar is scaled against that tab’s largest value.\",\n    \"single\": \"Pass `items` and `title` for a standalone list without tabs. Choose `metric=\\\"value\\\"` to display amounts directly instead of shares. `mono` uses one neutral color for the complete list.\"\n  },\n  \"combo-chart-card\": {\n    \"data\": \"The bar and line series use the same rows. Each names its numeric field, label, optional color and formatter. Their independent axes keep different units readable together, such as a count and percentage or currency and ROAS. Supply `ranges` to populate the period dropdown, or use the illustrative defaults.\"\n  },\n  \"funnel-chart-card\": {\n    \"shapes\": \"Choose `shape=\\\"sharp\\\"` for straight trapezoid stages instead of the curved taper. Use `mono` for one theme-aware color across the funnel. The two options can be combined.\",\n    \"data\": \"Pass `stages` in funnel order, with a label, value and optional color for each. Adding a stage adds a column; neck sizes, proportions and footer values are recalculated. Colors use the chart palette unless overridden. Each supplied `range` can include its own data, delta and headline. Listen to `onRangeChange` to fetch your own values. The default preview uses three local period snapshots.\"\n  },\n  \"heatmap-chart-card\": {\n    \"data\": \"Each entry in `rows` has a label and values; `columns` supplies the corresponding column labels. The matrix adapts to added rows and columns. Set `color` for a different ramp or `max` for a fixed saturation ceiling. Supplied ranges can carry their own data, headline and delta. Use `onRangeChange` for application loading, or inspect the default preview’s three illustrative snapshots.\"\n  },\n  \"line-chart-card\": {\n    \"sharp\": \"Set `shape=\\\"sharp\\\"` to connect measurements with straight segments. The gradient, point markers and hover behavior remain the same. This is useful when the connecting line should avoid suggesting smooth interpolation between measurements.\"\n  },\n  \"orders-chart-card\": {\n    \"numbers\": \"Supply `data` with the current and previous value for each period. The card calculates totals, change and hover details from those values. Set `title` to choose the resting header label.\",\n    \"in-row\": \"The two free comparison cards share the available row width and use a default height of 344px. Place them side by side for the dashboard arrangement shown in the chat starter.\"\n  },\n  \"radar-chart-card\": {\n    \"variants\": \"Choose a filled radar, dots, comparison lines or a centered score using `variant`. Score mode places values beside the axes and summarizes them in the raised center disc. Enable `tiles` to place a metric tile beneath each axis; the card then grows to fit the additional content.\",\n    \"data\": \"Provide one labeled row per axis and numeric fields for each series. `series` identifies those fields and can supply their colors. The chart derives its scale ceiling, totals, legend and hover details. Each range may supply another dataset with a headline and delta. The dropdown reports `onRangeChange` so your application can load values. Three local snapshots are used when no input data is supplied.\"\n  },\n  \"radial-chart-card\": {\n    \"variants\": \"The rings, labels and grid variants draw one ring for each item. Gauge and solid treatments show a value against `max`, with a centered percentage. Stacked uses a half gauge to show the primary segment’s share, updating that readout when another segment is inspected.\",\n    \"with-tiles\": \"Use `tiles` for a color swatch, name and value beneath each metric. Tiles occupy three columns, with an incomplete last row stretched across the available width. Inspecting a tile emphasizes its ring, and inspecting the ring emphasizes its tile.\",\n    \"data\": \"Pass a labeled value per item, with an optional color. Items become rings or segments and use the chart palette unless you supply a color. `max` defines a full ring. Ranges may include new data, delta and headline values; `onRangeChange` can request application data. Without custom data, the card demonstrates three local snapshots.\"\n  },\n  \"revenue-chart-card\": {\n    \"numbers\": \"Provide current and previous values in `data`. Totals, the percentage change and hover details all follow those numbers, avoiding a separate headline calculation. Set `title` for the resting header text.\",\n    \"in-row\": \"The default card is 344px tall and grows to fill its share of a row. Pair it with Orders or another card to create the dashboard composition shown in the chat starter.\"\n  },\n  \"sankey-chart-card\": {\n    \"data\": \"Define named `nodes`, optionally with colors, and `links` containing source, target and value. Links may refer to nodes by name or index. Flow values drive the node totals, headline, destination shares and hover relationships. Each range may supply its own links, headline and delta. Handle `onRangeChange` to load application data; the preview’s three ranges are local illustrative snapshots.\"\n  },\n  \"scatter-chart-card\": {\n    \"without-bubbles\": \"A supplied `z` value enables bubble sizing. Set `bubble={false}` to use equal-sized dots when a third measure is unnecessary or makes the chart harder to compare.\",\n    \"data\": \"Each series contains a label, points and optional color. Points use `x`, `y`, an optional size `z`, and an optional label for the hover header. The component derives group averages, legends and tiles. Supply `ranges` to populate the period dropdown.\"\n  },\n  \"stage-bars-card\": {\n    \"mono\": \"Enable `mono` to replace the individual stage colors with one neutral ink: mid-gray in light mode and a lighter tone in dark mode.\",\n    \"data\": \"Supply ordered `stages` with a label, value and optional color. Every added stage creates a bar and metric tile; the card expands as needed. Shares use the first stage and the label column accommodates the longest name. Add an icon inside each bar, or use `showIcons={false}` to hide them. Ranges carry their own values and optional headline or delta; `onRangeChange` lets your application load another period. The default preview contains three local datasets.\"\n  }\n}\n",
  "src/board-native-charts/use-count-up.ts": "/* Adapted from public BoardUI MIT source; see ../board-native/LICENSE. */\n\"use client\";\nimport {useMotionPreference} from '../useMotionPreference.js';\n\nimport { useEffect, useRef, useState } from \"react\";\n\nconst easeOutCubic = (t: number) => 1 - Math.pow(1 - t, 3);\n\n/**\n * Rolls the displayed number from its current value to `target` with an\n * ease-out curve. Used by the dashboard chart cards so headline figures\n * animate when the dataset or the hovered point changes.\n */\nexport function useCountUp(target: number, duration = 320) {\n  const reduced=useMotionPreference();\n  const [display, setDisplay] = useState(target);\n  const fromRef = useRef(target);\n\n  useEffect(() => {\n    if(reduced!==false){fromRef.current=target;setDisplay(target);return;}\n    const from = fromRef.current;\n    if (from === target) return;\n    const start = performance.now();\n    let raf = 0;\n    const tick = (now: number) => {\n      const t = Math.min(1, (now - start) / duration);\n      const value = Math.round(from + (target - from) * easeOutCubic(t));\n      fromRef.current = value;\n      setDisplay(value);\n      if (t < 1) raf = requestAnimationFrame(tick);\n      else fromRef.current = target;\n    };\n    raf = requestAnimationFrame(tick);\n    return () => cancelAnimationFrame(raf);\n  }, [target, duration,reduced]);\n\n  return display;\n}\n\n",
  "src/board-native.css": "/* Generated by react/generate-board-native.mjs from licensed public source; do not edit. */\n@layer theme{:root{--color-accent-50:oklch(97% 0.014 254.604);--color-accent-100:oklch(93.2% 0.032 255.585);--color-accent-200:oklch(88.2% 0.059 254.128);--color-accent-300:oklch(80.9% 0.105 251.813);--color-accent-400:#3392ff;--color-accent-500:oklch(62.3% 0.214 259.815);--color-accent-600:oklch(54.6% 0.245 262.881);--color-accent-700:oklch(48.8% 0.243 264.376);--color-accent-800:oklch(42.4% 0.199 265.638);--color-accent-900:oklch(37.9% 0.146 265.522);--color-accent-950:oklch(28.2% 0.091 267.935);}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n.bn-source, .bn-source {\n  --font-sans: var(--font-inter), ui-sans-serif, system-ui, sans-serif,\n               \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\",\n               \"Noto Color Emoji\";\n  --font-mono: var(--font-mono-source), ui-monospace, \"SFMono-Regular\", Menlo,\n               Consolas, \"Liberation Mono\", monospace;\n  --color-red-100: oklch(93.6% 0.032 17.717);\n  --color-red-200: oklch(88.5% 0.062 18.334);\n  --color-red-300: oklch(80.8% 0.114 19.571);\n  --color-red-400: oklch(70.4% 0.191 22.216);\n  --color-red-500: oklch(63.7% 0.237 25.331);\n  --color-red-600: oklch(57.7% 0.245 27.325);\n  --color-red-700: oklch(50.5% 0.213 27.518);\n  --color-red-900: oklch(39.6% 0.141 25.723);\n  --color-red-950: oklch(25.8% 0.092 26.042);\n  --color-orange-200: oklch(90.1% 0.076 70.697);\n  --color-orange-300: oklch(83.7% 0.128 66.29);\n  --color-orange-400: oklch(75% 0.183 55.934);\n  --color-orange-500: oklch(70.5% 0.213 47.604);\n  --color-orange-800: oklch(47% 0.157 37.304);\n  --color-orange-950: oklch(26.6% 0.079 36.259);\n  --color-amber-200: oklch(92.4% 0.12 95.746);\n  --color-amber-400: oklch(82.8% 0.189 84.429);\n  --color-amber-500: oklch(76.9% 0.188 70.08);\n  --color-amber-600: oklch(66.6% 0.179 58.318);\n  --color-amber-700: oklch(55.5% 0.163 48.998);\n  --color-amber-800: oklch(47.3% 0.137 46.201);\n  --color-amber-950: oklch(27.9% 0.077 45.635);\n  --color-yellow-200: oklch(94.5% 0.129 101.54);\n  --color-yellow-300: oklch(90.5% 0.182 98.111);\n  --color-yellow-400: oklch(85.2% 0.199 91.936);\n  --color-yellow-500: oklch(79.5% 0.184 86.047);\n  --color-yellow-800: oklch(47.6% 0.114 61.907);\n  --color-yellow-950: oklch(28.6% 0.066 53.813);\n  --color-lime-100: oklch(96.7% 0.067 122.328);\n  --color-lime-200: oklch(93.8% 0.127 124.321);\n  --color-lime-300: oklch(89.7% 0.196 126.665);\n  --color-lime-400: oklch(84.1% 0.238 128.85);\n  --color-lime-500: oklch(76.8% 0.233 130.85);\n  --color-lime-600: oklch(64.8% 0.2 131.684);\n  --color-lime-700: oklch(53.2% 0.157 131.589);\n  --color-lime-800: oklch(45.3% 0.124 130.933);\n  --color-lime-950: oklch(27.4% 0.072 132.109);\n  --color-green-100: oklch(96.2% 0.044 156.743);\n  --color-green-200: oklch(92.5% 0.084 155.995);\n  --color-green-400: oklch(79.2% 0.209 151.711);\n  --color-green-500: oklch(72.3% 0.219 149.579);\n  --color-green-600: oklch(62.7% 0.194 149.214);\n  --color-green-700: oklch(52.7% 0.154 150.069);\n  --color-green-800: oklch(44.8% 0.119 151.328);\n  --color-green-950: oklch(26.6% 0.065 152.934);\n  --color-emerald-100: oklch(95% 0.052 163.051);\n  --color-emerald-200: oklch(90.5% 0.093 164.15);\n  --color-emerald-300: oklch(84.5% 0.143 164.978);\n  --color-emerald-400: oklch(76.5% 0.177 163.223);\n  --color-emerald-500: oklch(69.6% 0.17 162.48);\n  --color-emerald-600: oklch(59.6% 0.145 163.225);\n  --color-emerald-700: oklch(50.8% 0.118 165.612);\n  --color-emerald-800: oklch(43.2% 0.095 166.913);\n  --color-emerald-950: oklch(26.2% 0.051 172.552);\n  --color-teal-200: oklch(91% 0.096 180.426);\n  --color-teal-400: oklch(77.7% 0.152 181.912);\n  --color-teal-500: oklch(70.4% 0.14 182.503);\n  --color-teal-600: oklch(60% 0.118 184.704);\n  --color-teal-700: oklch(51.1% 0.096 186.391);\n  --color-teal-800: oklch(43.7% 0.078 188.216);\n  --color-teal-950: oklch(27.7% 0.046 192.524);\n  --color-cyan-200: oklch(91.7% 0.08 205.041);\n  --color-cyan-400: oklch(78.9% 0.154 211.53);\n  --color-cyan-500: oklch(71.5% 0.143 215.221);\n  --color-cyan-600: oklch(60.9% 0.126 221.723);\n  --color-cyan-700: oklch(52% 0.105 223.128);\n  --color-cyan-800: oklch(45% 0.085 224.283);\n  --color-cyan-950: oklch(30.2% 0.056 229.695);\n  --color-sky-400: oklch(74.6% 0.16 232.661);\n  --color-sky-500: oklch(68.5% 0.169 237.323);\n  --color-blue-50: oklch(97% 0.014 254.604);\n  --color-blue-100: oklch(93.2% 0.032 255.585);\n  --color-blue-200: oklch(88.2% 0.059 254.128);\n  --color-blue-300: oklch(80.9% 0.105 251.813);\n  --color-blue-400: #3392ff;\n  --color-blue-500: oklch(62.3% 0.214 259.815);\n  --color-blue-600: oklch(54.6% 0.245 262.881);\n  --color-blue-700: oklch(48.8% 0.243 264.376);\n  --color-blue-800: oklch(42.4% 0.199 265.638);\n  --color-blue-900: oklch(37.9% 0.146 265.522);\n  --color-blue-950: oklch(28.2% 0.091 267.935);\n  --color-indigo-100: oklch(93% 0.034 272.788);\n  --color-indigo-200: oklch(87% 0.065 274.039);\n  --color-indigo-300: oklch(78.5% 0.115 274.713);\n  --color-indigo-400: oklch(67.3% 0.182 276.935);\n  --color-indigo-500: oklch(58.5% 0.233 277.117);\n  --color-indigo-600: oklch(51.1% 0.262 276.966);\n  --color-indigo-700: oklch(45.7% 0.24 277.023);\n  --color-indigo-800: oklch(39.8% 0.195 277.366);\n  --color-indigo-950: oklch(25.7% 0.09 281.288);\n  --color-violet-200: oklch(89.4% 0.057 293.283);\n  --color-violet-400: oklch(70.2% 0.183 293.541);\n  --color-violet-500: oklch(60.6% 0.25 292.717);\n  --color-violet-600: oklch(54.1% 0.281 293.009);\n  --color-violet-700: oklch(49.1% 0.27 292.581);\n  --color-violet-800: oklch(43.2% 0.232 292.759);\n  --color-violet-950: oklch(28.3% 0.141 291.089);\n  --color-purple-50: oklch(97.7% 0.014 308.299);\n  --color-purple-100: oklch(94.6% 0.033 307.174);\n  --color-purple-300: oklch(82.7% 0.119 306.383);\n  --color-purple-400: oklch(71.4% 0.203 305.504);\n  --color-purple-500: oklch(62.7% 0.265 303.9);\n  --color-purple-600: oklch(55.8% 0.288 302.321);\n  --color-purple-700: oklch(49.6% 0.265 301.924);\n  --color-purple-800: oklch(43.8% 0.218 303.724);\n  --color-purple-900: oklch(38.1% 0.176 304.987);\n  --color-purple-950: oklch(29.1% 0.149 302.717);\n  --color-pink-100: oklch(94.8% 0.028 342.258);\n  --color-pink-200: oklch(89.9% 0.061 343.231);\n  --color-pink-300: oklch(82.3% 0.12 346.018);\n  --color-pink-400: oklch(71.8% 0.202 349.761);\n  --color-pink-500: oklch(65.6% 0.241 354.308);\n  --color-pink-600: oklch(59.2% 0.249 0.584);\n  --color-pink-700: oklch(52.5% 0.223 3.958);\n  --color-pink-950: oklch(28.4% 0.109 3.907);\n  --color-rose-100: oklch(94.1% 0.03 12.58);\n  --color-rose-200: oklch(89.2% 0.058 10.001);\n  --color-rose-300: oklch(81% 0.117 11.638);\n  --color-rose-400: oklch(71.2% 0.194 13.428);\n  --color-rose-500: oklch(64.5% 0.246 16.439);\n  --color-rose-600: oklch(58.6% 0.253 17.585);\n  --color-rose-700: oklch(51.4% 0.222 16.935);\n  --color-rose-800: oklch(45.5% 0.188 13.697);\n  --color-rose-950: oklch(27.1% 0.105 12.094);\n  --color-zinc-800: oklch(27.4% 0.006 286.033);\n  --color-neutral-50: oklch(98.5% 0 none);\n  --color-neutral-100: #f7f7f7;\n  --color-neutral-200: #ebebeb;\n  --color-neutral-300: oklch(87% 0 none);\n  --color-neutral-400: oklch(70.8% 0 none);\n  --color-neutral-500: oklch(55.6% 0 none);\n  --color-neutral-600: oklch(43.9% 0 none);\n  --color-neutral-700: oklch(37.1% 0 none);\n  --color-neutral-800: oklch(26.9% 0 none);\n  --color-neutral-900: oklch(20.5% 0 none);\n  --color-neutral-950: oklch(14.5% 0 none);\n  --color-black: #000;\n  --color-white: #fff;\n  --spacing: 0.25rem;\n  --container-sm: 24rem;\n  --container-md: 28rem;\n  --container-2xl: 42rem;\n  --font-weight-semibold: 600;\n  --tracking-normal: 0em;\n  --radius-xs: 0.125rem;\n  --radius-sm: 0.25rem;\n  --radius-md: 0.375rem;\n  --radius-lg: 0.5rem;\n  --radius-xl: 0.75rem;\n  --radius-2xl: 1rem;\n  --radius-3xl: 1.5rem;\n  --shadow-2xs: 0 1px rgb(0 0 0 / 0.05);\n  --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n  --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.06), 0 1px 3px 0 rgb(0 0 0 / 0.10);\n  --shadow-md: 0 2px 4px -1px rgb(0 0 0 / 0.06), 0 4px 6px -1px rgb(0 0 0 / 0.10);\n  --shadow-lg: 0 4px 6px -2px rgb(0 0 0 / 0.05), 0 10px 15px -3px rgb(0 0 0 / 0.10);\n  --shadow-xl: 0 10px 10px -5px rgb(0 0 0 / 0.04), 0 20px 25px -5px rgb(0 0 0 / 0.10);\n  --ease-out: cubic-bezier(0, 0, 0.2, 1);\n  --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\n  --blur-sm: 8px;\n  --blur-2xl: 40px;\n  --default-transition-duration: 150ms;\n  --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n  --default-font-family: var(--font-sans);\n  --default-mono-font-family: var(--font-mono);\n  --color-neutral-925: #121212;\n  --radius-2lg: 10px;\n  --radius-notification-card: 10px;\n  --shadow-sidebar: 0 1px 0 0 rgb(0 0 0 / 0.0196),\n    0 1px 12px 0 rgb(0 0 0 / 0.0588),\n    0 0 1px 0 rgb(0 0 0 / 0.3216);\n  --shadow-checkbox-selected: inset 0 2px 0 0 rgb(255 255 255 / 0.25),\n    inset 0 0 0 1px var(--color-accent-500);\n  --shadow-card: 0 1px 1px 0 rgb(0 0 0 / 0.05);\n  --shadow-dropdown: 0 1px 1px 0 rgb(0 0 0 / 0.04),\n    0 4px 4px 0 rgb(0 0 0 / 0.02);\n  --shadow-waitlist: 0 0 6px 0 rgb(0 0 0 / 0.06),\n    0 0 64px 0 rgb(0 0 0 / 0.16),\n    0 0 1px 0 rgb(0 0 0 / 0.32),\n    0 1px 12px 0 rgb(0 0 0 / 0.06),\n    0 1px 0 0 rgb(0 0 0 / 0.02);\n  --color-foreground-full: var(--color-foreground-full);\n  --color-foreground-icon-primary: var(--color-foreground-icon-primary);\n  --color-foreground-icon-hover: var(--color-foreground-icon-hover);\n  --color-foreground-icon-secondary: var(--color-foreground-icon-secondary);\n  --color-foreground-icon-tertiary: var(--color-foreground-icon-tertiary);\n  --color-foreground-icon-quaternary: var(--color-foreground-icon-quaternary);\n  --color-foreground-icon-error: var(--color-foreground-icon-error);\n  --color-foreground-icon-disabled: var(--color-foreground-icon-disabled);\n  --color-foreground-disabled: var(--color-foreground-disabled);\n  --color-foreground-disabled-danger: var(--color-foreground-disabled-danger);\n  --color-input-disabled-foreground: var(--color-input-disabled-foreground);\n  --color-icon-button-disabled-foreground: var(--color-icon-button-disabled-foreground);\n  --color-button-primary-disabled-foreground: var(--color-button-primary-disabled-foreground);\n  --color-text-primary: var(--color-text-primary);\n  --color-text-secondary: var(--color-text-secondary);\n  --color-text-tertiary: var(--color-text-tertiary);\n  --color-text-disabled: var(--color-text-disabled);\n  --color-text-disabled-danger: var(--color-text-disabled-danger);\n  --color-text-placeholder: var(--color-text-placeholder);\n  --color-text-error-primary: var(--color-text-error-primary);\n  --color-text-destructive: var(--color-text-destructive);\n  --color-input-disabled-text: var(--color-input-disabled-text);\n  --color-text-white: var(--color-text-white);\n  --color-background-full: var(--color-background-full);\n  --color-ticket-detail-surface: var(--color-ticket-detail-surface);\n  --color-ticket-detail-low-background: var(--color-ticket-detail-low-background);\n  --color-ticket-detail-low-hover: var(--color-ticket-detail-low-hover);\n  --color-ticket-detail-medium-hover: var(--color-ticket-detail-medium-hover);\n  --color-ticket-detail-high-hover: var(--color-ticket-detail-high-hover);\n  --color-ticket-detail-urgent-hover: var(--color-ticket-detail-urgent-hover);\n  --color-ticket-detail-low-text: var(--color-ticket-detail-low-text);\n  --color-ticket-detail-resource-background: var(--color-ticket-detail-resource-background);\n  --color-ticket-detail-resource-text: var(--color-ticket-detail-resource-text);\n  --color-ticket-detail-favorite: var(--color-ticket-detail-favorite);\n  --color-background-primary-default: var(--color-background-primary-default);\n  --color-background-inner-default: var(--color-background-inner-default);\n  --color-background-primary-hover: var(--color-background-primary-hover);\n  --color-background-primary-active: var(--color-background-primary-active);\n  --color-background-primary-disabled: var(--color-background-primary-disabled);\n  --color-input-disabled-background: var(--color-input-disabled-background);\n  --color-background-secondary-default: var(--color-background-secondary-default);\n  --color-background-secondary-hover: var(--color-background-secondary-hover);\n  --color-background-tertiary-default: var(--color-background-tertiary-default);\n  --color-background-tertiary-hover: var(--color-background-tertiary-hover);\n  --color-background-tertiary-error: var(--color-background-tertiary-error);\n  --color-background-recent-hire-role: var(--color-background-recent-hire-role);\n  --color-avatar-neutral-background: var(--color-avatar-neutral-background);\n  --color-background-quaternary-default: var(--color-background-quaternary-default);\n  --color-background-quaternary-hover: var(--color-background-quaternary-hover);\n  --color-background-quaternary-error: var(--color-background-quaternary-error);\n  --color-file-upload-icon-background: var(--color-file-upload-icon-background);\n  --color-file-upload-icon-foreground: var(--color-file-upload-icon-foreground);\n  --color-file-upload-icon-foreground-hover: var(--color-file-upload-icon-foreground-hover);\n  --color-border-button-default: var(--color-border-button-default);\n  --color-border-button-hover: var(--color-border-button-hover);\n  --color-border-button-active: var(--color-border-button-active);\n  --color-border-button-white: var(--color-border-button-white);\n  --color-border-error-default: var(--color-border-error-default);\n  --color-border-checkbox-default: var(--color-border-checkbox-default);\n  --color-border-checkbox-hover: var(--color-border-checkbox-hover);\n  --color-border-checkbox-active: var(--color-border-checkbox-active);\n  --color-border-checkbox-white: var(--color-border-checkbox-white);\n  --color-border-component-detail-container: var(--color-border-component-detail-container);\n  --color-border-ai-profile-card: var(--color-border-ai-profile-card);\n  --color-border-table: var(--color-border-table);\n  --color-border-button-group: var(--color-border-button-group);\n  --color-border-sidebar-profile-hover: var(--color-border-sidebar-profile-hover);\n  --color-separator-border: var(--color-separator-border);\n  --color-separator-border-strong: var(--color-separator-border-strong);\n  --color-border-focus-ring: var(--color-border-focus-ring);\n  --color-state-success-text: var(--color-state-success-text);\n  --color-state-success-base: var(--color-state-success-base);\n  --color-control-indicator-background: var(--color-control-indicator-background);\n  --color-control-indicator-background-subtle: var(--color-control-indicator-background-subtle);\n  --color-switch-off-chip-start: var(--color-switch-off-chip-start);\n  --color-switch-off-chip-end: var(--color-switch-off-chip-end);\n  --color-switch-on-chip-start: var(--color-switch-on-chip-start);\n  --color-switch-on-chip-end: var(--color-switch-on-chip-end);\n  --color-stat-card-icon-background: var(--color-stat-card-icon-background);\n  --color-segmented-control-background: var(--color-segmented-control-background);\n  --color-segmented-control-selected-background: var(--color-segmented-control-selected-background);\n  --color-theme-toggle-sidebar-background: var(--color-theme-toggle-sidebar-background);\n  --color-theme-toggle-sidebar-selected-background: var(--color-theme-toggle-sidebar-selected-background);\n  --color-ai-chat-composer-add-background: var(--color-ai-chat-composer-add-background);\n  --color-ai-chat-composer-add-hover-background: var(--color-ai-chat-composer-add-hover-background);\n  --color-composer-panel-tab-background: var(--color-composer-panel-tab-background);\n  --color-composer-panel-add-background: var(--color-composer-panel-add-background);\n  --color-composer-panel-add-hover-background: var(--color-composer-panel-add-hover-background);\n  --color-composer-panel-tile-border: var(--color-composer-panel-tile-border);\n  --color-composer-panel-rail-background: var(--color-composer-panel-rail-background);\n  --color-questionnaire-key-background: var(--color-questionnaire-key-background);\n  --color-questionnaire-key-hover-background: var(--color-questionnaire-key-hover-background);\n  --color-agent-progress-ring: var(--color-agent-progress-ring);\n  --color-button-ghost-background: var(--color-button-ghost-background);\n  --color-button-ghost-hover: var(--color-button-ghost-hover);\n  --color-button-ghost-active: var(--color-button-ghost-active);\n  --color-button-ghost-disabled: var(--color-button-ghost-disabled);\n  --color-button-ghost-foreground: var(--color-button-ghost-foreground);\n  --color-button-ghost-disabled-foreground: var(--color-button-ghost-disabled-foreground);\n  --color-dropdown-item-hover-background: var(--color-dropdown-item-hover-background);\n  --color-kbd-background: var(--color-kbd-background);\n  --color-kbd-foreground: var(--color-kbd-foreground);\n  --color-docs-file-chip-background: var(--color-docs-file-chip-background);\n  --color-docs-file-chip-border: var(--color-docs-file-chip-border);\n  --color-docs-file-chip-foreground: var(--color-docs-file-chip-foreground);\n  --color-docs-command-accent: var(--color-docs-command-accent);\n  --color-docs-code-background: var(--color-docs-code-background);\n  --color-docs-install-rail: var(--color-docs-install-rail);\n  --color-badge-neutral-background: var(--color-badge-neutral-background);\n  --color-team-menu-count-background: var(--color-team-menu-count-background);\n  --color-team-menu-count-foreground: var(--color-team-menu-count-foreground);\n  --color-badge-new-background: var(--color-badge-new-background);\n  --color-badge-new-text: var(--color-badge-new-text);\n  --color-tab-count-selected-background: var(--color-tab-count-selected-background);\n  --color-pill-tab-blue-selected-background: var(--color-pill-tab-blue-selected-background);\n  --color-pill-tab-blue-hover-background: var(--color-pill-tab-blue-hover-background);\n  --color-notification-information-background: var(--color-notification-information-background);\n  --color-notification-information-foreground: var(--color-notification-information-foreground);\n  --color-notification-success-background: var(--color-notification-success-background);\n  --color-notification-success-foreground: var(--color-notification-success-foreground);\n  --color-notification-error-background: var(--color-notification-error-background);\n  --color-notification-error-foreground: var(--color-notification-error-foreground);\n  --color-notification-center-background: var(--color-notification-center-background);\n  --color-status-lime-background: var(--color-status-lime-background);\n  --color-status-lime-text: var(--color-status-lime-text);\n  --color-status-yellow-background: var(--color-status-yellow-background);\n  --color-status-yellow-text: var(--color-status-yellow-text);\n  --color-status-rose-background: var(--color-status-rose-background);\n  --color-status-rose-text: var(--color-status-rose-text);\n  --color-status-cyan-background: var(--color-status-cyan-background);\n  --color-status-cyan-text: var(--color-status-cyan-text);\n  --color-status-orange-background: var(--color-status-orange-background);\n  --color-status-orange-text: var(--color-status-orange-text);\n  --color-status-blue-background: var(--color-status-blue-background);\n  --color-status-blue-text: var(--color-status-blue-text);\n  --color-status-purple-background: var(--color-status-purple-background);\n  --color-status-purple-text: var(--color-status-purple-text);\n  --color-status-dot-green-halo: var(--color-status-dot-green-halo);\n  --color-status-dot-yellow-halo: var(--color-status-dot-yellow-halo);\n  --color-status-dot-indigo-halo: var(--color-status-dot-indigo-halo);\n  --color-date-range-background: var(--color-date-range-background);\n  --color-date-range-edge-background: var(--color-date-range-edge-background);\n  --color-calendar-event-blue-background: var(--color-calendar-event-blue-background);\n  --color-calendar-event-blue-title: var(--color-calendar-event-blue-title);\n  --color-calendar-event-blue-time: var(--color-calendar-event-blue-time);\n  --color-calendar-event-pink-background: var(--color-calendar-event-pink-background);\n  --color-calendar-event-pink-title: var(--color-calendar-event-pink-title);\n  --color-calendar-event-pink-time: var(--color-calendar-event-pink-time);\n  --color-calendar-event-purple-background: var(--color-calendar-event-purple-background);\n  --color-calendar-event-purple-title: var(--color-calendar-event-purple-title);\n  --color-calendar-event-purple-time: var(--color-calendar-event-purple-time);\n  --color-calendar-event-lime-background: var(--color-calendar-event-lime-background);\n  --color-calendar-event-lime-title: var(--color-calendar-event-lime-title);\n  --color-calendar-event-lime-time: var(--color-calendar-event-lime-time);\n  --color-calendar-event-emerald-background: var(--color-calendar-event-emerald-background);\n  --color-calendar-event-emerald-title: var(--color-calendar-event-emerald-title);\n  --color-calendar-event-emerald-time: var(--color-calendar-event-emerald-time);\n  --color-text-error-placeholder: var(--color-text-error-placeholder);\n  --color-chart-track: var(--color-chart-track);\n  --color-chart-cursor: var(--color-chart-cursor);\n  --color-chart-neutral: var(--color-chart-neutral);\n  --color-chart-1: var(--color-chart-1);\n  --color-chart-1-active: var(--color-chart-1-active);\n  --color-chart-2: var(--color-chart-2);\n  --color-chart-2-active: var(--color-chart-2-active);\n  --color-chart-3: var(--color-chart-3);\n  --color-chart-3-active: var(--color-chart-3-active);\n  --color-chart-4: var(--color-chart-4);\n  --color-chart-4-active: var(--color-chart-4-active);\n  --color-chart-5: var(--color-chart-5);\n  --color-chart-5-active: var(--color-chart-5-active);\n  --color-chart-6: var(--color-chart-6);\n  --color-chart-6-active: var(--color-chart-6-active);\n  --color-chart-7: var(--color-chart-7);\n  --color-chart-7-active: var(--color-chart-7-active);\n  --color-chart-8: var(--color-chart-8);\n  --color-chart-8-active: var(--color-chart-8-active);\n  --color-chart-9: var(--color-chart-9);\n  --color-chart-9-active: var(--color-chart-9-active);\n  --color-chart-agents-bar: var(--color-chart-agents-bar);\n  --color-chart-agents-bar-active: var(--color-chart-agents-bar-active);\n  --button-transition-ms: 150ms;\n  --input-transition-ms: 150ms;\n  --text-display-4-medium: 2rem;\n  --text-display-4-medium--line-height: 2.75rem;\n  --text-display-4-medium--letter-spacing: 0;\n  --text-display-4-medium--font-weight: 500;\n  --text-title-1-medium: 1.5rem;\n  --text-title-1-medium--line-height: 2.125rem;\n  --text-title-1-medium--letter-spacing: 0;\n  --text-title-1-medium--font-weight: 500;\n  --text-title-1-semibold: 1.5rem;\n  --text-title-1-semibold--line-height: 2.125rem;\n  --text-title-1-semibold--letter-spacing: 0;\n  --text-title-1-semibold--font-weight: 600;\n  --text-title-2-medium: 1.25rem;\n  --text-title-2-medium--line-height: 1.625rem;\n  --text-title-2-medium--letter-spacing: 0;\n  --text-title-2-medium--font-weight: 500;\n  --text-title-3-medium: 1.125rem;\n  --text-title-3-medium--line-height: 1.625rem;\n  --text-title-3-medium--letter-spacing: 0;\n  --text-title-3-medium--font-weight: 500;\n  --text-headline-medium: 1rem;\n  --text-headline-medium--line-height: 1.375rem;\n  --text-headline-medium--letter-spacing: 0;\n  --text-headline-medium--font-weight: 500;\n  --text-headline-semibold: 1rem;\n  --text-headline-semibold--line-height: 1.375rem;\n  --text-headline-semibold--letter-spacing: 0;\n  --text-headline-semibold--font-weight: 600;\n  --text-body-regular: 0.875rem;\n  --text-body-regular--line-height: 1.25rem;\n  --text-body-regular--letter-spacing: 0;\n  --text-body-regular--font-weight: 400;\n  --text-body-medium: 0.875rem;\n  --text-body-medium--line-height: 1.25rem;\n  --text-body-medium--letter-spacing: 0;\n  --text-body-medium--font-weight: 500;\n  --text-body-2-regular: 0.8125rem;\n  --text-body-2-regular--line-height: 1.125rem;\n  --text-body-2-regular--letter-spacing: 0;\n  --text-body-2-regular--font-weight: 400;\n  --text-body-2-medium: 0.8125rem;\n  --text-body-2-medium--line-height: 1.125rem;\n  --text-body-2-medium--letter-spacing: 0;\n  --text-body-2-medium--font-weight: 500;\n  --text-caption-1-regular: 0.75rem;\n  --text-caption-1-regular--line-height: 1rem;\n  --text-caption-1-regular--letter-spacing: 0.15px;\n  --text-caption-1-regular--font-weight: 400;\n  --text-caption-1-medium: 0.75rem;\n  --text-caption-1-medium--line-height: 1rem;\n  --text-caption-1-medium--letter-spacing: 0.15px;\n  --text-caption-1-medium--font-weight: 500;\n  --text-caption-1-semibold: 0.75rem;\n  --text-caption-1-semibold--line-height: 1rem;\n  --text-caption-1-semibold--letter-spacing: 0.15px;\n  --text-caption-1-semibold--font-weight: 600;\n}\n:where(.bn-source) *, :where(.bn-source) ::after, :where(.bn-source) ::before, :where(.bn-source) ::backdrop, :where(.bn-source) ::file-selector-button {\n    box-sizing: border-box;\n    margin: 0;\n    padding: 0;\n    border: 0 solid;\n  }\n:where(.bn-source) html, .bn-source {\n    line-height: 1.5;\n    -webkit-text-size-adjust: 100%;\n    tab-size: 4;\n    font-family: var(--default-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Noto Sans', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji');\n    font-feature-settings: var(--default-font-feature-settings, normal);\n    font-variation-settings: var(--default-font-variation-settings, normal);\n    -webkit-tap-highlight-color: transparent;\n  }\n:where(.bn-source) hr {\n    height: 0;\n    color: inherit;\n    border-top-width: 1px;\n  }\n:where(.bn-source) abbr:where([title]) {\n    -webkit-text-decoration: underline dotted;\n    text-decoration: underline dotted;\n  }\n:where(.bn-source) h1, :where(.bn-source) h2, :where(.bn-source) h3, :where(.bn-source) h4, :where(.bn-source) h5, :where(.bn-source) h6 {\n    font-size: inherit;\n    font-weight: inherit;\n  }\n:where(.bn-source) a {\n    color: inherit;\n    -webkit-text-decoration: inherit;\n    text-decoration: inherit;\n  }\n:where(.bn-source) b, :where(.bn-source) strong {\n    font-weight: bolder;\n  }\n:where(.bn-source) code, :where(.bn-source) kbd, :where(.bn-source) samp, :where(.bn-source) pre {\n    font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace);\n    font-feature-settings: var(--default-mono-font-feature-settings, normal);\n    font-variation-settings: var(--default-mono-font-variation-settings, normal);\n    font-size: 1em;\n  }\n:where(.bn-source) small {\n    font-size: 80%;\n  }\n:where(.bn-source) sub, :where(.bn-source) sup {\n    font-size: 75%;\n    line-height: 0;\n    position: relative;\n    vertical-align: baseline;\n  }\n:where(.bn-source) sub {\n    bottom: -0.25em;\n  }\n:where(.bn-source) sup {\n    top: -0.5em;\n  }\n:where(.bn-source) table {\n    text-indent: 0;\n    border-color: inherit;\n    border-collapse: collapse;\n  }\n:where(.bn-source) :-moz-focusring:where(:not(iframe)) {\n    outline: auto;\n  }\n:where(.bn-source) progress {\n    vertical-align: baseline;\n  }\n:where(.bn-source) summary {\n    display: list-item;\n  }\n:where(.bn-source) ol, :where(.bn-source) ul, :where(.bn-source) menu {\n    list-style: none;\n  }\n:where(.bn-source) img, :where(.bn-source) svg, :where(.bn-source) video, :where(.bn-source) canvas, :where(.bn-source) audio, :where(.bn-source) iframe, :where(.bn-source) embed, :where(.bn-source) object {\n    display: block;\n    vertical-align: middle;\n  }\n:where(.bn-source) img, :where(.bn-source) video {\n    max-width: 100%;\n    height: auto;\n  }\n:where(.bn-source) button, :where(.bn-source) input, :where(.bn-source) select, :where(.bn-source) optgroup, :where(.bn-source) textarea, :where(.bn-source) ::file-selector-button {\n    font: inherit;\n    font-feature-settings: inherit;\n    font-variation-settings: inherit;\n    letter-spacing: inherit;\n    color: inherit;\n    border-radius: 0;\n    background-color: transparent;\n    opacity: 1;\n  }\n:where(.bn-source) :where(select:is([multiple], [size])) optgroup {\n    font-weight: bolder;\n  }\n:where(.bn-source) :where(select:is([multiple], [size])) optgroup option {\n    padding-inline-start: 20px;\n  }\n:where(.bn-source) ::file-selector-button {\n    margin-inline-end: 4px;\n  }\n:where(.bn-source) ::placeholder {\n    opacity: 1;\n  }\n@supports (not (-webkit-appearance: -apple-pay-button))  or (contain-intrinsic-size: 1px) {\n    :where(.bn-source) ::placeholder {\n      color: currentcolor;\n      @supports (color: color-mix(in lab, red, red)) {\n        color: color-mix(in oklab, currentcolor 50%, transparent);\n      }\n    }\n  }\n:where(.bn-source) textarea {\n    resize: vertical;\n  }\n:where(.bn-source) ::-webkit-search-decoration {\n    -webkit-appearance: none;\n  }\n:where(.bn-source) ::-webkit-date-and-time-value {\n    min-height: 1lh;\n    text-align: inherit;\n  }\n:where(.bn-source) ::-webkit-datetime-edit {\n    display: inline-flex;\n  }\n:where(.bn-source) ::-webkit-datetime-edit-fields-wrapper {\n    padding: 0;\n  }\n:where(.bn-source) ::-webkit-datetime-edit, :where(.bn-source) ::-webkit-datetime-edit-year-field, :where(.bn-source) ::-webkit-datetime-edit-month-field, :where(.bn-source) ::-webkit-datetime-edit-day-field, :where(.bn-source) ::-webkit-datetime-edit-hour-field, :where(.bn-source) ::-webkit-datetime-edit-minute-field, :where(.bn-source) ::-webkit-datetime-edit-second-field, :where(.bn-source) ::-webkit-datetime-edit-millisecond-field, :where(.bn-source) ::-webkit-datetime-edit-meridiem-field {\n    padding-block: 0;\n  }\n:where(.bn-source) ::-webkit-calendar-picker-indicator {\n    line-height: 1;\n  }\n:where(.bn-source) :-moz-ui-invalid {\n    box-shadow: none;\n  }\n:where(.bn-source) button, :where(.bn-source) input:where([type='button'], [type='reset'], [type='submit']), :where(.bn-source) ::file-selector-button {\n    appearance: button;\n  }\n:where(.bn-source) ::-webkit-inner-spin-button, :where(.bn-source) ::-webkit-outer-spin-button {\n    height: auto;\n  }\n:where(.bn-source) [hidden]:where(:not([hidden='until-found'])) {\n    display: none !important;\n  }\n.bn-source {\n  --color-foreground-full: var(--color-white);\n  --color-foreground-icon-primary: var(--color-neutral-950);\n  --color-foreground-icon-hover: var(--color-black);\n  --color-foreground-icon-secondary: var(--color-neutral-500);\n  --color-foreground-icon-tertiary: var(--color-neutral-400);\n  --color-foreground-icon-quaternary: var(--color-neutral-300);\n  --color-foreground-icon-error: var(--color-red-600);\n  --color-foreground-icon-disabled: var(--color-neutral-300);\n  --color-foreground-disabled: var(--color-neutral-400);\n  --color-foreground-disabled-danger: var(--color-red-300);\n  --color-input-disabled-foreground: var(--color-neutral-300);\n  --color-icon-button-disabled-foreground: var(--color-neutral-300);\n  --color-button-primary-disabled-foreground: var(--color-neutral-400);\n  --color-text-primary: var(--color-neutral-950);\n  --color-text-secondary: var(--color-neutral-500);\n  --color-text-tertiary: var(--color-neutral-400);\n  --color-text-disabled: var(--color-neutral-300);\n  --color-text-disabled-danger: var(--color-red-300);\n  --color-text-placeholder: var(--color-neutral-400);\n  --color-text-error-primary: var(--color-red-600);\n  --color-text-destructive: color-mix(in srgb, oklch(50.5% 0.213 27.518) 80%, oklch(43.9% 0 none));\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-text-destructive: color-mix(in srgb, var(--color-red-700) 80%, var(--color-neutral-600));\n  }\n  --color-input-disabled-text: var(--color-neutral-300);\n  --color-text-white: var(--color-white);\n  --color-background-full: var(--color-white);\n  --color-ticket-detail-surface: var(--color-white);\n  --color-ticket-detail-low-background: var(--color-indigo-200);\n  --color-ticket-detail-low-hover: var(--color-indigo-300);\n  --color-ticket-detail-medium-hover: var(--color-yellow-300);\n  --color-ticket-detail-high-hover: var(--color-orange-300);\n  --color-ticket-detail-urgent-hover: var(--color-rose-300);\n  --color-ticket-detail-low-text: var(--color-indigo-800);\n  --color-ticket-detail-resource-background: var(--color-blue-100);\n  --color-ticket-detail-resource-text: var(--color-blue-600);\n  --color-ticket-detail-favorite: #ffb83c;\n  --color-project-board-empty-panel: rgb(242 242 242 / 0.8);\n  --color-project-board-empty-front: #d9d9d9;\n  --color-project-board-empty-middle: #e5e5e5;\n  --color-project-board-empty-back: #ededed;\n  --color-project-board-empty-detail: var(--color-white);\n  --color-background-primary-default: var(--color-white);\n  --color-background-inner-default: var(--color-white);\n  --color-background-primary-hover: var(--color-neutral-100);\n  --color-background-primary-active: var(--color-neutral-200);\n  --color-background-primary-disabled: var(--color-neutral-100);\n  --color-input-disabled-background: var(--color-neutral-100);\n  --color-background-secondary-default: var(--color-neutral-100);\n  --color-background-secondary-hover: var(--color-neutral-200);\n  --color-background-tertiary-default: var(--color-neutral-200);\n  --color-background-tertiary-hover: var(--color-neutral-300);\n  --color-background-tertiary-error: var(--color-red-100);\n  --color-background-recent-hire-role: var(--color-neutral-100);\n  --color-avatar-neutral-background: var(--color-neutral-300);\n  --color-background-quaternary-default: var(--color-neutral-300);\n  --color-background-quaternary-hover: var(--color-neutral-400);\n  --color-background-quaternary-error: var(--color-red-200);\n  --color-file-upload-icon-background: var(--color-neutral-300);\n  --color-file-upload-icon-foreground: var(--color-neutral-400);\n  --color-file-upload-icon-foreground-hover: var(--color-neutral-500);\n  --color-border-button-default: var(--color-neutral-200);\n  --color-border-button-hover: var(--color-neutral-300);\n  --color-border-button-active: var(--color-neutral-400);\n  --color-border-button-white: var(--color-white);\n  --color-border-error-default: var(--color-red-500);\n  --color-border-checkbox-default: var(--color-neutral-300);\n  --color-border-checkbox-hover: var(--color-neutral-400);\n  --color-border-checkbox-active: var(--color-neutral-400);\n  --color-border-checkbox-white: var(--color-white);\n  --color-border-component-detail-container: var(--color-neutral-200);\n  --color-border-ai-profile-card: var(--color-neutral-200);\n  --color-border-table: var(--color-neutral-200);\n  --color-border-button-group: var(--color-neutral-200);\n  --color-border-sidebar-profile-hover: var(--color-neutral-300);\n  --color-separator-border: var(--color-neutral-200);\n  --color-separator-border-strong: var(--color-neutral-200);\n  --color-border-focus-ring: var(--color-accent-500);\n  --color-state-success-text: var(--color-lime-800);\n  --color-state-success-base: var(--color-lime-200);\n  --color-control-indicator-background: var(--color-white);\n  --color-control-indicator-background-subtle: var(--color-neutral-100);\n  --color-switch-off-chip-start: var(--color-white);\n  --color-switch-off-chip-end: var(--color-neutral-100);\n  --color-switch-on-chip-start: color-mix(in srgb, oklch(62.3% 0.214 259.815) 63%, oklch(54.6% 0.245 262.881));\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-switch-on-chip-start: color-mix(in oklab, var(--color-accent-500) 63%, var(--color-accent-600));\n  }\n  --color-switch-on-chip-end: color-mix(in srgb, oklch(54.6% 0.245 262.881) 16%, oklch(48.8% 0.243 264.376));\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-switch-on-chip-end: color-mix(in oklab, var(--color-accent-600) 16%, var(--color-accent-700));\n  }\n  --color-stat-card-icon-background: var(--color-white);\n  --color-segmented-control-background: var(--color-neutral-100);\n  --color-segmented-control-selected-background: var(--color-white);\n  --color-theme-toggle-sidebar-background: var(--color-neutral-200);\n  --color-theme-toggle-sidebar-selected-background: var(--color-white);\n  --color-ai-chat-composer-add-background: var(--color-neutral-100);\n  --color-ai-chat-composer-add-hover-background: var(--color-neutral-200);\n  --color-composer-panel-tab-background: var(--color-neutral-200);\n  --color-composer-panel-add-background: var(--color-neutral-200);\n  --color-composer-panel-add-hover-background: var(--color-neutral-300);\n  --color-composer-panel-tile-border: var(--color-neutral-200);\n  --color-composer-panel-rail-background: var(--color-neutral-100);\n  --color-questionnaire-key-background: var(--color-neutral-100);\n  --color-questionnaire-key-hover-background: var(--color-neutral-200);\n  --color-agent-progress-ring: var(--color-neutral-700);\n  --color-button-ghost-background: var(--color-accent-100);\n  --color-button-ghost-hover: var(--color-accent-200);\n  --color-button-ghost-active: var(--color-accent-300);\n  --color-button-ghost-disabled: var(--color-accent-50);\n  --color-button-ghost-foreground: var(--color-accent-700);\n  --color-button-ghost-disabled-foreground: var(--color-accent-300);\n  --color-dropdown-item-hover-background: var(--color-neutral-100);\n  --color-kbd-background: var(--color-neutral-300);\n  --color-kbd-foreground: var(--color-neutral-500);\n  --color-docs-file-chip-background: var(--color-purple-50);\n  --color-docs-file-chip-border: var(--color-purple-100);\n  --color-docs-file-chip-foreground: var(--color-purple-500);\n  --color-docs-command-accent: var(--color-purple-400);\n  --color-docs-code-background: var(--color-background-primary-default);\n  --color-docs-install-rail: var(--color-border-button-default);\n  --color-badge-neutral-background: var(--color-neutral-200);\n  --color-team-menu-count-background: var(--color-neutral-200);\n  --color-team-menu-count-foreground: var(--color-neutral-500);\n  --color-badge-new-background: var(--color-accent-100);\n  --color-badge-new-text: var(--color-accent-600);\n  --color-tab-count-selected-background: var(--color-accent-100);\n  --color-pill-tab-blue-selected-background: var(--color-accent-50);\n  --color-pill-tab-blue-hover-background: var(--color-neutral-100);\n  --color-notification-information-background: var(--color-blue-100);\n  --color-notification-information-foreground: var(--color-blue-600);\n  --color-notification-success-background: var(--color-lime-100);\n  --color-notification-success-foreground: var(--color-lime-600);\n  --color-notification-error-background: var(--color-rose-100);\n  --color-notification-error-foreground: var(--color-rose-600);\n  --color-notification-center-background: var(--color-white);\n  --color-status-lime-background: var(--color-lime-200);\n  --color-status-lime-text: var(--color-lime-800);\n  --color-status-yellow-background: var(--color-yellow-200);\n  --color-status-yellow-text: var(--color-yellow-800);\n  --color-status-rose-background: var(--color-rose-200);\n  --color-status-rose-text: var(--color-rose-800);\n  --color-status-cyan-background: var(--color-cyan-200);\n  --color-status-cyan-text: var(--color-cyan-800);\n  --color-status-orange-background: var(--color-orange-200);\n  --color-status-orange-text: var(--color-orange-800);\n  --color-status-blue-background: var(--color-blue-200);\n  --color-status-blue-text: var(--color-blue-800);\n  --color-status-purple-background: var(--color-purple-100);\n  --color-status-purple-text: var(--color-purple-600);\n  --color-status-dot-green-halo: var(--color-green-100);\n  --color-status-dot-yellow-halo: var(--color-yellow-200);\n  --color-status-dot-indigo-halo: var(--color-indigo-100);\n  --color-date-range-background: var(--color-accent-100);\n  --color-date-range-edge-background: var(--color-accent-300);\n  --color-calendar-event-blue-background: var(--color-blue-100);\n  --color-calendar-event-blue-title: var(--color-blue-700);\n  --color-calendar-event-blue-time: var(--color-blue-700);\n  --color-calendar-event-pink-background: var(--color-pink-100);\n  --color-calendar-event-pink-title: var(--color-pink-700);\n  --color-calendar-event-pink-time: var(--color-pink-700);\n  --color-calendar-event-purple-background: var(--color-purple-100);\n  --color-calendar-event-purple-title: var(--color-purple-700);\n  --color-calendar-event-purple-time: var(--color-purple-700);\n  --color-calendar-event-lime-background: var(--color-lime-100);\n  --color-calendar-event-lime-title: var(--color-lime-800);\n  --color-calendar-event-lime-time: var(--color-lime-700);\n  --color-calendar-event-emerald-background: var(--color-emerald-100);\n  --color-calendar-event-emerald-title: var(--color-emerald-800);\n  --color-calendar-event-emerald-time: var(--color-emerald-700);\n  --color-text-error-placeholder: var(--color-red-400);\n  --color-chart-track: var(--color-neutral-200);\n  --color-chart-cursor: var(--color-neutral-300);\n  --color-chart-neutral: var(--color-neutral-300);\n  --color-chart-1: var(--color-teal-400);\n  --color-chart-1-active: var(--color-teal-500);\n  --color-chart-2: var(--color-lime-400);\n  --color-chart-2-active: var(--color-lime-500);\n  --color-chart-3: var(--color-pink-400);\n  --color-chart-3-active: var(--color-pink-500);\n  --color-chart-4: var(--color-sky-400);\n  --color-chart-4-active: var(--color-sky-500);\n  --color-chart-5: var(--color-purple-400);\n  --color-chart-5-active: var(--color-purple-500);\n  --color-chart-6: var(--color-blue-400);\n  --color-chart-6-active: var(--color-blue-500);\n  --color-chart-7: var(--color-emerald-400);\n  --color-chart-7-active: var(--color-emerald-500);\n  --color-chart-8: var(--color-yellow-400);\n  --color-chart-8-active: var(--color-yellow-500);\n  --color-chart-9: var(--color-indigo-400);\n  --color-chart-9-active: var(--color-indigo-500);\n  --color-chart-agents-bar: var(--color-purple-300);\n  --color-chart-agents-bar-active: var(--color-purple-400);\n  --gradient-button-primary-default: linear-gradient(180deg, var(--color-accent-500)    0%, var(--color-accent-600)    100%);\n  --gradient-button-primary-hover: linear-gradient(180deg, var(--color-accent-400)    0%, var(--color-accent-500)    100%);\n  --gradient-button-primary-active: linear-gradient(180deg, var(--color-accent-600)    0%, var(--color-accent-700)    100%);\n  --gradient-button-primary-disabled: linear-gradient(180deg, var(--color-neutral-200) 0%, var(--color-neutral-300) 100%);\n  --gradient-button-danger-default: linear-gradient(180deg, var(--color-red-500) 0%, var(--color-red-600) 100%);\n  --gradient-button-danger-hover: linear-gradient(180deg, var(--color-red-400) 0%, var(--color-red-500) 100%);\n  --gradient-button-danger-active: linear-gradient(180deg, var(--color-red-600) 0%, var(--color-red-700) 100%);\n  --gradient-button-danger-disabled: linear-gradient(180deg, var(--color-red-100) 0%, var(--color-red-200) 100%);\n}\n:where(.dark) .bn-source, .bn-source.dark {\n  --color-foreground-full: var(--color-neutral-700);\n  --color-foreground-icon-primary: var(--color-neutral-50);\n  --color-foreground-icon-hover: var(--color-white);\n  --color-foreground-icon-error: var(--color-red-400);\n  --color-foreground-icon-tertiary: var(--color-neutral-600);\n  --color-foreground-icon-quaternary: var(--color-neutral-700);\n  --color-foreground-icon-disabled: var(--color-neutral-800);\n  --color-foreground-disabled: var(--color-neutral-700);\n  --color-foreground-disabled-danger: var(--color-red-400);\n  --color-input-disabled-foreground: var(--color-neutral-600);\n  --color-icon-button-disabled-foreground: var(--color-neutral-500);\n  --color-button-primary-disabled-foreground: var(--color-neutral-500);\n  --color-text-primary: var(--color-neutral-50);\n  --color-text-tertiary: var(--color-neutral-600);\n  --color-text-disabled: var(--color-neutral-800);\n  --color-text-error-primary: var(--color-red-400);\n  --color-text-destructive: color-mix(in srgb, oklch(63.7% 0.237 25.331) 80%, oklch(55.6% 0 none));\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-text-destructive: color-mix(in srgb, var(--color-red-500) 80%, var(--color-neutral-500));\n  }\n  --color-input-disabled-text: color-mix(in srgb, oklch(55.6% 0 none) 40%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-input-disabled-text: color-mix(in srgb, var(--color-neutral-500) 40%, transparent);\n  }\n  --color-background-full: var(--color-neutral-925);\n  --color-ticket-detail-surface: var(--color-neutral-925);\n  --color-ticket-detail-low-background: color-mix(in srgb, oklch(25.7% 0.09 281.288) 60%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-ticket-detail-low-background: color-mix(in srgb, var(--color-indigo-950) 60%, transparent);\n  }\n  --color-ticket-detail-low-hover: color-mix(in srgb, oklch(25.7% 0.09 281.288) 80%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-ticket-detail-low-hover: color-mix(in srgb, var(--color-indigo-950) 80%, transparent);\n  }\n  --color-ticket-detail-medium-hover: color-mix(in srgb, oklch(28.6% 0.066 53.813) 80%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-ticket-detail-medium-hover: color-mix(in srgb, var(--color-yellow-950) 80%, transparent);\n  }\n  --color-ticket-detail-high-hover: color-mix(in srgb, oklch(26.6% 0.079 36.259) 80%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-ticket-detail-high-hover: color-mix(in srgb, var(--color-orange-950) 80%, transparent);\n  }\n  --color-ticket-detail-urgent-hover: color-mix(in srgb, oklch(27.1% 0.105 12.094) 80%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-ticket-detail-urgent-hover: color-mix(in srgb, var(--color-rose-950) 80%, transparent);\n  }\n  --color-ticket-detail-low-text: var(--color-indigo-300);\n  --color-ticket-detail-resource-background: color-mix(in srgb, oklch(28.2% 0.091 267.935) 60%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-ticket-detail-resource-background: color-mix(in srgb, var(--color-blue-950) 60%, transparent);\n  }\n  --color-ticket-detail-resource-text: var(--color-blue-300);\n  --color-project-board-empty-panel: color-mix(in srgb, oklch(26.9% 0 none) 60%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-project-board-empty-panel: color-mix(in srgb, var(--color-neutral-800) 60%, transparent);\n  }\n  --color-project-board-empty-front: color-mix(in srgb, oklch(26.9% 0 none) 75%, oklch(37.1% 0 none));\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-project-board-empty-front: color-mix(in srgb, var(--color-neutral-800) 75%, var(--color-neutral-700));\n  }\n  --color-project-board-empty-middle: var(--color-neutral-700);\n  --color-project-board-empty-back: color-mix(in srgb, oklch(43.9% 0 none) 35%, oklch(37.1% 0 none));\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-project-board-empty-back: color-mix(in srgb, var(--color-neutral-600) 35%, var(--color-neutral-700));\n  }\n  --color-project-board-empty-detail: var(--color-neutral-500);\n  --color-background-primary-default: var(--color-neutral-800);\n  --color-background-inner-default: color-mix(in srgb, oklch(26.9% 0 none) 60%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-background-inner-default: color-mix(in srgb, var(--color-neutral-800) 60%, transparent);\n  }\n  --color-background-primary-hover: color-mix(in srgb, oklch(37.1% 0 none) 60%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-background-primary-hover: color-mix(in srgb, var(--color-neutral-700) 60%, transparent);\n  }\n  --color-background-primary-active: var(--color-neutral-800);\n  --color-background-primary-disabled: var(--color-neutral-800);\n  --color-input-disabled-background: color-mix(in srgb, oklch(26.9% 0 none) 30%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-input-disabled-background: color-mix(in srgb, var(--color-neutral-800) 30%, transparent);\n  }\n  --color-switch-off-chip-start: var(--color-background-tertiary-default);\n  --color-switch-off-chip-end: var(--color-background-tertiary-default);\n  --color-background-secondary-default: var(--color-neutral-900);\n  --color-background-secondary-hover: var(--color-neutral-800);\n  --color-background-tertiary-default: var(--color-neutral-800);\n  --color-background-tertiary-hover: var(--color-neutral-700);\n  --color-background-tertiary-error: color-mix(in srgb, oklch(25.8% 0.092 26.042) 60%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-background-tertiary-error: color-mix(in srgb, var(--color-red-950) 60%, transparent);\n  }\n  --color-background-quaternary-default: var(--color-neutral-700);\n  --color-background-quaternary-hover: var(--color-neutral-600);\n  --color-background-recent-hire-role: color-mix(in srgb, oklch(20.5% 0 none) 60%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-background-recent-hire-role: color-mix(in srgb, var(--color-neutral-900) 60%, transparent);\n  }\n  --color-avatar-neutral-background: var(--color-background-primary-default);\n  --color-file-upload-icon-background: var(--color-neutral-600);\n  --color-file-upload-icon-foreground: var(--color-neutral-400);\n  --color-file-upload-icon-foreground-hover: var(--color-neutral-300);\n  --color-stat-card-icon-background: var(--color-neutral-800);\n  --color-segmented-control-background: var(--color-neutral-925);\n  --color-segmented-control-selected-background: var(--color-neutral-800);\n  --color-theme-toggle-sidebar-background: var(--color-neutral-800);\n  --color-theme-toggle-sidebar-selected-background: var(--color-neutral-700);\n  --color-ai-chat-composer-add-background: var(--color-neutral-700);\n  --color-ai-chat-composer-add-hover-background: var(--color-neutral-600);\n  --color-composer-panel-tab-background: color-mix(in srgb, oklch(37.1% 0 none) 50%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-composer-panel-tab-background: color-mix(in srgb, var(--color-neutral-700) 50%, transparent);\n  }\n  --color-composer-panel-add-background: var(--color-neutral-700);\n  --color-composer-panel-add-hover-background: var(--color-neutral-600);\n  --color-composer-panel-tile-border: color-mix(in srgb, #fff 14%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-composer-panel-tile-border: color-mix(in srgb, var(--color-white) 14%, transparent);\n  }\n  --color-composer-panel-rail-background: color-mix(in srgb, oklch(20.5% 0 none) 50%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-composer-panel-rail-background: color-mix(in srgb, var(--color-neutral-900) 50%, transparent);\n  }\n  --color-questionnaire-key-background: var(--color-neutral-700);\n  --color-questionnaire-key-hover-background: var(--color-neutral-600);\n  --color-agent-progress-ring: color-mix(in srgb, #fff 50%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-agent-progress-ring: color-mix(in srgb, var(--color-white) 50%, transparent);\n  }\n  --color-button-ghost-background: var(--color-accent-900);\n  --color-button-ghost-hover: var(--color-accent-800);\n  --color-button-ghost-active: var(--color-accent-700);\n  --color-button-ghost-disabled: var(--color-neutral-800);\n  --color-button-ghost-foreground: var(--color-accent-300);\n  --color-button-ghost-disabled-foreground: var(--color-neutral-600);\n  --color-dropdown-item-hover-background: color-mix(in srgb, oklch(37.1% 0 none) 60%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-dropdown-item-hover-background: color-mix(in srgb, var(--color-neutral-700) 60%, transparent);\n  }\n  --color-kbd-background: var(--color-neutral-700);\n  --color-kbd-foreground: var(--color-neutral-400);\n  --color-docs-file-chip-background: color-mix(in srgb, oklch(29.1% 0.149 302.717) 50%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-docs-file-chip-background: color-mix(in srgb, var(--color-purple-950) 50%, transparent);\n  }\n  --color-docs-file-chip-border: var(--color-purple-800);\n  --color-docs-file-chip-foreground: var(--color-purple-400);\n  --color-docs-code-background: var(--color-background-full);\n  --color-docs-install-rail: color-mix(in srgb, oklch(26.9% 0 none) 60%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-docs-install-rail: color-mix(in srgb, var(--color-neutral-800) 60%, transparent);\n  }\n  --shadow-2xs: 0 1px rgb(0 0 0 / 0.16);\n  --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.18);\n  --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.12), 0 1px 3px 0 rgb(0 0 0 / 0.16);\n  --shadow-md: 0 2px 4px -1px rgb(0 0 0 / 0.12), 0 4px 6px -1px rgb(0 0 0 / 0.18);\n  --shadow-lg: 0 4px 6px -2px rgb(0 0 0 / 0.10), 0 10px 15px -3px rgb(0 0 0 / 0.18);\n  --shadow-xl: 0 10px 10px -5px rgb(0 0 0 / 0.08), 0 20px 25px -5px rgb(0 0 0 / 0.20);\n  --shadow-card: 0 1px 1px 0 rgb(0 0 0 / 0.14);\n  --shadow-dropdown: 0 1px 1px 0 rgb(0 0 0 / 0.14),\n    0 4px 4px 0 rgb(0 0 0 / 0.10);\n  --shadow-sidebar: 0 1px 0 0 rgb(0 0 0 / 0.10),\n    0 1px 12px 0 rgb(0 0 0 / 0.16),\n    0 0 1px 0 rgb(0 0 0 / 0.42);\n  --shadow-waitlist: 0 0 6px 0 rgb(0 0 0 / 0.12),\n    0 0 64px 0 rgb(0 0 0 / 0.22),\n    0 0 1px 0 rgb(0 0 0 / 0.42),\n    0 1px 12px 0 rgb(0 0 0 / 0.14),\n    0 1px 0 0 rgb(0 0 0 / 0.08);\n  --color-badge-neutral-background: var(--color-neutral-800);\n  --color-team-menu-count-background: var(--color-neutral-700);\n  --color-team-menu-count-foreground: var(--color-neutral-400);\n  --color-badge-new-background: var(--color-accent-950);\n  --color-badge-new-text: var(--color-accent-400);\n  --color-tab-count-selected-background: color-mix(in srgb, oklch(42.4% 0.199 265.638) 60%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-tab-count-selected-background: color-mix(in srgb, var(--color-accent-800) 60%, transparent);\n  }\n  --color-notification-information-background: color-mix(in srgb, oklch(42.4% 0.199 265.638) 50%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-notification-information-background: color-mix(in srgb, var(--color-blue-800) 50%, transparent);\n  }\n  --color-notification-information-foreground: var(--color-blue-300);\n  --color-notification-success-background: color-mix(in srgb, oklch(45.3% 0.124 130.933) 50%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-notification-success-background: color-mix(in srgb, var(--color-lime-800) 50%, transparent);\n  }\n  --color-notification-success-foreground: var(--color-lime-300);\n  --color-notification-error-background: color-mix(in srgb, oklch(45.5% 0.188 13.697) 50%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-notification-error-background: color-mix(in srgb, var(--color-rose-800) 50%, transparent);\n  }\n  --color-notification-error-foreground: var(--color-rose-300);\n  --color-notification-center-background: var(--color-neutral-900);\n  --color-border-button-default: var(--color-neutral-700);\n  --color-border-button-hover: var(--color-neutral-500);\n  --color-border-button-active: var(--color-neutral-600);\n  --color-border-button-white: var(--color-zinc-800);\n  --color-border-error-default: var(--color-red-400);\n  --color-border-checkbox-default: var(--color-neutral-700);\n  --color-border-checkbox-hover: var(--color-neutral-500);\n  --color-border-checkbox-active: var(--color-neutral-500);\n  --color-border-component-detail-container: var(--color-neutral-800);\n  --color-border-ai-profile-card: var(--color-neutral-800);\n  --color-border-table: var(--color-neutral-800);\n  --color-border-button-group: color-mix(in srgb, oklch(43.9% 0 none) 60%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-border-button-group: color-mix(in srgb, var(--color-neutral-600) 60%, transparent);\n  }\n  --color-border-sidebar-profile-hover: var(--color-neutral-600);\n  --color-separator-border: var(--color-neutral-800);\n  --color-separator-border-strong: color-mix(in srgb, oklch(37.1% 0 none) 60%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-separator-border-strong: color-mix(in srgb, var(--color-neutral-700) 60%, transparent);\n  }\n  --color-status-lime-background: color-mix(in srgb, oklch(27.4% 0.072 132.109) 60%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-status-lime-background: color-mix(in srgb, var(--color-lime-950) 60%, transparent);\n  }\n  --color-status-lime-text: var(--color-lime-500);\n  --color-status-yellow-background: color-mix(in srgb, oklch(28.6% 0.066 53.813) 60%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-status-yellow-background: color-mix(in srgb, var(--color-yellow-950) 60%, transparent);\n  }\n  --color-status-yellow-text: var(--color-yellow-500);\n  --color-status-rose-background: color-mix(in srgb, oklch(27.1% 0.105 12.094) 60%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-status-rose-background: color-mix(in srgb, var(--color-rose-950) 60%, transparent);\n  }\n  --color-status-rose-text: var(--color-rose-500);\n  --color-status-cyan-background: color-mix(in srgb, oklch(30.2% 0.056 229.695) 60%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-status-cyan-background: color-mix(in srgb, var(--color-cyan-950) 60%, transparent);\n  }\n  --color-status-cyan-text: var(--color-cyan-400);\n  --color-status-orange-background: color-mix(in srgb, oklch(26.6% 0.079 36.259) 60%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-status-orange-background: color-mix(in srgb, var(--color-orange-950) 60%, transparent);\n  }\n  --color-status-orange-text: var(--color-orange-500);\n  --color-status-blue-background: color-mix(in srgb, oklch(28.2% 0.091 267.935) 60%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-status-blue-background: color-mix(in srgb, var(--color-blue-950) 60%, transparent);\n  }\n  --color-status-blue-text: var(--color-blue-300);\n  --color-status-purple-background: color-mix(in srgb, oklch(38.1% 0.176 304.987) 50%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-status-purple-background: color-mix(in srgb, var(--color-purple-900) 50%, transparent);\n  }\n  --color-status-purple-text: var(--color-purple-300);\n  --color-status-dot-green-halo: color-mix(in srgb, oklch(44.8% 0.119 151.328) 40%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-status-dot-green-halo: color-mix(in srgb, var(--color-green-800) 40%, transparent);\n  }\n  --color-status-dot-yellow-halo: color-mix(in srgb, oklch(47.6% 0.114 61.907) 40%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-status-dot-yellow-halo: color-mix(in srgb, var(--color-yellow-800) 40%, transparent);\n  }\n  --color-status-dot-indigo-halo: color-mix(in srgb, oklch(39.8% 0.195 277.366) 40%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-status-dot-indigo-halo: color-mix(in srgb, var(--color-indigo-800) 40%, transparent);\n  }\n  --color-date-range-background: var(--color-accent-950);\n  --color-date-range-edge-background: var(--color-accent-800);\n  --color-pill-tab-blue-selected-background: color-mix(in srgb, oklch(28.2% 0.091 267.935) 60%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-pill-tab-blue-selected-background: color-mix(in srgb, var(--color-accent-950) 60%, transparent);\n  }\n  --color-pill-tab-blue-hover-background: var(--color-neutral-800);\n  --color-calendar-event-blue-background: var(--color-blue-950);\n  --color-calendar-event-blue-title: var(--color-blue-300);\n  --color-calendar-event-blue-time: var(--color-blue-300);\n  --color-calendar-event-pink-background: var(--color-pink-950);\n  --color-calendar-event-pink-title: var(--color-pink-300);\n  --color-calendar-event-pink-time: var(--color-pink-300);\n  --color-calendar-event-purple-background: var(--color-purple-950);\n  --color-calendar-event-purple-title: var(--color-purple-300);\n  --color-calendar-event-purple-time: var(--color-purple-300);\n  --color-calendar-event-lime-background: var(--color-lime-950);\n  --color-calendar-event-lime-title: var(--color-lime-300);\n  --color-calendar-event-lime-time: var(--color-lime-300);\n  --color-calendar-event-emerald-background: var(--color-emerald-950);\n  --color-calendar-event-emerald-title: var(--color-emerald-300);\n  --color-calendar-event-emerald-time: var(--color-emerald-300);\n  --gradient-button-primary-disabled: linear-gradient(\n    180deg,\n    var(--color-neutral-700) 0%,\n    var(--color-neutral-800) 100%\n  );\n  --gradient-button-danger-disabled: linear-gradient(\n    180deg,\n    var(--color-red-900) 0%,\n    var(--color-red-950) 100%\n  );\n  --color-chart-track: var(--color-neutral-800);\n  --color-chart-cursor: var(--color-neutral-700);\n  --color-chart-neutral: var(--color-neutral-800);\n  --color-chart-agents-bar: var(--color-purple-500);\n  --color-chart-agents-bar-active: var(--color-purple-600);\n}\n.bn-source .dark[data-accent] {\n  --color-badge-new-background: color-mix(in srgb, oklch(28.2% 0.091 267.935) 50%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    --color-badge-new-background: color-mix(in srgb, var(--color-accent-950) 50%, transparent);\n  }\n}\n.bn-source .bg-button-danger {\n  position: relative;\n  isolation: isolate;\n  background-image: var(--gradient-button-danger-default);\n  &::before {\n    content: \"\";\n    position: absolute;\n    inset: 0;\n    z-index: -1;\n    pointer-events: none;\n    border-radius: inherit;\n    background-image: var(--gradient-button-danger-hover);\n    opacity: 0;\n    transition: opacity var(--button-transition-ms) ease;\n  }\n  &:hover:not(:disabled):not([aria-disabled=\"true\"])::before {\n    opacity: 1;\n  }\n  &:active:not(:disabled):not([aria-disabled=\"true\"]) {\n    background-image: var(--gradient-button-danger-active);\n  }\n  &:active:not(:disabled):not([aria-disabled=\"true\"])::before {\n    opacity: 0;\n  }\n  &:disabled, &[aria-disabled=\"true\"] {\n    background-image: var(--gradient-button-danger-disabled);\n  }\n  &:disabled::before, &[aria-disabled=\"true\"]::before {\n    display: none;\n  }\n}\n.bn-source .bg-button-primary {\n  position: relative;\n  isolation: isolate;\n  background-image: var(--gradient-button-primary-default);\n  &::before {\n    content: \"\";\n    position: absolute;\n    inset: 0;\n    z-index: -1;\n    pointer-events: none;\n    border-radius: inherit;\n    background-image: var(--gradient-button-primary-hover);\n    opacity: 0;\n    transition: opacity var(--button-transition-ms) ease;\n  }\n  &:hover:not(:disabled):not([aria-disabled=\"true\"])::before {\n    opacity: 1;\n  }\n  &:active:not(:disabled):not([aria-disabled=\"true\"]) {\n    background-image: var(--gradient-button-primary-active);\n  }\n  &:active:not(:disabled):not([aria-disabled=\"true\"])::before {\n    opacity: 0;\n  }\n  &:disabled, &[aria-disabled=\"true\"] {\n    background-image: var(--gradient-button-primary-disabled);\n  }\n  &:disabled::before, &[aria-disabled=\"true\"]::before {\n    display: none;\n  }\n}\n.bn-source .pointer-events-auto {\n  pointer-events: auto;\n}\n.bn-source .pointer-events-none {\n  pointer-events: none;\n}\n.bn-source .collapse {\n  visibility: collapse;\n}\n.bn-source .invisible {\n  visibility: hidden;\n}\n.bn-source .visible {\n  visibility: visible;\n}\n.bn-source .sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip-path: inset(50%);\n  white-space: nowrap;\n  border-width: 0;\n}\n.bn-source .absolute {\n  position: absolute;\n}\n.bn-source .fixed {\n  position: fixed;\n}\n.bn-source .relative {\n  position: relative;\n}\n.bn-source .static {\n  position: static;\n}\n.bn-source .sticky {\n  position: sticky;\n}\n.bn-source .inset-0 {\n  inset: 0px;\n}\n.bn-source .inset-0\\.5 {\n  inset: calc(var(--spacing) * 0.5);\n}\n.bn-source .inset-x-0 {\n  inset-inline: 0px;\n}\n.bn-source .-inset-y-px {\n  inset-block: -1px;\n}\n.bn-source .inset-y-0 {\n  inset-block: 0px;\n}\n.bn-source .-start-0\\.5 {\n  inset-inline-start: calc(var(--spacing) * -0.5);\n}\n.bn-source .-start-1\\.5 {\n  inset-inline-start: calc(var(--spacing) * -1.5);\n}\n.bn-source .start-0 {\n  inset-inline-start: calc(var(--spacing) * 0);\n}\n.bn-source .start-0\\.5 {\n  inset-inline-start: calc(var(--spacing) * 0.5);\n}\n.bn-source .start-1 {\n  inset-inline-start: calc(var(--spacing) * 1);\n}\n.bn-source .start-1\\/2 {\n  inset-inline-start: calc(1/2 * 100%);\n}\n.bn-source .start-3 {\n  inset-inline-start: calc(var(--spacing) * 3);\n}\n.bn-source .start-4 {\n  inset-inline-start: calc(var(--spacing) * 4);\n}\n.bn-source .start-\\[3px\\] {\n  inset-inline-start: 3px;\n}\n.bn-source .start-\\[328px\\] {\n  inset-inline-start: 328px;\n}\n.bn-source .start-full {\n  inset-inline-start: 100%;\n}\n.bn-source .-end-1 {\n  inset-inline-end: calc(var(--spacing) * -1);\n}\n.bn-source .-end-1\\.5 {\n  inset-inline-end: calc(var(--spacing) * -1.5);\n}\n.bn-source .end-0 {\n  inset-inline-end: calc(var(--spacing) * 0);\n}\n.bn-source .end-1\\/2 {\n  inset-inline-end: calc(1/2 * 100%);\n}\n.bn-source .end-3 {\n  inset-inline-end: calc(var(--spacing) * 3);\n}\n.bn-source .end-4 {\n  inset-inline-end: calc(var(--spacing) * 4);\n}\n.bn-source .end-full {\n  inset-inline-end: 100%;\n}\n.bn-source .-top-1 {\n  top: calc(var(--spacing) * -1);\n}\n.bn-source .-top-1\\/4 {\n  top: calc(calc(1 / 4 * 100%) * -1);\n}\n.bn-source .-top-\\[9\\.5px\\] {\n  top: calc(9.5px * -1);\n}\n.bn-source .-top-\\[11px\\] {\n  top: calc(11px * -1);\n}\n.bn-source .top-0 {\n  top: 0px;\n}\n.bn-source .top-0\\.5 {\n  top: calc(var(--spacing) * 0.5);\n}\n.bn-source .top-1 {\n  top: var(--spacing);\n}\n.bn-source .top-1\\/2 {\n  top: calc(1 / 2 * 100%);\n}\n.bn-source .top-1\\/4 {\n  top: calc(1 / 4 * 100%);\n}\n.bn-source .top-3 {\n  top: calc(var(--spacing) * 3);\n}\n.bn-source .top-4 {\n  top: calc(var(--spacing) * 4);\n}\n.bn-source .top-5 {\n  top: calc(var(--spacing) * 5);\n}\n.bn-source .top-8 {\n  top: calc(var(--spacing) * 8);\n}\n.bn-source .top-\\[3px\\] {\n  top: 3px;\n}\n.bn-source .top-\\[15px\\] {\n  top: 15px;\n}\n.bn-source .top-\\[19px\\] {\n  top: 19px;\n}\n.bn-source .top-full {\n  top: 100%;\n}\n.bn-source .right-0 {\n  right: 0px;\n}\n.bn-source .right-1\\/4 {\n  right: calc(1 / 4 * 100%);\n}\n.bn-source .right-3 {\n  right: calc(var(--spacing) * 3);\n}\n.bn-source .-bottom-0\\.5 {\n  bottom: calc(var(--spacing) * -0.5);\n}\n.bn-source .-bottom-1\\/4 {\n  bottom: calc(calc(1 / 4 * 100%) * -1);\n}\n.bn-source .-bottom-\\[4\\.5px\\] {\n  bottom: calc(4.5px * -1);\n}\n.bn-source .-bottom-px {\n  bottom: -1px;\n}\n.bn-source .bottom-0 {\n  bottom: 0px;\n}\n.bn-source .bottom-3 {\n  bottom: calc(var(--spacing) * 3);\n}\n.bn-source .bottom-4 {\n  bottom: calc(var(--spacing) * 4);\n}\n.bn-source .bottom-\\[calc\\(100\\%\\+9px\\)\\] {\n  bottom: calc(100% + 9px);\n}\n.bn-source .bottom-full {\n  bottom: 100%;\n}\n.bn-source .-left-1\\/4 {\n  left: calc(calc(1 / 4 * 100%) * -1);\n}\n.bn-source .left-0 {\n  left: 0px;\n}\n.bn-source .left-1\\/2 {\n  left: calc(1 / 2 * 100%);\n}\n.bn-source .left-3 {\n  left: calc(var(--spacing) * 3);\n}\n.bn-source .isolate {\n  isolation: isolate;\n}\n.bn-source .z-5 {\n  z-index: 5;\n}\n.bn-source .z-10 {\n  z-index: 10;\n}\n.bn-source .z-20 {\n  z-index: 20;\n}\n.bn-source .z-30 {\n  z-index: 30;\n}\n.bn-source .z-50 {\n  z-index: 50;\n}\n.bn-source .z-100 {\n  z-index: 100;\n}\n.bn-source .order-1 {\n  order: 1;\n}\n.bn-source .order-2 {\n  order: 2;\n}\n.bn-source .order-3 {\n  order: 3;\n}\n.bn-source .col-start-1 {\n  grid-column-start: 1;\n}\n.bn-source .row-start-1 {\n  grid-row-start: 1;\n}\n.bn-source .container {\n  width: 100%;\n  @media (width >= 40rem) {\n    max-width: 40rem;\n  }\n  @media (width >= 48rem) {\n    max-width: 48rem;\n  }\n  @media (width >= 64rem) {\n    max-width: 64rem;\n  }\n  @media (width >= 80rem) {\n    max-width: 80rem;\n  }\n  @media (width >= 96rem) {\n    max-width: 96rem;\n  }\n}\n.bn-source .-m-2 {\n  margin: calc(var(--spacing) * -2);\n}\n.bn-source .-m-3 {\n  margin: calc(var(--spacing) * -3);\n}\n.bn-source .m-0 {\n  margin: 0px;\n}\n.bn-source .-mx-1 {\n  margin-inline: calc(var(--spacing) * -1);\n}\n.bn-source .-mx-2\\.5 {\n  margin-inline: calc(var(--spacing) * -2.5);\n}\n.bn-source .-mx-3 {\n  margin-inline: calc(var(--spacing) * -3);\n}\n.bn-source .mx-1 {\n  margin-inline: var(--spacing);\n}\n.bn-source .my-1\\.5 {\n  margin-block: calc(var(--spacing) * 1.5);\n}\n.bn-source .my-2\\.5 {\n  margin-block: calc(var(--spacing) * 2.5);\n}\n.bn-source .my-3\\.5 {\n  margin-block: calc(var(--spacing) * 3.5);\n}\n.bn-source .my-5 {\n  margin-block: calc(var(--spacing) * 5);\n}\n.bn-source .-ms-2 {\n  margin-inline-start: calc(var(--spacing) * -2);\n}\n.bn-source .ms-1 {\n  margin-inline-start: var(--spacing);\n}\n.bn-source .ms-3 {\n  margin-inline-start: calc(var(--spacing) * 3);\n}\n.bn-source .ms-auto {\n  margin-inline-start: auto;\n}\n.bn-source .mt-1 {\n  margin-top: var(--spacing);\n}\n.bn-source .mt-1\\.5 {\n  margin-top: calc(var(--spacing) * 1.5);\n}\n.bn-source .mt-2 {\n  margin-top: calc(var(--spacing) * 2);\n}\n.bn-source .mt-3 {\n  margin-top: calc(var(--spacing) * 3);\n}\n.bn-source .mt-3\\.5 {\n  margin-top: calc(var(--spacing) * 3.5);\n}\n.bn-source .mt-6 {\n  margin-top: calc(var(--spacing) * 6);\n}\n.bn-source .mt-8 {\n  margin-top: calc(var(--spacing) * 8);\n}\n.bn-source .mt-auto {\n  margin-top: auto;\n}\n.bn-source .mb-5 {\n  margin-bottom: calc(var(--spacing) * 5);\n}\n.bn-source .-ml-3 {\n  margin-left: calc(var(--spacing) * -3);\n}\n.bn-source .ml-1\\.5 {\n  margin-left: calc(var(--spacing) * 1.5);\n}\n.bn-source .block {\n  display: block;\n}\n.bn-source .contents {\n  display: contents;\n}\n.bn-source .flex {\n  display: flex;\n}\n.bn-source .grid {\n  display: grid;\n}\n.bn-source .hidden {\n  display: none;\n}\n.bn-source .inline {\n  display: inline;\n}\n.bn-source .inline-flex {\n  display: inline-flex;\n}\n.bn-source .table {\n  display: table;\n}\n.bn-source .aspect-\\[4\\/3\\] {\n  aspect-ratio: 4/3;\n}\n.bn-source .size-1\\.5 {\n  width: calc(var(--spacing) * 1.5);\n  height: calc(var(--spacing) * 1.5);\n}\n.bn-source .size-2 {\n  width: calc(var(--spacing) * 2);\n  height: calc(var(--spacing) * 2);\n}\n.bn-source .size-2\\.5 {\n  width: calc(var(--spacing) * 2.5);\n  height: calc(var(--spacing) * 2.5);\n}\n.bn-source .size-2\\/3 {\n  width: calc(2 / 3 * 100%);\n  height: calc(2 / 3 * 100%);\n}\n.bn-source .size-3 {\n  width: calc(var(--spacing) * 3);\n  height: calc(var(--spacing) * 3);\n}\n.bn-source .size-3\\.5 {\n  width: calc(var(--spacing) * 3.5);\n  height: calc(var(--spacing) * 3.5);\n}\n.bn-source .size-3\\/4 {\n  width: calc(3 / 4 * 100%);\n  height: calc(3 / 4 * 100%);\n}\n.bn-source .size-4 {\n  width: calc(var(--spacing) * 4);\n  height: calc(var(--spacing) * 4);\n}\n.bn-source .size-5 {\n  width: calc(var(--spacing) * 5);\n  height: calc(var(--spacing) * 5);\n}\n.bn-source .size-6 {\n  width: calc(var(--spacing) * 6);\n  height: calc(var(--spacing) * 6);\n}\n.bn-source .size-7 {\n  width: calc(var(--spacing) * 7);\n  height: calc(var(--spacing) * 7);\n}\n.bn-source .size-8 {\n  width: calc(var(--spacing) * 8);\n  height: calc(var(--spacing) * 8);\n}\n.bn-source .size-9 {\n  width: calc(var(--spacing) * 9);\n  height: calc(var(--spacing) * 9);\n}\n.bn-source .size-10 {\n  width: calc(var(--spacing) * 10);\n  height: calc(var(--spacing) * 10);\n}\n.bn-source .size-11 {\n  width: calc(var(--spacing) * 11);\n  height: calc(var(--spacing) * 11);\n}\n.bn-source .size-12 {\n  width: calc(var(--spacing) * 12);\n  height: calc(var(--spacing) * 12);\n}\n.bn-source .size-\\[5px\\] {\n  width: 5px;\n  height: 5px;\n}\n.bn-source .size-\\[7\\.5px\\] {\n  width: 7.5px;\n  height: 7.5px;\n}\n.bn-source .size-\\[10px\\] {\n  width: 10px;\n  height: 10px;\n}\n.bn-source .size-\\[18px\\] {\n  width: 18px;\n  height: 18px;\n}\n.bn-source .size-\\[277px\\] {\n  width: 277px;\n  height: 277px;\n}\n.bn-source .size-full {\n  width: 100%;\n  height: 100%;\n}\n.bn-source .h-0\\.5 {\n  height: calc(var(--spacing) * 0.5);\n}\n.bn-source .h-1\\.5 {\n  height: calc(var(--spacing) * 1.5);\n}\n.bn-source .h-2 {\n  height: calc(var(--spacing) * 2);\n}\n.bn-source .h-3 {\n  height: calc(var(--spacing) * 3);\n}\n.bn-source .h-4 {\n  height: calc(var(--spacing) * 4);\n}\n.bn-source .h-5 {\n  height: calc(var(--spacing) * 5);\n}\n.bn-source .h-6 {\n  height: calc(var(--spacing) * 6);\n}\n.bn-source .h-7 {\n  height: calc(var(--spacing) * 7);\n}\n.bn-source .h-8 {\n  height: calc(var(--spacing) * 8);\n}\n.bn-source .h-9 {\n  height: calc(var(--spacing) * 9);\n}\n.bn-source .h-10 {\n  height: calc(var(--spacing) * 10);\n}\n.bn-source .h-11 {\n  height: calc(var(--spacing) * 11);\n}\n.bn-source .h-40 {\n  height: calc(var(--spacing) * 40);\n}\n.bn-source .h-\\[3px\\] {\n  height: 3px;\n}\n.bn-source .h-\\[18px\\] {\n  height: 18px;\n}\n.bn-source .h-\\[30px\\] {\n  height: 30px;\n}\n.bn-source .h-\\[34px\\] {\n  height: 34px;\n}\n.bn-source .h-\\[110px\\] {\n  height: 110px;\n}\n.bn-source .h-\\[132px\\] {\n  height: 132px;\n}\n.bn-source .h-\\[164px\\] {\n  height: 164px;\n}\n.bn-source .h-\\[212px\\] {\n  height: 212px;\n}\n.bn-source .h-\\[344px\\] {\n  height: 344px;\n}\n.bn-source .h-\\[429px\\] {\n  height: 429px;\n}\n.bn-source .h-\\[430px\\] {\n  height: 430px;\n}\n.bn-source .h-\\[614px\\] {\n  height: 614px;\n}\n.bn-source .h-\\[732px\\] {\n  height: 732px;\n}\n.bn-source .h-\\[780px\\] {\n  height: 780px;\n}\n.bn-source .h-\\[860px\\] {\n  height: 860px;\n}\n.bn-source .h-full {\n  height: 100%;\n}\n.bn-source .h-max {\n  height: max-content;\n}\n.bn-source .h-px {\n  height: 1px;\n}\n.bn-source .max-h-64 {\n  max-height: calc(var(--spacing) * 64);\n}\n.bn-source .max-h-\\[240px\\] {\n  max-height: 240px;\n}\n.bn-source .max-h-\\[516px\\] {\n  max-height: 516px;\n}\n.bn-source .max-h-\\[calc\\(100dvh-32px\\)\\] {\n  max-height: calc(100dvh - 32px);\n}\n.bn-source .min-h-0 {\n  min-height: 0px;\n}\n.bn-source .min-h-9 {\n  min-height: calc(var(--spacing) * 9);\n}\n.bn-source .min-h-10 {\n  min-height: calc(var(--spacing) * 10);\n}\n.bn-source .min-h-28 {\n  min-height: calc(var(--spacing) * 28);\n}\n.bn-source .min-h-32 {\n  min-height: calc(var(--spacing) * 32);\n}\n.bn-source .min-h-64 {\n  min-height: calc(var(--spacing) * 64);\n}\n.bn-source .min-h-\\[52px\\] {\n  min-height: 52px;\n}\n.bn-source .min-h-\\[235px\\] {\n  min-height: 235px;\n}\n.bn-source .min-h-\\[240px\\] {\n  min-height: 240px;\n}\n.bn-source .min-h-\\[300px\\] {\n  min-height: 300px;\n}\n.bn-source .min-h-\\[320px\\] {\n  min-height: 320px;\n}\n.bn-source .min-h-\\[340px\\] {\n  min-height: 340px;\n}\n.bn-source .min-h-\\[420px\\] {\n  min-height: 420px;\n}\n.bn-source .min-h-\\[480px\\] {\n  min-height: 480px;\n}\n.bn-source .w-0 {\n  width: 0px;\n}\n.bn-source .w-1\\.5 {\n  width: calc(var(--spacing) * 1.5);\n}\n.bn-source .w-2 {\n  width: calc(var(--spacing) * 2);\n}\n.bn-source .w-4 {\n  width: calc(var(--spacing) * 4);\n}\n.bn-source .w-5 {\n  width: calc(var(--spacing) * 5);\n}\n.bn-source .w-7 {\n  width: calc(var(--spacing) * 7);\n}\n.bn-source .w-8 {\n  width: calc(var(--spacing) * 8);\n}\n.bn-source .w-9 {\n  width: calc(var(--spacing) * 9);\n}\n.bn-source .w-14 {\n  width: calc(var(--spacing) * 14);\n}\n.bn-source .w-40 {\n  width: calc(var(--spacing) * 40);\n}\n.bn-source .w-48 {\n  width: calc(var(--spacing) * 48);\n}\n.bn-source .w-72 {\n  width: calc(var(--spacing) * 72);\n}\n.bn-source .w-96 {\n  width: calc(var(--spacing) * 96);\n}\n.bn-source .w-\\[18px\\] {\n  width: 18px;\n}\n.bn-source .w-\\[30px\\] {\n  width: 30px;\n}\n.bn-source .w-\\[34px\\] {\n  width: 34px;\n}\n.bn-source .w-\\[42px\\] {\n  width: 42px;\n}\n.bn-source .w-\\[60px\\] {\n  width: 60px;\n}\n.bn-source .w-\\[104px\\] {\n  width: 104px;\n}\n.bn-source .w-\\[116px\\] {\n  width: 116px;\n}\n.bn-source .w-\\[118px\\] {\n  width: 118px;\n}\n.bn-source .w-\\[132px\\] {\n  width: 132px;\n}\n.bn-source .w-\\[140px\\] {\n  width: 140px;\n}\n.bn-source .w-\\[142px\\] {\n  width: 142px;\n}\n.bn-source .w-\\[150px\\] {\n  width: 150px;\n}\n.bn-source .w-\\[153px\\] {\n  width: 153px;\n}\n.bn-source .w-\\[160px\\] {\n  width: 160px;\n}\n.bn-source .w-\\[168px\\] {\n  width: 168px;\n}\n.bn-source .w-\\[170px\\] {\n  width: 170px;\n}\n.bn-source .w-\\[172px\\] {\n  width: 172px;\n}\n.bn-source .w-\\[180px\\] {\n  width: 180px;\n}\n.bn-source .w-\\[200px\\] {\n  width: 200px;\n}\n.bn-source .w-\\[202px\\] {\n  width: 202px;\n}\n.bn-source .w-\\[207px\\] {\n  width: 207px;\n}\n.bn-source .w-\\[220px\\] {\n  width: 220px;\n}\n.bn-source .w-\\[236px\\] {\n  width: 236px;\n}\n.bn-source .w-\\[240px\\] {\n  width: 240px;\n}\n.bn-source .w-\\[250px\\] {\n  width: 250px;\n}\n.bn-source .w-\\[260px\\] {\n  width: 260px;\n}\n.bn-source .w-\\[265px\\] {\n  width: 265px;\n}\n.bn-source .w-\\[266px\\] {\n  width: 266px;\n}\n.bn-source .w-\\[280px\\] {\n  width: 280px;\n}\n.bn-source .w-\\[296px\\] {\n  width: 296px;\n}\n.bn-source .w-\\[300px\\] {\n  width: 300px;\n}\n.bn-source .w-\\[326px\\] {\n  width: 326px;\n}\n.bn-source .w-\\[361px\\] {\n  width: 361px;\n}\n.bn-source .w-\\[520px\\] {\n  width: 520px;\n}\n.bn-source .w-\\[700px\\] {\n  width: 700px;\n}\n.bn-source .w-\\[790px\\] {\n  width: 790px;\n}\n.bn-source .w-\\[871px\\] {\n  width: 871px;\n}\n.bn-source .w-\\[calc\\(100\\%\\+1\\.5rem\\)\\] {\n  width: calc(100% + 1.5rem);\n}\n.bn-source .w-\\[calc\\(100\\%\\+8px\\)\\] {\n  width: calc(100% + 8px);\n}\n.bn-source .w-\\[calc\\(100\\%\\+16px\\)\\] {\n  width: calc(100% + 16px);\n}\n.bn-source .w-\\[min\\(400px\\,calc\\(100vw-24px\\)\\)\\] {\n  width: min(400px, calc(100vw - 24px));\n}\n.bn-source .w-auto {\n  width: auto;\n}\n.bn-source .w-fit {\n  width: fit-content;\n}\n.bn-source .w-full {\n  width: 100%;\n}\n.bn-source .w-px {\n  width: 1px;\n}\n.bn-source .max-w-0 {\n  max-width: 0px;\n}\n.bn-source .max-w-2xl {\n  max-width: var(--container-2xl);\n}\n.bn-source .max-w-40 {\n  max-width: calc(var(--spacing) * 40);\n}\n.bn-source .max-w-64 {\n  max-width: calc(var(--spacing) * 64);\n}\n.bn-source .max-w-\\[90\\%\\] {\n  max-width: 90%;\n}\n.bn-source .max-w-\\[168px\\] {\n  max-width: 168px;\n}\n.bn-source .max-w-\\[206px\\] {\n  max-width: 206px;\n}\n.bn-source .max-w-\\[220px\\] {\n  max-width: 220px;\n}\n.bn-source .max-w-\\[230px\\] {\n  max-width: 230px;\n}\n.bn-source .max-w-\\[240px\\] {\n  max-width: 240px;\n}\n.bn-source .max-w-\\[248px\\] {\n  max-width: 248px;\n}\n.bn-source .max-w-\\[260px\\] {\n  max-width: 260px;\n}\n.bn-source .max-w-\\[268px\\] {\n  max-width: 268px;\n}\n.bn-source .max-w-\\[360px\\] {\n  max-width: 360px;\n}\n.bn-source .max-w-\\[400px\\] {\n  max-width: 400px;\n}\n.bn-source .max-w-\\[420px\\] {\n  max-width: 420px;\n}\n.bn-source .max-w-\\[430px\\] {\n  max-width: 430px;\n}\n.bn-source .max-w-\\[440px\\] {\n  max-width: 440px;\n}\n.bn-source .max-w-\\[520px\\] {\n  max-width: 520px;\n}\n.bn-source .max-w-\\[524px\\] {\n  max-width: 524px;\n}\n.bn-source .max-w-\\[533px\\] {\n  max-width: 533px;\n}\n.bn-source .max-w-\\[560px\\] {\n  max-width: 560px;\n}\n.bn-source .max-w-\\[720px\\] {\n  max-width: 720px;\n}\n.bn-source .max-w-\\[880px\\] {\n  max-width: 880px;\n}\n.bn-source .max-w-\\[calc\\(100vw-24px\\)\\] {\n  max-width: calc(100vw - 24px);\n}\n.bn-source .max-w-\\[calc\\(100vw-32px\\)\\] {\n  max-width: calc(100vw - 32px);\n}\n.bn-source .max-w-full {\n  max-width: 100%;\n}\n.bn-source .max-w-md {\n  max-width: var(--container-md);\n}\n.bn-source .max-w-sm {\n  max-width: var(--container-sm);\n}\n.bn-source .min-w-0 {\n  min-width: 0px;\n}\n.bn-source .min-w-5 {\n  min-width: calc(var(--spacing) * 5);\n}\n.bn-source .min-w-8 {\n  min-width: calc(var(--spacing) * 8);\n}\n.bn-source .min-w-24 {\n  min-width: calc(var(--spacing) * 24);\n}\n.bn-source .min-w-40 {\n  min-width: calc(var(--spacing) * 40);\n}\n.bn-source .min-w-\\[153px\\] {\n  min-width: 153px;\n}\n.bn-source .min-w-\\[700px\\] {\n  min-width: 700px;\n}\n.bn-source .min-w-\\[1000px\\] {\n  min-width: 1000px;\n}\n.bn-source .flex-1 {\n  flex: 1;\n}\n.bn-source .flex-none {\n  flex: none;\n}\n.bn-source .shrink {\n  flex-shrink: 1;\n}\n.bn-source .shrink-0 {\n  flex-shrink: 0;\n}\n.bn-source .grow {\n  flex-grow: 1;\n}\n.bn-source .basis-full {\n  flex-basis: 100%;\n}\n.bn-source .border-separate {\n  border-collapse: separate;\n}\n.bn-source .origin-bottom-left {\n  transform-origin: 0 100%;\n}\n.bn-source .origin-left {\n  transform-origin: 0;\n}\n.bn-source .origin-top {\n  transform-origin: top;\n}\n.bn-source .origin-top-left {\n  transform-origin: 0 0;\n}\n.bn-source .-translate-x-1\\/2 {\n  --tw-translate-x: calc(calc(1 / 2 * 100%) * -1);\n  translate: var(--tw-translate-x) var(--tw-translate-y);\n}\n.bn-source .translate-x-3 {\n  --tw-translate-x: calc(var(--spacing) * 3);\n  translate: var(--tw-translate-x) var(--tw-translate-y);\n}\n.bn-source .translate-x-6 {\n  --tw-translate-x: calc(var(--spacing) * 6);\n  translate: var(--tw-translate-x) var(--tw-translate-y);\n}\n.bn-source .translate-x-6\\.5 {\n  --tw-translate-x: calc(var(--spacing) * 6.5);\n  translate: var(--tw-translate-x) var(--tw-translate-y);\n}\n.bn-source .translate-x-8 {\n  --tw-translate-x: calc(var(--spacing) * 8);\n  translate: var(--tw-translate-x) var(--tw-translate-y);\n}\n.bn-source .translate-x-9 {\n  --tw-translate-x: calc(var(--spacing) * 9);\n  translate: var(--tw-translate-x) var(--tw-translate-y);\n}\n.bn-source .translate-x-\\[18px\\] {\n  --tw-translate-x: 18px;\n  translate: var(--tw-translate-x) var(--tw-translate-y);\n}\n.bn-source .-translate-y-0\\.5 {\n  --tw-translate-y: calc(var(--spacing) * -0.5);\n  translate: var(--tw-translate-x) var(--tw-translate-y);\n}\n.bn-source .-translate-y-1\\/2 {\n  --tw-translate-y: calc(calc(1 / 2 * 100%) * -1);\n  translate: var(--tw-translate-x) var(--tw-translate-y);\n}\n.bn-source .-translate-y-2\\.5 {\n  --tw-translate-y: calc(var(--spacing) * -2.5);\n  translate: var(--tw-translate-x) var(--tw-translate-y);\n}\n.bn-source .translate-y-0 {\n  --tw-translate-y: 0px;\n  translate: var(--tw-translate-x) var(--tw-translate-y);\n}\n.bn-source .translate-y-1\\/2 {\n  --tw-translate-y: calc(1 / 2 * 100%);\n  translate: var(--tw-translate-x) var(--tw-translate-y);\n}\n.bn-source .translate-y-3 {\n  --tw-translate-y: calc(var(--spacing) * 3);\n  translate: var(--tw-translate-x) var(--tw-translate-y);\n}\n.bn-source .translate-y-\\[calc\\(50\\%\\+12px\\)\\] {\n  --tw-translate-y: calc(50% + 12px);\n  translate: var(--tw-translate-x) var(--tw-translate-y);\n}\n.bn-source .translate-y-\\[calc\\(50\\%-10px\\)\\] {\n  --tw-translate-y: calc(50% - 10px);\n  translate: var(--tw-translate-x) var(--tw-translate-y);\n}\n.bn-source .scale-0 {\n  --tw-scale-x: 0%;\n  --tw-scale-y: 0%;\n  --tw-scale-z: 0%;\n  scale: var(--tw-scale-x) var(--tw-scale-y);\n}\n.bn-source .scale-90 {\n  --tw-scale-x: 90%;\n  --tw-scale-y: 90%;\n  --tw-scale-z: 90%;\n  scale: var(--tw-scale-x) var(--tw-scale-y);\n}\n.bn-source .scale-95 {\n  --tw-scale-x: 95%;\n  --tw-scale-y: 95%;\n  --tw-scale-z: 95%;\n  scale: var(--tw-scale-x) var(--tw-scale-y);\n}\n.bn-source .scale-100 {\n  --tw-scale-x: 100%;\n  --tw-scale-y: 100%;\n  --tw-scale-z: 100%;\n  scale: var(--tw-scale-x) var(--tw-scale-y);\n}\n.bn-source .scale-105 {\n  --tw-scale-x: 105%;\n  --tw-scale-y: 105%;\n  --tw-scale-z: 105%;\n  scale: var(--tw-scale-x) var(--tw-scale-y);\n}\n.bn-source .scale-110 {\n  --tw-scale-x: 110%;\n  --tw-scale-y: 110%;\n  --tw-scale-z: 110%;\n  scale: var(--tw-scale-x) var(--tw-scale-y);\n}\n.bn-source .-scale-x-100 {\n  --tw-scale-x: calc(100% * -1);\n  scale: var(--tw-scale-x) var(--tw-scale-y);\n}\n.bn-source .scale-\\[0\\.82\\] {\n  scale: 0.82;\n}\n.bn-source .scale-\\[0\\.85\\] {\n  scale: 0.85;\n}\n.bn-source .scale-\\[calc\\(\\(100cqw-32px\\)\\/790\\)\\] {\n  scale: calc((100cqw - 32px) / 790);\n}\n.bn-source .scale-\\[calc\\(\\(100cqw-32px\\)\\/1000\\)\\] {\n  scale: calc((100cqw - 32px) / 1000);\n}\n.bn-source .rotate-45 {\n  rotate: 45deg;\n}\n.bn-source .rotate-90 {\n  rotate: 90deg;\n}\n.bn-source .rotate-180 {\n  rotate: 180deg;\n}\n.bn-source .button-press-motion {\n  transition: background-color var(--button-transition-ms) ease, border-color var(--button-transition-ms) ease, box-shadow var(--button-transition-ms) ease, color var(--button-transition-ms) ease, transform 420ms cubic-bezier(0.4, 0, 0.2, 1);\n  &:active:not(:disabled):not([aria-disabled=\"true\"]) {\n    transform: scale(0.98);\n    transition-duration: 150ms, 150ms, 150ms, 150ms, 220ms;\n  }\n  &:disabled, &[aria-disabled=\"true\"] {\n    transform: none;\n  }\n  @media (prefers-reduced-motion: reduce) {\n    transition: none;\n    transform: none;\n  }\n}\n.bn-source .transform {\n  transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);\n}\n.bn-source .transform-gpu {\n  transform: translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);\n}\n.bn-source .cursor-cell {\n  cursor: cell;\n}\n.bn-source .cursor-col-resize {\n  cursor: col-resize;\n}\n.bn-source .cursor-default {\n  cursor: default;\n}\n.bn-source .cursor-grab {\n  cursor: grab;\n}\n.bn-source .cursor-not-allowed {\n  cursor: not-allowed;\n}\n.bn-source .cursor-pointer {\n  cursor: pointer;\n}\n.bn-source .touch-none {\n  touch-action: none;\n}\n.bn-source .resize {\n  resize: both;\n}\n.bn-source .resize-none {\n  resize: none;\n}\n.bn-source .resize-y {\n  resize: vertical;\n}\n.bn-source .snap-x {\n  scroll-snap-type: x var(--tw-scroll-snap-strictness);\n}\n.bn-source .snap-mandatory {\n  --tw-scroll-snap-strictness: mandatory;\n}\n.bn-source .snap-start {\n  scroll-snap-align: start;\n}\n.bn-source .\\[scrollbar-width\\:none\\] {\n  scrollbar-width: none;\n}\n.bn-source .\\[scrollbar-width\\:thin\\] {\n  scrollbar-width: thin;\n}\n.bn-source .auto-cols-fr {\n  grid-auto-columns: minmax(0, 1fr);\n}\n.bn-source .grid-flow-col {\n  grid-auto-flow: column;\n}\n.bn-source .grid-cols-1 {\n  grid-template-columns: repeat(1, minmax(0, 1fr));\n}\n.bn-source .grid-cols-2 {\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n.bn-source .grid-rows-\\[0fr\\] {\n  grid-template-rows: 0fr;\n}\n.bn-source .grid-rows-\\[1fr\\] {\n  grid-template-rows: 1fr;\n}\n.bn-source .flex-col {\n  flex-direction: column;\n}\n.bn-source .flex-col-reverse {\n  flex-direction: column-reverse;\n}\n.bn-source .flex-row {\n  flex-direction: row;\n}\n.bn-source .flex-wrap {\n  flex-wrap: wrap;\n}\n.bn-source .place-items-center {\n  place-items: center;\n}\n.bn-source .items-baseline {\n  align-items: baseline;\n}\n.bn-source .items-center {\n  align-items: center;\n}\n.bn-source .items-end {\n  align-items: flex-end;\n}\n.bn-source .items-start {\n  align-items: flex-start;\n}\n.bn-source .items-stretch {\n  align-items: stretch;\n}\n.bn-source .justify-between {\n  justify-content: space-between;\n}\n.bn-source .justify-center {\n  justify-content: center;\n}\n.bn-source .justify-end {\n  justify-content: flex-end;\n}\n.bn-source .justify-start {\n  justify-content: flex-start;\n}\n.bn-source .gap-0 {\n  gap: 0px;\n}\n.bn-source .gap-0\\.5 {\n  gap: calc(var(--spacing) * 0.5);\n}\n.bn-source .gap-1 {\n  gap: var(--spacing);\n}\n.bn-source .gap-1\\.5 {\n  gap: calc(var(--spacing) * 1.5);\n}\n.bn-source .gap-2 {\n  gap: calc(var(--spacing) * 2);\n}\n.bn-source .gap-2\\.5 {\n  gap: calc(var(--spacing) * 2.5);\n}\n.bn-source .gap-3 {\n  gap: calc(var(--spacing) * 3);\n}\n.bn-source .gap-3\\.5 {\n  gap: calc(var(--spacing) * 3.5);\n}\n.bn-source .gap-4 {\n  gap: calc(var(--spacing) * 4);\n}\n.bn-source .gap-5 {\n  gap: calc(var(--spacing) * 5);\n}\n.bn-source .gap-6 {\n  gap: calc(var(--spacing) * 6);\n}\n.bn-source .gap-8 {\n  gap: calc(var(--spacing) * 8);\n}\n.bn-source .gap-9 {\n  gap: calc(var(--spacing) * 9);\n}\n.bn-source .gap-10 {\n  gap: calc(var(--spacing) * 10);\n}\n.bn-source .gap-\\[3px\\] {\n  gap: 3px;\n}\n.bn-source .gap-\\[5px\\] {\n  gap: 5px;\n}\n.bn-source .gap-\\[7px\\] {\n  gap: 7px;\n}\n.bn-source .gap-x-2 {\n  column-gap: calc(var(--spacing) * 2);\n}\n.bn-source .gap-x-4 {\n  column-gap: calc(var(--spacing) * 4);\n}\n.bn-source .gap-x-5 {\n  column-gap: calc(var(--spacing) * 5);\n}\n.bn-source .gap-y-0\\.5 {\n  row-gap: calc(var(--spacing) * 0.5);\n}\n.bn-source .gap-y-1 {\n  row-gap: var(--spacing);\n}\n.bn-source .gap-y-6 {\n  row-gap: calc(var(--spacing) * 6);\n}\n.bn-source :where(.divide-x > :not(:last-child)) {\n  --tw-divide-x-reverse: 0;\n  border-inline-style: var(--tw-border-style);\n  border-inline-start-width: calc(1px * var(--tw-divide-x-reverse));\n  border-inline-end-width: calc(1px * calc(1 - var(--tw-divide-x-reverse)));\n}\n.bn-source :where(.divide-border-button-default > :not(:last-child)) {\n  border-color: var(--color-border-button-default);\n}\n.bn-source .self-start {\n  align-self: flex-start;\n}\n.bn-source .truncate {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.bn-source .overflow-auto {\n  overflow: auto;\n}\n.bn-source .overflow-clip {\n  overflow: clip;\n}\n.bn-source .overflow-hidden {\n  overflow: hidden;\n}\n.bn-source .overflow-visible {\n  overflow: visible;\n}\n.bn-source .overflow-x-auto {\n  overflow-x: auto;\n}\n.bn-source .overflow-y-auto {\n  overflow-y: auto;\n}\n.bn-source .overscroll-contain {\n  overscroll-behavior: contain;\n}\n.bn-source .overscroll-x-contain {\n  overscroll-behavior-x: contain;\n}\n.bn-source .rounded {\n  border-radius: 0.25rem;\n}\n.bn-source .rounded-2lg {\n  border-radius: var(--radius-2lg);\n}\n.bn-source .rounded-2xl {\n  border-radius: var(--radius-2xl);\n}\n.bn-source .rounded-3xl {\n  border-radius: var(--radius-3xl);\n}\n.bn-source .rounded-\\[0\\.5px\\] {\n  border-radius: 0.5px;\n}\n.bn-source .rounded-\\[0\\.75px\\] {\n  border-radius: 0.75px;\n}\n.bn-source .rounded-\\[1\\.5px\\] {\n  border-radius: 1.5px;\n}\n.bn-source .rounded-\\[1px\\] {\n  border-radius: 1px;\n}\n.bn-source .rounded-\\[2px\\] {\n  border-radius: 2px;\n}\n.bn-source .rounded-\\[3px\\] {\n  border-radius: 3px;\n}\n.bn-source .rounded-\\[4\\.5px\\] {\n  border-radius: 4.5px;\n}\n.bn-source .rounded-\\[6px\\] {\n  border-radius: 6px;\n}\n.bn-source .rounded-full {\n  border-radius: calc(infinity * 1px);\n}\n.bn-source .rounded-lg {\n  border-radius: var(--radius-lg);\n}\n.bn-source .rounded-md {\n  border-radius: var(--radius-md);\n}\n.bn-source .rounded-none {\n  border-radius: 0;\n}\n.bn-source .rounded-notification-card {\n  border-radius: var(--radius-notification-card);\n}\n.bn-source .rounded-sm {\n  border-radius: var(--radius-sm);\n}\n.bn-source .rounded-xl {\n  border-radius: var(--radius-xl);\n}\n.bn-source .rounded-xs {\n  border-radius: var(--radius-xs);\n}\n.bn-source .rounded-s-lg {\n  border-start-start-radius: var(--radius-lg);\n  border-end-start-radius: var(--radius-lg);\n}\n.bn-source .rounded-e-lg {\n  border-start-end-radius: var(--radius-lg);\n  border-end-end-radius: var(--radius-lg);\n}\n.bn-source .border {\n  border-style: var(--tw-border-style);\n  border-width: 1px;\n}\n.bn-source .border-0 {\n  border-style: var(--tw-border-style);\n  border-width: 0px;\n}\n.bn-source .border-2 {\n  border-style: var(--tw-border-style);\n  border-width: 2px;\n}\n.bn-source .border-\\[0\\.5px\\] {\n  border-style: var(--tw-border-style);\n  border-width: 0.5px;\n}\n.bn-source .border-\\[0\\.25px\\] {\n  border-style: var(--tw-border-style);\n  border-width: 0.25px;\n}\n.bn-source .border-\\[0\\.375px\\] {\n  border-style: var(--tw-border-style);\n  border-width: 0.375px;\n}\n.bn-source .border-\\[0\\.875px\\] {\n  border-style: var(--tw-border-style);\n  border-width: 0.875px;\n}\n.bn-source .border-y {\n  border-block-style: var(--tw-border-style);\n  border-block-width: 1px;\n}\n.bn-source .border-e {\n  border-inline-end-style: var(--tw-border-style);\n  border-inline-end-width: 1px;\n}\n.bn-source .border-t {\n  border-top-style: var(--tw-border-style);\n  border-top-width: 1px;\n}\n.bn-source .border-r {\n  border-right-style: var(--tw-border-style);\n  border-right-width: 1px;\n}\n.bn-source .border-b {\n  border-bottom-style: var(--tw-border-style);\n  border-bottom-width: 1px;\n}\n.bn-source .border-dashed {\n  --tw-border-style: dashed;\n  border-style: dashed;\n}\n.bn-source .border-solid {\n  --tw-border-style: solid;\n  border-style: solid;\n}\n.bn-source .border-accent-500 {\n  border-color: var(--color-accent-500);\n}\n.bn-source .border-accent-600 {\n  border-color: var(--color-accent-600);\n}\n.bn-source .border-background-primary-default {\n  border-color: var(--color-background-primary-default);\n}\n.bn-source .border-border-button-active {\n  border-color: var(--color-border-button-active);\n}\n.bn-source .border-border-button-default {\n  border-color: var(--color-border-button-default);\n}\n.bn-source .border-border-button-default\\/50 {\n  border-color: var(--color-border-button-default);\n  @supports (color: color-mix(in lab, red, red)) {\n    border-color: color-mix(in oklab, var(--color-border-button-default) 50%, transparent);\n  }\n}\n.bn-source .border-border-button-group {\n  border-color: var(--color-border-button-group);\n}\n.bn-source .border-border-button-hover {\n  border-color: var(--color-border-button-hover);\n}\n.bn-source .border-border-button-white {\n  border-color: var(--color-border-button-white);\n}\n.bn-source .border-border-checkbox-default {\n  border-color: var(--color-border-checkbox-default);\n}\n.bn-source .border-border-checkbox-hover {\n  border-color: var(--color-border-checkbox-hover);\n}\n.bn-source .border-border-component-detail-container {\n  border-color: var(--color-border-component-detail-container);\n}\n.bn-source .border-border-error-default {\n  border-color: var(--color-border-error-default);\n}\n.bn-source .border-border-focus-ring {\n  border-color: var(--color-border-focus-ring);\n}\n.bn-source .border-border-table {\n  border-color: var(--color-border-table);\n}\n.bn-source .border-separator-border {\n  border-color: var(--color-separator-border);\n}\n.bn-source .border-transparent {\n  border-color: transparent;\n}\n.bn-source .\\!bg-background-secondary-default {\n  background-color: var(--color-background-secondary-default) !important;\n}\n.bn-source .bg-accent-100 {\n  background-color: var(--color-accent-100);\n}\n.bn-source .bg-accent-400 {\n  background-color: var(--color-accent-400);\n}\n.bn-source .bg-accent-500 {\n  background-color: var(--color-accent-500);\n}\n.bn-source .bg-accent-600 {\n  background-color: var(--color-accent-600);\n}\n.bn-source .bg-amber-200 {\n  background-color: var(--color-amber-200);\n}\n.bn-source .bg-avatar-neutral-background {\n  background-color: var(--color-avatar-neutral-background);\n}\n.bn-source .bg-background-full {\n  background-color: var(--color-background-full);\n}\n.bn-source .bg-background-inner-default {\n  background-color: var(--color-background-inner-default);\n}\n.bn-source .bg-background-primary-active {\n  background-color: var(--color-background-primary-active);\n}\n.bn-source .bg-background-primary-default {\n  background-color: var(--color-background-primary-default);\n}\n.bn-source .bg-background-primary-disabled {\n  background-color: var(--color-background-primary-disabled);\n}\n.bn-source .bg-background-primary-hover {\n  background-color: var(--color-background-primary-hover);\n}\n.bn-source .bg-background-quaternary-hover {\n  background-color: var(--color-background-quaternary-hover);\n}\n.bn-source .bg-background-secondary-default {\n  background-color: var(--color-background-secondary-default);\n}\n.bn-source .bg-background-secondary-hover {\n  background-color: var(--color-background-secondary-hover);\n}\n.bn-source .bg-background-tertiary-default {\n  background-color: var(--color-background-tertiary-default);\n}\n.bn-source .bg-background-tertiary-error {\n  background-color: var(--color-background-tertiary-error);\n}\n.bn-source .bg-background-tertiary-hover {\n  background-color: var(--color-background-tertiary-hover);\n}\n.bn-source .bg-badge-neutral-background {\n  background-color: var(--color-badge-neutral-background);\n}\n.bn-source .bg-black\\/10 {\n  background-color: color-mix(in srgb, #000 10%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    background-color: color-mix(in oklab, var(--color-black) 10%, transparent);\n  }\n}\n.bn-source .bg-black\\/30 {\n  background-color: color-mix(in srgb, #000 30%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    background-color: color-mix(in oklab, var(--color-black) 30%, transparent);\n  }\n}\n.bn-source .bg-black\\/70 {\n  background-color: color-mix(in srgb, #000 70%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    background-color: color-mix(in oklab, var(--color-black) 70%, transparent);\n  }\n}\n.bn-source .bg-blue-100 {\n  background-color: var(--color-blue-100);\n}\n.bn-source .bg-blue-200 {\n  background-color: var(--color-blue-200);\n}\n.bn-source .bg-blue-300 {\n  background-color: var(--color-blue-300);\n}\n.bn-source .bg-blue-400\\/70 {\n  background-color: color-mix(in srgb, #3392ff 70%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    background-color: color-mix(in oklab, var(--color-blue-400) 70%, transparent);\n  }\n}\n.bn-source .bg-border-button-default {\n  background-color: var(--color-border-button-default);\n}\n.bn-source .bg-button-ghost-background {\n  background-color: var(--color-button-ghost-background);\n}\n.bn-source .bg-chart-2-active {\n  background-color: var(--color-chart-2-active);\n}\n.bn-source .bg-chart-9-active {\n  background-color: var(--color-chart-9-active);\n}\n.bn-source .bg-chart-neutral {\n  background-color: var(--color-chart-neutral);\n}\n.bn-source .bg-control-indicator-background {\n  background-color: var(--color-control-indicator-background);\n}\n.bn-source .bg-current {\n  background-color: currentcolor;\n}\n.bn-source .bg-date-range-background {\n  background-color: var(--color-date-range-background);\n}\n.bn-source .bg-date-range-edge-background {\n  background-color: var(--color-date-range-edge-background);\n}\n.bn-source .bg-dropdown-item-hover-background {\n  background-color: var(--color-dropdown-item-hover-background);\n}\n.bn-source .bg-file-upload-icon-background {\n  background-color: var(--color-file-upload-icon-background);\n}\n.bn-source .bg-green-500 {\n  background-color: var(--color-green-500);\n}\n.bn-source .bg-indigo-500 {\n  background-color: var(--color-indigo-500);\n}\n.bn-source .bg-input-disabled-background {\n  background-color: var(--color-input-disabled-background);\n}\n.bn-source .bg-kbd-background {\n  background-color: var(--color-kbd-background);\n}\n.bn-source .bg-lime-200 {\n  background-color: var(--color-lime-200);\n}\n.bn-source .bg-lime-400\\/70 {\n  background-color: color-mix(in srgb, oklch(84.1% 0.238 128.85) 70%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    background-color: color-mix(in oklab, var(--color-lime-400) 70%, transparent);\n  }\n}\n.bn-source .bg-lime-500 {\n  background-color: var(--color-lime-500);\n}\n.bn-source .bg-neutral-900 {\n  background-color: var(--color-neutral-900);\n}\n.bn-source .bg-neutral-950 {\n  background-color: var(--color-neutral-950);\n}\n.bn-source .bg-notification-center-background {\n  background-color: var(--color-notification-center-background);\n}\n.bn-source .bg-notification-error-background {\n  background-color: var(--color-notification-error-background);\n}\n.bn-source .bg-notification-information-background {\n  background-color: var(--color-notification-information-background);\n}\n.bn-source .bg-notification-success-background {\n  background-color: var(--color-notification-success-background);\n}\n.bn-source .bg-orange-400\\/70 {\n  background-color: color-mix(in srgb, oklch(75% 0.183 55.934) 70%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    background-color: color-mix(in oklab, var(--color-orange-400) 70%, transparent);\n  }\n}\n.bn-source .bg-pill-tab-blue-hover-background {\n  background-color: var(--color-pill-tab-blue-hover-background);\n}\n.bn-source .bg-pill-tab-blue-selected-background {\n  background-color: var(--color-pill-tab-blue-selected-background);\n}\n.bn-source .bg-pink-200 {\n  background-color: var(--color-pink-200);\n}\n.bn-source .bg-red-600 {\n  background-color: var(--color-red-600);\n}\n.bn-source .bg-rose-500 {\n  background-color: var(--color-rose-500);\n}\n.bn-source .bg-segmented-control-background {\n  background-color: var(--color-segmented-control-background);\n}\n.bn-source .bg-segmented-control-selected-background {\n  background-color: var(--color-segmented-control-selected-background);\n}\n.bn-source .bg-separator-border {\n  background-color: var(--color-separator-border);\n}\n.bn-source .bg-stat-card-icon-background {\n  background-color: var(--color-stat-card-icon-background);\n}\n.bn-source .bg-status-blue-background {\n  background-color: var(--color-status-blue-background);\n}\n.bn-source .bg-status-cyan-background {\n  background-color: var(--color-status-cyan-background);\n}\n.bn-source .bg-status-dot-green-halo {\n  background-color: var(--color-status-dot-green-halo);\n}\n.bn-source .bg-status-dot-indigo-halo {\n  background-color: var(--color-status-dot-indigo-halo);\n}\n.bn-source .bg-status-dot-yellow-halo {\n  background-color: var(--color-status-dot-yellow-halo);\n}\n.bn-source .bg-status-lime-background {\n  background-color: var(--color-status-lime-background);\n}\n.bn-source .bg-status-orange-background {\n  background-color: var(--color-status-orange-background);\n}\n.bn-source .bg-status-purple-background {\n  background-color: var(--color-status-purple-background);\n}\n.bn-source .bg-status-rose-background {\n  background-color: var(--color-status-rose-background);\n}\n.bn-source .bg-status-yellow-background {\n  background-color: var(--color-status-yellow-background);\n}\n.bn-source .bg-tab-count-selected-background {\n  background-color: var(--color-tab-count-selected-background);\n}\n.bn-source .bg-team-menu-count-background {\n  background-color: var(--color-team-menu-count-background);\n}\n.bn-source .bg-text-primary {\n  background-color: var(--color-text-primary);\n}\n.bn-source .bg-theme-toggle-sidebar-background {\n  background-color: var(--color-theme-toggle-sidebar-background);\n}\n.bn-source .bg-theme-toggle-sidebar-selected-background {\n  background-color: var(--color-theme-toggle-sidebar-selected-background);\n}\n.bn-source .bg-transparent {\n  background-color: transparent;\n}\n.bn-source .bg-white {\n  background-color: var(--color-white);\n}\n.bn-source .bg-yellow-500 {\n  background-color: var(--color-yellow-500);\n}\n.bn-source .bg-linear-to-b {\n  --tw-gradient-position: to bottom;\n  @supports (background-image: linear-gradient(in lab, red, red)) {\n    --tw-gradient-position: to bottom in oklab;\n  }\n  background-image: linear-gradient(var(--tw-gradient-stops));\n}\n.bn-source .bg-linear-to-r {\n  --tw-gradient-position: to right;\n  @supports (background-image: linear-gradient(in lab, red, red)) {\n    --tw-gradient-position: to right in oklab;\n  }\n  background-image: linear-gradient(var(--tw-gradient-stops));\n}\n.bn-source .bg-linear-to-t {\n  --tw-gradient-position: to top;\n  @supports (background-image: linear-gradient(in lab, red, red)) {\n    --tw-gradient-position: to top in oklab;\n  }\n  background-image: linear-gradient(var(--tw-gradient-stops));\n}\n.bn-source .bg-gradient-to-b {\n  --tw-gradient-position: to bottom in oklab;\n  background-image: linear-gradient(var(--tw-gradient-stops));\n}\n.bn-source .from-accent-400 {\n  --tw-gradient-from: var(--color-accent-400);\n  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n}\n.bn-source .from-accent-500 {\n  --tw-gradient-from: var(--color-accent-500);\n  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n}\n.bn-source .from-background-primary-default {\n  --tw-gradient-from: var(--color-background-primary-default);\n  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n}\n.bn-source .from-blue-500 {\n  --tw-gradient-from: var(--color-blue-500);\n  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n}\n.bn-source .from-control-indicator-background {\n  --tw-gradient-from: var(--color-control-indicator-background);\n  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n}\n.bn-source .from-emerald-500 {\n  --tw-gradient-from: var(--color-emerald-500);\n  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n}\n.bn-source .from-orange-400 {\n  --tw-gradient-from: var(--color-orange-400);\n  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n}\n.bn-source .from-pink-500 {\n  --tw-gradient-from: var(--color-pink-500);\n  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n}\n.bn-source .from-purple-500 {\n  --tw-gradient-from: var(--color-purple-500);\n  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n}\n.bn-source .from-sky-400 {\n  --tw-gradient-from: var(--color-sky-400);\n  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n}\n.bn-source .from-switch-off-chip-start {\n  --tw-gradient-from: var(--color-switch-off-chip-start);\n  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n}\n.bn-source .from-switch-on-chip-start {\n  --tw-gradient-from: var(--color-switch-on-chip-start);\n  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n}\n.bn-source .from-\\[43\\.837\\%\\] {\n  --tw-gradient-from-position: 43.837%;\n}\n.bn-source .to-accent-500 {\n  --tw-gradient-to: var(--color-accent-500);\n  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n}\n.bn-source .to-accent-600 {\n  --tw-gradient-to: var(--color-accent-600);\n  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n}\n.bn-source .to-blue-600 {\n  --tw-gradient-to: var(--color-blue-600);\n  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n}\n.bn-source .to-control-indicator-background-subtle {\n  --tw-gradient-to: var(--color-control-indicator-background-subtle);\n  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n}\n.bn-source .to-emerald-600 {\n  --tw-gradient-to: var(--color-emerald-600);\n  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n}\n.bn-source .to-orange-500 {\n  --tw-gradient-to: var(--color-orange-500);\n  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n}\n.bn-source .to-pink-600 {\n  --tw-gradient-to: var(--color-pink-600);\n  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n}\n.bn-source .to-purple-600 {\n  --tw-gradient-to: var(--color-purple-600);\n  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n}\n.bn-source .to-sky-500 {\n  --tw-gradient-to: var(--color-sky-500);\n  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n}\n.bn-source .to-switch-off-chip-end {\n  --tw-gradient-to: var(--color-switch-off-chip-end);\n  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n}\n.bn-source .to-switch-on-chip-end {\n  --tw-gradient-to: var(--color-switch-on-chip-end);\n  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n}\n.bn-source .to-transparent {\n  --tw-gradient-to: transparent;\n  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));\n}\n.bn-source .\\[mask-image\\:linear-gradient\\(to_bottom\\,black\\,transparent\\)\\] {\n  mask-image: linear-gradient(to bottom,black,transparent);\n}\n.bn-source .mask-repeat {\n  mask-repeat: repeat;\n}\n.bn-source .fill-background-primary-default {\n  fill: var(--color-background-primary-default);\n}\n.bn-source .stroke-border-button-default {\n  stroke: var(--color-border-button-default);\n}\n.bn-source .object-contain {\n  object-fit: contain;\n}\n.bn-source .object-cover {\n  object-fit: cover;\n}\n.bn-source .p-0 {\n  padding: 0px;\n}\n.bn-source .p-0\\.5 {\n  padding: calc(var(--spacing) * 0.5);\n}\n.bn-source .p-1 {\n  padding: var(--spacing);\n}\n.bn-source .p-1\\.5 {\n  padding: calc(var(--spacing) * 1.5);\n}\n.bn-source .p-2 {\n  padding: calc(var(--spacing) * 2);\n}\n.bn-source .p-2\\.5 {\n  padding: calc(var(--spacing) * 2.5);\n}\n.bn-source .p-3 {\n  padding: calc(var(--spacing) * 3);\n}\n.bn-source .p-4 {\n  padding: calc(var(--spacing) * 4);\n}\n.bn-source .p-5 {\n  padding: calc(var(--spacing) * 5);\n}\n.bn-source .p-6 {\n  padding: calc(var(--spacing) * 6);\n}\n.bn-source .p-8 {\n  padding: calc(var(--spacing) * 8);\n}\n.bn-source .p-\\[15px\\] {\n  padding: 15px;\n}\n.bn-source .px-0 {\n  padding-inline: 0px;\n}\n.bn-source .px-0\\.5 {\n  padding-inline: calc(var(--spacing) * 0.5);\n}\n.bn-source .px-1 {\n  padding-inline: var(--spacing);\n}\n.bn-source .px-1\\.5 {\n  padding-inline: calc(var(--spacing) * 1.5);\n}\n.bn-source .px-2 {\n  padding-inline: calc(var(--spacing) * 2);\n}\n.bn-source .px-2\\.5 {\n  padding-inline: calc(var(--spacing) * 2.5);\n}\n.bn-source .px-3 {\n  padding-inline: calc(var(--spacing) * 3);\n}\n.bn-source .px-4 {\n  padding-inline: calc(var(--spacing) * 4);\n}\n.bn-source .px-6 {\n  padding-inline: calc(var(--spacing) * 6);\n}\n.bn-source .px-8 {\n  padding-inline: calc(var(--spacing) * 8);\n}\n.bn-source .px-\\[7px\\] {\n  padding-inline: 7px;\n}\n.bn-source .px-\\[11px\\] {\n  padding-inline: 11px;\n}\n.bn-source .py-0\\.5 {\n  padding-block: calc(var(--spacing) * 0.5);\n}\n.bn-source .py-1 {\n  padding-block: var(--spacing);\n}\n.bn-source .py-1\\.5 {\n  padding-block: calc(var(--spacing) * 1.5);\n}\n.bn-source .py-2 {\n  padding-block: calc(var(--spacing) * 2);\n}\n.bn-source .py-2\\.5 {\n  padding-block: calc(var(--spacing) * 2.5);\n}\n.bn-source .py-3 {\n  padding-block: calc(var(--spacing) * 3);\n}\n.bn-source .py-4 {\n  padding-block: calc(var(--spacing) * 4);\n}\n.bn-source .py-6 {\n  padding-block: calc(var(--spacing) * 6);\n}\n.bn-source .py-8 {\n  padding-block: calc(var(--spacing) * 8);\n}\n.bn-source .py-10 {\n  padding-block: calc(var(--spacing) * 10);\n}\n.bn-source .py-\\[5px\\] {\n  padding-block: 5px;\n}\n.bn-source .py-\\[7px\\] {\n  padding-block: 7px;\n}\n.bn-source .py-px {\n  padding-block: 1px;\n}\n.bn-source .ps-1 {\n  padding-inline-start: var(--spacing);\n}\n.bn-source .ps-1\\.5 {\n  padding-inline-start: calc(var(--spacing) * 1.5);\n}\n.bn-source .ps-2 {\n  padding-inline-start: calc(var(--spacing) * 2);\n}\n.bn-source .ps-2\\.5 {\n  padding-inline-start: calc(var(--spacing) * 2.5);\n}\n.bn-source .ps-3 {\n  padding-inline-start: calc(var(--spacing) * 3);\n}\n.bn-source .ps-4 {\n  padding-inline-start: calc(var(--spacing) * 4);\n}\n.bn-source .ps-\\[42px\\] {\n  padding-inline-start: 42px;\n}\n.bn-source .pe-1 {\n  padding-inline-end: var(--spacing);\n}\n.bn-source .pe-1\\.5 {\n  padding-inline-end: calc(var(--spacing) * 1.5);\n}\n.bn-source .pe-2 {\n  padding-inline-end: calc(var(--spacing) * 2);\n}\n.bn-source .pe-2\\.5 {\n  padding-inline-end: calc(var(--spacing) * 2.5);\n}\n.bn-source .pe-3 {\n  padding-inline-end: calc(var(--spacing) * 3);\n}\n.bn-source .pe-4 {\n  padding-inline-end: calc(var(--spacing) * 4);\n}\n.bn-source .pe-5 {\n  padding-inline-end: calc(var(--spacing) * 5);\n}\n.bn-source .pe-11 {\n  padding-inline-end: calc(var(--spacing) * 11);\n}\n.bn-source .pt-1 {\n  padding-top: var(--spacing);\n}\n.bn-source .pt-2 {\n  padding-top: calc(var(--spacing) * 2);\n}\n.bn-source .pt-2\\.5 {\n  padding-top: calc(var(--spacing) * 2.5);\n}\n.bn-source .pt-3 {\n  padding-top: calc(var(--spacing) * 3);\n}\n.bn-source .pt-4 {\n  padding-top: calc(var(--spacing) * 4);\n}\n.bn-source .pt-8 {\n  padding-top: calc(var(--spacing) * 8);\n}\n.bn-source .pt-10 {\n  padding-top: calc(var(--spacing) * 10);\n}\n.bn-source .pt-\\[5px\\] {\n  padding-top: 5px;\n}\n.bn-source .pt-px {\n  padding-top: 1px;\n}\n.bn-source .pr-1 {\n  padding-right: var(--spacing);\n}\n.bn-source .pb-0 {\n  padding-bottom: 0px;\n}\n.bn-source .pb-1\\.5 {\n  padding-bottom: calc(var(--spacing) * 1.5);\n}\n.bn-source .pb-2 {\n  padding-bottom: calc(var(--spacing) * 2);\n}\n.bn-source .pb-3 {\n  padding-bottom: calc(var(--spacing) * 3);\n}\n.bn-source .pb-3\\.5 {\n  padding-bottom: calc(var(--spacing) * 3.5);\n}\n.bn-source .pb-8 {\n  padding-bottom: calc(var(--spacing) * 8);\n}\n.bn-source .pl-1 {\n  padding-left: var(--spacing);\n}\n.bn-source .text-center {\n  text-align: center;\n}\n.bn-source .text-end {\n  text-align: end;\n}\n.bn-source .text-left {\n  text-align: left;\n}\n.bn-source .text-right {\n  text-align: right;\n}\n.bn-source .text-start {\n  text-align: start;\n}\n.bn-source .align-middle {\n  vertical-align: middle;\n}\n.bn-source .font-mono {\n  font-family: var(--font-mono);\n}\n.bn-source .font-sans {\n  font-family: var(--font-sans);\n}\n.bn-source .text-body-2-medium {\n  font-size: var(--text-body-2-medium);\n  line-height: var(--tw-leading, var(--text-body-2-medium--line-height));\n  letter-spacing: var(--tw-tracking, var(--text-body-2-medium--letter-spacing));\n  font-weight: var(--tw-font-weight, var(--text-body-2-medium--font-weight));\n}\n.bn-source .text-body-2-regular {\n  font-size: var(--text-body-2-regular);\n  line-height: var(--tw-leading, var(--text-body-2-regular--line-height));\n  letter-spacing: var(--tw-tracking, var(--text-body-2-regular--letter-spacing));\n  font-weight: var(--tw-font-weight, var(--text-body-2-regular--font-weight));\n}\n.bn-source .text-body-medium {\n  font-size: var(--text-body-medium);\n  line-height: var(--tw-leading, var(--text-body-medium--line-height));\n  letter-spacing: var(--tw-tracking, var(--text-body-medium--letter-spacing));\n  font-weight: var(--tw-font-weight, var(--text-body-medium--font-weight));\n}\n.bn-source .text-body-regular {\n  font-size: var(--text-body-regular);\n  line-height: var(--tw-leading, var(--text-body-regular--line-height));\n  letter-spacing: var(--tw-tracking, var(--text-body-regular--letter-spacing));\n  font-weight: var(--tw-font-weight, var(--text-body-regular--font-weight));\n}\n.bn-source .text-caption-1-medium {\n  font-size: var(--text-caption-1-medium);\n  line-height: var(--tw-leading, var(--text-caption-1-medium--line-height));\n  letter-spacing: var(--tw-tracking, var(--text-caption-1-medium--letter-spacing));\n  font-weight: var(--tw-font-weight, var(--text-caption-1-medium--font-weight));\n}\n.bn-source .text-caption-1-regular {\n  font-size: var(--text-caption-1-regular);\n  line-height: var(--tw-leading, var(--text-caption-1-regular--line-height));\n  letter-spacing: var(--tw-tracking, var(--text-caption-1-regular--letter-spacing));\n  font-weight: var(--tw-font-weight, var(--text-caption-1-regular--font-weight));\n}\n.bn-source .text-caption-1-semibold {\n  font-size: var(--text-caption-1-semibold);\n  line-height: var(--tw-leading, var(--text-caption-1-semibold--line-height));\n  letter-spacing: var(--tw-tracking, var(--text-caption-1-semibold--letter-spacing));\n  font-weight: var(--tw-font-weight, var(--text-caption-1-semibold--font-weight));\n}\n.bn-source .text-display-4-medium {\n  font-size: var(--text-display-4-medium);\n  line-height: var(--tw-leading, var(--text-display-4-medium--line-height));\n  letter-spacing: var(--tw-tracking, var(--text-display-4-medium--letter-spacing));\n  font-weight: var(--tw-font-weight, var(--text-display-4-medium--font-weight));\n}\n.bn-source .text-headline-medium {\n  font-size: var(--text-headline-medium);\n  line-height: var(--tw-leading, var(--text-headline-medium--line-height));\n  letter-spacing: var(--tw-tracking, var(--text-headline-medium--letter-spacing));\n  font-weight: var(--tw-font-weight, var(--text-headline-medium--font-weight));\n}\n.bn-source .text-headline-semibold {\n  font-size: var(--text-headline-semibold);\n  line-height: var(--tw-leading, var(--text-headline-semibold--line-height));\n  letter-spacing: var(--tw-tracking, var(--text-headline-semibold--letter-spacing));\n  font-weight: var(--tw-font-weight, var(--text-headline-semibold--font-weight));\n}\n.bn-source .text-title-1-medium {\n  font-size: var(--text-title-1-medium);\n  line-height: var(--tw-leading, var(--text-title-1-medium--line-height));\n  letter-spacing: var(--tw-tracking, var(--text-title-1-medium--letter-spacing));\n  font-weight: var(--tw-font-weight, var(--text-title-1-medium--font-weight));\n}\n.bn-source .text-title-1-semibold {\n  font-size: var(--text-title-1-semibold);\n  line-height: var(--tw-leading, var(--text-title-1-semibold--line-height));\n  letter-spacing: var(--tw-tracking, var(--text-title-1-semibold--letter-spacing));\n  font-weight: var(--tw-font-weight, var(--text-title-1-semibold--font-weight));\n}\n.bn-source .text-title-2-medium {\n  font-size: var(--text-title-2-medium);\n  line-height: var(--tw-leading, var(--text-title-2-medium--line-height));\n  letter-spacing: var(--tw-tracking, var(--text-title-2-medium--letter-spacing));\n  font-weight: var(--tw-font-weight, var(--text-title-2-medium--font-weight));\n}\n.bn-source .text-title-3-medium {\n  font-size: var(--text-title-3-medium);\n  line-height: var(--tw-leading, var(--text-title-3-medium--line-height));\n  letter-spacing: var(--tw-tracking, var(--text-title-3-medium--letter-spacing));\n  font-weight: var(--tw-font-weight, var(--text-title-3-medium--font-weight));\n}\n.bn-source .text-\\[10px\\] {\n  font-size: 10px;\n}\n.bn-source .text-\\[18px\\] {\n  font-size: 18px;\n}\n.bn-source .leading-6 {\n  --tw-leading: calc(var(--spacing) * 6);\n  line-height: calc(var(--spacing) * 6);\n}\n.bn-source .leading-\\[15px\\] {\n  --tw-leading: 15px;\n  line-height: 15px;\n}\n.bn-source .font-semibold {\n  --tw-font-weight: var(--font-weight-semibold);\n  font-weight: var(--font-weight-semibold);\n}\n.bn-source .tracking-\\[-0\\.015em\\] {\n  --tw-tracking: -0.015em;\n  letter-spacing: -0.015em;\n}\n.bn-source .tracking-normal {\n  --tw-tracking: var(--tracking-normal);\n  letter-spacing: var(--tracking-normal);\n}\n.bn-source .whitespace-nowrap {\n  white-space: nowrap;\n}\n.bn-source .text-\\[color\\:var\\(--hu-brand-text\\,var\\(--color-accent-700\\)\\)\\] {\n  color: var(--hu-brand-text,var(--color-accent-700));\n}\n.bn-source .text-accent-500 {\n  color: var(--color-accent-500);\n}\n.bn-source .text-accent-700 {\n  color: var(--color-accent-700);\n}\n.bn-source .text-amber-700 {\n  color: var(--color-amber-700);\n}\n.bn-source .text-black {\n  color: var(--color-black);\n}\n.bn-source .text-black\\/45 {\n  color: color-mix(in srgb, #000 45%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    color: color-mix(in oklab, var(--color-black) 45%, transparent);\n  }\n}\n.bn-source .text-blue-700 {\n  color: var(--color-blue-700);\n}\n.bn-source .text-blue-900 {\n  color: var(--color-blue-900);\n}\n.bn-source .text-button-ghost-foreground {\n  color: var(--color-button-ghost-foreground);\n}\n.bn-source .text-chart-1-active {\n  color: var(--color-chart-1-active);\n}\n.bn-source .text-chart-5-active {\n  color: var(--color-chart-5-active);\n}\n.bn-source .text-file-upload-icon-foreground {\n  color: var(--color-file-upload-icon-foreground);\n}\n.bn-source .text-foreground-full {\n  color: var(--color-foreground-full);\n}\n.bn-source .text-foreground-icon-error {\n  color: var(--color-foreground-icon-error);\n}\n.bn-source .text-foreground-icon-primary {\n  color: var(--color-foreground-icon-primary);\n}\n.bn-source .text-foreground-icon-quaternary {\n  color: var(--color-foreground-icon-quaternary);\n}\n.bn-source .text-foreground-icon-secondary {\n  color: var(--color-foreground-icon-secondary);\n}\n.bn-source .text-foreground-icon-tertiary {\n  color: var(--color-foreground-icon-tertiary);\n}\n.bn-source .text-input-disabled-foreground {\n  color: var(--color-input-disabled-foreground);\n}\n.bn-source .text-kbd-foreground {\n  color: var(--color-kbd-foreground);\n}\n.bn-source .text-lime-600 {\n  color: var(--color-lime-600);\n}\n.bn-source .text-lime-700 {\n  color: var(--color-lime-700);\n}\n.bn-source .text-notification-error-foreground {\n  color: var(--color-notification-error-foreground);\n}\n.bn-source .text-notification-information-foreground {\n  color: var(--color-notification-information-foreground);\n}\n.bn-source .text-notification-success-foreground {\n  color: var(--color-notification-success-foreground);\n}\n.bn-source .text-pink-500 {\n  color: var(--color-pink-500);\n}\n.bn-source .text-pink-700 {\n  color: var(--color-pink-700);\n}\n.bn-source .text-red-700 {\n  color: var(--color-red-700);\n}\n.bn-source .text-status-blue-text {\n  color: var(--color-status-blue-text);\n}\n.bn-source .text-status-cyan-text {\n  color: var(--color-status-cyan-text);\n}\n.bn-source .text-status-lime-text {\n  color: var(--color-status-lime-text);\n}\n.bn-source .text-status-orange-text {\n  color: var(--color-status-orange-text);\n}\n.bn-source .text-status-purple-text {\n  color: var(--color-status-purple-text);\n}\n.bn-source .text-status-rose-text {\n  color: var(--color-status-rose-text);\n}\n.bn-source .text-status-yellow-text {\n  color: var(--color-status-yellow-text);\n}\n.bn-source .text-team-menu-count-foreground {\n  color: var(--color-team-menu-count-foreground);\n}\n.bn-source .text-text-disabled {\n  color: var(--color-text-disabled);\n}\n.bn-source .text-text-error-primary {\n  color: var(--color-text-error-primary);\n}\n.bn-source .text-text-placeholder {\n  color: var(--color-text-placeholder);\n}\n.bn-source .text-text-primary {\n  color: var(--color-text-primary);\n}\n.bn-source .text-text-secondary {\n  color: var(--color-text-secondary);\n}\n.bn-source .text-text-tertiary {\n  color: var(--color-text-tertiary);\n}\n.bn-source .text-text-white {\n  color: var(--color-text-white);\n}\n.bn-source .text-white {\n  color: var(--color-white);\n}\n.bn-source .ordinal {\n  --tw-ordinal: ordinal;\n  font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);\n}\n.bn-source .tabular-nums {\n  --tw-numeric-spacing: tabular-nums;\n  font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);\n}\n.bn-source .underline {\n  text-decoration-line: underline;\n}\n.bn-source .underline-offset-3 {\n  text-underline-offset: 3px;\n}\n.bn-source .opacity-0 {\n  opacity: 0%;\n}\n.bn-source .opacity-45 {\n  opacity: 45%;\n}\n.bn-source .opacity-50 {\n  opacity: 50%;\n}\n.bn-source .opacity-90 {\n  opacity: 90%;\n}\n.bn-source .opacity-100 {\n  opacity: 100%;\n}\n.bn-source .shadow {\n  --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .shadow-2xs {\n  --tw-shadow: 0 1px var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .shadow-\\[0_2px_2px_0_rgb\\(0_0_0\\/0\\.03\\)\\] {\n  --tw-shadow: 0 2px 2px 0 var(--tw-shadow-color, rgb(0 0 0/0.03));\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .shadow-\\[0_2px_4px_rgb\\(0_0_0\\/0\\.10\\)\\,inset_0_1px_0_rgb\\(255_255_255\\/0\\.8\\)\\] {\n  --tw-shadow: 0 2px 4px var(--tw-shadow-color, rgb(0 0 0/0.10)), inset 0 1px 0 var(--tw-shadow-color, rgb(255 255 255/0.8));\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .shadow-\\[0_3px_3px_0_rgb\\(0_0_0\\/0\\.03\\)\\,0_0\\.75px_0_0_rgb\\(0_0_0\\/0\\.05\\)\\] {\n  --tw-shadow: 0 3px 3px 0 var(--tw-shadow-color, rgb(0 0 0/0.03)), 0 0.75px 0 0 var(--tw-shadow-color, rgb(0 0 0/0.05));\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .shadow-\\[0_3px_3px_0_rgb\\(0_0_0\\/0\\.03\\)\\] {\n  --tw-shadow: 0 3px 3px 0 var(--tw-shadow-color, rgb(0 0 0/0.03));\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .shadow-\\[0_3px_8px_color-mix\\(in_srgb\\,var\\(--color-accent-600\\)_22\\%\\,transparent\\)\\] {\n  --tw-shadow: 0 3px 8px var(--tw-shadow-color, color-mix(in srgb,oklch(54.6% 0.245 262.881) 22%,transparent));\n  @supports (color: color-mix(in lab, red, red)) {\n    --tw-shadow: 0 3px 8px var(--tw-shadow-color, color-mix(in srgb,var(--color-accent-600) 22%,transparent));\n  }\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .shadow-\\[0_4px_4px_0_rgb\\(0_0_0\\/0\\.03\\)\\] {\n  --tw-shadow: 0 4px 4px 0 var(--tw-shadow-color, rgb(0 0 0/0.03));\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .shadow-\\[inset_0_1\\.5px_0_0_rgb\\(255_255_255\\/0\\.25\\)\\,inset_0_0_0_0\\.75px_var\\(--color-accent-500\\)\\] {\n  --tw-shadow: inset 0 1.5px 0 0 var(--tw-shadow-color, rgb(255 255 255/0.25)), inset 0 0 0 0.75px var(--tw-shadow-color, var(--color-accent-500));\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .shadow-\\[inset_0_1px_0_0_rgb\\(255_255_255\\/0\\.25\\)\\,inset_0_0_0_0\\.5px_var\\(--color-accent-500\\)\\] {\n  --tw-shadow: inset 0 1px 0 0 var(--tw-shadow-color, rgb(255 255 255/0.25)), inset 0 0 0 0.5px var(--tw-shadow-color, var(--color-accent-500));\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .shadow-\\[inset_0_1px_0_rgb\\(255_255_255\\/0\\.24\\)\\,0_1px_2px_rgb\\(4_80_226\\/0\\.16\\)\\] {\n  --tw-shadow: inset 0 1px 0 var(--tw-shadow-color, rgb(255 255 255/0.24)), 0 1px 2px var(--tw-shadow-color, rgb(4 80 226/0.16));\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .shadow-\\[inset_0_1px_0_rgb\\(255_255_255\\/0\\.24\\)\\] {\n  --tw-shadow: inset 0 1px 0 var(--tw-shadow-color, rgb(255 255 255/0.24));\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .shadow-\\[inset_0_1px_1px_rgb\\(0_0_0\\/0\\.06\\)\\] {\n  --tw-shadow: inset 0 1px 1px var(--tw-shadow-color, rgb(0 0 0/0.06));\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .shadow-\\[inset_0px_0px_0px_0\\.875px_var\\(--color-accent-500\\)\\,inset_0px_1\\.75px_0px_0px_rgba\\(255\\,255\\,255\\,0\\.25\\)\\] {\n  --tw-shadow: inset 0px 0px 0px 0.875px var(--tw-shadow-color, var(--color-accent-500)), inset 0px 1.75px 0px 0px var(--tw-shadow-color, rgba(255,255,255,0.25));\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .shadow-\\[inset_0px_0px_0px_1px_var\\(--color-accent-500\\)\\,inset_0px_2px_0px_0px_rgba\\(255\\,255\\,255\\,0\\.25\\)\\] {\n  --tw-shadow: inset 0px 0px 0px 1px var(--tw-shadow-color, var(--color-accent-500)), inset 0px 2px 0px 0px var(--tw-shadow-color, rgba(255,255,255,0.25));\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .shadow-card {\n  --tw-shadow: 0 1px 1px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .shadow-checkbox-selected {\n  --tw-shadow: inset 0 2px 0 0 var(--tw-shadow-color, rgb(255 255 255 / 0.25)), inset 0 0 0 1px var(--tw-shadow-color, var(--color-accent-500));\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .shadow-dropdown {\n  --tw-shadow: 0 1px 1px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.04)), 0 4px 4px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.02));\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .shadow-nav-selected {\n  --tw-shadow: 0 0 0 1px var(--tw-shadow-color, var(--color-accent-500)), inset 0 1px 0 0 var(--tw-shadow-color, rgb(255 255 255 / 0.251));\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .shadow-none {\n  --tw-shadow: 0 0 #0000;\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .shadow-sidebar {\n  --tw-shadow: 0 1px 0 0 var(--tw-shadow-color, rgb(0 0 0 / 0.0196)), 0 1px 12px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.0588)), 0 0 1px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.3216));\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .shadow-xs {\n  --tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .shadow\\/dropdown\\. {\n  --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .shadow\\/xs {\n  --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .shadow\\/xs\\. {\n  --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .ring {\n  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .ring-0 {\n  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .ring-2 {\n  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .ring-background-primary-default {\n  --tw-ring-color: var(--color-background-primary-default);\n}\n.bn-source .ring-background-secondary-default {\n  --tw-ring-color: var(--color-background-secondary-default);\n}\n.bn-source .ring-border-button-active {\n  --tw-ring-color: var(--color-border-button-active);\n}\n.bn-source .ring-border-button-hover {\n  --tw-ring-color: var(--color-border-button-hover);\n}\n.bn-source .ring-border-focus-ring {\n  --tw-ring-color: var(--color-border-focus-ring);\n}\n.bn-source .ring-transparent {\n  --tw-ring-color: transparent;\n}\n.bn-source .ring-offset-2 {\n  --tw-ring-offset-width: 2px;\n  --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n}\n.bn-source .outline {\n  outline-style: var(--tw-outline-style);\n  outline-width: 1px;\n}\n.bn-source .blur {\n  --tw-blur: blur(8px);\n  filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\n}\n.bn-source .blur-2xl {\n  --tw-blur: blur(var(--blur-2xl));\n  filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\n}\n.bn-source .blur-\\[2px\\] {\n  --tw-blur: blur(2px);\n  filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\n}\n.bn-source .blur-\\[3px\\] {\n  --tw-blur: blur(3px);\n  filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\n}\n.bn-source .blur-\\[4px\\] {\n  --tw-blur: blur(4px);\n  filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\n}\n.bn-source .brightness-110 {\n  --tw-brightness: brightness(110%);\n  filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\n}\n.bn-source .invert {\n  --tw-invert: invert(100%);\n  filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\n}\n.bn-source .filter {\n  filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\n}\n.bn-source .backdrop-blur-\\[1px\\] {\n  --tw-backdrop-blur: blur(1px);\n  -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\n  backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\n}\n.bn-source .backdrop-blur-\\[4px\\] {\n  --tw-backdrop-blur: blur(4px);\n  -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\n  backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\n}\n.bn-source .backdrop-blur-sm {\n  --tw-backdrop-blur: blur(var(--blur-sm));\n  -webkit-backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\n  backdrop-filter: var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);\n}\n.bn-source .transition {\n  transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[background-color\\,border-color\\,box-shadow\\,color\\,filter\\] {\n  transition-property: background-color,border-color,box-shadow,color,filter;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[background-color\\,border-color\\,box-shadow\\,color\\] {\n  transition-property: background-color,border-color,box-shadow,color;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[background-color\\,border-color\\,box-shadow\\,padding\\,font-size\\] {\n  transition-property: background-color,border-color,box-shadow,padding,font-size;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[background-color\\,border-color\\,box-shadow\\] {\n  transition-property: background-color,border-color,box-shadow;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[background-color\\,box-shadow\\,color\\] {\n  transition-property: background-color,box-shadow,color;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[background-color\\,box-shadow\\] {\n  transition-property: background-color,box-shadow;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[background-color\\,color\\,box-shadow\\] {\n  transition-property: background-color,color,box-shadow;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[background-color\\,color\\] {\n  transition-property: background-color,color;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[filter\\] {\n  transition-property: filter;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[gap\\] {\n  transition-property: gap;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[grid-template-rows\\,opacity\\] {\n  transition-property: grid-template-rows,opacity;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[max-width\\,opacity\\,filter\\] {\n  transition-property: max-width,opacity,filter;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[max-width\\,opacity\\,transform\\] {\n  transition-property: max-width,opacity,transform;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[opacity\\,border-color\\] {\n  transition-property: opacity,border-color;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[opacity\\,border-radius\\] {\n  transition-property: opacity,border-radius;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[opacity\\,transform\\,filter\\] {\n  transition-property: opacity,transform,filter;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[padding\\,font-size\\] {\n  transition-property: padding,font-size;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[scale\\,box-shadow\\,border-color\\] {\n  transition-property: scale,box-shadow,border-color;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[scale\\,opacity\\] {\n  transition-property: scale,opacity;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[start\\,opacity\\] {\n  transition-property: start,opacity;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[stroke-dasharray\\] {\n  transition-property: stroke-dasharray;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[transform\\,border-radius\\] {\n  transition-property: transform,border-radius;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[transform\\,color\\] {\n  transition-property: transform,color;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[transform\\,width\\,height\\] {\n  transition-property: transform,width,height;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[transform\\,width\\] {\n  transition-property: transform,width;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[translate\\,box-shadow\\] {\n  transition-property: translate,box-shadow;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[translate\\,scale\\] {\n  transition-property: translate,scale;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[width\\,background-color\\,border-color\\,padding\\] {\n  transition-property: width,background-color,border-color,padding;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[width\\,background-color\\] {\n  transition-property: width,background-color;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[width\\,border-radius\\,background-color\\] {\n  transition-property: width,border-radius,background-color;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[width\\,box-shadow\\] {\n  transition-property: width,box-shadow;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[width\\,height\\,font-size\\] {\n  transition-property: width,height,font-size;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[width\\,opacity\\] {\n  transition-property: width,opacity;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-\\[width\\] {\n  transition-property: width;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-all {\n  transition-property: all;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-colors {\n  transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-opacity {\n  transition-property: opacity;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-transform {\n  transition-property: transform, translate, scale, rotate;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .transition-none {\n  transition-property: none;\n}\n.bn-source .\\[transition-delay\\:250ms\\] {\n  transition-delay: 250ms;\n}\n.bn-source .delay-0 {\n  transition-delay: 0ms;\n}\n.bn-source .delay-100 {\n  transition-delay: 100ms;\n}\n.bn-source .delay-150 {\n  transition-delay: 150ms;\n}\n.bn-source .duration-100 {\n  --tw-duration: 100ms;\n  transition-duration: 100ms;\n}\n.bn-source .duration-150 {\n  --tw-duration: 150ms;\n  transition-duration: 150ms;\n}\n.bn-source .duration-200 {\n  --tw-duration: 200ms;\n  transition-duration: 200ms;\n}\n.bn-source .duration-300 {\n  --tw-duration: 300ms;\n  transition-duration: 300ms;\n}\n.bn-source .duration-500 {\n  --tw-duration: 500ms;\n  transition-duration: 500ms;\n}\n.bn-source .duration-\\[450ms\\] {\n  --tw-duration: 450ms;\n  transition-duration: 450ms;\n}\n.bn-source .duration-\\[700ms\\] {\n  --tw-duration: 700ms;\n  transition-duration: 700ms;\n}\n.bn-source .duration-\\[1400ms\\] {\n  --tw-duration: 1400ms;\n  transition-duration: 1400ms;\n}\n.bn-source .duration-\\[var\\(--input-transition-ms\\)\\] {\n  --tw-duration: var(--input-transition-ms);\n  transition-duration: var(--input-transition-ms);\n}\n.bn-source .ease-\\[cubic-bezier\\(\\.22\\,1\\,\\.36\\,1\\)\\] {\n  --tw-ease: cubic-bezier(.22,1,.36,1);\n  transition-timing-function: cubic-bezier(.22,1,.36,1);\n}\n.bn-source .ease-\\[cubic-bezier\\(0\\.32\\,0\\.72\\,0\\,1\\)\\] {\n  --tw-ease: cubic-bezier(0.32,0.72,0,1);\n  transition-timing-function: cubic-bezier(0.32,0.72,0,1);\n}\n.bn-source .ease-in-out {\n  --tw-ease: var(--ease-in-out);\n  transition-timing-function: var(--ease-in-out);\n}\n.bn-source .ease-linear {\n  --tw-ease: linear;\n  transition-timing-function: linear;\n}\n.bn-source .ease-out {\n  --tw-ease: var(--ease-out);\n  transition-timing-function: var(--ease-out);\n}\n.bn-source .\\[transition-timing-function\\:cubic-bezier\\(0\\.34\\,1\\.2\\,0\\.64\\,1\\)\\] {\n  transition-timing-function: cubic-bezier(0.34,1.2,0.64,1);\n}\n.bn-source .will-change-\\[opacity\\,transform\\,filter\\] {\n  will-change: opacity,transform,filter;\n}\n.bn-source .outline-none {\n  --tw-outline-style: none;\n  outline-style: none;\n}\n.bn-source .select-none {\n  -webkit-user-select: none;\n  user-select: none;\n}\n.bn-source .\\[--sc-fit\\:min\\(calc\\(\\(100cqw_-_16px\\)\\*0\\.92\\)\\,330px\\)\\] {\n  --sc-fit: min(calc((100cqw - 16px) * 0.92), 330px);\n}\n.bn-source .\\[--sc-fit\\:min\\(calc\\(\\(100cqw_-_16px\\)\\*0\\.92\\)\\,404px\\)\\] {\n  --sc-fit: min(calc((100cqw - 16px) * 0.92), 404px);\n}\n.bn-source .\\[--sc-fit\\:min\\(calc\\(\\(100cqw_-_16px\\)\\*0\\.92\\)\\,560px\\)\\] {\n  --sc-fit: min(calc((100cqw - 16px) * 0.92), 560px);\n}\n.bn-source .\\[--sc-fit\\:min\\(calc\\(\\(100cqw_-_16px\\)\\*0\\.92\\)\\,648px\\)\\] {\n  --sc-fit: min(calc((100cqw - 16px) * 0.92), 648px);\n}\n.bn-source .\\[--sc-fit\\:min\\(calc\\(\\(100cqw_-_16px\\)\\*0\\.92\\)\\,960px\\)\\] {\n  --sc-fit: min(calc((100cqw - 16px) * 0.92), 960px);\n}\n.bn-source .\\[transition\\:opacity_160ms_ease-out\\,filter_160ms_ease-out\\,translate_300ms_ease-out\\] {\n  transition: opacity 160ms ease-out,filter 160ms ease-out,translate 300ms ease-out;\n}\n.bn-source .\\[transition\\:opacity_200ms_ease\\] {\n  transition: opacity 200ms ease;\n}\n.bn-source .\\[transition\\:opacity_var\\(--stagger-dur\\)_var\\(--stagger-ease\\)\\,translate_var\\(--stagger-dur\\)_var\\(--stagger-ease\\)\\,filter_var\\(--stagger-dur\\)_var\\(--stagger-ease\\)\\] {\n  transition: opacity var(--stagger-dur) var(--stagger-ease),translate var(--stagger-dur) var(--stagger-ease),filter var(--stagger-dur) var(--stagger-ease);\n}\n.bn-source .ring-inset {\n  --tw-ring-inset: inset;\n}\n.bn-source .group-focus-within\\/row\\:opacity-0:is(:where(.group\\/row):focus-within *) {\n  opacity: 0%;\n}\n.bn-source .group-focus-within\\/row\\:opacity-100:is(:where(.group\\/row):focus-within *) {\n  opacity: 100%;\n}\n@media (hover: hover) {\n  .bn-source .group-hover\\:border-border-button-active:is(:where(.group):hover *) {\n    border-color: var(--color-border-button-active);\n  }\n  .bn-source .group-hover\\:bg-background-tertiary-hover:is(:where(.group):hover *) {\n    background-color: var(--color-background-tertiary-hover);\n  }\n  .bn-source .group-hover\\:text-file-upload-icon-foreground-hover:is(:where(.group):hover *) {\n    color: var(--color-file-upload-icon-foreground-hover);\n  }\n  .bn-source .group-hover\\:opacity-100:is(:where(.group):hover *) {\n    opacity: 100%;\n  }\n  .bn-source .group-hover\\/row\\:opacity-0:is(:where(.group\\/row):hover *) {\n    opacity: 0%;\n  }\n  .bn-source .group-hover\\/row\\:opacity-100:is(:where(.group\\/row):hover *) {\n    opacity: 100%;\n  }\n}\n.bn-source .group-data-\\[show-guides\\=false\\]\\/tree-view\\:hidden:is(:where(.group\\/tree-view)[data-show-guides=\"false\"] *) {\n  display: none;\n}\n.bn-source .group-data-\\[size\\=sm\\]\\/tree-view\\:min-h-8:is(:where(.group\\/tree-view)[data-size=\"sm\"] *) {\n  min-height: calc(var(--spacing) * 8);\n}\n.bn-source .group-data-\\[size\\=sm\\]\\/tree-view\\:text-body-2-regular:is(:where(.group\\/tree-view)[data-size=\"sm\"] *) {\n  font-size: var(--text-body-2-regular);\n  line-height: var(--tw-leading, var(--text-body-2-regular--line-height));\n  letter-spacing: var(--tw-tracking, var(--text-body-2-regular--letter-spacing));\n  font-weight: var(--tw-font-weight, var(--text-body-2-regular--font-weight));\n}\n.bn-source .placeholder\\:text-text-tertiary::placeholder {\n  color: var(--color-text-tertiary);\n}\n.bn-source .before\\:pointer-events-none::before {\n  content: var(--tw-content);\n  pointer-events: none;\n}\n.bn-source .before\\:absolute::before {\n  content: var(--tw-content);\n  position: absolute;\n}\n.bn-source .before\\:-inset-x-1\\.5::before {\n  content: var(--tw-content);\n  inset-inline: calc(var(--spacing) * -1.5);\n}\n.bn-source .before\\:-inset-x-\\[3px\\]::before {\n  content: var(--tw-content);\n  inset-inline: calc(3px * -1);\n}\n.bn-source .before\\:-inset-y-\\[5px\\]::before {\n  content: var(--tw-content);\n  inset-block: calc(5px * -1);\n}\n.bn-source .before\\:rounded-full::before {\n  content: var(--tw-content);\n  border-radius: calc(infinity * 1px);\n}\n.bn-source .before\\:border-2::before {\n  content: var(--tw-content);\n  border-style: var(--tw-border-style);\n  border-width: 2px;\n}\n.bn-source .before\\:border-transparent::before {\n  content: var(--tw-content);\n  border-color: transparent;\n}\n.bn-source .before\\:transition-colors::before {\n  content: var(--tw-content);\n  transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n}\n.bn-source .before\\:duration-150::before {\n  content: var(--tw-content);\n  --tw-duration: 150ms;\n  transition-duration: 150ms;\n}\n.bn-source .last\\:border-b-0:last-child {\n  border-bottom-style: var(--tw-border-style);\n  border-bottom-width: 0px;\n}\n.bn-source .focus-within\\:ring-2:focus-within {\n  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .focus-within\\:ring-border-focus-ring:focus-within {\n  --tw-ring-color: var(--color-border-focus-ring);\n}\n.bn-source .focus-within\\:ring-offset-2:focus-within {\n  --tw-ring-offset-width: 2px;\n  --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n}\n@media (hover: hover) {\n  .bn-source .hover\\:border-border-button-hover:hover {\n    border-color: var(--color-border-button-hover);\n  }\n  .bn-source .hover\\:border-border-error-default:hover {\n    border-color: var(--color-border-error-default);\n  }\n  .bn-source .hover\\:border-transparent:hover {\n    border-color: transparent;\n  }\n  .bn-source .hover\\:bg-accent-200:hover {\n    background-color: var(--color-accent-200);\n  }\n  .bn-source .hover\\:bg-background-primary-hover:hover {\n    background-color: var(--color-background-primary-hover);\n  }\n  .bn-source .hover\\:bg-background-secondary-default:hover {\n    background-color: var(--color-background-secondary-default);\n  }\n  .bn-source .hover\\:bg-background-secondary-hover:hover {\n    background-color: var(--color-background-secondary-hover);\n  }\n  .bn-source .hover\\:bg-background-secondary-hover\\/60:hover {\n    background-color: var(--color-background-secondary-hover);\n  }\n  @supports (color: color-mix(in lab, red, red)) {\n    .bn-source .hover\\:bg-background-secondary-hover\\/60:hover {\n      background-color: color-mix(in oklab, var(--color-background-secondary-hover) 60%, transparent);\n    }\n  }\n  .bn-source .hover\\:bg-background-tertiary-hover:hover {\n    background-color: var(--color-background-tertiary-hover);\n  }\n  .bn-source .hover\\:bg-background-tertiary-hover\\/55:hover {\n    background-color: var(--color-background-tertiary-hover);\n  }\n  @supports (color: color-mix(in lab, red, red)) {\n    .bn-source .hover\\:bg-background-tertiary-hover\\/55:hover {\n      background-color: color-mix(in oklab, var(--color-background-tertiary-hover) 55%, transparent);\n    }\n  }\n  .bn-source .hover\\:bg-border-button-active:hover {\n    background-color: var(--color-border-button-active);\n  }\n  .bn-source .hover\\:bg-button-ghost-hover:hover {\n    background-color: var(--color-button-ghost-hover);\n  }\n  .bn-source .hover\\:bg-dropdown-item-hover-background:hover {\n    background-color: var(--color-dropdown-item-hover-background);\n  }\n  .bn-source .hover\\:bg-neutral-800:hover {\n    background-color: var(--color-neutral-800);\n  }\n  .bn-source .hover\\:bg-transparent:hover {\n    background-color: transparent;\n  }\n  .bn-source .hover\\:text-black\\/70:hover {\n    color: color-mix(in srgb, #000 70%, transparent);\n  }\n  @supports (color: color-mix(in lab, red, red)) {\n    .bn-source .hover\\:text-black\\/70:hover {\n      color: color-mix(in oklab, var(--color-black) 70%, transparent);\n    }\n  }\n  .bn-source .hover\\:text-foreground-icon-primary:hover {\n    color: var(--color-foreground-icon-primary);\n  }\n  .bn-source .hover\\:text-foreground-icon-secondary:hover {\n    color: var(--color-foreground-icon-secondary);\n  }\n  .bn-source .hover\\:text-text-primary:hover {\n    color: var(--color-text-primary);\n  }\n  .bn-source .hover\\:text-text-secondary:hover {\n    color: var(--color-text-secondary);\n  }\n  .bn-source .hover\\:underline:hover {\n    text-decoration-line: underline;\n  }\n  .bn-source .hover\\:brightness-\\[1\\.06\\]:hover {\n    --tw-brightness: brightness(1.06);\n    filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\n  }\n  .bn-source .hover\\:before\\:border-border-sidebar-profile-hover:hover::before {\n    content: var(--tw-content);\n    border-color: var(--color-border-sidebar-profile-hover);\n  }\n}\n.bn-source .focus\\:placeholder\\:text-text-primary:focus::placeholder {\n  color: var(--color-text-primary);\n}\n.bn-source .focus-visible\\:relative:focus-visible {\n  position: relative;\n}\n.bn-source .focus-visible\\:z-10:focus-visible {\n  z-index: 10;\n}\n.bn-source .focus-visible\\:rounded-sm:focus-visible {\n  border-radius: var(--radius-sm);\n}\n.bn-source .focus-visible\\:border-border-button-active:focus-visible {\n  border-color: var(--color-border-button-active);\n}\n.bn-source .focus-visible\\:border-border-focus-ring:focus-visible {\n  border-color: var(--color-border-focus-ring);\n}\n.bn-source .focus-visible\\:bg-accent-200:focus-visible {\n  background-color: var(--color-accent-200);\n}\n.bn-source .focus-visible\\:bg-background-primary-hover:focus-visible {\n  background-color: var(--color-background-primary-hover);\n}\n.bn-source .focus-visible\\:bg-dropdown-item-hover-background:focus-visible {\n  background-color: var(--color-dropdown-item-hover-background);\n}\n.bn-source .focus-visible\\:ring-0:focus-visible {\n  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .focus-visible\\:ring-2:focus-visible {\n  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .focus-visible\\:ring-border-focus-ring:focus-visible {\n  --tw-ring-color: var(--color-border-focus-ring);\n}\n.bn-source .focus-visible\\:ring-offset-0:focus-visible {\n  --tw-ring-offset-width: 0px;\n  --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n}\n.bn-source .focus-visible\\:ring-offset-2:focus-visible {\n  --tw-ring-offset-width: 2px;\n  --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n}\n.bn-source .focus-visible\\:ring-inset:focus-visible {\n  --tw-ring-inset: inset;\n}\n.bn-source .active\\:cursor-grabbing:active {\n  cursor: grabbing;\n}\n.bn-source .active\\:border-border-button-active:active {\n  border-color: var(--color-border-button-active);\n}\n.bn-source .active\\:bg-background-primary-active:active {\n  background-color: var(--color-background-primary-active);\n}\n.bn-source .active\\:bg-background-secondary-hover:active {\n  background-color: var(--color-background-secondary-hover);\n}\n.bn-source .active\\:bg-button-ghost-active:active {\n  background-color: var(--color-button-ghost-active);\n}\n.bn-source .active\\:bg-neutral-900:active {\n  background-color: var(--color-neutral-900);\n}\n.bn-source .active\\:text-accent-800:active {\n  color: var(--color-accent-800);\n}\n.bn-source .active\\:text-text-primary:active {\n  color: var(--color-text-primary);\n}\n.bn-source .active\\:brightness-95:active {\n  --tw-brightness: brightness(95%);\n  filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\n}\n.bn-source .disabled\\:cursor-default:disabled {\n  cursor: default;\n}\n.bn-source .disabled\\:cursor-not-allowed:disabled {\n  cursor: not-allowed;\n}\n.bn-source .disabled\\:border-border-button-default:disabled {\n  border-color: var(--color-border-button-default);\n}\n.bn-source .disabled\\:bg-background-primary-disabled:disabled {\n  background-color: var(--color-background-primary-disabled);\n}\n.bn-source .disabled\\:bg-button-ghost-disabled:disabled {\n  background-color: var(--color-button-ghost-disabled);\n}\n.bn-source .disabled\\:bg-transparent:disabled {\n  background-color: transparent;\n}\n.bn-source .disabled\\:text-button-ghost-disabled-foreground:disabled {\n  color: var(--color-button-ghost-disabled-foreground);\n}\n.bn-source .disabled\\:text-button-primary-disabled-foreground:disabled {\n  color: var(--color-button-primary-disabled-foreground);\n}\n.bn-source .disabled\\:text-foreground-disabled-danger:disabled {\n  color: var(--color-foreground-disabled-danger);\n}\n.bn-source .disabled\\:text-icon-button-disabled-foreground:disabled {\n  color: var(--color-icon-button-disabled-foreground);\n}\n.bn-source .disabled\\:text-input-disabled-text:disabled {\n  color: var(--color-input-disabled-text);\n}\n.bn-source .disabled\\:text-text-tertiary:disabled {\n  color: var(--color-text-tertiary);\n}\n.bn-source .disabled\\:no-underline:disabled {\n  text-decoration-line: none;\n}\n.bn-source .disabled\\:opacity-60:disabled {\n  opacity: 60%;\n}\n.bn-source .disabled\\:shadow-none:disabled {\n  --tw-shadow: 0 0 #0000;\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .disabled\\:placeholder\\:text-input-disabled-text:disabled::placeholder {\n  color: var(--color-input-disabled-text);\n}\n.bn-source .aria-disabled\\:cursor-not-allowed[aria-disabled=\"true\"] {\n  cursor: not-allowed;\n}\n.bn-source .aria-disabled\\:border-border-button-default[aria-disabled=\"true\"] {\n  border-color: var(--color-border-button-default);\n}\n.bn-source .aria-disabled\\:bg-background-primary-disabled[aria-disabled=\"true\"] {\n  background-color: var(--color-background-primary-disabled);\n}\n.bn-source .aria-disabled\\:bg-button-ghost-disabled[aria-disabled=\"true\"] {\n  background-color: var(--color-button-ghost-disabled);\n}\n.bn-source .aria-disabled\\:text-button-ghost-disabled-foreground[aria-disabled=\"true\"] {\n  color: var(--color-button-ghost-disabled-foreground);\n}\n.bn-source .aria-disabled\\:text-button-primary-disabled-foreground[aria-disabled=\"true\"] {\n  color: var(--color-button-primary-disabled-foreground);\n}\n.bn-source .aria-disabled\\:text-foreground-disabled-danger[aria-disabled=\"true\"] {\n  color: var(--color-foreground-disabled-danger);\n}\n.bn-source .aria-disabled\\:text-text-tertiary[aria-disabled=\"true\"] {\n  color: var(--color-text-tertiary);\n}\n.bn-source .aria-disabled\\:no-underline[aria-disabled=\"true\"] {\n  text-decoration-line: none;\n}\n.bn-source .aria-disabled\\:opacity-60[aria-disabled=\"true\"] {\n  opacity: 60%;\n}\n.bn-source .aria-disabled\\:shadow-none[aria-disabled=\"true\"] {\n  --tw-shadow: 0 0 #0000;\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .aria-invalid\\:placeholder\\:text-text-error-placeholder[aria-invalid=\"true\"]::placeholder {\n  color: var(--color-text-error-placeholder);\n}\n.bn-source .data-\\[empty\\]\\:px-4[data-empty] {\n  padding-inline: calc(var(--spacing) * 4);\n}\n.bn-source .data-\\[empty\\]\\:py-8[data-empty] {\n  padding-block: calc(var(--spacing) * 8);\n}\n.bn-source .data-\\[empty\\]\\:text-center[data-empty] {\n  text-align: center;\n}\n.bn-source .data-\\[empty\\]\\:text-body-regular[data-empty] {\n  font-size: var(--text-body-regular);\n  line-height: var(--tw-leading, var(--text-body-regular--line-height));\n  letter-spacing: var(--tw-tracking, var(--text-body-regular--letter-spacing));\n  font-weight: var(--tw-font-weight, var(--text-body-regular--font-weight));\n}\n.bn-source .data-\\[empty\\]\\:text-text-tertiary[data-empty] {\n  color: var(--color-text-tertiary);\n}\n.bn-source .data-\\[entering\\]\\:scale-90[data-entering] {\n  --tw-scale-x: 90%;\n  --tw-scale-y: 90%;\n  --tw-scale-z: 90%;\n  scale: var(--tw-scale-x) var(--tw-scale-y);\n}\n.bn-source .data-\\[entering\\]\\:scale-95[data-entering] {\n  --tw-scale-x: 95%;\n  --tw-scale-y: 95%;\n  --tw-scale-z: 95%;\n  scale: var(--tw-scale-x) var(--tw-scale-y);\n}\n.bn-source .data-\\[entering\\]\\:opacity-0[data-entering] {\n  opacity: 0%;\n}\n.bn-source .data-\\[entering\\]\\:blur-\\[2px\\][data-entering] {\n  --tw-blur: blur(2px);\n  filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\n}\n.bn-source .data-\\[entering\\]\\:blur-\\[4px\\][data-entering] {\n  --tw-blur: blur(4px);\n  filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\n}\n.bn-source .data-\\[exiting\\]\\:scale-90[data-exiting] {\n  --tw-scale-x: 90%;\n  --tw-scale-y: 90%;\n  --tw-scale-z: 90%;\n  scale: var(--tw-scale-x) var(--tw-scale-y);\n}\n.bn-source .data-\\[exiting\\]\\:scale-95[data-exiting] {\n  --tw-scale-x: 95%;\n  --tw-scale-y: 95%;\n  --tw-scale-z: 95%;\n  scale: var(--tw-scale-x) var(--tw-scale-y);\n}\n.bn-source .data-\\[exiting\\]\\:opacity-0[data-exiting] {\n  opacity: 0%;\n}\n.bn-source .data-\\[exiting\\]\\:blur-\\[2px\\][data-exiting] {\n  --tw-blur: blur(2px);\n  filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\n}\n.bn-source .data-\\[exiting\\]\\:blur-\\[4px\\][data-exiting] {\n  --tw-blur: blur(4px);\n  filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);\n}\n.bn-source .data-\\[focus-visible\\]\\:ring-2[data-focus-visible] {\n  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n.bn-source .data-\\[focus-visible\\]\\:ring-border-focus-ring[data-focus-visible] {\n  --tw-ring-color: var(--color-border-focus-ring);\n}\n.bn-source .data-\\[placement\\=bottom\\]\\:origin-top-left[data-placement=\"bottom\"] {\n  transform-origin: 0 0;\n}\n.bn-source .data-\\[placement\\=left\\]\\:origin-right[data-placement=\"left\"] {\n  transform-origin: 100%;\n}\n.bn-source .data-\\[placement\\=right\\]\\:origin-left[data-placement=\"right\"] {\n  transform-origin: 0;\n}\n.bn-source .data-\\[placement\\=top\\]\\:origin-bottom-left[data-placement=\"top\"] {\n  transform-origin: 0 100%;\n}\n@media (prefers-reduced-motion: reduce) {\n  .bn-source .motion-reduce\\:transition-none {\n    transition-property: none;\n  }\n}\n@media (width >= 40rem) {\n  .bn-source .sm\\:start-1 {\n    inset-inline-start: calc(var(--spacing) * 1);\n  }\n  .bn-source .sm\\:start-6 {\n    inset-inline-start: calc(var(--spacing) * 6);\n  }\n  .bn-source .sm\\:end-4 {\n    inset-inline-end: calc(var(--spacing) * 4);\n  }\n  .bn-source .sm\\:end-6 {\n    inset-inline-end: calc(var(--spacing) * 6);\n  }\n  .bn-source .sm\\:top-1 {\n    top: var(--spacing);\n  }\n  .bn-source .sm\\:top-6 {\n    top: calc(var(--spacing) * 6);\n  }\n  .bn-source .sm\\:right-6 {\n    right: calc(var(--spacing) * 6);\n  }\n  .bn-source .sm\\:bottom-6 {\n    bottom: calc(var(--spacing) * 6);\n  }\n  .bn-source .sm\\:left-6 {\n    left: calc(var(--spacing) * 6);\n  }\n  .bn-source .sm\\:order-2 {\n    order: 2;\n  }\n  .bn-source .sm\\:order-3 {\n    order: 3;\n  }\n  .bn-source .sm\\:mx-0 {\n    margin-inline: 0px;\n  }\n  .bn-source .sm\\:block {\n    display: block;\n  }\n  .bn-source .sm\\:size-8 {\n    width: calc(var(--spacing) * 8);\n    height: calc(var(--spacing) * 8);\n  }\n  .bn-source .sm\\:w-48 {\n    width: calc(var(--spacing) * 48);\n  }\n  .bn-source .sm\\:w-56 {\n    width: calc(var(--spacing) * 56);\n  }\n  .bn-source .sm\\:w-\\[153px\\] {\n    width: 153px;\n  }\n  .bn-source .sm\\:w-auto {\n    width: auto;\n  }\n  .bn-source .sm\\:min-w-0 {\n    min-width: 0px;\n  }\n  .bn-source .sm\\:flex-1 {\n    flex: 1;\n  }\n  .bn-source .sm\\:flex-none {\n    flex: none;\n  }\n  .bn-source .sm\\:basis-auto {\n    flex-basis: auto;\n  }\n  .bn-source .sm\\:translate-x-9 {\n    --tw-translate-x: calc(var(--spacing) * 9);\n    translate: var(--tw-translate-x) var(--tw-translate-y);\n  }\n  .bn-source .sm\\:scale-\\[calc\\(\\(100cqw-32px\\)\\/700\\)\\] {\n    scale: calc((100cqw - 32px) / 700);\n  }\n  .bn-source .sm\\:grid-cols-2 {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n  }\n  .bn-source .sm\\:flex-row {\n    flex-direction: row;\n  }\n  .bn-source .sm\\:flex-nowrap {\n    flex-wrap: nowrap;\n  }\n  .bn-source .sm\\:flex-wrap {\n    flex-wrap: wrap;\n  }\n  .bn-source .sm\\:items-center {\n    align-items: center;\n  }\n  .bn-source .sm\\:items-start {\n    align-items: flex-start;\n  }\n  .bn-source .sm\\:justify-between {\n    justify-content: space-between;\n  }\n  .bn-source .sm\\:justify-end {\n    justify-content: flex-end;\n  }\n  .bn-source .sm\\:overflow-visible {\n    overflow: visible;\n  }\n  .bn-source .sm\\:p-1 {\n    padding: var(--spacing);\n  }\n  .bn-source .sm\\:p-6 {\n    padding: calc(var(--spacing) * 6);\n  }\n  .bn-source .sm\\:p-8 {\n    padding: calc(var(--spacing) * 8);\n  }\n  .bn-source .sm\\:px-0 {\n    padding-inline: 0px;\n  }\n  .bn-source .sm\\:\\[--sc-fit\\:min\\(calc\\(\\(100cqw_-_16px\\)\\*1\\)\\,330px\\)\\] {\n    --sc-fit: min(calc((100cqw - 16px) * 1), 330px);\n  }\n  .bn-source .sm\\:\\[--sc-fit\\:min\\(calc\\(\\(100cqw_-_16px\\)\\*1\\)\\,404px\\)\\] {\n    --sc-fit: min(calc((100cqw - 16px) * 1), 404px);\n  }\n  .bn-source .sm\\:\\[--sc-fit\\:min\\(calc\\(\\(100cqw_-_16px\\)\\*1\\)\\,560px\\)\\] {\n    --sc-fit: min(calc((100cqw - 16px) * 1), 560px);\n  }\n  .bn-source .sm\\:\\[--sc-fit\\:min\\(calc\\(\\(100cqw_-_16px\\)\\*1\\)\\,648px\\)\\] {\n    --sc-fit: min(calc((100cqw - 16px) * 1), 648px);\n  }\n  .bn-source .sm\\:\\[--sc-fit\\:min\\(calc\\(\\(100cqw_-_16px\\)\\*1\\)\\,960px\\)\\] {\n    --sc-fit: min(calc((100cqw - 16px) * 1), 960px);\n  }\n  .bn-source .sm\\:\\[--sc-fit\\:min\\(calc\\(100cqw_-_32px\\)\\,330px\\)\\] {\n    --sc-fit: min(calc(100cqw - 32px), 330px);\n  }\n  @media (hover: hover) {\n    .bn-source .sm\\:group-hover\\/card\\:-translate-x-\\[9px\\]:is(:where(.group\\/card):hover *) {\n      --tw-translate-x: calc(9px * -1);\n      translate: var(--tw-translate-x) var(--tw-translate-y);\n    }\n    .bn-source .sm\\:group-hover\\/card\\:-translate-x-\\[27px\\]:is(:where(.group\\/card):hover *) {\n      --tw-translate-x: calc(27px * -1);\n      translate: var(--tw-translate-x) var(--tw-translate-y);\n    }\n    .bn-source .sm\\:group-hover\\/card\\:translate-x-\\[9px\\]:is(:where(.group\\/card):hover *) {\n      --tw-translate-x: 9px;\n      translate: var(--tw-translate-x) var(--tw-translate-y);\n    }\n    .bn-source .sm\\:group-hover\\/card\\:translate-x-\\[27px\\]:is(:where(.group\\/card):hover *) {\n      --tw-translate-x: 27px;\n      translate: var(--tw-translate-x) var(--tw-translate-y);\n    }\n    .bn-source .sm\\:group-hover\\/card\\:-translate-y-1:is(:where(.group\\/card):hover *) {\n      --tw-translate-y: calc(var(--spacing) * -1);\n      translate: var(--tw-translate-x) var(--tw-translate-y);\n    }\n    .bn-source .sm\\:group-hover\\/card\\:-translate-y-\\[58px\\]:is(:where(.group\\/card):hover *) {\n      --tw-translate-y: calc(58px * -1);\n      translate: var(--tw-translate-x) var(--tw-translate-y);\n    }\n    .bn-source .sm\\:group-hover\\/card\\:-translate-y-\\[554px\\]:is(:where(.group\\/card):hover *) {\n      --tw-translate-y: calc(554px * -1);\n      translate: var(--tw-translate-x) var(--tw-translate-y);\n    }\n    .bn-source .sm\\:group-hover\\/card\\:scale-105:is(:where(.group\\/card):hover *) {\n      --tw-scale-x: 105%;\n      --tw-scale-y: 105%;\n      --tw-scale-z: 105%;\n      scale: var(--tw-scale-x) var(--tw-scale-y);\n    }\n    .bn-source .sm\\:group-hover\\/card\\:\\[transition-delay\\:0ms\\]:is(:where(.group\\/card):hover *) {\n      transition-delay: 0ms;\n    }\n  }\n}\n@media (width >= 48rem) {\n  .bn-source .md\\:block {\n    display: block;\n  }\n  .bn-source .md\\:grid-cols-2 {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n  }\n}\n@media (width >= 64rem) {\n  .bn-source .lg\\:w-60 {\n    width: calc(var(--spacing) * 60);\n  }\n  .bn-source .lg\\:w-\\[260px\\] {\n    width: 260px;\n  }\n  .bn-source .lg\\:grid-cols-2 {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n  }\n  .bn-source .lg\\:grid-cols-4 {\n    grid-template-columns: repeat(4, minmax(0, 1fr));\n  }\n}\n@media (width >= 80rem) {\n  .bn-source .xl\\:start-5 {\n    inset-inline-start: calc(var(--spacing) * 5);\n  }\n  .bn-source .xl\\:start-\\[15px\\] {\n    inset-inline-start: 15px;\n  }\n  .bn-source .xl\\:end-auto {\n    inset-inline-end: auto;\n  }\n  .bn-source .xl\\:h-\\[179px\\] {\n    height: 179px;\n  }\n  .bn-source .xl\\:w-\\[275px\\] {\n    width: 275px;\n  }\n  .bn-source .xl\\:scale-100 {\n    --tw-scale-x: 100%;\n    --tw-scale-y: 100%;\n    --tw-scale-z: 100%;\n    scale: var(--tw-scale-x) var(--tw-scale-y);\n  }\n  .bn-source .xl\\:scale-\\[0\\.47\\] {\n    scale: 0.47;\n  }\n  .bn-source .xl\\:grid-cols-3 {\n    grid-template-columns: repeat(3, minmax(0, 1fr));\n  }\n  .bn-source .xl\\:grid-cols-4 {\n    grid-template-columns: repeat(4, minmax(0, 1fr));\n  }\n}\n.bn-source .rtl\\:origin-right:dir(rtl) {\n  transform-origin: 100%;\n}\n.bn-source .rtl\\:origin-top-right:dir(rtl) {\n  transform-origin: 100% 0;\n}\n.bn-source .rtl\\:-translate-x-3:dir(rtl) {\n  --tw-translate-x: calc(var(--spacing) * -3);\n  translate: var(--tw-translate-x) var(--tw-translate-y);\n}\n.bn-source .rtl\\:-translate-x-6:dir(rtl) {\n  --tw-translate-x: calc(var(--spacing) * -6);\n  translate: var(--tw-translate-x) var(--tw-translate-y);\n}\n.bn-source .rtl\\:-translate-x-6\\.5:dir(rtl) {\n  --tw-translate-x: calc(var(--spacing) * -6.5);\n  translate: var(--tw-translate-x) var(--tw-translate-y);\n}\n.bn-source .rtl\\:-translate-x-8:dir(rtl) {\n  --tw-translate-x: calc(var(--spacing) * -8);\n  translate: var(--tw-translate-x) var(--tw-translate-y);\n}\n.bn-source .rtl\\:-translate-x-9:dir(rtl) {\n  --tw-translate-x: calc(var(--spacing) * -9);\n  translate: var(--tw-translate-x) var(--tw-translate-y);\n}\n.bn-source .rtl\\:-translate-x-\\[18px\\]:dir(rtl) {\n  --tw-translate-x: calc(18px * -1);\n  translate: var(--tw-translate-x) var(--tw-translate-y);\n}\n.bn-source .rtl\\:-scale-x-100:dir(rtl) {\n  --tw-scale-x: calc(100% * -1);\n  scale: var(--tw-scale-x) var(--tw-scale-y);\n}\n.bn-source .rtl\\:scale-x-100:dir(rtl) {\n  --tw-scale-x: 100%;\n  scale: var(--tw-scale-x) var(--tw-scale-y);\n}\n.bn-source .rtl\\:rotate-180:dir(rtl) {\n  rotate: 180deg;\n}\n.bn-source .rtl\\:data-\\[placement\\=bottom\\]\\:origin-top-right:dir(rtl)[data-placement=\"bottom\"] {\n  transform-origin: 100% 0;\n}\n.bn-source .rtl\\:data-\\[placement\\=top\\]\\:origin-bottom-right:dir(rtl)[data-placement=\"top\"] {\n  transform-origin: 100% 100%;\n}\n@media (width >= 40rem) {\n  .bn-source .sm\\:rtl\\:-translate-x-9:dir(rtl) {\n    --tw-translate-x: calc(var(--spacing) * -9);\n    translate: var(--tw-translate-x) var(--tw-translate-y);\n  }\n}\n.bn-source .dark\\:bg-\\[\\#2e2e33\\]:where(.dark, .dark *) {\n  background-color: #2e2e33;\n}\n.bn-source .dark\\:bg-background-secondary-default:where(.dark, .dark *) {\n  background-color: var(--color-background-secondary-default);\n}\n.bn-source .dark\\:bg-neutral-700:where(.dark, .dark *) {\n  background-color: var(--color-neutral-700);\n}\n.bn-source .dark\\:text-red-400:where(.dark, .dark *) {\n  color: var(--color-red-400);\n}\n.bn-source .dark\\:text-white:where(.dark, .dark *) {\n  color: var(--color-white);\n}\n.bn-source .dark\\:text-white\\/45:where(.dark, .dark *) {\n  color: color-mix(in srgb, #fff 45%, transparent);\n  @supports (color: color-mix(in lab, red, red)) {\n    color: color-mix(in oklab, var(--color-white) 45%, transparent);\n  }\n}\n@media (hover: hover) {\n  .bn-source .dark\\:hover\\:text-white\\/70:where(.dark, .dark *):hover {\n    color: color-mix(in srgb, #fff 70%, transparent);\n  }\n  @supports (color: color-mix(in lab, red, red)) {\n    .bn-source .dark\\:hover\\:text-white\\/70:where(.dark, .dark *):hover {\n      color: color-mix(in oklab, var(--color-white) 70%, transparent);\n    }\n  }\n}\n.bn-source .dark\\:active\\:text-accent-200:where(.dark, .dark *):active {\n  color: var(--color-accent-200);\n}\n.bn-source .dark\\:\\[\\&_path\\]\\:fill-white:where(.dark, .dark *) path {\n  fill: var(--color-white);\n}\n.bn-source .\\[\\&\\:\\:-webkit-scrollbar\\]\\:hidden::-webkit-scrollbar {\n  display: none;\n}\n.bn-source .\\[\\&\\>\\*\\]\\:snap-center > * {\n  scroll-snap-align: center;\n}\n.bn-source ::view-transition-old(root), .bn-source ::view-transition-new(root) {\n  animation: none;\n  mix-blend-mode: normal;\n}\n@keyframes ai-chat-text-shimmer {\n  from {\n    background-position: 200% center;\n  }\n  to {\n    background-position: -100% center;\n  }\n}\n.bn-source .agent-progress-loading-text {\n  color: transparent;\n  background-image: linear-gradient( 100deg, var(--color-text-secondary) 16%, var(--color-text-secondary) 38%, var(--color-text-primary) 50%, var(--color-text-secondary) 62%, var(--color-text-secondary) 84% );\n  background-position: 200% center;\n  background-size: 300% 100%;\n  background-clip: text;\n  -webkit-background-clip: text;\n  animation: ai-chat-text-shimmer 3.4s linear infinite;\n  will-change: background-position;\n}\n@media (prefers-reduced-motion: reduce) {\n  .bn-source .agent-progress-loading-text {\n    color: var(--color-text-secondary);\n    background-image: none;\n    animation: none;\n  }\n}\n.bn-source ::view-transition-old(root) {\n  z-index: 1;\n}\n.bn-source ::view-transition-new(root) {\n  z-index: 2;\n}\n.bn-source .theme-transitioning, .bn-source .theme-transitioning * {\n  transition: none !important;\n}\n.bn-source html, .bn-source body {\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  font-variant-ligatures: contextual;\n  font-kerning: normal;\n}\n.bn-source html {\n  color-scheme: light;\n  background-color: var(--color-background-full);\n}\n.bn-source html.dark {\n  color-scheme: dark;\n}\n.bn-source body {\n  background-color: var(--color-background-full);\n  color: var(--color-text-primary);\n}\n.bn-source .theme-logo-dark, .bn-source .theme-asset-dark {\n  display: none;\n}\n.bn-source .dark .theme-logo-light, .bn-source .dark .theme-asset-light {\n  display: none;\n}\n.bn-source .dark .theme-logo-dark, .bn-source .dark .theme-asset-dark {\n  display: block;\n}\n.bn-source .dark .shadow-2xs {\n  --tw-shadow: var(--shadow-2xs);\n}\n.bn-source .dark .shadow-xs {\n  --tw-shadow: var(--shadow-xs);\n}\n.bn-source .dark .shadow-sm {\n  --tw-shadow: var(--shadow-sm);\n}\n.bn-source .dark .shadow-md {\n  --tw-shadow: var(--shadow-md);\n}\n.bn-source .dark .shadow-lg {\n  --tw-shadow: var(--shadow-lg);\n}\n.bn-source .dark .shadow-xl {\n  --tw-shadow: var(--shadow-xl);\n}\n.bn-source .dark .shadow-card {\n  --tw-shadow: var(--shadow-card);\n}\n.bn-source .dark .shadow-dropdown {\n  --tw-shadow: var(--shadow-dropdown);\n}\n.bn-source .dark .shadow-sidebar {\n  --tw-shadow: var(--shadow-sidebar);\n}\n.bn-source .dark .shadow-waitlist {\n  --tw-shadow: var(--shadow-waitlist);\n}\n.bn-source details summary::-webkit-details-marker {\n  display: none;\n}\n.bn-source input::-webkit-outer-spin-button, .bn-source input::-webkit-inner-spin-button {\n  -webkit-appearance: none;\n  margin: 0;\n}\n.bn-source input[type=\"number\"] {\n  -moz-appearance: textfield;\n}\n.bn-source input[type=\"search\"]::-webkit-search-cancel-button {\n  -webkit-appearance: none;\n}\n@media (max-width: 639px) {\n  .bn-source input, .bn-source select, .bn-source textarea {\n    font-size: 16px;\n  }\n}\n@keyframes number-fade {\n  from {\n    opacity: 0.35;\n  }\n  to {\n    opacity: 1;\n  }\n}\n.bn-source .animate-number-fade {\n  animation: number-fade 220ms ease-out;\n}\n.bn-source .recharts-wrapper {\n  direction: ltr;\n}\n.bn-source .recharts-wrapper:focus, .bn-source .recharts-wrapper:focus-visible, .bn-source .recharts-wrapper :focus, .bn-source .recharts-wrapper :focus-visible {\n  outline: none;\n}\n.bn-source .landing-glass-stroke {\n  pointer-events: none;\n  position: absolute;\n  inset: 0;\n  border-radius: inherit;\n  padding: var(--lg-rim-width, 1.5px);\n  background: conic-gradient( from var(--lg-rim-angle, 0deg), var(--lg-rim-hi, rgb(255 255 255 / 0.9)) 0deg, var(--lg-rim-sh, rgb(0 0 0 / 0.14)) 70deg, var(--lg-rim-dim, rgb(255 255 255 / 0.1)) 140deg, var(--lg-rim-bounce, rgb(255 255 255 / 0.55)) 180deg, var(--lg-rim-dim, rgb(255 255 255 / 0.1)) 220deg, var(--lg-rim-sh, rgb(0 0 0 / 0.14)) 290deg, var(--lg-rim-hi, rgb(255 255 255 / 0.9)) 360deg );\n  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);\n  mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);\n  -webkit-mask-composite: xor;\n  mask-composite: exclude;\n  opacity: var(--lg-rim-o, 1);\n  transition: opacity var(--lg-ms, 200ms) ease;\n}\n.bn-source .lg-tint {\n  background-color: var(--lg-tint, transparent);\n  transition: background-color var(--lg-ms, 200ms) ease;\n}\n.bn-source .lg-sheen {\n  opacity: var(--lg-sheen, 0.5);\n  transition: opacity var(--lg-ms, 200ms) ease;\n}\n.bn-source .lg-host {\n  box-shadow: var(--lg-shadow, none);\n  transition: box-shadow var(--lg-ms, 200ms) ease, transform var(--lg-ms, 200ms) ease;\n}\n.bn-source .lg-host:hover {\n  box-shadow: var(--lg-shadow-hover, var(--lg-shadow, none));\n  transform: translateY(var(--lg-lift, 0px)) scale(var(--lg-scale, 1));\n}\n.bn-source .group:hover .lg-tint.lg-hover {\n  background-color: var(--lg-tint-hover, var(--lg-tint, transparent));\n}\n.bn-source .group:hover .lg-sheen.lg-hover {\n  opacity: var(--lg-sheen-hover, var(--lg-sheen, 0.5));\n}\n.bn-source .group:hover .landing-glass-stroke.lg-hover {\n  opacity: var(--lg-rim-o-hover, var(--lg-rim-o, 1));\n}\n@media (prefers-reduced-motion: reduce) {\n  .bn-source .lg-tint, .bn-source .lg-sheen, .bn-source .lg-host, .bn-source .landing-glass-stroke {\n    transition: none;\n  }\n  .bn-source .lg-host:hover {\n    transform: none;\n  }\n}\n@keyframes flap-fall {\n  from {\n    transform: rotateX(0deg);\n    filter: brightness(1);\n  }\n  to {\n    transform: rotateX(-90deg);\n    filter: brightness(0.86);\n  }\n}\n@keyframes flap-rise {\n  0% {\n    transform: rotateX(90deg);\n    filter: brightness(0.86);\n  }\n  70% {\n    transform: rotateX(-9deg);\n  }\n  86% {\n    transform: rotateX(4deg);\n  }\n  100% {\n    transform: rotateX(0deg);\n    filter: brightness(1);\n  }\n}\n.bn-source .animate-flap-fall {\n  transform-origin: bottom center;\n  backface-visibility: hidden;\n  animation: flap-fall 150ms cubic-bezier(0.55, 0, 0.9, 0.35) forwards;\n}\n.bn-source .animate-flap-rise {\n  transform-origin: top center;\n  backface-visibility: hidden;\n  animation: flap-rise 230ms cubic-bezier(0.25, 0.7, 0.35, 1) 150ms both;\n}\n@media (prefers-reduced-motion: reduce) {\n  .bn-source .animate-flap-fall, .bn-source .animate-flap-rise {\n    animation-duration: 1ms;\n    animation-delay: 0ms;\n  }\n}\n@keyframes row-grow-in {\n  from {\n    grid-template-rows: 0fr;\n  }\n  to {\n    grid-template-rows: 1fr;\n  }\n}\n@keyframes row-slide-in {\n  from {\n    translate: 0 -100%;\n  }\n}\n@keyframes row-fade-in {\n  from {\n    opacity: 0;\n    filter: blur(2px);\n  }\n}\n.bn-source .animate-row-grow-in {\n  animation: row-grow-in 400ms ease-out;\n}\n.bn-source .animate-row-slide-in {\n  animation: row-slide-in 400ms ease-out, row-fade-in 240ms ease-out;\n}\n@keyframes row-collapse-out {\n  from {\n    grid-template-rows: 1fr;\n  }\n  to {\n    grid-template-rows: 0fr;\n  }\n}\n@keyframes row-slide-out {\n  to {\n    translate: 0 -100%;\n  }\n}\n@keyframes row-fade-out {\n  to {\n    opacity: 0;\n    filter: blur(2px);\n  }\n}\n.bn-source .animate-row-collapse-out {\n  animation: row-collapse-out 225ms ease-in forwards;\n}\n.bn-source .animate-row-slide-out {\n  animation: row-slide-out 225ms ease-in forwards, row-fade-out 160ms ease-in forwards;\n}\n@media (prefers-reduced-motion: reduce) {\n  .bn-source .animate-row-grow-in, .bn-source .animate-row-slide-in, .bn-source .animate-row-collapse-out, .bn-source .animate-row-slide-out {\n    animation-duration: 1ms;\n  }\n}\n.bn-source .t-stagger {\n  --stagger-dur: 500ms;\n  --stagger-distance: 12px;\n  --stagger-stagger: 40ms;\n  --stagger-blur: 3px;\n  --stagger-ease: cubic-bezier(0.22, 1, 0.36, 1);\n}\n.bn-source .t-stagger-line {\n  opacity: 0;\n  transform: translateY(var(--stagger-distance));\n  filter: blur(var(--stagger-blur));\n  transition: opacity var(--stagger-dur) var(--stagger-ease), transform var(--stagger-dur) var(--stagger-ease), filter var(--stagger-dur) var(--stagger-ease);\n  will-change: transform, opacity, filter;\n}\n.bn-source .t-stagger-line--2 {\n  transition-delay: var(--stagger-stagger);\n}\n.bn-source .t-stagger-line--3 {\n  transition-delay: calc(var(--stagger-stagger) * 2);\n}\n.bn-source .t-stagger.is-shown .t-stagger-line {\n  opacity: 1;\n  transform: translateY(0);\n  filter: blur(0);\n}\n.bn-source .t-stagger.is-hiding .t-stagger-line {\n  opacity: 0;\n  transform: translateY(0);\n  filter: blur(0);\n  transition: opacity 200ms ease, transform 0s linear, filter 0s linear;\n  transition-delay: 0s;\n}\n@media (prefers-reduced-motion: reduce) {\n  .bn-source .t-stagger-line {\n    transition: none !important;\n  }\n}\n@keyframes label-out {\n  from {\n    transform: translateY(0);\n    opacity: 1;\n  }\n  to {\n    transform: translateY(-10px);\n    opacity: 0;\n  }\n}\n@keyframes label-in {\n  from {\n    transform: translateY(10px);\n    opacity: 0;\n  }\n  to {\n    transform: translateY(0);\n    opacity: 1;\n  }\n}\n.bn-source .animate-label-out {\n  animation: label-out 220ms ease-out forwards;\n}\n.bn-source .animate-label-in {\n  animation: label-in 220ms ease-out;\n}\n@keyframes check-draw {\n  from {\n    stroke-dashoffset: 1;\n  }\n  to {\n    stroke-dashoffset: 0;\n  }\n}\n.bn-source .animate-check-draw {\n  stroke-dasharray: 1;\n  stroke-dashoffset: 1;\n  animation: check-draw 200ms cubic-bezier(0.65, 0, 0.35, 1) forwards;\n}\n@media (prefers-reduced-motion: reduce) {\n  .bn-source .animate-check-draw {\n    animation: none;\n    stroke-dashoffset: 0;\n  }\n}\n.bn-source .contributions-grid {\n  --contribution-tier-0: var(--color-chart-neutral);\n}\n.bn-source .contributions-grid[data-accent=\"emerald\"] {\n  --contribution-tier-1: var(--color-emerald-200);\n  --contribution-tier-2: var(--color-emerald-400);\n  --contribution-tier-3: var(--color-emerald-500);\n  --contribution-tier-4: var(--color-emerald-600);\n  --contribution-tier-5: var(--color-emerald-700);\n}\n.bn-source .contributions-grid[data-accent=\"green\"] {\n  --contribution-tier-1: var(--color-green-200);\n  --contribution-tier-2: var(--color-green-400);\n  --contribution-tier-3: var(--color-green-500);\n  --contribution-tier-4: var(--color-green-600);\n  --contribution-tier-5: var(--color-green-700);\n}\n.bn-source .contributions-grid[data-accent=\"teal\"] {\n  --contribution-tier-1: var(--color-teal-200);\n  --contribution-tier-2: var(--color-teal-400);\n  --contribution-tier-3: var(--color-teal-500);\n  --contribution-tier-4: var(--color-teal-600);\n  --contribution-tier-5: var(--color-teal-700);\n}\n.bn-source .contributions-grid[data-accent=\"cyan\"] {\n  --contribution-tier-1: var(--color-cyan-200);\n  --contribution-tier-2: var(--color-cyan-400);\n  --contribution-tier-3: var(--color-cyan-500);\n  --contribution-tier-4: var(--color-cyan-600);\n  --contribution-tier-5: var(--color-cyan-700);\n}\n.bn-source .contributions-grid[data-accent=\"blue\"] {\n  --contribution-tier-1: var(--color-blue-200);\n  --contribution-tier-2: var(--color-blue-400);\n  --contribution-tier-3: var(--color-blue-500);\n  --contribution-tier-4: var(--color-blue-600);\n  --contribution-tier-5: var(--color-blue-700);\n}\n.bn-source .contributions-grid[data-accent=\"indigo\"] {\n  --contribution-tier-1: var(--color-indigo-200);\n  --contribution-tier-2: var(--color-indigo-400);\n  --contribution-tier-3: var(--color-indigo-500);\n  --contribution-tier-4: var(--color-indigo-600);\n  --contribution-tier-5: var(--color-indigo-700);\n}\n.bn-source .contributions-grid[data-accent=\"violet\"] {\n  --contribution-tier-1: var(--color-violet-200);\n  --contribution-tier-2: var(--color-violet-400);\n  --contribution-tier-3: var(--color-violet-500);\n  --contribution-tier-4: var(--color-violet-600);\n  --contribution-tier-5: var(--color-violet-700);\n}\n.bn-source .contributions-grid[data-accent=\"rose\"] {\n  --contribution-tier-1: var(--color-rose-200);\n  --contribution-tier-2: var(--color-rose-400);\n  --contribution-tier-3: var(--color-rose-500);\n  --contribution-tier-4: var(--color-rose-600);\n  --contribution-tier-5: var(--color-rose-700);\n}\n.bn-source .contributions-grid[data-accent=\"amber\"] {\n  --contribution-tier-1: var(--color-amber-200);\n  --contribution-tier-2: var(--color-amber-400);\n  --contribution-tier-3: var(--color-amber-500);\n  --contribution-tier-4: var(--color-amber-600);\n  --contribution-tier-5: var(--color-amber-700);\n}\n.bn-source .dark .contributions-grid[data-accent=\"emerald\"] {\n  --contribution-tier-1: var(--color-emerald-950);\n  --contribution-tier-2: var(--color-emerald-800);\n  --contribution-tier-3: var(--color-emerald-700);\n  --contribution-tier-4: var(--color-emerald-600);\n  --contribution-tier-5: var(--color-emerald-500);\n}\n.bn-source .dark .contributions-grid[data-accent=\"green\"] {\n  --contribution-tier-1: var(--color-green-950);\n  --contribution-tier-2: var(--color-green-800);\n  --contribution-tier-3: var(--color-green-700);\n  --contribution-tier-4: var(--color-green-600);\n  --contribution-tier-5: var(--color-green-500);\n}\n.bn-source .dark .contributions-grid[data-accent=\"teal\"] {\n  --contribution-tier-1: var(--color-teal-950);\n  --contribution-tier-2: var(--color-teal-800);\n  --contribution-tier-3: var(--color-teal-700);\n  --contribution-tier-4: var(--color-teal-600);\n  --contribution-tier-5: var(--color-teal-500);\n}\n.bn-source .dark .contributions-grid[data-accent=\"cyan\"] {\n  --contribution-tier-1: var(--color-cyan-950);\n  --contribution-tier-2: var(--color-cyan-800);\n  --contribution-tier-3: var(--color-cyan-700);\n  --contribution-tier-4: var(--color-cyan-600);\n  --contribution-tier-5: var(--color-cyan-500);\n}\n.bn-source .dark .contributions-grid[data-accent=\"blue\"] {\n  --contribution-tier-1: var(--color-blue-950);\n  --contribution-tier-2: var(--color-blue-800);\n  --contribution-tier-3: var(--color-blue-700);\n  --contribution-tier-4: var(--color-blue-600);\n  --contribution-tier-5: var(--color-blue-500);\n}\n.bn-source .dark .contributions-grid[data-accent=\"indigo\"] {\n  --contribution-tier-1: var(--color-indigo-950);\n  --contribution-tier-2: var(--color-indigo-800);\n  --contribution-tier-3: var(--color-indigo-700);\n  --contribution-tier-4: var(--color-indigo-600);\n  --contribution-tier-5: var(--color-indigo-500);\n}\n.bn-source .dark .contributions-grid[data-accent=\"violet\"] {\n  --contribution-tier-1: var(--color-violet-950);\n  --contribution-tier-2: var(--color-violet-800);\n  --contribution-tier-3: var(--color-violet-700);\n  --contribution-tier-4: var(--color-violet-600);\n  --contribution-tier-5: var(--color-violet-500);\n}\n.bn-source .dark .contributions-grid[data-accent=\"rose\"] {\n  --contribution-tier-1: var(--color-rose-950);\n  --contribution-tier-2: var(--color-rose-800);\n  --contribution-tier-3: var(--color-rose-700);\n  --contribution-tier-4: var(--color-rose-600);\n  --contribution-tier-5: var(--color-rose-500);\n}\n.bn-source .dark .contributions-grid[data-accent=\"amber\"] {\n  --contribution-tier-1: var(--color-amber-950);\n  --contribution-tier-2: var(--color-amber-800);\n  --contribution-tier-3: var(--color-amber-700);\n  --contribution-tier-4: var(--color-amber-600);\n  --contribution-tier-5: var(--color-amber-500);\n}\n.bn-source .contribution-cell[data-tier=\"0\"] {\n  background-color: var(--contribution-tier-0);\n}\n.bn-source .contribution-cell[data-tier=\"1\"] {\n  background-color: var(--contribution-tier-1);\n}\n.bn-source .contribution-cell[data-tier=\"2\"] {\n  background-color: var(--contribution-tier-2);\n}\n.bn-source .contribution-cell[data-tier=\"3\"] {\n  background-color: var(--contribution-tier-3);\n}\n.bn-source .contribution-cell[data-tier=\"4\"] {\n  background-color: var(--contribution-tier-4);\n}\n.bn-source .contribution-cell[data-tier=\"5\"] {\n  background-color: var(--contribution-tier-5);\n}\n@keyframes cell-pop {\n  from {\n    opacity: 0;\n    transform: scale(0.5);\n  }\n  to {\n    opacity: 1;\n    transform: scale(1);\n  }\n}\n.bn-source .animate-cell-pop {\n  animation: cell-pop 380ms ease-out both;\n}\n@keyframes bar-rise {\n  from {\n    transform: scaleY(0);\n  }\n  to {\n    transform: scaleY(1);\n  }\n}\n.bn-source .animate-bar-rise {\n  transform-origin: bottom;\n  animation: bar-rise 360ms cubic-bezier(0.22, 1, 0.36, 1) both;\n}\n@keyframes chart-reveal {\n  from {\n    clip-path: inset(0 100% 0 0);\n  }\n  to {\n    clip-path: inset(0 0 0 0);\n  }\n}\n.bn-source .animate-chart-reveal {\n  animation: chart-reveal 1800ms cubic-bezier(0.33, 0, 0.15, 1) both;\n}\n@media (prefers-reduced-motion: reduce) {\n  .bn-source .animate-cell-pop, .bn-source .animate-bar-rise, .bn-source .animate-chart-reveal {\n    animation: none;\n  }\n}\n.bn-source .bui-table {\n  width: 100%;\n  border-collapse: collapse;\n  text-align: start;\n}\n.bn-source .bui-table th {\n  padding-inline: calc(var(--spacing) * 3);\n  padding-block: calc(var(--spacing) * 2.5);\n  text-align: start;\n  vertical-align: middle;\n  font-size: var(--text-body-medium);\n  line-height: var(--tw-leading, var(--text-body-medium--line-height));\n  letter-spacing: var(--tw-tracking, var(--text-body-medium--letter-spacing));\n  font-weight: var(--tw-font-weight, var(--text-body-medium--font-weight));\n  white-space: nowrap;\n  color: var(--color-text-tertiary);\n  --tw-outline-style: none;\n  outline-style: none;\n  background-color: var(--color-background-secondary-default);\n  border-top: 1px solid var(--color-separator-border);\n  border-bottom: 1px solid var(--color-separator-border);\n  transition: padding 200ms ease, font-size 200ms ease;\n}\n.bn-source .bui-table td {\n  padding-inline: calc(var(--spacing) * 3);\n  padding-block: calc(var(--spacing) * 2.5);\n  vertical-align: middle;\n  font-size: var(--text-body-medium);\n  line-height: var(--tw-leading, var(--text-body-medium--line-height));\n  letter-spacing: var(--tw-tracking, var(--text-body-medium--letter-spacing));\n  font-weight: var(--tw-font-weight, var(--text-body-medium--font-weight));\n  color: var(--color-text-primary);\n  --tw-outline-style: none;\n  outline-style: none;\n  transition: padding 200ms ease, font-size 200ms ease;\n}\n.bn-source .bui-table tbody tr:not(:last-child) {\n  border-bottom: 1px solid var(--color-separator-border);\n}\n.bn-source .bui-table tbody tr {\n  transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;\n  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n  transition-duration: var(--tw-duration, var(--default-transition-duration));\n  --tw-duration: 150ms;\n  transition-duration: 150ms;\n}\n.bn-source .bui-table tbody tr[data-focus-visible] {\n  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n  --tw-ring-color: var(--color-border-focus-ring);\n  --tw-ring-inset: inset;\n}\n.bn-source .bui-table.bui-table-sm th, .bn-source .bui-table.bui-table-sm td {\n  padding-inline: calc(var(--spacing) * 2.5);\n  padding-block: calc(var(--spacing) * 1.5);\n  font-size: var(--text-body-2-medium);\n  line-height: var(--tw-leading, var(--text-body-2-medium--line-height));\n  letter-spacing: var(--tw-tracking, var(--text-body-2-medium--letter-spacing));\n  font-weight: var(--tw-font-weight, var(--text-body-2-medium--font-weight));\n}\n.bn-source .bui-agent-thinking-label {\n  color: transparent;\n  background-image: linear-gradient( 100deg, var(--bui-agent-thinking-tone) 30%, var(--bui-agent-thinking-tone) 50%, var(--bui-agent-thinking-tone) 70% );\n  @supports (color: color-mix(in lab, red, red)) {\n    background-image: linear-gradient( 100deg, color-mix(in oklab, var(--bui-agent-thinking-tone) 55%, transparent) 30%, var(--bui-agent-thinking-tone) 50%, color-mix(in oklab, var(--bui-agent-thinking-tone) 55%, transparent) 70% );\n  }\n  background-position: 200% center;\n  background-size: 300% 100%;\n  background-clip: text;\n  -webkit-background-clip: text;\n  animation: ai-chat-text-shimmer 2.6s linear infinite;\n  will-change: background-position;\n}\n@keyframes bui-agent-thinking-star {\n  0%, 100% {\n    transform: scale(0);\n    opacity: 0;\n  }\n  40% {\n    transform: scale(1);\n    opacity: 1;\n  }\n  60% {\n    transform: scale(0.8);\n    opacity: 0.9;\n  }\n}\n.bn-source .bui-agent-thinking-star {\n  transform: scale(0);\n  animation-name: bui-agent-thinking-star;\n  animation-timing-function: ease-in-out;\n  animation-iteration-count: infinite;\n}\n@keyframes bui-agent-thinking-dash {\n  to {\n    stroke-dashoffset: -100;\n  }\n}\n.bn-source .bui-agent-thinking-comet {\n  animation-name: bui-agent-thinking-dash;\n  animation-timing-function: linear;\n  animation-iteration-count: infinite;\n}\n@media (prefers-reduced-motion: reduce) {\n  .bn-source .bui-agent-thinking-label {\n    color: var(--bui-agent-thinking-tone);\n    background-image: none;\n    animation: none;\n  }\n  .bn-source .bui-agent-thinking-star {\n    animation: none;\n    transform: none;\n    opacity: 0.7;\n  }\n  .bn-source .bui-agent-thinking-comet {\n    animation: none;\n  }\n}\n.bn-source .bui-agent-thinking-stars {\n  color: currentColor;\n  @supports (color: color-mix(in lab, red, red)) {\n    color: color-mix(in oklab, currentColor 75%, transparent);\n  }\n}\n.bn-source .dark .bui-agent-thinking-stars {\n  color: inherit;\n}\n@keyframes bui-composer-loader-dash {\n  from {\n    stroke-dashoffset: 0;\n  }\n  to {\n    stroke-dashoffset: -100;\n  }\n}\n@media (prefers-reduced-motion: reduce) {\n  .bn-source .bui-composer-loader-rect {\n    animation: none !important;\n  }\n}\n@keyframes bui-composer-mic-bars {\n  0%, 100% {\n    transform: scaleY(0.4);\n  }\n  50% {\n    transform: scaleY(1);\n  }\n}\n.bn-source .bui-composer-mic-bar {\n  animation: bui-composer-mic-bars 0.9s ease-in-out infinite;\n}\n@media (prefers-reduced-motion: reduce) {\n  .bn-source .bui-composer-mic-bar {\n    animation: none;\n    transform: scaleY(0.7);\n  }\n}\n@keyframes bui-badge-shimmer {\n  0% {\n    transform: translateX(0) skewX(-12deg);\n  }\n  40%, 100% {\n    transform: translateX(350%) skewX(-12deg);\n  }\n}\n.bn-source .bui-badge-shimmer {\n  animation: bui-badge-shimmer 2.5s ease-in-out infinite;\n}\n@media (prefers-reduced-motion: reduce) {\n  .bn-source .bui-badge-shimmer {\n    animation: none;\n    opacity: 0;\n  }\n}\n.bn-source .landing-showcase-card {\n  transition: box-shadow 280ms ease;\n}\n.bn-source .landing-showcase-card::after {\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  z-index: 60;\n  pointer-events: none;\n  border: 1px solid var(--color-border-button-default);\n  border-radius: inherit;\n  transition: border-color 280ms ease, box-shadow 280ms ease;\n}\n.bn-source .dark .landing-showcase-card::after {\n  border-color: rgb(255 255 255 / 0.08);\n}\n@media (min-width: 640px) and (hover: hover) {\n  .bn-source .landing-showcase-card:hover::after, .bn-source .landing-showcase-card:focus-within::after {\n    border-color: var(--color-border-button-hover);\n    box-shadow: inset 0 0 0 2px var(--color-border-button-hover);\n  }\n}\n@media (max-width:639px) {\n  .bn-source .bn-settings-profile .bn-settings-row {\n    flex-direction: column;\n    align-items: stretch;\n    gap: 8px;\n  }\n  .bn-source .bn-settings-profile .bn-settings-row>* {\n    max-width: 100%;\n  }\n  .bn-source .bn-settings-profile .bn-settings-row>button,.bn-source .bn-settings-profile .bn-settings-row>div[data-rac] {\n    width: 100%;\n  }\n  .bn-source .bn-settings-profile .bn-settings-row>label {\n    align-self: flex-start;\n  }\n}\n.bn-source [data-input-otp] {\n  max-width: 100%;\n}\n.bn-source [data-input-otp] > div {\n  min-width: 0;\n}\n.bn-source [data-input-otp] input {\n  max-width: 100%;\n}\n@media (max-width:639px) {\n  .bn-source [data-notification-center] [aria-label=\"Notification category\"]>button {\n    min-width: 0;\n    padding-inline: 3px;\n    font-size: 12px;\n  }\n  .bn-source [data-notification-center] [aria-label=\"Notification category\"]>button>span {\n    gap: 4px;\n  }\n  .bn-source [data-notification-center] [aria-label=\"Notification category\"]>button>span>span {\n    min-width: 16px;\n    font-size: 10px;\n  }\n}\n@property --tw-translate-x {\n  syntax: \"*\";\n  inherits: false;\n  initial-value: 0;\n}\n@property --tw-translate-y {\n  syntax: \"*\";\n  inherits: false;\n  initial-value: 0;\n}\n@property --tw-translate-z {\n  syntax: \"*\";\n  inherits: false;\n  initial-value: 0;\n}\n@property --tw-scale-x {\n  syntax: \"*\";\n  inherits: false;\n  initial-value: 1;\n}\n@property --tw-scale-y {\n  syntax: \"*\";\n  inherits: false;\n  initial-value: 1;\n}\n@property --tw-scale-z {\n  syntax: \"*\";\n  inherits: false;\n  initial-value: 1;\n}\n@property --tw-rotate-x {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-rotate-y {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-rotate-z {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-skew-x {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-skew-y {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-scroll-snap-strictness {\n  syntax: \"*\";\n  inherits: false;\n  initial-value: proximity;\n}\n@property --tw-divide-x-reverse {\n  syntax: \"*\";\n  inherits: false;\n  initial-value: 0;\n}\n@property --tw-border-style {\n  syntax: \"*\";\n  inherits: false;\n  initial-value: solid;\n}\n@property --tw-gradient-position {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-gradient-from {\n  syntax: \"<color>\";\n  inherits: false;\n  initial-value: #0000;\n}\n@property --tw-gradient-via {\n  syntax: \"<color>\";\n  inherits: false;\n  initial-value: #0000;\n}\n@property --tw-gradient-to {\n  syntax: \"<color>\";\n  inherits: false;\n  initial-value: #0000;\n}\n@property --tw-gradient-stops {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-gradient-via-stops {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-gradient-from-position {\n  syntax: \"<length-percentage>\";\n  inherits: false;\n  initial-value: 0%;\n}\n@property --tw-gradient-via-position {\n  syntax: \"<length-percentage>\";\n  inherits: false;\n  initial-value: 50%;\n}\n@property --tw-gradient-to-position {\n  syntax: \"<length-percentage>\";\n  inherits: false;\n  initial-value: 100%;\n}\n@property --tw-leading {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-font-weight {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-tracking {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-ordinal {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-slashed-zero {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-numeric-figure {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-numeric-spacing {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-numeric-fraction {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-shadow {\n  syntax: \"*\";\n  inherits: false;\n  initial-value: 0 0 #0000;\n}\n@property --tw-shadow-color {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-shadow-alpha {\n  syntax: \"<percentage>\";\n  inherits: false;\n  initial-value: 100%;\n}\n@property --tw-inset-shadow {\n  syntax: \"*\";\n  inherits: false;\n  initial-value: 0 0 #0000;\n}\n@property --tw-inset-shadow-color {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-inset-shadow-alpha {\n  syntax: \"<percentage>\";\n  inherits: false;\n  initial-value: 100%;\n}\n@property --tw-ring-color {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-ring-shadow {\n  syntax: \"*\";\n  inherits: false;\n  initial-value: 0 0 #0000;\n}\n@property --tw-inset-ring-color {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-inset-ring-shadow {\n  syntax: \"*\";\n  inherits: false;\n  initial-value: 0 0 #0000;\n}\n@property --tw-ring-inset {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-ring-offset-width {\n  syntax: \"<length>\";\n  inherits: false;\n  initial-value: 0px;\n}\n@property --tw-ring-offset-color {\n  syntax: \"*\";\n  inherits: false;\n  initial-value: #fff;\n}\n@property --tw-ring-offset-shadow {\n  syntax: \"*\";\n  inherits: false;\n  initial-value: 0 0 #0000;\n}\n@property --tw-outline-style {\n  syntax: \"*\";\n  inherits: false;\n  initial-value: solid;\n}\n@property --tw-blur {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-brightness {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-contrast {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-grayscale {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-hue-rotate {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-invert {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-opacity {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-saturate {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-sepia {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-drop-shadow {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-drop-shadow-color {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-drop-shadow-alpha {\n  syntax: \"<percentage>\";\n  inherits: false;\n  initial-value: 100%;\n}\n@property --tw-drop-shadow-size {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-backdrop-blur {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-backdrop-brightness {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-backdrop-contrast {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-backdrop-grayscale {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-backdrop-hue-rotate {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-backdrop-invert {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-backdrop-opacity {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-backdrop-saturate {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-backdrop-sepia {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-duration {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-ease {\n  syntax: \"*\";\n  inherits: false;\n}\n@property --tw-content {\n  syntax: \"*\";\n  initial-value: \"\";\n  inherits: false;\n}\n@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {\n    .bn-source *, .bn-source ::before, .bn-source ::after, .bn-source ::backdrop {\n      --tw-translate-x: 0;\n      --tw-translate-y: 0;\n      --tw-translate-z: 0;\n      --tw-scale-x: 1;\n      --tw-scale-y: 1;\n      --tw-scale-z: 1;\n      --tw-rotate-x: initial;\n      --tw-rotate-y: initial;\n      --tw-rotate-z: initial;\n      --tw-skew-x: initial;\n      --tw-skew-y: initial;\n      --tw-scroll-snap-strictness: proximity;\n      --tw-divide-x-reverse: 0;\n      --tw-border-style: solid;\n      --tw-gradient-position: initial;\n      --tw-gradient-from: #0000;\n      --tw-gradient-via: #0000;\n      --tw-gradient-to: #0000;\n      --tw-gradient-stops: initial;\n      --tw-gradient-via-stops: initial;\n      --tw-gradient-from-position: 0%;\n      --tw-gradient-via-position: 50%;\n      --tw-gradient-to-position: 100%;\n      --tw-leading: initial;\n      --tw-font-weight: initial;\n      --tw-tracking: initial;\n      --tw-ordinal: initial;\n      --tw-slashed-zero: initial;\n      --tw-numeric-figure: initial;\n      --tw-numeric-spacing: initial;\n      --tw-numeric-fraction: initial;\n      --tw-shadow: 0 0 #0000;\n      --tw-shadow-color: initial;\n      --tw-shadow-alpha: 100%;\n      --tw-inset-shadow: 0 0 #0000;\n      --tw-inset-shadow-color: initial;\n      --tw-inset-shadow-alpha: 100%;\n      --tw-ring-color: initial;\n      --tw-ring-shadow: 0 0 #0000;\n      --tw-inset-ring-color: initial;\n      --tw-inset-ring-shadow: 0 0 #0000;\n      --tw-ring-inset: initial;\n      --tw-ring-offset-width: 0px;\n      --tw-ring-offset-color: #fff;\n      --tw-ring-offset-shadow: 0 0 #0000;\n      --tw-outline-style: solid;\n      --tw-blur: initial;\n      --tw-brightness: initial;\n      --tw-contrast: initial;\n      --tw-grayscale: initial;\n      --tw-hue-rotate: initial;\n      --tw-invert: initial;\n      --tw-opacity: initial;\n      --tw-saturate: initial;\n      --tw-sepia: initial;\n      --tw-drop-shadow: initial;\n      --tw-drop-shadow-color: initial;\n      --tw-drop-shadow-alpha: 100%;\n      --tw-drop-shadow-size: initial;\n      --tw-backdrop-blur: initial;\n      --tw-backdrop-brightness: initial;\n      --tw-backdrop-contrast: initial;\n      --tw-backdrop-grayscale: initial;\n      --tw-backdrop-hue-rotate: initial;\n      --tw-backdrop-invert: initial;\n      --tw-backdrop-opacity: initial;\n      --tw-backdrop-saturate: initial;\n      --tw-backdrop-sepia: initial;\n      --tw-duration: initial;\n      --tw-ease: initial;\n      --tw-content: \"\";\n    }\n  }\n\n.bn-source{font-family:Inter,ui-sans-serif,system-ui,sans-serif;font-size:14px;line-height:20px;color:var(--color-text-primary);color-scheme:light}.dark .bn-source,.bn-source.dark{color-scheme:dark}.bn-source[hidden]{display:none!important}\n",
  "src/board-native/LICENSE": "MIT License\n\nCopyright (c) 2026 Mertcan Dundar Esmergul (BoardUI)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n",
  "src/board-native/NativeAnchor.tsx": "import {forwardRef,type AnchorHTMLAttributes}from'react';\n/** Framework-neutral anchor keeps source breadcrumb href and keyboard semantics. */\nexport const NativeAnchor=forwardRef<HTMLAnchorElement,AnchorHTMLAttributes<HTMLAnchorElement>>(function NativeAnchor(props,ref){return <a {...props} ref={ref}/>});\n",
  "src/board-native/NativeEnvironment.tsx": "'use client';\nimport{createContext,useContext,useState,useEffect,type Dispatch,type SetStateAction,type ReactNode}from'react';\nexport type NativeAction={label:string;description?:string};\nconst Environment=createContext<{portalContainer:()=>HTMLElement|null;onAction:(action:NativeAction)=>void}|null>(null);\nconst StateStore=createContext<Map<string,unknown>|null>(null);\nexport function NativeEnvironmentProvider({portalContainer,onAction,children}:{portalContainer:()=>HTMLElement|null;onAction:(action:NativeAction)=>void;children:ReactNode}){return <Environment.Provider value={{portalContainer,onAction}}>{children}</Environment.Provider>}\nexport function useNativeEnvironment(){return useContext(Environment)}\nexport function useNativeAction(){return useNativeEnvironment()?.onAction??(()=>{})}\nexport function NativeStateProvider({store,children}:{store:Map<string,unknown>;children:ReactNode}){return <StateStore.Provider value={store}>{children}</StateStore.Provider>}\n/** Per-component local draft storage; a mounted owner keeps values through page/modal remounts. */\nexport function useNativeLocalState<T>(key:string,initial:T|(()=>T)):[T,Dispatch<SetStateAction<T>>]{const store=useContext(StateStore);const[value,setValue]=useState<T>(()=>store?.has(key)?store.get(key)as T:typeof initial==='function'?(initial as()=>T)():initial);useEffect(()=>{store?.set(key,value)},[store,key,value]);return[value,setValue]}\n",
  "src/board-native/NativeImage.tsx": "import type{CSSProperties,ImgHTMLAttributes}from'react';\nexport type NativeImageProps=ImgHTMLAttributes<HTMLImageElement>&{fill?:boolean;priority?:boolean;unoptimized?:boolean;quality?:number};\n/** Standard image preserves the public source's fill geometry without a Next-only runtime dependency. */\nexport function NativeImage({fill,priority,unoptimized,quality,style,...props}:NativeImageProps){return <img {...props}loading={priority?'eager':props.loading??'lazy'}decoding=\"async\"style={{...(fill?{position:'absolute',inset:0,width:'100%',height:'100%'}as CSSProperties:{}),...style}}/>}\n",
  "src/board-native/NativeLocalDialog.tsx": "'use client';\nimport{Modal,ModalOverlay,Dialog,Heading}from'react-aria-components';\nimport type{ReactNode}from'react';import{Button}from'./components/base/buttons/button.js';\nexport function NativeLocalDialog({open,onOpenChange,title,children}:{open:boolean;onOpenChange:(open:boolean)=>void;title:string;children:ReactNode}){return <ModalOverlay isOpen={open}onOpenChange={onOpenChange}isDismissable className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/30 p-4 backdrop-blur-sm\"><Modal className=\"w-full max-w-md rounded-3xl border border-border-button-default bg-background-primary-default p-6 shadow-dropdown\"><Dialog className=\"flex flex-col gap-4 outline-none\"><Heading slot=\"title\"className=\"text-title-3-medium text-text-primary\">{title}</Heading><div className=\"text-body-regular text-text-secondary\">{children}</div><Button onClick={()=>onOpenChange(false)}>Close</Button></Dialog></Modal></ModalOverlay>}\n",
  "src/board-native/NativeScope.tsx": "'use client';\nimport {useRef,useState,type ReactNode}from'react';\nimport{NativeEnvironmentProvider,type NativeAction}from'./NativeEnvironment.js';\nimport{NativeLocalDialog}from'./NativeLocalDialog.js';\nimport {UNSAFE_PortalProvider}from'react-aria';\nimport{MotionConfig}from'motion/react';\nimport {TemplateCopyProvider}from'./components/foundations/template-copy/template-copy.js';\nexport type NativeScopeProps={children:ReactNode;className?:string;translate?:(text:string)=>string;onAction?:(action:NativeAction)=>void};\nconst heliosCopy=(text:string)=>text.replaceAll('BoardUI','Helios UI').replaceAll('Board UI','Helios UI').replaceAll('Board team','Helios team').replaceAll('boardui','helios-ui').replace(/\\$([\\d,.]+)/g,(_,value)=>'₹'+Number(value.replaceAll(',','')).toLocaleString('en-IN',{maximumFractionDigits:2}));\n/** Source-native styles and portals share a boundary; copy remains editable local fixture data. */\nexport function NativeScope({children,className='',translate=heliosCopy,onAction}:NativeScopeProps){const host=useRef<HTMLDivElement>(null),[action,setAction]=useState<NativeAction|null>(null);const report=(value:NativeAction)=>{if(onAction)onAction(value);else setAction(value)};return <div className={'bn-source '+className}style={{display:'contents'}}><MotionConfig reducedMotion=\"user\"><TemplateCopyProvider translate={translate}><NativeEnvironmentProvider portalContainer={()=>host.current}onAction={report}><UNSAFE_PortalProvider getContainer={()=>host.current}>{children}<div ref={host}style={{display:'contents'}}/><NativeLocalDialog open={!!action}onOpenChange={()=>setAction(null)}title={action?.label??'Local example'}>{action?.description??'This action is a local preview. No external account was connected, no message was sent, and checkout remains closed.'}</NativeLocalDialog></UNSAFE_PortalProvider></NativeEnvironmentProvider></TemplateCopyProvider></MotionConfig></div>}\n",
  "src/board-native/catalog-previews.tsx": "\"use client\";\n/* Adapted from BoardUI MIT source; original license in this directory. */\nimport {useTemplateCopy} from \"./components/foundations/template-copy/template-copy.js\";\nimport {useEffect,useRef,useState} from \"react\";\nimport {RiAddLine,RiArrowRightSLine,RiCheckboxCircleFill,RiDeleteBinLine,RiFileTextLine,RiFolder3Line,RiHome5Line,RiMailLine,RiSearchLine,RiSettings3Line,RiUserLine} from \"@remixicon/react\";\nimport {DataTablePreview,DropdownPreview,FileUploadPreview,MeetingSchedulePreview,SidebarPreview} from \"./landing-previews.js\";\nimport {SettingsGeneral} from \"./components/application/settings/settings-general.js\";\nimport {StatCards} from \"./components/application/dashboard/stat-cards.js\";\nimport {Announcement} from \"./components/base/announcement/announcement.js\";\nimport {Avatar} from \"./components/base/avatar/avatar.js\";\nimport {Chip} from \"./components/base/badges/chip.js\";\nimport {Breadcrumb,BreadcrumbItem} from \"./components/base/breadcrumb/breadcrumb.js\";\nimport {Button} from \"./components/base/buttons/button.js\";\nimport {ButtonGroup,ButtonGroupItem} from \"./components/base/buttons/button-group.js\";\nimport {CloseButton} from \"./components/base/buttons/close-button.js\";\nimport {IconButton} from \"./components/base/buttons/icon-button.js\";\nimport {LinkButton} from \"./components/base/buttons/link-button.js\";\nimport {Carousel,CarouselItem} from \"./components/base/carousel/carousel.js\";\nimport {Checkbox} from \"./components/base/checkbox/checkbox.js\";\nimport {Divider} from \"./components/base/divider/divider.js\";\nimport {Notification} from \"./components/base/notification/notification.js\";\nimport {Table,TableBody,TableCell,TableColumn,TableHeader,TableRow} from \"./components/base/table/table.js\";\nimport {Tab,TabList,Tabs} from \"./components/base/tabs/tabs.js\";\nimport {Input} from \"./components/base/input/input.js\";\nimport {InputOtp} from \"./components/base/input-otp/input-otp.js\";\nimport {Pagination} from \"./components/base/pagination/pagination.js\";\nimport {Radio,RadioGroup} from \"./components/base/radio/radio.js\";\nimport {SegmentedControl,SegmentedControlItem} from \"./components/base/segmented-control/segmented-control.js\";\nimport {Select,SelectItem} from \"./components/base/select/select.js\";\nimport {Slider} from \"./components/base/slider/slider.js\";\nimport {SocialButton} from \"./components/base/social-button/social-button.js\";\nimport {Switch} from \"./components/base/switch/switch.js\";\nimport {Textarea} from \"./components/base/textarea/textarea.js\";\nimport {TreeViewPreview} from \"./components/application/docs/tree-view-preview.js\";\nimport {DataGridExample} from \"./components/application/docs/examples/data-grid-example.js\";\nimport {TOOLTIP_CARETS} from \"./components/base/tooltip/tooltip.js\";\nimport {cx} from \"./utils/cx.js\";\nfunction Center({\n  children,\n  className,\n}: {\n  children: React.ReactNode;\n  className?: string;\n}) {\n  const localize = useTemplateCopy();\n  return localize((\n    <div className={`absolute inset-0 flex items-center justify-center p-5 ${className ?? \"\"}`}>\n      {children}\n    </div>\n  ));\n}\n\nfunction useMeasuredScale(compute: (available: number, sm: boolean) => number) {\n  const ref = useRef<HTMLDivElement>(null);\n  const computeRef = useRef(compute);\n  const [scale, setScale] = useState<number | null>(null);\n\n  // Kept fresh in an effect rather than during render, which the lint rule\n  // rightly flags; the observer only ever fires after mount anyway.\n  useEffect(() => {\n    computeRef.current = compute;\n  });\n\n  useEffect(() => {\n    const el = ref.current;\n    if (!el) return;\n    const media = window.matchMedia(\"(min-width: 640px)\");\n    const measure = () => {\n      const available = el.clientWidth;\n      if (available > 0) setScale(computeRef.current(available, media.matches));\n    };\n    const observer = new ResizeObserver(measure);\n    observer.observe(el);\n    media.addEventListener(\"change\", measure);\n    measure();\n    return () => {\n      observer.disconnect();\n      media.removeEventListener(\"change\", measure);\n    };\n  }, []);\n\n  return { ref, scale };\n}\n\nconst SCALED_FIT: Record<number, string> = {\n  330: \"[--sc-fit:min(calc((100cqw_-_16px)*0.92),330px)] sm:[--sc-fit:min(calc((100cqw_-_16px)*1),330px)]\",\n  404: \"[--sc-fit:min(calc((100cqw_-_16px)*0.92),404px)] sm:[--sc-fit:min(calc((100cqw_-_16px)*1),404px)]\",\n  560: \"[--sc-fit:min(calc((100cqw_-_16px)*0.92),560px)] sm:[--sc-fit:min(calc((100cqw_-_16px)*1),560px)]\",\n  648: \"[--sc-fit:min(calc((100cqw_-_16px)*0.92),648px)] sm:[--sc-fit:min(calc((100cqw_-_16px)*1),648px)]\",\n  960: \"[--sc-fit:min(calc((100cqw_-_16px)*0.92),960px)] sm:[--sc-fit:min(calc((100cqw_-_16px)*1),960px)]\",\n};\n\nconst SCALED_FIT_INSET: Record<number, string> = {\n  330: \"[--sc-fit:min(calc((100cqw_-_16px)*0.92),330px)] sm:[--sc-fit:min(calc(100cqw_-_32px),330px)]\",\n};\n\nexport function Scaled({\n  width,\n  insetRight = false,\n  children,\n}: {\n  width: number;\n  insetRight?: boolean;\n  children: React.ReactNode;\n}) {\n  const localize = useTemplateCopy();\n  // The wrapper's own clientWidth already accounts for the insets — its\n  // `start-4` / `sm:end-4` classes are what the CSS expressions subtracted.\n  // Mobile leaves a end inset equal to the wrapper's 16px start one, so the\n  // two gaps match instead of the ~8% remainder all falling on the end.\n  // `sm:` and up keeps the full-width bleed the desktop cards were tuned to.\n  const { ref, scale } = useMeasuredScale((available, sm) =>\n    Math.min(sm ? available : Math.max(available - 16, 1), width) / width,\n  );\n\n  return localize((\n    <div\n      ref={ref}\n      className={`absolute inset-y-0 top-4 start-4 overflow-hidden ${\n        insetRight ? \"end-0 sm:end-4\" : \"end-0\"\n      }`}\n    >\n      {/* The calc casts the length ratio to the number `scale()` demands;\n          the measured value replaces it after mount (see useMeasuredScale). */}\n      <div\n        className={`origin-top-left rtl:origin-top-right ${(insetRight ? SCALED_FIT_INSET[width] : SCALED_FIT[width]) ?? \"\"}`}\n        style={{\n          width,\n          transform:\n            scale === null\n              ? `scale(calc(tan(atan2(var(--sc-fit), ${width}px))))`\n              : `scale(${scale})`,\n        }}\n      >\n        {children}\n      </div>\n    </div>\n  ));\n}\n\nfunction InlineScaled({\n  width,\n  factor,\n  fullBleed = false,\n  children,\n}: {\n  width: number;\n  factor: number;\n  fullBleed?: boolean;\n  children: React.ReactNode;\n}) {\n  const localize = useTemplateCopy();\n  // Same equal-inset rule for the hand-scaled previews. The preview's own\n  // trim (`factor`) is a desktop tuning: on a phone it was the leftover on\n  // the end, so below `sm` the content fills to the matching inset.\n  const { ref, scale } = useMeasuredScale(\n    (available, sm) =>\n      (Math.max(fullBleed ? available : available - 16, 1) * (sm ? factor : 1)) / width,\n  );\n\n  return localize((\n    <div\n      ref={ref}\n      className={\n        fullBleed\n          ? \"absolute inset-0 overflow-hidden\"\n          : \"absolute inset-y-0 top-4 end-0 start-4 overflow-hidden\"\n      }\n    >\n      <div\n        className=\"origin-top-left rtl:origin-top-right\"\n        style={{\n          width,\n          transform:\n            scale === null\n              ? `scale(calc(tan(atan2((100cqw${fullBleed ? \"\" : \" - 16px\"}) * ${factor}, ${width}px))))`\n              : `scale(${scale})`,\n        }}\n      >\n        {children}\n      </div>\n    </div>\n  ));\n}\n\nfunction useCardHover() {\n  const ref = useRef<HTMLDivElement>(null);\n  const [hovered, setHovered] = useState(false);\n\n  useEffect(() => {\n    const card = ref.current?.closest(\"article\");\n    if (!card) return;\n    const enter = () => setHovered(true);\n    const leave = () => setHovered(false);\n    card.addEventListener(\"mouseenter\", enter);\n    card.addEventListener(\"mouseleave\", leave);\n    return () => {\n      card.removeEventListener(\"mouseenter\", enter);\n      card.removeEventListener(\"mouseleave\", leave);\n    };\n  }, []);\n\n  return { ref, hovered };\n}\n\nfunction CheckboxPreview() {\n  const localize = useTemplateCopy();\n  return localize((\n    <Center>\n      <div className=\"flex flex-col gap-3\">\n        <Checkbox defaultSelected>Selected</Checkbox>\n        <Checkbox>Unselected</Checkbox>\n        <Checkbox isIndeterminate>Indeterminate</Checkbox>\n      </div>\n    </Center>\n  ));\n}\n\nfunction RadioPreview() {\n  const localize = useTemplateCopy();\n  const { ref, hovered } = useCardHover();\n  const [value, setValue] = useState(\"weekly\");\n\n  useEffect(() => {\n    if (!hovered) return;\n    const order = [\"weekly\", \"monthly\", \"yearly\"];\n    let i = 0;\n    const id = window.setInterval(() => {\n      i = (i + 1) % order.length;\n      setValue(order[i]);\n    }, 900);\n    return () => {\n      window.clearInterval(id);\n      setValue(\"weekly\");\n    };\n  }, [hovered]);\n\n  return localize((\n    <Center>\n      <RadioGroup\n        ref={ref}\n        value={value}\n        onChange={setValue}\n        aria-label=\"Frequency\"\n        className=\"flex flex-col gap-3\"\n      >\n        <Radio value=\"weekly\">Weekly</Radio>\n        <Radio value=\"monthly\">Monthly</Radio>\n        <Radio value=\"yearly\">Yearly</Radio>\n      </RadioGroup>\n    </Center>\n  ));\n}\n\nfunction SwitchPreview() {\n  const localize = useTemplateCopy();\n  const { ref, hovered } = useCardHover();\n  const [on, setOn] = useState([true, false]);\n\n  useEffect(() => {\n    if (!hovered) return;\n    let turn = 0;\n    const id = window.setInterval(() => {\n      const idx = turn % 2;\n      setOn((prev) => prev.map((v, i) => (i === idx ? !v : v)));\n      turn += 1;\n    }, 700);\n    return () => {\n      window.clearInterval(id);\n      setOn([true, false]);\n    };\n  }, [hovered]);\n\n  return localize((\n    <Center>\n      <div ref={ref} className=\"flex flex-col items-start gap-4\">\n        <Switch isSelected={on[0]} onChange={(v) => setOn((p) => [v, p[1]])} aria-label=\"First\" />\n        <Switch isSelected={on[1]} onChange={(v) => setOn((p) => [p[0], v])} aria-label=\"Second\" />\n      </div>\n    </Center>\n  ));\n}\n\nfunction SliderPreview() {\n  const localize = useTemplateCopy();\n  const { ref, hovered } = useCardHover();\n  const [value, setValue] = useState(62);\n\n  useEffect(() => {\n    if (!hovered) return;\n    const frames = [\n      { t: 0, v: 62 },\n      { t: 600, v: 79 },\n      { t: 1500, v: 31 },\n      { t: 2250, v: 62 },\n    ];\n    const ease = (x: number) => (x < 0.5 ? 2 * x * x : 1 - (-2 * x + 2) ** 2 / 2);\n    const start = performance.now();\n    let raf = 0;\n    const tick = (now: number) => {\n      const t = now - start;\n      const i = frames.findIndex((f) => f.t > t);\n      if (i === -1) {\n        setValue(62);\n        return;\n      }\n      const a = frames[i - 1];\n      const b = frames[i];\n      setValue(Math.round(a.v + (b.v - a.v) * ease((t - a.t) / (b.t - a.t))));\n      raf = requestAnimationFrame(tick);\n    };\n    raf = requestAnimationFrame(tick);\n    return () => cancelAnimationFrame(raf);\n  }, [hovered]);\n\n  return localize((\n    <Center>\n      <div ref={ref} className=\"w-full max-w-[220px]\">\n        <Slider value={value} onChange={(v) => setValue(v as number)} thumbLabel=\"Value\" />\n      </div>\n    </Center>\n  ));\n}\n\nfunction CarouselPreviewCard() {\n  const localize = useTemplateCopy();\n  const { ref, hovered } = useCardHover();\n\n  useEffect(() => {\n    if (!hovered) return;\n    const track = ref.current?.querySelector<HTMLElement>(\".overflow-x-auto\");\n    if (!track) return;\n    const step = () => {\n      const kids = Array.from(track.children) as HTMLElement[];\n      if (kids.length < 2) return;\n      const stride = kids[1].offsetLeft - kids[0].offsetLeft;\n      const next = (Math.round(track.scrollLeft / stride) + 1) % kids.length;\n      track.scrollTo({\n        left: kids[next].offsetLeft - kids[0].offsetLeft,\n        behavior: \"smooth\",\n      });\n    };\n    const first = window.setTimeout(step, 400);\n    const rest = window.setInterval(step, 1500);\n    return () => {\n      window.clearTimeout(first);\n      window.clearInterval(rest);\n    };\n  }, [hovered, ref]);\n\n  return localize((\n    <Center>\n      <div ref={ref} className=\"w-full max-w-[240px]\">\n        <Carousel aria-label=\"Preview\" showArrows={false}>\n          {[\"kitchen\", \"space-squid\", \"sunrise\"].map((name) => (\n            <CarouselItem key={name}>\n              {/* eslint-disable-next-line @next/next/no-img-element */}\n              <img\n                src={`/react/assets/board-native/carousel/${name}.webp`}\n                alt=\"\"\n                className=\"h-[110px] w-full rounded-2lg object-cover\"\n              />\n            </CarouselItem>\n          ))}\n        </Carousel>\n      </div>\n    </Center>\n  ));\n}\n\nfunction InputOtpPreviewCard() {\n  const localize = useTemplateCopy();\n  const { ref, hovered } = useCardHover();\n  const [value, setValue] = useState(\"204915\");\n  const [verified, setVerified] = useState(false);\n\n  useEffect(() => {\n    if (!hovered) return;\n    const CODE = \"731428\";\n    const timers: number[] = [];\n    let delay = 400;\n    for (let remaining = 5; remaining >= 0; remaining--) {\n      const next = \"204915\".slice(0, remaining);\n      timers.push(window.setTimeout(() => setValue(next), delay));\n      delay += 160;\n    }\n    delay += 300;\n    for (let typed = 1; typed <= CODE.length; typed++) {\n      const next = CODE.slice(0, typed);\n      timers.push(window.setTimeout(() => setValue(next), delay));\n      delay += 240;\n    }\n    delay += 400;\n    timers.push(window.setTimeout(() => setVerified(true), delay));\n    // Cleanup doubles as the reset: leaving the card puts the original code\n    // back so the next hover replays the whole pass.\n    return () => {\n      timers.forEach((t) => window.clearTimeout(t));\n      setValue(\"204915\");\n      setVerified(false);\n    };\n  }, [hovered]);\n\n  // The box the demo is \"in\": deletion clears down to this index, typing fills\n  // it next. The component's real active state is `:focus-visible`, which a\n  // scripted demo can't hold without stealing the page's focus, so the ring is\n  // drawn as an overlay that slides between boxes instead — same classes as\n  // the input's own focus ring, minus the focus.\n  const activeIndex = Math.min(value.length, 5);\n\n  return localize((\n    <Center>\n      <div ref={ref} className=\"relative scale-[0.82]\">\n        <InputOtp value={value} onChange={setValue} aria-label=\"Verification code\" />\n        <div\n          aria-hidden\n          className={`pointer-events-none absolute top-0 size-12 rounded-2lg border border-border-focus-ring ring-2 ring-border-focus-ring transition-[start,opacity] duration-200 ease ${hovered && !verified ? \"opacity-100\" : \"opacity-0\"}`}\n          style={{ left: activeIndex * 56 }}\n        />\n      </div>\n      <div\n        aria-hidden\n        className={`absolute inset-x-0 bottom-4 flex items-center justify-center gap-1 text-caption-1-medium text-notification-success-foreground transition-opacity duration-300 ${verified ? \"opacity-100\" : \"opacity-0\"}`}\n      >\n        <RiCheckboxCircleFill className=\"size-4\" />\n        Code verified\n      </div>\n    </Center>\n  ));\n}\n\nconst TOOLTIP_TAIL_POSITION = {\n  top: \"top-full left-1/2 -translate-x-1/2\",\n  bottom: \"bottom-full left-1/2 -translate-x-1/2\",\n  left: \"start-full top-1/2 -translate-y-1/2\",\n  right: \"end-full top-1/2 -translate-y-1/2\",\n} as const;\n\nfunction TooltipBubble({\n  placement,\n  children,\n}: {\n  placement: keyof typeof TOOLTIP_TAIL_POSITION;\n  children: React.ReactNode;\n}) {\n  const localize = useTemplateCopy();\n  const caret = TOOLTIP_CARETS[placement];\n  return localize((\n    <div className=\"relative w-fit rounded-lg border border-border-button-default bg-background-primary-default px-2.5 py-1.5 text-caption-1-medium text-text-primary shadow-dropdown\">\n      {children}\n      <svg\n        aria-hidden\n        width={caret.width}\n        height={caret.height}\n        viewBox={`0 0 ${caret.width} ${caret.height}`}\n        className={cx(\n          \"absolute block overflow-visible fill-background-primary-default stroke-border-button-default\",\n          TOOLTIP_TAIL_POSITION[placement],\n        )}\n        style={{ filter: `drop-shadow(${caret.shadow} rgb(0 0 0 / 0.05))` }}\n      >\n        <path d={caret.path} />\n      </svg>\n    </div>\n  ));\n}\n\nfunction TooltipPreviewCard() {\n  const localize = useTemplateCopy();\n  return localize((\n    <Center>\n      <div className=\"grid grid-cols-2 place-items-center gap-x-5 gap-y-6\">\n        <TooltipBubble placement=\"top\">Top</TooltipBubble>\n        <TooltipBubble placement=\"bottom\">Bottom</TooltipBubble>\n        <TooltipBubble placement=\"left\">Left</TooltipBubble>\n        <TooltipBubble placement=\"right\">Right</TooltipBubble>\n      </div>\n    </Center>\n  ));\n}\n\nfunction InputPreviewCard() {\n  const localize = useTemplateCopy();\n  const { ref, hovered } = useCardHover();\n  const [email, setEmail] = useState(\"\");\n  const [query, setQuery] = useState(\"\");\n  const [active, setActive] = useState<\"none\" | \"email\" | \"query\">(\"none\");\n\n  useEffect(() => {\n    if (!hovered) return;\n    const EMAIL = \"hello@boardui.com\";\n    const QUERY = \"data table\";\n    const timers: number[] = [];\n    let delay = 350;\n\n    timers.push(window.setTimeout(() => setActive(\"email\"), delay));\n    delay += 220;\n    for (let i = 1; i <= EMAIL.length; i++) {\n      const next = EMAIL.slice(0, i);\n      timers.push(window.setTimeout(() => setEmail(next), delay));\n      delay += 55;\n    }\n\n    // Beat between the two fields, so the hand-off is legible.\n    delay += 550;\n    timers.push(window.setTimeout(() => setActive(\"query\"), delay));\n    delay += 220;\n    for (let i = 1; i <= QUERY.length; i++) {\n      const next = QUERY.slice(0, i);\n      timers.push(window.setTimeout(() => setQuery(next), delay));\n      delay += 75;\n    }\n    delay += 500;\n    timers.push(window.setTimeout(() => setActive(\"none\"), delay));\n\n    return () => {\n      timers.forEach((t) => window.clearTimeout(t));\n      setEmail(\"\");\n      setQuery(\"\");\n      setActive(\"none\");\n    };\n  }, [hovered]);\n\n  const ring = (field: \"email\" | \"query\") =>\n    active === field ? \"ring-border-button-active\" : undefined;\n\n  return localize((\n    <Center>\n      <div ref={ref} className=\"flex w-full max-w-[230px] flex-col gap-3\">\n        <Input\n          placeholder=\"you@company.com\"\n          leadingIcon={RiMailLine}\n          value={email}\n          onChange={setEmail}\n          fieldClassName={ring(\"email\")}\n        />\n        <Input\n          placeholder=\"Search\"\n          leadingIcon={RiSearchLine}\n          value={query}\n          onChange={setQuery}\n          fieldClassName={ring(\"query\")}\n        />\n      </div>\n    </Center>\n  ));\n}\n\nfunction TextareaPreviewCard() {\n  const localize = useTemplateCopy();\n  const { ref, hovered } = useCardHover();\n  const [note, setNote] = useState(\"\");\n\n  useEffect(() => {\n    if (!hovered) return;\n    const NOTE = \"Ship the release notes before Friday.\";\n    const timers: number[] = [];\n    let delay = 350;\n    for (let i = 1; i <= NOTE.length; i++) {\n      const next = NOTE.slice(0, i);\n      timers.push(window.setTimeout(() => setNote(next), delay));\n      delay += 45;\n    }\n    return () => {\n      timers.forEach((t) => window.clearTimeout(t));\n      setNote(\"\");\n    };\n  }, [hovered]);\n\n  return localize((\n    <Center>\n      <div ref={ref} className=\"w-full max-w-[230px]\">\n        <Textarea\n          aria-label=\"Note\"\n          placeholder=\"Leave a note\"\n          value={note}\n          onChange={setNote}\n          autoResize\n          rows={2}\n          maxRows={4}\n          maxLength={120}\n          showCount\n          fieldClassName={hovered ? \"ring-border-button-active\" : undefined}\n        />\n      </div>\n    </Center>\n  ));\n}\n\nfunction SelectPreviewCard() {\n  const localize = useTemplateCopy();\n  return localize((\n    <Center>\n      <div className=\"w-full max-w-[168px]\">\n        <Select aria-label=\"Framework\" defaultSelectedKey=\"react\">\n          <SelectItem id=\"react\">React</SelectItem>\n          <SelectItem id=\"vue\">Vue</SelectItem>\n          <SelectItem id=\"svelte\">Svelte</SelectItem>\n        </Select>\n      </div>\n    </Center>\n  ));\n}\nexport const nativeCatalogPreviews:Record<string,()=>React.ReactElement>={\n\"/components/data-grid\": () => <Scaled width={960}><DataGridExample rowCount={48} showTitle={false} height={264} /></Scaled>,\n\"/components/data-table\": DataTablePreview,\n\"/components/stat-cards\": () => (\n    <Scaled width={330} insetRight>\n      <StatCards variant=\"footer\" count={1} columns={1} />\n    </Scaled>\n  ),\n\"/components/sidebar\": SidebarPreview,\n\"/components/dropdown\": DropdownPreview,\n\"/components/date-picker\": MeetingSchedulePreview,\n\"/components/file-upload\": FileUploadPreview,\n\"/components/notification\": () => (\n    <Center>\n      <div className=\"w-full max-w-[268px]\">\n        <Notification\n          status=\"success\"\n          title=\"Deployment finished\"\n          description=\"boardui.com is live on production.\"\n          timestamp=\"2m ago\"\n        />\n      </div>\n    </Center>\n  ),\n\"/components/table\": () => (\n    <div className=\"absolute inset-0 overflow-hidden\">\n      {/* Deliberately unscaled: the table reads better at its real size,\n          running off the end edge, than shrunk to fit the card. */}\n      <div className=\"w-[520px] origin-top-left rtl:origin-top-right\">\n        <Table aria-label=\"Customers\">\n          <TableHeader>\n            <TableColumn id=\"name\" isRowHeader>\n              Name\n            </TableColumn>\n            <TableColumn id=\"role\">Role</TableColumn>\n            <TableColumn id=\"status\">Status</TableColumn>\n          </TableHeader>\n          <TableBody>\n            <TableRow id=\"1\">\n              <TableCell>Olivia Rhye</TableCell>\n              <TableCell>Product Designer</TableCell>\n              <TableCell>Active</TableCell>\n            </TableRow>\n            <TableRow id=\"2\">\n              <TableCell>Phoenix Baker</TableCell>\n              <TableCell>Engineer</TableCell>\n              <TableCell>Active</TableCell>\n            </TableRow>\n            <TableRow id=\"3\">\n              <TableCell>Lana Steiner</TableCell>\n              <TableCell>Design Lead</TableCell>\n              <TableCell>Invited</TableCell>\n            </TableRow>\n            <TableRow id=\"4\">\n              <TableCell>Demi Wilkinson</TableCell>\n              <TableCell>Frontend Engineer</TableCell>\n              <TableCell>Active</TableCell>\n            </TableRow>\n          </TableBody>\n        </Table>\n      </div>\n    </div>\n  ),\n\"/components/tabs\": () => (\n    <Center>\n      <Tabs defaultSelectedKey=\"components\">\n        <TabList aria-label=\"Sections\">\n          <Tab id=\"components\" count={48}>\n            Components\n          </Tab>\n          <Tab id=\"blocks\" count={6}>\n            Blocks\n          </Tab>\n          <Tab id=\"charts\">Charts</Tab>\n        </TabList>\n      </Tabs>\n    </Center>\n  ),\n\"/components/settings-modal\": () => (\n    <InlineScaled width={560} factor={0.9}>\n      <SettingsGeneral planArtSrc=\"/react/assets/board-native/templates/settings-plan-art.png\" />\n    </InlineScaled>\n  ),\n\"/components/announcement\": () => (\n    <Center>\n      <div className=\"w-full max-w-[260px]\">\n        <Announcement\n          title=\"Two new components\"\n          description=\"Carousel and Input OTP are installable through the CLI today.\"\n          actionLabel=\"See what's new\"\n          dismissible\n        />\n      </div>\n    </Center>\n  ),\n\"/components/avatar\": () => (\n    <Center>\n      <div className=\"flex items-center\">\n        {[\n          { src: \"/react/assets/board-native/avatars/john-clarkson.webp\", alt: \"John Clarkson\", initials: undefined },\n          { src: \"/react/assets/board-native/avatars/aspen-lubin.webp\", alt: \"Aspen Lubin\", initials: undefined },\n          { src: \"/react/assets/board-native/avatars/kianna-vaccaro.webp\", alt: \"Kianna Vaccaro\", initials: undefined },\n          { src: undefined, alt: \"Mertcan Esmergul\", initials: \"M\" },\n        ].map((person, i) => (\n          <div\n            key={person.alt}\n            className={cx(\n              \"rounded-full ring-2 ring-background-primary-default transition-[translate,scale] duration-[450ms] ease-[cubic-bezier(.22,1,.36,1)]\",\n              i > 0 && \"-ml-3\",\n              // Fan out symmetrically around the centre — the outer pair\n              // travels 27px, the inner pair 9px — so the group spreads in\n              // place instead of drifting end off the middle of the card.\n              i === 0 && \"sm:group-hover/card:-translate-x-[27px]\",\n              i === 1 && \"sm:group-hover/card:-translate-x-[9px]\",\n              i === 2 && \"sm:group-hover/card:translate-x-[9px]\",\n              i === 3 && \"sm:group-hover/card:translate-x-[27px]\",\n              \"sm:group-hover/card:-translate-y-1 sm:group-hover/card:scale-105\",\n            )}\n            style={{ transitionDelay: `${i * 60}ms` }}\n          >\n            <Avatar size=\"lg\" color=\"blue\" src={person.src} initials={person.initials} alt={person.alt} />\n          </div>\n        ))}\n      </div>\n    </Center>\n  ),\n\"/components/chip\": () => (\n    <Center>\n      <div className=\"flex max-w-[248px] flex-wrap items-center justify-center gap-1.5\">\n        {[\n          { color: \"lime\", label: \"Completed\", variant: \"bold\" },\n          { color: \"yellow\", label: \"Waiting\", variant: \"subtle\" },\n          { color: \"purple\", label: \"+14.8%\", variant: \"bold\" },\n          { color: \"cyan\", label: \"Confirmed\", variant: \"caption\" },\n          { color: \"rose\", label: \"Failed\", variant: \"bold\" },\n          { color: \"blue\", label: \"In review\", variant: \"subtle\" },\n          { color: \"gray\", label: \"v2.4.0\", variant: \"caption\" },\n          { color: \"neutral\", label: \"Draft\", variant: \"bold\" },\n          { color: \"lime\", label: \"Live\", variant: \"subtle\" },\n          { color: \"rose\", label: \"-3.2%\", variant: \"caption\" },\n          { color: \"purple\", label: \"Beta\", variant: \"bold\" },\n          { color: \"soft\", label: \"Archived\", variant: \"subtle\" },\n        ].map((chip) => (\n          <Chip\n            key={chip.label}\n            color={chip.color as \"lime\"}\n            variant={chip.variant as \"bold\"}\n          >\n            {chip.label}\n          </Chip>\n        ))}\n      </div>\n    </Center>\n  ),\n\"/components/breadcrumb\": () => (\n    <Center>\n      <div className=\"flex flex-col items-start gap-2\">\n        <Breadcrumb>\n          <BreadcrumbItem href=\"/\">Home</BreadcrumbItem>\n          <BreadcrumbItem href=\"/components\">Team</BreadcrumbItem>\n          <BreadcrumbItem current>Billing</BreadcrumbItem>\n        </Breadcrumb>\n        <Breadcrumb>\n          <BreadcrumbItem href=\"/\">Library</BreadcrumbItem>\n          <BreadcrumbItem href=\"/components\">Charts</BreadcrumbItem>\n          <BreadcrumbItem current>Revenue</BreadcrumbItem>\n        </Breadcrumb>\n        <Breadcrumb>\n          <BreadcrumbItem href=\"/\" icon={RiHome5Line}>\n            Home\n          </BreadcrumbItem>\n          <BreadcrumbItem href=\"/components\" icon={RiSettings3Line}>\n            Settings\n          </BreadcrumbItem>\n          <BreadcrumbItem current icon={RiUserLine}>\n            Profile\n          </BreadcrumbItem>\n        </Breadcrumb>\n        <Breadcrumb>\n          <BreadcrumbItem href=\"/\" icon={RiFolder3Line}>\n            Files\n          </BreadcrumbItem>\n          <BreadcrumbItem href=\"/components\" icon={RiFolder3Line}>\n            Design\n          </BreadcrumbItem>\n          <BreadcrumbItem current icon={RiFileTextLine}>\n            Brief\n          </BreadcrumbItem>\n        </Breadcrumb>\n      </div>\n    </Center>\n  ),\n\"/components/button\": () => (\n    <Center>\n      <div className=\"flex flex-col items-center gap-3\">\n        <div className=\"flex items-center gap-2\">\n          <Button leadingIcon={RiAddLine}>Primary</Button>\n          <Button variant=\"secondary\">Secondary</Button>\n        </div>\n        <div className=\"flex items-center gap-2\">\n          <Button variant=\"ghost\">Ghost</Button>\n          <Button variant=\"danger\" leadingIcon={RiDeleteBinLine}>\n            Delete\n          </Button>\n        </div>\n      </div>\n    </Center>\n  ),\n\"/components/button-group\": () => (\n    <Center>\n      <ButtonGroup aria-label=\"Range\">\n        <ButtonGroupItem>Day</ButtonGroupItem>\n        <ButtonGroupItem selected>Week</ButtonGroupItem>\n        <ButtonGroupItem>Month</ButtonGroupItem>\n      </ButtonGroup>\n    </Center>\n  ),\n\"/components/carousel\": CarouselPreviewCard,\n\"/components/checkbox\": CheckboxPreview,\n\"/components/close-button\": () => (\n    <Center>\n      <div className=\"flex items-center gap-3\">\n        <CloseButton size=\"xs\" aria-label=\"Close\" />\n        <CloseButton size=\"sm\" aria-label=\"Close\" />\n        <CloseButton size=\"md\" aria-label=\"Close\" />\n      </div>\n    </Center>\n  ),\n\"/components/divider\": () => (\n    <Center>\n      <div className=\"flex w-full max-w-[220px] flex-col gap-5\">\n        <Divider />\n        <Divider>or</Divider>\n      </div>\n    </Center>\n  ),\n\"/components/icon-button\": () => (\n    <Center>\n      <div className=\"flex items-center gap-2\">\n        <IconButton icon={RiAddLine} aria-label=\"Add\" />\n        <IconButton icon={RiSearchLine} aria-label=\"Search\" />\n        <IconButton icon={RiDeleteBinLine} aria-label=\"Delete\" />\n      </div>\n    </Center>\n  ),\n\"/components/input\": InputPreviewCard,\n\"/components/input-otp\": InputOtpPreviewCard,\n\"/components/link-button\": () => (\n    <Center>\n      <div className=\"flex flex-col items-center gap-3\">\n        <LinkButton>View documentation</LinkButton>\n        <LinkButton trailingIcon={RiArrowRightSLine}>Browse components</LinkButton>\n      </div>\n    </Center>\n  ),\n\"/components/pagination\": () => (\n    <Center>\n      {/* Full width: the nav spreads Previous / pages / Next across it, and at\n          this width its own compact mode kicks in, so nothing clips. */}\n      <div className=\"w-full\">\n        <Pagination page={3} totalPages={10} onChange={() => {}} />\n      </div>\n    </Center>\n  ),\n\"/components/radio\": RadioPreview,\n\"/components/segmented-control\": () => (\n    <Center>\n      <SegmentedControl defaultSelectedKeys={[\"weekly\"]} aria-label=\"Period\">\n        <SegmentedControlItem id=\"weekly\">Weekly</SegmentedControlItem>\n        <SegmentedControlItem id=\"monthly\">Monthly</SegmentedControlItem>\n        <SegmentedControlItem id=\"yearly\">Yearly</SegmentedControlItem>\n      </SegmentedControl>\n    </Center>\n  ),\n\"/components/select\": SelectPreviewCard,\n\"/components/slider\": SliderPreview,\n\"/components/social-button\": () => (\n    <Center>\n      <div className=\"flex w-full max-w-[230px] flex-col gap-2\">\n        <SocialButton brand=\"google\" size=\"small\" appearance=\"white\" fullWidth />\n        <SocialButton brand=\"apple\" size=\"small\" appearance=\"white\" fullWidth />\n        <SocialButton brand=\"github\" size=\"small\" appearance=\"white\" fullWidth />\n      </div>\n    </Center>\n  ),\n\"/components/switch\": SwitchPreview,\n\"/components/textarea\": TextareaPreviewCard,\n\"/components/tooltip\": TooltipPreviewCard,\n\"/components/tree-view\": () => <Scaled width={384} insetRight><TreeViewPreview compact /></Scaled>\n};\n",
  "src/board-native/components/application/dashboard/dashboard-sidebar.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { useTemplateCopy } from \"../../foundations/template-copy/template-copy.js\";\n\nimport {\n  useCallback,\n  useEffect,\n  useRef,\n  useState,\n  type ComponentType,\n  type MouseEvent as ReactMouseEvent,\n  type ReactNode,\n} from \"react\";\nimport {\n  RiAsterisk,\n  RiBankLine,\n  RiCalendarLine,\n  RiChatAiLine,\n  RiCloseLine,\n  RiCustomerServiceLine,\n  RiHomeLine,\n  RiImageAiLine,\n  RiKanbanView2,\n  RiMegaphoneLine,\n  RiSearchLine,\n  RiSettings4Line,\n  RiSideBarFill,\n  RiUserSmileLine,\n} from \"@remixicon/react\";\nimport { SettingsModal } from \"../settings/settings-modal.js\";\nimport { NativeLocalDialog } from \"../../../NativeLocalDialog.js\";\nimport { ThemeToggle } from \"../theme/theme-toggle.js\";\nimport { Badge } from \"../../base/badges/badge.js\";\nimport { CloseButton } from \"../../base/buttons/close-button.js\";\nimport { Kbd } from \"../../base/kbd/kbd.js\";\nimport { cx } from \"../../../utils/cx.js\";\nimport { DashboardTeamMenu } from \"./dashboard-team-menu.js\";\nimport { DashboardUserMenu } from \"./dashboard-user-menu.js\";\n\n/**\n * Figma sources:\n *   expanded  → Board UI → dashboard 1 → Sidebar (node 3731:2934)\n *   collapsed → Board UI → Sidebar (node 3768:3382)\n *\n * Floating sidebar panel. Expanded: 260px wide, p 12, radius/3xl (24px),\n * white 1px border, \"Background/Sidebar Elevation\" shadow, bg\n * background/secondary. Collapsed: 60px wide (36px icon items + 12px\n * padding); collapse button sits centered above the workspace avatar, quick\n * search becomes a 36px neutral-200 square, nav items become icon-only\n * squares, the team card reduces to its avatar.\n *\n * The two states morph into each other: the panel width animates while\n * labels / badges / kbd collapse via max-width + opacity.\n */\n\ntype IconComponent = ComponentType<{\n  className?: string;\n  \"aria-hidden\"?: boolean | \"true\" | \"false\";\n}>;\n\n/**\n * Collapsible text/badge slot: blurs + fades + shrinks away when the rail\n * closes, and blurs back in on expand. The icons/rows themselves stay pinned in\n * place — only these label/badge slots animate — so nothing jumps to center.\n */\nfunction Collapsible({ collapsed, children, className }: { collapsed: boolean; children: ReactNode; className?: string }) {\n  const localize = useTemplateCopy();\n  return localize((\n    <span\n      className={cx(\n        \"flex min-w-0 items-center overflow-hidden transition-[max-width,opacity,filter] duration-300 ease-in-out\",\n        // Expanded, the cap is the row itself: a fixed cap (it was 160px)\n        // clipped any label wider than it, \"Components and Blocks\" included.\n        collapsed ? \"max-w-0 opacity-0 blur-[3px]\" : \"max-w-full opacity-100 blur-0\",\n        className,\n      )}\n    >\n      {children}\n    </span>\n  ));\n}\n\nfunction NavItem({\n  icon: Icon,\n  label,\n  badge,\n  isSelected = false,\n  collapsed = false,\n  href = \"#\",\n  onClick,\n}: {\n  icon: IconComponent;\n  label: string;\n  badge?: ReactNode;\n  isSelected?: boolean;\n  collapsed?: boolean;\n  href?: string;\n  /** Action rows (e.g. Settings → modal) intercept the navigation. */\n  onClick?: () => void;\n}) {\n  const localize = useTemplateCopy();\n  const Element=onClick&&href===\"#\"?\"button\":\"a\";\n  return localize((\n    <Element\n      href={Element===\"a\"?href:undefined}\n      type={Element===\"button\"?\"button\":undefined}\n      onClick={\n        onClick\n          ? (event:ReactMouseEvent<HTMLAnchorElement|HTMLButtonElement>) => {\n              event.preventDefault();\n              onClick();\n            }\n          : undefined\n      }\n      aria-current={isSelected ? \"page\" : undefined}\n      aria-label={label}\n      title={collapsed ? label : undefined}\n      className={cx(\n        \"flex items-center justify-between overflow-hidden rounded-2lg p-2\",\n        \"transition-[width,background-color] duration-300 ease-in-out\",\n        collapsed ? \"w-9\" : \"w-full\",\n        isSelected\n          ? \"bg-linear-to-b from-accent-500 to-accent-600 shadow-nav-selected\"\n          : \"hover:bg-background-secondary-hover\",\n      )}\n    >\n      <span className=\"flex min-w-0 items-center gap-2\">\n        <Icon\n          className={cx(\"size-5 shrink-0\", isSelected ? \"text-white\" : \"text-foreground-icon-secondary\")}\n          aria-hidden\n        />\n        <Collapsible collapsed={collapsed}>\n          <span\n            className={cx(\n              \"text-body-medium whitespace-nowrap\",\n              isSelected ? \"text-white\" : \"text-text-secondary\",\n            )}\n          >\n            {label}\n          </span>\n        </Collapsible>\n      </span>\n      {badge && <Collapsible collapsed={collapsed}>{badge}</Collapsible>}\n    </Element>\n  ));\n}\n\n/** A primary navigation row. Rows without an `href` are decoration only. */\nexport interface DashboardNavItem {\n  key: string;\n  label: string;\n  icon: IconComponent;\n  href?: string;\n  badge?: string | number;\n  onPress?: () => void;\n}\n\n/** Kept as a name for callers that typed their `selected` prop; any key works. */\nexport type DashboardNavKey = string;\n\n/** The Pro dashboard's navigation, the default set. */\nexport const DASHBOARD_NAV: DashboardNavItem[] = [\n  { key: \"home\", label: \"Home\", icon: RiHomeLine, href: \"/templates/dashboard\", badge: 152 },\n  { key: \"project-board\", label: \"Project board\", icon: RiKanbanView2, href: \"/templates/project-board\" },\n  { key: \"marketing\", label: \"Marketing\", icon: RiMegaphoneLine, href: \"/templates/marketing\" },\n  { key: \"calendar\", label: \"Calendar\", icon: RiCalendarLine, href: \"/templates/calendar\" },\n  { key: \"finance\", label: \"Finance\", icon: RiBankLine, href: \"/templates/finance\" },\n  { key: \"medical\", label: \"Medical Report\", icon: RiAsterisk, href: \"/templates/medical-profile\" },\n  { key: \"ai-chat\", label: \"AI Chat\", icon: RiChatAiLine, href: \"/templates/ai-chat\" },\n  { key: \"ai-image\", label: \"AI Image Generation\", icon: RiImageAiLine, href: \"/templates/ai-image-generation\" },\n  { key: \"profile\", label: \"Profile\", icon: RiUserSmileLine, href: \"/templates/ai-profile\" },\n];\n\n/**\n * The primary rows. A component of its own so the closures over `collapsed`\n * and the search query live here: built inline in the sidebar, the compiler\n * could not tell they leave `mobile` untouched and dropped the sidebar's\n * manual memoization.\n */\nfunction NavRows({\n  items,\n  query,\n  selected,\n  collapsed,\n  secondaryMatch,\n  onNavigate,\n}: {\n  items: DashboardNavItem[];\n  query: string;\n  selected: string;\n  collapsed: boolean;\n  /** Whether Support or Settings matches, so \"No results\" only shows when nothing does. */\n  secondaryMatch: boolean;\n  onNavigate?: (item:DashboardNavItem)=>void;\n}) {\n  const localize = useTemplateCopy();\n  const shown = items.filter((item) => item.label.toLocaleLowerCase().includes(query));\n  if (shown.length === 0 && !secondaryMatch && !collapsed) {\n    return localize(<p className=\"px-2 py-3 text-body-regular text-text-tertiary\">No results</p>);\n  }\n  return shown.map((item) => {\n      const isSelected = selected === item.key;\n      return (\n        <NavItem\n          key={item.key}\n          icon={item.icon}\n          label={item.label}\n          href={item.href}\n          onClick={onNavigate||item.onPress?()=>{item.onPress?.();onNavigate?.(item)}:undefined}\n          isSelected={isSelected}\n          collapsed={collapsed}\n          badge={\n            item.badge !== undefined ? (\n              <Badge color={isSelected ? \"primary\" : \"neutral\"}>{item.badge}</Badge>\n            ) : undefined\n          }\n        />\n      );\n    });\n}\n\nexport function DashboardSidebar({\n  mobile = false,\n  onClose,\n  fluid = false,\n  showThemeToggle = true,\n  selected = \"home\",\n  items = DASHBOARD_NAV,\n  flat = false,\n  className,\n  onNavigate,onSettings,onSupport,onAccountAction,onCollapsedChange,\n  userName,userInitials,teamName,teamEmail,teamAvatarSrc,teamPlan,onUpgrade,renderNavigation,\n}: {\n  onNavigate?:(item:DashboardNavItem)=>void;\n  onSettings?:()=>void;\n  onSupport?:()=>void;\n  onAccountAction?:(action:string)=>void;\n  onCollapsedChange?:(collapsed:boolean)=>void;\n  userName?:string;userInitials?:string;teamName?:string;teamEmail?:string;teamAvatarSrc?:string;teamPlan?:string;onUpgrade?:()=>void;\n  renderNavigation?:(state:{query:string;collapsed:boolean;mobile:boolean})=>ReactNode;\n  /** Rendered inside the mobile drawer: always expanded, close button instead of collapse. */\n  mobile?: boolean;\n  onClose?: () => void;\n  /** Expanded width fills its container below `lg` instead of the fixed\n   *  260px (e.g. the landing page, where the sidebar isn't in a drawer).\n   *  Collapsed width stays the fixed 60px rail at every breakpoint — the\n   *  whole point of collapsing is to shrink, so it must never get\n   *  overridden back to full width. */\n  fluid?: boolean;\n  /** Hide the app-level theme control when the sidebar is used as marketing artwork. */\n  showThemeToggle?: boolean;\n  /** Which nav item shows the selected (filled blue) state. */\n  selected?: DashboardNavKey;\n  /** Primary navigation rows. The Pro dashboard's set unless a screen brings its own. */\n  items?: DashboardNavItem[];\n  /** Removes the floating panel treatment for a sidebar revealed beneath mobile content. */\n  flat?: boolean;\n  className?: string;\n} = {}) {\n  const sidebarRef=useRef<HTMLElement>(null);\n  const localize = useTemplateCopy();\n  const [collapsedState, setCollapsed] = useState(false);\n  const [settingsOpen, setSettingsOpen] = useState(false);\n  const [supportOpen,setSupportOpen]=useState(false);\n  const [suppressUserHover, setSuppressUserHover] = useState(false);\n  const [searchActive, setSearchActive] = useState(false);\n  const [query, setQuery] = useState(\"\");\n  const searchTriggerRef = useRef<HTMLButtonElement>(null);\n  const searchFieldRef = useRef<HTMLDivElement>(null);\n  const searchInputRef = useRef<HTMLInputElement>(null);\n  const collapsed = mobile ? false : collapsedState;\n  const normalizedQuery = query.trim().toLocaleLowerCase();\n  const matches = (label: string) => label.toLocaleLowerCase().includes(normalizedQuery);\n  const secondaryLabels = [\"Support\", \"Settings\"];\n  const secondaryMatch = secondaryLabels.some(matches);\n\n  const activateSearch = useCallback(() => {\n    if (!mobile) setCollapsed(false);\n    setSearchActive(true);\n  }, [mobile]);\n\n  const deactivateSearch = useCallback((restoreFocus: boolean) => {\n    setQuery(\"\");\n    setSearchActive(false);\n    if (restoreFocus) {\n      window.requestAnimationFrame(() => searchTriggerRef.current?.focus());\n    }\n  }, []);\n\n  useEffect(() => {\n    if (!searchActive) return;\n    const frame = window.requestAnimationFrame(() => searchInputRef.current?.focus());\n    return () => window.cancelAnimationFrame(frame);\n  }, [searchActive]);\n\n  useEffect(() => {\n    if (!searchActive) return;\n\n    const onOutsideClick = (event: MouseEvent) => {\n      const target = event.target;\n      if (target instanceof Node && searchFieldRef.current?.contains(target)) return;\n      deactivateSearch(false);\n    };\n\n    document.addEventListener(\"click\", onOutsideClick);\n    return () => document.removeEventListener(\"click\", onOutsideClick);\n  }, [deactivateSearch, searchActive]);\n\n  useEffect(() => {\n    const onShortcut = (event: KeyboardEvent) => {\n      if (event.defaultPrevented || event.key.toLocaleLowerCase()!==\"l\" || !(event.metaKey||event.ctrlKey)) return;\n      // A component-library page can mount several demos, including inert thumbnails.\n      // Give this app shortcut only to the visible/focused sidebar, never a hidden copy.\n      const eligible=Array.from(document.querySelectorAll<HTMLElement>('[data-native-dashboard-sidebar]')).filter(node=>{\n        if(node.closest('[inert],[aria-hidden=\"true\"]')||!node.getClientRects().length)return false;\n        const rect=node.getBoundingClientRect();return rect.bottom>0&&rect.top<window.innerHeight&&rect.right>0&&rect.left<window.innerWidth;\n      });\n      const owner=eligible.find(node=>node.contains(document.activeElement))??eligible[0];\n      if(owner!==sidebarRef.current)return;\n      event.preventDefault();\n      activateSearch();\n    };\n\n    window.addEventListener(\"keydown\", onShortcut);\n    return () => window.removeEventListener(\"keydown\", onShortcut);\n  }, [activateSearch]);\n\n  return localize((\n    <aside ref={sidebarRef}data-native-dashboard-sidebar\n      className={cx(\n        \"flex h-full shrink-0 flex-col justify-between overflow-hidden\",\n        flat\n          ? \"bg-background-full\"\n          : \"rounded-3xl border border-border-button-white bg-background-secondary-default shadow-sidebar\",\n        \"transition-[width] duration-300 ease-in-out\",\n        // Collapsed rail keeps the 60px spec: 1px border + 11px padding on each\n        // side leaves an exactly 36px column so the w-9 (36px) icon items center.\n        collapsed\n          ? \"w-[60px] px-[11px] py-3\"\n          : fluid\n            ? \"w-full p-3 lg:w-[260px]\"\n            : \"w-[260px] p-3\",\n        className,\n      )}\n    >\n      {/* `overflow-y: auto` forces the x axis to clip too, and this box hugs\n          its contents on every side — so the selected item's 1px ring, the\n          profile's hover pill (which outsets 6px) and focus rings all landed\n          outside it. Padding moves the clip edge out; the matching negative\n          margin borrows that space back from the rail's own padding, leaving\n          every child exactly where it was. */}\n      <div\n        className=\"-m-2 flex min-h-0 w-[calc(100%+16px)] flex-col gap-3 overflow-y-auto p-2 [scrollbar-width:none]\"\n      >\n        {/* Workspace switcher / collapse control */}\n        <div\n          className={cx(\n            \"flex w-full transition-[gap] duration-300 ease-in-out\",\n            collapsed\n              ? \"flex-col-reverse items-start justify-center gap-2.5\"\n              : \"flex-row items-center justify-between\",\n          )}\n        >\n          {/* The clip is here to hide the label as `max-width` animates shut,\n              but it also cropped the trigger's hover pill down to four corner\n              arcs. Same trick as the scroller: pad the clip box out by the\n              pill's 8px reach and pull it back with a negative margin, so the\n              widths below are 16px larger than the footprint they produce. */}\n          <div\n            className={cx(\n              \"-m-2 min-w-0 overflow-hidden p-2 transition-[max-width,opacity,transform] duration-300 ease-in-out\",\n              mobile && flat && searchActive\n                ? \"max-w-0 scale-95 opacity-0\"\n                : \"max-w-[206px] scale-100 opacity-100\",\n            )}\n          >\n            <DashboardUserMenu\n              onAccountAction={onAccountAction}\n              userName={userName} userInitials={userInitials}\n              collapsed={collapsed}\n              suppressHover={suppressUserHover}\n              onHoverSuppressionEnd={() => setSuppressUserHover(false)}\n              avatarClassName={\n                flat\n                  ? \"bg-background-tertiary-default dark:bg-background-secondary-default\"\n                  : undefined\n              }\n            />\n          </div>\n          {mobile && flat ? (\n            <div\n              ref={searchFieldRef}\n              className={cx(\n                \"flex h-9 items-center overflow-hidden rounded-full bg-background-tertiary-default transition-[width,box-shadow] duration-300 ease-in-out\",\n                searchActive\n                  ? \"w-full gap-2 pe-2.5 ps-2 ring-2 ring-inset ring-border-button-active\"\n                  : \"w-9 gap-0 px-2\",\n              )}\n            >\n              <button\n                ref={searchTriggerRef}\n                type=\"button\"\n                aria-label=\"Search\"\n                onClick={activateSearch}\n                className=\"flex size-5 shrink-0 cursor-pointer items-center justify-center text-foreground-icon-secondary\"\n              >\n                <RiSearchLine className=\"size-5\" aria-hidden />\n              </button>\n              <input\n                ref={searchInputRef}\n                type=\"search\"\n                aria-label=\"Filter template navigation\"\n                value={query}\n                onChange={(event) => setQuery(event.target.value)}\n                onKeyDown={(event) => {\n                  if (event.key === \"Escape\") {\n                    event.preventDefault();\n                    deactivateSearch(true);\n                  }\n                }}\n                placeholder=\"Search...\"\n                tabIndex={searchActive ? 0 : -1}\n                className={cx(\n                  \"min-w-0 bg-transparent text-body-medium tracking-[-0.015em] text-text-primary outline-none placeholder:text-text-tertiary\",\n                  \"transition-[width,opacity] duration-200 ease-in-out\",\n                  searchActive\n                    ? \"w-full flex-1 opacity-100 delay-100\"\n                    : \"pointer-events-none w-0 flex-none opacity-0 delay-0\",\n                )}\n              />\n              <CloseButton\n                size=\"2xs\"\n                aria-label=\"Clear navigation search\"\n                onClick={() => deactivateSearch(true)}\n                className={cx(\n                  \"shrink-0 bg-background-tertiary-hover transition-opacity duration-150\",\n                  searchActive ? \"opacity-100 delay-150\" : \"pointer-events-none opacity-0 delay-0\",\n                )}\n              />\n            </div>\n          ) : mobile ? (\n            <button\n              type=\"button\"\n              aria-label=\"Close sidebar\"\n              onClick={onClose}\n              className=\"cursor-pointer text-foreground-icon-secondary\"\n            >\n              <RiCloseLine className=\"size-5\" aria-hidden />\n            </button>\n          ) : (\n            <button\n              type=\"button\"\n              aria-label={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n              aria-expanded={!collapsed}\n              onClick={() => {\n                const isExpanding = collapsedState;\n                if (!isExpanding) deactivateSearch(false);\n                setCollapsed(!collapsedState);onCollapsedChange?.(!collapsedState);\n                setSuppressUserHover(isExpanding);\n              }}\n              className={cx(\n                \"cursor-pointer text-foreground-icon-secondary transition-transform duration-300 ease-in-out\",\n                collapsed && \"flex w-9 items-center justify-center\",\n              )}\n            >\n              <RiSideBarFill\n                className={cx(\"size-5 transition-transform duration-300 ease-in-out\", collapsed ? \"rtl:-scale-x-100\" : \"-scale-x-100 rtl:scale-x-100\")}\n                aria-hidden\n              />\n            </button>\n          )}\n        </div>\n\n        <div className=\"flex w-full flex-col gap-3\">\n          {/* Quick search */}\n          {!flat && (searchActive && !collapsed ? (\n            <div\n              ref={searchFieldRef}\n              className=\"flex w-full items-center gap-2 rounded-full bg-background-tertiary-default py-2 pe-2.5 ps-2 ring-2 ring-inset ring-border-button-active transition-[background-color,box-shadow] duration-[var(--input-transition-ms)] ease\"\n            >\n              <RiSearchLine className=\"size-5 shrink-0 text-foreground-icon-secondary\" aria-hidden />\n              <input\n                ref={searchInputRef}\n                type=\"search\"\n                aria-label=\"Filter template navigation\"\n                value={query}\n                onChange={(event) => setQuery(event.target.value)}\n                onKeyDown={(event) => {\n                  if (event.key === \"Escape\") {\n                    event.preventDefault();\n                    deactivateSearch(true);\n                  }\n                }}\n                placeholder=\"Search navigation…\"\n                className=\"min-w-0 flex-1 bg-transparent text-body-medium text-text-primary outline-none placeholder:text-text-tertiary\"\n              />\n              <CloseButton\n                size=\"2xs\"\n                aria-label=\"Clear navigation search\"\n                onClick={() => deactivateSearch(true)}\n                className=\"bg-background-tertiary-hover\"\n              />\n            </div>\n          ) : (\n            <button\n              ref={searchTriggerRef}\n              type=\"button\"\n              aria-label=\"Quick Search\"\n              title={collapsed ? \"Quick Search\" : undefined}\n              onClick={activateSearch}\n              className={cx(\n                \"flex cursor-pointer items-center gap-2 p-2 hover:bg-background-tertiary-hover/55\",\n                \"transition-[width,border-radius,background-color] duration-300 ease-in-out\",\n                collapsed\n                  ? \"w-9 rounded-full bg-background-tertiary-default\"\n                  : \"w-full rounded-full bg-background-tertiary-default\",\n              )}\n            >\n              <span className={cx(\"flex min-w-0 items-center gap-2\", !collapsed && \"flex-1\")}>\n                <RiSearchLine className=\"size-5 shrink-0 text-foreground-icon-secondary\" aria-hidden />\n                <Collapsible collapsed={collapsed}>\n                  <span className=\"text-body-medium whitespace-nowrap text-text-secondary\">\n                    Quick Search\n                  </span>\n                </Collapsible>\n              </span>\n              <Collapsible collapsed={collapsed}>\n                <Kbd>⌘L</Kbd>\n              </Collapsible>\n            </button>\n          ))}\n\n          {/* Primary nav. The 2px inset is for the expanded rail only: the\n              collapsed column is exactly as wide as a 36px item, so padding\n              here pushes every item 2px right and the rail's own clip shaves\n              that much off its selected fill and hover state. */}\n          <nav className={cx(\"flex w-full flex-col gap-1\", !collapsed && \"px-0.5\")}>\n            {renderNavigation?renderNavigation({query:normalizedQuery,collapsed,mobile}):<NavRows\n              items={items}\n              query={normalizedQuery}\n              selected={selected}\n              collapsed={collapsed}\n              secondaryMatch={secondaryMatch}\n              onNavigate={onNavigate}\n            />}\n          </nav>\n        </div>\n      </div>\n\n      <div className=\"flex w-full shrink-0 flex-col gap-3\">\n        {showThemeToggle &&\n          (collapsed ? (\n            <ThemeToggle collapsed />\n          ) : (\n            <ThemeToggle\n              appearance=\"sidebar-segmented\"\n              className={flat ? \"!bg-background-secondary-default\" : undefined}\n            />\n          ))}\n        {/* Secondary nav */}\n        <nav className=\"flex w-full flex-col gap-1\">\n          {matches(\"Support\") && (\n            <NavItem icon={RiCustomerServiceLine} label=\"Support\" collapsed={collapsed} onClick={()=>onSupport?onSupport():setSupportOpen(true)} />\n          )}\n          {matches(\"Settings\") && (\n            <NavItem\n              icon={RiSettings4Line}\n              label=\"Settings\"\n              collapsed={collapsed}\n              onClick={()=>onSettings?onSettings():setSettingsOpen(true)}\n            />\n          )}\n        </nav>\n\n        {/* Team card → opens the profile menu next to the sidebar */}\n        <DashboardTeamMenu\n          teamName={teamName} teamEmail={teamEmail} teamAvatarSrc={teamAvatarSrc}teamPlan={teamPlan}onUpgrade={onUpgrade}\n          collapsed={collapsed}\n          className={flat ? \"!bg-background-secondary-default\" : undefined}\n        />\n      </div>\n\n      <NativeLocalDialog open={supportOpen} onOpenChange={setSupportOpen} title=\"Support\">This is a local interface preview. Read the installation guide for setup, or connect your application’s own support channel. No support request was sent.</NativeLocalDialog>\n      <SettingsModal\n        isOpen={settingsOpen}\n        onClose={() => setSettingsOpen(false)}\n        planArtSrc=\"/templates/settings-plan-art.png\"\n      />\n    </aside>\n  ));\n}\n",
  "src/board-native/components/application/dashboard/dashboard-team-menu.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport{useNativeAction}from\"../../../NativeEnvironment.js\";\nimport { useTemplateCopy, useTemplateLanguageSelector } from \"../../foundations/template-copy/template-copy.js\";\n\nimport { useDirection } from \"../../foundations/direction/direction.js\";\nimport { useState, useSyncExternalStore, type ComponentType, type ReactNode } from \"react\";\nimport {\n  RiBankCardLine,\n  RiBankLine,\n  RiBox3Line,\n  RiFolder6Line,\n  RiGroupLine,\n  RiLogoutBoxRLine,\n  RiMessage2Line,\n  RiNotification3Line,\n  RiPaletteLine,\n  RiSchoolLine,\n  RiShieldUserLine,\n} from \"@remixicon/react\";\nimport {\n  Button as AriaButton,\n  Dialog as AriaDialog,\n  DialogTrigger as AriaDialogTrigger,\n  Popover as AriaPopover,\n} from \"react-aria-components\";\nimport { ThemeToggle } from \"../theme/theme-toggle.js\";\nimport{Button}from\"../../base/buttons/button.js\";\nimport { Avatar } from \"../../base/avatar/avatar.js\";\nimport { Badge } from \"../../base/badges/badge.js\";\nimport { ChevronDownSmall } from \"../../foundations/icons/chevrons.js\";\nimport { cx } from \"../../../utils/cx.js\";\n\n/**\n * Figma source: Board UI → sidebar profile menu (node 3823:3699).\n *\n * Dropdown opened from the sidebar's \"Board team\" card. Floats to the right of\n * the sidebar: white panel, 1px border/button/default, radius 16, p 10,\n * shadow/dropdown. Header (team avatar + name/email), three grouped sections of\n * sidebar-style rows separated by full-bleed dividers, and a \"BoardUI\" + version\n * footer. Rows mirror the sidebar nav item pattern (icon + label + optional\n * counter) but use the menu tokens from Figma (text/primary label,\n * background/primary/hover on hover + the selected row).\n */\n\ntype IconComponent = ComponentType<{\n  className?: string;\n  \"aria-hidden\"?: boolean | \"true\" | \"false\";\n}>;\n\ntype MenuRow = {\n  icon: IconComponent;\n  label: string;\n  badge?: string;\n  isSelected?: boolean;\n};\n\ntype MenuGroup = {\n  id: string;\n  label?: string;\n  items: MenuRow[];\n};\n\nconst GROUPS: MenuGroup[] = [\n  {\n    id: \"workspace\",\n    items: [\n      { icon: RiBankLine, label: \"View team profile\" },\n      { icon: RiFolder6Line, label: \"Folders\" },\n      { icon: RiMessage2Line, label: \"Messages\", badge: \"94\" },\n      { icon: RiGroupLine, label: \"People\" },\n    ],\n  },\n  {\n    id: \"company\",\n    label: \"Company\",\n    items: [\n      { icon: RiBankCardLine, label: \"Billing\" },\n      { icon: RiSchoolLine, label: \"Company Details\" },\n      { icon: RiBox3Line, label: \"Integrations\" },\n    ],\n  },\n  {\n    id: \"personal\",\n    label: \"Personal\",\n    items: [\n      { icon: RiNotification3Line, label: \"Notifications\" },\n      { icon: RiShieldUserLine, label: \"Account Details\" },\n      { icon: RiLogoutBoxRLine, label: \"Sign out\" },\n    ],\n  },\n];\n\n/** Label/chevron slot on the trigger: blurs + fades away as the rail collapses. */\nfunction Collapsible({ collapsed, children }: { collapsed: boolean; children: ReactNode }) {\n  const localize = useTemplateCopy();\n  return localize((\n    <span\n      className={cx(\n        \"flex min-w-0 items-center overflow-hidden transition-[max-width,opacity,filter] duration-300 ease-in-out\",\n        collapsed ? \"max-w-0 opacity-0 blur-[3px]\" : \"max-w-40 opacity-100 blur-0\",\n      )}\n    >\n      {children}\n    </span>\n  ));\n}\n\nfunction TeamMenuItem({ icon: Icon, label, badge, isSelected, onSelect }: MenuRow & { onSelect: () => void }) {\n  const localize = useTemplateCopy();\n  return localize((\n    <AriaButton\n      type=\"button\"\n      aria-current={isSelected ? \"page\" : undefined}\n      onPress={onSelect}\n      className={cx(\n        \"flex w-full cursor-pointer items-center gap-2.5 rounded-2lg p-2 text-start outline-none transition-colors\",\n        isSelected\n          ? \"bg-background-primary-hover\"\n          : \"hover:bg-background-primary-hover focus-visible:bg-background-primary-hover\",\n      )}\n    >\n      <span className=\"flex min-w-0 flex-1 items-center gap-2\">\n        <Icon className=\"size-5 shrink-0 text-foreground-icon-secondary\" aria-hidden />\n        <span className=\"truncate text-body-medium text-text-primary\">{label}</span>\n      </span>\n      {badge && (\n        <Badge\n          color=\"neutral\"\n          className=\"bg-team-menu-count-background text-team-menu-count-foreground\"\n        >\n          {badge}\n        </Badge>\n      )}\n    </AriaButton>\n  ));\n}\n\nconst mobileSnapshot = () => window.matchMedia(\"(max-width: 639px)\").matches;\nconst subscribeMobile = (listener: () => void) => {\n  const query = window.matchMedia(\"(max-width: 639px)\");\n  query.addEventListener(\"change\", listener);\n  return () => query.removeEventListener(\"change\", listener);\n};\n\nexport function DashboardTeamMenu({\n  collapsed = false,\n  className,\n  showThemeToggle = false,\n  teamName=\"Helios team\",teamEmail=\"team@example.com\",teamAvatarSrc=\"/favicon.svg\",teamPlan,onUpgrade,\n}: {\n  collapsed?: boolean;\n  className?: string;\n  /** Show appearance controls inside the menu instead of the sidebar. */\n  showThemeToggle?: boolean;\n  teamName?:string;teamEmail?:string;teamAvatarSrc?:string;teamPlan?:string;onUpgrade?:()=>void;\n}) {\n  const localize = useTemplateCopy();\n  const reportAction=useNativeAction();\n  const languageSelector = useTemplateLanguageSelector();\n  const direction = useDirection();\n  const [isOpen, setIsOpen] = useState(false);\n  // \"right\" placement assumes room to the sidebar's right (true in-flow on\n  // desktop) — on mobile the sidebar can span the full viewport, so the\n  // 265px panel would render off-screen. Below sm, drop into a plain\n  // dropdown under the trigger instead.\n  const isMobile = useSyncExternalStore(subscribeMobile, mobileSnapshot, () => false);\n\n  return localize((\n    <AriaDialogTrigger isOpen={isOpen} onOpenChange={setIsOpen}>\n      <div className={teamPlan&&!collapsed?\"flex w-full items-center rounded-xl bg-background-tertiary-default pe-2\":\"contents\"}>\n      <AriaButton\n        aria-label={teamName}\n        className={cx(\n          \"flex cursor-pointer items-center overflow-hidden outline-none\",\n          \"border-2 border-transparent hover:border-border-button-hover\",\n          \"transition-[width,background-color,border-color,padding] duration-300 ease-in-out\",\n          \"focus-visible:ring-2 focus-visible:ring-border-focus-ring focus-visible:ring-offset-2\",\n          collapsed\n            ? \"size-9 justify-start rounded-full bg-transparent p-0\"\n            : \"w-full justify-between rounded-xl bg-background-tertiary-default py-2 pe-4 ps-2.5\",\n          teamPlan&&!collapsed&&\"min-w-0 flex-1 bg-transparent py-1 pe-1 hover:border-transparent\",\n          className,\n        )}\n      >\n        <span className=\"flex min-w-0 items-center gap-2\">\n          <Avatar size=\"md\" color=\"blue\" src={teamAvatarSrc} alt={teamName} />\n          <Collapsible collapsed={collapsed}>\n            <span className=\"flex min-w-0 flex-col items-start justify-center\">\n              <span className=\"text-body-medium whitespace-nowrap text-text-primary\">{teamName}</span>\n              <span className=\"text-body-regular whitespace-nowrap text-text-secondary\">{teamPlan??teamEmail}</span>\n            </span>\n          </Collapsible>\n        </span>\n        <Collapsible collapsed={collapsed||!!teamPlan}>\n          <span className=\"flex size-4 shrink-0 items-center justify-center rounded-[3px] bg-background-tertiary-hover\">\n            <ChevronDownSmall\n              className={cx(\"size-4 text-text-secondary transition-transform duration-200 ease\", isOpen && \"rotate-180\")}\n            />\n          </span>\n        </Collapsible>\n      </AriaButton>\n      {teamPlan&&!collapsed&&<Button variant=\"secondary\"size=\"small\"onClick={onUpgrade??(()=>reportAction({label:\"Upgrade preview\",description:\"Indian prices are previews. Checkout remains closed.\"}))}>Upgrade</Button>}\n      </div>\n      <AriaPopover\n        placement={isMobile ? \"bottom start\" : direction === \"rtl\" ? \"left bottom\" : \"right bottom\"}\n        offset={8}\n        className={cx(\n          \"w-[265px] max-w-[calc(100vw-32px)] origin-bottom-left overflow-y-auto\",\n          \"rounded-2xl border border-border-button-default bg-background-primary-default p-2.5 shadow-dropdown\",\n          \"transition duration-150 ease-out\",\n          \"data-[entering]:opacity-0 data-[entering]:scale-95 data-[entering]:blur-[2px]\",\n          \"data-[exiting]:opacity-0 data-[exiting]:scale-95 data-[exiting]:blur-[2px]\",\n        )}\n      >\n        <AriaDialog aria-label={teamName+\" menu\"} className=\"flex flex-col gap-[7px] outline-none\">\n          {/* Header */}\n          <div className=\"flex w-full items-center gap-2 px-2 pt-1\">\n            <Avatar size=\"md\" color=\"blue\" src={teamAvatarSrc} alt={teamName} />\n            <div className=\"flex min-w-0 flex-col items-start justify-center\">\n              <span className=\"text-body-medium whitespace-nowrap text-text-primary\">{teamName}</span>\n              <span className=\"text-body-regular whitespace-nowrap text-text-secondary\">{teamEmail}</span>\n            </div>\n          </div>\n\n          {/* Grouped sidebar-style rows */}\n          <div className=\"flex w-full flex-col\">\n            {GROUPS.map((group, index) => (\n              <Group key={group.id} group={group} showDivider={index > 0} onSelect={() => setIsOpen(false)}>\n                {showThemeToggle && group.id === \"personal\" && (\n                  <div className=\"flex w-full items-center justify-between gap-2.5 rounded-2lg px-2 py-1\">\n                    <span className=\"flex min-w-0 flex-1 items-center gap-2\">\n                      <RiPaletteLine className=\"size-5 shrink-0 text-foreground-icon-secondary\" aria-hidden />\n                      <span className=\"truncate text-body-medium text-text-primary\">Appearance</span>\n                    </span>\n                    <ThemeToggle appearance=\"segmented\" size=\"small\" className=\"shrink-0\" />\n                  </div>\n                )}\n                {group.id === \"personal\" && languageSelector}\n              </Group>\n            ))}\n          </div>\n\n          {/* Footer */}\n          <div className=\"flex w-full items-center justify-between px-2 pt-1 pb-2\">\n            <span className=\"text-body-2-medium whitespace-nowrap text-text-tertiary\">Helios UI</span>\n            <span className=\"inline-flex items-center justify-center rounded-sm bg-background-tertiary-default px-1 py-px text-body-2-medium whitespace-nowrap text-text-tertiary\">\n              v1.0.1\n            </span>\n          </div>\n        </AriaDialog>\n      </AriaPopover>\n    </AriaDialogTrigger>\n  ));\n}\n\nfunction Group({ group, showDivider, onSelect, children }: { group: MenuGroup; showDivider: boolean; onSelect: () => void; children?: ReactNode }) {\n  const report=useNativeAction();\n  const localize = useTemplateCopy();\n  return localize((\n    <>\n      {showDivider && <div className=\"-mx-2.5 my-2.5 h-px bg-border-button-default\" />}\n      <div className={cx(\"flex w-full flex-col gap-1\", group.label && \"gap-1.5 pt-1\")}>\n        {group.label && (\n          <span className=\"px-2 text-body-medium text-text-secondary\">{group.label}</span>\n        )}\n        <div className=\"flex w-full flex-col gap-1\">\n          {group.items.map((item) => (\n            <TeamMenuItem key={item.label} {...item} onSelect={()=>{onSelect();report({label:item.label,description:\"Selected in the local Helios team menu preview. No external team or account operation was performed.\"})}} />\n          ))}\n          {children}\n        </div>\n      </div>\n    </>\n  ));\n}\n",
  "src/board-native/components/application/dashboard/dashboard-user-menu.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { useTemplateCopy, useTemplateLanguageSelector } from \"../../foundations/template-copy/template-copy.js\";\n\nimport { useDirection } from \"../../foundations/direction/direction.js\";\nimport { useEffect, useState, type ComponentType, type ReactNode } from \"react\";\nimport { RiAddFill, RiEqualizer3Line } from \"@remixicon/react\";\nimport {\n  Button as AriaButton,\n  Dialog as AriaDialog,\n  DialogTrigger as AriaDialogTrigger,\n  Popover as AriaPopover,\n} from \"react-aria-components\";\nimport { Avatar } from \"../../base/avatar/avatar.js\";\nimport { Button } from \"../../base/buttons/button.js\";\nimport { ChevronUpDownSmall } from \"../../foundations/icons/chevrons.js\";\nimport { cx } from \"../../../utils/cx.js\";\n\n/**\n * Figma source: Board UI → sidebar account menu (node 3828:3895).\n *\n * Dropdown opened from the sidebar's workspace switcher (avatar + name +\n * chevron) at the top. Floats to the right of the sidebar with the same panel\n * surface and appear animation as the team menu: white, 1px border, radius 16,\n * p 10, shadow/dropdown. Lists the users with access (20px tinted-initial\n * avatars + name), a full-bleed divider, then \"Add user\" / \"Manage\" actions.\n */\n\ntype AvatarColor = \"neutral\" | \"lime\" | \"pink\";\n\ntype UserRow = {\n  initials: string;\n  color: AvatarColor;\n  name: string;\n  isSelected?: boolean;\n};\n\nconst USERS: UserRow[] = [\n  { initials: \"M\", color: \"neutral\", name: \"Mertcan Esmergul\" },\n  { initials: \"S\", color: \"lime\", name: \"Steven Raule\" },\n  { initials: \"L\", color: \"pink\", name: \"Lauren Proso\" },\n];\n\n/** Label slot on the trigger: blurs + fades away as the rail collapses. */\nfunction Collapsible({ collapsed, children }: { collapsed: boolean; children: ReactNode }) {\n  const localize = useTemplateCopy();\n  return localize((\n    <span\n      className={cx(\n        \"flex min-w-0 items-center overflow-hidden transition-[max-width,opacity,filter] duration-300 ease-in-out\",\n        collapsed ? \"max-w-0 opacity-0 blur-[3px]\" : \"max-w-40 opacity-100 blur-0\",\n      )}\n    >\n      {children}\n    </span>\n  ));\n}\n\nfunction UserMenuItem({ initials, color, name, isSelected, onSelect }: UserRow & { onSelect: () => void }) {\n  const localize = useTemplateCopy();\n  return localize((\n    <AriaButton\n      type=\"button\"\n      aria-current={isSelected ? \"page\" : undefined}\n      onPress={onSelect}\n      className={cx(\n        \"flex w-full cursor-pointer items-center gap-2 rounded-2lg px-2 py-1.5 text-start outline-none transition-colors\",\n        isSelected\n          ? \"bg-background-primary-hover\"\n          : \"hover:bg-background-primary-hover focus-visible:bg-background-primary-hover\",\n      )}\n    >\n      <Avatar size=\"xs\" color={color} initials={initials} />\n      <span className=\"truncate text-body-medium text-text-primary\">{name}</span>\n    </AriaButton>\n  ));\n}\n\n/** The dropdown's contents — users-with-access list + Add user/Manage\n *  actions — split out so other triggers (e.g. the calendar template's\n *  inbox icon) can open the same panel without duplicating it. */\nexport function AccountMenuContent({ onSelect,onAction,userName=\"Aarav Shah\",userInitials=\"A\" }: { onSelect: () => void;onAction?:(action:string)=>void;userName?:string;userInitials?:string }) {\n  const localize = useTemplateCopy();\n  const languageSelector = useTemplateLanguageSelector();\n  return localize((\n    <>\n      {/* Users with access */}\n      <div className=\"flex w-full flex-col gap-1.5 pt-[5px]\">\n        <span className=\"px-2 text-body-medium text-text-secondary\">Users with access</span>\n        <div className=\"flex w-full flex-col gap-1\">\n          {USERS.map((entry,index)=>{const user=index===0?{...entry,name:userName,initials:userInitials}:entry;return (\n            <UserMenuItem key={user.name} {...user} onSelect={()=>{onSelect();onAction?.(user.name)}} />\n          )})}\n        </div>\n      </div>\n\n      {/* Divider centered in the 28px gap between the list and the actions */}\n      <div className=\"-mx-2.5 my-3.5 h-px bg-border-button-default\" />\n\n      {/* Actions — pb-2 makes the space below the buttons match their\n          left/right inset (panel p-2.5 + row px-2 = 18px on every side). */}\n      <div className=\"flex w-full items-center gap-3 px-2 pb-2\">\n        <Button variant=\"secondary\" size=\"small\" leadingIcon={RiAddFill} className=\"flex-1\" onClick={()=>{onSelect();onAction?.(\"Add account\")}}>\n          Add user\n        </Button>\n        <Button\n          variant=\"secondary\"\n          size=\"small\"\n          leadingIcon={RiEqualizer3Line}\n          className=\"flex-1\"\n          onClick={()=>{onSelect();onAction?.(\"Manage accounts\")}}\n        >\n          Manage\n        </Button>\n      </div>\n      {languageSelector}\n    </>\n  ));\n}\n\nexport function DashboardUserMenu({\n  collapsed = false,\n  suppressHover = false,\n  onHoverSuppressionEnd,\n  onAccountAction,\n  avatarClassName,\n  userName=\"Aarav Shah\",userInitials=\"A\",\n}: {\n  collapsed?: boolean;\n  /** Prevents expansion from creating a hover state under a stationary pointer. */\n  suppressHover?: boolean;\n  /** Re-arms hover after the pointer fully leaves the trigger. */\n  onHoverSuppressionEnd?: () => void;\n  onAccountAction?:(action:string)=>void;\n  avatarClassName?: string;\n  userName?:string;userInitials?:string;\n}) {\n  const localize = useTemplateCopy();\n  const direction = useDirection();\n  const [isOpen, setIsOpen] = useState(false);\n  // \"right\" placement assumes room to the sidebar's right (true in-flow on\n  // desktop) — on mobile the sidebar can span the full viewport, so the\n  // 265px panel would render off-screen. Below sm, drop into a plain\n  // dropdown under the trigger instead.\n  const [isMobile, setIsMobile] = useState(false);\n  useEffect(() => {\n    const mq = window.matchMedia(\"(max-width: 639px)\");\n    setIsMobile(mq.matches);\n    const onChange = (e: MediaQueryListEvent) => setIsMobile(e.matches);\n    mq.addEventListener(\"change\", onChange);\n    return () => mq.removeEventListener(\"change\", onChange);\n  }, []);\n\n  return localize((\n    <AriaDialogTrigger isOpen={isOpen} onOpenChange={setIsOpen}>\n      <AriaButton\n        aria-label={userName}\n        onPointerLeave={() => {\n          if (suppressHover) onHoverSuppressionEnd?.();\n        }}\n        className={cx(\n          \"relative flex min-w-0 cursor-pointer items-center gap-2 rounded-full outline-none\",\n          \"focus-visible:ring-2 focus-visible:ring-border-focus-ring focus-visible:ring-offset-2\",\n          // Hover pill (Figma node 3829:4063): a fully-rounded 2px border/button/hover\n          // outline drawn via a pseudo-element so it never shifts the layout.\n          \"before:pointer-events-none before:absolute before:-inset-x-1.5 before:-inset-y-[5px] before:rounded-full before:border-2 before:border-transparent before:transition-colors before:duration-150\",\n          !suppressHover && \"hover:before:border-border-sidebar-profile-hover\",\n          // Collapsed, the trigger takes the rail's own 36px column and centres\n          // the 32px avatar in it, instead of sizing to the avatar plus a gap\n          // held open for a label that's shrunk to nothing. That gap made the\n          // button 42px wide in a 36px rail, which pushed its hover pill\n          // off-centre and into the rail's clip.\n          //\n          // The pill's insets go square too: 36×32 plus the expanded 6/5 reach\n          // is a 48×42 stadium, not the circle the avatar wants. 3/5 lands it\n          // on 42×42.\n          collapsed && \"w-9 justify-center gap-0 before:-inset-x-[3px]\",\n        )}\n      >\n        <Avatar size=\"md\" color=\"neutral\" initials={userInitials} className={avatarClassName} />\n        <Collapsible collapsed={collapsed}>\n          <span className=\"flex items-center gap-0.5\">\n            <span className=\"text-body-medium whitespace-nowrap text-text-primary\">{userName}</span>\n            <ChevronUpDownSmall className=\"size-4 shrink-0 text-foreground-icon-tertiary\" />\n          </span>\n        </Collapsible>\n      </AriaButton>\n\n      <AriaPopover\n        placement={isMobile ? \"bottom start\" : direction === \"rtl\" ? \"left top\" : \"right top\"}\n        offset={8}\n        className={cx(\n          \"w-[265px] max-w-[calc(100vw-32px)] origin-top-left overflow-y-auto\",\n          \"rounded-2xl border border-border-button-default bg-background-primary-default p-2.5 shadow-dropdown\",\n          \"transition duration-150 ease-out\",\n          \"data-[entering]:opacity-0 data-[entering]:scale-95 data-[entering]:blur-[2px]\",\n          \"data-[exiting]:opacity-0 data-[exiting]:scale-95 data-[exiting]:blur-[2px]\",\n        )}\n      >\n        <AriaDialog aria-label=\"Account menu\" className=\"flex flex-col outline-none\">\n          <AccountMenuContent onSelect={() => setIsOpen(false)} onAction={onAccountAction} userName={userName} userInitials={userInitials}/>\n        </AriaDialog>\n      </AriaPopover>\n    </AriaDialogTrigger>\n  ));\n}\n",
  "src/board-native/components/application/dashboard/stat-cards.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { useTemplateCopy } from \"../../foundations/template-copy/template-copy.js\";\n\nimport { useState, type ComponentType } from \"react\";\nimport {\n  RiArrowDownCircleFill,\n  RiArrowUpCircleFill,\n  RiBox3Line,\n  RiChatSmile2Line,\n  RiCoinsFill,\n  RiGroupFill,\n  RiGroupLine,\n  RiIndeterminateCircleFill,\n  RiInformationFill,\n  RiRefund2Fill,\n  RiShoppingBasket2Fill,\n  RiShoppingBasketLine,\n} from \"@remixicon/react\";\nimport { Focusable } from \"react-aria-components\";\nimport { Chip } from \"../../base/badges/chip.js\";\nimport { Tooltip, TooltipTrigger } from \"../../base/tooltip/tooltip.js\";\nimport { cx } from \"../../../utils/cx.js\";\n\n/**\n * Figma source: Board UI → dashboard 1 → Frame 20 (node 3731:3160) for the\n * plain cards; the footer variant follows the same inner-tile recipe as the\n * recent hires card.\n *\n * KPI stat cards in two looks:\n *\n *   plain   icon tile, label, value, delta chip — the compact dashboard row\n *   footer  tinted gradient icon tile beside the label (plus an optional\n *           info tooltip), a display-size value, and a white footer band\n *           carrying the comparison caption and a delta pill\n */\n\ntype IconComponent = ComponentType<{\n  className?: string;\n  \"aria-hidden\"?: boolean | \"true\" | \"false\";\n}>;\n\nexport type StatCardsVariant = \"plain\" | \"footer\";\n\n/** Tint of the footer variant's gradient icon tile. */\nexport type StatTone = \"blue\" | \"orange\" | \"purple\" | \"pink\" | \"sky\" | \"emerald\";\n\nexport type Stat = {\n  icon: IconComponent;\n  label: string;\n  value: string;\n  delta: string;\n  deltaColor: \"lime\" | \"rose\" | \"neutral\";\n  /** Footer variant: icon tile tint (defaults to blue). */\n  tone?: StatTone;\n  /** Footer variant: comparison caption in the band (\"From last month\"). */\n  caption?: string;\n  /** Footer variant: shows an info glyph with this text on hover. */\n  hint?: string;\n};\n\nconst DEFAULT_STATS: Stat[] = [\n  { icon: RiGroupLine, label: \"Customers\", value: \"14,592\", delta: \"+5.3%\", deltaColor: \"lime\" },\n  { icon: RiBox3Line, label: \"Unit sold\", value: \"385\", delta: \"-2.1%\", deltaColor: \"rose\" },\n  { icon: RiShoppingBasketLine, label: \"Orders\", value: \"1,394\", delta: \"0.00%\", deltaColor: \"neutral\" },\n  { icon: RiChatSmile2Line, label: \"Support tickets\", value: \"708\", delta: \"+12.8%\", deltaColor: \"lime\" },\n];\n\nconst DEFAULT_FOOTER_STATS: Stat[] = [\n  {\n    icon: RiCoinsFill,\n    label: \"Total revenue\",\n    value: \"$152,313.92\",\n    delta: \"16%\",\n    deltaColor: \"lime\",\n    tone: \"blue\",\n    hint: \"Gross revenue across every channel this month, before refunds. The change is against the same days last month.\",\n  },\n  {\n    icon: RiShoppingBasket2Fill,\n    label: \"Total orders\",\n    value: \"25,162\",\n    delta: \"20%\",\n    deltaColor: \"lime\",\n    tone: \"orange\",\n    hint: \"Checkouts completed this month, repeat purchases included. The change is against the same days last month.\",\n  },\n  {\n    icon: RiGroupFill,\n    label: \"New customers\",\n    value: \"3,847\",\n    delta: \"8.1%\",\n    deltaColor: \"lime\",\n    tone: \"purple\",\n    hint: \"People who bought for the first time this month. The change is against the same days last month.\",\n  },\n  {\n    icon: RiRefund2Fill,\n    label: \"Refunds\",\n    value: \"$4,209.44\",\n    delta: \"2.4%\",\n    deltaColor: \"rose\",\n    tone: \"pink\",\n    hint: \"Value of orders refunded this month. Down is good here, so the change reads in red when refunds rise.\",\n  },\n];\n\n/** Gradient stops for the footer variant's icon tile, keyed by tone. */\nconst TILE_TONES: Record<StatTone, string> = {\n  blue: \"from-blue-500 to-blue-600\",\n  orange: \"from-orange-400 to-orange-500\",\n  purple: \"from-purple-500 to-purple-600\",\n  pink: \"from-pink-500 to-pink-600\",\n  sky: \"from-sky-400 to-sky-500\",\n  emerald: \"from-emerald-500 to-emerald-600\",\n};\n\nconst DELTA_STYLES: Record<\n  Stat[\"deltaColor\"],\n  { icon: IconComponent; className: string; pill: string }\n> = {\n  lime: {\n    icon: RiArrowUpCircleFill,\n    className: \"text-status-lime-text\",\n    pill: \"bg-status-lime-background\",\n  },\n  rose: {\n    icon: RiArrowDownCircleFill,\n    className: \"text-status-rose-text\",\n    pill: \"bg-status-rose-background\",\n  },\n  neutral: {\n    icon: RiIndeterminateCircleFill,\n    className: \"text-text-secondary\",\n    pill: \"bg-background-secondary-default\",\n  },\n};\n\n/** Tinted pill with a direction glyph — the footer band's delta readout, in\n *  the same lime and rose the chart cards use for their trend chips. */\nfunction DeltaPill({ delta, deltaColor }: Pick<Stat, \"delta\" | \"deltaColor\">) {\n  const localize = useTemplateCopy();\n  const { icon: Icon, className, pill } = DELTA_STYLES[deltaColor];\n  return localize((\n    <span\n      className={cx(\n        \"flex shrink-0 items-center gap-1 rounded-full py-0.5 pe-2 ps-1\",\n        pill,\n      )}\n    >\n      <Icon className={cx(\"size-4 shrink-0\", className)} aria-hidden />\n      <span className={cx(\"text-body-medium whitespace-nowrap tabular-nums\", className)}>\n        {delta}\n      </span>\n    </span>\n  ));\n}\n\n/** Bare info glyph with a tooltip — the footer header's trailing control.\n *  Opens on hover and focus as tooltips do, and on click as well, since a\n *  glyph this small reads as a button and gets tapped. */\nfunction StatHint({ label, hint }: { label: string; hint: string }) {\n  const localize = useTemplateCopy();\n  const [open, setOpen] = useState(false);\n  return localize((\n    <TooltipTrigger delay={200} isOpen={open} onOpenChange={setOpen}>\n      <Focusable>\n        <button\n          type=\"button\"\n          aria-label={`About ${label}`}\n          onClick={() => setOpen((isOpen) => !isOpen)}\n          className=\"flex shrink-0 cursor-pointer items-center justify-center rounded-full text-foreground-icon-secondary outline-none transition-colors duration-150 ease hover:text-foreground-icon-primary focus-visible:ring-2 focus-visible:ring-border-focus-ring\"\n        >\n          <RiInformationFill className=\"size-5\" aria-hidden />\n        </button>\n      </Focusable>\n      <Tooltip size=\"md\">{hint}</Tooltip>\n    </TooltipTrigger>\n  ));\n}\n\nfunction PlainStatCard({ stat }: { stat: Stat }) {\n  const localize = useTemplateCopy();\n  return localize((\n    <section className=\"flex h-[132px] min-w-0 flex-col items-start justify-between rounded-2xl bg-background-secondary-default p-4\">\n      <span className=\"flex items-center rounded-md bg-stat-card-icon-background p-1.5\">\n        <stat.icon className=\"size-5 shrink-0 text-foreground-icon-primary\" aria-hidden />\n      </span>\n      <div className=\"flex w-full flex-col gap-0.5\">\n        <p className=\"w-full text-body-medium text-text-secondary\">{stat.label}</p>\n        <div className=\"flex w-full flex-wrap items-center gap-2\">\n          <p className=\"text-title-1-medium whitespace-nowrap text-text-primary\">{stat.value}</p>\n          <Chip variant=\"bold\" color={stat.deltaColor}>\n            {stat.delta}\n          </Chip>\n        </div>\n      </div>\n    </section>\n  ));\n}\n\nfunction FooterStatCard({ stat }: { stat: Stat }) {\n  const localize = useTemplateCopy();\n  return localize((\n    <section className=\"flex min-w-0 flex-col rounded-2xl bg-background-secondary-default p-2\">\n      {/* Icon tile + optional info glyph, both hanging from the same top inset */}\n      <div className=\"flex w-full items-start justify-between gap-2.5 p-2\">\n        <span\n          className={cx(\n            \"flex size-10 shrink-0 items-center justify-center rounded-2lg bg-linear-to-b\",\n            TILE_TONES[stat.tone ?? \"blue\"],\n          )}\n        >\n          <stat.icon className=\"size-5 shrink-0 text-white\" aria-hidden />\n        </span>\n        {stat.hint && <StatHint label={stat.label} hint={stat.hint} />}\n      </div>\n\n      {/* Label sits directly over the number, as on the plain cards */}\n      <div className=\"flex flex-col gap-0.5 px-2 pt-2.5 pb-3.5\">\n        <p className=\"truncate text-body-medium text-text-secondary\">{stat.label}</p>\n        <p className=\"text-display-4-medium whitespace-nowrap text-text-primary tabular-nums\">\n          {stat.value}\n        </p>\n      </div>\n\n      {/* Footer band: comparison caption + delta pill on an inner tile */}\n      <div className=\"mt-auto flex w-full items-center justify-between gap-2 rounded-2lg bg-background-inner-default py-1.5 pe-1.5 ps-2.5 shadow-card\">\n        <p className=\"truncate text-body-regular text-text-secondary\">\n          {stat.caption ?? \"From last month\"}\n        </p>\n        <DeltaPill delta={stat.delta} deltaColor={stat.deltaColor} />\n      </div>\n    </section>\n  ));\n}\n\nexport function StatCards({\n  variant = \"plain\",\n  stats,\n  count,\n  columns = 4,\n  className,\n}: {\n  variant?: StatCardsVariant;\n  /** KPI cards to render; defaults to demo metrics matching the variant. */\n  stats?: Stat[];\n  /** How many KPI cards to render (from the start of the list). */\n  count?: number;\n  /** Columns at the widest breakpoint - 2 keeps the grid two-up for\n   *  narrower hosts (docs previews, split layouts), 1 pins a single\n   *  column at every width. */\n  columns?: 1 | 2 | 4;\n  className?: string;\n} = {}) {\n  const localize = useTemplateCopy();\n  const items =\n    stats ?? (variant === \"footer\" ? DEFAULT_FOOTER_STATS : DEFAULT_STATS);\n  return localize((\n    <div\n      className={cx(\n        \"grid w-full gap-4\",\n        // The footer cards carry a display-size value, so they go one per\n        // row on phones where the plain cards still fit two up.\n        columns === 1\n          ? \"grid-cols-1\"\n          : variant === \"footer\"\n            ? \"grid-cols-1 sm:grid-cols-2\"\n            : \"grid-cols-2\",\n        columns === 4 && (variant === \"footer\" ? \"xl:grid-cols-4\" : \"lg:grid-cols-4\"),\n        className,\n      )}\n    >\n      {items.slice(0, count ?? items.length).map((stat) =>\n        variant === \"footer\" ? (\n          <FooterStatCard key={stat.label} stat={stat} />\n        ) : (\n          <PlainStatCard key={stat.label} stat={stat} />\n        ),\n      )}\n    </div>\n  ));\n}\n",
  "src/board-native/components/application/data-grid/data-grid-utils.ts": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n/** Private data helpers bundled with the Data Grid registry item. */\nexport type GridCell = { rowId: string; columnKey: string };\nexport type GridEdit<T> = { rowId: string; key: keyof T; before: T[keyof T]; after: T[keyof T] };\n\nexport function columnLetter(index: number): string {\n  let result = \"\";\n  for (let n = index + 1; n > 0; n = Math.floor((n - 1) / 26)) {\n    result = String.fromCharCode(65 + ((n - 1) % 26)) + result;\n  }\n  return result;\n}\n\nexport function parseGridValue(value: string, column: { type?: \"text\" | \"number\" | \"select\"; options?: readonly string[]; min?: number; max?: number }): string | number {\n  if (column.type === \"number\") {\n    const number = Number(value.trim());\n    if (!value.trim() || !Number.isFinite(number)) throw new Error(\"Enter a valid number.\");\n    if (column.min !== undefined && number < column.min) throw new Error(`The minimum is ${column.min}.`);\n    if (column.max !== undefined && number > column.max) throw new Error(`The maximum is ${column.max}.`);\n    return number;\n  }\n  if (column.type === \"select\" && !column.options?.includes(value)) throw new Error(\"Choose one of the available options.\");\n  return value;\n}\n\nexport function applyGridEdits<T>(data: readonly T[], getRowId: (row: T) => string, edits: readonly GridEdit<T>[], undo = false): T[] {\n  const byRow = new Map<string, GridEdit<T>[]>();\n  for (const edit of edits) {\n    const row = byRow.get(edit.rowId) ?? [];\n    row.push(edit);\n    byRow.set(edit.rowId, row);\n  }\n  return data.map((row) => {\n    const changes = byRow.get(getRowId(row));\n    if (!changes) return row;\n    const next = { ...row };\n    for (const change of changes) next[change.key] = undo ? change.before : change.after;\n    return next;\n  });\n}\n\n/** Round-trips quotes, tabs, and newlines copied from a spreadsheet. */\nexport function parseGridClipboard(text: string): string[][] {\n  const rows: string[][] = [[]];\n  let field = \"\", quoted = false;\n  const source = text.replace(/\\r\\n?/g, \"\\n\");\n  for (let i = 0; i < source.length; i++) {\n    const char = source[i];\n    if (char === '\"' && (quoted || field === \"\")) {\n      if (quoted && source[i + 1] === '\"') { field += '\"'; i++; }\n      else quoted = !quoted;\n    } else if (!quoted && (char === \"\\t\" || char === \"\\n\")) {\n      rows[rows.length - 1].push(field);\n      field = \"\";\n      if (char === \"\\n\") rows.push([]);\n    } else field += char;\n  }\n  rows[rows.length - 1].push(field);\n  if (source.endsWith(\"\\n\") && rows[rows.length - 1].length === 1 && rows[rows.length - 1][0] === \"\") rows.pop();\n  return rows;\n}\n\nexport function serializeGridRows(rows: readonly (readonly unknown[])[], separator = \",\"): string {\n  return rows.map((row) => row.map((value) => {\n    let text = String(value ?? \"\");\n    // Keep text values literal when opened by spreadsheet applications.\n    if (typeof value === \"string\" && /^[\\s]*[=+@-]/.test(text)) text = `'${text}`;\n    return text.includes(separator) || /[\"\\r\\n]/.test(text) ? `\"${text.replace(/\"/g, '\"\"')}\"` : text;\n  }).join(separator)).join(\"\\r\\n\");\n}\n",
  "src/board-native/components/application/data-grid/data-grid.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport type { ClipboardEvent, CSSProperties, KeyboardEvent, ReactNode } from \"react\";\nimport { RiArrowDownLine, RiArrowGoBackLine, RiArrowGoForwardLine, RiArrowUpLine, RiCheckLine, RiDeleteBinLine, RiDownload2Line, RiFileCopyLine, RiFilter3Line, RiLayoutColumnLine, RiLayoutRowLine, RiSearchLine } from \"@remixicon/react\";\nimport { Focusable } from \"react-aria-components\";\nimport { AnimatePresence, motion, useIsPresent, useReducedMotion } from \"motion/react\";\nimport { Button, buttonStyles } from \"../../base/buttons/button.js\";\nimport { CloseButton } from \"../../base/buttons/close-button.js\";\nimport { Checkbox } from \"../../base/checkbox/checkbox.js\";\nimport { Dropdown, DropdownGroup, DropdownItem, DropdownPopover, DropdownTrigger } from \"../../base/dropdown/dropdown.js\";\nimport { Input } from \"../../base/input/input.js\";\nimport { Select, SelectItem } from \"../../base/select/select.js\";\nimport { SegmentedControl, SegmentedControlItem } from \"../../base/segmented-control/segmented-control.js\";\nimport { Tooltip, TooltipTrigger } from \"../../base/tooltip/tooltip.js\";\nimport { useDirection } from \"../../foundations/direction/direction.js\";\nimport { cx } from \"../../../utils/cx.js\";\nimport { applyGridEdits, columnLetter, parseGridClipboard, parseGridValue, serializeGridRows } from \"./data-grid-utils.js\";\nimport type { GridCell, GridEdit } from \"./data-grid-utils.js\";\n\nexport interface DataGridColumn<T> {\n  key: Extract<keyof T, string>;\n  header: string;\n  /** Width in pixels. Columns can also be resized with the pointer or keyboard. */\n  width?: number;\n  type?: \"text\" | \"number\" | \"select\";\n  options?: readonly string[];\n  editable?: boolean;\n  /** Adds an exact-value filter to the Filter menu. */\n  filterable?: boolean;\n  min?: number;\n  max?: number;\n  align?: \"start\" | \"end\";\n  summary?: \"sum\" | \"average\" | \"count\";\n  format?: (value: T[keyof T]) => ReactNode;\n  formatSummary?: (value: number) => ReactNode;\n  /** Return an error message to reject an edit or an entire paste transaction. */\n  validate?: (value: string | number, row: T) => string | undefined;\n}\n\nexport interface DataGridProps<T extends object> {\n  \"aria-label\": string;\n  data: readonly T[];\n  columns: readonly DataGridColumn<T>[];\n  /** Unique, stable identity; edits and selection survive sorting and filtering. */\n  getRowId: (row: T) => string;\n  /** Omit to make the grid read-only. The owner is responsible for persisting data. */\n  onDataChange?: (data: T[]) => void;\n  height?: number;\n  className?: string;\n  exportFileName?: string;\n  emptyState?: ReactNode;\n}\n\ntype Range = { anchor: GridCell; focus: GridCell };\ntype Bounds = { top: number; bottom: number; start: number; end: number };\ntype GridTransaction<T> = { type: \"edit\"; edits: GridEdit<T>[] } | { type: \"delete\"; rows: { row: T; index: number }[] };\nconst GUTTER = 48;\nconst OVERSCAN = 4;\nconst menuTrigger = cx(buttonStyles.base, buttonStyles.size.small, buttonStyles.iconOnlySize.small, buttonStyles.variant.secondary);\nconst compactMenuItem = \"px-2 py-1.5 text-body-regular\";\nconst neutralButton = \"bg-transparent text-text-secondary hover:bg-background-secondary-hover active:bg-background-secondary-hover disabled:bg-transparent disabled:text-text-tertiary\";\n\nfunction GridMenuTrigger({ label, icon: Icon, count }: { label: string; icon: typeof RiSearchLine; count?: number }) {\n  return <TooltipTrigger>\n    <DropdownTrigger aria-label={label} className={cx(menuTrigger, \"relative overflow-visible\")}>\n      <Icon className={buttonStyles.icon.small} aria-hidden />\n      {!!count && <span aria-hidden className=\"absolute -end-1 -top-1 flex size-4 items-center justify-center rounded-full bg-accent-100 text-caption-1-semibold text-accent-700\">{count}</span>}\n    </DropdownTrigger>\n    <Tooltip>{label}</Tooltip>\n  </TooltipTrigger>;\n}\n\nfunction GridAction({ label, icon, disabled, onClick }: { label: string; icon: typeof RiSearchLine; disabled?: boolean; onClick: () => void }) {\n  return <TooltipTrigger><Focusable><Button variant=\"secondary\" size=\"small\" iconOnly leadingIcon={icon} aria-label={label} disabled={disabled} onClick={onClick} /></Focusable><Tooltip>{label}</Tooltip></TooltipTrigger>;\n}\n\nfunction GridToolbarContent({ children }: { children: ReactNode }) {\n  const isPresent = useIsPresent();\n  const reducedMotion = useReducedMotion();\n  return <motion.div\n    data-grid-toolbar-content\n    aria-hidden={!isPresent}\n    inert={!isPresent}\n    initial={{ opacity: 0 }}\n    animate={{ opacity: 1 }}\n    exit={{ opacity: 0 }}\n    transition={{ duration: reducedMotion ? 0 : 0.18, ease: \"easeInOut\" }}\n    className={cx(\"col-start-1 row-start-1 flex min-w-0 flex-wrap items-center justify-between gap-2\", !isPresent && \"pointer-events-none\")}\n  >{children}</motion.div>;\n}\n\nfunction GridScrollFade({ scrollTop }: { scrollTop: number }) {\n  const opacity = Math.min(1, Math.max(0, scrollTop) / 24);\n  return <div aria-hidden data-grid-scroll-fade className=\"pointer-events-none absolute inset-x-0 top-0 z-30 h-6\">\n    <div className=\"absolute inset-0 backdrop-blur-[1px] [mask-image:linear-gradient(to_bottom,black,transparent)]\" style={{ opacity }} />\n    <div className=\"absolute inset-x-0 top-0 h-4 backdrop-blur-[4px] [mask-image:linear-gradient(to_bottom,black,transparent)]\" style={{ opacity }} />\n    <div className=\"absolute inset-0 bg-linear-to-b from-background-primary-default to-transparent\" style={{ opacity }} />\n  </div>;\n}\n\nfunction GridFilters<T>({ columns, options, filters, onChange }: {\n  columns: readonly DataGridColumn<T>[]; options: Record<string, readonly string[]>; filters: Record<string, string>; onChange: (filters: Record<string, string>) => void;\n}) {\n  const [columnKey, setColumnKey] = useState(columns[0]?.key);\n  const [search, setSearch] = useState(\"\");\n  const [scrollTop, setScrollTop] = useState(0);\n  const scrollRef = useRef<HTMLDivElement>(null);\n  const column = columns.find((item) => item.key === columnKey) ?? columns[0];\n  function changeFilter(value?: string) {\n    if (!column) return;\n    const next = { ...filters };\n    if (value === undefined) delete next[column.key]; else next[column.key] = value;\n    onChange(next);\n  }\n  return <div className=\"flex flex-col gap-2\">\n    {column ? <>\n      <SegmentedControl aria-label=\"Filter column\" selectedKeys={[column.key]} className=\"w-full flex-wrap\" onSelectionChange={(keys) => {\n        const key = Array.from(keys)[0];\n        if (key !== undefined) setColumnKey(String(key) as DataGridColumn<T>[\"key\"]);\n        setSearch(\"\"); setScrollTop(0); if (scrollRef.current) scrollRef.current.scrollTop = 0;\n      }}>{columns.map((item) => <SegmentedControlItem key={item.key} id={item.key} className=\"flex-1 gap-1.5\">{item.header}{filters[item.key] !== undefined && <span aria-label=\"Filtered\" className=\"size-1.5 rounded-full bg-accent-500\" />}</SegmentedControlItem>)}</SegmentedControl>\n      <Input aria-label={`Search ${column.header} filters`} placeholder={`Search ${column.header.toLowerCase()}`} value={search} onChange={(value) => { setSearch(value); if (scrollRef.current) scrollRef.current.scrollTop = 0; setScrollTop(0); }} leadingIcon={RiSearchLine} size=\"small\" className=\"px-1\" fieldClassName=\"bg-background-secondary-default\" />\n      <div className=\"relative\">\n        <div ref={scrollRef} aria-label={`${column.header} filter values`} className=\"flex max-h-64 flex-col gap-0.5 overflow-y-auto [scrollbar-width:thin]\" onScroll={(event) => setScrollTop(event.currentTarget.scrollTop)}>\n          <DropdownItem className={compactMenuItem} selected={filters[column.key] === undefined} onSelect={() => changeFilter()}><span className=\"flex-1\">All {column.header.toLowerCase()}</span>{filters[column.key] === undefined && <RiCheckLine className=\"size-4\" aria-hidden />}</DropdownItem>\n          {options[column.key].filter((option) => option.toLocaleLowerCase().includes(search.toLocaleLowerCase())).map((option) => <DropdownItem key={option} className={compactMenuItem} selected={filters[column.key] === option} onSelect={() => changeFilter(option)}><span className=\"min-w-0 flex-1 truncate\">{option || \"Empty\"}</span>{filters[column.key] === option && <RiCheckLine className=\"size-4 shrink-0\" aria-hidden />}</DropdownItem>)}\n        </div>\n        <GridScrollFade scrollTop={scrollTop} />\n      </div>\n    </> : <p className=\"p-2 text-body-2-regular text-text-secondary\">Add filterable columns to enable filters.</p>}\n    {Object.keys(filters).length > 0 && <div className=\"border-t border-separator-border pt-1\"><Button variant=\"ghost\" size=\"small\" className={cx(neutralButton, \"w-full\")} onClick={() => onChange({})}>Clear filters</Button></div>}\n  </div>;\n}\n\nfunction GridEditor<T>({ column, row, autoFocus = true, onCommit, onCancel }: {\n  column: DataGridColumn<T>; row: T; autoFocus?: boolean; onCommit: (value: string, move?: number) => boolean; onCancel: () => void;\n}) {\n  const [value, setValue] = useState(String(row[column.key] ?? \"\"));\n  const input = useRef<HTMLInputElement>(null);\n  const finished = useRef(false);\n  useEffect(() => { if (autoFocus) { input.current?.focus(); input.current?.select(); } }, [autoFocus]);\n  function finish(move?: number) {\n    if (column.type === \"select\") { onCommit(String(row[column.key] ?? \"\"), move); return; }\n    if (finished.current) return;\n    finished.current = onCommit(value, move);\n  }\n  function keyDown(event: KeyboardEvent) {\n    event.stopPropagation();\n    if (event.key === \"Escape\") { event.preventDefault(); finished.current = true; onCancel(); }\n    else if (event.key === \"Enter\" && column.type !== \"select\") { event.preventDefault(); finish(event.shiftKey ? -1 : 1); }\n    else if (event.key === \"Tab\") { event.preventDefault(); finish(event.shiftKey ? -2 : 2); }\n  }\n  return (\n    <div className=\"h-full w-full\" onKeyDown={keyDown} onPointerDown={(event) => event.stopPropagation()}>\n      {column.type === \"select\" ? (\n        <Select aria-label={`Edit ${column.header}`} selectedKey={String(row[column.key] ?? \"\")} autoFocus={autoFocus} size=\"sm\" className=\"h-full\" popoverClassName=\"p-1\" triggerClassName=\"h-full rounded-none border-0 bg-transparent px-2.5 text-body-regular shadow-none hover:bg-transparent focus-visible:ring-0 focus-visible:ring-offset-0\" onSelectionChange={(key) => {\n          if (key !== null) { finished.current = true; onCommit(String(key)); }\n        }}>\n          {(column.options ?? []).map((option) => <SelectItem key={option} id={option} className=\"text-body-regular\">{option}</SelectItem>)}\n        </Select>\n      ) : (\n        <Input ref={input} aria-label={`Edit ${column.header}`} value={value} onChange={setValue} type={column.type === \"number\" ? \"number\" : \"text\"} onBlur={() => finish()} className=\"h-full\" fieldClassName=\"h-full rounded-none bg-transparent px-1.5 ring-0\" />\n      )}\n    </div>\n  );\n}\n\n/** Spreadsheet-style grid with fixed-height row virtualization and source-owned controls. */\nexport function DataGrid<T extends object>({\n  \"aria-label\": label, data, columns, getRowId, onDataChange, height = 396, className,\n  exportFileName = \"data-grid.csv\", emptyState = \"No matching rows. Try another search or clear your filters.\",\n}: DataGridProps<T>) {\n  const direction = useDirection();\n  const reducedMotion = useReducedMotion();\n  const id = useId();\n  const gridRef = useRef<HTMLDivElement>(null);\n  const bodyRef = useRef<HTMLDivElement>(null);\n  const headerRef = useRef<HTMLDivElement>(null);\n  const summaryRef = useRef<HTMLDivElement>(null);\n  const [query, setQuery] = useState(\"\");\n  const [filters, setFilters] = useState<Record<string, string>>({});\n  const [hidden, setHidden] = useState<Set<string>>(new Set());\n  const [widths, setWidths] = useState<Record<string, number>>({});\n  const [sort, setSort] = useState<{ key: string; descending: boolean } | null>(null);\n  const [compact, setCompact] = useState(false);\n  const [scrollTop, setScrollTop] = useState(0);\n  const [viewportWidth, setViewportWidth] = useState(0);\n  const [range, setRange] = useState<Range | null>(() => {\n    if (!data.length || !columns.length) return null;\n    const cell = { rowId: getRowId(data[0]), columnKey: columns[0].key };\n    return { anchor: cell, focus: cell };\n  });\n  const [selectedRows, setSelectedRows] = useState<Set<string>>(new Set());\n  const [editing, setEditing] = useState<GridCell | null>(null);\n  const [history, setHistory] = useState<{ undo: GridTransaction<T>[]; redo: GridTransaction<T>[] }>({ undo: [], redo: [] });\n  const [message, setMessage] = useState(\"\");\n  const [errorMessage, setErrorMessage] = useState(\"\");\n  const rowHeight = compact ? 36 : 44;\n  useEffect(() => {\n    const body = bodyRef.current;\n    if (!body) return;\n    const observer = new ResizeObserver(([entry]) => setViewportWidth(entry.contentRect.width));\n    observer.observe(body);\n    return () => observer.disconnect();\n  }, []);\n  const visibleColumns = useMemo(() => columns.filter((column) => !hidden.has(column.key)), [columns, hidden]);\n  const rows = useMemo(() => {\n    const search = query.trim().toLocaleLowerCase();\n    const filtered = data.filter((row) =>\n      (!search || columns.some((column) => String(row[column.key] ?? \"\").toLocaleLowerCase().includes(search))) &&\n      columns.every((column) => filters[column.key] === undefined || String(row[column.key] ?? \"\") === filters[column.key]),\n    );\n    if (!sort) return filtered;\n    const key = sort.key as keyof T;\n    return filtered.sort((a, b) => {\n      const left = a[key], right = b[key];\n      const result = typeof left === \"number\" && typeof right === \"number\" ? left - right : String(left ?? \"\").localeCompare(String(right ?? \"\"), undefined, { numeric: true });\n      return sort.descending ? -result : result;\n    });\n  }, [data, columns, filters, query, sort]);\n  const rowIndices = useMemo(() => new Map(rows.map((row, index) => [getRowId(row), index])), [rows, getRowId]);\n  const columnIndices = useMemo(() => new Map(visibleColumns.map((column, index) => [column.key as string, index])), [visibleColumns]);\n  const bounds: Bounds | null = useMemo(() => {\n    if (!range) return null;\n    const a = rowIndices.get(range.anchor.rowId), b = rowIndices.get(range.focus.rowId);\n    const c = columnIndices.get(range.anchor.columnKey), d = columnIndices.get(range.focus.columnKey);\n    return a === undefined || b === undefined || c === undefined || d === undefined ? null : {\n      top: Math.min(a, b), bottom: Math.max(a, b), start: Math.min(c, d), end: Math.max(c, d),\n    };\n  }, [range, rowIndices, columnIndices]);\n  const columnWidths = visibleColumns.map((column) => widths[column.key] ?? column.width ?? 160);\n  const freezeFirstColumn = viewportWidth === 0 || viewportWidth >= GUTTER + (columnWidths[0] ?? 0) + Math.max(96,...columnWidths.slice(1));\n  const totalWidth = GUTTER + columnWidths.reduce((sum, width) => sum + width, 0);\n  const rowStyle: CSSProperties = { gridTemplateColumns: `${GUTTER}px ${columnWidths.map((width) => `${width}px`).join(\" \")}`, width: totalWidth, minWidth: \"100%\" };\n  const firstRow = Math.max(0, Math.floor(scrollTop / rowHeight) - OVERSCAN);\n  const lastRow = Math.min(rows.length, Math.ceil((scrollTop + height) / rowHeight) + OVERSCAN);\n  const filterCount = Object.keys(filters).length;\n  const visibleSelected = rows.reduce((count, row) => count + Number(selectedRows.has(getRowId(row))), 0);\n  const filterColumns = columns.filter((column) => column.filterable || column.type === \"select\");\n  const filterOptions = useMemo(() => Object.fromEntries(columns.filter((column) => column.filterable || column.type === \"select\").map((column) => [column.key, column.options ?? Array.from(new Set(data.map((row) => String(row[column.key] ?? \"\")))).sort()])), [columns, data]);\n  const summaries = useMemo(() => Object.fromEntries(visibleColumns.map((column) => {\n    if (!column.summary) return [column.key, null];\n    const values = rows.map((row) => row[column.key]).filter((value): value is T[Extract<keyof T, string>] & number => typeof value === \"number\" && Number.isFinite(value));\n    const sum = values.reduce((total, value) => total + value, 0);\n    return [column.key, column.summary === \"count\" ? rows.length : column.summary === \"average\" ? (values.length ? sum / values.length : null) : sum];\n  })), [rows, visibleColumns]);\n  const selectionStats = useMemo(() => {\n    if (!bounds) return { count: 0, sum: null as number | null, average: null as number | null };\n    let count = 0, sum = 0, numbers = 0;\n    for (let r = bounds.top; r <= bounds.bottom; r++) for (let c = bounds.start; c <= bounds.end; c++) {\n      const value = rows[r][visibleColumns[c].key];\n      if (value !== null && value !== undefined && value !== \"\") count++;\n      if (typeof value === \"number\" && Number.isFinite(value)) { sum += value; numbers++; }\n    }\n    return { count, sum: numbers ? sum : null, average: numbers ? sum / numbers : null };\n  }, [bounds, rows, visibleColumns]);\n  const focusRow = range ? rowIndices.get(range.focus.rowId) : undefined;\n  const focusColumn = range ? columnIndices.get(range.focus.columnKey) : undefined;\n  useEffect(() => {\n    if (!freezeFirstColumn && focusColumn === 0 && bodyRef.current) bodyRef.current.scrollLeft = 0;\n  }, [freezeFirstColumn, focusColumn]);\n  const cellId = (r: number, c: number) => `${id}-cell-${r}-${c}`;\n  const activeId = focusRow !== undefined && focusColumn !== undefined && focusRow >= firstRow && focusRow < lastRow ? cellId(focusRow, focusColumn) : undefined;\n  const selectionAddress = bounds ? `${columnLetter(bounds.start)}${bounds.top + 1}${bounds.top !== bounds.bottom || bounds.start !== bounds.end ? `:${columnLetter(bounds.end)}${bounds.bottom + 1}` : \"\"}` : \"—\";\n\n  function resetScroll() {\n    if (bodyRef.current) bodyRef.current.scrollTop = 0;\n    setScrollTop(0);\n    setEditing(null);\n    setErrorMessage(\"\");\n  }\n\n  function selectCell(r: number, c: number, extend = false) {\n    if (!rows.length || !visibleColumns.length) return;\n    r = Math.max(0, Math.min(rows.length - 1, r));\n    c = Math.max(0, Math.min(visibleColumns.length - 1, c));\n    const cell = { rowId: getRowId(rows[r]), columnKey: visibleColumns[c].key };\n    setRange((previous) => ({ anchor: extend && previous && bounds ? previous.anchor : cell, focus: cell }));\n    setErrorMessage(\"\");\n    gridRef.current?.focus({ preventScroll: true });\n    const body = bodyRef.current;\n    if (body) {\n      const top = r * rowHeight;\n      if (top < body.scrollTop) body.scrollTop = top;\n      else if (top + rowHeight > body.scrollTop + body.clientHeight) body.scrollTop = top + rowHeight - body.clientHeight;\n      if (c > 0 || !freezeFirstColumn) {\n        const start = GUTTER + columnWidths.slice(0, c).reduce((sum, width) => sum + width, 0);\n        const offset = Math.abs(body.scrollLeft);\n        const frozenWidth = GUTTER + (freezeFirstColumn ? columnWidths[0] : 0);\n        if (start < offset + frozenWidth) body.scrollLeft = (direction === \"rtl\" ? -1 : 1) * Math.max(0, start - frozenWidth);\n        else if (start + columnWidths[c] > offset + body.clientWidth) body.scrollLeft = (direction === \"rtl\" ? -1 : 1) * (start + columnWidths[c] - body.clientWidth);\n      }\n    }\n  }\n\n  function commitEdits(edits: GridEdit<T>[]) {\n    if (!onDataChange || !edits.length) return;\n    onDataChange(applyGridEdits(data, getRowId, edits));\n    setHistory((previous) => ({ undo: [...previous.undo.slice(-99), { type: \"edit\", edits }], redo: [] }));\n    setMessage(`${edits.length.toLocaleString()} ${edits.length === 1 ? \"cell updated\" : \"cells updated\"}.`);\n    setErrorMessage(\"\");\n  }\n\n  function travelHistory(undo: boolean) {\n    const source = undo ? history.undo : history.redo;\n    const transaction = source.at(-1);\n    if (!transaction || !onDataChange) return;\n    // External updates must not be overwritten by an old local history entry.\n    const current = new Map(data.map((row) => [getRowId(row), row]));\n    const stale = transaction.type === \"edit\"\n      ? transaction.edits.some((edit) => !current.has(edit.rowId) || !Object.is(current.get(edit.rowId)![edit.key], undo ? edit.after : edit.before))\n      : transaction.rows.some(({ row }) => undo ? current.has(getRowId(row)) : current.get(getRowId(row)) !== row);\n    if (stale) {\n      setHistory({ undo: [], redo: [] });\n      setMessage(\"The data changed outside this grid. Change history has been cleared.\");\n      return;\n    }\n    if (transaction.type === \"edit\") onDataChange(applyGridEdits(data, getRowId, transaction.edits, undo));\n    else if (undo) {\n      const next = [...data];\n      for (const { row, index } of transaction.rows) next.splice(Math.min(index, next.length), 0, row);\n      onDataChange(next);\n    } else {\n      const removed = new Set(transaction.rows.map(({ row }) => getRowId(row)));\n      onDataChange(data.filter((row) => !removed.has(getRowId(row))));\n    }\n    setHistory((previous) => undo ? { undo: previous.undo.slice(0, -1), redo: [...previous.redo, transaction] } : { undo: [...previous.undo, transaction], redo: previous.redo.slice(0, -1) });\n    setEditing(null);\n    setMessage(undo ? \"Change undone.\" : \"Change redone.\");\n    setErrorMessage(\"\");\n  }\n\n  function startEditing(r = focusRow ?? 0, c = focusColumn ?? 0) {\n    if (!onDataChange || !rows[r] || !visibleColumns[c] || visibleColumns[c].editable === false) return;\n    selectCell(r, c);\n    setEditing({ rowId: getRowId(rows[r]), columnKey: visibleColumns[c].key });\n    setMessage(\"\");\n  }\n\n  function commitCell(row: T, column: DataGridColumn<T>, text: string, move?: number) {\n    try {\n      const value = parseGridValue(text, column);\n      const error = column.validate?.(value, row);\n      if (error) throw new Error(error);\n      if (!Object.is(row[column.key], value)) commitEdits([{ rowId: getRowId(row), key: column.key, before: row[column.key], after: value as T[keyof T] }]);\n      setEditing(null);\n      if (move) {\n        const r = rowIndices.get(getRowId(row)) ?? 0, c = columnIndices.get(column.key) ?? 0;\n        if (Math.abs(move) === 2) {\n          const next = r * visibleColumns.length + c + (move > 0 ? 1 : -1);\n          selectCell(Math.floor(Math.max(0, next) / visibleColumns.length), Math.max(0, next) % visibleColumns.length);\n        } else selectCell(r + move, c);\n      } else gridRef.current?.focus({ preventScroll: true });\n      return true;\n    } catch (error) {\n      const message = `${column.header}: ${error instanceof Error ? error.message : \"Invalid value.\"}`;\n      setMessage(message);\n      setErrorMessage(message);\n      return false;\n    }\n  }\n\n  function keyDown(event: KeyboardEvent<HTMLDivElement>) {\n    if (event.target !== gridRef.current || editing) return;\n    const command = event.ctrlKey || event.metaKey;\n    if (command && event.key.toLowerCase() === \"z\") { event.preventDefault(); travelHistory(!event.shiftKey); return; }\n    if (command && event.key.toLowerCase() === \"y\") { event.preventDefault(); travelHistory(false); return; }\n    if (command && event.key.toLowerCase() === \"a\") {\n      event.preventDefault();\n      if (rows.length && visibleColumns.length) setRange({ anchor: { rowId: getRowId(rows[0]), columnKey: visibleColumns[0].key }, focus: { rowId: getRowId(rows[rows.length - 1]), columnKey: visibleColumns[visibleColumns.length - 1].key } });\n      return;\n    }\n    if (event.key === \"Enter\" || event.key === \"F2\") { event.preventDefault(); startEditing(); return; }\n    if (event.key === \"Escape\") { setRange(null); return; }\n    let r = focusRow ?? 0, c = focusColumn ?? 0;\n    if (event.key === \"ArrowUp\") r--;\n    else if (event.key === \"ArrowDown\") r++;\n    else if (event.key === \"ArrowLeft\") c += direction === \"rtl\" ? 1 : -1;\n    else if (event.key === \"ArrowRight\") c += direction === \"rtl\" ? -1 : 1;\n    else if (event.key === \"PageDown\") r += Math.floor(height / rowHeight);\n    else if (event.key === \"PageUp\") r -= Math.floor(height / rowHeight);\n    else if (event.key === \"Home\") { c = 0; if (command) r = 0; }\n    else if (event.key === \"End\") { c = visibleColumns.length - 1; if (command) r = rows.length - 1; }\n    else return;\n    event.preventDefault();\n    selectCell(r, c, event.shiftKey);\n  }\n\n  function copy(event: ClipboardEvent) {\n    if (event.target !== gridRef.current || !bounds || editing) return;\n    event.preventDefault();\n    event.clipboardData.setData(\"text/plain\", serializeGridRows(rows.slice(bounds.top, bounds.bottom + 1).map((row) => visibleColumns.slice(bounds.start, bounds.end + 1).map((column) => row[column.key])), \"\\t\"));\n    setMessage(`${(bounds.bottom - bounds.top + 1) * (bounds.end - bounds.start + 1)} cells copied.`);\n  }\n\n  function paste(event: ClipboardEvent) {\n    if (event.target !== gridRef.current || !onDataChange || !bounds || editing) return;\n    event.preventDefault();\n    const matrix = parseGridClipboard(event.clipboardData.getData(\"text/plain\"));\n    const edits: GridEdit<T>[] = [];\n    try {\n      for (let r = 0; r < matrix.length; r++) for (let c = 0; c < matrix[r].length; c++) {\n        const row = rows[bounds.top + r], column = visibleColumns[bounds.start + c];\n        if (!row || !column) throw new Error(\"The pasted cells extend beyond the grid.\");\n        if (column.editable === false) throw new Error(`${column.header} is read-only.`);\n        const value = parseGridValue(matrix[r][c], column);\n        const error = column.validate?.(value, row);\n        if (error) throw new Error(`${column.header}: ${error}`);\n        if (!Object.is(row[column.key], value)) edits.push({ rowId: getRowId(row), key: column.key, before: row[column.key], after: value as T[keyof T] });\n      }\n      commitEdits(edits);\n    } catch (error) { const message = `Paste cancelled. ${error instanceof Error ? error.message : \"Invalid value.\"}`; setMessage(message); setErrorMessage(message); }\n  }\n\n  function exportCsv() {\n    const exportRows = visibleSelected ? rows.filter((row) => selectedRows.has(getRowId(row))) : rows;\n    const csv = serializeGridRows([visibleColumns.map((column) => column.header), ...exportRows.map((row) => visibleColumns.map((column) => row[column.key]))]);\n    const url = URL.createObjectURL(new Blob([\"\\uFEFF\", csv], { type: \"text/csv;charset=utf-8;\" }));\n    const link = document.createElement(\"a\");\n    link.href = url; link.download = exportFileName; link.click();\n    setTimeout(() => URL.revokeObjectURL(url), 1000);\n    setMessage(`${exportRows.length.toLocaleString()} rows exported.`);\n  }\n\n  function toggleRow(rowId: string, selected: boolean) {\n    setSelectedRows((previous) => { const next = new Set(previous); if (selected) next.add(rowId); else next.delete(rowId); return next; });\n  }\n\n  async function copySelectedRows() {\n    const selected = rows.filter((row) => selectedRows.has(getRowId(row)));\n    try {\n      await navigator.clipboard.writeText(serializeGridRows(selected.map((row) => visibleColumns.map((column) => row[column.key])), \"\\t\"));\n      setMessage(`${selected.length.toLocaleString()} ${selected.length === 1 ? \"row copied\" : \"rows copied\"}.`);\n      setErrorMessage(\"\");\n    } catch { setErrorMessage(\"Could not copy rows. Allow clipboard access and try again.\"); }\n  }\n\n  function deleteSelectedRows() {\n    if (!onDataChange || !visibleSelected) return;\n    const removed = new Set(rows.filter((row) => selectedRows.has(getRowId(row))).map(getRowId));\n    const deleted = data.flatMap((row, index) => removed.has(getRowId(row)) ? [{ row, index }] : []);\n    onDataChange(data.filter((row) => !removed.has(getRowId(row))));\n    setHistory((previous) => ({ undo: [...previous.undo.slice(-99), { type: \"delete\", rows: deleted }], redo: [] }));\n    setSelectedRows((previous) => new Set([...previous].filter((rowId) => !removed.has(rowId))));\n    setRange((previous) => previous && (removed.has(previous.anchor.rowId) || removed.has(previous.focus.rowId)) ? null : previous);\n    setEditing(null);\n    setErrorMessage(\"\");\n    setMessage(`${deleted.length.toLocaleString()} ${deleted.length === 1 ? \"row deleted\" : \"rows deleted\"}.`);\n  }\n\n  function resizeColumn(key: string, width: number) { setWidths((previous) => ({ ...previous, [key]: Math.max(96, Math.min(480, width)) })); }\n  function stickyStyle(c: number): CSSProperties | undefined { return c === 0 && freezeFirstColumn ? { insetInlineStart: GUTTER } : undefined; }\n  // Isolate content layers so scrolling text and editors stay below frozen cells.\n  const cellClass = (c: number) => cx(\"relative isolate flex min-w-0 items-center border-e border-border-table px-3 text-body-regular text-text-primary\", c === 0 && freezeFirstColumn && \"sticky z-10 bg-background-primary-default\");\n\n  return (\n    <div dir={direction} data-data-grid className={cx(\"w-full min-w-0 overflow-hidden rounded-2xl border border-border-button-default bg-background-primary-default\", className)}>\n      <div data-grid-toolbar className=\"grid border-b border-border-table px-2 py-[7px]\">\n        <AnimatePresence initial={false}>\n        {visibleSelected > 0 ? <GridToolbarContent key=\"selection\">\n          <div className=\"flex min-h-10 min-w-0 items-center gap-2\">\n            <span className=\"text-body-medium text-text-primary\">{visibleSelected.toLocaleString()} {visibleSelected === 1 ? \"row selected\" : \"rows selected\"}</span>\n            <TooltipTrigger><Focusable><CloseButton size=\"2xs\" aria-label=\"Clear row selection\" onClick={() => setSelectedRows(new Set())} /></Focusable><Tooltip>Clear row selection</Tooltip></TooltipTrigger>\n          </div>\n          <div className=\"ms-auto flex items-center gap-1.5\">\n            <GridAction label=\"Delete selected rows\" icon={RiDeleteBinLine} disabled={!onDataChange} onClick={deleteSelectedRows} />\n            <GridAction label=\"Copy selected rows\" icon={RiFileCopyLine} onClick={copySelectedRows} />\n            <GridAction label=\"Export\" icon={RiDownload2Line} onClick={exportCsv} />\n          </div>\n        </GridToolbarContent> : <GridToolbarContent key=\"default\">\n          <div className=\"order-1 flex min-h-10 shrink-0 flex-col justify-center\">\n            <span className=\"whitespace-nowrap text-body-medium text-text-tertiary\">Total Results</span>\n            <span data-grid-row-count className=\"whitespace-nowrap text-body-medium text-text-primary\">{rows.length.toLocaleString()} {rows.length === 1 ? \"row\" : \"rows\"}</span>\n          </div>\n          <div className=\"order-3 ms-auto flex basis-full flex-wrap items-center justify-end gap-1.5 sm:order-2 sm:basis-auto sm:flex-1 sm:flex-nowrap\">\n            <TooltipTrigger><Focusable><Button variant=\"secondary\" size=\"small\" iconOnly leadingIcon={RiArrowGoBackLine} aria-label=\"Undo edit\" disabled={!history.undo.length || !onDataChange} onClick={() => travelHistory(true)} /></Focusable><Tooltip>Undo</Tooltip></TooltipTrigger>\n            <TooltipTrigger><Focusable><Button variant=\"secondary\" size=\"small\" iconOnly leadingIcon={RiArrowGoForwardLine} aria-label=\"Redo edit\" disabled={!history.redo.length || !onDataChange} onClick={() => travelHistory(false)} /></Focusable><Tooltip>Redo</Tooltip></TooltipTrigger>\n            <div className=\"mx-1 h-5 w-px bg-separator-border\" />\n            <Dropdown>\n              <GridMenuTrigger label=\"Filter\" icon={RiFilter3Line} count={filterCount} />\n              <DropdownPopover aria-label=\"Filter rows\" className=\"w-72 p-1\" dialogClassName=\"gap-0.5\">\n                <GridFilters columns={filterColumns} options={filterOptions} filters={filters} onChange={(next) => { setFilters(next); resetScroll(); }} />\n              </DropdownPopover>\n            </Dropdown>\n            <Dropdown>\n              <GridMenuTrigger label=\"Columns\" icon={RiLayoutColumnLine} />\n              <DropdownPopover aria-label=\"Visible columns\" className=\"p-1\" dialogClassName=\"gap-0.5\">\n                <DropdownGroup label=\"Visible columns\">\n                  {columns.map((column) => <Checkbox key={column.key} isSelected={!hidden.has(column.key)} isDisabled={!hidden.has(column.key) && visibleColumns.length === 1} className=\"rounded-lg px-2 py-1.5 hover:bg-background-secondary-hover\" onChange={(selected) => {\n                    setHidden((previous) => { const next = new Set(previous); if (selected) next.delete(column.key); else next.add(column.key); return next; }); setEditing(null);\n                  }}>{column.header}</Checkbox>)}\n                </DropdownGroup>\n              </DropdownPopover>\n            </Dropdown>\n            <Dropdown>\n              <GridMenuTrigger label=\"Row density\" icon={RiLayoutRowLine} />\n              <DropdownPopover aria-label=\"Row density\" className=\"w-48 p-1\" dialogClassName=\"gap-0.5\">\n                <DropdownGroup>{[false, true].map((dense) => <DropdownItem key={String(dense)} className={compactMenuItem} selected={compact === dense} onSelect={() => { setCompact(dense); resetScroll(); }}><span className=\"flex-1\">{dense ? \"Compact\" : \"Comfortable\"}</span>{compact === dense && <RiCheckLine className=\"size-4\" aria-hidden />}</DropdownItem>)}</DropdownGroup>\n              </DropdownPopover>\n            </Dropdown>\n            <TooltipTrigger><Focusable><Button variant=\"secondary\" size=\"small\" iconOnly leadingIcon={RiDownload2Line} aria-label=\"Export\" disabled={!rows.length} onClick={exportCsv} /></Focusable><Tooltip>Export</Tooltip></TooltipTrigger>\n          </div>\n          <Input aria-label={`Search ${label}`} placeholder=\"Search\" leadingIcon={RiSearchLine} value={query} onChange={(value) => { setQuery(value); resetScroll(); }} className=\"order-2 ms-auto w-40 min-w-24 flex-1 sm:order-3 sm:w-56 sm:flex-none\" fieldClassName=\"rounded-full bg-background-secondary-default ring-0\" />\n        </GridToolbarContent>}\n        </AnimatePresence>\n      </div>\n\n      <div ref={gridRef} role=\"grid\" aria-label={label} aria-rowcount={rows.length + 1} aria-colcount={visibleColumns.length + 1} aria-multiselectable aria-readonly={!onDataChange} aria-activedescendant={activeId} aria-describedby={`${id}-instructions`} tabIndex={0} onKeyDown={keyDown} onCopy={copy} onPaste={paste} onFocus={(event) => { if (event.target === event.currentTarget && !range && rows.length) selectCell(0, 0); }} className=\"outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-border-focus-ring\">\n        <p id={`${id}-instructions`} className=\"sr-only\">Use arrow keys to navigate, Shift and arrows to select cells, and Enter or F2 to edit. Copy and paste cells with your keyboard. Column headings sort; column separators resize with arrow keys.</p>\n        <div ref={headerRef} role=\"rowgroup\" className=\"overflow-hidden border-b border-border-table bg-background-secondary-default\">\n          <div role=\"row\" aria-rowindex={1} className=\"grid h-10\" style={rowStyle}>\n            <div role=\"columnheader\" aria-colindex={1} className=\"sticky start-0 z-20 flex items-center justify-center border-e border-border-table bg-background-secondary-default\">\n              <Checkbox aria-label=\"Select all filtered rows\" isSelected={rows.length > 0 && visibleSelected === rows.length} isIndeterminate={visibleSelected > 0 && visibleSelected < rows.length} isDisabled={!rows.length} onChange={(selected) => { setSelectedRows((previous) => { const next = new Set(previous); for (const row of rows) { if (selected) next.add(getRowId(row)); else next.delete(getRowId(row)); } return next; }); }} />\n            </div>\n            {visibleColumns.map((column, c) => (\n              <div key={column.key} role=\"columnheader\" aria-colindex={c + 2} aria-sort={sort?.key === column.key ? sort.descending ? \"descending\" : \"ascending\" : \"none\"} className={cx(cellClass(c), \"group bg-background-secondary-default px-0\")} style={stickyStyle(c)}>\n                <button type=\"button\" className={cx(\"flex h-full min-w-0 flex-1 items-center gap-2 px-3 text-body-medium text-text-secondary outline-none hover:text-text-primary focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-border-focus-ring\", (column.align === \"end\" || (column.align === undefined && column.type === \"number\")) && \"justify-end\")} onClick={() => { setSort((previous) => previous?.key === column.key ? previous.descending ? null : { key: column.key, descending: true } : { key: column.key, descending: false }); resetScroll(); }}>\n                  <span className=\"truncate\">{column.header}</span>\n                  {sort?.key === column.key && (sort.descending ? <RiArrowDownLine className=\"size-3.5 shrink-0\" aria-hidden /> : <RiArrowUpLine className=\"size-3.5 shrink-0\" aria-hidden />)}\n                </button>\n                <div role=\"separator\" aria-label={`Resize ${column.header}`} aria-orientation=\"vertical\" aria-valuemin={96} aria-valuemax={480} aria-valuenow={columnWidths[c]} tabIndex={0} className=\"absolute inset-y-0 -end-1 z-20 w-2 cursor-col-resize outline-none hover:bg-accent-200 focus-visible:bg-accent-200\" onDoubleClick={() => resizeColumn(column.key, column.width ?? 160)} onKeyDown={(event) => {\n                  if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") { event.preventDefault(); event.stopPropagation(); resizeColumn(column.key, columnWidths[c] + (event.key === (direction === \"rtl\" ? \"ArrowLeft\" : \"ArrowRight\") ? 16 : -16)); }\n                }} onPointerDown={(event) => {\n                  event.preventDefault(); const handle = event.currentTarget, start = event.clientX, width = columnWidths[c]; handle.setPointerCapture(event.pointerId);\n                  const move = (next: PointerEvent) => resizeColumn(column.key, width + (next.clientX - start) * (direction === \"rtl\" ? -1 : 1));\n                  const stop = () => { handle.removeEventListener(\"pointermove\", move); handle.removeEventListener(\"lostpointercapture\", stop); };\n                  handle.addEventListener(\"pointermove\", move); handle.addEventListener(\"lostpointercapture\", stop);\n                }} />\n              </div>\n            ))}\n          </div>\n        </div>\n        <div className=\"relative\">\n          <motion.div layoutScroll ref={bodyRef} data-grid-scroll role=\"rowgroup\" style={{ height }} onScroll={(event) => {\n            const body = event.currentTarget; setScrollTop(body.scrollTop);\n            if (headerRef.current) headerRef.current.scrollLeft = body.scrollLeft;\n            if (summaryRef.current) summaryRef.current.scrollLeft = body.scrollLeft;\n          }} className=\"overflow-auto overscroll-contain [scrollbar-width:thin]\">\n            <div className=\"relative\" style={{ height: rows.length ? rows.length * rowHeight : height, width: totalWidth, minWidth: \"100%\" }}>\n              {rows.slice(firstRow, lastRow).map((row, index) => {\n                const r = firstRow + index, rowId = getRowId(row), rowSelected = selectedRows.has(rowId);\n                return (\n                  <div key={rowId} role=\"row\" aria-rowindex={r + 2} aria-selected={rowSelected} className=\"group/row absolute inset-x-0 grid border-b border-border-table\" style={{ ...rowStyle, top: r * rowHeight, height: rowHeight }}>\n                    <div role=\"gridcell\" aria-colindex={1} className={cx(\"sticky start-0 z-20 flex items-center justify-center border-e border-border-table bg-background-primary-default text-caption-1-regular text-text-tertiary\", rowSelected && \"bg-background-secondary-default\")}>\n                      <span aria-hidden className={cx(\"pointer-events-none group-hover/row:opacity-0 group-focus-within/row:opacity-0\", rowSelected && \"opacity-0\")}>{r + 1}</span>\n                      <Checkbox aria-label={`Select row ${r + 1}`} isSelected={rowSelected} onChange={(selected) => toggleRow(rowId, selected)} className={cx(\"absolute opacity-0 group-hover/row:opacity-100 group-focus-within/row:opacity-100\", rowSelected && \"opacity-100\")} />\n                    </div>\n                    {visibleColumns.map((column, c) => {\n                      const active = range?.focus.rowId === rowId && range.focus.columnKey === column.key;\n                      const selected = !!bounds && r >= bounds.top && r <= bounds.bottom && c >= bounds.start && c <= bounds.end;\n                      const isEditing = editing?.rowId === rowId && editing.columnKey === column.key;\n                      const showEditor = isEditing || (active && column.type === \"select\" && !!onDataChange && column.editable !== false);\n                      return (\n                        <div key={column.key} id={cellId(r, c)} role=\"gridcell\" aria-colindex={c + 2} aria-selected={selected} aria-readonly={!onDataChange || column.editable === false} data-grid-cell={`${r}:${c}`} className={cx(cellClass(c), \"cursor-cell bg-background-primary-default transition-colors duration-150 ease-out motion-reduce:transition-none\", (column.align === \"end\" || (column.align === undefined && column.type === \"number\")) && \"justify-end text-end tabular-nums\", (selected || rowSelected) && \"bg-background-secondary-default\", active && !(c === 0 && freezeFirstColumn) && \"z-5\")} style={stickyStyle(c)} onPointerDown={(event) => {\n                          if (isEditing || event.button !== 0) return;\n                          // Touch keeps native swipe scrolling; clicking still selects the cell.\n                          if (event.pointerType === \"mouse\") event.preventDefault();\n                          selectCell(r, c, event.shiftKey);\n                        }} onPointerEnter={(event) => { if (event.pointerType === \"mouse\" && event.buttons === 1 && !editing) selectCell(r, c, true); }} onDoubleClick={() => startEditing(r, c)}>\n                          {/* Keep the moving outline transparent so it never masks another cell's text. */}\n                          {active && <motion.span aria-hidden data-grid-highlight layoutId={`${id}-cell-highlight`} initial={false} transition={{ layout: reducedMotion ? { duration: 0 } : { type: \"spring\", stiffness: 480, damping: 38, mass: 0.7 } }} className=\"pointer-events-none absolute inset-0 ring-2 ring-inset ring-border-button-active\" />}\n                          {showEditor ? <div className=\"absolute inset-0.5 z-10\"><GridEditor key={isEditing ? \"editing\" : \"selected\"} column={column} row={row} autoFocus={isEditing} onCommit={(text, move) => commitCell(row, column, text, move)} onCancel={() => { setEditing(null); setErrorMessage(\"\"); gridRef.current?.focus({ preventScroll: true }); }} /></div> : <span className=\"relative z-10 truncate\" title={String(row[column.key] ?? \"\")}>{column.format ? column.format(row[column.key]) : String(row[column.key] ?? \"\")}</span>}\n                        </div>\n                      );\n                    })}\n                  </div>\n                );\n              })}\n              {!rows.length && <div className=\"flex h-full items-center p-6 text-body-regular text-text-tertiary\">{emptyState}</div>}\n            </div>\n          </motion.div>\n          <GridScrollFade scrollTop={scrollTop} />\n        </div>\n      </div>\n      <div ref={summaryRef} data-grid-summaries className=\"overflow-hidden border-t border-border-table\">\n        <div className=\"grid h-11\" style={rowStyle}>\n          <div className=\"sticky start-0 z-20 border-e border-border-table bg-background-primary-default\" />\n          {visibleColumns.map((column, c) => {\n            const summary = summaries[column.key];\n            return <div key={column.key} className={cx(cellClass(c), \"gap-2 text-body-regular text-text-tertiary\", column.summary && \"justify-end text-end tabular-nums\")} style={stickyStyle(c)}>\n              {column.summary ? <><span>{column.summary === \"average\" ? \"Avg\" : column.summary === \"sum\" ? \"Sum\" : \"Count\"}</span><span className=\"text-body-medium text-text-primary\">{summary === null ? \"—\" : column.formatSummary ? column.formatSummary(summary) : summary.toLocaleString(undefined, { maximumFractionDigits: 1 })}</span></> : null}\n            </div>;\n          })}\n        </div>\n      </div>\n      <div className=\"flex min-h-10 flex-wrap items-center justify-between gap-x-4 gap-y-1 border-t border-border-table px-4 py-2 text-body-regular text-text-tertiary\">\n        <div className=\"flex flex-wrap items-center gap-4\"><span dir=\"ltr\" className=\"min-w-8 text-body-medium text-text-primary\">{selectionAddress}</span><span>Count <span className=\"ms-1 text-text-primary\">{selectionStats.count.toLocaleString()}</span></span>{selectionStats.sum !== null && <><span>Sum <span className=\"ms-1 text-text-primary\">{selectionStats.sum.toLocaleString(undefined, { maximumFractionDigits: 1 })}</span></span><span>Avg <span className=\"ms-1 text-text-primary\">{selectionStats.average?.toLocaleString(undefined, { maximumFractionDigits: 1 })}</span></span></>}{!onDataChange && <span>Read-only</span>}</div>\n        <span role=\"status\" aria-live=\"polite\" className=\"sr-only\">{message}</span>\n      </div>\n      {errorMessage && <p role=\"alert\" className=\"border-t border-border-table px-4 py-2 text-body-2-regular text-text-error-primary\">{errorMessage}</p>}\n    </div>\n  );\n}\n",
  "src/board-native/components/application/data-table/data-table.tsx": "export*from\"../docs/examples/data-table-example.js\";\n",
  "src/board-native/components/application/docs/examples/data-grid-example.tsx": "/* Adapted from BoardUI MIT source. See board-native/LICENSE. */\n\"use client\";\n\nimport { useState } from \"react\";\nimport { RiRestartLine } from \"@remixicon/react\";\nimport { DataGrid } from \"../../data-grid/data-grid.js\";\nimport type { DataGridColumn } from \"../../data-grid/data-grid.js\";\nimport { Button } from \"../../../base/buttons/button.js\";\n\ntype Renewal = { id: string; account: string; owner: string; region: string; stage: string; seats: number; arr: number; health: number };\nconst REGIONS = [\"North America\", \"Europe\", \"Asia Pacific\", \"Latin America\"];\nconst STAGES = [\"Discovery\", \"Proposal\", \"Negotiation\", \"Committed\", \"Closed won\"];\nconst OWNERS = [\"Owen Park\", \"Tyler Hayes\", \"Marcus Johnson\", \"Daniel Kim\", \"Sarah Bennett\"];\nconst ACCOUNTS = [\"Northwind\", \"Lumen\", \"Cedar\", \"Brightline\", \"Harbor\", \"Pinecrest\", \"Atlas\", \"Summit\", \"Fieldstone\", \"Evergreen\", \"Meridian\", \"Redwood\", \"Westbridge\", \"Sterling\", \"Juniper\", \"Oakmont\"];\nconst currency = (value: number) => new Intl.NumberFormat(\"en-IN\", { style: \"currency\", currency: \"INR\", maximumFractionDigits: 0 }).format(value);\nconst compactNumber = (value: number) => new Intl.NumberFormat(\"en-IN\", { notation: \"compact\", maximumFractionDigits: 1 }).format(value);\nconst getRowId = (row: Renewal) => row.id;\nconst COLUMNS: DataGridColumn<Renewal>[] = [\n  { key: \"account\", header: \"Account\", width: 220, validate: (value) => String(value).trim() ? undefined : \"Account cannot be empty.\" },\n  { key: \"owner\", header: \"Owner\", width: 172, type: \"select\", options: OWNERS },\n  { key: \"region\", header: \"Region\", width: 172, type: \"select\", options: REGIONS },\n  { key: \"stage\", header: \"Stage\", width: 156, type: \"select\", options: STAGES },\n  { key: \"seats\", header: \"Seats\", width: 96, type: \"number\", min: 0, summary: \"sum\", formatSummary: compactNumber },\n  { key: \"arr\", header: \"ARR\", width: 148, type: \"number\", min: 0, summary: \"sum\", format: (value) => currency(Number(value)), formatSummary: (value) => `₹${compactNumber(value)}` },\n  { key: \"health\", header: \"Health\", width: 112, type: \"number\", min: 0, max: 100, summary: \"average\", format: (value) => `${value}%`, formatSummary: (value) => `${value.toFixed(1)}%` },\n];\nconst FIRST_ROWS: Omit<Renewal, \"id\" | \"account\">[] = [\n  { owner: \"Owen Park\", region: \"Latin America\", stage: \"Closed won\", seats: 40, arr: 9600, health: 49 },\n  { owner: \"Tyler Hayes\", region: \"Europe\", stage: \"Closed won\", seats: 105, arr: 37800, health: 90 },\n  { owner: \"Tyler Hayes\", region: \"Latin America\", stage: \"Proposal\", seats: 230, arr: 96600, health: 64 },\n  { owner: \"Marcus Johnson\", region: \"Asia Pacific\", stage: \"Proposal\", seats: 115, arr: 41400, health: 78 },\n  { owner: \"Daniel Kim\", region: \"Latin America\", stage: \"Committed\", seats: 10, arr: 4200, health: 72 },\n  { owner: \"Marcus Johnson\", region: \"Europe\", stage: \"Closed won\", seats: 470, arr: 169200, health: 72 },\n  { owner: \"Sarah Bennett\", region: \"Latin America\", stage: \"Discovery\", seats: 45, arr: 16200, health: 95 },\n  { owner: \"Owen Park\", region: \"Asia Pacific\", stage: \"Negotiation\", seats: 255, arr: 107100, health: 93 },\n  { owner: \"Marcus Johnson\", region: \"Europe\", stage: \"Discovery\", seats: 660, arr: 237600, health: 82 },\n];\nfunction makeRows(count: number): Renewal[] {\n  return Array.from({ length: count }, (_, i) => {\n    const seats = 10 + ((i * 73 + 19) % 640);\n    const values = FIRST_ROWS[i] ?? {\n      owner: OWNERS[(i * 3) % OWNERS.length], region: REGIONS[(i * 7) % REGIONS.length], stage: STAGES[(i * 13) % STAGES.length], seats, arr: seats * (240 + (i % 4) * 60), health: 35 + ((i * 17) % 66),\n    };\n    return { id: `renewal-${i}`, account: `${ACCOUNTS[i % ACCOUNTS.length]} ${i < ACCOUNTS.length ? \"Freight\" : `Logistics ${Math.floor(i / ACCOUNTS.length)}`}`, ...values };\n  });\n}\n\nexport function DataGridExample({ rowCount = 10000, height = 396, showTitle = true }: { rowCount?: number; height?: number; showTitle?: boolean }) {\n  const [data, setData] = useState(() => makeRows(rowCount));\n  const [resetKey, setResetKey] = useState(0);\n  const [changed, setChanged] = useState(false);\n  return (\n    <div className=\"flex w-full min-w-0 flex-col gap-4\">\n      {showTitle && <div className=\"flex items-center justify-between gap-4 px-1\">\n        <h3 className=\"text-headline-medium text-text-primary\">Renewals</h3>\n        <Button variant=\"secondary\" size=\"small\" leadingIcon={RiRestartLine} disabled={!changed} onClick={() => { setData(makeRows(rowCount)); setResetKey((key) => key + 1); setChanged(false); }}>Reset</Button>\n      </div>}\n      <DataGrid key={resetKey} aria-label=\"Renewals\" data={data} columns={COLUMNS} getRowId={getRowId} onDataChange={(next) => { setData(next); setChanged(true); }} height={height} exportFileName=\"renewals.csv\" />\n    </div>\n  );\n}\n\n",
  "src/board-native/components/application/docs/examples/data-table-example.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { useTemplateCopy } from \"../../../foundations/template-copy/template-copy.js\";\n\nimport{NativeLocalDialog}from\"../../../../NativeLocalDialog.js\";\nimport{useNativeAction}from\"../../../../NativeEnvironment.js\";\nimport{Input}from\"../../../base/input/input.js\";\nimport{Button}from\"../../../base/buttons/button.js\";\nimport { useMemo, useState } from \"react\";\nimport {\n  RiArchiveLine,\n  RiDeleteBin6Line,\n  RiDownload2Line,\n  RiEditLine,\n  RiFileCopyLine,\n  RiMore2Fill,\n  RiSearchLine,\n  RiUserLine,\n} from \"@remixicon/react\";\nimport { Focusable } from \"react-aria-components\";\nimport {\n  flexRender,\n  getCoreRowModel,\n  getPaginationRowModel,\n  getSortedRowModel,\n  useReactTable,\n} from \"@tanstack/react-table\";\nimport type { ColumnDef, PaginationState, SortingState } from \"@tanstack/react-table\";\nimport { Avatar } from \"../../../base/avatar/avatar.js\";\nimport { Chip } from \"../../../base/badges/chip.js\";\nimport { StatusDot } from \"../../../base/badges/status-dot.js\";\nimport { IconButton } from \"../../../base/buttons/icon-button.js\";\nimport { Checkbox } from \"../../../base/checkbox/checkbox.js\";\nimport {\n  Dropdown,\n  DropdownGroup,\n  DropdownItem,\n  DropdownPopover,\n  DropdownTrigger,\n} from \"../../../base/dropdown/dropdown.js\";\nimport { InputBase } from \"../../../base/input/input.js\";\nimport { Pagination } from \"../../../base/pagination/pagination.js\";\nimport {\n  SegmentedControl,\n  SegmentedControlItem,\n} from \"../../../base/segmented-control/segmented-control.js\";\nimport { Select, SelectItem } from \"../../../base/select/select.js\";\nimport type { SelectSize } from \"../../../base/select/select.js\";\nimport {\n  Table,\n  TableBody,\n  TableCell,\n  TableColumn,\n  TableHeader,\n  TableRow,\n} from \"../../../base/table/table.js\";\nimport type { TableSize } from \"../../../base/table/table.js\";\nimport { Tooltip, TooltipTrigger } from \"../../../base/tooltip/tooltip.js\";\nimport { ChevronSortDown } from \"../../../foundations/icons/chevrons.js\";\nimport { cx } from \"../../../../utils/cx.js\";\n\n/**\n * Advanced Data Table - the react-aria `Table` primitive rendered from a\n * @tanstack/react-table instance, styled to match the dashboard template's\n * customers table (node 3731:3201). TanStack owns sorting / pagination / row\n * selection; the price/product/region/search filters pre-filter the rows.\n */\n\ntype StatusColor = \"lime\" | \"yellow\" | \"rose\" | \"cyan\";\ntype Status = { label: string; color: StatusColor };\n\nconst STATUSES: Status[] = [\n  { label: \"Shipped\", color: \"lime\" },\n  { label: \"Delivery waiting\", color: \"yellow\" },\n  { label: \"Delivery failed\", color: \"rose\" },\n  { label: \"Confirmed\", color: \"cyan\" },\n];\n\nconst PRODUCTS = [\"Sneakers\", \"Backpack\", \"Smart watch\", \"Headphones\", \"Sunglasses\", \"Wallet\"];\nconst REGIONS = [\"North America\", \"Europe\", \"Asia\", \"Oceania\"];\nconst MONTHS = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\nconst PRICE_BUCKETS: { id: string; label: string; test: (p: number) => boolean }[] = [\n  { id: \"all\", label: \"All prices\", test: () => true },\n  { id: \"under-100\", label: \"Under $100\", test: (p) => p < 100 },\n  { id: \"100-500\", label: \"$100 – $500\", test: (p) => p >= 100 && p <= 500 },\n  { id: \"500-1000\", label: \"$500 – $1,000\", test: (p) => p > 500 && p <= 1000 },\n  { id: \"over-1000\", label: \"Over $1,000\", test: (p) => p > 1000 },\n];\n\ntype Customer = {\n  id: string;\n  name: string;\n  avatar?: string;\n  initialsColor: \"neutral\" | \"blue\";\n  purchase: \"completed\" | \"waiting\" | \"processing\";\n  status: Status;\n  product: string;\n  region: string;\n  price: number;\n  updated: string;\n  updatedTs: number;\n};\n\nconst PHOTO_PEOPLE: { name: string; avatar: string }[] = [\n  { name: \"John Clarkson\", avatar: \"/react/assets/board-native/avatars/john-clarkson.webp\" },\n  { name: \"Aspen Lubin\", avatar: \"/react/assets/board-native/avatars/aspen-lubin.webp\" },\n  { name: \"Michael Ekstrom\", avatar: \"/react/assets/board-native/avatars/michael-ekstrom.webp\" },\n  { name: \"Kianna Vaccaro\", avatar: \"/react/assets/board-native/avatars/kianna-vaccaro.webp\" },\n  { name: \"Livia Saris\", avatar: \"/react/assets/board-native/avatars/livia-saris.webp\" },\n  { name: \"Jaydon Aminoff\", avatar: \"/react/assets/board-native/avatars/jaydon-aminoff.webp\" },\n  { name: \"Maria Lubin\", avatar: \"/react/assets/board-native/avatars/maria-lubin.webp\" },\n  { name: \"Ann Press\", avatar: \"/react/assets/board-native/avatars/ann-press.webp\" },\n];\n\nconst FIRST_NAMES = [\"Marcus\", \"Cheyenne\", \"Alfredo\", \"Talan\", \"Roger\", \"Cristofer\", \"Emery\", \"Kadin\", \"Nolan\", \"Ruben\", \"Skylar\", \"Hanna\", \"Corey\", \"Miracle\", \"Zaire\", \"Cooper\", \"Leilani\", \"Alena\", \"Terry\", \"Jaxson\"];\nconst LAST_NAMES = [\"Culhane\", \"Herwitz\", \"Septimus\", \"Bergson\", \"Curtis\", \"Vetrovs\", \"Rhiel\", \"Dokidis\", \"Kenter\", \"Stanton\", \"Baptista\", \"Workman\", \"Torff\", \"Calzoni\", \"Rosser\", \"Geidt\", \"Bator\", \"Vaccaro\", \"Lipshutz\", \"Botosh\"];\n\nfunction makeRng(seed: number) {\n  let a = seed;\n  return () => {\n    a |= 0;\n    a = (a + 0x6d2b79f5) | 0;\n    let t = Math.imul(a ^ (a >>> 15), 1 | a);\n    t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n    return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n  };\n}\n\nfunction formatPrice(n: number) {\n  return new Intl.NumberFormat(\"en-IN\",{style:\"currency\",currency:\"INR\",maximumFractionDigits:0}).format(n);\n}\n\nfunction initialsOf(name: string) {\n  return name\n    .split(\" \")\n    .slice(0, 2)\n    .map((part) => part[0])\n    .join(\"\")\n    .toUpperCase();\n}\n\nconst CUSTOMERS: Customer[] = (() => {\n  const rng = makeRng(42);\n  const pick = <T,>(arr: T[]) => arr[Math.floor(rng() * arr.length)];\n  return Array.from({ length: 48 }, (_, i) => {\n    const status = pick(STATUSES);\n    const purchase: Customer[\"purchase\"] =\n      rng() < 0.24\n        ? \"processing\"\n        : status.label === \"Shipped\" || status.label === \"Confirmed\"\n          ? \"completed\"\n          : \"waiting\";\n    const price = 20 + Math.floor(rng() * 3980);\n    const monthIdx = Math.floor(rng() * 12);\n    const day = 1 + Math.floor(rng() * 28);\n    const updated = `${MONTHS[monthIdx]} ${String(day).padStart(2, \"0\")}, 2026`;\n    const updatedTs = new Date(2026, monthIdx, day).getTime();\n    const base = {\n      id: String(i),\n      purchase,\n      status,\n      product: pick(PRODUCTS),\n      region: pick(REGIONS),\n      price,\n      updated,\n      updatedTs,\n    };\n    if (i < PHOTO_PEOPLE.length) {\n      return { ...base, name: PHOTO_PEOPLE[i].name, avatar: PHOTO_PEOPLE[i].avatar, initialsColor: \"neutral\" as const };\n    }\n    const name = `${pick(FIRST_NAMES)} ${pick(LAST_NAMES)}`;\n    return { ...base, name, initialsColor: rng() > 0.5 ? (\"blue\" as const) : (\"neutral\" as const) };\n  });\n})();\n\nconst PER_PAGE = 8;\n\nfunction PurchaseSelect({\n  value,\n  name,\n  size = \"md\",\n  onChange,\n}: {\n  value: Customer[\"purchase\"];\n  name: string;\n  size?: SelectSize;\n  onChange?:(value:string)=>void;\n}) {\n  const localize = useTemplateCopy();\n  return localize((\n    <Select\n      aria-label={`Purchase status for ${name}`}\n      selectedKey={value}\n      onSelectionChange={key=>onChange?.(String(key))}\n      size={size}\n      className={size === \"sm\" ? \"w-[132px]\" : \"w-[142px]\"}\n    >\n      <SelectItem id=\"completed\" textValue=\"Completed\">\n        <StatusDot color=\"green\" />\n        Completed\n      </SelectItem>\n      <SelectItem id=\"waiting\" textValue=\"Waiting\">\n        <StatusDot color=\"yellow\" />\n        Waiting\n      </SelectItem>\n      <SelectItem id=\"processing\" textValue=\"Processing\">\n        <StatusDot color=\"indigo\" />\n        Processing\n      </SelectItem>\n    </Select>\n  ));\n}\n\nfunction SortChevron({ dir }: { dir: false | \"asc\" | \"desc\" }) {\n  const localize = useTemplateCopy();\n  return localize((\n    <ChevronSortDown\n      className={cx(\n        \"size-6 shrink-0 transition-[transform,color] duration-150\",\n        dir === \"asc\" && \"rotate-180\",\n        dir ? \"text-text-secondary\" : \"text-text-tertiary\",\n      )}\n    />\n  ));\n}\n\n/** Icon-only row action with a tooltip label - `IconButton` (a plain\n *  `<button>`) is wrapped in `Focusable` so react-aria's `TooltipTrigger`\n *  can attach hover/focus behavior. */\nfunction RowActionButton({\n  icon,\n  label,\n  onClick,\n}: {\n  onClick?:()=>void;\n  icon: typeof RiEditLine;\n  label: string;\n}) {\n  const localize = useTemplateCopy();\n  return localize((\n    <TooltipTrigger delay={200}>\n      <Focusable>\n        <IconButton icon={icon} size=\"small\" aria-label={label} onClick={onClick}/>\n      </Focusable>\n      <Tooltip size=\"md\">{label}</Tooltip>\n    </TooltipTrigger>\n  ));\n}\n\nconst MORE_MENU_ACTIONS = [\n  { icon: RiUserLine, label: \"View profile\" },\n  { icon: RiFileCopyLine, label: \"Duplicate row\" },\n  { icon: RiDownload2Line, label: \"Download invoice\" },\n  { icon: RiArchiveLine, label: \"Archive customer\" },\n] as const;\n\n/** The \"⋮\" action: tooltip on hover, contextual dropdown menu on click. The\n *  trigger is styled to match `IconButton`'s small secondary recipe (nesting\n *  the real IconButton inside DropdownTrigger would nest <button>s). */\nfunction RowMoreMenu({ name,onAction }: { name: string;onAction:(label:string)=>void }) {\n  const localize = useTemplateCopy();\n  const [isOpen, setIsOpen] = useState(false);\n  return localize((\n    <Dropdown isOpen={isOpen} onOpenChange={setIsOpen}>\n      <TooltipTrigger delay={200}>\n        <DropdownTrigger\n          aria-label={`More actions for ${name}`}\n          className={cx(\n            \"relative inline-flex size-8 shrink-0 items-center justify-center rounded-2lg\",\n            \"border border-border-button-default bg-background-primary-default text-foreground-icon-primary shadow-xs\",\n            \"transition-[background-color,border-color,box-shadow,color] duration-150 ease\",\n            \"hover:border-border-button-hover hover:bg-background-primary-hover\",\n            isOpen && \"border-border-button-active bg-background-primary-active\",\n          )}\n        >\n          <RiMore2Fill className=\"size-4 shrink-0\" aria-hidden />\n        </DropdownTrigger>\n        <Tooltip size=\"md\">More actions</Tooltip>\n      </TooltipTrigger>\n      <DropdownPopover aria-label={`More actions for ${name}`} placement=\"bottom end\" className=\"w-[220px] p-2\">\n        <DropdownGroup>\n          {MORE_MENU_ACTIONS.map(({ icon: Icon, label }) => (\n            <DropdownItem key={label} onSelect={() => {setIsOpen(false);onAction(label)}} className=\"px-2 py-1.5\">\n              <Icon className=\"size-[18px] shrink-0 text-foreground-icon-secondary\" aria-hidden />\n              <span className=\"truncate text-body-medium whitespace-nowrap text-text-primary\">{label}</span>\n            </DropdownItem>\n          ))}\n        </DropdownGroup>\n      </DropdownPopover>\n    </Dropdown>\n  ));\n}\n\nexport function DataTableExample({\n  showSizeToggle = true,\n  pageSize = PER_PAGE,\n  showSearch = false,\n}: {\n  /** Show the Normal / Compact density control below the table. */\n  showSizeToggle?: boolean;\n  /** Rows per page - the landing collage shows the 5-row crop from Figma. */\n  pageSize?: number;\n  showSearch?:boolean;\n} = {}) {\n  const localize = useTemplateCopy();\n  const reportAction=useNativeAction();\n  const [customers,setCustomers]=useState<Customer[]>(()=>CUSTOMERS.map(customer=>({...customer})));\n  const [editing,setEditing]=useState<Customer|null>(null);\n  const [editName,setEditName]=useState('');\n  const [editError,setEditError]=useState('');\n  const [feedback,setFeedback]=useState('');\n  const updatePurchase=(id:string,purchase:string)=>setCustomers(rows=>rows.map(row=>row.id===id?{...row,purchase:purchase as Customer['purchase']}:row));\n  const remove=(customer:Customer)=>{setCustomers(rows=>rows.filter(row=>row.id!==customer.id));setFeedback(customer.name+' removed from this local table.');};\n  const edit=(customer:Customer)=>{setEditName(customer.name);setEditError('');setEditing(customer)};\n  const rowAction=(customer:Customer,label:string)=>{if(label==='Duplicate row'){setCustomers(rows=>[...rows,{...customer,id:'copy-'+Date.now(),name:customer.name+' (copy)'}]);setFeedback('Customer duplicated locally.');}else if(label==='Archive customer'){remove(customer)}else if(label==='Download invoice'){const url=URL.createObjectURL(new Blob(['Customer,Price\\n'+JSON.stringify(customer.name)+','+customer.price+'\\n'],{type:'text/csv'}));const anchor=document.createElement('a');anchor.href=url;anchor.download='helios-invoice-preview.csv';anchor.click();setTimeout(()=>URL.revokeObjectURL(url),1000);}else reportAction({label:customer.name,description:'Local customer preview: '+customer.name+' · '+customer.region+' · '+customer.status.label});};\n  const [sorting, setSorting] = useState<SortingState>([]);\n  const [rowSelection, setRowSelection] = useState<Record<string, boolean>>({ \"1\": true, \"2\": true });\n  const [pagination, setPagination] = useState<PaginationState>({ pageIndex: 0, pageSize });\n  const [priceFilter, setPriceFilter] = useState(\"all\");\n  const [productFilter, setProductFilter] = useState(\"all\");\n  const [regionFilter, setRegionFilter] = useState(\"all\");\n  const [query, setQuery] = useState(\"\");\n  const [size, setSize] = useState<TableSize>(\"md\");\n  const avatarSize = size === \"sm\" ? \"xs\" : \"sm\";\n\n  const data = useMemo(() => {\n    const bucket = PRICE_BUCKETS.find((b) => b.id === priceFilter) ?? PRICE_BUCKETS[0];\n    const q = query.trim().toLowerCase();\n    return customers.filter(\n      (c) =>\n        bucket.test(c.price) &&\n        (productFilter === \"all\" || c.product === productFilter) &&\n        (regionFilter === \"all\" || c.region === regionFilter) &&\n        (q === \"\" || c.name.toLowerCase().includes(q)),\n    );\n  }, [customers,priceFilter, productFilter, regionFilter, query]);\n\n  const columns = useMemo<ColumnDef<Customer>[]>(\n    () => [\n      {\n        accessorKey: \"name\",\n        header: \"Customer name\",\n        cell: ({ row }) => {\n          const c = row.original;\n          return localize((\n            <div className=\"flex min-w-0 items-center gap-2\">\n              <Checkbox\n                slot={null}\n                aria-label={`Select ${c.name}`}\n                isSelected={row.getIsSelected()}\n                onChange={(v) => row.toggleSelected(!!v)}\n              />\n              {c.avatar ? (\n                <Avatar size={avatarSize} src={c.avatar} alt=\"\" />\n              ) : (\n                <Avatar size={avatarSize} color={c.initialsColor} initials={initialsOf(c.name)} />\n              )}\n              <span className=\"truncate text-body-medium text-text-primary\">{c.name}</span>\n            </div>\n          ));\n        },\n      },\n      {\n        id: \"purchase\",\n        enableSorting: false,\n        header: \"Purchase\",\n        cell: ({ row }) => localize((\n          <PurchaseSelect value={row.original.purchase} name={row.original.name} size={size} onChange={value=>updatePurchase(row.original.id,value)}/>\n        )),\n      },\n      {\n        id: \"status\",\n        enableSorting: false,\n        header: \"Status\",\n        cell: ({ row }) => localize((\n          <Chip variant={size === \"sm\" ? \"caption\" : \"bold\"} color={row.original.status.color}>\n            {row.original.status.label}\n          </Chip>\n        )),\n      },\n      {\n        accessorKey: \"updatedTs\",\n        header: \"Last updated\",\n        cell: ({ row }) => localize((\n          <span className=\"whitespace-nowrap text-body-medium text-text-primary\">{row.original.updated}</span>\n        )),\n      },\n      {\n        accessorKey: \"price\",\n        header: \"Price\",\n        cell: ({ row }) => localize((\n          <Chip variant={size === \"sm\" ? \"caption\" : \"subtle\"} color=\"gray\">\n            {formatPrice(row.original.price)}\n          </Chip>\n        )),\n      },\n      {\n        id: \"actions\",\n        enableSorting: false,\n        header: \"Actions\",\n        cell: ({ row }) => localize((\n          <div className=\"flex items-center justify-end gap-2.5\">\n            <RowActionButton icon={RiDeleteBin6Line} label=\"Delete\" onClick={()=>remove(row.original)}/>\n            <RowActionButton icon={RiEditLine} label=\"Edit\" onClick={()=>edit(row.original)}/>\n            <RowMoreMenu name={row.original.name} onAction={label=>rowAction(row.original,label)}/>\n          </div>\n        )),\n      },\n    ],\n    [avatarSize, size, localize,customers],\n  );\n\n  const table = useReactTable({\n    data,\n    columns,\n    getRowId: (row) => row.id,\n    state: { sorting, rowSelection, pagination },\n    onSortingChange: setSorting,\n    onRowSelectionChange: setRowSelection,\n    onPaginationChange: setPagination,\n    getCoreRowModel: getCoreRowModel(),\n    getSortedRowModel: getSortedRowModel(),\n    getPaginationRowModel: getPaginationRowModel(),\n    enableRowSelection: true,\n  });\n\n  const resetPage = () => table.setPageIndex(0);\n  const headers = table.getHeaderGroups()[0].headers;\n  const rows = table.getRowModel().rows;\n  const totalPages = table.getPageCount();\n  const colWidths: Record<string, string> = {\n    name: \"w-[240px]\",\n    purchase: \"w-[172px]\",\n    status: \"w-[168px]\",\n    updatedTs: \"w-[160px]\",\n    price: \"w-[140px]\",\n    actions: \"w-[132px]\",\n  };\n\n  return localize((\n    <div className=\"flex w-full flex-col items-center gap-5\">\n    <section\n      className={cx(\n        \"flex w-full flex-col rounded-2xl border border-border-table pt-2\",\n        totalPages > 1 ? \"pb-3\" : \"pb-0\",\n      )}\n    >\n      {/* Toolbar */}\n      <div className=\"flex w-full flex-col items-start gap-3 px-3 py-1 sm:flex-row sm:items-center sm:justify-between\">\n        <div className=\"flex flex-col justify-center\">\n          <p className=\"text-body-medium whitespace-nowrap text-text-tertiary\">Total Results</p>\n          <p className=\"text-body-medium whitespace-nowrap text-text-primary\">\n            {data.length.toLocaleString()} customers\n          </p>\n        </div>\n        <div className=\"-mx-3 flex w-[calc(100%+1.5rem)] items-center gap-2.5 overflow-x-auto px-3 sm:mx-0 sm:w-auto sm:flex-wrap sm:justify-end sm:overflow-visible sm:px-0\">\n          <Select\n            aria-label=\"Filter by price\"\n            className=\"shrink-0\"\n            popoverClassName=\"min-w-40\"\n            selectedKey={priceFilter}\n            onSelectionChange={(k) => {\n              setPriceFilter(String(k));\n              resetPage();\n            }}\n          >\n            {PRICE_BUCKETS.map((b) => (\n              <SelectItem key={b.id} id={b.id} textValue={b.label}>\n                {b.label}\n              </SelectItem>\n            ))}\n          </Select>\n          <Select\n            aria-label=\"Filter by product\"\n            className=\"shrink-0\"\n            popoverClassName=\"min-w-40\"\n            selectedKey={productFilter}\n            onSelectionChange={(k) => {\n              setProductFilter(String(k));\n              resetPage();\n            }}\n          >\n            <SelectItem id=\"all\" textValue=\"All products\">\n              All products\n            </SelectItem>\n            {PRODUCTS.map((p) => (\n              <SelectItem key={p} id={p} textValue={p}>\n                {p}\n              </SelectItem>\n            ))}\n          </Select>\n          <Select\n            aria-label=\"Filter by region\"\n            className=\"shrink-0\"\n            popoverClassName=\"min-w-40\"\n            selectedKey={regionFilter}\n            onSelectionChange={(k) => {\n              setRegionFilter(String(k));\n              resetPage();\n            }}\n          >\n            <SelectItem id=\"all\" textValue=\"All regions\">\n              All regions\n            </SelectItem>\n            {REGIONS.map((r) => (\n              <SelectItem key={r} id={r} textValue={r}>\n                {r}\n              </SelectItem>\n            ))}\n          </Select>\n          {showSearch&&<InputBase\n            aria-label=\"Search customers\"\n            placeholder=\"Search\"\n            leadingIcon={RiSearchLine}\n            value={query}\n            onChange={(e) => {\n              setQuery(e.target.value);\n              resetPage();\n            }}\n            fieldClassName=\"min-w-[153px] flex-1 rounded-full bg-background-secondary-default sm:w-[153px] sm:min-w-0 sm:flex-none\"\n            className=\"text-body-medium\"\n          />}\n        </div>\n      </div>\n\n      {/* Table */}\n      <div className=\"mt-2\">\n        <Table aria-label=\"Customers\" size={size} selectionMode=\"none\" className=\"min-w-[1000px]\">\n          <TableHeader>\n            {headers.map((header) => {\n              const id = header.column.id;\n              const canSort = header.column.getCanSort();\n              const label = flexRender(header.column.columnDef.header, header.getContext());\n              return (\n                <TableColumn key={header.id} id={header.id} isRowHeader={id === \"name\"} className={colWidths[id]}>\n                  {id === \"name\" ? (\n                    <div className=\"flex items-center gap-2\">\n                      <Checkbox\n                        slot={null}\n                        aria-label=\"Select all customers on this page\"\n                        isSelected={table.getIsAllPageRowsSelected()}\n                        isIndeterminate={table.getIsSomePageRowsSelected() && !table.getIsAllPageRowsSelected()}\n                        onChange={(v) => table.toggleAllPageRowsSelected(!!v)}\n                      />\n                      <button\n                        type=\"button\"\n                        onClick={header.column.getToggleSortingHandler()}\n                        className=\"flex cursor-pointer items-center gap-0.5\"\n                      >\n                        {label}\n                        <SortChevron dir={header.column.getIsSorted()} />\n                      </button>\n                    </div>\n                  ) : canSort ? (\n                    <button\n                      type=\"button\"\n                      onClick={header.column.getToggleSortingHandler()}\n                      className=\"flex cursor-pointer items-center gap-0.5\"\n                    >\n                      {label}\n                      <SortChevron dir={header.column.getIsSorted()} />\n                    </button>\n                  ) : (\n                    label\n                  )}\n                </TableColumn>\n              );\n            })}\n          </TableHeader>\n          <TableBody\n            renderEmptyState={() => (\n              <div className=\"flex h-40 items-center justify-center text-body-medium text-text-tertiary\">\n                No customers match your filters.\n              </div>\n            )}\n          >\n            {rows.map((row) => {\n              const selected = row.getIsSelected();\n              return (\n                <TableRow\n                  key={row.id}\n                  id={row.id}\n                  style={\n                    selected\n                      ? { backgroundColor: \"var(--color-background-secondary-default)\" }\n                      : undefined\n                  }\n                >\n                  {row.getVisibleCells().map((cell) => (\n                    <TableCell key={cell.id} className={colWidths[cell.column.id]}>\n                      {flexRender(cell.column.columnDef.cell, cell.getContext())}\n                    </TableCell>\n                  ))}\n                </TableRow>\n              );\n            })}\n          </TableBody>\n        </Table>\n      </div>\n\n      {/* Pagination footer */}\n      {totalPages > 1 && (\n        <div className=\"border-t border-separator-border px-3 pt-3\">\n          <Pagination\n            page={pagination.pageIndex + 1}\n            totalPages={totalPages}\n            onChange={(p) => table.setPageIndex(p - 1)}\n          />\n        </div>\n      )}\n    </section>\n      {feedback&&<output className=\"text-body-regular text-text-secondary\" aria-live=\"polite\">{feedback}</output>}\n      <NativeLocalDialog open={!!editing}onOpenChange={()=>setEditing(null)}title=\"Edit customer\"><form onSubmit={event=>{event.preventDefault();if(!editName.trim()){setEditError('Enter a customer name.');return}setCustomers(rows=>rows.map(row=>row.id===editing?.id?{...row,name:editName.trim()}:row));setFeedback('Customer updated locally.');setEditing(null)}}className=\"flex flex-col gap-4\"><Input label=\"Customer name\"value={editName}onChange={value=>{setEditName(value);setEditError('')}}isRequired isInvalid={!!editError}hint={editError||undefined}/><Button type=\"submit\">Save customer</Button></form></NativeLocalDialog>\n      {showSizeToggle && (\n        <SegmentedControl\n          aria-label=\"Table density\"\n          selectedKeys={new Set([size])}\n          onSelectionChange={(keys) => {\n            const next = [...keys][0];\n            if (next) setSize(next as TableSize);\n          }}\n        >\n          <SegmentedControlItem id=\"md\">Normal</SegmentedControlItem>\n          <SegmentedControlItem id=\"sm\">Compact</SegmentedControlItem>\n        </SegmentedControl>\n      )}\n    </div>\n  ));\n}\n",
  "src/board-native/components/application/docs/tree-view-preview.tsx": "/* Adapted from BoardUI MIT source. See board-native/LICENSE. */\n\"use client\";\n\nimport { TreeView, TreeViewItem } from \"../../base/tree-view/tree-view.js\";\n\n/** Shared by the documentation and free component gallery. */\nexport function TreeViewPreview({ compact = false }: { compact?: boolean }) {\n  return (\n    <TreeView\n      aria-label=\"Project files\"\n      defaultExpandedKeys={[\"src\", \"components\"]}\n      defaultSelectedKeys={[\"components\"]}\n      className=\"max-w-sm\"\n    >\n      <TreeViewItem id=\"src\" label=\"src\">\n        <TreeViewItem id=\"components\" label=\"components\">\n          <TreeViewItem id=\"button\" label=\"button.tsx\" iconClassName=\"text-accent-700\" />\n          <TreeViewItem id=\"button-styles\" label=\"button.module.css\" iconClassName=\"text-chart-5-active\" />\n          {!compact && <TreeViewItem id=\"input\" label=\"input.tsx\" iconClassName=\"text-accent-700\" />}\n        </TreeViewItem>\n        {!compact && (\n          <TreeViewItem id=\"hooks\" label=\"hooks\">\n            <TreeViewItem id=\"use-theme\" label=\"use-theme.ts\" iconClassName=\"text-accent-700\" />\n            <TreeViewItem id=\"use-media-query\" label=\"use-media-query.ts\" iconClassName=\"text-accent-700\" />\n          </TreeViewItem>\n        )}\n        <TreeViewItem id=\"page\" label=\"page.tsx\" iconClassName=\"text-accent-700\" />\n      </TreeViewItem>\n      {!compact && (\n        <TreeViewItem id=\"public\" label=\"public\">\n          <TreeViewItem id=\"logo\" label=\"logo.svg\" iconClassName=\"text-chart-5-active\" />\n          <TreeViewItem id=\"favicon\" label=\"favicon.ico\" />\n        </TreeViewItem>\n      )}\n      <TreeViewItem id=\"readme\" label=\"README.md\" iconClassName=\"text-chart-1-active\" />\n      {!compact && <TreeViewItem id=\"package\" label=\"package.json\" />}\n      {!compact && <TreeViewItem id=\"tsconfig\" label=\"tsconfig.json\" />}\n    </TreeView>\n  );\n}\n\n",
  "src/board-native/components/application/settings/plan-art-flame.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { cx } from \"../../../utils/cx.js\";\n\n/**\n * The \"Current plan\" artwork (settings-plan-art.png) rendered through a WebGL\n * fragment shader as a burning, wind-torn flag:\n *\n *   wave   the image UVs ripple with two crossed sine waves plus low-freq\n *          fbm turbulence, amplitude growing toward the edges — center stays\n *          pinned like a flag on a pole, edges flap.\n *   burn   a slow-drifting fbm field is thresholded against an edge-weighted,\n *          breathing burn level: past the threshold the cloth is gone (alpha\n *          holes), just before it a hot ember rim glows orange→yellow, and\n *          just inside that the fabric chars dark.\n *   sparks tiny embers detach from burning regions and drift up-right,\n *          flickering out.\n *\n * Same raw-WebGL recipe as the effort slider's FlameOverlay (ai-chat-menus):\n * fullscreen quad, rAF loop, and a plain <img> fallback when a context can't\n * be created. The radial fade into the card bg stays as a DOM overlay above.\n */\n\nconst VERT = /* glsl */ `\nattribute vec2 a_pos;\nvarying vec2 v_uv;\nvoid main() {\n  v_uv = a_pos * 0.5 + 0.5;\n  gl_Position = vec4(a_pos, 0.0, 1.0);\n}\n`;\n\nconst FRAG = /* glsl */ `\nprecision mediump float;\nuniform sampler2D u_tex;\nuniform float u_time;\nuniform vec2 u_mouse;      // pointer in UV space (y up)\nuniform float u_mouseStr;  // 0..1, eased in JS\nvarying vec2 v_uv;\n\nfloat hash(vec2 p) {\n  return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);\n}\n\nfloat noise(vec2 p) {\n  vec2 i = floor(p);\n  vec2 f = fract(p);\n  vec2 u = f * f * (3.0 - 2.0 * f);\n  return mix(\n    mix(hash(i), hash(i + vec2(1.0, 0.0)), u.x),\n    mix(hash(i + vec2(0.0, 1.0)), hash(i + vec2(1.0, 1.0)), u.x),\n    u.y\n  );\n}\n\nfloat fbm(vec2 p) {\n  float v = 0.0;\n  float a = 0.5;\n  for (int i = 0; i < 4; i++) {\n    v += a * noise(p);\n    p = p * 2.03 + vec2(17.0, 9.2);\n    a *= 0.5;\n  }\n  return v;\n}\n\nvoid main() {\n  vec2 uv = v_uv;\n\n  // 0 at the center, 1 at the corners — drives both flap amplitude and burn.\n  float edge = clamp(distance(uv, vec2(0.5)) * 1.6, 0.0, 1.0);\n\n  // Pointer heat: a soft hotspot under the cursor that stokes the burn and\n  // agitates the cloth around it.\n  float mouseBoost = u_mouseStr * smoothstep(0.2, 0.02, distance(v_uv, u_mouse));\n\n  // Flag-in-wind: crossed sines + a pinch of turbulence, pinned at center.\n  float amp = 0.004 + 0.022 * edge * edge + 0.012 * mouseBoost;\n  uv.x += sin(uv.y * 9.0 + u_time * 2.2) * amp;\n  uv.y += sin(uv.x * 12.0 - u_time * 2.7) * amp * 0.85;\n  uv += (vec2(\n    fbm(v_uv * 3.0 + vec2(u_time * 0.35, 0.0)),\n    fbm(v_uv * 3.0 + vec2(0.0, u_time * 0.31) + 31.7)\n  ) - 0.5) * 0.03 * edge;\n\n  vec4 img = texture2D(u_tex, uv);\n\n  // Burn field: drifting noise vs an edge-weighted, breathing threshold —\n  // the pointer hotspot raises the local burn level on top.\n  float n = fbm(uv * 4.5 + vec2(u_time * 0.3, -u_time * 0.48));\n  float breathe = 0.78 + 0.22 * sin(u_time * 1.1 + n * 7.0);\n  float burn = min(edge * breathe * 0.85 + mouseBoost * 0.45, 1.05);\n  float d = n - (1.0 - burn); // > 0 → consumed\n\n  float hole = smoothstep(0.0, 0.07, d);\n  float rim = smoothstep(-0.11, 0.0, d) * (1.0 - hole);\n  float charr = smoothstep(-0.26, -0.08, d) * (1.0 - rim) * (1.0 - hole);\n\n  // Ember rim: deep orange at the outside, white-yellow right at the tear.\n  float hot = smoothstep(-0.05, 0.0, d);\n  vec3 ember = mix(vec3(1.0, 0.38, 0.08), vec3(1.0, 0.85, 0.35), hot);\n\n  vec3 col = img.rgb;\n  col = mix(col, col * vec3(0.32, 0.24, 0.22), charr * 0.75); // char darkening\n  col = mix(col, ember, rim);\n  col += ember * rim * 0.6; // rim over-glow\n\n  float alpha = img.a * (1.0 - hole);\n\n  // Burning paper flakes: three parallax layers of small rotated slivers\n  // that drift up-right while tumbling. Each has its own life cycle —\n  // ignites bright yellow-white, cools to orange, then dies out — and they\n  // only spawn near burning fabric (or under the pointer's hotspot).\n  float gate = smoothstep(0.12, 0.5, edge * breathe) + mouseBoost;\n  for (int i = 0; i < 3; i++) {\n    float fi = float(i);\n    float scale = 13.0 + fi * 8.0;\n    vec2 sp = v_uv * scale + vec2(-u_time * (0.8 + fi * 0.5), -u_time * (2.0 + fi * 1.1));\n    vec2 cell = floor(sp);\n    float sh = hash(cell + fi * 13.7);\n    if (sh > 0.7) {\n      vec2 pos = 0.2 + 0.6 * vec2(hash(cell + 3.1), hash(cell + 7.7));\n      // Tumbling sway while it floats\n      pos.x += sin(u_time * (2.0 + sh * 3.0) + sh * 20.0) * 0.08;\n      vec2 delta = fract(sp) - pos;\n      // Rotated, elongated sliver — reads as a torn paper fragment.\n      float angle = sh * 6.2831 + u_time * (1.2 + sh * 2.0);\n      vec2 r = mat2(cos(angle), -sin(angle), sin(angle), cos(angle)) * delta;\n      float body = smoothstep(0.17, 0.03, length(r * vec2(1.0, 2.6)));\n      // Life cycle: quick ignite → glow → burn out and vanish.\n      float life = fract(u_time * (0.35 + sh * 0.5) + sh * 11.0);\n      float glow = smoothstep(0.0, 0.1, life) * (1.0 - smoothstep(0.5, 0.95, life));\n      float flicker = 0.75 + 0.25 * sin(u_time * 11.0 + sh * 40.0);\n      vec3 flakeCol = mix(vec3(1.0, 0.4, 0.07), vec3(1.0, 0.93, 0.55), glow * flicker);\n      float lum = body * glow * flicker * min(gate, 1.2);\n      col += flakeCol * lum;\n      alpha = max(alpha, lum * 0.95);\n    }\n  }\n\n  gl_FragColor = vec4(col, alpha);\n}\n`;\n\n/**\n * Paints the built-in artwork — the three token-coloured blobs — into an\n * offscreen canvas so the shader has something to burn when no `src` is given.\n *\n * Exists so the component animates on its own: a CLI install ships no image,\n * and a static gradient in place of the flame made the packaged component look\n * like a different thing from the one in the templates. Colours are read from\n * the live custom properties rather than hardcoded, so it follows the theme.\n */\nfunction paintFallbackArt(size: number): HTMLCanvasElement | null {\n  const canvas = document.createElement(\"canvas\");\n  canvas.width = size;\n  canvas.height = size;\n  const ctx = canvas.getContext(\"2d\");\n  if (!ctx) return null;\n\n  const styles = getComputedStyle(document.documentElement);\n  const token = (name: string, fallback: string) =>\n    styles.getPropertyValue(name).trim() || fallback;\n\n  // Soft-edged discs, matching the DOM fallback's positions and 70% alpha.\n  // A radial gradient rather than ctx.filter = blur(): Safari leaves the\n  // filter unimplemented on some versions, and a hard disc would read as a\n  // pasted circle instead of a glow.\n  const blob = (cx: number, cy: number, r: number, color: string) => {\n    const gradient = ctx.createRadialGradient(cx, cy, 0, cx, cy, r);\n    gradient.addColorStop(0, color);\n    gradient.addColorStop(0.55, color);\n    gradient.addColorStop(1, \"transparent\");\n    ctx.fillStyle = gradient;\n    ctx.beginPath();\n    ctx.arc(cx, cy, r, 0, Math.PI * 2);\n    ctx.fill();\n  };\n\n  ctx.fillStyle = token(\"--color-background-tertiary-default\", \"#ebebeb\");\n  ctx.fillRect(0, 0, size, size);\n  ctx.globalAlpha = 0.7;\n  blob(size * 0.125, size * 0.125, size * 0.42, token(\"--color-blue-400\", \"#3392ff\"));\n  blob(size * 0.83, size * 0.58, size * 0.38, token(\"--color-lime-400\", \"#9ae600\"));\n  blob(size * 0.5, size * 0.95, size * 0.42, token(\"--color-orange-400\", \"#ff8904\"));\n  ctx.globalAlpha = 1;\n\n  return canvas;\n}\n\nexport function PlanArtFlame({ src, className }: { src?: string; className?: string }) {\n  const canvasRef = useRef<HTMLCanvasElement>(null);\n  const [failed, setFailed] = useState(false);\n\n  useEffect(() => {\n    const canvas = canvasRef.current;\n    if (!canvas) return;\n    const gl = canvas.getContext(\"webgl\", { alpha: true, premultipliedAlpha: false });\n    if (!gl) {\n      setFailed(true);\n      return;\n    }\n\n    const { width, height } = canvas.getBoundingClientRect();\n    const dpr = window.devicePixelRatio || 1;\n    canvas.width = width * dpr;\n    canvas.height = height * dpr;\n    gl.viewport(0, 0, canvas.width, canvas.height);\n\n    const compile = (type: number, source: string) => {\n      const shader = gl.createShader(type)!;\n      gl.shaderSource(shader, source);\n      gl.compileShader(shader);\n      return shader;\n    };\n    const program = gl.createProgram()!;\n    gl.attachShader(program, compile(gl.VERTEX_SHADER, VERT));\n    gl.attachShader(program, compile(gl.FRAGMENT_SHADER, FRAG));\n    gl.linkProgram(program);\n    if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n      setFailed(true);\n      return;\n    }\n    gl.useProgram(program);\n\n    const buffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]), gl.STATIC_DRAW);\n    const aPos = gl.getAttribLocation(program, \"a_pos\");\n    gl.enableVertexAttribArray(aPos);\n    gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 0, 0);\n\n    const uTime = gl.getUniformLocation(program, \"u_time\");\n    const uMouse = gl.getUniformLocation(program, \"u_mouse\");\n    const uMouseStr = gl.getUniformLocation(program, \"u_mouseStr\");\n    gl.uniform1i(gl.getUniformLocation(program, \"u_tex\"), 0);\n\n    // Pointer tracked on window (overlays sit above the canvas, so listening\n    // on the canvas itself would never fire); eased per-frame in the loop.\n    const target = { x: 0.5, y: 0.5, str: 0 };\n    const eased = { x: 0.5, y: 0.5, str: 0 };\n    const onPointerMove = (event: PointerEvent) => {\n      const rect = canvas.getBoundingClientRect();\n      const x = (event.clientX - rect.left) / rect.width;\n      const y = 1 - (event.clientY - rect.top) / rect.height; // GL y-up\n      const inside = x > -0.15 && x < 1.15 && y > -0.15 && y < 1.15;\n      if (inside) {\n        target.x = x;\n        target.y = y;\n      }\n      target.str = inside ? 1 : 0;\n    };\n    window.addEventListener(\"pointermove\", onPointerMove);\n\n    // NPOT-safe texture params (no mipmaps, clamp, linear).\n    const texture = gl.createTexture();\n    gl.activeTexture(gl.TEXTURE0);\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\n    gl.enable(gl.BLEND);\n    gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n    let raf = 0;\n    let disposed = false;\n    const start = performance.now();\n    const draw = (now: number) => {\n      gl.uniform1f(uTime, (now - start) / 1000);\n      // Ease the pointer hotspot so the heat trails the cursor smoothly.\n      eased.x += (target.x - eased.x) * 0.12;\n      eased.y += (target.y - eased.y) * 0.12;\n      eased.str += (target.str - eased.str) * 0.07;\n      gl.uniform2f(uMouse, eased.x, eased.y);\n      gl.uniform1f(uMouseStr, eased.str);\n      gl.clearColor(0, 0, 0, 0);\n      gl.clear(gl.COLOR_BUFFER_BIT);\n      gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n      raf = requestAnimationFrame(draw);\n    };\n\n    const upload = (source: TexImageSource) => {\n      gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);\n      gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);\n      raf = requestAnimationFrame(draw);\n    };\n\n    if (src) {\n      const image = new Image();\n      image.onload = () => {\n        if (disposed) return;\n        upload(image);\n      };\n      image.onerror = () => setFailed(true);\n      image.src = src;\n    } else {\n      // No artwork supplied: burn the built-in blobs instead of falling back\n      // to a static gradient.\n      const art = paintFallbackArt(512);\n      if (!art) {\n        setFailed(true);\n        return;\n      }\n      upload(art);\n    }\n\n    return () => {\n      disposed = true;\n      cancelAnimationFrame(raf);\n      window.removeEventListener(\"pointermove\", onPointerMove);\n    };\n  }, [src]);\n\n  // Only when WebGL itself is unavailable: with no `src` the shader now runs\n  // on generated artwork, so this is the no-context / broken-image path.\n  if (failed) {\n    return (\n      <div\n        aria-hidden\n        className={cx(\n          \"relative overflow-hidden bg-background-tertiary-default\",\n          className,\n        )}\n      >\n        <span className=\"absolute -top-1/4 -left-1/4 size-3/4 rounded-full bg-blue-400/70 blur-2xl\" />\n        <span className=\"absolute top-1/4 right-0 size-2/3 rounded-full bg-lime-400/70 blur-2xl\" />\n        <span className=\"absolute right-1/4 -bottom-1/4 size-3/4 rounded-full bg-orange-400/70 blur-2xl\" />\n      </div>\n    );\n  }\n  return <canvas ref={canvasRef} className={className} aria-hidden />;\n}\n",
  "src/board-native/components/application/settings/settings-general.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\nimport{useNativeLocalState,useNativeAction}from\"../../../NativeEnvironment.js\";\n\nimport { useTemplateCopy } from \"../../foundations/template-copy/template-copy.js\";\n\nimport { useState } from \"react\";\nimport { Button } from \"../../base/buttons/button.js\";\nimport { Select, SelectItem } from \"../../base/select/select.js\";\nimport { Switch } from \"../../base/switch/switch.js\";\nimport { PlanArtFlame } from \"./plan-art-flame.js\";\nimport {\n  SettingsCard,\n  SettingsRow,\n  SettingsSectionLabel,\n} from \"./settings-rows.js\";\n\n/**\n * Figma source: Board UI → \"Settings/General\" (node 4079:13037), the right\n * pane of the settings modal. Taller than the 614px modal, so the pane\n * scrolls within the shell.\n *\n * Sections, 24px apart:\n *   plan          \"Current plan\" chip, Ultra $149/mo, upgrade button, and the\n *                 artwork bleeding off the right edge under a radial fade\n *                 into the card background.\n *   limits        single row with a \"Manage limits\" button.\n *   pull requests two select rows (Review provider / PR destination).\n *   notifications four toggle rows, only \"Critical requests\" on by default.\n */\n\n/** Compact white select trigger (h 32, radius/lg) per the Figma rows. */\nconst SELECT_TRIGGER = \"h-8 w-auto gap-1 rounded-lg px-2 py-1.5\";\n\nexport function SettingsGeneral({ planArtSrc }: { planArtSrc?: string }) {\n  const reportAction=useNativeAction();\n  const localize = useTemplateCopy();\n  const [reviewProvider,setReviewProvider]=useNativeLocalState(\"settings-general.reviewProvider\",\"github\");\n  const [destination,setDestination]=useNativeLocalState(\"settings-general.destination\",\"inside\");\n  const [toggles, setToggles] = useNativeLocalState(\"settings-general.SettingsGeneral.toggles\",{\n    critical: true,\n    system: false,\n    sound: false,\n    dispatch: false,\n  });\n\n  const setToggle = (key: keyof typeof toggles) => (value: boolean) =>\n    setToggles((t) => ({ ...t, [key]: value }));\n\n  return localize((\n    <div className=\"flex w-full flex-col gap-6\">\n      {/* Current plan */}\n      <div className=\"relative w-full overflow-hidden rounded-2xl bg-background-secondary-default\">\n        {/* Artwork bleeding off the right edge, fading into the card bg.\n            Rendered through a WebGL shader: waving like a wind-torn flag with\n            a continuous burning-edge effect (see plan-art-flame.tsx). */}\n        <div aria-hidden className=\"absolute -top-[11px] start-[328px] size-[277px]\">\n          <PlanArtFlame\n            src={planArtSrc}\n            className=\"size-full object-cover\"\n          />\n          {/* Fades into the card, whatever colour that is: the stops mix the\n              card's own token rather than a hardcoded #f7f7f7, which stayed\n              white and haloed the artwork in dark mode. Mixing toward 0% of\n              the token instead of `transparent` also avoids the grey fringe\n              sRGB interpolation gives when a colour fades to rgba(0,0,0,0). */}\n          <div\n            className=\"absolute inset-0\"\n            style={{\n              background: `radial-gradient(closest-side at center,\n                color-mix(in srgb, var(--color-background-secondary-default) 0%, transparent) 13%,\n                color-mix(in srgb, var(--color-background-secondary-default) 13%, transparent) 37%,\n                color-mix(in srgb, var(--color-background-secondary-default) 85%, transparent) 86%,\n                var(--color-background-secondary-default) 100%)`,\n            }}\n          />\n        </div>\n\n        <div className=\"relative flex flex-col gap-2.5 py-3 pe-2.5 ps-3\">\n          <div className=\"flex flex-col gap-2\">\n            <span className=\"inline-flex w-fit items-center rounded-md bg-background-tertiary-default px-1.5 py-0.5 text-body-2-medium text-text-secondary\">\n              Current plan\n            </span>\n            <div className=\"flex flex-col gap-0.5\">\n              <p className=\"text-headline-medium text-text-primary\">Ultra $149/mo</p>\n              <p className=\"text-body-2-regular text-text-secondary\">\n                You are on 7x more usage than Regular.\n              </p>\n            </div>\n          </div>\n          <Button onClick={()=>reportAction({label:\"Upgrade to Max\",description:\"Indian prices are previews. Checkout is closed.\"})} variant=\"secondary\" size=\"small\" className=\"w-fit\">\n            Upgrade to Max\n          </Button>\n        </div>\n      </div>\n\n      {/* Limits */}\n      <SettingsCard>\n        <SettingsRow label=\"Limits\" description=\"You are on 7x more usage than Premium\">\n          <Button onClick={()=>reportAction({label:\"Manage limits\",description:\"Selected in this local settings preview. No external provider or account state was changed.\"})} variant=\"secondary\" size=\"small\">\n            Manage limits\n          </Button>\n        </SettingsRow>\n      </SettingsCard>\n\n      {/* Pull Requests */}\n      <div className=\"flex w-full flex-col gap-2\">\n        <SettingsSectionLabel>Pull Requests</SettingsSectionLabel>\n        <SettingsCard>\n          <SettingsRow\n            label=\"Review provider\"\n            description=\"Select Github or other providers for reviews\"\n          >\n            <Select\n              aria-label=\"Review provider\"\n              selectedKey={reviewProvider}\n              onSelectionChange={key=>setReviewProvider(String(key))}\n              triggerClassName={SELECT_TRIGGER}\n            >\n              <SelectItem id=\"github\">GitHub</SelectItem>\n              <SelectItem id=\"gitlab\">GitLab</SelectItem>\n              <SelectItem id=\"bitbucket\">Bitbucket</SelectItem>\n            </Select>\n          </SettingsRow>\n          <SettingsRow\n            label=\"PR destination\"\n            description=\"Open pull request links inside your app\"\n          >\n            <Select\n              aria-label=\"PR destination\"\n              selectedKey={destination}\n              onSelectionChange={key=>setDestination(String(key))}\n              triggerClassName={SELECT_TRIGGER}\n            >\n              <SelectItem id=\"inside\">Inside Helios UI</SelectItem>\n              <SelectItem id=\"browser\">In the browser</SelectItem>\n            </Select>\n          </SettingsRow>\n        </SettingsCard>\n      </div>\n\n      {/* Notifications */}\n      <div className=\"flex w-full flex-col gap-2\">\n        <SettingsSectionLabel>Notifications</SettingsSectionLabel>\n        <SettingsCard>\n          <SettingsRow\n            label=\"Critical requests\"\n            description=\"Get notified when the mode needs to make a critical decision\"\n          >\n            <Switch\n              aria-label=\"Critical requests\"\n              isSelected={toggles.critical}\n              onChange={setToggle(\"critical\")}\n            />\n          </SettingsRow>\n          <SettingsRow\n            label=\"System notifications\"\n            description=\"Show fundamental notifications when an agent completes a task\"\n          >\n            <Switch\n              aria-label=\"System notifications\"\n              isSelected={toggles.system}\n              onChange={setToggle(\"system\")}\n            />\n          </SettingsRow>\n          <SettingsRow\n            label=\"Completion sound\"\n            description=\"Sound effect a task is completed\"\n          >\n            <Switch\n              aria-label=\"Completion sound\"\n              isSelected={toggles.sound}\n              onChange={setToggle(\"sound\")}\n            />\n          </SettingsRow>\n          <SettingsRow\n            label=\"Dispatch alerts\"\n            description=\"Push notification on your phone when Helios UI messages you\"\n          >\n            <Switch\n              aria-label=\"Dispatch alerts\"\n              isSelected={toggles.dispatch}\n              onChange={setToggle(\"dispatch\")}\n            />\n          </SettingsRow>\n        </SettingsCard>\n      </div>\n    </div>\n  ));\n}\n",
  "src/board-native/components/application/settings/settings-modal.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\nimport{FocusScope,usePreventScroll}from\"react-aria\";\nimport{NativeEnvironmentProvider,NativeStateProvider,useNativeEnvironment,type NativeAction}from\"../../../NativeEnvironment.js\";\n\nimport { useDirection } from \"../../foundations/direction/direction.js\";\nimport { useEffect, useRef, useState, type ComponentType, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n  RiBankCardLine,\n  RiBookOpenLine,\n  RiCheckboxCircleFill,\n  RiCloseLine,\n  RiCodeBlock,\n  RiDatabase2Line,\n  RiGitMergeLine,\n  RiOrganizationChart,\n  RiPaletteLine,\n  RiPlugLine,\n  RiSchoolLine,\n  RiSettings6Line,\n  RiSettingsLine,\n  RiToolsFill,\n  RiStore2Line,\n} from \"@remixicon/react\";\nimport { cx } from \"../../../utils/cx.js\";\nimport { SettingsGeneral } from \"./settings-general.js\";\nimport { SettingsProfile } from \"./settings-profile.js\";\nimport { SettingsStorage } from \"./settings-storage.js\";\nimport { SettingsTools } from \"./settings-tools.js\";\n\n/**\n * Figma sources: Board UI → \"Settings/Profile\" (node 4081:13943) and\n * \"Settings/General\" (node 4079:13037).\n *\n * The app-wide settings modal, opened from any sidebar's \"Settings\" item.\n *\n * Shell (1:1 with Figma):\n *   backdrop  color/bg_separator — black at 20%.\n *   panel     871×614 (max-height 614), radius/3xl (24px), white, shadow/xs.\n *   rail      240px desktop / 192px compact, bg background/secondary, 1px right border, p 10 —\n *             same group/item recipe as the board-team dropdown menus\n *             (label pl-8, items p-8 radius/2lg icon-20 + body-medium),\n *             selected row bg background/secondary/hover.\n *   content   px 32, title row fixed,\n *             the page itself scrolls when taller than the shell (General).\n *\n * Open/close animation: the panel fades + blurs in from scale 0.85 (300ms),\n * the backdrop cross-fades; the same transition plays in reverse on close,\n * and the modal unmounts only after the exit transition finishes.\n */\n\nexport type SettingsPage = \"general\" | \"profile\" | \"storage\" | \"tools\" | \"marketplace\";\n\nexport interface SettingsModalProps {\n  /** Controlled open state, owned by the host page, sidebar, or menu. */\n  isOpen: boolean;\n  /** Called by the backdrop, close button, and Escape key. */\n  onClose: () => void;\n  /** Page selected each time the modal opens. */\n  defaultPage?: SettingsPage;\n  /** Optional product artwork used by the animated Current plan card. */\n  planArtSrc?: string;\n  onAction?:(action:NativeAction)=>void;\n  /** Optional marketplace pane, including its own fixed header and scroll region. */\n  marketplace?: ReactNode;\n}\n\ntype IconComponent = ComponentType<{\n  className?: string;\n  \"aria-hidden\"?: boolean | \"true\" | \"false\";\n}>;\n\ninterface NavEntry {\n  label: string;\n  icon: IconComponent;\n  /** Only pages that exist are navigable; the rest render as static rows. */\n  page?: SettingsPage;\n}\n\nconst NAV_GROUPS: { label: string; items: NavEntry[] }[] = [\n  {\n    label: \"Settings\",\n    items: [\n      { label: \"General\", icon: RiSettings6Line, page: \"general\" },\n      { label: \"Profile\", icon: RiSchoolLine, page: \"profile\" },\n      { label: \"Marketplace\", icon: RiStore2Line, page: \"marketplace\" },\n      { label: \"Appearance\", icon: RiPaletteLine },\n      { label: \"Billing\", icon: RiBankCardLine },\n      { label: \"Rules and Workflows\", icon: RiOrganizationChart },\n      { label: \"Tools\", icon: RiToolsFill, page: \"tools\" },\n      { label: \"Storage\", icon: RiDatabase2Line, page: \"storage\" },\n    ],\n  },\n  {\n    label: \"Desktop app\",\n    items: [\n      { label: \"General\", icon: RiSettingsLine },\n      { label: \"Plugins\", icon: RiPlugLine },\n      { label: \"Developer\", icon: RiCodeBlock },\n    ],\n  },\n  {\n    label: \"Customize\",\n    items: [\n      { label: \"Skills\", icon: RiBookOpenLine },\n      { label: \"Git\", icon: RiGitMergeLine },\n    ],\n  },\n];\n\nconst PAGE_TITLES: Record<SettingsPage, string> = {\n  general: \"General\",\n  profile: \"Profile\",\n  storage: \"Storage\",\n  tools: \"Tools\",\n  marketplace: \"Marketplace\",\n};\n\nexport function SettingsModal({\n  isOpen,\n  onClose,\n  defaultPage = \"general\",\n  planArtSrc,\n  onAction,\n  marketplace,\n}: SettingsModalProps) {\n  const direction = useDirection();\n  const environment=useNativeEnvironment(),settingsStore=useRef(new Map<string,unknown>()),[localAction,setLocalAction]=useState<NativeAction|null>(null);\n  const [page, setPage] = useState<SettingsPage>(defaultPage);\n\n  // Mount/visible two-phase state so both the enter and the exit play the\n  // full fade + blur + scale transition before the DOM goes away.\n  const [mounted, setMounted] = useState(false);\n  const [visible, setVisible] = useState(false);\n  const unmountTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n  const panelRef = useRef<HTMLDivElement>(null);\n  const overlayRef=useRef<HTMLDivElement>(null);\n  const returnFocusRef=useRef<HTMLElement|null>(null);\n  usePreventScroll({isDisabled:!mounted});\n  useEffect(()=>{if(!mounted)return;const changed:{element:HTMLElement;hidden:string|null;inert:boolean}[]=[];let current:HTMLElement|null=environment?.portalContainer()??overlayRef.current;while(current&&current!==document.body){const parent=current.parentElement;if(!parent)break;for(const sibling of Array.from(parent.children)){if(sibling===current||!(sibling instanceof HTMLElement)||['SCRIPT','STYLE'].includes(sibling.tagName))continue;changed.push({element:sibling,hidden:sibling.getAttribute('aria-hidden'),inert:sibling.inert});sibling.setAttribute('aria-hidden','true');sibling.inert=true;}current=parent;}return()=>{for(const{element,hidden,inert}of changed){if(hidden==null)element.removeAttribute('aria-hidden');else element.setAttribute('aria-hidden',hidden);element.inert=inert;}requestAnimationFrame(()=>{if(returnFocusRef.current?.isConnected)returnFocusRef.current.focus({preventScroll:true})});}},[mounted]);\n\n  // \"Saved\" toast — floats half-out of the panel's bottom edge for ~2s\n  // whenever a profile field commits a change (Enter / blur). Three phases\n  // so the motion is directional: it rises in from below (\"hidden\" starting\n  // offset) and keeps drifting upward while fading out (\"leaving\" offset).\n  const [savedPhase, setSavedPhase] = useState<\"hidden\" | \"shown\" | \"leaving\">(\"hidden\");\n  const savedTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n  const showSavedToast = () => {\n    if (savedTimer.current) clearTimeout(savedTimer.current);\n    setSavedPhase(\"shown\");\n    savedTimer.current = setTimeout(() => {\n      setSavedPhase(\"leaving\");\n      // Reset to the below-the-edge start once the fade-out finished, so the\n      // next save rises in from the bottom again (invisible: opacity 0 → 0).\n      savedTimer.current = setTimeout(() => setSavedPhase(\"hidden\"), 220);\n    }, 2000);\n  };\n\n  // Top fade over the scrolling page so rows dissolve under the title row\n  // instead of cutting sharply (same recipe as the medical alerts feed).\n  const [contentScrolled, setContentScrolled] = useState(false);\n\n  useEffect(() => {\n    if (isOpen) {\n      returnFocusRef.current=document.activeElement instanceof HTMLElement?document.activeElement:null;\n      if (unmountTimer.current) clearTimeout(unmountTimer.current);\n      setPage(defaultPage);\n      setMounted(true);\n      // Double rAF: the panel must commit its hidden state before the\n      // transition to visible starts, or the browser skips the animation.\n      requestAnimationFrame(() => requestAnimationFrame(() => setVisible(true)));\n    } else {\n      setVisible(false);\n      setSavedPhase(\"hidden\");\n      unmountTimer.current = setTimeout(() => setMounted(false), 320);\n    }\n    return () => {\n      if (unmountTimer.current) clearTimeout(unmountTimer.current);\n      if (savedTimer.current) clearTimeout(savedTimer.current);\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps -- defaultPage only matters at the open transition\n  }, [isOpen]);\n\n  // Escape closes; focus moves into the dialog on open.\n  useEffect(() => {\n    if (!isOpen) return;\n    const onKeyDown = (event: KeyboardEvent) => {\n      if (event.key === \"Escape\") onClose();\n    };\n    document.addEventListener(\"keydown\", onKeyDown);\n    panelRef.current?.focus();\n    return () => document.removeEventListener(\"keydown\", onKeyDown);\n  }, [isOpen, onClose]);\n\n  if (!mounted || typeof document === \"undefined\") return null;\n\n  return createPortal(\n    <NativeStateProvider store={settingsStore.current}><NativeEnvironmentProvider portalContainer={()=>environment?.portalContainer()??null}onAction={onAction??setLocalAction}><div className=\"bn-source\"style={{display:\"contents\"}}><FocusScope contain restoreFocus autoFocus><div ref={overlayRef}dir={direction} className=\"fixed inset-0 z-100 flex items-center justify-center p-4\" role=\"presentation\">\n      {/* Backdrop — dark-mode modal reference uses black at 70%. */}\n      <button\n        type=\"button\"\n        aria-label=\"Close settings\"\n        tabIndex={-1}\n        onClick={onClose}\n        className={cx(\n          \"absolute inset-0 cursor-default bg-black/70 transition-opacity duration-300 ease-out\",\n          visible ? \"opacity-100\" : \"opacity-0\",\n        )}\n      />\n\n      {/* Animated wrapper — carries the open/close transition for the panel\n          AND the saved toast, which straddles the panel's bottom edge and so\n          must live outside the panel's overflow-clip. */}\n      <div\n        className={cx(\n          \"relative\",\n          // Kept light on purpose: an 8px blur over the full 871×614 panel\n          // forces a huge re-filter every frame of the scale-down, which is\n          // what made the close stutter. 4px + GPU promotion stays smooth.\n          \"transform-gpu transition-[opacity,transform,filter] duration-300 ease-[cubic-bezier(0.32,0.72,0,1)] will-change-[opacity,transform,filter]\",\n          visible ? \"scale-100 opacity-100 blur-0\" : \"scale-[0.85] opacity-0 blur-[4px]\",\n        )}\n      >\n      {/* Panel */}\n      <div\n        ref={panelRef}\n        role=\"dialog\"\n        aria-modal=\"true\"\n        aria-label=\"Settings\"\n        tabIndex={-1}\n        className={cx(\n          \"relative flex h-[614px] max-h-[calc(100dvh-32px)] w-[871px] max-w-[calc(100vw-32px)]\",\n          // overflow-CLIP, not hidden: hidden boxes are still programmatically\n          // scrollable, so focusing a switch's hidden input in a row clipped\n          // by the inner scroller made the browser scroll-reveal it through\n          // the panel too — shifting the whole modal content up with no way\n          // back. clip forbids scrolling outright.\n          \"overflow-clip rounded-3xl bg-background-full shadow-xs outline-none\",\n        )}\n      >\n        {/* Nav rail — the board-team dropdown group/item recipe */}\n        <nav\n          aria-label=\"Settings sections\"\n          className=\"flex w-14 shrink-0 flex-col gap-5 overflow-y-auto border-e border-separator-border bg-background-secondary-default p-2.5 sm:w-48 lg:w-60\"\n        >\n          {NAV_GROUPS.map((group) => (\n            <div key={group.label} className=\"flex w-full flex-col gap-1.5 pt-1\">\n              <span className=\"hidden ps-2 text-body-medium text-text-secondary sm:block\">{group.label}</span>\n              <div className=\"flex w-full flex-col gap-1\">\n                {group.items.filter(item => item.page !== \"marketplace\" || marketplace != null).map((item) => {\n                  const selected = item.page !== undefined && item.page === page;\n                  return (\n                    <button\n                      key={`${group.label}:${item.label}`}\n                      type=\"button\"\n                      aria-label={item.label}\n                      title={item.label}\n                      aria-current={selected ? \"page\" : undefined}\n                      onClick={\n                        item.page && (item.page!==\"marketplace\"||marketplace!=null)\n                          ? () => {\n                              setPage(item.page!);\n                              setContentScrolled(false);\n                            }\n                          : ()=>{const action={label:item.label,description:\"Selected in this local settings preview. No external account or provider was changed.\"};onAction?onAction(action):setLocalAction(action)}\n                      }\n                      className={cx(\n                        \"flex w-full cursor-pointer items-center gap-2 rounded-2lg p-2 text-start\",\n                        \"outline-none transition-colors duration-150 ease focus-visible:ring-2 focus-visible:ring-border-focus-ring\",\n                        selected\n                          ? \"bg-background-secondary-hover\"\n                          : \"hover:bg-background-secondary-hover/60\",\n                      )}\n                    >\n                      <item.icon className=\"size-5 shrink-0 text-foreground-icon-secondary\" aria-hidden />\n                      <span\n                        className={cx(\n                          \"hidden truncate text-body-medium sm:block\",\n                          selected ? \"text-text-primary\" : \"text-text-secondary\",\n                        )}\n                      >\n                        {item.label}\n                      </span>\n                    </button>\n                  );\n                })}\n              </div>\n            </div>\n          ))}\n        </nav>\n\n        {/* Content pane — fixed title row, scrollable page below */}\n        <div className=\"flex min-w-0 flex-1 flex-col\">\n          {page === \"marketplace\" && marketplace != null ? marketplace : <>\n          {/* Storage keeps a tighter title gap: its page already carries\n              10px of scroll-safe headroom for the upload progress badge, so\n              the shared pb-3 read as a double margin above the dropzone. */}\n          <div\n            className={cx(\n              \"flex shrink-0 items-center justify-between px-8 pt-8\",\n              page === \"storage\" ? \"pb-1.5\" : \"pb-3\",\n            )}\n          >\n            <h2 className=\"text-title-3-medium text-text-primary\">{PAGE_TITLES[page]}</h2>\n            <button\n              type=\"button\"\n              aria-label=\"Close settings\"\n              onClick={onClose}\n              className={cx(\n                \"flex size-6 shrink-0 cursor-pointer items-center justify-center rounded-full\",\n                \"bg-background-tertiary-default text-foreground-icon-secondary\",\n                \"transition-colors duration-150 ease hover:bg-background-tertiary-hover\",\n                \"outline-none focus-visible:ring-2 focus-visible:ring-border-focus-ring\",\n              )}\n            >\n              <RiCloseLine className=\"size-4\" aria-hidden />\n            </button>\n          </div>\n          <div className=\"relative min-h-0 flex-1\">\n            <div\n              className=\"h-full overflow-y-auto px-8 pb-8\"\n              onScroll={(e) => setContentScrolled(e.currentTarget.scrollTop > 0)}\n            >\n              {page === \"profile\" ? (\n                <SettingsProfile onSaved={showSavedToast} />\n              ) : page === \"storage\" ? (\n                <SettingsStorage />\n              ) : page === \"tools\" ? (\n                <SettingsTools />\n              ) : (\n                <SettingsGeneral planArtSrc={planArtSrc} />\n              )}\n            </div>\n            {/* Progressive top fade — eases in once the page is scrolled so\n                content dissolves under the title row instead of hard-cutting. */}\n            <div\n              aria-hidden\n              className={cx(\n                \"pointer-events-none absolute inset-x-0 top-0 h-10 bg-linear-to-b from-background-primary-default to-transparent\",\n                \"transition-opacity duration-200 ease-out\",\n                contentScrolled ? \"opacity-100\" : \"opacity-0\",\n              )}\n            />\n          </div>\n          </>}\n        </div>\n      {localAction&&<div role=\"status\"className=\"absolute bottom-4 start-4 end-4 z-20 flex items-center justify-between gap-4 rounded-2xl border border-border-button-default bg-background-primary-default p-4 shadow-dropdown\"><span className=\"text-body-regular text-text-primary\"><strong>{localAction.label}</strong><br/>{localAction.description||\"Selected locally. No external account or provider was changed.\"}</span><button type=\"button\"className=\"shrink-0 rounded-lg px-3 py-2 text-body-medium text-text-primary hover:bg-background-secondary-default\"onClick={()=>setLocalAction(null)}>Dismiss</button></div>}\n      </div>\n\n      {/* Saved toast — straddles the panel's bottom edge, half in / half out. */}\n\n      <div\n        aria-live=\"polite\"\n        className={cx(\n          \"pointer-events-none absolute bottom-0 left-1/2 z-10 flex -translate-x-1/2 items-center gap-1\",\n          \"rounded-full border border-border-button-default bg-background-primary-default py-1 pe-2.5 ps-1.5 shadow-dropdown\",\n          \"transition-[opacity,transform,filter] duration-200 ease-out\",\n          savedPhase === \"shown\" && \"translate-y-1/2 opacity-100 scale-100 blur-0\",\n          // Starts below the resting spot, rises in; keeps drifting up on exit.\n          savedPhase === \"hidden\" && \"translate-y-[calc(50%+12px)] opacity-0 scale-90 blur-[2px]\",\n          savedPhase === \"leaving\" && \"translate-y-[calc(50%-10px)] opacity-0 scale-90 blur-[2px]\",\n        )}\n      >\n        <RiCheckboxCircleFill className=\"size-4 shrink-0 text-lime-600\" aria-hidden />\n        <span className=\"text-body-2-medium whitespace-nowrap text-text-primary\">Saved locally</span>\n      </div>\n      </div>\n    </div></FocusScope></div></NativeEnvironmentProvider></NativeStateProvider>,\n    environment?.portalContainer()??document.body,\n  );\n}\n",
  "src/board-native/components/application/settings/settings-profile.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\nimport{useNativeLocalState,useNativeAction}from\"../../../NativeEnvironment.js\";\n\nimport { useTemplateCopy } from \"../../foundations/template-copy/template-copy.js\";\n\nimport { useRef, useState, type ComponentProps } from \"react\";\nimport { CalendarDate } from \"@internationalized/date\";\nimport { RiCalendarLine, RiExternalLinkLine, RiLogoutCircleLine, RiMailLine } from \"@remixicon/react\";\nimport { Button } from \"../../base/buttons/button.js\";\nimport { DatePicker } from \"../../base/date-picker/date-picker.js\";\nimport { Input } from \"../../base/input/input.js\";\nimport { Switch } from \"../../base/switch/switch.js\";\nimport { cx } from \"../../../utils/cx.js\";\nimport {\n  SettingsCard,\n  SettingsRow,\n  SettingsValueField,\n} from \"./settings-rows.js\";\n\n/**\n * Figma source: Board UI → \"Settings/Profile\" (node 4081:13943), the right\n * pane of the settings modal.\n *\n * Two cards, 24px apart:\n *   1. identity   Email / First name / Last name as editable design-system\n *                 Inputs (small, 202px — mail icon on Email), Date of birth\n *                 (white date-picker trigger, 202px)\n *   2. account    BoardUI account → \"Manage\", Public profile toggle (on),\n *                 Device ID (muted, truncated), Log out from all devices.\n */\n\nconst MONTHS = [\n  \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n  \"July\", \"August\", \"September\", \"October\", \"November\", \"December\",\n];\n\nfunction formatBirthDate(date: CalendarDate) {\n  return `${date.day} ${MONTHS[date.month - 1]} ${date.year}`;\n}\n\n/**\n * Design-system Input that commits on Enter / blur: Enter just blurs the\n * field, and blur fires `onSaved` only when the value actually changed since\n * the last commit — so clicking in and out without typing stays silent.\n */\nfunction SavableInput({\n  initialValue,\n  onSaved,\n  ...inputProps\n}: { initialValue: string; onSaved?: () => void } & Omit<\n  ComponentProps<typeof Input>,\n  \"value\" | \"onChange\" | \"defaultValue\"\n>) {\n  const localize = useTemplateCopy();\n  const [value, setValue] = useNativeLocalState(\"settings-profile.SavableInput.value\" + String(inputProps[\"aria-label\"]??initialValue),initialValue);\n  const committed = useRef(value);\n  const [error,setError]=useNativeLocalState(\"settings-profile.error\"+String(inputProps[\"aria-label\"]??initialValue),\"\");\n\n  return localize((\n    <Input\n      size=\"small\"\n      {...inputProps}\n      value={value}\n      onChange={next=>{setValue(next);setError(\"\")}}\n      isInvalid={!!error}\n      hint={error||inputProps.hint}\n      onKeyDown={(event) => {\n        if (event.key === \"Enter\") (event.target as HTMLElement).blur();\n      }}\n      onBlur={() => {\n        if(!value.trim()){setError(\"This field is required.\");return}\n        if(inputProps.type===\"email\"&&!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)){setError(\"Enter a valid email address.\");return}\n        if (value !== committed.current) {\n          committed.current = value;\n          onSaved?.();\n        }\n      }}\n      className={cx(\"w-[202px] shrink-0\", inputProps.className)}\n    />\n  ));\n}\n\nexport function SettingsProfile({ onSaved }: { onSaved?: () => void } = {}) {\n  const reportAction=useNativeAction();\n  const localize = useTemplateCopy();\n  const [birthDate, setBirthDate] = useNativeLocalState<CalendarDate>(\"settings-profile.SettingsProfile.birthDate\",new CalendarDate(1997, 7, 28));\n  const [birthOpen, setBirthOpen] = useState(false);\n  const birthTriggerRef = useRef<HTMLButtonElement>(null);\n  const [publicProfile, setPublicProfile] = useNativeLocalState(\"settings-profile.SettingsProfile.publicProfile\",true);\n\n  return localize((\n    <div className=\"bn-settings-profile flex w-full flex-col gap-6\">\n      <SettingsCard>\n        <SettingsRow label=\"Email\">\n          <SavableInput\n            aria-label=\"Email\"\n            type=\"email\"\n            leadingIcon={RiMailLine}\n            initialValue=\"aarav@example.com\"\n            onSaved={onSaved}\n          />\n        </SettingsRow>\n        <SettingsRow label=\"First name\">\n          <SavableInput aria-label=\"First name\" initialValue=\"Aarav\" onSaved={onSaved} />\n        </SettingsRow>\n        <SettingsRow label=\"Last name\">\n          <SavableInput aria-label=\"Last name\" initialValue=\"Sharma\" onSaved={onSaved} />\n        </SettingsRow>\n        <SettingsRow label=\"Date of birth\">\n          <button\n            ref={birthTriggerRef}\n            type=\"button\"\n            onClick={() => setBirthOpen((o) => !o)}\n            className={[\n              \"flex h-8 w-[202px] shrink-0 cursor-pointer items-center gap-0.5 rounded-lg px-2\",\n              \"border border-border-button-default bg-background-primary-default shadow-xs\",\n              \"transition-colors duration-150 ease hover:bg-background-primary-hover\",\n              \"outline-none focus-visible:ring-2 focus-visible:ring-border-focus-ring\",\n            ].join(\" \")}\n          >\n            <RiCalendarLine className=\"size-[18px] shrink-0 text-foreground-icon-primary\" aria-hidden />\n            <span className=\"px-0.5 text-body-regular whitespace-nowrap text-text-primary\">\n              {formatBirthDate(birthDate)}\n            </span>\n          </button>\n          <DatePicker\n            aria-label=\"Date of birth\"\n            triggerRef={birthTriggerRef}\n            isOpen={birthOpen}\n            onOpenChange={setBirthOpen}\n            value={birthDate}\n            onChange={(next) => next && setBirthDate(next)}\n          />\n        </SettingsRow>\n      </SettingsCard>\n\n      <SettingsCard>\n        <SettingsRow label=\"Helios UI account\">\n          <Button onClick={()=>reportAction({label:\"Manage\",description:\"Selected in this local settings preview. No external provider or account state was changed.\"})} variant=\"secondary\" size=\"small\" leadingIcon={RiExternalLinkLine}>\n            Manage\n          </Button>\n        </SettingsRow>\n        <SettingsRow\n          label=\"Public profile\"\n          description=\"When enabled your profile page will be visible to anyone\"\n        >\n          <Switch\n            aria-label=\"Public profile\"\n            isSelected={publicProfile}\n            onChange={setPublicProfile}\n          />\n        </SettingsRow>\n        <SettingsRow label=\"Device ID\">\n          <SettingsValueField muted>593e2611-b9e3-44e2-1289-ab3f9d21</SettingsValueField>\n        </SettingsRow>\n        <SettingsRow label=\"Log out from all devices\">\n          <Button onClick={()=>reportAction({label:\"Logout\",description:\"Selected in this local settings preview. No external provider or account state was changed.\"})} variant=\"secondary\" size=\"small\" leadingIcon={RiLogoutCircleLine}>\n            Logout\n          </Button>\n        </SettingsRow>\n      </SettingsCard>\n    </div>\n  ));\n}\n",
  "src/board-native/components/application/settings/settings-rows.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { useTemplateCopy } from \"../../foundations/template-copy/template-copy.js\";\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport { cx } from \"../../../utils/cx.js\";\n\n/**\n * Shared row chrome for the settings modal pages (Figma \"Settings/Profile\"\n * node 4081:13943 and \"Settings/General\" node 4079:13037).\n *\n * Every settings group is the same recipe:\n *   card   bg background/secondary, radius/2xl (16px), pl 12 — the left\n *          padding lives on the card so each row's bottom border stops\n *          12px short of the left edge, exactly like Figma.\n *   row    py 10 pr 10, min-height 52, 1px border/button/default under\n *          every row except the last, label left / control right.\n *   label  Body 1/Regular text/primary, optional Body 2/Regular\n *          text/secondary description underneath.\n */\n\ntype IconComponent = ComponentType<{\n  className?: string;\n  \"aria-hidden\"?: boolean | \"true\" | \"false\";\n}>;\n\n/** Grouped card — rows divide themselves with borders that respect pl-12. */\nexport function SettingsCard({ className, children }: { className?: string; children: ReactNode }) {\n  const localize = useTemplateCopy();\n  return localize((\n    <div\n      className={cx(\n        \"flex w-full flex-col rounded-2xl bg-background-secondary-default ps-3\",\n        className,\n      )}\n    >\n      {children}\n    </div>\n  ));\n}\n\n/** Muted 13px section heading above a card (\"Pull Requests\", \"Notifications\"). */\nexport function SettingsSectionLabel({ className, children }: { className?: string; children: ReactNode }) {\n  const localize = useTemplateCopy();\n  return localize((\n    <p className={cx(\"w-full px-3 text-body-2-medium text-text-secondary\", className)}>{children}</p>\n  ));\n}\n\n/** One label + control row. Rows separate themselves; the last has no border. */\nexport function SettingsRow({\n  label,\n  description,\n  children,\n}: {\n  label: string;\n  description?: string;\n  children?: ReactNode;\n}) {\n  const localize = useTemplateCopy();\n  return localize((\n    <div\n      className={cx(\n        \"bn-settings-row flex min-h-[52px] w-full items-center justify-between gap-4 py-2.5 pe-2.5\",\n        \"border-b border-separator-border last:border-b-0\",\n      )}\n    >\n      <div className=\"flex min-w-0 flex-col\">\n        <p className=\"text-body-regular text-text-primary\">{label}</p>\n        {description && (\n          <p className=\"text-body-2-regular text-text-secondary\">{description}</p>\n        )}\n      </div>\n      {children}\n    </div>\n  ));\n}\n\n/**\n * The grey read-only value field (Figma \"Input\" instances — bg\n * background/tertiary, h 32, radius/2lg, 202px wide). Not an editable input\n * in the design: it presents the stored value.\n */\nexport function SettingsValueField({\n  icon: Icon,\n  children,\n  muted = false,\n  className,\n}: {\n  icon?: IconComponent;\n  children: ReactNode;\n  /** Secondary text color (e.g. the truncated Device ID). */\n  muted?: boolean;\n  className?: string;\n}) {\n  const localize = useTemplateCopy();\n  return localize((\n    <div\n      className={cx(\n        \"flex h-8 w-[202px] shrink-0 items-center gap-0.5 rounded-2lg bg-background-tertiary-default px-1.5\",\n        className,\n      )}\n    >\n      {Icon && <Icon className=\"size-5 shrink-0 text-foreground-icon-secondary\" aria-hidden />}\n      <span\n        className={cx(\n          \"truncate ps-1 text-body-regular\",\n          muted ? \"text-text-secondary\" : \"text-text-primary\",\n        )}\n      >\n        {children}\n      </span>\n    </div>\n  ));\n}\n",
  "src/board-native/components/application/settings/settings-storage.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\nimport{useNativeLocalState,useNativeAction}from\"../../../NativeEnvironment.js\";\n\nimport { useTemplateCopy } from \"../../foundations/template-copy/template-copy.js\";\n\nimport {\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n  type ReactNode,\n} from \"react\";\nimport {\n  RiDeleteBin6Line,\n  RiDownload2Line,\n  RiEditLine,\n  RiFileCopyLine,\n  RiMore2Fill,\n  RiSearchLine,\n} from \"@remixicon/react\";\nimport { Focusable } from \"react-aria-components\";\nimport { Chip } from \"../../base/badges/chip.js\";\nimport { Button } from \"../../base/buttons/button.js\";\nimport { IconButton } from \"../../base/buttons/icon-button.js\";\nimport { Checkbox } from \"../../base/checkbox/checkbox.js\";\nimport {\n  Dropdown,\n  DropdownGroup,\n  DropdownItem,\n  DropdownPopover,\n  DropdownTrigger,\n} from \"../../base/dropdown/dropdown.js\";\nimport { FileUpload, formatFileSize } from \"../../base/file-upload/file-upload.js\";\nimport { InputBase } from \"../../base/input/input.js\";\nimport { Pagination } from \"../../base/pagination/pagination.js\";\nimport { Select, SelectItem } from \"../../base/select/select.js\";\nimport { Tooltip, TooltipTrigger } from \"../../base/tooltip/tooltip.js\";\nimport { ChevronSortDown } from \"../../foundations/icons/chevrons.js\";\nimport { cx } from \"../../../utils/cx.js\";\n\n/**\n * Figma sources: Board UI → \"Upload file\" (node 4105:25269, default),\n * \"Upload in progress\" (node 4107:27192) and the 100% complete frame\n * (node 4107:30456) — the settings modal's Storage page.\n *\n * Dropzone (533×164, radius/2xl):\n *   default    bg background/secondary, 2px DASHED border/checkbox/default,\n *              40px background/quaternary circle with a white 24px\n *              upload-cloud-2-line, \"Drag and drop to upload or select\"\n *              (Body 1/Medium, \"select\" in blue-500) over \"PDF, JPG, PNG or\n *              XLSX (max 8 MB)\" (Body 2/Regular, text/tertiary).\n *   uploading  bg white; the border becomes the progress indicator: a 2px\n *              border/button/default track with a blue-400 stroke tracing\n *              the rounded-rect perimeter clockwise from top-center\n *              (decoded from Figma's \"Rectangle 7519\" vector), plus a\n *              blue-400 radius/md badge straddling the top border with the\n *              percentage (Caption 1/Medium, white). Content: 40px\n *              white/1px-bordered circle with the file-type icon, the file\n *              name (Body 1/Medium) and \"Uploading N MB…\" (Body 2/Regular).\n *   complete   same, ring closed at 100%, copy \"Uploaded successfully!\" —\n *              held briefly, then everything transitions back to default\n *              and the file lands at the top of the table below.\n *\n * Every phase change cross-fades: outgoing content slides up 10px while\n * fading/blurring out, incoming settles in from -10px — nothing snaps.\n * The upload itself is front-end-only (simulated progress, max 8 MB).\n *\n * The table below is the BoardUI table recipe (same chrome as the\n * dashboard's customers table): toolbar with live filters/search, sortable\n * columns, row selection, per-row delete + a ⋮ dropdown, pagination.\n */\n\n/* ------------------------------------------------------------------ files */\n\ntype FileKind = \"document\" | \"spreadsheet\" | \"video\";\n\nconst FILE_ICONS: Record<FileKind, { light: string; dark?: string }> = {\n  document: {\n    light: \"/react/assets/board-native/ai-chat/plugin-documents.svg\",\n    dark: \"/react/assets/board-native/ai-chat/plugin-documents-dark.svg\",\n  },\n  spreadsheet: { light: \"/react/assets/board-native/ai-chat/plugin-spreadsheets.svg\" },\n  video: { light: \"/react/assets/board-native/ai-chat/plugin-videos.svg\" },\n};\n\nconst KIND_LABELS: Record<FileKind, string> = {\n  document: \"Documents\",\n  spreadsheet: \"Spreadsheets\",\n  video: \"Videos\",\n};\n\ninterface StoredFile {\n  id: string;\n  name: string;\n  kind: FileKind;\n  /** Display label, e.g. \"May 11, 2026\". */\n  uploadedOn: string;\n  /** Epoch-ish ordinal used for the Modified sort (bigger = newer). */\n  uploadedStamp: number;\n  sizeLabel: string;\n  bytes: number;\n  selected?: boolean;\n  /** Original locally selected data, never uploaded to a server. */\n  content?: File;\n}\n\nfunction kindForFile(name: string): FileKind {\n  const ext = name.split(\".\").pop()?.toLowerCase() ?? \"\";\n  if (ext === \"xlsx\") return \"spreadsheet\";\n  if ([\"mp4\", \"mov\", \"webm\"].includes(ext)) return \"video\";\n  return \"document\";\n}\n\nfunction StoredFileIcon({ kind }: { kind: FileKind }) {\n  const localize = useTemplateCopy();\n  const { light, dark } = FILE_ICONS[kind];\n\n  if (dark) {\n    return localize((\n      <>\n        {/* eslint-disable-next-line @next/next/no-img-element -- decorative registry-packaged SVG */}\n        <img src={light} alt=\"\" className=\"theme-asset-light size-6 shrink-0 object-contain\" />\n        {/* eslint-disable-next-line @next/next/no-img-element -- decorative registry-packaged SVG */}\n        <img src={dark} alt=\"\" className=\"theme-asset-dark size-6 shrink-0 object-contain\" />\n      </>\n    ));\n  }\n\n  // eslint-disable-next-line @next/next/no-img-element -- decorative registry-packaged SVG\n  return localize(<img src={light} alt=\"\" className=\"size-6 shrink-0 object-contain\" />);\n}\n\n/** mulberry32 — deterministic PRNG so the mock inventory is stable across\n *  renders/SSR (same recipe as the customers table). */\nfunction makeRng(seed: number) {\n  let a = seed;\n  return () => {\n    a |= 0;\n    a = (a + 0x6d2b79f5) | 0;\n    let t = Math.imul(a ^ (a >>> 15), 1 | a);\n    t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n    return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n  };\n}\n\nconst GENERATED_NAMES = [\n  \"Invoice\", \"Contract\", \"Payroll Sheet\", \"Quarterly report\", \"Pitch deck\",\n  \"Budget plan\", \"Onboarding video\", \"Team photo\", \"Meeting notes\", \"Roadmap\",\n];\nconst MONTH_LABELS = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\n/** 1,262 files — the Figma toolbar's \"Stored in 1,262 files\" is the real\n *  count of this inventory. The first five rows pin Figma's exact examples\n *  (names, dates, sizes, selection); the rest are generated. */\nconst STORED_FILES: StoredFile[] = (() => {\n  const pinned: Array<Omit<StoredFile, \"id\" | \"uploadedStamp\">> = [\n    { name: \"Invoice 1\", kind: \"document\", uploadedOn: \"May 11, 2026\", sizeLabel: \"4 MB\", bytes: 4 * 1024 * 1024 },\n    { name: \"Payroll Sheet\", kind: \"spreadsheet\", uploadedOn: \"May 11, 2026\", sizeLabel: \"539 KB\", bytes: 539 * 1024, selected: true },\n    { name: \"Welcome video\", kind: \"video\", uploadedOn: \"May 11, 2026\", sizeLabel: \"36 MB\", bytes: 36 * 1024 * 1024 },\n    { name: \"Payroll Sheet\", kind: \"spreadsheet\", uploadedOn: \"May 11, 2026\", sizeLabel: \"539 KB\", bytes: 539 * 1024, selected: true },\n    { name: \"Invoice 1\", kind: \"document\", uploadedOn: \"May 11, 2026\", sizeLabel: \"4 MB\", bytes: 4 * 1024 * 1024 },\n  ];\n\n  const rng = makeRng(26);\n  const pick = <T,>(arr: T[]) => arr[Math.floor(rng() * arr.length)];\n  const kinds: FileKind[] = [\"document\", \"document\", \"spreadsheet\", \"video\"];\n  const total = 1262;\n\n  return Array.from({ length: total }, (_, i): StoredFile => {\n    if (i < pinned.length) {\n      return { ...pinned[i], id: `file-${i}`, uploadedStamp: total - i };\n    }\n    const kind = pick(kinds);\n    const bytes = Math.floor(\n      kind === \"video\" ? (4 + rng() * 60) * 1024 * 1024 : 40 * 1024 + rng() * 7 * 1024 * 1024,\n    );\n    const month = Math.floor(rng() * 5); // Jan–May 2026, before the pinned rows\n    const day = 1 + Math.floor(rng() * 28);\n    return {\n      id: `file-${i}`,\n      name: `${pick(GENERATED_NAMES)} ${1 + Math.floor(rng() * 40)}`,\n      kind,\n      uploadedOn: `${MONTH_LABELS[month]} ${day}, 2026`,\n      uploadedStamp: total - i,\n      sizeLabel: formatFileSize(bytes),\n      bytes,\n    };\n  });\n})();\n\n/* ------------------------------------------------------------------- table */\n\ntype SortKey = \"name\" | \"uploadedOn\" | \"bytes\";\ntype SortState = { key: SortKey; dir: \"asc\" | \"desc\" } | null;\n\nconst PER_PAGE = 6;\n\nfunction SortableHeader({\n  label,\n  sortKey,\n  sort,\n  onSort,\n}: {\n  label: string;\n  sortKey: SortKey;\n  sort: SortState;\n  onSort: (key: SortKey) => void;\n}) {\n  const localize = useTemplateCopy();\n  const active = sort?.key === sortKey;\n  return localize((\n    <button\n      type=\"button\"\n      aria-label={`Sort by ${label}`}\n      onClick={() => onSort(sortKey)}\n      className=\"flex cursor-pointer items-center gap-0.5 rounded-sm outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-border-focus-ring\"\n    >\n      <span className={cx(\"text-body-medium whitespace-nowrap\", active ? \"text-text-primary\" : \"text-text-tertiary\")}>\n        {label}\n      </span>\n      <span className=\"flex size-6 shrink-0 items-center justify-center\">\n        <ChevronSortDown\n          className={cx(\n            \"size-6 transition-[transform,color] duration-150 ease\",\n            active ? \"text-text-secondary\" : \"text-text-tertiary\",\n            active && sort?.dir === \"asc\" && \"rotate-180\",\n          )}\n        />\n      </span>\n    </button>\n  ));\n}\n\nfunction RowActionButton({ icon, label }: { icon: typeof RiDeleteBin6Line; label: string }) {\n  const localize = useTemplateCopy();\n  return localize((\n    <TooltipTrigger delay={200}>\n      <Focusable>\n        <IconButton icon={icon} size=\"small\" aria-label={label} />\n      </Focusable>\n      <Tooltip size=\"md\">{label}</Tooltip>\n    </TooltipTrigger>\n  ));\n}\n\nconst MORE_MENU_ACTIONS = [\n  { icon: RiDownload2Line, label: \"Download file\" },\n  { icon: RiEditLine, label: \"Rename\" },\n  { icon: RiFileCopyLine, label: \"Copy link\" },\n] as const;\n\n/** The \"⋮\" action: tooltip on hover, contextual menu on click — same recipe\n *  as the customers table's more-menu (trigger styled as a small secondary\n *  IconButton because nesting the real one would nest <button>s). */\nfunction RowMoreMenu({ name, onAction }: { name: string; onAction: (label: string) => void }) {\n  const localize = useTemplateCopy();\n  const [isOpen, setIsOpen] = useState(false);\n  return localize((\n    <Dropdown isOpen={isOpen} onOpenChange={setIsOpen}>\n      <TooltipTrigger delay={200}>\n        <DropdownTrigger\n          aria-label={`More actions for ${name}`}\n          className={cx(\n            \"relative inline-flex size-8 shrink-0 items-center justify-center rounded-2lg\",\n            \"border border-border-button-default bg-background-primary-default text-foreground-icon-primary shadow-xs\",\n            \"transition-[background-color,border-color,box-shadow,color] duration-150 ease\",\n            \"hover:border-border-button-hover hover:bg-background-primary-hover\",\n            isOpen && \"border-border-button-active bg-background-primary-active\",\n          )}\n        >\n          <RiMore2Fill className=\"size-4 shrink-0\" aria-hidden />\n        </DropdownTrigger>\n        <Tooltip size=\"md\">More actions</Tooltip>\n      </TooltipTrigger>\n      <DropdownPopover aria-label={`More actions for ${name}`} placement=\"bottom end\" className=\"w-[200px] p-2\">\n        <DropdownGroup>\n          {MORE_MENU_ACTIONS.map(({ icon: Icon, label }) => (\n            <DropdownItem key={label} onSelect={() => { setIsOpen(false); onAction(label); }} className=\"px-2 py-1.5\">\n              <Icon className=\"size-[18px] shrink-0 text-foreground-icon-secondary\" aria-hidden />\n              <span className=\"truncate text-body-medium whitespace-nowrap text-text-primary\">{label}</span>\n            </DropdownItem>\n          ))}\n        </DropdownGroup>\n      </DropdownPopover>\n    </Dropdown>\n  ));\n}\n\ntype RowAnimationPhase = \"idle\" | \"entering\" | \"exiting\";\nconst ROW_EXIT_DURATION_MS = 225;\n\n/** Shared row transition shell. Entry reveals a newly uploaded row from\n *  beneath the header; exit plays the exact structural reverse before the\n *  item is removed from state. */\nfunction AnimatedRow({\n  phase,\n  children,\n}: {\n  phase: RowAnimationPhase;\n  children: ReactNode;\n}) {\n  const localize = useTemplateCopy();\n  return localize((\n    <div\n      className={cx(\n        \"grid grid-rows-[1fr]\",\n        phase === \"entering\" && \"animate-row-grow-in\",\n        phase === \"exiting\" && \"pointer-events-none animate-row-collapse-out\",\n      )}\n    >\n      <div className=\"overflow-hidden\">\n        <div\n          className={cx(\n            phase === \"entering\" && \"animate-row-slide-in\",\n            phase === \"exiting\" && \"animate-row-slide-out\",\n          )}\n        >\n          {children}\n        </div>\n      </div>\n    </div>\n  ));\n}\n\n/* -------------------------------------------------------------------- page */\n\nexport function SettingsStorage() {\n  const localize = useTemplateCopy();\n  const reportAction = useNativeAction();\n  const [renaming, setRenaming] = useState<{id:string;name:string;error?:string}|null>(null);\n  const renameInput = useRef<HTMLInputElement>(null);\n  useEffect(()=>{if(!renaming)return;const timer=setTimeout(()=>renameInput.current?.focus(),180);return()=>clearTimeout(timer)},[renaming?.id]);\n  const [files, setFiles] = useNativeLocalState<StoredFile[]>(\"settings-storage.SettingsStorage.files\",STORED_FILES);\n  const [selected, setSelected] = useNativeLocalState<Set<string>>(\"settings-storage.SettingsStorage.selected\",\n    () => new Set(STORED_FILES.filter((f) => f.selected).map((f) => f.id)),\n  );\n  const [page, setPage] = useNativeLocalState(\"settings-storage.SettingsStorage.page\",1);\n  const [kindFilter, setKindFilter] = useNativeLocalState(\"settings-storage.SettingsStorage.kindFilter\",\"all\");\n  const [recency, setRecency] = useNativeLocalState<\"newest\" | \"oldest\">(\"settings-storage.SettingsStorage.recency\",\"newest\");\n  const [query, setQuery] = useNativeLocalState(\"settings-storage.SettingsStorage.query\",\"\");\n  const [sort, setSort] = useNativeLocalState<SortState>(\"settings-storage.SettingsStorage.sort\",null);\n  // The row that just arrived from the dropzone — its table row plays the\n  // grow-in entrance; cleared once the animation has run so pagination\n  // round-trips don't replay it.\n  const [justAddedId, setJustAddedId] = useState<string | null>(null);\n  const [deletingIds, setDeletingIds] = useState<Set<string>>(() => new Set());\n  const justAddedTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n  const deleteTimers = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n  useEffect(\n    () => () => {\n      if (justAddedTimer.current) clearTimeout(justAddedTimer.current);\n      for (const timer of deleteTimers.current.values()) clearTimeout(timer);\n      deleteTimers.current.clear();\n    },\n    [],\n  );\n\n  const onSort = (key: SortKey) => {\n    setSort((prev) => {\n      if (!prev || prev.key !== key) return { key, dir: \"asc\" };\n      if (prev.dir === \"asc\") return { key, dir: \"desc\" };\n      return null;\n    });\n  };\n\n  const filtered = useMemo(() => {\n    const q = query.trim().toLowerCase();\n    const rows = files.filter(\n      (f) =>\n        (kindFilter === \"all\" || f.kind === kindFilter) &&\n        (q === \"\" || f.name.toLowerCase().includes(q)),\n    );\n    if (sort) {\n      const { key, dir } = sort;\n      rows.sort((a, b) => {\n        const cmp =\n          key === \"name\"\n            ? a.name.localeCompare(b.name)\n            : key === \"bytes\"\n              ? a.bytes - b.bytes\n              : a.uploadedStamp - b.uploadedStamp;\n        return dir === \"asc\" ? cmp : -cmp;\n      });\n    } else {\n      rows.sort((a, b) =>\n        recency === \"newest\" ? b.uploadedStamp - a.uploadedStamp : a.uploadedStamp - b.uploadedStamp,\n      );\n    }\n    return rows;\n  }, [files, kindFilter, query, sort, recency]);\n\n  const totalPages = Math.max(1, Math.ceil(filtered.length / PER_PAGE));\n  const currentPage = Math.min(page, totalPages);\n  const rows = filtered.slice((currentPage - 1) * PER_PAGE, currentPage * PER_PAGE);\n\n  const selectedOnPage = rows.filter((f) => selected.has(f.id)).length;\n  const allOnPageSelected = rows.length > 0 && selectedOnPage === rows.length;\n  const someOnPageSelected = selectedOnPage > 0 && !allOnPageSelected;\n\n  const toggleRow = (id: string, isSelected: boolean) => {\n    setSelected((prev) => {\n      const next = new Set(prev);\n      if (isSelected) next.add(id);\n      else next.delete(id);\n      return next;\n    });\n  };\n\n  const toggleAllOnPage = (isSelected: boolean) => {\n    setSelected((prev) => {\n      const next = new Set(prev);\n      for (const f of rows) {\n        if (isSelected) next.add(f.id);\n        else next.delete(f.id);\n      }\n      return next;\n    });\n  };\n\n  const restoreRowFocus = (id:string) => requestAnimationFrame(()=>document.querySelector<HTMLButtonElement>('[data-storage-file-id=\"'+CSS.escape(id)+'\"] button[aria-haspopup]')?.focus());\n  const saveName = () => {\n    if(!renaming)return;\n    const name=renaming.name.trim();\n    if(!name){setRenaming({...renaming,error:\"Enter a file name.\"});return}\n    if(name.length>120||/[\\\\/\\x00-\\x1f]/.test(name)){setRenaming({...renaming,error:\"Use up to 120 characters without slashes or control characters.\"});return}\n    setFiles(current=>current.map(file=>file.id===renaming.id?{...file,name}:file));\n    restoreRowFocus(renaming.id);setRenaming(null);\n    reportAction({label:\"File renamed locally\",description:\"Only this browser preview was updated. No server file was changed.\"});\n  };\n  const fileAction = async(file:StoredFile,label:string) => {\n    if(label===\"Rename\"){setRenaming({id:file.id,name:file.name});return}\n    if(label===\"Copy link\"){\n      try{await navigator.clipboard.writeText('helios-local://files/'+encodeURIComponent(file.id));reportAction({label:\"Local reference copied\",description:\"This browser-only reference is not a public sharing link.\"})}\n      catch{reportAction({label:\"Copy unavailable\",description:\"The browser denied clipboard access. No public sharing link was created.\"})}\n      return;\n    }\n    const blob=file.content??new Blob([\"Helios UI local fixture metadata\\nName: \"+file.name+\"\\nSize: \"+file.sizeLabel+\"\\nNo original server file is available in this preview.\\n\"],{type:\"text/plain\"});\n    const extension=file.content?.name.match(/\\.[^.]+$/)?.[0]??\"\";\n    const name=file.content?(file.name.endsWith(extension)?file.name:file.name+extension):file.name+\".preview.txt\";\n    const url=URL.createObjectURL(blob),anchor=document.createElement('a');anchor.href=url;anchor.download=name;anchor.click();setTimeout(()=>URL.revokeObjectURL(url),1000);\n    reportAction({label:file.content?\"Local file downloaded\":\"Fixture metadata downloaded\",description:file.content?\"Downloaded your selected browser file. Nothing was uploaded to a server.\":\"This example contains metadata only, so the download is a clearly labelled preview text file.\"});\n  };\n\n  const deleteFile = (id: string) => {\n    if (deleteTimers.current.has(id)) return;\n    setDeletingIds((prev) => {\n      const next = new Set(prev);\n      next.add(id);\n      return next;\n    });\n    deleteTimers.current.set(\n      id,\n      setTimeout(() => {\n        setFiles((prev) => prev.filter((f) => f.id !== id));\n        setSelected((prev) => {\n          if (!prev.has(id)) return prev;\n          const next = new Set(prev);\n          next.delete(id);\n          return next;\n        });\n        setDeletingIds((prev) => {\n          const next = new Set(prev);\n          next.delete(id);\n          return next;\n        });\n        deleteTimers.current.delete(id);\n      }, ROW_EXIT_DURATION_MS),\n    );\n  };\n\n  return localize((\n    // pt-2.5 gives the percentage badge (which straddles the dropzone's top\n    // border, overhanging 9.5px) headroom inside the modal's scroll clip.\n    <div className=\"flex w-full flex-col gap-6 pt-2.5\">\n      <FileUpload\n        renderFileIcon={(file) => <StoredFileIcon kind={kindForFile(file.name)} />}\n        onUploadComplete={(file) => {\n          const now = new Date();\n          const storedFile: StoredFile = {\n            id: `upload-${now.getTime()}`,\n            name: file.name.replace(/\\.[^.]+$/, \"\"),\n            kind: kindForFile(file.name),\n            uploadedOn: now.toLocaleDateString(\"en-US\", {\n              month: \"short\",\n              day: \"numeric\",\n              year: \"numeric\",\n            }),\n            uploadedStamp: 10_000 + now.getTime() / 1000,\n            sizeLabel: formatFileSize(file.size),\n            bytes: file.size,\n            content: file,\n          };\n          setFiles((prev) => [storedFile, ...prev]);\n          setPage(1);\n          setJustAddedId(storedFile.id);\n          if (justAddedTimer.current) clearTimeout(justAddedTimer.current);\n          justAddedTimer.current = setTimeout(() => setJustAddedId(null), 700);\n        }}\n      />\n\n      <section className=\"flex w-full flex-col rounded-2xl border border-border-table pt-2 pb-3\">\n        {/* Toolbar */}\n        <div className=\"flex w-full flex-col items-start gap-3 px-3 py-1 sm:flex-row sm:items-center sm:justify-between\">\n          <div className=\"flex flex-col justify-center\">\n            <p className=\"text-body-medium whitespace-nowrap text-text-tertiary\">Stored in</p>\n            <p className=\"text-body-medium whitespace-nowrap text-text-primary\">\n              {filtered.length.toLocaleString()} files\n            </p>\n          </div>\n          <div className=\"flex items-center gap-2.5\">\n            <Select\n              aria-label=\"Filter by file type\"\n              className=\"shrink-0\"\n              selectedKey={kindFilter}\n              onSelectionChange={(k) => {\n                setKindFilter(String(k));\n                setPage(1);\n              }}\n            >\n              <SelectItem id=\"all\" textValue=\"File type\">\n                File type\n              </SelectItem>\n              {(Object.keys(KIND_LABELS) as FileKind[]).map((kind) => (\n                <SelectItem key={kind} id={kind} textValue={KIND_LABELS[kind]}>\n                  {KIND_LABELS[kind]}\n                </SelectItem>\n              ))}\n            </Select>\n            <Select\n              aria-label=\"Order by\"\n              className=\"shrink-0\"\n              selectedKey={recency}\n              onSelectionChange={(k) => {\n                setRecency(k as \"newest\" | \"oldest\");\n                setSort(null);\n                setPage(1);\n              }}\n            >\n              <SelectItem id=\"newest\" textValue=\"Modified\">\n                Modified\n              </SelectItem>\n              <SelectItem id=\"oldest\" textValue=\"Oldest first\">\n                Oldest first\n              </SelectItem>\n            </Select>\n            <InputBase\n              aria-label=\"Search files\"\n              placeholder=\"Search\"\n              leadingIcon={RiSearchLine}\n              value={query}\n              onChange={(e) => {\n                setQuery(e.target.value);\n                setPage(1);\n              }}\n              fieldClassName=\"w-[153px] rounded-full bg-background-secondary-default\"\n              className=\"text-body-medium\"\n            />\n          </div>\n        </div>\n\n        {/* Column headers */}\n        <div className=\"mt-2 flex w-full items-center border-y border-separator-border bg-background-secondary-default ps-3\">\n          <div className=\"flex min-w-0 flex-1 items-center gap-2 py-2.5\">\n            <Checkbox\n              isSelected={allOnPageSelected}\n              isIndeterminate={someOnPageSelected}\n              onChange={toggleAllOnPage}\n              aria-label=\"Select all files on this page\"\n            />\n            <SortableHeader label=\"File name\" sortKey=\"name\" sort={sort} onSort={onSort} />\n          </div>\n          <div className=\"flex w-[150px] shrink-0 items-center px-3 py-2.5\">\n            <SortableHeader label=\"Uploaded on\" sortKey=\"uploadedOn\" sort={sort} onSort={onSort} />\n          </div>\n          <div className=\"flex w-[104px] shrink-0 items-center px-3 py-2.5\">\n            <SortableHeader label=\"File size\" sortKey=\"bytes\" sort={sort} onSort={onSort} />\n          </div>\n          <div className=\"flex w-[116px] shrink-0 items-center px-3 py-2.5\">\n            <span className=\"text-body-medium whitespace-nowrap text-text-tertiary\">Actions</span>\n          </div>\n        </div>\n\n        {/* Rows */}\n        <div className=\"flex w-full flex-col ps-3\">\n          {rows.length > 0 ? (\n            rows.map((file) => {\n              const phase: RowAnimationPhase = deletingIds.has(file.id)\n                ? \"exiting\"\n                : file.id === justAddedId\n                  ? \"entering\"\n                  : \"idle\";\n              return (\n                <AnimatedRow key={file.id} phase={phase}>\n                  <div data-storage-file-id={file.id} className=\"flex w-full items-center border-b border-separator-border\">\n                    <div className=\"flex min-w-0 flex-1 items-center gap-2 py-2.5\">\n                      <Checkbox\n                        isSelected={selected.has(file.id)}\n                        onChange={(isSelected) => toggleRow(file.id, isSelected)}\n                        aria-label={`Select ${file.name}`}\n                      />\n                      <div className=\"flex min-w-0 items-center gap-2\">\n                        <StoredFileIcon kind={file.kind} />\n                        {renaming?.id===file.id?<div className=\"flex min-w-0 flex-1 flex-col gap-1\"><div className=\"flex min-w-0 items-center gap-1\"><InputBase ref={renameInput} aria-label=\"Rename file\" aria-invalid={!!renaming.error} value={renaming.name} onChange={event=>setRenaming({...renaming,name:event.target.value,error:undefined})} onKeyDown={event=>{if(event.key==='Enter'){event.preventDefault();event.stopPropagation();saveName()}if(event.key==='Escape'){event.preventDefault();event.stopPropagation();restoreRowFocus(file.id);setRenaming(null)}}}/><Button size=\"xs\" onClick={saveName}>Save</Button><Button size=\"xs\" variant=\"secondary\" onClick={()=>{restoreRowFocus(file.id);setRenaming(null)}}>Cancel</Button></div>{renaming.error&&<span role=\"alert\" className=\"text-body-2-regular text-text-error-primary\">{renaming.error}</span>}</div>:<span className=\"truncate text-body-medium text-text-primary\">{file.name}</span>}\n                      </div>\n                    </div>\n                    <div className=\"flex w-[150px] shrink-0 items-center px-3 py-2.5\">\n                      <span className=\"text-body-medium whitespace-nowrap text-text-primary\">\n                        {file.uploadedOn}\n                      </span>\n                    </div>\n                    <div className=\"flex w-[104px] shrink-0 items-center px-3 py-2.5\">\n                      <Chip variant=\"subtle\" color=\"gray\">\n                        {file.sizeLabel}\n                      </Chip>\n                    </div>\n                    <div className=\"flex w-[116px] shrink-0 items-center justify-end gap-2.5 px-3 py-2.5\">\n                      <span onClick={() => deleteFile(file.id)}>\n                        <RowActionButton icon={RiDeleteBin6Line} label=\"Delete file\" />\n                      </span>\n                      <RowMoreMenu name={file.name} onAction={label=>{void fileAction(file,label)}} />\n                    </div>\n                  </div>\n                </AnimatedRow>\n              );\n            })\n          ) : (\n            <div className=\"flex w-full items-center justify-center py-10 pe-3\">\n              <span className=\"text-body-medium text-text-tertiary\">No files match your filters.</span>\n            </div>\n          )}\n        </div>\n\n        {/* Pagination */}\n        <div className=\"px-3 pt-3\">\n          <Pagination page={currentPage} totalPages={totalPages} onChange={setPage} />\n        </div>\n      </section>\n    </div>\n  ));\n}\n",
  "src/board-native/components/application/settings/settings-tools.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\nimport{useNativeLocalState,useNativeAction}from\"../../../NativeEnvironment.js\";\n\nimport { useTemplateCopy } from \"../../foundations/template-copy/template-copy.js\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { RiAddLine, RiMoreFill } from \"@remixicon/react\";\nimport { Chip } from \"../../base/badges/chip.js\";\nimport { Button } from \"../../base/buttons/button.js\";\nimport { PillTab, PillTabList } from \"../../base/tabs/pill-tab.js\";\nimport {\n  Dropdown,\n  DropdownGroup,\n  DropdownItem,\n  DropdownPopover,\n  DropdownTrigger,\n} from \"../../base/dropdown/dropdown.js\";\nimport { Switch } from \"../../base/switch/switch.js\";\nimport { ChevronUpDownSmall } from \"../../foundations/icons/chevrons.js\";\nimport { cx } from \"../../../utils/cx.js\";\nimport { SettingsCard, SettingsRow, SettingsSectionLabel } from \"./settings-rows.js\";\n\n/**\n * The settings modal's Tools page — MCP server management, structured after\n * the classic tools/servers settings layout: a scope switcher (per-project\n * pills), an Authentication toggle, the selected scope's server list, an\n * empty-state Team section, and the global Plugin servers.\n *\n * No Figma frame for this page — composed from the settings modal's own\n * recipes (SettingsCard/SettingsRow chrome, Switch, secondary Buttons, the\n * dropdown menu pattern) plus page-local pieces that follow the system:\n * icon tiles use the inbox-feed swatch pairs (bg-*-200 / text-*-700), the\n * status dot is ringed with the card background like the sidebar's badge\n * treatments, and the expandable tool list reuses the grid-rows grow\n * transition from the Storage table.\n */\n\n/* ------------------------------------------------------------------- data */\n\ntype ServerStatus = \"connected\" | \"error\";\n\ninterface McpServer {\n  id: string;\n  name: string;\n  /** Letter tile — bg/text pair from the swatch palette. */\n  initial: string;\n  tileClass: string;\n  status: ServerStatus;\n  /** e.g. \"26 tools, 1 prompts, 104 resources enabled\" */\n  summary?: string;\n  /** Names revealed by the expander chevron. */\n  tools?: string[];\n}\n\nconst SERVERS: Record<string, McpServer> = {\n  astro: {\n    id: \"astro\",\n    name: \"astro\",\n    initial: \"A\",\n    tileClass: \"bg-background-tertiary-default text-text-secondary\",\n    status: \"error\",\n  },\n  figma: {\n    id: \"figma\",\n    name: \"Figma\",\n    initial: \"F\",\n    tileClass: \"bg-pink-200 text-pink-700\",\n    status: \"connected\",\n    summary: \"26 tools, 1 prompts, 104 resources enabled\",\n    tools: [\"get_design_context\", \"get_metadata\", \"get_screenshot\", \"get_variable_defs\", \"create_new_file\"],\n  },\n  paper: {\n    id: \"paper\",\n    name: \"paper\",\n    initial: \"P\",\n    tileClass: \"bg-blue-200 text-blue-700\",\n    status: \"error\",\n  },\n  posthog: {\n    id: \"posthog\",\n    name: \"posthog\",\n    initial: \"P\",\n    tileClass: \"bg-amber-200 text-amber-700\",\n    status: \"connected\",\n    summary: \"521 tools, 173 resources enabled\",\n    tools: [\"query_insights\", \"list_dashboards\", \"capture_event\", \"feature_flags\", \"session_recordings\"],\n  },\n  vercel: {\n    id: \"vercel\",\n    name: \"vercel\",\n    initial: \"V\",\n    tileClass: \"bg-neutral-950 text-white\",\n    status: \"connected\",\n    summary: \"30 tools, 13 prompts enabled\",\n    tools: [\"list_deployments\", \"get_build_logs\", \"promote_deployment\", \"env_variables\"],\n  },\n};\n\n/** Per-scope server lists — switching a pill swaps the section below. */\nconst SCOPES: { id: string; label: string; servers: McpServer[] }[] = [\n  { id: \"home\", label: \"Home\", servers: [SERVERS.astro, SERVERS.figma] },\n  { id: \"boardui\", label: \"boardui\", servers: [SERVERS.figma, SERVERS.vercel] },\n  { id: \"iospoke\", label: \"iospoke\", servers: [SERVERS.astro] },\n  { id: \"mideo\", label: \"mideo\", servers: [SERVERS.posthog] },\n  { id: \"bereal\", label: \"BeReal Task\", servers: [SERVERS.figma] },\n  { id: \"poke\", label: \"poke-1\", servers: [] },\n  { id: \"cloud\", label: \"Cloud\", servers: [SERVERS.vercel, SERVERS.posthog] },\n];\n\nconst PLUGIN_SERVERS: McpServer[] = [SERVERS.paper, SERVERS.posthog, SERVERS.vercel];\n\n/* ----------------------------------------------------------------- pieces */\n\n/** 32px rounded letter tile with a connection dot pinned to its corner,\n *  ringed in the card background so it reads as punched-through. */\nfunction ServerTile({ server }: { server: McpServer }) {\n  const localize = useTemplateCopy();\n  return localize((\n    <span className=\"relative flex size-8 shrink-0 items-center justify-center rounded-lg\">\n      <span\n        className={cx(\n          \"flex size-8 items-center justify-center rounded-lg text-body-2-medium\",\n          server.tileClass,\n        )}\n      >\n        {server.initial}\n      </span>\n      <span\n        aria-hidden\n        className={cx(\n          \"absolute -bottom-0.5 -start-0.5 size-2.5 rounded-full ring-2 ring-background-secondary-default\",\n          server.status === \"connected\" ? \"bg-green-500\" : \"bg-red-600\",\n        )}\n      />\n    </span>\n  ));\n}\n\n/** Bare \"…\" row action — quieter than IconButton on the grey card, same\n *  hover language as the sidebar rows. Opens the shared dropdown menu. */\nfunction ServerMenu({ name }: { name: string }) {\n  const reportAction=useNativeAction();\n  const localize = useTemplateCopy();\n  const [isOpen, setIsOpen] = useState(false);\n  return localize((\n    <Dropdown isOpen={isOpen} onOpenChange={setIsOpen}>\n      <DropdownTrigger\n        aria-label={`Actions for ${name}`}\n        className={cx(\n          \"flex size-7 shrink-0 cursor-pointer items-center justify-center rounded-md\",\n          \"text-foreground-icon-secondary outline-none transition-colors duration-150 ease\",\n          \"hover:bg-background-secondary-hover focus-visible:ring-2 focus-visible:ring-border-focus-ring\",\n          isOpen && \"bg-background-secondary-hover\",\n        )}\n      >\n        <RiMoreFill className=\"size-4 shrink-0\" aria-hidden />\n      </DropdownTrigger>\n      <DropdownPopover aria-label={`Actions for ${name}`} placement=\"bottom end\" className=\"w-[180px] p-2\">\n        <DropdownGroup>\n          {[\"Show output\", \"Refresh tools\", \"Remove server\"].map((label) => (\n            <DropdownItem key={label} onSelect={() => {setIsOpen(false);reportAction({label:label+\" · \"+name,description:\"This local preview does not connect to an MCP server. No connection was changed; this example uses local fixtures.\"})}} className=\"px-2 py-1.5\">\n              <span className=\"truncate text-body-medium whitespace-nowrap text-text-primary\">{label}</span>\n            </DropdownItem>\n          ))}\n        </DropdownGroup>\n      </DropdownPopover>\n    </Dropdown>\n  ));\n}\n\n/** Quiet inline text action (\"Logout\", \"Show Output\"). */\nfunction InlineAction({ children, onClick }: { children: ReactNode; onClick?: () => void }) {\n  const reportAction=useNativeAction();\n  const localize = useTemplateCopy();\n  return localize((\n    <button\n      type=\"button\"\n      onClick={onClick??(()=>reportAction({label:typeof children===\"string\"?children:\"Tool action\",description:\"This is a local tools example. No external account was connected or disconnected.\"}))}\n      className={cx(\n        \"cursor-pointer rounded-sm text-body-2-regular whitespace-nowrap text-text-tertiary\",\n        \"outline-none transition-colors duration-150 ease\",\n        \"hover:text-text-secondary focus-visible:ring-2 focus-visible:ring-border-focus-ring\",\n      )}\n    >\n      {children}\n    </button>\n  ));\n}\n\nfunction ServerRow({ server }: { server: McpServer }) {\n  const localize = useTemplateCopy();\n  const [expanded, setExpanded] = useState(false);\n  return localize((\n    <div className=\"border-b border-separator-border py-2.5 pe-2.5 last:border-b-0\">\n      <div className=\"flex w-full items-center gap-2.5\">\n        <ServerTile server={server} />\n        <div className=\"flex min-w-0 flex-1 flex-col\">\n          <div className=\"flex items-baseline gap-2\">\n            <p className=\"text-body-medium whitespace-nowrap text-text-primary\">{server.name}</p>\n            <InlineAction>Logout</InlineAction>\n          </div>\n          {server.status === \"connected\" ? (\n            <div className=\"flex items-center gap-1\">\n              <p className=\"truncate text-body-2-regular text-text-secondary\">{server.summary}</p>\n              {server.tools && (\n                <button\n                  type=\"button\"\n                  aria-label={`${expanded ? \"Hide\" : \"Show\"} ${server.name} tools`}\n                  aria-expanded={expanded}\n                  onClick={() => setExpanded((v) => !v)}\n                  className={cx(\n                    \"flex size-4 shrink-0 cursor-pointer items-center justify-center rounded-xs\",\n                    \"text-foreground-icon-tertiary outline-none transition-colors duration-150 ease\",\n                    \"hover:text-foreground-icon-secondary focus-visible:ring-2 focus-visible:ring-border-focus-ring\",\n                  )}\n                >\n                  <ChevronUpDownSmall className=\"size-4\" aria-hidden />\n                </button>\n              )}\n            </div>\n          ) : (\n            <div className=\"flex items-center gap-1\">\n              <p className=\"text-body-2-regular whitespace-nowrap text-text-secondary\">Error</p>\n              <span className=\"text-body-2-regular text-text-tertiary\">–</span>\n              <InlineAction>Show Output</InlineAction>\n            </div>\n          )}\n        </div>\n        <ServerMenu name={server.name} />\n      </div>\n\n      {/* Expandable tool chips — same grid-rows grow transition as the\n          Storage table's new-row entrance, but as a two-way toggle. */}\n      {server.tools && (\n        <div\n          className={cx(\n            \"grid transition-[grid-template-rows,opacity] duration-300 ease-out\",\n            expanded ? \"grid-rows-[1fr] opacity-100\" : \"grid-rows-[0fr] opacity-0\",\n          )}\n        >\n          <div className=\"overflow-hidden\">\n            <div className=\"flex flex-wrap gap-1.5 pt-2 ps-[42px]\">\n              {server.tools.map((tool) => (\n                <Chip key={tool} variant=\"caption\" color=\"soft\">\n                  {tool}\n                </Chip>\n              ))}\n            </div>\n          </div>\n        </div>\n      )}\n    </div>\n  ));\n}\n\nfunction NewServerRow() {\n  const localize = useTemplateCopy();\n  return localize((\n    <button\n      type=\"button\"\n      className={cx(\n        \"group flex w-full cursor-pointer items-center gap-2.5 py-2.5 pe-2.5 text-start\",\n        \"outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-border-focus-ring\",\n      )}\n    >\n      <span\n        className={cx(\n          \"flex size-8 shrink-0 items-center justify-center rounded-lg bg-background-tertiary-default\",\n          \"transition-colors duration-150 ease group-hover:bg-background-tertiary-hover\",\n        )}\n      >\n        <RiAddLine className=\"size-5 shrink-0 text-foreground-icon-secondary\" aria-hidden />\n      </span>\n      <span className=\"flex min-w-0 flex-col\">\n        <span className=\"text-body-medium whitespace-nowrap text-text-primary\">New MCP Server</span>\n        <span className=\"text-body-2-regular whitespace-nowrap text-text-secondary\">\n          Add a Custom MCP Server\n        </span>\n      </span>\n    </button>\n  ));\n}\n\n/* ------------------------------------------------------------------- page */\n\nexport function SettingsTools() {\n  const reportAction=useNativeAction();\n  const localize = useTemplateCopy();\n  const [scopeId, setScopeId] = useNativeLocalState(\"settings-tools.SettingsTools.scopeId\",\"home\");\n  const [waitForAuth, setWaitForAuth] = useNativeLocalState(\"settings-tools.SettingsTools.waitForAuth\",true);\n  const scope = SCOPES.find((s) => s.id === scopeId) ?? SCOPES[0];\n\n  return localize((\n    <div className=\"flex w-full flex-col gap-6\">\n      {/* Scope switcher — the shared fully-rounded pill tabs (same component\n          as the AI chat panel's Changes/Browser switcher). */}\n      <PillTabList\n        aria-label=\"Project scope\"\n        className=\"-mx-1 flex w-[calc(100%+8px)] overflow-x-auto px-1 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\"\n      >\n        {SCOPES.map((s) => (\n          <PillTab key={s.id} variant=\"gray\" isSelected={s.id === scopeId} onSelect={() => setScopeId(s.id)}>\n            {s.label}\n          </PillTab>\n        ))}\n      </PillTabList>\n\n      {/* Authentication */}\n      <div className=\"flex w-full flex-col gap-2\">\n        <SettingsSectionLabel className=\"px-2\">Authentication</SettingsSectionLabel>\n        <SettingsCard>\n          <SettingsRow\n            label=\"Wait for MCP Authentication\"\n            description=\"Wait indefinitely to authenticate when prompted. When off, skip authentication prompts after 30 seconds.\"\n          >\n            <Switch isSelected={waitForAuth} onChange={setWaitForAuth} aria-label=\"Wait for MCP authentication\" />\n          </SettingsRow>\n        </SettingsCard>\n      </div>\n\n      {/* Scope servers */}\n      <div className=\"flex w-full flex-col gap-2\">\n        <div className=\"flex w-full flex-col gap-0.5\">\n          <SettingsSectionLabel className=\"px-2\">{scope.label} MCP Servers</SettingsSectionLabel>\n          <p className=\"w-full px-2 text-body-2-regular text-text-tertiary\">\n            Servers available from {scope.label}.\n          </p>\n        </div>\n        <SettingsCard>\n          {scope.servers.map((server) => (\n            <ServerRow key={server.id} server={server} />\n          ))}\n          <NewServerRow />\n        </SettingsCard>\n      </div>\n\n      {/* Team servers — empty state */}\n      <div className=\"flex w-full flex-col gap-2\">\n        <div className=\"flex w-full items-end justify-between gap-3\">\n          <div className=\"flex min-w-0 flex-col gap-0.5\">\n            <SettingsSectionLabel className=\"px-2\">Team MCP Servers</SettingsSectionLabel>\n            <p className=\"w-full px-2 text-body-2-regular text-text-tertiary\">\n              Configured in the dashboard\n            </p>\n          </div>\n          <Button onClick={()=>reportAction({label:\"Manage\",description:\"Selected in this local settings preview. No external provider or account state was changed.\"})} variant=\"secondary\" size=\"small\" className=\"shrink-0\">\n            Manage\n          </Button>\n        </div>\n        <div className=\"flex w-full flex-col items-center gap-3 rounded-2xl bg-background-secondary-default px-6 py-8\">\n          <div className=\"flex flex-col items-center gap-1 text-center\">\n            <p className=\"text-body-medium text-text-primary\">No Team MCP Servers</p>\n            <p className=\"max-w-[360px] text-body-2-regular text-text-secondary\">\n              Configure MCP servers in the dashboard to make them available in Helios UI on desktop\n              and in the cloud.\n            </p>\n          </div>\n          <Button onClick={()=>reportAction({label:\"Configure Team MCP Servers\",description:\"Selected in this local settings preview. No external provider or account state was changed.\"})} variant=\"secondary\" size=\"small\">\n            Configure Team MCP Servers\n          </Button>\n        </div>\n      </div>\n\n      {/* Plugin servers */}\n      <div className=\"flex w-full flex-col gap-2\">\n        <SettingsSectionLabel className=\"px-2\">Plugin MCP Servers</SettingsSectionLabel>\n        <SettingsCard>\n          {PLUGIN_SERVERS.map((server) => (\n            <ServerRow key={server.id} server={server} />\n          ))}\n        </SettingsCard>\n      </div>\n    </div>\n  ));\n}\n",
  "src/board-native/components/application/theme/theme-toggle.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { useTemplateCopy } from \"../../foundations/template-copy/template-copy.js\";\n\nimport { useEffect, useRef, useSyncExternalStore } from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { RiMoonLine, RiSunLine } from \"@remixicon/react\";\nimport { Switch as AriaSwitch } from \"react-aria-components\";\nimport { SwitchTrack } from \"../../base/switch/switch.js\";\nimport { cx } from \"../../../utils/cx.js\";\n\nexport type ThemeMode = \"light\" | \"dark\";\n\nexport const THEME_STORAGE_KEY = \"helios-ui-theme\";\nexport const THEME_CHANGE_EVENT = \"helios-ui-theme-change\";\n\nconst THEME_TRANSITION_DURATION = 820;\nconst THEME_TRANSITION_EASING = \"cubic-bezier(0.16, 1, 0.3, 1)\";\nconst THEME_TRANSITION_STYLE_ID = \"helios-native-theme-transition-style\";\n\ntype ThemeTransitionOrigin = { x: number; y: number };\n\ntype ViewTransition = {\n  ready: Promise<void>;\n  finished: Promise<void>;\n};\n\ntype ViewTransitionDocument = Document & {\n  startViewTransition?: (update: () => void) => ViewTransition;\n};\n\nlet themeTransitionRunning = false;\nlet pendingTheme: {theme:ThemeMode;origin:ThemeTransitionOrigin|null;element:HTMLElement|null;duration:number}|null = null;\n\nfunction createBlurCircleMask() {\n  const svg = [\n    '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\">',\n    '<defs><filter id=\"blur\" x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\">',\n    '<feGaussianBlur stdDeviation=\"2\" /></filter></defs>',\n    '<circle cx=\"50\" cy=\"50\" r=\"42\" fill=\"white\" filter=\"url(#blur)\" />',\n    \"</svg>\",\n  ].join(\"\");\n\n  return `url(\"data:image/svg+xml,${encodeURIComponent(svg)}\")`;\n}\n\nfunction installThemeTransitionStyle(\n  { x, y }: ThemeTransitionOrigin,\n  radius: number,\n  duration: number,\n) {\n  document.getElementById(THEME_TRANSITION_STYLE_ID)?.remove();\n\n  const mask = createBlurCircleMask();\n  const finalMaskSize = radius * 2.5;\n  const finalMaskX = x - finalMaskSize / 2;\n  const finalMaskY = y - finalMaskSize / 2;\n  const style = document.createElement(\"style\");\n  style.id = THEME_TRANSITION_STYLE_ID;\n  style.textContent = `\n    ::view-transition, ::view-transition-group(root), ::view-transition-image-pair(root), ::view-transition-old(root), ::view-transition-new(root) { pointer-events:none; }\n    ::view-transition-new(root) {\n      -webkit-mask-image: ${mask};\n      mask-image: ${mask};\n      -webkit-mask-repeat: no-repeat;\n      mask-repeat: no-repeat;\n      animation: boardui-theme-mask-reveal ${duration}ms ${THEME_TRANSITION_EASING} both;\n      transform-origin: ${x}px ${y}px;\n      will-change: -webkit-mask-size, -webkit-mask-position, mask-size, mask-position;\n    }\n\n    @keyframes boardui-theme-mask-reveal {\n      from {\n        -webkit-mask-position: ${x}px ${y}px;\n        mask-position: ${x}px ${y}px;\n        -webkit-mask-size: 0px 0px;\n        mask-size: 0px 0px;\n      }\n      to {\n        -webkit-mask-position: ${finalMaskX}px ${finalMaskY}px;\n        mask-position: ${finalMaskX}px ${finalMaskY}px;\n        -webkit-mask-size: ${finalMaskSize}px ${finalMaskSize}px;\n        mask-size: ${finalMaskSize}px ${finalMaskSize}px;\n      }\n    }\n  `;\n  document.head.appendChild(style);\n  return style;\n}\n\nfunction storedTheme(): ThemeMode {\n  if (typeof window === \"undefined\") return \"light\";\n  try {\n    return window.localStorage.getItem(THEME_STORAGE_KEY) === \"dark\" ? \"dark\" : \"light\";\n  } catch {\n    return \"light\";\n  }\n}\n\nexport function applyTheme(theme: ThemeMode, { persist = true }: { persist?: boolean } = {}) {\n  if (typeof document === \"undefined\") return;\n  document.body.classList.toggle(\"dark\", theme === \"dark\");\n  if (persist) {\n    try {\n      window.localStorage.setItem(THEME_STORAGE_KEY, theme);\n    } catch {\n      // The control remains usable when storage is blocked or unavailable.\n    }\n  }\n  window.dispatchEvent(new CustomEvent(THEME_CHANGE_EVENT, { detail: theme }));\n}\n\nfunction elementCenter(element: HTMLElement | null): ThemeTransitionOrigin {\n  if (!element) {\n    return { x: window.innerWidth / 2, y: window.innerHeight / 2 };\n  }\n  const rect = element.getBoundingClientRect();\n  return { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 };\n}\n\nfunction normalizedOrigin(\n  origin: ThemeTransitionOrigin | null,\n  element: HTMLElement | null,\n): ThemeTransitionOrigin {\n  const fallback = elementCenter(element);\n  const x = origin?.x ?? fallback.x;\n  const y = origin?.y ?? fallback.y;\n  return {\n    x: Math.min(Math.max(x, 0), window.innerWidth),\n    y: Math.min(Math.max(y, 0), window.innerHeight),\n  };\n}\n\n/**\n * Reveals the next theme from the interaction point using the View Transition\n * API. Keyboard activation starts at the control's center. Unsupported\n * browsers and reduced-motion users receive the same immediate theme change.\n */\nexport async function applyThemeWithTransition(\n  theme: ThemeMode,\n  {\n    origin = null,\n    element = null,\n    duration = THEME_TRANSITION_DURATION,\n  }: {\n    origin?: ThemeTransitionOrigin | null;\n    element?: HTMLElement | null;\n    duration?: number;\n  } = {},\n) {\n  if (typeof document === \"undefined\") return;\n  if (themeTransitionRunning) { pendingTheme={theme,origin,element,duration}; return; }\n  if (currentTheme() === theme) return;\n\n  const transitionDocument = document as ViewTransitionDocument;\n  const reduceMotion = window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n  if (!transitionDocument.startViewTransition || reduceMotion) {\n    applyTheme(theme);\n    return;\n  }\n\n  const { x, y } = normalizedOrigin(origin, element);\n  const radius = Math.hypot(\n    Math.max(x, window.innerWidth - x),\n    Math.max(y, window.innerHeight - y),\n  );\n\n  themeTransitionRunning = true;\n  document.documentElement.classList.add(\"theme-transitioning\");\n  const transitionStyle = installThemeTransitionStyle({ x, y }, radius, duration);\n  try {\n    const transition = transitionDocument.startViewTransition(() => {\n      flushSync(() => applyTheme(theme));\n    });\n\n    await transition.ready;\n    await transition.finished;\n  } catch {\n    // If the browser aborts a transition mid-flight, the theme still changes.\n    if (currentTheme() !== theme) applyTheme(theme);\n  } finally {\n    transitionStyle.remove();\n    document.documentElement.classList.remove(\"theme-transitioning\");\n    themeTransitionRunning = false;\n    const next=pendingTheme;\n    pendingTheme=null;\n    if(next)await applyThemeWithTransition(next.theme,next);\n  }\n}\n\nfunction currentTheme(): ThemeMode {\n  if (typeof document === \"undefined\") return \"light\";\n  return document.body?.classList.contains(\"dark\") ? \"dark\" : \"light\";\n}\n\nfunction subscribe(onStoreChange: () => void) {\n  const onThemeChange = () => onStoreChange();\n  const onStorage = (event: StorageEvent) => {\n    if (event.key !== THEME_STORAGE_KEY) return;\n    applyTheme(event.newValue === \"dark\" ? \"dark\" : \"light\", { persist: false });\n  };\n  const observer=new MutationObserver(onThemeChange);if(document.body)observer.observe(document.body,{attributes:true,attributeFilter:[\"class\"]});\n  window.addEventListener(THEME_CHANGE_EVENT, onThemeChange);\n  window.addEventListener(\"storage\", onStorage);\n  return () => {\n    observer.disconnect();\n    window.removeEventListener(THEME_CHANGE_EVENT, onThemeChange);\n    window.removeEventListener(\"storage\", onStorage);\n  };\n}\n\nexport function useThemeMode(): ThemeMode {\n  return useSyncExternalStore(subscribe, currentTheme, () => \"light\");\n}\n\nexport interface ThemeToggleProps {\n  /** Compact icon-only treatment for a collapsed sidebar rail. */\n  collapsed?: boolean;\n  /**\n   * Visual treatment for the control. `glass-segmented` is the landing nav's\n   * skin: literal black/white rather than theme tokens, because it sits on the\n   * hero shader's near-white band in both themes and a token that follows the\n   * page would invert out of sight in dark mode.\n   */\n  appearance?: \"sidebar\" | \"segmented\" | \"sidebar-segmented\" | \"glass-segmented\";\n  className?: string;\n  /** Size of segmented controls; small fits inside dropdown rows. */\n  size?: \"small\" | \"medium\";\n  /** Circular reveal duration in milliseconds. */\n  transitionDuration?: number;\n}\n\n/** Manual light/dark control. It never reads the operating-system theme. */\nexport function ThemeToggle({\n  collapsed = false,\n  appearance = \"sidebar\",\n  className,\n  size = \"medium\",\n  transitionDuration = THEME_TRANSITION_DURATION,\n}: ThemeToggleProps) {\n  const localize = useTemplateCopy();\n  const theme = useThemeMode();\n  const dark = theme === \"dark\";\n  const switchRef = useRef<HTMLLabelElement | null>(null);\n  const pointerOriginRef = useRef<ThemeTransitionOrigin | null>(null);\n\n  // Makes the component self-contained in customer projects. BoardUI itself\n  // also runs the same lookup before hydration to avoid a first-paint flash.\n  useEffect(() => {\n    // Host application owns initial document theme restoration.\n  }, []);\n\n  if (\n    appearance === \"segmented\" ||\n    appearance === \"sidebar-segmented\" ||\n    appearance === \"glass-segmented\"\n  ) {\n    const glass = appearance === \"glass-segmented\";\n    const small = size === \"small\" && !glass;\n    const sidebarSurface = appearance === \"sidebar-segmented\";\n    const options = [\n      { mode: \"light\" as const, label: \"Use light mode\", Icon: RiSunLine },\n      { mode: \"dark\" as const, label: \"Use dark mode\", Icon: RiMoonLine },\n    ];\n\n    return localize((\n      <div\n        role=\"group\"\n        aria-label=\"Theme\"\n        className={cx(\n          \"relative inline-flex w-fit items-center gap-1 rounded-full p-1\",\n          // Mobile: 2px padding + 28px segments = 32px tall, matching the\n          // small icon buttons beside it. Desktop keeps the roomier 40px.\n          glass && \"p-0.5 sm:p-1\",\n          small && \"gap-0.5 p-0.5\",\n          glass\n            ? // No track of its own: the host supplies the surface. A fill\n              // here would paint over it. Kept registry-safe — this component\n              // never imports the landing page's glass.\n              \"z-10 bg-transparent\"\n            : sidebarSurface\n              ? \"bg-theme-toggle-sidebar-background\"\n              : \"bg-background-secondary-default\",\n          className,\n        )}\n      >\n        <span\n          aria-hidden\n          className={cx(\n            \"pointer-events-none absolute top-1 start-1 size-8 rounded-full\",\n            \"shadow-xs transition-transform duration-200 ease\",\n            glass && \"top-0.5 start-0.5 size-7 sm:top-1 sm:start-1 sm:size-8\",\n            small && \"top-0.5 start-0.5 size-6\",\n            glass\n              ? \"bg-white dark:bg-[#2e2e33]\"\n              : sidebarSurface\n                ? \"bg-theme-toggle-sidebar-selected-background\"\n                : \"bg-background-primary-default\",\n            // Segment width + the 4px gap: 28+4 on mobile, 32+4 above it.\n            dark && (small ? \"translate-x-6.5 rtl:-translate-x-6.5\" : glass ? \"translate-x-8 rtl:-translate-x-8 sm:translate-x-9 sm:rtl:-translate-x-9\" : \"translate-x-9 rtl:-translate-x-9\"),\n          )}\n        />\n        {options.map(({ mode, label, Icon }) => {\n          const selected = theme === mode;\n          return (\n            <button\n              key={mode}\n              type=\"button\"\n              aria-label={label}\n              aria-pressed={selected}\n              title={mode === \"light\" ? \"Light mode\" : \"Dark mode\"}\n              onClick={(event) => {\n                if (selected) return;\n                const pointerOrigin =\n                  event.clientX === 0 && event.clientY === 0\n                    ? null\n                    : { x: event.clientX, y: event.clientY };\n                void applyThemeWithTransition(mode, {\n                  origin: pointerOrigin,\n                  element: event.currentTarget,\n                  duration: transitionDuration,\n                });\n              }}\n              className={cx(\n                \"relative z-10 grid size-8 cursor-pointer place-items-center rounded-full outline-none\",\n                glass && \"size-7 sm:size-8\",\n                small && \"size-6\",\n                \"transition-colors duration-150 ease\",\n                \"focus-visible:ring-2 focus-visible:ring-border-focus-ring\",\n                glass\n                  ? selected\n                    ? // Reads against the selected pill, which is white in\n                      // light and dark grey in dark — so it flips with it.\n                      \"text-black dark:text-white\"\n                    : \"text-black/45 hover:text-black/70 dark:text-white/45 dark:hover:text-white/70\"\n                  : selected\n                    ? \"text-foreground-icon-primary\"\n                    : \"text-foreground-icon-secondary hover:text-foreground-icon-primary\",\n              )}\n            >\n              <Icon className={small ? \"size-3.5\" : \"size-4\"} aria-hidden />\n            </button>\n          );\n        })}\n      </div>\n    ));\n  }\n\n  if (collapsed) {\n    const Icon = dark ? RiSunLine : RiMoonLine;\n    return localize((\n      <button\n        type=\"button\"\n        aria-label={dark ? \"Use light mode\" : \"Use dark mode\"}\n        aria-pressed={dark}\n        title={dark ? \"Light mode\" : \"Dark mode\"}\n        onClick={(event) => {\n          const pointerOrigin =\n            event.clientX === 0 && event.clientY === 0\n              ? null\n              : { x: event.clientX, y: event.clientY };\n          void applyThemeWithTransition(dark ? \"light\" : \"dark\", {\n            origin: pointerOrigin,\n            element: event.currentTarget,\n            duration: transitionDuration,\n          });\n        }}\n        className={cx(\n          \"flex size-9 cursor-pointer items-center justify-center rounded-2lg\",\n          \"text-foreground-icon-secondary transition-colors duration-150 ease\",\n          \"hover:bg-background-secondary-hover hover:text-foreground-icon-primary\",\n          \"outline-none focus-visible:ring-2 focus-visible:ring-border-focus-ring\",\n          className,\n        )}\n      >\n        <Icon className=\"size-5\" aria-hidden />\n      </button>\n    ));\n  }\n\n  return localize((\n    <AriaSwitch\n      ref={switchRef}\n      isSelected={dark}\n      onPointerDown={(event) => {\n        pointerOriginRef.current = { x: event.clientX, y: event.clientY };\n      }}\n      onChange={(selected) => {\n        const origin = pointerOriginRef.current;\n        pointerOriginRef.current = null;\n        void applyThemeWithTransition(selected ? \"dark\" : \"light\", {\n          origin,\n          element: switchRef.current,\n          duration: transitionDuration,\n        });\n      }}\n      aria-label=\"Dark mode\"\n      className={({ isFocusVisible }) =>\n        cx(\n          \"flex w-full cursor-pointer items-center justify-between rounded-2lg p-2\",\n          \"transition-colors duration-150 ease hover:bg-background-secondary-hover\",\n          isFocusVisible && \"ring-2 ring-inset ring-border-focus-ring\",\n          className,\n        )\n      }\n    >\n      {(state) => (\n        <>\n          <span className=\"flex min-w-0 items-center gap-2\">\n            <RiMoonLine className=\"size-5 shrink-0 text-foreground-icon-secondary\" aria-hidden />\n            <span className=\"text-body-medium text-text-secondary\">Dark mode</span>\n          </span>\n          <SwitchTrack state={state} size=\"sm\" shape=\"pill\" />\n        </>\n      )}\n    </AriaSwitch>\n  ));\n}\n",
  "src/board-native/components/base/announcement/announcement.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport type { ComponentType, HTMLAttributes, ReactNode, Ref } from \"react\";\nimport { useState } from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { RiShieldStarFill } from \"@remixicon/react\";\nimport { Button } from \"../buttons/button.js\";\nimport { CloseButton } from \"../buttons/close-button.js\";\nimport { cx, sortCx } from \"../../../utils/cx.js\";\n\n/**\n * Figma source: Board UI → \"Event card\" (node 3718:2317).\n *\n * A compact announcement / onboarding card sized for the sidebar (fills its\n * container — 236px inside the 260px sidebar). Structure, 1:1 with Figma:\n *\n *   card            flex-col, gap 12, p 12, radius 12, border, white, no shadow\n *   ├─ content      flex-col, gap 4\n *   │  ├─ icon      shield-star-fill, 20×20 (RiShieldStarFill)\n *   │  ├─ close     CloseButton size=\"xs\" (absolute, top-right)\n *   │  └─ text      flex-col, gap 2\n *   │     ├─ title  Body 1/Medium (14/20), text/primary\n *   │     └─ desc   Body 2/Medium (13/18), text/secondary\n *   └─ action       Button secondary / small, full width\n *\n * Height math: 12 + 20 + 4 + (20 + 2 + 36) + 12 + 32 + 12 = 150 (matches frame).\n *\n * Everything after the title is optional:\n *   - `description` omitted → text block is title-only.\n *   - `actionLabel` omitted → no CTA button.\n *   - `dismissible` false → no close button.\n *\n * Dismissal is self-managed: clicking the close button plays a soft blur +\n * scale-down (0.85) exit via `motion/react`, then unmounts and fires the\n * optional `onClose` callback. The leading `icon` defaults to the shield used\n * in the frame; pass any Remix Icon component reference (`RiSparklingFill`,\n * not `<RiSparklingFill />`).\n *\n * `introDelay` opts into a matching entrance: blur + fade + scale up from\n * 0.85, rising 15px up from below into place, after the given delay (seconds).\n * Off by default (card just appears) — set it for placements where the\n * banner should call attention after the surrounding UI has settled, e.g. the\n * sidebar slot in `DashboardSidebar`.\n */\n\ntype IconComponent = ComponentType<{\n  className?: string;\n  \"aria-hidden\"?: boolean | \"true\" | \"false\";\n}>;\n\nexport interface AnnouncementProps\n  extends Omit<\n    HTMLAttributes<HTMLDivElement>,\n    \"title\" | \"onDrag\" | \"onDragStart\" | \"onDragEnd\" | \"onAnimationStart\" | \"onAnimationEnd\"\n  > {\n  title: ReactNode;\n  description?: ReactNode;\n  /** Leading icon. Defaults to the shield-star from the Figma frame. */\n  icon?: IconComponent;\n  /** CTA label. When set, a full-width secondary button is rendered. */\n  actionLabel?: ReactNode;\n  onAction?: () => void;\n  /** Show a dismiss button in the top-right corner. */\n  dismissible?: boolean;\n  /** Called once the dismiss exit animation finishes. */\n  onClose?: () => void;\n  /** Accessible name for the dismiss button. */\n  closeLabel?: string;\n  /**\n   * Seconds to wait before playing the blur/fade/scale-up entrance. Omit to\n   * skip the entrance entirely (card just appears).\n   */\n  introDelay?: number;\n  ref?: Ref<HTMLDivElement>;\n}\n\nconst styles = sortCx({\n  card: [\n    \"relative flex w-full flex-col items-start gap-3 p-3\",\n    \"rounded-xl border border-border-button-default bg-background-primary-default\",\n  ].join(\" \"),\n  content: \"flex w-full flex-col items-start gap-1\",\n  icon: \"size-5 shrink-0 text-foreground-icon-secondary\",\n  close: \"absolute end-3 top-3\",\n  text: \"flex w-full flex-col items-start gap-0.5\",\n  title: \"w-full text-body-medium text-text-primary\",\n  description: \"w-full text-body-2-medium text-text-secondary\",\n});\n\nexport function Announcement({\n  title,\n  description,\n  icon: Icon = RiShieldStarFill,\n  actionLabel,\n  onAction,\n  dismissible = false,\n  onClose,\n  closeLabel = \"Dismiss\",\n  introDelay,\n  className,\n  ref,\n  ...props\n}: AnnouncementProps) {\n  const [dismissed, setDismissed] = useState(false);\n  const hasIntro = introDelay !== undefined;\n\n  return (\n    <AnimatePresence onExitComplete={onClose}>\n      {!dismissed && (\n        <motion.div\n          ref={ref}\n          initial={hasIntro ? { opacity: 0, y: 15, scale: 0.85, filter: \"blur(6px)\" } : false}\n          animate={\n            hasIntro\n              ? {\n                  opacity: 1,\n                  y: 0,\n                  scale: 1,\n                  filter: \"blur(0px)\",\n                  transition: { duration: 0.25, ease: \"easeOut\", delay: introDelay },\n                }\n              : undefined\n          }\n          exit={{\n            opacity: 0,\n            scale: 0.85,\n            filter: \"blur(6px)\",\n            transition: { duration: 0.25, ease: \"easeInOut\" },\n          }}\n          className={cx(styles.card, className)}\n          {...props}\n        >\n          <div className={styles.content}>\n            <Icon className={styles.icon} aria-hidden />\n\n            {dismissible ? (\n              <CloseButton\n                size=\"xs\"\n                aria-label={closeLabel}\n                onClick={() => setDismissed(true)}\n                className={styles.close}\n              />\n            ) : null}\n\n            <div className={styles.text}>\n              <p className={styles.title}>{title}</p>\n              {description ? <p className={styles.description}>{description}</p> : null}\n            </div>\n          </div>\n\n          {actionLabel ? (\n            <Button\n              variant=\"secondary\"\n              size=\"small\"\n              onClick={onAction}\n              className=\"w-full\"\n            >\n              {actionLabel}\n            </Button>\n          ) : null}\n        </motion.div>\n      )}\n    </AnimatePresence>\n  );\n}\n",
  "src/board-native/components/base/avatar/avatar.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n/* eslint-disable @next/next/no-img-element */\nimport type { HTMLAttributes, Ref } from \"react\";\nimport { cx, sortCx } from \"../../../utils/cx.js\";\n\n/**\n * Figma source: Board UI → Avatar (styles Avatar/1…Avatar/26; used throughout\n * dashboard 1, node 3731:2932).\n *\n * Sizes used in the designs (px):\n *   xs = 20   breadcrumb workspace marks     (initials 10/15 semibold)\n *   sm = 24   table rows                     (initials 12/16 semibold)\n *   md = 32   sidebar workspace / team card  (initials 16/22 semibold)\n *   lg = 36   people cards                   (initials 18/24 semibold)\n *\n * Renders a photo when `src` is given, otherwise centered initials on a\n * tinted disc. Initial tints from Figma:\n *   neutral → bg avatar/neutral/background, text text/secondary\n *   blue    → bg color/blue/300,    text color/blue/900\n *   lime    → bg color/lime/200,    text color/lime/700\n *   pink    → bg color/pink/200,    text color/pink/500\n */\n\ntype AvatarSize = \"xs\" | \"sm\" | \"md\" | \"lg\";\ntype AvatarColor = \"neutral\" | \"blue\" | \"lime\" | \"pink\";\n\nexport interface AvatarProps extends HTMLAttributes<HTMLSpanElement> {\n  size?: AvatarSize;\n  color?: AvatarColor;\n  /** Photo URL. Wins over `initials`. */\n  src?: string;\n  alt?: string;\n  /** Fallback initials, e.g. \"M\". */\n  initials?: string;\n  ref?: Ref<HTMLSpanElement>;\n}\n\nconst styles = sortCx({\n  base: \"inline-flex shrink-0 select-none items-center justify-center overflow-hidden rounded-full text-center align-middle transition-[width,height,font-size] duration-200 ease\",\n  size: {\n    xs: \"size-5 text-[10px] leading-[15px] font-semibold\",\n    sm: \"size-6 text-caption-1-semibold tracking-normal\",\n    md: \"size-8 text-headline-semibold\",\n    lg: \"size-9 text-[18px] leading-6 font-semibold\",\n  },\n  color: {\n    neutral: \"bg-avatar-neutral-background text-text-secondary\",\n    blue: \"bg-blue-300 text-blue-900\",\n    lime: \"bg-lime-200 text-lime-700\",\n    pink: \"bg-pink-200 text-pink-500\",\n  },\n});\n\nexport function Avatar({\n  size = \"md\",\n  color = \"neutral\",\n  src,\n  alt,\n  initials,\n  className,\n  ref,\n  ...props\n}: AvatarProps) {\n  return (\n    <span\n      ref={ref}\n      className={cx(styles.base, styles.size[size], styles.color[color], className)}\n      {...props}\n    >\n      {src ? (\n        <img\n          src={src}\n          alt={alt ?? \"\"}\n          loading=\"lazy\"\n          decoding=\"async\"\n          className=\"size-full object-cover\"\n        />\n      ) : (\n        initials\n      )}\n    </span>\n  );\n}\n",
  "src/board-native/components/base/badges/badge.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\nimport type { HTMLAttributes, Ref } from \"react\";\nimport { cx, sortCx } from \"../../../utils/cx.js\";\n\n/**\n * Figma source: Board UI → dashboard 1 sidebar counters (nodes 3731:2964,\n * 3731:2982).\n *\n * Small numeric counter pill (nav item counts, unread totals).\n *   - 12/16 semibold, tracking 0 (Figma uses font/size/xs + font/leading/4)\n *   - px 4, py 1, radius/sm (4px)\n *   - primary → bg color/blue/400, white text (sits on the selected nav item)\n *   - neutral → bg color/neutral/200, text/secondary\n */\n\ntype BadgeColor = \"primary\" | \"neutral\";\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n  color?: BadgeColor;\n  ref?: Ref<HTMLSpanElement>;\n}\n\nconst styles = sortCx({\n  base: \"inline-flex items-center justify-center rounded-sm px-1 py-px text-caption-1-semibold tracking-normal whitespace-nowrap\",\n  color: {\n    primary: \"bg-accent-600 text-white\",\n    neutral: \"bg-badge-neutral-background text-text-secondary\",\n  },\n});\n\nexport function Badge({ color = \"neutral\", className, ref, ...props }: BadgeProps) {\n  return (\n    <span\n      ref={ref}\n      className={cx(styles.base, styles.color[color], className)}\n      style={color===\"primary\"?{backgroundColor:\"var(--accent-action,var(--color-accent-600))\"}:undefined}\n      {...props}\n    />\n  );\n}\n",
  "src/board-native/components/base/badges/chip.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\nimport type { HTMLAttributes, Ref } from \"react\";\nimport { cx, sortCx } from \"../../../utils/cx.js\";\n\n/**\n * Figma source: Board UI → dashboard 1 \"Chip\" layers (status chips, delta\n * chips, price chips, role chips — e.g. nodes 3731:3273, 3731:3094, 3731:3280,\n * 3731:3055).\n *\n * Colored label chip. Three emphasis levels, all rounded radius/md (6px),\n * px 6:\n *\n *   bold    py 2, Body 1/Medium   (14/20/500) — status + percentage deltas\n *   subtle  py 4, Body 1/Medium   (14/20/500) — price chips\n *   caption py 4, Caption 1/Medium (12/16/500, tracking .15) — role tags\n *\n * Status pairs are semantic so the same component follows both Figma modes:\n *   lime    light 200/800 · dark 950 @ 60% / 500\n *   rose    light 200/800 · dark 950 @ 60% / 500\n *   yellow  light 200/800 · dark 950 @ 60% / 500\n *   cyan    light 200/800 · dark 950 @ 60% / 400\n *   blue    light 200/800 · dark 950 @ 60% / 300 (same dark status recipe;\n *           first needed by the medical template's \"In treatment\" status)\n *   purple  light 100/600 · dark 900/300 (AI profile delta chips)\n *   neutral bg color/neutral/200 text color/neutral/500\n *   gray    bg color/neutral/100 text color/neutral/800\n *   soft    bg background/secondary/default text text/secondary\n */\n\ntype ChipVariant = \"bold\" | \"subtle\" | \"caption\";\ntype ChipColor = \"orange\" | \"lime\" | \"rose\" | \"yellow\" | \"cyan\" | \"blue\" | \"purple\" | \"neutral\" | \"gray\" | \"soft\";\n\nexport interface ChipProps extends HTMLAttributes<HTMLSpanElement> {\n  variant?: ChipVariant;\n  color?: ChipColor;\n  ref?: Ref<HTMLSpanElement>;\n}\n\nconst styles = sortCx({\n  base: \"inline-flex items-center justify-center rounded-md px-1.5 whitespace-nowrap transition-[padding,font-size] duration-200 ease\",\n  variant: {\n    bold: \"py-0.5 text-body-medium\",\n    subtle: \"py-1 text-body-medium\",\n    caption: \"py-1 text-caption-1-medium\",\n  },\n  color: {\n    orange: \"bg-status-orange-background text-status-orange-text\",\n    lime: \"bg-status-lime-background text-status-lime-text\",\n    rose: \"bg-status-rose-background text-status-rose-text\",\n    yellow: \"bg-status-yellow-background text-status-yellow-text\",\n    cyan: \"bg-status-cyan-background text-status-cyan-text\",\n    blue: \"bg-status-blue-background text-status-blue-text\",\n    purple: \"bg-status-purple-background text-status-purple-text\",\n    neutral: \"bg-background-tertiary-default text-text-secondary\",\n    gray: \"bg-background-secondary-default text-text-primary\",\n    soft: \"bg-background-secondary-default text-text-secondary\",\n  },\n});\n\nexport function Chip({\n  variant = \"bold\",\n  color = \"neutral\",\n  className,\n  ref,\n  ...props\n}: ChipProps) {\n  return (\n    <span\n      ref={ref}\n      className={cx(styles.base, styles.variant[variant], styles.color[color], className)}\n      {...props}\n    />\n  );\n}\n",
  "src/board-native/components/base/badges/status-dot.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\nimport type { HTMLAttributes, Ref } from \"react\";\nimport { cx, sortCx } from \"../../../utils/cx.js\";\n\n/**\n * Figma source: Board UI → dashboard 1 status dropdown dots (node 3731:3266).\n *\n * 12×12 status indicator: a 6px solid dot centered on a tinted halo.\n * Color pairs from Figma variables:\n *   green  → halo color/green/100,  dot color/green/500\n *   yellow → halo color/yellow/200, dot color/yellow/500\n *   indigo → halo color/indigo/100, dot color/indigo/500\n * In dark mode only the halo drops to 40% opacity; the center dot stays solid.\n */\n\ntype StatusDotColor = \"green\" | \"yellow\" | \"indigo\";\n\nexport interface StatusDotProps extends HTMLAttributes<HTMLSpanElement> {\n  color?: StatusDotColor;\n  ref?: Ref<HTMLSpanElement>;\n}\n\nconst styles = sortCx({\n  base: \"inline-flex size-3 shrink-0 items-center justify-center rounded-full\",\n  halo: {\n    green: \"bg-status-dot-green-halo\",\n    yellow: \"bg-status-dot-yellow-halo\",\n    indigo: \"bg-status-dot-indigo-halo\",\n  },\n  dot: {\n    green: \"bg-green-500\",\n    yellow: \"bg-yellow-500\",\n    indigo: \"bg-indigo-500\",\n  },\n});\n\nexport function StatusDot({ color = \"green\", className, ref, ...props }: StatusDotProps) {\n  return (\n    <span\n      ref={ref}\n      aria-hidden\n      className={cx(styles.base, styles.halo[color], className)}\n      {...props}\n    >\n      <span className={cx(\"size-1.5 rounded-full\", styles.dot[color])} />\n    </span>\n  );\n}\n",
  "src/board-native/components/base/breadcrumb/breadcrumb.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\nimport {NativeAnchor as Link} from \"../../../NativeAnchor.js\";\nimport { Children, Fragment, isValidElement } from \"react\";\nimport type { ComponentType, ReactNode, Ref } from \"react\";\nimport { ChevronRightSmall } from \"../../foundations/icons/chevrons.js\";\nimport { cx } from \"../../../utils/cx.js\";\n\n/**\n * Figma source: Board UI → dashboard 1 breadcrumb (node 3731:3011).\n *\n * Trail of ancestor pages separated by chevrons.\n *   item      Caption 1/Medium, text/tertiary, gap 6 (icon/avatar ↔ label)\n *   hover     interactive items darken to text/secondary with a soft\n *             background/primary/hover pill\n *   current   aria-current=\"page\", neutral/700, not interactive\n *   separator ChevronRightSmall, text/tertiary, gap 10 between items\n *\n * Compose <BreadcrumbItem>s inside <Breadcrumb>; separators are inserted\n * automatically. An item becomes a link when given `href`, a button when given\n * `onClick`, otherwise a plain label (use `current` for the active page).\n */\n\ntype IconComponent = ComponentType<{\n  className?: string;\n  \"aria-hidden\"?: boolean | \"true\" | \"false\";\n}>;\n\nexport interface BreadcrumbProps {\n  children: ReactNode;\n  \"aria-label\"?: string;\n  className?: string;\n  ref?: Ref<HTMLElement>;\n}\n\nexport function Breadcrumb({\n  children,\n  \"aria-label\": ariaLabel = \"Breadcrumb\",\n  className,\n  ref,\n}: BreadcrumbProps) {\n  const items = Children.toArray(children).filter(isValidElement);\n\n  return (\n    <nav\n      ref={ref}\n      aria-label={ariaLabel}\n      className={cx(\n        \"flex w-full items-center overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\",\n        className,\n      )}\n    >\n      <ol className=\"flex items-center gap-2.5 px-1\">\n        {items.map((item, index) => (\n          <Fragment key={item.key ?? index}>\n            {index > 0 && (\n              <ChevronRightSmall className=\"size-3 shrink-0 text-text-tertiary\" aria-hidden />\n            )}\n            {item}\n          </Fragment>\n        ))}\n      </ol>\n    </nav>\n  );\n}\n\nexport interface BreadcrumbItemProps {\n  children?: ReactNode;\n  /** Optional leading icon (16px), inherits the item color. */\n  icon?: IconComponent;\n  href?: string;\n  onClick?: () => void;\n  /** Marks the active page: not interactive, darker text. */\n  current?: boolean;\n  className?: string;\n}\n\nexport function BreadcrumbItem({\n  children,\n  icon: Icon,\n  href,\n  onClick,\n  current = false,\n  className,\n}: BreadcrumbItemProps) {\n  const content = (\n    <>\n      {Icon && <Icon className=\"size-4 shrink-0\" aria-hidden />}\n      {children}\n    </>\n  );\n\n  if (current) {\n    return (\n      <li\n        aria-current=\"page\"\n        className={cx(\n          \"flex items-center gap-1.5 text-caption-1-medium whitespace-nowrap text-text-secondary\",\n          className,\n        )}\n      >\n        {content}\n      </li>\n    );\n  }\n\n  const interactiveClass = cx(\n    \"-mx-1 flex items-center gap-1.5 rounded-md px-1 py-0.5 text-caption-1-medium whitespace-nowrap text-text-tertiary\",\n    \"transition-colors duration-150 ease outline-none\",\n    \"hover:bg-background-primary-hover hover:text-text-secondary\",\n    \"focus-visible:ring-2 focus-visible:ring-border-focus-ring\",\n    className,\n  );\n\n  return (\n    <li className=\"flex items-center\">\n      {href ? (\n        <Link href={href} className={interactiveClass}>\n          {content}\n        </Link>\n      ) : (\n        <button type=\"button\" onClick={onClick} className={cx(\"cursor-pointer\", interactiveClass)}>\n          {content}\n        </button>\n      )}\n    </li>\n  );\n}\n",
  "src/board-native/components/base/buttons/button-group.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\nimport type {\n  ButtonHTMLAttributes,\n  ComponentType,\n  ReactNode,\n  Ref,\n} from \"react\";\nimport { cx, sortCx } from \"../../../utils/cx.js\";\nimport { directionalIconClass } from \"../../../utils/directional-icon.js\";\n\n/**\n * Button group — a row of secondary-style buttons fused into one control:\n * shared 1px border/button/default container with radius/2lg and shadow/xs,\n * items divided by 1px hairlines, only the outer corners rounded. The classic\n * toolbar / filter pattern (\"Left | Center | Right\").\n *\n * Sizing follows Button's secondary sizes:\n *   medium  h=36, px=12, Body 1/Medium, 20px icons\n *   small   h=32, px=10, Body 1/Medium, 18px icons\n *\n * Items can be text, icon + text, or icon-only (pass `iconOnly` +\n * `aria-label`). A pressed/selected item (`selected`) keeps the hover fill —\n * drive it from state for single or multi select toolbars, or leave every\n * item unselected for pure action rows. For a full segmented switcher with\n * animated thumb, see SegmentedControl instead.\n */\n\ntype ButtonGroupSize = \"medium\" | \"small\";\n\ntype IconComponent = ComponentType<{\n  className?: string;\n  \"aria-hidden\"?: boolean | \"true\" | \"false\";\n}>;\n\nconst styles = sortCx({\n  group: [\n    \"inline-flex items-stretch isolate\",\n    \"rounded-2lg border border-border-button-group bg-background-primary-default shadow-xs\",\n    // Hairlines between items, outer corners rounded on the first/last item\n    \"divide-x divide-border-button-default overflow-hidden\",\n  ].join(\" \"),\n\n  item: [\n    \"inline-flex items-center justify-center gap-1 whitespace-nowrap\",\n    \"bg-background-primary-default text-text-primary font-sans select-none cursor-pointer\",\n    \"transition-[background-color,color] duration-150 ease\",\n    \"outline-none focus-visible:relative focus-visible:z-10 focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-border-focus-ring\",\n    \"hover:bg-background-primary-hover active:bg-background-primary-active\",\n    \"disabled:cursor-not-allowed disabled:bg-background-primary-disabled disabled:text-text-tertiary\",\n  ].join(\" \"),\n\n  size: {\n    medium: \"h-[34px] px-3 text-body-medium\",\n    small: \"h-[30px] px-2.5 text-body-medium\",\n  },\n\n  iconOnlySize: {\n    medium: \"w-[34px] px-0\",\n    small: \"w-[30px] px-0\",\n  },\n\n  icon: {\n    medium: \"size-5 shrink-0\",\n    small: \"size-[18px] shrink-0\",\n  },\n\n  selected: \"bg-background-primary-hover\",\n});\n\n/* ------------------------------------------------------------------- group */\n\nexport interface ButtonGroupProps {\n  size?: ButtonGroupSize;\n  /** ButtonGroupItem children. */\n  children: ReactNode;\n  className?: string;\n  \"aria-label\"?: string;\n  ref?: Ref<HTMLDivElement>;\n}\n\nexport function ButtonGroup({ size = \"medium\", children, className, ref, ...props }: ButtonGroupProps) {\n  return (\n    <div ref={ref} role=\"group\" data-size={size} className={cx(styles.group, className)} {...props}>\n      {children}\n    </div>\n  );\n}\n\n/* -------------------------------------------------------------------- item */\n\nexport interface ButtonGroupItemProps\n  extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"children\"> {\n  size?: ButtonGroupSize;\n  /** Highlights the item like its hover state; sets aria-pressed. */\n  selected?: boolean;\n  iconOnly?: boolean;\n  leadingIcon?: IconComponent;\n  trailingIcon?: IconComponent;\n  children?: ReactNode;\n  ref?: Ref<HTMLButtonElement>;\n}\n\nexport function ButtonGroupItem({\n  size = \"medium\",\n  selected = false,\n  iconOnly = false,\n  leadingIcon: Leading,\n  trailingIcon: Trailing,\n  children,\n  className,\n  type = \"button\",\n  ref,\n  ...props\n}: ButtonGroupItemProps) {\n  return (\n    <button\n      ref={ref}\n      type={type}\n      aria-pressed={selected || undefined}\n      className={cx(\n        styles.item,\n        styles.size[size],\n        iconOnly && styles.iconOnlySize[size],\n        selected && styles.selected,\n        className,\n      )}\n      {...props}\n    >\n      {Leading ? <Leading className={cx(styles.icon[size], directionalIconClass(Leading))} aria-hidden /> : null}\n      {!iconOnly && children !== undefined && children !== null && <span>{children}</span>}\n      {!iconOnly && Trailing ? <Trailing className={cx(styles.icon[size], directionalIconClass(Trailing))} aria-hidden /> : null}\n    </button>\n  );\n}\n",
  "src/board-native/components/base/buttons/button.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\nimport type {\n  AnchorHTMLAttributes,\n  ButtonHTMLAttributes,\n  ComponentType,\n  ReactNode,\n  Ref,\n} from \"react\";\nimport { cx, sortCx } from \"../../../utils/cx.js\";\nimport { directionalIconClass } from \"../../../utils/directional-icon.js\";\n\n/**\n * Figma source: Board UI → Buttons (node 3656:13819).\n *\n * Variant matrix from Figma:\n *   Type     = Primary | Secondary | Ghost | Danger\n *   Size     = Medium  | Small | Xs\n *   State    = Default | Hover | Active | Disabled        (CSS pseudo)\n *   OnlyIcon = false   | true\n *\n * Sizing (1:1 with Figma):\n *\n *                       Medium                    Small                     Xs\n *   container          h=36, p=8,   r=10         h=32, px=8 py=6, r=8      h=24, px=8, r=4\n *   gap                 2px                       2px                      1.33px→1\n *   icon                20×20                     18×18                    14×14\n *   label wrapper       px=4                      px=2                     px=2\n *   text style          Body 1/Medium             Body 1/Medium            Caption 1/Semibold\n *   icon-only square    36×36 (content-derived)   32×32 (forced size)      24×24 (forced size)\n *\n * `xs` is the smallest tier — first needed for the calendar template's\n * event-details modal (\"Join\" / edit-icon buttons, node 3920:10954), which\n * scales every dimension down by the same ~0.667 factor from Figma; the\n * table above rounds those to clean pixel values rather than reproducing\n * the fractional source numbers.\n *\n * Icons are rendered by the component itself via the `leadingIcon` /\n * `trailingIcon` props so the consumer can't pass the wrong size. Pass\n * a Remix Icon component reference (`RiAddLine`, not `<RiAddLine />`).\n *\n * For icon-only buttons:\n *   <Button iconOnly leadingIcon={RiAddLine} aria-label=\"Add\" />\n *\n * The HTML `type` prop is preserved; Figma's \"Type\" enum is renamed to\n * `variant` to avoid the clash.\n */\n\ntype ButtonVariant = \"primary\" | \"secondary\" | \"ghost\" | \"danger\";\ntype ButtonSize = \"medium\" | \"small\" | \"xs\";\n\ntype IconComponent = ComponentType<{\n  className?: string;\n  \"aria-hidden\"?: boolean | \"true\" | \"false\";\n}>;\n\nexport interface ButtonProps\n  extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"children\"> {\n  variant?: ButtonVariant;\n  size?: ButtonSize;\n  iconOnly?: boolean;\n  leadingIcon?: IconComponent;\n  trailingIcon?: IconComponent;\n  children?: ReactNode;\n  ref?: Ref<HTMLButtonElement>;\n}\n\nexport interface ButtonLinkProps\n  extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, \"children\"> {\n  variant?: ButtonVariant;\n  size?: ButtonSize;\n  iconOnly?: boolean;\n  leadingIcon?: IconComponent;\n  trailingIcon?: IconComponent;\n  children?: ReactNode;\n  ref?: Ref<HTMLAnchorElement>;\n}\n\nconst styles = sortCx({\n  base: [\n    \"inline-flex items-center justify-center gap-0.5 whitespace-nowrap overflow-hidden\",\n    \"font-sans select-none cursor-pointer\",\n    \"button-press-motion\",\n    \"outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-border-focus-ring\",\n    \"disabled:cursor-not-allowed aria-disabled:cursor-not-allowed\",\n  ].join(\" \"),\n\n  // Base shape per size (used when label is present OR medium icon-only).\n  size: {\n    medium: \"h-9 rounded-2lg p-2 text-body-medium\",\n    small:  \"h-8 rounded-lg px-2 py-1.5 text-body-medium\",\n    xs:     \"h-6 rounded-sm px-2 text-caption-1-semibold\",\n  },\n\n  // Icon-only override:\n  //   Medium → keep p-2; w expands from content (8+20+8 = 36) → square.\n  //   Small  → Figma forces 32×32 even though 8+18+8=34, so we hard-set size-8\n  //            and zero the padding; the inner flex centers the 18px icon.\n  //   Xs     → forces 24×24, content-centered — used for the calendar\n  //            template's edit-icon buttons (timezone/participants/reminder).\n  iconOnlySize: {\n    medium: \"\",                // base size already produces 36×36 with a 20px icon\n    small:  \"size-8 p-0\",      // hard 32×32, content-centered\n    xs:     \"size-6 p-0\",      // hard 24×24, content-centered\n  },\n\n  icon: {\n    medium: \"size-5 shrink-0\",        // 20px\n    small:  \"size-[18px] shrink-0\",   // 18px\n    xs:     \"size-3.5 shrink-0\",      // 14px\n  },\n\n  label: {\n    medium: \"inline-flex items-center justify-center px-1 shrink-0\",    // px=4\n    small:  \"inline-flex items-center justify-center px-0.5 shrink-0\",  // px=2\n    xs:     \"inline-flex items-center justify-center px-0.5 shrink-0\",  // px=2\n  },\n\n  variant: {\n    primary: [\n      \"bg-button-primary text-text-white shadow-xs\",\n      \"disabled:text-button-primary-disabled-foreground disabled:shadow-none\",\n      \"aria-disabled:text-button-primary-disabled-foreground aria-disabled:shadow-none\",\n    ].join(\" \"),\n    danger: [\n      \"bg-button-danger text-text-white shadow-xs\",\n      \"disabled:text-foreground-disabled-danger disabled:shadow-none\",\n      \"aria-disabled:text-foreground-disabled-danger aria-disabled:shadow-none\",\n    ].join(\" \"),\n    secondary: [\n      \"bg-background-primary-default text-text-primary\",\n      \"border border-border-button-default shadow-xs\",\n      \"hover:bg-background-primary-hover  hover:border-border-button-hover\",\n      \"active:bg-background-primary-active active:border-border-button-active\",\n      \"disabled:bg-background-primary-disabled disabled:border-border-button-default disabled:text-text-tertiary disabled:shadow-none\",\n      \"aria-disabled:bg-background-primary-disabled aria-disabled:border-border-button-default aria-disabled:text-text-tertiary aria-disabled:shadow-none\",\n    ].join(\" \"),\n    ghost: [\n      \"bg-button-ghost-background text-button-ghost-foreground\",\n      \"hover:bg-button-ghost-hover active:bg-button-ghost-active\",\n      \"disabled:bg-button-ghost-disabled disabled:text-button-ghost-disabled-foreground disabled:shadow-none\",\n      \"aria-disabled:bg-button-ghost-disabled aria-disabled:text-button-ghost-disabled-foreground aria-disabled:shadow-none\",\n    ].join(\" \"),\n  },\n});\n\nexport function Button({\n  variant = \"primary\",\n  size = \"medium\",\n  iconOnly = false,\n  leadingIcon: Leading,\n  trailingIcon: Trailing,\n  children,\n  className,\n  type = \"button\",\n  ref,\n  ...props\n}: ButtonProps) {\n  return (\n    <button\n      ref={ref}\n      type={type}\n      className={cx(\n        styles.base,\n        styles.size[size],\n        styles.variant[variant],\n        iconOnly && styles.iconOnlySize[size],\n        className,\n      )}\n      {...props}\n    >\n      {Leading ? <Leading className={cx(styles.icon[size], directionalIconClass(Leading))} aria-hidden /> : null}\n      {!iconOnly && children !== undefined && children !== null && (\n        <span className={styles.label[size]}>{children}</span>\n      )}\n      {!iconOnly && Trailing ? (\n        <Trailing className={cx(styles.icon[size], directionalIconClass(Trailing))} aria-hidden />\n      ) : null}\n    </button>\n  );\n}\n\n/** Anchor counterpart to Button for navigational actions. */\nexport function ButtonLink({\n  variant = \"primary\",\n  size = \"medium\",\n  iconOnly = false,\n  leadingIcon: Leading,\n  trailingIcon: Trailing,\n  children,\n  className,\n  ref,\n  ...props\n}: ButtonLinkProps) {\n  return (\n    <a\n      ref={ref}\n      className={cx(\n        styles.base,\n        styles.size[size],\n        styles.variant[variant],\n        iconOnly && styles.iconOnlySize[size],\n        className,\n      )}\n      {...props}\n    >\n      {Leading ? <Leading className={cx(styles.icon[size], directionalIconClass(Leading))} aria-hidden /> : null}\n      {!iconOnly && children !== undefined && children !== null && (\n        <span className={styles.label[size]}>{children}</span>\n      )}\n      {!iconOnly && Trailing ? (\n        <Trailing className={cx(styles.icon[size], directionalIconClass(Trailing))} aria-hidden />\n      ) : null}\n    </a>\n  );\n}\n\n/** Style maps, exported for advanced composition and the dev Design Tuner. */\nexport const buttonStyles = styles;\n",
  "src/board-native/components/base/buttons/close-button.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\nimport type { ButtonHTMLAttributes, Ref } from \"react\";\nimport { cx, sortCx } from \"../../../utils/cx.js\";\n\n/**\n * Compact circular dismiss control — the \"X\" used to close announcements,\n * toasts, modals, and drawers. Companion to `IconButton`, but ships its own\n * glyph (rather than taking an `icon` prop) so every consumer gets an\n * identical X with a stroke that's a true CSS pixel value per size, not a\n * scaled approximation.\n *\n * The glyph is a hand-drawn SVG per size (not a shared icon scaled up/down)\n * because scaling a single glyph across sizes scales its stroke too — a 2px\n * line at 20px becomes ~3.2px at 32px. Each size below renders its own X in a\n * viewBox equal to its own pixel dimensions, so `strokeWidth` is always a\n * literal CSS pixel value, at every size (not a scaled approximation).\n *\n * Sizes (px):\n *   2xs = 16 container, 6.8px glyph, 1.6px stroke   (compact floating surfaces)\n *   xs = 20 container, 10.8px glyph, 2px stroke     (Announcement dismiss corner)\n *   sm = 24 container, 12.6px glyph, 2px stroke\n *   md = 32 container, 16.2px glyph, 2.5px stroke   (modal header close — a touch\n *                                                     bolder to hold its own at\n *                                                     the larger size)\n *\n * Glyph sizes are 90% of the container's natural proportion (12/14/18 → the\n * above), tuned down 10% across the board so the X reads a touch smaller\n * inside its circle.\n */\n\ntype CloseButtonSize = \"2xs\" | \"xs\" | \"sm\" | \"md\";\n\nexport interface CloseButtonProps\n  extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"children\"> {\n  size?: CloseButtonSize;\n  /** Accessible name — required since there is no visible label. */\n  \"aria-label\": string;\n  ref?: Ref<HTMLButtonElement>;\n}\n\nconst GLYPH_SIZE: Record<CloseButtonSize, number> = {\n  \"2xs\": 6.8,\n  xs: 10.8,\n  sm: 12.6,\n  md: 16.2,\n};\n\nconst STROKE_WIDTH: Record<CloseButtonSize, number> = {\n  \"2xs\": 1.6,\n  xs: 2,\n  sm: 2,\n  md: 2.5,\n};\n\nconst GLYPH_INSET: Record<CloseButtonSize, number> = {\n  // Figma's 8px bars rotate inside a 6.8px square, leaving ~0.57px at\n  // each corner once projected onto the diagonal.\n  \"2xs\": 0.57,\n  xs: 2,\n  sm: 2,\n  md: 2,\n};\n\nconst styles = sortCx({\n  base: [\n    \"inline-flex shrink-0 items-center justify-center rounded-full\",\n    \"bg-background-tertiary-default text-foreground-icon-secondary\",\n    \"select-none cursor-pointer\",\n    \"transition-colors duration-150 ease\",\n    \"hover:text-text-primary\",\n    \"outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-border-focus-ring\",\n  ].join(\" \"),\n  container: {\n    \"2xs\": \"size-4\",\n    xs: \"size-5\",\n    sm: \"size-6\",\n    md: \"size-8\",\n  },\n});\n\nexport function CloseButton({\n  size = \"xs\",\n  className,\n  type = \"button\",\n  ref,\n  ...props\n}: CloseButtonProps) {\n  const glyph = GLYPH_SIZE[size];\n  const strokeWidth = STROKE_WIDTH[size];\n  const inset = GLYPH_INSET[size];\n\n  return (\n    <button\n      ref={ref}\n      type={type}\n      className={cx(styles.base, styles.container[size], className)}\n      {...props}\n    >\n      <svg width={glyph} height={glyph} viewBox={`0 0 ${glyph} ${glyph}`} fill=\"none\" aria-hidden>\n        <path\n          d={`M${inset} ${inset}L${glyph - inset} ${glyph - inset}`}\n          stroke=\"currentColor\"\n          strokeWidth={strokeWidth}\n          strokeLinecap=\"round\"\n        />\n        <path\n          d={`M${glyph - inset} ${inset}L${inset} ${glyph - inset}`}\n          stroke=\"currentColor\"\n          strokeWidth={strokeWidth}\n          strokeLinecap=\"round\"\n        />\n      </svg>\n    </button>\n  );\n}\n",
  "src/board-native/components/base/buttons/icon-button.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\nimport type {\n  AnchorHTMLAttributes,\n  ButtonHTMLAttributes,\n  ComponentType,\n  Ref,\n} from \"react\";\nimport { cx, sortCx } from \"../../../utils/cx.js\";\nimport { directionalIconClass } from \"../../../utils/directional-icon.js\";\n\n/**\n * Figma source: Board UI → dashboard 1 icon-only buttons (notification button\n * node 3731:3035, table row actions nodes 3731:3284/3287/3290).\n *\n * Square icon-only button. Unlike `Button` (whose small size is radius/lg with\n * an 18px icon), the icon button keeps radius/2lg (10px) at both sizes:\n *\n *            container   padding   icon\n *   medium   36×36       8         20×20\n *   small    32×32       8         16×16\n *\n * One variant in the designs: secondary (white fill, border/button/default,\n * shadow/xs). Hover/active/disabled states reuse the secondary Button tokens.\n */\n\ntype IconButtonSize = \"medium\" | \"small\";\n\ntype IconComponent = ComponentType<{\n  className?: string;\n  \"aria-hidden\"?: boolean | \"true\" | \"false\";\n}>;\n\nexport interface IconButtonProps\n  extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"children\"> {\n  icon: IconComponent;\n  size?: IconButtonSize;\n  /** Accessible name — required since there is no visible label. */\n  \"aria-label\": string;\n  ref?: Ref<HTMLButtonElement>;\n}\n\nexport interface IconLinkButtonProps\n  extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, \"children\"> {\n  icon: IconComponent;\n  size?: IconButtonSize;\n  /** Accessible name — required since there is no visible label. */\n  \"aria-label\": string;\n  ref?: Ref<HTMLAnchorElement>;\n}\n\nconst styles = sortCx({\n  base: [\n    \"relative inline-flex shrink-0 items-center justify-center overflow-visible rounded-2lg\",\n    \"bg-background-primary-default text-foreground-icon-primary\",\n    \"border border-border-button-default shadow-xs\",\n    \"select-none cursor-pointer\",\n    \"transition-[background-color,border-color,box-shadow,color] duration-150 ease\",\n    \"outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-border-focus-ring\",\n    \"hover:bg-background-primary-hover hover:border-border-button-hover\",\n    \"active:bg-background-primary-active active:border-border-button-active\",\n    \"disabled:cursor-not-allowed disabled:bg-background-primary-disabled disabled:border-border-button-default disabled:text-icon-button-disabled-foreground disabled:opacity-60 disabled:shadow-none\",\n  ].join(\" \"),\n  size: {\n    medium: \"size-9\",\n    small: \"size-8\",\n  },\n  icon: {\n    medium: \"size-5 shrink-0\",\n    small: \"size-4 shrink-0\",\n  },\n});\n\nexport function IconButton({\n  icon: Icon,\n  size = \"medium\",\n  className,\n  type = \"button\",\n  ref,\n  ...props\n}: IconButtonProps) {\n  return (\n    <button\n      ref={ref}\n      type={type}\n      className={cx(styles.base, styles.size[size], className)}\n      {...props}\n    >\n      <Icon className={cx(styles.icon[size], directionalIconClass(Icon))} aria-hidden />\n    </button>\n  );\n}\n\n/** Anchor counterpart to IconButton for external and navigational actions. */\nexport function IconLinkButton({\n  icon: Icon,\n  size = \"medium\",\n  className,\n  ref,\n  ...props\n}: IconLinkButtonProps) {\n  return (\n    <a\n      ref={ref}\n      className={cx(styles.base, styles.size[size], className)}\n      {...props}\n    >\n      <Icon className={cx(styles.icon[size], directionalIconClass(Icon))} aria-hidden />\n    </a>\n  );\n}\n",
  "src/board-native/components/base/buttons/link-button.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\nimport type {\n  AnchorHTMLAttributes,\n  ButtonHTMLAttributes,\n  ComponentType,\n  ReactNode,\n  Ref,\n} from \"react\";\nimport { cx, sortCx } from \"../../../utils/cx.js\";\nimport { directionalIconClass } from \"../../../utils/directional-icon.js\";\n\n/**\n * Link button — an inline text action styled like a link, sized on the same\n * scale as `Button` but without the container: no fill, no border, just the\n * label (plus optional icons) with an underline on hover.\n *\n * Variant / size matrix (mirrors Button's structure):\n *   Variant = primary (blue/600 text) | secondary (text/secondary)\n *   Size    = medium (Body 1/Medium, 20px icons)\n *           | small  (Body 1/Medium, 18px icons)\n *           | xs     (Caption 1/Semibold, 14px icons)\n *\n * Renders an `<a>` when `href` is passed, otherwise a `<button>` — the same\n * action can live in copy (\"Learn more →\") or trigger a handler. Icons are\n * rendered by the component itself via `leadingIcon` / `trailingIcon` (pass\n * the Remix Icon reference, e.g. `RiArrowRightLine`, not an element).\n */\n\ntype LinkButtonVariant = \"primary\" | \"secondary\";\ntype LinkButtonSize = \"medium\" | \"small\" | \"xs\";\n\ntype IconComponent = ComponentType<{\n  className?: string;\n  \"aria-hidden\"?: boolean | \"true\" | \"false\";\n}>;\n\ninterface LinkButtonBaseProps {\n  variant?: LinkButtonVariant;\n  size?: LinkButtonSize;\n  leadingIcon?: IconComponent;\n  trailingIcon?: IconComponent;\n  children?: ReactNode;\n  className?: string;\n  disabled?: boolean;\n}\n\nexport interface LinkButtonAnchorProps\n  extends LinkButtonBaseProps,\n    Omit<AnchorHTMLAttributes<HTMLAnchorElement>, \"children\" | \"className\"> {\n  href: string;\n  ref?: Ref<HTMLAnchorElement>;\n}\n\nexport interface LinkButtonButtonProps\n  extends LinkButtonBaseProps,\n    Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"children\" | \"className\"> {\n  href?: undefined;\n  ref?: Ref<HTMLButtonElement>;\n}\n\nexport type LinkButtonProps = LinkButtonAnchorProps | LinkButtonButtonProps;\n\nconst styles = sortCx({\n  base: [\n    \"inline-flex items-center justify-center gap-1 whitespace-nowrap\",\n    \"font-sans select-none cursor-pointer rounded-sm\",\n    \"underline-offset-3 hover:underline\",\n    \"transition-colors duration-150 ease\",\n    \"outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-border-focus-ring\",\n    \"disabled:cursor-not-allowed disabled:no-underline aria-disabled:cursor-not-allowed aria-disabled:no-underline\",\n  ].join(\" \"),\n\n  size: {\n    medium: \"text-body-medium\",\n    small: \"text-body-medium\",\n    xs: \"text-caption-1-semibold\",\n  },\n\n  icon: {\n    medium: \"size-5 shrink-0\",\n    small: \"size-[18px] shrink-0\",\n    xs: \"size-3.5 shrink-0\",\n  },\n\n  variant: {\n    // Hover keeps the resting color — the underline is the hover cue; only\n    // the press darkens.\n    primary: [\n      \"text-[color:var(--hu-brand-text,var(--color-accent-700))] active:text-accent-800 dark:active:text-accent-200\",\n      \"disabled:text-text-tertiary aria-disabled:text-text-tertiary\",\n    ].join(\" \"),\n    secondary: [\n      \"text-text-secondary active:text-text-primary\",\n      \"disabled:text-text-tertiary aria-disabled:text-text-tertiary\",\n    ].join(\" \"),\n  },\n});\n\nexport function LinkButton({\n  variant = \"primary\",\n  size = \"medium\",\n  leadingIcon: Leading,\n  trailingIcon: Trailing,\n  children,\n  className,\n  disabled = false,\n  ...props\n}: LinkButtonProps) {\n  const classes = cx(styles.base, styles.size[size], styles.variant[variant], className);\n  const content = (\n    <>\n      {Leading ? <Leading className={cx(styles.icon[size], directionalIconClass(Leading))} aria-hidden /> : null}\n      {children !== undefined && children !== null && <span>{children}</span>}\n      {Trailing ? <Trailing className={cx(styles.icon[size], directionalIconClass(Trailing))} aria-hidden /> : null}\n    </>\n  );\n\n  if (props.href !== undefined) {\n    const { ref, href, ...anchorProps } = props as LinkButtonAnchorProps;\n    return (\n      <a\n        ref={ref}\n        href={disabled ? undefined : href}\n        aria-disabled={disabled || undefined}\n        className={classes}\n        {...anchorProps}\n      >\n        {content}\n      </a>\n    );\n  }\n\n  const { ref, type = \"button\", ...buttonProps } = props as LinkButtonButtonProps;\n  return (\n    <button ref={ref} type={type} disabled={disabled} className={classes} {...buttonProps}>\n      {content}\n    </button>\n  );\n}\n\n/** Style maps, exported for advanced composition and the dev Design Tuner. */\nexport const linkButtonStyles = styles;\n",
  "src/board-native/components/base/carousel/carousel.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport {\n  Children,\n  cloneElement,\n  isValidElement,\n  useCallback,\n  useEffect,\n  useRef,\n  useState,\n  type HTMLAttributes,\n  type ReactNode,\n  type Ref,\n} from \"react\";\nimport { RiArrowLeftSLine, RiArrowRightSLine } from \"@remixicon/react\";\nimport { IconButton } from \"../buttons/icon-button.js\";\nimport { useDirection } from \"../../foundations/direction/direction.js\";\nimport { inlineScrollOffset, scrollOffsetForItem } from \"../../../utils/scroll-direction.js\";\nimport { cx } from \"../../../utils/cx.js\";\n\n/**\n * Gallery carousel: a horizontal run of cards you slide through.\n *\n * Built on native scrolling with CSS scroll-snap rather than a transformed\n * track. That is the whole design decision, and it buys a lot: touch swipe,\n * trackpad gestures, momentum, and keyboard scrolling all work without a line\n * of JavaScript, and the browser handles sub-pixel positioning better than a\n * translate ever does. JS is only here to answer three questions the DOM will\n * not answer on its own — which card is showing, and whether either end has\n * been reached.\n *\n * Positions are read from each item's viewport bounds instead of being computed\n * from a card width, so items of different widths, responsive widths, or a\n * changed gap all keep working without the maths going stale.\n *\n * Follows the APG carousel pattern for naming: the region is a labelled group\n * that announces itself as a carousel, each item announces its position, and\n * the controls are real buttons that disable at the ends.\n */\n\nexport interface CarouselProps\n  extends Omit<HTMLAttributes<HTMLDivElement>, \"children\" | \"onScroll\"> {\n  children: ReactNode;\n  /** Names the carousel for assistive tech. */\n  \"aria-label\": string;\n  /** Prev/next buttons above the track. */\n  showArrows?: boolean;\n  /** Position indicator below the track. */\n  showDots?: boolean;\n  /** Where a card comes to rest when it snaps. */\n  align?: \"start\" | \"center\";\n  /** Gap between cards, in px. */\n  gap?: number;\n  ref?: Ref<HTMLDivElement>;\n}\n\nexport interface CarouselItemProps extends HTMLAttributes<HTMLDivElement> {\n  children: ReactNode;\n  ref?: Ref<HTMLDivElement>;\n}\n\n/**\n * One card, filling the track so exactly one is in view per slide. Width lives\n * here rather than on the track, so `className` can override it for a gallery\n * that shows a peek of the next card.\n */\nexport function CarouselItem({ children, className, ref, ...props }: CarouselItemProps) {\n  return (\n    <div\n      ref={ref}\n      role=\"group\"\n      aria-roledescription=\"slide\"\n      className={cx(\"w-full shrink-0 snap-start\", className)}\n      {...props}\n    >\n      {children}\n    </div>\n  );\n}\n\nexport function Carousel({\n  children,\n  showArrows = true,\n  showDots = true,\n  align = \"start\",\n  gap = 16,\n  className,\n  ref,\n  ...props\n}: CarouselProps) {\n  const trackRef = useRef<HTMLDivElement>(null);\n  const direction = useDirection();\n  const [active, setActive] = useState(0);\n  const [atStart, setAtStart] = useState(true);\n  const [atEnd, setAtEnd] = useState(false);\n\n  const count = Children.toArray(children).filter(isValidElement).length;\n\n  const items = useCallback(\n    () => Array.from(trackRef.current?.children ?? []) as HTMLElement[],\n    [],\n  );\n\n  const measure = useCallback(() => {\n    const track = trackRef.current;\n    if (!track) return;\n\n    // 1px of slack: scrollLeft is fractional on hi-DPI displays, so an exact\n    // comparison leaves the end arrow enabled on a fully scrolled track.\n    const offset = inlineScrollOffset(track.scrollLeft, direction);\n    const start = offset <= 1;\n    const end = offset >= track.scrollWidth - track.clientWidth - 1;\n    setAtStart(start);\n    setAtEnd(end);\n\n    const all = items();\n    if (all.length === 0) return;\n\n    // At the far end the last cards share the viewport, so the final card can\n    // never reach the start edge and \"nearest\" would settle on the one before\n    // it — leaving the last dot permanently unlit and making a click on it\n    // look broken. The ends are therefore pinned rather than measured.\n    if (end) {\n      setActive(all.length - 1);\n      return;\n    }\n    if (start) {\n      setActive(0);\n      return;\n    }\n\n    let nearest = 0;\n    let shortest = Number.POSITIVE_INFINITY;\n    all.forEach((item, index) => {\n      const distance = Math.abs(scrollOffsetForItem(track.getBoundingClientRect(), item.getBoundingClientRect(), 0, direction, align));\n      if (distance < shortest) {\n        shortest = distance;\n        nearest = index;\n      }\n    });\n    setActive(nearest);\n  }, [items, direction, align]);\n\n  useEffect(() => {\n    const track = trackRef.current;\n    if (!track) return;\n\n    // ResizeObserver fires once on observe, which is what takes the first\n    // measurement — no synchronous setState in the effect body.\n    const observer = new ResizeObserver(measure);\n    observer.observe(track);\n    track.addEventListener(\"scroll\", measure, { passive: true });\n    return () => {\n      observer.disconnect();\n      track.removeEventListener(\"scroll\", measure);\n    };\n  }, [measure]);\n\n  const scrollToIndex = (index: number) => {\n    const track = trackRef.current;\n    const target = items()[Math.max(0, Math.min(index, count - 1))];\n    if (!track || !target) return;\n    // `matchMedia` rather than a hook: this runs on click, so reading the\n    // preference at that moment is both current and cheap.\n    const reduce = window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n    const left = scrollOffsetForItem(track.getBoundingClientRect(), target.getBoundingClientRect(), track.scrollLeft, direction, align);\n    track.scrollTo({ left, behavior: reduce ? \"auto\" : \"smooth\" });\n  };\n\n  return (\n    <div\n      ref={ref}\n      role=\"group\"\n      dir={direction}\n      aria-roledescription=\"carousel\"\n      className={cx(\"flex w-full flex-col gap-4\", className)}\n      {...props}\n    >\n      {showArrows && count > 0 ? (\n        <div className=\"flex items-center justify-end gap-2\">\n          <IconButton\n            icon={RiArrowLeftSLine}\n            size=\"small\"\n            aria-label=\"Previous slide\"\n            disabled={atStart}\n            onClick={() => scrollToIndex(active - 1)}\n          />\n          <IconButton\n            icon={RiArrowRightSLine}\n            size=\"small\"\n            aria-label=\"Next slide\"\n            disabled={atEnd}\n            onClick={() => scrollToIndex(active + 1)}\n          />\n        </div>\n      ) : null}\n\n      {/* `tabIndex` makes the track focusable so it can be scrolled with the\n          arrow keys, which is the browser's own behaviour once it has focus.\n          The scrollbar is hidden inline rather than through a global class, so\n          the component stays self-contained. */}\n      <div\n        ref={trackRef}\n        tabIndex={0}\n        className={cx(\n          \"relative flex w-full overflow-x-auto overscroll-x-contain outline-none\",\n          \"snap-x snap-mandatory [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\",\n          \"focus-visible:ring-2 focus-visible:ring-border-focus-ring focus-visible:ring-offset-2\",\n          align === \"center\" && \"[&>*]:snap-center\",\n        )}\n        style={{ gap }}\n      >\n        {/* The position label is applied here so callers never have to\n            hand-number their own slides. */}\n        {Children.map(children, (child, index) =>\n          isValidElement<CarouselItemProps>(child)\n            ? cloneElement(child, { \"aria-label\": `${index + 1} of ${count}` })\n            : child,\n        )}\n      </div>\n\n      {showDots && count > 1 ? (\n        <div className=\"flex items-center justify-center gap-1.5\">\n          {Array.from({ length: count }, (_, index) => (\n            <button\n              key={index}\n              type=\"button\"\n              aria-label={`Go to slide ${index + 1}`}\n              aria-current={index === active}\n              onClick={() => scrollToIndex(index)}\n              className={cx(\n                \"h-1.5 cursor-pointer rounded-full transition-all duration-200 ease-out\",\n                index === active\n                  ? \"w-4 bg-text-primary\"\n                  : \"w-1.5 bg-background-tertiary-default hover:bg-border-button-active\",\n              )}\n            />\n          ))}\n        </div>\n      ) : null}\n    </div>\n  );\n}\n",
  "src/board-native/components/base/checkbox/checkbox-card.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport type { ReactNode, Ref } from \"react\";\nimport { Checkbox as AriaCheckbox } from \"react-aria-components\";\nimport type { CheckboxProps as AriaCheckboxProps } from \"react-aria-components\";\nimport { cx } from \"../../../utils/cx.js\";\nimport { CheckboxGlyph } from \"./checkbox-glyph.js\";\n\n/**\n * Figma source: Board UI → Checkbox items (node 3793:2966).\n *\n * Selectable card: title + description on the left, checkbox on the right.\n *   card    radius/2lg (10px), 1px border/button/default, pl 16 pr 20 py 12\n *   hover   bg background/primary/hover (#f7f7f7)\n *   title   Body 1/Medium, text/primary\n *   desc    Body 1/Regular, text/secondary\n *\n * The whole card toggles the checkbox (react-aria Checkbox renders the label),\n * so a click anywhere flips the state.\n */\n\nexport interface CheckboxCardProps extends Omit<AriaCheckboxProps, \"children\"> {\n  title: ReactNode;\n  description?: ReactNode;\n  ref?: Ref<HTMLLabelElement>;\n}\n\nexport function CheckboxCard({\n  className,\n  title,\n  description,\n  ref,\n  ...props\n}: CheckboxCardProps) {\n  return (\n    <AriaCheckbox\n      ref={ref}\n      {...props}\n      className={(state) =>\n        cx(\n          \"relative group flex w-full items-center justify-between gap-3 rounded-2lg border border-border-button-default py-3 pe-5 ps-4 select-none\",\n          \"transition-colors duration-150 ease\",\n          state.isHovered && !state.isDisabled\n            ? \"bg-background-primary-hover\"\n            : \"bg-background-primary-default\",\n          state.isDisabled ? \"cursor-not-allowed opacity-50\" : \"cursor-pointer\",\n          typeof className === \"function\" ? className(state) : className,\n        )\n      }\n    >\n      {(state) => (\n        <>\n          <span className=\"flex min-w-0 flex-col gap-0.5\">\n            <span className=\"truncate text-body-medium text-text-primary\">{title}</span>\n            {description !== undefined && description !== null && (\n              <span className=\"truncate text-body-regular text-text-secondary\">{description}</span>\n            )}\n          </span>\n          <span className=\"flex shrink-0 items-center py-1\">\n            <CheckboxGlyph state={state} />\n          </span>\n        </>\n      )}\n    </AriaCheckbox>\n  );\n}\n",
  "src/board-native/components/base/checkbox/checkbox-glyph.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\nimport { cx } from \"../../../utils/cx.js\";\n\nexport type CheckboxSize = \"sm\" | \"md\";\n\nexport const checkboxSizes: Record<\n  CheckboxSize,\n  { box: string; glyph: string; label: string; gap: string }\n> = {\n  md: { box: \"size-4\", glyph: \"size-4\", label: \"text-body-medium\", gap: \"gap-2\" },\n  sm: { box: \"size-3.5\", glyph: \"size-3.5\", label: \"text-body-2-medium\", gap: \"gap-1.5\" },\n};\n\nexport interface CheckboxGlyphState {\n  isSelected: boolean;\n  isIndeterminate: boolean;\n  isFocusVisible: boolean;\n  isDisabled: boolean;\n  isHovered: boolean;\n}\n\n/**\n * The 16px (or 14px) checkbox box + tick/indeterminate glyph. Shared by the\n * standalone Checkbox and the CheckboxCard so their visuals stay identical.\n */\nexport function CheckboxGlyph({\n  state,\n  size = \"md\",\n}: {\n  state: CheckboxGlyphState;\n  size?: CheckboxSize;\n}) {\n  const { isSelected, isIndeterminate, isFocusVisible, isDisabled, isHovered } = state;\n  const s = checkboxSizes[size];\n  const isMarked = isSelected || isIndeterminate;\n  const hover = isHovered && !isDisabled;\n\n  return (\n    <span\n      aria-hidden\n      className={cx(\n        \"flex shrink-0 items-center justify-center rounded-sm\",\n        \"transition-[background-color,border-color,box-shadow] duration-150 ease\",\n        s.box,\n        isMarked\n          ? cx(\n              \"bg-linear-to-b shadow-checkbox-selected\",\n              hover ? \"from-accent-400 to-accent-500\" : \"from-accent-500 to-accent-600\",\n            )\n          : cx(\n              \"border bg-background-primary-default shadow-xs\",\n              hover ? \"border-border-checkbox-hover\" : \"border-border-checkbox-default\",\n            ),\n        isDisabled && \"opacity-50\",\n        isFocusVisible && \"ring-2 ring-border-focus-ring ring-offset-2\",\n      )}\n    >\n      <svg viewBox=\"0 0 16 16\" fill=\"none\" className={s.glyph}>\n        {isIndeterminate ? (\n          <path d=\"M4.5 8H8H11.5\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n        ) : isSelected ? (\n          <path\n            d=\"M4 7.7002L6.64645 10.3466C6.84171 10.5419 7.15829 10.5419 7.35355 10.3466L12 5.7002\"\n            stroke=\"white\"\n            strokeWidth=\"2\"\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n            pathLength={1}\n            className=\"animate-check-draw\"\n          />\n        ) : null}\n      </svg>\n    </span>\n  );\n}\n",
  "src/board-native/components/base/checkbox/checkbox.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport type { ReactNode, Ref } from \"react\";\nimport { Checkbox as AriaCheckbox } from \"react-aria-components\";\nimport type { CheckboxProps as AriaCheckboxProps } from \"react-aria-components\";\nimport { cx } from \"../../../utils/cx.js\";\nimport { CheckboxGlyph, checkboxSizes } from \"./checkbox-glyph.js\";\nimport type { CheckboxSize } from \"./checkbox-glyph.js\";\n\n/**\n * Figma source: Board UI → Checkbox (node 3699:2557 family; used in\n * dashboard 1 table, nodes 3731:3258 etc.).\n *\n * radius/sm (4px). Two sizes:\n *   md  16×16, label Body 1/Medium (14)\n *   sm  14×14, label Body 2/Medium (13)\n *\n * States (per Figma):\n *   default        bg background/primary/default, 1px border/checkbox/default,\n *                  shadow/xs\n *   hover          border darkens to neutral/400\n *   checked /      Button/Primary gradient (blue/500 → blue/600) with the\n *   indeterminate  checkbox inner highlight (see --shadow-checkbox-selected),\n *                  white 2px rounded stroke glyph; on hover the gradient\n *                  lightens to blue/400 → blue/500\n *\n * Built on react-aria Checkbox: keyboard toggling, aria-checked=\"mixed\" for\n * indeterminate, label association when `children` is passed.\n */\n\nexport interface CheckboxProps extends Omit<AriaCheckboxProps, \"children\"> {\n  children?: ReactNode;\n  size?: CheckboxSize;\n  ref?: Ref<HTMLLabelElement>;\n}\n\nexport function Checkbox({ className, children, size = \"md\", ref, ...props }: CheckboxProps) {\n  const s = checkboxSizes[size];\n\n  return (\n    <AriaCheckbox\n      ref={ref}\n      {...props}\n      className={(state) =>\n        cx(\n          \"relative group inline-flex items-center select-none\",\n          s.gap,\n          state.isDisabled ? \"cursor-not-allowed\" : \"cursor-pointer\",\n          typeof className === \"function\" ? className(state) : className,\n        )\n      }\n    >\n      {(state) => (\n        <>\n          <CheckboxGlyph state={state} size={size} />\n          {children !== undefined && children !== null && (\n            <span className={cx(s.label, \"text-text-primary\")}>{children}</span>\n          )}\n        </>\n      )}\n    </AriaCheckbox>\n  );\n}\n",
  "src/board-native/components/base/date-picker/date-picker.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { useTemplateCopy } from \"../../foundations/template-copy/template-copy.js\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport type { RefObject } from \"react\";\nimport { Calendar, Dialog, Popover, useLocale } from \"react-aria-components\";\nimport type { CalendarDate } from \"@internationalized/date\";\nimport { RiCalendarLine } from \"@remixicon/react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { Button } from \"../buttons/button.js\";\nimport {\n  DateChipInput,\n  MonthPanel,\n  formatTriggerDate,\n  popoverClassName,\n  triggerButtonClassName,\n} from \"./shared.js\";\nimport { cx } from \"../../../utils/cx.js\";\nimport { useDismissOnOutsidePress } from \"../../../utils/use-dismiss-on-outside-press.js\";\n\n/**\n * Figma source: Board UI → \"Calendar_single\" (node 3879:6708).\n *\n * A single-date picker: trigger button opens a popover with one month\n * (react-aria's plain `Calendar`, so both nav chevrons are fully functional —\n * unlike `DateRangePicker`'s dual view, there's only one month to navigate)\n * and a footer with an editable \"DD/MM/YYYY\" chip plus Cancel/Apply. No\n * quick-select sidebar in this Figma frame.\n *\n * Reuses the exact chevrons, day-cell rendering, month-panel chrome, editable\n * date chip, and trigger/popover surfaces built for `DateRangePicker` — see\n * `./shared`. A plain `Calendar`'s `CalendarCellRenderProps` always reports\n * `isSelectionStart === isSelectionEnd === isSelected` for the one chosen\n * day, so the shared `DayCell` renders it as a single fully-rounded pill\n * with no connecting range background, matching Figma without any\n * single-vs-range branching in the cell itself.\n *\n * Standalone `Popover` + `triggerRef` (like `MeetingScheduler`), not\n * `DialogTrigger`, so an external trigger can be swapped in: pass\n * `triggerRef`/`isOpen`/`onOpenChange` to anchor the popover to your own\n * element (e.g. the calendar template's month-switcher label) instead of\n * DatePicker's own button, which is hidden in that case.\n */\n\nexport interface DatePickerProps {\n  value?: CalendarDate | null;\n  defaultValue?: CalendarDate | null;\n  onChange?: (value: CalendarDate | null) => void;\n  isDisabled?: boolean;\n  className?: string;\n  \"aria-label\"?: string;\n  /** Anchor the popover to an external element instead of DatePicker's own\n   *  trigger button (which is hidden when this is provided). Pair with\n   *  `isOpen`/`onOpenChange` for full external control. */\n  triggerRef?: RefObject<HTMLElement | null>;\n  isOpen?: boolean;\n  onOpenChange?: (isOpen: boolean) => void;\n}\n\nexport function DatePicker({\n  value,\n  defaultValue = null,\n  onChange,\n  isDisabled,\n  className,\n  \"aria-label\": ariaLabel = \"Date\",\n  triggerRef: externalTriggerRef,\n  isOpen: controlledIsOpen,\n  onOpenChange: controlledOnOpenChange,\n}: DatePickerProps) {\n  const localize = useTemplateCopy();\n  const { locale } = useLocale();\n  const ownTriggerRef = useRef<HTMLButtonElement>(null);\n  const triggerRef = externalTriggerRef ?? ownTriggerRef;\n  const isExternal = externalTriggerRef !== undefined;\n  const popoverRef = useRef<HTMLElement>(null);\n\n  const [internalOpen, setInternalOpen] = useState(false);\n  const isOpen = isExternal ? (controlledIsOpen ?? false) : internalOpen;\n  const setIsOpen = isExternal ? (controlledOnOpenChange ?? (() => {})) : setInternalOpen;\n\n  const isControlled = value !== undefined;\n  const [internalValue, setInternalValue] = useState<CalendarDate | null>(defaultValue);\n  const committedValue = isControlled ? (value ?? null) : internalValue;\n\n  const [pendingValue, setPendingValue] = useState<CalendarDate | null>(committedValue);\n  // React Aria's `Calendar` keeps its own internal `visibleRange` state for\n  // as long as it stays mounted (Popover keeps its content mounted between\n  // opens for the exit animation), so it never re-derives the visible month\n  // from a later `value` change on its own. Bumping this on every open and\n  // keying `Calendar` on it forces a fresh mount showing the right month —\n  // needed for the external-trigger case, where `value` can jump (e.g. the\n  // calendar template's month switcher) between one open and the next.\n  const [openKey, setOpenKey] = useState(0);\n\n  // Re-sync the calendar's displayed month/selection to the current\n  // committed value every time the popover opens — not just when DatePicker's\n  // own trigger toggles it, but also when `isOpen` is flipped true by an\n  // external trigger (`triggerRef`), which never runs `openChange` below.\n  useEffect(() => {\n    if (isOpen) {\n      setPendingValue(committedValue);\n      setOpenKey((k) => k + 1);\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps -- resync on the open transition only, not every committedValue change\n  }, [isOpen]);\n\n  const commit = (next: CalendarDate | null) => {\n    if (!isControlled) setInternalValue(next);\n    onChange?.(next);\n    setIsOpen(false);\n  };\n\n  const openChange = (open: boolean) => {\n    setIsOpen(open);\n  };\n\n  useDismissOnOutsidePress(isOpen, () => setIsOpen(false), [triggerRef, popoverRef]);\n\n  return localize((\n    <>\n      {!isExternal && (\n        <button\n          ref={ownTriggerRef}\n          type=\"button\"\n          disabled={isDisabled}\n          onClick={() => openChange(!isOpen)}\n          className={cx(triggerButtonClassName, className)}\n        >\n          <RiCalendarLine className=\"size-5 shrink-0 text-foreground-icon-primary\" aria-hidden />\n          <span className=\"flex items-center justify-center whitespace-nowrap px-1 text-body-medium text-text-primary\">\n            {committedValue ? formatTriggerDate(committedValue, locale) : \"Select date\"}\n          </span>\n        </button>\n      )}\n      <Popover\n        ref={popoverRef}\n        triggerRef={triggerRef}\n        isOpen={isOpen}\n        onOpenChange={openChange}\n        offset={4}\n        placement=\"bottom end\"\n        isNonModal\n        className={popoverClassName}\n      >\n        <Dialog aria-label={ariaLabel} className=\"outline-none\">\n          <Calendar key={openKey} aria-label={ariaLabel} value={pendingValue} onChange={setPendingValue}>\n            <div className=\"flex flex-col pt-2 pe-2 pb-3 ps-2\">\n              <MonthPanel offset={0} showPrev showNext />\n              <div className=\"flex items-center justify-between pt-3 pe-4 ps-4\">\n                <div>\n                  <AnimatePresence>\n                    {pendingValue && (\n                      <motion.div\n                        key=\"date-summary\"\n                        initial={{ opacity: 0, y: -12 }}\n                        animate={{ opacity: 1, y: 0 }}\n                        exit={{ opacity: 0, y: -12 }}\n                        transition={{ duration: 0.25, ease: [0.34, 1.2, 0.64, 1] }}\n                      >\n                        <DateChipInput date={pendingValue} label=\"Date\" onCommit={setPendingValue} />\n                      </motion.div>\n                    )}\n                  </AnimatePresence>\n                </div>\n                <div className=\"flex items-center gap-2.5\">\n                  <Button\n                    variant=\"secondary\"\n                    onClick={() => {\n                      setPendingValue(committedValue);\n                      setIsOpen(false);\n                    }}\n                  >\n                    Cancel\n                  </Button>\n                  <Button onClick={() => commit(pendingValue)} disabled={!pendingValue}>\n                    Apply\n                  </Button>\n                </div>\n              </div>\n            </div>\n          </Calendar>\n        </Dialog>\n      </Popover>\n    </>\n  ));\n}\n",
  "src/board-native/components/base/date-picker/date-range-picker.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { useMemo, useRef, useState } from \"react\";\nimport {\n  Button as AriaButton,\n  Dialog,\n  DialogTrigger,\n  Popover,\n  RangeCalendar,\n  useLocale,\n} from \"react-aria-components\";\nimport {\n  CalendarDate,\n  endOfMonth,\n  endOfYear,\n  getLocalTimeZone,\n  isSameDay,\n  startOfMonth,\n  startOfYear,\n  today,\n} from \"@internationalized/date\";\nimport { RiCalendarLine } from \"@remixicon/react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { Button } from \"../buttons/button.js\";\nimport { useTemplateCopy } from \"../../foundations/template-copy/template-copy.js\";\nimport {\n  DateChipInput,\n  MonthPanel,\n  formatTriggerDate,\n  popoverClassName,\n  triggerButtonClassName,\n} from \"./shared.js\";\nimport { cx } from \"../../../utils/cx.js\";\nimport { useDismissOnOutsidePress, useTriggerToggle } from \"../../../utils/use-dismiss-on-outside-press.js\";\n\n/**\n * Figma source: Board UI → \"Calendar\" (node 3871:5738).\n *\n * A dual-month date range picker: trigger button opens a popover with a\n * quick-select sidebar, two adjacent months (react-aria's\n * `visibleDuration={{ months: 2 }}`), and a footer with read-only date chips,\n * a \"N days selected\" pill, and Cancel/Apply.\n *\n * Two deliberate departures from the raw Figma frame:\n *  - The prev/next chevrons in Figma appear on *both* sides of *both* month\n *    headers (4 total), pre-rotated generic vector exports. A dual-month\n *    calendar only has one navigation state (the two months always stay\n *    adjacent), so only the outer two chevrons (prev on month 1, next on\n *    month 2) are wired up; the inner two slots are kept as invisible\n *    spacers rather than dead click targets, preserving Figma's header\n *    spacing without fake buttons.\n *  - The connecting range background (Figma: one hardcoded `bg-blue-100`\n *    rectangle sized for the one example range shown) is generalized into a\n *    per-cell layered background driven by react-aria's `isSelectionStart` /\n *    `isSelectionEnd` state, so any range length/position renders correctly.\n *\n * Colors/radii/spacing (semantic range-selection blues, blue-500/600,\n * radius/2lg/xl/2xl/3xl,\n * shadow-xs, background/secondary/default, background/tertiary/default,\n * border/button/default) are Tailwind v4 defaults or existing semantic\n * tokens — see styles/theme.css.\n *\n * Shared chrome (chevrons, day cell, month panel, editable date chip, trigger\n * + popover surfaces) lives in `./shared` — `DatePicker` (single-month,\n * non-range) reuses the same pieces.\n */\n\nexport interface DateRangeValue {\n  start: CalendarDate;\n  end: CalendarDate;\n}\n\nexport interface DateRangePickerProps {\n  value?: DateRangeValue | null;\n  defaultValue?: DateRangeValue | null;\n  onChange?: (value: DateRangeValue | null) => void;\n  isDisabled?: boolean;\n  className?: string;\n  /** Extra classes for the portalled calendar, such as a locale-specific font. */\n  popoverClassName?: string;\n  \"aria-label\"?: string;\n  /** Trigger text shown when no range is committed yet. Default \"Select date range\". */\n  placeholder?: string;\n}\n\nfunction daysInRange(value: DateRangeValue) {\n  const tz = getLocalTimeZone();\n  const ms = value.end.toDate(tz).getTime() - value.start.toDate(tz).getTime();\n  return Math.round(ms / 86_400_000) + 1;\n}\n\nfunction useQuickSelectPresets() {\n  return useMemo(() => {\n    const now = today(getLocalTimeZone());\n    const lastMonth = now.subtract({ months: 1 });\n    const lastYear = now.subtract({ years: 1 });\n    return [\n      { label: \"Today\", range: { start: now, end: now } },\n      { label: \"Yesterday\", range: { start: now.subtract({ days: 1 }), end: now.subtract({ days: 1 }) } },\n      { label: \"Last week\", range: { start: now.subtract({ days: 7 }), end: now.subtract({ days: 1 }) } },\n      { label: \"This month\", range: { start: startOfMonth(now), end: endOfMonth(now) } },\n      { label: \"Last month\", range: { start: startOfMonth(lastMonth), end: endOfMonth(lastMonth) } },\n      { label: \"This year\", range: { start: startOfYear(now), end: endOfYear(now) } },\n      { label: \"Last year\", range: { start: startOfYear(lastYear), end: endOfYear(lastYear) } },\n      { label: \"All time\", range: { start: now.subtract({ years: 10 }), end: now } },\n    ];\n  }, []);\n}\n\nfunction isPresetActive(value: DateRangeValue | null, range: DateRangeValue) {\n  return !!value && isSameDay(value.start, range.start) && isSameDay(value.end, range.end);\n}\n\nfunction QuickSelect({\n  value,\n  onSelect,\n}: {\n  value: DateRangeValue | null;\n  onSelect: (range: DateRangeValue) => void;\n}) {\n  const localize = useTemplateCopy();\n  const presets = useQuickSelectPresets();\n\n  return localize((\n    <div className=\"flex w-[118px] shrink-0 flex-col gap-1.5\">\n      {presets.map((preset) => (\n        <button\n          key={preset.label}\n          type=\"button\"\n          onClick={() => onSelect(preset.range)}\n          className={cx(\n            \"w-full cursor-pointer rounded-2lg px-2 py-1.5 text-start text-body-medium text-text-primary transition-colors duration-150 ease\",\n            isPresetActive(value, preset.range)\n              ? \"bg-background-tertiary-default\"\n              : \"hover:bg-background-secondary-hover\",\n          )}\n        >\n          {preset.label}\n        </button>\n      ))}\n    </div>\n  ));\n}\n\nfunction Footer({\n  value,\n  onChange,\n  onCancel,\n  onApply,\n}: {\n  value: DateRangeValue | null;\n  onChange: (value: DateRangeValue) => void;\n  onCancel: () => void;\n  onApply: () => void;\n}) {\n  const localize = useTemplateCopy();\n  return localize((\n    <div className=\"flex items-center justify-between pt-3 pe-4\">\n      <div className=\"flex items-center gap-2.5\">\n        <AnimatePresence>\n          {value && (\n            <motion.div\n              key=\"range-summary\"\n              initial={{ opacity: 0, y: -12 }}\n              animate={{ opacity: 1, y: 0 }}\n              exit={{ opacity: 0, y: -12 }}\n              transition={{ duration: 0.25, ease: [0.34, 1.2, 0.64, 1] }}\n              className=\"flex items-center gap-2.5\"\n            >\n              <div className=\"flex items-center gap-[5px]\">\n                <DateChipInput\n                  date={value.start}\n                  label=\"Start date\"\n                  onCommit={(start) =>\n                    onChange({ start, end: start.compare(value.end) > 0 ? start : value.end })\n                  }\n                />\n                <span className=\"text-body-medium text-text-secondary\">-</span>\n                <DateChipInput\n                  date={value.end}\n                  label=\"End date\"\n                  onCommit={(end) =>\n                    onChange({ start: end.compare(value.start) < 0 ? end : value.start, end })\n                  }\n                />\n              </div>\n              <span className=\"rounded-xl bg-background-tertiary-default px-2 py-2 text-body-medium text-text-secondary\">\n                {`${daysInRange(value)} day${daysInRange(value) === 1 ? \"\" : \"s\"} selected`}\n              </span>\n            </motion.div>\n          )}\n        </AnimatePresence>\n      </div>\n      <div className=\"flex items-center gap-2.5\">\n        <Button variant=\"secondary\" onClick={onCancel}>\n          Cancel\n        </Button>\n        <Button onClick={onApply} disabled={!value}>\n          Apply\n        </Button>\n      </div>\n    </div>\n  ));\n}\n\nexport function DateRangePicker({\n  value,\n  defaultValue = null,\n  onChange,\n  isDisabled,\n  className,\n  popoverClassName: calendarClassName,\n  \"aria-label\": ariaLabel = \"Date range\",\n  placeholder = \"Select date range\",\n}: DateRangePickerProps) {\n  const localize = useTemplateCopy();\n  const { locale } = useLocale();\n  const isControlled = value !== undefined;\n  const [internalValue, setInternalValue] = useState<DateRangeValue | null>(defaultValue);\n  const committedValue = isControlled ? (value ?? null) : internalValue;\n\n  const [pendingValue, setPendingValue] = useState<DateRangeValue | null>(committedValue);\n\n  const commit = (next: DateRangeValue | null) => {\n    if (!isControlled) setInternalValue(next);\n    onChange?.(next);\n  };\n\n  const [isOpen, setIsOpen] = useState(false);\n  const triggerRef = useRef<HTMLButtonElement>(null);\n  const popoverRef = useRef<HTMLElement>(null);\n  useDismissOnOutsidePress(isOpen, () => setIsOpen(false), [triggerRef, popoverRef]);\n  // Pressing the trigger while open closes the popover instead of reopening\n  const allowOpenChange = useTriggerToggle(isOpen, triggerRef);\n\n  return localize((\n    <DialogTrigger\n      isOpen={isOpen}\n      onOpenChange={(open) => {\n        if (!allowOpenChange(open)) return;\n        if (open) setPendingValue(committedValue);\n        setIsOpen(open);\n      }}\n    >\n      <AriaButton ref={triggerRef} isDisabled={isDisabled} className={cx(triggerButtonClassName, className)}>\n        <RiCalendarLine className=\"size-5 shrink-0 text-foreground-icon-primary\" aria-hidden />\n        <span className=\"flex items-center justify-center whitespace-nowrap px-1 text-body-medium text-text-primary\">\n          {committedValue ? `${formatTriggerDate(committedValue.start, locale)} - ${formatTriggerDate(committedValue.end, locale)}` : placeholder}\n        </span>\n      </AriaButton>\n      <Popover ref={popoverRef} offset={4} placement=\"bottom end\" isNonModal className={cx(popoverClassName, calendarClassName)}>\n        <Dialog aria-label={ariaLabel} className=\"outline-none\">\n          {({ close }) => (\n            <RangeCalendar\n              aria-label={ariaLabel}\n              visibleDuration={{ months: 2 }}\n              value={pendingValue}\n              onChange={setPendingValue}\n            >\n              <div className=\"flex gap-3\">\n                <div className=\"pt-4 ps-4\">\n                  <QuickSelect\n                    value={pendingValue}\n                    onSelect={(range) => setPendingValue(range)}\n                  />\n                </div>\n                <div className=\"flex flex-col pt-2 pe-2 pb-3\">\n                  <div className=\"flex gap-2\">\n                    <MonthPanel offset={0} showPrev />\n                    <MonthPanel offset={1} showNext />\n                  </div>\n                  <Footer\n                    value={pendingValue}\n                    onChange={setPendingValue}\n                    onCancel={() => {\n                      setPendingValue(committedValue);\n                      close();\n                    }}\n                    onApply={() => {\n                      commit(pendingValue);\n                      close();\n                    }}\n                  />\n                </div>\n              </div>\n            </RangeCalendar>\n          )}\n        </Dialog>\n      </Popover>\n    </DialogTrigger>\n  ));\n}\n",
  "src/board-native/components/base/date-picker/meeting-scheduler.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport{NativeImage as Image}from\"../../../NativeImage.js\";\nimport { Calendar, Dialog, Popover } from \"react-aria-components\";\nimport { CalendarDate, getLocalTimeZone, today } from \"@internationalized/date\";\nimport { RiCalendarLine, RiFlagLine, RiGlobalLine } from \"@remixicon/react\";\nimport { Avatar } from \"../avatar/avatar.js\";\nimport { Button } from \"../buttons/button.js\";\nimport { ChevronDownSmall } from \"../../foundations/icons/chevrons.js\";\nimport { MonthPanel, popoverClassName, triggerButtonClassName } from \"./shared.js\";\nimport { cx } from \"../../../utils/cx.js\";\nimport { useDismissOnOutsidePress } from \"../../../utils/use-dismiss-on-outside-press.js\";\n\n/**\n * Figma source: Board UI → \"Meeting\" (node 3881:7618).\n *\n * A Calendly/Cal.com-style booking panel: host card + meeting summary on the\n * left, a single-month calendar in the middle (reusing `MonthPanel` from\n * `./shared`), and a timezone / hour-format / time-slot sidebar on the\n * right. Like the other two pickers, the panel is a real react-aria\n * `Popover` — but since there's no `DialogTrigger` here (the trigger is a\n * plain button, not a `Dialog`), it's wired up via `triggerRef` + controlled\n * `isOpen` instead. That keeps the panel a portaled overlay that never\n * affects layout, so the trigger (Figma's own top-right chip, repurposed\n * from a static readout into the open/close control) can sit compactly\n * next to other trigger buttons instead of dragging a whole row wide.\n *\n * Two deliberate departures from the raw Figma frame:\n *  - The time-slot list (Figma: a static \"14:00\"...\"18:30\" mock that then\n *    repeats \"14:00\" a 14th time — clearly a copy/paste artifact, not real\n *    data) is generated as a real fixed 09:00–18:30 half-hour range instead.\n *  - The timezone row and the duration/language/conferencing rows are\n *    Figma \"Dropdown\" layers, but only the timezone row actually has a\n *    chevron — the other three are read-only summary rows here, matching\n *    what's visually present rather than the layer name.\n */\n\nexport interface MeetingSchedulerHost {\n  name: string;\n  email: string;\n  avatarInitial: string;\n}\n\nexport interface MeetingSchedulerDetails {\n  title: string;\n  description?: string;\n  durationMinutes: number;\n  language?: string;\n  conferencing?: string;\n}\n\nexport interface MeetingSchedulerValue {\n  date: CalendarDate;\n  /** 24h \"HH:mm\", or `null` when a date is picked but no time slot yet. */\n  time: string | null;\n}\n\nexport interface MeetingSchedulerProps {\n  host?: MeetingSchedulerHost;\n  meeting?: MeetingSchedulerDetails;\n  timezone?: string;\n  value?: MeetingSchedulerValue | null;\n  defaultValue?: MeetingSchedulerValue | null;\n  onChange?: (value: MeetingSchedulerValue | null) => void;\n  /** Render the panel open on mount. Default `false`. */\n  defaultOpen?: boolean;\n  className?: string;\n  \"aria-label\"?: string;\n  /** Trigger button text. Default \"Schedule a meeting\". */\n  triggerLabel?: string;\n}\n\nconst DEFAULT_HOST: MeetingSchedulerHost = {\n  name: \"Mertcan Esmergul\",\n  email: \"hi@mertcan.works\",\n  avatarInitial: \"M\",\n};\n\nconst DEFAULT_MEETING: MeetingSchedulerDetails = {\n  title: \"30 min intro meeting\",\n  description: \"Let's discuss your design needs and how we can collaborate 🥳\",\n  durationMinutes: 30,\n  language: \"English\",\n  conferencing: \"Google meet\",\n};\n\nfunction useTimeSlots() {\n  return useMemo(() => {\n    const slots: string[] = [];\n    for (let minutes = 9 * 60; minutes <= 18 * 60 + 30; minutes += 30) {\n      const h = Math.floor(minutes / 60);\n      const m = minutes % 60;\n      slots.push(`${String(h).padStart(2, \"0\")}:${String(m).padStart(2, \"0\")}`);\n    }\n    return slots;\n  }, []);\n}\n\nfunction formatTime(time: string, use24h: boolean) {\n  const [h, m] = time.split(\":\").map(Number);\n  if (use24h) return time;\n  const period = h >= 12 ? \"PM\" : \"AM\";\n  const hour12 = h % 12 === 0 ? 12 : h % 12;\n  return `${hour12}:${String(m).padStart(2, \"0\")} ${period}`;\n}\n\nfunction formatChipDateTime(value: MeetingSchedulerValue) {\n  const date = new Intl.DateTimeFormat(undefined, { month: \"short\", day: \"numeric\", year: \"numeric\" }).format(\n    value.date.toDate(getLocalTimeZone()),\n  );\n  return { date, time: value.time ?? \"Select a time\" };\n}\n\nfunction InfoRow({ icon, children }: { icon: ReactNode; children: ReactNode }) {\n  return (\n    <div className=\"flex items-center gap-[5px] text-body-medium text-text-primary\">\n      {icon}\n      {children}\n    </div>\n  );\n}\n\nfunction GlyphIcon({ icon: Icon }: { icon: typeof RiGlobalLine }) {\n  return <Icon className=\"size-5 shrink-0 text-foreground-icon-primary\" aria-hidden />;\n}\n\n/** Figma's exact Google Meet mark, 20×20 (`public/brand/google_meet.png`). */\nfunction GoogleMeetIcon() {\n  return <Image src=\"/react/assets/board-native/brand/google_meet.png\" alt=\"\" width={20} height={20} className=\"size-5 shrink-0\" />;\n}\n\nfunction HourFormatToggle({ use24h, onChange }: { use24h: boolean; onChange: (use24h: boolean) => void }) {\n  return (\n    <div className=\"flex shrink-0 items-start gap-0.5 rounded-2lg\">\n      {([\"12h\", \"24h\"] as const).map((label, i) => {\n        const selected = i === 1 ? use24h : !use24h;\n        return (\n          <button\n            key={label}\n            type=\"button\"\n            onClick={() => onChange(i === 1)}\n            className={cx(\n              \"cursor-pointer rounded-md px-2.5 py-1 text-body-medium transition-colors duration-150 ease\",\n              selected ? \"bg-background-primary-default text-text-primary shadow-2xs\" : \"text-text-secondary hover:text-text-primary\",\n            )}\n          >\n            {label}\n          </button>\n        );\n      })}\n    </div>\n  );\n}\n\nexport function MeetingScheduler({\n  host = DEFAULT_HOST,\n  meeting = DEFAULT_MEETING,\n  timezone = \"Amsterdam\",\n  value,\n  defaultValue = null,\n  onChange,\n  defaultOpen = false,\n  className,\n  \"aria-label\": ariaLabel = \"Schedule meeting\",\n  triggerLabel = \"Schedule a meeting\",\n}: MeetingSchedulerProps) {\n  const triggerRef = useRef<HTMLButtonElement>(null);\n  const popoverRef = useRef<HTMLElement>(null);\n  const timeSlots = useTimeSlots();\n  const isControlled = value !== undefined;\n  const [internalValue, setInternalValue] = useState<MeetingSchedulerValue | null>(\n    defaultValue ?? { date: today(getLocalTimeZone()), time: null },\n  );\n  const committedValue = isControlled ? value : internalValue;\n\n  const [pendingValue, setPendingValue] = useState<MeetingSchedulerValue | null>(committedValue);\n  const [use24h, setUse24h] = useState(true);\n  // Never honor `defaultOpen` on the initial render: the ~700px-wide panel\n  // being in the very first paint makes mobile Safari compute its layout\n  // viewport from that width, permanently zooming the whole page out even\n  // after the panel closes. Open it post-mount instead, and only on\n  // viewports wide enough to show the panel without overflowing.\n  const [isOpen, setIsOpen] = useState(false);\n  useEffect(() => {\n    if (!defaultOpen) return;\n    if (window.matchMedia(\"(min-width: 640px)\").matches) {\n      setIsOpen(true);\n    }\n  }, [defaultOpen]);\n\n  const commit = (next: MeetingSchedulerValue | null) => {\n    if (!isControlled) setInternalValue(next);\n    onChange?.(next);\n    setIsOpen(false);\n  };\n\n  useDismissOnOutsidePress(isOpen, () => setIsOpen(false), [triggerRef, popoverRef]);\n\n  const chip = pendingValue ? formatChipDateTime(pendingValue) : null;\n  const dayChip = pendingValue\n    ? {\n        weekday: new Intl.DateTimeFormat(undefined, { weekday: \"short\" }).format(pendingValue.date.toDate(getLocalTimeZone())).slice(0, 2),\n        day: pendingValue.date.day,\n      }\n    : null;\n\n  return (\n    <>\n      <button\n        ref={triggerRef}\n        type=\"button\"\n        onClick={() => {\n          if (!isOpen) setPendingValue(committedValue);\n          setIsOpen((open) => !open);\n        }}\n        className={cx(triggerButtonClassName, className)}\n      >\n        <RiCalendarLine className=\"size-5 shrink-0 text-foreground-icon-primary\" aria-hidden />\n        <span className=\"flex items-center justify-center whitespace-nowrap px-1 text-body-medium text-text-primary\">\n          {triggerLabel}\n        </span>\n        <ChevronDownSmall\n          className={cx(\"size-4 shrink-0 text-text-secondary transition-transform duration-200 ease\", isOpen && \"rotate-180\")}\n        />\n      </button>\n      <Popover\n        ref={popoverRef}\n        triggerRef={triggerRef}\n        isOpen={isOpen}\n        onOpenChange={setIsOpen}\n        placement=\"bottom end\"\n        offset={8}\n        isNonModal\n        className={popoverClassName}\n      >\n        <Dialog aria-label={ariaLabel} className=\"outline-none\">\n          <Calendar\n            aria-label={ariaLabel}\n            value={pendingValue?.date ?? null}\n            onChange={(date) => setPendingValue((prev) => ({ date, time: prev?.time ?? null }))}\n          >\n            <div className=\"flex h-[429px] gap-4\">\n              {/* Host + meeting summary */}\n              <div className=\"flex w-[207px] shrink-0 flex-col gap-4 py-4 ps-4\">\n                <div className=\"flex flex-col items-start gap-2\">\n                  <Avatar size=\"md\" color=\"blue\" initials={host.avatarInitial} />\n                  <div className=\"flex flex-col text-body-medium\">\n                    <span className=\"text-text-primary\">{host.name}</span>\n                    <span className=\"text-text-secondary\">{host.email}</span>\n                  </div>\n                </div>\n                <div className=\"flex flex-col gap-1\">\n                  <p className=\"text-title-3-medium text-text-primary\">{meeting.title}</p>\n                  {meeting.description && (\n                    <p className=\"text-body-2-medium text-text-secondary\">{meeting.description}</p>\n                  )}\n                </div>\n                <div className=\"mt-auto flex flex-col gap-3\">\n                  <InfoRow icon={<GlyphIcon icon={RiGlobalLine} />}>{meeting.durationMinutes} minutes</InfoRow>\n                  {meeting.language && <InfoRow icon={<GlyphIcon icon={RiFlagLine} />}>{meeting.language}</InfoRow>}\n                  {meeting.conferencing && <InfoRow icon={<GoogleMeetIcon />}>{meeting.conferencing}</InfoRow>}\n                </div>\n              </div>\n\n              {/* Calendar + footer */}\n              <div className=\"flex flex-col gap-3 pt-2 pb-3\">\n                <MonthPanel offset={0} showPrev showNext />\n                <div className=\"flex items-center justify-between\">\n                  <span className=\"flex items-center gap-1.5 rounded-2lg border border-border-button-default bg-background-primary-default px-2 py-2 text-body-medium text-text-primary shadow-xs\">\n                    {chip && (\n                      <>\n                        <span>{chip.date}</span>\n                        <span className=\"text-text-secondary\">{chip.time}</span>\n                      </>\n                    )}\n                  </span>\n                  <Button onClick={() => commit(pendingValue)} disabled={!pendingValue?.time}>\n                    Send meeting\n                  </Button>\n                </div>\n              </div>\n\n              {/* Timezone + hour format + time slots */}\n              <div className=\"flex h-full w-[170px] shrink-0 flex-col gap-3 overflow-hidden pt-4 pe-4\">\n                <button\n                  type=\"button\"\n                  className=\"flex cursor-pointer items-center justify-between rounded-2lg outline-none\"\n                >\n                  <span className=\"flex items-center gap-[5px] text-body-medium text-text-primary\">\n                    <RiGlobalLine className=\"size-5 shrink-0 text-foreground-icon-primary\" aria-hidden />\n                    {timezone}\n                  </span>\n                  <ChevronDownSmall className=\"size-4 shrink-0 text-text-secondary\" />\n                </button>\n\n                <div className=\"flex items-center justify-between\">\n                  {dayChip && (\n                    <span className=\"inline-flex items-center gap-[3px] rounded-2lg bg-background-tertiary-default px-2 py-1 text-body-medium\">\n                      <span className=\"text-text-primary\">{dayChip.weekday}</span>\n                      <span className=\"text-text-secondary\">{dayChip.day}</span>\n                    </span>\n                  )}\n                  <HourFormatToggle use24h={use24h} onChange={setUse24h} />\n                </div>\n\n                <div\n                  className=\"flex min-h-0 flex-1 flex-col gap-2 overflow-y-auto pb-3\"\n                  style={{\n                    maskImage: \"linear-gradient(to bottom, transparent, black 16px, black 100%)\",\n                    WebkitMaskImage: \"linear-gradient(to bottom, transparent, black 16px, black 100%)\",\n                  }}\n                >\n                  {timeSlots.map((slot) => (\n                    <button\n                      key={slot}\n                      type=\"button\"\n                      onClick={() =>\n                        setPendingValue((prev) => ({ date: prev?.date ?? today(getLocalTimeZone()), time: slot }))\n                      }\n                      className={cx(\n                        \"w-full shrink-0 cursor-pointer rounded-2lg px-2 py-1.5 text-center text-body-medium text-text-primary transition-colors duration-150 ease\",\n                        pendingValue?.time === slot\n                          ? \"bg-background-tertiary-default\"\n                          : \"hover:bg-background-secondary-hover\",\n                      )}\n                    >\n                      {formatTime(slot, use24h)}\n                    </button>\n                  ))}\n                </div>\n              </div>\n            </div>\n          </Calendar>\n        </Dialog>\n      </Popover>\n    </>\n  );\n}\n",
  "src/board-native/components/base/date-picker/shared.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { useEffect, useState, useContext } from \"react\";\nimport {\n  Button as RACButton,\n  CalendarCell,\n  CalendarGrid,\n  CalendarGridBody,\n  CalendarGridHeader,\n  CalendarHeaderCell,\n  CalendarStateContext,\n  RangeCalendarStateContext,\n  useLocale,\n} from \"react-aria-components\";\nimport type { CalendarCellRenderProps } from \"react-aria-components\";\nimport { CalendarDate, endOfWeek, getLocalTimeZone, isSameDay, startOfWeek } from \"@internationalized/date\";\nimport { cx } from \"../../../utils/cx.js\";\n\n/**\n * Shared building blocks for the base/date-picker family — `DateRangePicker`\n * (dual-month, node 3871:5738) and `DatePicker` (single-month, node\n * 3879:6708) are the same visual system (month panel, day cell, editable\n * date chip) around two different react-aria-components roots\n * (`RangeCalendar` vs `Calendar`). Keeping the pieces here means a Figma\n * fidelity fix only has to happen once.\n */\n\n/** Exact paths from Figma's month-nav chevrons (node 3869:5461 / 3869:5528) — a\n *  16×16 glyph, 2px round-capped stroke, mirrored around x=8. */\nexport function ChevronLeft16({ className }: { className?: string }) {\n  return (\n    <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className={cx(\"rtl:rotate-180\", className)} aria-hidden>\n      <path\n        d=\"M9 4L5.70711 7.29289C5.31658 7.68342 5.31658 8.31658 5.70711 8.70711L9 12\"\n        stroke=\"currentColor\"\n        strokeWidth=\"2\"\n        strokeLinecap=\"round\"\n      />\n    </svg>\n  );\n}\n\nexport function ChevronRight16({ className }: { className?: string }) {\n  return (\n    <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" className={cx(\"rtl:rotate-180\", className)} aria-hidden>\n      <path\n        d=\"M7 4L10.2929 7.29289C10.6834 7.68342 10.6834 8.31658 10.2929 8.70711L7 12\"\n        stroke=\"currentColor\"\n        strokeWidth=\"2\"\n        strokeLinecap=\"round\"\n      />\n    </svg>\n  );\n}\n\nexport function formatTriggerDate(date: CalendarDate, locale?: string) {\n  return new Intl.DateTimeFormat(locale, { month: \"short\", day: \"numeric\", year: \"numeric\" }).format(\n    date.toDate(getLocalTimeZone()),\n  );\n}\n\nexport function formatChipDate(date: CalendarDate) {\n  return `${String(date.day).padStart(2, \"0\")}/${String(date.month).padStart(2, \"0\")}/${date.year}`;\n}\n\n/** Parses the chip's own \"DD/MM/YYYY\" format back into a CalendarDate, or\n *  null if the text isn't a valid date (out-of-range day/month is rejected\n *  up front; CalendarDate itself constrains impossible day-in-month combos\n *  like Feb 30). */\nexport function parseChipDate(text: string): CalendarDate | null {\n  const match = /^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/.exec(text.trim());\n  if (!match) return null;\n  const day = Number(match[1]);\n  const month = Number(match[2]);\n  const year = Number(match[3]);\n  if (month < 1 || month > 12 || day < 1 || day > 31) return null;\n  return new CalendarDate(year, month, day);\n}\n\nexport function DayCell(props: CalendarCellRenderProps & { isRange: boolean }) {\n  const { locale } = useLocale();\n  const { date, formattedDate, isSelected, isSelectionStart, isSelectionEnd, isHovered, isFocusVisible, isDisabled, isOutsideMonth, isRange } = props;\n\n  if (isOutsideMonth) {\n    return <div className=\"size-8\" />;\n  }\n\n  const isWeekStart = isSameDay(date, startOfWeek(date, locale));\n  const isWeekEnd = isSameDay(date, endOfWeek(date, locale));\n\n  // A plain (non-range) Calendar never sets isSelectionStart/isSelectionEnd —\n  // those are range-only concepts, so they stay false even for the one\n  // selected day. Without isRange, that day would fall through to the\n  // \"middle of a range\" backdrop path instead of rendering as its own pill.\n  const isSingleDay = isRange ? isSelectionStart && isSelectionEnd : isSelected;\n  const isEdge = isRange ? isSelectionStart || isSelectionEnd : isSelected;\n\n  // Cells sit 12px apart (Figma's row/column gap). A selected range should\n  // still read as one continuous band, so the background bridges that gap by\n  // extending half of it (6px) toward each selected neighbor — never past\n  // the first/last column of a row, where there's no neighbor to bridge to.\n  // Only meaningful for a RangeCalendar; a plain Calendar never bridges.\n  const extendStart = isRange && isSelected && !isSelectionStart && !isWeekStart;\n  const extendEnd = isRange && isSelected && !isSelectionEnd && !isWeekEnd;\n\n  // The blue backgrounds fade in/out on opacity instead of popping instantly.\n  // Both layers always render (geometry computed regardless of selection) so\n  // toggling opacity is a plain CSS transition, not a mount/unmount — that\n  // keeps ~70 cells worth of range changes cheap and reliably animated.\n  // border-radius rides the same transition as opacity: the rounding classes\n  // still flip instantly on deselect (the shape a cell \"should\" have has no\n  // in-between state), but transitioning the property means it eases toward\n  // square in sync with the fade instead of snapping to square immediately\n  // while the color is still visible.\n  return (\n    <div className=\"relative size-8\">\n      <span\n        aria-hidden\n        className={cx(\n          \"absolute inset-y-0 bg-date-range-background transition-[opacity,border-radius] duration-100 ease-out\",\n          isSelectionStart ? \"start-1/2\" : extendStart ? \"-start-1.5\" : \"start-0\",\n          isSelectionEnd ? \"end-1/2\" : extendEnd ? \"-end-1.5\" : \"end-0\",\n          !isSelectionStart && isWeekStart && \"rounded-s-lg\",\n          !isSelectionEnd && isWeekEnd && \"rounded-e-lg\",\n          isSelected && !isSingleDay ? \"opacity-100\" : \"opacity-0\",\n        )}\n      />\n      <div\n        className={cx(\n          \"relative flex size-8 items-center justify-center rounded-lg outline-none\",\n          !isSelected && isHovered && \"bg-background-secondary-hover\",\n          \"transition-colors duration-100 ease-out\",\n          isFocusVisible && \"ring-2 ring-inset ring-border-focus-ring\",\n        )}\n      >\n        <span\n          aria-hidden\n          className={cx(\n            \"absolute inset-0 bg-date-range-edge-background transition-[opacity,border-radius] duration-100 ease-out\",\n            isSingleDay && \"rounded-lg\",\n            isSelectionStart && !isSingleDay && \"rounded-s-lg\",\n            isSelectionEnd && !isSingleDay && \"rounded-e-lg\",\n            isEdge ? \"opacity-100\" : \"opacity-0\",\n          )}\n        />\n        <span className={cx(\"relative text-body-medium text-text-primary\", isDisabled && \"text-text-tertiary\")}>\n          {formattedDate}\n        </span>\n      </div>\n    </div>\n  );\n}\n\nexport function MonthPanel({\n  offset,\n  showPrev,\n  showNext,\n  bare = false,\n  hideHeader = false,\n}: {\n  offset: number;\n  showPrev?: boolean;\n  showNext?: boolean;\n  /** Skip the panel's own card chrome (width, bg, padding, shadow) so it can\n   *  be embedded directly inside a caller-styled container instead — used by\n   *  the calendar template's inline month switcher, which supplies its own\n   *  card (matching a different surface's border/shadow). */\n  bare?: boolean;\n  /** Skip the title + prev/next row entirely — used when a caller already\n   *  renders its own single month title/nav (the calendar template's month\n   *  switcher pill) and only needs the day grid underneath it. */\n  hideHeader?: boolean;\n}) {\n  const { locale } = useLocale();\n  // Works inside either a RangeCalendar (DateRangePicker) or a plain Calendar\n  // (DatePicker) — exactly one of these contexts is non-null depending on\n  // which root rendered it, and both expose the same `visibleRange` shape.\n  const rangeState = useContext(RangeCalendarStateContext);\n  const singleState = useContext(CalendarStateContext);\n  const state = rangeState ?? singleState;\n  const isRange = rangeState != null;\n  const panelDate = state ? state.visibleRange.start.add({ months: offset }) : null;\n  const title = panelDate\n    ? new Intl.DateTimeFormat(locale, { month: \"long\", year: \"numeric\" }).format(panelDate.toDate(getLocalTimeZone()))\n    : \"\";\n\n  return (\n    <div className={bare ? \"w-[296px] shrink-0\" : \"w-[326px] shrink-0 rounded-2xl bg-background-primary-default p-[15px] shadow-xs\"}>\n      <div className=\"flex flex-col gap-5\">\n        {!hideHeader && (\n          <div className=\"flex items-center justify-between\">\n            {showPrev ? (\n              <RACButton\n                slot=\"previous\"\n                className=\"flex size-4 cursor-pointer items-center justify-center rounded-[3px] text-text-secondary outline-none transition-colors duration-150 ease hover:bg-background-secondary-hover\"\n              >\n                <ChevronLeft16 />\n              </RACButton>\n            ) : (\n              <span className=\"size-4\" aria-hidden />\n            )}\n            <span className=\"flex-1 text-center text-body-medium text-text-primary\">{title}</span>\n            {showNext ? (\n              <RACButton\n                slot=\"next\"\n                className=\"flex size-4 cursor-pointer items-center justify-center rounded-[3px] text-text-secondary outline-none transition-colors duration-150 ease hover:bg-background-secondary-hover\"\n              >\n                <ChevronRight16 />\n              </RACButton>\n            ) : (\n              <span className=\"size-4\" aria-hidden />\n            )}\n          </div>\n        )}\n        <CalendarGrid\n          offset={{ months: offset }}\n          weekdayStyle=\"short\"\n          className=\"-m-3 self-start border-separate outline-none\"\n          style={{ borderSpacing: \"12px 12px\" }}\n        >\n          <CalendarGridHeader>\n            {(day) => (\n              <CalendarHeaderCell className=\"size-6 pb-0 text-center text-body-medium text-text-secondary\">\n                {day.slice(0, 2)}\n              </CalendarHeaderCell>\n            )}\n          </CalendarGridHeader>\n          <CalendarGridBody>\n            {(date) => (\n              <CalendarCell date={date} className=\"p-0 outline-none\">\n                {(cellProps) => <DayCell {...cellProps} isRange={isRange} />}\n              </CalendarCell>\n            )}\n          </CalendarGridBody>\n        </CalendarGrid>\n      </div>\n    </div>\n  );\n}\n\n/** One editable \"DD/MM/YYYY\" chip. Keeps its own draft text while typing so\n *  the field doesn't reformat on every keystroke; commits on blur/Enter,\n *  reverting to the last valid value if the text doesn't parse. */\nexport function DateChipInput({\n  date,\n  label,\n  onCommit,\n}: {\n  date: CalendarDate;\n  label: string;\n  onCommit: (date: CalendarDate) => void;\n}) {\n  const formatted = formatChipDate(date);\n  const [text, setText] = useState(formatted);\n\n  useEffect(() => {\n    setText(formatted);\n  }, [formatted]);\n\n  const commit = () => {\n    const parsed = parseChipDate(text);\n    if (parsed) {\n      onCommit(parsed);\n    } else {\n      setText(formatted);\n    }\n  };\n\n  return (\n    <input\n      type=\"text\"\n      dir=\"ltr\"\n      inputMode=\"numeric\"\n      value={text}\n      onChange={(event) => setText(event.target.value)}\n      onBlur={commit}\n      onKeyDown={(event) => {\n        if (event.key === \"Enter\") event.currentTarget.blur();\n        if (event.key === \"Escape\") setText(formatted);\n      }}\n      aria-label={label}\n      className=\"w-[104px] rounded-2lg border border-border-button-default bg-background-primary-default px-2 py-2 text-body-medium text-text-primary shadow-xs outline-none transition-colors duration-100 ease-out focus-visible:border-border-button-active\"\n    />\n  );\n}\n\n/** Shared trigger-button chrome for both pickers (Figma's \"Primary\" button —\n *  calendar icon + formatted-value text, white surface, radius/2lg). */\nexport const triggerButtonClassName = cx(\n  \"inline-flex shrink-0 cursor-pointer items-center gap-0.5 rounded-2lg border border-border-button-default bg-background-primary-default p-2 shadow-xs outline-none\",\n  \"transition-[background-color,border-color,box-shadow] duration-150 ease\",\n  \"hover:bg-background-primary-hover hover:border-border-button-hover\",\n  \"focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-border-focus-ring\",\n  \"disabled:cursor-not-allowed disabled:bg-background-primary-disabled disabled:text-text-tertiary disabled:shadow-none\",\n);\n\n/** Shared popover chrome (Figma's rounded/3xl, background/secondary/default\n *  \"Calendar component\" surface) for both pickers. */\nexport const popoverClassName = cx(\n  \"origin-top max-w-[calc(100vw-24px)] overflow-auto rounded-3xl bg-background-secondary-default shadow-dropdown\",\n  \"transition duration-150 ease-out\",\n  \"data-[entering]:opacity-0 data-[entering]:scale-95 data-[entering]:blur-[2px]\",\n  \"data-[exiting]:opacity-0 data-[exiting]:scale-95 data-[exiting]:blur-[2px]\",\n);\n",
  "src/board-native/components/base/divider/divider.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\nimport type { HTMLAttributes, ReactNode, Ref } from \"react\";\nimport { cx, sortCx } from \"../../../utils/cx.js\";\n\nexport type DividerVariant = \"single\" | \"double\" | \"fill\";\nexport type DividerAlign = \"start\" | \"center\" | \"end\";\n\nexport interface DividerProps\n  extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n  /** Single hairline, two framing hairlines, or a soft filled strip. */\n  variant?: DividerVariant;\n  /** Positions the divider content while keeping the remaining line flexible. */\n  align?: DividerAlign;\n  /** Text, a button, or any compact control placed in the divider. */\n  children?: ReactNode;\n  /** Extra classes for the content wrapper. */\n  contentClassName?: string;\n  ref?: Ref<HTMLDivElement>;\n}\n\nconst styles = sortCx({\n  root: \"w-full\",\n  line: \"h-px min-w-0 flex-1 bg-separator-border\",\n  content: \"shrink-0 text-body-medium text-text-secondary\",\n  align: {\n    start: \"justify-start\",\n    center: \"justify-center\",\n    end: \"justify-end\",\n  },\n  withContent: {\n    single: \"flex items-center gap-3\",\n    double: \"flex items-center border-y border-separator-border py-2.5\",\n    fill: \"flex items-center rounded-2lg bg-background-secondary-default px-4 py-2.5\",\n  },\n  empty: {\n    single: \"h-px bg-separator-border\",\n    double: \"h-2 border-y border-separator-border\",\n    fill: \"h-2 rounded-full bg-background-secondary-default\",\n  },\n});\n\n/**\n * Horizontal content divider with three BoardUI surface treatments.\n *\n * `single` places content within one continuous hairline, `double` frames it\n * with a line above and below, and `fill` uses the secondary surface color.\n * Children stay completely composable, so labels, buttons, and small controls\n * can share the same primitive.\n */\nexport function Divider({\n  variant = \"single\",\n  align = \"center\",\n  children,\n  contentClassName,\n  className,\n  ref,\n  ...props\n}: DividerProps) {\n  const hasContent = children !== undefined && children !== null;\n\n  if (!hasContent) {\n    return (\n      <div\n        ref={ref}\n        role=\"separator\"\n        aria-orientation=\"horizontal\"\n        data-variant={variant}\n        className={cx(styles.root, styles.empty[variant], className)}\n        {...props}\n      />\n    );\n  }\n\n  const showLeadingLine = variant === \"single\" && align !== \"start\";\n  const showTrailingLine = variant === \"single\" && align !== \"end\";\n\n  return (\n    <div\n      ref={ref}\n      data-variant={variant}\n      data-align={align}\n      className={cx(\n        styles.root,\n        styles.withContent[variant],\n        styles.align[align],\n        className,\n      )}\n      {...props}\n    >\n      {showLeadingLine ? <span aria-hidden className={styles.line} /> : null}\n      <div className={cx(styles.content, contentClassName)}>{children}</div>\n      {showTrailingLine ? <span aria-hidden className={styles.line} /> : null}\n    </div>\n  );\n}\n",
  "src/board-native/components/base/dropdown/dropdown.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { createContext, useContext, useRef, useState, type ComponentProps, type ReactNode, type RefObject } from \"react\";\nimport {\n  Button as AriaButton,\n  Dialog as AriaDialog,\n  DialogTrigger as AriaDialogTrigger,\n  Popover as AriaPopover,\n} from \"react-aria-components\";\nimport {\n  MENU_ITEM,\n  MENU_ITEM_ACTIVE,\n  MENU_ITEM_INTERACTIVE,\n  MENU_POPOVER_SURFACE,\n  MENU_POPOVER_WIDTH,\n} from \"./menu-styles.js\";\nimport { cx } from \"../../../utils/cx.js\";\nimport { useDismissOnOutsidePress, useTriggerToggle } from \"../../../utils/use-dismiss-on-outside-press.js\";\n\n/**\n * Dropdown — the BoardUI popover-menu recipe as composable primitives, built\n * on React Aria's DialogTrigger/Popover. Unlike Select (which picks a value\n * into a trigger), Dropdown is a free-form menu surface: grouped rows of\n * actions, headers, footers, whatever the panel needs.\n *\n * The same recipe powers the dashboard sidebar's team/account menus and the\n * AI chat template's add/model/folder menus:\n *\n * - Panel: white, 1px border/button/default, radius 16, p 10, shadow/dropdown.\n * - Appear animation: 150ms fade + scale-95 + 2px blur in and out.\n * - Rows: rounded-2lg, background/secondary/hover on hover and on the selected\n *   row, body-medium labels, 4px apart (the panel's flex column carries a\n *   gap-1, the same rhythm as the Select listbox).\n *\n * Composition:\n *\n * ```tsx\n * <Dropdown isOpen={isOpen} onOpenChange={setIsOpen}>\n *   <DropdownTrigger>Open</DropdownTrigger>\n *   <DropdownPopover aria-label=\"Actions\" placement=\"bottom start\">\n *     <DropdownGroup label=\"Add\">\n *       <DropdownItem onSelect={close}>…row content…</DropdownItem>\n *     </DropdownGroup>\n *     <DropdownDivider />\n *     <DropdownGroup label=\"Plugins\">…</DropdownGroup>\n *   </DropdownPopover>\n * </Dropdown>\n * ```\n *\n * State can be uncontrolled (omit isOpen/onOpenChange) — control it when the\n * trigger needs to react to the open state (e.g. rotating a chevron).\n */\n\n/* ------------------------------------------------------------------- shell */\n\ninterface DropdownContextValue {\n  triggerRef: RefObject<HTMLButtonElement | null>;\n  popoverRef: RefObject<HTMLElement | null>;\n}\n\nconst DropdownContext = createContext<DropdownContextValue | null>(null);\n\nexport interface DropdownProps {\n  isOpen?: boolean;\n  onOpenChange?: (isOpen: boolean) => void;\n  /** Trigger (a DropdownTrigger) followed by a DropdownPopover. */\n  children: ReactNode;\n}\n\n/**\n * The popover is `isNonModal`: react-aria's modal scroll lock puts\n * `overflow: hidden` on <html>, which collapses the page scroll position and\n * visibly yanks sticky layout (e.g. the docs sidebar) whenever a menu opens.\n * Non-modal skips the lock, but react-aria hard-couples outside-press\n * dismissal to modality — so open state lives here (bridging any controlled\n * props) and dismissal is restored via useDismissOnOutsidePress, the same\n * fix as Select and the date-picker family.\n */\nexport function Dropdown({ isOpen: controlledOpen, onOpenChange, children }: DropdownProps) {\n  const triggerRef = useRef<HTMLButtonElement>(null);\n  const popoverRef = useRef<HTMLElement>(null);\n  const [uncontrolledOpen, setUncontrolledOpen] = useState(false);\n\n  const isOpen = controlledOpen ?? uncontrolledOpen;\n  const setOpen = (next: boolean) => {\n    setUncontrolledOpen(next);\n    onOpenChange?.(next);\n  };\n\n  useDismissOnOutsidePress(isOpen, () => setOpen(false), [triggerRef, popoverRef]);\n  // Pressing the trigger while open closes the menu instead of reopening\n  const allowOpenChange = useTriggerToggle(isOpen, triggerRef);\n\n  return (\n    <DropdownContext.Provider value={{ triggerRef, popoverRef }}>\n      <AriaDialogTrigger isOpen={isOpen} onOpenChange={(o) => allowOpenChange(o) && setOpen(o)}>\n        {children}\n      </AriaDialogTrigger>\n    </DropdownContext.Provider>\n  );\n}\n\n/** The element that opens the menu. Style it entirely via className. */\nexport function DropdownTrigger({ className, ...props }: ComponentProps<typeof AriaButton>) {\n  const context = useContext(DropdownContext);\n  return (\n    <AriaButton\n      ref={context?.triggerRef}\n      {...props}\n      className={cx(\n        \"cursor-pointer outline-none focus-visible:ring-2 focus-visible:ring-border-focus-ring\",\n        className as string,\n      )}\n    />\n  );\n}\n\n/* ------------------------------------------------------------------- panel */\n\nexport interface DropdownPopoverProps\n  extends Pick<ComponentProps<typeof AriaPopover>, \"placement\" | \"offset\" | \"crossOffset\"> {\n  \"aria-label\": string;\n  /** Extra classes on the panel — e.g. a width override (default w-[266px]). */\n  className?: string;\n  /** Classes on the inner dialog (the flex column), e.g. gap between groups. */\n  dialogClassName?: string;\n  children: ReactNode;\n}\n\nexport function DropdownPopover({\n  \"aria-label\": ariaLabel,\n  placement = \"bottom start\",\n  offset = 4,\n  crossOffset,\n  className,\n  dialogClassName,\n  children,\n}: DropdownPopoverProps) {\n  const context = useContext(DropdownContext);\n  return (\n    <AriaPopover\n      ref={context?.popoverRef}\n      isNonModal\n      placement={placement}\n      offset={offset}\n      crossOffset={crossOffset}\n      className={cx(\n        MENU_POPOVER_WIDTH,\n        MENU_POPOVER_SURFACE,\n        className,\n      )}\n    >\n      {/* gap-1 keeps bare DropdownItems 4px apart, the same rhythm as the\n          Select listbox; DropdownDivider's margins are sized to absorb it. */}\n      <AriaDialog aria-label={ariaLabel} className={cx(\"flex flex-col gap-1 outline-none\", dialogClassName)}>\n        {children}\n      </AriaDialog>\n    </AriaPopover>\n  );\n}\n\n/* ----------------------------------------------------------------- content */\n\nexport interface DropdownGroupProps {\n  /** Muted body-medium heading above the rows. */\n  label?: string;\n  className?: string;\n  children: ReactNode;\n}\n\nexport function DropdownGroup({ label, className, children }: DropdownGroupProps) {\n  return (\n    // pt-1 is spacing for the group LABEL — a label-less group must not\n    // carry it, or its first row floats 4px lower than the panel padding\n    // implies (visible as extra space above the first item's hover pill).\n    <div className={cx(\"flex w-full flex-col gap-1.5\", label && \"pt-1\", className)}>\n      {label && <span className=\"ps-2 text-body-medium text-text-secondary\">{label}</span>}\n      <div className=\"flex w-full flex-col gap-1\">{children}</div>\n    </div>\n  );\n}\n\nexport interface DropdownItemProps {\n  /** Highlights the row like the hover state (current selection). */\n  selected?: boolean;\n  onSelect?: () => void;\n  /** Row padding defaults to p-2 — override for denser rows (px-2 py-1.5). */\n  className?: string;\n  children: ReactNode;\n}\n\n/**\n * A menu row. Content is free-form — icon + label, avatar + name, label +\n * trailing badge — laid out in a gap-2 flex row.\n */\nexport function DropdownItem({ selected, onSelect, className, children }: DropdownItemProps) {\n  return (\n    <button\n      type=\"button\"\n      aria-pressed={selected}\n      onClick={onSelect}\n      className={cx(\n        MENU_ITEM,\n        selected ? MENU_ITEM_ACTIVE : MENU_ITEM_INTERACTIVE,\n        className,\n      )}\n    >\n      {children}\n    </button>\n  );\n}\n\n/** Full-bleed 1px divider between groups (bleeds through the panel's p-2.5).\n *  my-1.5 + the dialog's gap-1 on both sides = the original 10px breathing room. */\nexport function DropdownDivider({ className }: { className?: string }) {\n  return <div className={cx(\"-mx-2.5 my-1.5 h-px shrink-0 bg-border-button-default\", className)} />;\n}\n",
  "src/board-native/components/base/dropdown/menu-styles.ts": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n/**\n * Shared visual recipe for BoardUI menu surfaces.\n *\n * Select and Dropdown intentionally keep their distinct React Aria semantics\n * (single-value listbox vs. action menu), while consuming the same panel,\n * motion, and row treatments from here.\n */\nexport const MENU_POPOVER_SURFACE = [\n  \"max-w-[calc(100vw-32px)] overflow-y-auto\",\n  \"rounded-2xl border border-border-button-default bg-background-primary-default p-2.5 shadow-dropdown\",\n  \"transition duration-150 ease-out\",\n  \"data-[entering]:opacity-0 data-[entering]:scale-95 data-[entering]:blur-[2px]\",\n  \"data-[exiting]:opacity-0 data-[exiting]:scale-95 data-[exiting]:blur-[2px]\",\n  \"data-[placement=bottom]:origin-top-left rtl:data-[placement=bottom]:origin-top-right data-[placement=top]:origin-bottom-left rtl:data-[placement=top]:origin-bottom-right\",\n  \"data-[placement=left]:origin-right data-[placement=right]:origin-left\",\n].join(\" \");\n\nexport const MENU_POPOVER_WIDTH = \"w-[266px]\";\n\nexport const MENU_ITEMS_CONTAINER = \"flex w-full flex-col gap-1 outline-none\";\n\nexport const MENU_ITEM = [\n  \"flex w-full cursor-pointer items-center gap-2 rounded-2lg p-2 text-start\",\n  \"text-text-primary outline-none transition-colors\",\n].join(\" \");\n\nexport const MENU_ITEM_ACTIVE = \"bg-dropdown-item-hover-background\";\n\nexport const MENU_ITEM_INTERACTIVE =\n  \"hover:bg-dropdown-item-hover-background focus-visible:bg-dropdown-item-hover-background\";\n",
  "src/board-native/components/base/file-upload/file-upload-validation.ts": "/** Shared selection/drop validation; no storage or network side effects. */\nexport function formatFileSize(bytes:number){\n  if(bytes>=1024*1024){const mb=bytes/(1024*1024);return `${mb>=10?Math.round(mb):Math.round(mb*10)/10} MB`;}\n  return `${Math.max(1,Math.round(bytes/1024))} KB`;\n}\nexport function fileExtension(name:string){\n  const dot=name.lastIndexOf('.');\n  return dot>0?name.slice(dot+1).toLowerCase():'';\n}\nexport function fileUploadRejection(file:{name:string;size:number},allowedExtensions:readonly string[],maxBytes:number):string|null{\n  if(!allowedExtensions.some(value=>value.toLowerCase()===fileExtension(file.name)))return `Only ${allowedExtensions.map(value=>value.toUpperCase()).join(', ')} files are supported`;\n  if(file.size>maxBytes)return `That file is larger than ${formatFileSize(maxBytes)}`;\n  return null;\n}\n",
  "src/board-native/components/base/file-upload/file-upload.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { useTemplateCopy } from \"../../foundations/template-copy/template-copy.js\";\n\nimport { useEffect, useId, useRef, useState, type ReactNode } from \"react\";\nimport {\n  RiFileExcel2Line,\n  RiFileImageLine,\n  RiFileTextLine,\n  RiUploadCloud2Line,\n} from \"@remixicon/react\";\nimport { cx } from \"../../../utils/cx.js\";\nimport {fileExtension as extensionFor,fileUploadRejection,formatFileSize} from \"./file-upload-validation.js\";\nexport {formatFileSize} from \"./file-upload-validation.js\";\n\n/**\n * Figma sources: Board UI → \"Upload file\" (node 4105:25269),\n * \"Upload in progress\" (node 4107:27192), and the complete state\n * (node 4107:30456).\n *\n * Interactive drag-and-drop file upload with validation, a perimeter progress\n * indicator, animated content transitions, and a completion callback. The\n * upload is simulated so the component is backend-agnostic; connect\n * `onUploadComplete` to the application's upload/storage layer.\n */\n\nconst DEFAULT_MAX_BYTES = 8 * 1024 * 1024;\nconst DEFAULT_EXTENSIONS = [\"pdf\", \"jpg\", \"jpeg\", \"png\", \"xlsx\"] as const;\n\ntype UploadPhase = \"idle\" | \"uploading\" | \"complete\";\ntype StaggerState = \"shown\" | \"hiding\" | \"hidden\";\n\nexport interface FileUploadProps {\n  /** Called after the progress and success states finish. */\n  onUploadComplete?: (file: File) => void;\n  /** Accepted filename extensions without dots. */\n  allowedExtensions?: readonly string[];\n  /** Maximum accepted file size in bytes. */\n  maxBytes?: number;\n  /** Overrides the icon shown while a file uploads. */\n  renderFileIcon?: (file: File) => ReactNode;\n  className?: string;\n}\n\nfunction DefaultFileIcon({ file }: { file: File }) {\n  const extension = extensionFor(file.name);\n  const Icon = extension === \"xlsx\"\n    ? RiFileExcel2Line\n    : [\"jpg\", \"jpeg\", \"png\"].includes(extension)\n      ? RiFileImageLine\n      : RiFileTextLine;\n\n  return <Icon className=\"size-6 shrink-0 text-foreground-icon-secondary\" aria-hidden />;\n}\n\n/** Drives the Transitions.dev text-reveal states defined in globals.css. */\nfunction useStaggerState(active: boolean): StaggerState {\n  const [prevActive, setPrevActive] = useState(active);\n  const [hiding, setHiding] = useState(false);\n\n  if (prevActive !== active) {\n    setPrevActive(active);\n    setHiding(!active);\n  }\n\n  useEffect(() => {\n    if (!hiding) return;\n    const timer = setTimeout(() => setHiding(false), 200);\n    return () => clearTimeout(timer);\n  }, [hiding]);\n\n  return active ? \"shown\" : hiding ? \"hiding\" : \"hidden\";\n}\n\nconst staggerContainer = (state: StaggerState) =>\n  cx(\"t-stagger\", state === \"shown\" && \"is-shown\", state === \"hiding\" && \"is-hiding\");\n\nconst staggerLine = (state: StaggerState) =>\n  cx(\n    state === \"shown\" &&\n      \"translate-y-0 opacity-100 blur-0 [transition:opacity_var(--stagger-dur)_var(--stagger-ease),translate_var(--stagger-dur)_var(--stagger-ease),filter_var(--stagger-dur)_var(--stagger-ease)]\",\n    state === \"hiding\" && \"translate-y-0 opacity-0 blur-0 [transition:opacity_200ms_ease]\",\n    state === \"hidden\" && \"translate-y-3 opacity-0 blur-[3px] transition-none\",\n  );\n\n/** Rounded-rect progress path beginning at top-center and running clockwise. */\nfunction ringPath(width: number, height: number, inset: number, radius: number) {\n  const x0 = inset;\n  const y0 = inset;\n  const x1 = width - inset;\n  const y1 = height - inset;\n  const arc = (endX: number, endY: number) =>\n    `A ${radius} ${radius} 0 0 1 ${endX} ${endY}`;\n\n  return [\n    `M ${width / 2} ${y0}`,\n    `H ${x1 - radius}`,\n    arc(x1, y0 + radius),\n    `V ${y1 - radius}`,\n    arc(x1 - radius, y1),\n    `H ${x0 + radius}`,\n    arc(x0, y1 - radius),\n    `V ${y0 + radius}`,\n    arc(x0 + radius, y0),\n    \"Z\",\n  ].join(\" \");\n}\n\nexport function FileUpload({\n  onUploadComplete,\n  allowedExtensions = DEFAULT_EXTENSIONS,\n  maxBytes = DEFAULT_MAX_BYTES,\n  renderFileIcon,\n  className,\n}: FileUploadProps) {\n  const localize = useTemplateCopy();\n  const [phase, setPhase] = useState<UploadPhase>(\"idle\");\n  const [progress, setProgress] = useState(0);\n  const [file, setFile] = useState<File | null>(null);\n  const rejectionId=useId();\n  const [rejection, setRejection] = useState<string | null>(null);\n  const [dragOver, setDragOver] = useState(false);\n\n  const boxRef = useRef<HTMLDivElement>(null);\n  const [box, setBox] = useState({ width: 533, height: 164 });\n  const timers = useRef<ReturnType<typeof setTimeout>[]>([]);\n\n  useEffect(() => {\n    const element = boxRef.current;\n    if (!element) return;\n    const observer = new ResizeObserver(([entry]) => {\n      const { width, height } = entry.contentRect;\n      if (width > 0) setBox({ width, height });\n    });\n    observer.observe(element);\n    return () => observer.disconnect();\n  }, []);\n\n  useEffect(() => {\n    const pending = timers.current;\n    return () => pending.forEach(clearTimeout);\n  }, []);\n\n  const startUpload = (nextFile: File) => {\n    const reason=fileUploadRejection(nextFile,allowedExtensions,maxBytes);\n    setRejection(reason);\n    if(reason)return;\n\n    setFile(nextFile);\n    setProgress(0);\n    setPhase(\"uploading\");\n\n    let value = 0;\n    const tick = () => {\n      value = Math.min(100, value + 2 + Math.random() * 5);\n      setProgress(Math.round(value));\n      if (value < 100) {\n        timers.current.push(setTimeout(tick, 90));\n        return;\n      }\n\n      setPhase(\"complete\");\n      timers.current.push(\n        setTimeout(() => {\n          onUploadComplete?.(nextFile);\n          setPhase(\"idle\");\n          setFile(null);\n        }, 1600),\n      );\n    };\n    timers.current.push(setTimeout(tick, 250));\n  };\n\n  const busy = phase !== \"idle\";\n  const progressPath = ringPath(box.width, box.height, 1, 15);\n  const idleReveal = useStaggerState(!busy);\n  const busyReveal = useStaggerState(busy);\n  const uploadingLine = useStaggerState(phase === \"uploading\");\n  const completeLine = useStaggerState(phase === \"complete\");\n  const allowedLabel = allowedExtensions\n    .filter((extension) => extension.toLowerCase() !== \"jpeg\")\n    .map((extension) => extension.toUpperCase())\n    .join(\", \");\n\n  return localize(\n    <>\n    <div\n      ref={boxRef}\n      aria-busy={busy||undefined}\n      onDragOver={(event) => {\n        event.preventDefault();\n        if (!busy) setDragOver(true);\n      }}\n      onDragLeave={() => setDragOver(false)}\n      onDrop={(event) => {\n        event.preventDefault();\n        setDragOver(false);\n        const droppedFile = event.dataTransfer.files?.[0];\n        if (droppedFile && !busy) startUpload(droppedFile);\n      }}\n      className={cx(\n        \"group relative h-[164px] w-full shrink-0 rounded-2xl outline-none\",\n        \"transition-colors duration-300 ease-out\",\n        busy ? \"bg-background-primary-default\" : \"cursor-pointer bg-background-secondary-default\",\n        \"focus-within:ring-2 focus-within:ring-offset-2 focus-within:ring-border-focus-ring\",\n        className,\n      )}\n    >\n      <input\n        type=\"file\"\n        aria-label=\"Upload a file\"\n        aria-invalid={rejection?true:undefined}\n        aria-describedby={rejection?rejectionId:undefined}\n        accept={allowedExtensions.map((extension) => `.${extension}`).join(\",\")}\n        disabled={busy}\n        className=\"absolute inset-0 z-10 size-full cursor-pointer opacity-0 disabled:cursor-default\"\n        onChange={(event) => {\n          const selectedFile = event.target.files?.[0];\n          event.target.value = \"\";\n          if (selectedFile) startUpload(selectedFile);\n        }}\n      />\n      <div\n        aria-hidden\n        className={cx(\n          \"pointer-events-none absolute inset-0 rounded-2xl border-2 border-dashed\",\n          dragOver\n            ? \"border-border-button-active\"\n            : \"border-border-checkbox-default group-hover:border-border-button-active\",\n          \"transition-[opacity,border-color] duration-300 ease-out\",\n          busy ? \"opacity-0\" : \"opacity-100\",\n        )}\n      />\n\n      <svg\n        aria-hidden\n        viewBox={`0 0 ${box.width} ${box.height}`}\n        preserveAspectRatio=\"none\"\n        className={cx(\n          \"pointer-events-none absolute inset-0 size-full transition-opacity duration-300 ease-out\",\n          busy ? \"opacity-100\" : \"opacity-0\",\n        )}\n      >\n        <rect\n          x={1}\n          y={1}\n          width={box.width - 2}\n          height={box.height - 2}\n          rx={15}\n          fill=\"none\"\n          stroke=\"var(--color-border-button-default)\"\n          strokeWidth={2}\n        />\n        <path\n          d={progressPath}\n          fill=\"none\"\n          stroke=\"var(--color-accent-400)\"\n          strokeWidth={2}\n          strokeLinecap=\"round\"\n          pathLength={100}\n          strokeDasharray={`${busy ? (progress >= 100 ? 102 : progress) : 0} 200`}\n          className=\"transition-[stroke-dasharray] duration-200 ease-linear\"\n        />\n      </svg>\n\n      <div\n        aria-hidden\n        className={cx(\n          \"absolute -top-[9.5px] left-1/2 -translate-x-1/2 rounded-md bg-accent-400 px-1.5 py-0.5\",\n          \"text-caption-1-medium whitespace-nowrap text-white tabular-nums\",\n          \"[transition:opacity_160ms_ease-out,filter_160ms_ease-out,translate_300ms_ease-out]\",\n          busy ? \"translate-y-0 opacity-100 blur-0\" : \"-translate-y-2.5 opacity-0 blur-[2px]\",\n        )}\n      >\n        {progress}%\n      </div>\n\n      <div\n        className={cx(\n          \"absolute inset-0 flex flex-col items-center justify-center gap-3.5\",\n          staggerContainer(idleReveal),\n          busy && \"pointer-events-none\",\n        )}\n      >\n        <span className=\"t-stagger-line t-stagger-line--1 flex size-10 items-center justify-center rounded-full bg-file-upload-icon-background p-2.5\">\n          <RiUploadCloud2Line\n            className=\"size-6 shrink-0 text-file-upload-icon-foreground transition-colors duration-150 ease group-hover:text-file-upload-icon-foreground-hover\"\n            aria-hidden\n          />\n        </span>\n        <div className=\"flex flex-col items-center gap-2 text-center\">\n          <p id={rejectionId} role={rejection?\"alert\":undefined}\n            className={cx(\n              \"t-stagger-line t-stagger-line--2 text-body-medium\",\n              rejection ? \"text-text-error-primary\" : \"text-text-secondary\",\n            )}\n          >\n            {rejection ?? (\n              <>\n                Drag and drop to upload or <span className=\"text-accent-500\">select</span>\n              </>\n            )}\n          </p>\n          <p className=\"t-stagger-line t-stagger-line--3 text-body-2-regular text-text-tertiary\">\n            {allowedLabel} (max {formatFileSize(maxBytes)})\n          </p>\n        </div>\n      </div>\n\n      <div\n        className={cx(\n          \"absolute inset-0 flex flex-col items-center justify-center\",\n          staggerContainer(busyReveal),\n          !busy && \"pointer-events-none\",\n        )}\n      >\n        <span className=\"t-stagger-line t-stagger-line--1 flex size-10 items-center justify-center rounded-full border border-border-button-default bg-background-primary-default p-2\">\n          {file && (renderFileIcon ? renderFileIcon(file) : <DefaultFileIcon file={file} />)}\n        </span>\n        <p className=\"t-stagger-line t-stagger-line--2 mt-3.5 max-w-[90%] truncate text-body-medium text-text-primary\">\n          {file?.name}\n        </p>\n        <div className=\"t-stagger-line t-stagger-line--3 relative mt-1 h-[18px] w-full\">\n          <p\n            className={cx(\n              \"absolute inset-x-0 text-center text-body-2-regular text-text-secondary\",\n              staggerLine(uploadingLine),\n            )}\n          >\n            Preparing locally {file ? formatFileSize(file.size) : \"\"}\n            ...\n          </p>\n          <p\n            className={cx(\n              \"absolute inset-x-0 text-center text-body-2-regular text-text-secondary\",\n              staggerLine(completeLine),\n            )}\n          >\n            File ready locally!\n          </p>\n        </div>\n      </div>\n    </div>\n\n    </>\n  );\n}\n",
  "src/board-native/components/base/input-otp/input-otp.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport {\n  useId,\n  useRef,\n  useState,\n  type ClipboardEvent,\n  type KeyboardEvent,\n  type Ref,\n} from \"react\";\nimport { cx } from \"../../../utils/cx.js\";\n\n/**\n * One-time-code input: one box per digit, side by side.\n *\n * The awkward part of an OTP field is that it looks like N inputs but behaves\n * like one value, and the two views have to stay in step in every direction:\n *\n *   type      fills a box and advances\n *   Backspace clears the box, or steps back when the box is already empty\n *   arrows    move between boxes without changing anything\n *   paste     distributes across the boxes from wherever the caret is\n *   autofill  the OS hands the whole code to the first box at once\n *\n * That last one is why every box carries `autoComplete=\"one-time-code\"` and\n * why the change handler accepts more than a single character: iOS and Chrome\n * both deliver the full code into whichever box has focus, and a field that\n * only accepts one character silently drops five digits of it.\n *\n * Digits are monospace so the boxes stay optically even — in a proportional\n * face a `1` is visibly narrower than a `8`, which makes a row of fixed boxes\n * look mis-set even when it is perfectly aligned.\n */\n\nexport interface InputOtpProps {\n  /** Number of digit boxes. */\n  length?: number;\n  /** Controlled value. Longer strings are truncated to `length`. */\n  value?: string;\n  defaultValue?: string;\n  onChange?: (value: string) => void;\n  /** Fires once the last box is filled. */\n  onComplete?: (value: string) => void;\n  isDisabled?: boolean;\n  isInvalid?: boolean;\n  /** Renders a gap between groups, e.g. `3` gives 000 000. */\n  groupEvery?: number;\n  \"aria-label\"?: string;\n  className?: string;\n  ref?: Ref<HTMLDivElement>;\n}\n\nconst DIGITS_ONLY = /\\D/g;\n\nexport function InputOtp({\n  length = 6,\n  value,\n  defaultValue = \"\",\n  onChange,\n  onComplete,\n  isDisabled = false,\n  isInvalid = false,\n  groupEvery,\n  \"aria-label\": ariaLabel = \"One-time code\",\n  className,\n  ref,\n}: InputOtpProps) {\n  const groupId = useId();\n  const inputsRef = useRef<Array<HTMLInputElement | null>>([]);\n  const [internal, setInternal] = useState(defaultValue.replace(DIGITS_ONLY, \"\").slice(0, length));\n\n  const controlled = value !== undefined;\n  const code = (controlled ? value : internal).replace(DIGITS_ONLY, \"\").slice(0, length);\n\n  const commit = (next: string) => {\n    const clean = next.replace(DIGITS_ONLY, \"\").slice(0, length);\n    if (!controlled) setInternal(clean);\n    onChange?.(clean);\n    if (clean.length === length) onComplete?.(clean);\n  };\n\n  const focusBox = (index: number) => {\n    const target = inputsRef.current[Math.max(0, Math.min(index, length - 1))];\n    target?.focus();\n    target?.select();\n  };\n\n  /** Writes `digits` starting at `index`, which covers typing and autofill. */\n  const writeFrom = (index: number, digits: string) => {\n    const clean = digits.replace(DIGITS_ONLY, \"\");\n    if (clean === \"\") return;\n\n    const chars = code.padEnd(length, \" \").split(\"\");\n    for (let offset = 0; offset < clean.length && index + offset < length; offset += 1) {\n      chars[index + offset] = clean[offset];\n    }\n    commit(chars.join(\"\").trimEnd());\n    focusBox(index + clean.length);\n  };\n\n  const onKeyDown = (event: KeyboardEvent<HTMLInputElement>, index: number) => {\n    if (event.key === \"Backspace\") {\n      event.preventDefault();\n      if (code[index]) {\n        // Clear in place; the caret only steps back on an already-empty box,\n        // which is what makes holding Backspace feel right.\n        const chars = code.padEnd(length, \" \").split(\"\");\n        chars[index] = \" \";\n        commit(chars.join(\"\").trimEnd());\n        return;\n      }\n      const chars = code.padEnd(length, \" \").split(\"\");\n      chars[Math.max(0, index - 1)] = \" \";\n      commit(chars.join(\"\").trimEnd());\n      focusBox(index - 1);\n      return;\n    }\n\n    if (event.key === \"ArrowLeft\") {\n      event.preventDefault();\n      focusBox(index - 1);\n    } else if (event.key === \"ArrowRight\") {\n      event.preventDefault();\n      focusBox(index + 1);\n    }\n  };\n\n  const onPaste = (event: ClipboardEvent<HTMLInputElement>, index: number) => {\n    event.preventDefault();\n    writeFrom(index, event.clipboardData.getData(\"text\"));\n  };\n\n  return (\n    <div\n      ref={ref}\n      role=\"group\"\n      data-input-otp=\"\"\n      dir=\"ltr\"\n      aria-label={ariaLabel}\n      // No `aria-invalid` here: `group` does not support it. Each box carries\n      // its own, which is where a screen reader looks anyway.\n      className={cx(\"flex items-center gap-2\", className)}\n    >\n      {Array.from({ length }, (_, index) => {\n        const filled = code[index] ?? \"\";\n        const gapBefore = groupEvery !== undefined && index > 0 && index % groupEvery === 0;\n\n        return (\n          <div key={index} className={cx(\"flex items-center\", gapBefore && \"ms-3\")}>\n            <input\n              ref={(node) => {\n                inputsRef.current[index] = node;\n              }}\n              id={`${groupId}-${index}`}\n              // `text` with a numeric mode rather than `number`: a number input\n              // brings spinners, accepts `e` and `-`, and its value is empty\n              // for anything it considers malformed.\n              type=\"text\"\n              inputMode=\"numeric\"\n              autoComplete=\"one-time-code\"\n              // Long enough to accept a full autofilled code in one box.\n              maxLength={length}\n              disabled={isDisabled}\n              aria-label={`Digit ${index + 1} of ${length}`}\n              aria-invalid={isInvalid || undefined}\n              value={filled}\n              onChange={(event) => writeFrom(index, event.target.value)}\n              onKeyDown={(event) => onKeyDown(event, index)}\n              onPaste={(event) => onPaste(event, index)}\n              onFocus={(event) => event.target.select()}\n              className={cx(\n                \"size-12 rounded-2lg text-center font-mono text-title-3-medium tabular-nums\",\n                \"bg-background-primary-default text-text-primary\",\n                \"border border-border-button-default shadow-xs\",\n                \"transition-[background-color,border-color,box-shadow] duration-150 ease outline-none\",\n                \"hover:border-border-button-hover\",\n                \"focus-visible:border-border-focus-ring focus-visible:ring-2 focus-visible:ring-border-focus-ring\",\n                // Red edge as well as the tint. `border-error-default` was\n                // added to theme.css for this: the system had greys only.\n                isInvalid &&\n                  \"border-border-error-default bg-background-tertiary-error text-red-700 dark:text-red-400 hover:border-border-error-default\",\n                isDisabled &&\n                  \"cursor-not-allowed bg-background-primary-disabled text-text-tertiary shadow-none\",\n              )}\n            />\n          </div>\n        );\n      })}\n    </div>\n  );\n}\n",
  "src/board-native/components/base/input/hint-text.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport type { ReactNode, Ref } from \"react\";\nimport type { TextProps as AriaTextProps } from \"react-aria-components\";\nimport { Text as AriaText } from \"react-aria-components\";\nimport { cx } from \"../../../utils/cx.js\";\n\n/**\n * Caption text rendered below a field. Wraps `react-aria-components`' Text\n * so the parent `TextField` automatically wires `aria-describedby` (when\n * `slot=\"description\"`) or `aria-errormessage` (when `slot=\"errorMessage\"`).\n *\n * Visuals come from Figma:\n *   - Inter Medium 12/16, letter-spacing 0.15px\n *   - color text/secondary (default) or text/error-primary (invalid)\n *   - 1px top padding to align with the field's bottom edge\n */\n\nexport interface HintTextProps extends AriaTextProps {\n  children: ReactNode;\n  isInvalid?: boolean;\n  ref?: Ref<HTMLElement>;\n}\n\nexport function HintText({\n  isInvalid = false,\n  className,\n  ...props\n}: HintTextProps) {\n  return (\n    <AriaText\n      slot={isInvalid ? \"errorMessage\" : \"description\"}\n      {...props}\n      className={cx(\n        \"pt-px text-caption-1-medium text-text-secondary\",\n        isInvalid && \"text-text-error-primary\",\n        className,\n      )}\n    />\n  );\n}\n",
  "src/board-native/components/base/input/input.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport {\n  createContext,\n  useContext,\n  type ComponentType,\n  type ReactNode,\n  type Ref,\n} from \"react\";\nimport {\n  Group as AriaGroup,\n  Input as AriaInput,\n  TextField as AriaTextField,\n  useLocale,\n} from \"react-aria-components\";\nimport type {\n  InputProps as AriaInputProps,\n  TextFieldProps as AriaTextFieldProps,\n} from \"react-aria-components\";\nimport { Label } from \"./label.js\";\nimport { HintText } from \"./hint-text.js\";\nimport { cx, sortCx } from \"../../../utils/cx.js\";\n\n/**\n * Figma source: Board UI → Input (node 3665:1849).\n *\n * Architecture (mirrors the Untitled UI / React Aria pattern):\n *\n *   InputBase   — the styled field shell. Renders <AriaGroup> + adornments\n *                 + <AriaInput>. State (hover / focus / disabled / invalid)\n *                 arrives as render-prop booleans from Aria.\n *   TextField   — wraps <AriaTextField> and a TextFieldContext so size /\n *                 classes can flow from the composer down into InputBase\n *                 without prop drilling.\n *   Input       — opinionated composition: TextField → Label → InputBase\n *                 → HintText. The component most consumers use.\n *\n * Why React Aria:\n *   - Label ↔ input ↔ hint association via aria-labelledby / aria-describedby\n *   - aria-required, aria-invalid auto-applied\n *   - Form library / native validation integration\n *   - i18n, RTL, autofill edge cases handled\n *   - Render-prop state surfaces `isFocusWithin`, `isHovered`, `isDisabled`,\n *     `isInvalid`, `isRequired` — no CSS pseudo gymnastics\n *\n * Visuals stay 1:1 with Figma — see `styles/theme.css` for the tokens.\n */\n\nexport type InputSize = \"medium\" | \"small\";\n\ntype IconComponent = ComponentType<{\n  className?: string;\n  \"aria-hidden\"?: boolean | \"true\" | \"false\";\n}>;\n\n/* -------------------------------------------------------------------------- */\n/*  TextFieldContext                                                           */\n/* -------------------------------------------------------------------------- */\n\nexport interface TextFieldContextValue {\n  size?: InputSize;\n  fieldClassName?: string;\n  inputClassName?: string;\n}\n\n/**\n * Shared by every field that wants Input's shell — `Textarea` reads the same\n * size and class overrides out of it, so a composed form stays consistent.\n */\nexport const TextFieldContext = createContext<TextFieldContextValue>({});\n\n/* -------------------------------------------------------------------------- */\n/*  TextField                                                                  */\n/* -------------------------------------------------------------------------- */\n\nexport interface TextFieldProps\n  extends Omit<AriaTextFieldProps, \"className\">,\n    TextFieldContextValue {\n  className?: string;\n  children?: ReactNode | ((state: { isRequired: boolean; isInvalid: boolean; isDisabled: boolean; isReadOnly: boolean }) => ReactNode);\n}\n\nexport function TextField({\n  size = \"medium\",\n  fieldClassName,\n  inputClassName,\n  className,\n  children,\n  ...props\n}: TextFieldProps) {\n  return (\n    <TextFieldContext.Provider value={{ size, fieldClassName, inputClassName }}>\n      <AriaTextField\n        {...props}\n        data-input-size={size}\n        className={cx(\n          \"group flex h-max w-full flex-col items-start gap-1\",\n          className,\n        )}\n      >\n        {children as never /* RAC accepts render-prop children */}\n      </AriaTextField>\n    </TextFieldContext.Provider>\n  );\n}\n\nTextField.displayName = \"TextField\";\n\n/* -------------------------------------------------------------------------- */\n/*  InputBase                                                                  */\n/* -------------------------------------------------------------------------- */\n\nexport interface InputBaseProps extends Omit<AriaInputProps, \"size\" | \"className\"> {\n  size?: InputSize;\n  className?: string;\n  leadingIcon?: IconComponent;\n  trailingIcon?: IconComponent;\n  /** Custom element rendered in the leading slot (Phone basic uses this). */\n  leadingAddon?: ReactNode;\n  /** Class for the field shell. */\n  fieldClassName?: string;\n  /** Ref to the <input> element. */\n  ref?: Ref<HTMLInputElement>;\n  /** Ref to the field shell wrapper. */\n  groupRef?: Ref<HTMLDivElement>;\n}\n\nconst inputStyles = sortCx({\n  field: [\n    \"relative flex w-full items-center\",\n    \"rounded-2lg\",\n    \"bg-background-tertiary-default text-foreground-icon-tertiary\",\n    \"ring-2 ring-inset ring-transparent\",\n    \"transition-[background-color,box-shadow,color] duration-[var(--input-transition-ms)] ease\",\n  ].join(\" \"),\n\n  fieldSize: {\n    medium: \"p-2\",                // 8px all sides → h auto = 36\n    small:  \"h-8 px-1.5 py-2\",    // 32 / 6 / 8\n  },\n\n  // When a leadingAddon is present (Phone basic): tighten left padding.\n  fieldWithAddonSize: {\n    medium: \"h-9 ps-1 pe-2 py-2\", // 36 / 4 / 8 / 8\n    small:  \"h-8 ps-1 pe-1.5 py-2\",\n  },\n\n  content: \"flex w-full items-center gap-2 min-w-0\",\n  leftSection: \"flex flex-1 items-center gap-0.5 min-w-0\",\n\n  input: [\n    \"min-w-0 flex-1 bg-transparent border-0 outline-none p-0 m-0\",\n    \"font-sans text-body-regular text-text-primary\",\n    \"placeholder:text-text-tertiary\",\n    \"focus:placeholder:text-text-primary\",\n    \"disabled:text-input-disabled-text disabled:placeholder:text-input-disabled-text\",\n    \"disabled:cursor-not-allowed\",\n    \"aria-invalid:placeholder:text-text-error-placeholder\",\n  ].join(\" \"),\n\n  icon: \"size-5 shrink-0\",\n});\n\nexport function InputBase({\n  size: sizeProp,\n  leadingIcon: Leading,\n  trailingIcon: Trailing,\n  leadingAddon,\n  fieldClassName,\n  className,\n  ref,\n  groupRef,\n  ...inputProps\n}: InputBaseProps) {\n  const { direction } = useLocale();\n  const ctx = useContext(TextFieldContext);\n  const size: InputSize = sizeProp ?? ctx.size ?? \"medium\";\n  const hasAddon = leadingAddon !== undefined && leadingAddon !== null;\n\n  return (\n    <AriaGroup\n      ref={groupRef}\n      className={({ isFocusWithin, isHovered, isDisabled, isInvalid }) =>\n        cx(\n          inputStyles.field,\n          hasAddon\n            ? inputStyles.fieldWithAddonSize[size]\n            : inputStyles.fieldSize[size],\n          // Hover: idle, no focus, no disabled, no invalid\n          isHovered &&\n            !isFocusWithin &&\n            !isDisabled &&\n            !isInvalid &&\n            \"ring-border-button-hover\",\n          // Focus wins over hover\n          isFocusWithin &&\n            !isDisabled &&\n            !isInvalid &&\n            \"ring-border-button-active\",\n          // Disabled\n          isDisabled &&\n            \"bg-input-disabled-background text-input-disabled-foreground\",\n          // Invalid\n          isInvalid && \"bg-background-tertiary-error text-foreground-icon-error\",\n          ctx.fieldClassName,\n          fieldClassName,\n        )\n      }\n    >\n      <div className={inputStyles.content}>\n        <div className={inputStyles.leftSection}>\n          {hasAddon ? (\n            leadingAddon\n          ) : Leading ? (\n            <Leading className={inputStyles.icon} aria-hidden />\n          ) : null}\n          <AriaInput\n            ref={ref}\n            {...inputProps}\n            // Align to the field's start even when email/URL values use LTR.\n            className={cx(inputStyles.input, direction === \"rtl\" ? \"pr-1 text-right\" : \"pl-1 text-left\", ctx.inputClassName, className)}\n          />\n        </div>\n        {Trailing ? (\n          <Trailing className={inputStyles.icon} aria-hidden />\n        ) : null}\n      </div>\n    </AriaGroup>\n  );\n}\n\nInputBase.displayName = \"InputBase\";\n\n/* -------------------------------------------------------------------------- */\n/*  Input (composed)                                                           */\n/* -------------------------------------------------------------------------- */\n\nexport interface InputProps\n  extends Omit<TextFieldProps, \"children\">,\n    Pick<\n      InputBaseProps,\n      | \"leadingIcon\"\n      | \"trailingIcon\"\n      | \"leadingAddon\"\n      | \"fieldClassName\"\n      | \"groupRef\"\n      | \"ref\"\n    > {\n  label?: ReactNode;\n  hint?: ReactNode;\n  /** Show an info icon next to the label. Replace with tooltip when Tooltip lands. */\n  tooltip?: boolean | string;\n  placeholder?: string;\n  /** Direction of the editable value, independent of the label and adornments.\n   * Email, URL and telephone inputs default to LTR inside RTL forms. */\n  inputDir?: \"ltr\" | \"rtl\" | \"auto\";\n}\n\nexport function Input({\n  label,\n  hint,\n  tooltip,\n  placeholder,\n  inputDir,\n  leadingIcon,\n  trailingIcon,\n  leadingAddon,\n  fieldClassName,\n  ref,\n  groupRef,\n  className,\n  ...textFieldProps\n}: InputProps) {\n  return (\n    <TextField\n      {...textFieldProps}\n      className={className}\n      // Don't clobber an explicit aria-label; fall back to the placeholder\n      // only for unlabelled fields that don't provide one.\n      aria-label={\n        textFieldProps[\"aria-label\"] ??\n        (!label && typeof placeholder === \"string\" ? placeholder : undefined)\n      }\n    >\n      {({ isRequired, isInvalid }) => (\n        <>\n          {label && (\n            <Label\n              isRequired={isRequired}\n              isInvalid={isInvalid}\n              tooltip={tooltip}\n            >\n              {label}\n            </Label>\n          )}\n          <InputBase\n            dir={inputDir ?? ([\"email\", \"url\", \"tel\"].includes(textFieldProps.type ?? \"\") ? \"ltr\" : undefined)}\n            ref={ref}\n            groupRef={groupRef}\n            placeholder={placeholder}\n            leadingIcon={leadingIcon}\n            trailingIcon={trailingIcon}\n            leadingAddon={leadingAddon}\n            fieldClassName={fieldClassName}\n          />\n          {hint && <HintText isInvalid={isInvalid}>{hint}</HintText>}\n        </>\n      )}\n    </TextField>\n  );\n}\n\nInput.displayName = \"Input\";\n",
  "src/board-native/components/base/input/label.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport type { ReactNode, Ref } from \"react\";\nimport { RiInformationFill } from \"@remixicon/react\";\nimport type { LabelProps as AriaLabelProps } from \"react-aria-components\";\nimport { Label as AriaLabel } from \"react-aria-components\";\nimport { cx } from \"../../../utils/cx.js\";\n\n/**\n * Field label. Wraps `react-aria-components`' Label so the parent `TextField`\n * automatically wires `htmlFor` / `aria-labelledby`.\n *\n * Visuals come from Figma:\n *   - Inter Medium 14/20, color text/primary\n *   - 2px gap between label + required asterisk + info icon\n *   - asterisk is text/error-primary (red/500)\n *   - info icon is 16×16 in foreground/icon/quaternary\n *\n * Pass `isRequired` to show the asterisk. Pass `tooltip` to show the info\n * icon (currently a static glyph — when the Tooltip component lands it'll\n * wire up here).\n */\n\nexport interface LabelProps extends AriaLabelProps {\n  children: ReactNode;\n  isRequired?: boolean;\n  /** Reserved for invalid-aware styling (asterisk color, etc.) once we need it. */\n  isInvalid?: boolean;\n  /** Show the info icon next to the label. */\n  tooltip?: boolean | string;\n  ref?: Ref<HTMLLabelElement>;\n}\n\nexport function Label({\n  isRequired = false,\n  isInvalid: _isInvalid,\n  tooltip,\n  className,\n  children,\n  ...props\n}: LabelProps) {\n  void _isInvalid;\n  return (\n    <AriaLabel\n      data-label=\"true\"\n      {...props}\n      className={cx(\n        \"flex cursor-default items-center gap-0.5\",\n        \"text-body-medium text-text-primary\",\n        className,\n      )}\n    >\n      {children}\n      {isRequired && (\n        <span\n          aria-hidden=\"true\"\n          className=\"text-body-medium text-text-error-primary\"\n        >\n          *\n        </span>\n      )}\n      {tooltip && (\n        <RiInformationFill\n          className=\"size-4 shrink-0 text-foreground-icon-quaternary\"\n          aria-hidden\n        />\n      )}\n    </AriaLabel>\n  );\n}\n",
  "src/board-native/components/base/kbd/kbd.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\nimport type { HTMLAttributes, Ref } from \"react\";\nimport { cx } from \"../../../utils/cx.js\";\n\n/**\n * Figma source: Board UI → dashboard 1 quick-search shortcut (node 3731:2955).\n *\n * Keyboard shortcut hint: 12/16 semibold on a fully-rounded neutral pill.\n *   - semantic neutral background and foreground for theme-safe contrast\n *   - px 4, py 2, radius full\n */\n\nexport interface KbdProps extends HTMLAttributes<HTMLElement> {\n  ref?: Ref<HTMLElement>;\n}\n\nexport function Kbd({ className, ref, ...props }: KbdProps) {\n  return (\n    <kbd\n      ref={ref}\n      className={cx(\n        \"inline-flex items-center justify-center rounded-full bg-kbd-background px-1 py-0.5 font-sans text-caption-1-semibold tracking-normal whitespace-nowrap text-kbd-foreground\",\n        className,\n      )}\n      {...props}\n    />\n  );\n}\n",
  "src/board-native/components/base/notification/notification.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { useDirection } from \"../../foundations/direction/direction.js\";\nimport type {\n  ComponentType,\n  HTMLAttributes,\n  ReactNode,\n  Ref,\n} from \"react\";\nimport {\n  Children,\n  isValidElement,\n  useEffect,\n  useState,\n  useSyncExternalStore,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useNativeEnvironment } from \"../../../NativeEnvironment.js\";\nimport {\n  RiCheckboxCircleFill,\n  RiErrorWarningFill,\n  RiInformationFill,\n  RiNotification3Fill,\n} from \"@remixicon/react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { Avatar, type AvatarProps } from \"../avatar/avatar.js\";\nimport { Button, type ButtonProps } from \"../buttons/button.js\";\nimport { CloseButton } from \"../buttons/close-button.js\";\nimport { cx, sortCx } from \"../../../utils/cx.js\";\n\nexport type NotificationStatus = \"neutral\" | \"information\" | \"success\" | \"error\";\n\nexport type NotificationPosition =\n  | \"top-start\"\n  | \"top-end\"\n  | \"bottom-start\"\n  | \"bottom-end\"\n  | \"top-left\"\n  | \"top-center\"\n  | \"top-right\"\n  | \"bottom-left\"\n  | \"bottom-center\"\n  | \"bottom-right\";\n\ntype IconComponent = ComponentType<{\n  className?: string;\n  \"aria-hidden\"?: boolean | \"true\" | \"false\";\n}>;\n\nexport type NotificationAvatar = Omit<AvatarProps, \"size\"> & {\n  presence?: \"online\" | \"busy\" | \"offline\";\n};\n\nexport type NotificationAction = {\n  label: ReactNode;\n  onClick?: () => void;\n  variant?: ButtonProps[\"variant\"];\n};\n\nexport interface NotificationProps\n  extends Omit<\n    HTMLAttributes<HTMLDivElement>,\n    | \"title\"\n    | \"onDrag\"\n    | \"onDragStart\"\n    | \"onDragEnd\"\n    | \"onAnimationStart\"\n    | \"onAnimationEnd\"\n  > {\n  title: ReactNode;\n  description?: ReactNode;\n  timestamp?: ReactNode;\n  status?: NotificationStatus;\n  /** Custom leading icon. Defaults to the icon associated with `status`. */\n  icon?: IconComponent;\n  /** Avatar leading visual. When set, it takes precedence over `icon`. */\n  avatar?: NotificationAvatar;\n  /** Optional small BoardUI action buttons rendered below the message. */\n  actions?: NotificationAction[];\n  dismissible?: boolean;\n  closeLabel?: string;\n  /** Called after the dismiss animation completes. */\n  onDismiss?: () => void;\n  /**\n   * Automatically dismiss after this many milliseconds. A 3px blue countdown\n   * bar is rendered along the full bottom edge for the same duration.\n   */\n  autoDismissDuration?: number;\n  /** Optional entrance delay in seconds. */\n  introDelay?: number;\n  ref?: Ref<HTMLDivElement>;\n}\n\nexport interface NotificationViewportProps\n  extends Omit<\n    HTMLAttributes<HTMLDivElement>,\n    | \"children\"\n    | \"onDrag\"\n    | \"onDragStart\"\n    | \"onDragEnd\"\n    | \"onAnimationStart\"\n    | \"onAnimationEnd\"\n  > {\n  children?: ReactNode;\n  /** Edge or corner where the notification stack is anchored. */\n  position?: NotificationPosition;\n  /** @deprecated Use `position` instead. */\n  placement?: Extract<NotificationPosition, \"bottom-left\" | \"bottom-right\">;\n}\n\nconst STATUS_ICON: Record<NotificationStatus, IconComponent> = {\n  neutral: RiNotification3Fill,\n  information: RiInformationFill,\n  success: RiCheckboxCircleFill,\n  error: RiErrorWarningFill,\n};\n\nconst styles = sortCx({\n  card: [\n    \"relative flex w-full items-start gap-3 overflow-hidden p-4 pe-11\",\n    \"rounded-2xl border border-border-button-default\",\n    \"bg-background-primary-default shadow-dropdown\",\n  ].join(\" \"),\n  visual: \"relative flex size-10 shrink-0 items-center justify-center rounded-full\",\n  icon: \"size-5\",\n  content: \"flex min-w-0 flex-1 flex-col gap-1\",\n  header: \"flex min-w-0 flex-wrap items-baseline gap-x-2 gap-y-0.5\",\n  title: \"text-body-medium text-text-primary\",\n  timestamp: \"text-body-regular text-text-tertiary\",\n  description: \"text-body-regular text-text-secondary\",\n  actions: \"mt-1.5 flex flex-wrap items-center gap-2\",\n  close: \"absolute top-3 end-3\",\n  status: {\n    neutral: \"bg-background-tertiary-default text-text-secondary\",\n    information:\n      \"bg-notification-information-background text-notification-information-foreground\",\n    success:\n      \"bg-notification-success-background text-notification-success-foreground\",\n    error:\n      \"bg-notification-error-background text-notification-error-foreground\",\n  },\n  presence: {\n    online: \"bg-lime-500\",\n    busy: \"bg-rose-500\",\n    offline: \"bg-background-quaternary-hover\",\n  },\n});\n\nconst VIEWPORT_POSITION = {\n  \"top-start\": \"top-3 start-3 items-start sm:top-6 sm:start-6\",\n  \"top-end\": \"top-3 end-3 items-end sm:top-6 sm:end-6\",\n  \"bottom-start\": \"bottom-3 start-3 items-start sm:bottom-6 sm:start-6\",\n  \"bottom-end\": \"end-3 bottom-3 items-end sm:end-6 sm:bottom-6\",\n  \"top-left\": \"top-3 left-3 items-start sm:top-6 sm:left-6\",\n  \"top-center\": \"top-3 left-1/2 -translate-x-1/2 items-center sm:top-6\",\n  \"top-right\": \"top-3 right-3 items-end sm:top-6 sm:right-6\",\n  \"bottom-left\": \"bottom-3 left-3 items-start sm:bottom-6 sm:left-6\",\n  \"bottom-center\":\n    \"bottom-3 left-1/2 -translate-x-1/2 items-center sm:bottom-6\",\n  \"bottom-right\": \"right-3 bottom-3 items-end sm:right-6 sm:bottom-6\",\n} satisfies Record<NotificationPosition, string>;\n\nconst subscribeToHydration = () => () => {};\n\nfunction NotificationAvatarVisual({\n  presence,\n  className,\n  ...avatar\n}: NotificationAvatar) {\n  return (\n    <span className=\"relative shrink-0\">\n      <Avatar\n        {...avatar}\n        size=\"lg\"\n        className={cx(\"size-10\", className)}\n      />\n      {presence ? (\n        <span\n          aria-hidden\n          className={cx(\n            \"absolute end-0 bottom-0 size-3 rounded-full border-2 border-background-primary-default\",\n            styles.presence[presence],\n          )}\n        />\n      ) : null}\n    </span>\n  );\n}\n\nexport function Notification({\n  title,\n  description,\n  timestamp,\n  status = \"neutral\",\n  icon,\n  avatar,\n  actions,\n  dismissible = true,\n  closeLabel = \"Dismiss notification\",\n  onDismiss,\n  autoDismissDuration,\n  introDelay,\n  className,\n  ref,\n  role,\n  ...props\n}: NotificationProps) {\n  const [dismissed, setDismissed] = useState(false);\n  const Icon = icon ?? STATUS_ICON[status];\n  const hasIntro = introDelay !== undefined;\n  const introDelayMs = (introDelay ?? 0) * 1000;\n\n  useEffect(() => {\n    if (!autoDismissDuration || autoDismissDuration <= 0) return;\n    const timer = window.setTimeout(\n      () => setDismissed(true),\n      autoDismissDuration + introDelayMs,\n    );\n    return () => window.clearTimeout(timer);\n  }, [autoDismissDuration, introDelayMs]);\n\n  return (\n    <AnimatePresence onExitComplete={onDismiss}>\n      {!dismissed ? (\n        <motion.div\n          ref={ref}\n          role={role ?? (status === \"error\" ? \"alert\" : \"status\")}\n          initial={\n            hasIntro\n              ? { opacity: 0, y: 12, scale: 0.97, filter: \"blur(4px)\" }\n              : false\n          }\n          animate={\n            hasIntro\n              ? {\n                  opacity: 1,\n                  y: 0,\n                  scale: 1,\n                  filter: \"blur(0px)\",\n                  transition: {\n                    duration: 0.25,\n                    delay: introDelay,\n                    ease: \"easeOut\",\n                  },\n                }\n              : undefined\n          }\n          exit={{\n            opacity: 0,\n            y: 8,\n            scale: 0.96,\n            filter: \"blur(3px)\",\n            transition: { duration: 0.18, ease: \"easeOut\" },\n          }}\n          className={cx(styles.card, className)}\n          {...props}\n        >\n          {avatar ? (\n            <NotificationAvatarVisual {...avatar} />\n          ) : (\n            <span className={cx(styles.visual, styles.status[status])}>\n              <Icon className={styles.icon} aria-hidden />\n            </span>\n          )}\n\n          <div className={styles.content}>\n            <div className={styles.header}>\n              <p className={styles.title}>{title}</p>\n              {timestamp ? <span className={styles.timestamp}>{timestamp}</span> : null}\n            </div>\n            {description ? <p className={styles.description}>{description}</p> : null}\n\n            {actions?.length ? (\n              <div className={styles.actions}>\n                {actions.map((action, index) => (\n                  <Button\n                    key={index}\n                    size=\"small\"\n                    variant={action.variant ?? (index === 0 ? \"secondary\" : \"primary\")}\n                    onClick={action.onClick}\n                  >\n                    {action.label}\n                  </Button>\n                ))}\n              </div>\n            ) : null}\n          </div>\n\n          {dismissible ? (\n            <CloseButton\n              size=\"xs\"\n              aria-label={closeLabel}\n              onClick={() => setDismissed(true)}\n              className={styles.close}\n            />\n          ) : null}\n\n          {autoDismissDuration && autoDismissDuration > 0 ? (\n            <motion.span\n              aria-hidden\n              className=\"absolute inset-x-0 bottom-0 h-[3px] origin-left rtl:origin-right bg-accent-600\"\n              initial={{ scaleX: 1 }}\n              animate={{ scaleX: 0 }}\n              transition={{\n                duration: autoDismissDuration / 1000,\n                delay: introDelay,\n                ease: \"linear\",\n              }}\n            />\n          ) : null}\n        </motion.div>\n      ) : null}\n    </AnimatePresence>\n  );\n}\n\n/**\n * Viewport-level notification region. Anchor the stack to any corner or\n * horizontal center with `position`; children with stable keys move smoothly\n * as notifications enter and leave.\n */\nexport function NotificationViewport({\n  children,\n  position,\n  placement,\n  className,\n  \"aria-label\": ariaLabel = \"Notifications\",\n  ...props\n}: NotificationViewportProps) {\n  const direction = useDirection();\n  const environment = useNativeEnvironment();\n  const resolvedPosition = position ?? placement ?? \"bottom-end\";\n  const mounted = useSyncExternalStore(\n    subscribeToHydration,\n    () => true,\n    () => false,\n  );\n\n  if (!mounted || typeof document === \"undefined\") return null;\n\n  const container = environment?.portalContainer() ?? document.body;\n  return createPortal(\n    <div className=\"bn-source\" style={{ display: \"contents\" }}><motion.div\n      role=\"group\"\n      layoutRoot\n      dir={direction}\n      aria-label={ariaLabel}\n      className={cx(\n        \"pointer-events-none fixed z-100 flex w-[min(400px,calc(100vw-24px))] flex-col gap-3\",\n        VIEWPORT_POSITION[resolvedPosition],\n        className,\n      )}\n      {...props}\n    >\n      <AnimatePresence initial={false} mode=\"popLayout\">\n        {Children.toArray(children).map((child, index) => (\n          <motion.div\n            layout\n            key={isValidElement(child) && child.key !== null ? child.key : index}\n            className=\"pointer-events-auto w-full\"\n            transition={{\n              layout: {\n                type: \"spring\",\n                stiffness: 520,\n                damping: 42,\n                mass: 0.7,\n              },\n            }}\n          >\n            {child}\n          </motion.div>\n        ))}\n      </AnimatePresence>\n    </motion.div></div>,\n    container,\n  );\n}\n",
  "src/board-native/components/base/pagination/pagination.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { useTemplateCopy } from \"../../foundations/template-copy/template-copy.js\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { RiArrowLeftLine, RiArrowRightLine } from \"@remixicon/react\";\nimport { Button } from \"../buttons/button.js\";\nimport { cx } from \"../../../utils/cx.js\";\n\n/**\n * Pagination — designed to match the Board UI dashboard style (no dedicated\n * Figma frame yet, so it reuses shipped tokens/components):\n *   - Previous / Next use the secondary small `Button` (same as the Recent\n *     hires card pager) with arrow icons.\n *   - Page numbers are 32×32 (radius/lg) cells. Active cell borrows the\n *     secondary-button surface (white + border/button/default + shadow/xs);\n *     inactive cells are ghost with a secondary-hover background on hover.\n *   - Overflow collapses to leading/trailing dots around a sibling window.\n *\n * Below `COMPACT_WIDTH`, a `ResizeObserver` on the nav switches to a compact\n * layout — icon-only Previous/Next and `siblingCount` clamped to 0 — so the\n * row never overflows a narrow container instead of clipping mid-label.\n *\n * Controlled: pass `page`, `totalPages`, and `onChange`.\n */\n\nexport interface PaginationProps {\n  page: number;\n  totalPages: number;\n  onChange: (page: number) => void;\n  /** Page numbers shown on each side of the current page. Default 1. */\n  siblingCount?: number;\n  className?: string;\n  /** Visible and accessible navigation labels for the application's locale. */\n  previousLabel?: string;\n  nextLabel?: string;\n  \"aria-label\"?: string;\n}\n\nconst DOTS = \"dots\";\n\nfunction range(start: number, end: number): number[] {\n  return Array.from({ length: end - start + 1 }, (_, i) => start + i);\n}\n\nfunction paginationRange(\n  current: number,\n  total: number,\n  sibling: number,\n): (number | typeof DOTS)[] {\n  // first + last + current + 2*sibling + 2 dots\n  const totalPageNumbers = sibling * 2 + 5;\n  if (totalPageNumbers >= total) return range(1, total);\n\n  const leftSibling = Math.max(current - sibling, 1);\n  const rightSibling = Math.min(current + sibling, total);\n  const showLeftDots = leftSibling > 2;\n  const showRightDots = rightSibling < total - 2;\n\n  if (!showLeftDots && showRightDots) {\n    return [...range(1, 3 + 2 * sibling), DOTS, total];\n  }\n  if (showLeftDots && !showRightDots) {\n    return [1, DOTS, ...range(total - (2 + 2 * sibling), total)];\n  }\n  return [1, DOTS, ...range(leftSibling, rightSibling), DOTS, total];\n}\n\n// No transition on the cells: animating background/shadow/color makes the\n// previously-active number visibly fade out (\"flicker\") on every page change.\nconst cell = \"flex size-8 shrink-0 items-center justify-center rounded-lg text-body-medium\";\n\n/** Below this nav width, Previous/Next drop their labels and siblingCount\n *  clamps to 0 — the full-label, full-sibling layout starts clipping\n *  somewhere around 380–420px depending on totalPages' digit count. */\nconst COMPACT_WIDTH = 420;\n\nfunction useIsCompact() {\n  const ref = useRef<HTMLElement>(null);\n  const [isCompact, setIsCompact] = useState(false);\n\n  useEffect(() => {\n    const el = ref.current;\n    if (!el) return;\n    const observer = new ResizeObserver(([entry]) => {\n      setIsCompact(entry.contentRect.width < COMPACT_WIDTH);\n    });\n    observer.observe(el);\n    return () => observer.disconnect();\n  }, []);\n\n  return [ref, isCompact] as const;\n}\n\nexport function Pagination({\n  page,\n  totalPages,\n  onChange,\n  siblingCount = 1,\n  className,\n  previousLabel = \"Previous\",\n  nextLabel = \"Next\",\n  \"aria-label\": ariaLabel = \"Pagination\",\n}: PaginationProps) {\n  const localize = useTemplateCopy();\n  const [navRef, isCompact] = useIsCompact();\n  if (totalPages <= 1) return null;\n  const pages = paginationRange(page, totalPages, isCompact ? 0 : siblingCount);\n\n  return localize((\n    <nav\n      ref={navRef}\n      aria-label={ariaLabel}\n      className={cx(\"flex w-full items-center justify-between gap-2\", className)}\n    >\n      <Button\n        variant=\"secondary\"\n        size=\"small\"\n        iconOnly={isCompact}\n        leadingIcon={RiArrowLeftLine}\n        aria-label={isCompact ? previousLabel : undefined}\n        disabled={page <= 1}\n        onClick={() => onChange(page - 1)}\n      >\n        {isCompact ? undefined : previousLabel}\n      </Button>\n\n      <ul className=\"flex min-w-0 items-center gap-0.5\">\n        {pages.map((item, i) =>\n          item === DOTS ? (\n            <li\n              key={`dots-${i}`}\n              aria-hidden\n              className={cx(cell, \"text-text-tertiary\")}\n            >\n              …\n            </li>\n          ) : (\n            <li key={item}>\n              <button\n                type=\"button\"\n                aria-label={`Go to page ${item}`}\n                aria-current={item === page ? \"page\" : undefined}\n                onClick={() => onChange(item)}\n                className={cx(\n                  cell,\n                  \"cursor-pointer outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-border-focus-ring\",\n                  item === page\n                    ? \"border border-border-button-default bg-background-primary-default text-text-primary shadow-xs\"\n                    : \"text-text-secondary hover:bg-background-secondary-hover hover:text-text-primary\",\n                )}\n              >\n                {item}\n              </button>\n            </li>\n          ),\n        )}\n      </ul>\n\n      <Button\n        variant=\"secondary\"\n        size=\"small\"\n        iconOnly={isCompact}\n        leadingIcon={isCompact ? RiArrowRightLine : undefined}\n        trailingIcon={isCompact ? undefined : RiArrowRightLine}\n        aria-label={isCompact ? nextLabel : undefined}\n        disabled={page >= totalPages}\n        onClick={() => onChange(page + 1)}\n      >\n        {isCompact ? undefined : nextLabel}\n      </Button>\n    </nav>\n  ));\n}\n",
  "src/board-native/components/base/radio/radio-card.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport type { ReactNode, Ref } from \"react\";\nimport { Radio as AriaRadio } from \"react-aria-components\";\nimport type { RadioProps as AriaRadioProps } from \"react-aria-components\";\nimport { cx } from \"../../../utils/cx.js\";\nimport { RadioDot } from \"./radio.js\";\n\n/**\n * Selectable radio card — the radio flavor of CheckboxCard (Figma checkbox\n * items, node 3793:2966): title + optional description on the left, the\n * radio dot on the right.\n *   card    radius/2lg (10px), 1px border/button/default, pl 16 pr 20 py 12\n *   hover   bg background/primary/hover (#f7f7f7)\n *   title   Body 1/Medium, text/primary\n *   desc    Body 1/Regular, text/secondary\n *\n * The whole card selects the radio (react-aria Radio renders the label).\n * Must live inside a `RadioGroup`, which provides single-selection and\n * arrow-key navigation across cards.\n */\n\nexport interface RadioCardProps extends Omit<AriaRadioProps, \"children\"> {\n  title: ReactNode;\n  description?: ReactNode;\n  ref?: Ref<HTMLLabelElement>;\n}\n\nexport function RadioCard({ className, title, description, ref, ...props }: RadioCardProps) {\n  return (\n    <AriaRadio\n      ref={ref}\n      {...props}\n      className={(state) =>\n        cx(\n          \"relative group flex w-full items-center justify-between gap-3 rounded-2lg border border-border-button-default py-3 pe-5 ps-4 select-none\",\n          \"transition-colors duration-150 ease\",\n          state.isHovered && !state.isDisabled\n            ? \"bg-background-primary-hover\"\n            : \"bg-background-primary-default\",\n          state.isDisabled ? \"cursor-not-allowed opacity-50\" : \"cursor-pointer\",\n          typeof className === \"function\" ? className(state) : className,\n        )\n      }\n    >\n      {(state) => (\n        <>\n          <span className=\"flex min-w-0 flex-col gap-0.5\">\n            <span className=\"truncate text-body-medium text-text-primary\">{title}</span>\n            {description !== undefined && description !== null && (\n              <span className=\"truncate text-body-regular text-text-secondary\">{description}</span>\n            )}\n          </span>\n          <span className=\"flex shrink-0 items-center py-1\">\n            <RadioDot size=\"md\" selected={state.isSelected} focusVisible={state.isFocusVisible} />\n          </span>\n        </>\n      )}\n    </AriaRadio>\n  );\n}\n",
  "src/board-native/components/base/radio/radio.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport type { ReactNode, Ref } from \"react\";\nimport {\n  Radio as AriaRadio,\n  RadioGroup as AriaRadioGroup,\n} from \"react-aria-components\";\nimport type {\n  RadioGroupProps as AriaRadioGroupProps,\n  RadioProps as AriaRadioProps,\n} from \"react-aria-components\";\nimport { cx } from \"../../../utils/cx.js\";\n\n/**\n * Figma source: Board UI → radio_default_sm / radio_selected_sm (used in the\n * AI chat model picker, node 4035:6925) and the checkbox family tokens.\n *\n * Two sizes:\n *   md  16×16 dot, 6px inner, label Body 1/Medium (14)\n *   sm  14×14 dot, 5px inner, label Body 2/Medium (13)\n *\n * States:\n *   default   bg background/primary/default, 1px border/checkbox/default,\n *             shadow/xs\n *   selected  Button/Primary gradient (blue/500 → blue/600) with an inset\n *             blue ring + top highlight, white inner dot\n *   disabled  50% opacity, not-allowed cursor\n *\n * `RadioGroup` + `Radio` are built on React Aria (keyboard arrows, form\n * semantics, label association). The bare `RadioDot` glyph is also exported\n * for menu rows that manage selection themselves (e.g. Dropdown items acting\n * as a radio group), where a nested focusable radio would be invalid.\n */\n\nexport type RadioSize = \"sm\" | \"md\";\n\nconst dotStyles = {\n  sm: {\n    dot: \"size-3.5\",\n    inner: \"size-[5px]\",\n    selected:\n      \"bg-gradient-to-b from-accent-500 to-accent-600 shadow-[inset_0px_0px_0px_0.875px_var(--color-accent-500),inset_0px_1.75px_0px_0px_rgba(255,255,255,0.25)]\",\n    border: \"border-[0.875px]\",\n    gap: \"gap-2\",\n    label: \"text-body-2-medium\",\n  },\n  md: {\n    dot: \"size-4\",\n    inner: \"size-1.5\",\n    selected:\n      \"bg-gradient-to-b from-accent-500 to-accent-600 shadow-[inset_0px_0px_0px_1px_var(--color-accent-500),inset_0px_2px_0px_0px_rgba(255,255,255,0.25)]\",\n    border: \"border\",\n    gap: \"gap-2\",\n    label: \"text-body-medium\",\n  },\n};\n\nexport interface RadioDotProps {\n  selected?: boolean;\n  size?: RadioSize;\n  /** Draws the keyboard focus ring around the glyph. */\n  focusVisible?: boolean;\n  className?: string;\n}\n\n/**\n * The bare radio glyph — presentation only, no interaction or semantics.\n *\n * Select/deselect animates: the default bordered surface and the selected\n * gradient are stacked layers cross-fading over 200ms (a gradient background\n * can't transition directly), while the white inner dot scales in and out.\n */\nexport function RadioDot({ selected = false, size = \"sm\", focusVisible = false, className }: RadioDotProps) {\n  const s = dotStyles[size];\n  return (\n    <span\n      aria-hidden\n      className={cx(\n        \"relative flex shrink-0 items-center justify-center rounded-full\",\n        s.dot,\n        focusVisible && \"ring-2 ring-border-focus-ring ring-offset-2\",\n        className,\n      )}\n    >\n      {/* Default surface */}\n      <span\n        className={cx(\n          \"absolute inset-0 rounded-full border-border-checkbox-default bg-background-primary-default shadow-xs\",\n          \"transition-opacity duration-200 ease\",\n          s.border,\n          selected && \"opacity-0\",\n        )}\n      />\n      {/* Selected gradient surface */}\n      <span\n        className={cx(\n          \"absolute inset-0 rounded-full\",\n          \"transition-opacity duration-200 ease\",\n          s.selected,\n          !selected && \"opacity-0\",\n        )}\n      />\n      {/* Inner dot: absolutely centered (flex centering of fractional sizes can\n          land on subpixels) and no drop shadow — a downward shadow makes the\n          dot read as sitting below center. */}\n      <span\n        className={cx(\n          \"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-control-indicator-background\",\n          \"transition-[scale,opacity] duration-200 ease\",\n          s.inner,\n          selected ? \"scale-100 opacity-100\" : \"scale-0 opacity-0\",\n        )}\n      />\n    </span>\n  );\n}\n\n/* ------------------------------------------------------------------- group */\n\nexport interface RadioGroupProps extends Omit<AriaRadioGroupProps, \"children\"> {\n  children?: ReactNode;\n  ref?: Ref<HTMLDivElement>;\n}\n\n/** Wraps a set of Radios: arrow-key navigation, single selection, form value. */\nexport function RadioGroup({ className, children, ref, ...props }: RadioGroupProps) {\n  return (\n    <AriaRadioGroup\n      ref={ref}\n      {...props}\n      className={(state) =>\n        cx(\n          \"flex flex-col gap-2\",\n          typeof className === \"function\" ? className(state) : className,\n        )\n      }\n    >\n      {children}\n    </AriaRadioGroup>\n  );\n}\n\n/* ------------------------------------------------------------------- radio */\n\nexport interface RadioProps extends Omit<AriaRadioProps, \"children\"> {\n  children?: ReactNode;\n  size?: RadioSize;\n  ref?: Ref<HTMLLabelElement>;\n}\n\nexport function Radio({ className, children, size = \"md\", ref, ...props }: RadioProps) {\n  const s = dotStyles[size];\n\n  return (\n    <AriaRadio\n      ref={ref}\n      {...props}\n      className={(state) =>\n        cx(\n          \"relative group inline-flex items-center select-none\",\n          s.gap,\n          state.isDisabled ? \"cursor-not-allowed opacity-50\" : \"cursor-pointer\",\n          typeof className === \"function\" ? className(state) : className,\n        )\n      }\n    >\n      {(state) => (\n        <>\n          <RadioDot selected={state.isSelected} size={size} focusVisible={state.isFocusVisible} />\n          {children !== undefined && children !== null && (\n            <span className={cx(s.label, \"text-text-primary\")}>{children}</span>\n          )}\n        </>\n      )}\n    </AriaRadio>\n  );\n}\n",
  "src/board-native/components/base/segmented-control/segmented-control.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { useDirection } from \"../../foundations/direction/direction.js\";\nimport { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport type { ReactNode, Ref } from \"react\";\nimport {\n  ToggleButton as AriaToggleButton,\n  ToggleButtonGroup as AriaToggleButtonGroup,\n} from \"react-aria-components\";\nimport type {\n  ToggleButtonGroupProps as AriaToggleButtonGroupProps,\n  ToggleButtonProps as AriaToggleButtonProps,\n} from \"react-aria-components\";\nimport { cx } from \"../../../utils/cx.js\";\n\nconst useIsomorphicLayoutEffect = typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n\n/**\n * Figma source: Board UI → dashboard 1 Weekly/Monthly/Yearly switch\n * (node 3731:3096).\n *\n * Single-select segmented control.\n *   track    bg background/tertiary/default, p 4, radius 10 (radius/2lg), gap 2\n *   segment  px 10, py 4, radius/md (6px)\n *     selected    bg segmented-control/selected (white in light), shadow/2xs, Body 1/Medium,\n *                 text/primary\n *     unselected  transparent, Body 1/Regular, text/secondary\n *\n * Built on react-aria ToggleButtonGroup with single selection that can't be\n * emptied — arrow keys move focus, Space/Enter selects.\n */\n\n/**\n * `solid` (default) is the Figma design — tertiary track, white thumb behind\n * the selected segment. `plain` drops the track background and the thumb; the\n * selected segment reads only through its text weight/color.\n */\nexport type SegmentedControlVariant = \"solid\" | \"plain\";\n\nexport interface SegmentedControlProps\n  extends Omit<AriaToggleButtonGroupProps, \"selectionMode\" | \"disallowEmptySelection\"> {\n  children?: ReactNode;\n  variant?: SegmentedControlVariant;\n  ref?: Ref<HTMLDivElement>;\n}\n\ntype Thumb = { left: number; top: number; width: number; height: number };\n\nexport function SegmentedControl({ className, children, variant = \"solid\", ref, ...props }: SegmentedControlProps) {\n  const direction = useDirection();\n  const innerRef = useRef<HTMLDivElement>(null);\n  const [thumb, setThumb] = useState<Thumb | null>(null);\n\n  useIsomorphicLayoutEffect(() => {\n    const el = innerRef.current;\n    if (!el) return;\n    const measure = () => {\n      const selected = el.querySelector<HTMLElement>(\"[data-selected]\");\n      if (selected) {\n        setThumb({\n          left: selected.offsetLeft,\n          top: selected.offsetTop,\n          width: selected.offsetWidth,\n          height: selected.offsetHeight,\n        });\n      }\n    };\n    measure();\n    const ro = new ResizeObserver(measure);\n    ro.observe(el);\n    const observeItems = () => el.querySelectorAll(\"button\").forEach(item => ro.observe(item));\n    observeItems();\n    const mo = new MutationObserver(() => { observeItems(); measure(); });\n    mo.observe(el, { attributes: true, childList: true, characterData: true, subtree: true, attributeFilter: [\"data-selected\"] });\n    return () => {\n      mo.disconnect();\n      ro.disconnect();\n    };\n  }, [direction]);\n\n  const setRefs = (node: HTMLDivElement | null) => {\n    innerRef.current = node;\n    if (typeof ref === \"function\") ref(node);\n    else if (ref) (ref as { current: HTMLDivElement | null }).current = node;\n  };\n\n  return (\n    <AriaToggleButtonGroup\n      ref={setRefs}\n      selectionMode=\"single\"\n      disallowEmptySelection\n      {...props}\n      className={(state) =>\n        cx(\n          \"relative inline-flex items-start gap-0.5 rounded-2lg\",\n          variant === \"solid\" && \"bg-segmented-control-background p-1\",\n          typeof className === \"function\" ? className(state) : className,\n        )\n      }\n    >\n      {variant === \"solid\" && thumb && (\n        <span\n          aria-hidden\n          className=\"pointer-events-none absolute left-0 top-0 rounded-md bg-segmented-control-selected-background shadow-2xs transition-[transform,width,height] duration-200 ease\"\n          style={{\n            transform: `translate(${thumb.left}px, ${thumb.top}px)`,\n            width: thumb.width,\n            height: thumb.height,\n          }}\n        />\n      )}\n      {children}\n    </AriaToggleButtonGroup>\n  );\n}\n\nexport interface SegmentedControlItemProps extends Omit<AriaToggleButtonProps, \"children\"> {\n  children?: ReactNode;\n  ref?: Ref<HTMLButtonElement>;\n}\n\nexport function SegmentedControlItem({\n  className,\n  children,\n  ref,\n  ...props\n}: SegmentedControlItemProps) {\n  return (\n    <AriaToggleButton\n      ref={ref}\n      {...props}\n      className={(state) =>\n        cx(\n          \"relative z-10 inline-flex cursor-pointer items-center justify-center rounded-md px-2.5 py-1 text-center whitespace-nowrap\",\n          \"transition-colors duration-200 ease\",\n          \"outline-none focus-visible:ring-2 focus-visible:ring-border-focus-ring\",\n          state.isSelected\n            ? \"text-body-medium text-text-primary\"\n            : \"text-body-regular text-text-secondary hover:text-text-primary\",\n          state.isDisabled && \"cursor-not-allowed opacity-50\",\n          typeof className === \"function\" ? className(state) : className,\n        )\n      }\n    >\n      {children}\n    </AriaToggleButton>\n  );\n}\n",
  "src/board-native/components/base/select/select.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { createContext, useCallback, useContext, useRef, useState } from \"react\";\nimport type { ReactNode, Ref } from \"react\";\nimport {\n  Button as AriaButton,\n  ListBox as AriaListBox,\n  ListBoxItem as AriaListBoxItem,\n  Popover as AriaPopover,\n  Select as AriaSelect,\n  SelectValue as AriaSelectValue,\n} from \"react-aria-components\";\nimport type {\n  ListBoxItemProps as AriaListBoxItemProps,\n  SelectProps as AriaSelectProps,\n  SelectValueRenderProps as AriaSelectValueRenderProps,\n} from \"react-aria-components\";\nimport {\n  MENU_ITEM,\n  MENU_ITEM_ACTIVE,\n  MENU_ITEMS_CONTAINER,\n  MENU_POPOVER_SURFACE,\n  MENU_POPOVER_WIDTH,\n} from \"../dropdown/menu-styles.js\";\nimport { ChevronDownSmall } from \"../../foundations/icons/chevrons.js\";\nimport { cx } from \"../../../utils/cx.js\";\nimport { useDismissOnOutsidePress, useTriggerToggle } from \"../../../utils/use-dismiss-on-outside-press.js\";\n\n/**\n * Figma source: Board UI → dashboard 1 dropdown triggers (\"All prices\" filter\n * node 3731:3208, table status dropdown node 3731:3264).\n *\n * Select with a button trigger styled 1:1 with Figma:\n *   trigger  bg color/white, 1px border/button/default, shadow/xs,\n *            px 10 py 8, radius/2lg (10px), gap 6,\n *            Body 1/Medium text color/neutral/950,\n *            16px chevron (custom stroke glyph) in text/secondary\n *\n * The open popover/listbox shares the BoardUI menu recipe with Dropdown:\n * radius/2xl panel, p 10, shadow/dropdown, 150ms fade/scale/blur motion,\n * and radius/2lg rows with the same hover/selected surface.\n *\n * Item content is free-form: pass a `StatusDot` + text for status selects.\n */\n\nexport type SelectSize = \"sm\" | \"md\";\n\nconst SelectSizeContext = createContext<SelectSize>(\"md\");\n\nexport interface SelectProps<T extends object>\n  extends Omit<AriaSelectProps<T>, \"children\"> {\n  /** Trigger width. Defaults to hug content; the menu uses the shared 266px width. */\n  className?: string;\n  triggerClassName?: string;\n  /** Classes for the open popover (e.g. constrain its width). */\n  popoverClassName?: string;\n  /** Keep the menu in a native dialog's top-layer subtree when required. */\n  popoverContainer?: Element;\n  /** `md` (default) or `sm` for compact/dense contexts (e.g. compact tables). */\n  size?: SelectSize;\n  children: ReactNode;\n  items?: Iterable<T>;\n  /** Customise the trigger's rendered value (e.g. a compact flag + dial code).\n   *  Falls back to the selected item's own content when omitted. */\n  renderValue?: ReactNode | ((values: AriaSelectValueRenderProps<T>) => ReactNode);\n  ref?: Ref<HTMLDivElement>;\n}\n\nexport function Select<T extends object>({\n  className,\n  triggerClassName,\n  popoverClassName,\n  popoverContainer,\n  size = \"md\",\n  children,\n  items,\n  renderValue,\n  ref,\n  ...props\n}: SelectProps<T>) {\n  // Outside native dialogs the popover is `isNonModal`: the modal scroll lock puts\n  // `overflow: hidden` on <html>, which — with this app's `h-full` root —\n  // collapses the page scroll position and visibly yanks the sticky\n  // sidebar upward every time a select opens. Non-modal skips the lock,\n  // but also disables react-aria's outside-press dismissal (`isDismissable`\n  // is hard-coupled to `!isNonModal` in usePopover), so open state is\n  // controlled here and dismissal restored manually — the same fix as the\n  // date-picker family (see utils/use-dismiss-on-outside-press.ts).\n  const triggerRef = useRef<HTMLButtonElement>(null);\n  const popoverRef = useRef<HTMLElement>(null);\n  const [isOpen, setIsOpen] = useState(false);\n  const initializeSelectedList = useCallback((node: HTMLDivElement | null) => {\n    // Pre-position long selected lists using unscaled layout offsets.\n    // During the entrance scale, rect-based autofocus under-scrolls;\n    // its correction then scrolls the document and dismisses this\n    // deliberately non-modal popover. Keep the source animation and\n    // real option focus while avoiding that initial page movement.\n    if (!node) return;\n    const selected = node.querySelector<HTMLElement>('[role=\"option\"][data-selected]');\n    if (selected) {\n      node.scrollTop = Math.max(0,\n        selected.offsetTop - node.offsetTop - (node.clientHeight - selected.offsetHeight) / 2,\n      );\n    }\n  }, []);\n  useDismissOnOutsidePress(isOpen, () => setIsOpen(false), [triggerRef, popoverRef]);\n  // Pressing the trigger while open closes the popover instead of reopening\n  const allowOpenChange = useTriggerToggle(isOpen, triggerRef);\n  const enclosingDialog = triggerRef.current?.closest('dialog');\n  const nativeScope = triggerRef.current?.closest('.bn-source');\n  // A native modal already locks document scrolling. Its selects use modal\n  // focus handling so option autofocus cannot dismiss them by scrolling the form.\n  // Fixed overlay coordinates avoid counting the native dialog offset twice.\n  // Retain both the browser top layer and this component's scoped utility styles.\n  const dialogContainer = enclosingDialog && nativeScope && enclosingDialog.contains(nativeScope)\n    ? nativeScope : enclosingDialog ?? undefined;\n\n  return (\n    <AriaSelect\n      ref={ref}\n      {...props}\n      isOpen={isOpen}\n      onOpenChange={(o) => allowOpenChange(o) && setIsOpen(o)}\n      className={cx(\"group flex flex-col\", className)}\n    >\n      {({ isOpen }) => (\n        <>\n          <AriaButton\n            ref={triggerRef}\n            className={cx(\n              \"flex w-full cursor-pointer items-center justify-between rounded-2lg\",\n              \"border border-border-button-default bg-background-primary-default shadow-xs\",\n              \"text-text-primary\",\n              \"transition-[background-color,border-color,box-shadow,padding,font-size] duration-200 ease\",\n              \"hover:bg-background-primary-hover hover:border-border-button-hover\",\n              \"outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-border-focus-ring\",\n              \"disabled:cursor-not-allowed disabled:bg-background-primary-disabled disabled:text-text-tertiary disabled:shadow-none\",\n              size === \"sm\"\n                ? \"gap-1 px-[7px] py-1 text-body-2-medium\"\n                : \"gap-1.5 px-2.5 py-2 text-body-medium\",\n              triggerClassName,\n            )}\n          >\n            <AriaSelectValue\n              className={cx(\n                \"flex min-w-0 items-center truncate\",\n                size === \"sm\" ? \"gap-1\" : \"gap-[5px]\",\n              )}\n            >\n              {renderValue as never /* RAC accepts node or render-prop */}\n            </AriaSelectValue>\n            <ChevronDownSmall\n              className={cx(\n                \"shrink-0 text-text-secondary transition-transform duration-200 ease\",\n                size === \"sm\" ? \"size-3.5\" : \"size-4\",\n                isOpen && \"rotate-180\",\n              )}\n            />\n          </AriaButton>\n          <AriaPopover\n            ref={popoverRef}\n            UNSTABLE_portalContainer={popoverContainer ?? dialogContainer}\n            isNonModal={!enclosingDialog}\n            boundaryElement={popoverContainer ? undefined : enclosingDialog ?? undefined}\n            style={enclosingDialog ? { position: 'fixed' } : undefined}\n            offset={4}\n            className={cx(\n              MENU_POPOVER_WIDTH,\n              MENU_POPOVER_SURFACE,\n              // Listbox rows already space themselves 4px apart, so the\n              // surface sits a touch tighter than the action-menu Dropdown.\n              \"p-2\",\n              popoverClassName,\n            )}\n          >\n            <AriaListBox\n              ref={initializeSelectedList}\n              items={items}\n              className={cx(MENU_ITEMS_CONTAINER, \"max-h-[240px] overflow-auto\")}\n            >\n              <SelectSizeContext.Provider value={size}>{children}</SelectSizeContext.Provider>\n            </AriaListBox>\n          </AriaPopover>\n        </>\n      )}\n    </AriaSelect>\n  );\n}\n\nexport interface SelectItemProps extends Omit<AriaListBoxItemProps, \"children\"> {\n  children?: ReactNode;\n}\n\nexport function SelectItem({ className, children, ...props }: SelectItemProps) {\n  const size = useContext(SelectSizeContext);\n  return (\n    <AriaListBoxItem\n      {...props}\n      className={(state) =>\n        cx(\n          MENU_ITEM,\n          size === \"sm\" ? \"px-2 py-1.5 text-body-2-medium\" : \"text-body-medium\",\n          (state.isFocused || state.isSelected) && MENU_ITEM_ACTIVE,\n          state.isDisabled && \"cursor-not-allowed text-text-disabled\",\n          typeof className === \"function\" ? className(state) : className,\n        )\n      }\n    >\n      {children}\n    </AriaListBoxItem>\n  );\n}\n",
  "src/board-native/components/base/slider/slider.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport {\n  Label as AriaLabel,\n  Slider as AriaSlider,\n  SliderThumb as AriaSliderThumb,\n  SliderTrack as AriaSliderTrack,\n} from \"react-aria-components\";\nimport type { SliderProps as AriaSliderProps } from \"react-aria-components\";\nimport { cx } from \"../../../utils/cx.js\";\n\ntype SliderValue = number | number[];\n\ntype SliderBaseProps<T extends SliderValue> = Omit<\n  AriaSliderProps<T>,\n  \"children\" | \"className\" | \"orientation\"\n> & {\n  /** Optional visible label associated with every thumb. */\n  label?: ReactNode;\n  /** Show the exact value in a persistent bubble above each thumb. Default `true`. */\n  showTooltip?: boolean;\n  /** Custom visual formatter for the value bubbles. */\n  formatValue?: (value: number, index: number) => ReactNode;\n  className?: string;\n};\n\nexport type SliderProps = SliderBaseProps<number> & {\n  /** Accessible name for the single thumb. */\n  thumbLabel?: string;\n};\n\nexport type RangeSliderProps = SliderBaseProps<number[]> & {\n  /** Accessible names for the lower and upper thumbs. */\n  thumbLabels?: [string, string];\n};\n\ntype SliderBaseInternalProps<T extends SliderValue> = SliderBaseProps<T> & {\n  thumbLabels: string[];\n};\n\n/**\n * Shared single and multi-thumb slider presentation.\n *\n * React Aria owns the value model, drag behavior, hidden range inputs,\n * keyboard controls, RTL handling, and collision rules. BoardUI owns the\n * visual track, selected range, thumbs, and exact-value bubbles.\n */\nfunction SliderBase<T extends SliderValue>({\n  className,\n  label,\n  showTooltip = true,\n  formatValue,\n  thumbLabels,\n  ...props\n}: SliderBaseInternalProps<T>) {\n  return (\n    <AriaSlider\n      {...props}\n      orientation=\"horizontal\"\n      className={({ isDisabled }) =>\n        cx(\n          \"group flex w-full min-w-0 flex-col gap-2\",\n          isDisabled && \"cursor-not-allowed opacity-50\",\n          className,\n        )\n      }\n    >\n      {({ state }) => {\n        const isRange = state.values.length > 1;\n        const startPercent = isRange ? state.getThumbPercent(0) : 0;\n        const endPercent = state.getThumbPercent(state.values.length - 1);\n\n        return (\n          <>\n            {label != null && (\n              <AriaLabel className=\"text-body-medium text-text-primary\">\n                {label}\n              </AriaLabel>\n            )}\n\n            <AriaSliderTrack\n              className={cx(\n                \"relative h-8 w-full touch-none\",\n                showTooltip && \"mt-8\",\n              )}\n            >\n              {({ isHovered }) => (\n                <>\n                  <span\n                    aria-hidden\n                    className={cx(\n                      \"absolute top-1/2 end-0 start-0 h-1.5 -translate-y-1/2 rounded-full\",\n                      \"bg-background-tertiary-default shadow-[inset_0_1px_1px_rgb(0_0_0/0.06)]\",\n                      \"transition-colors duration-150 ease\",\n                      isHovered && \"bg-background-tertiary-hover\",\n                    )}\n                  />\n                  <span\n                    aria-hidden\n                    className={cx(\n                      \"absolute top-1/2 h-1.5 -translate-y-1/2 rounded-full\",\n                      \"bg-linear-to-r from-accent-500 to-accent-600\",\n                      \"shadow-[inset_0_1px_0_rgb(255_255_255/0.24),0_1px_2px_rgb(4_80_226/0.16)]\",\n                    )}\n                    style={{\n                      insetInlineStart: `${startPercent * 100}%`,\n                      insetInlineEnd: `${(1 - endPercent) * 100}%`,\n                    }}\n                  />\n\n                  {state.values.map((value, index) => {\n                    const valueLabel =\n                      formatValue?.(value, index) ??\n                      state.getThumbValueLabel(index);\n\n                    return (\n                      <AriaSliderThumb\n                        key={index}\n                        index={index}\n                        aria-label={\n                          thumbLabels[index] ??\n                          (isRange ? `Value ${index + 1}` : \"Value\")\n                        }\n                        className={({\n                          isDragging,\n                          isHovered: isThumbHovered,\n                          isFocusVisible,\n                          isDisabled,\n                        }) =>\n                          cx(\n                            \"top-1/2 size-5 rounded-full border border-border-button-default outline-none\",\n                            \"flex items-center justify-center bg-control-indicator-background\",\n                            \"shadow-[0_2px_4px_rgb(0_0_0/0.10),inset_0_1px_0_rgb(255_255_255/0.8)]\",\n                            \"transition-[scale,box-shadow,border-color] duration-150 ease\",\n                            isThumbHovered && !isDragging && \"scale-105 border-border-button-hover\",\n                            isDragging && \"z-20 scale-110 border-accent-500 shadow-[0_3px_8px_color-mix(in_srgb,var(--color-accent-600)_22%,transparent)]\",\n                            isFocusVisible && \"ring-2 ring-border-focus-ring ring-offset-2\",\n                            isDisabled ? \"cursor-not-allowed\" : \"cursor-grab active:cursor-grabbing\",\n                          )\n                        }\n                      >\n                        {({ isDragging, isFocused }) => (\n                          <>\n                            {showTooltip && (\n                              <span\n                                aria-hidden\n                                className={cx(\n                                  \"pointer-events-none absolute bottom-[calc(100%+9px)] left-1/2 -translate-x-1/2\",\n                                  \"flex h-7 min-w-8 items-center justify-center rounded-lg border border-border-button-default\",\n                                  \"bg-background-primary-default px-2 text-caption-1-medium whitespace-nowrap text-text-primary shadow-xs\",\n                                  \"transition-[translate,box-shadow] duration-150 ease\",\n                                  (isDragging || isFocused) && \"-translate-y-0.5 shadow-dropdown\",\n                                )}\n                              >\n                                {valueLabel}\n                                <span\n                                  aria-hidden\n                                  className=\"absolute -bottom-[4.5px] left-1/2 size-2 -translate-x-1/2 rotate-45 border-r border-b border-border-button-default bg-background-primary-default\"\n                                />\n                              </span>\n                            )}\n                            <span\n                              aria-hidden\n                              className={cx(\n                                \"size-2 rounded-full bg-linear-to-b from-accent-500 to-accent-600\",\n                                \"shadow-[inset_0_1px_0_rgb(255_255_255/0.24)] transition-[filter] duration-150 ease\",\n                                (isDragging || isFocused) && \"brightness-110\",\n                              )}\n                            />\n                          </>\n                        )}\n                      </AriaSliderThumb>\n                    );\n                  })}\n                </>\n              )}\n            </AriaSliderTrack>\n          </>\n        );\n      }}\n    </AriaSlider>\n  );\n}\n\n/** A single-value slider with an exact-value bubble above the thumb. */\nexport function Slider({ thumbLabel = \"Value\", ...props }: SliderProps) {\n  return <SliderBase {...props} thumbLabels={[thumbLabel]} />;\n}\n\n/** A two-thumb slider for selecting a minimum and maximum value. */\nexport function RangeSlider({\n  thumbLabels = [\"Minimum\", \"Maximum\"],\n  ...props\n}: RangeSliderProps) {\n  return <SliderBase {...props} thumbLabels={thumbLabels} />;\n}\n",
  "src/board-native/components/base/social-button/social-button.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\nimport type { AnchorHTMLAttributes, ButtonHTMLAttributes, ReactNode, Ref } from \"react\";\nimport { cx, sortCx } from \"../../../utils/cx.js\";\nimport { SOCIAL_COLOR_LOGOS } from \"./social-color-logos.js\";\nimport {\n  SOCIAL_PROVIDERS,\n  type SocialProvider,\n} from \"./social-providers.js\";\n\n/**\n * Sign-in button for a third-party provider — 24 of them, from Google and\n * Apple through to Okta and Auth0, plus `custom` for anything else.\n *\n * The brand is named, not passed as artwork: `brand=\"google\"` supplies the\n * logo, the brand colour and the accessible label together, so a stack of\n * these cannot drift out of sync.\n *\n *   <SocialButton brand=\"google\" />                       Continue with Google\n *   <SocialButton brand=\"github\" appearance=\"white\" />    outlined, colour mark\n *   <SocialButton brand=\"apple\" iconOnly />               square, logo only\n *   <SocialButton brand=\"figma\" href=\"/auth/figma\" />     renders an anchor\n *\n * Three appearances. `colorful` (default) fills with the brand colour and\n * puts a white glyph on it. `black` is the same shape in high-contrast solid\n * black. `white` is the outlined treatment, and the one that shows each\n * provider's real multi-colour mark, which is what most sign-in screens use.\n *\n * One rounding, deliberately: a sign-in stack reads as a set, and mixing pill\n * and square corners across providers is noise rather than expression.\n */\n\nexport type SocialBrand = SocialProvider | \"custom\";\nexport type SocialButtonSize = \"medium\" | \"small\";\nexport type SocialButtonAppearance = \"colorful\" | \"black\" | \"white\";\n\n/** Everything a brand needs, for providers that are not built in. */\nexport interface SocialBrandConfig {\n  icon: ReactNode;\n  /** Used in the label and as the accessible name. Defaults to \"SSO\". */\n  label?: string;\n  /** Fill for `colorful`. Defaults to black. */\n  color?: string;\n}\n\ninterface SocialButtonBaseProps {\n  brand: SocialBrand;\n  /** Required when `brand=\"custom\"`; ignored otherwise. */\n  config?: SocialBrandConfig;\n  size?: SocialButtonSize;\n  appearance?: SocialButtonAppearance;\n  /** Square button showing only the logo; the label becomes the aria-label. */\n  iconOnly?: boolean;\n  /** Drop the fixed width and fill the container instead. */\n  fullWidth?: boolean;\n  /** Defaults to \"Continue with <Brand>\". */\n  children?: ReactNode;\n  className?: string;\n}\n\nexport interface SocialButtonProps\n  extends SocialButtonBaseProps,\n    Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"children\" | \"color\"> {\n  href?: never;\n  ref?: Ref<HTMLButtonElement>;\n}\n\nexport interface SocialButtonLinkProps\n  extends SocialButtonBaseProps,\n    Omit<AnchorHTMLAttributes<HTMLAnchorElement>, \"children\" | \"color\"> {\n  /** Renders an anchor instead of a button — OAuth starts are navigations. */\n  href: string;\n  ref?: Ref<HTMLAnchorElement>;\n}\n\n/**\n * Brands whose real mark is drawn in near-black. On a dark surface they\n * disappear into it, so dark mode repaints their paths white — the official\n * treatment both publish for dark backgrounds. Colourful marks (Google,\n * Slack) are left exactly as drawn.\n */\nconst DARK_INVERTED_BRANDS = new Set<SocialBrand>([\"apple\", \"github\", \"x\"]);\n\nconst styles = sortCx({\n  base: [\n    \"inline-flex items-center justify-center gap-2 whitespace-nowrap overflow-hidden\",\n    \"font-sans select-none cursor-pointer\",\n    \"button-press-motion\",\n    \"transition-[background-color,border-color,box-shadow,color,filter] duration-150 ease\",\n    \"outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-border-focus-ring\",\n    \"disabled:cursor-not-allowed disabled:opacity-60 aria-disabled:cursor-not-allowed aria-disabled:opacity-60\",\n  ].join(\" \"),\n  // Heights, radii and glyph sizes are the base Button's medium and small to\n  // the pixel, so a social button can sit in a form beside a Button without\n  // a half-step in the rhythm. The fixed width is the one addition: a column\n  // of providers should line up without a wrapper doing the work, and\n  // `fullWidth` opts out.\n  size: {\n    medium: \"h-9 w-[300px] rounded-2lg px-3 text-body-medium\",\n    small: \"h-8 w-[250px] rounded-lg px-2.5 text-body-medium\",\n  },\n  iconOnlySize: {\n    medium: \"size-9 w-9 rounded-2lg px-0\",\n    small: \"size-8 w-8 rounded-lg px-0\",\n  },\n  // A touch under the base Button's icon sizes (20/18): a brand mark is\n  // denser than a line icon and reads heavier at the same box.\n  glyph: {\n    medium: \"size-[18px] shrink-0\",\n    small: \"size-4 shrink-0\",\n  },\n  appearance: {\n    // The same recipe as `bg-button-primary`: a 180deg gradient from the\n    // brand colour into a darker stop, with the system's own button shadow.\n    // A flat fill read as a foreign control next to BoardUI's own buttons.\n    // The gradient itself is set inline, since it is per-brand.\n    colorful: \"text-white shadow-xs\",\n    black:\n      \"bg-neutral-950 text-white shadow-xs hover:bg-neutral-800 active:bg-neutral-900\",\n    // Matches the system's secondary button, so it sits in a form beside the\n    // rest of BoardUI without looking like a different family.\n    white: [\n      \"bg-background-primary-default text-text-primary\",\n      \"border border-border-button-default shadow-xs\",\n      \"hover:bg-background-primary-hover hover:border-border-button-hover\",\n      \"active:bg-background-primary-active active:border-border-button-active\",\n    ].join(\" \"),\n  },\n});\n\nexport function SocialButton({ href, ...props }: SocialButtonProps | SocialButtonLinkProps) {\n  const {\n    brand,\n    config,\n    size = \"medium\",\n    appearance = \"colorful\",\n    iconOnly = false,\n    fullWidth = false,\n    children,\n    className,\n    ref,\n    ...rest\n  } = props as SocialButtonBaseProps & {\n    ref?: Ref<HTMLButtonElement & HTMLAnchorElement>;\n  } & Record<string, unknown>;\n\n  const custom = brand === \"custom\";\n  const meta = custom ? undefined : SOCIAL_PROVIDERS[brand as SocialProvider];\n  const label = custom ? (config?.label ?? \"SSO\") : meta!.label;\n  const fill = custom ? (config?.color ?? \"#000000\") : meta!.brand;\n\n  // The outlined treatment is where the real multi-colour mark belongs: on a\n  // brand or black fill it would fight the background. Not every provider has\n  // one upstream (see social-color-logos.ts), so a missing mark falls back to\n  // the monochrome glyph tinted with the brand colour.\n  const colorLogo =\n    appearance === \"white\" && !custom\n      ? SOCIAL_COLOR_LOGOS[brand as SocialProvider]\n      : undefined;\n\n  const glyph = custom ? (\n    <span className={cx(styles.glyph[size], \"inline-flex items-center justify-center\")}>\n      {config?.icon}\n    </span>\n  ) : colorLogo ? (\n    <svg\n      viewBox={colorLogo.viewBox}\n      aria-hidden\n      className={cx(\n        styles.glyph[size],\n        DARK_INVERTED_BRANDS.has(brand) && \"dark:[&_path]:fill-white\",\n      )}\n      // The mark carries its own fills, so it goes in as markup. This is a\n      // build-time constant from this repo, never caller- or user-supplied.\n      dangerouslySetInnerHTML={{ __html: colorLogo.body }}\n    />\n  ) : (\n    <svg\n      viewBox={meta!.viewBox}\n      aria-hidden\n      className={styles.glyph[size]}\n      // On the filled appearances the glyph rides the white label; outlined\n      // falls back to the brand colour so it is not a grey smudge.\n      style={appearance === \"white\" ? { color: meta!.brand } : undefined}\n    >\n      <path d={meta!.path} fill=\"currentColor\" />\n    </svg>\n  );\n\n  const content = (\n    <>\n      {glyph}\n      {iconOnly ? null : <span className=\"truncate\">{children ?? `Continue with ${label}`}</span>}\n    </>\n  );\n\n  // A brand whose colour is a system token (Google) hands the fill straight\n  // to `bg-button-primary`, so it is the primary button, gradient, hover and\n  // active included, rather than an approximation of it. Every other brand\n  // gets that gradient's shape derived from its own colour: down in\n  // lightness and up slightly in chroma, which is what blue-500 → blue-600\n  // does. Mixing toward black instead would wash the second stop out.\n  const systemFill = appearance === \"colorful\" && fill.startsWith(\"var(\");\n\n  const classes = cx(\n    styles.base,\n    iconOnly ? styles.iconOnlySize[size] : styles.size[size],\n    styles.appearance[appearance],\n    // `bg-button-primary` carries its own hover and active gradients; the\n    // derived brands need the brightness shift instead.\n    systemFill\n      ? \"bg-button-primary\"\n      : appearance === \"colorful\" && \"hover:brightness-[1.06] active:brightness-95\",\n    fullWidth && !iconOnly && \"w-full\",\n    className,\n  );\n\n  // The visible label already names the brand; when it is hidden the element\n  // needs that name back, or the control announces as unlabelled.\n  const accessibleName = iconOnly ? `Continue with ${label}` : undefined;\n\n  const inlineStyle =\n    appearance === \"colorful\" && !systemFill\n      ? {\n          backgroundImage: `linear-gradient(180deg, ${fill} 0%, oklch(from ${fill} calc(l - 0.04) calc(c + 0.01) h) 100%)`,\n        }\n      : undefined;\n\n  if (href !== undefined) {\n    return (\n      <a\n        ref={ref as Ref<HTMLAnchorElement>}\n        href={href}\n        aria-label={accessibleName}\n        className={classes}\n        style={inlineStyle}\n        {...(rest as AnchorHTMLAttributes<HTMLAnchorElement>)}\n      >\n        {content}\n      </a>\n    );\n  }\n\n  return (\n    <button\n      ref={ref as Ref<HTMLButtonElement>}\n      type=\"button\"\n      aria-label={accessibleName}\n      className={classes}\n      style={inlineStyle}\n      {...(rest as ButtonHTMLAttributes<HTMLButtonElement>)}\n    >\n      {content}\n    </button>\n  );\n}\n\nexport { SOCIAL_PROVIDERS, type SocialProvider };\n",
  "src/board-native/components/base/social-button/social-color-logos.ts": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n/**\n * Full-colour brand marks, for `color=\"color\"`.\n *\n * Copied verbatim from SVG Logos (https://github.com/gilbarbara/logos), the\n * set behind Iconify's `logos`, which is CC0 1.0 like Simple Icons and so is\n * safe to redistribute inside an installed component. These are the real\n * multi-path marks — Google's four-colour G, Slack's four-colour hash — so\n * unlike the monochrome glyphs in `social-providers.ts` they carry their own\n * fills and ignore `currentColor`.\n *\n * Each mark keeps the grid it was drawn on: these are not all 24×24, and\n * squashing them into one box would distort logos that are not square.\n *\n * Amazon is deliberately absent: the set carries AWS and Amazon Chime but no\n * plain Amazon mark, and AWS is a different brand. `SocialButton` falls back\n * to the brand-tinted monochrome glyph for any provider missing here, so the\n * `color` treatment still renders something correct for all 24.\n */\n\nimport type { SocialProvider } from \"./social-providers.js\";\n\nexport const SOCIAL_COLOR_LOGOS: Partial<\n  Record<SocialProvider, { viewBox: string; body: string }>\n> = {\n  \"google\": {\n    viewBox: \"0 0 256 262\",\n    body: \"<path fill=\\\"#4285f4\\\" d=\\\"M255.878 133.451c0-10.734-.871-18.567-2.756-26.69H130.55v48.448h71.947c-1.45 12.04-9.283 30.172-26.69 42.356l-.244 1.622l38.755 30.023l2.685.268c24.659-22.774 38.875-56.282 38.875-96.027\\\"/><path fill=\\\"#34a853\\\" d=\\\"M130.55 261.1c35.248 0 64.839-11.605 86.453-31.622l-41.196-31.913c-11.024 7.688-25.82 13.055-45.257 13.055c-34.523 0-63.824-22.773-74.269-54.25l-1.531.13l-40.298 31.187l-.527 1.465C35.393 231.798 79.49 261.1 130.55 261.1\\\"/><path fill=\\\"#fbbc05\\\" d=\\\"M56.281 156.37c-2.756-8.123-4.351-16.827-4.351-25.82c0-8.994 1.595-17.697 4.206-25.82l-.073-1.73L15.26 71.312l-1.335.635C5.077 89.644 0 109.517 0 130.55s5.077 40.905 13.925 58.602z\\\"/><path fill=\\\"#eb4335\\\" d=\\\"M130.55 50.479c24.514 0 41.05 10.589 50.479 19.438l36.844-35.974C195.245 12.91 165.798 0 130.55 0C79.49 0 35.393 29.301 13.925 71.947l42.211 32.783c10.59-31.477 39.891-54.251 74.414-54.251\\\"/>\",\n  },\n  \"apple\": {\n    viewBox: \"0 0 256 315\",\n    body: \"<path d=\\\"M213.803 167.03c.442 47.58 41.74 63.413 42.197 63.615c-.35 1.116-6.599 22.563-21.757 44.716c-13.104 19.153-26.705 38.235-48.13 38.63c-21.05.388-27.82-12.483-51.888-12.483c-24.061 0-31.582 12.088-51.51 12.871c-20.68.783-36.428-20.71-49.64-39.793c-27-39.033-47.633-110.3-19.928-158.406c13.763-23.89 38.36-39.017 65.056-39.405c20.307-.387 39.475 13.662 51.889 13.662c12.406 0 35.699-16.895 60.186-14.414c10.25.427 39.026 4.14 57.503 31.186c-1.49.923-34.335 20.044-33.978 59.822M174.24 50.199c10.98-13.29 18.369-31.79 16.353-50.199c-15.826.636-34.962 10.546-46.314 23.828c-10.173 11.763-19.082 30.589-16.678 48.633c17.64 1.365 35.66-8.964 46.64-22.262\\\"/>\",\n  },\n  \"github\": {\n    viewBox: \"0 0 256 250\",\n    body: \"<path fill=\\\"#161614\\\" d=\\\"M128.001 0C57.317 0 0 57.307 0 128.001c0 56.554 36.676 104.535 87.535 121.46c6.397 1.185 8.746-2.777 8.746-6.158c0-3.052-.12-13.135-.174-23.83c-35.61 7.742-43.124-15.103-43.124-15.103c-5.823-14.795-14.213-18.73-14.213-18.73c-11.613-7.944.876-7.78.876-7.78c12.853.902 19.621 13.19 19.621 13.19c11.417 19.568 29.945 13.911 37.249 10.64c1.149-8.272 4.466-13.92 8.127-17.116c-28.431-3.236-58.318-14.212-58.318-63.258c0-13.975 5-25.394 13.188-34.358c-1.329-3.224-5.71-16.242 1.24-33.874c0 0 10.749-3.44 35.21 13.121c10.21-2.836 21.16-4.258 32.038-4.307c10.878.049 21.837 1.47 32.066 4.307c24.431-16.56 35.165-13.12 35.165-13.12c6.967 17.63 2.584 30.65 1.255 33.873c8.207 8.964 13.173 20.383 13.173 34.358c0 49.163-29.944 59.988-58.447 63.157c4.591 3.972 8.682 11.762 8.682 23.704c0 17.126-.148 30.91-.148 35.126c0 3.407 2.304 7.398 8.792 6.14C219.37 232.5 256 184.537 256 128.002C256 57.307 198.691 0 128.001 0m-80.06 182.34c-.282.636-1.283.827-2.194.39c-.929-.417-1.45-1.284-1.15-1.922c.276-.655 1.279-.838 2.205-.399c.93.418 1.46 1.293 1.139 1.931m6.296 5.618c-.61.566-1.804.303-2.614-.591c-.837-.892-.994-2.086-.375-2.66c.63-.566 1.787-.301 2.626.591c.838.903 1 2.088.363 2.66m4.32 7.188c-.785.545-2.067.034-2.86-1.104c-.784-1.138-.784-2.503.017-3.05c.795-.547 2.058-.055 2.861 1.075c.782 1.157.782 2.522-.019 3.08m7.304 8.325c-.701.774-2.196.566-3.29-.49c-1.119-1.032-1.43-2.496-.726-3.27c.71-.776 2.213-.558 3.315.49c1.11 1.03 1.45 2.505.701 3.27m9.442 2.81c-.31 1.003-1.75 1.459-3.199 1.033c-1.448-.439-2.395-1.613-2.103-2.626c.301-1.01 1.747-1.484 3.207-1.028c1.446.436 2.396 1.602 2.095 2.622m10.744 1.193c.036 1.055-1.193 1.93-2.715 1.95c-1.53.034-2.769-.82-2.786-1.86c0-1.065 1.202-1.932 2.733-1.958c1.522-.03 2.768.818 2.768 1.868m10.555-.405c.182 1.03-.875 2.088-2.387 2.37c-1.485.271-2.861-.365-3.05-1.386c-.184-1.056.893-2.114 2.376-2.387c1.514-.263 2.868.356 3.061 1.403\\\"/>\",\n  },\n  \"gitlab\": {\n    viewBox: \"0 0 256 247\",\n    body: \"<path fill=\\\"#e24329\\\" d=\\\"m251.845 97.642l-.328-.986l-34.85-90.903c-.657-1.808-1.972-3.287-3.616-4.274Q210.586 0 207.627 0c-1.973 0-3.78.822-5.26 1.973a8.73 8.73 0 0 0-3.124 4.767l-23.506 71.999H80.56l-23.506-72c-.493-1.808-1.644-3.451-3.123-4.766C52.45.822 50.643 0 48.67 0s-3.781.329-5.425 1.48c-1.644.986-2.96 2.465-3.617 4.273L4.781 96.656l-.33.986c-10.355 26.959-1.479 57.37 21.535 74.794h.328c0 .164 53.096 39.944 53.096 39.944l26.3 19.89l15.946 12c3.78 2.96 9.205 2.96 12.986 0l15.945-12l26.3-19.89l53.424-39.944c23.014-17.425 31.726-47.835 21.37-74.794z\\\"/><path fill=\\\"#fc6d26\\\" d=\\\"m251.845 97.642l-.328-.986c-17.26 3.616-33.205 10.85-46.849 21.04c-.164 0-41.424 31.398-76.602 57.863a18377 18377 0 0 0 48.657 36.821l53.424-39.944c23.013-17.425 31.726-47.835 21.37-74.794z\\\"/><path fill=\\\"#fca326\\\" d=\\\"m79.245 212.38l26.301 19.89l15.945 12c3.78 2.96 9.206 2.96 12.986 0l15.945-12l26.301-19.89s-22.684-17.095-48.657-36.82c-26.136 19.725-48.82 36.82-48.82 36.82\\\"/><path fill=\\\"#fc6d26\\\" d=\\\"M51.465 117.697c-13.644-10.192-29.589-17.589-46.849-21.04l-.329.985c-10.356 26.959-1.479 57.37 21.534 74.794h.33c0 .164 53.094 39.944 53.094 39.944s22.685-17.095 48.821-36.82c-35.013-26.466-76.272-57.699-76.601-57.863\\\"/>\",\n  },\n  \"microsoft\": {\n    viewBox: \"0 0 256 256\",\n    body: \"<path fill=\\\"#f1511b\\\" d=\\\"M121.666 121.666H0V0h121.666z\\\"/><path fill=\\\"#80cc28\\\" d=\\\"M256 121.666H134.335V0H256z\\\"/><path fill=\\\"#00adef\\\" d=\\\"M121.663 256.002H0V134.336h121.663z\\\"/><path fill=\\\"#fbbc09\\\" d=\\\"M256 256.002H134.335V134.336H256z\\\"/>\",\n  },\n  \"x\": {\n    viewBox: \"0 0 251 256\",\n    body: \"<path d=\\\"M149.079 108.399L242.33 0h-22.098l-80.97 94.12L74.59 0H0l97.796 142.328L0 256h22.1l85.507-99.395L175.905 256h74.59L149.073 108.399zM118.81 143.58l-9.909-14.172l-78.84-112.773h33.943l63.625 91.011l9.909 14.173l82.705 118.3H186.3l-67.49-96.533z\\\"/>\",\n  },\n  \"facebook\": {\n    viewBox: \"0 0 256 256\",\n    body: \"<path fill=\\\"#1877f2\\\" d=\\\"M256 128C256 57.308 198.692 0 128 0S0 57.308 0 128c0 63.888 46.808 116.843 108 126.445V165H75.5v-37H108V99.8c0-32.08 19.11-49.8 48.348-49.8C170.352 50 185 52.5 185 52.5V84h-16.14C152.959 84 148 93.867 148 103.99V128h35.5l-5.675 37H148v89.445c61.192-9.602 108-62.556 108-126.445\\\"/><path fill=\\\"#fff\\\" d=\\\"m177.825 165l5.675-37H148v-24.01C148 93.866 152.959 84 168.86 84H185V52.5S170.352 50 156.347 50C127.11 50 108 67.72 108 99.8V128H75.5v37H108v89.445A129 129 0 0 0 128 256a129 129 0 0 0 20-1.555V165z\\\"/>\",\n  },\n  \"linkedin\": {\n    viewBox: \"0 0 256 256\",\n    body: \"<path fill=\\\"#0a66c2\\\" d=\\\"M218.123 218.127h-37.931v-59.403c0-14.165-.253-32.4-19.728-32.4c-19.756 0-22.779 15.434-22.779 31.369v60.43h-37.93V95.967h36.413v16.694h.51a39.91 39.91 0 0 1 35.928-19.733c38.445 0 45.533 25.288 45.533 58.186zM56.955 79.27c-12.157.002-22.014-9.852-22.016-22.009s9.851-22.014 22.008-22.016c12.157-.003 22.014 9.851 22.016 22.008A22.013 22.013 0 0 1 56.955 79.27m18.966 138.858H37.95V95.967h37.97zM237.033.018H18.89C8.58-.098.125 8.161-.001 18.471v219.053c.122 10.315 8.576 18.582 18.89 18.474h218.144c10.336.128 18.823-8.139 18.966-18.474V18.454c-.147-10.33-8.635-18.588-18.966-18.453\\\"/>\",\n  },\n  \"discord\": {\n    viewBox: \"0 0 256 199\",\n    body: \"<path fill=\\\"#5865f2\\\" d=\\\"M216.856 16.597A208.5 208.5 0 0 0 164.042 0c-2.275 4.113-4.933 9.645-6.766 14.046q-29.538-4.442-58.533 0c-1.832-4.4-4.55-9.933-6.846-14.046a207.8 207.8 0 0 0-52.855 16.638C5.618 67.147-3.443 116.4 1.087 164.956c22.169 16.555 43.653 26.612 64.775 33.193A161 161 0 0 0 79.735 175.3a136.4 136.4 0 0 1-21.846-10.632a109 109 0 0 0 5.356-4.237c42.122 19.702 87.89 19.702 129.51 0a132 132 0 0 0 5.355 4.237a136 136 0 0 1-21.886 10.653c4.006 8.02 8.638 15.67 13.873 22.848c21.142-6.58 42.646-16.637 64.815-33.213c5.316-56.288-9.08-105.09-38.056-148.36M85.474 135.095c-12.645 0-23.015-11.805-23.015-26.18s10.149-26.2 23.015-26.2s23.236 11.804 23.015 26.2c.02 14.375-10.148 26.18-23.015 26.18m85.051 0c-12.645 0-23.014-11.805-23.014-26.18s10.148-26.2 23.014-26.2c12.867 0 23.236 11.804 23.015 26.2c0 14.375-10.148 26.18-23.015 26.18\\\"/>\",\n  },\n  \"slack\": {\n    viewBox: \"0 0 256 256\",\n    body: \"<path fill=\\\"#e01e5a\\\" d=\\\"M53.841 161.32c0 14.832-11.987 26.82-26.819 26.82S.203 176.152.203 161.32c0-14.831 11.987-26.818 26.82-26.818H53.84zm13.41 0c0-14.831 11.987-26.818 26.819-26.818s26.819 11.987 26.819 26.819v67.047c0 14.832-11.987 26.82-26.82 26.82c-14.83 0-26.818-11.988-26.818-26.82z\\\"/><path fill=\\\"#36c5f0\\\" d=\\\"M94.07 53.638c-14.832 0-26.82-11.987-26.82-26.819S79.239 0 94.07 0s26.819 11.987 26.819 26.819v26.82zm0 13.613c14.832 0 26.819 11.987 26.819 26.819s-11.987 26.819-26.82 26.819H26.82C11.987 120.889 0 108.902 0 94.069c0-14.83 11.987-26.818 26.819-26.818z\\\"/><path fill=\\\"#2eb67d\\\" d=\\\"M201.55 94.07c0-14.832 11.987-26.82 26.818-26.82s26.82 11.988 26.82 26.82s-11.988 26.819-26.82 26.819H201.55zm-13.41 0c0 14.832-11.988 26.819-26.82 26.819c-14.831 0-26.818-11.987-26.818-26.82V26.82C134.502 11.987 146.489 0 161.32 0s26.819 11.987 26.819 26.819z\\\"/><path fill=\\\"#ecb22e\\\" d=\\\"M161.32 201.55c14.832 0 26.82 11.987 26.82 26.818s-11.988 26.82-26.82 26.82c-14.831 0-26.818-11.988-26.818-26.82V201.55zm0-13.41c-14.831 0-26.818-11.988-26.818-26.82c0-14.831 11.987-26.818 26.819-26.818h67.25c14.832 0 26.82 11.987 26.82 26.819s-11.988 26.819-26.82 26.819z\\\"/>\",\n  },\n  \"figma\": {\n    viewBox: \"0 0 256 384\",\n    body: \"<path fill=\\\"#0acf83\\\" d=\\\"M64 384c35.328 0 64-28.672 64-64v-64H64c-35.328 0-64 28.672-64 64s28.672 64 64 64\\\"/><path fill=\\\"#a259ff\\\" d=\\\"M0 192c0-35.328 28.672-64 64-64h64v128H64c-35.328 0-64-28.672-64-64\\\"/><path fill=\\\"#f24e1e\\\" d=\\\"M0 64C0 28.672 28.672 0 64 0h64v128H64C28.672 128 0 99.328 0 64\\\"/><path fill=\\\"#ff7262\\\" d=\\\"M128 0h64c35.328 0 64 28.672 64 64s-28.672 64-64 64h-64z\\\"/><path fill=\\\"#1abcfe\\\" d=\\\"M256 192c0 35.328-28.672 64-64 64s-64-28.672-64-64s28.672-64 64-64s64 28.672 64 64\\\"/>\",\n  },\n  \"notion\": {\n    viewBox: \"0 0 256 268\",\n    body: \"<path fill=\\\"#fff\\\" d=\\\"M16.092 11.538L164.09.608c18.179-1.56 22.85-.508 34.28 7.801l47.243 33.282C253.406 47.414 256 48.975 256 55.207v182.527c0 11.439-4.155 18.205-18.696 19.24L65.44 267.378c-10.913.517-16.11-1.043-21.825-8.327L8.826 213.814C2.586 205.487 0 199.254 0 191.97V29.726c0-9.352 4.155-17.153 16.092-18.188\\\"/><path d=\\\"M164.09.608L16.092 11.538C4.155 12.573 0 20.374 0 29.726v162.245c0 7.284 2.585 13.516 8.826 21.843l34.789 45.237c5.715 7.284 10.912 8.844 21.825 8.327l171.864-10.404c14.532-1.035 18.696-7.801 18.696-19.24V55.207c0-5.911-2.336-7.614-9.21-12.66l-1.185-.856L198.37 8.409C186.94.1 182.27-.952 164.09.608M69.327 52.22c-14.033.945-17.216 1.159-25.186-5.323L23.876 30.778c-2.06-2.086-1.026-4.69 4.163-5.207l142.274-10.395c11.947-1.043 18.17 3.12 22.842 6.758l24.401 17.68c1.043.525 3.638 3.637.517 3.637L71.146 52.095zm-16.36 183.954V81.222c0-6.767 2.077-9.887 8.3-10.413L230.02 60.93c5.724-.517 8.31 3.12 8.31 9.879v153.917c0 6.767-1.044 12.49-10.387 13.008l-161.487 9.361c-9.343.517-13.489-2.594-13.489-10.921M212.377 89.53c1.034 4.681 0 9.362-4.681 9.897l-7.783 1.542v114.404c-6.758 3.637-12.981 5.715-18.18 5.715c-8.308 0-10.386-2.604-16.609-10.396l-50.898-80.079v77.476l16.1 3.646s0 9.362-12.989 9.362l-35.814 2.077c-1.043-2.086 0-7.284 3.63-8.318l9.351-2.595V109.823l-12.98-1.052c-1.044-4.68 1.55-11.439 8.826-11.965l38.426-2.585l52.958 81.113v-71.76l-13.498-1.552c-1.043-5.733 3.111-9.896 8.3-10.404z\\\"/>\",\n  },\n  \"dropbox\": {\n    viewBox: \"0 0 256 218\",\n    body: \"<path fill=\\\"#0061ff\\\" d=\\\"M63.995 0L0 40.771l63.995 40.772L128 40.771zM192 0l-64 40.775l64 40.775l64.001-40.775zM0 122.321l63.995 40.772L128 122.321L63.995 81.55zM192 81.55l-64 40.775l64 40.774l64-40.774zM64 176.771l64.005 40.772L192 176.771L128.005 136z\\\"/>\",\n  },\n  \"spotify\": {\n    viewBox: \"0 0 256 256\",\n    body: \"<path fill=\\\"#1ed760\\\" d=\\\"M128 0C57.308 0 0 57.309 0 128c0 70.696 57.309 128 128 128c70.697 0 128-57.304 128-128C256 57.314 198.697.007 127.998.007zm58.699 184.614c-2.293 3.76-7.215 4.952-10.975 2.644c-30.053-18.357-67.885-22.515-112.44-12.335a7.98 7.98 0 0 1-9.552-6.007a7.97 7.97 0 0 1 6-9.553c48.76-11.14 90.583-6.344 124.323 14.276c3.76 2.308 4.952 7.215 2.644 10.975m15.667-34.853c-2.89 4.695-9.034 6.178-13.726 3.289c-34.406-21.148-86.853-27.273-127.548-14.92c-5.278 1.594-10.852-1.38-12.454-6.649c-1.59-5.278 1.386-10.842 6.655-12.446c46.485-14.106 104.275-7.273 143.787 17.007c4.692 2.89 6.175 9.034 3.286 13.72zm1.345-36.293C162.457 88.964 94.394 86.71 55.007 98.666c-6.325 1.918-13.014-1.653-14.93-7.978c-1.917-6.328 1.65-13.012 7.98-14.935C93.27 62.027 168.434 64.68 215.929 92.876c5.702 3.376 7.566 10.724 4.188 16.405c-3.362 5.69-10.73 7.565-16.4 4.187z\\\"/>\",\n  },\n  \"twitch\": {\n    viewBox: \"0 0 256 268\",\n    body: \"<path fill=\\\"#5a3e85\\\" d=\\\"M17.458 0L0 46.556v186.201h63.983v34.934h34.931l34.898-34.934h52.36L256 162.954V0zm23.259 23.263H232.73v128.029l-40.739 40.741H128L93.113 226.92v-34.886H40.717zm64.008 116.405H128V69.844h-23.275zm63.997 0h23.27V69.844h-23.27z\\\"/>\",\n  },\n  \"reddit\": {\n    viewBox: \"0 0 256 256\",\n    body: \"<circle cx=\\\"128\\\" cy=\\\"128\\\" r=\\\"128\\\" fill=\\\"#ff4500\\\"/><path fill=\\\"#fff\\\" d=\\\"M213.15 129.22c0-10.376-8.391-18.617-18.617-18.617a18.74 18.74 0 0 0-12.97 5.189c-12.818-9.157-30.368-15.107-49.9-15.87l8.544-39.981l27.773 5.95c.307 7.02 6.104 12.667 13.278 12.667c7.324 0 13.275-5.95 13.275-13.278c0-7.324-5.95-13.275-13.275-13.275c-5.188 0-9.768 3.052-11.904 7.478l-30.976-6.562c-.916-.154-1.832 0-2.443.458c-.763.458-1.22 1.22-1.371 2.136l-9.464 44.558c-19.837.612-37.692 6.562-50.662 15.872a18.74 18.74 0 0 0-12.971-5.188c-10.377 0-18.617 8.391-18.617 18.617c0 7.629 4.577 14.037 10.988 16.939a33.6 33.6 0 0 0-.458 5.646c0 28.686 33.42 52.036 74.621 52.036c41.202 0 74.622-23.196 74.622-52.036a35 35 0 0 0-.458-5.646c6.408-2.902 10.985-9.464 10.985-17.093M85.272 142.495c0-7.324 5.95-13.275 13.278-13.275c7.324 0 13.275 5.95 13.275 13.275s-5.95 13.278-13.275 13.278c-7.327.15-13.278-5.953-13.278-13.278m74.317 35.251c-9.156 9.157-26.553 9.768-31.588 9.768c-5.188 0-22.584-.765-31.59-9.768c-1.371-1.373-1.371-3.51 0-4.883c1.374-1.371 3.51-1.371 4.884 0c5.8 5.8 18.008 7.782 26.706 7.782s21.058-1.983 26.704-7.782c1.374-1.371 3.51-1.371 4.884 0c1.22 1.373 1.22 3.51 0 4.883m-2.443-21.822c-7.325 0-13.275-5.95-13.275-13.275s5.95-13.275 13.275-13.275c7.327 0 13.277 5.95 13.277 13.275c0 7.17-5.95 13.275-13.277 13.275\\\"/>\",\n  },\n  \"tiktok\": {\n    viewBox: \"0 0 256 290\",\n    body: \"<path fill=\\\"#ff004f\\\" d=\\\"M189.72 104.421c18.678 13.345 41.56 21.197 66.273 21.197v-47.53a67 67 0 0 1-13.918-1.456v37.413c-24.711 0-47.59-7.851-66.272-21.195v96.996c0 48.523-39.356 87.855-87.9 87.855c-18.113 0-34.949-5.473-48.934-14.86c15.962 16.313 38.222 26.432 62.848 26.432c48.548 0 87.905-39.332 87.905-87.857v-96.995zm17.17-47.952c-9.546-10.423-15.814-23.893-17.17-38.785v-6.113h-13.189c3.32 18.927 14.644 35.097 30.358 44.898M69.673 225.607a40 40 0 0 1-8.203-24.33c0-22.192 18.001-40.186 40.21-40.186a40.3 40.3 0 0 1 12.197 1.883v-48.593c-4.61-.631-9.262-.9-13.912-.801v37.822a40.3 40.3 0 0 0-12.203-1.882c-22.208 0-40.208 17.992-40.208 40.187c0 15.694 8.997 29.281 22.119 35.9\\\"/><path d=\\\"M175.803 92.849c18.683 13.344 41.56 21.195 66.272 21.195V76.631c-13.794-2.937-26.005-10.141-35.186-20.162c-15.715-9.802-27.038-25.972-30.358-44.898h-34.643v189.843c-.079 22.132-18.049 40.052-40.21 40.052c-13.058 0-24.66-6.221-32.007-15.86c-13.12-6.618-22.118-20.206-22.118-35.898c0-22.193 18-40.187 40.208-40.187c4.255 0 8.356.662 12.203 1.882v-37.822c-47.692.985-86.047 39.933-86.047 87.834c0 23.912 9.551 45.589 25.053 61.428c13.985 9.385 30.82 14.86 48.934 14.86c48.545 0 87.9-39.335 87.9-87.857z\\\"/><path fill=\\\"#00f2ea\\\" d=\\\"M242.075 76.63V66.516a66.3 66.3 0 0 1-35.186-10.047a66.47 66.47 0 0 0 35.186 20.163M176.53 11.57a68 68 0 0 1-.728-5.457V0h-47.834v189.845c-.076 22.13-18.046 40.05-40.208 40.05a40.06 40.06 0 0 1-18.09-4.287c7.347 9.637 18.949 15.857 32.007 15.857c22.16 0 40.132-17.918 40.21-40.05V11.571zM99.966 113.58v-10.769a89 89 0 0 0-12.061-.818C39.355 101.993 0 141.327 0 189.845c0 30.419 15.467 57.227 38.971 72.996c-15.502-15.838-25.053-37.516-25.053-61.427c0-47.9 38.354-86.848 86.048-87.833\\\"/>\",\n  },\n  \"instagram\": {\n    viewBox: \"0 0 256 256\",\n    body: \"<path fill=\\\"#0a0a08\\\" d=\\\"M128 23.064c34.177 0 38.225.13 51.722.745c12.48.57 19.258 2.655 23.769 4.408c5.974 2.322 10.238 5.096 14.717 9.575s7.253 8.743 9.575 14.717c1.753 4.511 3.838 11.289 4.408 23.768c.615 13.498.745 17.546.745 51.723s-.13 38.226-.745 51.723c-.57 12.48-2.655 19.257-4.408 23.768c-2.322 5.974-5.096 10.239-9.575 14.718s-8.743 7.253-14.717 9.574c-4.511 1.753-11.289 3.839-23.769 4.408c-13.495.616-17.543.746-51.722.746s-38.228-.13-51.723-.746c-12.48-.57-19.257-2.655-23.768-4.408c-5.974-2.321-10.239-5.095-14.718-9.574c-4.479-4.48-7.253-8.744-9.574-14.718c-1.753-4.51-3.839-11.288-4.408-23.768c-.616-13.497-.746-17.545-.746-51.723s.13-38.225.746-51.722c.57-12.48 2.655-19.258 4.408-23.769c2.321-5.974 5.095-10.238 9.574-14.717c4.48-4.48 8.744-7.253 14.718-9.575c4.51-1.753 11.288-3.838 23.768-4.408c13.497-.615 17.545-.745 51.723-.745M128 0C93.237 0 88.878.147 75.226.77c-13.625.622-22.93 2.786-31.071 5.95c-8.418 3.271-15.556 7.648-22.672 14.764S9.991 35.738 6.72 44.155C3.555 52.297 1.392 61.602.77 75.226C.147 88.878 0 93.237 0 128s.147 39.122.77 52.774c.622 13.625 2.785 22.93 5.95 31.071c3.27 8.417 7.647 15.556 14.763 22.672s14.254 11.492 22.672 14.763c8.142 3.165 17.446 5.328 31.07 5.95c13.653.623 18.012.77 52.775.77s39.122-.147 52.774-.77c13.624-.622 22.929-2.785 31.07-5.95c8.418-3.27 15.556-7.647 22.672-14.763s11.493-14.254 14.764-22.672c3.164-8.142 5.328-17.446 5.95-31.07c.623-13.653.77-18.012.77-52.775s-.147-39.122-.77-52.774c-.622-13.624-2.786-22.929-5.95-31.07c-3.271-8.418-7.648-15.556-14.764-22.672S220.262 9.99 211.845 6.72c-8.142-3.164-17.447-5.328-31.071-5.95C167.122.147 162.763 0 128 0m0 62.27c-36.302 0-65.73 29.43-65.73 65.73s29.428 65.73 65.73 65.73c36.301 0 65.73-29.428 65.73-65.73c0-36.301-29.429-65.73-65.73-65.73m0 108.397c-23.564 0-42.667-19.103-42.667-42.667S104.436 85.333 128 85.333s42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667m83.686-110.994c0 8.484-6.876 15.36-15.36 15.36s-15.36-6.876-15.36-15.36s6.877-15.36 15.36-15.36s15.36 6.877 15.36 15.36\\\"/>\",\n  },\n  \"telegram\": {\n    viewBox: \"0 0 256 256\",\n    body: \"<defs><linearGradient id=\\\"SVG6DaOZcwt\\\" x1=\\\"50%\\\" x2=\\\"50%\\\" y1=\\\"0%\\\" y2=\\\"100%\\\"><stop offset=\\\"0%\\\" stop-color=\\\"#2aabee\\\"/><stop offset=\\\"100%\\\" stop-color=\\\"#229ed9\\\"/></linearGradient></defs><path fill=\\\"url(#SVG6DaOZcwt)\\\" d=\\\"M128 0C94.06 0 61.48 13.494 37.5 37.49A128.04 128.04 0 0 0 0 128c0 33.934 13.5 66.514 37.5 90.51C61.48 242.506 94.06 256 128 256s66.52-13.494 90.5-37.49c24-23.996 37.5-56.576 37.5-90.51s-13.5-66.514-37.5-90.51C194.52 13.494 161.94 0 128 0\\\"/><path fill=\\\"#fff\\\" d=\\\"M57.94 126.648q55.98-24.384 74.64-32.152c35.56-14.786 42.94-17.354 47.76-17.441c1.06-.017 3.42.245 4.96 1.49c1.28 1.05 1.64 2.47 1.82 3.467c.16.996.38 3.266.2 5.038c-1.92 20.24-10.26 69.356-14.5 92.026c-1.78 9.592-5.32 12.808-8.74 13.122c-7.44.684-13.08-4.912-20.28-9.63c-11.26-7.386-17.62-11.982-28.56-19.188c-12.64-8.328-4.44-12.906 2.76-20.386c1.88-1.958 34.64-31.748 35.26-34.45c.08-.338.16-1.598-.6-2.262c-.74-.666-1.84-.438-2.64-.258c-1.14.256-19.12 12.152-54 35.686c-5.1 3.508-9.72 5.218-13.88 5.128c-4.56-.098-13.36-2.584-19.9-4.708c-8-2.606-14.38-3.984-13.82-8.41c.28-2.304 3.46-4.662 9.52-7.072\\\"/>\",\n  },\n  \"whatsapp\": {\n    viewBox: \"0 0 256 258\",\n    body: \"<defs><linearGradient id=\\\"SVGK3KZq49U\\\" x1=\\\"50%\\\" x2=\\\"50%\\\" y1=\\\"100%\\\" y2=\\\"0%\\\"><stop offset=\\\"0%\\\" stop-color=\\\"#1faf38\\\"/><stop offset=\\\"100%\\\" stop-color=\\\"#60d669\\\"/></linearGradient><linearGradient id=\\\"SVGefMkoEOd\\\" x1=\\\"50%\\\" x2=\\\"50%\\\" y1=\\\"100%\\\" y2=\\\"0%\\\"><stop offset=\\\"0%\\\" stop-color=\\\"#f9f9f9\\\"/><stop offset=\\\"100%\\\" stop-color=\\\"#fff\\\"/></linearGradient></defs><path fill=\\\"url(#SVGK3KZq49U)\\\" d=\\\"M5.463 127.456c-.006 21.677 5.658 42.843 16.428 61.499L4.433 252.697l65.232-17.104a123 123 0 0 0 58.8 14.97h.054c67.815 0 123.018-55.183 123.047-123.01c.013-32.867-12.775-63.773-36.009-87.025c-23.23-23.25-54.125-36.061-87.043-36.076c-67.823 0-123.022 55.18-123.05 123.004\\\"/><path fill=\\\"url(#SVGefMkoEOd)\\\" d=\\\"M1.07 127.416c-.007 22.457 5.86 44.38 17.014 63.704L0 257.147l67.571-17.717c18.618 10.151 39.58 15.503 60.91 15.511h.055c70.248 0 127.434-57.168 127.464-127.423c.012-34.048-13.236-66.065-37.3-90.15C194.633 13.286 162.633.014 128.536 0C58.276 0 1.099 57.16 1.071 127.416m40.24 60.376l-2.523-4.005c-10.606-16.864-16.204-36.352-16.196-56.363C22.614 69.029 70.138 21.52 128.576 21.52c28.3.012 54.896 11.044 74.9 31.06c20.003 20.018 31.01 46.628 31.003 74.93c-.026 58.395-47.551 105.91-105.943 105.91h-.042c-19.013-.01-37.66-5.116-53.922-14.765l-3.87-2.295l-40.098 10.513z\\\"/><path fill=\\\"#fff\\\" d=\\\"M96.678 74.148c-2.386-5.303-4.897-5.41-7.166-5.503c-1.858-.08-3.982-.074-6.104-.074c-2.124 0-5.575.799-8.492 3.984c-2.92 3.188-11.148 10.892-11.148 26.561s11.413 30.813 13.004 32.94c1.593 2.123 22.033 35.307 54.405 48.073c26.904 10.609 32.379 8.499 38.218 7.967c5.84-.53 18.844-7.702 21.497-15.139c2.655-7.436 2.655-13.81 1.859-15.142c-.796-1.327-2.92-2.124-6.105-3.716s-18.844-9.298-21.763-10.361c-2.92-1.062-5.043-1.592-7.167 1.597c-2.124 3.184-8.223 10.356-10.082 12.48c-1.857 2.129-3.716 2.394-6.9.801c-3.187-1.598-13.444-4.957-25.613-15.806c-9.468-8.442-15.86-18.867-17.718-22.056c-1.858-3.184-.199-4.91 1.398-6.497c1.431-1.427 3.186-3.719 4.78-5.578c1.588-1.86 2.118-3.187 3.18-5.311c1.063-2.126.531-3.986-.264-5.579c-.798-1.593-6.987-17.343-9.819-23.64\\\"/>\",\n  },\n  \"bitbucket\": {\n    viewBox: \"0 0 256 231\",\n    body: \"<defs><linearGradient id=\\\"SVGR9diIphF\\\" x1=\\\"108.633%\\\" x2=\\\"46.927%\\\" y1=\\\"13.818%\\\" y2=\\\"78.776%\\\"><stop offset=\\\"18%\\\" stop-color=\\\"#0052cc\\\"/><stop offset=\\\"100%\\\" stop-color=\\\"#2684ff\\\"/></linearGradient></defs><g fill=\\\"none\\\"><path d=\\\"M101.272 152.561h53.449l12.901-75.319H87.06z\\\"/><path fill=\\\"#2684ff\\\" d=\\\"M8.308 0A8.202 8.202 0 0 0 .106 9.516l34.819 211.373a11.155 11.155 0 0 0 10.909 9.31h167.04a8.2 8.2 0 0 0 8.201-6.89l34.82-213.752a8.202 8.202 0 0 0-8.203-9.514zm146.616 152.768h-53.315l-14.436-75.42h80.67z\\\"/><path fill=\\\"url(#SVGR9diIphF)\\\" d=\\\"M244.61 77.242h-76.916l-12.909 75.36h-53.272l-62.902 74.663a11.1 11.1 0 0 0 7.171 2.704H212.73a8.196 8.196 0 0 0 8.196-6.884z\\\"/></g>\",\n  },\n  \"auth0\": {\n    viewBox: \"0 0 256 285\",\n    body: \"<path d=\\\"M220.412 0h-92.415l28.562 89.006h92.416l-74.77 53.077l28.57 89.511c48.128-35.06 63.854-88.12 46.208-142.588zM7.018 89.006h92.416L127.997 0H35.589zc-17.655 54.468-1.92 107.529 46.207 142.588l28.563-89.51zm46.208 142.588l74.77 52.97l74.77-52.97l-74.77-53.847z\\\"/>\",\n  },\n  \"okta\": {\n    viewBox: \"0 0 256 256\",\n    body: \"<path d=\\\"m140.844 1.778l-5.266 64.853a66 66 0 0 0-7.542-.427c-3.203 0-6.334.214-9.393.712l-2.99-31.432a1.72 1.72 0 0 1 1.709-1.848h5.337l-2.562-31.787C120.066.853 120.848 0 121.774 0h17.434c.996 0 1.779.853 1.636 1.849zm-43.976 3.2c-.285-.925-1.281-1.494-2.206-1.138L78.295 9.813c-.925.356-1.352 1.423-.925 2.276l13.307 29.013l-5.052 1.85c-.926.355-1.352 1.421-.926 2.275l13.592 28.515a61 61 0 0 1 15.868-6.044L96.94 4.978zM56.734 23.04l37.643 53.049c-4.768 3.129-9.108 6.827-12.809 11.093L59.011 64.996a1.72 1.72 0 0 1 .071-2.49l4.127-3.413L40.794 36.41c-.711-.711-.64-1.849.142-2.489l13.307-11.164c.783-.64 1.85-.498 2.42.284zM25.139 53.76c-.783-.569-1.921-.284-2.42.569l-8.68 15.075c-.499.854-.143 1.92.71 2.347L43.64 85.404l-2.704 4.623c-.498.853-.142 1.99.783 2.346l28.749 13.156a60.2 60.2 0 0 1 8.254-14.791zM3.862 94.72c.143-.996 1.139-1.564 2.064-1.351l62.976 16.427a62.3 62.3 0 0 0-2.704 16.782l-31.524-2.56a1.642 1.642 0 0 1-1.494-1.991l.925-5.263l-31.808-2.986c-.996-.071-1.637-.996-1.495-1.991l2.99-17.138zm-2.348 42.524c-.996.072-1.637.996-1.494 1.992l3.06 17.137c.142.996 1.138 1.565 2.063 1.351l30.883-8.035l.925 5.262c.143.996 1.139 1.565 2.064 1.351l30.456-8.39c-1.779-5.263-2.917-10.88-3.202-16.64l-64.826 5.972zM11.62 182.33c-.498-.853-.143-1.92.711-2.347l58.778-27.875c2.206 5.262 5.195 10.169 8.753 14.577L54.1 185.031c-.783.569-1.921.356-2.42-.498l-2.704-4.693l-26.257 18.133c-.783.57-1.922.285-2.42-.569l-8.752-15.075zm71.23-12.231L37.094 216.39c-.712.711-.64 1.849.142 2.489l13.378 11.164c.783.64 1.85.498 2.42-.284l18.501-26.027l4.127 3.485c.783.64 1.922.498 2.49-.356l17.933-26.026c-4.839-2.987-9.322-6.614-13.165-10.738zm-9.037 74.31c-.925-.355-1.352-1.421-.925-2.275L100 182.97c4.98 2.56 10.389 4.48 16.01 5.547l-7.97 30.577c-.213.925-1.28 1.494-2.205 1.138l-5.052-1.849l-8.468 30.791c-.285.925-1.281 1.494-2.206 1.138l-16.367-5.973zm46.68-55.11l-5.265 64.853c-.071.996.711 1.849 1.637 1.849h17.434c.996 0 1.779-.853 1.636-1.849l-2.561-31.787h5.336a1.72 1.72 0 0 0 1.708-1.848l-2.988-31.432c-3.06.498-6.191.712-9.393.712c-2.562 0-5.053-.143-7.543-.498m62.763-175.574c.427-.924 0-1.92-.925-2.275l-16.366-5.973c-.926-.356-1.922.213-2.206 1.137l-8.468 30.791l-5.053-1.848c-.925-.356-1.921.213-2.206 1.137l-7.97 30.578c5.693 1.138 11.03 3.058 16.011 5.547zm35.722 25.814L173.222 85.83a62 62 0 0 0-13.165-10.738l17.933-26.026c.569-.783 1.707-.996 2.49-.356l4.127 3.485l18.502-26.027c.57-.782 1.708-.925 2.42-.285l13.377 11.165c.783.64.783 1.778.143 2.489zm24.764 36.409c.925-.427 1.21-1.494.711-2.347L235.7 58.524c-.498-.853-1.637-1.066-2.42-.568l-26.257 18.133l-2.704-4.622c-.499-.854-1.637-1.138-2.42-.498l-25.76 18.347c3.558 4.408 6.476 9.315 8.753 14.577l58.778-27.875zm9.25 23.609l2.99 17.137c.142.996-.499 1.85-1.495 1.991l-64.826 6.045c-.285-5.831-1.424-11.378-3.203-16.64l30.457-8.391c.925-.285 1.921.355 2.063 1.35l.925 5.263l30.884-8.035c.925-.214 1.92.355 2.063 1.35zm-2.917 62.933c.925.213 1.921-.356 2.064-1.351L255.126 144c.143-.996-.498-1.849-1.494-1.991l-31.808-2.987l.925-5.262c.142-.996-.498-1.849-1.495-1.991l-31.523-2.56a62.3 62.3 0 0 1-2.704 16.782l62.976 16.427zM233.28 201.6c-.498.853-1.636 1.067-2.419.569l-53.583-36.978a60.2 60.2 0 0 0 8.254-14.791l28.749 13.156c.925.426 1.28 1.493.783 2.346l-2.704 4.622l28.89 13.654c.854.426 1.21 1.493.712 2.346zm-71.657-21.831l37.643 53.049c.57.782 1.708.924 2.42.284l13.306-11.164c.783-.64.783-1.778.143-2.49l-22.415-22.684l4.127-3.413c.783-.64.783-1.778.07-2.489l-22.557-22.186c-3.771 4.266-8.04 8.035-12.808 11.093zm-.356 72.249c-.925.355-1.921-.214-2.206-1.138l-17.22-62.72a61 61 0 0 0 15.868-6.044l13.592 28.515c.426.925 0 1.991-.926 2.276l-5.052 1.849l13.307 29.013c.427.924 0 1.92-.925 2.275l-16.367 5.974z\\\"/>\",\n  },\n};\n",
  "src/board-native/components/base/social-button/social-providers.ts": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n/**\n * Brand glyphs for the social sign-in buttons.\n *\n * Path data is copied verbatim from two upstream sets, never redrawn:\n *   - Simple Icons (https://simple-icons.org), CC0 1.0 — the 24×24 glyphs.\n *   - Bootstrap Icons (https://icons.getbootstrap.com), MIT — the 16×16\n *     glyphs, used only for LinkedIn, Slack, Microsoft and Amazon, which\n *     Simple Icons removed at the trademark holders' request.\n * Each entry carries its own `viewBox` because the two sets are drawn on\n * different grids; the button scales whichever it gets to the same box.\n *\n * `brand` is the provider's own colour, used when `color=\"brand\"`. The glyphs\n * themselves are monochrome and paint with `currentColor`, so the neutral\n * treatment needs no second copy of the artwork.\n *\n * The logos are trademarks of their owners. Several providers (Google and\n * Apple in particular) publish sign-in button guidelines covering colour,\n * clear space and wording; check them before shipping a production login.\n */\n\nexport type SocialProvider = keyof typeof SOCIAL_PROVIDERS;\n\nexport const SOCIAL_PROVIDERS = {\n  \"google\": {\n    label: \"Google\",\n    // The system's blue token, not Google's own #4285F4. The two are close\n    // enough that showing both in one product reads as a mistake, and the\n    // `colorful` button is a BoardUI control, so it takes the BoardUI blue —\n    // and with it the primary button's exact gradient. The multi-colour G\n    // used by `appearance=\"white\"` is untouched and stays Google's own.\n    brand: \"var(--color-accent-500)\",\n    viewBox: \"0 0 24 24\",\n    path: \"M12.48 10.92v3.28h7.84c-.24 1.84-.853 3.187-1.787 4.133-1.147 1.147-2.933 2.4-6.053 2.4-4.827 0-8.6-3.893-8.6-8.72s3.773-8.72 8.6-8.72c2.6 0 4.507 1.027 5.907 2.347l2.307-2.307C18.747 1.44 16.133 0 12.48 0 5.867 0 .307 5.387.307 12s5.56 12 12.173 12c3.573 0 6.267-1.173 8.373-3.36 2.16-2.16 2.84-5.213 2.84-7.667 0-.76-.053-1.467-.173-2.053H12.48z\",\n  },\n  \"apple\": {\n    label: \"Apple\",\n    brand: \"#000000\",\n    viewBox: \"0 0 24 24\",\n    path: \"M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701\",\n  },\n  \"github\": {\n    label: \"GitHub\",\n    brand: \"#181717\",\n    viewBox: \"0 0 24 24\",\n    path: \"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\",\n  },\n  \"gitlab\": {\n    label: \"GitLab\",\n    brand: \"#FC6D26\",\n    viewBox: \"0 0 24 24\",\n    path: \"m23.6004 9.5927-.0337-.0862L20.3.9814a.851.851 0 0 0-.3362-.405.8748.8748 0 0 0-.9997.0539.8748.8748 0 0 0-.29.4399l-2.2055 6.748H7.5375l-2.2057-6.748a.8573.8573 0 0 0-.29-.4412.8748.8748 0 0 0-.9997-.0537.8585.8585 0 0 0-.3362.4049L.4332 9.5015l-.0325.0862a6.0657 6.0657 0 0 0 2.0119 7.0105l.0113.0087.03.0213 4.976 3.7264 2.462 1.8633 1.4995 1.1321a1.0085 1.0085 0 0 0 1.2197 0l1.4995-1.1321 2.4619-1.8633 5.006-3.7489.0125-.01a6.0682 6.0682 0 0 0 2.0094-7.003z\",\n  },\n  \"microsoft\": {\n    label: \"Microsoft\",\n    brand: \"#5E5E5E\",\n    viewBox: \"0 0 16 16\",\n    path: \"M7.462 0H0v7.19h7.462zM16 0H8.538v7.19H16zM7.462 8.211H0V16h7.462zm8.538 0H8.538V16H16z\",\n  },\n  \"x\": {\n    label: \"X\",\n    brand: \"#000000\",\n    viewBox: \"0 0 24 24\",\n    path: \"M14.234 10.162 22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299-.929-1.329L3.076 1.56h3.182l5.965 8.532.929 1.329 7.754 11.09h-3.182z\",\n  },\n  \"facebook\": {\n    label: \"Facebook\",\n    brand: \"#0866FF\",\n    viewBox: \"0 0 24 24\",\n    path: \"M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z\",\n  },\n  \"linkedin\": {\n    label: \"LinkedIn\",\n    brand: \"#0A66C2\",\n    viewBox: \"0 0 16 16\",\n    path: \"M0 1.146C0 .513.526 0 1.175 0h13.65C15.474 0 16 .513 16 1.146v13.708c0 .633-.526 1.146-1.175 1.146H1.175C.526 16 0 15.487 0 14.854zm4.943 12.248V6.169H2.542v7.225zm-1.2-8.212c.837 0 1.358-.554 1.358-1.248-.015-.709-.52-1.248-1.342-1.248S2.4 3.226 2.4 3.934c0 .694.521 1.248 1.327 1.248zm4.908 8.212V9.359c0-.216.016-.432.08-.586.173-.431.568-.878 1.232-.878.869 0 1.216.662 1.216 1.634v3.865h2.401V9.25c0-2.22-1.184-3.252-2.764-3.252-1.274 0-1.845.7-2.165 1.193v.025h-.016l.016-.025V6.169h-2.4c.03.678 0 7.225 0 7.225z\",\n  },\n  \"discord\": {\n    label: \"Discord\",\n    brand: \"#5865F2\",\n    viewBox: \"0 0 24 24\",\n    path: \"M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189Z\",\n  },\n  \"slack\": {\n    label: \"Slack\",\n    brand: \"#4A154B\",\n    viewBox: \"0 0 16 16\",\n    path: \"M3.362 10.11c0 .926-.756 1.681-1.681 1.681S0 11.036 0 10.111.756 8.43 1.68 8.43h1.682zm.846 0c0-.924.756-1.68 1.681-1.68s1.681.756 1.681 1.68v4.21c0 .924-.756 1.68-1.68 1.68a1.685 1.685 0 0 1-1.682-1.68zM5.89 3.362c-.926 0-1.682-.756-1.682-1.681S4.964 0 5.89 0s1.68.756 1.68 1.68v1.682zm0 .846c.924 0 1.68.756 1.68 1.681S6.814 7.57 5.89 7.57H1.68C.757 7.57 0 6.814 0 5.89c0-.926.756-1.682 1.68-1.682zm6.749 1.682c0-.926.755-1.682 1.68-1.682S16 4.964 16 5.889s-.756 1.681-1.68 1.681h-1.681zm-.848 0c0 .924-.755 1.68-1.68 1.68A1.685 1.685 0 0 1 8.43 5.89V1.68C8.43.757 9.186 0 10.11 0c.926 0 1.681.756 1.681 1.68zm-1.681 6.748c.926 0 1.682.756 1.682 1.681S11.036 16 10.11 16s-1.681-.756-1.681-1.68v-1.682h1.68zm0-.847c-.924 0-1.68-.755-1.68-1.68s.756-1.681 1.68-1.681h4.21c.924 0 1.68.756 1.68 1.68 0 .926-.756 1.681-1.68 1.681z\",\n  },\n  \"figma\": {\n    label: \"Figma\",\n    brand: \"#F24E1E\",\n    viewBox: \"0 0 24 24\",\n    path: \"M15.852 8.981h-4.588V0h4.588c2.476 0 4.49 2.014 4.49 4.49s-2.014 4.491-4.49 4.491zM12.735 7.51h3.117c1.665 0 3.019-1.355 3.019-3.019s-1.355-3.019-3.019-3.019h-3.117V7.51zm0 1.471H8.148c-2.476 0-4.49-2.014-4.49-4.49S5.672 0 8.148 0h4.588v8.981zm-4.587-7.51c-1.665 0-3.019 1.355-3.019 3.019s1.354 3.02 3.019 3.02h3.117V1.471H8.148zm4.587 15.019H8.148c-2.476 0-4.49-2.014-4.49-4.49s2.014-4.49 4.49-4.49h4.588v8.98zM8.148 8.981c-1.665 0-3.019 1.355-3.019 3.019s1.355 3.019 3.019 3.019h3.117V8.981H8.148zM8.172 24c-2.489 0-4.515-2.014-4.515-4.49s2.014-4.49 4.49-4.49h4.588v4.441c0 2.503-2.047 4.539-4.563 4.539zm-.024-7.51a3.023 3.023 0 0 0-3.019 3.019c0 1.665 1.365 3.019 3.044 3.019 1.705 0 3.093-1.376 3.093-3.068v-2.97H8.148zm7.704 0h-.098c-2.476 0-4.49-2.014-4.49-4.49s2.014-4.49 4.49-4.49h.098c2.476 0 4.49 2.014 4.49 4.49s-2.014 4.49-4.49 4.49zm-.097-7.509c-1.665 0-3.019 1.355-3.019 3.019s1.355 3.019 3.019 3.019h.098c1.665 0 3.019-1.355 3.019-3.019s-1.355-3.019-3.019-3.019h-.098z\",\n  },\n  \"notion\": {\n    label: \"Notion\",\n    brand: \"#000000\",\n    viewBox: \"0 0 24 24\",\n    path: \"M4.459 4.208c.746.606 1.026.56 2.428.466l13.215-.793c.28 0 .047-.28-.046-.326L17.86 1.968c-.42-.326-.981-.7-2.055-.607L3.01 2.295c-.466.046-.56.28-.374.466zm.793 3.08v13.904c0 .747.373 1.027 1.214.98l14.523-.84c.841-.046.935-.56.935-1.167V6.354c0-.606-.233-.933-.748-.887l-15.177.887c-.56.047-.747.327-.747.933zm14.337.745c.093.42 0 .84-.42.888l-.7.14v10.264c-.608.327-1.168.514-1.635.514-.748 0-.935-.234-1.495-.933l-4.577-7.186v6.952L12.21 19s0 .84-1.168.84l-3.222.186c-.093-.186 0-.653.327-.746l.84-.233V9.854L7.822 9.76c-.094-.42.14-1.026.793-1.073l3.456-.233 4.764 7.279v-6.44l-1.215-.139c-.093-.514.28-.887.747-.933zM1.936 1.035l13.31-.98c1.634-.14 2.055-.047 3.082.7l4.249 2.986c.7.513.934.653.934 1.213v16.378c0 1.026-.373 1.634-1.68 1.726l-15.458.934c-.98.047-1.448-.093-1.962-.747l-3.129-4.06c-.56-.747-.793-1.306-.793-1.96V2.667c0-.839.374-1.54 1.447-1.632z\",\n  },\n  \"dropbox\": {\n    label: \"Dropbox\",\n    brand: \"#0061FF\",\n    viewBox: \"0 0 24 24\",\n    path: \"M6 1.807L0 5.629l6 3.822 6.001-3.822L6 1.807zM18 1.807l-6 3.822 6 3.822 6-3.822-6-3.822zM0 13.274l6 3.822 6.001-3.822L6 9.452l-6 3.822zM18 9.452l-6 3.822 6 3.822 6-3.822-6-3.822zM6 18.371l6.001 3.822 6-3.822-6-3.822L6 18.371z\",\n  },\n  \"spotify\": {\n    label: \"Spotify\",\n    brand: \"#1ED760\",\n    viewBox: \"0 0 24 24\",\n    path: \"M12 0C5.4 0 0 5.4 0 12s5.4 12 12 12 12-5.4 12-12S18.66 0 12 0zm5.521 17.34c-.24.359-.66.48-1.021.24-2.82-1.74-6.36-2.101-10.561-1.141-.418.122-.779-.179-.899-.539-.12-.421.18-.78.54-.9 4.56-1.021 8.52-.6 11.64 1.32.42.18.479.659.301 1.02zm1.44-3.3c-.301.42-.841.6-1.262.3-3.239-1.98-8.159-2.58-11.939-1.38-.479.12-1.02-.12-1.14-.6-.12-.48.12-1.021.6-1.141C9.6 9.9 15 10.561 18.72 12.84c.361.181.54.78.241 1.2zm.12-3.36C15.24 8.4 8.82 8.16 5.16 9.301c-.6.179-1.2-.181-1.38-.721-.18-.601.18-1.2.72-1.381 4.26-1.26 11.28-1.02 15.721 1.621.539.3.719 1.02.419 1.56-.299.421-1.02.599-1.559.3z\",\n  },\n  \"twitch\": {\n    label: \"Twitch\",\n    brand: \"#9146FF\",\n    viewBox: \"0 0 24 24\",\n    path: \"M11.571 4.714h1.715v5.143H11.57zm4.715 0H18v5.143h-1.714zM6 0L1.714 4.286v15.428h5.143V24l4.286-4.286h3.428L22.286 12V0zm14.571 11.143l-3.428 3.428h-3.429l-3 3v-3H6.857V1.714h13.714Z\",\n  },\n  \"reddit\": {\n    label: \"Reddit\",\n    brand: \"#FF4500\",\n    viewBox: \"0 0 24 24\",\n    path: \"M12 0C5.373 0 0 5.373 0 12c0 3.314 1.343 6.314 3.515 8.485l-2.286 2.286C.775 23.225 1.097 24 1.738 24H12c6.627 0 12-5.373 12-12S18.627 0 12 0Zm4.388 3.199c1.104 0 1.999.895 1.999 1.999 0 1.105-.895 2-1.999 2-.946 0-1.739-.657-1.947-1.539v.002c-1.147.162-2.032 1.15-2.032 2.341v.007c1.776.067 3.4.567 4.686 1.363.473-.363 1.064-.58 1.707-.58 1.547 0 2.802 1.254 2.802 2.802 0 1.117-.655 2.081-1.601 2.531-.088 3.256-3.637 5.876-7.997 5.876-4.361 0-7.905-2.617-7.998-5.87-.954-.447-1.614-1.415-1.614-2.538 0-1.548 1.255-2.802 2.803-2.802.645 0 1.239.218 1.712.585 1.275-.79 2.881-1.291 4.64-1.365v-.01c0-1.663 1.263-3.034 2.88-3.207.188-.911.993-1.595 1.959-1.595Zm-8.085 8.376c-.784 0-1.459.78-1.506 1.797-.047 1.016.64 1.429 1.426 1.429.786 0 1.371-.369 1.418-1.385.047-1.017-.553-1.841-1.338-1.841Zm7.406 0c-.786 0-1.385.824-1.338 1.841.047 1.017.634 1.385 1.418 1.385.785 0 1.473-.413 1.426-1.429-.046-1.017-.721-1.797-1.506-1.797Zm-3.703 4.013c-.974 0-1.907.048-2.77.135-.147.015-.241.168-.183.305.483 1.154 1.622 1.964 2.953 1.964 1.33 0 2.47-.81 2.953-1.964.057-.137-.037-.29-.184-.305-.863-.087-1.795-.135-2.769-.135Z\",\n  },\n  \"tiktok\": {\n    label: \"TikTok\",\n    brand: \"#000000\",\n    viewBox: \"0 0 24 24\",\n    path: \"M12.525.02c1.31-.02 2.61-.01 3.91-.02.08 1.53.63 3.09 1.75 4.17 1.12 1.11 2.7 1.62 4.24 1.79v4.03c-1.44-.05-2.89-.35-4.2-.97-.57-.26-1.1-.59-1.62-.93-.01 2.92.01 5.84-.02 8.75-.08 1.4-.54 2.79-1.35 3.94-1.31 1.92-3.58 3.17-5.91 3.21-1.43.08-2.86-.31-4.08-1.03-2.02-1.19-3.44-3.37-3.65-5.71-.02-.5-.03-1-.01-1.49.18-1.9 1.12-3.72 2.58-4.96 1.66-1.44 3.98-2.13 6.15-1.72.02 1.48-.04 2.96-.04 4.44-.99-.32-2.15-.23-3.02.37-.63.41-1.11 1.04-1.36 1.75-.21.51-.15 1.07-.14 1.61.24 1.64 1.82 3.02 3.5 2.87 1.12-.01 2.19-.66 2.77-1.61.19-.33.4-.67.41-1.06.1-1.79.06-3.57.07-5.36.01-4.03-.01-8.05.02-12.07z\",\n  },\n  \"instagram\": {\n    label: \"Instagram\",\n    brand: \"#FF0069\",\n    viewBox: \"0 0 24 24\",\n    path: \"M7.0301.084c-1.2768.0602-2.1487.264-2.911.5634-.7888.3075-1.4575.72-2.1228 1.3877-.6652.6677-1.075 1.3368-1.3802 2.127-.2954.7638-.4956 1.6365-.552 2.914-.0564 1.2775-.0689 1.6882-.0626 4.947.0062 3.2586.0206 3.6671.0825 4.9473.061 1.2765.264 2.1482.5635 2.9107.308.7889.72 1.4573 1.388 2.1228.6679.6655 1.3365 1.0743 2.1285 1.38.7632.295 1.6361.4961 2.9134.552 1.2773.056 1.6884.069 4.9462.0627 3.2578-.0062 3.668-.0207 4.9478-.0814 1.28-.0607 2.147-.2652 2.9098-.5633.7889-.3086 1.4578-.72 2.1228-1.3881.665-.6682 1.0745-1.3378 1.3795-2.1284.2957-.7632.4966-1.636.552-2.9124.056-1.2809.0692-1.6898.063-4.948-.0063-3.2583-.021-3.6668-.0817-4.9465-.0607-1.2797-.264-2.1487-.5633-2.9117-.3084-.7889-.72-1.4568-1.3876-2.1228C21.2982 1.33 20.628.9208 19.8378.6165 19.074.321 18.2017.1197 16.9244.0645 15.6471.0093 15.236-.005 11.977.0014 8.718.0076 8.31.0215 7.0301.0839m.1402 21.6932c-1.17-.0509-1.8053-.2453-2.2287-.408-.5606-.216-.96-.4771-1.3819-.895-.422-.4178-.6811-.8186-.9-1.378-.1644-.4234-.3624-1.058-.4171-2.228-.0595-1.2645-.072-1.6442-.079-4.848-.007-3.2037.0053-3.583.0607-4.848.05-1.169.2456-1.805.408-2.2282.216-.5613.4762-.96.895-1.3816.4188-.4217.8184-.6814 1.3783-.9003.423-.1651 1.0575-.3614 2.227-.4171 1.2655-.06 1.6447-.072 4.848-.079 3.2033-.007 3.5835.005 4.8495.0608 1.169.0508 1.8053.2445 2.228.408.5608.216.96.4754 1.3816.895.4217.4194.6816.8176.9005 1.3787.1653.4217.3617 1.056.4169 2.2263.0602 1.2655.0739 1.645.0796 4.848.0058 3.203-.0055 3.5834-.061 4.848-.051 1.17-.245 1.8055-.408 2.2294-.216.5604-.4763.96-.8954 1.3814-.419.4215-.8181.6811-1.3783.9-.4224.1649-1.0577.3617-2.2262.4174-1.2656.0595-1.6448.072-4.8493.079-3.2045.007-3.5825-.006-4.848-.0608M16.953 5.5864A1.44 1.44 0 1 0 18.39 4.144a1.44 1.44 0 0 0-1.437 1.4424M5.8385 12.012c.0067 3.4032 2.7706 6.1557 6.173 6.1493 3.4026-.0065 6.157-2.7701 6.1506-6.1733-.0065-3.4032-2.771-6.1565-6.174-6.1498-3.403.0067-6.156 2.771-6.1496 6.1738M8 12.0077a4 4 0 1 1 4.008 3.9921A3.9996 3.9996 0 0 1 8 12.0077\",\n  },\n  \"telegram\": {\n    label: \"Telegram\",\n    brand: \"#26A5E4\",\n    viewBox: \"0 0 24 24\",\n    path: \"M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0a12 12 0 0 0-.056 0zm4.962 7.224c.1-.002.321.023.465.14a.506.506 0 0 1 .171.325c.016.093.036.306.02.472-.18 1.898-.962 6.502-1.36 8.627-.168.9-.499 1.201-.82 1.23-.696.065-1.225-.46-1.9-.902-1.056-.693-1.653-1.124-2.678-1.8-1.185-.78-.417-1.21.258-1.91.177-.184 3.247-2.977 3.307-3.23.007-.032.014-.15-.056-.212s-.174-.041-.249-.024c-.106.024-1.793 1.14-5.061 3.345-.48.33-.913.49-1.302.48-.428-.008-1.252-.241-1.865-.44-.752-.245-1.349-.374-1.297-.789.027-.216.325-.437.893-.663 3.498-1.524 5.83-2.529 6.998-3.014 3.332-1.386 4.025-1.627 4.476-1.635z\",\n  },\n  \"whatsapp\": {\n    label: \"WhatsApp\",\n    brand: \"#25D366\",\n    viewBox: \"0 0 24 24\",\n    path: \"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413Z\",\n  },\n  \"amazon\": {\n    label: \"Amazon\",\n    brand: \"#FF9900\",\n    viewBox: \"0 0 16 16\",\n    path: \"M10.813 11.968c.157.083.36.074.5-.05l.005.005a90 90 0 0 1 1.623-1.405c.173-.143.143-.372.006-.563l-.125-.17c-.345-.465-.673-.906-.673-1.791v-3.3l.001-.335c.008-1.265.014-2.421-.933-3.305C10.404.274 9.06 0 8.03 0 6.017 0 3.77.75 3.296 3.24c-.047.264.143.404.316.443l2.054.22c.19-.009.33-.196.366-.387.176-.857.896-1.271 1.703-1.271.435 0 .929.16 1.188.55.264.39.26.91.257 1.376v.432q-.3.033-.621.065c-1.113.114-2.397.246-3.36.67C3.873 5.91 2.94 7.08 2.94 8.798c0 2.2 1.387 3.298 3.168 3.298 1.506 0 2.328-.354 3.489-1.54l.167.246c.274.405.456.675 1.047 1.166ZM6.03 8.431C6.03 6.627 7.647 6.3 9.177 6.3v.57c.001.776.002 1.434-.396 2.133-.336.595-.87.961-1.465.961-.812 0-1.286-.619-1.286-1.533M.435 12.174c2.629 1.603 6.698 4.084 13.183.997.28-.116.475.078.199.431C13.538 13.96 11.312 16 7.57 16 3.832 16 .968 13.446.094 12.386c-.24-.275.036-.4.199-.299z M13.828 11.943c.567-.07 1.468-.027 1.645.204.135.176-.004.966-.233 1.533-.23.563-.572.961-.762 1.115s-.333.094-.23-.137c.105-.23.684-1.663.455-1.963-.213-.278-1.177-.177-1.625-.13l-.09.009q-.142.013-.233.024c-.193.021-.245.027-.274-.032-.074-.209.779-.556 1.347-.623\",\n  },\n  \"bitbucket\": {\n    label: \"Bitbucket\",\n    brand: \"#0052CC\",\n    viewBox: \"0 0 24 24\",\n    path: \"M.778 1.213a.768.768 0 00-.768.892l3.263 19.81c.084.5.515.868 1.022.873H19.95a.772.772 0 00.77-.646l3.27-20.03a.768.768 0 00-.768-.891zM14.52 15.53H9.522L8.17 8.466h7.561z\",\n  },\n  \"auth0\": {\n    label: \"Auth0\",\n    brand: \"#EB5424\",\n    viewBox: \"0 0 24 24\",\n    path: \"M21.98 7.448L19.62 0H4.347L2.02 7.448c-1.352 4.312.03 9.206 3.815 12.015L12.007 24l6.157-4.552c3.755-2.81 5.182-7.688 3.815-12.015l-6.16 4.58 2.343 7.45-6.157-4.597-6.158 4.58 2.358-7.433-6.188-4.55 7.63-.045L12.008 0l2.356 7.404 7.615.044z\",\n  },\n  \"okta\": {\n    label: \"Okta\",\n    brand: \"#007DC1\",\n    viewBox: \"0 0 24 24\",\n    path: \"M12 0C5.389 0 0 5.35 0 12s5.35 12 12 12 12-5.35 12-12S18.611 0 12 0zm0 18c-3.325 0-6-2.675-6-6s2.675-6 6-6 6 2.675 6 6-2.675 6-6 6z\",\n  },\n} as const;\n",
  "src/board-native/components/base/switch/switch-card.tsx": "/* Adapted from BoardUI public MIT registry. See board-native/LICENSE. */\n\"use client\";\n\nimport type { ComponentType, ReactNode, Ref } from \"react\";\nimport { Switch as AriaSwitch } from \"react-aria-components\";\nimport type { SwitchProps as AriaSwitchProps } from \"react-aria-components\";\nimport { cx } from \"../../../utils/cx.js\";\nimport { SwitchTrack } from \"./switch\";\nimport type { SwitchShape, SwitchSize } from \"./switch\";\n\ntype IconComponent = ComponentType<{\n  className?: string;\n  \"aria-hidden\"?: boolean | \"true\" | \"false\";\n}>;\n\n/**\n * Selectable settings card: title + description on the left, Switch on the\n * right. The whole card toggles (react-aria Switch renders the label), so a\n * click anywhere flips the state — the switch counterpart to CheckboxCard.\n *\n * Card chrome mirrors CheckboxCard, but with rounded-xl (12px) corners:\n *   card   rounded-xl (12px), 1px border/button/default, pl 16 pr 20 py 12\n *   hover  bg background/primary/hover (#f7f7f7)\n *   title  Body 1/Medium, text/primary\n *   desc   Body 1/Regular, text/secondary\n */\n\nexport interface SwitchCardProps extends Omit<AriaSwitchProps, \"children\"> {\n  title: ReactNode;\n  description?: ReactNode;\n  /** Optional 24×24 leading icon — pass a Remix Icon component (`RiMailLine`, not `<RiMailLine />`). */\n  icon?: IconComponent;\n  size?: SwitchSize;\n  shape?: SwitchShape;\n  ref?: Ref<HTMLLabelElement>;\n}\n\nexport function SwitchCard({\n  className,\n  title,\n  description,\n  icon: Icon,\n  size = \"md\",\n  shape = \"pill\",\n  ref,\n  ...props\n}: SwitchCardProps) {\n  return (\n    <AriaSwitch\n      ref={ref}\n      {...props}\n      className={(state) =>\n        cx(\n          \"relative group flex w-full items-center justify-between gap-3 rounded-xl border border-border-button-default py-3 pe-5 ps-4 select-none\",\n          \"transition-colors duration-150 ease\",\n          state.isHovered && !state.isDisabled\n            ? \"bg-background-primary-hover\"\n            : \"bg-background-primary-default\",\n          state.isDisabled ? \"cursor-not-allowed opacity-50\" : \"cursor-pointer\",\n          typeof className === \"function\" ? className(state) : className,\n        )\n      }\n    >\n      {(state) => (\n        <>\n          <span className=\"flex min-w-0 items-center gap-3\">\n            {Icon && <Icon className=\"size-6 shrink-0 text-foreground-icon-secondary\" aria-hidden />}\n            <span className=\"flex min-w-0 flex-col gap-0.5\">\n              <span className=\"truncate text-body-medium text-text-primary\">{title}</span>\n              {description !== undefined && description !== null && (\n                <span className=\"truncate text-body-regular text-text-secondary\">{description}</span>\n              )}\n            </span>\n          </span>\n          <span className=\"flex shrink-0 items-center\">\n            <SwitchTrack state={state} size={size} shape={shape} />\n          </span>\n        </>\n      )}\n    </AriaSwitch>\n  );\n}\n",
  "src/board-native/components/base/switch/switch.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport type { ReactNode, Ref } from \"react\";\nimport { Switch as AriaSwitch } from \"react-aria-components\";\nimport type { SwitchProps as AriaSwitchProps } from \"react-aria-components\";\nimport { cx, sortCx } from \"../../../utils/cx.js\";\n\n/**\n * Figma source: Board UI → \"Toogles\" (node 3856:3807).\n *\n * Two shapes × three sizes, plus off / on:\n *   shape   pill        (Figma \"fully rounded\") — track & thumb rounded-full\n *           rectangle   (Figma \"rectangle\")     — track radius/md-scale, thumb radius/xs-scale\n *   size    sm 28×16 · md 42×24 · lg 56×32   (track w×h; thumb = h − 2·pad)\n *\n * Anatomy (all values 1:1 with Figma):\n *   track   off → bg background/tertiary/default (#ebebeb, no border)\n *           on  → Button/Primary gradient (blue/500 → blue/600) + an inset\n *                 ring + top highlight that scales with size. lg is exactly\n *                 the shared `--shadow-checkbox-selected` token; md/sm scale\n *                 the ring (0.75px / 0.5px) and highlight (1.5px / 1px).\n *   thumb   theme-stable white gradient + contact shadow,\n *           slides by (w − thumb − 2·pad) between states.\n *   chip    small embossed inset in the thumb centre:\n *           off → white→neutral-100 in light mode; in dark mode it matches\n *                 the track so the mark reads like a hole through the thumb;\n *           on  → switch-on-chip-start→end (accent mixes matching Figma's\n *                 raw #2473fe→#0450e2 for blue), accent/600 border.\n *\n * The track visual lives in `SwitchTrack` so `Switch` and `SwitchCard` share it\n * (mirrors how Checkbox / CheckboxCard share `CheckboxGlyph`). Built on\n * react-aria Switch: native toggle semantics, keyboard support, focus-visible\n * ring, optional label via `children`.\n */\n\nexport type SwitchSize = \"sm\" | \"md\" | \"lg\";\nexport type SwitchShape = \"pill\" | \"rectangle\";\n\nexport const switchSizes = sortCx({\n  sm: {\n    track: \"h-4 w-7\",\n    trackRadius: { pill: \"rounded-full\", rectangle: \"rounded-[3px]\" },\n    onShadow: \"shadow-[inset_0_1px_0_0_rgb(255_255_255/0.25),inset_0_0_0_0.5px_var(--color-accent-500)]\",\n    thumb: \"size-3\",\n    thumbRadius: { pill: \"rounded-full\", rectangle: \"rounded-[1px]\" },\n    offset: \"start-0.5 top-0.5\",\n    travel: \"translate-x-3 rtl:-translate-x-3\",\n    chip: \"size-[5px] border-[0.25px] shadow-[0_2px_2px_0_rgb(0_0_0/0.03)]\",\n    chipRadius: { pill: \"rounded-full\", rectangle: \"rounded-[0.5px]\" },\n  },\n  md: {\n    track: \"h-6 w-[42px]\",\n    trackRadius: { pill: \"rounded-full\", rectangle: \"rounded-[4.5px]\" },\n    onShadow: \"shadow-[inset_0_1.5px_0_0_rgb(255_255_255/0.25),inset_0_0_0_0.75px_var(--color-accent-500)]\",\n    thumb: \"size-[18px]\",\n    thumbRadius: { pill: \"rounded-full\", rectangle: \"rounded-[1.5px]\" },\n    offset: \"start-[3px] top-[3px]\",\n    travel: \"translate-x-[18px] rtl:-translate-x-[18px]\",\n    chip: \"size-[7.5px] border-[0.375px] shadow-[0_3px_3px_0_rgb(0_0_0/0.03)]\",\n    chipRadius: { pill: \"rounded-full\", rectangle: \"rounded-[0.75px]\" },\n  },\n  lg: {\n    track: \"h-8 w-14\",\n    trackRadius: { pill: \"rounded-full\", rectangle: \"rounded-md\" },\n    onShadow: \"shadow-checkbox-selected\",\n    thumb: \"size-6\",\n    thumbRadius: { pill: \"rounded-full\", rectangle: \"rounded-xs\" },\n    offset: \"start-1 top-1\",\n    travel: \"translate-x-6 rtl:-translate-x-6\",\n    chip: \"size-[10px] border-[0.5px] shadow-[0_4px_4px_0_rgb(0_0_0/0.03)]\",\n    chipRadius: { pill: \"rounded-full\", rectangle: \"rounded-[1px]\" },\n  },\n});\n\nexport interface SwitchVisualState {\n  isSelected: boolean;\n  isDisabled: boolean;\n  isFocusVisible: boolean;\n}\n\n/**\n * The track + thumb + chip visual. Pure presentation — the react-aria Switch\n * (in `Switch` or `SwitchCard`) owns the input and passes its render state in.\n */\nexport function SwitchTrack({\n  state,\n  size = \"md\",\n  shape = \"pill\",\n}: {\n  state: SwitchVisualState;\n  size?: SwitchSize;\n  shape?: SwitchShape;\n}) {\n  const s = switchSizes[size];\n\n  return (\n    <span\n      aria-hidden\n      className={cx(\n        \"relative shrink-0 transition-colors duration-200 ease\",\n        s.track,\n        s.trackRadius[shape],\n        state.isSelected\n          ? cx(\"bg-linear-to-b from-accent-500 to-accent-600\", s.onShadow)\n          : \"bg-background-tertiary-default\",\n        state.isDisabled && \"opacity-50\",\n        state.isFocusVisible && \"ring-2 ring-border-focus-ring ring-offset-2\",\n      )}\n    >\n      {/* Thumb */}\n      <span\n        className={cx(\n          \"absolute flex items-center justify-center\",\n          \"bg-linear-to-b from-control-indicator-background from-[43.837%] to-control-indicator-background-subtle\",\n          \"shadow-[0_3px_3px_0_rgb(0_0_0/0.03),0_0.75px_0_0_rgb(0_0_0/0.05)]\",\n          \"transition-transform duration-200 ease\",\n          s.thumb,\n          s.thumbRadius[shape],\n          s.offset,\n          state.isSelected && s.travel,\n        )}\n      >\n        {/* Embossed inner chip. Gradient runs bottom→top (`to-t`) — equivalent\n            to the Figma layer's vertical flip — but WITHOUT a transform, so the\n            chip stays pixel-snapped/centred (no blurry 1px shift at sub-pixel\n            sizes) and its drop shadow points down instead of up. */}\n        <span\n          className={cx(\n            \"border-solid bg-linear-to-t from-[43.837%]\",\n            s.chip,\n            s.chipRadius[shape],\n            state.isSelected\n              ? \"border-accent-600 from-switch-on-chip-start to-switch-on-chip-end\"\n              : \"border-border-button-default/50 from-switch-off-chip-start to-switch-off-chip-end\",\n          )}\n        />\n      </span>\n    </span>\n  );\n}\n\nexport interface SwitchProps extends Omit<AriaSwitchProps, \"children\"> {\n  children?: ReactNode;\n  size?: SwitchSize;\n  shape?: SwitchShape;\n  ref?: Ref<HTMLLabelElement>;\n}\n\nexport function Switch({ className, children, size = \"md\", shape = \"pill\", ref, ...props }: SwitchProps) {\n  return (\n    <AriaSwitch\n      ref={ref}\n      {...props}\n      className={(state) =>\n        cx(\n          \"relative group inline-flex items-center gap-2 select-none\",\n          state.isDisabled ? \"cursor-not-allowed\" : \"cursor-pointer\",\n          typeof className === \"function\" ? className(state) : className,\n        )\n      }\n    >\n      {(state) => (\n        <>\n          <SwitchTrack state={state} size={size} shape={shape} />\n          {children != null && children !== false && (\n            <span className=\"text-body-medium text-text-primary\">{children}</span>\n          )}\n        </>\n      )}\n    </AriaSwitch>\n  );\n}\n",
  "src/board-native/components/base/table/table.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport type { Ref } from \"react\";\nimport {\n  Cell,\n  Column,\n  Row,\n  Table as AriaTable,\n  TableBody,\n  TableHeader,\n} from \"react-aria-components\";\nimport type { TableProps as AriaTableProps } from \"react-aria-components\";\nimport { cx } from \"../../../utils/cx.js\";\n\n/**\n * Table primitive — built on react-aria-components `Table` for semantic markup,\n * keyboard navigation, row selection and sortable columns.\n *\n * React Aria's `Column`, `Row`, `Cell`, `TableHeader` and `TableBody` are\n * *collection* components: React Aria introspects them at build time, so they\n * can't be wrapped in custom components without losing that behaviour. We\n * therefore re-export them as-is and apply BoardUI styling through scoped CSS\n * keyed on `.bui-table` (see styles/globals.css). Only the root `<Table>` is\n * wrapped — to add the scroll container and the size flag.\n *\n * Sizes: `md` (h-16 rows) and `sm` (h-12 rows), set once via `data-size`.\n *\n * Pair with @tanstack/react-table when you need sorting / filtering /\n * pagination logic (see the advanced Data Table example).\n */\n\nexport type TableSize = \"sm\" | \"md\";\n\nexport interface TableProps extends Omit<AriaTableProps, \"className\"> {\n  size?: TableSize;\n  className?: string;\n  /** Class for the scroll container that wraps the table. */\n  containerClassName?: string;\n  ref?: Ref<HTMLTableElement>;\n}\n\nexport function Table({ size = \"md\", className, containerClassName, ref, ...props }: TableProps) {\n  return (\n    <div className={cx(\"w-full overflow-x-auto\", containerClassName)}>\n      <AriaTable\n        ref={ref}\n        {...props}\n        className={cx(\"bui-table\", size === \"sm\" && \"bui-table-sm\", className)}\n      />\n    </div>\n  );\n}\n\nexport {\n  TableHeader,\n  Column as TableColumn,\n  TableBody,\n  Row as TableRow,\n  Cell as TableCell,\n};\n",
  "src/board-native/components/base/tabs/pill-tab.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { useDirection } from \"../../foundations/direction/direction.js\";\nimport { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport type { ComponentType, HTMLAttributes, ReactNode, Ref } from \"react\";\nimport { cx, sortCx } from \"../../../utils/cx.js\";\n\nconst useIsomorphicLayoutEffect = typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n\n/**\n * Figma source: Board UI → \"ai_chat\" → Changes / Browser panel switcher\n * (node 4030:5993 region) — the fully-rounded pill tab, in two styles:\n *\n *   pill      px 8, py 5, gap 4\n *   blue      fully rounded (40px); selected bg uses the semantic blue pill\n *             surface, icon + label color/blue/500 (the AI chat panel switcher)\n *   gray      radius/2lg (10px); selected bg background/tertiary, label\n *             text/primary (quieter — scope/filter rows like the settings\n *             Tools page)\n *   idle      label text/secondary, icon foreground/icon/secondary,\n *             background/primary/hover on hover (both styles)\n *   icon      optional 20px leading glyph\n *\n * `PillTabList` owns the animated selection background so it can slide\n * between pills with a subtle spring-like settle. `PillTab` remains a plain\n * button (not a React Aria Tabs collection): these switchers drive local view\n * state, not routed tab panels.\n */\n\ntype IconComponent = ComponentType<{\n  className?: string;\n  \"aria-hidden\"?: boolean | \"true\" | \"false\";\n}>;\n\nexport type PillTabVariant = \"blue\" | \"gray\";\n\nconst styles = sortCx({\n  radius: {\n    blue: \"rounded-full\",\n    gray: \"rounded-2lg\",\n  },\n  thumb: {\n    blue: \"bg-pill-tab-blue-selected-background\",\n    gray: \"bg-background-tertiary-default\",\n  },\n  hover: {\n    blue: \"bg-pill-tab-blue-hover-background\",\n    gray: \"bg-background-primary-hover\",\n  },\n  selectedIcon: {\n    blue: \"text-[color:var(--hu-brand-text,var(--color-accent-700))]\",\n    gray: \"text-foreground-icon-primary\",\n  },\n  selectedLabel: {\n    blue: \"text-[color:var(--hu-brand-text,var(--color-accent-700))]\",\n    gray: \"text-text-primary\",\n  },\n});\n\ntype Thumb = {\n  left: number;\n  top: number;\n  width: number;\n  height: number;\n  variant: PillTabVariant;\n};\n\nexport interface PillTabListProps extends HTMLAttributes<HTMLDivElement> {\n  ref?: Ref<HTMLDivElement>;\n}\n\nexport function PillTabList({ children, className, ref, ...props }: PillTabListProps) {\n  const direction = useDirection();\n  const innerRef = useRef<HTMLDivElement>(null);\n  const [thumb, setThumb] = useState<Thumb | null>(null);\n\n  useIsomorphicLayoutEffect(() => {\n    const el = innerRef.current;\n    if (!el) return;\n    const measure = () => {\n      const selected = el.querySelector<HTMLElement>(\"[data-pill-selected]\");\n      if (!selected) return;\n      setThumb({\n        left: selected.offsetLeft,\n        top: selected.offsetTop,\n        width: selected.offsetWidth,\n        height: selected.offsetHeight,\n        variant: selected.dataset.pillVariant === \"gray\" ? \"gray\" : \"blue\",\n      });\n    };\n    measure();\n    const ro = new ResizeObserver(measure);\n    ro.observe(el);\n    const observeTabs = () => el.querySelectorAll(\"button\").forEach(tab => ro.observe(tab));\n    observeTabs();\n    const mo = new MutationObserver(() => { observeTabs(); measure(); });\n    mo.observe(el, {\n      attributes: true,\n      childList: true,\n      characterData: true,\n      subtree: true,\n      attributeFilter: [\"data-pill-selected\"],\n    });\n    return () => {\n      mo.disconnect();\n      ro.disconnect();\n    };\n  }, [direction]);\n\n  const setRefs = (node: HTMLDivElement | null) => {\n    innerRef.current = node;\n    if (typeof ref === \"function\") ref(node);\n    else if (ref) (ref as { current: HTMLDivElement | null }).current = node;\n  };\n\n  return (\n    <div\n      ref={setRefs}\n      role=\"group\"\n      className={cx(\"relative inline-flex items-center gap-1\", className)}\n      {...props}\n    >\n      {thumb && (\n        <span\n          aria-hidden\n          className={cx(\n            \"pointer-events-none absolute left-0 top-0\",\n            \"transition-[transform,width,height] duration-300\",\n            \"[transition-timing-function:cubic-bezier(0.34,1.2,0.64,1)]\",\n            styles.radius[thumb.variant],\n            styles.thumb[thumb.variant],\n          )}\n          style={{\n            transform: `translate(${thumb.left}px, ${thumb.top}px)`,\n            width: thumb.width,\n            height: thumb.height,\n          }}\n        />\n      )}\n      {children}\n    </div>\n  );\n}\n\nexport function PillTab({\n  variant = \"blue\",\n  icon: Icon,\n  isSelected,\n  onSelect,\n  children,\n  className,\n}: {\n  variant?: PillTabVariant;\n  icon?: IconComponent;\n  isSelected: boolean;\n  onSelect: () => void;\n  children: ReactNode;\n  className?: string;\n}) {\n  return (\n    <button\n      type=\"button\"\n      aria-pressed={isSelected}\n      data-pill-selected={isSelected ? \"\" : undefined}\n      data-pill-variant={variant}\n      onClick={onSelect}\n      className={cx(\n        \"group relative z-10 flex shrink-0 cursor-pointer items-center gap-1 px-2 py-[5px]\",\n        styles.radius[variant],\n        \"outline-none transition-colors duration-150 ease\",\n        \"focus-visible:ring-2 focus-visible:ring-border-focus-ring\",\n        className,\n      )}\n    >\n      <span\n        aria-hidden\n        className={cx(\n          \"pointer-events-none absolute inset-0 opacity-0\",\n          \"transition-opacity duration-200 ease-out\",\n          styles.radius[variant],\n          styles.hover[variant],\n          !isSelected && \"group-hover:opacity-100\",\n        )}\n      />\n      {Icon && (\n        <Icon\n          className={cx(\n            \"relative z-10 size-5 shrink-0\",\n            isSelected ? styles.selectedIcon[variant] : \"text-foreground-icon-secondary\",\n          )}\n          aria-hidden\n        />\n      )}\n      <span\n        className={cx(\n          \"relative z-10 text-body-medium whitespace-nowrap\",\n          isSelected ? styles.selectedLabel[variant] : \"text-text-secondary\",\n        )}\n      >\n        {children}\n      </span>\n    </button>\n  );\n}\n",
  "src/board-native/components/base/tabs/tabs.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { useDirection } from \"../../foundations/direction/direction.js\";\nimport { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport type { ComponentType, ReactNode, Ref } from \"react\";\nimport {\n  Tab as AriaTab,\n  TabList as AriaTabList,\n  TabPanel as AriaTabPanel,\n  Tabs as AriaTabs,\n} from \"react-aria-components\";\nimport type {\n  TabListProps as AriaTabListProps,\n  TabPanelProps as AriaTabPanelProps,\n  TabProps as AriaTabProps,\n  TabsProps as AriaTabsProps,\n} from \"react-aria-components\";\nimport { cx } from \"../../../utils/cx.js\";\n\nconst useIsomorphicLayoutEffect = typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n\n/**\n * Figma source: Board UI → Tab (node 3793:2942).\n *\n * Underline tabs. The tab strip sits on a 1px border/button/default baseline;\n * the active tab paints a 2px color/blue/600 underline over it.\n *   tab       px 10, py 8, gap 10 (label ↔ count), Body 1 (14/20)\n *     active     text color/blue/600, Medium weight, 2px blue underline\n *     inactive   text/primary, Regular weight, transparent underline\n *   count     radius/sm, px 4, py 1, Caption 1/Medium (12/16)\n *     active     bg color/blue/100, text color/blue/600\n *     inactive   bg black/10 @ 50% opacity, text/primary\n *   icon      optional 16px leading glyph, inherits the label color\n *\n * Built on react-aria Tabs: roving-tabindex arrow-key navigation, automatic\n * activation, and TabList/TabPanel association.\n */\n\ntype IconComponent = ComponentType<{\n  className?: string;\n  \"aria-hidden\"?: boolean | \"true\" | \"false\";\n}>;\n\nexport interface TabsProps extends AriaTabsProps {\n  ref?: Ref<HTMLDivElement>;\n}\n\nexport function Tabs({ className, ref, ...props }: TabsProps) {\n  return (\n    <AriaTabs\n      ref={ref}\n      {...props}\n      className={(state) =>\n        cx(\n          \"flex w-full flex-col gap-4\",\n          state.orientation === \"vertical\" && \"flex-row\",\n          typeof className === \"function\" ? className(state) : className,\n        )\n      }\n    />\n  );\n}\n\nexport interface TabListProps<T extends object> extends AriaTabListProps<T> {\n  ref?: Ref<HTMLDivElement>;\n}\n\ntype Underline = { left: number; width: number };\n\nexport function TabList<T extends object>({ className, ref, ...props }: TabListProps<T>) {\n  const direction = useDirection();\n  const wrapperRef = useRef<HTMLDivElement>(null);\n  const [underline, setUnderline] = useState<Underline | null>(null);\n\n  useIsomorphicLayoutEffect(() => {\n    const el = wrapperRef.current;\n    if (!el) return;\n    const measure = () => {\n      const selected = el.querySelector<HTMLElement>(\"[role='tab'][data-selected]\");\n      if (selected) {\n        setUnderline({ left: selected.offsetLeft, width: selected.offsetWidth });\n        const tab = selected.getBoundingClientRect(), strip = el.getBoundingClientRect();\n        if (tab.left < strip.left) el.scrollLeft += tab.left - strip.left;\n        else if (tab.right > strip.right) el.scrollLeft += tab.right - strip.right;\n      }\n    };\n    measure();\n    const ro = new ResizeObserver(measure);\n    ro.observe(el);\n    // Labels and fonts can change width without resizing the full tab strip.\n    const observeTabs = () => el.querySelectorAll(\"[role='tab']\").forEach(tab => ro.observe(tab));\n    observeTabs();\n    const mo = new MutationObserver(() => { observeTabs(); measure(); });\n    mo.observe(el, { attributes: true, childList: true, characterData: true, subtree: true, attributeFilter: [\"data-selected\"] });\n    return () => {\n      mo.disconnect();\n      ro.disconnect();\n    };\n  }, [direction]);\n\n  return (\n    <div ref={wrapperRef} className=\"relative w-full overflow-x-auto\">\n      <AriaTabList\n        ref={ref}\n        {...props}\n        className={(state) =>\n          cx(\n            \"flex w-full items-center gap-1 border-b border-separator-border\",\n            typeof className === \"function\" ? className(state) : className,\n          )\n        }\n      />\n      {underline && (\n        <span\n          aria-hidden\n          className=\"pointer-events-none absolute bottom-0 left-0 h-0.5 bg-accent-600 transition-[transform,width] duration-200 ease\"\n          style={{\n            transform: `translateX(${underline.left}px)`,\n            width: underline.width,\n          }}\n        />\n      )}\n    </div>\n  );\n}\n\nexport interface TabProps extends Omit<AriaTabProps, \"children\"> {\n  children?: ReactNode;\n  /** Optional leading icon (16px). Inherits the label color. */\n  icon?: IconComponent;\n  /** Optional trailing count badge. */\n  count?: ReactNode;\n  ref?: Ref<HTMLDivElement>;\n}\n\nexport function Tab({ className, children, icon: Icon, count, ref, ...props }: TabProps) {\n  return (\n    <AriaTab\n      ref={ref}\n      {...props}\n      className={(state) =>\n        cx(\n          \"relative inline-flex cursor-pointer items-center gap-2.5 px-2.5 py-2 whitespace-nowrap\",\n          \"outline-none transition-colors duration-150 ease\",\n          \"focus-visible:rounded-sm focus-visible:ring-2 focus-visible:ring-border-focus-ring\",\n          state.isDisabled && \"cursor-not-allowed opacity-50\",\n          typeof className === \"function\" ? className(state) : className,\n        )\n      }\n    >\n      {({ isSelected }) => (\n        <>\n          <span\n            className={cx(\n              \"inline-flex items-center gap-1.5\",\n              isSelected\n                ? \"text-body-medium text-[color:var(--hu-brand-text,var(--color-accent-700))]\"\n                : \"text-body-regular text-text-primary\",\n            )}\n          >\n            {Icon && <Icon className=\"size-4 shrink-0\" aria-hidden />}\n            {children}\n          </span>\n          {count != null && (\n            <span\n              className={cx(\n                \"inline-flex items-center justify-center rounded-sm px-1 py-px text-caption-1-medium whitespace-nowrap\",\n                isSelected\n                  ? \"bg-tab-count-selected-background text-[color:var(--hu-brand-text,var(--color-accent-700))]\"\n                  : \"bg-black/10 text-text-primary opacity-50\",\n              )}\n            >\n              {count}\n            </span>\n          )}\n        </>\n      )}\n    </AriaTab>\n  );\n}\n\nexport interface TabPanelProps extends AriaTabPanelProps {\n  ref?: Ref<HTMLDivElement>;\n}\n\nexport function TabPanel({ className, ref, ...props }: TabPanelProps) {\n  return (\n    <AriaTabPanel\n      ref={ref}\n      {...props}\n      className={(state) =>\n        cx(\n          \"outline-none focus-visible:rounded-sm focus-visible:ring-2 focus-visible:ring-border-focus-ring\",\n          typeof className === \"function\" ? className(state) : className,\n        )\n      }\n    />\n  );\n}\n",
  "src/board-native/components/base/textarea/textarea.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport {\n  useContext,\n  useLayoutEffect,\n  useRef,\n  useState,\n  type ReactNode,\n  type Ref,\n} from \"react\";\nimport { Group as AriaGroup, TextArea as AriaTextArea } from \"react-aria-components\";\nimport type { TextAreaProps as AriaTextAreaProps } from \"react-aria-components\";\nimport { HintText } from \"../input/hint-text.js\";\nimport { Label } from \"../input/label.js\";\nimport {\n  TextField,\n  TextFieldContext,\n  type InputSize,\n  type TextFieldProps,\n} from \"../input/input.js\";\nimport { cx, sortCx } from \"../../../utils/cx.js\";\n\n/**\n * Multiline sibling of `Input` — same React Aria plumbing, same field shell,\n * same tokens. It reuses `Input`'s `TextField`, `Label` and `HintText`, so a\n * textarea sitting next to an input in a form lines up to the pixel.\n *\n * Architecture (mirrors input.tsx):\n *\n *   TextareaBase — the styled shell. Renders <AriaGroup> + <AriaTextArea>.\n *                  State (hover / focus / disabled / invalid) arrives as\n *                  render-prop booleans from Aria.\n *   Textarea     — opinionated composition: TextField → Label → TextareaBase\n *                  → HintText (+ optional character counter). The component\n *                  most consumers use.\n *\n * What a textarea adds over the single-line field:\n *   - `rows` sets the resting height (3 lines by default)\n *   - `autoResize` grows the field a line at a time up to `maxRows`, then\n *     scrolls — the pattern the composer prompt uses\n *   - `resize` exposes the native grab handle, off when `autoResize` is on\n *   - `showCount` pairs with `maxLength` for the counter settings pages want\n */\n\ntype TextareaSize = InputSize;\n\nexport type TextareaResize = \"none\" | \"vertical\";\n\n/* -------------------------------------------------------------------------- */\n/*  TextareaBase                                                               */\n/* -------------------------------------------------------------------------- */\n\nexport interface TextareaBaseProps\n  extends Omit<AriaTextAreaProps, \"size\" | \"className\" | \"rows\"> {\n  size?: TextareaSize;\n  className?: string;\n  /** Resting height, in lines. Also the floor when `autoResize` is on. */\n  rows?: number;\n  /** Grow with the content instead of scrolling at `rows`. */\n  autoResize?: boolean;\n  /** Ceiling for `autoResize`, in lines. Past it the field scrolls. */\n  maxRows?: number;\n  /** Native resize handle. Ignored (forced `none`) while `autoResize` is on. */\n  resize?: TextareaResize;\n  /** Class for the field shell. */\n  fieldClassName?: string;\n  /** Ref to the <textarea> element. */\n  ref?: Ref<HTMLTextAreaElement>;\n  /** Ref to the field shell wrapper. */\n  groupRef?: Ref<HTMLDivElement>;\n}\n\nconst textareaStyles = sortCx({\n  field: [\n    \"relative flex w-full flex-col\",\n    \"rounded-2lg\",\n    \"bg-background-tertiary-default text-foreground-icon-tertiary\",\n    \"ring-2 ring-inset ring-transparent\",\n    \"transition-[background-color,box-shadow,color] duration-[var(--input-transition-ms)] ease\",\n  ].join(\" \"),\n\n  // Matches Input's insets, so a stacked input and textarea share one edge:\n  // 8px shell + 4px on the control = 12px to the text (10px at `small`).\n  fieldSize: {\n    medium: \"p-2\",\n    small: \"px-1.5 py-2\",\n  },\n\n  textarea: [\n    \"block w-full min-w-0 bg-transparent border-0 outline-none m-0 p-0 px-1\",\n    \"font-sans text-body-regular text-text-primary\",\n    \"placeholder:text-text-tertiary\",\n    \"focus:placeholder:text-text-primary\",\n    \"disabled:text-input-disabled-text disabled:placeholder:text-input-disabled-text\",\n    \"disabled:cursor-not-allowed\",\n    \"aria-invalid:placeholder:text-text-error-placeholder\",\n  ].join(\" \"),\n\n  resize: {\n    none: \"resize-none\",\n    vertical: \"resize-y\",\n  },\n\n  footer: \"flex w-full items-start justify-between gap-3\",\n  count: \"ms-auto shrink-0 pt-px text-caption-1-medium text-text-tertiary tabular-nums\",\n});\n\n/** Fallback line box for `text-body-regular` (14/20) before styles resolve. */\nconst FALLBACK_LINE_HEIGHT = 20;\n\nexport function TextareaBase({\n  size: sizeProp,\n  rows = 3,\n  autoResize = false,\n  maxRows,\n  resize = \"vertical\",\n  fieldClassName,\n  className,\n  ref,\n  groupRef,\n  onInput,\n  ...textareaProps\n}: TextareaBaseProps) {\n  const ctx = useContext(TextFieldContext);\n  const size: TextareaSize = sizeProp ?? ctx.size ?? \"medium\";\n  const innerRef = useRef<HTMLTextAreaElement | null>(null);\n\n  const attachRef = (node: HTMLTextAreaElement | null) => {\n    innerRef.current = node;\n    if (typeof ref === \"function\") ref(node);\n    else if (ref) (ref as { current: HTMLTextAreaElement | null }).current = node;\n  };\n\n  // Measure from zero so the field shrinks back as well as grows. Reading the\n  // computed line box keeps the floor and ceiling honest when a consumer\n  // overrides the type scale through `className`.\n  const fit = () => {\n    const field = innerRef.current;\n    if (!field) return;\n    if (!autoResize) {\n      field.style.height = \"\";\n      field.style.maxHeight = \"\";\n      field.style.overflowY = \"\";\n      return;\n    }\n    const line =\n      parseFloat(window.getComputedStyle(field).lineHeight) || FALLBACK_LINE_HEIGHT;\n    const ceiling = maxRows ? maxRows * line : Infinity;\n    field.style.height = \"0px\";\n    const next = Math.max(field.scrollHeight, rows * line);\n    field.style.height = `${Math.min(next, ceiling)}px`;\n    field.style.maxHeight = maxRows ? `${ceiling}px` : \"\";\n    field.style.overflowY = next > ceiling ? \"auto\" : \"hidden\";\n  };\n\n  // No dependency list: typing on an uncontrolled field re-renders nothing,\n  // so `onInput` handles keystrokes and this catches every other reason the\n  // value moved (a controlled parent, a form reset, an autofill).\n  useLayoutEffect(fit);\n\n  return (\n    <AriaGroup\n      ref={groupRef}\n      className={({ isFocusWithin, isHovered, isDisabled, isInvalid }) =>\n        cx(\n          textareaStyles.field,\n          textareaStyles.fieldSize[size],\n          // Hover: idle, no focus, no disabled, no invalid\n          isHovered &&\n            !isFocusWithin &&\n            !isDisabled &&\n            !isInvalid &&\n            \"ring-border-button-hover\",\n          // Focus wins over hover\n          isFocusWithin &&\n            !isDisabled &&\n            !isInvalid &&\n            \"ring-border-button-active\",\n          // Disabled\n          isDisabled &&\n            \"bg-input-disabled-background text-input-disabled-foreground\",\n          // Invalid\n          isInvalid && \"bg-background-tertiary-error text-foreground-icon-error\",\n          ctx.fieldClassName,\n          fieldClassName,\n        )\n      }\n    >\n      <AriaTextArea\n        ref={attachRef}\n        rows={rows}\n        {...textareaProps}\n        onInput={(event) => {\n          fit();\n          onInput?.(event);\n        }}\n        className={cx(\n          textareaStyles.textarea,\n          textareaStyles.resize[autoResize ? \"none\" : resize],\n          ctx.inputClassName,\n          className,\n        )}\n      />\n    </AriaGroup>\n  );\n}\n\nTextareaBase.displayName = \"TextareaBase\";\n\n/* -------------------------------------------------------------------------- */\n/*  Textarea (composed)                                                        */\n/* -------------------------------------------------------------------------- */\n\nexport interface TextareaProps\n  extends Omit<TextFieldProps, \"children\">,\n    Pick<\n      TextareaBaseProps,\n      | \"rows\"\n      | \"autoResize\"\n      | \"maxRows\"\n      | \"resize\"\n      | \"fieldClassName\"\n      | \"groupRef\"\n      | \"ref\"\n    > {\n  label?: ReactNode;\n  hint?: ReactNode;\n  /** Show an info icon next to the label. Replace with tooltip when Tooltip lands. */\n  tooltip?: boolean | string;\n  placeholder?: string;\n  /** Hard character limit, enforced by the browser. */\n  maxLength?: number;\n  /** Show the character counter under the field (`12/280` with `maxLength`). */\n  showCount?: boolean;\n}\n\nexport function Textarea({\n  label,\n  hint,\n  tooltip,\n  placeholder,\n  rows,\n  autoResize,\n  maxRows,\n  resize,\n  maxLength,\n  showCount = false,\n  fieldClassName,\n  ref,\n  groupRef,\n  className,\n  value,\n  defaultValue,\n  onChange,\n  ...textFieldProps\n}: TextareaProps) {\n  // The counter needs the value, and React Aria's render props don't carry it.\n  // Controlled fields read straight from the prop; uncontrolled ones keep the\n  // length here so a keystroke re-renders the counter and nothing else.\n  const [typedLength, setTypedLength] = useState(() => (defaultValue ?? \"\").length);\n  const count = value !== undefined ? value.length : typedLength;\n\n  return (\n    <TextField\n      {...textFieldProps}\n      value={value}\n      defaultValue={defaultValue}\n      onChange={(next) => {\n        if (showCount && value === undefined) setTypedLength(next.length);\n        onChange?.(next);\n      }}\n      className={className}\n      // Don't clobber an explicit aria-label; fall back to the placeholder\n      // only for unlabelled fields that don't provide one.\n      aria-label={\n        textFieldProps[\"aria-label\"] ??\n        (!label && typeof placeholder === \"string\" ? placeholder : undefined)\n      }\n    >\n      {({ isRequired, isInvalid }) => (\n        <>\n          {label && (\n            <Label\n              isRequired={isRequired}\n              isInvalid={isInvalid}\n              tooltip={tooltip}\n            >\n              {label}\n            </Label>\n          )}\n          <TextareaBase\n            ref={ref}\n            groupRef={groupRef}\n            placeholder={placeholder}\n            rows={rows}\n            autoResize={autoResize}\n            maxRows={maxRows}\n            resize={resize}\n            maxLength={maxLength}\n            fieldClassName={fieldClassName}\n          />\n          {(hint || showCount) && (\n            <div className={textareaStyles.footer}>\n              {hint && <HintText isInvalid={isInvalid}>{hint}</HintText>}\n              {showCount && (\n                <span\n                  className={cx(\n                    textareaStyles.count,\n                    isInvalid && \"text-text-error-primary\",\n                  )}\n                >\n                  {maxLength ? `${count}/${maxLength}` : count}\n                </span>\n              )}\n            </div>\n          )}\n        </>\n      )}\n    </TextField>\n  );\n}\n\nTextarea.displayName = \"Textarea\";\n",
  "src/board-native/components/base/tooltip/tooltip.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport type { ComponentProps, ReactNode } from \"react\";\nimport {\n  OverlayArrow as AriaOverlayArrow,\n  Tooltip as AriaTooltip,\n  TooltipTrigger as AriaTooltipTrigger,\n} from \"react-aria-components\";\nimport type { TooltipProps as AriaTooltipProps } from \"react-aria-components\";\nimport { cx, sortCx } from \"../../../utils/cx.js\";\nimport { useDirection } from \"../../foundations/direction/direction.js\";\n\n/**\n * Light-surface tooltip, styled to match the card / dropdown family:\n *   surface  bg background/primary/default (white), 1px border/button/default,\n *            radius/lg (8px), shadow/dropdown, text/primary.\n *   sizes    sm → px 10 py 6, Caption 1/Medium (12px)\n *            md → px 12 py 8, Body 1/Medium   (14px)\n *   arrow    filled caret (background/primary/default); a distinct path per\n *            side (not one path rotated with CSS) faces the trigger via\n *            OverlayArrow's `placement` render prop — see `TOOLTIP_CARETS` below.\n *\n * Behaviour comes from react-aria's TooltipTrigger / Tooltip — hover + focus\n * open, Escape closes, positioning + collision flipping, and the\n * `aria-describedby` wiring onto the trigger. We only dress the surface.\n *\n *   <TooltipTrigger delay={0}>\n *     <Button>Hover me</Button>\n *     <Tooltip size=\"md\">Helpful copy</Tooltip>\n *   </TooltipTrigger>\n *\n * The trigger's single child must be focusable (react-aria `Button`, or any\n * component built on `useFocusable`).\n * BoardUI opens and begins closing immediately. The tooltip surface itself is\n * non-interactive, so moving off the trigger never keeps it open and tooltip\n * copy cannot be selected accidentally.\n */\n\nexport type TooltipSize = \"sm\" | \"md\";\n\nconst sizes = sortCx({\n  sm: \"px-2.5 py-1.5 text-caption-1-medium\",\n  md: \"px-3 py-2 text-body-medium rounded-2lg\",\n});\n\n/**\n * One hand-drawn caret per placement instead of a single path rotated with\n * CSS `transform`. Rotating a non-square (12×7) SVG changes its *visual*\n * footprint (7×12 at 90°) but not its *layout* box — `transform` never\n * affects layout — so `OverlayArrow` (which sizes/positions the arrow using\n * its unrotated 12×7 box) leaves a real ~2.5px gap between the rotated\n * triangle and the tooltip body for `left`/`right`. Each entry below instead\n * has `width`/`height` matching its own true rendered footprint, so the\n * layout box is always exactly right — no transform, no gap.\n *\n * Each path is left open on the edge touching the tooltip body (no \"Z\", so\n * only the two other edges get a stroke), and `shadow` points further along\n * the direction the tip already points — past the tip, never back toward the\n * body — matching the one spot that already looked right by default.\n */\nexport const TOOLTIP_CARETS = sortCx({\n  top: { width: 12, height: 7, path: \"M0 0 L6 6 L12 0\", shadow: \"0 1.5px 1px\" },\n  bottom: { width: 12, height: 7, path: \"M0 7 L6 1 L12 7\", shadow: \"0 -1.5px 1px\" },\n  // left/right carets stick out sideways from the body; their shadow should\n  // still fall *downward* (light-from-top, matching the body's shadow-dropdown)\n  // rather than horizontally, which read as floating.\n  left: { width: 7, height: 12, path: \"M0 0 L6 6 L0 12\", shadow: \"0 1.5px 1px\" },\n  right: { width: 7, height: 12, path: \"M7 0 L1 6 L7 12\", shadow: \"0 1.5px 1px\" },\n});\n\nexport interface TooltipProps extends Omit<AriaTooltipProps, \"children\"> {\n  children?: ReactNode;\n  /** Surface size. `sm` → 12px Caption 1, `md` → 14px Body 1. Default `sm`. */\n  size?: TooltipSize;\n  /** Show the little caret pointing at the trigger. Default `true`. */\n  showArrow?: boolean;\n}\n\nexport function Tooltip({ children, className, size = \"sm\", showArrow = true, offset = 10, ...props }: TooltipProps) {\n  const direction = useDirection();\n  return (\n    <AriaTooltip\n      dir={direction}\n      offset={offset}\n      {...props}\n      className={(state) =>\n        cx(\n          \"pointer-events-none z-50 max-w-[240px] select-none rounded-lg border border-border-button-default bg-background-primary-default text-text-primary shadow-dropdown\",\n          sizes[size],\n          // Blur + scale in/out. react-aria stamps `data-entering` on mount then\n          // removes it (transition to base), and holds the element mounted while\n          // `data-exiting` is set so the same transition plays in reverse. The\n          // `transition` utility covers scale, filter (blur) and opacity.\n          \"transition duration-200 ease-out\",\n          \"data-[entering]:scale-90 data-[entering]:opacity-0 data-[entering]:blur-[4px]\",\n          \"data-[exiting]:scale-90 data-[exiting]:opacity-0 data-[exiting]:blur-[4px]\",\n          typeof className === \"function\" ? className(state) : className,\n        )\n      }\n    >\n      {showArrow && (\n        <AriaOverlayArrow>\n          {({ placement }) => {\n            // `placement` includes react-aria's `\"center\"` (for other overlay\n            // types); this tooltip only ever resolves to one of our 4 sides.\n            const caret = TOOLTIP_CARETS[placement as keyof typeof TOOLTIP_CARETS] ?? TOOLTIP_CARETS.top;\n            return (\n              <svg\n                width={caret.width}\n                height={caret.height}\n                viewBox={`0 0 ${caret.width} ${caret.height}`}\n                className=\"block overflow-visible fill-background-primary-default stroke-border-button-default\"\n                style={{ filter: `drop-shadow(${caret.shadow} rgb(0 0 0 / 0.05))` }}\n              >\n                <path d={caret.path} />\n              </svg>\n            );\n          }}\n        </AriaOverlayArrow>\n      )}\n      {children}\n    </AriaTooltip>\n  );\n}\n\nexport type TooltipTriggerProps = ComponentProps<typeof AriaTooltipTrigger>;\n\nexport function TooltipTrigger({ delay = 0, closeDelay = 0, ...props }: TooltipTriggerProps) {\n  return <AriaTooltipTrigger delay={delay} closeDelay={closeDelay} {...props} />;\n}\n",
  "src/board-native/components/base/tree-view/tree-view.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { useContext, useState } from \"react\";\nimport type { ComponentProps, ComponentType, ContextType, KeyboardEventHandler, ReactNode, Ref } from \"react\";\nimport { AnimatePresence, motion, useIsPresent, useReducedMotion } from \"motion/react\";\nimport { RiArrowRightSLine, RiFileLine, RiFolder3Line, RiFolderOpenLine } from \"@remixicon/react\";\nimport {\n  Button as AriaButton,\n  CollectionRendererContext,\n  DefaultCollectionRenderer,\n  Tree as AriaTree,\n  TreeItem as AriaTreeItem,\n  TreeItemContent,\n  TreeStateContext,\n} from \"react-aria-components\";\nimport type {\n  Key,\n  TreeProps as AriaTreeProps,\n  TreeItemProps as AriaTreeItemProps,\n} from \"react-aria-components\";\nimport { useDirection } from \"../../foundations/direction/direction.js\";\nimport { MENU_ITEM_ACTIVE } from \"../dropdown/menu-styles.js\";\nimport { cx } from \"../../../utils/cx.js\";\n\ntype IconComponent = ComponentType<{\n  className?: string;\n  \"aria-hidden\"?: boolean | \"true\" | \"false\";\n}>;\n\nexport interface TreeViewProps<T extends object> extends AriaTreeProps<T> {\n  /** Medium rows are 36px tall; small rows are 32px. */\n  size?: \"sm\" | \"md\";\n  /** Show connected trunks and curved branches beside nested rows. */\n  showGuides?: boolean;\n  onKeyDownCapture?: KeyboardEventHandler<HTMLDivElement>;\n  ref?: Ref<HTMLDivElement>;\n}\n\n/**\n * A source-owned tree for nested folders and structured content. React Aria\n * manages expansion, selection, typeahead, and locale-aware keyboard navigation.\n * Supply an aria-label or aria-labelledby and stable, unique item ids.\n * The tree grows with its content, leaving scrolling to the enclosing page.\n */\nexport function TreeView<T extends object>({\n  size = \"md\",\n  showGuides = true,\n  selectionMode = \"single\",\n  renderEmptyState = () => \"No items.\",\n  className,\n  onKeyDownCapture,\n  ref,\n  ...props\n}: TreeViewProps<T>) {\n  const direction = useDirection();\n  const parentRenderer = useContext(CollectionRendererContext);\n  const renderer = parentRenderer === DefaultCollectionRenderer && !props.dragAndDropHooks\n    ? TREE_VIEW_RENDERER\n    : parentRenderer;\n\n  return (\n    <div\n      className=\"contents\"\n      onKeyDownCapture={(event) => {\n        onKeyDownCapture?.(event);\n        if (event.defaultPrevented || event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return;\n        if (event.key !== (direction === \"rtl\" ? \"ArrowLeft\" : \"ArrowRight\")) return;\n        const row = event.target;\n        if (!(row instanceof HTMLElement) || row.getAttribute(\"role\") !== \"row\" || row.getAttribute(\"aria-expanded\") !== \"true\") return;\n\n        // React Aria expands closed branches and handles parent navigation.\n        // Complete forward navigation for an already-expanded branch, skipping\n        // disabled rows. Focusing the child also updates React Aria's focus state.\n        const level = Number(row.getAttribute(\"aria-level\"));\n        const tree = row.closest('[role=\"treegrid\"]');\n        const rows = Array.from(tree?.querySelectorAll<HTMLElement>('[role=\"row\"][data-key]') ?? [])\n          .filter((item) => item.closest('[role=\"treegrid\"]') === tree && !item.closest('[data-tree-view-exiting]'));\n        for (let index = rows.indexOf(row) + 1; index < rows.length; index++) {\n          const child = rows[index];\n          if (Number(child.getAttribute(\"aria-level\")) <= level) break;\n          if (child.getAttribute(\"aria-disabled\") !== \"true\") {\n            event.preventDefault();\n            event.stopPropagation();\n            child.focus();\n            return;\n          }\n        }\n      }}\n    >\n      <CollectionRendererContext.Provider value={renderer}>\n        <AriaTree\n          {...props}\n          ref={ref}\n          selectionMode={selectionMode}\n          data-size={size}\n          data-show-guides={showGuides}\n          renderEmptyState={renderEmptyState}\n          className={(state) => cx(\n            \"group/tree-view flex w-full min-w-0 flex-col rounded-3xl border border-border-button-default bg-background-primary-default p-2 outline-none\",\n            renderer === TREE_VIEW_RENDERER ? \"gap-0\" : \"gap-0.5\",\n            \"data-[empty]:px-4 data-[empty]:py-8 data-[empty]:text-center data-[empty]:text-body-regular data-[empty]:text-text-tertiary\",\n            \"data-[focus-visible]:ring-2 data-[focus-visible]:ring-border-focus-ring\",\n            typeof className === \"function\" ? className(state) : className,\n          )}\n        />\n      </CollectionRendererContext.Provider>\n    </div>\n  );\n}\n\nexport interface TreeViewItemProps<T extends object = object>\n  extends Omit<AriaTreeItemProps<T>, \"textValue\" | \"children\"> {\n  /** Visible label, also used for accessible naming and typeahead by default. */\n  label: string;\n  textValue?: string;\n  /** Defaults to a folder for branches and a file for leaves. null hides it. */\n  icon?: IconComponent | null;\n  /** Optional replacement icon while a branch is open. */\n  expandedIcon?: IconComponent;\n  iconClassName?: string;\n  /** Optional metadata or a badge at the end of the row. */\n  trailingContent?: ReactNode;\n  /** Nested TreeViewItem elements or a TreeViewCollection. */\n  children?: ReactNode;\n  ref?: Ref<HTMLDivElement>;\n}\n\nexport function TreeViewItem<T extends object = object>({\n  label,\n  textValue = label,\n  icon,\n  expandedIcon,\n  iconClassName,\n  trailingContent,\n  children,\n  className,\n  style,\n  ref,\n  ...props\n}: TreeViewItemProps<T>) {\n  const direction = useDirection();\n\n  return (\n    <AriaTreeItem\n      {...props}\n      ref={ref}\n      textValue={textValue}\n      style={(state) => ({\n        paddingInlineStart: `calc(0.5rem + ${(state.level - 1)} * 1.25rem)`,\n        ...(typeof style === \"function\" ? style(state) : style),\n      })}\n      className={(state) => cx(\n        \"relative flex min-h-9 min-w-0 cursor-pointer items-center gap-2 rounded-xl pe-2 text-body-regular text-text-primary outline-none\",\n        \"transition-[background-color,color,box-shadow] duration-150 motion-reduce:transition-none\",\n        \"group-data-[size=sm]/tree-view:min-h-8 group-data-[size=sm]/tree-view:text-body-2-regular\",\n        (state.isHovered || state.isPressed || state.isFocusVisible) && !state.isDisabled && MENU_ITEM_ACTIVE,\n        state.isSelected && MENU_ITEM_ACTIVE,\n        state.isFocusVisible && \"ring-2 ring-inset ring-border-focus-ring\",\n        state.isDisabled && \"cursor-default text-text-placeholder\",\n        typeof className === \"function\" ? className(state) : className,\n      )}\n    >\n      <TreeItemContent>\n        {({ hasChildItems, isExpanded, isDisabled, level, state, id }) => {\n          const Icon = icon === null ? null : (\n            isExpanded && expandedIcon\n              ? expandedIcon\n              : icon ?? (hasChildItems ? (isExpanded ? RiFolderOpenLine : RiFolder3Line) : RiFileLine)\n          );\n\n          return (\n            <>\n              <TreeGuides state={state} id={id} level={level} expanded={hasChildItems && isExpanded} branchWidth={hasChildItems ? 12 : 16} direction={direction} />\n              <span className=\"flex shrink-0 items-center gap-1\">\n                {hasChildItems ? (\n                  <AriaButton\n                    slot=\"chevron\"\n                    isDisabled={isDisabled}\n                    className=\"flex size-5 shrink-0 cursor-pointer items-center justify-center rounded-md text-foreground-icon-tertiary outline-none transition-colors hover:text-foreground-icon-primary data-[focus-visible]:ring-2 data-[focus-visible]:ring-border-focus-ring\"\n                  >\n                    <RiArrowRightSLine\n                      aria-hidden\n                      className={cx(\n                        \"size-4 opacity-50 transition-transform duration-150 motion-reduce:transition-none\",\n                        isExpanded ? \"rotate-90\" : direction === \"rtl\" && \"rotate-180\",\n                      )}\n                    />\n                  </AriaButton>\n                ) : (\n                  // Leaves need less disclosure space. Keep root icons aligned,\n                  // and pull nested leaves in so their branch stays compact.\n                  <span aria-hidden className={cx(\"h-5 shrink-0\", level > 1 ? \"w-2\" : \"w-5\")} />\n                )}\n                {Icon && <Icon aria-hidden className={cx(\n                  \"size-4 shrink-0 opacity-50\",\n                  hasChildItems ? \"text-foreground-icon-primary\" : \"text-foreground-icon-secondary\",\n                  iconClassName,\n                )} />}\n              </span>\n              <span className=\"min-w-0 flex-1 truncate text-start\"><bdi>{label}</bdi></span>\n              {trailingContent != null && (\n                <span className=\"ms-auto shrink-0 text-caption-1-regular text-text-tertiary\">{trailingContent}</span>\n              )}\n            </>\n          );\n        }}\n      </TreeItemContent>\n      {children}\n    </AriaTreeItem>\n  );\n}\n\n/** Use Collection for recursive rendering of data-driven trees. */\nexport { Collection as TreeViewCollection } from \"react-aria-components\";\n\nconst TREE_VIEW_RENDERER = {\n  ...DefaultCollectionRenderer,\n  CollectionRoot: AnimatedTreeCollection,\n};\n\nfunction AnimatedTreeCollection({ collection, ...props }: ComponentProps<typeof DefaultCollectionRenderer.CollectionRoot>) {\n  const state = useContext(TreeStateContext);\n  if (!state) return <DefaultCollectionRenderer.CollectionRoot collection={collection} {...props} />;\n\n  return (\n    <AnimatePresence initial={false}>\n      {Array.from(collection).filter((node) => node.type !== \"content\").map((node) => (\n        <AnimatedTreeRow key={node.key} state={state}>\n          {node.render?.(node)}\n        </AnimatedTreeRow>\n      ))}\n    </AnimatePresence>\n  );\n}\n\ntype TreeState = NonNullable<ContextType<typeof TreeStateContext>>;\n\nfunction TreeGuides({ state, id, level, expanded, branchWidth, direction }: {\n  state: TreeState;\n  id: Key;\n  level: number;\n  expanded: boolean;\n  branchWidth: number;\n  direction: \"ltr\" | \"rtl\";\n}) {\n  const node = state.collection.getItem(id);\n  if (!node) return null;\n\n  // A descendant carries an outer trunk only when its ancestor has a sibling\n  // still to come. This keeps the line connected through an expanded subtree,\n  // while the final child's elbow closes that level of the tree.\n  const continuingLevels: number[] = [];\n  let ancestor = node.parentKey != null ? state.collection.getItem(node.parentKey) : null;\n  let ancestorLevel = level - 1;\n  while (ancestor) {\n    if (ancestor.type === \"item\") {\n      if (ancestorLevel > 1 && ancestor.nextKey != null) continuingLevels.push(ancestorLevel - 2);\n      ancestorLevel--;\n    }\n    ancestor = ancestor.parentKey != null ? state.collection.getItem(ancestor.parentKey) : null;\n  }\n\n  const axis = (depth: number) => `calc(1.125rem + ${depth} * 1.25rem)`;\n\n  return (\n    <span aria-hidden data-tree-view-guides className=\"pointer-events-none absolute inset-0 text-foreground-icon-quaternary group-data-[show-guides=false]/tree-view:hidden\">\n      {continuingLevels.map((depth) => (\n        <span key={depth} data-tree-view-trunk className=\"absolute -inset-y-px w-px bg-current\" style={{ insetInlineStart: axis(depth) }} />\n      ))}\n      {level > 1 && (\n        <span data-tree-view-branch className=\"absolute -inset-y-px\" style={{ insetInlineStart: axis(level - 2), width: branchWidth }}>\n          <span className=\"absolute start-0 top-0 w-px bg-current\" style={{ bottom: \"calc(50% + 6px)\" }} />\n          <svg\n            width={branchWidth}\n            height=\"7\"\n            viewBox={`0 0 ${branchWidth} 7`}\n            fill=\"none\"\n            className={cx(\"absolute start-0\", direction === \"rtl\" && \"-scale-x-100\")}\n            style={{ top: \"calc(50% - 6px)\" }}\n          >\n            <path d={`M0.5 0 Q0.5 6 6.5 6 H${branchWidth - 0.5}`} stroke=\"currentColor\" strokeWidth=\"1\" />\n          </svg>\n          {node.nextKey != null && (\n            <span data-tree-view-tail className=\"absolute start-0 bottom-0 w-px bg-current\" style={{ top: \"calc(50% - 6px)\" }} />\n          )}\n        </span>\n      )}\n      {expanded && (\n        <span data-tree-view-bridge className=\"absolute -bottom-px w-px bg-current\" style={{ insetInlineStart: axis(level - 1), top: \"calc(50% + 8px)\" }} />\n      )}\n    </span>\n  );\n}\n\nfunction AnimatedTreeRow({ state, children }: { state: TreeState; children: ReactNode }) {\n  const isPresent = useIsPresent();\n  const reduceMotion = useReducedMotion();\n  const [lastPresentState, setLastPresentState] = useState(state);\n  if (isPresent && lastPresentState !== state) setLastPresentState(state);\n\n  // Preserve the row's last collection while it fades out. The live tree has\n  // already removed it from keyboard navigation; the retained visual is inert.\n  return (\n    <motion.div\n      role=\"presentation\"\n      className=\"relative min-w-0 shrink-0 overflow-hidden\"\n      data-tree-view-exiting={!isPresent || undefined}\n      aria-hidden={!isPresent || undefined}\n      inert={!isPresent}\n      initial={reduceMotion ? false : { height: 0, paddingTop: 0, paddingBottom: 0, opacity: 0, y: -4, filter: \"blur(4px)\" }}\n      animate={{ height: \"auto\", paddingTop: 1, paddingBottom: 1, opacity: 1, y: 0, filter: \"blur(0px)\" }}\n      exit={{ height: 0, paddingTop: 0, paddingBottom: 0, opacity: 0, y: reduceMotion ? 0 : -4, filter: reduceMotion ? \"blur(0px)\" : \"blur(4px)\" }}\n      transition={{ duration: reduceMotion ? 0 : 0.28, ease: [0.22, 1, 0.36, 1] }}\n    >\n      <TreeStateContext.Provider value={isPresent ? state : lastPresentState}>\n        {children}\n      </TreeStateContext.Provider>\n    </motion.div>\n  );\n}\n",
  "src/board-native/components/foundations/direction/direction.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { I18nProvider, useLocale } from \"react-aria-components\";\nimport { cx } from \"../../../utils/cx.js\";\n\nexport type Direction = \"ltr\" | \"rtl\";\n\nexport interface DirectionProviderProps extends Omit<HTMLAttributes<HTMLDivElement>, \"dir\" | \"lang\" | \"children\"> {\n  /** BCP 47 language tag. Arabic and Hebrew resolve to RTL; Chinese to LTR. */\n  locale: string;\n  children: ReactNode;\n}\n\n/** Keeps CSS direction, React Aria keyboard behavior and portalled menus in sync.\n * Use at the app root, or nest providers for regions in another language.\n * The default display: contents boundary preserves the surrounding layout.\n */\nexport function DirectionProvider({ locale, ...props }: DirectionProviderProps) {\n  return (\n    <I18nProvider locale={locale}>\n      <DirectionBoundary {...props} />\n    </I18nProvider>\n  );\n}\n\nfunction DirectionBoundary({ children, className, ...props }: Omit<DirectionProviderProps, \"locale\">) {\n  const { locale, direction } = useLocale();\n  return <div {...props} lang={locale} dir={direction} className={cx(\"contents\", className)}>{children}</div>;\n}\n\n/** Also works inside a React Aria I18nProvider. */\nexport function useDirection(): Direction {\n  return useLocale().direction;\n}\n",
  "src/board-native/components/foundations/icons/chevrons.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\nimport type { SVGProps } from \"react\";\nimport { cx } from \"../../../utils/cx.js\";\n\n/**\n * Custom chevron glyphs drawn as vectors in the Board UI Figma file (they are\n * not Remix icons). Paths are copied 1:1 from the Figma export.\n *\n * All icons render `currentColor` and size via Tailwind `size-*` utilities,\n * exactly like the Remix icon components.\n */\n\ntype IconProps = SVGProps<SVGSVGElement>;\n\n/** 16×16 rounded 2px-stroke chevron. Select triggers, disclosure affordances. */\nexport function ChevronDownSmall(props: IconProps) {\n  return (\n    <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden {...props}>\n      <path\n        d=\"M4 7L7.29289 10.2929C7.68342 10.6834 8.31658 10.6834 8.70711 10.2929L12 7\"\n        stroke=\"currentColor\"\n        strokeWidth=\"2\"\n        strokeLinecap=\"round\"\n      />\n    </svg>\n  );\n}\n\n/** 12×12 rounded 1.5px-stroke chevron. Breadcrumb separator. */\nexport function ChevronRightSmall({ className, ...props }: IconProps) {\n  return (\n    <svg viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden {...props} className={cx(\"rtl:rotate-180\", className)}>\n      <path\n        d=\"M4.5 3L7.14645 5.64645C7.34171 5.84171 7.34171 6.15829 7.14645 6.35355L4.5 9\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.5\"\n        strokeLinecap=\"round\"\n      />\n    </svg>\n  );\n}\n\n/** 16×16 stacked up/down chevrons. Workspace / account switchers. */\nexport function ChevronUpDownSmall(props: IconProps) {\n  return (\n    <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden {...props}>\n      <g transform=\"translate(4.25 2.56)\">\n        <path\n          d=\"M0.75 7.43934L3.21967 9.90901C3.51256 10.2019 3.98744 10.2019 4.28033 9.90901L6.75 7.43934\"\n          stroke=\"currentColor\"\n          strokeWidth=\"1.5\"\n          strokeLinecap=\"round\"\n        />\n        <path\n          d=\"M0.75 3.43934L3.21967 0.96967C3.51256 0.676777 3.98744 0.676777 4.28033 0.96967L6.75 3.43934\"\n          stroke=\"currentColor\"\n          strokeWidth=\"1.5\"\n          strokeLinecap=\"round\"\n        />\n      </g>\n    </svg>\n  );\n}\n\n/** 24×24 filled rounded triangle chevron. Table column sort indicator. */\nexport function ChevronSortDown(props: IconProps) {\n  return (\n    <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden {...props}>\n      <path\n        d=\"M12.7071 15.2929C12.3166 15.6834 11.6834 15.6834 11.2929 15.2929L7.70711 11.7071C7.07714 11.0771 7.52331 10 8.41421 10H15.5858C16.4767 10 16.9229 11.0771 16.2929 11.7071L12.7071 15.2929Z\"\n        fill=\"currentColor\"\n      />\n    </svg>\n  );\n}\n",
  "src/board-native/components/foundations/template-copy/template-copy.tsx": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { cloneElement, createContext, isValidElement, useContext, useMemo, type ReactNode } from \"react\";\n\nexport type TemplateCopyTranslator = (text: string) => string;\ntype CopySettings = { translate: TemplateCopyTranslator; render?: <T>(node: T) => T };\nconst CopyContext = createContext<CopySettings | null>(null);\nconst MenuContext = createContext<ReactNode>(null);\n\n/** Optional application language control shared by template account menus. */\nexport function TemplateMenuProvider({ languageSelector, children }: { languageSelector?: ReactNode; children: ReactNode }) {\n  return <MenuContext.Provider value={languageSelector ?? null}>{children}</MenuContext.Provider>;\n}\n\nexport function useTemplateLanguageSelector() {\n  return useContext(MenuContext);\n}\n\n/** Optional application copy for templates. Without a provider, source copy is unchanged. */\nexport function TemplateCopyProvider({ translate, render, children }: CopySettings & { children: ReactNode }) {\n  const settings = useMemo(() => ({ translate, render }), [translate, render]);\n  return <CopyContext.Provider value={settings}>{children}</CopyContext.Provider>;\n}\n\n// Only display copy is translated. IDs, form values, data keys, URLs, styles,\n// event handlers and application state retain their original values.\nconst textProps = new Set([\n  \"children\", \"title\", \"subtitle\", \"description\", \"label\", \"textValue\", \"placeholder\", \"alt\",\n  \"aria-label\", \"aria-description\", \"metricLabel\", \"emptyMessage\", \"caption\", \"heading\", \"text\", \"content\", \"renderValue\",\n]);\nconst dataProps = new Set([\"items\", \"options\", \"tabs\", \"columns\", \"series\", \"ranges\", \"stats\", \"data\", \"nodes\", \"bar\", \"line\"]);\nconst dataText = new Set([\"label\", \"title\", \"description\", \"subtitle\", \"header\", \"role\", \"joined\"]);\nconst renderProps = new Set([\"children\", \"cell\", \"header\", \"formatter\", \"tickFormatter\", \"labelFormatter\", \"renderItem\", \"node\", \"link\", \"tick\", \"label\", \"content\", \"renderValue\"]);\n\n/** Translate rendered copy while preserving React nodes, collection IDs and callbacks. */\nexport function translateTemplateCopy<T>(value: T, translate: TemplateCopyTranslator): T {\n  function visit(value: unknown, data = false): unknown {\n    if (typeof value === \"string\") return data ? value : translate(value);\n    if (Array.isArray(value)) {\n      const result = value.map((item,index)=>{const next=visit(item,data);return isValidElement(next)&&next.key==null?cloneElement(next,{key:`native-static-${index}`}):next});\n      return result.every((item, index) => item === value[index]) ? value : result;\n    }\n    if (isValidElement<Record<string, unknown>>(value)) {\n      if (typeof value.type === \"string\" && [\"pre\", \"code\", \"kbd\", \"script\", \"style\"].includes(value.type)) return value;\n      const updates: Record<string, unknown> = {};\n      for (const [key, original] of Object.entries(value.props)) {\n        if (textProps.has(key)) updates[key] = renderProps.has(key) && typeof original === \"function\"\n          ? (...args: unknown[]) => visit(original(...args)) : visit(original);\n        else if (dataProps.has(key)) updates[key] = visit(original, true);\n        else if (renderProps.has(key) && typeof original === \"function\") updates[key] = (...args: unknown[]) => visit(original(...args));\n      }\n      return Object.entries(updates).some(([key, result]) => result !== value.props[key]) ? cloneElement(value, updates) : value;\n    }\n    if (data && value && typeof value === \"object\" && Object.getPrototypeOf(value) === Object.prototype) {\n      const result: Record<string, unknown> = { ...value };\n      for (const [key, original] of Object.entries(result)) {\n        if (renderProps.has(key) && typeof original === \"function\") result[key] = (...args: unknown[]) => visit(original(...args));\n        else if (dataText.has(key)) result[key] = visit(original);\n        else if (original && typeof original === \"object\") result[key] = visit(original, true);\n      }\n      return Object.entries(result).some(([key, item]) => item !== (value as Record<string, unknown>)[key]) ? result : value;\n    }\n    return value;\n  }\n  return visit(value) as T;\n}\n\n/** Apply to a template component's returned JSX; copy updates through React, including portals. */\nexport function useTemplateCopy() {\n  const settings = useContext(CopyContext);\n  return useMemo(() => <T,>(node: T): T => settings?.render ? settings.render(node) : settings ? translateTemplateCopy(node, settings.translate) : node, [settings]);\n}\n",
  "src/board-native/contract-code.json": "{\n  \"carousel/sizing\": \"'use client';\\nimport '@helios-ui/react/styles.css';\\nimport {NativeScope,NativeCarousel,NativeCarouselItem} from '@helios-ui/react';\\nexport function Example(){\\n\\nreturn <NativeScope><NativeCarousel aria-label=\\\"Artwork\\\"><NativeCarouselItem className=\\\"w-[85%]\\\"><img src=\\\"/react/assets/board-native/carousel/kitchen.webp\\\" alt=\\\"Cosy kitchen\\\"/></NativeCarouselItem><NativeCarouselItem className=\\\"w-[70%]\\\"><img src=\\\"/react/assets/board-native/carousel/seafood.webp\\\" alt=\\\"Crab and lobster\\\"/></NativeCarouselItem></NativeCarousel></NativeScope>;\\n}\",\n  \"carousel/options\": \"'use client';\\nimport '@helios-ui/react/styles.css';\\nimport {NativeScope,NativeCarousel,NativeCarouselItem} from '@helios-ui/react';\\nexport function Example(){\\n\\nreturn <NativeScope><NativeCarousel aria-label=\\\"Artwork\\\" align=\\\"center\\\" gap={16} showArrows={false} showDots={false}><NativeCarouselItem><img src=\\\"/react/assets/board-native/carousel/kitchen.webp\\\" alt=\\\"Cosy kitchen\\\"/></NativeCarouselItem><NativeCarouselItem><img src=\\\"/react/assets/board-native/carousel/seafood.webp\\\" alt=\\\"Crab and lobster\\\"/></NativeCarouselItem></NativeCarousel></NativeScope>;\\n}\",\n  \"close-button/sizes\": \"'use client';\\nimport '@helios-ui/react/styles.css';\\nimport {useState} from 'react';\\nimport {NativeScope,NativeCloseButton} from '@helios-ui/react';\\nexport function Example(){\\nconst[closed,setClosed]=useState('');\\nreturn <NativeScope><div style={{display:\\\"flex\\\",gap:12}}>{([\\\"2xs\\\",\\\"xs\\\",\\\"sm\\\",\\\"md\\\"]as const).map(size=><NativeCloseButton key={size}size={size}aria-label={\\\"Close \\\"+size}onClick={()=>setClosed(size)}/>)}{closed&&<output>Closed {closed} example</output>}</div></NativeScope>;\\n}\",\n  \"date-picker/quick-select\": \"'use client';\\nimport '@helios-ui/react/styles.css';\\nimport {NativeScope,NativeDateRangePicker} from '@helios-ui/react';\\nexport function Example(){\\n\\nreturn <NativeScope><NativeDateRangePicker aria-label=\\\"Report period\\\"/></NativeScope>;\\n}\",\n  \"date-picker/disabled\": \"'use client';\\nimport '@helios-ui/react/styles.css';\\nimport {NativeScope,NativeDateRangePicker,NativeDatePicker} from '@helios-ui/react';\\nexport function Example(){\\n\\nreturn <NativeScope><><NativeDateRangePicker isDisabled aria-label=\\\"Disabled report period\\\"/><NativeDatePicker isDisabled aria-label=\\\"Disabled date\\\"/></></NativeScope>;\\n}\",\n  \"file-upload/validation\": \"'use client';\\nimport '@helios-ui/react/styles.css';\\nimport {useState} from 'react';\\nimport {NativeScope,NativeFileUpload} from '@helios-ui/react';\\nexport function Example(){\\nconst[fileName,setFileName]=useState('');\\nreturn <NativeScope><div><NativeFileUpload allowedExtensions={[\\\"pdf\\\",\\\"png\\\"]}maxBytes={2*1024*1024}onUploadComplete={file=>setFileName(file.name)}/>{fileName&&<output>{fileName} processed locally. No remote upload was made.</output>}</div></NativeScope>;\\n}\",\n  \"file-upload/file-icon\": \"'use client';\\nimport '@helios-ui/react/styles.css';\\nimport {NativeScope,NativeFileUpload} from '@helios-ui/react';\\nexport function Example(){\\n\\nreturn <NativeScope><NativeFileUpload renderFileIcon={file=><span aria-hidden>{file.name.split(\\\".\\\").pop()?.toUpperCase()}</span>}/></NativeScope>;\\n}\",\n  \"input-otp/controlled\": \"'use client';\\nimport '@helios-ui/react/styles.css';\\nimport {useState} from 'react';\\nimport {NativeScope,NativeInputOtp} from '@helios-ui/react';\\nexport function Example(){\\nconst[code,setCode]=useState('');const[complete,setComplete]=useState('');\\nreturn <NativeScope><div><NativeInputOtp value={code}onChange={setCode}onComplete={setComplete}/><output>{complete?\\\"Completed local code \\\"+complete:\\\"Enter all six digits\\\"}</output></div></NativeScope>;\\n}\",\n  \"input-otp/options\": \"'use client';\\nimport '@helios-ui/react/styles.css';\\nimport {NativeScope,NativeInputOtp} from '@helios-ui/react';\\nexport function Example(){\\n\\nreturn <NativeScope><div style={{display:\\\"grid\\\",gap:16}}><NativeInputOtp length={4}aria-label=\\\"Four digit code\\\"/><NativeInputOtp groupEvery={3}aria-label=\\\"Grouped code\\\"/><NativeInputOtp isInvalid defaultValue=\\\"123456\\\"aria-label=\\\"Invalid code\\\"/><NativeInputOtp isDisabled aria-label=\\\"Disabled code\\\"/></div></NativeScope>;\\n}\",\n  \"segmented-control/controlled\": \"'use client';\\nimport '@helios-ui/react/styles.css';\\nimport {useState} from 'react';\\nimport {NativeScope,NativeSegmentedControl,NativeSegmentedControlItem} from '@helios-ui/react';\\nexport function Example(){\\nconst[selected,setSelected]=useState<Set<string>>(new Set(['weekly']));\\nreturn <NativeScope><NativeSegmentedControl aria-label=\\\"Period\\\"selectedKeys={selected}onSelectionChange={keys=>setSelected(new Set([...keys].map(String)))}>{[\\\"weekly\\\",\\\"monthly\\\",\\\"yearly\\\"].map(id=><NativeSegmentedControlItem key={id}id={id}>{id}</NativeSegmentedControlItem>)}</NativeSegmentedControl></NativeScope>;\\n}\",\n  \"slider/controlled\": \"'use client';\\nimport '@helios-ui/react/styles.css';\\nimport {useState} from 'react';\\nimport {NativeScope,NativeSlider} from '@helios-ui/react';\\nexport function Example(){\\nconst[volume,setVolume]=useState(42);\\nreturn <NativeScope><div style={{width:320}}><NativeSlider label=\\\"Volume\\\"value={volume}onChange={setVolume}/><output>{volume}%</output></div></NativeScope>;\\n}\",\n  \"switch/shapes\": \"'use client';\\nimport '@helios-ui/react/styles.css';\\nimport {NativeScope,NativeSwitch} from '@helios-ui/react';\\nexport function Example(){\\n\\nreturn <NativeScope><div style={{display:\\\"flex\\\",gap:16}}><NativeSwitch shape=\\\"pill\\\"aria-label=\\\"Pill switch\\\"defaultSelected/><NativeSwitch shape=\\\"rectangle\\\"aria-label=\\\"Rectangle switch\\\"defaultSelected/></div></NativeScope>;\\n}\",\n  \"switch/sizes\": \"'use client';\\nimport '@helios-ui/react/styles.css';\\nimport {NativeScope,NativeSwitch} from '@helios-ui/react';\\nexport function Example(){\\n\\nreturn <NativeScope><div style={{display:\\\"flex\\\",gap:16}}>{([\\\"lg\\\",\\\"md\\\",\\\"sm\\\"]as const).map(size=><NativeSwitch key={size}size={size}aria-label={size+\\\" switch\\\"}defaultSelected/>)}</div></NativeScope>;\\n}\",\n  \"switch/states\": \"'use client';\\nimport '@helios-ui/react/styles.css';\\nimport {useState} from 'react';\\nimport {NativeScope,NativeSwitch} from '@helios-ui/react';\\nexport function Example(){\\nconst[enabled,setEnabled]=useState(true);\\nreturn <NativeScope><div style={{display:\\\"grid\\\",gap:12}}><NativeSwitch isSelected={enabled}onChange={setEnabled}>Enable notifications</NativeSwitch><NativeSwitch isDisabled>Disabled notifications</NativeSwitch><output>{enabled?\\\"Notifications on\\\":\\\"Notifications off\\\"}</output></div></NativeScope>;\\n}\",\n  \"table/sizes\": \"'use client';\\nimport '@helios-ui/react/styles.css';\\nimport {NativeScope,NativeDataTableExample} from '@helios-ui/react';\\nexport function Example(){\\n\\nreturn <NativeScope><NativeDataTableExample showSizeToggle pageSize={8}/></NativeScope>;\\n}\",\n  \"tooltip/sizes\": \"'use client';\\nimport '@helios-ui/react/styles.css';\\nimport {NativeScope,NativeTooltipExample} from '@helios-ui/react';\\nexport function Example(){\\n\\nreturn <NativeScope><NativeTooltipExample/></NativeScope>;\\n}\",\n  \"settings-modal/triggering\": \"'use client';\\nimport '@helios-ui/react/styles.css';\\nimport {useState} from 'react';\\nimport {NativeScope,NativeSettingsModal,NativeButton} from '@helios-ui/react';\\nexport function Example(){\\nconst[open,setOpen]=useState(false);\\nreturn <NativeScope><><NativeButton onClick={()=>setOpen(true)}>Open settings</NativeButton><NativeSettingsModal isOpen={open}onClose={()=>setOpen(false)}/></></NativeScope>;\\n}\",\n  \"settings-modal/initial-page\": \"'use client';\\nimport '@helios-ui/react/styles.css';\\nimport {useState} from 'react';\\nimport {NativeScope,NativeSettingsModal,NativeButton} from '@helios-ui/react';\\nexport function Example(){\\nconst[open,setOpen]=useState(false);\\nreturn <NativeScope><><NativeButton onClick={()=>setOpen(true)}>Edit profile</NativeButton><NativeSettingsModal isOpen={open}onClose={()=>setOpen(false)}defaultPage=\\\"profile\\\"/></></NativeScope>;\\n}\",\n  \"settings-modal/plan-artwork\": \"'use client';\\nimport '@helios-ui/react/styles.css';\\nimport {useState} from 'react';\\nimport {NativeScope,NativeSettingsModal,NativeButton} from '@helios-ui/react';\\nexport function Example(){\\nconst[open,setOpen]=useState(false);\\nreturn <NativeScope><><NativeButton onClick={()=>setOpen(true)}>Open settings</NativeButton><NativeSettingsModal isOpen={open}onClose={()=>setOpen(false)}planArtSrc=\\\"/react/assets/board-native/carousel/sunrise.webp\\\"/></></NativeScope>;\\n}\",\n  \"stat-cards/data\": \"'use client';\\nimport '@helios-ui/react/styles.css';\\nimport {NativeScope,NativeStatCards} from '@helios-ui/react';\\nexport function Example(){\\nfunction MetricIcon({className}:{className?:string}){return <svg className={className}viewBox='0 0 24 24'aria-hidden><path fill='currentColor'd='M4 12h4v8H4zm6-6h4v14h-4zm6-4h4v18h-4z'/></svg>}\\nreturn <NativeScope><NativeStatCards variant=\\\"footer\\\"stats={[{icon:MetricIcon,label:\\\"Customers\\\",value:\\\"1,284\\\",delta:\\\"8%\\\",deltaColor:\\\"lime\\\",tone:\\\"blue\\\",caption:\\\"From last month\\\",hint:\\\"New customers in the current month.\\\"}]}/></NativeScope>;\\n}\",\n  \"data-grid/columns\": \"'use client';\\nimport '@helios-ui/react/styles.css';\\nimport {useState} from 'react';\\nimport {NativeScope,NativeDataGrid,type NativeDataGridColumn} from '@helios-ui/react';\\nexport function Example(){\\ntype Row={id:string;customer:string;seats:number;status:string};const[rows,setRows]=useState<Row[]>([{id:'a',customer:'Aarav',seats:12,status:'Active'}]);const columns:NativeDataGridColumn<Row>[]=[{key:'customer',header:'Customer',width:200},{key:'seats',header:'Seats',type:'number',min:1,max:1000,summary:'sum'},{key:'status',header:'Status',type:'select',options:['Active','Paused']}];\\nreturn <NativeScope><NativeDataGrid aria-label=\\\"Renewals\\\"data={rows}onDataChange={setRows}getRowId={row=>row.id}columns={columns}height={360}/></NativeScope>;\\n}\",\n  \"theme-toggle/project-setup\": \"import type {ReactNode} from 'react';\\nimport '@helios-ui/react/styles.css';\\nconst themeScript='(function(){try{document.body.classList.toggle(\\\"dark\\\",localStorage.getItem(\\\"helios-ui-theme\\\")===\\\"dark\\\")}catch(e){document.body.classList.remove(\\\"dark\\\")}})();';\\nexport default function RootLayout({children}:{children:ReactNode}){return <html lang=\\\"en\\\"><body suppressHydrationWarning><script dangerouslySetInnerHTML={{__html:themeScript}}/>{children}</body></html>}\\n\",\n  \"theme-toggle/collapsed\": \"import '@helios-ui/react/styles.css';\\nimport {NativeScope,NativeThemeToggle} from '@helios-ui/react';\\nexport function Example(){return <NativeScope><NativeThemeToggle collapsed/></NativeScope>}\"\n}\n",
  "src/board-native/examples/announcement-example.tsx": "'use client';\n/* Actual BoardUI MIT install example adapted to Helios local fixtures. */\nimport{useState}from'react';\nimport{NativeLocalDialog}from'../NativeLocalDialog.js';\nimport { Announcement } from \"../components/base/announcement/announcement.js\";\n\nexport function NativeAnnouncementExample() {\n  const[tour,setTour]=useState(false);\n  return (<>\n    <div className=\"w-[236px]\"><Announcement\n      title=\"Setting up your account\"\n      description=\"Take the tour and learn how to use our product.\"\n      actionLabel=\"Take the tour\"\n      dismissible\n      onAction={() => setTour(true)}\n    /></div><NativeLocalDialog open={tour}onOpenChange={setTour}title=\"Welcome to Helios UI\">Explore the reusable components and their source in this local preview.</NativeLocalDialog></>\n  );\n}\n",
  "src/board-native/examples/avatar-example.tsx": "'use client';\n/* Actual BoardUI MIT install example adapted to Helios local fixtures. */\nimport { Avatar } from \"../components/base/avatar/avatar.js\";\n\nexport function NativeAvatarExample() {\n  return (\n    <div className=\"flex items-center gap-4\">\n      <Avatar size=\"lg\" src=\"/react/assets/board-native/avatars/livia-saris.webp\" alt=\"Livia Saris\" />\n      <Avatar size=\"lg\" color=\"blue\" initials=\"B\" />\n      <Avatar size=\"lg\" color=\"neutral\" initials=\"M\" />\n    </div>\n  );\n}\n",
  "src/board-native/examples/badge-example.tsx": "'use client';\nimport{Badge}from'../components/base/badges/badge.js';\nimport{Kbd}from'../components/base/kbd/kbd.js';\nexport function NativeBadgeExample(){return <div className=\"flex items-center gap-4\"><Badge color=\"neutral\">91</Badge><span className=\"inline-flex rounded-2lg bg-linear-to-b from-accent-500 to-accent-600 p-2\"><Badge color=\"primary\">152</Badge></span><Kbd>⌘L</Kbd></div>}\n",
  "src/board-native/examples/breadcrumb-example.tsx": "'use client';\n/* Actual BoardUI MIT install example adapted to Helios local fixtures. */\nimport { RiHomeLine } from \"@remixicon/react\";\nimport { Breadcrumb, BreadcrumbItem } from \"../components/base/breadcrumb/breadcrumb.js\";\n\nexport function NativeBreadcrumbExample() {\n  return (\n    <Breadcrumb aria-label=\"Pages\">\n      <BreadcrumbItem href=\"/templates/dashboard\">Dashboard</BreadcrumbItem>\n      <BreadcrumbItem href=\"/templates/project-board\">Projects</BreadcrumbItem>\n      <BreadcrumbItem current icon={RiHomeLine}>\n        Helios UI\n      </BreadcrumbItem>\n    </Breadcrumb>\n  );\n}\n",
  "src/board-native/examples/button-example.tsx": "'use client';\n/* Actual BoardUI MIT install example adapted to Helios local fixtures. */\nimport{useState}from'react';\nimport { RiArrowRightLine } from \"@remixicon/react\";\nimport { Button } from \"../components/base/buttons/button.js\";\n\nexport function NativeButtonExample() {\n  const[message,setMessage]=useState(\"\");\n  return (<>\n    <div className=\"flex flex-wrap items-center justify-center gap-3\">\n      <Button onClick={()=>setMessage(\"Get started selected locally.\")}>Get started</Button>\n      <Button variant=\"secondary\" onClick={()=>setMessage(\"Continue selected locally.\")} trailingIcon={RiArrowRightLine}>\n        Continue\n      </Button>\n      <Button variant=\"ghost\" onClick={()=>setMessage(\"Marked as done in this local example.\")}>Mark as done</Button>\n      <Button variant=\"danger\" onClick={()=>setMessage(\"Delete action previewed locally.\")}>Delete</Button>\n    </div>{message&&<p role=\"status\"className=\"text-body-2-regular text-text-secondary\">{message}</p>}</>\n  );\n}\n",
  "src/board-native/examples/button-group-example.tsx": "'use client';\n/* Actual BoardUI MIT install example adapted to Helios local fixtures. */\nimport { ButtonGroup, ButtonGroupItem } from \"../components/base/buttons/button-group.js\";\nimport {useState} from 'react';\n\nexport function NativeButtonGroupExample() {\n  const [period,setPeriod]=useState<string|null>(null);\n  return (\n    <ButtonGroup aria-label=\"Time range\">\n      {['Day','Week','Month','Year'].map(value=><ButtonGroupItem key={value} selected={period===value} aria-pressed={period===value} onClick={()=>setPeriod(value)}>{value}</ButtonGroupItem>)}\n    </ButtonGroup>\n  );\n}\n",
  "src/board-native/examples/carousel-example.tsx": "'use client';\n/* Actual BoardUI MIT install example adapted to Helios local fixtures. */\nimport{Carousel,CarouselItem}from'../components/base/carousel/carousel.js';\nconst items=[{id:'kitchen',title:'Cosy kitchen',caption:'Illustration',src:'kitchen.webp'},{id:'shark',title:'Paper shark',caption:'Collage',src:'shark-collage.webp'},{id:'seafood',title:'Crab and lobster',caption:'Brush study',src:'seafood.webp'},{id:'sunrise',title:'Sunrise',caption:'Oil on canvas',src:'sunrise.webp'},{id:'squid',title:'Deep space squid',caption:'Anime',src:'space-squid.webp'},{id:'floral',title:'Block print',caption:'Pattern',src:'floral.webp'},{id:'late',title:'Late stop',caption:'Illustration',src:'vending-machine.webp'}];\nexport function NativeCarouselExample(){return <Carousel aria-label=\"Artwork gallery\"className=\"max-w-[520px]\">{items.map(item=><CarouselItem key={item.id}><figure className=\"overflow-hidden rounded-2lg border border-border-button-default bg-background-primary-default shadow-xs\"><div className=\"relative aspect-[4/3] w-full bg-background-secondary-default\"><img src={'/react/assets/board-native/carousel/'+item.src}alt={item.title}className=\"absolute inset-0 size-full object-cover\"/></div><figcaption className=\"flex items-baseline justify-between gap-3 px-4 py-3\"><span className=\"text-body-medium text-text-primary\">{item.title}</span><span className=\"text-body-regular text-text-tertiary\">{item.caption}</span></figcaption></figure></CarouselItem>)}</Carousel>}\n\n",
  "src/board-native/examples/checkbox-example.tsx": "'use client';\n/* Actual BoardUI MIT install example adapted to Helios local fixtures. */\nimport { Checkbox } from \"../components/base/checkbox/checkbox.js\";\n\nexport function NativeCheckboxExample() {\n  return (\n    <div className=\"flex items-center gap-6\">\n      <Checkbox aria-label=\"Unchecked\" />\n      <Checkbox defaultSelected aria-label=\"Checked\" />\n      <Checkbox isIndeterminate aria-label=\"Indeterminate\" />\n      <Checkbox isDisabled aria-label=\"Disabled\" />\n      <Checkbox isDisabled defaultSelected aria-label=\"Disabled checked\" />\n    </div>\n  );\n}\n",
  "src/board-native/examples/chip-example.tsx": "'use client';\n/* Actual BoardUI MIT install example adapted to Helios local fixtures. */\nimport { Chip } from \"../components/base/badges/chip.js\";\n\nexport function NativeChipExample() {\n  return (\n    <div className=\"flex flex-wrap items-center justify-center gap-3\">\n      <Chip variant=\"bold\" color=\"lime\">+12.5%</Chip>\n      <Chip variant=\"subtle\" color=\"cyan\">₹3,252</Chip>\n      <Chip variant=\"caption\" color=\"rose\">Backend Engineer</Chip>\n    </div>\n  );\n}\n",
  "src/board-native/examples/close-button-example.tsx": "'use client';\n/* Source-observed default composition, built from actual MIT component exports. */\nimport{useState}from'react';import{CloseButton}from'../components/base/buttons/close-button.js';export function NativeCloseButtonExample(){const[closed,setClosed]=useState<string[]>([]);return <div className=\"flex items-end gap-6\">{(['2xs','xs','sm','md']as const).map(size=><div key={size}className=\"flex flex-col items-center gap-2\">{closed.includes(size)?<button className=\"text-caption-1-medium text-text-tertiary\"onClick={()=>setClosed(v=>v.filter(x=>x!==size))}>Restore</button>:<CloseButton size={size}aria-label={'Close '+size}onClick={()=>setClosed(v=>[...v,size])}/>}<span className=\"text-caption-1-medium text-text-tertiary\">{size}</span></div>)}</div>}\n",
  "src/board-native/examples/data-grid-example.tsx": "'use client';\n/* Actual BoardUI MIT install example adapted to Helios local fixtures. */\nimport{DataGridExample}from'../components/application/docs/examples/data-grid-example.js';export function NativeDataGridDemo(){return <DataGridExample/>}\n",
  "src/board-native/examples/data-table-example.tsx": "'use client';\n/* Actual BoardUI MIT install example adapted to Helios local fixtures. */\nimport{DataTableExample}from'../components/application/docs/examples/data-table-example.js';export function NativeDataTableDemo(){return <DataTableExample showSearch/>}\n",
  "src/board-native/examples/date-picker-example.tsx": "'use client';\n/* Source-observed default composition, built from actual MIT component exports. */\nimport{DateRangePicker}from'../components/base/date-picker/date-range-picker.js';export function NativeDatePickerExample(){return <DateRangePicker aria-label=\"Select date range\"/>}\n",
  "src/board-native/examples/divider-example.tsx": "'use client';\n/* Actual BoardUI MIT install example adapted to Helios local fixtures. */\nimport { Divider } from \"../components/base/divider/divider.js\";\n\nexport function NativeDividerExample() {\n  return (\n    <div className=\"flex w-full max-w-2xl flex-col gap-8\">\n      <Divider>Notifications</Divider>\n      <Divider variant=\"double\">Today</Divider>\n      <Divider variant=\"fill\">Latest activity</Divider>\n    </div>\n  );\n}\n",
  "src/board-native/examples/dropdown-example.tsx": "'use client';\n/* Actual BoardUI MIT install example adapted to Helios local fixtures. */\nimport{useNativeAction}from\"../NativeEnvironment.js\";\nimport { useState } from \"react\";\nimport { RiAddLine, RiAttachment2, RiFocus3Line, RiListCheck3 } from \"@remixicon/react\";\nimport {\n  Dropdown,\n  DropdownGroup,\n  DropdownItem,\n  DropdownPopover,\n  DropdownTrigger,\n} from \"../components/base/dropdown/dropdown.js\";\nimport { cx } from \"../utils/cx.js\";\n\nconst ROWS = [\n  { icon: RiAttachment2, label: \"Files and folders\" },\n  { icon: RiFocus3Line, label: \"Goal\", description: \"Set a goal for faster results\" },\n  { icon: RiListCheck3, label: \"Plan mode\", description: \"Manage complex tasks\" },\n];\n\nexport function NativeDropdownExample() {\n  const [isOpen, setIsOpen] = useState(false);\n  const report=useNativeAction();\n\n  return (\n    <div className=\"flex min-h-[420px] w-full items-center justify-center\"><Dropdown isOpen={isOpen} onOpenChange={setIsOpen}>\n      <DropdownTrigger\n        aria-label=\"Add to chat\"\n        className=\"flex size-9 items-center justify-center rounded-full bg-background-secondary-default p-2 transition-colors hover:bg-background-secondary-hover\"\n      >\n        <RiAddLine\n          className={cx(\n            \"size-5 text-foreground-icon-secondary transition-transform duration-200\",\n            isOpen && \"rotate-45\",\n          )}\n          aria-hidden\n        />\n      </DropdownTrigger>\n\n      <DropdownPopover aria-label=\"Add to chat\" className=\"w-[361px] p-2\" dialogClassName=\"gap-2\">\n        <DropdownGroup label=\"Add\">\n          {ROWS.map(({ icon: Icon, label, description }) => (\n            <DropdownItem key={label} onSelect={() => {setIsOpen(false);report({label,description:description??\"Selected in this local composer preview.\"})}} className=\"px-2 py-1.5\">\n              <Icon className=\"size-5 shrink-0 text-foreground-icon-secondary\" aria-hidden />\n              <span className=\"truncate text-body-medium whitespace-nowrap\">\n                <span className=\"text-text-primary\">{label}</span>\n                {description && <span className=\"ml-1.5 text-text-secondary\">{description}</span>}\n              </span>\n            </DropdownItem>\n          ))}\n        </DropdownGroup>\n      </DropdownPopover>\n    </Dropdown></div>\n  );\n}\n",
  "src/board-native/examples/file-upload-example.tsx": "'use client';\n/* Source-native upload animation processes a local fixture; it does not send data. */\nimport{useState}from'react';\nimport { FileUpload } from \"../components/base/file-upload/file-upload.js\";\nexport function NativeFileUploadExample(){const[fileName,setFileName]=useState('');return <div className=\"w-full max-w-[533px] py-3\"><FileUpload onUploadComplete={file=>setFileName(file.name)}/>{fileName&&<p role=\"status\"className=\"mt-3 text-body-2-regular text-text-secondary\">{fileName} processed locally. No file was uploaded to a server.</p>}</div>}\n",
  "src/board-native/examples/icon-button-example.tsx": "'use client';\n/* Source-observed default composition, built from actual MIT component exports. */\nimport{useState}from'react';import{RiEditLine,RiNotificationLine,RiMore2Fill,RiDeleteBinLine}from'@remixicon/react';import{IconButton}from'../components/base/buttons/icon-button.js';export function NativeIconButtonExample(){const[notice,setNotice]=useState('');return <div className=\"flex flex-col items-center gap-3\"><div className=\"flex items-center gap-3\"><IconButton icon={RiNotificationLine}aria-label=\"Notifications\"onClick={()=>setNotice('Notifications selected locally.')}/><IconButton icon={RiEditLine}aria-label=\"Edit\"onClick={()=>setNotice('Edit selected locally.')}/><IconButton size=\"small\"icon={RiMore2Fill}aria-label=\"More\"onClick={()=>setNotice('More actions selected locally.')}/><IconButton size=\"small\"icon={RiDeleteBinLine}aria-label=\"Delete\"onClick={()=>setNotice(\"Delete selected locally.\")}/></div>{notice&&<p role=\"status\"className=\"text-body-2-regular text-text-secondary\">{notice}</p>}</div>}\n",
  "src/board-native/examples/input-example.tsx": "'use client';\n/* Actual BoardUI MIT install example adapted to Helios local fixtures. */\nimport { Input } from \"../components/base/input/input.js\";\nimport { RiUserSmileLine, RiQuestionLine } from \"@remixicon/react\";\n\nexport function NativeInputExample() {\n  return (\n    <div className=\"w-[250px] max-w-full\"><Input\n      label=\"Email\"\n      isRequired\n      tooltip\n      placeholder=\"Enter your email\"\n      hint=\"This is a hint about this input.\"\n      leadingIcon={RiUserSmileLine}\n      trailingIcon={RiQuestionLine}\n    /></div>\n  );\n}\n",
  "src/board-native/examples/input-otp-example.tsx": "'use client';\n/* Actual BoardUI MIT install example adapted to Helios local fixtures. */\nimport{useState}from'react';\nimport { InputOtp } from \"../components/base/input-otp/input-otp.js\";\n\nexport function NativeInputOtpExample() {\n  const[complete,setComplete]=useState(\"\");\nreturn (<div className=\"flex w-full min-w-0 flex-col items-center gap-3\">\n    <InputOtp\n      aria-label=\"Verification code\"\n      onChange={code=>{if(code.length<6)setComplete(\"\")}}\n      onComplete={(code) => setComplete(code)}\n    />{complete&&<p role=\"status\"className=\"max-w-sm text-center text-body-2-regular text-text-secondary\">Code format accepted locally. No identity verification was performed.</p>}</div>\n  );\n}\n",
  "src/board-native/examples/link-button-example.tsx": "'use client';\n/* Source-observed default composition, built from actual MIT component exports. */\nimport{useState}from'react';import{RiArrowRightLine}from'@remixicon/react';import{LinkButton}from'../components/base/buttons/link-button.js';export function NativeLinkButtonExample(){const[dismissed,setDismissed]=useState(false);return <div className=\"flex flex-wrap items-center justify-center gap-6\"><LinkButton href=\"/?section=pricing\"trailingIcon={RiArrowRightLine}>Learn more</LinkButton><LinkButton variant=\"secondary\"onClick={()=>setDismissed(v=>!v)}>{dismissed?'Restore':'Dismiss'}</LinkButton><LinkButton disabled>Unavailable</LinkButton></div>}\n",
  "src/board-native/examples/notification-example.tsx": "'use client';\n/* Source-observed default composition, built from actual MIT component exports. */\nimport{useState}from'react';import{Notification,type NotificationStatus}from'../components/base/notification/notification.js';import{Button}from'../components/base/buttons/button.js';export function NativeNotificationExample(){const[visible,setVisible]=useState(true),[cycle,setCycle]=useState(0),[status,setStatus]=useState<NotificationStatus>('success'),[avatar,setAvatar]=useState(true),[actions,setActions]=useState(true),[message,setMessage]=useState('');return <div className=\"flex w-full flex-col items-center gap-5\"><div className=\"w-full max-w-[520px]\">{visible&&<Notification key={cycle}onDismiss={()=>setVisible(false)}status={status}avatar={avatar?{src:'/react/assets/board-native/avatars/maria-lubin.webp',alt:'Katherine Moss',presence:'online'}:undefined}title=\"Katherine Moss\"timestamp=\"2 mins ago\"description=\"I've finished adding my notes. Happy for us to review whenever you're ready!\"actions={actions?[{label:'Dismiss',variant:'secondary',onClick:()=>setVisible(false)},{label:'View changelog',variant:'primary',onClick:()=>setMessage('Helios UI local changelog: reusable source-native components and responsive previews.')}]:undefined}/>}</div><div className=\"flex flex-wrap items-center justify-center gap-2\"><Button size=\"small\"variant=\"secondary\"onClick={()=>{setVisible(true);setCycle(c=>c+1)}}>Replay notification</Button><Button size=\"small\"variant=\"secondary\"onClick={()=>{setVisible(true);setStatus('information');setCycle(c=>c+1)}}>Information</Button><Button size=\"small\"variant=\"secondary\"onClick={()=>{setVisible(true);setStatus('error');setCycle(c=>c+1)}}>Error</Button><Button size=\"small\"variant=\"secondary\"onClick={()=>setAvatar(v=>!v)}>With avatar</Button><Button size=\"small\"variant=\"secondary\"onClick={()=>setActions(v=>!v)}>With buttons</Button></div>{message&&<p role=\"status\"className=\"text-body-regular text-text-secondary\">{message}</p>}</div>}\n",
  "src/board-native/examples/pagination-example.tsx": "'use client';\n/* Actual BoardUI MIT install example adapted to Helios local fixtures. */\nimport { useState } from \"react\";\nimport { Pagination } from \"../components/base/pagination/pagination.js\";\n\nexport function NativePaginationExample() {\n  const [page, setPage] = useState(6);\n\n  return (\n    <div className=\"w-full max-w-[560px]\"><Pagination\n      page={page}\n      totalPages={181}\n      onChange={setPage}\n    /></div>\n  );\n}\n",
  "src/board-native/examples/radio-example.tsx": "'use client';\n/* Actual BoardUI MIT install example adapted to Helios local fixtures. */\nimport { Radio, RadioGroup } from \"../components/base/radio/radio.js\";\n\nexport function NativeRadioExample() {\n  return (\n    <RadioGroup aria-label=\"Billing period\" defaultValue=\"monthly\">\n      <Radio value=\"monthly\">Monthly billing</Radio>\n      <Radio value=\"yearly\">Yearly billing</Radio>\n      <Radio value=\"usage\" isDisabled>Usage based</Radio>\n    </RadioGroup>\n  );\n}\n",
  "src/board-native/examples/segmented-control-example.tsx": "'use client';\n/* Actual BoardUI MIT install example adapted to Helios local fixtures. */\nimport {\n  SegmentedControl,\n  SegmentedControlItem,\n} from \"../components/base/segmented-control/segmented-control.js\";\n\nexport function NativeSegmentedControlExample() {\n  return (\n    <SegmentedControl defaultSelectedKeys={[\"weekly\"]} aria-label=\"Period\">\n      <SegmentedControlItem id=\"weekly\">Weekly</SegmentedControlItem>\n      <SegmentedControlItem id=\"monthly\">Monthly</SegmentedControlItem>\n      <SegmentedControlItem id=\"yearly\">Yearly</SegmentedControlItem>\n    </SegmentedControl>\n  );\n}\n",
  "src/board-native/examples/select-example.tsx": "'use client';\n/* Source-observed default composition, built from actual MIT component exports. */\nimport{Select,SelectItem}from'../components/base/select/select.js';export function NativeSelectExample(){return <div className=\"flex flex-wrap items-center justify-center gap-3\"><Select aria-label=\"Filter by price\"defaultSelectedKey=\"all\"><SelectItem id=\"all\"textValue=\"All prices\">All prices</SelectItem><SelectItem id=\"low\"textValue=\"Under ₹10,000\">Under ₹10,000</SelectItem><SelectItem id=\"high\"textValue=\"Over ₹10,000\">Over ₹10,000</SelectItem></Select><Select aria-label=\"Filter by region\"defaultSelectedKey=\"all\"><SelectItem id=\"all\"textValue=\"All regions\">All regions</SelectItem><SelectItem id=\"europe\"textValue=\"Europe\">Europe</SelectItem><SelectItem id=\"americas\"textValue=\"Americas\">Americas</SelectItem></Select></div>}\n",
  "src/board-native/examples/settings-modal-example.tsx": "'use client';\n/* Actual BoardUI MIT install example adapted to Helios local fixtures. */\n\"use client\";\n\nimport { useState } from \"react\";\nimport { RiSettingsLine } from \"@remixicon/react\";\nimport { SettingsModal } from \"../components/application/settings/settings-modal.js\";\nimport { Button } from \"../components/base/buttons/button.js\";\n\nexport function NativeSettingsModalExample() {\n  const [isOpen, setIsOpen] = useState(false);\n\n  return (\n    <>\n      <Button\n        variant=\"secondary\"\n        leadingIcon={RiSettingsLine}\n        onClick={() => setIsOpen(true)}\n      >\n        Open settings\n      </Button>\n      <SettingsModal\n        isOpen={isOpen}\n        onClose={() => setIsOpen(false)}\n      />\n    </>\n  );\n}\n",
  "src/board-native/examples/sidebar-example.tsx": "'use client';\n/* Source-observed default composition, built from actual MIT component exports. */\nimport{useState}from'react';import{DashboardSidebar}from'../components/application/dashboard/dashboard-sidebar.js';import{NativeLocalDialog}from'../NativeLocalDialog.js';export function NativeSidebarExample(){const[selected,setSelected]=useState('home'),[notice,setNotice]=useState('');return <div className=\"flex h-[860px] w-full items-stretch justify-center overflow-hidden rounded-2xl bg-background-secondary-default p-2\"><DashboardSidebar selected={selected}onNavigate={item=>{setSelected(item.key);setNotice(item.label+' selected in this local sidebar preview.')}}onSupport={()=>setNotice('Support selected locally. No message was sent.')}onAccountAction={action=>setNotice(action+' selected locally. No account was connected.')}/><NativeLocalDialog open={!!notice}onOpenChange={()=>setNotice('')}title=\"Local sidebar action\">{notice}</NativeLocalDialog></div>}\n",
  "src/board-native/examples/slider-example.tsx": "'use client';\n/* Actual BoardUI MIT install example adapted to Helios local fixtures. */\nimport { RangeSlider, Slider } from \"../components/base/slider/slider.js\";\n\nexport function NativeSliderExample() {\n  return (\n    <div className=\"flex w-full max-w-[420px] flex-col gap-10\">\n      <Slider label=\"Volume\" defaultValue={42} />\n      <RangeSlider\n        label=\"Monthly budget\"\n        defaultValue={[25, 75]}\n        formatValue={(value) => `₹${value}`}\n      />\n    </div>\n  );\n}\n",
  "src/board-native/examples/social-button-example.tsx": "'use client';\n/* Actual BoardUI MIT install example adapted to Helios local fixtures. */\nimport{useNativeAction}from\"../NativeEnvironment.js\";\nimport { SocialButton } from \"../components/base/social-button/social-button.js\";\n\nexport function NativeSocialButtonExample() {\n  const report=useNativeAction();\n  const select=(provider:string)=>()=>report({label:provider+\" sign-in preview\",description:\"This is a local component preview. No OAuth provider was connected.\"});\n  return (\n    <div className=\"flex flex-col gap-3\">\n      <SocialButton brand=\"google\" onClick={select(\"Google\")}/>\n      <SocialButton brand=\"github\" appearance=\"black\" onClick={select(\"GitHub\")}/>\n      <SocialButton brand=\"slack\" appearance=\"white\" onClick={select(\"Slack\")}/>\n    </div>\n  );\n}\n",
  "src/board-native/examples/stat-cards-example.tsx": "'use client';\n/* Actual BoardUI MIT install example adapted to Helios local fixtures. */\nimport { StatCards } from \"../components/application/dashboard/stat-cards.js\";\n\nexport function NativeStatCardsExample() {\n  // Four KPI cards with gradient icon tiles, info tooltips, and a\n  // footer band carrying the comparison caption and delta pill.\n  return <StatCards variant=\"footer\" columns={2}/>;\n}\n",
  "src/board-native/examples/switch-example.tsx": "'use client';\n/* Source-observed default composition, built from actual MIT component exports. */\nimport{Switch}from'../components/base/switch/switch.js';export function NativeSwitchExample(){return <div className=\"flex flex-col gap-8\">{(['pill','rectangle']as const).map(shape=><div key={shape}className=\"flex flex-col gap-3\"><p className=\"text-body-2-medium text-text-tertiary\">{shape==='pill'?'Pill':'Rectangle'}</p><div className=\"flex items-end gap-8\">{(['lg','md','sm']as const).map(size=><div key={size}className=\"flex flex-col items-center gap-2.5\"><Switch defaultSelected shape={shape}size={size}aria-label={shape+' '+size}/><span className=\"text-caption-1-medium text-text-tertiary\">{size==='lg'?'Large':size==='md'?'Medium':'Small'}</span></div>)}</div></div>)}</div>}\n",
  "src/board-native/examples/table-example.tsx": "'use client';\n/* Actual BoardUI MIT install example adapted to Helios local fixtures. */\nimport{DataTableExample}from'../components/application/docs/examples/data-table-example.js';export function NativeTableExample(){return <DataTableExample showSearch/>}\n",
  "src/board-native/examples/tabs-example.tsx": "'use client';\n/* Source-observed default composition, built from actual MIT component exports. */\nimport{RiImage2Line,RiArticleLine,RiQrCodeLine,RiGroupLine,RiSettings4Line}from'@remixicon/react';import{Tab,TabList,Tabs,TabPanel}from'../components/base/tabs/tabs.js';const items=[{id:'banners',label:'Banners',icon:RiImage2Line,count:152},{id:'posts',label:'Posts',icon:RiArticleLine,count:32},{id:'codes',label:'QR Codes',icon:RiQrCodeLine,count:14},{id:'members',label:'Members',icon:RiGroupLine},{id:'settings',label:'Settings',icon:RiSettings4Line}];export function NativeTabsExample(){return <div className=\"w-full max-w-[720px]\"><Tabs defaultSelectedKey=\"banners\"><TabList aria-label=\"Content types\">{items.map(item=><Tab key={item.id}id={item.id}icon={item.icon}count={item.count}>{item.label}</Tab>)}</TabList>{items.map(item=><TabPanel key={item.id}id={item.id}><span className=\"sr-only\">{item.label} panel selected in this local example.</span></TabPanel>)}</Tabs></div>}\n",
  "src/board-native/examples/textarea-example.tsx": "'use client';\n/* Actual BoardUI MIT install example adapted to Helios local fixtures. */\nimport { Textarea } from \"../components/base/textarea/textarea.js\";\n\nexport function NativeTextareaExample() {\n  return (\n    <div className=\"w-full max-w-[420px]\"><Textarea\n      label=\"Release notes\"\n      isRequired\n      tooltip\n      placeholder=\"What changed in this version?\"\n      hint=\"Markdown is supported.\"\n      rows={4}\n    /></div>\n  );\n}\n",
  "src/board-native/examples/theme-toggle-example.tsx": "'use client';\n/* Source-observed public documentation composition. MIT — see board-native/LICENSE. */\nimport{ThemeToggle}from'../components/application/theme/theme-toggle.js';\nexport function NativeThemeToggleExample(){return <div className=\"flex w-[260px] flex-col gap-3 rounded-3xl border border-border-button-white bg-background-secondary-default p-3 shadow-sidebar\"><ThemeToggle/><div className=\"flex justify-center\"><ThemeToggle collapsed/></div></div>}\n",
  "src/board-native/examples/tooltip-example.tsx": "'use client';\n/* Source-observed default composition, built from actual MIT component exports. */\nimport{Focusable}from'react-aria-components';import{Button}from'../components/base/buttons/button.js';import{Tooltip,TooltipTrigger}from'../components/base/tooltip/tooltip.js';export function NativeTooltipExample(){return <div className=\"flex flex-wrap items-center justify-center gap-4 py-10\">{(['Small','Medium','No arrow']as const).map(label=><TooltipTrigger key={label}><Focusable><Button variant=\"secondary\">{label}</Button></Focusable><Tooltip size={label==='Small'?'sm':'md'}showArrow={label!=='No arrow'}>12 contributions on April 26</Tooltip></TooltipTrigger>)}</div>}\n",
  "src/board-native/examples/tree-view-example.tsx": "'use client';\n/* Actual BoardUI MIT install example adapted to Helios local fixtures. */\nimport{TreeViewPreview}from'../components/application/docs/tree-view-preview.js';export function NativeTreeViewExample(){return <TreeViewPreview/>}\n",
  "src/board-native/exports.ts": "export type {DashboardNavItem as NativeDashboardNavItem,DashboardNavKey as NativeDashboardNavKey} from \"./components/application/dashboard/dashboard-sidebar.js\";\nexport {DashboardSidebar as NativeDashboardSidebar,DASHBOARD_NAV as NativeDASHBOARD_NAV} from \"./components/application/dashboard/dashboard-sidebar.js\";\nexport {DashboardTeamMenu as NativeDashboardTeamMenu} from \"./components/application/dashboard/dashboard-team-menu.js\";\nexport {AccountMenuContent as NativeAccountMenuContent,DashboardUserMenu as NativeDashboardUserMenu} from \"./components/application/dashboard/dashboard-user-menu.js\";\nexport type {StatCardsVariant as NativeStatCardsVariant,StatTone as NativeStatTone,Stat as NativeStat} from \"./components/application/dashboard/stat-cards.js\";\nexport {StatCards as NativeStatCards} from \"./components/application/dashboard/stat-cards.js\";\nexport type {GridCell as NativeGridCell,GridEdit as NativeGridEdit} from \"./components/application/data-grid/data-grid-utils.js\";\nexport {columnLetter as NativecolumnLetter,parseGridValue as NativeparseGridValue,applyGridEdits as NativeapplyGridEdits,parseGridClipboard as NativeparseGridClipboard,serializeGridRows as NativeserializeGridRows} from \"./components/application/data-grid/data-grid-utils.js\";\nexport type {DataGridColumn as NativeDataGridColumn,DataGridProps as NativeDataGridProps} from \"./components/application/data-grid/data-grid.js\";\nexport {DataGrid as NativeDataGrid} from \"./components/application/data-grid/data-grid.js\";\nexport {DataTableExample as NativeDataTableExample} from \"./components/application/data-table/data-table.js\";\nexport {DataGridExample as NativeDataGridExample} from \"./components/application/docs/examples/data-grid-example.js\";\nexport {TreeViewPreview as NativeTreeViewPreview} from \"./components/application/docs/tree-view-preview.js\";\nexport {PlanArtFlame as NativePlanArtFlame} from \"./components/application/settings/plan-art-flame.js\";\nexport {SettingsGeneral as NativeSettingsGeneral} from \"./components/application/settings/settings-general.js\";\nexport type {SettingsPage as NativeSettingsPage,SettingsModalProps as NativeSettingsModalProps} from \"./components/application/settings/settings-modal.js\";\nexport {SettingsModal as NativeSettingsModal} from \"./components/application/settings/settings-modal.js\";\nexport {SettingsProfile as NativeSettingsProfile} from \"./components/application/settings/settings-profile.js\";\nexport {SettingsCard as NativeSettingsCard,SettingsSectionLabel as NativeSettingsSectionLabel,SettingsRow as NativeSettingsRow,SettingsValueField as NativeSettingsValueField} from \"./components/application/settings/settings-rows.js\";\nexport {SettingsStorage as NativeSettingsStorage} from \"./components/application/settings/settings-storage.js\";\nexport {SettingsTools as NativeSettingsTools} from \"./components/application/settings/settings-tools.js\";\nexport type {ThemeMode as NativeThemeMode,ThemeToggleProps as NativeThemeToggleProps} from \"./components/application/theme/theme-toggle.js\";\nexport {applyTheme as NativeapplyTheme,applyThemeWithTransition as NativeapplyThemeWithTransition,useThemeMode as NativeuseThemeMode,ThemeToggle as NativeThemeToggle,THEME_STORAGE_KEY as NativeTHEME_STORAGE_KEY,THEME_CHANGE_EVENT as NativeTHEME_CHANGE_EVENT} from \"./components/application/theme/theme-toggle.js\";\nexport type {AnnouncementProps as NativeAnnouncementProps} from \"./components/base/announcement/announcement.js\";\nexport {Announcement as NativeAnnouncement} from \"./components/base/announcement/announcement.js\";\nexport type {AvatarProps as NativeAvatarProps} from \"./components/base/avatar/avatar.js\";\nexport {Avatar as NativeAvatar} from \"./components/base/avatar/avatar.js\";\nexport type {BadgeProps as NativeBadgeProps} from \"./components/base/badges/badge.js\";\nexport {Badge as NativeBadge} from \"./components/base/badges/badge.js\";\nexport type {ChipProps as NativeChipProps} from \"./components/base/badges/chip.js\";\nexport {Chip as NativeChip} from \"./components/base/badges/chip.js\";\nexport type {StatusDotProps as NativeStatusDotProps} from \"./components/base/badges/status-dot.js\";\nexport {StatusDot as NativeStatusDot} from \"./components/base/badges/status-dot.js\";\nexport type {BreadcrumbProps as NativeBreadcrumbProps,BreadcrumbItemProps as NativeBreadcrumbItemProps} from \"./components/base/breadcrumb/breadcrumb.js\";\nexport {Breadcrumb as NativeBreadcrumb,BreadcrumbItem as NativeBreadcrumbItem} from \"./components/base/breadcrumb/breadcrumb.js\";\nexport type {ButtonGroupProps as NativeButtonGroupProps,ButtonGroupItemProps as NativeButtonGroupItemProps} from \"./components/base/buttons/button-group.js\";\nexport {ButtonGroup as NativeButtonGroup,ButtonGroupItem as NativeButtonGroupItem} from \"./components/base/buttons/button-group.js\";\nexport type {ButtonProps as NativeButtonProps,ButtonLinkProps as NativeButtonLinkProps} from \"./components/base/buttons/button.js\";\nexport {Button as NativeButton,ButtonLink as NativeButtonLink,buttonStyles as NativebuttonStyles} from \"./components/base/buttons/button.js\";\nexport type {CloseButtonProps as NativeCloseButtonProps} from \"./components/base/buttons/close-button.js\";\nexport {CloseButton as NativeCloseButton} from \"./components/base/buttons/close-button.js\";\nexport type {IconButtonProps as NativeIconButtonProps,IconLinkButtonProps as NativeIconLinkButtonProps} from \"./components/base/buttons/icon-button.js\";\nexport {IconButton as NativeIconButton,IconLinkButton as NativeIconLinkButton} from \"./components/base/buttons/icon-button.js\";\nexport type {LinkButtonAnchorProps as NativeLinkButtonAnchorProps,LinkButtonButtonProps as NativeLinkButtonButtonProps,LinkButtonProps as NativeLinkButtonProps} from \"./components/base/buttons/link-button.js\";\nexport {LinkButton as NativeLinkButton,linkButtonStyles as NativelinkButtonStyles} from \"./components/base/buttons/link-button.js\";\nexport type {CarouselProps as NativeCarouselProps,CarouselItemProps as NativeCarouselItemProps} from \"./components/base/carousel/carousel.js\";\nexport {CarouselItem as NativeCarouselItem,Carousel as NativeCarousel} from \"./components/base/carousel/carousel.js\";\nexport type {CheckboxCardProps as NativeCheckboxCardProps} from \"./components/base/checkbox/checkbox-card.js\";\nexport {CheckboxCard as NativeCheckboxCard} from \"./components/base/checkbox/checkbox-card.js\";\nexport type {CheckboxSize as NativeCheckboxSize,CheckboxGlyphState as NativeCheckboxGlyphState} from \"./components/base/checkbox/checkbox-glyph.js\";\nexport {CheckboxGlyph as NativeCheckboxGlyph,checkboxSizes as NativecheckboxSizes} from \"./components/base/checkbox/checkbox-glyph.js\";\nexport type {CheckboxProps as NativeCheckboxProps} from \"./components/base/checkbox/checkbox.js\";\nexport {Checkbox as NativeCheckbox} from \"./components/base/checkbox/checkbox.js\";\nexport type {DatePickerProps as NativeDatePickerProps} from \"./components/base/date-picker/date-picker.js\";\nexport {DatePicker as NativeDatePicker} from \"./components/base/date-picker/date-picker.js\";\nexport type {DateRangeValue as NativeDateRangeValue,DateRangePickerProps as NativeDateRangePickerProps} from \"./components/base/date-picker/date-range-picker.js\";\nexport {DateRangePicker as NativeDateRangePicker} from \"./components/base/date-picker/date-range-picker.js\";\nexport type {MeetingSchedulerHost as NativeMeetingSchedulerHost,MeetingSchedulerDetails as NativeMeetingSchedulerDetails,MeetingSchedulerValue as NativeMeetingSchedulerValue,MeetingSchedulerProps as NativeMeetingSchedulerProps} from \"./components/base/date-picker/meeting-scheduler.js\";\nexport {MeetingScheduler as NativeMeetingScheduler} from \"./components/base/date-picker/meeting-scheduler.js\";\nexport {ChevronLeft16 as NativeChevronLeft16,ChevronRight16 as NativeChevronRight16,formatTriggerDate as NativeformatTriggerDate,formatChipDate as NativeformatChipDate,parseChipDate as NativeparseChipDate,DayCell as NativeDayCell,MonthPanel as NativeMonthPanel,DateChipInput as NativeDateChipInput,triggerButtonClassName as NativetriggerButtonClassName,popoverClassName as NativepopoverClassName} from \"./components/base/date-picker/shared.js\";\nexport type {DividerVariant as NativeDividerVariant,DividerAlign as NativeDividerAlign,DividerProps as NativeDividerProps} from \"./components/base/divider/divider.js\";\nexport {Divider as NativeDivider} from \"./components/base/divider/divider.js\";\nexport type {DropdownProps as NativeDropdownProps,DropdownPopoverProps as NativeDropdownPopoverProps,DropdownGroupProps as NativeDropdownGroupProps,DropdownItemProps as NativeDropdownItemProps} from \"./components/base/dropdown/dropdown.js\";\nexport {Dropdown as NativeDropdown,DropdownTrigger as NativeDropdownTrigger,DropdownPopover as NativeDropdownPopover,DropdownGroup as NativeDropdownGroup,DropdownItem as NativeDropdownItem,DropdownDivider as NativeDropdownDivider} from \"./components/base/dropdown/dropdown.js\";\nexport {MENU_POPOVER_SURFACE as NativeMENU_POPOVER_SURFACE,MENU_POPOVER_WIDTH as NativeMENU_POPOVER_WIDTH,MENU_ITEMS_CONTAINER as NativeMENU_ITEMS_CONTAINER,MENU_ITEM as NativeMENU_ITEM,MENU_ITEM_ACTIVE as NativeMENU_ITEM_ACTIVE,MENU_ITEM_INTERACTIVE as NativeMENU_ITEM_INTERACTIVE} from \"./components/base/dropdown/menu-styles.js\";\nexport type {FileUploadProps as NativeFileUploadProps} from \"./components/base/file-upload/file-upload.js\";\nexport {formatFileSize as NativeformatFileSize,FileUpload as NativeFileUpload} from \"./components/base/file-upload/file-upload.js\";\nexport type {HintTextProps as NativeHintTextProps} from \"./components/base/input/hint-text.js\";\nexport {HintText as NativeHintText} from \"./components/base/input/hint-text.js\";\nexport type {InputSize as NativeInputSize,TextFieldContextValue as NativeTextFieldContextValue,TextFieldProps as NativeTextFieldProps,InputBaseProps as NativeInputBaseProps,InputProps as NativeInputProps} from \"./components/base/input/input.js\";\nexport {TextField as NativeTextField,InputBase as NativeInputBase,Input as NativeInput,TextFieldContext as NativeTextFieldContext} from \"./components/base/input/input.js\";\nexport type {LabelProps as NativeLabelProps} from \"./components/base/input/label.js\";\nexport {Label as NativeLabel} from \"./components/base/input/label.js\";\nexport type {InputOtpProps as NativeInputOtpProps} from \"./components/base/input-otp/input-otp.js\";\nexport {InputOtp as NativeInputOtp} from \"./components/base/input-otp/input-otp.js\";\nexport type {KbdProps as NativeKbdProps} from \"./components/base/kbd/kbd.js\";\nexport {Kbd as NativeKbd} from \"./components/base/kbd/kbd.js\";\nexport type {NotificationStatus as NativeNotificationStatus,NotificationPosition as NativeNotificationPosition,NotificationAvatar as NativeNotificationAvatar,NotificationAction as NativeNotificationAction,NotificationProps as NativeNotificationProps,NotificationViewportProps as NativeNotificationViewportProps} from \"./components/base/notification/notification.js\";\nexport {Notification as NativeNotification,NotificationViewport as NativeNotificationViewport} from \"./components/base/notification/notification.js\";\nexport type {PaginationProps as NativePaginationProps} from \"./components/base/pagination/pagination.js\";\nexport {Pagination as NativePagination} from \"./components/base/pagination/pagination.js\";\nexport type {RadioCardProps as NativeRadioCardProps} from \"./components/base/radio/radio-card.js\";\nexport {RadioCard as NativeRadioCard} from \"./components/base/radio/radio-card.js\";\nexport type {RadioSize as NativeRadioSize,RadioDotProps as NativeRadioDotProps,RadioGroupProps as NativeRadioGroupProps,RadioProps as NativeRadioProps} from \"./components/base/radio/radio.js\";\nexport {RadioDot as NativeRadioDot,RadioGroup as NativeRadioGroup,Radio as NativeRadio} from \"./components/base/radio/radio.js\";\nexport type {SegmentedControlVariant as NativeSegmentedControlVariant,SegmentedControlProps as NativeSegmentedControlProps,SegmentedControlItemProps as NativeSegmentedControlItemProps} from \"./components/base/segmented-control/segmented-control.js\";\nexport {SegmentedControl as NativeSegmentedControl,SegmentedControlItem as NativeSegmentedControlItem} from \"./components/base/segmented-control/segmented-control.js\";\nexport type {SelectSize as NativeSelectSize,SelectProps as NativeSelectProps,SelectItemProps as NativeSelectItemProps} from \"./components/base/select/select.js\";\nexport {Select as NativeSelect,SelectItem as NativeSelectItem} from \"./components/base/select/select.js\";\nexport type {SliderProps as NativeSliderProps,RangeSliderProps as NativeRangeSliderProps} from \"./components/base/slider/slider.js\";\nexport {Slider as NativeSlider,RangeSlider as NativeRangeSlider} from \"./components/base/slider/slider.js\";\nexport type {SocialBrand as NativeSocialBrand,SocialButtonSize as NativeSocialButtonSize,SocialButtonAppearance as NativeSocialButtonAppearance,SocialBrandConfig as NativeSocialBrandConfig,SocialButtonProps as NativeSocialButtonProps,SocialButtonLinkProps as NativeSocialButtonLinkProps,SocialProvider as NativeSocialProvider} from \"./components/base/social-button/social-button.js\";\nexport {SocialButton as NativeSocialButton,SOCIAL_PROVIDERS as NativeSOCIAL_PROVIDERS} from \"./components/base/social-button/social-button.js\";\nexport {SOCIAL_COLOR_LOGOS as NativeSOCIAL_COLOR_LOGOS} from \"./components/base/social-button/social-color-logos.js\";\nexport type {SwitchCardProps as NativeSwitchCardProps} from \"./components/base/switch/switch-card.js\";\nexport {SwitchCard as NativeSwitchCard} from \"./components/base/switch/switch-card.js\";\nexport type {SwitchSize as NativeSwitchSize,SwitchShape as NativeSwitchShape,SwitchVisualState as NativeSwitchVisualState,SwitchProps as NativeSwitchProps} from \"./components/base/switch/switch.js\";\nexport {SwitchTrack as NativeSwitchTrack,Switch as NativeSwitch,switchSizes as NativeswitchSizes} from \"./components/base/switch/switch.js\";\nexport type {TableSize as NativeTableSize,TableProps as NativeTableProps} from \"./components/base/table/table.js\";\nexport {Table as NativeTable,TableHeader as NativeTableHeader,TableColumn as NativeTableColumn,TableBody as NativeTableBody,TableRow as NativeTableRow,TableCell as NativeTableCell} from \"./components/base/table/table.js\";\nexport type {PillTabVariant as NativePillTabVariant,PillTabListProps as NativePillTabListProps} from \"./components/base/tabs/pill-tab.js\";\nexport {PillTabList as NativePillTabList,PillTab as NativePillTab} from \"./components/base/tabs/pill-tab.js\";\nexport type {TabsProps as NativeTabsProps,TabListProps as NativeTabListProps,TabProps as NativeTabProps,TabPanelProps as NativeTabPanelProps} from \"./components/base/tabs/tabs.js\";\nexport {Tabs as NativeTabs,TabList as NativeTabList,Tab as NativeTab,TabPanel as NativeTabPanel} from \"./components/base/tabs/tabs.js\";\nexport type {TextareaResize as NativeTextareaResize,TextareaBaseProps as NativeTextareaBaseProps,TextareaProps as NativeTextareaProps} from \"./components/base/textarea/textarea.js\";\nexport {TextareaBase as NativeTextareaBase,Textarea as NativeTextarea} from \"./components/base/textarea/textarea.js\";\nexport type {TooltipSize as NativeTooltipSize,TooltipProps as NativeTooltipProps,TooltipTriggerProps as NativeTooltipTriggerProps} from \"./components/base/tooltip/tooltip.js\";\nexport {Tooltip as NativeTooltip,TooltipTrigger as NativeTooltipTrigger,TOOLTIP_CARETS as NativeTOOLTIP_CARETS} from \"./components/base/tooltip/tooltip.js\";\nexport type {TreeViewProps as NativeTreeViewProps,TreeViewItemProps as NativeTreeViewItemProps} from \"./components/base/tree-view/tree-view.js\";\nexport {TreeView as NativeTreeView,TreeViewItem as NativeTreeViewItem,TreeViewCollection as NativeTreeViewCollection} from \"./components/base/tree-view/tree-view.js\";\nexport type {Direction as NativeDirection,DirectionProviderProps as NativeDirectionProviderProps} from \"./components/foundations/direction/direction.js\";\nexport {DirectionProvider as NativeDirectionProvider,useDirection as NativeuseDirection} from \"./components/foundations/direction/direction.js\";\nexport {ChevronDownSmall as NativeChevronDownSmall,ChevronRightSmall as NativeChevronRightSmall,ChevronUpDownSmall as NativeChevronUpDownSmall,ChevronSortDown as NativeChevronSortDown} from \"./components/foundations/icons/chevrons.js\";\nexport type {TemplateCopyTranslator as NativeTemplateCopyTranslator} from \"./components/foundations/template-copy/template-copy.js\";\nexport {TemplateMenuProvider as NativeTemplateMenuProvider,useTemplateLanguageSelector as NativeuseTemplateLanguageSelector,TemplateCopyProvider as NativeTemplateCopyProvider,translateTemplateCopy as NativetranslateTemplateCopy,useTemplateCopy as NativeuseTemplateCopy} from \"./components/foundations/template-copy/template-copy.js\";\n",
  "src/board-native/landing-meeting.tsx": "'use client';\nimport{useState}from'react';import{parseDate,type CalendarDate}from'@internationalized/date';import{RangeCalendar}from'react-aria-components';import{RiFlagLine,RiGlobalLine}from'@remixicon/react';\nimport{useTemplateCopy}from'./components/foundations/template-copy/template-copy.js';import{Avatar}from'./components/base/avatar/avatar.js';import{Button}from'./components/base/buttons/button.js';import{MonthPanel}from'./components/base/date-picker/shared.js';\nexport type NativeMeetingSelection={date:string;time:string;timeZone:string};\nexport type NativeMeetingPreviewProps={contained?:boolean;host?:{name:string;email:string;avatarInitial:string};timeZone?:string;onSelectSlot?:(selection:NativeMeetingSelection)=>void;onConfirm?:(selection:NativeMeetingSelection)=>void};\n/** Exact inline source composition; all selection and confirmation stay local unless a host binds callbacks. */\nexport function MeetingSchedulePreview({contained=false,host={name:'Aarav Shah',email:'aarav@example.com',avatarInitial:'A'},timeZone='Asia/Kolkata',onSelectSlot,onConfirm}:NativeMeetingPreviewProps={}){const localize=useTemplateCopy(),[date,setDate]=useState<CalendarDate>(parseDate('2026-08-10')),[time,setTime]=useState<string|null>(null),[confirmed,setConfirmed]=useState(false);const choose=(next:string)=>{setTime(next);setConfirmed(false);onSelectSlot?.({date:date.toString(),time:next,timeZone})};return localize(<div className={contained?'relative flex h-[430px] w-[700px] min-w-[700px] gap-4 rounded-3xl bg-background-secondary-default p-3':'absolute top-[19px] start-4 flex h-[430px] w-[700px] origin-top-left rtl:origin-top-right scale-[calc((100cqw-32px)/1000)] gap-4 rounded-3xl bg-background-secondary-default p-3 sm:scale-[calc((100cqw-32px)/700)] xl:start-5 xl:scale-[0.47]'}><div className=\"flex w-[220px] shrink-0 flex-col gap-4 rounded-2xl bg-background-primary-default p-4 shadow-xs\"><Avatar size=\"sm\"color=\"blue\"initials={host.avatarInitial}/><div><p className=\"text-body-medium text-text-primary\">{host.name}</p><p className=\"text-body-2-regular text-text-secondary\">{host.email}</p></div><div className=\"flex flex-col gap-1\"><p className=\"text-headline-medium text-text-primary\">30 min intro meeting</p><p className=\"text-body-2-regular text-text-secondary\">Let&apos;s discuss your design needs and how we can collaborate 🥳</p></div><div className=\"mt-auto flex flex-col gap-2 text-body-2-medium text-text-secondary\"><span className=\"flex items-center gap-1.5\"><RiGlobalLine className=\"size-4\"/>30 minutes</span><span className=\"flex items-center gap-1.5\"><RiFlagLine className=\"size-4\"/>English</span></div></div><RangeCalendar aria-label=\"Meeting date\"value={{start:date,end:date}}onChange={range=>{setDate(range.start);setTime(null);setConfirmed(false)}}><MonthPanel offset={0}showNext/></RangeCalendar><div className=\"flex w-[170px] shrink-0 flex-col gap-2 overflow-y-auto rounded-2xl bg-background-primary-default p-3\">{['14:00','14:30','15:00','15:30','16:00','16:30','17:00'].map(slot=><Button key={slot}variant={slot===time?'primary':'secondary'}size=\"small\"aria-pressed={slot===time}onClick={()=>choose(slot)}>{slot}</Button>)}{time&&<><Button size=\"small\"disabled={confirmed}onClick={()=>{setConfirmed(true);onConfirm?.({date:date.toString(),time,timeZone})}}>Confirm {time}</Button><p role=\"status\"className=\"text-body-2-regular text-text-secondary\">{confirmed?'Selected locally for '+date.toString()+' '+time+' ('+timeZone+'). No invitation was sent.':'Selected '+date.toString()+' '+time+' ('+timeZone+').'}</p></>}</div></div>)}\n",
  "src/board-native/landing-previews.tsx": "\"use client\";\n/* Adapted from BoardUI MIT source; original license in this directory. */\nimport {useTemplateCopy} from \"./components/foundations/template-copy/template-copy.js\";\nimport {useCallback,useEffect,useRef,useState} from \"react\";\nimport{NativeImage as Image}from\"./NativeImage.js\";\nimport {AccountMenuContent} from \"./components/application/dashboard/dashboard-user-menu.js\";\nimport {DashboardSidebar} from \"./components/application/dashboard/dashboard-sidebar.js\";\nimport {DataTableExample} from \"./components/application/data-table/data-table.js\";\nimport {FileUpload} from \"./components/base/file-upload/file-upload.js\";\nimport {cx} from \"./utils/cx.js\";\nexport function DataTablePreview() {\n  const localize = useTemplateCopy();\n  return localize((\n    <div className=\"absolute top-[15px] end-4 start-4 h-[212px] overflow-hidden rounded-[6px] xl:end-auto xl:start-[15px] xl:h-[179px] xl:w-[275px]\">\n      {/* On desktop the table is painted at its real 790px width and cropped\n          by the card, the same way the sidebar preview is, so the rows read at\n          their true size instead of being shrunk to a third. Narrower screens\n          keep scaling to fit, where a crop would leave too little of it. */}\n      <div className=\"w-[790px] origin-top-left rtl:origin-top-right scale-[calc((100cqw-32px)/790)] xl:scale-100\">\n        <DataTableExample showSizeToggle={false} pageSize={5} />\n      </div>\n    </div>\n  ));\n}\n\nexport function SidebarPreview() {\n  const localize = useTemplateCopy();\n  return localize((\n    <div className=\"absolute top-[19px] left-1/2 h-[732px] w-[260px] -translate-x-1/2 transition-transform duration-[1400ms] ease-[cubic-bezier(.22,1,.36,1)] [transition-delay:250ms] sm:group-hover/card:-translate-y-[554px] sm:group-hover/card:[transition-delay:0ms]\">\n      <DashboardSidebar fluid showThemeToggle={false} />\n    </div>\n  ));\n}\n\nexport function DropdownPreview() {\n  const localize = useTemplateCopy();\n  return localize((\n    <div className=\"absolute top-5 left-1/2 flex min-h-[235px] w-[266px] -translate-x-1/2 flex-col rounded-2xl border border-border-button-default bg-background-primary-default p-2.5 shadow-dropdown transition-transform duration-[700ms] ease-[cubic-bezier(.22,1,.36,1)] [transition-delay:250ms] sm:group-hover/card:-translate-y-[58px] sm:group-hover/card:[transition-delay:0ms]\">\n      <AccountMenuContent onSelect={() => {}} />\n    </div>\n  ));\n}\n\nfunction DocumentPluginIcon({ className }: { className?: string }) {\n  const localize = useTemplateCopy();\n  return localize((\n    <span className={cx(\"inline-flex shrink-0\", className)}>\n      <Image\n        src=\"/react/assets/board-native/ai-chat/plugin-documents.svg\"\n        alt=\"\"\n        width={48}\n        height={48}\n        unoptimized\n        className=\"theme-asset-light size-full object-contain\"\n        aria-hidden\n      />\n      <Image\n        src=\"/react/assets/board-native/ai-chat/plugin-documents-dark.svg\"\n        alt=\"\"\n        width={48}\n        height={48}\n        unoptimized\n        className=\"theme-asset-dark size-full object-contain\"\n        aria-hidden\n      />\n    </span>\n  ));\n}\n\nexport function FileUploadPreview() {\n  const localize = useTemplateCopy();\n  const containerRef = useRef<HTMLDivElement>(null);\n  const dropTimerRef = useRef<number | null>(null);\n  const busyUntilRef = useRef(0);\n  const [showDropFile, setShowDropFile] = useState(false);\n\n  const startDropDemo = useCallback(() => {\n    if (dropTimerRef.current !== null || Date.now() < busyUntilRef.current) return;\n    if (window.matchMedia(\"(max-width: 639px)\").matches) return;\n\n    setShowDropFile(true);\n    dropTimerRef.current = window.setTimeout(() => {\n      const input = containerRef.current?.querySelector<HTMLInputElement>('input[type=\"file\"]');\n      if (input) {\n        const transfer = new DataTransfer();\n        transfer.items.add(\n          new File([new Uint8Array(1_800_000)], \"boardui-components.pdf\", { type: \"application/pdf\" }),\n        );\n        input.files = transfer.files;\n        input.dispatchEvent(new Event(\"change\", { bubbles: true }));\n        busyUntilRef.current = Date.now() + 5000;\n      }\n      dropTimerRef.current = window.setTimeout(() => {\n        dropTimerRef.current = null;\n        setShowDropFile(false);\n      }, 300);\n    }, 1250);\n  }, []);\n\n  const cancelPendingDrop = useCallback(() => {\n    if (dropTimerRef.current !== null) {\n      window.clearTimeout(dropTimerRef.current);\n      dropTimerRef.current = null;\n    }\n    setShowDropFile(false);\n  }, []);\n\n  useEffect(() => {\n    const card = containerRef.current?.closest(\"article\");\n    card?.addEventListener(\"mouseenter\", startDropDemo);\n    card?.addEventListener(\"mouseleave\", cancelPendingDrop);\n\n    return () => {\n      card?.removeEventListener(\"mouseenter\", startDropDemo);\n      card?.removeEventListener(\"mouseleave\", cancelPendingDrop);\n      if (dropTimerRef.current !== null) window.clearTimeout(dropTimerRef.current);\n    };\n  }, [cancelPendingDrop, startDropDemo]);\n\n  return localize((\n    <div\n      ref={containerRef}\n      className=\"absolute top-8 left-1/2 w-[265px] -translate-x-1/2 sm:top-6\"\n    >\n      <FileUpload\n        renderFileIcon={() => <DocumentPluginIcon className=\"size-6\" />}\n      />\n      {showDropFile ? (\n        <span\n          aria-hidden\n          className=\"pointer-events-none absolute top-1/2 left-1/2 z-30 -translate-x-1/2 -translate-y-1/2\"\n        >\n          <DocumentPluginIcon className=\"animate-landing-file-drop size-12\" />\n        </span>\n      ) : null}\n    </div>\n  ));\n}\nexport{MeetingSchedulePreview}from\"./landing-meeting.js\";\n",
  "src/board-native/native-entry.css": "@import \"tailwindcss/theme.css\";\n@import \"tailwindcss/preflight.css\" layer(base);\n@import \"./styles/theme.css\";\n@import \"./styles/typography.css\";\n@import \"tailwindcss/utilities.css\" source(none);\n@source \"./**/*.{ts,tsx}\";\n@source \"../board-native-agents/**/*.{ts,tsx}\";\n@source \"../board-native-charts/**/*.{ts,tsx}\";\n@source \"../AgentPatterns.tsx\";\n@source \"../BoardNativeExamples.tsx\";\n@source \"../BoardNativeVariants.tsx\";\n@source \"../SourceAgentPreview.tsx\";\n@import \"./styles/native-globals.css\";\n",
  "src/board-native/observed-doc-icons.tsx": "'use client';\n/* Exact public Remix icon paths observed in BoardUI docs. MIT source: board-native/LICENSE. */\nimport{createElement,type SVGProps,type ReactElement}from'react';\ntype Node={tag:string;attrs:Record<string,string>;children:Node[]};\nconst icons:Record<string,Node>={\"List\": {\"tag\": \"svg\", \"attrs\": {\"viewBox\": \"0 0 24 24\", \"width\": \"24\", \"height\": \"24\", \"fill\": \"currentColor\"}, \"children\": [{\"tag\": \"path\", \"attrs\": {\"d\": \"M8 4H21V6H8V4ZM4.5 6.5C3.67157 6.5 3 5.82843 3 5C3 4.17157 3.67157 3.5 4.5 3.5C5.32843 3.5 6 4.17157 6 5C6 5.82843 5.32843 6.5 4.5 6.5ZM4.5 13.5C3.67157 13.5 3 12.8284 3 12C3 11.1716 3.67157 10.5 4.5 10.5C5.32843 10.5 6 11.1716 6 12C6 12.8284 5.32843 13.5 4.5 13.5ZM4.5 20.4C3.67157 20.4 3 19.7284 3 18.9C3 18.0716 3.67157 17.4 4.5 17.4C5.32843 17.4 6 18.0716 6 18.9C6 19.7284 5.32843 20.4 4.5 20.4ZM8 11H21V13H8V11ZM8 18H21V20H8V18Z\"}, \"children\": []}]}, \"Grid\": {\"tag\": \"svg\", \"attrs\": {\"viewBox\": \"0 0 24 24\", \"width\": \"24\", \"height\": \"24\", \"fill\": \"currentColor\"}, \"children\": [{\"tag\": \"path\", \"attrs\": {\"d\": \"M21 3C21.5523 3 22 3.44772 22 4V20C22 20.5523 21.5523 21 21 21H3C2.44772 21 2 20.5523 2 20V4C2 3.44772 2.44772 3 3 3H21ZM11 13H4V19H11V13ZM20 13H13V19H20V13ZM11 5H4V11H11V5ZM20 5H13V11H20V5Z\"}, \"children\": []}]}, \"Table\": {\"tag\": \"svg\", \"attrs\": {\"viewBox\": \"0 0 24 24\", \"width\": \"24\", \"height\": \"24\", \"fill\": \"currentColor\"}, \"children\": [{\"tag\": \"path\", \"attrs\": {\"d\": \"M4 8H20V5H4V8ZM14 19V10H10V19H14ZM16 19H20V10H16V19ZM8 19V10H4V19H8ZM3 3H21C21.5523 3 22 3.44772 22 4V20C22 20.5523 21.5523 21 21 21H3C2.44772 21 2 20.5523 2 20V4C2 3.44772 2.44772 3 3 3Z\"}, \"children\": []}]}, \"Changes\": {\"tag\": \"svg\", \"attrs\": {\"viewBox\": \"0 0 24 24\", \"width\": \"24\", \"height\": \"24\", \"fill\": \"currentColor\"}, \"children\": [{\"tag\": \"path\", \"attrs\": {\"d\": \"M3 12C3 10.067 4.567 8.5 6.5 8.5C7.7035 8.5 8.51959 8.9338 9.19914 9.61336C9.9255 10.3397 10.4851 11.3322 11.1258 12.4856L11.1595 12.5462C11.7605 13.6283 12.4431 14.8573 13.3866 15.8009C14.3946 16.8088 15.7035 17.5 17.5 17.5C20.5376 17.5 23 15.0376 23 12C23 8.96243 20.5376 6.5 17.5 6.5C15.8394 6.5 14.3508 7.2359 13.3423 8.39937C13.7887 9.05406 14.1574 9.70577 14.464 10.2574C15.0681 9.20718 16.2014 8.5 17.5 8.5C19.433 8.5 21 10.067 21 12C21 13.933 19.433 15.5 17.5 15.5C16.2965 15.5 15.4804 15.0662 14.8009 14.3866C14.0745 13.6603 13.5149 12.6678 12.8742 11.5144L12.8405 11.4538C12.2395 10.3717 11.5569 9.14265 10.6134 8.19914C9.60541 7.1912 8.2965 6.5 6.5 6.5C3.46243 6.5 1 8.96243 1 12C1 15.0376 3.46243 17.5 6.5 17.5C8.16056 17.5 9.64923 16.7641 10.6577 15.6006C10.2113 14.9459 9.84262 14.2942 9.53605 13.7426C8.93194 14.7928 7.79856 15.5 6.5 15.5C4.567 15.5 3 13.933 3 12Z\"}, \"children\": []}]}, \"Browser\": {\"tag\": \"svg\", \"attrs\": {\"viewBox\": \"0 0 24 24\", \"width\": \"24\", \"height\": \"24\", \"fill\": \"currentColor\"}, \"children\": [{\"tag\": \"path\", \"attrs\": {\"d\": \"M12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22ZM9.71002 19.6674C8.74743 17.6259 8.15732 15.3742 8.02731 13H4.06189C4.458 16.1765 6.71639 18.7747 9.71002 19.6674ZM10.0307 13C10.1811 15.4388 10.8778 17.7297 12 19.752C13.1222 17.7297 13.8189 15.4388 13.9693 13H10.0307ZM19.9381 13H15.9727C15.8427 15.3742 15.2526 17.6259 14.29 19.6674C17.2836 18.7747 19.542 16.1765 19.9381 13ZM4.06189 11H8.02731C8.15732 8.62577 8.74743 6.37407 9.71002 4.33256C6.71639 5.22533 4.458 7.8235 4.06189 11ZM10.0307 11H13.9693C13.8189 8.56122 13.1222 6.27025 12 4.24799C10.8778 6.27025 10.1811 8.56122 10.0307 11ZM14.29 4.33256C15.2526 6.37407 15.8427 8.62577 15.9727 11H19.9381C19.542 7.8235 17.2836 5.22533 14.29 4.33256Z\"}, \"children\": []}]}, \"IconNotifications\": {\"tag\": \"svg\", \"attrs\": {\"viewBox\": \"0 0 24 24\", \"width\": \"24\", \"height\": \"24\", \"fill\": \"currentColor\"}, \"children\": [{\"tag\": \"path\", \"attrs\": {\"d\": \"M5 18H19V11.0314C19 7.14806 15.866 4 12 4C8.13401 4 5 7.14806 5 11.0314V18ZM12 2C16.9706 2 21 6.04348 21 11.0314V20H3V11.0314C3 6.04348 7.02944 2 12 2ZM9.5 21H14.5C14.5 22.3807 13.3807 23.5 12 23.5C10.6193 23.5 9.5 22.3807 9.5 21Z\"}, \"children\": []}]}, \"IconEdit\": {\"tag\": \"svg\", \"attrs\": {\"viewBox\": \"0 0 24 24\", \"width\": \"24\", \"height\": \"24\", \"fill\": \"currentColor\"}, \"children\": [{\"tag\": \"path\", \"attrs\": {\"d\": \"M6.41421 15.89L16.5563 5.74785L15.1421 4.33363L5 14.4758V15.89H6.41421ZM7.24264 17.89H3V13.6473L14.435 2.21231C14.8256 1.82179 15.4587 1.82179 15.8492 2.21231L18.6777 5.04074C19.0682 5.43126 19.0682 6.06443 18.6777 6.45495L7.24264 17.89ZM3 19.89H21V21.89H3V19.89Z\"}, \"children\": []}]}, \"IconDisabled\": {\"tag\": \"svg\", \"attrs\": {\"viewBox\": \"0 0 24 24\", \"width\": \"24\", \"height\": \"24\", \"fill\": \"currentColor\"}, \"children\": [{\"tag\": \"path\", \"attrs\": {\"d\": \"M5 18H19V11.0314C19 7.14806 15.866 4 12 4C8.13401 4 5 7.14806 5 11.0314V18ZM12 2C16.9706 2 21 6.04348 21 11.0314V20H3V11.0314C3 6.04348 7.02944 2 12 2ZM9.5 21H14.5C14.5 22.3807 13.3807 23.5 12 23.5C10.6193 23.5 9.5 22.3807 9.5 21Z\"}, \"children\": []}]}, \"IconDelete\": {\"tag\": \"svg\", \"attrs\": {\"viewBox\": \"0 0 24 24\", \"width\": \"24\", \"height\": \"24\", \"fill\": \"currentColor\"}, \"children\": [{\"tag\": \"path\", \"attrs\": {\"d\": \"M7 4V2H17V4H22V6H20V21C20 21.5523 19.5523 22 19 22H5C4.44772 22 4 21.5523 4 21V6H2V4H7ZM6 6V20H18V6H6ZM9 9H11V17H9V9ZM13 9H15V17H13V9Z\"}, \"children\": []}]}, \"IconMore\": {\"tag\": \"svg\", \"attrs\": {\"viewBox\": \"0 0 24 24\", \"width\": \"24\", \"height\": \"24\", \"fill\": \"currentColor\"}, \"children\": [{\"tag\": \"path\", \"attrs\": {\"d\": \"M12 3C10.9 3 10 3.9 10 5C10 6.1 10.9 7 12 7C13.1 7 14 6.1 14 5C14 3.9 13.1 3 12 3ZM12 17C10.9 17 10 17.9 10 19C10 20.1 10.9 21 12 21C13.1 21 14 20.1 14 19C14 17.9 13.1 17 12 17ZM12 10C10.9 10 10 10.9 10 12C10 13.1 10.9 14 12 14C13.1 14 14 13.1 14 12C14 10.9 13.1 10 12 10Z\"}, \"children\": []}]}, \"Backup\": {\"tag\": \"svg\", \"attrs\": {\"viewBox\": \"0 0 24 24\", \"width\": \"24\", \"height\": \"24\", \"fill\": \"currentColor\"}, \"children\": [{\"tag\": \"path\", \"attrs\": {\"d\": \"M17 7C13.5705 7 10.6449 9.15804 9.50734 12.1903L11.3805 12.8927C12.2337 10.6185 14.4278 9 17 9C17.6983 9 18.3687 9.11928 18.992 9.33857C21.3265 10.16 23 12.3846 23 15C23 18.3137 20.3137 21 17 21H7C3.68629 21 1 18.3137 1 15C1 12.3846 2.67346 10.16 5.00804 9.33857C5.0027 9.22639 5 9.11351 5 9C5 5.13401 8.13401 2 12 2C15.242 2 17.9693 4.20399 18.7652 7.19539C18.1973 7.0675 17.6065 7 17 7Z\"}, \"children\": []}]}, \"Weekly\": {\"tag\": \"svg\", \"attrs\": {\"viewBox\": \"0 0 24 24\", \"width\": \"24\", \"height\": \"24\", \"fill\": \"currentColor\"}, \"children\": [{\"tag\": \"path\", \"attrs\": {\"d\": \"M7 3V1H9V3H15V1H17V3H21C21.5523 3 22 3.44772 22 4V9H20V5H17V7H15V5H9V7H7V5H4V19H10V21H3C2.44772 21 2 20.5523 2 20V4C2 3.44772 2.44772 3 3 3H7ZM17 12C14.7909 12 13 13.7909 13 16C13 18.2091 14.7909 20 17 20C19.2091 20 21 18.2091 21 16C21 13.7909 19.2091 12 17 12ZM11 16C11 12.6863 13.6863 10 17 10C20.3137 10 23 12.6863 23 16C23 19.3137 20.3137 22 17 22C13.6863 22 11 19.3137 11 16ZM16 13V16.4142L18.2929 18.7071L19.7071 17.2929L18 15.5858V13H16Z\"}, \"children\": []}]}};\nfunction draw(node:Node,key:number):ReactElement{return createElement(node.tag,{...node.attrs,key},...node.children.map(draw))}\nfunction icon(name:string){return function ObservedIcon(props:SVGProps<SVGSVGElement>){const node=icons[name];return createElement('svg',{...node.attrs,...props},...node.children.map(draw))}}\nexport const ObservedListIcon=icon('List'),ObservedGridIcon=icon('Grid'),ObservedTableIcon=icon('Table'),ObservedChangesIcon=icon('Changes'),ObservedBrowserIcon=icon('Browser');\n\nexport const ObservedIconNotifications=icon(\"IconNotifications\");\nexport const ObservedIconEdit=icon(\"IconEdit\");\nexport const ObservedIconDisabled=icon(\"IconDisabled\");\nexport const ObservedIconDelete=icon(\"IconDelete\");\nexport const ObservedIconMore=icon(\"IconMore\");\nexport const ObservedBackupIcon=icon(\"Backup\");\nexport const ObservedWeeklyIcon=icon(\"Weekly\");\n",
  "src/board-native/phone-countries.json": "[{\"value\": \"AF\", \"label\": \"Afghanistan\", \"trigger\": \"+93\"}, {\"value\": \"AX\", \"label\": \"Aland\", \"trigger\": \"+358\"}, {\"value\": \"AL\", \"label\": \"Albania\", \"trigger\": \"+355\"}, {\"value\": \"DZ\", \"label\": \"Algeria\", \"trigger\": \"+213\"}, {\"value\": \"AS\", \"label\": \"American Samoa\", \"trigger\": \"+1684\"}, {\"value\": \"AD\", \"label\": \"Andorra\", \"trigger\": \"+376\"}, {\"value\": \"AO\", \"label\": \"Angola\", \"trigger\": \"+244\"}, {\"value\": \"AI\", \"label\": \"Anguilla\", \"trigger\": \"+1264\"}, {\"value\": \"AQ\", \"label\": \"Antarctica\", \"trigger\": \"+672\"}, {\"value\": \"AG\", \"label\": \"Antigua and Barbuda\", \"trigger\": \"+1268\"}, {\"value\": \"AR\", \"label\": \"Argentina\", \"trigger\": \"+54\"}, {\"value\": \"AM\", \"label\": \"Armenia\", \"trigger\": \"+374\"}, {\"value\": \"AW\", \"label\": \"Aruba\", \"trigger\": \"+297\"}, {\"value\": \"AC\", \"label\": \"Ascension Island\", \"trigger\": \"+247\"}, {\"value\": \"AU\", \"label\": \"Australia\", \"trigger\": \"+61\"}, {\"value\": \"AT\", \"label\": \"Austria\", \"trigger\": \"+43\"}, {\"value\": \"AZ\", \"label\": \"Azerbaijan\", \"trigger\": \"+994\"}, {\"value\": \"BS\", \"label\": \"Bahamas\", \"trigger\": \"+1242\"}, {\"value\": \"BH\", \"label\": \"Bahrain\", \"trigger\": \"+973\"}, {\"value\": \"BD\", \"label\": \"Bangladesh\", \"trigger\": \"+880\"}, {\"value\": \"BB\", \"label\": \"Barbados\", \"trigger\": \"+1246\"}, {\"value\": \"BY\", \"label\": \"Belarus\", \"trigger\": \"+375\"}, {\"value\": \"BE\", \"label\": \"Belgium\", \"trigger\": \"+32\"}, {\"value\": \"BZ\", \"label\": \"Belize\", \"trigger\": \"+501\"}, {\"value\": \"BJ\", \"label\": \"Benin\", \"trigger\": \"+229\"}, {\"value\": \"BM\", \"label\": \"Bermuda\", \"trigger\": \"+1441\"}, {\"value\": \"BT\", \"label\": \"Bhutan\", \"trigger\": \"+975\"}, {\"value\": \"BO\", \"label\": \"Bolivia\", \"trigger\": \"+591\"}, {\"value\": \"BQ\", \"label\": \"Bonaire\", \"trigger\": \"+5997\"}, {\"value\": \"BA\", \"label\": \"Bosnia and Herzegovina\", \"trigger\": \"+387\"}, {\"value\": \"BW\", \"label\": \"Botswana\", \"trigger\": \"+267\"}, {\"value\": \"BV\", \"label\": \"Bouvet Island\", \"trigger\": \"+47\"}, {\"value\": \"BR\", \"label\": \"Brazil\", \"trigger\": \"+55\"}, {\"value\": \"IO\", \"label\": \"British Indian Ocean Territory\", \"trigger\": \"+246\"}, {\"value\": \"VG\", \"label\": \"British Virgin Islands\", \"trigger\": \"+1284\"}, {\"value\": \"BN\", \"label\": \"Brunei\", \"trigger\": \"+673\"}, {\"value\": \"BG\", \"label\": \"Bulgaria\", \"trigger\": \"+359\"}, {\"value\": \"BF\", \"label\": \"Burkina Faso\", \"trigger\": \"+226\"}, {\"value\": \"BI\", \"label\": \"Burundi\", \"trigger\": \"+257\"}, {\"value\": \"KH\", \"label\": \"Cambodia\", \"trigger\": \"+855\"}, {\"value\": \"CM\", \"label\": \"Cameroon\", \"trigger\": \"+237\"}, {\"value\": \"CA\", \"label\": \"Canada\", \"trigger\": \"+1\"}, {\"value\": \"CV\", \"label\": \"Cape Verde\", \"trigger\": \"+238\"}, {\"value\": \"KY\", \"label\": \"Cayman Islands\", \"trigger\": \"+1345\"}, {\"value\": \"CF\", \"label\": \"Central African Republic\", \"trigger\": \"+236\"}, {\"value\": \"TD\", \"label\": \"Chad\", \"trigger\": \"+235\"}, {\"value\": \"CL\", \"label\": \"Chile\", \"trigger\": \"+56\"}, {\"value\": \"CN\", \"label\": \"China\", \"trigger\": \"+86\"}, {\"value\": \"CX\", \"label\": \"Christmas Island\", \"trigger\": \"+61\"}, {\"value\": \"CC\", \"label\": \"Cocos (Keeling) Islands\", \"trigger\": \"+61\"}, {\"value\": \"CO\", \"label\": \"Colombia\", \"trigger\": \"+57\"}, {\"value\": \"KM\", \"label\": \"Comoros\", \"trigger\": \"+269\"}, {\"value\": \"CK\", \"label\": \"Cook Islands\", \"trigger\": \"+682\"}, {\"value\": \"CR\", \"label\": \"Costa Rica\", \"trigger\": \"+506\"}, {\"value\": \"HR\", \"label\": \"Croatia\", \"trigger\": \"+385\"}, {\"value\": \"CU\", \"label\": \"Cuba\", \"trigger\": \"+53\"}, {\"value\": \"CW\", \"label\": \"Curacao\", \"trigger\": \"+5999\"}, {\"value\": \"CY\", \"label\": \"Cyprus\", \"trigger\": \"+357\"}, {\"value\": \"CZ\", \"label\": \"Czech Republic\", \"trigger\": \"+420\"}, {\"value\": \"CD\", \"label\": \"Democratic Republic of the Congo\", \"trigger\": \"+243\"}, {\"value\": \"DK\", \"label\": \"Denmark\", \"trigger\": \"+45\"}, {\"value\": \"DJ\", \"label\": \"Djibouti\", \"trigger\": \"+253\"}, {\"value\": \"DM\", \"label\": \"Dominica\", \"trigger\": \"+1767\"}, {\"value\": \"DO\", \"label\": \"Dominican Republic\", \"trigger\": \"+1809\"}, {\"value\": \"TL\", \"label\": \"East Timor\", \"trigger\": \"+670\"}, {\"value\": \"EC\", \"label\": \"Ecuador\", \"trigger\": \"+593\"}, {\"value\": \"EG\", \"label\": \"Egypt\", \"trigger\": \"+20\"}, {\"value\": \"SV\", \"label\": \"El Salvador\", \"trigger\": \"+503\"}, {\"value\": \"GQ\", \"label\": \"Equatorial Guinea\", \"trigger\": \"+240\"}, {\"value\": \"ER\", \"label\": \"Eritrea\", \"trigger\": \"+291\"}, {\"value\": \"EE\", \"label\": \"Estonia\", \"trigger\": \"+372\"}, {\"value\": \"SZ\", \"label\": \"Eswatini\", \"trigger\": \"+268\"}, {\"value\": \"ET\", \"label\": \"Ethiopia\", \"trigger\": \"+251\"}, {\"value\": \"FK\", \"label\": \"Falkland Islands\", \"trigger\": \"+500\"}, {\"value\": \"FO\", \"label\": \"Faroe Islands\", \"trigger\": \"+298\"}, {\"value\": \"FJ\", \"label\": \"Fiji\", \"trigger\": \"+679\"}, {\"value\": \"FI\", \"label\": \"Finland\", \"trigger\": \"+358\"}, {\"value\": \"FR\", \"label\": \"France\", \"trigger\": \"+33\"}, {\"value\": \"GF\", \"label\": \"French Guiana\", \"trigger\": \"+594\"}, {\"value\": \"PF\", \"label\": \"French Polynesia\", \"trigger\": \"+689\"}, {\"value\": \"TF\", \"label\": \"French Southern Territories\", \"trigger\": \"+262\"}, {\"value\": \"GA\", \"label\": \"Gabon\", \"trigger\": \"+241\"}, {\"value\": \"GM\", \"label\": \"Gambia\", \"trigger\": \"+220\"}, {\"value\": \"GE\", \"label\": \"Georgia\", \"trigger\": \"+995\"}, {\"value\": \"DE\", \"label\": \"Germany\", \"trigger\": \"+49\"}, {\"value\": \"GH\", \"label\": \"Ghana\", \"trigger\": \"+233\"}, {\"value\": \"GI\", \"label\": \"Gibraltar\", \"trigger\": \"+350\"}, {\"value\": \"GR\", \"label\": \"Greece\", \"trigger\": \"+30\"}, {\"value\": \"GL\", \"label\": \"Greenland\", \"trigger\": \"+299\"}, {\"value\": \"GD\", \"label\": \"Grenada\", \"trigger\": \"+1473\"}, {\"value\": \"GP\", \"label\": \"Guadeloupe\", \"trigger\": \"+590\"}, {\"value\": \"GU\", \"label\": \"Guam\", \"trigger\": \"+1671\"}, {\"value\": \"GT\", \"label\": \"Guatemala\", \"trigger\": \"+502\"}, {\"value\": \"GG\", \"label\": \"Guernsey\", \"trigger\": \"+44\"}, {\"value\": \"GN\", \"label\": \"Guinea\", \"trigger\": \"+224\"}, {\"value\": \"GW\", \"label\": \"Guinea-Bissau\", \"trigger\": \"+245\"}, {\"value\": \"GY\", \"label\": \"Guyana\", \"trigger\": \"+592\"}, {\"value\": \"HT\", \"label\": \"Haiti\", \"trigger\": \"+509\"}, {\"value\": \"HM\", \"label\": \"Heard Island and McDonald Islands\", \"trigger\": \"+61\"}, {\"value\": \"HN\", \"label\": \"Honduras\", \"trigger\": \"+504\"}, {\"value\": \"HK\", \"label\": \"Hong Kong\", \"trigger\": \"+852\"}, {\"value\": \"HU\", \"label\": \"Hungary\", \"trigger\": \"+36\"}, {\"value\": \"IS\", \"label\": \"Iceland\", \"trigger\": \"+354\"}, {\"value\": \"IN\", \"label\": \"India\", \"trigger\": \"+91\"}, {\"value\": \"ID\", \"label\": \"Indonesia\", \"trigger\": \"+62\"}, {\"value\": \"IR\", \"label\": \"Iran\", \"trigger\": \"+98\"}, {\"value\": \"IQ\", \"label\": \"Iraq\", \"trigger\": \"+964\"}, {\"value\": \"IE\", \"label\": \"Ireland\", \"trigger\": \"+353\"}, {\"value\": \"IM\", \"label\": \"Isle of Man\", \"trigger\": \"+44\"}, {\"value\": \"IL\", \"label\": \"Israel\", \"trigger\": \"+972\"}, {\"value\": \"IT\", \"label\": \"Italy\", \"trigger\": \"+39\"}, {\"value\": \"CI\", \"label\": \"Ivory Coast\", \"trigger\": \"+225\"}, {\"value\": \"JM\", \"label\": \"Jamaica\", \"trigger\": \"+1876\"}, {\"value\": \"JP\", \"label\": \"Japan\", \"trigger\": \"+81\"}, {\"value\": \"JE\", \"label\": \"Jersey\", \"trigger\": \"+44\"}, {\"value\": \"JO\", \"label\": \"Jordan\", \"trigger\": \"+962\"}, {\"value\": \"KZ\", \"label\": \"Kazakhstan\", \"trigger\": \"+7\"}, {\"value\": \"KE\", \"label\": \"Kenya\", \"trigger\": \"+254\"}, {\"value\": \"KI\", \"label\": \"Kiribati\", \"trigger\": \"+686\"}, {\"value\": \"XK\", \"label\": \"Kosovo\", \"trigger\": \"+377\"}, {\"value\": \"KW\", \"label\": \"Kuwait\", \"trigger\": \"+965\"}, {\"value\": \"KG\", \"label\": \"Kyrgyzstan\", \"trigger\": \"+996\"}, {\"value\": \"LA\", \"label\": \"Laos\", \"trigger\": \"+856\"}, {\"value\": \"LV\", \"label\": \"Latvia\", \"trigger\": \"+371\"}, {\"value\": \"LB\", \"label\": \"Lebanon\", \"trigger\": \"+961\"}, {\"value\": \"LS\", \"label\": \"Lesotho\", \"trigger\": \"+266\"}, {\"value\": \"LR\", \"label\": \"Liberia\", \"trigger\": \"+231\"}, {\"value\": \"LY\", \"label\": \"Libya\", \"trigger\": \"+218\"}, {\"value\": \"LI\", \"label\": \"Liechtenstein\", \"trigger\": \"+423\"}, {\"value\": \"LT\", \"label\": \"Lithuania\", \"trigger\": \"+370\"}, {\"value\": \"LU\", \"label\": \"Luxembourg\", \"trigger\": \"+352\"}, {\"value\": \"MO\", \"label\": \"Macao\", \"trigger\": \"+853\"}, {\"value\": \"MG\", \"label\": \"Madagascar\", \"trigger\": \"+261\"}, {\"value\": \"MW\", \"label\": \"Malawi\", \"trigger\": \"+265\"}, {\"value\": \"MY\", \"label\": \"Malaysia\", \"trigger\": \"+60\"}, {\"value\": \"MV\", \"label\": \"Maldives\", \"trigger\": \"+960\"}, {\"value\": \"ML\", \"label\": \"Mali\", \"trigger\": \"+223\"}, {\"value\": \"MT\", \"label\": \"Malta\", \"trigger\": \"+356\"}, {\"value\": \"MH\", \"label\": \"Marshall Islands\", \"trigger\": \"+692\"}, {\"value\": \"MQ\", \"label\": \"Martinique\", \"trigger\": \"+596\"}, {\"value\": \"MR\", \"label\": \"Mauritania\", \"trigger\": \"+222\"}, {\"value\": \"MU\", \"label\": \"Mauritius\", \"trigger\": \"+230\"}, {\"value\": \"YT\", \"label\": \"Mayotte\", \"trigger\": \"+262\"}, {\"value\": \"MX\", \"label\": \"Mexico\", \"trigger\": \"+52\"}, {\"value\": \"FM\", \"label\": \"Micronesia\", \"trigger\": \"+691\"}, {\"value\": \"MD\", \"label\": \"Moldova\", \"trigger\": \"+373\"}, {\"value\": \"MC\", \"label\": \"Monaco\", \"trigger\": \"+377\"}, {\"value\": \"MN\", \"label\": \"Mongolia\", \"trigger\": \"+976\"}, {\"value\": \"ME\", \"label\": \"Montenegro\", \"trigger\": \"+382\"}, {\"value\": \"MS\", \"label\": \"Montserrat\", \"trigger\": \"+1664\"}, {\"value\": \"MA\", \"label\": \"Morocco\", \"trigger\": \"+212\"}, {\"value\": \"MZ\", \"label\": \"Mozambique\", \"trigger\": \"+258\"}, {\"value\": \"MM\", \"label\": \"Myanmar (Burma)\", \"trigger\": \"+95\"}, {\"value\": \"NA\", \"label\": \"Namibia\", \"trigger\": \"+264\"}, {\"value\": \"NR\", \"label\": \"Nauru\", \"trigger\": \"+674\"}, {\"value\": \"NP\", \"label\": \"Nepal\", \"trigger\": \"+977\"}, {\"value\": \"NL\", \"label\": \"Netherlands\", \"trigger\": \"+31\"}, {\"value\": \"NC\", \"label\": \"New Caledonia\", \"trigger\": \"+687\"}, {\"value\": \"NZ\", \"label\": \"New Zealand\", \"trigger\": \"+64\"}, {\"value\": \"NI\", \"label\": \"Nicaragua\", \"trigger\": \"+505\"}, {\"value\": \"NE\", \"label\": \"Niger\", \"trigger\": \"+227\"}, {\"value\": \"NG\", \"label\": \"Nigeria\", \"trigger\": \"+234\"}, {\"value\": \"NU\", \"label\": \"Niue\", \"trigger\": \"+683\"}, {\"value\": \"NF\", \"label\": \"Norfolk Island\", \"trigger\": \"+672\"}, {\"value\": \"KP\", \"label\": \"North Korea\", \"trigger\": \"+850\"}, {\"value\": \"MK\", \"label\": \"North Macedonia\", \"trigger\": \"+389\"}, {\"value\": \"MP\", \"label\": \"Northern Mariana Islands\", \"trigger\": \"+1670\"}, {\"value\": \"NO\", \"label\": \"Norway\", \"trigger\": \"+47\"}, {\"value\": \"OM\", \"label\": \"Oman\", \"trigger\": \"+968\"}, {\"value\": \"PK\", \"label\": \"Pakistan\", \"trigger\": \"+92\"}, {\"value\": \"PW\", \"label\": \"Palau\", \"trigger\": \"+680\"}, {\"value\": \"PS\", \"label\": \"Palestine\", \"trigger\": \"+970\"}, {\"value\": \"PA\", \"label\": \"Panama\", \"trigger\": \"+507\"}, {\"value\": \"PG\", \"label\": \"Papua New Guinea\", \"trigger\": \"+675\"}, {\"value\": \"PY\", \"label\": \"Paraguay\", \"trigger\": \"+595\"}, {\"value\": \"PE\", \"label\": \"Peru\", \"trigger\": \"+51\"}, {\"value\": \"PH\", \"label\": \"Philippines\", \"trigger\": \"+63\"}, {\"value\": \"PN\", \"label\": \"Pitcairn Islands\", \"trigger\": \"+64\"}, {\"value\": \"PL\", \"label\": \"Poland\", \"trigger\": \"+48\"}, {\"value\": \"PT\", \"label\": \"Portugal\", \"trigger\": \"+351\"}, {\"value\": \"PR\", \"label\": \"Puerto Rico\", \"trigger\": \"+1787\"}, {\"value\": \"QA\", \"label\": \"Qatar\", \"trigger\": \"+974\"}, {\"value\": \"CG\", \"label\": \"Republic of the Congo\", \"trigger\": \"+242\"}, {\"value\": \"RE\", \"label\": \"Reunion\", \"trigger\": \"+262\"}, {\"value\": \"RO\", \"label\": \"Romania\", \"trigger\": \"+40\"}, {\"value\": \"RU\", \"label\": \"Russia\", \"trigger\": \"+7\"}, {\"value\": \"RW\", \"label\": \"Rwanda\", \"trigger\": \"+250\"}, {\"value\": \"BL\", \"label\": \"Saint Barthelemy\", \"trigger\": \"+590\"}, {\"value\": \"SH\", \"label\": \"Saint Helena\", \"trigger\": \"+290\"}, {\"value\": \"KN\", \"label\": \"Saint Kitts and Nevis\", \"trigger\": \"+1869\"}, {\"value\": \"LC\", \"label\": \"Saint Lucia\", \"trigger\": \"+1758\"}, {\"value\": \"MF\", \"label\": \"Saint Martin\", \"trigger\": \"+590\"}, {\"value\": \"PM\", \"label\": \"Saint Pierre and Miquelon\", \"trigger\": \"+508\"}, {\"value\": \"VC\", \"label\": \"Saint Vincent and the Grenadines\", \"trigger\": \"+1784\"}, {\"value\": \"WS\", \"label\": \"Samoa\", \"trigger\": \"+685\"}, {\"value\": \"SM\", \"label\": \"San Marino\", \"trigger\": \"+378\"}, {\"value\": \"ST\", \"label\": \"Sao Tome and Principe\", \"trigger\": \"+239\"}, {\"value\": \"SA\", \"label\": \"Saudi Arabia\", \"trigger\": \"+966\"}, {\"value\": \"SN\", \"label\": \"Senegal\", \"trigger\": \"+221\"}, {\"value\": \"RS\", \"label\": \"Serbia\", \"trigger\": \"+381\"}, {\"value\": \"SC\", \"label\": \"Seychelles\", \"trigger\": \"+248\"}, {\"value\": \"SL\", \"label\": \"Sierra Leone\", \"trigger\": \"+232\"}, {\"value\": \"SG\", \"label\": \"Singapore\", \"trigger\": \"+65\"}, {\"value\": \"SX\", \"label\": \"Sint Maarten\", \"trigger\": \"+1721\"}, {\"value\": \"SK\", \"label\": \"Slovakia\", \"trigger\": \"+421\"}, {\"value\": \"SI\", \"label\": \"Slovenia\", \"trigger\": \"+386\"}, {\"value\": \"SB\", \"label\": \"Solomon Islands\", \"trigger\": \"+677\"}, {\"value\": \"SO\", \"label\": \"Somalia\", \"trigger\": \"+252\"}, {\"value\": \"ZA\", \"label\": \"South Africa\", \"trigger\": \"+27\"}, {\"value\": \"GS\", \"label\": \"South Georgia and the South Sandwich Islands\", \"trigger\": \"+500\"}, {\"value\": \"KR\", \"label\": \"South Korea\", \"trigger\": \"+82\"}, {\"value\": \"SS\", \"label\": \"South Sudan\", \"trigger\": \"+211\"}, {\"value\": \"ES\", \"label\": \"Spain\", \"trigger\": \"+34\"}, {\"value\": \"LK\", \"label\": \"Sri Lanka\", \"trigger\": \"+94\"}, {\"value\": \"SD\", \"label\": \"Sudan\", \"trigger\": \"+249\"}, {\"value\": \"SR\", \"label\": \"Suriname\", \"trigger\": \"+597\"}, {\"value\": \"SJ\", \"label\": \"Svalbard and Jan Mayen\", \"trigger\": \"+4779\"}, {\"value\": \"SE\", \"label\": \"Sweden\", \"trigger\": \"+46\"}, {\"value\": \"CH\", \"label\": \"Switzerland\", \"trigger\": \"+41\"}, {\"value\": \"SY\", \"label\": \"Syria\", \"trigger\": \"+963\"}, {\"value\": \"TW\", \"label\": \"Taiwan\", \"trigger\": \"+886\"}, {\"value\": \"TJ\", \"label\": \"Tajikistan\", \"trigger\": \"+992\"}, {\"value\": \"TZ\", \"label\": \"Tanzania\", \"trigger\": \"+255\"}, {\"value\": \"TH\", \"label\": \"Thailand\", \"trigger\": \"+66\"}, {\"value\": \"TG\", \"label\": \"Togo\", \"trigger\": \"+228\"}, {\"value\": \"TK\", \"label\": \"Tokelau\", \"trigger\": \"+690\"}, {\"value\": \"TO\", \"label\": \"Tonga\", \"trigger\": \"+676\"}, {\"value\": \"TT\", \"label\": \"Trinidad and Tobago\", \"trigger\": \"+1868\"}, {\"value\": \"TA\", \"label\": \"Tristan da Cunha\", \"trigger\": \"+290\"}, {\"value\": \"TN\", \"label\": \"Tunisia\", \"trigger\": \"+216\"}, {\"value\": \"TR\", \"label\": \"Türkiye\", \"trigger\": \"+90\"}, {\"value\": \"TM\", \"label\": \"Turkmenistan\", \"trigger\": \"+993\"}, {\"value\": \"TC\", \"label\": \"Turks and Caicos Islands\", \"trigger\": \"+1649\"}, {\"value\": \"TV\", \"label\": \"Tuvalu\", \"trigger\": \"+688\"}, {\"value\": \"UM\", \"label\": \"U.S. Minor Outlying Islands\", \"trigger\": \"+1\"}, {\"value\": \"VI\", \"label\": \"U.S. Virgin Islands\", \"trigger\": \"+1340\"}, {\"value\": \"UG\", \"label\": \"Uganda\", \"trigger\": \"+256\"}, {\"value\": \"UA\", \"label\": \"Ukraine\", \"trigger\": \"+380\"}, {\"value\": \"AE\", \"label\": \"United Arab Emirates\", \"trigger\": \"+971\"}, {\"value\": \"GB\", \"label\": \"United Kingdom\", \"trigger\": \"+44\"}, {\"value\": \"US\", \"label\": \"United States\", \"trigger\": \"+1\"}, {\"value\": \"UY\", \"label\": \"Uruguay\", \"trigger\": \"+598\"}, {\"value\": \"UZ\", \"label\": \"Uzbekistan\", \"trigger\": \"+998\"}, {\"value\": \"VU\", \"label\": \"Vanuatu\", \"trigger\": \"+678\"}, {\"value\": \"VA\", \"label\": \"Vatican City\", \"trigger\": \"+379\"}, {\"value\": \"VE\", \"label\": \"Venezuela\", \"trigger\": \"+58\"}, {\"value\": \"VN\", \"label\": \"Vietnam\", \"trigger\": \"+84\"}, {\"value\": \"WF\", \"label\": \"Wallis and Futuna\", \"trigger\": \"+681\"}, {\"value\": \"EH\", \"label\": \"Western Sahara\", \"trigger\": \"+212\"}, {\"value\": \"YE\", \"label\": \"Yemen\", \"trigger\": \"+967\"}, {\"value\": \"ZM\", \"label\": \"Zambia\", \"trigger\": \"+260\"}, {\"value\": \"ZW\", \"label\": \"Zimbabwe\", \"trigger\": \"+263\"}]",
  "src/board-native/section-copy.json": "{\n  \"announcement/in-sidebar\": {\n    \"description\": \"The card is designed for the foot of the 260px sidebar panel - it's what the `sidebar` block renders above the user menu.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"The card is designed for the foot of the 260px sidebar panel - it's what the \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"sidebar\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" block renders above the user menu.\"\n      }\n    ]\n  },\n  \"announcement/variations\": {\n    \"description\": \"Every part is optional - swap the `icon`, drop the `description` or `actionLabel`, and toggle `dismissible`.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Every part is optional - swap the \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"icon\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \", drop the \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"description\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" or \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"actionLabel\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \", and toggle \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"dismissible\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \".\"\n      }\n    ]\n  },\n  \"avatar/sizes\": {\n    \"description\": \"Four sizes via the `size` prop - `xs` (20px) through `lg` (36px). The initials type scale follows the container.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Four sizes via the \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"size\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" prop - \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"xs\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" (20px) through \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"lg\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" (36px). The initials type scale follows the container.\"\n      }\n    ]\n  },\n  \"avatar/tints\": {\n    \"description\": \"Initials render on a `neutral` or `blue` surface via the `color` prop.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Initials render on a \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"neutral\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" or \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"blue\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" surface via the \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"color\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" prop.\"\n      }\n    ]\n  },\n  \"avatar/photo\": {\n    \"description\": \"Pass `src` and `alt` for a photo avatar. Initials act as the fallback while the image loads or if it fails.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Pass \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"src\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" and \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"alt\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" for a photo avatar. Initials act as the fallback while the image loads or if it fails.\"\n      }\n    ]\n  },\n  \"breadcrumb/avatars\": {\n    \"description\": \"Items accept arbitrary leading content - pass an `xs` `Avatar` for team/user trails, or an `icon` component reference for glyphs.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Items accept arbitrary leading content - pass an \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"xs\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"Avatar\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" for team/user trails, or an \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"icon\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" component reference for glyphs.\"\n      }\n    ]\n  },\n  \"button/variants\": {\n    \"description\": \"Four variants via the `variant` prop. Primary and danger use vertical gradients, secondary is a bordered surface, and ghost uses the subtle blue action surface.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Four variants via the \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"variant\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" prop. Primary and danger use vertical gradients, secondary is a bordered surface, and ghost uses the subtle blue action surface.\"\n      }\n    ]\n  },\n  \"button/sizes\": {\n    \"description\": \"Three sizes - medium (36px, the default), small (32px), and xs (24px). Icon-only buttons become square at every size.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Three sizes - medium (36px, the default), small (32px), and xs (24px). Icon-only buttons become square at every size.\"\n      }\n    ]\n  },\n  \"button/icons\": {\n    \"description\": \"Pass any Remix Icon component reference to `leadingIcon` / `trailingIcon`. Combine `iconOnly` with an `aria-label` for square icon buttons.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Pass any Remix Icon component reference to \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"leadingIcon\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" / \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"trailingIcon\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \". Combine \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"iconOnly\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" with an \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"aria-label\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" for square icon buttons.\"\n      }\n    ]\n  },\n  \"button/disabled\": {\n    \"description\": \"The native `disabled` attribute switches every variant to its muted disabled surface.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"The native \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"disabled\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" attribute switches every variant to its muted disabled surface.\"\n      }\n    ]\n  },\n  \"button-group/selected\": {\n    \"description\": \"`selected` keeps an item on its hover fill and sets `aria-pressed` - drive it from state for single or multi-select toolbars.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"code\",\n        \"text\": \"selected\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" keeps an item on its hover fill and sets \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"aria-pressed\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" - drive it from state for single or multi-select toolbars.\"\n      }\n    ]\n  },\n  \"button-group/icon-only\": {\n    \"description\": \"`iconOnly` items collapse to squares - give each an `aria-label` since there's no visible text.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"code\",\n        \"text\": \"iconOnly\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" items collapse to squares - give each an \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"aria-label\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" since there's no visible text.\"\n      }\n    ]\n  },\n  \"carousel/sizing\": {\n    \"description\": \"Each item fills the track by default, so exactly one card is in view per slide. Width lives on `CarouselItem` rather than on the track, so overriding it gives a peek of the next card or a run of mixed widths. Positions are read back from the DOM rather than calculated from a fixed card width, so nothing needs telling when those widths change.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Each item fills the track by default, so exactly one card is in view per slide. Width lives on \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"CarouselItem\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" rather than on the track, so overriding it gives a peek of the next card or a run of mixed widths. Positions are read back from the DOM rather than calculated from a fixed card width, so nothing needs telling when those widths change.\"\n      }\n    ]\n  },\n  \"carousel/options\": {\n    \"description\": \"`align=\\\"center\\\"` rests each card in the middle of the track instead of the left edge, which suits a gallery with one hero card in view. `showArrows` and `showDots` strip the chrome back to a bare swipeable track, and `gap` sets the spacing in pixels.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"code\",\n        \"text\": \"align=\\\"center\\\"\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" rests each card in the middle of the track instead of the left edge, which suits a gallery with one hero card in view. \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"showArrows\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" and \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"showDots\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" strip the chrome back to a bare swipeable track, and \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"gap\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" sets the spacing in pixels.\"\n      }\n    ]\n  },\n  \"carousel/accessibility\": {\n    \"description\": \"The region announces itself as a carousel and takes its name from `aria-label`, which is required. Each card is labelled with its position, so a screen reader reads \\\"3 of 7\\\" without you numbering anything. The track is focusable, so the arrow keys scroll it, and the prev/next buttons disable at the ends rather than silently doing nothing. Sliding respects `prefers-reduced-motion`, jumping instead of animating.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"The region announces itself as a carousel and takes its name from \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"aria-label\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \", which is required. Each card is labelled with its position, so a screen reader reads \\\"3 of 7\\\" without you numbering anything. The track is focusable, so the arrow keys scroll it, and the prev/next buttons disable at the ends rather than silently doing nothing. Sliding respects \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"prefers-reduced-motion\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \", jumping instead of animating.\"\n      }\n    ]\n  },\n  \"checkbox/sizes\": {\n    \"description\": \"Two sizes via the `size` prop - `md` (16px, the default) and `sm` (14px, used in dense tables).\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Two sizes via the \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"size\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" prop - \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"md\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" (16px, the default) and \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"sm\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" (14px, used in dense tables).\"\n      }\n    ]\n  },\n  \"checkbox/labels\": {\n    \"description\": \"Pass `children` for a label - React Aria associates it with the input automatically. Use `isSelected` + `onChange` for controlled state, or `defaultSelected` for uncontrolled.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Pass \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"children\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" for a label - React Aria associates it with the input automatically. Use \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"isSelected\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" + \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"onChange\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" for controlled state, or \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"defaultSelected\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" for uncontrolled.\"\n      }\n    ]\n  },\n  \"checkbox/card\": {\n    \"description\": \"Selectable card with a title and optional description - the whole card toggles the checkbox and shows a hover background. `NativeCheckboxCard` is included in the Helios UI React source package.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Selectable card with a title and optional description - the whole card toggles the checkbox and shows a hover background. \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"NativeCheckboxCard\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" is included in the Helios UI React source package.\"\n      }\n    ]\n  },\n  \"chip/variants\": {\n    \"description\": \"Three emphasis levels via `variant` - each available in seven color pairs via `color`.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Three emphasis levels via \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"variant\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" - each available in seven color pairs via \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"color\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \".\"\n      }\n    ]\n  },\n  \"chip/status-dot\": {\n    \"description\": \"The `StatusDot` indicator pairs with chips inside selects and tables. `NativeStatusDot` is included in the Helios UI React source package.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"The \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"StatusDot\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" indicator pairs with chips inside selects and tables. \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"NativeStatusDot\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" is included in the Helios UI React source package.\"\n      }\n    ]\n  },\n  \"close-button/sizes\": {\n    \"description\": \"Four sizes via the `size` prop - 16, 20, 24, and 32px. Always pass an `aria-label`, the control has no visible text.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Four sizes via the \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"size\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" prop - 16, 20, 24, and 32px. Always pass an \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"aria-label\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \", the control has no visible text.\"\n      }\n    ]\n  },\n  \"date-picker/meeting-scheduler\": {\n    \"description\": \"A Calendly/Cal.com-style booking panel. Host card and meeting summary on the left, a single-month calendar in the middle (the same `MonthPanel` from `shared.tsx`), and a timezone / hour-format / time-slot sidebar on the right. Not a popover — a disclosure: the \\\"Schedule a meeting\\\" trigger toggles the whole panel open/closed, with the time-slot list scrolling within a fixed height instead of growing the panel.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"A Calendly/Cal.com-style booking panel. Host card and meeting summary on the left, a single-month calendar in the middle (the same \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"MonthPanel\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" from \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"shared.tsx\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \"), and a timezone / hour-format / time-slot sidebar on the right. Not a popover — a disclosure: the \\\"Schedule a meeting\\\" trigger toggles the whole panel open/closed, with the time-slot list scrolling within a fixed height instead of growing the panel.\"\n      }\n    ]\n  },\n  \"date-picker/quick-select\": {\n    \"description\": \"The sidebar presets are computed from `@internationalized/date` each time the popover opens (so \\\"Today\\\" stays today). Selecting one updates the pending range and highlights the two months to match — it still requires `Apply` to commit, same as dragging a range directly on the calendar.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"The sidebar presets are computed from \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"@internationalized/date\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" each time the popover opens (so \\\"Today\\\" stays today). Selecting one updates the pending range and highlights the two months to match — it still requires \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"Apply\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" to commit, same as dragging a range directly on the calendar.\"\n      }\n    ]\n  },\n  \"date-picker/value\": {\n    \"description\": \"Pass `value` + `onChange` for a controlled range, or `defaultValue` for uncontrolled. Either way, the popover keeps its own `pending` draft internally — `onChange` only fires when the user presses `Apply`; `Cancel` discards the draft and reverts to the last committed value. The start/end chips in the footer are editable inputs (`DD/MM/YYYY`) that update the same pending draft.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Pass \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"value\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" + \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"onChange\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" for a controlled range, or \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"defaultValue\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" for uncontrolled. Either way, the popover keeps its own \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"pending\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" draft internally — \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"onChange\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" only fires when the user presses \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"Apply\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \"; \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"Cancel\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" discards the draft and reverts to the last committed value. The start/end chips in the footer are editable inputs (\"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"DD/MM/YYYY\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \") that update the same pending draft.\"\n      }\n    ]\n  },\n  \"date-picker/disabled\": {\n    \"description\": \"`isDisabled` dims the trigger button and blocks opening the popover.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"code\",\n        \"text\": \"isDisabled\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" dims the trigger button and blocks opening the popover.\"\n      }\n    ]\n  },\n  \"date-picker/single-date\": {\n    \"description\": \"`DatePicker` is the non-range sibling. Same trigger, popover, month panel, day-cell rendering, and editable date chip as `DateRangePicker` (see `shared.tsx` below), built on a plain react-aria `Calendar` instead of `RangeCalendar`. There's only one month, so — unlike the dual view, where the two inner chevrons are inert spacers — both nav chevrons are fully functional. The single-date variant has no quick-select sidebar.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"code\",\n        \"text\": \"DatePicker\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" is the non-range sibling. Same trigger, popover, month panel, day-cell rendering, and editable date chip as \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"DateRangePicker\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" (see \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"shared.tsx\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" below), built on a plain react-aria \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"Calendar\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" instead of \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"RangeCalendar\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \". There's only one month, so — unlike the dual view, where the two inner chevrons are inert spacers — both nav chevrons are fully functional. The single-date variant has no quick-select sidebar.\"\n      }\n    ]\n  },\n  \"divider/variants\": {\n    \"description\": \"Choose `single`, `double`, or `fill`. Every treatment uses Helios UI semantic border and surface tokens, so it follows the active theme automatically.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Choose \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"single\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \", \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"double\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \", or \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"fill\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \". Every treatment uses Helios UI semantic border and surface tokens, so it follows the active theme automatically.\"\n      }\n    ]\n  },\n  \"divider/alignment\": {\n    \"description\": \"The `align` prop positions content at the start, center, or end. Single-line dividers keep the hairline on the open side.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"The \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"align\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" prop positions content at the start, center, or end. Single-line dividers keep the hairline on the open side.\"\n      }\n    ]\n  },\n  \"divider/custom-content\": {\n    \"description\": \"Children are not restricted to text. An icon, a chip, a button, a button group, or a stack of avatars all sit in the same slot, and the line closes around whatever width they take. No extra props are involved: the content is composed as children, so anything compact belongs here.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Children are not restricted to text. An icon, a chip, a button, a button group, or a stack of avatars all sit in the same slot, and the line closes around whatever width they take. No extra props are involved: the content is composed as children, so anything compact belongs here.\"\n      }\n    ]\n  },\n  \"divider/without-content\": {\n    \"description\": \"Omit children for a purely structural separator. In this form the component exposes the native separator role and horizontal orientation to assistive technology.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Omit children for a purely structural separator. In this form the component exposes the native separator role and horizontal orientation to assistive technology.\"\n      }\n    ]\n  },\n  \"dropdown/model-picker\": {\n    \"description\": \"The AI chat composer's model menu: rows act as a radio group - `selected` keeps the current row highlighted and a radio glyph sits at the row's end via `justify-between`.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"The AI chat composer's model menu: rows act as a radio group - \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"selected\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" keeps the current row highlighted and a radio glyph sits at the row's end via \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"justify-between\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \".\"\n      }\n    ]\n  },\n  \"dropdown/team-menu\": {\n    \"description\": \"The sidebar's team card menu: a header and footer live alongside `DropdownGroup`s as plain siblings, rows carry trailing badges, and `DropdownDivider` bleeds through the panel padding between sections.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"The sidebar's team card menu: a header and footer live alongside \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"DropdownGroup\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \"s as plain siblings, rows carry trailing badges, and \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"DropdownDivider\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" bleeds through the panel padding between sections.\"\n      }\n    ]\n  },\n  \"dropdown/account-menu\": {\n    \"description\": \"The sidebar's account switcher: rows render avatars instead of icons, and the panel closes with a pair of secondary buttons - row content is free-form, so anything goes inside a `DropdownItem`.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"The sidebar's account switcher: rows render avatars instead of icons, and the panel closes with a pair of secondary buttons - row content is free-form, so anything goes inside a \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"DropdownItem\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \".\"\n      }\n    ]\n  },\n  \"file-upload/validation\": {\n    \"description\": \"Configure accepted file types with `allowedExtensions` and the size ceiling with `maxBytes`. The component updates its own helper text and rejection message from those props.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Configure accepted file types with \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"allowedExtensions\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" and the size ceiling with \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"maxBytes\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \". The component updates its own helper text and rejection message from those props.\"\n      }\n    ]\n  },\n  \"file-upload/file-icon\": {\n    \"description\": \"The built-in icon follows the selected extension. Use `renderFileIcon` when your product has its own file-type artwork or icon system.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"The built-in icon follows the selected extension. Use \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"renderFileIcon\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" when your product has its own file-type artwork or icon system.\"\n      }\n    ]\n  },\n  \"icon-button/sizes\": {\n    \"description\": \"Pass any Remix Icon component reference via `icon`, pick a `size`, and always provide an `aria-label` - there's no visible text.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Pass any Remix Icon component reference via \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"icon\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \", pick a \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"size\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \", and always provide an \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"aria-label\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" - there's no visible text.\"\n      }\n    ]\n  },\n  \"input-otp/controlled\": {\n    \"description\": \"The value is a single string, not an array of characters. Pass `value` + `onChange` to control it, or `defaultValue` to leave it uncontrolled. `onComplete` fires the moment the last box fills, which is usually where you submit.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"The value is a single string, not an array of characters. Pass \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"value\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" + \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"onChange\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" to control it, or \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"defaultValue\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" to leave it uncontrolled. \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"onComplete\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" fires the moment the last box fills, which is usually where you submit.\"\n      }\n    ]\n  },\n  \"input-otp/options\": {\n    \"description\": \"`length` sets the number of boxes and `groupEvery` splits them into runs, which makes a long code easier to read back. `isInvalid` gives the boxes a red edge over the same tint a failed `Input` uses.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"code\",\n        \"text\": \"length\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" sets the number of boxes and \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"groupEvery\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" splits them into runs, which makes a long code easier to read back. \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"isInvalid\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" gives the boxes a red edge over the same tint a failed \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"Input\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" uses.\"\n      }\n    ]\n  },\n  \"input-otp/behaviour\": {\n    \"description\": \"Pasting into any box distributes the digits from that point onward rather than dropping everything but the first character. The same path handles OS autofill: iOS and Chrome deliver the whole code into a single box, so each box carries `autoComplete=\\\"one-time-code\\\"` and accepts more than one character. Non-digits are stripped throughout, and the boxes use `inputMode=\\\"numeric\\\"` so phones show a number pad without the spinners and stray characters a `number` input would bring.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Pasting into any box distributes the digits from that point onward rather than dropping everything but the first character. The same path handles OS autofill: iOS and Chrome deliver the whole code into a single box, so each box carries \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"autoComplete=\\\"one-time-code\\\"\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" and accepts more than one character. Non-digits are stripped throughout, and the boxes use \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"inputMode=\\\"numeric\\\"\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" so phones show a number pad without the spinners and stray characters a \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"number\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" input would bring.\"\n      }\n    ]\n  },\n  \"link-button/icons-sizes\": {\n    \"description\": \"`leadingIcon` / `trailingIcon` take a Remix Icon reference and render at the size's icon scale - 20px for medium, 18px for small, 14px for xs.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"code\",\n        \"text\": \"leadingIcon\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" / \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"trailingIcon\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" take a Remix Icon reference and render at the size's icon scale - 20px for medium, 18px for small, 14px for xs.\"\n      }\n    ]\n  },\n  \"notification/states\": {\n    \"description\": \"Set `status` to information, success, or error. Each state supplies the semantic live-region role, default icon, and accent colors.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Set \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"status\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" to information, success, or error. Each state supplies the semantic live-region role, default icon, and accent colors.\"\n      }\n    ]\n  },\n  \"notification/visuals\": {\n    \"description\": \"Pass any Remix icon through `icon`, or replace the icon with an `avatar`. Avatar notifications can show online, busy, or offline presence.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Pass any Remix icon through \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"icon\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \", or replace the icon with an \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"avatar\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \". Avatar notifications can show online, busy, or offline presence.\"\n      }\n    ]\n  },\n  \"notification/actions\": {\n    \"description\": \"The `actions` array renders small Helios UI buttons and supports primary, secondary, and danger variants.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"The \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"actions\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" array renders small Helios UI buttons and supports primary, secondary, and danger variants.\"\n      }\n    ]\n  },\n  \"notification/position\": {\n    \"description\": \"Use the `position` prop on `NotificationViewport` to anchor the stack to any corner or horizontal center of the browser viewport.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Use the \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"position\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" prop on \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"NotificationViewport\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" to anchor the stack to any corner or horizontal center of the browser viewport.\"\n      }\n    ]\n  },\n  \"notification/countdown\": {\n    \"description\": \"Set `autoDismissDuration` in milliseconds to show a synchronized 3px countdown bar and dismiss the notification when it reaches zero. Use `NotificationViewport` to portal repeated notifications to a smoothly animated stack at the edge of the browser viewport.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Set \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"autoDismissDuration\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" in milliseconds to show a synchronized 3px countdown bar and dismiss the notification when it reaches zero. Use \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"NotificationViewport\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" to portal repeated notifications to a smoothly animated stack at the edge of the browser viewport.\"\n      }\n    ]\n  },\n  \"radio/sizes\": {\n    \"description\": \"Two sizes via the `size` prop - `md` (16px, the default) and `sm` (14px, the compact glyph used inside menus), paired with Body 2 labels.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Two sizes via the \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"size\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" prop - \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"md\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" (16px, the default) and \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"sm\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" (14px, the compact glyph used inside menus), paired with Body 2 labels.\"\n      }\n    ]\n  },\n  \"radio/card\": {\n    \"description\": \"Selectable card with a title and optional description - the whole card selects the radio, matching Checkbox Card's surface. Cards live inside a `RadioGroup` for single selection and arrow-key navigation. `This component` is included in the Helios UI React source package.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Selectable card with a title and optional description - the whole card selects the radio, matching Checkbox Card's surface. Cards live inside a \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"RadioGroup\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" for single selection and arrow-key navigation. \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"This component\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" is included in the Helios UI React source package.\"\n      }\n    ]\n  },\n  \"radio/menu-rows\": {\n    \"description\": \"Menu rows that act as a radio group (like the Dropdown component's model picker) manage selection on the row itself, so they render the bare `RadioDot` glyph - presentation only, no nested focusable control.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Menu rows that act as a radio group (like the Dropdown component's model picker) manage selection on the row itself, so they render the bare \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"RadioDot\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" glyph - presentation only, no nested focusable control.\"\n      }\n    ]\n  },\n  \"segmented-control/controlled\": {\n    \"description\": \"Selection uses React Aria's key-set API: pass `selectedKeys` + `onSelectionChange` to control it, or `defaultSelectedKeys` for uncontrolled. Guard against empty sets to keep one segment always active.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Selection uses React Aria's key-set API: pass \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"selectedKeys\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" + \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"onSelectionChange\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" to control it, or \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"defaultSelectedKeys\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" for uncontrolled. Guard against empty sets to keep one segment always active.\"\n      }\n    ]\n  },\n  \"select/status\": {\n    \"description\": \"Items render arbitrary children next to the label - always pass `textValue` so typeahead and the trigger label stay correct.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Items render arbitrary children next to the label - always pass \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"textValue\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" so typeahead and the trigger label stay correct.\"\n      }\n    ]\n  },\n  \"slider/range\": {\n    \"description\": \"`RangeSlider` renders two labeled thumbs. The selected interval fills between them, each bubble shows its exact value, and the thumbs cannot cross. Use `minValue`, `maxValue`, and `step` to define the allowed range.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"code\",\n        \"text\": \"RangeSlider\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" renders two labeled thumbs. The selected interval fills between them, each bubble shows its exact value, and the thumbs cannot cross. Use \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"minValue\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \", \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"maxValue\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \", and \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"step\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" to define the allowed range.\"\n      }\n    ]\n  },\n  \"slider/controlled\": {\n    \"description\": \"Use `value` and `onChange` for live controlled state. `onChangeEnd` fires after dragging or keyboard input finishes, which is useful for saving a value without sending an update for every movement.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Use \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"value\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" and \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"onChange\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" for live controlled state. \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"onChangeEnd\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" fires after dragging or keyboard input finishes, which is useful for saving a value without sending an update for every movement.\"\n      }\n    ]\n  },\n  \"slider/states\": {\n    \"description\": \"Exact-value bubbles are visible by default. Format them with `formatValue`, or set `showTooltip=false` when the value already appears elsewhere. Disabled sliders retain their values and accessible labels while preventing input.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Exact-value bubbles are visible by default. Format them with \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"formatValue\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \", or set \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"showTooltip=false\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" when the value already appears elsewhere. Disabled sliders retain their values and accessible labels while preventing input.\"\n      }\n    ]\n  },\n  \"social-button/brands\": {\n    \"description\": \"All 24 logos ship inline with the component, so an install pulls no icon package. The full-colour marks come from SVG Logos (CC0), the monochrome glyphs from Simple Icons (CC0), and the four brands Simple Icons no longer carries from Bootstrap Icons (MIT). Amazon has no full-colour mark upstream, so under `white` it falls back to its brand-tinted glyph.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"All 24 logos ship inline with the component, so an install pulls no icon package. The full-colour marks come from SVG Logos (CC0), the monochrome glyphs from Simple Icons (CC0), and the four brands Simple Icons no longer carries from Bootstrap Icons (MIT). Amazon has no full-colour mark upstream, so under \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"white\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" it falls back to its brand-tinted glyph.\"\n      }\n    ]\n  },\n  \"social-button/appearance\": {\n    \"description\": \"`colorful` is the default: the brand's own colour in the same gradient-and-shadow recipe as the primary Button, so it reads as a Helios UI control rather than a pasted-in widget. `black` is the same shape in high-contrast solid. `white` is outlined, and the only one that shows each provider's real multi-colour mark, since on a saturated fill that artwork would fight the background. For a stack of several providers, prefer `white`: a column of competing brand fills makes no single option readable.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"code\",\n        \"text\": \"colorful\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" is the default: the brand's own colour in the same gradient-and-shadow recipe as the primary Button, so it reads as a Helios UI control rather than a pasted-in widget. \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"black\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" is the same shape in high-contrast solid. \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"white\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" is outlined, and the only one that shows each provider's real multi-colour mark, since on a saturated fill that artwork would fight the background. For a stack of several providers, prefer \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"white\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \": a column of competing brand fills makes no single option readable.\"\n      }\n    ]\n  },\n  \"social-button/sizes\": {\n    \"description\": \"`medium` (36px) and `small`(32px) are the base Button's own sizes to the pixel, radius and glyph size included, so these sit in a form beside a Button without a half-step in the rhythm. Both carry a fixed width (300px and 250px) so a column of providers lines up on its own; `fullWidth` hands that back to the container.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"code\",\n        \"text\": \"medium\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" (36px) and \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"small\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \"(32px) are the base Button's own sizes to the pixel, radius and glyph size included, so these sit in a form beside a Button without a half-step in the rhythm. Both carry a fixed width (300px and 250px) so a column of providers lines up on its own; \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"fullWidth\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" hands that back to the container.\"\n      }\n    ]\n  },\n  \"social-button/icon-only\": {\n    \"description\": \"A square button showing just the logo, for the row of alternatives under an email field. The brand name moves to `aria-label`, so the control still announces itself.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"A square button showing just the logo, for the row of alternatives under an email field. The brand name moves to \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"aria-label\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \", so the control still announces itself.\"\n      }\n    ]\n  },\n  \"social-button/custom-brand\": {\n    \"description\": \"For an identity provider that is not built in, pass `brand=\\\"custom\\\"` with a `config`. Only `icon` is required: `label` defaults to `SSO` and `color` to black.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"For an identity provider that is not built in, pass \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"brand=\\\"custom\\\"\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" with a \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"config\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \". Only \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"icon\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" is required: \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"label\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" defaults to \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"SSO\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" and \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"color\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" to black.\"\n      }\n    ]\n  },\n  \"social-button/labels\": {\n    \"description\": \"The default label is `Continue with <Brand>`. Pass children to say something else, since a sign-up screen and a login screen usually want different wording.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"The default label is \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"Continue with <Brand>\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \". Pass children to say something else, since a sign-up screen and a login screen usually want different wording.\"\n      }\n    ]\n  },\n  \"social-button/links\": {\n    \"description\": \"Passing `href` renders an anchor instead of a button. Most OAuth flows start by navigating to a provider URL, and an anchor gives that the right semantics, middle-click and keyboard behaviour for free.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Passing \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"href\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" renders an anchor instead of a button. Most OAuth flows start by navigating to a provider URL, and an anchor gives that the right semantics, middle-click and keyboard behaviour for free.\"\n      }\n    ]\n  },\n  \"social-button/trademarks\": {\n    \"description\": \"The logos are trademarks of their respective owners, included here so you can build a sign-in screen. Several providers publish rules for their login buttons covering colour, clear space and wording, Google and Apple in particular, so check those before shipping a production login.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"The logos are trademarks of their respective owners, included here so you can build a sign-in screen. Several providers publish rules for their login buttons covering colour, clear space and wording, Google and Apple in particular, so check those before shipping a production login.\"\n      }\n    ]\n  },\n  \"switch/shapes\": {\n    \"description\": \"Two shapes via the `shape` prop. `pill` (the default) is fully rounded; `rectangle` uses `radius/md` on the track and `radius/xs` on the thumb, both scaled per size. The thumb's inner chip follows the same shape.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Two shapes via the \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"shape\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" prop. \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"pill\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" (the default) is fully rounded; \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"rectangle\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" uses \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"radius/md\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" on the track and \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"radius/xs\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" on the thumb, both scaled per size. The thumb's inner chip follows the same shape.\"\n      }\n    ]\n  },\n  \"switch/sizes\": {\n    \"description\": \"Three sizes via the `size` prop - `lg` (56×32), `md` (42×24, the default) and `sm` (28×16). The thumb, padding, travel distance and the on-state ring all scale together.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Three sizes via the \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"size\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" prop - \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"lg\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" (56×32), \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"md\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" (42×24, the default) and \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"sm\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" (28×16). The thumb, padding, travel distance and the on-state ring all scale together.\"\n      }\n    ]\n  },\n  \"switch/states\": {\n    \"description\": \"Use `isSelected` + `onChange` for a controlled switch, or `defaultSelected` for uncontrolled. `isDisabled` dims the control to 50%. Pass `children` for a label - React Aria associates it with the input, so clicking the text toggles the switch.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Use \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"isSelected\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" + \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"onChange\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" for a controlled switch, or \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"defaultSelected\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" for uncontrolled. \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"isDisabled\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" dims the control to 50%. Pass \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"children\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" for a label - React Aria associates it with the input, so clicking the text toggles the switch.\"\n      }\n    ]\n  },\n  \"switch/card\": {\n    \"description\": \"Selectable settings card - an optional 24×24 leading icon, a title and short description on the left, and the switch on the right. The whole card toggles and shows a hover background, the switch counterpart to `CheckboxCard`. Pass any Remix icon via `icon` to `SwitchCard`.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Selectable settings card - an optional 24×24 leading icon, a title and short description on the left, and the switch on the right. The whole card toggles and shows a hover background, the switch counterpart to \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"CheckboxCard\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \". Pass any Remix icon via \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"icon\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" to \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"SwitchCard\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \".\"\n      }\n    ]\n  },\n  \"table/sizes\": {\n    \"description\": \"The table comes in 2 sizes: `md` (normal) and `sm` (compact, with tighter padding and smaller avatars). Switch between them by changing the `size` prop on the `Table` component - try the Normal / Compact toggle in the preview above.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"The table comes in 2 sizes: \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"md\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" (normal) and \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"sm\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" (compact, with tighter padding and smaller avatars). Switch between them by changing the \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"size\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" prop on the \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"Table\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" component - try the Normal / Compact toggle in the preview above.\"\n      }\n    ]\n  },\n  \"tabs/pill-tabs\": {\n    \"description\": \"`PillTab` is the fully-rounded sibling for switching local views rather than routed panels. It ships in two styles: `blue` (the default - the AI chat panel's Changes/Browser switcher) and the quieter `gray`, used for scope and filter rows like the settings Tools page. Both share the same idle and hover treatment; only the selected pill differs.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"code\",\n        \"text\": \"PillTab\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" is the fully-rounded sibling for switching local views rather than routed panels. It ships in two styles: \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"blue\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" (the default - the AI chat panel's Changes/Browser switcher) and the quieter \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"gray\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \", used for scope and filter rows like the settings Tools page. Both share the same idle and hover treatment; only the selected pill differs.\"\n      }\n    ]\n  },\n  \"textarea/sizes\": {\n    \"description\": \"`medium` and `small` match `Input`'s insets, so the two components stack in a form without a seam. `rows` sets the resting height.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"code\",\n        \"text\": \"medium\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" and \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"small\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" match \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"Input\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \"'s insets, so the two components stack in a form without a seam. \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"rows\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" sets the resting height.\"\n      }\n    ]\n  },\n  \"textarea/auto-resize\": {\n    \"description\": \"`autoResize` grows the field with its text, one line at a time, between `rows` and `maxRows`. Past the ceiling it scrolls. The height is measured from zero on every change, so the field shrinks back when text is deleted.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"code\",\n        \"text\": \"autoResize\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" grows the field with its text, one line at a time, between \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"rows\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" and \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"maxRows\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \". Past the ceiling it scrolls. The height is measured from zero on every change, so the field shrinks back when text is deleted.\"\n      }\n    ]\n  },\n  \"textarea/character-count\": {\n    \"description\": \"`showCount` puts the counter on the hint row. With `maxLength` it reads `12/160` and the browser enforces the limit; without one it just counts.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"code\",\n        \"text\": \"showCount\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" puts the counter on the hint row. With \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"maxLength\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" it reads \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"12/160\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" and the browser enforces the limit; without one it just counts.\"\n      }\n    ]\n  },\n  \"textarea/states\": {\n    \"description\": \"Hover and focus cross-fade the ring. `isDisabled` and `isInvalid` override both and repaint the field, hint and label. `resize=\\\"none\\\"` removes the native grab handle when a fixed height matters more than the reader's comfort.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Hover and focus cross-fade the ring. \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"isDisabled\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" and \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"isInvalid\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" override both and repaint the field, hint and label. \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"resize=\\\"none\\\"\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" removes the native grab handle when a fixed height matters more than the reader's comfort.\"\n      }\n    ]\n  },\n  \"tree-view/controlled\": {\n    \"description\": \"Keep expansion and selection in your own state with `expandedKeys` and `selectedKeys`. Use `TreeViewCollection` to recursively render nested data. Every item needs a unique, stable `id`.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Keep expansion and selection in your own state with \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"expandedKeys\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" and \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"selectedKeys\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \". Use \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"TreeViewCollection\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" to recursively render nested data. Every item needs a unique, stable \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"id\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \".\"\n      }\n    ]\n  },\n  \"tree-view/multiple-selection\": {\n    \"description\": \"Set `selectionMode=\\\"multiple\\\"` to toggle items independently. Hold Shift to select a range with the keyboard. Single selection is the default; use `selectionMode=\\\"none\\\"` with `onAction` for an action-only tree.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Set \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"selectionMode=\\\"multiple\\\"\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" to toggle items independently. Hold Shift to select a range with the keyboard. Single selection is the default; use \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"selectionMode=\\\"none\\\"\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" with \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"onAction\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" for an action-only tree.\"\n      }\n    ]\n  },\n  \"tree-view/sizes-and-states\": {\n    \"description\": \"Use `size=\\\"sm\\\"` for compact rows and `showGuides={false}` to hide guide lines. Branches get folder icons automatically; pass a Remix Icon component to `icon` or `expandedIcon` to customize them. Disabled items prevent interaction, and `renderEmptyState` supplies an empty message.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Use \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"size=\\\"sm\\\"\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" for compact rows and \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"showGuides={false}\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" to hide guide lines. Branches get folder icons automatically; pass a Remix Icon component to \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"icon\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" or \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"expandedIcon\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" to customize them. Disabled items prevent interaction, and \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"renderEmptyState\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" supplies an empty message.\"\n      }\n    ]\n  },\n  \"tree-view/rtl\": {\n    \"description\": \"Set the locale with `DirectionProvider`. Indentation, guide lines, disclosure icons, and horizontal keyboard navigation follow the reading direction.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Set the locale with \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"DirectionProvider\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \". Indentation, guide lines, disclosure icons, and horizontal keyboard navigation follow the reading direction.\"\n      }\n    ]\n  },\n  \"tooltip/positions\": {\n    \"description\": \"A tooltip can sit on any side of its trigger - set the `placement` prop on `Tooltip` to `top` (default), `bottom`, `left` or `right`. The caret and the blur-in transform rotate to match, and React Aria automatically flips to the opposite side if there isn't room on-screen. Hover the buttons below.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"A tooltip can sit on any side of its trigger - set the \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"placement\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" prop on \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"Tooltip\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" to \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"top\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" (default), \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"bottom\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \", \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"left\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" or \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"right\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \". The caret and the blur-in transform rotate to match, and React Aria automatically flips to the opposite side if there isn't room on-screen. Hover the buttons below.\"\n      }\n    ]\n  },\n  \"tooltip/sizes\": {\n    \"description\": \"The tooltip comes in 2 sizes: `sm` (12px Caption 1, the default - used by the Contributions heatmap) and `md` (14px Body 1, with roomier padding). Switch by changing the `size` prop on the `Tooltip` - compare the Small and Medium triggers in the preview above.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"The tooltip comes in 2 sizes: \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"sm\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" (12px Caption 1, the default - used by the Contributions heatmap) and \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"md\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" (14px Body 1, with roomier padding). Switch by changing the \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"size\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" prop on the \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"Tooltip\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" - compare the Small and Medium triggers in the preview above.\"\n      }\n    ]\n  },\n  \"data-grid/columns\": {\n    \"description\": \"Pass typed `columns`, your `data`, and a unique, stable `getRowId`. Provide `onDataChange` to enable editing. Text, number, and select editors reuse Helios UI inputs and selects. Set bounds with `min` and `max`, or reject values with `validate`.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Pass typed \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"columns\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \", your \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"data\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \", and a unique, stable \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"getRowId\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \". Provide \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"onDataChange\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" to enable editing. Text, number, and select editors reuse Helios UI inputs and selects. Set bounds with \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"min\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" and \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"max\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \", or reject values with \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"validate\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \".\"\n      }\n    ]\n  },\n  \"data-grid/rtl\": {\n    \"description\": \"Use `DirectionProvider` to set the reading direction. This read-only example freezes the first column on the right and mirrors horizontal keyboard navigation. Your column labels and record values can use any language.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Use \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"DirectionProvider\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" to set the reading direction. This read-only example freezes the first column on the right and mirrors horizontal keyboard navigation. Your column labels and record values can use any language.\"\n      }\n    ]\n  },\n  \"settings-modal/triggering\": {\n    \"description\": \"The block deliberately does not render its own trigger. Keep `isOpen` in the host that owns the action - such as a sidebar, user menu, or settings button - and close it through `onClose`. Backdrop presses, Escape, and the close button all call the same handler.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"The block deliberately does not render its own trigger. Keep \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"isOpen\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" in the host that owns the action - such as a sidebar, user menu, or settings button - and close it through \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"onClose\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \". Backdrop presses, Escape, and the close button all call the same handler.\"\n      }\n    ]\n  },\n  \"settings-modal/initial-page\": {\n    \"description\": \"Use `defaultPage` when a contextual action should open directly to General, Profile, Tools, or Storage. The selected page resets to that value each time the dialog opens.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Use \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"defaultPage\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" when a contextual action should open directly to General, Profile, Tools, or Storage. The selected page resets to that value each time the dialog opens.\"\n      }\n    ]\n  },\n  \"settings-modal/plan-artwork\": {\n    \"description\": \"The General view includes a component-native abstract treatment by default. Pass your own public image through `planArtSrc` to feed the animated Current plan artwork without coupling the installed block to Helios UI assets.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"The General view includes a component-native abstract treatment by default. Pass your own public image through \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"planArtSrc\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" to feed the animated Current plan artwork without coupling the installed block to Helios UI assets.\"\n      }\n    ]\n  },\n  \"sidebar/ai-chat-variant\": {\n    \"description\": \"The same floating panel tweaked for the AI Chat template: quick actions up top (New agent, Automations, Customize), a `Repositories` tree whose open repo lists recent chats with relative-time chips and a curved tree connector, and a plan card with an Upgrade button instead of the team menu. The Helios AI Chat template includes this layout with local repository navigation and plan-preview actions.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"The same floating panel tweaked for the AI Chat template: quick actions up top (New agent, Automations, Customize), a \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"Repositories\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" tree whose open repo lists recent chats with relative-time chips and a curved tree connector, and a plan card with an Upgrade button instead of the team menu. The Helios AI Chat template includes this layout with local repository navigation and plan-preview actions.\"\n      }\n    ]\n  },\n  \"sidebar/composition\": {\n    \"description\": \"The sidebar composes several smaller components - `avatar`, `badge`, `kbd`, `announcement`, and the chevron glyphs - plus its own team and user menus. The React source package includes the complete dependency chain; swap the nav items and menus with your own routes and data.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"The sidebar composes several smaller components - \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"avatar\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \", \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"badge\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \", \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"kbd\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \", \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"announcement\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \", and the chevron glyphs - plus its own team and user menus. The React source package includes the complete dependency chain; swap the nav items and menus with your own routes and data.\"\n      }\n    ]\n  },\n  \"stat-cards/variants\": {\n    \"description\": \"Two looks via the `variant` prop. `plain` (the default) is the compact card from the dashboard templates - neutral icon tile, label, value, and a delta chip. `footer` leads with a tinted gradient icon tile beside the label, sets the value at display size, and moves the comparison into a footer band with a white delta pill whose glyph follows `deltaColor`.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Two looks via the \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"variant\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" prop. \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"plain\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" (the default) is the compact card from the dashboard templates - neutral icon tile, label, value, and a delta chip. \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"footer\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" leads with a tinted gradient icon tile beside the label, sets the value at display size, and moves the comparison into a footer band with a white delta pill whose glyph follows \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"deltaColor\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \".\"\n      }\n    ]\n  },\n  \"stat-cards/data\": {\n    \"description\": \"Pass `stats` to replace the demo metrics. The footer variant reads three extra optional fields per stat: `tone` tints the icon tile (blue, orange, purple, pink, sky, or emerald), `caption` swaps the footer text, and `hint` adds an info glyph with a tooltip.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"Pass \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"stats\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" to replace the demo metrics. The footer variant reads three extra optional fields per stat: \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"tone\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" tints the icon tile (blue, orange, purple, pink, sky, or emerald), \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"caption\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" swaps the footer text, and \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"hint\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" adds an info glyph with a tooltip.\"\n      }\n    ]\n  },\n  \"badge/colors\": {\n    \"description\": \"`neutral` (the default) sits on light surfaces; `primary` is tuned for gradient surfaces like the primary button and selected navigation items.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"code\",\n        \"text\": \"neutral\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" (the default) sits on light surfaces; \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"primary\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" is tuned for gradient surfaces like the primary button and selected navigation items.\"\n      }\n    ]\n  },\n  \"badge/kbd\": {\n    \"description\": \"The `Kbd` shortcut hint shares the badge shape and is included in the Helios UI React source package.\",\n    \"descriptionParts\": [\n      {\n        \"kind\": \"text\",\n        \"text\": \"The \"\n      },\n      {\n        \"kind\": \"code\",\n        \"text\": \"Kbd\"\n      },\n      {\n        \"kind\": \"text\",\n        \"text\": \" shortcut hint shares the badge shape and is included in the Helios UI React source package.\"\n      }\n    ]\n  }\n}\n",
  "src/board-native/styles/globals.css": "@import \"tailwindcss\";\n@import \"./theme.css\";\n@import \"./typography.css\";\n\n/* ---------------------------------------------------------------------------\n * Dark mode strategy\n *\n * We use a class-based dark variant. Toggle dark mode by adding the `.dark`\n * class to <html> (a theme provider like `next-themes` can do this later).\n *\n *   <html class=\"dark\">  →  every `dark:*` utility activates\n *\n * Components should NOT use `dark:` prefixes directly. Instead they reference\n * semantic color tokens (e.g. `bg-bg-primary`, `text-text-primary`) that flip\n * under `.dark` in styles/theme.css.\n * --------------------------------------------------------------------------- */\n@custom-variant dark (&:where(.dark, .dark *));\n\n/* Resolve the nearest direction boundary, including nested LTR regions.\n * Tailwind's ancestor-based defaults also match inside an opposing region. */\n@custom-variant rtl (&:dir(rtl));\n@custom-variant ltr (&:dir(ltr));\n\n/* The next theme is revealed by ThemeToggle from the exact interaction point.\n * Native view-transition crossfades are disabled so only the soft circular\n * clip-path animation runs; unsupported browsers simply ignore these rules. */\n::view-transition-old(root),\n::view-transition-new(root) {\n  animation: none;\n  mix-blend-mode: normal;\n}\n\n@keyframes ai-chat-text-shimmer {\n  from {\n    background-position: 200% center;\n  }\n\n  to {\n    background-position: -100% center;\n  }\n}\n\n.agent-progress-loading-text {\n  color: transparent;\n  background-image: linear-gradient(\n    100deg,\n    var(--color-text-secondary) 16%,\n    var(--color-text-secondary) 38%,\n    var(--color-text-primary) 50%,\n    var(--color-text-secondary) 62%,\n    var(--color-text-secondary) 84%\n  );\n  background-position: 200% center;\n  background-size: 300% 100%;\n  background-clip: text;\n  -webkit-background-clip: text;\n  animation: ai-chat-text-shimmer 3.4s linear infinite;\n  will-change: background-position;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .agent-progress-loading-text {\n    color: var(--color-text-secondary);\n    background-image: none;\n    animation: none;\n  }\n}\n\n::view-transition-old(root) {\n  z-index: 1;\n}\n\n::view-transition-new(root) {\n  z-index: 2;\n}\n\n/* Components often have their own hover/focus color transitions. Freeze them\n * while the browser captures the next theme so the expanding circle contains\n * the fully resolved new palette instead of a frame that is still fading from\n * the old one. This is what makes the click-origin reveal read clearly. */\n.theme-transitioning,\n.theme-transitioning * {\n  transition: none !important;\n}\n\n/* Reset + base */\nhtml,\nbody {\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  font-variant-ligatures: contextual;\n  font-kerning: normal;\n}\n\nhtml {\n  color-scheme: light;\n  background-color: var(--color-background-full);\n}\nhtml.dark {\n  color-scheme: dark;\n}\nbody {\n  background-color: var(--color-background-full);\n  color: var(--color-text-primary);\n}\n\n/* Theme-aware monochrome Helios UI mark. Both images keep their intrinsic\n * dimensions while the root theme class decides which one participates in\n * layout, avoiding a light-logo flash during hydration. */\n.theme-logo-dark,\n.theme-asset-dark {\n  display: none;\n}\n.dark .theme-logo-light,\n.dark .theme-asset-light {\n  display: none;\n}\n.dark .theme-logo-dark,\n.dark .theme-asset-dark {\n  display: block;\n}\n\n/* Tailwind expands shadow utilities into `--tw-shadow` at build time. Point\n * those generated utilities back to the live dark elevation tokens so the\n * class-based theme can adjust opacity without component-level overrides. */\n.dark .shadow-2xs {\n  --tw-shadow: var(--shadow-2xs);\n}\n.dark .shadow-xs {\n  --tw-shadow: var(--shadow-xs);\n}\n.dark .shadow-sm {\n  --tw-shadow: var(--shadow-sm);\n}\n.dark .shadow-md {\n  --tw-shadow: var(--shadow-md);\n}\n.dark .shadow-lg {\n  --tw-shadow: var(--shadow-lg);\n}\n.dark .shadow-xl {\n  --tw-shadow: var(--shadow-xl);\n}\n.dark .shadow-card {\n  --tw-shadow: var(--shadow-card);\n}\n.dark .shadow-dropdown {\n  --tw-shadow: var(--shadow-dropdown);\n}\n.dark .shadow-sidebar {\n  --tw-shadow: var(--shadow-sidebar);\n}\n.dark .shadow-waitlist {\n  --tw-shadow: var(--shadow-waitlist);\n}\n\n/* Hide default expand arrow on Safari */\ndetails summary::-webkit-details-marker {\n  display: none;\n}\n\n/* Hide default number-input spinners */\ninput::-webkit-outer-spin-button,\ninput::-webkit-inner-spin-button {\n  -webkit-appearance: none;\n  margin: 0;\n}\ninput[type=\"number\"] {\n  -moz-appearance: textfield;\n}\n\n/* Hide default search clear button */\ninput[type=\"search\"]::-webkit-search-cancel-button {\n  -webkit-appearance: none;\n}\n\n/* iOS Safari auto-zooms the page when a focused form field's font-size is\n * under 16px — our text-body-regular/medium tokens are 14px by design, so\n * bump just the font-size (not the whole token) on small screens instead of\n * changing the design system's type scale. */\n@media (max-width: 639px) {\n  input,\n  select,\n  textarea {\n    font-size: 16px;\n  }\n}\n\n/* Soft fade applied to an animated number each time its target changes */\n@keyframes number-fade {\n  from {\n    opacity: 0.35;\n  }\n  to {\n    opacity: 1;\n  }\n}\n.animate-number-fade {\n  animation: number-fade 220ms ease-out;\n}\n\n/* Recharts' accessibility layer makes the chart surface and its shapes\n * (bars, sectors, dots) keyboard-focusable, and Chrome paints the UA focus\n * outline around whichever one you click - a blue box around a ring segment\n * or a bar. Every chart card drives its own focus feedback (hover darkening,\n * headline swap), so the outline is noise: hide it across every Recharts\n * chart. Keyboard users still get the cards' own active states. */\n.recharts-wrapper {\n  /* SVG axes use physical coordinates. Keep their data and numeric labels in\n   * order while card headers, legends and surrounding controls follow RTL. */\n  direction: ltr;\n}\n\n.recharts-wrapper:focus,\n.recharts-wrapper:focus-visible,\n.recharts-wrapper :focus,\n.recharts-wrapper :focus-visible {\n  outline: none;\n}\n\n/* Liquid glass (landing nav + hero) — the rim light.\n *\n * A fixed conic gradient standing in for a bevel lit from a single direction:\n * bright along the top edge where the light source is, dark down both sides\n * where the glass turns away, and a weaker bounce along the bottom. It does\n * not rotate — a travelling highlight reads as an animation playing on the\n * control, where a real edge just sits there catching the room.\n *\n * Achromatic on purpose: highlights are white, shading is black, nothing in\n * between carries a hue.\n *\n * The two-layer mask (padding-box XOR full box) keeps only the 1.5px ring,\n * letting the gradient paint the stroke without covering the glass. */\n\n.landing-glass-stroke {\n  pointer-events: none;\n  position: absolute;\n  inset: 0;\n  border-radius: inherit;\n  /* Every value here is set inline by `LiquidGlassSurface` from the shared\n   * glass config; the fallbacks are only for a bare use of the class. */\n  padding: var(--lg-rim-width, 1.5px);\n  background: conic-gradient(\n    from var(--lg-rim-angle, 0deg),\n    var(--lg-rim-hi, rgb(255 255 255 / 0.9)) 0deg,\n    var(--lg-rim-sh, rgb(0 0 0 / 0.14)) 70deg,\n    var(--lg-rim-dim, rgb(255 255 255 / 0.1)) 140deg,\n    var(--lg-rim-bounce, rgb(255 255 255 / 0.55)) 180deg,\n    var(--lg-rim-dim, rgb(255 255 255 / 0.1)) 220deg,\n    var(--lg-rim-sh, rgb(0 0 0 / 0.14)) 290deg,\n    var(--lg-rim-hi, rgb(255 255 255 / 0.9)) 360deg\n  );\n  /* Shorthands first, composites last: `-webkit-mask` aliases `mask` in\n   * Chromium, so a shorthand placed after a composite silently resets it to\n   * `add` — and an un-composited mask paints the full conic wash over the\n   * button instead of a ring. */\n  -webkit-mask:\n    linear-gradient(#000 0 0) content-box,\n    linear-gradient(#000 0 0);\n  mask:\n    linear-gradient(#000 0 0) content-box,\n    linear-gradient(#000 0 0);\n  -webkit-mask-composite: xor;\n  mask-composite: exclude;\n  opacity: var(--lg-rim-o, 1);\n  transition: opacity var(--lg-ms, 200ms) ease;\n}\n\n/* Liquid glass hover.\n *\n * Resting and hover values arrive together as inline custom properties, and\n * the swap happens here in CSS rather than in React state — hover then costs\n * a style recalculation instead of a re-render of everything inside the glass.\n * `.lg-hover` is the opt-in: a surface without it keeps its resting value. */\n.lg-tint {\n  background-color: var(--lg-tint, transparent);\n  transition: background-color var(--lg-ms, 200ms) ease;\n}\n\n.lg-sheen {\n  opacity: var(--lg-sheen, 0.5);\n  transition: opacity var(--lg-ms, 200ms) ease;\n}\n\n.lg-host {\n  box-shadow: var(--lg-shadow, none);\n  transition:\n    box-shadow var(--lg-ms, 200ms) ease,\n    transform var(--lg-ms, 200ms) ease;\n}\n\n.lg-host:hover {\n  box-shadow: var(--lg-shadow-hover, var(--lg-shadow, none));\n  transform: translateY(var(--lg-lift, 0px)) scale(var(--lg-scale, 1));\n}\n\n.group:hover .lg-tint.lg-hover {\n  background-color: var(--lg-tint-hover, var(--lg-tint, transparent));\n}\n\n.group:hover .lg-sheen.lg-hover {\n  opacity: var(--lg-sheen-hover, var(--lg-sheen, 0.5));\n}\n\n.group:hover .landing-glass-stroke.lg-hover {\n  opacity: var(--lg-rim-o-hover, var(--lg-rim-o, 1));\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .lg-tint,\n  .lg-sheen,\n  .lg-host,\n  .landing-glass-stroke {\n    transition: none;\n  }\n\n  .lg-host:hover {\n    transform: none;\n  }\n}\n\n/* Split-flap (\"Solari\" board) digit, used by the image-generation countdown.\n * Two leaves hinged on the card's centre seam:\n *   flap-fall  the outgoing digit's TOP half swings down over the incoming\n *              bottom half. Eased IN, because a real flap is falling under\n *              gravity — it accelerates — and it darkens as it tips away\n *              from the light.\n *   flap-rise  the incoming digit's BOTTOM half swings up from edge-on,\n *              starting exactly when the fall lands (delay = fall duration,\n *              `both` so it waits at 90deg instead of flashing flat). The\n *              small overshoot past 0deg is the slap against the stop —\n *              that bounce is what makes it read mechanical rather than\n *              like a plain rotation. */\n@keyframes flap-fall {\n  from {\n    transform: rotateX(0deg);\n    filter: brightness(1);\n  }\n  to {\n    transform: rotateX(-90deg);\n    filter: brightness(0.86);\n  }\n}\n@keyframes flap-rise {\n  0% {\n    transform: rotateX(90deg);\n    filter: brightness(0.86);\n  }\n  70% {\n    transform: rotateX(-9deg);\n  }\n  86% {\n    transform: rotateX(4deg);\n  }\n  100% {\n    transform: rotateX(0deg);\n    filter: brightness(1);\n  }\n}\n.animate-flap-fall {\n  transform-origin: bottom center;\n  backface-visibility: hidden;\n  animation: flap-fall 150ms cubic-bezier(0.55, 0, 0.9, 0.35) forwards;\n}\n.animate-flap-rise {\n  transform-origin: top center;\n  backface-visibility: hidden;\n  animation: flap-rise 230ms cubic-bezier(0.25, 0.7, 0.35, 1) 150ms both;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .animate-flap-fall,\n  .animate-flap-rise {\n    animation-duration: 1ms;\n    animation-delay: 0ms;\n  }\n}\n\n/* New-row entrance for the Storage settings table. Three coordinated\n * pieces (wrapper pairs with `grid grid-rows-[1fr]` + an overflow-hidden\n * middle layer, content carries the slide):\n *   row-grow-in   wrapper's grid track 0fr → 1fr — pushes the rows below\n *                 down smoothly.\n *   row-slide-in  content translates -100% → 0 with the SAME duration and\n *                 easing, so it stays glued to the growing wrapper's bottom\n *                 edge — visually the row slides out from underneath the\n *                 header row above it.\n *   row-fade-in   opacity/blur on a SHORTER clock than the movement — the\n *                 row is fully visible before it finishes settling (fades\n *                 must complete before movement ends). */\n@keyframes row-grow-in {\n  from {\n    grid-template-rows: 0fr;\n  }\n  to {\n    grid-template-rows: 1fr;\n  }\n}\n@keyframes row-slide-in {\n  from {\n    translate: 0 -100%;\n  }\n}\n@keyframes row-fade-in {\n  from {\n    opacity: 0;\n    filter: blur(2px);\n  }\n}\n.animate-row-grow-in {\n  animation: row-grow-in 400ms ease-out;\n}\n.animate-row-slide-in {\n  animation:\n    row-slide-in 400ms ease-out,\n    row-fade-in 240ms ease-out;\n}\n\n/* Reverse of the Storage row entrance. The content rises into the clipped\n * top edge while its grid track collapses, so the following rows move upward\n * continuously and the deleted row disappears beneath the header surface. */\n@keyframes row-collapse-out {\n  from {\n    grid-template-rows: 1fr;\n  }\n  to {\n    grid-template-rows: 0fr;\n  }\n}\n@keyframes row-slide-out {\n  to {\n    translate: 0 -100%;\n  }\n}\n@keyframes row-fade-out {\n  to {\n    opacity: 0;\n    filter: blur(2px);\n  }\n}\n.animate-row-collapse-out {\n  animation: row-collapse-out 225ms ease-in forwards;\n}\n.animate-row-slide-out {\n  animation:\n    row-slide-out 225ms ease-in forwards,\n    row-fade-out 160ms ease-in forwards;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .animate-row-grow-in,\n  .animate-row-slide-in,\n  .animate-row-collapse-out,\n  .animate-row-slide-out {\n    animation-duration: 1ms;\n  }\n}\n\n/* Transitions.dev — \"Texts reveal\", used by the Storage dropzone's content\n * swaps (idle copy ↔ file name + status line).\n *\n * Entrance (`.is-shown` on the parent): lines rise 12px from below while\n * un-blurring, 500ms on a soft-landing bezier, staggered 40ms per line so\n * the eye lands on the first line first.\n * Exit (`.is-hiding`): a single quiet 200ms opacity fade in place — no Y\n * return, no blur, no stagger — so the disappearance never reads as a\n * reverse reveal.\n *\n * Deviations from the original snippet: custom props are scoped to\n * `.t-stagger` instead of :root, and `.t-stagger-line` doesn't force\n * `display: block` so flex-based lines (the icon disc) keep their layout. */\n.t-stagger {\n  --stagger-dur: 500ms;\n  --stagger-distance: 12px;\n  --stagger-stagger: 40ms;\n  --stagger-blur: 3px;\n  --stagger-ease: cubic-bezier(0.22, 1, 0.36, 1);\n}\n.t-stagger-line {\n  opacity: 0;\n  transform: translateY(var(--stagger-distance));\n  filter: blur(var(--stagger-blur));\n  transition:\n    opacity var(--stagger-dur) var(--stagger-ease),\n    transform var(--stagger-dur) var(--stagger-ease),\n    filter var(--stagger-dur) var(--stagger-ease);\n  will-change: transform, opacity, filter;\n}\n.t-stagger-line--2 {\n  transition-delay: var(--stagger-stagger);\n}\n.t-stagger-line--3 {\n  transition-delay: calc(var(--stagger-stagger) * 2);\n}\n.t-stagger.is-shown .t-stagger-line {\n  opacity: 1;\n  transform: translateY(0);\n  filter: blur(0);\n}\n.t-stagger.is-hiding .t-stagger-line {\n  opacity: 0;\n  transform: translateY(0);\n  filter: blur(0);\n  transition:\n    opacity 200ms ease,\n    transform 0s linear,\n    filter 0s linear;\n  transition-delay: 0s;\n}\n@media (prefers-reduced-motion: reduce) {\n  .t-stagger-line {\n    transition: none !important;\n  }\n}\n\n/* Rolling-counter label swap: the old value lifts 5px and fades out while the\n * new one rises in from 5px below and fades in. */\n@keyframes label-out {\n  from {\n    transform: translateY(0);\n    opacity: 1;\n  }\n  to {\n    transform: translateY(-10px);\n    opacity: 0;\n  }\n}\n@keyframes label-in {\n  from {\n    transform: translateY(10px);\n    opacity: 0;\n  }\n  to {\n    transform: translateY(0);\n    opacity: 1;\n  }\n}\n.animate-label-out {\n  animation: label-out 220ms ease-out forwards;\n}\n.animate-label-in {\n  animation: label-in 220ms ease-out;\n}\n\n/* Checkbox tick: draws the stroke on like it's being ticked by hand.\n * The path sets pathLength=1 so the dash math is resolution-independent. */\n@keyframes check-draw {\n  from {\n    stroke-dashoffset: 1;\n  }\n  to {\n    stroke-dashoffset: 0;\n  }\n}\n.animate-check-draw {\n  stroke-dasharray: 1;\n  stroke-dashoffset: 1;\n  animation: check-draw 200ms cubic-bezier(0.65, 0, 0.35, 1) forwards;\n}\n@media (prefers-reduced-motion: reduce) {\n  .animate-check-draw {\n    animation: none;\n    stroke-dashoffset: 0;\n  }\n}\n\n/* ---------------------------------------------------------------------------\n * Chart entrance animations (AI profile template & contributions heatmap)\n * ------------------------------------------------------------------------- */\n\n/* Heatmap cells pop in softly — each cell gets a random-looking per-cell\n * animation-delay so the grid fills in a scattered order. */\n.contributions-grid {\n  --contribution-tier-0: var(--color-chart-neutral);\n}\n.contributions-grid[data-accent=\"emerald\"] {\n  --contribution-tier-1: var(--color-emerald-200); --contribution-tier-2: var(--color-emerald-400); --contribution-tier-3: var(--color-emerald-500); --contribution-tier-4: var(--color-emerald-600); --contribution-tier-5: var(--color-emerald-700);\n}\n.contributions-grid[data-accent=\"green\"] {\n  --contribution-tier-1: var(--color-green-200); --contribution-tier-2: var(--color-green-400); --contribution-tier-3: var(--color-green-500); --contribution-tier-4: var(--color-green-600); --contribution-tier-5: var(--color-green-700);\n}\n.contributions-grid[data-accent=\"teal\"] {\n  --contribution-tier-1: var(--color-teal-200); --contribution-tier-2: var(--color-teal-400); --contribution-tier-3: var(--color-teal-500); --contribution-tier-4: var(--color-teal-600); --contribution-tier-5: var(--color-teal-700);\n}\n.contributions-grid[data-accent=\"cyan\"] {\n  --contribution-tier-1: var(--color-cyan-200); --contribution-tier-2: var(--color-cyan-400); --contribution-tier-3: var(--color-cyan-500); --contribution-tier-4: var(--color-cyan-600); --contribution-tier-5: var(--color-cyan-700);\n}\n.contributions-grid[data-accent=\"blue\"] {\n  --contribution-tier-1: var(--color-blue-200); --contribution-tier-2: var(--color-blue-400); --contribution-tier-3: var(--color-blue-500); --contribution-tier-4: var(--color-blue-600); --contribution-tier-5: var(--color-blue-700);\n}\n.contributions-grid[data-accent=\"indigo\"] {\n  --contribution-tier-1: var(--color-indigo-200); --contribution-tier-2: var(--color-indigo-400); --contribution-tier-3: var(--color-indigo-500); --contribution-tier-4: var(--color-indigo-600); --contribution-tier-5: var(--color-indigo-700);\n}\n.contributions-grid[data-accent=\"violet\"] {\n  --contribution-tier-1: var(--color-violet-200); --contribution-tier-2: var(--color-violet-400); --contribution-tier-3: var(--color-violet-500); --contribution-tier-4: var(--color-violet-600); --contribution-tier-5: var(--color-violet-700);\n}\n.contributions-grid[data-accent=\"rose\"] {\n  --contribution-tier-1: var(--color-rose-200); --contribution-tier-2: var(--color-rose-400); --contribution-tier-3: var(--color-rose-500); --contribution-tier-4: var(--color-rose-600); --contribution-tier-5: var(--color-rose-700);\n}\n.contributions-grid[data-accent=\"amber\"] {\n  --contribution-tier-1: var(--color-amber-200); --contribution-tier-2: var(--color-amber-400); --contribution-tier-3: var(--color-amber-500); --contribution-tier-4: var(--color-amber-600); --contribution-tier-5: var(--color-amber-700);\n}\n\n.dark .contributions-grid[data-accent=\"emerald\"] {\n  --contribution-tier-1: var(--color-emerald-950); --contribution-tier-2: var(--color-emerald-800); --contribution-tier-3: var(--color-emerald-700); --contribution-tier-4: var(--color-emerald-600); --contribution-tier-5: var(--color-emerald-500);\n}\n.dark .contributions-grid[data-accent=\"green\"] {\n  --contribution-tier-1: var(--color-green-950); --contribution-tier-2: var(--color-green-800); --contribution-tier-3: var(--color-green-700); --contribution-tier-4: var(--color-green-600); --contribution-tier-5: var(--color-green-500);\n}\n.dark .contributions-grid[data-accent=\"teal\"] {\n  --contribution-tier-1: var(--color-teal-950); --contribution-tier-2: var(--color-teal-800); --contribution-tier-3: var(--color-teal-700); --contribution-tier-4: var(--color-teal-600); --contribution-tier-5: var(--color-teal-500);\n}\n.dark .contributions-grid[data-accent=\"cyan\"] {\n  --contribution-tier-1: var(--color-cyan-950); --contribution-tier-2: var(--color-cyan-800); --contribution-tier-3: var(--color-cyan-700); --contribution-tier-4: var(--color-cyan-600); --contribution-tier-5: var(--color-cyan-500);\n}\n.dark .contributions-grid[data-accent=\"blue\"] {\n  --contribution-tier-1: var(--color-blue-950); --contribution-tier-2: var(--color-blue-800); --contribution-tier-3: var(--color-blue-700); --contribution-tier-4: var(--color-blue-600); --contribution-tier-5: var(--color-blue-500);\n}\n.dark .contributions-grid[data-accent=\"indigo\"] {\n  --contribution-tier-1: var(--color-indigo-950); --contribution-tier-2: var(--color-indigo-800); --contribution-tier-3: var(--color-indigo-700); --contribution-tier-4: var(--color-indigo-600); --contribution-tier-5: var(--color-indigo-500);\n}\n.dark .contributions-grid[data-accent=\"violet\"] {\n  --contribution-tier-1: var(--color-violet-950); --contribution-tier-2: var(--color-violet-800); --contribution-tier-3: var(--color-violet-700); --contribution-tier-4: var(--color-violet-600); --contribution-tier-5: var(--color-violet-500);\n}\n.dark .contributions-grid[data-accent=\"rose\"] {\n  --contribution-tier-1: var(--color-rose-950); --contribution-tier-2: var(--color-rose-800); --contribution-tier-3: var(--color-rose-700); --contribution-tier-4: var(--color-rose-600); --contribution-tier-5: var(--color-rose-500);\n}\n.dark .contributions-grid[data-accent=\"amber\"] {\n  --contribution-tier-1: var(--color-amber-950); --contribution-tier-2: var(--color-amber-800); --contribution-tier-3: var(--color-amber-700); --contribution-tier-4: var(--color-amber-600); --contribution-tier-5: var(--color-amber-500);\n}\n\n.contribution-cell[data-tier=\"0\"] { background-color: var(--contribution-tier-0); }\n.contribution-cell[data-tier=\"1\"] { background-color: var(--contribution-tier-1); }\n.contribution-cell[data-tier=\"2\"] { background-color: var(--contribution-tier-2); }\n.contribution-cell[data-tier=\"3\"] { background-color: var(--contribution-tier-3); }\n.contribution-cell[data-tier=\"4\"] { background-color: var(--contribution-tier-4); }\n.contribution-cell[data-tier=\"5\"] { background-color: var(--contribution-tier-5); }\n\n@keyframes cell-pop {\n  from {\n    opacity: 0;\n    transform: scale(0.5);\n  }\n  to {\n    opacity: 1;\n    transform: scale(1);\n  }\n}\n.animate-cell-pop {\n  animation: cell-pop 380ms ease-out both;\n}\n\n/* Bars grow up from the baseline; a per-bar delay staggers them left→right. */\n@keyframes bar-rise {\n  from {\n    transform: scaleY(0);\n  }\n  to {\n    transform: scaleY(1);\n  }\n}\n.animate-bar-rise {\n  transform-origin: bottom;\n  animation: bar-rise 360ms cubic-bezier(0.22, 1, 0.36, 1) both;\n}\n\n/* Line chart draws in left→right via a clip-path sweep over the whole plot\n * (line + gradient area together). */\n@keyframes chart-reveal {\n  from {\n    clip-path: inset(0 100% 0 0);\n  }\n  to {\n    clip-path: inset(0 0 0 0);\n  }\n}\n.animate-chart-reveal {\n  animation: chart-reveal 1800ms cubic-bezier(0.33, 0, 0.15, 1) both;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .animate-cell-pop,\n  .animate-bar-rise,\n  .animate-chart-reveal {\n    animation: none;\n  }\n}\n\n/* ---------------------------------------------------------------------------\n * Table primitive (components/base/table)\n *\n * React Aria's collection components (Column/Row/Cell/…) can't be wrapped in\n * custom components without losing collection behaviour, so the primitive\n * re-exports them untouched and styling lives here, scoped to `.bui-table`.\n * React Aria renders real <table>/<thead>/<th>/<tr>/<td> elements.\n * --------------------------------------------------------------------------- */\n.bui-table {\n  @apply w-full border-collapse text-start;\n}\n/* Header background + border-y live on the cells: with border-collapse the\n * browser doesn't paint backgrounds/borders set on the <thead> row group.\n * Backgrounds/borders are set with explicit CSS (theme vars) rather than\n * @apply, which drops border-width/bg on these row-group cells. */\n.bui-table th {\n  @apply px-3 py-2.5 text-start align-middle text-body-medium text-text-tertiary whitespace-nowrap outline-none;\n  background-color: var(--color-background-secondary-default);\n  border-top: 1px solid var(--color-separator-border);\n  border-bottom: 1px solid var(--color-separator-border);\n  transition: padding 200ms ease, font-size 200ms ease;\n}\n.bui-table td {\n  @apply px-3 py-2.5 align-middle text-body-medium text-text-primary outline-none;\n  transition: padding 200ms ease, font-size 200ms ease;\n}\n/* Separators sit *between* rows only: the trailing row's boundary is drawn by\n * whatever follows the table (the container's bottom edge, or the pagination\n * footer's own border-top), so a filtered-down table never doubles up lines. */\n.bui-table tbody tr:not(:last-child) {\n  border-bottom: 1px solid var(--color-separator-border);\n}\n.bui-table tbody tr {\n  @apply transition-colors duration-150;\n}\n.bui-table tbody tr[data-focus-visible] {\n  @apply ring-2 ring-inset ring-border-focus-ring;\n}\n.bui-table.bui-table-sm th,\n.bui-table.bui-table-sm td {\n  @apply px-2.5 py-1.5 text-body-2-medium;\n}\n\n/* Agent Thinking (components/application/agent-thinking): the agent thinking state\n * above a chat composer. The label reuses the ai-chat-text-shimmer travel;\n * its base/highlight both derive from the tone the component sets via\n * --bui-agent-thinking-tone, so every tone shimmers consistently. */\n.bui-agent-thinking-label {\n  color: transparent;\n  background-image: linear-gradient(\n    100deg,\n    color-mix(in oklab, var(--bui-agent-thinking-tone) 55%, transparent) 30%,\n    var(--bui-agent-thinking-tone) 50%,\n    color-mix(in oklab, var(--bui-agent-thinking-tone) 55%, transparent) 70%\n  );\n  background-position: 200% center;\n  background-size: 300% 100%;\n  background-clip: text;\n  -webkit-background-clip: text;\n  animation: ai-chat-text-shimmer 2.6s linear infinite;\n  will-change: background-position;\n}\n\n/* Star sparkle: scale + fade in, settle, and vanish; per-star duration and\n * stagger come in via inline animation-duration/-delay. */\n@keyframes bui-agent-thinking-star {\n  0%,\n  100% {\n    transform: scale(0);\n    opacity: 0;\n  }\n  40% {\n    transform: scale(1);\n    opacity: 1;\n  }\n  60% {\n    transform: scale(0.8);\n    opacity: 0.9;\n  }\n}\n\n.bui-agent-thinking-star {\n  transform: scale(0);\n  animation-name: bui-agent-thinking-star;\n  animation-timing-function: ease-in-out;\n  animation-iteration-count: infinite;\n}\n\n/* Infinity comet: the dash segment laps the normalized (pathLength=100)\n * figure-eight once per animation-duration. */\n@keyframes bui-agent-thinking-dash {\n  to {\n    stroke-dashoffset: -100;\n  }\n}\n\n.bui-agent-thinking-comet {\n  animation-name: bui-agent-thinking-dash;\n  animation-timing-function: linear;\n  animation-iteration-count: infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .bui-agent-thinking-label {\n    color: var(--bui-agent-thinking-tone);\n    background-image: none;\n    animation: none;\n  }\n\n  /* Stars rest visible instead of frozen at scale(0). */\n  .bui-agent-thinking-star {\n    animation: none;\n    transform: none;\n    opacity: 0.7;\n  }\n\n  .bui-agent-thinking-comet {\n    animation: none;\n  }\n}\n\n/* Star glyphs read a touch heavier than the dot grids on light backgrounds;\n * soften only them (not the label) there. Dark mode keeps the full tone. */\n.bui-agent-thinking-stars {\n  color: color-mix(in oklab, currentColor 75%, transparent);\n}\n\n.dark .bui-agent-thinking-stars {\n  color: inherit;\n}\n\n/* Composer Loader (components/application/composer-loader): the light band\n * orbiting the composer while the agent works. Dash segments on a\n * pathLength-normalized SVG stroke — the offset laps once per duration. */\n@keyframes bui-composer-loader-dash {\n  from {\n    stroke-dashoffset: 0;\n  }\n\n  to {\n    stroke-dashoffset: -100;\n  }\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .bui-composer-loader-rect {\n    animation: none !important;\n  }\n}\n\n/* Composer mic listening state (components/application/ai-chat): equalizer\n * bars dancing while voice input is active. Per-bar duration/delay come in\n * inline so the bars drift out of phase like real audio. */\n@keyframes bui-composer-mic-bars {\n  0%,\n  100% {\n    transform: scaleY(0.4);\n  }\n\n  50% {\n    transform: scaleY(1);\n  }\n}\n\n.bui-composer-mic-bar {\n  animation: bui-composer-mic-bars 0.9s ease-in-out infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .bui-composer-mic-bar {\n    animation: none;\n    transform: scaleY(0.7);\n  }\n}\n\n/* Shimmer sweep on a primary call to action (the Pro prompt card). */\n@keyframes bui-badge-shimmer {\n  0% {\n    transform: translateX(0) skewX(-12deg);\n  }\n  40%,\n  100% {\n    transform: translateX(350%) skewX(-12deg);\n  }\n}\n\n.bui-badge-shimmer {\n  animation: bui-badge-shimmer 2.5s ease-in-out infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .bui-badge-shimmer {\n      animation: none;\n      opacity: 0;\n    }\n}\n\n/* Showcase card (docs index, landing, the starter's catalogue). */\n.landing-showcase-card {\n  transition: box-shadow 280ms ease;\n}\n\n.landing-showcase-card::after {\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  z-index: 60;\n  pointer-events: none;\n  border: 1px solid var(--color-border-button-default);\n  border-radius: inherit;\n  transition:\n    border-color 280ms ease,\n    box-shadow 280ms ease;\n}\n\n.dark .landing-showcase-card::after {\n  border-color: rgb(255 255 255 / 0.08);\n}\n\n@media (min-width: 640px) and (hover: hover) {\n  .landing-showcase-card:hover::after,\n  .landing-showcase-card:focus-within::after {\n    border-color: var(--color-border-button-hover);\n    box-shadow: inset 0 0 0 2px var(--color-border-button-hover);\n  }\n}\n\n/* Preserve source desktop geometry while preventing fixed profile controls from covering mobile labels. */\n@media(max-width:639px){.bn-settings-profile .bn-settings-row{flex-direction:column;align-items:stretch;gap:8px}.bn-settings-profile .bn-settings-row>*{max-width:100%}.bn-settings-profile .bn-settings-row>button,.bn-settings-profile .bn-settings-row>div[data-rac]{width:100%}.bn-settings-profile .bn-settings-row>label{align-self:flex-start}}\n\n/* Fit all OTP slots inside narrow embedded examples without clipping later digits. */\n[data-input-otp] { max-width:100%; }\n[data-input-otp] > div { min-width:0; }\n[data-input-otp] input { max-width:100%; }\n\n/* Keep all notification category labels and their counts visible in phone cards. */\n@media(max-width:639px){\n [data-notification-center] [aria-label=\"Notification category\"]>button{min-width:0;padding-inline:3px;font-size:12px}\n [data-notification-center] [aria-label=\"Notification category\"]>button>span{gap:4px}\n [data-notification-center] [aria-label=\"Notification category\"]>button>span>span{min-width:16px;font-size:10px}\n}\n",
  "src/board-native/styles/native-globals.css": "/* ---------------------------------------------------------------------------\n * Dark mode strategy\n *\n * We use a class-based dark variant. Toggle dark mode by adding the `.dark`\n * class to <html> (a theme provider like `next-themes` can do this later).\n *\n *   <html class=\"dark\">  →  every `dark:*` utility activates\n *\n * Components should NOT use `dark:` prefixes directly. Instead they reference\n * semantic color tokens (e.g. `bg-bg-primary`, `text-text-primary`) that flip\n * under `.dark` in styles/theme.css.\n * --------------------------------------------------------------------------- */\n@custom-variant dark (&:where(.dark, .dark *));\n\n/* Resolve the nearest direction boundary, including nested LTR regions.\n * Tailwind's ancestor-based defaults also match inside an opposing region. */\n@custom-variant rtl (&:dir(rtl));\n@custom-variant ltr (&:dir(ltr));\n\n/* The next theme is revealed by ThemeToggle from the exact interaction point.\n * Native view-transition crossfades are disabled so only the soft circular\n * clip-path animation runs; unsupported browsers simply ignore these rules. */\n::view-transition-old(root),\n::view-transition-new(root) {\n  animation: none;\n  mix-blend-mode: normal;\n}\n\n@keyframes ai-chat-text-shimmer {\n  from {\n    background-position: 200% center;\n  }\n\n  to {\n    background-position: -100% center;\n  }\n}\n\n.agent-progress-loading-text {\n  color: transparent;\n  background-image: linear-gradient(\n    100deg,\n    var(--color-text-secondary) 16%,\n    var(--color-text-secondary) 38%,\n    var(--color-text-primary) 50%,\n    var(--color-text-secondary) 62%,\n    var(--color-text-secondary) 84%\n  );\n  background-position: 200% center;\n  background-size: 300% 100%;\n  background-clip: text;\n  -webkit-background-clip: text;\n  animation: ai-chat-text-shimmer 3.4s linear infinite;\n  will-change: background-position;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .agent-progress-loading-text {\n    color: var(--color-text-secondary);\n    background-image: none;\n    animation: none;\n  }\n}\n\n::view-transition-old(root) {\n  z-index: 1;\n}\n\n::view-transition-new(root) {\n  z-index: 2;\n}\n\n/* Components often have their own hover/focus color transitions. Freeze them\n * while the browser captures the next theme so the expanding circle contains\n * the fully resolved new palette instead of a frame that is still fading from\n * the old one. This is what makes the click-origin reveal read clearly. */\n.theme-transitioning,\n.theme-transitioning * {\n  transition: none !important;\n}\n\n/* Reset + base */\nhtml,\nbody {\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  font-variant-ligatures: contextual;\n  font-kerning: normal;\n}\n\nhtml {\n  color-scheme: light;\n  background-color: var(--color-background-full);\n}\nhtml.dark {\n  color-scheme: dark;\n}\nbody {\n  background-color: var(--color-background-full);\n  color: var(--color-text-primary);\n}\n\n/* Theme-aware monochrome Helios UI mark. Both images keep their intrinsic\n * dimensions while the root theme class decides which one participates in\n * layout, avoiding a light-logo flash during hydration. */\n.theme-logo-dark,\n.theme-asset-dark {\n  display: none;\n}\n.dark .theme-logo-light,\n.dark .theme-asset-light {\n  display: none;\n}\n.dark .theme-logo-dark,\n.dark .theme-asset-dark {\n  display: block;\n}\n\n/* Tailwind expands shadow utilities into `--tw-shadow` at build time. Point\n * those generated utilities back to the live dark elevation tokens so the\n * class-based theme can adjust opacity without component-level overrides. */\n.dark .shadow-2xs {\n  --tw-shadow: var(--shadow-2xs);\n}\n.dark .shadow-xs {\n  --tw-shadow: var(--shadow-xs);\n}\n.dark .shadow-sm {\n  --tw-shadow: var(--shadow-sm);\n}\n.dark .shadow-md {\n  --tw-shadow: var(--shadow-md);\n}\n.dark .shadow-lg {\n  --tw-shadow: var(--shadow-lg);\n}\n.dark .shadow-xl {\n  --tw-shadow: var(--shadow-xl);\n}\n.dark .shadow-card {\n  --tw-shadow: var(--shadow-card);\n}\n.dark .shadow-dropdown {\n  --tw-shadow: var(--shadow-dropdown);\n}\n.dark .shadow-sidebar {\n  --tw-shadow: var(--shadow-sidebar);\n}\n.dark .shadow-waitlist {\n  --tw-shadow: var(--shadow-waitlist);\n}\n\n/* Hide default expand arrow on Safari */\ndetails summary::-webkit-details-marker {\n  display: none;\n}\n\n/* Hide default number-input spinners */\ninput::-webkit-outer-spin-button,\ninput::-webkit-inner-spin-button {\n  -webkit-appearance: none;\n  margin: 0;\n}\ninput[type=\"number\"] {\n  -moz-appearance: textfield;\n}\n\n/* Hide default search clear button */\ninput[type=\"search\"]::-webkit-search-cancel-button {\n  -webkit-appearance: none;\n}\n\n/* iOS Safari auto-zooms the page when a focused form field's font-size is\n * under 16px — our text-body-regular/medium tokens are 14px by design, so\n * bump just the font-size (not the whole token) on small screens instead of\n * changing the design system's type scale. */\n@media (max-width: 639px) {\n  input,\n  select,\n  textarea {\n    font-size: 16px;\n  }\n}\n\n/* Soft fade applied to an animated number each time its target changes */\n@keyframes number-fade {\n  from {\n    opacity: 0.35;\n  }\n  to {\n    opacity: 1;\n  }\n}\n.animate-number-fade {\n  animation: number-fade 220ms ease-out;\n}\n\n/* Recharts' accessibility layer makes the chart surface and its shapes\n * (bars, sectors, dots) keyboard-focusable, and Chrome paints the UA focus\n * outline around whichever one you click - a blue box around a ring segment\n * or a bar. Every chart card drives its own focus feedback (hover darkening,\n * headline swap), so the outline is noise: hide it across every Recharts\n * chart. Keyboard users still get the cards' own active states. */\n.recharts-wrapper {\n  /* SVG axes use physical coordinates. Keep their data and numeric labels in\n   * order while card headers, legends and surrounding controls follow RTL. */\n  direction: ltr;\n}\n\n.recharts-wrapper:focus,\n.recharts-wrapper:focus-visible,\n.recharts-wrapper :focus,\n.recharts-wrapper :focus-visible {\n  outline: none;\n}\n\n/* Liquid glass (landing nav + hero) — the rim light.\n *\n * A fixed conic gradient standing in for a bevel lit from a single direction:\n * bright along the top edge where the light source is, dark down both sides\n * where the glass turns away, and a weaker bounce along the bottom. It does\n * not rotate — a travelling highlight reads as an animation playing on the\n * control, where a real edge just sits there catching the room.\n *\n * Achromatic on purpose: highlights are white, shading is black, nothing in\n * between carries a hue.\n *\n * The two-layer mask (padding-box XOR full box) keeps only the 1.5px ring,\n * letting the gradient paint the stroke without covering the glass. */\n\n.landing-glass-stroke {\n  pointer-events: none;\n  position: absolute;\n  inset: 0;\n  border-radius: inherit;\n  /* Every value here is set inline by `LiquidGlassSurface` from the shared\n   * glass config; the fallbacks are only for a bare use of the class. */\n  padding: var(--lg-rim-width, 1.5px);\n  background: conic-gradient(\n    from var(--lg-rim-angle, 0deg),\n    var(--lg-rim-hi, rgb(255 255 255 / 0.9)) 0deg,\n    var(--lg-rim-sh, rgb(0 0 0 / 0.14)) 70deg,\n    var(--lg-rim-dim, rgb(255 255 255 / 0.1)) 140deg,\n    var(--lg-rim-bounce, rgb(255 255 255 / 0.55)) 180deg,\n    var(--lg-rim-dim, rgb(255 255 255 / 0.1)) 220deg,\n    var(--lg-rim-sh, rgb(0 0 0 / 0.14)) 290deg,\n    var(--lg-rim-hi, rgb(255 255 255 / 0.9)) 360deg\n  );\n  /* Shorthands first, composites last: `-webkit-mask` aliases `mask` in\n   * Chromium, so a shorthand placed after a composite silently resets it to\n   * `add` — and an un-composited mask paints the full conic wash over the\n   * button instead of a ring. */\n  -webkit-mask:\n    linear-gradient(#000 0 0) content-box,\n    linear-gradient(#000 0 0);\n  mask:\n    linear-gradient(#000 0 0) content-box,\n    linear-gradient(#000 0 0);\n  -webkit-mask-composite: xor;\n  mask-composite: exclude;\n  opacity: var(--lg-rim-o, 1);\n  transition: opacity var(--lg-ms, 200ms) ease;\n}\n\n/* Liquid glass hover.\n *\n * Resting and hover values arrive together as inline custom properties, and\n * the swap happens here in CSS rather than in React state — hover then costs\n * a style recalculation instead of a re-render of everything inside the glass.\n * `.lg-hover` is the opt-in: a surface without it keeps its resting value. */\n.lg-tint {\n  background-color: var(--lg-tint, transparent);\n  transition: background-color var(--lg-ms, 200ms) ease;\n}\n\n.lg-sheen {\n  opacity: var(--lg-sheen, 0.5);\n  transition: opacity var(--lg-ms, 200ms) ease;\n}\n\n.lg-host {\n  box-shadow: var(--lg-shadow, none);\n  transition:\n    box-shadow var(--lg-ms, 200ms) ease,\n    transform var(--lg-ms, 200ms) ease;\n}\n\n.lg-host:hover {\n  box-shadow: var(--lg-shadow-hover, var(--lg-shadow, none));\n  transform: translateY(var(--lg-lift, 0px)) scale(var(--lg-scale, 1));\n}\n\n.group:hover .lg-tint.lg-hover {\n  background-color: var(--lg-tint-hover, var(--lg-tint, transparent));\n}\n\n.group:hover .lg-sheen.lg-hover {\n  opacity: var(--lg-sheen-hover, var(--lg-sheen, 0.5));\n}\n\n.group:hover .landing-glass-stroke.lg-hover {\n  opacity: var(--lg-rim-o-hover, var(--lg-rim-o, 1));\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .lg-tint,\n  .lg-sheen,\n  .lg-host,\n  .landing-glass-stroke {\n    transition: none;\n  }\n\n  .lg-host:hover {\n    transform: none;\n  }\n}\n\n/* Split-flap (\"Solari\" board) digit, used by the image-generation countdown.\n * Two leaves hinged on the card's centre seam:\n *   flap-fall  the outgoing digit's TOP half swings down over the incoming\n *              bottom half. Eased IN, because a real flap is falling under\n *              gravity — it accelerates — and it darkens as it tips away\n *              from the light.\n *   flap-rise  the incoming digit's BOTTOM half swings up from edge-on,\n *              starting exactly when the fall lands (delay = fall duration,\n *              `both` so it waits at 90deg instead of flashing flat). The\n *              small overshoot past 0deg is the slap against the stop —\n *              that bounce is what makes it read mechanical rather than\n *              like a plain rotation. */\n@keyframes flap-fall {\n  from {\n    transform: rotateX(0deg);\n    filter: brightness(1);\n  }\n  to {\n    transform: rotateX(-90deg);\n    filter: brightness(0.86);\n  }\n}\n@keyframes flap-rise {\n  0% {\n    transform: rotateX(90deg);\n    filter: brightness(0.86);\n  }\n  70% {\n    transform: rotateX(-9deg);\n  }\n  86% {\n    transform: rotateX(4deg);\n  }\n  100% {\n    transform: rotateX(0deg);\n    filter: brightness(1);\n  }\n}\n.animate-flap-fall {\n  transform-origin: bottom center;\n  backface-visibility: hidden;\n  animation: flap-fall 150ms cubic-bezier(0.55, 0, 0.9, 0.35) forwards;\n}\n.animate-flap-rise {\n  transform-origin: top center;\n  backface-visibility: hidden;\n  animation: flap-rise 230ms cubic-bezier(0.25, 0.7, 0.35, 1) 150ms both;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .animate-flap-fall,\n  .animate-flap-rise {\n    animation-duration: 1ms;\n    animation-delay: 0ms;\n  }\n}\n\n/* New-row entrance for the Storage settings table. Three coordinated\n * pieces (wrapper pairs with `grid grid-rows-[1fr]` + an overflow-hidden\n * middle layer, content carries the slide):\n *   row-grow-in   wrapper's grid track 0fr → 1fr — pushes the rows below\n *                 down smoothly.\n *   row-slide-in  content translates -100% → 0 with the SAME duration and\n *                 easing, so it stays glued to the growing wrapper's bottom\n *                 edge — visually the row slides out from underneath the\n *                 header row above it.\n *   row-fade-in   opacity/blur on a SHORTER clock than the movement — the\n *                 row is fully visible before it finishes settling (fades\n *                 must complete before movement ends). */\n@keyframes row-grow-in {\n  from {\n    grid-template-rows: 0fr;\n  }\n  to {\n    grid-template-rows: 1fr;\n  }\n}\n@keyframes row-slide-in {\n  from {\n    translate: 0 -100%;\n  }\n}\n@keyframes row-fade-in {\n  from {\n    opacity: 0;\n    filter: blur(2px);\n  }\n}\n.animate-row-grow-in {\n  animation: row-grow-in 400ms ease-out;\n}\n.animate-row-slide-in {\n  animation:\n    row-slide-in 400ms ease-out,\n    row-fade-in 240ms ease-out;\n}\n\n/* Reverse of the Storage row entrance. The content rises into the clipped\n * top edge while its grid track collapses, so the following rows move upward\n * continuously and the deleted row disappears beneath the header surface. */\n@keyframes row-collapse-out {\n  from {\n    grid-template-rows: 1fr;\n  }\n  to {\n    grid-template-rows: 0fr;\n  }\n}\n@keyframes row-slide-out {\n  to {\n    translate: 0 -100%;\n  }\n}\n@keyframes row-fade-out {\n  to {\n    opacity: 0;\n    filter: blur(2px);\n  }\n}\n.animate-row-collapse-out {\n  animation: row-collapse-out 225ms ease-in forwards;\n}\n.animate-row-slide-out {\n  animation:\n    row-slide-out 225ms ease-in forwards,\n    row-fade-out 160ms ease-in forwards;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .animate-row-grow-in,\n  .animate-row-slide-in,\n  .animate-row-collapse-out,\n  .animate-row-slide-out {\n    animation-duration: 1ms;\n  }\n}\n\n/* Transitions.dev — \"Texts reveal\", used by the Storage dropzone's content\n * swaps (idle copy ↔ file name + status line).\n *\n * Entrance (`.is-shown` on the parent): lines rise 12px from below while\n * un-blurring, 500ms on a soft-landing bezier, staggered 40ms per line so\n * the eye lands on the first line first.\n * Exit (`.is-hiding`): a single quiet 200ms opacity fade in place — no Y\n * return, no blur, no stagger — so the disappearance never reads as a\n * reverse reveal.\n *\n * Deviations from the original snippet: custom props are scoped to\n * `.t-stagger` instead of :root, and `.t-stagger-line` doesn't force\n * `display: block` so flex-based lines (the icon disc) keep their layout. */\n.t-stagger {\n  --stagger-dur: 500ms;\n  --stagger-distance: 12px;\n  --stagger-stagger: 40ms;\n  --stagger-blur: 3px;\n  --stagger-ease: cubic-bezier(0.22, 1, 0.36, 1);\n}\n.t-stagger-line {\n  opacity: 0;\n  transform: translateY(var(--stagger-distance));\n  filter: blur(var(--stagger-blur));\n  transition:\n    opacity var(--stagger-dur) var(--stagger-ease),\n    transform var(--stagger-dur) var(--stagger-ease),\n    filter var(--stagger-dur) var(--stagger-ease);\n  will-change: transform, opacity, filter;\n}\n.t-stagger-line--2 {\n  transition-delay: var(--stagger-stagger);\n}\n.t-stagger-line--3 {\n  transition-delay: calc(var(--stagger-stagger) * 2);\n}\n.t-stagger.is-shown .t-stagger-line {\n  opacity: 1;\n  transform: translateY(0);\n  filter: blur(0);\n}\n.t-stagger.is-hiding .t-stagger-line {\n  opacity: 0;\n  transform: translateY(0);\n  filter: blur(0);\n  transition:\n    opacity 200ms ease,\n    transform 0s linear,\n    filter 0s linear;\n  transition-delay: 0s;\n}\n@media (prefers-reduced-motion: reduce) {\n  .t-stagger-line {\n    transition: none !important;\n  }\n}\n\n/* Rolling-counter label swap: the old value lifts 5px and fades out while the\n * new one rises in from 5px below and fades in. */\n@keyframes label-out {\n  from {\n    transform: translateY(0);\n    opacity: 1;\n  }\n  to {\n    transform: translateY(-10px);\n    opacity: 0;\n  }\n}\n@keyframes label-in {\n  from {\n    transform: translateY(10px);\n    opacity: 0;\n  }\n  to {\n    transform: translateY(0);\n    opacity: 1;\n  }\n}\n.animate-label-out {\n  animation: label-out 220ms ease-out forwards;\n}\n.animate-label-in {\n  animation: label-in 220ms ease-out;\n}\n\n/* Checkbox tick: draws the stroke on like it's being ticked by hand.\n * The path sets pathLength=1 so the dash math is resolution-independent. */\n@keyframes check-draw {\n  from {\n    stroke-dashoffset: 1;\n  }\n  to {\n    stroke-dashoffset: 0;\n  }\n}\n.animate-check-draw {\n  stroke-dasharray: 1;\n  stroke-dashoffset: 1;\n  animation: check-draw 200ms cubic-bezier(0.65, 0, 0.35, 1) forwards;\n}\n@media (prefers-reduced-motion: reduce) {\n  .animate-check-draw {\n    animation: none;\n    stroke-dashoffset: 0;\n  }\n}\n\n/* ---------------------------------------------------------------------------\n * Chart entrance animations (AI profile template & contributions heatmap)\n * ------------------------------------------------------------------------- */\n\n/* Heatmap cells pop in softly — each cell gets a random-looking per-cell\n * animation-delay so the grid fills in a scattered order. */\n.contributions-grid {\n  --contribution-tier-0: var(--color-chart-neutral);\n}\n.contributions-grid[data-accent=\"emerald\"] {\n  --contribution-tier-1: var(--color-emerald-200); --contribution-tier-2: var(--color-emerald-400); --contribution-tier-3: var(--color-emerald-500); --contribution-tier-4: var(--color-emerald-600); --contribution-tier-5: var(--color-emerald-700);\n}\n.contributions-grid[data-accent=\"green\"] {\n  --contribution-tier-1: var(--color-green-200); --contribution-tier-2: var(--color-green-400); --contribution-tier-3: var(--color-green-500); --contribution-tier-4: var(--color-green-600); --contribution-tier-5: var(--color-green-700);\n}\n.contributions-grid[data-accent=\"teal\"] {\n  --contribution-tier-1: var(--color-teal-200); --contribution-tier-2: var(--color-teal-400); --contribution-tier-3: var(--color-teal-500); --contribution-tier-4: var(--color-teal-600); --contribution-tier-5: var(--color-teal-700);\n}\n.contributions-grid[data-accent=\"cyan\"] {\n  --contribution-tier-1: var(--color-cyan-200); --contribution-tier-2: var(--color-cyan-400); --contribution-tier-3: var(--color-cyan-500); --contribution-tier-4: var(--color-cyan-600); --contribution-tier-5: var(--color-cyan-700);\n}\n.contributions-grid[data-accent=\"blue\"] {\n  --contribution-tier-1: var(--color-blue-200); --contribution-tier-2: var(--color-blue-400); --contribution-tier-3: var(--color-blue-500); --contribution-tier-4: var(--color-blue-600); --contribution-tier-5: var(--color-blue-700);\n}\n.contributions-grid[data-accent=\"indigo\"] {\n  --contribution-tier-1: var(--color-indigo-200); --contribution-tier-2: var(--color-indigo-400); --contribution-tier-3: var(--color-indigo-500); --contribution-tier-4: var(--color-indigo-600); --contribution-tier-5: var(--color-indigo-700);\n}\n.contributions-grid[data-accent=\"violet\"] {\n  --contribution-tier-1: var(--color-violet-200); --contribution-tier-2: var(--color-violet-400); --contribution-tier-3: var(--color-violet-500); --contribution-tier-4: var(--color-violet-600); --contribution-tier-5: var(--color-violet-700);\n}\n.contributions-grid[data-accent=\"rose\"] {\n  --contribution-tier-1: var(--color-rose-200); --contribution-tier-2: var(--color-rose-400); --contribution-tier-3: var(--color-rose-500); --contribution-tier-4: var(--color-rose-600); --contribution-tier-5: var(--color-rose-700);\n}\n.contributions-grid[data-accent=\"amber\"] {\n  --contribution-tier-1: var(--color-amber-200); --contribution-tier-2: var(--color-amber-400); --contribution-tier-3: var(--color-amber-500); --contribution-tier-4: var(--color-amber-600); --contribution-tier-5: var(--color-amber-700);\n}\n\n.dark .contributions-grid[data-accent=\"emerald\"] {\n  --contribution-tier-1: var(--color-emerald-950); --contribution-tier-2: var(--color-emerald-800); --contribution-tier-3: var(--color-emerald-700); --contribution-tier-4: var(--color-emerald-600); --contribution-tier-5: var(--color-emerald-500);\n}\n.dark .contributions-grid[data-accent=\"green\"] {\n  --contribution-tier-1: var(--color-green-950); --contribution-tier-2: var(--color-green-800); --contribution-tier-3: var(--color-green-700); --contribution-tier-4: var(--color-green-600); --contribution-tier-5: var(--color-green-500);\n}\n.dark .contributions-grid[data-accent=\"teal\"] {\n  --contribution-tier-1: var(--color-teal-950); --contribution-tier-2: var(--color-teal-800); --contribution-tier-3: var(--color-teal-700); --contribution-tier-4: var(--color-teal-600); --contribution-tier-5: var(--color-teal-500);\n}\n.dark .contributions-grid[data-accent=\"cyan\"] {\n  --contribution-tier-1: var(--color-cyan-950); --contribution-tier-2: var(--color-cyan-800); --contribution-tier-3: var(--color-cyan-700); --contribution-tier-4: var(--color-cyan-600); --contribution-tier-5: var(--color-cyan-500);\n}\n.dark .contributions-grid[data-accent=\"blue\"] {\n  --contribution-tier-1: var(--color-blue-950); --contribution-tier-2: var(--color-blue-800); --contribution-tier-3: var(--color-blue-700); --contribution-tier-4: var(--color-blue-600); --contribution-tier-5: var(--color-blue-500);\n}\n.dark .contributions-grid[data-accent=\"indigo\"] {\n  --contribution-tier-1: var(--color-indigo-950); --contribution-tier-2: var(--color-indigo-800); --contribution-tier-3: var(--color-indigo-700); --contribution-tier-4: var(--color-indigo-600); --contribution-tier-5: var(--color-indigo-500);\n}\n.dark .contributions-grid[data-accent=\"violet\"] {\n  --contribution-tier-1: var(--color-violet-950); --contribution-tier-2: var(--color-violet-800); --contribution-tier-3: var(--color-violet-700); --contribution-tier-4: var(--color-violet-600); --contribution-tier-5: var(--color-violet-500);\n}\n.dark .contributions-grid[data-accent=\"rose\"] {\n  --contribution-tier-1: var(--color-rose-950); --contribution-tier-2: var(--color-rose-800); --contribution-tier-3: var(--color-rose-700); --contribution-tier-4: var(--color-rose-600); --contribution-tier-5: var(--color-rose-500);\n}\n.dark .contributions-grid[data-accent=\"amber\"] {\n  --contribution-tier-1: var(--color-amber-950); --contribution-tier-2: var(--color-amber-800); --contribution-tier-3: var(--color-amber-700); --contribution-tier-4: var(--color-amber-600); --contribution-tier-5: var(--color-amber-500);\n}\n\n.contribution-cell[data-tier=\"0\"] { background-color: var(--contribution-tier-0); }\n.contribution-cell[data-tier=\"1\"] { background-color: var(--contribution-tier-1); }\n.contribution-cell[data-tier=\"2\"] { background-color: var(--contribution-tier-2); }\n.contribution-cell[data-tier=\"3\"] { background-color: var(--contribution-tier-3); }\n.contribution-cell[data-tier=\"4\"] { background-color: var(--contribution-tier-4); }\n.contribution-cell[data-tier=\"5\"] { background-color: var(--contribution-tier-5); }\n\n@keyframes cell-pop {\n  from {\n    opacity: 0;\n    transform: scale(0.5);\n  }\n  to {\n    opacity: 1;\n    transform: scale(1);\n  }\n}\n.animate-cell-pop {\n  animation: cell-pop 380ms ease-out both;\n}\n\n/* Bars grow up from the baseline; a per-bar delay staggers them left→right. */\n@keyframes bar-rise {\n  from {\n    transform: scaleY(0);\n  }\n  to {\n    transform: scaleY(1);\n  }\n}\n.animate-bar-rise {\n  transform-origin: bottom;\n  animation: bar-rise 360ms cubic-bezier(0.22, 1, 0.36, 1) both;\n}\n\n/* Line chart draws in left→right via a clip-path sweep over the whole plot\n * (line + gradient area together). */\n@keyframes chart-reveal {\n  from {\n    clip-path: inset(0 100% 0 0);\n  }\n  to {\n    clip-path: inset(0 0 0 0);\n  }\n}\n.animate-chart-reveal {\n  animation: chart-reveal 1800ms cubic-bezier(0.33, 0, 0.15, 1) both;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .animate-cell-pop,\n  .animate-bar-rise,\n  .animate-chart-reveal {\n    animation: none;\n  }\n}\n\n/* ---------------------------------------------------------------------------\n * Table primitive (components/base/table)\n *\n * React Aria's collection components (Column/Row/Cell/…) can't be wrapped in\n * custom components without losing collection behaviour, so the primitive\n * re-exports them untouched and styling lives here, scoped to `.bui-table`.\n * React Aria renders real <table>/<thead>/<th>/<tr>/<td> elements.\n * --------------------------------------------------------------------------- */\n.bui-table {\n  @apply w-full border-collapse text-start;\n}\n/* Header background + border-y live on the cells: with border-collapse the\n * browser doesn't paint backgrounds/borders set on the <thead> row group.\n * Backgrounds/borders are set with explicit CSS (theme vars) rather than\n * @apply, which drops border-width/bg on these row-group cells. */\n.bui-table th {\n  @apply px-3 py-2.5 text-start align-middle text-body-medium text-text-tertiary whitespace-nowrap outline-none;\n  background-color: var(--color-background-secondary-default);\n  border-top: 1px solid var(--color-separator-border);\n  border-bottom: 1px solid var(--color-separator-border);\n  transition: padding 200ms ease, font-size 200ms ease;\n}\n.bui-table td {\n  @apply px-3 py-2.5 align-middle text-body-medium text-text-primary outline-none;\n  transition: padding 200ms ease, font-size 200ms ease;\n}\n/* Separators sit *between* rows only: the trailing row's boundary is drawn by\n * whatever follows the table (the container's bottom edge, or the pagination\n * footer's own border-top), so a filtered-down table never doubles up lines. */\n.bui-table tbody tr:not(:last-child) {\n  border-bottom: 1px solid var(--color-separator-border);\n}\n.bui-table tbody tr {\n  @apply transition-colors duration-150;\n}\n.bui-table tbody tr[data-focus-visible] {\n  @apply ring-2 ring-inset ring-border-focus-ring;\n}\n.bui-table.bui-table-sm th,\n.bui-table.bui-table-sm td {\n  @apply px-2.5 py-1.5 text-body-2-medium;\n}\n\n/* Agent Thinking (components/application/agent-thinking): the agent thinking state\n * above a chat composer. The label reuses the ai-chat-text-shimmer travel;\n * its base/highlight both derive from the tone the component sets via\n * --bui-agent-thinking-tone, so every tone shimmers consistently. */\n.bui-agent-thinking-label {\n  color: transparent;\n  background-image: linear-gradient(\n    100deg,\n    color-mix(in oklab, var(--bui-agent-thinking-tone) 55%, transparent) 30%,\n    var(--bui-agent-thinking-tone) 50%,\n    color-mix(in oklab, var(--bui-agent-thinking-tone) 55%, transparent) 70%\n  );\n  background-position: 200% center;\n  background-size: 300% 100%;\n  background-clip: text;\n  -webkit-background-clip: text;\n  animation: ai-chat-text-shimmer 2.6s linear infinite;\n  will-change: background-position;\n}\n\n/* Star sparkle: scale + fade in, settle, and vanish; per-star duration and\n * stagger come in via inline animation-duration/-delay. */\n@keyframes bui-agent-thinking-star {\n  0%,\n  100% {\n    transform: scale(0);\n    opacity: 0;\n  }\n  40% {\n    transform: scale(1);\n    opacity: 1;\n  }\n  60% {\n    transform: scale(0.8);\n    opacity: 0.9;\n  }\n}\n\n.bui-agent-thinking-star {\n  transform: scale(0);\n  animation-name: bui-agent-thinking-star;\n  animation-timing-function: ease-in-out;\n  animation-iteration-count: infinite;\n}\n\n/* Infinity comet: the dash segment laps the normalized (pathLength=100)\n * figure-eight once per animation-duration. */\n@keyframes bui-agent-thinking-dash {\n  to {\n    stroke-dashoffset: -100;\n  }\n}\n\n.bui-agent-thinking-comet {\n  animation-name: bui-agent-thinking-dash;\n  animation-timing-function: linear;\n  animation-iteration-count: infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .bui-agent-thinking-label {\n    color: var(--bui-agent-thinking-tone);\n    background-image: none;\n    animation: none;\n  }\n\n  /* Stars rest visible instead of frozen at scale(0). */\n  .bui-agent-thinking-star {\n    animation: none;\n    transform: none;\n    opacity: 0.7;\n  }\n\n  .bui-agent-thinking-comet {\n    animation: none;\n  }\n}\n\n/* Star glyphs read a touch heavier than the dot grids on light backgrounds;\n * soften only them (not the label) there. Dark mode keeps the full tone. */\n.bui-agent-thinking-stars {\n  color: color-mix(in oklab, currentColor 75%, transparent);\n}\n\n.dark .bui-agent-thinking-stars {\n  color: inherit;\n}\n\n/* Composer Loader (components/application/composer-loader): the light band\n * orbiting the composer while the agent works. Dash segments on a\n * pathLength-normalized SVG stroke — the offset laps once per duration. */\n@keyframes bui-composer-loader-dash {\n  from {\n    stroke-dashoffset: 0;\n  }\n\n  to {\n    stroke-dashoffset: -100;\n  }\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .bui-composer-loader-rect {\n    animation: none !important;\n  }\n}\n\n/* Composer mic listening state (components/application/ai-chat): equalizer\n * bars dancing while voice input is active. Per-bar duration/delay come in\n * inline so the bars drift out of phase like real audio. */\n@keyframes bui-composer-mic-bars {\n  0%,\n  100% {\n    transform: scaleY(0.4);\n  }\n\n  50% {\n    transform: scaleY(1);\n  }\n}\n\n.bui-composer-mic-bar {\n  animation: bui-composer-mic-bars 0.9s ease-in-out infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .bui-composer-mic-bar {\n    animation: none;\n    transform: scaleY(0.7);\n  }\n}\n\n/* Shimmer sweep on a primary call to action (the Pro prompt card). */\n@keyframes bui-badge-shimmer {\n  0% {\n    transform: translateX(0) skewX(-12deg);\n  }\n  40%,\n  100% {\n    transform: translateX(350%) skewX(-12deg);\n  }\n}\n\n.bui-badge-shimmer {\n  animation: bui-badge-shimmer 2.5s ease-in-out infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .bui-badge-shimmer {\n      animation: none;\n      opacity: 0;\n    }\n}\n\n/* Showcase card (docs index, landing, the starter's catalogue). */\n.landing-showcase-card {\n  transition: box-shadow 280ms ease;\n}\n\n.landing-showcase-card::after {\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  z-index: 60;\n  pointer-events: none;\n  border: 1px solid var(--color-border-button-default);\n  border-radius: inherit;\n  transition:\n    border-color 280ms ease,\n    box-shadow 280ms ease;\n}\n\n.dark .landing-showcase-card::after {\n  border-color: rgb(255 255 255 / 0.08);\n}\n\n@media (min-width: 640px) and (hover: hover) {\n  .landing-showcase-card:hover::after,\n  .landing-showcase-card:focus-within::after {\n    border-color: var(--color-border-button-hover);\n    box-shadow: inset 0 0 0 2px var(--color-border-button-hover);\n  }\n}\n\n/* Preserve source desktop geometry while preventing fixed profile controls from covering mobile labels. */\n@media(max-width:639px){.bn-settings-profile .bn-settings-row{flex-direction:column;align-items:stretch;gap:8px}.bn-settings-profile .bn-settings-row>*{max-width:100%}.bn-settings-profile .bn-settings-row>button,.bn-settings-profile .bn-settings-row>div[data-rac]{width:100%}.bn-settings-profile .bn-settings-row>label{align-self:flex-start}}\n\n/* Fit all OTP slots inside narrow embedded examples without clipping later digits. */\n[data-input-otp] { max-width:100%; }\n[data-input-otp] > div { min-width:0; }\n[data-input-otp] input { max-width:100%; }\n\n/* Keep all notification category labels and their counts visible in phone cards. */\n@media(max-width:639px){\n [data-notification-center] [aria-label=\"Notification category\"]>button{min-width:0;padding-inline:3px;font-size:12px}\n [data-notification-center] [aria-label=\"Notification category\"]>button>span{gap:4px}\n [data-notification-center] [aria-label=\"Notification category\"]>button>span>span{min-width:16px;font-size:10px}\n}\n",
  "src/board-native/styles/theme.css": "/* ---------------------------------------------------------------------------\n * Helios UI theme tokens\n *\n * Layered as Tailwind v4 expects:\n *   @theme { ... }     primitives + ramp overrides → Tailwind utilities\n *   :root { ... }      semantic tokens (light mode) — reference primitives\n *   .dark { ... }      semantic overrides (dark mode) — landed when designed\n *   @theme inline {..} re-export of semantic tokens so they become utilities\n *\n * See docs/FIGMA_WORKFLOW.md for how tokens get added (Figma is source of truth).\n * --------------------------------------------------------------------------- */\n\n@theme {\n  /* ----- Color primitives ----------------------------------------------------\n   * Almost the entire palette matches Tailwind v4's OKLCH defaults. The four\n   * overrides below are the only intentional deviations (see Figma → variables\n   * → color/...).\n   * --------------------------------------------------------------------------*/\n  --color-slate-200:   #ebeff5;\n  --color-neutral-100: #f7f7f7;\n  --color-neutral-200: #ebebeb;\n  --color-neutral-925: #121212;\n  --color-blue-400:    #3392ff;\n\n  /* ----- Accent ramp ---------------------------------------------------------\n   * The CTA hue. Interactive/selection surfaces (primary button gradient,\n   * ghost + link buttons, checkbox, radio, switch, slider, tabs, sidebar\n   * selected, focus ring, date-range selection) reference accent-* instead of\n   * a raw hue, so the whole system re-tints by overriding these eleven\n   * variables at runtime (see components/application/theme/accent.ts) or in\n   * a customer project after importing this file. Defaults to the blue\n   * primitives above. Content/data blues (charts, status chips, calendar\n   * events, info notifications) deliberately keep referencing blue-*.\n   * --------------------------------------------------------------------------*/\n  --color-accent-50:  var(--color-blue-50);\n  --color-accent-100: var(--color-blue-100);\n  --color-accent-200: var(--color-blue-200);\n  --color-accent-300: var(--color-blue-300);\n  --color-accent-400: var(--color-blue-400);\n  --color-accent-500: var(--color-blue-500);\n  --color-accent-600: var(--color-blue-600);\n  --color-accent-700: var(--color-blue-700);\n  --color-accent-800: var(--color-blue-800);\n  --color-accent-900: var(--color-blue-900);\n  --color-accent-950: var(--color-blue-950);\n\n  /* ----- Typography ----------------------------------------------------------\n   * Font sizes, weights, line-heights, and tracking all match Tailwind v4\n   * defaults. The only override is the family: Inter, loaded via next/font\n   * in app/layout.tsx, which exposes --font-inter to the document.\n   * --------------------------------------------------------------------------*/\n  --font-sans: var(--font-inter), ui-sans-serif, system-ui, sans-serif,\n               \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\",\n               \"Noto Color Emoji\";\n\n  /* Monospace ramp for code blocks. Loaded via next/font in app/layout.tsx\n   * (--font-mono-source → JetBrains Mono). Figma's spec uses IBM Plex Mono;\n   * JetBrains Mono is the closest already-bundled face. */\n  --font-mono: var(--font-mono-source), ui-monospace, \"SFMono-Regular\", Menlo,\n               Consolas, \"Liberation Mono\", monospace;\n\n  /* ----- Radii ---------------------------------------------------------------\n   * Extra step between lg (8) and xl (12). Used by medium-size buttons.\n   * Figma name: radius/2lg.\n   * --------------------------------------------------------------------------*/\n  --radius-2lg: 10px;\n  /* Figma `radius/2,5xl`: kanban columns and other large inset panels. */\n  --radius-2-5xl: 20px;\n  --radius-notification-card: 10px;\n\n  /* ----- Shadows -------------------------------------------------------------\n   * 2xs, xs, 2xl and the inner shadows already match Tailwind v4. Sizes sm, md,\n   * lg, xl follow the Figma 6%/10% recipe (slightly softer than Tailwind v4's\n   * 10%/10% default).\n   * --------------------------------------------------------------------------*/\n  --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.06), 0 1px 3px 0 rgb(0 0 0 / 0.10);\n  --shadow-md: 0 2px 4px -1px rgb(0 0 0 / 0.06), 0 4px 6px -1px rgb(0 0 0 / 0.10);\n  --shadow-lg: 0 4px 6px -2px rgb(0 0 0 / 0.05), 0 10px 15px -3px rgb(0 0 0 / 0.10);\n  --shadow-xl: 0 10px 10px -5px rgb(0 0 0 / 0.04), 0 20px 25px -5px rgb(0 0 0 / 0.10);\n\n  /* Figma effect style \"Background/Sidebar Elevation\" — copied 1:1:\n   *   DROP_SHADOW #00000005 offset(0,1) radius 0  spread 0  → 0 1px 0px  0 / 0.0196\n   *   DROP_SHADOW #0000000F offset(0,1) radius 12 spread 0  → 0 1px 12px 0 / 0.0588\n   *   DROP_SHADOW #00000052 offset(0,0) radius 1  spread 0  → 0 0   1px  0 / 0.3216\n   * (alpha = hex byte / 255: 05→0.0196, 0F→0.0588, 52→0.3216). */\n  --shadow-sidebar:\n    0 1px 0 0 rgb(0 0 0 / 0.0196),\n    0 1px 12px 0 rgb(0 0 0 / 0.0588),\n    0 0 1px 0 rgb(0 0 0 / 0.3216);\n\n  /* Figma effect style \"Sidebar selected\" — copied 1:1:\n   *   DROP_SHADOW  color/blue/500 offset(0,0) radius 0 spread 1 → 0 0 0 1px blue-500\n   *   INNER_SHADOW #FFFFFF40       offset(0,1) radius 0 spread 0 → inset 0 1px 0 0 / 0.251\n   * (#FFFFFF40 alpha = 0x40/255 = 0.251). */\n  --shadow-nav-selected:\n    0 0 0 1px var(--color-accent-500),\n    inset 0 1px 0 0 rgb(255 255 255 / 0.251);\n\n  /* Checkbox checked/indeterminate surface (from the Figma Checkbox component):\n   * inner top highlight + 1px inner blue edge over the primary gradient. */\n  --shadow-checkbox-selected:\n    inset 0 2px 0 0 rgb(255 255 255 / 0.25),\n    inset 0 0 0 1px var(--color-accent-500);\n\n  /* 1px contact shadow used on white cards/dropdown triggers sitting on the\n   * secondary background (Figma drop shadow 0 1 1 5%). */\n  --shadow-card: 0 1px 1px 0 rgb(0 0 0 / 0.05);\n\n  /* Floating menu/dropdown panel (Figma → sidebar profile menu node 3823:3699):\n   *   DROP_SHADOW #0000000A offset(0,1) radius 1 → 0 1px 1px 0 / 0.04\n   *   DROP_SHADOW #00000005 offset(0,4) radius 4 → 0 4px 4px 0 / 0.02 */\n  --shadow-dropdown:\n    0 1px 1px 0 rgb(0 0 0 / 0.04),\n    0 4px 4px 0 rgb(0 0 0 / 0.02);\n\n  /* Floating template waitlist (Figma node 4117:32737). This extends the\n   * sidebar elevation recipe with the two broad ambient layers used by the\n   * signup surface. */\n  --shadow-waitlist:\n    0 0 6px 0 rgb(0 0 0 / 0.06),\n    0 0 64px 0 rgb(0 0 0 / 0.16),\n    0 0 1px 0 rgb(0 0 0 / 0.32),\n    0 1px 12px 0 rgb(0 0 0 / 0.06),\n    0 1px 0 0 rgb(0 0 0 / 0.02);\n\n  /* Inner shadows (Figma names inner-shadow/*; Tailwind utility prefix is\n   * inset-shadow-*).\n   */\n  --inset-shadow-2xs: inset 0 1px 0 0 rgb(0 0 0 / 0.05);\n  --inset-shadow-xs:  inset 0 1px 1px 0 rgb(0 0 0 / 0.05);\n  --inset-shadow-sm:  inset 0 2px 4px 0 rgb(0 0 0 / 0.05);\n}\n\n/* ---------------------------------------------------------------------------\n * Semantic tokens — light mode.\n *\n * All values reference primitives via var(--color-{family}-{shade}). Edit the\n * primitives in @theme above and these update automatically.\n *\n * Figma name on the left, var name on the right:\n *   foreground/full                  → --color-foreground-full\n *   foreground/icon/primary          → --color-foreground-icon-primary\n *   foreground/disabled              → --color-foreground-disabled\n *   foreground/disabled-danger       → --color-foreground-disabled-danger\n *   text/primary                     → --color-text-primary\n *   text/tertiary                    → --color-text-tertiary\n *   text/disabled-danger             → --color-text-disabled-danger\n *   background/primary/default       → --color-background-primary-default\n *   background/primary/hover         → --color-background-primary-hover\n *   background/primary/active        → --color-background-primary-active\n *   background/primary/disabled      → --color-background-primary-disabled\n *   background/secondary/default     → --color-background-secondary-default\n *   border/button/default            → --color-border-button-default\n *   border/button/hover              → --color-border-button-hover\n *   border/button/active             → --color-border-button-active\n *\n * Button gradients (linear, 180°, light stop → dark stop) sourced from the\n * blue/red primitives that each Button/{type}/{state} style references in\n * Figma. Direction inferred — confirm visually against Figma.\n * --------------------------------------------------------------------------- */\n:root {\n  /* Foreground (icons + on-fill content) */\n  --color-foreground-full:               var(--color-white);\n  --color-foreground-icon-primary:       var(--color-neutral-950);\n  --color-foreground-icon-hover:         var(--color-black);\n  --color-foreground-icon-secondary:     var(--color-neutral-500);\n  --color-foreground-icon-tertiary:      var(--color-neutral-400);\n  --color-foreground-icon-quaternary:    var(--color-neutral-300);\n  --color-foreground-icon-error:         var(--color-red-600);\n  --color-foreground-icon-disabled:      var(--color-neutral-300);\n  --color-foreground-disabled:           var(--color-neutral-400);\n  --color-foreground-disabled-danger:    var(--color-red-300);\n  --color-input-disabled-foreground:     var(--color-neutral-300);\n  --color-icon-button-disabled-foreground: var(--color-neutral-300);\n  --color-button-primary-disabled-foreground: var(--color-neutral-400);\n\n  /* Text */\n  --color-text-primary:         var(--color-neutral-950);\n  --color-text-secondary:       var(--color-neutral-500);\n  --color-text-tertiary:        var(--color-neutral-400);\n  --color-text-disabled:        var(--color-neutral-300);\n  --color-text-disabled-danger: var(--color-red-300);\n  --color-text-placeholder:     var(--color-neutral-400);\n  --color-text-error-primary:   var(--color-red-600);\n  --color-text-destructive: color-mix(in srgb, var(--color-red-700) 80%, var(--color-neutral-600));\n  --color-input-disabled-text:  var(--color-neutral-300);\n  --color-text-white:           var(--color-white);\n\n  /* Background */\n  --color-background-full:              var(--color-white);\n  /* Ticket detail, Figma 4509:12272. The raw #fafafa surface matches neutral/50. */\n  --color-ticket-detail-surface: var(--color-white);\n  --color-ticket-detail-low-background: var(--color-indigo-200);\n  --color-ticket-detail-low-hover: var(--color-indigo-300);\n  --color-ticket-detail-medium-hover: var(--color-yellow-300);\n  --color-ticket-detail-high-hover: var(--color-orange-300);\n  --color-ticket-detail-urgent-hover: var(--color-rose-300);\n  --color-ticket-detail-low-text: var(--color-indigo-800);\n  --color-ticket-detail-resource-background: var(--color-blue-100);\n  --color-ticket-detail-resource-text: var(--color-blue-600);\n  --color-ticket-detail-favorite: #ffb83c; /* raw Figma fill, no token yet */\n  /* Empty-state illustration: raw Figma fills from node 4488:11848. */\n  --color-project-board-empty-panel: rgb(242 242 242 / 0.8);\n  --color-project-board-empty-front: #d9d9d9;\n  --color-project-board-empty-middle: #e5e5e5;\n  --color-project-board-empty-back: #ededed;\n  --color-project-board-empty-detail: var(--color-white);\n  --color-background-primary-default:   var(--color-white);\n  --color-background-inner-default:     var(--color-white);\n  --color-background-primary-hover:     var(--color-neutral-100);\n  --color-background-primary-active:    var(--color-neutral-200);\n  --color-background-primary-disabled:  var(--color-neutral-100);\n  --color-input-disabled-background:    var(--color-neutral-100);\n  --color-background-secondary-default: var(--color-neutral-100);\n  --color-background-secondary-hover:   var(--color-neutral-200);\n  --color-background-tertiary-default:  var(--color-neutral-200);\n  --color-background-tertiary-hover:    var(--color-neutral-300);\n  --color-background-tertiary-error:    var(--color-red-100);\n  --color-background-recent-hire-role:  var(--color-neutral-100);\n  --color-avatar-neutral-background:    var(--color-neutral-300);\n  /* Figma background/quaternary/default — first used by the Storage\n   * dropzone's upload-icon disc (node 4106:26587). */\n  --color-background-quaternary-default: var(--color-neutral-300);\n  --color-background-quaternary-hover:   var(--color-neutral-400);\n  --color-background-quaternary-error:   var(--color-red-200);\n  --color-file-upload-icon-background:   var(--color-neutral-300);\n  --color-file-upload-icon-foreground:   var(--color-neutral-400);\n  --color-file-upload-icon-foreground-hover: var(--color-neutral-500);\n\n  /* Border */\n  --color-border-button-default:   var(--color-neutral-200);\n  --color-border-button-hover:     var(--color-neutral-300);\n  --color-border-button-active:    var(--color-neutral-400);\n  --color-border-button-white:     var(--color-white);\n  /* The system had no red border. Matches text/error/primary so an invalid\n     field's edge and its message are the same red. */\n  --color-border-error-default:    var(--color-red-500);\n  --color-border-checkbox-default: var(--color-neutral-300);\n  --color-border-checkbox-hover:   var(--color-neutral-400);\n  --color-border-checkbox-active:  var(--color-neutral-400);\n  --color-border-checkbox-white:   var(--color-white);\n  --color-border-component-detail-container: var(--color-neutral-200);\n  --color-border-ai-profile-card:             var(--color-neutral-200);\n  --color-border-table:            var(--color-neutral-200);\n  --color-border-button-group:     var(--color-neutral-200);\n  --color-border-sidebar-profile-hover: var(--color-neutral-300);\n  --color-separator-border:        var(--color-neutral-200);\n  --color-separator-border-strong: var(--color-neutral-200);\n  --color-border-focus-ring:       var(--color-accent-500);\n\n  /* State */\n  --color-state-success-text: var(--color-lime-800);\n  --color-state-success-base: var(--color-lime-200);\n\n  /* Selected control interiors remain light on colored tracks in both themes. */\n  --color-control-indicator-background:        var(--color-white);\n  --color-control-indicator-background-subtle: var(--color-neutral-100);\n  --color-switch-off-chip-start:                var(--color-white);\n  --color-switch-off-chip-end:                  var(--color-neutral-100);\n  /* Selected switch chip: the Figma comps use hexes a touch deeper than the\n   * plain 500→600 ramp (#2473fe → #0450e2 for blue). Expressed as oklab mixes\n   * of neighbouring accent stops so the recipe survives a re-tint. */\n  --color-switch-on-chip-start:                 color-mix(in oklab, var(--color-accent-500) 63%, var(--color-accent-600));\n  --color-switch-on-chip-end:                   color-mix(in oklab, var(--color-accent-600) 16%, var(--color-accent-700));\n  --color-stat-card-icon-background:            var(--color-white);\n  --color-segmented-control-background:          var(--color-neutral-100);\n  --color-segmented-control-selected-background: var(--color-white);\n  --color-theme-toggle-sidebar-background:       var(--color-neutral-200);\n  --color-theme-toggle-sidebar-selected-background: var(--color-white);\n  /* Stepped against the composer: the pill is white and the add button is the\n   * subtle grey sitting on it, so the control separates from the surface it\n   * shares an edge with. Dark mode keeps its own pair, where the pill is the\n   * lighter of the two and the button steps the other way. */\n  --color-ai-chat-composer-add-background:       var(--color-neutral-100);\n  --color-ai-chat-composer-add-hover-background: var(--color-neutral-200);\n  /* Composer Panel (Figma node 4430:12203): the status tab hanging off the\n   * card's top edge and the card's plus button are both neutral-200 in light\n   * mode. Dark mode steps them up instead, so they still separate from the\n   * neutral-800 card they touch. */\n  --color-composer-panel-tab-background:         var(--color-neutral-200);\n  --color-composer-panel-add-background:         var(--color-neutral-200);\n  --color-composer-panel-add-hover-background:   var(--color-neutral-300);\n  /* Attachment tile edge: the Figma neutral-200 in light mode; dark mode\n   * uses a translucent white so the ring reads on the neutral-800 card\n   * (border/button/default is one neutral step away there and vanishes). */\n  --color-composer-panel-tile-border:            var(--color-neutral-200);\n  /* Model picker provider rail: background/secondary in light mode, at\n   * half opacity in dark so it recedes on the neutral-800 panel. */\n  --color-composer-panel-rail-background:        var(--color-neutral-100);\n  /* Questionnaire (Figma nodes 4435:14749 / 4435:15042): the answer rows share\n   * the card's background/primary surface in both modes, separated by their\n   * border alone, and the \"Other\" row uses the stock Input untouched. The\n   * single-select number key is background/secondary in light mode and one\n   * tone lighter than the row in dark mode (never darker), stepping again\n   * while its row is hovered so it stays legible on the lifted fill. */\n  --color-questionnaire-key-background:          var(--color-neutral-100);\n  --color-questionnaire-key-hover-background:    var(--color-neutral-200);\n  --color-agent-progress-ring:                     var(--color-neutral-700);\n  --color-button-ghost-background:                var(--color-accent-100);\n  --color-button-ghost-hover:                     var(--color-accent-200);\n  --color-button-ghost-active:                    var(--color-accent-300);\n  --color-button-ghost-disabled:                  var(--color-accent-50);\n  --color-button-ghost-foreground:                var(--color-accent-700);\n  --color-button-ghost-disabled-foreground:       var(--color-accent-300);\n  --color-dropdown-item-hover-background:        var(--color-neutral-100);\n  --color-kbd-background:                        var(--color-neutral-300);\n  --color-kbd-foreground:                        var(--color-neutral-500);\n  --color-docs-file-chip-background:             var(--color-purple-50);\n  --color-docs-file-chip-border:                 var(--color-purple-100);\n  --color-docs-file-chip-foreground:             var(--color-purple-500);\n  --color-docs-command-accent:                    var(--color-purple-400);\n  --color-docs-code-background:                   var(--color-background-primary-default);\n  --color-docs-install-rail:                      var(--color-border-button-default);\n\n  /* Recently shipped component badge. Kept semantic so its compact blue\n   * surface can retain the same hierarchy in both themes. */\n  --color-badge-neutral-background: var(--color-neutral-200);\n  --color-team-menu-count-background: var(--color-neutral-200);\n  --color-team-menu-count-foreground: var(--color-neutral-500);\n  --color-badge-new-background: var(--color-accent-100);\n  --color-badge-new-text:       var(--color-accent-600);\n  --color-tab-count-selected-background: var(--color-accent-100);\n  --color-pill-tab-blue-selected-background: var(--color-accent-50);\n  --color-pill-tab-blue-hover-background: var(--color-neutral-100);\n\n  /* Notification status-icon surfaces. */\n  --color-notification-information-background: var(--color-blue-100);\n  --color-notification-information-foreground: var(--color-blue-600);\n  --color-notification-success-background:     var(--color-lime-100);\n  --color-notification-success-foreground:     var(--color-lime-600);\n  --color-notification-error-background:       var(--color-rose-100);\n  --color-notification-error-foreground:       var(--color-rose-600);\n  --color-notification-center-background:      var(--color-white);\n\n  /* Table status chips. Dark mappings come from the medical dashboard table\n   * in Figma (4139:7202, 4139:7240, 4139:7278, 4139:7315). */\n  --color-status-lime-background:   var(--color-lime-200);\n  --color-status-lime-text:         var(--color-lime-800);\n  --color-status-yellow-background: var(--color-yellow-200);\n  --color-status-yellow-text:       var(--color-yellow-800);\n  --color-status-rose-background:   var(--color-rose-200);\n  --color-status-rose-text:         var(--color-rose-800);\n  --color-status-cyan-background:   var(--color-cyan-200);\n  --color-status-cyan-text:         var(--color-cyan-800);\n  --color-status-orange-background: var(--color-orange-200);\n  --color-status-orange-text: var(--color-orange-800);\n  --color-status-blue-background:   var(--color-blue-200);\n  --color-status-blue-text:         var(--color-blue-800);\n  --color-status-purple-background: var(--color-purple-100);\n  --color-status-purple-text:       var(--color-purple-600);\n  --color-status-dot-green-halo:    var(--color-green-100);\n  --color-status-dot-yellow-halo:   var(--color-yellow-200);\n  --color-status-dot-indigo-halo:   var(--color-indigo-100);\n\n  /* Date range selection: the connecting band and its start/end caps. */\n  --color-date-range-background:      var(--color-accent-100);\n  --color-date-range-edge-background: var(--color-accent-300);\n\n  /* Calendar event chips. Title/time stay separate so the original light\n   * hierarchy remains intact while dark mode can normalize both to /300. */\n  --color-calendar-event-blue-background:    var(--color-blue-100);\n  --color-calendar-event-blue-title:         var(--color-blue-700);\n  --color-calendar-event-blue-time:          var(--color-blue-700);\n  --color-calendar-event-pink-background:    var(--color-pink-100);\n  --color-calendar-event-pink-title:         var(--color-pink-700);\n  --color-calendar-event-pink-time:          var(--color-pink-700);\n  --color-calendar-event-purple-background:  var(--color-purple-100);\n  --color-calendar-event-purple-title:       var(--color-purple-700);\n  --color-calendar-event-purple-time:        var(--color-purple-700);\n  --color-calendar-event-lime-background:    var(--color-lime-100);\n  --color-calendar-event-lime-title:         var(--color-lime-800);\n  --color-calendar-event-lime-time:          var(--color-lime-700);\n  --color-calendar-event-emerald-background: var(--color-emerald-100);\n  --color-calendar-event-emerald-title:      var(--color-emerald-800);\n  --color-calendar-event-emerald-time:       var(--color-emerald-700);\n\n  /* Placeholder colors that don't map cleanly to existing text tokens */\n  --color-text-error-placeholder: var(--color-red-400);\n\n  /* Charts (graphs) — shared neutrals + a categorical accent ramp.\n   * `track` is the background bar/ring behind a series; `cursor` the hover\n   * outline / dashed reference line; `neutral` a data color for \"other\"-style\n   * slices. Each numbered accent pairs a base fill with a one-tone-darker\n   * `-active` used for hover emphasis (the 400 → 500 recipe every chart\n   * follows). Numbered (not hue-named) so the palette can be retuned without\n   * renaming, mirroring the chart-1…n convention common to chart systems. */\n  --color-chart-track:    var(--color-neutral-200);\n  --color-chart-cursor:   var(--color-neutral-300);\n  --color-chart-neutral:  var(--color-neutral-300);\n  --color-chart-1:        var(--color-teal-400);\n  --color-chart-1-active: var(--color-teal-500);\n  --color-chart-2:        var(--color-lime-400);\n  --color-chart-2-active: var(--color-lime-500);\n  --color-chart-3:        var(--color-pink-400);\n  --color-chart-3-active: var(--color-pink-500);\n  --color-chart-4:        var(--color-sky-400);\n  --color-chart-4-active: var(--color-sky-500);\n  --color-chart-5:        var(--color-purple-400);\n  --color-chart-5-active: var(--color-purple-500);\n  --color-chart-6:        var(--color-blue-400);\n  --color-chart-6-active: var(--color-blue-500);\n  --color-chart-7:        var(--color-emerald-400);\n  --color-chart-7-active: var(--color-emerald-500);\n  --color-chart-8:        var(--color-yellow-400);\n  --color-chart-8-active: var(--color-yellow-500);\n  --color-chart-9:        var(--color-indigo-400);\n  --color-chart-9-active: var(--color-indigo-500);\n  --color-chart-agents-bar:        var(--color-purple-300);\n  --color-chart-agents-bar-active: var(--color-purple-400);\n\n  /* Button gradients */\n  --gradient-button-primary-default:  linear-gradient(180deg, var(--color-accent-500)    0%, var(--color-accent-600)    100%);\n  --gradient-button-primary-hover:    linear-gradient(180deg, var(--color-accent-400)    0%, var(--color-accent-500)    100%);\n  --gradient-button-primary-active:   linear-gradient(180deg, var(--color-accent-600)    0%, var(--color-accent-700)    100%);\n  --gradient-button-primary-disabled: linear-gradient(180deg, var(--color-neutral-200) 0%, var(--color-neutral-300) 100%);\n\n  --gradient-button-danger-default:   linear-gradient(180deg, var(--color-red-500) 0%, var(--color-red-600) 100%);\n  --gradient-button-danger-hover:     linear-gradient(180deg, var(--color-red-400) 0%, var(--color-red-500) 100%);\n  --gradient-button-danger-active:    linear-gradient(180deg, var(--color-red-600) 0%, var(--color-red-700) 100%);\n  --gradient-button-danger-disabled:  linear-gradient(180deg, var(--color-red-100) 0%, var(--color-red-200) 100%);\n}\n\n.dark {\n  /* Foreground */\n  --color-foreground-full:            var(--color-neutral-700);\n  --color-foreground-icon-primary:    var(--color-neutral-50);\n  --color-foreground-icon-hover:      var(--color-white);\n  --color-foreground-icon-error:      var(--color-red-400);\n  --color-foreground-icon-tertiary:   var(--color-neutral-600);\n  --color-foreground-icon-quaternary: var(--color-neutral-700);\n  --color-foreground-icon-disabled:   var(--color-neutral-800);\n  --color-foreground-disabled:        var(--color-neutral-700);\n  --color-foreground-disabled-danger: var(--color-red-400);\n  --color-input-disabled-foreground:  var(--color-neutral-600);\n  --color-icon-button-disabled-foreground: var(--color-neutral-500);\n  --color-button-primary-disabled-foreground: var(--color-neutral-500);\n\n  /* Text */\n  --color-text-primary:  var(--color-neutral-50);\n  --color-text-tertiary: var(--color-neutral-600);\n  --color-text-disabled: var(--color-neutral-800);\n  --color-text-error-primary: var(--color-red-400);\n  --color-text-destructive: color-mix(in srgb, var(--color-red-500) 80%, var(--color-neutral-500));\n  --color-input-disabled-text: color-mix(in srgb, var(--color-neutral-500) 40%, transparent);\n\n  /* Background */\n  --color-background-full:              var(--color-neutral-925);\n  --color-ticket-detail-surface: var(--color-neutral-925);\n  --color-ticket-detail-low-background: color-mix(in srgb, var(--color-indigo-950) 60%, transparent);\n  --color-ticket-detail-low-hover: color-mix(in srgb, var(--color-indigo-950) 80%, transparent);\n  --color-ticket-detail-medium-hover: color-mix(in srgb, var(--color-yellow-950) 80%, transparent);\n  --color-ticket-detail-high-hover: color-mix(in srgb, var(--color-orange-950) 80%, transparent);\n  --color-ticket-detail-urgent-hover: color-mix(in srgb, var(--color-rose-950) 80%, transparent);\n  --color-ticket-detail-low-text: var(--color-indigo-300);\n  --color-ticket-detail-resource-background: color-mix(in srgb, var(--color-blue-950) 60%, transparent);\n  --color-ticket-detail-resource-text: var(--color-blue-300);\n  --color-project-board-empty-panel: color-mix(in srgb, var(--color-neutral-800) 60%, transparent);\n  --color-project-board-empty-front: color-mix(in srgb, var(--color-neutral-800) 75%, var(--color-neutral-700));\n  --color-project-board-empty-middle: var(--color-neutral-700);\n  --color-project-board-empty-back: color-mix(in srgb, var(--color-neutral-600) 35%, var(--color-neutral-700));\n  --color-project-board-empty-detail: var(--color-neutral-500);\n  --color-background-primary-default:   var(--color-neutral-800);\n  --color-background-inner-default:     color-mix(in srgb, var(--color-neutral-800) 60%, transparent);\n  --color-background-primary-hover:     color-mix(in srgb, var(--color-neutral-700) 60%, transparent);\n  --color-background-primary-active:    var(--color-neutral-800);\n  --color-background-primary-disabled:  var(--color-neutral-800);\n  --color-input-disabled-background:    color-mix(in srgb, var(--color-neutral-800) 30%, transparent);\n  --color-switch-off-chip-start:        var(--color-background-tertiary-default);\n  --color-switch-off-chip-end:          var(--color-background-tertiary-default);\n  --color-background-secondary-default: var(--color-neutral-900);\n  --color-background-secondary-hover:   var(--color-neutral-800);\n  --color-background-tertiary-default:  var(--color-neutral-800);\n  --color-background-tertiary-hover:    var(--color-neutral-700);\n  --color-background-tertiary-error:    color-mix(in srgb, var(--color-red-950) 60%, transparent);\n  --color-background-quaternary-default: var(--color-neutral-700);\n  --color-background-quaternary-hover:   var(--color-neutral-600);\n  --color-background-recent-hire-role:  color-mix(in srgb, var(--color-neutral-900) 60%, transparent);\n  --color-avatar-neutral-background:    var(--color-background-primary-default);\n  --color-file-upload-icon-background:  var(--color-neutral-600);\n  --color-file-upload-icon-foreground:  var(--color-neutral-400);\n  --color-file-upload-icon-foreground-hover: var(--color-neutral-300);\n  --color-stat-card-icon-background:    var(--color-neutral-800);\n  --color-segmented-control-background:          var(--color-neutral-925);\n  --color-segmented-control-selected-background: var(--color-neutral-800);\n  --color-theme-toggle-sidebar-background:       var(--color-neutral-800);\n  --color-theme-toggle-sidebar-selected-background: var(--color-neutral-700);\n  --color-ai-chat-composer-add-background:       var(--color-neutral-700);\n  --color-ai-chat-composer-add-hover-background: var(--color-neutral-600);\n  --color-composer-panel-tab-background:         color-mix(in srgb, var(--color-neutral-700) 50%, transparent);\n  --color-composer-panel-add-background:         var(--color-neutral-700);\n  --color-composer-panel-add-hover-background:   var(--color-neutral-600);\n  --color-composer-panel-tile-border:            color-mix(in srgb, var(--color-white) 14%, transparent);\n  --color-composer-panel-rail-background:        color-mix(in srgb, var(--color-neutral-900) 50%, transparent);\n  --color-questionnaire-key-background:          var(--color-neutral-700);\n  --color-questionnaire-key-hover-background:    var(--color-neutral-600);\n  --color-agent-progress-ring:                     color-mix(in srgb, var(--color-white) 50%, transparent);\n  --color-button-ghost-background:                var(--color-accent-900);\n  --color-button-ghost-hover:                     var(--color-accent-800);\n  --color-button-ghost-active:                    var(--color-accent-700);\n  --color-button-ghost-disabled:                  var(--color-neutral-800);\n  --color-button-ghost-foreground:                var(--color-accent-300);\n  --color-button-ghost-disabled-foreground:       var(--color-neutral-600);\n  --color-dropdown-item-hover-background:        color-mix(in srgb, var(--color-neutral-700) 60%, transparent);\n  --color-kbd-background:                        var(--color-neutral-700);\n  --color-kbd-foreground:                        var(--color-neutral-400);\n  --color-docs-file-chip-background:             color-mix(in srgb, var(--color-purple-950) 50%, transparent);\n  --color-docs-file-chip-border:                 var(--color-purple-800);\n  --color-docs-file-chip-foreground:             var(--color-purple-400);\n  --color-docs-code-background:                  var(--color-background-full);\n  --color-docs-install-rail:                     color-mix(in srgb, var(--color-neutral-800) 60%, transparent);\n\n  /* Dark surfaces absorb low-alpha shadows more readily than white ones.\n   * Preserve the light-mode geometry and raise only the black alpha: tighter\n   * contact shadows stay crisp, while higher elevations receive a restrained\n   * ambient layer without introducing a grey glow. */\n  --shadow-2xs: 0 1px rgb(0 0 0 / 0.16);\n  --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.18);\n  --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.12), 0 1px 3px 0 rgb(0 0 0 / 0.16);\n  --shadow-md: 0 2px 4px -1px rgb(0 0 0 / 0.12), 0 4px 6px -1px rgb(0 0 0 / 0.18);\n  --shadow-lg: 0 4px 6px -2px rgb(0 0 0 / 0.10), 0 10px 15px -3px rgb(0 0 0 / 0.18);\n  --shadow-xl: 0 10px 10px -5px rgb(0 0 0 / 0.08), 0 20px 25px -5px rgb(0 0 0 / 0.20);\n  --shadow-card: 0 1px 1px 0 rgb(0 0 0 / 0.14);\n  --shadow-dropdown:\n    0 1px 1px 0 rgb(0 0 0 / 0.14),\n    0 4px 4px 0 rgb(0 0 0 / 0.10);\n  --shadow-sidebar:\n    0 1px 0 0 rgb(0 0 0 / 0.10),\n    0 1px 12px 0 rgb(0 0 0 / 0.16),\n    0 0 1px 0 rgb(0 0 0 / 0.42);\n  --shadow-waitlist:\n    0 0 6px 0 rgb(0 0 0 / 0.12),\n    0 0 64px 0 rgb(0 0 0 / 0.22),\n    0 0 1px 0 rgb(0 0 0 / 0.42),\n    0 1px 12px 0 rgb(0 0 0 / 0.14),\n    0 1px 0 0 rgb(0 0 0 / 0.08);\n\n  /* Badges */\n  --color-badge-neutral-background: var(--color-neutral-800);\n  --color-team-menu-count-background: var(--color-neutral-700);\n  --color-team-menu-count-foreground: var(--color-neutral-400);\n  --color-badge-new-background: var(--color-accent-950);\n  --color-badge-new-text:       var(--color-accent-400);\n  --color-tab-count-selected-background: color-mix(in srgb, var(--color-accent-800) 60%, transparent);\n\n  /* Dark status discs use /800 surfaces with /300 foregrounds so the icon\n   * remains crisp without reverting to a bright pastel circle. */\n  --color-notification-information-background: color-mix(in srgb, var(--color-blue-800) 50%, transparent);\n  --color-notification-information-foreground: var(--color-blue-300);\n  --color-notification-success-background:     color-mix(in srgb, var(--color-lime-800) 50%, transparent);\n  --color-notification-success-foreground:     var(--color-lime-300);\n  --color-notification-error-background:       color-mix(in srgb, var(--color-rose-800) 50%, transparent);\n  --color-notification-error-foreground:       var(--color-rose-300);\n  --color-notification-center-background:      var(--color-neutral-900);\n\n  /* Borders and separators */\n  --color-border-button-default:   var(--color-neutral-700);\n  --color-border-button-hover:     var(--color-neutral-500);\n  --color-border-button-active:    var(--color-neutral-600);\n  --color-border-button-white:     var(--color-zinc-800);\n  --color-border-error-default:    var(--color-red-400);\n  --color-border-checkbox-default: var(--color-neutral-700);\n  --color-border-checkbox-hover:   var(--color-neutral-500);\n  --color-border-checkbox-active:  var(--color-neutral-500);\n  --color-border-component-detail-container: var(--color-neutral-800);\n  --color-border-ai-profile-card:             var(--color-neutral-800);\n  --color-border-table:            var(--color-neutral-800);\n  --color-border-button-group:     color-mix(in srgb, var(--color-neutral-600) 60%, transparent);\n  --color-border-sidebar-profile-hover: var(--color-neutral-600);\n  --color-separator-border:        var(--color-neutral-800);\n  --color-separator-border-strong: color-mix(in srgb, var(--color-neutral-700) 60%, transparent);\n\n  /* Figma's dark table status pairs. */\n  --color-status-lime-background:   color-mix(in srgb, var(--color-lime-950) 60%, transparent);\n  --color-status-lime-text:         var(--color-lime-500);\n  --color-status-yellow-background: color-mix(in srgb, var(--color-yellow-950) 60%, transparent);\n  --color-status-yellow-text:       var(--color-yellow-500);\n  --color-status-rose-background:   color-mix(in srgb, var(--color-rose-950) 60%, transparent);\n  --color-status-rose-text:         var(--color-rose-500);\n  --color-status-cyan-background:   color-mix(in srgb, var(--color-cyan-950) 60%, transparent);\n  --color-status-cyan-text:         var(--color-cyan-400);\n  --color-status-orange-background: color-mix(in srgb, var(--color-orange-950) 60%, transparent);\n  --color-status-orange-text: var(--color-orange-500);\n  --color-status-blue-background:   color-mix(in srgb, var(--color-blue-950) 60%, transparent);\n  --color-status-blue-text:         var(--color-blue-300);\n  --color-status-purple-background: color-mix(in srgb, var(--color-purple-900) 50%, transparent);\n  --color-status-purple-text:       var(--color-purple-300);\n  --color-status-dot-green-halo:    color-mix(in srgb, var(--color-green-800) 40%, transparent);\n  --color-status-dot-yellow-halo:   color-mix(in srgb, var(--color-yellow-800) 40%, transparent);\n  --color-status-dot-indigo-halo:   color-mix(in srgb, var(--color-indigo-800) 40%, transparent);\n\n  --color-date-range-background:      var(--color-accent-950);\n  --color-date-range-edge-background: var(--color-accent-800);\n\n  --color-pill-tab-blue-selected-background: color-mix(in srgb, var(--color-accent-950) 60%, transparent);\n  --color-pill-tab-blue-hover-background: var(--color-neutral-800);\n\n  /* Calendar event families share the same dark-mode depth/contrast recipe. */\n  --color-calendar-event-blue-background:    var(--color-blue-950);\n  --color-calendar-event-blue-title:         var(--color-blue-300);\n  --color-calendar-event-blue-time:          var(--color-blue-300);\n  --color-calendar-event-pink-background:    var(--color-pink-950);\n  --color-calendar-event-pink-title:         var(--color-pink-300);\n  --color-calendar-event-pink-time:          var(--color-pink-300);\n  --color-calendar-event-purple-background:  var(--color-purple-950);\n  --color-calendar-event-purple-title:       var(--color-purple-300);\n  --color-calendar-event-purple-time:        var(--color-purple-300);\n  --color-calendar-event-lime-background:    var(--color-lime-950);\n  --color-calendar-event-lime-title:         var(--color-lime-300);\n  --color-calendar-event-lime-time:          var(--color-lime-300);\n  --color-calendar-event-emerald-background: var(--color-emerald-950);\n  --color-calendar-event-emerald-title:      var(--color-emerald-300);\n  --color-calendar-event-emerald-time:       var(--color-emerald-300);\n\n  /* Disabled primary CTA: dark, low-emphasis fill with readable muted text. */\n  --gradient-button-primary-disabled: linear-gradient(\n    180deg,\n    var(--color-neutral-700) 0%,\n    var(--color-neutral-800) 100%\n  );\n  --gradient-button-danger-disabled: linear-gradient(\n    180deg,\n    var(--color-red-900) 0%,\n    var(--color-red-950) 100%\n  );\n\n  /* Neutral graph structure; categorical and status colors stay unchanged. */\n  --color-chart-track:   var(--color-neutral-800);\n  --color-chart-cursor:  var(--color-neutral-700);\n  --color-chart-neutral: var(--color-neutral-800);\n  --color-chart-agents-bar:        var(--color-purple-500);\n  --color-chart-agents-bar-active: var(--color-purple-600);\n}\n\n/* Non-default accents (data-accent set by the accent engine) can land on a\n * /950 that glows too loudly against the dark sidebar; halve the NEW badge\n * fill there. Light mode keeps the solid /100 surface. */\n.dark[data-accent] {\n  --color-badge-new-background: color-mix(in srgb, var(--color-accent-950) 50%, transparent);\n}\n\n/* Re-export semantic tokens as Tailwind utilities. The `inline` form means\n * Tailwind reads the *current* computed value of the variable, so light↔dark\n * flips work without rebuild. */\n@theme inline {\n  --color-foreground-full:            var(--color-foreground-full);\n  --color-foreground-icon-primary:    var(--color-foreground-icon-primary);\n  --color-foreground-icon-hover:      var(--color-foreground-icon-hover);\n  --color-foreground-icon-secondary:  var(--color-foreground-icon-secondary);\n  --color-foreground-icon-tertiary:   var(--color-foreground-icon-tertiary);\n  --color-foreground-icon-quaternary: var(--color-foreground-icon-quaternary);\n  --color-foreground-icon-error:      var(--color-foreground-icon-error);\n  --color-foreground-icon-disabled:   var(--color-foreground-icon-disabled);\n  --color-foreground-disabled:        var(--color-foreground-disabled);\n  --color-foreground-disabled-danger: var(--color-foreground-disabled-danger);\n  --color-input-disabled-foreground:  var(--color-input-disabled-foreground);\n  --color-icon-button-disabled-foreground: var(--color-icon-button-disabled-foreground);\n  --color-button-primary-disabled-foreground: var(--color-button-primary-disabled-foreground);\n\n  --color-text-primary:         var(--color-text-primary);\n  --color-text-secondary:       var(--color-text-secondary);\n  --color-text-tertiary:        var(--color-text-tertiary);\n  --color-text-disabled:        var(--color-text-disabled);\n  --color-text-disabled-danger: var(--color-text-disabled-danger);\n  --color-text-placeholder:     var(--color-text-placeholder);\n  --color-text-error-primary:   var(--color-text-error-primary);\n  --color-text-destructive: var(--color-text-destructive);\n  --color-input-disabled-text:  var(--color-input-disabled-text);\n  --color-text-white:           var(--color-text-white);\n\n  --color-background-full:              var(--color-background-full);\n  --color-ticket-detail-surface: var(--color-ticket-detail-surface);\n  --color-ticket-detail-low-background: var(--color-ticket-detail-low-background);\n  --color-ticket-detail-low-hover: var(--color-ticket-detail-low-hover);\n  --color-ticket-detail-medium-hover: var(--color-ticket-detail-medium-hover);\n  --color-ticket-detail-high-hover: var(--color-ticket-detail-high-hover);\n  --color-ticket-detail-urgent-hover: var(--color-ticket-detail-urgent-hover);\n  --color-ticket-detail-low-text: var(--color-ticket-detail-low-text);\n  --color-ticket-detail-resource-background: var(--color-ticket-detail-resource-background);\n  --color-ticket-detail-resource-text: var(--color-ticket-detail-resource-text);\n  --color-ticket-detail-favorite: var(--color-ticket-detail-favorite);\n  --color-background-primary-default:   var(--color-background-primary-default);\n  --color-background-inner-default:     var(--color-background-inner-default);\n  --color-background-primary-hover:     var(--color-background-primary-hover);\n  --color-background-primary-active:    var(--color-background-primary-active);\n  --color-background-primary-disabled:  var(--color-background-primary-disabled);\n  --color-input-disabled-background:    var(--color-input-disabled-background);\n  --color-background-secondary-default: var(--color-background-secondary-default);\n  --color-background-secondary-hover:   var(--color-background-secondary-hover);\n  --color-background-tertiary-default:  var(--color-background-tertiary-default);\n  --color-background-tertiary-hover:    var(--color-background-tertiary-hover);\n  --color-background-tertiary-error:    var(--color-background-tertiary-error);\n  --color-background-recent-hire-role:  var(--color-background-recent-hire-role);\n  --color-avatar-neutral-background:    var(--color-avatar-neutral-background);\n  --color-background-quaternary-default: var(--color-background-quaternary-default);\n  --color-background-quaternary-hover:   var(--color-background-quaternary-hover);\n  --color-background-quaternary-error:   var(--color-background-quaternary-error);\n  --color-file-upload-icon-background:   var(--color-file-upload-icon-background);\n  --color-file-upload-icon-foreground:   var(--color-file-upload-icon-foreground);\n  --color-file-upload-icon-foreground-hover: var(--color-file-upload-icon-foreground-hover);\n\n  --color-border-button-default:   var(--color-border-button-default);\n  --color-border-button-hover:     var(--color-border-button-hover);\n  --color-border-button-active:    var(--color-border-button-active);\n  --color-border-button-white:     var(--color-border-button-white);\n  --color-border-error-default:    var(--color-border-error-default);\n  --color-border-checkbox-default: var(--color-border-checkbox-default);\n  --color-border-checkbox-hover:   var(--color-border-checkbox-hover);\n  --color-border-checkbox-active:  var(--color-border-checkbox-active);\n  --color-border-checkbox-white:   var(--color-border-checkbox-white);\n  --color-border-component-detail-container: var(--color-border-component-detail-container);\n  --color-border-ai-profile-card:             var(--color-border-ai-profile-card);\n  --color-border-table:            var(--color-border-table);\n  --color-border-button-group:     var(--color-border-button-group);\n  --color-border-sidebar-profile-hover: var(--color-border-sidebar-profile-hover);\n  --color-separator-border:        var(--color-separator-border);\n  --color-separator-border-strong: var(--color-separator-border-strong);\n  --color-border-focus-ring:       var(--color-border-focus-ring);\n\n  --color-state-success-text: var(--color-state-success-text);\n  --color-state-success-base: var(--color-state-success-base);\n  --color-control-indicator-background:        var(--color-control-indicator-background);\n  --color-control-indicator-background-subtle: var(--color-control-indicator-background-subtle);\n  --color-switch-off-chip-start:                var(--color-switch-off-chip-start);\n  --color-switch-off-chip-end:                  var(--color-switch-off-chip-end);\n  --color-switch-on-chip-start:                 var(--color-switch-on-chip-start);\n  --color-switch-on-chip-end:                   var(--color-switch-on-chip-end);\n  --color-stat-card-icon-background:            var(--color-stat-card-icon-background);\n  --color-segmented-control-background:          var(--color-segmented-control-background);\n  --color-segmented-control-selected-background: var(--color-segmented-control-selected-background);\n  --color-theme-toggle-sidebar-background:       var(--color-theme-toggle-sidebar-background);\n  --color-theme-toggle-sidebar-selected-background: var(--color-theme-toggle-sidebar-selected-background);\n  --color-ai-chat-composer-add-background:       var(--color-ai-chat-composer-add-background);\n  --color-ai-chat-composer-add-hover-background: var(--color-ai-chat-composer-add-hover-background);\n  --color-composer-panel-tab-background:         var(--color-composer-panel-tab-background);\n  --color-composer-panel-add-background:         var(--color-composer-panel-add-background);\n  --color-composer-panel-add-hover-background:   var(--color-composer-panel-add-hover-background);\n  --color-composer-panel-tile-border:            var(--color-composer-panel-tile-border);\n  --color-composer-panel-rail-background:        var(--color-composer-panel-rail-background);\n  --color-questionnaire-key-background:          var(--color-questionnaire-key-background);\n  --color-questionnaire-key-hover-background:    var(--color-questionnaire-key-hover-background);\n  --color-agent-progress-ring:                     var(--color-agent-progress-ring);\n  --color-button-ghost-background:                var(--color-button-ghost-background);\n  --color-button-ghost-hover:                     var(--color-button-ghost-hover);\n  --color-button-ghost-active:                    var(--color-button-ghost-active);\n  --color-button-ghost-disabled:                  var(--color-button-ghost-disabled);\n  --color-button-ghost-foreground:                var(--color-button-ghost-foreground);\n  --color-button-ghost-disabled-foreground:       var(--color-button-ghost-disabled-foreground);\n  --color-dropdown-item-hover-background:        var(--color-dropdown-item-hover-background);\n  --color-kbd-background:                        var(--color-kbd-background);\n  --color-kbd-foreground:                        var(--color-kbd-foreground);\n  --color-docs-file-chip-background:             var(--color-docs-file-chip-background);\n  --color-docs-file-chip-border:                 var(--color-docs-file-chip-border);\n  --color-docs-file-chip-foreground:             var(--color-docs-file-chip-foreground);\n  --color-docs-command-accent:                    var(--color-docs-command-accent);\n  --color-docs-code-background:                   var(--color-docs-code-background);\n  --color-docs-install-rail:                      var(--color-docs-install-rail);\n  --color-badge-neutral-background: var(--color-badge-neutral-background);\n  --color-team-menu-count-background: var(--color-team-menu-count-background);\n  --color-team-menu-count-foreground: var(--color-team-menu-count-foreground);\n  --color-badge-new-background: var(--color-badge-new-background);\n  --color-badge-new-text:       var(--color-badge-new-text);\n  --color-tab-count-selected-background: var(--color-tab-count-selected-background);\n  --color-pill-tab-blue-selected-background: var(--color-pill-tab-blue-selected-background);\n  --color-pill-tab-blue-hover-background: var(--color-pill-tab-blue-hover-background);\n  --color-notification-information-background: var(--color-notification-information-background);\n  --color-notification-information-foreground: var(--color-notification-information-foreground);\n  --color-notification-success-background:     var(--color-notification-success-background);\n  --color-notification-success-foreground:     var(--color-notification-success-foreground);\n  --color-notification-error-background:       var(--color-notification-error-background);\n  --color-notification-error-foreground:       var(--color-notification-error-foreground);\n  --color-notification-center-background:      var(--color-notification-center-background);\n  --color-status-lime-background:   var(--color-status-lime-background);\n  --color-status-lime-text:         var(--color-status-lime-text);\n  --color-status-yellow-background: var(--color-status-yellow-background);\n  --color-status-yellow-text:       var(--color-status-yellow-text);\n  --color-status-rose-background:   var(--color-status-rose-background);\n  --color-status-rose-text:         var(--color-status-rose-text);\n  --color-status-cyan-background:   var(--color-status-cyan-background);\n  --color-status-cyan-text:         var(--color-status-cyan-text);\n  --color-status-orange-background: var(--color-status-orange-background);\n  --color-status-orange-text: var(--color-status-orange-text);\n  --color-status-blue-background:   var(--color-status-blue-background);\n  --color-status-blue-text:         var(--color-status-blue-text);\n  --color-status-purple-background: var(--color-status-purple-background);\n  --color-status-purple-text:       var(--color-status-purple-text);\n  --color-status-dot-green-halo:    var(--color-status-dot-green-halo);\n  --color-status-dot-yellow-halo:   var(--color-status-dot-yellow-halo);\n  --color-status-dot-indigo-halo:   var(--color-status-dot-indigo-halo);\n  --color-date-range-background:      var(--color-date-range-background);\n  --color-date-range-edge-background: var(--color-date-range-edge-background);\n  --color-calendar-event-blue-background:    var(--color-calendar-event-blue-background);\n  --color-calendar-event-blue-title:         var(--color-calendar-event-blue-title);\n  --color-calendar-event-blue-time:          var(--color-calendar-event-blue-time);\n  --color-calendar-event-pink-background:    var(--color-calendar-event-pink-background);\n  --color-calendar-event-pink-title:         var(--color-calendar-event-pink-title);\n  --color-calendar-event-pink-time:          var(--color-calendar-event-pink-time);\n  --color-calendar-event-purple-background:  var(--color-calendar-event-purple-background);\n  --color-calendar-event-purple-title:       var(--color-calendar-event-purple-title);\n  --color-calendar-event-purple-time:        var(--color-calendar-event-purple-time);\n  --color-calendar-event-lime-background:    var(--color-calendar-event-lime-background);\n  --color-calendar-event-lime-title:         var(--color-calendar-event-lime-title);\n  --color-calendar-event-lime-time:          var(--color-calendar-event-lime-time);\n  --color-calendar-event-emerald-background: var(--color-calendar-event-emerald-background);\n  --color-calendar-event-emerald-title:      var(--color-calendar-event-emerald-title);\n  --color-calendar-event-emerald-time:       var(--color-calendar-event-emerald-time);\n\n  --color-text-error-placeholder: var(--color-text-error-placeholder);\n\n  --color-chart-track:    var(--color-chart-track);\n  --color-chart-cursor:   var(--color-chart-cursor);\n  --color-chart-neutral:  var(--color-chart-neutral);\n  --color-chart-1:        var(--color-chart-1);\n  --color-chart-1-active: var(--color-chart-1-active);\n  --color-chart-2:        var(--color-chart-2);\n  --color-chart-2-active: var(--color-chart-2-active);\n  --color-chart-3:        var(--color-chart-3);\n  --color-chart-3-active: var(--color-chart-3-active);\n  --color-chart-4:        var(--color-chart-4);\n  --color-chart-4-active: var(--color-chart-4-active);\n  --color-chart-5:        var(--color-chart-5);\n  --color-chart-5-active: var(--color-chart-5-active);\n  --color-chart-6:        var(--color-chart-6);\n  --color-chart-6-active: var(--color-chart-6-active);\n  --color-chart-7:        var(--color-chart-7);\n  --color-chart-7-active: var(--color-chart-7-active);\n  --color-chart-8:        var(--color-chart-8);\n  --color-chart-8-active: var(--color-chart-8-active);\n  --color-chart-9:        var(--color-chart-9);\n  --color-chart-9-active: var(--color-chart-9-active);\n  --color-chart-agents-bar:        var(--color-chart-agents-bar);\n  --color-chart-agents-bar-active: var(--color-chart-agents-bar-active);\n}\n\n/* ---------------------------------------------------------------------------\n * Component utilities — Buttons\n *\n * Each variant collapses the four interactive states (default / hover / active\n * / disabled) into a single class. Use them on the component:\n *\n *   <button class=\"bg-button-primary\">…</button>\n *   <button class=\"bg-button-danger\">…</button>\n *\n * Smooth default→hover transition trick:\n *   CSS can't interpolate `background-image`, so swapping gradients on :hover\n *   would snap. Instead we keep the *default* gradient on the element and\n *   layer the *hover* gradient on a `::before` pseudo-element whose opacity\n *   fades 0→1 over `--button-transition-ms`. Active/disabled gradients still\n *   swap instantly (we hide the pseudo to reveal them).\n *\n * Stacking: `isolation: isolate` keeps the pseudo behind the button's text\n * and icons (z-index -1) while staying above the element's own background.\n * `border-radius: inherit` + `overflow: hidden` keeps it within the rounded\n * corners.\n * --------------------------------------------------------------------------- */\n@theme {\n  --button-transition-ms: 150ms;\n  --input-transition-ms:  150ms;\n}\n\n/* Keep color feedback quick while the physical press motion remains soft.\n * The transform uses a shorter duration on press and the slower duration only\n * when returning to rest, so hover styles never inherit the 700ms timing. */\n@utility button-press-motion {\n  transition:\n    background-color var(--button-transition-ms) ease,\n    border-color var(--button-transition-ms) ease,\n    box-shadow var(--button-transition-ms) ease,\n    color var(--button-transition-ms) ease,\n    transform 420ms cubic-bezier(0.4, 0, 0.2, 1);\n\n  &:active:not(:disabled):not([aria-disabled=\"true\"]) {\n    transform: scale(0.98);\n    transition-duration: 150ms, 150ms, 150ms, 150ms, 220ms;\n  }\n\n  &:disabled,\n  &[aria-disabled=\"true\"] {\n    transform: none;\n  }\n\n  @media (prefers-reduced-motion: reduce) {\n    transition: none;\n    transform: none;\n  }\n}\n\n@utility bg-button-primary {\n  position: relative;\n  isolation: isolate;\n  background-image: var(--gradient-button-primary-default);\n\n  &::before {\n    content: \"\";\n    position: absolute;\n    inset: 0;\n    z-index: -1;\n    pointer-events: none;\n    border-radius: inherit;\n    background-image: var(--gradient-button-primary-hover);\n    opacity: 0;\n    transition: opacity var(--button-transition-ms) ease;\n  }\n  &:hover:not(:disabled):not([aria-disabled=\"true\"])::before {\n    opacity: 1;\n  }\n  &:active:not(:disabled):not([aria-disabled=\"true\"]) {\n    background-image: var(--gradient-button-primary-active);\n  }\n  &:active:not(:disabled):not([aria-disabled=\"true\"])::before {\n    opacity: 0;\n  }\n  &:disabled,\n  &[aria-disabled=\"true\"] {\n    background-image: var(--gradient-button-primary-disabled);\n  }\n  &:disabled::before,\n  &[aria-disabled=\"true\"]::before {\n    display: none;\n  }\n}\n\n@utility bg-button-danger {\n  position: relative;\n  isolation: isolate;\n  background-image: var(--gradient-button-danger-default);\n\n  &::before {\n    content: \"\";\n    position: absolute;\n    inset: 0;\n    z-index: -1;\n    pointer-events: none;\n    border-radius: inherit;\n    background-image: var(--gradient-button-danger-hover);\n    opacity: 0;\n    transition: opacity var(--button-transition-ms) ease;\n  }\n  &:hover:not(:disabled):not([aria-disabled=\"true\"])::before {\n    opacity: 1;\n  }\n  &:active:not(:disabled):not([aria-disabled=\"true\"]) {\n    background-image: var(--gradient-button-danger-active);\n  }\n  &:active:not(:disabled):not([aria-disabled=\"true\"])::before {\n    opacity: 0;\n  }\n  &:disabled,\n  &[aria-disabled=\"true\"] {\n    background-image: var(--gradient-button-danger-disabled);\n  }\n  &:disabled::before,\n  &[aria-disabled=\"true\"]::before {\n    display: none;\n  }\n}\n",
  "src/board-native/styles/typography.css": "/* ---------------------------------------------------------------------------\n * Helios UI typography\n *\n * Type ramp from Figma → text styles. Each style registers a Tailwind v4\n * text utility — `text-{name}` applies font-size + line-height + letter-spacing\n * + font-weight in one go.\n *\n * Family: Inter for the whole ramp. (The Figma export marks Large Title /\n * Regular as \"Inter Display\"; we map everything to Inter for consistency since\n * Inter ships a variable optical-size axis. Flag if a true Inter Display load\n * is needed.)\n *\n * Weight mapping (mirrors Figma variables — font/weight/*):\n *   Regular   = 400\n *   Medium    = 500\n *   Semibold  = 600  (Figma variable font/weight/semibold = 600)\n *   Bold      = 700\n *\n * Naming: `<family>-<weight>` in lowercase kebab — e.g. `text-body-medium`,\n * `text-title-1-semibold`, `text-caption-2-bold`.\n * --------------------------------------------------------------------------- */\n\n@theme {\n  /* ===== Large Title — 64 / 80 ============================================= */\n  --text-large-title-regular: 4rem;\n  --text-large-title-regular--line-height: 5rem;\n  --text-large-title-regular--letter-spacing: 0;\n  --text-large-title-regular--font-weight: 400;\n  --text-large-title-medium: 4rem;\n  --text-large-title-medium--line-height: 5rem;\n  --text-large-title-medium--letter-spacing: 0;\n  --text-large-title-medium--font-weight: 500;\n  --text-large-title-semibold: 4rem;\n  --text-large-title-semibold--line-height: 5rem;\n  --text-large-title-semibold--letter-spacing: 0;\n  --text-large-title-semibold--font-weight: 600;\n  --text-large-title-bold: 4rem;\n  --text-large-title-bold--line-height: 5rem;\n  --text-large-title-bold--letter-spacing: 0;\n  --text-large-title-bold--font-weight: 700;\n\n  /* ===== Display 1 — 56 / 72 =============================================== */\n  --text-display-1-regular: 3.5rem;\n  --text-display-1-regular--line-height: 4.5rem;\n  --text-display-1-regular--letter-spacing: 0;\n  --text-display-1-regular--font-weight: 400;\n  --text-display-1-medium: 3.5rem;\n  --text-display-1-medium--line-height: 4.5rem;\n  --text-display-1-medium--letter-spacing: 0;\n  --text-display-1-medium--font-weight: 500;\n  --text-display-1-semibold: 3.5rem;\n  --text-display-1-semibold--line-height: 4.5rem;\n  --text-display-1-semibold--letter-spacing: 0;\n  --text-display-1-semibold--font-weight: 600;\n  --text-display-1-bold: 3.5rem;\n  --text-display-1-bold--line-height: 4.5rem;\n  --text-display-1-bold--letter-spacing: 0;\n  --text-display-1-bold--font-weight: 700;\n\n  /* ===== Display 2 — 48 / 64 =============================================== */\n  --text-display-2-regular: 3rem;\n  --text-display-2-regular--line-height: 4rem;\n  --text-display-2-regular--letter-spacing: 0;\n  --text-display-2-regular--font-weight: 400;\n  --text-display-2-medium: 3rem;\n  --text-display-2-medium--line-height: 4rem;\n  --text-display-2-medium--letter-spacing: 0;\n  --text-display-2-medium--font-weight: 500;\n  --text-display-2-semibold: 3rem;\n  --text-display-2-semibold--line-height: 4rem;\n  --text-display-2-semibold--letter-spacing: 0;\n  --text-display-2-semibold--font-weight: 600;\n  --text-display-2-bold: 3rem;\n  --text-display-2-bold--line-height: 4rem;\n  --text-display-2-bold--letter-spacing: 0;\n  --text-display-2-bold--font-weight: 700;\n\n  /* ===== Display 3 — 40 / 54 =============================================== */\n  --text-display-3-regular: 2.5rem;\n  --text-display-3-regular--line-height: 3.375rem;\n  --text-display-3-regular--letter-spacing: 0;\n  --text-display-3-regular--font-weight: 400;\n  --text-display-3-medium: 2.5rem;\n  --text-display-3-medium--line-height: 3.375rem;\n  --text-display-3-medium--letter-spacing: 0;\n  --text-display-3-medium--font-weight: 500;\n  --text-display-3-semibold: 2.5rem;\n  --text-display-3-semibold--line-height: 3.375rem;\n  --text-display-3-semibold--letter-spacing: 0;\n  --text-display-3-semibold--font-weight: 600;\n  --text-display-3-bold: 2.5rem;\n  --text-display-3-bold--line-height: 3.375rem;\n  --text-display-3-bold--letter-spacing: 0;\n  --text-display-3-bold--font-weight: 700;\n\n  /* ===== Display 4 — 32 / 44 =============================================== */\n  --text-display-4-regular: 2rem;\n  --text-display-4-regular--line-height: 2.75rem;\n  --text-display-4-regular--letter-spacing: 0;\n  --text-display-4-regular--font-weight: 400;\n  --text-display-4-medium: 2rem;\n  --text-display-4-medium--line-height: 2.75rem;\n  --text-display-4-medium--letter-spacing: 0;\n  --text-display-4-medium--font-weight: 500;\n  --text-display-4-semibold: 2rem;\n  --text-display-4-semibold--line-height: 2.75rem;\n  --text-display-4-semibold--letter-spacing: 0;\n  --text-display-4-semibold--font-weight: 600;\n  --text-display-4-bold: 2rem;\n  --text-display-4-bold--line-height: 2.75rem;\n  --text-display-4-bold--letter-spacing: 0;\n  --text-display-4-bold--font-weight: 700;\n\n  /* ===== Title 1 — 24 / 34 ================================================= */\n  --text-title-1-regular: 1.5rem;\n  --text-title-1-regular--line-height: 2.125rem;\n  --text-title-1-regular--letter-spacing: 0;\n  --text-title-1-regular--font-weight: 400;\n  --text-title-1-medium: 1.5rem;\n  --text-title-1-medium--line-height: 2.125rem;\n  --text-title-1-medium--letter-spacing: 0;\n  --text-title-1-medium--font-weight: 500;\n  --text-title-1-semibold: 1.5rem;\n  --text-title-1-semibold--line-height: 2.125rem;\n  --text-title-1-semibold--letter-spacing: 0;\n  --text-title-1-semibold--font-weight: 600;\n  --text-title-1-bold: 1.5rem;\n  --text-title-1-bold--line-height: 2.125rem;\n  --text-title-1-bold--letter-spacing: 0;\n  --text-title-1-bold--font-weight: 700;\n\n  /* ===== Title 2 — 20 / 26 ================================================= */\n  --text-title-2-regular: 1.25rem;\n  --text-title-2-regular--line-height: 1.625rem;\n  --text-title-2-regular--letter-spacing: 0;\n  --text-title-2-regular--font-weight: 400;\n  --text-title-2-medium: 1.25rem;\n  --text-title-2-medium--line-height: 1.625rem;\n  --text-title-2-medium--letter-spacing: 0;\n  --text-title-2-medium--font-weight: 500;\n  --text-title-2-semibold: 1.25rem;\n  --text-title-2-semibold--line-height: 1.625rem;\n  --text-title-2-semibold--letter-spacing: 0;\n  --text-title-2-semibold--font-weight: 600;\n  --text-title-2-bold: 1.25rem;\n  --text-title-2-bold--line-height: 1.625rem;\n  --text-title-2-bold--letter-spacing: 0;\n  --text-title-2-bold--font-weight: 700;\n\n  /* ===== Title 3 — 18 / 24-26 ============================================== */\n  --text-title-3-regular: 1.125rem;\n  --text-title-3-regular--line-height: 1.5rem;     /* 24 per Figma */\n  --text-title-3-regular--letter-spacing: 0;\n  --text-title-3-regular--font-weight: 400;\n  --text-title-3-medium: 1.125rem;\n  --text-title-3-medium--line-height: 1.625rem;    /* 26 per Figma */\n  --text-title-3-medium--letter-spacing: 0;\n  --text-title-3-medium--font-weight: 500;\n  --text-title-3-semibold: 1.125rem;\n  --text-title-3-semibold--line-height: 1.625rem;\n  --text-title-3-semibold--letter-spacing: 0;\n  --text-title-3-semibold--font-weight: 600;\n  --text-title-3-bold: 1.125rem;\n  --text-title-3-bold--line-height: 1.625rem;\n  --text-title-3-bold--letter-spacing: 0;\n  --text-title-3-bold--font-weight: 700;\n\n  /* ===== Headline — 16 / 22 ================================================ */\n  --text-headline-regular: 1rem;\n  --text-headline-regular--line-height: 1.375rem;\n  --text-headline-regular--letter-spacing: 0;\n  --text-headline-regular--font-weight: 400;\n  --text-headline-medium: 1rem;\n  --text-headline-medium--line-height: 1.375rem;\n  --text-headline-medium--letter-spacing: 0;\n  --text-headline-medium--font-weight: 500;\n  --text-headline-semibold: 1rem;\n  --text-headline-semibold--line-height: 1.375rem;\n  --text-headline-semibold--letter-spacing: 0;\n  --text-headline-semibold--font-weight: 600;\n  --text-headline-bold: 1rem;\n  --text-headline-bold--line-height: 1.375rem;\n  --text-headline-bold--letter-spacing: 0;\n  --text-headline-bold--font-weight: 700;\n\n  /* ===== Body — 14 / 20 ==================================================== */\n  --text-body-regular: 0.875rem;\n  --text-body-regular--line-height: 1.25rem;\n  --text-body-regular--letter-spacing: 0;\n  --text-body-regular--font-weight: 400;\n  --text-body-medium: 0.875rem;\n  --text-body-medium--line-height: 1.25rem;\n  --text-body-medium--letter-spacing: 0;\n  --text-body-medium--font-weight: 500;\n  --text-body-semibold: 0.875rem;\n  --text-body-semibold--line-height: 1.25rem;\n  --text-body-semibold--letter-spacing: 0;\n  --text-body-semibold--font-weight: 600;\n  --text-body-bold: 0.875rem;\n  --text-body-bold--line-height: 1.25rem;\n  --text-body-bold--letter-spacing: 0;\n  --text-body-bold--font-weight: 700;\n\n  /* ===== Body 2 — 13 / 18 ================================================== */\n  --text-body-2-regular: 0.8125rem;\n  --text-body-2-regular--line-height: 1.125rem;\n  --text-body-2-regular--letter-spacing: 0;\n  --text-body-2-regular--font-weight: 400;\n  --text-body-2-medium: 0.8125rem;\n  --text-body-2-medium--line-height: 1.125rem;\n  --text-body-2-medium--letter-spacing: 0;\n  --text-body-2-medium--font-weight: 500;\n  --text-body-2-semibold: 0.8125rem;\n  --text-body-2-semibold--line-height: 1.125rem;\n  --text-body-2-semibold--letter-spacing: 0;\n  --text-body-2-semibold--font-weight: 600;\n  --text-body-2-bold: 0.8125rem;\n  --text-body-2-bold--line-height: 1.125rem;\n  --text-body-2-bold--letter-spacing: 0;\n  --text-body-2-bold--font-weight: 700;\n\n  /* ===== Caption 1 — 12 / 16 (tracking 0.15) =============================== */\n  --text-caption-1-regular: 0.75rem;\n  --text-caption-1-regular--line-height: 1rem;\n  --text-caption-1-regular--letter-spacing: 0.15px;\n  --text-caption-1-regular--font-weight: 400;\n  --text-caption-1-medium: 0.75rem;\n  --text-caption-1-medium--line-height: 1rem;\n  --text-caption-1-medium--letter-spacing: 0.15px;\n  --text-caption-1-medium--font-weight: 500;\n  --text-caption-1-semibold: 0.75rem;\n  --text-caption-1-semibold--line-height: 1rem;\n  --text-caption-1-semibold--letter-spacing: 0.15px;\n  --text-caption-1-semibold--font-weight: 600;\n  --text-caption-1-bold: 0.75rem;\n  --text-caption-1-bold--line-height: 1rem;\n  --text-caption-1-bold--letter-spacing: 0.15px;\n  --text-caption-1-bold--font-weight: 700;\n\n  /* ===== Caption 2 — 11 / 15 (tracking 0.2) ================================ */\n  --text-caption-2-regular: 0.6875rem;\n  --text-caption-2-regular--line-height: 0.9375rem;\n  --text-caption-2-regular--letter-spacing: 0.2px;\n  --text-caption-2-regular--font-weight: 400;\n  --text-caption-2-medium: 0.6875rem;\n  --text-caption-2-medium--line-height: 0.9375rem;\n  --text-caption-2-medium--letter-spacing: 0.2px;\n  --text-caption-2-medium--font-weight: 500;\n  --text-caption-2-semibold: 0.6875rem;\n  --text-caption-2-semibold--line-height: 0.9375rem;\n  --text-caption-2-semibold--letter-spacing: 0.2px;\n  --text-caption-2-semibold--font-weight: 600;\n  --text-caption-2-bold: 0.6875rem;\n  --text-caption-2-bold--line-height: 0.9375rem;\n  --text-caption-2-bold--letter-spacing: 0.2px;\n  --text-caption-2-bold--font-weight: 700;\n}\n",
  "src/board-native/utils/cx.ts": "import { extendTailwindMerge } from \"tailwind-merge\";\n\n/**\n * Text-style classes from styles/typography.css.\n *\n * IMPORTANT: every text-* utility we define via @theme (e.g. `text-body-medium`,\n * `text-title-1-semibold`) must be listed here. Otherwise tailwind-merge — which\n * has no view of our Tailwind theme — treats them as text-color utilities and\n * silently drops them when they appear in the same className as a real color\n * (`text-foreground-full`, `text-text-primary`, etc).\n *\n * If you add or rename a text style in typography.css, mirror the change here.\n */\nconst TEXT_FAMILIES = [\n  \"large-title\",\n  \"display-1\",\n  \"display-2\",\n  \"display-3\",\n  \"display-4\",\n  \"title-1\",\n  \"title-2\",\n  \"title-3\",\n  \"headline\",\n  \"body\",\n  \"body-2\",\n  \"caption-1\",\n  \"caption-2\",\n] as const;\n\nconst TEXT_WEIGHTS = [\"regular\", \"medium\", \"semibold\", \"bold\"] as const;\n\nconst TEXT_STYLE_SUFFIXES = TEXT_FAMILIES.flatMap((family) =>\n  TEXT_WEIGHTS.map((weight) => `${family}-${weight}`),\n);\n\nconst twMerge = extendTailwindMerge({\n  extend: {\n    classGroups: {\n      \"font-size\": [{ text: TEXT_STYLE_SUFFIXES }],\n    },\n  },\n});\n\n/**\n * Merge Tailwind classes safely. Last-write-wins on conflicting utilities.\n */\nexport const cx = twMerge;\n\n/**\n * Identity helper that gives the Tailwind IntelliSense extension a hook for\n * sorting classes inside style objects (the extension doesn't sort inside\n * plain object literals otherwise).\n */\nexport function sortCx<\n  T extends Record<\n    string,\n    string | number | Record<string, string | number | Record<string, string | number>>\n  >,\n>(classes: T): T {\n  return classes;\n}\n\n",
  "src/board-native/utils/directional-icon.ts": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\nimport {\n  RiArrowLeftLine,\n  RiArrowLeftSLine,\n  RiArrowRightLine,\n  RiArrowRightSLine,\n  RiSidebarFoldLine,\n  RiSidebarUnfoldLine,\n} from \"@remixicon/react\";\n\n/** Navigation glyphs mirror; logos, media controls and trend arrows do not. */\nconst directionalIcons: ReadonlySet<unknown> = new Set([\n  RiArrowLeftLine, RiArrowLeftSLine, RiArrowRightLine, RiArrowRightSLine,\n  RiSidebarFoldLine, RiSidebarUnfoldLine,\n]);\n\nexport function directionalIconClass(icon: unknown): string | undefined {\n  return directionalIcons.has(icon) ? \"rtl:rotate-180\" : undefined;\n}\n",
  "src/board-native/utils/scroll-direction.ts": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n/** Native horizontal scrolling starts at 0 in both directions. RTL offsets\n * become negative in modern browsers; return distance from inline-start.\n */\nexport function inlineScrollOffset(scrollLeft: number, direction: \"ltr\" | \"rtl\"): number {\n  return Math.max(0, direction === \"rtl\" ? -scrollLeft : scrollLeft);\n}\n\n/** Convert physical viewport geometry to the scroll offset that aligns a card.\n * Geometry stays physical, so variable widths and RTL need no offsetLeft math.\n */\nexport function scrollOffsetForItem(\n  track: { left: number; right: number; width: number },\n  item: { left: number; right: number; width: number },\n  scrollLeft: number,\n  direction: \"ltr\" | \"rtl\",\n  align: \"start\" | \"center\" = \"start\",\n): number {\n  if (align === \"center\") return scrollLeft + (item.left + item.right - track.left - track.right) / 2;\n  return scrollLeft + (direction === \"rtl\" ? item.right - track.right : item.left - track.left);\n}\n",
  "src/board-native/utils/use-dismiss-on-outside-press.ts": "/* Adapted from BoardUI public registry. MIT — see board-native/LICENSE. */\n\"use client\";\n\nimport { useEffect, useRef } from \"react\";\nimport type { RefObject } from \"react\";\n\n/**\n * React Aria's `Popover` couples \"non-modal\" with \"not dismissable on\n * outside interaction\" — `isNonModal` (which we set to avoid the scroll\n * lock / focus trap that comes with a modal popover) also silently disables\n * its built-in outside-click-to-close behavior. This restores just that\n * piece manually: closes when a pointerdown lands outside every given ref\n * (typically the trigger + the popover's own content).\n */\nexport function useDismissOnOutsidePress(\n  isOpen: boolean,\n  onDismiss: () => void,\n  refs: RefObject<HTMLElement | null>[],\n) {\n  useEffect(() => {\n    if (!isOpen) return;\n\n    const handlePointerDown = (event: PointerEvent) => {\n      const target = event.target as Node;\n      if (refs.some((ref) => ref.current?.contains(target))) return;\n      onDismiss();\n    };\n\n    document.addEventListener(\"pointerdown\", handlePointerDown, true);\n    return () => document.removeEventListener(\"pointerdown\", handlePointerDown, true);\n  }, [isOpen, onDismiss, refs]);\n}\n\n/**\n * Companion fix for the same `isNonModal` popovers: pressing the trigger\n * while the popover is open should close it (toggle), but React Aria fires\n * `onOpenChange(false)` immediately followed by `onOpenChange(true)` within\n * the same press, so the popover never actually closes.\n *\n * This watches for a pointerdown on the trigger while open and swallows the\n * spurious reopen that follows. Wire the returned guard into the component's\n * `onOpenChange`:\n *\n *   const allowOpenChange = useTriggerToggle(isOpen, triggerRef);\n *   <AriaSelect onOpenChange={(o) => allowOpenChange(o) && setIsOpen(o)} …\n */\nexport function useTriggerToggle(\n  isOpen: boolean,\n  triggerRef: RefObject<HTMLElement | null>,\n) {\n  const suppressReopenRef = useRef(false);\n\n  useEffect(() => {\n    if (!isOpen) return;\n\n    const handlePointerDown = (event: PointerEvent) => {\n      if (!triggerRef.current?.contains(event.target as Node)) return;\n      suppressReopenRef.current = true;\n      // Safety valve: only the very next open within this click may be\n      // swallowed; never leave a stale suppression behind.\n      setTimeout(() => {\n        suppressReopenRef.current = false;\n      }, 400);\n    };\n\n    document.addEventListener(\"pointerdown\", handlePointerDown, true);\n    return () => document.removeEventListener(\"pointerdown\", handlePointerDown, true);\n  }, [isOpen, triggerRef]);\n\n  return (next: boolean) => {\n    if (next && suppressReopenRef.current) {\n      suppressReopenRef.current = false;\n      return false;\n    }\n    return true;\n  };\n}\n",
  "src/board-palette.css": "/* Generated by scripts/generate-board-palette.mjs. Do not edit by hand.\n * BoardUI MIT theme blob 4db0e69ab60fcd7fadb843fe10d601e627460302; Tailwind CSS v4 MIT primitives.\n * Exact audited declarations; inherited dark roles remain inherited. Figma is unchanged. */\n:root {\n  --color-red-50: oklch(97.1% 0.013 17.38);\n  --color-red-100: oklch(93.6% 0.032 17.717);\n  --color-red-200: oklch(88.5% 0.062 18.334);\n  --color-red-300: oklch(80.8% 0.114 19.571);\n  --color-red-400: oklch(70.4% 0.191 22.216);\n  --color-red-500: oklch(63.7% 0.237 25.331);\n  --color-red-600: oklch(57.7% 0.245 27.325);\n  --color-red-700: oklch(50.5% 0.213 27.518);\n  --color-red-800: oklch(44.4% 0.177 26.899);\n  --color-red-900: oklch(39.6% 0.141 25.723);\n  --color-red-950: oklch(25.8% 0.092 26.042);\n  --color-orange-50: oklch(98% 0.016 73.684);\n  --color-orange-100: oklch(95.4% 0.038 75.164);\n  --color-orange-200: oklch(90.1% 0.076 70.697);\n  --color-orange-300: oklch(83.7% 0.128 66.29);\n  --color-orange-400: oklch(75% 0.183 55.934);\n  --color-orange-500: oklch(70.5% 0.213 47.604);\n  --color-orange-600: oklch(64.6% 0.222 41.116);\n  --color-orange-700: oklch(55.3% 0.195 38.402);\n  --color-orange-800: oklch(47% 0.157 37.304);\n  --color-orange-900: oklch(40.8% 0.123 38.172);\n  --color-orange-950: oklch(26.6% 0.079 36.259);\n  --color-amber-50: oklch(98.7% 0.022 95.277);\n  --color-amber-100: oklch(96.2% 0.059 95.617);\n  --color-amber-200: oklch(92.4% 0.12 95.746);\n  --color-amber-300: oklch(87.9% 0.169 91.605);\n  --color-amber-400: oklch(82.8% 0.189 84.429);\n  --color-amber-500: oklch(76.9% 0.188 70.08);\n  --color-amber-600: oklch(66.6% 0.179 58.318);\n  --color-amber-700: oklch(55.5% 0.163 48.998);\n  --color-amber-800: oklch(47.3% 0.137 46.201);\n  --color-amber-900: oklch(41.4% 0.112 45.904);\n  --color-amber-950: oklch(27.9% 0.077 45.635);\n  --color-yellow-50: oklch(98.7% 0.026 102.212);\n  --color-yellow-100: oklch(97.3% 0.071 103.193);\n  --color-yellow-200: oklch(94.5% 0.129 101.54);\n  --color-yellow-300: oklch(90.5% 0.182 98.111);\n  --color-yellow-400: oklch(85.2% 0.199 91.936);\n  --color-yellow-500: oklch(79.5% 0.184 86.047);\n  --color-yellow-600: oklch(68.1% 0.162 75.834);\n  --color-yellow-700: oklch(55.4% 0.135 66.442);\n  --color-yellow-800: oklch(47.6% 0.114 61.907);\n  --color-yellow-900: oklch(42.1% 0.095 57.708);\n  --color-yellow-950: oklch(28.6% 0.066 53.813);\n  --color-lime-50: oklch(98.6% 0.031 120.757);\n  --color-lime-100: oklch(96.7% 0.067 122.328);\n  --color-lime-200: oklch(93.8% 0.127 124.321);\n  --color-lime-300: oklch(89.7% 0.196 126.665);\n  --color-lime-400: oklch(84.1% 0.238 128.85);\n  --color-lime-500: oklch(76.8% 0.233 130.85);\n  --color-lime-600: oklch(64.8% 0.2 131.684);\n  --color-lime-700: oklch(53.2% 0.157 131.589);\n  --color-lime-800: oklch(45.3% 0.124 130.933);\n  --color-lime-900: oklch(40.5% 0.101 131.063);\n  --color-lime-950: oklch(27.4% 0.072 132.109);\n  --color-green-50: oklch(98.2% 0.018 155.826);\n  --color-green-100: oklch(96.2% 0.044 156.743);\n  --color-green-200: oklch(92.5% 0.084 155.995);\n  --color-green-300: oklch(87.1% 0.15 154.449);\n  --color-green-400: oklch(79.2% 0.209 151.711);\n  --color-green-500: oklch(72.3% 0.219 149.579);\n  --color-green-600: oklch(62.7% 0.194 149.214);\n  --color-green-700: oklch(52.7% 0.154 150.069);\n  --color-green-800: oklch(44.8% 0.119 151.328);\n  --color-green-900: oklch(39.3% 0.095 152.535);\n  --color-green-950: oklch(26.6% 0.065 152.934);\n  --color-emerald-50: oklch(97.9% 0.021 166.113);\n  --color-emerald-100: oklch(95% 0.052 163.051);\n  --color-emerald-200: oklch(90.5% 0.093 164.15);\n  --color-emerald-300: oklch(84.5% 0.143 164.978);\n  --color-emerald-400: oklch(76.5% 0.177 163.223);\n  --color-emerald-500: oklch(69.6% 0.17 162.48);\n  --color-emerald-600: oklch(59.6% 0.145 163.225);\n  --color-emerald-700: oklch(50.8% 0.118 165.612);\n  --color-emerald-800: oklch(43.2% 0.095 166.913);\n  --color-emerald-900: oklch(37.8% 0.077 168.94);\n  --color-emerald-950: oklch(26.2% 0.051 172.552);\n  --color-teal-50: oklch(98.4% 0.014 180.72);\n  --color-teal-100: oklch(95.3% 0.051 180.801);\n  --color-teal-200: oklch(91% 0.096 180.426);\n  --color-teal-300: oklch(85.5% 0.138 181.071);\n  --color-teal-400: oklch(77.7% 0.152 181.912);\n  --color-teal-500: oklch(70.4% 0.14 182.503);\n  --color-teal-600: oklch(60% 0.118 184.704);\n  --color-teal-700: oklch(51.1% 0.096 186.391);\n  --color-teal-800: oklch(43.7% 0.078 188.216);\n  --color-teal-900: oklch(38.6% 0.063 188.416);\n  --color-teal-950: oklch(27.7% 0.046 192.524);\n  --color-cyan-50: oklch(98.4% 0.019 200.873);\n  --color-cyan-100: oklch(95.6% 0.045 203.388);\n  --color-cyan-200: oklch(91.7% 0.08 205.041);\n  --color-cyan-300: oklch(86.5% 0.127 207.078);\n  --color-cyan-400: oklch(78.9% 0.154 211.53);\n  --color-cyan-500: oklch(71.5% 0.143 215.221);\n  --color-cyan-600: oklch(60.9% 0.126 221.723);\n  --color-cyan-700: oklch(52% 0.105 223.128);\n  --color-cyan-800: oklch(45% 0.085 224.283);\n  --color-cyan-900: oklch(39.8% 0.07 227.392);\n  --color-cyan-950: oklch(30.2% 0.056 229.695);\n  --color-sky-50: oklch(97.7% 0.013 236.62);\n  --color-sky-100: oklch(95.1% 0.026 236.824);\n  --color-sky-200: oklch(90.1% 0.058 230.902);\n  --color-sky-300: oklch(82.8% 0.111 230.318);\n  --color-sky-400: oklch(74.6% 0.16 232.661);\n  --color-sky-500: oklch(68.5% 0.169 237.323);\n  --color-sky-600: oklch(58.8% 0.158 241.966);\n  --color-sky-700: oklch(50% 0.134 242.749);\n  --color-sky-800: oklch(44.3% 0.11 240.79);\n  --color-sky-900: oklch(39.1% 0.09 240.876);\n  --color-sky-950: oklch(29.3% 0.066 243.157);\n  --color-blue-50: oklch(97% 0.014 254.604);\n  --color-blue-100: oklch(93.2% 0.032 255.585);\n  --color-blue-200: oklch(88.2% 0.059 254.128);\n  --color-blue-300: oklch(80.9% 0.105 251.813);\n  --color-blue-400: #3392ff;\n  --color-blue-500: oklch(62.3% 0.214 259.815);\n  --color-blue-600: oklch(54.6% 0.245 262.881);\n  --color-blue-700: oklch(48.8% 0.243 264.376);\n  --color-blue-800: oklch(42.4% 0.199 265.638);\n  --color-blue-900: oklch(37.9% 0.146 265.522);\n  --color-blue-950: oklch(28.2% 0.091 267.935);\n  --color-indigo-50: oklch(96.2% 0.018 272.314);\n  --color-indigo-100: oklch(93% 0.034 272.788);\n  --color-indigo-200: oklch(87% 0.065 274.039);\n  --color-indigo-300: oklch(78.5% 0.115 274.713);\n  --color-indigo-400: oklch(67.3% 0.182 276.935);\n  --color-indigo-500: oklch(58.5% 0.233 277.117);\n  --color-indigo-600: oklch(51.1% 0.262 276.966);\n  --color-indigo-700: oklch(45.7% 0.24 277.023);\n  --color-indigo-800: oklch(39.8% 0.195 277.366);\n  --color-indigo-900: oklch(35.9% 0.144 278.697);\n  --color-indigo-950: oklch(25.7% 0.09 281.288);\n  --color-violet-50: oklch(96.9% 0.016 293.756);\n  --color-violet-100: oklch(94.3% 0.029 294.588);\n  --color-violet-200: oklch(89.4% 0.057 293.283);\n  --color-violet-300: oklch(81.1% 0.111 293.571);\n  --color-violet-400: oklch(70.2% 0.183 293.541);\n  --color-violet-500: oklch(60.6% 0.25 292.717);\n  --color-violet-600: oklch(54.1% 0.281 293.009);\n  --color-violet-700: oklch(49.1% 0.27 292.581);\n  --color-violet-800: oklch(43.2% 0.232 292.759);\n  --color-violet-900: oklch(38% 0.189 293.745);\n  --color-violet-950: oklch(28.3% 0.141 291.089);\n  --color-purple-50: oklch(97.7% 0.014 308.299);\n  --color-purple-100: oklch(94.6% 0.033 307.174);\n  --color-purple-200: oklch(90.2% 0.063 306.703);\n  --color-purple-300: oklch(82.7% 0.119 306.383);\n  --color-purple-400: oklch(71.4% 0.203 305.504);\n  --color-purple-500: oklch(62.7% 0.265 303.9);\n  --color-purple-600: oklch(55.8% 0.288 302.321);\n  --color-purple-700: oklch(49.6% 0.265 301.924);\n  --color-purple-800: oklch(43.8% 0.218 303.724);\n  --color-purple-900: oklch(38.1% 0.176 304.987);\n  --color-purple-950: oklch(29.1% 0.149 302.717);\n  --color-fuchsia-50: oklch(97.7% 0.017 320.058);\n  --color-fuchsia-100: oklch(95.2% 0.037 318.852);\n  --color-fuchsia-200: oklch(90.3% 0.076 319.62);\n  --color-fuchsia-300: oklch(83.3% 0.145 321.434);\n  --color-fuchsia-400: oklch(74% 0.238 322.16);\n  --color-fuchsia-500: oklch(66.7% 0.295 322.15);\n  --color-fuchsia-600: oklch(59.1% 0.293 322.896);\n  --color-fuchsia-700: oklch(51.8% 0.253 323.949);\n  --color-fuchsia-800: oklch(45.2% 0.211 324.591);\n  --color-fuchsia-900: oklch(40.1% 0.17 325.612);\n  --color-fuchsia-950: oklch(29.3% 0.136 325.661);\n  --color-pink-50: oklch(97.1% 0.014 343.198);\n  --color-pink-100: oklch(94.8% 0.028 342.258);\n  --color-pink-200: oklch(89.9% 0.061 343.231);\n  --color-pink-300: oklch(82.3% 0.12 346.018);\n  --color-pink-400: oklch(71.8% 0.202 349.761);\n  --color-pink-500: oklch(65.6% 0.241 354.308);\n  --color-pink-600: oklch(59.2% 0.249 0.584);\n  --color-pink-700: oklch(52.5% 0.223 3.958);\n  --color-pink-800: oklch(45.9% 0.187 3.815);\n  --color-pink-900: oklch(40.8% 0.153 2.432);\n  --color-pink-950: oklch(28.4% 0.109 3.907);\n  --color-rose-50: oklch(96.9% 0.015 12.422);\n  --color-rose-100: oklch(94.1% 0.03 12.58);\n  --color-rose-200: oklch(89.2% 0.058 10.001);\n  --color-rose-300: oklch(81% 0.117 11.638);\n  --color-rose-400: oklch(71.2% 0.194 13.428);\n  --color-rose-500: oklch(64.5% 0.246 16.439);\n  --color-rose-600: oklch(58.6% 0.253 17.585);\n  --color-rose-700: oklch(51.4% 0.222 16.935);\n  --color-rose-800: oklch(45.5% 0.188 13.697);\n  --color-rose-900: oklch(41% 0.159 10.272);\n  --color-rose-950: oklch(27.1% 0.105 12.094);\n  --color-slate-50: oklch(98.4% 0.003 247.858);\n  --color-slate-100: oklch(96.8% 0.007 247.896);\n  --color-slate-200: #ebeff5;\n  --color-slate-300: oklch(86.9% 0.022 252.894);\n  --color-slate-400: oklch(70.4% 0.04 256.788);\n  --color-slate-500: oklch(55.4% 0.046 257.417);\n  --color-slate-600: oklch(44.6% 0.043 257.281);\n  --color-slate-700: oklch(37.2% 0.044 257.287);\n  --color-slate-800: oklch(27.9% 0.041 260.031);\n  --color-slate-900: oklch(20.8% 0.042 265.755);\n  --color-slate-950: oklch(12.9% 0.042 264.695);\n  --color-gray-50: oklch(98.5% 0.002 247.839);\n  --color-gray-100: oklch(96.7% 0.003 264.542);\n  --color-gray-200: oklch(92.8% 0.006 264.531);\n  --color-gray-300: oklch(87.2% 0.01 258.338);\n  --color-gray-400: oklch(70.7% 0.022 261.325);\n  --color-gray-500: oklch(55.1% 0.027 264.364);\n  --color-gray-600: oklch(44.6% 0.03 256.802);\n  --color-gray-700: oklch(37.3% 0.034 259.733);\n  --color-gray-800: oklch(27.8% 0.033 256.848);\n  --color-gray-900: oklch(21% 0.034 264.665);\n  --color-gray-950: oklch(13% 0.028 261.692);\n  --color-zinc-50: oklch(98.5% 0 none);\n  --color-zinc-100: oklch(96.7% 0.001 286.375);\n  --color-zinc-200: oklch(92% 0.004 286.32);\n  --color-zinc-300: oklch(87.1% 0.006 286.286);\n  --color-zinc-400: oklch(70.5% 0.015 286.067);\n  --color-zinc-500: oklch(55.2% 0.016 285.938);\n  --color-zinc-600: oklch(44.2% 0.017 285.786);\n  --color-zinc-700: oklch(37% 0.013 285.805);\n  --color-zinc-800: oklch(27.4% 0.006 286.033);\n  --color-zinc-900: oklch(21% 0.006 285.885);\n  --color-zinc-950: oklch(14.1% 0.005 285.823);\n  --color-neutral-50: oklch(98.5% 0 none);\n  --color-neutral-100: #f7f7f7;\n  --color-neutral-200: #ebebeb;\n  --color-neutral-300: oklch(87% 0 none);\n  --color-neutral-400: oklch(70.8% 0 none);\n  --color-neutral-500: oklch(55.6% 0 none);\n  --color-neutral-600: oklch(43.9% 0 none);\n  --color-neutral-700: oklch(37.1% 0 none);\n  --color-neutral-800: oklch(26.9% 0 none);\n  --color-neutral-900: oklch(20.5% 0 none);\n  --color-neutral-950: oklch(14.5% 0 none);\n  --color-stone-50: oklch(98.5% 0.001 106.423);\n  --color-stone-100: oklch(97% 0.001 106.424);\n  --color-stone-200: oklch(92.3% 0.003 48.717);\n  --color-stone-300: oklch(86.9% 0.005 56.366);\n  --color-stone-400: oklch(70.9% 0.01 56.259);\n  --color-stone-500: oklch(55.3% 0.013 58.071);\n  --color-stone-600: oklch(44.4% 0.011 73.639);\n  --color-stone-700: oklch(37.4% 0.01 67.558);\n  --color-stone-800: oklch(26.8% 0.007 34.298);\n  --color-stone-900: oklch(21.6% 0.006 56.043);\n  --color-stone-950: oklch(14.7% 0.004 49.25);\n  --color-mauve-50: oklch(98.5% 0 none);\n  --color-mauve-100: oklch(96% 0.003 325.6);\n  --color-mauve-200: oklch(92.2% 0.005 325.62);\n  --color-mauve-300: oklch(86.5% 0.012 325.68);\n  --color-mauve-400: oklch(71.1% 0.019 323.02);\n  --color-mauve-500: oklch(54.2% 0.034 322.5);\n  --color-mauve-600: oklch(43.5% 0.029 321.78);\n  --color-mauve-700: oklch(36.4% 0.029 323.89);\n  --color-mauve-800: oklch(26.3% 0.024 320.12);\n  --color-mauve-900: oklch(21.2% 0.019 322.12);\n  --color-mauve-950: oklch(14.5% 0.008 326);\n  --color-olive-50: oklch(98.8% 0.003 106.5);\n  --color-olive-100: oklch(96.6% 0.005 106.5);\n  --color-olive-200: oklch(93% 0.007 106.5);\n  --color-olive-300: oklch(88% 0.011 106.6);\n  --color-olive-400: oklch(73.7% 0.021 106.9);\n  --color-olive-500: oklch(58% 0.031 107.3);\n  --color-olive-600: oklch(46.6% 0.025 107.3);\n  --color-olive-700: oklch(39.4% 0.023 107.4);\n  --color-olive-800: oklch(28.6% 0.016 107.4);\n  --color-olive-900: oklch(22.8% 0.013 107.4);\n  --color-olive-950: oklch(15.3% 0.006 107.1);\n  --color-mist-50: oklch(98.7% 0.002 197.1);\n  --color-mist-100: oklch(96.3% 0.002 197.1);\n  --color-mist-200: oklch(92.5% 0.005 214.3);\n  --color-mist-300: oklch(87.2% 0.007 219.6);\n  --color-mist-400: oklch(72.3% 0.014 214.4);\n  --color-mist-500: oklch(56% 0.021 213.5);\n  --color-mist-600: oklch(45% 0.017 213.2);\n  --color-mist-700: oklch(37.8% 0.015 216);\n  --color-mist-800: oklch(27.5% 0.011 216.9);\n  --color-mist-900: oklch(21.8% 0.008 223.9);\n  --color-mist-950: oklch(14.8% 0.004 228.8);\n  --color-taupe-50: oklch(98.6% 0.002 67.8);\n  --color-taupe-100: oklch(96% 0.002 17.2);\n  --color-taupe-200: oklch(92.2% 0.005 34.3);\n  --color-taupe-300: oklch(86.8% 0.007 39.5);\n  --color-taupe-400: oklch(71.4% 0.014 41.2);\n  --color-taupe-500: oklch(54.7% 0.021 43.1);\n  --color-taupe-600: oklch(43.8% 0.017 39.3);\n  --color-taupe-700: oklch(36.7% 0.016 35.7);\n  --color-taupe-800: oklch(26.8% 0.011 36.5);\n  --color-taupe-900: oklch(21.4% 0.009 43.1);\n  --color-taupe-950: oklch(14.7% 0.004 49.3);\n  --color-black: #000;\n  --color-white: #fff;\n  --color-neutral-925: #121212;\n  --color-accent-50: var(--color-blue-50);\n  --color-accent-100: var(--color-blue-100);\n  --color-accent-200: var(--color-blue-200);\n  --color-accent-300: var(--color-blue-300);\n  --color-accent-400: var(--color-blue-400);\n  --color-accent-500: var(--color-blue-500);\n  --color-accent-600: var(--color-blue-600);\n  --color-accent-700: var(--color-blue-700);\n  --color-accent-800: var(--color-blue-800);\n  --color-accent-900: var(--color-blue-900);\n  --color-accent-950: var(--color-blue-950);\n}\n:root, [data-helios-theme='light'] {\n  --color-foreground-full: var(--color-white);\n  --color-foreground-icon-primary: var(--color-neutral-950);\n  --color-foreground-icon-hover: var(--color-black);\n  --color-foreground-icon-secondary: var(--color-neutral-500);\n  --color-foreground-icon-tertiary: var(--color-neutral-400);\n  --color-foreground-icon-quaternary: var(--color-neutral-300);\n  --color-foreground-icon-error: var(--color-red-600);\n  --color-foreground-icon-disabled: var(--color-neutral-300);\n  --color-foreground-disabled: var(--color-neutral-400);\n  --color-foreground-disabled-danger: var(--color-red-300);\n  --color-input-disabled-foreground: var(--color-neutral-300);\n  --color-icon-button-disabled-foreground: var(--color-neutral-300);\n  --color-button-primary-disabled-foreground: var(--color-neutral-400);\n  --color-text-primary: var(--color-neutral-950);\n  --color-text-secondary: var(--color-neutral-500);\n  --color-text-tertiary: var(--color-neutral-400);\n  --color-text-disabled: var(--color-neutral-300);\n  --color-text-disabled-danger: var(--color-red-300);\n  --color-text-placeholder: var(--color-neutral-400);\n  --color-text-error-primary: var(--color-red-500);\n  --color-text-destructive: color-mix(in srgb, var(--color-red-700) 80%, var(--color-neutral-600));\n  --color-input-disabled-text: var(--color-neutral-300);\n  --color-text-white: var(--color-white);\n  --color-background-full: var(--color-white);\n  --color-ticket-detail-surface: var(--color-white);\n  --color-ticket-detail-low-background: var(--color-indigo-200);\n  --color-ticket-detail-low-hover: var(--color-indigo-300);\n  --color-ticket-detail-medium-hover: var(--color-yellow-300);\n  --color-ticket-detail-high-hover: var(--color-orange-300);\n  --color-ticket-detail-urgent-hover: var(--color-rose-300);\n  --color-ticket-detail-low-text: var(--color-indigo-800);\n  --color-ticket-detail-resource-background: var(--color-blue-100);\n  --color-ticket-detail-resource-text: var(--color-blue-600);\n  --color-ticket-detail-favorite: #ffb83c;\n  --color-project-board-empty-panel: rgb(242 242 242 / 0.8);\n  --color-project-board-empty-front: #d9d9d9;\n  --color-project-board-empty-middle: #e5e5e5;\n  --color-project-board-empty-back: #ededed;\n  --color-project-board-empty-detail: var(--color-white);\n  --color-background-primary-default: var(--color-white);\n  --color-background-inner-default: var(--color-white);\n  --color-background-primary-hover: var(--color-neutral-100);\n  --color-background-primary-active: var(--color-neutral-200);\n  --color-background-primary-disabled: var(--color-neutral-100);\n  --color-input-disabled-background: var(--color-neutral-100);\n  --color-background-secondary-default: var(--color-neutral-100);\n  --color-background-secondary-hover: var(--color-neutral-200);\n  --color-background-tertiary-default: var(--color-neutral-200);\n  --color-background-tertiary-hover: var(--color-neutral-300);\n  --color-background-tertiary-error: var(--color-red-100);\n  --color-background-recent-hire-role: var(--color-neutral-100);\n  --color-avatar-neutral-background: var(--color-neutral-300);\n  --color-background-quaternary-default: var(--color-neutral-300);\n  --color-background-quaternary-hover: var(--color-neutral-400);\n  --color-background-quaternary-error: var(--color-red-200);\n  --color-file-upload-icon-background: var(--color-neutral-300);\n  --color-file-upload-icon-foreground: var(--color-neutral-400);\n  --color-file-upload-icon-foreground-hover: var(--color-neutral-500);\n  --color-border-button-default: var(--color-neutral-200);\n  --color-border-button-hover: var(--color-neutral-300);\n  --color-border-button-active: var(--color-neutral-400);\n  --color-border-button-white: var(--color-white);\n  --color-border-error-default: var(--color-red-500);\n  --color-border-checkbox-default: var(--color-neutral-300);\n  --color-border-checkbox-hover: var(--color-neutral-400);\n  --color-border-checkbox-active: var(--color-neutral-400);\n  --color-border-checkbox-white: var(--color-white);\n  --color-border-component-detail-container: var(--color-neutral-200);\n  --color-border-ai-profile-card: var(--color-neutral-200);\n  --color-border-table: var(--color-neutral-200);\n  --color-border-button-group: var(--color-neutral-200);\n  --color-border-sidebar-profile-hover: var(--color-neutral-300);\n  --color-separator-border: var(--color-neutral-200);\n  --color-separator-border-strong: var(--color-neutral-200);\n  --color-border-focus-ring: var(--color-accent-500);\n  --color-state-success-text: var(--color-lime-800);\n  --color-state-success-base: var(--color-lime-200);\n  --color-control-indicator-background: var(--color-white);\n  --color-control-indicator-background-subtle: var(--color-neutral-100);\n  --color-switch-off-chip-start: var(--color-white);\n  --color-switch-off-chip-end: var(--color-neutral-100);\n  --color-switch-on-chip-start: color-mix(in oklab, var(--color-accent-500) 63%, var(--color-accent-600));\n  --color-switch-on-chip-end: color-mix(in oklab, var(--color-accent-600) 16%, var(--color-accent-700));\n  --color-stat-card-icon-background: var(--color-white);\n  --color-segmented-control-background: var(--color-neutral-100);\n  --color-segmented-control-selected-background: var(--color-white);\n  --color-theme-toggle-sidebar-background: var(--color-neutral-200);\n  --color-theme-toggle-sidebar-selected-background: var(--color-white);\n  --color-ai-chat-composer-add-background: var(--color-neutral-100);\n  --color-ai-chat-composer-add-hover-background: var(--color-neutral-200);\n  --color-composer-panel-tab-background: var(--color-neutral-200);\n  --color-composer-panel-add-background: var(--color-neutral-200);\n  --color-composer-panel-add-hover-background: var(--color-neutral-300);\n  --color-composer-panel-tile-border: var(--color-neutral-200);\n  --color-composer-panel-rail-background: var(--color-neutral-100);\n  --color-questionnaire-key-background: var(--color-neutral-100);\n  --color-questionnaire-key-hover-background: var(--color-neutral-200);\n  --color-agent-progress-ring: var(--color-neutral-700);\n  --color-button-ghost-background: var(--color-accent-100);\n  --color-button-ghost-hover: var(--color-accent-200);\n  --color-button-ghost-active: var(--color-accent-300);\n  --color-button-ghost-disabled: var(--color-accent-50);\n  --color-button-ghost-foreground: var(--color-accent-700);\n  --color-button-ghost-disabled-foreground: var(--color-accent-300);\n  --color-dropdown-item-hover-background: var(--color-neutral-100);\n  --color-kbd-background: var(--color-neutral-300);\n  --color-kbd-foreground: var(--color-neutral-500);\n  --color-docs-file-chip-background: var(--color-purple-50);\n  --color-docs-file-chip-border: var(--color-purple-100);\n  --color-docs-file-chip-foreground: var(--color-purple-500);\n  --color-docs-command-accent: var(--color-purple-400);\n  --color-docs-code-background: var(--color-background-primary-default);\n  --color-docs-install-rail: var(--color-border-button-default);\n  --color-badge-neutral-background: var(--color-neutral-200);\n  --color-team-menu-count-background: var(--color-neutral-200);\n  --color-team-menu-count-foreground: var(--color-neutral-500);\n  --color-badge-new-background: var(--color-accent-100);\n  --color-badge-new-text: var(--color-accent-600);\n  --color-tab-count-selected-background: var(--color-accent-100);\n  --color-pill-tab-blue-selected-background: var(--color-accent-50);\n  --color-pill-tab-blue-hover-background: var(--color-neutral-100);\n  --color-notification-information-background: var(--color-blue-100);\n  --color-notification-information-foreground: var(--color-blue-600);\n  --color-notification-success-background: var(--color-lime-100);\n  --color-notification-success-foreground: var(--color-lime-600);\n  --color-notification-error-background: var(--color-rose-100);\n  --color-notification-error-foreground: var(--color-rose-600);\n  --color-notification-center-background: var(--color-white);\n  --color-status-lime-background: var(--color-lime-200);\n  --color-status-lime-text: var(--color-lime-800);\n  --color-status-yellow-background: var(--color-yellow-200);\n  --color-status-yellow-text: var(--color-yellow-800);\n  --color-status-rose-background: var(--color-rose-200);\n  --color-status-rose-text: var(--color-rose-800);\n  --color-status-cyan-background: var(--color-cyan-200);\n  --color-status-cyan-text: var(--color-cyan-800);\n  --color-status-orange-background: var(--color-orange-200);\n  --color-status-orange-text: var(--color-orange-800);\n  --color-status-blue-background: var(--color-blue-200);\n  --color-status-blue-text: var(--color-blue-800);\n  --color-status-purple-background: var(--color-purple-100);\n  --color-status-purple-text: var(--color-purple-600);\n  --color-status-dot-green-halo: var(--color-green-100);\n  --color-status-dot-yellow-halo: var(--color-yellow-200);\n  --color-status-dot-indigo-halo: var(--color-indigo-100);\n  --color-date-range-background: var(--color-accent-100);\n  --color-date-range-edge-background: var(--color-accent-300);\n  --color-calendar-event-blue-background: var(--color-blue-100);\n  --color-calendar-event-blue-title: var(--color-blue-700);\n  --color-calendar-event-blue-time: var(--color-blue-700);\n  --color-calendar-event-pink-background: var(--color-pink-100);\n  --color-calendar-event-pink-title: var(--color-pink-700);\n  --color-calendar-event-pink-time: var(--color-pink-700);\n  --color-calendar-event-purple-background: var(--color-purple-100);\n  --color-calendar-event-purple-title: var(--color-purple-700);\n  --color-calendar-event-purple-time: var(--color-purple-700);\n  --color-calendar-event-lime-background: var(--color-lime-100);\n  --color-calendar-event-lime-title: var(--color-lime-800);\n  --color-calendar-event-lime-time: var(--color-lime-700);\n  --color-calendar-event-emerald-background: var(--color-emerald-100);\n  --color-calendar-event-emerald-title: var(--color-emerald-800);\n  --color-calendar-event-emerald-time: var(--color-emerald-700);\n  --color-text-error-placeholder: var(--color-red-400);\n  --color-chart-track: var(--color-neutral-200);\n  --color-chart-cursor: var(--color-neutral-300);\n  --color-chart-neutral: var(--color-neutral-300);\n  --color-chart-1: var(--color-teal-400);\n  --color-chart-1-active: var(--color-teal-500);\n  --color-chart-2: var(--color-lime-400);\n  --color-chart-2-active: var(--color-lime-500);\n  --color-chart-3: var(--color-pink-400);\n  --color-chart-3-active: var(--color-pink-500);\n  --color-chart-4: var(--color-sky-400);\n  --color-chart-4-active: var(--color-sky-500);\n  --color-chart-5: var(--color-purple-400);\n  --color-chart-5-active: var(--color-purple-500);\n  --color-chart-6: var(--color-blue-400);\n  --color-chart-6-active: var(--color-blue-500);\n  --color-chart-7: var(--color-emerald-400);\n  --color-chart-7-active: var(--color-emerald-500);\n  --color-chart-8: var(--color-yellow-400);\n  --color-chart-8-active: var(--color-yellow-500);\n  --color-chart-9: var(--color-indigo-400);\n  --color-chart-9-active: var(--color-indigo-500);\n  --color-chart-agents-bar: var(--color-purple-300);\n  --color-chart-agents-bar-active: var(--color-purple-400);\n}\n.dark, [data-helios-theme='dark'] {\n  --color-foreground-full: var(--color-neutral-700);\n  --color-foreground-icon-primary: var(--color-neutral-50);\n  --color-foreground-icon-hover: var(--color-white);\n  --color-foreground-icon-error: var(--color-red-400);\n  --color-foreground-icon-tertiary: var(--color-neutral-600);\n  --color-foreground-icon-quaternary: var(--color-neutral-700);\n  --color-foreground-icon-disabled: var(--color-neutral-800);\n  --color-foreground-disabled: var(--color-neutral-700);\n  --color-foreground-disabled-danger: var(--color-red-400);\n  --color-input-disabled-foreground: var(--color-neutral-600);\n  --color-icon-button-disabled-foreground: var(--color-neutral-500);\n  --color-button-primary-disabled-foreground: var(--color-neutral-500);\n  --color-text-primary: var(--color-neutral-50);\n  --color-text-tertiary: var(--color-neutral-600);\n  --color-text-disabled: var(--color-neutral-800);\n  --color-text-error-primary: var(--color-red-400);\n  --color-text-destructive: color-mix(in srgb, var(--color-red-500) 80%, var(--color-neutral-500));\n  --color-input-disabled-text: color-mix(in srgb, var(--color-neutral-500) 40%, transparent);\n  --color-background-full: var(--color-neutral-925);\n  --color-ticket-detail-surface: var(--color-neutral-925);\n  --color-ticket-detail-low-background: color-mix(in srgb, var(--color-indigo-950) 60%, transparent);\n  --color-ticket-detail-low-hover: color-mix(in srgb, var(--color-indigo-950) 80%, transparent);\n  --color-ticket-detail-medium-hover: color-mix(in srgb, var(--color-yellow-950) 80%, transparent);\n  --color-ticket-detail-high-hover: color-mix(in srgb, var(--color-orange-950) 80%, transparent);\n  --color-ticket-detail-urgent-hover: color-mix(in srgb, var(--color-rose-950) 80%, transparent);\n  --color-ticket-detail-low-text: var(--color-indigo-300);\n  --color-ticket-detail-resource-background: color-mix(in srgb, var(--color-blue-950) 60%, transparent);\n  --color-ticket-detail-resource-text: var(--color-blue-300);\n  --color-project-board-empty-panel: color-mix(in srgb, var(--color-neutral-800) 60%, transparent);\n  --color-project-board-empty-front: color-mix(in srgb, var(--color-neutral-800) 75%, var(--color-neutral-700));\n  --color-project-board-empty-middle: var(--color-neutral-700);\n  --color-project-board-empty-back: color-mix(in srgb, var(--color-neutral-600) 35%, var(--color-neutral-700));\n  --color-project-board-empty-detail: var(--color-neutral-500);\n  --color-background-primary-default: var(--color-neutral-800);\n  --color-background-inner-default: color-mix(in srgb, var(--color-neutral-800) 60%, transparent);\n  --color-background-primary-hover: color-mix(in srgb, var(--color-neutral-700) 60%, transparent);\n  --color-background-primary-active: var(--color-neutral-800);\n  --color-background-primary-disabled: var(--color-neutral-800);\n  --color-input-disabled-background: color-mix(in srgb, var(--color-neutral-800) 30%, transparent);\n  --color-switch-off-chip-start: var(--color-background-tertiary-default);\n  --color-switch-off-chip-end: var(--color-background-tertiary-default);\n  --color-background-secondary-default: var(--color-neutral-900);\n  --color-background-secondary-hover: var(--color-neutral-800);\n  --color-background-tertiary-default: var(--color-neutral-800);\n  --color-background-tertiary-hover: var(--color-neutral-700);\n  --color-background-tertiary-error: color-mix(in srgb, var(--color-red-950) 60%, transparent);\n  --color-background-quaternary-default: var(--color-neutral-700);\n  --color-background-quaternary-hover: var(--color-neutral-600);\n  --color-background-recent-hire-role: color-mix(in srgb, var(--color-neutral-900) 60%, transparent);\n  --color-avatar-neutral-background: var(--color-background-primary-default);\n  --color-file-upload-icon-background: var(--color-neutral-600);\n  --color-file-upload-icon-foreground: var(--color-neutral-400);\n  --color-file-upload-icon-foreground-hover: var(--color-neutral-300);\n  --color-stat-card-icon-background: var(--color-neutral-800);\n  --color-segmented-control-background: var(--color-neutral-925);\n  --color-segmented-control-selected-background: var(--color-neutral-800);\n  --color-theme-toggle-sidebar-background: var(--color-neutral-800);\n  --color-theme-toggle-sidebar-selected-background: var(--color-neutral-700);\n  --color-ai-chat-composer-add-background: var(--color-neutral-700);\n  --color-ai-chat-composer-add-hover-background: var(--color-neutral-600);\n  --color-composer-panel-tab-background: color-mix(in srgb, var(--color-neutral-700) 50%, transparent);\n  --color-composer-panel-add-background: var(--color-neutral-700);\n  --color-composer-panel-add-hover-background: var(--color-neutral-600);\n  --color-composer-panel-tile-border: color-mix(in srgb, var(--color-white) 14%, transparent);\n  --color-composer-panel-rail-background: color-mix(in srgb, var(--color-neutral-900) 50%, transparent);\n  --color-questionnaire-key-background: var(--color-neutral-700);\n  --color-questionnaire-key-hover-background: var(--color-neutral-600);\n  --color-agent-progress-ring: color-mix(in srgb, var(--color-white) 50%, transparent);\n  --color-button-ghost-background: var(--color-accent-900);\n  --color-button-ghost-hover: var(--color-accent-800);\n  --color-button-ghost-active: var(--color-accent-700);\n  --color-button-ghost-disabled: var(--color-neutral-800);\n  --color-button-ghost-foreground: var(--color-accent-300);\n  --color-button-ghost-disabled-foreground: var(--color-neutral-600);\n  --color-dropdown-item-hover-background: color-mix(in srgb, var(--color-neutral-700) 60%, transparent);\n  --color-kbd-background: var(--color-neutral-700);\n  --color-kbd-foreground: var(--color-neutral-400);\n  --color-docs-file-chip-background: color-mix(in srgb, var(--color-purple-950) 50%, transparent);\n  --color-docs-file-chip-border: var(--color-purple-800);\n  --color-docs-file-chip-foreground: var(--color-purple-400);\n  --color-docs-code-background: var(--color-background-full);\n  --color-docs-install-rail: color-mix(in srgb, var(--color-neutral-800) 60%, transparent);\n  --color-badge-neutral-background: var(--color-neutral-800);\n  --color-team-menu-count-background: var(--color-neutral-700);\n  --color-team-menu-count-foreground: var(--color-neutral-400);\n  --color-badge-new-background: var(--color-accent-950);\n  --color-badge-new-text: var(--color-accent-400);\n  --color-tab-count-selected-background: color-mix(in srgb, var(--color-accent-800) 60%, transparent);\n  --color-notification-information-background: color-mix(in srgb, var(--color-blue-800) 50%, transparent);\n  --color-notification-information-foreground: var(--color-blue-300);\n  --color-notification-success-background: color-mix(in srgb, var(--color-lime-800) 50%, transparent);\n  --color-notification-success-foreground: var(--color-lime-300);\n  --color-notification-error-background: color-mix(in srgb, var(--color-rose-800) 50%, transparent);\n  --color-notification-error-foreground: var(--color-rose-300);\n  --color-notification-center-background: var(--color-neutral-900);\n  --color-border-button-default: var(--color-neutral-700);\n  --color-border-button-hover: var(--color-neutral-500);\n  --color-border-button-active: var(--color-neutral-600);\n  --color-border-button-white: var(--color-zinc-800);\n  --color-border-error-default: var(--color-red-400);\n  --color-border-checkbox-default: var(--color-neutral-700);\n  --color-border-checkbox-hover: var(--color-neutral-500);\n  --color-border-checkbox-active: var(--color-neutral-500);\n  --color-border-component-detail-container: var(--color-neutral-800);\n  --color-border-ai-profile-card: var(--color-neutral-800);\n  --color-border-table: var(--color-neutral-800);\n  --color-border-button-group: color-mix(in srgb, var(--color-neutral-600) 60%, transparent);\n  --color-border-sidebar-profile-hover: var(--color-neutral-600);\n  --color-separator-border: var(--color-neutral-800);\n  --color-separator-border-strong: color-mix(in srgb, var(--color-neutral-700) 60%, transparent);\n  --color-status-lime-background: color-mix(in srgb, var(--color-lime-950) 60%, transparent);\n  --color-status-lime-text: var(--color-lime-500);\n  --color-status-yellow-background: color-mix(in srgb, var(--color-yellow-950) 60%, transparent);\n  --color-status-yellow-text: var(--color-yellow-500);\n  --color-status-rose-background: color-mix(in srgb, var(--color-rose-950) 60%, transparent);\n  --color-status-rose-text: var(--color-rose-500);\n  --color-status-cyan-background: color-mix(in srgb, var(--color-cyan-950) 60%, transparent);\n  --color-status-cyan-text: var(--color-cyan-400);\n  --color-status-orange-background: color-mix(in srgb, var(--color-orange-950) 60%, transparent);\n  --color-status-orange-text: var(--color-orange-500);\n  --color-status-blue-background: color-mix(in srgb, var(--color-blue-950) 60%, transparent);\n  --color-status-blue-text: var(--color-blue-300);\n  --color-status-purple-background: color-mix(in srgb, var(--color-purple-900) 50%, transparent);\n  --color-status-purple-text: var(--color-purple-300);\n  --color-status-dot-green-halo: color-mix(in srgb, var(--color-green-800) 40%, transparent);\n  --color-status-dot-yellow-halo: color-mix(in srgb, var(--color-yellow-800) 40%, transparent);\n  --color-status-dot-indigo-halo: color-mix(in srgb, var(--color-indigo-800) 40%, transparent);\n  --color-date-range-background: var(--color-accent-950);\n  --color-date-range-edge-background: var(--color-accent-800);\n  --color-pill-tab-blue-selected-background: color-mix(in srgb, var(--color-accent-950) 60%, transparent);\n  --color-pill-tab-blue-hover-background: var(--color-neutral-800);\n  --color-calendar-event-blue-background: var(--color-blue-950);\n  --color-calendar-event-blue-title: var(--color-blue-300);\n  --color-calendar-event-blue-time: var(--color-blue-300);\n  --color-calendar-event-pink-background: var(--color-pink-950);\n  --color-calendar-event-pink-title: var(--color-pink-300);\n  --color-calendar-event-pink-time: var(--color-pink-300);\n  --color-calendar-event-purple-background: var(--color-purple-950);\n  --color-calendar-event-purple-title: var(--color-purple-300);\n  --color-calendar-event-purple-time: var(--color-purple-300);\n  --color-calendar-event-lime-background: var(--color-lime-950);\n  --color-calendar-event-lime-title: var(--color-lime-300);\n  --color-calendar-event-lime-time: var(--color-lime-300);\n  --color-calendar-event-emerald-background: var(--color-emerald-950);\n  --color-calendar-event-emerald-title: var(--color-emerald-300);\n  --color-calendar-event-emerald-time: var(--color-emerald-300);\n  --color-chart-track: var(--color-neutral-800);\n  --color-chart-cursor: var(--color-neutral-700);\n  --color-chart-neutral: var(--color-neutral-800);\n  --color-chart-agents-bar: var(--color-purple-500);\n  --color-chart-agents-bar-active: var(--color-purple-600);\n}\n",
  "src/board-templates.css": "/* Full React template layouts adapted from the publicly inspected BoardUI pages. */\n.bt-root {\n  width: 100%;\n  font: 14px/1.45 var(--hu-font, Inter, system-ui, sans-serif);\n  color: var(--hu-text);\n  min-width: 0;\n  background: var(--hu-bg);\n  text-align: start;\n  container: helios-template / inline-size;\n}\n.bt-root * {\n  box-sizing: border-box;\n}\n.bt-root button,\n.bt-root input,\n.bt-root textarea,\n.bt-root select {\n  font-family: inherit;\n}\n.bt-shell {\n  display: grid;\n  grid-template-columns: 260px minmax(0, 1fr);\n  min-height: var(--bt-viewport-height,100dvh);\n  gap: 16px;\n  padding: 12px;\n  background: var(--hu-bg);\n  color: var(--hu-text);\n}\n.bt-sidebar {\n  position: sticky;\n  top: 12px;\n  height: calc(var(--bt-viewport-height,100dvh) - 24px);\n  min-width: 0;\n  border: 1px solid var(--hu-line);\n  border-radius: 26px;\n  background: var(--hu-bg-secondary);\n  display: flex;\n  flex-direction: column;\n  padding: 12px 12px 16px;\n  box-shadow: 0 2px 10px #00000005;\n}\n.bt-sidebar-brand {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  padding: 0 0 16px;\n}\n.bt-user-mark {\n  display: inline-grid;\n  place-items: center;\n  width: 30px;\n  height: 30px;\n  flex-shrink: 0;\n  background: var(--hu-line);\n  color: var(--hu-muted);\n  border-radius: 50%;\n  font-size: 15px;\n  font-weight: 500;\n}\n.bt-sidebar-brand button {\n  border: 0;\n  background: transparent;\n  font-size: 13px;\n  font-weight: 600;\n  color: var(--hu-text);\n  padding: 0;\n  cursor: pointer;\n  text-align: start;\n}\n.bt-sidebar-brand button:last-child {\n  margin-inline-start: auto;\n  font-size: 20px;\n  line-height: 24px;\n  flex-shrink: 0;\n  color: var(--hu-muted);\n}\n.bt-sidebar > .hu-field {\n  margin-bottom: 16px;\n}\n.bt-sidebar > .hu-field > label {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  width: 1px;\n  height: 1px;\n  overflow: hidden;\n}\n.bt-sidebar > .hu-field .hu-input-wrap {\n  border: 0;\n  box-shadow: none;\n  background: var(--hu-line);\n  border-radius: 100px;\n  height: 34px;\n}\n.bt-sidebar > .hu-field input {\n  font-size: 13px;\n}\n.bt-sidebar > nav {\n  display: grid;\n  gap: 4px;\n}\n.bt-sidebar > nav > button {\n  border: 0;\n  background: transparent;\n  padding: 10px;\n  border-radius: 10px;\n  color: var(--hu-muted);\n  font-size: 14px;\n  cursor: pointer;\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  text-align: start;\n  min-height: 38px;\n}\n.bt-sidebar > nav > button[aria-current='page'] {\n  color: var(--hu-on-brand, #102020);\n  background: var(--hu-brand);\n  box-shadow:\n    inset 0 0 0 1px #ffffff25,\n    0 1px 2px #0000000d;\n}\n.bt-sidebar > nav > button:not([aria-current='page']):hover {\n  background: var(--hu-line);\n}\n.bt-sidebar > nav > button > small {\n  margin-inline-start: auto;\n  font-size: 11px;\n  background: var(--hu-line);\n  color: var(--hu-muted);\n  padding: 0 4px;\n  border-radius: 3px;\n}\n.bt-icon {\n  width: 20px;\n  height: 20px;\n  flex-shrink: 0;\n  stroke: currentColor;\n  stroke-width: 1.6;\n  fill: none;\n  stroke-linecap: round;\n  stroke-linejoin: round;\n}\n.bt-sidebar-bottom {\n  margin-top: auto;\n  display: grid;\n  gap: 10px;\n  padding-top: 24px;\n}\n.bt-sidebar-bottom > a,\n.bt-sidebar-bottom > button:not(.bt-team-switch) {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  background: none;\n  border: 0;\n  padding: 5px 10px;\n  font: inherit;\n  font-size: 13px;\n  color: var(--hu-muted);\n  cursor: pointer;\n  text-align: start;\n  text-decoration: none;\n}\n.bt-theme {\n  display: flex;\n  padding: 4px;\n  border: 1px solid var(--hu-line);\n  background: var(--hu-bg);\n  border-radius: 30px;\n  align-self: start;\n  width: max-content;\n  margin-inline-start: 4px;\n}\n.bt-theme button {\n  display: grid;\n  place-items: center;\n  background: transparent;\n  border: 0;\n  border-radius: 50%;\n  color: var(--hu-muted);\n  width: 28px;\n  height: 28px;\n  font-size: 20px;\n  cursor: pointer;\n}\n.bt-theme button[aria-pressed='true'] {\n  background: var(--hu-bg-secondary);\n  color: var(--hu-text);\n}\n.bt-team-switch {\n  display: flex;\n  align-items: center;\n  gap: 9px;\n  border: 0;\n  border-radius: 12px;\n  background: var(--hu-line);\n  padding: 10px;\n  cursor: pointer;\n  text-align: start;\n  color: var(--hu-text);\n}\n.bt-team-switch > span:nth-child(2) {\n  display: grid;\n  gap: 3px;\n  min-width: 0;\n}\n.bt-team-switch strong {\n  font-weight: 500;\n  font-size: 13px;\n}\n.bt-team-switch small {\n  font-size: 11px;\n  color: var(--hu-muted);\n}\n.bt-team-switch > span:last-child {\n  margin-inline-start: auto;\n}\n.bt-sidebar-bottom .bt-back {\n  font-size: 10px;\n  color: var(--hu-brand-text);\n  padding-top: 0;\n}\n.bt-root .bt-main {\n  width: 100%;\n  min-width: 0;\n  max-width: none;\n  margin: 0;\n  padding: 12px 0 0 !important;\n  min-height: 0 !important;\n  color: var(--hu-text);\n  background: var(--hu-bg);\n}\n.bt-breadcrumb {\n  display: flex;\n  align-items: center;\n  gap: 9px;\n  font-size: 11px;\n  color: var(--hu-muted);\n  min-height: 30px;\n  margin-bottom: 12px;\n  white-space: nowrap;\n}\n.bt-breadcrumb .bt-user-mark {\n  width: 20px;\n  height: 20px;\n  font-size: 10px;\n  background: color-mix(in srgb, var(--hu-brand), var(--hu-bg) 75%);\n  color: var(--hu-brand-text);\n}\n.bt-breadcrumb strong {\n  font-weight: 400;\n}\n.bt-notification {\n  position: relative;\n  margin-inline-start: auto;\n  margin-inline-end: 10px;\n  background: var(--hu-bg);\n  border: 1px solid var(--hu-line);\n  border-radius: 8px;\n  display: grid;\n  place-items: center;\n  width: 34px;\n  height: 34px;\n  color: var(--hu-text);\n  cursor: pointer;\n}\n.bt-notification i {\n  position: absolute;\n  inset-inline-end: -4px;\n  top: -4px;\n  border-radius: 50%;\n  background: #dc2626;\n  color: white;\n  font-size: 9px;\n  font-style: normal;\n  width: 14px;\n  height: 14px;\n  display: grid;\n  place-items: center;\n}\n.bt-page-heading {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 16px;\n  min-height: 36px;\n  margin: 0 0 14px;\n}\n.bt-page-heading h1 {\n  font-size: 20px;\n  line-height: 28px;\n  font-weight: 500;\n  letter-spacing: -0.02em;\n  margin: 0;\n}\n.bt-page-heading > div {\n  display: flex;\n  gap: 9px;\n  align-items: center;\n  flex-wrap: wrap;\n}\n.bt-root .hu-button {\n  font-weight: 500;\n}\n.bt-root .hu-field > label {\n  font-size: 12px;\n}\n.bt-root .hu-field select,\n.bt-root .hu-field input {\n  font-size: 13px;\n}\n.bt-root .hu-button.hu-sm {\n  font-size: 13px;\n}\n.bt-tiles {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  gap: 10px;\n  margin-bottom: 12px;\n}\n.bt-tile {\n  min-width: 0;\n  border-radius: 14px;\n  padding: 12px;\n  background: var(--hu-bg-secondary);\n  display: flex;\n  flex-direction: column;\n  gap: 4px;\n}\n.bt-tile-icon {\n  display: grid;\n  place-items: center;\n  background: var(--hu-bg);\n  border-radius: 7px;\n  width: 26px;\n  height: 26px;\n  margin-bottom: 2px;\n}\n.bt-tile > span:nth-child(2) {\n  color: var(--hu-muted);\n  font-size: 13px;\n}\n.bt-tile > div {\n  display: flex;\n  align-items: baseline;\n  gap: 9px;\n  flex-wrap: wrap;\n}\n.bt-tile strong {\n  font-size: 24px;\n  font-weight: 500;\n  letter-spacing: -0.03em;\n  line-height: 30px;\n}\n.bt-tile small {\n  color: var(--hu-muted);\n  font-size: 10px;\n  font-weight: 400;\n}\n.bt-panel {\n  background: var(--hu-bg-secondary);\n  border-radius: 14px;\n  min-width: 0;\n  padding: 12px;\n  margin-bottom: 12px;\n}\n.bt-panel > header {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 12px;\n  margin-bottom: 10px;\n  min-height: 24px;\n}\n.bt-panel > header > h2 {\n  font-size: 13px;\n  font-weight: 400;\n  color: var(--hu-muted);\n  margin: 0;\n  line-height: 20px;\n}\n.bt-panel > header > .hu-field {\n  width: auto;\n  max-width: 150px;\n}\n.bt-panel > header > .hu-field > label {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  width: 1px;\n  height: 1px;\n  overflow: hidden;\n}\n.bt-panel > header .hu-input-wrap {\n  height: 32px;\n  background: var(--hu-bg);\n  border-color: var(--hu-line);\n  border-radius: 8px;\n}\n.bt-panel > .bt-number {\n  margin: 0 0 16px;\n}\n.bt-number {\n  display: block;\n  font-size: 25px;\n  font-weight: 500;\n  line-height: 32px;\n  letter-spacing: -0.03em;\n}\n.bt-grid-two,\n.bt-grid-three,\n.bt-dashboard-top {\n  display: grid;\n  gap: 12px;\n  margin-bottom: 12px;\n  align-items: start;\n  min-width: 0;\n}\n.bt-grid-two {\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n.bt-grid-three {\n  grid-template-columns: repeat(3, minmax(0, 1fr));\n}\n.bt-dashboard-top {\n  grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);\n}\n.bt-grid-two > .bt-panel,\n.bt-grid-three > .bt-panel,\n.bt-dashboard-top > .bt-panel {\n  margin: 0;\n  height: 100%;\n}\n.bt-grid-two > .hcf-card,\n.bt-grid-three > .hcf-card,\n.bt-dashboard-top > .hcf-card {\n  border: 0;\n  background: var(--hu-bg-secondary);\n  border-radius: 18px;\n}\n.bt-grid-two > .hc-react-card,\n.bt-grid-three > .hc-react-card {\n  min-width: 0;\n}\n.bt-grid-two > section,\n.bt-grid-three > section,\n.bt-dashboard-top > section {\n  min-width: 0;\n}\n.bt-person {\n  display: flex;\n  align-items: center;\n  gap: 9px;\n  min-width: 0;\n}\n.bt-person > img {\n  width: 32px;\n  height: 32px;\n  border-radius: 50%;\n  object-fit: cover;\n  flex-shrink: 0;\n}\n.bt-person > span {\n  display: grid;\n  gap: 3px;\n  min-width: 0;\n}\n.bt-person strong {\n  font-size: 12px;\n  font-weight: 500;\n  line-height: 18px;\n}\n.bt-person small {\n  font-size: 10px;\n  color: var(--hu-muted);\n  overflow: hidden;\n  text-overflow: ellipsis;\n  max-width: 190px;\n}\n.bt-row-role {\n  display: block;\n  color: var(--hu-muted);\n  font-size: 10px;\n  margin: 4px 0 0 42px;\n}\n.bt-hires {\n  display: grid;\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n  gap: 9px;\n}\n.bt-hires > article {\n  min-width: 0;\n  padding: 10px;\n  border-radius: 12px;\n  background: var(--hu-bg);\n}\n.bt-hires .bt-person small {\n  font-size: 9px;\n}\n.bt-hires .bt-person {\n  gap: 6px;\n}\n.bt-hires .bt-person strong {\n  font-size: 11px;\n}\n.bt-hires > article > span:last-child {\n  display: block;\n  font-size: 10px;\n  color: var(--hu-muted);\n  background: var(--hu-bg-secondary);\n  border-radius: 5px;\n  text-align: center;\n  margin-top: 9px;\n  padding: 4px;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.bt-paging {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 8px;\n  margin-top: 10px;\n}\n.bt-paging > span {\n  font-size: 10px;\n  color: var(--hu-muted);\n}\n.bt-paging .hu-button {\n  flex: 1;\n}\n.bt-chip {\n  display: inline-flex;\n  align-items: center;\n  gap: 4px;\n  padding: 2px 6px;\n  background: var(--hu-bg);\n  border: 1px solid var(--hu-line);\n  border-radius: 5px;\n  font-size: 11px;\n  color: var(--hu-muted);\n  white-space: nowrap;\n}\n.bt-progress-list {\n  display: grid;\n  gap: 14px;\n  list-style: none;\n  margin: 20px 0;\n  padding: 0;\n}\n.bt-progress-list li {\n  display: grid;\n  grid-template-columns: 90px minmax(0, 1fr) auto;\n  gap: 10px;\n  align-items: center;\n  font-size: 12px;\n}\n.bt-progress-list li > span {\n  color: var(--hu-muted);\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.bt-progress-list li > div {\n  background: var(--hu-line);\n  height: 20px;\n  border-radius: 6px;\n  overflow: hidden;\n}\n.bt-progress-list i {\n  display: block;\n  height: 100%;\n  border-radius: 6px;\n}\n.bt-progress-list strong {\n  font-size: 12px;\n  font-weight: 500;\n}\n.bt-radar {\n  height: 250px;\n  min-width: 0;\n}\n.bt-note {\n  font-size: 11px;\n  line-height: 18px;\n  color: var(--hu-muted);\n  margin: 10px 0 0;\n}\n.bt-root .bt-data-section {\n  border: 1px solid var(--hu-line);\n  border-radius: 18px;\n  background: var(--hu-bg);\n  overflow: hidden;\n  margin-top: 16px;\n  min-width: 0;\n}\n.bt-data-section > header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  gap: 20px;\n  padding: 16px;\n}\n.bt-data-section > header > div:first-child {\n  display: grid;\n  gap: 4px;\n}\n.bt-data-section > header > div:first-child small {\n  font-size: 11px;\n  color: var(--hu-muted);\n}\n.bt-data-section > header strong {\n  font-size: 12px;\n  font-weight: 500;\n}\n.bt-data-section > header > div:last-child {\n  display: flex;\n  gap: 10px;\n  align-items: flex-end;\n  max-width: 100%;\n  min-width: 0;\n}\n.bt-data-section > header .hu-field {\n  width: 150px;\n  min-width: 100px;\n}\n.bt-data-section > header .hu-field label {\n  font-size: 10px;\n}\n.bt-data-section .hu-table-card {\n  border: 0;\n  border-radius: 0;\n}\n.bt-root .hu-table-card td {\n  font-size: 12px;\n  height: 46px;\n  padding: 6px 10px;\n}\n.bt-root .hu-table-card th {\n  font-size: 11px;\n  height: 34px;\n  padding: 7px 10px;\n}\n.bt-root .hu-table-card td .bt-chip {\n  font-size: 10px;\n}\n.bt-root .hu-table-card .hu-table-toolbar {\n  padding: 7px 12px;\n  border-top: 1px solid var(--hu-line);\n  border-bottom: 1px solid var(--hu-line);\n}\n.bt-root .hu-table-card .hu-table-toolbar .hu-field > label {\n  font-size: 10px;\n}\n.bt-root .hu-table-card .hu-input-wrap {\n  height: 34px;\n}\n.bt-root .hu-table-card td .hu-button {\n  font-size: 11px;\n  min-height: 28px;\n}\n.bt-root .hu-table-card .hu-table-footer {\n  font-size: 11px;\n  gap: 12px;\n}\n.bt-root .hu-table-card .hu-table-footer .hu-button {\n  font-size: 11px;\n  min-height: 30px;\n}\n.bt-root .hu-table-card .hu-checkbox input {\n  width: 16px;\n  height: 16px;\n}\n.bt-status {\n  display: inline-flex;\n  align-items: center;\n  gap: 4px;\n  border: 1px solid var(--hu-line);\n  background: var(--hu-bg-secondary);\n  padding: 2px 6px;\n  border-radius: 5px;\n  font-size: 11px;\n  white-space: nowrap;\n}\n.bt-status-active,\n.bt-status-completed,\n.bt-status-shipped,\n.bt-status-stable,\n.bt-status-confirmed {\n  color: var(--color-status-lime-text);\n  background: var(--color-status-lime-background);\n  border-color: transparent;\n}\n.bt-status-contract,\n.bt-status-processing,\n.bt-status-in-treatment {\n  color: var(--color-status-blue-text);\n  background: var(--color-status-blue-background);\n  border-color: transparent;\n}\n.bt-status-recovering {\n  color: var(--color-status-cyan-text);\n  background: var(--color-status-cyan-background);\n  border-color: transparent;\n}\n.bt-status-paused,\n.bt-status-on-leave,\n.bt-status-medium,\n.bt-status-under-observation,\n.bt-status-delivery-waiting,\n.bt-status-waiting {\n  color: var(--color-status-yellow-text);\n  background: var(--color-status-yellow-background);\n  border-color: transparent;\n}\n.bt-status-urgent,\n.bt-status-delivery-failed {\n  color: var(--color-status-rose-text);\n  background: var(--color-status-rose-background);\n  border-color: transparent;\n}\n.bt-status-high {\n  color: var(--color-status-orange-text);\n  background: var(--color-status-orange-background);\n  border-color: transparent;\n}\n.bt-status-low {\n  color: var(--color-ticket-detail-low-text);\n  background: var(--color-ticket-detail-low-background);\n  border-color: transparent;\n}\n.bt-status-low:hover {\n  background: var(--color-ticket-detail-low-hover);\n}\n.bt-status-medium:hover {\n  background: var(--color-ticket-detail-medium-hover);\n}\n.bt-status-high:hover {\n  background: var(--color-ticket-detail-high-hover);\n}\n.bt-status-urgent:hover {\n  background: var(--color-ticket-detail-urgent-hover);\n}\n.bt-positive {\n  background: color-mix(in srgb, var(--hu-brand), var(--hu-bg) 75%);\n  color: var(--hu-brand-text);\n  padding: 2px 5px;\n  border-radius: 4px;\n}\n.bt-mini-stats {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  gap: 8px;\n  margin: 12px 0 16px;\n}\n.bt-mini-stats > span {\n  display: grid;\n  gap: 4px;\n  background: var(--hu-bg);\n  border-radius: 9px;\n  padding: 10px;\n  font-size: 11px;\n  min-width: 0;\n}\n.bt-mini-stats strong {\n  font-size: 13px;\n  font-weight: 500;\n  overflow-wrap: anywhere;\n}\n.bt-mini-stats small {\n  font-size: 10px;\n  color: var(--hu-muted);\n}\n.bt-heatmap {\n  margin: 16px 0 0;\n  max-width: 100%;\n  min-width: 0;\n}\n.bt-heatmap-grid {\n  display: grid;\n  grid-auto-flow: column;\n  grid-template-rows: repeat(7, 1fr);\n  gap: 4px;\n  overflow: auto;\n  padding: 4px 2px;\n  max-width: 100%;\n}\n.bt-heatmap-grid button {\n  border: 0;\n  border-radius: 3px;\n  aspect-ratio: 1;\n  min-width: 8px;\n  padding: 0;\n  cursor: pointer;\n}\n.bt-heatmap-grid button[aria-pressed='true'] {\n  outline: 1px solid var(--hu-text);\n  outline-offset: 1px;\n}\n.bt-heatmap > p {\n  font-size: 10px;\n  color: var(--hu-muted);\n  margin: 6px 0;\n}\n.bt-sankey {\n  height: 340px;\n  min-width: 0;\n  margin-top: 10px;\n}\n.bt-data-alternative {\n  overflow: auto;\n  max-width: 100%;\n  padding-top: 12px;\n}\n.bt-data-alternative table {\n  width: 100%;\n  border-collapse: collapse;\n  text-align: start;\n  font-size: 12px;\n}\n.bt-data-alternative th,\n.bt-data-alternative td {\n  padding: 8px;\n  border-bottom: 1px solid var(--hu-line);\n}\n.bt-panel > details {\n  font-size: 11px;\n  color: var(--hu-muted);\n}\n.bt-panel > details > summary {\n  cursor: pointer;\n}\n.bt-gauge {\n  height: 200px;\n  position: relative;\n  overflow: hidden;\n  margin: 20px auto 0;\n  width: min(260px, 100%);\n}\n.bt-gauge:before {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 50%;\n  top: 20px;\n  width: 240px;\n  height: 240px;\n  border: 24px solid var(--hu-line);\n  border-bottom-color: transparent;\n  border-right-color: transparent;\n  border-radius: 50%;\n  transform: translateX(-50%) rotate(45deg);\n}\n.bt-gauge:after {\n  content: '';\n  display: block;\n  position: absolute;\n  left: 50%;\n  top: 20px;\n  width: 240px;\n  height: 240px;\n  border: 24px solid var(--hu-brand);\n  border-bottom-color: transparent;\n  border-right-color: transparent;\n  border-left-color: transparent;\n  border-radius: 50%;\n  transform: translateX(-50%) rotate(-38deg);\n}\n.bt-gauge > strong {\n  position: absolute;\n  inset: 85px 0 auto;\n  display: grid;\n  text-align: center;\n  font-size: 32px;\n  font-weight: 500;\n  z-index: 1;\n}\n.bt-gauge small {\n  font-size: 11px;\n  font-weight: 400;\n  color: var(--hu-muted);\n  margin-top: 2px;\n}\n.bt-grid-three .bt-mini-stats {\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n}\n.bt-status-message {\n  font-size: 12px;\n  color: var(--hu-muted);\n  min-height: 20px;\n  margin: 16px 0;\n}\n.bt-example-note {\n  font-size: 10px;\n  color: var(--hu-muted);\n  padding: 20px 0;\n}\n.bt-example-note a {\n  color: var(--hu-brand-text);\n}\n.bt-dialog-fields {\n  display: grid;\n  gap: 18px;\n  min-width: 0;\n}\n.bt-dialog-fields .bt-person small {\n  max-width: none;\n}\n.bt-detail {\n  display: grid;\n  grid-template-columns: auto 1fr;\n  gap: 12px;\n  margin: 0;\n  font-size: 13px;\n}\n.bt-detail dt {\n  color: var(--hu-muted);\n}\n.bt-detail dd {\n  margin: 0;\n  overflow-wrap: anywhere;\n}\n.bt-field {\n  display: grid;\n  gap: 8px;\n  font-size: 13px;\n  font-weight: 500;\n}\n.bt-field textarea {\n  width: 100%;\n  min-height: 130px;\n  background: var(--hu-bg);\n  color: var(--hu-text);\n  border: 1px solid var(--hu-border);\n  border-radius: 8px;\n  padding: 12px;\n  font: inherit;\n  line-height: 1.6;\n  resize: vertical;\n}\n.bt-root button:focus-visible,\n.bt-root a:focus-visible,\n.bt-root summary:focus-visible,\n.bt-root [tabindex='0']:focus-visible,\n.bt-root textarea:focus-visible {\n  outline: 2px solid var(--hu-brand-text);\n  outline-offset: 3px;\n}\n.bt-collapsed {\n  grid-template-columns: 76px minmax(0, 1fr);\n}\n.bt-collapsed .bt-sidebar-brand > button:not(:last-child),\n.bt-collapsed .bt-sidebar-brand > .bt-user-mark,\n.bt-collapsed .bt-sidebar > .hu-field,\n.bt-collapsed .bt-sidebar nav > button > span,\n.bt-collapsed .bt-sidebar nav > button > small,\n.bt-collapsed .bt-sidebar-bottom > a,\n.bt-collapsed .bt-sidebar-bottom > button {\n  display: none;\n}\n.bt-collapsed .bt-sidebar nav > button {\n  justify-content: center;\n  padding: 10px;\n}\n.bt-collapsed .bt-theme {\n  display: grid;\n}\n.bt-collapsed .bt-sidebar-brand {\n  justify-content: center;\n}\n.bt-collapsed .bt-sidebar-brand > button:last-child {\n  margin: 0;\n}\n.bt-local-list {\n  list-style: none;\n  padding: 0;\n  display: grid;\n  gap: 10px;\n  font-size: 13px;\n}\n.bt-local-list li {\n  background: var(--hu-bg);\n  border-radius: 8px;\n  padding: 12px;\n}\n/* Calendar, project board and medical profile preserve distinct source compositions. */\n.bt-month-controls {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  gap: 16px;\n  border: 1px solid var(--hu-line);\n  background: var(--hu-bg);\n  border-radius: 9px;\n  padding: 2px;\n  min-width: 220px;\n  font-size: 13px;\n}\n.bt-month-controls strong {\n  font-weight: 500;\n}\n.bt-month-controls .hu-button {\n  border: 0;\n  box-shadow: none;\n  min-height: 30px;\n}\n.bt-calendar {\n  border-radius: 24px;\n  background: var(--hu-bg-secondary);\n  padding: 12px;\n  overflow: auto;\n  min-width: 0;\n  max-width: 100%;\n}\n.bt-calendar-week,\n.bt-calendar-row {\n  display: grid;\n  grid-template-columns: repeat(7, minmax(0, 1fr));\n  gap: 7px;\n  min-width: 0;\n}\n.bt-calendar-week {\n  padding: 6px 0 14px;\n  text-align: center;\n  color: var(--hu-muted);\n  font-size: 12px;\n}\n.bt-calendar-row {\n  margin-bottom: 7px;\n}\n.bt-calendar-row:last-child {\n  margin-bottom: 0;\n}\n.bt-calendar-cell {\n  background: var(--hu-bg);\n  border: 1px solid var(--hu-line);\n  border-radius: 12px;\n  min-height: 127px;\n  display: flex;\n  flex-direction: column;\n  padding: 8px;\n  min-width: 0;\n  gap: 8px;\n}\n.bt-calendar-cell[aria-selected='true'] {\n  border-color: var(--hu-brand-text);\n}\n.bt-outside-month {\n  background: var(--hu-line);\n  color: var(--hu-muted);\n}\n.bt-calendar-day {\n  border: 0;\n  background: transparent;\n  text-align: start;\n  padding: 0;\n  color: inherit;\n  font-size: 12px;\n  cursor: pointer;\n  align-self: flex-start;\n  min-width: 24px;\n  min-height: 24px;\n}\n.bt-calendar-events {\n  display: grid;\n  gap: 4px;\n  margin-top: auto;\n}\n.bt-event {\n  background: #dbeafe;\n  color: #1e40af;\n  border: 0;\n  border-radius: 5px;\n  padding: 3px 5px;\n  font-size: 10px;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  gap: 4px;\n  text-align: start;\n  cursor: pointer;\n  min-width: 0;\n}\n.bt-event > span {\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.bt-event small {\n  font-size: 9px;\n  white-space: nowrap;\n  flex-shrink: 0;\n}\n.bt-kanban {\n  display: grid;\n  grid-auto-flow: column;\n  grid-auto-columns: 270px;\n  gap: 8px;\n  overflow: auto;\n  max-width: 100%;\n  min-width: 0;\n  padding-bottom: 14px;\n  min-height: calc(var(--bt-viewport-height,100dvh) - 150px);\n}\n.bt-kanban-column {\n  background: var(--hu-bg-secondary);\n  border-radius: 22px;\n  padding: 10px 7px;\n  min-width: 0;\n}\n.bt-kanban-column > header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  gap: 10px;\n  padding: 2px 5px 10px;\n}\n.bt-kanban-column h2 {\n  font-size: 13px;\n  font-weight: 500;\n  margin: 0;\n}\n.bt-kanban-column h2 span {\n  font-weight: 400;\n  color: var(--hu-muted);\n  margin-inline-start: 4px;\n}\n.bt-kanban-column > header > button {\n  border: 0;\n  background: none;\n  font-size: 20px;\n  color: var(--hu-muted);\n  line-height: 24px;\n  cursor: pointer;\n}\n.bt-task {\n  background: var(--hu-bg);\n  border: 1px solid var(--hu-line);\n  border-radius: 14px;\n  margin-bottom: 8px;\n  overflow: hidden;\n  cursor: grab;\n}\n.bt-task-open {\n  border: 0;\n  background: none;\n  display: grid;\n  gap: 10px;\n  width: 100%;\n  padding: 13px 12px;\n  color: var(--hu-text);\n  text-align: start;\n  cursor: pointer;\n}\n.bt-task-open > span:first-child {\n  font-size: 11px;\n  color: var(--hu-muted);\n}\n.bt-task-open h3 {\n  font-size: 13px;\n  font-weight: 400;\n  line-height: 20px;\n  margin: 0;\n}\n.bt-task-open > small {\n  font-size: 11px;\n  color: var(--hu-muted);\n}\n.bt-task-labels {\n  display: flex;\n  gap: 6px;\n  align-items: center;\n}\n.bt-task-labels > small {\n  font-size: 10px;\n  color: var(--hu-muted);\n  border: 1px solid var(--hu-line);\n  padding: 1px 4px;\n  border-radius: 4px;\n}\n.bt-task > .hu-field {\n  padding: 0 12px 12px;\n}\n.bt-task > .hu-field > label {\n  font-size: 10px;\n}\n.bt-task > .hu-field .hu-input-wrap {\n  height: 28px;\n}\n.bt-task > .hu-field select {\n  font-size: 11px;\n}\n.bt-filter-bar {\n  display: flex;\n  align-items: flex-end;\n  gap: 16px;\n  background: var(--hu-bg-secondary);\n  border: 1px solid var(--hu-line);\n  border-radius: 12px;\n  padding: 16px;\n  margin-bottom: 16px;\n}\n.bt-filter-bar .hu-field {\n  max-width: 300px;\n}\n.bt-medical-identity {\n  display: grid;\n  justify-items: center;\n  gap: 12px;\n  text-align: center;\n  margin-bottom: 20px;\n}\n.bt-large-avatar {\n  width: 82px;\n  height: 82px;\n  border-radius: 50%;\n  background: var(--hu-line);\n  color: var(--hu-muted);\n  font-size: 30px;\n  display: grid;\n  place-items: center;\n  flex-shrink: 0;\n}\n.bt-medical-identity h2 {\n  font-size: 18px;\n  font-weight: 500;\n  margin: 0;\n}\n.bt-profile-facts {\n  display: grid;\n  grid-template-columns: 1fr auto;\n  gap: 0;\n  font-size: 12px;\n  margin: 0;\n}\n.bt-profile-facts dt,\n.bt-profile-facts dd {\n  background: var(--hu-bg);\n  padding: 10px 9px;\n  margin: 0;\n  margin-bottom: 6px;\n  min-width: 0;\n}\n.bt-profile-facts dt {\n  color: var(--hu-muted);\n  border-radius: 8px 0 0 8px;\n}\n.bt-profile-facts dd {\n  border-radius: 0 8px 8px 0;\n  text-align: end;\n}\n.bt-activity-rings {\n  display: block;\n  width: min(240px, 90%);\n  height: auto;\n  margin: 20px auto 0;\n}\n.bt-alert-list {\n  display: grid;\n  gap: 8px;\n  max-height: 290px;\n  overflow: auto;\n}\n.bt-alert-list > button {\n  border: 0;\n  border-radius: 12px;\n  background: var(--hu-bg);\n  padding: 14px;\n  text-align: start;\n  font: inherit;\n  color: var(--hu-text);\n  cursor: pointer;\n  display: grid;\n  gap: 10px;\n}\n.bt-alert-list strong {\n  font-size: 12px;\n  font-weight: 500;\n}\n.bt-alert-list p {\n  font-size: 11px;\n  color: var(--hu-muted);\n  line-height: 18px;\n  margin: 0;\n}\n.bt-alert-list .bt-chip {\n  justify-self: start;\n  font-size: 9px;\n}\n/* Agentic workspaces use shared Composer, AgentCreator and MultiAgentChat exports. */\n.bt-template-chat-starter .bt-main,\n.bt-template-ai-chat .bt-main,\n.bt-template-ai-image-generation .bt-main {\n  padding: 0 !important;\n}\n.bt-template-chat-starter .bt-breadcrumb,\n.bt-template-ai-chat .bt-breadcrumb,\n.bt-template-ai-image-generation .bt-breadcrumb {\n  display: none;\n}\n.bt-template-chat-starter .bt-example-note,\n.bt-template-ai-chat .bt-example-note,\n.bt-template-ai-image-generation .bt-example-note {\n  display: none;\n}\n.bt-chat-starter {\n  min-height: calc(var(--bt-viewport-height,100dvh) - 24px);\n  height: calc(var(--bt-viewport-height,100dvh) - 24px);\n  border-radius: 26px;\n  background: var(--hu-bg-secondary);\n  padding: 18px 16px;\n  display: flex;\n  flex-direction: column;\n  min-width: 0;\n}\n.bt-chat-starter > header {\n  display: flex;\n  justify-content: space-between;\n  gap: 12px;\n  align-items: center;\n}\n.bt-chat-starter h1 {\n  font-size: 15px;\n  font-weight: 500;\n  margin: 0;\n}\n.bt-chat-starter > header > div {\n  display: flex;\n  gap: 8px;\n  flex-wrap: wrap;\n}\n.bt-provider-card {\n  width: min(450px, 90%);\n  margin: auto;\n  background: var(--hu-bg);\n  border-radius: 18px;\n  padding: 24px;\n  box-shadow: 0 1px 2px #0000000d;\n}\n.bt-provider-card h2 {\n  font-size: 16px;\n  font-weight: 500;\n  margin: 0 0 12px;\n}\n.bt-provider-card p,\n.bt-provider-card ol {\n  font-size: 13px;\n  color: var(--hu-muted);\n  line-height: 21px;\n}\n.bt-provider-card ol {\n  padding-inline-start: 20px;\n}\n.bt-provider-card ol li {\n  margin: 8px 0;\n}\n.bt-provider-card > .hu-button {\n  width: 100%;\n  margin-top: 16px;\n}\n.bt-message-log {\n  flex: 1;\n  min-height: 0;\n  overflow: auto;\n  display: flex;\n  flex-direction: column;\n  gap: 16px;\n  padding: 24px 12px;\n  justify-content: flex-end;\n  align-items: flex-start;\n}\n.bt-message-log > article {\n  max-width: min(580px, 90%);\n  background: var(--hu-line);\n  border-radius: 18px;\n  padding: 12px 16px;\n  font-size: 13px;\n  line-height: 20px;\n  white-space: pre-wrap;\n  overflow-wrap: anywhere;\n}\n.bt-message-log > article > strong {\n  font-size: 10px;\n  color: var(--hu-muted);\n  font-weight: 500;\n}\n.bt-message-log > article > p {\n  margin: 5px 0 0;\n}\n.bt-message-log > article[data-author='user'] {\n  align-self: flex-end;\n  background: var(--hu-bg);\n}\n.bt-chat-welcome {\n  text-align: center;\n  width: 100%;\n  margin: auto;\n  padding: 30px;\n}\n.bt-chat-welcome h2 {\n  font-size: 24px;\n  font-weight: 500;\n  letter-spacing: -0.03em;\n  margin: 0 0 12px;\n}\n.bt-chat-welcome p {\n  font-size: 13px;\n  color: var(--hu-muted);\n}\n.bt-template-composer {\n  width: 100%;\n  min-width: 0;\n  position: relative;\n}\n.bt-template-composer .hp-composer-example {\n  width: 100%;\n  max-width: none;\n}\n.bt-template-composer .hp-composer-messages {\n  display: none;\n}\n.bt-template-composer .hp-composer-card {\n  border-color: var(--hu-line);\n  box-shadow: none;\n}\n.bt-template-composer .hp-composer-card textarea {\n  font-size: 13px;\n  min-height: 80px;\n}\n.bt-template-composer .hp-status {\n  font-size: 10px;\n  line-height: 16px;\n  margin-block: 4px;\n}\n.bt-template-composer .hp-note {\n  font-size: 9px;\n  line-height: 14px;\n  margin-block: 4px;\n}\n.bt-template-composer .hp-composer-toolbar .hu-field {\n  width: 150px;\n  max-width: 150px;\n}\n.bt-template-composer .hp-composer-toolbar .hu-field label {\n  font-size: 10px;\n}\n.bt-template-composer .hp-composer-toolbar .hu-input-wrap {\n  height: 30px;\n}\n.bt-template-composer .hp-composer-toolbar select {\n  font-size: 11px;\n}\n.bt-template-composer .hp-composer-uploads {\n  display: none;\n}\n.bt-template-composer.bt-attachments-open .hp-composer-uploads {\n  display: block;\n}\n.bt-attach-toggle {\n  position: absolute;\n  top: -30px;\n  inset-inline-start: 10px;\n  border: 1px solid var(--hu-line);\n  background: var(--hu-bg);\n  border-radius: 6px;\n  font-size: 11px;\n  padding: 4px 8px;\n  color: var(--hu-muted);\n  cursor: pointer;\n}\n.bt-ai-workspace {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) 400px;\n  gap: 12px;\n  height: calc(var(--bt-viewport-height,100dvh) - 24px);\n  min-width: 0;\n}\n.bt-ai-workspace.bt-panel-closed {\n  grid-template-columns: minmax(0, 1fr);\n}\n.bt-ai-conversation {\n  border-radius: 26px;\n  background: var(--hu-bg-secondary);\n  min-width: 0;\n  display: flex;\n  flex-direction: column;\n  padding: 16px 12px;\n  overflow: hidden;\n}\n.bt-ai-conversation > header {\n  display: flex;\n  gap: 16px;\n  align-items: center;\n  justify-content: space-between;\n  font-size: 11px;\n  color: var(--hu-muted);\n  padding-inline: 4px;\n}\n.bt-ai-conversation > header > span {\n  display: flex;\n  gap: 8px;\n  align-items: center;\n  min-width: 0;\n  flex-wrap: wrap;\n}\n.bt-ai-conversation > header b {\n  font-weight: 400;\n}\n.bt-ai-conversation > header > div {\n  display: flex;\n  gap: 4px;\n}\n.bt-ai-conversation > header .hu-button {\n  font-size: 10px;\n  padding-inline: 7px;\n  min-height: 28px;\n}\n.bt-ai-conversation .bt-message-log {\n  padding: 20px 0 35px;\n}\n.bt-ai-panel {\n  min-width: 0;\n  max-height: calc(var(--bt-viewport-height,100dvh) - 24px);\n  overflow: auto;\n  padding: 8px 0;\n}\n.bt-ai-panel .hu-tabs [role='tab'] {\n  font-size: 13px;\n}\n.bt-ai-panel .hu-tabs > [role='tabpanel'] {\n  padding-top: 16px;\n}\n.bt-ai-panel pre {\n  padding: 16px 12px;\n  margin: 12px 0;\n  font:\n    11px/1.8 ui-monospace,\n    SFMono-Regular,\n    monospace;\n  white-space: pre;\n  max-width: 100%;\n  overflow: auto;\n  border-radius: 8px;\n  border: 1px solid var(--hu-line);\n  background: var(--hu-bg-secondary);\n  color: var(--hu-text);\n}\n.bt-code-summary {\n  display: flex;\n  justify-content: space-between;\n  gap: 12px;\n  align-items: center;\n  font-size: 11px;\n  color: var(--hu-muted);\n  padding: 10px 8px;\n  border-radius: 8px;\n  background: var(--hu-bg-secondary);\n}\n.bt-code-summary strong {\n  font-weight: 500;\n  color: var(--hu-text);\n}\n.bt-code-browser {\n  display: grid;\n  gap: 20px;\n  padding: 12px;\n}\n.bt-code-browser h2 {\n  font-size: 18px;\n  font-weight: 500;\n  margin: 0;\n}\n.bt-code-browser p {\n  font-size: 12px;\n  color: var(--hu-muted);\n  margin: 0;\n}\n.bt-code-browser form {\n  display: grid;\n  gap: 16px;\n  padding: 20px;\n  border: 1px solid var(--hu-line);\n  border-radius: 12px;\n}\n.bt-code-browser > a {\n  font-size: 12px;\n  color: var(--hu-brand-text);\n}\n.bt-image-gallery {\n  columns: 3;\n  column-gap: 8px;\n  margin-top: 16px;\n}\n.bt-image-gallery > button {\n  display: block;\n  break-inside: avoid;\n  margin: 0 0 8px;\n  width: 100%;\n  padding: 0;\n  border: 1px solid var(--hu-line);\n  background: var(--hu-bg-secondary);\n  border-radius: 10px;\n  overflow: hidden;\n  cursor: pointer;\n  text-align: start;\n  color: var(--hu-text);\n}\n.bt-image-gallery img {\n  display: block;\n  width: 100%;\n  height: auto;\n  min-height: 90px;\n  object-fit: cover;\n}\n.bt-image-gallery > button > span {\n  display: block;\n  font-size: 9px;\n  padding: 7px;\n  color: var(--hu-muted);\n}\n.bt-image-gallery.bt-ratio-square img {\n  aspect-ratio: 1;\n  object-fit: cover;\n}\n.bt-image-gallery.bt-ratio-portrait img {\n  aspect-ratio: 3/4;\n  object-fit: cover;\n}\n.bt-image-detail {\n  display: block;\n  width: 100%;\n  max-height: 55dvh;\n  object-fit: contain;\n  border-radius: 8px;\n}\n.bt-ai-profile {\n  max-width: 680px;\n  margin: 0 auto;\n}\n.bt-profile-card {\n  border: 1px solid var(--hu-line);\n  border-radius: 24px;\n  overflow: hidden;\n  margin-bottom: 16px;\n}\n.bt-profile-cover {\n  display: block;\n  width: 100%;\n  height: 170px;\n  object-fit: cover;\n}\n.bt-profile-body {\n  padding: 0 16px 16px;\n}\n.bt-profile-actions {\n  display: flex;\n  justify-content: space-between;\n  align-items: flex-end;\n  gap: 20px;\n  margin-top: -42px;\n  margin-bottom: 14px;\n}\n.bt-profile-actions .bt-large-avatar {\n  border: 4px solid var(--hu-bg);\n}\n.bt-profile-actions > div {\n  display: flex;\n  gap: 8px;\n  align-items: center;\n}\n.bt-profile-body > h1 {\n  font-size: 21px;\n  font-weight: 500;\n  line-height: 28px;\n  margin: 0 0 4px;\n}\n.bt-profile-body > p {\n  color: var(--hu-muted);\n  font-size: 14px;\n  margin: 0 0 14px;\n}\n.bt-profile-body > small {\n  display: block;\n  color: var(--hu-muted);\n  font-size: 12px;\n}\n.bt-profile-body > .bt-mini-stats {\n  margin-top: 12px;\n}\n.bt-profile-activity-heading {\n  display: flex;\n  justify-content: space-between;\n  gap: 12px;\n  align-items: center;\n  font-size: 12px;\n  color: var(--hu-muted);\n  margin: 20px 0 12px;\n}\n.bt-period-buttons {\n  display: flex;\n  gap: 12px;\n}\n.bt-period-buttons > button {\n  border: 0;\n  background: none;\n  color: var(--hu-muted);\n  padding: 4px;\n  font-size: 12px;\n  cursor: pointer;\n}\n.bt-period-buttons > button[aria-pressed='true'] {\n  color: var(--hu-text);\n  font-weight: 500;\n}\n.bt-template-multi-agent-chat .bt-shell {\n  display: block;\n  padding: 12px;\n}\n.bt-template-multi-agent-chat .bt-sidebar,\n.bt-template-multi-agent-chat .bt-breadcrumb,\n.bt-template-multi-agent-chat .bt-example-note {\n  display: none;\n}\n.bt-template-multi-agent-chat .bt-main {\n  padding: 0 !important;\n}\n.bt-multi-workspace {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) 330px;\n  gap: 16px;\n  min-height: calc(var(--bt-viewport-height,100dvh) - 24px);\n}\n.bt-multi-workspace.bt-multi-panel-closed {\n  grid-template-columns: minmax(0, 1fr);\n}\n.bt-multi-main {\n  min-width: 0;\n  display: flex;\n  flex-direction: column;\n}\n.bt-multi-top {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 12px;\n  padding: 0 4px 10px;\n  font-size: 11px;\n  color: var(--hu-muted);\n}\n.bt-multi-top > a {\n  color: var(--hu-brand-text);\n}\n.bt-multi-top .hu-button {\n  font-size: 11px;\n  min-height: 28px;\n}\n.bt-multi-main > .hp-multi-chat {\n  flex: 1;\n  min-height: 600px;\n  border-radius: 22px;\n}\n.bt-agent-editor {\n  min-width: 0;\n  padding: 8px 4px 20px;\n  max-height: calc(var(--bt-viewport-height,100dvh) - 24px);\n  overflow: auto;\n}\n.bt-agent-editor > header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  gap: 12px;\n  margin-bottom: 10px;\n}\n.bt-agent-editor h2 {\n  font-size: 14px;\n  font-weight: 500;\n  margin: 0;\n}\n.bt-agent-editor .hp-agent-creator {\n  padding: 0;\n  border: 0;\n}\n.bt-agent-editor .hp-agent-creator .hp-avatar {\n  margin-inline: auto;\n}\n.bt-agent-editor > .hu-button {\n  width: 100%;\n  margin-top: 12px;\n}\n.bt-repository-nav {\n  display: grid;\n  gap: 4px;\n  min-width: 0;\n}\n.bt-repository-nav > button,\n.bt-repository-nav details button {\n  background: none;\n  border: 0;\n  color: var(--hu-muted);\n  padding: 8px;\n  font-size: 12px;\n  text-align: start;\n  cursor: pointer;\n  border-radius: 6px;\n  display: flex;\n  align-items: center;\n  gap: 10px;\n}\n.bt-repository-nav > p {\n  font-size: 12px;\n  color: var(--hu-muted);\n  margin: 18px 8px 6px;\n}\n.bt-repository-nav details {\n  margin: 0 4px;\n  font-size: 12px;\n  color: var(--hu-muted);\n}\n.bt-repository-nav summary {\n  padding: 8px 4px;\n  cursor: pointer;\n}\n.bt-repository-nav details > div {\n  padding-inline-start: 14px;\n  border-inline-start: 1px solid var(--hu-line);\n  margin-inline-start: 10px;\n}\n.bt-repository-nav details button {\n  font-size: 11px;\n  width: 100%;\n  line-height: 17px;\n  padding: 6px 8px;\n}\n.bt-repository-nav details button[aria-current='page'] {\n  background: var(--hu-line);\n  color: var(--hu-text);\n}\n.bt-repository-nav button:hover {\n  background: var(--hu-line);\n}\n@container helios-template (max-width: 1200px) {\n  .bt-shell {\n    grid-template-columns: 230px minmax(0, 1fr);\n    gap: 12px;\n  }\n  .bt-ai-workspace {\n    grid-template-columns: minmax(0, 1fr) 340px;\n  }\n  .bt-sidebar > nav > button {\n    font-size: 12px;\n  }\n  .bt-tiles {\n    gap: 10px;\n  }\n  .bt-tile {\n    padding: 14px;\n  }\n  .bt-tile strong {\n    font-size: 22px;\n  }\n  .bt-grid-three {\n    gap: 12px;\n  }\n  .bt-hires {\n    grid-template-columns: 1fr;\n  }\n  .bt-hires article:nth-child(n + 3) {\n    display: none;\n  }\n  .bt-mini-stats {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n  }\n  .bt-progress-list li {\n    grid-template-columns: 76px minmax(0, 1fr) auto;\n    gap: 7px;\n    font-size: 11px;\n  }\n  .bt-progress-list strong {\n    font-size: 11px;\n  }\n  .bt-data-section > header {\n    flex-wrap: wrap;\n  }\n  .bt-data-section > header > div:last-child {\n    flex-wrap: wrap;\n    width: 100%;\n  }\n  .bt-data-section > header .hu-field {\n    flex: 1;\n    min-width: 120px;\n  }\n  .bt-template-multi-agent-chat .hp-multi-chat {\n    grid-template-columns: 210px minmax(0, 1fr);\n  }\n  .bt-multi-workspace {\n    grid-template-columns: minmax(0, 1fr) 290px;\n  }\n  .bt-collapsed {\n    grid-template-columns: 76px minmax(0, 1fr);\n  }\n}\n@container helios-template (max-width: 1024px) {\n  .bt-tiles {\n    grid-template-columns: repeat(4, minmax(0, 1fr));\n  }\n  .bt-grid-three {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n  }\n  .bt-grid-three > section:last-child {\n    grid-column: 1/-1;\n  }\n  .bt-grid-two {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n  }\n  .bt-dashboard-top {\n    grid-template-columns: 1fr;\n  }\n  .bt-hires {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n  }\n  .bt-hires article:nth-child(n + 3) {\n    display: block;\n  }\n  .bt-grid-three > .bt-panel:last-child .bt-radar {\n    height: 230px;\n  }\n  .bt-ai-workspace {\n    grid-template-columns: minmax(0, 1fr) 290px;\n  }\n  .bt-template-composer .hp-composer-toolbar {\n    flex-wrap: wrap;\n  }\n  .bt-template-composer .hp-composer-toolbar .hu-field {\n    max-width: 120px;\n    width: 120px;\n  }\n  .bt-template-multi-agent-chat .hp-multi-chat {\n    grid-template-columns: 190px minmax(0, 1fr);\n  }\n  .bt-multi-workspace {\n    grid-template-columns: minmax(0, 1fr) 260px;\n  }\n  .bt-calendar-cell {\n    min-height: 115px;\n  }\n  .bt-kanban {\n    grid-auto-columns: 245px;\n  }\n}\n@container helios-template (max-width: 760px) {\n  .bt-tiles {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n  }\n  .bt-shell,\n  .bt-collapsed {\n    display: block;\n    padding: 10px;\n  }\n  .bt-sidebar {\n    position: relative;\n    top: 0;\n    height: auto;\n    border-radius: 16px;\n    padding: 12px;\n    margin-bottom: 16px;\n    display: grid;\n    grid-template-columns: 1fr auto;\n    gap: 10px;\n  }\n  .bt-sidebar-brand {\n    padding: 0;\n    grid-column: 1/-1;\n  }\n  .bt-sidebar-brand button:first-of-type {\n    font-size: 13px;\n  }\n  .bt-sidebar-brand button:last-child {\n    display: none;\n  }\n  .bt-sidebar > .hu-field {\n    grid-column: 1/-1;\n    margin: 0;\n  }\n  .bt-sidebar > nav {\n    display: flex;\n    overflow: auto;\n    grid-column: 1/-1;\n    max-width: 100%;\n    gap: 4px;\n    padding-bottom: 4px;\n  }\n  .bt-sidebar > nav > button {\n    white-space: nowrap;\n    flex-shrink: 0;\n    min-height: 34px;\n    padding: 7px 9px;\n    font-size: 11px;\n  }\n  .bt-sidebar > nav > button > .bt-icon {\n    width: 16px;\n    height: 16px;\n  }\n  .bt-sidebar-bottom {\n    display: none;\n  }\n  .bt-sidebar > .bt-repository-nav {\n    grid-column: 1/-1;\n    display: flex;\n    gap: 6px;\n    overflow: auto;\n    max-height: 100px;\n  }\n  .bt-repository-nav > p {\n    display: none;\n  }\n  .bt-repository-nav > button {\n    white-space: nowrap;\n  }\n  .bt-repository-nav details {\n    min-width: 160px;\n  }\n  .bt-repository-nav details > div {\n    display: flex;\n    max-width: 100%;\n    overflow: auto;\n    border: 0;\n    margin-inline-start: 0;\n    padding-inline-start: 0;\n  }\n  .bt-repository-nav details button {\n    white-space: nowrap;\n    width: auto;\n    min-width: 110px;\n  }\n  .bt-root .bt-main {\n    padding: 0 !important;\n  }\n  .bt-breadcrumb {\n    font-size: 10px;\n    gap: 7px;\n    margin-bottom: 12px;\n  }\n  .bt-breadcrumb > span:nth-child(4),\n  .bt-breadcrumb > span:nth-child(5) {\n    display: none;\n  }\n  .bt-page-heading {\n    align-items: flex-start;\n    flex-wrap: wrap;\n    gap: 12px;\n    margin-bottom: 14px;\n  }\n  .bt-page-heading h1 {\n    font-size: 20px;\n  }\n  .bt-page-heading > div {\n    gap: 7px;\n  }\n  .bt-page-heading .hu-button {\n    font-size: 11px !important;\n    min-height: 32px;\n  }\n  .bt-grid-three,\n  .bt-grid-two,\n  .bt-dashboard-top {\n    grid-template-columns: 1fr;\n    gap: 12px;\n  }\n  .bt-grid-three > section:last-child {\n    grid-column: auto;\n  }\n  .bt-panel {\n    padding: 14px;\n    border-radius: 16px;\n  }\n  .bt-tile {\n    padding: 13px;\n    border-radius: 16px;\n    gap: 7px;\n  }\n  .bt-tile > span:nth-child(2) {\n    font-size: 11px;\n  }\n  .bt-tile strong {\n    font-size: 23px;\n  }\n  .bt-tile small {\n    font-size: 9px;\n  }\n  .bt-tile-icon {\n    width: 28px;\n    height: 28px;\n  }\n  .bt-tile-icon .bt-icon {\n    width: 18px;\n    height: 18px;\n  }\n  .bt-person small {\n    max-width: 150px;\n  }\n  .bt-hires > article {\n    padding: 10px;\n  }\n  .bt-paging .hu-button {\n    font-size: 11px;\n  }\n  .bt-data-section > header {\n    padding: 14px;\n    gap: 12px;\n  }\n  .bt-data-section > header > div:last-child {\n    gap: 10px;\n  }\n  .bt-data-section > header .hu-field {\n    min-width: calc(50% - 10px);\n    max-width: 100%;\n    flex: 1;\n  }\n  .bt-data-section .hu-table-toolbar {\n    flex-wrap: wrap;\n  }\n  .bt-mini-stats {\n    gap: 7px;\n  }\n  .bt-mini-stats > span {\n    padding: 9px;\n  }\n  .bt-mini-stats small {\n    font-size: 9px;\n  }\n  .bt-sankey {\n    height: 260px;\n  }\n  .bt-note {\n    font-size: 10px;\n    line-height: 17px;\n  }\n  .bt-month-controls {\n    min-width: 185px;\n    gap: 10px;\n  }\n  .bt-month-controls strong {\n    font-size: 12px;\n  }\n  .bt-calendar {\n    border-radius: 16px;\n    padding: 8px;\n  }\n  .bt-calendar-cell {\n    min-height: 110px;\n  }\n  .bt-calendar-week,\n  .bt-calendar-row {\n    min-width: 0;\n    gap: 5px;\n  }\n  .bt-kanban {\n    grid-auto-columns: 240px;\n    min-height: 600px;\n  }\n  .bt-filter-bar {\n    flex-wrap: wrap;\n    padding: 12px;\n    gap: 12px;\n  }\n  .bt-filter-bar .hu-field {\n    max-width: none;\n    flex: 1 1 160px;\n  }\n  .bt-detail {\n    grid-template-columns: 1fr;\n    gap: 7px;\n  }\n  .bt-example-note {\n    line-height: 17px;\n  }\n  .bt-profile-facts {\n    font-size: 12px;\n  }\n  .bt-chat-starter {\n    min-height: 750px;\n    height: calc(var(--bt-viewport-height,100dvh) - 200px);\n    border-radius: 18px;\n    padding: 16px 12px;\n  }\n  .bt-chat-starter > header {\n    align-items: flex-start;\n    flex-wrap: wrap;\n  }\n  .bt-chat-starter > header > .hu-button {\n    font-size: 11px;\n  }\n  .bt-chat-starter > header > div .hu-button {\n    font-size: 10px;\n    min-height: 28px;\n    padding: 0 8px;\n  }\n  .bt-provider-card {\n    padding: 20px;\n    width: 100%;\n    max-width: 450px;\n  }\n  .bt-provider-card p,\n  .bt-provider-card ol {\n    font-size: 12px;\n    line-height: 19px;\n  }\n  .bt-message-log {\n    padding: 20px 2px;\n    gap: 12px;\n  }\n  .bt-message-log > article {\n    font-size: 12px;\n    max-width: 95%;\n    padding: 12px;\n  }\n  .bt-template-composer .hp-composer-card textarea {\n    min-height: 70px;\n    font-size: 12px;\n  }\n  .bt-template-composer .hp-composer-toolbar {\n    gap: 8px;\n    flex-wrap: wrap;\n  }\n  .bt-template-composer .hp-composer-toolbar > div {\n    flex: 1;\n    flex-wrap: wrap;\n    gap: 8px;\n  }\n  .bt-template-composer .hp-composer-toolbar .hu-field {\n    width: 100px;\n    max-width: 120px;\n  }\n  .bt-template-composer .hp-composer-toolbar .hu-field select {\n    font-size: 10px;\n  }\n  .bt-ai-workspace {\n    display: flex;\n    flex-direction: column;\n    height: auto;\n    gap: 16px;\n  }\n  .bt-ai-conversation {\n    min-height: 650px;\n    height: calc(var(--bt-viewport-height,100dvh) - 200px);\n    border-radius: 18px;\n  }\n  .bt-ai-conversation > header {\n    gap: 10px;\n    font-size: 10px;\n    align-items: flex-start;\n    flex-wrap: wrap;\n  }\n  .bt-ai-conversation > header > div .hu-button {\n    font-size: 10px;\n    min-height: 26px;\n  }\n  .bt-ai-panel {\n    max-height: none;\n    padding: 12px;\n    border: 1px solid var(--hu-line);\n    border-radius: 16px;\n  }\n  .bt-ai-panel .hu-tabs [role='tab'] {\n    font-size: 12px;\n  }\n  .bt-image-gallery {\n    columns: 3;\n    column-gap: 7px;\n  }\n  .bt-image-gallery img {\n    min-height: 70px;\n  }\n  .bt-image-gallery > button > span {\n    font-size: 8px;\n    padding: 5px;\n  }\n  .bt-code-browser {\n    padding: 4px;\n  }\n  .bt-profile-cover {\n    height: 140px;\n  }\n  .bt-profile-body {\n    padding: 0 12px 12px;\n  }\n  .bt-profile-actions .bt-large-avatar {\n    width: 72px;\n    height: 72px;\n    font-size: 26px;\n  }\n  .bt-profile-actions {\n    gap: 12px;\n    margin-top: -36px;\n  }\n  .bt-profile-actions > div {\n    gap: 6px;\n  }\n  .bt-profile-actions .hu-button {\n    font-size: 11px;\n    min-height: 30px;\n    padding-inline: 8px;\n  }\n  .bt-profile-body > h1 {\n    font-size: 20px;\n  }\n  .bt-profile-body > p {\n    font-size: 12px;\n  }\n  .bt-profile-activity-heading {\n    flex-wrap: wrap;\n    font-size: 11px;\n  }\n  .bt-period-buttons {\n    gap: 8px;\n  }\n  .bt-period-buttons > button {\n    font-size: 11px;\n  }\n  .bt-template-multi-agent-chat .bt-shell {\n    padding: 10px;\n  }\n  .bt-multi-workspace {\n    display: block;\n    min-height: 0;\n  }\n  .bt-multi-main > .hp-multi-chat {\n    min-height: 650px;\n  }\n  .bt-multi-main > .hp-multi-chat > aside {\n    border-inline-end: 0;\n    border-bottom: 1px solid var(--hu-line);\n  }\n  .bt-agent-editor {\n    max-height: none;\n    border: 1px solid var(--hu-line);\n    border-radius: 16px;\n    padding: 16px;\n    margin-top: 16px;\n  }\n  .bt-multi-top {\n    padding-bottom: 12px;\n  }\n  .bt-agent-editor .hp-agent-creator .hp-avatar {\n    max-width: 220px;\n  }\n  .bt-multi-main .hp-multi-chat {\n    display: block;\n  }\n  .bt-multi-main .hp-multi-chat > aside {\n    max-height: 240px;\n    overflow: auto;\n  }\n  .bt-multi-main .hp-multi-conversation {\n    min-height: 520px;\n  }\n  .bt-multi-main .hp-multi-conversation > div[role='log'] {\n    min-height: 270px;\n  }\n}\n@media (prefers-reduced-motion: reduce) {\n  .bt-root * {\n    animation: none !important;\n    transition: none !important;\n  }\n}\n.bt-sidebar > nav > a {\n  display: flex;\n  gap: 10px;\n  align-items: center;\n  color: var(--hu-muted);\n  text-decoration: none;\n  font-size: 13px;\n  padding: 10px;\n}\n.bt-workspace-notice {\n  position: fixed;\n  bottom: 20px;\n  left: 50%;\n  transform: translateX(-50%);\n  z-index: 100;\n  background: var(--hu-bg);\n  border: 1px solid var(--hu-line);\n  border-radius: 10px;\n  padding: 12px;\n  font-size: 12px;\n  max-width: calc(100% - 32px);\n  box-shadow: 0 3px 15px #0002;\n}\n.bt-grid-two > .hc-react-card,\n.bt-grid-three > .hc-react-card,\n.bt-dashboard-top > .hc-react-card {\n  background: var(--hu-bg-secondary);\n  border: 0;\n  border-radius: 18px;\n  padding: 16px;\n}\n.bt-root .hc-react-card .hu-example-heading {\n  gap: 12px;\n  align-items: flex-start;\n}\n.bt-root .hc-react-card .hu-example-heading h3 {\n  font-size: 13px;\n  font-weight: 400;\n  color: var(--hu-muted);\n}\n.bt-root .hc-react-card .hu-example-heading p {\n  font-size: 9px;\n  line-height: 14px;\n}\n.bt-root .hc-react-card .hu-example-heading > .hu-field {\n  width: 120px;\n  min-width: 100px;\n}\n.bt-root .hc-react-card .hu-example-heading > .hu-field > label {\n  font-size: 9px;\n}\n.bt-root .hc-react-card .hu-chart-total {\n  font-size: 25px;\n  line-height: 32px;\n  font-weight: 500;\n  margin-block: 10px;\n}\n.bt-root .hc-react-card .hc-react-legend {\n  font-size: 10px;\n}\n.bt-root .hc-react-card .hc-react-legend .hu-checkbox {\n  font-size: 10px;\n}\n.bt-root .hc-react-card .hc-react-legend input {\n  width: 14px;\n  height: 14px;\n}\n.bt-root .hc-react-card .hc-react-inspection {\n  font-size: 9px;\n}\n.bt-root .hc-react-card details {\n  font-size: 10px;\n}\n.bt-root .hc-react-card > p[role='status'] {\n  font-size: 10px;\n  color: var(--hu-muted);\n}\n.bt-gauge:before,\n.bt-gauge:after {\n  display: none;\n}\n.bt-gauge > svg {\n  display: block;\n  width: 100%;\n  height: auto;\n}\n.bt-gauge > strong {\n  inset: 82px 0 auto;\n}\n/* Keep links identifiable when a host resets browser anchor decoration. */\n.bt-example-note a {\n  text-decoration: underline;\n  text-underline-offset: 3px;\n}\n\n/* Compact source-like template anatomy; full inspection stays in disclosures. */\n.bt-mobile-menu {\n  display: none;\n}\n.bt-root .bt-person .bt-avatar {\n  width: 30px;\n  height: 30px;\n}\n.bt-root .bt-data-section > header {\n  padding: 10px 12px;\n  gap: 12px;\n}\n.bt-root .hu-table-card .hu-table-toolbar .hu-field > label {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  overflow: hidden;\n  clip-path: inset(50%);\n  white-space: nowrap;\n}\n.bt-root .hu-table-card .hu-table-toolbar .hu-input-wrap {\n  height: 30px;\n}\n.bt-root .hu-table-card .hu-table-toolbar .hu-button {\n  min-height: 30px;\n  font-size: 11px;\n}\n.bt-root .hu-table-card .hu-table-footer {\n  padding: 8px 12px;\n}\n.bt-root .bt-data-section > header .hu-field label {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  overflow: hidden;\n  clip-path: inset(50%);\n  white-space: nowrap;\n}\n.bt-root .bt-data-section > header .hu-input-wrap {\n  height: 30px;\n}\n.bt-root .bt-data-section > header .hu-field {\n  width: 130px;\n}\n.bt-root .bt-calendar-cell {\n  border-radius: 8px;\n}\n.bt-mobile-panel {\n  max-height: 72dvh;\n  overflow: auto;\n}\n.bt-mobile-panel.bt-agent-editor {\n  margin: 0;\n  padding: 0;\n  border: 0;\n}\n.bt-mobile-panel.bt-agent-editor > header {\n  display: none;\n}\n.bt-mobile-panel.bt-ai-panel {\n  padding: 0;\n  border: 0;\n}\n@container helios-template (min-width: 1100px) {\n  .bt-data-section {\n    display: grid;\n    grid-template-columns: minmax(0, 1fr) 260px;\n  }\n  .bt-data-section > header {\n    grid-area: 1 / 1 / 2 / 2;\n  }\n  .bt-data-section > .hu-table-card {\n    display: contents;\n  }\n  .bt-data-section .hu-table-toolbar {\n    grid-area: 1 / 2 / 2 / 3;\n    border-top: 0 !important;\n    border-bottom: 0 !important;\n    gap: 6px;\n  }\n  .bt-data-section .hu-table-toolbar .hu-field {\n    min-width: 0;\n    flex: 1;\n  }\n  .bt-data-section .hu-table-toolbar .hu-input-wrap {\n    padding-inline: 7px;\n  }\n  .bt-data-section .hu-table-toolbar input {\n    font-size: 11px;\n  }\n  .bt-data-section .hu-table-scroll,\n  .bt-data-section .hu-table-footer {\n    grid-column: 1 / -1;\n  }\n}\n@container helios-template (max-width: 760px) {\n  .bt-shell {\n    position: relative;\n  }\n  .bt-sidebar {\n    display: none;\n  }\n  .bt-mobile-nav-open .bt-sidebar {\n    display: grid;\n    position: absolute;\n    z-index: 15;\n    top: 46px;\n    inset-inline-start: 10px;\n    width: calc(100% - 20px);\n    max-height: 80dvh;\n    overflow-y: auto;\n    box-shadow: 0 16px 36px #0002;\n  }\n  .bt-mobile-nav-open .bt-sidebar > nav {\n    display: grid;\n    overflow: visible;\n  }\n  .bt-mobile-nav-open .bt-sidebar-bottom {\n    display: grid;\n    grid-column: 1 / -1;\n  }\n  .bt-mobile-nav-open .bt-sidebar > .bt-repository-nav {\n    display: block;\n    max-height: none;\n  }\n  .bt-mobile-menu {\n    display: grid;\n    place-items: center;\n    flex-shrink: 0;\n    width: 30px;\n    height: 30px;\n    border: 1px solid var(--hu-line);\n    border-radius: 7px;\n    background: var(--hu-bg);\n    color: var(--hu-text);\n    font-size: 18px;\n    cursor: pointer;\n  }\n  .bt-breadcrumb > span:nth-of-type(n + 3) {\n    display: none;\n  }\n  .bt-template-chat-starter .bt-breadcrumb,\n  .bt-template-ai-chat .bt-breadcrumb,\n  .bt-template-ai-image-generation .bt-breadcrumb {\n    display: flex;\n  }\n  .bt-ai-workspace > h1 {\n    position: static;\n    width: auto;\n    height: auto;\n    clip: auto;\n    overflow: visible;\n    white-space: normal;\n    margin: 0 0 12px;\n    font-size: 20px;\n    font-weight: 500;\n  }\n  .bt-ai-workspace {\n    display: block;\n  }\n  .bt-calendar-week,\n  .bt-calendar-row {\n    gap: 3px;\n    min-width: 0;\n  }\n  .bt-calendar-cell {\n    min-height: 115px;\n    padding: 3px;\n    gap: 3px;\n  }\n  .bt-calendar-week {\n    font-size: 10px;\n    padding-bottom: 8px;\n  }\n  .bt-calendar-cell > button {\n    font-size: 10px;\n  }\n  .bt-event {\n    font-size: 8px;\n    padding: 2px;\n  }\n  .bt-event small {\n    display: none;\n  }\n  .bt-data-section > header {\n    align-items: start;\n  }\n  .bt-root .bt-data-section > header .hu-field {\n    width: auto;\n  }\n  .bt-root .hu-table-card td {\n    padding: 7px;\n  }\n  .bt-profile-cover {\n    height: 160px;\n  }\n}\n.bt-root .bt-inline-select {\n  min-width: 105px;\n  max-width: 150px;\n}\n.bt-root .bt-inline-select > label {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  overflow: hidden;\n  clip-path: inset(50%);\n  white-space: nowrap;\n}\n.bt-root .hu-table-card .bt-inline-select .hu-input-wrap {\n  height: 28px;\n  padding-inline: 6px;\n  border-radius: 6px;\n}\n.bt-root .bt-inline-select select {\n  font-size: 11px;\n}\n.bt-root .hu-dialog:has(.bt-mobile-panel)::backdrop {\n  backdrop-filter: blur(4px);\n  background: #00000020;\n}\n.bt-mobile-panel .hp-agent-creator > h3 {\n  display: none;\n}\n.bt-template-dashboard .bt-heatmap-grid,\n.bt-template-ai-profile .bt-heatmap-grid {\n  gap: 3px;\n}\n.bt-template-dashboard .bt-heatmap-grid button,\n.bt-template-ai-profile .bt-heatmap-grid button {\n  min-width: 0;\n  min-height: 5px;\n}\n@container helios-template (max-width: 760px) {\n  .bt-ai-workspace > h1 {\n    clip-path: none;\n  }\n}\n/* Live reference follow-up: compact cards, real menus and rich detail surfaces. */\n.bt-control-popover {\n  min-width: 240px;\n  max-width: min(350px, calc(100vw - 24px));\n  padding: 12px;\n}\n.bt-control-popover [role='dialog'] {\n  outline: none;\n}\n.bt-row-actions {\n  display: flex;\n  align-items: center;\n  gap: 5px;\n  white-space: nowrap;\n}\n.bt-root .hu-table-card td .bt-row-actions .hu-button {\n  min-width: 28px;\n  width: 28px;\n  height: 28px;\n  min-height: 28px;\n  padding: 4px;\n  border-radius: 7px;\n}\n.bt-row-actions .bt-icon {\n  width: 15px;\n  height: 15px;\n}\n.bt-row-actions .hb-menu-trigger,\n.bt-column-actions .hb-menu-trigger {\n  font-size: 0 !important;\n}\n.bt-row-actions .hb-menu-trigger::before,\n.bt-column-actions .hb-menu-trigger::before {\n  content: '⋮';\n  font-size: 17px;\n  line-height: 18px;\n}\n.bt-row-actions .hb-menu-trigger > span,\n.bt-column-actions .hb-menu-trigger > span {\n  display: none;\n}\n.bt-root .bt-status-message:empty {\n  display: none;\n}\n.bt-example-note {\n  padding: 8px 0;\n}\n.bt-template-project-board .bt-kanban {\n  height: calc(var(--bt-viewport-height,100dvh) - 144px);\n  min-height: 480px;\n  align-items: stretch;\n}\n.bt-kanban-fill {\n  grid-auto-columns: minmax(180px, 1fr);\n}\n.bt-kanban-column {\n  transition:\n    outline-color 150ms,\n    background-color 150ms;\n  outline: 2px solid transparent;\n  outline-offset: -2px;\n}\n.bt-kanban-column[data-drag-over='true'] {\n  outline-color: var(--hu-brand-text);\n  background: color-mix(in srgb, var(--hu-brand), var(--hu-bg) 94%);\n}\n.bt-column-actions {\n  display: flex;\n  align-items: center;\n  gap: 3px;\n}\n.bt-column-actions .hb-menu-trigger {\n  width: 24px;\n  min-width: 24px;\n  height: 24px;\n  min-height: 24px;\n  padding: 2px;\n  border: 0;\n  background: none;\n  box-shadow: none;\n}\n.bt-column-actions > button {\n  border: 0;\n  background: none;\n  color: var(--hu-muted);\n  font: inherit;\n  font-size: 20px;\n  line-height: 24px;\n  padding: 0 2px;\n  cursor: pointer;\n}\n.bt-kanban-column h2 > span {\n  margin-inline-start: 5px;\n  font-size: 11px;\n}\n.bt-task {\n  border-radius: 10px;\n  transition:\n    border-color 140ms,\n    box-shadow 140ms,\n    opacity 140ms;\n}\n.bt-task:hover {\n  border-color: color-mix(in srgb, var(--hu-brand), var(--hu-line) 70%);\n  box-shadow: 0 2px 6px #0000000a;\n}\n.bt-task[data-dragging='true'] {\n  opacity: 0.45;\n}\n.bt-task-open {\n  padding: 9px;\n  gap: 5px;\n}\n.bt-task-open h3 {\n  font-size: 12px;\n  line-height: 17px;\n}\n.bt-task-open > small {\n  font-size: 10px;\n}\n.bt-ticket-top {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 5px;\n  min-width: 0;\n}\n.bt-ticket-top > span:first-child {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.bt-ticket-assignees {\n  display: flex;\n  align-items: center;\n  flex-shrink: 0;\n}\n.bt-ticket-assignees .bt-person {\n  display: block;\n}\n.bt-ticket-assignees .bt-person > span {\n  display: none;\n}\n.bt-root .bt-ticket-assignees .bt-person .bt-avatar {\n  width: 20px;\n  height: 20px;\n}\n.bt-task-labels .bt-chip,\n.bt-task-labels .bt-status {\n  font-size: 9px;\n  padding: 1px 4px;\n}\n.bt-column-empty {\n  font-size: 11px;\n  color: var(--hu-muted);\n  padding: 8px;\n}\n.bt-board-announcement {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  overflow: hidden;\n  clip-path: inset(50%);\n  white-space: nowrap;\n}\n.bt-root .hu-dialog:has(.bt-ticket-layout) {\n  width: min(1000px, calc(100vw - 28px));\n  max-width: none;\n}\n.bt-ticket-layout {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr) 300px;\n  gap: 24px;\n  max-height: 65dvh;\n}\n.bt-ticket-properties {\n  min-width: 0;\n  overflow: auto;\n  padding-inline-end: 8px;\n  align-content: start;\n}\n.bt-ticket-new {\n  grid-template-columns: minmax(0, 1fr);\n}\n.bt-ticket-creator {\n  font-size: 11px;\n  color: var(--hu-muted);\n  margin: 0;\n}\n.bt-ticket-creator strong {\n  color: var(--hu-text);\n  font-weight: 500;\n}\n.bt-ticket-property-grid {\n  display: grid;\n  grid-template-columns: repeat(2, minmax(0, 1fr));\n  gap: 12px;\n}\n.bt-ticket-layout h3 {\n  font-size: 12px;\n  font-weight: 500;\n  color: var(--hu-muted);\n  margin: 3px 0;\n}\n.bt-native-field {\n  display: grid;\n  gap: 6px;\n  font-size: 12px;\n  color: var(--hu-text);\n}\n.bt-native-field textarea,\n.bt-ticket-comments textarea {\n  width: 100%;\n  padding: 9px 11px;\n  border: 1px solid var(--hu-line);\n  border-radius: 8px;\n  background: var(--hu-bg);\n  color: var(--hu-text);\n  font-family: inherit;\n  font-size: 12px;\n  line-height: 1.5;\n  resize: vertical;\n}\n.bt-ticket-resources {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 12px;\n}\n.bt-ticket-resources a {\n  color: var(--hu-brand-text);\n  text-decoration: underline;\n  font-size: 12px;\n  text-underline-offset: 3px;\n}\n.bt-ticket-comments {\n  border-inline-start: 1px solid var(--hu-line);\n  padding-inline-start: 18px;\n  min-width: 0;\n  display: flex;\n  flex-direction: column;\n  gap: 12px;\n  overflow: auto;\n}\n.bt-ticket-comments [role='log'] {\n  flex: 1;\n  display: grid;\n  align-content: start;\n  gap: 15px;\n  min-height: 160px;\n}\n.bt-ticket-comments article {\n  padding: 10px;\n  background: var(--hu-bg-secondary);\n  border-radius: 9px;\n}\n.bt-ticket-comments article header {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 10px;\n  font-size: 11px;\n}\n.bt-ticket-comments article strong {\n  font-weight: 500;\n}\n.bt-ticket-comments article small {\n  color: var(--hu-muted);\n  font-size: 9px;\n}\n.bt-ticket-comments article p {\n  font-size: 12px;\n  line-height: 19px;\n  margin: 8px 0 0;\n}\n.bt-ticket-comments form {\n  display: grid;\n  gap: 8px;\n  font-size: 11px;\n}\n.bt-ticket-comments form > button {\n  justify-self: end;\n}\n.bt-inbox-list {\n  display: grid;\n  gap: 8px;\n}\n.bt-inbox-list > button {\n  justify-content: flex-start;\n  white-space: normal;\n  text-align: start;\n}\n.bt-channel-legend {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: center;\n  gap: 5px 10px;\n  margin: 6px 0 0;\n}\n.bt-channel-legend > span {\n  display: inline-flex;\n  align-items: center;\n  gap: 4px;\n  font-size: 9px;\n  color: var(--hu-muted);\n}\n.bt-channel-legend i {\n  width: 6px;\n  height: 6px;\n  border-radius: 2px;\n}\n.bt-channel-legend strong {\n  color: var(--hu-text);\n  font-weight: 500;\n}\n.bt-profile-history {\n  background: var(--hu-bg-secondary);\n  border-radius: 14px;\n  padding: 12px;\n  min-width: 0;\n  margin-bottom: 12px;\n}\n.bt-profile-history > header {\n  display: flex;\n  align-items: start;\n  justify-content: space-between;\n  gap: 12px;\n  margin-bottom: 8px;\n}\n.bt-profile-history h2 {\n  font-size: 12px;\n  color: var(--hu-muted);\n  font-weight: 400;\n  margin: 0;\n  line-height: 18px;\n}\n.bt-profile-history header strong {\n  font-size: 20px;\n  line-height: 26px;\n  font-weight: 500;\n}\n.bt-profile-history-plot {\n  min-width: 0;\n  height: 150px;\n}\n.bt-profile-history-axis {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  color: var(--hu-muted);\n  font-size: 9px;\n  margin-top: 5px;\n}\n.bt-profile-history details {\n  font-size: 10px;\n  color: var(--hu-muted);\n  margin-top: 5px;\n}\n.bt-profile-history summary {\n  cursor: pointer;\n}\n.bt-profile-history table {\n  border-collapse: collapse;\n  width: 100%;\n  font-size: 11px;\n}\n.bt-profile-history th,\n.bt-profile-history td {\n  text-align: start;\n  padding: 5px;\n  border-bottom: 1px solid var(--hu-line);\n}\n.bt-profile-history .hu-table-scroll {\n  max-height: 190px;\n  margin-top: 8px;\n}\n.bt-template-ai-profile .bt-main {\n  padding-top: 0 !important;\n  position: relative;\n}\n.bt-template-ai-profile .bt-breadcrumb {\n  position: absolute;\n  min-height: 0;\n  height: 0;\n  margin: 0;\n  pointer-events: none;\n  z-index: 3;\n}\n.bt-template-ai-profile .bt-breadcrumb > * {\n  display: none;\n}\n.bt-template-ai-profile .bt-profile-cover {\n  height: 160px;\n}\n.bt-template-ai-profile .bt-mini-stats > span {\n  background: var(--hu-bg-secondary);\n  padding: 8px;\n}\n.bt-template-ai-profile .bt-profile-activity-heading {\n  margin: 10px 0 6px;\n}\n.bt-template-ai-profile .bt-profile-body {\n  padding-bottom: 10px;\n}\n.bt-template-ai-profile .bt-heatmap {\n  margin-top: 7px;\n}\n.bt-template-ai-profile .bt-heatmap-grid {\n  gap: 3px;\n}\n.bt-root .hu-dialog[open] {\n  animation: bt-dialog-enter 180ms ease-out;\n}\n@keyframes bt-dialog-enter {\n  from {\n    opacity: 0;\n    transform: translateY(7px) scale(0.985);\n  }\n  to {\n    opacity: 1;\n    transform: none;\n  }\n}\n.bt-event-popover {\n  width: 320px;\n  max-width: calc(100vw - 20px);\n  background: var(--hu-bg, #fff);\n  color: var(--hu-text, #171717);\n  border: 1px solid var(--hu-line, #e5e5e5);\n  border-radius: 15px;\n  padding: 16px;\n  box-shadow: 0 12px 36px #00000020;\n  outline: none;\n}\n.bt-event-popover [role='dialog'] {\n  outline: none;\n}\n.bt-event-popover header {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 10px;\n}\n.bt-event-popover h2 {\n  font-size: 17px;\n  line-height: 24px;\n  font-weight: 500;\n  margin: 0;\n}\n.bt-event-popover h3 {\n  font-size: 11px;\n  color: var(--hu-muted);\n  font-weight: 500;\n  margin: 16px 0 8px;\n}\n.bt-event-popover p {\n  font-size: 12px;\n  margin: 7px 0;\n}\n.bt-meeting-date,\n.bt-meeting-zone {\n  color: var(--hu-muted);\n}\n.bt-meeting-link {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 10px;\n  padding: 10px;\n  border: 1px solid var(--hu-line);\n  border-radius: 9px;\n  margin: 16px 0;\n}\n.bt-meeting-link > span {\n  display: grid;\n  gap: 3px;\n  font-size: 12px;\n  min-width: 0;\n}\n.bt-meeting-link strong {\n  font-weight: 500;\n}\n.bt-meeting-link small {\n  color: var(--hu-muted);\n  font-size: 10px;\n  overflow-wrap: anywhere;\n}\n.bt-meeting-time {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  font-size: 13px;\n}\n.bt-meeting-time strong {\n  font-size: 20px;\n  font-weight: 500;\n}\n.bt-meeting-time > span {\n  color: var(--hu-muted);\n}\n.bt-meeting-participants {\n  display: grid;\n  gap: 7px;\n  list-style: none;\n  padding: 0;\n  margin: 0;\n}\n.bt-meeting-participants li {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  font-size: 12px;\n}\n.bt-meeting-participants .bt-user-mark {\n  width: 25px;\n  height: 25px;\n  font-size: 12px;\n}\n.bt-event-popover footer {\n  display: flex;\n  justify-content: space-between;\n  gap: 10px;\n  border-top: 1px solid var(--hu-line);\n  padding-top: 12px;\n  margin-top: 12px;\n}\n.bt-event-popover[data-entering] {\n  animation: bt-dialog-enter 180ms ease-out;\n}\n.bt-event-popover[data-exiting] {\n  animation: bt-dialog-enter 140ms ease-in reverse;\n}\n.bt-form-error {\n  color: var(--hu-error);\n  font-size: 12px;\n}\n@container helios-template (max-width: 760px) {\n  .bt-template-ai-profile .bt-breadcrumb .bt-mobile-menu {\n    display: grid;\n    position: absolute;\n    top: 10px;\n    inset-inline-start: 10px;\n    pointer-events: auto;\n  }\n  .bt-ticket-layout {\n    grid-template-columns: 1fr;\n    max-height: none;\n  }\n  .bt-ticket-comments {\n    border-inline-start: 0;\n    border-top: 1px solid var(--hu-line);\n    padding: 16px 0 0;\n    max-height: 400px;\n  }\n  .bt-ticket-properties {\n    overflow: visible;\n    padding: 0;\n  }\n  .bt-root .hu-dialog:has(.bt-ticket-layout) {\n    max-height: 90dvh;\n  }\n  .bt-ticket-property-grid {\n    gap: 10px;\n  }\n  .bt-template-project-board .bt-kanban {\n    height: calc(var(--bt-viewport-height,100dvh) - 180px);\n    min-height: 480px;\n  }\n  .bt-profile-history header strong {\n    font-size: 18px;\n  }\n  .bt-profile-history .bt-month-controls {\n    min-width: 150px;\n    gap: 5px;\n  }\n}\n@media (prefers-reduced-motion: reduce) {\n  .bt-root .hu-dialog[open],\n  .bt-event-popover[data-entering],\n  .bt-event-popover[data-exiting] {\n    animation: none !important;\n  }\n}\n/* Keep rich ticket body scroll zones inside the dialog, above its fixed footer. */\n.bt-ticket-layout:not(.bt-ticket-new) {\n  height: 65dvh;\n  grid-template-rows: minmax(0, 1fr);\n}\n.bt-ticket-properties,\n.bt-ticket-comments {\n  min-height: 0;\n  max-height: 100%;\n}\n.bt-root .hu-dialog[open]:has(.bt-ticket-layout) {\n  display: flex;\n  flex-direction: column;\n}\n.bt-root .hu-dialog:has(.bt-ticket-layout) > header,\n.bt-root .hu-dialog:has(.bt-ticket-layout) > footer {\n  flex: 0 0 auto;\n}\n.bt-root .hu-dialog:has(.bt-ticket-layout) > .hu-dialog-body {\n  min-height: 0;\n  overflow: hidden;\n}\n@container helios-template (max-width: 760px) {\n  .bt-ticket-layout:not(.bt-ticket-new) {\n    height: auto;\n    max-height: none;\n    grid-template-rows: auto;\n  }\n  .bt-root .hu-dialog:has(.bt-ticket-layout) > .hu-dialog-body {\n    overflow: auto;\n  }\n  .bt-ticket-properties,\n  .bt-ticket-comments {\n    max-height: none;\n  }\n}\n.bt-template-calendar .bt-status-message {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  overflow: hidden;\n  clip-path: inset(50%);\n  white-space: nowrap;\n}\n.bt-sidebar > nav > button,\n.bt-task-open,\n.bt-calendar-day {\n  transition:\n    color 140ms ease,\n    background-color 140ms ease,\n    border-color 140ms ease;\n}\n@media (prefers-reduced-motion: reduce) {\n  .bt-sidebar > nav > button,\n  .bt-task-open,\n  .bt-calendar-day {\n    transition: none !important;\n  }\n}\n/* React Aria overlays inherit the independent workspace theme without changing the host page. */\n.bt-shell {\n  position: relative;\n}\n.bt-portal-host {\n  position: absolute;\n  inset: 0;\n  pointer-events: none;\n  z-index: 80;\n}\n.bt-portal-host > * {\n  pointer-events: auto;\n}\n\n/* The audited BoardUI semantic palette drives template roles in both modes. */\n.bt-root,\n.bt-shell,\n.bt-root .bt-main {\n  background: var(--hu-page, var(--color-background-full));\n}\n.bt-panel,\n.bt-tile,\n.bt-kanban-column,\n.bt-profile-history {\n  background: var(--color-background-secondary-default);\n}\n.bt-task,\n.bt-profile-card,\n.bt-calendar-cell {\n  background: var(--color-background-primary-default);\n}\n.bt-outside-month {\n  background: var(--color-background-tertiary-default);\n}\n.bt-task:hover {\n  border-color: var(--color-border-button-hover);\n}\n.bt-hires article > span {\n  background: var(--color-background-recent-hire-role);\n}\n.bt-tile-icon {\n  background: var(--color-stat-card-icon-background);\n}\n.bt-user-mark,\n.bt-large-avatar {\n  background: var(--color-avatar-neutral-background);\n}\n.bt-root .hu-dialog:has(.bt-ticket-layout) {\n  background: var(--color-ticket-detail-surface);\n}\n.bt-ticket-resources a {\n  background: var(--color-ticket-detail-resource-background);\n  color: var(--color-ticket-detail-resource-text);\n  border-radius: 6px;\n  padding: 4px 8px;\n}\n.bt-ticket-comments article {\n  background: var(--color-background-secondary-default);\n}\n.bt-positive {\n  background: var(--color-status-lime-background);\n  color: var(--color-status-lime-text);\n}\n.bt-event {\n  background: var(--bt-event-background, var(--color-calendar-event-blue-background));\n  color: var(--bt-event-title, var(--color-calendar-event-blue-title));\n}\n.bt-event small {\n  color: var(--bt-event-time, var(--color-calendar-event-blue-time));\n}\n.bt-event-popover {\n  background: var(--color-background-primary-default);\n  border-color: var(--color-border-button-default);\n}\n.bt-event-blue {\n  --bt-event-background: var(--color-calendar-event-blue-background);\n  --bt-event-title: var(--color-calendar-event-blue-title);\n  --bt-event-time: var(--color-calendar-event-blue-time);\n}\n.bt-event-pink {\n  --bt-event-background: var(--color-calendar-event-pink-background);\n  --bt-event-title: var(--color-calendar-event-pink-title);\n  --bt-event-time: var(--color-calendar-event-pink-time);\n}\n.bt-event-purple {\n  --bt-event-background: var(--color-calendar-event-purple-background);\n  --bt-event-title: var(--color-calendar-event-purple-title);\n  --bt-event-time: var(--color-calendar-event-purple-time);\n}\n.bt-event-lime {\n  --bt-event-background: var(--color-calendar-event-lime-background);\n  --bt-event-title: var(--color-calendar-event-lime-title);\n  --bt-event-time: var(--color-calendar-event-lime-time);\n}\n.bt-event-emerald {\n  --bt-event-background: var(--color-calendar-event-emerald-background);\n  --bt-event-title: var(--color-calendar-event-emerald-title);\n  --bt-event-time: var(--color-calendar-event-emerald-time);\n}\n\n/* Bare content matches the public inline Calendar preview; overlays remain scoped. */\n.bt-root .bt-shell.bt-bare {\n  display: block;\n  grid-template-columns: minmax(0, 1fr);\n  min-height: 0;\n  padding: 0;\n  gap: 0;\n}\n.bt-root .bt-shell.bt-bare .bt-main {\n  padding: 0;\n  width: 100%;\n  min-width: 0;\n}\n\n.bt-calendar-more {\n  color: var(--hu-muted);\n  background: transparent;\n  border: 0;\n  padding: 1px 0;\n  min-height: 24px;\n  min-width: 0;\n  font-size: 10px;\n  line-height: 1.2;\n  text-align: start;\n  cursor: pointer;\n  align-self: flex-start;\n}\n.bt-calendar-more:hover { color: var(--hu-text); }\n.bt-calendar-more:focus-visible {\n  outline: 2px solid var(--hu-brand);\n  outline-offset: 2px;\n  border-radius: 3px;\n}\n\n@container helios-template (max-width: 1024px) {\n  .bt-template-medical-profile .bt-medical-grid > section:last-child {\n    grid-column: auto;\n  }\n}\n@container helios-template (max-width: 760px) {\n  .bt-template-marketing .bt-tiles {\n    grid-template-columns: minmax(0, 1fr);\n  }\n}\n\n/* TV01/TV02: application panes share the actual viewport after their own chrome. */\n.bt-template-calendar:has(.bt-calendar) .bt-shell,\n.bt-template-project-board:has(.bt-kanban) .bt-shell {\n  height: var(--bt-viewport-height,100dvh);\n  min-height: 0;\n}\n.bt-template-calendar:has(.bt-calendar) .bt-main,\n.bt-template-project-board:has(.bt-kanban) .bt-main {\n  height: 100%;\n  min-height: 0;\n  display: flex;\n  flex-direction: column;\n}\n.bt-template-calendar:has(.bt-calendar) .bt-page-content,\n.bt-template-project-board:has(.bt-kanban) .bt-page-content {\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 0;\n  min-height: 0;\n}\n.bt-template-calendar .bt-page-heading,\n.bt-template-project-board .bt-page-heading,\n.bt-template-calendar .bt-breadcrumb,\n.bt-template-project-board .bt-breadcrumb,\n.bt-template-calendar .bt-example-note,\n.bt-template-project-board .bt-example-note {\n  flex-shrink: 0;\n}\n.bt-root .bt-shell.bt-bare .bt-main {\n  padding: 0 !important;\n}\n.bt-template-calendar .bt-calendar {\n  display: grid;\n  grid-template-rows: auto repeat(6, minmax(min-content, 1fr));\n  flex: 1 1 0;\n  min-height: 0;\n  overflow: visible;\n}\n.bt-template-calendar .bt-calendar-cell {\n  min-height: 0;\n}\n.bt-template-calendar .bt-status-message {\n  top: 0;\n  inset-inline-start: 0;\n  margin: 0;\n}\n.bt-template-project-board .bt-kanban {\n  height: auto;\n  min-height: 0;\n  flex: 1 1 0;\n  grid-template-rows: minmax(0, 1fr);\n  overflow-x: auto;\n  overflow-y: hidden;\n}\n.bt-template-project-board .bt-kanban-column {\n  min-height: 0;\n  overflow-y: auto;\n}\n\n/* Resource fallbacks preserve local state, while hidden controls and portals remain inert. */\n.bt-root .bt-page-content[hidden],\n.bt-shell[data-template-suspended] .bt-portal-host { display: none !important; }\n\n.bt-calendar-feeds { display:flex; align-items:center; gap:8px; }\n.bt-calendar-tool { position:relative; display:grid; place-items:center; width:34px; height:34px; padding:7px; border:1px solid var(--hu-line); border-radius:8px; background:var(--hu-bg); color:var(--hu-text); cursor:pointer; }\n.bt-calendar-tool:hover { background:var(--hu-bg-secondary); }\n.bt-calendar-tool:focus-visible { outline:3px solid var(--hu-focus); outline-offset:2px; }\n.bt-calendar-tool i { position:absolute; top:-4px; inset-inline-end:-4px; min-width:15px; height:15px; border:2px solid var(--hu-bg); border-radius:999px; background:var(--color-red-600); color:var(--color-white); font-size:9px; font-style:normal; }\n.bt-calendar-inbox { width:280px; max-height:min(600px, calc(var(--bt-viewport-height,100dvh) - 40px)); overflow:auto; }\n.bt-calendar-inbox section { padding:8px 0; border-bottom:1px solid var(--hu-line); }\n.bt-calendar-inbox h3 { color:var(--hu-muted); font-size:12px; font-weight:400; margin:0 0 6px; }\n.bt-calendar-inbox section button { display:flex; align-items:center; gap:8px; width:100%; border:0; border-radius:7px; padding:7px; background:transparent; text-align:start; font-size:13px; color:var(--hu-text); cursor:pointer; }\n.bt-calendar-inbox section button:hover, .bt-calendar-inbox section button[aria-pressed=true] { background:var(--hu-bg-secondary); }\n.bt-calendar-inbox > [role=dialog] > .hu-button { width:100%; margin-top:10px; }\n.bt-feed-icon { display:grid; place-items:center; width:22px; height:22px; border-radius:5px; background:var(--color-calendar-event-blue-background); color:var(--color-calendar-event-blue-title); }\n.bt-feed-icon-1 { background:var(--color-calendar-event-pink-background); color:var(--color-calendar-event-pink-title); }\n.bt-feed-icon-2 { background:var(--color-calendar-event-lime-background); color:var(--color-calendar-event-lime-title); }\n.bt-feed-icon svg { width:14px; height:14px; }\n.bt-calendar-notifications { width:min(430px, calc(100vw - 28px)); max-width:calc(100vw - 28px); max-height:min(700px, calc(var(--bt-viewport-height,100dvh) - 40px)); overflow:auto; padding:4px; }\n\n.bt-starter-conversation { display:flex; flex-direction:column; flex:1; min-height:0; min-width:0; }\n.bt-chat-starter.bt-starter-history-open { display:grid; grid-template-columns:minmax(0,1fr) 260px; grid-template-rows:auto minmax(0,1fr); gap:12px; }\n.bt-starter-history-open > header { grid-column:1/-1; }\n.bt-chat-history { min-width:0; min-height:0; padding:14px; border:1px solid var(--hu-line); border-radius:12px; background:var(--hu-bg); display:flex; flex-direction:column; gap:12px; }\n.bt-chat-history header { display:flex; align-items:center; justify-content:space-between; gap:8px; }\n.bt-chat-history h2 { margin:0; font-size:14px; }\n.bt-chat-history-list { display:flex; flex-direction:column; gap:5px; overflow:auto; flex:1; min-height:100px; }\n.bt-chat-history-list .hu-button { justify-content:flex-start; text-align:start; white-space:normal; overflow-wrap:anywhere; }\n.bt-chat-history-list [aria-pressed=true] { background:var(--hu-bg-secondary); }\n.bt-message-actions { display:flex; flex-wrap:wrap; gap:4px; margin-top:8px; }\n.bt-message-actions .hu-button { font-size:11px; }\n.bt-chat-storage-note { margin:6px 4px 0; font-size:10px; }\n\n.bt-image-result { width:min(420px, 95%); }\n.bt-image-result > img { display:block; max-height:360px; width:100%; object-fit:contain; border-radius:12px; margin-top:10px; }\n.bt-image-countdown { min-height:200px; position:relative; display:flex; flex-direction:column; align-items:center; justify-content:center; gap:10px; overflow:hidden; border-radius:12px; background:var(--hu-bg-secondary); }\n.bt-image-countdown > strong { font-size:26px; z-index:1; }\n.bt-image-countdown > span:last-child { position:relative; z-index:1; text-align:center; padding:0 20px; color:var(--hu-muted); font-size:12px; }\n.bt-image-ripple { position:absolute; inset:25%; border-radius:50%; border:1px solid var(--hu-brand); animation:bt-preview-ripple 1.2s ease-out infinite; opacity:.5; }\n@keyframes bt-preview-ripple { from { transform:scale(.4); opacity:.6; } to { transform:scale(1.8); opacity:0; } }\n@media(prefers-reduced-motion:reduce) { .bt-image-ripple { animation:none; opacity:.2; } }\n\n.bt-plugin-list { display:grid; gap:12px; }\n.bt-plugin-list article { border:1px solid var(--hu-line); border-radius:12px; padding:14px; display:grid; gap:8px; }\n.bt-plugin-list h3 { font-size:15px; margin:0; }\n.bt-plugin-list p { font-size:13px; color:var(--hu-muted); margin:0; }\n\n.bt-calendar-inbox, .bt-calendar-notifications { background:var(--hu-bg); color:var(--hu-text); border:1px solid var(--hu-line); border-radius:14px; box-shadow:0 12px 32px #0002; }\n\n.bt-image-gallery-item { position:relative; min-width:0; border:1px solid var(--hu-line); border-radius:10px; background:var(--hu-bg-secondary); }\n.bt-image-gallery-item > button { display:block; width:100%; padding:0; background:transparent; border:0; border-radius:9px; overflow:hidden; text-align:start; color:var(--hu-text); cursor:pointer; }\n.bt-image-gallery-item > button > span { display:block; font-size:9px; padding:7px; color:var(--hu-muted); }\n.bt-image-tile-actions { position:absolute; top:4px; inset-inline-end:4px; display:flex; align-items:center; gap:3px; opacity:0; transition:opacity .12s ease; }\n.bt-image-gallery-item:hover .bt-image-tile-actions, .bt-image-gallery-item:focus-within .bt-image-tile-actions { opacity:1; }\n.bt-image-tile-actions > .hu-button, .bt-image-tile-actions > .hb-dropdown > .hu-button { width:26px; height:26px; min-height:26px; padding:5px; }\n.bt-image-tile-actions > .hu-button svg { width:14px; height:14px; }\n@media (hover:none) { .bt-image-tile-actions { opacity:1; } }\n@media (prefers-reduced-motion:reduce) { .bt-image-tile-actions { transition:none; } }\n.bt-image-tile-actions .hb-menu-trigger { width:26px; min-width:26px; height:26px; min-height:26px; padding:5px; font-size:0; gap:0; }\n.bt-image-tile-actions .hb-menu-trigger > span { display:flex; }\n.bt-image-tile-actions .hb-menu-trigger svg { width:14px; height:14px; }\n/* Legacy body.dark main selectors must not override the audited application palette. */\n.bt-root .bt-shell .bt-main { background:var(--hu-page, var(--color-background-full)); color:var(--hu-text); }\n/* Compact panel button typography must not expand the menu label over its sibling action. */\n.bt-image-tile-actions .hb-menu-trigger { font-size:0 !important; overflow:hidden; }\n\n/* Application chrome follows DirectionProvider; time and plot geometry stay LTR. */\n.bt-root .bt-calendar,\n.bt-root .bt-month-controls,\n.bt-root .bt-heatmap,\n.bt-root .bt-gauge,\n.bt-root .recharts-responsive-container,\n.bt-root pre { direction:ltr; }\n.bt-root:dir(rtl) .bt-sidebar [data-ui-icon=\"arrow-left\"],\n.bt-root:dir(rtl) .bt-sidebar [data-ui-icon=\"sidebar\"],\n.bt-root:dir(rtl) .bt-breadcrumb [data-ui-icon=\"chevron-right\"],\n.bt-root:dir(rtl) .bt-ai-conversation > header [data-ui-icon=\"chevron-right\"] { transform:scaleX(-1); }\n.bt-root .bt-kanban-column h2 > span { direction:ltr; unicode-bidi:isolate; }\n\n/* Live BoardUI fidelity, 26 October 2026: source application geometry. */\n.bt-root { font-size:16px; line-height:1.5; background:var(--hu-page); }\n.bt-root .bt-shell { grid-template-columns:272px minmax(0,1fr); gap:0; padding:0; background:var(--hu-page); transition:grid-template-columns .3s ease-in-out; }\n.bt-root .bt-shell.bt-collapsed { grid-template-columns:72px minmax(0,1fr); }\n.bt-root .bt-native-sidebar { position:sticky; top:12px; width:260px; height:calc(var(--bt-viewport-height,100dvh) - 24px); margin:12px; min-width:0; z-index:20; transition:width .3s ease-in-out; }\n.bt-root .bt-native-sidebar > aside { height:100%; }\n.bt-root .bt-collapsed .bt-native-sidebar { width:60px; }\n.bt-root .bt-main { padding:24px 12px 12px !important; }\n.bt-root .bt-app-body { display:contents; }\n.bt-root .bt-example-note { display:none; }\n.bt-root .bt-status-message:empty { display:none; }\n.bt-root .bt-breadcrumb { height:20px; min-height:20px; gap:8px; font-size:12px; line-height:20px; margin:0 4px 12px; }\n.bt-root .bt-breadcrumb .bt-mobile-menu { display:none; }\n.bt-root .bt-breadcrumb .bt-user-mark { width:20px; height:20px; }\n.bt-root .bt-page-heading { min-height:36px; margin:0 0 10px; align-items:flex-end; flex-wrap:nowrap; gap:12px; }\n.bt-root .bt-page-heading h1 { font-size:20px; line-height:26px; font-weight:500; letter-spacing:0; }\n.bt-root .bt-source-title { padding-inline:4px; display:flex; align-items:center; flex-wrap:nowrap; gap:8px; min-width:0; }\n.bt-root .bt-source-menu { display:none; }\n.bt-root .bt-source-actions { display:flex; align-items:center; flex-wrap:nowrap; gap:8px; }\n.bt-root .bt-source-notification { position:relative; display:flex; }\n.bt-root .bt-source-notification i { position:absolute; top:-4px; inset-inline-end:-3px; min-width:16px; height:16px; padding-inline:4px; border:2px solid var(--hu-page); border-radius:99px; background:var(--color-red-600); color:white; font:500 10px/12px var(--hu-font); text-align:center; }\n.bt-root .bt-panel { padding:16px; border-radius:16px; }\n.bt-root .bt-panel > header { margin-bottom:12px; min-height:20px; }\n.bt-root .bt-panel h2 { font-size:14px; line-height:20px; font-weight:500; }\n.bt-root .bt-grid-two, .bt-root .bt-grid-three, .bt-root .bt-dashboard-top { gap:16px; margin-bottom:16px; }\n.bt-root .bt-grid-three { grid-template-columns:repeat(3,minmax(0,1fr)); }\n.bt-root .bt-grid-two { grid-template-columns:repeat(2,minmax(0,1fr)); }\n.bt-root .bt-dashboard-top { grid-template-columns:minmax(0, .3953fr) minmax(0,.6047fr); }\n.bt-root .bt-tiles { gap:16px; margin-bottom:16px; grid-template-columns:repeat(4,minmax(0,1fr)); }\n.bt-root .bt-tile { height:132px; border-radius:16px; padding:16px; gap:4px; }\n.bt-root .bt-tile-icon { width:32px; height:32px; border-radius:8px; margin-bottom:4px; }\n.bt-root .bt-tile > span:nth-child(2) { font-size:14px; line-height:20px; }\n.bt-root .bt-tile > div { display:flex; align-items:center; gap:8px; }\n.bt-root .bt-tile strong { font-size:24px; line-height:32px; font-weight:500; letter-spacing:0; }\n.bt-root .bt-tile small { display:inline-flex; align-items:center; border-radius:6px; padding:0 5px; background:var(--color-green-100); color:var(--color-green-800); font-size:12px; line-height:20px; white-space:nowrap; }\n.bt-root .bt-recent-hires { padding:8px; height:329px; display:flex; flex-direction:column; }\n.bt-root .bt-recent-hires > header { padding:8px 8px 0; margin:0; height:28px; }\n.bt-root .bt-recent-hires > header .hu-field { width:auto; }\n.bt-root .bt-recent-hires > header .hu-field > label { position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip-path:inset(50%); white-space:nowrap; }\n.bt-root .bt-recent-hires > header .hu-input-wrap { height:24px; min-height:24px; border:0; background:none; box-shadow:none; }\n.bt-root .bt-recent-hires > .bt-number { padding-inline:8px; font-size:24px; line-height:32px; margin:2px 0 10px; }\n.bt-root .bt-hires { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:8px; }\n.bt-root .bt-hires > article { display:flex; flex-direction:column; justify-content:space-between; padding:10px; height:95px; min-width:0; border-radius:10px; }\n.bt-root .bt-hires > article:nth-child(n) { display:flex; }\n.bt-root .bt-hires .bt-person { gap:8px; }\n.bt-root .bt-hires .bt-person img { width:32px; height:32px; }\n.bt-root .bt-hires .bt-person strong, .bt-root .bt-hires .bt-person small { font-size:14px; line-height:20px; font-weight:500; }\n.bt-root .bt-hires .bt-person small { font-weight:400; max-width:none; }\n.bt-root .bt-hires > article > span:last-child { font-size:12px; line-height:20px; padding:2px 8px; border-radius:6px; align-self:flex-start; }\n.bt-root .bt-recent-hires .bt-paging { display:flex; gap:8px; margin-top:auto; padding-top:8px; }\n.bt-root .bt-recent-hires .bt-paging > span { display:none; }\n.bt-root .bt-recent-hires .bt-paging > button { flex:1; height:32px; font-size:14px; justify-content:center; }\n.bt-root .bt-data-section { border-radius:16px; margin-top:0; padding:8px; }\n.bt-root .bt-data-section > header { padding:12px 8px 16px; display:flex; align-items:center; gap:12px; flex-wrap:nowrap; }\n.bt-root .bt-data-section > header > div:first-child { flex:none; min-width:145px; }\n.bt-root .bt-data-section > header strong { font-size:14px; line-height:20px; font-weight:500; }\n.bt-root .bt-data-section > header small { font-size:12px; line-height:16px; }\n.bt-root .bt-data-section > header > div:last-child { flex:1; display:flex; gap:8px; align-items:center; justify-content:flex-end; min-width:0; }\n.bt-root .bt-data-section > header .hu-field { min-width:0; max-width:160px; width:auto; flex:0 1 auto; }\n.bt-root .bt-data-section > header .hu-field > label { position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip-path:inset(50%); white-space:nowrap; }\n.bt-root .bt-data-section > header .hu-input-wrap { height:32px; min-height:32px; border-radius:8px; }\n.bt-root .bt-data-section > header input, .bt-root .bt-data-section > header select { font-size:14px; }\n.bt-root .bt-data-section > header .bt-source-table-search { max-width:240px; flex:1; }\n.bt-root .bt-data-section .hu-table-card { border-radius:8px; }\n.bt-root .bt-row-role, .bt-root .bt-person strong, .bt-root .bt-person small { font-size:14px; line-height:20px; }\n.bt-root .bt-number { font-size:24px; line-height:32px; font-weight:500; }\n.bt-root .bt-profile-card { border-radius:24px; margin-bottom:16px; }\n.bt-root.bt-template-ai-profile .bt-main { padding:24px !important; }\n.bt-root.bt-template-ai-profile .bt-profile-cover { height:165px; }\n.bt-root.bt-template-ai-profile .bt-profile-body { padding:0 16px 16px; }\n.bt-root .bt-profile-history { height:317px; padding:16px; border-radius:16px; position:relative; }\n.bt-root .bt-profile-history h2 { font-size:14px; line-height:20px; }\n.bt-root .bt-profile-history header strong { font-size:24px; line-height:32px; }\n.bt-root .bt-profile-history-plot { margin-top:22px; }\n.bt-root .bt-profile-history details { position:absolute; inset-inline-end:16px; bottom:6px; font-size:11px; }\n.bt-root .bt-profile-history details[open] { position:relative; inset:auto; background:var(--hu-bg); z-index:2; }\n.bt-root .bt-mini-stats strong { font-size:14px; line-height:20px; }\n.bt-root .bt-mini-stats small { font-size:12px; line-height:20px; }\n.bt-root .bt-shell.bt-repository-shell, .bt-root.bt-template-chat-starter .bt-shell { grid-template-columns:288px minmax(0,1fr); }\n.bt-root .bt-shell.bt-repository-shell.bt-collapsed, .bt-root.bt-template-chat-starter .bt-shell.bt-collapsed { grid-template-columns:88px minmax(0,1fr); }\n.bt-root .bt-repository-shell .bt-main, .bt-root.bt-template-chat-starter .bt-main { padding:12px 12px 12px 0 !important; }\n.bt-root .bt-repository-shell .bt-breadcrumb, .bt-root.bt-template-chat-starter .bt-breadcrumb { display:none; }\n.bt-root .bt-repository-nav > button, .bt-root .bt-repository-nav details button { min-height:36px; font-size:14px; line-height:20px; padding:8px; }\n.bt-root .bt-repository-nav details { font-size:14px; line-height:20px; }\n.bt-root .bt-repository-nav > p { font-size:12px; }\n.bt-root .bt-repository-nav > p[role=status] { display:none; }\n.bt-root .bt-ai-workspace { grid-template-columns:minmax(0,1fr) 410px; gap:16px; height:calc(var(--bt-viewport-height,100dvh) - 24px); }\n.bt-root .bt-ai-workspace.bt-panel-closed { grid-template-columns:minmax(0,1fr); }\n.bt-root .bt-ai-conversation { padding:12px; border-radius:24px; }\n.bt-root .bt-ai-conversation > header { font-size:12px; line-height:20px; }\n.bt-root .bt-ai-panel { padding:0; max-height:calc(var(--bt-viewport-height,100dvh) - 24px); }\n.bt-root .bt-ai-panel .hu-tabs [role=tab] { font-size:14px; line-height:20px; }\n.bt-root .bt-ai-conversation .bt-message-log { padding:24px 12px 32px; }\n.bt-root .bt-message-log article { font-size:14px; line-height:20px; }\n.bt-root .bt-code-progress { margin:16px 0; max-width:560px; }\n.bt-root .bt-code-progress .hp-agent-thinking { margin-top:16px; }\n.bt-root .bt-code-browser { background:var(--hu-bg-secondary); border-radius:16px; min-height:calc(var(--bt-viewport-height,100dvh) - 90px); display:flex; flex-direction:column; align-items:center; justify-content:center; }\n.bt-root .bt-code-browser > h2 { font-size:14px; line-height:20px; font-weight:400; color:var(--hu-muted); }\n.bt-root .bt-code-browser > details { margin-top:16px; font-size:12px; width:90%; }\n.bt-root .bt-image-gallery { columns:2; display:block; gap:8px; }\n.bt-root .bt-image-gallery-item { break-inside:avoid; border:0; border-radius:12px; margin-bottom:8px; }\n.bt-root .bt-image-gallery-item > button > img { display:block; width:100%; height:auto; object-fit:cover; border-radius:12px; }\n.bt-root .bt-image-gallery-item > button > span { display:none; }\n.bt-root .bt-ai-panel .hu-tabs [role=tabpanel] > .hu-field { display:none; }\n.bt-root .bt-image-result { width:100%; max-width:560px; padding:0; border:0; background:none; }\n.bt-root .bt-image-result > strong, .bt-root .bt-image-result > p:first-of-type { position:absolute; width:1px; height:1px; overflow:hidden; clip-path:inset(50%); }\n.bt-root .bt-image-result > img { width:100%; max-height:none; object-fit:contain; border-radius:16px; }\n.bt-root .bt-image-result .bt-note { font-size:11px; }\n.bt-root .bt-chat-starter { padding:12px; height:calc(var(--bt-viewport-height,100dvh) - 24px); border-radius:24px; min-height:0; }\n.bt-root .bt-chat-starter > header { height:36px; flex:none; }\n.bt-root .bt-chat-starter h1 { font-size:14px; line-height:20px; font-weight:500; }\n.bt-root .bt-provider-card { width:448px; max-width:100%; margin:auto; padding:24px; border-radius:16px; }\n.bt-root .bt-provider-card h2 { font-size:16px; line-height:24px; font-weight:500; }\n.bt-root .bt-provider-card p, .bt-root .bt-provider-card ol { font-size:14px; line-height:20px; }\n.bt-root .bt-provider-card ol { padding-inline-start:20px; }\n.bt-root .bt-chat-storage-note { font-size:10px; line-height:14px; margin:8px 0 0; }\n.bt-root .bt-chat-starter[data-demo=false] .bt-chat-storage-note { display:none; }\n.bt-root.bt-template-multi-agent-chat .bt-shell { display:block; padding:12px; }\n.bt-root.bt-template-multi-agent-chat .bt-native-sidebar { display:none; }\n.bt-root .bt-multi-workspace { grid-template-columns:minmax(0,1fr) 340px; gap:16px; min-height:calc(var(--bt-viewport-height,100dvh) - 24px); }\n.bt-root .bt-multi-workspace.bt-multi-panel-closed { grid-template-columns:minmax(0,1fr); }\n.bt-root .bt-multi-main > .hp-multi-chat { min-height:0; height:calc(var(--bt-viewport-height,100dvh) - 24px); border-radius:24px; grid-template-columns:260px minmax(0,1fr); }\n.bt-root .bt-template-medical-profile .bt-medical-grid { grid-template-columns:repeat(3,minmax(0,1fr)); }\n.bt-root.bt-template-project-board .bt-main { padding:24px 28px 22px 24px !important; }\n.bt-root.bt-template-project-board .bt-breadcrumb { margin-bottom:8px; }\n.bt-root.bt-template-project-board .bt-page-heading { margin-bottom:12px; }\n.bt-root .bt-kanban { gap:12px; grid-auto-columns:273px; }\n.bt-root .bt-kanban-column { border-radius:20px; padding:8px; }\n.bt-root .bt-ticket { padding:12px; border-radius:12px; min-height:147px; }\n.bt-root .bt-ticket h3 { font-size:14px; line-height:20px; }\n.bt-root .bt-drawer-dismiss { display:none; }\n@media(min-width:1024px) and (max-width:1279px) {\n .bt-root .bt-grid-three { grid-template-columns:repeat(2,minmax(0,1fr)); }\n .bt-root .bt-grid-three > :last-child { grid-column:auto; }\n .bt-root .bt-tiles { grid-template-columns:repeat(2,minmax(0,1fr)); }\n .bt-root .bt-dashboard-top { grid-template-columns:repeat(2,minmax(0,1fr)); }\n .bt-root .bt-template-medical-profile .bt-medical-grid { grid-template-columns:repeat(2,minmax(0,1fr)); }\n}\n@media(max-width:1023px) {\n .bt-root .bt-shell, .bt-root .bt-shell.bt-collapsed, .bt-root .bt-shell.bt-repository-shell, .bt-root.bt-template-chat-starter .bt-shell { display:block; padding:0; overflow:hidden; min-height:var(--bt-viewport-height,100dvh); }\n .bt-root .bt-native-sidebar { position:fixed; inset-block:0; inset-inline-start:0; margin:12px; width:260px; height:calc(var(--bt-viewport-height,100dvh) - 24px); z-index:0; }\n .bt-root .bt-collapsed .bt-native-sidebar { width:260px; }\n .bt-root .bt-main { padding:12px !important; position:relative; z-index:1; min-height:var(--bt-viewport-height,100dvh) !important; transition:transform .3s ease-in-out,border-radius .3s; transform-origin:center left; }\n .bt-root .bt-mobile-nav-open .bt-main { transform:translateX(260px) scale(.94); border-radius:24px; overflow:hidden; height:var(--bt-viewport-height,100dvh); }\n .bt-root:dir(rtl) .bt-mobile-nav-open .bt-main { transform:translateX(-260px) scale(.94); transform-origin:center right; }\n .bt-root .bt-breadcrumb { display:none; }\n .bt-root .bt-source-menu { display:inline-flex; flex:none; }\n .bt-root .bt-source-title { padding:0; }\n .bt-root .bt-page-heading { align-items:center; margin-bottom:12px; }\n .bt-root .bt-source-actions { gap:8px; }\n .bt-root .bt-grid-three, .bt-root .bt-grid-two, .bt-root .bt-dashboard-top { grid-template-columns:repeat(2,minmax(0,1fr)); }\n .bt-root .bt-grid-three > :last-child { grid-column:auto; }\n .bt-root .bt-tiles { grid-template-columns:repeat(2,minmax(0,1fr)); }\n .bt-root .bt-data-section > header { flex-wrap:wrap; }\n .bt-root .bt-data-section > header > div:last-child { flex-wrap:wrap; width:100%; justify-content:flex-start; }\n .bt-root .bt-data-section > header .hu-field { flex:1; max-width:none; }\n .bt-root .bt-data-section > header .bt-source-table-search { flex:1; min-width:150px; }\n .bt-root .bt-repository-shell .bt-main, .bt-root.bt-template-chat-starter .bt-main { padding:12px !important; }\n .bt-root .bt-ai-workspace { grid-template-columns:minmax(0,1fr); }\n .bt-root .bt-mobile-nav-open .bt-drawer-dismiss { display:block; position:absolute; inset:0; border:0; background:transparent; z-index:50; cursor:pointer; }\n .bt-root.bt-template-ai-profile .bt-main { padding:12px !important; }\n .bt-root.bt-template-ai-profile .bt-breadcrumb { display:block; position:absolute; top:24px; inset-inline-start:24px; height:36px; pointer-events:auto; }\n .bt-root.bt-template-ai-profile .bt-breadcrumb .bt-mobile-menu { display:inline-flex; }\n .bt-root.bt-template-project-board .bt-main { padding:12px !important; }\n}\n@media(max-width:639px) {\n .bt-root .bt-grid-three, .bt-root .bt-grid-two, .bt-root .bt-dashboard-top, .bt-root .bt-medical-grid { grid-template-columns:minmax(0,1fr); }\n .bt-root .bt-source-actions > .bt-source-notification { display:none; }\n .bt-root .bt-source-actions > button { font-size:14px; padding-inline:10px; }\n .bt-root .bt-page-heading { flex-wrap:wrap; row-gap:8px; }\n .bt-root .bt-hires { grid-template-columns:repeat(2,minmax(0,1fr)); }\n .bt-root .bt-tile strong { font-size:24px; }\n .bt-root .bt-tiles { gap:12px; }\n .bt-root .bt-data-section > header { padding:8px 4px 12px; }\n .bt-root .bt-profile-body > h1 { font-size:20px; }\n .bt-root .bt-multi-main > .hp-multi-chat { grid-template-columns:minmax(0,1fr); }\n .bt-root .bt-multi-main > .hp-multi-chat > aside { width:260px; }\n}\n@media(prefers-reduced-motion:reduce) { .bt-root .bt-shell,.bt-root .bt-main,.bt-root .bt-native-sidebar { transition:none; } }\n\n.bt-root .bt-page-heading .bt-source-menu { display:none !important; }\n@media(max-width:1023px){.bt-root .bt-page-heading .bt-source-menu{display:inline-flex !important;}}\n.bt-root .bt-grid-three { align-items:start; }\n.bt-root .bt-contribution-card { height:337px; }\n.bt-root .bt-mini-stats { gap:8px; margin:16px 0 0; }\n.bt-root .bt-mini-stats > span { border-radius:12px; padding:10px; background:var(--hu-bg); }\n.bt-root .bt-mini-stats strong { font-size:14px; line-height:20px; font-weight:500; }\n.bt-root .bt-profile-activity-heading { margin:12px 0 8px; font-size:14px; line-height:20px; }\n.bt-root .bt-period-buttons { gap:12px; }\n.bt-root .bt-period-buttons > button { font-size:14px; line-height:20px; padding:0 2px; }\n.bt-root .bt-heatmap { display:flex; flex-direction:column; margin:0; gap:8px; min-width:0; }\n.bt-root .bt-heatmap-grid { display:grid; grid-template-rows:repeat(7,minmax(0,1fr)); grid-auto-flow:column; gap:4px; }\n.bt-root .bt-heatmap-grid > button { border:0; padding:0; border-radius:3px; min-width:0; aspect-ratio:1; height:auto; }\n.bt-root .bt-heatmap-axis { order:2; display:flex; justify-content:space-between; font-size:12px; line-height:16px; color:var(--hu-muted); }\n.bt-root .bt-fixture-delta { font-size:14px; line-height:24px; display:inline-flex; vertical-align:middle; background:var(--color-lime-200); color:var(--color-lime-900); padding:0 6px; border-radius:6px; }\n.bt-root .bt-ai-profile .bt-profile-body > .bt-mini-stats > span { background:var(--hu-bg-secondary); }\n.bt-root .bt-ai-profile .bt-heatmap-axis { display:none; }\n.bt-root .bt-ai-profile .bt-large-avatar { width:80px; height:80px; font-size:30px; border-width:0; }\n.bt-root .bt-ai-profile .bt-profile-actions { margin-top:-40px; margin-bottom:14px; }\n.bt-root .bt-ai-profile .bt-profile-body > .bt-number { margin:2px 0 0; }\n.bt-root .bt-ai-profile .bt-profile-body > p { margin-bottom:16px; }\n.bt-root .bt-ai-profile .bt-mini-stats { margin-top:10px; }\n.bt-root .bt-ai-profile .bt-profile-activity-heading { margin:16px 0 10px; }\n.bt-root .bt-breakdown-panel { height:329px; padding:8px; }\n.bt-root .bt-breakdown-panel > header { display:none; }\n.bt-root .bt-breakdown-panel .hu-tabs [role=tablist] { background:none; border-bottom:1px solid var(--hu-line); border-radius:0; gap:0; padding:0; overflow:hidden; flex-wrap:nowrap; }\n.bt-root .bt-breakdown-panel .hu-tabs [role=tab] { border:0; border-radius:0; background:none; box-shadow:none; font-size:14px; line-height:20px; padding:6px 10px; white-space:nowrap; }\n.bt-root .bt-breakdown-panel .hu-tabs [role=tab][aria-selected=true] { color:var(--color-accent-600); border-bottom:2px solid var(--color-accent-600); }\n.bt-root .bt-breakdown-panel .hu-tabs [role=tabpanel] { padding-top:12px; }\n.bt-root .bt-breakdown-panel .bt-progress-list { gap:4px; margin:0; }\n.bt-root .bt-breakdown-panel .bt-progress-list > li { display:flex; position:relative; isolation:isolate; justify-content:space-between; align-items:center; min-height:36px; padding:8px 10px; gap:10px; font-size:14px; line-height:20px; }\n.bt-root .bt-breakdown-panel .bt-progress-list > li::before { content:''; position:absolute; inset-block:0; inset-inline-start:0; width:var(--row-width); border-radius:8px; background:var(--color-calendar-event-blue-background); z-index:-1; }\n.bt-root .bt-breakdown-panel .bt-progress-list > li > div { display:none; }\n.bt-root .bt-breakdown-panel .bt-progress-list strong { font-size:14px; font-weight:500; }\n.bt-root .bt-pipeline-panel { min-height:398px; }\n.bt-root .bt-pipeline-panel .bt-progress-list { margin:20px 0; gap:12px; }\n.bt-root .bt-pipeline-panel .bt-progress-list > li { font-size:14px; line-height:20px; grid-template-columns:85px minmax(0,1fr) 40px; }\n.bt-root .bt-pipeline-panel .bt-progress-list > li > div { height:20px; border-radius:99px; }\n.bt-root .bt-pipeline-panel .bt-progress-list i { border-radius:99px; }\n.bt-root .bt-source-legend-tiles { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:8px; }\n.bt-root .bt-source-legend-tiles > span { display:grid; gap:2px; border-radius:12px; background:var(--hu-bg); padding:8px 10px; font-size:14px; line-height:20px; min-width:0; }\n.bt-root .bt-source-legend-tiles small { display:flex; align-items:center; gap:6px; color:var(--hu-muted); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; font-size:14px; }\n.bt-root .bt-source-legend-tiles i { width:12px; height:12px; border-radius:4px; flex:none; }\n.bt-root .bt-source-legend-tiles strong { font-weight:500; }\n.bt-root .bt-engagement-panel { height:329px; position:relative; }\n.bt-root .bt-engagement-panel .bt-radar { height:250px; }\n.bt-root .bt-radar-center { position:absolute; top:50%; left:50%; transform:translate(-50%,-27%); border-radius:50%; background:var(--hu-bg); width:82px; height:82px; display:flex; flex-direction:column; align-items:center; justify-content:center; }\n.bt-root .bt-radar-center strong { font-size:24px; line-height:32px; font-weight:500; }\n.bt-root .bt-radar-center span { font-size:12px; color:var(--hu-muted); }\n.bt-root .bt-daily-spending { height:329px; }\n.bt-root .bt-daily-spending .bt-heatmap { margin-top:16px; padding-inline-start:34px; position:relative; }\n.bt-root .bt-daily-spending .bt-heatmap::before { content:'Mon\\A Tue\\A Wed\\A Thu\\A Fri\\A Sat\\A Sun'; white-space:pre; position:absolute; inset-inline-start:0; top:0; font-size:12px; line-height:25px; color:var(--hu-muted); }\n.bt-root .bt-daily-spending .bt-heatmap-grid { gap:4px; }\n.bt-root .bt-daily-spending .bt-heatmap-grid button { border-radius:4px; }\n@media(max-width:639px){.bt-root .bt-contribution-card { height:auto; min-height:337px; }.bt-root .bt-heatmap { overflow:auto; }.bt-root .bt-ai-profile .bt-heatmap-grid{min-width:646px;}.bt-root .bt-daily-spending .bt-heatmap::before{line-height:23px;}}\n.bt-root .bt-recent-hires > .bt-number { margin-bottom:14px; }\n.bt-root .bt-heatmap-grid { padding:0; overflow:visible; }\n.bt-root .bt-heatmap-axis { min-height:16px; }\n.bt-root .bt-chat-starter { position:relative; }\n.bt-root .bt-chat-starter > header h1 { font-size:16px; line-height:22px; }\n.bt-root .bt-chat-starter[data-demo=false] .bt-provider-card { position:absolute; top:50%; left:50%; transform:translate(-50%,-50%); min-height:338px; display:flex; flex-direction:column; gap:12px; background:var(--hu-bg); border:0; box-shadow:0 2px 5px #00000008; }\n.bt-root .bt-provider-card > h2, .bt-root .bt-provider-card > p, .bt-root .bt-provider-card > ol { margin:0; }\n.bt-root .bt-provider-card > .bn-source > button { width:100%; }\n.bt-root .bt-provider-card .bt-note { font-size:12px; line-height:16px; }\n.bt-root .bt-starter-header-actions { display:flex; gap:4px; }\n.bt-root .bt-source-chat-menu .hb-menu-trigger { font-size:0; padding:6px; height:32px; width:32px; min-width:32px; background:none; border:0; box-shadow:none; }\n.bt-root .bt-source-chat-menu .hb-menu-trigger::after { content:'•••'; font-size:12px; line-height:20px; color:var(--hu-muted); }\n.bt-root .bt-source-chat-menu .hb-menu-trigger > span { display:none; }\n.bt-root .bt-ai-workspace { grid-template-columns:minmax(0,1fr) var(--panel-width,410px); }\n.bt-root .bt-ai-workspace.bt-panel-closed { grid-template-columns:minmax(0,1fr); }\n.bt-root .bt-ai-panel { position:relative; }\n.bt-root .bt-panel-resize { position:absolute; inset-inline-start:-12px; top:0; bottom:0; width:8px; z-index:5; cursor:col-resize; }\n.bt-root .bt-panel-resize:hover, .bt-root .bt-panel-resize:focus-visible { background:var(--hu-line); border-radius:5px; outline:1px solid var(--hu-focus); }\n.bt-root .bt-code-summary { display:flex; align-items:center; justify-content:space-between; padding:0 4px 12px; font-size:12px; line-height:20px; }\n.bt-root .bt-code-summary strong { font-weight:400; }\n.bt-root .bt-code-counts { color:var(--color-green-600); }\n.bt-root .bt-code-counts i { font-style:normal; color:var(--color-red-500); margin-inline-start:8px; }\n.bt-root .bt-source-diffs { display:flex; flex-direction:column; gap:8px; }\n.bt-root .bt-source-diffs details { border:1px solid var(--hu-line); border-radius:12px; overflow:hidden; }\n.bt-root .bt-source-diffs summary { display:flex; align-items:center; gap:6px; font-size:12px; line-height:20px; padding:10px; cursor:pointer; }\n.bt-root .bt-source-diffs summary > svg { width:14px; height:14px; flex:none; transition:transform .15s; }\n.bt-root .bt-source-diffs details[open] summary > svg { transform:rotate(90deg); }\n.bt-root .bt-source-diffs summary > span { flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\n.bt-root .bt-source-diffs summary small { background:var(--hu-bg-secondary); border-radius:4px; font-size:10px; padding:0 4px; }\n.bt-root .bt-source-diffs summary b { font-weight:400; color:var(--color-green-600); }\n.bt-root .bt-ai-panel .bt-source-diffs pre { margin:0; padding:0; max-height:330px; border:0; border-radius:0; font-size:11px; line-height:20px; }\n.bt-root .bt-code-line { display:flex; min-width:max-content; background:color-mix(in srgb,var(--color-green-500) 9%,var(--hu-bg)); }\n.bt-root .bt-code-line > i { width:30px; flex:none; text-align:end; padding-inline-end:8px; color:var(--hu-muted); font-style:normal; user-select:none; }\n.bt-root .bt-code-line > span { padding-inline:8px; }\n.bt-root .hu-dialog:has(.bt-source-right-panel) { position:fixed; inset-block:8px; inset-inline-start:auto; inset-inline-end:8px; width:min(410px,calc(100vw - 16px)); max-width:calc(100vw - 16px); height:calc(var(--bt-viewport-height,100dvh) - 16px); max-height:calc(var(--bt-viewport-height,100dvh) - 16px); margin:0; border-radius:24px; padding:16px; animation:bt-source-panel-enter .25s ease-out; }\n.bt-root .hu-dialog:has(.bt-agent-editor) { width:340px; }\n.bt-root .hu-dialog:has(.bt-source-right-panel) > header { padding:0 0 8px; }\n.bt-root .hu-dialog:has(.bt-source-right-panel) > header h2 { font-size:14px; line-height:20px; }\n.bt-root .hu-dialog:has(.bt-source-right-panel) > .hu-dialog-body { padding:0; height:calc(100% - 42px); overflow:auto; }\n.bt-root .bt-mobile-panel.bt-source-right-panel { padding:0; max-height:none; }\n.bt-root .hu-dialog:has(.bt-ticket-layout) { position:fixed; inset-block:8px; inset-inline-start:auto; inset-inline-end:8px; width:min(800px,calc(100vw - 16px)); height:calc(var(--bt-viewport-height,100dvh) - 16px); max-height:calc(var(--bt-viewport-height,100dvh) - 16px); margin:0; border-radius:24px; animation:bt-source-panel-enter .25s ease-out; }\n.bt-root .bt-task { border-radius:12px; min-height:147px; padding:0; }\n.bt-root .bt-task-open { padding:12px; }\n.bt-root .bt-task h3 { font-size:14px; line-height:20px; }\n.bt-root .bt-kanban { grid-template-columns:repeat(4,273px); grid-auto-columns:273px; }\n@keyframes bt-source-panel-enter { from{transform:translateX(24px);opacity:0;}to{transform:none;opacity:1;} }\n@media(max-width:1279px){.bt-root .bt-ai-workspace{grid-template-columns:minmax(0,1fr);}}\n@media(prefers-reduced-motion:reduce){.bt-root .hu-dialog:has(.bt-source-right-panel),.bt-root .hu-dialog:has(.bt-ticket-layout){animation:none;}.bt-root .bt-source-diffs summary > svg{transition:none;}}\n.bt-root .bt-source-title .bt-source-menu { background:transparent !important; color:var(--hu-text) !important; box-shadow:none !important; }\n.bt-root .bt-patient-card { height:330px; padding:10px; }\n.bt-root .bt-patient-card > header { display:none; }\n.bt-root .bt-medical-identity { margin:14px 0 16px; gap:14px; }\n.bt-root .bt-patient-avatar { width:66px; height:66px; position:relative; display:grid; place-items:center; border-radius:50%; background:var(--hu-line); font-size:26px; line-height:32px; color:var(--hu-muted); }\n.bt-root .bt-patient-avatar > img { width:100%; height:100%; object-fit:cover; border-radius:50%; }\n.bt-root .bt-patient-avatar > button { position:absolute; top:-2px; inset-inline-end:-2px; display:grid; place-items:center; width:24px; height:24px; padding:0; border:1px solid var(--hu-line); border-radius:99px; background:var(--hu-bg); color:var(--hu-text); font:20px/20px var(--hu-font); cursor:pointer; }\n.bt-root .bt-medical-identity h2 { font-size:20px; line-height:26px; font-weight:500; margin:0; }\n.bt-root .bt-profile-facts { gap:0; font-size:14px; line-height:20px; }\n.bt-root .bt-profile-facts dt, .bt-root .bt-profile-facts dd { min-height:36px; padding:8px 10px; margin-bottom:10px; }\n.bt-root .bt-profile-facts dt { display:flex; align-items:center; gap:6px; border-start-start-radius:12px; border-end-start-radius:12px; border-start-end-radius:0; border-end-end-radius:0; }\n.bt-root .bt-profile-facts dd { border-start-end-radius:12px; border-end-end-radius:12px; border-start-start-radius:0; border-end-start-radius:0; }\n.bt-root .bt-profile-facts dt > svg { width:16px; height:16px; }\n.bt-root .bt-alerts-card { height:330px; }\n.bt-root .bt-alerts-card .bt-number { margin-bottom:16px; }\n.bt-root .bt-alerts-card .bt-number > small { font-size:12px; line-height:20px; font-weight:400; color:var(--hu-muted); }\n.bt-root .bt-alert-list { height:240px; max-height:240px; gap:8px; padding-inline-end:8px; }\n.bt-root .bt-alert-list > button { display:block; padding:10px; position:relative; }\n.bt-root .bt-alert-list strong { display:block; margin-top:10px; font-size:14px; line-height:20px; font-weight:500; }\n.bt-root .bt-alert-list p { margin:2px 0 0; font-size:13px; line-height:18px; color:var(--hu-muted); }\n.bt-root .bt-alert-list time { position:absolute; top:10px; inset-inline-end:10px; font-size:12px; line-height:20px; border-radius:4px; padding:0 4px; background:var(--hu-bg-secondary); color:var(--hu-muted); }\n.bt-root .bt-alert-icon { width:32px; height:32px; display:grid; place-items:center; border-radius:99px; background:var(--color-yellow-400); color:white; }\n.bt-root .bt-alert-icon[data-tone=danger] { background:var(--color-rose-600); }\n.bt-root .bt-template-medical-profile .bt-grid-three { gap:16px; }\n.bt-root .bt-activity-rings { width:200px; margin:20px auto 0; }\n.bt-root .bt-calendar { border-radius:24px; padding:12px; gap:8px; grid-template-rows:auto repeat(6,minmax(128px,1fr)); flex:none; }\n.bt-root .bt-calendar-cell { min-height:128px; border-radius:12px; padding:8px; }\n.bt-root .bt-calendar-day { font-size:14px; line-height:20px; }\n.bt-root .bt-event { border-radius:5px; min-height:20px; padding:0 6px; font-size:13px; line-height:20px; }\n.bt-root .bt-calendar-more { font-size:12px; line-height:16px; min-height:16px; padding:0; }\n.bt-root .bt-month-controls { width:320px; max-width:45vw; }\n.bt-root .bt-month-controls > strong { font-size:14px; line-height:20px; font-weight:500; flex:1; text-align:center; }\n.bt-root.bt-template-project-board .bt-source-actions > .hu-button:not(:last-child), .bt-root.bt-template-project-board .bt-source-actions > .hb-dropdown > button, .bt-root.bt-template-project-board .bt-source-actions > .bt-control-trigger { width:36px; min-width:36px; height:36px; padding:8px; border-radius:10px; }\n.bt-root.bt-template-project-board .bt-source-actions > .hb-dropdown > button { font-size:0; }\n.bt-root.bt-template-project-board .bt-source-actions > .hb-dropdown > button svg { width:20px; height:20px; }\n.bt-root .bt-board-announcement { position:absolute; width:1px; height:1px; overflow:hidden; clip-path:inset(50%); }\n@media(max-width:639px){.bt-root .bt-calendar{padding:8px;gap:2px;grid-template-rows:auto repeat(6,minmax(76px,1fr));}.bt-root .bt-calendar-cell{padding:3px;min-height:76px;border-radius:0;background:transparent;}.bt-root .bt-calendar-day{font-size:12px;}.bt-root .bt-event{font-size:9px;line-height:14px;min-height:14px;padding:0 2px;}.bt-root .bt-month-controls{max-width:none;width:auto;min-width:150px;}.bt-root .bt-source-actions{max-width:100%;}.bt-root.bt-template-project-board .bt-source-actions{gap:6px;}}\n.bt-root .bt-code-progress { width:340px; max-width:100%; }\n.bt-root .bt-code-progress .hp-agent-progress { border:1px solid var(--hu-line); border-radius:16px; background:var(--hu-bg); padding:12px; width:100%; min-height:234px; }\n.bt-root .bt-code-progress .hp-agent-progress > header { margin:0; }\n.bt-root .bt-code-progress .hp-agent-progress > header > span,.bt-root .bt-code-progress .hp-agent-progress > .hu-actions,.bt-root .bt-code-progress .hp-agent-progress > .hp-status { display:none; }\n.bt-root .bt-code-progress .hp-agent-progress .hp-progress-disclosure { display:flex; width:100%; justify-content:space-between; align-items:center; background:none; border:0; padding:0; color:var(--hu-muted); font-size:14px; line-height:20px; }\n.bt-root .bt-code-progress .hp-agent-progress ol { gap:12px; margin:16px 0 0; }\n.bt-root .bt-code-progress .hp-agent-progress ol li { gap:8px; }\n.bt-root .bt-code-progress .hp-agent-progress ol li > span { width:20px; height:20px; border-width:0; }\n.bt-root .bt-code-progress .hp-agent-progress ol strong { font-size:14px; line-height:20px; font-weight:400; }\n.bt-root .bt-code-progress > .bn-source > div { margin-top:12px; }\n.bt-root .bt-ai-conversation .bt-message-log > article[data-author=user] { max-width:350px; padding:10px 12px; border-radius:16px; }\n.bt-root .bt-ai-conversation .bt-message-log > article[data-author=user] > strong { display:none; }\n.bt-root .bt-ai-conversation .bt-message-log > article[data-author=user] > p { margin:0; }\n.bt-root .bt-image-gallery { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); columns:auto; gap:8px; }\n.bt-root .bt-gallery-column { display:flex; flex-direction:column; gap:8px; min-width:0; }\n.bt-root .bt-image-gallery-item { margin:0; border-radius:10px; }\n.bt-root .bt-image-gallery-item > button > img { border-radius:10px; }\n.bt-root .bt-ai-panel .hu-tabs > [role=tabpanel] { padding-top:8px; }\n.bt-root .bt-template-ai-image-generation .bt-ai-panel .hu-tabs [role=tab] { border-radius:99px; }\n.bt-root .bt-image-result { width:100%; }\n.bt-root .bt-image-result > strong { position:static; width:auto; height:auto; clip-path:none; display:block; margin:0 0 8px; font-size:14px; line-height:20px; font-weight:400; }\n.bt-root .bt-image-result > img { width:200px; height:250px; max-height:250px; object-fit:cover; margin:0; border-radius:16px; }\n.bt-root .bt-image-result .bt-message-actions { margin-top:8px; gap:6px; }\n.bt-root .bt-image-result .bt-message-actions button,.bt-root .bt-image-result .bt-message-actions a { width:28px; min-width:28px; height:28px; padding:5px; min-height:28px; font-size:0; border:0; border-radius:8px; background:var(--hu-line); gap:0; }\n.bt-root .bt-image-result .bt-message-actions svg { width:16px; height:16px; }\n.bt-root .bt-image-result > .bt-note { position:absolute; width:1px; height:1px; overflow:hidden; clip-path:inset(50%); }\n.bt-root .bt-panel-tools { position:absolute; top:4px; inset-inline-end:0; display:flex; gap:0; z-index:4; }\n.bt-root .bt-panel-tools button { color:var(--hu-muted); background:none; }\n.bt-root .bt-ai-panel > .hu-tabs > [role=tablist] { padding-inline-end:100px; height:40px; }\n.bt-root .bt-panel-expanded { grid-template-columns:minmax(0,1fr); }\n.bt-root .bt-panel-expanded .bt-ai-conversation { display:none; }\n.bt-root .bt-panel-expanded .bt-panel-resize { display:none; }\n.bt-root .bt-style-placeholder { position:relative; min-height:calc(var(--bt-viewport-height,100dvh) - 100px); border-radius:16px; background:var(--hu-bg-secondary); display:flex; flex-direction:column; align-items:center; justify-content:center; }\n.bt-root .bt-style-placeholder > h2 { font-size:14px; line-height:20px; color:var(--hu-muted); font-weight:400; }\n.bt-root .bt-style-placeholder > details, .bt-root .bt-code-browser > details { position:absolute; top:8px; inset-inline-end:8px; width:auto; }\n.bt-root .bt-style-placeholder > details > summary, .bt-root .bt-code-browser > details > summary { font-size:0; list-style:none; cursor:pointer; }\n.bt-root .bt-style-placeholder > details > summary::after, .bt-root .bt-code-browser > details > summary::after { content:'•••'; font-size:14px; line-height:24px; color:var(--hu-muted); }\n.bt-root .bt-style-placeholder > details[open], .bt-root .bt-code-browser > details[open] { background:var(--hu-bg); border:1px solid var(--hu-line); border-radius:12px; padding:16px; z-index:4; width:calc(100% - 16px); }\n.bt-root .bt-source-chat-menu .hb-menu-trigger svg { display:none; }\n.bt-root .bt-starter-header-actions button[aria-label='Share conversation'] { background:transparent; color:var(--hu-muted); }\n.bt-root .bt-profile-history .bt-month-controls { width:128px; min-width:128px; max-width:none; }\n.bt-root .bt-profile-history-plot { height:200px; }\n.bt-root .bt-profile-history-plot .recharts-responsive-container { height:200px !important; }\n.bt-root .bt-profile-history-axis { font-size:12px; line-height:16px; }\n.bt-root .bt-inline-select select { font-size:14px; }\n.bt-root .bt-data-section .bt-inline-select .hu-input-wrap { height:36px; padding-inline:10px; border-radius:10px; }\n.bt-root .bt-status, .bt-root .bt-chip { font-size:14px; line-height:20px; padding:1px 6px; border-radius:5px; }\n.bt-root .bt-profile-body .bt-chip { font-size:11px; line-height:16px; padding:0 4px; }\n.bt-root .bt-template-project-board .bt-source-actions .bt-menu-trigger { width:36px; height:36px; min-width:36px; padding:8px; }\n.bt-root .bt-template-project-board .bt-source-actions .bt-menu-trigger > svg { width:20px; height:20px; }\n.bt-root .bt-template-project-board .bt-source-actions { white-space:nowrap; }\n.bt-root .bt-spend-channel { height:329px; }\n.bt-root .bt-spend-channel > .bt-number { margin-bottom:12px; }\n.bt-root .bt-spend-channel .bt-gauge { height:172px; margin:8px auto 16px; width:min(260px,100%); }\n.bt-root .bt-spend-channel .bt-gauge > svg { height:160px; }\n.bt-root .bt-spend-channel .bt-gauge > strong { font-size:32px; line-height:40px; bottom:12px; }\n.bt-root .bt-spend-channel .bt-gauge strong small { font-size:12px; line-height:16px; }\n.bt-root .bt-channel-legend { display:flex; justify-content:center; flex-wrap:wrap; gap:4px 14px; font-size:14px; line-height:20px; }\n.bt-root .bt-channel-legend > span { display:inline-flex; gap:6px; align-items:center; }\n.bt-root .bt-channel-legend strong { font-weight:500; }\n.bt-root .bt-channel-legend i { width:12px; height:12px; border-radius:4px; }\n.bt-root .bt-breakdown-panel .bt-progress-list > li > span{display:flex;align-items:center;gap:8px;}\n.bt-root .bt-breakdown-panel .bt-progress-list > li > span > svg{color:var(--hu-muted);flex:none;}\n.bt-root .bt-breadcrumb-person { display:inline-flex; align-items:center; gap:6px; }\n.bt-root .bt-breadcrumb-person i { display:grid; place-items:center; width:20px; height:20px; border-radius:99px; background:var(--hu-line); font-size:10px; font-style:normal; }\n.bt-root .bt-breadcrumb strong { display:inline-flex; align-items:center; gap:6px; text-transform:none; }\n.bt-root .bt-breadcrumb strong > svg { width:14px; height:14px; color:var(--hu-muted); }\n.bt-root .bt-hires article > .bt-person { background:transparent; }\n.bt-root .bt-hires > article > span:last-child { align-self:stretch; width:100%; text-align:center; }\n.bt-root .bt-activity-card { height:330px; padding:10px; }\n.bt-root .bt-activity-card > header { padding:6px 6px 0; margin-bottom:10px; }\n.bt-root .bt-activity-card > header > .hu-field { position:absolute; width:1px; height:1px; overflow:hidden; clip-path:inset(50%); }\n.bt-root .bt-activity-card .bt-mini-stats { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:8px; margin:0; }\n.bt-root .bt-activity-card .bt-mini-stats > span { padding:8px 10px; border-radius:12px; }\n.bt-root .bt-activity-card .bt-mini-stats small { display:flex; align-items:center; gap:5px; }\n.bt-root .bt-activity-card .bt-mini-stats small::before { content:''; width:12px; height:12px; background:var(--color-chart-3); border-radius:4px; }\n.bt-root .bt-activity-card .bt-mini-stats > span:nth-child(2) small::before { background:var(--color-chart-2); }\n.bt-root .bt-activity-card .bt-mini-stats > span:nth-child(3) small::before { background:var(--color-chart-4); }\n.bt-root .bt-activity-card .bt-activity-rings { width:200px; margin:12px auto 0; }\n@media(max-width:1023px){\n .bt-root .bt-shell:not(.bt-repository-shell):not(.bt-bare) .bt-breadcrumb{display:flex;}\n .bt-root.bt-template-chat-starter .bt-breadcrumb,.bt-root.bt-template-multi-agent-chat .bt-breadcrumb{display:none !important;}\n .bt-root .bt-page-heading{margin-bottom:10px;}\n .bt-root .bt-source-title .bt-source-menu{background:var(--hu-bg) !important;border:1px solid var(--hu-line);box-shadow:0 1px 2px #0000000d !important;}\n}\n@media(max-width:639px){\n .bt-root .bt-breadcrumb > span:nth-child(4),.bt-root .bt-breadcrumb > span:nth-child(5){display:inline-flex;}\n .bt-root .bt-source-actions > .bt-source-notification{display:flex;}\n .bt-root .bt-recent-hires{height:303px;}\n .bt-root .bt-hires > article{height:83px;}\n .bt-root .bt-source-actions{flex-basis:100%;}\n .bt-root .bt-hires .bt-person strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}\n}\n@media(min-width:640px) and (max-width:1279px){\n .bt-root .bt-tiles{grid-template-columns:repeat(4,minmax(0,1fr));}\n .bt-root .bt-tile > div{flex-wrap:wrap;gap:4px;}\n .bt-root .bt-dashboard-top{grid-template-columns:minmax(0,1fr);}\n .bt-root .bt-recent-hires{height:303px;}\n .bt-root .bt-hires > article{height:83px;}\n .bt-root .bt-grid-three > :last-child{grid-column:1/-1;}\n .bt-root.bt-template-medical-profile .bt-grid-three > :last-child{grid-column:auto;}\n}\n@media(max-width:1023px){\n .bt-root.bt-template-ai-profile .bt-breadcrumb > *{display:none !important;}\n .bt-root.bt-template-ai-profile .bt-breadcrumb > .bt-mobile-menu{display:inline-flex !important;position:absolute;top:0;inset-inline-start:0;width:36px;height:36px;border-radius:99px;align-items:center;justify-content:center;background:var(--hu-bg);border:1px solid var(--hu-line);}\n}\n.bt-root .bt-shell.bt-bare .bt-source-menu { display:none !important; }\n@media(min-width:640px) and (max-width:1023px){\n .bt-root:not(.bt-template-multi-agent-chat) .bt-shell:not(.bt-repository-shell):not(.bt-bare) .bt-main{padding-top:24px !important;}\n .bt-root.bt-template-ai-profile .bt-main{padding:24px !important;}\n .bt-root.bt-template-project-board .bt-main{padding:24px 24px 22px !important;}\n .bt-root .bt-tiles{grid-template-columns:repeat(2,minmax(0,1fr));}\n .bt-root .bt-grid-two{grid-template-columns:minmax(0,1fr);}\n .bt-root .bt-calendar{grid-template-rows:auto repeat(6,minmax(94px,auto));}\n .bt-root .bt-calendar-cell{min-height:94px;}\n}\n@media(min-width:1024px) and (max-width:1279px){\n .bt-root .bt-tiles{grid-template-columns:repeat(4,minmax(0,1fr));}\n .bt-root .bt-calendar{grid-template-rows:auto repeat(6,minmax(105px,auto));}\n .bt-root .bt-calendar-cell{min-height:105px;}\n}\n@media(min-width:1536px){.bt-root .bt-calendar{grid-template-rows:auto repeat(6,minmax(164px,auto));}.bt-root .bt-calendar-cell{min-height:164px;}}\n.bt-root.bt-template-hr .bt-recent-hires{height:329px;}\n.bt-root.bt-template-hr .bt-hires > article{height:95px;}\n.bt-root .bt-people-panel{height:365px;}\n@media(max-width:1279px){.bt-root .bt-traffic-panel{height:257px;}}\n@media(max-width:1023px){.bt-root .bt-people-panel{height:257px;}}\n.bt-root .bt-expandable-list{position:relative;min-height:0;}\n.bt-root .bt-breakdown-panel .bt-expandable-list{max-height:calc(100% - 8px);overflow:auto;padding-bottom:8px;}\n.bt-root .bt-list-expand{display:grid;place-items:center;position:sticky;bottom:2px;inset-inline-start:calc(50% - 20px);width:40px;height:20px;padding:0;border:1px solid var(--hu-line);border-radius:99px;background:var(--hu-bg);color:var(--hu-muted);cursor:pointer;box-shadow:0 2px 4px #0000000a;}\n.bt-root .bt-list-expand>svg{width:14px;height:14px;}\n.bt-root.bt-profile-snippet { width:100%; }\n.bt-root.bt-profile-snippet .bt-profile-card { margin:0; }\n.bt-root.bt-calendar-snippet { width:100%; padding:12px; background:var(--hu-bg-secondary); }\n.bt-root.bt-calendar-snippet .bt-source-menu { display:none !important; }\n.bt-root.bt-calendar-snippet .bt-calendar { padding:8px; }\n.bt-root.bt-calendar-snippet .bt-calendar-cell { min-height:72px; }\n.bt-root.bt-calendar-snippet .bt-calendar { grid-template-rows:auto repeat(6,minmax(72px,auto)); }\n.bt-root.bt-calendar-snippet .bt-source-title h1 { font-size:20px; }\n.bt-root.bt-calendar-snippet .bt-page-heading { gap:8px; }\n.bt-root.bt-calendar-snippet .bt-calendar-feeds { display:none; }\n.bt-root.bt-calendar-snippet .bt-month-controls { width:160px; min-width:160px; }\n.bt-root.bt-calendar-snippet .bt-month-controls > strong { display:none; }\n.bt-root.bt-image-loader-snippet { position:relative; display:grid; place-items:center; width:100%; min-height:500px; padding:24px; background:var(--hu-bg-secondary); border:1px solid var(--hu-line); border-radius:24px; }\n.bt-root .bt-image-snippet-stage { width:200px; height:250px; border-radius:16px; overflow:hidden; }\n.bt-root .bt-image-snippet-stage > img { width:200px; height:250px; object-fit:cover; }\n.bt-root .bt-image-snippet-stage > .bt-image-countdown { width:100%; height:100%; }\n.bt-root .bt-snippet-replay { position:absolute; top:16px; inset-inline-end:16px; display:grid; place-items:center; width:28px; height:28px; padding:5px; border:0; background:transparent; color:var(--hu-muted); border-radius:8px; cursor:pointer; }\n@container helios-template (max-width:639px){.bt-root.bt-profile-snippet .bt-mini-stats{grid-template-columns:repeat(2,minmax(0,1fr));}.bt-root.bt-profile-snippet .bt-heatmap{overflow:auto;}.bt-root.bt-profile-snippet .bt-heatmap-grid{min-width:646px;}.bt-root.bt-calendar-snippet .bt-event{font-size:9px;line-height:14px;min-height:14px;}}\n.bt-root.bt-profile-snippet .bt-profile-cover{display:none;}\n.bt-root.bt-profile-snippet .bt-profile-body{padding:16px;}\n.bt-root.bt-profile-snippet .bt-profile-actions{margin-top:0;}\n.bt-root.bt-image-loader-snippet{width:200px;height:250px;min-height:0;padding:0;border-radius:12px;overflow:hidden;}\n.bt-root .bt-image-snippet-stage{width:200px;height:250px;border-radius:12px;direction:ltr;}\n.bt-root .bt-image-snippet-track{display:flex;width:400px;height:250px;}\n.bt-root .bt-image-snippet-track>.bt-image-countdown,.bt-root .bt-image-snippet-track>img{flex:none;width:200px;height:250px;object-fit:cover;}\n.bt-root .bt-snippet-replay{top:8px;inset-inline-end:8px;}\n.bt-root .bt-repository-nav summary{list-style:none;display:flex;align-items:center;gap:8px;}\n.bt-root .bt-repository-nav summary::-webkit-details-marker{display:none;}\n.bt-root .bt-repository-nav details button{justify-content:space-between;gap:6px;}\n.bt-root .bt-repository-nav details button > span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}\n.bt-root .bt-repository-nav details button > small{font-size:12px;line-height:16px;padding:1px 4px;flex:none;background:var(--hu-bg-secondary);border-radius:4px;color:var(--hu-muted);}\n.bt-root .bt-repository-collapsed > details,.bt-root .bt-repository-collapsed > p,.bt-root .bt-repository-collapsed > button > span{display:none;}\n.bt-root .bt-repository-collapsed > button{width:36px;height:36px;justify-content:center;padding:8px;}\n.bt-root .bt-native-sidebar:has(.bt-repository-collapsed) nav{padding:0;}\n.bt-root .bt-agent-editor > .hp-source-creator > .hp-agent-creator{padding:0;}\n.bt-root .bt-agent-editor > .bn-source .hp-agent-creator{padding:0;}\n.bt-root .bt-agent-editor > .hu-button{margin-top:12px;}\n.bt-root .hu-dialog:has(.bt-agent-editor) > header{display:none;}\n.bt-root .hu-dialog:has(.bt-agent-editor) > .hu-dialog-body{height:100%;}\n.bt-root .bt-multi-main .hp-source-multi-actions{display:flex;gap:8px;}\n.bt-root .bt-multi-main .hp-source-multi-actions > .bn-source > button{flex:1;border-radius:99px;}\n.bt-root .bt-multi-main .hp-source-multi-actions > button{flex:1;}\n.bt-root .bt-task[data-selected=true]{outline:2.5px solid var(--color-border-button-hover);outline-offset:-1px;}\n.bt-root .hu-dialog:has(.bt-source-right-panel)::backdrop{background:transparent;backdrop-filter:none;}\n.bt-root{--bt-heat-empty:var(--color-neutral-300);}\nbody.dark .bt-root,.bt-root[data-helios-theme=dark],[data-helios-theme=dark] .bt-root{--bt-heat-empty:var(--color-neutral-700);}\n.bt-root .bt-heatmap-grid button[aria-pressed=true]{outline:0;}\n.bt-root .bt-heatmap-grid button:focus-visible{outline:2px solid var(--hu-focus);outline-offset:2px;}\n.bt-root .bt-source-workspace-header{min-height:28px;height:28px;flex:none;position:relative;}\n.bt-root .bt-source-workspace-header > span:first-child{display:flex;align-items:center;gap:8px;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}\n.bt-root .bt-source-workspace-header > span:first-child > svg{width:16px;height:16px;flex:none;}\n.bt-root .bt-source-workspace-header > div{display:flex;align-items:center;gap:0;}\n.bt-root .bt-workspace-header-share{background:transparent;color:var(--hu-muted);}\n.bt-root .bt-source-workspace-header .hb-menu-trigger{font-size:0;border:0;background:transparent;box-shadow:none;width:28px;height:28px;min-width:28px;padding:4px;}\n.bt-root .bt-source-workspace-header .hb-menu-trigger > svg,.bt-root .bt-source-workspace-header .hb-menu-trigger > span > svg{width:18px;height:18px;}\n@media(max-width:1023px){.bt-root .bt-source-workspace-header > span:first-child strong{font-size:14px;line-height:20px;font-weight:500;}.bt-root .bt-source-workspace-header .bt-source-menu{display:inline-flex !important;background:transparent;box-shadow:none;}}\n.bt-root.bt-template-multi-agent-chat .bt-main{padding:0 !important;}\n.bt-root .bt-multi-main > .hp-multi-chat[data-presentation=source]{background:transparent;border:0;gap:16px;}\n.bt-root .bt-multi-main .hp-multi-chat[data-presentation=source] .hp-multi-conversation{background:var(--hu-bg-secondary);border:0;border-radius:24px;padding:12px;}\n.bt-root .bt-multi-main .hp-multi-chat[data-presentation=source] > aside{border:1px solid var(--color-border-button-white);border-radius:24px;}\n.bt-root .bt-source-sidebar-footer{display:flex;flex-direction:column;gap:4px;margin-top:auto;padding-top:20px;}\n.bt-root .bt-source-sidebar-footer>a,.bt-root .bt-source-sidebar-footer>button{display:flex;align-items:center;gap:8px;padding:8px;border:0;background:none;color:var(--hu-muted);font-size:14px;line-height:20px;text-decoration:none;text-align:start;cursor:pointer;}\n.bt-root .bt-source-sidebar-footer>a:hover,.bt-root .bt-source-sidebar-footer>button:hover{background:var(--hu-line);border-radius:8px;}\n.bt-root .bt-multi-main .hp-source-sidebar-footer{margin-top:auto;}\n.bt-root .bt-multi-main .hp-multi-chat[data-presentation=source]>aside>.hu-button{display:none;}\n.bt-root .bt-multi-main .hp-source-multi-actions{gap:8px;}\n.bt-root .bt-multi-main .hp-source-multi-actions>.hb-dropdown{flex:1;}\n.bt-root .bt-multi-main .hp-source-multi-actions>.hb-dropdown>.hb-menu-trigger{width:100%;height:36px;min-height:36px;background:linear-gradient(180deg,var(--color-accent-500),var(--color-accent-600));color:var(--color-text-white);border:0;border-radius:99px;padding:8px;box-shadow:0 1px 1px #0001;}\n.bt-root .bt-multi-main .hp-source-multi-actions>.hb-dropdown>.hb-menu-trigger>svg{display:none;}\n.bt-root .bt-multi-main .hp-source-multi-actions>.hb-dropdown>.hb-menu-trigger>span>svg{width:20px;height:20px;}\n.bt-root .bt-group-members{display:grid;gap:12px;margin:16px 0 0;padding:12px;border:1px solid var(--hu-line);border-radius:12px;}\n/* Source-native charts must not inherit the earlier compact demo's metric margins. */\n.bt-root .hc-source-example .hc-react-card .hu-chart-total{margin:0;font-size:24px;line-height:32px;font-weight:500;}\n.bt-root .bt-home-revenue .hc-source-example{--source-chart-height:337px !important;}\n.bt-root.bt-template-finance .hc-source-example[data-source-chart=radial-chart-card],.bt-root.bt-template-finance .hc-source-example[data-source-chart=scatter-chart-card]{--source-chart-height:329px !important;}\n.bt-root.bt-template-finance .hc-source-example[data-source-chart=radial-chart-card] .hc-react-plot{height:230px !important;}\n.bt-root.bt-template-finance .hc-source-example[data-source-chart=scatter-chart-card] .hc-react-plot{height:184px !important;}\n.bt-root .bt-data-section .bt-person>img{width:24px;height:24px;}\n.bt-root .bt-money{display:inline-flex;border-radius:5px;padding:2px 5px;line-height:20px;background:var(--hu-bg-secondary);white-space:nowrap;}\n.bt-root .bt-money.bt-positive{background:var(--color-status-lime-background);color:var(--color-status-lime-text);}\n.bt-root .bt-transaction-name{display:flex;align-items:center;gap:8px;white-space:nowrap;}\n.bt-root .bt-transaction-name>span{width:32px;height:32px;flex:none;display:grid;place-items:center;border-radius:8px;background:var(--hu-bg-secondary);}\n.bt-root .bt-transaction-name>span>svg{width:18px;height:18px;}\n.bt-root .bt-inline-select-slot{position:relative;display:inline-flex;}\n.bt-root .bt-inline-select-slot::before{content:'';position:absolute;inset-inline-start:12px;top:50%;transform:translateY(-50%);width:7px;height:7px;border-radius:50%;background:var(--color-purple-500);box-shadow:0 0 0 3px var(--color-purple-100);pointer-events:none;z-index:1;}\n.bt-root .bt-inline-select-slot[data-value=Waiting]::before,.bt-root .bt-inline-select-slot[data-value='Credit card']::before{background:var(--color-yellow-500);box-shadow:0 0 0 3px var(--color-yellow-100);}\n.bt-root .bt-inline-select-slot[data-value=Completed]::before,.bt-root .bt-inline-select-slot[data-value=Checking]::before,.bt-root .bt-inline-select-slot[data-value=Active]::before{background:var(--color-green-500);box-shadow:0 0 0 3px var(--color-green-100);}\n.bt-root .bt-inline-select-slot select{padding-inline-start:14px;}\n.bt-root.bt-repository-sidebar-snippet{display:flex;width:260px;max-width:100%;height:640px;min-height:0;background:transparent;}\n.bt-root.bt-repository-sidebar-snippet>.bn-source>aside{height:100%;}\n.bt-root.bt-repository-sidebar-snippet .bt-repository-nav{flex:1;}\n.bt-root .bt-data-section{padding:0;border:1px solid var(--hu-line);overflow:hidden;}\n.bt-root .bt-data-section>header{padding:12px;}\n.bt-root .bt-data-section>header small{font-size:14px;line-height:20px;}\n.bt-root .bt-data-section>header .hu-input-wrap{height:36px;min-height:36px;}\n.bt-root .bt-data-section>header .bt-source-table-search .hu-input-wrap{border:0;border-radius:99px;background:var(--hu-bg-secondary);}\n.bt-root .bt-data-section .hu-table-card[data-presentation=board] th{height:46px;font-size:14px;line-height:20px;font-weight:400;background:var(--hu-bg-secondary);padding:12px;}\n.bt-root .bt-data-section .hu-table-card[data-presentation=board] td{height:59px;font-size:14px;line-height:20px;padding:10px 12px;}\n.bt-root .bt-data-section .hu-table-card[data-presentation=board] td .bt-row-actions{gap:8px;}\n.bt-root .bt-data-section .hu-table-card[data-presentation=board] td .bt-row-actions .hu-button{width:32px;min-width:32px;height:32px;min-height:32px;border-radius:10px;padding:7px;}\n.bt-root .bt-data-section .hu-table-card[data-presentation=board] .bt-row-actions .hb-menu-trigger>svg{display:none;}\n.bt-root.bt-repository-sidebar-snippet{height:100%;}\n.bt-root .bt-pipeline-panel .bt-progress-list>li>div{position:relative;overflow:visible;}\n.bt-root .bt-pipeline-panel .bt-progress-list>li>div>i{min-width:20px;}\n.bt-root .bt-pipeline-icon{position:absolute;top:2px;inset-inline-start:4px;width:16px;height:16px;color:var(--hu-text);}\n.bt-root .bt-pipeline-icon>svg{display:block;width:16px;height:16px;}\n/* Observed source app tables use960px scrolling canvases and one flexible identity column. */\n.bt-root .bt-data-section .hu-table-card[data-presentation=board] table{min-width:960px;table-layout:fixed;width:100%;}\n.bt-root .bt-data-section .hu-table-card[data-presentation=board] th:first-child,.bt-root .bt-data-section .hu-table-card[data-presentation=board] td:first-child{width:36px;padding-inline:12px 8px;}\n.bt-root .bt-data-section .hu-table-card[data-presentation=board] th:nth-child(2),.bt-root .bt-data-section .hu-table-card[data-presentation=board] td:nth-child(2){width:calc((100% - 248px)/5 - 24px);padding-inline:0;}\n.bt-root .bt-data-section .hu-table-card[data-presentation=board] th:not(:first-child):not(:nth-child(2)):not(:last-child){width:calc((100% - 248px)/5 + 24px);}\n.bt-root .bt-data-section .hu-table-card[data-presentation=board] th:last-child,.bt-root .bt-data-section .hu-table-card[data-presentation=board] td:last-child{width:140px;padding-inline:12px;}\n.bt-root:is(.bt-template-finance,.bt-template-marketing,.bt-template-hr) .bt-data-section .hu-table-card[data-presentation=board] th:nth-child(2){width:calc((100% - 248px)*1.4/5.4 - 24px);}\n.bt-root:is(.bt-template-finance,.bt-template-marketing,.bt-template-hr) .bt-data-section .hu-table-card[data-presentation=board] th:not(:first-child):not(:nth-child(2)):not(:last-child){width:calc((100% - 248px)/5.4 + 24px);}\n.bt-root .bt-data-section .hu-board-pagination{padding:12px;}\n.bt-root .bt-data-section .hu-board-pagination button{font-size:14px;}\n.bt-root .bt-data-section .bt-inline-select{width:150px;max-width:150px;}\n.bt-root .bt-template-composer .hp-source-composer .hp-composer-uploads{display:block;}\n.bt-root.bt-template-calendar .bt-breadcrumb{margin-bottom:8px;}\n.bt-root .bt-month-controls{position:relative;height:36px;padding:8px 12px;gap:8px;}\n.bt-root .bt-month-controls>.hu-button{width:16px;min-width:16px;height:16px;min-height:16px;padding:0;border:0;background:none;box-shadow:none;}\n.bt-root .bt-month-controls>.hu-button svg{width:16px;height:16px;}\n.bt-root .bt-month-label{flex:1;white-space:nowrap;min-width:0;text-align:center;font:500 14px/20px var(--hu-font);border:0;background:none;color:var(--hu-text);cursor:pointer;padding:0;}\n.bt-root .bt-month-label:focus-visible{outline:2px solid var(--hu-focus);outline-offset:2px;border-radius:4px;}\n.bt-month-popup{width:320px;max-width:calc(100vw - 24px);padding:0 12px 12px;background:var(--hu-bg);border:1px solid var(--hu-line);border-top:0;border-radius:0 0 12px 12px;box-shadow:0 2px 4px #00000012;z-index:100;}\n.bt-month-popup [role=dialog],.bt-month-popup [role=application]{outline:none;}\n.bt-root .bt-month-menu-open{border-bottom-color:transparent;border-end-start-radius:0;border-end-end-radius:0;}\n.bt-root .bt-calendar-tool{width:36px;height:36px;}\n\n/* Match the source calendar independent week tracks; a busy day must not stretch all six weeks. */\n.bt-root .bt-calendar { grid-template-rows:26px repeat(6,minmax(128px,auto)); }\n.bt-root .bt-calendar-week { height:26px; padding:0; align-items:center; }\n.bt-root .bt-calendar-row { margin-bottom:0; }\n.bt-root .bt-calendar-cell { gap:2px; }\n.bt-root .bt-calendar-day { min-height:20px; }\n.bt-root .bt-calendar-events { gap:2px; }\n@media(min-width:640px) and (max-width:1023px){.bt-root .bt-calendar {grid-template-rows:26px repeat(6,minmax(94px,auto));}}\n@media(min-width:1024px) and (max-width:1279px){.bt-root .bt-calendar {grid-template-rows:26px repeat(6,minmax(105px,auto));}}\n@media(min-width:1536px){.bt-root .bt-calendar {grid-template-rows:26px repeat(6,minmax(164px,auto));}}\n@media(max-width:639px){.bt-root .bt-calendar {grid-template-rows:20px repeat(6,minmax(72px,auto));}.bt-root .bt-calendar-week{height:20px;}.bt-root .bt-calendar-cell {min-height:72px;}}\n.bt-root.bt-calendar-snippet .bt-calendar {grid-template-rows:20px repeat(6,minmax(72px,auto));}\n\n.bt-root .bt-image-gallery { margin-top:0; }\n\n.bt-root .bt-starter-title {display:flex;align-items:center;gap:8px;}\n.bt-root .bt-starter-title h1 {margin:0;}\n@media(min-width:1024px){.bt-root .bt-starter-title .bt-source-menu{display:none;}}\n@media(min-width:640px){.bt-root .bt-ai-profile .bt-mini-stats{grid-template-columns:repeat(4,minmax(0,1fr));}}\n@media(max-width:639px){.bt-root.bt-template-marketing .bt-tiles{grid-template-columns:minmax(0,1fr);}}\n\n@media(min-width:640px) and (max-width:1023px){.bt-root .bt-multi-main > .hp-multi-chat[data-presentation=source]{display:grid;grid-template-columns:260px minmax(0,1fr);}}\n@media(min-width:640px) and (max-width:1023px){\n .bt-root .bt-multi-main > .hp-multi-chat[data-presentation=source] > aside{max-height:none;height:100%;overflow:hidden;border-bottom:0;}\n .bt-root .bt-multi-main > .hp-multi-chat[data-presentation=source] > .hp-multi-conversation{min-height:0;}\n .bt-root .bt-multi-main > .hp-multi-chat[data-presentation=source] > .hp-multi-conversation > [role=log]{min-height:0;}\n}\n\n/* Public contribution tier recipe: the data stays local; both theme palettes match the reference. */\n.bt-root{--bt-contribution-tier-0:var(--color-chart-neutral);--bt-contribution-tier-1:var(--color-violet-200);--bt-contribution-tier-2:var(--color-violet-400);--bt-contribution-tier-3:var(--color-violet-500);--bt-contribution-tier-4:var(--color-violet-600);--bt-contribution-tier-5:var(--color-violet-700);}\n.dark .bt-root,.bt-root[data-helios-theme=dark],[data-helios-theme=dark] .bt-root{--bt-contribution-tier-1:var(--color-violet-950);--bt-contribution-tier-2:var(--color-violet-800);--bt-contribution-tier-3:var(--color-violet-700);--bt-contribution-tier-4:var(--color-violet-600);--bt-contribution-tier-5:var(--color-violet-500);}\n/* Repository navigation remains a vertical tree even inside a narrow documentation container. */\n.bt-root .bt-native-sidebar .bt-repository-nav,.bt-root.bt-repository-sidebar-snippet .bt-repository-nav{display:grid;grid-template-columns:minmax(0,1fr);max-height:none;overflow:visible;gap:4px;}\n.bt-root .bt-native-sidebar .bt-repository-nav>p,.bt-root.bt-repository-sidebar-snippet .bt-repository-nav>p{display:block;}\n.bt-root .bt-native-sidebar .bt-repository-nav details,.bt-root.bt-repository-sidebar-snippet .bt-repository-nav details{min-width:0;}\n.bt-root .bt-native-sidebar .bt-repository-nav details>div,.bt-root.bt-repository-sidebar-snippet .bt-repository-nav details>div{display:flex;flex-direction:column;overflow:visible;margin-inline-start:10px;padding-inline-start:14px;border-inline-start:1px solid var(--hu-line);}\n.bt-root .bt-native-sidebar .bt-repository-nav details button,.bt-root.bt-repository-sidebar-snippet .bt-repository-nav details button{width:100%;min-width:0;}\n\n@keyframes bt-contribution-pop{from{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}\n@media(prefers-reduced-motion:no-preference){.bt-root .bt-heatmap-grid>button[data-active=true]{animation:bt-contribution-pop .38s ease-out both;}}\n@media(prefers-reduced-motion:reduce){.bt-root .bt-heatmap-grid>button{animation:none;}}\n/* Source full apps scroll their main pane below lg; desktop keeps document scrolling. */\n@media(max-width:1023px){\n .bt-root[data-board-template]{height:var(--bt-viewport-height,100dvh);min-height:0;overflow:hidden;}\n .bt-root[data-board-template] .bt-shell{height:100%;min-height:0;}\n .bt-root[data-board-template] .bt-main{height:100%;min-height:0;overflow-x:hidden;overflow-y:auto;}\n}\n/* The phone calendar fills the remaining application pane instead of collapsing to its minimum rows. */\n@media(max-width:639px){\n .bt-root[data-board-template=calendar] .bt-calendar{flex:1 1 0;min-height:0;padding:0;gap:0;border-radius:0;grid-template-rows:20px repeat(6,minmax(0,1fr));border-block:1px solid var(--hu-line);}\n .bt-root[data-board-template=calendar] .bt-calendar-week,.bt-root[data-board-template=calendar] .bt-calendar-row{gap:0;min-height:0;}\n .bt-root[data-board-template=calendar] .bt-calendar-cell{min-height:72px;padding:6px;border:0;border-inline-end:1px solid var(--hu-line);border-bottom:1px solid var(--hu-line);overflow:hidden;}\n .bt-root[data-board-template=calendar] .bt-calendar-row>.bt-calendar-cell:last-child{border-inline-end:0;}\n .bt-root[data-board-template=calendar] .bt-calendar-row:last-child>.bt-calendar-cell{border-bottom:0;}\n .bt-root[data-board-template=calendar] .bt-calendar-day{font-size:11px;line-height:16px;}\n .bt-root[data-board-template=calendar] .bt-calendar-cell:has(.bt-calendar-more[aria-expanded=true]){overflow:auto;}\n}\n\n/* Inline documentation demos keep viewport media semantics while bounding application scrolling. */\n.bt-root.bt-document-embed{--bt-viewport-height:855px;position:relative;isolation:isolate;contain:layout;height:855px!important;min-height:0!important;overflow:hidden;}\n.bt-document-embed .bt-shell{height:855px!important;min-height:0!important;}\n.bt-document-embed .bt-main{height:100%!important;min-height:0!important;overflow-x:hidden!important;overflow-y:auto!important;}\n.bt-document-embed .bt-native-sidebar{position:absolute!important;top:12px;inset-inline-start:12px;height:831px!important;}\n.bt-document-embed .bt-native-sidebar>aside{height:100%;}\n.bt-document-embed.bt-template-calendar{--bt-viewport-height:855px;height:auto!important;overflow:visible;contain:layout;}\n.bt-document-embed.bt-template-calendar .bt-shell,.bt-document-embed.bt-template-calendar .bt-main{height:auto!important;overflow:visible!important;}\n.bt-document-embed.bt-template-calendar .bt-page-content{height:auto;flex:none;display:block;}\n.bt-document-embed.bt-template-calendar .bt-page-heading{flex-wrap:wrap;row-gap:8px;}\n.bt-document-embed.bt-template-calendar .bt-calendar{flex:none;}\n.bt-month-short{display:none;}\n@media(max-width:639px){\n .bt-root.bt-document-embed.bt-template-calendar{--bt-viewport-height:857px;height:857px!important;overflow:hidden;}\n .bt-document-embed.bt-template-calendar .bt-shell,.bt-document-embed.bt-template-calendar .bt-main,.bt-document-embed.bt-template-calendar .bt-app-body{height:100%!important;}\n .bt-document-embed.bt-template-calendar .bt-app-body{display:flex;min-height:0;}\n .bt-document-embed.bt-template-calendar .bt-page-content{height:100%;flex:1 1 0;min-height:0;display:flex;flex-direction:column;}\n .bt-document-embed.bt-template-calendar .bt-page-heading{padding:16px 16px 8px;margin:0;flex:none;}\n .bt-document-embed.bt-template-calendar .bt-source-actions{flex-wrap:nowrap;max-width:none;}\n .bt-document-embed.bt-template-calendar .bt-month-controls{width:84px;min-width:84px;max-width:84px;}\n .bt-document-embed.bt-template-calendar .bt-month-long{display:none;}\n .bt-document-embed.bt-template-calendar .bt-month-short{display:inline;}\n .bt-document-embed.bt-template-calendar .bt-calendar{flex:1 1 0;min-height:0;}\n}\n@media(min-width:1024px){.bt-document-embed .bt-native-sidebar{position:relative!important;top:0;inset-inline-start:auto;}}\n@media(max-width:1023px){.bt-document-embed .bt-native-sidebar{top:0;inset-inline-start:0;}}\n.bt-document-embed.bt-template-calendar .bt-page-content{min-width:0;width:100%;max-width:100%;}\n\n/* Source Multi-agent mobile view replaces its sidebar with the native conversation drawer. */\n.bt-root .bt-multi-main > .hp-multi-chat[data-presentation=source][data-mobile-sidebar=true] {\n  display: grid;\n  grid-template-columns: minmax(0, 1fr);\n  gap: 0;\n}\n.bt-root .bt-multi-main > .hp-multi-chat[data-presentation=source][data-mobile-sidebar=true] > .hp-multi-conversation {\n  min-height: 0;\n  height: 100%;\n}\n.bt-root .bt-multi-workspace:has(.hp-multi-chat[data-mobile-sidebar=true]) {\n  height: calc(var(--bt-viewport-height, 100dvh) - 24px);\n}\n.bt-root .bt-multi-main:has(> .hp-multi-chat[data-mobile-sidebar=true]) {\n  height: 100%;\n}\n/* The source action strip already exposes agent creation in this template. */\n.bt-root .hp-source-mobile-nav-content .hp-source-agent-navigation > .hu-button {\n  display: none;\n}\n/* DropdownMenu renders a direct trigger; preserve the source action strip after that shared refactor. */\n.bt-root .hp-source-multi-actions .hb-menu-trigger {\n  flex: 1;\n  height: 36px;\n  min-height: 36px;\n  border: 0;\n  border-radius: 999px;\n  padding: 8px;\n  color: var(--color-text-white);\n  background: linear-gradient(180deg, var(--color-accent-500), var(--color-accent-600));\n  box-shadow: 0 1px 1px #0001;\n}\n.bt-root .hp-source-multi-actions .hb-menu-trigger > span[aria-hidden] {\n  display: none;\n}\n\n/* Public Multi-agent Marketplace pane in the source native SettingsModal shell. */\n.bt-agent-marketplace{height:100%;min-width:0;min-height:0;display:flex;flex-direction:column;color:var(--hu-text);font:400 14px/20px var(--hu-font);overflow:hidden;}\n.bt-marketplace-heading{display:flex;align-items:center;gap:8px;padding:32px 32px 16px;flex:none;}\n.bt-marketplace-heading h2{margin:0;flex:1;font:500 16px/24px var(--hu-font);}\n.bt-marketplace-heading>.bn-source{display:contents;}\n.bt-marketplace-heading>button{margin-inline-start:auto;}\n.bt-marketplace-heading>.bt-marketplace-back{margin-inline-start:0;}\n.bt-marketplace-back>svg{transform:rotate(180deg);}\n:dir(rtl) .bt-marketplace-back>svg{transform:none;}\n.bt-marketplace-controls{display:flex;flex-direction:column;gap:12px;padding:0 32px 16px;flex:none;}\n.bt-marketplace-search .hu-field>label{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;}\n.bt-marketplace-search .hu-input-wrap{min-height:36px;border:0;background:var(--hu-bg-secondary);box-shadow:none;}\n.bt-marketplace-controls>[role=tablist]{display:flex;gap:4px;align-items:center;flex-wrap:wrap;}\n.bt-marketplace-controls [role=tab]{border:0;background:transparent;color:var(--hu-muted);font:400 12px/18px var(--hu-font);border-radius:8px;padding:5px 8px;cursor:pointer;}\n.bt-marketplace-controls [role=tab][aria-selected=true]{background:var(--color-background-tertiary-default);color:var(--hu-text);}\n.bt-marketplace-controls [role=tab]:focus-visible,.bt-marketplace-section>header>button:focus-visible,.bt-marketplace-card-title:focus-visible{outline:2px solid var(--color-border-focus-ring);outline-offset:2px;}\n.bt-marketplace-scroll{min-height:0;flex:1;overflow-y:auto;overscroll-behavior:contain;padding:0 32px 32px;}\n.bt-marketplace-section+.bt-marketplace-section{margin-top:24px;}\n.bt-marketplace-section>header{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:12px;}\n.bt-marketplace-section h3{margin:0;font:400 14px/20px var(--hu-font);}\n.bt-marketplace-section>header>button{display:flex;align-items:center;gap:4px;background:transparent;border:0;color:var(--hu-muted);font:400 12px/18px var(--hu-font);cursor:pointer;}\n.bt-marketplace-section>header>button svg{width:14px;height:14px;}\n.bt-marketplace-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;}\n.bt-marketplace-bot-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;}\n.bt-marketplace-card{display:flex;min-width:0;flex-direction:column;gap:12px;border-radius:20px;padding:12px;background:var(--hu-bg-secondary);}\n.bt-marketplace-card-title{display:flex;align-items:center;gap:12px;min-width:0;padding:0;border:0;background:transparent;color:inherit;text-align:start;cursor:pointer;border-radius:12px;}\n.bt-marketplace-card-title>span:last-child{min-width:0;}\n.bt-marketplace-card strong{display:block;font:500 14px/20px var(--hu-font);}\n.bt-marketplace-card small{display:block;color:var(--hu-muted);font:400 12px/18px var(--hu-font);}\n.bt-marketplace-card p{margin:0;min-height:40px;color:var(--hu-muted);font:400 12px/18px var(--hu-font);}\n.bt-marketplace-card>.bn-source{display:contents;}\n.bt-marketplace-card>button:not(.bt-marketplace-card-title){width:100%;margin-top:auto;min-height:28px;height:28px;}\n.bt-marketplace-card-title>.hp-source-artwork{width:32px;height:32px;flex-shrink:0;}\n.bt-marketplace-bot-mini{padding:16px 8px;align-items:center;text-align:center;}\n.bt-marketplace-bot-mini>.bt-marketplace-card-title{flex-direction:column;gap:8px;align-items:center;text-align:center;width:100%;}\n.bt-marketplace-bot-mini .hp-source-artwork{width:64px;height:64px;}\n.bt-marketplace-bot-mini strong{font-size:12px;line-height:18px;}\n.bt-marketplace-logo{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;background:var(--color-background-tertiary-default);border-radius:10px;overflow:hidden;}\n.bt-marketplace-logo>img{height:65%;width:65%;object-fit:contain;}\n.bt-marketplace-logo-notion{background:#000;}\n:is(.dark,[data-helios-theme=dark]){--bt-marketplace-logo-filter:invert(1);}\n[data-helios-theme=light]{--bt-marketplace-logo-filter:none;}\n.bt-marketplace-logo>img[data-invert]{filter:var(--bt-marketplace-logo-filter,none);}\n.bt-marketplace-detail{padding-top:8px;}\n.bt-marketplace-detail-title{display:flex;align-items:center;gap:12px;margin-bottom:16px;}\n.bt-marketplace-detail-title>.hp-source-artwork{width:64px;height:64px;flex-shrink:0;}\n.bt-marketplace-detail-title h3{margin:0;font:500 24px/32px var(--hu-font);}\n.bt-marketplace-detail-title p{margin:4px 0 0;color:var(--hu-muted);font-size:12px;}\n.bt-marketplace-detail>p{margin:0 0 20px;color:var(--hu-muted);font:400 14px/22px var(--hu-font);}\n.bt-marketplace-detail-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:24px;}\n.bt-marketplace-detail-actions>a{display:inline-flex;align-items:center;gap:4px;color:var(--hu-muted);font-size:12px;text-decoration:underline;text-underline-offset:3px;}\n.bt-marketplace-detail-actions>a svg{width:14px;height:14px;}\n.bt-marketplace-detail>section+section{margin-top:24px;}\n.bt-marketplace-detail h4{margin:0 0 12px;font:400 14px/20px var(--hu-font);}\n.bt-marketplace-feature{display:flex;gap:12px;align-items:center;flex-wrap:wrap;padding:16px;border-radius:16px;background:var(--hu-bg-secondary);}\n.bt-marketplace-feature>strong,.bt-marketplace-feature strong{font:500 14px/20px var(--hu-font);}\n.bt-marketplace-feature>p{width:100%;margin:0;color:var(--hu-muted);font-size:12px;}\n.bt-marketplace-feature small{display:block;color:var(--hu-muted);font-size:12px;}\n.bt-marketplace-feature>.hp-source-artwork{width:32px;height:32px;}\n.bt-marketplace-detail dl{margin:0;}\n.bt-marketplace-detail dl>div{display:flex;align-items:start;justify-content:space-between;gap:16px;padding:7px 0;}\n.bt-marketplace-detail dt{color:var(--hu-muted);}\n.bt-marketplace-detail dd{margin:0;text-align:end;}\n.bt-marketplace-detail .bt-marketplace-local-note{margin-top:24px;font-size:12px;line-height:18px;}\n.bt-marketplace-empty{display:flex;min-height:200px;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:12px;}\n.bt-marketplace-empty h3,.bt-marketplace-empty p{margin:0;}\n.bt-marketplace-empty p{color:var(--hu-muted);}\n@media(max-width:639px){.bt-marketplace-heading{padding:16px 16px 12px;}.bt-marketplace-controls{padding:0 16px 16px;}.bt-marketplace-scroll{padding:0 16px 16px;}.bt-marketplace-grid{grid-template-columns:minmax(0,1fr);}.bt-marketplace-bot-grid{grid-template-columns:repeat(2,minmax(0,1fr));}.bt-marketplace-detail-title h3{font-size:20px;line-height:28px;}}\n.bt-root .hb-popover:has([role=menu][aria-label=\"Create bot or chat\"]){width:323px;max-width:calc(100vw - 24px);border-radius:20px;padding:6px;}\n.bt-root .hb-popover:has([role=menu][aria-label=\"Create bot or chat\"]) .hb-menu-item{padding:12px;border-radius:14px;}\n.bt-root .hb-popover:has([role=menu][aria-label=\"Create bot or chat\"]) .hb-menu-item strong{font:500 14px/20px var(--hu-font);}\n.bt-root .hb-popover:has([role=menu][aria-label=\"Create bot or chat\"]) .hb-menu-item small{font:400 12px/18px var(--hu-font);}\n.bt-marketplace-heading>button[aria-label=\"Close marketplace\"]{width:24px;height:24px;min-width:24px;min-height:24px;padding:4px;border-radius:999px;background:var(--color-background-tertiary-default);}\n.bt-marketplace-scroll:not(.bt-marketplace-detail){padding-top:4px;padding-bottom:24px;scrollbar-width:none;}\n.bt-marketplace-section+.bt-marketplace-section{margin-top:20px;}\n.bt-marketplace-section>header{min-height:32px;margin-bottom:4px;}\n.bt-marketplace-bot-mini{border-radius:16px;}\n.bt-marketplace-bot-mini .hp-source-artwork{width:52px;height:52px;}\n.bt-marketplace-bot-mini small{font-size:12px;line-height:16px;margin-top:4px;}\n\n.bt-marketplace-card{border-radius:16px;}\n/* Full Multi owns its viewport; the generic mobile breadcrumb offset must not push this app down. */\n.bt-root.bt-template-multi-agent-chat[data-board-template] .bt-main {\n  padding: 0 !important;\n  min-height: 0 !important;\n  height: 100% !important;\n}\n/* The source conversation header and composer carry their own padding. */\n.bt-root .bt-multi-main .hp-multi-chat[data-presentation=source] .hp-multi-conversation{padding:0;}\n.bt-marketplace-heading>button{color:var(--color-foreground-icon-secondary);}\n\n/* Final source toolbar presentation; interaction nodes and hit areas stay unchanged. */\n.bt-root[data-board-template=multi-agent-chat] .hp-source-multi-actions .hb-menu-trigger > span[aria-hidden=true]{display:none!important;}\n.bt-root[data-board-template=multi-agent-chat] .hp-multi-composer .hp-source-panel .hp-composer-toolbar > div:first-child > .hp-picker-trigger:has(>button[aria-label=Model]){grid-column:4;justify-self:end;margin-inline-start:0;min-width:0;max-width:100%;}\n.bt-root[data-board-template=multi-agent-chat] .hp-multi-composer .hp-source-panel .hp-picker-trigger > button[aria-label=Model]{max-width:100%;}\n.bt-root[data-board-template=multi-agent-chat] .hp-source-conversation-title{background:color-mix(in srgb,var(--color-background-primary-default) 75%,transparent);backdrop-filter:blur(6px) saturate(1.6);box-shadow:0 1px 2px #0000000a,inset 0 1px 0 color-mix(in srgb,var(--color-background-primary-default) 65%,transparent);}\n\n/* Fresh public-template comparison, 27 October 2026. */\n@media(min-width:1280px){.bt-root .bt-dashboard-top{grid-template-columns:minmax(0,1fr) 673px;}}\n.bt-root .bt-recent-hires>header{flex-shrink:0;height:28px;}\n.bt-root .bt-recent-hires>.bt-number{line-height:34px;margin-bottom:11px;flex-shrink:0;}\n.bt-root .bt-hires .bt-person{gap:12px;}\n.bt-root .bt-hires .bt-person small{font-size:13px;line-height:18px;}\n.bt-root .bt-hires>article>span:last-child{font-size:12px;line-height:18px;padding:0 8px;width:100%;}\n.bt-root .bt-recent-hires .bt-paging>button{height:32px;min-height:32px;padding:6px 8px;gap:2px;}\n.bt-root.bt-template-project-board .bt-breadcrumb{margin-bottom:4px;}\n.bt-root.bt-template-project-board .bt-page-heading{margin-bottom:10px;}\n.bt-root.bt-template-project-board .bt-kanban{gap:8px;padding-bottom:0;}\n.bt-root.bt-template-project-board .bt-kanban-column{padding:12px 6px 6px;}\n.bt-root.bt-template-project-board .bt-kanban-column>header{height:28px;min-height:28px;padding:0 6px;align-items:flex-start;}\n.bt-root.bt-template-project-board .bt-kanban-column h2{font-size:14px;line-height:20px;}\n.bt-root.bt-template-project-board .bt-task{min-height:147px;border:0;margin-bottom:6px;box-shadow:0 1px 1px #0000000d;}\n.bt-root.bt-template-project-board .bt-task-open{min-height:147px;padding:12px;gap:8px;}\n.bt-root.bt-template-project-board .bt-ticket-top{height:24px;min-height:24px;font-size:13px;line-height:18px;}\n.bt-root.bt-template-project-board .bt-ticket-assignees .bt-person{min-height:20px;height:20px;}\n.bt-root.bt-template-project-board .bt-task-labels{height:17px;min-height:17px;gap:4px;line-height:16px;}\n.bt-root.bt-template-project-board .bt-task-labels .bt-chip,.bt-root.bt-template-project-board .bt-task-labels .bt-status{font-size:12px;line-height:16px;padding:0 4px;}\n.bt-root.bt-template-project-board .bt-task h3{min-height:40px;font-size:14px;line-height:20px;}\n.bt-root.bt-template-project-board .bt-task-open>small{font-size:13px;line-height:18px;}\n.bt-root .bt-profile-history{border-radius:20px;padding:12px 10px;margin-bottom:16px;}\n.bt-root .bt-profile-history[data-kind=area]{height:267px;}\n.bt-root .bt-profile-history[data-kind=area] .bt-profile-history-plot,.bt-root .bt-profile-history[data-kind=area] .recharts-responsive-container{height:150px!important;}\n.bt-root .bt-spend-channel>header{height:56px;min-height:56px;margin-bottom:16px;align-items:flex-start;}\n.bt-root .bt-spending-headline{display:flex;align-items:center;gap:8px;margin-top:2px;}\n.bt-root .bt-spending-headline .bt-number{font-size:24px;line-height:34px;margin:0;}\n.bt-root .bt-spending-headline>small{display:inline-flex;font-size:12px;line-height:20px;padding:0 5px;border-radius:6px;background:var(--color-green-100);color:var(--color-green-800);}\n.bt-root .bt-spend-channel .bt-gauge{height:165px;width:100%;margin:0 0 16px;overflow:visible;}\n.bt-root .bt-spend-channel .bt-gauge>strong{inset:72px 0 auto;font-size:32px;line-height:40px;pointer-events:none;}\n.bt-root .bt-spend-channel .bt-channel-legend{margin:0;gap:4px 14px;}\n.bt-root .bt-spend-channel .bt-channel-legend>span{font-size:14px;line-height:20px;}\n.bt-root.bt-template-project-board .bt-ticket-top{height:22px;min-height:22px;}\n.bt-root.bt-template-project-board .bt-task-labels{height:22px;min-height:22px;gap:6px;}\n.bt-root.bt-template-project-board .bt-task-labels .bt-chip,.bt-root.bt-template-project-board .bt-task-labels .bt-status{font-size:13px;line-height:18px;padding:2px 6px;}\n.bt-root.bt-template-project-board .bt-task-open>small{margin-top:-3px;}\n.bt-root .hu-dialog:has(.bt-ticket-layout){inset:12px 12px 12px auto;width:min(610px,calc(100vw - 24px));height:calc(100dvh - 24px);max-height:calc(100dvh - 24px);padding:24px;border-radius:24px;overflow:hidden;}\n.bt-root .hu-dialog:has(.bt-ticket-layout)>header{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);padding:0;}\n.bt-root .hu-dialog:has(.bt-ticket-layout)>.hu-dialog-body{height:100%;padding:0;overflow:auto;}\n.bt-root .bt-ticket-layout{display:flex;flex-direction:column;gap:20px;height:100%;max-height:none;}\n.bt-root .bt-ticket-sheet-header{display:flex;align-items:center;gap:8px;position:relative;flex-shrink:0;min-height:24px;padding-inline-end:32px;color:var(--hu-muted);font-size:14px;line-height:20px;}\n.bt-root .bt-ticket-sheet-header>span{display:flex;align-items:center;gap:6px;flex-wrap:wrap;min-width:0;}\n.bt-root .bt-ticket-sheet-header>span>svg{width:12px;height:12px;flex:none;}\n.bt-root .bt-ticket-sheet-header>div{display:flex;gap:6px;}\n.bt-root .bt-ticket-sheet-header>div>.hu-button,.bt-root .bt-ticket-sheet-header .hb-menu-trigger{width:24px;height:24px;min-width:24px;min-height:24px;padding:3px;border-radius:8px;}\n.bt-root .bt-ticket-sheet-close{position:absolute;inset-inline-end:0;top:0;width:24px;height:24px;display:grid;place-items:center;border:0;border-radius:99px;background:var(--hu-bg-secondary);color:var(--hu-muted);cursor:pointer;}\n.bt-root .bt-ticket-properties{overflow:visible;padding:0;display:flex;flex-direction:column;gap:10px;flex-shrink:0;}\n.bt-root .bt-ticket-properties>.hu-field>label,.bt-root .bt-ticket-properties>.bt-native-field>label{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);}\n.bt-root .bt-ticket-properties>.hu-field>.hu-input-wrap{border:0;background:none;box-shadow:none;border-radius:0;padding:0;height:auto;min-height:22px;}\n.bt-root .bt-ticket-properties>.hu-field input{padding:0;font-size:16px;line-height:22px;font-weight:500;height:22px;}\n.bt-root .bt-ticket-properties>.bt-native-field textarea{padding:0;border:0;border-radius:0;background:none;font-size:14px;line-height:20px;resize:none;}\n.bt-root .bt-ticket-creator{font-size:14px;line-height:20px;margin:0 0 4px;}\n.bt-root .bt-ticket-properties>h3{font-size:14px;line-height:20px;margin:8px 0 0;}\n.bt-root .bt-ticket-property-grid{display:flex;flex-wrap:wrap;gap:12px;}\n.bt-root .bt-ticket-property-grid>.hu-field{min-width:0;flex:0 1 auto;max-width:44%;}\n.bt-root .bt-ticket-property-grid>.hu-field>label{font-size:12px;line-height:16px;color:var(--hu-muted);}\n.bt-root .bt-ticket-property-grid .hu-input-wrap{min-height:28px;height:28px;border:0;background:none;box-shadow:none;padding:0;}\n.bt-root .bt-ticket-property-grid select{padding:0;font-size:14px;line-height:20px;}\n.bt-root .bt-ticket-resources{justify-content:flex-start;gap:12px;}\n.bt-root .bt-ticket-resources>.hu-button{display:none;}\n.bt-root .bt-ticket-properties .bt-profile-history{height:258px;margin:10px 0 0;padding:16px;border-radius:20px;}\n.bt-root .bt-ticket-comments{margin-top:auto;border:0;padding:0;overflow:visible;gap:20px;}\n.bt-root .bt-ticket-comments [role=log]{min-height:0;gap:24px;}\n.bt-root .bt-ticket-comments article{background:none;padding:0;}\n.bt-root .bt-ticket-comments article header{justify-content:flex-start;font-size:14px;line-height:20px;}\n.bt-root .bt-ticket-comments article small{font-size:13px;line-height:18px;}\n.bt-root .bt-ticket-comments article p{font-size:14px;line-height:20px;margin:4px 0 0 28px;}\n.bt-root .bt-ticket-comments form{position:relative;display:block;border-radius:16px;background:var(--hu-bg-secondary);padding:12px;min-height:72px;}\n.bt-root .bt-ticket-comments form>label{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);}\n.bt-root .bt-ticket-comments textarea{border:0;background:none;padding:0 28px 0 0;font-size:14px;line-height:20px;resize:none;}\n.bt-root .bt-ticket-comments form>.hu-button{position:absolute;bottom:12px;inset-inline-end:12px;width:24px;height:24px;min-width:24px;min-height:24px;padding:4px;border-radius:99px;}\n.bt-root .hu-dialog:has(.bt-ticket-new){inset:auto 0 40px;width:min(560px,calc(100vw - 32px));height:auto;max-height:calc(100dvh - 56px);margin-inline:auto;padding:16px;overflow:auto;}\n.bt-root .hu-dialog:has(.bt-ticket-new)>.hu-dialog-body{height:auto;overflow:visible;}\n.bt-root .bt-ticket-new{height:auto;gap:16px;}\n.bt-root .bt-ticket-new .bt-ticket-properties{gap:6px;}\n.bt-root .bt-ticket-new .bt-native-field textarea{height:52px;min-height:52px;}\n.bt-root .bt-ticket-new .bt-ticket-properties>h3{display:none;}\n.bt-root .bt-ticket-new .bt-ticket-property-grid{gap:10px 16px;margin-top:4px;}\n.bt-root .bt-ticket-new .bt-ticket-property-grid>.hu-field{max-width:none;flex:1 1 80px;}\n.bt-root .bt-ticket-new .bt-ticket-property-grid>.hu-field>label{font-size:12px;}\n.bt-root .hu-dialog:has(.bt-ticket-new)>footer{display:flex;align-items:center;gap:10px;margin-top:14px;padding:0;border:0;}\n.bt-root .hu-dialog:has(.bt-ticket-new)>footer>.hu-check{margin-inline-end:auto;}\n@media(max-width:639px){.bt-root .hu-dialog:has(.bt-ticket-layout):not(:has(.bt-ticket-new)){inset:8px;width:calc(100vw - 16px);height:calc(100dvh - 16px);max-height:calc(100dvh - 16px);padding:16px;}.bt-root .bt-ticket-sheet-header{flex-wrap:wrap;}.bt-root .bt-ticket-new .bt-ticket-sheet-header{font-size:13px;}.bt-root .bt-ticket-new .bt-ticket-property-grid>.hu-field{flex:0 1 27%;}.bt-root .bt-ticket-detail .bt-ticket-properties .bt-profile-history{margin-top:10px;}}\n.bt-root .hu-dialog:has(.bt-ticket-new)>footer>.bn-source{margin-inline-end:auto;font-size:14px;line-height:20px;color:var(--hu-muted);}\n.bt-root .bt-ticket-new .bt-ticket-property-grid>.bn-source{display:flex;flex-wrap:wrap;gap:16px;width:100%;}\n.bt-root .bt-ticket-source-select{width:auto;}\n.bt-root .bt-ticket-source-select-trigger{min-height:20px!important;height:20px!important;padding:0!important;border:0!important;background:none!important;box-shadow:none!important;gap:6px!important;font-size:14px!important;font-weight:400!important;color:var(--hu-muted)!important;}\n.bt-root .bt-ticket-source-select-trigger>span{gap:6px!important;}\n.bt-root .bt-ticket-source-select-trigger svg{width:16px;height:16px;}\n.bt-root .bt-ticket-source-select-trigger>svg{display:none;}\n.bt-root .hu-dialog:has(.bt-ticket-layout)::backdrop{background:transparent;backdrop-filter:none;}\n.bt-root .hu-dialog:has(.bt-ticket-layout){box-shadow:0 0 96px #00000038;}\n.bt-root .hu-dialog:has(.bt-ticket-new){box-shadow:0 0 80px #00000045;}\n.bt-root .hu-dialog:has(.bt-ticket-new)>footer [role=switch]{margin-inline-end:auto;font-size:14px;line-height:20px;color:var(--hu-muted);}\n.bt-root .bt-ticket-sheet-header .hb-menu-trigger>svg{display:none;}\n.bt-root .bt-ticket-sheet-header .hb-menu-trigger>span[aria-hidden] {display:none;}\n.bt-root .bt-ticket-sheet-header .hb-menu-trigger::before{content:'⋮';font-size:18px;line-height:18px;}\n.bt-root .bt-ticket-detail .bt-ticket-properties{display:grid;grid-template-columns:80px minmax(0,1fr);gap:10px 12px;}\n.bt-root .bt-ticket-detail .bt-ticket-properties>.bt-ticket-creator,.bt-root .bt-ticket-detail .bt-ticket-properties>.hu-field,.bt-root .bt-ticket-detail .bt-ticket-properties>.bt-native-field,.bt-root .bt-ticket-detail .bt-ticket-properties>.bt-profile-history{grid-column:1/-1;}\n.bt-root .bt-ticket-detail .bt-ticket-properties>.bt-native-field{margin-top:-6px;}\n.bt-root .bt-ticket-detail .bt-ticket-properties>.bt-ticket-property-grid{align-self:center;}\n.bt-root .bt-ticket-detail .bt-ticket-properties>.bt-ticket-property-grid>.bn-source{display:flex;flex-wrap:wrap;gap:12px;}\n.bt-root .bt-ticket-detail .bt-ticket-properties>.bt-ticket-resources{align-self:center;}\n.bt-root .bt-ticket-detail .bt-ticket-properties>h3{margin:8px 0;}\n@media(max-width:639px){.bt-root .bt-ticket-detail .bt-ticket-properties{grid-template-columns:minmax(0,1fr);}.bt-root .bt-ticket-detail .bt-ticket-properties>h3{margin:8px 0 0;}}\n:is(.dark,[data-helios-theme=dark]) .bt-root .bt-hires>article,:is(.dark,[data-helios-theme=dark]) .bt-root .bt-task,.bt-root[data-helios-theme=dark] :is(.bt-hires>article,.bt-task){background:color-mix(in srgb,var(--color-background-primary-default) 60%,transparent);}\n/* Profile activity controls share the public28px segmented row and8px heatmap gap. */\n.bt-root .bt-ai-profile .bt-profile-activity-heading{margin:8px 0 8px;min-height:28px;}\n.bt-root .bt-ai-profile .bt-profile-activity-heading>span{font-size:13px;line-height:18px;}\n.bt-root .bt-ai-profile .bt-period-buttons>button{font-size:14px;line-height:20px;padding:4px 10px;}\n.bt-root .bt-ai-profile .bt-profile-actions>div{transform:translateY(12px);}\n/* The retained profile cover must cancel the tablet main's24px inset exactly. */\n@media(min-width:701px) and (max-width:800px){.hxr-root[data-example=\"5\"] .hx-profile-cover{margin-inline:-24px;}}\n.bt-root.bt-template-project-board .bt-source-actions>.bt-source-notification,.bt-root.bt-template-project-board .bt-source-actions>.bt-project-inbox,.bt-root.bt-template-project-board .bt-source-actions>[aria-label=\"Display options\"]{margin-inline-end:2px;}\n/* Cancel retained container fallbacks so AI canvases keep the public full-height grid. */\n.bt-root .bt-ai-workspace{display:grid;min-height:0;}\n.bt-root .bt-ai-conversation{height:100%;min-height:0;}\n.bt-root .bt-ai-workspace>h1.hu-sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);margin:-1px;white-space:nowrap;}\n@media(max-width:1023px){.bt-root .bt-mobile-nav-open .bt-main{transform:translateX(272px);}.bt-root:dir(rtl) .bt-mobile-nav-open .bt-main{transform:translateX(-272px);}}\n.bt-root .hu-dialog:has(.bt-ticket-new)>footer{flex-direction:row;flex-wrap:nowrap;}\n.bt-root .hu-dialog:has(.bt-ticket-new)>footer>.hu-button{width:auto;flex:0 0 auto;height:36px;min-height:36px;padding:8px;font-size:14px;line-height:20px;}\n/* Reconstructed from the public five-frame create-ticket entrance: bottom-origin growth and settling. */\n@keyframes bt-ticket-create-enter{0%{transform:translateY(64px) scaleY(0);opacity:0;}16%{transform:translateY(64px) scaleY(.0263);opacity:1;}32%{transform:translateY(64px) scaleY(.371);opacity:1;}64%{transform:translateY(29px) scaleY(1.111);opacity:1;}100%{transform:translateY(0) scaleY(1);opacity:1;}}\n@media(prefers-reduced-motion:no-preference){.bt-root .hu-dialog:has(.bt-ticket-new){transform-origin:center bottom;animation:bt-ticket-create-enter .5s linear backwards;}}\n.bt-root .hu-dialog:has(.bt-ticket-new)>footer>.bn-source>label{margin-inline-end:auto;font-size:14px;line-height:20px;color:var(--hu-muted);}\n/* The native menu may flip above this bottom composer and must remain in its top layer. */\n.bt-root .hu-dialog:has(.bt-ticket-new){overflow:visible;border:0;}\n.bt-root .bt-ticket-new .bt-ticket-property-grid>.bn-source{row-gap:10px;}\n\n/* Keep the optional exact-data disclosure out of the final axis label's hit area. */\n.bt-root .bt-profile-history{height:auto;min-height:329px}\n.bt-root .bt-profile-history details,.bt-root .bt-profile-history details[open]{position:relative;inset:auto;bottom:auto;margin:6px 0 0;text-align:end}\n.bt-root .bt-profile-history details[open]{text-align:start}\n\n@media(max-width:1023px){.bt-root .bt-source-workspace-header .bt-source-menu{width:36px;height:36px;padding:8px;border:1px solid var(--hu-line);border-radius:50%;background:var(--hu-bg);color:var(--hu-muted)}}\n\n/* HR pipeline: keep the title/count together and align stage labels with the public template. */\n.bt-root .bt-pipeline-panel{position:relative}\n.bt-root .bt-pipeline-panel>header{min-height:20px;height:20px;margin-bottom:2px;align-items:flex-start;padding-right:150px}\n.bt-root .bt-pipeline-panel>header>.hu-field{position:absolute;top:16px;right:16px}\n.bt-root .bt-pipeline-panel>.bt-number{margin:0 0 16px}\n.bt-root .bt-pipeline-panel .bt-progress-list>li{grid-template-columns:max-content minmax(20px,1fr) max-content;gap:12px}\n.bt-root .bt-pipeline-panel .bt-progress-list>li>span{text-align:end}\n.bt-root .bt-pipeline-panel .bt-progress-list strong{display:flex;gap:6px;justify-content:flex-end;align-items:center}\n.bt-root .bt-progress-share{font-size:12px;font-weight:400;color:var(--hu-muted)}\n\n.bt-root .bt-finance-cash-flow{margin-bottom:16px}\n\n/* ResponsiveContainer must follow the plot box, including the shorter token chart. */\n.bt-root .bt-profile-history[data-kind=area]{height:auto;min-height:267px}\n\n/* The template panel owns scrolling; avoid a second fixed-height Creator viewport. */\n.bt-root .bt-agent-editor .hp-source-example[data-source-agent=agent-creator]{height:auto;min-height:0;border:0;border-radius:0;padding:0;overflow:visible}\n.bt-root .bt-agent-editor .hp-source-example .hp-agent-creator{height:auto;min-height:0;overflow:visible}\n\n/* Fixed-height hire tiles retain their rhythm for longer fixture or user names. */\n.bt-root .bt-hires .bt-person strong,.bt-root .bt-hires .bt-person small,.bt-root .bt-hires>article>span:last-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}\n.bt-root .bt-hires .bt-person>span{min-width:0}\n\n/* Template audit: preserve the source's compact metrics and workspace chrome. */\n.bt-root .bt-tile small{font-size:14px;line-height:24px;background:var(--color-lime-200);color:var(--color-lime-900)}\n.bt-root .bt-tile small[data-tone=negative]{background:var(--color-pink-200);color:var(--color-pink-900)}\n.bt-root .bt-tile small[data-tone=neutral]{background:var(--hu-line);color:var(--hu-text)}\n.bt-root .bt-mini-stats>span{min-width:0}\n.bt-root .bt-mini-stats small{display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}\n.bt-root .bt-ai-panel>.hu-tabs>[role=tablist]{border:0;background:none;gap:4px;padding:0 100px 0 0;align-items:center}\n.bt-root .bt-ai-panel>.hu-tabs>[role=tablist]>[role=tab]{display:inline-flex;align-items:center;gap:4px;border:0;border-radius:99px;padding:5px 8px;background:transparent;box-shadow:none;color:var(--hu-muted)}\n.bt-root .bt-ai-panel>.hu-tabs>[role=tablist]>[role=tab][aria-selected=true]{background:var(--color-accent-50);color:var(--color-accent-600)}\n.bt-root .bt-template-composer .hp-note{display:none}\n.bt-root .bt-alert-period{display:flex;align-items:center;gap:4px;background:var(--hu-bg);border:1px solid var(--hu-line);border-radius:8px;height:32px;white-space:nowrap;font-size:12px}\n.bt-root .bt-alert-period button{display:grid;place-items:center;border:0;background:none;color:inherit;width:24px;height:28px;cursor:pointer}\n.bt-root .bt-alert-period button svg{width:16px;height:16px}\n.bt-root .bt-alert-period button:focus-visible{outline:2px solid var(--hu-brand);border-radius:5px}\n.bt-root .bt-starter-suggestions{display:flex;justify-content:center;gap:8px;flex-wrap:wrap;max-width:600px;margin:16px auto 0}\n.bt-root .bt-starter-suggestions button{border:0;border-radius:99px;background:var(--hu-bg);color:var(--hu-muted);font:inherit;padding:8px 14px;cursor:pointer}\n.bt-root .bt-starter-suggestions button:focus-visible{outline:2px solid var(--hu-brand)}\n.bt-root .bt-starter-history-open .bt-chat-history{border:0;background:var(--hu-bg-secondary);border-radius:24px}\n.bt-root .bt-chat-history>header{display:flex;justify-content:space-between;align-items:center}\n\n.bt-root.bt-template-ai-profile .bt-breadcrumb{display:none}\n.bt-root .bt-multi-main .hp-multi-chat[data-presentation=source] .hp-multi-conversation [role=log] article{border:0;box-shadow:none;background:transparent}\n.bt-root .bt-multi-main .hp-multi-chat[data-presentation=source] .hp-multi-conversation [role=log] article[data-author=user]{max-width:min(520px,calc(100% - 24px));width:fit-content;margin-inline-start:auto}\n.bt-root .bt-multi-main .hp-multi-chat[data-presentation=source] .hp-multi-conversation [role=log] article[data-author=user] p{background:var(--hu-bg)}\n.bt-root .hp-source-chat-day{display:flex;justify-content:center;margin:12px 0 16px}\n.bt-root .hp-source-chat-day span{border-radius:99px;background:var(--hu-line);color:var(--hu-muted);padding:4px 7px;font-size:14px;line-height:20px}\n.bt-root .bt-starter-history-open{padding:0;background:transparent;grid-template-rows:48px minmax(0,1fr);gap:0 12px}\n.bt-root .bt-starter-history-open>header{grid-column:1;grid-row:1;background:var(--hu-bg-secondary);border-radius:24px 24px 0 0;height:48px;padding:12px 16px}\n.bt-root .bt-starter-history-open>.bt-starter-conversation{grid-column:1;grid-row:2;background:var(--hu-bg-secondary);border-radius:0 0 24px 24px;padding:0 12px 12px}\n.bt-root .bt-starter-history-open>.bt-chat-history{grid-column:2;grid-row:1/-1}\n.bt-root .bt-chat-welcome h2{font-size:20px;font-weight:500}\n.bt-root .bt-chat-welcome p{font-size:14px;color:var(--hu-muted)}\n\n.bt-root .bt-chip[data-category]{border:0;font-size:14px;line-height:20px;padding:2px 6px;border-radius:4px;white-space:nowrap;background:var(--color-violet-100);color:var(--color-violet-800)}\n.bt-root .bt-chip:is([data-category=Engineering],[data-category=Awareness]){background:var(--color-blue-200);color:var(--color-blue-900)}\n.bt-root .bt-chip[data-category=Operations]{background:var(--color-pink-200);color:var(--color-pink-900)}\n.bt-root .bt-chip:is([data-category=Traffic],[data-category=Support],[data-category=Transport]){background:var(--color-cyan-200);color:var(--color-cyan-900)}\n.bt-root .bt-chip:is([data-category=Sales],[data-category=Conversions],[data-category=Income],[data-category=Groceries]){background:var(--color-lime-200);color:var(--color-lime-900)}\n.bt-root .bt-chip:is([data-category=Marketing],[data-category=Leads]){background:var(--color-yellow-200);color:var(--color-yellow-900)}\n.bt-root .bt-chip[data-category=Utilities]{background:var(--hu-line);color:var(--hu-text)}\n.bt-root .bt-inline-select select{background:var(--hu-bg)}\n\n.bt-root .bt-transaction-name{min-width:0;max-width:100%}\n.bt-root .bt-record-name{font-weight:500;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.bt-root .bt-data-section .bt-person>span{min-width:0}\n.bt-root .bt-data-section .bt-person strong,.bt-root .bt-data-section .bt-person small{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n@media(min-width:640px){.bt-root .bt-event{font-size:14px}.bt-root .bt-event small{font-size:12px}}\n\n.bt-root .bt-row-actions .hb-menu-trigger::before,.bt-root .bt-column-actions .hb-menu-trigger::before,.bt-root .bt-ticket-sheet-header .hb-menu-trigger::before{content:none}\n.bt-root .bt-data-section .hu-table-card[data-presentation=board] .bt-row-actions .hb-menu-trigger>svg,.bt-root .bt-column-actions .hb-menu-trigger>svg{display:block}\n.bt-root.bt-template-project-board .bt-ticket-assignees .bt-person>img{width:20px;height:20px}\n.bt-root .bt-filter-empty{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px;background:var(--hu-bg-secondary);border-radius:12px;margin-bottom:12px;font-size:14px}\n\n.bt-root .bt-gauge:focus-visible{outline:2px solid var(--hu-brand);outline-offset:2px;border-radius:16px}\n.bt-root .bt-data-section .hu-table-card td :is(.bt-chip[data-category],.bt-status){font-size:14px;line-height:20px}\n\n.bt-root .bt-task-open{touch-action:pan-x pan-y}\n.bt-root .bt-task[data-dragging=true]{opacity:.4;touch-action:none}\n.bt-ticket-drag-preview{position:fixed;pointer-events:none;z-index:10000;background:var(--hu-bg);color:var(--hu-text);border:1px solid var(--hu-line);border-radius:12px;box-shadow:0 12px 30px #0003;padding:12px;display:grid;gap:12px;min-height:100px;font-size:14px}\n.bt-ticket-drag-preview small{font-size:12px;color:var(--hu-muted)}\n.bt-ticket-drag-preview strong{font-weight:500}\n\n.bt-root .bt-task-open{user-select:none}.bt-root .bt-ticket-assignees img{-webkit-user-drag:none;user-select:none}\n\n.bt-root .bt-ai-panel .bt-source-diffs pre{font-size:14px;line-height:26px;max-height:calc(var(--bt-viewport-height,100dvh) - 150px);white-space:pre-wrap;overflow-wrap:anywhere;background:var(--hu-bg)}\n.bt-root .bt-source-diffs summary{font-size:14px;line-height:20px;padding:6px 8px;background:var(--hu-bg-secondary)}\n.bt-root .bt-code-line{min-width:0;background:transparent}\n.bt-root .bt-code-line>span{min-width:0;white-space:pre-wrap;overflow-wrap:anywhere}\n.bt-root .bt-code-line>i{width:32px;line-height:26px}\n.bt-root .bt-source-diffs details{border-radius:8px}\n\n.bt-root .bt-template-composer .hp-source-composer:not(.hp-source-panel) .hp-composer-working{display:none}\n.bt-root .bt-source-workspace-header>.bt-workspace-location-label{display:flex;align-items:center;gap:8px}\n.bt-root .bt-workspace-location-label>svg{width:16px;height:16px;flex:none}\n.bt-root .bt-source-workspace-header[data-compact=true]{display:flex;flex-direction:column;align-items:stretch;height:auto;min-height:84px;gap:8px}\n.bt-root .bt-source-workspace-header .bt-workspace-mobile-title{display:flex;justify-content:space-between;align-items:center;gap:8px;width:100%}\n.bt-root .bt-workspace-mobile-title>span{display:flex;align-items:center;gap:8px}\n.bt-root .bt-workspace-mobile-title strong{font-size:16px;line-height:24px;font-weight:500}\n.bt-root .bt-source-workspace-header .bt-workspace-location{display:flex;justify-content:space-between;align-items:center;gap:8px;width:100%;font-size:12px;color:var(--hu-muted)}\n.bt-root .bt-workspace-location-label{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.bt-root .bt-workspace-actions{display:flex;align-items:center;gap:0;flex:none}\n.bt-root .bt-workspace-panel-toggle{border-radius:99px}\n.bt-root .bt-workspace-location .bt-workspace-location-label{display:flex;align-items:center;gap:8px}\n.bt-root .bt-column-actions .hb-menu-trigger{display:grid;place-items:center;width:20px;height:20px;min-width:20px;min-height:20px;padding:0;border:0;background:none;box-shadow:none}\n.bt-root .bt-column-actions .hb-menu-trigger>svg{width:16px;height:16px;display:block}\n.bt-root .bt-calendar-more{white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis}\n@media(max-width:639px){\n .bt-root .bt-month-long{display:none}.bt-root .bt-month-short{display:inline}\n .bt-root .bt-month-controls{min-width:120px;width:120px;max-width:120px}\n .bt-root .hu-dialog:has(.bt-agent-editor){inset:0;width:100vw;max-width:100vw;height:100dvh;max-height:100dvh;border:0;border-radius:0;margin:0;padding:0}\n .bt-root .hu-dialog:has(.bt-agent-editor)>header{display:none}\n .bt-root .hu-dialog:has(.bt-agent-editor)>.hu-dialog-body{height:100%;padding:0;overflow:auto}\n .bt-root .bt-mobile-panel.bt-agent-editor{width:100%;padding:0;outline:none}\n .bt-root .bt-mobile-panel.bt-agent-editor:focus-visible{outline:none}\n}\n\n.bt-root [data-code-token=keyword]{color:var(--color-green-700)}\n.bt-root [data-code-token=string]{color:var(--color-teal-700)}\nbody.dark .bt-root [data-code-token=keyword]{color:var(--color-green-400)}\nbody.dark .bt-root [data-code-token=string]{color:var(--color-teal-400)}\n.bt-root .hu-dialog:focus-visible{outline:none}\n@media(max-width:639px){.bt-root .bt-agent-editor .hp-source-example .hp-agent-creator>.hu-field:has(input),.bt-root .bt-agent-editor .hp-source-example .hp-agent-creator>.hp-textarea-label{grid-template-columns:128px minmax(0,1fr)}}\n.bt-root .bt-ai-profile .bt-fixture-delta { background:var(--color-violet-200); color:var(--color-violet-900); }\n",
  "src/chart-families.css": ".hc-react-card,\n.hc-react-card * {\n  box-sizing: border-box;\n}\n.hc-react-card {\n  position: relative;\n  border: 1px solid var(--hu-line);\n  border-radius: 12px;\n  padding: 24px;\n  background: var(--hu-bg);\n  color: var(--hu-text);\n  font: 14px/20px var(--hu-font);\n  width: 100%;\n  min-width: 0;\n}\n.hc-react-card .hu-example-heading .hu-field {\n  max-width: 150px;\n}\n.hc-react-card h3 {\n  font-size: 16px;\n  line-height: 24px;\n  margin: 0;\n}\n.hc-react-card .hu-example-heading p {\n  font-size: 12px;\n}\n.hc-react-headline {\n  display: grid;\n  gap: 6px;\n  margin-bottom: 20px;\n}\n.hc-react-headline .hu-chart-total {\n  margin: 0;\n  line-height: 38px;\n}\n.hc-react-headline > span {\n  font-size: 11px;\n  color: var(--hu-muted);\n}\n.hc-react-legend {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 20px;\n  margin-bottom: 16px;\n}\n.hc-react-plot {\n  height: 250px;\n  min-width: 0;\n  width: 100%;\n}\n.hc-react-hidden {\n  min-height: 250px;\n  display: grid;\n  place-items: center;\n  padding: 24px;\n  text-align: center;\n  color: var(--hu-muted);\n  background: var(--hu-bg-secondary);\n  border-radius: 8px;\n}\n.hc-react-inspection {\n  display: grid;\n  grid-template-columns: repeat(3, minmax(0, 1fr));\n  gap: 6px;\n  margin-top: 20px;\n  max-height: 176px;\n  overflow-y: auto;\n  scroll-padding-block: 6px;\n  padding: 3px;\n}\n.hc-react-inspection button {\n  border: 1px solid var(--hu-line);\n  border-radius: 7px;\n  background: var(--hu-bg);\n  color: var(--hu-muted);\n  font: 11px/18px var(--hu-font);\n  padding: 8px 10px;\n  cursor: pointer;\n  text-align: start;\n  min-width: 0;\n  display: grid;\n  gap: 2px;\n}\n.hc-react-inspection button > span {\n  overflow-wrap: anywhere;\n}\n.hc-react-inspection button > strong {\n  font-weight: 500;\n  color: var(--hu-text);\n  overflow-wrap: anywhere;\n}\n.hc-react-inspection button[aria-pressed='true'] {\n  border-color: var(--hu-brand-text);\n  color: var(--hu-brand-text);\n  background: var(--hu-bg-secondary);\n}\n.hc-react-card button:focus-visible,\n.hc-react-card summary:focus-visible {\n  outline: 2px solid var(--hu-brand-text);\n  outline-offset: 3px;\n}\n.hc-react-card button:disabled {\n  opacity: 0.5;\n  cursor: not-allowed;\n}\n.hc-react-status {\n  color: var(--hu-muted);\n  font-size: 12px;\n  line-height: 20px;\n  min-height: 20px;\n  margin: 14px 0 20px;\n  overflow-wrap: anywhere;\n}\n.hc-react-card details {\n  font-size: 12px;\n  margin-top: 20px;\n}\n.hc-react-card summary {\n  cursor: pointer;\n}\n.hc-react-card table {\n  width: 100%;\n  text-align: start;\n  border-collapse: collapse;\n  margin-top: 16px;\n  color: var(--hu-text);\n  font: inherit;\n  white-space: nowrap;\n}\n.hc-react-card th,\n.hc-react-card td {\n  padding: 8px 10px;\n  border-bottom: 1px solid var(--hu-line);\n  font-weight: 400;\n}\n.hc-react-card thead th {\n  font-weight: 500;\n  color: var(--hu-muted);\n  background: var(--hu-bg-secondary);\n}\n.hc-react-card caption {\n  font-size: 11px;\n  line-height: 18px;\n  text-align: start;\n  white-space: normal;\n  color: var(--hu-muted);\n  padding: 0 0 12px;\n}\n.hc-react-card .hu-table-scroll {\n  overflow: auto;\n  max-width: 100%;\n  position: relative;\n}\n.hc-react-card .hu-table-scroll:focus-visible {\n  outline: 2px solid var(--hu-brand-text);\n  outline-offset: 3px;\n}\n.hc-react-heatmap {\n  display: grid;\n  gap: 5px;\n  margin-top: 20px;\n  min-height: 160px;\n}\n.hc-react-contributions {\n  grid-template-rows: repeat(7, minmax(12px, 1fr));\n  grid-auto-flow: column;\n  height: 160px;\n}\n.hc-react-heatmap.hc-react-heatmap {\n  align-content: stretch;\n}\n.hc-react-heatmap:not(.hc-react-contributions):not(.hc-react-days) {\n  grid-template-rows: repeat(7, minmax(14px, 1fr));\n  height: 180px;\n}\n.hc-react-heatmap button {\n  min-width: 0;\n  min-height: 12px;\n  border: 1px solid var(--hu-line);\n  border-radius: 4px;\n  cursor: pointer;\n  background: color-mix(in srgb, var(--hc-chart-primary) var(--cell-intensity), var(--hu-bg));\n  color: var(--hu-text);\n  font: 11px/16px var(--hu-font);\n  padding: 2px;\n}\n.hc-react-heatmap button[aria-pressed='true'] {\n  outline: 2px solid var(--hu-brand-text);\n  outline-offset: 1px;\n}\n.hc-react-days {\n  grid-template-columns: repeat(7, minmax(0, 1fr));\n  gap: 7px;\n}\n.hc-react-days button {\n  min-height: 35px;\n  background: var(--hu-bg-secondary);\n  position: relative;\n  border-radius: 8px;\n}\n.hc-react-days button:after {\n  content: '';\n  position: absolute;\n  inset: auto 7px 4px;\n  height: 3px;\n  background: color-mix(in srgb, var(--hc-chart-primary) var(--cell-intensity), var(--hu-bg));\n  border-radius: 2px;\n}\n.hc-react-list {\n  display: grid;\n  gap: 12px;\n  margin-top: 24px;\n}\n.hc-react-list button {\n  position: relative;\n  isolation: isolate;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 12px;\n  border: 0;\n  background: transparent;\n  color: var(--hu-text);\n  font: 14px/24px var(--hu-font);\n  padding: 10px 12px;\n  cursor: pointer;\n  text-align: start;\n  min-width: 0;\n}\n.hc-react-list button:before {\n  content: '';\n  position: absolute;\n  z-index: -1;\n  inset-block:0;inset-inline-start:0;inset-inline-end:auto;\n  width: var(--bar);\n  background: color-mix(in srgb, var(--hc-chart-primary), var(--hu-bg) 84%);\n  border: 1px solid color-mix(in srgb, var(--hc-chart-primary), var(--hu-bg) 65%);\n  border-radius: 6px;\n}\n.hc-react-list button[aria-pressed='true']:before {\n  border-color: var(--hu-brand-text);\n}\n.hc-react-list button > span {\n  overflow-wrap: anywhere;\n}\n.hc-react-list button > strong {\n  display: flex;\n  gap: 10px;\n  font-weight: 500;\n  white-space: nowrap;\n}\n.hc-react-list button small {\n  font-size: 11px;\n  color: var(--hu-muted);\n  font-weight: 400;\n}\n.hc-react-card .recharts-wrapper:focus-visible {\n  outline: 2px solid var(--hu-brand-text);\n}\n@media (max-width: 600px) {\n  .hc-react-card {\n    padding: 16px;\n  }\n  .hc-react-card .hu-example-heading {\n    gap: 12px;\n    align-items: flex-start;\n  }\n  .hc-react-card .hu-chart-total {\n    font-size: 26px;\n  }\n  .hc-react-inspection {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n  }\n  .hc-react-inspection button {\n    padding: 7px 8px;\n  }\n  .hc-react-heatmap {\n    gap: 3px;\n  }\n  .hc-react-list button {\n    font-size: 12px;\n    padding-inline: 8px;\n  }\n  .hc-react-list button > strong {\n    gap: 6px;\n  }\n  .hc-react-card .hu-example-heading .hu-field {\n    max-width: 140px;\n  }\n}\n@media (prefers-reduced-motion: reduce) {\n  .hc-react-card * {\n    transition-duration: 0s !important;\n    animation-duration: 0s !important;\n    scroll-behavior: auto !important;\n  }\n}\n\n.hc-react-card {\n  --hc-chart-primary: color-mix(in srgb, var(--hu-brand), #000 45%);\n  --hc-chart-track: color-mix(in srgb, var(--hu-muted), var(--hu-bg) 35%);\n}\n.dark .hc-react-card,\n[data-helios-theme='dark'] .hc-react-card {\n  --hc-chart-primary: color-mix(in srgb, var(--hu-brand), #fff 35%);\n}\n/* Source-like chart anatomy: compact header, real segmented periods, optional detailed inspection. */\n.hc-react-card{padding:18px;border:0;border-radius:14px;background:var(--hu-bg-secondary)}\n.hc-react-card-header{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:10px}\n.hc-react-title-block{min-width:0}.hc-react-card h3{font-size:12px;line-height:18px;color:var(--hu-muted);font-weight:500}\n.hc-react-fixture-note{font-size:10px;color:var(--hu-muted)}\n.hc-react-headline{display:flex;align-items:center;gap:8px;margin:1px 0 0;flex-wrap:wrap}\n.hc-react-headline .hu-chart-total{font-size:25px;line-height:32px;font-weight:500;letter-spacing:-.6px}\n.hc-react-delta{padding:2px 5px;border-radius:4px;background:color-mix(in srgb,var(--hu-brand),var(--hu-bg) 80%);color:var(--hu-brand-text);font-size:10px;font-weight:600}\n.hc-react-delta[data-negative=true]{background:var(--hu-error-bg);color:var(--hu-error)}\n.hc-react-periods{display:flex;flex-wrap:wrap;gap:2px;justify-content:flex-end;max-width:250px}\n.hc-react-periods button,.hc-react-list-tabs button{border:0;border-radius:5px;background:transparent;color:var(--hu-muted);font:11px/18px var(--hu-font);padding:3px 6px;cursor:pointer}\n.hc-react-periods button[aria-pressed=true],.hc-react-list-tabs button[aria-pressed=true]{color:var(--hu-text);background:var(--hu-bg);box-shadow:0 1px 3px #00000009}\n.hc-react-list-tabs{display:flex;gap:3px;flex-wrap:wrap;margin:0 0 6px;border-bottom:1px solid var(--hu-line);padding-bottom:5px}\n.hc-react-list-tabs button[aria-pressed=true]{color:var(--hu-brand-text)}\n.hc-react-card details{margin-top:8px;color:var(--hu-muted);font-size:10px;line-height:16px}\n.hc-react-inspect-details[open]{padding-top:8px;border-top:1px solid var(--hu-line)}\n.hc-react-inspect-details .hc-react-legend{margin:12px 0 0;gap:16px}\n.hc-react-inspection{margin-top:8px}.hc-react-status{margin:8px 0;font-size:11px}\n.hc-react-compact .hc-react-fixture-note{display:none}.hc-react-compact{padding:12px}\n.hc-react-compact .hc-react-headline .hu-chart-total{font-size:23px;line-height:28px}\n.hc-react-compact .hc-react-card-header{margin-bottom:2px}\n.hc-react-summary{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:7px;margin:10px 0}\n.hc-react-summary>span{display:grid;gap:2px;padding:7px;background:var(--hu-bg);border-radius:5px;color:var(--hu-muted);font-size:10px}\n.hc-react-summary strong{font-size:13px;color:var(--hu-text);font-weight:500}\n.hc-react-heatmap{margin-top:8px}.hc-react-contributions{height:115px;min-height:100px;gap:3px}\n.hc-react-heatmap:not(.hc-react-contributions):not(.hc-react-days){height:165px;min-height:120px}\n.hc-react-heatmap button{border-radius:2px;border-color:transparent}\n.hc-react-list{gap:3px;margin-top:8px}.hc-react-list button{padding:6px 8px;font-size:12px;line-height:20px}\n.hc-react-list button:before{border:0;border-radius:5px}\n.hc-react-stages-list button{display:grid;grid-template-columns:64px minmax(30px,1fr) 85px;gap:8px;padding:3px 0}\n.hc-react-stages-list button:before{display:none}\n.hc-react-stage-track{display:block!important;height:17px;border-radius:20px;background:var(--hc-chart-track);overflow:hidden}\n.hc-react-stage-track>span{display:block;position:relative;height:100%;width:var(--bar);min-width:16px;border-radius:20px;background:var(--stage-color);transition:width .4s ease}\n.hc-react-stage-track i{font-style:normal;font-size:11px;color:var(--hu-bg);position:absolute;inset-inline-start:4px;top:50%;transform:translateY(-50%);display:grid;place-items:center;width:16px;height:16px;line-height:1}\n.hc-react-stage-track i svg{display:block;width:100%;height:100%}\n.hc-react-stages-list button>strong{font-size:11px;justify-content:flex-end;gap:7px}.hc-react-stages-list button small{font-size:10px}\n.hc-react-funnel svg{display:block;width:100%;height:auto;max-height:200px;overflow:visible}\n.hc-react-funnel g[role=button]{cursor:pointer;outline:none}.hc-react-funnel g[role=button]:focus-visible path{stroke:var(--hu-text);stroke-width:3}\n.hc-react-mini-legend{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:5px;margin-top:7px}\n.hc-react-mini-legend>span{font-size:10px;line-height:16px;display:block;background:var(--hu-bg);padding:5px;border-radius:5px;min-width:0;overflow-wrap:anywhere;color:var(--hu-muted)}\n.hc-react-mini-legend strong{display:block;color:var(--hu-text);font-size:12px;font-weight:500}\n.hc-react-mini-legend i,.hc-react-day-targets i{display:inline-block;width:6px;height:6px;border-radius:2px;margin-inline-end:3px}\n.hc-react-activity-days{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(0,1fr);gap:12px;align-items:start}\n.hc-react-small-label{font-size:10px;color:var(--hu-muted)}\n.hc-react-days-calendar,.hc-react-day-detail{background:var(--hu-bg);border-radius:8px;padding:8px;min-width:0}\n.hc-react-heatmap.hc-react-days{gap:4px;min-height:0;margin-top:6px}\n.hc-react-days button{display:flex;flex-direction:column;align-items:center;gap:2px;border:0;min-height:30px;padding:0;background:none!important;font-size:9px;line-height:13px;border-radius:4px}\n.hc-react-days button:after{display:none}.hc-react-days button svg{width:25px;height:25px;max-width:100%}.hc-react-days button[aria-pressed=true]{outline-offset:0}\n.hc-react-day-detail>strong{display:block;font-size:15px;font-weight:500;margin-top:4px}.hc-react-day-detail>svg{display:block;width:100%;max-height:180px;margin-top:4px}\n.hc-react-day-targets{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:5px}.hc-react-day-targets>span{font-size:8px;line-height:12px;color:var(--hu-muted)}.hc-react-day-targets strong{display:block;color:var(--hu-text);font-size:10px;font-weight:500}\n.hc-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n@media(max-width:600px){.hc-react-card{padding:12px}.hc-react-card-header{flex-wrap:wrap;gap:5px}.hc-react-title-block{flex:1}.hc-react-periods{max-width:100%;gap:1px}.hc-react-periods button{font-size:10px;padding:3px 5px}.hc-react-headline .hu-chart-total{font-size:23px;line-height:28px}.hc-react-mini-legend{grid-template-columns:repeat(2,minmax(0,1fr))}.hc-react-activity-days{grid-template-columns:minmax(0,1fr)}.hc-react-days button svg{width:26px;height:26px}.hc-react-day-detail>svg{height:150px}.hc-react-day-targets>span{font-size:10px;line-height:15px}.hc-react-stages-list button{grid-template-columns:50px minmax(20px,1fr) 76px;gap:5px;font-size:10px}.hc-react-stages-list button>strong{font-size:10px;gap:4px}.hc-react-stage-track{height:16px}.hc-react-summary{gap:4px}.hc-react-summary>span{padding:5px;font-size:9px}}\n.hc-react-card{--hc-chart-track:color-mix(in srgb,var(--hu-text) 8%,var(--hu-bg))}\n.hc-react-month-axis{display:flex;justify-content:space-between;gap:2px;font-size:9px;color:var(--hu-muted);line-height:18px}.hc-react-contributions{grid-template-rows:repeat(7,minmax(7px,1fr));gap:2px;height:105px;min-height:85px}.hc-react-contributions button{min-height:7px;padding:0;border:0}\n.hc-react-card{max-width:580px;margin-inline:auto}.hc-react-compact{max-width:none}\n.hc-react-month-navigation{display:flex;align-items:center;justify-content:space-between;gap:5px}.hc-react-month-navigation>span:last-child{display:flex;gap:3px}.hc-react-month-navigation button{border:0;border-radius:4px;background:var(--hu-bg-secondary);color:var(--hu-text);font:15px/18px var(--hu-font);padding:0 5px;cursor:pointer}\n@media(max-width:600px){.hc-react-card-header{display:grid;grid-template-columns:minmax(0,1fr)}.hc-react-periods{justify-content:flex-start;max-width:none}.hc-react-periods button{padding:3px 5px}.hc-react-card h3{font-size:12px;line-height:18px}}\n.hc-react-metric-legend{grid-template-columns:repeat(3,minmax(0,1fr));margin-top:4px}.hc-react-metric-legend>button{border:0;border-radius:5px;padding:5px;background:var(--hu-bg);text-align:start;min-width:0;font:10px/15px var(--hu-font);color:var(--hu-muted);cursor:pointer}.hc-react-metric-legend>button>span{display:block;overflow-wrap:anywhere}.hc-react-metric-legend strong{display:block;font-size:12px;color:var(--hu-text);font-weight:500}.hc-react-metric-legend button[aria-pressed=true]{box-shadow:inset 0 0 0 1px var(--hu-brand-text)}.hc-react-score-legend{grid-template-columns:minmax(0,1fr)}.hc-react-score-legend>button{display:flex;justify-content:space-between;align-items:center;gap:8px}\n@media(max-width:400px){.hc-react-metric-legend:not(.hc-react-score-legend){grid-template-columns:repeat(2,minmax(0,1fr))}}\n/* Fresh live reference audit: actual variants and meaningful mark emphasis. */\n.hc-react-card[data-chart-mono=true]{--hc-chart-primary:var(--hu-muted)}\n.hc-react-card[data-chart-id=activity-rings-card] .hc-react-headline,.hc-react-card[data-chart-id=bar-list-card] .hc-react-headline,.hc-react-card[data-chart-id=bar-list-card][data-custom-title=false] .hc-react-title-block{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}\n.hc-react-card[data-chart-id=bar-list-card] .hc-react-card-header:has(.hc-react-title-block:only-child){margin:0}\n.hc-react-list-tabs{position:relative;flex-wrap:nowrap;overflow-x:auto;white-space:nowrap;border-bottom:0;scrollbar-width:thin;padding-bottom:5px;margin-bottom:3px;gap:2px}\n.hc-react-list-tabs button{border-radius:0;border-bottom:1px solid transparent;font-size:10px;flex-shrink:0;padding:4px 5px;background:none!important;box-shadow:none!important}\n.hc-react-list-tabs button[aria-pressed=true]{border-bottom-color:var(--hu-brand-text)}\n.hc-react-list-tabs:after{content:'VISITORS';font-size:8px;color:var(--hu-muted);align-self:center;margin-inline-start:auto;position:sticky;inset-inline-end:0;background:var(--hu-bg-secondary);padding-inline-start:7px}\n.hc-row-icon{font-size:12px;font-style:normal;display:inline-block;min-width:17px;margin-inline-end:4px}\n.hc-react-list button:before{transition:width .45s ease,background .2s ease}\n.hc-react-card[data-plot-hovered=true] .hc-react-list button:not([aria-pressed=true]){opacity:.4}\n.hc-react-list button{transition:opacity .15s ease}\n.hc-react-list button>strong{font-size:11px}.hc-react-show-more{display:block;margin:8px auto 0;padding:2px 10px;border:1px solid var(--hu-line);border-radius:20px;background:var(--hu-bg);color:var(--hu-muted);font:10px/17px var(--hu-font);cursor:pointer}\n.hc-react-stage-track>span{transform-origin:left center;animation:hc-stage-grow .65s cubic-bezier(.2,.8,.2,1)}@keyframes hc-stage-grow{from{transform:scaleX(0)}to{transform:scaleX(1)}}\n.hc-react-card .recharts-active-dot circle{animation:hc-dot-pulse 1.2s ease-in-out infinite;transform-box:fill-box;transform-origin:center}@keyframes hc-dot-pulse{50%{opacity:.55;transform:scale(1.35)}}\n.hc-react-metric-legend button[aria-pressed=true]{box-shadow:none}.hc-react-card[data-plot-hovered=true] .hc-react-metric-legend button[aria-pressed=true]{box-shadow:inset 0 0 0 1px var(--hu-brand-text)}\n.hc-react-metric-legend button{transition:opacity .15s ease}.hc-react-card[data-plot-hovered=true] .hc-react-metric-legend button:not([aria-pressed=true]){opacity:.45}\n.hc-react-card[data-chart-id=activity-rings-card] .hc-react-metric-legend{grid-template-columns:repeat(3,minmax(0,1fr));margin:6px 0}\n.hc-react-card[data-chart-id=activity-rings-card] .hc-react-card-header{margin-bottom:3px}\n.hc-react-card .hc-react-flow-link{transition:stroke-opacity .15s ease;cursor:pointer;outline:none}.hc-react-flow-link:focus-visible{stroke-opacity:1;filter:drop-shadow(0 0 1px var(--hu-text))}\n.hc-react-plot g[role=button]:focus-visible,.hc-react-plot text[role=button]:focus-visible{outline:2px solid var(--hu-brand-text);outline-offset:3px}\n.hc-react-matrix{display:grid;grid-template-columns:25px minmax(0,1fr);gap:5px;margin-top:10px}\n.hc-react-matrix-y{display:grid;grid-auto-rows:1fr;padding-bottom:20px;font-size:9px;color:var(--hu-muted)}.hc-react-matrix-y>span{display:flex;align-items:center;justify-content:flex-end}\n.hc-react-matrix .hc-react-heatmap{margin-top:0;height:165px;min-height:100px;gap:3px;grid-template-rows:unset}\n.hc-react-matrix-x{display:grid;gap:3px;margin-top:3px;font-size:8px;line-height:17px;color:var(--hu-muted);text-align:center}\n.hc-react-matrix [data-active=true]{color:var(--hu-text);font-weight:600}\n.hc-react-comparison-legend{display:flex;align-items:center;gap:9px;flex-wrap:wrap;font-size:10px;color:var(--hu-muted);margin:4px 0}\n.hc-react-comparison-legend>button{border:0;background:none;color:inherit;padding:0;font:inherit;cursor:pointer;display:flex;align-items:center;gap:4px}.hc-react-comparison-legend>button[aria-pressed=false]{opacity:.4}\n.hc-react-comparison-legend i{width:5px;height:5px;border-radius:50%;background:var(--hc-chart-primary)}.hc-react-comparison-legend>button:nth-child(2) i{background:var(--hu-muted)}.hc-react-comparison-legend>span{margin-inline-start:auto}\n.hc-react-axis-captions{display:flex;justify-content:space-between;font-size:9px;color:var(--hu-muted);margin-top:2px}\n.hc-react-days-calendar{max-height:245px;overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin;scroll-padding-block:30px}\n.hc-react-month-navigation{position:sticky;top:-8px;z-index:2;background:var(--hu-bg);padding:5px 0;box-shadow:0 4px 8px var(--hu-bg)}\n.hc-react-days-calendar:focus-visible{outline:2px solid var(--hu-brand-text);outline-offset:3px}\n@media(max-width:600px){.hc-react-matrix{grid-template-columns:20px minmax(0,1fr);gap:3px}.hc-react-matrix .hc-react-heatmap{gap:2px}.hc-react-matrix-y{font-size:8px}.hc-react-matrix-x{gap:1px;font-size:7px}.hc-react-comparison-legend>span{margin-inline-start:0;width:100%}.hc-react-days-calendar{max-height:260px}}\n@media(prefers-reduced-motion:reduce){.hc-react-stage-track>span,.hc-react-card .recharts-active-dot circle{animation:none!important}}\n/* Exact BoardUI semantic chart roles; changing the action accent never remaps data series. */\n.hc-react-card{--hc-chart-track:var(--color-chart-track);background:var(--color-background-secondary-default);color:var(--color-text-primary)}\n.hc-react-card .hc-react-periods{background:var(--color-segmented-control-background);border-radius:7px;padding:2px}.hc-react-periods button[aria-pressed=true]{background:var(--color-segmented-control-selected-background)}\n.hc-react-delta{background:var(--color-state-success-base);color:var(--color-state-success-text)}.hc-react-delta[data-negative=true]{background:var(--color-status-rose-background);color:var(--color-status-rose-text)}\n.hc-react-stage-track{background:var(--color-chart-track)}.hc-react-stage-track>span{background:var(--stage-color)}\n.hc-react-card[data-plot-hovered=true] .hc-react-list button[aria-pressed=true]:before{background:var(--hc-chart-active)}\n.hc-react-card[data-chart-id=bar-list-card] .hc-react-list button:before{background:color-mix(in srgb,var(--color-chart-6) 20%,transparent)}\n.hc-react-card[data-chart-mono=true] .hc-react-list button:before{background:var(--color-chart-neutral)}\n/* Compact embedded cards retain their full dataset/settings in an unclipped portal. */\n.hc-react-card{container-type:inline-size;container-name:hc-chart}\n.hc-react-header-tools{display:flex;align-items:center;gap:3px;min-width:0}\n.hc-react-compact .hc-react-card-header{flex-wrap:nowrap;align-items:flex-start;gap:7px}\n.hc-react-compact .hc-react-title-block{min-width:0;flex:1}.hc-react-compact .hc-react-title-block h3{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.hc-react-compact-period{display:flex;align-items:center;gap:3px;background:var(--hu-bg);border:1px solid var(--hu-line);border-radius:6px;padding:2px 4px;font-size:10px;line-height:20px;min-width:0;max-width:112px;color:var(--hu-text)}\n.hc-react-compact-period select{font:inherit;color:inherit;background:transparent;border:0;max-width:88px;min-width:0;cursor:pointer}\n.hc-react-data-trigger{border:0;background:transparent;color:var(--hu-muted);border-radius:5px;cursor:pointer;font:18px/24px var(--hu-font);padding:0 3px;min-width:22px;min-height:24px}\n.hc-react-data-trigger:hover{background:var(--hu-bg-secondary);color:var(--hu-text)}\n.hc-react-data-trigger:focus-visible,.hc-react-compact-period select:focus-visible{outline:2px solid var(--hu-brand-text);outline-offset:2px}\n.hc-react-data-popover{font:12px/18px var(--hu-font);color:var(--hu-text);background:var(--hu-bg);border:1px solid var(--hu-line);box-shadow:0 8px 24px #0002;border-radius:10px;padding:12px;width:min(340px,calc(100vw - 24px));max-height:min(300px,calc(100dvh - 32px));overflow:auto;z-index:220;box-sizing:border-box}\n.hc-react-data-popover [role=dialog]{outline:none}.hc-react-data-popover details{margin:7px 0}.hc-react-data-popover summary{cursor:pointer;color:var(--hu-text)}.hc-react-data-popover .hc-react-inspection{max-height:140px}\n.hc-react-data-popover table{color:var(--hu-text);font:11px/16px var(--hu-font)}\n.hc-react-contribution-scroll{overflow-x:auto;overscroll-behavior-x:contain;max-width:100%;scrollbar-width:thin;padding-bottom:2px}\n.hc-react-contribution-scroll:focus-visible{outline:2px solid var(--hu-brand-text);outline-offset:3px}\n.hc-react-contribution-calendar{min-width:0}.hc-react-contribution-calendar .hc-react-month-axis{margin:2px 0}\n@container hc-chart (max-width:400px){.hc-react-contribution-calendar{min-width:calc(var(--contribution-weeks)*12px)}.hc-react-compact .hc-react-activity-days{grid-template-columns:minmax(0,1fr)}.hc-react-compact .hc-react-day-detail{display:none}.hc-react-compact .hc-react-days-calendar{max-height:205px}}\n/* Native dataset states keep the chart's structure and period context. */\n.hc-native-state{position:relative;display:grid;place-items:center;isolation:isolate;margin-top:10px;min-width:0;border-radius:9px;overflow:hidden;background:var(--hu-bg-secondary)}\n.hc-state-structure{position:absolute;inset:12px;z-index:-1;opacity:.5;pointer-events:none;overflow:hidden}.hc-native-state:not([data-state=loading]) .hc-state-structure{opacity:.22}\n.hc-state-structure>svg{width:100%;height:100%;stroke:var(--color-chart-neutral);fill:none;stroke-width:7;stroke-linecap:round}\n.hc-state-structure>svg circle{stroke-width:10}.hc-state-structure>svg polygon{stroke-width:2}\n.hc-state-bars{height:100%;display:flex;align-items:end;gap:8px;padding:20px}.hc-state-bars>i{flex:1;max-width:40px;background:var(--color-chart-neutral);border-radius:5px}\n.hc-state-grid{display:grid;grid-template-columns:repeat(8,1fr);grid-template-rows:repeat(7,1fr);gap:5px;height:100%;padding:8px}.hc-state-grid>i{background:var(--color-chart-neutral);border-radius:3px}\n.hc-state-list{display:grid;gap:12px;align-content:center;height:100%;padding:12px}.hc-state-list>i{height:15px;background:var(--color-chart-neutral);border-radius:10px}\n.hc-state-message{display:flex;flex-direction:column;align-items:center;text-align:center;gap:7px;max-width:320px;padding:15px;border-radius:9px;background:color-mix(in srgb,var(--hu-bg) 94%,transparent);color:var(--hu-text)}\n.hc-state-message strong{font-size:13px;line-height:20px}.hc-state-message p{font-size:11px;line-height:17px;color:var(--hu-muted);margin:0}.hc-state-message button{background:var(--hu-action);color:var(--hu-on-action);border:0;border-radius:6px;padding:6px 10px;font:12px/18px var(--hu-font);cursor:pointer}.hc-state-message button:focus-visible{outline:2px solid var(--hu-brand-text);outline-offset:3px}\n.hc-native-state[data-state=loading] .hc-state-structure{animation:hc-state-breathe 1.4s ease-in-out infinite alternate}@keyframes hc-state-breathe{to{opacity:.22}}\n@media(prefers-reduced-motion:reduce){.hc-native-state[data-state=loading] .hc-state-structure{animation:none}}\n/* Numeric coordinate order stays consistent in RTL; surrounding card chrome follows document direction. */\n.hc-react-plot,.hc-react-matrix,.hc-react-contribution-scroll,.hc-react-funnel>svg,.hc-react-days-calendar{direction:ltr}\n/* Canonical public-page previews. Advanced /library demonstrations keep their own inspector chrome. */\n.hc-source-example{width:100%;max-width:var(--source-chart-width);min-width:0;margin-inline:auto;font:14px/20px var(--hu-font)}\n.hc-source-example .hc-react-card[data-presentation=source]{width:100%;max-width:none;height:var(--source-chart-height);padding:16px 16px 12px;border:0;border-radius:16px;display:flex;flex-direction:column;gap:0;background:var(--color-background-secondary-default);position:relative;overflow:visible}\n.hc-source-example .hc-react-card-header{margin:0 0 24px;gap:8px;align-items:flex-start;flex-wrap:nowrap;display:flex;flex-shrink:0}\n.hc-source-example .hc-react-title-block{flex:1;min-width:0}.hc-source-example .hc-react-title-block h3{font:500 14px/20px var(--hu-font);color:var(--color-text-secondary);margin:0}\n.hc-source-example .hc-react-fixture-note{display:none}.hc-source-example .hc-react-headline{margin:2px 0 0;gap:8px;flex-wrap:nowrap}\n.hc-source-example .hc-react-headline .hu-chart-total{font:500 32px/38px var(--hu-font);letter-spacing:-.8px;white-space:nowrap;font-variant-numeric:tabular-nums}\n.hc-source-example .hc-react-delta{font:500 14px/20px var(--hu-font);padding:2px 6px;border-radius:6px;background:var(--color-status-lime-background);color:var(--color-status-lime-text)}\n.hc-source-example .hc-react-periods{padding:4px;border-radius:10px;gap:2px;flex-wrap:nowrap;max-width:none}\n.hc-source-example .hc-react-periods button{font:400 14px/20px var(--hu-font);padding:4px 10px;white-space:nowrap;border-radius:6px}.hc-source-example .hc-react-periods button[aria-pressed=true]{font-weight:500}\n.hc-source-example .hc-react-header-tools>.hu-field{margin:0;min-width:0;width:auto;max-width:150px}.hc-source-example .hc-react-header-tools>.hu-field>label{display:none}.hc-source-example .hc-react-header-tools .hu-input-wrap{border:0;min-height:28px;padding:0 6px;border-radius:6px;box-shadow:none;background:var(--color-background-primary-default)}\n.hc-source-example .hc-react-header-tools select{font:400 14px/20px var(--hu-font);padding-block:3px;padding-inline:3px 20px}.hc-source-example .hc-react-plot{flex-shrink:0;width:100%;min-height:0}\n.hc-source-example .hc-react-mini-legend{gap:8px;margin-top:auto;grid-template-columns:repeat(3,minmax(0,1fr));flex-shrink:0}\n.hc-source-example .hc-react-mini-legend>span,.hc-source-example .hc-react-metric-legend>button{font:400 12px/18px var(--hu-font);padding:8px 12px;background:var(--color-background-primary-default);border-radius:8px;min-height:57px}\n.hc-source-example .hc-react-mini-legend strong{font:500 16px/24px var(--hu-font);margin-top:1px}.hc-source-example .hc-react-mini-legend i{width:6px;height:6px;margin-inline-end:5px}\n.hc-source-example .hc-react-mini-legend:has(>span:only-child){grid-template-columns:1fr}.hc-source-example .hc-react-mini-legend:has(>span:first-child:nth-last-child(2)){grid-template-columns:repeat(2,minmax(0,1fr))}\n.hc-source-example .hc-react-comparison-legend{order:-1;margin:0 0 12px;font:400 14px/20px var(--hu-font);gap:16px}.hc-source-example .hc-react-comparison-legend>span{display:none}.hc-source-example .hc-react-comparison-legend i{width:8px;height:8px}\n.hc-source-example[data-source-chart=orders-chart-card] .hc-react-card-header,.hc-source-example[data-source-chart=revenue-chart-card] .hc-react-card-header{margin-bottom:12px;order:-2}.hc-source-example[data-source-chart=orders-chart-card] .hc-react-header-tools,.hc-source-example[data-source-chart=revenue-chart-card] .hc-react-header-tools{display:none}\n.hc-source-example[data-source-chart=bar-list-card] .hc-react-card{padding:12px 16px 16px}.hc-source-example[data-source-chart=bar-list-card] .hc-react-card-header{display:none}.hc-source-example .hc-react-list-tabs{padding:0 0 8px;margin:0;gap:4px}.hc-source-example .hc-react-list-tabs button{font:400 14px/20px var(--hu-font);padding:4px 6px}.hc-source-example .hc-react-list-tabs:after{font-size:12px}\n.hc-source-example .hc-react-list{margin-top:6px;gap:4px}.hc-source-example .hc-react-list button{font:400 14px/20px var(--hu-font);padding:8px;border-radius:8px}.hc-source-example .hc-react-list button>strong{font-size:14px}\n.hc-source-example[data-source-chart=activity-rings-card] .hc-react-card-header{margin-bottom:8px}.hc-source-example[data-source-chart=activity-rings-card] .hc-react-title-block{display:block}.hc-source-example[data-source-chart=activity-rings-card] .hc-react-card-header .hc-react-headline,.hc-source-example[data-source-chart=activity-rings-card] .hc-react-header-tools{display:none}.hc-source-example[data-source-chart=activity-rings-card] .hc-react-metric-legend{order:3;margin-top:auto}\n.hc-source-example[data-source-chart=sleep-score-card] .hc-react-headline .hu-chart-total{font-size:24px;line-height:30px;letter-spacing:-.5px}.hc-source-example[data-source-chart=sleep-score-card] .hc-react-card-header{margin-bottom:4px}.hc-source-example .hc-react-score-legend{gap:2px}.hc-source-example .hc-react-score-legend>button{background:none;padding:2px 0;min-height:22px;font-size:14px}.hc-source-example .hc-react-score-legend strong{font-size:14px;line-height:20px}\n.hc-source-example[data-source-chart=most-active-days-card] .hc-react-headline{gap:4px}.hc-source-example[data-source-chart=most-active-days-card] .hu-chart-total{font-size:24px;line-height:30px}.hc-source-example[data-source-chart=most-active-days-card] .hc-react-card-header{margin-bottom:8px}.hc-source-example .hc-react-activity-days{display:block}.hc-source-example .hc-react-day-detail{display:none}.hc-source-example .hc-react-days-calendar{max-height:232px;padding:0;background:transparent}.hc-source-example .hc-react-days{gap:5px}.hc-source-example .hc-react-days button{font-size:12px;min-height:34px}.hc-source-example .hc-react-days button svg{width:27px;height:27px}\n.hc-source-example[data-source-chart=steps-card] .hc-react-card-header{margin-bottom:20px}.hc-source-example[data-source-chart=steps-card] .recharts-yAxis,.hc-source-example[data-source-chart=steps-card] .recharts-cartesian-grid{display:none}\n.hc-source-example[data-source-chart=stage-bars-card] .hc-react-card-header{margin-bottom:20px}.hc-source-example .hc-react-stages-list{margin:0;gap:14px}.hc-source-example .hc-react-stages-list button{font:400 14px/20px var(--hu-font);grid-template-columns:72px minmax(30px,1fr) 93px;padding:0}.hc-source-example .hc-react-stage-track{height:24px}.hc-source-example .hc-react-stages-list button>strong,.hc-source-example .hc-react-stages-list button small{font-size:14px}.hc-source-example .hc-react-stages-list+div{margin-top:auto}\n.hc-source-example .hc-react-matrix{margin-top:0;gap:8px}.hc-source-example .hc-react-matrix .hc-react-heatmap{height:174px;gap:4px}.hc-source-example .hc-react-matrix-y{font-size:12px}.hc-source-example .hc-react-matrix-x{font-size:12px}.hc-source-example .hc-react-month-axis{font-size:12px;line-height:20px}\n.hc-source-example .hc-react-axis-captions{font:400 12px/20px var(--hu-font)}\n@media(max-width:639px){.hc-source-example .hc-react-card[data-presentation=source]{height:auto;min-height:var(--source-chart-height)}.hc-source-example .hc-react-card-header{flex-direction:column;gap:12px;margin-bottom:20px}.hc-source-example .hc-react-periods{padding:0}.hc-source-example .hc-react-periods button{padding:4px 8px}.hc-source-example .hc-react-headline .hu-chart-total{font-size:30px;line-height:36px}.hc-source-example .hc-react-mini-legend{margin-top:8px}.hc-source-example .hc-react-mini-legend>span,.hc-source-example .hc-react-metric-legend>button{padding:7px 8px}.hc-source-example[data-source-chart=activity-rings-card] .hc-react-metric-legend{grid-template-columns:repeat(3,minmax(0,1fr))}.hc-source-example[data-source-chart=sleep-score-card] .hc-react-card-header,.hc-source-example[data-source-chart=most-active-days-card] .hc-react-card-header{flex-direction:row}.hc-source-example .hc-react-metric-legend:not(.hc-react-score-legend){grid-template-columns:repeat(3,minmax(0,1fr))}.hc-source-example .hc-react-stages-list button{grid-template-columns:62px minmax(20px,1fr) 80px;font-size:12px}.hc-source-example .hc-react-stages-list button>strong,.hc-source-example .hc-react-stages-list button small{font-size:12px}}\n.hc-source-example.hc-source-fluid{max-width:none}.hc-source-row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;width:100%;min-width:0}.hc-source-example-stack{display:grid;gap:24px;width:100%}.hc-source-variant-controls{display:flex;flex-wrap:wrap;gap:3px;justify-content:center;margin:0 auto 16px;padding:4px;border-radius:10px;background:var(--color-segmented-control-background)}.hc-source-variant-controls>button{font:400 14px/20px var(--hu-font);padding:4px 9px;border:0;background:none;border-radius:6px;color:var(--hu-muted);cursor:pointer}.hc-source-variant-controls>button[aria-pressed=true]{background:var(--color-segmented-control-selected-background);color:var(--hu-text);box-shadow:0 1px 2px #0001}@media(max-width:639px){.hc-source-row{grid-template-columns:1fr}}\n.hc-source-total-label{font:400 14px/20px var(--hu-font);color:var(--color-text-secondary);align-self:flex-end;padding-bottom:2px;white-space:nowrap}.hc-source-contribution-summary{grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;margin:0 0 20px}.hc-source-contribution-summary>span{min-height:60px;padding:8px 12px;border-radius:8px;background:var(--color-background-primary-default);font:400 12px/18px var(--hu-font)}.hc-source-contribution-summary strong{font:500 20px/28px var(--hu-font)}\n.hc-source-example .hc-react-mini-legend.hc-react-score-legend{grid-template-columns:1fr;gap:0;padding:0 10px;background:var(--color-background-primary-default);border-radius:12px}.hc-source-example .hc-react-score-legend>button{min-height:40px;padding:10px 0;font:400 14px/20px var(--hu-font);border-bottom:1px solid var(--color-border-button-default);border-radius:0}.hc-source-example .hc-react-score-legend>button:last-child{border-bottom:0}.hc-source-example .hc-react-score-legend>button>span{display:flex;align-items:center;gap:6px}.hc-source-example .hc-react-score-legend i{width:12px;height:12px;border-radius:4px;flex-shrink:0;margin:0}.hc-source-example[data-source-chart=sleep-score-card] .hc-react-card-header{margin-bottom:14px}.hc-source-example[data-source-chart=sleep-score-card] .hc-react-plot{margin-bottom:16px}\n.hc-source-example[data-source-chart=activity-rings-card] .hc-react-metric-legend{order:0;margin:0}.hc-source-example[data-source-chart=activity-rings-card] .hc-react-metric-legend>button{padding:8px 10px}.hc-source-example[data-source-chart=activity-rings-card] .hc-react-metric-legend strong{font-size:14px;line-height:20px}\n.hc-source-date-control{display:flex;align-items:center;gap:5px;padding:3px 4px;background:var(--color-background-primary-default);border:1px solid var(--color-border-button-default);box-shadow:0 1px 2px #00000008;border-radius:10px;white-space:nowrap}.hc-source-date-control>button{display:grid;place-items:center;width:20px;height:24px;padding:0;background:none;border:0;border-radius:4px;color:var(--color-text-secondary);cursor:pointer}.hc-source-date-control select{font:500 14px/20px var(--hu-font);appearance:none;text-align:center;border:0;background:none;color:var(--color-text-primary);padding:0;max-width:132px;min-width:0;cursor:pointer}.hc-source-date-control>button:focus-visible,.hc-source-date-control select:focus-visible{outline:2px solid var(--hu-brand-text);outline-offset:1px}.hc-source-days-pair{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;width:100%;max-width:742px;min-width:0}.hc-source-example .hc-react-days-calendar{margin-top:8px}.hc-source-example .hc-react-days button svg{width:28px;height:28px}.hc-source-example .hc-react-days button{gap:8px;min-height:67px;padding:7px 0}.hc-source-example .hc-react-days button[aria-pressed=true]{outline:1px solid var(--color-border-button-default);border-radius:12px}.hc-source-example .hc-react-days-calendar{scrollbar-width:none}.hc-source-example .hc-react-month-navigation{padding:4px 8px;font:500 16px/24px var(--hu-font);background:var(--color-background-primary-default);box-shadow:none}.hc-source-example .hc-react-month-navigation .hc-react-small-label{font:500 16px/24px var(--hu-font);color:var(--hu-text)}\n@media(max-width:639px){.hc-source-days-pair{grid-template-columns:1fr}.hc-source-date-control{gap:2px;padding:2px}.hc-source-date-control select{font-size:12px;max-width:115px}.hc-source-example .hc-react-mini-legend.hc-react-score-legend{grid-template-columns:1fr}}\n.hc-source-example .hc-react-headline .hu-chart-total{font-size:24px;line-height:34px;letter-spacing:0}.hc-source-example:is([data-source-chart=sleep-score-card],[data-source-chart=steps-card],[data-source-chart=activity-rings-card],[data-source-chart=most-active-days-card]) .hc-react-card[data-presentation=source]{padding:10px;border-radius:20px}.hc-source-example:is([data-source-chart=sleep-score-card],[data-source-chart=steps-card],[data-source-chart=most-active-days-card]) .hc-react-card-header{margin:0 0 16px;padding:0 6px;gap:8px}.hc-source-example:is([data-source-chart=sleep-score-card],[data-source-chart=steps-card],[data-source-chart=most-active-days-card]) .hc-react-headline{margin:0}.hc-source-example[data-source-chart=sleep-score-card] .hc-react-headline .hu-chart-total,.hc-source-example[data-source-chart=most-active-days-card] .hc-react-headline .hu-chart-total{font-size:24px;line-height:34px;letter-spacing:0}.hc-source-example[data-source-chart=sleep-score-card] .hc-react-plot{margin-bottom:16px}.hc-source-example[data-source-chart=activity-rings-card] .hc-react-card-header{padding:6px 6px 0;margin:0 0 16px}.hc-source-example[data-source-chart=activity-rings-card] .hc-react-metric-legend{margin:0 0 16px}.hc-source-example[data-source-chart=steps-card] .hc-react-plot{margin:0}.hc-source-example[data-source-chart=most-active-days-card] .hc-react-days-calendar{margin:0;background:var(--color-background-primary-default);border-radius:10px;padding:0 10px}\n.hc-source-activity-plot{width:100%;min-width:0;display:flex;justify-content:center;flex:1;min-height:0}.hc-source-activity-plot>svg{display:block;width:100%;height:100%;max-height:210px;overflow:visible}.hc-source-activity-plot circle{transition:stroke .2s ease,stroke-dasharray .2s ease,opacity .2s ease}.hc-source-activity-plot g[role=button]{cursor:pointer;outline:none}.hc-source-activity-plot g[role=button]:focus-visible>circle:last-child{filter:drop-shadow(0 0 2px var(--hu-brand-text))}@media(prefers-reduced-motion:reduce){.hc-source-activity-plot circle{transition:none}}\n.hc-source-example .hc-source-calendar-card[data-presentation=source]{display:flex;flex-direction:column;gap:16px;padding:10px;border-radius:20px}.hc-source-calendar-header{display:flex;align-items:start;justify-content:space-between;gap:6px;padding-inline:6px;min-height:54px;flex-shrink:0}.hc-source-calendar-header>div:first-child{min-width:0}.hc-source-calendar-header h3{font:500 14px/20px var(--hu-font);color:var(--color-text-secondary);white-space:nowrap}.hc-source-calendar-header>div>div{display:flex;align-items:baseline;gap:4px;white-space:nowrap}.hc-source-calendar-header strong{font:500 24px/34px var(--hu-font);letter-spacing:0;color:var(--color-text-primary)}.hc-source-calendar-header span{font:400 12px/18px var(--hu-font);color:var(--color-text-secondary)}.hc-source-calendar-header .hc-source-date-control{margin-top:0}.hc-source-calendar-header .hc-source-date-control select{max-width:80px}.hc-source-year-scroll{position:relative;overflow-y:auto;overscroll-behavior:contain;scrollbar-width:none;scroll-padding-block:10px;background:var(--color-background-primary-default);border-radius:10px;height:232px;min-height:0;padding:0 10px;flex:1;outline:none}.hc-source-year-scroll:focus-visible{outline:2px solid var(--hu-brand-text);outline-offset:2px}.hc-source-month{padding-bottom:12px}.hc-source-month h4{font:500 20px/26px var(--hu-font);padding-inline-start:4px;margin:8px 0 14px;color:var(--color-text-primary)}.hc-source-day-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:4px}.hc-source-day-grid>button{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;min-width:0;min-height:67px;padding:7px 0;background:none;border:1px solid transparent;border-radius:12px;font:400 14px/20px var(--hu-font);color:var(--color-text-primary);cursor:pointer}.hc-source-day-grid>button[aria-pressed=true]{border-color:var(--color-border-button-default);box-shadow:0 0 0 1px var(--color-border-button-default)}.hc-source-day-grid svg{height:28px;width:28px;overflow:visible;flex-shrink:0}.hc-source-day-grid>button:focus-visible{outline:2px solid var(--hu-brand-text);outline-offset:0}.hc-source-day-grid circle{transition:stroke-dasharray .2s ease}@media(prefers-reduced-motion:reduce){.hc-source-day-grid circle{transition:none}}\n.hc-source-example[data-source-chart=steps-card] .hc-react-card-header{flex-direction:row;align-items:flex-start}.hc-source-example .hc-source-calendar-header{container-type:normal}\n@container hc-chart (max-width:320px){.hc-source-calendar-header>div:first-child>div>span,.hc-source-example[data-source-chart=steps-card] .hc-source-total-label{display:none}.hc-source-date-control{gap:2px;padding:2px}.hc-source-date-control select{max-width:90px;font-size:12px}.hc-source-calendar-header .hc-source-date-control select{max-width:68px}.hc-source-example[data-source-chart=activity-rings-card] .hc-react-metric-legend>button{font-size:12px;line-height:16px;min-height:52px;padding:8px 6px}.hc-source-example[data-source-chart=activity-rings-card] .hc-react-metric-legend strong{font-size:12px;line-height:18px}}\n\n.hc-source-date-control[data-period-arrows=false]>button{display:none}.hc-source-date-control[data-period-arrows=false]{gap:6px;padding:4px 7px}.hc-source-date-control>span{display:grid;place-items:center;width:16px;height:20px;color:var(--color-text-secondary)}.hc-source-date-control>span>svg{width:16px;height:16px}\n\n.hc-source-date-control select{width:auto;padding:0!important}\n.hc-source-example .hc-source-stage-legend{grid-template-columns:repeat(3,minmax(0,1fr));margin-top:auto;gap:6px}\n.hc-source-flow-captions{display:flex;justify-content:space-between;font:400 12px/20px var(--hu-font);color:var(--color-text-tertiary);margin-top:auto}\n.hc-source-example[data-source-chart=radar-chart-card] .hc-react-metric-legend i{display:none}\n\n.hc-source-activity-heading{display:flex;align-items:center;justify-content:space-between;gap:8px;font:400 14px/20px var(--hu-font);color:var(--color-text-secondary);margin-bottom:8px}.hc-source-activity-heading .hc-react-periods{padding:0}.hc-source-example[data-source-chart=contributions-card] .hc-react-card-header{margin-bottom:16px}.hc-source-example[data-source-chart=contributions-card] .hc-source-contribution-summary{margin-bottom:8px}.hc-source-heatmap-scale{display:flex;align-items:center;justify-content:flex-end;gap:4px;font:400 12px/20px var(--hu-font);color:var(--color-text-tertiary);margin-top:8px}.hc-source-heatmap-scale>i{width:12px;height:8px;border-radius:2px}\n/* Contain Recharts' initial server width until its ResizeObserver measures the real card. */\n.hc-source-example .hc-react-plot{overflow:clip;overflow-clip-margin:8px}\n.hc-source-year-scroll{direction:ltr}\n\n.hc-source-radar-comparison{grid-template-columns:repeat(2,minmax(0,1fr))}.hc-source-radar-comparison>button{display:flex;flex-direction:column;align-items:flex-start;padding:8px 10px;border:0;border-radius:10px;background:var(--color-background-primary-default);color:var(--color-text-secondary);font:400 14px/20px var(--hu-font);cursor:pointer}.hc-source-radar-comparison>button>strong{font:500 14px/20px var(--hu-font);color:var(--color-text-primary)}.hc-source-radar-comparison>button[aria-pressed=false]{opacity:.45}.hc-source-radar-comparison>button:focus-visible{outline:2px solid var(--hu-brand-text);outline-offset:2px}\n\n.hc-source-range-trigger{height:32px;padding:5px 7px!important;font:400 14px/20px var(--hu-font)!important;gap:6px!important}.hc-source-range-trigger svg{height:16px;width:16px;flex-shrink:0}.hc-source-range-select{flex-shrink:0;min-width:0}.hc-source-range-select [data-rac][slot=value]{gap:6px}\n\n.hc-source-example .hc-source-calendar-card[data-presentation=source]{height:var(--source-chart-height);min-height:0}.hc-source-example .hc-source-year-scroll{max-height:232px;flex-basis:232px}\n\n.hc-source-example .hc-react-mini-legend>span,.hc-source-example .hc-react-metric-legend>button{font-size:14px;line-height:20px}.hc-source-example .hc-react-mini-legend strong{font-size:14px;line-height:20px}.hc-source-example .hc-react-mini-legend i{width:12px;height:12px;border-radius:4px;margin-inline-end:6px;vertical-align:middle}\n.hc-source-example:is([data-source-chart=radar-chart-card],[data-source-chart=radial-chart-card]) .hc-react-card{padding-bottom:16px}.hc-source-example:is([data-source-chart=radar-chart-card],[data-source-chart=radial-chart-card]) .hc-react-card-header{margin-bottom:12px}.hc-source-example:is([data-source-chart=radar-chart-card],[data-source-chart=radial-chart-card]) .hc-react-plot{margin-bottom:12px}\n.hc-source-example[data-source-chart=funnel-chart-card] .hc-react-funnel>.hc-react-mini-legend{grid-template-columns:repeat(4,minmax(0,1fr));margin-top:12px}@media(max-width:639px){.hc-source-example[data-source-chart=funnel-chart-card] .hc-react-funnel>.hc-react-mini-legend{grid-template-columns:repeat(2,minmax(0,1fr))}}\n\n.hc-source-example[data-source-chart=sankey-chart-card] .hc-react-card-header{margin-bottom:16px}.hc-source-example[data-source-chart=sankey-chart-card] .hc-react-plot{margin-bottom:16px}.hc-source-example[data-source-chart=sankey-chart-card] .hc-source-flow-captions{margin-top:0}\n.hc-source-example .hc-react-mini-legend>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hc-source-example .hc-react-metric-legend>button>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;overflow-wrap:normal}\n@media(max-width:639px){.hc-source-example:is([data-source-chart=area-chart-card],[data-source-chart=combo-chart-card],[data-source-chart=funnel-chart-card],[data-source-chart=heatmap-chart-card],[data-source-chart=radar-chart-card],[data-source-chart=radial-chart-card],[data-source-chart=sankey-chart-card],[data-source-chart=scatter-chart-card],[data-source-chart=stage-bars-card]) .hc-react-card-header{flex-direction:row;align-items:flex-start;gap:8px}.hc-source-example .hc-react-title-block h3{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hc-source-example[data-source-chart=contributions-card] .hc-source-contribution-summary{grid-template-columns:repeat(2,minmax(0,1fr))}}\n\n.hc-source-example .hc-react-stage-track i{color:var(--color-neutral-950)}\n\n/* Final source-frame reconciliation: measured public card controls, rings and tier levels. */\n.hc-source-example:is([data-source-chart=area-chart-card],[data-source-chart=combo-chart-card],[data-source-chart=radar-chart-card]) .hc-react-card-header{margin-bottom:16px}\n.hc-source-example[data-source-chart=steps-card] .hc-react-card-header{margin-bottom:24px}\n.hc-source-example[data-source-chart=contributions-card]{--hc-contribution-tier-0:var(--color-chart-neutral);--hc-contribution-tier-1:var(--color-violet-200);--hc-contribution-tier-2:var(--color-violet-400);--hc-contribution-tier-3:var(--color-violet-500);--hc-contribution-tier-4:var(--color-violet-600);--hc-contribution-tier-5:var(--color-violet-700)}\n.dark .hc-source-example[data-source-chart=contributions-card]{--hc-contribution-tier-1:var(--color-violet-950);--hc-contribution-tier-2:var(--color-violet-800);--hc-contribution-tier-3:var(--color-violet-700);--hc-contribution-tier-4:var(--color-violet-600);--hc-contribution-tier-5:var(--color-violet-500)}\n.hc-source-example .hc-react-contributions[data-source-contributions]{grid-auto-flow:row;gap:4px;height:auto;min-height:0;grid-template-rows:repeat(7,1fr)}\n.hc-source-example .hc-react-contributions[data-source-contributions]>button{aspect-ratio:1;min-height:0;border-radius:3px}\n@media(max-width:639px){.hc-source-example:not([data-source-chart=activity-rings-card]):not([data-source-chart=stage-bars-card]) .hc-react-mini-legend:not(.hc-react-score-legend){grid-template-columns:repeat(2,minmax(0,1fr))}.hc-source-example:not([data-source-chart=activity-rings-card]):not([data-source-chart=stage-bars-card]) .hc-react-mini-legend:not(.hc-react-score-legend)>:last-child:nth-child(odd){grid-column:1/-1}.hc-source-example[data-source-chart=contributions-card] .hc-react-contribution-calendar{min-width:calc(var(--contribution-weeks)*17px - 4px)}}\n\n.hc-source-example .hc-react-heatmap button[aria-pressed=true]:not(:focus-visible){outline:none}\n\n.hc-source-example[data-source-chart=funnel-chart-card] .hc-react-card{padding-bottom:16px}.hc-source-example[data-source-chart=funnel-chart-card] .hc-react-card-header{margin-bottom:12px}\n\n.hc-source-example .hc-react-funnel{position:relative}.hc-source-funnel-labels{direction:ltr;position:absolute;inset:0 0 auto;aspect-ratio:4/1;display:grid;align-items:center;pointer-events:none}.hc-source-funnel-labels>span{display:flex;justify-content:center}.hc-source-funnel-labels b{background:var(--color-background-primary-default);color:var(--color-text-primary);font:500 12px/16px var(--hu-font);border-radius:8px;padding:0 6px;white-space:nowrap}\n\n.hc-react-card .recharts-polar-angle-axis text[role=button]:is(:hover,:focus-visible){fill:var(--hu-text)}\n\n.hc-source-example[data-source-chart=contributions-card] .hc-source-contribution-summary{margin-inline:-8px}.hc-source-example[data-source-chart=contributions-card] .hc-source-contribution-summary>span{padding:10px;min-height:60px;font:500 14px/20px var(--hu-font)}.hc-source-example[data-source-chart=contributions-card] .hc-source-contribution-summary strong{font:500 14px/20px var(--hu-font)}.hc-source-example[data-source-chart=contributions-card] .hc-react-contributions{margin-top:0}.hc-source-example[data-source-chart=contributions-card] .hc-source-activity-heading{margin-bottom:4px}.hc-source-example[data-source-chart=contributions-card] .hc-react-month-axis{font-size:14px}\n.hc-source-variant-stack{display:grid;gap:16px;width:100%}\n.hc-source-variant-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;width:100%;min-width:0}\n.hc-source-variant-grid .hc-react-headline .hu-chart-total{font-size:24px;line-height:34px;letter-spacing:0}\n.hc-source-variant-grid .hc-react-card-header{margin-bottom:0}\n.hc-source-variant-grid .hc-react-card[data-chart-variant=score] .hc-react-headline{display:none}\n.hc-source-variant-stack .hc-react-mini-legend,.hc-source-variant-grid .hc-source-radar-comparison{display:flex;justify-content:center;align-items:center;gap:12px;margin-top:auto}\n.hc-source-variant-stack .hc-react-mini-legend>span,.hc-source-variant-grid .hc-source-radar-comparison>button{display:inline-flex;align-items:center;gap:4px;background:none;padding:0;min-height:20px;font:400 14px/20px var(--hu-font)}\n.hc-source-variant-stack .hc-react-mini-legend strong,.hc-source-variant-grid .hc-source-radar-comparison strong{display:inline;font:500 14px/20px var(--hu-font);margin:0}\n@media(max-width:639px){.hc-source-variant-grid{grid-template-columns:1fr}.hc-source-variant-stack .hc-react-mini-legend{flex-wrap:wrap}}\n.hc-source-stacked-legend{display:flex;align-items:center;justify-content:center;gap:12px;margin-top:auto;min-height:20px}\n.hc-source-stacked-legend>button{display:flex;align-items:center;gap:4px;padding:0;border:0;background:none;color:var(--color-text-primary);font:400 14px/20px var(--hu-font);cursor:pointer}\n.hc-source-stacked-legend i{width:12px;height:12px;border-radius:4px}.hc-source-stacked-legend strong{font-weight:500}.hc-source-radar-score-disc{filter:drop-shadow(0 2px 3px #0000000d)}\n.hc-source-example .hc-react-card[data-list-truncated=true] .hc-react-list>button:last-child{opacity:.4}\n.hc-source-example .hc-react-show-more{align-self:center;display:grid;place-items:center;width:32px;height:20px;min-height:20px;padding:0;border:1px solid var(--color-border-button-default);border-radius:9px;background:var(--color-background-primary-default);color:var(--color-text-secondary)}\n.hc-source-example .hc-react-show-more svg{width:14px;height:14px}\n.hc-source-variant-grid .hc-source-radar-comparison>button{flex-direction:row}\n.hc-react-card[data-presentation=source][data-chart-variant=score] .hc-react-plot{position:relative}\n.hc-source-radar-score-overlay{position:absolute;inset:50% auto auto 50%;transform:translate(-50%,-50%);width:72px;height:72px;display:flex;flex-direction:column;justify-content:center;align-items:center;gap:4px;border-radius:50%;background:var(--color-background-primary-default);box-shadow:0 2px 4px #0000000d;pointer-events:none}\n.hc-source-radar-score-overlay strong{font:500 24px/28px var(--hu-font);color:var(--color-text-primary)}.hc-source-radar-score-overlay span{font:400 12px/18px var(--hu-font);color:var(--color-text-tertiary)}\n.hc-source-example[data-source-chart=earnings-chart-card][data-source-default]:not(.hc-source-fluid){max-width:576px}\n@media(min-width:1280px){.hc-source-example[data-source-chart=earnings-chart-card][data-source-default]:not(.hc-source-fluid)>.hc-react-card[data-presentation=source]{width:673px;flex-shrink:0}}\n@media(max-width:639px){.hc-source-example[data-source-default]:not(.hc-source-fluid):is([data-source-chart=earnings-chart-card],[data-source-chart=line-chart-card]) .hc-react-card-header{margin-bottom:24px}}\n\n/* Keep the bar-list tab baseline below its labels; reserve the metric caption outside the scroll strip. */\n.hc-react-list-heading{display:flex;align-items:end;gap:12px;min-width:0;flex-shrink:0;border-bottom:1px solid var(--hu-line)}\n.hc-react-list-heading>.hc-react-list-tabs{flex:1;min-width:0;scrollbar-width:none;gap:4px;padding:0;margin:0}\n.hc-react-list-heading>.hc-react-list-tabs:after{content:none}\n.hc-react-list-heading>span{flex:none;padding-bottom:8px;color:var(--hu-muted);font:400 12px/20px var(--hu-font);text-transform:uppercase}\n.hc-react-list-heading .hc-react-list-tabs>button{flex:none;min-height:36px;padding:8px 10px;font:400 14px/20px var(--hu-font);border-bottom-width:2px}\n.hc-source-example[data-source-chart=bar-list-card] .hc-react-card{padding:4px 16px 12px}\n.hc-source-example[data-source-chart=bar-list-card] .hc-react-list-heading{margin-inline:-16px;padding-inline:16px}\n.hc-source-example[data-source-chart=bar-list-card] .hc-react-list{margin:12px -8px -4px;gap:4px;flex-shrink:0}\n.hc-source-example[data-source-chart=bar-list-card] .hc-react-list>button{height:36px;padding:0 10px;gap:12px}\n.hc-source-example[data-source-chart=bar-list-card] .hc-row-icon{color:var(--color-text-secondary)}\n/* Match source icon sizing and preserve header room when a narrow title truncates. */\n.hc-source-example .hc-source-range-trigger svg{width:14px;height:14px}\n.hc-source-example .hc-react-card-header h3{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.hc-source-example .hc-react-header-tools{flex-shrink:0}\n.hc-source-example[data-source-chart=heatmap-chart-card] .hc-react-heatmap>button{border-radius:4px}\n\n/* Stage labels share a column; keep the observed 20px tracks and readable icon bounds. */\n.hc-source-example .hc-react-stages-list{display:grid;grid-template-columns:max-content minmax(20px,1fr) max-content;column-gap:12px;row-gap:12px;margin-bottom:16px}\n.hc-source-example .hc-react-stages-list>button{grid-column:1/-1;display:grid;grid-template-columns:subgrid;gap:12px;font:400 14px/20px var(--hu-font)}\n.hc-source-example .hc-react-stages-list>button>span:first-child{text-align:end;color:var(--color-text-secondary);white-space:nowrap}\n.hc-source-example .hc-react-stage-track{height:20px}\n.hc-source-example .hc-react-stages-list>button>strong,.hc-source-example .hc-react-stages-list>button small{font-size:14px;gap:6px}\n\n/* Reserve intrinsic room for heatmap row labels, including EMEA/LATAM examples. */\n.hc-react-matrix{grid-template-columns:max-content minmax(0,1fr)}\n.hc-react-matrix-y>span{white-space:nowrap}\n.hc-source-example[data-source-chart=funnel-chart-card] .hc-react-funnel>.hc-react-mini-legend{grid-template-columns:repeat(var(--funnel-columns,4),minmax(0,1fr))}\n@media(max-width:639px){.hc-source-example[data-source-chart=funnel-chart-card] .hc-react-funnel>.hc-react-mini-legend{grid-template-columns:repeat(2,minmax(0,1fr))}}\n\n.hc-source-example .hc-react-delta[data-negative=true]{background:var(--color-status-rose-background);color:var(--color-status-rose-text)}\n.hc-react-list-heading>strong{min-width:0;flex:1;font:500 14px/20px var(--hu-font);color:var(--hu-text);padding-bottom:8px}\n/* Expanding a list must reflow its card instead of painting over the following example. */\n.hc-source-example[data-source-chart=bar-list-card] .hc-react-card{height:auto;min-height:var(--source-chart-height)}\n\n/* Native desktop comparison: stage rows use a 32px pitch and inset legend tiles. */\n.hc-source-example[data-source-chart=stage-bars-card] .hc-react-card-header{margin-bottom:24px}\n.hc-source-example[data-source-chart=stage-bars-card] .hc-react-mini-legend{margin-inline:-8px;margin-bottom:-4px}\n\n/* Canonical revenue hides date chrome; templates explicitly requesting segmented periods retain it. */\n.hc-source-example .hc-react-card[data-period-presentation=segmented] .hc-react-header-tools{display:flex}\n\n.hc-source-example .hc-react-stage-track i{width:14px;height:14px}\n",
  "src/components.tsx": "import { UIIcon } from './icons.js';\nimport { renderIcon } from './icons.js';\nimport { forwardRef, useEffect, useId, useRef, useState } from 'react';\nimport type {\n  ButtonHTMLAttributes,\n  InputHTMLAttributes,\n  SelectHTMLAttributes,\n  ReactNode,\n} from 'react';\n\nexport type ButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n  size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n  variant?: 'primary' | 'secondary' | 'tertiary' | 'ghost' | 'link-gray' | 'link-color' | 'danger';\n  loading?: boolean;\n  leadingIcon?: ReactNode;\n  trailingIcon?: ReactNode;\n  iconOnly?: boolean;\n};\n/** Native button: loading blocks duplicate actions without losing the accessible label. */\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n  {\n    size = 'md',\n    variant = 'primary',\n    loading = false,\n    leadingIcon,\n    trailingIcon,\n    iconOnly = false,\n    children,\n    className = '',\n    disabled,\n    type = 'button',\n    ...props\n  },\n  ref,\n) {\n  return (\n    <button\n      {...props}\n      ref={ref}\n      type={type}\n      disabled={disabled || loading}\n      aria-busy={loading || undefined}\n      className={`hu-button hu-${size} hu-${variant} ${iconOnly ? 'hu-icon-only' : ''} ${className}`}\n    >\n      {loading ? (\n        <span className=\"hu-spinner\" aria-hidden=\"true\" />\n      ) : (\n        leadingIcon && (\n          <span className=\"hu-icon\" aria-hidden=\"true\">\n            {renderIcon(leadingIcon)}\n          </span>\n        )\n      )}\n      <span className={iconOnly ? 'hu-sr-only' : ''}>{children}</span>\n      {!loading && trailingIcon && (\n        <span className=\"hu-icon\" aria-hidden=\"true\">\n          {renderIcon(trailingIcon)}\n        </span>\n      )}\n    </button>\n  );\n});\n\nexport type InputProps = Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix'> & {\n  label: string;\n  size?: 'sm' | 'md' | 'lg';\n  hint?: string;\n  error?: string;\n  leadingIcon?: ReactNode;\n  suffix?: ReactNode;\n};\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n  { label, size = 'md', hint, error, leadingIcon, suffix, id, className = '', ...props },\n  ref,\n) {\n  const uid = useId(),\n    fieldId = id || uid,\n    messageId = fieldId + '-message';\n  const described =\n    [props['aria-describedby'], (error || hint) && messageId].filter(Boolean).join(' ') ||\n    undefined;\n  return (\n    <div className={`hu-field hu-${size} ${error ? 'hu-invalid' : ''} ${className}`}>\n      <label htmlFor={fieldId}>\n        {label}\n        {props.required && <span aria-hidden=\"true\"> *</span>}\n      </label>\n      <div className=\"hu-input-wrap\">\n        {leadingIcon && (\n          <span className=\"hu-icon\" aria-hidden=\"true\">\n            {renderIcon(leadingIcon)}\n          </span>\n        )}\n        <input\n          {...props}\n          dir={props.dir || (['email','url','tel','number'].includes(props.type || '') ? 'ltr' : undefined)}\n          ref={ref}\n          id={fieldId}\n          aria-invalid={error ? true : props['aria-invalid']}\n          aria-describedby={described}\n        />\n        {suffix && <span className=\"hu-suffix\">{suffix}</span>}\n      </div>\n      {(error || hint) && (\n        <span id={messageId} className=\"hu-hint\" role={error ? 'alert' : undefined}>\n          {error || hint}\n        </span>\n      )}\n    </div>\n  );\n});\n\nexport type SelectOption = { value: string; label: string; disabled?: boolean };\nexport type SelectProps = Omit<SelectHTMLAttributes<HTMLSelectElement>, 'size' | 'children'> & {\n  label: string;\n  size?: 'sm' | 'md' | 'lg';\n  options: SelectOption[];\n  placeholder?: string;\n  hint?: string;\n  error?: string;\n  loading?: boolean;\n  leadingIcon?: ReactNode;\n};\n/** Native select preserves mobile pickers, keyboard typeahead, form submission and option semantics. */\nexport const Select = forwardRef<HTMLSelectElement, SelectProps>(function Select(\n  {\n    label,\n    size = 'md',\n    options,\n    placeholder,\n    hint,\n    error,\n    loading = false,\n    leadingIcon,\n    id,\n    className = '',\n    disabled,\n    ...props\n  },\n  ref,\n) {\n  const uid = useId(),\n    fieldId = id || uid,\n    messageId = fieldId + '-message';\n  return (\n    <div className={`hu-field hu-select hu-${size} ${error ? 'hu-invalid' : ''} ${className}`}>\n      <label htmlFor={fieldId}>\n        {label}\n        {props.required && <span aria-hidden=\"true\"> *</span>}\n      </label>\n      <div className=\"hu-input-wrap\">\n        {leadingIcon && (\n          <span className=\"hu-icon\" aria-hidden=\"true\">\n            {renderIcon(leadingIcon)}\n          </span>\n        )}\n        <select\n          {...props}\n          ref={ref}\n          id={fieldId}\n          disabled={disabled || loading}\n          aria-busy={loading || undefined}\n          aria-invalid={error ? true : props['aria-invalid']}\n          aria-describedby={\n            [props['aria-describedby'], (error || hint) && messageId].filter(Boolean).join(' ') ||\n            undefined\n          }\n        >\n          {placeholder && <option value=\"\">{loading ? 'Loading options…' : placeholder}</option>}\n          {options.map((option) => (\n            <option key={option.value} value={option.value} disabled={option.disabled}>\n              {option.label}\n            </option>\n          ))}\n        </select>\n        <span className=\"hu-chevron\" aria-hidden=\"true\"><UIIcon name=\"chevron-down\" /></span>\n      </div>\n      {(error || hint) && (\n        <span id={messageId} className=\"hu-hint\" role={error ? 'alert' : undefined}>\n          {error || hint}\n        </span>\n      )}\n    </div>\n  );\n});\n\nexport type CheckboxProps = Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'> & {\n  label: string;\n  hint?: string;\n  indeterminate?: boolean;\n  size?: 'sm' | 'md';\n  card?: boolean;\n};\nexport function Checkbox({\n  label,\n  hint,\n  indeterminate = false,\n  size = 'md',\n  card = false,\n  id,\n  className = '',\n  ...props\n}: CheckboxProps) {\n  const uid = useId(),\n    ref = useRef<HTMLInputElement>(null),\n    fieldId = id || uid;\n  useEffect(() => {\n    if (ref.current) ref.current.indeterminate = indeterminate;\n  }, [indeterminate]);\n  return (\n    <label className={`hu-checkbox hu-${size} ${card ? 'hu-checkbox-card' : ''} ${className}`} htmlFor={fieldId}>\n      <input\n        {...props}\n        id={fieldId}\n        ref={ref}\n        type=\"checkbox\"\n        aria-describedby={hint ? fieldId + '-hint' : props['aria-describedby']}\n      />\n      <span className=\"hu-checkbox-visual\" aria-hidden=\"true\"><svg viewBox=\"0 0 16 16\"><path className=\"hu-checkbox-tick\" d=\"m4 8 2.5 2.5L12 5\" pathLength=\"1\"/><path className=\"hu-checkbox-mixed\" d=\"M4 8h8\"/></svg></span>\n      <span>\n        {label}\n        {hint && <small id={fieldId + '-hint'}>{hint}</small>}\n      </span>\n    </label>\n  );\n}\n\nexport type Tab = { id: string; label: string; content: ReactNode; disabled?: boolean; icon?: ReactNode; count?: number | string };\nexport type TabsProps = {\n  label: string;\n  items: Tab[];\n  value?: string;\n  defaultValue?: string;\n  onValueChange?: (value: string) => void;\n  variant?: 'underline' | 'pill' | 'gray';\n};\nexport function Tabs({ label, items, value, defaultValue, onValueChange, variant = 'underline' }: TabsProps) {\n  const [local, setLocal] = useState(defaultValue || items.find((x) => !x.disabled)?.id),\n    uid = useId();\n  const candidate = value ?? local;\n  // Disabling every control must not hide the selected panel or its form contents.\n  // Prefer enabled alternatives when available, then retain a valid existing selection.\n  const current = items.some((item) => item.id === candidate && !item.disabled)\n    ? candidate\n    : items.find((item) => !item.disabled)?.id ??\n      items.find((item) => item.id === candidate)?.id ??\n      items[0]?.id;\n  const choose = (id: string) => {\n    setLocal(id);\n    onValueChange?.(id);\n  };\n  return (\n    <div className=\"hu-tabs\" data-variant={variant}>\n      <div\n        role=\"tablist\"\n        aria-label={label}\n        onKeyDown={(event) => {\n          if (!['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key)) return;\n          const tabs = items.filter((x) => !x.disabled),\n            index = tabs.findIndex((x) => x.id === current),\n            forward = getComputedStyle(event.currentTarget).direction === 'rtl' ? 'ArrowLeft' : 'ArrowRight';\n          const next =\n            event.key === 'Home'\n              ? tabs[0]\n              : event.key === 'End'\n                ? tabs.at(-1)\n                : tabs[(index + (event.key === forward ? 1 : -1) + tabs.length) % tabs.length];\n          if (next) {\n            event.preventDefault();\n            choose(next.id);\n            document.getElementById(uid + '-' + next.id)?.focus();\n          }\n        }}\n      >\n        {items.map((item) => (\n          <button\n            key={item.id}\n            type=\"button\"\n            role=\"tab\"\n            id={uid + '-' + item.id}\n            aria-controls={uid + '-panel-' + item.id}\n            aria-selected={current === item.id}\n            tabIndex={current === item.id ? 0 : -1}\n            disabled={item.disabled}\n            onClick={() => choose(item.id)}\n          >\n            {item.icon && <span className=\"hu-tab-icon\" aria-hidden=\"true\">{renderIcon(item.icon)}</span>}{item.label}{item.count !== undefined && <span className=\"hu-tab-count\">{item.count}</span>}\n          </button>\n        ))}\n      </div>\n      {items.map((item) => (\n        <div\n          key={item.id}\n          role=\"tabpanel\"\n          id={uid + '-panel-' + item.id}\n          aria-labelledby={uid + '-' + item.id}\n          tabIndex={0}\n          hidden={current !== item.id}\n        >\n          {item.content}\n        </div>\n      ))}\n    </div>\n  );\n}\n\nexport type DialogProps = {\n  open: boolean;\n  onOpenChange: (open: boolean) => void;\n  title: string;\n  description?: string;\n  children?: ReactNode;\n  footer?: ReactNode;\n  destructive?: boolean;\n};\n/** Browser modal supplies focus containment, Escape, inert background and restoration. */\nexport function Dialog({\n  open,\n  onOpenChange,\n  title,\n  description,\n  children,\n  footer,\n  destructive = false,\n}: DialogProps) {\n  const ref = useRef<HTMLDialogElement>(null),\n    uid = useId(),\n    onChange = useRef(onOpenChange),\n    programmaticCloses = useRef(0);\n  onChange.current = onOpenChange;\n  useEffect(() => {\n    const node = ref.current;\n    if (!node) return;\n    const previous = document.activeElement as HTMLElement | null;\n    if (open && !node.open) node.showModal();\n    else if (!open && node.open) {\n      programmaticCloses.current++;\n      node.close();\n    }\n    return () => {\n      if (node.open) {\n        programmaticCloses.current++;\n        node.close();\n      }\n      if (open && previous?.isConnected) previous.focus();\n    };\n  }, [open]);\n  return (\n    <dialog\n      ref={ref}\n      tabIndex={-1}\n      onKeyDown={(event) => {\n        if (event.key !== 'Tab') return;\n        const dialog = ref.current;\n        if (!dialog) return;\n        const focusable = [\n          ...dialog.querySelectorAll<HTMLElement>(\n            'button:not(:disabled),input:not(:disabled),select:not(:disabled),textarea:not(:disabled),a[href],[tabindex]:not([tabindex=\"-1\"])',\n          ),\n        ].filter((node) => node.getClientRects().length > 0);\n        const first = focusable[0],\n          last = focusable.at(-1);\n        if (!first) {\n          event.preventDefault();\n          dialog.focus();\n        } else if (\n          event.shiftKey &&\n          (document.activeElement === first || document.activeElement === dialog)\n        ) {\n          event.preventDefault();\n          last?.focus();\n        } else if (!event.shiftKey && document.activeElement === last) {\n          event.preventDefault();\n          first.focus();\n        }\n      }}\n      className={`hu-dialog ${destructive ? 'hu-destructive' : ''}`}\n      aria-labelledby={uid + '-title'}\n      aria-describedby={description ? uid + '-description' : undefined}\n      onCancel={(event) => {\n        event.preventDefault();\n        onChange.current(false);\n      }}\n      onClose={(event) => {\n        // Controlled effects and StrictMode cleanup queue native close events.\n        // Consume those events without repeating the user’s close callback.\n        if (programmaticCloses.current > 0) {\n          programmaticCloses.current--;\n          return;\n        }\n        if (!event.currentTarget.open) onChange.current(false);\n      }}\n    >\n      <header>\n        <h2 id={uid + '-title'}>{title}</h2>\n        {description && <p id={uid + '-description'}>{description}</p>}\n        <Button\n          variant=\"tertiary\"\n          size=\"sm\"\n          iconOnly\n          aria-label=\"Close dialog\"\n          onClick={() => onChange.current(false)}\n          leadingIcon=\"×\"\n        >\n          Close dialog\n        </Button>\n      </header>\n      {children && <div className=\"hu-dialog-body\">{children}</div>}\n      {footer && <footer>{footer}</footer>}\n    </dialog>\n  );\n}\n\nexport type DataStateProps = {\n  state: 'loading' | 'empty' | 'error';\n  onRetry?: () => void;\n  emptyMessage?: string;\n};\nexport function DataState({\n  state,\n  onRetry,\n  emptyMessage = 'No results. Try a different filter.',\n}: DataStateProps) {\n  return (\n    <div\n      className=\"hu-data-state\"\n      role={state === 'error' ? 'alert' : 'status'}\n      aria-busy={state === 'loading'}\n    >\n      {state === 'loading' ? (\n        <>\n          <span className=\"hu-spinner\" aria-hidden=\"true\" />\n          <strong>Loading example data…</strong>\n        </>\n      ) : state === 'error' ? (\n        <>\n          <strong>Couldn’t load this example.</strong>\n          <p>Your changes are preserved. Try again.</p>\n          {onRetry && (\n            <Button variant=\"secondary\" onClick={onRetry}>\n              Try again\n            </Button>\n          )}\n        </>\n      ) : (\n        <>\n          <strong>No results</strong>\n          <p>{emptyMessage}</p>\n          {onRetry && (\n            <Button variant=\"secondary\" onClick={onRetry}>\n              Reset example\n            </Button>\n          )}\n        </>\n      )}\n    </div>\n  );\n}\n",
  "src/creator-avatar-renderer.ts": "/**\n * Independently authored Canvas2D avatar renderer, reconstructed from the public\n * BoardUI Creator's visible geometry, canvas output and measured motion constants.\n * This is not the licensed Creator widget or a bundled copy of its runtime.\n * Public observation/provenance: output/playwright/creator-repair/SPEC.md.\n */\nexport type CreatorShape = 'petal'|'flower'|'star'|'heart'|'cloud'|'diamond'|'shield'|'slender'|'pocket';\nexport type CreatorExpression = 'neutral'|'happy'|'angry'|'thinking'|'shook'|'curious'|'wink'|'sleepy'|'sad'|'worried'|'skeptical'|'focused'|'excited'|'calm'|'shy'|'confused';\ntype Point = [number,number];\ntype Cubic = [number,number,number,number,number,number];\nexport type FacePose = Record<'leftOpen'|'rightOpen'|'width'|'smile'|'leftAngle'|'rightAngle'|'brow'|'browAngle'|'browLift'|'browAsymmetry'|'lookX'|'lookY'|'headTilt'|'bounce'|'tremble'|'blink',number>;\nexport const FACE_BASE:FacePose={leftOpen:1,rightOpen:1,width:.45,smile:0,leftAngle:-.08,rightAngle:-.08,brow:0,browAngle:0,browLift:0,browAsymmetry:0,lookX:0,lookY:0,headTilt:0,bounce:0,tremble:0,blink:1};\n/** Measured face landmarks; the Creator applies 85% of each expression. */\nconst EXPRESSIONS:Record<CreatorExpression,Partial<FacePose>>={\n neutral:{},happy:{leftOpen:.75,rightOpen:.75,width:.53,smile:1,bounce:1},\n angry:{leftOpen:.45,rightOpen:.45,width:.52,leftAngle:.35,rightAngle:-.35,brow:1,browAngle:.45,browLift:-2,headTilt:-.07,lookY:2},\n thinking:{leftOpen:.7,rightOpen:.42,brow:.9,browAngle:-.1,browLift:2,browAsymmetry:6,lookX:8,lookY:-9,headTilt:.15},\n shook:{leftOpen:1.55,rightOpen:1.55,width:.57,brow:1,browLift:11,browAngle:-.15,lookY:-2,tremble:1},\n curious:{leftOpen:1.15,rightOpen:.68,brow:.8,browLift:4,browAsymmetry:8,lookX:4,lookY:-3,headTilt:-.13},\n wink:{leftOpen:1,rightOpen:.08,width:.45,rightAngle:-.13,headTilt:-.1,bounce:.3},\n sleepy:{leftOpen:.18,rightOpen:.18,width:.55,leftAngle:.08,rightAngle:-.08,lookY:5,headTilt:.12},\n sad:{leftOpen:.48,rightOpen:.48,width:.48,leftAngle:-.28,rightAngle:.28,brow:.85,browAngle:-.65,browLift:-1,lookY:7,headTilt:.07},\n worried:{leftOpen:1.1,rightOpen:1.1,width:.34,brow:1,browAngle:-.85,browLift:5,lookY:-3,tremble:.18},\n skeptical:{leftOpen:.16,rightOpen:.65,width:.6,brow:.8,browAngle:.06,browAsymmetry:-12,browLift:1,headTilt:.1,lookX:-5},\n focused:{leftOpen:.32,rightOpen:.32,width:.68,leftAngle:.12,rightAngle:-.12,brow:.4,browAngle:.15,browLift:-4,lookY:1},\n excited:{leftOpen:1.3,rightOpen:1.3,width:.68,smile:1,brow:.65,browLift:8,bounce:1.3},\n calm:{leftOpen:.25,rightOpen:.25,width:.62,smile:1,leftAngle:-.1,rightAngle:.1,headTilt:-.04},\n shy:{leftOpen:.6,rightOpen:.6,width:.3,leftAngle:-.3,rightAngle:.3,lookY:10,lookX:-4,headTilt:-.18},\n confused:{leftOpen:.45,rightOpen:1.3,width:.5,leftAngle:-.2,rightAngle:.14,brow:.9,browAngle:-.25,browAsymmetry:-10,browLift:3,headTilt:.2,lookX:-4},\n};\nexport function expressionPose(expression:string):FacePose{\n const patch=EXPRESSIONS[expression as CreatorExpression]||EXPRESSIONS.neutral;\n return Object.fromEntries(Object.entries(FACE_BASE).map(([key,value])=>[key,value+((patch[key as keyof FacePose]??value)-value)*.85])) as FacePose;\n}\nconst TAU=Math.PI*2;\nexport const clamp=(v:number,low=0,high=1)=>Math.max(low,Math.min(high,v));\nexport const smoother=(v:number)=>{const t=clamp(v);return t*t*t*(t*(t*6-15)+10)};\nconst mix=(a:number,b:number,t:number)=>a+(b-a)*t;\nconst mixPoint=(a:Point,b:Point,t:number):Point=>[mix(a[0],b[0],t),mix(a[1],b[1],t)];\n/** Cubic landmarks measured in the Creator's 200×200 drawing coordinate space. */\nconst OUTLINES:Partial<Record<CreatorShape,{start:Point;curves:Cubic[]}>>={\n heart:{start:[0,-46],curves:[[12,-46,16,-73,43,-73],[86,-73,96,-29,76,2],[59,34,28,64,10,78],[4,84,-4,84,-10,78],[-28,64,-59,34,-76,2],[-96,-29,-86,-73,-43,-73],[-16,-73,-12,-46,0,-46]]},\n cloud:{start:[0,-75],curves:[[25,-75,42,-54,44,-32],[70,-45,93,-23,92,0],[105,30,81,62,55,62],[21,64,-19,64,-54,62],[-84,62,-100,40,-96,13],[-94,-10,-76,-24,-55,-23],[-59,-49,-35,-66,-15,-58],[-12,-68,-8,-75,0,-75]]},\n diamond:{start:[0,-88],curves:[[8,-88,14,-77,24,-66],[42,-46,61,-25,76,-10],[84,-2,84,2,76,10],[61,25,42,46,24,66],[14,77,8,88,0,88],[-8,88,-14,77,-24,66],[-42,46,-61,25,-76,10],[-84,2,-84,-2,-76,-10],[-61,-25,-42,-46,-24,-66],[-14,-77,-8,-88,0,-88]]},\n shield:{start:[0,-86],curves:[[7,-86,16,-74,33,-67],[48,-60,63,-56,73,-54],[80,-53,81,-49,81,-41],[81,-26,81,-7,80,10],[79,42,51,60,10,84],[4,88,-4,88,-10,84],[-51,60,-79,42,-80,10],[-81,-7,-81,-26,-81,-41],[-81,-49,-80,-53,-73,-54],[-63,-56,-48,-60,-33,-67],[-16,-74,-7,-86,0,-86]]},\n};\nclass Curve {\n path=new Path2D();points:Point[]=[];sampled=false;\n move(x:number,y:number){this.path.moveTo(x,y);this.points.push([x,y]);return this}\n cubic(c:Cubic){const start=this.points.at(-1)||[0,0];this.path.bezierCurveTo(...c);for(let n=1;n<=12;n++){const t=n/12,u=1-t;this.points.push([u**3*start[0]+3*u*u*t*c[0]+3*u*t*t*c[2]+t**3*c[4],u**3*start[1]+3*u*u*t*c[1]+3*u*t*t*c[3]+t**3*c[5]])}return this}\n close(){this.path.closePath();return this}\n}\nfunction fromCubics(start:Point,curves:Cubic[],closed=true){const c=new Curve().move(...start);for(const segment of curves)c.cubic(segment);return closed?c.close():c}\nfunction outlinedPoint(shape:CreatorShape,angle:number):Point{\n const outline=OUTLINES[shape];\n if(!outline){const lobes=shape==='flower'?6:5,phase=Math.cos(lobes*(angle+Math.PI/2));const radius=shape==='flower'?58+28*Math.sqrt(.08+.92*(phase+1)/2):73+17*phase;return [Math.cos(angle)*radius,Math.sin(angle)*radius]}\n const position=(((angle+Math.PI/2)/TAU%1)+1)%1*outline.curves.length,index=Math.floor(position),t=position-index,u=1-t;\n const start=index?outline.curves[index-1].slice(4) as Point:outline.start,c=outline.curves[index];\n return [u**3*start[0]+3*u*u*t*c[0]+3*u*t*t*c[2]+t**3*c[4],u**3*start[1]+3*u*u*t*c[1]+3*u*t*t*c[3]+t**3*c[5]];\n}\nfunction polarCurve(shape:CreatorShape,amount:number,start:number,end:number,closed:boolean){\n const point=(angle:number):Point=>{const [x,y]=outlinedPoint(shape,angle),direction=OUTLINES[shape]?Math.atan2(y,x):angle,edge=amount*Math.max(0,Math.cos(direction-.3))**2;return [x-edge*Math.cos(direction),y-.45*edge*Math.sin(direction)]};\n const derivative=(angle:number):Point=>{const a=point(angle-.001),b=point(angle+.001);return [(b[0]-a[0])/.002,(b[1]-a[1])/.002]};\n const count=Math.ceil((end-start)*12),step=(end-start)/count,result=new Curve().move(...point(start));\n for(let i=0;i<count;i++){const angle=start+i*step,a=point(angle),b=point(angle+step),da=derivative(angle),db=derivative(angle+step);result.cubic([a[0]+da[0]*step/3,a[1]+da[1]*step/3,b[0]-db[0]*step/3,b[1]-db[1]*step/3,...b])}\n return closed?result.close():result;\n}\ntype Paper = {front:Curve;back:Curve;crease:Curve;scaleX:number;gazeX:number;gazeY:number;faceX:number;faceY:number};\nfunction paperGeometry(shape:CreatorShape,fold:number,look:Point):Paper{\n let front:Curve,back:Curve,crease:Curve;\n if(OUTLINES[shape]||shape==='flower'||shape==='star'){\n  const cut=8+.16*15-.35*fold;\n  front=polarCurve(shape,cut,-Math.PI/2,1.5*Math.PI,true);back=polarCurve(shape,0,-Math.PI/2,1.5*Math.PI,true);crease=polarCurve(shape,cut,-.65,1.3,false);\n }else if(shape==='pocket'){\n  const edge=48-.6*(-10.5)+.65*fold;\n  front=fromCubics([-56,-68],[[-12,-73,38,-73,61,-64],[79,-57,83,-31,78,0],[75,24,edge-2,31,edge,48],[edge+2,64,12,70,-40,68],[-69,67,-81,53,-81,25],[-83,-3,-84,-39,-75,-56],[-71,-64,-64,-67,-56,-68]]);\n  back=fromCubics([-56,-68],[[-12,-73,38,-73,61,-64],[84,-56,87,-32,86,1],[85,36,84+.3*fold,61,63,73],[41,85,-12,80,-43,76],[-75,72,-83,52,-83,23],[-85,-7,-84,-42,-75,-56],[-71,-64,-64,-67,-56,-68]]);\n  crease=fromCubics([78,0],[[75,24,edge-2,31,edge,48],[edge+2,64,12,70,-40,68]],false);\n }else if(shape==='petal'){\n  const edge=45-.65*(-10.5)+.7*fold;\n  front=fromCubics([10,-86],[[33,-91,68,-51,73,-20],[80,11,edge-5,27,edge,47],[edge+3,66,18,78,-15,78],[-54,78,-78,52,-77,17],[-76,-19,-38,-74,10,-86]]);\n  back=fromCubics([10,-86],[[35,-92,71,-55,82,-19],[94,18,81+.3*fold,61,51,79],[25,95,-15,90,-42,72],[-69,54,-81,28,-77,6],[-74,-27,-36,-75,10,-86]]);\n  crease=fromCubics([73,-20],[[80,11,edge-5,27,edge,47],[edge+3,66,18,78,-15,78]],false);\n }else{\n  const edge=49-(-10.5)+fold;\n  front=fromCubics([-65,-61],[[-43,-84,16,-85,55,-73],[80,-65,86,-41,77,-13],[69,12,edge-6,18,edge+1,43],[edge+7,66,27,79,-9,77],[-56,76,-79,53,-83,15],[-87,-19,-83,-42,-65,-61]]);\n  back=fromCubics([-65,-61],[[-43,-84,16,-85,55,-73],[89,-62,96,-29,80,8],[67,39,98+fold,49,73,72],[48,94,-11,88,-43,68],[-78,51,-86,12,-83,-15],[-85,-37,-77,-51,-65,-61]]);\n  crease=fromCubics([77,-13],[[69,12,edge-6,18,edge+1,43],[edge+7,66,27,79,-9,77]],false);\n }\n const petalUp=shape==='petal'?Math.min(1,Math.max(0,-look[1])/.3):0;\n return {front,back,crease,scaleX:shape==='slender'?.86:1,\n  gazeX:shape==='diamond'?.65:OUTLINES[shape]?1.45:shape==='star'?1.5:1.85-.55*petalUp,\n  gazeY:shape==='diamond'?.65:shape==='heart'?.95:shape==='cloud'?.8:OUTLINES[shape]?1.4:shape==='star'?1.05:1.9-.35*petalUp,\n  faceX:(shape==='diamond'?0:shape==='petal'?-4:OUTLINES[shape]||shape==='star'||shape==='flower'?-6:-12)-28*Math.max(0,look[0]-.23),faceY:shape==='cloud'?8:shape==='star'?2:-4};\n}\n/** Match angular landmarks before morphing between unrelated paper silhouettes. */\nfunction radialSamples(contour:Point[],count=160):Point[]{return Array.from({length:count},(_,index)=>{\n const angle=-Math.PI/2+index/count*TAU,dx=Math.cos(angle),dy=Math.sin(angle);let distance=0;\n for(let i=0;i<contour.length;i++){const a=contour[i],b=contour[(i+1)%contour.length],sx=b[0]-a[0],sy=b[1]-a[1],cross=dx*sy-dy*sx;if(Math.abs(cross)<1e-9)continue;const ray=(a[0]*sy-a[1]*sx)/cross,edge=(a[0]*dy-a[1]*dx)/cross;if(ray>=0&&edge>=-1e-7&&edge<=1+1e-7)distance=Math.max(distance,ray)}return [dx*distance,dy*distance];\n})}\nfunction openSamples(contour:Point[],count=48):Point[]{return Array.from({length:count},(_,i)=>{const position=i/(count-1)*(contour.length-1),index=Math.floor(position);return mixPoint(contour[index],contour[Math.min(index+1,contour.length-1)],position-index)})}\nfunction smoothCurve(points:Point[],closed:boolean){const result=new Curve().move(...points[0]);const at=(i:number)=>points[closed?(i+points.length)%points.length:clamp(i,0,points.length-1)];for(let i=0;i<points.length-(closed?0:1);i++){const p0=at(i-1),p1=at(i),p2=at(i+1),p3=at(i+2);result.cubic([p1[0]+(p2[0]-p0[0])/6,p1[1]+(p2[1]-p0[1])/6,p2[0]-(p3[0]-p1[0])/6,p2[1]-(p3[1]-p1[1])/6,...p2])}result.points=points;result.sampled=true;return closed?result.close():result}\nfunction blendPaper(a:Paper,b:Paper,progress:number):Paper{\n const t=smoother(progress),curve=(key:'front'|'back'|'crease')=>{const sampler=key==='crease'?openSamples:radialSamples,old=a[key].sampled?a[key].points:sampler(a[key].points),next=b[key].sampled?b[key].points:sampler(b[key].points);return smoothCurve(old.map((point,i)=>mixPoint(point,next[i],t)),key!=='crease')};\n return {front:curve('front'),back:curve('back'),crease:curve('crease'),...Object.fromEntries((['scaleX','gazeX','gazeY','faceX','faceY']as const).map(key=>[key,mix(a[key],b[key],t)]))}as Paper;\n}\nfunction hexHsl(color:string):[number,number,number]{\n const measured:Record<string,[number,number,number]>={'#f8b193':[18,76,76],'#8eb0f6':[220,85,76],'#a4dfe0':[181,49,76],'#b194f0':[259,75,76],'#ef95cf':[321,74,76],'#f29292':[0,78,76],'#f8c48b':[31,89,76],'#92ddf2':[193,78,76],'#d3ee96':[78,72,76],'#a3e1bd':[145,51,76]};\n if(measured[color.toLowerCase()])return measured[color.toLowerCase()];\n const match=/^#([0-9a-f]{6})$/i.exec(color);if(!match)return [18,76,76];const [r,g,b]=[0,2,4].map(i=>parseInt(match[1].slice(i,i+2),16)/255),high=Math.max(r,g,b),low=Math.min(r,g,b),delta=high-low,light=(high+low)/2;\n const hue=!delta?0:high===r?((g-b)/delta+(g<b?6:0))*60:high===g?((b-r)/delta+2)*60:((r-g)/delta+4)*60;\n return [hue,delta?delta/(1-Math.abs(2*light-1))*100:0,light*100];\n}\nlet grain:HTMLCanvasElement|undefined;\nfunction grainPattern(ctx:CanvasRenderingContext2D){if(!grain){grain=document.createElement('canvas');grain.width=grain.height=192;const g=grain.getContext('2d');if(g){const image=g.createImageData(192,192);let seed=713;for(let i=0;i<image.data.length;i+=4){seed=(Math.imul(seed,1664525)+1013904223)>>>0;image.data[i]=image.data[i+1]=image.data[i+2]=seed>>>24;image.data[i+3]=255}g.putImageData(image,0,0)}}return ctx.createPattern(grain,'repeat')}\nfunction projected(x:number,y:number,yaw:number,pitch:number):Point{\n const z=Math.sqrt(Math.max(1,86**2-x*x-y*y)),tiltedY=y*Math.cos(pitch)+z*Math.sin(pitch),depth=z*Math.cos(pitch)-y*Math.sin(pitch),side=x*Math.cos(yaw)+depth*Math.sin(yaw),perspective=274/(360-(depth*Math.cos(yaw)-x*Math.sin(yaw)));\n return [side*perspective,tiltedY*perspective];\n}\nfunction drawEyes(ctx:CanvasRenderingContext2D,pose:FacePose,look:Point,size:number,eyeSize=23,eyeGap=42,light=false){\n const small=clamp((64-size)/40),height=Math.min(36,eyeSize*(1+.35*small)),gap=eyeGap*(1+.14*small),tilt=pose.headTilt+look[0]*look[1]*.8;\n const project=(x:number,y:number)=>projected(x*Math.cos(tilt)-y*Math.sin(tilt),x*Math.sin(tilt)+y*Math.cos(tilt),...look);\n ctx.save();ctx.fillStyle=ctx.strokeStyle=light?'hsl(40,30%,98%)':'hsl(240,15%,8%)';ctx.lineCap='round';\n for(const side of [-1,1]){\n  const center=side*gap/2,visibility=clamp((Math.sqrt(Math.max(0,86**2-center*center))*Math.cos(look[0])*Math.cos(look[1])-center*Math.sin(look[0]))/12),open=side===-1?pose.leftOpen:pose.rightOpen,minimum=size<=48?90/size:1.2,halfHeight=Math.max(minimum,height*.96*open*pose.blink),halfWidth=height*pose.width,corner=Math.min(halfWidth,halfHeight),angle=side===-1?pose.leftAngle:pose.rightAngle;\n  ctx.globalAlpha=visibility;\n  const eyePoint=(x:number,y:number)=>project(center+x*Math.cos(angle)-y*Math.sin(angle),x*Math.sin(angle)+y*Math.cos(angle));\n  const roundness=Math.min(halfWidth,Math.max(minimum,.16*height));\n  const edge=(quadrant:number,a:number):[number,number,number,number]=>{const sign=quadrant===0||quadrant===3?1:-1;return [sign*(halfWidth-corner)+Math.cos(a)*corner,(quadrant<2?1:-1)*(halfHeight-corner)+Math.sin(a)*corner,sign*(halfWidth-roundness)+Math.cos(a)*roundness,Math.sin(a)*roundness]};\n  let first=true;const add=(v:number[])=>{const smilingY=v[3]-.6*halfHeight*(1-(v[2]/halfWidth)**2),p=eyePoint(mix(v[0],v[2],pose.smile),mix(v[1],smilingY,pose.smile));if(first){ctx.moveTo(...p);first=false}else ctx.lineTo(...p)};\n  ctx.beginPath();for(let quadrant=0;quadrant<4;quadrant++){for(let step=0;step<=10;step++)add(edge(quadrant,(quadrant+step/10)*Math.PI/2));const a=edge(quadrant,(quadrant+1)*Math.PI/2),b=edge((quadrant+1)%4,(quadrant+1)*Math.PI/2);for(let step=1;step<=8;step++)add(a.map((v,i)=>mix(v,b[i],step/8)))}ctx.closePath();ctx.fill();\n  if(pose.brow>.01){ctx.save();ctx.globalAlpha*=pose.brow;const browY=-.95*height-6-pose.browLift+side*pose.browAsymmetry*.5;ctx.lineWidth=Math.max(2.5,.2*height);ctx.beginPath();for(let i=0;i<=16;i++){const x=(i/16*2-1)*(halfWidth+1),p=project(center+x,browY-side*x*pose.browAngle-1.5*Math.sin(i/16*Math.PI));if(i)ctx.lineTo(...p);else ctx.moveTo(...p)}ctx.stroke();ctx.restore()}\n }\n ctx.restore();\n}\nexport function avatarGaze(pose:FacePose,size:number,point:Point):Point {\n const eye=Math.min(36,23*(1+.35*clamp((64-size)/40))),space=Math.max(.45,1-.018*Math.max(0,eye*Math.max(pose.leftOpen,pose.rightOpen)+pose.browLift-27)),strength=.68*.68*space;\n return [.68*point[0]*strength+pose.lookX/180,.62*point[1]*strength+pose.lookY/180];\n}\nexport type AvatarMorphState={shape?:string;last?:Paper;from?:Paper;started?:number};\nexport type AvatarFrameOptions={timestamp?:number;morphState?:AvatarMorphState;gazeAngles?:Point;shape?:string;expression?:string;color?:string;size?:number;time?:number;phase?:number;motion?:number;blink?:number;lookX?:number;lookY?:number;previousShape?:string;shapeProgress?:number;expressionPose?:FacePose;thumbnail?:boolean;expressionOnly?:boolean;grain?:number};\n/** Deterministic drawing entry point. Time is elapsed seconds; phase overrides the idle cycle in radians. */\nexport function renderAvatarFrame(ctx:CanvasRenderingContext2D,options:AvatarFrameOptions={}){\n const {color='#f8b193',size=162,time=0,motion=28,blink=1,lookX=0,lookY=0,thumbnail=false,expressionOnly=false}=options;\n const shape=(options.shape||'cloud')as CreatorShape,pose={...(options.expressionPose||expressionPose(options.expression||'thinking')),blink},phase=options.phase??time*TAU/8;\n ctx.setTransform(1,0,0,1,0,0);ctx.clearRect(0,0,ctx.canvas.width,ctx.canvas.height);ctx.save();\n if(expressionOnly){ctx.scale(ctx.canvas.width/34,ctx.canvas.height/34);ctx.translate(17,19);ctx.scale(.36,.36);drawEyes(ctx,pose,[0,0],200,24,36);ctx.restore();return}\n ctx.scale(ctx.canvas.width/200,ctx.canvas.height/200);ctx.translate(100+Math.sin(23*phase)*pose.tremble*motion/28,100+Math.sin(phase)*motion/28-Math.cos(2*phase)*pose.bounce*motion/12);ctx.rotate(Math.sin(phase)*motion/2400);const breathing=1+Math.sin(phase)*motion/4000;ctx.scale(breathing,breathing);\n const look:Point=options.gazeAngles??avatarGaze(pose,size,[lookX,lookY]);\n const fold=look[0]*6+(3*Math.sin(phase-.5)+4*pose.bounce+10*pose.headTilt)*motion/100;\n let paper=paperGeometry(shape,fold,look);\n const morph=options.morphState;if(morph){const now=options.timestamp??time*1000;if(morph.shape!==shape){morph.from=morph.last;morph.started=now;morph.shape=shape}const progress=(now-(morph.started??now))/480;if(morph.from&&progress<1)paper=blendPaper(morph.from,paper,progress);else morph.from=undefined;morph.last=paper}\n else if(options.previousShape&&options.previousShape!==shape&&(options.shapeProgress??1)<1)paper=blendPaper(paperGeometry(options.previousShape as CreatorShape,fold,look),paper,options.shapeProgress??0);\n const yaw=look[0]*1.4,pitch=look[1]*1.2,cross=Math.sin(yaw)*Math.sin(pitch),frontMatrix=new DOMMatrix([Math.cos(yaw),-.36*cross,.18*cross,Math.cos(pitch),22*Math.sin(yaw),17*Math.sin(pitch)]),backMatrix=new DOMMatrix([Math.cos(.7*yaw),-.14*cross,.08*cross,Math.cos(.7*pitch),-15*Math.sin(yaw),-10*Math.sin(pitch)]);\n const front=new Path2D(),back=new Path2D(),crease=new Path2D(),silhouette=new Path2D();front.addPath(paper.front.path,frontMatrix);back.addPath(paper.back.path,backMatrix);crease.addPath(paper.crease.path,frontMatrix);silhouette.addPath(front);silhouette.addPath(back);\n const [hue,saturation,lightness]=hexHsl(color);ctx.scale(paper.scaleX,1);ctx.rotate(-.06+.002*(3*Math.sin(phase-.5)+4*pose.bounce+10*pose.headTilt)*motion/100);\n ctx.fillStyle=`hsl(${hue+.4*14},${.85*saturation}%,${Math.max(0,lightness-28)}%)`;ctx.fill(silhouette);ctx.save();ctx.clip(silhouette);ctx.fillStyle=`hsl(${hue},${saturation}%,${lightness}%)`;ctx.fill(front);ctx.restore();\n if(size>48){ctx.save();ctx.clip(silhouette);ctx.strokeStyle=`hsla(${hue},${.65*saturation}%,27%,.18)`;ctx.lineWidth=1.2;ctx.stroke(crease);ctx.restore()}\n const texture=options.grain??18;if(texture>0){ctx.save();ctx.clip(silhouette);ctx.scale(200/size,200/size);ctx.globalCompositeOperation='soft-light';ctx.globalAlpha=texture/100;const pattern=grainPattern(ctx);if(pattern){ctx.fillStyle=pattern;ctx.fillRect(-size,-size,2*size,2*size)}ctx.restore()}\n if(!thumbnail){ctx.save();ctx.clip(front);ctx.transform(frontMatrix.a,frontMatrix.b,frontMatrix.c,frontMatrix.d,frontMatrix.e,frontMatrix.f);ctx.translate(paper.faceX,paper.faceY);const faceLook:Point=[.62*Math.tanh(look[0]*paper.gazeX/.62),.62*Math.tanh(look[1]*paper.gazeY/.62)];drawEyes(ctx,pose,faceLook,size,23,42,lightness<35);ctx.restore()}\n ctx.restore();\n}\n",
  "src/date-range.css": ".hd-date-range,\n.hd-meeting {\n  color: var(--hu-text);\n  font: 14px/20px var(--hu-font);\n  width: 100%;\n  min-width: 0;\n}\n.hd-date-range *,\n.hd-meeting * {\n  box-sizing: border-box;\n}\n.hd-date-range h3,\n.hd-meeting h3 {\n  font-size: 16px;\n  font-weight: 600;\n  margin: 0 0 12px;\n}\n.hd-range-surface {\n  display: flex;\n  border: 1px solid var(--hu-line);\n  border-radius: 12px;\n  background: var(--hu-bg);\n  overflow: hidden;\n  min-width: 0;\n}\n.hd-range-surface aside {\n  display: flex;\n  flex-direction: column;\n  gap: 4px;\n  padding: 16px 10px;\n  min-width: 130px;\n  border-inline-end: 1px solid var(--hu-line);\n}\n.hd-range-surface aside button {\n  justify-content: flex-start;\n}\n.hd-range-body {\n  padding: 18px;\n  min-width: 0;\n  flex: 1;\n}\n.hd-range-calendar header {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 10px;\n  margin-bottom: 16px;\n}\n.hd-range-calendar header h2 {\n  font-size: 14px;\n  font-weight: 600;\n  text-align: center;\n}\n.hd-range-calendar header button {\n  background: var(--hu-bg);\n  border: 1px solid var(--hu-line);\n  border-radius: 6px;\n  width: 28px;\n  height: 28px;\n  color: var(--hu-text);\n  cursor: pointer;\n}\n.hd-range-months {\n  display: flex;\n  gap: 20px;\n}\n.hd-range-months table {\n  border-collapse: collapse;\n  width: 100%;\n  min-width: 0;\n  font-size: 12px;\n  text-align: center;\n}\n.hd-range-months th {\n  font-size: 11px;\n  font-weight: 500;\n  color: var(--hu-muted);\n  padding-bottom: 10px;\n}\n.hd-range-months td {\n  padding: 2px 0;\n}\n.hd-range-months .react-aria-CalendarCell {\n  height: 30px;\n  min-width: 25px;\n  display: grid;\n  place-items: center;\n  cursor: pointer;\n  border-radius: 0;\n  outline: none;\n}\n.hd-range-months [data-selected] {\n  background: color-mix(in srgb, var(--hu-brand) 18%, var(--hu-bg));\n  color: var(--hu-text);\n}\n.hd-range-months [data-selection-start],\n.hd-range-months [data-selection-end] {\n  background: var(--hu-brand);\n  color: var(--hu-on-brand);\n  border-radius: 50%;\n}\n.hd-range-months [data-outside-month] {\n  color: var(--hu-muted);\n  opacity: 0.55;\n}\n.hd-range-months [data-disabled] {\n  opacity: 0.35;\n  cursor: default;\n}\n.hd-range-months [data-focus-visible],\n.hd-range-calendar header button:focus-visible {\n  outline: 2px solid var(--hu-brand-text);\n  outline-offset: 2px;\n}\n.hd-range-footer {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 10px;\n  align-items: flex-end;\n  border-top: 1px solid var(--hu-line);\n  padding-top: 16px;\n  margin-top: 16px;\n}\n.hd-range-footer .hu-field {\n  width: 140px;\n  flex: 1;\n  min-width: 110px;\n}\n.hd-range-footer input {\n  min-width: 0;\n  width: 100%;\n}\n.hd-range-error {\n  color: var(--hu-error);\n  margin-top: 12px;\n}\n.hd-meeting {\n  padding: 20px;\n  border: 1px solid var(--hu-line);\n  border-radius: 12px;\n  background: var(--hu-bg);\n}\n.hd-meeting > p {\n  color: var(--hu-muted);\n  margin-bottom: 18px;\n}\n.hd-meeting-fields {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 16px;\n  margin-bottom: 20px;\n}\n.hd-meeting-fields > .hu-field {\n  min-width: 180px;\n  flex: 1;\n}\n.hd-time-slots {\n  display: grid;\n  grid-template-columns: repeat(4, minmax(0, 1fr));\n  gap: 10px;\n  margin-bottom: 20px;\n}\n.hd-time-slots button {\n  min-width: 0;\n  font-size: 12px;\n  padding-inline: 6px;\n}\n@media (max-width: 600px) {\n  .hd-range-surface {\n    flex-direction: column;\n  }\n  .hd-range-surface aside {\n    flex-direction: row;\n    flex-wrap: wrap;\n    border-inline-end: 0;\n    border-bottom: 1px solid var(--hu-line);\n    min-width: 0;\n    padding: 10px;\n  }\n  .hd-range-body {\n    padding: 14px;\n  }\n  .hd-range-months {\n    gap: 12px;\n  }\n  .hd-time-slots {\n    grid-template-columns: repeat(3, minmax(0, 1fr));\n  }\n}\n.hd-date-range {\n  background: var(--hu-bg);\n  border-radius: 12px;\n}\n.hd-date-range > .hu-example-heading {\n  flex-wrap: wrap;\n  gap: 12px;\n}\n.hd-date-range > .hu-example-heading .hu-button {\n  max-width: 100%;\n  white-space: normal;\n}\n.hd-date-range,\n.hd-meeting {\n  box-sizing: border-box;\n}\n.hd-calendar-pending {\n  min-height: 250px;\n  display: grid;\n  place-items: center;\n  color: var(--hu-muted);\n}\n.hd-range-popover {\n  max-width: calc(100vw - 24px);\n  width: min(800px, calc(100vw - 24px));\n  z-index: 120;\n  transform-origin: var(--trigger-anchor-point);\n  box-shadow: 0 12px 36px #0002;\n  border-radius: 12px;\n}\n.hd-range-dialog {\n  outline: 0;\n}\n.hd-range-popover[data-entering] {\n  animation: hd-panel-in 0.15s ease-out;\n}\n.hd-range-popover[data-exiting] {\n  animation: hd-panel-out 0.15s ease-in;\n}\n.hd-day-count {\n  font-size: 11px;\n  color: var(--hu-muted);\n  white-space: nowrap;\n}\n.hd-range-surface aside button[aria-pressed='true'] {\n  background: var(--hu-bg-secondary);\n  color: var(--hu-brand-text);\n}\n.hd-range-trigger {\n  gap: 12px;\n}\n.hd-meeting-disclosure {\n  width: 100%;\n  min-width: 0;\n}\n.hd-meeting {\n  margin-top: 16px;\n  display: grid;\n  grid-template-columns: minmax(150px, 0.85fr) minmax(240px, 1.2fr) minmax(170px, 0.9fr);\n  gap: 20px;\n  align-items: start;\n  animation: hd-panel-in 0.15s ease-out;\n}\n.hd-meeting-host p {\n  font-size: 12px;\n  line-height: 20px;\n  color: var(--hu-muted);\n}\n.hd-host-avatar {\n  display: grid;\n  place-items: center;\n  width: 38px;\n  height: 38px;\n  border-radius: 50%;\n  background: var(--hu-bg-secondary);\n  color: var(--hu-brand-text);\n}\n.hd-meeting-calendar {\n  min-width: 0;\n}\n.hd-meeting-times {\n  display: grid;\n  gap: 14px;\n  min-width: 0;\n}\n.hd-time-slots {\n  display: grid;\n  grid-template-columns: 1fr;\n  max-height: 240px;\n  overflow: auto;\n  margin: 0;\n  padding: 2px 5px 2px 2px;\n}\n.hd-meeting-status {\n  grid-column: 1/-1;\n}\n.hd-meeting-times > .hu-button {\n  white-space: normal;\n}\n.hd-meeting-host h3 {\n  font-size: 16px;\n}\n.hd-range-calendar [data-disabled] {\n  cursor: not-allowed;\n}\n@keyframes hd-panel-in {\n  from {\n    opacity: 0;\n    transform: scale(0.95);\n    filter: blur(2px);\n  }\n  to {\n    opacity: 1;\n    transform: scale(1);\n    filter: blur(0);\n  }\n}\n@keyframes hd-panel-out {\n  to {\n    opacity: 0;\n    transform: scale(0.95);\n    filter: blur(2px);\n  }\n}\n@media (max-width: 1000px) {\n  .hd-meeting {\n    grid-template-columns: minmax(220px, 1fr) minmax(170px, 0.8fr);\n  }\n  .hd-meeting-host {\n    grid-column: 1/-1;\n  }\n  .hd-meeting-host p {\n    margin: 6px 0;\n  }\n  .hd-meeting-host h3 {\n    margin: 6px 0;\n  }\n}\n@media (max-width: 600px) {\n  .hd-meeting {\n    grid-template-columns: 1fr;\n    padding: 14px;\n  }\n  .hd-meeting-times .hd-time-slots {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n    max-height: 200px;\n  }\n  .hd-range-popover {\n    width: calc(100vw - 24px);\n  }\n  .hd-range-footer .hd-day-count {\n    width: 100%;\n  }\n  .hd-range-months .react-aria-CalendarCell {\n    min-width: 24px;\n  }\n}\n@media (prefers-reduced-motion: reduce) {\n  .hd-range-popover,\n  .hd-meeting {\n    animation: none !important;\n    transition: none !important;\n  }\n}\n\n/* Exact audited range fills and endpoint roles; endpoints retain readable primary text. */\n.hd-range-surface,\n.hd-range-calendar header button,\n.hd-meeting {\n  background: var(--color-background-primary-default);\n  border-color: var(--color-border-button-default);\n  color: var(--color-text-primary);\n}\n.hd-range-surface aside,\n.hd-range-footer {\n  border-color: var(--color-border-button-default);\n}\n.hd-range-months [data-selected] {\n  background: var(--color-date-range-background);\n  color: var(--color-text-primary);\n}\n.hd-range-months [data-selection-start],\n.hd-range-months [data-selection-end] {\n  background: var(--color-date-range-edge-background);\n  color: var(--color-text-primary);\n}\n.hd-range-months [data-outside-month] {\n  color: var(--color-text-secondary);\n  opacity: 1;\n}\n.hd-range-months [data-disabled] {\n  opacity: 0.35;\n}\n.hd-range-surface aside button[aria-pressed='true'] {\n  background: var(--color-pill-tab-blue-selected-background);\n  color: var(--color-text-primary);\n}\n.hd-host-avatar {\n  background: var(--color-avatar-neutral-background);\n  color: var(--color-neutral-600);\n}\n.dark .hd-host-avatar {\n  color: var(--color-neutral-300);\n}\n.hd-range-months [data-focus-visible],\n.hd-range-calendar header button:focus-visible {\n  outline-color: var(--color-accent-500);\n}\n.hd-host-avatar,\n.dark .hd-host-avatar {\n  color: var(--hu-compact-muted);\n}\n.hd-host-avatar,\n.dark .hd-host-avatar {\n  color: var(--hu-popup-muted);\n}\n.hd-range-inputs input, .hd-meeting input[type='date'], .hd-time-slots button { direction: ltr; unicode-bidi: isolate; }\n",
  "src/example-code.ts": "import { registry, teamOptions } from './registry.js';\nimport { isExtendedKind } from './extended-registry.js';\nimport type { Kind, Config } from './registry.js';\nconst quote = (value: unknown) => JSON.stringify(value);\nexport const isComposed = (kind: Kind) =>\n  ['modals', 'tables', 'charts', 'messaging', 'settings-form'].includes(kind);\nexport function exampleFor(kind: Kind, c: Config) {\n  if(kind==='template-multi-agent-chat'){\n    const state=['default','disabled'].includes(c.state)?'ready':c.state;\n    return `'use client';\\nimport {useState} from 'react';\\nimport {MultiAgentChatTemplate} from '@helios-ui/react';\\nimport '@helios-ui/react/styles.css';\\nexport default function Example(){const [state,setState]=useState<'ready'|'loading'|'empty'|'error'>(${JSON.stringify(state)});return <MultiAgentChatTemplate initialGroup initialEditorOpen={false} state={state} onRetry={()=>setState('ready')}/>;}\\n`;\n  }\n  if (kind === 'template-calendar') {\n    const state = ['default','disabled'].includes(c.state) ? 'ready' : c.state;\n    return `'use client';\\nimport {useState} from 'react';\\nimport {CalendarTemplate} from '@helios-ui/react';\\nimport '@helios-ui/react/styles.css';\\nexport default function Example(){const [state,setState]=useState<'ready'|'loading'|'empty'|'error'>(${JSON.stringify(state)});return <CalendarTemplate chrome={false} state={state} onRetry={()=>setState('ready')}/>;}\\n`;\n  }\n  if (isExtendedKind(kind)) {\n    const state = c.state === 'default' || c.state === 'disabled' ? 'ready' : c.state;\n    const chart = registry[kind].group === 'Charts';\n    const agent = registry[kind].file === 'src/AgentPatterns.tsx';\n    const component = chart ? 'ModernChart' : agent ? 'AgentPattern' : 'FamilyPreview';\n    return `'use client';\\nimport {useState} from 'react';\\nimport {${component}} from '@helios-ui/react';\\nimport '@helios-ui/react/styles.css';\\nexport default function Example(){const [state,setState]=useState<'ready'|'loading'|'empty'|'error'>(${JSON.stringify(state)});return <${component} id=${JSON.stringify(kind)}${agent ? ' {...'+JSON.stringify(c.options)+'}' : ''} state={state} onRetry={()=>setState('ready')} disabled={${c.state === 'disabled'}}${chart ? ' shape=' + quote(c.shape) + ' variant=' + quote(c.variant) + ' mono={' + c.mono + '} limit={' + c.limit + '} bubble={' + c.bubble + '}' : ' size=' + quote(['sm','md','lg'].includes(c.size) ? c.size : 'md')}/>;}\\n`;\n  }\n  const name = registry[kind].exportName,\n    ready = ['default', 'ready'].includes(c.state),\n    state = ready ? 'ready' : c.state;\n  const icons = `${['leading', 'both', 'only'].includes(c.icon) ? ' leadingIcon={<UIIcon name=\"star\" />}' : ''}${['trailing', 'both'].includes(c.icon) ? ' trailingIcon={<UIIcon name=\"star\" />}' : ''}`;\n  const extras = `${c.state === 'disabled' ? ' disabled' : ''}${c.state === 'error' ? ' error=\"Please check this value.\"' : ''}`;\n  let imports: string = name,\n    body = '',\n    setup = '';\n  if (kind === 'buttons') {\n    setup = \"const [status, setStatus] = useState('');\";\n    body = `<><div style={{display:\"flex\",flexWrap:\"wrap\",alignItems:\"center\",justifyContent:\"center\",gap:12}}><Button size=${quote(c.size)} variant=${quote(c.variant)}${c.state === 'loading' ? ' loading' : ''}${extras}${icons}${c.icon === 'only' ? ' iconOnly aria-label={' + quote(c.label) + '}' : ''} onClick={() => setStatus('Action handled by the React export.')}>{${quote(c.label)}}</Button><Button variant=\"secondary\" trailingIcon={<UIIcon name=\"arrow-right\" />} onClick={() => setStatus('Continue action handled locally.')}>Continue</Button><Button variant=\"ghost\" onClick={() => setStatus('Marked as done locally.')}>Mark as done</Button><Button variant=\"danger\" onClick={() => setStatus('Delete action previewed locally.')}>Delete</Button></div>{status && <p role=\"status\">{status}</p>}</>`;\n  } else if (kind === 'inputs') {\n    setup = `const [value, setValue] = useState(${quote(c.value)});`;\n    body = `<Input label={${quote(c.label)}} size=${quote(c.size)} value={value} onChange={event => setValue(event.target.value)} placeholder=\"name@example.com\" hint=\"Your email stays in this local example.\"${extras}${c.icon !== 'none' ? ' leadingIcon={<UIIcon name=\"star\" />}' : ''} />`;\n  } else if (kind === 'select') {\n    setup = `const [value, setValue] = useState(${quote(['placeholder', 'loading'].includes(c.state) ? '' : c.value)});`;\n    body = `<RichSelect label={${quote(c.label)}} size=${quote(c.size)} value={value} onValueChange={setValue} options={${quote(teamOptions)}} placeholder=\"Choose a team member\" hint=\"Use keyboard arrows or type to select.\"${extras}${c.state === 'loading' ? ' loading' : ''}${c.icon !== 'none' ? ' leadingIcon={<UIIcon name=\"star\" />}' : ''} />`;\n  } else if (kind === 'checkboxes') {\n    setup = `const [checked, setChecked] = useState(${c.checked});`;\n    body = `<Checkbox label={${quote(c.label)}} size=${quote(c.size === 'md' ? 'md' : 'sm')} checked={checked} onChange={event => setChecked(event.target.checked)}${c.state === 'indeterminate' ? ' indeterminate' : ''}${extras}/>`;\n  } else if (kind === 'tabs') {\n    setup = `const [value, setValue] = useState(${quote(c.value || 'overview')});`;\n    body =\n      '<Tabs label=\"Example sections\" value={value} onValueChange={setValue} items={[{id:\"overview\",label:\"Overview\",content:\"Overview content\"},{id:\"activity\",label:\"Activity\",content:\"Activity content\"},{id:\"settings\",label:\"Settings\",content:\"Settings content\",disabled:' +\n      String(c.state === 'disabled') +\n      '}]} />';\n  } else {\n    imports = kind === 'tables' ? 'TableExample' : kind === 'modals' ? 'DialogExample' : name;\n    setup = `const [state, setState] = useState<'ready' | 'loading' | 'empty' | 'error'>(${quote(state)});`;\n    body = `<${imports} state={state} onRetry={() => setState('ready')}${kind === 'tables' ? ' density=' + quote(c.density) : ''}${kind === 'modals' ? ' destructive={' + c.destructive + '}' : ''}/>`;\n  }\n  if (kind === 'buttons' || (c.icon !== 'none' && ['inputs','select'].includes(kind))) imports += ', UIIcon';\n  return `'use client';\\nimport { useState } from 'react';\\nimport { ${imports} } from '@helios-ui/react';\\nimport '@helios-ui/react/styles.css';\\n\\nexport default function Example() {\\n  ${setup}\\n  return (\\n    ${body}\\n  );\\n}\\n`;\n}\n",
  "src/extended-registry.ts": "import {templateDescriptions,templateDocNames} from './template-descriptions.js';\nimport families from './family-catalog.json';\nimport type { ComponentSpec } from './registry.js';\nconst base: Record<string, string> = {\n  avatars: 'AvatarGroup',\n  badges: 'Badge',\n  'button-groups': 'ButtonGroup',\n  dropdowns: 'DropdownMenu',\n  'progress-indicators': 'ProgressIndicator',\n  'radio-groups': 'RadioGroup',\n  sliders: 'Slider',\n  tags: 'TagsInput',\n  'text-editors': 'TextEditor',\n  'video-players': 'VideoPlayer',\n  toggles: 'Toggle',\n  tooltips: 'Tooltip',\n};\nconst application: Record<string, string> = {\n  'activity-feeds': 'ActivityFeed',\n  'alerts-and-notifications': 'Notification',\n  'application-navigation': 'ApplicationNavigation',\n  breadcrumbs: 'Breadcrumbs',\n  calendars: 'Calendar',\n  'card-headers': 'CardHeader',\n  'code-snippets': 'CodeSnippet',\n  'color-pickers': 'ColorPicker',\n  'command-menus': 'CommandMenu',\n  'content-dividers': 'ContentDivider',\n  'date-pickers': 'DateRangePicker',\n  'empty-states': 'EmptyState',\n  'file-upload': 'FileUpload',\n  filters: 'Filters',\n  'inline-ctas': 'InlineCTA',\n  'loading-indicators': 'LoadingIndicator',\n  metrics: 'Metrics',\n  'page-headers': 'PageHeader',\n  pagination: 'Pagination',\n  'progress-steps': 'ProgressSteps',\n  'section-footers': 'SectionFooter',\n  'section-headers': 'SectionHeader',\n  'slideout-menus': 'SlideoutMenu',\n  'tree-views': 'TreeView',\n};\nconst extras: Record<string, string> = {\n  announcement: 'Announcement',\n  carousel: 'Carousel',\n  'input-otp': 'InputOTP',\n  'social-button': 'SocialButton',\n  textarea: 'Textarea',\n  'close-button': 'CloseButton',\n  'icon-button': 'IconButton',\n  'link-button': 'LinkButton',\n  'theme-toggle': 'ThemeToggle',\n  'data-grid': 'DataGrid',\n  'settings-modal': 'SettingsModal',\n  sidebar: 'Sidebar',\n  'stat-cards': 'StatCards',\n};\nconst agents: Record<string, string> = {\n  'agent-creator': 'AgentCreator',\n  'agent-limits-card': 'AgentLimitsCard',\n  'agent-progress': 'AgentProgress',\n  'agent-thinking': 'AgentThinking',\n  'auth-card': 'AuthCard',\n  composer: 'Composer',\n  'composer-attachments': 'ComposerAttachments',\n  'composer-loader': 'ComposerLoader',\n  'composer-panel': 'ComposerPanel',\n  'notification-center': 'NotificationCenter',\n  questionnaire: 'Questionnaire',\n  'task-list': 'TaskList',\n  'web-search': 'WebSearch',\n  'multi-agent-chat': 'MultiAgentChat',\n};\nconst charts = [\n  'activity-rings-card',\n  'area-chart-card',\n  'bar-list-card',\n  'combo-chart-card',\n  'contributions-card',\n  'earnings-chart-card',\n  'funnel-chart-card',\n  'heatmap-chart-card',\n  'line-chart-card',\n  'most-active-days-card',\n  'orders-chart-card',\n  'radar-chart-card',\n  'radial-chart-card',\n  'revenue-chart-card',\n  'sankey-chart-card',\n  'scatter-chart-card',\n  'sleep-score-card',\n  'stage-bars-card',\n  'steps-card',\n];\nconst templateIds = [\n  'chat-starter',\n  'hr',\n  'multi-agent-chat',\n  'ai-chat',\n  'ai-image-generation',\n  'ai-profile',\n  'calendar',\n  'dashboard',\n  'finance',\n  'marketing',\n  'medical-profile',\n  'project-board',\n];\nconst title = (id: string) =>\n  id\n    .replace(/-card$/, '')\n    .split('-')\n    .map((x) => x[0].toUpperCase() + x.slice(1))\n    .join(' ');\nconst common = {\n  state: 'ready | loading | empty | error',\n  onRetry: '() => void; recovers to ready',\n  disabled: 'boolean; disables interactions',\n  size: 'sm | md | lg',\n};\nexport const extendedRegistry: Record<string, ComponentSpec> = {};\nfor (const group of families)\n  for (const [name, node] of group.items) {\n    const id = name\n      .toLowerCase()\n      .replace(/[^a-z0-9]+/g, '-')\n      .replace(/^-|-$/g, '');\n    if (base[id] || application[id])\n      extendedRegistry[id] = {\n        name,\n        exportName: base[id] || application[id],\n        node: node.replace('-', ':'),\n        group: group.name,\n        file: base[id] ? 'src/BaseFamilies.tsx' : id === 'date-pickers' ? 'src/DateRangeExamples.tsx' : 'src/ApplicationFamilies.tsx',\n        props: { ...common },\n        previewExport: 'FamilyPreview',\n      };\n  }\nfor (const [ids, file, group] of [\n  [extras, 'src/BoardExtras.tsx', 'Additional components'],\n  [agents, 'src/AgentPatterns.tsx', 'Agent components'],\n] as const)\n  for (const [id, exportName] of Object.entries(ids))\n    extendedRegistry[id] = {\n      name: title(id),\n      exportName,\n      group,\n      file,\n      props: { ...common },\n      previewExport: 'FamilyPreview',\n      reference: 'https://www.boardui.com/components/' + id,\n      description:\n        'Helios adaptation of the publicly observed BoardUI interaction pattern. Local fixture data.',\n    };\nfor (const id of charts)\n  extendedRegistry[id] = {\n    name: title(id),\n    exportName: 'ModernChart',\n    group: 'Charts',\n    file: 'src/ChartFamilies.tsx',\n    props: {\n      ...common,\n      id: 'ChartKind',\n      data: 'ChartDatum[]; name, value, previous?, secondary? (rate %), series? ({name,value}[]), z?, group?, color?, icon?, goal?, unit?, x?, source?, target?',\n      unit: 'currency | count | percent; optional override',\n      title: 'string',\n      shape: 'curved | sharp; line interpolation',\n      variant: 'default | comparison | speedometer | overlap | percent | dots | lines | score | labels | grid | gauge | solid | stacked; see chartVariantOptions for supported variants per chart',\n      mono:'boolean; neutral single-color rendering',\n      limit:'number; initially visible bar-list rows, default 4',\n      bubble:'boolean; optional scatter z-coordinate sizing',\n      axisLabels:'[string,string]; optional x/y scatter axis captions',\n      compact: 'boolean; compact card chrome',\n    },\n    previewExport: 'FamilyPreview',\n    reference: 'https://www.boardui.com/components/' + id,\n  };\nfor (const id of templateIds)\n  extendedRegistry['template-' + id] = {\n    name: templateDocNames[id] || title(id) + ' template',\n    description: templateDescriptions[id],\n    exportName: 'BoardTemplate',\n    group: 'Template patterns',\n    file: 'src/BoardTemplates.tsx',\n    props: { ...common, id: 'string; template identifier', chrome:'boolean; application sidebar and header, default true; calendar component preview uses false' },\n    previewExport: 'FamilyPreview',\n    reference: 'https://www.boardui.com/templates/' + id,\n  };\nexport const isExtendedKind = (id: string) => Object.hasOwn(extendedRegistry, id);\n",
  "src/family-catalog.json": "[\n  {\n    \"name\": \"Base components\",\n    \"items\": [\n      [\"Avatars\", \"92-2\"],\n      [\"Badges\", \"98-62\"],\n      [\"Button groups\", \"100-2\"],\n      [\"Buttons\", \"84-2\"],\n      [\"Checkboxes\", \"95-2\"],\n      [\"Dropdowns\", \"110-4\"],\n      [\"Inputs\", \"103-2\"],\n      [\"Progress indicators\", \"107-2\"],\n      [\"Radio groups\", \"110-3\"],\n      [\"Select\", \"110-2\"],\n      [\"Sliders\", \"107-5\"],\n      [\"Tags\", \"109-17938\"],\n      [\"Text editors\", \"110-5\"],\n      [\"Video players\", \"110-6\"],\n      [\"Toggles\", \"107-3\"],\n      [\"Tooltips\", \"107-4\"]\n    ]\n  },\n  {\n    \"name\": \"Application components\",\n    \"items\": [\n      [\"Activity feeds\", \"173-2\"],\n      [\"Alerts and notifications\", \"173-3\"],\n      [\"Application navigation\", \"173-4\"],\n      [\"Breadcrumbs\", \"173-5\"],\n      [\"Calendars\", \"173-6\"],\n      [\"Card headers\", \"173-7\"],\n      [\"Charts\", \"173-8\"],\n      [\"Code snippets\", \"173-9\"],\n      [\"Color pickers\", \"173-10\"],\n      [\"Content dividers\", \"173-12\"],\n      [\"Inline CTAs\", \"173-17\"],\n      [\"Messaging\", \"173-19\"],\n      [\"Section footers\", \"173-25\"],\n      [\"Section headers\", \"173-26\"],\n      [\"Command menus\", \"173-11\"],\n      [\"Date pickers\", \"173-13\"],\n      [\"Empty states\", \"173-14\"],\n      [\"File upload\", \"173-15\"],\n      [\"Filters\", \"173-16\"],\n      [\"Loading indicators\", \"173-18\"],\n      [\"Metrics\", \"173-20\"],\n      [\"Modals\", \"173-21\"],\n      [\"Page headers\", \"173-22\"],\n      [\"Pagination\", \"173-23\"],\n      [\"Progress steps\", \"173-24\"],\n      [\"Slideout menus\", \"173-27\"],\n      [\"Tables\", \"173-28\"],\n      [\"Tabs\", \"173-29\"],\n      [\"Tree views\", \"173-30\"]\n    ]\n  },\n  {\n    \"name\": \"Application examples\",\n    \"items\": [\n      [\"Dashboards 01\", \"321-3\"],\n      [\"Dashboards 02\", \"321-4\"],\n      [\"Informational pages\", \"321-5\"],\n      [\"Settings pages\", \"321-7\"],\n      [\"Informational pages 02\", \"321-6\"],\n      [\"Settings pages 02\", \"321-8\"]\n    ]\n  }\n]\n",
  "src/family-types.ts": "export type FamilyState = 'ready' | 'loading' | 'empty' | 'error';\nexport type FamilyProps = {state?:FamilyState;onRetry?:()=>void;disabled?:boolean;size?:'sm'|'md'|'lg'};\n",
  "src/icon-glyphs.json": "{\n  \"⌕\": \"search\",\n  \"⚙\": \"settings\",\n  \"⚠\": \"warning\",\n  \"✓\": \"tick\",\n  \"✔\": \"tick\",\n  \"✉\": \"mail\",\n  \"←\": \"arrow-left\",\n  \"→\": \"arrow-right\",\n  \"↑\": \"arrow-up\",\n  \"↓\": \"arrow-down\",\n  \"↗\": \"arrow-up-right\",\n  \"‹\": \"chevron-left\",\n  \"›\": \"chevron-right\",\n  \"⌄\": \"chevron-down\",\n  \"⌃\": \"chevron-up\",\n  \"▾\": \"chevron-down\",\n  \"▴\": \"chevron-up\",\n  \"×\": \"close\",\n  \"✕\": \"close\",\n  \"+\": \"plus\",\n  \"☆\": \"star\",\n  \"★\": \"star-filled\",\n  \"•••\": \"more\",\n  \"⋯\": \"more\",\n  \"…\": \"more\",\n  \"↶\": \"undo\",\n  \"↷\": \"redo\",\n  \"☰\": \"menu\",\n  \"≡\": \"align-left\",\n  \"◧\": \"sidebar\",\n  \"▦\": \"calendar\",\n  \"♩\": \"microphone\",\n  \"✦\": \"sparkles\",\n  \"✧\": \"sparkles\",\n  \"▱\": \"file\",\n  \"▣\": \"grid\",\n  \"▶\": \"play\",\n  \"Ⅱ\": \"pause\",\n  \"↳\": \"branch\",\n  \"↻\": \"refresh\",\n  \"⏱\": \"clock\",\n  \"⊕\": \"plus\",\n  \"☷\": \"grid\",\n  \"▤\": \"file\",\n  \"◈\": \"grid\",\n  \"＋\": \"plus\",\n  \"−\": \"minus\",\n  \"☼\": \"sun\",\n  \"☾\": \"moon\",\n  \"◷\": \"clock\",\n  \"▷\": \"play\",\n  \"▲\": \"chevron-up\",\n  \"▼\": \"chevron-down\",\n  \"↩\": \"undo\",\n  \"↕\": \"sort\"\n}\n",
  "src/icons.tsx": "import type { ReactNode, SVGProps } from 'react';\nimport glyphAliases from './icon-glyphs.json';\nimport {\n  RiSearchLine,\n  RiHomeLine,\n  RiBarChartBoxLine,\n  RiStackLine,\n  RiCheckboxCircleLine,\n  RiPieChartLine,\n  RiGroupLine,\n  RiQuestionLine,\n  RiSettings3Line,\n  RiCalendarLine,\n  RiFilter3Line,\n  RiEditLine,\n  RiExternalLinkLine,\n  RiDownloadLine,\n  RiUploadCloud2Line,\n  RiAddLine,\n  RiDeleteBinLine,\n  RiMailLine,\n  RiMenuLine,\n  RiSunLine,\n  RiMoonLine,\n  RiGridLine,\n  RiFileTextLine,\n  RiTableLine,\n  RiStarLine,\n  RiMoreLine,\n  RiCloseLine,\n  RiMicLine,\n  RiAttachment2,\n  RiSideBarLine,\n  RiPauseLine,\n  RiPlayLine,\n  RiStopLine,\n  RiBold,\n  RiItalic,\n  RiUnderline,\n  RiArrowGoBackLine,\n  RiArrowGoForwardLine,\n  RiFileCopyLine,\n  RiLink,\n  RiNotification3Line,\n  RiTimeLine,\n  RiLogoutBoxRLine,\n  RiGlobalLine,\n  RiSparklingLine,\n  RiImageLine,\n  RiFolderLine,\n  RiCheckLine,\n  RiCheckboxBlankCircleLine,\n  RiErrorWarningLine,\n  RiInformationLine,\n  RiLockLine,\n  RiRefreshLine,\n  RiUserAddLine,\n  RiArrowLeftLine,\n  RiArrowRightLine,\n  RiArrowUpLine,\n  RiArrowDownLine,\n  RiArrowRightUpLine,\n  RiStarFill,\n  RiArrowLeftSLine,\n  RiArrowRightSLine,\n  RiArrowUpSLine,\n  RiArrowDownSLine,\n  RiAlignLeft,\n  RiAlignCenter,\n  RiAlignRight,\n  RiBankCardLine,\n  RiCornerDownRightLine,\n  RiSubtractLine,\n  RiListUnordered,\n  RiArrowUpDownLine\n} from '@remixicon/react';\n\nconst iconComponents = {\n  'sort': RiArrowUpDownLine,\n  'minus': RiSubtractLine,\n  'list': RiListUnordered,\n  'search': RiSearchLine,\n  'home': RiHomeLine,\n  'chart': RiBarChartBoxLine,\n  'layers': RiStackLine,\n  'check': RiCheckboxCircleLine,\n  'pie': RiPieChartLine,\n  'users': RiGroupLine,\n  'help': RiQuestionLine,\n  'settings': RiSettings3Line,\n  'calendar': RiCalendarLine,\n  'filter': RiFilter3Line,\n  'edit': RiEditLine,\n  'external': RiExternalLinkLine,\n  'download': RiDownloadLine,\n  'upload': RiUploadCloud2Line,\n  'plus': RiAddLine,\n  'trash': RiDeleteBinLine,\n  'mail': RiMailLine,\n  'menu': RiMenuLine,\n  'sun': RiSunLine,\n  'moon': RiMoonLine,\n  'grid': RiGridLine,\n  'file': RiFileTextLine,\n  'table': RiTableLine,\n  'star': RiStarLine,\n  'more': RiMoreLine,\n  'close': RiCloseLine,\n  'microphone': RiMicLine,\n  'attachment': RiAttachment2,\n  'sidebar': RiSideBarLine,\n  'pause': RiPauseLine,\n  'play': RiPlayLine,\n  'stop': RiStopLine,\n  'bold': RiBold,\n  'italic': RiItalic,\n  'underline': RiUnderline,\n  'undo': RiArrowGoBackLine,\n  'redo': RiArrowGoForwardLine,\n  'copy': RiFileCopyLine,\n  'link': RiLink,\n  'notification': RiNotification3Line,\n  'clock': RiTimeLine,\n  'logout': RiLogoutBoxRLine,\n  'globe': RiGlobalLine,\n  'sparkles': RiSparklingLine,\n  'image': RiImageLine,\n  'folder': RiFolderLine,\n  'tick': RiCheckLine,\n  'circle': RiCheckboxBlankCircleLine,\n  'warning': RiErrorWarningLine,\n  'info': RiInformationLine,\n  'lock': RiLockLine,\n  'refresh': RiRefreshLine,\n  'user-plus': RiUserAddLine,\n  'arrow-left': RiArrowLeftLine,\n  'arrow-right': RiArrowRightLine,\n  'arrow-up': RiArrowUpLine,\n  'arrow-down': RiArrowDownLine,\n  'arrow-up-right': RiArrowRightUpLine,\n  'star-filled': RiStarFill,\n  'chevron-left': RiArrowLeftSLine,\n  'chevron-right': RiArrowRightSLine,\n  'chevron-up': RiArrowUpSLine,\n  'chevron-down': RiArrowDownSLine,\n  'align-left': RiAlignLeft,\n  'align-center': RiAlignCenter,\n  'align-right': RiAlignRight,\n  'credit-card': RiBankCardLine,\n  'branch': RiCornerDownRightLine,\n} as const;\n\nexport type UIIconName = keyof typeof iconComponents;\nexport const uiIconNames = Object.keys(iconComponents) as UIIconName[];\nexport type UIIconProps = Omit<SVGProps<SVGSVGElement>, 'name' | 'children' | 'dangerouslySetInnerHTML'> & { name: UIIconName; size?: number };\n\n/** One line-icon family; size and color inherit from the control, never an icon font. */\nexport function UIIcon({name, className = '', size, width, height, color, style, ...props}: UIIconProps) {\n  const Glyph = iconComponents[name] || iconComponents.help;\n  return <Glyph {...props} size={size} style={{width:width ?? size,height:height ?? size,color,...style}} className={`hu-svg-icon ${className}`} data-ui-icon={name} data-icon-unknown={!iconComponents[name] || undefined} role={props.role || (props['aria-label'] ? 'img' : undefined)} aria-hidden={props['aria-hidden'] ?? (props['aria-label'] ? undefined : true)} focusable=\"false\" />;\n}\n\nconst glyphNames = glyphAliases as Record<string, UIIconName>;\n\n/** Normalize legacy glyphs only in icon slots; custom SVGs and provider marks remain intact. */\nexport function renderIcon(icon: ReactNode): ReactNode {\n  return typeof icon === 'string' && glyphNames[icon.trim()]\n    ? <UIIcon name={glyphNames[icon.trim()]} />\n    : icon;\n}\n",
  "src/index.ts": "'use client';\nexport * from './components.js';\nexport * from './DataTable.js';\nexport * from './Examples.js';\nexport * from './family-types.js';\nexport * from './BaseFamilies.js';\nexport * from './ApplicationFamilies.js';\nexport * from './BoardExtras.js';\nexport * from './AgentPatterns.js';\nexport * from './ChartFamilies.js';\nexport * from './Templates.js';\nexport * from './BoardTemplates.js';\nexport * from './AllComponents.js';\n\nexport * from './DateRangeExamples.js';\nexport * from './Direction.js';\n\nexport { UIIcon, uiIconNames, renderIcon } from './icons.js';\nexport type { UIIconName, UIIconProps } from './icons.js';\nexport {SourceAgentPreview,sourceAgentSections} from './AgentPatterns.js';\nexport type {SourceAgentPreviewProps,SourceAgentSection} from './AgentPatterns.js';\nexport {SourceChartPreview,sourceChartSections,sourceChartProfiles} from './ChartFamilies.js';\nexport type {SourceChartPreviewProps,SourceChartSection,SourceChartProfile} from './ChartFamilies.js';\nexport * from './BoardNativeExamples.js';\nexport * from './AriaPrimitives.js';\n",
  "src/registry.ts": "import { extendedRegistry } from './extended-registry.js';\nimport { agentControls } from './agent-controls.js';\nexport type ComponentSpec = {\n  name: string;\n  exportName: string;\n  node?: string;\n  group: string;\n  file: string;\n  props: Record<string, string>;\n  example?: string;\n  description?: string;\n  reference?: string;\n  previewExport?: string;\n};\nexport const registry: Record<string, ComponentSpec> = {\n  buttons: {\n    name: 'Button',\n    exportName: 'Button',\n    node: '84:2420',\n    group: 'Base components',\n    file: 'src/components.tsx',\n    props: {\n      size: 'xs | sm | md | lg | xl',\n      variant: 'primary | secondary | tertiary | ghost | link-gray | link-color | danger',\n      loading: 'boolean; blocks duplicate actions',\n      disabled: 'boolean',\n      leadingIcon: 'ReactNode',\n      trailingIcon: 'ReactNode',\n      iconOnly: 'boolean; requires an accessible label',\n      onClick: 'native button handler',\n    },\n  },\n  inputs: {\n    name: 'Input',\n    exportName: 'Input',\n    node: '103:2',\n    group: 'Base components',\n    file: 'src/components.tsx',\n    props: {\n      label: 'string; required visible label',\n      size: 'sm | md | lg',\n      value: 'string (controlled) or defaultValue',\n      onChange: 'native input handler',\n      hint: 'string',\n      error: 'string; announces error and sets aria-invalid',\n      leadingIcon: 'ReactNode',\n      suffix: 'ReactNode',\n      disabled: 'boolean',\n      required: 'boolean',\n    },\n  },\n  select: {\n    name: 'Select',\n    exportName: 'RichSelect',\n    node: '111:2058',\n    group: 'Base components',\n    file: 'src/BoardExtras.tsx',\n    props: {\n      label: 'string',\n      options: '{value, label, disabled?}[]',\n      size: 'sm | md | lg',\n      value: 'string',\n      onValueChange: '(value:string) => void',\n      placeholder: 'string',\n      loading: 'boolean',\n      disabled: 'boolean',\n      error: 'string',\n      hint: 'string',\n      leadingIcon: 'ReactNode',\n    },\n  },\n  modals: {\n    name: 'Dialog',\n    exportName: 'Dialog',\n    node: '218:128',\n    group: 'Application components',\n    file: 'src/components.tsx',\n    example: 'DialogExample',\n    props: {\n      open: 'boolean; controlled',\n      onOpenChange: '(open: boolean) => void',\n      title: 'string',\n      description: 'string',\n      children: 'ReactNode',\n      footer: 'ReactNode',\n      destructive: 'boolean',\n    },\n  },\n  tables: {\n    name: 'Data Table',\n    exportName: 'DataTable',\n    node: '173:28',\n    group: 'Application components',\n    file: 'src/DataTable.tsx',\n    example: 'TableExample',\n    props: {\n      rows: 'T[]; bounded local dataset',\n      columns: 'Column<T>[]; value, render, sortable',\n      rowKey: '(row:T) => stable string',\n      rowLabel: '(row:T) => accessible string',\n      caption: 'string',\n      pageSize: 'number; default 5',\n      state: 'ready | loading | empty | error',\n      onRetry: '() => void',\n      onRowAction: '(row:T) => void',\n      filters: 'Record<string,string>; exact column filters; selection remains stable across filters',\n    },\n  },\n  checkboxes: {\n    name: 'Checkbox',\n    exportName: 'Checkbox',\n    node: '95:600',\n    group: 'Base components',\n    file: 'src/components.tsx',\n    props: {\n      label: 'string',\n      size: 'sm | md',\n      checked: 'boolean',\n      onChange: 'native input handler',\n      indeterminate: 'boolean',\n      card: 'boolean; entire bordered card toggles the checkbox',\n      disabled: 'boolean',\n      hint: 'string',\n    },\n  },\n  tabs: {\n    name: 'Tabs',\n    exportName: 'Tabs',\n    node: '186:809',\n    group: 'Application components',\n    file: 'src/components.tsx',\n    props: {\n      label: 'string; tablist accessible name',\n      items: '{id, label, content, disabled?, icon?, count?}[]',\n      variant: 'underline | pill | gray',\n      value: 'string; optional controlled value',\n      defaultValue: 'string',\n      onValueChange: '(value:string) => void',\n    },\n  },\n  charts: {\n    name: 'Revenue Chart',\n    exportName: 'RevenueChart',\n    node: '3531:21282',\n    group: 'Application components',\n    file: 'src/Examples.tsx',\n    props: {\n      data: 'RevenuePoint[]; {label, value}',\n      state: 'ready | loading | empty | error',\n      onRetry: '() => void',\n    },\n  },\n  messaging: {\n    name: 'Chat Composer',\n    exportName: 'ChatComposer',\n    node: '173:19',\n    group: 'Application components',\n    file: 'src/Examples.tsx',\n    props: { state: 'ready | loading | empty | error', onRetry: '() => void' },\n  },\n  'settings-form': {\n    name: 'Settings Form',\n    exportName: 'SettingsForm',\n    node: '334:517',\n    group: 'Application examples',\n    file: 'src/Examples.tsx',\n    props: { state: 'ready | loading | empty | error', onRetry: '() => void' },\n  },\n};\nObject.assign(registry, extendedRegistry);\nregistry.calendars.name = 'Date Calendar';\nregistry.calendars.description = 'A reusable date-selection grid. Use the Calendar application template for events and scheduling.';\nexport type Kind = string;\nexport type Config = {\n  size: string;\n  variant: string;\n  state: string;\n  icon: string;\n  label: string;\n  value: string;\n  checked: boolean;\n  density: string;\n  destructive: boolean;\n  shape: 'curved' | 'sharp';\n  mono: boolean;\n  limit: number;\n  bubble: boolean;\n  options: Record<string,string|number|boolean>;\n};\nexport function defaults(kind: Kind): Config {\n  return {\n    size: 'md',\n    variant: registry[kind].group === 'Charts' ? 'default' : 'primary',\n    state: Object.hasOwn(extendedRegistry, kind) ? 'ready' : 'default',\n    icon: 'none',\n    label:\n      kind === 'inputs'\n        ? 'Email address'\n        : kind === 'select'\n          ? 'Team member'\n          : kind === 'checkboxes'\n            ? 'Receive product updates'\n            : 'Continue',\n    value: kind === 'inputs' ? '' : kind === 'select' ? 'aarav' : '',\n    checked: false,\n    density: 'comfortable',\n    destructive: false,\n    shape: 'curved',\n    mono: false,\n    limit: 4,\n    bubble: true,\n    options: Object.fromEntries((agentControls[kind]||[]).map(control=>[control.key,control.defaultValue])),\n  };\n}\nexport const teamOptions = [\n  { value: 'aarav', label: 'Aarav Shah' },\n  { value: 'diya', label: 'Diya Rao' },\n  { value: 'kavya', label: 'Kavya Nair' },\n  { value: 'unavailable', label: 'Unavailable member', disabled: true },\n];\nexport const dependencyInfo = {\n  runtime: [\n    'react 19.2.4',\n    'react-dom 19.2.4',\n    'react-aria-components ^1.17.0',\n    '@tanstack/react-table ^8.21.3',\n    'motion ^12.42.2',\n    'recharts ^3.9.2',\n  ],\n  styling: 'Import @helios-ui/react/styles.css once.',\n  externalServices: 'None. All demo records and responses are local fixtures.',\n  figma: 'https://www.figma.com/design/D8Eh9V5qa4zDhll8RimlU6',\n};\n",
  "src/styles.css": "@import './board-palette.css';\n@import './date-range.css';\n@import './template-foundation.css';\n@import './base-families.css';\n@import './application-families.css';\n@import './board-extras.css';\n@import './agent-patterns.css';\n@import './chart-families.css';\n@import './templates-react.css';\n@import './board-templates.css';\n@import './board-native.css';\n/* Helios Figma geometry; independent of legacy CRM tokens. Import once with the React exports. */\n:root,\n[data-helios-theme='light'] {\n  --hu-page: var(--color-background-full);\n  --hu-bg: var(--color-background-primary-default);\n  --hu-bg-secondary: var(--color-background-secondary-default);\n  --hu-text: var(--color-text-primary);\n  --hu-muted: var(--color-neutral-600);\n  --hu-border: var(--color-border-button-default);\n  --hu-line: var(--color-separator-border);\n  --hu-brand: var(--color-accent-500);\n  --hu-on-brand: var(--accent-ink, #000);\n  --hu-action: var(--accent-action, var(--color-accent-600));\n  --hu-on-action: #fff;\n  --hu-brand-text: var(--accent-readable, var(--color-accent-700));\n  --hu-error: var(--color-red-700);\n  --hu-error-bg: var(--color-background-tertiary-error);\n  --hu-radius: 8px;\n  --hu-font: Inter, ui-sans-serif, system-ui, sans-serif;\n}\n.dark,\n[data-helios-theme='dark'] {\n  --hu-page: var(--color-background-full);\n  --hu-bg: var(--color-background-primary-default);\n  --hu-bg-secondary: var(--color-background-secondary-default);\n  --hu-text: var(--color-text-primary);\n  --hu-muted: var(--color-neutral-400);\n  --hu-border: var(--color-border-button-default);\n  --hu-line: var(--color-separator-border);\n  --hu-brand-text: var(--color-accent-300);\n  --hu-error: var(--color-text-error-primary);\n  --hu-error-bg: var(--color-background-tertiary-error);\n  color-scheme: dark;\n}\n/* Native viewport scrollbars sit outside the themed body. */\nhtml:has(body.dark) {\n  color-scheme: dark;\n}\n.hu-sr-only {\n  position: absolute !important;\n  width: 1px !important;\n  height: 1px !important;\n  padding: 0 !important;\n  margin: -1px !important;\n  overflow: hidden !important;\n  clip: rect(0, 0, 0, 0) !important;\n  white-space: nowrap !important;\n  border: 0 !important;\n}\n.hu-button,\n.hu-field,\n.hu-checkbox,\n.hu-tabs,\n.hu-dialog,\n.hu-table-card,\n.hu-settings,\n.hu-chart,\n.hu-chat,\n.hu-example {\n  box-sizing: border-box;\n  font-family: var(--hu-font);\n  color: var(--hu-text);\n  font-size: 14px;\n  line-height: 20px;\n}\n.hu-button {\n  --hu-height: 40px;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  gap: 6px;\n  min-height: var(--hu-height);\n  padding: 0 14px;\n  border: 1px solid transparent;\n  border-radius: var(--hu-radius);\n  background: var(--hu-bg);\n  font-weight: 600;\n  cursor: pointer;\n  white-space: nowrap;\n  box-shadow: 0 1px 2px #0000000d;\n  transition:\n    background 0.15s,\n    border-color 0.15s,\n    box-shadow 0.15s;\n  vertical-align: middle;\n  text-decoration: none;\n}\n.hu-button.hu-xs {\n  --hu-height: 32px;\n  padding-inline: 10px;\n}\n.hu-button.hu-sm {\n  --hu-height: 36px;\n  padding-inline: 12px;\n}\n.hu-button.hu-lg {\n  --hu-height: 44px;\n  padding-inline: 16px;\n  font-size: 16px;\n  line-height: 24px;\n}\n.hu-button.hu-xl {\n  --hu-height: 48px;\n  padding-inline: 18px;\n  font-size: 16px;\n  line-height: 24px;\n}\n.hu-button.hu-icon-only {\n  width: var(--hu-height);\n  padding: 0;\n  flex-shrink: 0;\n}\n.hu-button.hu-primary {\n  background: var(--hu-action);\n  color: var(--hu-on-action);\n  border-color: #ffffff1f;\n  box-shadow:\n    0 1px 2px #0000000d,\n    inset 0 -2px 0 #0000000d,\n    inset 0 0 0 1px #00000012;\n}\n.hu-button.hu-primary:hover {\n  background: var(--color-accent-700);\n}\n.hu-button.hu-secondary {\n  border-color: var(--hu-border);\n  background: var(--hu-bg);\n}\n.hu-button.hu-secondary:hover,\n.hu-button.hu-tertiary:hover {\n  background: var(--hu-bg-secondary);\n}\n.hu-button.hu-tertiary {\n  background: transparent;\n  box-shadow: none;\n}\n.hu-button.hu-link-gray,\n.hu-button.hu-link-color {\n  background: transparent;\n  border: 0;\n  box-shadow: none;\n  padding: 0;\n  min-height: 24px;\n}\n.hu-button.hu-link-color {\n  color: var(--hu-brand-text);\n}\n.hu-button.hu-link-color:hover,\n.hu-button.hu-link-gray:hover {\n  text-decoration: underline;\n}\n.hu-button.hu-danger {\n  background: var(--hu-error);\n  color: var(--hu-bg);\n}\n.hu-button:disabled {\n  opacity: 0.5;\n  cursor: not-allowed;\n}\n.hu-button[aria-busy='true'] {\n  opacity: 0.8;\n}\n.hu-button:focus-visible,\n.hu-field input:focus-visible,\n.hu-field select:focus-visible,\n.hu-checkbox input:focus-visible,\n.hu-tabs button:focus-visible,\n.hu-table-card button:focus-visible,\n.hu-chat textarea:focus-visible,\n.hu-bars button:focus-visible,\n.hu-table-scroll:focus-visible {\n  outline: 2px solid var(--hu-brand-text);\n  outline-offset: 3px;\n}\n.hu-icon {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: 20px;\n  height: 20px;\n  flex-shrink: 0;\n}\n.hu-icon > * {\n  max-width: 100%;\n  max-height: 100%;\n}\n.hu-spinner {\n  display: inline-block;\n  flex-shrink: 0;\n  width: 16px;\n  height: 16px;\n  border: 2px solid currentColor;\n  border-right-color: transparent;\n  border-radius: 50%;\n  animation: hu-spin 0.8s linear infinite;\n}\n@keyframes hu-spin {\n  to {\n    transform: rotate(360deg);\n  }\n}\n.hu-field {\n  display: flex;\n  flex-direction: column;\n  gap: 6px;\n  min-width: 0;\n  width: 100%;\n  text-align: left;\n}\n.hu-field > label {\n  font-size: 14px;\n  font-weight: 500;\n  line-height: 20px;\n}\n.hu-field > label > span {\n  color: var(--hu-brand-text);\n}\n.hu-input-wrap {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  min-width: 0;\n  height: 40px;\n  padding: 0 12px;\n  border: 1px solid var(--hu-border);\n  border-radius: var(--hu-radius);\n  background: var(--hu-bg);\n  box-shadow: 0 1px 2px #0000000d;\n}\n.hu-field.hu-sm .hu-input-wrap {\n  height: 36px;\n}\n.hu-field.hu-lg .hu-input-wrap {\n  height: 44px;\n}\n.hu-input-wrap:focus-within {\n  border-color: var(--hu-brand-text);\n  box-shadow: 0 0 0 3px color-mix(in srgb, var(--hu-brand), transparent 80%);\n}\n.hu-field input,\n.hu-field select {\n  appearance: none;\n  background: transparent;\n  border: 0;\n  box-shadow: none;\n  color: var(--hu-text);\n  font: inherit;\n  font-size: 16px;\n  line-height: 24px;\n  width: 100%;\n  min-width: 0;\n  padding: 0;\n  height: 100%;\n  border-radius: 4px;\n}\n.hu-field input:focus-visible,\n.hu-field select:focus-visible {\n  outline: 0;\n}\n.hu-field input::placeholder {\n  color: var(--hu-muted);\n  opacity: 1;\n}\n.hu-input-wrap:has(:disabled) {\n  background: var(--hu-bg-secondary);\n  opacity: 0.6;\n  cursor: not-allowed;\n}\n.hu-field select:disabled {\n  cursor: not-allowed;\n}\n.hu-field select option {\n  color: var(--hu-text);\n  background: var(--hu-bg);\n}\n.hu-select .hu-input-wrap {\n  position: relative;\n}\n.hu-select select {\n  padding-right: 22px;\n  cursor: pointer;\n}\n.hu-chevron {\n  position: absolute;\n  pointer-events: none;\n  right: 12px;\n  color: var(--hu-muted);\n  width: 16px;\n  height: 16px;\n  background: var(--hu-muted);\n  mask: url('../assets/select-chevron.svg') center no-repeat;\n  font-size: 0;\n}\n.hu-hint,\n.hu-suffix {\n  font-size: 14px;\n  color: var(--hu-muted);\n  line-height: 20px;\n}\n.hu-invalid .hu-input-wrap {\n  border-color: var(--hu-error);\n}\n.hu-invalid .hu-hint {\n  color: var(--hu-error);\n}\n.hu-checkbox {\n  display: inline-flex;\n  align-items: flex-start;\n  gap: 8px;\n  cursor: pointer;\n  text-align: left;\n  min-height: 20px;\n}\n.hu-checkbox input {\n  appearance: auto;\n  accent-color: var(--hu-brand);\n  width: 20px;\n  height: 20px;\n  flex-shrink: 0;\n  margin: 0;\n  cursor: pointer;\n}\n.hu-checkbox.hu-sm input {\n  width: 16px;\n  height: 16px;\n  margin-top: 2px;\n}\n.hu-checkbox small {\n  display: block;\n  color: var(--hu-muted);\n  font-size: 13px;\n  line-height: 20px;\n}\n.hu-checkbox:has(:disabled) {\n  opacity: 0.5;\n  cursor: not-allowed;\n}\n.hu-check-only > span:not(.hu-checkbox-visual) {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  clip: rect(0, 0, 0, 0);\n  overflow: hidden;\n}\n.hu-tabs {\n  min-width: 0;\n  width: 100%;\n}\n.hu-tabs > [role='tablist'] {\n  display: flex;\n  gap: 4px;\n  overflow: auto;\n  border-bottom: 1px solid var(--hu-line);\n  padding: 0 0 8px;\n}\n.hu-tabs [role='tab'] {\n  background: transparent;\n  border: 0;\n  border-radius: 6px;\n  font: inherit;\n  font-weight: 600;\n  padding: 8px 12px;\n  color: var(--hu-muted);\n  white-space: nowrap;\n  cursor: pointer;\n}\n.hu-tabs [role='tab'][aria-selected='true'] {\n  background: var(--hu-bg-secondary);\n  color: var(--hu-text);\n  box-shadow: 0 1px 3px #00000012;\n}\n.hu-tabs [role='tab']:disabled {\n  opacity: 0.45;\n  cursor: not-allowed;\n}\n.hu-tabs > [role='tabpanel'] {\n  padding-top: 24px;\n  min-width: 0;\n}\n.hu-tabs > [role='tabpanel'][hidden] {\n  display: none;\n}\n.hu-dialog {\n  position: fixed;\n  inset: 0;\n  margin: auto;\n  height: fit-content;\n  padding: 0;\n  background: var(--hu-bg);\n  border: 1px solid var(--hu-line);\n  border-radius: 12px;\n  width: 400px;\n  max-width: calc(100vw - 32px);\n  max-height: calc(100dvh - 32px);\n  overflow: auto;\n  box-shadow: 0 24px 64px #0004;\n}\n.hu-dialog::backdrop {\n  background: #10182880;\n  backdrop-filter: blur(3px);\n}\n.hu-dialog > header {\n  position: relative;\n  padding: 24px 58px 20px 24px;\n  border-bottom: 1px solid var(--hu-line);\n}\n.hu-dialog h2 {\n  font-size: 16px;\n  line-height: 24px;\n  font-weight: 600;\n  letter-spacing: 0;\n  margin: 0 0 2px;\n}\n.hu-dialog p {\n  font-size: 14px;\n  line-height: 20px;\n  color: var(--hu-muted);\n  margin: 0;\n}\n.hu-dialog > header > .hu-button {\n  position: absolute;\n  top: 12px;\n  right: 12px;\n}\n.hu-dialog-body {\n  padding: 24px;\n}\n.hu-dialog > footer {\n  padding: 20px 24px;\n  border-top: 1px solid var(--hu-line);\n  display: flex;\n  gap: 12px;\n  justify-content: flex-end;\n}\n.hu-dialog-example {\n  text-align: center;\n  display: grid;\n  justify-items: center;\n  gap: 16px;\n  padding: 32px 12px;\n}\n.hu-dialog-example > p {\n  max-width: 390px;\n  color: var(--hu-muted);\n}\n.hu-data-state {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  text-align: center;\n  justify-content: center;\n  gap: 12px;\n  min-height: 220px;\n  padding: 24px;\n  color: var(--hu-text);\n  background: var(--hu-bg);\n}\n.hu-data-state p {\n  margin: 0;\n  color: var(--hu-muted);\n}\n.hu-example-heading {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  gap: 20px;\n  margin-bottom: 24px;\n}\n.hu-example-heading h3,\n.hu-settings h3,\n.hu-chat h3 {\n  font-size: 18px;\n  line-height: 28px;\n  font-weight: 600;\n  letter-spacing: -0.02em;\n  margin: 0;\n}\n.hu-example-heading p,\n.hu-settings > p,\n.hu-chat > p {\n  font-size: 13px;\n  line-height: 20px;\n  color: var(--hu-muted);\n  margin: 4px 0 0;\n}\n.hu-table-card {\n  border: 1px solid var(--hu-line);\n  border-radius: 12px;\n  overflow: hidden;\n  background: var(--hu-bg);\n  width: 100%;\n  min-width: 0;\n}\n.hu-table-toolbar {\n  display: flex;\n  align-items: flex-end;\n  gap: 16px;\n  padding: 20px;\n}\n.hu-table-toolbar .hu-field {\n  max-width: 320px;\n}\n.hu-table-toolbar > .hu-button {\n  margin-left: auto;\n}\n.hu-table-scroll {\n  overflow: auto;\n  max-width: 100%;\n}\n.hu-table-card table {\n  width: 100%;\n  border-collapse: collapse;\n  text-align: left;\n  white-space: nowrap;\n}\n.hu-table-card th {\n  font-size: 12px;\n  font-weight: 500;\n  line-height: 18px;\n  color: var(--hu-muted);\n  background: var(--hu-bg-secondary);\n  height: 40px;\n}\n.hu-table-card th,\n.hu-table-card td {\n  padding: 12px 20px;\n  border-bottom: 1px solid var(--hu-line);\n}\n.hu-table-card td {\n  height: 68px;\n  font-size: 14px;\n}\n.hu-table-card th button {\n  background: none;\n  border: 0;\n  padding: 0;\n  font: inherit;\n  color: inherit;\n  cursor: pointer;\n}\n.hu-table-card tr[data-selected='true'] td {\n  background: color-mix(in srgb, var(--hu-brand), var(--hu-bg) 92%);\n}\n.hu-table-card tbody tr:hover td {\n  background: var(--hu-bg-secondary);\n}\n.hu-member {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n}\n.hu-member strong {\n  font-size: 14px;\n  font-weight: 500;\n}\n.hu-member small {\n  display: block;\n  font-size: 12px;\n  line-height: 18px;\n  color: var(--hu-muted);\n}\n.hu-avatar {\n  width: 36px;\n  height: 36px;\n  border-radius: 50%;\n  display: grid;\n  place-items: center;\n  background: var(--hu-bg-secondary);\n  border: 1px solid var(--hu-line);\n  font-size: 12px;\n}\n.hu-badge {\n  display: inline-flex;\n  font-size: 12px;\n  line-height: 18px;\n  padding: 2px 8px;\n  border: 1px solid var(--hu-border);\n  background: var(--hu-bg-secondary);\n  border-radius: 20px;\n  white-space: nowrap;\n}\n.hu-status-active {\n  color: #166534;\n  background: #f0fdf4;\n  border-color: #bbf7d0;\n}\n.hu-status-invited {\n  color: #1e40af;\n  background: #eff6ff;\n  border-color: #bfdbfe;\n}\n.dark .hu-status-active {\n  background: #143522;\n  color: #86efac;\n  border-color: #22563b;\n}\n.dark .hu-status-invited {\n  background: #16274c;\n  color: #93c5fd;\n  border-color: #2a4675;\n}\n.hu-table-footer {\n  padding: 16px 20px;\n  display: flex;\n  gap: 16px;\n  align-items: center;\n  flex-wrap: wrap;\n  font-size: 12px;\n  color: var(--hu-muted);\n}\n.hu-table-footer > .hu-field {\n  width: 90px;\n  margin-left: auto;\n}\n.hu-table-footer > .hu-field label {\n  font-size: 11px;\n}\n.hu-table-footer > div:last-child {\n  display: flex;\n  gap: 12px;\n  align-items: center;\n}\n.hu-density-compact td {\n  height: 48px;\n  padding-block: 8px;\n}\n.hu-record {\n  display: grid;\n  grid-template-columns: auto 1fr;\n  gap: 12px;\n  margin: 0;\n}\n.hu-record dd {\n  margin: 0;\n  overflow-wrap: anywhere;\n}\n.hu-record dt {\n  color: var(--hu-muted);\n}\n.hu-settings {\n  display: grid;\n  gap: 20px;\n  max-width: 420px;\n  width: 100%;\n  margin: auto;\n}\n.hu-actions {\n  display: flex;\n  align-items: center;\n  justify-content: flex-end;\n  gap: 12px;\n  flex-wrap: wrap;\n}\n.hu-chart {\n  width: 100%;\n  background: var(--hu-bg);\n  border: 1px solid var(--hu-line);\n  border-radius: 12px;\n  padding: 24px;\n}\n.hu-chart .hu-field {\n  max-width: 155px;\n}\n.hu-chart-total {\n  display: block;\n  font-size: 30px;\n  line-height: 38px;\n  letter-spacing: -0.04em;\n  margin-bottom: 16px;\n}\n.hu-bars {\n  display: flex;\n  gap: 12px;\n  height: 200px;\n  padding: 24px 8px 30px;\n  border-bottom: 1px solid var(--hu-line);\n  margin-top: 16px;\n}\n.hu-bars button {\n  background: none;\n  border: 0;\n  flex: 1;\n  min-width: 0;\n  position: relative;\n  height: 100%;\n  display: flex;\n  align-items: flex-end;\n  justify-content: center;\n  padding: 0;\n  cursor: pointer;\n}\n.hu-bars button > span {\n  width: 75%;\n  background: var(--hu-brand);\n  border-radius: 4px 4px 0 0;\n  transition:\n    height 0.25s,\n    opacity 0.15s;\n}\n.hu-bars button[aria-pressed='false'] > span {\n  opacity: 0.55;\n}\n.hu-bars small {\n  position: absolute;\n  top: calc(100% + 8px);\n  font-size: 12px;\n  color: var(--hu-muted);\n}\n.hu-chart-inspect {\n  min-height: 20px;\n  margin: 16px 0;\n  color: var(--hu-muted);\n}\n.hu-chart details {\n  font-size: 12px;\n}\n.hu-chart summary {\n  cursor: pointer;\n}\n.hu-chart table {\n  width: 100%;\n  text-align: left;\n  border-collapse: collapse;\n  margin-top: 12px;\n}\n.hu-chart th,\n.hu-chart td {\n  padding: 8px;\n  border-bottom: 1px solid var(--hu-line);\n}\n.hu-chat {\n  display: grid;\n  gap: 16px;\n  width: 100%;\n}\n.hu-chat-log {\n  min-height: 140px;\n  max-height: 260px;\n  overflow: auto;\n  border: 1px solid var(--hu-line);\n  border-radius: 8px;\n  padding: 16px;\n  background: var(--hu-bg-secondary);\n}\n.hu-chat-log > div {\n  background: var(--hu-bg);\n  border: 1px solid var(--hu-line);\n  padding: 12px;\n  border-radius: 8px;\n  margin: 8px 0;\n}\n.hu-chat-log p {\n  margin: 4px 0;\n  white-space: pre-wrap;\n  overflow-wrap: anywhere;\n}\n.hu-chat textarea {\n  width: 100%;\n  border: 1px solid var(--hu-border);\n  border-radius: 8px;\n  background: var(--hu-bg);\n  color: var(--hu-text);\n  font: inherit;\n  padding: 12px;\n  box-sizing: border-box;\n  resize: vertical;\n}\n.hu-chat > .hu-actions {\n  justify-content: space-between;\n}\n@media (max-width: 600px) {\n  .hu-example-heading {\n    align-items: flex-start;\n    flex-wrap: wrap;\n  }\n  .hu-table-toolbar {\n    flex-wrap: wrap;\n    padding: 16px;\n  }\n  .hu-table-toolbar > .hu-button {\n    margin-left: 0;\n  }\n  .hu-table-footer {\n    padding: 16px;\n    gap: 12px;\n  }\n  .hu-table-footer > .hu-field {\n    margin-left: 0;\n  }\n  .hu-table-footer > div:last-child {\n    width: 100%;\n    justify-content: space-between;\n    gap: 8px;\n  }\n  .hu-table-card th,\n  .hu-table-card td {\n    padding-inline: 12px;\n  }\n  .hu-dialog > footer {\n    flex-direction: column-reverse;\n  }\n  .hu-dialog > footer .hu-button {\n    width: 100%;\n  }\n  .hu-chart {\n    padding: 16px;\n  }\n  .hu-bars {\n    gap: 6px;\n  }\n  .hu-record {\n    grid-template-columns: 1fr;\n    gap: 6px;\n  }\n}\n@media (prefers-reduced-motion: reduce) {\n  .hu-spinner {\n    animation: none;\n    border-style: dotted;\n  }\n  .hu-button,\n  .hu-bars button > span {\n    transition: none;\n  }\n}\n\n.hu-placeholder-icon {\n  width: 20px;\n  height: 20px;\n  display: inline-block;\n  background: currentColor;\n  mask: url('../assets/button-placeholder.svg') center no-repeat;\n}\n.hu-dialog > header .hu-icon {\n  font-size: 0;\n  background: var(--hu-muted);\n  mask: url('../assets/dialog-close.svg') center no-repeat;\n}\n/* Keep component dimensions independent of a consuming application's CSS reset. */\n:where([class^=\"hu-\"], [class*=\" hu-\"]) { box-sizing: border-box; }\n.hu-data-state { font-family:var(--hu-font); font-size:14px; line-height:20px; }\n\n.hu-table-card table{color:var(--hu-text);font:inherit}\n\n.hu-table-scroll{position:relative}\n\n.hr-template-viewport { width:100%; min-width:0; }\n.hr-template-device-controls { display:flex; justify-content:flex-end; padding-bottom:12px; }\n.hr-template-device-controls .hu-field { width:180px; }\n.hr-template-browser { max-width:100%; margin-inline:auto; border:1px solid var(--hu-line); border-radius:10px; overflow:hidden; background:var(--hu-bg); }\n.hr-template-browser-bar { display:flex; align-items:center; gap:16px; height:34px; padding-inline:12px; background:var(--hu-bg-secondary); border-bottom:1px solid var(--hu-line); color:var(--hu-muted); }\n.hr-template-browser-bar > span { letter-spacing:3px; font-size:9px; }\n.hr-template-browser-bar small { font-size:10px; }\n.hr-template-screen { position:relative; width:100%; overflow:hidden; }\n.hr-template-screen iframe { position:absolute; left:0; top:0; max-width:none; }\n.hr-preview:has(.hr-template-viewport) { display:block; padding:12px; max-height:none; overflow:visible; }\n.hu-dialog:has(.hd-range-surface) { width:800px; }\n/* Public primitive variants observed in the October 2026 reference audit. */\n.hu-button.hu-ghost { color:var(--hu-brand-text); background:color-mix(in srgb,var(--hu-brand) 14%,var(--hu-bg)); box-shadow:none; }\n.hu-button.hu-ghost:hover:not(:disabled) { background:color-mix(in srgb,var(--hu-brand) 22%,var(--hu-bg)); }\n.hu-checkbox { position:relative; }\n.hu-checkbox>input { position:absolute; width:20px; height:20px; opacity:0; margin:0; }\n.hu-checkbox>.hu-checkbox-visual { position:relative; display:inline-flex; align-items:center; justify-content:center; flex:0 0 20px; width:20px; height:20px; border:1px solid var(--hu-border); border-radius:5px; background:var(--hu-bg); box-shadow:inset 0 1px 2px #00000008; transition:background .15s,border-color .15s; }\n.hu-checkbox.hu-sm>.hu-checkbox-visual { width:16px; height:16px; flex-basis:16px; margin-top:2px; border-radius:4px; }\n.hu-checkbox-visual svg { width:100%; height:100%; fill:none; stroke:var(--hu-on-brand); stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }\n.hu-checkbox-visual,.hu-checkbox-visual * { pointer-events:none; }\n.hu-checkbox-tick { stroke-dasharray:1; stroke-dashoffset:1; opacity:0; transition:stroke-dashoffset .2s ease,opacity .12s; }\n.hu-checkbox-mixed { opacity:0; }\n.hu-checkbox>input:checked+.hu-checkbox-visual,.hu-checkbox>input:indeterminate+.hu-checkbox-visual { background:var(--hu-brand); border-color:var(--hu-brand); box-shadow:inset 0 -1px 1px #0002,inset 0 0 0 1px #ffffff33; }\n.hu-checkbox>input:checked+.hu-checkbox-visual .hu-checkbox-tick { stroke-dashoffset:0; opacity:1; }\n.hu-checkbox>input:indeterminate+.hu-checkbox-visual .hu-checkbox-tick { opacity:0; }\n.hu-checkbox>input:indeterminate+.hu-checkbox-visual .hu-checkbox-mixed { opacity:1; }\n.hu-checkbox>input:focus-visible+.hu-checkbox-visual { outline:2px solid var(--hu-brand-text); outline-offset:3px; }\n.hu-checkbox.hu-checkbox-card { display:flex; align-items:center; flex-direction:row-reverse; justify-content:space-between; width:100%; padding:14px 16px; border:1px solid var(--hu-line); border-radius:10px; background:var(--hu-bg); transition:background .15s,border-color .15s; }\n.hu-checkbox-card>input { inset-inline-end:16px; }\n.hu-checkbox-card>span:last-child { min-width:0; }\n.hu-checkbox-card:hover:not(:has(:disabled)),.hu-checkbox-card:has(:checked) { background:var(--hu-bg-secondary); border-color:var(--hu-border); }\n.hu-tabs[data-variant=underline]>[role=tablist] { gap:0; padding:0; }\n.hu-tabs[data-variant=underline] [role=tab] { position:relative; display:inline-flex; align-items:center; gap:7px; border-radius:0; padding:10px 12px; font-weight:500; }\n.hu-tabs[data-variant=underline] [role=tab][aria-selected=true] { background:transparent; color:var(--hu-brand-text); box-shadow:none; }\n.hu-tabs[data-variant=underline] [role=tab]::after { content:''; position:absolute; inset:auto 0 0; height:2px; background:var(--hu-brand-text); transform:scaleX(0); transition:transform .2s ease; }\n.hu-tabs[data-variant=underline] [role=tab][aria-selected=true]::after { transform:scaleX(1); }\n.hu-tab-icon { display:inline-flex; align-items:center; }\n.hu-tab-count { display:inline-flex; align-items:center; justify-content:center; padding:0 4px; min-width:18px; height:18px; border-radius:4px; font-size:11px; line-height:16px; background:var(--hu-bg-secondary); color:var(--hu-muted); }\n.hu-tabs [aria-selected=true]>.hu-tab-count { background:color-mix(in srgb,var(--hu-brand) 14%,var(--hu-bg)); color:var(--hu-brand-text); }\n.hu-tabs[data-variant=pill]>[role=tablist],.hu-tabs[data-variant=gray]>[role=tablist] { display:inline-flex; border:0; background:var(--hu-bg-secondary); border-radius:99px; padding:4px; gap:2px; max-width:100%; }\n.hu-tabs[data-variant=pill] [role=tab],.hu-tabs[data-variant=gray] [role=tab] { display:inline-flex; align-items:center; gap:6px; padding:5px 10px; font-size:12px; font-weight:500; border-radius:99px; transition:background .18s,color .18s; }\n.hu-tabs[data-variant=pill] [role=tab][aria-selected=true] { background:var(--hu-bg); color:var(--hu-brand-text); box-shadow:0 1px 3px #0001; }\n.hu-tabs[data-variant=gray] [role=tab][aria-selected=true] { background:var(--hu-line); color:var(--hu-text); box-shadow:none; }\n@media(prefers-reduced-motion:reduce) { .hu-checkbox-visual,.hu-checkbox-tick,.hu-checkbox-card,.hu-tabs [role=tab],.hu-tabs [role=tab]::after { transition:none!important; } }\n.hp-example { margin:40px 0; padding:0 0 28px; border-bottom:1px solid var(--hu-line); font:400 14px/22px var(--hu-font); color:var(--hu-text); min-width:0; }\n.hp-example h2 { margin:0 0 8px; font:500 20px/28px var(--hu-font); letter-spacing:-.02em; }\n.hp-example>p { color:var(--hu-muted); margin:0 0 16px; }\n.hp-example-toolbar { display:flex; gap:12px; align-items:center; justify-content:space-between; margin:16px 0; }\n.hp-example-toolbar>.hu-tabs { width:auto; }\n.hp-example-toolbar>.hu-tabs>[role=tabpanel] { display:none; }\n.hp-example-preview { min-height:120px; padding:32px 24px; border:1px solid var(--hu-line); border-radius:18px; display:flex; flex-direction:column; align-items:center; justify-content:center; gap:16px; }\n.hp-example-preview[hidden],.hp-example-code[hidden] { display:none; }\n.hp-example-row { display:flex; flex-wrap:wrap; align-items:center; justify-content:center; gap:12px; }\n.hp-example-stack { display:flex; flex-direction:column; gap:16px; width:min(100%,420px); }\n.hp-example-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:24px; width:100%; }\n.hp-example-phone { display:grid; grid-template-columns:minmax(140px,1fr) minmax(180px,2fr); width:min(100%,560px); gap:12px; }\n.hp-example-preview>.hu-field { width:min(100%,320px); }\n.hp-example .hp-example-status { min-height:0; font-size:12px; margin:8px 0 0; }\n.hp-example-code { background:var(--hu-bg-secondary); border:1px solid var(--hu-line); border-radius:10px; padding:20px; max-height:460px; overflow:auto; font:12px/20px ui-monospace,monospace; color:var(--hu-text); white-space:pre; }\n.hp-example-code:focus-visible { outline:2px solid var(--hu-brand-text); outline-offset:3px; }\n@media(max-width:600px) { .hp-example-preview { padding:24px 16px; } .hp-example-grid,.hp-example-phone { grid-template-columns:1fr; } .hp-example-toolbar>.hu-button { font-size:11px; padding-inline:8px; } }\n.hu-table-filters { display:flex; align-items:flex-end; flex-wrap:wrap; gap:12px; margin:0 0 16px; }\n.hu-table-filters>.hu-field { width:150px; }\n.hu-table-status { min-width:104px; max-width:150px; }\n.hu-table-status>label { position:absolute; width:1px; height:1px; margin:-1px; overflow:hidden; clip-path:inset(50%); }\n.hu-table-status select { font-size:12px; }\n@media(max-width:600px) { .hu-table-filters { gap:8px; } .hu-table-filters>.hu-field { width:calc(50% - 4px); min-width:110px; } }\n.hp-display-tabs { display:inline-flex; gap:2px; padding:3px; border:1px solid var(--hu-line); border-radius:8px; background:var(--hu-bg-secondary); }\n.hp-display-tabs>button { padding:5px 10px; border:0; border-radius:5px; color:var(--hu-muted); background:transparent; font:500 12px/18px var(--hu-font); cursor:pointer; }\n.hp-display-tabs>button[aria-selected=true] { background:var(--hu-bg); color:var(--hu-text); box-shadow:0 1px 3px #0001; }\n.hp-display-tabs>button:focus-visible,.hp-example-preview:focus-visible { outline:2px solid var(--hu-brand-text); outline-offset:3px; }\n.hu-button:not(:disabled) { transition:background .15s,border-color .15s,box-shadow .15s,transform .12s ease; }\n.hu-button:active:not(:disabled) { transform:translateY(1px) scale(.98); }\n@media(prefers-reduced-motion:reduce) { .hu-button:not(:disabled) { transition:none!important; } .hu-button:active:not(:disabled) { transform:none; } }\n.hu-button.hu-primary:hover:not(:disabled) { background:var(--accent-action-hover,var(--color-accent-700)); }\n.hu-button.hu-ghost { background:var(--color-button-ghost-background); color:var(--color-button-ghost-foreground); }\n.hu-button.hu-ghost:hover:not(:disabled) { background:var(--color-button-ghost-hover); }\n.hu-button.hu-ghost:disabled { background:var(--color-button-ghost-disabled); color:var(--color-button-ghost-disabled-foreground); }\n.hu-input-wrap { background:var(--color-background-secondary-default); }\n.hu-field:has(input:disabled) .hu-input-wrap,.hu-field:has(select:disabled) .hu-input-wrap { background:var(--color-input-disabled-background); }\n.hu-field input::placeholder { color:var(--color-text-placeholder); }\n.hu-checkbox>.hu-checkbox-visual { border-color:var(--color-border-checkbox-default); }\n.hu-tabs [aria-selected=true]>.hu-tab-count { background:var(--color-tab-count-selected-background); }\n.hu-tabs[data-variant=pill]>[role=tablist],.hu-tabs[data-variant=gray]>[role=tablist] { background:var(--color-segmented-control-background); }\n.hu-tabs[data-variant=pill] [role=tab][aria-selected=true] { background:var(--color-pill-tab-blue-selected-background); }\n.hu-tabs[data-variant=gray] [role=tab][aria-selected=true] { background:var(--color-segmented-control-selected-background); }\n/* Adjacent audited stops preserve small-text contrast on the audited neutral surfaces. */\n.hu-field input::placeholder { color:var(--hu-muted); }\n.hu-button.hu-ghost { color:var(--hu-brand-text); }\n\n/* Shared line icons: fixed boxes, currentColor and no font-dependent glyph metrics. */\nsvg.hu-svg-icon { display:inline-block; width:18px; height:18px; flex-shrink:0; vertical-align:middle; fill:currentColor; stroke:none; }\nsvg.hu-svg-icon:is(.bt-icon,.hx-icon) { width:20px; height:20px; }\nsvg.hu-svg-icon.site-icon { width:18px; height:18px; }\n.hu-icon>svg.hu-svg-icon { width:20px; height:20px; }\n.hu-xs .hu-icon>svg.hu-svg-icon,.hu-sm .hu-icon>svg.hu-svg-icon { width:16px; height:16px; }\n.hu-button>span:not(.hu-icon):not(.hu-sr-only):has(>svg.hu-svg-icon) { display:inline-flex; align-items:center; justify-content:center; gap:6px; }\n.hu-tab-icon>svg.hu-svg-icon { width:16px; height:16px; }\n\n/* Source-shaped table presentation preserves the advanced TanStack API. */\n.hu-table-card[data-presentation='board'] { border:0; border-radius:0; box-shadow:none; background:transparent; }\n.hu-table-card[data-presentation='board'] .hu-table-scroll { border:0; border-radius:0; }\n.hu-table-card[data-presentation='board'] table { min-width:560px; }\n.hu-table-card[data-presentation='board'] th { background:var(--color-background-primary-default); color:var(--color-text-tertiary); font-size:12px; line-height:16px; font-weight:500; height:36px; padding:8px 12px; }\n.hu-table-card[data-presentation='board'] td { height:52px; padding:10px 12px; font-size:14px; line-height:20px; }\n.hu-table-card[data-presentation='board'] th:first-child,.hu-table-card[data-presentation='board'] td:first-child { width:40px; padding-inline:12px; }\n.hu-board-pagination { display:flex; justify-content:space-between; align-items:center; gap:12px; padding:12px 16px; border-top:1px solid var(--hu-line); }\n.hu-board-pagination>div { display:flex; align-items:center; gap:4px; }\n.hu-board-pagination>div>span { display:flex; align-items:center; gap:4px; }\n.hu-board-pagination button { appearance:none; display:inline-flex; align-items:center; justify-content:center; gap:6px; min-height:32px; border:0; border-radius:8px; padding:6px 10px; font:500 13px/20px var(--hu-font); color:var(--color-text-secondary); background:transparent; cursor:pointer; }\n.hu-board-pagination>button { border:1px solid var(--color-border-button-default); background:var(--color-background-primary-default); box-shadow:0 1px 2px #0000000d; }\n.hu-board-pagination>button svg { width:16px; height:16px; }\n.hu-board-pagination button[aria-current='page'] { background:var(--color-background-secondary-default); color:var(--color-text-primary); box-shadow:0 1px 2px #0000000d; }\n.hu-board-pagination button:hover:not(:disabled) { background:var(--color-background-primary-hover); }\n.hu-board-pagination button:disabled { opacity:.4; cursor:not-allowed; }\n.hu-board-pagination button:focus-visible { outline:2px solid var(--color-border-focus-ring); outline-offset:2px; }\n.hu-board-page-ellipsis { padding-inline:4px; color:var(--color-text-tertiary); }\n@media(max-width:520px) { .hu-board-pagination { padding:10px 8px; gap:4px; } .hu-board-pagination>div { gap:0; } .hu-board-pagination>div>span { gap:0; } .hu-board-pagination button { padding-inline:6px; } }\n",
  "src/styles.d.ts": "/** Type entry for the stylesheet subpath; the runtime export remains the CSS file. */\nexport {};\n",
  "src/template-definitions.ts": "/** Shared template identities for rendering, routing and server metadata. */\nexport const templateDefinitions = [\n  {\n    id: 'membership-dashboard',\n    name: 'Dashboards 01',\n    title: 'Membership dashboard',\n    node: '322-236',\n    page: '321-3',\n    exportName: 'MembershipDashboard',\n    layout: 'membership',\n  },\n  {\n    id: 'business-dashboard',\n    name: 'Dashboards 02',\n    title: 'Business overview',\n    node: '442-440',\n    page: '321-4',\n    exportName: 'BusinessDashboard',\n    layout: 'business',\n  },\n  {\n    id: 'trade-history',\n    name: 'Informational pages',\n    title: 'Trade history',\n    node: '413-440',\n    page: '321-5',\n    exportName: 'TradeHistory',\n    layout: 'trades',\n  },\n  {\n    id: 'personal-information',\n    name: 'Settings pages',\n    title: 'Personal information',\n    node: '334-517',\n    page: '321-7',\n    exportName: 'PersonalInformation',\n    layout: 'settings',\n  },\n  {\n    id: 'trade-history-header',\n    name: 'Informational pages 02',\n    title: 'Trade history',\n    node: '528-440',\n    page: '321-6',\n    exportName: 'TradeHistoryHeader',\n    layout: 'trades-header',\n  },\n  {\n    id: 'profile-editor',\n    name: 'Settings pages 02',\n    title: 'Profile editor',\n    node: '557-2',\n    page: '321-8',\n    exportName: 'ProfileEditor',\n    layout: 'profile',\n  },\n] as const;\n\nexport const boardTemplateDefinitions = [\n  {\n    id: 'dashboard',\n    name: 'Home dashboard',\n    title: 'Welcome Aarav',\n    exportName: 'HomeDashboardTemplate',\n    source: 'https://www.boardui.com/templates/dashboard',\n  },\n  {\n    id: 'hr',\n    name: 'HR team',\n    title: 'HR Team',\n    exportName: 'HRTemplate',\n    source: 'https://www.boardui.com/templates/hr',\n  },\n  {\n    id: 'finance',\n    name: 'Finance dashboard',\n    title: 'Finance',\n    exportName: 'FinanceTemplate',\n    source: 'https://www.boardui.com/templates/finance',\n  },\n  {\n    id: 'marketing',\n    name: 'Marketing dashboard',\n    title: 'Marketing',\n    exportName: 'MarketingTemplate',\n    source: 'https://www.boardui.com/templates/marketing',\n  },\n  {\n    id: 'medical-profile',\n    name: 'Medical profile',\n    title: 'Medical Profile',\n    exportName: 'MedicalProfileTemplate',\n    source: 'https://www.boardui.com/templates/medical-profile',\n  },\n  {\n    id: 'calendar',\n    name: 'Calendar',\n    title: 'Calendar',\n    exportName: 'CalendarTemplate',\n    source: 'https://www.boardui.com/templates/calendar',\n  },\n  {\n    id: 'project-board',\n    name: 'Project board',\n    title: 'Helios Design Tasks',\n    exportName: 'ProjectBoardTemplate',\n    source: 'https://www.boardui.com/templates/project-board',\n  },\n  {\n    id: 'chat-starter',\n    name: 'Chat starter',\n    title: 'Helios Assistant',\n    exportName: 'ChatStarterTemplate',\n    source: 'https://www.boardui.com/templates/chat-starter',\n  },\n  {\n    id: 'multi-agent-chat',\n    name: 'Multi-agent chat',\n    title: 'Your agents',\n    exportName: 'MultiAgentChatTemplate',\n    source: 'https://www.boardui.com/templates/multi-agent-chat',\n  },\n  {\n    id: 'ai-chat',\n    name: 'AI chat',\n    title: 'Helios Chat',\n    exportName: 'AIChatTemplate',\n    source: 'https://www.boardui.com/templates/ai-chat',\n  },\n  {\n    id: 'ai-image-generation',\n    name: 'AI image generation',\n    title: 'Image studio',\n    exportName: 'AIImageGenerationTemplate',\n    source: 'https://www.boardui.com/templates/ai-image-generation',\n  },\n  {\n    id: 'ai-profile',\n    name: 'AI profile',\n    title: 'Profile',\n    exportName: 'AIProfileTemplate',\n    source: 'https://www.boardui.com/templates/ai-profile',\n  },\n] as const;\n",
  "src/template-descriptions.ts": "/** Website descriptions reflect the implemented local examples, never connected providers. */\nexport const templateDescriptions: Record<string, string> = {\n  dashboard:\n    'An operational dashboard with KPI cards, earnings trends, a sortable records table and responsive workspace navigation. All records are fictional local examples.',\n  hr: 'A workforce dashboard with headcount, recent hires, hiring stages, engagement, workforce trends and editable employee examples.',\n  finance:\n    'An INR finance workspace with balances, cash-flow links, category spending, risk-versus-return data, a spending calendar and local transaction actions.',\n  marketing:\n    'A campaign dashboard with acquisition stages, channel spending, traffic sources, ad-spend trends and a sortable campaign table. Metrics are illustrative local data.',\n  'medical-profile':\n    'A fictional patient workspace with steps, sleep, linked activity days and rings, important alerts and local patient records.',\n  calendar:\n    'A month calendar with local appointment creation, event overflow, anchored meeting details, participants, reminders and keyboard day navigation.',\n  'project-board':\n    'A kanban workspace with drag and keyboard movement, sorting, project filters, rich ticket properties, resources, comments and data-backed token history.',\n  'chat-starter':\n    'A local chat starter with conversation history, a reusable composer, pending and stopped states, and copy actions. No AI provider is connected.',\n  'multi-agent-chat':\n    'A workspace with separate local agent threads, history search, agent preferences and reusable composer controls. Conversations are illustrative local workflows.',\n  'ai-chat':\n    'A conversation interface with model and permission controls, attachments, local history and response actions. Replies are illustrative rather than provider inference.',\n  'ai-image-generation':\n    'An image studio with prompt presets, a curated example gallery, image preview, local history and export. Generation controls do not call an image provider.',\n  'ai-profile':\n    'An editable contributor profile with token and activity histories, monthly navigation, agent records and project activity.',\n};\nexport const templateDocNames: Record<string, string> = {\n  dashboard: 'Home dashboard',\n  hr: 'HR management',\n  finance: 'Finance dashboard',\n  marketing: 'Marketing dashboard',\n  'medical-profile': 'Medical profile',\n  calendar: 'Calendar',\n  'project-board': 'Project board',\n  'chat-starter': 'Chat starter',\n  'multi-agent-chat': 'Multi-agent chat',\n  'ai-chat': 'AI chat',\n  'ai-image-generation': 'AI image generation',\n  'ai-profile': 'AI profile',\n};\n",
  "src/template-foundation.css": "/* Helios application example layouts, composed from the Figma source frames. */\n.hx-root{--hx-text:#171717;--hx-muted:#737373;--hx-line:#e5e5e5;--hx-surface:#fff;--hx-soft:#fafafa;background:var(--hx-surface);color:var(--hx-text);font-family:Inter,system-ui,sans-serif;font-size:14px;line-height:1.45;min-height:100dvh;display:grid;grid-template-columns:280px minmax(0,1fr);position:relative}.hx-root *{box-sizing:border-box}.hx-root [hidden]{display:none!important}.hx-root button,.hx-root input,.hx-root select,.hx-root textarea{font:inherit}.hx-root button{cursor:pointer}.hx-root button:disabled{opacity:.4;cursor:default}.hx-root button:focus-visible,.hx-root input:focus-visible,.hx-root select:focus-visible,.hx-root textarea:focus-visible,.hx-root a:focus-visible{outline:3px solid #00ced160;outline-offset:3px}.hx-icon{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}.hx-example-bar{grid-column:1/-1;display:flex;justify-content:space-between;align-items:center;gap:12px;height:48px;padding:0 24px;border-bottom:1px solid var(--hx-line);background:var(--hx-soft);font-size:11px;z-index:5}.hx-example-bar>a{display:flex;align-items:center;gap:6px;color:var(--hx-muted);white-space:nowrap}.hx-example-bar .hx-icon{width:14px;height:14px}.hx-example-bar select{padding:6px 27px 6px 10px;border:1px solid var(--hx-line);border-radius:6px;background:var(--hx-surface);color:var(--hx-text);max-width:420px;font-size:11px}.hx-sidebar{position:sticky;top:0;height:calc(100dvh - 48px);border-right:1px solid var(--hx-line);padding:24px 16px;display:flex;flex-direction:column}.hx-brand{font-size:20px;font-weight:600;letter-spacing:-.04em;color:var(--hx-text);text-decoration:none}.hx-sidebar .hx-brand{padding:0 0 24px}.hx-side-search,.hx-search,.hx-icon-input{display:flex;align-items:center;gap:8px;border:1px solid #d4d4d4;border-radius:8px;background:var(--hx-surface);padding:7px 10px;color:var(--hx-muted);box-shadow:0 1px 2px #00000006}.hx-side-search{margin-bottom:18px}.hx-side-search .hx-icon,.hx-search .hx-icon,.hx-icon-input .hx-icon{width:17px;height:17px}.hx-side-search input,.hx-search input,.hx-icon-input input{border:0;outline:none;background:transparent;min-width:0;width:100%;font-size:12px!important;color:var(--hx-text);padding:0!important;box-shadow:none!important}.hx-side-search kbd{font-size:10px;white-space:nowrap;color:#a3a3a3}.hx-sidebar nav{display:grid;gap:4px}.hx-sidebar nav>button,.hx-sidebar-bottom>button,.hx-sidebar-bottom>a:not(.hx-back){border:0;background:transparent;padding:9px 12px;border-radius:6px;display:flex;align-items:center;gap:12px;text-align:left;color:#404040;font-size:13px;font-weight:500}.hx-sidebar nav>button[aria-current=page],.hx-sidebar nav>button:hover{background:#f5f5f5;color:#171717}.hx-sidebar nav>button small{margin-left:auto;font-size:11px;color:var(--hx-muted)}.hx-sidebar-bottom{margin-top:auto;display:grid;gap:4px}.hx-back{font-size:11px;color:#008e91;padding:10px 12px}.hx-user{display:flex;align-items:center;gap:10px;border:1px solid var(--hx-line);border-radius:8px;padding:10px;margin-top:10px}.hx-user span{display:grid;gap:3px;min-width:0}.hx-user strong{font-size:12px;font-weight:500}.hx-user small{font-size:11px;color:var(--hx-muted)}.hx-avatar{width:32px;height:32px;object-fit:cover;object-position:center;border-radius:50%;display:block;flex-shrink:0;background:#e8ece9}.hx-avatar.large{width:48px;height:48px}.hx-avatar.xl{width:96px;height:96px;border:4px solid #fff}.hx-main{min-width:0;width:100%;margin:0;max-width:none!important;padding:32px!important;min-height:calc(100dvh - 48px)!important}.hx-page-title{display:flex;justify-content:space-between;align-items:center;gap:16px;margin-bottom:25px}.hx-page-title h1,.hx-welcome h1{font-size:22px;line-height:30px;font-weight:600;letter-spacing:-.03em;margin:0}.hx-page-title p,.hx-welcome p{margin:5px 0 0;font-size:14px;color:#525252}.hx-page-title>div:last-child{display:flex;gap:8px}.hx-page-title>div:first-child:has(h1){display:block}.hx-button{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:36px;border:1px solid #d4d4d4;border-radius:8px;padding:7px 12px;background:var(--hx-surface);color:#404040;font-weight:600;font-size:12px!important;box-shadow:0 1px 2px #00000007;white-space:nowrap}.hx-button .hx-icon{width:17px;height:17px}.hx-button.primary{background:#00c4c9;border-color:#00c4c9;color:white;box-shadow:inset 0 -2px 0 #00000008,0 1px 2px #0000000d}.hx-button:hover{background:#fafafa}.hx-button.primary:hover{background:#00adb4}.hx-controls{display:flex;justify-content:space-between;align-items:center;gap:20px;margin:0 0 30px}.hx-controls>div:last-child:not(.hx-periods){display:flex;gap:10px}.hx-periods{display:flex;border:1px solid var(--hx-line);background:var(--hx-soft);border-radius:7px;padding:2px;flex-shrink:0;max-width:100%;overflow:auto}.hx-periods button{border:0;background:transparent;padding:6px 11px;border-radius:5px;color:#404040;font-size:12px;font-weight:600;white-space:nowrap}.hx-periods button[aria-pressed=true]{background:white;box-shadow:0 1px 3px #0002}.hx-membership-chart{display:grid;grid-template-columns:192px minmax(0,1fr) 240px;gap:32px;margin-bottom:28px}.hx-metric{min-width:0}.hx-metric>span{font-size:13px;color:#525252;display:block;margin-bottom:7px}.hx-metric>div{display:flex;align-items:center;gap:9px;flex-wrap:wrap}.hx-metric strong{font-size:32px;line-height:38px;font-weight:600;letter-spacing:-.04em;color:var(--hx-text)}.hx-metric small{font-size:11px;font-weight:500;color:#17b26a;white-space:nowrap}.hx-membership-stats{display:grid;gap:20px}.hx-membership-stats strong{font-size:28px;line-height:34px}.hx-line-chart{height:200px;position:relative;color:#00b7bc}.hx-grid-lines{position:absolute;inset:0;display:flex;flex-direction:column;justify-content:space-between}.hx-grid-lines i{height:1px;background:var(--hx-line);width:100%}.hx-line-chart svg{position:relative;width:100%;height:100%;overflow:visible}.hx-line-path{transition:transform .35s;transform-origin:center}.hx-months{display:flex;justify-content:space-between;gap:4px;color:#737373;font-size:10px;margin-top:9px}.hx-membership-columns{display:grid;grid-template-columns:minmax(0,1fr) 240px;gap:32px}.hx-section-heading{display:flex;align-items:center;justify-content:space-between;gap:12px;border-bottom:1px solid var(--hx-line);padding:0 0 18px;margin:0 0 20px;min-height:40px}.hx-section-heading h2,.hx-members-list h2{font-size:16px;font-weight:600;letter-spacing:-.02em;line-height:24px;margin:0}.hx-section-heading h2 span{font-size:11px;color:var(--hx-muted);font-weight:400;margin-left:5px}.hx-section-heading>a{font-size:12px;color:#008e91}.hx-section-heading .hx-button{border:0;box-shadow:none}.hx-create-cards{display:grid;grid-template-columns:1fr 1fr;gap:24px;margin-bottom:30px}.hx-create-cards .hx-button{justify-content:start;padding:14px;text-align:left;white-space:normal;min-height:78px;gap:12px;border-color:var(--hx-line)}.hx-create-cards .hx-icon{width:40px;height:40px;padding:9px;border:1px solid #d4d4d4;border-radius:8px;box-shadow:0 1px 2px #0001}.hx-create-cards .hx-button span{display:grid;gap:5px}.hx-create-cards .hx-button strong{font-size:14px;font-weight:600}.hx-create-cards .hx-button small{font-size:12px;color:#737373;font-weight:400}.hx-post-grid{display:grid;grid-template-columns:1fr 1fr;gap:24px}.hx-post-grid article{min-width:0;text-align:left}.hx-post-image{display:block;width:100%;aspect-ratio:384/256;object-fit:cover;border-radius:12px;margin-bottom:14px}.hx-post-grid article>small{font-size:11px;font-weight:600;color:#008e91}.hx-post-grid article>button{display:flex;align-items:center;justify-content:space-between;gap:10px;border:0;background:transparent;padding:10px 0 0;text-align:left;width:100%;color:var(--hx-text);font-size:16px;font-weight:600}.hx-post-grid p{font-size:13px;line-height:1.6;color:#737373;margin:10px 0}.hx-post-grid article>div{display:flex;gap:7px}.hx-post-grid article>div span{border:1px solid var(--hx-line);border-radius:4px;padding:1px 5px;font-size:10px;color:#525252}.hx-members-list h2{font-size:13px;margin-bottom:15px;font-weight:500}.hx-members-list>div{display:flex;align-items:center;gap:10px;padding:9px 0}.hx-members-list>div span{display:grid;gap:3px}.hx-members-list strong{font-size:12px;font-weight:500}.hx-members-list small{font-size:11px;color:#737373}.hx-members-list>div>i{margin-left:auto;width:6px;height:6px;border-radius:50%;background:#17b26a}.hx-header{height:64px;border-bottom:1px solid var(--hx-line);grid-column:1/-1;display:flex;align-items:center;gap:20px;padding:0 max(32px,calc((100vw - 1280px)/2))}.hx-header nav{display:flex;align-items:center;gap:4px;flex:1}.hx-header nav button{border:0;background:transparent;padding:8px 10px;border-radius:6px;color:#404040;font-size:12px;font-weight:500}.hx-header nav button[aria-current=page]{background:#fafafa;color:#171717}.hx-header>a:not(.hx-brand){font-size:11px;color:#737373;white-space:nowrap}.hx-header>.hx-button{border:0;box-shadow:none;padding:0}.hx-top-navigation{grid-template-columns:1fr}.hx-top-navigation .hx-main{max-width:1280px!important;margin:auto}.hx-welcome{display:flex;align-items:center;justify-content:space-between;gap:20px;margin-bottom:24px}.hx-welcome>div{display:flex;align-items:center;gap:12px}.hx-welcome h1{font-size:24px}.hx-welcome p{font-size:13px}.hx-search{max-width:280px;height:36px}.hx-business-metrics{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:24px;margin-bottom:24px}.hx-business-metrics article{border:1px solid var(--hx-line);border-radius:10px;overflow:hidden}.hx-business-metrics header{padding:14px 16px;background:#fafafa;font-size:14px;border-bottom:1px solid var(--hx-line)}.hx-business-metrics .hx-metric{padding:18px 16px 0}.hx-business-metrics img{width:calc(100% - 32px);height:64px;display:block;object-fit:fill;margin:15px 16px 16px}.hx-bordered-chart{border:1px solid var(--hx-line);border-radius:10px;padding:20px;margin-bottom:24px}.hx-bordered-chart .hx-section-heading{border:0;padding:0;margin-bottom:15px}.hx-bordered-chart .hx-line-chart{height:260px}.hx-root select:not(.hx-example-bar select){border:1px solid #d4d4d4;background:var(--hx-surface);color:#404040;border-radius:6px;padding:7px 10px;font-size:12px;min-width:0}.hx-table-card{border:1px solid var(--hx-line);border-radius:10px;overflow:hidden}.hx-table-card .hx-section-heading{padding:18px 20px;margin:0;border-bottom:0}.hx-table-scroll{overflow-x:auto}.hx-table-card table{width:100%;border-collapse:collapse;text-align:left;white-space:nowrap;font-size:12px}.hx-table-card th{font-size:11px;color:#737373;background:#fafafa;font-weight:500}.hx-table-card th,.hx-table-card td{padding:18px 16px;border-bottom:1px solid var(--hx-line)}.hx-table-card th button{border:0;background:transparent;color:inherit;font-size:inherit;padding:0}.hx-table-card td strong{display:block;font-weight:500;font-size:12px;color:#404040}.hx-table-card td small{display:block;font-size:12px;color:#737373;margin-top:3px}.hx-table-card input[type=checkbox]{accent-color:#00ced1;width:16px;height:16px}.hx-table-card tbody tr:last-child td{border-bottom:0}.hx-status{display:inline-flex;align-items:center;gap:5px;border:1px solid #d4d4d4;border-radius:6px;font-size:10px;color:#525252;padding:3px 6px}.hx-status:before{content:'';width:5px;height:5px;background:#737373;border-radius:50%}.hx-status.success:before,.hx-status.paid:before{background:#17b26a}.hx-status.declined:before,.hx-status.refunded:before{background:#f04438}.hx-status.pending:before{background:#f79009}.hx-crumb{font-size:11px;color:#525252;display:flex;gap:12px;margin-bottom:25px}.hx-crumb span{color:#a3a3a3}.hx-trade-tabs{display:flex;gap:8px;align-items:center;border-bottom:1px solid var(--hx-line);padding-bottom:16px;margin-bottom:24px}.hx-trade-tabs button{border:1px solid transparent;border-radius:6px;padding:7px 10px;font-size:12px;font-weight:600;color:#525252;background:transparent}.hx-trade-tabs button[aria-selected=true]{border-color:#d4d4d4;background:#fafafa;color:#171717;box-shadow:0 1px 2px #0001}.hx-trade-toolbar{display:flex;justify-content:space-between;gap:15px;margin-bottom:24px}.hx-trade-toolbar>div{display:flex;gap:10px}.hx-select-status{font-size:11px;color:#737373;display:flex;align-items:center;gap:8px}.hx-person{display:flex;align-items:center;gap:10px}.hx-person strong{font-size:12px}.hx-person small{font-size:11px!important}.hx-trades-table td:last-child button{border:0;background:transparent;color:#737373;padding:4px;vertical-align:middle}.hx-trades-table td:last-child .hx-icon{width:15px;height:15px}.hx-table-footer{display:flex;align-items:center;gap:10px;padding:15px 16px;border-top:1px solid var(--hx-line);font-size:12px;color:#525252}.hx-table-footer>div{margin-left:auto;display:flex;gap:8px}.hx-table-footer select{font-size:11px!important}.hx-status-line{font-size:11px;color:#737373;margin:12px 0}.hx-no-results{text-align:center!important;padding:50px!important;color:#737373}.hx-settings-tabs{display:flex;gap:3px;background:#fafafa;border-radius:6px;overflow-x:auto;margin:0 0 30px}.hx-settings-tabs button{border:1px solid transparent;border-radius:6px;padding:6px 9px;background:transparent;white-space:nowrap;color:#404040;font-size:11px}.hx-settings-tabs button[aria-current=page]{border-color:#d4d4d4;background:#fff;box-shadow:0 1px 2px #0001}.hx-setting-heading{display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--hx-line);padding-bottom:24px;gap:16px}.hx-setting-heading h2{font-size:18px;letter-spacing:-.025em;margin:0 0 4px}.hx-setting-heading p{font-size:13px;color:#737373;margin:0}.hx-setting-heading>div:last-child{display:flex;gap:8px}.hx-setting-row{display:grid;grid-template-columns:280px minmax(0,512px);gap:32px;padding:25px 0;border-bottom:1px solid var(--hx-line);font-size:13px}.hx-setting-row>div:first-child strong{font-size:13px;font-weight:500}.hx-setting-row p{font-size:12px;color:#737373;line-height:1.5;margin:4px 0 0}.hx-setting-row>div:last-child{min-width:0}.hx-settings-form input:not([type=file]):not([type=checkbox]),.hx-settings-form textarea,.hx-settings-form select{width:100%;padding:8px 12px!important;min-height:36px;border:1px solid #d4d4d4;border-radius:7px;background:var(--hx-surface);color:#404040;font-size:12px;box-shadow:0 1px 2px #00000006}.hx-settings-form textarea{height:210px;resize:vertical;line-height:1.6;display:block}.hx-settings-form input:invalid:not(:focus){border-color:#d4d4d4}.hx-settings-form:has(:invalid) .hx-setting-row input:user-invalid{border-color:#f04438}.hx-settings-form .hx-icon-input{padding:0 11px}.hx-settings-form .hx-icon-input input{border:0!important;box-shadow:none!important;padding:8px 0!important}.hx-name-fields{display:grid;grid-template-columns:1fr 1fr;gap:20px}.hx-photo-upload{display:flex;gap:24px}.hx-photo-upload>.hx-avatar{width:64px;height:64px}.hx-upload{display:grid;justify-items:center;text-align:center;gap:5px;padding:20px;border:1px solid var(--hx-line);border-radius:10px;position:relative;cursor:pointer;flex:1;background:var(--hx-surface);min-width:0}.hx-upload input{position:absolute;inset:0;opacity:0;width:100%;height:100%;cursor:pointer}.hx-upload>span{display:grid;place-items:center;width:40px;height:40px;border:1px solid #d4d4d4;border-radius:8px;margin-bottom:7px;color:#525252}.hx-upload strong{font-size:12px;color:#008e91;font-weight:600}.hx-upload strong small{font-size:12px;font-weight:400;color:#737373}.hx-upload>small{color:#737373;font-size:10px}.hx-upload:focus-within{outline:3px solid #00ced160;outline-offset:2px}.hx-setting-row>div>small{font-size:11px;display:block;color:#737373;margin-top:8px}.hx-portfolio-files{list-style:none;padding:0;margin:14px 0 0;display:grid;gap:10px}.hx-portfolio-files li{display:flex;align-items:start;gap:12px;padding:14px;border:1px solid var(--hx-line);border-radius:8px}.hx-portfolio-files li>span:nth-child(2){flex:1;min-width:0;overflow-wrap:anywhere;display:grid;gap:4px}.hx-portfolio-files strong{font-size:11px;font-weight:500}.hx-portfolio-files small{font-size:10px;color:#737373}.hx-portfolio-files .hx-button{border:0;box-shadow:none;padding:0;min-height:0;color:#737373}.hx-portfolio-files progress{width:100%;height:8px;border-radius:99px;accent-color:#00ced1}.hx-file-icon{display:grid;place-items:center;width:32px;height:38px;border:1px solid var(--hx-line);border-radius:5px;font-size:8px;color:#f04438;font-weight:700;flex-shrink:0}.hx-settings-bottom{display:flex;align-items:center;gap:8px;padding:24px 0}.hx-settings-bottom>p{font-size:11px;color:#737373;margin:0 auto 0 0}.hx-profile-cover{margin:-32px -32px 0;height:240px;overflow:hidden;background:#e9ecfc}.hx-profile-cover>img{display:block;width:100%;height:100%;object-fit:cover}.hx-profile-identity{display:flex;align-items:end;gap:22px;margin-top:-42px;position:relative;margin-bottom:32px;padding:0 25px}.hx-profile-identity small,.hx-profile-identity p{font-size:11px;color:#737373}.hx-profile-identity h1{font-size:25px;letter-spacing:-.04em;margin:4px 0}.hx-profile-identity p{margin:0}.hx-settings-extra{padding:15px 0}.hx-settings-extra h2{font-size:21px}.hx-settings-extra>form{max-width:500px}.hx-settings-extra label,.hx-dialog form>label{display:grid;gap:8px;font-size:12px;margin:16px 0}.hx-settings-extra input,.hx-dialog input,.hx-dialog select,.hx-dialog textarea{border:1px solid #d4d4d4;border-radius:7px;padding:10px 12px;background:var(--hx-surface);color:var(--hx-text);min-width:0}.hx-settings-extra p{color:#737373;font-size:13px;line-height:1.5}.hx-settings-extra .hx-preference{display:flex;justify-content:space-between}.hx-team-list{max-width:600px;border-top:1px solid var(--hx-line);margin:20px 0}.hx-team-list>div{display:flex;gap:15px;align-items:center;border-bottom:1px solid var(--hx-line);padding:15px 0;font-size:12px}.hx-team-list>div span{margin-left:auto;color:#737373}.hx-dialog{border:1px solid var(--hx-line);border-radius:14px;background:var(--hx-surface);color:var(--hx-text);width:min(440px,calc(100% - 32px));padding:26px;box-shadow:0 20px 60px #0002}.hx-dialog::backdrop{background:#10182865;backdrop-filter:blur(3px)}.hx-dialog h2{font-size:20px;letter-spacing:-.03em;margin:0 0 20px}.hx-dialog form>.hx-button{margin:10px 6px 0 0}.hx-dialog p{font-size:14px;line-height:1.6;color:#737373}.hx-toast{position:fixed;bottom:25px;left:50%;transform:translate(-50%,20px);z-index:100;background:#183b34;color:#fff;padding:12px 20px;border-radius:9px;font-size:12px;box-shadow:0 8px 30px #0002;opacity:0;pointer-events:none;transition:opacity .2s,transform .2s;max-width:calc(100% - 32px)}.hx-toast.show{opacity:1;transform:translate(-50%,0)}.hx-preview-viewport{width:100%;height:100%;overflow:hidden;position:relative}.hx-preview-viewport>.hx-root{width:1440px;min-height:960px;transform:scale(var(--hx-preview-scale,.65));transform-origin:top left;pointer-events:none}.hx-preview .hx-sidebar{height:960px;position:static}.hx-preview .hx-main{min-height:960px!important}.hx-preview .hx-header{padding:0 80px}.hx-preview .hx-example-bar{display:none}.template-stage-screen:has(.hx-preview-viewport){border-radius:12px;display:block}.template-stage-screen:has(.hx-preview-viewport)>aside{display:none}.template-stage-screen:has(.hx-preview-viewport)>.stage-content{padding:0;height:100%}.template-stage-window:has(.hx-preview-viewport){height:640px;padding:15px}.template-stage-window[data-device=tablet] .hx-preview-viewport>.hx-root{width:1024px;--hx-preview-scale:.7;grid-template-columns:220px minmax(0,1fr)}.template-stage-window[data-device=mobile] .hx-preview-viewport>.hx-root{width:375px;--hx-preview-scale:.84;grid-template-columns:1fr}.template-stage-window[data-device=mobile] .hx-preview .hx-sidebar{display:none}.template-stage-window[data-device=mobile] .hx-preview .hx-main{padding:16px!important}.template-stage-window[data-device=mobile] .hx-preview .hx-membership-chart{grid-template-columns:1fr}.template-stage-window[data-device=mobile] .hx-preview .hx-membership-stats{grid-template-columns:repeat(3,1fr);gap:12px}.template-stage-window[data-device=mobile] .hx-preview .hx-membership-columns{grid-template-columns:1fr}.template-stage-window[data-device=mobile] .hx-preview .hx-members-list{display:none}.template-stage-window[data-device=mobile] .hx-preview .hx-controls{flex-wrap:wrap}.template-stage-window[data-device=mobile] .hx-preview .hx-business-metrics{grid-template-columns:1fr}.template-stage-window[data-device=mobile] .hx-preview .hx-header{padding:15px}.template-stage-window[data-device=mobile] .hx-preview .hx-header nav{display:none}\n@media(max-width:1200px){.hx-root{grid-template-columns:240px minmax(0,1fr)}.hx-membership-chart{grid-template-columns:145px minmax(0,1fr);gap:24px}.hx-membership-stats{grid-column:1/-1;display:grid;grid-template-columns:repeat(3,1fr)}.hx-membership-columns{grid-template-columns:minmax(0,1fr) 190px;gap:24px}.hx-header{padding:0 32px;gap:15px}.hx-setting-row{grid-template-columns:220px minmax(0,1fr);gap:25px}.hx-business-metrics .hx-metric strong{font-size:26px}.hx-header nav button{padding:7px}}\n@media(max-width:900px){.hx-root{grid-template-columns:200px minmax(0,1fr)}.hx-sidebar{padding:20px 12px}.hx-main{padding:25px!important}.hx-sidebar nav>button{font-size:12px;padding:9px 7px;gap:9px}.hx-membership-columns{grid-template-columns:1fr}.hx-members-list{display:none}.hx-create-cards{gap:12px}.hx-create-cards .hx-button{padding:12px;gap:9px}.hx-create-cards .hx-button strong{font-size:12px}.hx-create-cards .hx-button small{font-size:10px}.hx-create-cards .hx-icon{width:32px;height:32px;padding:7px}.hx-metric strong{font-size:27px}.hx-header{padding:0 25px;gap:12px}.hx-header nav{gap:0}.hx-header nav button{font-size:11px;padding:7px}.hx-header>a:not(.hx-brand){display:none}.hx-setting-row{grid-template-columns:180px minmax(0,1fr);gap:20px}.hx-settings-tabs button{padding:6px;font-size:10px}.hx-business-metrics{gap:12px}.hx-business-metrics .hx-metric strong{font-size:22px}.hx-welcome .hx-search{max-width:190px}.hx-profile-cover{margin:-25px -25px 0}}\n@media(max-width:700px){.hx-root{grid-template-columns:1fr}.hx-example-bar{padding:0 15px;gap:8px}.hx-example-bar>a:last-child{font-size:0}.hx-example-bar>a:last-child .hx-icon{font-size:12px;display:block}.hx-example-bar select{max-width:230px;font-size:10px}.hx-sidebar{height:auto;position:static;padding:16px;border-right:0;border-bottom:1px solid var(--hx-line)}.hx-sidebar .hx-brand{padding:0;font-size:18px}.hx-sidebar .hx-side-search,.hx-sidebar nav,.hx-sidebar-bottom{display:none}.hx-main{padding:24px 16px!important}.hx-page-title h1,.hx-welcome h1{font-size:20px}.hx-controls{flex-wrap:wrap;gap:15px;margin-bottom:24px}.hx-controls>div:last-child:not(.hx-periods){flex-wrap:wrap}.hx-periods button{padding:7px 10px;font-size:11px}.hx-membership-chart{grid-template-columns:1fr;gap:20px}.hx-membership-chart>.hx-metric{display:flex;gap:15px;align-items:center}.hx-membership-chart>.hx-metric>span{margin:0}.hx-membership-stats{grid-column:auto;grid-template-columns:repeat(3,1fr);gap:15px}.hx-membership-stats strong{font-size:22px}.hx-membership-stats .hx-metric>div{gap:3px}.hx-membership-stats .hx-metric>span{font-size:11px}.hx-metric small{font-size:9px}.hx-membership-columns{grid-template-columns:1fr}.hx-post-grid{grid-template-columns:1fr;gap:25px}.hx-post-image{aspect-ratio:343/220}.hx-create-cards{grid-template-columns:1fr;gap:12px}.hx-create-cards .hx-button{padding:16px}.hx-create-cards .hx-button strong{font-size:13px}.hx-create-cards .hx-button small{font-size:12px}.hx-header{height:58px;padding:0 16px;gap:10px}.hx-header .hx-brand{font-size:18px;flex:1}.hx-header nav{display:none}.hx-header>a:not(.hx-brand){display:block;font-size:10px}.hx-header>.hx-button{display:none}.hx-welcome{align-items:start;flex-direction:column}.hx-welcome .hx-search{max-width:none;width:100%}.hx-business-metrics{grid-template-columns:1fr}.hx-business-metrics .hx-metric strong{font-size:30px}.hx-business-metrics img{height:70px}.hx-bordered-chart{padding:16px}.hx-bordered-chart .hx-line-chart{height:200px}.hx-months{font-size:8px;gap:1px}.hx-crumb{font-size:10px;gap:9px;margin-bottom:20px}.hx-page-title{flex-wrap:wrap;align-items:start}.hx-page-title p{font-size:12px}.hx-page-title>.hx-button{min-height:32px}.hx-trade-toolbar{flex-direction:column;gap:12px}.hx-trade-toolbar .hx-search{max-width:none}.hx-trade-toolbar>div{justify-content:space-between;gap:8px}.hx-trade-toolbar .hx-button{font-size:10px!important;padding:7px 9px}.hx-table-card .hx-section-heading{padding:15px}.hx-table-card th,.hx-table-card td{padding:14px 12px}.hx-select-status{font-size:10px}.hx-select-status select{font-size:10px!important;padding:5px!important}.hx-table-footer{padding:12px;gap:6px;flex-wrap:wrap;font-size:10px}.hx-table-footer .hx-button{font-size:10px!important;min-height:30px;padding:4px 8px}.hx-table-footer select{font-size:10px!important;padding:5px!important}.hx-settings-tabs{margin-bottom:25px}.hx-settings-tabs button{font-size:11px;padding:7px 9px}.hx-setting-heading{align-items:start;padding-bottom:20px;gap:10px}.hx-setting-heading h2{font-size:17px}.hx-setting-heading p{font-size:11px}.hx-setting-heading .hx-button{min-height:32px;padding:6px 10px}.hx-setting-row{grid-template-columns:1fr;gap:12px;padding:20px 0}.hx-name-fields{gap:12px}.hx-settings-form input:not([type=file]):not([type=checkbox]),.hx-settings-form textarea,.hx-settings-form select{font-size:13px}.hx-photo-upload{flex-direction:column;gap:15px}.hx-photo-upload>.hx-avatar{width:64px;height:64px}.hx-settings-bottom{flex-wrap:wrap}.hx-settings-bottom p{flex-basis:100%;margin:0 0 10px}.hx-profile-cover{height:170px;margin:-24px -16px 0}.hx-profile-identity{padding:0;gap:15px;margin-top:-35px}.hx-avatar.xl{width:80px;height:80px}.hx-profile-identity h1{font-size:22px}.hx-profile-identity small,.hx-profile-identity p{font-size:10px}.hx-dialog{padding:22px}.hx-section-heading h2{font-size:15px}}\n@media(prefers-reduced-motion:reduce){.hx-root *{transition:none!important;animation:none!important}}\n.hx-profile-projects{display:grid;gap:20px;margin-bottom:20px}.hx-profile-projects img{display:block;width:100%;height:auto;border-radius:6px}.hx-preview-viewport .hx-root{contain:layout style}.hx-root .hx-main{min-width:0}\n.template-stage-screen .hx-sidebar{background:var(--hx-surface);width:auto;min-width:0;display:flex;gap:0;padding:24px 16px}.template-stage-screen .hx-members-list{background:transparent;width:auto;min-width:0;padding:0;display:block}.hx-avatar.initials{display:grid;place-items:center;font-size:11px;color:#525252}.hx-sidebar-feature{position:relative;border-radius:12px;padding:16px;background:#fafafa;margin:14px 0 0;text-align:left}.hx-sidebar-feature>strong{font-size:12px;font-weight:600}.hx-sidebar-feature p{font-size:12px;line-height:1.5;color:#525252;margin:5px 0 12px}.hx-feature-preview{position:relative;border:0;padding:0;background:transparent;width:100%;border-radius:8px;overflow:hidden}.hx-feature-preview img{display:block;width:100%;aspect-ratio:216/121.5;object-fit:cover;border-radius:8px}.hx-feature-preview>span{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:23px;line-height:1;color:#fff;text-shadow:0 1px 4px #0007}.hx-feature-close{position:absolute;right:10px;top:7px;border:0;background:transparent;color:#737373;font-size:18px}.hx-sidebar-feature>div{display:flex;gap:12px;margin-top:11px}.hx-sidebar-feature>div>button{padding:0;border:0;background:transparent;font-size:11px;font-weight:600;color:#525252}.hx-sidebar-feature>div>button:last-child{color:#00a0a3}.hx-root[data-example=\"5\"] .hx-main{max-width:none!important}.hx-root[data-example=\"5\"] .hx-settings-form,.hx-root[data-example=\"5\"] .hx-settings-extra{max-width:640px;margin:auto}.hx-root[data-example=\"5\"] .hx-setting-row{display:block}.hx-root[data-example=\"5\"] .hx-setting-row>div:first-child{margin-bottom:12px}.hx-root[data-example=\"5\"] .hx-profile-identity,.hx-root[data-example=\"5\"] .hx-settings-tabs{max-width:1216px;margin-left:auto;margin-right:auto}.hx-bio-toolbar{display:flex;gap:4px;align-items:center;flex-wrap:wrap;margin-bottom:12px}.hx-bio-toolbar select{width:auto;font-size:11px;padding:6px!important;min-height:32px!important}.hx-bio-toolbar button{border:0;border-radius:5px;background:transparent;color:#737373;padding:6px 9px;font-size:13px}.hx-bio-toolbar button:hover{background:#f5f5f5}.hx-bio-content{min-height:420px;padding:20px;border:1px solid #d4d4d4;border-radius:12px;font-size:16px;line-height:24px;color:var(--hx-text);background:var(--hx-surface);overflow:auto}.hx-portfolio-projects{display:grid;gap:15px}.hx-portfolio-mockup{background:#fafafa;padding:50px;border-radius:8px}.hx-browser-toolbar{display:flex;align-items:center;gap:4px;background:#f5f5f5;border-radius:8px 8px 0 0;padding:8px}.hx-browser-toolbar i{width:4px;height:4px;border-radius:50%;background:#c4c4c4}.hx-browser-toolbar span{font-size:7px;color:#a3a3a3;display:block;border-radius:3px;background:#fff;margin:0 auto;padding:1px 50px}.hx-portfolio-article{padding:45px 25px 0;background:#fff;box-shadow:0 8px 15px #10182812;overflow:hidden;height:300px}.hx-portfolio-article>small{font-size:8px;letter-spacing:.06em;color:#a3a3a3}.hx-portfolio-article>h3{font-size:21px;letter-spacing:-.04em;line-height:1.1;margin:12px 0}.hx-portfolio-article>p{font-size:9px;color:#737373;margin:0 0 20px}.hx-portfolio-article>div{display:grid;grid-template-columns:1fr 1fr;gap:12px}.hx-portfolio-article img{display:block;width:100%;height:170px;object-fit:cover}.hx-portfolio-thumbnails{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}.hx-portfolio-thumbnails i{height:85px;border:1px solid #e5e5e5;border-radius:5px;background-image:var(--hx-profile-cover-image,none);background-size:cover;background-position:center}.hx-post-image{aspect-ratio:400/268}body.dark .hx-sidebar-feature{background:#222}body.dark .hx-sidebar-feature p{color:#a3a3a3}body.dark .hx-bio-toolbar button{color:#a3a3a3}body.dark .hx-bio-toolbar button:hover{background:#333}body.dark .hx-portfolio-mockup{background:#222}@media(max-width:700px){.hx-sidebar-feature{display:none}.hx-portfolio-mockup{padding:25px 20px}.hx-portfolio-article{padding:25px 18px 0;height:220px}.hx-portfolio-article>h3{font-size:17px}.hx-portfolio-article img{height:140px}.hx-browser-toolbar span{padding:1px 25px}.hx-bio-content{min-height:320px;font-size:14px}.hx-portfolio-thumbnails{gap:8px}.hx-portfolio-thumbnails i{height:60px}.hx-root[data-example=\"5\"] .hx-setting-row{padding:20px 0}.hx-sidebar{overflow:hidden}}\n.hx-sales-summary{display:flex;align-items:start;justify-content:space-between;gap:20px;padding:0 0 18px}.hx-sales-summary .hx-metric>div{display:grid;gap:4px}.hx-sales-summary .hx-metric strong{font-size:30px}.hx-sales-summary .hx-metric small{font-size:11px}.hx-daily-sales{display:block;width:100%;height:auto;max-height:245px;min-height:130px;object-fit:fill;transform-origin:center bottom;transition:transform .35s}.hx-order-summary{display:flex;align-items:center;justify-content:space-between;padding:0 20px 24px;gap:20px}.hx-order-summary>div:first-child{display:grid;gap:7px}.hx-order-summary strong{font-size:30px;letter-spacing:-.04em;font-weight:600}.hx-order-summary small{font-size:11px;color:#17b26a}.hx-rating{display:flex;gap:3px;align-items:center}.hx-rating img{width:20px;height:20px;display:block}.hx-orders-table td,.hx-orders-table th{padding:16px 14px}.hx-orders-table th:nth-child(2){width:25%}.hx-orders-table td:last-child button{border:0;background:transparent;color:#737373;font-size:18px}.hx-orders-table .hx-person{gap:10px}#hx-order-selection{font-size:11px;color:#737373}@media(max-width:700px){.hx-sales-summary{flex-direction:column;gap:15px}.hx-order-summary{padding:0 15px 18px;flex-wrap:wrap;gap:15px}.hx-order-summary strong{font-size:27px}.hx-daily-sales{min-height:140px}.hx-sales-summary .hx-metric strong{font-size:26px}}\n",
  "src/templates-react.css": "/* React template adaptations retain the source-backed hx anatomy and asset slots. */\n.hxr-root {\n  --hx-text: var(--hu-text, #171717);\n  --hx-muted: var(--hu-muted, #525252);\n  --hx-line: var(--hu-line, #e5e5e5);\n  --hx-surface: var(--hu-page, var(--color-background-full, #fff));\n  --hx-soft: var(--hu-bg-secondary, #fafafa);\n  min-width: 0;\n  text-align: start;\n}\n/* Header layouts have no sidebar column, including at intermediate widths. */\n.hxr-root.hx-top-navigation {\n  grid-template-columns: minmax(0, 1fr);\n}\n.hxr-root .hx-main {\n  padding: 32px !important;\n}\n.hxr-root .hx-main > div {\n  min-width: 0;\n}\n.hxr-root .hx-button.primary {\n  background: var(--hu-brand, #00ced1);\n  color: var(--hu-on-brand, #102020);\n  border-color: color-mix(in srgb, var(--hu-brand, #00ced1), transparent 25%);\n}\n.hxr-root .hx-button.primary:hover {\n  background: color-mix(in srgb, var(--hu-brand, #00ced1), var(--hu-on-brand, #102020) 8%);\n}\n.hxr-root .hx-button {\n  font-weight: 600;\n}\n.hxr-root .hx-example-bar > .hu-field {\n  width: min(430px, 50%);\n  min-width: 0;\n}\n.hxr-root .hx-example-bar > .hu-field > label {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  width: 1px;\n  height: 1px;\n  overflow: hidden;\n}\n.hxr-root .hx-example-bar .hu-input-wrap {\n  height: 30px;\n}\n.hxr-root .hx-example-bar select {\n  padding: 0;\n  font-size: 11px;\n}\n.hxr-root .hx-example-bar .hu-chevron {\n  inset-inline-end: 9px;\n}\n.hxr-root .hx-header > nav {\n  overflow: auto;\n  scrollbar-width: thin;\n}\n.hxr-root .hx-header > nav button {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  white-space: nowrap;\n}\n.hxr-root .hx-header > nav .hx-icon {\n  width: 16px;\n  height: 16px;\n}\n.hxr-root .hx-sidebar {\n  min-width: 0;\n  width: auto;\n  z-index: 2;\n  background: var(--hx-surface);\n}\n.hxr-root .hx-sidebar nav button {\n  color: var(--hx-muted);\n}\n.hxr-root .hx-sidebar nav button[aria-current='page'] {\n  background: var(--hx-soft);\n  color: var(--hx-text);\n}\n.hxr-root .hx-sidebar .hx-user strong,\n.hxr-root .hx-sidebar .hx-user small {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.hxr-root .hx-sidebar-bottom > a,\n.hxr-root .hx-sidebar-bottom > button {\n  color: var(--hx-muted);\n}\n.hxr-root .hx-sidebar-feature {\n  background: var(--hx-soft);\n}\n.hxr-root .hx-sidebar-feature p {\n  color: var(--hx-muted);\n}\n.hxr-root .hx-controls {\n  flex-wrap: wrap;\n}\n.hxr-root .hx-controls > div:last-child:not(.hx-periods) {\n  flex-wrap: wrap;\n}\n.hxr-root .hx-periods button {\n  color: var(--hx-muted);\n}\n.hxr-root .hx-periods button[aria-pressed='true'] {\n  background: var(--hx-surface);\n  color: var(--hx-text);\n}\n.hxr-root .hx-metric small {\n  color: #15803d;\n}\n.dark .hxr-root .hx-metric small,\n[data-helios-theme='dark'] .hxr-root .hx-metric small {\n  color: #86efac;\n}\n.hxr-root .hx-metric > span,\n.hxr-root .hx-page-title p,\n.hxr-root .hx-welcome p,\n.hxr-root .hx-post-grid p,\n.hxr-root .hx-members-list small {\n  color: var(--hx-muted);\n}\n.hxr-root .hx-post-grid article > small,\n.hxr-root .hx-section-heading > a {\n  color: var(--hu-brand-text, #007274);\n}\n.hxr-root .hx-post-grid article > div span {\n  color: var(--hx-muted);\n}\n.hxr-root .hx-welcome > .hu-field {\n  max-width: 280px;\n}\n.hxr-root .hx-create-cards .hx-button {\n  min-height: 88px;\n}\n.hxr-root .hx-create-cards .hx-button small {\n  color: var(--hx-muted);\n}\n.hxr-root .hx-members-list > div > span:last-of-type {\n  min-width: 0;\n}\n.hxr-root .hx-members-list small {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  max-width: 150px;\n}\n.hxr-chart {\n  min-width: 0;\n  width: 100%;\n}\n.hxr-chart-plot {\n  height: 210px;\n  width: 100%;\n  min-width: 0;\n}\n.hxr-chart-controls {\n  display: flex;\n  gap: 12px;\n  align-items: center;\n  flex-wrap: wrap;\n  margin-top: 12px;\n}\n.hxr-chart-controls > .hu-field {\n  max-width: 145px;\n}\n.hxr-chart-controls > .hu-field > label {\n  font-size: 11px;\n}\n.hxr-chart-controls > p {\n  font-size: 11px;\n  color: var(--hx-muted);\n  margin: 0;\n}\n.hxr-chart-data {\n  font-size: 11px;\n  color: var(--hx-muted);\n  margin-top: 12px;\n}\n.hxr-chart-data summary {\n  cursor: pointer;\n}\n.hxr-table-scroll {\n  overflow: auto;\n  max-width: 100%;\n  margin-top: 12px;\n}\n.hxr-table-scroll table {\n  border-collapse: collapse;\n  width: 100%;\n  min-width: 300px;\n  text-align: start;\n}\n.hxr-table-scroll th,\n.hxr-table-scroll td {\n  padding: 8px;\n  border-bottom: 1px solid var(--hx-line);\n  font-size: 12px;\n}\n.hxr-chart .recharts-wrapper,\n.hxr-chart .recharts-surface {\n  outline: none;\n}\n.hxr-chart .recharts-cartesian-axis-tick-value {\n  font-family: var(--hu-font, Inter, system-ui);\n}\n.hxr-root .hx-membership-chart {\n  grid-template-columns: 150px minmax(0, 1fr) 200px;\n  gap: 24px;\n}\n.hxr-root .hx-membership-chart > .hx-metric strong {\n  font-size: 28px;\n}\n.hxr-root .hx-membership-stats strong {\n  font-size: 27px;\n}\n.hxr-root .hx-membership-stats {\n  gap: 15px;\n}\n.hxr-root .hx-membership-stats .hx-metric > span {\n  margin-bottom: 4px;\n}\n.hxr-root .hx-business-metrics article {\n  min-width: 0;\n}\n.hxr-root .hx-business-metrics .hx-metric strong {\n  font-size: 28px;\n}\n.hxr-root .hx-business-metrics header {\n  color: var(--hx-muted);\n}\n.hxr-root .hx-business-metrics article > img {\n  max-width: 100%;\n}\n.hxr-business-table {\n  margin-top: 30px;\n}\n.hxr-root .hxr-search-external .hu-table-toolbar > .hu-field {\n  display: none;\n}\n.hxr-root .hxr-search-external .hu-table-toolbar {\n  padding: 12px 20px;\n}\n.hxr-root .hxr-search-external .hu-table-toolbar .hu-button {\n  margin-inline-start: 0;\n}\n.hxr-root .hu-table-card {\n  font-size: 13px;\n}\n.hxr-root .hu-table-card td {\n  font-size: 12px;\n}\n.hxr-root .hu-table-card td .hx-person strong {\n  font-size: 12px;\n  font-weight: 500;\n}\n.hxr-root .hu-table-card td .hx-person small {\n  font-size: 11px;\n  color: var(--hx-muted);\n  display: block;\n}\n.hxr-root .hu-table-card .hx-rating img {\n  width: 16px;\n  height: 16px;\n}\n.hxr-root .hu-table-card .hx-person {\n  display: flex;\n  gap: 10px;\n  align-items: center;\n}\n.hxr-root .hu-table-card .hx-avatar {\n  width: 30px;\n  height: 30px;\n}\n.hxr-trade-name {\n  display: grid;\n  gap: 4px;\n}\n.hxr-trade-name strong {\n  font-size: 13px;\n  font-weight: 500;\n}\n.hxr-trade-name small {\n  color: var(--hx-muted);\n  font-size: 11px;\n}\n.hxr-root .hx-trade-toolbar {\n  align-items: flex-end;\n  gap: 20px;\n}\n.hxr-root .hx-trade-toolbar > .hu-field {\n  max-width: 340px;\n}\n.hxr-root .hx-trade-toolbar > div:last-child {\n  display: flex;\n  align-items: flex-end;\n  gap: 12px;\n}\n.hxr-root .hx-trade-toolbar > div:last-child > .hu-field {\n  min-width: 135px;\n}\n.hxr-tab-context {\n  font-size: 12px;\n  color: var(--hx-muted);\n  margin: 0 0 16px;\n}\n.hxr-root .hu-tabs > [role='tabpanel'] {\n  padding-top: 12px;\n}\n.hxr-root .hx-settings-form {\n  max-width: 100%;\n  min-width: 0;\n}\n.hxr-setting-control {\n  min-width: 0;\n}\n.hxr-setting-control > .hu-field > label,\n.hxr-setting-control > .hx-name-fields > .hu-field > label {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n}\n.hxr-setting-control .hu-field .hu-hint {\n  font-size: 12px;\n  line-height: 18px;\n}\n.hxr-root .hx-setting-heading > div:last-child {\n  display: flex;\n  gap: 12px;\n}\n.hxr-root .hx-name-fields {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 20px;\n}\n.hxr-root .hx-settings-form .hu-input-wrap {\n  height: 40px;\n  padding: 0 12px;\n}\n.hxr-root .hx-settings-form .hu-input-wrap input,\n.hxr-root .hx-settings-form .hu-input-wrap select {\n  border: 0;\n  box-shadow: none;\n  min-height: 0;\n  height: 100%;\n  padding: 0;\n  width: 100%;\n  font-size: 14px;\n}\n.hxr-root .hx-settings-form .hu-input-wrap input:focus,\n.hxr-root .hx-settings-form .hu-input-wrap select:focus {\n  outline: 0;\n}\n.hxr-field {\n  display: grid;\n  gap: 6px;\n  font-size: 14px;\n  font-weight: 500;\n}\n.hxr-field textarea {\n  width: 100%;\n  min-height: 130px;\n  padding: 12px;\n  border: 1px solid var(--hu-border, #d4d4d4);\n  border-radius: 8px;\n  background: var(--hx-surface);\n  color: var(--hx-text);\n  resize: vertical;\n  font: inherit;\n  font-weight: 400;\n  line-height: 1.6;\n}\n.hxr-root .hx-settings-form .hxr-upload {\n  padding: 20px;\n  position: relative;\n  cursor: pointer;\n  min-height: 122px;\n}\n.hxr-upload input[type='file'] {\n  position: absolute;\n  inset: 0;\n  width: 100%;\n  height: 100%;\n  min-height: 0 !important;\n  opacity: 0;\n  cursor: pointer;\n}\n.hxr-upload:focus-within {\n  outline: 2px solid var(--hu-brand-text, #007274);\n  outline-offset: 3px;\n}\n.hxr-upload small,\n.hxr-upload strong > small {\n  color: var(--hx-muted);\n}\n.hxr-upload .hx-icon {\n  width: 20px;\n  height: 20px;\n}\n.hxr-error {\n  color: var(--hu-error, #b91c1c);\n  font-size: 12px;\n  line-height: 18px;\n}\n.hxr-root .hx-settings-bottom {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n}\n.hxr-root .hx-settings-bottom > p {\n  margin-inline-end: auto;\n  color: var(--hx-muted);\n  font-size: 12px;\n}\n.hxr-root .hx-portfolio-files li > span:nth-child(2) {\n  min-width: 0;\n}\n.hxr-root .hx-portfolio-files strong {\n  overflow-wrap: anywhere;\n  white-space: normal;\n}\n.hxr-root .hx-portfolio-files small {\n  color: var(--hx-muted);\n  font-size: 11px;\n}\n.hxr-root .hx-portfolio-thumbnails img {\n  height: 85px;\n  width: 100%;\n  object-fit: cover;\n  border-radius: 6px;\n}\n.hxr-root .hx-profile-identity .hx-avatar {\n  border-color: var(--hx-surface);\n}\n.hxr-root .hx-profile-identity p,\n.hxr-root .hx-profile-identity small {\n  color: var(--hx-muted);\n}\n.hxr-settings-tabs > .hu-tabs > [role='tablist'] {\n  gap: 4px;\n  margin-bottom: 24px;\n}\n.hxr-settings-tabs .hu-tabs [role='tab'] {\n  font-size: 12px;\n  padding: 8px 10px;\n}\n.hxr-settings-tabs > .hu-tabs > [role='tabpanel'] {\n  padding: 0;\n}\n.hxr-bio {\n  min-width: 0;\n}\n.hxr-bio-options {\n  display: flex;\n  gap: 12px;\n  margin-bottom: 16px;\n}\n.hxr-bio-options > .hu-field {\n  max-width: 160px;\n}\n.hxr-bio [contenteditable='true'] {\n  font-family: var(--hxr-bio-font, Inter);\n  font-size: var(--hxr-bio-size, 16px);\n  min-height: 280px;\n}\n.hxr-panel-form {\n  display: grid;\n  gap: 20px;\n  max-width: 640px;\n}\n.hxr-panel-form h2 {\n  font-size: 20px;\n  font-weight: 600;\n  line-height: 28px;\n  margin: 0;\n}\n.hxr-panel-form p {\n  margin: 0;\n  color: var(--hx-muted);\n  line-height: 1.6;\n}\n.hxr-plan-options {\n  display: grid;\n  gap: 12px;\n  border: 1px solid var(--hx-line);\n  border-radius: 12px;\n  padding: 20px;\n}\n.hxr-plan-options > label {\n  display: flex;\n  gap: 12px;\n  align-items: center;\n  padding: 12px;\n  border: 1px solid var(--hx-line);\n  border-radius: 8px;\n  cursor: pointer;\n}\n.hxr-plan-options input {\n  width: 18px;\n  height: 18px;\n  accent-color: var(--hu-brand, #00ced1);\n}\n.hxr-plan-options label > span {\n  margin-inline-start: auto;\n  font-size: 13px;\n}\n.hxr-key {\n  overflow-wrap: anywhere;\n  border: 1px solid var(--hx-line);\n  border-radius: 8px;\n  padding: 16px;\n  background: var(--hx-soft);\n  color: var(--hx-text);\n  font-size: 13px;\n}\n.hxr-dialog-form {\n  display: grid;\n  gap: 20px;\n}\n.hxr-detail {\n  display: grid;\n  grid-template-columns: auto 1fr;\n  gap: 12px;\n  font-size: 13px;\n  margin: 0;\n}\n.hxr-detail dt {\n  color: var(--hu-muted, #525252);\n}\n.hxr-detail dd {\n  margin: 0;\n  overflow-wrap: anywhere;\n}\n.hxr-video {\n  width: 100%;\n  border-radius: 8px;\n}\n.hxr-post-reader {\n  display: grid;\n  gap: 20px;\n}\n.hxr-post-reader img {\n  display: block;\n  width: 100%;\n  border-radius: 8px;\n}\n.hxr-post-reader p {\n  font-size: 14px;\n  line-height: 1.7;\n}\n.hxr-status {\n  min-height: 20px;\n  font-size: 12px;\n  color: var(--hx-muted);\n  margin-top: 20px;\n}\n.hxr-note {\n  font-size: 12px;\n  line-height: 1.6;\n  color: var(--hx-muted);\n}\n.hxr-root .hx-status {\n  white-space: nowrap;\n}\n.hxr-root .hx-status.paid,\n.hxr-root .hx-status.success {\n  color: var(--color-status-lime-text);\n  background: var(--color-status-lime-background);\n}\n.hxr-root .hx-status.refunded,\n.hxr-root .hx-status.declined {\n  color: var(--color-status-rose-text);\n  background: var(--color-status-rose-background);\n}\n.hxr-root .hx-status.processing {\n  color: var(--color-status-yellow-text);\n  background: var(--color-status-yellow-background);\n}\n.hxr-root .hx-business-metrics .hx-metric > div {\n  display: grid;\n  gap: 4px;\n}\n.hxr-root .hx-business-metrics .hx-metric small {\n  white-space: normal;\n}\n@media (max-width: 1150px) {\n  .hxr-root .hx-membership-chart {\n    grid-template-columns: 150px minmax(0, 1fr);\n  }\n  .hxr-root .hx-membership-stats {\n    grid-column: 1/-1;\n    grid-template-columns: repeat(3, 1fr);\n  }\n  .hxr-root .hx-membership-columns {\n    grid-template-columns: minmax(0, 1fr) 210px;\n    gap: 24px;\n  }\n  .hxr-root .hx-trade-toolbar {\n    flex-wrap: wrap;\n  }\n  .hxr-root .hx-trade-toolbar > div:last-child {\n    flex-wrap: wrap;\n  }\n  .hxr-root .hx-header {\n    padding-inline: 24px;\n  }\n  .hxr-root .hx-header nav .hx-icon {\n    display: none;\n  }\n}\n@media (max-width: 800px) {\n  .hxr-root {\n    grid-template-columns: 210px minmax(0, 1fr);\n  }\n  .hxr-root .hx-main {\n    padding: 24px !important;\n  }\n  .hxr-root .hx-membership-chart {\n    grid-template-columns: 1fr;\n  }\n  .hxr-root .hx-membership-stats {\n    grid-template-columns: repeat(3, minmax(0, 1fr));\n    gap: 12px;\n  }\n  .hxr-root .hx-membership-columns {\n    grid-template-columns: 1fr;\n  }\n  .hxr-root .hx-members-list {\n    display: grid;\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n    gap: 0 20px;\n  }\n  .hxr-root .hx-members-list > h2 {\n    grid-column: 1/-1;\n  }\n  .hxr-root .hx-welcome {\n    flex-wrap: wrap;\n  }\n  .hxr-root .hx-welcome > .hu-field {\n    max-width: 100%;\n  }\n  .hxr-root .hx-business-metrics {\n    grid-template-columns: 1fr;\n  }\n  .hxr-root .hx-business-metrics article {\n    min-height: 140px;\n  }\n  .hxr-root .hx-business-metrics article > img {\n    max-width: 160px;\n    max-height: 90px;\n  }\n  .hxr-root .hx-header > nav {\n    max-width: 100%;\n  }\n  .hxr-root .hx-header > a:not(.hx-brand) {\n    display: none;\n  }\n}\n@media (max-width: 700px) {\n  .hxr-root {\n    display: block;\n  }\n  .hxr-root .hx-main {\n    padding: 20px !important;\n    min-height: 0 !important;\n  }\n  .hxr-root .hx-sidebar {\n    position: relative;\n    height: auto;\n    padding: 16px 20px;\n    border-inline-end: 0;\n    border-bottom: 1px solid var(--hx-line);\n    display: block;\n    overflow: visible;\n  }\n  .hxr-root .hx-sidebar .hx-brand {\n    display: block;\n    padding: 0 0 16px;\n  }\n  .hxr-root .hx-sidebar nav {\n    display: flex;\n    overflow: auto;\n    gap: 4px;\n  }\n  .hxr-root .hx-sidebar nav > button {\n    white-space: nowrap;\n    padding: 8px;\n    gap: 6px;\n  }\n  .hxr-root .hx-sidebar nav > button > .hx-icon {\n    width: 16px;\n    height: 16px;\n  }\n  .hxr-root .hx-sidebar-bottom {\n    display: none;\n  }\n  .hxr-root .hx-side-search {\n    display: none;\n  }\n  .hxr-root .hx-example-bar {\n    display: flex;\n    height: auto;\n    min-height: 48px;\n    padding: 10px 16px;\n    flex-wrap: wrap;\n    gap: 8px;\n  }\n  .hxr-root .hx-example-bar > .hu-field {\n    width: calc(100% - 100px);\n    flex: 1;\n  }\n  .hxr-root .hx-example-bar > a:last-child {\n    font-size: 10px;\n  }\n  .hxr-root .hx-header {\n    padding: 16px 20px;\n    display: flex;\n    flex-wrap: wrap;\n    gap: 12px;\n    height: auto;\n  }\n  .hxr-root .hx-header > .hx-brand {\n    margin-inline-end: auto;\n  }\n  .hxr-root .hx-header > nav {\n    order: 3;\n    flex-basis: 100%;\n    overflow: auto;\n  }\n  .hxr-root .hx-header .hx-avatar {\n    width: 28px;\n    height: 28px;\n  }\n  .hxr-root .hx-header > nav > button {\n    padding: 8px;\n  }\n  .hxr-root .hx-header .hx-button {\n    min-height: 32px;\n    padding: 4px 8px;\n  }\n  .hxr-root .hx-page-title {\n    align-items: flex-start;\n    flex-wrap: wrap;\n    gap: 14px;\n  }\n  .hxr-root .hx-page-title > div:last-child {\n    flex-wrap: wrap;\n  }\n  .hxr-root .hx-controls {\n    gap: 16px;\n    margin-bottom: 24px;\n  }\n  .hxr-root .hx-controls > div:last-child {\n    max-width: 100%;\n  }\n  .hxr-root .hx-controls .hx-button {\n    font-size: 11px !important;\n    white-space: normal;\n  }\n  .hxr-root .hx-membership-stats .hx-metric strong {\n    font-size: 23px;\n  }\n  .hxr-root .hx-membership-stats .hx-metric > span {\n    font-size: 10px;\n  }\n  .hxr-root .hx-membership-stats .hx-metric small {\n    font-size: 10px;\n    white-space: normal;\n  }\n  .hxr-root .hx-create-cards,\n  .hxr-root .hx-post-grid {\n    grid-template-columns: 1fr;\n  }\n  .hxr-root .hx-members-list {\n    grid-template-columns: 1fr;\n  }\n  .hxr-root .hx-members-list small {\n    max-width: 220px;\n  }\n  .hxr-root .hx-section-heading {\n    flex-wrap: wrap;\n  }\n  .hxr-chart-plot {\n    height: 190px;\n  }\n  .hxr-root .hx-trade-toolbar > div:last-child {\n    max-width: 100%;\n    width: 100%;\n    gap: 16px;\n  }\n  .hxr-root .hx-trade-toolbar > div:last-child > .hu-field {\n    width: 100%;\n    min-width: 0;\n  }\n  .hxr-root .hx-trade-toolbar > div:last-child > .hx-button {\n    white-space: normal;\n  }\n  .hxr-root .hx-name-fields {\n    grid-template-columns: 1fr;\n    gap: 16px;\n  }\n  .hxr-root .hx-setting-row {\n    grid-template-columns: 1fr;\n    display: block;\n  }\n  .hxr-root .hx-setting-row > div:first-child {\n    margin-bottom: 12px;\n  }\n  .hxr-root .hx-setting-heading {\n    display: grid;\n    gap: 16px;\n  }\n  .hxr-root .hx-setting-heading > div:last-child {\n    justify-content: flex-end;\n  }\n  .hxr-root .hx-settings-bottom {\n    flex-wrap: wrap;\n  }\n  .hxr-root .hx-settings-bottom > p {\n    width: 100%;\n  }\n  .hxr-root .hx-photo-upload {\n    display: grid;\n    grid-template-columns: 48px minmax(0, 1fr);\n    gap: 16px;\n  }\n  .hxr-root .hx-photo-upload .hx-avatar {\n    width: 48px;\n    height: 48px;\n  }\n  .hxr-root .hx-settings-form .hxr-upload {\n    padding: 16px 12px;\n    min-width: 0;\n  }\n  .hxr-root .hx-profile-identity {\n    display: flex;\n    flex-wrap: wrap;\n  }\n  .hxr-root .hx-profile-cover {\n    margin-inline: -20px;\n  }\n  .hxr-root .hx-profile-cover img {\n    height: 150px;\n  }\n  .hxr-root .hx-profile-identity .hx-avatar {\n    width: 72px;\n    height: 72px;\n  }\n  .hxr-root .hx-profile-identity h1 {\n    font-size: 22px;\n  }\n  .hxr-root .hx-portfolio-thumbnails img {\n    height: 60px;\n  }\n  .hxr-bio-options {\n    flex-wrap: wrap;\n  }\n  .hxr-bio-options > .hu-field {\n    max-width: calc(50% - 6px);\n  }\n  .hxr-plan-options {\n    padding: 12px;\n  }\n  .hxr-plan-options > label {\n    flex-wrap: wrap;\n    font-size: 12px;\n  }\n  .hxr-plan-options label > span {\n    margin-inline-start: auto;\n  }\n  .hxr-detail {\n    grid-template-columns: 1fr;\n    gap: 6px;\n  }\n  .hxr-root .hx-crumb {\n    font-size: 10px;\n  }\n  .hxr-root .hx-sales-summary {\n    flex-wrap: wrap;\n  }\n}\n@media (prefers-reduced-motion: reduce) {\n  .hxr-root * {\n    animation: none !important;\n    transition: none !important;\n  }\n}\n/* Hardcoded light values in the legacy source anatomy must inherit the live theme. */\n.hxr-root .hx-button {\n  color: var(--hx-text);\n  background: var(--hx-surface);\n  border-color: var(--hu-border);\n}\n.hxr-root .hx-button.primary {\n  color: var(--hu-on-brand, #102020);\n  background: var(--hu-brand);\n}\n.hxr-root .hx-side-search kbd,\n.hxr-root .hx-crumb,\n.hxr-root .hx-setting-heading p,\n.hxr-root .hx-setting-row > div:first-child p,\n.hxr-root .hx-setting-row > .hxr-setting-control > small {\n  color: var(--hx-muted);\n}\n.hxr-root .hx-setting-row > div:first-child strong {\n  color: var(--hx-text);\n}\n.hxr-root .hx-sidebar-feature > div > button {\n  color: var(--hx-muted);\n}\n.hxr-root .hx-sidebar-feature > div > button:last-child {\n  color: var(--hu-brand-text);\n}\n.hxr-root .hx-header nav button {\n  color: var(--hx-muted);\n}\n.hxr-root .hx-header nav button[aria-current='page'] {\n  color: var(--hx-text);\n  background: var(--hx-soft);\n}\n.hxr-root .hx-header > a:not(.hx-brand) {\n  color: var(--hx-muted);\n}\n.hxr-root .hu-input-wrap input,\n.hxr-root .hu-input-wrap select,\n.hxr-root .hx-settings-form .hu-input-wrap input,\n.hxr-root .hx-settings-form .hu-input-wrap select {\n  color: var(--hx-text);\n  background: transparent;\n}\n.hxr-root .hxr-upload > strong {\n  color: var(--hu-brand-text);\n}\n.hxr-root .hx-file-icon {\n  color: var(--hu-error);\n}\n.hxr-root .hx-browser-toolbar > span,\n.hxr-root .hx-portfolio-article > small {\n  color: #525252;\n}\n.hxr-root .hx-portfolio-article,\n.hxr-root .hx-portfolio-article > h3 {\n  color: #171717;\n}\n.hxr-root .hx-rating > small {\n  font-size: 10px;\n  line-height: 16px;\n  color: var(--hx-muted);\n  margin-inline-start: 4px;\n}\n.hxr-root.hx-root .hu-input-wrap select {\n  color: var(--hx-text);\n}\n.hxr-root .hx-business-metrics header {\n  background: var(--hx-soft);\n}\n.hxr-root .hx-periods button[aria-pressed='true'] {\n  color: var(--hu-brand-text);\n}\n.hxr-root.hx-root .hx-controls .hx-periods button[aria-pressed='true'] {\n  color: var(--hu-brand-text);\n}\n\n/* Full canvas and reusable surfaces follow the audited source roles. */\n.hxr-root .hx-card,\n.hxr-root .hx-chart-card,\n.hxr-root .hx-business-metrics article {\n  background: var(--color-background-primary-default);\n}\n.hxr-root .hx-metric small {\n  color: var(--color-status-lime-text);\n}\n/* Data-series roles must remain fixed when the action accent changes. */\n.hxr-root .hx-line-path {\n  stroke: var(--color-chart-1) !important;\n}\n.hxr-root .hx-line-area {\n  fill: var(--color-chart-1) !important;\n}\n.hxr-root .hx-chart-bars > i,\n.hxr-root .hx-chart-bars > span {\n  background: var(--color-chart-1) !important;\n}\n/* Header/sidebar examples use the same audited canvas in both website themes. */\n.hxr-root.hx-root .hx-main { background:var(--hx-surface); color:var(--hx-text); }\n\n/* Inherited direction applies to application chrome; plotted chronology stays LTR. */\n.hxr-root .hx-sidebar { border-right:0; border-left:0; border-inline-end:1px solid var(--hx-line); }\n.hxr-root .hx-sidebar nav > button,\n.hxr-root .hx-sidebar-bottom > button,\n.hxr-root .hx-sidebar-bottom > a,\n.hxr-root .hx-sidebar-feature,\n.hxr-root .hx-table-card th,\n.hxr-root .hx-table-card td { text-align:start; }\n.hxr-root .hx-sidebar nav > button small { margin-left:0; margin-inline-start:auto; }\n.hxr-root .hx-section-heading h2 span { margin-left:0; margin-inline-start:5px; }\n.hxr-root .hx-feature-close { right:auto; inset-inline-end:10px; }\n.hxr-root .hx-membership-chart .recharts-responsive-container,\n.hxr-root .hx-line-chart,\n.hxr-root .hx-months,\n.hxr-root pre { direction:ltr; }\n.hxr-root:dir(rtl) .hx-back [data-ui-icon=\"arrow-left\"],\n.hxr-root:dir(rtl) .hx-example-bar [data-ui-icon=\"arrow-left\"],\n.hxr-root:dir(rtl) .hx-crumb [data-ui-icon=\"chevron-right\"] { transform:scaleX(-1); }\n@media (max-width:700px) { .hxr-root .hx-sidebar { border-inline-end:0; } }\n.hxr-root .hx-create-cards .hx-button,\n.hxr-root .hx-post-grid article,\n.hxr-root .hx-post-grid article > button { text-align:start; }\n.hxr-root .hx-members-list > div > i,\n.hxr-root .hx-table-footer > div,\n.hxr-root .hx-team-list > div span { margin-left:0; margin-inline-start:auto; }\n/* Legacy accent-soft remains light in dark mode. Keep selected segments on the\n   audited primary surface so their theme-aware accent label stays readable. */\n.hxr-root.hx-root .hx-periods button[aria-pressed='true'] {\n  background: var(--color-background-primary-default, var(--hx-surface));\n  color: var(--hu-brand-text);\n}\n",
  "src/theme-transition.ts": "'use client';\nimport { flushSync } from 'react-dom';\n\ntype ThemeTransitionOptions = {\n  element?: HTMLElement | null;\n  origin?: { x: number; y: number } | null;\n  storageKey?: string;\n  onChange?: (dark: boolean) => void;\n};\nlet running = false;\nlet pending: {dark:boolean;options:ThemeTransitionOptions}|null = null;\n\n/** Manual theme change with the public reference's 820ms soft circular reveal. */\nexport async function changeTheme(dark: boolean, options: ThemeTransitionOptions = {}) {\n  if (typeof document === 'undefined') return;\n  if (running) { pending={dark,options}; return; }\n  const apply = () => {\n    document.body.classList.toggle('dark', dark);\n    try { localStorage.setItem(options.storageKey || 'helios-ui-theme', dark ? 'dark' : 'light'); } catch {}\n    options.onChange?.(dark);\n  };\n  if (document.body.classList.contains('dark') === dark) { apply(); return; }\n  const media = matchMedia('(prefers-reduced-motion: reduce)');\n  if (media.matches || !document.startViewTransition) { apply(); return; }\n  const element = options.element || (document.activeElement instanceof HTMLElement ? document.activeElement : null);\n  const rect = (element?.closest('label') || element)?.getBoundingClientRect();\n  const x = Math.max(0, Math.min(innerWidth, options.origin?.x ?? (rect ? rect.x + rect.width / 2 : innerWidth / 2)));\n  const y = Math.max(0, Math.min(innerHeight, options.origin?.y ?? (rect ? rect.y + rect.height / 2 : innerHeight / 2)));\n  const diameter = 2.5 * Math.hypot(Math.max(x, innerWidth - x), Math.max(y, innerHeight - y));\n  const mask = 'url(\"data:image/svg+xml,' + encodeURIComponent('<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 100 100\"><defs><filter id=\"soft\" x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\"><feGaussianBlur stdDeviation=\"2\"/></filter></defs><circle cx=\"50\" cy=\"50\" r=\"42\" fill=\"white\" filter=\"url(#soft)\"/></svg>') + '\")';\n  const style = document.createElement('style');\n  style.dataset.heliosThemeReveal = '';\n  style.textContent = `\n    ::view-transition, ::view-transition-group(root), ::view-transition-image-pair(root), ::view-transition-old(root), ::view-transition-new(root) { pointer-events:none; }\n    ::view-transition-old(root), ::view-transition-new(root) { animation:none; mix-blend-mode:normal; }\n    ::view-transition-new(root) { mask-image:${mask}; -webkit-mask-image:${mask}; mask-repeat:no-repeat; -webkit-mask-repeat:no-repeat; animation:hu-theme-reveal 820ms cubic-bezier(.16,1,.3,1) both; }\n    @keyframes hu-theme-reveal {\n      from { mask-size:0px 0px; -webkit-mask-size:0px 0px; mask-position:${x}px ${y}px; -webkit-mask-position:${x}px ${y}px; }\n      to { mask-size:${diameter}px ${diameter}px; -webkit-mask-size:${diameter}px ${diameter}px; mask-position:${x-diameter/2}px ${y-diameter/2}px; -webkit-mask-position:${x-diameter/2}px ${y-diameter/2}px; }\n    }`;\n  running = true;\n  document.head.appendChild(style);\n  let transition: ViewTransition | undefined;\n  const reduce = () => { if (media.matches) transition?.skipTransition(); };\n  media.addEventListener('change', reduce);\n  try {\n    transition = document.startViewTransition(() => flushSync(apply));\n    await transition.finished;\n  } catch {\n    if (document.body.classList.contains('dark') !== dark) apply();\n  } finally {\n    media.removeEventListener('change', reduce);\n    style.remove();\n    running = false;\n    const next=pending;\n    pending=null;\n    if(next)await changeTheme(next.dark,next.options);\n  }\n}\n",
  "src/useMotionPreference.ts": "'use client';\nimport {useEffect,useState} from 'react';\n/** Keep the first client render identical to SSR, then track the live system preference. */\nexport function useMotionPreference(): boolean | null {\n  const [reduced,setReduced]=useState<boolean|null>(null);\n  useEffect(()=>{\n    const media=window.matchMedia('(prefers-reduced-motion: reduce)');\n    const update=()=>setReduced(media.matches);\n    update();\n    media.addEventListener('change',update);\n    return()=>media.removeEventListener('change',update);\n  },[]);\n  return reduced;\n}\n",
  "package.json": "{\n  \"name\": \"@helios-ui/react\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"description\": \"Local Helios UI React preview package. Not published.\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\"\n    },\n    \"./styles.css\": {\n      \"types\": \"./dist/styles.d.ts\",\n      \"default\": \"./src/styles.css\"\n    }\n  },\n  \"files\": [\n    \"dist/index.js\",\n    \"dist/**/*.d.ts\",\n    \"src\",\n    \"assets\",\n    \"README.md\",\n    \"build.mjs\",\n    \"tsconfig*.json\",\n    \"sources.json\",\n    \"public-props.json\",\n    \"canonical-registry.json\",\n    \"playground.css\",\n    \"package-lock.json\",\n    \"verify-code.mjs\",\n    \"public-assets\"\n  ],\n  \"scripts\": {\n    \"build\": \"node build.mjs\",\n    \"typecheck\": \"tsc -p tsconfig.check.json\",\n    \"verify\": \"node ../scripts/verify-react.mjs\",\n    \"verify:code\": \"node verify-code.mjs\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^19.2.4\",\n    \"react-dom\": \"^19.2.4\"\n  },\n  \"devDependencies\": {\n    \"@types/react\": \"^19.2.17\",\n    \"@types/react-dom\": \"^19.2.3\",\n    \"esbuild\": \"^0.28.1\",\n    \"typescript\": \"^5.9.3\"\n  },\n  \"dependencies\": {\n    \"@internationalized/date\": \"^3.12.4\",\n    \"@remixicon/react\": \"^4.9.0\",\n    \"@tanstack/react-table\": \"^8.21.3\",\n    \"motion\": \"^12.43.0\",\n    \"react-aria-components\": \"^1.22.1\",\n    \"recharts\": \"^3.10.1\",\n    \"tailwind-merge\": \"^3.7.0\",\n    \"zod\": \"^4.6.7\",\n    \"react-aria\": \"^3.53.1\"\n  }\n}\n",
  "README.md": "# Helios UI React\n\nA reusable local React library for the Helios UI showcase. The website runs on Next.js 16 App Router, React 19, TypeScript and Tailwind CSS 4. Components use React Aria, TanStack Table, Motion and Recharts. This package is a private local archive, not a published npm product.\n\nFrom the source checkout at `helios-ui-site/react/`:\n\n```sh\nnpm ci --ignore-scripts\nnpm run build\nnpm run typecheck\nnpm run verify:code\n```\n\nThe build regenerates the ESM export, declarations, browser playground, source JSON, typed metadata, template metadata and downloadable archive. Run `node ../scripts/generate-mcp-catalog.mjs` afterward and restart MCP. The website root's `npm run build` performs this sequence plus the Next.js production build.\n\nInstall the generated archive in a React app:\n\n```sh\nnpm install react@19.2.4 react-dom@19.2.4 ./helios-ui-react-0.1.0.tgz\n```\n\n```tsx\nimport {Button, Input, RichSelect, Checkbox, Tabs, Dialog, DataTable,\n  Calendar, TextEditor, Composer, ModernChart, TemplatePreview,\n  BoardTemplate} from '@helios-ui/react';\nimport '@helios-ui/react/styles.css';\n\nexport default function App() {\n  return <Button onClick={() => console.log('Continue')}>Continue</Button>;\n}\n```\n\nRuntime dependencies are declared in package.json and installed with the archive. The ESM package keeps those dependencies external; the website's browser playground bundle includes its runtime. All public source modules retain a client boundary for Next.js. Inter is the design reference; load it in the host application or use the supplied system sans-serif fallback.\n\n## Template assets\n\nThe archive includes **public-assets/assets/**, **public-assets/react/assets/**, **public-assets/icons.svg** and the favicon. Copy this supplied public asset tree into the consuming application's public directory before using template defaults, preserving the paths. Assets remain ordinary files; the React templates are not screenshot images.\n\nTemplates accept `assetsBase` (default `/assets`) for images/video. They use the `/icons.svg` symbol sprite. If your application already owns those paths, review and relocate them before integrating; the source is editable. The original Figma asset manifest is preserved with the files. `Select` retains the original simple platform-picker API. The canonical BoardUI-shaped select exports `NativeSelect` and the native examples; `RichSelect` remains available for the original advanced library. Source components use the package’s own React Aria context. Use the exported `NativeRangeCalendar` bridge with `NativeMonthPanel` instead of mixing independently installed Aria contexts.\n\n## Theme and behavior\n\nUse `.dark` on an ancestor, or `data-helios-theme=\"dark\"`, for neutral dark tokens. `--accent-color` and `--accent-ink` customize actions; maintain text contrast. The showcase chooses accessible dark/white/black labels for each accent. Reduced motion disables repeating motion and nonessential chart transitions.\n\nAll original 45 families, six original templates and additional public-reference-inspired patterns render actual React exports. FamilyPreview dispatches examples built from named reusable components. State, props, code examples and MCP metadata share the same implementations. Data tables use TanStack Table; the data grid has an actual windowed large-dataset mode. Charts expose a data alternative and consistent period/inspection values.\n\nData, sign-in, chat, search and generation demonstrations are local fixtures unless an application supplies callbacks or services. Components do not grant permissions, persist production data, charge payments, activate OAuth or run inference. Figma links are source relationships; new public-reference adaptations do not claim corresponding Figma masters or Code Connect registration. Figma was not edited during this migration.\n\n\n## Locale and direction\n\n`DirectionProvider` coordinates a `lang`/`dir` region with React Aria locale. The default is `en-IN`; use `locale=\"ar\"` or `locale=\"he\"` for right-to-left content and nest providers for mixed-language regions. `useDirection()` returns `{locale, direction}` for custom portals. Set the host document's language/direction as well, choose fonts with the required glyph coverage, and supply your application's translated labels. The provider does not translate content. Numeric/chart coordinates and chronology keep their semantic order; addresses and code can explicitly retain `dir=\"ltr\"`.\n\n```tsx\nimport {DirectionProvider, Button} from '@helios-ui/react';\n<DirectionProvider locale=\"ar\"><Button>متابعة</Button></DirectionProvider>\n```\n\n## Shared interface icons\n\n`UIIcon` uses the existing `@remixicon/react` dependency (Remix Icon License 1.0). Use the same semantic names across controls and pages; icons inherit `currentColor`. The website sprite is generated from this React family; imported React icons require no sprite host. Provider logos and custom React icon nodes remain supported.\n\n```tsx\nimport {Button, UIIcon} from '@helios-ui/react';\nimport '@helios-ui/react/styles.css';\n\n<Button iconOnly aria-label=\"Close panel\" leadingIcon={<UIIcon name=\"close\" />} />\n<UIIcon name=\"calendar\" size={24} />\n```\n\nUse accessible text or an `aria-label` on icon-only controls. Keep decorative SVGs hidden from assistive technology. For an independently meaningful image, `UIIcon` accepts its own `aria-label`. `uiIconNames` lists all available names.\n\nCanonical pages also expose `SourceChartPreview` and `SourceAgentPreview` fixtures. Production callback APIs such as `SourceComposer`, `AgentProgress`, `Questionnaire`, `TaskList` and `MultiAgentChat` are separately exported. MCP `implementationAPIs` lists their actual props alongside fixture props. New canonical entries keep `figma: null`; upstream BoardUI provenance does not imply a Helios Figma mapping.\n",
  "assets/board-native-agents/creator/provenance.json": "{\n  \"source\": \"https://www.boardui.com/components/agent-creator\",\n  \"scope\": \"Public rendered avatar illustration canvases only; no widget, text, controls or Pro source captured.\",\n  \"baseColor\": \"#f8b193\",\n  \"main\": {\n    \"petal-neutral\": \"petal-neutral.webp\",\n    \"petal-happy\": \"petal-happy.webp\",\n    \"petal-angry\": \"petal-angry.webp\",\n    \"petal-thinking\": \"petal-thinking.webp\",\n    \"petal-shook\": \"petal-shook.webp\",\n    \"petal-curious\": \"petal-curious.webp\",\n    \"petal-wink\": \"petal-wink.webp\",\n    \"petal-sleepy\": \"petal-sleepy.webp\",\n    \"petal-sad\": \"petal-sad.webp\",\n    \"petal-worried\": \"petal-worried.webp\",\n    \"petal-skeptical\": \"petal-skeptical.webp\",\n    \"petal-focused\": \"petal-focused.webp\",\n    \"petal-excited\": \"petal-excited.webp\",\n    \"petal-calm\": \"petal-calm.webp\",\n    \"petal-shy\": \"petal-shy.webp\",\n    \"petal-confused\": \"petal-confused.webp\",\n    \"flower-neutral\": \"flower-neutral.webp\",\n    \"flower-happy\": \"flower-happy.webp\",\n    \"flower-angry\": \"flower-angry.webp\",\n    \"flower-thinking\": \"flower-thinking.webp\",\n    \"flower-shook\": \"flower-shook.webp\",\n    \"flower-curious\": \"flower-curious.webp\",\n    \"flower-wink\": \"flower-wink.webp\",\n    \"flower-sleepy\": \"flower-sleepy.webp\",\n    \"flower-sad\": \"flower-sad.webp\",\n    \"flower-worried\": \"flower-worried.webp\",\n    \"flower-skeptical\": \"flower-skeptical.webp\",\n    \"flower-focused\": \"flower-focused.webp\",\n    \"flower-excited\": \"flower-excited.webp\",\n    \"flower-calm\": \"flower-calm.webp\",\n    \"flower-shy\": \"flower-shy.webp\",\n    \"flower-confused\": \"flower-confused.webp\",\n    \"star-neutral\": \"star-neutral.webp\",\n    \"star-happy\": \"star-happy.webp\",\n    \"star-angry\": \"star-angry.webp\",\n    \"star-thinking\": \"star-thinking.webp\",\n    \"star-shook\": \"star-shook.webp\",\n    \"star-curious\": \"star-curious.webp\",\n    \"star-wink\": \"star-wink.webp\",\n    \"star-sleepy\": \"star-sleepy.webp\",\n    \"star-sad\": \"star-sad.webp\",\n    \"star-worried\": \"star-worried.webp\",\n    \"star-skeptical\": \"star-skeptical.webp\",\n    \"star-focused\": \"star-focused.webp\",\n    \"star-excited\": \"star-excited.webp\",\n    \"star-calm\": \"star-calm.webp\",\n    \"star-shy\": \"star-shy.webp\",\n    \"star-confused\": \"star-confused.webp\",\n    \"heart-neutral\": \"heart-neutral.webp\",\n    \"heart-happy\": \"heart-happy.webp\",\n    \"heart-angry\": \"heart-angry.webp\",\n    \"heart-thinking\": \"heart-thinking.webp\",\n    \"heart-shook\": \"heart-shook.webp\",\n    \"heart-curious\": \"heart-curious.webp\",\n    \"heart-wink\": \"heart-wink.webp\",\n    \"heart-sleepy\": \"heart-sleepy.webp\",\n    \"heart-sad\": \"heart-sad.webp\",\n    \"heart-worried\": \"heart-worried.webp\",\n    \"heart-skeptical\": \"heart-skeptical.webp\",\n    \"heart-focused\": \"heart-focused.webp\",\n    \"heart-excited\": \"heart-excited.webp\",\n    \"heart-calm\": \"heart-calm.webp\",\n    \"heart-shy\": \"heart-shy.webp\",\n    \"heart-confused\": \"heart-confused.webp\",\n    \"cloud-neutral\": \"cloud-neutral.webp\",\n    \"cloud-happy\": \"cloud-happy.webp\",\n    \"cloud-angry\": \"cloud-angry.webp\",\n    \"cloud-thinking\": \"cloud-thinking.webp\",\n    \"cloud-shook\": \"cloud-shook.webp\",\n    \"cloud-curious\": \"cloud-curious.webp\",\n    \"cloud-wink\": \"cloud-wink.webp\",\n    \"cloud-sleepy\": \"cloud-sleepy.webp\",\n    \"cloud-sad\": \"cloud-sad.webp\",\n    \"cloud-worried\": \"cloud-worried.webp\",\n    \"cloud-skeptical\": \"cloud-skeptical.webp\",\n    \"cloud-focused\": \"cloud-focused.webp\",\n    \"cloud-excited\": \"cloud-excited.webp\",\n    \"cloud-calm\": \"cloud-calm.webp\",\n    \"cloud-shy\": \"cloud-shy.webp\",\n    \"cloud-confused\": \"cloud-confused.webp\",\n    \"diamond-neutral\": \"diamond-neutral.webp\",\n    \"diamond-happy\": \"diamond-happy.webp\",\n    \"diamond-angry\": \"diamond-angry.webp\",\n    \"diamond-thinking\": \"diamond-thinking.webp\",\n    \"diamond-shook\": \"diamond-shook.webp\",\n    \"diamond-curious\": \"diamond-curious.webp\",\n    \"diamond-wink\": \"diamond-wink.webp\",\n    \"diamond-sleepy\": \"diamond-sleepy.webp\",\n    \"diamond-sad\": \"diamond-sad.webp\",\n    \"diamond-worried\": \"diamond-worried.webp\",\n    \"diamond-skeptical\": \"diamond-skeptical.webp\",\n    \"diamond-focused\": \"diamond-focused.webp\",\n    \"diamond-excited\": \"diamond-excited.webp\",\n    \"diamond-calm\": \"diamond-calm.webp\",\n    \"diamond-shy\": \"diamond-shy.webp\",\n    \"diamond-confused\": \"diamond-confused.webp\",\n    \"shield-neutral\": \"shield-neutral.webp\",\n    \"shield-happy\": \"shield-happy.webp\",\n    \"shield-angry\": \"shield-angry.webp\",\n    \"shield-thinking\": \"shield-thinking.webp\",\n    \"shield-shook\": \"shield-shook.webp\",\n    \"shield-curious\": \"shield-curious.webp\",\n    \"shield-wink\": \"shield-wink.webp\",\n    \"shield-sleepy\": \"shield-sleepy.webp\",\n    \"shield-sad\": \"shield-sad.webp\",\n    \"shield-worried\": \"shield-worried.webp\",\n    \"shield-skeptical\": \"shield-skeptical.webp\",\n    \"shield-focused\": \"shield-focused.webp\",\n    \"shield-excited\": \"shield-excited.webp\",\n    \"shield-calm\": \"shield-calm.webp\",\n    \"shield-shy\": \"shield-shy.webp\",\n    \"shield-confused\": \"shield-confused.webp\",\n    \"slender-neutral\": \"slender-neutral.webp\",\n    \"slender-happy\": \"slender-happy.webp\",\n    \"slender-angry\": \"slender-angry.webp\",\n    \"slender-thinking\": \"slender-thinking.webp\",\n    \"slender-shook\": \"slender-shook.webp\",\n    \"slender-curious\": \"slender-curious.webp\",\n    \"slender-wink\": \"slender-wink.webp\",\n    \"slender-sleepy\": \"slender-sleepy.webp\",\n    \"slender-sad\": \"slender-sad.webp\",\n    \"slender-worried\": \"slender-worried.webp\",\n    \"slender-skeptical\": \"slender-skeptical.webp\",\n    \"slender-focused\": \"slender-focused.webp\",\n    \"slender-excited\": \"slender-excited.webp\",\n    \"slender-calm\": \"slender-calm.webp\",\n    \"slender-shy\": \"slender-shy.webp\",\n    \"slender-confused\": \"slender-confused.webp\",\n    \"pocket-neutral\": \"pocket-neutral.webp\",\n    \"pocket-happy\": \"pocket-happy.webp\",\n    \"pocket-angry\": \"pocket-angry.webp\",\n    \"pocket-thinking\": \"pocket-thinking.webp\",\n    \"pocket-shook\": \"pocket-shook.webp\",\n    \"pocket-curious\": \"pocket-curious.webp\",\n    \"pocket-wink\": \"pocket-wink.webp\",\n    \"pocket-sleepy\": \"pocket-sleepy.webp\",\n    \"pocket-sad\": \"pocket-sad.webp\",\n    \"pocket-worried\": \"pocket-worried.webp\",\n    \"pocket-skeptical\": \"pocket-skeptical.webp\",\n    \"pocket-focused\": \"pocket-focused.webp\",\n    \"pocket-excited\": \"pocket-excited.webp\",\n    \"pocket-calm\": \"pocket-calm.webp\",\n    \"pocket-shy\": \"pocket-shy.webp\",\n    \"pocket-confused\": \"pocket-confused.webp\"\n  },\n  \"expressions\": {\n    \"neutral\": \"neutral-expression.webp\",\n    \"happy\": \"happy-expression.webp\",\n    \"angry\": \"angry-expression.webp\",\n    \"thinking\": \"thinking-expression.webp\",\n    \"shook\": \"shook-expression.webp\",\n    \"curious\": \"curious-expression.webp\",\n    \"wink\": \"wink-expression.webp\",\n    \"sleepy\": \"sleepy-expression.webp\",\n    \"sad\": \"sad-expression.webp\",\n    \"worried\": \"worried-expression.webp\",\n    \"skeptical\": \"skeptical-expression.webp\",\n    \"focused\": \"focused-expression.webp\",\n    \"excited\": \"excited-expression.webp\",\n    \"calm\": \"calm-expression.webp\",\n    \"shy\": \"shy-expression.webp\",\n    \"confused\": \"confused-expression.webp\"\n  },\n  \"shapes\": {\n    \"petal\": \"petal-shape.webp\",\n    \"flower\": \"flower-shape.webp\",\n    \"star\": \"star-shape.webp\",\n    \"heart\": \"heart-shape.webp\",\n    \"cloud\": \"cloud-shape.webp\",\n    \"diamond\": \"diamond-shape.webp\",\n    \"shield\": \"shield-shape.webp\",\n    \"slender\": \"slender-shape.webp\",\n    \"pocket\": \"pocket-shape.webp\"\n  },\n  \"files\": [\n    {\n      \"name\": \"petal-neutral.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"d8b16b46aa3b71a497a4da88f6aaaace9ef0f6022a5d2cb1f8dbce95e7c6d0de\"\n    },\n    {\n      \"name\": \"petal-happy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"d35a261ce13513d80a21e9f11be6a845ede06cb500f9bd29c0f9e26dfde7ec1d\"\n    },\n    {\n      \"name\": \"petal-angry.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"7adf78634625ab40751a9e6258d2755d8d2a84ddaeaacb802836074fe9dc6895\"\n    },\n    {\n      \"name\": \"petal-thinking.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"b4eac720e551228b6ed4febac6dd277193fe8907f95c56938a322d6d44c8f744\"\n    },\n    {\n      \"name\": \"petal-shook.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"1283f0ee5d51f092d9a0d6cebb17dbbab02b24cb8b14c99277e5d462bafc7a62\"\n    },\n    {\n      \"name\": \"petal-curious.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"01eade10cabd446f701f23b0710f4b25407dae554c63cdc5d26d071e74bda404\"\n    },\n    {\n      \"name\": \"petal-wink.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"50051d394cad4dc47d3a6c698058fec823a214df07804e6e7e6ae7527e1f74f1\"\n    },\n    {\n      \"name\": \"petal-sleepy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"46b5396b4c16c4643c1d271df7adac94773c32b44470facd7fcc1d9c05d43520\"\n    },\n    {\n      \"name\": \"petal-sad.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"cc5070ebcb58a97dfdcbfb6ae9f49467cfa55682c5d1c4f124a8748a27e71d01\"\n    },\n    {\n      \"name\": \"petal-worried.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"1395fa6efdaa3fac68e2a5c5b59e40b8ad597c3a6bb309220b07a354fbad16e0\"\n    },\n    {\n      \"name\": \"petal-skeptical.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"4f8f22a59b3dd1a71c3b448f58dbdc205cfbbb3e2d7afabef35b4d63f52fb113\"\n    },\n    {\n      \"name\": \"petal-focused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"ce0fd29eecfa6ab5fc6b96dcbd6343f82b3d0aa0e3a8746a2fec048a526d767e\"\n    },\n    {\n      \"name\": \"petal-excited.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"3d3d001e9449fbb343d508dc9413211661fa756857b0773987ab492b2f1250d2\"\n    },\n    {\n      \"name\": \"petal-calm.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"f0996ed561b148c6b06d1612e5098502a8ae44eb8f875a288d8a1564faffc8b3\"\n    },\n    {\n      \"name\": \"petal-shy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"ffa84eb2d8258884862644a6865577c02b124a4b0e2213ed500c4f46af7e2fd4\"\n    },\n    {\n      \"name\": \"petal-confused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"a6b8e566d44e7e588df756d58f7cb3e935cfb10123239568f5e77890ca7ba203\"\n    },\n    {\n      \"name\": \"flower-neutral.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"8c17ee876d405680870dbf32589720177b7214f138291ce796b8bb7cbf430833\"\n    },\n    {\n      \"name\": \"flower-happy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"c85b8ad920c1c85636e6006a06a39e24e79bda59fd0085d0b2fabc69b77b6a83\"\n    },\n    {\n      \"name\": \"flower-angry.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"86e96abea5458fba9e4fb4c997bfa167ef59513ab5ee8f1be0c09202f98b9888\"\n    },\n    {\n      \"name\": \"flower-thinking.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"7f50e0d7d35ab48ae21789efeffb5529b1b6c49ca54e4c4595a1463efcc7c464\"\n    },\n    {\n      \"name\": \"flower-shook.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"56bf8438f8a5cd84f34bf3206898042399589b2196c64724be2e505fda704849\"\n    },\n    {\n      \"name\": \"flower-curious.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"5cfb90abc292f051a9049ba2d599085d78c09b608d422a6a8fa9b5bb2d5cf29a\"\n    },\n    {\n      \"name\": \"flower-wink.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"ab0b7fae2ce7b83057b772ec0e7ca9d8e9083dd2a05a884b5e780f69472b2421\"\n    },\n    {\n      \"name\": \"flower-sleepy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"19ff8c9836c111922982b65bd3dcea67bc55c11a753f59ee37b95700a95029df\"\n    },\n    {\n      \"name\": \"flower-sad.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"c18e53eb07af8d8c9e77a539e1413b70a66f03efba6e1beef186f53bbc01d142\"\n    },\n    {\n      \"name\": \"flower-worried.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"88c058aa30e20131a9523ec4d4103f3c75ce2e2d340d45db72d81ec87de56294\"\n    },\n    {\n      \"name\": \"flower-skeptical.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"84bab52c98e02955da2a0f77cba7240de0f3844bd847f8309d18d4bc05da87fd\"\n    },\n    {\n      \"name\": \"flower-focused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"6c45d449853b92ac4668d570df6303f02caba5b404841974f42826864c3fc1fa\"\n    },\n    {\n      \"name\": \"flower-excited.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"c0ab08329902f5d3fb0d57e6e1a5b7b9b4cd6305ca6398863d90af232016a5da\"\n    },\n    {\n      \"name\": \"flower-calm.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"66780e10646028922dbde998f9c798e9b47d47362b60e74e096d48f3c5d3e2f3\"\n    },\n    {\n      \"name\": \"flower-shy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"50ae0812c514d471c48ad51c0db1969ced6ac293203d911b0e227916742c192f\"\n    },\n    {\n      \"name\": \"flower-confused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"bfc480ff197553c765a30c5d7cc1c53bee0645fe16f7c3288ab61d8077b603f1\"\n    },\n    {\n      \"name\": \"star-neutral.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"752785d9dbcc47a9c103122c954e41787f05dd1475f1df305ee3018ff8725776\"\n    },\n    {\n      \"name\": \"star-happy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"a75270520f66d3c48db77b807f0c3a915e5ef5b05f3a3c6d861249a4307f15a5\"\n    },\n    {\n      \"name\": \"star-angry.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"756f1b1466e6070a0dbefd90433ee4a70de0594de4994861b790fba81f3a4c2d\"\n    },\n    {\n      \"name\": \"star-thinking.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"8043e44e5fee1d16bca4540dae5141e6f81c78b79cb4cecf86f609a69f409558\"\n    },\n    {\n      \"name\": \"star-shook.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"bd99694c0b3e290e4728fc9282d014479e0d356e4cc52b53a96a4caf784c050b\"\n    },\n    {\n      \"name\": \"star-curious.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"f60d0e06d12ff1a721a72d4da85ffc7a6355bb20c53f7efdcffca7d0b6d6dcb9\"\n    },\n    {\n      \"name\": \"star-wink.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"5358e4f67ac0469e236e75321512bfea270124309e4e45a7850676612a73747c\"\n    },\n    {\n      \"name\": \"star-sleepy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"7b7339122dd63f8d68a3b8a3f80ba45cea8f5a02ae29821feb37c5c898c7e351\"\n    },\n    {\n      \"name\": \"star-sad.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"4624c9246dd0d79740df9ca2ca3e00e84e33eccc1d18ab985a6c8cb82e2d2345\"\n    },\n    {\n      \"name\": \"star-worried.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"89c9dcd65df4887625f945f3f031a77fb9d7aba636aa3dad118153ee2939b291\"\n    },\n    {\n      \"name\": \"star-skeptical.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"ded654d65a55343c0b3c2a7224d880ece052c0f931270415eefb4521cb5ff4ac\"\n    },\n    {\n      \"name\": \"star-focused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"6df3276ba4b1d5952e4c0b47334e92e253151ad8c8a48b43dd11bbe1026adc2b\"\n    },\n    {\n      \"name\": \"star-excited.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"f424798cec975cfeb2394ea20f75a05c5696346c130605975d003b9d452541aa\"\n    },\n    {\n      \"name\": \"star-calm.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"9d947fa2078f414ecb243c3e88c528290c03f592dc7ce17cfcd4118faf95db25\"\n    },\n    {\n      \"name\": \"star-shy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"37bb8dbc10efa09b39d7b417b9c7c176c1dd79127ab770615cc9bd14cd21b9b7\"\n    },\n    {\n      \"name\": \"star-confused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"7bbd242a8b8fa886c0d65ebbea5c46fb09c45a6599ef168d179da036238637f8\"\n    },\n    {\n      \"name\": \"heart-neutral.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"0f8399208944779abfb5c9d4e3095557cc053fe72cab10083fcc739fc821b2e8\"\n    },\n    {\n      \"name\": \"heart-happy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"2a640e2d787c08e0e7b8c452372293be5495f319e2c105f828e9ab2634d96cb5\"\n    },\n    {\n      \"name\": \"heart-angry.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"9e835cd2069403db16336f3a07d1912ef5de03d17a0f491b5b4608726a4295c3\"\n    },\n    {\n      \"name\": \"heart-thinking.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"6a3fb13ea446fbd29537a1c0ada22a2aac271f13c4500b40f6d9a6fa5ca07f41\"\n    },\n    {\n      \"name\": \"heart-shook.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"7fc423880d9de9b0c43ca28a95d19c88edfee64599736f5ec7d9ad7e9e227f81\"\n    },\n    {\n      \"name\": \"heart-curious.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"0f06781acbd267672b21eb75de8e4a24e59284ddbf54269cd3f0ab77e08c4c1f\"\n    },\n    {\n      \"name\": \"heart-wink.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"a7d3ffef15b71544271d8fe3f31196c36523c45dc7f0534ed69328a72b735bd3\"\n    },\n    {\n      \"name\": \"heart-sleepy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"4fc9dc3e15630b55e3b6ad9ed77adf5fcdbc1f7cf30cc3e20d042aeaa380ddf3\"\n    },\n    {\n      \"name\": \"heart-sad.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"5f0ec82d99f3d0c68ff37432a036ab7161cdc71a803c77990f5d85704f6873e5\"\n    },\n    {\n      \"name\": \"heart-worried.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"8cf597fdb7951694370b86982583972382c66e80991fbbd614c7b582312820ed\"\n    },\n    {\n      \"name\": \"heart-skeptical.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"7b15554a3cb90277e12ef0784b58403477aaa5205988577eb6d51166f6f31064\"\n    },\n    {\n      \"name\": \"heart-focused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"45e0ae49d7880d6d6ea73981ef041014495c8215af0f400de2568594e1b2a511\"\n    },\n    {\n      \"name\": \"heart-excited.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"fe98dc6b7821903d0a9ad68524d6629992ec5b428a936bceba41226ded99ea56\"\n    },\n    {\n      \"name\": \"heart-calm.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"93e1cb32427a0aec8f63c367c96572cce90460cc314d60e7f0d921d97d9fa7c9\"\n    },\n    {\n      \"name\": \"heart-shy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"9606be4361274bd7810e1ec0a25e2c1c00714ff470a5da156d10dbe8339ddbe2\"\n    },\n    {\n      \"name\": \"heart-confused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"11df17ec8a26fb5f0eb2db4b2653cc5680f469a23336131e8d23746394f97a57\"\n    },\n    {\n      \"name\": \"cloud-neutral.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"9d1bb0437e2ee290001f2f947a7c48d71a4f2bbdc7aab1898e0c7ff16aa2400c\"\n    },\n    {\n      \"name\": \"cloud-happy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"5fa569f6a42c76fe2a0cbf84ec73c3e4bd18def4251695caa5438195c8d0bfce\"\n    },\n    {\n      \"name\": \"cloud-angry.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"aad83913243bff2c274c5f27e98bc6f28c5f95729bbdde9fd7915c974e0527d5\"\n    },\n    {\n      \"name\": \"cloud-thinking.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"5b4b4c2897cb93c0ba11ead49202e39ac9303cbcb40c40a3f7aedddc94d55f60\"\n    },\n    {\n      \"name\": \"cloud-shook.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"4e08323a4b5064d59fe0ffa4fdec253a585675919b1261ae56480a484579cf10\"\n    },\n    {\n      \"name\": \"cloud-curious.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"35b59714a8413a2b0672b58531da32169ee9e789a5d72a2b6b4cc3bf6b36f94d\"\n    },\n    {\n      \"name\": \"cloud-wink.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"ca803834f06338b02e38fb9c072f1e606f7c553888256294e278ffc310075505\"\n    },\n    {\n      \"name\": \"cloud-sleepy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"8d84550b4eee4f11de9654ff4187b4391ad45ce898fa08a60b25528041e36b46\"\n    },\n    {\n      \"name\": \"cloud-sad.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"4b5307e09a9171fd16f219bb0c71d80cfa8cc9e72d6b20e68d1cda2d467cd624\"\n    },\n    {\n      \"name\": \"cloud-worried.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"ebc683493e16246afcf8a74b1706851f753d626a44c45629711caf7ab4778a9c\"\n    },\n    {\n      \"name\": \"cloud-skeptical.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"06411254c4b0cc4894fe32c4979592a8f33c4100906381f680274cf38cd84614\"\n    },\n    {\n      \"name\": \"cloud-focused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"427c79255002f3896d4fad4e4a44564028db4bdeb8a7810ee70e440126659884\"\n    },\n    {\n      \"name\": \"cloud-excited.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"e7042865d17302f3c9466bb4a42dfd331b9e1ffd5e09cb0a9307268532cc8e88\"\n    },\n    {\n      \"name\": \"cloud-calm.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"9a60d507c80c605263322339dc40ba3a8bec26e1c2c950206205804fd092fe2a\"\n    },\n    {\n      \"name\": \"cloud-shy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"96a3476c8a70c7b88d6cc46790c797739f4ab059f22e70fbe4844a0a8927d531\"\n    },\n    {\n      \"name\": \"cloud-confused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"3a86bc801c5ec506aa94564d476f8dc5d5854fd029511b3a2a10ab3d912dea7f\"\n    },\n    {\n      \"name\": \"diamond-neutral.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"0be4053273b519b4fba4036862d97a19baaff838b222255e17ef0ad585a057d2\"\n    },\n    {\n      \"name\": \"diamond-happy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"ccd5b68e3751847889fa28591f3dc93190708fc2a564f9147dfd85bf86cb38b7\"\n    },\n    {\n      \"name\": \"diamond-angry.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"38e6480c32f53ea0272a622ff84c60d4f845e861153d6d1bbd803770e249a808\"\n    },\n    {\n      \"name\": \"diamond-thinking.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"ed7554c3fd4a2228bf212131afac8bf17dffa88cf47a99358a98190a55f9b93a\"\n    },\n    {\n      \"name\": \"diamond-shook.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"be7b0e343cb2ce4c1dac39b3b0c083ee6aaa813dac5624e69c5710e3b2095852\"\n    },\n    {\n      \"name\": \"diamond-curious.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"4889b82b549d1321124c1be0cdb71a7183eb1e6a5b85f3ee4aa26378698522ec\"\n    },\n    {\n      \"name\": \"diamond-wink.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"00e26af3ac1ce8dfe30ee45397872694513d6e828cb4ad7618d4253e8cf404a8\"\n    },\n    {\n      \"name\": \"diamond-sleepy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"b0fb0f7a64176d9e4b3865ea700e83c6f6697f90746bbd8c2dbc8f62b34c1746\"\n    },\n    {\n      \"name\": \"diamond-sad.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"35fc4abefb3dafc81071f8b84c20ef3ef997bd548cc9c48db932cbbda1ccc1bc\"\n    },\n    {\n      \"name\": \"diamond-worried.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"c60e0698d062609712f964911982104ef52fa2b2c1d7c9d852b2a8df3abae3f2\"\n    },\n    {\n      \"name\": \"diamond-skeptical.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"f081a33ffb8cb9e518d020e06baeaba236ee7c4d8a9038d6a98e6878fec2f248\"\n    },\n    {\n      \"name\": \"diamond-focused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"d5526702765862a7f1c7d762029936d89716cad9bd100c3557709c9af736b45b\"\n    },\n    {\n      \"name\": \"diamond-excited.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"a79b3ffaed1d4f2049f9ebfb477dc3bdf372aa496346abc59b7e3c0f42312e94\"\n    },\n    {\n      \"name\": \"diamond-calm.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"b44bc1905fa62fd5423fcea917a2fd233e1f78669b1f43bd67e6ce6fb22ebeb3\"\n    },\n    {\n      \"name\": \"diamond-shy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"f0e6c85f4a1d44aa764d4692bbcff5e56b3d87d3d2a48523d14fe4c4dd3cc5a5\"\n    },\n    {\n      \"name\": \"diamond-confused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"1aecff8603a2e406396da30ec13f4c1469fd69ebfbd85ab6d01a5e75b7b7819d\"\n    },\n    {\n      \"name\": \"shield-neutral.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"9715034254f23b261af12bcc709d440b7e2016eaf6a87507723f6d6f1792fcdc\"\n    },\n    {\n      \"name\": \"shield-happy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"9db7577c4b4298d06fc598400191db10833173012afd04ee9a76289f46f6a975\"\n    },\n    {\n      \"name\": \"shield-angry.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"645f70148d060b6de7dc32b0615735c75191db167e441ee49077c77cbf1cc504\"\n    },\n    {\n      \"name\": \"shield-thinking.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"50adf9a276d669fb911b1808b91540dbe37dee7ec6e0520b1b50f85d76834180\"\n    },\n    {\n      \"name\": \"shield-shook.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"b866a16226ea78016bfeb0390b3109a0a85c718ac1cfc51081827165abfcf39e\"\n    },\n    {\n      \"name\": \"shield-curious.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"22b1c45d60073da8344883cc0f0d31e60094a47d28cf2707ea8d51a0925b9a4a\"\n    },\n    {\n      \"name\": \"shield-wink.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"cef03c992f12b2321e442e630a48e4f183768178afbf1ce4669af76e60226444\"\n    },\n    {\n      \"name\": \"shield-sleepy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"a077e7a45c94ce3e4c77f3e93e44eb3a4517ad209df262705880f5880b22664c\"\n    },\n    {\n      \"name\": \"shield-sad.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"598a27c642fed7ade7b6e97e4bb154a31bc99ce65b4fac7bc124d7fac6fad5f9\"\n    },\n    {\n      \"name\": \"shield-worried.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"408f12f08cf2a2067c5118aa22d39fc4b2981e6ea690f81cc5bb545ebe7305c9\"\n    },\n    {\n      \"name\": \"shield-skeptical.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"b12461449b815b56937abb9713d7595b3b1e658d99cdc4db03acf3cf3924a6b9\"\n    },\n    {\n      \"name\": \"shield-focused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"5eaaf96a538e8c63318424a5f6d7731cc762c0c0c7cd548176a05e7a59edca52\"\n    },\n    {\n      \"name\": \"shield-excited.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"de392539de811530c1d40676aeedcad0a4d6456efdf2e46d0d83e1f4095983c1\"\n    },\n    {\n      \"name\": \"shield-calm.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"5ac87b83cc3ddae6fbdf24bf6135a78bcd3902d2da37169ca0c9c9e77ce7291d\"\n    },\n    {\n      \"name\": \"shield-shy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"b16343ca85dc121491cd03ef8881ca83b1509202d729a044e1555f697524a6f5\"\n    },\n    {\n      \"name\": \"shield-confused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"12a7a0a1acd331b2eb021df5bfa6ecaa491f4fa2b83fd13840752e107fe878af\"\n    },\n    {\n      \"name\": \"slender-neutral.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"7ddc141396eb9d5ba3304133f1b0e6f3d5b4e80003dce8a4bd71a44265cd0506\"\n    },\n    {\n      \"name\": \"slender-happy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"c6202c91d572663274dffeeac6f9044dabbaef7493468940cb7bc1fd25426ff4\"\n    },\n    {\n      \"name\": \"slender-angry.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"5c8e2335228b382d2fe08053ddd2453ab5773a089775559954f801c6ee73f98d\"\n    },\n    {\n      \"name\": \"slender-thinking.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"0fa8e11af2f9cb9f3fb96c043663ecb912ee6d087707022e5a9d096d861ada48\"\n    },\n    {\n      \"name\": \"slender-shook.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"1d1aeaf6324b983c08ca6cfc6ed6c5f1e1cab73721324bbd0c1fbd21d904cca6\"\n    },\n    {\n      \"name\": \"slender-curious.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"454eb1fe2222a93a24e008c0f751e37ccf3ffbc9a76efc17b9ccbcdbd42be546\"\n    },\n    {\n      \"name\": \"slender-wink.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"f71e8c8f190091bda7b89d29803217b16e720955884cce94f0f8ccd0f240278a\"\n    },\n    {\n      \"name\": \"slender-sleepy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"2f64a8c4cc4d94fd6d6902d46ccec6556ea34f8bebc4e50195703f80fd0d6878\"\n    },\n    {\n      \"name\": \"slender-sad.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"be470cdbafa627fc361ab1787cf9a14bbc6dba29719dc0de3d22ed2f68d295af\"\n    },\n    {\n      \"name\": \"slender-worried.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"cbb9226cc5396b1620f16df13dd7de3d9dd84354091c7528918ee515195ab66a\"\n    },\n    {\n      \"name\": \"slender-skeptical.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"6a90412030d2128349c5b3aefe9aee6b3546e5e5f8a1c17145cb9bac42fde267\"\n    },\n    {\n      \"name\": \"slender-focused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"7df6fa320bac7cce4a1715061b7f8a9e1cd8cc8cf1715dacb5f6a2370b864a59\"\n    },\n    {\n      \"name\": \"slender-excited.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"d6fb68278afe1dbb91033753890f86ea9b1405e8a97982b37b3f9370a2f90702\"\n    },\n    {\n      \"name\": \"slender-calm.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"0e38993fbb43ac75d557085d9c4aea9e5b9c03486109184dcd775a61c62c5c23\"\n    },\n    {\n      \"name\": \"slender-shy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"5a8e9af89564dcf31548967b0764816439978477232767dac1070d7cc69b5417\"\n    },\n    {\n      \"name\": \"slender-confused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"41ae9c31963af569c5fb71240fd12a4fc526ecb45bce49181791ab5624a1fbe3\"\n    },\n    {\n      \"name\": \"pocket-neutral.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"f0357d95409b063506894769d8c98c6d973e3b35778634be80eb8d86ce15ef59\"\n    },\n    {\n      \"name\": \"pocket-happy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"b4a4c81b53072102e022b6c4afadf565d462d8e213dda1e2cf8f2a4bfaca92bc\"\n    },\n    {\n      \"name\": \"pocket-angry.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"1d5f6f1937f29817bce97b42950c0047f9d90c9886493db3849a8c3ae94d7f68\"\n    },\n    {\n      \"name\": \"pocket-thinking.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"6ed7ab5c858063c7576aab3f040f6befdc79171abc1e1ae4d4ad8ce2cda92bd0\"\n    },\n    {\n      \"name\": \"pocket-shook.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"8e01c06b228b9183a01a5c297aaebba5805761fc4e137a14cf911123b58e3d69\"\n    },\n    {\n      \"name\": \"pocket-curious.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"8880b1e67dfd49344623660ed979027a536a749fc4aba145ed6dcc27915e1fc8\"\n    },\n    {\n      \"name\": \"pocket-wink.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"a409a00f3ae62f12ba4ee526c008341c84773f4e4c02fdf03483029365d7900f\"\n    },\n    {\n      \"name\": \"pocket-sleepy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"e7de1d3c339d3d3c00c13196bf79391a66a935896d7979cdf91ee5a832b9e65a\"\n    },\n    {\n      \"name\": \"pocket-sad.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"3aac1690decb6fea593ee685639bf69f0c823ef77e0dfee2c53dd11c1f044faf\"\n    },\n    {\n      \"name\": \"pocket-worried.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"f3a0ff0c9018f39bf6a93d067b31cf53085f3e09ef2660bb46d232ac11c7d639\"\n    },\n    {\n      \"name\": \"pocket-skeptical.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"c723ae9a6545d39187479529dd99b5bdb432c8c9eb452d87b2e9b4161c3f0890\"\n    },\n    {\n      \"name\": \"pocket-focused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"1736a7477d840b04e0122ae4ce802d70df621abb9b8167d9903a7e64bf900248\"\n    },\n    {\n      \"name\": \"pocket-excited.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"a6607b9bed29ffe8b9b2410d380141c8e8c5f8240fef66fc1fa2d5ec85ad7f71\"\n    },\n    {\n      \"name\": \"pocket-calm.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"b7b350d609bea7e82436390a89eb39654c0dccd1a4fccff3833289037ecef317\"\n    },\n    {\n      \"name\": \"pocket-shy.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"76a0424553d0b56cab63fc9e8478720f14b7ce83bb1334badf1e49b7faf9d3b3\"\n    },\n    {\n      \"name\": \"pocket-confused.webp\",\n      \"width\": 162,\n      \"height\": 162,\n      \"sha256\": \"b150108e145a8b01886c54c4a794da498de479f4f6c029bcbcc2f6597091b1c9\"\n    },\n    {\n      \"name\": \"neutral-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"20dd64f26d57ec9689404992c1cc79ec47d7658bc7cdc0e6a528cafdc62d5874\"\n    },\n    {\n      \"name\": \"happy-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"a29d62ed88daa32c74fcfb554703272a0f22065f4779a0624ca42267a38b1298\"\n    },\n    {\n      \"name\": \"angry-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"3f608cc98039d52c14fa913bd5516ddf026e5fadc0d00a8c0a8b05fdba2edf3e\"\n    },\n    {\n      \"name\": \"thinking-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"13cf6b332e4c47c81c32d4dace7d7931e59cef06c24a1786d6a94f62bf5687c7\"\n    },\n    {\n      \"name\": \"shook-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"62066c591c00dfd4eff26ac4042e42572982cedf25242921447ab4150b2b911e\"\n    },\n    {\n      \"name\": \"curious-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"99ef2efbbf2af76c7926e3d58ecb7c51f432e8436ade7ec82ba208f44b9022c9\"\n    },\n    {\n      \"name\": \"wink-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"3bfdfce813952fcdb23b2de31358cb7f05e1cb3fd7796627d62313e78fd6bc43\"\n    },\n    {\n      \"name\": \"sleepy-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"c89005227bbe168dcf3feb40c2a6a95144a8d7e23cadaec75bb19446da5258ed\"\n    },\n    {\n      \"name\": \"sad-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"ab41d4302da327e0a46e72b83310e6223dac6c726c74ad66c66e71b2d5db05a8\"\n    },\n    {\n      \"name\": \"worried-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"4d8560c8afd909ac3ac386d3ebeb0c7bfd84805ab98e66cf91e41bdc1f0c40e8\"\n    },\n    {\n      \"name\": \"skeptical-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"6ec8169e3464e9a571c01e156c7e89d3b44c8f91fcc5b8eba9d9cd6d08cb1588\"\n    },\n    {\n      \"name\": \"focused-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"373bf328d9f3c749a0b277cfe76f339feb0dadffc742dfd2890e56acad291caf\"\n    },\n    {\n      \"name\": \"excited-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"19b04c72b7fc04b8e5a5f62a3cbda77cd040f0f2862a845fa39dee3f847d298f\"\n    },\n    {\n      \"name\": \"calm-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"4d94333cba3926ad78cdae94b5906a13ddcac585b502cbe21b18d0cf2fd6bdec\"\n    },\n    {\n      \"name\": \"shy-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"1d6ddaf4276a8bde870cfa8297ad3d083b02d6da7a632a75288dca2a147912ff\"\n    },\n    {\n      \"name\": \"confused-expression.webp\",\n      \"width\": 34,\n      \"height\": 34,\n      \"sha256\": \"a5dd7b931cb77ea89baae4372ef31ec96598cfe09c02c4730bc1d84868817d75\"\n    },\n    {\n      \"name\": \"petal-shape.webp\",\n      \"width\": 56,\n      \"height\": 56,\n      \"sha256\": \"15f904f9a047a7d2056eff8431041fe3563badcf6f504d814c3e3257300948f4\"\n    },\n    {\n      \"name\": \"flower-shape.webp\",\n      \"width\": 56,\n      \"height\": 56,\n      \"sha256\": \"60c326ef325901603c61858783681d00da8522e88f9b634fe3cfa47205a24124\"\n    },\n    {\n      \"name\": \"star-shape.webp\",\n      \"width\": 56,\n      \"height\": 56,\n      \"sha256\": \"51f710897458ffb1d61b6f3e07cc1bc3ff747bd0858796420d483668f2b03e30\"\n    },\n    {\n      \"name\": \"heart-shape.webp\",\n      \"width\": 56,\n      \"height\": 56,\n      \"sha256\": \"42f59afb202af43d03b5447734487da0ea5f42a83f70948a8af710e72157323e\"\n    },\n    {\n      \"name\": \"cloud-shape.webp\",\n      \"width\": 56,\n      \"height\": 56,\n      \"sha256\": \"a13517c790ee85393a030411edaeb46d31615c428d3c541d56af27a9ca1083f7\"\n    },\n    {\n      \"name\": \"diamond-shape.webp\",\n      \"width\": 56,\n      \"height\": 56,\n      \"sha256\": \"10a907dd5ebecad04d7c36efc697874a4a1d25407af711d48dd183025be3d9ba\"\n    },\n    {\n      \"name\": \"shield-shape.webp\",\n      \"width\": 56,\n      \"height\": 56,\n      \"sha256\": \"1cbeacb3939bc554ccc1543dd08c3d77628bc770a96f0f591b44f50f5b7063da\"\n    },\n    {\n      \"name\": \"slender-shape.webp\",\n      \"width\": 56,\n      \"height\": 56,\n      \"sha256\": \"71620562d424d6518bafd7cb2f9041af78aebdf7c17971daee2ea5b7db68ba90\"\n    },\n    {\n      \"name\": \"pocket-shape.webp\",\n      \"width\": 56,\n      \"height\": 56,\n      \"sha256\": \"a4e018d73bbba7f7772eda5a8640b22d8f693923463046e49c2522e3a2c96dc3\"\n    }\n  ]\n}\n",
  "assets/board-native/ai-chat/plugin-documents-dark.svg": "<svg width=\"24\" height=\"28\" viewBox=\"0 0 24 28\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<g filter=\"url(#filter0_i_4198_7769)\">\n<path d=\"M4 4.97648C4 3.33261 5.33261 2 6.97648 2H14.5702C15.4041 2 16.1997 2.34981 16.7635 2.96429L17.683 3.96664L18.9319 5.01007C19.6088 5.5756 20 6.4122 20 7.29424V19.0235C20 20.6674 18.6674 22 17.0235 22H6.97648C5.33262 22 4 20.6674 4 19.0235V4.97648Z\" fill=\"#6E6E6E\"/>\n</g>\n<g filter=\"url(#filter1_dd_4198_7769)\">\n<path d=\"M9.06328 14.5944C9.37593 14.5968 9.6288 14.8497 9.63121 15.1624L9.66213 19.1778C9.66455 19.4939 9.92281 19.7522 10.2389 19.7546C10.5551 19.7571 10.8094 19.5028 10.8069 19.1866L10.7716 14.6076C10.7643 13.6593 9.98958 12.8846 9.04125 12.8772C8.09289 12.8699 7.33003 13.6328 7.33732 14.5811L7.37262 19.1602C7.38479 20.7407 8.67597 22.0319 10.2566 22.0441C11.8372 22.0563 13.1086 20.7849 13.0964 19.2043L13.0656 15.2064C13.0631 14.8869 13.3228 14.6273 13.6423 14.6297C13.955 14.6321 14.2078 14.885 14.2102 15.1976L14.2412 19.2131C14.2582 21.4259 12.4782 23.2059 10.2654 23.1889C8.05258 23.1718 6.24493 21.3642 6.22786 19.1513L6.19257 14.5723C6.18038 12.9917 7.45185 11.7203 9.03243 11.7325C10.613 11.7446 11.9042 13.0358 11.9164 14.6164L11.9517 19.1955C11.959 20.1438 11.1961 20.9067 10.2478 20.8994C9.29941 20.8921 8.52469 20.1174 8.51738 19.169L8.48656 15.1712C8.4841 14.8516 8.74375 14.592 9.06328 14.5944Z\" fill=\"white\"/>\n<path d=\"M9.06328 14.5944C9.37593 14.5968 9.6288 14.8497 9.63121 15.1624L9.66213 19.1778C9.66455 19.4939 9.92281 19.7522 10.2389 19.7546C10.5551 19.7571 10.8094 19.5028 10.8069 19.1866L10.7716 14.6076C10.7643 13.6593 9.98958 12.8846 9.04125 12.8772C8.09289 12.8699 7.33003 13.6328 7.33732 14.5811L7.37262 19.1602C7.38479 20.7407 8.67597 22.0319 10.2566 22.0441C11.8372 22.0563 13.1086 20.7849 13.0964 19.2043L13.0656 15.2064C13.0631 14.8869 13.3228 14.6273 13.6423 14.6297C13.955 14.6321 14.2078 14.885 14.2102 15.1976L14.2412 19.2131C14.2582 21.4259 12.4782 23.2059 10.2654 23.1889C8.05258 23.1718 6.24493 21.3642 6.22786 19.1513L6.19257 14.5723C6.18038 12.9917 7.45185 11.7203 9.03243 11.7325C10.613 11.7446 11.9042 13.0358 11.9164 14.6164L11.9517 19.1955C11.959 20.1438 11.1961 20.9067 10.2478 20.8994C9.29941 20.8921 8.52469 20.1174 8.51738 19.169L8.48656 15.1712C8.4841 14.8516 8.74375 14.592 9.06328 14.5944Z\" stroke=\"white\" stroke-width=\"0.25\"/>\n</g>\n<mask id=\"mask0_4198_7769\" style=\"mask-type:alpha\" maskUnits=\"userSpaceOnUse\" x=\"4\" y=\"2\" width=\"16\" height=\"20\">\n<path d=\"M4 4.97648C4 3.33261 5.33261 2 6.97648 2H14.7553C15.4794 2 16.1786 2.26393 16.7221 2.74237L17.8182 3.70732L19.1346 5.03176C19.6889 5.58943 20 6.34376 20 7.13004V19.0235C20 20.6674 18.6674 22 17.0235 22H6.97648C5.33262 22 4 20.6674 4 19.0235V4.97648Z\" fill=\"url(#paint0_linear_4198_7769)\"/>\n</mask>\n<g mask=\"url(#mask0_4198_7769)\">\n<g filter=\"url(#filter2_ddi_4198_7769)\">\n<path d=\"M21.0276 6.26997C21.419 6.59701 21.1877 7.23438 20.6777 7.23438H16.1791C15.5763 7.23438 15.0877 6.74575 15.0877 6.143V2.41606C15.0877 1.95021 15.6338 1.69857 15.9879 2.00124L18.9894 4.56657L21.0276 6.26997Z\" fill=\"#B2B2B2\"/>\n</g>\n</g>\n<defs>\n<filter id=\"filter0_i_4198_7769\" x=\"4\" y=\"2\" width=\"16\" height=\"20\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dy=\"-0.49608\"/>\n<feComposite in2=\"hardAlpha\" operator=\"arithmetic\" k2=\"-1\" k3=\"1\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.52 0\"/>\n<feBlend mode=\"normal\" in2=\"shape\" result=\"effect1_innerShadow_4198_7769\"/>\n</filter>\n<filter id=\"filter1_dd_4198_7769\" x=\"1.06738\" y=\"5.60742\" width=\"18.2988\" height=\"21.707\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dy=\"0.49608\"/>\n<feGaussianBlur stdDeviation=\"0.12402\"/>\n<feComposite in2=\"hardAlpha\" operator=\"out\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.08 0\"/>\n<feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_4198_7769\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dy=\"-1\"/>\n<feGaussianBlur stdDeviation=\"2.5\"/>\n<feComposite in2=\"hardAlpha\" operator=\"out\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.17 0\"/>\n<feBlend mode=\"normal\" in2=\"effect1_dropShadow_4198_7769\" result=\"effect2_dropShadow_4198_7769\"/>\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect2_dropShadow_4198_7769\" result=\"shape\"/>\n</filter>\n<filter id=\"filter2_ddi_4198_7769\" x=\"11.6153\" y=\"0.380902\" width=\"11.0975\" height=\"10.326\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dx=\"-0.24804\" dy=\"0.24804\"/>\n<feGaussianBlur stdDeviation=\"0.12402\"/>\n<feComposite in2=\"hardAlpha\" operator=\"out\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.06 0\"/>\n<feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_4198_7769\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dx=\"-0.992159\" dy=\"0.992159\"/>\n<feGaussianBlur stdDeviation=\"1.2402\"/>\n<feComposite in2=\"hardAlpha\" operator=\"out\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.11 0\"/>\n<feBlend mode=\"normal\" in2=\"effect1_dropShadow_4198_7769\" result=\"effect2_dropShadow_4198_7769\"/>\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect2_dropShadow_4198_7769\" result=\"shape\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dy=\"-0.545688\"/>\n<feComposite in2=\"hardAlpha\" operator=\"arithmetic\" k2=\"-1\" k3=\"1\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.22 0\"/>\n<feBlend mode=\"normal\" in2=\"shape\" result=\"effect3_innerShadow_4198_7769\"/>\n</filter>\n<linearGradient id=\"paint0_linear_4198_7769\" x1=\"12\" y1=\"2\" x2=\"12\" y2=\"22\" gradientUnits=\"userSpaceOnUse\">\n<stop offset=\"0.254043\" stop-color=\"white\"/>\n<stop offset=\"0.730769\" stop-color=\"#FFCAFC\"/>\n<stop offset=\"1\" stop-color=\"#8ABBFF\"/>\n</linearGradient>\n</defs>\n</svg>\n\n",
  "assets/board-native/ai-chat/plugin-documents.svg": "<svg width=\"24\" height=\"24\" viewBox=\"0.000 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<g id=\"documents_icon\">\n<g id=\"Group 25\">\n<g id=\"Rectangle 10\" filter=\"url(#filter1_i_0_1)\">\n<path d=\"M4 4.97648C4 3.33261 5.33261 2 6.97648 2H14.5702C15.4041 2 16.1997 2.34981 16.7635 2.96429L17.683 3.96664L18.9319 5.01007C19.6088 5.5756 20 6.4122 20 7.29424V19.0235C20 20.6674 18.6674 22 17.0235 22H6.97648C5.33262 22 4 20.6674 4 19.0235V4.97648Z\" fill=\"#C0C0C0\"/>\n</g>\n<g id=\"Frame 427322585\">\n<g id=\"Vector\" filter=\"url(#filter2_dd_0_1)\">\n<path d=\"M9.06328 14.5954C9.37593 14.5978 9.6288 14.8507 9.63121 15.1633L9.66213 19.1788C9.66455 19.4949 9.92281 19.7531 10.2389 19.7556C10.5551 19.758 10.8094 19.5037 10.8069 19.1876L10.7716 14.6086C10.7643 13.6602 9.98958 12.8855 9.04125 12.8782C8.09289 12.8709 7.33003 13.6338 7.33732 14.5821L7.37262 19.1612C7.38479 20.7417 8.67597 22.0329 10.2566 22.0451C11.8372 22.0573 13.1086 20.7859 13.0964 19.2053L13.0656 15.2074C13.0631 14.8879 13.3228 14.6282 13.6423 14.6307C13.955 14.6331 14.2078 14.8859 14.2102 15.1986L14.2412 19.2141C14.2582 21.4269 12.4782 23.2069 10.2654 23.1899C8.05258 23.1728 6.24493 21.3652 6.22786 19.1523L6.19257 14.5733C6.18038 12.9927 7.45185 11.7212 9.03243 11.7334C10.613 11.7456 11.9042 13.0368 11.9164 14.6174L11.9517 19.1965C11.959 20.1448 11.1961 20.9076 10.2478 20.9004C9.29941 20.893 8.52469 20.1183 8.51738 19.17L8.48656 15.1721C8.4841 14.8526 8.74375 14.593 9.06328 14.5954Z\" fill=\"white\"/>\n<path d=\"M9.06328 14.5954C9.37593 14.5978 9.6288 14.8507 9.63121 15.1633L9.66213 19.1788C9.66455 19.4949 9.92281 19.7531 10.2389 19.7556C10.5551 19.758 10.8094 19.5037 10.8069 19.1876L10.7716 14.6086C10.7643 13.6602 9.98958 12.8855 9.04125 12.8782C8.09289 12.8709 7.33003 13.6338 7.33732 14.5821L7.37262 19.1612C7.38479 20.7417 8.67597 22.0329 10.2566 22.0451C11.8372 22.0573 13.1086 20.7859 13.0964 19.2053L13.0656 15.2074C13.0631 14.8879 13.3228 14.6282 13.6423 14.6307C13.955 14.6331 14.2078 14.8859 14.2102 15.1986L14.2412 19.2141C14.2582 21.4269 12.4782 23.2069 10.2654 23.1899C8.05258 23.1728 6.24493 21.3652 6.22786 19.1523L6.19257 14.5733C6.18038 12.9927 7.45185 11.7212 9.03243 11.7334C10.613 11.7456 11.9042 13.0368 11.9164 14.6174L11.9517 19.1965C11.959 20.1448 11.1961 20.9076 10.2478 20.9004C9.29941 20.893 8.52469 20.1183 8.51738 19.17L8.48656 15.1721C8.4841 14.8526 8.74375 14.593 9.06328 14.5954Z\" stroke=\"white\" stroke-width=\"0.25\"/>\n</g>\n</g>\n<g id=\"Mask group\">\n<mask id=\"mask0_0_1\" style=\"mask-type:alpha\" maskUnits=\"userSpaceOnUse\" x=\"4\" y=\"2\" width=\"16\" height=\"20\">\n<path id=\"Rectangle 13\" d=\"M4 4.97648C4 3.33262 5.33261 2 6.97648 2H14.7553C15.4794 2 16.1786 2.26393 16.7221 2.74237L17.8182 3.70732L19.1346 5.03176C19.6889 5.58943 20 6.34376 20 7.13004V19.0235C20 20.6674 18.6674 22 17.0235 22H6.97648C5.33262 22 4 20.6674 4 19.0235V4.97648Z\" fill=\"url(#paint0_linear_0_1)\"/>\n</mask>\n<g mask=\"url(#mask0_0_1)\">\n<g id=\"Rectangle 12\" filter=\"url(#filter3_ddi_0_1)\">\n<path d=\"M21.0276 6.26899C21.419 6.59603 21.1877 7.2334 20.6777 7.2334H16.1791C15.5763 7.2334 15.0877 6.74477 15.0877 6.14202V2.41508C15.0877 1.94923 15.6338 1.69759 15.9879 2.00026L18.9894 4.56559L21.0276 6.26899Z\" fill=\"#EFEFEF\"/>\n</g>\n</g>\n</g>\n</g>\n</g>\n<defs>\n<filter id=\"filter0_dd_0_1\" x=\"-24\" y=\"-190\" width=\"377\" height=\"360\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dy=\"4\"/>\n<feGaussianBlur stdDeviation=\"4\"/>\n<feComposite in2=\"hardAlpha\" operator=\"out\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.02 0\"/>\n<feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_0_1\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dy=\"1\"/>\n<feGaussianBlur stdDeviation=\"1\"/>\n<feComposite in2=\"hardAlpha\" operator=\"out\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.04 0\"/>\n<feBlend mode=\"normal\" in2=\"effect1_dropShadow_0_1\" result=\"effect2_dropShadow_0_1\"/>\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect2_dropShadow_0_1\" result=\"shape\"/>\n</filter>\n<filter id=\"filter1_i_0_1\" x=\"4\" y=\"2\" width=\"16\" height=\"20\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dy=\"-0.49608\"/>\n<feComposite in2=\"hardAlpha\" operator=\"arithmetic\" k2=\"-1\" k3=\"1\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.52 0\"/>\n<feBlend mode=\"normal\" in2=\"shape\" result=\"effect1_innerShadow_0_1\"/>\n</filter>\n<filter id=\"filter2_dd_0_1\" x=\"1.06836\" y=\"5.6084\" width=\"18.2988\" height=\"21.707\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dy=\"0.49608\"/>\n<feGaussianBlur stdDeviation=\"0.12402\"/>\n<feComposite in2=\"hardAlpha\" operator=\"out\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.08 0\"/>\n<feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_0_1\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dy=\"-1\"/>\n<feGaussianBlur stdDeviation=\"2.5\"/>\n<feComposite in2=\"hardAlpha\" operator=\"out\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.17 0\"/>\n<feBlend mode=\"normal\" in2=\"effect1_dropShadow_0_1\" result=\"effect2_dropShadow_0_1\"/>\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect2_dropShadow_0_1\" result=\"shape\"/>\n</filter>\n<filter id=\"filter3_ddi_0_1\" x=\"11.6153\" y=\"0.379925\" width=\"11.0975\" height=\"10.326\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dx=\"-0.24804\" dy=\"0.24804\"/>\n<feGaussianBlur stdDeviation=\"0.12402\"/>\n<feComposite in2=\"hardAlpha\" operator=\"out\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.06 0\"/>\n<feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_0_1\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dx=\"-0.992159\" dy=\"0.992159\"/>\n<feGaussianBlur stdDeviation=\"1.2402\"/>\n<feComposite in2=\"hardAlpha\" operator=\"out\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.11 0\"/>\n<feBlend mode=\"normal\" in2=\"effect1_dropShadow_0_1\" result=\"effect2_dropShadow_0_1\"/>\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect2_dropShadow_0_1\" result=\"shape\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dy=\"-0.545688\"/>\n<feComposite in2=\"hardAlpha\" operator=\"arithmetic\" k2=\"-1\" k3=\"1\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.22 0\"/>\n<feBlend mode=\"normal\" in2=\"shape\" result=\"effect3_innerShadow_0_1\"/>\n</filter>\n<linearGradient id=\"paint0_linear_0_1\" x1=\"12\" y1=\"2\" x2=\"12\" y2=\"22\" gradientUnits=\"userSpaceOnUse\">\n<stop offset=\"0.254043\" stop-color=\"white\"/>\n<stop offset=\"0.730769\" stop-color=\"#FFCAFC\"/>\n<stop offset=\"1\" stop-color=\"#8ABBFF\"/>\n</linearGradient>\n</defs>\n</svg>\n",
  "assets/board-native/ai-chat/plugin-spreadsheets.svg": "<svg width=\"24\" height=\"24\" viewBox=\"0.441 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<g id=\"spreadsheets_icon\">\n<g id=\"Group 25\">\n<g id=\"Rectangle 10\" filter=\"url(#filter1_i_0_1)\">\n<path d=\"M4.44141 4.97648C4.44141 3.33261 5.77402 2 7.41788 2H15.0116C15.8455 2 16.6411 2.34981 17.2049 2.96429L18.1244 3.96664L19.3733 5.01007C20.0502 5.5756 20.4414 6.4122 20.4414 7.29424V19.0235C20.4414 20.6674 19.1088 22 17.4649 22H7.41788C5.77402 22 4.44141 20.6674 4.44141 19.0235V4.97648Z\" fill=\"#3392FF\"/>\n</g>\n<g id=\"Frame 427322585\">\n<g id=\"Union\" filter=\"url(#filter2_dd_0_1)\">\n<path d=\"M17.4414 18.0078C17.4414 18.5558 16.9972 19 16.4492 19H8.43356C7.88561 19 7.44141 18.5558 7.44141 18.0078V10.9922C7.44141 10.4442 7.88561 10 8.43357 10H16.4492C16.9972 10 17.4414 10.4442 17.4414 10.9922V18.0078ZM11.4414 17.0078C11.4414 17.5558 11.8856 18 12.4336 18H15.4492C15.9972 18 16.4414 17.5558 16.4414 17.0078V15.9922C16.4414 15.4442 15.9972 15 15.4492 15H12.4336C11.8856 15 11.4414 15.4442 11.4414 15.9922V17.0078ZM8.44141 17.0078C8.44141 17.5558 8.89345 18 9.44141 18C9.98936 18 10.4414 17.5558 10.4414 17.0078V15.9922C10.4414 15.4442 9.98936 15 9.44141 15C8.89345 15 8.44141 15.4442 8.44141 15.9922V17.0078ZM11.4414 13.0078C11.4414 13.5558 11.8856 14 12.4336 14H15.4492C15.9972 14 16.4414 13.5558 16.4414 13.0078V11.9922C16.4414 11.4442 15.9972 11 15.4492 11H12.4336C11.8856 11 11.4414 11.4442 11.4414 11.9922V13.0078ZM8.44141 13.0078C8.44141 13.5558 8.89345 14 9.44141 14C9.98936 14 10.4414 13.5558 10.4414 13.0078V11.9922C10.4414 11.4442 9.98936 11 9.44141 11C8.89345 11 8.44141 11.4442 8.44141 11.9922V13.0078Z\" fill=\"white\"/>\n</g>\n</g>\n<g id=\"Mask group\">\n<mask id=\"mask0_0_1\" style=\"mask-type:alpha\" maskUnits=\"userSpaceOnUse\" x=\"4\" y=\"2\" width=\"17\" height=\"20\">\n<path id=\"Rectangle 13\" d=\"M4.44141 4.97648C4.44141 3.33262 5.77402 2 7.41788 2H15.1967C15.9208 2 16.62 2.26393 17.1635 2.74237L18.2596 3.70732L19.576 5.03176C20.1303 5.58943 20.4414 6.34376 20.4414 7.13004V19.0235C20.4414 20.6674 19.1088 22 17.4649 22H7.41788C5.77402 22 4.44141 20.6674 4.44141 19.0235V4.97648Z\" fill=\"url(#paint0_linear_0_1)\"/>\n</mask>\n<g mask=\"url(#mask0_0_1)\">\n<g id=\"Rectangle 12\" filter=\"url(#filter3_ddi_0_1)\">\n<path d=\"M21.469 6.26899C21.8604 6.59603 21.6291 7.2334 21.1191 7.2334H16.6205C16.0177 7.2334 15.5291 6.74477 15.5291 6.14202V2.41508C15.5291 1.94923 16.0752 1.69759 16.4293 2.00026L19.4308 4.56559L21.469 6.26899Z\" fill=\"#BEDBFF\"/>\n</g>\n</g>\n</g>\n</g>\n</g>\n<defs>\n<filter id=\"filter0_dd_0_1\" x=\"-23.5586\" y=\"-230\" width=\"377\" height=\"360\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dy=\"4\"/>\n<feGaussianBlur stdDeviation=\"4\"/>\n<feComposite in2=\"hardAlpha\" operator=\"out\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.02 0\"/>\n<feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_0_1\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dy=\"1\"/>\n<feGaussianBlur stdDeviation=\"1\"/>\n<feComposite in2=\"hardAlpha\" operator=\"out\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.04 0\"/>\n<feBlend mode=\"normal\" in2=\"effect1_dropShadow_0_1\" result=\"effect2_dropShadow_0_1\"/>\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect2_dropShadow_0_1\" result=\"shape\"/>\n</filter>\n<filter id=\"filter1_i_0_1\" x=\"4.44141\" y=\"2\" width=\"16\" height=\"20\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dy=\"-0.49608\"/>\n<feComposite in2=\"hardAlpha\" operator=\"arithmetic\" k2=\"-1\" k3=\"1\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.52 0\"/>\n<feBlend mode=\"normal\" in2=\"shape\" result=\"effect1_innerShadow_0_1\"/>\n</filter>\n<filter id=\"filter2_dd_0_1\" x=\"0.000211239\" y=\"2.5588\" width=\"24.8824\" height=\"23.8824\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dy=\"0.49608\"/>\n<feGaussianBlur stdDeviation=\"0.12402\"/>\n<feComposite in2=\"hardAlpha\" operator=\"out\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0\"/>\n<feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_0_1\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset/>\n<feGaussianBlur stdDeviation=\"3.7206\"/>\n<feComposite in2=\"hardAlpha\" operator=\"out\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.24 0\"/>\n<feBlend mode=\"normal\" in2=\"effect1_dropShadow_0_1\" result=\"effect2_dropShadow_0_1\"/>\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect2_dropShadow_0_1\" result=\"shape\"/>\n</filter>\n<filter id=\"filter3_ddi_0_1\" x=\"12.0567\" y=\"0.379925\" width=\"11.0975\" height=\"10.326\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dx=\"-0.24804\" dy=\"0.24804\"/>\n<feGaussianBlur stdDeviation=\"0.12402\"/>\n<feComposite in2=\"hardAlpha\" operator=\"out\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.06 0\"/>\n<feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_0_1\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dx=\"-0.992159\" dy=\"0.992159\"/>\n<feGaussianBlur stdDeviation=\"1.2402\"/>\n<feComposite in2=\"hardAlpha\" operator=\"out\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.11 0\"/>\n<feBlend mode=\"normal\" in2=\"effect1_dropShadow_0_1\" result=\"effect2_dropShadow_0_1\"/>\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect2_dropShadow_0_1\" result=\"shape\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dy=\"-0.545688\"/>\n<feComposite in2=\"hardAlpha\" operator=\"arithmetic\" k2=\"-1\" k3=\"1\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.22 0\"/>\n<feBlend mode=\"normal\" in2=\"shape\" result=\"effect3_innerShadow_0_1\"/>\n</filter>\n<linearGradient id=\"paint0_linear_0_1\" x1=\"12.4414\" y1=\"2\" x2=\"12.4414\" y2=\"22\" gradientUnits=\"userSpaceOnUse\">\n<stop offset=\"0.254043\" stop-color=\"white\"/>\n<stop offset=\"0.730769\" stop-color=\"#FFCAFC\"/>\n<stop offset=\"1\" stop-color=\"#8ABBFF\"/>\n</linearGradient>\n</defs>\n</svg>\n",
  "assets/board-native/ai-chat/plugin-videos.svg": "<svg width=\"24\" height=\"25\" viewBox=\"0 0 24 25\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<g filter=\"url(#filter0_i_4106_26757)\">\n<path d=\"M2 6.97648C2 5.33262 3.33261 4 4.97648 4H16.4505C17.4218 4 18.3321 4.47337 18.89 5.2685L19.1038 5.57331L21.2386 7.9517C21.7288 8.49789 22 9.20595 22 9.93989V17.0235C22 18.6674 20.6674 20 19.0235 20H4.97648C3.33261 20 2 18.6674 2 17.0235V6.97648Z\" fill=\"#7C86FF\"/>\n</g>\n<g filter=\"url(#filter1_dd_4106_26757)\">\n<path d=\"M14.4189 11.1679C15.0212 11.5592 15.0212 12.4408 14.4189 12.8321L11.2325 14.9017C10.5725 15.3304 9.69995 14.8567 9.69995 14.0696L9.69995 9.93039C9.69995 9.14332 10.5725 8.66962 11.2325 9.09833L14.4189 11.1679Z\" fill=\"white\"/>\n<path d=\"M14.4189 11.1679C15.0212 11.5592 15.0212 12.4408 14.4189 12.8321L11.2325 14.9017C10.5725 15.3304 9.69995 14.8567 9.69995 14.0696L9.69995 9.93039C9.69995 9.14332 10.5725 8.66962 11.2325 9.09833L14.4189 11.1679Z\" stroke=\"white\" stroke-width=\"0.25\"/>\n</g>\n<mask id=\"mask0_4106_26757\" style=\"mask-type:alpha\" maskUnits=\"userSpaceOnUse\" x=\"6\" y=\"4\" width=\"16\" height=\"20\">\n<path d=\"M6 6.97648C6 5.33261 7.33261 4 8.97648 4H16.7553C17.4794 4 18.1786 4.26393 18.7221 4.74237L19.8182 5.70732L21.1346 7.03176C21.6889 7.58943 22 8.34376 22 9.13004V21.0235C22 22.6674 20.6674 24 19.0235 24H8.97648C7.33262 24 6 22.6674 6 21.0235V6.97648Z\" fill=\"url(#paint0_linear_4106_26757)\"/>\n</mask>\n<g mask=\"url(#mask0_4106_26757)\">\n<g filter=\"url(#filter2_ddi_4106_26757)\">\n<path d=\"M23.0274 8.26899C23.4187 8.59603 23.1875 9.2334 22.6775 9.2334H18.1788C17.5761 9.2334 17.0875 8.74477 17.0875 8.14202V4.41508C17.0875 3.94923 17.6336 3.69759 17.9877 4.00026L20.9891 6.56559L23.0274 8.26899Z\" fill=\"#C6D2FF\"/>\n</g>\n</g>\n<defs>\n<filter id=\"filter0_i_4106_26757\" x=\"2\" y=\"4\" width=\"20\" height=\"16\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dy=\"-0.49608\"/>\n<feComposite in2=\"hardAlpha\" operator=\"arithmetic\" k2=\"-1\" k3=\"1\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.52 0\"/>\n<feBlend mode=\"normal\" in2=\"shape\" result=\"effect1_innerShadow_4106_26757\"/>\n</filter>\n<filter id=\"filter1_dd_4106_26757\" x=\"4.57495\" y=\"2.81152\" width=\"15.4207\" height=\"16.377\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dy=\"0.49608\"/>\n<feGaussianBlur stdDeviation=\"0.12402\"/>\n<feComposite in2=\"hardAlpha\" operator=\"out\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.08 0\"/>\n<feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_4106_26757\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dy=\"-1\"/>\n<feGaussianBlur stdDeviation=\"2.5\"/>\n<feComposite in2=\"hardAlpha\" operator=\"out\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.17 0\"/>\n<feBlend mode=\"normal\" in2=\"effect1_dropShadow_4106_26757\" result=\"effect2_dropShadow_4106_26757\"/>\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect2_dropShadow_4106_26757\" result=\"shape\"/>\n</filter>\n<filter id=\"filter2_ddi_4106_26757\" x=\"13.6148\" y=\"2.37993\" width=\"11.0975\" height=\"10.326\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dx=\"-0.24804\" dy=\"0.24804\"/>\n<feGaussianBlur stdDeviation=\"0.12402\"/>\n<feComposite in2=\"hardAlpha\" operator=\"out\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.06 0\"/>\n<feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_4106_26757\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dx=\"-0.992159\" dy=\"0.992159\"/>\n<feGaussianBlur stdDeviation=\"1.2402\"/>\n<feComposite in2=\"hardAlpha\" operator=\"out\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.11 0\"/>\n<feBlend mode=\"normal\" in2=\"effect1_dropShadow_4106_26757\" result=\"effect2_dropShadow_4106_26757\"/>\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect2_dropShadow_4106_26757\" result=\"shape\"/>\n<feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\n<feOffset dy=\"-0.545688\"/>\n<feComposite in2=\"hardAlpha\" operator=\"arithmetic\" k2=\"-1\" k3=\"1\"/>\n<feColorMatrix type=\"matrix\" values=\"0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.22 0\"/>\n<feBlend mode=\"normal\" in2=\"shape\" result=\"effect3_innerShadow_4106_26757\"/>\n</filter>\n<linearGradient id=\"paint0_linear_4106_26757\" x1=\"14\" y1=\"4\" x2=\"14\" y2=\"24\" gradientUnits=\"userSpaceOnUse\">\n<stop offset=\"0.254043\" stop-color=\"white\"/>\n<stop offset=\"0.730769\" stop-color=\"#FFCAFC\"/>\n<stop offset=\"1\" stop-color=\"#8ABBFF\"/>\n</linearGradient>\n</defs>\n</svg>\n",
  "assets/board-native/flags/AC.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>AC</title><path fill=\"#012169\" d=\"M0 0h513v342H0z\"></path><path fill=\"#FFF\" d=\"M440.1 181.1c-.1 39.2-6.4 81.4-57.4 101.5-51.1-20.1-57.3-62.3-57.4-101.5h114.8z\"></path><path fill=\"#1B81B6\" d=\"M439.6 197.7c-2.8 34.9-12.4 67.4-57 85-44.4-17.6-54.5-51.2-56.9-84.9\"></path><path fill=\"#FFF\" d=\"M437.8 214.1c-3.2 24.3-16.7 53.5-55.1 68.6-38.4-15.1-50.5-42.5-55.1-68.4\"></path><path fill=\"#1B81B6\" d=\"M434.2 230.3c-5.7 17.7-19.3 39.4-51.3 52.8-32-12.6-45.2-33.8-51.4-53\"></path><path fill=\"#FFF\" d=\"M426.7 246.9c-6.5 11.3-17.7 25.4-44 35.9-27.5-11.5-37.4-25.3-44-36.1\"></path><path fill=\"#1B81B6\" d=\"M412.4 265.1c-8.1 7.2-12 11.2-29.6 17.9-20.1-7.9-22.6-11.6-29.2-17.5\"></path><path fill=\"#288549\" d=\"M383.3 231.6c-.2-.2-27.9 35.7-27.9 35.7-1.8-1.3-10-9.5-13.3-15l41.3-50.1 40.2 49.7c-3.9 6.5-11.4 13.6-13.2 15M382.6 85.3l-26.5 45h53z\"></path><path d=\"M275.9 223.6c3.6-26.7 13.5-47.3 22.1-46.2s12.6 23.7 9 50.4-13.5 47.3-22.1 46.2c-8.6-1.2-12.6-23.7-9-50.4zm191.2-45.9c8.6-1.2 18.5 19.5 22.1 46.2s-.4 49.2-9 50.4-18.5-19.6-22.2-46.3c-3.6-26.6.5-49.2 9.1-50.3z\" fill=\"#F0955D\"></path><path d=\"M296.4 162c2.4-6 7.4-9.7 11-8.2 3.7 1.5 4.7 7.5 2.3 13.5s-7.4 9.7-11 8.2c-3.6-1.5-4.7-7.5-2.3-13.5zm-8 109.2c.9-6.2 3.1-11.1 4.9-10.8s2.5 5.5 1.6 11.8c-.9 6.2-3.1 11.1-4.9 10.8s-2.5-5.5-1.6-11.8zm10.6-12.8c1.8-.1 3.6 4.7 3.9 10.8s-.9 11.1-2.7 11.2c-1.8.1-3.6-4.7-3.9-10.8-.3-6.1.9-11.1 2.7-11.2zm10.5-70c2.1-.8 6.1 4.2 8.8 11.2 2.8 7 3.3 13.4 1.2 14.2-2.1.8-6.1-4.2-8.8-11.2-2.8-7-3.3-13.4-1.2-14.2zm6.5-14.1c7-2.8 13.4-3.3 14.2-1.2.8 2.1-4.2 6.1-11.2 8.8-7 2.8-13.4 3.3-14.2 1.2-.9-2.1 4.2-6 11.2-8.8zm141.6-20.2c3.7-1.5 8.6 2.2 11 8.2 2.4 6 1.4 12.1-2.3 13.5-3.7 1.5-8.6-2.2-11-8.2-2.4-6-1.3-12.1 2.3-13.5zm14.2 106.5c1.8-.3 4 4.6 4.9 10.8.9 6.2.2 11.5-1.6 11.8-1.8.3-4-4.6-4.9-10.8-1-6.3-.2-11.5 1.6-11.8zm-9.6 8.8c.3-6.1 2.1-10.9 3.9-10.8 1.8.1 3 5.1 2.7 11.2-.3 6.1-2.1 10.9-3.9 10.8-1.8-.1-3-5.1-2.7-11.2zm-15.5-69.7c2.8-7 6.7-12.1 8.8-11.2 2.1.8 1.6 7.2-1.2 14.2-2.8 7-6.7 12.1-8.8 11.2s-1.6-7.2 1.2-14.2zm-11.8-26.5c.8-2.1 7.2-1.6 14.2 1.2 7 2.8 12.1 6.7 11.2 8.8-.8 2.1-7.2 1.6-14.2-1.2-7-2.7-12.1-6.7-11.2-8.8z\" fill=\"#EADFD5\"></path><path fill=\"#B0C6CC\" d=\"M373.3 130.3 356.1 155l17.8 26.1H396l4.7-25.4-5.4-25.4z\"></path><path fill=\"#012169\" d=\"M0 0h256.5v171H0z\"></path><g fill=\"#FFF\"><path d=\"M256.5 0v30.6l-45.3 25.2h45.3v59.4h-59.2l59.2 32.9V171h-26.7l-73.7-40.9V171h-55.7v-48.7L12.8 171H0v-30.6l45.3-25.2H0V55.8h59.2L0 22.9V0h26.7l73.7 40.9V0h55.7v48.7L243.7 0z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-55.7-59.4L0 0v15.8l72 40z\"></path></g><g fill=\"#D80027\"><path d=\"M144.3 0h-32.1v69.5H0v32h112.2V171h32.1v-69.5h112.2v-32H144.3z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-84.1 0-72 40V171l100.4-55.8zm28.4-59.4L0 0v15.8l72 40zm84.1 0 72-40V0L156.1 55.8z\"></path></g></svg>",
  "assets/board-native/flags/AD.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>AD</title><path fill=\"#FFDA44\" d=\"M0 0h513v342H0z\"></path><path fill=\"#0052B4\" d=\"M0 0h171v342H0z\"></path><path fill=\"#D80027\" d=\"M342 0h171v342H342zM198.9 113.6H256v64.8h-57.1z\"></path><path d=\"M267.6 113.6v64.7m16.6-64.7v64.7m16.6-64.7v64.7\" stroke=\"#D80027\" stroke-width=\"7\"></path><path d=\"M247.4 178.4v64.7m-13.3-64.7v64.7m-13.3-64.6v53.9m-13.7-53.9v47.1\" stroke=\"#D80027\" stroke-width=\"5\"></path><path fill=\"#FFDA44\" d=\"m199.9 146 27.6-32.4 28.5 32.3-28.1 32.4z\"></path><path fill=\"#BC8B00\" d=\"M182.2 95.9v92.2c0 34.3 27.3 54.2 48.6 64.5-.8 1.4 25.1 8.3 25.1 8.3s25.9-6.9 25.1-8.3c21.4-10.3 48.6-30.1 48.6-64.5V95.9H182.2zm129.9 92.2c0 16.9-10 29.4-32.8 43.9-8.6 5.5-17.5 9-23.3 11-5.8-2-14.7-5.5-23.3-11-22.8-14.5-32.8-28-32.8-43.9v-74.5h112.2v74.5z\"></path><path fill=\"#D80027\" d=\"M264.4 188.9h29.5v8.6h-29.5zm0 17.6h29.5v8.6h-29.5z\"></path></svg>",
  "assets/board-native/flags/AE.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>AE</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#009e49\" d=\"M0 0h513v114H0z\"></path><path d=\"M0 228h513v114H0z\"></path><path fill=\"#ce1126\" d=\"M0 0h171v342H0z\"></path></svg>",
  "assets/board-native/flags/AF.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>AF</title><path fill=\"#DB3E00\" d=\"M0 0h513v342H0z\"></path><path fill=\"#479900\" d=\"M331 0h182v342H331z\"></path><path d=\"M0 0h181.8v342H0z\"></path><path fill=\"#FFF\" d=\"M256 126.7c-19.4 0-35.2 15.8-35.2 35.2v52.8h70.4v-52.8c0-19.5-15.8-35.2-35.2-35.2z\"></path><path fill=\"#FFF\" d=\"M256 84.3c-47.7 0-86.4 38.7-86.4 86.4S208.3 257 256 257s86.4-38.7 86.4-86.4-38.7-86.3-86.4-86.3zm0 157.7c-39.4 0-71.4-32-71.4-71.4 0-39.4 32-71.4 71.4-71.4 39.4 0 71.4 32 71.4 71.4 0 39.5-32 71.4-71.4 71.4z\"></path></svg>",
  "assets/board-native/flags/AG.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>AG</title><path d=\"M0 0h513v342H0z\"></path><path fill=\"#0072c6\" d=\"M88.8 136.5c-2.2 12.9-3.4 26.2-3.4 39.8 0 13.6 1.2 27 3.4 39.8L256 228.3l167.2-12.1c2.2-12.9 3.4-26.2 3.4-39.8s-1.2-27-3.4-39.8\"></path><path fill=\"#FFF\" d=\"M423.2 219H88.8c15.8 69.8 84.7 122.3 167.2 122.3S407.4 288.8 423.2 219z\"></path><path fill=\"#FFDA44\" d=\"M365.9 136.5H146.1l44.9-21.1-23.9-43.5 48.8 9.4L222 32l34 36.2L290 32l6.1 49.3 48.8-9.4-23.9 43.5z\"></path><g fill=\"#ce1126\"><path d=\"M256.5 342 0 0v342z\"></path><path d=\"M513 342V0L256 342z\"></path></g></svg>",
  "assets/board-native/flags/AI.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>AI</title><path fill=\"#012169\" d=\"M0 0h513v342H0z\"></path><path fill=\"#FFF\" d=\"M454.8 265.38c7.94-10.93 13.24-24.27 13.24-40.42V104.89a59.754 59.754 0 0 1-36.02 12.01c-19.64 0-37.07-9.43-48.03-24.01-10.95 14.58-28.39 24.01-48.03 24.01-13.52 0-25.99-4.47-36.02-12v120.06c0 16.16 5.3 29.5 13.24 40.42H454.8z\"></path><path fill=\"#9cf\" d=\"M310.23 260.98C332.65 296.96 384 309 384 309s51.35-12.04 73.77-48.02H310.23z\"></path><g fill=\"#f90\"><path d=\"M396.66 172.21c.32 1.42 8.72 10.17 17.56 20.15 1.39 1.57-8.74 12.63-6.91 12.59 4.75-.12 19.27-17.26 19.34 6.65.05 15.94-30 27.51-30 27.51h17.47l.65 14.96s4.97-13.34 7.59-16.57c8.1-9.97 20.18-30.07 34.59-27.1 14.41 2.97-13.66-13.92-13.66-13.92s-5.2-15.19-16.63-16.97c-10.06-1.57-14.29-2.51-26.64-7.3-1.68-.65-3.88-2.32-3.36 0z\"></path><path d=\"M359.69 198.69c1.07-.99 4.46-12.63 8.69-25.28.67-1.99 15.31 1.27 14.35-.3-2.47-4.06-24.58-8.08-3.9-20.08 13.79-8 38.82 12.27 38.82 12.27l-8.72-15.14 12.64-8.03s-14.05 2.35-18.14 1.69c-12.68-2.04-36.13-2.48-40.75-16.45-4.62-13.97-5.25 18.79-5.25 18.79s-10.56 12.08-6.4 22.88c3.66 9.5 4.96 13.64 6.97 26.73.29 1.79-.06 4.53 1.69 2.92z\"></path><path d=\"M395.67 219.87c-1.39-.43-13.16 2.49-26.22 5.18-2.06.42-6.59-13.88-7.47-12.26-2.27 4.17 5.36 25.31-15.41 13.45-13.84-7.91-8.89-39.73-8.89-39.73l-8.71 15.14-13.29-6.9s9.09 10.96 10.57 14.84c4.6 11.99 16 32.49 6.24 43.49-9.76 11.01 18.88-4.9 18.88-4.9s15.76 3.07 23-5.96c6.38-7.94 9.3-11.14 19.61-19.45 1.43-1.12 3.97-2.19 1.69-2.9z\"></path></g><path fill=\"#012169\" d=\"M0 0h256.5v171H0z\"></path><g fill=\"#FFF\"><path d=\"M256.5 0v30.6l-45.3 25.2h45.3v59.4h-59.2l59.2 32.9V171h-26.7l-73.7-40.9V171h-55.7v-48.7L12.8 171H0v-30.6l45.3-25.2H0V55.8h59.2L0 22.9V0h26.7l73.7 40.9V0h55.7v48.7L243.7 0z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-55.7-59.4L0 0v15.8l72 40z\"></path></g><g fill=\"#D80027\"><path d=\"M144.3 0h-32.1v69.5H0v32h112.2V171h32.1v-69.5h112.2v-32H144.3z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-84.1 0-72 40V171l100.4-55.8zm28.4-59.4L0 0v15.8l72 40zm84.1 0 72-40V0L156.1 55.8z\"></path></g></svg>",
  "assets/board-native/flags/AL.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 90 60\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>AL</title><path fill=\"#ED2024\" d=\"M0 0h90v60H0z\"></path><path fill=\"#212121\" d=\"M32.5 12.2v16l7.1 2.5-5 4.9 2.4 3 5.3-5.5 1.2 2.3-3 4.9 3.6 5.6-1.8 2.6 2.8 3.6 2.7-3.7-1.5-2.6 3-5.8-2.7-4.6 1.2-2.3 5.2 5.5 2.5-2.9-5.2-5.1 7.2-2.6V12.2l-5.2 1.9-.1 3.8-3.3.3v-2.6l1.7-2.3 5.6-2.2-2.3-.4 1.4-1.2.9.4-.8-1.4L54 9l-1-1.1L47.5 9l1.4 1.1-3.8 4.9-3.8-4.8 1.3-1.1-5-1.2L36.2 9l-1.5-.4-.8 1.4.9-.6 1.6 1.1-2.3.5 5.5 2 1.6 2.3v2.9l-3.3-.3v-3.6z\"></path><path d=\"M26.2 25h6.4v2.5h-6.4zm0-4.1h6.4v2.7h-6.4zm0-4.2h6.4v2.6h-6.4zm0-4h6.4v2.5h-6.4zM57.4 25h6.4v2.5h-6.4zm0-4.1h6.4v2.7h-6.4zm0-4.2h6.4v2.6h-6.4zm0-4h6.4v2.5h-6.4zM53.4 36.1h6.4V38h-6.4zm-23.2 0h6.4V38h-6.4z\" fill=\"#212121\"></path></svg>",
  "assets/board-native/flags/AM.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>AM</title><path fill=\"#0052B4\" d=\"M0 0h513v342H0z\"></path><path fill=\"#D80027\" d=\"M0 0h513v114H0z\"></path><path fill=\"#FF9811\" d=\"M0 228h513v114H0z\"></path></svg>",
  "assets/board-native/flags/AO.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>AO</title><path d=\"M0 171h513v171H0z\"></path><path fill=\"#D80027\" d=\"M0 0h513v171H0z\"></path><g fill=\"#FFDA44\"><path d=\"m332.7 135.6 17.5-8.6-7.4-19-18.7 6.2zm-45.6-56 5.5-18.8-19.1-7.2-8 18zm29.4 23.2 12.2-15.3-14.9-13.9-14.2 13.6zm19.4 68.9 19.5-.8v-21.3l-22.9.2zm-12.6 38.1 18.8 5.5 7.3-19-18-8zm-29 32.4 14.9 12.7 14.4-14.4-13.1-14.7zm-47-147.7 9.8 19.9 21.9 3.3-15.9 15.5 3.6 21.9-19.6-10.4-19.7 10.2 3.8-21.9-15.8-15.5 22-3.1z\"></path><path d=\"m250.8 61.3-2.7 18.3c43.1 3.2 77 39.2 77 83.1 0 46-37.3 82.9-83.4 83.4-29.2.3-51.3-14.8-67-33.7l-13.9 12.3c15 19 40.8 39.9 80.9 39.9 56.3 0 101.9-45.6 101.9-101.9.1-53.2-40.7-96.9-92.8-101.4z\"></path><path fill=\"#000\" d=\"m291.9 223.4-11.8 14s51.9 38.9 53.6 40.4c1.7 1.5 5.2 2 9.1-2.7 3.7-4.5 2.8-8.1.9-9.7-2-1.5-51.8-42-51.8-42z\"></path><path d=\"M206.1 157.2c-7.7 10.3-7.5 23.1 2.8 30.9 0 0 135.2 101.5 136.9 103 1.7 1.5 5.2 2 9.1-2.7 3.7-4.5 2.8-8.1.9-9.7-1.9-1.5-149.7-121.5-149.7-121.5zm47.7 99.1 7.3 18.2 19.5-6-4.8-19.1zm-40.4-3.7-2 19.5 20.1 3.6 4.5-19.1zm-35.7-21.2L167.4 248l16.4 12.1 12.5-15.2z\"></path></g></svg>",
  "assets/board-native/flags/AQ.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 744 496\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>AQ</title><path fill=\"#3A7DCE\" d=\"M0 0h744v496H0V0z\"></path><path fill=\"#fff\" d=\"m120 125 90 63 54-14 23-81 61-36 92 14 105 55 6 90 34 12v92l-65 115-78 24-72-17 18-30-8-32-10 9-162-25-49-85 20-46-49-62z\"></path></svg>",
  "assets/board-native/flags/AR.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>AR</title><path fill=\"#FFF\" d=\"M0 0h512v342H0z\"></path><path fill=\"#338AF3\" d=\"M0 0h512v114H0zm0 228h512v114H0z\"></path><circle fill=\"#FFDA44\" stroke=\"#d6ab00\" stroke-width=\"5\" cx=\"256.5\" cy=\"171\" r=\"40\"></circle></svg>",
  "assets/board-native/flags/AS.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>AS</title><path fill=\"#10338c\" d=\"M0 0h513v342H0z\"></path><path fill=\"#D80027\" d=\"M513 33 95.3 171 513 310.76V342L0 171 513 0z\"></path><path fill=\"#FFF\" d=\"M513 287.18v24.58L81.72 171 513 30v24.16\"></path><path fill=\"#A2001D\" d=\"m476.98 140.21-21.89 10.68-3.18-15.32 31.19-29.77s-9.42-40.65-13.75-44.98l-112.32 55.82-6.84 36.76-31.9 28.59-.4 34.2 34.29-22.76 67.23-2.66-1.51 38.11h22.23l11.9-44.64 31.55-24.61-6.6-19.42z\"></path><path fill=\"#EFC100\" stroke=\"#231F20\" stroke-miterlimit=\"10\" d=\"m317.89 238.41-22.24-11.11 22.24-11.11h144.46v22.22z\"></path></svg>",
  "assets/board-native/flags/AT.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>AT</title><path fill=\"#FFF\" d=\"M0 114h513v114H0z\"></path><path fill=\"#D80027\" d=\"M0 0h513v114H0zm0 228h513v114H0z\"></path></svg>",
  "assets/board-native/flags/AU.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>AU</title><path fill=\"#00008b\" d=\"M0 0h513v342H0z\"></path><path d=\"m188 212.6 11 22.9 24.7-5.7-11 22.8 19.9 15.8-24.8 5.6.1 25.4-19.9-15.9-19.8 15.9.1-25.4-24.8-5.6 19.9-15.8-11.1-22.8 24.8 5.7zm197.9 28.5 5.2 10.9 11.8-2.7-5.3 10.9 9.5 7.5-11.8 2.6v12.2l-9.4-7.6-9.5 7.6.1-12.2-11.8-2.6 9.5-7.5-5.3-10.9 11.8 2.7zm-48.6-116 5.2 10.9 11.8-2.7-5.3 10.9 9.5 7.5-11.8 2.7v12.1l-9.4-7.6-9.5 7.6.1-12.1-11.9-2.7 9.5-7.5-5.3-10.9L332 136zm48.6-66.2 5.2 10.9 11.8-2.7-5.3 10.9 9.5 7.5-11.8 2.7v12.1l-9.4-7.6-9.5 7.6.1-12.1-11.8-2.7 9.5-7.5-5.3-10.9 11.8 2.7zm42.5 49.7 5.2 10.9 11.8-2.7-5.3 10.9 9.5 7.5-11.8 2.6V150l-9.4-7.6-9.5 7.6v-12.2l-11.8-2.6 9.5-7.5-5.3-10.9 11.8 2.7zM398 166.5l4.1 12.7h13.3l-10.8 7.8 4.2 12.7-10.8-7.9-10.8 7.9 4.1-12.7-10.7-7.8h13.3z\" fill=\"#FFF\"></path><path fill=\"#00008b\" d=\"M0 0h256.5v171H0z\"></path><g fill=\"#FFF\"><path d=\"M256.5 0v30.6l-45.3 25.2h45.3v59.4h-59.2l59.2 32.9V171h-26.7l-73.7-40.9V171h-55.7v-48.7L12.8 171H0v-30.6l45.3-25.2H0V55.8h59.2L0 22.9V0h26.7l73.7 40.9V0h55.7v48.7L243.7 0z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-55.7-59.4L0 0v15.8l72 40z\"></path></g><g fill=\"red\"><path d=\"M144.3 0h-32.1v69.5H0v32h112.2V171h32.1v-69.5h112.2v-32H144.3z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-84.1 0-72 40V171l100.4-55.8zm28.4-59.4L0 0v15.8l72 40zm84.1 0 72-40V0L156.1 55.8z\"></path></g></svg>",
  "assets/board-native/flags/AW.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 363 242\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>AW</title><path fill=\"#338AF3\" d=\"M0 0h363v242H0z\"></path><path fill=\"#FFF\" d=\"M57 96.9 14.7 78.2 57 59.6l18.6-42.2 18.6 42.2 42.3 18.6-42.3 18.7-18.6 42.2z\"></path><path fill=\"#f30028\" d=\"m75.6 40.6 11.5 26.1 26.1 11.5-26.1 11.5-11.5 26.1-11.5-26.1L38 78.2l26.1-11.5z\"></path><path d=\"M0 152.2h363v15.7H0zm0 31.4h363v15.7H0z\" fill=\"#FFDA44\"></path></svg>",
  "assets/board-native/flags/AX.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>AX</title><path fill=\"#0052B4\" d=\"M0 0h513v342H0z\"></path><path fill=\"#FFDA44\" d=\"M513 210.9H202.2V342h-79.8V210.9H0v-79.8h122.4V0h79.8v131.1H513v61.2z\"></path><path fill=\"#D80027\" d=\"M513 149.7v42.6H183.7V342H141V192.3H0v-42.6h141V0h42.7v149.7z\"></path></svg>",
  "assets/board-native/flags/AZ.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>AZ</title><path fill=\"#ef3340\" d=\"M0 0h513v342H0z\"></path><path fill=\"#00b5e2\" d=\"M0 0h513v114H0z\"></path><path fill=\"#509e2f\" d=\"M0 228h513v114H0z\"></path><g fill=\"#FFF\"><path d=\"M265.6 212.6c-23 0-41.6-18.6-41.6-41.6s18.6-41.6 41.6-41.6c7.2 0 13.9 1.8 19.8 5-9.2-9-21.9-14.6-35.8-14.6-28.3 0-51.2 22.9-51.2 51.2s22.9 51.2 51.2 51.2c13.9 0 26.6-5.6 35.8-14.6-5.9 3.2-12.6 5-19.8 5z\"></path><path d=\"m297.6 142.2 5.5 15.5 14.9-7.1-7.1 14.9 15.5 5.5-15.5 5.5 7.1 14.9-14.9-7.1-5.5 15.5-5.5-15.5-14.9 7.1 7.1-14.9-15.5-5.5 15.5-5.5-7.1-14.9 14.9 7.1z\"></path></g></svg>",
  "assets/board-native/flags/BA.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>BA</title><path fill=\"#10338C\" d=\"M0 0h513v342H0z\"></path><path fill=\"#F6C500\" d=\"M99.9 0h342v342\"></path><g fill=\"#FFF\"><path d=\"M19.9 21.1 40.3 6.2 60.9 21 54 0H26.7z\"></path><path d=\"M92.3 25.5 84.4 1.3l-7.8 24.2H51.3l20.5 14.8-7.8 24 20.4-14.8L105 64.3l-7.9-24 20.5-14.9z\"></path><path d=\"m136.3 69.2-7.8-24-7.8 24H95.5l20.4 14.9-7.8 24 20.4-14.8 20.6 14.8-7.8-24 20.4-14.9z\"></path><path d=\"m179.4 112.3-7.8-24.1-7.8 24.1h-25.3l20.5 14.9-7.8 24 20.4-14.8 20.6 14.8-7.9-24 20.5-15z\"></path><path d=\"m222.5 155.3-7.8-24-7.8 24h-25.4l20.6 15-7.8 24 20.4-14.9 20.4 14.9-7.8-24 20.6-15z\"></path><path d=\"m265.6 198.4-7.8-24-7.8 24h-25.4l20.6 14.9-7.8 24.1 20.4-14.9 20.4 14.9-7.8-24.2 20.5-14.8z\"></path><path d=\"m308.7 241.5-7.9-24-7.8 24h-25.3l20.5 14.8-7.9 24.2 20.6-14.9 20.4 14.8-7.8-24.1 20.5-14.8z\"></path><path d=\"m351.7 284.6-7.8-24.2-7.8 24.2h-25.3l20.4 14.8-7.8 24.1 20.5-14.9 20.5 14.9-7.8-24.1 20.4-14.8z\"></path><path d=\"m387 303.5-7.9 24.1-25.3.1 19.8 14.3h26.6l19.9-14.4h-25.3z\"></path></g></svg>",
  "assets/board-native/flags/BB.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>BB</title><path fill=\"#ffc726\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 0h171v342H0zm342 0h171v342H342z\" fill=\"#00267f\"></path><path d=\"m325.74 101.02-31.97 12.4c-.68 1.35-5.79 7.54-8.18 53.06h-17.05v-60.42L256 78.68l-12.54 27v60.8H226.4c-2.39-45.53-7.8-52.48-8.47-53.84l-31.68-11.63c.15.31 15.4 31.34 15.4 78.01v12.54h41.81v71.07h25.08v-71.07h41.81v-12.54c0-24.13 4.17-44.02 7.68-56.46 3.82-13.57 7.7-21.49 7.74-21.57l-.03.03z\"></path></svg>",
  "assets/board-native/flags/BD.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>BD</title><path fill=\"#2d6e41\" d=\"M0 85.331h513v342H0z\"></path><circle fill=\"#F40B32\" cx=\"218.902\" cy=\"256.5\" r=\"115\"></circle></svg>",
  "assets/board-native/flags/BE.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>BE</title><path fill=\"#fdda25\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 0h171v342H0z\"></path><path fill=\"#ef3340\" d=\"M342 0h171v342H342z\"></path></svg>",
  "assets/board-native/flags/BF.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>BF</title><path fill=\"#3d944f\" d=\"M0 0h513v342H0z\"></path><path fill=\"#ef2b2d\" d=\"M0 0h513v171H0z\"></path><path fill=\"#FFDA44\" d=\"m256 102.6 16.9 52h54.7l-44.2 32.2 16.8 52-44.2-32.1-44.2 32.1 16.8-52-44.2-32.2h54.7z\"></path></svg>",
  "assets/board-native/flags/BG.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>BG</title><path fill=\"#00966e\" d=\"M0 0h513v342H0z\"></path><path fill=\"#FFF\" d=\"M0 0h513v114H0z\"></path><path fill=\"#d62612\" d=\"M0 228h513v114H0z\"></path></svg>",
  "assets/board-native/flags/BH.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>BH</title><path fill=\"#D80027\" d=\"M0 0h513v342H0z\"></path><path fill=\"#FFF\" d=\"m222.8 34.3-85.2 34.2 85.2 34.1-85.2 34.1 85.2 34.1-85.2 34.1 85.2 34.1-85.2 34.1 85.2 34.1-85.2 34.8H0V0h137.6z\"></path></svg>",
  "assets/board-native/flags/BI.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>BI</title><path fill=\"#D80027\" d=\"M0 0h513v342H0z\"></path><path d=\"M215.9 170.7 0 314.6V26.8zM513 26.8v287.8L297.1 170.7z\" fill=\"#47a644\"></path><path fill=\"#0052B4\" d=\"M513 26.8 296.1 170.7 513 314.6V342h-41.1L256 197.4 40.1 342H0v-27.4l215.9-143.9L0 26.8V0h40.1L256 143.9 471.9 0H513z\"></path><path fill=\"#FFF\" d=\"M513 26.8 297.1 170.7 513 314.6V342h-40L256 197.4 39 342H0v-27.4l215.9-143.9L0 26.8V0h40.1L256 143.9 471.9 0H513z\"></path><circle fill=\"#FFF\" cx=\"251.6\" cy=\"170.7\" r=\"100.2\"></circle><path d=\"m251.4 103.6 7.4 12.9h14.8l-7.4 12.8 7.4 12.8h-14.8l-7.4 12.9-7.4-12.9h-14.8l7.4-12.8-7.4-12.8H244zm38.8 66.7 7.4 12.9h14.8L305 196l7.4 12.8h-14.8l-7.4 12.9-7.4-12.9h-14.9l7.4-12.8-7.4-12.8h14.9zm-77.2 0 7.4 12.9h14.9l-7.4 12.8 7.4 12.8h-14.9l-7.4 12.9-7.4-12.9h-14.8l7.4-12.8-7.4-12.8h14.8z\" fill=\"#D80027\" stroke=\"#47a644\" stroke-width=\"3\"></path></svg>",
  "assets/board-native/flags/BJ.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>BJ</title><path fill=\"#008751\" d=\"M0 0h513v342H0z\"></path><path fill=\"#fcd116\" d=\"M197 0h316v171H197z\"></path><path fill=\"#e8112d\" d=\"M197 171h316v171H197z\"></path></svg>",
  "assets/board-native/flags/BL.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>BL</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path d=\"M157.3 199.8s-9 43.9-19.3 40.4c-10.6-3.5-17.5-18.8-17.5-18.8L106 242.6s38.2 8.5 41 5.5c1.2-1.1 8.2-15.1 10.3-26.1v-22.2zm-56.1 60.5s-2.5 20.2-1.1 22.7c1.2 2.3 39.5 11.3 39.5 11.3s-25 16.5-29.7 20.5l-18.1-29.9-.7-24.6h10.1zm11.3-165.7s39.7 41.6 40.4 45.5c.7 3.7-4.2 3.2-4.2 3.2s-44.8-37.5-49.9-41.1c-5.4-3.5 13.7-7.6 13.7-7.6zm246.7 106.7s9 42.4 19.2 38.9c10.6-3.5 17.5-18.8 17.5-18.8l14.5 21.2s-37 8.5-39.8 5.5c-1.2-1.1-9.3-13.8-11.5-24.7l.1-22.1zm56 59s2.5 20.2 1.1 22.7c-1.2 2.3-39.5 11.3-39.5 11.3s25 16.5 29.7 20.5l18.1-29.9.7-24.6h-10.1zM403.9 94.6s-39.6 41.6-40.4 45.5c-.7 3.7 4.2 3.2 4.2 3.2s44.8-37.5 49.9-41.1c5.2-3.5-13.7-7.6-13.7-7.6z\" fill=\"#E6BC00\"></path><path d=\"M99.4 104.7s17-.7 16.6-11.5c-.4-10.6-11.2-14.9-19.1-12.4-8 2.3-23 13.4-13.6 35.1 9.4 21.4 23.4 29.4 26.2 47.8 0 0-5.5 9.9-19.1.4-16.9-11.8-6.2-38.2-10.4-45-4.2-7.1-41-38.9-41-38.9s-30.2 39.4-18 74.9c17 49.2 51.7 32 64.6 36.8 0 0-42.1 62-49.6 67.1 0 0 24.1 8.3 47.8-18.8 0 0 5.8 9.7 7.1 20.2h10.3c4.8-26.2 51.5-64.3 49.9-82.3-1.8-21.3-49.2-49.5-51.7-73.4zM365.1 178c-1.6 18.1 45.1 56.1 49.9 82.3h10.3c1.2-10.4 7.1-20.2 7.1-20.2 23.7 27.1 47.8 18.8 47.8 18.8-7.4-5.1-49.6-67.1-49.6-67.1 12.9-4.8 47.7 12.4 64.6-36.8 12.2-35.6-18-74.9-18-74.9s-36.7 31.8-41 38.9c-4.2 6.7 6.5 33.2-10.4 45-13.7 9.5-19.1-.4-19.1-.4 2.8-18.4 16.8-26.4 26.2-47.8 9.4-21.6-5.7-32.8-13.6-35.1-8-2.5-18.8 1.8-19.1 12.4-.4 10.8 16.6 11.5 16.6 11.5-2.5 24-49.9 52.2-51.7 73.4z\" fill=\"#ADADAD\"></path><path fill=\"#125ECC\" d=\"M157.3 87.1h201.8v145.5c0 16.1-9.7 21.4-21.9 31.8l-45.9 39.4c-18.2 15.6-47.9 15.6-66.1 0l-46-39.4c-12.1-10.4-21.9-15.7-21.9-31.8V87.1z\"></path><path fill=\"#FFE600\" d=\"M200.6 147.7c-8 0-14.4-6.4-14.4-14.4s6.4-14.4 14.4-14.4 14.4 6.4 14.4 14.4-6.5 14.4-14.4 14.4zm57.6-3c-8 0-14.4-6.4-14.4-14.4s6.4-14.4 14.4-14.4 14.4 6.4 14.4 14.4-6.4 14.4-14.4 14.4zm57.7 3c-8 0-14.4-6.4-14.4-14.4s6.5-14.4 14.4-14.4 14.4 6.4 14.4 14.4-6.5 14.4-14.4 14.4zM215 274.4c-8 0-14.4-6.5-14.4-14.4 0-8 6.4-14.4 14.4-14.4s14.4 6.4 14.4 14.4-6.5 14.4-14.4 14.4zm43.2 14.5c-8 0-14.4-6.5-14.4-14.4s6.4-14.4 14.4-14.4 14.4 6.5 14.4 14.4-6.4 14.4-14.4 14.4zm43.2-14.5c-8 0-14.4-6.5-14.4-14.4 0-8 6.5-14.4 14.4-14.4s14.4 6.4 14.4 14.4c.1 8-6.4 14.4-14.4 14.4z\"></path><path fill=\"#D60537\" d=\"M157.3 175.4h201.8V233H157.3v-57.6z\"></path><path fill=\"#EACE00\" d=\"M142.9 43.8s57.6-14.4 115.3-14.4 115.3 14.4 115.3 14.4l-14.4 57.7s-50.5-14.4-100.9-14.4-100.9 14.4-100.9 14.4l-14.4-57.7z\"></path><path fill=\"#7A6920\" d=\"M258.2 72.7c-8 0-14.4-6.4-14.4-14.4s6.4-14.4 14.4-14.4 14.4 6.5 14.4 14.4-6.4 14.4-14.4 14.4zm57.7 5c-8 0-14.4-6.4-14.4-14.4s6.5-14.4 14.4-14.4 14.4 6.5 14.4 14.4-6.5 14.4-14.4 14.4zm-115.3 0c-8 0-14.4-6.4-14.4-14.4s6.4-14.4 14.4-14.4S215 55.3 215 63.2s-6.5 14.5-14.4 14.5z\"></path><circle fill=\"#FFF\" cx=\"258.2\" cy=\"204.2\" r=\"16.9\"></circle></svg>",
  "assets/board-native/flags/BM.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>BM</title><path fill=\"#c8102e\" d=\"M0 0h513v342H0z\"></path><path fill=\"#fff\" stroke=\"#000\" stroke-width=\"2\" d=\"M303.9 94.94v99.69c0 59.81 79.75 99.69 79.75 99.69s79.75-39.88 79.75-99.69V94.94H303.9z\"></path><path fill=\"#2F8F22\" d=\"M436.37 254.44H330.93c23.13 25.08 52.72 39.88 52.72 39.88s29.59-14.8 52.72-39.88z\"></path><circle fill=\"#65B5D2\" cx=\"383.65\" cy=\"214.56\" r=\"39.88\"></circle><circle fill=\"#c8102e\" cx=\"343.77\" cy=\"194.63\" r=\"19.94\"></circle><circle fill=\"#c8102e\" cx=\"423.52\" cy=\"194.63\" r=\"19.94\"></circle><circle fill=\"#c8102e\" cx=\"383.65\" cy=\"154.75\" r=\"19.94\"></circle><path fill=\"#012169\" d=\"M0 0h256.5v171H0z\"></path><g fill=\"#FFF\"><path d=\"M256.5 0v30.6l-45.3 25.2h45.3v59.4h-59.2l59.2 32.9V171h-26.7l-73.7-40.9V171h-55.7v-48.7L12.8 171H0v-30.6l45.3-25.2H0V55.8h59.2L0 22.9V0h26.7l73.7 40.9V0h55.7v48.7L243.7 0z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-55.7-59.4L0 0v15.8l72 40z\"></path></g><g fill=\"#c8102e\"><path d=\"M144.3 0h-32.1v69.5H0v32h112.2V171h32.1v-69.5h112.2v-32H144.3z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-84.1 0-72 40V171l100.4-55.8zm28.4-59.4L0 0v15.8l72 40zm84.1 0 72-40V0L156.1 55.8z\"></path></g></svg>",
  "assets/board-native/flags/BN.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>BN</title><path fill=\"#FFDA44\" d=\"M0 0h513v342H0z\"></path><path d=\"m0 193.74 513 127.19V214.26L0 97.08z\"></path><path fill=\"#FFF\" d=\"M513 234.26v-86.67L0 20.41v86.67\"></path><g fill=\"#D80027\" stroke=\"#231F20\" stroke-width=\"3\" stroke-miterlimit=\"10\"><path d=\"M306.4 134.01a50.28 50.28 0 0 1 6.07 24.02c0 21.55-13.51 39.94-32.52 47.19v-59.51c5.7-1.19 10-6.37 10-12.59 6.9 0 12.5-5.75 12.5-12.85h-.42c6.9 0 12.91-5.75 12.91-12.85h-34.99V76.58l-14.99-27.71-15 27.71v30.84h-34.99c0 7.1 6.01 12.85 12.91 12.85h-.42c0 7.1 5.6 12.85 12.5 12.85 0 6.22 4.29 11.4 9.99 12.59v61.37c-22.09-5.39-38.48-25.3-38.48-49.05 0-8.7 2.2-16.88 6.07-24.02-10.96 11.21-17.72 26.53-17.72 43.44 0 34.32 27.82 62.15 62.15 62.15s62.15-27.83 62.15-62.15c0-16.91-6.77-32.24-17.72-43.44z\"></path><path d=\"M198.46 226.81s20.69 27.71 66.5 27.71 66.5-27.71 66.5-27.71l13.47 28.37s-21.03 27.71-79.97 27.71-79.97-27.71-79.97-27.71l13.47-28.37zm-69.22-93.63h20.88l24.93 27.26v73.45h-26.28v-68.37zm270.76 0h-20.88l-24.93 27.26v73.45h26.27v-68.37z\"></path></g></svg>",
  "assets/board-native/flags/BO.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>BO</title><path fill=\"#d52b1e\" d=\"M0 0h513v114H0z\"></path><path fill=\"#f9e300\" d=\"M0 114h513v114H0z\"></path><path fill=\"#007934\" d=\"M0 228h513v114H0z\"></path></svg>",
  "assets/board-native/flags/BQ.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>BQ</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#012a87\" d=\"M0 342h513V0z\"></path><path fill=\"#f9d90f\" d=\"M250.4 0H0v166.9z\"></path><path fill=\"#dc171d\" d=\"m140.4 118.3 12.2 21.2h24.5l-12.3 21.1 12.3 21.2h-24.5L140.4 203l-12.2-21.2h-24.5l12.3-21.2-12.3-21.1h24.5z\"></path><circle fill=\"none\" stroke=\"#000\" stroke-width=\"9\" stroke-miterlimit=\"10\" cx=\"140.4\" cy=\"160.6\" r=\"57.7\"></circle></svg>",
  "assets/board-native/flags/BR.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>BR</title><path fill=\"#009b3a\" d=\"M0 0h513v342H0z\"></path><path fill=\"#fedf00\" d=\"m256.5 19.3 204.9 151.4L256.5 322 50.6 170.7z\"></path><circle fill=\"#FFF\" cx=\"256.5\" cy=\"171\" r=\"80.4\"></circle><path fill=\"#002776\" d=\"M215.9 165.7c-13.9 0-27.4 2.1-40.1 6 .6 43.9 36.3 79.3 80.3 79.3 27.2 0 51.3-13.6 65.8-34.3-24.9-31-63.2-51-106-51zm119 20.3c.9-5 1.5-10.1 1.5-15.4 0-44.4-36-80.4-80.4-80.4-33.1 0-61.5 20.1-73.9 48.6 10.9-2.2 22.1-3.4 33.6-3.4 46.8.1 89 19.5 119.2 50.6z\"></path></svg>",
  "assets/board-native/flags/BS.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>BS</title><path fill=\"#ffc72c\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 0h513v114H0zm0 228h513v114H0z\" fill=\"#00778b\"></path><path d=\"M256 171 0 342V0z\"></path></svg>",
  "assets/board-native/flags/BT.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>BT</title><path fill=\"#FF7415\" d=\"M0 0h513v342H0z\"></path><path fill=\"#FFDA44\" d=\"M513 0H0v342\"></path><path fill=\"none\" stroke=\"#FFF\" stroke-width=\"42\" stroke-miterlimit=\"10\" d=\"M128.7 255.5s35 54 67.3 32.4c56.9-37.9-68.9-108.6-2.9-152.6 58.3-38.8 76.6 103.5 137.6 62.8 59-39.3-64.7-111.4-9.2-148.4 33.4-22.2 67.1 32.6 67.1 32.6\"></path></svg>",
  "assets/board-native/flags/BV.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>BV</title><path fill=\"#EF2B2D\" d=\"M0 0h513v342H0z\"></path><path fill=\"#FFF\" class=\"prefix__st1\" d=\"M139.9 0h93.3v342h-93.3z\"></path><path fill=\"#FFF\" class=\"prefix__st1\" d=\"M0 119h513v104.1H0z\"></path><path fill=\"#002868\" d=\"M163.2 0h46.6v342h-46.6z\"></path><path fill=\"#002868\" d=\"M0 145h513v52H0z\"></path></svg>",
  "assets/board-native/flags/BW.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>BW</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 238h513v104H0zM0 0h513v104H0z\" fill=\"#6da9d2\"></path><path d=\"M0 125.5h513v89.656H0z\"></path></svg>",
  "assets/board-native/flags/BY.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>BY</title><path fill=\"#007C30\" d=\"M0 0h513v342H0z\"></path><path fill=\"#CE1720\" d=\"M0 230h513V0H0\"></path><path fill=\"#FFF\" d=\"M100 230V0H0v342h513-413z\"></path><path d=\"M28 159.6 8.6 128.2 28 97.4l19.3 30.8zm44.6 0-19.3-31.4 19.3-30.8L92 128.2zM28 241.2 8.6 209.8 28 179l19.3 30.8zm44.6 0-19.3-31.4L72.6 179 92 209.8z\" fill=\"#CE1720\"></path><path d=\"m28 73.8-16.1-26L28 22.2l16 25.6zm44.6 0-16-26 16-25.6 16.1 25.6zM28 318l-16.1-26.1L28 266.3l16 25.6zm44.6 0-16-26.1 16-25.6 16.1 25.6z\" fill=\"none\" stroke=\"#CE1720\" stroke-width=\"7\"></path></svg>",
  "assets/board-native/flags/BZ.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>BZ</title><path fill=\"#003e87\" d=\"M0 0h513v342H0z\"></path><circle fill=\"#FFF\" cx=\"260.9\" cy=\"170.9\" r=\"118.9\"></circle><circle fill=\"none\" stroke=\"#6DA544\" stroke-width=\"18\" stroke-miterlimit=\"10\" cx=\"261.9\" cy=\"173.1\" r=\"94.5\"></circle><g stroke=\"#000\"><path fill=\"#003e87\" d=\"m261.9 151.5-50.6 23.4v20c0 11.8 6.1 22.8 16.2 28.9L262 239l34.5-15.2c10-6.2 16.2-17.1 16.2-28.9v-20l-50.8-23.4z\"></path><path fill=\"#FFDA44\" d=\"M211.3 128.1h101.3v46.7H211.3z\"></path></g><path d=\"M0 0h513v35H0zm0 306h513v35H0z\" fill=\"#ce1127\"></path></svg>",
  "assets/board-native/flags/CA.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>CA</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 0h142v342H0zm371 0h142v342H371zm-64.5 206 50.4-25.2-25.2-12.6V143l-50.4 25.2 25.2-50.4h-25.2L256.1 80l-25.2 37.8h-25.2l25.2 50.4-50.4-25.2v25.2l-25.2 12.6 50.4 25.2-12.6 25.2h50.4V269h25.2v-37.8h50.4z\" fill=\"red\"></path></svg>",
  "assets/board-native/flags/CC.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>CC</title><path fill=\"green\" d=\"M0 0h513v342H0z\"></path><path d=\"m422.7 252.4 6.2 12.8 13.8-3.2-6.2 12.8 11.2 8.8-13.9 3.2V301l-11.1-8.9-11.1 8.9v-14.2l-13.8-3.2 11.1-8.8-6.2-12.8 13.9 3.2zm-46.6-136.3 6.2 12.9 13.8-3.2-6.2 12.8 11.2 8.8-13.9 3.1v14.3l-11.1-8.9-11.1 8.9.1-14.3-13.9-3.1 11.1-8.8-6.2-12.8L370 129zm37-77.8 6.2 12.8 13.8-3.2-6.2 12.8 11.2 8.9-13.9 3.1v14.2L413.1 78 402 86.9l.1-14.2-13.9-3.1 11.1-8.9-6.2-12.8 13.9 3.2zm51.8 58.4 6.2 12.8 13.9-3.2-6.3 12.8 11.2 8.9-13.9 3.1.1 14.2-11.2-8.9-11.1 8.9.1-14.2L440 128l11.2-8.9-6.3-12.8 13.9 3.2zm-28 68.1 4.9 14.8h15.6l-12.6 9.2 4.8 14.9-12.7-9.2-12.6 9.2 4.8-14.9-12.6-9.2h15.6zM306.8 254.7c-49.2 0-89.1-39.9-89.1-89.1s39.9-89.1 89.1-89.1c15.3 0 29.8 3.9 42.4 10.7C329.4 67.9 302.3 56 272.5 56c-60.5 0-109.6 49.1-109.6 109.6S212 275.3 272.5 275.3c29.8 0 56.9-11.9 76.6-31.3-12.6 6.8-27 10.7-42.3 10.7zM140.4 59.5C129.7 41 109.7 28.6 86.8 28.6S44 41 33.3 59.5h107.1zm.2.4-53.8 53.8-53.7-53.8C28 68.9 25 79.3 25 90.5c0 34.2 27.7 61.9 61.9 61.9s61.9-27.7 61.9-61.9c-.1-11.2-3.1-21.6-8.2-30.6z\" fill=\"#FFDA44\"></path><path fill=\"#A2001D\" d=\"M71.4 98.2v52.2c4.9 1.3 10.1 1.9 15.5 1.9s10.5-.7 15.5-1.9V98.2h-31z\"></path></svg>",
  "assets/board-native/flags/CD.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>CD</title><path fill=\"#338AF3\" d=\"M0 0h513v342H0z\"></path><path fill=\"#FFDA44\" d=\"M513 66.9V0H411.7L0 274.4V342h100.3z\"></path><path fill=\"#D80027\" d=\"M513 0v40.1L60.2 342H0v-40.8L451.8 0z\"></path><path fill=\"#FFDA44\" d=\"m93.6 31.2 16.3 50.4H163l-42.9 31.2 16.4 50.5-42.9-31.2-43 31.2L67 112.8 24.1 81.6h53.1z\"></path></svg>",
  "assets/board-native/flags/CF.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>CF</title><path fill=\"#d21034\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 171h211.5v85.3H0zm300.5 0H512v85.3H300.5z\" fill=\"#3a9927\"></path><path fill=\"#003082\" d=\"M0 0v85.3h211.5V0h89v85.3H513V0z\"></path><path d=\"M300.5 85.3H512v85.3H300.5zM0 85.3h211.5v85.3H0z\" fill=\"#FFF\"></path><path d=\"M300.5 342h-89v-86H0v86h513v-86H300.5zM105.7 8.6l8.6 26.2h27.5L119.5 51l8.6 26.2L105.7 61 83.4 77.2 91.9 51 69.6 34.8h27.6z\" fill=\"#ffce00\"></path></svg>",
  "assets/board-native/flags/CG.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 900 600\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>CG</title><path fill=\"#009739\" d=\"M0 0h900v600H0z\"></path><path d=\"M0 600 600 0h300v600z\" fill=\"#ffd100\"></path><path d=\"M900 0v600H300z\" fill=\"#dc241f\"></path></svg>",
  "assets/board-native/flags/CH.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 768 512\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>CH</title><path fill=\"red\" d=\"M0 0h768v512H0V0z\"></path><path fill=\"#FFF\" d=\"M336 96h96v112h112v96H432v112h-96V304H224v-96h112V96z\"></path></svg>",
  "assets/board-native/flags/CI.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>CI</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#009e60\" d=\"M342 0h171v342H342z\"></path><path fill=\"#f77f00\" d=\"M0 0h171v342H0z\"></path></svg>",
  "assets/board-native/flags/CK.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>CK</title><path fill=\"#012169\" d=\"M0 0h513v342H0z\"></path><path d=\"m384 71.4 5.3 16.2h17.1l-13.9 10.1 5.3 16.2-13.8-10-13.8 10 5.3-16.2-13.9-10.1h17.1zm-70.2 29.1 15.2 7.7 12.1-12.1-2.7 16.9 15.3 7.8-16.9 2.6-2.7 16.9-7.8-15.2-16.8 2.7 12.1-12.1zm-29.1 70.2 16.3-5.3v-17.1l10 13.8 16.3-5.3-10.1 13.9 10.1 13.8-16.3-5.3-10 13.8v-17.1zm29.1 70.2 7.7-15.3-12-12 16.8 2.6 7.8-15.2 2.7 16.9 16.9 2.7-15.3 7.7 2.7 16.9-12.1-12.1zM384 270l-5.3-16.3h-17.1l13.9-10-5.3-16.3 13.8 10 13.8-10-5.3 16.3 13.9 10h-17.1zm70.2-29.1-15.2-7.8-12.1 12.1 2.7-16.9-15.3-7.7 16.9-2.7 2.7-16.9 7.8 15.2 16.8-2.6-12.1 12zm29.1-70.2-16.3 5.2V193l-10-13.8-16.3 5.3 10.1-13.8-10.1-13.9 16.3 5.3 10-13.8v17.1zm-29.1-70.2-7.7 15.2 12 12.1-16.8-2.7-7.8 15.2-2.7-16.9-16.9-2.6 15.3-7.8-2.7-16.9 12.1 12.1z\" fill=\"#FFF\"></path><path fill=\"#012169\" d=\"M0 0h256.5v171H0z\"></path><g fill=\"#FFF\"><path d=\"M256.5 0v30.6l-45.3 25.2h45.3v59.4h-59.2l59.2 32.9V171h-26.7l-73.7-40.9V171h-55.7v-48.7L12.8 171H0v-30.6l45.3-25.2H0V55.8h59.2L0 22.9V0h26.7l73.7 40.9V0h55.7v48.7L243.7 0z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-55.7-59.4L0 0v15.8l72 40z\"></path></g><g fill=\"#D80027\"><path d=\"M144.3 0h-32.1v69.5H0v32h112.2V171h32.1v-69.5h112.2v-32H144.3z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-84.1 0-72 40V171l100.4-55.8zm28.4-59.4L0 0v15.8l72 40zm84.1 0 72-40V0L156.1 55.8z\"></path></g></svg>",
  "assets/board-native/flags/CL.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>CL</title><path fill=\"#D80027\" d=\"M0 0h513v342H0z\"></path><path fill=\"#FFF\" d=\"M196 0h317v171H196z\"></path><path fill=\"#0037A1\" d=\"M0 0h196v171H0z\"></path><path fill=\"#FFF\" d=\"M98 24.5 113.1 71H162l-39.6 28.7 15.2 46.5L98 117.5l-39.6 28.7 15.2-46.5L34 71h48.9z\"></path></svg>",
  "assets/board-native/flags/CM.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>CM</title><path fill=\"#ce1126\" d=\"M0 0h513v342H0z\"></path><path fill=\"#007a5e\" d=\"M0 0h171v342H0z\"></path><path d=\"M342 0h171v342H342zm-86 102.2 17.2 53H329L283.9 188l17.2 53-45.1-32.7-45.1 32.7 17.2-53-45.1-32.8h55.8z\" fill=\"#fcd116\"></path></svg>",
  "assets/board-native/flags/CN.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>CN</title><path fill=\"#D80027\" d=\"M0 0h513v342H0z\"></path><path d=\"m226.8 239.2-9.7-15.6-17.9 4.4 11.9-14.1-9.7-15.6 17.1 6.9 11.8-14.1-1.3 18.4 17.1 6.9-17.9 4.4zM290.6 82l-10.1 15.4 11.6 14.3-17.7-4.8-10.1 15.5-1-18.4-17.7-4.8 17.2-6.6-1-18.4 11.6 14.3zm-54.4-56.6-2 18.3 16.8 7.6-18 3.8-2 18.3-9.2-16-17.9 3.8 12.3-13.7-9.2-15.9 16.8 7.5zm56.6 136.4-14.9 10.9 5.8 17.5-14.9-10.8-14.9 11 5.6-17.6-14.9-10.7 18.4-.1 5.6-17.6 5.8 17.5zM115 46.3l17.3 53.5h56.2l-45.4 32.9 17.3 53.5-45.4-33-45.5 33 17.4-53.5-45.5-32.9h56.3z\" fill=\"#FFDA44\"></path></svg>",
  "assets/board-native/flags/CO.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>CO</title><path fill=\"#FFDA44\" d=\"M0 0h513v342H0z\"></path><path fill=\"#D80027\" d=\"M0 256.5h513V342H0z\"></path><path fill=\"#0052B4\" d=\"M0 171h513v85.5H0z\"></path></svg>",
  "assets/board-native/flags/CR.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>CR</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#D80027\" d=\"M0 114h513v114H0z\"></path><path fill=\"#0052B4\" d=\"M0 285h513v57H0zM0 0h513v57H0z\"></path></svg>",
  "assets/board-native/flags/CU.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>CU</title><path fill=\"#FF9811\" d=\"M0-40.8v422.9-211.4z\"></path><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 0h513v68.3H0zm0 136.5h513v68.3H0zm0 136.6h513v68.3H0z\" fill=\"#0052B4\"></path><path fill=\"#D80027\" d=\"M256 170.7 0 342V0z\"></path><path fill=\"#FFF\" d=\"m86.5 111.4 12.7 39.2h41.3l-33.4 24.2 12.8 39.3-33.4-24.2-33.4 24.2 12.8-39.3-33.4-24.2h41.2z\"></path></svg>",
  "assets/board-native/flags/CV.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>CV</title><path fill=\"#003893\" d=\"M0 0h513v342H0z\"></path><path fill=\"#cf2027\" d=\"M0 182.2h513v41.4H0z\"></path><path fill=\"#FFF\" d=\"M0 140.8h513v41.4H0zm0 82.8h513V265H0z\"></path><path d=\"m150.4 70 6.9 21.1h22.2l-18 13.1 6.9 21.1-18-13.1-17.9 13.1 6.8-21.1-17.9-13.1h22.2zm0 209.7 6.9 21.1h22.2l-18 13 6.9 21.2-18-13.1-17.9 13.1 6.8-21.2-17.9-13h22.2zm-97.6-70.9 6.9 21.1h22.2l-18 13 6.9 21.2-18-13.1-17.9 13.1 6.8-21.2-17.9-13H46zM90.1 91l6.9 21.1h22.2l-18 13 6.9 21.2-18-13.1-17.9 13.1 6.8-21.2-18-13h22.3zm-66.3 71H46l6.8-21.1 6.9 21.1h22.2l-18 13.1 6.9 21.1-18-13-17.9 13 6.8-21.1zm48.4 148.9 6.8-21.1-18-13h22.3l6.8-21.2 6.9 21.2h22.2l-18 13 6.9 21.1-18-13zM248 208.8l-6.9 21.1h-22.2l18 13-6.9 21.2 18-13.1 18 13.1-6.9-21.2 18-13h-22.2zM210.7 91l-6.8 21.1h-22.2l17.9 13-6.8 21.2 17.9-13.1 18 13.1-6.9-21.2 18-13h-22.2zm66.4 71h-22.2l-6.9-21.1-6.9 21.1h-22.2l18 13.1-6.9 21.1 18-13 18 13-6.9-21.1zm-48.4 148.9-6.9-21.1 18-13h-22.2l-6.9-21.2-6.8 21.2h-22.2l17.9 13-6.8 21.1 17.9-13z\" fill=\"#f7d116\" stroke=\"#000\"></path></svg>",
  "assets/board-native/flags/CW.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>CW</title><path fill=\"#002b7f\" d=\"M0 0h513v342H0z\"></path><path fill=\"#f9e814\" d=\"M0 233.5h513v51H0z\"></path><path d=\"m168.7 86.5 12.9 39.8h41.8l-33.8 24.5 12.9 39.7-33.8-24.5-33.8 24.5 12.9-39.7-33.8-24.5h41.8zm-83.3-54 7.8 23.9h25L97.9 71.1l7.8 23.8-20.3-14.7-20.3 14.7 7.8-23.8-20.3-14.7h25.1z\" fill=\"#FFF\"></path></svg>",
  "assets/board-native/flags/CX.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>CX</title><path fill=\"#0021ad\" d=\"M0 0h513v342H0z\"></path><path fill=\"#1c8a42\" d=\"M0 0h513v342\"></path><path d=\"m77.6 272 5.7 11.9 12.8-3-5.7 11.9 10.3 8.1-12.8 2.9V317l-10.3-8.3-10.2 8.3v-13.2l-12.8-2.9 10.3-8.1-5.8-11.9 12.9 3zm-37.1-98.9 5.7 11.9 12.8-3-5.7 11.8 10.3 8.2-12.9 2.9.1 13.2-10.3-8.3-10.3 8.3.1-13.2-12.9-2.9 10.4-8.2L22 182l12.8 3zm37.1-80.9 5.7 11.8 12.8-2.9-5.7 11.8 10.3 8.2-12.8 2.9v13.1l-10.3-8.2-10.2 8.2V124l-12.8-2.9 10.3-8.2-5.8-11.8L72 104zm46.1 62.9 5.7 11.9 12.8-3-5.7 11.9 10.3 8.1-12.8 2.9v13.2l-10.3-8.2-10.2 8.2v-13.2l-12.8-2.9 10.3-8.1-5.7-11.9 12.8 3zm-32.9 54 4.4 13.7h14.5L98 231.3l4.5 13.7-11.7-8.4-11.7 8.4 4.5-13.7-11.7-8.5h14.4z\" fill=\"#FFF\"></path><circle fill=\"#ffc639\" cx=\"267.1\" cy=\"170.7\" r=\"74.5\"></circle><path fill=\"#1c8a42\" d=\"M267.1 220.3h24.8s10.8-19 0-37.2l24.8-24.8-12.4-24.8h-12.4s-6.2 18.6-31 18.6-31-18.6-31-18.6h-12.4l12.4 24.8-12.4 24.8 12.4 12.4s12.4-24.8 37.2-12.4c0 0 10.5 15.5 0 37.2z\"></path><path fill=\"#ffc639\" d=\"M464.4 92.2c.6-2.9-.2-17.6-.2-20.7 0-21.3-13.9-39.4-33.2-45.7 5.9 12 9.2 25.4 9.2 39.7 0 4.8-.4 9.5-1.1 14.1-2.9-4.7-6.6-8.9-11.2-12.6-17.1-13.6-40.6-14-57.9-2.5 13.4 2.9 26.3 8.9 37.7 18 9 7.1 16.2 16.8 21.7 26.1 0 0-17.8 10.9-31 15.1s-42.3 7.9-42.3 7.9c72 12 132-36 132-36-6.5-13.4-15.8-4-23.7-3.4z\"></path></svg>",
  "assets/board-native/flags/CY.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>CY</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#DB7D00\" d=\"M141.7 154.7s.2 67.1 74.7 65.3l4.5 13.9h8.9s-7.4-41.1 60.1-41.5c0 0 0-27.6 27.6-27.6H359s-66-51.8 58.9-118l1.8-13.1s-129.9 71-198.9 57.2c0 0 10.7 42.5-10.8 42.5-10.8 0-9.7-8.1-32.3-8.1-18.7 0-17.3 19.7-26.3 19.5-8.9-.2-18.8-12.3-19.6-10.2-.7 2.1 9.9 20.1 9.9 20.1z\"></path><g fill=\"#006651\"><path d=\"M237.2 308.1c6.9-5 13-6.6 22.4-8.3s19.4-4.4 24.6-5.8-17.7 6.6-23.5 8.3c-5.8 1.6-23.5 5.8-23.5 5.8zm37.9-14.7c-1.9-11.9 2.8-24.3 13.5-29.3 2.5 8.6-5.2 23.2-13.5 29.3zm18.2-6.2c-5.8-9.8 4-22.6 11.1-28.8 3.3 6-2.5 23.7-11.1 28.8zm16.9-7.6c-6.2-8.4 1.1-23.2 8.8-29 3.1 8.2.1 23.2-8.8 29zm16.9-10.6c-5.6-8-1.7-20.4 6.3-28.4 5.8 6.6.9 21-6.3 28.4zm13.5-10.7c-4.7-7.5 1.1-25.4 8.6-30.4 3.3 6.6.8 25.4-8.6 30.4zm10.8-2.8c-1.4-10.8 17.4-22.7 25.2-22.4-.9 8.9-8.9 18.6-25.2 22.4zm-10.5 12.2c8.8-9.1 26-9.1 32.1-7.2-1.7 5.3-21.9 16.9-32.1 7.2z\"></path><path d=\"M328.7 276.8c12.4-3.3 20.5-6.1 27.9 1.7-5.2 6.6-25.4 4.7-27.9-1.7zm-17.7 8c11.9-6.4 26.3 3 28.5 8.6-13.3 5.5-28.7-7.2-28.5-8.6zm-16.3 9.2c10.8-4.1 23.2 1.4 28.2 7.5-5.8 2.7-21 5.7-28.2-7.5zm-14.9 4.7c12.4-1.4 24.4 8 27 13.4-15.9 1.5-22-3.2-27-13.4zm-4 9.4c-6.9-5-13-6.6-22.4-8.3-9.4-1.7-19.4-4.4-24.6-5.8-5.3-1.4 17.7 6.6 23.5 8.3 5.8 1.6 23.5 5.8 23.5 5.8zm-37.9-14.7c1.9-11.9-2.8-24.3-13.5-29.3-2.5 8.6 5.2 23.2 13.5 29.3zm-18.2-6.2c5.8-9.8-4-22.6-11.1-28.8-3.3 6 2.5 23.7 11.1 28.8zm-16.9-7.6c6.2-8.4-1.1-23.2-8.8-29-3.1 8.2-.1 23.2 8.8 29zM185.9 269c5.6-8 1.7-20.4-6.3-28.4-5.8 6.6-.9 21 6.3 28.4zm-13.5-10.7c4.7-7.5-1.1-25.4-8.6-30.4-3.3 6.6-.8 25.4 8.6 30.4zm-10.8-2.8c1.4-10.8-17.4-22.7-25.2-22.4.9 8.9 8.9 18.6 25.2 22.4zm10.5 12.2c-8.8-9.1-26-9.1-32.1-7.2 1.7 5.3 21.9 16.9 32.1 7.2z\"></path><path d=\"M184.3 276.8c-12.4-3.3-20.5-6.1-27.9 1.7 5.2 6.6 25.4 4.7 27.9-1.7zm17.7 8c-11.9-6.4-26.3 3-28.5 8.6 13.3 5.5 28.7-7.2 28.5-8.6zm16.3 9.2c-10.8-4.1-23.2 1.4-28.2 7.5 5.8 2.7 21 5.7 28.2-7.5zm14.9 4.7c-12.4-1.4-24.4 8-27 13.4 15.9 1.5 22-3.2 27-13.4z\"></path></g></svg>",
  "assets/board-native/flags/CZ.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>CZ</title><path fill=\"#11457e\" d=\"M0 0h513v342H0z\"></path><path fill=\"#d7141a\" d=\"M513 171v171H0l256.5-171z\"></path><path fill=\"#FFF\" d=\"M513 0v171H256.5L0 0z\"></path></svg>",
  "assets/board-native/flags/DE.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>DE</title><path fill=\"#D80027\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 0h513v114H0z\"></path><path fill=\"#FFDA44\" d=\"M0 228h513v114H0z\"></path></svg>",
  "assets/board-native/flags/DJ.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>DJ</title><path fill=\"#12ad2b\" d=\"M0 0h513v342H0z\"></path><path fill=\"#6ab2e7\" d=\"M513 0v166.7L0 170.8V0z\"></path><path fill=\"#FFF\" d=\"M256 170.7 0 342V0z\"></path><path fill=\"#d7141a\" d=\"m89.8 92.5 17 52.4H162l-44.6 32.5 17 52.4-44.6-32.4-44.6 32.4 17-52.4-44.6-32.5h55.2z\"></path></svg>",
  "assets/board-native/flags/DK.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>DK</title><path fill=\"#c60c30\" d=\"M0 0h513v342H0z\"></path><path fill=\"#FFF\" d=\"M190 0h-60v140H0v60h130v142h60V200h323v-60H190z\"></path></svg>",
  "assets/board-native/flags/DM.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>DM</title><path fill=\"#496E2D\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 110.7v120h513v-120z\"></path><path fill=\"#FFDA44\" d=\"M0 110.7h513v40H0z\"></path><path fill=\"#FFF\" d=\"M0 190.7h513v40H0z\"></path><path d=\"M196 0h120v342H196z\"></path><path fill=\"#FFDA44\" d=\"M196 0h40v342h-40z\"></path><path fill=\"#FFF\" d=\"M274.7 0h40v342h-40z\"></path><circle fill=\"#D80027\" cx=\"256\" cy=\"170.7\" r=\"123.1\"></circle><path d=\"m256 58.6 4.6 14.2h15l-12.1 8.9 4.6 14.2-12.1-8.8-12.1 8.8 4.6-14.2-12.1-8.9h15zM190.1 80l12.2 8.8 12.1-8.8-4.6 14.3 12.1 8.8h-15l-4.6 14.2-4.7-14.2h-15l12.1-8.8zm-40.7 56h15l4.6-14.2 4.7 14.2h15l-12.2 8.8 4.7 14.3-12.2-8.8-12.1 8.8 4.6-14.3zm0 69.3 12.1-8.8-4.6-14.3L169 191l12.2-8.8-4.7 14.3 12.2 8.8h-15l-4.7 14.3-4.6-14.3zm40.7 56.1 4.6-14.3-12.1-8.8h15l4.7-14.3 4.6 14.3h15l-12.1 8.8 4.6 14.3-12.1-8.9zm65.9 21.4-4.6-14.3h-15l12.1-8.8-4.6-14.3 12.1 8.8 12.1-8.8-4.6 14.3 12.1 8.8h-15zm65.9-21.4-12.2-8.9-12.1 8.9 4.6-14.3-12.1-8.8h15l4.6-14.3 4.7 14.3h15l-12.1 8.8zm40.7-56.1h-15l-4.6 14.3-4.7-14.3h-15l12.2-8.8-4.7-14.3L343 191l12.1-8.8-4.6 14.3zm0-69.3-12.1 8.8 4.6 14.3-12.1-8.8-12.2 8.8 4.7-14.3-12.2-8.8h15l4.7-14.2 4.6 14.2zm-40.7-56-4.6 14.3 12.1 8.8h-15l-4.7 14.2-4.6-14.2h-15l12.1-8.8-4.6-14.3 12.1 8.8zM279.3 168.7c-11-21.1-14.5-25.1-14.5-25.1s.4-9.7.4-15.6c0-8.8-7.4-15.8-16.5-15.8-8.6 0-15.7 2.9-16.5 11-4.2.9-8.6 4.1-8.6 10.7 0 4.8 1 7.3 5.2 9.3 2.1-4.6 4.3-4.8 9.3-6.4.8.6 1.7 3 2.6 3.4l.3 1s-13.3 6.6-13.3 30.9c0 29.5 22 45.4 22 45.4l-1.8.3-1.9 7.1h22v-7.2l11 17.5c.3-.3 10.2-47.6.3-66.5z\" fill=\"#496E2D\"></path></svg>",
  "assets/board-native/flags/DO.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>DO</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#D80027\" d=\"M0 216h211v126H0z\"></path><path fill=\"#0052B4\" d=\"M0 0h211v126H0z\"></path><path fill=\"#D80027\" d=\"M302 0h211v126H302z\"></path><path fill=\"#0052B4\" d=\"M302 216h211v126H302z\"></path><g stroke=\"#FFF\" stroke-width=\"5\" stroke-miterlimit=\"10\"><path fill=\"#0052B4\" d=\"M256 130h-49.9v49.4s19.5 6 49.9 6V130z\"></path><path fill=\"#D80027\" d=\"M206.1 179.4v6c0 27.5 22.3 49.9 49.9 49.9v-49.9c-30.4 0-49.9-6-49.9-6z\"></path><path fill=\"#0052B4\" d=\"M256 235.3c27.5 0 49.9-22.3 49.9-49.9v-6s-19.5 6-49.9 6v49.9z\"></path><path fill=\"#D80027\" d=\"M256 130v55.4c30.4 0 49.9-6 49.9-6V130H256z\"></path></g></svg>",
  "assets/board-native/flags/DZ.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>DZ</title><path fill=\"#41662E\" d=\"M0 0h513v342H0z\"></path><path fill=\"#FFF\" d=\"M256.5 0H513v342H256.5z\"></path><g fill=\"#D80027\"><path d=\"m341.5 105.3-29.4 40.4-47.5-15.4 29.4 40.4-29.4 40.4 47.5-15.4 29.4 40.4v-50l47.5-15.5-47.5-15.4z\"></path><path d=\"M309.9 276.7c-58.5 0-106-47.5-106-106s47.5-106 106-106c18.3 0 35.4 4.6 50.4 12.7-23.5-23-55.7-37.2-91.2-37.2-72 0-130.4 58.4-130.4 130.4S197.1 301 269.1 301c35.5 0 67.7-14.2 91.2-37.2-14.9 8.2-32.1 12.9-50.4 12.9z\"></path></g></svg>",
  "assets/board-native/flags/EC.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>EC</title><path fill=\"#FFDA44\" d=\"M0 0h513v342H0z\"></path><path fill=\"#0052B4\" d=\"M0 170.7h513V256H0z\"></path><path fill=\"#D80027\" d=\"M0 256h513v85.3H0z\"></path><circle fill=\"#FFDA44\" cx=\"256\" cy=\"171\" r=\"60\"></circle><path fill=\"#4C1F00\" d=\"M369.2 79.9s-27.2-13.8-33.9-16c-6.7-2.2-49.1-13.2-49.1-7 0 10.3-13.5 12-15.5 12s-2-5.3-14.8-5.3-13.7 4.8-15.8 4.8c-2.2 0-14.5-1-14.5-11.5 0-5.2-42.9 4-49.1 7-6.1 3.1-33.9 16-33.9 16s45.8 2.7 53.9 6.2 43.8 16.5 43.8 16.5l-2.8 13.3h37.8l-3.8-13.3s35.1-12.7 43.8-16.5 53.9-6.2 53.9-6.2z\"></path><path fill=\"#57BA17\" d=\"M217.7 171.7c0 21.1 17.2 38.3 38.3 38.3 21.1 0 38.3-17.2 38.3-38.3v-11.5h-76.5v11.5z\"></path><path fill=\"#338AF3\" d=\"M256 110.5c-21.1 0-38.3 17.2-38.3 38.3v11.5h76.5v-11.5c.1-21.1-17.1-38.3-38.2-38.3z\"></path></svg>",
  "assets/board-native/flags/EE.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>EE</title><path fill=\"#111\" d=\"M0 0h513v342H0z\"></path><path fill=\"#368FD8\" d=\"M0 0h513v114H0z\"></path><path fill=\"#FFF\" d=\"M0 228h513v114H0z\"></path></svg>",
  "assets/board-native/flags/EG.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>EG</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#D80027\" d=\"M0 0h513v114H0z\"></path><path d=\"M0 228h513v114H0z\"></path><path fill=\"#C09300\" d=\"M220.3 204.4s0-58.4 4.5-64.7c3.1-4.3 16.8 5.2 22.7 4.5 0 0 4.2-7.5 4.5-12 .3-4.6-1.1-7.6-4.9-6.2 0 0-1.2-2.1.5-3.3 1.6-1.2 5.6.1 5.6.1s-.5-1 1.6-.9c2.9.2 7.2 1.4 7.4 5.6.2 3.1.3 7.7.4 8.7.7 6.8 2.7 8.7 2.7 8.7s18.4-9.2 22-5.2c3.3 3.8 4.5 64.7 4.5 64.7l-18.1-16.8 12.1 29.5s-14.4 2.4-28.9 2.4c-14.5 0-31.1-4.2-31.1-4.2l13.8-28.2-19.3 17.3z\"></path></svg>",
  "assets/board-native/flags/EH.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>EH</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 0h513v114H0z\"></path><path fill=\"#428823\" d=\"M0 228h513v114H0z\"></path><g fill=\"#D80027\"><path d=\"M256 171 0 342V0zm53.1 0c0-22.9 13.1-42.1 34.6-46.8-3.3-.7-6.7-1.1-10.3-1.1-26.4 0-47.9 21.4-47.9 47.9s21.4 47.9 47.9 47.9c3.5 0 7-.4 10.3-1.1-21.5-5.1-34.6-24.2-34.6-46.8z\"></path><path d=\"m365 129.2 10.3 31.7h33.3l-27 19.6 10.3 31.7-26.9-19.6-27 19.6 10.3-31.7-27-19.6h33.4z\"></path></g></svg>",
  "assets/board-native/flags/ER.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>ER</title><path fill=\"#338AF3\" d=\"M0 0h513v342H0z\"></path><path fill=\"#56AF35\" d=\"M0 0h513v171H0z\"></path><path fill=\"#D80027\" d=\"m0 342 513-171L0 0v342z\"></path><g fill=\"#ffc945\"><path d=\"M134.7 231.5c33.6 0 60.8-27.2 60.8-60.8s-27.2-60.8-60.8-60.8-60.8 27.2-60.8 60.8 27.2 60.8 60.8 60.8zm0 24.3c-47 0-85.2-38.1-85.2-85.2s38.1-85.2 85.2-85.2 85.2 38.1 85.2 85.2-38.2 85.2-85.2 85.2z\"></path><circle cx=\"119.5\" cy=\"148.3\" r=\"17.5\"></circle><circle cx=\"148.9\" cy=\"158.5\" r=\"17.5\"></circle><circle cx=\"134.7\" cy=\"135.2\" r=\"17.5\"></circle><circle cx=\"119.5\" cy=\"172.7\" r=\"17.5\"></circle><circle cx=\"149.9\" cy=\"182.8\" r=\"17.5\"></circle><circle cx=\"122.5\" cy=\"198\" r=\"17.5\"></circle><circle cx=\"145.9\" cy=\"205.2\" r=\"17.5\"></circle></g></svg>",
  "assets/board-native/flags/ES.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 22.5 15\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>ES</title><path fill=\"#FFF\" d=\"M0 0h22.5v15H0V0z\"></path><path fill=\"#D03433\" d=\"M0 0h22.5v4H0V0zm0 11h22.5v4H0v-4z\"></path><path fill=\"#FBCA46\" d=\"M0 4h22.5v7H0V4z\"></path><path fill=\"#FFF\" d=\"M7.8 7h1v.5h-1V7z\"></path><path fill=\"#A41517\" d=\"M7.2 8.5c0 .3.3.5.6.5s.6-.2.6-.5L8.5 7H7.1l.1 1.5zM6.6 7c0-.3.2-.5.4-.5h1.5c.3 0 .5.2.5.4V7l-.1 1.5c-.1.6-.5 1-1.1 1-.6 0-1-.4-1.1-1L6.6 7z\"></path><path fill=\"#A41517\" d=\"M6.8 7.5h2V8h-.5l-.5 1-.5-1h-.5v-.5zM5.3 6h1v3.5h-1V6zm4 0h1v3.5h-1V6zm-2.5-.5c0-.3.2-.5.5-.5h1c.3 0 .5.2.5.5v.2c0 .2-.1.3-.3.3H7c-.1 0-.2-.1-.2-.2v-.3z\"></path></svg>",
  "assets/board-native/flags/ET.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 22.5 15\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>ET</title><path fill=\"#20AA46\" d=\"M0 0h22.5v5H0V0z\"></path><path fill=\"#E92F3B\" d=\"M0 10h22.5v5H0v-5z\"></path><path fill=\"#FADF50\" d=\"M0 5h22.5v5H0V5z\"></path><circle fill=\"#205CCA\" cx=\"11.3\" cy=\"7.5\" r=\"5.2\"></circle><g stroke=\"#FFDB3D\" fill=\"none\"><path d=\"m11.3 8.8-2.1 1.5.8-2.4-2-1.5h2.5l.8-2.3.8 2.3h2.6l-2.1 1.5.8 2.4-2.1-1.5zm-1-2.4h1.9M9.9 7.8l1.3 1m.8-2.6.7 1.8M10 7.9l.6-1.8M11 9l1.6-1.1\" stroke-width=\"0.5\"></path><path d=\"m8.7 3.9 1.1 1.6m4-1.7-1 1.6m-1.5 4.7V12M8.9 8.3 7.1 9m8.4 0-1.8-.7\" stroke-width=\"0.25\"></path></g></svg>",
  "assets/board-native/flags/FI.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>FI</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#2E52B2\" d=\"M513 129.3V212H203.7v130H121V212H0v-82.7h121V0h82.7v129.3z\"></path></svg>",
  "assets/board-native/flags/FJ.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>FJ</title><path fill=\"#62B5E5\" d=\"M0 0h513v342H0z\"></path><path fill=\"#F3F3F3\" d=\"M307.1 127.1v92c0 61.6 80.5 80.5 80.5 80.5s80.4-19 80.4-80.6v-92l-80.5-23-80.4 23.1z\"></path><path fill=\"#c8102e\" d=\"M468 132.8V98.3H307.1v34.5h69v69h-69v23h69V296c6.9 2.5 11.5 3.5 11.5 3.5s4.6-1.1 11.5-3.5v-71.2h69v-23h-69v-69H468z\"></path><path fill=\"#012169\" d=\"M0 0h256.5v171H0z\"></path><g fill=\"#FFF\"><path d=\"M256.5 0v30.6l-45.3 25.2h45.3v59.4h-59.2l59.2 32.9V171h-26.7l-73.7-40.9V171h-55.7v-48.7L12.8 171H0v-30.6l45.3-25.2H0V55.8h59.2L0 22.9V0h26.7l73.7 40.9V0h55.7v48.7L243.7 0z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-55.7-59.4L0 0v15.8l72 40z\"></path></g><g fill=\"#D80027\"><path d=\"M144.3 0h-32.1v69.5H0v32h112.2V171h32.1v-69.5h112.2v-32H144.3z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-84.1 0-72 40V171l100.4-55.8zm28.4-59.4L0 0v15.8l72 40zm84.1 0 72-40V0L156.1 55.8z\"></path></g></svg>",
  "assets/board-native/flags/FK.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>FK</title><path fill=\"#012169\" d=\"M0 0h513v342H0z\"></path><path fill=\"#012169\" d=\"M0 0h256.5v171H0z\"></path><g fill=\"#FFF\"><path d=\"M256.5 0v30.6l-45.3 25.2h45.3v59.4h-59.2l59.2 32.9V171h-26.7l-73.7-40.9V171h-55.7v-48.7L12.8 171H0v-30.6l45.3-25.2H0V55.8h59.2L0 22.9V0h26.7l73.7 40.9V0h55.7v48.7L243.7 0z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-55.7-59.4L0 0v15.8l72 40z\"></path></g><g fill=\"#D80027\"><path d=\"M144.3 0h-32.1v69.5H0v32h112.2V171h32.1v-69.5h112.2v-32H144.3z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-84.1 0-72 40V171l100.4-55.8zm28.4-59.4L0 0v15.8l72 40zm84.1 0 72-40V0L156.1 55.8z\"></path></g><path fill=\"#2a7fff\" d=\"M311.2 190.2v-90c0-8.5 6.5-15.3 15-15.3h120.5c8.3 0 15 6.8 15 15.3v90c0 75.2-75.2 105.3-75.2 105.3s-75.3-30.1-75.3-105.3z\"></path><path fill=\"#FFF\" d=\"M311.2 190.2v-90c0-8.5 6.5-15.3 15-15.3h120.5c8.3 0 15 6.8 15 15.3v90c0 75.2-75.2 105.3-75.2 105.3s-75.3-30.1-75.3-105.3zm79.6 86.3c7.9-4.5 15.9-10 23.2-16.7 20.5-18.5 32.6-41.4 32.6-69.7v-90c0-.3-120.4-.3-120.4-.3v90.3c0 28.3 12.1 51.2 32.6 69.7 8.3 7.5 17.6 13.9 27.6 19 1.4-.6 2.8-1.4 4.4-2.3z\"></path><path fill=\"#3e6d1e\" d=\"M346.1 189.4c-2.6-7.9 1.7-14.3 10.1-14.3h60.5c8.2 0 12.8 6.3 10.1 14.3l-5.5 16.5c-2.6 7.9-8.9 9.2-15.8 4 0 0 2.6-4.8-19.1-4.8s-19.1 4.8-19.1 4.8c-6.1 5.7-13.1 4-15.8-4 .1.1-5.4-16.5-5.4-16.5z\"></path><path fill=\"#e5e5e5\" d=\"M356.4 175.1c8.1 1.6 17.8-15 30.1-15 13.1 0 21.8 17.1 30.1 15 7.4-1.8 15-22.2 15-30.1 0-16.6-20.2-30.1-45.1-30.1s-45.1 13.5-45.1 30.1c-.1 8.5 6.6 28.5 15 30.1z\"></path><path fill=\"#FFF\" d=\"M355 266.7c6.2.4 12.5-1.8 17.2-6.5l9-9c2.9-2.9 7.5-2.9 10.4 0l9 9c4.7 4.7 11 6.9 17.1 6.5 5.3-.3 32.5-33.5 25.7-32.6-4.6.6-9.1 2.8-12.7 6.3l-.1.1-9 9c-2.9 2.9-7.5 2.9-10.4 0l-9-9c-8.7-8.8-22.9-8.8-31.7-.1l-.1.1-9 9c-2.9 2.9-7.5 2.9-10.4 0l-9-9c-3.5-3.5-7.8-5.6-12.3-6.3-6.7-1.1 20.1 32.2 25.3 32.5zM321.1 206c2.9-2.9 7.5-2.9 10.4 0l9 9c8.8 8.7 22.9 8.7 31.7 0l9-9c2.9-2.9 7.5-2.9 10.4 0l9 9c8.8 8.7 22.9 8.7 31.7 0l9-9c2.9-2.9 7.5-2.9 10.4 0 0 0 5.5-14.8 2.5-15.9-7.9-2.9-17.2-1.2-23.5 5.2l-.1.1-9 9c-2.9 2.9-7.5 2.9-10.4 0l-9-9c-8.7-8.8-22.9-8.8-31.7-.1l-.1.1-9 9c-2.9 2.9-7.5 2.9-10.4 0l-9-9c-6.2-6.2-15.1-8-22.8-5.5-3.1 1.1 1.9 16.1 1.9 16.1z\"></path></svg>",
  "assets/board-native/flags/FM.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>FM</title><path fill=\"#338AF3\" d=\"M0 0h513v342H0z\"></path><path d=\"m256 37.9 10.1 31.2H299l-26.6 19.3 10.2 31.2-26.6-19.3-26.6 19.3 10.2-31.2L213 69.1h32.9zM123.2 170.7l31.2-10.2v-32.8l19.3 26.6 31.2-10.2-19.3 26.6 19.3 26.5-31.2-10.1-19.3 26.5v-32.8zM256 303.5l-10.1-31.2H213l26.6-19.3-10.2-31.3L256 241l26.6-19.3-10.2 31.3 26.6 19.3h-32.9zm132.8-132.8-31.2 10.1v32.8l-19.3-26.5-31.2 10.1 19.3-26.5-19.3-26.6 31.2 10.2 19.3-26.6v32.8z\" fill=\"#FFF\"></path></svg>",
  "assets/board-native/flags/FO.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>FO</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#0F61A5\" d=\"M513 214.5H206.2V342h-87.8V214.5H0v-87.7h118.4V0h87.8v126.8H513V192z\"></path><path fill=\"#E50E3D\" d=\"M513 149.3V192H183.7v150H141V192H0v-42.7h141V0h42.7v149.3z\"></path></svg>",
  "assets/board-native/flags/FR.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>FR</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#00318A\" d=\"M0 0h171v342H0z\"></path><path fill=\"#D80027\" d=\"M342 0h171v342H342z\"></path></svg>",
  "assets/board-native/flags/GA.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>GA</title><path fill=\"#FFDA44\" d=\"M0 0h513v342H0z\"></path><path fill=\"#6DA544\" d=\"M0 0h513v114H0z\"></path><path fill=\"#0052B4\" d=\"M0 228h513v114H0z\"></path></svg>",
  "assets/board-native/flags/GB.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>GB</title><g fill=\"#FFF\"><path d=\"M0 0h513v341.3H0V0z\"></path><path d=\"M311.7 230 513 341.3v-31.5L369.3 230h-57.6zM200.3 111.3 0 0v31.5l143.7 79.8h56.6z\"></path></g><path d=\"M393.8 230 513 295.7V230H393.8zm-82.1 0L513 341.3v-31.5L369.3 230h-57.6zm146.9 111.3-147-81.7v81.7h147zM90.3 230 0 280.2V230h90.3zm110 14.2v97.2H25.5l174.8-97.2zm-82.1-132.9L0 45.6v65.7h118.2zm82.1 0L0 0v31.5l143.7 79.8h56.6zM53.4 0l147 81.7V0h-147zm368.3 111.3L513 61.1v50.2h-91.3zm-110-14.2V0h174.9L311.7 97.1z\" fill=\"#012169\"></path><g fill=\"#c8102e\"><path d=\"M288 0h-64v138.7H0v64h224v138.7h64V202.7h224v-64H288V0z\"></path><path d=\"M311.7 230 513 341.3v-31.5L369.3 230h-57.6zm-168 0L0 309.9v31.5L200.3 230h-56.6zm56.6-118.7L0 0v31.5l143.7 79.8h56.6zm168 0L513 31.5V0L311.7 111.3h56.6z\"></path></g></svg>",
  "assets/board-native/flags/GD.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>GD</title><path fill=\"#c60a0a\" d=\"M0 0h513v342H0z\"></path><path fill=\"#3E8446\" d=\"m256.5 170.7-212 126.1V44.5z\"></path><path d=\"m256.5 170.7 211 126.1h-423zm211-126.2-211 126.2-212-126.2z\" fill=\"#FFDA44\"></path><path fill=\"#3E8446\" d=\"M467.5 44.5v252.3l-211-126.1z\"></path><path d=\"m256.5 10.4 2.8 10.2H270l-8.6 6.3 3.3 10.2-8.2-6.3-9.2 6.3 3.3-10.2-8.6-6.3h10.7zm-86.4 0 3.3 10.2h10.7l-8.6 6.3 3.3 10.2-8.7-6.3-8.7 6.3 3.3-10.2-8.6-6.3h10.7zm171.8 0 3.3 10.2H356l-8.7 6.3 3.3 10.2-8.7-6.3-8.7 6.3 3.3-10.2-8.6-6.3h10.7zm-85.4 293.8 2.8 10.2H270l-8.6 6.3 3.3 10.2-8.2-6.3-9.2 6.3 3.3-10.2-8.6-6.3h10.7zm-86.4 0 3.3 10.2h10.7l-8.6 6.3 3.3 10.2-8.7-6.3-8.7 6.3 3.3-10.2-8.6-6.3h10.7zm171.8 0 3.3 10.2H356l-8.7 6.3 3.3 10.2-8.7-6.3-8.7 6.3 3.3-10.2-8.6-6.3h10.7z\" fill=\"#FFDA44\"></path><circle fill=\"#c60a0a\" cx=\"244.5\" cy=\"170.7\" r=\"76.2\"></circle><path fill=\"#FFDA44\" d=\"m244.5 110.1 13.6 41.8h44l-35.6 25.8 13.6 41.8-35.6-25.8-35.5 25.8 13.6-41.8-35.6-25.8h44zm-136.8 57.7c4.4 6.9 2.3 16.1-4.6 20.5s-16.1 2.3-20.5-4.6c-7.9-12.5-3.3-33-3.3-33s20.4 4.6 28.4 17.1z\"></path><circle fill=\"#A2001D\" cx=\"99.1\" cy=\"182.1\" r=\"7.4\"></circle></svg>",
  "assets/board-native/flags/GE.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 22.5 15\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>GE</title><path fill=\"#fff\" d=\"M0 0h22.5v15H0z\"></path><path fill=\"#eb000e\" d=\"M9.8 6H0v3h9.8v6h3V9h9.8V6h-9.8V0h-3v6z\"></path><path fill=\"#eb000e\" d=\"m17.3 2.7-.2-1.2h1l-.2 1.2 1.2-.2v1l-1.2-.2.2 1.2h-1l.2-1.2-1.2.2v-1l1.2.2zm-12.7 0-.2-1.2h1l-.2 1.2 1.2-.2v1l-1.2-.2.2 1.2h-1l.2-1.2-1.2.2v-1l1.2.2zm0 9-.2-1.2h1l-.2 1.2 1.2-.2v1l-1.2-.2.2 1.2h-1l.2-1.2-1.2.2v-1l1.2.2zm12.7 0-.2-1.2h1l-.2 1.2 1.2-.2v1l-1.2-.2.2 1.2h-1l.2-1.2-1.2.2v-1l1.2.2z\"></path></svg>",
  "assets/board-native/flags/GF.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 90 60\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>GF</title><path fill=\"#FDEB01\" d=\"m0 0 90 60H0z\"></path><path fill=\"#58A846\" d=\"M90 0v60L0 0z\"></path><path fill=\"#ED3D24\" d=\"m50.7 33.3 9.3-6.7H48.5L45 15.7l-3.5 10.9H30l9.3 6.7-3.6 11 9.3-6.7 9.3 6.7z\"></path></svg>",
  "assets/board-native/flags/GG.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>GG</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#D80027\" d=\"M308 0H204v118.7H0v104h204V342h104V222.7h205v-104H308z\"></path><path fill=\"#FFDA44\" d=\"m368.6 188 26 17.3V136l-26 17.3h-95.3V58.1l17.3-26h-69.2l17.3 26v95.2h-95.3l-26-17.3v69.3l26-17.3h95.3v95.2l-17.3 26h69.2l-17.3-26V188z\"></path></svg>",
  "assets/board-native/flags/GH.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>GH</title><path fill=\"#FFDA44\" d=\"M0 0h513v342H0z\"></path><path fill=\"#D80027\" d=\"M0 0h513v114H0z\"></path><path fill=\"#496E2D\" d=\"M0 228h513v114H0z\"></path><path d=\"m255.9 113.8 14.1 43.4 40.4 3.2-37 26.9 19.5 40.3-37-26.9-37 26.9 14.1-43.5-36.9-26.9h45.7z\"></path></svg>",
  "assets/board-native/flags/GI.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>GI</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#D80027\" d=\"M0 230h513v112H0z\"></path><path fill=\"#D80027\" stroke=\"#000\" stroke-miterlimit=\"10\" d=\"M363.1 131.8V99.1H374V77.3h-21.9v10.9h-21.8V77.3h-21.8v21.8h10.9v32.7h-21.8V55.5h10.9V33.7h-21.8v10.9h-10.9V33.7H254v10.9h-10.9V33.7h-21.8v21.8h10.9v76.3h-21.8V99.1h10.9V77.3h-21.8v10.9h-21.8V77.3h-21.8v21.8h10.9v32.7H145V219h239.9v-87.2z\"></path><path fill=\"#FFDA44\" stroke=\"#000\" stroke-miterlimit=\"10\" d=\"m264.9 235.5-24.2 18.2 19.1 14.3v31.3h-23.2v9h23v7.9h-23v9.3H270V268l19.1-14.3-24.2-18.2zm0 25.3-10.1-7.1 10.1-7.1 10.1 7.1-10.1 7.1z\"></path><path d=\"M239.6 209.7v-27.9s.1-22.3 25-22.3c24.8 0 25.7 22 25.7 22v28.2h-50.7zm-69.1 0v-24.3s.1-18.7 19.6-18.7 20.2 18.4 20.2 18.4v24.5h-39.8z\"></path><path d=\"M169.1 209.7v-24.3s.1-18.7 19.6-18.7 20.2 18.4 20.2 18.4v24.5h-39.8zm151.8 0v-24.3s.1-18.7 19.6-18.7 20.2 18.4 20.2 18.4v24.5h-39.8zm8.4-77.7v-15.7s.1-12.1 11.3-12.1c11.3 0 11.7 11.9 11.7 11.9V132h-23zm-78.8 0v-23.7s.1-18.3 14.3-18.3c14.2 0 14.7 18 14.7 18v24h-29zm-73 0v-15.7s.1-12.1 11.3-12.1 11.7 11.9 11.7 11.9V132h-23z\"></path></svg>",
  "assets/board-native/flags/GL.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>GL</title><path fill=\"#D80027\" d=\"M0 0h513v342H0z\"></path><path fill=\"#FFF\" d=\"M513 0v171H0V0z\"></path><circle fill=\"#FFF\" cx=\"185.8\" cy=\"171.2\" r=\"117.8\"></circle><path fill=\"#D80027\" d=\"M68 171c0-65.1 52.8-117.8 117.8-117.8 65.1 0 117.8 52.8 117.8 117.8\"></path></svg>",
  "assets/board-native/flags/GM.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>GM</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#cf0d19\" d=\"M0 0h513v100H0z\"></path><path fill=\"#0052B4\" d=\"M0 121h513v100H0z\"></path><path fill=\"#1a7e25\" d=\"M0 242h513v100H0z\"></path></svg>",
  "assets/board-native/flags/GN.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>GN</title><path fill=\"#FFDA44\" d=\"M0 0h512v342H0z\"></path><path fill=\"#6DA544\" d=\"M342 0h171v342H342z\"></path><path fill=\"#D80027\" d=\"M0 0h171v342H0z\"></path></svg>",
  "assets/board-native/flags/GP.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>GP</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#00318A\" d=\"M0 0h171v342H0z\"></path><path fill=\"#D80027\" d=\"M342 0h171v342H342z\"></path></svg>",
  "assets/board-native/flags/GQ.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>GQ</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#6DA544\" d=\"M0 0h513v113.8H0z\"></path><path fill=\"#D80027\" d=\"M0 227.6h513V342H0z\"></path><path fill=\"#0070C8\" d=\"M126 171 0 342V0z\"></path><path fill=\"none\" stroke=\"#000\" stroke-miterlimit=\"10\" d=\"M233.8 139.4v40.4c0 35.6 35.6 35.6 35.6 35.6s35.6 0 35.6-35.6v-40.4h-71.2z\"></path><path fill=\"#786145\" d=\"M264.5 179.8h9.8l4 25.8h-17.8z\"></path><path fill=\"#6DA544\" d=\"M287.2 162c0-9.8-8-14.8-17.8-14.8s-17.8 5-17.8 14.8c-4.9 0-8.9 4-8.9 8.9s4 8.9 8.9 8.9h35.6c4.9 0 8.9-4 8.9-8.9s-4-8.9-8.9-8.9z\"></path><path d=\"m230.7 120 1.9 3.3h3.8l-1.9 3.3 1.9 3.2h-3.8l-1.9 3.3-1.9-3.3H225l1.9-3.2-1.9-3.3h3.8zm15.3 0 1.9 3.3h3.7l-1.9 3.3 1.9 3.2h-3.7l-1.9 3.3-1.9-3.3h-3.8l1.9-3.2-1.9-3.3h3.8zm15.3 0 1.9 3.3h3.7l-1.9 3.3 1.9 3.2h-3.7l-1.9 3.3-1.9-3.3h-3.8l1.9-3.2-1.9-3.3h3.8zm15.8 0 1.9 3.3h3.8l-1.9 3.3 1.9 3.2H279l-1.9 3.3-1.9-3.3h-3.7l1.8-3.2-1.8-3.3h3.7zm16 0 1.9 3.3h3.8l-1.9 3.3 1.9 3.2H295l-1.9 3.3-1.9-3.3h-3.7l1.8-3.2-1.8-3.3h3.7zm15 0 1.9 3.3h3.7l-1.9 3.3 1.9 3.2H310l-1.9 3.3-1.9-3.3h-3.8l1.9-3.2-1.9-3.3h3.8z\" fill=\"#FFDA00\" stroke=\"#000\" stroke-miterlimit=\"10\"></path></svg>",
  "assets/board-native/flags/GR.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>GR</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><g fill=\"#0d5eaf\"><path d=\"M0 0h513v38H0zm0 76h513v38H0zm0 76h513v38H0zm0 76h513v38H0zm0 76h513v38H0z\"></path><path d=\"M0 0h190v190H0z\"></path></g><g fill=\"#FFF\"><path d=\"M0 76h190v38H0z\"></path><path d=\"M76 0h38v190H76z\"></path></g></svg>",
  "assets/board-native/flags/GS.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>GS</title><path fill=\"#012169\" d=\"M0 0h513v342H0z\"></path><path fill=\"#012169\" d=\"M0 0h256.5v171H0z\"></path><g fill=\"#FFF\"><path d=\"M256.5 0v30.6l-45.3 25.2h45.3v59.4h-59.2l59.2 32.9V171h-26.7l-73.7-40.9V171h-55.7v-48.7L12.8 171H0v-30.6l45.3-25.2H0V55.8h59.2L0 22.9V0h26.7l73.7 40.9V0h55.7v48.7L243.7 0z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-55.7-59.4L0 0v15.8l72 40z\"></path></g><g fill=\"#D80027\"><path d=\"M144.3 0h-32.1v69.5H0v32h112.2V171h32.1v-69.5h112.2v-32H144.3z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-84.1 0-72 40V171l100.4-55.8zm28.4-59.4L0 0v15.8l72 40zm84.1 0 72-40V0L156.1 55.8z\"></path></g><ellipse fill=\"#FFF\" cx=\"443.4\" cy=\"233.6\" rx=\"29\" ry=\"43.5\"></ellipse><ellipse fill=\"#FFCE00\" cx=\"406.9\" cy=\"317.7\" rx=\"22\" ry=\"9.3\"></ellipse><ellipse fill=\"#FFCE00\" cx=\"364\" cy=\"317.7\" rx=\"22\" ry=\"9.3\"></ellipse><path fill=\"#39B200\" d=\"m342 190.1 43.4 86.9 43.5-86.9z\"></path><ellipse fill=\"#9B9B9B\" cx=\"327.5\" cy=\"233.6\" rx=\"29\" ry=\"43.5\"></ellipse><path fill=\"#757575\" d=\"m371 175.6-14.5 14.5h57.9l-14.5-14.5 14.5-43.5s-13-29-29-29-29 29-29 29l14.6 43.5z\"></path><circle fill=\"#C6B56F\" cx=\"385.4\" cy=\"67\" r=\"29\"></circle><circle fill=\"#923f00\" cx=\"386\" cy=\"88.7\" r=\"29\"></circle><circle fill=\"#FFF\" cx=\"443.4\" cy=\"117.7\" r=\"29\"></circle><circle fill=\"#0049FF\" cx=\"342.2\" cy=\"146.7\" r=\"29\"></circle><circle fill=\"#0041F9\" cx=\"429.8\" cy=\"146.7\" r=\"29\"></circle><circle fill=\"#F7D71E\" cx=\"386\" cy=\"233.6\" r=\"29\"></circle><circle fill=\"#CEC851\" cx=\"457.9\" cy=\"190.1\" r=\"29\"></circle><circle fill=\"#FFF\" cx=\"385.4\" cy=\"289.5\" r=\"29\"></circle><path fill=\"#7C0B29\" d=\"m371 135.7 14.5-3.5 14.5 3.5c0 7.5-14.5 11-14.5 11s-14.5-3.5-14.5-11z\"></path><circle fill=\"#FFF\" cx=\"327.5\" cy=\"117.4\" r=\"29\"></circle></svg>",
  "assets/board-native/flags/GT.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>GT</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 0h171v342H0zm342 0h171v342H342z\" fill=\"#338AF3\"></path><circle fill=\"#DCC26D\" cx=\"256\" cy=\"155.8\" r=\"25.5\"></circle><path fill=\"#628A40\" d=\"M194.2 155.9c0 22.1 11.8 42.5 30.8 53.5 5.9 3.4 13.5 1.4 16.9-4.5 3.4-5.9 1.4-13.5-4.5-16.9-11.5-6.6-18.5-18.9-18.5-32.1 0-6.8-5.5-12.4-12.4-12.4s-12.3 5.5-12.3 12.4zm95.1 52.1c17.8-11.4 28.6-31 28.5-52.1 0-6.8-5.5-12.4-12.4-12.4-6.8 0-12.4 5.5-12.4 12.4 0 12.7-6.5 24.5-17.1 31.3-5.8 3.6-7.7 11.2-4.1 17 3.6 5.8 11.2 7.7 17 4.1.2-.1.3-.2.5-.3z\"></path></svg>",
  "assets/board-native/flags/GU.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>GU</title><path fill=\"#D80027\" d=\"M0 0h513v342H0z\"></path><path fill=\"#0052B4\" d=\"M11.1 11.1h489.7v319.1H11.1z\"></path><path fill=\"#7DBEF1\" d=\"M256 285.3s76.4-51.3 76.4-114.6S256 56 256 56s-76.4 51.3-76.4 114.6S256 285.3 256 285.3z\"></path><path fill=\"#1C8AE6\" d=\"M179.8 180.7h152.6l-29.3 64.9h-95.2z\"></path><path fill=\"#FFF042\" d=\"M192.3 205.9s40.5 38.2 51 38.2c12.4 0 12.6-18.4 25.5-25.5 20.2-11.1 51-12.7 51-12.7L297 248.7l-41 36.6-46.8-39.7-16.9-39.7z\"></path><path fill=\"#259C7B\" d=\"m256 157.5-22.5 15.6 7.9-26.2-21.8-16.5 27.4-.5 9-25.9 9 25.9 27.4.5-21.8 16.6 7.9 26.2-22.5-15.7z\"></path><path fill=\"#8E5715\" d=\"M249.7 144.6c-.9 9.2-1.5 18.4-1.7 27.6-.3 11.9.3 20.7 2 26 2.2 6.6 7.2 12.9 14.2 18.9 5.3 4.6 10.6 8.1 14.2 10.1 3.1 1.7 7 .6 8.7-2.4 1.7-3.1.6-7-2.4-8.7-4.3-2.5-8.4-5.4-12.2-8.7-5.4-4.6-9.1-9.2-10.4-13.3-1.1-3.4-1.6-11.3-1.4-21.7.2-8.9.8-17.8 1.7-26.6.4-3.5-2.2-6.6-5.7-7-3.6-.3-6.7 2.3-7 5.8z\"></path><path fill=\"#FFF\" d=\"m217.8 170.7 25.5 38.2h-25.5v-38.2z\"></path><path fill=\"none\" stroke=\"#D80027\" stroke-width=\"12\" stroke-miterlimit=\"10\" d=\"M256 285.3s76.4-51.3 76.4-114.6S256 56 256 56s-76.4 51.3-76.4 114.6S256 285.3 256 285.3z\"></path></svg>",
  "assets/board-native/flags/GW.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>GW</title><path fill=\"#6DA544\" d=\"M0 0h512v342H0z\"></path><path fill=\"#FFDA44\" d=\"M0 0h512v171H0z\"></path><path fill=\"#D80027\" d=\"M0 0h182v342H0z\"></path><path d=\"m98.3 109.8 15.1 46.5h48.9L122.8 185l15.1 46.5-39.6-28.7-39.5 28.7L73.9 185l-39.6-28.7h48.9z\"></path></svg>",
  "assets/board-native/flags/GY.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 900 600\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>GY</title><path fill=\"#009E49\" d=\"M0 0h900v600H0V0z\"></path><path fill=\"#FFF\" d=\"m0 0 947 300L0 600V0z\"></path><path fill=\"#FFD00D\" d=\"M0 26.1 870 300 0 573.9V26.1z\"></path><path fill=\"#2D2D2D\" d=\"m0 0 450 300L0 600V0z\"></path><path fill=\"#D3132F\" d=\"m0 35 397.5 265L0 565V35z\"></path></svg>",
  "assets/board-native/flags/HK.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 21 14\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>HK</title><path fill=\"#FFF\" d=\"M0 0h21v14H0V0z\"></path><path fill=\"#EE1C25\" d=\"M0 0h21v14H0V0z\"></path><path fill=\"#FFF\" d=\"M12 6.7c-.8-.5-1 .4-1 0 0-.8.9-1.5 2-1.5s2 .7 2 1.5c-.9 0-1 .5-1.5.5-.6 0-.7 0-1.5-.5zm1.2-.2c.1 0 .2-.1.2-.2s0-.3-.2-.3-.2.1-.2.2.1.3.2.3zm-1.8 2c.2-.9-.7-.8-.3-.9.8-.3 1.7.4 2 1.4.3 1.1 0 2.1-.8 2.4-.3-.9-.8-.8-.9-1.3-.1-.6-.2-.7 0-1.6zm.6 1.1c0 .1.2.2.3.2.1 0 .2-.2.2-.3s-.2-.2-.3-.2c-.2 0-.2.2-.2.3zM9.6 8.5c.9-.1.6-.9.8-.6.5.7.2 1.7-.7 2.4-.9.6-2 .6-2.5 0 .8-.6.6-1 .9-1.3.4-.4.5-.5 1.5-.5zm-.9.9c-.1 0-.2.2-.1.3s.3.2.4.1.1-.3 0-.4-.2-.1-.3 0zM9 6.7c.3.9 1 .3.8.6-.5.7-1.6.7-2.5 0-.9-.6-1.2-1.7-.7-2.4.8.6 1.1.2 1.5.5.4.4.5.4.9 1.3zm-1.1-.6c-.1-.1-.3 0-.4.1s-.1.3 0 .4c.1.1.3 0 .3-.1.2-.1.2-.3.1-.4zm2.6-.5c-.7.6.1 1.1-.3 1-.8-.3-1.2-1.4-.8-2.4.3-1 1.3-1.7 2-1.4-.3.9.2 1.1 0 1.6-.1.5-.2.6-.9 1.2zm.2-1.2c0-.1 0-.3-.1-.3s-.3 0-.3.1 0 .3.2.3c0 .1.1 0 .2-.1z\"></path></svg>",
  "assets/board-native/flags/HM.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>HM</title><path fill=\"#012169\" d=\"M0 0h513v342H0z\"></path><path fill=\"#012169\" d=\"M0 0h256.5v171H0z\"></path><g fill=\"#FFF\"><path d=\"M256.5 0v30.6l-45.3 25.2h45.3v59.4h-59.2l59.2 32.9V171h-26.7l-73.7-40.9V171h-55.7v-48.7L12.8 171H0v-30.6l45.3-25.2H0V55.8h59.2L0 22.9V0h26.7l73.7 40.9V0h55.7v48.7L243.7 0z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-55.7-59.4L0 0v15.8l72 40z\"></path></g><g fill=\"#D80027\"><path d=\"M144.3 0h-32.1v69.5H0v32h112.2V171h32.1v-69.5h112.2v-32H144.3z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-84.1 0-72 40V171l100.4-55.8zm28.4-59.4L0 0v15.8l72 40zm84.1 0 72-40V0L156.1 55.8z\"></path></g><path d=\"m189.2 212.6 11 22.9 24.7-5.7-11.1 22.8 19.9 15.8L209 274v25.4l-19.8-15.9-19.8 15.9.1-25.4-24.8-5.6 19.9-15.8-11.1-22.8 24.8 5.7zm197.9 28.5 5.2 10.9 11.8-2.7-5.3 10.9 9.5 7.5-11.8 2.6v12.2l-9.4-7.6-9.5 7.6.1-12.2-11.9-2.6 9.5-7.5-5.3-10.9 11.9 2.7zm-48.6-116 5.2 10.9 11.8-2.7-5.3 10.9 9.5 7.5-11.8 2.7v12.1l-9.4-7.6-9.5 7.6v-12.1l-11.8-2.7 9.5-7.5-5.3-10.9 11.8 2.7zm48.6-66.2 5.2 10.9 11.8-2.7-5.3 10.9 9.5 7.5-11.8 2.7v12.1l-9.4-7.6-9.5 7.6.1-12.1-11.9-2.7 9.5-7.5-5.3-10.9 11.9 2.7zm42.4 49.7 5.3 10.9 11.8-2.7-5.3 10.9 9.5 7.5-11.8 2.6V150l-9.5-7.6-9.4 7.6v-12.2l-11.8-2.6 9.5-7.5-5.3-10.9 11.8 2.7zm-30.3 57.9 4.1 12.7h13.3l-10.8 7.8 4.1 12.6-10.7-7.8-10.8 7.8 4.1-12.6-10.7-7.8h13.3z\" fill=\"#FFF\"></path></svg>",
  "assets/board-native/flags/HN.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>HN</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 0h513v114H0zm0 228h513v114H0zm203.5-110.1 6.7 16.6 17.6 1-14 10.9 4.7 17.7-15-9.9-15 9.9 4.7-17.7-14-10.9 17.6-1zm105 0 6.7 16.6 17.6 1-14 10.9 4.7 17.7-15-9.9-15 9.9 4.7-17.7-14-10.9 17.6-1zM256 147.6l6.7 16.6 17.6 1-14 10.9 4.7 17.7-15-9.9-15 9.9 4.7-17.7-14-10.9 17.6-1zm-52.5 29.7 6.7 16.6 17.6 1-14 10.9 4.7 17.6-15-9.9-15 9.9 4.7-17.6-14-10.9 17.6-1zm105 0 6.7 16.6 17.6 1-14 10.9 4.7 17.6-15-9.9-15 9.9 4.7-17.6-14-10.9 17.6-1z\" fill=\"#338AF3\"></path></svg>",
  "assets/board-native/flags/HR.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>HR</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#D80027\" d=\"M0 0h513v114H0z\"></path><path fill=\"#0052B4\" d=\"M0 228h513v114H0z\"></path><path d=\"M309.3 113.2v-44l17.5-14.4 17.7 14.4v44zm-105.6 0v-44l-17.3-14.4-17.9 14.4v44zm35.2 0v-44l17.6-14.4 17.6 14.4v44z\" fill=\"#338AF3\"></path><path d=\"M309.3 113.2h-35.2v-44l17.5-14.4 17.7 14.4zm-70.4 0h-35.2v-44l17.5-14.4 17.7 14.4z\" fill=\"#0052B4\"></path><path stroke=\"#D80027\" fill=\"#FFF\" d=\"M168.5 113.2v101.9c0 24.3 14.4 46.2 35.4 59.4 21.3 13.4 42.1 14.7 52.6 14.7s31.4-1.7 52.6-14.8c21-13 35.4-35.1 35.4-59.3V113.2h-176z\"></path><path d=\"M168.5 113.2h35.2v35.2h-35.2zm70.4 0h35.2v35.2h-35.2zm70.4 0h35.2v35.2h-35.2zm-105.6 35.2h35.2v35.2h-35.2zm70.4 0h35.2v35.2h-35.2zm-105.6 35.2h35.2v35.2h-35.2zm35.2 35.2h35.2V254h-35.2zm35.2-35.2h35.2v35.2h-35.2zm70.4 0h35.2v35.2h-35.2zm-35.2 35.2h35.2V254h-35.2zm35.2 55.5c8.6-5.4 16.2-12.3 22-20.3h-22v20.3zM181.7 254c5.8 8 13.3 14.9 22 20.4V254h-22zm57.2 0v33.7c7.2 1.2 13.3 1.5 17.6 1.5 4.3 0 10.4-.3 17.6-1.6V254h-35.2z\" fill=\"#D80027\"></path></svg>",
  "assets/board-native/flags/HT.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>HT</title><path fill=\"#A2001D\" d=\"M0 0h513v172H0z\"></path><path fill=\"#0052B4\" d=\"M0 172h513v172H0z\"></path><path fill=\"#FFF\" d=\"m381.4 251.5-110.7-13.8-110.8 13.8V85.4h221.5z\"></path><circle fill=\"#0052B4\" cx=\"270.7\" cy=\"182.3\" r=\"55.4\"></circle><circle fill=\"#A2001D\" cx=\"270.7\" cy=\"182.3\" r=\"27.7\"></circle><path fill=\"#6DA544\" d=\"M229.1 113.1h83.1l-41.5 41.5z\"></path><path fill=\"#FFDA44\" d=\"M256.8 140.8h27.7v83h-27.7z\"></path><path fill=\"#6DA544\" d=\"M314.9 215.5h-88.5l-66.5 36h221.5z\"></path></svg>",
  "assets/board-native/flags/HU.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>HU</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#D80027\" d=\"M0 0h513v114H0z\"></path><path fill=\"#6DA544\" d=\"M0 228h513v114H0z\"></path></svg>",
  "assets/board-native/flags/ID.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>ID</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#E00\" d=\"M0 0h513v171H0z\"></path></svg>",
  "assets/board-native/flags/IE.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>IE</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#6DA544\" d=\"M0 0h171v342H0z\"></path><path fill=\"#FF9811\" d=\"M342 0h171v342H342z\"></path></svg>",
  "assets/board-native/flags/IL.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>IL</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path d=\"M340.6 122.4h-56.1l-28-48.6-28 48.6h-56.1l28 48.6-28 48.6h56.1l28 48.6 28-48.6h56.1l-28-48.6 28-48.6zM293.2 171 276 204.2h-38.9L219.8 171l17.2-33.2h38.9l17.3 33.2zm-36.7-71.8 11.9 23.3h-23.9l12-23.3zm-58.3 38.6h23.9l-10.8 21-13.1-21zm0 66.4 13-22.1 11.9 22.1h-24.9zm58.3 37.5-11.9-22.1h23.9l-12 22.1zm59.4-37.5h-25l11.9-22.1 13.1 22.1zm-26.1-66.4h26.1l-13 22.1-13.1-22.1zM0 21.3h512V64H0zm0 256h512V320H0z\" fill=\"#2E52B2\"></path></svg>",
  "assets/board-native/flags/IM.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>IM</title><path fill=\"#E52D42\" d=\"M0 0h513v342H0z\"></path><path fill=\"#FFF\" d=\"M393.3 68.2h-45.8l-33.8 80.2-34.4-22.9s-24.7-59.1-34.4-68.2c-9.7-9.7-18.7-.6-48.9 7.8-29.6 8.4-30.8 18.7-42.2 18.7-4.8 0-19.9-17.5-27.7-22.3-12.1-7.8-16.9-4.2-13.9 7.2 1.2 4.8 10.9 10.9 16.9 19.9 7.8 11.5 12.7 25.9 12.7 25.9s10.9-10.3 16.9-12.1c9-2.4 19.3 1.8 31.4 0 15.1-2.4 31.4-10.9 31.4-10.9l4.2 43.4s-54.3 50.7-49.5 70.6 56.1 44.6 68.2 62.7c12.1 17.5-7.2 24.1-7.2 32.6s-1.8 19.9 7.2 16.3c9-3.6 10.3-18.1 18.7-31.4 6-9 10.3-13.9 11.5-17.5 1.8-9-23.5-32-37.4-48.9-6.6-7.8-19.9-18.7-19.9-18.7l39.2-29.6s67.6 27.7 82.6 18.7c15.1-9 19.3-98.3 19.3-98.3l47-11.5-12.1-11.7z\"></path><path fill=\"#F8DD4E\" d=\"M279.3 262.4c-6 0-11.5-4.8-11.5-11.5s4.8-11.5 11.5-11.5c6 0 11.5 4.8 11.5 11.5s-5.5 11.5-11.5 11.5zm45.8-182.8c-6 0-11.5-4.8-11.5-11.5s4.8-11.5 11.5-11.5c6 0 11.5 4.8 11.5 11.5s-5.5 11.5-11.5 11.5zm0 91.1c-6 0-11.5-4.8-11.5-11.5 0-6 4.8-11.5 11.5-11.5 6 0 11.5 4.8 11.5 11.5-.6 6.7-5.5 11.5-11.5 11.5zm-136.9 45.8c-6 0-11.5-4.8-11.5-11.5 0-6 4.8-11.5 11.5-11.5 6.6 0 11.5 4.8 11.5 11.5s-5.5 11.5-11.5 11.5zm45.2-136.9c-6 0-11.5-4.8-11.5-11.5s4.8-11.5 11.5-11.5c6 0 11.5 4.8 11.5 11.5s-4.8 11.5-11.5 11.5zm22.9 91.1c-6 0-11.5-10.3-11.5-22.9s4.8-22.9 11.5-22.9c6 0 11.5 10.3 11.5 22.9s-4.8 22.9-11.5 22.9zm-114-45.2c-6 0-11.5-4.8-11.5-11.5 0-6.6 4.8-11.5 11.5-11.5 6.6 0 11.5 4.8 11.5 11.5 0 6.6-4.8 11.5-11.5 11.5z\"></path></svg>",
  "assets/board-native/flags/IN.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>IN</title><path fill=\"#ff6820\" d=\"M0 0h513v114H0V0z\"></path><path fill=\"#FFF\" d=\"M0 114h513v114H0V114z\"></path><path fill=\"#046a38\" d=\"M0 228h513v114H0V228z\"></path><path fill=\"none\" stroke=\"#07038d\" stroke-width=\"4\" d=\"M256.5 136.8c18.9 0 34.2 15.3 34.2 34.2s-15.3 34.2-34.2 34.2-34.2-15.3-34.2-34.2 15.3-34.2 34.2-34.2z\"></path><path d=\"m265.3 138.2-17.6 65.7m17.6-65.7-17.6 65.7m25.8-62.3-34 58.9m41-53.5-48 48m53.4-41L227 188m62.3-25.8-65.7 17.6m66.9-8.8h-68m66.8 8.8-65.7-17.6m62.3 25.8L227 154m53.5 41-48-48m41 53.4-34-58.9m25.8 62.3-17.6-65.7m8.8 66.9v-68m-8.8 66.8 17.6-65.7m-25.8 62.3 34-58.9m-41 53.5 48.1-48.1M227.1 188l58.9-34m-62.3 25.8 65.7-17.6m-66.9 8.8h68m-66.8-8.8 65.7 17.6M227.1 154l58.9 34m-53.5-41 48.1 48.1m-41.1-53.5 34 58.9m-25.8-62.3 17.6 65.7\" stroke=\"#07038d\" stroke-width=\"2\"></path></svg>",
  "assets/board-native/flags/IO.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>IO</title><path fill=\"#FFF\" d=\"M0-.3h513V342H0V-.3z\"></path><path fill=\"#012169\" d=\"M462.9 198.1c-4 0-14-5-21-9-11-6-21-12-31.1-12s-20 6-31.1 12c-7 4-16 9-20 9s-14-5-20-9c-11-6-22-12-32.1-12-9 0-20 6-31.1 12-7 4-16 9-20 9s-13-5-20-9c-11-6-22-12-31.1-12-10 0-21 6-32.1 12-6 4-16 9-20 9s-13-5-20-9c-11-6-21-12-31.1-12s-20 6-31.1 12c-7 4-17 9-21 9s-13-5-20-9c-10-6-20-12-30.1-12v22l19 10c11 6 21 12 31.1 12s21-6 32.1-12c6-4 16-10 20-10s13 6 20 10c11 6 21 12 31.1 12s20-6 31.1-12c7-4 17-10 21-10s13 6 20 10c11 6 21 12 31.1 12s20-6 31.1-12c7-4 16-10 20-10s14 6 21 10c11 6 21 12 31.1 12s20-6 31.1-12c7-4 16-10 20-10s14 6 20 10c11 6 22 12 32.1 12s20-6 31.1-12l19-10v-22c-10 0-20 6-30.1 12-7 4-16 9-20 9zM0 31.7l19 10c11 6 21 12 31.1 12s21-6 32.1-12c6-4 16-10 20-10s13 6 20 10c11 6 21 12 31.1 12s20-6 31.1-12c7-4 17-10 21-10s13 6 20 10c11 6 21 12 31.1 12s20-6 31.1-12c7-4 16-10 20-10s14 6 21 10c11 6 21 12 31.1 12s20-6 31.1-12c7-4 16-10 20-10s14 6 20 10c11 6 22 12 32.1 12s20-6 31.1-12l19-10v-22c-10 1-20 6-30.1 12-7 4-16 9-20 9s-14-5-21-9c-11-6-21-12-31.1-12s-20 6-31.1 12c-7 4-16 9-20 9s-14-5-20-9c-11-6-22-12-32.1-12s-20 6-31.1 12c-7 4-16 9-20 9s-13-5-20-9c-11-6-22-12-31.1-12s-21 6-32.1 12c-6 4-16 9-20 9s-13-5-20-9c-11-6-21-12-31.1-12s-20 6-31.1 12c-7 4-17 9-21 9s-13-5-20-9c-10-6-20-11-30.1-12v22zm462.9 55.2c-4 0-14-5-21-9-11-6-21-12-31.1-12s-20 6-31.1 12c-7 4-16 9-20 9s-14-5-20-9c-11-6-22-12-32.1-12-9 0-20 6-31.1 12-7 4-16 9-20 9s-13-5-20-9c-11-6-22-12-31.1-12-10 0-21 6-32.1 12-6 4-16 9-20 9s-13-5-20-9c-11-6-21-12-31.1-12s-20 6-31.1 12c-7 4-17 9-21 9s-13-5-20-9c-10-6-20-12-30.1-12v22l19 9c11 6 21 12 31.1 12s21-6 32.1-12c6-4 16-9 20-9s13 5 20 9c11 6 21 12 31.1 12s20-6 31.1-12c7-4 17-9 21-9s13 5 20 9c11 6 21 12 31.1 12s20-6 31.1-12c7-4 16-9 20-9s14 5 21 9c11 6 21 12 31.1 12s20-6 31.1-12c7-4 16-9 20-9s14 5 20 9c11 6 22 12 32.1 12s20-6 31.1-12l19-9v-22c-10 0-20 6-30.1 12-7 3.9-16 9-20 9zm50.1 34c-10 1-20 6-30.1 12-7 4-16 10-20 10s-14-6-21-10c-11-6-21-12-31.1-12s-20 6-31.1 12c-7 4-16 10-20 10s-14-6-20-10c-11-6-22-12-32.1-12s-20 6-31.1 12c-7 4-16 10-20 10s-13-6-20-10c-11-6-22-12-31.1-12s-21 6-32.1 12c-6 4-16 10-20 10s-13-6-20-10c-11-6-21-12-31.1-12s-20 6-31.1 12c-7 4-17 10-21 10s-13-6-20-10c-10-6-20-11-30.1-12v23c4 1 13 5 19 9 11 6 21 12 31.1 12s21-6 32.1-12c6-4 16-9 20-9s13 5 20 9c11 6 21 12 31.1 12s20-6 31.1-12c7-4 17-9 21-9s13 5 20 9c11 6 21 12 31.1 12s20-6 31.1-12c7-4 16-9 20-9s14 5 21 9c11 6 21 12 31.1 12s20-6 31.1-12c7-4 16-9 20-9s14 5 20 9c11 6 22 12 32.1 12s20-6 31.1-12c6-4 15-8 19-9v-23zm-50.1 133.3c-4 0-14-5-21-9-11-6-21-12-31.1-12s-20 6-31.1 12c-7 4-16 9-20 9s-14-5-20-9c-11-6-22-12-32.1-12-9 0-20 6-31.1 12-7 4-16 9-20 9s-13-5-20-9c-11-6-22-12-31.1-12-10 0-21 6-32.1 12-6 4-16 9-20 9s-13-5-20-9c-11-6-21-12-31.1-12s-20 6-31.1 12c-7 4-17 9-21 9s-13-5-20-9c-10-6-20-12-30.1-12v22l19 9c11 6 21 12 31.1 12s21-6 32.1-12c6-4 16-9 20-9s13 5 20 9c11 6 21 12 31.1 12s20-6 31.1-12c7-4 17-9 21-9s13 5 20 9c11 6 21 12 31.1 12s20-6 31.1-12c7-4 16-9 20-9s14 5 21 9c11 6 21 12 31.1 12s20-6 31.1-12c7-4 16-9 20-9s14 5 20 9c11 6 22 12 32.1 12s20-6 31.1-12l19-9v-22c-10 0-20 6-30.1 12-7 4-16 9-20 9zm50.1 34c-10 1-20 6-30.1 12-7 4-16 10-20 10s-14-6-21-10c-11-6-21-12-31.1-12s-20 6-31.1 12c-7 4-16 10-20 10s-14-6-20-10c-11-6-22-12-32.1-12s-20 6-31.1 12c-7 4-16 10-20 10s-13-6-20-10c-11-6-22-12-31.1-12s-21 6-32.1 12c-6 4-16 10-20 10s-13-6-20-10c-11-6-21-12-31.1-12s-20 6-31.1 12c-7 4-17 10-21 10s-13-6-20-10c-10-6-20-11-30.1-12v23c4 0 13 5 19 9 11 6 21 12 31.1 12s21-6 32.1-12c6-4 16-9 20-9s13 5 20 9c11 6 21 12 31.1 12s20-6 31.1-12c7-4 17-9 21-9s13 5 20 9c11 6 21 12 31.1 12s20-6 31.1-12c7-4 16-9 20-9s14 5 21 9c11 6 21 12 31.1 12s20-6 31.1-12c7-4 16-9 20-9s14 5 20 9c11 6 22 12 32.1 12s20-6 31.1-12c6-4 15-9 19-9v-23z\"></path><g stroke-width=\"2\" stroke-miterlimit=\"10\"><path d=\"M389.8 119.9H408v78.8h-18.3l.1-78.8zm0 117.8H408v75.1h-18.3l.1-75.1z\" fill=\"#a24300\" stroke=\"#000\"></path><path fill=\"#006d00\" stroke=\"#004100\" d=\"M462.8 91.5h-29.1l25.7-25.7c4.5-4.4 4.5-11.4 0-15.8l-3.4-3.4c-4.4-4.4-11.4-4.4-15.8 0l-25.9 25.9V37.4c0-6.2-5.1-11.3-11.3-11.3h-4.7c-6.2 0-11.3 5.1-11.3 11.3v31.7l-23.5-23.8c-4.7-4.7-12.2-4.7-16.9 0l-3.6 3.6c-4.7 4.7-4.7 12.4 0 17.2l25 25.4h-30.6c-6 0-10.9 4.9-10.9 10.9v4.6c0 6 4.9 10.9 10.9 10.9H369l-20.7 20.7c-4.4 4.4-4.4 11.4 0 15.8l3.4 3.4c4.4 4.4 11.4 4.4 15.8 0l19.6-19.6V167c0 6.1 5.1 11.1 11.3 11.3h4.7c6.2 0 11.3-5.1 11.3-11.3v-28.3l22.2 22.6c4.7 4.7 12.4 4.7 17.1 0l3.6-3.6c4.7-4.7 4.7-12.4 0-17.2L435.2 118h27.6c5.9 0 10.7-4.9 10.9-10.9v-4.6c0-6.1-4.9-11-10.9-11z\"></path><path fill=\"#fed100\" stroke=\"#525625\" d=\"M439.2 249.1h-79.8s-.9-13.4-6-21.8c-6.2-10.4-13.9-28.1-1.4-36.7 15.9-10.9 33.7.8 48.2.8 11.8.1 26.9-14 45-.8 12.2 8.9 3.9 28.2-1.3 36.7-7 11.5-4.7 21.8-4.7 21.8z\"></path></g><path fill=\"#012169\" d=\"M0 0h256.5v171H0z\"></path><g fill=\"#FFF\"><path d=\"M256.5 0v30.6l-45.3 25.2h45.3v59.4h-59.2l59.2 32.9V171h-26.7l-73.7-40.9V171h-55.7v-48.7L12.8 171H0v-30.6l45.3-25.2H0V55.8h59.2L0 22.9V0h26.7l73.7 40.9V0h55.7v48.7L243.7 0z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-55.7-59.4L0 0v15.8l72 40z\"></path></g><g fill=\"#D80027\"><path d=\"M144.3 0h-32.1v69.5H0v32h112.2V171h32.1v-69.5h112.2v-32H144.3z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-84.1 0-72 40V171l100.4-55.8zm28.4-59.4L0 0v15.8l72 40zm84.1 0 72-40V0L156.1 55.8z\"></path></g></svg>",
  "assets/board-native/flags/IQ.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>IQ</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#CE1126\" d=\"M0 0h513v114H0z\"></path><path d=\"M0 228h513v114H0z\"></path><path d=\"M219.2 160.7h-29.3c1.5-5.7 6.6-9.9 12.8-9.9v-19.9c-18.3 0-33.1 14.9-33.1 33.1v16.5h49.6c1.8 0 3.3 1.5 3.3 3.3v6.6h-66.2v19.9h86.1v-26.5c0-12.7-10.4-23.1-23.2-23.1zm49.6 29.8v-59.6H249v79.5h33.1v-19.9zm66.2 0v-59.6h-19.8v59.6h-6.6v-19.8h-19.9v39.7h59.6v-19.9z\" fill=\"#547C31\"></path></svg>",
  "assets/board-native/flags/IR.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>IR</title><path fill=\"#FFF\" d=\"M0 0h512v342H0z\"></path><path fill=\"#6DA544\" d=\"M0 0h513v114H0z\"></path><path d=\"M0 227.9h513v114H0zm278.8-93.1c.1 2 8.7 26.2 4.4 39.4-6.6 20.3-15.8 21.8-19.8 24.5V134l-6.9-4.2-6.9 4.2v64.7c-4-2.7-12.4-2.4-19.8-24.5-4.3-12.7 5.7-37.3 5.8-39.2 0 0-9.5 8.1-15.8 24-5.9 14.8 1.9 49.6 29.5 54.8 2.3.4 4.7 5.6 7.2 5.6 2.1 0 4.1-5.2 6-5.5 28.4-4.6 35-41.7 29.9-55.6-5.4-14.6-13.6-23.5-13.6-23.5z\" fill=\"#D80027\"></path><path d=\"M44.6 98.9h22.3v24.4H44.6zM0 98.9h22.3v24.4H0zm89.2 0h22.3v24.4H89.2zm44.6 0h22.3v24.4h-22.3zm44.6 0h22.3v24.4h-22.3zm44.6 0h22.3v24.4H223zm44.7 0H290v24.4h-22.3zm44.6 0h22.3v24.4h-22.3zm44.6 0h22.3v24.4h-22.3zm44.6 0h22.3v24.4h-22.3zm44.6 0h22.3v24.4h-22.3zm44.6 0H513v24.4h-22.3zm-446.1 118h22.3v25.5H44.6zm-44.6 0h22.3v25.5H0zm89.2 0h22.3v25.5H89.2zm44.6 0h22.3v25.5h-22.3zm44.6 0h22.3v25.5h-22.3zm44.6 0h22.3v25.5H223zm44.7 0H290v25.5h-22.3zm44.6 0h22.3v25.5h-22.3zm44.6 0h22.3v25.5h-22.3zm44.6 0h22.3v25.5h-22.3zm44.6 0h22.3v25.5h-22.3zm44.6 0H513v25.5h-22.3z\" fill=\"#FFF\" opacity=\"0.5\"></path></svg>",
  "assets/board-native/flags/IS.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>IS</title><path fill=\"#0052B4\" d=\"M0 0h513v342H0z\"></path><path fill=\"#FFF\" d=\"M513 210.6H202.2v130.7h-79.8V210.6H0v-79.8h122.4V0h79.8v130.8H513v18.5l-1 42.7z\"></path><path fill=\"#D80027\" d=\"M513 149.3V192H183.7v149.3H141V192H0v-42.7h141V0h42.7v149.3z\"></path></svg>",
  "assets/board-native/flags/IT.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>IT</title><path fill=\"#F4F5F0\" d=\"M342 0H0v341.3h512V0z\"></path><path fill=\"#008C45\" d=\"M0 0h171v342H0z\"></path><path fill=\"#CD212A\" d=\"M342 0h171v342H342z\"></path></svg>",
  "assets/board-native/flags/JE.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>JE</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#D80027\" d=\"M301.8 171 513 30.2V0h-45.3L256.5 140.8 45.3 0H0v30.2L211.2 171 0 311.8V342h45.3l211.2-140.8L467.7 342H513v-30.2z\"></path><path fill=\"#FFDA44\" d=\"m233.7 44.6 22.3 5.6 22.3-5.6 4-20.9-14.9 6.5L256 14.8l-11.4 15.4-14.9-6.5z\"></path><path fill=\"#D80027\" d=\"M233.7 44.6s-4 12.9-4 29.9c0 27.9 26.3 41.3 26.3 41.3s26.3-15.5 26.3-41.3c0-15.4-4-29.9-4-29.9s-8.1-5-22.3-5-22.3 5-22.3 5z\"></path></svg>",
  "assets/board-native/flags/JM.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>JM</title><path fill=\"#6DA544\" d=\"M0 0h513v342H0z\"></path><path d=\"M215.9 171 0 314.6V26.8zM513 26.8v287.8L296.1 171z\"></path><path fill=\"#0052B4\" d=\"M513 26.8 296.1 171 513 314.6V342h-41.1L256 197.4 40.1 342H0v-27.4L215.9 171 0 26.8V0h40.1L256 143.9 471.9 0H513z\"></path><path fill=\"#FFDA44\" d=\"M513 26.8 296.1 171 513 314.6V342h-41.1L256 197.4 40.1 342H0v-27.4L215.9 171 0 26.8V0h40.1L256 143.9 471.9 0H513z\"></path></svg>",
  "assets/board-native/flags/JO.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>JO</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 0h513v114H0z\"></path><path fill=\"#6DA544\" d=\"M0 228h513v114H0z\"></path><path fill=\"#D80027\" d=\"M256.5 170.7 0 341.3V0z\"></path><path fill=\"#FFF\" d=\"m77.9 139.5 7.9 16.4 17.8-4.1-8 16.5 14.3 11.3-17.8 4 .1 18.3-14.3-11.5-14.2 11.5v-18.3l-17.8-4 14.3-11.3-7.9-16.5 17.7 4.1z\"></path></svg>",
  "assets/board-native/flags/JP.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>JP</title><path fill=\"#FFF\" d=\"M0 0h512v342H0z\"></path><circle fill=\"#D80027\" cx=\"256.5\" cy=\"171\" r=\"96\"></circle></svg>",
  "assets/board-native/flags/KE.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>KE</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 0h512v90.579H0z\"></path><path fill=\"#496E2D\" d=\"M0 251h513v91H0z\"></path><path fill=\"#A2001D\" d=\"M0 114h513v114H0z\"></path><g fill=\"#FFF\"><path d=\"m323.3 54.5-25.6-11.8L256 137l-41.7-94.3-25.6 11.8 51.8 116.2-51.8 116.2 25.6 11.8 41.7-94.4 41.7 94.4 25.6-11.8-51.8-116.2z\"></path><path d=\"M273.4 65.6c-9.9-10.8-17.4-17-17.4-17s-7.5 6.2-17.4 17v210.1c9.9 10.8 17.4 17 17.4 17s7.5-6.2 17.4-17V65.6z\"></path></g><path d=\"M209 105.9v129.5c10.5 18.5 23.3 33.7 32.9 43.8V62.1c-9.6 10.1-22.4 25.3-32.9 43.8zm94 0c-10.5-18.5-23.3-33.7-32.9-43.8v217.2c9.6-10.1 22.4-25.3 32.9-43.8V105.9z\" fill=\"#A2001D\"></path><path d=\"M303 105.9v129.5c10.6-18.8 18.8-41 18.8-64.8s-8.2-45.9-18.8-64.7zm-94 0v129.5c-10.6-18.8-18.8-41-18.8-64.8s8.2-45.9 18.8-64.7z\"></path></svg>",
  "assets/board-native/flags/KG.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>KG</title><g fill=\"#D80027\"><path d=\"M0 0h513v342H0z\"></path><circle cx=\"256\" cy=\"171\" r=\"171\"></circle></g><path fill=\"#FFDA44\" d=\"M382.4 170.7 330.8 195l27.5 50-56.1-10.7-7.1 56.6-39.1-41.7-39.1 41.7-7.1-56.6-56.1 10.7 27.5-50-51.6-24.3 51.6-24.3-27.5-50.1 56.1 10.8 7.1-56.7L256 92.1l39.1-41.7 7.1 56.7 56.1-10.8-27.5 50.1z\"></path><circle fill=\"#D80027\" cx=\"257.4\" cy=\"170.7\" r=\"71.6\"></circle><path d=\"M214.2 170.7c-2.1 0-4.1.1-6.2.3.1 12 4.4 22.9 11.6 31.5 3.8-10.3 9.5-19.6 16.7-27.7-6.9-2.7-14.3-4.1-22.1-4.1zm26.6 46.5c5.2 1.9 10.8 2.9 16.6 2.9 5.8 0 11.4-1 16.6-2.9-2.8-11.1-8.7-21-16.6-28.8-7.9 7.8-13.8 17.7-16.6 28.8zm59.4-71.2c-8.5-14.8-24.5-24.7-42.8-24.7-18.3 0-34.2 9.9-42.8 24.7 15.6.1 30.2 4.3 42.8 11.6 12.6-7.3 27.2-11.6 42.8-11.6zm-21.7 28.8c7.2 8 12.9 17.4 16.7 27.7 7.2-8.5 11.5-19.5 11.6-31.5-2-.2-4.1-.3-6.2-.3-7.7 0-15.2 1.4-22.1 4.1z\" fill=\"#FFDA44\"></path></svg>",
  "assets/board-native/flags/KH.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>KH</title><path fill=\"#D80027\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 0h513v114H0zm0 228h513v114H0z\" fill=\"#0052B4\"></path><path fill=\"#FFF\" d=\"M303.5 196.6v-17.8h-11.9v-23.7l-11.9-11.9-11.8 11.9v-23.8L256 119.5l-11.9 11.8v23.8l-11.8-11.9-11.9 11.9v23.7h-11.9v17.8h-11.9v17.8h118.8v-17.8z\"></path></svg>",
  "assets/board-native/flags/KI.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 450 300\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>KI</title><path fill=\"#CE1126\" d=\"M0 0h450v300H0V0z\"></path><g fill=\"#FCD116\"><circle cx=\"227.6\" cy=\"161.2\" r=\"56.2\"></circle><path d=\"m254.1 73.4-23.7 26 28.6 6.5zm-51.5.2-4.8 33.1 28.5-8zm94.3 26.7-34.7 8.5 20.1 23.7zm-138.3-1.8 15.5 32.7 20.2-22.7zm159 45.3-34.4-9.9 5.6 29.5zm-182-2.6 31.9 19.8 5.2-27.7z\"></path></g><path fill=\"#003F87\" d=\"M0 175h450v125H0V175z\"></path><path fill=\"#FFF\" d=\"M0 267c15 0 30 13 45 13s30-13 45-13 30 13 45 13 30-13 45-13 30 13 45 13 30-13 45-13 30 13 45 13 30-13 45-13 30 13 45 13 30-13 45-13v-21c-15 0-30 13-45 13s-30-13-45-13-30 13-45 13-30-13-45-13-30 13-45 13-30-13-45-13-30 13-45 13-30-13-45-13-30 13-45 13-30-13-45-13v21zm0-43c15 0 30 13 45 13s30-13 45-13 30 13 45 13 30-13 45-13 30 13 45 13 30-13 45-13 30 13 45 13 30-13 45-13 30 13 45 13 30-13 45-13v-21c-15 0-30 13-45 13s-30-13-45-13-30 13-45 13-30-13-45-13-30 13-45 13-30-13-45-13-30 13-45 13-30-13-45-13-30 13-45 13-30-13-45-13v21zm0-43c15 0 30 13 45 13s30-13 45-13 30 13 45 13 30-13 45-13 30 13 45 13 30-13 45-13 30 13 45 13 30-13 45-13 30 13 45 13 30-13 45-13v-21c-15 0-30 13-45 13s-30-13-45-13-30 13-45 13-30-13-45-13-30 13-45 13-30-13-45-13-30 13-45 13-30-13-45-13-30 13-45 13-30-13-45-13v21z\"></path><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" fill=\"#FCD116\" d=\"m183.2 48.3-1.1-5.3 22.4-3.7s-30.1-7.1-40-10.7c-14.3-5.1-16.3-12.1-16.3-12.1s44.7 11 64.8 11c4.3 0 12.8 10.7 12.8 10.7s14.8-14.9 21.9-15.4c32.1-2.3 66.6-6.4 66.6-6.4s-10 6.7-16 8.5c-16.2 4.9-50.6 11.7-50.6 11.7l-4.8 7.5H277l-14.4 4.3 7.4 6.9s-7.8-4.1-18.1-2.1c-7.1 1.3-15.4 6-22.9 8-18.7 4.8-29.9-12.8-29.9-12.8l-15.9-.1z\"></path></svg>",
  "assets/board-native/flags/KM.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>KM</title><path fill=\"#0052B4\" d=\"M0 0h513v342H0z\"></path><path fill=\"#FFDA44\" d=\"M0 0h513v85.5H0z\"></path><path fill=\"#FFF\" d=\"M0 85.5h513V171H0z\"></path><path fill=\"#D80027\" d=\"M0 171h513v85.5H0z\"></path><path fill=\"#6DA544\" d=\"M256.5 171 0 342V0z\"></path><g fill=\"#FFF\"><path d=\"M68.6 170.7c0-24.9 17.5-45.6 40.8-50.7-3.6-.8-7.3-1.2-11.1-1.2-28.7 0-51.9 23.3-51.9 51.9s23.3 51.9 51.9 51.9c3.8 0 7.5-.4 11.1-1.2-23.3-5.1-40.8-25.9-40.8-50.7z\"></path><path d=\"m108.9 126.1 2.7 8.5h9l-7.3 5.3 2.8 8.5-7.2-5.2-7.3 5.2 2.8-8.5-7.2-5.3h8.9zm0 22.3 2.7 8.5h9l-7.3 5.3 2.8 8.5-7.2-5.3-7.3 5.3 2.8-8.5-7.2-5.3h8.9z\"></path><path d=\"m108.9 170.7 2.7 8.5h9l-7.3 5.2 2.8 8.5-7.2-5.2-7.3 5.2 2.8-8.5-7.2-5.2h8.9zm0 22.2 2.7 8.5h9l-7.3 5.3 2.8 8.5-7.2-5.3-7.3 5.3 2.8-8.5-7.2-5.3h8.9z\"></path></g></svg>",
  "assets/board-native/flags/KN.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>KN</title><path fill=\"#D80027\" d=\"M0 0h513v342H0z\"></path><path fill=\"#6DA544\" d=\"M512 0H0v342\"></path><path fill=\"#FFDA44\" d=\"M307.7 0 0 194.5V342h206.9L513 148.5V0z\"></path><path d=\"M513 0H385.2L0 249.4V341l126.2 1L513 91.6z\"></path><path d=\"m141.1 187 31.2 24 32.3-22.2-13.1 37 31.1 23.9-39.2-1.1-13.2 37-11.1-37.6-39.2-1.1 32.3-22.2zM310.6 70.8l31.2 23.9 32.3-22.2-13.1 37 31.1 23.9-39.2-1.1-13.2 37-11.1-37.6-39.2-1.1 32.4-22.2z\" fill=\"#FFF\"></path></svg>",
  "assets/board-native/flags/KP.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>KP</title><path fill=\"#91DC5A\" d=\"M0 0h513v342H0z\"></path><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 0h513v57.188H0zm0 284.1h513v57.177H0z\" fill=\"#0052B4\"></path><path fill=\"#D80027\" d=\"M0 79.9h513v181.582H0z\"></path><circle fill=\"#FFF\" cx=\"190.33\" cy=\"171\" r=\"65.668\"></circle><path fill=\"#D80027\" d=\"m190.3 105 14.8 45.3h47.7l-38.6 28.1 14.8 45.5-38.7-28.2-38.6 28.1 14.8-45.4-38.6-28.1h47.7z\"></path></svg>",
  "assets/board-native/flags/KR.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>KR</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path d=\"M84.6 107.8 132 36.6m-29.7 83 47.4-71.1m-29.6 83 47.4-71.1m177.9 221.3 47.4-71.1m-29.6 82.9 47.4-71.1m-29.6 83 47.4-71.1M132 305.4l-47.4-71.1m65.2 59.2-47.4-71.1m65.2 59.3-47.4-71.1m272.6-79.1-47.4-71.1m65.2 59.2-47.4-71.1m65.2 59.3L381 36.6\" stroke=\"#000\" stroke-width=\"14.25\"></path><path d=\"m357.3 238.2 59.3 39.5m-299.4-13.8L135 252m222.3-148.2L378 90m17.8-11.9 17.8-11.9\" stroke=\"#FFF\" stroke-width=\"12.5\"></path><circle fill=\"#CA163A\" cx=\"256.5\" cy=\"171\" r=\"85.5\"></circle><path fill=\"#0E4896\" d=\"M185.3 123.6c-13.1 19.6-7.8 46.2 11.9 59.3s46.2 7.8 59.3-11.9 39.6-24.9 59.3-11.9c19.6 13.1 24.9 39.6 11.9 59.3-26.2 39.3-79.3 49.9-118.6 23.7s-49.9-79.3-23.8-118.5z\"></path></svg>",
  "assets/board-native/flags/KW.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>KW</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#6DA544\" d=\"M0 0h513v114H0z\"></path><path fill=\"#D80027\" d=\"M0 228h513v114H0z\"></path><path d=\"M167 227.6 0 341.3V0l167 113.8z\"></path></svg>",
  "assets/board-native/flags/KY.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>KY</title><path fill=\"#012169\" d=\"M0 0h513v342H0z\"></path><g stroke=\"#fff\"><circle fill=\"#059334\" cx=\"384\" cy=\"96.5\" r=\"29.7\"></circle><path fill=\"#c8102e\" d=\"M332.1 89H436v44.5H332.1z\"></path><path fill=\"#fcea83\" d=\"M332.1 200.3V230h15.6c9.4 9.2 22.2 14.8 36.3 14.8 14.1 0 27-5.7 36.3-14.8h15.6v-29.7H332.1z\"></path><path fill=\"#004b9e\" d=\"M332.1 126.1v44.5c0 39.8 51.9 51.9 51.9 51.9s51.9-12.2 51.9-51.9v-44.5H332.1z\"></path><path d=\"M384 149.9c-13 0-13 11.9-26 11.9s-13-11.9-26-11.9v20.8c13 0 13 11.9 26 11.9s13-11.9 26-11.9 13 11.9 26 11.9 13-11.9 26-11.9v-20.8c-13 0-13 11.9-26 11.9s-13-11.9-26-11.9zm0-41.6c-13 0-13 11.9-26 11.9s-13-11.9-26-11.9v20.8c13 0 13 11.9 26 11.9s13-11.9 26-11.9 13 11.9 26 11.9 13-11.9 26-11.9v-20.8c-13 0-13 11.9-26 11.9s-13-11.9-26-11.9z\" fill=\"#F3F3F3\"></path></g><path fill=\"#012169\" d=\"M0 0h256.5v171H0z\"></path><g fill=\"#FFF\"><path d=\"M256.5 0v30.6l-45.3 25.2h45.3v59.4h-59.2l59.2 32.9V171h-26.7l-73.7-40.9V171h-55.7v-48.7L12.8 171H0v-30.6l45.3-25.2H0V55.8h59.2L0 22.9V0h26.7l73.7 40.9V0h55.7v48.7L243.7 0z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-55.7-59.4L0 0v15.8l72 40z\"></path></g><g fill=\"#D80027\"><path d=\"M144.3 0h-32.1v69.5H0v32h112.2V171h32.1v-69.5h112.2v-32H144.3z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-84.1 0-72 40V171l100.4-55.8zm28.4-59.4L0 0v15.8l72 40zm84.1 0 72-40V0L156.1 55.8z\"></path></g></svg>",
  "assets/board-native/flags/KZ.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>KZ</title><path fill=\"#36B6CC\" d=\"M0 0h513v342H0V0z\"></path><circle fill=\"#FFD400\" cx=\"256.5\" cy=\"170.9\" r=\"68.4\"></circle><path fill=\"#FFD400\" d=\"m256.5 251.5-27.9 41.7-7.1-49.7-43.2 25.5 15.2-47.8-50 4.2 34.4-36.5-46.9-18 46.8-18-34.4-36.5 50 4.2-15.2-47.8 43.2 25.4 7.1-49.7 27.9 41.7 27.9-41.7 7.1 49.7 43.2-25.4-15.2 47.8 50-4.2-34.3 36.6 46.8 17.9-46.8 18 34.4 36.5-50-4.2 15.2 47.8-43.2-25.4-7.1 49.7c0-.1-27.9-41.8-27.9-41.8zm0-.8c44.1 0 79.9-35.8 79.9-79.9S300.6 91 256.5 91s-79.9 35.8-79.9 79.9 35.8 79.8 79.9 79.8zM22.8 28.3c0-3.2 2.4-5.7 5.7-5.7h11.3c3.2 0 5.7 2.4 5.7 5.7v11.3c.1 3.1-2.4 5.7-5.6 5.7H28.5c-3.1 0-5.7-2.5-5.7-5.6V28.3zm0 45.7c0-3.2 2.4-5.7 5.7-5.7h11.3c3.2 0 5.7 2.4 5.7 5.7v11.3c.1 3.1-2.4 5.7-5.6 5.7H28.5c-3.1 0-5.7-2.5-5.7-5.6V74zm0 45.6c0-3.2 2.4-5.7 5.7-5.7h11.3c3.2 0 5.7 2.4 5.7 5.7v11.3c.1 3.1-2.4 5.7-5.6 5.7H28.5c-3.1 0-5.7-2.5-5.7-5.6v-11.4zm0 45.6c0-3.2 2.4-5.7 5.7-5.7h11.3c3.2 0 5.7 2.4 5.7 5.7v11.3c.1 3.1-2.4 5.7-5.6 5.7H28.5c-3.1 0-5.7-2.5-5.7-5.6v-11.4zm0 45.7c0-3.2 2.4-5.7 5.7-5.7h11.3c3.2 0 5.7 2.4 5.7 5.7v11.3c.1 3.1-2.4 5.7-5.6 5.7H28.5c-3.1 0-5.7-2.5-5.7-5.6v-11.4zm0 45.6c0-3.2 2.4-5.7 5.7-5.7h11.3c3.2 0 5.7 2.4 5.7 5.7v11.3c.1 3.1-2.4 5.7-5.6 5.7H28.5c-3.1 0-5.7-2.5-5.7-5.6v-11.4zm0 45.6c0-3.2 2.4-5.7 5.7-5.7h11.3c3.2 0 5.7 2.4 5.7 5.7v11.3c.1 3.1-2.4 5.7-5.6 5.7H28.5c-3.1 0-5.7-2.5-5.7-5.6v-11.4zm22.8-22.8c0-3.2 2.4-5.7 5.7-5.7h11.3c3.2 0 5.7 2.4 5.7 5.7v11.3c.1 3.1-2.4 5.7-5.6 5.7H51.3c-3.1 0-5.7-2.5-5.7-5.6v-11.4zm0-45.6c0-3.2 2.4-5.7 5.7-5.7h11.3c3.2 0 5.7 2.4 5.7 5.7V245c.1 3.1-2.4 5.7-5.6 5.7H51.3c-3.1 0-5.7-2.5-5.7-5.6v-11.4zm0-45.7c0-3.2 2.4-5.7 5.7-5.7h11.3c3.2 0 5.7 2.4 5.7 5.7v11.3c.1 3.1-2.4 5.7-5.6 5.7H51.3c-3.1 0-5.7-2.5-5.7-5.6V188zm0-45.6c0-3.2 2.4-5.7 5.7-5.7h11.3c3.2 0 5.7 2.4 5.7 5.7v11.3c.1 3.1-2.4 5.7-5.6 5.7H51.3c-3.1 0-5.7-2.5-5.7-5.6v-11.4zm0-45.6c0-3.2 2.4-5.7 5.7-5.7h11.3c3.2 0 5.7 2.4 5.7 5.7v11.3c.1 3.1-2.4 5.7-5.6 5.7H51.3c-3.1 0-5.7-2.5-5.7-5.6V96.8zm0-45.6c0-3.2 2.4-5.7 5.7-5.7h11.3c3.2 0 5.7 2.4 5.7 5.7v11.3c.1 3.1-2.4 5.7-5.6 5.7H51.3c-3.1 0-5.7-2.5-5.7-5.6V51.2z\"></path></svg>",
  "assets/board-native/flags/LA.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>LA</title><path fill=\"#0052B4\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 .1h513v90.7H0zm0 251.2h513V342H0z\" fill=\"#D80027\"></path><circle fill=\"#FFF\" cx=\"256.5\" cy=\"171\" r=\"65.9\"></circle></svg>",
  "assets/board-native/flags/LB.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>LB</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 .2h513v90.7H0zm.5 251.1H513V342H.5z\" fill=\"#D80027\"></path><path fill=\"#6DA544\" d=\"M290.3 193.5 256 130.7l-34.3 62.8h25.7v17.2h17.2v-17.2z\"></path><path fill=\"#14AF5A\" d=\"M241.3 213.1c4.4-4.4 4.4-11.6-.1-16l4.7 4.7c-5.2-4.7-12.2-6.6-19.1-5.3l-23.5 5.9c-6.1 1.5-6.8-.4-1.8-4.2l27.1-20.3c5.1-3.8 4.2-6.9-2.3-6.9h-11c-6.4 0-7-2.3-1.5-5.1l25.3-12.7c5.6-2.8 5.1-5.1-1.5-5.1h-11c-6.4 0-7.4-3.1-2.3-6.9l27.1-20.3c5.6-3.8 12.9-3.8 18.5 0l27.1 20.3c5.1 3.8 4.2 6.9-2.3 6.9h-11c-6.4 0-7 2.3-1.5 5.1l25.3 12.7c5.6 2.8 5.1 5.1-1.5 5.1h-11c-6.4 0-7.4 3.1-2.3 6.9l27.1 20.3c5.1 3.8 4.4 5.7-1.8 4.2l-23.5-5.9c-6.8-1.3-13.9.6-19.1 5.3l4.7-4.7c-4.4 4.4-4.5 11.5-.1 16l6.8 6.8c4.4 4.4 3.1 8-3.3 8h-45.8c-6.2 0-7.7-3.6-3.3-8 .1.1 6.9-6.8 6.9-6.8z\"></path></svg>",
  "assets/board-native/flags/LC.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>LC</title><path fill=\"#55B2FF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#F3F3F3\" d=\"M148.5 298.1h216l-108-254.2z\"></path><path fill=\"#333\" d=\"m186 272.7 70.5-160.3L327 272.7z\"></path><path fill=\"#FFDA44\" d=\"M148.5 298.1h216l-108-101.7z\"></path></svg>",
  "assets/board-native/flags/LI.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>LI</title><path fill=\"#D80027\" d=\"M0 0h513v342H0z\"></path><path fill=\"#0052B4\" d=\"M0 0h513v171H0z\"></path><path fill=\"#FFDA44\" d=\"M149.3 98.1c0-14-11.3-25.3-25.3-25.3-6.5 0-12.4 2.4-16.9 6.4V64.4h8.4V47.5h-8.4v-8.4H90.3v8.4h-8.4v16.9h8.4v14.9c-4.5-4-10.4-6.4-16.9-6.4-14 0-25.3 11.3-25.3 25.3 0 7.5 3.3 14.2 8.4 18.8v14.9h84.3V117c5.3-4.7 8.5-11.5 8.5-18.9z\"></path></svg>",
  "assets/board-native/flags/LK.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>LK</title><path fill=\"#FFDA44\" d=\"M0 0h513v342H0z\"></path><path fill=\"#A2001D\" d=\"M222.6 22.3h267.1v296.8H222.6z\"></path><path fill=\"#D80027\" d=\"M22.3 22.3h200.3v296.8H22.3z\"></path><path fill=\"#FFDA44\" d=\"M200.3 0h22.3v342h-22.3z\"></path><path fill=\"#6DA544\" d=\"M22.3 22.3h89v296.8h-89z\"></path><path fill=\"#FF9811\" d=\"M111.3 22.3h89v296.8h-89z\"></path><path fill=\"#FFDA44\" d=\"M368.2 156.8c-1.4-2 0-37.9 0-37.9.9-7.4.1-8.4 1-11.4.9-2.9 5.4-11.6 5.4-11.6s-6-2.3-10.3-.6c-4.3 1.7-24.7-7.5-31.2 3.4-4.4 7-23.6 16.2-24.6 14-1-2.2-5.9-5-6.9-2.9s-.7 13.9 0 16c.8 2.6 9.8 2 12.3 3.1 3.7 1.8 12.2 8.2 11.9 10.7-.3 2.5-22.5-6-24.2-4.5-1.4 1.2-1.9 13.2-.4 15 1.8 2.1 23.4 5.6 25 7.5 1.6 1.9-13.1 7.4-12.3 25 .7 14.7 8 17.4 8 17.4s-2.4 3.6-7.8 3.1c-6.2-.6-27.4-17.7-27.4-17.7s-3.5-109 3.6-121.4c4.9-8.5-22.7 10.1-22.7 50.8V151c0 6.6-1.4 22.4 2.6 34 0 0-.4 46.9 1.5 49.6s12.7 2.2 14.8 0 0-30 0-30c7.7.2 18.3 17.5 32.5 16.4 20.6-1.6 28.7-9.9 34.3-5 8.1 7.1 5.5 23.2.4 31.5-2.2 3.5-14.3 4.7-15.7 7.6-1.4 2.9.5 5.4.5 5.4h29.7s1.4-20.5 2.7-26.1c1.3-5.7-.6-10.7 5.9-10.4 23.5 1.1 39.8-15.3 45.5-8 3.2 4.1 5.6 29.9 3.3 33.3-2.2 3.4-13.8 2.8-15.2 6.7-1.4 4 .8 4.4.8 4.4h29.7s-.4-21.2 2.5-27.7 4.9-10.4 9.3-17.2c4.4-6.8 11.3-15.7 11.3-36.2 0-14.2-8.1-22.8-8.1-22.8H417c-14.1.2-47.4 2.3-48.8.3zm-136-124.5c10.7-10.6 20.2-2.7 22.2 2.1 1.9 4.8 2.1 8.2 2.8 13.6.9 6.9 4.9 14 4.9 14s-7.1-3.8-14.7-4.2c-4.7-.3-9-.6-13.6-2.5-5.7-2.3-11.7-12.9-1.6-23zm248.4-.1c10.7 10.6 2.8 20.2-2 22.2s-8.2 2.1-13.6 2.8c-6.9.9-14 5-14 5s3.7-7.1 4.2-14.7c.3-4.7.6-9.1 2.4-13.6 2.2-5.7 12.8-11.8 23-1.7zm.1 276.9c-10.7 10.6-20.2 2.6-22.2-2.2-1.9-4.8-2.1-8.2-2.7-13.6-.8-6.9-4.9-14.1-4.9-14.1s7 3.8 14.7 4.3c4.7.3 9 .6 13.6 2.5 5.7 2.4 11.7 13.1 1.5 23.1zm-248.2-.1c-10.6-10.7-2.7-20.2 2.1-22.2 4.8-1.9 8.2-2.1 13.6-2.8 6.9-.9 14-4.9 14-4.9s-3.8 7.1-4.2 14.7c-.3 4.7-.6 9-2.5 13.6-2.3 5.7-12.9 11.8-23 1.6z\"></path><path fill=\"none\" stroke=\"#FFDA44\" stroke-width=\"6\" stroke-miterlimit=\"10\" d=\"M446.9 162.4s7.5-2.6 8.4-16.1c.6-8.6-19.8-16-39-11.5-19.7 4.6-34-3.1-34-14.6 0-22.9 29.7-16.2 38.9-11.3 9.1 4.9 29.7 23.5 35.1 9.4\"></path></svg>",
  "assets/board-native/flags/LR.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>LR</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 0h513v31.1H0zm0 62.2h513v31.1H0zm0 62.3h513v31.1H0zm0 62.3h513v31.1H0zm0 62.5h513v31.1H0zm0 61.6h513V342H0z\" fill=\"#bf0a30\"></path><path fill=\"#002868\" d=\"M0 0h155.6v155.6H0z\"></path><path fill=\"#FFF\" d=\"m77.8 30.2 10.7 32.9h34.6l-28 20.4 10.7 32.9-28-20.3-28 20.3 10.7-32.9-28-20.4h34.6z\"></path></svg>",
  "assets/board-native/flags/LS.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>LS</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#0052B4\" d=\"M0 0h513v114H0z\"></path><path fill=\"#6DA544\" d=\"M0 227.6h513v114H0z\"></path><path d=\"m245.2 171 7.7-23.1c2-5.9 5.1-6 7.1 0l7.7 23.1 19.4 29.1c1.7 2.6 1.3 6.3-1.2 8 0 0-6.9 8-29.5 8s-29.5-8-29.5-8c-2.4-2-2.9-5.4-1.2-8l19.5-29.1z\"></path><path d=\"M256.5 171c-12.5 0-22.6-10.1-22.6-22.6 0-12.5 10.1-22.6 22.6-22.6s22.6 10.1 22.6 22.6c0 12.5-10.2 22.6-22.6 22.6zm0 0c6.2 0 11.3-16.3 11.3-22.6 0-6.2-5.1-11.3-11.3-11.3-6.2 0-11.3 5.1-11.3 11.3 0 6.3 5 22.6 11.3 22.6z\"></path></svg>",
  "assets/board-native/flags/LT.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>LT</title><path fill=\"#6DA544\" d=\"M0 0h513v342H0z\"></path><path fill=\"#FFDA44\" d=\"M0 0h513v114H0z\"></path><path fill=\"#D80027\" d=\"M0 228h513v114H0z\"></path></svg>",
  "assets/board-native/flags/LU.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>LU</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#D80027\" d=\"M0 0h513v114H0z\"></path><path fill=\"#338AF3\" d=\"M0 228h513v114H0z\"></path></svg>",
  "assets/board-native/flags/LV.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>LV</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path class=\"prefix__st1\" d=\"M0 0h513v127.6H0zm0 214.4h513V342H0z\" fill=\"#A2001D\"></path></svg>",
  "assets/board-native/flags/LY.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>LY</title><path d=\"M0 0h513v342H0z\"></path><path fill=\"#D80027\" d=\"M0 0h513v114H0z\"></path><path fill=\"#496E2D\" d=\"M0 228h513v114H0z\"></path><g fill=\"#FFF\"><path d=\"m281.4 150.7 9 12.3 14.5-4.7-9 12.4 9 12.3-14.5-4.7-9 12.3v-15.2l-14.5-4.7 14.5-4.7z\"></path><path d=\"M257 201.5c-17 0-30.9-13.8-30.9-30.9s13.8-30.9 30.9-30.9c5.3 0 10.3 1.3 14.7 3.7-6.9-6.7-16.2-10.8-26.6-10.8-21 0-38 17-38 38s17 38 38 38c10.3 0 19.7-4.1 26.6-10.8-4.4 2.4-9.4 3.7-14.7 3.7z\"></path></g></svg>",
  "assets/board-native/flags/MA.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>MA</title><path fill=\"#d12a46\" d=\"M0 .3V342h513V.3z\"></path><path fill=\"#316525\" d=\"M359.8 148.9h-73.3l-22.7-69.7-22.7 69.7h-73.3l59.3 43.1-22.7 69.7 59.3-43.1 59.3 43.1-22.5-69.7 59.3-43.1zm-116.1 37.7 7.7-23.6h24.8l7.7 23.6-20.1 14.6-20.1-14.6zm27.9-37.7H256l7.8-24 7.8 24zm24.3 29-4.8-14.9h25.3l-20.5 14.9zM236.6 163l-4.8 14.9-20.5-14.9h25.3zm-5.3 61.8 7.8-24 12.6 9.2-20.4 14.8zm44.5-14.9 12.6-9.2 7.8 24-20.4-14.8z\"></path></svg>",
  "assets/board-native/flags/MC.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>MC</title><path fill=\"#FFF\" d=\"M0 171h513v171H0z\"></path><path fill=\"#ce1126\" d=\"M0 0h513v171H0z\"></path></svg>",
  "assets/board-native/flags/MD.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>MD</title><path fill=\"#FFDA44\" d=\"M0 0h513v342H0z\"></path><path fill=\"#D80027\" d=\"M342 0h171v342H342z\"></path><path fill=\"#0052B4\" d=\"M0 0h171v342H0z\"></path><path fill=\"#AF7F59\" stroke=\"#231F20\" stroke-width=\"3\" stroke-miterlimit=\"10\" d=\"m240.4 105.7 9.7 11.6-7.5 17.4-26.1-24.3-12.7 13.2v106.1l24.6-36 20.6 12.4-18 27.8 25.2 15.8 26.5-15.8-19.7-27.8 22.3-12.4 23.9 33.8v-106l-12.4-12-26.8 24.7-6.5-16.5 3.5-12.3-11.7-7.5z\"></path></svg>",
  "assets/board-native/flags/ME.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>ME</title><path fill=\"#ffc000\" d=\"M0 0h513v342H0z\"></path><path fill=\"#e30000\" d=\"M20 20h473v302H20z\"></path><path fill=\"#ffc000\" d=\"M248.5 112.9c4.4 4.4 11.6 4.4 16 0l-4.7 4.7 22.7-22.7c4.9-4.5 12.1-5.6 18.2-2.8l2.1 1c5.7 2.9 6.7 8.7 2.3 13.1l4.7-4.7-22.8 22.8c-4.5 4.9-5.6 12.1-2.8 18.2l1 2.1c2.9 5.7 5.1 15.4 5.1 21.6v-11.3c0 6.2 4.4 9.1 10.2 6.2l2.1-1c5.7-2.9 6.7-8.7 2.3-13.1l4.7 4.7c-4.4-4.4-4.4-11.6 0-16l-4.7 4.7c5.2-5.5 9.6-11.6 13.1-18.2l1-2.1c2.9-5.7 6.3-15.1 7.9-21.2l5.8-23.3c1.5-6 5.9-6.8 9.6-1.8l20.2 26.9c3.8 5.1 6.9 14 6.9 20.6v22.4c0 6.3-2.2 15.8-5.1 21.7l-1 2.1c-3.5 6.6-7.9 12.7-13.1 18.2l-6.8 6.8c-5.4 5.2-11.5 9.6-18.2 13.1l-2.1 1c-5.7 2.9-15.5 5.1-21.6 5.1-6.2 0-6.9 2.2-1.1 5.1l2.1 1c5.7 2.9 13.8 8.7 18.2 13.1l-4.7-4.7c4.4 4.4 11.6 4.4 16 0l-4.7 4.7c4.4-4.4 11.6-4.4 16 0L339 226c4.6 4.9 5.7 12.1 2.9 18.2l-1 2.1c-2.9 5.7-10.4 10.2-16.4 10.2-7.5-.3-14.8-2-21.6-5.1l-2.1-1c-6.5-3.6-11.8-8.9-15.4-15.4l-1-2.1c-2.9-5.7-8.7-6.7-13.1-2.3l4.7-4.7c-4.4 4.7-5.2 11.8-1.8 17.3l10.3 15.4c3.4 5.1 2 12.1-3.1 15.5L266 284.4c-5.7 3.4-12.8 3.4-18.6 0L232 274.1c-5.1-3.4-6.5-10.3-3.1-15.5l10.3-15.4c3.4-5.5 2.6-12.6-1.8-17.3l4.7 4.7c-4.4-4.4-10.2-3.6-13.1 2.3l-1 2.1c-2.9 5.7-9.5 12.4-15.4 15.4l-2.1 1c-5.7 2.9-15.5 5.1-21.6 5.1-6.9-.3-13.1-4.2-16.4-10.2l-1-2.1c-2.8-6.1-1.6-13.3 2.9-18.2l-4.7 4.7c4.4-4.4 11.6-4.4 16 0L181 226c4.4 4.4 11.6 4.4 16 0l-4.7 4.7c5.5-5.2 11.6-9.6 18.2-13.1l2.1-1c5.7-2.9 5-5.1-1.1-5.1-7.5-.3-14.8-2-21.6-5.1l-2.1-1c-6.6-3.5-12.7-7.9-18.2-13.1l-6.8-6.8c-5.2-5.4-9.6-11.5-13.1-18.2l-1-2.1c-3.1-6.8-4.9-14.2-5.1-21.7V121c0-6.3 3.1-15.6 6.9-20.6l20.2-26.9c3.8-5.1 8.1-4.3 9.6 1.8l5.8 23.3c2 7.3 4.6 14.4 7.9 21.2l1 2.1c2.9 5.7 8.7 13.8 13.1 18.2l-4.7-4.7c4.4 4.4 4.4 11.6 0 16l4.7-4.7c-4.4 4.4-3.6 10.2 2.3 13.1l2.1 1c5.7 2.9 10.2 0 10.2-6.2v11.3c0-6.2 2.2-15.7 5.1-21.6l1-2.1c2.8-6.1 1.7-13.2-2.8-18.2l-22.7-22.7 4.7 4.7c-4.4-4.4-3.6-10.2 2.3-13.1l2.1-1c6.1-2.8 13.2-1.7 18.2 2.8l22.7 22.7-4.8-4.5zm-18-40.7c-4.4-4.4-3.2-9.5 2.8-11.5l12.4-4.2c3-1 6.9-7.5 10.8-7.5 3.9 0 7.8 6.5 10.8 7.5l12.4 4.2c6 2 7.2 7.1 2.8 11.5l-6.8 6.8c-5.3 4.7-12.1 7.5-19.2 7.9-6.2 0-14.8-3.5-19.2-7.9l-6.8-6.8z\"></path><path fill=\"#0371ba\" d=\"M275 201.3h-37c-4.9 0-8.8-3.9-8.8-8.8v-34.2c0-4.9 3.9-8.8 8.8-8.8h37c4.9 0 8.8 3.9 8.8 8.8v34.2c0 4.8-3.9 8.8-8.8 8.8z\"></path><path fill=\"#39B54A\" d=\"m230.8 212.8 24.4 17.9c.8.6 1.8.6 2.6 0l24.4-17.9c2.1-1.6 1.2-5.4-1.3-5.4h-48.8c-2.5 0-3.4 3.9-1.3 5.4z\"></path><path fill=\"#ffc000\" d=\"M262.8 186.5h-12.5c-3.3 0-5.9-2.6-5.9-5.9V170c0-3.3 2.6-5.9 5.9-5.9h12.5c3.3 0 5.9 2.6 5.9 5.9v10.6c-.1 3.3-2.7 5.9-5.9 5.9z\"></path></svg>",
  "assets/board-native/flags/MF.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 108 72\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>MF</title><path d=\"M0 0h108v72H0z\" fill=\"#003787\"></path><path d=\"M0 0h108L60 48v24H48V48z\" fill=\"#fff\"></path><circle cx=\"54\" cy=\"30\" r=\"8\" fill=\"#f9d90f\"></circle><path d=\"M44 30h20L54 48z\" fill=\"#fff\"></path><path d=\"M54 48 38 33h32z\" fill=\"#cf142b\"></path></svg>",
  "assets/board-native/flags/MG.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>MG</title><path fill=\"#f9423a\" d=\"M0 0h513v171H0z\"></path><path fill=\"#00843d\" d=\"M0 171h513v171H0z\"></path><path fill=\"#FFF\" d=\"M0 0h171v342H0z\"></path></svg>",
  "assets/board-native/flags/MH.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>MH</title><path fill=\"#1E509C\" d=\"M0 0h513v342H0z\"></path><path fill=\"#FFF\" d=\"M513 176.1V81.3L0 342l513-165.9z\"></path><path fill=\"#F18D36\" d=\"M513 0v81.3L0 342 513 0z\"></path><path fill=\"#FFF\" d=\"m126.7 99.3-7.8-54.1-7.7 54.1-20.8-23.7 10.7 31.6-31.5-10.7 23.6 20.8-54.1 7.7 54.1 7.7-23.6 20.8 31.5-10.7-10.7 31.6 20.8-23.7 7.7 54.1 7.8-54.1 20.7 23.7-10.6-31.6 31.5 10.7-23.6-20.8 54-7.7-54-7.7 23.6-20.8-31.5 10.7 10.6-31.6z\"></path></svg>",
  "assets/board-native/flags/MK.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>MK</title><path fill=\"#FFDA44\" d=\"M0 0h513v342H0z\"></path><g fill=\"#D80027\"><path d=\"M384.6 342 256.5 167.3 283.4 342zM133.8 0l122.7 167.3L230.8 0zm95.8 342 26.9-174.7L128.4 342zM0 0v127.8l256.5 39.5L28.4 0zm0 342h18.2l238.3-174.7L0 206.7zm256.5-174.7L513 127.8V0h-28.4zM282.2 0l-25.7 167.3L379.2 0z\"></path><path d=\"M513 342V206.7l-256.5-39.4L494.8 342z\"></path><circle cx=\"256.5\" cy=\"171\" r=\"59.5\"></circle></g><circle fill=\"#FFDA44\" cx=\"256.5\" cy=\"171\" r=\"44.5\"></circle></svg>",
  "assets/board-native/flags/ML.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>ML</title><path fill=\"#14b53a\" d=\"M0 0h171v342H0z\"></path><path fill=\"#fcd116\" d=\"M171 0h171v342H171z\"></path><path fill=\"#ce1126\" d=\"M342 0h171v342H342z\"></path></svg>",
  "assets/board-native/flags/MM.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>MM</title><path fill=\"#fecb00\" d=\"M0 0h513v114H0z\"></path><path fill=\"#34b233\" d=\"M0 114h513v114H0z\"></path><path fill=\"#ea2839\" d=\"M0 228h513v114H0z\"></path><path fill=\"#FFF\" d=\"M384.8 142.2h-98L256.5 49l-30.3 93.2h-98l79.3 57.6-30.3 93.2 79.3-56.9 79.3 56.9-30.3-93.2 79.3-57.6z\"></path></svg>",
  "assets/board-native/flags/MN.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>MN</title><path fill=\"#0066b2\" d=\"M0 0h513v342H0z\"></path><path d=\"M342 0h171v342H342zM0 0h171v342H0z\" fill=\"#da2031\"></path><g fill=\"#ffd300\"><path d=\"M108.3 166.3h14.8v74.2h-14.8zm-59.4 0h14.8v74.2H48.9z\"></path><circle cx=\"86\" cy=\"203.4\" r=\"14.8\"></circle><path d=\"M71.2 225.7h29.7v14.8H71.2zm0-59.4h29.7v14.8H71.2z\"></path><circle cx=\"86\" cy=\"144\" r=\"14.8\"></circle><path d=\"M76.3 123.9h19.5L86 108.3z\"></path></g></svg>",
  "assets/board-native/flags/MO.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>MO</title><path fill=\"#0F7562\" d=\"M0 0h513v342H0z\"></path><path d=\"M286.2 168.5c-4.2 0-8.2.8-11.9 2.2 2-4.5 3.4-9.5 3.4-14.9 0-21.2-21.2-37.1-21.2-37.1s-21.2 15.9-21.2 37.1c0 5.4 1.4 10.4 3.4 14.9-3.7-1.3-7.7-2.2-11.9-2.2-25.6 0-37.1 11.2-37.1 11.2s15.9 31.2 37.1 31.2c12.4 0 23-7.3 29.7-13.3 6.6 6 17.3 13.3 29.7 13.3 21.2 0 37.1-31.2 37.1-31.2s-10.8-11.2-37.1-11.2zm-29.7-96.8 4.4 13.5h14.2l-11.5 8.3L268 107l-11.5-8.3L245 107l4.4-13.5-11.5-8.3h14.2zm-53.9 23.6 8.4 7.6 9.9-5.7-4.7 10.4 8.5 7.6-11.3-1.2-4.6 10.3-2.4-11.1-11.3-1.1 9.9-5.7zm-39.4 39.5 11.1 2.3 5.6-9.8 1.2 11.3 11.1 2.3-10.4 4.6 1.2 11.3-7.6-8.4-10.3 4.6 5.6-9.8zm147.2-39.5-8.4 7.6-9.9-5.7 4.7 10.4-8.5 7.6 11.3-1.2 4.6 10.3 2.4-11.1 11.3-1.1-9.9-5.7zm39.4 39.5-11.1 2.3-5.6-9.8-1.2 11.3-11.1 2.3 10.4 4.6-1.2 11.3 7.6-8.4 10.3 4.6-5.6-9.8z\" fill=\"#FFDA44\"></path><path d=\"M256.5 270.3c16.8 0 32.4-5.6 44.8-15.1h-89.6c12.4 9.4 28 15.1 44.8 15.1zm-68-44.6c2.4 5.4 5.3 10.4 8.9 15.1H238c13.9 0 18.5-7 18.5-7s5.3 7 18.6 7h40.6c3.5-4.6 6.5-9.7 8.9-15.1h-49.5c-15.5 0-18.6-10-18.6-10s-5.3 10-18.5 10h-49.5z\" fill=\"#FFF\"></path></svg>",
  "assets/board-native/flags/MP.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 750 500\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>MP</title><path fill=\"#0071BC\" d=\"M0 0h750v500H0V0z\"></path><g fill=\"#FFF\" stroke=\"#000\" stroke-width=\"1.9\"><circle cx=\"375\" cy=\"245\" r=\"225\" fill=\"#fff\"></circle><circle cx=\"375\" cy=\"245\" r=\"165\" fill=\"#0071BC\"></circle></g><g stroke=\"#000\"><path fill=\"#8C8A8C\" stroke-width=\"1.9\" d=\"M444.7 450c.7 11-7.8 20-18.8 20H323.6c-11 0-19.5-9-19-20l16.7-325c.6-11 10-20 21-20h61.4c11 0 20.5 9 21.2 20l19.8 325z\"></path><path fill=\"#FFF\" stroke-width=\"2\" stroke-linejoin=\"round\" d=\"m373 114 30 93h97l-78 56 29 92-78-56-78 57 30-93-79-57h97l30-92z\"></path></g></svg>",
  "assets/board-native/flags/MQ.svg": "<svg viewBox=\"0 0 900 600\" xmlns=\"http://www.w3.org/2000/svg\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>MQ</title><path fill=\"#231f1e\" d=\"M0 0h900v600H0z\"></path><path fill=\"#00a650\" d=\"M0 0h900v300H0z\"></path><path fill=\"#ef1923\" d=\"m0 0 450 300L0 600z\"></path></svg>",
  "assets/board-native/flags/MR.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>MR</title><path fill=\"#00a95c\" d=\"M0 0h513v342H0z\"></path><path fill=\"#d01c1f\" d=\"M0 0h513v46H0zm0 296h513v46H0z\"></path><path fill=\"gold\" d=\"M256 213.9c-46 0-84.3-32.3-93.8-75.4-1.4 6.6-2.2 13.5-2.2 20.6 0 53 43 96 96 96s96-43 96-96c0-7.1-.8-13.9-2.2-20.6-9.5 43.1-47.8 75.4-93.8 75.4z\"></path><path fill=\"gold\" d=\"m256 87 8.9 27.5h29l-23.4 17 8.9 27.5-23.4-17-23.4 17 8.9-27.5-23.4-17h29z\"></path></svg>",
  "assets/board-native/flags/MS.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>MS</title><path fill=\"#012169\" d=\"M0 0h513v342H0z\"></path><path fill=\"#00A2B8\" stroke=\"#FFF\" stroke-width=\"3\" d=\"M318.2 106.7v106.5c0 51.9 67.8 67.8 67.8 67.8s67.8-15.9 67.8-67.8V106.7H318.2z\"></path><path fill=\"#A35023\" d=\"M319.7 212.7c0 50.8 66.3 66.3 66.3 66.3s66.3-15.6 66.3-66.3H319.7z\"></path><path fill=\"#510\" d=\"M415.1 155.1h-19.4v-19.4h-19.4v19.4H357v19.4h19.3v58.1h19.4v-58.1h19.4z\"></path><path fill=\"#012169\" d=\"M0 0h256.5v171H0z\"></path><g fill=\"#FFF\"><path d=\"M256.5 0v30.6l-45.3 25.2h45.3v59.4h-59.2l59.2 32.9V171h-26.7l-73.7-40.9V171h-55.7v-48.7L12.8 171H0v-30.6l45.3-25.2H0V55.8h59.2L0 22.9V0h26.7l73.7 40.9V0h55.7v48.7L243.7 0z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-55.7-59.4L0 0v15.8l72 40z\"></path></g><g fill=\"#D80027\"><path d=\"M144.3 0h-32.1v69.5H0v32h112.2V171h32.1v-69.5h112.2v-32H144.3z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-84.1 0-72 40V171l100.4-55.8zm28.4-59.4L0 0v15.8l72 40zm84.1 0 72-40V0L156.1 55.8z\"></path></g></svg>",
  "assets/board-native/flags/MT.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>MT</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#cf142b\" d=\"M256 0h256.5v342H256z\"></path><path stroke=\"#cf142b\" stroke-width=\"10\" d=\"M101.2 68.2V33H66v35.2H30.8v35.2H66v35.2h35.2v-35.2h35.2V68.2z\"></path><path fill=\"#fff\" stroke=\"#acacac\" stroke-width=\"5\" d=\"M101.2 68.2V33H66v35.2H30.8v35.2H66v35.2h35.2v-35.2h35.2V68.2z\"></path><circle cx=\"85\" cy=\"85\" r=\"26\" fill=\"none\" stroke=\"#acacac\" stroke-width=\"5\"></circle><circle cx=\"85\" cy=\"85\" r=\"18\" fill=\"#dedede\" stroke=\"#acacac\" stroke-width=\"5\"></circle></svg>",
  "assets/board-native/flags/MU.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>MU</title><path fill=\"#d01c1f\" d=\"M0 0h513v85.5H0z\"></path><path fill=\"#2d3359\" d=\"M0 85.5h513V171H0z\"></path><path fill=\"#f7b718\" d=\"M0 171h513v85.5H0z\"></path><path fill=\"#008658\" d=\"M0 256.5h513V342H0z\"></path></svg>",
  "assets/board-native/flags/MV.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 720 480\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>MV</title><path fill=\"#007E3A\" stroke=\"#D21034\" stroke-width=\"120\" d=\"M60 60h600v360H60z\"></path><circle fill=\"#FFF\" cx=\"390\" cy=\"240\" r=\"80\"></circle><circle fill=\"#007E3A\" cx=\"420\" cy=\"240\" r=\"80\"></circle></svg>",
  "assets/board-native/flags/MW.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>MW</title><path d=\"M0 0h513v114H0z\"></path><path fill=\"#ce1126\" d=\"M0 114h513v114H0z\"></path><path fill=\"#339e35\" d=\"M0 228h513v114H0z\"></path><circle fill=\"#ce1126\" cx=\"256.5\" cy=\"125\" r=\"95\"></circle><path d=\"M0 100h513v14H0z\"></path></svg>",
  "assets/board-native/flags/MX.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>MX</title><path fill=\"#dc2339\" d=\"M342 0H0v341.3h513V0z\"></path><path fill=\"#11865d\" d=\"M0 0h171v342H0z\"></path><path fill=\"#FFF\" d=\"M171 0h171v342H171z\"></path><path fill=\"#8C9157\" d=\"M195.8 171.2c0 21.6 11.5 41.7 30.3 52.5 5.8 3.4 13.2 1.4 16.6-4.4 3.4-5.8 1.4-13.2-4.4-16.6-11.3-6.5-18.2-18.5-18.2-31.5 0-6.7-5.4-12.1-12.1-12.1-6.7 0-12.2 5.4-12.2 12.1zm93.4 51.1c17.5-11.1 28-30.4 28-51.1 0-6.7-5.4-12.1-12.1-12.1s-12.1 5.4-12.1 12.1c0 12.4-6.3 24-16.8 30.7-5.7 3.5-7.5 10.9-4.1 16.7s10.9 7.5 16.7 4.1c0-.2.2-.3.4-.4z\"></path><ellipse fill=\"#C59262\" cx=\"256.5\" cy=\"159.1\" rx=\"24.3\" ry=\"36.4\"></ellipse></svg>",
  "assets/board-native/flags/MY.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>MY</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 0h513v24.4H0zm0 48.9h513v24.4H0zm0 48.8h513v24.4H0zm0 48.9h513V171H0zm0 48.8h513v24.4H0zm0 48.9h513v24.4H0zm0 48.8h513v24.4H0z\" fill=\"#c00\"></path><path fill=\"#006\" d=\"M0 0h256.5v195.4H0z\"></path><path d=\"M153.3 42.1C122.6 30.7 88.5 46.3 77.1 77s4.2 64.8 34.9 76.2c13.3 5 28 5 41.4 0-30.7 24.5-75.4 19.6-100-11.1s-19.6-75.4 11.1-100c26-20.7 62.9-20.7 88.8 0zm26.7 75-20.6 23.3 5.4-30.6-31-1.6 27.3-14.9L143 68l28.6 12 8.4-29.9 8.4 29.9L217 68l-18 25.4 27.3 14.9-31 1.6 5.4 30.6-20.7-23.4z\" fill=\"#fc0\"></path></svg>",
  "assets/board-native/flags/MZ.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>MZ</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#006d66\" d=\"M0 0h513v104H0z\"></path><path d=\"M0 119h513v104H0z\"></path><path fill=\"#f4d900\" d=\"M0 238h513v104H0z\"></path><path fill=\"#cb0f31\" d=\"M256 171 0 342V0z\"></path><path fill=\"#f4d900\" d=\"m83.5 109.8 15.1 46.5h48.9L107.9 185l15.1 46.5-39.5-28.7-39.6 28.7L59 185l-39.5-28.7h48.9z\"></path></svg>",
  "assets/board-native/flags/NA.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>NA</title><path fill=\"#009a44\" d=\"M0 0h513v342H0z\"></path><path fill=\"#002f6c\" d=\"M0 342V0h513\"></path><path fill=\"#FFF\" d=\"M513 67V0H412.5L0 275v67h100.5z\"></path><path fill=\"#c8102e\" d=\"M513 0v40.2L60.3 342H0v-40.2L452.7 0z\"></path><path fill=\"#ffcd00\" d=\"m188.1 104.1-22.8 10.7 12.2 22.1-24.8-4.8-3.1 25-17.3-18.4-17.2 18.4-3.1-25-24.8 4.8 12.2-22.1-22.8-10.7 22.8-10.7-12.2-22.1L112 76l3.1-25 17.2 18.4L149.6 51l3.1 25 24.8-4.7-12.2 22.1z\"></path></svg>",
  "assets/board-native/flags/NC.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>NC</title><path fill=\"#009543\" d=\"M0 234.8h513V342H0V234.8z\"></path><path fill=\"#ED4135\" d=\"M0 105.8h513v129.3H0V105.8z\"></path><path fill=\"#0035AD\" d=\"M0 0h513v106.8H0V0z\"></path><circle fill=\"#FAE600\" stroke=\"#000\" stroke-width=\"5.3\" cx=\"192.4\" cy=\"171\" r=\"126.1\"></circle><path d=\"m246.8 284.1-25.5 9.6-28.9 3.4-30.3-1.9-28.8-12.4s22.9-23.5 32.6-26.9c6.9-2.4 18-3 18-3V97.8l-.2-52.9h13.5l-.4 54.1v153.7s12.3 1 17.7 3.3c9 3.8 32.3 28.1 32.3 28.1z\"></path><path d=\"m168.3 80.8 39.5-19.7 5.1 10.3-39.5 19.7-5.1-10.3z\"></path><ellipse cx=\"190.6\" cy=\"224.8\" rx=\"13.5\" ry=\"21.2\"></ellipse><circle cx=\"190.3\" cy=\"114.9\" r=\"16.8\"></circle><ellipse cx=\"191.1\" cy=\"169.2\" rx=\"16\" ry=\"9.7\"></ellipse><path d=\"M171.4 146.7h37.7v8h-37.7zm0 36h37.7v8h-37.7z\"></path><g fill=\"none\" stroke=\"#000\" stroke-width=\"10\" stroke-miterlimit=\"10\"><path d=\"M163.4 112.2s.8 26.8 27.3 26.8 26.5-26.8 26.5-26.8\"></path><path class=\"prefix__st4\" d=\"M163.4 224.8s1.9-26.6 27.3-26.6 26.5 26.6 26.5 26.6\"></path></g></svg>",
  "assets/board-native/flags/NE.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>NE</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#e05206\" d=\"M0 0h513v114H0z\"></path><path fill=\"#0db02b\" d=\"M0 228h513v114H0z\"></path><circle fill=\"#e05206\" cx=\"256.5\" cy=\"171\" r=\"32\"></circle></svg>",
  "assets/board-native/flags/NF.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>NF</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 0h171v342H0zm342 0h171v342H342zm-38 227L256 75l-48 152h41v40h14v-40z\" fill=\"#007934\"></path></svg>",
  "assets/board-native/flags/NG.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>NG</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 0h171v342H0zm342 0h171v342H342z\" fill=\"#008751\"></path></svg>",
  "assets/board-native/flags/NI.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>NI</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 0h513v114H0zm0 228h513v114H0z\" fill=\"#0067c6\"></path><circle fill=\"none\" stroke=\"#FFDA44\" stroke-width=\"5\" cx=\"256.5\" cy=\"171\" r=\"50\"></circle><path fill=\"#0a47a5\" d=\"M285.7 176.7h-58.4l-9.8 16.9h78z\"></path><path fill=\"#6fd8f3\" d=\"m256.5 126.1-29.2 50.6h58.4z\"></path><path fill=\"#97c924\" d=\"M221.7 186.4h69.6l-8-13.9h-53.6z\"></path><circle fill=\"red\" cx=\"256.5\" cy=\"161\" r=\"5\"></circle></svg>",
  "assets/board-native/flags/NL.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>NL</title><path fill=\"#FFF\" d=\"M0 114h513v114H0z\"></path><path fill=\"#cd1f2a\" d=\"M0 0h513v114H0z\"></path><path fill=\"#1d4185\" d=\"M0 228h513v114H0z\"></path></svg>",
  "assets/board-native/flags/NO.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>NO</title><path fill=\"#D80027\" d=\"M0 0h513v342H0z\"></path><path fill=\"#FFF\" d=\"M513 211H202.6v131h-79.9V211H0v-80h122.7V0h79.9v131H513v61.4z\"></path><path fill=\"#1f3f7a\" d=\"M513 149.6v42.8H184V342h-42.7V192.4H0v-42.8h141.3V0H184v149.6z\"></path></svg>",
  "assets/board-native/flags/NP.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>NP</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#0052B4\" d=\"M0 342V-.2L281.1 175H87.8l184 167z\"></path><path fill=\"#D80027\" d=\"M243.4 164.8 9.2 19.3v313.5h235.2l-184.1-168z\"></path><path fill=\"#FFF\" d=\"m62.4 204.1 7.9 16.2 14.9-10.1-1.3 18 18-1.3-10.1 14.9 16.2 7.9-16.2 7.8 10.1 15-18-1.3 1.3 17.9L70.3 279l-7.9 16.2-7.8-16.2-14.9 10.1 1.3-17.9-18 1.3 10.1-15-16.2-7.8 16.2-7.9L23 226.9l18 1.3-1.3-18 14.9 10.1zm-5.3-103.7 5.3 7.7 5.4-7.7 2 9.1 7.9-5-1.7 9.2 9.3-1.7-5.1 7.9 9.2 2-7.8 5.4 7.8 5.3-9.2 2 5.1 7.9-9.3-1.7 1.7 9.3-7.9-5.1-2 9.2-5.4-7.7-5.3 7.7-2-9.2-7.9 5.1 1.7-9.3-9.3 1.7 5.1-7.9-9.2-2 7.7-5.3-7.7-5.4 9.2-2-5.1-7.9 9.3 1.7-1.7-9.2 7.9 5z\"></path><path fill=\"#FFF\" d=\"M18.5 108.7s4.8 27.7 44 27.7 44-27.7 44-27.7c0 9.4-6 46.5-44 46.5s-44-38.2-44-46.5z\"></path></svg>",
  "assets/board-native/flags/NR.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>NR</title><path fill=\"#012169\" d=\"M0 0h513v342H0z\"></path><path fill=\"#ffc72c\" d=\"M0 155h513v32H0z\"></path><path fill=\"#FFF\" d=\"m164.2 189 7.9 27.7 20.7-20-7 27.9 28-7-20.1 20.7 27.8 7.9-27.8 7.9 20.1 20.7-28-7 7 28-20.7-20.1-7.9 27.8-7.9-27.8-20.7 20.1 7-28-27.9 7 20-20.7-27.7-7.9 27.7-7.9-20-20.7 27.9 7-7-27.9 20.7 20z\"></path></svg>",
  "assets/board-native/flags/NU.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>NU</title><path fill=\"#fedd00\" d=\"M0 0h513v342H0z\"></path><path fill=\"#012169\" d=\"M0 0h256.5v171H0z\"></path><g fill=\"#FFF\"><path d=\"M256.5 0v30.6l-45.3 25.2h45.3v59.4h-59.2l59.2 32.9V171h-26.7l-73.7-40.9V171h-55.7v-48.7L12.8 171H0v-30.6l45.3-25.2H0V55.8h59.2L0 22.9V0h26.7l73.7 40.9V0h55.7v48.7L243.7 0z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-55.7-59.4L0 0v15.8l72 40z\"></path></g><g fill=\"#D80027\"><path d=\"M144.3 0h-32.1v69.5H0v32h112.2V171h32.1v-69.5h112.2v-32H144.3z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-84.1 0-72 40V171l100.4-55.8zm28.4-59.4L0 0v15.8l72 40zm84.1 0 72-40V0L156.1 55.8z\"></path></g><circle fill=\"#012169\" cx=\"126.8\" cy=\"85.7\" r=\"29.9\"></circle><path d=\"m128.3 128.6 3.5 10.9h11.5l-9.3 6.7 3.5 10.9-9.2-6.7-9.3 6.7 3.5-10.9-9.2-6.7h11.4zm-.1-115.4 3.6 10.9h11.4l-9.2 6.7 3.5 10.9-9.3-6.7-9.2 6.7 3.5-10.9-9.3-6.7h11.5zm76.4 58.1 3.5 10.9h11.5l-9.3 6.7 3.5 10.9-9.2-6.7-9.3 6.7 3.5-10.9-9.2-6.7H201zm-151.8.1 3.6 10.9h11.4l-9.3 6.8 3.6 10.8-9.3-6.7-9.3 6.7 3.6-10.8-9.3-6.8h11.5zm74-15.6 6.7 20.7h21.8l-17.7 12.8 6.8 20.6-17.6-12.7-17.7 12.7 6.8-20.6-17.6-12.8H120z\" fill=\"#fedd00\"></path></svg>",
  "assets/board-native/flags/NZ.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>NZ</title><path fill=\"#012169\" d=\"M0 0h513v342H0z\"></path><path d=\"m448.9 107.7 4.2 13.1h13.8l-11.1 8.1L460 142l-11.1-8.1-11.1 8.1 4.2-13.1-11.1-8.1h13.7zm-64.2 145.9 5.1 15.6h16.4l-13.2 9.7 5 15.6-13.3-9.7-13.2 9.7 5-15.6-13.3-9.7h16.5zm.1-210.2 4.7 14.6h15.3l-12.4 8.9 4.7 14.6-12.3-9-12.4 9 4.7-14.6-12.3-8.9H380zm-64.2 86 4.7 14.5h15.3l-12.3 9 4.7 14.5-12.4-8.9-12.3 8.9 4.7-14.5-12.4-9h15.3z\" fill=\"#D80027\" stroke=\"#FFF\" stroke-width=\"2\" stroke-miterlimit=\"10\"></path><path fill=\"#012169\" d=\"M0 0h256.5v171H0z\"></path><g fill=\"#FFF\"><path d=\"M256.5 0v30.6l-45.3 25.2h45.3v59.4h-59.2l59.2 32.9V171h-26.7l-73.7-40.9V171h-55.7v-48.7L12.8 171H0v-30.6l45.3-25.2H0V55.8h59.2L0 22.9V0h26.7l73.7 40.9V0h55.7v48.7L243.7 0z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-55.7-59.4L0 0v15.8l72 40z\"></path></g><g fill=\"#D80027\"><path d=\"M144.3 0h-32.1v69.5H0v32h112.2V171h32.1v-69.5h112.2v-32H144.3z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-84.1 0-72 40V171l100.4-55.8zm28.4-59.4L0 0v15.8l72 40zm84.1 0 72-40V0L156.1 55.8z\"></path></g></svg>",
  "assets/board-native/flags/OM.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>OM</title><path fill=\"#D80027\" d=\"M0 0h513v342H0z\"></path><path fill=\"#FFF\" d=\"M138 0h377v114H138z\"></path><path fill=\"#4A7C3A\" d=\"M138 230h377v114H138z\"></path><g fill=\"none\" stroke=\"#FFF\" stroke-width=\"10\" stroke-miterlimit=\"2\"><path d=\"M40.3 35.2s37.1 48 50.8 54.5c13.7 6.5 17.1 5.7 17.1 5.7\"></path><path d=\"M100 35.2S62.9 80.6 53.3 87.6c-9.6 7-18.7 7.8-18.7 7.8m17.1-30.1h37.9M70.7 35.2v30.1\"></path></g></svg>",
  "assets/board-native/flags/PA.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>PA</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#da121a\" d=\"M256.5 0H513v171H256.5z\"></path><path fill=\"#072357\" d=\"M0 171h256.5v171H0zM128 37.9l11.8 36.4h38.3l-31 22.4 11.9 36.4-31-22.5-31 22.5 11.9-36.4-31-22.4h38.3z\"></path><path fill=\"#da121a\" d=\"m384 208.9 11.8 36.4h38.3l-31 22.4 11.9 36.4-31-22.5-31 22.5 11.9-36.4-31-22.4h38.3z\"></path></svg>",
  "assets/board-native/flags/PE.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>PE</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 0h171v342H0zm342 0h171v342H342z\" fill=\"#D80027\"></path><path fill=\"#00A854\" d=\"M224.3 119c4.3 7.6-17.1 71.9-6.5 87.8s21.9 22.4 38.2 22.4c16.3 0 30.7-6.8 39.6-24.7s-14.2-76.3-6.8-85.4c7.4-9.1 29.3 8.5 35.5 35.2 6.2 26.7-8.4 60.2-20.7 70-12.3 9.7-20.3 9.7-47.6 9.7s-32.4-1.4-45-10.7c-12.5-9.4-28.9-35.8-22.7-67.3 6.2-31.7 31.7-44.6 36-37z\"></path><path fill=\"#D91023\" stroke=\"#E7CA00\" stroke-width=\"2\" d=\"M272.6 218.9H240c-7.5 0-13.6-6.1-13.6-13.6v-45c0-7.5 6.1-13.6 13.6-13.6h32.6c7.5 0 13.6 6.1 13.6 13.6v45c.1 7.5-6 13.6-13.6 13.6z\"></path><ellipse fill=\"#E7CA00\" cx=\"256.4\" cy=\"200.9\" rx=\"25\" ry=\"13.2\"></ellipse><path fill=\"#FFF\" d=\"M256.4 147.6v35.1h28.9c0-38.3 3.9-35.1-28.9-35.1z\"></path><path fill=\"#007EA8\" d=\"M256.4 147.6v35.1h-28.9c0-37.9-3.7-35.1 28.9-35.1z\"></path><path fill=\"#947245\" d=\"M270.1 158.1h1.6v21.5h-1.6z\"></path><circle fill=\"#D18219\" stroke=\"#FFF\" cx=\"241.8\" cy=\"165.2\" r=\"8.1\"></circle><ellipse fill=\"none\" stroke=\"#00A854\" stroke-width=\"6\" cx=\"256.4\" cy=\"122.2\" rx=\"20.5\" ry=\"16.5\"></ellipse><ellipse fill=\"none\" stroke=\"#E7CA00\" stroke-width=\"3\" cx=\"256.4\" cy=\"122.2\" rx=\"20.5\" ry=\"16.5\"></ellipse><circle fill=\"#E7CA00\" cx=\"270.9\" cy=\"163.1\" r=\"8.9\"></circle></svg>",
  "assets/board-native/flags/PF.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>PF</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 0h513v85H0zm0 257h513v85H0z\" fill=\"#D80027\"></path><path fill=\"#1481DB\" d=\"M329.5 171c0 40.3-32.7 73-73 73s-73-32.7-73-73\"></path><path fill=\"#FFAB50\" d=\"M256.5 98c-40.3 0-73 32.7-73 73h146c0-40.3-32.7-73-73-73z\"></path><g fill=\"#FFF\"><path d=\"M181.9 169.3h150.5v4.5H181.9z\"></path><path d=\"M222.4 162.9h66.5v10.9h-66.5z\"></path></g><path d=\"M212.8 131.1H223s-1.6 55.5.1 57.4c11.9 13.5 25.3 0 25.3 0s-2.7 18.9-17.8 18.9-17.8-18.7-17.8-18.7v-57.6zm85.6 0h-10.2s1.6 55.5-.1 57.4c-11.9 13.5-25.3 0-25.3 0s2.7 18.9 17.8 18.9c15.1 0 17.8-18.7 17.8-18.7v-57.6zM242.6 156l25.9 6.9v-36.4s-14-3.8-14-16.8 14-9.6 14-9.6-25.9-4.6-25.9 8.1V156z\" fill=\"#D80027\" stroke=\"#630810\" stroke-width=\"2\"></path></svg>",
  "assets/board-native/flags/PG.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>PG</title><path d=\"M0 0h513v342H0z\"></path><path fill=\"#C8102E\" d=\"M0 0h513v342\"></path><path d=\"m153.7 225 2.7 8.5h9l-7.2 5.2 2.7 8.6-7.2-5.3-7.3 5.3 2.8-8.6-7.3-5.2h9zm-25.3-120 5.2 16h16.8l-13.6 9.9 5.2 16-13.6-9.9-13.6 9.9 5.2-16-13.6-9.9h16.8zm0 160.3 5.2 16h16.8l-13.6 9.9 5.2 16-13.6-9.9-13.6 9.9 5.2-16-13.6-9.9h16.8zm50.7-96.1 5.2 16h16.8l-13.6 9.9 5.2 16-13.6-9.9-13.6 9.9 5.2-16-13.6-9.9h16.8zm-107.3 4.1 5.2 16h16.8l-13.6 9.9 5.2 15.9-13.6-9.8-13.6 9.8 5.2-15.9-13.6-9.9h16.8z\" fill=\"#FFF\"></path><g fill=\"#FFCD00\"><path d=\"M288 79.9s33 13.8 30 19.7c-2.9 5.9-17.4-7.1-30-3.5-12.7 3.5-28.6 32.4-28.6 32.4s18.6 2.7 34.2 1.5c15.6-1.2 19.7-7.4 19.7-7.4s.7 15.3 12.7 24.3c18.2 13.6 56.2 22.3 56.2 22.3s.6-6.5-2.7-20.7-8-21.4-8-21.4 55.7 38.3 51.2 59.3-30.1 19.6-30.1 19.6 28.4 12.5 37.4-13.5c12.4-35.6-42.4-65.2-42.4-65.2s6.5 3.1 17.1 4.6 20.3-.3 20.3-.3-13.8-43.6-29.2-52.1c-15.3-8.5-37.1-.9-37.1-.9s9.1-5.9 10-15.9c.9-10-3.5-24.1-3.5-24.1-50.1 21.2-21.2 41.2-33 49.2-2 1.4-9.5-9.9-18.8-8.2-11.5 1.8-25.4.3-25.4.3z\"></path><path d=\"M404.7 131.8s15.3 17.7 8.2 35.9c-7.1 18.3-37.7 13.5-37.7 13.5s24.7 13.9 40.6-5.3-2.4-43.6-2.4-43.6l-8.7-.5z\"></path></g></svg>",
  "assets/board-native/flags/PH.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>PH</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#0038A8\" d=\"M513 0v171H256.5L0 0z\"></path><path fill=\"#CE1126\" d=\"M513 171v171H0l256.5-171z\"></path><g fill=\"#FCD116\"><path d=\"m22.1 33.8 8.5 11.9 13.8-4.5-8.6 11.7 8.5 11.8-13.8-4.6-8.6 11.7V57.2L8.2 52.7 22 48.4zm0 236.4 8.5 11.8 13.8-4.4-8.6 11.7 8.5 11.8-13.8-4.6-8.6 11.7v-14.6l-13.7-4.5 13.8-4.3zM210.5 152l-8.5 11.8-13.8-4.4 8.6 11.7-8.4 11.8 13.7-4.6 8.6 11.7v-14.6l13.7-4.5-13.8-4.3z\"></path><circle cx=\"95\" cy=\"171\" r=\"32\"></circle><path d=\"m95 171 11.2 56.5-3.4 3.4-3.7 3.5-4.2 4.2-4.2-4.2-3.7-3.5-3.4-3.4L95 171zm0 0-11.2-56.5 3.4-3.4 3.7-3.5 4.2-4.2 4.2 4.2 3.7 3.5 3.4 3.4L95 171zm0 0 56.5-11.2 3.4 3.4 3.5 3.7 4.2 4.2-4.2 4.2-3.5 3.7-3.4 3.4L95 171zm0 0-56.5 11.2-3.4-3.4-3.5-3.7-4.2-4.2 4.2-4.2 3.5-3.7 3.4-3.4L95 171zm0 0 32-47.9h4.8l5.1.2h5.9v5.9l.2 5.1v4.8L95 171zm0 0-32 47.9h-4.8l-5.1-.2h-5.9v-5.9l-.2-5.1v-4.8L95 171zm0 0 47.9 32v4.8l-.2 5.1v5.9h-5.9l-5.1.2h-4.8L95 171zm0 0-47.9-32v-4.8l.2-5.1v-5.9h5.9l5.1-.2h4.8L95 171z\"></path></g></svg>",
  "assets/board-native/flags/PK.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 900 600\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>PK</title><path fill=\"#FFF\" d=\"M0 0h900v600H0z\"></path><path fill=\"#01411C\" d=\"M225 0h675v600H225z\"></path><path fill=\"#FFF\" d=\"M562.5 120c99.4 0 180 80.6 180 180s-80.6 180-180 180-180-80.6-180-180 80.6-180 180-180z\"></path><path fill=\"#01411C\" d=\"M498.9 135.8c68.1-60.5 172.4-54.4 232.9 13.7s54.4 172.4-13.7 232.9-172.4 54.4-232.9-13.7-54.4-172.4 13.7-232.9z\"></path><path fill=\"#FFF\" d=\"m628.1 165.3 75.8 85.3-111.5-24.4L697 180.4l-57.7 98.5-11.2-113.6z\"></path></svg>",
  "assets/board-native/flags/PL.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>PL</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#dc143c\" d=\"M0 171h513v171H0z\"></path></svg>",
  "assets/board-native/flags/PM.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>PM</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#00318A\" d=\"M0 0h171v342H0z\"></path><path fill=\"#D80027\" d=\"M342 0h171v342H342z\"></path></svg>",
  "assets/board-native/flags/PN.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>PN</title><path fill=\"#012169\" d=\"M0 0h513v342H0z\"></path><g stroke=\"#000\"><path fill=\"#96877d\" d=\"m400.7 134.5-16.7 5.6-16.7-5.6-5.6-13.9 5.6-13.9h33.4l-5.6 13.9z\"></path><path fill=\"#006ec7\" d=\"M345 134.5v61.2c0 29.8 39 39 39 39s39-9.1 39-39v-61.2h-78z\"></path><path fill=\"#337321\" d=\"M348.6 210.2c9.6 18.4 35.4 24.5 35.4 24.5s25.9-6.1 35.4-24.5l-35.4-59-35.4 59z\"></path><path fill=\"#f7e017\" d=\"m423 195.1-39-60.6-39 60.6v.6c0 5.5 1.3 10.3 3.5 14.5l35.4-55.1 35.4 55.1c2.2-4.2 3.5-9 3.5-14.5v-.6z\"></path></g><path fill=\"#012169\" d=\"M0 0h256.5v171H0z\"></path><g fill=\"#FFF\"><path d=\"M256.5 0v30.6l-45.3 25.2h45.3v59.4h-59.2l59.2 32.9V171h-26.7l-73.7-40.9V171h-55.7v-48.7L12.8 171H0v-30.6l45.3-25.2H0V55.8h59.2L0 22.9V0h26.7l73.7 40.9V0h55.7v48.7L243.7 0z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-55.7-59.4L0 0v15.8l72 40z\"></path></g><g fill=\"#D80027\"><path d=\"M144.3 0h-32.1v69.5H0v32h112.2V171h32.1v-69.5h112.2v-32H144.3z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-84.1 0-72 40V171l100.4-55.8zm28.4-59.4L0 0v15.8l72 40zm84.1 0 72-40V0L156.1 55.8z\"></path></g><path fill=\"#f7e017\" d=\"M375 189.5h18.3l.1 5.5h-5.8v25.2l12.3-6.1 3 5-18.9 9.7-18.4-9.8 2.9-5.1 12.6 6.3V195H375z\"></path></svg>",
  "assets/board-native/flags/PR.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>PR</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 0h513v68.4H0zm0 136.8h513v68.4H0zm0 136.8h513V342H0z\" fill=\"#E00\"></path><path fill=\"#04F\" d=\"M256.5 171 0 342V0z\"></path><path fill=\"#FFF\" d=\"m84 110.1 15.1 46.5H148l-39.6 28.8 15.1 46.5L84 203.1l-39.6 28.8 15.1-46.5L20 156.6h48.9z\"></path></svg>",
  "assets/board-native/flags/PS.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>PS</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 0h513v114H0z\"></path><path fill=\"#007A3D\" d=\"M0 228h513v114H0z\"></path><path fill=\"#CE1126\" d=\"M256.5 171 0 342V0z\"></path></svg>",
  "assets/board-native/flags/PT.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>PT</title><path fill=\"red\" d=\"M0 0h513v342H0z\"></path><path fill=\"#060\" d=\"M197 0v342H0V0z\"></path><circle fill=\"#FF0\" cx=\"197.1\" cy=\"171\" r=\"64\"></circle><path fill=\"red\" d=\"M161.1 139v40c0 19.9 16.1 36 36 36s36-16.1 36-36v-40h-72z\"></path><path fill=\"#FFF\" d=\"M197.1 191c-6.6 0-12-5.4-12-12v-16h24v16c0 6.6-5.3 12-12 12z\"></path></svg>",
  "assets/board-native/flags/PW.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>PW</title><path fill=\"#09f\" d=\"M0 0h513v342H0z\"></path><circle fill=\"#ff0\" cx=\"220\" cy=\"171\" r=\"74\"></circle></svg>",
  "assets/board-native/flags/PY.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>PY</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#D52B1E\" d=\"M0 0h513v114H0z\"></path><path fill=\"#0038A8\" d=\"M0 228h513v114H0z\"></path><path fill=\"#009B3A\" d=\"m279.7 148-8.7 8.7c3.7 3.7 6 8.8 6 14.5 0 11.3-9.2 20.5-20.5 20.5s-20.5-9.2-20.5-20.5c0-5.7 2.3-10.8 6-14.5l-8.7-8.7c-5.9 5.9-9.6 14.1-9.6 23.2 0 18.1 14.7 32.8 32.8 32.8s32.8-14.7 32.8-32.8c0-9.1-3.7-17.3-9.6-23.2z\"></path><path fill=\"#FEDF00\" stroke=\"#000\" d=\"m256.5 157.2 3.2 9.9h10.5l-8.5 6.2 3.2 9.9-8.4-6.2-8.4 6.2 3.2-9.9-8.5-6.2h10.5z\"></path><circle fill=\"none\" stroke=\"#000\" stroke-width=\"2\" cx=\"256.5\" cy=\"171\" r=\"45\"></circle></svg>",
  "assets/board-native/flags/QA.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>QA</title><path fill=\"#8a1538\" d=\"M0 0h513v342H0z\"></path><path fill=\"#FFF\" d=\"M0 0v342h150.3l37.7-19.6-37.7-18.9 37.7-19-37.7-18.9 37.7-19-37.7-19 37.7-18.9-37.7-19 37.7-19-37.7-18.9 37.7-19-37.7-18.9 37.7-19-37.7-19L188 57l-37.7-19L188 19.1 150.3 0z\"></path></svg>",
  "assets/board-native/flags/RE.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>RE</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path fill=\"#00318A\" d=\"M0 0h171v342H0z\"></path><path fill=\"#D80027\" d=\"M342 0h171v342H342z\"></path></svg>",
  "assets/board-native/flags/RO.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>RO</title><path fill=\"#002b7f\" d=\"M0 0h171v342H0z\"></path><path fill=\"#fcd116\" d=\"M171 0h171v342H171z\"></path><path fill=\"#ce1126\" d=\"M342 0h171v342H342z\"></path></svg>",
  "assets/board-native/flags/RS.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>RS</title><path fill=\"#c6363c\" d=\"M0 0h513v114H0z\"></path><path fill=\"#0c4076\" d=\"M0 114h513v114H0z\"></path><path fill=\"#FFF\" d=\"M0 228h513v114H0z\"></path><path fill=\"#c6363c\" d=\"M120 96.8v85.1c0 48.4 63.3 63.3 63.3 63.3s63.3-14.8 63.3-63.3V96.8H120z\"></path><path d=\"M146.1 111.6h74.2V82l-14.8 7.4-22.3-22.3L161 89.4 146.1 82zm85.6 82.2-48.3-48.2-48.2 48.2 15.7 15.7 32.5-32.5 32.5 32.5z\" fill=\"#edb92e\"></path><path fill=\"#FFF\" d=\"M231.7 148.7h-22.5c1.3-2.2 2-4.7 2-7.4 0-8.2-6.6-14.8-14.8-14.8-5.7 0-10.6 3.2-13.1 7.8-2.5-4.7-7.4-7.8-13.1-7.8-8.2 0-14.8 6.6-14.8 14.8 0 2.7.7 5.2 2 7.4h-22.1c0 8.2 7.1 14.8 15.3 14.8h-.6c0 8.2 6.6 14.8 14.8 14.8 0 7.3 5.2 13.3 12.1 14.6l-11.7 26.4c5.6 2.3 11.7 3.5 18.1 3.5s12.5-1.3 18.1-3.5L189.9 193c6.9-1.3 12.1-7.3 12.1-14.6 8.2 0 14.8-6.6 14.8-14.8h-.5c8.2 0 15.4-6.7 15.4-14.9z\"></path></svg>",
  "assets/board-native/flags/RU.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>RU</title><path fill=\"#FFF\" d=\"M0 0h513v114H0z\"></path><path fill=\"#0039a6\" d=\"M0 114h513v114H0z\"></path><path fill=\"#d52b1e\" d=\"M0 228h513v114H0z\"></path></svg>",
  "assets/board-native/flags/RW.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>RW</title><path fill=\"#00A5E0\" d=\"M0 0h513v171H0z\"></path><path fill=\"#F9D202\" d=\"M0 171h513v85.5H0z\"></path><path fill=\"#1E5F3D\" d=\"M0 256.5h513V342H0z\"></path><path fill=\"#F9D202\" d=\"m420.6 36.1 2.3 35.9 11.6-34.1-7 35.3 19.9-29.9-15.8 32.2 27-23.7-23.7 27L467.1 63l-29.9 19.9 35.3-7-34.1 11.6 35.9 2.3-35.9 2.3 34.1 11.6-35.3-7 29.9 19.9-32.2-15.8 23.7 27-27-23.7 15.8 32.2-19.9-29.9 7 35.3-11.6-34.1-2.3 35.9-2.3-35.9-11.6 34.1 7-35.3-19.9 29.9 15.8-32.2-27 23.7 23.7-27-32.2 15.8L404 96.7l-35.3 7 34.1-11.6-35.9-2.3 35.9-2.3-34.1-11.6 35.3 7L374.1 63l32.2 15.8-23.7-27 27 23.7-15.8-32.2 19.9 29.9-7-35.3L418.3 72z\"></path><circle fill=\"#F9D202\" stroke=\"#00A5E0\" stroke-width=\"2\" cx=\"420.6\" cy=\"89.8\" r=\"15.9\"></circle></svg>",
  "assets/board-native/flags/SA.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>SA</title><path d=\"M0 0h513v342H0z\" fill=\"#fff\"></path><g fill=\"#055e1c\"><path d=\"M0 0v342h513V0zm218 76q1 2-2 5-3 2-1 4 3 4 0 6-2 1-5-1-6-6 0-14 6-4 8 0m-102 2 1 6q0 4-2 4-5 1-5-6l2-4zm39 1 1 2q-1 4-5 4-5 0-6-4c0-4 7-6 10-2m47 2q3 4 2 9c-1 2-22 19-24 19q-3 0-4-4l6-6 6-5v-3c-5-10 7-18 14-10m35-3q3 1 0 7-2 8-6 6c-3-1-3 14 0 19q2 4 7-1c2-3 2-5 2-15 0-12 0-13 2-13q5-2 5 13 1 11 3 13 3 6 6 3 3-2-1-12-3-12 1-16h9q2-2 9 1l6 2 1-2q4-4 6-1l3 17c3 16 3 16 7 24l15 30q1 6-4 5l-8-14-6-12 1 20c1 21 1 23-4 23q-4 2-4-15l-1-27-1-16-9-13c-8-12-8-13-11-13q-6-1-2 6l2 7q0 4 3 2 6-2 6 3-1 4-8 5l-5 2-5 2q-6 0-10-3-2-3-5 1-5 5-12 2-5-1-7-10l-1-3-1 3q-3 7-9 8-7 0-9-11-3-10 2-10 4-1 5 7l2 6q1 0 4-7 6-17 13-12h1c-1-1 2-10 4-11zm-97 10 2 16 1 9h4q5 2 6-1c2-1 2-2-1-11l-3-12 3-1 11 5V82q4-2 6 1l3 23 1 20h2q5 0 5 5 1 6 3 0 3-9 8-2 1 3 2 0 3-7 4-6c5 0 6 7 1 13q-3 3-7 3l-6 1q-5 4-10 0l-2-2v5c0 21-16 42-33 42q-21-1-23-21 0-5 2-6 4-1 6 6 1 12 12 13 14 2 24-15 6-11 1-5-12 18-28 11-7-5-9-17-2-6 1-7 5-3 6 6 1 12 10 12 7 0 13-8 5-8-1-7-11-1-8-12 8-11 17-5l3 2-1-12-4-22q-3 1 0 7c2 6 2 6 0 10l-5 5q-3 3-7 1h-5l-1 16c-1 19-1 20-4 21-4 1-4-2-4-19l1-15-3 1q-3 1-6-2c-2-2-2-2-3-14l-1-12q-2-1-2 10l-1 13q-3 6-8 4c-3-2-4-4-7-15q-4-15 2-14 4-1 5 8l1 5 1-6q0-13 9-12l6 2c2 3 2 4 2 14l1 11 2-1 1-8-2-16q-3-12 2-11 3-1 5 7m163-3q4 10 1 13-4 3-7-7-3-11 2-10zm12-3 3 7q2 6 1 8v16l2 27c2 22 2 21 6 21h3l-1-5-2-23-3-33c-2-16-1-19 3-19 3 0 8 14 6 16v24c5 47 5 48 0 47q-3-2-1 4l2 6q2 1 5-9 7-18 10-16 3 0 7 5 4 7 7 7 4-1 1-33l-1-21-10-12-9-15q0-5 8-1 5 2 6 6l2 6q3 4 1-4 0-10 3-10c4 0 9 10 7 13l-1 8q1 8 4 12l3 3-2-15c-2-16-2-19 1-20q3 0 5 4l4 5h2q6-4 8 9 0 8-4 8-3 0-4-6 1-8-3-5c-1 2-1 3 1 19l2 17 5 7c6 10 12 21 11 22q-2 3-5 2l-5-8-5-8 1 8c0 11 0 11-3 11q-5 3-5-7l-1-16c0-8-1-10-4-15l-4-5v19c1 21 0 25-5 28q-6 5-13-3l-4-5-4 9q-6 14-11 15-9-1-11-16-1-8-5-1c-3 5-12 13-19 17q-8 4-8-2-1-2 6-6c9-5 17-14 17-18l-5-78q2-4 5-1m89 5 4 6q1 1-2 3l-2 2 4 24q4 25 4 35c0 10 0 11-3 17q-7 13-19 14-8 0-7-2-2-4 7-6 15-2 14-23a708 708 0 0 0-8-75c3-2 3-1 8 5m-211 19 1 4q0 3 2 2 5 0 5 4c0 4-9 6-13 2-4-5 0-17 5-12m108 1h2l4-1q4 2 0 7-7 6-11-1v-5q3-2 5 0m55 2q3 4-1 6-2 0-1 5t-1 6q-1 2-10-6-8-7-6-9 3-4 7 0l2 2 2-3q5-3 8-1m-131 13c3 2 6 14 6 17q-1 6 6 1l10-4q5-1 7-4 4-9 10-12 10 0 11 9 0 7-16 13l-2 1 13 1c16 0 16 0 13 9q-2 7-4 7l-10 2q-19 3-17 9 1 2 4 3 6 3 3 7l-7 1q-13-2-21-10l-3-3-2 3q-7 10-19 13-10 2-15-10l-5 2q-18 10-19 8l-2-3c0-2 1-2 15-11l9-6q1-3 5-4c3 1 10-5 12-9q3-6-1-15l-2-8q1-5 6-6c3 0 8 5 8 7q-1 4-4 3v1l1 10c1 9-1 13-10 21l-7 6 2 3q5 9 15-2 10-8 10-23 0-10-6-24v-4q3-4 6 1m17 2q2 3 4 0 11-3 5 5c-4 5-12 5-15-1v-4zm118 5 1 2q1 2-7 8c-8 6-9 7-11 5q-5-4 6-10c8-6 8-6 11-5m-229 3q3 2-10 10-12 8-13 3-5-3 9-10 13-8 14-3m229 10c3 2 4 9 3 11q-3 3-6 1c-2-2-3-11-1-13q1-2 4 1m-172 7q3 3 2 7 1 5-3 5-3 1-3-3l-2-4q-3-3-1-6 4-2 7 1m-79 9 1 8q0 9 3 6 4-1 4 3-1 7-7 7-7-1-7-14-1-9 2-10zm168 12q0 4 3 2t4 3q-2 6-8 8l-4-2q-3-3-4-2-4 0-5-4l5-6q7-6 7-4 3 1 2 5m102 3q4 4 1 9-7 7-7-4t6-5m-42 73c0 2 1 2 12 2q24-1 22 11 0 7-6 10c-4 1-31 2-34 0q-2-1-2-6v-4h-82l-74-1c-16 0-28-10-28-10h92c91 0 92-1 92-2q-1-3 4-5c5-2 4 4 4 5\"></path><path d=\"m195 86 1 1 1-1-1-1q-2 0-1 1m84 5q-2 2 1 5l3 3-1-4-1-5zm-125 45q-3 3-1 4 5-1 6-4zm110-7q-4 5 0 3 6-4 2-4zm-31 30q0 6 4 8l5 4q3 2 2-3 0-3 4-7 4-3 2-4l-13-3h-5zm104 101q-1 3 13 2c11 0 13 0 14-2l-13-1z\"></path></g></svg>",
  "assets/board-native/flags/SB.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>SB</title><path fill=\"#496E2D\" d=\"M0 85.334h512v341.337H0z\"></path><path fill=\"#0052B4\" d=\"M0 426.663V85.329h512\"></path><path fill=\"#FFDA44\" d=\"M0 396.494v30.169h45.255L512 115.499v-30.17h-45.255z\"></path><path d=\"m85.688 108.787 5.12 15.756h16.566l-13.403 9.737 5.12 15.757-13.403-9.738-13.405 9.738 5.12-15.757L64 124.543h16.567zm84.624 0 5.121 15.756H192l-13.403 9.737 5.12 15.757-13.405-9.738-13.403 9.738 5.12-15.757-13.403-9.737h16.566zm-84.624 82.502 5.12 15.756h16.566l-13.403 9.738 5.12 15.757-13.403-9.739-13.405 9.739 5.12-15.757L64 207.045h16.567zm84.624 0 5.121 15.756H192l-13.403 9.738 5.12 15.757-13.405-9.739-13.403 9.739 5.12-15.757-13.403-9.738h16.566zM128 150.037l5.12 15.756h16.568l-13.405 9.738 5.12 15.758L128 181.55l-13.403 9.739 5.12-15.758-13.405-9.738h16.568z\" fill=\"#FFF\"></path></svg>",
  "assets/board-native/flags/SC.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>SC</title><path fill=\"#FFF\" d=\"M0 85.337h512v341.326H0z\"></path><path fill=\"#FFDA44\" d=\"M235.454 85.337 0 426.663 427.345 85.337z\"></path><path fill=\"#6DA544\" d=\"M512 329.393 0 426.663h512z\"></path><path fill=\"#D80027\" d=\"M512 85.337h-84.655L0 426.663l512-204.512z\"></path><path fill=\"#0052B4\" d=\"M0 85.337v341.326L235.454 85.337z\"></path></svg>",
  "assets/board-native/flags/SD.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>SD</title><path fill=\"#FFF\" d=\"M0 85.337h512v341.326H0z\"></path><path fill=\"#D80027\" d=\"M0 85.337h512v113.775H0z\"></path><path d=\"M0 312.888h512v113.775H0z\"></path><path fill=\"#496E2D\" d=\"M0 426.668V85.331l256 170.675z\"></path></svg>",
  "assets/board-native/flags/SE.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>SE</title><path fill=\"#0052B4\" d=\"M0 85.333h512V426.67H0z\"></path><path fill=\"#FFDA44\" d=\"M192 85.33h-64v138.666H0v64h128v138.666h64V287.996h320v-64H192z\"></path></svg>",
  "assets/board-native/flags/SG.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>SG</title><path fill=\"#FFF\" d=\"M0 85.337h512v341.326H0z\"></path><path fill=\"#D80027\" d=\"M0 85.337h512V256H0z\"></path><g fill=\"#FFF\"><path d=\"M83.478 170.666c0-24.865 17.476-45.637 40.812-50.734a52.059 52.059 0 0 0-11.13-1.208c-28.688 0-51.942 23.254-51.942 51.941s23.255 51.942 51.942 51.942c3.822 0 7.543-.425 11.13-1.208-23.336-5.095-40.812-25.867-40.812-50.733zm66.783-48.231 3.684 11.337h11.921l-9.645 7.007 3.684 11.337-9.644-7.006-9.645 7.006 3.685-11.337-9.645-7.007h11.921z\"></path><path d=\"m121.344 144.696 3.683 11.337h11.921l-9.645 7.007 3.684 11.337-9.643-7.006-9.645 7.006 3.685-11.337-9.645-7.007h11.921zm57.834 0 3.684 11.337h11.921l-9.645 7.007 3.684 11.337-9.644-7.006-9.644 7.006 3.685-11.337-9.645-7.007h11.921zm-11.131 33.391 3.684 11.337h11.921l-9.644 7.007 3.684 11.337-9.645-7.006-9.643 7.006 3.684-11.337-9.644-7.007h11.92zm-35.573 0 3.683 11.337h11.921l-9.644 7.007 3.684 11.337-9.644-7.006-9.644 7.006 3.684-11.337-9.644-7.007h11.92z\"></path></g></svg>",
  "assets/board-native/flags/SH.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>SH</title><path fill=\"#012169\" d=\"M0 0h513v342H0z\"></path><path fill=\"#5f7dbd\" d=\"M449 139.7c-.1 44.4-7.2 92.1-65 114.9-57.8-22.8-64.9-70.5-65-114.9h130z\"></path><path fill=\"#f2d049\" d=\"M449 139.7c0-16.7-.9-32.9-.5-47.1C426.9 83 398.4 81 383.9 81s-42.9 2-64.6 11.6c.4 14.2-.5 30.4-.5 47.1H449z\"></path><path fill=\"#b38c79\" d=\"m369.5 204.5.3 10.3-12.8.2 4.9 13.2h-17.3c-18-20.2-23.4-42.4-24.9-68.1l9.1-9.7 8.3 14.3 10.8-12.8 7 7.8.8 15.7 13.8 29.1z\"></path><path fill=\"#5c5568\" d=\"m436.6 192.5-8.6 18.3h-47l-29.2-19.5 25.7 10.5h25.1l3.7-6.5 7.2.2 2-3z\"></path><path fill=\"#012169\" d=\"M0 0h256.5v171H0z\"></path><g fill=\"#FFF\"><path d=\"M256.5 0v30.6l-45.3 25.2h45.3v59.4h-59.2l59.2 32.9V171h-26.7l-73.7-40.9V171h-55.7v-48.7L12.8 171H0v-30.6l45.3-25.2H0V55.8h59.2L0 22.9V0h26.7l73.7 40.9V0h55.7v48.7L243.7 0z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-55.7-59.4L0 0v15.8l72 40z\"></path></g><g fill=\"#D80027\"><path d=\"M144.3 0h-32.1v69.5H0v32h112.2V171h32.1v-69.5h112.2v-32H144.3z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-84.1 0-72 40V171l100.4-55.8zm28.4-59.4L0 0v15.8l72 40zm84.1 0 72-40V0L156.1 55.8z\"></path></g></svg>",
  "assets/board-native/flags/SI.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>SI</title><path fill=\"#FFF\" d=\"M0 85.337h512v341.326H0z\"></path><path fill=\"#0052B4\" d=\"M0 199.112h512v113.775H0z\"></path><path fill=\"#D80027\" d=\"M0 312.888h512v113.775H0z\"></path><path fill=\"#FFF\" d=\"M233.606 196.639v14.837c0 34.081-44.522 44.522-44.522 44.522s-44.522-10.44-44.522-44.522v-14.837l-.145-44.188 89.043-.266.146 44.454z\"></path><path fill=\"#0052B4\" d=\"M233.606 196.639v14.837c0 34.081-44.522 44.522-44.522 44.522s-44.522-10.44-44.522-44.522v-14.837l-.145-44.188 89.043-.266.146 44.454z\"></path><path fill=\"#FFF\" d=\"M233.606 196.639v14.837c0 34.081-44.522 44.522-44.522 44.522s-44.522-10.44-44.522-44.522v-14.837l14.848 14.837 29.674-22.261 29.685 22.261 14.837-14.837z\"></path></svg>",
  "assets/board-native/flags/SJ.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>SJ</title><path fill=\"#D80027\" d=\"M0 85.334h512v341.337H0z\"></path><path fill=\"#FFF\" d=\"M512 295.883H202.195v130.783h-79.76V295.883H0v-79.772h122.435V85.329h79.76v130.782H512v61.218z\"></path><path fill=\"#2E52B2\" d=\"M512 234.666v42.663H183.652v149.337h-42.674V277.329H0v-42.663h140.978V85.329h42.674v149.337z\"></path></svg>",
  "assets/board-native/flags/SK.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>SK</title><path fill=\"#FFF\" d=\"M0 85.337h512v341.326H0z\"></path><path fill=\"#0052B4\" d=\"M0 196.641h512v118.717H0z\"></path><path fill=\"#D80027\" d=\"M0 315.359h512v111.304H0z\"></path><path fill=\"#FFF\" d=\"M129.468 181.799v85.136c0 48.429 63.267 63.267 63.267 63.267S256 315.362 256 266.935v-85.136H129.468z\"></path><path fill=\"#D80027\" d=\"M146.126 184.294v81.941c0 5.472 1.215 10.64 3.623 15.485h85.97c2.408-4.844 3.623-10.012 3.623-15.485v-81.941h-93.216z\"></path><path fill=\"#FFF\" d=\"M221.301 241.427h-21.425v-14.283h14.284v-14.283h-14.284v-14.284h-14.283v14.284h-14.282v14.283h14.282v14.283h-21.426v14.284h21.426v14.283h14.283v-14.283h21.425z\"></path><path fill=\"#0052B4\" d=\"M169.232 301.658c9.204 5.783 18.66 9.143 23.502 10.636 4.842-1.494 14.298-4.852 23.502-10.636 9.282-5.833 15.79-12.506 19.484-19.939a24.878 24.878 0 0 0-14.418-4.583c-1.956 0-3.856.232-5.682.657-3.871-8.796-12.658-14.94-22.884-14.94-10.227 0-19.013 6.144-22.884 14.94a25.048 25.048 0 0 0-5.682-.657 24.88 24.88 0 0 0-14.418 4.583c3.691 7.433 10.198 14.106 19.48 19.939z\"></path></svg>",
  "assets/board-native/flags/SL.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>SL</title><path fill=\"#FFF\" d=\"M0 85.337h512v341.326H0z\"></path><path fill=\"#6DA544\" d=\"M0 85.337h512v113.775H0z\"></path><path fill=\"#338AF3\" d=\"M0 312.888h512v113.775H0z\"></path></svg>",
  "assets/board-native/flags/SM.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>SM</title><path fill=\"#338AF3\" d=\"M0 85.34h512v341.326H0z\"></path><path fill=\"#FFF\" d=\"M512 85.334v166.69L0 256.175V85.334z\"></path><path fill=\"#6DA544\" d=\"M323.744 203.099 256 270.843l-67.744-67.744a81.156 81.156 0 0 0-13.879 45.483v22.261c0 35.744 23.097 66.193 55.148 77.213-4.277 8.385-3.556 18.848 2.712 26.671l24.258-19.439 24.258 19.439c6.342-7.915 7.011-18.534 2.564-26.968 31.614-11.261 54.308-41.485 54.308-76.916v-22.261a81.174 81.174 0 0 0-13.881-45.483z\"></path><path fill=\"#FFDA44\" d=\"M256 330.206c-32.732 0-59.362-26.63-59.362-59.362v-22.261c0-32.733 26.63-59.363 59.362-59.363s59.362 26.63 59.362 59.362v22.261c0 32.733-26.63 59.363-59.362 59.363z\"></path><path fill=\"#338AF3\" d=\"M293.101 270.843v-22.261c0-20.458-16.643-37.101-37.101-37.101s-37.101 16.643-37.101 37.101v22.261L256 278.264l37.101-7.421z\"></path><path fill=\"#6DA544\" d=\"M218.899 270.843c0 20.458 16.643 37.101 37.101 37.101s37.101-16.643 37.101-37.101h-74.202z\"></path><path fill=\"#FFDA44\" d=\"M300.522 189.22c0-12.295-9.966-22.261-22.261-22.261a22.173 22.173 0 0 0-14.84 5.672v-13.093h7.421v-14.84h-7.421v-7.421h-14.84v7.421h-7.421v14.84h7.421v13.093a22.177 22.177 0 0 0-14.841-5.672c-12.295 0-22.261 9.966-22.261 22.261 0 6.591 2.867 12.512 7.421 16.589v13.093h74.203v-13.093c4.552-4.077 7.419-9.997 7.419-16.589z\"></path></svg>",
  "assets/board-native/flags/SN.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>SN</title><path fill=\"#FFDA44\" d=\"M0 85.331h512v341.326H0z\"></path><path fill=\"#D80027\" d=\"M330.207 85.331H512v341.337H330.207z\"></path><path d=\"M0 85.331h181.793v341.337H0zm255.999 111.301 14.733 45.347h47.685l-38.576 28.029 14.734 45.348-38.576-28.026-38.577 28.026 14.737-45.348-38.576-28.029h47.681z\" fill=\"#496E2D\"></path></svg>",
  "assets/board-native/flags/SO.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>SO</title><path fill=\"#338AF3\" d=\"M0 85.331h512v341.337H0z\"></path><path fill=\"#FFF\" d=\"m256 157.273 22.663 69.748H352l-59.332 43.106 22.664 69.749L256 296.769l-59.332 43.107 22.664-69.749L160 227.021h73.337z\"></path></svg>",
  "assets/board-native/flags/SR.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>SR</title><path fill=\"#FFF\" d=\"M0 85.331h512v341.337H0z\"></path><path fill=\"#A2001D\" d=\"M0 196.636h512v118.728H0z\"></path><path d=\"M0 352.462h512v74.207H0zM0 85.331h512v74.207H0z\" fill=\"#6DA544\"></path><path fill=\"#FFDA44\" d=\"m256.742 218.003 9.43 29.021h30.518L272 264.963l9.431 29.023-24.689-17.937-24.689 17.937 9.431-29.023-24.69-17.939h30.518z\"></path></svg>",
  "assets/board-native/flags/SS.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>SS</title><path fill=\"#FFF\" d=\"M0 85.337h512v341.326H0z\"></path><path fill=\"#496E2D\" d=\"M0 322.783h512v103.88H0z\"></path><path d=\"M0 85.337h512v104.515H0z\"></path><path fill=\"#A2001D\" d=\"M0 210.877h512v89.656H0z\"></path><path fill=\"#0052B4\" d=\"M256 256.006 0 426.668V85.331z\"></path><path fill=\"#FFDA44\" d=\"m73.178 209.188 20.831 29.067 34.084-10.83-21.207 28.795 20.83 29.069-33.939-11.271-21.208 28.794.234-35.762-33.94-11.273 34.083-10.83z\"></path></svg>",
  "assets/board-native/flags/ST.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>ST</title><path fill=\"#FFDA44\" d=\"M0 85.337h512v341.326H0z\"></path><path d=\"M0 85.337h512v113.775H0zm0 227.551h512v113.775H0z\" fill=\"#6DA544\"></path><path fill=\"#D80027\" d=\"M256 256.006 0 426.668V85.331z\"></path><path d=\"m302.049 226.318 7.368 22.674h23.842l-19.288 14.016 7.366 22.674-19.288-14.015-19.287 14.015 7.366-22.674-19.288-14.016h23.842zm74.203 0 7.367 22.674h23.842l-19.288 14.016 7.367 22.674-19.288-14.015-19.288 14.015 7.367-22.674-19.288-14.016h23.842z\"></path></svg>",
  "assets/board-native/flags/SV.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>SV</title><path fill=\"#FFF\" d=\"M0 85.337h512v341.326H0z\"></path><path d=\"M0 85.337h512v113.775H0zm0 227.551h512v113.775H0z\" fill=\"#0052B4\"></path><path fill=\"#FFDA44\" d=\"M228.582 261.936 256 214.447l27.418 47.489z\"></path><path fill=\"#6DA544\" d=\"M291.616 277.616 256 295.425l-35.616-17.809v-23.744h71.232z\"></path><path fill=\"#FFDA44\" d=\"m289.579 216.485-12.592 12.592c5.37 5.372 8.693 12.791 8.693 20.988 0 16.392-13.289 29.68-29.68 29.68-16.392 0-29.68-13.289-29.68-29.68 0-8.195 3.322-15.616 8.693-20.988l-12.592-12.592c-8.594 8.594-13.91 20.466-13.91 33.579 0 26.228 21.261 47.489 47.489 47.489s47.489-21.261 47.489-47.489c0-13.114-5.316-24.987-13.91-33.579z\"></path></svg>",
  "assets/board-native/flags/SX.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>SX</title><path fill=\"#0052B4\" d=\"M0 85.337h512v341.326H0z\"></path><path fill=\"#D80027\" d=\"M512 85.331v166.69L0 256.173V85.331z\"></path><path fill=\"#FFF\" d=\"M256 256.006 0 426.668V85.331z\"></path><g fill=\"#FFDA44\"><path d=\"M59.621 256a59.546 59.546 0 0 0-.193 4.57c0 32.821 26.607 59.429 59.429 59.429s59.429-26.607 59.429-59.429c0-1.539-.078-3.061-.193-4.57H59.621z\"></path><circle cx=\"118.862\" cy=\"210.287\" r=\"18.286\"></circle></g><path fill=\"#D80027\" d=\"M77.715 205.714v59.429c0 31.494 41.144 41.143 41.144 41.143s41.144-9.649 41.144-41.143v-59.429H77.715z\"></path><path fill=\"#338AF3\" d=\"M118.877 287.148c-7.632-2.746-22.876-9.767-22.876-22.006v-41.144h45.715v41.144c-.001 12.28-15.244 19.283-22.839 22.006z\"></path><path fill=\"#F3F3F3\" d=\"M128.001 246.856v-9.142l-9.144-4.571-9.142 4.571v9.142l-4.571 4.573v18.285h27.428v-18.285z\"></path></svg>",
  "assets/board-native/flags/SY.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 900 600\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>SY</title><path d=\"M0 0h900v600H0z\" fill=\"#0f0f0f\"></path><path d=\"M0 0h900v400H0z\" fill=\"#fff\"></path><path d=\"M0 0h900v200H0z\" fill=\"#047a3f\"></path><path d=\"m176.26 375 48.738-150 48.738 150-127.6-92.705h157.72M626.256 375l48.738-150 48.738 150-127.6-92.705h157.72M401.252 375l48.738-150 48.738 150-127.6-92.705h157.72\" fill=\"#ce1126\"></path></svg>",
  "assets/board-native/flags/SZ.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 900 600\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>SZ</title><path fill=\"#2B5DEA\" d=\"M0 0h900v600H0V0z\"></path><path fill=\"#FFDF29\" d=\"M0 100h900v400H0V100z\"></path><path fill=\"#D70000\" d=\"M0 150h900v300H0V150z\"></path><path fill=\"#FFF\" d=\"M450 171.4v257.2c114.3 0 171.4-85.7 214.3-128.6-42.9-42.9-100-128.6-214.3-128.6z\"></path><path d=\"M450 171.4c-100 0-171.4 85.7-214.3 128.6C278.6 342.9 350 428.6 450 428.6V171.4z\"></path><path fill=\"#FFF\" d=\"M346.3 254.3h21v91.3h-21zm51.9 0h21v91.3h-21z\"></path><path d=\"M477.8 254.3h21v91.3h-21zm51.9 0h21v91.3h-21z\"></path></svg>",
  "assets/board-native/flags/TA.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>TA</title><path fill=\"#012169\" d=\"M0 0h513v342H0z\"></path><path fill=\"#012169\" d=\"M0 0h256.5v171H0z\"></path><g fill=\"#FFF\"><path d=\"M256.5 0v30.6l-45.3 25.2h45.3v59.4h-59.2l59.2 32.9V171h-26.7l-73.7-40.9V171h-55.7v-48.7L12.8 171H0v-30.6l45.3-25.2H0V55.8h59.2L0 22.9V0h26.7l73.7 40.9V0h55.7v48.7L243.7 0z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-55.7-59.4L0 0v15.8l72 40z\"></path></g><g fill=\"#D80027\"><path d=\"M144.3 0h-32.1v69.5H0v32h112.2V171h32.1v-69.5h112.2v-32H144.3z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-84.1 0-72 40V171l100.4-55.8zm28.4-59.4L0 0v15.8l72 40zm84.1 0 72-40V0L156.1 55.8z\"></path></g><path fill=\"#1799f8\" d=\"M448.9 169.5c0 9.6-.3 29.6-1.4 39.2-4.1 34.9-23.5 68.8-62.1 85.9-45.3-17.9-60.8-51-64.9-85.9-1.1-9.6-1.5-19.4-1.5-29l.3-47.1h129.2l.4 36.9z\"></path><path fill=\"#FFF\" d=\"M447.5 208.7c-.2 1.6-.4 3.3-.6 4.9-4.8 33.1-22.9 65.4-61.5 81-43.2-17-59.4-47.9-64.2-81-.2-1.6-.4-3.2-.6-4.9\"></path><path fill=\"#1799f8\" d=\"m385.4 251.7-22.9-43h45.8z\"></path><path fill=\"#FFF\" d=\"m385.4 165.8-22.9 42.9h45.8z\"></path><ellipse fill=\"#dcb072\" cx=\"474.8\" cy=\"236.8\" rx=\"16.8\" ry=\"43.3\"></ellipse><ellipse fill=\"#dcb072\" cx=\"295.3\" cy=\"236.8\" rx=\"16.8\" ry=\"43.3\"></ellipse><path fill=\"#FFF\" d=\"m385.4 31.5-33.4 44h68.5zM315.5 280s33.8 29.5 69.9 29.5 67.1-29.5 67.1-29.5l8.5 14.6S439.2 326 385.4 326 307 294.6 307 294.6l8.5-14.6z\"></path><ellipse fill=\"#A5A5A5\" cx=\"386.3\" cy=\"104.3\" rx=\"34.3\" ry=\"23.3\"></ellipse></svg>",
  "assets/board-native/flags/TC.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>TC</title><path fill=\"#012169\" d=\"M0 0h513v342H0z\"></path><path fill=\"#FFDA44\" stroke=\"#fff\" stroke-width=\"4\" d=\"M332.1 106.7v78.2c0 38.1 51.9 49.8 51.9 49.8s51.9-11.7 51.9-49.8v-78.2H332.1z\"></path><path fill=\"#fcad56\" d=\"M376.6 135.1c0 7.9-6.6 28.4-14.8 28.4S347 142.9 347 135.1c0-7.9 14.8-14.2 14.8-14.2s14.8 6.4 14.8 14.2z\"></path><path fill=\"#9e540a\" d=\"M416 150.6c2.4-5.6 4.3-13.8 4.3-17.9 0-6.5-8.9-11.9-8.9-11.9s-8.9 5.3-8.9 11.9c0 4.1 1.9 12.3 4.3 17.9l-5.1 11.1c3 1.2 6.3 1.8 9.8 1.8 3.5 0 6.8-.7 9.8-1.8l-5.3-11.1z\"></path><path fill=\"#009e49\" d=\"M372.9 184.9s-7.4 14.2-7.4 28.4h37.1c0-14.2-7.4-28.4-7.4-28.4l-11.1-7.1-11.2 7.1z\"></path><path fill=\"#ce1126\" d=\"M395.1 184.9v-3.6c0-5.9-5-10.7-11.1-10.7s-11.1 4.8-11.1 10.7v3.6h22.2z\"></path><path fill=\"#012169\" d=\"M0 0h256.5v171H0z\"></path><g fill=\"#FFF\"><path d=\"M256.5 0v30.6l-45.3 25.2h45.3v59.4h-59.2l59.2 32.9V171h-26.7l-73.7-40.9V171h-55.7v-48.7L12.8 171H0v-30.6l45.3-25.2H0V55.8h59.2L0 22.9V0h26.7l73.7 40.9V0h55.7v48.7L243.7 0z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-55.7-59.4L0 0v15.8l72 40z\"></path></g><g fill=\"#D80027\"><path d=\"M144.3 0h-32.1v69.5H0v32h112.2V171h32.1v-69.5h112.2v-32H144.3z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-84.1 0-72 40V171l100.4-55.8zm28.4-59.4L0 0v15.8l72 40zm84.1 0 72-40V0L156.1 55.8z\"></path></g></svg>",
  "assets/board-native/flags/TD.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>TD</title><path fill=\"#FFDA44\" d=\"M0 85.331h512v341.337H0z\"></path><path fill=\"#0052B4\" d=\"M0 85.331h170.663v341.337H0z\"></path><path fill=\"#D80027\" d=\"M341.337 85.331H512v341.337H341.337z\"></path></svg>",
  "assets/board-native/flags/TF.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 22.5 15\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>TF</title><path fill=\"#FFF\" d=\"M0 0h21v15H0V0z\"></path><path fill=\"#0A388A\" d=\"M0 0h22.5v15H0V0z\"></path><path fill=\"#FFF\" d=\"M0 0h11.3v7.5H0V0z\"></path><path fill=\"#D80027\" d=\"M7.1 0h3.6v7H7.1V0z\"></path><path fill=\"#0A388A\" d=\"M0 0h3.6v7H0V0z\"></path><path fill=\"#FFF\" d=\"M3.6 0h3.6v7H3.6V0zm10.9 6h5L19 7h-1.5v.5h1l-.5 1h-.5V10h-1V7H15l-.5-1zm4 2.5 1 1.5h-2l1-1.5zm-3 0 1 1.5h-2l1-1.5zm1.5 3L16 10h2l-1 1.5zM20 8c-.3 0-.5-.2-.5-.5s.2-.5.5-.5.5.2.5.5-.2.5-.5.5zm-6 0c-.3 0-.5-.2-.5-.5s.2-.5.5-.5.5.2.5.5-.2.5-.5.5zm1 4c-.3 0-.5-.2-.5-.5s.2-.5.5-.5.5.2.5.5-.2.5-.5.5zm4 0c-.3 0-.5-.2-.5-.5s.2-.5.5-.5.5.2.5.5-.2.5-.5.5zm-2 1c-.3 0-.5-.2-.5-.5s.2-.5.5-.5.5.2.5.5-.2.5-.5.5z\"></path></svg>",
  "assets/board-native/flags/TG.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>TG</title><path fill=\"#FFDA44\" d=\"M0 85.337h512v341.326H0z\"></path><path d=\"M0 85.337h512V153.6H0zM0 358.4h512v68.263H0zm0-136.537h512v68.263H0z\" fill=\"#496E2D\"></path><path fill=\"#D80027\" d=\"M0 85.337h204.054v204.054H0z\"></path><path fill=\"#FFF\" d=\"m102.026 133.938 13.26 40.812h42.916l-34.718 25.226 13.26 40.814-34.718-25.224-34.719 25.224 13.263-40.814-34.718-25.226h42.913z\"></path></svg>",
  "assets/board-native/flags/TH.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>TH</title><path fill=\"#FFF\" d=\"M0 85.334h512V426.66H0z\"></path><path fill=\"#0052B4\" d=\"M0 194.056h512v123.882H0z\"></path><path d=\"M0 85.334h512v54.522H0zm0 286.809h512v54.522H0z\" fill=\"#D80027\"></path></svg>",
  "assets/board-native/flags/TJ.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>TJ</title><path fill=\"#FFF\" d=\"M0 85.337h512v341.326H0z\"></path><path fill=\"#D80027\" d=\"M0 85.337h512v113.775H0z\"></path><path fill=\"#6DA544\" d=\"M0 312.888h512v113.775H0z\"></path><path d=\"M226.318 300.522h59.364v-25.23l-11.873 5.937L256 263.421l-17.809 17.808-11.873-5.937zm-33.963-29.682 2.763 8.504h8.94l-7.233 5.255 2.763 8.502-7.233-5.255-7.234 5.255 2.763-8.502-7.233-5.255h8.94zm8.566-29.68 2.763 8.502h8.94l-7.233 5.255 2.763 8.504-7.233-5.256-7.234 5.256 2.763-8.504-7.233-5.255h8.94zm24.488-22.261 2.763 8.502h8.94l-7.233 5.255 2.763 8.504-7.233-5.256-7.234 5.256 2.763-8.504-7.233-5.255h8.94zm94.236 51.941-2.763 8.504h-8.94l7.233 5.255-2.763 8.502 7.233-5.255 7.234 5.255-2.763-8.502 7.233-5.255h-8.94zm-8.566-29.68-2.763 8.502h-8.94l7.233 5.255-2.763 8.504 7.233-5.256 7.234 5.256-2.763-8.504 7.233-5.255h-8.94zm-24.488-22.261-2.763 8.502h-8.94l7.233 5.255-2.763 8.504 7.233-5.256 7.234 5.256-2.763-8.504 7.233-5.255h-8.94zM256 207.767l2.763 8.503h8.941l-7.234 5.256 2.763 8.502-7.233-5.254-7.233 5.254 2.763-8.502-7.234-5.256h8.941z\" fill=\"#FFDA44\"></path></svg>",
  "assets/board-native/flags/TK.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>TK</title><path fill=\"#0052B4\" d=\"M0 85.337h512v341.326H0z\"></path><path d=\"m210.715 174.377 3.684 11.338h11.919l-9.643 7.006 3.684 11.337-9.644-7.007-9.644 7.007 3.684-11.337-9.645-7.006h11.921zm-93.899 107.594 4.605 14.172h14.9l-12.055 8.757 4.606 14.173-12.056-8.76-12.055 8.76 4.604-14.173-12.054-8.757h14.899zm27.88-162.292 4.604 14.172h14.901l-12.056 8.758 4.606 14.171-12.055-8.759-12.056 8.759 4.606-14.171-12.055-8.758h14.9zm-75.157 55.652 4.604 14.172h14.9l-12.055 8.758 4.606 14.171-12.055-8.758-12.056 8.758 4.606-14.171-12.055-8.758h14.9z\" fill=\"#FFF\"></path><path d=\"M483.386 354.503H117.801s109.234-88.562 310.593-220.938c.001 0-88.443 128.935 54.992 220.938zm-365.585 11.586c-11.177 0-11.195 17.37 0 17.37h365.585c11.177 0 11.195-17.37 0-17.37H117.801z\" fill=\"#FFDA44\"></path></svg>",
  "assets/board-native/flags/TL.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>TL</title><path fill=\"#D80027\" d=\"M0 85.337h512v341.326H0z\"></path><path fill=\"#FFDA44\" d=\"M256 256 0 90.691v44.242L155.826 256 0 377.067v44.242z\"></path><path d=\"M0 90.691v330.618L189.217 256z\"></path><path fill=\"#FFF\" d=\"m44.184 213.36 24.912 23.577 30.121-16.41-14.723 30.98 24.911 23.575-34.012-4.43L60.67 301.63l-6.296-33.716-34.012-4.43 30.119-16.408z\"></path></svg>",
  "assets/board-native/flags/TM.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>TM</title><path fill=\"#496E2D\" d=\"M0 85.337h512v341.326H0z\"></path><g fill=\"#FFF\"><path d=\"M357.208 183.679c8.397-23.404-1.036-48.858-21.281-61.536a52.131 52.131 0 0 1 10.884 2.621c27.002 9.688 41.038 39.428 31.35 66.431s-39.428 41.038-66.431 31.35a52.182 52.182 0 0 1-10.069-4.895c23.686 3.084 47.15-10.566 55.547-33.971zm-46.571-67.95-7.297 9.427-11.22-4.026 6.712 9.852-7.296 9.427 11.443-3.338 6.712 9.852.361-11.914 11.444-3.339-11.221-4.025z\"></path><path d=\"m330.338 146.448-7.296 9.427-11.221-4.026 6.712 9.852-7.296 9.427 11.443-3.339 6.712 9.853.36-11.915 11.445-3.34-11.221-4.024zM275.9 126.916l-7.296 9.427-11.219-4.024 6.711 9.851-7.296 9.426 11.443-3.338 6.712 9.852.361-11.915 11.444-3.337-11.221-4.027zm-.799 35.189-7.296 9.427-11.221-4.026 6.712 9.852-7.296 9.427 11.444-3.338 6.711 9.852.362-11.915 11.443-3.338-11.22-4.026zm33.484 12.013-7.296 9.427-11.22-4.026 6.712 9.853-7.297 9.426 11.444-3.338 6.712 9.852.36-11.915 11.443-3.338-11.219-4.025z\"></path></g><path fill=\"#D80027\" d=\"M83.478 85.337h89.043v341.326H83.478z\"></path><path fill=\"#FFF\" d=\"m117.458 175.191-14.908-11.105v-15.705l14.908-11.105h21.084l14.908 11.105v15.705l-14.908 11.105z\"></path><path d=\"M128 137.276h-10.542l-14.908 11.105v7.678H128zm0 37.915h10.542l14.908-11.105v-8.012H128z\" fill=\"#FF9811\"></path><path fill=\"#FFF\" d=\"m117.458 374.725-14.908-11.106v-15.704l14.908-11.105h21.084l14.908 11.105v15.704l-14.908 11.106z\"></path><path d=\"M128 336.81h-10.542l-14.908 11.105v7.678H128zm0 37.915h10.542l14.908-11.106v-8.011H128z\" fill=\"#FF9811\"></path><path d=\"m117.458 274.957-14.908-11.105v-15.703l14.908-11.106h21.084l14.908 11.106v15.703l-14.908 11.105zm36.513 24.434h-6.493v-6.493h-11.411l-8.068-8.068-8.067 8.068h-11.41v6.493h-6.493v12.986h6.493v6.492h11.41l8.068 8.069 8.068-8.069h11.41v-6.492h6.493zm0-99.768h-6.493v-6.492h-11.411l-8.068-8.069-8.067 8.069h-11.41v6.492h-6.493v12.986h6.493v6.492h11.41l8.068 8.07 8.068-8.07h11.41v-6.492h6.493z\" fill=\"#496E2D\"></path><g fill=\"#D80027\"><path d=\"M120.576 248.576h14.84v14.84h-14.84z\"></path><circle cx=\"128\" cy=\"206.113\" r=\"7.421\"></circle><circle cx=\"128\" cy=\"305.887\" r=\"7.421\"></circle></g></svg>",
  "assets/board-native/flags/TN.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>TN</title><path fill=\"#D80027\" d=\"M0 85.331h512v341.337H0z\"></path><circle fill=\"#FFF\" cx=\"256\" cy=\"255.994\" r=\"96\"></circle><g fill=\"#D80027\"><path d=\"m267.826 219.291 16.47 22.695 26.673-8.649-16.496 22.676 16.468 22.695-26.664-8.681-16.495 22.676.017-28.04-26.664-8.682 26.674-8.648z\"></path><path d=\"M277.818 312.724c-31.33 0-56.727-25.397-56.727-56.727s25.397-56.727 56.727-56.727c9.769 0 18.96 2.47 26.985 6.819-12.589-12.31-29.804-19.909-48.803-19.909-38.558 0-69.818 31.259-69.818 69.818s31.26 69.818 69.818 69.818c18.999 0 36.215-7.599 48.803-19.909-8.026 4.347-17.216 6.817-26.985 6.817z\"></path></g></svg>",
  "assets/board-native/flags/TO.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>TO</title><path fill=\"#D80027\" d=\"M0 85.331h512v341.337H0z\"></path><path fill=\"#FFF\" d=\"M0 85.331h256v170.663H0z\"></path><path fill=\"#D80027\" d=\"M141.357 157.303V130.59h-26.714v26.713H87.93v26.713h26.713v26.713h26.714v-26.713h26.713v-26.713z\"></path></svg>",
  "assets/board-native/flags/TR.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>TR</title><path fill=\"#E30A17\" d=\"M0 0h513v342H0z\"></path><path fill=\"#FFF\" d=\"M259.7 118.6c-13.1-9.5-29-14.6-45.3-14.5-40.8 0-73.8 30.8-73.8 68.9s33.1 68.9 73.8 68.9c17.1 0 32.9-5.4 45.3-14.5-30 38.6-85.7 45.6-124.3 15.5s-45.6-85.7-15.5-124.3 85.7-45.6 124.3-15.5c5.8 4.5 11 9.8 15.5 15.5zm39.9 65.8-18.1 21.9 1.2-28.4-26.4-10.4 27.3-7.6 1.8-28.3 15.6 23.7 27.5-7.1-17.5 22 15.3 23.9-26.7-9.7z\"></path></svg>",
  "assets/board-native/flags/TT.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>TT</title><path fill=\"#D80027\" d=\"M0 85.337h512v341.326H0z\"></path><path fill=\"#FFF\" d=\"m6.066 85.337 207.961 212.636 131.584 128.69h160.323L297.973 214.027 166.389 85.337z\"></path><path d=\"M43.364 85.337 384.69 426.663h83.946L127.31 85.337z\"></path></svg>",
  "assets/board-native/flags/TV.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>TV</title><path fill=\"#00B2EE\" d=\"M0 171h256.5V0H513v342H0V171z\"></path><path d=\"m196.8 274.1 16.8 51.6-43.9-31.9H224l-43.9 31.9 16.7-51.6zm205.8-80.3 16.8 51.6-43.9-31.9h54.3l-43.9 31.9 16.7-51.6zm60.7-44.7 16.8 51.6-43.9-31.9h54.3l-43.9 31.9 16.7-51.6zm0-127.8L480.1 73l-44-32h54.3l-43.9 32 16.8-51.7zm-53 53.7 16.8 51.6-43.9-31.9h54.3l-43.9 31.9L410.3 75zm-77.4 32 16.8 51.6-43.9-31.9H360l-43.9 31.9 16.8-51.6zM350 245.4l16.8 51.6-43.9-31.9h54.3L333.3 297l16.7-51.6zm-71.8-56.2 16.8 51.6-44-31.8h54.3l-43.9 31.9 16.8-51.7zm0 75.3 16.8 51.6-44-31.9h54.3l-43.9 31.9 16.8-51.6z\" fill=\"#FFDA44\"></path><path fill=\"#012169\" d=\"M0 0h256.5v171H0z\"></path><g fill=\"#FFF\"><path d=\"M256.5 0v30.6l-45.3 25.2h45.3v59.4h-59.2l59.2 32.9V171h-26.7l-73.7-40.9V171h-55.7v-48.7L12.8 171H0v-30.6l45.3-25.2H0V55.8h59.2L0 22.9V0h26.7l73.7 40.9V0h55.7v48.7L243.7 0z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-55.7-59.4L0 0v15.8l72 40z\"></path></g><g fill=\"#D80027\"><path d=\"M144.3 0h-32.1v69.5H0v32h112.2V171h32.1v-69.5h112.2v-32H144.3z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-84.1 0-72 40V171l100.4-55.8zm28.4-59.4L0 0v15.8l72 40zm84.1 0 72-40V0L156.1 55.8z\"></path></g></svg>",
  "assets/board-native/flags/TW.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>TW</title><path fill=\"#D80027\" d=\"M0 85.337h512v341.326H0z\"></path><path fill=\"#0052B4\" d=\"M0 85.337h256V256H0z\"></path><path fill=\"#FFF\" d=\"M186.435 170.669 162.558 181.9l12.714 23.125-25.927-4.961-3.286 26.192L128 206.993l-18.06 19.263-3.285-26.192-25.927 4.96 12.714-23.125-23.877-11.23 23.877-11.231-12.714-23.125 25.927 4.96 3.286-26.192L128 134.344l18.06-19.263 3.285 26.192 25.928-4.96-12.715 23.125z\"></path><circle fill=\"#0052B4\" cx=\"128\" cy=\"170.674\" r=\"29.006\"></circle><path fill=\"#FFF\" d=\"M128 190.06c-10.692 0-19.391-8.7-19.391-19.391 0-10.692 8.7-19.391 19.391-19.391 10.692 0 19.391 8.7 19.391 19.391 0 10.691-8.699 19.391-19.391 19.391z\"></path></svg>",
  "assets/board-native/flags/TZ.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>TZ</title><path fill=\"#338AF3\" d=\"M0 85.337h512v341.326H0z\"></path><path fill=\"#6DA544\" d=\"M0 426.663V85.337h512\"></path><path fill=\"#FFDA44\" d=\"M512 152.222V85.337H411.67L0 359.778v66.885h100.33z\"></path><path d=\"M512 85.337v40.125L60.193 426.663H0v-40.125L451.807 85.337z\"></path></svg>",
  "assets/board-native/flags/UA.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>UA</title><path fill=\"#FFDA44\" d=\"M0 85.337h512v341.326H0z\"></path><path fill=\"#338AF3\" d=\"M0 85.337h512V256H0z\"></path></svg>",
  "assets/board-native/flags/UG.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 341.3\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>UG</title><path fill=\"#232323\" d=\"M0 0h512v341.3H0z\"></path><path fill=\"#FFDA44\" d=\"M0 56.9h512v56.9H0z\"></path><path fill=\"#D32300\" d=\"M0 113.8h512v56.9H0z\"></path><path fill=\"#FFDA44\" d=\"M0 227.6h512v56.9H0z\"></path><path fill=\"#D32300\" d=\"M0 284.4h512v56.9H0z\"></path><circle fill=\"#FFF\" cx=\"256\" cy=\"170.7\" r=\"80.7\"></circle><path d=\"M234.5 127.5c.9-1.4-19.6-2-19.6-2 1.7-2.5 18.4-10.5 18.4-10.5s-.9-6 2.7-9.8l-4.5-9.8s7-3.4 18.4-3.4 19.9 7 21 13.1l-6.4 3.4c-.1 4.7 1.7 11.6-4.3 17.3-5.9 5.7-8.3 6.9-8.5 18.8 0 3.9 2.3 8.2 8.8 11.7 17.4 9.3 38.6 28.2 44.6 33.9 6.1 5.7 5.1 19.2 2.6 25.2s-12.1 14.3-14.3 13.6c-2.2-.6 1.2-9.2-3.5-11.6 0 0-8.9-7.6-16.8.6s-.2 25.2 3.9 28c4.1 2.8 1.7 5-1.9 5H247c-3.8 0-5.4-2.3-1.9-5 7.6-3.8 12.4-15.3 7.4-20.3-4.9-4.9-18.3 1.5-21.5 6.3-2.8 2.8-8.8 3.6-12.9-1.4s-4.1-10.4-1.1-12.5c7-4.8 0 0 .1-.1 0 0 11.9-8.6 29.9-9 3.9 0 4.8-2.2 2.2-4.8 0 0-30.9-27.4-28.1-44.2 3-18.3 20-26.3 13.4-32.5-1.3-1.8 0 0 0 0z\"></path></svg>",
  "assets/board-native/flags/UM.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>UM</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 0h513v26.3H0zm0 52.6h513v26.3H0zm0 52.6h513v26.3H0zm0 52.6h513v26.3H0zm0 52.7h513v26.3H0zm0 52.6h513v26.3H0zm0 52.6h513V342H0z\" fill=\"#D80027\"></path><path fill=\"#2E52B2\" d=\"M0 0h256.5v184.1H0z\"></path><path d=\"m47.8 138.9-4-12.8-4.4 12.8H26.2l10.7 7.7-4 12.8 10.9-7.9 10.6 7.9-4.1-12.8 10.9-7.7zm56.3 0-4.1-12.8-4.2 12.8H82.6l10.7 7.7-4 12.8 10.7-7.9 10.8 7.9-4-12.8 10.7-7.7zm56.5 0-4.3-12.8-4 12.8h-13.5l11 7.7-4.2 12.8 10.7-7.9 11 7.9-4.2-12.8 10.7-7.7zm56.2 0-4-12.8-4.2 12.8h-13.3l10.8 7.7-4 12.8 10.7-7.9 10.8 7.9-4.3-12.8 11-7.7zM100 75.3l-4.2 12.8H82.6L93.3 96l-4 12.6 10.7-7.8 10.8 7.8-4-12.6 10.7-7.9h-13.4zm-56.2 0-4.4 12.8H26.2L36.9 96l-4 12.6 10.9-7.8 10.6 7.8L50.3 96l10.9-7.9H47.8zm112.5 0-4 12.8h-13.5l11 7.9-4.2 12.6 10.7-7.8 11 7.8-4.2-12.6 10.7-7.9h-13.2zm56.5 0-4.2 12.8h-13.3l10.8 7.9-4 12.6 10.7-7.8 10.8 7.8-4.3-12.6 11-7.9h-13.5zm-169-50.6-4.4 12.6H26.2l10.7 7.9-4 12.7L43.8 50l10.6 7.9-4.1-12.7 10.9-7.9H47.8zm56.2 0-4.2 12.6H82.6l10.7 7.9-4 12.7L100 50l10.8 7.9-4-12.7 10.7-7.9h-13.4zm56.3 0-4 12.6h-13.5l11 7.9-4.2 12.7 10.7-7.9 11 7.9-4.2-12.7 10.7-7.9h-13.2zm56.5 0-4.2 12.6h-13.3l10.8 7.9-4 12.7 10.7-7.9 10.8 7.9-4.3-12.7 11-7.9h-13.5z\" fill=\"#FFF\"></path></svg>",
  "assets/board-native/flags/US.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>US</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 0h513v26.3H0zm0 52.6h513v26.3H0zm0 52.6h513v26.3H0zm0 52.6h513v26.3H0zm0 52.7h513v26.3H0zm0 52.6h513v26.3H0zm0 52.6h513V342H0z\" fill=\"#D80027\"></path><path fill=\"#2E52B2\" d=\"M0 0h256.5v184.1H0z\"></path><path d=\"m47.8 138.9-4-12.8-4.4 12.8H26.2l10.7 7.7-4 12.8 10.9-7.9 10.6 7.9-4.1-12.8 10.9-7.7zm56.3 0-4.1-12.8-4.2 12.8H82.6l10.7 7.7-4 12.8 10.7-7.9 10.8 7.9-4-12.8 10.7-7.7zm56.5 0-4.3-12.8-4 12.8h-13.5l11 7.7-4.2 12.8 10.7-7.9 11 7.9-4.2-12.8 10.7-7.7zm56.2 0-4-12.8-4.2 12.8h-13.3l10.8 7.7-4 12.8 10.7-7.9 10.8 7.9-4.3-12.8 11-7.7zM100 75.3l-4.2 12.8H82.6L93.3 96l-4 12.6 10.7-7.8 10.8 7.8-4-12.6 10.7-7.9h-13.4zm-56.2 0-4.4 12.8H26.2L36.9 96l-4 12.6 10.9-7.8 10.6 7.8L50.3 96l10.9-7.9H47.8zm112.5 0-4 12.8h-13.5l11 7.9-4.2 12.6 10.7-7.8 11 7.8-4.2-12.6 10.7-7.9h-13.2zm56.5 0-4.2 12.8h-13.3l10.8 7.9-4 12.6 10.7-7.8 10.8 7.8-4.3-12.6 11-7.9h-13.5zm-169-50.6-4.4 12.6H26.2l10.7 7.9-4 12.7L43.8 50l10.6 7.9-4.1-12.7 10.9-7.9H47.8zm56.2 0-4.2 12.6H82.6l10.7 7.9-4 12.7L100 50l10.8 7.9-4-12.7 10.7-7.9h-13.4zm56.3 0-4 12.6h-13.5l11 7.9-4.2 12.7 10.7-7.9 11 7.9-4.2-12.7 10.7-7.9h-13.2zm56.5 0-4.2 12.6h-13.3l10.8 7.9-4 12.7 10.7-7.9 10.8 7.9-4.3-12.7 11-7.9h-13.5z\" fill=\"#FFF\"></path></svg>",
  "assets/board-native/flags/UY.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>UY</title><path fill=\"#FFF\" d=\"M0 0h513v342H0z\"></path><path d=\"M0 38h513v38H0zm0 76h513v38H0zm0 76h513v38H0zm0 76h513v38H0z\" fill=\"#0038a8\"></path><path fill=\"#FFF\" d=\"M0 0h256.5v190H0z\"></path><path fill=\"#FED443\" d=\"m128.3 138.7-15.1 22.6-3.8-26.9L86 148.2l8.2-25.9-27.2 2.2 18.6-19.8L60.3 95l25.4-9.7L67 65.5l27.1 2.3-8.2-25.9 23.4 13.8 3.9-26.9 15.1 22.6 15.1-22.6 3.8 26.9 23.4-13.8-8.2 25.9 27.1-2.2-18.6 19.8 25.4 9.7-25.4 9.7 18.6 19.8-27.1-2.2 8.2 25.9-23.4-13.8-3.9 26.9-15-22.7zm0-.5c23.9.9 44-17.6 44.9-41.5.9-23.9-17.6-44-41.5-44.9h-3.4c-23.9.8-42.6 20.8-41.8 44.6.6 22.8 19 41.1 41.8 41.8zm0-10.6c-18.8 0-34-15.2-34-34s15.2-34 34-34 34 15.2 34 34-15.3 34-34 34z\"></path></svg>",
  "assets/board-native/flags/UZ.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>UZ</title><path fill=\"#3081f7\" d=\"M0 0h513v108H0z\"></path><path fill=\"#ee162e\" d=\"M0 108h513v9H0z\"></path><path fill=\"#FFF\" d=\"M0 117h513v108H0z\"></path><path fill=\"#ee162e\" d=\"M0 225h513v9H0z\"></path><path fill=\"#308738\" d=\"M0 233h513v108H0z\"></path><path d=\"M53.5 54c0-23.1 16.4-35 34.3-38.9-2.7-.6-5.6-.9-8.5-.9-22 0-39.8 17.8-39.8 39.8s17.8 39.8 39.8 39.8c2.9 0 5.8-.3 8.5-.9C69.9 89 53.5 77.1 53.5 54zm57.9 21.3 1.8 5.9h6.2l-5 3.6 1.9 5.8-4.9-3.6-5 3.6 1.9-5.8-4.9-3.6h6.1zm27.8 0 1.9 5.9h6.1l-5 3.6 1.9 5.8-4.9-3.6-5 3.6 1.9-5.8-4.9-3.6h6.1zm27.8 0 1.9 5.9h6.1l-4.9 3.6 1.9 5.8-5-3.6-4.9 3.6 1.9-5.8-5-3.6h6.1zm27.9 0 1.9 5.9h6.1l-5 3.6 1.9 5.8-4.9-3.6-5 3.6 1.9-5.8-4.9-3.6h6.1zm27.8 0 1.9 5.9h6.1l-4.9 3.6 1.9 5.8-5-3.6-4.9 3.6 1.9-5.8-5-3.6h6.1zm-83.5-28.9 1.9 5.8h6.1l-5 3.6 1.9 5.8-4.9-3.6-5 3.6 1.9-5.8-4.9-3.6h6.1zm27.8 0 1.9 5.8h6.1l-4.9 3.6 1.9 5.8-5-3.6-4.9 3.6 1.9-5.8-5-3.6h6.1zm27.9 0 1.9 5.8h6.1l-5 3.6 1.9 5.8-4.9-3.6-5 3.6 1.9-5.8-4.9-3.6h6.1zm27.8 0 1.9 5.8h6.1l-4.9 3.6 1.9 5.8-5-3.6-4.9 3.6 1.9-5.8-5-3.6h6.1zm-55.7-29 1.9 5.8h6.1l-4.9 3.6 1.9 5.9-5-3.6-4.9 3.6 1.9-5.9-5-3.6h6.1zm27.9 0 1.9 5.8h6.1l-5 3.6 1.9 5.9-4.9-3.6-5 3.6 1.9-5.9-4.9-3.6h6.1zm27.8 0 1.9 5.8h6.1l-4.9 3.6 1.9 5.9-5-3.6-4.9 3.6 1.9-5.9-5-3.6h6.1z\" fill=\"#FFF\"></path></svg>",
  "assets/board-native/flags/VA.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>VA</title><path fill=\"#FFDA44\" d=\"M0 85.331h512v341.326H0z\"></path><path fill=\"#FFF\" d=\"M256 85.331h256v341.337H256z\"></path><path fill=\"#ACABB1\" d=\"m321.353 233.837 32.073 42.43c-5.053 7.651-5.026 17.961.817 25.692 7.414 9.807 21.374 11.748 31.182 4.335 9.807-7.414 11.748-21.374 4.334-31.182-5.843-7.731-15.756-10.568-24.495-7.795l-49.988-66.129-11.838 8.949-17.759 13.424 17.899 23.677 17.775-13.401zm46.175 48.78a7.421 7.421 0 1 1 8.95 11.84 7.421 7.421 0 0 1-8.95-11.84z\"></path><path fill=\"#FFDA44\" d=\"m376.367 247.24 17.899-23.677-17.759-13.424-11.838-8.949-49.988 66.129c-8.74-2.775-18.651.063-24.495 7.795-7.414 9.808-5.473 23.768 4.334 31.182 9.808 7.414 23.768 5.473 31.182-4.335 5.845-7.731 5.871-18.041.817-25.692l32.073-42.43 17.775 13.401zm-62.504 45.771a7.42 7.42 0 1 1-11.84-8.95 7.42 7.42 0 0 1 11.84 8.95z\"></path></svg>",
  "assets/board-native/flags/VC.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>VC</title><path fill=\"#FFDA44\" d=\"M0 85.331h512v341.337H0z\"></path><path fill=\"#338AF3\" d=\"M0 85.331h170.663v341.337H0z\"></path><path d=\"M341.337 85.331H512v341.337H341.337zM214.261 283.82l-33.393-50.086 33.392-50.087 33.392 50.087zm83.478 0-33.391-50.086 33.391-50.087 33.393 50.087zM256 350.603l-33.391-50.087L256 250.429l33.391 50.087z\" fill=\"#6DA544\"></path></svg>",
  "assets/board-native/flags/VE.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 22.5 15\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>VE</title><path fill=\"#FFCE00\" d=\"M0 0h22.5v5H0z\"></path><path fill=\"#203899\" d=\"M0 5h22.5v5H0z\"></path><path fill=\"#D82B2B\" d=\"M0 10h22.5v5H0z\"></path><path fill=\"#FFF\" d=\"m12.13 5.38.14.46.45.14-.39.27.01.48-.38-.29-.45.15.15-.44-.28-.38h.47zm-1.77 0 .27.39h.47l-.28.38.15.45-.45-.16-.38.28.01-.47-.39-.28.45-.13zm3.44.56-.01.48.39.27-.46.14-.14.45-.27-.38h-.48l.29-.38-.15-.45.45.16zm-5.11.02.4.27.44-.18-.13.46.3.36-.47.02-.26.4-.16-.44-.46-.12.37-.3zm6.55 1.17-.2.44.25.4-.47-.05-.31.36-.1-.46-.43-.18.41-.24.03-.47.35.31zm.19 1.12.21.43.47.07-.34.33.08.46-.42-.22-.42.22.08-.46-.34-.33.47-.07zM7 8.2l.21.43.47.06-.34.33.08.47L7 9.27l-.42.22.08-.47-.34-.33.47-.06zm.31-1.15.45.14.38-.29v.48l.39.26-.45.15-.13.46-.28-.38-.47.01.27-.38z\"></path></svg>",
  "assets/board-native/flags/VG.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 513 342\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>VG</title><path fill=\"#012169\" d=\"M0 0h513v342H0z\"></path><path fill=\"#ffc72c\" d=\"m384.8 174.7-46.2 46.2c8.7 16.7 26.1 28.1 46.2 28.1s37.6-11.4 46.2-28.1l-46.2-46.2z\"></path><path fill=\"#006129\" stroke=\"#fff\" stroke-width=\"3\" d=\"M332.7 93v81.8c0 39.8 52 52 52 52s52-12.2 52-52V93h-104z\"></path><path fill=\"#FFF\" d=\"M373.6 130.1h22.3v59.5h-22.3z\"></path><circle fill=\"#9c4c00\" cx=\"384.8\" cy=\"130.1\" r=\"11.2\"></circle><path d=\"M347.6 107.8h14.9v14.9h-14.9zm0 33.5h14.9v14.9h-14.9zm0 33.4h14.9v14.9h-14.9zm59.5-66.9H422v14.9h-14.9zm0 33.5H422v14.9h-14.9zm0 33.4H422v14.9h-14.9z\" fill=\"#ffc72c\"></path><path fill=\"#012169\" d=\"M0 0h256.5v171H0z\"></path><g fill=\"#FFF\"><path d=\"M256.5 0v30.6l-45.3 25.2h45.3v59.4h-59.2l59.2 32.9V171h-26.7l-73.7-40.9V171h-55.7v-48.7L12.8 171H0v-30.6l45.3-25.2H0V55.8h59.2L0 22.9V0h26.7l73.7 40.9V0h55.7v48.7L243.7 0z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-55.7-59.4L0 0v15.8l72 40z\"></path></g><g fill=\"#D80027\"><path d=\"M144.3 0h-32.1v69.5H0v32h112.2V171h32.1v-69.5h112.2v-32H144.3z\"></path><path d=\"M156.1 115.2 256.5 171v-15.8l-72-40zm-84.1 0-72 40V171l100.4-55.8zm28.4-59.4L0 0v15.8l72 40zm84.1 0 72-40V0L156.1 55.8z\"></path></g></svg>",
  "assets/board-native/flags/VI.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 341.3\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>VI</title><path fill=\"#FFF\" d=\"M0 0h512v341.3H0z\"></path><path fill=\"#1583C4\" d=\"m397.7 166.3-51 97.7c-1.1 2-.3 4.5 1.8 5.6 2 1.1 4.5.3 5.6-1.8l51-97.7c1-2.1.1-4.6-2-5.5-2-.9-4.3-.2-5.4 1.7z\"></path><path fill=\"#1583C4\" d=\"m404.9 188-57.8 75.4c-1.3 1.9-.8 4.5 1.1 5.8 1.7 1.2 4.1.9 5.5-.7l57.8-75.4c1.4-1.8 1.1-4.4-.8-5.8-1.8-1.5-4.4-1.1-5.8.7z\"></path><path fill=\"#1583C4\" d=\"m379 181.3-32.5 83.1c-.8 2.1.2 4.6 2.4 5.4 2.1.8 4.6-.2 5.4-2.4l32.5-83.1c.7-2.2-.4-4.5-2.6-5.3-2.1-.6-4.3.4-5.2 2.3z\"></path><path fill=\"#409347\" d=\"M122.1 171.9c.4 1.7 1.2 4.7 2.2 8.5 1.7 6.4 3.6 12.8 5.6 18.7 2.3 6.9 14.7 31.4 20.2 39.1 6.9 9.7 14.1 19.3 21.5 28.6 1.6 1.9 4.5 2.1 6.4.5 1.8-1.6 2.1-4.3.7-6.2-7.3-9.2-14.4-18.6-21.2-28.2-4.2-5.8-17.2-31.1-19-36.7-2.9-8.7-5.4-17.6-7.6-26.5-.5-2.4-2.9-4-5.3-3.5s-4 2.9-3.5 5.3c-.1.2 0 .3 0 .4z\"></path><g fill=\"#FFD836\" stroke=\"#231F20\" stroke-miterlimit=\"10\"><path d=\"M297.1 114.9S279.5 42.8 261 42.8c-6.9 0-11.9-.6-15.4 6.4-.9 1.7-20.7-1.6-19.1 20.8.5 6.9 1.1-9.8 14.9-3.4 6.3 3-16.4 48.2-16.4 48.2h72.1z\"></path><path d=\"m466.1 48.4-90.9 22c-75.3 18.3-42.1 44.4-42.1 44.4l-72.1 12-72.1-12s33.2-26.1-42.1-44.4l-90.9-22C43.1 45.3 38.1 51.8 45.3 63c0 0 106.6 104 126.8 112 20.2 8.1 40.8 0 40.8 0s-14.9 8.7-24 24c-9.2 15.3-4.6 34.7-38.9 40.2-5.5 6.6-5 14 2.9 19.9 7.9 5.8 72.1-48.1 72.1-48.1s-24 24.4-24 36.1c0 5.1 44.1 53.8 60.1 53.8s60.1-48.7 60.1-53.8c0-11.7-24-36.1-24-36.1s64.2 53.9 72.1 48.1 11.4-19.3 2.8-19.9c-28-1.8-29.7-24.9-38.9-40.2-9.2-15.3-24-24-24-24s20.6 8.1 40.8 0S476.7 63 476.7 63c7.2-11.2 2.3-17.7-10.6-14.6z\"></path></g><path fill=\"#FFF\" stroke=\"#231F20\" stroke-miterlimit=\"10\" d=\"M201.3 111.8v80.3c0 45.7 59.7 59.7 59.7 59.7s59.7-14 59.7-59.7v-80.3H201.3z\"></path><path d=\"M225.2 137.7V235c8.2 6 17 10.2 23.9 12.9V137.7h-23.9zm71.6 0V235c-8.2 6-17 10.2-23.9 12.9V137.7h23.9z\" fill=\"#D80027\"></path><path fill=\"#0052B4\" d=\"M201.3 111.8h119.4v37.9H201.3z\"></path><path fill=\"#1583C4\" d=\"m60.1 210.5-21.9-58.1H15.7l31.8 80.8h25.2l31.5-80.8H81.7zm391.4-58.6h18.9v81.7h-18.9z\"></path></svg>",
  "assets/board-native/flags/VN.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>VN</title><path fill=\"#D80027\" d=\"M196.641 85.337H0v341.326h512V85.337z\"></path><path fill=\"#FFDA44\" d=\"m256 157.279 22.663 69.747H352l-59.332 43.106 22.664 69.749L256 296.774l-59.332 43.107 22.664-69.749L160 227.026h73.337z\"></path></svg>",
  "assets/board-native/flags/VU.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>VU</title><path d=\"M0 85.337h512v341.326H0z\"></path><path fill=\"#6DA544\" d=\"M512 256v170.663H0L215.185 256z\"></path><path fill=\"#D80027\" d=\"M512 85.337V256H215.185L0 85.337z\"></path><path d=\"M221.001 239.304 26.868 85.337H8.956l208.168 165.098H512v-11.131zM8.956 426.663h17.912l194.133-153.967H512v-11.131H217.124zM0 92.44v14.206L188.317 256 0 405.354v14.205L206.229 256z\"></path><g fill=\"#FFDA44\"><path d=\"M8.956 85.337H0v7.103L206.229 256 0 419.559v7.104h8.956l208.168-165.098H512v-11.13H217.124z\"></path><path d=\"M63.718 292.382v-14.295c14.265 0 25.87-11.606 25.87-25.869 0-10.092-8.211-18.303-18.304-18.303-6.875 0-12.469 5.593-12.469 12.469 0 4.397 3.577 7.974 7.974 7.974a4.514 4.514 0 0 0 4.508-4.508h14.295c0 10.368-8.435 18.804-18.802 18.804-12.279-.002-22.269-9.993-22.269-22.271 0-14.758 12.006-26.764 26.764-26.764 17.975 0 32.599 14.623 32.599 32.599 0 22.145-18.018 40.164-40.166 40.164z\"></path></g></svg>",
  "assets/board-native/flags/WF.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 150 100\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>WF</title><path fill=\"#D80B30\" d=\"M0 0h150v100H0z\"></path><path fill=\"#00318A\" d=\"M0 0h20v44.33H0z\"></path><path fill=\"#FFF\" d=\"M20 0h20v44.33H20z\"></path><path fill=\"none\" stroke=\"#FFF\" stroke-width=\"3\" d=\"M0 44.33h62.75V0\"></path><path fill=\"#FFF\" d=\"M108.08 43.29 87.96 23.17h40.25l-20.13 20.12zm-6.7 6.71L81.25 29.88v40.25L101.38 50zm6.7 6.71L87.96 76.83h40.25l-20.13-20.12zm6.71-6.71 20.13-20.13v40.25L114.79 50z\"></path></svg>",
  "assets/board-native/flags/WS.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>WS</title><path fill=\"#D80027\" d=\"M0 85.331h512v341.337H0z\"></path><path fill=\"#0052B4\" d=\"M0 85.331h256v170.663H0z\"></path><path d=\"m165.483 181.79 2.764 8.504h8.939l-7.232 5.254 2.763 8.503-7.234-5.255-7.233 5.255 2.763-8.503-7.233-5.254h8.94zm-44.904-66.783 4.606 14.173h14.9l-12.055 8.757 4.605 14.171-12.056-8.758-12.054 8.758 4.605-14.171-12.056-8.757h14.901zm44.522 14.841 4.606 14.172h14.9l-12.055 8.757 4.604 14.173-12.055-8.76-12.054 8.76 4.604-14.173-12.055-8.757h14.9zm-35.192 59.363 4.606 14.172h14.9l-12.055 8.758 4.604 14.171-12.055-8.759-12.054 8.759 4.604-14.171-12.055-8.758h14.9zm-39.01-37.103 4.605 14.173h14.9l-12.055 8.757 4.604 14.173-12.054-8.76-12.055 8.76 4.604-14.173-12.055-8.757h14.9z\" fill=\"#FFF\"></path></svg>",
  "assets/board-native/flags/XK.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 341.33\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>XK</title><path fill=\"#0052B4\" d=\"M0 0h512v341.34H0z\"></path><path d=\"m220.72 42.63 7.95 16.11 17.77 2.58-12.86 12.54 3.04 17.7-15.9-8.36-15.9 8.36 3.03-17.7-12.86-12.54 17.78-2.58zm70.56-.06 7.95 16.1 17.78 2.59-12.86 12.53 3.03 17.71-15.9-8.36-15.9 8.36 3.04-17.71-12.86-12.53 17.77-2.59zm62.08 11.36 7.95 16.11 17.77 2.58-12.86 12.54 3.04 17.7-15.9-8.35-15.9 8.35 3.04-17.7-12.87-12.54 17.78-2.58zm63.01 18.3 7.95 16.11 17.77 2.59-12.86 12.53 3.04 17.71-15.9-8.36-15.9 8.36 3.03-17.71-12.86-12.53 17.78-2.59zm-257.73-18.3 7.95 16.11 17.78 2.58-12.87 12.54 3.04 17.7-15.9-8.35-15.9 8.35 3.04-17.7-12.86-12.54 17.77-2.58zm-63.01 18.3 7.95 16.11 17.78 2.59-12.86 12.53 3.03 17.71-15.9-8.36-15.9 8.36 3.04-17.71-12.86-12.53 17.77-2.59z\" fill=\"#FFF\"></path><path fill=\"#FFDA44\" d=\"m217.53 259.33-27.22-13.61-27.22-54.43h27.22l27.22-27.22 13.61-27.22 27.22-13.61 13.61 13.61 27.22 13.61v13.61l13.61 13.61 40.83 27.22L340 245.73l-40.83 40.83-13.61-27.22-40.83 27.22v27.22l-13.61-13.61-13.59-40.84z\"></path></svg>",
  "assets/board-native/flags/YE.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>YE</title><path fill=\"#FFF\" d=\"M0 85.337h512v341.326H0z\"></path><path fill=\"#D80027\" d=\"M0 85.337h512v113.775H0z\"></path><path d=\"M0 312.888h512v113.775H0z\"></path></svg>",
  "assets/board-native/flags/YT.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 90 60\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>YT</title><path fill=\"#FFF\" d=\"M0 0h90v60H0z\"></path><path stroke=\"#7f7f7f\" stroke-width=\"0.25\" fill=\"#ABABAB\" d=\"M75.6 39.6c-1.1.7 0 1.8-.6 1.9-.6.1-1.5-1.4-.2-2.5 1.6-1.5 5.8 0 5.9 4.3 0 2.2-.9 6.8-7.2 6.8-7.6 0-11.4-5.7-11.4-11.4 0-4.8 3.7-13.5 6.5-14.6 3.1-1.2 6.7-3.5 6.8-5 0-.5-1.4-.1-3.3.9-3.1 1.7-6.6 2.5-6.6 1.4s2.9-3.1 4-4.6c1.2-1.6.9-5.5 3-5.5 7.6 0 9.9 7.7 7 11.7-1.9 2.6 4.3 1 4.3 1s0 5.3-3.2 7.3c-3 1.8-4.8 3.9-4.8 3.9s.2-4.6-.5-3.9c-.6.7-11.1 4.5-10.3 12 .3 3 4.5 5.4 8.5 5.2s5.7-2.4 5.8-4.9c.1-3.9-3-4.4-3.7-4zm-64.9 4c.1 2.5 1.8 4.7 5.8 4.9s8.2-2.2 8.5-5.2c.8-7.5-9.7-11.3-10.3-12-.7-.7-.5 3.9-.5 3.9s-1.8-2.1-4.8-3.9c-3.2-2-3.2-7.3-3.2-7.3s6.2 1.6 4.3-1c-2.9-4-.6-11.7 7-11.7 2.1 0 1.8 3.9 3 5.5 1.1 1.5 4 3.5 4 4.6s-3.5.3-6.6-1.4c-1.9-1-3.3-1.4-3.3-.9.1 1.5 3.7 3.8 6.8 5 2.8 1.1 6.5 9.8 6.5 14.6 0 5.7-3.8 11.4-11.4 11.4-6.3 0-7.2-4.6-7.2-6.8.1-4.3 4.3-5.8 5.9-4.3 1.2 1.1.4 2.7-.2 2.5-.6-.1.6-1.2-.6-1.9-.6-.4-3.7.1-3.7 4z\"></path><path fill=\"#DE393A\" d=\"M31 28.8v14c0 1.9 2.1 1.6 2.1 1.6h9.3c1.2 0 2.6 2.3 2.6 2.3s1.4-2.3 2.5-2.3h9.6s2 .2 2-1.8V28.7H31z\"></path><path fill=\"#3951A3\" d=\"M31 13.1h28v15.7H31z\"></path><path fill=\"#FFF\" d=\"M50.1 16.5c-.4 2.4-2.5 4.2-5.1 4.2-2.5 0-4.6-1.8-5.1-4.2-.5.9-.8 1.9-.8 3 0 3.3 2.6 5.9 5.9 5.9 3.3 0 5.9-2.6 5.9-5.9 0-1.1-.3-2.1-.8-3z\"></path><circle fill=\"#FEE05F\" cx=\"39.1\" cy=\"36.5\" r=\"3\"></circle><circle fill=\"#FEE05F\" cx=\"50.9\" cy=\"36.5\" r=\"3\"></circle></svg>",
  "assets/board-native/flags/ZA.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>ZA</title><path fill=\"#FFF\" d=\"M0 85.337h512v341.326H0z\"></path><path d=\"M114.024 256.001 0 141.926v228.17z\"></path><path fill=\"#ffb915\" d=\"M161.192 256 0 94.7v47.226l114.024 114.075L0 370.096v47.138z\"></path><path fill=\"#007847\" d=\"M509.833 289.391c.058-.44.804-.878 2.167-1.318v-65.464H222.602L85.33 85.337H0V94.7L161.192 256 0 417.234v9.429h85.33l137.272-137.272h287.231z\"></path><path fill=\"#000c8a\" d=\"M503.181 322.783H236.433l-103.881 103.88H512v-103.88z\"></path><path fill=\"#e1392d\" d=\"M503.181 189.217H512V85.337H132.552l103.881 103.88z\"></path></svg>",
  "assets/board-native/flags/ZM.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>ZM</title><path fill=\"#496E2D\" d=\"M0 85.331h512v341.337H0z\"></path><path fill=\"#FF9811\" d=\"M490.668 195.476h-48c0-8.836-7.164-16-16-16s-16 7.164-16 16h-48c0 8.836 7.697 16 16.533 16h-.533c0 8.836 7.162 16 16 16 0 8.836 7.162 16 16 16h32c8.836 0 16-7.164 16-16 8.836 0 16-7.164 16-16h-.533c8.837 0 16.533-7.164 16.533-16z\"></path><path fill=\"#D80027\" d=\"M341.337 255.994h56.888v170.663h-56.888z\"></path><path fill=\"#FF9811\" d=\"M455.112 255.994H512v170.663h-56.888z\"></path><path d=\"M398.225 255.994h56.888v170.663h-56.888z\"></path></svg>",
  "assets/board-native/flags/ZW.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 85.333 512 341.333\" class=\"h-3 w-[18px] shrink-0 overflow-hidden rounded-[2px]\"><title>ZW</title><path d=\"M0 85.333h512V426.67H0z\"></path><path d=\"M0 134.196h512v48.868H0zm0 195.472h512v48.868H0z\" fill=\"#FFDA44\"></path><path fill=\"#057f44\" d=\"M0 85.333h512v48.868H0z\"></path><path d=\"M0 183.069h512v48.868H0zm0 97.737h512v48.868H0z\" fill=\"#D80027\"></path><path fill=\"#057f44\" d=\"M0 378.542h512v48.128H0z\"></path><path fill=\"#FFF\" d=\"M276.992 255.996 106.329 426.659H0V85.333h106.329z\"></path><path d=\"M256 255.996 85.334 426.662h20.987l170.667-170.666L106.321 85.33H85.334z\"></path><path fill=\"#D80027\" d=\"m102.465 202.57 13.259 40.812h42.917l-34.718 25.226 13.26 40.814-34.718-25.224-34.72 25.224 13.262-40.814-34.718-25.226h42.915z\"></path><path fill=\"#FFDA44\" d=\"m138.94 259.335-34.559-12.243s-2.553-23.955-2.708-24.766c-1.173-6.18-6.603-10.851-13.123-10.851-7.376 0-13.357 5.98-13.357 13.357 0 1.223.178 2.402.486 3.528l-9.689 9.755h17.229c0 17.882-13.344 17.882-13.344 35.691l7.402 17.809h44.522l7.422-17.809h-.004a17.782 17.782 0 0 0 1.381-5.231c6.397-2.589 8.342-9.24 8.342-9.24z\"></path></svg>",
  "assets/button-placeholder.svg": "<svg preserveAspectRatio=\"none\" overflow=\"visible\" style=\"display: block;\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<g id=\"Icon leading\" opacity=\"0.6\">\n<path id=\"Icon\" d=\"M10 1.66667C14.6022 1.66667 18.3333 5.39778 18.3333 10C18.3333 14.6022 14.6022 18.3333 10 18.3333C5.39778 18.3333 1.66667 14.6022 1.66667 10C1.66667 5.39778 5.39778 1.66667 10 1.66667Z\" stroke-width=\"1.66667\" stroke=\"white\"/>\n</g>\n</svg>\n",
  "assets/dialog-close.svg": "<svg preserveAspectRatio=\"none\" overflow=\"visible\" style=\"display: block;\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<g id=\"Frame\">\n<path id=\"Vector\" d=\"M5 5L10 10M10 10L15 15M10 10L15 5M10 10L5 15\" stroke-width=\"1.66667\" stroke-linecap=\"round\" stroke=\"#A3A3A3\"/>\n</g>\n</svg>\n",
  "assets/dialog-featured.svg": "<svg preserveAspectRatio=\"none\" overflow=\"visible\" style=\"display: block;\" width=\"16.6667\" height=\"16.6667\" viewBox=\"0 0 16.6667 16.6667\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<g id=\"Frame\">\n<path id=\"Icon\" d=\"M5.20833 8.33333L7.29167 10.4167L11.4583 6.25M15.2778 8.33333C15.2778 12.1687 12.1687 15.2778 8.33333 15.2778C4.49792 15.2778 1.38889 12.1687 1.38889 8.33333C1.38889 4.49792 4.49792 1.38889 8.33333 1.38889C12.1687 1.38889 15.2778 4.49792 15.2778 8.33333Z\" stroke-width=\"1.38889\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke=\"#404040\"/>\n</g>\n</svg>\n",
  "assets/select-chevron.svg": "<svg preserveAspectRatio=\"none\" overflow=\"visible\" style=\"display: block;\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<g id=\"chevron\">\n<path id=\"Vector\" d=\"M4 6L8 10L12 6\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke=\"#A3A3A3\"/>\n</g>\n</svg>\n",
  "assets/sort-arrow.svg": "<svg preserveAspectRatio=\"none\" overflow=\"visible\" style=\"display: block;\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<g id=\"arrow-down\">\n<path id=\"Icon\" d=\"M6 2.5V9.5M2.5 6L6 9.5L9.5 6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke=\"#525252\"/>\n</g>\n</svg>\n",
  "public-props.json": "{\n  \"buttons\": {\n    \"exportName\": \"Button\",\n    \"props\": {\n      \"disabled\": \"boolean | undefined\",\n      \"onClick\": \"MouseEventHandler<HTMLButtonElement> | undefined\",\n      \"size\": \"\\\"xs\\\" | \\\"sm\\\" | \\\"md\\\" | \\\"lg\\\" | \\\"xl\\\" | undefined\",\n      \"variant\": \"\\\"primary\\\" | \\\"secondary\\\" | \\\"tertiary\\\" | \\\"ghost\\\" | \\\"link-gray\\\" | \\\"link-color\\\" | \\\"danger\\\" | undefined\",\n      \"loading\": \"boolean | undefined\",\n      \"leadingIcon\": \"ReactNode\",\n      \"trailingIcon\": \"ReactNode\",\n      \"iconOnly\": \"boolean | undefined\"\n    }\n  },\n  \"inputs\": {\n    \"exportName\": \"Input\",\n    \"props\": {\n      \"disabled\": \"boolean | undefined\",\n      \"value\": \"string | number | readonly string[] | undefined\",\n      \"onChange\": \"ChangeEventHandler<HTMLInputElement, HTMLInputElement> | undefined\",\n      \"required\": \"boolean | undefined\",\n      \"label\": \"string\",\n      \"size\": \"\\\"sm\\\" | \\\"md\\\" | \\\"lg\\\" | undefined\",\n      \"hint\": \"string | undefined\",\n      \"error\": \"string | undefined\",\n      \"leadingIcon\": \"ReactNode\",\n      \"suffix\": \"ReactNode\"\n    }\n  },\n  \"select\": {\n    \"exportName\": \"RichSelect\",\n    \"props\": {\n      \"label\": \"string\",\n      \"options\": \"RichSelectOption[]\",\n      \"value\": \"string | undefined\",\n      \"defaultValue\": \"string | undefined\",\n      \"onValueChange\": \"((value: string) => void) | undefined\",\n      \"placeholder\": \"string | undefined\",\n      \"size\": \"BaseSize | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"loading\": \"boolean | undefined\",\n      \"error\": \"string | undefined\",\n      \"hint\": \"string | undefined\",\n      \"leadingIcon\": \"ReactNode\",\n      \"name\": \"string | undefined\",\n      \"required\": \"boolean | undefined\"\n    }\n  },\n  \"modals\": {\n    \"exportName\": \"Dialog\",\n    \"props\": {\n      \"open\": \"boolean\",\n      \"onOpenChange\": \"(open: boolean) => void\",\n      \"title\": \"string\",\n      \"description\": \"string | undefined\",\n      \"children\": \"ReactNode\",\n      \"footer\": \"ReactNode\",\n      \"destructive\": \"boolean | undefined\"\n    }\n  },\n  \"tables\": {\n    \"exportName\": \"DataTable\",\n    \"props\": {\n      \"rows\": \"T[]\",\n      \"columns\": \"Column<T>[]\",\n      \"rowKey\": \"(row: T) => string\",\n      \"rowLabel\": \"(row: T) => string\",\n      \"caption\": \"string\",\n      \"pageSize\": \"number | undefined\",\n      \"presentation\": \"\\\"advanced\\\" | \\\"board\\\" | undefined\",\n      \"hideToolbar\": \"boolean | undefined\",\n      \"searchValue\": \"string | undefined\",\n      \"onSearchValueChange\": \"((value: string) => void) | undefined\",\n      \"state\": \"\\\"loading\\\" | \\\"error\\\" | \\\"ready\\\" | \\\"empty\\\" | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"onRowAction\": \"((row: T) => void) | undefined\",\n      \"filters\": \"Record<string, string> | undefined\",\n      \"disabled\": \"boolean | undefined\"\n    }\n  },\n  \"checkboxes\": {\n    \"exportName\": \"Checkbox\",\n    \"props\": {\n      \"disabled\": \"boolean | undefined\",\n      \"onChange\": \"ChangeEventHandler<HTMLInputElement, HTMLInputElement> | undefined\",\n      \"checked\": \"boolean | undefined\",\n      \"label\": \"string\",\n      \"hint\": \"string | undefined\",\n      \"indeterminate\": \"boolean | undefined\",\n      \"size\": \"\\\"sm\\\" | \\\"md\\\" | undefined\",\n      \"card\": \"boolean | undefined\"\n    }\n  },\n  \"tabs\": {\n    \"exportName\": \"Tabs\",\n    \"props\": {\n      \"label\": \"string\",\n      \"items\": \"Tab[]\",\n      \"value\": \"string | undefined\",\n      \"defaultValue\": \"string | undefined\",\n      \"onValueChange\": \"((value: string) => void) | undefined\",\n      \"variant\": \"\\\"underline\\\" | \\\"pill\\\" | \\\"gray\\\" | undefined\"\n    }\n  },\n  \"charts\": {\n    \"exportName\": \"RevenueChart\",\n    \"props\": {\n      \"data\": \"RevenuePoint[] | undefined\",\n      \"state\": \"ExampleState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\"\n    }\n  },\n  \"messaging\": {\n    \"exportName\": \"ChatComposer\",\n    \"props\": {\n      \"state\": \"ExampleState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\"\n    }\n  },\n  \"settings-form\": {\n    \"exportName\": \"SettingsForm\",\n    \"props\": {\n      \"state\": \"ExampleState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\"\n    }\n  },\n  \"avatars\": {\n    \"exportName\": \"AvatarGroup\",\n    \"props\": {\n      \"items\": \"AvatarItem[] | undefined\",\n      \"value\": \"string | undefined\",\n      \"defaultValue\": \"string | undefined\",\n      \"onValueChange\": \"((id: string) => void) | undefined\",\n      \"size\": \"\\\"xs\\\" | BaseSize | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"allowUpload\": \"boolean | undefined\",\n      \"onImageChange\": \"((file: File) => void) | undefined\"\n    }\n  },\n  \"badges\": {\n    \"exportName\": \"Badge\",\n    \"props\": {\n      \"children\": \"ReactNode\",\n      \"tone\": \"BadgeTone | undefined\",\n      \"size\": \"BaseSize | undefined\",\n      \"leadingIcon\": \"ReactNode\",\n      \"onDismiss\": \"(() => void) | undefined\",\n      \"dismissLabel\": \"string | undefined\",\n      \"disabled\": \"boolean | undefined\"\n    }\n  },\n  \"button-groups\": {\n    \"exportName\": \"ButtonGroup\",\n    \"props\": {\n      \"label\": \"string\",\n      \"items\": \"ButtonGroupItem[]\",\n      \"value\": \"string | undefined\",\n      \"defaultValue\": \"string | undefined\",\n      \"onValueChange\": \"((id: string) => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"BaseSize | undefined\"\n    }\n  },\n  \"dropdowns\": {\n    \"exportName\": \"DropdownMenu\",\n    \"props\": {\n      \"label\": \"string | undefined\",\n      \"items\": \"DropdownItem[]\",\n      \"onAction\": \"(id: string) => void\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"BaseSize | undefined\",\n      \"selectedKey\": \"string | undefined\",\n      \"header\": \"ReactNode\",\n      \"footer\": \"ReactNode\",\n      \"triggerContent\": \"ReactNode\"\n    }\n  },\n  \"progress-indicators\": {\n    \"exportName\": \"ProgressIndicator\",\n    \"props\": {\n      \"label\": \"string\",\n      \"value\": \"number | undefined\",\n      \"max\": \"number | undefined\",\n      \"indeterminate\": \"boolean | undefined\",\n      \"size\": \"BaseSize | undefined\",\n      \"variant\": \"\\\"line\\\" | \\\"circle\\\" | undefined\",\n      \"showValue\": \"boolean | undefined\"\n    }\n  },\n  \"radio-groups\": {\n    \"exportName\": \"RadioGroup\",\n    \"props\": {\n      \"label\": \"string\",\n      \"options\": \"RadioOption[]\",\n      \"value\": \"string | undefined\",\n      \"defaultValue\": \"string | undefined\",\n      \"onValueChange\": \"((value: string) => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"BaseSize | undefined\",\n      \"description\": \"string | undefined\",\n      \"variant\": \"\\\"row\\\" | \\\"card\\\" | undefined\"\n    }\n  },\n  \"sliders\": {\n    \"exportName\": \"Slider\",\n    \"props\": {\n      \"label\": \"string\",\n      \"value\": \"number | undefined\",\n      \"defaultValue\": \"number | undefined\",\n      \"min\": \"number | undefined\",\n      \"max\": \"number | undefined\",\n      \"step\": \"number | undefined\",\n      \"onValueChange\": \"((value: number) => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"BaseSize | undefined\",\n      \"formatValue\": \"((value: number) => string) | undefined\",\n      \"showBubble\": \"boolean | undefined\",\n      \"onChangeEnd\": \"((value: number) => void) | undefined\"\n    }\n  },\n  \"tags\": {\n    \"exportName\": \"TagsInput\",\n    \"props\": {\n      \"label\": \"string | undefined\",\n      \"value\": \"string[] | undefined\",\n      \"defaultValue\": \"string[] | undefined\",\n      \"onValueChange\": \"((tags: string[]) => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"BaseSize | undefined\",\n      \"maxTags\": \"number | undefined\",\n      \"maxTagLength\": \"number | undefined\"\n    }\n  },\n  \"text-editors\": {\n    \"exportName\": \"TextEditor\",\n    \"props\": {\n      \"label\": \"string | undefined\",\n      \"defaultValue\": \"string | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"onChange\": \"((value: TextEditorValue) => void) | undefined\",\n      \"onSave\": \"((value: TextEditorValue) => void) | undefined\",\n      \"maxLength\": \"number | undefined\"\n    }\n  },\n  \"video-players\": {\n    \"exportName\": \"VideoPlayer\",\n    \"props\": {\n      \"src\": \"string\",\n      \"title\": \"string | undefined\",\n      \"caption\": \"string | undefined\",\n      \"poster\": \"string | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"onPlaybackChange\": \"((playing: boolean) => void) | undefined\"\n    }\n  },\n  \"toggles\": {\n    \"exportName\": \"Toggle\",\n    \"props\": {\n      \"label\": \"string\",\n      \"description\": \"string | undefined\",\n      \"selected\": \"boolean | undefined\",\n      \"defaultSelected\": \"boolean | undefined\",\n      \"onSelectedChange\": \"((selected: boolean) => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"BaseSize | undefined\",\n      \"shape\": \"\\\"pill\\\" | \\\"rounded\\\" | undefined\",\n      \"card\": \"boolean | undefined\"\n    }\n  },\n  \"tooltips\": {\n    \"exportName\": \"Tooltip\",\n    \"props\": {\n      \"label\": \"string\",\n      \"content\": \"ReactNode\",\n      \"trigger\": \"ReactNode\",\n      \"disabled\": \"boolean | undefined\",\n      \"placement\": \"\\\"top\\\" | \\\"bottom\\\" | \\\"left\\\" | \\\"right\\\" | undefined\",\n      \"delay\": \"number | undefined\",\n      \"size\": \"\\\"sm\\\" | \\\"md\\\" | undefined\",\n      \"showArrow\": \"boolean | undefined\"\n    }\n  },\n  \"activity-feeds\": {\n    \"exportName\": \"ActivityFeed\",\n    \"props\": {\n      \"items\": \"Activity[] | undefined\",\n      \"disabled\": \"boolean | undefined\"\n    }\n  },\n  \"alerts-and-notifications\": {\n    \"exportName\": \"Notification\",\n    \"props\": {\n      \"title\": \"string | undefined\",\n      \"description\": \"string | undefined\",\n      \"tone\": \"\\\"error\\\" | \\\"success\\\" | \\\"warning\\\" | \\\"info\\\" | undefined\",\n      \"dismissible\": \"boolean | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"onDismiss\": \"(() => void) | undefined\",\n      \"icon\": \"ReactNode\",\n      \"avatar\": \"{ src: string; name: string; } | undefined\",\n      \"actions\": \"{ label: string; onPress: () => void; variant?: \\\"primary\\\" | \\\"secondary\\\" | undefined; }[] | undefined\",\n      \"position\": \"NotificationPosition | undefined\",\n      \"autoDismiss\": \"number | undefined\",\n      \"open\": \"boolean | undefined\",\n      \"onOpenChange\": \"((open: boolean) => void) | undefined\"\n    }\n  },\n  \"application-navigation\": {\n    \"exportName\": \"ApplicationNavigation\",\n    \"props\": {\n      \"items\": \"NavigationItem[] | undefined\",\n      \"value\": \"string | undefined\",\n      \"onValueChange\": \"((value: string) => void) | undefined\",\n      \"disabled\": \"boolean | undefined\"\n    }\n  },\n  \"breadcrumbs\": {\n    \"exportName\": \"Breadcrumbs\",\n    \"props\": {\n      \"items\": \"BreadcrumbItem[] | undefined\",\n      \"onNavigate\": \"((item: BreadcrumbItem) => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"label\": \"string | undefined\"\n    }\n  },\n  \"calendars\": {\n    \"exportName\": \"Calendar\",\n    \"props\": {\n      \"value\": \"string | undefined\",\n      \"defaultValue\": \"string | undefined\",\n      \"onChange\": \"((date: string) => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"minValue\": \"string | undefined\",\n      \"maxValue\": \"string | undefined\"\n    }\n  },\n  \"card-headers\": {\n    \"exportName\": \"CardHeader\",\n    \"props\": {\n      \"title\": \"string | undefined\",\n      \"description\": \"string | undefined\",\n      \"count\": \"number | undefined\",\n      \"actionLabel\": \"string | undefined\",\n      \"onAction\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"eyebrow\": \"string | undefined\"\n    }\n  },\n  \"code-snippets\": {\n    \"exportName\": \"CodeSnippet\",\n    \"props\": {\n      \"code\": \"string | undefined\",\n      \"language\": \"string | undefined\",\n      \"disabled\": \"boolean | undefined\"\n    }\n  },\n  \"color-pickers\": {\n    \"exportName\": \"ColorPicker\",\n    \"props\": {\n      \"value\": \"string | undefined\",\n      \"defaultValue\": \"string | undefined\",\n      \"onChange\": \"((value: string) => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"swatches\": \"string[] | undefined\"\n    }\n  },\n  \"content-dividers\": {\n    \"exportName\": \"ContentDivider\",\n    \"props\": {\n      \"label\": \"ReactNode\",\n      \"children\": \"ReactNode\",\n      \"orientation\": \"\\\"horizontal\\\" | \\\"vertical\\\" | undefined\",\n      \"variant\": \"\\\"single\\\" | \\\"double\\\" | \\\"filled\\\" | undefined\",\n      \"align\": \"\\\"start\\\" | \\\"center\\\" | \\\"end\\\" | undefined\",\n      \"className\": \"string | undefined\"\n    }\n  },\n  \"inline-ctas\": {\n    \"exportName\": \"InlineCTA\",\n    \"props\": {\n      \"title\": \"string | undefined\",\n      \"description\": \"string | undefined\",\n      \"actionLabel\": \"string | undefined\",\n      \"onAction\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\"\n    }\n  },\n  \"section-footers\": {\n    \"exportName\": \"SectionFooter\",\n    \"props\": {\n      \"defaultValue\": \"string | undefined\",\n      \"label\": \"string | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"onSave\": \"((value: string) => void) | undefined\"\n    }\n  },\n  \"section-headers\": {\n    \"exportName\": \"SectionHeader\",\n    \"props\": {\n      \"title\": \"string | undefined\",\n      \"description\": \"string | undefined\",\n      \"count\": \"number | undefined\",\n      \"actionLabel\": \"string | undefined\",\n      \"onAction\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"eyebrow\": \"string | undefined\"\n    }\n  },\n  \"command-menus\": {\n    \"exportName\": \"CommandMenu\",\n    \"props\": {\n      \"items\": \"Command[] | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"onSelect\": \"((command: Command) => void) | undefined\"\n    }\n  },\n  \"date-pickers\": {\n    \"exportName\": \"DateRangePicker\",\n    \"props\": {\n      \"label\": \"string | undefined\",\n      \"value\": \"DateRangeValue | undefined\",\n      \"defaultValue\": \"DateRangeValue | undefined\",\n      \"onChange\": \"((value: DateRangeValue) => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"inline\": \"boolean | undefined\",\n      \"minValue\": \"string | undefined\",\n      \"maxValue\": \"string | undefined\",\n      \"referenceDate\": \"string | undefined\"\n    }\n  },\n  \"empty-states\": {\n    \"exportName\": \"EmptyState\",\n    \"props\": {\n      \"title\": \"string | undefined\",\n      \"description\": \"string | undefined\",\n      \"actionLabel\": \"string | undefined\",\n      \"onAction\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\"\n    }\n  },\n  \"file-upload\": {\n    \"exportName\": \"FileUpload\",\n    \"props\": {\n      \"accept\": \"string | undefined\",\n      \"maxSize\": \"number | undefined\",\n      \"multiple\": \"boolean | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"onFilesChange\": \"((files: File[]) => void) | undefined\",\n      \"onComplete\": \"((files: File[]) => void) | undefined\",\n      \"renderFileIcon\": \"((file: File) => ReactNode) | undefined\",\n      \"onUpload\": \"((file: File, onProgress: (percent: number) => void, signal: AbortSignal) => Promise<void>) | undefined\"\n    }\n  },\n  \"filters\": {\n    \"exportName\": \"Filters\",\n    \"props\": {\n      \"records\": \"FilterRecord[] | undefined\",\n      \"disabled\": \"boolean | undefined\"\n    }\n  },\n  \"loading-indicators\": {\n    \"exportName\": \"LoadingIndicator\",\n    \"props\": {\n      \"label\": \"string | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"delay\": \"number | undefined\"\n    }\n  },\n  \"metrics\": {\n    \"exportName\": \"Metrics\",\n    \"props\": {\n      \"items\": \"Metric[] | undefined\"\n    }\n  },\n  \"page-headers\": {\n    \"exportName\": \"PageHeader\",\n    \"props\": {\n      \"title\": \"string | undefined\",\n      \"description\": \"string | undefined\",\n      \"count\": \"number | undefined\",\n      \"actionLabel\": \"string | undefined\",\n      \"onAction\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"eyebrow\": \"string | undefined\"\n    }\n  },\n  \"pagination\": {\n    \"exportName\": \"Pagination\",\n    \"props\": {\n      \"page\": \"number | undefined\",\n      \"defaultPage\": \"number | undefined\",\n      \"pageCount\": \"number | undefined\",\n      \"onPageChange\": \"((page: number) => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"label\": \"string | undefined\"\n    }\n  },\n  \"progress-steps\": {\n    \"exportName\": \"ProgressSteps\",\n    \"props\": {\n      \"steps\": \"ProgressStep[] | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"onComplete\": \"(() => void) | undefined\"\n    }\n  },\n  \"slideout-menus\": {\n    \"exportName\": \"SlideoutMenu\",\n    \"props\": {\n      \"title\": \"string | undefined\",\n      \"description\": \"string | undefined\",\n      \"children\": \"ReactNode\",\n      \"disabled\": \"boolean | undefined\",\n      \"triggerLabel\": \"string | undefined\"\n    }\n  },\n  \"tree-views\": {\n    \"exportName\": \"TreeView\",\n    \"props\": {\n      \"items\": \"TreeNode[] | undefined\",\n      \"dir\": \"\\\"ltr\\\" | \\\"rtl\\\" | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"\\\"sm\\\" | \\\"md\\\" | \\\"lg\\\" | undefined\",\n      \"selectionMode\": \"\\\"multiple\\\" | \\\"single\\\" | \\\"none\\\" | undefined\",\n      \"selectedKeys\": \"Iterable<string> | undefined\",\n      \"defaultSelectedKeys\": \"Iterable<string> | undefined\",\n      \"expandedKeys\": \"Iterable<string> | undefined\",\n      \"defaultExpandedKeys\": \"Iterable<string> | undefined\",\n      \"onSelectionChange\": \"((keys: string[]) => void) | undefined\",\n      \"onExpandedChange\": \"((keys: string[]) => void) | undefined\"\n    }\n  },\n  \"announcement\": {\n    \"exportName\": \"Announcement\",\n    \"props\": {\n      \"title\": \"string\",\n      \"description\": \"string | undefined\",\n      \"actionLabel\": \"string | undefined\",\n      \"onAction\": \"(() => void) | undefined\",\n      \"onDismiss\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"tone\": \"\\\"neutral\\\" | \\\"success\\\" | \\\"brand\\\" | undefined\",\n      \"icon\": \"ReactNode\",\n      \"dismissible\": \"boolean | undefined\",\n      \"layout\": \"\\\"card\\\" | \\\"banner\\\" | undefined\"\n    }\n  },\n  \"carousel\": {\n    \"exportName\": \"Carousel\",\n    \"props\": {\n      \"label\": \"string\",\n      \"items\": \"CarouselItem[]\",\n      \"value\": \"number | undefined\",\n      \"defaultValue\": \"number | undefined\",\n      \"onValueChange\": \"((index: number) => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"cardWidth\": \"string | undefined\",\n      \"align\": \"\\\"start\\\" | \\\"center\\\" | undefined\",\n      \"showArrows\": \"boolean | undefined\",\n      \"showDots\": \"boolean | undefined\",\n      \"gap\": \"number | undefined\"\n    }\n  },\n  \"input-otp\": {\n    \"exportName\": \"InputOTP\",\n    \"props\": {\n      \"length\": \"number | undefined\",\n      \"groupEvery\": \"number | undefined\",\n      \"value\": \"string | undefined\",\n      \"defaultValue\": \"string | undefined\",\n      \"onValueChange\": \"((value: string) => void) | undefined\",\n      \"onComplete\": \"((value: string) => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"error\": \"string | undefined\",\n      \"label\": \"string | undefined\",\n      \"name\": \"string | undefined\"\n    }\n  },\n  \"social-button\": {\n    \"exportName\": \"SocialButton\",\n    \"props\": {\n      \"provider\": \"SocialProvider\",\n      \"onPress\": \"(() => void) | undefined\",\n      \"label\": \"string | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"loading\": \"boolean | undefined\",\n      \"size\": \"BaseSize | undefined\",\n      \"appearance\": \"\\\"neutral\\\" | \\\"brand\\\" | \\\"colorful\\\" | \\\"black\\\" | \\\"white\\\" | undefined\",\n      \"fullWidth\": \"boolean | undefined\",\n      \"children\": \"ReactNode\",\n      \"iconOnly\": \"boolean | undefined\",\n      \"logo\": \"ReactNode\",\n      \"brandColor\": \"string | undefined\",\n      \"href\": \"string | undefined\",\n      \"target\": \"string | undefined\"\n    }\n  },\n  \"textarea\": {\n    \"exportName\": \"Textarea\",\n    \"props\": {\n      \"disabled\": \"boolean | undefined\",\n      \"label\": \"string\",\n      \"hint\": \"string | undefined\",\n      \"error\": \"string | undefined\",\n      \"size\": \"BaseSize | undefined\",\n      \"autoResize\": \"boolean | undefined\",\n      \"showCount\": \"boolean | undefined\",\n      \"maxRows\": \"number | undefined\",\n      \"resize\": \"Resize | undefined\"\n    }\n  },\n  \"close-button\": {\n    \"exportName\": \"CloseButton\",\n    \"props\": {\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"\\\"xs\\\" | \\\"sm\\\" | \\\"md\\\" | \\\"lg\\\" | \\\"xl\\\" | undefined\",\n      \"variant\": \"\\\"primary\\\" | \\\"secondary\\\" | \\\"tertiary\\\" | \\\"ghost\\\" | \\\"link-gray\\\" | \\\"link-color\\\" | \\\"danger\\\" | undefined\",\n      \"loading\": \"boolean | undefined\",\n      \"trailingIcon\": \"ReactNode\",\n      \"label\": \"string | undefined\"\n    }\n  },\n  \"icon-button\": {\n    \"exportName\": \"IconButton\",\n    \"props\": {\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"\\\"xs\\\" | \\\"sm\\\" | \\\"md\\\" | \\\"lg\\\" | \\\"xl\\\" | undefined\",\n      \"variant\": \"\\\"primary\\\" | \\\"secondary\\\" | \\\"tertiary\\\" | \\\"ghost\\\" | \\\"link-gray\\\" | \\\"link-color\\\" | \\\"danger\\\" | undefined\",\n      \"loading\": \"boolean | undefined\",\n      \"trailingIcon\": \"ReactNode\",\n      \"label\": \"string\",\n      \"icon\": \"ReactNode\"\n    }\n  },\n  \"link-button\": {\n    \"exportName\": \"LinkButton\",\n    \"props\": {\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"BaseSize | undefined\",\n      \"leadingIcon\": \"ReactNode\",\n      \"trailingIcon\": \"ReactNode\"\n    }\n  },\n  \"theme-toggle\": {\n    \"exportName\": \"ThemeToggle\",\n    \"props\": {\n      \"disabled\": \"boolean | undefined\",\n      \"compact\": \"boolean | undefined\",\n      \"label\": \"string | undefined\",\n      \"onValueChange\": \"((dark: boolean) => void) | undefined\",\n      \"storageKey\": \"string | undefined\"\n    }\n  },\n  \"data-grid\": {\n    \"exportName\": \"DataGrid\",\n    \"props\": {\n      \"label\": \"string\",\n      \"rows\": \"GridRow[]\",\n      \"columns\": \"GridColumn[]\",\n      \"onRowsChange\": \"((rows: GridRow[]) => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"readOnly\": \"boolean | undefined\",\n      \"dir\": \"\\\"ltr\\\" | \\\"rtl\\\" | undefined\",\n      \"virtualize\": \"boolean | undefined\",\n      \"viewportHeight\": \"number | undefined\",\n      \"rowHeight\": \"number | undefined\"\n    }\n  },\n  \"settings-modal\": {\n    \"exportName\": \"SettingsModal\",\n    \"props\": {\n      \"open\": \"boolean\",\n      \"onOpenChange\": \"(open: boolean) => void\",\n      \"initialValue\": \"SettingsValue | undefined\",\n      \"initialTab\": \"\\\"general\\\" | \\\"profile\\\" | \\\"tools\\\" | \\\"storage\\\" | \\\"notifications\\\" | \\\"appearance\\\" | undefined\",\n      \"onSave\": \"((value: SettingsValue) => void) | undefined\",\n      \"planArtSrc\": \"string | undefined\",\n      \"disabled\": \"boolean | undefined\"\n    }\n  },\n  \"sidebar\": {\n    \"exportName\": \"Sidebar\",\n    \"props\": {\n      \"label\": \"string | undefined\",\n      \"brand\": \"string | undefined\",\n      \"items\": \"SidebarItem[]\",\n      \"value\": \"string | undefined\",\n      \"defaultValue\": \"string | undefined\",\n      \"onValueChange\": \"((id: string) => void) | undefined\",\n      \"collapsed\": \"boolean | undefined\",\n      \"onCollapsedChange\": \"((collapsed: boolean) => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"variant\": \"\\\"workspace\\\" | \\\"chat\\\" | undefined\",\n      \"onNewChat\": \"(() => void) | undefined\",\n      \"footer\": \"ReactNode\",\n      \"onAccountAction\": \"((action: string) => void) | undefined\",\n      \"onTeamChange\": \"((team: string) => void) | undefined\"\n    }\n  },\n  \"stat-cards\": {\n    \"exportName\": \"StatCards\",\n    \"props\": {\n      \"items\": \"StatMetric[]\",\n      \"period\": \"StatPeriod | undefined\",\n      \"defaultPeriod\": \"StatPeriod | undefined\",\n      \"onPeriodChange\": \"((period: StatPeriod) => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"variant\": \"\\\"compact\\\" | \\\"footer\\\" | undefined\"\n    }\n  },\n  \"agent-creator\": {\n    \"exportName\": \"AgentCreator\",\n    \"props\": {\n      \"agent\": \"AgentProfile | undefined\",\n      \"onChange\": \"((agent: AgentProfile) => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"onClose\": \"(() => void) | undefined\",\n      \"presentation\": \"\\\"interactive\\\" | \\\"source\\\" | undefined\",\n      \"renderAvatar\": \"((profile: Pick<AgentProfile, \\\"name\\\" | \\\"color\\\" | \\\"shape\\\" | \\\"expression\\\"> & { animated?: boolean | undefined; }) => ReactNode) | undefined\",\n      \"renderShape\": \"((shape: \\\"pill\\\" | \\\"circle\\\" | \\\"cloud\\\" | \\\"square\\\" | \\\"diamond\\\" | \\\"heart\\\" | \\\"star\\\" | \\\"shield\\\" | \\\"hexagon\\\" | \\\"petal\\\" | \\\"flower\\\" | \\\"slender\\\" | \\\"pocket\\\", color: string) => ReactNode) | undefined\"\n    }\n  },\n  \"agent-limits-card\": {\n    \"exportName\": \"AgentLimitsCard\",\n    \"props\": {\n      \"segments\": \"ContextSegment[] | undefined\",\n      \"max\": \"number | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"defaultExpanded\": \"boolean | undefined\",\n      \"expanded\": \"boolean | undefined\",\n      \"onExpandedChange\": \"((expanded: boolean) => void) | undefined\",\n      \"plan\": \"string | undefined\",\n      \"planHref\": \"string | undefined\",\n      \"groups\": \"{ label: string; items: { label: string; tokens: number; }[]; }[] | undefined\",\n      \"limits\": \"{ label: string; value: number; reset: string; }[] | undefined\"\n    }\n  },\n  \"agent-progress\": {\n    \"exportName\": \"AgentProgress\",\n    \"props\": {\n      \"presentation\": \"\\\"interactive\\\" | \\\"source\\\" | undefined\",\n      \"steps\": \"(string | AgentStep)[] | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"onComplete\": \"(() => void) | undefined\",\n      \"stepDuration\": \"number | undefined\",\n      \"completionDelay\": \"number | undefined\",\n      \"onFinished\": \"(() => void) | undefined\",\n      \"autoRun\": \"boolean | undefined\",\n      \"suspended\": \"boolean | undefined\"\n    }\n  },\n  \"agent-thinking\": {\n    \"exportName\": \"AgentThinking\",\n    \"props\": {\n      \"active\": \"boolean | undefined\",\n      \"onActiveChange\": \"((active: boolean) => void) | undefined\",\n      \"label\": \"string | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"defaultVariant\": \"\\\"wave\\\" | \\\"spin\\\" | \\\"stars\\\" | \\\"infinity\\\" | undefined\",\n      \"showTimer\": \"boolean | undefined\",\n      \"shimmer\": \"boolean | undefined\",\n      \"tone\": \"\\\"accent\\\" | \\\"subtle\\\" | undefined\"\n    }\n  },\n  \"auth-card\": {\n    \"exportName\": \"AuthCard\",\n    \"props\": {\n      \"mode\": \"\\\"signin\\\" | \\\"signup\\\" | \\\"verify\\\" | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"loading\": \"boolean | undefined\",\n      \"onSubmit\": \"((values: AuthCardSubmission) => void) | undefined\",\n      \"layout\": \"\\\"inline\\\" | \\\"stacked\\\" | \\\"grid\\\" | undefined\",\n      \"providers\": \"string[] | undefined\",\n      \"media\": \"ReactNode\",\n      \"logo\": \"ReactNode\",\n      \"centered\": \"boolean | undefined\",\n      \"title\": \"string | undefined\",\n      \"description\": \"string | undefined\",\n      \"footnote\": \"ReactNode\",\n      \"email\": \"string | undefined\",\n      \"codeLength\": \"number | undefined\",\n      \"onComplete\": \"((code: string) => void) | undefined\",\n      \"onProvider\": \"((provider: string) => void | Promise<void>) | undefined\",\n      \"confirmPassword\": \"boolean | undefined\"\n    }\n  },\n  \"composer\": {\n    \"exportName\": \"Composer\",\n    \"props\": {\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"onSend\": \"((message: ComposerMessage) => void) | undefined\",\n      \"showAttachments\": \"boolean | undefined\",\n      \"showPanel\": \"boolean | undefined\",\n      \"showLocalMessages\": \"boolean | undefined\",\n      \"simulateAttachments\": \"boolean | undefined\",\n      \"working\": \"boolean | undefined\",\n      \"loadingLight\": \"boolean | undefined\",\n      \"onStop\": \"(() => void) | undefined\",\n      \"placeholder\": \"string | undefined\",\n      \"value\": \"string | undefined\",\n      \"onValueChange\": \"((value: string) => void) | undefined\",\n      \"permission\": \"string | undefined\",\n      \"onPermissionChange\": \"((value: string) => void) | undefined\",\n      \"model\": \"string | undefined\",\n      \"onModelChange\": \"((value: string) => void) | undefined\",\n      \"effort\": \"number | undefined\",\n      \"onEffortChange\": \"((value: number) => void) | undefined\",\n      \"providers\": \"ComposerModelProvider[] | undefined\",\n      \"attachments\": \"ComposerAttachment[] | undefined\",\n      \"onRemoveAttachment\": \"((id: string) => void) | undefined\",\n      \"onAttachmentsChange\": \"((attachments: ComposerAttachment[]) => void) | undefined\",\n      \"uploadDuration\": \"number | undefined\",\n      \"uploadGap\": \"number | undefined\",\n      \"status\": \"ReactNode\",\n      \"inputRef\": \"Ref<HTMLTextAreaElement> | undefined\",\n      \"minRows\": \"number | undefined\",\n      \"maxRows\": \"number | undefined\",\n      \"defaultPermission\": \"string | undefined\",\n      \"learnMoreHref\": \"string | undefined\",\n      \"onLearnMore\": \"(() => void) | undefined\",\n      \"onSubmit\": \"((text: string) => void) | undefined\",\n      \"onUploadComplete\": \"((attachment: ComposerAttachment) => void) | undefined\",\n      \"onAllUploaded\": \"(() => void) | undefined\"\n    }\n  },\n  \"composer-attachments\": {\n    \"exportName\": \"ComposerAttachments\",\n    \"props\": {\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"onSend\": \"((message: ComposerMessage) => void) | undefined\",\n      \"showAttachments\": \"boolean | undefined\",\n      \"showPanel\": \"boolean | undefined\",\n      \"showLocalMessages\": \"boolean | undefined\",\n      \"simulateAttachments\": \"boolean | undefined\",\n      \"working\": \"boolean | undefined\",\n      \"loadingLight\": \"boolean | undefined\",\n      \"onStop\": \"(() => void) | undefined\",\n      \"placeholder\": \"string | undefined\",\n      \"value\": \"string | undefined\",\n      \"onValueChange\": \"((value: string) => void) | undefined\",\n      \"permission\": \"string | undefined\",\n      \"onPermissionChange\": \"((value: string) => void) | undefined\",\n      \"model\": \"string | undefined\",\n      \"onModelChange\": \"((value: string) => void) | undefined\",\n      \"effort\": \"number | undefined\",\n      \"onEffortChange\": \"((value: number) => void) | undefined\",\n      \"providers\": \"ComposerModelProvider[] | undefined\",\n      \"attachments\": \"ComposerAttachment[] | undefined\",\n      \"onRemoveAttachment\": \"((id: string) => void) | undefined\",\n      \"onAttachmentsChange\": \"((attachments: ComposerAttachment[]) => void) | undefined\",\n      \"uploadDuration\": \"number | undefined\",\n      \"uploadGap\": \"number | undefined\",\n      \"status\": \"ReactNode\",\n      \"inputRef\": \"Ref<HTMLTextAreaElement> | undefined\",\n      \"minRows\": \"number | undefined\",\n      \"maxRows\": \"number | undefined\",\n      \"defaultPermission\": \"string | undefined\",\n      \"learnMoreHref\": \"string | undefined\",\n      \"onLearnMore\": \"(() => void) | undefined\",\n      \"onSubmit\": \"((text: string) => void) | undefined\",\n      \"onUploadComplete\": \"((attachment: ComposerAttachment) => void) | undefined\",\n      \"onAllUploaded\": \"(() => void) | undefined\"\n    }\n  },\n  \"composer-loader\": {\n    \"exportName\": \"ComposerLoader\",\n    \"props\": {\n      \"disabled\": \"boolean | undefined\",\n      \"active\": \"boolean | undefined\",\n      \"onActiveChange\": \"((active: boolean) => void) | undefined\",\n      \"children\": \"ReactNode\",\n      \"colors\": \"string[] | undefined\",\n      \"speed\": \"number | undefined\",\n      \"arc\": \"number | undefined\",\n      \"intensity\": \"number | undefined\",\n      \"bloom\": \"number | undefined\",\n      \"bloomStrength\": \"number | undefined\",\n      \"reverse\": \"boolean | undefined\",\n      \"radius\": \"number | undefined\"\n    }\n  },\n  \"composer-panel\": {\n    \"exportName\": \"ComposerPanel\",\n    \"props\": {\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"onSend\": \"((message: ComposerMessage) => void) | undefined\",\n      \"showAttachments\": \"boolean | undefined\",\n      \"showPanel\": \"boolean | undefined\",\n      \"showLocalMessages\": \"boolean | undefined\",\n      \"simulateAttachments\": \"boolean | undefined\",\n      \"working\": \"boolean | undefined\",\n      \"loadingLight\": \"boolean | undefined\",\n      \"onStop\": \"(() => void) | undefined\",\n      \"placeholder\": \"string | undefined\",\n      \"value\": \"string | undefined\",\n      \"onValueChange\": \"((value: string) => void) | undefined\",\n      \"permission\": \"string | undefined\",\n      \"onPermissionChange\": \"((value: string) => void) | undefined\",\n      \"model\": \"string | undefined\",\n      \"onModelChange\": \"((value: string) => void) | undefined\",\n      \"effort\": \"number | undefined\",\n      \"onEffortChange\": \"((value: number) => void) | undefined\",\n      \"providers\": \"ComposerModelProvider[] | undefined\",\n      \"attachments\": \"ComposerAttachment[] | undefined\",\n      \"onRemoveAttachment\": \"((id: string) => void) | undefined\",\n      \"onAttachmentsChange\": \"((attachments: ComposerAttachment[]) => void) | undefined\",\n      \"uploadDuration\": \"number | undefined\",\n      \"uploadGap\": \"number | undefined\",\n      \"status\": \"ReactNode\",\n      \"inputRef\": \"Ref<HTMLTextAreaElement> | undefined\",\n      \"minRows\": \"number | undefined\",\n      \"maxRows\": \"number | undefined\",\n      \"defaultPermission\": \"string | undefined\",\n      \"learnMoreHref\": \"string | undefined\",\n      \"onLearnMore\": \"(() => void) | undefined\",\n      \"onSubmit\": \"((text: string) => void) | undefined\",\n      \"onUploadComplete\": \"((attachment: ComposerAttachment) => void) | undefined\",\n      \"onAllUploaded\": \"(() => void) | undefined\"\n    }\n  },\n  \"notification-center\": {\n    \"exportName\": \"NotificationCenter\",\n    \"props\": {\n      \"items\": \"CenterNotification[] | undefined\",\n      \"notifications\": \"CenterNotification[] | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"onChange\": \"((items: CenterNotification[]) => void) | undefined\",\n      \"tab\": \"string | undefined\",\n      \"defaultTab\": \"string | undefined\",\n      \"onTabChange\": \"((tab: string) => void) | undefined\",\n      \"onAction\": \"((actionId: string, item: CenterNotification) => void | Promise<void>) | undefined\"\n    }\n  },\n  \"questionnaire\": {\n    \"exportName\": \"Questionnaire\",\n    \"props\": {\n      \"otherAsChoice\": \"boolean | undefined\",\n      \"questions\": \"Question[] | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"onComplete\": \"((answers: Record<string, QuestionnaireAnswer>) => void) | undefined\",\n      \"step\": \"number | undefined\",\n      \"onStepChange\": \"((step: number) => void) | undefined\",\n      \"answers\": \"Record<string, QuestionnaireAnswer> | undefined\",\n      \"onAnswersChange\": \"((answers: Record<string, QuestionnaireAnswer>) => void) | undefined\",\n      \"defaultStep\": \"number | undefined\",\n      \"defaultAnswers\": \"Record<string, QuestionnaireAnswer> | undefined\",\n      \"autoAdvance\": \"boolean | undefined\",\n      \"advanceDelay\": \"number | undefined\",\n      \"onDismiss\": \"(() => void) | undefined\",\n      \"select\": \"\\\"multiple\\\" | \\\"single\\\" | undefined\",\n      \"labels\": \"Partial<Record<\\\"next\\\" | \\\"previous\\\" | \\\"done\\\" | \\\"other\\\" | \\\"otherPlaceholder\\\" | \\\"dismiss\\\" | \\\"review\\\" | \\\"reopen\\\" | \\\"complete\\\", string>> | undefined\"\n    }\n  },\n  \"task-list\": {\n    \"exportName\": \"TaskList\",\n    \"props\": {\n      \"items\": \"Task[] | undefined\",\n      \"tasks\": \"Task[] | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"onChange\": \"((tasks: Task[]) => void) | undefined\",\n      \"mode\": \"\\\"stream\\\" | \\\"editor\\\" | undefined\",\n      \"revealed\": \"number | undefined\",\n      \"suspended\": \"boolean | undefined\",\n      \"startDelay\": \"number | undefined\",\n      \"stepInterval\": \"number | undefined\",\n      \"autoRun\": \"boolean | undefined\",\n      \"collapseOnComplete\": \"boolean | \\\"all\\\" | undefined\",\n      \"onComplete\": \"(() => void) | undefined\",\n      \"initialRevealed\": \"number | undefined\"\n    }\n  },\n  \"web-search\": {\n    \"exportName\": \"WebSearch\",\n    \"props\": {\n      \"steps\": \"WebSearchStep[] | undefined\",\n      \"working\": \"string | false | undefined\",\n      \"startDelay\": \"number | undefined\",\n      \"suspended\": \"boolean | undefined\",\n      \"sources\": \"SearchSource[] | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"onSearch\": \"((query: string) => void) | undefined\",\n      \"revealed\": \"number | undefined\",\n      \"stepInterval\": \"number | undefined\",\n      \"autoRun\": \"boolean | undefined\",\n      \"onComplete\": \"(() => void) | undefined\"\n    }\n  },\n  \"multi-agent-chat\": {\n    \"exportName\": \"MultiAgentChat\",\n    \"props\": {\n      \"presentation\": \"\\\"interactive\\\" | \\\"source\\\" | undefined\",\n      \"mobileSidebar\": \"boolean | undefined\",\n      \"availableAgents\": \"AgentChatParticipant[] | undefined\",\n      \"sidebarActions\": \"ReactNode | ((controls: { startChat: (members?: AgentChatParticipant[] | undefined) => void; createAgent: () => void; closeSidebar: () => void; }) => ReactNode)\",\n      \"sidebarFooter\": \"ReactNode | ((controls: { clearSavedChat: () => void; storageEnabled: boolean; storageNote: string; closeSidebar: () => void; }) => ReactNode)\",\n      \"onEditorToggle\": \"((open: boolean, participant?: AgentChatParticipant | undefined) => void) | undefined\",\n      \"onMarketplace\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"conversations\": \"AgentConversation[] | undefined\",\n      \"threads\": \"AgentConversation[] | undefined\",\n      \"onThreadsChange\": \"((threads: AgentConversation[]) => void) | undefined\",\n      \"initialWorkspace\": \"AgentWorkspace | undefined\",\n      \"defaultEditorId\": \"string | null | undefined\",\n      \"storageKey\": \"string | null | undefined\",\n      \"onRespond\": \"((agent: AgentChatParticipant, messages: AgentChatMessage[], signal: AbortSignal) => string | Promise<string>) | undefined\"\n    }\n  },\n  \"activity-rings-card\": {\n    \"exportName\": \"ModernChart\",\n    \"props\": {\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"\\\"sm\\\" | \\\"md\\\" | \\\"lg\\\" | undefined\",\n      \"id\": \"string\",\n      \"presentation\": \"\\\"interactive\\\" | \\\"source\\\" | undefined\",\n      \"periodPresentation\": \"\\\"segmented\\\" | \\\"date\\\" | undefined\",\n      \"sourceDefaultLayout\": \"boolean | undefined\",\n      \"data\": \"(ChartDatum | ChartInputDatum)[] | undefined\",\n      \"series\": \"ChartSeries[] | undefined\",\n      \"bar\": \"ChartSeries | undefined\",\n      \"line\": \"ChartSeries | undefined\",\n      \"stages\": \"ChartStage[] | undefined\",\n      \"items\": \"ChartStage[] | undefined\",\n      \"tabs\": \"ChartListTab[] | undefined\",\n      \"rows\": \"ChartMatrixRow[] | undefined\",\n      \"columns\": \"string[] | undefined\",\n      \"nodes\": \"ChartFlowNode[] | undefined\",\n      \"links\": \"ChartFlowLink[] | undefined\",\n      \"max\": \"number | undefined\",\n      \"color\": \"string | undefined\",\n      \"metric\": \"\\\"value\\\" | \\\"share\\\" | undefined\",\n      \"tiles\": \"boolean | undefined\",\n      \"showIcons\": \"boolean | undefined\",\n      \"ranges\": \"ChartRange[] | undefined\",\n      \"range\": \"string | undefined\",\n      \"defaultRange\": \"string | undefined\",\n      \"onRangeChange\": \"((id: string, range: ChartRange) => void) | undefined\",\n      \"tab\": \"string | undefined\",\n      \"defaultTab\": \"string | undefined\",\n      \"onTabChange\": \"((id: string) => void) | undefined\",\n      \"headline\": \"string | number | undefined\",\n      \"delta\": \"number | undefined\",\n      \"onSelect\": \"((row: ChartDatum, index: number) => void) | undefined\",\n      \"title\": \"string | undefined\",\n      \"unit\": \"ChartUnit | undefined\",\n      \"shape\": \"\\\"curved\\\" | \\\"sharp\\\" | undefined\",\n      \"compact\": \"boolean | undefined\",\n      \"variant\": \"ChartVariant | undefined\",\n      \"mono\": \"boolean | undefined\",\n      \"limit\": \"number | undefined\",\n      \"bubble\": \"boolean | undefined\",\n      \"axisLabels\": \"[string, string] | undefined\",\n      \"defaultSelected\": \"number | undefined\"\n    }\n  },\n  \"area-chart-card\": {\n    \"exportName\": \"ModernChart\",\n    \"props\": {\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"\\\"sm\\\" | \\\"md\\\" | \\\"lg\\\" | undefined\",\n      \"id\": \"string\",\n      \"presentation\": \"\\\"interactive\\\" | \\\"source\\\" | undefined\",\n      \"periodPresentation\": \"\\\"segmented\\\" | \\\"date\\\" | undefined\",\n      \"sourceDefaultLayout\": \"boolean | undefined\",\n      \"data\": \"(ChartDatum | ChartInputDatum)[] | undefined\",\n      \"series\": \"ChartSeries[] | undefined\",\n      \"bar\": \"ChartSeries | undefined\",\n      \"line\": \"ChartSeries | undefined\",\n      \"stages\": \"ChartStage[] | undefined\",\n      \"items\": \"ChartStage[] | undefined\",\n      \"tabs\": \"ChartListTab[] | undefined\",\n      \"rows\": \"ChartMatrixRow[] | undefined\",\n      \"columns\": \"string[] | undefined\",\n      \"nodes\": \"ChartFlowNode[] | undefined\",\n      \"links\": \"ChartFlowLink[] | undefined\",\n      \"max\": \"number | undefined\",\n      \"color\": \"string | undefined\",\n      \"metric\": \"\\\"value\\\" | \\\"share\\\" | undefined\",\n      \"tiles\": \"boolean | undefined\",\n      \"showIcons\": \"boolean | undefined\",\n      \"ranges\": \"ChartRange[] | undefined\",\n      \"range\": \"string | undefined\",\n      \"defaultRange\": \"string | undefined\",\n      \"onRangeChange\": \"((id: string, range: ChartRange) => void) | undefined\",\n      \"tab\": \"string | undefined\",\n      \"defaultTab\": \"string | undefined\",\n      \"onTabChange\": \"((id: string) => void) | undefined\",\n      \"headline\": \"string | number | undefined\",\n      \"delta\": \"number | undefined\",\n      \"onSelect\": \"((row: ChartDatum, index: number) => void) | undefined\",\n      \"title\": \"string | undefined\",\n      \"unit\": \"ChartUnit | undefined\",\n      \"shape\": \"\\\"curved\\\" | \\\"sharp\\\" | undefined\",\n      \"compact\": \"boolean | undefined\",\n      \"variant\": \"ChartVariant | undefined\",\n      \"mono\": \"boolean | undefined\",\n      \"limit\": \"number | undefined\",\n      \"bubble\": \"boolean | undefined\",\n      \"axisLabels\": \"[string, string] | undefined\",\n      \"defaultSelected\": \"number | undefined\"\n    }\n  },\n  \"bar-list-card\": {\n    \"exportName\": \"ModernChart\",\n    \"props\": {\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"\\\"sm\\\" | \\\"md\\\" | \\\"lg\\\" | undefined\",\n      \"id\": \"string\",\n      \"presentation\": \"\\\"interactive\\\" | \\\"source\\\" | undefined\",\n      \"periodPresentation\": \"\\\"segmented\\\" | \\\"date\\\" | undefined\",\n      \"sourceDefaultLayout\": \"boolean | undefined\",\n      \"data\": \"(ChartDatum | ChartInputDatum)[] | undefined\",\n      \"series\": \"ChartSeries[] | undefined\",\n      \"bar\": \"ChartSeries | undefined\",\n      \"line\": \"ChartSeries | undefined\",\n      \"stages\": \"ChartStage[] | undefined\",\n      \"items\": \"ChartStage[] | undefined\",\n      \"tabs\": \"ChartListTab[] | undefined\",\n      \"rows\": \"ChartMatrixRow[] | undefined\",\n      \"columns\": \"string[] | undefined\",\n      \"nodes\": \"ChartFlowNode[] | undefined\",\n      \"links\": \"ChartFlowLink[] | undefined\",\n      \"max\": \"number | undefined\",\n      \"color\": \"string | undefined\",\n      \"metric\": \"\\\"value\\\" | \\\"share\\\" | undefined\",\n      \"tiles\": \"boolean | undefined\",\n      \"showIcons\": \"boolean | undefined\",\n      \"ranges\": \"ChartRange[] | undefined\",\n      \"range\": \"string | undefined\",\n      \"defaultRange\": \"string | undefined\",\n      \"onRangeChange\": \"((id: string, range: ChartRange) => void) | undefined\",\n      \"tab\": \"string | undefined\",\n      \"defaultTab\": \"string | undefined\",\n      \"onTabChange\": \"((id: string) => void) | undefined\",\n      \"headline\": \"string | number | undefined\",\n      \"delta\": \"number | undefined\",\n      \"onSelect\": \"((row: ChartDatum, index: number) => void) | undefined\",\n      \"title\": \"string | undefined\",\n      \"unit\": \"ChartUnit | undefined\",\n      \"shape\": \"\\\"curved\\\" | \\\"sharp\\\" | undefined\",\n      \"compact\": \"boolean | undefined\",\n      \"variant\": \"ChartVariant | undefined\",\n      \"mono\": \"boolean | undefined\",\n      \"limit\": \"number | undefined\",\n      \"bubble\": \"boolean | undefined\",\n      \"axisLabels\": \"[string, string] | undefined\",\n      \"defaultSelected\": \"number | undefined\"\n    }\n  },\n  \"combo-chart-card\": {\n    \"exportName\": \"ModernChart\",\n    \"props\": {\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"\\\"sm\\\" | \\\"md\\\" | \\\"lg\\\" | undefined\",\n      \"id\": \"string\",\n      \"presentation\": \"\\\"interactive\\\" | \\\"source\\\" | undefined\",\n      \"periodPresentation\": \"\\\"segmented\\\" | \\\"date\\\" | undefined\",\n      \"sourceDefaultLayout\": \"boolean | undefined\",\n      \"data\": \"(ChartDatum | ChartInputDatum)[] | undefined\",\n      \"series\": \"ChartSeries[] | undefined\",\n      \"bar\": \"ChartSeries | undefined\",\n      \"line\": \"ChartSeries | undefined\",\n      \"stages\": \"ChartStage[] | undefined\",\n      \"items\": \"ChartStage[] | undefined\",\n      \"tabs\": \"ChartListTab[] | undefined\",\n      \"rows\": \"ChartMatrixRow[] | undefined\",\n      \"columns\": \"string[] | undefined\",\n      \"nodes\": \"ChartFlowNode[] | undefined\",\n      \"links\": \"ChartFlowLink[] | undefined\",\n      \"max\": \"number | undefined\",\n      \"color\": \"string | undefined\",\n      \"metric\": \"\\\"value\\\" | \\\"share\\\" | undefined\",\n      \"tiles\": \"boolean | undefined\",\n      \"showIcons\": \"boolean | undefined\",\n      \"ranges\": \"ChartRange[] | undefined\",\n      \"range\": \"string | undefined\",\n      \"defaultRange\": \"string | undefined\",\n      \"onRangeChange\": \"((id: string, range: ChartRange) => void) | undefined\",\n      \"tab\": \"string | undefined\",\n      \"defaultTab\": \"string | undefined\",\n      \"onTabChange\": \"((id: string) => void) | undefined\",\n      \"headline\": \"string | number | undefined\",\n      \"delta\": \"number | undefined\",\n      \"onSelect\": \"((row: ChartDatum, index: number) => void) | undefined\",\n      \"title\": \"string | undefined\",\n      \"unit\": \"ChartUnit | undefined\",\n      \"shape\": \"\\\"curved\\\" | \\\"sharp\\\" | undefined\",\n      \"compact\": \"boolean | undefined\",\n      \"variant\": \"ChartVariant | undefined\",\n      \"mono\": \"boolean | undefined\",\n      \"limit\": \"number | undefined\",\n      \"bubble\": \"boolean | undefined\",\n      \"axisLabels\": \"[string, string] | undefined\",\n      \"defaultSelected\": \"number | undefined\"\n    }\n  },\n  \"contributions-card\": {\n    \"exportName\": \"ModernChart\",\n    \"props\": {\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"\\\"sm\\\" | \\\"md\\\" | \\\"lg\\\" | undefined\",\n      \"id\": \"string\",\n      \"presentation\": \"\\\"interactive\\\" | \\\"source\\\" | undefined\",\n      \"periodPresentation\": \"\\\"segmented\\\" | \\\"date\\\" | undefined\",\n      \"sourceDefaultLayout\": \"boolean | undefined\",\n      \"data\": \"(ChartDatum | ChartInputDatum)[] | undefined\",\n      \"series\": \"ChartSeries[] | undefined\",\n      \"bar\": \"ChartSeries | undefined\",\n      \"line\": \"ChartSeries | undefined\",\n      \"stages\": \"ChartStage[] | undefined\",\n      \"items\": \"ChartStage[] | undefined\",\n      \"tabs\": \"ChartListTab[] | undefined\",\n      \"rows\": \"ChartMatrixRow[] | undefined\",\n      \"columns\": \"string[] | undefined\",\n      \"nodes\": \"ChartFlowNode[] | undefined\",\n      \"links\": \"ChartFlowLink[] | undefined\",\n      \"max\": \"number | undefined\",\n      \"color\": \"string | undefined\",\n      \"metric\": \"\\\"value\\\" | \\\"share\\\" | undefined\",\n      \"tiles\": \"boolean | undefined\",\n      \"showIcons\": \"boolean | undefined\",\n      \"ranges\": \"ChartRange[] | undefined\",\n      \"range\": \"string | undefined\",\n      \"defaultRange\": \"string | undefined\",\n      \"onRangeChange\": \"((id: string, range: ChartRange) => void) | undefined\",\n      \"tab\": \"string | undefined\",\n      \"defaultTab\": \"string | undefined\",\n      \"onTabChange\": \"((id: string) => void) | undefined\",\n      \"headline\": \"string | number | undefined\",\n      \"delta\": \"number | undefined\",\n      \"onSelect\": \"((row: ChartDatum, index: number) => void) | undefined\",\n      \"title\": \"string | undefined\",\n      \"unit\": \"ChartUnit | undefined\",\n      \"shape\": \"\\\"curved\\\" | \\\"sharp\\\" | undefined\",\n      \"compact\": \"boolean | undefined\",\n      \"variant\": \"ChartVariant | undefined\",\n      \"mono\": \"boolean | undefined\",\n      \"limit\": \"number | undefined\",\n      \"bubble\": \"boolean | undefined\",\n      \"axisLabels\": \"[string, string] | undefined\",\n      \"defaultSelected\": \"number | undefined\"\n    }\n  },\n  \"earnings-chart-card\": {\n    \"exportName\": \"ModernChart\",\n    \"props\": {\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"\\\"sm\\\" | \\\"md\\\" | \\\"lg\\\" | undefined\",\n      \"id\": \"string\",\n      \"presentation\": \"\\\"interactive\\\" | \\\"source\\\" | undefined\",\n      \"periodPresentation\": \"\\\"segmented\\\" | \\\"date\\\" | undefined\",\n      \"sourceDefaultLayout\": \"boolean | undefined\",\n      \"data\": \"(ChartDatum | ChartInputDatum)[] | undefined\",\n      \"series\": \"ChartSeries[] | undefined\",\n      \"bar\": \"ChartSeries | undefined\",\n      \"line\": \"ChartSeries | undefined\",\n      \"stages\": \"ChartStage[] | undefined\",\n      \"items\": \"ChartStage[] | undefined\",\n      \"tabs\": \"ChartListTab[] | undefined\",\n      \"rows\": \"ChartMatrixRow[] | undefined\",\n      \"columns\": \"string[] | undefined\",\n      \"nodes\": \"ChartFlowNode[] | undefined\",\n      \"links\": \"ChartFlowLink[] | undefined\",\n      \"max\": \"number | undefined\",\n      \"color\": \"string | undefined\",\n      \"metric\": \"\\\"value\\\" | \\\"share\\\" | undefined\",\n      \"tiles\": \"boolean | undefined\",\n      \"showIcons\": \"boolean | undefined\",\n      \"ranges\": \"ChartRange[] | undefined\",\n      \"range\": \"string | undefined\",\n      \"defaultRange\": \"string | undefined\",\n      \"onRangeChange\": \"((id: string, range: ChartRange) => void) | undefined\",\n      \"tab\": \"string | undefined\",\n      \"defaultTab\": \"string | undefined\",\n      \"onTabChange\": \"((id: string) => void) | undefined\",\n      \"headline\": \"string | number | undefined\",\n      \"delta\": \"number | undefined\",\n      \"onSelect\": \"((row: ChartDatum, index: number) => void) | undefined\",\n      \"title\": \"string | undefined\",\n      \"unit\": \"ChartUnit | undefined\",\n      \"shape\": \"\\\"curved\\\" | \\\"sharp\\\" | undefined\",\n      \"compact\": \"boolean | undefined\",\n      \"variant\": \"ChartVariant | undefined\",\n      \"mono\": \"boolean | undefined\",\n      \"limit\": \"number | undefined\",\n      \"bubble\": \"boolean | undefined\",\n      \"axisLabels\": \"[string, string] | undefined\",\n      \"defaultSelected\": \"number | undefined\"\n    }\n  },\n  \"funnel-chart-card\": {\n    \"exportName\": \"ModernChart\",\n    \"props\": {\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"\\\"sm\\\" | \\\"md\\\" | \\\"lg\\\" | undefined\",\n      \"id\": \"string\",\n      \"presentation\": \"\\\"interactive\\\" | \\\"source\\\" | undefined\",\n      \"periodPresentation\": \"\\\"segmented\\\" | \\\"date\\\" | undefined\",\n      \"sourceDefaultLayout\": \"boolean | undefined\",\n      \"data\": \"(ChartDatum | ChartInputDatum)[] | undefined\",\n      \"series\": \"ChartSeries[] | undefined\",\n      \"bar\": \"ChartSeries | undefined\",\n      \"line\": \"ChartSeries | undefined\",\n      \"stages\": \"ChartStage[] | undefined\",\n      \"items\": \"ChartStage[] | undefined\",\n      \"tabs\": \"ChartListTab[] | undefined\",\n      \"rows\": \"ChartMatrixRow[] | undefined\",\n      \"columns\": \"string[] | undefined\",\n      \"nodes\": \"ChartFlowNode[] | undefined\",\n      \"links\": \"ChartFlowLink[] | undefined\",\n      \"max\": \"number | undefined\",\n      \"color\": \"string | undefined\",\n      \"metric\": \"\\\"value\\\" | \\\"share\\\" | undefined\",\n      \"tiles\": \"boolean | undefined\",\n      \"showIcons\": \"boolean | undefined\",\n      \"ranges\": \"ChartRange[] | undefined\",\n      \"range\": \"string | undefined\",\n      \"defaultRange\": \"string | undefined\",\n      \"onRangeChange\": \"((id: string, range: ChartRange) => void) | undefined\",\n      \"tab\": \"string | undefined\",\n      \"defaultTab\": \"string | undefined\",\n      \"onTabChange\": \"((id: string) => void) | undefined\",\n      \"headline\": \"string | number | undefined\",\n      \"delta\": \"number | undefined\",\n      \"onSelect\": \"((row: ChartDatum, index: number) => void) | undefined\",\n      \"title\": \"string | undefined\",\n      \"unit\": \"ChartUnit | undefined\",\n      \"shape\": \"\\\"curved\\\" | \\\"sharp\\\" | undefined\",\n      \"compact\": \"boolean | undefined\",\n      \"variant\": \"ChartVariant | undefined\",\n      \"mono\": \"boolean | undefined\",\n      \"limit\": \"number | undefined\",\n      \"bubble\": \"boolean | undefined\",\n      \"axisLabels\": \"[string, string] | undefined\",\n      \"defaultSelected\": \"number | undefined\"\n    }\n  },\n  \"heatmap-chart-card\": {\n    \"exportName\": \"ModernChart\",\n    \"props\": {\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"\\\"sm\\\" | \\\"md\\\" | \\\"lg\\\" | undefined\",\n      \"id\": \"string\",\n      \"presentation\": \"\\\"interactive\\\" | \\\"source\\\" | undefined\",\n      \"periodPresentation\": \"\\\"segmented\\\" | \\\"date\\\" | undefined\",\n      \"sourceDefaultLayout\": \"boolean | undefined\",\n      \"data\": \"(ChartDatum | ChartInputDatum)[] | undefined\",\n      \"series\": \"ChartSeries[] | undefined\",\n      \"bar\": \"ChartSeries | undefined\",\n      \"line\": \"ChartSeries | undefined\",\n      \"stages\": \"ChartStage[] | undefined\",\n      \"items\": \"ChartStage[] | undefined\",\n      \"tabs\": \"ChartListTab[] | undefined\",\n      \"rows\": \"ChartMatrixRow[] | undefined\",\n      \"columns\": \"string[] | undefined\",\n      \"nodes\": \"ChartFlowNode[] | undefined\",\n      \"links\": \"ChartFlowLink[] | undefined\",\n      \"max\": \"number | undefined\",\n      \"color\": \"string | undefined\",\n      \"metric\": \"\\\"value\\\" | \\\"share\\\" | undefined\",\n      \"tiles\": \"boolean | undefined\",\n      \"showIcons\": \"boolean | undefined\",\n      \"ranges\": \"ChartRange[] | undefined\",\n      \"range\": \"string | undefined\",\n      \"defaultRange\": \"string | undefined\",\n      \"onRangeChange\": \"((id: string, range: ChartRange) => void) | undefined\",\n      \"tab\": \"string | undefined\",\n      \"defaultTab\": \"string | undefined\",\n      \"onTabChange\": \"((id: string) => void) | undefined\",\n      \"headline\": \"string | number | undefined\",\n      \"delta\": \"number | undefined\",\n      \"onSelect\": \"((row: ChartDatum, index: number) => void) | undefined\",\n      \"title\": \"string | undefined\",\n      \"unit\": \"ChartUnit | undefined\",\n      \"shape\": \"\\\"curved\\\" | \\\"sharp\\\" | undefined\",\n      \"compact\": \"boolean | undefined\",\n      \"variant\": \"ChartVariant | undefined\",\n      \"mono\": \"boolean | undefined\",\n      \"limit\": \"number | undefined\",\n      \"bubble\": \"boolean | undefined\",\n      \"axisLabels\": \"[string, string] | undefined\",\n      \"defaultSelected\": \"number | undefined\"\n    }\n  },\n  \"line-chart-card\": {\n    \"exportName\": \"ModernChart\",\n    \"props\": {\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"\\\"sm\\\" | \\\"md\\\" | \\\"lg\\\" | undefined\",\n      \"id\": \"string\",\n      \"presentation\": \"\\\"interactive\\\" | \\\"source\\\" | undefined\",\n      \"periodPresentation\": \"\\\"segmented\\\" | \\\"date\\\" | undefined\",\n      \"sourceDefaultLayout\": \"boolean | undefined\",\n      \"data\": \"(ChartDatum | ChartInputDatum)[] | undefined\",\n      \"series\": \"ChartSeries[] | undefined\",\n      \"bar\": \"ChartSeries | undefined\",\n      \"line\": \"ChartSeries | undefined\",\n      \"stages\": \"ChartStage[] | undefined\",\n      \"items\": \"ChartStage[] | undefined\",\n      \"tabs\": \"ChartListTab[] | undefined\",\n      \"rows\": \"ChartMatrixRow[] | undefined\",\n      \"columns\": \"string[] | undefined\",\n      \"nodes\": \"ChartFlowNode[] | undefined\",\n      \"links\": \"ChartFlowLink[] | undefined\",\n      \"max\": \"number | undefined\",\n      \"color\": \"string | undefined\",\n      \"metric\": \"\\\"value\\\" | \\\"share\\\" | undefined\",\n      \"tiles\": \"boolean | undefined\",\n      \"showIcons\": \"boolean | undefined\",\n      \"ranges\": \"ChartRange[] | undefined\",\n      \"range\": \"string | undefined\",\n      \"defaultRange\": \"string | undefined\",\n      \"onRangeChange\": \"((id: string, range: ChartRange) => void) | undefined\",\n      \"tab\": \"string | undefined\",\n      \"defaultTab\": \"string | undefined\",\n      \"onTabChange\": \"((id: string) => void) | undefined\",\n      \"headline\": \"string | number | undefined\",\n      \"delta\": \"number | undefined\",\n      \"onSelect\": \"((row: ChartDatum, index: number) => void) | undefined\",\n      \"title\": \"string | undefined\",\n      \"unit\": \"ChartUnit | undefined\",\n      \"shape\": \"\\\"curved\\\" | \\\"sharp\\\" | undefined\",\n      \"compact\": \"boolean | undefined\",\n      \"variant\": \"ChartVariant | undefined\",\n      \"mono\": \"boolean | undefined\",\n      \"limit\": \"number | undefined\",\n      \"bubble\": \"boolean | undefined\",\n      \"axisLabels\": \"[string, string] | undefined\",\n      \"defaultSelected\": \"number | undefined\"\n    }\n  },\n  \"most-active-days-card\": {\n    \"exportName\": \"ModernChart\",\n    \"props\": {\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"\\\"sm\\\" | \\\"md\\\" | \\\"lg\\\" | undefined\",\n      \"id\": \"string\",\n      \"presentation\": \"\\\"interactive\\\" | \\\"source\\\" | undefined\",\n      \"periodPresentation\": \"\\\"segmented\\\" | \\\"date\\\" | undefined\",\n      \"sourceDefaultLayout\": \"boolean | undefined\",\n      \"data\": \"(ChartDatum | ChartInputDatum)[] | undefined\",\n      \"series\": \"ChartSeries[] | undefined\",\n      \"bar\": \"ChartSeries | undefined\",\n      \"line\": \"ChartSeries | undefined\",\n      \"stages\": \"ChartStage[] | undefined\",\n      \"items\": \"ChartStage[] | undefined\",\n      \"tabs\": \"ChartListTab[] | undefined\",\n      \"rows\": \"ChartMatrixRow[] | undefined\",\n      \"columns\": \"string[] | undefined\",\n      \"nodes\": \"ChartFlowNode[] | undefined\",\n      \"links\": \"ChartFlowLink[] | undefined\",\n      \"max\": \"number | undefined\",\n      \"color\": \"string | undefined\",\n      \"metric\": \"\\\"value\\\" | \\\"share\\\" | undefined\",\n      \"tiles\": \"boolean | undefined\",\n      \"showIcons\": \"boolean | undefined\",\n      \"ranges\": \"ChartRange[] | undefined\",\n      \"range\": \"string | undefined\",\n      \"defaultRange\": \"string | undefined\",\n      \"onRangeChange\": \"((id: string, range: ChartRange) => void) | undefined\",\n      \"tab\": \"string | undefined\",\n      \"defaultTab\": \"string | undefined\",\n      \"onTabChange\": \"((id: string) => void) | undefined\",\n      \"headline\": \"string | number | undefined\",\n      \"delta\": \"number | undefined\",\n      \"onSelect\": \"((row: ChartDatum, index: number) => void) | undefined\",\n      \"title\": \"string | undefined\",\n      \"unit\": \"ChartUnit | undefined\",\n      \"shape\": \"\\\"curved\\\" | \\\"sharp\\\" | undefined\",\n      \"compact\": \"boolean | undefined\",\n      \"variant\": \"ChartVariant | undefined\",\n      \"mono\": \"boolean | undefined\",\n      \"limit\": \"number | undefined\",\n      \"bubble\": \"boolean | undefined\",\n      \"axisLabels\": \"[string, string] | undefined\",\n      \"defaultSelected\": \"number | undefined\"\n    }\n  },\n  \"orders-chart-card\": {\n    \"exportName\": \"ModernChart\",\n    \"props\": {\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"\\\"sm\\\" | \\\"md\\\" | \\\"lg\\\" | undefined\",\n      \"id\": \"string\",\n      \"presentation\": \"\\\"interactive\\\" | \\\"source\\\" | undefined\",\n      \"periodPresentation\": \"\\\"segmented\\\" | \\\"date\\\" | undefined\",\n      \"sourceDefaultLayout\": \"boolean | undefined\",\n      \"data\": \"(ChartDatum | ChartInputDatum)[] | undefined\",\n      \"series\": \"ChartSeries[] | undefined\",\n      \"bar\": \"ChartSeries | undefined\",\n      \"line\": \"ChartSeries | undefined\",\n      \"stages\": \"ChartStage[] | undefined\",\n      \"items\": \"ChartStage[] | undefined\",\n      \"tabs\": \"ChartListTab[] | undefined\",\n      \"rows\": \"ChartMatrixRow[] | undefined\",\n      \"columns\": \"string[] | undefined\",\n      \"nodes\": \"ChartFlowNode[] | undefined\",\n      \"links\": \"ChartFlowLink[] | undefined\",\n      \"max\": \"number | undefined\",\n      \"color\": \"string | undefined\",\n      \"metric\": \"\\\"value\\\" | \\\"share\\\" | undefined\",\n      \"tiles\": \"boolean | undefined\",\n      \"showIcons\": \"boolean | undefined\",\n      \"ranges\": \"ChartRange[] | undefined\",\n      \"range\": \"string | undefined\",\n      \"defaultRange\": \"string | undefined\",\n      \"onRangeChange\": \"((id: string, range: ChartRange) => void) | undefined\",\n      \"tab\": \"string | undefined\",\n      \"defaultTab\": \"string | undefined\",\n      \"onTabChange\": \"((id: string) => void) | undefined\",\n      \"headline\": \"string | number | undefined\",\n      \"delta\": \"number | undefined\",\n      \"onSelect\": \"((row: ChartDatum, index: number) => void) | undefined\",\n      \"title\": \"string | undefined\",\n      \"unit\": \"ChartUnit | undefined\",\n      \"shape\": \"\\\"curved\\\" | \\\"sharp\\\" | undefined\",\n      \"compact\": \"boolean | undefined\",\n      \"variant\": \"ChartVariant | undefined\",\n      \"mono\": \"boolean | undefined\",\n      \"limit\": \"number | undefined\",\n      \"bubble\": \"boolean | undefined\",\n      \"axisLabels\": \"[string, string] | undefined\",\n      \"defaultSelected\": \"number | undefined\"\n    }\n  },\n  \"radar-chart-card\": {\n    \"exportName\": \"ModernChart\",\n    \"props\": {\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"\\\"sm\\\" | \\\"md\\\" | \\\"lg\\\" | undefined\",\n      \"id\": \"string\",\n      \"presentation\": \"\\\"interactive\\\" | \\\"source\\\" | undefined\",\n      \"periodPresentation\": \"\\\"segmented\\\" | \\\"date\\\" | undefined\",\n      \"sourceDefaultLayout\": \"boolean | undefined\",\n      \"data\": \"(ChartDatum | ChartInputDatum)[] | undefined\",\n      \"series\": \"ChartSeries[] | undefined\",\n      \"bar\": \"ChartSeries | undefined\",\n      \"line\": \"ChartSeries | undefined\",\n      \"stages\": \"ChartStage[] | undefined\",\n      \"items\": \"ChartStage[] | undefined\",\n      \"tabs\": \"ChartListTab[] | undefined\",\n      \"rows\": \"ChartMatrixRow[] | undefined\",\n      \"columns\": \"string[] | undefined\",\n      \"nodes\": \"ChartFlowNode[] | undefined\",\n      \"links\": \"ChartFlowLink[] | undefined\",\n      \"max\": \"number | undefined\",\n      \"color\": \"string | undefined\",\n      \"metric\": \"\\\"value\\\" | \\\"share\\\" | undefined\",\n      \"tiles\": \"boolean | undefined\",\n      \"showIcons\": \"boolean | undefined\",\n      \"ranges\": \"ChartRange[] | undefined\",\n      \"range\": \"string | undefined\",\n      \"defaultRange\": \"string | undefined\",\n      \"onRangeChange\": \"((id: string, range: ChartRange) => void) | undefined\",\n      \"tab\": \"string | undefined\",\n      \"defaultTab\": \"string | undefined\",\n      \"onTabChange\": \"((id: string) => void) | undefined\",\n      \"headline\": \"string | number | undefined\",\n      \"delta\": \"number | undefined\",\n      \"onSelect\": \"((row: ChartDatum, index: number) => void) | undefined\",\n      \"title\": \"string | undefined\",\n      \"unit\": \"ChartUnit | undefined\",\n      \"shape\": \"\\\"curved\\\" | \\\"sharp\\\" | undefined\",\n      \"compact\": \"boolean | undefined\",\n      \"variant\": \"ChartVariant | undefined\",\n      \"mono\": \"boolean | undefined\",\n      \"limit\": \"number | undefined\",\n      \"bubble\": \"boolean | undefined\",\n      \"axisLabels\": \"[string, string] | undefined\",\n      \"defaultSelected\": \"number | undefined\"\n    }\n  },\n  \"radial-chart-card\": {\n    \"exportName\": \"ModernChart\",\n    \"props\": {\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"\\\"sm\\\" | \\\"md\\\" | \\\"lg\\\" | undefined\",\n      \"id\": \"string\",\n      \"presentation\": \"\\\"interactive\\\" | \\\"source\\\" | undefined\",\n      \"periodPresentation\": \"\\\"segmented\\\" | \\\"date\\\" | undefined\",\n      \"sourceDefaultLayout\": \"boolean | undefined\",\n      \"data\": \"(ChartDatum | ChartInputDatum)[] | undefined\",\n      \"series\": \"ChartSeries[] | undefined\",\n      \"bar\": \"ChartSeries | undefined\",\n      \"line\": \"ChartSeries | undefined\",\n      \"stages\": \"ChartStage[] | undefined\",\n      \"items\": \"ChartStage[] | undefined\",\n      \"tabs\": \"ChartListTab[] | undefined\",\n      \"rows\": \"ChartMatrixRow[] | undefined\",\n      \"columns\": \"string[] | undefined\",\n      \"nodes\": \"ChartFlowNode[] | undefined\",\n      \"links\": \"ChartFlowLink[] | undefined\",\n      \"max\": \"number | undefined\",\n      \"color\": \"string | undefined\",\n      \"metric\": \"\\\"value\\\" | \\\"share\\\" | undefined\",\n      \"tiles\": \"boolean | undefined\",\n      \"showIcons\": \"boolean | undefined\",\n      \"ranges\": \"ChartRange[] | undefined\",\n      \"range\": \"string | undefined\",\n      \"defaultRange\": \"string | undefined\",\n      \"onRangeChange\": \"((id: string, range: ChartRange) => void) | undefined\",\n      \"tab\": \"string | undefined\",\n      \"defaultTab\": \"string | undefined\",\n      \"onTabChange\": \"((id: string) => void) | undefined\",\n      \"headline\": \"string | number | undefined\",\n      \"delta\": \"number | undefined\",\n      \"onSelect\": \"((row: ChartDatum, index: number) => void) | undefined\",\n      \"title\": \"string | undefined\",\n      \"unit\": \"ChartUnit | undefined\",\n      \"shape\": \"\\\"curved\\\" | \\\"sharp\\\" | undefined\",\n      \"compact\": \"boolean | undefined\",\n      \"variant\": \"ChartVariant | undefined\",\n      \"mono\": \"boolean | undefined\",\n      \"limit\": \"number | undefined\",\n      \"bubble\": \"boolean | undefined\",\n      \"axisLabels\": \"[string, string] | undefined\",\n      \"defaultSelected\": \"number | undefined\"\n    }\n  },\n  \"revenue-chart-card\": {\n    \"exportName\": \"ModernChart\",\n    \"props\": {\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"\\\"sm\\\" | \\\"md\\\" | \\\"lg\\\" | undefined\",\n      \"id\": \"string\",\n      \"presentation\": \"\\\"interactive\\\" | \\\"source\\\" | undefined\",\n      \"periodPresentation\": \"\\\"segmented\\\" | \\\"date\\\" | undefined\",\n      \"sourceDefaultLayout\": \"boolean | undefined\",\n      \"data\": \"(ChartDatum | ChartInputDatum)[] | undefined\",\n      \"series\": \"ChartSeries[] | undefined\",\n      \"bar\": \"ChartSeries | undefined\",\n      \"line\": \"ChartSeries | undefined\",\n      \"stages\": \"ChartStage[] | undefined\",\n      \"items\": \"ChartStage[] | undefined\",\n      \"tabs\": \"ChartListTab[] | undefined\",\n      \"rows\": \"ChartMatrixRow[] | undefined\",\n      \"columns\": \"string[] | undefined\",\n      \"nodes\": \"ChartFlowNode[] | undefined\",\n      \"links\": \"ChartFlowLink[] | undefined\",\n      \"max\": \"number | undefined\",\n      \"color\": \"string | undefined\",\n      \"metric\": \"\\\"value\\\" | \\\"share\\\" | undefined\",\n      \"tiles\": \"boolean | undefined\",\n      \"showIcons\": \"boolean | undefined\",\n      \"ranges\": \"ChartRange[] | undefined\",\n      \"range\": \"string | undefined\",\n      \"defaultRange\": \"string | undefined\",\n      \"onRangeChange\": \"((id: string, range: ChartRange) => void) | undefined\",\n      \"tab\": \"string | undefined\",\n      \"defaultTab\": \"string | undefined\",\n      \"onTabChange\": \"((id: string) => void) | undefined\",\n      \"headline\": \"string | number | undefined\",\n      \"delta\": \"number | undefined\",\n      \"onSelect\": \"((row: ChartDatum, index: number) => void) | undefined\",\n      \"title\": \"string | undefined\",\n      \"unit\": \"ChartUnit | undefined\",\n      \"shape\": \"\\\"curved\\\" | \\\"sharp\\\" | undefined\",\n      \"compact\": \"boolean | undefined\",\n      \"variant\": \"ChartVariant | undefined\",\n      \"mono\": \"boolean | undefined\",\n      \"limit\": \"number | undefined\",\n      \"bubble\": \"boolean | undefined\",\n      \"axisLabels\": \"[string, string] | undefined\",\n      \"defaultSelected\": \"number | undefined\"\n    }\n  },\n  \"sankey-chart-card\": {\n    \"exportName\": \"ModernChart\",\n    \"props\": {\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"\\\"sm\\\" | \\\"md\\\" | \\\"lg\\\" | undefined\",\n      \"id\": \"string\",\n      \"presentation\": \"\\\"interactive\\\" | \\\"source\\\" | undefined\",\n      \"periodPresentation\": \"\\\"segmented\\\" | \\\"date\\\" | undefined\",\n      \"sourceDefaultLayout\": \"boolean | undefined\",\n      \"data\": \"(ChartDatum | ChartInputDatum)[] | undefined\",\n      \"series\": \"ChartSeries[] | undefined\",\n      \"bar\": \"ChartSeries | undefined\",\n      \"line\": \"ChartSeries | undefined\",\n      \"stages\": \"ChartStage[] | undefined\",\n      \"items\": \"ChartStage[] | undefined\",\n      \"tabs\": \"ChartListTab[] | undefined\",\n      \"rows\": \"ChartMatrixRow[] | undefined\",\n      \"columns\": \"string[] | undefined\",\n      \"nodes\": \"ChartFlowNode[] | undefined\",\n      \"links\": \"ChartFlowLink[] | undefined\",\n      \"max\": \"number | undefined\",\n      \"color\": \"string | undefined\",\n      \"metric\": \"\\\"value\\\" | \\\"share\\\" | undefined\",\n      \"tiles\": \"boolean | undefined\",\n      \"showIcons\": \"boolean | undefined\",\n      \"ranges\": \"ChartRange[] | undefined\",\n      \"range\": \"string | undefined\",\n      \"defaultRange\": \"string | undefined\",\n      \"onRangeChange\": \"((id: string, range: ChartRange) => void) | undefined\",\n      \"tab\": \"string | undefined\",\n      \"defaultTab\": \"string | undefined\",\n      \"onTabChange\": \"((id: string) => void) | undefined\",\n      \"headline\": \"string | number | undefined\",\n      \"delta\": \"number | undefined\",\n      \"onSelect\": \"((row: ChartDatum, index: number) => void) | undefined\",\n      \"title\": \"string | undefined\",\n      \"unit\": \"ChartUnit | undefined\",\n      \"shape\": \"\\\"curved\\\" | \\\"sharp\\\" | undefined\",\n      \"compact\": \"boolean | undefined\",\n      \"variant\": \"ChartVariant | undefined\",\n      \"mono\": \"boolean | undefined\",\n      \"limit\": \"number | undefined\",\n      \"bubble\": \"boolean | undefined\",\n      \"axisLabels\": \"[string, string] | undefined\",\n      \"defaultSelected\": \"number | undefined\"\n    }\n  },\n  \"scatter-chart-card\": {\n    \"exportName\": \"ModernChart\",\n    \"props\": {\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"\\\"sm\\\" | \\\"md\\\" | \\\"lg\\\" | undefined\",\n      \"id\": \"string\",\n      \"presentation\": \"\\\"interactive\\\" | \\\"source\\\" | undefined\",\n      \"periodPresentation\": \"\\\"segmented\\\" | \\\"date\\\" | undefined\",\n      \"sourceDefaultLayout\": \"boolean | undefined\",\n      \"data\": \"(ChartDatum | ChartInputDatum)[] | undefined\",\n      \"series\": \"ChartSeries[] | undefined\",\n      \"bar\": \"ChartSeries | undefined\",\n      \"line\": \"ChartSeries | undefined\",\n      \"stages\": \"ChartStage[] | undefined\",\n      \"items\": \"ChartStage[] | undefined\",\n      \"tabs\": \"ChartListTab[] | undefined\",\n      \"rows\": \"ChartMatrixRow[] | undefined\",\n      \"columns\": \"string[] | undefined\",\n      \"nodes\": \"ChartFlowNode[] | undefined\",\n      \"links\": \"ChartFlowLink[] | undefined\",\n      \"max\": \"number | undefined\",\n      \"color\": \"string | undefined\",\n      \"metric\": \"\\\"value\\\" | \\\"share\\\" | undefined\",\n      \"tiles\": \"boolean | undefined\",\n      \"showIcons\": \"boolean | undefined\",\n      \"ranges\": \"ChartRange[] | undefined\",\n      \"range\": \"string | undefined\",\n      \"defaultRange\": \"string | undefined\",\n      \"onRangeChange\": \"((id: string, range: ChartRange) => void) | undefined\",\n      \"tab\": \"string | undefined\",\n      \"defaultTab\": \"string | undefined\",\n      \"onTabChange\": \"((id: string) => void) | undefined\",\n      \"headline\": \"string | number | undefined\",\n      \"delta\": \"number | undefined\",\n      \"onSelect\": \"((row: ChartDatum, index: number) => void) | undefined\",\n      \"title\": \"string | undefined\",\n      \"unit\": \"ChartUnit | undefined\",\n      \"shape\": \"\\\"curved\\\" | \\\"sharp\\\" | undefined\",\n      \"compact\": \"boolean | undefined\",\n      \"variant\": \"ChartVariant | undefined\",\n      \"mono\": \"boolean | undefined\",\n      \"limit\": \"number | undefined\",\n      \"bubble\": \"boolean | undefined\",\n      \"axisLabels\": \"[string, string] | undefined\",\n      \"defaultSelected\": \"number | undefined\"\n    }\n  },\n  \"sleep-score-card\": {\n    \"exportName\": \"ModernChart\",\n    \"props\": {\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"\\\"sm\\\" | \\\"md\\\" | \\\"lg\\\" | undefined\",\n      \"id\": \"string\",\n      \"presentation\": \"\\\"interactive\\\" | \\\"source\\\" | undefined\",\n      \"periodPresentation\": \"\\\"segmented\\\" | \\\"date\\\" | undefined\",\n      \"sourceDefaultLayout\": \"boolean | undefined\",\n      \"data\": \"(ChartDatum | ChartInputDatum)[] | undefined\",\n      \"series\": \"ChartSeries[] | undefined\",\n      \"bar\": \"ChartSeries | undefined\",\n      \"line\": \"ChartSeries | undefined\",\n      \"stages\": \"ChartStage[] | undefined\",\n      \"items\": \"ChartStage[] | undefined\",\n      \"tabs\": \"ChartListTab[] | undefined\",\n      \"rows\": \"ChartMatrixRow[] | undefined\",\n      \"columns\": \"string[] | undefined\",\n      \"nodes\": \"ChartFlowNode[] | undefined\",\n      \"links\": \"ChartFlowLink[] | undefined\",\n      \"max\": \"number | undefined\",\n      \"color\": \"string | undefined\",\n      \"metric\": \"\\\"value\\\" | \\\"share\\\" | undefined\",\n      \"tiles\": \"boolean | undefined\",\n      \"showIcons\": \"boolean | undefined\",\n      \"ranges\": \"ChartRange[] | undefined\",\n      \"range\": \"string | undefined\",\n      \"defaultRange\": \"string | undefined\",\n      \"onRangeChange\": \"((id: string, range: ChartRange) => void) | undefined\",\n      \"tab\": \"string | undefined\",\n      \"defaultTab\": \"string | undefined\",\n      \"onTabChange\": \"((id: string) => void) | undefined\",\n      \"headline\": \"string | number | undefined\",\n      \"delta\": \"number | undefined\",\n      \"onSelect\": \"((row: ChartDatum, index: number) => void) | undefined\",\n      \"title\": \"string | undefined\",\n      \"unit\": \"ChartUnit | undefined\",\n      \"shape\": \"\\\"curved\\\" | \\\"sharp\\\" | undefined\",\n      \"compact\": \"boolean | undefined\",\n      \"variant\": \"ChartVariant | undefined\",\n      \"mono\": \"boolean | undefined\",\n      \"limit\": \"number | undefined\",\n      \"bubble\": \"boolean | undefined\",\n      \"axisLabels\": \"[string, string] | undefined\",\n      \"defaultSelected\": \"number | undefined\"\n    }\n  },\n  \"stage-bars-card\": {\n    \"exportName\": \"ModernChart\",\n    \"props\": {\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"\\\"sm\\\" | \\\"md\\\" | \\\"lg\\\" | undefined\",\n      \"id\": \"string\",\n      \"presentation\": \"\\\"interactive\\\" | \\\"source\\\" | undefined\",\n      \"periodPresentation\": \"\\\"segmented\\\" | \\\"date\\\" | undefined\",\n      \"sourceDefaultLayout\": \"boolean | undefined\",\n      \"data\": \"(ChartDatum | ChartInputDatum)[] | undefined\",\n      \"series\": \"ChartSeries[] | undefined\",\n      \"bar\": \"ChartSeries | undefined\",\n      \"line\": \"ChartSeries | undefined\",\n      \"stages\": \"ChartStage[] | undefined\",\n      \"items\": \"ChartStage[] | undefined\",\n      \"tabs\": \"ChartListTab[] | undefined\",\n      \"rows\": \"ChartMatrixRow[] | undefined\",\n      \"columns\": \"string[] | undefined\",\n      \"nodes\": \"ChartFlowNode[] | undefined\",\n      \"links\": \"ChartFlowLink[] | undefined\",\n      \"max\": \"number | undefined\",\n      \"color\": \"string | undefined\",\n      \"metric\": \"\\\"value\\\" | \\\"share\\\" | undefined\",\n      \"tiles\": \"boolean | undefined\",\n      \"showIcons\": \"boolean | undefined\",\n      \"ranges\": \"ChartRange[] | undefined\",\n      \"range\": \"string | undefined\",\n      \"defaultRange\": \"string | undefined\",\n      \"onRangeChange\": \"((id: string, range: ChartRange) => void) | undefined\",\n      \"tab\": \"string | undefined\",\n      \"defaultTab\": \"string | undefined\",\n      \"onTabChange\": \"((id: string) => void) | undefined\",\n      \"headline\": \"string | number | undefined\",\n      \"delta\": \"number | undefined\",\n      \"onSelect\": \"((row: ChartDatum, index: number) => void) | undefined\",\n      \"title\": \"string | undefined\",\n      \"unit\": \"ChartUnit | undefined\",\n      \"shape\": \"\\\"curved\\\" | \\\"sharp\\\" | undefined\",\n      \"compact\": \"boolean | undefined\",\n      \"variant\": \"ChartVariant | undefined\",\n      \"mono\": \"boolean | undefined\",\n      \"limit\": \"number | undefined\",\n      \"bubble\": \"boolean | undefined\",\n      \"axisLabels\": \"[string, string] | undefined\",\n      \"defaultSelected\": \"number | undefined\"\n    }\n  },\n  \"steps-card\": {\n    \"exportName\": \"ModernChart\",\n    \"props\": {\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"disabled\": \"boolean | undefined\",\n      \"size\": \"\\\"sm\\\" | \\\"md\\\" | \\\"lg\\\" | undefined\",\n      \"id\": \"string\",\n      \"presentation\": \"\\\"interactive\\\" | \\\"source\\\" | undefined\",\n      \"periodPresentation\": \"\\\"segmented\\\" | \\\"date\\\" | undefined\",\n      \"sourceDefaultLayout\": \"boolean | undefined\",\n      \"data\": \"(ChartDatum | ChartInputDatum)[] | undefined\",\n      \"series\": \"ChartSeries[] | undefined\",\n      \"bar\": \"ChartSeries | undefined\",\n      \"line\": \"ChartSeries | undefined\",\n      \"stages\": \"ChartStage[] | undefined\",\n      \"items\": \"ChartStage[] | undefined\",\n      \"tabs\": \"ChartListTab[] | undefined\",\n      \"rows\": \"ChartMatrixRow[] | undefined\",\n      \"columns\": \"string[] | undefined\",\n      \"nodes\": \"ChartFlowNode[] | undefined\",\n      \"links\": \"ChartFlowLink[] | undefined\",\n      \"max\": \"number | undefined\",\n      \"color\": \"string | undefined\",\n      \"metric\": \"\\\"value\\\" | \\\"share\\\" | undefined\",\n      \"tiles\": \"boolean | undefined\",\n      \"showIcons\": \"boolean | undefined\",\n      \"ranges\": \"ChartRange[] | undefined\",\n      \"range\": \"string | undefined\",\n      \"defaultRange\": \"string | undefined\",\n      \"onRangeChange\": \"((id: string, range: ChartRange) => void) | undefined\",\n      \"tab\": \"string | undefined\",\n      \"defaultTab\": \"string | undefined\",\n      \"onTabChange\": \"((id: string) => void) | undefined\",\n      \"headline\": \"string | number | undefined\",\n      \"delta\": \"number | undefined\",\n      \"onSelect\": \"((row: ChartDatum, index: number) => void) | undefined\",\n      \"title\": \"string | undefined\",\n      \"unit\": \"ChartUnit | undefined\",\n      \"shape\": \"\\\"curved\\\" | \\\"sharp\\\" | undefined\",\n      \"compact\": \"boolean | undefined\",\n      \"variant\": \"ChartVariant | undefined\",\n      \"mono\": \"boolean | undefined\",\n      \"limit\": \"number | undefined\",\n      \"bubble\": \"boolean | undefined\",\n      \"axisLabels\": \"[string, string] | undefined\",\n      \"defaultSelected\": \"number | undefined\"\n    }\n  },\n  \"template-chat-starter\": {\n    \"exportName\": \"BoardTemplate\",\n    \"props\": {\n      \"storageKey\": \"string | undefined\",\n      \"initialGroup\": \"boolean | undefined\",\n      \"initialEditorOpen\": \"boolean | undefined\",\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"assetsBase\": \"string | undefined\",\n      \"onNavigate\": \"((id: \\\"dashboard\\\" | \\\"hr\\\" | \\\"finance\\\" | \\\"marketing\\\" | \\\"medical-profile\\\" | \\\"calendar\\\" | \\\"project-board\\\" | \\\"chat-starter\\\" | \\\"multi-agent-chat\\\" | \\\"ai-chat\\\" | \\\"ai-image-generation\\\" | \\\"ai-profile\\\") => void) | undefined\",\n      \"chrome\": \"boolean | undefined\",\n      \"embedded\": \"boolean | undefined\",\n      \"onMarketplaceAction\": \"((event: MarketplaceAction) => void | Promise<void>) | undefined\",\n      \"id\": \"\\\"dashboard\\\" | \\\"hr\\\" | \\\"finance\\\" | \\\"marketing\\\" | \\\"medical-profile\\\" | \\\"calendar\\\" | \\\"project-board\\\" | \\\"chat-starter\\\" | \\\"multi-agent-chat\\\" | \\\"ai-chat\\\" | \\\"ai-image-generation\\\" | \\\"ai-profile\\\"\"\n    }\n  },\n  \"template-hr\": {\n    \"exportName\": \"BoardTemplate\",\n    \"props\": {\n      \"storageKey\": \"string | undefined\",\n      \"initialGroup\": \"boolean | undefined\",\n      \"initialEditorOpen\": \"boolean | undefined\",\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"assetsBase\": \"string | undefined\",\n      \"onNavigate\": \"((id: \\\"dashboard\\\" | \\\"hr\\\" | \\\"finance\\\" | \\\"marketing\\\" | \\\"medical-profile\\\" | \\\"calendar\\\" | \\\"project-board\\\" | \\\"chat-starter\\\" | \\\"multi-agent-chat\\\" | \\\"ai-chat\\\" | \\\"ai-image-generation\\\" | \\\"ai-profile\\\") => void) | undefined\",\n      \"chrome\": \"boolean | undefined\",\n      \"embedded\": \"boolean | undefined\",\n      \"onMarketplaceAction\": \"((event: MarketplaceAction) => void | Promise<void>) | undefined\",\n      \"id\": \"\\\"dashboard\\\" | \\\"hr\\\" | \\\"finance\\\" | \\\"marketing\\\" | \\\"medical-profile\\\" | \\\"calendar\\\" | \\\"project-board\\\" | \\\"chat-starter\\\" | \\\"multi-agent-chat\\\" | \\\"ai-chat\\\" | \\\"ai-image-generation\\\" | \\\"ai-profile\\\"\"\n    }\n  },\n  \"template-multi-agent-chat\": {\n    \"exportName\": \"BoardTemplate\",\n    \"props\": {\n      \"storageKey\": \"string | undefined\",\n      \"initialGroup\": \"boolean | undefined\",\n      \"initialEditorOpen\": \"boolean | undefined\",\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"assetsBase\": \"string | undefined\",\n      \"onNavigate\": \"((id: \\\"dashboard\\\" | \\\"hr\\\" | \\\"finance\\\" | \\\"marketing\\\" | \\\"medical-profile\\\" | \\\"calendar\\\" | \\\"project-board\\\" | \\\"chat-starter\\\" | \\\"multi-agent-chat\\\" | \\\"ai-chat\\\" | \\\"ai-image-generation\\\" | \\\"ai-profile\\\") => void) | undefined\",\n      \"chrome\": \"boolean | undefined\",\n      \"embedded\": \"boolean | undefined\",\n      \"onMarketplaceAction\": \"((event: MarketplaceAction) => void | Promise<void>) | undefined\",\n      \"id\": \"\\\"dashboard\\\" | \\\"hr\\\" | \\\"finance\\\" | \\\"marketing\\\" | \\\"medical-profile\\\" | \\\"calendar\\\" | \\\"project-board\\\" | \\\"chat-starter\\\" | \\\"multi-agent-chat\\\" | \\\"ai-chat\\\" | \\\"ai-image-generation\\\" | \\\"ai-profile\\\"\"\n    }\n  },\n  \"template-ai-chat\": {\n    \"exportName\": \"BoardTemplate\",\n    \"props\": {\n      \"storageKey\": \"string | undefined\",\n      \"initialGroup\": \"boolean | undefined\",\n      \"initialEditorOpen\": \"boolean | undefined\",\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"assetsBase\": \"string | undefined\",\n      \"onNavigate\": \"((id: \\\"dashboard\\\" | \\\"hr\\\" | \\\"finance\\\" | \\\"marketing\\\" | \\\"medical-profile\\\" | \\\"calendar\\\" | \\\"project-board\\\" | \\\"chat-starter\\\" | \\\"multi-agent-chat\\\" | \\\"ai-chat\\\" | \\\"ai-image-generation\\\" | \\\"ai-profile\\\") => void) | undefined\",\n      \"chrome\": \"boolean | undefined\",\n      \"embedded\": \"boolean | undefined\",\n      \"onMarketplaceAction\": \"((event: MarketplaceAction) => void | Promise<void>) | undefined\",\n      \"id\": \"\\\"dashboard\\\" | \\\"hr\\\" | \\\"finance\\\" | \\\"marketing\\\" | \\\"medical-profile\\\" | \\\"calendar\\\" | \\\"project-board\\\" | \\\"chat-starter\\\" | \\\"multi-agent-chat\\\" | \\\"ai-chat\\\" | \\\"ai-image-generation\\\" | \\\"ai-profile\\\"\"\n    }\n  },\n  \"template-ai-image-generation\": {\n    \"exportName\": \"BoardTemplate\",\n    \"props\": {\n      \"storageKey\": \"string | undefined\",\n      \"initialGroup\": \"boolean | undefined\",\n      \"initialEditorOpen\": \"boolean | undefined\",\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"assetsBase\": \"string | undefined\",\n      \"onNavigate\": \"((id: \\\"dashboard\\\" | \\\"hr\\\" | \\\"finance\\\" | \\\"marketing\\\" | \\\"medical-profile\\\" | \\\"calendar\\\" | \\\"project-board\\\" | \\\"chat-starter\\\" | \\\"multi-agent-chat\\\" | \\\"ai-chat\\\" | \\\"ai-image-generation\\\" | \\\"ai-profile\\\") => void) | undefined\",\n      \"chrome\": \"boolean | undefined\",\n      \"embedded\": \"boolean | undefined\",\n      \"onMarketplaceAction\": \"((event: MarketplaceAction) => void | Promise<void>) | undefined\",\n      \"id\": \"\\\"dashboard\\\" | \\\"hr\\\" | \\\"finance\\\" | \\\"marketing\\\" | \\\"medical-profile\\\" | \\\"calendar\\\" | \\\"project-board\\\" | \\\"chat-starter\\\" | \\\"multi-agent-chat\\\" | \\\"ai-chat\\\" | \\\"ai-image-generation\\\" | \\\"ai-profile\\\"\"\n    }\n  },\n  \"template-ai-profile\": {\n    \"exportName\": \"BoardTemplate\",\n    \"props\": {\n      \"storageKey\": \"string | undefined\",\n      \"initialGroup\": \"boolean | undefined\",\n      \"initialEditorOpen\": \"boolean | undefined\",\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"assetsBase\": \"string | undefined\",\n      \"onNavigate\": \"((id: \\\"dashboard\\\" | \\\"hr\\\" | \\\"finance\\\" | \\\"marketing\\\" | \\\"medical-profile\\\" | \\\"calendar\\\" | \\\"project-board\\\" | \\\"chat-starter\\\" | \\\"multi-agent-chat\\\" | \\\"ai-chat\\\" | \\\"ai-image-generation\\\" | \\\"ai-profile\\\") => void) | undefined\",\n      \"chrome\": \"boolean | undefined\",\n      \"embedded\": \"boolean | undefined\",\n      \"onMarketplaceAction\": \"((event: MarketplaceAction) => void | Promise<void>) | undefined\",\n      \"id\": \"\\\"dashboard\\\" | \\\"hr\\\" | \\\"finance\\\" | \\\"marketing\\\" | \\\"medical-profile\\\" | \\\"calendar\\\" | \\\"project-board\\\" | \\\"chat-starter\\\" | \\\"multi-agent-chat\\\" | \\\"ai-chat\\\" | \\\"ai-image-generation\\\" | \\\"ai-profile\\\"\"\n    }\n  },\n  \"template-calendar\": {\n    \"exportName\": \"BoardTemplate\",\n    \"props\": {\n      \"storageKey\": \"string | undefined\",\n      \"initialGroup\": \"boolean | undefined\",\n      \"initialEditorOpen\": \"boolean | undefined\",\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"assetsBase\": \"string | undefined\",\n      \"onNavigate\": \"((id: \\\"dashboard\\\" | \\\"hr\\\" | \\\"finance\\\" | \\\"marketing\\\" | \\\"medical-profile\\\" | \\\"calendar\\\" | \\\"project-board\\\" | \\\"chat-starter\\\" | \\\"multi-agent-chat\\\" | \\\"ai-chat\\\" | \\\"ai-image-generation\\\" | \\\"ai-profile\\\") => void) | undefined\",\n      \"chrome\": \"boolean | undefined\",\n      \"embedded\": \"boolean | undefined\",\n      \"onMarketplaceAction\": \"((event: MarketplaceAction) => void | Promise<void>) | undefined\",\n      \"id\": \"\\\"dashboard\\\" | \\\"hr\\\" | \\\"finance\\\" | \\\"marketing\\\" | \\\"medical-profile\\\" | \\\"calendar\\\" | \\\"project-board\\\" | \\\"chat-starter\\\" | \\\"multi-agent-chat\\\" | \\\"ai-chat\\\" | \\\"ai-image-generation\\\" | \\\"ai-profile\\\"\"\n    }\n  },\n  \"template-dashboard\": {\n    \"exportName\": \"BoardTemplate\",\n    \"props\": {\n      \"storageKey\": \"string | undefined\",\n      \"initialGroup\": \"boolean | undefined\",\n      \"initialEditorOpen\": \"boolean | undefined\",\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"assetsBase\": \"string | undefined\",\n      \"onNavigate\": \"((id: \\\"dashboard\\\" | \\\"hr\\\" | \\\"finance\\\" | \\\"marketing\\\" | \\\"medical-profile\\\" | \\\"calendar\\\" | \\\"project-board\\\" | \\\"chat-starter\\\" | \\\"multi-agent-chat\\\" | \\\"ai-chat\\\" | \\\"ai-image-generation\\\" | \\\"ai-profile\\\") => void) | undefined\",\n      \"chrome\": \"boolean | undefined\",\n      \"embedded\": \"boolean | undefined\",\n      \"onMarketplaceAction\": \"((event: MarketplaceAction) => void | Promise<void>) | undefined\",\n      \"id\": \"\\\"dashboard\\\" | \\\"hr\\\" | \\\"finance\\\" | \\\"marketing\\\" | \\\"medical-profile\\\" | \\\"calendar\\\" | \\\"project-board\\\" | \\\"chat-starter\\\" | \\\"multi-agent-chat\\\" | \\\"ai-chat\\\" | \\\"ai-image-generation\\\" | \\\"ai-profile\\\"\"\n    }\n  },\n  \"template-finance\": {\n    \"exportName\": \"BoardTemplate\",\n    \"props\": {\n      \"storageKey\": \"string | undefined\",\n      \"initialGroup\": \"boolean | undefined\",\n      \"initialEditorOpen\": \"boolean | undefined\",\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"assetsBase\": \"string | undefined\",\n      \"onNavigate\": \"((id: \\\"dashboard\\\" | \\\"hr\\\" | \\\"finance\\\" | \\\"marketing\\\" | \\\"medical-profile\\\" | \\\"calendar\\\" | \\\"project-board\\\" | \\\"chat-starter\\\" | \\\"multi-agent-chat\\\" | \\\"ai-chat\\\" | \\\"ai-image-generation\\\" | \\\"ai-profile\\\") => void) | undefined\",\n      \"chrome\": \"boolean | undefined\",\n      \"embedded\": \"boolean | undefined\",\n      \"onMarketplaceAction\": \"((event: MarketplaceAction) => void | Promise<void>) | undefined\",\n      \"id\": \"\\\"dashboard\\\" | \\\"hr\\\" | \\\"finance\\\" | \\\"marketing\\\" | \\\"medical-profile\\\" | \\\"calendar\\\" | \\\"project-board\\\" | \\\"chat-starter\\\" | \\\"multi-agent-chat\\\" | \\\"ai-chat\\\" | \\\"ai-image-generation\\\" | \\\"ai-profile\\\"\"\n    }\n  },\n  \"template-marketing\": {\n    \"exportName\": \"BoardTemplate\",\n    \"props\": {\n      \"storageKey\": \"string | undefined\",\n      \"initialGroup\": \"boolean | undefined\",\n      \"initialEditorOpen\": \"boolean | undefined\",\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"assetsBase\": \"string | undefined\",\n      \"onNavigate\": \"((id: \\\"dashboard\\\" | \\\"hr\\\" | \\\"finance\\\" | \\\"marketing\\\" | \\\"medical-profile\\\" | \\\"calendar\\\" | \\\"project-board\\\" | \\\"chat-starter\\\" | \\\"multi-agent-chat\\\" | \\\"ai-chat\\\" | \\\"ai-image-generation\\\" | \\\"ai-profile\\\") => void) | undefined\",\n      \"chrome\": \"boolean | undefined\",\n      \"embedded\": \"boolean | undefined\",\n      \"onMarketplaceAction\": \"((event: MarketplaceAction) => void | Promise<void>) | undefined\",\n      \"id\": \"\\\"dashboard\\\" | \\\"hr\\\" | \\\"finance\\\" | \\\"marketing\\\" | \\\"medical-profile\\\" | \\\"calendar\\\" | \\\"project-board\\\" | \\\"chat-starter\\\" | \\\"multi-agent-chat\\\" | \\\"ai-chat\\\" | \\\"ai-image-generation\\\" | \\\"ai-profile\\\"\"\n    }\n  },\n  \"template-medical-profile\": {\n    \"exportName\": \"BoardTemplate\",\n    \"props\": {\n      \"storageKey\": \"string | undefined\",\n      \"initialGroup\": \"boolean | undefined\",\n      \"initialEditorOpen\": \"boolean | undefined\",\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"assetsBase\": \"string | undefined\",\n      \"onNavigate\": \"((id: \\\"dashboard\\\" | \\\"hr\\\" | \\\"finance\\\" | \\\"marketing\\\" | \\\"medical-profile\\\" | \\\"calendar\\\" | \\\"project-board\\\" | \\\"chat-starter\\\" | \\\"multi-agent-chat\\\" | \\\"ai-chat\\\" | \\\"ai-image-generation\\\" | \\\"ai-profile\\\") => void) | undefined\",\n      \"chrome\": \"boolean | undefined\",\n      \"embedded\": \"boolean | undefined\",\n      \"onMarketplaceAction\": \"((event: MarketplaceAction) => void | Promise<void>) | undefined\",\n      \"id\": \"\\\"dashboard\\\" | \\\"hr\\\" | \\\"finance\\\" | \\\"marketing\\\" | \\\"medical-profile\\\" | \\\"calendar\\\" | \\\"project-board\\\" | \\\"chat-starter\\\" | \\\"multi-agent-chat\\\" | \\\"ai-chat\\\" | \\\"ai-image-generation\\\" | \\\"ai-profile\\\"\"\n    }\n  },\n  \"template-project-board\": {\n    \"exportName\": \"BoardTemplate\",\n    \"props\": {\n      \"storageKey\": \"string | undefined\",\n      \"initialGroup\": \"boolean | undefined\",\n      \"initialEditorOpen\": \"boolean | undefined\",\n      \"state\": \"FamilyState | undefined\",\n      \"onRetry\": \"(() => void) | undefined\",\n      \"assetsBase\": \"string | undefined\",\n      \"onNavigate\": \"((id: \\\"dashboard\\\" | \\\"hr\\\" | \\\"finance\\\" | \\\"marketing\\\" | \\\"medical-profile\\\" | \\\"calendar\\\" | \\\"project-board\\\" | \\\"chat-starter\\\" | \\\"multi-agent-chat\\\" | \\\"ai-chat\\\" | \\\"ai-image-generation\\\" | \\\"ai-profile\\\") => void) | undefined\",\n      \"chrome\": \"boolean | undefined\",\n      \"embedded\": \"boolean | undefined\",\n      \"onMarketplaceAction\": \"((event: MarketplaceAction) => void | Promise<void>) | undefined\",\n      \"id\": \"\\\"dashboard\\\" | \\\"hr\\\" | \\\"finance\\\" | \\\"marketing\\\" | \\\"medical-profile\\\" | \\\"calendar\\\" | \\\"project-board\\\" | \\\"chat-starter\\\" | \\\"multi-agent-chat\\\" | \\\"ai-chat\\\" | \\\"ai-image-generation\\\" | \\\"ai-profile\\\"\"\n    }\n  }\n}\n"
}
