{
  "metadata": {
    "buildDate": "2026-10-28T06:57:33.003Z",
    "version": "0.6.43",
    "designSystemPath": "/home/runner/work/ui-design-system/ui-design-system"
  },
  "components": {
    "AIPromptFlow": {
      "name": "AIPromptFlow",
      "path": "src/components/AIPromptFlow",
      "files": {
        "main": null,
        "story": {
          "path": "AIPromptFlow.stories.tsx",
          "content": "/* eslint-disable react/no-array-index-key */\nimport * as React from 'react';\n\nimport {\n  ChatAnchor,\n  ChatBody,\n  ChatBubble,\n  ChatContent,\n} from 'src/components/ChatBubble';\nimport {ChatFooterWithIcons} from 'src/components/ChatBubble/ChatBubble.stories';\nimport {Disclaimer} from 'src/components/Disclaimer';\nimport {Panel, PanelBody, PanelFooter, PanelHeader} from 'src/components/Panel';\nimport {PromptChip} from 'src/components/PromptChip';\nimport {PromptInput} from 'src/components/PromptInput';\nimport {BodyMedium, FormLabelMedium} from 'src/components/Text';\nimport {SubTitleSmall} from 'src/components/Text/Text';\nimport {TextTile} from 'src/components/TextTile';\n\nimport css from 'src/components/AIPromptFlow/AIPromptFlow.stories.module.css';\n\n\nexport default {\n  tags: ['!autodocs'],\n  title: 'AI Prompt Components/AI Prompt Flow',\n  parameters: {\n    docs: {\n      subtitle: 'AI Prompt Flow example',\n      description: {\n        component: `\nThis example showcases how to use the ai copilot flows in ui. feel free to copy code and respective css to mimic the exact UI\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Disclaimer/Disclaimer',\n    },\n  },\n};\n\nconst staticResponse = `In today's data-driven world, analytics play a crucial role in decision-making and strategy development. Companies rely on key performance indicators (KPIs) to measure progress and identify areas for improvement. Metrics like conversion rates, churn rates, and user engagement provide valuable insights into business performance. Accurate data collection and analysis empower teams to make informed choices, optimize processes, and allocate resources effectively.\n\nFor instance, monitoring website traffic helps identify the most visited pages and the sources driving users to the site. A high bounce rate might indicate a need to improve user experience, while a steady increase in session duration reflects growing engagement. Similarly, tracking customer acquisition cost (CAC) against lifetime value (LTV) ensures sustainable growth and profitability.\n\nSales teams use analytics to measure pipeline velocity, close rates, and average deal size. These metrics enable managers to forecast revenue, adjust strategies, and improve overall efficiency. In marketing, tools like funnel analysis highlight where potential leads drop off, helping refine campaigns and improve return on investment (ROI).\n\nEmployee performance metrics are equally important. Organizations track productivity, satisfaction scores, and retention rates to foster a positive work environment. For instance, a drop in employee engagement often signals underlying issues, such as workload imbalance or lack of recognition.\n\nIn customer success, analytics focus on net promoter scores (NPS), response times, and resolution rates. High NPS scores indicate satisfied customers likely to promote the brand, while tracking ticket resolution times ensures efficient support processes. By analyzing these trends, businesses can address pain points and improve client relationships.\n\nFinancial analytics are another critical area. Companies monitor profit margins, operational costs, and revenue growth to ensure financial stability. Metrics such as EBITDA and cash flow provide a clear picture of a company’s health, enabling leadership to plan for future investments or expansions.\n\nData visualization tools make these analytics easier to understand. Dashboards present complex information in simple charts and graphs, allowing teams to identify patterns and anomalies at a glance. Heatmaps, for example, can show user activity on a website, revealing areas that need more attention.\n\nA/B testing further enhances decision-making by allowing teams to experiment with different strategies and compare results. Whether testing headlines, product features, or email campaigns, data-driven results provide clarity and eliminate guesswork.\n\nReal-time analytics help organizations stay agile and responsive. By monitoring live data, companies can react to sudden changes, such as traffic spikes or unexpected downtime. Alerts and notifications ensure that teams are aware of critical issues and can act promptly.\n\nThe value of analytics lies not only in the data itself but also in how it’s interpreted and applied. Insights derived from metrics allow businesses to streamline operations, enhance customer satisfaction, and drive growth. With the right tools and a data-driven mindset, organizations can turn raw data into actionable strategies and measurable outcomes.\n\nIn essence, analytics provide the foundation for smarter decisions, improved performance, and long-term success. Whether it’s understanding user behavior, optimizing workflows, or predicting market trends, leveraging analytics is key to staying competitive in an ever-changing landscape.`;\n\nconst PROMPTS = [\n  'What is the offer acceptance rate?',\n  'Which source produces the best hires?',\n  'What is the average time to hire?',\n  'How many candidates are in the pipeline?',\n  'What is the average cost per hire?',\n  'Which department has the highest turnover rate?',\n  'What percentage of hires are from referrals?',\n  'How long does it take to fill a position?',\n  'What is the attrition rate for the past year?',\n  'Which jobs have the highest application drop-off rate?',\n  'What is the conversion rate from interview to hire?',\n  'How many candidates are rejected at each stage?',\n  'What is the average interview-to-offer ratio?',\n  'Which recruiters have the best performance metrics?',\n  'What percentage of candidates reject offers?',\n  'How satisfied are candidates with the hiring process?',\n  'What is the diversity ratio in the current workforce?',\n  'How many hires come from internal promotions?',\n  'What are the reasons for candidate drop-off?',\n  'How effective is the onboarding process?',\n  'What is the current employee engagement score?',\n  'How many candidates applied last quarter?',\n  'What percentage of job offers are pending?',\n  'How many interviews are conducted per position?',\n  'What is the overall hiring success rate?',\n  'What percentage of applicants are qualified?',\n  'How many candidates are awaiting feedback?',\n  'What is the average time to first interview?',\n  'Which job roles take the longest to fill?',\n  'What is the ratio of applicants to hires?',\n  'Which job boards drive the most applications?',\n  'What is the average time spent interviewing candidates?',\n  'How many passive candidates were contacted last month?',\n  'What percentage of hires are new graduates?',\n  'Which hiring stages have the highest drop-off?',\n  'How many candidates withdrew their applications?',\n  'What percentage of employees passed probation?',\n  'Which regions have the most successful hires?',\n  'What is the average number of interview rounds?',\n  'How many requisitions are still open?',\n  'Which departments have the lowest attrition?',\n  'What percentage of candidates complete assessments?',\n  'What is the satisfaction rate of new hires?',\n  'How many hires are expected this quarter?',\n  'What is the median salary for new hires?',\n  'How many requisitions were filled last month?',\n  'Which hiring sources are the most cost-effective?',\n  'How diverse are the recent hires?',\n  'How many employees left during onboarding?',\n  'What is the percentage of part-time hires?',\n  'How many job offers were rescinded?',\n  'What is the average candidate feedback score?',\n  'Which teams have the fastest hiring process?',\n  'What percentage of hires are internal candidates?',\n  'How many candidates are in the talent pool?',\n  'What is the average age of new hires?',\n  'How effective are employee referral programs?',\n  'What percentage of hires are remote employees?',\n  'How many candidates are considered overqualified?',\n  'Which recruiters have the fastest response time?',\n  'What is the average duration between offer and joining?',\n  'How satisfied are hiring managers with candidates?',\n  'Which skills are most common among recent hires?',\n  'How many candidates failed the technical assessment?',\n  'What is the drop-off rate during technical rounds?',\n  'What percentage of hires are contract workers?',\n  'How many job offers were declined last quarter?',\n  'What percentage of hires meet performance benchmarks?',\n  'How many positions remain unfilled after 90 days?',\n  'What is the hiring trend over the last six months?',\n  'What percentage of hires come from social media?',\n  'How effective is the candidate feedback loop?',\n  'What is the employee referral success rate?',\n  'How many active job seekers applied this month?',\n  'What percentage of candidates ask for offer extensions?',\n  'What is the typical rejection reason from candidates?',\n  'Which hiring stage causes the most delays?',\n  'What percentage of new hires recommend the process?',\n  'How many rehires were made this year?',\n  'What is the cost of a bad hire?',\n  'How many positions were closed due to budget cuts?',\n  'What percentage of hires exceed expectations?',\n  'How long do candidates stay on average?',\n  'What is the feedback score for interviewers?',\n  'Which stages have the most rescheduled interviews?',\n  'How many candidates received counteroffers?',\n  'What is the candidate response time for offers?',\n  'What percentage of candidates report a good experience?',\n  'How does the hiring rate compare year over year?',\n  'Which regions have the slowest time to hire?',\n  'How effective are pre-screening assessments?',\n  'How often do candidates ghost interviews?',\n  'What is the most requested role this year?',\n  'What percentage of new hires are retained after a year?',\n  'How many rejected candidates reapply later?',\n  'How many candidates fail during background checks?',\n  'What percentage of hires are diversity candidates?',\n  'How successful are hiring campaigns in different regions?',\n  'What is the satisfaction rate among rejected candidates?',\n  'How many roles are open for more than 6 months?',\n  'What percentage of hires move into leadership roles?',\n];\n\nconst getRandomPrompts = (prompts: Array<string>) => {\n  const count = Math.floor(Math.random() * 3) + 1;\n  const shuffled = prompts.sort(() => 0.5 - Math.random());\n  return shuffled.slice(0, count);\n};\n\nconst getRandomSentences = (text: string, wordLimit = 50) => {\n  const sentences = text.match(/[^.!?]+[.!?]/g) || [];\n\n  const result: Array<string> = [];\n  let totalWords = 0;\n\n  const shuffledSentences = sentences.sort(() => Math.random() - 0.5);\n\n  for (const sentence of shuffledSentences) {\n    const wordCount = sentence.trim().split(/\\s+/).length;\n\n    if (totalWords + wordCount <= wordLimit || result.length === 0) {\n      result.push(sentence.trim());\n      totalWords += wordCount;\n    } else {\n      break;\n    }\n  }\n\n  return result.join(' ');\n};\n\nexport const AIPromptFlowStory = () => {\n  const [value, setValue] = React.useState('');\n  const [isLoading, setIsLoading] = React.useState(false);\n  const [responses, setResponses] = React.useState<\n    Array<{question: string; answer: string}>\n  >([]);\n  const [selectedPrompts, setSelectedPrompts] = React.useState(\n    getRandomPrompts(PROMPTS),\n  );\n  const promptRef = React.useRef<HTMLDivElement | null>(null);\n  const loadingRef = React.useRef<HTMLDivElement | null>(null);\n\n  const generateResponse = (text?: string) => {\n    const preparedResponses = [...responses];\n    setIsLoading(true);\n    setTimeout(() => {\n      loadingRef.current?.scrollIntoView({\n        behavior: 'smooth',\n      });\n    });\n\n    setValue('');\n\n    const question = text ? text : value;\n\n    preparedResponses.push({\n      question,\n      answer: '',\n    });\n\n    setResponses(preparedResponses);\n\n    setTimeout(() => {\n      preparedResponses.push({\n        question: '',\n        answer: getRandomSentences(staticResponse),\n      });\n      setResponses(preparedResponses);\n      setIsLoading(false);\n      setSelectedPrompts(getRandomPrompts(PROMPTS));\n      promptRef.current?.scrollIntoView({\n        behavior: 'smooth',\n      });\n    }, 2000);\n  };\n\n  return (\n    <Panel isOpen={true} anchor=\"right\" size=\"large\">\n      <PanelHeader>Copilot</PanelHeader>\n      <Disclaimer classNames={{wrapper: css.disclaimer}}>\n        Always check content generated by AI\n      </Disclaimer>\n      <PanelBody className={css.panelBody}>\n        {responses.length === 0 && !isLoading && (\n          <TextTile\n            header=\"Copilot\"\n            description=\"Ask anything to accomplish tasks in Sense.\"\n            classNames={{wrapper: css.copilotTextWrapper}}\n          />\n        )}\n\n        {responses.map((response, idx) => (\n          <div key={idx} className={css.conversationAI}>\n            {!!response.question && (\n              <ChatBubble orientation=\"right\">\n                <ChatContent>\n                  <ChatBody withBgColor={true}>\n                    <BodyMedium>{response.question}</BodyMedium>\n                  </ChatBody>\n                </ChatContent>\n              </ChatBubble>\n            )}\n\n            {!!response.answer && (\n              <>\n                {idx === 1 && (\n                  <>\n                    <ChatBubble orientation=\"left\">\n                      <ChatAnchor />\n                      <ChatContent>\n                        <ChatBody>\n                          <SubTitleSmall>\n                            This is our interpretation of you question\n                          </SubTitleSmall>\n\n                          <BodyMedium>\n                            {getRandomSentences(staticResponse)}\n                          </BodyMedium>\n                        </ChatBody>\n                      </ChatContent>\n                    </ChatBubble>\n                    <ChatBubble\n                      orientation=\"left\"\n                      classNames={{wrapper: css.leftMarginSpace}}\n                    >\n                      <ChatContent>\n                        <ChatBody>\n                          <BodyMedium>{response.answer}</BodyMedium>\n                        </ChatBody>\n                        <ChatFooterWithIcons />\n                      </ChatContent>\n                    </ChatBubble>\n                  </>\n                )}\n                {idx === 3 && (\n                  <ChatBubble orientation=\"left\">\n                    <ChatAnchor />\n                    <ChatContent>\n                      <ChatBody classNames={{wrapper: css.longChatContent}}>\n                        <BodyMedium>\n                          In a world where technology and imagination\n                          intertwine, the possibilities for innovation are\n                          boundless. Every passing day introduces new\n                          advancements that reshape the way humanity interacts\n                          with the world, creating a seamless blend of\n                          convenience, creativity, and connectivity. As\n                          artificial intelligence continues to grow in\n                          influence, its impact on everyday life becomes more\n                          profound, touching areas that range from healthcare to\n                          entertainment, from education to environmental\n                          conservation. Take, for instance, the story of a small\n                          town nestled in the valley of rolling hills. For\n                          decades, this town had thrived on traditional farming\n                          practices, cultivating crops and raising livestock in\n                          harmony with nature. However, the advent of technology\n                          introduced challenges that demanded adaptation.\n                          Climate change brought unpredictable weather patterns,\n                          and global markets introduced competitive pressures\n                          that many small farms struggled to meet. Faced with\n                          these challenges, the community turned to innovation.\n                          The town’s leaders, in collaboration with researchers\n                          and technologists, implemented a system of smart\n                          farming powered by AI. Sensors embedded in the soil\n                          measured moisture levels, nutrient content, and\n                          temperature, providing real-time feedback to farmers.\n                          Drones equipped with cameras flew over fields,\n                          capturing images that AI analyzed to detect signs of\n                          pests or disease. Autonomous tractors, guided by\n                          satellite data, plowed and planted with precision,\n                          minimizing waste and maximizing yield. Over time,\n                          these tools not only revived the town’s agricultural\n                          economy but also established it as a model for\n                          sustainable farming practices worldwide. Beyond\n                          agriculture, artificial intelligence also\n                          revolutionized healthcare. A few years ago, a young\n                          woman named Clara faced an uncertain future. Diagnosed\n                          with a rare and aggressive form of cancer, she was\n                          told her chances of survival were slim. However,\n                          Clara’s doctors employed a cutting-edge AI system to\n                          analyze her genetic profile and recommend a\n                          personalized treatment plan. This system, trained on\n                          data from millions of patients worldwide, identified\n                          patterns that human doctors might have missed,\n                          suggesting a combination of therapies tailored\n                          specifically to Clara’s condition.\n                        </BodyMedium>\n                      </ChatBody>\n                      <ChatFooterWithIcons />\n                    </ChatContent>\n                  </ChatBubble>\n                )}\n                {idx !== 1 && idx !== 3 && (\n                  <ChatBubble orientation=\"left\">\n                    <ChatAnchor />\n                    <ChatContent>\n                      <ChatBody>\n                        <BodyMedium>{response.answer}</BodyMedium>\n                      </ChatBody>\n                    </ChatContent>\n                  </ChatBubble>\n                )}\n\n                <div className={css.leftMarginSpace}>\n                  {idx === responses.length - 1 && (\n                    <PromptSuggestions\n                      isLoading={isLoading}\n                      selectedPrompts={selectedPrompts}\n                      generateResponse={generateResponse}\n                      promptRef={promptRef}\n                    />\n                  )}\n                </div>\n              </>\n            )}\n          </div>\n        ))}\n        {isLoading && (\n          <ChatBubble\n            classNames={{\n              wrapper: css.loader,\n            }}\n            orientation=\"left\"\n            ref={loadingRef}\n          >\n            <ChatAnchor />\n            <ChatContent>\n              <ChatBody isLoading loadingText=\"Generating\" />\n            </ChatContent>\n          </ChatBubble>\n        )}\n\n        {responses.length === 0 && (\n          <div className={css.promptContainer}>\n            <PromptSuggestions\n              isLoading={isLoading}\n              selectedPrompts={selectedPrompts}\n              generateResponse={generateResponse}\n              label=\"Here are some ideas to get started with Analytics for your product\"\n            />\n          </div>\n        )}\n      </PanelBody>\n      <PanelFooter classNames={{actions: css.actions}}>\n        <PromptInput\n          withPadding={false}\n          value={value}\n          onInputChange={(e) => setValue(e.target.value)}\n          onButtonClick={() => generateResponse()}\n          buttonDisabled={value.length === 0}\n        ></PromptInput>\n      </PanelFooter>\n    </Panel>\n  );\n};\n\nconst PromptSuggestions = ({\n  isLoading,\n  generateResponse,\n  selectedPrompts,\n  label,\n  promptRef,\n}: {\n  isLoading: boolean;\n  generateResponse: (prompt: string) => void;\n  selectedPrompts: string[];\n  label?: string;\n  promptRef?: {\n    current?: HTMLDivElement | null;\n  };\n}) =>\n  !isLoading && (\n    <>\n      {label && <FormLabelMedium>{label}</FormLabelMedium>}\n\n      <div className={css.promptWrapper}>\n        {selectedPrompts.map((prompt) => (\n          <React.Fragment key={prompt}>\n            <PromptChip\n              classNames={{wrapper: css.prompt}}\n              onClick={() => generateResponse(prompt)}\n              ref={promptRef as React.RefObject<HTMLDivElement>}\n            >\n              {prompt}\n            </PromptChip>\n          </React.Fragment>\n        ))}\n      </div>\n    </>\n  );\nAIPromptFlowStory.storyName = 'AIPrompt Flow';\n"
        },
        "css": null,
        "index": null,
        "additional": {}
      },
      "allFiles": [
        "AIPromptFlow.stories.module.css",
        "AIPromptFlow.stories.tsx"
      ]
    },
    "Accordion": {
      "name": "Accordion",
      "path": "src/components/Accordion",
      "files": {
        "main": {
          "path": "Accordion.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nexport type AccordionClassNames = Readonly<{\n    wrapper?: string;\n    headerWrapper?: string;\n    header?: string;\n    content?: string;\n}>;\nexport interface AccordionPropsType {\n    id: string;\n    header: React.ReactNode;\n    children: React.ReactNode;\n    classNames?: AccordionClassNames;\n    isOpen?: boolean;\n    disabled?: boolean;\n    showToggle?: boolean;\n    onChange?: ((id: string, isOpen: boolean) => unknown) | null | undefined;\n    checked?: boolean;\n    onToggle?: (checked: boolean) => unknown;\n    testId?: string;\n}\nexport declare const Accordion: Flow.AbstractComponent<AccordionPropsType, HTMLDivElement>;\n//# sourceMappingURL=Accordion.d.ts.map"
        },
        "story": {
          "path": "Accordion.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {AccordionPropsType} from 'src/components/Accordion/Accordion';\nimport {Accordion} from 'src/components/Accordion/Accordion';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Accordion/Accordion',\n  component: Accordion,\n  argTypes: {\n    classNames: {\n      description:\n        'Optional class name overrides for styling parts of the accordion. Keys include: wrapper, headerWrapper, header, content.',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary:\n            '{wrapper?: string, headerWrapper?: string, header?: string, content?: string}',\n        },\n      },\n    },\n    header: {\n      description:\n        'A React node that renders the visible header of the accordion. This typically includes a title or label for the section. It can be a string, JSX, or any React element.',\n      control: {type: 'text'},\n      table: {\n        type: {summary: 'React.Node'},\n      },\n    },\n    id: {\n      description:\n        'A unique string identifier for the accordion instance. Required when used inside an AccordionGroup to control open/close or disabled states via openedIds and disabledIds arrays.',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    children: {\n      description:\n        'The content to be shown inside the accordion when it is expanded. Can be a string, JSX, or any valid React node. This content remains hidden when the accordion is collapsed.',\n      control: {type: 'text'},\n      table: {\n        type: {summary: 'React.Node'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    isOpen: {\n      description: 'Controls whether the accordion is open or closed.',\n      control: {type: 'boolean'},\n      table: {\n        type: {summary: 'boolean'},\n      },\n    },\n    disabled: {\n      description: 'Disables only the toggle switch (when showToggle is true).',\n      control: {type: 'boolean'},\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    showToggle: {\n      description: 'Displays a toggle switch to enable/disable the accordion',\n      control: {type: 'boolean'},\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    onChange: {\n      description: 'Callback triggered when the accordion is opened or closed.',\n      control: false,\n      table: {\n        type: {\n          summary: '(id?: string, isOpen: boolean) => mixed',\n        },\n      },\n    },\n    onToggle: {\n      description:\n        'Callback triggered when the enable/disable toggle is clicked.',\n      control: false,\n      table: {\n        type: {\n          summary: '(checked?: boolean) => mixed',\n        },\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates an Accordion component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Accordion } from \"@spaced-out/ui-design-system/lib/components/Accordion\";\n\\`\\`\\`\nThe Accordion component is a collapsible UI element used to toggle the visibility of content sections. It can be used independently or within and AccordionGroup.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Accordion/Accordion',\n    },\n  },\n};\n\nexport const DefaultStory = (args: AccordionPropsType): React.ReactNode => {\n  const [isOpened, setIsOpened] = React.useState(args.isOpen ?? false);\n  const [checked, setChecked] = React.useState(args.checked ?? false);\n\n  const onToggleHandler = (checked: boolean) => {\n    args.onToggle?.(checked);\n    setChecked(checked);\n    setIsOpened(checked);\n  };\n  return (\n    <Accordion\n      {...args}\n      isOpen={isOpened}\n      checked={checked}\n      onToggle={onToggleHandler}\n    >\n      <div>\n        Accordions allow you to organize content into collapsible sections. This\n        improves page readability and reduces visual clutter. Click the header\n        to expand or collapse this section.\n      </div>\n    </Accordion>\n  );\n};\n\nDefaultStory.args = {\n  classNames: {wrapper: ''},\n  id: 'ac1',\n  header: 'What is an Accordion?',\n  testId: 'accordion-default-story',\n};\n\nexport const WithToggleStory = (args: AccordionPropsType): React.ReactNode => {\n  const [isOpened, setIsOpened] = React.useState(args.isOpen ?? false);\n  const [checked, setChecked] = React.useState(args.checked);\n\n  const onToggleHandler = (checked: boolean) => {\n    args.onToggle?.(checked);\n    setIsOpened(checked);\n    setChecked(checked);\n  };\n\n  React.useEffect(() => {\n    setIsOpened(args.isOpen ?? false);\n  }, [args.isOpen]);\n\n  return (\n    <Accordion\n      {...args}\n      isOpen={isOpened}\n      checked={checked}\n      header={'What is an Accordion?'}\n      onToggle={onToggleHandler}\n    >\n      <div>\n        Accordions allow you to organize content into collapsible sections. This\n        improves page readability and reduces visual clutter. Click the header\n        to expand or collapse this section.\n      </div>\n    </Accordion>\n  );\n};\nWithToggleStory.args = {\n  classNames: {wrapper: ''},\n  id: 'ac1',\n  showToggle: true,\n  checked: false,\n  testId: 'accordion-with-toggle-story',\n};\nDefaultStory.storyName = 'Default';\nWithToggleStory.storyName = 'With Toggle';\n"
        },
        "css": {
          "path": "Accordion.module.css",
          "content": "@value (\n  colorBorderPrimary,\n  colorBackgroundTertiary,\n  colorTextSecondary\n) from '../../styles/variables/_color.css';\n@value (\n  sizeFluid, \n  size58\n) from '../../styles/variables/_size.css';\n@value (\n  spaceNone,\n  spaceSmall, \n  spaceMedium,\n  spaceXSmall,\n  spaceXXSmall\n) from '../../styles/variables/_space.css';\n@value (\n  elevationCard\n) from '../../styles/variables/_elevation.css';\n@value (\n  borderWidthNone,\n  borderWidthPrimary,\n  borderRadiusSmall,\n  borderRadiusMedium,\n  borderRadiusNone,\n  borderWidthTertiary\n) from '../../styles/variables/_border.css';\n\n.wrapper {\n  composes: borderPrimary from '../../styles/border.module.css';\n  display: flex;\n  flex-flow: column;\n  width: sizeFluid;\n}\n\n.headerWrapper {\n  composes: subTitleSmall from '../../styles/typography.module.css';\n  display: flex;\n  min-height: size58;\n  cursor: pointer;\n  align-items: center;\n  width: sizeFluid;\n  justify-content: space-between;\n  gap: spaceXSmall;\n  padding-left: spaceMedium;\n  padding-right: spaceMedium;\n  padding-top: spaceSmall;\n  padding-bottom: spaceSmall;\n  background-color: colorBackgroundTertiary;\n  z-index: elevationCard;\n  color: colorTextSecondary;\n}\n\n.icon {\n  padding-right: spaceMedium;\n}\n\n.header {\n  display: flex;\n  align-items: center;\n  gap: spaceXSmall;\n}\n\n.content {\n  composes: borderTopPrimary from '../../styles/border.module.css';\n  display: flex;\n  flex-flow: column;\n  background-color: colorBackgroundTertiary;\n  padding: spaceSmall;\n  gap: spaceXXSmall;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Accordion/Accordion';\nexport * from '../../components/Accordion/AccordionGroup';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "AccordionGroup.d.ts": {
            "path": "AccordionGroup.d.ts",
            "content": "import * as React from 'react';\nexport type AccordionGroupClassNames = Readonly<{\n    wrapper?: string;\n}>;\nexport interface AccordionGroupPropsType {\n    children: React.ReactNode;\n    onAccordionClick?: (id: string, isOpen: boolean) => unknown;\n    onToggle?: (id: string, checked?: boolean) => unknown;\n    enabledToggleIds?: Array<string>;\n    initialOpenId?: string;\n    classNames?: AccordionGroupClassNames;\n    testId?: string;\n}\nexport declare const AccordionGroup: {\n    ({ children, onAccordionClick, onToggle, initialOpenId, classNames, testId, }: AccordionGroupPropsType): React.JSX.Element;\n    displayName: string;\n};\n//# sourceMappingURL=AccordionGroup.d.ts.map"
          }
        }
      },
      "allFiles": [
        "Accordion.module.css",
        "Accordion.stories.tsx",
        "Accordion.tsx",
        "AccordionGroup.module.css",
        "AccordionGroup.stories.module.css",
        "AccordionGroup.stories.tsx",
        "AccordionGroup.tsx",
        "index.ts"
      ]
    },
    "Avatar": {
      "name": "Avatar",
      "path": "src/components/Avatar",
      "files": {
        "main": {
          "path": "Avatar.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type * as COLORS from '../../styles/variables/_color';\nimport type { IconType } from '../../components/Icon';\nimport type { StatusSemanticType } from '../../components/StatusIndicator';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    ring?: string;\n    content?: string;\n    image?: string;\n    icon?: string;\n    text?: string;\n}>;\nexport declare const AVATAR_SIZE: Readonly<{\n    small: \"small\";\n    medium: \"medium\";\n    large: \"large\";\n    extraLarge: \"extraLarge\";\n}>;\nexport declare const avatarSizeOptions: Array<unknown>;\nexport type AvatarSize = (typeof AVATAR_SIZE)[keyof typeof AVATAR_SIZE];\nexport declare const AVATAR_COLOR: Readonly<{\n    red: \"#fce8ed\";\n    orange: \"#fcf2e7\";\n    green: \"#e6f5ed\";\n    blue: \"#e6f0fe\";\n    gray: \"#EBEBEB\";\n    indigo: \"#f1f1f5\";\n}>;\nexport type AvatarColorType = keyof typeof AVATAR_COLOR;\nexport interface AvatarProps {\n    classNames?: ClassNames;\n    size?: AvatarSize;\n    imageSrc?: string;\n    ring?: boolean;\n    icon?: boolean;\n    text?: string;\n    color?: AvatarColorType;\n    style?: React.CSSProperties;\n    iconName?: string;\n    iconType?: IconType;\n    status?: StatusSemanticType;\n    statusBorderColorToken?: keyof typeof COLORS;\n    testId?: string;\n}\nexport interface AvatarContentProps {\n    imageSrc?: string;\n    text?: string;\n    iconName?: string;\n    iconType?: IconType;\n    size: AvatarSize;\n    color?: AvatarColorType;\n    ring?: boolean;\n    status?: StatusSemanticType;\n    statusBorderColorToken?: keyof typeof COLORS;\n    classNames?: ClassNames;\n    testId?: string;\n}\nexport declare const Avatar: Flow.AbstractComponent<AvatarProps, HTMLDivElement>;\nexport declare const BaseAvatar: ({ classNames, size, text, style, color, testId, }: AvatarProps) => React.JSX.Element;\nexport {};\n//# sourceMappingURL=Avatar.d.ts.map"
        },
        "story": {
          "path": "Avatar.stories.tsx",
          "content": "import * as React from 'react';\n\nimport * as COLORS from 'src/styles/variables/_color';\n\nimport type {AvatarProps} from 'src/components/Avatar';\nimport {AVATAR_COLOR, AVATAR_SIZE} from 'src/components/Avatar';\nimport {Avatar, avatarSizeOptions} from 'src/components/Avatar/Avatar';\nimport {STATUS_SEMANTIC} from 'src/components/StatusIndicator';\nimport {Tooltip} from 'src/components/Tooltip';\n\nimport css from 'src/components/Avatar/Avatar.stories.module.css';\n\n\nconst colorOptions: Array<unknown> = [...Object.keys(AVATAR_COLOR)];\nconst statusOptions: Array<unknown> = [...Object.values(STATUS_SEMANTIC)];\nconst statusColorOptions: Array<unknown> = [...Object.keys(COLORS)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Avatar',\n  argTypes: {\n    status: {\n      options: statusOptions,\n      description:\n        'Status type of a the indicator. It will have different background color for different status',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n      },\n    },\n    statusBorderColorToken: {\n      description:\n        'Pass different color token string to show border of status indicator in different color',\n      options: statusColorOptions,\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'colorBackgroundTertiary'},\n      },\n    },\n    imageSrc: {\n      description: 'Url of image to show in Avatar',\n    },\n    text: {\n      description: 'User name to show in the avatar',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    size: {\n      description:\n        'Avatar supports four size variants namely small, medium, large, extraLarge.',\n      control: {\n        type: 'select',\n      },\n      options: avatarSizeOptions,\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    color: {\n      options: colorOptions,\n      description: 'Background Color of avatar.',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'blue'},\n      },\n    },\n    iconName: {\n      name: 'iconName',\n      description: 'Icon name for icon avatar',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    iconType: {\n      description:\n        'Type represents 4 unique icon styles :- Solid, Regular, Duotone and Brands',\n      options: ['regular', 'solid', 'duotone', 'brands'],\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'regular'},\n      },\n    },\n    ring: {\n      description: 'Ring around the avatar',\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    classNames: {\n      description: 'Provide an optional className to be applied to the wrapper',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary:\n            '{wrapper?: string, ring?: string, content?: string, image?: string, icon?: string, text?: string}',\n        },\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Avatar component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Avatar } from \"@spaced-out/ui-design-system/lib/components/Avatar\";\n\\`\\`\\`\nAvatar component can be used to show image avatars, icon based avatars or text based avatars. It will first look for imageSrc props, then Icon name and optional icon type\nand in the last it use first two initials of text to show text avatar.\nMake sure to pass name for all the avatars which will be used internally as key and to show in tooltip in case of avatar group.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Avatar/Avatar',\n    },\n  },\n};\n\nexport const AvatarStory = (args: AvatarProps) => (\n  <div className={css.container}>\n    <Tooltip body={args.text} testId=\"avatar-tooltip-story\">\n      <Avatar {...args} />\n    </Tooltip>\n  </div>\n);\n\nAvatarStory.args = {\n  imageSrc:\n    'https://cdn.sensehq.com/genesis/hashed/static/images/personas/1.png',\n  size: AVATAR_SIZE.medium,\n  text: 'Adam Craig Gilchrist',\n  iconName: 'face-party',\n  ring: false,\n  color: 'blue',\n  iconType: 'regular',\n  testId: 'avatar-story',\n  // classNames: {content: css.avatarContent, text: css.avatarText},\n};\nAvatarStory.storyName = 'Avatar';\n"
        },
        "css": {
          "path": "Avatar.module.css",
          "content": "@value (colorFillPrimary, colorBackgroundTertiary, colorInformation, colorInformationLightest) from '../../styles/variables/_color.css';\n@value ( size34, size42, size60, size100, sizeFluid) from '../../styles/variables/_size.css';\n@value (borderRadiusCircle, borderRadiusLarge, borderRadiusXLarge, borderWidthSecondary) from '../../styles/variables/_border.css';\n@value (spaceNone, spaceXXSmall, spaceXSmall) from '../../styles/variables/_space.css';\n\n.container {\n  border-radius: borderRadiusCircle;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.container.extraLargeSize {\n  width: size100;\n  height: size100;\n  min-width: size100;\n  min-height: size100;\n}\n\n.container.largeSize {\n  width: size60;\n  height: size60;\n  min-width: size60;\n  min-height: size60;\n}\n\n.container.mediumSize {\n  width: size42;\n  height: size42;\n  min-width: size42;\n  min-height: size42;\n}\n\n.container.smallSize {\n  width: size34;\n  height: size34;\n  min-width: size34;\n  min-height: size34;\n}\n\n.container.baseExtraLargeSize {\n  min-width: size100;\n  height: size100;\n  border-radius: borderRadiusCircle;\n  padding: spaceNone spaceSmall;\n}\n\n.container.baseLargeSize {\n  min-width: size60;\n  height: size60;\n  border-radius: borderRadiusXLarge;\n  padding: 0 spaceXSmall;\n}\n\n.container.baseMediumSize {\n  min-width: size42;\n  height: size42;\n  border-radius: borderRadiusLarge;\n  padding: 0 spaceXXSmall;\n}\n\n.container.baseSmallSize {\n  min-width: size34;\n  height: size34;\n  border-radius: borderRadiusLarge;\n  padding: 0 spaceXXSmall;\n}\n\n.avatar {\n  vertical-align: middle;\n  min-width: sizeFluid;\n  min-height: sizeFluid;\n  border-radius: borderRadiusCircle;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  object-fit: cover;\n}\n\n.ring {\n  border-radius: borderRadiusCircle;\n  width: sizeFluid;\n  height: sizeFluid;\n  border: solid borderWidthSecondary transparent;\n  background-image: linear-gradient(white, white),\n    radial-gradient(circle at top right, colorFillPrimary, colorInformation);\n  background-origin: border-box;\n  background-clip: content-box, border-box;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.whiteCircle {\n  border-radius: borderRadiusCircle;\n  border: solid borderWidthSecondary colorBackgroundTertiary;\n  width: sizeFluid;\n  height: sizeFluid;\n}\n\n.innerContainer {\n  --background-color: colorInformationLightest;\n  display: flex;\n  position: relative;\n  border-radius: borderRadiusCircle;\n  width: sizeFluid;\n  height: sizeFluid;\n  background: var(--background-color);\n}\n\n.alignCenter {\n  align-items: center;\n  justify-content: center;\n}\n\n.statusIndicatorWrapper {\n  position: absolute;\n}\n\n.statusIndicatorWrapper.large {\n  top: calc(spaceXXSmall / 2);\n  right: calc(spaceXXSmall / 2);\n}\n\n.statusIndicatorWrapper.medium {\n  top: spaceNone;\n  right: spaceNone;\n}\n\n.statusIndicatorWrapper.small {\n  top: calc((spaceXXSmall / 2) * -1);\n  right: calc((spaceXXSmall / 2) * -1);\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Avatar/Avatar';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "Avatar.module.css",
        "Avatar.stories.module.css",
        "Avatar.stories.tsx",
        "Avatar.tsx",
        "index.ts"
      ]
    },
    "AvatarGroup": {
      "name": "AvatarGroup",
      "path": "src/components/AvatarGroup",
      "files": {
        "main": {
          "path": "AvatarGroup.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { AvatarSize } from '../../components/Avatar';\nimport type { ElevationType, PlacementType } from '../../components/Tooltip';\nexport interface AvatarGroupProps {\n    children?: React.ReactNode;\n    size?: AvatarSize;\n    borderColor?: string;\n    maxTooltipLines?: number;\n    placement?: PlacementType;\n    maxAvatars?: number;\n    tooltipElevation?: ElevationType;\n    testId?: string;\n}\nexport declare const AvatarGroup: Flow.AbstractComponent<AvatarGroupProps, HTMLDivElement>;\n//# sourceMappingURL=AvatarGroup.d.ts.map"
        },
        "story": {
          "path": "AvatarGroup.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {colorBackgroundTertiary} from 'src/styles/variables/_color';\n\nimport {Avatar, avatarSizeOptions} from 'src/components/Avatar';\nimport type {AvatarGroupProps} from 'src/components/AvatarGroup';\nimport {AvatarGroup} from 'src/components/AvatarGroup';\nimport {ELEVATION_TYPES} from 'src/components/Tooltip';\n\nimport css from 'src/components/AvatarGroup/AvatarGroup.stories.module.css';\n\n\nconst elevationOptions: Array<unknown> = [...Object.values(ELEVATION_TYPES)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Avatar Group',\n  argTypes: {\n    size: {\n      description:\n        'AvatarGroup supports three size variants namely small, medium, large.',\n      control: {\n        type: 'select',\n      },\n      options: avatarSizeOptions,\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    maxTooltipLines: {\n      description: 'Number of lines to show',\n      control: {\n        type: 'number',\n        min: 1,\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: 7},\n      },\n    },\n    maxAvatars: {\n      description: 'Max number of avatars to show including the plus avatar',\n      control: {\n        type: 'number',\n        min: 1,\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: 5},\n      },\n    },\n    borderColor: {\n      description:\n        'Pass color token variables for border color in avatar group',\n      control: {\n        type: 'text',\n      },\n      table: {\n        defaultValue: {summary: colorBackgroundTertiary},\n      },\n    },\n    tooltipElevation: {\n      description:\n        'z-index to the tooltip used internally. This is by default set to elevationTooltip which is `4`. Use this prop when you want to render tooltip at higher elevation elements like Modal, Toast, Menu, etc.',\n      control: {\n        type: 'select',\n      },\n      options: elevationOptions,\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'tooltip'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a AvatarGroup component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { AvatarGroup } from \"@spaced-out/ui-design-system/lib/components/AvatarGroup\";\n\\`\\`\\`\nAvatarGroup will be used to show multiple avatars in a group. It will accept avatars as child and configure then in once size based on the size of the group\n, put borders. It will show limited numbers of avatars and add a plus avatar in end to represent rest avatars.\nOn hover of plus avatars list of avatars will be shown in tooltip.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/AvatarGroup/AvatarGroup',\n    },\n  },\n};\n\nexport const AvatarGroupStory = (args: AvatarGroupProps) => (\n  <div className={css.storyContainer}>\n    <AvatarGroup {...args}>\n      <Avatar\n        imageSrc=\"https://cdn.sensehq.com/genesis/hashed/static/images/personas/1.png\"\n        text=\"Adam Craig Gilchrist\"\n      />\n      <Avatar\n        imageSrc=\"https://cdn.sensehq.com/genesis/hashed/static/images/personas/4.png\"\n        text=\"Git User 1\"\n      />\n      <Avatar\n        imageSrc=\"https://cdn.sensehq.com/genesis/hashed/static/images/personas/5.png\"\n        text=\"Adam Gilchrist\"\n      />\n      <Avatar\n        imageSrc=\"https://cdn.sensehq.com/genesis/hashed/static/images/personas/6.png\"\n        text=\"Git User 4\"\n        iconName=\"trophy\"\n        iconType=\"regular\"\n      />\n      <Avatar\n        imageSrc=\"https://cdn.sensehq.com/genesis/hashed/static/images/personas/2.png\"\n        text=\"Git User 5\"\n      />\n      <Avatar imageSrc=\"\" text=\"Git User 6\" />\n      <Avatar text=\"Git User 7\" />\n      <Avatar text=\"At User 8\" />\n      <Avatar imageSrc=\"\" text=\"K User 9\" />\n      <Avatar text=\"Git User 10\" />\n      <Avatar iconName=\"face-party\" iconType=\"regular\" />\n      <Avatar text=\"Git User 12\" />\n      <Avatar text=\"k g 13\" />\n      <Avatar text=\"U Patel 14\" />\n      <Avatar text=\"M P 15\" />\n    </AvatarGroup>\n  </div>\n);\n\nAvatarGroupStory.args = {\n  size: 'medium',\n  maxTooltipLines: 7,\n  maxAvatars: 5,\n  borderColor: colorBackgroundTertiary,\n  testId: 'avatar-group-story',\n};\nAvatarGroupStory.storyName = 'Avatar Group';\n"
        },
        "css": {
          "path": "AvatarGroup.module.css",
          "content": "@value (colorFillPrimary, colorBackgroundTertiary) from '../../styles/variables/_color.css';\n@value (borderWidthTertiary) from '../../styles/variables/_border.css';\n@value ( size34, size42, size60, size100) from '../../styles/variables/_size.css';\n\n.avatarGroupContainer {\n  display: flex;\n  flex-direction: row;\n}\n\n.avatarGroupContainer.extraLargeSize {\n  height: size100;\n  width: size100;\n}\n\n.avatarGroupContainer.largeSize {\n  height: size60;\n}\n\n.avatarGroupContainer.mediumSize {\n  height: size42;\n}\n\n.avatarGroupContainer.smallSize {\n  height: size34;\n}\n\n.avatarInGroup {\n  display: flex;\n  border: borderWidthTertiary solid colorBackgroundTertiary;\n  position: relative;\n}\n\n.nameList {\n  display: flex;\n  flex-direction: column;\n}\n\n.plusAvatar {\n  display: flex;\n  cursor: pointer;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/AvatarGroup/AvatarGroup';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "AvatarGroup.module.css",
        "AvatarGroup.stories.module.css",
        "AvatarGroup.stories.tsx",
        "AvatarGroup.tsx",
        "index.ts"
      ]
    },
    "Badge": {
      "name": "Badge",
      "path": "src/components/Badge",
      "files": {
        "main": {
          "path": "Badge.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { IconSize, IconType } from '../../components/Icon';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    text?: string;\n    icon?: string;\n}>;\nexport declare const BADGE_COLOR: Readonly<{\n    gray: \"#EBEBEB\";\n    red: \"#fce8ed\";\n    redDark: \"#e31c4c\";\n    orange: \"#fcf2e7\";\n    orangeDark: \"#df7e0c\";\n    green: \"#e6f5ed\";\n    greenDark: \"#03964d\";\n    blue: \"#e6f0fe\";\n    blueDark: \"#0769f0\";\n    indigo: \"#f1f1f5\";\n    indigoDark: \"#706F9B\";\n}>;\nexport type BadgeColorType = keyof typeof BADGE_COLOR;\nexport interface BaseBadgeProps {\n    classNames?: ClassNames;\n    fill?: BadgeColorType;\n    testId?: string;\n}\nexport interface BadgeProps extends Omit<BaseBadgeProps, 'text'> {\n    text: string;\n}\nexport interface IconBadgeProps extends Omit<BaseBadgeProps, 'iconName' | 'iconType' | 'iconSize' | 'onClick' | 'ariaLabel'> {\n    iconName: string;\n    iconType?: IconType;\n    iconSize?: IconSize;\n    onClick?: React.MouseEventHandler<HTMLDivElement>;\n    ariaLabel?: string;\n}\nexport declare const Badge: Flow.AbstractComponent<BadgeProps, HTMLDivElement>;\nexport declare const IconBadge: Flow.AbstractComponent<IconBadgeProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=Badge.d.ts.map"
        },
        "story": {
          "path": "Badge.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {BadgeProps, IconBadgeProps} from 'src/components/Badge/Badge';\nimport {Badge, BADGE_COLOR, IconBadge} from 'src/components/Badge/Badge';\nimport {ICON_SIZE} from 'src/components/Icon';\n\nimport css from 'src/components/Badge/Badge.stories.module.css';\n\n\nconst fillColors: Array<unknown> = [...Object.keys(BADGE_COLOR)];\nconst iconSize: Array<unknown> = [...Object.values(ICON_SIZE)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Badge',\n  argTypes: {\n    fill: {\n      description:\n        'Pass different color token string to show Badge in different color',\n      options: fillColors,\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'gray'},\n      },\n    },\n    classNames: {\n      description: 'External classNames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: '{wrapper?: string, text?: string, icon?: string}'},\n      },\n    },\n    text: {\n      type: {required: true},\n      description: 'The content of the Badge. [Only available in `<Badge />`]',\n      table: {\n        type: {summary: 'React.Component'},\n      },\n    },\n    iconName: {\n      description:\n        'Icon Name represents name of icon as supported by fontawesome. [Only available in `<IconBadge />`]',\n      type: {required: true},\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    iconSize: {\n      description:\n        'Icon supports three size variants namely small and medium. `small` < `medium` < `large`. [Only available in `<IconBadge />`]',\n      options: iconSize,\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'small'},\n      },\n    },\n    ariaLabel: {\n      control: {\n        type: 'text',\n      },\n      description:\n        '**aria-label** should be added where `ClickableIcon` and `CloseIcon` is used. This would avoid accessibility violations in screen readers. [Only available in `<IconBadge />`]',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    iconType: {\n      description:\n        'Type represents 5 unique icon styles :- Solid, Regular, Light, Thin, Duotone. [Only available in `<IconBadge />`]',\n      options: ['regular', 'solid', 'duotone', 'brands'],\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'solid'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Badge component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Badge, IconBadge } from \"@spaced-out/ui-design-system/lib/components/Badge\";\n\\`\\`\\`\nSimple Badge component that supports fill and text as prop. There is also a \\`IconBadge\\` component that supports all the\nprops of \\`Badge\\` and also supports \\`iconName\\` and \\`iconSize\\` as props.\n\n### Usage:\n\n\\`\\`\\`jsx\n<Badge text=\"12\" />\n\n<IconBadge\n  fill=\"greenDark\"\n  iconName=\"check\"\n/>\n\\`\\`\\`\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Badge/Badge',\n    },\n  },\n};\n\nexport const BadgeStory = (args: BadgeProps) => (\n  <div className={css.container}>\n    <Badge {...args}></Badge>\n  </div>\n);\n\nBadgeStory.args = {\n  text: '12',\n  testId: 'badge-story',\n};\n\nexport const IconBadgeStory = (args: IconBadgeProps) => (\n  <div className={css.container}>\n    <IconBadge {...args}></IconBadge>\n  </div>\n);\n\nIconBadgeStory.args = {\n  iconName: 'check',\n  fill: 'greenDark',\n  testId: 'icon-badge-story',\n};\nBadgeStory.storyName = 'Badge';\nIconBadgeStory.storyName = 'Icon Badge';\n"
        },
        "css": {
          "path": "Badge.module.css",
          "content": "@value (size12, size22, size100) from '../../styles/variables/_size.css';\n@value (spaceXSmall, spaceNone) from '../../styles/variables/_space.css';\n@value (colorGrayLightest, colorTextInversePrimary, colorTextPrimary) from '../../styles/variables/_color.css';\n\n.badgeWrapper {\n  --wrapperBgColor: colorGrayLightest;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border-radius: size100;\n  height: size22;\n  padding: spaceNone spaceXSmall;\n  min-width: fit-content;\n  width: fit-content;\n  background-color: var(--wrapperBgColor);\n  color: colorTextInversePrimary;\n}\n\n.iconContainer {\n  height: initial;\n  padding: calc(size12 / 4);\n}\n\n.dark {\n  color: colorTextInversePrimary;\n}\n\n.light {\n  color: colorTextPrimary;\n}\n\n.fixedWidth {\n  padding: initial;\n  width: size22;\n  height: size22;\n  min-width: size22;\n  min-height: size22;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Badge/Badge';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "Badge.module.css",
        "Badge.stories.module.css",
        "Badge.stories.tsx",
        "Badge.tsx",
        "index.ts"
      ]
    },
    "BadgedIcon": {
      "name": "BadgedIcon",
      "path": "src/components/BadgedIcon",
      "files": {
        "main": {
          "path": "BadgedIcon.d.ts",
          "content": "import * as React from 'react';\nimport type { IconSize, IconType } from '../../components/Icon';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    icon?: string;\n    badgeIcon?: string;\n}>;\nexport interface BadgedIconProps {\n    type?: IconType;\n    name: string;\n    size?: IconSize;\n    ariaLabel?: string;\n    showBadge?: boolean;\n    classNames?: ClassNames;\n    testId?: string;\n}\nexport declare const BadgedIcon: ({ name, showBadge, classNames, size, type, ariaLabel, testId, }: BadgedIconProps) => React.JSX.Element;\nexport {};\n//# sourceMappingURL=BadgedIcon.d.ts.map"
        },
        "story": {
          "path": "BadgedIcon.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {BadgedIconProps} from 'src/components/BadgedIcon';\nimport {BadgedIcon} from 'src/components/BadgedIcon/BadgedIcon';\nimport {ICON_DOCS} from 'src/components/Icon/Icon.docs';\n\nimport css from 'src/components/BadgedIcon/BadgedIcon.stories.module.css';\n\n\nconst {name, size, ariaLabel} = ICON_DOCS.argTypes;\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Badged Icon',\n  component: BadgedIcon,\n  argTypes: {\n    classNames: {\n      description: 'External classnames to be applied.',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{wrapper?: string, icon?: string, badgeIcon?: string}',\n        },\n      },\n    },\n    showBadge: {\n      description: 'If **true**, the badge icon is shown',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'true'},\n      },\n    },\n    type: {\n      description:\n        'Type represents 5 unique icon styles :- Solid, Regular, Light, Thin, Duotone',\n      options: ['regular', 'solid', 'duotone', 'brands'],\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'solid'},\n      },\n    },\n    name,\n    size,\n    ariaLabel,\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Badged Icon component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { BadgedIcon } from \"@spaced-out/ui-design-system/lib/components/BadgedIcon\";\n\\`\\`\\`\nBadgedIcon component is a wrapper around the Icon component. It is used to display an icon with a badge.\nThis uses <a href=\"https://fontawesome.com/icons\" target=\"_blank\">fontawesome</a> icon internally.\nThe name prop has be to consistent with one used in fontawesome.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/BadgedIcon/BadgedIcon',\n    },\n  },\n};\n\nexport const BadgedIconStory = (args: BadgedIconProps) => (\n  <div className={css.container}>\n    <BadgedIcon {...args} />\n  </div>\n);\n\nBadgedIconStory.args = {\n  classNames: {wrapper: ''},\n  name: 'face-party',\n  testId: 'badged-icon-story',\n};\nBadgedIconStory.storyName = 'Badged Icon';\n"
        },
        "css": {
          "path": "BadgedIcon.module.css",
          "content": "@value (colorBackgroundTertiary) from '../../styles/variables/_color.css';\n\n@value (\n  size42,\n  size34,\n  size60,\n  size8,\n  size12,\n  size2,\n  size4\n) from '../../styles/variables/_size.css';\n\n@value (\n  borderRadiusMedium,\n  borderRadiusCircle\n) from '../../styles/variables/_border.css';\n\n@value (\n  motionEaseInEaseOut,\n  motionDurationSlow\n) from '../../styles/variables/_motion.css';\n\n@value (\n  spaceNone,\n  spaceMedium,\n  spaceXSmall\n) from '../../styles/variables/_space.css';\n\n.iconContainer {\n  display: flex;\n  width: fit-content;\n  min-width: size34;\n  min-height: size34;\n  justify-content: center;\n  align-items: center;\n  border-radius: borderRadiusMedium;\n  position: relative;\n  background: linear-gradient(\n      91deg,\n      rgba(204, 192, 240, 0.5) 0%,\n      rgba(178, 209, 250, 0.5) 100%\n    ),\n    colorBackgroundTertiary;\n}\n\n.medium {\n  width: size42;\n  height: size42;\n}\n\n.small {\n  width: size34;\n  height: size34;\n}\n\n.large {\n  width: size60;\n  height: size60;\n}\n\n.iconContainer:hover .badgeIcon {\n  transform: rotate(-90deg);\n}\n\n.badgeIcon {\n  position: absolute;\n  border-radius: borderRadiusCircle;\n  top: calc(size2 * -1);\n  right: calc(size4 * -1);\n  transition: transform motionDurationSlow motionEaseInEaseOut;\n}\n\n.small .badgeIcon {\n  width: size8;\n  height: size8;\n  left: calc(spaceMedium + spaceXSmall);\n  top: spaceNone;\n}\n\n.medium .badgeIcon {\n  width: size12;\n  height: size12;\n}\n\n.large .badgeIcon {\n  width: size12;\n  height: size12;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/BadgedIcon/BadgedIcon';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "BadgedIcon.module.css",
        "BadgedIcon.stories.module.css",
        "BadgedIcon.stories.tsx",
        "BadgedIcon.tsx",
        "index.ts"
      ]
    },
    "Banner": {
      "name": "Banner",
      "path": "src/components/Banner",
      "files": {
        "main": {
          "path": "Banner.d.ts",
          "content": "import type { Flow } from 'flow-to-typescript-codemod';\nimport type { InContextAlertProps } from '../../components/InContextAlert';\nexport interface BannerProps extends Omit<InContextAlertProps, 'alignment'> {\n    alignment?: 'top' | 'bottom';\n    testId?: string;\n}\nexport declare const Banner: Flow.AbstractComponent<BannerProps, HTMLDivElement>;\n//# sourceMappingURL=Banner.d.ts.map"
        },
        "story": {
          "path": "Banner.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {ALERT_SEMANTIC} from 'src/types/common';\n\nimport type {BannerProps} from 'src/components/Banner/Banner';\nimport {Banner} from 'src/components/Banner/Banner';\n\nimport css from 'src/components/Banner/Banner.stories.module.css';\n\n\nconst semanticOptions: Array<unknown> = [...Object.values(ALERT_SEMANTIC)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Banner',\n  argTypes: {\n    actionText: {\n      name: 'actionText',\n      description: 'Action text to be displayed on **right** of Alert',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    onAction: {\n      name: 'onAction',\n      action: 'Action Click',\n      description: 'Callback function for action text click',\n      type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n    },\n    semantic: {\n      options: semanticOptions,\n      description:\n        'Semantic type of Banner. It will have different Icon and background color for different semantic type',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: ALERT_SEMANTIC.neutral},\n      },\n    },\n    alignment: {\n      options: ['top', 'bottom'],\n      description:\n        'Semantic type of Banner. It will have different Icon and background color for different semantic type',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'top'},\n      },\n    },\n    onCloseClick: {\n      name: 'onCloseClick',\n      action: 'Close Click',\n      description: 'Callback function for dismissable alert',\n      type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n    },\n    dismissable: {\n      description: 'Close Icon will appear in right side in case it is true',\n      name: 'dismissable',\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    selfDismiss: {\n      description: `This prop is valid only in case dismissable is true.\n      It handles whether the dismissal should be handled by the component or it will just pass callback onclick of closeIcon and dismissal will be handled externally`,\n      name: 'selfDismiss',\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    leftIconName: {\n      name: 'leftIconName',\n      control: {\n        type: 'text',\n      },\n      description: 'Custom left icon. This overrides the default semantic icon',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    leftIconType: {\n      options: ['regular', 'solid'],\n      description: 'Type of Icon',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'regular'},\n      },\n    },\n    children: {\n      description: 'Pass the alert message text as children',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    classNames: {\n      description:\n        'Provide an optional className to be applied to the wrapper, alertText',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary:\n            '{wrapper?: string, alertText?: string, actionContainer?: string}',\n        },\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Banner component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Banner } from \"@spaced-out/ui-design-system/lib/components/Banner\";\n\\`\\`\\`\nUse Banner component to show alert message of different semantics like - success, warning etc. It will take width of the container\nand will show only two lines of text. Post that it will get truncated. As there is no way for user to see the truncated message, it is recommended\nto use it for messages up to two lines only or add a tooltip along with it for showcasing complete message.\n\nBanners should ideally be absolutely positioned and should stick to top or bottom of container\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Banner/Banner',\n    },\n  },\n};\n\nexport const DefaultStory = (args: BannerProps) => (\n  <div className={css.storyContainer}>\n    <Banner {...args} />\n  </div>\n);\n\nDefaultStory.args = {\n  children: 'The quick brown fox jumps over the lazy dog',\n  semantic: 'neutral',\n  testId: 'banner-default-story',\n};\n\nexport const DismissableStory = (args: BannerProps) => (\n  <div className={css.storyContainer}>\n    <Banner {...args} />\n  </div>\n);\n\nDismissableStory.args = {\n  children: 'The quick brown fox jumps over the lazy dog',\n  semantic: 'neutral',\n  dismissable: true,\n  selfDismiss: false,\n  testId: 'banner-dismissable-story',\n};\n\nexport const ActionableStory = (args: BannerProps) => (\n  <div className={css.storyContainer}>\n    <Banner {...args} />\n  </div>\n);\n\nActionableStory.args = {\n  children: 'Message could not be delivered',\n  semantic: 'danger',\n  actionText: 'Resend',\n  testId: 'banner-actionable-story',\n};\n\nexport const ActionableAndDismissableStory = (args: BannerProps) => (\n  <div className={css.storyContainer}>\n    <Banner {...args} />\n  </div>\n);\n\nActionableAndDismissableStory.args = {\n  children: 'Schedule Message - 24 Dec 2021 @ 04:00AM',\n  semantic: 'information',\n  actionText: 'View Details',\n  dismissable: true,\n  selfDismiss: false,\n  testId: 'banner-actionable-dismissable-story',\n};\nDefaultStory.storyName = 'Default';\nDismissableStory.storyName = 'Dismissable';\nActionableStory.storyName = 'Actionable';\nActionableAndDismissableStory.storyName = 'Actionable And Dismissable';\n"
        },
        "css": {
          "path": "Banner.module.css",
          "content": "@value (\n  colorNeutralLight,\n  colorSuccessLight,\n  colorInformationLight,\n  colorWarningLight,\n  colorDangerLight\n) from '../../styles/variables/_color.css';\n\n@value (\n  spaceMedium,\n  spaceSmall\n) from '../../styles/variables/_space.css';\n\n@value (\n  borderWidthPrimary\n) from '../../styles/variables/_border.css';\n\n.bannerContainer {\n  border: none;\n  border-radius: initial;\n  padding: spaceSmall spaceMedium;\n}\n\n.neutral {\n  border-color: colorNeutralLight;\n}\n\n.success {\n  border-color: colorSuccessLight;\n}\n\n.information {\n  border-color: colorInformationLight;\n}\n\n.warning {\n  border-color: colorWarningLight;\n}\n\n.danger {\n  border-color: colorDangerLight;\n}\n\n.topAligned {\n  border-bottom-width: borderWidthPrimary;\n  border-bottom-style: solid;\n}\n\n.bottomAligned {\n  border-top-width: borderWidthPrimary;\n  border-top-style: solid;\n}\n\n.alertContainer {\n  padding-left: calc(spaceSmall * 2);\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Banner/Banner';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "Banner.module.css",
        "Banner.stories.module.css",
        "Banner.stories.tsx",
        "Banner.tsx",
        "index.ts"
      ]
    },
    "Breadcrumbs": {
      "name": "Breadcrumbs",
      "path": "src/components/Breadcrumbs",
      "files": {
        "main": {
          "path": "Breadcrumbs.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { BaseLinkProps } from '../../components/Link';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n}>;\nexport interface BreadcrumbsProps {\n    classNames?: ClassNames;\n    children: React.ReactNode;\n    linkComponent?: Flow.AbstractComponent<BaseLinkProps, HTMLAnchorElement | null | undefined>;\n    testId?: string;\n}\nexport declare const Breadcrumbs: Flow.AbstractComponent<BreadcrumbsProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=Breadcrumbs.d.ts.map"
        },
        "story": {
          "path": "Breadcrumbs.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {BreadcrumbsProps} from 'src/components/Breadcrumbs';\nimport {BreadcrumbLink} from 'src/components/Breadcrumbs';\nimport {Breadcrumbs} from 'src/components/Breadcrumbs/Breadcrumbs';\nimport {Button} from 'src/components/Button';\n\nimport css from 'src/components/Breadcrumbs/Breadcrumbs.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Breadcrumbs/Breadcrumbs',\n  component: Breadcrumbs,\n  argTypes: {\n    classNames: {\n      description: 'Provide an optional className to be applied to the wrapper',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{ wrapper?: string }',\n        },\n      },\n    },\n    children: {\n      description:\n        'A list of `BreadcrumbLink` components to be displayed as breadcrumbs',\n      table: {\n        type: {\n          summary: 'React.Node',\n        },\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Breadcrumbs component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Breadcrumbs, BreadcrumbLink } from \"@spaced-out/ui-design-system/lib/components/Breadcrumbs\";\n\\`\\`\\`\nBreadcrumbs is a component used to display a breadcrumb trail with clickable links.\n\n**Usage with \\`Routing Library\\`:**\n\nTo use the \\`Breadcrumbs\\` with a routing Library, you would need to pass the \\`linkComponent\\` prop to the \\`<BreadcrumbLink>\\` component.\n\n**Routing** and **highlighting the selected page** would be handled by the component itself.\n\n\\`\\`\\`jsx\nimport {Link} from 'src/rerouter';\nimport {Breadcrumbs, BreadcrumbLink} from '@spaced-out/ui-design-system/lib/components/Breadcrumbs';\n\n<Breadcrumbs linkComponent={Link}>\n  <BreadcrumbLink to=\"/page1\" id=\"page1\">Page 1</BreadcrumbLink>\n  <BreadcrumbLink to=\"/page2\" id=\"page2\">Page 2</BreadcrumbLink>\n  <BreadcrumbLink to=\"/page3\" id=\"page3\">Page 3</BreadcrumbLink>\n</Breadcrumbs>\n\\`\\`\\`\n\nIt'll replace the rendered a tag with routing library's Link.\n\n**Usage with \\`onClick\\`:**\n\n\\`\\`\\`jsx\n<Breadcrumbs>\n  <BreadcrumbLink id=\"page1\" onClick={handleClick} isActive={activePageId === 'page1'}>Page 1</BreadcrumbLink>\n  <BreadcrumbLink id=\"page2\" onClick={handleClick} isActive={activePageId === 'page2'}>Page 2</BreadcrumbLink>\n  <BreadcrumbLink id=\"page3\" onClick={handleClick} isActive={activePageId === 'page3'}>Page 3</BreadcrumbLink>\n</Breadcrumbs>\n\\`\\`\\`\n\nIn the above example, you can include multiple BreadcrumbLink components within the Breadcrumbs component to create a breadcrumb trail.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Breadcrumbs/Breadcrumbs',\n    },\n  },\n};\n\nconst PAGES = [\n  {id: '1', name: 'Page #1'},\n  {id: '2', name: 'Page #2'},\n  {id: '3', name: 'Page #3'},\n  {id: '4', name: 'Page #4'},\n];\n\nexport const BreadcrumbsStory = (args: BreadcrumbsProps) => {\n  const [selectedPage, setSelectedPage] = React.useState('4');\n  const [pages, setPages] = React.useState(PAGES);\n\n  const onPageSelection = (\n    _e: React.SyntheticEvent<HTMLElement>,\n    pageId: string,\n  ) => {\n    setSelectedPage(pageId);\n\n    // remove all pages after the selected page\n    setPages(pages.filter((page) => parseInt(page.id) <= parseInt(pageId)));\n  };\n\n  const addPage = () => {\n    const newPageId = (parseInt(pages[pages.length - 1].id) + 1).toString();\n    const newPageName = `Page #${newPageId}`;\n    setSelectedPage(newPageId);\n\n    setPages([...pages, {id: newPageId, name: newPageName}]);\n  };\n\n  return (\n    <div className={css.wrapper}>\n      <Breadcrumbs {...args}>\n        {pages.map((page) => (\n          <BreadcrumbLink\n            id={page.id}\n            onClick={onPageSelection}\n            isActive={selectedPage === page.id}\n          >\n            {page.name}\n          </BreadcrumbLink>\n        ))}\n      </Breadcrumbs>\n      <div>\n        <Button iconLeftName=\"plus\" size=\"small\" onClick={addPage}>\n          Add Page\n        </Button>\n      </div>\n    </div>\n  );\n};\n\nBreadcrumbsStory.args = {\n  classNames: {wrapper: ''},\n};\n\nexport const BreadcrumbsWithBorderStory = (args: BreadcrumbsProps) => {\n  const [selectedPage, setSelectedPage] = React.useState('4');\n  const [pages, setPages] = React.useState(PAGES);\n\n  const onPageSelection = (\n    _e: React.SyntheticEvent<HTMLElement>,\n    pageId: string,\n  ) => {\n    setSelectedPage(pageId);\n\n    // remove all pages after the selected page\n    setPages(pages.filter((page) => parseInt(page.id) <= parseInt(pageId)));\n  };\n\n  const addPage = () => {\n    const newPageId = (parseInt(pages[pages.length - 1].id) + 1).toString();\n    const newPageName = `Page #${newPageId}`;\n    setSelectedPage(newPageId);\n\n    setPages([...pages, {id: newPageId, name: newPageName}]);\n  };\n\n  return (\n    <div className={css.wrapper}>\n      <Breadcrumbs\n        {...args}\n        classNames={{\n          wrapper: css.borderedWrapper,\n        }}\n      >\n        {pages.map((page) => (\n          <BreadcrumbLink\n            id={page.id}\n            onClick={onPageSelection}\n            isActive={selectedPage === page.id}\n          >\n            {page.name}\n          </BreadcrumbLink>\n        ))}\n      </Breadcrumbs>\n      <div>\n        <Button iconLeftName=\"plus\" size=\"small\" onClick={addPage}>\n          Add Page\n        </Button>\n      </div>\n    </div>\n  );\n};\n\nBreadcrumbsWithBorderStory.args = {\n  classNames: {wrapper: ''},\n};\nBreadcrumbsStory.storyName = 'Breadcrumbs';\nBreadcrumbsWithBorderStory.storyName = 'Breadcrumbs With Border';\n"
        },
        "css": {
          "path": "Breadcrumbs.module.css",
          "content": "@value (\n  spaceNone,\n  spaceSmall,\n  spaceMedium\n) from '../../styles/variables/_space.css';\n\n@value (\n  size28\n) from '../../styles/variables/_size.css';\n\n.wrapper {\n  display: flex;\n  align-items: center;\n  flex-wrap: wrap;\n  padding: calc(spaceMedium / 4) spaceNone;\n  min-height: size28;\n}\n\n.separator {\n  margin-left: spaceSmall;\n  margin-right: spaceSmall;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Breadcrumbs/BreadcrumbLink';\nexport * from '../../components/Breadcrumbs/Breadcrumbs';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "BreadcrumbLink/BreadcrumbLink.d.ts": {
            "path": "BreadcrumbLink/BreadcrumbLink.d.ts",
            "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { LinkProps } from '../../../components/Link';\nexport interface BreadcrumbLinkProps extends Omit<LinkProps, 'isActive' | 'id' | 'onClick'> {\n    isActive?: boolean;\n    id: string;\n    onClick?: (arg1: React.SyntheticEvent<HTMLElement>, id: string) => unknown;\n    testId?: string;\n}\nexport declare const BreadcrumbLink: Flow.AbstractComponent<BreadcrumbLinkProps, HTMLAnchorElement | null | undefined>;\n//# sourceMappingURL=BreadcrumbLink.d.ts.map"
          },
          "BreadcrumbLink/index.d.ts": {
            "path": "BreadcrumbLink/index.d.ts",
            "content": "export * from '../../../components/Breadcrumbs/BreadcrumbLink/BreadcrumbLink';\n//# sourceMappingURL=index.d.ts.map"
          }
        }
      },
      "allFiles": [
        "BreadcrumbLink/BreadcrumbLink.module.css",
        "BreadcrumbLink/BreadcrumbLink.stories.tsx",
        "BreadcrumbLink/BreadcrumbLink.tsx",
        "BreadcrumbLink/index.ts",
        "Breadcrumbs.module.css",
        "Breadcrumbs.stories.module.css",
        "Breadcrumbs.stories.tsx",
        "Breadcrumbs.tsx",
        "index.ts"
      ]
    },
    "Button": {
      "name": "Button",
      "path": "src/components/Button",
      "files": {
        "main": {
          "path": "Button.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { IconType } from '../../components/Icon';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    icon?: string;\n    text?: string;\n}>;\n/**\n * Note(Nishant): Although Button supports gradient as a type, its not currently customizable really.\n * This only supports pre-defined gradient that moves from left to right.\n * If someone wants to add more gradients, the expectation is that they would add it through a wrapper className.\n *\n * We could have taken an extra prop to take in the Gradient colors but that should not be encouraged\n * as it would add an additional overhead on the component to figure out exact color values from string tokens\n * and since this is rarely used type anyway, it should be avoided.\n */\nexport declare const BUTTON_TYPES: Readonly<{\n    primary: \"primary\";\n    secondary: \"secondary\";\n    tertiary: \"tertiary\";\n    ghost: \"ghost\";\n    danger: \"danger\";\n    gradient: \"gradient\";\n    tertiaryGradient: \"tertiaryGradient\";\n}>;\nexport declare const BUTTON_ACTION_TYPE: Readonly<{\n    button: \"button\";\n    submit: \"submit\";\n    reset: \"reset\";\n}>;\nexport declare const BUTTON_SIZE: Readonly<{\n    small: \"small\";\n    medium: \"medium\";\n}>;\nexport type ButtonType = (typeof BUTTON_TYPES)[keyof typeof BUTTON_TYPES];\nexport type ButtonActionType = (typeof BUTTON_ACTION_TYPE)[keyof typeof BUTTON_ACTION_TYPE];\nexport type ButtonSize = keyof typeof BUTTON_SIZE;\nexport interface BaseButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children' | 'disabled' | 'actionType' | 'onClick' | 'ariaLabel' | 'tabIndex' | 'isLoading' | 'role'> {\n    children?: React.ReactNode;\n    disabled?: boolean;\n    actionType?: ButtonActionType;\n    onClick?: React.MouseEventHandler<HTMLButtonElement>;\n    ariaLabel?: string;\n    tabIndex?: number;\n    isLoading?: boolean;\n    role?: string;\n    testId?: string;\n}\nexport interface UnstyledButtonProps extends Omit<BaseButtonProps, 'className'> {\n    className?: string;\n}\nexport interface ButtonProps extends Omit<BaseButtonProps, 'classNames' | 'iconLeftName' | 'iconLeftType' | 'iconRightName' | 'iconRightType' | 'type' | 'isFluid' | 'size'> {\n    classNames?: ClassNames;\n    iconLeftName?: string;\n    iconLeftType?: IconType;\n    iconRightName?: string;\n    iconRightType?: IconType;\n    type?: ButtonType;\n    isFluid?: boolean;\n    size?: ButtonSize;\n}\nexport declare const UnstyledButton: Flow.AbstractComponent<UnstyledButtonProps, HTMLButtonElement>;\nexport declare const Button: Flow.AbstractComponent<ButtonProps, HTMLButtonElement>;\nexport {};\n//# sourceMappingURL=Button.d.ts.map"
        },
        "story": {
          "path": "Button.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {ButtonProps} from 'src/components/Button/Button';\nimport {\n  Button,\n  BUTTON_ACTION_TYPE,\n  BUTTON_SIZE,\n  BUTTON_TYPES,\n} from 'src/components/Button/Button';\n\n\nconst actionTypeOptions: Array<unknown> = [\n  ...Object.values(BUTTON_ACTION_TYPE),\n];\nconst buttonTypeOptions: Array<unknown> = [...Object.values(BUTTON_TYPES)];\nconst buttonSizeOptions: Array<unknown> = [...Object.values(BUTTON_SIZE)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Button',\n  component: Button,\n  argTypes: {\n    onClick: {\n      description:\n        '**onClick** handler that is applied to the root `<button>` element',\n      action: 'clicked',\n      table: {\n        type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n      },\n    },\n    classNames: {\n      description: 'External classNames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: '{wrapper?: string, icon?: string, text?: string}'},\n      },\n    },\n    iconLeftName: {\n      description:\n        'Left icon to be applied to the button, it internally uses the `Icon` component to render icons',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    iconLeftType: {\n      description:\n        'Type of Left Icon. Type represents 4 unique icon styles :- Solid, Regular, Duotone and Brands',\n      options: ['regular', 'solid', 'duotone', 'brands'],\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'regular'},\n      },\n    },\n    iconRightName: {\n      description:\n        'Right icon to be applied to the button, it internally uses the `Icon` component to render icons',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    iconRightType: {\n      description:\n        'Type of Right Icon. Type represents 4 unique icon styles :- Solid, Regular, Duotone and Brands',\n      options: ['regular', 'solid', 'duotone', 'brands'],\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'regular'},\n      },\n    },\n    type: {\n      options: buttonTypeOptions,\n      description: 'Type of Button. Supported types are listed on the dropdown',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'primary'},\n      },\n    },\n    actionType: {\n      options: actionTypeOptions,\n      description:\n        'Type of action to perform upon Button click. Supported types are listed on the dropdown',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'submit'},\n      },\n    },\n    size: {\n      description:\n        'Button supports only two size variants namely small and medium. `small` < `medium`',\n      options: buttonSizeOptions,\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    disabled: {\n      description: 'If **true**, the component is disabled',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    isLoading: {\n      description:\n        'If **true**, the component would show a circular loader and also preserve the current size of button so that there are no jumps',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    isFluid: {\n      description:\n        'If **true**, the component would take the container\\'s `width`',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    children: {\n      description: 'The content of the Button',\n      table: {\n        type: {summary: 'React.Component | string'},\n      },\n    },\n    ariaLabel: {\n      control: {\n        type: 'text',\n      },\n      description:\n        '**aria-label** should be used where Button do not have have discernible text. This would avoid accessibility violations in screen readers',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Button component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Button } from \"@spaced-out/ui-design-system/lib/components/Button\";\n\\`\\`\\`\nButtons allow users to take actions. Button comes with multiple variants and has various states(hover, focus, etc). Variation also include\nan Icon only variant, it is rendered when no content(child) is passed to the button. An unstyled button is also present for one off use cases\nwhere we want to style the button differently.\n\n**Note: ** Always use \\`ariaLabel\\` with Icon only button for accessibility\n          `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Button/Button',\n    },\n  },\n};\n\n/** Text only Button */\nexport const TextOnlyStory = (args: ButtonProps) => <Button {...args} />;\n\nTextOnlyStory.args = {\n  children: 'Primary Button Text',\n  type: 'primary',\n  size: 'medium',\n  testId: 'button-text-only-story',\n};\n\nexport const TextIconLeftStory = (args: ButtonProps) => <Button {...args} />;\n\nTextIconLeftStory.args = {\n  children: 'Button Text',\n  type: 'primary',\n  size: 'medium',\n  iconLeftName: 'face-party',\n  testId: 'button-text-icon-left-story',\n};\n\nexport const TextIconRightStory = (args: ButtonProps) => <Button {...args} />;\n\nTextIconRightStory.args = {\n  children: 'Button Text',\n  type: 'primary',\n  size: 'medium',\n  iconRightName: 'face-party',\n  testId: 'button-text-icon-right-story',\n};\n\nexport const IconOnlyStory = (args: ButtonProps) => <Button {...args} />;\n\nIconOnlyStory.args = {\n  type: 'primary',\n  size: 'medium',\n  iconRightName: 'face-party',\n  ariaLabel: 'Icon Button',\n  testId: 'button-icon-only-story',\n};\n\nexport const GradientStory = (args: ButtonProps) => <Button {...args} />;\n\nGradientStory.args = {\n  type: 'gradient',\n  iconLeftName: 'sparkles',\n  iconLeftType: 'solid',\n  children: 'Sense AI',\n  testId: 'button-gradient-story',\n};\n\nexport const TertiaryGradientStory = (args: ButtonProps) => (\n  <Button {...args} />\n);\n\nTertiaryGradientStory.args = {\n  type: 'tertiaryGradient',\n  iconLeftName: 'sparkles',\n  iconLeftType: 'solid',\n  children: 'Sense AI',\n  testId: 'button-tertiary-gradient-story',\n};\n\nTextOnlyStory.storyName = 'Text Only';\nTextIconLeftStory.storyName = 'Text Icon Left';\nTextIconRightStory.storyName = 'Text Icon Right';\nIconOnlyStory.storyName = 'Icon Only';\nGradientStory.storyName = 'Gradient';\nTertiaryGradientStory.storyName = 'Tertiary Gradient';\n"
        },
        "css": {
          "path": "Button.module.css",
          "content": "@value (\n  colorButtonFillPrimaryEnabled,\n  colorButtonFillPrimaryHovered,\n  colorButtonFillPrimaryPressed,\n\n  colorButtonFillSecondaryEnabled,\n  colorButtonFillSecondaryHovered,\n  colorButtonFillSecondaryPressed,\n\n  colorButtonFillTertiaryEnabled,\n  colorButtonFillTertiaryHovered,\n  colorButtonFillTertiaryPressed,\n\n  colorButtonFillGhostEnabled,\n  colorButtonFillGhostHovered,\n  colorButtonFillGhostPressed,\n\n  colorButtonFillDangerEnabled,\n  colorButtonFillDangerHovered,\n  colorButtonFillDangerPressed,\n\n  colorFocusPrimary,\n  colorFocusDanger,\n  colorFocusSecondary,\n  colorFocusInformation,\n\n  colorFillDisabled,\n\n  colorTextPrimary,\n  colorTextInversePrimary,\n  colorTextClickable,\n  colorTextDisabled,\n\n  colorBorderSecondary,\n\n  colorFillPrimary,\n  colorFillSecondary,\n  colorInformationLightest,\n  colorInformation\n\n) from '../../styles/variables/_color.css';\n\n@value (\n  size2,\n  size42,\n  size34,\n  size110,\n  sizeFluid\n) from '../../styles/variables/_size.css';\n\n@value (\n  spaceNone,\n  spaceSmall,\n  spaceMedium,\n  spaceXSmall\n) from '../../styles/variables/_space.css';\n\n@value (\n  borderWidthPrimary,\n  borderRadiusMedium,\n  borderRadiusSmall,\n  borderWidthNone,\n  borderWidthTertiary\n) from '../../styles/variables/_border.css';\n\n/*\n * Zero specificity, so any class on the button — ours or a consumer's — wins,\n * exactly as the old global `button {}` reset did, without leaking to every\n * <button> on the page.\n */\n:where(.unstyledButton) {\n  background: none;\n  border: none;\n}\n\n/*\n * Chrome/Edge 83–87 (in our browserslist) predate :where() and drop the rule\n * above. A plain class still loses to our components' classes there, because\n * they import Button before their own stylesheet.\n */\n@supports not selector(:where(a)) {\n  .unstyledButton {\n    background: none;\n    border: none;\n  }\n}\n\n.button {\n  composes: motionEaseInEaseOut from '../../styles/animation.module.css';\n  position: relative;\n  display: flex;\n  flex-direction: row;\n  padding: spaceNone spaceMedium;\n  height: size42;\n  text-align: left;\n  justify-content: center;\n  border-radius: borderRadiusMedium;\n  align-items: center;\n  outline: none;\n  cursor: pointer;\n  min-width: size110;\n}\n\n.buttonRow {\n  display: flex;\n  flex-direction: row;\n  justify-content: center;\n  align-items: center;\n  column-gap: spaceXSmall;\n}\n\n.textContainer {\n  display: flex;\n  align-items: center;\n}\n\n.withIconLeft {\n  padding: spaceNone spaceMedium spaceNone spaceSmall;\n}\n\n.withIconRight {\n  padding: spaceNone spaceSmall spaceNone spaceMedium;\n}\n\n.onlyIcon {\n  padding: spaceNone;\n}\n\n.withBothIcon {\n  padding: spaceNone spaceSmall;\n}\n\n.onlyIcon > .buttonRow {\n  column-gap: initial;\n}\n\n.medium {\n  composes: buttonTextMedium from '../../styles/typography.module.css';\n  height: size42;\n}\n\n.medium.onlyIcon {\n  min-width: size42;\n}\n\n.small {\n  composes: buttonTextSmall from '../../styles/typography.module.css';\n  height: size34;\n  border-radius: borderRadiusSmall;\n}\n\n.small.onlyIcon {\n  min-width: size34;\n}\n\n.isFluid {\n  width: sizeFluid;\n}\n\n.button:focus {\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n\n.primary {\n  color: colorTextInversePrimary;\n  background-color: colorButtonFillPrimaryEnabled;\n}\n\n.primary:hover {\n  background-color: colorButtonFillPrimaryHovered;\n}\n\n.primary:active {\n  background-color: colorButtonFillPrimaryPressed;\n}\n\n/* Currently Buttons with type `gradient` don't support hover / active states */\n.gradient {\n  color: colorTextInversePrimary;\n  background-image: linear-gradient(\n    to right,\n    colorFillPrimary,\n    colorInformation\n  );\n}\n\n.tertiaryGradient {\n  color: colorTextClickable;\n  border: borderWidthPrimary solid transparent;\n  background: linear-gradient(\n        to right,\n        colorFillSecondary,\n        colorInformationLightest\n      )\n      padding-box,\n    linear-gradient(to right, colorFocusSecondary, colorInformation) border-box;\n}\n\n.tertiaryGradient:hover,\n.tertiaryGradient:active {\n  background: linear-gradient(\n        to right,\n        colorButtonFillSecondaryHovered,\n        colorFocusInformation\n      )\n      padding-box,\n    linear-gradient(to right, colorFocusSecondary, colorInformation) border-box;\n}\n\n.secondary {\n  color: colorTextClickable;\n  background-color: colorButtonFillSecondaryEnabled;\n}\n\n.secondary:hover {\n  background-color: colorButtonFillSecondaryHovered;\n}\n\n.secondary:active {\n  background-color: colorButtonFillSecondaryPressed;\n}\n\n.tertiary {\n  color: colorTextPrimary;\n  border: borderWidthPrimary solid colorBorderSecondary;\n  background-color: colorButtonFillTertiaryEnabled;\n}\n\n.tertiary:hover {\n  background-color: colorButtonFillTertiaryHovered;\n}\n\n.tertiary:active {\n  background-color: colorButtonFillTertiaryPressed;\n}\n\n.ghost {\n  color: colorTextPrimary;\n  background-color: colorButtonFillGhostEnabled;\n  padding: spaceNone spaceSmall;\n}\n\n.ghost.withIconLeft {\n  padding: spaceNone spaceSmall spaceNone spaceXSmall;\n}\n\n.ghost.withIconRight {\n  padding: spaceNone spaceXSmall spaceNone spaceSmall;\n}\n\n.ghost.onlyIcon {\n  padding: spaceNone;\n}\n\n.ghost.withBothIcon {\n  padding: spaceNone spaceXSmall;\n}\n\n.ghost:hover {\n  background-color: colorButtonFillGhostHovered;\n}\n\n.ghost:active {\n  background-color: colorButtonFillGhostPressed;\n}\n\n.danger {\n  color: colorTextInversePrimary;\n  background-color: colorButtonFillDangerEnabled;\n}\n\n.danger:hover {\n  background-color: colorButtonFillDangerHovered;\n}\n\n.danger:active {\n  background-color: colorButtonFillDangerPressed;\n}\n\n.danger:focus {\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusDanger;\n}\n\n.button.disabled {\n  pointer-events: none;\n  color: colorTextDisabled;\n  background-color: colorFillDisabled;\n  border: initial;\n  background-image: initial;\n}\n\n.hidden {\n  visibility: hidden;\n}\n\n.loader {\n  composes: absoluteCenter from '../../styles/utils.module.css';\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export type { ButtonActionType, ButtonProps, ButtonSize, ButtonType, UnstyledButtonProps, } from '../../components/Button/Button';\nexport { Button, BUTTON_ACTION_TYPE, BUTTON_SIZE, BUTTON_TYPES, UnstyledButton, } from '../../components/Button/Button';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "Button.module.css",
        "Button.stories.module.css",
        "Button.stories.tsx",
        "Button.tsx",
        "index.ts"
      ]
    },
    "ButtonDropdown": {
      "name": "ButtonDropdown",
      "path": "src/components/ButtonDropdown",
      "files": {
        "main": {
          "path": "ButtonDropdown.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { ClickAwayRefType } from '../../utils/click-away';\nimport type { ButtonProps } from '../../components/Button';\nimport type { MenuOption, MenuProps } from '../../components/Menu';\nimport type { BaseTooltipProps, ElevationType } from '../../components/Tooltip';\nexport declare const ANCHOR_POSITION_TYPE: Readonly<{\n    top: \"top\";\n    topStart: \"top-start\";\n    topEnd: \"top-end\";\n    bottom: \"bottom\";\n    bottomStart: \"bottom-start\";\n    bottomEnd: \"bottom-end\";\n}>;\nexport declare const STRATEGY_TYPE: Readonly<{\n    absolute: \"absolute\";\n    fixed: \"fixed\";\n}>;\nexport type AnchorType = (typeof ANCHOR_POSITION_TYPE)[keyof typeof ANCHOR_POSITION_TYPE];\nexport type Strategy = (typeof STRATEGY_TYPE)[keyof typeof STRATEGY_TYPE];\ntype ClassNames = Readonly<{\n    buttonWrapper?: string;\n    dropdownContainer?: string;\n    buttonIcon?: string;\n}>;\nexport interface ButtonDropdownProps extends Omit<ButtonProps, 'classNames' | 'menu' | 'positionStrategy' | 'anchorPosition' | 'onOptionSelect' | 'onMenuOpen' | 'onMenuClose' | 'tooltip' | 'elevation' | 'clickAwayRef'> {\n    classNames?: ClassNames;\n    menu?: MenuProps;\n    positionStrategy?: Strategy;\n    anchorPosition?: AnchorType;\n    onOptionSelect?: (option: MenuOption, arg2?: React.SyntheticEvent<HTMLElement> | null | undefined) => unknown;\n    onMenuOpen?: () => unknown;\n    onMenuClose?: () => unknown;\n    tooltip?: BaseTooltipProps;\n    elevation?: ElevationType;\n    /**\n     * Opt in to the accessibility behavior: `aria-haspopup` / `aria-expanded` /\n     * `aria-controls` on the trigger, the arrow key that opens the popup, focus\n     * moving into the menu and back to the trigger, and the roving tab stop\n     * inside it. Forwarded to the `Menu` this opens.\n     *\n     * Off by default, and off is this component exactly as it behaved before any\n     * of it existed.\n     */\n    enableA11y?: boolean;\n    clickAwayRef?: React.RefObject<ClickAwayRefType | null>;\n    testId?: string;\n}\nexport declare const ButtonDropdown: Flow.AbstractComponent<ButtonDropdownProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=ButtonDropdown.d.ts.map"
        },
        "story": {
          "path": "ButtonDropdown.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {ClickAwayRefType} from 'src/utils/click-away';\nimport {\n  getButtonLabelFromSelectedKeys,\n  getSelectedKeysFromSelectedOption,\n} from 'src/utils/menu';\n\nimport type {ButtonProps} from 'src/components/Button';\nimport {BUTTON_ACTION_TYPE} from 'src/components/Button';\nimport type {ButtonDropdownProps} from 'src/components/ButtonDropdown/ButtonDropdown';\nimport {\n  ANCHOR_POSITION_TYPE,\n  ButtonDropdown,\n  STRATEGY_TYPE,\n} from 'src/components/ButtonDropdown/ButtonDropdown';\nimport {Icon} from 'src/components/Icon';\nimport type {\n  MenuGroupTitleOption,\n  MenuOption,\n  MenuProps,\n} from 'src/components/Menu';\nimport {MenuFooter, MenuHeader} from 'src/components/Menu/Menu.stories';\nimport {FormLabelSmall} from 'src/components/Text';\nimport {ELEVATION_TYPES, Tooltip} from 'src/components/Tooltip';\n\nimport css from 'src/components/ButtonDropdown/ButtonDropdown.stories.module.css';\n\n\nconst anchorPositionOptions: Array<unknown> = [\n  ...Object.values(ANCHOR_POSITION_TYPE),\n];\n\nconst positionStrategyOptions: Array<unknown> = [\n  ...Object.values(STRATEGY_TYPE),\n];\n\nconst actionTypeOptions: Array<unknown> = [\n  ...Object.values(BUTTON_ACTION_TYPE),\n];\n\nconst elevationOptions: Array<unknown> = [...Object.values(ELEVATION_TYPES)];\n\nconst textOptions: MenuOption[] = [\n  {key: '1', label: 'Option one'},\n  {key: '2', label: 'Option two'},\n  {key: '3', label: 'Option three'},\n  {\n    key: '4',\n    label:\n      'Option three this is a very long option that would truncate, and this is even longer text to further test the truncation behavior in the dropdown component, ensuring that extremely long labels are handled gracefully and do not break the layout or overflow in an undesirable way, especially when the text is much longer than what would typically be expected in a dropdown option.',\n  },\n  {key: '5', label: 'Option five(disabled)', disabled: true},\n  {\n    key: '6',\n    label: 'Option six(disabled) very long option that would truncate',\n    disabled: true,\n  },\n  {key: '7', label: 'Option Seven'},\n  {key: '8', label: 'Option Eight'},\n  {key: '9', label: 'Option Night'},\n];\n\nconst groupTitleComponentMenuOptions: Array<MenuGroupTitleOption> = [\n  {\n    groupTitle: (\n      <div className={css.titleWrapper}>\n        <FormLabelSmall color=\"tertiary\">Fast Food</FormLabelSmall>\n        <div className={css.infoContainer}>\n          <Tooltip body=\"Hello!\" elevation=\"menu\">\n            <Icon name=\"circle-info\" size=\"small\" color=\"tertiary\" />\n          </Tooltip>\n        </div>\n      </div>\n    ),\n    options: [\n      {\n        key: '1',\n        iconLeft: 'burger',\n        label: 'Burger',\n      },\n      {\n        key: '2',\n        iconLeft: 'pizza',\n        label: 'Pizza',\n      },\n      {\n        key: '3',\n        iconLeft: 'french-fries',\n        label: 'Fries',\n      },\n    ],\n  },\n  {\n    groupTitle: (\n      <div className={css.titleWrapper}>\n        <FormLabelSmall color=\"tertiary\">Fruits</FormLabelSmall>\n        <div className={css.infoContainer}>\n          <Tooltip body=\"Hello!\" elevation=\"menu\">\n            <Icon name=\"circle-info\" size=\"small\" color=\"tertiary\" />\n          </Tooltip>\n        </div>\n      </div>\n    ),\n    options: [\n      {\n        key: '7',\n        iconLeft: 'banana',\n        label: 'Banana',\n      },\n      {\n        key: '8',\n        iconLeft: 'pear',\n        label: 'Pear',\n      },\n      {\n        key: '9',\n        iconLeft: 'lemon',\n        label: 'Lemon',\n      },\n    ],\n  },\n];\n\nconst menuProps: MenuProps = {\n  isFluid: false,\n  menuDisabled: false,\n  size: 'medium',\n  options: textOptions,\n};\n\nconst textOnlyButtonProps: ButtonProps = {\n  children: 'Button Text',\n};\n\nconst textAndIconButtonProps: ButtonProps = {\n  children: 'Long Button Text',\n  iconLeftName: 'face-party',\n  iconRightName: 'face-party',\n};\n\nconst iconOnlyButtonProps: ButtonProps = {\n  iconLeftName: 'face-party',\n  ariaLabel: 'Icon Button Dropdown',\n};\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Button Dropdown/Generic Button Dropdown',\n  component: ButtonDropdown,\n  argTypes: {\n    enableA11y: {\n      description:\n        '**enableA11y** opts into the accessibility behavior: `aria-haspopup` / `aria-expanded` / `aria-controls` on the trigger, the arrow key that opens the popup, and focus moving into the menu and back. Off by default, where `ButtonDropdown` behaves exactly as it did before any of it existed. Off here too, as everywhere: turn the control on to see the accessible behavior.',\n      control: {type: 'boolean'},\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    onClick: {\n      description:\n        '**onClick** handler that is applied to the root `<button>` element',\n      action: 'clicked',\n      table: {\n        type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n      },\n    },\n    classNames: {\n      description: 'External classNames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary:\n            '{buttonWrapper?: string, dropdownContainer?: string, buttonIcon?: string}',\n        },\n      },\n    },\n    tooltip: {\n      control: {\n        type: 'object',\n      },\n      description: 'Field to set the **Tooltip** for Button Dropdown',\n      table: {\n        type: {summary: 'BaseTooltipProps'},\n      },\n    },\n    menu: {\n      description: 'Menu props to use',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: 'MenuProps'},\n      },\n    },\n    elevation: {\n      description:\n        'Elevation level for the dropdown menu. This controls the z-index stacking order. Default is set to \"modal\" elevation. Use higher elevation levels when rendering the dropdown above other elevated elements like Modal, Toast, etc.',\n      control: {\n        type: 'select',\n      },\n      options: elevationOptions,\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'modal'},\n      },\n    },\n    iconLeftName: {\n      description:\n        'Left icon to be applied to the button, it internally uses the `Icon` component to render icons',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    iconLeftType: {\n      description:\n        'Type of Left Icon. Type represents 4 unique icon styles :- Solid, Regular, Duotone and Brands',\n      options: ['regular', 'solid', 'duotone', 'brands'],\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'regular'},\n      },\n    },\n    iconRightName: {\n      description:\n        'Right icon to be applied to the button, it internally uses the `Icon` component to render icons',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    iconRightType: {\n      description:\n        'Type of Right Icon. Type represents 4 unique icon styles :- Solid, Regular, Duotone and Brands',\n      options: ['regular', 'solid', 'duotone', 'brands'],\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'regular'},\n      },\n    },\n    type: {\n      options: ['primary', 'secondary', 'tertiary', 'ghost', 'danger'],\n      description: 'Type of Button. Supported types are listed on the dropdown',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'primary'},\n      },\n    },\n    actionType: {\n      options: actionTypeOptions,\n      description:\n        'Action type of Button. Supported types are listed on the dropdown',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'submit'},\n      },\n    },\n    size: {\n      description:\n        'Button supports only two size variants namely small and medium. `small` < `medium`',\n      control: {\n        type: 'radio',\n      },\n      options: ['small', 'medium'],\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    disabled: {\n      description: 'If **true**, the component is disabled',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    isLoading: {\n      description:\n        'If **true**, the component would show a circular loader and also preserve the current size of button so that there are no jumps',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    isFluid: {\n      description:\n        'If **true**, the component would take the container\\'s `width`',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    children: {\n      description: 'The content of the Button',\n      table: {\n        type: {summary: 'React.Component | string'},\n      },\n    },\n    ariaLabel: {\n      control: {\n        type: 'text',\n      },\n      description:\n        '**aria-label** should be used where Button do not have have discernible text. This would avoid accessibility violations in screen readers',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    onOptionSelect: {\n      description:\n        '**onOptionSelect** handler is triggered when there is a change in selected option',\n      action: 'clicked',\n      table: {\n        type: {\n          summary:\n            '(option: MenuOption, ?SyntheticEvent<HTMLElement>) => mixed',\n        },\n      },\n    },\n    onMenuOpen: {\n      description:\n        '**onMenuOpen** handler is triggered when menu is opened. This should be helpful in cases where you want to change Button icon / text on this trigger.',\n      action: 'clicked',\n      table: {\n        type: {summary: '() => mixed'},\n      },\n    },\n    onMenuClose: {\n      description:\n        '**onMenuClose** handler is triggered when menu is closed. This should be helpful in cases where you want to change Button icon / text on this trigger.',\n      action: 'clicked',\n      table: {\n        type: {summary: '() => mixed'},\n      },\n    },\n    anchorPosition: {\n      options: anchorPositionOptions,\n      description:\n        'Position of Menu relative to its reference element. It can be any one value from the dropdown',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'bottom-start'},\n      },\n    },\n    positionStrategy: {\n      options: positionStrategyOptions,\n      description:\n        'Position of Menu relative to either its nearest positioned ancestor (absolute) or its nearest containing block- usually the viewport (fixed). It can be any one value from the dropdown',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'absolute'},\n      },\n    },\n    clickAwayRef: {\n      type: {optional: true},\n      description: 'ref that contains the functions to open or close the child',\n      table: {\n        type: {\n          summary: 'ClickAwayRefType',\n        },\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a ButtonDropdown component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { ButtonDropdown } from \"@spaced-out/ui-design-system/lib/components/ButtonDropdown\";\n\\`\\`\\`\nButton Dropdown is a composite component that internally implements **<a href=\"../?path=/docs/components-menu--docs\">Menu</a>** with\n**<a href=\"../?path=/docs/components-button--docs\">Button</a>** component. It also uses **Floating UI** to position the\nmenu component relative to empty space available, taking viewport and component position into account. This makes sure that menu is always visible\nirrespective of the component positioning. The component has a callback to notify the parent on option selection. Button Dropdown is implemented inside a\n\\`ClickAway\\` listener and thus Menu is closed automatically on outside click.\n\nIf you want to use Icon only button for button dropdown. Use IconLeftName and IconLeftType.\n\n- Supports passing a \\`clickAwayRef\\` prop to the component.\n- You can always force Open the instance from ref by using \\`clickAwayRef.current?.forceOpen()\\`. This might be useful when want to force Open as per you needs.\n- You can always force Close the instance from ref by using \\`clickAwayRef.current?.forceClose()\\`. This might be useful when want to force Close as per you needs.\n\n\n**Note: ** Always use \\`ariaLabel\\` with Icon only button for accessibility\n\n**Note: ** For checkbox type option set you can make use of \\`getSelectedKeysFromSelectedOption\\` and \\`getButtonLabelFromSelectedKeys\\` from \\`utils/menu\\`\nto populate \\`selectedKeys\\` and \\`buttonText\\` respectively.\n          `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/ButtonDropdown/ButtonDropdown',\n    },\n  },\n};\n\nexport const TextOnlyStory = (args: ButtonDropdownProps) => (\n  <div className={css.menuBtnWrapper}>\n    <ButtonDropdown {...args} />\n  </div>\n);\n\nTextOnlyStory.args = {\n  ...textOnlyButtonProps,\n  menu: menuProps,\n  size: 'medium',\n  testId: 'button-dropdown-text-only-story',\n};\n\n/*\n * The same trigger as `Text Only`, with the accessibility opt-in on.\n *\n * With `enableA11y` the button advertises its popup — `aria-haspopup`, and\n * `aria-expanded` / `aria-controls` that only point at the listbox while it is\n * mounted — and ArrowDown opens it. These options are real buttons, so this is\n * the roving tab stop pattern: arrows move actual DOM focus between them and\n * Space/Enter activate natively. Escape closes and returns focus to the button.\n *\n * Every other story here leaves the prop off, which is the default and is this\n * component exactly as it behaved before any of this existed.\n */\nexport const AccessibleButtonDropdownStory = (args: ButtonDropdownProps) => (\n  <div className={css.menuBtnWrapper}>\n    <ButtonDropdown {...args} />\n  </div>\n);\n\nAccessibleButtonDropdownStory.args = {\n  ...textOnlyButtonProps,\n  enableA11y: true,\n  menu: menuProps,\n  size: 'medium',\n  testId: 'button-dropdown-accessible-story',\n};\n\nexport const TextWithTooltipStory = (args: ButtonDropdownProps) => (\n  <div className={css.menuBtnWrapper}>\n    <ButtonDropdown {...args} />\n  </div>\n);\n\nTextWithTooltipStory.args = {\n  ...textOnlyButtonProps,\n  menu: {...menuProps, showLabelTooltip: {maxLines: 2}},\n  size: 'medium',\n  testId: 'button-dropdown-text-with-tooltip-story',\n};\n\nexport const WithSearchStory = (args: ButtonDropdownProps) => (\n  <div className={css.menuBtnWrapper}>\n    <ButtonDropdown {...args} />\n  </div>\n);\n\nWithSearchStory.args = {\n  ...textOnlyButtonProps,\n  menu: {...menuProps, allowSearch: true},\n  size: 'medium',\n  testId: 'button-dropdown-with-search-story',\n};\n\nexport const TextAndIconStory = (args: ButtonDropdownProps) => (\n  <div className={css.menuBtnWrapper}>\n    <ButtonDropdown {...args} />\n  </div>\n);\n\nTextAndIconStory.args = {\n  ...textAndIconButtonProps,\n  menu: menuProps,\n  size: 'medium',\n  testId: 'button-dropdown-text-and-icon-story',\n};\n\nexport const IconOnlyStory = (args: ButtonDropdownProps) => (\n  <div className={css.menuBtnWrapper}>\n    <ButtonDropdown {...args} />\n  </div>\n);\n\nIconOnlyStory.args = {\n  ...iconOnlyButtonProps,\n  menu: menuProps,\n  size: 'medium',\n  testId: 'button-dropdown-icon-only-story',\n};\n\nexport const DynamicIconStory = (args: ButtonDropdownProps) => {\n  const [iconName, setIconName] = React.useState('chevron-down');\n  return (\n    <div className={css.menuBtnWrapper}>\n      <ButtonDropdown\n        {...args}\n        iconLeftName={iconName}\n        onMenuOpen={() => setIconName('chevron-up')}\n        onMenuClose={() => setIconName('chevron-down')}\n        tooltip={{body: iconName}}\n      />\n    </div>\n  );\n};\n\nDynamicIconStory.args = {\n  iconLeftName: 'chevron-down',\n  ariaLabel: 'Icon Button Dropdown',\n  menu: menuProps,\n  size: 'medium',\n  testId: 'button-dropdown-dynamic-icon-story',\n};\n\nconst complicatedMenuProps: MenuProps = {\n  isFluid: false,\n  menuDisabled: false,\n  size: 'medium',\n  groupTitleOptions: groupTitleComponentMenuOptions,\n};\n\nexport const TextAndDynamicIconStory = (args: ButtonDropdownProps) => {\n  const [iconName, setIconName] = React.useState('chevron-down');\n  return (\n    <div className={css.menuBtnWrapper}>\n      <ButtonDropdown\n        {...args}\n        iconRightName={iconName}\n        onMenuOpen={() => setIconName('chevron-up')}\n        onMenuClose={() => setIconName('chevron-down')}\n      />\n    </div>\n  );\n};\n\nTextAndDynamicIconStory.args = {\n  children: 'Long Button Text',\n  iconRightName: 'chevron-down',\n  iconRightType: 'regular',\n  menu: complicatedMenuProps,\n  size: 'medium',\n  type: 'ghost',\n  testId: 'button-dropdown-text-and-dynamic-icon-story',\n};\n\nconst checkboxMenuProps: MenuProps = {\n  options: textOptions,\n  optionsVariant: 'checkbox',\n  selectedKeys: ['4'],\n  isFluid: false,\n};\n\nexport const WithCheckboxMenuStory = (args: ButtonDropdownProps) => {\n  const [btnText, setBtnText] = React.useState<React.ReactNode>('');\n  const [selectedKeys, setSelectedKeys] = React.useState(\n    args.menu?.selectedKeys || [],\n  );\n\n  React.useEffect(() => {\n    setSelectedKeys(args.menu?.selectedKeys || []);\n    const newBtnText = getButtonLabelFromSelectedKeys(\n      args.menu?.selectedKeys,\n      args.children,\n    );\n    setBtnText(newBtnText);\n  }, [args.menu?.selectedKeys]);\n\n  const handleChange = (option: MenuOption) => {\n    const newSelectedKeys = getSelectedKeysFromSelectedOption(\n      option,\n      selectedKeys,\n    );\n    const newBtnText = getButtonLabelFromSelectedKeys(\n      newSelectedKeys,\n      args.children,\n    );\n    setSelectedKeys(newSelectedKeys);\n    setBtnText(newBtnText);\n  };\n\n  return (\n    <div className={css.menuBtnWrapper}>\n      <ButtonDropdown\n        {...args}\n        menu={{...args.menu, selectedKeys}}\n        onOptionSelect={handleChange}\n      >\n        {btnText}\n      </ButtonDropdown>\n    </div>\n  );\n};\n\nWithCheckboxMenuStory.args = {\n  children: 'Long Button Text',\n  menu: checkboxMenuProps,\n  size: 'medium',\n  testId: 'button-dropdown-with-checkbox-menu-story',\n};\n\nconst radioMenuProps: MenuProps = {\n  options: textOptions,\n  optionsVariant: 'radio',\n  selectedKeys: ['4'],\n  isFluid: false,\n};\n\nexport const WithRadioMenuStory = (args: ButtonDropdownProps) => {\n  const [selectedKeys, setSelectedKeys] = React.useState(\n    args.menu?.selectedKeys || [],\n  );\n\n  React.useEffect(() => {\n    setSelectedKeys(args.menu?.selectedKeys || []);\n  }, [args.menu?.selectedKeys]);\n\n  const handleChange = (option: MenuOption) => {\n    setSelectedKeys([option.key]);\n  };\n\n  return (\n    <div className={css.menuBtnWrapper}>\n      <ButtonDropdown\n        {...args}\n        menu={{...args.menu, selectedKeys}}\n        onOptionSelect={handleChange}\n      >\n        {args.children}\n      </ButtonDropdown>\n    </div>\n  );\n};\n\nWithRadioMenuStory.args = {\n  children: 'Long Button Text',\n  menu: radioMenuProps,\n  size: 'medium',\n  testId: 'button-dropdown-with-radio-menu-story',\n};\nexport const WithHeaderAndFooterStory = (args: ButtonDropdownProps) => (\n  <WithHeaderAndFooter {...args} />\n);\n\nexport const WithHeaderAndFooter = (args: ButtonDropdownProps) => {\n  const clickAwayRef = React.useRef<ClickAwayRefType | null>(null);\n  const [btnText, setBtnText] = React.useState<React.ReactNode>('');\n  const [selectedKeys, setSelectedKeys] = React.useState(\n    args.menu?.selectedKeys || [],\n  );\n\n  React.useEffect(() => {\n    setSelectedKeys(args.menu?.selectedKeys || []);\n    const newBtnText = getButtonLabelFromSelectedKeys(\n      args.menu?.selectedKeys,\n      args.children,\n    );\n    setBtnText(newBtnText);\n  }, [args.menu?.selectedKeys]);\n\n  const handleChange = (option: MenuOption) => {\n    const newSelectedKeys = getSelectedKeysFromSelectedOption(\n      option,\n      selectedKeys,\n    );\n    const newBtnText = getButtonLabelFromSelectedKeys(\n      newSelectedKeys,\n      args.children,\n    );\n    setSelectedKeys(newSelectedKeys);\n    setBtnText(newBtnText);\n  };\n\n  const onSave = () => {\n    if (clickAwayRef.current) {\n      clickAwayRef.current?.forceClose();\n    }\n  };\n\n  return (\n    <div className={css.menuBtnWrapper}>\n      <ButtonDropdown\n        {...args}\n        menu={{\n          ...args.menu,\n          selectedKeys,\n          header: <MenuHeader />,\n          footer: <MenuFooter onSave={onSave} />,\n        }}\n        onOptionSelect={handleChange}\n        clickAwayRef={clickAwayRef}\n      >\n        {btnText}\n      </ButtonDropdown>\n    </div>\n  );\n};\n\nWithHeaderAndFooterStory.args = {\n  children: 'Long Button Text',\n  menu: {\n    ...menuProps,\n    header: <MenuHeader />,\n    footer: <MenuFooter />,\n  },\n  size: 'medium',\n  testId: 'button-dropdown-with-header-and-footer-story',\n};\nTextOnlyStory.storyName = 'Text Only';\nAccessibleButtonDropdownStory.storyName = 'Accessible (enableA11y)';\nTextWithTooltipStory.storyName = 'Text With Tooltip';\nWithSearchStory.storyName = 'With Search';\nTextAndIconStory.storyName = 'Text And Icon';\nIconOnlyStory.storyName = 'Icon Only';\nDynamicIconStory.storyName = 'Dynamic Icon';\nTextAndDynamicIconStory.storyName = 'Text And Dynamic Icon';\nWithCheckboxMenuStory.storyName = 'With Checkbox Menu';\nWithRadioMenuStory.storyName = 'With Radio Menu';\nWithHeaderAndFooterStory.storyName = 'With Header And Footer';\n"
        },
        "css": {
          "path": "ButtonDropdown.module.css",
          "content": "@value (\n  sizeFluid\n) from '../../styles/variables/_size.css';\n\n.buttonDropdownContainer {\n  display: flex;\n  position: relative;\n}\n\n.isFluid {\n  width: sizeFluid;\n}\n\n.menuWrapper {\n  width: var(--dropdown-width);\n  z-index: var(--menu-elevation);\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/ButtonDropdown/ButtonDropdown';\nexport * from '../../components/ButtonDropdown/SimpleButtonDropdown';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "SimpleButtonDropdown.d.ts": {
            "path": "SimpleButtonDropdown.d.ts",
            "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { MenuClassNames, MenuLabelTooltip } from '../../types/menu';\nimport type { ClickAwayRefType } from '../../utils/click-away';\nimport type { ButtonProps } from '../../components/Button';\nimport type { AnchorType } from '../../components/ButtonDropdown/ButtonDropdown';\nimport type { MenuOption, MenuOptionsVariant, Virtualization } from '../../components/Menu';\nimport type { BaseTooltipProps, ElevationType } from '../../components/Tooltip';\ntype ClassNames = Readonly<{\n    buttonWrapper?: string;\n    dropdownContainer?: string;\n    buttonIcon?: string;\n}>;\nexport interface SimpleButtonDropdownRef {\n    selectedKeys?: Array<string>;\n}\nexport interface SimpleButtonDropdownProps extends Omit<ButtonProps, 'elevation' | 'classNames' | 'anchorPosition' | 'tooltip' | 'options' | 'optionsVariant' | 'allowSearch' | 'selectedKeys' | 'menuVirtualization' | 'header' | 'footer' | 'menuClassNames' | 'showLabelTooltip' | 'allowWrap' | 'onOptionSelect' | 'onMenuOpen' | 'onMenuClose' | 'staticLabels' | 'resolveLabel' | 'resolveSecondaryLabel' | 'clickAwayRef'> {\n    elevation?: ElevationType;\n    classNames?: ClassNames;\n    anchorPosition?: AnchorType;\n    tooltip?: BaseTooltipProps;\n    options?: Array<MenuOption>;\n    optionsVariant?: MenuOptionsVariant;\n    allowSearch?: boolean;\n    selectedKeys?: Array<string>;\n    menuVirtualization?: Virtualization;\n    header?: React.ReactNode;\n    footer?: React.ReactNode;\n    menuClassNames?: MenuClassNames;\n    showLabelTooltip?: MenuLabelTooltip;\n    allowWrap?: boolean;\n    onOptionSelect?: (option: MenuOption, arg2?: React.SyntheticEvent<HTMLElement> | null | undefined) => unknown;\n    onMenuOpen?: () => unknown;\n    onMenuClose?: () => unknown;\n    staticLabels?: {\n        RESULT?: string;\n        RESULTS?: string;\n        SEARCH_PLACEHOLDER?: string;\n    };\n    resolveLabel?: (option: MenuOption) => string | React.ReactNode;\n    resolveSecondaryLabel?: (option: MenuOption) => string | React.ReactNode;\n    clickAwayRef?: React.RefObject<ClickAwayRefType | null>;\n    /**\n     * Opt in to the accessibility behavior of the `ButtonDropdown` this renders: its\n     * ARIA roles and state, keyboard navigation of the options, and focus\n     * handling on close. Forwarded unchanged.\n     *\n     * Off by default, and off is this component exactly as it behaved before\n     * any of it existed.\n     */\n    enableA11y?: boolean;\n    testId?: string;\n}\nexport declare const SimpleButtonDropdown: Flow.AbstractComponent<SimpleButtonDropdownProps, SimpleButtonDropdownRef>;\nexport {};\n//# sourceMappingURL=SimpleButtonDropdown.d.ts.map"
          }
        }
      },
      "allFiles": [
        "ButtonDropdown.module.css",
        "ButtonDropdown.stories.module.css",
        "ButtonDropdown.stories.tsx",
        "ButtonDropdown.tsx",
        "SimpleButtonDropdown.stories.tsx",
        "SimpleButtonDropdown.tsx",
        "index.ts"
      ]
    },
    "ButtonTabs": {
      "name": "ButtonTabs",
      "path": "src/components/ButtonTabs",
      "files": {
        "main": {
          "path": "ButtonTabs.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { AnchorType } from '../../components/ButtonDropdown';\nimport type { ElevationType } from '../../components/Tooltip';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    buttonTabDropdownWrapper?: string;\n}>;\nexport interface ButtonTabsProps {\n    classNames?: ClassNames;\n    children: React.ReactNode;\n    isFluid?: boolean;\n    size?: 'medium' | 'small';\n    disabled?: boolean;\n    selectedButtonTabId?: string;\n    onButtonTabSelect?: ((id: string, e?: React.SyntheticEvent<HTMLElement> | null | undefined) => unknown) | null | undefined;\n    wrapAfter?: number;\n    elevation?: ElevationType;\n    wrapTabTitle?: string;\n    /**\n     * Opt in to the accessibility behavior for the overflow tab and the menu it\n     * opens. Off by default, and off is this component exactly as it behaved\n     * before any of it existed.\n     */\n    enableA11y?: boolean;\n    anchorPosition?: AnchorType;\n    testId?: string;\n}\nexport declare const ButtonTabs: Flow.AbstractComponent<ButtonTabsProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=ButtonTabs.d.ts.map"
        },
        "story": {
          "path": "ButtonTabs.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {ANCHOR_POSITION_TYPE} from 'src/components/ButtonDropdown';\nimport {ButtonTab} from 'src/components/ButtonTabs/ButtonTab';\nimport type {ButtonTabsProps} from 'src/components/ButtonTabs/ButtonTabs';\nimport {ButtonTabs} from 'src/components/ButtonTabs/ButtonTabs';\nimport {ELEVATION_TYPES} from 'src/components/Tooltip';\n\nimport css from 'src/components/ButtonTabs/ButtonTabs.stories.module.css';\n\n\nconst anchorPositionOptions: Array<unknown> = [\n  ...Object.values(ANCHOR_POSITION_TYPE),\n];\nconst elevationOptions: Array<unknown> = [...Object.values(ELEVATION_TYPES)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Button Tabs/Button Tabs',\n  component: ButtonTabs,\n  argTypes: {\n    enableA11y: {\n      description:\n        '**enableA11y** opts into the accessibility behavior: `aria-haspopup` / `aria-expanded` / `aria-controls` on the trigger, the arrow key that opens the popup, and focus moving into the menu and back. Off by default, where `ButtonTabs` behaves exactly as it did before any of it existed. Off here too, as everywhere: turn the control on to see the accessible behavior.',\n      control: {type: 'boolean'},\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    classNames: {\n      description: 'External classNames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: '{wrapper?: string}'},\n      },\n    },\n    selectedButtonTabId: {\n      description:\n        'Selected Id of the Button Tab, when the selectedId is same as id, Button Tab is updated to the selected state',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    onButtonTabSelect: {\n      description:\n        '**onClick** handler that is applied to the Button Tab. This is internally passed to the `ButtonTab` component',\n      action: 'clicked',\n      table: {\n        type: {\n          summary: '(id: string, e?: SyntheticEvent<HTMLElement>) => mixed',\n        },\n      },\n    },\n    elevation: {\n      description:\n        'This is passed to ButtonTabDropdown. Elevation level for the dropdown menu controls the z-index stacking order. Default is set to \"modal\" elevation. Use higher elevation levels when rendering the dropdown above other elevated elements like Modal, Toast, etc.',\n      control: {\n        type: 'select',\n      },\n      options: elevationOptions,\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'modal'},\n      },\n    },\n    size: {\n      description:\n        'ButtonTabs support only two size variants namely small and medium. `small` < `medium`. This is internally passed to the `ButtonTab` component',\n      control: {\n        type: 'radio',\n      },\n      options: ['small', 'medium'],\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    disabled: {\n      description:\n        'If **true**, the component is disabled. This is internally passed to the `ButtonTab` component',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    isFluid: {\n      description:\n        'If **true**, the component would take the container\\'s `width`. This is internally passed to the `ButtonTab` component',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    children: {\n      type: {required: true},\n      description:\n        'The content of the ButtonTabs. This should always have list of `ButtonTab` as children',\n      table: {\n        type: {summary: 'React.Component | string'},\n      },\n    },\n    wrapAfter: {\n      description: 'Number of tabs to display before wrapping with a dropdown',\n      control: {\n        type: 'number',\n        min: 0,\n      },\n      table: {\n        type: {summary: 'number'},\n      },\n    },\n    wrapTabTitle: {\n      description: 'Title of the button tab that opens the wrapped dropdown',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'more'},\n      },\n    },\n    anchorPosition: {\n      options: anchorPositionOptions,\n      description:\n        'Position of Menu relative to its reference element. It can be any one value from the dropdown',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'bottom-end'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a ButtonTabs component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { ButtonTabs, ButtonTab } from \"@spaced-out/ui-design-system/lib/components/ButtonTabs\";\n\\`\\`\\`\n**ButtonTabs** accepts multiple **ButtonTab** elements as children. \\`ButtonTab\\` make it easy to switch between different views.\nA selection of tab can be done by passing selectedId to the \\`ButtonTab\\` component. Some props like **size**, **isFluid**\nand **disabled** are propagated as is to the children \\`ButtonTab\\`\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/ButtonTabs/ButtonTabs',\n    },\n  },\n};\n\nexport const TextOnlyStory = (args: ButtonTabsProps) => {\n  const [selectedId, setSelectedId] = React.useState(args.selectedButtonTabId);\n\n  return (\n    <div className={css.container}>\n      <ButtonTabs\n        {...args}\n        selectedButtonTabId={selectedId}\n        classNames={{wrapper: css.wrapper}}\n        onButtonTabSelect={(id) => setSelectedId(id)}\n      >\n        <ButtonTab id=\"1\">School Bus</ButtonTab>\n        <ButtonTab id=\"2\">Tram Train</ButtonTab>\n        <ButtonTab id=\"3\">Airplane Arrival</ButtonTab>\n        <ButtonTab id=\"4\">Space Shuttle</ButtonTab>\n        <ButtonTab id=\"5\">Fighter Jet</ButtonTab>\n      </ButtonTabs>\n    </div>\n  );\n};\n\nTextOnlyStory.args = {\n  selectedButtonTabId: '4',\n  testId: 'button-tabs-text-only-story',\n};\n\nexport const TextAndIconStory = (args: ButtonTabsProps) => {\n  const [selectedId, setSelectedId] = React.useState(args.selectedButtonTabId);\n\n  return (\n    <div className={css.container}>\n      <ButtonTabs\n        {...args}\n        selectedButtonTabId={selectedId}\n        classNames={{wrapper: css.wrapper}}\n        onButtonTabSelect={(id) => setSelectedId(id)}\n      >\n        <ButtonTab id=\"1\" iconType=\"duotone\" iconName=\"bus-school\">\n          School Bus\n        </ButtonTab>\n        <ButtonTab id=\"2\" iconType=\"duotone\" iconName=\"train-tram\">\n          Tram Train\n        </ButtonTab>\n        <ButtonTab id=\"3\" iconType=\"duotone\" iconName=\"plane-arrival\">\n          Airplane Arrival\n        </ButtonTab>\n        <ButtonTab id=\"4\" iconType=\"duotone\" iconName=\"shuttle-space\">\n          Space Shuttle\n        </ButtonTab>\n        <ButtonTab id=\"5\" iconType=\"duotone\" iconName=\"jet-fighter\">\n          Fighter Jet\n        </ButtonTab>\n      </ButtonTabs>\n    </div>\n  );\n};\n\nTextAndIconStory.args = {\n  selectedButtonTabId: '2',\n  testId: 'button-tabs-text-and-icon-story',\n};\n\nexport const IconOnlyStory = (args: ButtonTabsProps) => {\n  const [selectedId, setSelectedId] = React.useState(args.selectedButtonTabId);\n\n  return (\n    <div className={css.container}>\n      <ButtonTabs\n        {...args}\n        selectedButtonTabId={selectedId}\n        classNames={{wrapper: css.wrapper}}\n        onButtonTabSelect={(id) => setSelectedId(id)}\n      >\n        <ButtonTab id=\"1\" iconType=\"duotone\" iconName=\"bus-school\"></ButtonTab>\n        <ButtonTab id=\"2\" iconType=\"duotone\" iconName=\"train-tram\"></ButtonTab>\n        <ButtonTab\n          id=\"3\"\n          iconType=\"duotone\"\n          iconName=\"plane-arrival\"\n        ></ButtonTab>\n        <ButtonTab\n          id=\"4\"\n          iconType=\"duotone\"\n          iconName=\"shuttle-space\"\n        ></ButtonTab>\n        <ButtonTab id=\"5\" iconType=\"duotone\" iconName=\"jet-fighter\"></ButtonTab>\n        <ButtonTab id=\"6\" iconType=\"duotone\" iconName=\"banana\"></ButtonTab>\n        <ButtonTab id=\"7\" iconType=\"duotone\" iconName=\"citrus\"></ButtonTab>\n        <ButtonTab id=\"8\" iconType=\"duotone\" iconName=\"pineapple\"></ButtonTab>\n        <ButtonTab id=\"9\" iconType=\"duotone\" iconName=\"lemon\"></ButtonTab>\n        <ButtonTab id=\"10\" iconType=\"duotone\" iconName=\"pie\"></ButtonTab>\n        <ButtonTab id=\"11\" iconType=\"duotone\" iconName=\"pear\"></ButtonTab>\n        <ButtonTab id=\"12\" iconType=\"duotone\" iconName=\"grapes\"></ButtonTab>\n        <ButtonTab id=\"13\" iconType=\"duotone\" iconName=\"mango\"></ButtonTab>\n        <ButtonTab id=\"14\" iconType=\"duotone\" iconName=\"avocado\"></ButtonTab>\n        <ButtonTab id=\"15\" iconType=\"duotone\" iconName=\"leaf\"></ButtonTab>\n      </ButtonTabs>\n    </div>\n  );\n};\n\nIconOnlyStory.args = {\n  selectedButtonTabId: '3',\n  testId: 'button-tabs-icon-only-story',\n};\n\nexport const IconOnlyWrappedStory = (args: ButtonTabsProps) => {\n  const [selectedId, setSelectedId] = React.useState(args.selectedButtonTabId);\n\n  return (\n    <div className={css.container}>\n      <ButtonTabs\n        {...args}\n        selectedButtonTabId={selectedId}\n        classNames={{wrapper: css.wrapper}}\n        onButtonTabSelect={(id) => setSelectedId(id)}\n      >\n        <ButtonTab id=\"1\" iconType=\"duotone\" iconName=\"bus-school\"></ButtonTab>\n        <ButtonTab id=\"2\" iconType=\"duotone\" iconName=\"train-tram\"></ButtonTab>\n        <ButtonTab\n          id=\"3\"\n          iconType=\"duotone\"\n          iconName=\"plane-arrival\"\n        ></ButtonTab>\n        <ButtonTab\n          id=\"4\"\n          iconType=\"duotone\"\n          iconName=\"shuttle-space\"\n        ></ButtonTab>\n        <ButtonTab id=\"5\" iconType=\"duotone\" iconName=\"jet-fighter\"></ButtonTab>\n        <ButtonTab\n          id=\"6\"\n          iconType=\"duotone\"\n          iconName=\"banana\"\n          disabled\n        ></ButtonTab>\n        <ButtonTab\n          id=\"7\"\n          iconType=\"duotone\"\n          iconName=\"citrus\"\n          disabled\n        ></ButtonTab>\n        <ButtonTab id=\"8\" iconType=\"duotone\" iconName=\"pineapple\"></ButtonTab>\n        <ButtonTab id=\"9\" iconType=\"duotone\" iconName=\"lemon\"></ButtonTab>\n        <ButtonTab id=\"10\" iconType=\"duotone\" iconName=\"pie\"></ButtonTab>\n        <ButtonTab id=\"11\" iconType=\"duotone\" iconName=\"pear\"></ButtonTab>\n        <ButtonTab id=\"12\" iconType=\"duotone\" iconName=\"grapes\"></ButtonTab>\n        <ButtonTab\n          id=\"13\"\n          iconType=\"duotone\"\n          iconName=\"mango\"\n          disabled\n        ></ButtonTab>\n        <ButtonTab\n          id=\"14\"\n          iconType=\"duotone\"\n          iconName=\"avocado\"\n          disabled\n        ></ButtonTab>\n        <ButtonTab id=\"15\" iconType=\"duotone\" iconName=\"leaf\"></ButtonTab>\n      </ButtonTabs>\n    </div>\n  );\n};\n\nIconOnlyWrappedStory.args = {\n  selectedButtonTabId: '1',\n  wrapAfter: 3,\n  testId: 'button-tabs-icon-only-wrapped-story',\n};\n\nexport const WrappedStory = (args: ButtonTabsProps) => {\n  const [selectedId, setSelectedId] = React.useState(args.selectedButtonTabId);\n  const onButtonTabSelectHandler = (\n    id: string,\n    e: React.SyntheticEvent<HTMLElement> | null | undefined,\n  ): void => {\n    args.onButtonTabSelect?.(id, e);\n    setSelectedId(id);\n  };\n\n  return (\n    <div className={css.container}>\n      <ButtonTabs\n        {...args}\n        classNames={{wrapper: css.wrapper}}\n        onButtonTabSelect={onButtonTabSelectHandler}\n        selectedButtonTabId={selectedId}\n      >\n        <ButtonTab id=\"1\" iconType=\"duotone\" iconName=\"bus-school\">\n          School Bus\n        </ButtonTab>\n        <ButtonTab id=\"2\" iconType=\"duotone\" iconName=\"train-tram\">\n          Tram Train\n        </ButtonTab>\n        <ButtonTab id=\"3\" iconType=\"duotone\" iconName=\"plane-arrival\">\n          Airplane Arrival\n        </ButtonTab>\n        <ButtonTab id=\"4\" iconType=\"duotone\" iconName=\"shuttle-space\">\n          Space Shuttle\n        </ButtonTab>\n        <ButtonTab id=\"5\" iconType=\"duotone\" iconName=\"jet-fighter\">\n          Fighter Jet\n        </ButtonTab>\n      </ButtonTabs>\n    </div>\n  );\n};\n\nWrappedStory.args = {\n  selectedButtonTabId: '1',\n  wrapAfter: 3,\n  testId: 'button-tabs-wrapped-story',\n};\n\nexport const DisabledButtonsStory = (args: ButtonTabsProps) => {\n  const [selectedId, setSelectedId] = React.useState(args.selectedButtonTabId);\n\n  return (\n    <div className={css.container}>\n      <ButtonTabs\n        {...args}\n        selectedButtonTabId={selectedId}\n        classNames={{wrapper: css.wrapper}}\n        onButtonTabSelect={(id) => setSelectedId(id)}\n      >\n        <ButtonTab id=\"1\">School Bus</ButtonTab>\n        <ButtonTab id=\"2\" disabled>\n          Tram Train\n        </ButtonTab>\n        <ButtonTab id=\"3\" disabled>\n          Airplane Arrival\n        </ButtonTab>\n        <ButtonTab id=\"4\">Space Shuttle</ButtonTab>\n        <ButtonTab id=\"5\">Fighter Jet</ButtonTab>\n      </ButtonTabs>\n    </div>\n  );\n};\n\nDisabledButtonsStory.args = {\n  selectedButtonTabId: '1',\n  disabled: true,\n  testId: 'button-tabs-disabled-buttons-story',\n};\nTextOnlyStory.storyName = 'Text Only';\nTextAndIconStory.storyName = 'Text And Icon';\nIconOnlyStory.storyName = 'Icon Only';\nIconOnlyWrappedStory.storyName = 'Icon Only Wrapped';\nWrappedStory.storyName = 'Wrapped';\nDisabledButtonsStory.storyName = 'Disabled Buttons';\n"
        },
        "css": {
          "path": "ButtonTabs.module.css",
          "content": "@value (\n  colorBackgroundTertiary\n) from '../../styles/variables/_color.css';\n@value (\n  size42, \n  size34, \n  sizeFluid\n) from '../../styles/variables/_size.css';\n@value (\n  borderRadiusMedium\n) from '../../styles/variables/_border.css';\n\n.buttonTabsWrapper {\n  display: flex;\n  background-color: colorBackgroundTertiary;\n  align-items: center;\n  width: fit-content;\n  border-radius: borderRadiusMedium;\n}\n\n.buttonTabsWrapper.medium {\n  height: size42;\n}\n\n.buttonTabsWrapper.small {\n  height: size34;\n}\n\n.buttonTabsWrapper.isFluid {\n  width: sizeFluid;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/ButtonTabs/ButtonTab';\nexport * from '../../components/ButtonTabs/ButtonTabs';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "ButtonTab/ButtonTab.d.ts": {
            "path": "ButtonTab/ButtonTab.d.ts",
            "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { IconType } from '../../../components/Icon';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n}>;\n/**\n * Attributes forwarded straight to the underlying `<button>`. Declared rather\n * than relied on: `ButtonTab` spreads its rest props, so these reached the DOM\n * whether or not the type mentioned them. `id` is NOT among them — this\n * component takes `id` as the tab's own identity, which is why a menu trigger\n * names its listbox with `ariaLabel` instead.\n */\ntype ForwardedButtonProps = Pick<React.ButtonHTMLAttributes<HTMLButtonElement>, 'aria-haspopup' | 'aria-expanded' | 'aria-controls' | 'onKeyDown'>;\nexport interface ButtonTabProps extends ForwardedButtonProps {\n    classNames?: ClassNames;\n    children?: React.ReactNode;\n    disabled?: boolean;\n    onButtonTabSelect?: ((id: string, e?: React.SyntheticEvent<HTMLElement> | null | undefined) => unknown) | null | undefined;\n    iconName?: string;\n    iconType?: IconType;\n    size?: 'medium' | 'small';\n    isFluid?: boolean;\n    ariaLabel?: string;\n    id: string;\n    selectedButtonTabId?: string;\n    isLoading?: boolean;\n    isLeftCurved?: boolean;\n    isRightCurved?: boolean;\n    testId?: string;\n}\nexport declare const ButtonTab: Flow.AbstractComponent<ButtonTabProps, HTMLButtonElement>;\nexport {};\n//# sourceMappingURL=ButtonTab.d.ts.map"
          },
          "ButtonTab/index.d.ts": {
            "path": "ButtonTab/index.d.ts",
            "content": "export * from '../../../components/ButtonTabs/ButtonTab/ButtonTab';\n//# sourceMappingURL=index.d.ts.map"
          },
          "ButtonTabDropdown.d.ts": {
            "path": "ButtonTabDropdown.d.ts",
            "content": "import * as React from 'react';\nimport type { AnchorType } from '../../components/ButtonDropdown';\nimport type { ButtonTabProps } from '../../components/ButtonTabs/ButtonTab';\nimport type { ElevationType } from '../../components/Tooltip';\nexport interface ButtonTabDropdownProps extends Omit<ButtonTabProps, 'title' | 'elevation' | 'dropdownClass' | 'anchorPosition'> {\n    title: string;\n    elevation?: ElevationType;\n    dropdownClass?: string;\n    /**\n     * Opt in to the accessibility behavior: `aria-haspopup` / `aria-expanded` /\n     * `aria-controls` on the tab, the arrow key that opens the popup, and focus\n     * moving into the menu and back. Forwarded to the `Menu` this opens.\n     *\n     * Off by default, and off is this component exactly as it behaved before any\n     * of it existed.\n     */\n    enableA11y?: boolean;\n    anchorPosition?: AnchorType;\n    testId?: string;\n}\nexport declare const ButtonTabDropdown: ({ title, elevation, anchorPosition, enableA11y, testId, ...buttonTabProps }: ButtonTabDropdownProps) => React.JSX.Element;\n//# sourceMappingURL=ButtonTabDropdown.d.ts.map"
          }
        }
      },
      "allFiles": [
        "ButtonTab/ButtonTab.module.css",
        "ButtonTab/ButtonTab.stories.tsx",
        "ButtonTab/ButtonTab.tsx",
        "ButtonTab/index.ts",
        "ButtonTabDropdown.module.css",
        "ButtonTabDropdown.tsx",
        "ButtonTabs.module.css",
        "ButtonTabs.stories.module.css",
        "ButtonTabs.stories.tsx",
        "ButtonTabs.tsx",
        "index.ts"
      ]
    },
    "Card": {
      "name": "Card",
      "path": "src/components/Card",
      "files": {
        "main": {
          "path": "Card.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n}>;\nexport declare const PADDING_SIZES: Readonly<{\n    small: \"small\";\n    medium: \"medium\";\n    large: \"large\";\n    none: \"none\";\n}>;\nexport type PaddingSizeType = (typeof PADDING_SIZES)[keyof typeof PADDING_SIZES];\nexport interface CardProps {\n    classNames?: ClassNames;\n    tabIndex?: number;\n    onClick?: (e: React.SyntheticEvent<HTMLElement>) => void;\n    onKeyDown?: (e: React.KeyboardEvent<HTMLElement>) => void;\n    children: React.ReactNode;\n    paddingTop?: PaddingSizeType;\n    paddingRight?: PaddingSizeType;\n    paddingBottom?: PaddingSizeType;\n    paddingLeft?: PaddingSizeType;\n    testId?: string;\n}\nexport interface CardChildProps {\n    className?: string;\n    children: React.ReactNode;\n    testId?: string;\n}\nexport interface ClickableCardProps extends Omit<CardProps, 'onClick' | 'disabled'> {\n    onClick?: ((arg1: React.SyntheticEvent<HTMLElement>) => unknown) | null | undefined;\n    disabled?: boolean;\n}\nexport declare const CardHeader: ({ className, children, testId, ...props }: CardChildProps) => React.JSX.Element;\nexport declare const CardTitle: ({ className, children, testId, ...props }: CardChildProps) => React.JSX.Element;\nexport declare const CardActions: ({ className, children, testId, ...props }: CardChildProps) => React.JSX.Element;\nexport declare const CardFooter: ({ className, children, testId, ...props }: CardChildProps) => React.JSX.Element;\nexport declare const CardContent: ({ className, children, testId, ...props }: CardChildProps) => React.JSX.Element;\nexport declare const Card: Flow.AbstractComponent<CardProps, HTMLDivElement>;\nexport declare const ClickableCard: Flow.AbstractComponent<ClickableCardProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=Card.d.ts.map"
        },
        "story": {
          "path": "Card.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {spaceMedium} from 'src/styles/variables/_space';\n\nimport {Button} from 'src/components/Button';\nimport type {CardProps} from 'src/components/Card/Card';\nimport {\n  Card,\n  CardActions,\n  CardContent,\n  CardFooter,\n  CardHeader,\n  CardTitle,\n  ClickableCard,\n  PADDING_SIZES,\n} from 'src/components/Card/Card';\nimport {Icon} from 'src/components/Icon';\nimport {BodyLarge, BodySmall} from 'src/components/Text';\nimport {Tooltip} from 'src/components/Tooltip';\nimport {Truncate} from 'src/components/Truncate';\n\nimport css from 'src/components/Card/Card.stories.module.css';\n\n\nconst paddingSizes: Array<unknown> = [...Object.keys(PADDING_SIZES)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Card',\n  component: Card,\n  argTypes: {\n    onClick: {\n      description:\n        '**onClick** handler that is applied to the root `<div>` element. Use this in `ClickableCard`',\n      action: 'clicked',\n      table: {\n        type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n      },\n    },\n    disabled: {\n      name: 'disabled',\n      description: `Disabled Card. Use this in ClickableCard. When true, User can not interact with the the clickableCard.`,\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    paddingTop: {\n      description: 'Padding size for top of card',\n      options: paddingSizes,\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    paddingRight: {\n      description: 'Padding size for right of card',\n      options: paddingSizes,\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    paddingBottom: {\n      description: 'Padding size for bottom of card',\n      options: paddingSizes,\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    paddingLeft: {\n      description: 'Padding size for left of card',\n      options: paddingSizes,\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    classNames: {\n      description: 'External classNames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: '{wrapper?: string}'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    children: {\n      type: {required: true},\n      description: 'The content of the Card',\n      table: {\n        type: {summary: 'React.Component'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Card component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport {\n  Card,\n  ClickableCard,\n  CardHeader,\n  CardTitle,\n  CardActions,\n  CardContent,\n  CardFooter\n} from \"@spaced-out/ui-design-system/lib/components/Card\";\n\\`\\`\\`\nSimple Card component that supports padding as prop. Border and background are prefixed with default values.\nClickableCard variant supports hover and focus states. You also have an option to add header and footer to the card.\n\n**Note:** If you pass \\`'none'\\` as the \\`padding\\` value to the Card, make sure to apply the same \\`border-radius\\`\nto the top and bottom child elements to maintain visual consistency with the Card's corners.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Card/Card',\n    },\n  },\n};\n\nexport const DefaultStory = (args: CardProps) => (\n  <div className={css.container}>\n    <Card {...args} classNames={{wrapper: css.cardContainer}}>\n      <BodyLarge testId=\"card-title\">This is a card</BodyLarge>\n      <BodySmall testId=\"card-subtitle\">\n        Set width and height through a className\n      </BodySmall>\n      <BodySmall testId=\"card-description\">\n        Default Padding is set to {spaceMedium}\n      </BodySmall>\n    </Card>\n  </div>\n);\nDefaultStory.args = {\n  testId: 'default-card-story',\n};\n\nexport const WithHeaderStory = (args: CardProps) => (\n  <div className={css.container}>\n    <Card {...args}>\n      <CardHeader>\n        <CardTitle>\n          <Truncate>Card With Header</Truncate>\n        </CardTitle>\n        <CardActions>\n          <Button type=\"ghost\" iconLeftName=\"cloud-arrow-down\"></Button>\n          <Button type=\"ghost\" iconLeftName=\"add\"></Button>\n        </CardActions>\n      </CardHeader>\n      <CardContent className={css.cardContainer}>\n        <BodyLarge>This is a card</BodyLarge>\n        <BodySmall>Set width and height through a className</BodySmall>\n        <BodySmall>Default Padding is set to {spaceMedium}</BodySmall>\n      </CardContent>\n    </Card>\n  </div>\n);\n\nWithHeaderStory.args = {\n  classNames: {wrapper: css.cardContainerWithHeader},\n  testId: 'card-with-header-story',\n};\n\nexport const WithFooterStory = (args: CardProps) => (\n  <div className={css.container}>\n    <Card {...args}>\n      <CardContent className={css.cardContainer}>\n        <BodyLarge>This is a card</BodyLarge>\n        <BodySmall>Set width and height through a className</BodySmall>\n        <BodySmall>Default Padding is set to {spaceMedium}</BodySmall>\n      </CardContent>\n      <CardFooter>\n        <CardTitle>\n          <Truncate>Save it?</Truncate>\n        </CardTitle>\n        <CardActions>\n          <Button type=\"tertiary\" iconLeftName=\"trash\">\n            Delete\n          </Button>\n          <Button type=\"secondary\" iconLeftName=\"cloud-arrow-down\">\n            Save\n          </Button>\n        </CardActions>\n      </CardFooter>\n    </Card>\n  </div>\n);\n\nWithFooterStory.args = {\n  classNames: {wrapper: css.cardContainerWithHeader},\n  testId: 'card-with-footer-story',\n};\n\nexport const WithHeaderAndFooterStory = (args: CardProps) => (\n  <div className={css.container}>\n    <Card {...args}>\n      <CardHeader>\n        <CardTitle>\n          <Truncate>Card With Header</Truncate>\n        </CardTitle>\n        <CardActions>\n          <Button type=\"ghost\" iconLeftName=\"cloud-arrow-down\"></Button>\n          <Button type=\"ghost\" iconLeftName=\"add\"></Button>\n        </CardActions>\n      </CardHeader>\n      <CardContent className={css.cardContainer}>\n        <BodyLarge>This is a card</BodyLarge>\n        <BodySmall>Set width and height through a className</BodySmall>\n        <BodySmall>Default Padding is set to {spaceMedium}</BodySmall>\n      </CardContent>\n      <CardFooter>\n        <CardTitle>\n          <Truncate>Save it?</Truncate>\n        </CardTitle>\n        <CardActions>\n          <Button type=\"tertiary\" iconLeftName=\"trash\">\n            Delete\n          </Button>\n          <Button type=\"secondary\" iconLeftName=\"cloud-arrow-down\">\n            Save\n          </Button>\n        </CardActions>\n      </CardFooter>\n    </Card>\n  </div>\n);\n\nWithHeaderAndFooterStory.args = {\n  classNames: {wrapper: css.cardContainerWithHeader},\n  testId: 'card-with-header-and-footer-story',\n};\n\nexport const ClickableStory = (args: CardProps) => (\n  <div className={css.container}>\n    <ClickableCard {...args} classNames={{wrapper: css.cardContainer}}>\n      <BodyLarge>This is a clickable card</BodyLarge>\n      <BodySmall>Set width and height through a className</BodySmall>\n      <BodySmall>Default Padding is set to {spaceMedium}</BodySmall>\n      <Tooltip title=\"Hello there!\">\n        <Icon name=\"face-smile\" />\n      </Tooltip>\n      <BodySmall>This has focus and hover states</BodySmall>\n    </ClickableCard>\n  </div>\n);\nClickableStory.args = {\n  testId: 'clickable-card-story',\n};\nDefaultStory.storyName = 'Default';\nWithHeaderStory.storyName = 'With Header';\nWithFooterStory.storyName = 'With Footer';\nWithHeaderAndFooterStory.storyName = 'With Header And Footer';\nClickableStory.storyName = 'Clickable';\n"
        },
        "css": {
          "path": "Card.module.css",
          "content": "@value (colorBackgroundTertiary, colorFillPrimary, colorBorderSecondary, colorFocusPrimary) from '../../styles/variables/_color.css';\n@value (borderRadiusMedium, borderWidthNone, borderWidthTertiary) from '../../styles/variables/_border.css';\n@value (spaceSmall, spaceMedium, spaceLarge, spaceXSmall) from '../../styles/variables/_space.css';\n@value (size58, sizeFluid) from '../../styles/variables/_size.css';\n\n.cardWrapper {\n  --card-padding-top: spaceMedium;\n  --card-padding-right: spaceMedium;\n  --card-padding-bottom: spaceMedium;\n  --card-padding-left: spaceMedium;\n}\n\n.cardWrapper {\n  display: flex;\n  composes: borderPrimary from '../../styles/border.module.css';\n  background-color: colorBackgroundTertiary;\n  border-radius: borderRadiusMedium;\n}\n\n.cardWrapper:not(:has(.cardHeader, .cardFooter, .cardContent)) {\n  padding-top: var(--card-padding-top);\n  padding-right: var(--card-padding-right);\n  padding-bottom: var(--card-padding-bottom);\n  padding-left: var(--card-padding-left);\n}\n\n.cardWrapper:has(.cardHeader, .cardFooter, .cardContent) {\n  flex-flow: column;\n}\n\n.cardHeader {\n  display: flex;\n  justify-content: space-between;\n  width: sizeFluid;\n  align-items: center;\n  min-height: size58;\n  composes: subTitleSmall from '../../styles/typography.module.css';\n  composes: borderBottomPrimary from '../../styles/border.module.css';\n  padding: spaceSmall var(--card-padding-right) spaceSmall\n    var(--card-padding-left);\n  gap: spaceXSmall;\n}\n\n.cardFooter {\n  display: flex;\n  justify-content: space-between;\n  width: sizeFluid;\n  align-items: center;\n  min-height: size58;\n  composes: subTitleSmall from '../../styles/typography.module.css';\n  composes: borderTopPrimary from '../../styles/border.module.css';\n  padding: spaceSmall var(--card-padding-right) spaceSmall\n    var(--card-padding-left);\n  gap: spaceXSmall;\n  margin-top: auto;\n}\n\n.cardTitle {\n  display: flex;\n}\n\n.cardActions {\n  display: flex;\n  gap: spaceXSmall;\n  margin-left: auto;\n}\n\n.cardContent {\n  display: flex;\n  padding-top: var(--card-padding-top);\n  padding-right: var(--card-padding-right);\n  padding-bottom: var(--card-padding-bottom);\n  padding-left: var(--card-padding-left);\n}\n\n.clickableCard {\n  cursor: pointer;\n  outline: none;\n}\n.clickableCard.disabled {\n  pointer-events: none;\n}\n\n.clickableCard:hover {\n  border-color: colorBorderSecondary;\n}\n\n.clickableCard:focus-within {\n  border-color: colorFillPrimary;\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Card/Card';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "Card.module.css",
        "Card.stories.module.css",
        "Card.stories.tsx",
        "Card.tsx",
        "index.ts"
      ]
    },
    "Charts": {
      "name": "Charts",
      "path": "src/components/Charts",
      "files": {
        "main": null,
        "story": null,
        "css": null,
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Charts/ChartTooltip';\nexport * from '../../components/Charts/ChartWrapper';\nexport * from '../../components/Charts/ColumnChart';\nexport * from '../../components/Charts/DonutChart';\nexport * from '../../components/Charts/FunnelChart';\nexport * from '../../components/Charts/LineChart';\nexport * from '../../components/Charts/SankeyChart';\nexport * from '../../components/Charts/SpiderChart';\nexport * from '../../components/Charts/StackedBarChart';\nexport * from '../../components/Charts/StackedBarLineChart';\nexport * from '../../components/Charts/UniversalChart';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "ChartTooltip/index.d.ts": {
            "path": "ChartTooltip/index.d.ts",
            "content": "import type { ChartTooltip } from '../../../types/charts';\nexport declare const tooltipTheme: ChartTooltip;\n//# sourceMappingURL=index.d.ts.map"
          },
          "ChartWrapper/ChartWrapper.d.ts": {
            "path": "ChartWrapper/ChartWrapper.d.ts",
            "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport Highcharts from 'highcharts';\ninterface ChartRef {\n    chart?: Highcharts.Chart;\n}\nexport type ChartRefObject = React.RefObject<ChartRef | null>;\nexport interface ExportOptionType {\n    key: string;\n    label: string;\n    format: string;\n}\nexport declare const EXPORT_OPTIONS: Readonly<{\n    download_as_png: {\n        key: string;\n        label: string;\n        format: string;\n    };\n    download_as_jpeg: {\n        key: string;\n        label: string;\n        format: string;\n    };\n    download_as_pdf: {\n        key: string;\n        label: string;\n        format: string;\n    };\n    download_as_svg: {\n        key: string;\n        label: string;\n        format: string;\n    };\n}>;\nexport type ChartWrapperClassNames = Readonly<{\n    wrapper?: string;\n    header?: string;\n    title?: string;\n    actions?: string;\n    content?: string;\n    loader?: string;\n}>;\ninterface ChartWrapperProps {\n    isLoading?: boolean;\n    title: React.ReactNode;\n    children?: React.ReactNode;\n    classNames?: ChartWrapperClassNames;\n    customExportOptions?: Array<ExportOptionType> | null;\n    headerActions?: React.ReactNode;\n    hasEmptyData?: boolean;\n    emptyText?: React.ReactNode;\n    testId?: string;\n}\nexport declare const ChartWrapper: Flow.AbstractComponent<ChartWrapperProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=ChartWrapper.d.ts.map"
          },
          "ChartWrapper/index.d.ts": {
            "path": "ChartWrapper/index.d.ts",
            "content": "export * from '../../../components/Charts/ChartWrapper/ChartWrapper';\n//# sourceMappingURL=index.d.ts.map"
          },
          "ColumnChart/ColumnChart.d.ts": {
            "path": "ColumnChart/ColumnChart.d.ts",
            "content": "import * as React from 'react';\nimport type { SeriesColumnOptions } from 'highcharts';\nimport type { ChartOptions, DataOptionsType, Drilldown } from '../../../types/charts';\nimport type { ChartWrapperClassNames, ExportOptionType } from '../../../components/Charts/ChartWrapper';\ntype ClassNames = Readonly<ChartWrapperClassNames & {\n    highChart?: string;\n}>;\nexport type ColumnSeries = Omit<SeriesColumnOptions, 'data' | 'type'> & {\n    name: string;\n    data: DataOptionsType[];\n};\nexport interface ColumnChartProps extends Omit<ChartOptions, 'isLoading' | 'classNames' | 'cardTitle' | 'customExportOptions' | 'series' | 'drilldown' | 'headerActions' | 'hasEmptyData' | 'emptyText'> {\n    isLoading?: boolean;\n    classNames?: ClassNames;\n    cardTitle?: React.ReactNode;\n    customExportOptions?: Array<ExportOptionType> | null;\n    series: Array<ColumnSeries>;\n    drilldown?: Drilldown;\n    headerActions?: React.ReactNode;\n    hasEmptyData?: boolean;\n    emptyText?: React.ReactNode;\n    testId?: string;\n}\nexport declare const ColumnChart: ({ isLoading, classNames, cardTitle, customExportOptions, series, drilldown, headerActions, hasEmptyData, emptyText, testId, ...userOptions }: ColumnChartProps) => React.JSX.Element;\nexport {};\n//# sourceMappingURL=ColumnChart.d.ts.map"
          },
          "ColumnChart/index.d.ts": {
            "path": "ColumnChart/index.d.ts",
            "content": "export * from '../../../components/Charts/ColumnChart/ColumnChart';\n//# sourceMappingURL=index.d.ts.map"
          },
          "DonutChart/DonutChart.d.ts": {
            "path": "DonutChart/DonutChart.d.ts",
            "content": "import * as React from 'react';\nimport type { ChartOptions, Drilldown, LegendOptionsType, PieSeriesOptions } from '../../../types/charts';\nimport type { ChartWrapperClassNames, ExportOptionType } from '../../../components/Charts/ChartWrapper';\ntype ClassNames = Readonly<ChartWrapperClassNames & {\n    highChart?: string;\n    subtitleClassNames?: SubtitleClassNames;\n}>;\ninterface SubtitleClassNames {\n    wrapper?: string;\n    text?: string;\n    subtext?: string;\n}\nexport interface DonutChartProps extends Omit<ChartOptions, 'isLoading' | 'classNames' | 'cardTitle' | 'customExportOptions' | 'headerActions' | 'centerText' | 'centerSubtext' | 'series' | 'drilldown' | 'legend' | 'hasEmptyData' | 'emptyText'> {\n    isLoading?: boolean;\n    classNames?: ClassNames;\n    cardTitle?: React.ReactNode;\n    customExportOptions?: Array<ExportOptionType> | null;\n    headerActions?: React.ReactNode;\n    centerText?: string;\n    centerSubtext?: string;\n    showTotal?: boolean;\n    showLegendValues?: boolean;\n    formatValue?: (value: number) => string;\n    series: Array<PieSeriesOptions>;\n    drilldown?: Drilldown;\n    legend?: LegendOptionsType;\n    hasEmptyData?: boolean;\n    emptyText?: React.ReactNode;\n    testId?: string;\n}\nexport declare const DonutChart: ({ isLoading, classNames, cardTitle, customExportOptions, headerActions, series, drilldown, legend, centerText, centerSubtext, showTotal, showLegendValues, formatValue, hasEmptyData, emptyText, testId, ...userOptions }: DonutChartProps) => React.JSX.Element;\nexport {};\n//# sourceMappingURL=DonutChart.d.ts.map"
          },
          "DonutChart/index.d.ts": {
            "path": "DonutChart/index.d.ts",
            "content": "export * from '../../../components/Charts/DonutChart/DonutChart';\n//# sourceMappingURL=index.d.ts.map"
          },
          "FunnelChart/FunnelChart.d.ts": {
            "path": "FunnelChart/FunnelChart.d.ts",
            "content": "import * as React from 'react';\nimport type { ChartOptions, DataOptionsType, Drilldown } from '../../../types/charts';\nimport type { ChartWrapperClassNames, ExportOptionType } from '../../../components/Charts/ChartWrapper';\ntype ClassNames = Readonly<ChartWrapperClassNames & {\n    highChart?: string;\n}>;\nexport interface FunnelSeriesItem {\n    name?: string;\n    showInLegend?: boolean;\n    data: Array<DataOptionsType>;\n}\nexport interface FunnelChartProps extends Omit<ChartOptions, 'isLoading' | 'classNames' | 'cardTitle' | 'customExportOptions' | 'series' | 'headerActions' | 'drilldown' | 'showLegend' | 'hasEmptyData' | 'emptyText'> {\n    isLoading?: boolean;\n    classNames?: ClassNames;\n    cardTitle?: React.ReactNode;\n    customExportOptions?: Array<ExportOptionType> | null;\n    series: Array<FunnelSeriesItem>;\n    headerActions?: React.ReactNode;\n    drilldown?: Drilldown;\n    showLegend?: boolean;\n    hasEmptyData?: boolean;\n    emptyText?: React.ReactNode;\n    testId?: string;\n}\nexport declare const FunnelChart: ({ isLoading, classNames, cardTitle, customExportOptions, series, headerActions, drilldown, showLegend, hasEmptyData, emptyText, testId, ...userOptions }: FunnelChartProps) => React.JSX.Element;\nexport {};\n//# sourceMappingURL=FunnelChart.d.ts.map"
          },
          "FunnelChart/index.d.ts": {
            "path": "FunnelChart/index.d.ts",
            "content": "export * from '../../../components/Charts/FunnelChart/FunnelChart';\n//# sourceMappingURL=index.d.ts.map"
          },
          "LineChart/LineChart.d.ts": {
            "path": "LineChart/LineChart.d.ts",
            "content": "import * as React from 'react';\nimport type { SeriesLineOptions } from 'highcharts';\nimport type { ChartOptions, DataOptionsType, Drilldown } from '../../../types/charts';\nimport type { ChartWrapperClassNames, ExportOptionType } from '../../../components/Charts/ChartWrapper';\ntype ClassNames = Readonly<ChartWrapperClassNames & {\n    highChart?: string;\n}>;\nexport type LineSeriesItem = Omit<SeriesLineOptions, 'data' | 'type'> & {\n    name: string;\n    data: DataOptionsType[];\n};\nexport interface LineChartProps extends Omit<ChartOptions, 'isLoading' | 'classNames' | 'cardTitle' | 'customExportOptions' | 'series' | 'headerActions' | 'drilldown' | 'hasEmptyData' | 'emptyText'> {\n    isLoading?: boolean;\n    classNames?: ClassNames;\n    cardTitle?: React.ReactNode;\n    customExportOptions?: Array<ExportOptionType> | null;\n    series: Array<LineSeriesItem>;\n    headerActions?: React.ReactNode;\n    drilldown?: Drilldown;\n    hasEmptyData?: boolean;\n    emptyText?: React.ReactNode;\n    testId?: string;\n}\nexport declare const LineChart: ({ isLoading, classNames, cardTitle, customExportOptions, series, headerActions, drilldown, hasEmptyData, emptyText, testId, ...userOptions }: LineChartProps) => React.JSX.Element;\nexport {};\n//# sourceMappingURL=LineChart.d.ts.map"
          },
          "LineChart/index.d.ts": {
            "path": "LineChart/index.d.ts",
            "content": "export * from '../../../components/Charts/LineChart/LineChart';\n//# sourceMappingURL=index.d.ts.map"
          },
          "SankeyChart/SankeyChart.d.ts": {
            "path": "SankeyChart/SankeyChart.d.ts",
            "content": "import * as React from 'react';\nimport type { ChartOptions, Drilldown, SankeySeriesOptions } from '../../../types/charts';\nimport type { ChartWrapperClassNames, ExportOptionType } from '../../../components/Charts/ChartWrapper';\ntype ClassNames = Readonly<ChartWrapperClassNames & {\n    highChart?: string;\n}>;\nexport interface SankeyChartProps extends Omit<ChartOptions, 'isLoading' | 'cardTitle' | 'emptyText' | 'nodeWidth' | 'classNames' | 'showLegend' | 'nodePadding' | 'series' | 'drilldown' | 'hasEmptyData' | 'headerActions' | 'customExportOptions'> {\n    isLoading?: boolean;\n    cardTitle?: React.ReactNode;\n    emptyText?: React.ReactNode;\n    nodeWidth?: number;\n    classNames?: ClassNames;\n    showLegend?: boolean;\n    nodePadding?: number;\n    hasEmptyData?: boolean;\n    headerActions?: React.ReactNode;\n    customExportOptions?: Array<ExportOptionType> | null;\n    series?: Array<SankeySeriesOptions>;\n    drilldown?: Drilldown;\n    testId?: string;\n}\nexport declare const SankeyChart: ({ series, emptyText, drilldown, cardTitle, isLoading, nodeWidth, showLegend, classNames, nodePadding, hasEmptyData, headerActions, customExportOptions, testId, ...userOptions }: SankeyChartProps) => React.ReactNode;\nexport {};\n//# sourceMappingURL=SankeyChart.d.ts.map"
          },
          "SankeyChart/index.d.ts": {
            "path": "SankeyChart/index.d.ts",
            "content": "export * from '../../../components/Charts/SankeyChart/SankeyChart';\n//# sourceMappingURL=index.d.ts.map"
          },
          "SpiderChart/SpiderChart.d.ts": {
            "path": "SpiderChart/SpiderChart.d.ts",
            "content": "import * as React from 'react';\nimport type { SeriesLineOptions } from 'highcharts';\nimport type { ChartOptions, DataOptionsType } from '../../../types/charts';\nimport type { ChartWrapperClassNames, ExportOptionType } from '../../../components/Charts/ChartWrapper';\ntype ClassNames = Readonly<ChartWrapperClassNames & {\n    highChart?: string;\n}>;\nexport type SpiderSeriesItem = Omit<SeriesLineOptions, 'data' | 'type'> & {\n    name: string;\n    data: DataOptionsType[];\n};\nexport interface SpiderChartProps extends Omit<ChartOptions, 'isLoading' | 'classNames' | 'cardTitle' | 'customExportOptions' | 'headerActions' | 'series' | 'hasEmptyData' | 'emptyText'> {\n    isLoading?: boolean;\n    classNames?: ClassNames;\n    cardTitle?: React.ReactNode;\n    customExportOptions?: Array<ExportOptionType> | null;\n    headerActions?: React.ReactNode;\n    series: Array<SpiderSeriesItem>;\n    hasEmptyData?: boolean;\n    emptyText?: React.ReactNode;\n    testId?: string;\n}\nexport declare const SpiderChart: ({ isLoading, classNames, cardTitle, customExportOptions, headerActions, series, hasEmptyData, emptyText, testId, ...userOptions }: SpiderChartProps) => React.JSX.Element;\nexport {};\n//# sourceMappingURL=SpiderChart.d.ts.map"
          },
          "SpiderChart/index.d.ts": {
            "path": "SpiderChart/index.d.ts",
            "content": "export * from '../../../components/Charts/SpiderChart/SpiderChart';\n//# sourceMappingURL=index.d.ts.map"
          },
          "StackedBarChart/StackedBarChart.d.ts": {
            "path": "StackedBarChart/StackedBarChart.d.ts",
            "content": "import * as React from 'react';\nimport type { SeriesColumnOptions } from 'highcharts';\nimport type { ChartOptions, DataOptionsType, Drilldown } from '../../../types/charts';\nimport type { StackedBarOrientation } from '../../../utils/charts';\nimport type { ChartWrapperClassNames, ExportOptionType } from '../../../components/Charts/ChartWrapper';\ntype ClassNames = Readonly<ChartWrapperClassNames & {\n    highChart?: string;\n}>;\nexport type StackedBarSeries = Omit<SeriesColumnOptions, 'data' | 'type'> & {\n    name: string;\n    data: DataOptionsType[];\n};\nexport interface StackedBarChartProps extends Omit<ChartOptions, 'series' | 'isLoading' | 'drilldown' | 'cardTitle' | 'emptyText' | 'classNames' | 'hasEmptyData' | 'headerActions' | 'customExportOptions'> {\n    series: Array<StackedBarSeries>;\n    /**\n     * Orientation of the stacked bars. Defaults to `horizontal`.\n     * Pass `vertical` to render columns with categories on the x-axis.\n     */\n    orientation?: StackedBarOrientation;\n    isLoading?: boolean;\n    drilldown?: Drilldown;\n    cardTitle?: React.ReactNode;\n    emptyText?: React.ReactNode;\n    classNames?: ClassNames;\n    hasEmptyData?: boolean;\n    headerActions?: React.ReactNode;\n    customExportOptions?: Array<ExportOptionType> | null;\n    testId?: string;\n}\nexport declare const StackedBarChart: ({ series, orientation, isLoading, drilldown, emptyText, cardTitle, classNames, hasEmptyData, headerActions, customExportOptions, testId, ...userOptions }: StackedBarChartProps) => React.ReactNode;\nexport {};\n//# sourceMappingURL=StackedBarChart.d.ts.map"
          },
          "StackedBarChart/index.d.ts": {
            "path": "StackedBarChart/index.d.ts",
            "content": "export * from '../../../components/Charts/StackedBarChart/StackedBarChart';\n//# sourceMappingURL=index.d.ts.map"
          },
          "StackedBarLineChart/StackedBarLineChart.d.ts": {
            "path": "StackedBarLineChart/StackedBarLineChart.d.ts",
            "content": "import * as React from 'react';\nimport type { SeriesColumnOptions, SeriesLineOptions } from 'highcharts';\nimport type { ChartOptions, DataOptionsType, Drilldown } from '../../../types/charts';\nimport type { ChartWrapperClassNames, ExportOptionType } from '../../../components/Charts/ChartWrapper';\ntype ClassNames = Readonly<ChartWrapperClassNames & {\n    highChart?: string;\n}>;\nexport type StackedBarLineColumnSeries = Omit<SeriesColumnOptions, 'data' | 'type'> & {\n    type: 'column';\n    name: string;\n    data: DataOptionsType[];\n};\nexport type StackedBarLineLineSeries = Omit<SeriesLineOptions, 'data' | 'type'> & {\n    type: 'line';\n    name: string;\n    data: DataOptionsType[];\n};\nexport type StackedBarLineSeries = StackedBarLineColumnSeries | StackedBarLineLineSeries;\n/**\n * Combo chart: stacked columns + overlaid line(s) on a single shared y-axis.\n *\n * Use when the columns and line(s) share the same units (e.g., a stacked\n * breakdown of revenue plus a target-revenue line, both in dollars). Pass\n * `yAxis` as a single options object; the chart renders the axis labels on\n * both the left and the right edges of the plot via a linked mirror, so\n * values are readable from either side.\n */\nexport interface StackedBarLineChartProps extends Omit<ChartOptions, 'series' | 'isLoading' | 'drilldown' | 'cardTitle' | 'emptyText' | 'classNames' | 'hasEmptyData' | 'headerActions' | 'customExportOptions'> {\n    series: Array<StackedBarLineSeries>;\n    isLoading?: boolean;\n    drilldown?: Drilldown;\n    cardTitle?: React.ReactNode;\n    emptyText?: React.ReactNode;\n    classNames?: ClassNames;\n    hasEmptyData?: boolean;\n    headerActions?: React.ReactNode;\n    customExportOptions?: Array<ExportOptionType> | null;\n    testId?: string;\n}\nexport declare const StackedBarLineChart: ({ series, isLoading, drilldown, emptyText, cardTitle, classNames, hasEmptyData, headerActions, customExportOptions, testId, ...userOptions }: StackedBarLineChartProps) => React.ReactNode;\nexport {};\n//# sourceMappingURL=StackedBarLineChart.d.ts.map"
          },
          "StackedBarLineChart/index.d.ts": {
            "path": "StackedBarLineChart/index.d.ts",
            "content": "export * from '../../../components/Charts/StackedBarLineChart/StackedBarLineChart';\n//# sourceMappingURL=index.d.ts.map"
          },
          "UniversalChart/UniversalChart.d.ts": {
            "path": "UniversalChart/UniversalChart.d.ts",
            "content": "import * as React from 'react';\nimport type { CategoricalChartKind, ChartKindOptionType, ComboChartKind, FlowChartKind, ProportionChartKind, UniversalChartProps } from '../../../components/Charts/UniversalChart/UniversalChart.types';\nexport declare const CHART_KIND_OPTIONS: Readonly<{\n    column: ChartKindOptionType<\"column\">;\n    line: ChartKindOptionType<\"line\">;\n    donut: ChartKindOptionType<\"donut\">;\n    funnel: ChartKindOptionType<\"funnel\">;\n    sankey: ChartKindOptionType<\"sankey\">;\n    spider: ChartKindOptionType<\"spider\">;\n    stackedBar: ChartKindOptionType<\"stackedBar\">;\n    stackedBarLine: ChartKindOptionType<\"stackedBarLine\">;\n}>;\nexport declare const CHART_KIND_GROUPS: Readonly<{\n    CATEGORICAL: Array<ChartKindOptionType<CategoricalChartKind>>;\n    PROPORTION: Array<ChartKindOptionType<ProportionChartKind>>;\n    FLOW: Array<ChartKindOptionType<FlowChartKind>>;\n    COMBO: Array<ChartKindOptionType<ComboChartKind>>;\n}>;\nexport type { UniversalChartProps, ChartKind, ChartKindOptionType, ChartKindSelectorProps, CategoricalChartKind, ProportionChartKind, FlowChartKind, ComboChartKind, } from '../../../components/Charts/UniversalChart/UniversalChart.types';\nexport declare const UniversalChart: {\n    (props: UniversalChartProps): React.JSX.Element;\n    displayName: string;\n};\n//# sourceMappingURL=UniversalChart.d.ts.map"
          },
          "UniversalChart/UniversalChart.types.d.ts": {
            "path": "UniversalChart/UniversalChart.types.d.ts",
            "content": "import type { ColumnChartProps } from '../../../components/Charts/ColumnChart';\nimport type { DonutChartProps } from '../../../components/Charts/DonutChart';\nimport type { FunnelChartProps } from '../../../components/Charts/FunnelChart';\nimport type { LineChartProps } from '../../../components/Charts/LineChart';\nimport type { SankeyChartProps } from '../../../components/Charts/SankeyChart';\nimport type { SpiderChartProps } from '../../../components/Charts/SpiderChart';\nimport type { StackedBarChartProps } from '../../../components/Charts/StackedBarChart';\nimport type { StackedBarLineChartProps } from '../../../components/Charts/StackedBarLineChart';\nexport type ChartKind = 'column' | 'line' | 'donut' | 'funnel' | 'sankey' | 'spider' | 'stackedBar' | 'stackedBarLine';\nexport type CategoricalChartKind = 'column' | 'line' | 'stackedBar' | 'spider';\nexport type ProportionChartKind = 'donut' | 'funnel';\nexport type FlowChartKind = 'sankey';\nexport type ComboChartKind = 'stackedBarLine';\nexport interface ChartKindOptionType<K extends ChartKind = ChartKind> {\n    key: K;\n    label: string;\n}\nexport interface ChartKindSelectorProps {\n    showChartKindSwitcher?: boolean;\n    chartKindOptions?: Array<ChartKindOptionType<CategoricalChartKind>> | Array<ChartKindOptionType<ProportionChartKind>> | Array<ChartKindOptionType<FlowChartKind>> | Array<ChartKindOptionType<ComboChartKind>>;\n    onChartKindChange?: (chartKind: ChartKind) => void;\n    responsive?: boolean;\n}\nexport type UniversalChartProps = (({\n    chartKind: 'column';\n} & ColumnChartProps) | ({\n    chartKind: 'line';\n} & LineChartProps) | ({\n    chartKind: 'donut';\n} & DonutChartProps) | ({\n    chartKind: 'funnel';\n} & FunnelChartProps) | ({\n    chartKind: 'sankey';\n} & SankeyChartProps) | ({\n    chartKind: 'spider';\n} & SpiderChartProps) | ({\n    chartKind: 'stackedBar';\n} & StackedBarChartProps) | ({\n    chartKind: 'stackedBarLine';\n} & StackedBarLineChartProps)) & ChartKindSelectorProps;\n//# sourceMappingURL=UniversalChart.types.d.ts.map"
          },
          "UniversalChart/index.d.ts": {
            "path": "UniversalChart/index.d.ts",
            "content": "export * from '../../../components/Charts/UniversalChart/UniversalChart';\n//# sourceMappingURL=index.d.ts.map"
          }
        }
      },
      "allFiles": [
        "ChartTooltip/ChartTooltip.module.css",
        "ChartTooltip/index.ts",
        "ChartWrapper/ChartWrapper.module.css",
        "ChartWrapper/ChartWrapper.tsx",
        "ChartWrapper/index.ts",
        "ColumnChart/ColumnChart.module.css",
        "ColumnChart/ColumnChart.stories.module.css",
        "ColumnChart/ColumnChart.stories.tsx",
        "ColumnChart/ColumnChart.tsx",
        "ColumnChart/index.ts",
        "DonutChart/DonutChart.module.css",
        "DonutChart/DonutChart.stories.module.css",
        "DonutChart/DonutChart.stories.tsx",
        "DonutChart/DonutChart.tsx",
        "DonutChart/index.ts",
        "FunnelChart/FunnelChart.module.css",
        "FunnelChart/FunnelChart.stories.module.css",
        "FunnelChart/FunnelChart.stories.tsx",
        "FunnelChart/FunnelChart.tsx",
        "FunnelChart/index.ts",
        "LineChart/LineChart.module.css",
        "LineChart/LineChart.stories.module.css",
        "LineChart/LineChart.stories.tsx",
        "LineChart/LineChart.tsx",
        "LineChart/index.ts",
        "SankeyChart/SankeyChart.module.css",
        "SankeyChart/SankeyChart.stories.module.css",
        "SankeyChart/SankeyChart.stories.tsx",
        "SankeyChart/SankeyChart.tsx",
        "SankeyChart/index.ts",
        "SpiderChart/SpiderChart.module.css",
        "SpiderChart/SpiderChart.stories.module.css",
        "SpiderChart/SpiderChart.stories.tsx",
        "SpiderChart/SpiderChart.tsx",
        "SpiderChart/index.ts",
        "StackedBarChart/StackedBarChart.module.css",
        "StackedBarChart/StackedBarChart.stories.module.css",
        "StackedBarChart/StackedBarChart.stories.tsx",
        "StackedBarChart/StackedBarChart.tsx",
        "StackedBarChart/index.ts",
        "StackedBarLineChart/StackedBarLineChart.module.css",
        "StackedBarLineChart/StackedBarLineChart.stories.module.css",
        "StackedBarLineChart/StackedBarLineChart.stories.tsx",
        "StackedBarLineChart/StackedBarLineChart.tsx",
        "StackedBarLineChart/index.ts",
        "UniversalChart/UniversalChart.module.css",
        "UniversalChart/UniversalChart.stories.module.css",
        "UniversalChart/UniversalChart.stories.tsx",
        "UniversalChart/UniversalChart.tsx",
        "UniversalChart/UniversalChart.types.ts",
        "UniversalChart/index.ts",
        "index.ts"
      ]
    },
    "ChatBubble": {
      "name": "ChatBubble",
      "path": "src/components/ChatBubble",
      "files": {
        "main": {
          "path": "ChatBubble.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { AvatarProps } from '../../components/Avatar';\nimport type { BaseTooltipProps } from '../../components/Tooltip';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n}>;\nexport declare const CHAT_BUBBLE_ORIENTATION: Readonly<{\n    left: \"left\";\n    right: \"right\";\n}>;\nexport type ChatBubbleOrientation = (typeof CHAT_BUBBLE_ORIENTATION)[keyof typeof CHAT_BUBBLE_ORIENTATION];\nexport interface ChatBubbleProps {\n    classNames?: ClassNames;\n    orientation?: ChatBubbleOrientation;\n    children: React.ReactNode;\n    testId?: string;\n}\nexport declare const ChatBubble: Flow.AbstractComponent<ChatBubbleProps, HTMLDivElement>;\nexport interface ChatAnchorProps {\n    isAI?: boolean;\n    tooltip?: BaseTooltipProps;\n    classNames?: ClassNames;\n    avatarProps?: AvatarProps;\n    testId?: string;\n}\nexport declare const ChatAnchor: {\n    ({ isAI, tooltip, classNames, avatarProps, testId, }: ChatAnchorProps): React.JSX.Element;\n    displayName: string;\n};\nexport interface ChatContentProps {\n    classNames?: ClassNames;\n    children?: React.ReactNode;\n    testId?: string;\n}\nexport declare const ChatContent: {\n    ({ classNames, children, testId, }: ChatContentProps): React.JSX.Element;\n    displayName: string;\n};\nexport type ChatBodyClassNames = Readonly<{\n    wrapper?: string;\n    loader: string;\n}>;\nexport interface ChatBodyProps {\n    withBgColor?: boolean;\n    isLoading?: boolean;\n    loadingText?: string;\n    children?: React.ReactNode;\n    classNames?: ClassNames;\n    testId?: string;\n}\nexport declare const ChatBody: {\n    ({ withBgColor, isLoading, children, loadingText, classNames, testId, }: ChatBodyProps): React.JSX.Element;\n    displayName: string;\n};\nexport interface ChatFooterProps {\n    classNames?: ClassNames;\n    children?: React.ReactNode;\n    testId?: string;\n}\nexport declare const ChatFooter: {\n    ({ children, classNames, testId }: ChatFooterProps): React.JSX.Element;\n    displayName: string;\n};\nexport interface ChatFooterRightSlotProps {\n    children?: React.ReactNode;\n    classNames?: ClassNames;\n    testId?: string;\n}\nexport declare const ChatFooterRightSlot: {\n    ({ children, classNames, testId, }: ChatFooterRightSlotProps): React.JSX.Element;\n    displayName: string;\n};\nexport interface ChatFooterLeftSlotProps {\n    children?: React.ReactNode;\n    classNames?: ClassNames;\n    testId?: string;\n}\nexport declare const ChatFooterLeftSlot: {\n    ({ children, classNames, testId, }: ChatFooterLeftSlotProps): React.JSX.Element;\n    displayName: string;\n};\nexport {};\n//# sourceMappingURL=ChatBubble.d.ts.map"
        },
        "story": {
          "path": "ChatBubble.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {Button} from 'src/components/Button';\nimport type {ChatBubbleProps} from 'src/components/ChatBubble';\nimport {\n  CHAT_BUBBLE_ORIENTATION,\n  ChatAnchor,\n  ChatBody,\n  ChatBubble,\n  ChatContent,\n  ChatFooter,\n  ChatFooterLeftSlot,\n  ChatFooterRightSlot,\n} from 'src/components/ChatBubble/ChatBubble';\nimport {Separator} from 'src/components/Separator';\nimport {BodyMedium, SubTitleSmall} from 'src/components/Text';\n\nimport css from 'src/components/ChatBubble/ChatBubble.stories.module.css';\n\n\nexport const ChatFooterWithIcons = () => (\n  <ChatFooter>\n    <ChatFooterLeftSlot classNames={{wrapper: css.footerWrapperLeftSlot}}>\n      <Button iconRightName=\"flag\" size=\"small\" type=\"ghost\" ariaLabel=\"Flag\" />\n      <Separator classNames={{wrapper: css.separatorMargin}} />\n      <div className={css.buttonWrapper}>\n        <Button\n          iconRightName=\"thumbs-up\"\n          size=\"small\"\n          type=\"ghost\"\n          ariaLabel=\"Thumbs Up\"\n        />\n        <Button\n          iconRightName=\"thumbs-down\"\n          size=\"small\"\n          type=\"ghost\"\n          ariaLabel=\"Thumbs Down\"\n        />\n      </div>\n    </ChatFooterLeftSlot>\n    <ChatFooterRightSlot classNames={{wrapper: css.footerWrapperRightSlot}}>\n      <Button children=\"Secondary\" type=\"ghost\" size=\"small\" />\n      <Button children=\"Primary\" type=\"secondary\" size=\"small\" />\n    </ChatFooterRightSlot>\n  </ChatFooter>\n);\n\nexport default {\n  tags: ['autodocs'],\n  title: 'AI Prompt Components/Chat Bubble',\n  component: ChatBubble,\n  argTypes: {\n    orientation: {\n      description: 'Determines the alignment of the chat bubble.',\n      control: {type: 'radio'},\n      options: [CHAT_BUBBLE_ORIENTATION.left, CHAT_BUBBLE_ORIENTATION.right],\n      table: {\n        type: {\n          summary: `${CHAT_BUBBLE_ORIENTATION.left} | ${CHAT_BUBBLE_ORIENTATION.right}`,\n        },\n        defaultValue: {summary: `${CHAT_BUBBLE_ORIENTATION.left}`},\n      },\n    },\n    classNames: {\n      description:\n        'Provide an optional className to be applied to the wrapper.',\n      control: {type: 'text'},\n      table: {\n        type: {summary: '{ wrapper?: string }'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a ChatBubble component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { ChatBubble } from \"@spaced-out/ui-design-system/lib/components/ChatBubble\";\n\\`\\`\\`\nThe ChatBubble component is used to structure chat messages with anchors, content, and a footer.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/ChatBubble/ChatBubble',\n    },\n  },\n};\n\n// Default ChatBubble Story\nexport const DefaultStory = (args: ChatBubbleProps) => (\n  <ChatBubble {...args}>\n    <ChatAnchor />\n    <ChatContent>\n      <ChatBody>\n        <BodyMedium>\n          Generative AI (GenAI) enables systems to generate human-like\n          responses, content, or ideas dynamically, leveraging advanced machine\n          learning models. In conversational applications, GenAI enhances user\n          experiences by enabling intelligent, context-aware, and natural\n          language interactions.\n        </BodyMedium>\n      </ChatBody>\n      <ChatFooterWithIcons />\n    </ChatContent>\n  </ChatBubble>\n);\n\nDefaultStory.storyName = 'Default Chat Bubble';\nDefaultStory.args = {\n  orientation: 'left',\n};\n\n// ChatBubble with Custom User Message\nexport const WithUserMessageStory = (args: ChatBubbleProps) => (\n  <ChatBubble {...args}>\n    <ChatAnchor\n      isAI={false}\n      avatarProps={{\n        imageSrc:\n          'https://cdn.sensehq.com/genesis/hashed/static/images/personas/1.png',\n        text: 'Adam Craig Gilchrist',\n      }}\n    />\n    <ChatContent>\n      <ChatBody withBgColor={true}>\n        <BodyMedium>This message has a custom avatar.</BodyMedium>\n      </ChatBody>\n    </ChatContent>\n  </ChatBubble>\n);\n\nWithUserMessageStory.storyName = 'Chat Bubble With Custom User';\nWithUserMessageStory.args = {\n  orientation: 'left',\n};\n\n// ChatBubble with No Anchor\nexport const NoAnchorStory = (args: ChatBubbleProps) => (\n  <ChatBubble {...args}>\n    <ChatContent>\n      <ChatBody>\n        <BodyMedium>\n          Generative AI (GenAI) enables systems to generate human-like\n          responses, content, or ideas dynamically, leveraging advanced machine\n          learning models. In conversational applications, GenAI enhances user\n          experiences by enabling intelligent, context-aware, and natural\n          language interactions.\n        </BodyMedium>\n      </ChatBody>\n      <ChatFooterWithIcons />\n    </ChatContent>\n  </ChatBubble>\n);\n\nNoAnchorStory.storyName = 'Chat Bubble Without Anchor';\n\n// ChatBubble with Custom Avatar\nexport const WithAvatarStory = (args: ChatBubbleProps) => (\n  <ChatBubble {...args}>\n    <ChatAnchor\n      isAI={false}\n      avatarProps={{\n        imageSrc:\n          'https://cdn.sensehq.com/genesis/hashed/static/images/personas/1.png',\n        text: 'Adam Craig Gilchrist',\n      }}\n    />\n    <ChatContent>\n      <ChatBody>\n        <BodyMedium>This message has a custom avatar.</BodyMedium>\n      </ChatBody>\n      <ChatFooterWithIcons />\n    </ChatContent>\n  </ChatBubble>\n);\n\nWithAvatarStory.storyName = 'Chat Bubble With Avatar';\nWithAvatarStory.args = {\n  orientation: 'left',\n};\n\n// Loading State in ChatBubble\nexport const LoadingStateStory = (args: ChatBubbleProps) => (\n  <ChatBubble {...args}>\n    <ChatAnchor />\n    <ChatContent>\n      <ChatBody isLoading loadingText=\"Loading message\" />\n    </ChatContent>\n  </ChatBubble>\n);\n\nLoadingStateStory.storyName = 'Chat Bubble Loading State';\nLoadingStateStory.args = {\n  orientation: 'left',\n};\n\n// Data State in ChatBubble\nexport const DataStateStory = (args: ChatBubbleProps) => (\n  <ChatBubble {...args}>\n    <ChatAnchor />\n    <ChatContent>\n      <ChatBody>\n        <SubTitleSmall>Title</SubTitleSmall>\n        <BodyMedium>\n          Generative AI (GenAI) enables systems to generate human-like\n          responses, content, or ideas dynamically, leveraging advanced machine\n          learning models. In conversational applications, GenAI enhances user\n          experiences by enabling intelligent, context-aware, and natural\n          language interactions.\n        </BodyMedium>\n      </ChatBody>\n      <ChatFooterWithIcons />\n    </ChatContent>\n  </ChatBubble>\n);\n\nDataStateStory.storyName = 'Chat Bubble With Data';\nDataStateStory.args = {\n  orientation: 'left',\n};\n\n// EMpty Slot in ChatBubble\nexport const EmptySlotStory = (args: ChatBubbleProps) => (\n  <ChatBubble {...args}>\n    <ChatContent classNames={{wrapper: css.emptyChatContent}}>\n      <ChatBody classNames={{wrapper: css.emptyBodyChat}}>\n        <BodyMedium></BodyMedium>\n      </ChatBody>\n      <ChatFooterWithIcons />\n    </ChatContent>\n  </ChatBubble>\n);\n\nEmptySlotStory.storyName = 'Chat Bubble With Empty Slot';\nEmptySlotStory.args = {\n  orientation: 'left',\n};\n\nexport const WithLongTextSlotStory = (args: ChatBubbleProps) => (\n  <ChatBubble {...args}>\n    <ChatContent>\n      <ChatBody classNames={{wrapper: css.longChatContent}}>\n        <BodyMedium>\n          Generative AI (GenAI) represents a transform leap in the field of\n          artificial intelligence, enabling systems to generate human-like\n          responses, content, or ideas dynamically. This cutting-edge technology\n          leverages advanced machine learning models, including neural networks\n          like GPT (Generative Pre-trained Transformer) and other sophisticated\n          algorithms, to create coherent, contextually appropriate, and natural\n          outputs. The capability of GenAI to mimic human creativity and\n          language is not merely theoretical—it is actively reshaping\n          industries, enhancing user experiences, and revolutionizing the way\n          humans and machines interact. At its core, Generative AI operates by\n          understanding and analyzing massive datasets to learn patterns,\n          structures, and nuances of language or other types of input. Unlike\n          traditional AI systems, which are designed to follow predefined rules\n          or produce outputs based on specific programming, GenAI systems adapt\n          dynamically. They can respond to queries, generate creative content,\n          and simulate human-like understanding without requiring explicit\n          instructions for every scenario. This makes GenAI an invaluable tool\n          in applications ranging from conversational interfaces to content\n          creation, personalized recommendations, and beyond. In conversational\n          applications, Generative AI has emerged as a cornerstone of\n          intelligent, context-aware interactions. Whether it’s powering\n          chatbot, virtual assistants, or customer support agents, GenAI ensures\n          that users experience seamless and natural communication. For example,\n          when users engage with a customer service chatbot, a GenAI system\n          doesn’t simply respond with pre-written scripts. Instead, it\n          understands the user’s query, interprets the context, and crafts\n          responses that feel human and empathetic. This not only improves the\n          efficiency of the interaction but also leaves users feeling heard and\n          understood. The transform impact of GenAI extends far beyond customer\n          service. In education, for instance, GenAI is being used to create\n          adaptive learning environments. These systems can generate\n          personalized lesson plans, answer complex questions, and provide\n          feedback to students in real time, catering to individual learning\n          styles and needs. Similarly, in healthcare, GenAI powers virtual\n          health assistants that can triage symptoms, provide medical\n          information, and even remind patients to take their medications. These\n          applications demonstrate how GenAI is not only enhancing efficiency\n          but also contributing to better outcomes in critical fields.\n        </BodyMedium>\n      </ChatBody>\n      <ChatFooterWithIcons />\n    </ChatContent>\n  </ChatBubble>\n);\n\nWithLongTextSlotStory.storyName = 'Chat Bubble With Long Text';\nWithLongTextSlotStory.args = {\n  orientation: 'left',\n};\n"
        },
        "css": {
          "path": "ChatBubble.module.css",
          "content": "@value (\n  spaceNone,\n  spaceXXSmall,\n  spaceXSmall,\n  spaceSmall\n) from '../../styles/variables/_space.css';\n@value (\n  colorBorderPrimary,\n  colorBackgroundTertiary,\n  colorNeutralLightest,\n  colorFillPrimary,\n  colorInformation\n) from '../../styles/variables/_color.css';\n@value (\n  borderWidthPrimary,\n  borderRadiusSmall,\n  borderRadiusCircle\n) from '../../styles/variables/_border.css';\n@value (\n  size2,\n  size12,\n  size24,\n  size34,\n  size42,\n  size580\n) from '../../styles/variables/_size.css';\n@value (\n  opacity100,\n  opacity60,\n  opacity80\n) from '../../styles/variables/_opacity.css';\n\n.chatBubbleWrapper {\n  display: flex;\n  gap: spaceSmall;\n  flex-direction: row;\n}\n\n.chatBubbleWrapperRight {\n  flex-direction: row-reverse;\n}\n\n.chatAnchorWrapper {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  height: size42;\n  width: size42;\n}\n\n.chatContentWrapper {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  gap: spaceXSmall;\n  border-radius: borderRadiusSmall;\n  max-width: size580;\n  min-height: size42;\n}\n\n.chatBodyWrapper {\n  padding-top: spaceSmall;\n  border-radius: borderRadiusSmall;\n}\n\n.chatBodyWrapperLoading {\n  padding-top: spaceNone;\n}\n\n.chatBodyWrapperBgColor {\n  background-color: colorNeutralLightest;\n  padding: spaceSmall;\n  word-wrap: break-word;\n}\n\n.chatFooterWrapper {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: spaceXSmall;\n}\n\n.loadingContainer {\n  display: flex;\n  align-items: flex-start;\n  padding-top: spaceNone;\n}\n\n.loadingText {\n  composes: buttonTextMedium from '../../styles/typography.module.css';\n  display: inline-flex;\n  background: linear-gradient(90deg, colorFillPrimary, colorInformation);\n  -webkit-background-clip: text;\n  -webkit-text-fill-color: transparent;\n  background-clip: text;\n}\n\n.loader {\n  position: relative;\n  display: inline-flex;\n  justify-content: center;\n  align-items: center;\n  gap: size2; /* Small gap between dots */\n  width: size24;\n}\n\n.dot {\n  width: calc(size12/4);\n  height: calc(size12/4);\n  background: linear-gradient(90deg, colorFillPrimary, colorInformation);\n  border-radius: borderRadiusCircle;\n  opacity: opacity80;\n\n  /* Bounce Animation */\n  animation: bounce 0.5s infinite ease-in-out alternate;\n}\n\n.dot:nth-child(1) {\n  animation-delay: 0s;\n}\n\n.dot:nth-child(2) {\n  animation-delay: 0.1s; /* Slight delay for second dot */\n}\n\n.dot:nth-child(3) {\n  animation-delay: 0.2s; /* Slight delay for third dot */\n}\n\n@keyframes bounce {\n  0% {\n    transform: translateY(0);\n    opacity: opacity60;\n  }\n  100% {\n    transform: translateY(size12); /* Higher bounce */\n    opacity: opacity100;\n  }\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/ChatBubble/ChatBubble';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "ChatAnchor.stories.tsx",
        "ChatBubble.module.css",
        "ChatBubble.stories.module.css",
        "ChatBubble.stories.tsx",
        "ChatBubble.tsx",
        "index.ts"
      ]
    },
    "Checkbox": {
      "name": "Checkbox",
      "path": "src/components/Checkbox",
      "files": {
        "main": {
          "path": "Checkbox.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { GroupAlign } from '../../types/common';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    checkboxSquare?: string;\n    label?: string;\n}>;\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'name' | 'value' | 'children' | 'checked' | 'indeterminate' | 'focused' | 'disabled' | 'error' | 'onChange' | 'align' | 'classNames' | 'tabIndex' | 'ariaLabel'> {\n    name?: string;\n    value?: string;\n    children?: React.ReactNode;\n    checked?: boolean;\n    indeterminate?: boolean;\n    focused?: boolean;\n    disabled?: boolean;\n    error?: boolean;\n    onChange?: (arg1: {\n        value: string;\n        checked: boolean;\n    }, arg2?: React.SyntheticEvent<HTMLElement> | null | undefined) => unknown;\n    align?: GroupAlign;\n    classNames?: ClassNames;\n    tabIndex?: number;\n    ariaLabel?: string;\n    testId?: string;\n}\nexport declare const Checkbox: Flow.AbstractComponent<CheckboxProps, HTMLInputElement>;\nexport {};\n//# sourceMappingURL=Checkbox.d.ts.map"
        },
        "story": {
          "path": "Checkbox.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {CheckboxProps} from 'src/components/Checkbox/Checkbox';\nimport {Checkbox} from 'src/components/Checkbox/Checkbox';\n\nimport css from 'src/components/Checkbox/Checkbox.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Form Components/Checkbox',\n  component: Checkbox,\n  argTypes: {\n    name: {\n      description: 'Specify the name of the underlying `input` node',\n    },\n    value: {\n      description:\n        'The value to be used in the checkbox input. This is the value that will be returned on form submission',\n      name: 'value',\n      table: {\n        type: {summary: 'string'},\n      },\n      control: {\n        disable: true,\n      },\n    },\n    // controlled checked prop\n    checked: {\n      description: 'Checked state of native checkbox',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    tabIndex: {\n      description: 'Tab index applied to input',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 0},\n      },\n    },\n    indeterminate: {\n      name: 'indeterminate',\n      description:\n        'Setting indeterminate state takes visual precedence over checked props given but does not affect checked state',\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    disabled: {\n      name: 'disabled',\n      description: `Disabled checkbox. When true, User can not interact with the the checkbox. But, you can pass checked as true or false\n        to show it as checked or unchecked`,\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    focused: {\n      name: 'focused',\n      description: `When passed true the checkbox will be focused to start with.`,\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    error: {\n      name: 'error',\n      description:\n        'Error state, when you need to show individual Checkbox in error state then use this prop.',\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    classNames: {\n      description: 'External classNames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary:\n            '{wrapper?: string, checkboxSquare?: string, label?: string}',\n        },\n      },\n    },\n    children: {\n      description: 'Pass label as children',\n      table: {\n        type: {summary: 'React.Component | string'},\n      },\n    },\n    onChange: {\n      description:\n        '**onChange** handler that is applied to the input type=checkbox element',\n      action: 'selected',\n      type: {\n        summary:\n          '({value: string, checked: boolean}, ?SyntheticEvent<HTMLElement>) => mixed',\n      },\n    },\n    align: {\n      description: 'To be used internally for Checkbox Group,',\n    },\n    ariaLabel: {\n      description:\n        'Pass label as ariaLabel. It is mandatory parameter for accessibility in case children is not a simple string.',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Checkbox component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Checkbox } from \"@spaced-out/ui-design-system/lib/components/Checkbox\";\n\\`\\`\\`\nCheckbox component is used in forms when a user needs to select multiple values from several options.<br>\nCheckbox component has been implemented using <code>< input type=\"checkbox\" >  <input type=\"checkbox\" > </code>\nIt is a controlled component, meaning that, you need to pass the value of checked as true/false to show it as checked or unchecked.\nYou will pass a callback function in onChange prop, if checkbox is clicked this function will be called and you will receive a object\n{value, checked} the value will be same as the value passed to the value prop of checkbox and the boolean checked will give you new\nchecked state of the checkbox.\n\nIn most of the use cases you will use Checkbox with CheckboxGroup.\nRefer the <a href=\"../?path=/docs/form-components-checkbox-group--docs\">CheckboxGroup</a> documentation for details.\n          `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Checkbox/Checkbox',\n    },\n  },\n};\n\nexport const CheckboxStory = (args: CheckboxProps) => {\n  const [selected, setSelected] = React.useState(args.checked);\n  const onChangeHandler = (\n    {value, checked}: {value: string; checked: boolean},\n    event: React.SyntheticEvent<HTMLElement> | null | undefined,\n  ): void => {\n    args.onChange?.({value, checked}, event);\n\n    setSelected(checked);\n  };\n  return (\n    <div className={css.storyContainer}>\n      <Checkbox {...args} onChange={onChangeHandler} checked={selected} />\n    </div>\n  );\n};\n\nCheckboxStory.args = {\n  name: 'sample-checkbox',\n  disabled: false,\n  focused: false,\n  children: 'The Checkbox Label',\n  checked: false,\n  error: false,\n  indeterminate: false,\n  value: 'sample-value',\n  testId: 'checkbox-story',\n};\nCheckboxStory.storyName = 'Checkbox';\n"
        },
        "css": {
          "path": "Checkbox.module.css",
          "content": "@value (\n  borderWidthNone,\n  borderWidthTertiary,\n  borderRadiusXSmall\n) from '../../styles/variables/_border.css';\n\n@value (\n  colorBorderSecondary,\n  colorFillPrimary,\n  colorFillDisabled,\n  colorBorderDanger,\n  colorDanger,\n  colorFocusPrimary,\n  colorFocusDanger,\n  colorBackgroundTertiary,\n  colorTextDisabled\n) from '../../styles/variables/_color.css';\n\n@value (\n  size18,\n  size20,\n  size24,\n  size110,\n  size160,\n  size240,\n  size500,\n  sizeFluid\n) from '../../styles/variables/_size.css';\n\n@value (\n  spaceNone,\n  spaceSmall,\n  spaceMedium,\n  spaceXSmall\n) from '../../styles/variables/_space.css';\n\n.checkboxContainer {\n  color: colorFillPrimary;\n  position: relative;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: spaceSmall;\n  cursor: pointer;\n}\n\n.checkboxContainer .disabled {\n  cursor: not-allowed;\n}\n\n.horizontalCheckbox {\n  flex: 1 0 size160; /*  grow, don't shrink, start with size160 width */\n}\n\n.fluidCheckbox {\n  flex: 0 0 auto; /* don't grow, don't shrink, auto width */\n}\n\n.checkboxSquare {\n  width: size24;\n  height: size24;\n  min-width: size24;\n  min-height: size24;\n  box-sizing: border-box;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  cursor: pointer;\n}\n\n.checkboxSquare .disabled {\n  cursor: not-allowed;\n  border: borderWidthTertiary solid colorFillDisabled;\n}\n\n.inputCheckbox {\n  position: absolute;\n  width: size24;\n  height: size24;\n  cursor: pointer;\n  opacity: 0;\n}\n\n.checkboxSquareInner {\n  box-sizing: border-box;\n  height: size18;\n  width: size18;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border-radius: borderRadiusXSmall;\n  background-color: colorBackgroundTertiary;\n}\n\n.enabled {\n  border: borderWidthTertiary solid colorBorderSecondary;\n  cursor: pointer;\n}\n\ninput[type='checkbox']:focus + .enabled {\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n\ninput[type='checkbox']:checked + .enabled {\n  border: borderWidthNone;\n  background: colorFillPrimary;\n}\n\ninput[type='checkbox']:checked:focus + .enabled {\n  border: borderWidthNone;\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n\ninput[type='checkbox']:indeterminate + .enabled {\n  border: borderWidthNone;\n  background: colorFillPrimary;\n}\n\ninput[type='checkbox']:indeterminate:focus + .enabled {\n  border: borderWidthNone;\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n\n.inputCheckbox:disabled {\n  cursor: not-allowed;\n  pointer-events: none;\n}\n\n.disabled {\n  pointer-events: none;\n  cursor: not-allowed;\n}\n\ninput[type='checkbox']:checked + .disabled {\n  border: borderWidthNone;\n  background: colorFillDisabled;\n}\n\ninput[type='checkbox']:indeterminate + .disabled {\n  border: borderWidthNone;\n  background: colorFillDisabled;\n}\n\n.error {\n  border: borderWidthTertiary solid colorBorderDanger;\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusDanger;\n}\n\ninput[type='checkbox']:indeterminate + .error {\n  border: borderWidthNone;\n  background: colorDanger;\n}\n\ninput[type='checkbox']:checked + .error {\n  border: borderWidthNone;\n  background: colorDanger;\n}\n\n.checkboxLabel {\n  composes: formLabelMedium from '../../styles/typography.module.css';\n  composes: secondary from '../../styles/typography.module.css';\n}\n\n.labelDisabled {\n  color: colorTextDisabled;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Checkbox/Checkbox';\nexport * from '../../components/Checkbox/CheckboxGroup';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "CheckboxGroup.d.ts": {
            "path": "CheckboxGroup.d.ts",
            "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { GroupAlign } from '../../types/common';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    checkboxGroup?: string;\n    errorText?: string;\n}>;\nexport type CheckboxOptions = Array<{\n    label: React.ReactNode;\n    value: string;\n}>;\nexport interface CheckboxGroupProps {\n    align?: GroupAlign;\n    disabled?: boolean;\n    name: string;\n    value?: Array<string>;\n    onChange?: (value: Array<string>) => unknown;\n    classNames?: ClassNames;\n    error?: boolean;\n    errorText?: string;\n    children?: React.ReactNode;\n    testId?: string;\n}\nexport declare const CheckboxGroup: Flow.AbstractComponent<CheckboxGroupProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=CheckboxGroup.d.ts.map"
          }
        }
      },
      "allFiles": [
        "Checkbox.module.css",
        "Checkbox.stories.module.css",
        "Checkbox.stories.tsx",
        "Checkbox.tsx",
        "CheckboxGroup.module.css",
        "CheckboxGroup.stories.module.css",
        "CheckboxGroup.stories.tsx",
        "CheckboxGroup.tsx",
        "index.ts"
      ]
    },
    "Checklist": {
      "name": "Checklist",
      "path": "src/components/Checklist",
      "files": {
        "main": {
          "path": "Checklist.d.ts",
          "content": "import * as React from 'react';\nimport type { ColorTypes } from '../../types/typography';\nimport type { IconSize, IconType } from '../../components/Icon';\ntype ClassNames = Readonly<{\n    header?: string;\n    footer?: string;\n    wrapper?: string;\n    content?: string;\n    listItemContainer?: string;\n    cardContentContainer?: string;\n}>;\nexport interface ChecklistItem {\n    label: React.ReactNode;\n    key: string;\n    iconLeftName?: string;\n    iconLeftType?: IconType;\n    iconLeftColor?: ColorTypes;\n    iconLeftSize?: IconSize;\n    disabled?: boolean;\n    rightSlot?: React.ReactNode;\n    onExpand?: (item: ChecklistItem) => void;\n}\nexport interface ChecklistBaseProps {\n    classNames?: ClassNames;\n    isOpen?: boolean;\n    testId?: string;\n    title: React.ReactNode;\n    rightSlot?: React.ReactNode;\n    footer?: React.ReactNode;\n    hideChecklistItemExpandButton?: boolean;\n}\ninterface ChecklistWithChildren extends ChecklistBaseProps {\n    children: React.ReactNode;\n    listItems?: never;\n}\ninterface ChecklistWithListItems extends ChecklistBaseProps {\n    listItems: Array<ChecklistItem>;\n    children?: never;\n}\nexport type ChecklistProps = ChecklistWithChildren | ChecklistWithListItems;\nexport interface ChecklistProgressBarProps {\n    classNames?: {\n        wrapper?: string;\n        container?: string;\n        bar?: string;\n    };\n    totalItems: number;\n    completedItems: number;\n    showLoadingBar?: boolean;\n}\nexport declare const ChecklistProgressBar: React.ForwardRefExoticComponent<ChecklistProgressBarProps & React.RefAttributes<HTMLDivElement>>;\nexport declare const Checklist: React.ForwardRefExoticComponent<ChecklistProps & React.RefAttributes<HTMLDivElement>>;\nexport {};\n//# sourceMappingURL=Checklist.d.ts.map"
        },
        "story": {
          "path": "Checklist.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {Button} from 'src/components/Button';\nimport type {\n  ChecklistItem,\n  ChecklistProps,\n} from 'src/components/Checklist/Checklist';\nimport {\n  Checklist,\n  ChecklistProgressBar,\n} from 'src/components/Checklist/Checklist';\nimport {Link} from 'src/components/Link';\nimport {BodySmall, SubTitleSmall} from 'src/components/Text';\n\nimport css from 'src/components/Checklist/Checklist.stories.module.css';\n\n\nconst meta = {\n  tags: ['autodocs'],\n  title: 'AI Prompt Components/Checklist',\n  component: Checklist,\n  argTypes: {\n    classNames: {\n      description:\n        'Provide an optional className to be applied to the wrapper and content',\n      control: {type: 'object'},\n      table: {\n        type: {\n          summary:\n            '{ header?: string, footer?: string, wrapper?: string, content?: string, listItemContainer?: string, cardContentContainer?: string }',\n        },\n      },\n    },\n    listItems: {\n      description:\n        'The list of items to be displayed in the checklist. ChecklistItem can have label, key, iconLeftName, iconLeftType, iconLeftColor, iconLeftSize, disabled, rightSlot, onExpand properties.',\n      control: {type: 'object'},\n      table: {\n        type: {summary: 'Array<ChecklistItem>'},\n      },\n    },\n    isOpen: {\n      description: 'Whether the checklist is open or closed',\n      control: {type: 'boolean'},\n      table: {\n        type: {summary: 'boolean'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {type: 'text'},\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    title: {\n      description: 'The title of the checklist',\n      control: {type: 'text'},\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    rightSlot: {\n      description: 'The right slot of the checklist header.',\n      control: {type: 'object'},\n      table: {\n        type: {summary: 'React.ReactNode'},\n      },\n    },\n    children: {\n      description: 'Renders children in place of list items.',\n      control: {type: 'object'},\n      table: {\n        type: {summary: 'React.ReactNode'},\n      },\n    },\n    footer: {\n      description:\n        'The footer of the checklist card content. It is displayed at the bottom of the checklist card.',\n      control: {type: 'object'},\n      table: {\n        type: {summary: 'React.ReactNode'},\n      },\n    },\n    hideChecklistItemExpandButton: {\n      description:\n        'If **true**, the expand button will not be displayed in any checklist item.',\n      control: {type: 'boolean'},\n      table: {\n        type: {summary: 'boolean'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Checklist component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Checklist, ChecklistProgressBar } from \"@spaced-out/ui-design-system/lib/components/Checklist\";\n\\`\\`\\`\nSome description about the component in MDX format. Don't change the indentation of this block.\nIt should start from extreme left.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Checklist/Checklist.tsx',\n    },\n  },\n};\n\nexport default meta;\n\nconst listItems = [\n  {\n    label: 'Data Collection',\n    key: 'dataCollection',\n  },\n  {\n    label: 'Scheduling',\n    key: 'scheduling',\n  },\n  {\n    label: 'Add a dynamic trigger',\n    key: 'addDynamicTrigger',\n  },\n  {\n    label: 'Add a new module',\n    key: 'addNewModule',\n  },\n  {\n    label: 'Add a new channel',\n    key: 'addNewChannel',\n  },\n  {\n    label: 'Channel configuration',\n    key: 'channelConfiguration',\n  },\n  {\n    label: 'Module configuration',\n    key: 'moduleConfiguration',\n  },\n  {\n    label: 'Module member configuration',\n    key: 'moduleMemberConfiguration',\n  },\n  {\n    label: 'Module execution',\n    key: 'moduleExecution',\n  },\n];\n\nconst checklistTitle = 'Module and Channel Configuration';\n\nexport const ChecklistStory = (args: ChecklistProps) => (\n  <div className={css.container}>\n    <Checklist {...args} />\n  </div>\n);\n\nChecklistStory.args = {\n  title: checklistTitle,\n  rightSlot: (\n    <ChecklistProgressBar totalItems={listItems.length} completedItems={0} />\n  ),\n  footer: (\n    <div className={css.footerContainer}>\n      <Button size=\"small\" type=\"tertiary\" isFluid>\n        Ignore All ({listItems.length})\n      </Button>\n      <Button size=\"small\" isFluid>\n        View All ({listItems.length})\n      </Button>\n    </div>\n  ),\n  listItems: listItems.map((item) => ({\n    ...item,\n    iconLeftName: 'warning',\n    iconLeftType: 'solid',\n  })) as ChecklistItem[],\n};\n\nChecklistStory.storyName = 'Checklist';\n\nexport const ChecklistInProgress = ({\n  children: _children,\n  ...args\n}: ChecklistProps) => {\n  const [completedItems, setCompletedItems] = React.useState(0);\n  const totalItems = 9;\n  const [listItemsLocal, setListItemsLocal] = React.useState(listItems);\n\n  React.useEffect(() => {\n    const interval = setInterval(() => {\n      if (completedItems >= totalItems) {\n        clearInterval(interval);\n        return;\n      }\n      setCompletedItems((prev) => prev + 1);\n      setListItemsLocal(\n        listItemsLocal.map((item, idx) => ({\n          ...item,\n          iconLeftName: idx <= completedItems ? 'check-circle' : 'spinner',\n          iconLeftType: 'solid',\n          iconLeftColor: idx <= completedItems ? 'success' : 'tertiary',\n        })),\n      );\n    }, 1000);\n    return () => clearInterval(interval);\n  }, [completedItems]);\n\n  return (\n    <div className={css.container}>\n      <Checklist\n        {...args}\n        isOpen\n        listItems={listItemsLocal}\n        rightSlot={\n          <ChecklistProgressBar\n            totalItems={listItems.length}\n            completedItems={completedItems}\n            showLoadingBar\n          />\n        }\n      />\n    </div>\n  );\n};\n\nChecklistInProgress.args = {\n  title: checklistTitle,\n  footer: (\n    <div className={css.footerContainer}>\n      <Button size=\"small\" type=\"tertiary\" isFluid>\n        Ignore All ({listItems.length})\n      </Button>\n      <Button size=\"small\" isFluid>\n        View All ({listItems.length})\n      </Button>\n    </div>\n  ),\n};\n\nChecklistInProgress.storyName = 'Checklist In Progress';\n\nexport const ChecklistWithItemRightSlot = (args: ChecklistProps) => (\n  <div className={css.container}>\n    <Checklist {...args} />\n  </div>\n);\n\nChecklistWithItemRightSlot.args = {\n  title: checklistTitle,\n  listItems: listItems.map((item) => ({\n    ...item,\n    iconLeftName: 'warning',\n    iconLeftType: 'solid',\n    rightSlot: (\n      <Link as=\"bodyMedium\" underline color=\"primary\">\n        Recheck\n      </Link>\n    ),\n  })) as ChecklistItem[],\n  footer: (\n    <div className={css.footerContainer}>\n      <Button size=\"small\" type=\"tertiary\" isFluid>\n        Ignore All ({listItems.length})\n      </Button>\n      <Button size=\"small\" isFluid>\n        View All ({listItems.length})\n      </Button>\n    </div>\n  ),\n};\n\nChecklistWithItemRightSlot.storyName = 'Checklist With Item Right Slot';\n\nexport const ChecklistWithCustomContent = (args: ChecklistProps) => (\n  <div className={css.container}>\n    <Checklist {...args} />\n  </div>\n);\n\nChecklistWithCustomContent.args = {\n  title: checklistTitle,\n  children: (\n    <div>\n      <SubTitleSmall>Multiple Actions</SubTitleSmall>\n      <BodySmall>\n        This card accordion demonstrates a footer with multiple action buttons.\n        This pattern is useful when you need to provide several action options\n        to the user.\n      </BodySmall>\n    </div>\n  ),\n  footer: (\n    <div className={css.footerContainer}>\n      <Button size=\"small\" type=\"tertiary\" isFluid>\n        Ignore All ({listItems.length})\n      </Button>\n      <Button size=\"small\" isFluid>\n        View All ({listItems.length})\n      </Button>\n    </div>\n  ),\n};\n\nChecklistWithCustomContent.storyName = 'Checklist With Custom Content';\n"
        },
        "css": {
          "path": "Checklist.module.css",
          "content": "@value (\n  colorBorderPrimary,\n  colorBackgroundPrimary,\n  colorBackgroundTertiary,\n  colorBackgroundSecondary,\n  colorFillPrimary\n) from '../../styles/variables/_color.css';\n@value (\n  sizeFluid,\n  size68,\n  size34,\n  size42,\n  size8,\n  size400,\n  size20,\n  size100,\n  size200\n) from '../../styles/variables/_size.css';\n@value (\n  spaceSmall,\n  spaceXSmall\n) from '../../styles/variables/_space.css';\n@value (\n  elevationCard,\n  elevationMenu\n) from '../../styles/variables/_elevation.css';\n@value (\n  borderWidthPrimary,\n  borderRadiusSmall,\n  borderRadiusNone\n) from '../../styles/variables/_border.css';\n\n.wrapper {\n  display: flex;\n  flex-flow: column;\n  width: sizeFluid;\n  position: relative;\n}\n\n.header {\n  composes: subTitleSmall from '../../styles/typography.module.css';\n  composes: borderPrimary from '../../styles/border.module.css';\n  min-height: size42;\n  border-radius: borderRadiusSmall;\n  display: flex;\n  cursor: pointer;\n  align-items: flex-start;\n  width: sizeFluid;\n  justify-content: space-between;\n  gap: spaceSmall;\n  padding: spaceSmall;\n  background-color: colorBackgroundTertiary;\n  z-index: elevationCard;\n}\n\n.header.isOpen {\n  min-height: size68;\n  background-color: colorBackgroundPrimary;\n}\n\n.headerContent {\n  display: flex;\n  gap: spaceXSmall;\n  align-items: center;\n  justify-content: space-between;\n  width: sizeFluid;\n}\n\n.content {\n  display: flex;\n  flex-flow: column;\n  background-color: colorBackgroundPrimary;\n  position: relative;\n  margin-top: calc(-1 * size20);\n  border-radius: borderRadiusSmall;\n  width: sizeFluid;\n}\n\n.cardWrapper {\n  z-index: elevationMenu;\n}\n\n.contentContainer {\n  display: flex;\n  padding: spaceSmall;\n}\n\n.actionContainer {\n  display: flex;\n  border-top: borderWidthPrimary solid colorBorderPrimary;\n  border-radius: borderRadiusNone borderRadiusNone borderRadiusSmall\n    borderRadiusSmall;\n  background-color: colorBackgroundTertiary;\n  padding: spaceSmall;\n  gap: spaceXSmall;\n}\n\n.titleContainer {\n  display: flex;\n  gap: spaceXSmall;\n  align-items: center;\n}\n\n.cardContentContainer {\n  display: flex;\n  flex-flow: column;\n  gap: spaceXSmall;\n  padding: spaceSmall;\n  width: sizeFluid;\n  justify-content: space-between;\n  max-height: size400;\n  overflow-y: auto;\n}\n\n.checklistItemContainer {\n  display: flex;\n  gap: spaceXSmall;\n  align-items: center;\n  width: sizeFluid;\n  background-color: colorBackgroundTertiary;\n  height: size34;\n  border-radius: borderRadiusSmall;\n  padding: spaceXSmall;\n  cursor: pointer;\n}\n\n.checklistItemContainer:hover {\n  background-color: colorBackgroundSecondary;\n}\n\n.checklistItemLeft {\n  display: flex;\n  gap: spaceXSmall;\n  align-items: center;\n  width: sizeFluid;\n}\n\n.checklistItemRight {\n  display: flex;\n  gap: spaceXSmall;\n  align-items: center;\n}\n\n.progressLinear {\n  min-width: size100;\n  max-width: size200;\n  background-color: colorBorderPrimary;\n  border-radius: borderRadiusSmall;\n  height: size8;\n  box-sizing: content-box;\n}\n\n.progressLinearBar {\n  height: size8;\n  background-color: colorFillPrimary;\n  border-radius: borderRadiusSmall;\n}\n\n.checklistProgressBar {\n  display: flex;\n  gap: spaceXSmall;\n  align-items: center;\n  min-width: max-content;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Checklist/Checklist';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "Checklist.module.css",
        "Checklist.stories.module.css",
        "Checklist.stories.tsx",
        "Checklist.tsx",
        "index.ts"
      ]
    },
    "Chip": {
      "name": "Chip",
      "path": "src/components/Chip",
      "files": {
        "main": {
          "path": "Chip.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { IconType } from '../../components/Icon';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    icon?: string;\n    statusIndicator?: string;\n}>;\nexport declare const CHIP_SEMANTIC: Readonly<{\n    primary: \"primary\";\n    information: \"information\";\n    success: \"success\";\n    warning: \"warning\";\n    danger: \"danger\";\n    secondary: \"secondary\";\n}>;\nexport type ChipSemanticType = (typeof CHIP_SEMANTIC)[keyof typeof CHIP_SEMANTIC];\nexport interface BaseChipProps {\n    classNames?: ClassNames;\n    semantic?: ChipSemanticType;\n    children: React.ReactNode;\n    disabled?: boolean;\n    showStatusIndicator?: boolean;\n    disableHoverState?: boolean;\n    line?: number;\n    wordBreak?: string;\n    onClick?: ((arg1: React.SyntheticEvent<HTMLElement>) => unknown) | null | undefined;\n    onMouseEnter?: React.MouseEventHandler<HTMLDivElement>;\n    onMouseLeave?: React.MouseEventHandler<HTMLDivElement>;\n    testId?: string;\n}\nexport interface LargeChipProps extends Omit<BaseChipProps, 'iconName' | 'iconType' | 'dismissable' | 'onDismiss' | 'size'> {\n    iconName?: string;\n    iconType?: IconType;\n    dismissable?: boolean;\n    onDismiss?: ((arg1: React.SyntheticEvent<HTMLElement>) => unknown) | null | undefined;\n    size?: 'large';\n}\nexport interface MediumChipProps extends Omit<LargeChipProps, 'size'> {\n    size?: 'medium';\n}\nexport interface SmallChipProps extends Omit<BaseChipProps, 'size'> {\n    size?: 'small';\n}\nexport type ChipProps = LargeChipProps | MediumChipProps | SmallChipProps;\nexport declare const Chip: Flow.AbstractComponent<ChipProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=Chip.d.ts.map"
        },
        "story": {
          "path": "Chip.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {ChipProps} from 'src/components/Chip/Chip';\nimport {Chip, CHIP_SEMANTIC} from 'src/components/Chip/Chip';\nimport {BasicDialog} from 'src/components/Dialog';\n\nimport css from 'src/components/Chip/Chip.stories.module.css';\n\n\nconst semanticOptions: Array<unknown> = [...Object.values(CHIP_SEMANTIC)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Chip',\n  argTypes: {\n    wordBreak: {\n      description: 'word-break style to be applied on truncate',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'break-all'},\n      },\n    },\n    line: {\n      description:\n        'Number of lines to show, and lines after that will be truncated',\n      control: {\n        type: 'number',\n        min: 1,\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: 1},\n      },\n    },\n    size: {\n      description:\n        'Chip supports only three size variants namely small, medium and large. `small` < `medium` < `large`. `Small` variation does not have support for icons(both **custom icon** and **close icon**)',\n      control: 'radio',\n      options: ['large', 'medium', 'small'],\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    semantic: {\n      options: semanticOptions,\n      description:\n        'Semantic type of a Chip. It will have different background color for different semantic type',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: CHIP_SEMANTIC.primary},\n      },\n    },\n    showStatusIndicator: {\n      description:\n        'If **true**, the component would show a status indicator **only for medium sized chip**',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    disableHoverState: {\n      description:\n        'If **true**, the component would disable any hover states if present',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    onClick: {\n      description:\n        '**onClick** handler that is called when a chip is **clicked**',\n      action: 'clicked',\n      table: {\n        type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n      },\n    },\n    onDismiss: {\n      description:\n        '**onDismiss** handler that is applied to close icon of chip. This is only attached for **Medium** sized `Chip`',\n      action: 'onDismiss',\n      table: {\n        type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n      },\n    },\n    onMouseEnter: {\n      description: '**onMouseEnter** handler that is called on hover in',\n      action: 'onMouseEnter',\n      table: {\n        type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n      },\n    },\n    onMouseLeave: {\n      description: '**onMouseLeave** handler that is called on hover out',\n      action: 'onMouseLeave',\n      table: {\n        type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n      },\n    },\n    dismissable: {\n      description:\n        'Close Icon will appear in right side in case it is true. This is only supported for **Medium** sized `Chip`',\n      name: 'dismissable',\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    iconName: {\n      description:\n        'Custom icon to be displayed in the chip. This is only attached for **Medium** sized `Chip`',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    iconType: {\n      description:\n        'Type of Icon for Chip. This is only supported for **Medium** sized `Chip`. Type represents 4 unique icon styles :- Solid, Regular, Duotone and Brands',\n      options: ['regular', 'solid', 'duotone', 'brands'],\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'regular'},\n      },\n    },\n    children: {\n      description: 'Content of the chip',\n      type: {required: true},\n      table: {\n        type: {summary: 'React.Node | string'},\n      },\n    },\n    disabled: {\n      description: 'If **true**, the component is disabled',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    classNames: {\n      description:\n        'Provide an optional classNames to be applied to the wrapper, icon and statusIndicator',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary:\n            '{wrapper?: string, icon?: string, statusIndicator?: string}',\n        },\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Chip component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Chip } from \"@spaced-out/ui-design-system/lib/components/Chip\";\n\\`\\`\\`\n\\`Chip\\` is a singular **compact element** that represent an input, attribute, or action. They can be stacked in multiples according\nto needs. Chip supports multiple semantics and a practical use case would use multiple chips together. \\`Chip\\` grows with the content it encapsulates.\n\nThere is also a **dismissable** variation which provides a callback on click of the Close Icon\n\n**dismissable** and **icon** variations are only available for **large** & **medium** sized chip. Chip content truncates itself on size crunch.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Chip/Chip',\n    },\n  },\n};\n\nexport const ClickableStory = (args: ChipProps) => {\n  const [showDialog, setShowDialog] = React.useState(false);\n\n  return (\n    <div className={css.container}>\n      <Chip {...args} onClick={() => setShowDialog(true)}></Chip>\n      <BasicDialog\n        semantic=\"information\"\n        isOpen={showDialog}\n        heading=\"This is a Clickable Chip\"\n        body=\"Normal Chips without onClick would not have any hover state\"\n        confirmText=\"Got it!\"\n        handleConfirm={() => setShowDialog(false)}\n        initialFocus={0}\n      ></BasicDialog>\n    </div>\n  );\n};\n\nClickableStory.args = {\n  children: 'Clickable Chip',\n  testId: 'chip-clickable-story',\n};\n\nexport const MultilineStory = (args: ChipProps) => {\n  const [showDialog, setShowDialog] = React.useState(false);\n\n  return (\n    <div className={css.container}>\n      <Chip {...args} onClick={() => setShowDialog(true)}></Chip>\n      <BasicDialog\n        semantic=\"information\"\n        isOpen={showDialog}\n        heading=\"This is a Multiline Chip\"\n        body=\"Normal Chips without onClick would not have any hover state\"\n        confirmText=\"Got it!\"\n        handleConfirm={() => setShowDialog(false)}\n        initialFocus={0}\n      ></BasicDialog>\n    </div>\n  );\n};\n\nMultilineStory.args = {\n  children: `Genesis is the foundational design system at Sense. It serves as the\n              single source of truth for our product UI crafted to ensure visual\n              consistency. Genesis is the foundational design system at Sense. It serves as the\n              single source of truth for our product UI crafted to ensure visual\n              consistency.`,\n  iconName: 'citrus',\n  line: 2,\n  testId: 'chip-multiline-story',\n};\n\nexport const WithTextStory = () => (\n  <div className={css.container}>\n    <div className={css.chipContainer}>\n      <Chip semantic=\"primary\" testId=\"chip-primary-story\">\n        Primary Chip\n      </Chip>\n      <Chip semantic=\"information\" testId=\"chip-information-story\">\n        Information Chip\n      </Chip>\n      <Chip semantic=\"secondary\" testId=\"chip-secondary-story\">\n        Secondary Chip\n      </Chip>\n    </div>\n  </div>\n);\n\nWithTextStory.args = {\n  children: 'Clickable Chip',\n  testId: 'chip-with-text-story',\n};\n\nexport const WithStatusIndicatorStory = () => (\n  <div className={css.container}>\n    <div className={css.container}>\n      <div className={css.chipContainer}>\n        <Chip\n          semantic=\"primary\"\n          showStatusIndicator\n          testId=\"chip-primary-status-story\"\n        >\n          Primary Chip\n        </Chip>\n        <Chip\n          semantic=\"information\"\n          showStatusIndicator\n          testId=\"chip-information-status-story\"\n        >\n          Information Chip\n        </Chip>\n        <Chip\n          semantic=\"secondary\"\n          showStatusIndicator\n          testId=\"chip-secondary-status-story\"\n        >\n          Secondary Chip\n        </Chip>\n      </div>\n    </div>\n  </div>\n);\n\nexport const WithIconStory = () => (\n  <div className={css.container}>\n    <div className={css.chipContainer}>\n      <Chip\n        iconName=\"citrus\"\n        semantic=\"primary\"\n        testId=\"chip-primary-icon-story\"\n      >\n        Primary Chip\n      </Chip>\n      <Chip\n        iconName=\"grapes\"\n        semantic=\"information\"\n        testId=\"chip-information-icon-story\"\n      >\n        Information Chip\n      </Chip>\n      <Chip\n        iconName=\"avocado\"\n        semantic=\"secondary\"\n        testId=\"chip-secondary-icon-story\"\n      >\n        Secondary Chip\n      </Chip>\n    </div>\n  </div>\n);\n\nexport const DismissableStory = () => {\n  const [showDialog, setShowDialog] = React.useState(false);\n\n  return (\n    <div className={css.container}>\n      <div className={css.container}>\n        <div className={css.chipContainer}>\n          <Chip\n            iconName=\"citrus\"\n            semantic=\"primary\"\n            dismissable\n            onDismiss={() => setShowDialog(true)}\n            testId=\"chip-primary-dismissable-story\"\n          >\n            Primary Chip\n          </Chip>\n\n          <Chip\n            iconName=\"grapes\"\n            semantic=\"information\"\n            dismissable\n            onDismiss={() => setShowDialog(true)}\n            testId=\"chip-information-dismissable-story\"\n          >\n            Information Chip\n          </Chip>\n\n          <Chip\n            iconName=\"avocado\"\n            semantic=\"secondary\"\n            dismissable\n            onDismiss={() => setShowDialog(true)}\n            testId=\"chip-secondary-dismissable-story\"\n          >\n            Secondary Chip\n          </Chip>\n        </div>\n        <BasicDialog\n          semantic=\"information\"\n          isOpen={showDialog}\n          heading=\"I am dismissed\"\n          body=\"Hello world!, I have been dismissed\"\n          confirmText=\"Got it!\"\n          handleConfirm={() => setShowDialog(false)}\n          initialFocus={0}\n        ></BasicDialog>\n      </div>\n    </div>\n  );\n};\nClickableStory.storyName = 'Clickable';\nMultilineStory.storyName = 'Multiline';\nWithTextStory.storyName = 'With Text';\nWithStatusIndicatorStory.storyName = 'With Status Indicator';\nWithIconStory.storyName = 'With Icon';\nDismissableStory.storyName = 'Dismissable';\n"
        },
        "css": {
          "path": "Chip.module.css",
          "content": "@value (\n  colorNeutralLightest,\n  colorNeutralLight,\n  colorInformationLightest,\n  colorInformationLight,\n  colorSuccessLightest,\n  colorSuccessLight,\n  colorWarningLightest,\n  colorWarningLight,\n  colorDangerLightest,\n  colorDangerLight,\n  colorBackgroundTertiary,\n  colorGrayLightest,\n  colorTextDisabled,\n  colorFillDisabled,\n  colorFocusPrimary\n) from '../../styles/variables/_color.css';\n@value (\n  spaceXXSmall,\n  spaceXSmall,\n  spaceSmall\n) from '../../styles/variables/_space.css';\n@value (\n  borderRadiusXSmall,\n  borderRadiusXLarge\n) from '../../styles/variables/_border.css';\n@value (\n  size18,\n  size26,\n  size34\n) from '../../styles/variables/_size.css';\n\n@value (\n  borderWidthNone,\n  borderWidthTertiary\n) from '../../styles/variables/_border.css';\n\n.chipWrapper {\n  composes: formLabelSmall from '../../styles/typography.module.css';\n  composes: motionEaseInEaseOut from '../../styles/animation.module.css';\n  display: flex;\n  background-color: colorNeutralLightest;\n  align-items: center;\n  max-width: fit-content;\n  max-height: fit-content;\n  gap: spaceXXSmall;\n  border-radius: borderRadiusXSmall;\n  cursor: pointer;\n}\n\n.chipWrapper:focus {\n  outline: none;\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n\n.large {\n  padding: spaceXSmall spaceSmall;\n  min-height: size34;\n}\n\n.medium {\n  min-height: size26;\n  padding: spaceXXSmall spaceSmall;\n}\n\n.small {\n  padding: calc(spaceXXSmall / 2) spaceXSmall;\n  min-height: size18;\n}\n\n.primary {\n  background-color: colorNeutralLightest;\n}\n\n.pill {\n  border-radius: borderRadiusXLarge;\n}\n\n.noHoverState {\n  cursor: initial;\n}\n\n.primary:not(.noHoverState):hover {\n  background-color: colorNeutralLight;\n}\n\n.information {\n  background-color: colorInformationLightest;\n}\n\n.information:not(.noHoverState):hover {\n  background-color: colorInformationLight;\n}\n\n.success {\n  background-color: colorSuccessLightest;\n}\n\n.success:not(.noHoverState):hover {\n  background-color: colorSuccessLight;\n}\n\n.warning {\n  background-color: colorWarningLightest;\n}\n\n.warning:not(.noHoverState):hover {\n  background-color: colorWarningLight;\n}\n\n.danger {\n  background-color: colorDangerLightest;\n}\n\n.danger:not(.noHoverState):hover {\n  background-color: colorDangerLight;\n}\n\n.secondary {\n  composes: borderPrimary from '../../styles/border.module.css';\n  background-color: colorBackgroundTertiary;\n}\n\n.secondary:not(.noHoverState):hover {\n  background-color: colorGrayLightest;\n}\n\n.withIcon {\n  padding: spaceXXSmall spaceSmall spaceXXSmall spaceXSmall;\n}\n\n.dismissable {\n  padding: spaceXXSmall spaceXSmall spaceXXSmall spaceSmall;\n}\n\n.dismissIconWrapper {\n  margin-left: spaceXSmall;\n  cursor: pointer;\n}\n\n.statusIndicatorBlock {\n  margin-right: spaceXXSmall;\n}\n\n.alignTop {\n  align-self: flex-start;\n}\n\n/* This should be last section for CSS Specificity  */\n\n.disabled {\n  color: colorTextDisabled;\n  background-color: colorFillDisabled;\n  border: initial;\n  pointer-events: none;\n  cursor: not-allowed;\n}\n\n.disabled .dismissIcon {\n  color: colorTextDisabled;\n}\n\n.disabled .chipIcon {\n  color: colorTextDisabled;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export type { ChipProps, ChipSemanticType } from '../../components/Chip/Chip';\nexport { Chip, CHIP_SEMANTIC } from '../../components/Chip/Chip';\nexport type { PillProps, PillSemanticType } from '../../components/Chip/Pill';\nexport { Pill, PILL_SEMANTIC } from '../../components/Chip/Pill';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "Pill.d.ts": {
            "path": "Pill.d.ts",
            "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { ChipSemanticType } from '../../components/Chip/Chip';\nimport type { IconType } from '../../components/Icon';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    icon?: string;\n}>;\nexport declare const PILL_SEMANTIC: Readonly<{\n    primary: \"primary\";\n    information: \"information\";\n    success: \"success\";\n    warning: \"warning\";\n    danger: \"danger\";\n    secondary: \"secondary\";\n}>;\nexport type PillSemanticType = ChipSemanticType;\nexport interface PillProps {\n    classNames?: ClassNames;\n    semantic?: PillSemanticType;\n    size?: 'large' | 'medium' | 'small';\n    children: React.ReactNode;\n    disabled?: boolean;\n    line?: number;\n    wordBreak?: string;\n    iconName?: string;\n    iconType?: IconType;\n    testId?: string;\n}\nexport declare const Pill: Flow.AbstractComponent<PillProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=Pill.d.ts.map"
          }
        }
      },
      "allFiles": [
        "Chip.module.css",
        "Chip.stories.module.css",
        "Chip.stories.tsx",
        "Chip.tsx",
        "Pill.stories.tsx",
        "Pill.tsx",
        "index.ts"
      ]
    },
    "CircularLoader": {
      "name": "CircularLoader",
      "path": "src/components/CircularLoader",
      "files": {
        "main": {
          "path": "CircularLoader.d.ts",
          "content": "import type { Flow } from 'flow-to-typescript-codemod';\nimport * as COLORS from '../../styles/variables/_color';\nexport interface CircularLoaderProps {\n    size?: 'large' | 'medium' | 'small';\n    className?: string;\n    ariaLabel?: string;\n    colorToken?: keyof typeof COLORS;\n    testId?: string;\n}\nexport declare const CircularLoader: Flow.AbstractComponent<CircularLoaderProps, HTMLDivElement>;\n//# sourceMappingURL=CircularLoader.d.ts.map"
        },
        "story": {
          "path": "CircularLoader.stories.tsx",
          "content": "import * as React from 'react';\n\nimport * as COLORS from 'src/styles/variables/_color';\n\nimport type {CircularLoaderProps} from 'src/components/CircularLoader/CircularLoader';\nimport {CircularLoader} from 'src/components/CircularLoader/CircularLoader';\n\nimport css from 'src/components/CircularLoader/CircularLoader.stories.module.css';\n\n\nconst colorOptions: Array<unknown> = [\n  ...Object.keys(COLORS).filter((color) => color.startsWith('colorText')),\n];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Circular Loader',\n  component: CircularLoader,\n  argTypes: {\n    size: {\n      description:\n        'Circular Loader supports only three size variants namely small, medium and large. `small` < `medium` < `large`',\n      options: ['large', 'medium', 'small'],\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    colorToken: {\n      description:\n        'Pass different text color token string to show loader in different color',\n      options: colorOptions,\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'colorTextClickable'},\n      },\n    },\n    className: {\n      description: 'External className to be applied',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Circular Loader component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { CircularLoader } from \"@spaced-out/ui-design-system/lib/components/CircularLoader\";\n\\`\\`\\`\nCircular loaders can be used to show infinite loading state. For **Linear Loader**\ncheck **<a href=\"../?path=/docs/components-linear-loader--docs\">here</a>**\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/CircularLoader/CircularLoader',\n    },\n  },\n};\n\nexport const CircularLoaderStory = (args: CircularLoaderProps) => (\n  <div className={css.storyContainer}>\n    <CircularLoader {...args} />\n  </div>\n);\nCircularLoaderStory.args = {\n  testId: 'circular-loader-story',\n};\nCircularLoaderStory.storyName = 'Circular Loader';\n"
        },
        "css": {
          "path": "CircularLoader.module.css",
          "content": "@value (colorFillPrimary, colorBackgroundTertiary, colorFillNone) from '../../styles/variables/_color.css';\n@value (\n  spaceNone\n) from '../../styles/variables/_space.css';\n\n@value (\n  size5,\n  size60\n) from '../../styles/variables/_size.css';\n\n@value (\n  motionDurationSlowest\n) from '../../styles/variables/_motion.css';\n\n@value spinnerSize: size60;\n@value spinnerThickness: size5;\n\n@value innerMaskGradient: radial-gradient(farthest-side, colorFillNone calc(99% - var(--spinner-thickness)), colorFillPrimary calc(100% - var(--spinner-thickness)));\n\n.container {\n  display: flex;\n  justify-content: flex-start;\n  align-items: flex-start;\n  --spinner-size: spinnerSize;\n  --spinner-thickness: spinnerThickness;\n}\n\n.mediumContainer {\n  --spinner-size: calc(0.5 * spinnerSize);\n  --spinner-thickness: calc(0.5 * spinnerThickness);\n}\n\n.smallContainer {\n  --spinner-size: calc(0.36 * spinnerSize);\n  --spinner-thickness: calc(0.36 * spinnerThickness);\n}\n\n.spinLoader {\n  height: var(--spinner-size);\n  width: var(--spinner-size);\n  display: block;\n  position: relative;\n  animation: spin motionDurationSlowest linear 0s infinite normal;\n  background: transparent;\n}\n\n.outerCircle {\n  --color: colorFillPrimary;\n  display: block;\n  position: absolute;\n  border-radius: calc(var(--spinner-size) / 2);\n  height: var(--spinner-size);\n  width: var(--spinner-size);\n  top: spaceNone;\n  right: spaceNone;\n  background: conic-gradient(\n    from 90deg at 50% 50%,\n    colorFillNone 1deg,\n    var(--color) 360deg\n  );\n  -webkit-mask: innerMaskGradient;\n  mask: innerMaskGradient;\n}\n\n.ellipse {\n  --color: colorFillPrimary;\n  position: absolute;\n  right: spaceNone;\n  top: spaceNone;\n  bottom: spaceNone;\n  border-radius: calc(var(--spinner-thickness) / 2);\n  height: var(--spinner-thickness);\n  width: var(--spinner-thickness);\n  margin: auto;\n  background: var(--color);\n}\n\n@keyframes spin {\n  from {\n    transform: rotate(0deg);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export { CircularLoader } from '../../components/CircularLoader/CircularLoader';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "CircularLoader.module.css",
        "CircularLoader.stories.module.css",
        "CircularLoader.stories.tsx",
        "CircularLoader.tsx",
        "index.ts"
      ]
    },
    "CollapsibleCard": {
      "name": "CollapsibleCard",
      "path": "src/components/CollapsibleCard",
      "files": {
        "main": {
          "path": "CollapsibleCard.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { IconType } from '../../components/Icon';\nexport declare const COLLAPSIBLE_CARD_SEMANTIC: Readonly<{\n    neutral: \"neutral\";\n    success: \"success\";\n    information: \"information\";\n    warning: \"warning\";\n    danger: \"danger\";\n}>;\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    title?: string;\n    content?: string;\n}>;\nexport type CollapsibleCardSemanticType = (typeof COLLAPSIBLE_CARD_SEMANTIC)[keyof typeof COLLAPSIBLE_CARD_SEMANTIC];\nexport interface CollapsibleCardProps {\n    id?: string;\n    title: React.ReactNode;\n    children: React.ReactNode;\n    classNames?: ClassNames;\n    isOpen?: boolean;\n    paddingSize?: 'small' | 'medium';\n    headerIconName?: string;\n    headerIconType?: IconType;\n    semantic?: CollapsibleCardSemanticType;\n    testId?: string;\n    onChange?: ((e: React.SyntheticEvent<HTMLElement>, isOpen: boolean, id?: string) => unknown) | null | undefined;\n}\nexport interface CollapsibleCardActionProps {\n    children: React.ReactNode;\n    className?: string;\n    testId?: string;\n}\nexport declare const CollapsibleCardAction: ({ children, className, testId, }: CollapsibleCardActionProps) => React.JSX.Element;\nexport interface CollapsibleCardContentProps {\n    children: React.ReactNode;\n    className?: string;\n    testId?: string;\n}\nexport declare const CollapsibleCardContent: ({ children, className, testId, }: CollapsibleCardContentProps) => React.JSX.Element;\nexport declare const CollapsibleCard: Flow.AbstractComponent<CollapsibleCardProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=CollapsibleCard.d.ts.map"
        },
        "story": {
          "path": "CollapsibleCard.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {Button} from 'src/components/Button';\nimport type {CollapsibleCardProps} from 'src/components/CollapsibleCard';\nimport {\n  COLLAPSIBLE_CARD_SEMANTIC,\n  CollapsibleCard,\n  CollapsibleCardAction,\n  CollapsibleCardContent,\n} from 'src/components/CollapsibleCard';\nimport {ClickableIcon} from 'src/components/Icon';\nimport {BodySmall, SubTitleSmall} from 'src/components/Text';\n\nimport css from 'src/components/CollapsibleCard/CollapsibleCard.stories.module.css';\n\n\nconst semanticOptions: Array<unknown> = [\n  ...Object.values(COLLAPSIBLE_CARD_SEMANTIC),\n];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Collapsible Card',\n  component: CollapsibleCard,\n  argTypes: {\n    semantic: {\n      options: semanticOptions,\n      description:\n        'Semantic type of Collapsible Card. It will have different Icon and background color for different semantic type',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: COLLAPSIBLE_CARD_SEMANTIC.neutral},\n      },\n    },\n    id: {\n      description: 'Provide an optional id to the collapsible card',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {\n          summary: 'string',\n        },\n      },\n    },\n    title: {\n      description: 'Title of the Collapsible card',\n      type: {required: true},\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {\n          summary: 'React.Node',\n        },\n      },\n    },\n    children: {\n      description: 'Content of expanded collapsible card',\n      type: {required: true},\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: 'React.Node',\n        },\n      },\n    },\n    isOpen: {\n      description: 'Expanded state collapsible card',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {\n          summary: 'boolean',\n        },\n      },\n    },\n    headerIconName: {\n      description: 'Custom left icon. This overrides the default semantic icon',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    headerIconType: {\n      description:\n        'Type of Icon for Collapsible Card. Type represents 4 unique icon styles :- Solid, Regular, Duotone and Brands',\n      options: ['regular', 'solid', 'duotone', 'brands'],\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'solid'},\n      },\n    },\n    onChange: {\n      description:\n        '**onChange** handler is triggered when there is a change in expanded state of Collapsible Card',\n      action: 'changed',\n      table: {\n        type: {\n          summary:\n            '( e: SyntheticEvent<HTMLElement>, isOpen: boolean, id?: string) => mixed',\n        },\n      },\n    },\n    paddingSize: {\n      description: 'Padding size of the collapsible card',\n      options: ['small', 'medium'],\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'small'},\n      },\n    },\n    classNames: {\n      description: 'Provide an optional className to be applied to the wrapper',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{wrapper?: string, title?: string, content?: string}',\n        },\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a CollapsibleCard component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport {\n  CollapsibleCard,\n  CollapsibleCardAction,\n  CollapsibleCardContent\n} from \"@spaced-out/ui-design-system/lib/components/CollapsibleCard\";\n\\`\\`\\`\n**Collapsible Card** is a simple components that takes title, content and action. There are sematic components for action\nand content. Use \\`<CollapsibleCardContent>\\` for populating the content and \\`<CollapsibleCardAction>\\` to have some action\nhandlers stick to the bottom of content\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/CollapsibleCard/CollapsibleCard',\n    },\n  },\n};\n\nexport const DefaultStory = (args: CollapsibleCardProps) => (\n  <div className={css.container}>\n    <CollapsibleCard {...args}>\n      <CollapsibleCardContent>\n        <div className={css.acContent}>\n          <BodySmall>\n            This section has been populated using CollapsibleCardContent\n          </BodySmall>\n        </div>\n      </CollapsibleCardContent>\n    </CollapsibleCard>\n  </div>\n);\n\nDefaultStory.args = {\n  title: 'Hello world',\n  classNames: {wrapper: ''},\n  testId: 'collapsible-card-default-story',\n  paddingSize: 'small',\n};\n\nexport const WithActionStory = (args: CollapsibleCardProps) => (\n  <div className={css.container}>\n    <CollapsibleCard {...args}>\n      <CollapsibleCardContent>\n        <div className={css.acContent}>\n          <BodySmall>\n            This section has been populated using CollapsibleCardContent\n          </BodySmall>\n        </div>\n      </CollapsibleCardContent>\n      <CollapsibleCardAction className={css.action}>\n        <Button type=\"tertiary\" isFluid>\n          Button Text\n        </Button>\n        <Button type=\"secondary\" isFluid>\n          Button Text\n        </Button>\n      </CollapsibleCardAction>\n    </CollapsibleCard>\n  </div>\n);\n\nWithActionStory.args = {\n  title: 'Hello world',\n  classNames: {wrapper: ''},\n  testId: 'collapsible-card-with-action-story',\n};\n\nconst ActionableHeader = () => (\n  <div className={css.cardHeader}>\n    <SubTitleSmall>Accordion Title</SubTitleSmall>\n    <ClickableIcon\n      name=\"plus\"\n      color=\"secondary\"\n      size=\"small\"\n      onClick={(e) => {\n        e.stopPropagation();\n        e.preventDefault();\n      }}\n    ></ClickableIcon>\n  </div>\n);\n\n/**\n * Usage:\n *\n```jsx\n\nconst ActionableHeader = (): React.Node => (\n  <div className={css.cardHeader}>\n    <SubTitleSmall>Accordion Title</SubTitleSmall>\n    <ClickableIcon\n      name=\"plus\"\n      color=\"secondary\"\n      size=\"small\"\n      onClick={(e) => {\n        e.stopPropagation();\n        e.preventDefault();\n      }}\n    ></ClickableIcon>\n  </div>\n);\n\nexport const _WithHeaderActionSlots = (\n  args: CollapsibleCardProps,\n): React.Node => (\n  <div className={css.container}>\n    <CollapsibleCard {...args} title={<ActionableHeader />}>\n      <CollapsibleCardContent>\n        <div className={css.acContent}>\n          <BodySmall>\n            This section has been populated using CollapsibleCardContent\n          </BodySmall>\n        </div>\n      </CollapsibleCardContent>\n      <CollapsibleCardAction className={css.action}>\n        <Button type=\"tertiary\" isFluid>\n          Button Text\n        </Button>\n        <Button type=\"secondary\" isFluid>\n          Button Text\n        </Button>\n      </CollapsibleCardAction>\n    </CollapsibleCard>\n  </div>\n);\n```\n\n```css\n  .cardHeader {\n    width: sizeFluid;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n  }\n```\n *\n */\nexport const WithHeaderActionSlotsStory = (args: CollapsibleCardProps) => (\n  <div className={css.container}>\n    <CollapsibleCard {...args} title={<ActionableHeader />}>\n      <CollapsibleCardContent>\n        <div className={css.acContent}>\n          <BodySmall>\n            This section has been populated using CollapsibleCardContent\n          </BodySmall>\n        </div>\n      </CollapsibleCardContent>\n      <CollapsibleCardAction className={css.action}>\n        <Button type=\"tertiary\" isFluid>\n          Button Text\n        </Button>\n        <Button type=\"secondary\" isFluid>\n          Button Text\n        </Button>\n      </CollapsibleCardAction>\n    </CollapsibleCard>\n  </div>\n);\n\nWithHeaderActionSlotsStory.args = {\n  classNames: {wrapper: ''},\n  testId: 'collapsible-card-with-header-action-slots-story',\n};\n\nexport const WithIconStory = (args: CollapsibleCardProps) => (\n  <div className={css.container}>\n    <CollapsibleCard {...args}>\n      <CollapsibleCardContent>\n        <div className={css.acContent}>\n          <BodySmall>\n            This section has been populated using CollapsibleCardContent\n          </BodySmall>\n        </div>\n      </CollapsibleCardContent>\n\n      <CollapsibleCardAction className={css.action}>\n        <Button type=\"tertiary\" isFluid>\n          Hello\n        </Button>\n        <Button type=\"tertiary\" isFluid>\n          World\n        </Button>\n      </CollapsibleCardAction>\n    </CollapsibleCard>\n  </div>\n);\n\nWithIconStory.args = {\n  title: 'Hello world',\n  classNames: {wrapper: ''},\n  headerIconName: 'face-party',\n  semantic: 'neutral',\n  testId: 'collapsible-card-with-icon-story',\n};\nDefaultStory.storyName = 'Default';\nWithActionStory.storyName = 'With Action';\nWithHeaderActionSlotsStory.storyName = 'With Header Action Slots';\nWithIconStory.storyName = 'With Icon';\n"
        },
        "css": {
          "path": "CollapsibleCard.module.css",
          "content": "@value (colorBorderPrimary,\ncolorBackgroundPrimary,\ncolorBackgroundTertiary,\ncolorNeutralLightest,\ncolorNeutral,\ncolorInformationLightest,\ncolorInformation,\ncolorSuccessLightest,\ncolorSuccess,\ncolorDangerLightest,\ncolorDanger,\ncolorWarningLightest,\ncolorWarning,\ncolorFocusPrimary\n) from '../../styles/variables/_color.css';\n@value (sizeFluid, size58, size34) from '../../styles/variables/_size.css';\n@value (spaceSmall, spaceMedium, spaceXSmall) from '../../styles/variables/_space.css';\n@value (elevationCard) from '../../styles/variables/_elevation.css';\n@value (borderWidthNone,\nborderWidthPrimary,\nborderRadiusSmall,\nborderRadiusNone,\nborderWidthTertiary\n) from '../../styles/variables/_border.css';\n\n.wrapper {\n  display: flex;\n  flex-flow: column;\n  width: sizeFluid;\n}\n\n.header {\n  composes: subTitleSmall from '../../styles/typography.module.css';\n  composes: borderPrimary from '../../styles/border.module.css';\n  /* composes: motionEaseInEaseOut from '../../styles/animation.module.css'; */\n  min-height: size58;\n  border-radius: borderRadiusSmall;\n  display: flex;\n  cursor: pointer;\n  align-items: center;\n  width: sizeFluid;\n  justify-content: space-between;\n  gap: spaceSmall;\n  padding: spaceSmall;\n  background-color: colorBackgroundTertiary;\n  z-index: elevationCard;\n}\n\n.header:focus {\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n\n.header.isOpen {\n  border-radius: borderRadiusSmall borderRadiusSmall borderRadiusNone\n    borderRadiusNone;\n}\n\n.headerContent {\n  display: flex;\n  gap: spaceXSmall;\n  align-items: center;\n  text-align: left;\n  width: sizeFluid;\n}\n\n.iconContainer {\n  display: flex;\n  min-width: size34;\n  min-height: size34;\n  border-radius: borderRadiusSmall;\n  align-items: center;\n  justify-content: center;\n}\n\n.iconContainer.neutral {\n  background-color: colorNeutralLightest;\n}\n\n.iconContainer .neutral {\n  color: colorNeutral;\n}\n\n.iconContainer.success {\n  background-color: colorSuccessLightest;\n}\n\n.iconContainer .success {\n  color: colorSuccess;\n}\n\n.iconContainer.information {\n  background-color: colorInformationLightest;\n}\n\n.iconContainer .information {\n  color: colorInformation;\n}\n\n.iconContainer.warning {\n  background-color: colorWarningLightest;\n}\n\n.iconContainer .warning {\n  color: colorWarning;\n}\n\n.iconContainer.danger {\n  background-color: colorDangerLightest;\n}\n\n.iconContainer .danger {\n  color: colorDanger;\n}\n\n.content {\n  display: flex;\n  flex-flow: column;\n  background-color: colorBackgroundPrimary;\n  border-left: borderWidthPrimary solid colorBorderPrimary;\n  border-right: borderWidthPrimary solid colorBorderPrimary;\n  border-bottom: borderWidthPrimary solid colorBorderPrimary;\n  border-radius: borderRadiusNone borderRadiusNone borderRadiusSmall\n    borderRadiusSmall;\n}\n\n.contentContainer {\n  display: flex;\n  padding: spaceSmall;\n}\n\n.actionContainer {\n  display: flex;\n  border-top: borderWidthPrimary solid colorBorderPrimary;\n  border-radius: borderRadiusNone borderRadiusNone borderRadiusSmall\n    borderRadiusSmall;\n  background-color: colorBackgroundTertiary;\n  padding: spaceSmall;\n  gap: spaceXSmall;\n}\n\n.paddingMedium .header {\n  padding: spaceSmall spaceMedium;\n}\n\n.paddingMedium .contentContainer {\n  padding: spaceSmall spaceMedium;\n}\n\n.paddingMedium .actionContainer {\n  padding: spaceSmall spaceMedium;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/CollapsibleCard/CollapsibleCard';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "CollapsibleCard.module.css",
        "CollapsibleCard.stories.module.css",
        "CollapsibleCard.stories.tsx",
        "CollapsibleCard.tsx",
        "index.ts"
      ]
    },
    "Combobox": {
      "name": "Combobox",
      "path": "src/components/Combobox",
      "files": {
        "main": {
          "path": "Combobox.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { IconType } from '../../components/Icon';\nimport type { InputOnChangeParamsType } from '../../components/Input';\nimport type { MenuOption, MenuProps } from '../../components/Menu';\ntype InputClassNames = Readonly<{\n    box?: string;\n    iconLeft?: string;\n    iconRight?: string;\n    wrapper?: string;\n}>;\ntype DropdownClassNames = Readonly<{\n    wrapper?: string;\n    box?: string;\n    iconRight?: string;\n}>;\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    box?: string;\n    input?: InputClassNames;\n    dropdown?: DropdownClassNames;\n}>;\nexport interface ComboboxProps {\n    classNames?: ClassNames;\n    disabled?: boolean;\n    type?: 'text' | 'tel';\n    label?: string | React.ReactNode;\n    size?: 'medium' | 'small';\n    onContainerClick?: React.MouseEventHandler<HTMLDivElement>;\n    locked?: boolean;\n    error?: boolean;\n    errorText?: string;\n    helperText?: string | React.ReactNode;\n    required?: boolean;\n    readOnly?: boolean;\n    boxRef?: React.Ref<HTMLDivElement>;\n    value: {\n        dropdown?: string;\n        input?: string;\n    };\n    onChange: (arg1: {\n        input: string;\n        dropdown: string;\n        inputChange?: InputOnChangeParamsType;\n        dropdownOption?: MenuOption;\n    }) => unknown;\n    inputPlaceholder?: string;\n    onInputFocus?: React.FocusEventHandler<HTMLInputElement>;\n    onInputBlur?: React.FocusEventHandler<HTMLInputElement>;\n    onInputKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;\n    onInputContainerClick?: React.MouseEventHandler<HTMLDivElement>;\n    inputName?: string;\n    iconLeftName?: string;\n    iconLeftType?: IconType;\n    iconRightName?: string;\n    iconRightType?: IconType;\n    onIconRightClick?: ((arg1: React.SyntheticEvent<HTMLElement>) => unknown) | null | undefined;\n    inputBoxRef?: React.Ref<HTMLInputElement>;\n    minLength?: number;\n    maxLength?: number;\n    pattern?: string;\n    min?: string;\n    max?: string;\n    menu?: MenuProps;\n    onMenuOpen?: () => unknown;\n    onMenuClose?: () => unknown;\n    scrollMenuToBottom?: boolean;\n    /**\n     * Opt in to the accessibility behavior: the label and helper/error text\n     * programmatically associated with both fields, and the `combobox` wiring in\n     * the `Dropdown` this renders.\n     *\n     * Off by default, and off is this component exactly as it behaved before any\n     * of it existed.\n     */\n    enableA11y?: boolean;\n    onDropdownFocus?: React.FocusEventHandler<HTMLInputElement>;\n    onDropdownBlur?: React.FocusEventHandler<HTMLInputElement>;\n    onDropdownKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;\n    onDropdownContainerClick?: React.MouseEventHandler<HTMLDivElement>;\n    dropdownName?: string;\n    dropdownPlaceholder?: string;\n    dropdownBoxRef?: React.Ref<HTMLDivElement>;\n    testId?: string;\n}\nexport declare const Combobox: Flow.AbstractComponent<ComboboxProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=Combobox.d.ts.map"
        },
        "story": {
          "path": "Combobox.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {ComboboxProps} from 'src/components/Combobox/Combobox';\nimport {Combobox} from 'src/components/Combobox/Combobox';\nimport {\n  currencyOptions,\n  defaultOptions,\n  formatPhoneNumber,\n  phoneNumberOptions,\n} from 'src/components/Combobox/helper';\nimport type {InputOnChangeParamsType} from 'src/components/Input';\nimport type {MenuOption} from 'src/components/Menu';\n\nimport css from 'src/components/Combobox/Combobox.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Form Components/Combobox',\n  component: Combobox,\n  argTypes: {\n    enableA11y: {\n      description:\n        '**enableA11y** opts into the accessibility behavior: the label and helper/error text programmatically associated with both fields, and the `combobox` wiring in the `Dropdown` it renders. Off by default, where the component behaves exactly as it did before any of it existed. Off here too, as everywhere: turn the control on to see the accessible behavior.',\n      control: {type: 'boolean'},\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    value: {\n      type: {required: true},\n      description: 'The controlled value to input',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: '{dropdown?: string, input?: string}'},\n      },\n    },\n    onChange: {\n      type: {required: true},\n      description:\n        '**onChange** handler is triggered when there is a selection of an option from dropdown or a change in input value. If input is changed onChange will have `dropdownOption` as undefined and on a dropdown change `inputChange` will be undefined',\n      table: {\n        type: {\n          summary:\n            'onChange: ({input: string, dropdown: string, inputChange?: InputChange, dropdownOption?: MenuOption}) => mixed',\n        },\n      },\n    },\n    menu: {\n      description: 'Menu props to use',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: 'MenuProps'},\n      },\n    },\n    type: {\n      description: 'Type of Input. Supported types are listed on the dropdown',\n      options: ['text', 'tel'],\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'text'},\n      },\n    },\n    size: {\n      options: ['small', 'medium'],\n      description:\n        'Combobox supports only two size variants namely small and medium. `small` < `medium`',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    classNames: {\n      description: 'External classnames to be applied',\n      control: {\n        type: 'object',\n      },\n    },\n    helperText: {\n      description:\n        'Secondary label of the combobox. This appears on bottom of combobox, if the input is in `error` state the priority is given to `errorText`, in such cases secondary label wont be displayed',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    error: {\n      description:\n        'if **true**, the component is moved to error state, Error state displays a red border surrounding combobox',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    errorText: {\n      description:\n        'Error text to be displayed on the bottom of the combobox. This uses `colorTextDanger`',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    label: {\n      description:\n        'Primary label of the combobox. This appears on top of combobox',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    disabled: {\n      description: 'If **true**, the component is disabled',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Combobox component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Combobox } from \"@spaced-out/ui-design-system/lib/components/Combobox\";\n\\`\\`\\`\n**Combobox** is implemented as a combination of **<a href=\"..?path=/docs/form-components-dropdown-generic-dropdown--docs\">Generic Dropdown</a>** and **<a href=\"..?path=/docs/form-components-input--docs\">Input</a>** components.\nIt allows user to input free text and select from the user defined options in the dropdown.\nIt is a controlled component, hence **value** and **onChange** props are mandatory.\nIt accepts all the props that **Input** and **Generic Dropdown** provides.\n\nMandatory props:\n* \\`value\\` accepts an object \\`{ dropdown: string, input: string }\\` which should have the display strings for both the dropdown and input components. To show the placeholder pass an empty string \\`' '\\`\n* \\`onChange\\` callback provides an object with four values in its parameter\n    * \\`input\\`: the string which is inputted\n    * \\`dropdown\\`: the \\`label\\` of the option which is selected\n    * \\`inputChange\\`: the onChange parameters of Input component\n    * \\`dropdownOption\\`: the onChange parameters of Dropdown component\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Combobox',\n    },\n  },\n};\n\nexport const DefaultStory = (args: ComboboxProps) => {\n  const [selectedKeys, setSelectedKeys] = React.useState(\n    args.menu?.selectedKeys || [],\n  );\n  const [dropDownText, setDropdownText] = React.useState('');\n  const [inputText, setInputText] = React.useState('');\n\n  const handleChange: (arg1: {\n    input: string;\n    dropdown: string;\n    inputChange?: InputOnChangeParamsType;\n    dropdownOption?: MenuOption;\n  }) => unknown = ({input, dropdown, dropdownOption}) => {\n    setInputText(input);\n    setDropdownText(dropdown);\n    if (dropdownOption?.key) {\n      setSelectedKeys([dropdownOption.key]);\n    }\n  };\n\n  return (\n    <div className={css.container}>\n      <Combobox\n        {...args}\n        menu={{...args.menu, selectedKeys}}\n        value={{dropdown: dropDownText, input: inputText}}\n        onChange={handleChange}\n      />\n    </div>\n  );\n};\n\nDefaultStory.args = {\n  label: 'Form Label',\n  inputPlaceholder: 'Enter text...',\n  dropdownPlaceholder: 'Select...',\n  menu: {options: defaultOptions},\n  testId: 'combobox-default-story',\n};\n\nexport const CurrencyInputStory = (args: ComboboxProps) => {\n  const [comboboxData, setComboboxData] = React.useState({\n    selectedKeys: args.menu?.selectedKeys || [],\n    selectedValue: args.value.dropdown || '',\n    inputValue: args.value.input || '',\n  });\n  const [error, setError] = React.useState({\n    state: false,\n    text: '',\n  });\n\n  const handleChange: (arg1: {\n    input: string;\n    dropdown: string;\n    inputChange?: InputOnChangeParamsType;\n    dropdownOption?: MenuOption;\n  }) => unknown = ({input, dropdown, dropdownOption}) => {\n    const withoutCommasInput = input.replace(/,/g, '');\n\n    const allDigits = /^\\d+$/.test(withoutCommasInput);\n    if (withoutCommasInput.length > 0 && !allDigits) {\n      setError({\n        state: true,\n        text: 'Only digits are allowed',\n      });\n    } else {\n      setError({\n        state: false,\n        text: '',\n      });\n    }\n\n    setComboboxData((_prev) => ({\n      ..._prev,\n      inputValue: allDigits\n        ? new Intl.NumberFormat().format(+withoutCommasInput)\n        : input,\n      selectedValue: dropdown,\n      selectedKeys: dropdownOption?.key\n        ? [dropdownOption.key]\n        : _prev.selectedKeys,\n    }));\n  };\n\n  return (\n    <div className={css.container}>\n      <Combobox\n        {...args}\n        error={error.state}\n        errorText={error.text}\n        menu={{...args.menu, selectedKeys: comboboxData.selectedKeys}}\n        value={{\n          dropdown: comboboxData.selectedValue,\n          input: comboboxData.inputValue,\n        }}\n        onChange={handleChange}\n      />\n    </div>\n  );\n};\n\nCurrencyInputStory.args = {\n  label: 'Amount',\n  inputPlaceholder: 'Enter amount...',\n  helperText: 'Select the currency and input the price',\n  value: {dropdown: '', input: ''},\n  menu: {options: currencyOptions},\n  testId: 'combobox-currency-input-story',\n};\n\nexport const PhoneNumberInputStory = (args: ComboboxProps) => {\n  const [comboboxData, setComboboxData] = React.useState({\n    selectedKeys: args.menu?.selectedKeys || [],\n    selectedValue: args.value.dropdown || '',\n    inputValue: args.value.input || '',\n  });\n\n  const handleChange: (arg1: {\n    input: string;\n    dropdown: string;\n    inputChange?: InputOnChangeParamsType;\n    dropdownOption?: MenuOption;\n  }) => unknown = ({input, dropdown, dropdownOption}) => {\n    setComboboxData((_prev) => ({\n      ..._prev,\n      inputValue: formatPhoneNumber(\n        input,\n        dropdownOption?.key || _prev.selectedKeys[0],\n      ),\n      selectedValue: dropdown.split(' ')[0],\n      selectedKeys: dropdownOption?.key\n        ? [dropdownOption.key]\n        : _prev.selectedKeys,\n    }));\n  };\n\n  return (\n    <div className={css.container}>\n      <Combobox\n        {...args}\n        menu={{...args.menu, selectedKeys: comboboxData.selectedKeys}}\n        value={{\n          dropdown: comboboxData.selectedValue,\n          input: comboboxData.inputValue,\n        }}\n        onChange={handleChange}\n      />\n    </div>\n  );\n};\n\nPhoneNumberInputStory.args = {\n  label: 'Call Number',\n  inputPlaceholder: 'Number',\n  helperText: 'Select the country code and the number to call',\n  value: {dropdown: '+44', input: '90 1574 7289'},\n  menu: {options: phoneNumberOptions, allowSearch: true},\n  testId: 'combobox-phone-number-input-story',\n};\nDefaultStory.storyName = 'Default';\nCurrencyInputStory.storyName = 'Currency Input';\nPhoneNumberInputStory.storyName = 'Phone Number Input';\n"
        },
        "css": {
          "path": "Combobox.module.css",
          "content": "@value (\n  colorBackgroundSecondary,\n  colorTextPrimary,\n  colorFillNone\n) from '../../styles/variables/_color.css';\n@value (\n  sizeFluid,\n  size42\n) from '../../styles/variables/_size.css';\n@value (\n  spaceNone,\n  spaceXXSmall\n) from '../../styles/variables/_space.css';\n@value (\n  borderRadiusNone,\n  borderWidthPrimary\n) from '../../styles/variables/_border.css';\n@value (\n  elevationCard\n) from '../../styles/variables/_elevation.css';\n\n.wrapper {\n  display: flex;\n  flex-direction: column;\n  width: sizeFluid;\n  gap: spaceXXSmall;\n}\n\n.info {\n  display: flex;\n  justify-content: space-between;\n}\n\n.infoContent {\n  display: flex;\n}\n\n.box {\n  display: flex;\n  height: size42;\n}\n\n.box.withError .inputBox {\n  /* Enable border for error state */\n  border-left-width: borderWidthPrimary;\n}\n\n.locked {\n  border-style: dashed;\n}\n\n.dropdownWrapper {\n  flex: 1;\n}\n\n.dropdownBox {\n  /* Alter dropdown box default values */\n  background-color: colorBackgroundSecondary;\n  border-top-right-radius: borderRadiusNone;\n  border-bottom-right-radius: borderRadiusNone;\n  border-right-color: colorFillNone;\n  z-index: auto;\n}\n\n.dropdownWrapper:focus-within,\n.dropdownBox:focus-within,\n.dropdownBox:not(.disabled):not(.locked):hover {\n  /* brings up the (default dropdown) box shadow on hover */\n  z-index: elevationCard;\n}\n\n.inputWrapper {\n  flex: 2;\n  /* For error state input's default wrapper adds gap between box and zero height error text */\n  gap: spaceNone;\n}\n\n.inputBox {\n  /* Alter input box default values */\n  border-top-left-radius: borderRadiusNone;\n  border-bottom-left-radius: borderRadiusNone;\n  border-left-color: colorFillNone;\n  z-index: auto;\n}\n\n.inputWrapper:focus-within,\n.inputBox:focus-within,\n.inputBox:not(.disabled):not(.locked):hover {\n  /* brings up the (default input) box shadow on hover */\n  z-index: elevationCard;\n}\n\n.dropdownBox:not(.disabled) .chevron {\n  color: colorTextPrimary;\n}\n\n.dropdownBox.locked,\n.inputBox.locked {\n  pointer-events: none;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Combobox/Combobox';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "helper.d.ts": {
            "path": "helper.d.ts",
            "content": "import type { MenuOption } from '../../components/Menu';\nexport declare const defaultOptions: MenuOption[];\nexport declare const currencyOptions: MenuOption[];\nexport declare const phoneNumberOptions: MenuOption[];\n/**\n * Format phone numbers according to country-specific patterns\n * @param {string} phoneNumber - The phone number to format\n * @param {string} locale - The locale/country code (e.g., 'US', 'GB', 'JP')\n * @returns {string} - Formatted phone number\n */\nexport declare const formatPhoneNumber: (phoneNumber: string, locale?: string) => string;\n//# sourceMappingURL=helper.d.ts.map"
          }
        }
      },
      "allFiles": [
        "Combobox.module.css",
        "Combobox.stories.module.css",
        "Combobox.stories.tsx",
        "Combobox.tsx",
        "helper.ts",
        "index.ts"
      ]
    },
    "ConditionalWrapper": {
      "name": "ConditionalWrapper",
      "path": "src/components/ConditionalWrapper",
      "files": {
        "main": {
          "path": "ConditionalWrapper.d.ts",
          "content": "import type * as React from 'react';\nexport interface ConditionalWrapperProps {\n    condition?: boolean;\n    wrapper?: (children: React.ReactNode) => React.ReactNode;\n    children?: React.ReactNode;\n}\nexport declare const ConditionalWrapper: ({ condition, wrapper, children, }: ConditionalWrapperProps) => React.ReactNode;\n//# sourceMappingURL=ConditionalWrapper.d.ts.map"
        },
        "story": {
          "path": "ConditionalWrapper.stories.tsx",
          "content": "import React from 'react';\n\nimport {ConditionalWrapper} from 'src/components/ConditionalWrapper';\nimport {BodyLarge} from 'src/components/Text';\n\n\nexport default {\n  title: 'Utils/Conditional Wrapper',\n  tags: ['autodocs'],\n  component: ConditionalWrapper,\n  parameters: {\n    docs: {\n      description: {\n        component: `\n\\`\\`\\`js\nimport { ConditionalWrapper } from \"@spaced-out/ui-design-system/lib/components/ConditionalWrapper\";\n\\`\\`\\`\nThe \\`ConditionalWrapper\\` component is a utility component that conditionally wraps its children with a wrapper component or element based on a condition.\n\n### Usage\n\\`\\`\\`jsx\nimport React from 'react';\nimport { ConditionalWrapper } from './ConditionalWrapper';\n\nconst MyComponent = () => {\n  return (\n    <ConditionalWrapper condition={condition} wrapper={(children) => (\n      <div className=\"wrapper-class\">{children}</div>\n    )}>\n      <BodyLarge>This is my content</BodyLarge>\n    </ConditionalWrapper>\n  );\n};\n\nexport default MyComponent;\n\\`\\`\\`\n        `,\n      },\n    },\n  },\n};\n\nexport const Example = (): React.ReactElement<React.ComponentProps<'div'>> => (\n  <div>\n    <ConditionalWrapper\n      condition={true}\n      wrapper={(children) => <div>{children}</div>}\n    >\n      <BodyLarge>This content is conditionally wrapped</BodyLarge>\n    </ConditionalWrapper>\n  </div>\n);\n"
        },
        "css": null,
        "index": {
          "path": "index.d.ts",
          "content": "export { ConditionalWrapper } from '../../components/ConditionalWrapper/ConditionalWrapper';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "ConditionalWrapper.stories.tsx",
        "ConditionalWrapper.ts",
        "index.ts"
      ]
    },
    "DateRangePicker": {
      "name": "DateRangePicker",
      "path": "src/components/DateRangePicker",
      "files": {
        "main": {
          "path": "DateRangePicker.d.ts",
          "content": "import type { Flow } from 'flow-to-typescript-codemod';\nimport type { DateRangePickerError, DateRangeWithTimezone } from '../../types';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n}>;\nexport interface DateRangePickerProps {\n    classNames?: ClassNames;\n    selectedDateRange?: DateRangeWithTimezone;\n    onApply: (datePickerSelectedRange: DateRangeWithTimezone) => void;\n    onError?: (arg1: DateRangePickerError) => void;\n    onCancel: () => void;\n    hideTimezone?: boolean;\n    minDate?: string;\n    maxDate?: string;\n    startDateLabel?: string;\n    endDateLabel?: string;\n    t?: ((key: string, fallback: string) => string) | null | undefined;\n    locale?: string;\n    testId?: string;\n}\nexport declare const DateRangePicker: Flow.AbstractComponent<DateRangePickerProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=DateRangePicker.d.ts.map"
        },
        "story": {
          "path": "DateRangePicker.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {\n  autoUpdate,\n  FloatingFocusManager,\n  FloatingPortal,\n  offset,\n  useFloating,\n} from '@floating-ui/react';\n\nimport {sizeFluid} from 'src/styles/variables/_size';\nimport {spaceNone, spaceXXSmall} from 'src/styles/variables/_space';\nimport type {DateRangeWithTimezone} from 'src/types';\nimport {formatIsoDate, getSubtractedDate} from 'src/utils';\nimport {classify} from 'src/utils/classify';\nimport {ClickAway} from 'src/utils/click-away';\nimport {mergeRefs} from 'src/utils/merge-refs';\n\nimport type {DateRangePickerProps} from 'src/components/DateRangePicker/DateRangePicker';\nimport {DateRangePicker} from 'src/components/DateRangePicker/DateRangePicker';\nimport {Input} from 'src/components/Input';\n\nimport css from 'src/components/DateRangePicker/DateRangePicker.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Form Components/Date Range Picker',\n  component: DateRangePicker,\n  argTypes: {\n    classNames: {\n      description:\n        'Provide an optional className to be applied to the wrapper.',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{wrapper?: string}',\n        },\n      },\n    },\n    selectedDateRange: {\n      description:\n        'An optional date range in the YYYY-MM-DD format and timezone.',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{startDate: string, endDate: string, timezone: string}',\n        },\n      },\n    },\n    minDate: {\n      description:\n        'The minimum permissible date that a user can specify is set to 8 years before the current date by default.',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {\n          summary: getSubtractedDate(formatIsoDate(), 8, 'y') as string,\n        },\n      },\n    },\n    maxDate: {\n      description:\n        'The maximum permissible date that a user can select is set to the current date by default.',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: formatIsoDate() as string},\n      },\n    },\n    hideTimezone: {\n      description: 'Hide timezone filter.',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {\n          summary: 'boolean',\n        },\n        defaultValue: {summary: false},\n      },\n    },\n    onCancel: {\n      description:\n        'Function that is triggered upon clicking the Cancel button.',\n      control: null,\n      table: {\n        type: {\n          summary: '() => void',\n        },\n      },\n    },\n    onError: {\n      description: 'Function that is triggered when an error occurs.',\n      control: null,\n      table: {\n        type: {\n          summary: `({\n            type: string,\n            description: string\n          }) => void`,\n        },\n      },\n    },\n    onApply: {\n      description: 'Function that is triggered upon clicking the Apply button.',\n      control: null,\n      table: {\n        type: {\n          summary: `({\n            startDateUTC: string,\n            endDateUTC: string,\n            startDate: string,\n            endDate: string,\n            timezone: string,\n          }) => void`,\n        },\n      },\n    },\n    startDateLabel: {\n      description: 'Label for the start date.',\n      control: {\n        type: 'text',\n      },\n    },\n    endDateLabel: {\n      description: 'Label for the end date.',\n      control: {\n        type: 'text',\n      },\n    },\n    t: {\n      description:\n        'Translation function that takes a key and fallback value and returns the translated string.',\n      control: null,\n      table: {\n        type: {\n          summary: '(key: string, fallback: string) => string',\n        },\n      },\n    },\n    locale: {\n      description: 'Language code for localization.',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a DateRangePicker component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { DateRangePicker } from \"@spaced-out/ui-design-system/lib/components/DateRangePicker\";\n\\`\\`\\`\n**DateRangePicker** simplifies the selection of date ranges with precision and ease, offering a comprehensive set of features designed to streamline the process.\n\n**Note:**\n\n- **DST and Timezone Selection:** When users select a timezone in our \\`DateRangePicker\\`, it's crucial to recognize the impact of Daylight Saving Time (DST).\nIn regions observing DST, the UTC offset can vary depending on the date. For accurate time conversions, we dynamically adjust the UTC offset based on the selected date's DST observance. This ensures precise time representations across different timezones.\n\n\\`\\`\\`jsx\n// You can create a Date Range Picker input dropdown using floating UI and ClickAway.\nexport const _WithInputDropdown = ({\n  onApply,\n  onCancel,\n  selectedDateRange,\n  classNames,\n}: DateRangePickerProps): React.Node => {\n  const [dateRange, setDateRange] = React.useState<DateRangeWithTimezone>({\n    ...selectedDateRange,\n  });\n  const { x, y, refs, strategy } = useFloating({\n    open: true,\n    strategy: 'absolute',\n    placement: 'bottom-start',\n    whileElementsMounted: autoUpdate,\n    middleware: [offset(parseInt(spaceXXSmall))],\n  });\n\n  const onApplyClick = ({startDate, endDate}: DateRangeWithTimezone) => {\n    setDateRange({\n      startDate,\n      endDate,\n    });\n  };\n  const startDate = dateRange.startDate\n    ? formatIsoDate(dateRange.startDate, 'MMM DD, YYYY')\n    : 'MMM DD, YYYY';\n  const endDate = dateRange.endDate\n    ? formatIsoDate(dateRange.endDate, 'MMM DD, YYYY')\n    : 'MMM DD, YYYY';\n\n  return (\n        <ClickAway>\n          {({isOpen = true, onOpen, clickAway, boundaryRef, triggerRef}) => (\n            <div data-testid=\"Dropdown\" className={classify(css.dropdownContainer)}>\n              <Input\n                size=\"small\"\n                placeholder=\"Select Date\"\n                boxRef={mergeRefs([refs.setReference, triggerRef])}\n                value={\n                  startDate.replaceAll('-', '.') +\n                  '  -  ' +\n                  endDate.replaceAll('-', '.')\n                }\n                classNames={{box: classify(css.inputBox)}}\n                iconRightName={isOpen ? 'angle-up' : 'angle-down'}\n                readOnly\n                onContainerClick={(e) => {\n                  e.stopPropagation();\n                  onOpen();\n                }}\n              />\n\n              {isOpen && (\n                <div\n                  ref={mergeRefs([refs.setFloating, boundaryRef])}\n                  style={{\n                    position: strategy,\n                    top: y ?? spaceNone,\n                    left: x ?? spaceNone,\n                    width: sizeFluid,\n                  }}\n                >\n                  <DateRangePicker\n                    onApply={(dateRange: DateRangeWithTimezone) => {\n                      onApplyClick(dateRange);\n                      clickAway();\n                    }}\n                    onCancel={() => {\n                      clickAway();\n                    }}\n                    selectedDateRange={{\n                      ...dateRange,\n                    }}\n                    classNames={classNames}\n                  />\n                </div>\n              )}\n            </div>\n          )}\n        </ClickAway>\n  );\n};\n\\`\\`\\`\n`,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/DateRangePicker/DateRangePicker',\n    },\n  },\n};\n\nexport const DefaultStory = (args: DateRangePickerProps) => (\n  <div className={css.container}>\n    <DateRangePicker {...args} />\n  </div>\n);\n\nDefaultStory.args = {\n  classNames: {wrapper: ''},\n  testId: 'date-range-picker-default-story',\n};\n\nexport const WithSelectedDateRangeStory = (args: DateRangePickerProps) => (\n  <div className={css.container}>\n    <DateRangePicker {...args} />\n  </div>\n);\n\nWithSelectedDateRangeStory.args = {\n  classNames: {wrapper: ''},\n  selectedDateRange: {\n    startDate: '2024-02-04',\n    endDate: '2024-04-16',\n    timezone: 'America/Los_Angeles',\n  },\n  testId: 'date-range-picker-with-selected-date-range-story',\n};\n\nexport const WithInputDropdownStory = ({\n  selectedDateRange,\n  classNames,\n}: DateRangePickerProps) => {\n  const [dateRange, setDateRange] = React.useState<DateRangeWithTimezone>({\n    ...selectedDateRange,\n  });\n  const {x, y, refs, strategy, context} = useFloating({\n    open: true,\n    strategy: 'absolute',\n    placement: 'bottom-start',\n    whileElementsMounted: autoUpdate,\n    middleware: [offset(parseInt(spaceXXSmall))],\n  });\n\n  const onApplyClick = ({startDate, endDate}: DateRangeWithTimezone) => {\n    setDateRange({\n      startDate,\n      endDate,\n    });\n  };\n  const startDate = dateRange.startDate\n    ? formatIsoDate(dateRange.startDate, 'MMM DD, YYYY')\n    : 'MMM DD, YYYY';\n  const endDate = dateRange.endDate\n    ? formatIsoDate(dateRange.endDate, 'MMM DD, YYYY')\n    : 'MMM DD, YYYY';\n\n  return (\n    <ClickAway containsNestedFloatingPortals>\n      {({isOpen = true, onOpen, clickAway, boundaryRef, triggerRef}) => (\n        <div data-testid=\"Dropdown\" className={classify(css.dropdownContainer)}>\n          <Input\n            size=\"small\"\n            placeholder=\"Select Date\"\n            boxRef={mergeRefs([refs.setReference, triggerRef])}\n            value={\n              startDate.replaceAll('-', '.') +\n              '  -  ' +\n              endDate.replaceAll('-', '.')\n            }\n            classNames={{box: classify(css.inputBox)}}\n            iconRightName={isOpen ? 'angle-up' : 'angle-down'}\n            readOnly\n            onContainerClick={(e) => {\n              e.stopPropagation();\n              onOpen();\n            }}\n          />\n\n          {isOpen && (\n            <FloatingPortal>\n              <FloatingFocusManager\n                context={context}\n                initialFocus={refs.reference as React.RefObject<HTMLElement>}\n              >\n                <div\n                  ref={mergeRefs([refs.setFloating, boundaryRef])}\n                  style={{\n                    position: strategy,\n                    top: y ?? spaceNone,\n                    left: x ?? spaceNone,\n                    width: sizeFluid,\n                  }}\n                >\n                  <DateRangePicker\n                    onApply={(dateRange: DateRangeWithTimezone) => {\n                      onApplyClick(dateRange);\n                      clickAway();\n                    }}\n                    onCancel={() => {\n                      clickAway();\n                    }}\n                    selectedDateRange={{\n                      ...dateRange,\n                    }}\n                    classNames={classNames}\n                  />\n                </div>\n              </FloatingFocusManager>\n            </FloatingPortal>\n          )}\n        </div>\n      )}\n    </ClickAway>\n  );\n};\n\nWithInputDropdownStory.args = {\n  classNames: {wrapper: ''},\n  testId: 'date-range-picker-with-input-dropdown-story',\n};\n\nexport const WithMinAndMaxDateStory = (args: DateRangePickerProps) => (\n  <div className={css.container}>\n    <DateRangePicker {...args} />\n  </div>\n);\n\nWithMinAndMaxDateStory.args = {\n  classNames: {wrapper: ''},\n  minDate: getSubtractedDate(formatIsoDate(), 15, 'M') as string,\n  maxDate: formatIsoDate() as string,\n  testId: 'date-range-picker-with-min-and-max-date-story',\n};\nDefaultStory.storyName = 'Default';\nWithSelectedDateRangeStory.storyName = 'With Selected Date Range';\nWithInputDropdownStory.storyName = 'With Input Dropdown';\nWithMinAndMaxDateStory.storyName = 'With Min And Max Date';\n"
        },
        "css": {
          "path": "DateRangePicker.module.css",
          "content": "@value (\n  size580\n) from '../../styles/variables/_size.css';\n\n.container {\n  display: flex;\n  width: size580;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/DateRangePicker/DateRangePicker';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "Calendar.d.ts": {
            "path": "Calendar.d.ts",
            "content": "import * as React from 'react';\nimport type { DateRange } from '../../types';\nimport type { MARKERS, NAVIGATION_ACTION } from '../../utils';\ninterface CalendarProps {\n    value: string;\n    marker: (typeof MARKERS)[keyof typeof MARKERS];\n    minDate?: string;\n    maxDate?: string;\n    hoverDay: string;\n    dateRange: DateRange;\n    inHoverRange: (day: string) => boolean;\n    handlers: {\n        onDayClick: (day: string) => void;\n        onDayHover: (day: string) => void;\n        onMonthNavigate: (marker: (typeof MARKERS)[keyof typeof MARKERS], action: (typeof NAVIGATION_ACTION)[keyof typeof NAVIGATION_ACTION]) => void;\n    };\n    today: string;\n    t: ((key: string, fallback: string) => string) | null | undefined;\n    testId?: string;\n}\ninterface CalendarMobileProps extends Omit<CalendarProps, 'marker' | 'handlers'> {\n    handlers: Omit<CalendarProps['handlers'], 'onMonthNavigate'> & {\n        onMonthNavigate: (action: (typeof NAVIGATION_ACTION)[keyof typeof NAVIGATION_ACTION]) => void;\n    };\n}\nexport declare const Calendar: ({ value, minDate, maxDate, handlers, hoverDay, dateRange, inHoverRange, today, t, testId, }: CalendarProps) => React.JSX.Element;\nexport declare const CalendarMobile: ({ value, minDate, maxDate, handlers, hoverDay, dateRange, inHoverRange, today, t, testId, }: CalendarMobileProps) => React.JSX.Element;\nexport {};\n//# sourceMappingURL=Calendar.d.ts.map"
          },
          "DateRangeWrapper.d.ts": {
            "path": "DateRangeWrapper.d.ts",
            "content": "import type { Flow } from 'flow-to-typescript-codemod';\nimport type { DateRange, DateRangeWithTimezone } from '../../types';\nimport { MARKERS, NAVIGATION_ACTION } from '../../utils';\ninterface DateRangeWrapperProps {\n    dateRange: DateRange;\n    hoverDay: string;\n    minDate: string;\n    maxDate: string;\n    rangeStartMonth: string;\n    rangeEndMonth: string;\n    mobileCalendarMonth: string;\n    cardWrapperClass: string | null | undefined;\n    setRangeStartMonth: (arg1: string) => void;\n    setRangeEndMonth: (arg1: string) => void;\n    setRangeMonth: (arg1: string) => void;\n    setTimezone: (arg1: string) => void;\n    timezone: string;\n    onApply: (datePickerSelectedRange: DateRangeWithTimezone) => void;\n    onCancel: () => void;\n    inHoverRange: (day: string) => boolean;\n    hideTimezone: boolean;\n    handlers: {\n        onDayClick: (day: string) => void;\n        onDayHover: (day: string) => void;\n        onMonthNavigate: (marker: (typeof MARKERS)[keyof typeof MARKERS], action: (typeof NAVIGATION_ACTION)[keyof typeof NAVIGATION_ACTION]) => void;\n    };\n    mobileCalendarHandlers: {\n        onDayClick: (day: string) => void;\n        onDayHover: (day: string) => void;\n        onMonthNavigate: (action: (typeof NAVIGATION_ACTION)[keyof typeof NAVIGATION_ACTION]) => void;\n    };\n    today: string;\n    startDateLabel?: string;\n    endDateLabel?: string;\n    t: ((key: string, fallback: string) => string) | null | undefined;\n    locale?: string;\n    testId?: string;\n}\nexport declare const DateRangeWrapper: Flow.AbstractComponent<DateRangeWrapperProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=DateRangeWrapper.d.ts.map"
          },
          "Day.d.ts": {
            "path": "Day.d.ts",
            "content": "import * as React from 'react';\ninterface DayProps {\n    date: string;\n    value: string;\n    filled: boolean;\n    hoverDay: string;\n    outlined: boolean;\n    disabled: boolean;\n    endOfRange: boolean;\n    highlighted: boolean;\n    startOfRange: boolean;\n    onClick: () => void;\n    onHover: () => void;\n    testId?: string;\n    inDateRange: boolean;\n}\nexport declare const Day: ({ date, value, filled, onHover, onClick, disabled, hoverDay, outlined, endOfRange, highlighted, startOfRange, testId, inDateRange, }: DayProps) => React.JSX.Element;\nexport {};\n//# sourceMappingURL=Day.d.ts.map"
          }
        }
      },
      "allFiles": [
        "Calendar.module.css",
        "Calendar.tsx",
        "DateRangePicker.module.css",
        "DateRangePicker.stories.module.css",
        "DateRangePicker.stories.tsx",
        "DateRangePicker.tsx",
        "DateRangeWrapper.module.css",
        "DateRangeWrapper.tsx",
        "Day.module.css",
        "Day.tsx",
        "index.ts"
      ]
    },
    "Dialog": {
      "name": "Dialog",
      "path": "src/components/Dialog",
      "files": {
        "main": {
          "path": "Dialog.d.ts",
          "content": "import * as React from 'react';\nimport type { ModalProps } from '../../components/Modal';\ntype FooterClassNames = Readonly<{\n    wrapper?: string;\n    actions?: string;\n}>;\nexport declare const DIALOG_SEMANTIC: Readonly<{\n    neutral: \"neutral\";\n    success: \"success\";\n    information: \"information\";\n    warning: \"warning\";\n    danger: \"danger\";\n}>;\nexport type DialogSemanticType = (typeof DIALOG_SEMANTIC)[keyof typeof DIALOG_SEMANTIC];\nexport interface DialogHeaderProps {\n    children?: React.ReactNode;\n    className?: string;\n    testId?: string;\n}\nexport interface DialogFooterProps {\n    children?: React.ReactNode;\n    classNames?: FooterClassNames;\n    testId?: string;\n}\nexport interface DialogBodyProps {\n    children?: React.ReactNode;\n    className?: string;\n    testId?: string;\n}\nexport type DialogPropsBase = ModalProps;\nexport interface DialogProps extends Omit<DialogPropsBase, 'semantic' | 'iconName'> {\n    semantic?: DialogSemanticType;\n    iconName?: string;\n    testId?: string;\n}\nexport interface BasicDialogProps extends Omit<DialogProps, 'heading' | 'body' | 'confirmText' | 'abortText' | 'handleConfirm' | 'handleAbort'> {\n    heading?: React.ReactNode;\n    body?: React.ReactNode;\n    confirmText?: string;\n    abortText?: string;\n    handleConfirm?: (event: React.SyntheticEvent) => unknown;\n    handleAbort?: (event: React.SyntheticEvent) => unknown;\n    testId?: string;\n}\nexport declare const DialogHeader: ({ children, className, testId, }: DialogHeaderProps) => React.JSX.Element;\nexport declare const DialogBody: ({ children, className, testId }: DialogBodyProps) => React.JSX.Element;\nexport declare const DialogFooter: ({ children, classNames, testId, }: DialogFooterProps) => React.JSX.Element;\nexport declare const Dialog: ({ children, isOpen, hideBackdrop, onClose, tapOutsideToClose, iconName, semantic, classNames, testId, ...restDialogProps }: DialogProps) => React.JSX.Element;\nexport declare const BasicDialog: ({ heading, body, confirmText, abortText, handleConfirm, handleAbort, testId, ...restDialogProps }: BasicDialogProps) => React.JSX.Element;\nexport {};\n//# sourceMappingURL=Dialog.d.ts.map"
        },
        "story": {
          "path": "Dialog.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {Button} from 'src/components/Button';\nimport type {DialogProps} from 'src/components/Dialog/Dialog';\nimport {\n  BasicDialog,\n  Dialog,\n  DIALOG_SEMANTIC,\n  DialogBody,\n  DialogFooter,\n  DialogHeader,\n} from 'src/components/Dialog/Dialog';\nimport {BodyLarge, SubTitleLarge} from 'src/components/Text';\n\nimport css from 'src/components/Dialog/Dialog.stories.module.css';\n\n\nconst semanticOptions: Array<unknown> = [...Object.values(DIALOG_SEMANTIC)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Dialog',\n  argTypes: {\n    semantic: {\n      options: semanticOptions,\n      description: 'Semantic type of Dialog',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: DIALOG_SEMANTIC.neutral},\n      },\n    },\n    iconName: {\n      description: 'Custom icon. This overrides the default semantic icon',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    isOpen: {\n      description: 'if **true**, the modal is presented',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    tapOutsideToClose: {\n      description: 'if **true**, closes the modal on tap of backdrop',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    classNames: {\n      description: 'External classnames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{container?: string, content?: string, backdrop?: string}',\n        },\n      },\n    },\n    children: {\n      description: 'The children to rendered inside the Modal window',\n      table: {\n        type: {summary: 'React.Node'},\n      },\n    },\n    onClose: {\n      description: '**onClose** handler is triggered on backdrop click',\n      action: 'clicked',\n      table: {\n        type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n      },\n    },\n    customAnimation: {\n      description: `\\`<Modal>\\` and its derivatives(\\`<Dialog>\\`, \\`<Panel>\\`) support\n      \\`customAnimation: UseTransitionStylesProps\\` prop for\n      all your custom animation needs.\n      It defines the following properties: \\n\\n\n- \\`duration\\` (optional): Specifies the duration of the animation in milliseconds.\nIt can be a single number to set the duration for both opening and closing animations,\nor an object with separate open and close properties to specify different durations\nfor opening and closing animations.\n- \\`initial\\` (optional): Represents the initial CSS styles for the modal component when\nit is first mounted. This property allows you to define the initial appearance of the\nmodal before any animations occur.\n- \\`open\\` (optional): Defines the CSS styles that should be applied when the modal is fully\nopened. This property specifies the appearance of the modal when it transitions from the\ninitial state to the fully open state.\n- \\`close\\` (optional): Specifies the CSS styles for the modal when it is being closed. This\nproperty determines the appearance of the modal when it transitions from the fully open\nstate to the closed state.\n- \\`common\\` (optional): Represents the CSS styles that are common to all states of the modal\ncomponent. These styles will be applied throughout the entire lifecycle of the modal,\nregardless of whether it is in the initial, open, or close state. You can use this property\nto define shared styles that should be present in all states.\n\\n\\nThe modal component follows a predefined order of states as it transitions through\nits lifecycle. It starts in the \\`unmounted\\` state, then moves to the \\`initial\\` state when mounted.\nFrom there, it can transition to the \\`open\\` state when fully opened, and then to the \\`close\\` state\nwhen being closed. Finally, it returns to the \\`unmounted\\` state when it is no longer needed. This\nis the transition order: \\`unmounted\\` -> \\`initial\\` -> \\`open\\` -> \\`close\\` -> \\`unmounted\\`\nBy specifying the appropriate values for the \\`duration\\`, \\`initial\\`, \\`open\\`, \\`close\\`, and \\`common\\` properties,\nyou can control the animation and styling of the modal at each stage of its lifecycle.\n      `,\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: 'UseTransitionStylesProps'},\n      },\n    },\n    hideBackdrop: {\n      description:\n        'if **true**, dark backdrop is removed and transparent backdrop is applied on the DOM',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    initialFocus: {\n      description:\n        'Which element to initially focus. Can be a number (tabbable index as specified by the order)',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: '-1'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Dialog component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Dialog, DialogBody, DialogHeader, DialogFooter } from \"@spaced-out/ui-design-system/lib/components/Dialog\";\n\\`\\`\\`\nA **dialog** is a particular kind of **<a href=\"../?path=/docs/components-modal--docs\">Modal</a>** window that appears in front of the app's content to offer important information or solicit input.\nWhen they appear, dialogues **turn off** all app functions. They stay on screen until they are acknowledged, dismissed, or a necessary action is made.\n\nDialogs should only be used occasionally because they are intended to be disruptive. Dialogs come in multiple variants as listed below.\n\nyou can either use a Basic Dialog or\nSemantically a Dialog component should be composed from \\`DialogHeader\\`, \\`DialogBody\\`, and \\`DialogFooter\\` components,\nthese are nothing but layout components which defines appropriate spacing for the children living in them.\nEach of these components also exposes a className\n\n---\n\n### Overlay Lifecycle Events\n\nDialog emits **strongly-typed window events** when it mounts and unmounts (see **<a href=\"../?path=/docs/components-modal--docs\">Modal docs</a>** for the full API reference, all event types, and advanced usage patterns).\n\nDialog-specific fields in the event payload:\n\n| Field | Value |\n|---|---|\n| \\`overlayType\\` | \\`'Dialog'\\` |\n| \\`semantic\\` | \\`'neutral' \\\\| 'success' \\\\| 'information' \\\\| 'warning' \\\\| 'danger'\\` (from the \\`semantic\\` prop) |\n| \\`hasBackdrop\\` | Derived from \\`hideBackdrop\\` (default \\`true\\` for Dialog) |\n| \\`tapOutsideToClose\\` | Default \\`false\\` for Dialog |\n\n**Listening for Dialog events:**\n\n\\`\\`\\`ts\nimport {\n  OVERLAY_MOUNT_EVENT,\n  OVERLAY_UNMOUNT_EVENT,\n} from \"@spaced-out/ui-design-system/lib/components/Modal\";\n\nwindow.addEventListener(OVERLAY_MOUNT_EVENT, (e) => {\n  if (e.detail.overlayType === 'Dialog') {\n    console.log(\\\\\\`Dialog opened: semantic=\\\\\\${e.detail.semantic}\\\\\\`);\n  }\n});\n\nwindow.addEventListener(OVERLAY_UNMOUNT_EVENT, (e) => {\n  if (e.detail.overlayType === 'Dialog') {\n    console.log(\\\\\\`Dialog closed: id=\\\\\\${e.detail.id}\\\\\\`);\n  }\n});\n\\`\\`\\`\n\n**Filter by semantic type:**\n\n\\`\\`\\`ts\nwindow.addEventListener(OVERLAY_MOUNT_EVENT, (e) => {\n  if (e.detail.overlayType === 'Dialog' && e.detail.semantic === 'danger') {\n    analytics.track('danger_dialog_shown', { testId: e.detail.testId });\n  }\n});\n\\`\\`\\`\n\n**Example payload (Dialog, danger):**\n\n\\`\\`\\`json\n{\n  \"id\": \"g7h8i9\",\n  \"overlayType\": \"Dialog\",\n  \"hasBackdrop\": true,\n  \"tapOutsideToClose\": false,\n  \"allowBackgroundInteraction\": false,\n  \"semantic\": \"danger\",\n  \"testId\": \"confirm-delete-dialog\"\n}\n\\`\\`\\`\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Dialog/Dialog',\n    },\n  },\n};\n\nexport const DialogStory = (args: DialogProps) => {\n  const [isOpen, setIsOpen] = React.useState(args.isOpen);\n\n  React.useEffect(() => {\n    setIsOpen(args.isOpen);\n  }, [args.isOpen]);\n\n  return (\n    <div className={css.container}>\n      <Button onClick={() => setIsOpen(!isOpen)}>Open Dialog</Button>\n      <Dialog {...args} isOpen={isOpen} onClose={() => setIsOpen(false)}>\n        <DialogHeader>\n          <SubTitleLarge> Dialog Title</SubTitleLarge>\n        </DialogHeader>\n\n        <DialogBody>\n          <BodyLarge color=\"secondary\">\n            Dialogs should only be used occasionally because they are intended\n            to be disruptive. Dialogs come in multiple variants.\n          </BodyLarge>\n        </DialogBody>\n\n        <DialogFooter>\n          <Button type=\"tertiary\" isFluid onClick={() => setIsOpen(false)}>\n            Close\n          </Button>\n\n          <Button type=\"primary\" isFluid onClick={() => setIsOpen(false)}>\n            Confirm\n          </Button>\n        </DialogFooter>\n      </Dialog>\n    </div>\n  );\n};\n\nDialogStory.args = {\n  classNames: {container: ''},\n  initialFocus: 1,\n  semantic: 'neutral',\n  testId: 'dialog-story',\n};\n\n/**\n * Basic Dialog supports these additional props <br><br>\n * `heading?: React.Node` <br>\n * `body?: React.Node` <br>\n * `confirmText?: string` <br>\n * `abortText?: string` <br>\n * `handleConfirm?: (event: SyntheticEvent<>) => mixed` <br>\n * `handleAbort?: (event: SyntheticEvent<>) => mixed`\n */\nexport const BasicDialogStory = (args: DialogProps) => {\n  const [isOpen, setIsOpen] = React.useState(args.isOpen);\n\n  React.useEffect(() => {\n    setIsOpen(args.isOpen);\n  }, [args.isOpen]);\n\n  return (\n    <div className={css.container}>\n      <Button onClick={() => setIsOpen(!isOpen)}>Open Basic Dialog</Button>\n      <BasicDialog\n        {...args}\n        isOpen={isOpen}\n        onClose={() => setIsOpen(false)}\n        handleAbort={() => setIsOpen(false)}\n        handleConfirm={() => setIsOpen(false)}\n      />\n    </div>\n  );\n};\n\nBasicDialogStory.args = {\n  semantic: 'danger',\n  heading: 'Dialog Title',\n  body: 'A basic dialog supports text props to prepare content. You don\\'t need to import semantic components to prepare the desired layout.',\n  abortText: 'Close',\n  confirmText: 'Confirm',\n  testId: 'basic-dialog-story',\n};\nDialogStory.storyName = 'Dialog';\nBasicDialogStory.storyName = 'Basic Dialog';\n"
        },
        "css": {
          "path": "Dialog.module.css",
          "content": "@value (spaceLarge, spaceXSmall, spaceMedium, spaceSmall) from '../../styles/variables/_space.css';\n@value (size42, size380, sizeFluid) from '../../styles/variables/_size.css';\n@value (borderRadiusMedium, borderRadiusCircle) from '../../styles/variables/_border.css';\n@value (\n  colorNeutralLightest,\n  colorSuccessLightest,\n  colorInformationLightest,\n  colorWarningLightest,\n  colorDangerLightest\n) from '../../styles/variables/_color.css';\n\n.dialog {\n  composes: boxShadow4 from '../../styles/shadow.module.css';\n  border-radius: borderRadiusMedium;\n  padding: spaceMedium;\n  max-width: size380;\n}\n\n.dialogHeader {\n  composes: subTitleLarge from '../../styles/typography.module.css';\n  display: flex;\n  flex-flow: column;\n  justify-content: center;\n}\n\n.topBlock {\n  display: flex;\n  flex-flow: column;\n  justify-content: center;\n  align-items: center;\n  margin-bottom: spaceMedium;\n}\n\n.iconContainer {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: size42;\n  height: size42;\n  border-radius: borderRadiusCircle;\n}\n\n.headerContent {\n  display: flex;\n}\n\n.neutral {\n  background-color: colorNeutralLightest;\n}\n\n.success {\n  background-color: colorSuccessLightest;\n}\n\n.information {\n  background-color: colorInformationLightest;\n}\n\n.warning {\n  background-color: colorWarningLightest;\n}\n\n.danger {\n  background-color: colorDangerLightest;\n}\n\n.dialogBody {\n  margin-top: spaceXSmall;\n  display: flex;\n  height: sizeFluid;\n  overflow: auto;\n  text-align: center;\n}\n\n.dialogFooter {\n  margin-top: spaceLarge;\n  display: flex;\n  justify-content: flex-end;\n  align-items: center;\n  gap: spaceMedium;\n}\n\n.dialogFooterActions {\n  display: flex;\n  gap: spaceSmall;\n  width: sizeFluid;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Dialog/Dialog';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "Dialog.module.css",
        "Dialog.stories.module.css",
        "Dialog.stories.tsx",
        "Dialog.tsx",
        "index.ts"
      ]
    },
    "Disclaimer": {
      "name": "Disclaimer",
      "path": "src/components/Disclaimer",
      "files": {
        "main": {
          "path": "Disclaimer.d.ts",
          "content": "import type { Flow } from 'flow-to-typescript-codemod';\nimport type { BannerProps } from '../../components/Banner';\nexport type DisclaimerProps = BannerProps;\nexport declare const Disclaimer: Flow.AbstractComponent<DisclaimerProps, HTMLDivElement>;\n//# sourceMappingURL=Disclaimer.d.ts.map"
        },
        "story": {
          "path": "Disclaimer.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {DisclaimerProps} from 'src/components/Disclaimer';\nimport {Disclaimer} from 'src/components/Disclaimer/Disclaimer';\n\nimport css from 'src/components/Disclaimer/Disclaimer.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'AI Prompt Components/Disclaimer',\n  component: Disclaimer,\n  argTypes: {\n    actionText: {\n      name: 'actionText',\n      description: 'Action text to be displayed on **right** of Alert',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    onAction: {\n      name: 'onAction',\n      action: 'Action Click',\n      description: 'Callback function for action text click',\n      type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n    },\n    alignment: {\n      options: ['top', 'bottom'],\n      description:\n        'Semantic type of Banner. It will have different Icon and background color for different semantic type',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'top'},\n      },\n    },\n    dismissable: {\n      description: 'Close Icon will appear in right side in case it is true',\n      name: 'dismissable',\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    onCloseClick: {\n      name: 'onCloseClick',\n      action: 'Close Click',\n      description: 'Callback function for dismissable alert',\n      type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n    },\n    selfDismiss: {\n      description: `This prop is valid only in case dismissable is true.\n      It handles whether the dismissal should be handled by the component or it will just pass callback onclick of closeIcon and dismissal will be handled externally`,\n      name: 'selfDismiss',\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    semantic: {\n      description:\n        'Semantic type of Banner. It will have different Icon and background color for different semantic type',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        disable: true,\n      },\n    },\n    leftIconName: {\n      name: 'leftIconName',\n      control: {\n        type: 'text',\n      },\n      description: 'Custom left icon. This overrides the default semantic icon',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    leftIconType: {\n      options: ['regular', 'solid'],\n      description: 'Type of Icon',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'regular'},\n      },\n    },\n    children: {\n      description: 'Pass the alert message text as children',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    classNames: {\n      description:\n        'Provide an optional className to be applied to the wrapper, alertText',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary:\n            '{wrapper?: string, alertText?: string, actionContainer?: string}',\n        },\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Disclaimer component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Disclaimer } from \"@spaced-out/ui-design-system/lib/components/Disclaimer\";\n\\`\\`\\`\nUse Disclaimer component to show alert message specific of AI Prompts use cases. It will take width of the container\nand will show only two lines of text. Post that it will get truncated. As there is no way for user to see the truncated message, it is recommended\nto use it for messages up to two lines only or add a tooltip along with it for showcasing complete message.\n\nDisclaimer should ideally be absolutely positioned and should stick to top or bottom of container\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Disclaimer/Disclaimer',\n    },\n  },\n};\n\nexport const DisclaimerStory = (args: DisclaimerProps) => (\n  <div className={css.container}>\n    <Disclaimer {...args} />\n  </div>\n);\n\nDisclaimerStory.args = {\n  children: 'Always check content generated by AI',\n  testId: 'disclaimer-story',\n};\nDisclaimerStory.storyName = 'Disclaimer';\n"
        },
        "css": {
          "path": "Disclaimer.module.css",
          "content": "@value (\n  colorBorderPrimary,\n  colorTextPrimary,\n  colorBackgroundTertiary\n) from '../../styles/variables/_color.css';\n\n.disclaimerWrapper {\n  background-color: colorBackgroundTertiary;\n  border-color: colorBorderPrimary;\n}\n\n.iconWrapper {\n  color: colorTextPrimary;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Disclaimer/Disclaimer';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "Disclaimer.module.css",
        "Disclaimer.stories.module.css",
        "Disclaimer.stories.tsx",
        "Disclaimer.tsx",
        "index.ts"
      ]
    },
    "DraggableWrapper": {
      "name": "DraggableWrapper",
      "path": "src/components/DraggableWrapper",
      "files": {
        "main": {
          "path": "DraggableWrapper.d.ts",
          "content": "import * as React from 'react';\nexport type DraggableWrapperClassNames = Readonly<{\n    /** Override or extend the root wrapper element. */\n    wrapper?: string;\n    /** Override or extend the drag handle element. */\n    dragHandle?: string;\n}>;\nexport interface DraggableWrapperProps extends Pick<React.HTMLAttributes<HTMLDivElement>, 'onDragStart' | 'onDragEnd' | 'onDragOver' | 'onDrop'> {\n    children: React.ReactNode;\n    /** Applies the dragging visual state (purple outline + reduced opacity). */\n    isDragging?: boolean;\n    /** Label for the drag handle (tooltip and aria-label). Pass a translated string for i18n. */\n    dragHandleLabel?: string;\n    /** Class names to override or extend internal elements (e.g. from parent CSS modules). */\n    classNames?: DraggableWrapperClassNames;\n    /**\n     * Called when the user presses ArrowUp/ArrowLeft or ArrowDown/ArrowRight while\n     * the item is keyboard-grabbed. Use this to reorder the list in state.\n     */\n    onKeyboardReorder?: (direction: 'up' | 'down') => void;\n    testId?: string;\n    /** Set false when using @dnd-kit / react-beautiful-dnd (pointer-event libs). Keep true for react-dnd HTML5 backend. Default true. */\n    enableNativeDrag?: boolean;\n    /** Extra props to spread on the wrapper (library listeners/attributes). */\n    wrapperProps?: React.HTMLAttributes<HTMLDivElement>;\n    /** Extra props to spread on the drag handle (some libs attach activator listeners here). */\n    dragHandleProps?: React.HTMLAttributes<HTMLDivElement>;\n    /** Separate ref for the drag handle (for libs with setActivatorNodeRef / react-dnd's drag). */\n    dragHandleRef?: React.Ref<HTMLDivElement>;\n}\nexport declare const DraggableWrapper: React.ForwardRefExoticComponent<DraggableWrapperProps & React.RefAttributes<HTMLDivElement>>;\n//# sourceMappingURL=DraggableWrapper.d.ts.map"
        },
        "story": {
          "path": "DraggableWrapper.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {TEXT_COLORS} from 'src/types/typography';\nimport classify from 'src/utils/classify';\n\nimport {ColumnChart} from 'src/components/Charts/ColumnChart';\nimport {DraggableWrapper} from 'src/components/DraggableWrapper';\nimport {Icon} from 'src/components/Icon';\nimport {KPIBox} from 'src/components/KPIBox';\nimport {BasicSingleCell, type GenericObject, Table} from 'src/components/Table';\nimport {BodyMediumBold, BodySmall} from 'src/components/Text';\n\nimport css from 'src/components/DraggableWrapper/DraggableWrapper.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/DraggableWrapper',\n  component: DraggableWrapper,\n  argTypes: {\n    children: {\n      description: 'The component to wrap with drag-to-reorder behavior.',\n      control: {type: 'object'},\n      table: {\n        type: {summary: 'React.ReactNode'},\n      },\n    },\n    isDragging: {\n      description:\n        'Applies the dragging visual state (50% opacity + purple ring) to the placeholder left in place while dragging.',\n      control: {type: 'boolean'},\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    dragHandleLabel: {\n      description:\n        'Accessible label for the drag handle — used as `aria-label` and tooltip text. Pass a translated string for i18n.',\n      control: {type: 'text'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: '\\'Drag to move\\''},\n      },\n    },\n    classNames: {\n      description:\n        'Class names to override or extend internal elements (e.g. from parent CSS modules).',\n      control: {type: 'object'},\n      table: {\n        type: {summary: '{wrapper?: string; dragHandle?: string}'},\n      },\n    },\n    onKeyboardReorder: {\n      description:\n        'Called with `\"up\"` or `\"down\"` when the user presses ArrowUp/ArrowLeft or ArrowDown/ArrowRight while the item is keyboard-grabbed. Use this to reorder the list in state.',\n      table: {\n        type: {summary: '(direction: \\'up\\' | \\'down\\') => void'},\n      },\n    },\n    onDragStart: {\n      description:\n        'Standard HTML `dragstart` event handler. Set `isDragging` and store the dragging id here.',\n      table: {\n        type: {summary: 'React.DragEventHandler<HTMLDivElement>'},\n      },\n    },\n    onDragEnd: {\n      description:\n        'Standard HTML `dragend` event handler. Commit the reorder and clear `isDragging` here.',\n      table: {\n        type: {summary: 'React.DragEventHandler<HTMLDivElement>'},\n      },\n    },\n    onDragOver: {\n      description:\n        'Standard HTML `dragover` event handler. Call `e.preventDefault()` and store the current drop target id here.',\n      table: {\n        type: {summary: 'React.DragEventHandler<HTMLDivElement>'},\n      },\n    },\n    onDrop: {\n      description:\n        'Standard HTML `drop` event handler. Call `e.preventDefault()` to allow the drop.',\n      table: {\n        type: {summary: 'React.DragEventHandler<HTMLDivElement>'},\n      },\n    },\n    testId: {\n      description:\n        'Test ID for the component root. The drag handle receives `{testId}-drag-handle`.',\n      control: {type: 'text'},\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generic drag-to-reorder wrapper for any component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { DraggableWrapper } from \"@spaced-out/ui-design-system/lib/components/DraggableWrapper\";\n\\`\\`\\`\n\\`DraggableWrapper\\` adds drag-to-reorder behavior to any component without modifying it.\nIt shows a grip handle on hover and applies the dragging visual state\n(50% opacity + purple ring) when \\`isDragging\\` is \\`true\\`.\n\nThe parent manages all drag logic — pass the standard HTML drag event handlers\nand control item order in state.\n\n### Mouse usage\n\n\\`\\`\\`jsx\nconst [draggingId, setDraggingId] = React.useState(null);\nconst draggingIdRef = React.useRef(null);\nconst dragOverIdRef = React.useRef(null);\n\n<DraggableWrapper\n  isDragging={draggingId === item.id}\n  onDragStart={() => { setDraggingId(item.id); draggingIdRef.current = item.id; }}\n  onDragEnd={() => { /* reorder logic */ setDraggingId(null); }}\n  onDragOver={(e) => { e.preventDefault(); dragOverIdRef.current = item.id; }}\n  onDrop={(e) => e.preventDefault()}\n  onKeyboardReorder={(direction) => { /* move item up or down in state */ }}\n>\n  <YourComponent />\n</DraggableWrapper>\n\\`\\`\\`\n\n### Keyboard usage\n\nTab to the grip handle, press **Enter** or **Space** to grab, **Arrow keys** to move, **Enter/Space** or **Escape** to drop.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/DraggableWrapper/DraggableWrapper',\n    },\n  },\n};\n\n// ── Reorder helpers ────────────────────────────────────────────\n\nfunction reorder<T>(\n  list: T[],\n  fromId: string,\n  toId: string,\n  getId: (item: T) => string,\n): T[] {\n  const next = [...list];\n  const from = next.findIndex((item) => getId(item) === fromId);\n  const to = next.findIndex((item) => getId(item) === toId);\n  const [item] = next.splice(from, 1);\n  next.splice(to, 0, item);\n  return next;\n}\n\nfunction moveItem<T>(\n  list: T[],\n  id: string,\n  direction: 'up' | 'down',\n  getId: (item: T) => string,\n): T[] {\n  const next = [...list];\n  const index = next.findIndex((item) => getId(item) === id);\n  const swapIndex = direction === 'up' ? index - 1 : index + 1;\n  if (swapIndex < 0 || swapIndex >= next.length) {\n    return next;\n  }\n  [next[index], next[swapIndex]] = [next[swapIndex], next[index]];\n  return next;\n}\n\n// ── KPI tiles ─────────────────────────────────────────────────\n\ninterface KPITile {\n  id: string;\n  iconName: string;\n  topContent: string;\n  middleContent: string;\n  bottomContent: string;\n}\n\nconst INITIAL_KPI_TILES: KPITile[] = [\n  {\n    id: '1',\n    iconName: 'users',\n    topContent: 'Total Users',\n    middleContent: '10,000',\n    bottomContent: '10% (1,000 total)',\n  },\n  {\n    id: '2',\n    iconName: 'money-bill',\n    topContent: 'Total Sales',\n    middleContent: '$1,234,567',\n    bottomContent: '5% (500 total)',\n  },\n  {\n    id: '3',\n    iconName: 'chart-bar',\n    topContent: 'Active Sessions',\n    middleContent: '3,421',\n    bottomContent: '2% (68 total)',\n  },\n];\n\nexport const WithKPIBoxes = () => {\n  const [tiles, setTiles] = React.useState<KPITile[]>(INITIAL_KPI_TILES);\n  const [draggingId, setDraggingId] = React.useState<string | null>(null);\n  const draggingIdRef = React.useRef<string | null>(null);\n  const dragOverIdRef = React.useRef<string | null>(null);\n\n  const handleKpiDragEnd = () => {\n    const fromId = draggingIdRef.current;\n    const toId = dragOverIdRef.current;\n    if (fromId && toId && fromId !== toId) {\n      setTiles((prev) => reorder(prev, fromId, toId, (t) => t.id));\n    }\n    setDraggingId(null);\n    draggingIdRef.current = null;\n    dragOverIdRef.current = null;\n  };\n\n  return (\n    <div className={css.row}>\n      {tiles.map((tile) => (\n        <DraggableWrapper\n          key={tile.id}\n          isDragging={draggingId === tile.id}\n          testId={`kpi-draggable-${tile.id}`}\n          onDragStart={() => {\n            setDraggingId(tile.id);\n            draggingIdRef.current = tile.id;\n          }}\n          onDragEnd={handleKpiDragEnd}\n          onDragOver={(e) => {\n            e.preventDefault();\n            dragOverIdRef.current = tile.id;\n          }}\n          onDrop={(e) => e.preventDefault()}\n          onKeyboardReorder={(direction) => {\n            setTiles((prev) => moveItem(prev, tile.id, direction, (t) => t.id));\n          }}\n        >\n          <KPIBox\n            iconName={tile.iconName}\n            iconType=\"duotone\"\n            topContent={tile.topContent}\n            middleContent={tile.middleContent}\n            bottomContent={\n              <div className={css.bottomContent}>\n                <Icon size=\"small\" name=\"arrow-right-long\" color=\"neutral\" />\n                <span>{tile.bottomContent}</span>\n              </div>\n            }\n            classNames={{wrapper: css.noWrapperBorder}}\n          />\n        </DraggableWrapper>\n      ))}\n    </div>\n  );\n};\nWithKPIBoxes.storyName = 'With KPI Boxes';\n\n// ── Tables ────────────────────────────────────────────────────\n\ninterface RowData extends GenericObject {\n  id: string;\n  name: string;\n  email: string;\n}\n\nconst NameCell = ({data}: {data: RowData}) => (\n  <BasicSingleCell>\n    <BodySmall color={TEXT_COLORS.secondary}>{data.name}</BodySmall>\n  </BasicSingleCell>\n);\n\nconst EmailCell = ({data}: {data: RowData}) => (\n  <BasicSingleCell>\n    <BodyMediumBold>{data.email}</BodyMediumBold>\n  </BasicSingleCell>\n);\n\nconst tableHeaders = [\n  {label: 'Name', key: 'name', sortable: false, render: NameCell},\n  {label: 'Email', key: 'email', sortable: false, render: EmailCell},\n];\n\ninterface DraggableTable {\n  id: string;\n  entries: RowData[];\n}\n\nconst INITIAL_TABLES: DraggableTable[] = [\n  {\n    id: 't1',\n    entries: [\n      {id: 't1-1', name: 'Alice Johnson', email: 'alice@eng.com'},\n      {id: 't1-2', name: 'Bob Smith', email: 'bob@eng.com'},\n      {id: 't1-3', name: 'Carol White', email: 'carol@eng.com'},\n    ],\n  },\n  {\n    id: 't2',\n    entries: [\n      {id: 't2-1', name: 'David Lee', email: 'david@mkt.com'},\n      {id: 't2-2', name: 'Emma Davis', email: 'emma@mkt.com'},\n      {id: 't2-3', name: 'Frank Brown', email: 'frank@mkt.com'},\n    ],\n  },\n  {\n    id: 't3',\n    entries: [\n      {id: 't3-1', name: 'Grace Kim', email: 'grace@sales.com'},\n      {id: 't3-2', name: 'Henry Wilson', email: 'henry@sales.com'},\n      {id: 't3-3', name: 'Iris Chen', email: 'iris@sales.com'},\n    ],\n  },\n];\n\nexport const WithTables = () => {\n  const [tables, setTables] = React.useState<DraggableTable[]>(INITIAL_TABLES);\n  const [draggingId, setDraggingId] = React.useState<string | null>(null);\n  const draggingIdRef = React.useRef<string | null>(null);\n  const dragOverIdRef = React.useRef<string | null>(null);\n\n  const handleDragEnd = () => {\n    const fromId = draggingIdRef.current;\n    const toId = dragOverIdRef.current;\n    if (fromId && toId && fromId !== toId) {\n      setTables((prev) => reorder(prev, fromId, toId, (t) => t.id));\n    }\n    setDraggingId(null);\n    draggingIdRef.current = null;\n    dragOverIdRef.current = null;\n  };\n\n  return (\n    <div className={css.column}>\n      {tables.map((table) => (\n        <DraggableWrapper\n          key={table.id}\n          isDragging={draggingId === table.id}\n          classNames={{wrapper: css.tableWrapper}}\n          testId={`table-draggable-${table.id}`}\n          onDragStart={() => {\n            setDraggingId(table.id);\n            draggingIdRef.current = table.id;\n          }}\n          onDragEnd={handleDragEnd}\n          onDragOver={(e) => {\n            e.preventDefault();\n            dragOverIdRef.current = table.id;\n          }}\n          onDrop={(e) => e.preventDefault()}\n          onKeyboardReorder={(direction) => {\n            setTables((prev) =>\n              moveItem(prev, table.id, direction, (t) => t.id),\n            );\n          }}\n        >\n          <Table<RowData, GenericObject>\n            headers={tableHeaders}\n            entries={table.entries}\n            sortable={false}\n            classNames={{wrapper: css.noWrapperBorder}}\n          />\n        </DraggableWrapper>\n      ))}\n    </div>\n  );\n};\nWithTables.storyName = 'With Tables';\n\n// ── Chart + Table row ─────────────────────────────────────────\n\nconst columnChartSeries = [\n  {\n    name: 'Inbound Sourced',\n    data: [\n      {name: 'Q1.23', y: 40629},\n      {name: 'Q2.23', y: 26000},\n      {name: 'Q3.23', y: 10700},\n      {name: 'Q4.23', y: 38300},\n    ],\n  },\n  {\n    name: 'Outbound Sourced',\n    data: [\n      {name: 'Q1.23', y: 31086},\n      {name: 'Q2.23', y: 13600},\n      {name: 'Q3.23', y: 45000},\n      {name: 'Q4.23', y: 41000},\n    ],\n  },\n];\n\nconst columnChartXAxis = {title: {text: 'Quarter'}};\nconst columnChartYAxis = {title: {text: 'Amount Sourced'}};\nconst columnChartLegend = {enabled: true, shadow: false};\n\nconst CHART_AND_TABLE_ENTRIES: RowData[] = [\n  {id: 'r1', name: 'Alice Johnson', email: 'alice@example.com'},\n  {id: 'r2', name: 'Bob Smith', email: 'bob@example.com'},\n  {id: 'r3', name: 'Carol White', email: 'carol@example.com'},\n  {id: 'r4', name: 'David Lee', email: 'david@example.com'},\n  {id: 'r5', name: 'Emma Davis', email: 'emma@example.com'},\n  {id: 'r6', name: 'Frank Brown', email: 'frank@example.com'},\n  {id: 'r7', name: 'Grace Kim', email: 'grace@example.com'},\n  {id: 'r8', name: 'Henry Wilson', email: 'henry@example.com'},\n  {id: 'r9', name: 'Iris Chen', email: 'iris@example.com'},\n  {id: 'r10', name: 'Jack Martinez', email: 'jack@example.com'},\n];\n\ntype WidgetId = 'chart' | 'table';\n\nconst WIDGET_ORDER: WidgetId[] = ['chart', 'table'];\n\nexport const WithChartAndTable = () => {\n  const [widgetOrder, setWidgetOrder] =\n    React.useState<WidgetId[]>(WIDGET_ORDER);\n  const [draggingId, setDraggingId] = React.useState<WidgetId | null>(null);\n  const draggingIdRef = React.useRef<WidgetId | null>(null);\n  const dragOverIdRef = React.useRef<WidgetId | null>(null);\n\n  const handleDragEnd = () => {\n    const fromId = draggingIdRef.current;\n    const toId = dragOverIdRef.current;\n    if (fromId && toId && fromId !== toId) {\n      setWidgetOrder((prev) => reorder(prev, fromId, toId, (id) => id));\n    }\n    setDraggingId(null);\n    draggingIdRef.current = null;\n    dragOverIdRef.current = null;\n  };\n\n  return (\n    <div className={classify(css.row, css.rowEqualHeight)}>\n      {widgetOrder.map((widgetId) =>\n        widgetId === 'chart' ? (\n          <DraggableWrapper\n            key=\"chart\"\n            classNames={{\n              wrapper: css.widgetWrapper,\n              dragHandle: css.dragHandleChart,\n            }}\n            testId=\"widget-chart-1\"\n            isDragging={draggingId === 'chart'}\n            onDragStart={() => {\n              setDraggingId('chart');\n              draggingIdRef.current = 'chart';\n            }}\n            onDragEnd={handleDragEnd}\n            onDragOver={(e) => {\n              e.preventDefault();\n              dragOverIdRef.current = 'chart';\n            }}\n            onDrop={(e) => e.preventDefault()}\n            onKeyboardReorder={(direction) => {\n              setWidgetOrder((prev) =>\n                moveItem(prev, 'chart', direction, (id) => id),\n              );\n            }}\n          >\n            <ColumnChart\n              cardTitle=\"Trend\"\n              series={columnChartSeries}\n              xAxis={columnChartXAxis}\n              yAxis={columnChartYAxis}\n              legend={columnChartLegend}\n              classNames={{wrapper: css.noWrapperBorder}}\n            />\n          </DraggableWrapper>\n        ) : (\n          <DraggableWrapper\n            key=\"table\"\n            classNames={{wrapper: css.widgetWrapper}}\n            testId=\"widget-table-1\"\n            isDragging={draggingId === 'table'}\n            onDragStart={() => {\n              setDraggingId('table');\n              draggingIdRef.current = 'table';\n            }}\n            onDragEnd={handleDragEnd}\n            onDragOver={(e) => {\n              e.preventDefault();\n              dragOverIdRef.current = 'table';\n            }}\n            onDrop={(e) => e.preventDefault()}\n            onKeyboardReorder={(direction) => {\n              setWidgetOrder((prev) =>\n                moveItem(prev, 'table', direction, (id) => id),\n              );\n            }}\n          >\n            <Table<RowData, GenericObject>\n              headers={tableHeaders}\n              entries={CHART_AND_TABLE_ENTRIES}\n              sortable={false}\n              classNames={{wrapper: css.noWrapperBorder}}\n            />\n          </DraggableWrapper>\n        ),\n      )}\n    </div>\n  );\n};\nWithChartAndTable.storyName = 'With Chart And Table';\n"
        },
        "css": {
          "path": "DraggableWrapper.module.css",
          "content": "@value (colorBorderTertiary, colorFillPrimary, colorButtonFillSecondaryPressed) from '../../styles/variables/_color.css';\n@value (spaceSmall) from '../../styles/variables/_space.css';\n@value (borderRadiusMedium, borderWidthPrimary, borderWidthTertiary) from '../../styles/variables/_border.css';\n@value (motionDurationNormal, motionEaseInEaseOut) from '../../styles/variables/_motion.css';\n@value (opacity50, opacity100, opacity0) from '../../styles/variables/_opacity.css';\n@value (elevationCard) from '../../styles/variables/_elevation.css';\n\n.wrapper {\n  position: relative;\n  border: borderWidthPrimary solid colorBorderTertiary;\n  border-radius: borderRadiusMedium;\n}\n\n.wrapper:hover:not(.dragging) {\n  outline: borderWidthPrimary solid colorBorderTertiary;\n  outline-offset: calc(-1 * borderWidthPrimary);\n}\n\n/* ── Drag handle ──────────────────────────────────────────── */\n\n.dragHandle {\n  position: absolute;\n  top: spaceSmall;\n  left: borderWidthPrimary;\n  opacity: opacity0;\n  cursor: grab;\n  transition: opacity motionDurationNormal motionEaseInEaseOut;\n  line-height: 0;\n  z-index: calc(elevationCard / 4);\n  border-radius: borderRadiusMedium;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .dragHandle {\n    transition: none;\n  }\n}\n\n.dragHandle:focus-within {\n  opacity: opacity100;\n}\n\n.wrapper:hover .dragHandle {\n  opacity: opacity100;\n}\n\n/* ── Dragging state ───────────────────────────────────────── */\n\n.wrapper.dragging {\n  opacity: opacity50;\n  border: borderWidthPrimary solid colorFillPrimary;\n  outline: borderWidthTertiary solid colorButtonFillSecondaryPressed;\n  outline-offset: borderWidthPrimary;\n}\n\n.wrapper.dragging .dragHandle {\n  opacity: opacity100;\n  cursor: grabbing;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export { DraggableWrapper } from '../../components/DraggableWrapper/DraggableWrapper';\nexport type { DraggableWrapperProps, DraggableWrapperClassNames, } from '../../components/DraggableWrapper/DraggableWrapper';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "DraggableWrapper.module.css",
        "DraggableWrapper.stories.module.css",
        "DraggableWrapper.stories.tsx",
        "DraggableWrapper.tsx",
        "index.ts"
      ]
    },
    "Dropdown": {
      "name": "Dropdown",
      "path": "src/components/Dropdown",
      "files": {
        "main": {
          "path": "Dropdown.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { ClickAwayRefType } from '../../utils/click-away';\nimport type { InputProps } from '../../components/Input';\nimport type { MenuOption, MenuProps } from '../../components/Menu';\nimport type { ElevationType } from '../../components/Tooltip';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    box?: string;\n    iconRight?: string;\n}>;\nexport interface DropdownProps extends Omit<InputProps, 'classNames' | 'onChange' | 'onMenuOpen' | 'onMenuClose' | 'scrollMenuToBottom' | 'dropdownInputText' | 'menu' | 'elevation' | 'clickAwayRef'> {\n    classNames?: ClassNames;\n    onChange?: (option: MenuOption, arg2?: React.SyntheticEvent<HTMLElement> | null | undefined) => unknown;\n    onMenuOpen?: () => unknown;\n    onMenuClose?: () => unknown;\n    scrollMenuToBottom?: boolean;\n    dropdownInputText?: string;\n    menu?: MenuProps;\n    elevation?: ElevationType;\n    clickAwayRef?: React.RefObject<ClickAwayRefType | null>;\n    /**\n     * Opt in to the accessibility behavior: the `combobox` role and its ARIA,\n     * keyboard navigation of the options from the input, and focus returning to\n     * the input on close. Forwarded to the `Menu` this opens.\n     *\n     * Off by default, and off is this component exactly as it behaved before any\n     * of it existed.\n     */\n    enableA11y?: boolean;\n    testId?: string;\n}\nexport declare const Dropdown: Flow.AbstractComponent<DropdownProps, HTMLInputElement>;\nexport {};\n//# sourceMappingURL=Dropdown.d.ts.map"
        },
        "story": {
          "path": "Dropdown.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {ClickAwayRefType} from 'src/utils/click-away';\nimport {\n  getSelectedKeysFromSelectedOption,\n  getTextLabelFromSelectedKeys,\n} from 'src/utils/menu';\n\nimport {Button} from 'src/components/Button';\nimport type {DropdownProps} from 'src/components/Dropdown/Dropdown';\nimport {Dropdown} from 'src/components/Dropdown/Dropdown';\nimport {Icon} from 'src/components/Icon';\nimport type {\n  MenuGroupTitleOption,\n  MenuOption,\n  MenuProps,\n} from 'src/components/Menu';\nimport {MenuFooter, MenuHeader} from 'src/components/Menu/Menu.stories';\nimport {FormLabelSmall} from 'src/components/Text';\nimport {ELEVATION_TYPES, Tooltip} from 'src/components/Tooltip';\n\nimport css from 'src/components/Dropdown/Dropdown.stories.module.css';\n\n\nconst options: MenuOption[] = [\n  {\n    key: '1',\n    label: 'Option one',\n    iconLeft: 'coffee',\n  },\n  {key: '2', label: 'Option two', iconLeft: 'user'},\n  {\n    key: '4',\n    label:\n      'Option three is a very long option that would truncate and keep going to make it even longer than before. You can hover over the label to see the full text. ShowLabelTooltip maxLines is used to define the number of lines to show in the tooltip.',\n    iconLeft: 'face-party',\n  },\n  {\n    key: '5',\n    label: 'Option five(disabled)',\n    disabled: true,\n    iconLeft: 'flag',\n  },\n  {\n    key: '6',\n    label: 'Option six(disabled) very long option that would truncate',\n    disabled: true,\n    iconLeft: 'camera',\n  },\n  {\n    key: '7',\n    label: 'Option seven',\n    iconLeft: 'coffee',\n  },\n  {key: '8', label: 'Option eight', iconLeft: 'user'},\n  {\n    key: '9',\n    label: 'Option nine',\n    iconLeft: 'face-party',\n  },\n];\n\nconst elevationOptions: Array<unknown> = [...Object.values(ELEVATION_TYPES)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Form Components/Dropdown/Generic Dropdown',\n  component: Dropdown,\n  argTypes: {\n    enableA11y: {\n      description:\n        '**enableA11y** opts into the accessibility behavior: the `combobox` role and its ARIA, keyboard navigation of the options from the input, and focus returning to the input on close. Off by default, where the component behaves exactly as it did before any of it existed. Off here too, as everywhere: turn the control on to see the accessible behavior.',\n      control: {type: 'boolean'},\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    size: {\n      description:\n        'Dropdown supports only two size variants namely small and medium. `small` < `medium`',\n      options: ['medium', 'small'],\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    menu: {\n      description: 'Menu props to use',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: 'MenuProps'},\n      },\n    },\n    name: {\n      description: 'Name of the Dropdown',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    elevation: {\n      description:\n        'Elevation level for the dropdown menu. This controls the z-index stacking order. Default is set to \"modal\" elevation. Use higher elevation levels when rendering the dropdown above other elevated elements like Modal, Toast, etc.',\n      control: {\n        type: 'select',\n      },\n      options: elevationOptions,\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'modal'},\n      },\n    },\n    disabled: {\n      description: 'if **true**, the component is disabled',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    placeholder: {\n      description: 'Placeholder of dropdown. This appears inside the input box',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    locked: {\n      description:\n        'if **true**, the component is locked, Locked state is the readonly state of the dropdown',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    error: {\n      description:\n        'if **true**, the component is moved to error state, Error state displays a red border surrounding input',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    errorText: {\n      description:\n        'Error text to be displayed on the bottom of the input. This uses `colorTextDanger`',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    label: {\n      description:\n        'Primary label of the dropdown. This appears on top of dropdown input',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    helperText: {\n      description:\n        'Secondary label of the dropdown. This appears on bottom of dropdown input, if the dropdown is in `error` state the priority is given to `errorText`, in such cases secondary label wont be displayed',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    dropdownInputText: {\n      description:\n        'Text that appears inside the top input. Since Dropdown is a controlled component, this has to be set by caller',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    classNames: {\n      description: 'External classnames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: '{wrapper?: string, box?: string}'},\n      },\n    },\n    required: {\n      description: 'if **true**, a red star would be added to the label',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    onChange: {\n      description:\n        '**onChange** handler is triggered when there is a selection of an option from dropdown',\n      action: 'changed',\n      table: {\n        type: {\n          summary:\n            '(option: MenuOption, ?SyntheticEvent<HTMLElement>) => mixed',\n        },\n      },\n    },\n    onMenuOpen: {\n      description:\n        '**onMenuOpen** handler is triggered when menu is opened. This should be helpful in cases where you want to change Button icon / text on this trigger.',\n      action: 'clicked',\n      table: {\n        type: {summary: '() => mixed'},\n      },\n    },\n    onMenuClose: {\n      description:\n        '**onMenuClose** handler is triggered when menu is closed. This should be helpful in cases where you want to change Button icon / text on this trigger.',\n      action: 'clicked',\n      table: {\n        type: {summary: '() => mixed'},\n      },\n    },\n    onFocus: {\n      description: '**onFocus** handler is triggered when dropdown is focussed',\n      action: 'focussed',\n      table: {\n        type: {summary: '(e: SyntheticInputEvent<HTMLInputElement>) => mixed'},\n      },\n    },\n    onBlur: {\n      description: '**onBlur** handler is triggered when dropdown is blurred',\n      action: 'blurred',\n      table: {\n        type: {summary: '(e: SyntheticInputEvent<HTMLInputElement>) => mixed'},\n      },\n    },\n    clickAwayRef: {\n      type: {optional: true},\n      description: 'ref that contains the functions to open or close the child',\n      table: {\n        type: {\n          summary: 'ClickAwayRefType',\n        },\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Dropdown component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Dropdown } from \"@spaced-out/ui-design-system/lib/components/Dropdown\";\n\\`\\`\\`\n**Dropdown** is implemented as a combination of **<a href=\"../?path=/docs/form-components-input--docs\">Input</a>** and **<a href=\"../?path=/docs/components-menu--docs\">Menu</a>**\ncomponents. It internally uses **Floating UI** to\nposition itself in context of DOM. Supports a bunch of callbacks listed below.\nThis is a controlled component. You would need to pass and set \\`selectedKeys\\` and \\`dropdownInputText\\`  by handling \\`onChange\\` in order to set/reset the selection state\nof menu item and input value respectively.\n\n- Supports passing a \\`clickAwayRef\\` prop to the component.\n- You can always force Open the instance from ref by using \\`clickAwayRef.current?.forceOpen()\\`. This might be useful when want to force Open as per you needs.\n- You can always force Close the instance from ref by using \\`clickAwayRef.current?.forceClose()\\`. This might be useful when want to force Close as per you needs.\n\n**Note: ** For **checkbox** type option set you can make use of \\`getSelectedKeysFromSelectedOption\\` and \\`getTextLabelFromSelectedKeys\\` from \\`utils/menu\\`\nto populate \\`selectedKeys\\` and \\`dropdownInputText\\` respectively.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Dropdown/Dropdown',\n    },\n  },\n};\n\nconst menuProps: MenuProps = {\n  options,\n};\n\nexport const WithSimpleMenuStory = (args: DropdownProps) => {\n  const [selectedKeys, setSelectedKeys] = React.useState(\n    args.menu?.selectedKeys || [],\n  );\n  const [dropDownText, setDropdownText] = React.useState(\n    args.dropdownInputText,\n  );\n\n  const handleChange = (\n    option: MenuOption,\n    _event?: React.SyntheticEvent<HTMLElement> | null | undefined,\n  ) => {\n    setSelectedKeys([option.key]);\n    setDropdownText(option.label);\n  };\n\n  const onClear = () => {\n    setSelectedKeys([]);\n    setDropdownText('');\n  };\n  return (\n    <div className={css.dropdownWrapper}>\n      <div className={css.content}>\n        <Dropdown\n          {...args}\n          dropdownInputText={dropDownText}\n          menu={{...args.menu, selectedKeys}}\n          onChange={handleChange}\n        />\n        <Button type=\"secondary\" onClick={onClear}>\n          Clear\n        </Button>\n      </div>\n    </div>\n  );\n};\n\nWithSimpleMenuStory.args = {\n  label: 'Form Label',\n  menu: menuProps,\n  testId: 'dropdown-with-simple-menu-story',\n};\n\n/*\n * The same dropdown as `With Simple Menu`, with the accessibility opt-in on.\n *\n * With `enableA11y` the field becomes a `combobox` that owns the listbox it\n * opens: it reports `aria-expanded` / `aria-controls` while the list is\n * rendered, focus stays in the field so typing still reaches it, and the arrow\n * keys move a virtual highlight reported through `aria-activedescendant`.\n * Escape closes and returns focus to the field.\n *\n * Every other story here leaves the prop off, which is the default and is this\n * component exactly as it behaved before any of this existed.\n */\nexport const AccessibleDropdownStory = (args: DropdownProps) => {\n  const [selectedKeys, setSelectedKeys] = React.useState(\n    args.menu?.selectedKeys || [],\n  );\n  const [dropDownText, setDropdownText] = React.useState(\n    args.dropdownInputText,\n  );\n\n  const handleChange = (\n    option: MenuOption,\n    _event?: React.SyntheticEvent<HTMLElement> | null | undefined,\n  ) => {\n    setSelectedKeys([option.key]);\n    setDropdownText(option.label);\n  };\n\n  return (\n    <div className={css.dropdownWrapper}>\n      <div className={css.content}>\n        <Dropdown\n          {...args}\n          dropdownInputText={dropDownText}\n          onChange={handleChange}\n          menu={{...args.menu, selectedKeys}}\n        />\n      </div>\n    </div>\n  );\n};\n\nAccessibleDropdownStory.args = {\n  enableA11y: true,\n  label: 'Form Label',\n  menu: menuProps,\n  testId: 'dropdown-accessible-story',\n};\n\nexport const WithSimpleMenuTooltipStory = (args: DropdownProps) => {\n  const [selectedKeys, setSelectedKeys] = React.useState(\n    args.menu?.selectedKeys || [],\n  );\n  const [dropDownText, setDropdownText] = React.useState(\n    args.dropdownInputText,\n  );\n\n  const handleChange = (option: MenuOption) => {\n    setSelectedKeys([option.key]);\n    setDropdownText(option.label);\n  };\n\n  const onClear = () => {\n    setSelectedKeys([]);\n    setDropdownText('');\n  };\n  return (\n    <div className={css.dropdownWrapper}>\n      <div className={css.content}>\n        <Dropdown\n          {...args}\n          dropdownInputText={dropDownText}\n          menu={{...args.menu, selectedKeys}}\n          onChange={handleChange}\n        />\n        <Button type=\"secondary\" onClick={onClear}>\n          Clear\n        </Button>\n      </div>\n    </div>\n  );\n};\n\nWithSimpleMenuTooltipStory.args = {\n  label: 'Form Label',\n  menu: {...menuProps, showLabelTooltip: {maxLines: 6}},\n  testId: 'dropdown-with-simple-menu-tooltip-story',\n};\n\nexport const WithSearchStory = (args: DropdownProps) => {\n  const [selectedKeys, setSelectedKeys] = React.useState(\n    args.menu?.selectedKeys || [],\n  );\n  const [dropDownText, setDropdownText] = React.useState(\n    args.dropdownInputText,\n  );\n\n  const handleChange = (option: MenuOption) => {\n    setSelectedKeys([option.key]);\n    setDropdownText(option.label);\n  };\n\n  const onClear = () => {\n    setSelectedKeys([]);\n    setDropdownText('');\n  };\n  return (\n    <div className={css.dropdownWrapper}>\n      <div className={css.content}>\n        <Dropdown\n          {...args}\n          dropdownInputText={dropDownText}\n          menu={{...args.menu, selectedKeys}}\n          onChange={handleChange}\n        />\n        <Button type=\"secondary\" onClick={onClear}>\n          Clear\n        </Button>\n      </div>\n    </div>\n  );\n};\n\nWithSearchStory.args = {\n  label: 'Form Label',\n\n  menu: {...menuProps, allowSearch: true},\n  testId: 'dropdown-with-search-story',\n};\n\nconst checkboxMenuProps: MenuProps = {\n  options,\n  optionsVariant: 'checkbox',\n  selectedKeys: ['4'],\n};\n\nexport const WithCheckboxMenuStory = (args: DropdownProps) => {\n  const [dropDownText, setDropdownText] = React.useState(\n    args.dropdownInputText,\n  );\n  const [selectedKeys, setSelectedKeys] = React.useState(\n    args.menu?.selectedKeys || [],\n  );\n\n  React.useEffect(() => {\n    setSelectedKeys(args.menu?.selectedKeys || []);\n    const newDropdownText = getTextLabelFromSelectedKeys(\n      args.menu?.selectedKeys,\n      args.menu?.options,\n    );\n    setDropdownText(newDropdownText);\n  }, [args.menu?.selectedKeys]);\n\n  const handleChange = (option: MenuOption) => {\n    const newSelectedKeys = getSelectedKeysFromSelectedOption(\n      option,\n      selectedKeys,\n    );\n    const newDropdownText = getTextLabelFromSelectedKeys(\n      newSelectedKeys,\n      args.menu?.options,\n    );\n    setSelectedKeys(newSelectedKeys);\n    setDropdownText(newDropdownText);\n  };\n\n  const onClear = () => {\n    setSelectedKeys([]);\n    setDropdownText('');\n  };\n\n  return (\n    <div className={css.dropdownWrapper}>\n      <div className={css.content}>\n        <Dropdown\n          {...args}\n          dropdownInputText={dropDownText}\n          menu={{...args.menu, selectedKeys}}\n          onChange={handleChange}\n        />\n        <Button type=\"secondary\" onClick={onClear}>\n          Clear\n        </Button>\n      </div>\n    </div>\n  );\n};\n\nWithCheckboxMenuStory.args = {\n  label: 'Form Label',\n\n  menu: checkboxMenuProps,\n  testId: 'dropdown-with-checkbox-menu-story',\n};\n\nconst radioMenuProps: MenuProps = {\n  options,\n  optionsVariant: 'radio',\n  selectedKeys: ['2'],\n};\n\nexport const WithRadioMenuStory = (args: DropdownProps) => {\n  const [dropDownText, setDropdownText] = React.useState(\n    args.dropdownInputText,\n  );\n  const [selectedKeys, setSelectedKeys] = React.useState(\n    args.menu?.selectedKeys || [],\n  );\n\n  React.useEffect(() => {\n    setSelectedKeys(args.menu?.selectedKeys || []);\n  }, [args.menu?.selectedKeys]);\n\n  const handleChange = (option: MenuOption) => {\n    setSelectedKeys([option.key]);\n    setDropdownText(option.label);\n  };\n\n  const onClear = () => {\n    setSelectedKeys([]);\n    setDropdownText('');\n  };\n  return (\n    <div className={css.dropdownWrapper}>\n      <div className={css.content}>\n        <Dropdown\n          {...args}\n          dropdownInputText={dropDownText}\n          menu={{...args.menu, selectedKeys}}\n          onChange={handleChange}\n        />\n        <Button type=\"secondary\" onClick={onClear}>\n          Clear\n        </Button>\n      </div>\n    </div>\n  );\n};\n\nWithRadioMenuStory.args = {\n  label: 'Form Label',\n  menu: radioMenuProps,\n  testId: 'dropdown-with-radio-menu-story',\n};\n\nconst composeOptions: Array<Array<MenuOption>> = [\n  [\n    {\n      key: '1',\n      label: 'Option one',\n      secondaryLabel: 'Sub Text',\n    },\n    {\n      key: '2',\n      label: 'Option two',\n      secondaryLabel: 'Sub Text',\n    },\n    {\n      key: '3',\n      label: 'Option three',\n      secondaryLabel: 'Sub Text',\n    },\n  ],\n  [\n    {\n      iconLeft: 'coffee',\n      key: '4',\n      label: 'Option one',\n    },\n  ],\n  [\n    {\n      iconLeft: 'coffee',\n      key: '5',\n      label: 'Option one',\n    },\n  ],\n];\n\nconst composeMenuProps: MenuProps = {\n  composeOptions,\n};\n\nexport const WithComposeMenuStory = (args: DropdownProps) => {\n  const [selectedKeys, setSelectedKeys] = React.useState(\n    args.menu?.selectedKeys || [],\n  );\n  const [dropDownText, setDropdownText] = React.useState(\n    args.dropdownInputText,\n  );\n\n  const handleChange = (option: MenuOption) => {\n    setSelectedKeys([option.key]);\n    setDropdownText(option.label);\n  };\n\n  const onClear = () => {\n    setSelectedKeys([]);\n    setDropdownText('');\n  };\n  return (\n    <div className={css.dropdownWrapper}>\n      <div className={css.content}>\n        <Dropdown\n          {...args}\n          dropdownInputText={dropDownText}\n          menu={{...args.menu, selectedKeys}}\n          onChange={handleChange}\n        />\n        <Button type=\"secondary\" onClick={onClear}>\n          Clear\n        </Button>\n      </div>\n    </div>\n  );\n};\n\nWithComposeMenuStory.args = {\n  label: 'Form Label',\n  menu: composeMenuProps,\n  testId: 'dropdown-with-compose-menu-story',\n};\n\nconst groupTitleOptions: Array<MenuGroupTitleOption> = [\n  {\n    groupTitle: (\n      <div className={css.titleWrapper}>\n        <FormLabelSmall color=\"tertiary\">Fast Food</FormLabelSmall>\n        <div className={css.infoContainer}>\n          <Tooltip title=\"Hello!\" elevation=\"menu\">\n            <Icon name=\"circle-info\" size=\"small\" color=\"tertiary\" />\n          </Tooltip>\n        </div>\n      </div>\n    ),\n    options: [\n      {\n        key: '1',\n        iconLeft: 'burger',\n        label: 'Burger',\n      },\n      {\n        key: '2',\n        iconLeft: 'pizza',\n        label: 'Pizza',\n      },\n      {\n        key: '3',\n        iconLeft: 'french-fries',\n        label: 'Fries',\n      },\n    ],\n  },\n  {\n    groupTitle: (\n      <div className={css.titleWrapper}>\n        <FormLabelSmall color=\"tertiary\">Fruits</FormLabelSmall>\n        <div className={css.infoContainer}>\n          <Tooltip title=\"Hello!\" elevation=\"menu\">\n            <Icon name=\"circle-info\" size=\"small\" color=\"tertiary\" />\n          </Tooltip>\n        </div>\n      </div>\n    ),\n    options: [\n      {\n        key: '7',\n        iconLeft: 'banana',\n        label: 'Banana',\n      },\n      {\n        key: '8',\n        iconLeft: 'pear',\n        label: 'Pear',\n      },\n      {\n        key: '9',\n        iconLeft: 'lemon',\n        label: 'Lemon',\n      },\n    ],\n  },\n];\n\nconst groupTitleMenuProps: MenuProps = {\n  groupTitleOptions,\n};\n\nexport const WithGroupTitleMenuStory = (args: DropdownProps) => {\n  const [selectedKeys, setSelectedKeys] = React.useState(\n    args.menu?.selectedKeys || [],\n  );\n  const [dropDownText, setDropdownText] = React.useState(\n    args.dropdownInputText,\n  );\n\n  const handleChange = (option: MenuOption) => {\n    setSelectedKeys([option.key]);\n    setDropdownText(option.label);\n  };\n\n  const onClear = () => {\n    setSelectedKeys([]);\n    setDropdownText('');\n  };\n  return (\n    <div className={css.dropdownWrapper}>\n      <div className={css.content}>\n        <Dropdown\n          {...args}\n          dropdownInputText={dropDownText}\n          menu={{...args.menu, selectedKeys}}\n          onChange={handleChange}\n        />\n        <Button type=\"secondary\" onClick={onClear}>\n          Clear\n        </Button>\n      </div>\n    </div>\n  );\n};\n\nWithGroupTitleMenuStory.args = {\n  label: 'Form Label',\n\n  menu: {...groupTitleMenuProps},\n  testId: 'dropdown-with-group-title-menu-story',\n};\n\nexport const WithHeaderAndFooterStory = (args: DropdownProps) => (\n  <WithHeaderAndFooter {...args} />\n);\n\nexport const WithHeaderAndFooter = (args: DropdownProps) => {\n  const clickAwayRef = React.useRef<ClickAwayRefType | null>(null);\n  const [dropDownText, setDropdownText] = React.useState(\n    args.dropdownInputText,\n  );\n  const [selectedKeys, setSelectedKeys] = React.useState(\n    args.menu?.selectedKeys || [],\n  );\n\n  React.useEffect(() => {\n    setSelectedKeys(args.menu?.selectedKeys || []);\n    const newDropdownText = getTextLabelFromSelectedKeys(\n      args.menu?.selectedKeys,\n      args.menu?.options,\n    );\n    setDropdownText(newDropdownText);\n  }, [args.menu?.selectedKeys]);\n\n  const handleChange = (option: MenuOption) => {\n    const newSelectedKeys = getSelectedKeysFromSelectedOption(\n      option,\n      selectedKeys,\n    );\n    const newDropdownText = getTextLabelFromSelectedKeys(\n      newSelectedKeys,\n      args.menu?.options,\n    );\n    setSelectedKeys(newSelectedKeys);\n    setDropdownText(newDropdownText);\n  };\n\n  const onClear = () => {\n    setSelectedKeys([]);\n    setDropdownText('');\n  };\n\n  const onSave = () => {\n    if (clickAwayRef.current) {\n      clickAwayRef.current?.forceClose();\n    }\n  };\n\n  return (\n    <div className={css.dropdownWrapper}>\n      <div className={css.content}>\n        <Dropdown\n          {...args}\n          dropdownInputText={dropDownText}\n          menu={{\n            ...args.menu,\n            selectedKeys,\n            header: <MenuHeader />,\n            footer: <MenuFooter onSave={onSave} />,\n          }}\n          onChange={handleChange}\n          clickAwayRef={clickAwayRef}\n        />\n        <Button type=\"secondary\" onClick={onClear}>\n          Clear\n        </Button>\n      </div>\n    </div>\n  );\n};\n\nconst menuPropsWithHeaderAndFooter: MenuProps = {\n  options,\n  optionsVariant: 'checkbox',\n};\n\nWithHeaderAndFooterStory.args = {\n  label: 'Form Label',\n  menu: {\n    ...menuPropsWithHeaderAndFooter,\n    header: <MenuHeader />,\n    footer: <MenuFooter />,\n  },\n  testId: 'dropdown-with-header-and-footer-story',\n};\nWithSimpleMenuStory.storyName = 'With Simple Menu';\nAccessibleDropdownStory.storyName = 'Accessible (enableA11y)';\nWithSimpleMenuTooltipStory.storyName = 'With Simple Menu Tooltip';\nWithSearchStory.storyName = 'With Search';\nWithCheckboxMenuStory.storyName = 'With Checkbox Menu';\nWithRadioMenuStory.storyName = 'With Radio Menu';\nWithComposeMenuStory.storyName = 'With Compose Menu';\nWithGroupTitleMenuStory.storyName = 'With Group Title Menu';\nWithHeaderAndFooterStory.storyName = 'With Header And Footer';\n"
        },
        "css": {
          "path": "Dropdown.module.css",
          "content": "@value (\n  sizeFluid\n) from '../../styles/variables/_size.css';\n\n@value (\n  borderWidthTertiary\n) from '../../styles/variables/_border.css';\n\n.dropdownContainer {\n  display: flex;\n  position: relative;\n  flex-flow: column;\n  width: sizeFluid;\n}\n\n.inputBox {\n  cursor: pointer;\n}\n\n/*\n * Keeping the trigger visually active while its menu is open (DOM focus has\n * moved into the listbox) is done in Input.module.css, keyed off the trigger's\n * own `aria-expanded`. It has to live there: the rules it must beat are scoped\n * to Input's `.wrapper` / `.box` / `.withError` class names, which this module\n * cannot name and therefore cannot reliably out-specify.\n */\n\n/*\n * forced-colors mode drops the box-shadow open-emphasis ring; the base box\n * border survives, but add a system-color outline so the open state stays\n * perceivable in Windows High Contrast.\n */\n@media (forced-colors: active) {\n  .inputBox.inputBoxOpen {\n    outline: borderWidthTertiary solid Highlight;\n    outline-offset: borderWidthTertiary;\n  }\n}\n\n.menuWrapper {\n  width: var(--dropdown-width);\n  z-index: var(--menu-elevation);\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Dropdown/Dropdown';\nexport * from '../../components/Dropdown/SimpleDropdown';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "SimpleDropdown.d.ts": {
            "path": "SimpleDropdown.d.ts",
            "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { MenuClassNames, MenuLabelTooltip } from '../../types/menu';\nimport type { ClickAwayRefType } from '../../utils/click-away';\nimport type { InputProps } from '../../components/Input';\nimport type { MenuOption, MenuOptionsVariant, Virtualization } from '../../components/Menu';\nimport type { ElevationType } from '../../components/Tooltip';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    box?: string;\n}>;\nexport interface SimpleDropdownRef {\n    selectedKeys?: Array<string>;\n}\nexport interface SimpleDropdownProps extends Omit<InputProps, 'elevation' | 'classNames' | 'clickAwayRef' | 'options' | 'optionsVariant' | 'allowSearch' | 'selectedKeys' | 'isMenuFluid' | 'menuVirtualization' | 'header' | 'footer' | 'menuClassNames' | 'showLabelTooltip' | 'allowWrap' | 'staticLabels' | 'onChange' | 'onMenuOpen' | 'onMenuClose' | 'resolveLabel' | 'resolveSecondaryLabel'> {\n    elevation?: ElevationType;\n    classNames?: ClassNames;\n    clickAwayRef?: React.RefObject<ClickAwayRefType | null>;\n    options?: Array<MenuOption>;\n    optionsVariant?: MenuOptionsVariant;\n    allowSearch?: boolean;\n    selectedKeys?: Array<string>;\n    isMenuFluid?: boolean;\n    menuVirtualization?: Virtualization;\n    header?: React.ReactNode;\n    footer?: React.ReactNode;\n    menuClassNames?: MenuClassNames;\n    showLabelTooltip?: MenuLabelTooltip;\n    allowWrap?: boolean;\n    staticLabels?: {\n        RESULT?: string;\n        RESULTS?: string;\n        SEARCH_PLACEHOLDER?: string;\n    };\n    onChange?: (option: MenuOption, arg2?: React.SyntheticEvent<HTMLElement> | null | undefined) => unknown;\n    onMenuOpen?: () => unknown;\n    onMenuClose?: () => unknown;\n    resolveLabel?: (option: MenuOption) => string | React.ReactNode;\n    resolveSecondaryLabel?: (option: MenuOption) => string | React.ReactNode;\n    /**\n     * Opt in to the accessibility behavior of the `Dropdown` this renders: its\n     * ARIA roles and state, keyboard navigation of the options, and focus\n     * handling on close. Forwarded unchanged.\n     *\n     * Off by default, and off is this component exactly as it behaved before\n     * any of it existed.\n     */\n    enableA11y?: boolean;\n    testId?: string;\n}\nexport declare const SimpleDropdown: Flow.AbstractComponent<SimpleDropdownProps, SimpleDropdownRef>;\nexport {};\n//# sourceMappingURL=SimpleDropdown.d.ts.map"
          }
        }
      },
      "allFiles": [
        "Dropdown.module.css",
        "Dropdown.stories.module.css",
        "Dropdown.stories.tsx",
        "Dropdown.tsx",
        "SimpleDropdown.stories.tsx",
        "SimpleDropdown.tsx",
        "index.ts"
      ]
    },
    "EmptyState": {
      "name": "EmptyState",
      "path": "src/components/EmptyState",
      "files": {
        "main": {
          "path": "EmptyState.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    image?: string;\n    title?: string;\n    description?: string;\n    children?: string;\n}>;\nexport interface EmptyStateProps {\n    classNames?: ClassNames;\n    children?: React.ReactNode;\n    imageVariant?: 'calendar' | 'data' | 'file' | 'message' | 'upload' | 'chart' | 'analytics' | 'voice';\n    title?: React.ReactNode;\n    description?: React.ReactNode;\n    customImageUrl?: string;\n    testId?: string;\n}\nexport declare const EmptyState: Flow.AbstractComponent<EmptyStateProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=EmptyState.d.ts.map"
        },
        "story": {
          "path": "EmptyState.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {DataVariation} from 'src/utils/tokens';\nimport {getRandomDataVariation} from 'src/utils/tokens';\n\nimport {Button} from 'src/components/Button';\nimport type {EmptyStateProps} from 'src/components/EmptyState/EmptyState';\nimport {EmptyState} from 'src/components/EmptyState/EmptyState';\n\nimport css from 'src/components/EmptyState/EmptyState.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Empty State',\n  component: EmptyState,\n  argTypes: {\n    classNames: {\n      description: 'External classNames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary:\n            '{ wrapper?: string, image?: string, title?: string, description?: string, children?: string}',\n        },\n      },\n    },\n    children: {\n      type: {optional: true},\n      description:\n        'Custom component for Empty state. This is rendered below **image, title and description**. Use this to maybe show a button.',\n      table: {\n        type: {summary: 'React.Component'},\n      },\n    },\n    imageVariant: {\n      description: 'Image flavour of the Empty state',\n      options: [\n        'calendar',\n        'data',\n        'file',\n        'message',\n        'upload',\n        'chart',\n        'analytics',\n        'voice',\n      ],\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    title: {\n      description: 'Title of the Empty State',\n      table: {\n        type: {summary: 'React.Node'},\n      },\n    },\n    description: {\n      description: 'Description of the Empty State',\n      table: {\n        type: {summary: 'React.Node'},\n      },\n    },\n    customImageUrl: {\n      description:\n        'Custom hero image. This would **override the imageVariant flavour**',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a EmptyState component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { EmptyState } from \"@spaced-out/ui-design-system/lib/components/EmptyState\";\n\\`\\`\\`\nEmpty State is a generic component that can come in handy to display content when there is no data/records available.\n\nIt accepts title, description, image and a custom component. Each of these are optional and you can mix and match to\nobtain the design that you want. classnames are also exposed to each of these entries for them to be easily customizable.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/EmptyState',\n    },\n  },\n};\n\nconst emptyText: DataVariation = getRandomDataVariation();\n\nexport const EmptyStateStory = (args: EmptyStateProps) => (\n  <div className={css.container}>\n    <EmptyState {...args} classNames={{wrapper: css.emptyStateWrapper}}>\n      <Button>Button Text</Button>\n    </EmptyState>\n  </div>\n);\n\nEmptyStateStory.args = {\n  title: emptyText.title,\n  description: emptyText.description,\n  imageVariant: 'data',\n  testId: 'empty-state-story',\n};\nEmptyStateStory.storyName = 'Empty State';\n"
        },
        "css": {
          "path": "EmptyState.module.css",
          "content": "@value (colorTextSecondary) from '../../styles/variables/_color.css';\n@value (spaceMedium, spaceXSmall) from '../../styles/variables/_space.css';\n@value (sizeFluid, size140) from '../../styles/variables/_size.css';\n\n.wrapper {\n  display: flex;\n  width: sizeFluid;\n  height: sizeFluid;\n  flex-flow: column;\n  align-items: center;\n  justify-content: center;\n  text-align: center;\n  padding: spaceMedium;\n}\n\n.image {\n  max-width: size140;\n}\n\n.title {\n  composes: subTitleMedium from '../../styles/typography.module.css';\n  margin-bottom: spaceXSmall;\n}\n\n.description {\n  composes: bodyMedium from '../../styles/typography.module.css';\n  color: colorTextSecondary;\n  margin-bottom: spaceMedium;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/EmptyState/EmptyState';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "EmptyImages/AnalyticsEmptyImage.d.ts": {
            "path": "EmptyImages/AnalyticsEmptyImage.d.ts",
            "content": "import * as React from 'react';\nexport declare const AnalyticsEmptyImage: () => React.JSX.Element;\n//# sourceMappingURL=AnalyticsEmptyImage.d.ts.map"
          },
          "EmptyImages/CalendarEmptyImage.d.ts": {
            "path": "EmptyImages/CalendarEmptyImage.d.ts",
            "content": "import * as React from 'react';\nexport declare const CalendarEmptyImage: () => React.JSX.Element;\n//# sourceMappingURL=CalendarEmptyImage.d.ts.map"
          },
          "EmptyImages/ChartEmptyImage.d.ts": {
            "path": "EmptyImages/ChartEmptyImage.d.ts",
            "content": "import * as React from 'react';\nexport declare const ChartEmptyImage: () => React.JSX.Element;\n//# sourceMappingURL=ChartEmptyImage.d.ts.map"
          },
          "EmptyImages/DataEmptyImage.d.ts": {
            "path": "EmptyImages/DataEmptyImage.d.ts",
            "content": "import * as React from 'react';\nexport declare const DataEmptyImage: () => React.JSX.Element;\n//# sourceMappingURL=DataEmptyImage.d.ts.map"
          },
          "EmptyImages/FileEmptyImage.d.ts": {
            "path": "EmptyImages/FileEmptyImage.d.ts",
            "content": "import * as React from 'react';\nexport declare const FileEmptyImage: () => React.JSX.Element;\n//# sourceMappingURL=FileEmptyImage.d.ts.map"
          },
          "EmptyImages/MessageEmptyImage.d.ts": {
            "path": "EmptyImages/MessageEmptyImage.d.ts",
            "content": "import * as React from 'react';\nexport declare const MessageEmptyImage: () => React.JSX.Element;\n//# sourceMappingURL=MessageEmptyImage.d.ts.map"
          },
          "EmptyImages/UploadEmptyImage.d.ts": {
            "path": "EmptyImages/UploadEmptyImage.d.ts",
            "content": "import * as React from 'react';\nexport declare const UploadEmptyImage: () => React.JSX.Element;\n//# sourceMappingURL=UploadEmptyImage.d.ts.map"
          },
          "EmptyImages/VoiceEmptyImage.d.ts": {
            "path": "EmptyImages/VoiceEmptyImage.d.ts",
            "content": "import * as React from 'react';\nexport declare const VoiceEmptyImage: () => React.JSX.Element;\n//# sourceMappingURL=VoiceEmptyImage.d.ts.map"
          },
          "EmptyImages/index.d.ts": {
            "path": "EmptyImages/index.d.ts",
            "content": "export * from '../../../components/EmptyState/EmptyImages/CalendarEmptyImage';\nexport * from '../../../components/EmptyState/EmptyImages/ChartEmptyImage';\nexport * from '../../../components/EmptyState/EmptyImages/DataEmptyImage';\nexport * from '../../../components/EmptyState/EmptyImages/FileEmptyImage';\nexport * from '../../../components/EmptyState/EmptyImages/MessageEmptyImage';\nexport * from '../../../components/EmptyState/EmptyImages/UploadEmptyImage';\nexport * from '../../../components/EmptyState/EmptyImages/AnalyticsEmptyImage';\nexport * from '../../../components/EmptyState/EmptyImages/VoiceEmptyImage';\n//# sourceMappingURL=index.d.ts.map"
          }
        }
      },
      "allFiles": [
        "EmptyImages/AnalyticsEmptyImage.tsx",
        "EmptyImages/CalendarEmptyImage.tsx",
        "EmptyImages/ChartEmptyImage.tsx",
        "EmptyImages/DataEmptyImage.tsx",
        "EmptyImages/FileEmptyImage.tsx",
        "EmptyImages/MessageEmptyImage.tsx",
        "EmptyImages/UploadEmptyImage.tsx",
        "EmptyImages/VoiceEmptyImage.tsx",
        "EmptyImages/index.ts",
        "EmptyState.module.css",
        "EmptyState.stories.module.css",
        "EmptyState.stories.tsx",
        "EmptyState.tsx",
        "index.ts"
      ]
    },
    "ErrorMessage": {
      "name": "ErrorMessage",
      "path": "src/components/ErrorMessage",
      "files": {
        "main": {
          "path": "ErrorMessage.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    image?: string;\n    heading?: string;\n    title?: string;\n    description?: string;\n    children?: string;\n}>;\nexport interface ErrorMessageProps {\n    classNames?: ClassNames;\n    children?: React.ReactNode;\n    imageVariant?: 'unauthorized' | 'forbidden' | 'notFound' | 'serverError';\n    title?: React.ReactNode;\n    description?: React.ReactNode;\n    heading?: React.ReactNode;\n    customImageUrl?: string;\n    testId?: string;\n}\nexport declare const ErrorMessage: Flow.AbstractComponent<ErrorMessageProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=ErrorMessage.d.ts.map"
        },
        "story": {
          "path": "ErrorMessage.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {DataVariation} from 'src/utils/tokens';\nimport {getRandomDataVariation} from 'src/utils/tokens';\n\nimport {Button} from 'src/components/Button';\nimport type {ErrorMessageProps} from 'src/components/ErrorMessage/ErrorMessage';\nimport {ErrorMessage} from 'src/components/ErrorMessage/ErrorMessage';\n\nimport css from 'src/components/ErrorMessage/ErrorMessage.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Error Message',\n  component: ErrorMessage,\n  argTypes: {\n    classNames: {\n      description: 'External classNames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary:\n            '{ wrapper?: string, image?: string, title?: string, description?: string, children?: string}',\n        },\n      },\n    },\n    children: {\n      description:\n        'Custom component for Error Message. This is rendered below **image, title and description**. Use this to maybe show a button.',\n      table: {\n        type: {summary: 'React.Component'},\n      },\n    },\n    imageVariant: {\n      description: 'Image flavour of the Error Message',\n      options: ['unauthorized', 'forbidden', 'notFound', 'serverError'],\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    heading: {\n      description: 'Heading of the Error Message',\n      table: {\n        type: {summary: 'React.Node'},\n      },\n    },\n    title: {\n      description: 'Title of the Error Message',\n      table: {\n        type: {summary: 'React.Node'},\n      },\n    },\n    description: {\n      description: 'Description of the Error Message',\n      table: {\n        type: {summary: 'React.Node'},\n      },\n    },\n    customImageUrl: {\n      description:\n        'Custom hero image. This would **override the imageVariant flavour**',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a ErrorMessage component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { ErrorMessage } from \"@spaced-out/ui-design-system/lib/components/ErrorMessage\";\n\\`\\`\\`\nError Message is a generic component that can come in handy to display content when there is some error thrown from API.\n\nIt accepts heading, title, description, image and a custom component. Each of these are optional and you can mix and match to\nobtain the design that you want. classnames are also exposed to each of these entries for them to be easily customizable.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/ErrorMessage/ErrorMessage',\n    },\n  },\n};\n\nconst emptyText: DataVariation = getRandomDataVariation();\n\nexport const ErrorMessageStory = (args: ErrorMessageProps) => (\n  <div className={css.container}>\n    <div className={css.errorContent}>\n      <ErrorMessage {...args} classNames={{wrapper: css.emptyStateWrapper}}>\n        <Button type=\"secondary\">Go to dashboard</Button>\n      </ErrorMessage>\n    </div>\n  </div>\n);\n\nErrorMessageStory.args = {\n  heading: '500',\n  title: emptyText.title,\n  description: emptyText.description,\n  imageVariant: 'serverError',\n  testId: 'error-message-story',\n};\nErrorMessageStory.storyName = 'Error Message';\n"
        },
        "css": {
          "path": "ErrorMessage.module.css",
          "content": "@value (colorTextSecondary, colorTextClickable) from '../../styles/variables/_color.css';\n@value (spaceMedium, spaceXSmall, spaceSmall) from '../../styles/variables/_space.css';\n@value (sizeFluid, size140) from '../../styles/variables/_size.css';\n\n.wrapper {\n  display: flex;\n  width: sizeFluid;\n  height: sizeFluid;\n  flex-flow: column;\n  align-items: center;\n  justify-content: center;\n  text-align: center;\n  padding: spaceMedium;\n}\n\n.image {\n  max-width: size140;\n}\n\n.heading {\n  composes: jumboMedium from '../../styles/typography.module.css';\n  margin-bottom: spaceSmall;\n  color: colorTextClickable;\n}\n\n.title {\n  composes: subTitleMedium from '../../styles/typography.module.css';\n  margin-bottom: spaceXSmall;\n}\n\n.description {\n  composes: bodyMedium from '../../styles/typography.module.css';\n  color: colorTextSecondary;\n  margin-bottom: spaceMedium;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/ErrorMessage/ErrorMessage';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "ErrorImages/ForbiddenImage.d.ts": {
            "path": "ErrorImages/ForbiddenImage.d.ts",
            "content": "import * as React from 'react';\nexport declare const ForbiddenImage: () => React.JSX.Element;\n//# sourceMappingURL=ForbiddenImage.d.ts.map"
          },
          "ErrorImages/NotFoundImage.d.ts": {
            "path": "ErrorImages/NotFoundImage.d.ts",
            "content": "import * as React from 'react';\nexport declare const NotFoundImage: () => React.JSX.Element;\n//# sourceMappingURL=NotFoundImage.d.ts.map"
          },
          "ErrorImages/ServerErrorImage.d.ts": {
            "path": "ErrorImages/ServerErrorImage.d.ts",
            "content": "import * as React from 'react';\nexport declare const ServerErrorImage: () => React.JSX.Element;\n//# sourceMappingURL=ServerErrorImage.d.ts.map"
          },
          "ErrorImages/UnauthorizedImage.d.ts": {
            "path": "ErrorImages/UnauthorizedImage.d.ts",
            "content": "import * as React from 'react';\nexport declare const UnauthorizedImage: () => React.JSX.Element;\n//# sourceMappingURL=UnauthorizedImage.d.ts.map"
          },
          "ErrorImages/index.d.ts": {
            "path": "ErrorImages/index.d.ts",
            "content": "export * from '../../../components/ErrorMessage/ErrorImages/ForbiddenImage';\nexport * from '../../../components/ErrorMessage/ErrorImages/NotFoundImage';\nexport * from '../../../components/ErrorMessage/ErrorImages/ServerErrorImage';\nexport * from '../../../components/ErrorMessage/ErrorImages/UnauthorizedImage';\n//# sourceMappingURL=index.d.ts.map"
          }
        }
      },
      "allFiles": [
        "ErrorImages/ForbiddenImage.tsx",
        "ErrorImages/NotFoundImage.tsx",
        "ErrorImages/ServerErrorImage.tsx",
        "ErrorImages/UnauthorizedImage.tsx",
        "ErrorImages/index.ts",
        "ErrorMessage.module.css",
        "ErrorMessage.stories.module.css",
        "ErrorMessage.stories.tsx",
        "ErrorMessage.tsx",
        "index.ts"
      ]
    },
    "FileUpload": {
      "name": "FileUpload",
      "path": "src/components/FileUpload",
      "files": {
        "main": {
          "path": "FileUpload.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    instruction?: string;\n    secondaryInstruction?: string;\n    dropZone?: string;\n    files?: string;\n}>;\nexport type FileProgress = number | 'indeterminate';\nexport interface FileObject {\n    file: File;\n    id: string;\n    reject?: boolean;\n    rejectReason?: string;\n    progress?: FileProgress;\n    success?: boolean;\n    successMessage?: string;\n    showReUpload?: boolean;\n    [key: string]: unknown;\n}\nexport interface FileError {\n    code: string;\n}\nexport interface FileRejection {\n    errors: Array<FileError>;\n    file: File;\n}\nexport interface FileUploadRef {\n    moveFileToProgress: (id: string, progress: FileProgress) => unknown;\n    moveFileToSuccess: (id: string, successMessage?: string) => unknown;\n    moveFileToReject: (id: string, rejectReason?: string) => unknown;\n    setShowReUpload: (id: string, showReUpload?: boolean) => unknown;\n    handleFileClear: (id: string) => unknown;\n    validFiles: Array<FileObject>;\n    rejectedFiles: Array<FileObject>;\n    files: Array<FileObject>;\n}\nexport interface FileUploadBaseProps {\n    maxFiles?: number;\n    maxSize?: number;\n    accept?: {\n        [key: string]: string[];\n    };\n    disabled?: boolean;\n    error?: boolean;\n    onValidFilesDrop?: (acceptedFiles: Array<FileObject>) => unknown;\n    onRejectedFilesDrop?: (fileRejections: Array<FileObject>) => unknown;\n    onFileClear?: (id: string) => unknown;\n    onClear?: () => unknown;\n}\nexport interface FileUploadProps extends Omit<FileUploadBaseProps, 'classNames' | 'label' | 'instruction' | 'draggingInstruction' | 'secondaryInstruction' | 'required' | 'handleFileDeletionExternally' | 'onFileRefreshClick'> {\n    classNames?: ClassNames;\n    label?: React.ReactNode;\n    instruction?: React.ReactNode;\n    draggingInstruction?: React.ReactNode;\n    secondaryInstruction?: React.ReactNode;\n    required?: boolean;\n    handleFileDeletionExternally?: boolean;\n    onFileRefreshClick?: (file: FileObject) => unknown;\n    testId?: string;\n}\nexport declare const FileUpload: Flow.AbstractComponent<FileUploadProps, FileUploadRef>;\nexport {};\n//# sourceMappingURL=FileUpload.d.ts.map"
        },
        "story": {
          "path": "FileUpload.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {convertFileSize} from 'src/utils/helpers';\nimport {getRandomDataVariation} from 'src/utils/tokens';\n\nimport {BasicDialog} from 'src/components/Dialog';\nimport {EmptyState} from 'src/components/EmptyState';\nimport type {FileUploadProps} from 'src/components/FileUpload';\nimport type {\n  FileObject,\n  FileUploadRef,\n} from 'src/components/FileUpload/FileUpload';\nimport {FileUpload} from 'src/components/FileUpload/FileUpload';\nimport {Link} from 'src/components/Link';\nimport {BasicSingleCell, Table} from 'src/components/Table';\nimport {BodyMedium, SubTitleMedium} from 'src/components/Text';\nimport {Truncate} from 'src/components/Truncate';\n\nimport css from 'src/components/FileUpload/FileUpload.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/File Upload/File Upload',\n  component: FileUpload,\n  argTypes: {\n    classNames: {\n      description: 'Provide an optional className to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary:\n            '{ wrapper?: string, instruction?: string, secondaryInstruction?: string, dropZone?: string, files?: string }',\n        },\n      },\n    },\n    label: {\n      description: 'The label for the File Uploader',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'React.Node'},\n        defaultValue: {summary: ''},\n      },\n    },\n    instruction: {\n      description:\n        'The instruction for the File Uploader. This appears as the first line of the File Uploader',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'React.Node'},\n        defaultValue: {summary: 'Drag & drop the file here or click to select'},\n      },\n    },\n    draggingInstruction: {\n      description:\n        'This gets activated when the user drags the file over the File Uploader. Instruction text gets replaced by draggingInstruction',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'React.Node'},\n        defaultValue: {summary: 'Drop the file here to start uploading..'},\n      },\n    },\n    secondaryInstruction: {\n      description: `The secondary instruction for the File Uploader. This appears as the second line of the\n        File Uploader. Use this to notify users of file type accepted, size accepted, etc.`,\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'React.Node'},\n        defaultValue: {summary: ''},\n      },\n    },\n    maxSize: {\n      description:\n        'The maximum size of each file that can be uploaded. This is in bytes',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'number'},\n      },\n    },\n    accept: {\n      description: `Set accepted file types. Checkout [MDN](https://developer.mozilla.org/en-US/docs/Web/API/window/showOpenFilePicker)\n      types option for more information. Keep in mind that mime type determination is not reliable across platforms.\n      CSV files, for example, are reported as text/plain under macOS but as application/vnd.ms-excel under Windows.\n      In some cases there might not be a mime type set at all [GitHub](https://github.com/react-dropzone/react-dropzone/issues/276).`,\n      control: {\n        type: 'array',\n      },\n      table: {\n        type: {summary: 'AcceptProps'},\n      },\n    },\n    onValidFilesDrop: {\n      description: `\nThe callback function that is called when the user selects or drop **valid file(s)**.\nOnly the currently dropped/selected files are passed as argument.\n      `,\n      action: 'on valid files drop or select',\n      table: {\n        type: {\n          summary:\n            'onValidFilesDrop?: ( validFiles: Array<FileObject>) => mixed',\n        },\n      },\n    },\n    onRejectedFilesDrop: {\n      description: `\nThe callback function that is called when the user selects or drop **invalid file(s)**.\nOnly the currently dropped/selected files are passed as argument.\n      `,\n      action: 'on rejected files drop or select',\n      table: {\n        type: {\n          summary:\n            'onRejectedFilesDrop?: ( rejectedFiles: Array<FileObject>) => mixed',\n        },\n      },\n    },\n    handleFileDeletionExternally: {\n      description: `If **true**, the component will not handle file deletion internally. This is useful when you want to\n      handle file deletion externally. For example, you can use this prop to show a confirmation modal before deleting a file.`,\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    onFileClear: {\n      description: `The callback function that is called when the user clears the file.`,\n      action: 'file cleared',\n      table: {\n        type: {\n          summary: '(id: string) => mixed',\n        },\n      },\n    },\n    onFileRefreshClick: {\n      description: `The callback function that is called when the user clicks on the refresh icon.`,\n      action: 'file Refreshed',\n      table: {\n        type: {\n          summary: '(file: FileObject) => mixed',\n        },\n      },\n    },\n    disabled: {\n      description: 'If **true**, the component is disabled',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    ref: {\n      description: `File upload state management callbacks along with \\`validFiles\\`, \\`rejectedFiles\\` and \\`files\\` are\n      exposed as \\`ref\\` which is a \\`React.Ref\\` object.`,\n      table: {\n        type: {summary: 'FileUploadRef'},\n      },\n    },\n    maxFiles: {\n      description: `Maximum accepted number of files The default value is 1 which corresponds to single file upload.\n        You can also **set the value to 0 which means there is no limitation to how many files are accepted**.`,\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: '1'},\n      },\n    },\n    required: {\n      description: 'if **true**, a red star would be added to the label',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a FileUpload component.',\n      source: {\n        code: null,\n      },\n      description: {\n        component: `\n\\`\\`\\`js\nimport { FileUpload } from \"@spaced-out/ui-design-system/lib/components/FileUpload\";\n\\`\\`\\`\nThe \\`FileUpload\\` component is a customizable file upload component which utilizes the \\`useFileUploadHook\\`.\nIt provides an intuitive and user-friendly interface for uploading files.\nThe component supports features such as drag and drop functionality, file validation, error handling, and file clearing.\n\nWhen files are dragged and dropped or selected using the file browser, the \\`FileUpload\\` component displays the file names along\nwith additional information such as success message, progress state and error message. It also provides an option to remove individual files.\n\nThe component supports various visual states, including a hover state when files are being dragged over the\ncomponent, an error state when invalid files are selected, and a disabled state when the component is not interactive.\n\nAdditionally, the \\`FileUpload\\` component allows customization through props, enabling you to specify the maximum\nfile size, accepted file types, callbacks for handling valid and rejected file(s) drop, and more.\n\nOn passing \\`handleFileDeletionExternally\\` as \\`true\\`, the component will not handle file deletion internally (Clicking the clear icon will not clear the file from the component).\nThis is useful when you want to handle file deletion externally.\nFor example, you can use this prop to show a confirmation modal before deleting a file or have custom logic/checks before deleting a file.\nYou will need to call \\`ref.current?.handleFileClear(id)\\` in your deletion logic to clear the file from the component.\n\n\nYou can access valid files, rejected files, and all files using the \\`ref\\` object passed to the \\`FileUpload\\` component. You can\nalso do several operations on a file using the functions exposed on the \\`ref\\`\n\n\\`\\`\\`js\n// Valid Files:\nref.current?.validFiles;\n\n// Rejected Files:\nref.current?.rejectedFiles;\n\n// All Files:\nref.current?.files;\n\n// Operations on a file:\n\n// Move file to progress state\nref.current?.moveFileToProgress(id, progress);\n\n// Move file to success state\nref.current?.moveFileToSuccess(id, successMessage);\n\n// Move file to reject state\nref.current?.moveFileToReject(id, rejectReason);\n\n// Show re-upload button\nref.current?.setShowReUpload(id, showReUpload);\n\n// Clear file(Use this in combination of handleFileDeletionExternally, when you want to handle deletion externally)\nref.current?.handleFileClear(id);\n\\`\\`\\`\n\nEach File object returned has these properties:\n\n\\`\\`\\`js\ntype FileObject = {\n  file: File,\n  id: string,\n  reject?: boolean,\n  rejectReason?: string,\n  progress?: FileProgress,\n  success?: boolean,\n  successMessage?: string,\n  showReUpload?: boolean,\n};\n\\`\\`\\`\n\nTo transition file state a bunch of functions are exposed as \\`ref\\` which is a \\`React.Ref\\` object.\n\n\\`\\`\\`js\n// File upload state management callbacks are exposed as \\`ref\\` which is a \\`React.Ref\\` object.\nexport type FileUploadRef = {\n  moveFileToProgress: (id: string, progress: FileProgress) => mixed,\n  moveFileToSuccess: (id: string, successMessage?: string) => mixed,\n  moveFileToReject: (id: string, rejectReason?: string) => mixed,\n  setShowReUpload: (id: string, showReUpload?: boolean) => mixed,\n  handleFileClear: (id: string) => mixed,\n  validFiles: Array<FileObject>,\n  rejectedFiles: Array<FileObject>,\n  files: Array<FileObject>,\n};\n\n// File upload Props\ntype FileUploadProps = {\n  ...\n  // File drop/select callbacks\n  onValidFilesDrop?: (validFiles: Array<FileObject>) => mixed,\n  onRejectedFilesDrop?: (rejectedFiles: Array<FileObject>) => mixed,\n\n  // File clear callbacks\n  onFileClear?: (id: string) => mixed,\n\n  // File refresh callback\n  onFileRefreshClick?: (file: FileObject) => mixed,\n\n  ...\n};\n\\`\\`\\`\n\\`\\`\\`js\n// Usage:\n\nconst ref = React.useRef<FileUploadRef>(null);\n\nconst mockState = (id: string) => {\n  let progress = 0;\n  const intervalId = setInterval(() => {\n    progress += 5;\n    if (progress >= 100) {\n      ref.current?.moveFileToSuccess(id);\n      clearInterval(intervalId);\n    } else {\n      ref.current?.moveFileToProgress(id, progress);\n    }\n  }, 100);\n};\n\\`\\`\\`\n\\`\\`\\`jsx\n<FileUpload\n  {...args}\n  ref={ref}\n  onValidFilesDrop={(uploadedFiles) => {\n    uploadedFiles.forEach((file) => {\n      mockState(file.id);\n    });\n  }}\n/>\n\\`\\`\\`\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/FileUpload/FileUpload',\n    },\n  },\n};\n\n/**\n * Renders a FileUpload component for uploading a single file.\n *\n * This example demonstrates how to use the FileUpload component with a single file upload.\n */\nexport const SingleFileStory = (args: FileUploadProps) => {\n  const [files, setFiles] = React.useState<FileObject[] | undefined>([]);\n  const ref = React.useRef<FileUploadRef>(null);\n\n  return (\n    <>\n      <div className={css.container}>\n        <div className={css.content}>\n          <FileUpload\n            {...args}\n            ref={ref}\n            onValidFilesDrop={() => {\n              setFiles(ref.current?.files);\n            }}\n            onRejectedFilesDrop={() => {\n              setFiles(ref.current?.files);\n            }}\n            onFileClear={() => {\n              setTimeout(() => {\n                setFiles(ref.current?.files);\n              });\n            }}\n          />\n        </div>\n      </div>\n      <div className={css.fileDataContainer}>\n        <FileUploadData files={files || []} />\n      </div>\n    </>\n  );\n};\n\nSingleFileStory.args = {\n  label: 'Upload a file(Only one file allowed)',\n  secondaryInstruction: 'Types: .png, .jpg or .jpeg',\n  maxFiles: 1,\n  accept: {\n    'image/jpeg': ['.jpg', '.jpeg'],\n    'image/png': ['.png'],\n  },\n  testId: 'file-upload-single-story',\n};\n\n/**\n * Renders a FileUpload component for uploading multiple files.\n *\n * This example demonstrates how to use the FileUpload component with multiple file uploads.\n */\nexport const MultiFileStory = (args: FileUploadProps) => {\n  const [files, setFiles] = React.useState<FileObject[] | undefined>([]);\n  const ref = React.useRef<FileUploadRef>(null);\n  return (\n    <>\n      <div className={css.container}>\n        <div className={css.content}>\n          <FileUpload\n            {...args}\n            ref={ref}\n            onValidFilesDrop={() => {\n              setFiles(ref.current?.files);\n            }}\n            onRejectedFilesDrop={() => {\n              setFiles(ref.current?.files);\n            }}\n            onFileClear={() => {\n              setTimeout(() => {\n                setFiles(ref.current?.files);\n              });\n            }}\n          />\n        </div>\n      </div>\n      <div className={css.fileDataContainer}>\n        <FileUploadData files={files || []} />\n      </div>\n    </>\n  );\n};\n\nMultiFileStory.args = {\n  label: 'Upload multiple files',\n  secondaryInstruction: 'Types: .png, .jpg or .jpeg',\n  maxFiles: 5,\n  accept: {\n    'image/jpeg': ['.jpg', '.jpeg'],\n    'image/png': ['.png'],\n  },\n  testId: 'file-upload-multi-story',\n};\n\n/**\n * Renders a FileUpload component for uploading multiple files.\n *\n * This example demonstrates how to use the FileUpload component with confirmation modal and handle deletion externally.\n */\nexport const WithDeletionConfirmationStory = (args: FileUploadProps) => {\n  const [showConfirmation, setShowConfirmation] = React.useState(false);\n  const [fileIdToDelete, setFileIdToDelete] = React.useState('');\n  const [files, setFiles] = React.useState<FileObject[] | undefined>([]);\n  const ref = React.useRef<FileUploadRef>(null);\n  return (\n    <>\n      <div className={css.container}>\n        <div className={css.content}>\n          <FileUpload\n            {...args}\n            ref={ref}\n            onValidFilesDrop={() => {\n              setFiles(ref.current?.files);\n            }}\n            handleFileDeletionExternally={true}\n            onRejectedFilesDrop={() => {\n              setFiles(ref.current?.files);\n            }}\n            onFileClear={(id) => {\n              setFileIdToDelete(id);\n              setShowConfirmation(true);\n            }}\n          />\n        </div>\n      </div>\n      <div className={css.fileDataContainer}>\n        <FileUploadData files={files || []} />\n      </div>\n      <BasicDialog\n        isOpen={showConfirmation}\n        abortText=\"Close\"\n        body=\"Are you sure you want to delete this file?\"\n        confirmText=\"Confirm\"\n        handleAbort={() => {\n          setShowConfirmation(false);\n        }}\n        handleConfirm={() => {\n          ref.current?.handleFileClear(fileIdToDelete);\n          setTimeout(() => {\n            setFiles(ref.current?.files);\n          });\n          setShowConfirmation(false);\n        }}\n        heading=\"Delete File\"\n        onClose={() => {\n          setShowConfirmation(false);\n        }}\n        semantic=\"danger\"\n      />\n    </>\n  );\n};\n\nWithDeletionConfirmationStory.args = {\n  label: 'Upload a file with deletion confirmation',\n  secondaryInstruction: 'Types: .png, .jpg or .jpeg',\n  maxFiles: 1,\n  accept: {\n    'image/jpeg': ['.jpg', '.jpeg'],\n    'image/png': ['.png'],\n  },\n  testId: 'file-upload-deletion-confirmation-story',\n};\n\n/**\n * Renders a FileUpload component with progress state.\n *\n * This example demonstrates how to use the FileUpload component with progress state.\n */\nexport const WithProgressStory = (args: FileUploadProps) => {\n  const [files, setFiles] = React.useState<FileObject[] | undefined>([]);\n  const ref = React.useRef<FileUploadRef>(null);\n\n  const mockState = (id: string) => {\n    let progress = 0;\n    const intervalId = setInterval(() => {\n      progress += 5;\n      if (progress >= 105) {\n        ref.current?.moveFileToSuccess(id);\n        clearInterval(intervalId);\n\n        setFiles(ref.current?.files);\n      } else {\n        ref.current?.moveFileToProgress(id, progress);\n      }\n    }, 100);\n  };\n\n  return (\n    <>\n      <div className={css.container}>\n        <div className={css.content}>\n          <FileUpload\n            {...args}\n            ref={ref}\n            onValidFilesDrop={(uploadedFiles) => {\n              uploadedFiles.forEach((file) => {\n                mockState(file.id);\n              });\n            }}\n            onRejectedFilesDrop={() => {\n              setFiles(ref.current?.files);\n            }}\n            onFileClear={() => {\n              setTimeout(() => {\n                setFiles(ref.current?.files);\n              });\n            }}\n          />\n        </div>\n      </div>\n      <div className={css.fileDataContainer}>\n        <FileUploadData files={files || []} />\n      </div>\n    </>\n  );\n};\n\nWithProgressStory.args = {\n  label: 'Upload a file with progress',\n  secondaryInstruction: 'Types: .png, .jpg or .jpeg',\n  maxFiles: 1,\n  accept: {\n    'image/jpeg': ['.jpg', '.jpeg'],\n    'image/png': ['.png'],\n  },\n  testId: 'file-upload-progress-story',\n};\n\n/**\n * Renders a FileUpload component with indeterminate progress state.\n *\n * This example demonstrates how to use the FileUpload component with indeterminate progress state.\n */\nexport const WithIndeterminateProgressStory = (args: FileUploadProps) => {\n  const [files, setFiles] = React.useState<FileObject[] | undefined>([]);\n  const ref = React.useRef<FileUploadRef>(null);\n\n  const mockState = (id: string) => {\n    ref.current?.moveFileToProgress(id, 'indeterminate');\n    setTimeout(() => {\n      ref.current?.moveFileToSuccess(id);\n      setFiles(ref.current?.files);\n    }, 5000);\n  };\n\n  return (\n    <>\n      <div className={css.container}>\n        <div className={css.content}>\n          <FileUpload\n            {...args}\n            ref={ref}\n            onValidFilesDrop={(uploadedFiles) => {\n              uploadedFiles.forEach((file) => {\n                mockState(file.id);\n              });\n            }}\n            onRejectedFilesDrop={() => {\n              setFiles(ref.current?.files);\n            }}\n            onFileClear={() => {\n              setTimeout(() => {\n                setFiles(ref.current?.files);\n              });\n            }}\n          />\n        </div>\n      </div>\n      <div className={css.fileDataContainer}>\n        <FileUploadData files={files || []} />\n      </div>\n    </>\n  );\n};\n\nWithIndeterminateProgressStory.args = {\n  label: 'Upload a file with indeterminate progress',\n  secondaryInstruction: 'Types: .png, .jpg or .jpeg',\n  maxFiles: 1,\n  accept: {\n    'image/jpeg': ['.jpg', '.jpeg'],\n    'image/png': ['.png'],\n  },\n  testId: 'file-upload-indeterminate-progress-story',\n};\n\n/**\n * Renders a FileUpload component with custom error and success messages.\n *\n * This example demonstrates how to use the FileUpload component with custom error and success messages.\n */\nexport const WithCustomErrorMessagesStory = (args: FileUploadProps) => {\n  const [files, setFiles] = React.useState<FileObject[] | undefined>([]);\n  const ref = React.useRef<FileUploadRef>(null);\n\n  const mockState = (id: string, idx: number) => {\n    let progress = 0;\n    const intervalId = setInterval(() => {\n      progress += 5;\n      if (progress >= 105) {\n        if (idx === 0) {\n          ref.current?.moveFileToReject(\n            id,\n            'File rejected: Your custom error message',\n          );\n        } else {\n          ref.current?.moveFileToSuccess(id);\n        }\n        clearInterval(intervalId);\n\n        setFiles(ref.current?.files);\n      } else {\n        ref.current?.moveFileToProgress(id, progress);\n      }\n    }, 100);\n  };\n\n  return (\n    <>\n      <div className={css.container}>\n        <div className={css.content}>\n          <FileUpload\n            {...args}\n            ref={ref}\n            onValidFilesDrop={(uploadedFiles) => {\n              uploadedFiles.forEach((file, idx) => {\n                mockState(file.id, idx);\n              });\n            }}\n            onRejectedFilesDrop={() => {\n              setFiles(ref.current?.files);\n            }}\n            onFileClear={() => {\n              setTimeout(() => {\n                setFiles(ref.current?.files);\n              });\n            }}\n          />\n        </div>\n      </div>\n      <div className={css.fileDataContainer}>\n        <FileUploadData files={files || []} />\n      </div>\n    </>\n  );\n};\n\nWithCustomErrorMessagesStory.args = {\n  label: 'Upload a file with custom error messages',\n  secondaryInstruction: 'Types: .png, .jpg or .jpeg',\n  maxFiles: 1,\n  accept: {\n    'image/jpeg': ['.jpg', '.jpeg'],\n    'image/png': ['.png'],\n  },\n  testId: 'file-upload-custom-error-story',\n};\n\n/**\n * Renders a FileUpload component with max size validation.\n *\n * This example demonstrates how to use the FileUpload component with max size validation.\n */\nexport const WithMaxSizeValidationStory = (args: FileUploadProps) => {\n  const [files, setFiles] = React.useState<FileObject[] | undefined>([]);\n  const ref = React.useRef<FileUploadRef>(null);\n\n  const mockState = (id: string) => {\n    let progress = 0;\n    const intervalId = setInterval(() => {\n      progress += 5;\n      if (progress >= 105) {\n        ref.current?.moveFileToSuccess(id);\n        clearInterval(intervalId);\n\n        setFiles(ref.current?.files);\n      } else {\n        ref.current?.moveFileToProgress(id, progress);\n      }\n    }, 100);\n  };\n\n  return (\n    <>\n      <div className={css.container}>\n        <div className={css.content}>\n          <FileUpload\n            {...args}\n            ref={ref}\n            onValidFilesDrop={(uploadedFiles) => {\n              uploadedFiles.forEach((file) => {\n                mockState(file.id);\n              });\n            }}\n            onRejectedFilesDrop={() => {\n              setFiles(ref.current?.files);\n            }}\n            onFileClear={() => {\n              setTimeout(() => {\n                setFiles(ref.current?.files);\n              });\n            }}\n          />\n        </div>\n      </div>\n      <div className={css.fileDataContainer}>\n        <FileUploadData files={files || []} />\n      </div>\n    </>\n  );\n};\n\nWithMaxSizeValidationStory.args = {\n  label: 'Upload a file with max size validation',\n  secondaryInstruction: 'Types: .png, .jpg or .jpeg',\n  maxFiles: 1,\n  accept: {\n    'image/jpeg': ['.jpg', '.jpeg'],\n    'image/png': ['.png'],\n  },\n  testId: 'file-upload-max-size-story',\n};\n\n/**\n * Renders a FileUpload component with re upload icon when file state is moved to error.\n *\n * This example demonstrates how to use the FileUpload component with reupload.\n */\nexport const WithFileRefreshStory = (args: FileUploadProps) => {\n  const ref = React.useRef<FileUploadRef>(null);\n  const [files, setFiles] = React.useState<FileObject[] | undefined>([]);\n\n  const mockState = (id: string) => {\n    let progress = 0;\n    const intervalId = setInterval(() => {\n      progress += 5;\n      if (progress >= 105) {\n        ref.current?.moveFileToSuccess(id);\n        clearInterval(intervalId);\n\n        setFiles(ref.current?.files);\n      } else {\n        ref.current?.moveFileToProgress(id, progress);\n      }\n    }, 100);\n  };\n\n  const mockReUpload = (id: string) => {\n    ref.current?.setShowReUpload(id, true);\n    setTimeout(() => {\n      setFiles(ref.current?.files);\n    });\n  };\n\n  return (\n    <>\n      <div className={css.container}>\n        <div className={css.content}>\n          <FileUpload\n            {...args}\n            ref={ref}\n            onValidFilesDrop={(uploadedFiles) => {\n              uploadedFiles.forEach((file) => {\n                mockState(file.id);\n              });\n            }}\n            onRejectedFilesDrop={(uploadedFiles) => {\n              uploadedFiles.forEach((file) => {\n                mockReUpload(file.id);\n              });\n            }}\n            onFileRefreshClick={(file) => {\n              mockState(file.id);\n            }}\n            onFileClear={() => {\n              setTimeout(() => {\n                setFiles(ref.current?.files);\n              });\n            }}\n          />\n        </div>\n      </div>\n      <div className={css.fileDataContainer}>\n        <FileUploadData files={files || []} />\n      </div>\n    </>\n  );\n};\n\nWithFileRefreshStory.args = {\n  label: 'Upload a file with refresh functionality',\n  secondaryInstruction: 'Types: .png, .jpg or .jpeg',\n  maxFiles: 1,\n  accept: {\n    'image/jpeg': ['.jpg', '.jpeg'],\n    'image/png': ['.png'],\n  },\n  testId: 'file-upload-refresh-story',\n};\n\ninterface FileUploadTableProps {\n  files: Array<FileObject>;\n}\n\nconst emptyText = getRandomDataVariation();\n\nconst FileUploadData = ({files}: FileUploadTableProps) => (\n  <div className={css.dataTable}>\n    <SubTitleMedium color=\"warning\" className={css.textLabel}>\n      Data Table(This is not a part of File Upload Component)\n    </SubTitleMedium>\n    <DataTable files={files} />\n  </div>\n);\n\nconst DataTable = ({files}: {files: Array<FileObject>}) => (\n  <Table\n    entries={files}\n    emptyText={\n      <div className={css.emptyStateWrapper}>\n        <EmptyState\n          imageVariant=\"data\"\n          title={emptyText.title}\n          description={emptyText.description}\n        ></EmptyState>\n      </div>\n    }\n    headers={[\n      {\n        key: 'file',\n        label: `File Name`,\n        render: ({data}) => (\n          <BasicSingleCell className={css.mediumColumn}>\n            <BodyMedium color={data.success ? 'success' : 'danger'}>\n              <Truncate>{data.file.name}</Truncate>\n            </BodyMedium>\n          </BasicSingleCell>\n        ),\n      },\n      {\n        key: 'file',\n        label: `File Type`,\n        render: ({data}) => (\n          <BasicSingleCell className={css.mediumColumn}>\n            <Link\n              as=\"bodyMedium\"\n              href=\"https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types\"\n              target=\"_blank\"\n            >\n              <Truncate>{data.file.type}</Truncate>\n            </Link>\n          </BasicSingleCell>\n        ),\n      },\n      {\n        key: 'file',\n        label: 'File Size',\n        render: ({data, className}) => (\n          <BasicSingleCell className={className}>\n            <BodyMedium>{convertFileSize(data.file.size)}</BodyMedium>\n          </BasicSingleCell>\n        ),\n      },\n      {\n        key: 'success',\n        label: 'Is file Valid',\n        render: ({data, className}) => (\n          <BasicSingleCell className={className}>\n            <BodyMedium>{data.success ? 'true' : 'false'}</BodyMedium>\n          </BasicSingleCell>\n        ),\n      },\n      {\n        key: 'reject',\n        label: 'Is File Rejected?',\n        render: ({data, className}) => (\n          <BasicSingleCell className={className}>\n            <BodyMedium>{data.reject ? 'true' : 'false'}</BodyMedium>\n          </BasicSingleCell>\n        ),\n      },\n      {\n        key: 'rejectReason',\n        label: 'Rejection Reason',\n        render: ({data, className}) => (\n          <BasicSingleCell className={className}>\n            <BodyMedium>{data.rejectReason || '-'}</BodyMedium>\n          </BasicSingleCell>\n        ),\n      },\n      {\n        key: 'showReUpload',\n        label: 'Show ReUpload',\n        render: ({data, className}) => (\n          <BasicSingleCell className={className}>\n            <BodyMedium>{data.showReUpload ? 'true' : 'false'}</BodyMedium>\n          </BasicSingleCell>\n        ),\n      },\n    ]}\n  />\n);\nSingleFileStory.storyName = 'Single File';\nMultiFileStory.storyName = 'Multi File';\nWithDeletionConfirmationStory.storyName = 'With Deletion Confirmation';\nWithProgressStory.storyName = 'With Progress';\nWithIndeterminateProgressStory.storyName = 'With Indeterminate Progress';\nWithCustomErrorMessagesStory.storyName = 'With Custom Error Messages';\nWithMaxSizeValidationStory.storyName = 'With Max Size Validation';\nWithFileRefreshStory.storyName = 'With File Refresh';\n"
        },
        "css": {
          "path": "FileUpload.module.css",
          "content": "@value (\n  colorTextSecondary,\n  colorBackgroundPrimary,\n  colorBackgroundTertiary,\n  colorBorderTertiary,\n  colorTextPrimary,\n  colorTextTertiary,\n  colorTextSuccess,\n  colorTextDisabled,\n  colorBorderPrimary,\n  colorBorderSecondary,\n  colorTextClickable,\n  colorTextDanger,\n  colorDangerLightest,\n  colorInformationLightest,\n  colorFocusPrimary\n) from '../../styles/variables/_color.css';\n\n@value (\n  borderWidthNone,\n  borderWidthPrimary,\n  borderWidthTertiary,\n  borderRadiusMedium\n) from '../../styles/variables/_border.css';\n\n@value (\n  spaceXXSmall,\n  spaceXSmall,\n  spaceMedium,\n  spaceLarge\n) from '../../styles/variables/_space.css';\n\n@value (\n  size2,\n  size18,\n  size34\n  size48,\n  size50,\n  size70,\n  size125,\n  size240,\n  sizeFluid\n) from '../../styles/variables/_size.css';\n\n.wrapper {\n  display: flex;\n  flex-direction: column;\n  width: sizeFluid;\n  gap: spaceXSmall;\n}\n\n.dropzone {\n  cursor: pointer;\n  display: flex;\n  flex-flow: column;\n  gap: spaceXSmall;\n  width: sizeFluid;\n  padding: spaceLarge;\n  justify-content: center;\n  align-items: center;\n  min-height: size125;\n  border: borderWidthPrimary solid colorBorderPrimary;\n  border-radius: borderRadiusMedium;\n  outline: none;\n  color: colorTextSecondary;\n  background-color: colorBackgroundTertiary;\n}\n\n.dropzone:hover,\n.dragActive {\n  border-color: colorBorderTertiary;\n  background-color: colorBackgroundPrimary;\n}\n\n.dropzone:focus {\n  background-color: colorBackgroundPrimary;\n  border-color: colorTextClickable;\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n\n.dropzone.disabled {\n  pointer-events: none;\n  cursor: not-allowed;\n  color: colorTextDisabled;\n  border: borderWidthPrimary solid colorBorderPrimary;\n  background-color: colorBackgroundPrimary;\n}\n\n.instruction {\n  composes: buttonTextSmall from '../../styles/typography.module.css';\n  color: inherit;\n  text-decoration: underline;\n  max-width: size125;\n  text-align: center;\n}\n\n.secondaryInstruction {\n  composes: bodySmall from '../../styles/typography.module.css';\n  color: inherit;\n  max-width: size240;\n  text-align: center;\n}\n\n.files {\n  display: flex;\n  flex-flow: column;\n  gap: spaceXSmall;\n}\n\n.file {\n  display: flex;\n  height: size50;\n  padding: spaceXSmall;\n  align-items: center;\n  justify-content: space-between;\n  gap: spaceXSmall;\n  background-color: colorBackgroundPrimary;\n  border-bottom: borderWidthPrimary solid colorBorderSecondary;\n}\n\n.fileInfo {\n  display: flex;\n  flex-flow: column;\n  gap: spaceXSmall;\n  width: sizeFluid;\n}\n\n.fileNameBlock {\n  display: flex;\n  composes: formLabelMedium from '../../styles/typography.module.css';\n  color: colorTextPrimary;\n  gap: spaceXXSmall;\n  align-items: center;\n}\n\n.fileName {\n  display: flex;\n  color: inherit;\n}\n\n.fileError,\n.fileSuccess {\n  composes: bodySmall from '../../styles/typography.module.css';\n  margin-left: calc(size18 + spaceXXSmall);\n  margin-top: calc(spaceXSmall * -1);\n}\n\n.fileError {\n  color: colorTextDanger;\n}\n\n.fileSuccess {\n  color: colorTextSuccess;\n}\n\n.icon {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  min-width: size18;\n  min-height: size18;\n}\n\n.rightSection {\n  display: flex;\n}\n\n.rightBlock {\n  min-width: size34;\n  min-height: size34;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.label {\n  display: flex;\n  gap: spaceXXSmall;\n  composes: formLabelSmall from '../../styles/typography.module.css';\n  color: colorTextSecondary;\n}\n\n.required {\n  color: colorTextDanger;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/FileUpload/FileBlock';\nexport * from '../../components/FileUpload/FileUpload';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "FileBlock/FileBlock.d.ts": {
            "path": "FileBlock/FileBlock.d.ts",
            "content": "import type { Flow } from 'flow-to-typescript-codemod';\nimport type { FileObject } from '../../../components/FileUpload/FileUpload';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n}>;\nexport interface FileBlockProps {\n    classNames?: ClassNames;\n    fileObject: FileObject;\n    onFileRefreshClick?: (file: FileObject) => unknown;\n    handleFileClear?: (id: string) => unknown;\n    showRemoveFile?: boolean;\n    testId?: string;\n}\nexport declare const FileBlock: Flow.AbstractComponent<FileBlockProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=FileBlock.d.ts.map"
          },
          "FileBlock/index.d.ts": {
            "path": "FileBlock/index.d.ts",
            "content": "export * from '../../../components/FileUpload/FileBlock/FileBlock';\n//# sourceMappingURL=index.d.ts.map"
          }
        }
      },
      "allFiles": [
        "FileBlock/FileBlock.stories.tsx",
        "FileBlock/FileBlock.tsx",
        "FileBlock/index.ts",
        "FileUpload.module.css",
        "FileUpload.stories.module.css",
        "FileUpload.stories.tsx",
        "FileUpload.tsx",
        "index.ts"
      ]
    },
    "FilterButtonOverlay": {
      "name": "FilterButtonOverlay",
      "path": "src/components/FilterButtonOverlay",
      "files": {
        "main": {
          "path": "FilterButtonOverlay.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { ClickAwayRefType } from '../../utils';\nimport type { ButtonProps, ButtonSize } from '../../components/Button';\nimport type { AnchorType, Strategy } from '../../components/ButtonDropdown';\nimport type { ElevationType } from '../../components/Tooltip';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    overlayContainer?: string;\n}>;\nexport type FilterButtonOverlaySizeTypes = 'medium' | 'small';\nexport type NewButtonProps = Flow.Diff<ButtonProps, {\n    children?: React.ReactNode;\n}>;\nexport interface FilterButtonOverlayProps extends Omit<NewButtonProps, 'classNames' | 'children' | 'positionStrategy' | 'anchorPosition' | 'clickAwayRef' | 'isFluid' | 'size' | 'buttonLabel' | 'buttonSize' | 'elevation' | 'buttonIsFluid'> {\n    classNames?: ClassNames;\n    children: React.ReactNode;\n    positionStrategy?: Strategy;\n    anchorPosition?: AnchorType;\n    clickAwayRef?: React.RefObject<ClickAwayRefType | null>;\n    isFluid?: boolean;\n    size?: FilterButtonOverlaySizeTypes;\n    buttonLabel?: React.ReactNode;\n    buttonSize?: ButtonSize;\n    elevation?: ElevationType;\n    buttonIsFluid?: boolean;\n    testId?: string;\n}\nexport declare const FilterButtonOverlay: Flow.AbstractComponent<FilterButtonOverlayProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=FilterButtonOverlay.d.ts.map"
        },
        "story": {
          "path": "FilterButtonOverlay.stories.tsx",
          "content": "import * as React from 'react';\nimport {useCallback, useRef} from 'react';\n\nimport type {ClickAwayRefType} from 'src/utils/click-away';\n\nimport {\n  BUTTON_ACTION_TYPE,\n  BUTTON_SIZE,\n  BUTTON_TYPES,\n} from 'src/components/Button';\nimport {\n  ANCHOR_POSITION_TYPE,\n  STRATEGY_TYPE,\n} from 'src/components/ButtonDropdown';\nimport {SimpleDropdown} from 'src/components/Dropdown';\nimport type {FilterButtonOverlayProps} from 'src/components/FilterButtonOverlay';\nimport {FilterButtonOverlay} from 'src/components/FilterButtonOverlay/FilterButtonOverlay';\nimport {ELEVATION_TYPES} from 'src/components/Tooltip';\n\nimport css from 'src/components/FilterButtonOverlay/FilterButtonOverlay.stories.module.css';\n\n\nconst anchorPositionOptions: Array<unknown> = [\n  ...Object.values(ANCHOR_POSITION_TYPE),\n];\nconst positionStrategyOptions: Array<unknown> = [\n  ...Object.values(STRATEGY_TYPE),\n];\nconst actionTypeOptions: Array<unknown> = [\n  ...Object.values(BUTTON_ACTION_TYPE),\n];\nconst buttonTypeOptions: Array<unknown> = [...Object.values(BUTTON_TYPES)];\nconst buttonSizeOptions: Array<unknown> = [...Object.values(BUTTON_SIZE)];\nconst elevationOptions: Array<unknown> = [...Object.values(ELEVATION_TYPES)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Filter Button Overlay',\n  component: FilterButtonOverlay,\n  argTypes: {\n    onClick: {\n      description:\n        '**onClick** handler that is applied to the root `<button>` element',\n      action: 'clicked',\n      table: {\n        type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n      },\n    },\n    classNames: {\n      description: 'External classNames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: '{wrapper?: string, icon?: string, text?: string}'},\n      },\n    },\n    iconLeftName: {\n      description:\n        'Left icon to be applied to the button, it internally uses the `Icon` component to render icons',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    iconLeftType: {\n      description:\n        'Type of Left Icon. Type represents 4 unique icon styles :- Solid, Regular, Duotone and Brands',\n      options: ['regular', 'solid', 'duotone', 'brands'],\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'regular'},\n      },\n    },\n    elevation: {\n      description:\n        'Elevation level for the dropdown menu. This controls the z-index stacking order. Default is set to \"modal\" elevation. Use higher elevation levels when rendering the dropdown above other elevated elements like Modal, Toast, etc.',\n      control: {\n        type: 'select',\n      },\n      options: elevationOptions,\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'modal'},\n      },\n    },\n    iconRightName: {\n      description:\n        'Right icon to be applied to the button, it internally uses the `Icon` component to render icons',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    iconRightType: {\n      description:\n        'Type of Right Icon. Type represents 4 unique icon styles :- Solid, Regular, Duotone and Brands',\n      options: ['regular', 'solid', 'duotone', 'brands'],\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'regular'},\n      },\n    },\n    type: {\n      options: buttonTypeOptions,\n      description: 'Type of Button. Supported types are listed on the dropdown',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'primary'},\n      },\n    },\n    actionType: {\n      options: actionTypeOptions,\n      description:\n        'Type of action to perform upon Button click. Supported types are listed on the dropdown',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'button'},\n      },\n    },\n    buttonSize: {\n      description:\n        'Button supports only two size variants namely small and medium. `small` < `medium`',\n      options: buttonSizeOptions,\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    disabled: {\n      description: 'If **true**, the component is disabled',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    isLoading: {\n      description:\n        'If **true**, the component would show a circular loader and also preserve the current size of button so that there are no jumps',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n      },\n    },\n    buttonIsFluid: {\n      description:\n        'If **true**, the component would take the container\\'s `width`',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n      },\n    },\n    buttonLabel: {\n      description: 'The content of the Button',\n      table: {\n        type: {summary: 'React.Component | string'},\n      },\n    },\n    ariaLabel: {\n      control: {\n        type: 'text',\n      },\n      description:\n        '**aria-label** should be used where Button do not have have discernible text. This would avoid accessibility violations in screen readers',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    anchorPosition: {\n      options: anchorPositionOptions,\n      description:\n        'Position of Menu relative to its reference element. It can be any one value from the dropdown',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'bottom-start'},\n      },\n    },\n    positionStrategy: {\n      options: positionStrategyOptions,\n      description:\n        'Position of Menu relative to either its nearest positioned ancestor (absolute) or its nearest containing block- usually the viewport (fixed). It can be any one value from the dropdown',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'absolute'},\n      },\n    },\n    clickAwayRef: {\n      type: {optional: true},\n      description: 'ref that contains the functions to open or close the child',\n      table: {\n        type: {\n          summary: 'ClickAwayRefType',\n        },\n      },\n    },\n    isFluid: {\n      description:\n        'If **true**, the component would take the container\\'s `width`',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n      },\n    },\n    size: {\n      description:\n        'Button supports only two size variants namely small and medium. `small` < `medium`',\n      control: {\n        type: 'radio',\n      },\n      options: ['small', 'medium'],\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a FilterButtonOverlay component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { FilterButtonOverlay } from \"@spaced-out/ui-design-system/lib/components/FilterButtonOverlay\";\n\\`\\`\\`\nThis component serves as a filter wrapper with a button trigger. It uses children to render any type of custom filter content.\n\n\n### Usage:\n\n\\`\\`\\`jsx\n<FilterButtonOverlay buttonLabel=\"Filters\" buttonSize=\"medium\" iconLeftName=\"bars-filter\" type=\"tertiary\">\n  <SimpleDropdown\n    label=\"Recipient\"\n    options={recipientOptions}\n    onChange={onSelected}\n  />\n  <SimpleDropdown\n    label=\"Send From?\"\n    options={sendFromOptions}\n    onChange={onSelected}\n  />\n  <SimpleDropdown\n    label=\"Sent Status?\"\n    options={sentStatusOptions}\n    onChange={onSelected}\n  />\n</FilterButtonOverlay>\n\\`\\`\\`\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/FilterButtonOverlay/FilterButtonOverlay',\n    },\n  },\n};\n\nconst convertToOptions = (items: Array<string>) =>\n  items.map((item) => ({\n    key: item,\n    label: item,\n  }));\n\nconst recipientOptions = convertToOptions(['Candidate', 'Employees']);\nconst sendFromOptions = convertToOptions(['SMS', 'EMAIL', 'Whatsapp']);\nconst sentStatusOptions = convertToOptions(['Sent', 'Pending']);\n\nexport const FilterButtonOverlayStory = (args: FilterButtonOverlayProps) => (\n  <div className={css.container}>\n    <FilterButtonOverlay {...args}>\n      <SimpleDropdown label=\"Recipient\" options={recipientOptions} />\n      <SimpleDropdown label=\"Send From?\" options={sendFromOptions} />\n      <SimpleDropdown label=\"Sent Status?\" options={sentStatusOptions} />\n    </FilterButtonOverlay>\n  </div>\n);\n\nFilterButtonOverlayStory.args = {\n  buttonLabel: 'Filters',\n  buttonSize: 'medium',\n  iconLeftName: 'bars-filter',\n  type: 'tertiary',\n  classNames: {\n    overlayContainer: css.overlayContainer,\n  },\n  testId: 'filter-button-overlay-story',\n};\n\nexport const FilterButtonOverlayWithAutoCloseStory = (\n  args: FilterButtonOverlayProps,\n) => {\n  const clickAwayRef = useRef<ClickAwayRefType>(null);\n\n  const onSelected = useCallback(() => {\n    if (clickAwayRef.current) {\n      clickAwayRef.current?.forceClose();\n    }\n  }, []);\n\n  return (\n    <div className={css.container}>\n      <FilterButtonOverlay {...args} clickAwayRef={clickAwayRef}>\n        <SimpleDropdown\n          label=\"Recipient\"\n          options={recipientOptions}\n          onChange={onSelected}\n        />\n        <SimpleDropdown\n          label=\"Send From?\"\n          options={sendFromOptions}\n          onChange={onSelected}\n        />\n        <SimpleDropdown\n          label=\"Sent Status?\"\n          options={sentStatusOptions}\n          onChange={onSelected}\n        />\n      </FilterButtonOverlay>\n    </div>\n  );\n};\n\nFilterButtonOverlayWithAutoCloseStory.args = {\n  buttonLabel: 'Filters',\n  buttonSize: 'medium',\n  iconLeftName: 'bars-filter',\n  type: 'tertiary',\n  classNames: {\n    overlayContainer: css.overlayContainer,\n  },\n  testId: 'filter-button-overlay-with-auto-close-story',\n};\nFilterButtonOverlayStory.storyName = 'Filter Button Overlay';\nFilterButtonOverlayWithAutoCloseStory.storyName =\n  'Filter Button Overlay With Auto Close';\n"
        },
        "css": {
          "path": "FilterButtonOverlay.module.css",
          "content": "@value (colorBackgroundTertiary) from '../../styles/variables/_color.css';\n@value (size160, sizeFluid, size300, size240) from '../../styles/variables/_size.css';\n@value (borderRadiusMedium) from '../../styles/variables/_border.css';\n@value (elevationMenu) from '../../styles/variables/_elevation.css';\n\n.overlayWrapper {\n  composes: boxShadow2 from '../../styles/shadow.module.css';\n  composes: borderPrimary from '../../styles/border.module.css';\n  display: flex;\n  position: relative;\n  background-color: colorBackgroundTertiary;\n  flex-flow: column;\n  min-width: size160;\n  border-radius: borderRadiusMedium;\n}\n\n.overlayContainer {\n  width: var(--dropdown-width);\n  z-index: var(--menu-elevation);\n}\n\n.medium {\n  width: size300;\n  min-width: size300;\n}\n\n.small {\n  width: size240;\n  min-width: size240;\n}\n\n.fluid {\n  width: sizeFluid;\n  min-width: size160;\n}\n\n.isFluid {\n  width: sizeFluid;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/FilterButtonOverlay/FilterButtonOverlay';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "FilterButtonOverlay.module.css",
        "FilterButtonOverlay.stories.module.css",
        "FilterButtonOverlay.stories.tsx",
        "FilterButtonOverlay.tsx",
        "index.ts"
      ]
    },
    "FocusManager": {
      "name": "FocusManager",
      "path": "src/components/FocusManager",
      "files": {
        "main": {
          "path": "FocusManager.d.ts",
          "content": "import * as React from 'react';\nimport type { FloatingFocusManagerProps } from '@floating-ui/react';\nimport { FloatingPortal } from '@floating-ui/react';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n}>;\ninterface FloatingPortalProps {\n    children?: React.ReactNode;\n    id?: string;\n    root?: HTMLElement | null | React.MutableRefObject<HTMLElement | null>;\n    preserveTabOrder?: boolean;\n}\nexport declare const GenesisFloatingPortal: (props: FloatingPortalProps) => React.JSX.Element;\nexport declare const GenesisFloatingFocusManager: (props: FloatingFocusManagerProps) => React.JSX.Element;\nexport interface FocusManagerProps {\n    classNames?: ClassNames;\n    children?: React.ReactNode;\n    initialFocus?: number;\n    returnFocus?: boolean;\n    guards?: boolean;\n    modal?: boolean;\n    testId?: string;\n}\nexport { FloatingPortal };\nexport declare const FocusManager: (props: FocusManagerProps) => React.JSX.Element;\n//# sourceMappingURL=FocusManager.d.ts.map"
        },
        "story": {
          "path": "FocusManager.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {Button} from 'src/components/Button';\nimport {Card} from 'src/components/Card';\nimport type {FocusManagerProps} from 'src/components/FocusManager';\nimport {FocusManager} from 'src/components/FocusManager/FocusManager';\nimport {BodyLarge, BodySmall} from 'src/components/Text';\n\nimport css from 'src/components/FocusManager/FocusManager.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Utils/Focus Manager',\n  component: FocusManager,\n  argTypes: {\n    classNames: {\n      description: 'Provide an optional className to be applied to the wrapper',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{wrapper?: string}',\n        },\n      },\n    },\n    children: {\n      description: 'The children to be rendered inside the FocusManager',\n      table: {\n        type: {summary: 'React.Node'},\n      },\n    },\n    initialFocus: {\n      description:\n        'Which element to initially focus. Can be a number (tabbable index as specified by the order)',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: '-1'},\n      },\n    },\n    returnFocus: {\n      description:\n        'Determines if focus should be returned to the reference element (or if that is not available, the previously focused element). This prop is ignored if the floating element lost focus.',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'true'},\n      },\n    },\n    guards: {\n      description:\n        'Determines if the focus guards are rendered. If not, focus can escape into the address bar/console/browser UI, like in native dialogs.',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'true'},\n      },\n    },\n    modal: {\n      description:\n        'Determines if focus is “modal”, meaning focus is fully trapped inside the floating element and outside content cannot be accessed. This includes screen reader virtual cursors.',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'true'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a FocusManager component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { FocusManager } from \"@spaced-out/ui-design-system/lib/components/FocusManager\";\n\\`\\`\\`\nProvides flexible non-modal focus management for an element.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/FocusManager/FocusManager',\n    },\n  },\n};\n\nexport const FocusManagerStory = (args: FocusManagerProps) => (\n  <div className={css.container}>\n    <FocusManager {...args}>\n      <Card classNames={{wrapper: css.cardContainer}}>\n        <BodyLarge>This is a focus management demo</BodyLarge>\n        <BodySmall>This card has multiple focusable buttons.</BodySmall>\n        <BodySmall>\n          Focus is trapped and rotated between all the focusable elements\n        </BodySmall>\n        <Button type=\"tertiary\">Focus Me</Button>\n        <Button type=\"tertiary\">Focus Me</Button>\n        <Button type=\"tertiary\">Focus Me</Button>\n        <Button type=\"tertiary\">Focus Me</Button>\n        <Button type=\"tertiary\">Focus Me</Button>\n      </Card>\n    </FocusManager>\n  </div>\n);\n\nFocusManagerStory.args = {\n  initialFocus: 2,\n  testId: 'focus-manager-story',\n};\nFocusManagerStory.storyName = 'Focus Manager';\n"
        },
        "css": {
          "path": "FocusManager.module.css",
          "content": ".wrapper {\n  display: flex;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/FocusManager/FocusManager';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "FocusManager.module.css",
        "FocusManager.stories.module.css",
        "FocusManager.stories.tsx",
        "FocusManager.tsx",
        "index.ts"
      ]
    },
    "FocusManagerWithArrowKeyNavigation": {
      "name": "FocusManagerWithArrowKeyNavigation",
      "path": "src/components/FocusManagerWithArrowKeyNavigation",
      "files": {
        "main": {
          "path": "FocusManagerWithArrowKeyNavigation.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { FocusManagerProps } from '../../components/FocusManager';\nexport interface SkipElementFromNavigationProps {\n    children: React.ReactNode;\n    className?: string;\n    testId?: string;\n}\nexport declare const SkipElementFromNavigation: Flow.AbstractComponent<SkipElementFromNavigationProps, HTMLDivElement>;\nexport interface FocusManagerWithArrowKeyNavigationProps extends Omit<FocusManagerProps, 'cols' | 'orientation' | 'focusItemOnOpen' | 'loop' | 'listReference'> {\n    cols?: number;\n    orientation?: 'horizontal' | 'vertical';\n    focusItemOnOpen?: 'auto' | boolean;\n    loop?: boolean;\n    listReference?: {\n        current: Array<HTMLElement>;\n    };\n    testId?: string;\n}\nexport declare const FocusManagerWithArrowKeyNavigation: (props: FocusManagerWithArrowKeyNavigationProps) => React.JSX.Element;\n//# sourceMappingURL=FocusManagerWithArrowKeyNavigation.d.ts.map"
        },
        "story": {
          "path": "FocusManagerWithArrowKeyNavigation.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {Button, UnstyledButton} from 'src/components/Button';\nimport type {FocusManagerWithArrowKeyNavigationProps} from 'src/components/FocusManagerWithArrowKeyNavigation';\nimport {\n  FocusManagerWithArrowKeyNavigation,\n  SkipElementFromNavigation,\n} from 'src/components/FocusManagerWithArrowKeyNavigation/FocusManagerWithArrowKeyNavigation';\nimport {SubTitleExtraSmall} from 'src/components/Text';\n\nimport css from 'src/components/FocusManagerWithArrowKeyNavigation/FocusManagerWithArrowKeyNavigation.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Utils/Focus Manager With Arrow Key Navigation',\n  component: FocusManagerWithArrowKeyNavigation,\n  argTypes: {\n    classNames: {\n      description: 'Provide an optional className to be applied to the wrapper',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{wrapper?: string}',\n        },\n      },\n    },\n    children: {\n      description:\n        'The children to be rendered inside the FocusManager And provides list and grid navigation',\n      table: {\n        type: {summary: 'React.Node'},\n      },\n    },\n    initialFocus: {\n      description:\n        'Which element to initially focus. Can be a number (tabbable index as specified by the order)',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: '-1'},\n      },\n    },\n    returnFocus: {\n      description:\n        'Determines if focus should be returned to the reference element (or if that is not available, the previously focused element). This prop is ignored if the floating element lost focus.',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'true'},\n      },\n    },\n    modal: {\n      description:\n        'Determines if focus is “modal”, meaning focus is fully trapped inside the floating element and outside content cannot be accessed. This includes screen reader virtual cursors.',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'true'},\n      },\n    },\n    guards: {\n      description:\n        'Determines if the focus guards are rendered. If not, focus can escape into the address bar/console/browser UI, like in native dialogs.',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'true'},\n      },\n    },\n    cols: {\n      description:\n        'For a list it should be 1. For grid, you can have cols set according to your use-case',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: '1'},\n      },\n    },\n    orientation: {\n      options: ['vertical', 'horizontal'],\n      description:\n        'For list, orientation should be vertical. For grid, the orientation should be set to horizontal',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'vertical'},\n      },\n    },\n    loop: {\n      description:\n        'Determines whether to restart from the beginning or end if the user has navigated to the boundary of the list and grid(in vertical direction only).',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    listReference: {\n      description:\n        'User can provide custom list of elements to navigate between by using listReference. It accepts a list of ref nodes',\n    },\n    focusItemOnOpen: {\n      description:\n        'Determines whether to focus the item upon opening the floating element. \"auto\" infers what to do based on the input type (keyboard vs. pointer), while a boolean value will force the value. \\n **Note**: By default value is \"auto\" string.',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'auto'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle:\n        'Generates a FocusManager component with list or grid navigation.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { FocusManagerWithArrowKeyNavigation, SkipElementFromNavigation } from \"@spaced-out/ui-design-system/lib/components/FocusManagerWithArrowKeyNavigation\";\n\\`\\`\\`\nProvides flexible non-modal focus management for an element and also provides navigation(list or grid) with arrow keys for the children elements passed. \\n **Note:** If there are elements you want to skip in navigation, you should wrap the element using **SkipElementFromNavigation**, which will not be indexed. In case of Grid, if you have any empty slots, calling component should take care of it. For practical implementation of both cases check examples below.\n        `,\n      },\n    },\n    storySource: {\n      componentPath:\n        '/src/components/FocusManagerWithArrowKeyNavigation/FocusManagerWithArrowKeyNavigation',\n    },\n  },\n};\n\nexport const FocusManagerWithGridNavigationStory = (\n  args: FocusManagerWithArrowKeyNavigationProps,\n) => {\n  const onClick = (e: React.SyntheticEvent<HTMLElement>) => {\n    console.error('checking pass through', e);\n  };\n  const numbers = [\n    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,\n  ];\n  const alphabets = [\n    'A',\n    'B',\n    'C',\n    'D',\n    'E',\n    'F',\n    'G',\n    'H',\n    'I',\n    'J',\n    'K',\n    'L',\n    'M',\n    'N',\n    'O',\n  ];\n  const smallCase = [\n    'a',\n    'b',\n    'c',\n    'd',\n    'e',\n    'f',\n    'g',\n    'h',\n    'i',\n    'j',\n    'k',\n    'l',\n    'm',\n    'n',\n    'o',\n  ];\n  return (\n    <FocusManagerWithArrowKeyNavigation\n      initialFocus={0}\n      cols={5}\n      orientation=\"horizontal\"\n      classNames={{wrapper: css.wrapper}}\n      {...args}\n    >\n      <SkipElementFromNavigation className={css.categoryName}>\n        <SubTitleExtraSmall color=\"clickable\">{'Numbers'}</SubTitleExtraSmall>\n      </SkipElementFromNavigation>\n      {numbers.map((number) => (\n        <Button\n          type=\"ghost\"\n          key={number}\n          classNames={{wrapper: css.btnWidth}}\n          onClick={onClick}\n        >\n          {number}\n        </Button>\n      ))}\n      <SkipElementFromNavigation className={css.categoryName}>\n        <SubTitleExtraSmall color=\"clickable\">{'Alphabets'}</SubTitleExtraSmall>\n      </SkipElementFromNavigation>\n      {alphabets.map((alphabet) => (\n        <Button\n          type=\"ghost\"\n          key={alphabet}\n          classNames={{wrapper: css.btnWidth}}\n          onClick={onClick}\n        >\n          {alphabet}\n        </Button>\n      ))}\n      <SkipElementFromNavigation className={css.categoryName}>\n        <SubTitleExtraSmall color=\"clickable\">{'SmallCase'}</SubTitleExtraSmall>\n      </SkipElementFromNavigation>\n      {smallCase.map((alphabet) => (\n        <Button\n          type=\"ghost\"\n          key={alphabet}\n          classNames={{wrapper: css.btnWidth}}\n          onClick={onClick}\n        >\n          {alphabet}\n        </Button>\n      ))}\n    </FocusManagerWithArrowKeyNavigation>\n  );\n};\n\nFocusManagerWithGridNavigationStory.args = {\n  loop: true,\n  focusItemOnOpen: 'auto',\n  testId: 'focus-manager-grid-navigation-story',\n};\n\nexport const FocusManagerWithGridNavigationHavingEmptyElementsStory = () => {\n  const onClick = (e: React.SyntheticEvent<HTMLElement>) => {\n    console.error('checking pass through', e);\n  };\n  const numbers = [\n    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,\n  ];\n  const alphabets = [\n    'A',\n    'B',\n    'C',\n    'D',\n    'E',\n    'F',\n    'G',\n    'H',\n    'I',\n    'J',\n    'K',\n    'L',\n  ];\n  const smallCase = [\n    'a',\n    'b',\n    'c',\n    'd',\n    'e',\n    'f',\n    'g',\n    'h',\n    'i',\n    'j',\n    'k',\n    'l',\n    'm',\n    'n',\n    'o',\n  ];\n  return (\n    <FocusManagerWithArrowKeyNavigation\n      initialFocus={0}\n      cols={5}\n      orientation=\"horizontal\"\n      classNames={{wrapper: css.wrapper}}\n    >\n      <SkipElementFromNavigation className={css.categoryName}>\n        <SubTitleExtraSmall color=\"clickable\">{'Numbers'}</SubTitleExtraSmall>\n      </SkipElementFromNavigation>\n      {numbers.map((number) => (\n        <Button\n          type=\"ghost\"\n          key={number}\n          classNames={{wrapper: css.btnWidth}}\n          onClick={onClick}\n        >\n          {number}\n        </Button>\n      ))}\n      {/* adding two empty slots for consistent navigation in grid */}\n      <UnstyledButton disabled={true}></UnstyledButton>\n      <UnstyledButton disabled={true}></UnstyledButton>\n      <SkipElementFromNavigation className={css.categoryName}>\n        <SubTitleExtraSmall color=\"clickable\">{'Alphabets'}</SubTitleExtraSmall>\n      </SkipElementFromNavigation>\n      {alphabets.map((alphabet) => (\n        <Button\n          type=\"ghost\"\n          key={alphabet}\n          classNames={{wrapper: css.btnWidth}}\n          onClick={onClick}\n        >\n          {alphabet}\n        </Button>\n      ))}\n      {/* adding three empty slots for consistent navigation in grid*/}\n      <UnstyledButton disabled={true}></UnstyledButton>\n      <UnstyledButton disabled={true}></UnstyledButton>\n      <UnstyledButton disabled={true}></UnstyledButton>\n      <SkipElementFromNavigation className={css.categoryName}>\n        <SubTitleExtraSmall color=\"clickable\">{'SmallCase'}</SubTitleExtraSmall>\n      </SkipElementFromNavigation>\n      {smallCase.map((alphabet) => (\n        <Button\n          type=\"ghost\"\n          key={alphabet}\n          classNames={{wrapper: css.btnWidth}}\n          onClick={onClick}\n        >\n          {alphabet}\n        </Button>\n      ))}\n    </FocusManagerWithArrowKeyNavigation>\n  );\n};\n\nexport const FocusManagerWithListNavigationStory = () => {\n  const onClick = (e: React.SyntheticEvent<HTMLElement>) => {\n    console.error('checking pass through', e);\n  };\n  const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];\n  return (\n    <FocusManagerWithArrowKeyNavigation\n      initialFocus={0}\n      cols={1}\n      orientation=\"vertical\"\n      classNames={{wrapper: css.wrapper}}\n    >\n      {numbers.map((number) => (\n        <Button\n          type=\"ghost\"\n          key={number}\n          classNames={{wrapper: css.btnWidth}}\n          onClick={onClick}\n          isFluid={true}\n        >\n          {number}\n        </Button>\n      ))}\n    </FocusManagerWithArrowKeyNavigation>\n  );\n};\n\nexport const FocusManagerWithGridNavigationUsingListReferenceStory = (\n  args: FocusManagerWithArrowKeyNavigationProps,\n) => {\n  const onClick = (e: React.SyntheticEvent<HTMLElement>) => {\n    console.error('checking pass through', e);\n  };\n  const numbers = [\n    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,\n  ];\n  const alphabets = [\n    'A',\n    'B',\n    'C',\n    'D',\n    'E',\n    'F',\n    'G',\n    'H',\n    'I',\n    'J',\n    'K',\n    'L',\n  ];\n  const smallCase = [\n    'a',\n    'b',\n    'c',\n    'd',\n    'e',\n    'f',\n    'g',\n    'h',\n    'i',\n    'j',\n    'k',\n    'l',\n    'm',\n  ];\n  const listRef = React.useRef<Array<HTMLElement | null>>([]);\n  return (\n    <FocusManagerWithArrowKeyNavigation\n      initialFocus={0}\n      cols={5}\n      orientation=\"horizontal\"\n      classNames={{wrapper: css.wrapper}}\n      listReference={listRef as unknown as {current: HTMLElement[]}}\n      {...args}\n    >\n      <SubTitleExtraSmall color=\"clickable\" className={css.categoryName}>\n        {'Numbers'}\n      </SubTitleExtraSmall>\n      {numbers.map((number) => (\n        <Button\n          type=\"ghost\"\n          key={number}\n          classNames={{wrapper: css.btnWidth}}\n          onClick={onClick}\n          ref={(node) => {\n            if (node) {\n              listRef.current.push(node);\n            }\n          }}\n        >\n          {number}\n        </Button>\n      ))}\n\n      <SubTitleExtraSmall color=\"clickable\" className={css.categoryName}>\n        {'Alphabets'}\n      </SubTitleExtraSmall>\n\n      {alphabets.map((alphabet) => (\n        <Button\n          type=\"ghost\"\n          key={alphabet}\n          classNames={{wrapper: css.btnWidth}}\n          onClick={onClick}\n          ref={(node) => {\n            if (node) {\n              listRef.current.push(node);\n            }\n          }}\n        >\n          {alphabet}\n        </Button>\n      ))}\n      {/* adding three empty slots for consistent navigation in grid*/}\n      <UnstyledButton\n        disabled={true}\n        ref={(node) => {\n          if (node) {\n            listRef.current.push(node);\n          }\n        }}\n      ></UnstyledButton>\n      <UnstyledButton\n        disabled={true}\n        ref={(node) => {\n          if (node) {\n            listRef.current.push(node);\n          }\n        }}\n      ></UnstyledButton>\n      <UnstyledButton\n        disabled={true}\n        ref={(node) => {\n          if (node) {\n            listRef.current.push(node);\n          }\n        }}\n      ></UnstyledButton>\n      <SubTitleExtraSmall color=\"clickable\" className={css.categoryName}>\n        {'SmallCase'}\n      </SubTitleExtraSmall>\n      {smallCase.map((alphabet) => (\n        <Button\n          type=\"ghost\"\n          key={alphabet}\n          classNames={{wrapper: css.btnWidth}}\n          onClick={onClick}\n          ref={(node) => {\n            if (node) {\n              listRef.current.push(node);\n            }\n          }}\n        >\n          {alphabet}\n        </Button>\n      ))}\n      {/* adding three empty slots for consistent navigation in grid*/}\n      <UnstyledButton\n        disabled={true}\n        ref={(node) => {\n          if (node) {\n            listRef.current.push(node);\n          }\n        }}\n      ></UnstyledButton>\n      <UnstyledButton\n        disabled={true}\n        ref={(node) => {\n          if (node) {\n            listRef.current.push(node);\n          }\n        }}\n      ></UnstyledButton>\n    </FocusManagerWithArrowKeyNavigation>\n  );\n};\n\nFocusManagerWithGridNavigationUsingListReferenceStory.args = {\n  loop: true,\n  focusItemOnOpen: 'auto',\n  self: true,\n  passListReference: true,\n  testId: 'focus-manager-grid-navigation-list-reference-story',\n};\nFocusManagerWithGridNavigationStory.storyName =\n  'Focus Manager With Grid Navigation';\nFocusManagerWithGridNavigationHavingEmptyElementsStory.storyName =\n  'Focus Manager With Grid Navigation Having Empty Elements';\nFocusManagerWithListNavigationStory.storyName =\n  'Focus Manager With List Navigation';\nFocusManagerWithGridNavigationUsingListReferenceStory.storyName =\n  'Focus Manager With Grid Navigation Using List Reference';\n"
        },
        "css": {
          "path": "FocusManagerWithArrowKeyNavigation.module.css",
          "content": ".wrapper {\n  display: flex;\n}\n\n.skipElementWrapper {\n  display: flex;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/FocusManagerWithArrowKeyNavigation/FocusManagerWithArrowKeyNavigation';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "FocusManagerWithArrowKeyNavigation.module.css",
        "FocusManagerWithArrowKeyNavigation.stories.module.css",
        "FocusManagerWithArrowKeyNavigation.stories.tsx",
        "FocusManagerWithArrowKeyNavigation.tsx",
        "index.ts"
      ]
    },
    "FormTitleWrapper": {
      "name": "FormTitleWrapper",
      "path": "src/components/FormTitleWrapper",
      "files": {
        "main": {
          "path": "FormTitleWrapper.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { ColorTypes } from '../../types/typography';\nimport type { IconSize, IconType } from '../../components/Icon';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    title?: string;\n    rightSlot?: string;\n}>;\nexport interface FormTitleWrapperProps {\n    classNames?: ClassNames;\n    iconType?: IconType;\n    iconName?: string;\n    iconSize?: IconSize;\n    iconColor?: ColorTypes;\n    title: React.ReactNode;\n    rightSlot?: React.ReactNode;\n    testId?: string;\n}\nexport declare const FormTitleWrapper: Flow.AbstractComponent<FormTitleWrapperProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=FormTitleWrapper.d.ts.map"
        },
        "story": {
          "path": "FormTitleWrapper.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {FormTitleWrapperProps} from 'src/components/FormTitleWrapper';\nimport {FormTitleWrapper} from 'src/components/FormTitleWrapper/FormTitleWrapper';\nimport {CloseIcon} from 'src/components/Icon';\nimport {Input} from 'src/components/Input';\nimport {Link} from 'src/components/Link';\n\nimport css from 'src/components/FormTitleWrapper/FormTitleWrapper.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Form Components/Form Title Wrapper',\n  component: FormTitleWrapper,\n  argTypes: {\n    classNames: {\n      description: 'Provide an optional className to be applied to the wrapper',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{wrapper?: string, title?: string, rightSlot?: string}',\n        },\n      },\n    },\n    title: {\n      description: 'The title to be displayed',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: 'React.Node',\n        },\n      },\n    },\n    iconName: {\n      description: 'The name of the icon to be displayed',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {\n          summary: 'string',\n        },\n      },\n    },\n    iconType: {\n      description: 'The type of icon to be displayed',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {\n          summary: 'IconType',\n        },\n        defaultValue: {summary: 'regular'},\n      },\n    },\n    iconSize: {\n      description: 'The size of the icon to be displayed',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {\n          summary: 'IconSize',\n        },\n        defaultValue: {summary: 'small'},\n      },\n    },\n    iconColor: {\n      description: 'The color of the icon to be displayed',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {\n          summary: 'ColorTypes',\n        },\n        defaultValue: {summary: 'primary'},\n      },\n    },\n    rightSlot: {\n      description: 'The right slot to be displayed',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: 'React.Node',\n        },\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a FormTitleWrapper component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { FormTitleWrapper } from \"@spaced-out/ui-design-system/lib/components/FormTitleWrapper\";\n\\`\\`\\`\nA simple Form Group utility to be used in forms to group\nrelated fields together.\nThis adds a title to the group of fields and an\noptional icon to the left of the title.\nThe right slot can be used to add any additional\nactions or buttons to the right of the title.\n\n**Usage: **\n\n\\`\\`\\`jsx\n<FormTitleWrapper\n  title=\"Basic Details\"\n  iconName=\"signature\"\n/>\n\\`\\`\\`\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/FormTitleWrapper/FormTitleWrapper',\n    },\n  },\n};\n\nexport const WithTitleStory = (args: FormTitleWrapperProps) => (\n  <div className={css.container}>\n    <div className={css.section}>\n      <Input label=\"Type\"></Input>\n    </div>\n    <div className={css.section}>\n      <FormTitleWrapper {...args}></FormTitleWrapper>\n      <Input label=\"Full Name\"></Input>\n      <Input label=\"Email\" type=\"email\"></Input>\n    </div>\n  </div>\n);\n\nWithTitleStory.args = {\n  classNames: {wrapper: ''},\n  iconName: 'signature',\n  title: 'Basic Details',\n  testId: 'form-title-wrapper-with-title-story',\n};\n\nexport const WithTitleAndRightSlotStory = (args: FormTitleWrapperProps) => (\n  <div className={css.container}>\n    <div className={css.section}>\n      <Input label=\"Type\"></Input>\n    </div>\n    <div className={css.section}>\n      <FormTitleWrapper\n        {...args}\n        rightSlot={\n          <div className={css.rightSlot}>\n            <CloseIcon testId=\"form-title-wrapper-close-icon-story\" />\n            <Link\n              as=\"buttonTextMedium\"\n              color=\"primary\"\n              testId=\"form-title-wrapper-link-story\"\n            >\n              Action\n            </Link>\n          </div>\n        }\n      ></FormTitleWrapper>\n      <Input label=\"Full Name\"></Input>\n      <Input label=\"Email\" type=\"email\"></Input>\n    </div>\n  </div>\n);\n\nWithTitleAndRightSlotStory.args = {\n  classNames: {wrapper: ''},\n  iconName: 'signature',\n  title: 'Section Title',\n  testId: 'form-title-wrapper-with-title-and-right-slot-story',\n};\nWithTitleStory.storyName = 'With Title';\nWithTitleAndRightSlotStory.storyName = 'With Title And Right Slot';\n"
        },
        "css": {
          "path": "FormTitleWrapper.module.css",
          "content": "@value (colorFillPrimary) from '../../styles/variables/_color.css';\n@value (sizeFluid) from '../../styles/variables/_size.css';\n@value (spaceSmall, spaceXSmall) from '../../styles/variables/_space.css';\n\n.container {\n  display: flex;\n  composes: borderTopPrimary from '../../styles/border.module.css';\n  justify-content: space-between;\n  align-items: center;\n  width: sizeFluid;\n  padding-top: spaceSmall;\n  padding-bottom: spaceSmall;\n}\n\n.leftSection {\n  display: flex;\n  align-items: center;\n  gap: spaceXSmall;\n}\n\n.componentHousing {\n  display: flex;\n  composes: subTitleSmall from '../../styles/typography.module.css';\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/FormTitleWrapper/FormTitleWrapper';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "FormTitleWrapper.module.css",
        "FormTitleWrapper.stories.module.css",
        "FormTitleWrapper.stories.tsx",
        "FormTitleWrapper.tsx",
        "index.ts"
      ]
    },
    "Grid": {
      "name": "Grid",
      "path": "src/components/Grid",
      "files": {
        "main": {
          "path": "Grid.d.ts",
          "content": "import * as React from 'react';\nexport interface RowProps {\n    className?: string;\n    children?: React.ReactNode;\n    span?: number;\n    offset?: number;\n    gridType?: 'small' | 'medium' | 'large' | 'autoFill' | 'autoFit';\n    repeatTracks?: string;\n    testId?: string;\n}\nexport declare const Row: ({ className, children, gridType, repeatTracks, testId, }: RowProps) => React.JSX.Element;\nexport interface ColProps {\n    className?: string;\n    children?: React.ReactNode;\n    span?: number;\n    offset?: number;\n    gridColumnStart?: number | string;\n    gridColumnEnd?: number | string;\n    testId?: string;\n}\nexport declare const Col: ({ className, children, gridColumnStart, gridColumnEnd, testId, }: ColProps) => React.JSX.Element;\n//# sourceMappingURL=Grid.d.ts.map"
        },
        "story": null,
        "css": {
          "path": "Grid.module.css",
          "content": "@value (\n  spaceNone,\n  spaceMedium,\n  spaceLarge\n) from '../../styles/variables/_space.css';\n\n.gridRow {\n  --grid-repeat-count: 12;\n  --repeat-tracks: 1fr;\n  display: grid !important;\n  grid-template-columns: repeat(var(--grid-repeat-count), var(--repeat-tracks));\n  gap: spaceMedium;\n  padding: spaceNone spaceLarge;\n  grid-auto-flow: row;\n  grid-auto-columns: 1fr;\n  grid-column-gap: spaceMedium;\n  grid-row-gap: spaceMedium;\n  grid-auto-rows: auto;\n  box-sizing: border-box;\n}\n\n.gridColumn {\n  --grid-column-start: auto;\n  --grid-column-end: span 1;\n  display: flex;\n  align-items: center;\n  grid-column: var(--grid-column-start) / var(--grid-column-end);\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Grid/Grid';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "Col.stories.tsx",
        "Grid.module.css",
        "Grid.stories.module.css",
        "Grid.tsx",
        "GridPatterns.stories.module.css",
        "GridPatterns.stories.tsx",
        "Row.stories.tsx",
        "Tablist.layout.stories.module.css",
        "Tablist.layout.stories.tsx",
        "index.ts"
      ]
    },
    "Icon": {
      "name": "Icon",
      "path": "src/components/Icon",
      "files": {
        "main": {
          "path": "Icon.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { ColorTypes } from '../../types/typography';\nexport declare const ICON_TYPE: Readonly<{\n    regular: \"regular\";\n    solid: \"solid\";\n    duotone: \"duotone\";\n    brands: \"brands\";\n}>;\nexport declare const ICON_SIZE: Readonly<{\n    small: \"small\";\n    medium: \"medium\";\n    large: \"large\";\n}>;\nexport type IconSize = keyof typeof ICON_SIZE;\nexport type IconType = keyof typeof ICON_TYPE;\nexport interface IconProps {\n    type?: IconType;\n    name: string;\n    size?: IconSize;\n    color?: ColorTypes;\n    className?: string;\n    onClick?: React.MouseEventHandler<HTMLDivElement>;\n    ariaLabel?: string;\n    swapOpacity?: boolean;\n    style?: {\n        [key: string]: string;\n    };\n    testId?: string;\n}\nexport declare const Icon: Flow.AbstractComponent<IconProps, HTMLDivElement>;\n//# sourceMappingURL=Icon.d.ts.map"
        },
        "story": {
          "path": "Icon.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {\n  colorIconPrimary,\n  colorIconSecondary,\n} from 'src/styles/variables/_color';\nimport {TEXT_COLORS} from 'src/types/typography';\n\nimport type {\n  ClickableIconProps,\n  CloseIconProps,\n  IconProps,\n} from 'src/components/Icon';\nimport {ClickableIcon, CloseIcon, Icon} from 'src/components/Icon';\nimport {ICON_DOCS} from 'src/components/Icon/Icon.docs';\nimport {Tooltip} from 'src/components/Tooltip';\n\nimport css from 'src/components/Icon/Icon.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Icon',\n  component: Icon,\n  ...ICON_DOCS,\n};\n\nexport const IconStory = (args: IconProps) => <Icon {...args} />;\n\nIconStory.args = {\n  type: 'regular',\n  name: 'face-party',\n  size: 'medium',\n  color: TEXT_COLORS.primary,\n  testId: 'icon-story',\n};\n\nexport const IconWithTooltipStory = (args: IconProps) => (\n  <div className={css.iconWithTooltip}>\n    <Tooltip body={args.name} testId=\"icon-tooltip-story\">\n      <Icon {...args} />\n    </Tooltip>\n  </div>\n);\n\nIconWithTooltipStory.args = {\n  type: 'regular',\n  name: 'face-party',\n  size: 'medium',\n  color: TEXT_COLORS.primary,\n  testId: 'icon-with-tooltip-story',\n};\n\nexport const ClickableIconStory = (args: ClickableIconProps) => (\n  <ClickableIcon {...args}></ClickableIcon>\n);\n\nClickableIconStory.args = {\n  type: 'regular',\n  name: 'face-party',\n  size: 'medium',\n  color: TEXT_COLORS.primary,\n  ariaLabel: 'Icon Button',\n  testId: 'clickable-icon-story',\n};\n\nexport const CloseIconStory = (args: CloseIconProps) => (\n  <CloseIcon {...args}></CloseIcon>\n);\n\nCloseIconStory.args = {\n  type: 'regular',\n  size: 'medium',\n  color: TEXT_COLORS.primary,\n  ariaLabel: 'Close Icon',\n  testId: 'close-icon-story',\n};\n\nexport const DuotoneIconStory = (args: IconProps) => <Icon {...args} />;\n\nDuotoneIconStory.args = {\n  type: 'duotone',\n  name: 'house',\n  size: 'medium',\n  color: TEXT_COLORS.primary,\n  swapOpacity: true,\n  style: {\n    '--fa-primary-color': colorIconPrimary,\n    '--fa-secondary-color': colorIconSecondary,\n    '--fa-primary-opacity': '1.0',\n    '--fa-secondary-opacity': '1.0',\n  },\n  testId: 'duotone-icon-story',\n};\nIconStory.storyName = 'Icon';\nIconWithTooltipStory.storyName = 'Icon With Tooltip';\nClickableIconStory.storyName = 'Clickable Icon';\nCloseIconStory.storyName = 'Close Icon';\nDuotoneIconStory.storyName = 'Duotone Icon';\n"
        },
        "css": {
          "path": "Icon.module.css",
          "content": "@value (\n  colorInformation,\n  colorSuccess,\n  colorWarning,\n  colorDanger,\n  colorNeutral,\n  colorTextPrimary,\n  colorTextSecondary,\n  colorTextTertiary,\n  colorTextDisabled,\n  colorTextClickable,\n  colorTextInversePrimary,\n  colorTextInverseSecondary,\n  colorTextFavorite\n) from '../../styles/variables/_color.css';\n\n.primary {\n  color: colorTextPrimary;\n}\n\n.secondary {\n  color: colorTextSecondary;\n}\n\n.tertiary {\n  color: colorTextTertiary;\n}\n\n.disabled {\n  color: colorTextDisabled;\n}\n\n.clickable {\n  color: colorTextClickable;\n}\n\n.information {\n  color: colorInformation;\n}\n\n.success {\n  color: colorSuccess;\n}\n\n.warning {\n  color: colorWarning;\n}\n\n.danger {\n  color: colorDanger;\n}\n\n.neutral {\n  color: colorNeutral;\n}\n\n.inversePrimary {\n  color: colorTextInversePrimary;\n}\n\n.inverseSecondary {\n  color: colorTextInverseSecondary;\n}\n\n.favorite {\n  color: colorTextFavorite;\n}\n\n.inherit {\n  color: inherit;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Icon/ClickableIcon';\nexport * from '../../components/Icon/Icon';\nexport * from '../../components/Icon/SemanticIcon';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "ClickableIcon.d.ts": {
            "path": "ClickableIcon.d.ts",
            "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { ColorTypes } from '../../types/typography';\nimport type { IconProps, IconSize, IconType } from '../../components/Icon';\ntype ClassNames = Readonly<{\n    icon?: string;\n    button?: string;\n}>;\nexport interface ClickableIconProps extends Omit<IconProps, 'disabled' | 'classNames' | 'onClick'> {\n    disabled?: boolean;\n    classNames?: ClassNames;\n    onClick?: React.MouseEventHandler<HTMLButtonElement>;\n    testId?: string;\n}\nexport declare const ClickableIcon: Flow.AbstractComponent<ClickableIconProps, HTMLButtonElement>;\nexport interface CloseIconProps {\n    size?: IconSize;\n    type?: IconType;\n    color?: ColorTypes;\n    onClick?: React.MouseEventHandler<HTMLButtonElement>;\n    className?: string;\n    ariaLabel?: string;\n    disabled?: boolean;\n    classNames?: ClassNames;\n    testId?: string;\n}\nexport declare const CloseIcon: Flow.AbstractComponent<CloseIconProps, HTMLButtonElement>;\nexport {};\n//# sourceMappingURL=ClickableIcon.d.ts.map"
          },
          "Icon.docs.d.ts": {
            "path": "Icon.docs.d.ts",
            "content": "export declare const ICON_DOCS: {\n    readonly argTypes: {\n        readonly type: {\n            readonly description: \"Type represents 5 unique icon styles :- Solid, Regular, Light, Thin, Duotone\";\n            readonly options: readonly [\"regular\", \"solid\", \"duotone\", \"brands\"];\n            readonly control: {\n                readonly type: \"select\";\n            };\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"string\";\n                };\n                readonly defaultValue: {\n                    readonly summary: \"regular\";\n                };\n            };\n        };\n        readonly name: {\n            readonly description: \"Icon Name represents name of icon as supported by fontawesome\";\n            readonly type: {\n                readonly required: true;\n            };\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"string\";\n                };\n                readonly defaultValue: {\n                    readonly summary: \"face-party\";\n                };\n            };\n        };\n        readonly color: {\n            readonly description: \"Same set of colors as supported in text\";\n            readonly options: unknown[];\n            readonly control: {\n                readonly type: \"select\";\n            };\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"string\";\n                };\n                readonly defaultValue: {\n                    readonly summary: \"primary\";\n                };\n            };\n        };\n        readonly size: {\n            readonly description: \"Icon supports three size variants namely small and medium. `small` < `medium` < `large`\";\n            readonly options: unknown[];\n            readonly control: {\n                readonly type: \"select\";\n            };\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"string\";\n                };\n                readonly defaultValue: {\n                    readonly summary: \"medium\";\n                };\n            };\n        };\n        readonly swapOpacity: {\n            readonly name: \"swapOpacity\";\n            readonly description: \"Swap the default opacity of each layer in a duotone icon.\";\n            readonly options: readonly [false, true];\n            readonly control: \"boolean\";\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"boolean\";\n                };\n                readonly defaultValue: {\n                    readonly summary: false;\n                };\n            };\n        };\n        readonly className: {\n            readonly description: \"External className to be applied on container\";\n            readonly control: {\n                readonly type: \"text\";\n            };\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"string\";\n                };\n            };\n        };\n        readonly onClick: {\n            readonly description: \"onClick handler\";\n            readonly action: \"clicked\";\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"(SyntheticEvent<HTMLElement>) => mixed\";\n                };\n            };\n        };\n        readonly disabled: {\n            readonly description: \"If **true**, the clickable icon is disabled\";\n            readonly control: {\n                readonly type: \"boolean\";\n            };\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"boolean\";\n                };\n                readonly defaultValue: {\n                    readonly summary: \"false\";\n                };\n            };\n        };\n        readonly ariaLabel: {\n            readonly control: {\n                readonly type: \"text\";\n            };\n            readonly description: \"**aria-label** should be added where `ClickableIcon` and `CloseIcon` is used. This would avoid accessibility violations in screen readers\";\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"string\";\n                };\n            };\n        };\n        readonly testId: {\n            readonly description: \"Test ID for the component\";\n            readonly control: {\n                readonly type: \"text\";\n            };\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"string\";\n                };\n            };\n        };\n    };\n    readonly parameters: {\n        readonly docs: {\n            readonly subtitle: \"Generates a Icon component\";\n            readonly description: {\n                readonly component: \"\\n```js\\nimport {\\n  Icon,\\n  ClickableIcon,\\n  CloseIcon,\\n  SemanticIcon\\n} from \\\"@spaced-out/ui-design-system/lib/components/Icon\\\";\\n```\\nIcon component uses <a href=\\\"https://fontawesome.com/icons\\\" target=\\\"_blank\\\">fontawesome</a> icon internally.\\nThe name prop has be to consistent with one used in fontawesome.\\n        \";\n            };\n        };\n        readonly storySource: {\n            readonly componentPath: \"/src/components/Icon/Icon\";\n        };\n    };\n};\n//# sourceMappingURL=Icon.docs.d.ts.map"
          },
          "SemanticIcon.d.ts": {
            "path": "SemanticIcon.d.ts",
            "content": "import * as React from 'react';\nimport type { AlertSemanticType } from '../../types/common';\nimport type { IconProps } from '../../components/Icon/Icon';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    icon?: string;\n}>;\nexport interface SemanticIconProps extends Omit<IconProps, 'classNames' | 'semantic' | 'disabled'> {\n    classNames?: ClassNames;\n    semantic?: AlertSemanticType;\n    disabled?: boolean;\n    testId?: string;\n}\nexport declare const SemanticIcon: ({ semantic, classNames, size, testId, ...iconProps }: SemanticIconProps) => React.JSX.Element;\nexport {};\n//# sourceMappingURL=SemanticIcon.d.ts.map"
          }
        }
      },
      "allFiles": [
        "ClickableIcon.module.css",
        "ClickableIcon.tsx",
        "Icon.docs.ts",
        "Icon.module.css",
        "Icon.stories.module.css",
        "Icon.stories.tsx",
        "Icon.tsx",
        "SemanticIcon.module.css",
        "SemanticIcon.stories.tsx",
        "SemanticIcon.tsx",
        "index.ts"
      ]
    },
    "InContextAlert": {
      "name": "InContextAlert",
      "path": "src/components/InContextAlert",
      "files": {
        "main": {
          "path": "InContextAlert.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { AlertSemanticType } from '../../types/common';\nimport type { ColorTypes } from '../../types/typography';\nimport type { IconType } from '../../components/Icon';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    alertText?: string;\n    actionContainer?: string;\n    icon?: string;\n    contentContainer?: string;\n}>;\ntype InContextAlertBaseProps = {\n    classNames?: ClassNames;\n    testId?: string;\n} & ({\n    dismissable?: true;\n    onCloseClick?: (e: React.SyntheticEvent<HTMLElement>) => unknown;\n    selfDismiss?: boolean;\n} | {\n    dismissable?: false;\n    onCloseClick?: never;\n    selfDismiss?: never;\n}) & {\n    children?: string;\n    actionText?: string;\n    onAction?: React.MouseEventHandler<HTMLAnchorElement>;\n    actionTextColor?: ColorTypes;\n};\nexport interface InContextAlertProps extends Omit<InContextAlertBaseProps, 'semantic' | 'leftIconName' | 'leftIconType'> {\n    semantic?: AlertSemanticType;\n    leftIconName?: string;\n    leftIconType?: IconType;\n    disableAction?: boolean;\n}\nexport declare const AlertIcon: ({ semantic, leftIconName, leftIconType, iconClassName, testId, }: {\n    semantic: AlertSemanticType;\n    leftIconName: string;\n    leftIconType?: IconType;\n    iconClassName?: string;\n    testId?: string;\n}) => React.JSX.Element;\nexport declare const InContextAlert: Flow.AbstractComponent<InContextAlertProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=InContextAlert.d.ts.map"
        },
        "story": {
          "path": "InContextAlert.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {ALERT_SEMANTIC} from 'src/types/common';\nimport {TEXT_COLORS} from 'src/types/typography';\n\nimport type {InContextAlertProps} from 'src/components/InContextAlert/InContextAlert';\nimport {InContextAlert} from 'src/components/InContextAlert/InContextAlert';\n\nimport css from 'src/components/InContextAlert/InContextAlert.stories.module.css';\n\n\nconst semanticOptions: Array<unknown> = [...Object.values(ALERT_SEMANTIC)];\nconst colorOptions: Array<unknown> = [...Object.values(TEXT_COLORS)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/In-Context Alert',\n  argTypes: {\n    actionText: {\n      name: 'actionText',\n      description: 'Action text to be displayed on **right** of Alert',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    onAction: {\n      name: 'onAction',\n      action: 'Action Click',\n      description: 'Callback function for action text click',\n      type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n    },\n    actionTextColor: {\n      options: colorOptions,\n      name: 'actionTextColor',\n      description: 'Color of the action text',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'primary'},\n      },\n    },\n    semantic: {\n      options: semanticOptions,\n      description:\n        'Semantic type of In-Context Alert. It will have different Icon and background color for different semantic type',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: ALERT_SEMANTIC.neutral},\n      },\n    },\n    onCloseClick: {\n      name: 'onCloseClick',\n      action: 'Close Click',\n      description: 'Callback function for dismissable alert',\n      type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n    },\n    dismissable: {\n      description: 'Close Icon will appear in right side in case it is true',\n      name: 'dismissable',\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    disableAction: {\n      description: 'When true, the action link will be disabled',\n      name: 'disableAction',\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    selfDismiss: {\n      description: `This prop is valid only in case dismissable is true.\n      It handles whether the dismissal should be handled by the component or it will just pass callback onclick of closeIcon and dismissal will be handled externally`,\n      name: 'selfDismiss',\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    leftIconName: {\n      name: 'leftIconName',\n      control: {\n        type: 'text',\n      },\n      description: 'Custom left icon. This overrides the default semantic icon',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    leftIconType: {\n      description:\n        'Type represents 4 unique icon styles :- Solid, Regular, Duotone and Brands',\n      options: ['regular', 'solid', 'duotone', 'brands'],\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'regular'},\n      },\n    },\n    children: {\n      description: 'Pass the alert message text as children',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    classNames: {\n      description:\n        'Provide an optional className to be applied to the wrapper, alertText',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary:\n            '{wrapper?: string, alertText?: string, actionContainer?: string, icon?: string}',\n        },\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a In-Context Alert component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { InContextAlert } from \"@spaced-out/ui-design-system/lib/components/InContextAlert\";\n\\`\\`\\`\nUse In-Context Alert component to show alert message of different semantics like - success, warning etc. It will take width of the container\nand will show only two lines of text. Post that it will get truncated. As there is no way for user to see the truncated message, it is recommended\nto use it for messages up to two lines only or add a tooltip along with it for showcasing complete message.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/InContextAlert/InContextAlert',\n    },\n  },\n};\n\nexport const DefaultStory = (args: InContextAlertProps) => (\n  <div className={css.storyContainer}>\n    <InContextAlert {...args} />\n  </div>\n);\n\nDefaultStory.args = {\n  children:\n    'The quick brown fox jumps over the lazy dog is an English-language pangram—a sentence that contains all the letters of the alphabet. The phrase is commonly used for touch-typing practice, testing typewriters and computer keyboards, displaying examples of fonts, and other applications involving text where the use of all letters in the alphabet is desired.',\n  semantic: 'neutral',\n  leftIconName: 'envelope',\n  testId: 'in-context-alert-default-story',\n};\n\nexport const DismissableStory = (args: InContextAlertProps) => (\n  <div className={css.storyContainer}>\n    <InContextAlert {...args} />\n  </div>\n);\n\nDismissableStory.args = {\n  children:\n    'The quick brown fox jumps over the lazy dog is an English-language pangram—a sentence that contains all the letters of the alphabet. The phrase is commonly used for touch-typing practice, testing typewriters and computer keyboards, displaying examples of fonts, and other applications involving text where the use of all letters in the alphabet is desired.',\n  semantic: 'neutral',\n  dismissable: true,\n  selfDismiss: false,\n  leftIconName: 'house',\n  testId: 'in-context-alert-dismissable-story',\n};\n\nexport const ActionableStory = (args: InContextAlertProps) => (\n  <div className={css.storyContainer}>\n    <InContextAlert {...args} />\n  </div>\n);\n\nActionableStory.args = {\n  children: 'Message could not be delivered',\n  semantic: 'danger',\n  actionText: 'Resend',\n  actionTextColor: 'clickable',\n  testId: 'in-context-alert-actionable-story',\n};\nDefaultStory.storyName = 'Default';\nDismissableStory.storyName = 'Dismissable';\nActionableStory.storyName = 'Actionable';\n"
        },
        "css": {
          "path": "InContextAlert.module.css",
          "content": "@value (borderRadiusXSmall) from '../../styles/variables/_border.css';\n@value (colorFillPrimary,\n  colorTextPrimary,\n  colorNeutralLight,\n  colorNeutralLightest,\n  colorSuccessLight,\n  colorSuccessLightest,\n  colorInformationLight,\n  colorInformationLightest,\n  colorWarningLight,\n  colorWarningLightest,\n  colorDangerLight,\n  colorDangerLightest\n) from '../../styles/variables/_color.css';\n\n@value (\n  spaceXSmall,\n  spaceSmall\n) from '../../styles/variables/_space.css';\n\n@value (\n  sizeFluid\n) from '../../styles/variables/_size.css';\n\n@value (\n  borderWidthPrimary\n) from '../../styles/variables/_border.css';\n\n.alertContainer {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  padding: spaceXSmall;\n  gap: spaceXSmall;\n  border-radius: borderRadiusXSmall;\n  width: sizeFluid;\n  word-break: normal;\n  border-width: borderWidthPrimary;\n  border-style: solid;\n}\n\n.neutral {\n  background-color: colorNeutralLightest;\n  border-color: colorNeutralLight;\n}\n\n.success {\n  background-color: colorSuccessLightest;\n  border-color: colorSuccessLight;\n}\n\n.information {\n  background-color: colorInformationLightest;\n  border-color: colorInformationLight;\n}\n\n.warning {\n  background-color: colorWarningLightest;\n  border-color: colorWarningLight;\n}\n\n.danger {\n  background-color: colorDangerLightest;\n  border-color: colorDangerLight;\n}\n\n.closeIcon {\n  margin-left: auto;\n}\n\n.actionContainer {\n  display: flex;\n  margin-left: auto;\n  align-items: center;\n  gap: spaceSmall;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/InContextAlert/InContextAlert';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "InContextAlert.module.css",
        "InContextAlert.stories.module.css",
        "InContextAlert.stories.tsx",
        "InContextAlert.tsx",
        "index.ts"
      ]
    },
    "InContextAlertWithMultipleActions": {
      "name": "InContextAlertWithMultipleActions",
      "path": "src/components/InContextAlertWithMultipleActions",
      "files": {
        "main": {
          "path": "InContextAlertWithMultipleActions.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { ColorTypes } from '../../types/typography';\nimport type { InContextAlertProps } from '../../components/InContextAlert';\nexport interface InContextAlertWithMultipleActionsProps extends Omit<InContextAlertProps, 'inline' | 'secondaryActionText' | 'onSecondaryAction' | 'secondaryActionTextColor'> {\n    inline?: boolean;\n    secondaryActionText?: string;\n    onSecondaryAction?: React.MouseEventHandler<HTMLAnchorElement>;\n    secondaryActionTextColor?: ColorTypes;\n    testId?: string;\n}\nexport declare const InContextAlertWithMultipleActions: Flow.AbstractComponent<InContextAlertWithMultipleActionsProps, HTMLDivElement>;\n//# sourceMappingURL=InContextAlertWithMultipleActions.d.ts.map"
        },
        "story": {
          "path": "InContextAlertWithMultipleActions.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {ALERT_SEMANTIC} from 'src/types/common';\nimport {TEXT_COLORS} from 'src/types/typography';\n\nimport type {InContextAlertWithMultipleActionsProps} from 'src/components/InContextAlertWithMultipleActions/InContextAlertWithMultipleActions';\nimport {InContextAlertWithMultipleActions} from 'src/components/InContextAlertWithMultipleActions/InContextAlertWithMultipleActions';\n\nimport css from 'src/components/InContextAlertWithMultipleActions/InContextAlertWithMultipleActions.stories.module.css';\n\n\nconst semanticOptions: Array<unknown> = [...Object.values(ALERT_SEMANTIC)];\nconst colorOptions: Array<unknown> = [...Object.values(TEXT_COLORS)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/In-Context Alert With Multiple Actions',\n  argTypes: {\n    actionText: {\n      name: 'actionText',\n      description:\n        'Action text to be displayed on right of Alert or at the bottom based on **inline** field',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    onAction: {\n      name: 'onAction',\n      action: 'Action Click',\n      description: 'Callback function for action text click',\n      type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n    },\n    actionTextColor: {\n      options: colorOptions,\n      name: 'actionTextColor',\n      description: 'Color of the action text',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'primary'},\n      },\n    },\n    secondaryActionText: {\n      name: 'secondaryActionText',\n      description:\n        'Secondary action text to be displayed on right of Alert or at the bottom based on **inline** field',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    secondaryActionTextColor: {\n      options: colorOptions,\n      name: 'secondaryActionTextColor',\n      description: 'Color of the secondary action text',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'primary'},\n      },\n    },\n    onSecondaryAction: {\n      name: 'onSecondaryAction',\n      description: 'Callback function for secondary action text click',\n      type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n    },\n    semantic: {\n      options: semanticOptions,\n      description:\n        'Semantic type of In-Context Alert. It will have different Icon and background color for different semantic type',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: ALERT_SEMANTIC.neutral},\n      },\n    },\n    onCloseClick: {\n      name: 'onCloseClick',\n      action: 'Close Click',\n      description: 'Callback function for dismissable alert',\n      type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n    },\n    dismissable: {\n      description: 'Close Icon will appear in right side in case it is true',\n      name: 'dismissable',\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    selfDismiss: {\n      description: `This prop is valid only in case dismissable is true.\n      It handles whether the dismissal should be handled by the component or it will just pass callback onclick of closeIcon and dismissal will be handled externally`,\n      name: 'selfDismiss',\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    inline: {\n      description:\n        'If true, actions will be displayed in **right**. If false, actions will be displayed at the **bottom**.',\n      name: 'inline',\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    leftIconName: {\n      name: 'leftIconName',\n      control: {\n        type: 'text',\n      },\n      description: 'Custom left icon. This overrides the default semantic icon',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    leftIconType: {\n      description:\n        'Type represents 4 unique icon styles :- Solid, Regular, Duotone and Brands',\n      options: ['regular', 'solid', 'duotone', 'brands'],\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'regular'},\n      },\n    },\n    children: {\n      description: 'Pass the alert message text as children',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    classNames: {\n      description:\n        'Provide an optional className to be applied to the wrapper, alertText, actionContainer, icon, contentContainer',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary:\n            '{wrapper?: string, alertText?: string, actionContainer?: string, icon?: string}',\n        },\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a In-Context Alert With Multiple Actions component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { InContextAlertWithMultipleActions } from \"@spaced-out/ui-design-system/lib/components/InContextAlertWithMultipleActions\";\n\\`\\`\\`\nUse In-Context Alert With Multiple Actions component to show alert message of different semantics like - success, warning etc (Similar to In context alert).\nAdditionally this component shows actions buttons inline or at the bottom. There are 2 action buttons. And there is no truncation of text.\n        `,\n      },\n    },\n    storySource: {\n      componentPath:\n        '/src/components/InContextAlertWithMultipleActions/InContextAlertWithMultipleActions',\n    },\n  },\n};\n\nexport const DefaultStory = (args: InContextAlertWithMultipleActionsProps) => (\n  <div className={css.storyContainer}>\n    <InContextAlertWithMultipleActions {...args} />\n  </div>\n);\n\nDefaultStory.args = {\n  children:\n    'The quick brown fox jumps over the lazy dog is an English-language pangram—a sentence that contains all the letters of the alphabet. The phrase is commonly used for touch-typing practice, testing typewriters and computer keyboards, displaying examples of fonts, and other applications involving text where the use of all letters in the alphabet is desired.',\n  semantic: 'neutral',\n  leftIconName: 'envelope',\n  testId: 'in-context-alert-multiple-actions-default-story',\n};\n\nexport const DismissableStory = (\n  args: InContextAlertWithMultipleActionsProps,\n) => (\n  <div className={css.storyContainer}>\n    <InContextAlertWithMultipleActions {...args} />\n  </div>\n);\n\nDismissableStory.args = {\n  children:\n    'The quick brown fox jumps over the lazy dog is an English-language pangram—a sentence that contains all the letters of the alphabet. The phrase is commonly used for touch-typing practice, testing typewriters and computer keyboards, displaying examples of fonts, and other applications involving text where the use of all letters in the alphabet is desired.',\n  semantic: 'neutral',\n  dismissable: true,\n  selfDismiss: false,\n  leftIconName: 'house',\n  testId: 'in-context-alert-multiple-actions-dismissable-story',\n};\n\nexport const ActionableStory = (\n  args: InContextAlertWithMultipleActionsProps,\n) => (\n  <div className={css.storyContainer}>\n    <InContextAlertWithMultipleActions {...args} />\n  </div>\n);\n\nActionableStory.args = {\n  children: 'Message could not be delivered',\n  semantic: 'danger',\n  actionText: 'Resend',\n  testId: 'in-context-alert-multiple-actions-actionable-story',\n};\n\nexport const SecondaryActionStory = (\n  args: InContextAlertWithMultipleActionsProps,\n) => (\n  <div className={css.storyContainer}>\n    <InContextAlertWithMultipleActions {...args} />\n  </div>\n);\n\nSecondaryActionStory.args = {\n  children: 'Message could not be delivered.',\n  semantic: 'danger',\n  actionText: 'Resend',\n  dismissable: true,\n  secondaryActionText: 'View',\n  testId: 'in-context-alert-multiple-actions-secondary-action-story',\n};\n\nexport const SecondaryWithWrapActionStory = (\n  args: InContextAlertWithMultipleActionsProps,\n) => (\n  <div className={css.storyContainer}>\n    <InContextAlertWithMultipleActions {...args} />\n  </div>\n);\n\nSecondaryWithWrapActionStory.args = {\n  children:\n    'The quick brown fox jumps over the lazy dog is an English-language pangram—a sentence that contains all the letters of the alphabet. The phrase is commonly used for touch-typing practice, testing typewriters and computer keyboards, displaying examples of fonts, and other applications involving text where the use of all letters in the alphabet is desired.',\n  semantic: 'neutral',\n  actionText: 'Resend',\n  dismissable: true,\n  secondaryActionText: 'View',\n  testId: 'in-context-alert-multiple-actions-secondary-wrap-story',\n};\nDefaultStory.storyName = 'Default';\nDismissableStory.storyName = 'Dismissable';\nActionableStory.storyName = 'Actionable';\nSecondaryActionStory.storyName = 'Secondary Action';\nSecondaryWithWrapActionStory.storyName = 'Secondary With Wrap Action';\n"
        },
        "css": {
          "path": "InContextAlertWithMultipleActions.module.css",
          "content": "@value (borderRadiusXSmall) from '../../styles/variables/_border.css';\n@value (colorNeutralLight,\n  colorNeutralLightest,\n  colorSuccessLight,\n  colorSuccessLightest,\n  colorInformationLight,\n  colorInformationLightest,\n  colorWarningLight,\n  colorWarningLightest,\n  colorDangerLight,\n  colorDangerLightest\n) from '../../styles/variables/_color.css';\n\n@value (\n  spaceXSmall,\n  spaceXXSmall\n) from '../../styles/variables/_space.css';\n\n@value (\n  sizeFluid\n) from '../../styles/variables/_size.css';\n\n@value (\n  borderWidthPrimary\n) from '../../styles/variables/_border.css';\n\n.alertContainer {\n  display: flex;\n  flex-direction: row;\n  align-items: flex-start;\n  padding: spaceXSmall;\n  gap: spaceXSmall;\n  border-radius: borderRadiusXSmall;\n  width: sizeFluid;\n  word-break: normal;\n  border-width: borderWidthPrimary;\n  border-style: solid;\n}\n\n.neutral {\n  background-color: colorNeutralLightest;\n  border-color: colorNeutralLight;\n}\n\n.success {\n  background-color: colorSuccessLightest;\n  border-color: colorSuccessLight;\n}\n\n.information {\n  background-color: colorInformationLightest;\n  border-color: colorInformationLight;\n}\n\n.warning {\n  background-color: colorWarningLightest;\n  border-color: colorWarningLight;\n}\n\n.danger {\n  background-color: colorDangerLightest;\n  border-color: colorDangerLight;\n}\n\n.closeIcon {\n  margin-left: auto;\n}\n\n.contentContainer {\n  display: flex;\n  width: sizeFluid;\n  justify-content: space-between;\n  align-items: flex-start;\n}\n\n.contentContainerRow {\n  flex-direction: row;\n  gap: spaceXSmall;\n}\n\n.contentContainerColumn {\n  flex-direction: column;\n  gap: spaceXXSmall;\n}\n\n.actionContainer {\n  display: flex;\n  align-items: flex-start;\n  justify-content: flex-start;\n  gap: spaceXSmall;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/InContextAlertWithMultipleActions/InContextAlertWithMultipleActions';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "InContextAlertWithMultipleActions.module.css",
        "InContextAlertWithMultipleActions.stories.module.css",
        "InContextAlertWithMultipleActions.stories.tsx",
        "InContextAlertWithMultipleActions.tsx",
        "index.ts"
      ]
    },
    "InfinitePagination": {
      "name": "InfinitePagination",
      "path": "src/components/InfinitePagination",
      "files": {
        "main": {
          "path": "InfinitePagination.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { GenericObject } from '../../components/Table';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n}>;\nexport type InfinitePaginationProps = {\n    items: Array<GenericObject>;\n    width: string;\n    threshold?: number;\n    classNames?: ClassNames;\n    renderItem: (item: GenericObject, index: number) => React.ReactNode;\n    getItemKey?: (item: GenericObject, index: number) => string | number;\n    hasNextPage: boolean;\n    loadMoreItems: () => Promise<void>;\n    testId?: string;\n} & ({\n    itemSize: (index: number) => number;\n    isVariableSizeList: true;\n} | {\n    itemSize: number;\n    isVariableSizeList?: false;\n});\nexport declare const InfinitePagination: Flow.AbstractComponent<InfinitePaginationProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=InfinitePagination.d.ts.map"
        },
        "story": {
          "path": "InfinitePagination.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {spaceFluid} from 'src/styles/variables/_space';\n\nimport {Card, CardTitle} from 'src/components/Card';\nimport type {InfinitePaginationProps} from 'src/components/InfinitePagination/InfinitePagination';\nimport {InfinitePagination} from 'src/components/InfinitePagination/InfinitePagination';\nimport type {GenericObject} from 'src/components/Table';\n\nimport css from 'src/components/InfinitePagination/InfinitePagination.stories.module.css';\n\n// Type definitions\ninterface ListItem {\n  id: number;\n  title: string;\n  description: string;\n  [key: string]: unknown;\n}\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Layout/Infinite Pagination',\n  component: InfinitePagination,\n  argTypes: {\n    items: {\n      description: 'The array of data items to render in the list',\n      control: {type: 'object'},\n      table: {\n        type: {summary: 'Array<GenericObject>'},\n      },\n    },\n    width: {\n      description: 'Width of the list',\n      control: {type: 'text'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'spaceFluid'},\n      },\n    },\n    threshold: {\n      description:\n        'Distance in pixels from the bottom to trigger loading more items',\n      control: {type: 'number'},\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: 200},\n      },\n    },\n    classNames: {\n      description: 'Provide an optional className to be applied to the wrapper',\n      control: {type: 'object'},\n      table: {\n        type: {summary: '{wrapper?: string}'},\n      },\n    },\n    renderItem: {\n      description: 'Function to render a single item',\n      control: false,\n      table: {\n        type: {summary: '(item: GenericObject, index: number) => React.Node'},\n      },\n    },\n    getItemKey: {\n      description: 'Optional function to generate a key for each item',\n      control: false,\n      table: {\n        type: {\n          summary: '(item: GenericObject, index: number) => string | number',\n        },\n      },\n    },\n    hasNextPage: {\n      description: 'Boolean to determine if there are more items to load',\n      control: {type: 'boolean'},\n      table: {\n        type: {summary: 'boolean'},\n      },\n    },\n    loadMoreItems: {\n      description: 'Callback function to load more items',\n      control: false,\n      table: {\n        type: {summary: '() => Promise<void>'},\n      },\n    },\n    itemSize: {\n      description:\n        'Either a number or a function returning the height of each item',\n      control: false,\n      table: {\n        type: {\n          summary: 'number | (index: number) => number',\n        },\n      },\n    },\n    isVariableSizeList: {\n      description: 'Determines whether the list has variable item sizes',\n      control: {type: 'boolean'},\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle:\n        'Displays a virtualized, scrollable list with infinite pagination.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { InfinitePagination } from \"@spaced-out/ui-design-system/lib/components/InfinitePagination\";\n\\`\\`\\`\n\nThe \\`InfinitePagination\\` component renders a performant scrollable list using \\`react-window\\` and supports both fixed and variable item heights. It automatically loads more data as the user scrolls near the bottom of the list.\n\n- Supports infinite scroll via \\`loadMoreItems\\`\n- Accepts custom item renderers via \\`renderItem\\`\n- Optionally supports variable height items\n- Displays a loading spinner when fetching more items\n\nUse this component when rendering long lists of data without sacrificing performance.\n      `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/InfinitePagination/InfinitePagination',\n    },\n  },\n};\n\nexport const WithFixedSizeListStory = (args: InfinitePaginationProps) => {\n  const [items, setItems] = React.useState<ListItem[]>([]);\n  const [page, setPage] = React.useState(1);\n  const [hasNextPage, setHasNextPage] = React.useState(true);\n  const [isLoading, setIsLoading] = React.useState(false);\n\n  // Simulate fetching data from an API\n  const fetchItems = React.useCallback(\n    async (pageNumber: number): Promise<ListItem[]> => {\n      setIsLoading(true);\n\n      // Simulate API call delay\n      await new Promise(\n        (resolve: (result: Promise<undefined> | undefined) => void) =>\n          setTimeout(resolve, 1000),\n      );\n\n      // Generate mock data for this page\n      const pageSize = 20;\n      const startId = (pageNumber - 1) * pageSize + 1;\n\n      // Simulate reaching the end of available data after page 5\n      if (pageNumber > 5) {\n        setHasNextPage(false);\n        setIsLoading(false);\n        return [];\n      }\n\n      const newItems: ListItem[] = Array.from(\n        {length: pageSize},\n        (_, index) => ({\n          id: startId + index,\n          title: `Item ${startId + index}`,\n          description: `This is the description for item ${startId + index}`,\n        }),\n      );\n\n      setIsLoading(false);\n      return newItems;\n    },\n    [],\n  );\n\n  // Initial data load\n  React.useEffect(() => {\n    const loadInitialData = async () => {\n      const initialItems = await fetchItems(1);\n      setItems(initialItems);\n    };\n\n    loadInitialData();\n  }, [fetchItems]);\n\n  // Function to load more items when user scrolls to bottom\n  const loadMoreItems = React.useCallback(async () => {\n    if (isLoading || !hasNextPage) {\n      return;\n    }\n\n    const nextPage = page + 1;\n    const newItems = await fetchItems(nextPage);\n\n    setItems((prevItems) => [...prevItems, ...newItems]);\n    setPage(nextPage);\n  }, [fetchItems, isLoading, hasNextPage, page]);\n\n  // Render each item in the list\n  const renderItem: (item: GenericObject, index: number) => React.ReactNode = ({\n    title,\n  }) => (\n    <Card {...args}>\n      <CardTitle>{String(title)}</CardTitle>\n    </Card>\n  );\n\n  // Extract key from item\n  const getItemKey = (item: GenericObject): string | number => String(item.id);\n\n  return (\n    <div className={css.storyContainer}>\n      <InfinitePagination\n        {...args}\n        items={items}\n        width={spaceFluid}\n        itemSize={100}\n        renderItem={renderItem}\n        loadMoreItems={loadMoreItems}\n        hasNextPage={hasNextPage}\n        getItemKey={getItemKey}\n        isVariableSizeList={false}\n      />\n    </div>\n  );\n};\n\nWithFixedSizeListStory.args = {\n  classNames: '',\n  testId: 'infinite-pagination-fixed-size-story',\n};\n\nexport const WithVariableSizeListStory = (args: InfinitePaginationProps) => {\n  const [items, setItems] = React.useState<ListItem[]>([]);\n  const [page, setPage] = React.useState(1);\n  const [hasNextPage, setHasNextPage] = React.useState(true);\n  const [isLoading, setIsLoading] = React.useState(false);\n\n  // Simulate fetching data from an API\n  const fetchItems = React.useCallback(\n    async (pageNumber: number): Promise<ListItem[]> => {\n      setIsLoading(true);\n\n      // Simulate API call delay\n      await new Promise(\n        (resolve: (result: Promise<undefined> | undefined) => void) =>\n          setTimeout(resolve, 1000),\n      );\n\n      // Generate mock data for this page\n      const pageSize = 20;\n      const startId = (pageNumber - 1) * pageSize + 1;\n\n      // Simulate reaching the end of available data after page 5\n      if (pageNumber > 5) {\n        setHasNextPage(false);\n        setIsLoading(false);\n        return [];\n      }\n\n      const newItems: ListItem[] = Array.from(\n        {length: pageSize},\n        (_, index) => ({\n          id: startId + index,\n          title: `Item ${startId + index}`,\n          description: `This is the description for item ${startId + index}`,\n        }),\n      );\n\n      setIsLoading(false);\n      return newItems;\n    },\n    [],\n  );\n\n  // Initial data load\n  React.useEffect(() => {\n    const loadInitialData = async () => {\n      const initialItems = await fetchItems(1);\n      setItems(initialItems);\n    };\n\n    loadInitialData();\n  }, [fetchItems]);\n\n  // Function to load more items when user scrolls to bottom\n  const loadMoreItems = React.useCallback(async () => {\n    if (isLoading || !hasNextPage) {\n      return;\n    }\n\n    const nextPage = page + 1;\n    const newItems = await fetchItems(nextPage);\n\n    setItems((prevItems) => [...prevItems, ...newItems]);\n    setPage(nextPage);\n  }, [fetchItems, isLoading, hasNextPage, page]);\n\n  // Render each item in the list\n  const renderItem = ({title}: GenericObject) => (\n    <div className={css.variableListItem}>\n      <Card classNames={{wrapper: css.variableListCard}}>\n        <CardTitle>{String(title)}</CardTitle>\n      </Card>\n    </div>\n  );\n\n  // Extract key from item\n  const getItemKey = (item: GenericObject): string | number => String(item.id);\n\n  const getItemSize = (index: number): number => {\n    const min = 100;\n    const max = 300;\n\n    const pseudoRandom = Math.sin(index * 987.654) * 10000;\n    const fractional = pseudoRandom - Math.floor(pseudoRandom);\n    return Math.floor(fractional * (max - min + 1)) + min;\n  };\n\n  return (\n    <div className={css.storyContainer}>\n      <InfinitePagination\n        {...args}\n        items={items}\n        width={spaceFluid}\n        itemSize={getItemSize}\n        renderItem={renderItem}\n        loadMoreItems={loadMoreItems}\n        hasNextPage={hasNextPage}\n        getItemKey={getItemKey}\n        isVariableSizeList={true}\n      />\n    </div>\n  );\n};\n\nWithVariableSizeListStory.args = {\n  classNames: '',\n  testId: 'infinite-pagination-variable-size-story',\n};\nWithFixedSizeListStory.storyName = 'With Fixed Size List';\nWithVariableSizeListStory.storyName = 'With Variable Size List';\n"
        },
        "css": {
          "path": "InfinitePagination.module.css",
          "content": "@value (\n  spaceFluid\n) from '../../styles/variables/_space.css';\n\n.wrapper {\n  display: flex;\n  height: spaceFluid;\n}\n\n.loader {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.listRow {\n  box-sizing: border-box;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/InfinitePagination/InfinitePagination';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "InfinitePagination.module.css",
        "InfinitePagination.stories.module.css",
        "InfinitePagination.stories.tsx",
        "InfinitePagination.tsx",
        "index.ts"
      ]
    },
    "InlineDropdown": {
      "name": "InlineDropdown",
      "path": "src/components/InlineDropdown",
      "files": {
        "main": {
          "path": "InlineDropdown.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { ClickAwayRefType } from '../../utils/click-away';\nimport type { UnstyledButtonProps } from '../../components/Button';\nimport type { AnchorType } from '../../components/ButtonDropdown';\nimport type { MenuOption, MenuProps } from '../../components/Menu';\nimport type { ElevationType } from '../../components/Tooltip';\ntype ClassNames = Readonly<{\n    buttonWrapper?: string;\n    dropdownContainer?: string;\n}>;\nexport interface InlineDropdownProps extends Omit<UnstyledButtonProps, 'classNames' | 'menu' | 'anchorPosition' | 'onOptionSelect' | 'onMenuOpen' | 'onMenuClose' | 'size' | 'elevation' | 'clickAwayRef'> {\n    classNames?: ClassNames;\n    menu?: MenuProps;\n    anchorPosition?: AnchorType;\n    onOptionSelect?: (option: MenuOption, arg2?: React.SyntheticEvent<HTMLElement> | null | undefined) => unknown;\n    onMenuOpen?: () => unknown;\n    onMenuClose?: () => unknown;\n    size?: 'medium' | 'small' | 'extraSmall';\n    elevation?: ElevationType;\n    /**\n     * Opt in to the accessibility behavior: `aria-haspopup` / `aria-expanded` /\n     * `aria-controls` on the trigger, the arrow key that opens the popup, focus\n     * moving into the menu and back to the trigger, and the roving tab stop\n     * inside it. Forwarded to the `Menu` this opens.\n     *\n     * Off by default, and off is this component exactly as it behaved before any\n     * of it existed.\n     */\n    enableA11y?: boolean;\n    clickAwayRef?: React.RefObject<ClickAwayRefType | null>;\n    testId?: string;\n}\nexport declare const InlineDropdown: Flow.AbstractComponent<InlineDropdownProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=InlineDropdown.d.ts.map"
        },
        "story": {
          "path": "InlineDropdown.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {\n  getButtonLabelFromSelectedKeys,\n  getSelectedKeysFromSelectedOption,\n} from 'src/utils/menu';\n\nimport type {ButtonProps} from 'src/components/Button';\nimport {ANCHOR_POSITION_TYPE} from 'src/components/ButtonDropdown';\nimport type {InlineDropdownProps} from 'src/components/InlineDropdown/InlineDropdown';\nimport {InlineDropdown} from 'src/components/InlineDropdown/InlineDropdown';\nimport type {MenuOption, MenuProps} from 'src/components/Menu';\nimport {MenuFooter, MenuHeader} from 'src/components/Menu/Menu.stories';\nimport {ELEVATION_TYPES} from 'src/components/Tooltip';\n\nimport css from 'src/components/InlineDropdown/InlineDropdown.stories.module.css';\n\n\nconst anchorPositionOptions: Array<unknown> = [\n  ...Object.values(ANCHOR_POSITION_TYPE),\n];\n\nimport type {ClickAwayRefType} from 'src/utils/click-away';\n\nimport {BUTTON_ACTION_TYPE} from 'src/components/Button';\n\n\nconst elevationOptions: Array<unknown> = [...Object.values(ELEVATION_TYPES)];\nconst actionTypeOptions: Array<unknown> = [\n  ...Object.values(BUTTON_ACTION_TYPE),\n];\n\nconst textOptions: MenuOption[] = [\n  {key: '1', label: 'Option one'},\n  {key: '2', label: 'Option two'},\n  {\n    key: '3',\n    label:\n      'Option three this is a very long option that would truncate, and this is even longer text to further test the truncation behavior in the dropdown component, ensuring that extremely long labels are handled gracefully and do not break the layout or overflow in an undesirable way, especially when the text is much longer than what would typically be expected in a dropdown option.',\n  },\n  {\n    key: '4',\n    label: 'Option four very long option that would truncate',\n  },\n  {key: '5', label: 'Option five(disabled)', disabled: true},\n  {\n    key: '6',\n    label: 'Option six(disabled) very long option that would truncate',\n    disabled: true,\n  },\n  {key: '7', label: 'Option Seven'},\n  {key: '8', label: 'Option Eight'},\n  {key: '9', label: 'Option Night'},\n];\n\nconst menuProps: MenuProps = {\n  isFluid: false,\n  menuDisabled: false,\n  size: 'medium',\n  options: textOptions,\n};\n\nconst textOnlyInlineDropdownProps: ButtonProps = {\n  children: 'Button Text',\n};\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Inline Dropdown/Generic Inline Dropdown',\n  component: InlineDropdown,\n  argTypes: {\n    enableA11y: {\n      description:\n        '**enableA11y** opts into the accessibility behavior: `aria-haspopup` / `aria-expanded` / `aria-controls` on the trigger, the arrow key that opens the popup, and focus moving into the menu and back. Off by default, where `InlineDropdown` behaves exactly as it did before any of it existed. Off here too, as everywhere: turn the control on to see the accessible behavior.',\n      control: {type: 'boolean'},\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    onClick: {\n      description:\n        '**onClick** handler that is applied to the root `<UnstyledButton>` element',\n      action: 'clicked',\n      table: {\n        type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n      },\n    },\n    menu: {\n      description: 'Menu props to use',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: 'MenuProps'},\n      },\n    },\n    classNames: {\n      description: 'External classNames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: '{buttonWrapper?: string, dropdownContainer?: string}'},\n      },\n    },\n    elevation: {\n      description:\n        'Elevation level for the dropdown menu. This controls the z-index stacking order. Default is set to \"modal\" elevation. Use higher elevation levels when rendering the dropdown above other elevated elements like Modal, Toast, etc.',\n      control: {\n        type: 'select',\n      },\n      options: elevationOptions,\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'modal'},\n      },\n    },\n    actionType: {\n      options: actionTypeOptions,\n      description:\n        'Action type of Button. Supported types are listed on the dropdown',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'submit'},\n      },\n    },\n    size: {\n      description:\n        'Inline dropdown supports only three size variants namely small and medium and extra small. `extraSmall` < `small` < `medium`',\n      control: {\n        type: 'radio',\n      },\n      options: ['medium', 'small', 'extraSmall'],\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    disabled: {\n      description: 'If **true**, the component is disabled',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    children: {\n      description: 'The content of the inline dropdown',\n      table: {\n        type: {summary: 'React.Component | string'},\n      },\n    },\n    onOptionSelect: {\n      description:\n        '**onOptionSelect** handler is triggered when there is a change in selected option',\n      action: 'clicked',\n      table: {\n        type: {\n          summary:\n            '(option: MenuOption, ?SyntheticEvent<HTMLElement>) => mixed',\n        },\n      },\n    },\n    onMenuOpen: {\n      description: '**onMenuOpen** handler is triggered when menu is opened.',\n      action: 'clicked',\n      table: {\n        type: {summary: '() => mixed'},\n      },\n    },\n    onMenuClose: {\n      description: '**onMenuClose** handler is triggered when menu is closed.',\n      action: 'clicked',\n      table: {\n        type: {summary: '() => mixed'},\n      },\n    },\n    anchorPosition: {\n      options: anchorPositionOptions,\n      description:\n        'Position of Menu. It can be any one value from the dropdown',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'bottom-start'},\n      },\n    },\n    clickAwayRef: {\n      type: {optional: true},\n      description: 'ref that contains the functions to open or close the child',\n      table: {\n        type: {\n          summary: 'ClickAwayRefType',\n        },\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a InlineDropdown component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { InlineDropdown } from \"@spaced-out/ui-design-system/lib/components/InlineDropdown\";\n\\`\\`\\`\nInline Dropdown is a composite component that internally implements **<a href=\"../?path=/docs-components-menu--docs\">Menu</a>** with\n**Unstyled Button** component. It also uses **Floating UI** to position the\nmenu component relative to empty space available, taking viewport and component position into account. This makes sure that menu is always visible\nirrespective of the component positioning. The component has a callback to notify the parent on option selection. Inline Dropdown is implemented inside a\n\\`ClickAway\\` listener and thus Menu is closed automatically on outside click.\n\n- Supports passing a \\`clickAwayRef\\` prop to the component.\n- You can always force Open the dropdown from ref by using \\`clickAwayRef.current?.forceOpen()\\`. This might be useful when want to force Open as per you needs.\n- You can always force Close the dropdown from ref by using \\`clickAwayRef.current?.forceClose()\\`. This might be useful when want to force Close as per you needs.\n\n\n**Note: ** For checkbox type option set you can make use of \\`getSelectedKeysFromSelectedOption\\` and \\`getButtonLabelFromSelectedKeys\\` from \\`utils/menu\\`\nto populate \\`selectedKeys\\` and \\`buttonText\\` respectively.\n          `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/InlineDropdown/InlineDropdown',\n    },\n  },\n};\n\nexport const TextOnlyStory = (args: InlineDropdownProps) => (\n  <div className={css.menuBtnWrapper}>\n    <InlineDropdown {...args} />\n  </div>\n);\n\nTextOnlyStory.args = {\n  ...textOnlyInlineDropdownProps,\n  menu: menuProps,\n  size: 'medium',\n  testId: 'inline-dropdown-text-only-story',\n};\n\nexport const TextWithTooltipStory = (args: InlineDropdownProps) => (\n  <div className={css.menuBtnWrapper}>\n    <InlineDropdown {...args} />\n  </div>\n);\n\nTextWithTooltipStory.args = {\n  ...textOnlyInlineDropdownProps,\n  menu: {...menuProps, showLabelTooltip: {maxLines: 2}},\n  size: 'medium',\n  testId: 'inline-dropdown-text-with-tooltip-story',\n};\n\nexport const WithSearchStory = (args: InlineDropdownProps) => (\n  <div className={css.menuBtnWrapper}>\n    <InlineDropdown {...args} />\n  </div>\n);\n\nWithSearchStory.args = {\n  ...textOnlyInlineDropdownProps,\n  menu: {...menuProps, allowSearch: true},\n  size: 'medium',\n  testId: 'inline-dropdown-with-search-story',\n};\n\nconst checkboxMenuProps: MenuProps = {\n  options: textOptions,\n  optionsVariant: 'checkbox',\n  selectedKeys: ['4'],\n  isFluid: false,\n};\n\nexport const WithCheckboxMenuStory = (args: InlineDropdownProps) => {\n  const [btnText, setBtnText] = React.useState<React.ReactNode>('');\n  const [selectedKeys, setSelectedKeys] = React.useState(\n    args.menu?.selectedKeys || [],\n  );\n\n  React.useEffect(() => {\n    setSelectedKeys(args.menu?.selectedKeys || []);\n    const newBtnText = getButtonLabelFromSelectedKeys(\n      args.menu?.selectedKeys,\n      args.children,\n    );\n    setBtnText(newBtnText);\n  }, [args.menu?.selectedKeys]);\n\n  const handleChange = (option: MenuOption) => {\n    const newSelectedKeys = getSelectedKeysFromSelectedOption(\n      option,\n      selectedKeys,\n    );\n    const newBtnText = getButtonLabelFromSelectedKeys(\n      newSelectedKeys,\n      args.children,\n    );\n    setSelectedKeys(newSelectedKeys);\n    setBtnText(newBtnText);\n  };\n\n  return (\n    <div className={css.menuBtnWrapper}>\n      <InlineDropdown\n        {...args}\n        menu={{...args.menu, selectedKeys}}\n        onOptionSelect={handleChange}\n      >\n        {btnText}\n      </InlineDropdown>\n    </div>\n  );\n};\n\nWithCheckboxMenuStory.args = {\n  children: 'Long Button Text',\n  menu: checkboxMenuProps,\n  size: 'medium',\n  testId: 'inline-dropdown-with-checkbox-menu-story',\n};\n\nconst radioMenuProps: MenuProps = {\n  options: textOptions,\n  optionsVariant: 'radio',\n  selectedKeys: ['4'],\n  isFluid: false,\n};\n\nexport const WithRadioMenuStory = (args: InlineDropdownProps) => {\n  const [selectedKeys, setSelectedKeys] = React.useState(\n    args.menu?.selectedKeys || [],\n  );\n\n  React.useEffect(() => {\n    setSelectedKeys(args.menu?.selectedKeys || []);\n  }, [args.menu?.selectedKeys]);\n\n  const handleChange = (option: MenuOption) => {\n    setSelectedKeys([option.key]);\n  };\n\n  return (\n    <div className={css.menuBtnWrapper}>\n      <InlineDropdown\n        {...args}\n        menu={{...args.menu, selectedKeys}}\n        onOptionSelect={handleChange}\n      >\n        {args.children}\n      </InlineDropdown>\n    </div>\n  );\n};\n\nWithRadioMenuStory.args = {\n  children: 'Long Button Text',\n  menu: radioMenuProps,\n  testId: 'inline-dropdown-with-radio-menu-story',\n};\n\nexport const WithHeaderAndFooterStory = (args: InlineDropdownProps) => (\n  <WithHeaderAndFooter {...args} />\n);\n\nexport const WithHeaderAndFooter = (args: InlineDropdownProps) => {\n  const clickAwayRef = React.useRef<ClickAwayRefType | null>(null);\n  const [btnText, setBtnText] = React.useState<React.ReactNode>('');\n  const [selectedKeys, setSelectedKeys] = React.useState(\n    args.menu?.selectedKeys || [],\n  );\n\n  React.useEffect(() => {\n    setSelectedKeys(args.menu?.selectedKeys || []);\n    const newBtnText = getButtonLabelFromSelectedKeys(\n      args.menu?.selectedKeys,\n      args.children,\n    );\n    setBtnText(newBtnText);\n  }, [args.menu?.selectedKeys]);\n\n  const handleChange = (option: MenuOption) => {\n    const newSelectedKeys = getSelectedKeysFromSelectedOption(\n      option,\n      selectedKeys,\n    );\n    const newBtnText = getButtonLabelFromSelectedKeys(\n      newSelectedKeys,\n      args.children,\n    );\n    setSelectedKeys(newSelectedKeys);\n    setBtnText(newBtnText);\n  };\n\n  const onSave = () => {\n    if (clickAwayRef.current) {\n      clickAwayRef.current?.forceClose();\n    }\n  };\n\n  return (\n    <div className={css.menuBtnWrapper}>\n      <InlineDropdown\n        {...args}\n        menu={{\n          ...args.menu,\n          selectedKeys,\n          header: <MenuHeader />,\n          footer: <MenuFooter onSave={onSave} />,\n        }}\n        onOptionSelect={handleChange}\n        clickAwayRef={clickAwayRef}\n      >\n        {btnText}\n      </InlineDropdown>\n    </div>\n  );\n};\n\nconst menuPropsWithHeaderAndFooter: MenuProps = {\n  options: textOptions,\n  optionsVariant: 'checkbox',\n};\n\nWithHeaderAndFooterStory.args = {\n  children: 'Long Button Text',\n  menu: menuPropsWithHeaderAndFooter,\n  size: 'medium',\n  testId: 'inline-dropdown-with-header-and-footer-story',\n};\nTextOnlyStory.storyName = 'Text Only';\nTextWithTooltipStory.storyName = 'Text With Tooltip';\nWithSearchStory.storyName = 'With Search';\nWithCheckboxMenuStory.storyName = 'With Checkbox Menu';\nWithRadioMenuStory.storyName = 'With Radio Menu';\nWithHeaderAndFooterStory.storyName = 'With Header And Footer';\n"
        },
        "css": {
          "path": "InlineDropdown.module.css",
          "content": "@value ( sizeFluid) from '../../styles/variables/_size.css';\n@value ( spaceXXSmall) from '../../styles/variables/_space.css';\n@value ( colorTextDisabled, colorFocusPrimary) from '../../styles/variables/_color.css';\n@value ( borderWidthNone, borderWidthTertiary, borderRadiusXSmall) from '../../styles/variables/_border.css';\n\n.inlineDropdownContainer {\n  display: flex;\n  position: relative;\n}\n\n.isFluid {\n  width: sizeFluid;\n}\n\n.inlineButton {\n  display: flex;\n  gap: spaceXXSmall;\n  cursor: pointer;\n  align-items: center;\n  border-radius: borderRadiusXSmall;\n}\n\n.inlineButton:focus {\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n\n.medium {\n  composes: buttonTextMedium from '../../styles/typography.module.css';\n}\n\n.small {\n  composes: buttonTextSmall from '../../styles/typography.module.css';\n}\n\n.extraSmall {\n  composes: buttonTextExtraSmall from '../../styles/typography.module.css';\n}\n\n.disabled {\n  pointer-events: none;\n  color: colorTextDisabled;\n  cursor: not-allowed;\n}\n\n.menuWrapper {\n  width: var(--dropdown-width);\n  z-index: var(--menu-elevation);\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/InlineDropdown/InlineDropdown';\nexport * from '../../components/InlineDropdown/SimpleInlineDropdown';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "SimpleInlineDropdown.d.ts": {
            "path": "SimpleInlineDropdown.d.ts",
            "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { MenuClassNames, MenuLabelTooltip } from '../../types/menu';\nimport type { ClickAwayRefType } from '../../utils/click-away';\nimport type { ButtonProps } from '../../components/Button';\nimport type { AnchorType } from '../../components/ButtonDropdown';\nimport type { MenuOption, MenuOptionsVariant, Virtualization } from '../../components/Menu';\nimport type { ElevationType } from '../../components/Tooltip';\ntype ClassNames = Readonly<{\n    buttonWrapper?: string;\n    dropdownContainer?: string;\n}>;\nexport interface SimpleInlineDropdownRef {\n    selectedKeys?: Array<string>;\n}\nexport interface SimpleInlineDropdownProps extends Omit<ButtonProps, 'elevation' | 'classNames' | 'anchorPosition' | 'options' | 'optionsVariant' | 'allowSearch' | 'selectedKeys' | 'showLabelTooltip' | 'allowWrap' | 'onOptionSelect' | 'onMenuOpen' | 'onMenuClose' | 'menuVirtualization' | 'header' | 'footer' | 'menuClassNames' | 'resolveLabel' | 'resolveSecondaryLabel' | 'clickAwayRef' | 'testId'> {\n    elevation?: ElevationType;\n    classNames?: ClassNames;\n    anchorPosition?: AnchorType;\n    options?: Array<MenuOption>;\n    optionsVariant?: MenuOptionsVariant;\n    allowSearch?: boolean;\n    selectedKeys?: Array<string>;\n    showLabelTooltip?: MenuLabelTooltip;\n    allowWrap?: boolean;\n    onOptionSelect?: (option: MenuOption, arg2?: React.SyntheticEvent<HTMLElement> | null | undefined) => unknown;\n    onMenuOpen?: () => unknown;\n    onMenuClose?: () => unknown;\n    menuVirtualization?: Virtualization;\n    header?: React.ReactNode;\n    footer?: React.ReactNode;\n    menuClassNames?: MenuClassNames;\n    resolveLabel?: (option: MenuOption) => string | React.ReactNode;\n    resolveSecondaryLabel?: (option: MenuOption) => string | React.ReactNode;\n    clickAwayRef?: React.RefObject<ClickAwayRefType | null>;\n    /**\n     * Opt in to the accessibility behavior of the `InlineDropdown` this renders: its\n     * ARIA roles and state, keyboard navigation of the options, and focus\n     * handling on close. Forwarded unchanged.\n     *\n     * Off by default, and off is this component exactly as it behaved before\n     * any of it existed.\n     */\n    enableA11y?: boolean;\n    testId?: string;\n}\nexport declare const SimpleInlineDropdown: Flow.AbstractComponent<SimpleInlineDropdownProps, SimpleInlineDropdownRef>;\nexport {};\n//# sourceMappingURL=SimpleInlineDropdown.d.ts.map"
          }
        }
      },
      "allFiles": [
        "InlineDropdown.module.css",
        "InlineDropdown.stories.module.css",
        "InlineDropdown.stories.tsx",
        "InlineDropdown.tsx",
        "SimpleInlineDropdown.stories.tsx",
        "SimpleInlineDropdown.tsx",
        "index.ts"
      ]
    },
    "Input": {
      "name": "Input",
      "path": "src/components/Input",
      "files": {
        "main": {
          "path": "Input.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { IconType } from '../../components/Icon';\ntype ClassNames = Readonly<{\n    box?: string;\n    iconLeft?: string;\n    iconRight?: string;\n    wrapper?: string;\n    prefixText?: string;\n    rightSlotContent?: string;\n}>;\nexport declare const EXPONENT_CHARACTER_LIST: string[];\nexport declare const INPUT_TYPES: Readonly<{\n    text: \"text\";\n    number: \"number\";\n    password: \"password\";\n    email: \"email\";\n    tel: \"tel\";\n    url: \"url\";\n    date: \"date\";\n    'datetime-local': \"datetime-local\";\n    time: \"time\";\n    week: \"week\";\n    month: \"month\";\n    color: \"color\";\n    search: \"search\";\n}>;\nexport type InputType = (typeof INPUT_TYPES)[keyof typeof INPUT_TYPES];\nexport interface InputOnChangeParamsType {\n    evt: React.ChangeEvent<HTMLInputElement>;\n    isEnter?: boolean;\n}\nexport interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange' | 'classNames' | 'onFocus' | 'onBlur' | 'onKeyDown' | 'onPaste' | 'onIconRightClick' | 'onContainerClick' | 'name' | 'disabled' | 'placeholder' | 'locked' | 'error' | 'errorText' | 'label' | 'helperText' | 'type' | 'size' | 'iconLeftName' | 'iconLeftType' | 'iconRightName' | 'iconRightType' | 'required' | 'readOnly' | 'boxRef' | 'minLength' | 'maxLength' | 'pattern' | 'min' | 'max' | 'autoComplete' | 'disallowExponents' | 'step' | 'hideNumberSpinner' | 'hidePasswordToggleIcon'> {\n    value?: string;\n    onChange?: (evt: React.ChangeEvent<HTMLInputElement>, isEnter?: boolean) => unknown;\n    classNames?: ClassNames;\n    onFocus?: React.FocusEventHandler<HTMLInputElement>;\n    onBlur?: React.FocusEventHandler<HTMLInputElement>;\n    onKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;\n    onPaste?: React.ClipboardEventHandler<HTMLInputElement>;\n    onIconRightClick?: ((arg1: React.SyntheticEvent<HTMLElement>) => unknown) | null | undefined;\n    onContainerClick?: React.MouseEventHandler<HTMLDivElement>;\n    name?: string;\n    disabled?: boolean;\n    placeholder?: string;\n    locked?: boolean;\n    error?: boolean;\n    errorText?: string;\n    label?: string | React.ReactNode;\n    helperText?: string | React.ReactNode;\n    rightSlot?: React.ReactNode;\n    type?: InputType;\n    size?: 'medium' | 'small';\n    iconLeftName?: string;\n    iconLeftType?: IconType;\n    iconRightName?: string;\n    iconRightType?: IconType;\n    required?: boolean;\n    readOnly?: boolean;\n    boxRef?: React.Ref<HTMLDivElement>;\n    minLength?: number;\n    maxLength?: number;\n    pattern?: string;\n    min?: string;\n    max?: string;\n    autoComplete?: string;\n    disallowExponents?: boolean;\n    /**\n     * The step attribute is a number that specifies the granularity that the value must adhere to, or the special value any.\n     * Only values which are equal to the basis for stepping (min if specified, value otherwise, and an\n     * appropriate default value if neither of those is provided) are valid.\n     */\n    step?: string;\n    hideNumberSpinner?: boolean;\n    hidePasswordToggleIcon?: boolean;\n    testId?: string;\n    disableWheelPropagation?: boolean;\n    prefix?: string;\n}\nexport declare const Input: Flow.AbstractComponent<InputProps, HTMLInputElement>;\nexport {};\n//# sourceMappingURL=Input.d.ts.map"
        },
        "story": {
          "path": "Input.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {Icon} from 'src/components/Icon';\nimport type {InputProps} from 'src/components/Input/Input';\nimport {Input} from 'src/components/Input/Input';\nimport {Toggle} from 'src/components/Toggle';\nimport {Tooltip} from 'src/components/Tooltip';\n\nimport css from 'src/components/Input/Input.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Form Components/Input',\n  component: Input,\n  argTypes: {\n    type: {\n      options: ['text', 'number', 'password', 'email', 'tel', 'url', 'search'],\n      description: 'Type of Input. Supported types are listed on the dropdown',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'text'},\n      },\n    },\n    size: {\n      options: ['small', 'medium'],\n      description:\n        'Input supports only two size variants namely small and medium. `small` < `medium`',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    iconLeftName: {\n      description:\n        'Left icon to be applied to the button, it internally uses the `Icon` component to render icons',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    iconLeftType: {\n      description:\n        'Type of Left Icon. Type represents 4 unique icon styles :- Solid, Regular, Duotone and Brands',\n      options: ['regular', 'solid', 'duotone', 'brands'],\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'regular'},\n      },\n    },\n    iconRightName: {\n      description:\n        'Right icon to be applied to the button, it internally uses the `Icon` component to render icons',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    iconRightType: {\n      description:\n        'Type of Right Icon. Type represents 4 unique icon styles :- Solid, Regular, Duotone and Brands',\n      options: ['regular', 'solid', 'duotone', 'brands'],\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'regular'},\n      },\n    },\n    prefix: {\n      description: 'Prefix to be displayed before the input',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    value: {\n      description: 'Value of the input',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    name: {\n      description: 'Name of the input',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    disabled: {\n      description: 'if **true**, the component is disabled',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    required: {\n      description: 'if **true**, a red star would be added to the label',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    disallowExponents: {\n      description:\n        'if **true**, prevents users from typing exponent characters (`e`, `E`) in the input field',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    placeholder: {\n      description: 'Placeholder of input. This appears inside the input box',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    locked: {\n      description:\n        'if **true**, the component is locked, Locked state is the readonly state of the input',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    error: {\n      description:\n        'if **true**, the component is moved to error state, Error state displays a red border surrounding input',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    errorText: {\n      description:\n        'Error text to be displayed on the bottom of the input. This uses `colorTextDanger`',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    label: {\n      description: 'Primary label of the input. This appears on top of input',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    helperText: {\n      description:\n        'Secondary label of the input. This appears on bottom of input, if the input is in `error` state the priority is given to `errorText`, in such cases secondary label wont be displayed',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    rightSlot: {\n      description: 'Right slot to be applied to the input',\n      control: {\n        type: 'React.ReactNode',\n      },\n      table: {\n        type: {summary: 'React.ReactNode'},\n      },\n    },\n    classNames: {\n      description: 'External classnames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary:\n            '{wrapper?: string, box?: string, iconLeft?: string, iconRight?: string, prefixText?: string}',\n        },\n      },\n    },\n    readOnly: {\n      description: 'if **true**, component would move to readonly state',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n      },\n    },\n    hideNumberSpinner: {\n      description:\n        'if **true**, component would not show spinner for number input',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n      },\n    },\n    hidePasswordToggleIcon: {\n      description:\n        'if **true**, component would not show password toggle icon for password input',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n      },\n    },\n    disableWheelPropagation: {\n      description:\n        'if **false**, wheel events will be propagated for number inputs to the parent element, else they will be prevented to avoid scrolling the parent element',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    minLength: {\n      description: 'Minimum length (number of characters) of `value`',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    maxLength: {\n      description: 'Maximum length (number of characters) of `value`',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    pattern: {\n      description: 'Pattern the `value` must match to be valid',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    min: {\n      description: 'Minimum `value`',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    max: {\n      description: 'Maximum `value`',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    step: {\n      description: 'Incremental `values` that are valid',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    onChange: {\n      description:\n        '**onChange** handler is triggered when there is a change in input value',\n      action: 'changed',\n      table: {\n        type: {\n          summary:\n            'onChange?: ( evt: SyntheticInputEvent<HTMLInputElement>, isEnter?: boolean, ) => mixed',\n        },\n      },\n    },\n    onFocus: {\n      description: '**onFocus** handler is triggered when input is focussed',\n      action: 'focussed',\n      table: {\n        type: {summary: '(e: SyntheticInputEvent<HTMLInputElement>) => mixed'},\n      },\n    },\n    onBlur: {\n      description: '**onBlur** handler is triggered when input is blurred',\n      action: 'blurred',\n      table: {\n        type: {summary: '(e: SyntheticInputEvent<HTMLInputElement>) => mixed'},\n      },\n    },\n    onKeyDown: {\n      description: '**onKeyDown** handler is triggered on keypress',\n      action: 'onKeyDowned',\n      table: {\n        type: {summary: '(e: SyntheticInputEvent<HTMLInputElement>) => mixed'},\n      },\n    },\n    onIconRightClick: {\n      description:\n        '**onIconRightClick** handler is triggered on click of the right icon',\n      action: 'onIconRightClicked',\n      table: {\n        type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n      },\n    },\n    onPaste: {\n      description:\n        '**onPaste** handler is triggered when text is pasted from the clipboard',\n      action: 'pasted',\n      table: {\n        type: {summary: '(e: ClipboardEvent) => mixed'},\n      },\n    },\n    autoComplete: {\n      description:\n        'allows the browser to do a pattern match against a list of values locally stored with the browser',\n      action: 'autoComplete',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Input component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Input } from \"@spaced-out/ui-design-system/lib/components/Input\";\n\\`\\`\\`\nBasic input component which supports error, disabled and locked states. All values from the input component are sent as \\`string\\`<br>\nInput alo supports a bunch of **callbacks** listed below. There are multiple variants of input that render with defined set of actions\nlike **password** input has a built in functionality to show and hide passwords. **Email** input would have an email icon set at the right.\nInput also supports \\`helperText\\` param to pass in the secondary label.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Input',\n    },\n  },\n};\n\nexport const DefaultStory = (args: InputProps) => {\n  const [value, setValue] = React.useState(args.value);\n\n  React.useEffect(() => {\n    setValue(args.value);\n  }, [args.value]);\n\n  return (\n    <div className={css.inputContainer}>\n      <Input\n        {...args}\n        onChange={(e) => setValue(e.target.value)}\n        value={value}\n      />\n    </div>\n  );\n};\n\nDefaultStory.args = {\n  type: 'text',\n  label: 'Form Label',\n  placeholder: 'Input Some text here',\n  size: 'medium',\n  testId: 'input-default-story',\n};\n\nexport const WithHelperTextStory = (args: InputProps) => {\n  const [value, setValue] = React.useState(args.value);\n\n  React.useEffect(() => {\n    setValue(args.value);\n  }, [args.value]);\n\n  return (\n    <div className={css.inputContainer}>\n      <Input\n        {...args}\n        onChange={(e) => setValue(e.target.value)}\n        value={value}\n      />\n    </div>\n  );\n};\n\nWithHelperTextStory.args = {\n  type: 'text',\n  label: 'Form Label',\n  placeholder: 'Input Some text here',\n  helperText: 'Gain some help from here',\n  size: 'medium',\n  testId: 'input-with-helper-text-story',\n};\n\nexport const RequiredStory = (args: InputProps) => {\n  const [value, setValue] = React.useState(args.value);\n\n  React.useEffect(() => {\n    setValue(args.value);\n  }, [args.value]);\n\n  return (\n    <div className={css.inputContainer}>\n      <Input\n        {...args}\n        onChange={(e) => setValue(e.target.value)}\n        value={value}\n      />\n    </div>\n  );\n};\n\nRequiredStory.args = {\n  type: 'text',\n  label: 'Form Label',\n  placeholder: 'Input Some text here',\n  required: true,\n  size: 'medium',\n  testId: 'input-required-story',\n};\n\nexport const EmailStory = (args: InputProps) => {\n  const [value, setValue] = React.useState(args.value);\n\n  React.useEffect(() => {\n    setValue(args.value);\n  }, [args.value]);\n\n  return (\n    <div className={css.inputContainer}>\n      <Input\n        {...args}\n        onChange={(e) => setValue(e.target.value)}\n        value={value}\n      />\n    </div>\n  );\n};\n\nEmailStory.args = {\n  type: 'email',\n  label: 'Email',\n  placeholder: 'Input Email here',\n  size: 'medium',\n  testId: 'input-email-story',\n};\n\nexport const PasswordStory = (args: InputProps) => {\n  const [value, setValue] = React.useState(args.value);\n\n  React.useEffect(() => {\n    setValue(args.value);\n  }, [args.value]);\n\n  return (\n    <div className={css.inputContainer}>\n      <Input\n        {...args}\n        onChange={(e) => setValue(e.target.value)}\n        value={value}\n      />\n    </div>\n  );\n};\n\nPasswordStory.args = {\n  type: 'password',\n  label: 'Password',\n  placeholder: 'Input Password here',\n  size: 'medium',\n  testId: 'input-password-story',\n};\n\nexport const IconLeftStory = (args: InputProps) => {\n  const [value, setValue] = React.useState(args.value);\n\n  React.useEffect(() => {\n    setValue(args.value);\n  }, [args.value]);\n\n  return (\n    <div className={css.inputContainer}>\n      <Input\n        {...args}\n        onChange={(e) => setValue(e.target.value)}\n        value={value}\n      />\n    </div>\n  );\n};\n\nIconLeftStory.args = {\n  type: 'text',\n  label: 'Form Label',\n  placeholder: 'Input Some text here',\n  iconLeftName: 'face-party',\n  testId: 'input-icon-left-story',\n};\n\nexport const IconRightStory = (args: InputProps) => {\n  const [value, setValue] = React.useState(args.value);\n\n  React.useEffect(() => {\n    setValue(args.value);\n  }, [args.value]);\n\n  return (\n    <div className={css.inputContainer}>\n      <Input\n        {...args}\n        onChange={(e) => setValue(e.target.value)}\n        value={value}\n      />\n    </div>\n  );\n};\n\nIconRightStory.args = {\n  type: 'text',\n  label: 'Form Label',\n  placeholder: 'Input Some text here',\n  iconRightName: 'face-party',\n  testId: 'input-icon-right-story',\n};\n\nexport const DualIconStory = (args: InputProps) => {\n  const [value, setValue] = React.useState(args.value);\n\n  React.useEffect(() => {\n    setValue(args.value);\n  }, [args.value]);\n\n  return (\n    <div className={css.inputContainer}>\n      <Input\n        {...args}\n        onChange={(e) => setValue(e.target.value)}\n        value={value}\n      />\n    </div>\n  );\n};\n\nDualIconStory.args = {\n  type: 'text',\n  label: 'Form Label',\n  placeholder: 'Input Some text here',\n  iconRightName: 'flag',\n  iconLeftName: 'face-party',\n  testId: 'input-dual-icon-story',\n};\n\nexport const ErrorStory = (args: InputProps) => {\n  const [value, setValue] = React.useState(args.value);\n\n  React.useEffect(() => {\n    setValue(args.value);\n  }, [args.value]);\n\n  return (\n    <div className={css.inputContainer}>\n      <Input\n        {...args}\n        onChange={(e) => setValue(e.target.value)}\n        value={value}\n      />\n    </div>\n  );\n};\n\nErrorStory.args = {\n  type: 'password',\n  label: 'Password',\n  placeholder: 'Input Password here',\n  size: 'medium',\n  error: true,\n  errorText: 'Incorrect password',\n  testId: 'input-error-story',\n};\n\nexport const PrefixStory = (args: InputProps) => {\n  const [value, setValue] = React.useState(args.value);\n\n  React.useEffect(() => {\n    setValue(args.value);\n  }, [args.value]);\n\n  return (\n    <div className={css.inputContainer}>\n      <Input\n        {...args}\n        onChange={(e) => setValue(e.target.value)}\n        value={value}\n      />\n    </div>\n  );\n};\n\nPrefixStory.args = {\n  type: 'url',\n  label: 'Custom URL',\n  placeholder: 'xyz.com',\n  size: 'medium',\n  prefix: 'https://',\n  testId: 'input-prefix-story',\n};\n\nexport const RightSlotStory = (args: InputProps) => {\n  const [value, setValue] = React.useState('');\n  const [checked, setChecked] = React.useState(false);\n\n  return (\n    <div className={css.inputContainer}>\n      <Input\n        {...args}\n        onChange={(e) => setValue(e.target.value)}\n        value={value}\n        rightSlot={\n          <div className={css.rightSlotContainer}>\n            <Tooltip title={checked ? 'Disable AI Search' : 'Enable AI Search'}>\n              <div>\n                <Toggle\n                  checked={checked}\n                  onChange={() => {\n                    setChecked(!checked);\n                  }}\n                />\n              </div>\n            </Tooltip>\n            <Icon\n              name=\"sparkles\"\n              type=\"solid\"\n              color={checked ? 'clickable' : 'disabled'}\n            />\n          </div>\n        }\n      />\n    </div>\n  );\n};\n\nRightSlotStory.args = {\n  type: 'text',\n  label: 'Form Label',\n  placeholder: 'Input some text here',\n};\n\nDefaultStory.storyName = 'Default';\nWithHelperTextStory.storyName = 'With Helper Text';\nRequiredStory.storyName = 'Required';\nEmailStory.storyName = 'Email';\nPasswordStory.storyName = 'Password';\nIconLeftStory.storyName = 'Icon Left';\nIconRightStory.storyName = 'Icon Right';\nDualIconStory.storyName = 'Dual Icon';\nErrorStory.storyName = 'Error';\nPrefixStory.storyName = 'Prefix';\nRightSlotStory.storyName = 'Right Slot';\n"
        },
        "css": {
          "path": "Input.module.css",
          "content": "@value (\n  size2,\n  size18,\n  size24,\n  size42,\n  size30,\n  size34,\n  sizeFluid\n) from '../../styles/variables/_size.css';\n\n@value (\n  spaceNone,\n  spaceXSmall,\n  spaceSmall,\n  spaceMedium,\n  spaceXXSmall\n) from '../../styles/variables/_space.css';\n\n@value (\n  borderRadiusMedium,\n  borderRadiusSmall,\n  borderWidthPrimary,\n  borderWidthTertiary,\n  borderWidthNone,\n  borderRadiusXSmall\n) from '../../styles/variables/_border.css';\n\n@value (\n  colorTextPrimary,\n  colorTextSecondary,\n  colorTextTertiary,\n  colorBorderPrimary,\n  colorFillPrimary,\n  colorFocusPrimary,\n  colorFocusDanger,\n  colorTextDisabled,\n  colorFillDisabled,\n  colorTextDanger,\n  colorBackgroundTertiary,\n  colorBorderTertiary\n) from '../../styles/variables/_color.css';\n\n.container {\n  color: colorTextPrimary;\n  width: sizeFluid;\n}\n\n.box {\n  display: flex;\n  align-items: center;\n  color: colorTextPrimary;\n  gap: spaceXSmall;\n  height: size42;\n  padding: spaceNone spaceSmall;\n  border: borderWidthPrimary solid colorBorderPrimary;\n  background-color: colorBackgroundTertiary;\n}\n\n.wrapper:not(.withError) .box:not(.inputDisabled):not(.locked):hover {\n  border-color: colorBorderTertiary;\n}\n\n.wrapper:not(.withError):focus-within\n  .box:not(.inputDisabled):not(.locked):hover {\n  border-color: colorFillPrimary;\n}\n\n.locked {\n  border-style: dashed;\n}\n\n.medium {\n  composes: formInputMedium from '../../styles/typography.module.css';\n  height: size42;\n  border-radius: borderRadiusMedium;\n}\n\n.colorText {\n  composes: formInputMedium from '../../styles/typography.module.css';\n  color: colorTextSecondary;\n}\n\n.hasValue {\n  color: colorTextPrimary;\n}\n\n.small {\n  composes: formInputSmall from '../../styles/typography.module.css';\n  height: size34;\n  border-radius: borderRadiusSmall;\n}\n\n.wrapper.withError .box {\n  border-color: colorTextDanger;\n}\n\n.wrapper.withError:focus-within .box {\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusDanger;\n}\n\n.box input {\n  width: sizeFluid;\n  height: sizeFluid;\n  cursor: inherit;\n}\n\n.wrapper:not(.withError):focus-within .box:not(.inputDisabled) {\n  border-color: colorFillPrimary;\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n\n/*\n * The field is a popup trigger whose popup is open, so DOM focus has moved into a\n * portal and `:focus-within` above no longer matches. Keep the emphasis anyway,\n * including while hovered — otherwise the hover rule repaints the border grey and\n * leaves the popup's halo behind it, a two-tone broken state.\n *\n * These live here rather than in Dropdown/Typeahead's own module because the\n * rules being overridden are scoped to THIS module's `.wrapper` / `.box` /\n * `.withError` class names, which a consumer stylesheet cannot name and so cannot\n * reliably out-specify.\n *\n * Both the popup attribute AND the expanded state are required so this only ever\n * hits a TRIGGER. On `aria-expanded` alone it also matches any other expanded\n * input inside the field — such as a filter field rendered in the popup — and\n * paints a focus ring on something that never has focus. `:not(.locked)` matches\n * the adjacent hover rules: keying off ARIA loses the protection `:focus-within`\n * had for free, since a locked field's input is natively disabled and so could\n * never have been focused.\n */\n.wrapper:not(.withError)\n  .box:not(.inputDisabled):not(.locked):has(\n    input[aria-haspopup][aria-expanded='true']\n  ) {\n  border-color: colorFillPrimary;\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n\n/* An errored trigger keeps the danger colors when its popup is open. */\n.wrapper.withError\n  .box:not(.inputDisabled):not(.locked):has(\n    input[aria-haspopup][aria-expanded='true']\n  ) {\n  border-color: colorTextDanger;\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusDanger;\n}\n\n.inputDisabled {\n  color: colorTextDisabled;\n  border-color: colorBorderPrimary;\n  background-color: colorFillDisabled;\n}\n\n:where(.box) input::placeholder {\n  color: colorTextTertiary;\n}\n\n.inputDisabled input::placeholder {\n  color: inherit;\n}\n\n.wrapper {\n  display: flex;\n  flex-direction: column;\n  width: sizeFluid;\n  gap: spaceXXSmall;\n}\n\n.info {\n  display: flex;\n  justify-content: space-between;\n}\n\n.infoContent {\n  display: flex;\n}\n\n.rightClickableIcon {\n  cursor: pointer;\n}\n\n.rightClickableIcon.disabled {\n  pointer-events: none;\n}\n\n.box.color {\n  padding-right: spaceMedium;\n}\n\n.box > input[type='color'] {\n  display: flex;\n  cursor: pointer;\n  align-items: center;\n  width: fit-content;\n  gap: spaceXSmall;\n  padding: spaceNone;\n  width: size18;\n  height: size18;\n  margin: spaceNone;\n}\n\n.box > input[type='color']::-webkit-color-swatch {\n  display: flex;\n  padding: spaceNone;\n  align-self: center;\n  border: none;\n  min-width: size18;\n  min-height: size18;\n  border-radius: borderRadiusXSmall;\n}\n\n.hideNumberSpinner input[type='number']::-webkit-outer-spin-button,\n.hideNumberSpinner input[type='number']::-webkit-inner-spin-button {\n  -webkit-appearance: none;\n  margin: 0;\n}\n\n/* Hide spinner in Firefox */\n.hideNumberSpinner input[type='number'] {\n  appearance: textfield;\n  -moz-appearance: textfield;\n}\n\n.prefixContainer {\n  display: flex;\n  width: sizeFluid;\n  cursor: inherit;\n  padding-left: size2;\n  overflow-y: auto;\n\n  & .prefixText {\n    color: colorTextTertiary;\n    white-space: nowrap;\n  }\n\n  & input {\n    padding-left: spaceNone;\n    min-width: size18;\n  }\n}\n\n.rightSlotContainer {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  gap: spaceXSmall;\n  width: sizeFluid;\n  cursor: inherit;\n  padding-left: size2;\n  overflow-y: auto;\n\n  & .rightSlotContent {\n    color: colorTextTertiary;\n    padding: 0;\n    width: max-content;\n    min-width: max-content;\n  }\n\n  & input {\n    padding-left: spaceNone;\n    min-width: size18;\n  }\n}\n\n.inputRightSlotSeparator {\n  width: size2;\n  height: size24;\n}\n\n.inputRightSlotSeparator.small {\n  height: size18;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Input/Input';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "Input.module.css",
        "Input.stories.module.css",
        "Input.stories.tsx",
        "Input.tsx",
        "NativeColorpicker.stories.tsx",
        "NativeDatepicker.stories.tsx",
        "index.ts"
      ]
    },
    "KPIBox": {
      "name": "KPIBox",
      "path": "src/components/KPIBox",
      "files": {
        "main": {
          "path": "KPIBox.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { AlertSemanticType } from '../../types/common';\nimport type { IconSize, IconType } from '../../components/Icon';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    topFoldContent?: string;\n    middleFoldContent?: string;\n    bottomFoldContent?: string;\n    textContainer?: string;\n}>;\nexport interface KPIBoxProps {\n    classNames?: ClassNames;\n    semantic?: AlertSemanticType;\n    topContent?: React.ReactNode;\n    middleContent?: React.ReactNode;\n    bottomContent?: React.ReactNode;\n    iconName?: string;\n    iconSize?: IconSize;\n    iconType?: IconType;\n    onClick?: (e: React.MouseEvent<HTMLDivElement> | React.KeyboardEvent<HTMLDivElement>) => void;\n    testId?: string;\n}\nexport declare const KPIBox: Flow.AbstractComponent<KPIBoxProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=KPIBox.d.ts.map"
        },
        "story": {
          "path": "KPIBox.stories.tsx",
          "content": "import * as React from 'react';\n\n// import {ALERT_SEMANTIC} from '../../types/common';\nimport {Icon} from 'src/components/Icon';\nimport type {KPIBoxProps} from 'src/components/KPIBox';\nimport {KPIBox} from 'src/components/KPIBox';\nimport {SubTitleSmall} from 'src/components/Text';\n\nimport css from 'src/components/KPIBox/KPIBox.stories.module.css';\n\n// const semanticOptions: Array<mixed> = [...Object.values(ALERT_SEMANTIC)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Data Viz/KPI',\n  component: KPIBox,\n  argTypes: {\n    // Uncomment when we encourage having semantic KPI Boxes\n    // semantic: {\n    //   description:\n    //     'The semantic type of the KPIBox (e.g., success, warning, danger, etc.).',\n    //   control: {\n    //     type: 'select',\n    //   },\n    //   options: semanticOptions,\n    //   table: {\n    //     type: {\n    //       summary: 'AlertSemanticType',\n    //     },\n    //     defaultValue: {summary: 'neutral'},\n    //   },\n    // },\n    topContent: {\n      description: 'Content to be displayed at the top of the KPIBox.',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: 'React.Node',\n        },\n      },\n    },\n    middleContent: {\n      description: 'Content to be displayed in the middle of the KPIBox.',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: 'React.Node',\n        },\n      },\n    },\n    bottomContent: {\n      description: 'Content to be displayed at the bottom of the KPIBox.',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: 'React.Node',\n        },\n      },\n    },\n    semantic: {\n      description: 'Semantic of the icon to be displayed in the KPIBox.',\n      options: ['danger', 'information', 'neutral', 'success', 'warning'],\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {\n          summary: 'AlertSemanticType',\n          defaultValue: {summary: 'neutral'},\n        },\n      },\n    },\n    iconName: {\n      description: 'Name of the icon to be displayed in the KPIBox.',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {\n          summary: 'string',\n        },\n      },\n    },\n    iconSize: {\n      description: 'Size of the icon in the KPIBox.',\n      control: {\n        type: 'select',\n      },\n      options: ['small', 'medium'],\n      table: {\n        type: {\n          summary: 'IconSize',\n        },\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    iconType: {\n      description: 'Type of the icon (e.g., outline, solid, duotone).',\n      control: {\n        type: 'select',\n      },\n      options: ['regular', 'solid', 'duotone', 'brands'],\n      table: {\n        type: {\n          summary: 'IconType',\n        },\n        defaultValue: {summary: 'solid'},\n      },\n    },\n    onClick: {\n      description:\n        '**onClick** handler applied to the root element. When provided, the KPIBox is clickable, shows a pointer cursor, and is keyboard accessible.',\n      action: 'clicked',\n      table: {\n        type: {summary: '(e: React.MouseEvent<HTMLDivElement>) => void'},\n      },\n    },\n    classNames: {\n      description:\n        'Additional CSS classes to customize the appearance of the KPIBox.',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{wrapper?: string}',\n        },\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a KPIBox component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { KPIBox } from \"@spaced-out/ui-design-system/lib/components/KPIBox\";\n\\`\\`\\`\nThe KPIBox component is designed to display Key Performance\nIndicators (KPIs) with customizable content and icons.\nIt is commonly used in dashboard and reporting applications to highlight\nimportant metrics and data.\n\nOptional \\`onClick\\` makes the KPIBox clickable and keyboard accessible\n(role=\"button\", focusable via Tab, activated with Enter or Space).\n\n### Usage\n\n\\`\\`\\`jsx\n<KPIBox\n  semantic=\"neutral\"\n  topContent=\"Total Sales\"\n  middleContent=\"$1,234,567\"\n  bottomContent={(\n    <div className={css.bottomContent}>\n      <Icon size=\"small\" name=\"arrow-trend-up\" color=\"neutral\" />\n      <span>5% (500 total)</span>\n    </div>\n  )}\n  iconName=\"chart-bar\"\n  iconSize=\"medium\"\n  iconType=\"solid\"\n/>\n\\`\\`\\`\n\n### Clickable KPI\n\n\\`\\`\\`jsx\n<KPIBox\n  topContent=\"Total Sales\"\n  middleContent=\"$1,234,567\"\n  bottomContent=\"5% (500 total)\"\n  iconName=\"chart-bar\"\n  onClick={() => { /* handle click */ }}\n/>\n\\`\\`\\`\n\n\\`\\`\\`css\n.bottomContent {\n  display: flex;\n  gap: spaceXXSmall;\n  align-items: flex-start;\n}\n\\`\\`\\`\n\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/KPIBox/KPIBox',\n    },\n  },\n};\n\nexport const KPIStory = (args: KPIBoxProps) => (\n  <>\n    <SubTitleSmall>Customizable</SubTitleSmall>\n    <br />\n    <div className={css.container}>\n      <KPIBox {...args} />\n    </div>\n    <SubTitleSmall>Variations</SubTitleSmall>\n    <br />\n    <div className={css.container}>\n      <KPIBox\n        semantic=\"neutral\"\n        topContent=\"Total Sales\"\n        middleContent=\"$1,234,567\"\n        testId=\"kpi-box-variation-1\"\n      />\n\n      <KPIBox\n        semantic=\"neutral\"\n        topContent=\"Total Sales\"\n        middleContent=\"$1,234,567\"\n        bottomContent=\"5% (500 total)\"\n        testId=\"kpi-box-variation-2\"\n      />\n\n      <KPIBox\n        semantic=\"neutral\"\n        topContent=\"Total Sales\"\n        middleContent=\"$1,234,567\"\n        bottomContent={\n          <div className={css.bottomContent}>\n            <Icon size=\"small\" name=\"arrow-trend-up\" color=\"neutral\" />\n            <span>5% (500 total)</span>\n          </div>\n        }\n        testId=\"kpi-box-variation-3\"\n      />\n\n      <KPIBox\n        semantic=\"neutral\"\n        topContent=\"Total Sales\"\n        middleContent=\"$1,234,567\"\n        iconName=\"money-bill\"\n        testId=\"kpi-box-variation-4\"\n      />\n\n      <KPIBox\n        semantic=\"neutral\"\n        topContent=\"Total Sales\"\n        middleContent=\"$1,234,567\"\n        bottomContent=\"5% (500 total)\"\n        iconName=\"money-bill\"\n        testId=\"kpi-box-variation-5\"\n      />\n\n      <KPIBox\n        semantic=\"neutral\"\n        topContent=\"Total Sales\"\n        middleContent=\"$1,234,567\"\n        bottomContent={\n          <div className={css.bottomContent}>\n            <Icon size=\"small\" name=\"arrow-trend-up\" color=\"neutral\" />\n            <span>5% (500 total)</span>\n          </div>\n        }\n        iconName=\"money-bill\"\n        testId=\"kpi-box-variation-6\"\n      />\n    </div>\n    {/* Uncomment when we encourage having semantic KPI Boxes */}\n    {/* <SubTitleSmall>Semantics</SubTitleSmall>\n  <br />\n  <div className={css.container}>\n    <KPIBox\n      semantic=\"neutral\"\n      topContent=\"Total Sales\"\n      middleContent=\"$1,234,567\"\n      bottomContent={\n        <div className={css.bottomContent}>\n          <Icon size=\"small\" name=\"arrow-trend-up\" color=\"neutral\" />\n          <span>5% (500 total)</span>\n        </div>\n      }\n      iconName=\"money-bill\"\n    />\n\n    <KPIBox\n      semantic=\"information\"\n      topContent=\"Website Visits\"\n      middleContent=\"10,000\"\n      bottomContent={\n        <div className={css.bottomContent}>\n          <Icon size=\"small\" name=\"chart-mixed\" color=\"information\" />\n          <span>15% (1,500 total)</span>\n        </div>\n      }\n      iconName=\"globe\"\n    />\n\n    <KPIBox\n      semantic=\"warning\"\n      topContent=\"Pending Orders\"\n      middleContent=\"15\"\n      bottomContent={\n        <div className={css.bottomContent}>\n          <Icon size=\"small\" name=\"chart-area\" color=\"warning\" />\n          <span>20% (3,000 total)</span>\n        </div>\n      }\n      iconName=\"exclamation-triangle\"\n    />\n\n    <KPIBox\n      semantic=\"success\"\n      topContent=\"New Subscribers\"\n      middleContent=\"5,678\"\n      bottomContent={\n        <div className={css.bottomContent}>\n          <Icon size=\"small\" name=\"arrow-trend-up\" color=\"success\" />\n          <span>8% (800 total)</span>\n        </div>\n      }\n      iconName=\"user-plus\"\n    />\n\n    <KPIBox\n      semantic=\"danger\"\n      topContent=\"Critical Errors\"\n      middleContent=\"3\"\n      bottomContent={\n        <div className={css.bottomContent}>\n          <Icon size=\"small\" name=\"chart-line-down\" color=\"danger\" />\n          <span>12% (1,200 total)</span>\n        </div>\n      }\n      iconName=\"bug\"\n    />\n  </div> */}\n  </>\n);\n\nKPIStory.args = {\n  topContent: 'Total Users',\n  middleContent: '10,000',\n  bottomContent: (\n    <div className={css.bottomContent}>\n      <Icon size=\"small\" name=\"arrow-trend-up\" color=\"success\" />\n      <span>10% (1,000 total)</span>\n    </div>\n  ) as React.ReactElement<React.ComponentProps<'div'>>,\n  iconName: 'users',\n  iconType: 'duotone',\n  testId: 'kpi-box-story',\n};\nKPIStory.storyName = 'KPI';\n\nexport const ClickableStory = (args: KPIBoxProps) => {\n  const [clickCount, setClickCount] = React.useState(0);\n  return (\n    <>\n      <SubTitleSmall>Click or focus and press Enter/Space</SubTitleSmall>\n      <br />\n      <div className={css.container}>\n        <KPIBox\n          {...args}\n          onClick={(e) => {\n            args.onClick?.(e);\n            setClickCount((c) => c + 1);\n          }}\n        />\n      </div>\n      {clickCount > 0 && (\n        <SubTitleSmall>Clicked {clickCount} time(s)</SubTitleSmall>\n      )}\n    </>\n  );\n};\nClickableStory.args = {\n  topContent: 'Total Sales',\n  middleContent: '$1,234,567',\n  bottomContent: '5% (500 total)',\n  iconName: 'chart-bar',\n  iconType: 'solid',\n  testId: 'kpi-box-clickable-story',\n};\nClickableStory.storyName = 'Clickable';\n"
        },
        "css": {
          "path": "KPIBox.module.css",
          "content": "@value (\n  colorBackgroundTertiary,\n  colorFillPrimary,\n  colorFocusPrimary,\n  colorTextSecondary,\n  colorTextPrimary,\n  colorBorderSecondary\n) from '../../styles/variables/_color.css';\n@value (spaceXXSmall, spaceSmall, spaceLarge, spaceMedium) from '../../styles/variables/_space.css';\n@value (borderRadiusMedium, borderWidthNone, borderWidthTertiary) from '../../styles/variables/_border.css';\n@value (size60, size140, size252) from '../../styles/variables/_size.css';\n\n.wrapper {\n  display: flex;\n  composes: borderPrimary from '../../styles/border.module.css';\n  min-width: size252;\n  height: fit-content;\n  align-items: center;\n  gap: spaceSmall;\n  background-color: colorBackgroundTertiary;\n  border-radius: borderRadiusMedium;\n  padding: spaceLarge spaceMedium;\n}\n\n.clickable {\n  cursor: pointer;\n  outline: none;\n}\n\n.clickable:hover {\n  border-color: colorBorderSecondary;\n}\n\n.clickable:focus {\n  border-color: colorFillPrimary;\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n\n.textContainer {\n  display: flex;\n  flex-direction: column;\n  gap: spaceXXSmall;\n}\n\n.topFoldContent,\n.middleFoldContent,\n.bottomFoldContent {\n  display: flex;\n}\n\n.topFoldContent {\n  composes: formLabelSmall from '../../styles/typography.module.css';\n  color: colorTextSecondary;\n}\n\n.middleFoldContent {\n  composes: jumboSmall from '../../styles/typography.module.css';\n  color: colorTextPrimary;\n}\n\n.bottomFoldContent {\n  composes: bodySmall from '../../styles/typography.module.css';\n  color: colorTextSecondary;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/KPIBox/KPIBox';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "KPIBox.module.css",
        "KPIBox.stories.module.css",
        "KPIBox.stories.tsx",
        "KPIBox.tsx",
        "index.ts"
      ]
    },
    "LinearLoader": {
      "name": "LinearLoader",
      "path": "src/components/LinearLoader",
      "files": {
        "main": {
          "path": "LinearLoader.d.ts",
          "content": "import type { Flow } from 'flow-to-typescript-codemod';\nexport interface LinearLoaderProps {\n    value: number;\n    size?: 'large' | 'medium' | 'small';\n    className?: string;\n    indeterminate?: boolean;\n    testId?: string;\n}\nexport declare const LinearLoader: Flow.AbstractComponent<LinearLoaderProps, HTMLDivElement>;\n//# sourceMappingURL=LinearLoader.d.ts.map"
        },
        "story": {
          "path": "LinearLoader.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {Button} from 'src/components/Button';\nimport type {LinearLoaderProps} from 'src/components/LinearLoader/LinearLoader';\nimport {LinearLoader} from 'src/components/LinearLoader/LinearLoader';\n\nimport css from 'src/components/LinearLoader/LinearLoader.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Linear Loader',\n  component: LinearLoader,\n  argTypes: {\n    value: {\n      description: 'The value to be used to show the progress out of 100',\n      type: {required: true},\n      name: 'value',\n      table: {\n        type: {summary: 'number'},\n      },\n    },\n    className: {\n      description: 'External className to be applied on container',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    indeterminate: {\n      description: 'If **true**, the loader is animated infinitely',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    size: {\n      description:\n        'Linear Loader supports only three size variants namely small, medium and large. `small` < `medium` < `large`',\n      options: ['large', 'medium', 'small'],\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Linear Loader component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { LinearLoader } from \"@spaced-out/ui-design-system/lib/components/LinearLoader\";\n\\`\\`\\`\nDo wrap this component in a container with fixed width. This is fluid in width and will take the width of container.\nPass the new value prop as the progress out of 100 and the completed part will transition to new value with animation.\nFor **Circular Loader**\ncheck **<a href=\"../?path=/docs/components-circular-loader--docs\">here</a>**\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/LinearLoader/LinearLoader',\n    },\n  },\n};\n\nexport const LinearLoaderStory = (args: LinearLoaderProps) => {\n  const [value, setValue] = React.useState(args.value);\n  const increaseValue = (delta: number) => {\n    if (delta > 0) {\n      if (value + delta <= 100) {\n        setValue(value + delta);\n      } else {\n        setValue(100);\n      }\n    } else if (delta < 0) {\n      if (value + delta >= 0) {\n        setValue(value + delta);\n      } else {\n        setValue(0);\n      }\n    }\n  };\n\n  return (\n    <div className={css.storyContainer}>\n      <div className={css.loaderContainer}>\n        <LinearLoader {...args} value={value} />\n      </div>\n      <div className={css.buttonWrap}>\n        <Button\n          size=\"small\"\n          onClick={() => {\n            increaseValue(10);\n          }}\n        >\n          Click Me + 10{' '}\n        </Button>\n        <Button\n          size=\"small\"\n          onClick={() => {\n            increaseValue(-10);\n          }}\n        >\n          Click Me - 10{' '}\n        </Button>\n        <Button\n          size=\"small\"\n          onClick={() => {\n            increaseValue(100);\n          }}\n        >\n          Click Me 100{' '}\n        </Button>\n      </div>\n    </div>\n  );\n};\n\nLinearLoaderStory.args = {\n  value: 34,\n  size: 'medium',\n  testId: 'linear-loader-story',\n};\nLinearLoaderStory.storyName = 'Linear Loader';\n"
        },
        "css": {
          "path": "LinearLoader.module.css",
          "content": "@value (\n  borderRadiusSmall\n) from '../../styles/variables/_border.css';\n\n@value (colorFillPrimary, colorBorderPrimary) from '../../styles/variables/_color.css';\n\n@value (\n  size4,\n  size8,\n  size12,\n  sizeFluid\n) from '../../styles/variables/_size.css';\n\n@value (\n  motionDurationSlow,\n  motionDurationSlowest,\n  motionEaseInEaseOut\n) from '../../styles/variables/_motion.css';\n\n@value (\n  spaceNone,\n  spaceFluid\n) from '../../styles/variables/_space.css';\n\n.lineContainer {\n  position: relative;\n  display: flex;\n  justify-content: flex-start;\n  align-items: center;\n  width: sizeFluid;\n  background: colorBorderPrimary;\n  border-radius: borderRadiusSmall;\n}\n\n.large {\n  height: size12;\n}\n\n.medium {\n  height: size8;\n}\n\n.small {\n  height: size4;\n}\n\n.progressBar {\n  background: colorFillPrimary;\n  border-radius: borderRadiusSmall;\n  height: sizeFluid;\n  transition: motionDurationSlow;\n}\n\n.indeterminate {\n  position: absolute;\n\n  animation: infiniteProgressBar calc(motionDurationSlowest * 3)\n    motionEaseInEaseOut;\n  animation-iteration-count: infinite;\n  animation-fill-mode: both;\n}\n\n@keyframes infiniteProgressBar {\n  0% {\n    left: spaceNone;\n    width: spaceNone;\n  }\n  50% {\n    left: spaceNone;\n    width: spaceFluid;\n  }\n  100% {\n    left: spaceFluid;\n    width: spaceNone;\n  }\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export { LinearLoader } from '../../components/LinearLoader/LinearLoader';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "LinearLoader.module.css",
        "LinearLoader.stories.module.css",
        "LinearLoader.stories.tsx",
        "LinearLoader.tsx",
        "index.ts"
      ]
    },
    "Link": {
      "name": "Link",
      "path": "src/components/Link",
      "files": {
        "main": {
          "path": "Link.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { ColorTypes } from '../../types/typography';\nimport type { IconSize, IconType } from '../../components/Icon';\nexport declare const LINK_AS: Readonly<{\n    bodyLarge: \"bodyLarge\";\n    bodyMedium: \"bodyMedium\";\n    bodySmall: \"bodySmall\";\n    buttonTextExtraSmall: \"buttonTextExtraSmall\";\n    buttonTextMedium: \"buttonTextMedium\";\n    buttonTextSmall: \"buttonTextSmall\";\n    formInputMedium: \"formInputMedium\";\n    formInputSmall: \"formInputSmall\";\n    formLabelMedium: \"formLabelMedium\";\n    formLabelSmall: \"formLabelSmall\";\n    jumboMedium: \"jumboMedium\";\n    subTitleExtraSmall: \"subTitleExtraSmall\";\n    subTitleLarge: \"subTitleLarge\";\n    subTitleMedium: \"subTitleMedium\";\n    subTitleSmall: \"subTitleSmall\";\n    titleMedium: \"titleMedium\";\n}>;\nexport type LinkAs = (typeof LINK_AS)[keyof typeof LINK_AS];\nexport declare const ANCHOR_REL: Readonly<{\n    alternate: \"alternate\";\n    author: \"author\";\n    bookmark: \"bookmark\";\n    external: \"external\";\n    help: \"help\";\n    license: \"license\";\n    next: \"next\";\n    nofollow: \"nofollow\";\n    noopener: \"noopener\";\n    noreferrer: \"noreferrer\";\n    search: \"search\";\n    tag: \"tag\";\n}>;\nexport type AnchorRel = (typeof ANCHOR_REL)[keyof typeof ANCHOR_REL];\nexport declare const ANCHOR_TARGET: Readonly<{\n    _blank: \"_blank\";\n    _self: \"_self\";\n    _parent: \"_parent\";\n    _top: \"_top\";\n    framename: \"framename\";\n}>;\nexport type AnchorTarget = (typeof ANCHOR_TARGET)[keyof typeof ANCHOR_TARGET];\nexport interface BaseLinkProps extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'children' | 'onClick' | 'tabIndex' | 'disabled' | 'className' | 'as' | 'rel' | 'target' | 'iconLeftName' | 'iconLeftSize' | 'iconLeftType' | 'iconRightName' | 'iconRightSize' | 'iconRightType' | 'to' | 'href'> {\n    children: React.ReactNode;\n    onClick?: React.MouseEventHandler<HTMLAnchorElement>;\n    tabIndex?: number;\n    disabled?: boolean;\n    className?: string;\n    as?: LinkAs;\n    rel?: AnchorRel;\n    target?: AnchorTarget;\n    iconLeftName?: string;\n    iconLeftSize?: IconSize;\n    iconLeftType?: IconType;\n    iconRightName?: string;\n    iconRightSize?: IconSize;\n    iconRightType?: IconType;\n    testId?: string;\n    /**\n     * IMPORTANT: If you are using `to` make sure to provide link component from your router\n     * if you want to prevent full page reloads in a Single Page Application (SPA).\n     *\n     * Using `href` in anchor tags causes the browser to navigate to a new URL,\n     * resulting in a full page reload. However, in a Single Page Application (SPA), we aim to provide a seamless\n     * user experience without such reloads.\n     *\n     * To achieve client-side navigation and prevent page reloads, use client-side routing libraries\n     * (e.g., React Router) and their navigation components (e.g., <Link> or <a> with an onClick handler)\n     * to handle navigation within your SPA. These components work without triggering full page reloads\n     * and maintain the SPA's performance and user experience.\n     *\n     */\n    to?: string;\n    href?: string;\n}\nexport interface LinkProps extends Omit<BaseLinkProps, 'color' | 'underline' | 'linkComponent'> {\n    color?: ColorTypes;\n    underline?: boolean;\n    /**\n     * Provide your router's link component\n     *\n     * import {Link} from 'src/rerouter';\n     * import {Link as GenesisLink} from '@spaced-out/ui-design-system/lib/components/Link';\n     *\n     * <GenesisLink linkComponent={Link} to=\"/pages\" />\n     */\n    linkComponent?: Flow.AbstractComponent<BaseLinkProps, HTMLAnchorElement | null | undefined>;\n}\nexport declare const Link: Flow.AbstractComponent<LinkProps, HTMLAnchorElement | null | undefined>;\n//# sourceMappingURL=Link.d.ts.map"
        },
        "story": {
          "path": "Link.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {TEXT_COLORS} from 'src/types/typography';\n\nimport {ICON_SIZE, ICON_TYPE} from 'src/components/Icon';\nimport type {LinkProps} from 'src/components/Link';\nimport {\n  ANCHOR_REL,\n  ANCHOR_TARGET,\n  Link,\n  LINK_AS,\n} from 'src/components/Link/Link';\n\nimport css from 'src/components/Link/Link.stories.module.css';\n\n\nconst colorOptions: Array<unknown> = [...Object.values(TEXT_COLORS)];\nconst typographyOptions: Array<unknown> = [...Object.values(LINK_AS)];\nconst anchorRelOptions: Array<unknown> = [...Object.values(ANCHOR_REL)];\nconst anchorTargetOptions: Array<unknown> = [...Object.values(ANCHOR_TARGET)];\nconst iconSizeOptions: Array<unknown> = [...Object.values(ICON_SIZE)];\nconst iconTypeOptions: Array<unknown> = [...Object.values(ICON_TYPE)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Link',\n  component: Link,\n  argTypes: {\n    color: {\n      options: colorOptions,\n      description:\n        'Color of the anchor. Should be one of the predefined color string',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'clickable'},\n      },\n    },\n    iconLeftName: {\n      description:\n        'Left icon to be applied to the button, it internally uses the `Icon` component to render icons',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    iconLeftType: {\n      description:\n        'Type of Left Icon. Type represents 4 unique icon styles :- Solid, Regular, Duotone and Brands',\n      options: iconTypeOptions,\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'regular'},\n      },\n    },\n    iconLeftSize: {\n      description:\n        'Icon supports three size variants namely small and medium. `small` < `medium` < `large`. [Only available in `<IconBadge />`]',\n      options: iconSizeOptions,\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'small'},\n      },\n    },\n    iconRightName: {\n      description:\n        'Right icon to be applied to the button, it internally uses the `Icon` component to render icons',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    iconRightSize: {\n      description:\n        'Icon supports three size variants namely small and medium. `small` < `medium` < `large`. [Only available in `<IconBadge />`]',\n      options: iconSizeOptions,\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'small'},\n      },\n    },\n    iconRightType: {\n      description:\n        'Type of Right Icon. Type represents 4 unique icon styles :- Solid, Regular, Duotone and Brands',\n      options: iconTypeOptions,\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'regular'},\n      },\n    },\n    as: {\n      options: typographyOptions,\n      description:\n        'Typography of the anchor. Should be one of the predefined typography options',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'buttonTextExtraSmall'},\n      },\n    },\n    linkComponent: {\n      description: `\nCustom component to be used as the root element\n\n**IMPORTANT:** If you are using \\`to\\` make sure to provide link component from your router\nif you want to prevent full page reloads in a Single Page Application (SPA).\n`,\n      table: {\n        type: {summary: 'React.Component'},\n      },\n    },\n    rel: {\n      options: anchorRelOptions,\n      description:\n        'The rel attribute specifies the relationship between the current document and the linked document. Only used if the href attribute is present.',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n      },\n    },\n    target: {\n      options: anchorTargetOptions,\n      description:\n        'The target property sets or returns the value of the target attribute of a link. The target attribute specifies where to open the linked document.',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n      },\n    },\n    to: {\n      description:\n        'Link to anchor to. Use this when you pass a router\\'s Link component to the this',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    href: {\n      description:\n        'Link to anchor to. Don\\'t use this if you don\\'t want page reloads on route',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    onClick: {\n      description:\n        '**onClick** handler that is applied to the root `<a>` element',\n      action: 'clicked',\n      table: {\n        type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n      },\n    },\n    tabIndex: {\n      description: 'Tab index applied to input',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 0},\n      },\n    },\n    disabled: {\n      description: 'If **true**, the component is disabled',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    underline: {\n      description: 'Controls the default underline text decoration',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'true'},\n      },\n    },\n    children: {\n      description:\n        'Content to be displayed. If you are using react nodes here, this should only have inline elements since Link renders children inside `<a></a>`',\n      control: {\n        type: 'text',\n      },\n      type: {required: true},\n      table: {\n        type: {summary: 'React.Component | string'},\n      },\n    },\n    className: {\n      description: 'Provide an optional className to be applied to the wrapper',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {\n          summary: 'string',\n        },\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Link component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Link } from \"@spaced-out/ui-design-system/lib/components/Link\";\n\\`\\`\\`\nThe Link component enables developers to effortlessly customize anchor elements with their desired color schemes and typography.\nFurthermore, the Link component provides a simple and accessible way to implement hyperlinks in web pages.\nIt offers various accessibility features, such as keyboard navigation, focus states, and screen reader support.\n\nThe component uses \\`React.forwardRef\\` to pass the ref prop to the inner anchor element.\n\n**IMPORTANT**: If you are using \\`href\\` or \\`to\\` make sure to provide link component from your router\nif you want to prevent full page reloads in a Single Page Application (SPA).\n\nUsing \\`href\\` in anchor tags causes the browser to navigate to a new URL,\nresulting in a full page reload. However, in a Single Page Application (SPA), we aim to provide a seamless\nuser experience without such reloads.\n\nTo achieve client-side navigation and prevent page reloads, use client-side routing libraries\n(e.g., React Router) and their navigation components (e.g., <Link> or <a> with an onClick handler)\nto handle navigation within your SPA. These components work without triggering full page reloads\nand maintain the SPA's performance and user experience.\n\n**Usage**\n\n\\`\\`\\`jsx\nimport {Link} from '@spaced-out/ui-design-system/lib/components/Link';\n\n<Link onClick={routeHandler}>Go to Pages</Link>\n\\`\\`\\`\n\n\n**Usage with Routing Library**\n\nTo use the \\`Link\\` with a routing Library, you would need to pass the \\`linkComponent\\` prop to the \\`<Link>\\` component.\n\n\\`\\`\\`jsx\nimport {Link} from 'src/rerouter';\nimport {Link as GenesisLink} from '@spaced-out/ui-design-system/lib/components/Link';\n\n<GenesisLink linkComponent={Link} to=\"/pages\">Go to Pages</GenesisLink>\n\\`\\`\\`\n\nIt'll replace the rendered a tag with routing library's Link.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Link/Link',\n    },\n  },\n};\n\nexport const LinkStory = (args: LinkProps) => (\n  <div className={css.container}>\n    <Link {...args} />\n  </div>\n);\n\nLinkStory.args = {\n  children: 'Hello World!',\n  testId: 'link-story',\n};\n\nexport const WithLeftIconStory = (args: LinkProps) => (\n  <div className={css.container}>\n    <Link {...args} />\n  </div>\n);\n\nWithLeftIconStory.args = {\n  children: 'Hello World!',\n  iconLeftName: 'link',\n  testId: 'link-with-left-icon-story',\n};\n\nexport const WithRightIconStory = (args: LinkProps) => (\n  <div className={css.container}>\n    <Link {...args} />\n  </div>\n);\n\nWithRightIconStory.args = {\n  children: 'Hello World!',\n  iconRightName: 'arrow-up-right-from-square',\n  testId: 'link-with-right-icon-story',\n};\nLinkStory.storyName = 'Link';\nWithLeftIconStory.storyName = 'With Left Icon';\nWithRightIconStory.storyName = 'With Right Icon';\n"
        },
        "css": null,
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Link/Link';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "Link.stories.module.css",
        "Link.stories.tsx",
        "Link.tsx",
        "index.ts"
      ]
    },
    "Menu": {
      "name": "Menu",
      "path": "src/components/Menu",
      "files": {
        "main": {
          "path": "Menu.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport { FixedSizeList, VariableSizeList } from 'react-window';\nimport type { MenuClassNames, MenuLabelTooltip } from '../../types/menu';\nimport type { IconType } from '../../components/Icon/Icon';\ntype ClassNames = MenuClassNames;\ntype OptionClassNames = Readonly<{\n    wrapper?: string;\n}>;\nexport type Virtualization = Readonly<{\n    enable: boolean;\n    /**\n     * Height of an option row. A number applies to every row; pass a function\n     * for per-row heights (e.g. taller rows for options with descriptions).\n     * `index` is the position of the option in the filtered option list —\n     * group title rows are not counted.\n     */\n    itemHeight?: number | ((option: MenuOption, index: number) => number);\n    /**\n     * Height of a group title row when virtualizing `groupTitleOptions`.\n     * A number applies to every title; pass a function for per-title heights\n     * (e.g. taller custom title nodes).\n     */\n    groupTitleHeight?: number | ((groupTitle: React.ReactNode, groupIndex: number) => number);\n    /** Max height of the whole card in px, search/header/footer included; never below the first row. */\n    menuHeight?: number;\n}>;\n/**\n * Either react-window list Menu may render. Both expose the `scrollToItem`\n * used to keep the keyboard's active option mounted.\n */\ntype VirtualList = FixedSizeList | VariableSizeList;\nexport interface MenuOption {\n    key: string;\n    classNames?: OptionClassNames;\n    label?: string;\n    secondaryLabel?: string;\n    customComponent?: React.ReactNode;\n    iconLeft?: string;\n    iconLeftType?: IconType;\n    iconRight?: string;\n    iconRightType?: IconType;\n    disabled?: boolean;\n    optionSize?: MenuSizeTypes;\n    optionVariant?: MenuOptionsVariant;\n    keepMenuOpenOnOptionSelect?: boolean;\n    indeterminate?: boolean;\n    testId?: string;\n}\nexport interface BaseMenuProps {\n    onSelect?: (option: MenuOption, arg2?: React.SyntheticEvent<HTMLElement> | null | undefined) => unknown;\n    selectedOption?: MenuOption | null | undefined;\n    optionsVariant?: MenuOptionsVariant;\n    selectedKeys?: Array<string>;\n    classNames?: ClassNames;\n    size?: MenuSizeTypes;\n    width?: string;\n    menuDisabled?: boolean;\n    isFluid?: boolean;\n    /**\n     * Opt in to the accessibility behavior: keyboard navigation, the\n     * `listbox` / `option` roles and their states, focus management on open and\n     * close, and the scroll container moving onto the listbox.\n     *\n     * Off by default, and off is not a degraded mode — it is this component\n     * exactly as it behaved before any of it existed: no roles, no ARIA, no key\n     * handling, no focus moved, the card scrolling as it always did. Every prop\n     * below that exists to serve the accessible behavior (`onTabOut`,\n     * `onReturnFocusToInput`, `menuId`, `ariaLabelledBy`, `ariaLabel`,\n     * `initialFocusRef`, `activeOptionKey`, `externalKeyboardNav`,\n     * `onActiveOptionKeyChange`) is inert while this is unset.\n     *\n     * It is opt-in per call site so a surface can turn it on, verify it, and\n     * leave the rest of the app untouched — the behavior changes focus and DOM\n     * structure, and those are the things an app is most likely to have built\n     * around.\n     */\n    enableA11y?: boolean;\n    onTabOut?: () => unknown;\n    /**\n     * Combobox consumers only: return focus to the trigger input (menu stays open)\n     * when Tab/Shift+Tab moves off a header/footer control back toward the input.\n     * The input lives outside the menu DOM, so it is the centre of the tab order.\n     */\n    onReturnFocusToInput?: () => void;\n    allowSearch?: boolean;\n    resolveLabel?: (option: MenuOption) => string | React.ReactNode;\n    resolveSecondaryLabel?: (option: MenuOption) => string | React.ReactNode;\n    virtualization?: Virtualization;\n    header?: React.ReactNode;\n    footer?: React.ReactNode;\n    showResultText?: boolean;\n    staticLabels?: {\n        RESULT?: string;\n        RESULTS?: string;\n        SEARCH_PLACEHOLDER?: string;\n        /**\n         * Announced by a `Typeahead`'s live region while it is loading, and when a\n         * search returns nothing. Here rather than on `Typeahead` so every string a\n         * menu can speak is overridden in one place.\n         */\n        LOADING_RESULTS?: string;\n        NO_RESULTS?: string;\n    };\n    showLabelTooltip?: MenuLabelTooltip;\n    allowWrap?: boolean;\n    /**\n     * id applied to the option `listbox` — the element a trigger's `aria-controls`\n     * should reference — and the prefix for the per-option ids that\n     * `aria-activedescendant` points at. Falls back to a generated id. It is not\n     * on the outer card.\n     */\n    menuId?: string;\n    /**\n     * Accessible name for the popup, linked to the trigger that opens it.\n     */\n    ariaLabelledBy?: string;\n    /**\n     * Literal accessible name for the listbox, used only when `ariaLabelledBy` is\n     * not supplied. Defaults to `'Options'` so the listbox is never unnamed — pass\n     * something specific to the content wherever you can.\n     */\n    ariaLabel?: string;\n    /**\n     * Marks the Menu as a popup that should auto-focus on open. When provided,\n     * Menu moves focus to the search input (or the active option) once it mounts\n     * and writes that element into the ref. Omit it for inline Menus (and for\n     * combobox triggers using `externalKeyboardNav`) so focus is never stolen.\n     */\n    initialFocusRef?: React.RefObject<HTMLElement | null>;\n    /**\n     * Controlled active option, honoured only with `externalKeyboardNav`: the\n     * trigger outside the menu owns the highlight and reports it here. Without\n     * `externalKeyboardNav` Menu manages its own active option (the roving tab\n     * stop, or the search field's active descendant) and this prop is ignored.\n     */\n    activeOptionKey?: string | null;\n    /**\n     * When true the Menu is driven by an external combobox input (e.g. Dropdown /\n     * Typeahead): focus stays on that input, the Menu does not run its own\n     * keyboard navigation or move focus into itself, and `activeOptionKey` is a\n     * controlled prop reflecting the input's aria-activedescendant.\n     */\n    externalKeyboardNav?: boolean;\n    /** Report active-option changes when `externalKeyboardNav` is set. */\n    onActiveOptionKeyChange?: (key: string | null) => void;\n    testId?: string;\n}\nexport interface MenuOptionTypes {\n    options?: Array<MenuOption>;\n    composeOptions?: Array<Array<MenuOption>>;\n    groupTitleOptions?: Array<MenuGroupTitleOption>;\n}\nexport type MenuSizeTypes = 'medium' | 'small';\nexport type MenuOptionsVariant = 'checkbox' | 'radio' | 'normal';\nexport interface MenuGroupTitleOption {\n    groupTitle?: React.ReactNode;\n    options?: Array<MenuOption>;\n    showLineDivider?: boolean;\n}\nexport interface MenuProps extends BaseMenuProps, MenuOptionTypes {\n}\nexport interface RenderOptionProps extends Omit<MenuProps, 'searchText'> {\n    searchText?: string;\n    /** Handle on the virtual list, so Menu can scroll the active option into view. */\n    listRef?: React.RefCallback<VirtualList>;\n    /** Withhold the opening highlight until the user drives the menu themselves. */\n    suppressInitialHighlight?: boolean;\n    /** Whether the pointer is driving — drops the active option's tint. */\n    pointerDriving?: boolean;\n    /** Whether focus is inside the menu — a roving highlight is only drawn then. */\n    menuHasFocus?: boolean;\n}\n/**\n * Flatten the active option source (options | compose | groups) into one list.\n * Exported because a combobox trigger drives the highlight from outside Menu\n * and needs the same list Menu itself navigates — see `useMenuTrigger`.\n */\nexport declare const getFlatOptions: (props: MenuProps) => MenuOption[];\n/**\n * Key of the option that should own the roving tab stop when the menu opens:\n * the selected option if present, otherwise the first enabled option.\n */\nexport declare const getInitialActiveOptionKey: (props: MenuProps) => string | null;\nexport declare const Menu: Flow.AbstractComponent<MenuProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=Menu.d.ts.map"
        },
        "story": {
          "path": "Menu.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {difference, union} from 'lodash';\n\nimport {ClickAway} from 'src/utils/click-away';\nimport {getFilteredOptionsFromSearchText} from 'src/utils/menu';\n\nimport {Avatar} from 'src/components/Avatar';\nimport {Button, UnstyledButton} from 'src/components/Button';\nimport {Icon} from 'src/components/Icon';\nimport type {\n  MenuGroupTitleOption,\n  MenuOption,\n  MenuProps,\n} from 'src/components/Menu/Menu';\nimport {Menu} from 'src/components/Menu/Menu';\nimport {\n  useComboboxMenuTrigger,\n  useMenuTrigger,\n} from 'src/components/Menu/useMenuTrigger';\nimport {SearchInput} from 'src/components/SearchInput';\nimport {\n  ButtonTextMedium,\n  ButtonTextSmallUnderline,\n  FormLabelMedium,\n  FormLabelSmall,\n  SubTitleSmall,\n} from 'src/components/Text';\nimport {Tooltip} from 'src/components/Tooltip';\nimport {Truncate} from 'src/components/Truncate';\n\nimport css from 'src/components/Menu/Menu.stories.module.css';\n\n\nconst textOptions: MenuOption[] = [\n  {key: '1', label: 'Option one'},\n  {key: '2', label: 'Option two with some extra words to increase length'},\n  {\n    key: '3',\n    label:\n      'Option three with more content to demonstrate truncation and test three lines wrap.',\n  },\n  {\n    key: '4',\n    label:\n      'Option four very long option that would truncate and now it is even longer than before to ensure truncation happens',\n  },\n  {key: '5', label: 'Option five(disabled)', disabled: true},\n  {\n    key: '6',\n    label: 'Option six(disabled) very long option that would truncate',\n    disabled: true,\n  },\n  {key: '7', label: 'Option Seven'},\n  {key: '8', label: 'Option Eight'},\n  {key: '9', label: 'Option Nine'},\n  {key: '10', label: 'Option Ten'},\n  {key: '11', label: 'Option Eleven'},\n  {key: '12', label: 'Option Twelve'},\n  {key: '13', label: 'Option Thirteen'},\n];\n\nconst checkboxOptions: MenuOption[] = [\n  {key: '1', label: 'Option one', indeterminate: true},\n  {key: '2', label: 'Option two'},\n  {key: '3', label: 'Option three', indeterminate: true},\n  {\n    key: '4',\n    label: 'Option four very long option that would truncate',\n  },\n  {key: '5', label: 'Option five(disabled)', disabled: true},\n  {\n    key: '6',\n    label: 'Option six(disabled) very long option that would truncate',\n    disabled: true,\n  },\n  {key: '7', label: 'Option Seven'},\n];\n\nconst textOptionsWithSecondaryLabel: MenuOption[] = [\n  {key: '1', label: 'Option one', secondaryLabel: 'Sub Text'},\n  {key: '2', label: 'Option two', secondaryLabel: 'Sub Text'},\n  {key: '3', label: 'Option three', secondaryLabel: 'Sub Text'},\n  {\n    key: '4',\n    label: 'Option four very long option that would truncate',\n    secondaryLabel: 'Option four very long option that would truncate',\n  },\n  {\n    key: '5',\n    label: 'Option five(disabled)',\n    disabled: true,\n    secondaryLabel: 'Sub Text',\n  },\n  {\n    key: '6',\n    label: 'Option six(disabled) very long option that would truncate',\n    disabled: true,\n    secondaryLabel: 'Sub Text',\n  },\n  {key: '7', label: 'Option Seven', secondaryLabel: 'Sub Text'},\n  {key: '8', label: 'Option Eight', secondaryLabel: 'Sub Text'},\n  {key: '9', label: 'Option Nine', secondaryLabel: 'Sub Text'},\n];\n\nconst iconLeftOptions: MenuOption[] = [\n  {\n    key: '1',\n    label: 'Option one',\n    iconLeft: 'coffee',\n  },\n  {key: '2', label: 'Option two', iconLeft: 'user'},\n  {\n    key: '4',\n    label: 'Option four very long option that would truncate',\n    iconLeft: 'face-party',\n  },\n  {\n    key: '5',\n    label: 'Option five(disabled)',\n    disabled: true,\n    iconLeft: 'flag',\n  },\n  {\n    key: '6',\n    label: 'Option six(disabled) very long option that would truncate',\n    disabled: true,\n    iconLeft: 'camera',\n  },\n];\n\nconst coloredOptions: MenuOption[] = [\n  {\n    key: '1',\n    label: 'Edit',\n    iconLeft: 'pen',\n  },\n  {\n    key: '2',\n    label: 'Delete',\n    iconLeft: 'trash',\n    classNames: {wrapper: css.dangerText},\n  },\n];\n\nconst iconRightOptions: MenuOption[] = [\n  {key: '1', label: 'Option one', iconRight: 'coffee'},\n  {key: '2', label: 'Option two', iconRight: 'user'},\n  {\n    key: '4',\n    label: 'Option four very long option that would truncate',\n    iconRight: 'face-party',\n  },\n  {\n    key: '5',\n    label: 'Option five(disabled)',\n    disabled: true,\n    iconRight: 'flag',\n  },\n  {\n    key: '6',\n    label: 'Option six(disabled) very long option that would truncate',\n    disabled: true,\n    iconRight: 'camera',\n  },\n];\n\nconst iconLeftRightOptions: MenuOption[] = [\n  {key: '1', label: 'Option one', iconRight: 'coffee', iconLeft: 'coffee'},\n  {key: '2', label: 'Option two', iconRight: 'user', iconLeft: 'coffee'},\n  {\n    key: '4',\n    label: 'Option four very long option that would truncate',\n    iconRight: 'face-party',\n    iconLeft: 'coffee',\n  },\n  {\n    key: '5',\n    label: 'Option five(disabled)',\n    disabled: true,\n    iconRight: 'flag',\n    iconLeft: 'coffee',\n  },\n  {\n    key: '6',\n    label: 'Option six(disabled) very long option that would truncate',\n    disabled: true,\n    iconRight: 'camera',\n    iconLeft: 'coffee',\n  },\n];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Menu',\n  argTypes: {\n    enableA11y: {\n      description:\n        '**enableA11y** opts into the accessibility behavior: keyboard navigation, the `listbox` / `option` roles and their states, focus management on open and close, and the scroll container moving onto the listbox. Off by default, where the Menu behaves exactly as it did before any of that existed. Off here too, as everywhere: turn the control on to see the accessible behavior.',\n      control: {type: 'boolean'},\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    resolveLabel: {\n      description:\n        'A function that resolves the label for a MenuOption. This is useful when you want to customize the label of an option based on some condition',\n      table: {\n        type: {\n          summary: '(option: MenuOption) => string | React.Node',\n        },\n      },\n    },\n    resolveSecondaryLabel: {\n      description:\n        'A function that resolves the secondary label for a MenuOption. This is useful when you want to customize the secondary label of an option based on some condition',\n      table: {\n        type: {\n          summary: '(option: MenuOption) => string | React.Node',\n        },\n      },\n    },\n    onSelect: {\n      description:\n        '**onSelect** handler is triggered when there is a change in selected option',\n      action: 'clicked',\n      table: {\n        type: {\n          summary:\n            '(option: MenuOption, ?SyntheticEvent<HTMLElement>) => mixed',\n        },\n      },\n    },\n    onTabOut: {\n      description:\n        '**onTabOut** is called when Tab (or Shift+Tab) would take focus out of the menu entirely. Supplying it means the menu takes over that key: the default is prevented and the consumer is expected to close the menu and put focus somewhere sensible — normally back on the trigger. Omit it for an inline menu, so Tab simply moves on to the next thing on the page.',\n      table: {\n        type: {summary: '() => mixed'},\n      },\n      // Deliberately NOT an `action`: an injected spy is truthy, so the menu\n      // would take over Tab and then nothing would close it or move focus,\n      // making every inline story look like a keyboard trap.\n    },\n    onReturnFocusToInput: {\n      description:\n        'Combobox consumers only. Called when Tab/Shift+Tab moves off a header/footer control back toward the trigger input, which lives outside the menu DOM and is therefore the centre of the tab order. Return focus to it and keep the menu open. Omit it for menus whose input is inside the menu.',\n      table: {\n        type: {summary: '() => void'},\n      },\n    },\n    menuId: {\n      description:\n        'DOM id applied to the option `listbox`. Wire it to the trigger\\'s `aria-controls` and it is also the prefix for the per-option ids used by `aria-activedescendant`. Falls back to a generated id.',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    ariaLabelledBy: {\n      description:\n        'Id of the element that names the popup — normally the trigger, or the field label. `listbox` requires an accessible name, so supply this or `ariaLabel`.',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    ariaLabel: {\n      description:\n        'Literal accessible name for the listbox, used only when `ariaLabelledBy` is absent. Prefer naming it after the field rather than echoing a placeholder.',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    initialFocusRef: {\n      description:\n        'Marks the Menu as a popup that should take focus when it opens: focus moves to the search field, or the active option, and the resolved element is written back into the ref. Omit it for inline menus, and for combobox triggers using `externalKeyboardNav`, so focus is never stolen.',\n      table: {\n        type: {summary: 'RefObject<HTMLElement | null>'},\n      },\n    },\n    activeOptionKey: {\n      description:\n        'Key of the option that owns the roving tab stop, or — with `externalKeyboardNav` — the controlled active descendant.',\n      table: {\n        type: {summary: 'string | null'},\n      },\n    },\n    externalKeyboardNav: {\n      description:\n        'Set when an outside combobox input drives navigation (Dropdown / Typeahead): focus stays on that input, Menu does no option navigation of its own (Tab between its header, options and footer still works) and never moves focus into itself, and `activeOptionKey` becomes a controlled prop mirroring the input\\'s `aria-activedescendant`.',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    onActiveOptionKeyChange: {\n      description:\n        'Reports active-option changes back to the parent. Required when `externalKeyboardNav` is set, since the parent owns that state.',\n      table: {\n        type: {summary: '(key: string | null) => void'},\n      },\n    },\n    options: {\n      description: `list of Options to be displayed in the menu.\n      Menu component accepts options / composeOptions / groupTitleOptions whatever is available first and not all.`,\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: `Array<{\n          key?: string,\n          label: React.Node,\n          customComponent?: React.Node,\n          secondaryLabel?: React.Node,\n          iconLeft?: string,\n          iconLeftType?: IconType,\n          iconRight?: string,\n          iconRightType?: IconType,\n          disabled?: boolean,\n          optionSize?: MenuSizeTypes,\n          indeterminate?: boolean,\n        }>`,\n        },\n      },\n    },\n    composeOptions: {\n      description: `list of list of Options are grouped and displayed in the menu.\n        Menu component accepts options / composeOptions / groupTitleOptions whatever is available first and not all.`,\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: `Array<Array<{\n          key?: string,\n          label: React.Node,\n          customComponent?: React.Node,\n          secondaryLabel?: React.Node,\n          iconLeft?: string,\n          iconLeftType?: IconType,\n          iconRight?: string,\n          iconRightType?: IconType,\n          disabled?: boolean,\n          optionSize?: MenuSizeTypes,\n          indeterminate?: boolean,\n        }>>`,\n        },\n      },\n    },\n    groupTitleOptions: {\n      description: `List of Options are grouped with a title(each group contains a set of options) and displayed in the menu.\n        Menu component accepts options / composeOptions / groupTitleOptions whatever is available first and not all.`,\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: `Array<{\n          groupTitle?: React.Node,\n          options?: Array<MenuOption>\n        }>`,\n        },\n      },\n    },\n    selectedOption: {\n      description: `Used in cases where you want to pre-select an option as soon as the component renders.\n      Selection is triggered when the selected option exactly matches one of the passed option.\n      **Note:** This prop would be deprecated soon. Please use \\`selectedKeys\\` instead\n      `,\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: 'MenuOption'},\n      },\n    },\n    optionsVariant: {\n      description: 'Menu supports multiple options variant',\n      control: {\n        type: 'select',\n      },\n      options: ['checkbox', 'radio', 'normal'],\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'normal'},\n      },\n    },\n    selectedKeys: {\n      description:\n        'Selected keys corresponding to options. These options are shown as selected in UI',\n      control: {\n        type: 'array',\n      },\n      table: {\n        type: {summary: 'Array<string>'},\n      },\n    },\n    classNames: {\n      description:\n        'External classnames to be applied. Wrapper gets applied to Menu wrapper and option gets applied to each option in the menu.',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary:\n            '{wrapper?: string, option?: string, groupTitle?: string, optionTextContainer?: string, optionTextLabel?: string, header?: string, footer?: string}',\n        },\n      },\n    },\n    size: {\n      description:\n        'Menu supports only two size variants namely small and medium. `small` < `medium`',\n      control: {\n        type: 'radio',\n      },\n      options: ['small', 'medium'],\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    width: {\n      description:\n        'Manual width control. This overrides the default width considerations of Menu',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    menuDisabled: {\n      description: 'if **true**, the option is disabled',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    isFluid: {\n      description:\n        'if **true**, the component would take the width of the container it is placed in',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    allowSearch: {\n      description: `if **true**, the component would show a search input on top of menu.\n        This is a simple **static search**\n        which filter options by **matching search text to option label**`,\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    virtualization: {\n      description: `If **Enabled**, the options will only be rendered when they are within the component's viewport. **menuHeight** accepts numerical input, interpreted as pixel values. **itemHeight** accepts a number (same height for every option row) or a function \\`(option, index) => number\\` for per-row heights — \\`index\\` is the option's position in the filtered option list (group titles are not counted). **groupTitleHeight** sizes group title rows when virtualizing \\`groupTitleOptions\\`; it accepts a number or a function \\`(groupTitle, groupIndex) => number\\`.`,\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary:\n            '{enable: boolean, menuHeight?: number, itemHeight?: number | ((option, index) => number), groupTitleHeight?: number | ((groupTitle, groupIndex) => number)}',\n        },\n      },\n    },\n    header: {\n      description: 'Custom Header For the Menu',\n      table: {\n        type: {\n          summary: 'React.Node',\n        },\n      },\n    },\n    footer: {\n      description: 'Custom Header For the Menu',\n      table: {\n        type: {\n          summary: 'React.Node',\n        },\n      },\n    },\n    showResultText: {\n      description: `if **true**, shows result text below **search input**.\n      **Note:** For the result text to be displayed below the search input, please ensure that allowSearch is set to true.`,\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: true},\n      },\n    },\n    staticLabels: {\n      description:\n        'External labels to be assigned to static text displayed in the UI.',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{[key: string]: string}',\n        },\n        defaultValue: {\n          summary: `{RESULT: 'result', RESULTS: 'results', SEARCH_PLACEHOLDER: 'Search...'}`,\n        },\n      },\n    },\n    showLabelTooltip: {\n      description: 'Show Tooltip on the label of the menu option if truncated',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: 'MenuLabelTooltip'},\n      },\n    },\n    allowWrap: {\n      description:\n        'Allows the label to wrap up to 3 lines. If truncated, a tooltip will display up to 10 lines.',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Menu component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Menu } from \"@spaced-out/ui-design-system/lib/components/Menu\";\n\\`\\`\\`\n**Menu** is a list of choices on a temporary surface. It appears on interacts with a button, or other control. This is a standalone Menu component,\nin real world use cases Menu component would be used in conjunction with other component like Button, Input, Typeahead, etc. Each option in the Menu\ncomponent is implemented as an \\`UnstyledButton\\`.\n- The component also supports custom **header** as \\`React Component\\` and this is then passed in\nthe **<a href=\"../?path=/docs/components-menu--docs\">Menu</a>** Component.\n- The component also supports custom **footer** as \\`React Component\\` and this is then passed in\nthe **<a href=\"../?path=/docs/components-menu--docs\">Menu</a>** Component. This might be useful when you need\nto save some state in the parent component.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Menu/Menu',\n    },\n  },\n};\n\nexport const TextOnlyStory = (args: MenuProps) => <Menu {...args} />;\n\nTextOnlyStory.args = {\n  isFluid: false,\n  menuDisabled: false,\n  size: 'medium',\n  options: textOptions,\n  selectedKeys: ['2'],\n  testId: 'menu-text-only-story',\n};\nexport const TextWithTooltipStory = (args: MenuProps) => <Menu {...args} />;\n\nTextWithTooltipStory.args = {\n  isFluid: false,\n  menuDisabled: false,\n  size: 'medium',\n  options: textOptions,\n  selectedKeys: ['2'],\n  showLabelTooltip: {maxLines: 2},\n  testId: 'menu-text-with-tooltip-story',\n};\n\nexport const MenuWithWrapStory = (args: MenuProps) => {\n  const [selectedKeys, setSelectedKeys] = React.useState(\n    args.selectedKeys || [],\n  );\n  const selectKeys = (option: MenuOption) => {\n    setSelectedKeys([option.key]);\n  };\n\n  return <Menu {...args} selectedKeys={selectedKeys} onSelect={selectKeys} />;\n};\n\nMenuWithWrapStory.args = {\n  isFluid: false,\n  menuDisabled: false,\n  size: 'medium',\n  options: textOptions,\n  selectedKeys: ['2'],\n  allowWrap: true,\n  testId: 'menu-with-wrap-story',\n};\n\nexport const WithSearchStory = (args: MenuProps) => <Menu {...args} />;\n\nWithSearchStory.args = {\n  isFluid: false,\n  menuDisabled: false,\n  size: 'medium',\n  options: textOptions,\n  allowSearch: true,\n  testId: 'menu-with-search-story',\n};\n\nexport const TextAndIconLeftStory = (args: MenuProps) => <Menu {...args} />;\n\nTextAndIconLeftStory.args = {\n  isFluid: false,\n  menuDisabled: false,\n  size: 'medium',\n  options: iconLeftOptions,\n  selectedKeys: ['2'],\n  testId: 'menu-text-and-icon-left-story',\n};\n\n/**\n * To make one of the options colored, you can set the classNames wrapper property in the option object.\n * Eg:\n * You would need to set the color of the option and manage the hover, focus and active state yourself.\n * ### JS\n * ```\n * const coloredOptions: MenuOption[] = [\n *   {\n *     key: '1',\n *     label: 'Edit',\n *     iconLeft: 'coffee',\n *   },\n *   {\n *     key: '2',\n *     label: 'Delete',\n *     iconLeft: 'trash',\n *     classNames: { wrapper: css.dangerText },\n *   },\n * ];\n * ```\n * ### CSS\n * ```\n * .dangerText:hover,\n * .dangerText:active,\n * .dangerText:focus {\n *   color: colorTextDanger;\n * }\n * ```\n */\nexport const ColoredOptionStory = (args: MenuProps) => <Menu {...args} />;\n\nColoredOptionStory.args = {\n  isFluid: false,\n  menuDisabled: false,\n  size: 'medium',\n  options: coloredOptions,\n  testId: 'menu-colored-option-story',\n};\n\nexport const TextAndIconRightStory = (args: MenuProps) => <Menu {...args} />;\n\nTextAndIconRightStory.args = {\n  isFluid: false,\n  menuDisabled: false,\n  size: 'medium',\n  options: iconRightOptions,\n  selectedKeys: ['2'],\n  testId: 'menu-text-and-icon-right-story',\n};\n\nexport const TextAndDualIconStory = (args: MenuProps) => <Menu {...args} />;\n\nTextAndDualIconStory.args = {\n  isFluid: false,\n  menuDisabled: false,\n  size: 'medium',\n  options: iconLeftRightOptions,\n  selectedKeys: ['2'],\n  testId: 'menu-text-and-dual-icon-story',\n};\n\nexport const DualTextStory = (args: MenuProps) => <Menu {...args} />;\n\nDualTextStory.args = {\n  isFluid: false,\n  menuDisabled: false,\n  size: 'medium',\n  options: textOptionsWithSecondaryLabel,\n  selectedKeys: ['2'],\n  testId: 'menu-dual-text-story',\n};\n\nexport const WithResolversStory = (args: MenuProps) => {\n  const resolveLabel = (option: MenuOption) => (\n    <div className={css.customComponent}>\n      {parseInt(option.key) < 6 ? (\n        <Avatar\n          imageSrc={`https://cdn.sensehq.com/genesis/hashed/static/images/personas/${option.key}.png`}\n        />\n      ) : (\n        <Avatar iconName=\"user\" />\n      )}\n\n      <ButtonTextMedium className={css.text} color=\"secondary\">\n        <Truncate>{option.label}</Truncate>\n      </ButtonTextMedium>\n    </div>\n  );\n\n  return <Menu {...args} resolveLabel={resolveLabel} />;\n};\n\nWithResolversStory.args = {\n  isFluid: false,\n  menuDisabled: false,\n  size: 'medium',\n  options: textOptions,\n  testId: 'menu-with-resolvers-story',\n};\n\nconst composeMenuOptions: Array<Array<MenuOption>> = [\n  [\n    {\n      key: '1',\n      label: 'Option one',\n      secondaryLabel: 'Sub Text',\n      optionSize: 'small',\n    },\n    {\n      key: '2',\n      label: 'Option two',\n      secondaryLabel: 'Sub Text',\n      optionSize: 'small',\n    },\n    {\n      key: '3',\n      label: 'Option three',\n      secondaryLabel: 'Sub Text',\n      optionSize: 'small',\n    },\n  ],\n  [\n    {\n      iconLeft: 'coffee',\n      key: '4',\n      label: 'Option one',\n      optionSize: 'medium',\n    },\n  ],\n  [\n    {\n      iconLeft: 'coffee',\n      key: '5',\n      label: 'Option one',\n      optionSize: 'medium',\n    },\n  ],\n];\n\nexport const ComposeMenuStory = (args: MenuProps) => <Menu {...args} />;\n\nComposeMenuStory.args = {\n  isFluid: false,\n  menuDisabled: false,\n  size: 'medium',\n  composeOptions: composeMenuOptions,\n  selectedKeys: ['2'],\n  testId: 'menu-compose-story',\n};\n\nconst customComponentMenuOptions: Array<MenuOption> = [\n  {\n    key: '1',\n    customComponent: (\n      <div className={css.customComponent}>\n        <Avatar\n          color=\"blue\"\n          imageSrc=\"https://cdn.sensehq.com/genesis/hashed/static/images/personas/1.png\"\n          iconName=\"face-party\"\n          iconType=\"regular\"\n          size=\"medium\"\n        />\n        <ButtonTextMedium className={css.text}>Angelina White</ButtonTextMedium>\n      </div>\n    ),\n  },\n  {\n    key: '2',\n    customComponent: (\n      <div className={css.customComponent}>\n        <Avatar\n          imageSrc=\"https://cdn.sensehq.com/genesis/hashed/static/images/personas/4.png\"\n          color=\"green\"\n          size=\"medium\"\n          text=\"John\"\n        />\n        <ButtonTextMedium className={css.text}>John Smith</ButtonTextMedium>\n      </div>\n    ),\n  },\n  {\n    key: '3',\n\n    customComponent: (\n      <div className={css.customComponent}>\n        <Avatar\n          imageSrc=\"https://cdn.sensehq.com/genesis/hashed/static/images/personas/6.png\"\n          color=\"orange\"\n          size=\"medium\"\n          text=\"Jacobs Marley\"\n        />\n        <ButtonTextMedium className={css.text}>Sarah Parker</ButtonTextMedium>\n      </div>\n    ),\n  },\n];\n\nexport const CustomComponentMenuStory = (args: MenuProps) => <Menu {...args} />;\n\nCustomComponentMenuStory.args = {\n  isFluid: false,\n  menuDisabled: false,\n  classNames: {option: css.optionText},\n  size: 'medium',\n  options: customComponentMenuOptions,\n  selectedKeys: ['2'],\n  testId: 'menu-custom-component-story',\n};\n\nconst groupTitleComponentMenuOptions: Array<MenuGroupTitleOption> = [\n  {\n    groupTitle: (\n      <div className={css.titleWrapper}>\n        <FormLabelSmall color=\"tertiary\">Fast Food</FormLabelSmall>\n        <div className={css.infoContainer}>\n          <Tooltip title=\"Hello!\" elevation=\"menu\">\n            <Icon name=\"circle-info\" size=\"small\" color=\"tertiary\" />\n          </Tooltip>\n        </div>\n      </div>\n    ),\n    options: [\n      {\n        key: '1',\n        iconLeft: 'burger',\n        label: 'Burger',\n      },\n      {\n        key: '2',\n        iconLeft: 'pizza',\n        label: 'Pizza',\n      },\n      {\n        key: '3',\n        iconLeft: 'french-fries',\n        label: 'Fries',\n      },\n    ],\n  },\n  {\n    showLineDivider: true,\n    groupTitle: (\n      <div className={css.titleWrapper}>\n        <FormLabelSmall color=\"tertiary\">Fruits</FormLabelSmall>\n        <div className={css.infoContainer}>\n          <Tooltip title=\"Hello!\" elevation=\"menu\">\n            <Icon name=\"circle-info\" size=\"small\" color=\"tertiary\" />\n          </Tooltip>\n        </div>\n      </div>\n    ),\n    options: [\n      {\n        key: '7',\n        iconLeft: 'banana',\n        label: 'Banana',\n      },\n      {\n        key: '8',\n        iconLeft: 'pear',\n        label: 'Pear',\n      },\n      {\n        key: '9',\n        iconLeft: 'lemon',\n        label: 'Lemon',\n      },\n    ],\n  },\n];\n\nexport const GroupTitleMenuStory = (args: MenuProps) => (\n  <Menu {...args} classNames={{groupTitle: css.gpTitle}} />\n);\n\nGroupTitleMenuStory.args = {\n  isFluid: false,\n  menuDisabled: false,\n  classNames: {option: css.optionText},\n  size: 'medium',\n  groupTitleOptions: groupTitleComponentMenuOptions,\n  selectedKeys: ['2'],\n  testId: 'menu-group-title-story',\n};\n\nexport const VirtualizedGroupTitleMenuStory = (args: MenuProps) => (\n  <Menu {...args} classNames={{groupTitle: css.gpTitle}} />\n);\n\nVirtualizedGroupTitleMenuStory.args = {\n  isFluid: false,\n  menuDisabled: false,\n  classNames: {option: css.optionText},\n  size: 'medium',\n  allowSearch: true,\n  groupTitleOptions: Array.from({length: 20}, (_, groupIdx) => ({\n    groupTitle: `Group ${groupIdx + 1}`,\n    options: Array.from({length: 25}, (_, optionIdx) => ({\n      key: `${groupIdx}-${optionIdx}`,\n      label: `Group ${groupIdx + 1} option ${optionIdx + 1}`,\n      // every 5th option carries a description, so it needs a taller row\n      ...(optionIdx % 5 === 0\n        ? {secondaryLabel: 'Option with a description'}\n        : {}),\n    })),\n  })),\n  virtualization: {\n    enable: true,\n    // size rows from the option itself, not its index\n    itemHeight: (option: MenuOption) => (option.secondaryLabel ? 56 : 36),\n    groupTitleHeight: 32,\n    menuHeight: 320,\n  },\n  selectedKeys: ['0-1'],\n  testId: 'menu-virtualized-group-title-story',\n};\n\nexport const VirtualizedCustomGroupTitleMenuStory = (args: MenuProps) => (\n  <Menu {...args} classNames={{groupTitle: css.gpTitle}} />\n);\n\nVirtualizedCustomGroupTitleMenuStory.args = {\n  isFluid: false,\n  menuDisabled: false,\n  classNames: {option: css.optionText},\n  size: 'medium',\n  allowSearch: true,\n  groupTitleOptions: Array.from({length: 10}, (_, groupIdx) => ({\n    // every other group has a two-line custom title node\n    groupTitle:\n      groupIdx % 2 === 0 ? (\n        <div>\n          <div>Group {groupIdx + 1}</div>\n          <div style={{fontSize: '11px', fontWeight: 'normal'}}>\n            Two-line custom header\n          </div>\n        </div>\n      ) : (\n        `Group ${groupIdx + 1}`\n      ),\n    options: Array.from({length: 15}, (_, optionIdx) => ({\n      key: `${groupIdx}-${optionIdx}`,\n      label: `Group ${groupIdx + 1} option ${optionIdx + 1}`,\n    })),\n  })),\n  virtualization: {\n    enable: true,\n    itemHeight: 36,\n    // tall rows for the two-line custom titles, default for the rest\n    groupTitleHeight: (_groupTitle: React.ReactNode, groupIndex: number) =>\n      groupIndex % 2 === 0 ? 56 : 32,\n    menuHeight: 320,\n  },\n  testId: 'menu-virtualized-custom-group-title-story',\n};\n\n/*\n * Roving focus over a virtualized list: `allowSearch` is off, so the options\n * themselves own focus rather than a search field, and arrow keys / Home / End\n * / type-ahead move real DOM focus between rows that mount and unmount as the\n * list scrolls. Kept as its own story because that pairing is what breaks when\n * a virtualized row is re-created underneath the focused element.\n */\nexport const VirtualizedRovingFocusMenuStory = (args: MenuProps) => (\n  <Menu {...args} classNames={{groupTitle: css.gpTitle}} />\n);\n\nVirtualizedRovingFocusMenuStory.args = {\n  // This story exists to demonstrate the accessible behavior, so it opts in.\n  enableA11y: true,\n  isFluid: false,\n  menuDisabled: false,\n  classNames: {option: css.optionText},\n  size: 'medium',\n  allowSearch: false,\n  groupTitleOptions: Array.from({length: 20}, (_, groupIdx) => ({\n    groupTitle: `Group ${groupIdx + 1}`,\n    options: Array.from({length: 25}, (_, optionIdx) => ({\n      key: `${groupIdx}-${optionIdx}`,\n      label: `Group ${groupIdx + 1} option ${optionIdx + 1}`,\n    })),\n  })),\n  virtualization: {\n    enable: true,\n    itemHeight: 36,\n    groupTitleHeight: 32,\n    menuHeight: 320,\n  },\n  selectedKeys: ['0-1'],\n  testId: 'menu-virtualized-roving-focus-story',\n};\n\nexport const VirtualizedVariableHeightMenuStory = (args: MenuProps) => (\n  <Menu {...args} />\n);\n\nVirtualizedVariableHeightMenuStory.args = {\n  isFluid: false,\n  menuDisabled: false,\n  classNames: {option: css.optionText},\n  size: 'medium',\n  allowSearch: true,\n  options: Array.from({length: 200}, (_, optionIdx) => ({\n    key: `${optionIdx}`,\n    label: `Option ${optionIdx + 1}`,\n    ...(optionIdx % 4 === 0\n      ? {secondaryLabel: 'Option with a description'}\n      : {}),\n  })),\n  virtualization: {\n    enable: true,\n    itemHeight: (option: MenuOption) => (option.secondaryLabel ? 56 : 36),\n    menuHeight: 320,\n  },\n  selectedKeys: ['1'],\n  testId: 'menu-virtualized-variable-height-story',\n};\n\n/*\n * Bulk actions over a filtered checkbox list.\n *\n * The actions live in the menu `header`, NOT in a group title: a group title is\n * rendered inside the `role=\"listbox\"`, which may only own `option` and `group`\n * children, so interactive controls in there are invalid (axe reports\n * `aria-required-children`, and AT announces a button where it expects an\n * option). The header sits outside the listbox, which is where controls that\n * act ON the list belong. The label naming the list is handed to Menu as\n * `ariaLabelledBy`, so the listbox is named \"Values (n)\" rather than the\n * generic default.\n */\nconst GroupTitleActionMenu = (args: MenuProps) => {\n  const valuesLabelId = 'menu-group-title-action-values';\n  const [searchText, setSearchText] = React.useState<string>('');\n  const [selectedKeys, setSelectedKeys] = React.useState(\n    args.selectedKeys || [],\n  );\n  const optionsFiltered = getFilteredOptionsFromSearchText(\n    textOptions,\n    searchText,\n  );\n  const optionsFilteredKeys = optionsFiltered\n    .filter(({disabled}) => !disabled)\n    .map(({key}) => key);\n\n  React.useEffect(() => {\n    setSelectedKeys(args.selectedKeys || []);\n  }, [args.selectedKeys]);\n\n  const selectKeys = (option: MenuOption) => {\n    if (selectedKeys.includes(option.key)) {\n      setSelectedKeys(difference(selectedKeys, [option.key]));\n    } else {\n      setSelectedKeys(union(selectedKeys, [option.key]));\n    }\n  };\n\n  const selectAllKeys: React.MouseEventHandler<HTMLButtonElement> = () => {\n    setSelectedKeys(union(selectedKeys, optionsFilteredKeys));\n  };\n\n  const clearSelectedKeys: React.MouseEventHandler<HTMLButtonElement> = () => {\n    setSelectedKeys(difference(selectedKeys, optionsFilteredKeys));\n  };\n\n  return (\n    <Menu\n      {...args}\n      optionsVariant=\"checkbox\"\n      selectedKeys={selectedKeys}\n      onSelect={selectKeys}\n      ariaLabelledBy={valuesLabelId}\n      classNames={{\n        header: css.groupTitleActionHeader,\n      }}\n      header={\n        <>\n          <SearchInput\n            value={searchText}\n            onChange={(e) => setSearchText(e.target.value)}\n            onClear={() => setSearchText('')}\n            size={args.size}\n          />\n          <div className={css.groupTitleActionRow}>\n            <span id={valuesLabelId}>\n              <FormLabelMedium color=\"tertiary\">\n                {`Values (${optionsFiltered.length})`}\n              </FormLabelMedium>\n            </span>\n            <div className={css.groupTitleActions}>\n              <UnstyledButton onClick={clearSelectedKeys}>\n                <ButtonTextSmallUnderline className={css.groupTitleAction}>\n                  Clear\n                </ButtonTextSmallUnderline>\n              </UnstyledButton>\n              <UnstyledButton onClick={selectAllKeys}>\n                <ButtonTextSmallUnderline\n                  color=\"clickable\"\n                  className={css.groupTitleAction}\n                >\n                  Select All\n                </ButtonTextSmallUnderline>\n              </UnstyledButton>\n            </div>\n          </div>\n        </>\n      }\n      options={optionsFiltered}\n    />\n  );\n};\n\nexport const GroupTitleActionMenuStory = (args: MenuProps) => (\n  <GroupTitleActionMenu {...args} />\n);\n\nGroupTitleActionMenuStory.args = {\n  isFluid: false,\n  menuDisabled: false,\n  classNames: {option: css.optionText},\n  size: 'medium',\n  selectedKeys: ['2'],\n  testId: 'menu-group-title-action-story',\n};\n\nexport const CheckboxMenuStory = (args: MenuProps) => {\n  const [selectedKeys, setSelectedKeys] = React.useState(\n    args.selectedKeys || [],\n  );\n\n  React.useEffect(() => {\n    setSelectedKeys(args.selectedKeys || []);\n  }, [args.selectedKeys]);\n\n  const selectKeys = (option: MenuOption) => {\n    if (selectedKeys.includes(option.key)) {\n      setSelectedKeys(selectedKeys.filter((item) => item !== option.key));\n    } else {\n      setSelectedKeys([...selectedKeys, option.key]);\n    }\n  };\n\n  return <Menu {...args} selectedKeys={selectedKeys} onSelect={selectKeys} />;\n};\n\nCheckboxMenuStory.args = {\n  isFluid: false,\n  menuDisabled: false,\n  classNames: {option: css.optionText},\n  size: 'medium',\n  options: checkboxOptions,\n  optionsVariant: 'checkbox',\n  selectedKeys: ['1', '4'],\n  testId: 'menu-checkbox-story',\n};\n\nexport const RadioMenuStory = (args: MenuProps) => {\n  const [selectedKeys, setSelectedKeys] = React.useState(\n    args.selectedKeys || [],\n  );\n\n  React.useEffect(() => {\n    setSelectedKeys(args.selectedKeys || []);\n  }, [args.selectedKeys]);\n\n  const selectKeys = (option: MenuOption) => {\n    setSelectedKeys([option.key]);\n  };\n\n  return <Menu {...args} selectedKeys={selectedKeys} onSelect={selectKeys} />;\n};\n\nRadioMenuStory.args = {\n  isFluid: false,\n  menuDisabled: false,\n  classNames: {option: css.optionText},\n  size: 'medium',\n  options: textOptions,\n  optionsVariant: 'radio',\n  selectedKeys: ['1'],\n  testId: 'menu-radio-story',\n};\n\nexport const MenuHeader = () => (\n  <div className={css.headerComponent}>\n    <SubTitleSmall>Menu Header</SubTitleSmall>\n  </div>\n);\n\nexport const MenuFooter = ({\n  onSave,\n  onCancel,\n}: {\n  onSave?: () => void;\n  onCancel?: () => void;\n}) => (\n  <div className={css.footerComponent}>\n    <Button size=\"small\" type=\"ghost\" onClick={onCancel}>\n      Cancel\n    </Button>\n    <Button size=\"small\" type=\"secondary\" onClick={onSave}>\n      Save\n    </Button>\n  </div>\n);\n\nexport const WithHeaderStory = (args: MenuProps) => (\n  <Menu {...args} header={<MenuHeader />} />\n);\n\nWithHeaderStory.args = {\n  isFluid: false,\n  menuDisabled: false,\n  size: 'small',\n  options: textOptions,\n  selectedKeys: ['2'],\n  testId: 'menu-with-header-story',\n};\n\nexport const WithFooterStory = (args: MenuProps) => (\n  <Menu {...args} footer={<MenuFooter />} />\n);\n\nWithFooterStory.args = {\n  isFluid: false,\n  menuDisabled: false,\n  size: 'small',\n  options: textOptions,\n  selectedKeys: ['2'],\n  testId: 'menu-with-footer-story',\n};\n\nexport const WithHeaderAndFooterStory = (args: MenuProps) => {\n  const [selectedKeys, setSelectedKeys] = React.useState(\n    args.selectedKeys || [],\n  );\n\n  React.useEffect(() => {\n    setSelectedKeys(args.selectedKeys || []);\n  }, [args.selectedKeys]);\n\n  const selectKeys = (option: MenuOption) => {\n    if (selectedKeys.includes(option.key)) {\n      setSelectedKeys(selectedKeys.filter((item) => item !== option.key));\n    } else {\n      setSelectedKeys([...selectedKeys, option.key]);\n    }\n  };\n\n  return (\n    <Menu\n      {...args}\n      selectedKeys={selectedKeys}\n      onSelect={selectKeys}\n      header={<MenuHeader />}\n      footer={<MenuFooter />}\n    />\n  );\n};\n\nWithHeaderAndFooterStory.args = {\n  isFluid: false,\n  menuDisabled: false,\n  classNames: {option: css.optionText},\n  options: textOptions,\n  optionsVariant: 'checkbox',\n  selectedKeys: ['1', '4'],\n  testId: 'menu-with-header-and-footer-story',\n};\n/*\n * The two trigger hooks, wired the way a consumer would wire them. These are the\n * only stories that mount `useMenuTrigger` / `useComboboxMenuTrigger` directly,\n * so a consumer-side change to either shows up here first: the trigger's ARIA\n * before and after opening, ArrowDown opening the popup, focus moving in (or\n * staying on the input), and Tab/Escape closing it and returning focus.\n */\nconst ButtonTriggerMenu = (args: MenuProps) => {\n  // A trigger that already has an id of its own: hand it to the hook rather\n  // than setting it on the element as well, and the hook keeps it — a generated\n  // one would break whatever the consumer points at it — and names the listbox\n  // through it unless `ariaLabel` says otherwise. Setting it in both places\n  // would be a duplicate prop, which is what `getTriggerProps` returning the\n  // resolved id exists to avoid.\n  const menuTrigger = useMenuTrigger({id: 'menu-trigger-demo'});\n  return (\n    <ClickAway restoreFocusOnClose>\n      {({isOpen, onOpen, clickAway, boundaryRef, triggerRef}) => (\n        <div className={css.triggerDemo}>\n          <Button\n            ref={triggerRef as React.RefObject<HTMLButtonElement>}\n            {...menuTrigger.getTriggerProps({isOpen, onOpen})}\n            onClick={(e) => {\n              e.stopPropagation();\n              onOpen();\n            }}\n          >\n            Actions\n          </Button>\n          {isOpen && (\n            <div\n              ref={boundaryRef as React.RefObject<HTMLDivElement>}\n              className={css.triggerDemoPopup}\n            >\n              <Menu\n                {...args}\n                {...menuTrigger.menuProps}\n                onSelect={() => clickAway()}\n                onTabOut={clickAway}\n              />\n            </div>\n          )}\n        </div>\n      )}\n    </ClickAway>\n  );\n};\n\nexport const WithButtonTriggerStory = (args: MenuProps) => (\n  <ButtonTriggerMenu {...args} />\n);\n\nWithButtonTriggerStory.args = {\n  // This story exists to demonstrate the accessible behavior, so it opts in.\n  enableA11y: true,\n  isFluid: false,\n  menuDisabled: false,\n  classNames: {option: css.optionText},\n  size: 'medium',\n  options: textOptions,\n  selectedKeys: ['2'],\n  header: <MenuHeader />,\n  footer: <MenuFooter />,\n  testId: 'menu-with-button-trigger-story',\n};\n\nconst ComboboxTriggerMenu = (args: MenuProps) => {\n  const menuRef = React.useRef<HTMLDivElement>(null);\n  const triggerWrapRef = React.useRef<HTMLDivElement>(null);\n  const clickAwayFnRef = React.useRef<(() => void) | null>(null);\n  const [isMenuOpen, setIsMenuOpen] = React.useState(false);\n  const [selected, setSelected] = React.useState<MenuOption | null>(\n    args.selectedOption ?? null,\n  );\n  const menu: MenuProps = {...args, selectedOption: selected};\n  const focusInput = () =>\n    triggerWrapRef.current?.querySelector('input')?.focus();\n  const select = (option: MenuOption) => {\n    setSelected(option);\n    clickAwayFnRef.current?.();\n    focusInput();\n  };\n  const combobox = useComboboxMenuTrigger({\n    menu,\n    menuRef,\n    isOpen: isMenuOpen,\n    onSelectOption: select,\n    onClose: () => clickAwayFnRef.current?.(),\n    focusTrigger: focusInput,\n    triggerAriaLabel: 'Fruit',\n  });\n  return (\n    <ClickAway<HTMLDivElement, HTMLDivElement>\n      onChange={setIsMenuOpen}\n      restoreFocusOnClose\n    >\n      {({isOpen, onOpen, clickAway, boundaryRef, triggerRef}) => {\n        clickAwayFnRef.current = clickAway;\n        return (\n          <div className={css.triggerDemo}>\n            <div ref={triggerWrapRef} className={css.triggerDemoInput}>\n              <SearchInput\n                {...combobox.getTriggerProps({isOpen, onOpen})}\n                boxRef={triggerRef}\n                readOnly\n                value={selected?.label ?? ''}\n                placeholder=\"Select a fruit\"\n                onContainerClick={(e) => {\n                  e.stopPropagation();\n                  onOpen();\n                }}\n                onChange={() => undefined}\n              />\n            </div>\n            {isOpen && (\n              <div\n                ref={boundaryRef as React.RefObject<HTMLDivElement>}\n                className={css.triggerDemoPopup}\n              >\n                <Menu\n                  {...menu}\n                  ref={menuRef}\n                  {...combobox.menuProps}\n                  onSelect={select}\n                  onTabOut={clickAway}\n                />\n              </div>\n            )}\n          </div>\n        );\n      }}\n    </ClickAway>\n  );\n};\n\nexport const WithComboboxTriggerStory = (args: MenuProps) => (\n  <ComboboxTriggerMenu {...args} />\n);\n\nWithComboboxTriggerStory.args = {\n  // This story exists to demonstrate the accessible behavior, so it opts in.\n  enableA11y: true,\n  isFluid: false,\n  menuDisabled: false,\n  classNames: {option: css.optionText},\n  size: 'medium',\n  options: textOptions,\n  footer: <MenuFooter />,\n  testId: 'menu-with-combobox-trigger-story',\n};\n\nTextOnlyStory.storyName = 'Text Only';\nWithButtonTriggerStory.storyName = 'With Button Trigger (useMenuTrigger)';\nWithComboboxTriggerStory.storyName =\n  'With Combobox Trigger (useComboboxMenuTrigger)';\nTextWithTooltipStory.storyName = 'Text With Tooltip';\nMenuWithWrapStory.storyName = 'Menu With Wrap';\nWithSearchStory.storyName = 'With Search';\n/*\n * The same menu as `Text Only`, with the accessibility opt-in turned on, so the\n * two can be compared side by side.\n *\n * With `enableA11y` the options become a named `listbox` of `option`s, one of\n * them holds the roving tab stop, and the arrow keys, Home/End, PageUp/PageDown\n * and type-ahead drive it. The highlight is only drawn while focus is inside\n * the menu, because under roving focus the highlight IS the focus.\n *\n * Every other story here leaves the prop off, which is the default and is this\n * component exactly as it behaved before any of this existed. Flip the control\n * on any of them to see the difference.\n */\nexport const AccessibleMenuStory = (args: MenuProps) => <Menu {...args} />;\n\nAccessibleMenuStory.args = {\n  enableA11y: true,\n  isFluid: false,\n  menuDisabled: false,\n  size: 'medium',\n  options: textOptions,\n  selectedKeys: ['2'],\n  ariaLabel: 'Fruit',\n  testId: 'menu-accessible-story',\n};\n\n/*\n * The accessible menu with its own filter field. The field is a `searchbox`,\n * not a second combobox, and the list it filters is a focusable `listbox` that\n * reports the active option through `aria-activedescendant` — so the field\n * keeps the keys it needs while the arrow keys still move the highlight.\n */\nexport const AccessibleSearchMenuStory = (args: MenuProps) => (\n  <Menu {...args} />\n);\n\nAccessibleSearchMenuStory.args = {\n  enableA11y: true,\n  isFluid: false,\n  menuDisabled: false,\n  size: 'medium',\n  allowSearch: true,\n  options: textOptions,\n  selectedKeys: ['2'],\n  ariaLabel: 'Fruit',\n  testId: 'menu-accessible-search-story',\n};\n\nTextAndIconLeftStory.storyName = 'Text And Icon Left';\nColoredOptionStory.storyName = 'Colored Option';\nTextAndIconRightStory.storyName = 'Text And Icon Right';\nTextAndDualIconStory.storyName = 'Text And Dual Icon';\nDualTextStory.storyName = 'Dual Text';\nWithResolversStory.storyName = 'With Resolvers';\nComposeMenuStory.storyName = 'Compose Menu';\nCustomComponentMenuStory.storyName = 'Custom Component Menu';\nGroupTitleMenuStory.storyName = 'Group Title Menu';\nVirtualizedGroupTitleMenuStory.storyName = 'Virtualized Group Title Menu';\nVirtualizedCustomGroupTitleMenuStory.storyName =\n  'Virtualized Custom Group Title Menu';\nVirtualizedVariableHeightMenuStory.storyName =\n  'Virtualized Variable Height Menu';\nVirtualizedRovingFocusMenuStory.storyName =\n  'Virtualized Menu With Roving Focus';\nGroupTitleActionMenuStory.storyName = 'Group Title Action Menu';\nCheckboxMenuStory.storyName = 'Checkbox Menu';\nRadioMenuStory.storyName = 'Radio Menu';\nWithHeaderStory.storyName = 'With Header';\nWithFooterStory.storyName = 'With Footer';\nWithHeaderAndFooterStory.storyName = 'With Header And Footer';\nAccessibleMenuStory.storyName = 'Accessible (enableA11y)';\nAccessibleSearchMenuStory.storyName = 'Accessible With Search (enableA11y)';\n"
        },
        "css": {
          "path": "Menu.module.css",
          "content": "@value (\n  borderWidthPrimary,\n  borderWidthNone,\n  borderWidthTertiary,\n  borderRadiusMedium,\n  borderRadiusSmall\n) from '../../styles/variables/_border.css';\n\n@value (\n  colorBackgroundSecondary,\n  colorFillSecondary,\n  colorFillPrimary,\n  colorTextDisabled,\n  colorTextPrimary,\n  colorTextSecondary,\n  colorTextTertiary,\n  colorBackgroundTertiary,\n  colorFocusSecondary\n) from '../../styles/variables/_color.css';\n\n@value (\n  colorBorderPrimary\n) from '../../styles/variables/_color.css';\n\n@value (\n  size160,\n  size42,\n  size34,\n  size50,\n  size300,\n  size240,\n  size228,\n  size276,\n  sizeFluid\n) from '../../styles/variables/_size.css';\n\n@value (\n  spaceNone,\n  spaceSmall,\n  spaceXSmall,\n  spaceXXSmall,\n  spaceMedium\n) from '../../styles/variables/_space.css';\n\n@value (\n  elevationMenu,\n  elevationCard\n) from '../../styles/variables/_elevation.css';\n\n.menuCard {\n  position: relative;\n  composes: boxShadow2 from '../../styles/shadow.module.css';\n  composes: borderPrimary from '../../styles/border.module.css';\n  background-color: colorBackgroundTertiary;\n  display: flex;\n  flex-flow: column;\n  padding: spaceXSmall;\n  min-width: size160;\n  border-radius: borderRadiusMedium;\n  overflow: auto;\n  z-index: elevationMenu;\n}\n\n/*\n * The options carry their own scroll container, so the card must not scroll as\n * well — otherwise both would show a scrollbar. `hidden` also keeps a pinned\n * header / footer inside the border radius.\n */\n.menuCardA11y.menuCardTopPaddingZero,\n.menuCardA11y.menuCardBottomPaddingZero,\n.menuCardNoScroll {\n  overflow: hidden;\n}\n\n.menuCardTopPaddingZero {\n  padding-top: spaceNone;\n}\n\n.menuCardBottomPaddingZero {\n  padding-bottom: spaceNone;\n}\n\n/*\n * Scrolls the options only. A header / footer is a flex sibling of this element\n * rather than something sticky inside it, so the scrollbar spans just the option\n * list — it no longer runs the whole height of the card behind the bars — and no\n * option can be clipped under them. `min-height: 0` is what lets a flex item\n * actually shrink and scroll instead of growing to fit its content.\n */\n.optionsScroll {\n  display: flex;\n  flex-flow: column;\n  flex: 1 1 auto;\n  min-height: 0;\n  overflow-y: auto;\n}\n\n/*\n * Collapse a menu that renders nothing. `:empty` alone no longer suffices: the\n * card always holds the (possibly empty) role=\"listbox\" element so the trigger's\n * aria-controls resolves, so Menu also sets `.menuCardEmpty` explicitly.\n */\n.menuCard:empty,\n.menuCard.menuCardEmpty {\n  padding: spaceNone;\n  border: none;\n}\n\n.medium {\n  width: size300;\n  min-width: size300;\n  max-height: size276;\n}\n\n.mediumWithHeader,\n.mediumWithFooter {\n  max-height: calc(size276 + size50);\n}\n\n.mediumWithHeaderAndFooter {\n  max-height: calc(size276 + size50 + size50);\n}\n\n.small {\n  width: size240;\n  min-width: size240;\n  max-height: size228;\n}\n\n.smallWithHeader,\n.smallWithFooter {\n  max-height: calc(size228 + size50);\n}\n\n.smallWithHeaderAndFooter {\n  max-height: calc(size228 + size50 + size50);\n}\n\n.fluid {\n  width: sizeFluid;\n  min-width: size160;\n}\n\n.option {\n  composes: motionEaseInEaseOut from '../../styles/animation.module.css';\n  flex: 0 0 auto;\n  width: sizeFluid;\n  display: flex;\n  border-radius: borderRadiusSmall;\n  align-items: center;\n  cursor: pointer;\n  column-gap: spaceSmall;\n  color: colorTextSecondary;\n}\n\n.optionTextContainer {\n  display: flex;\n  flex-flow: column;\n  gap: spaceXXSmall;\n}\n\n.optionTextLabel,\n.optionTextSecondaryLabel {\n  display: flex;\n  flex-flow: column;\n  align-items: flex-start;\n  text-align: left;\n}\n\n.withIconLeft {\n  padding-left: spaceXSmall;\n}\n\n.withIconRight {\n  padding-right: spaceXSmall;\n}\n\n.icon {\n  color: inherit;\n}\n\n.rightIcon {\n  margin-left: auto;\n}\n\n.optionSmall {\n  composes: menuTextSmall from '../../styles/typography.module.css';\n  padding: spaceXSmall spaceSmall;\n}\n\n.optionMedium {\n  composes: menuTextMedium from '../../styles/typography.module.css';\n  padding: spaceSmall spaceSmall;\n}\n\n.optionTextSecondaryLabel {\n  composes: bodySmall from '../../styles/typography.module.css';\n  color: colorTextTertiary;\n}\n\n.option:hover,\n.option:active {\n  background: colorBackgroundSecondary;\n  color: colorTextPrimary;\n}\n\n.option:hover .optionTextSecondaryLabel {\n  color: colorTextSecondary;\n}\n\n.option:active .optionTextSecondaryLabel {\n  color: colorTextSecondary;\n}\n\n/*\n * These two suppress the browser's own focus ring, which a CLICK produces:\n * clicking an option focuses it, and `:focus-visible` deliberately does not\n * match pointer-driven focus, so without them a clicked option grows a native\n * outline. Unscoped, because that is true whether or not a consumer opted in.\n */\n.option:focus {\n  outline: none;\n  color: colorTextPrimary;\n}\n\n.option:focus-within {\n  outline: none;\n  color: colorTextPrimary;\n}\n\n.option:focus .optionTextSecondaryLabel {\n  color: colorTextSecondary;\n}\n\n/*\n * Selected value (committed), shown as a stronger fill than the active highlight.\n *\n * Deliberately no left accent bar: a 2px inset box-shadow gets tapered by the\n * option's 8px border-radius, so it renders as a small curved sliver at the edge\n * that reads as a stray focus artefact rather than an intentional indicator. The\n * checkbox / radio glyph carries the state in those variants, and forced-colors\n * mode below re-expresses it as a full outline, which the radius follows cleanly.\n */\n.option.selected {\n  background: colorFillSecondary;\n  outline: none;\n  color: colorTextPrimary;\n}\n\n/*\n * Focus ring — KEYBOARD ONLY. A focus indicator has to mean \"focus is here\", so\n * it must not appear under the mouse pointer:\n *\n * - `.activeRing` is set by Menu for the combobox modes (Dropdown / Typeahead),\n *   where DOM focus stays on the input and the active option is virtual. Menu\n *   withholds it when the highlight came from the pointer.\n * - `:focus-visible` covers the roving menus, which move real DOM focus. It is\n *   exactly the right selector here: arrow-key navigation calls .focus() after a\n *   key press so the ring shows, while hover-driven .focus() follows a pointer\n *   interaction so it does not.\n *\n * Declared after `.selected`, which sets no box-shadow of its own, so a selected\n * option that also has focus shows the ring without anything to fight over.\n */\n.option:focus-visible {\n  outline: none;\n  color: colorTextPrimary;\n  box-shadow: inset borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusSecondary;\n}\n\n/*\n * The opt-in's own indicators, scoped to it so a consumer who has not opted in\n * keeps exactly the option styling they had. `.active` is the highlight the\n * keyboard moves; `.activeRing` is the focus ring for the combobox modes, where\n * DOM focus stays on the input and `:focus-visible` can never match the option.\n */\n.menuCardA11y .option.active {\n  outline: none;\n  color: colorTextPrimary;\n  background: colorBackgroundSecondary;\n}\n\n.menuCardA11y .option.active .optionTextSecondaryLabel {\n  color: colorTextSecondary;\n}\n\n.menuCardA11y .option.activeRing {\n  outline: none;\n  color: colorTextPrimary;\n  box-shadow: inset borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusSecondary;\n}\n\n/*\n * Windows High Contrast / forced-colors mode drops box-shadow and flattens\n * background, so the bar + tint indicators above vanish. Re-express the active\n * highlight and selected state with system-color outlines (honored in HCM).\n */\n@media (forced-colors: active) {\n  .menuCardA11y .option:hover,\n  .menuCardA11y .option.active {\n    outline: borderWidthTertiary solid Highlight;\n    outline-offset: calc(-1 * borderWidthTertiary);\n  }\n\n  .menuCardA11y .option.selected {\n    outline: borderWidthTertiary solid SelectedItem;\n    outline-offset: calc(-1 * borderWidthTertiary);\n  }\n\n  /*\n   * Keyboard focus must stay distinguishable from BOTH the hover highlight and\n   * the selected state, and Highlight / SelectedItem commonly resolve to the same\n   * system color — so change the outline STYLE rather than add a third color.\n   * Declared last so a selected option that also has focus still shows it.\n   */\n  .menuCardA11y .option.activeRing,\n  .menuCardA11y .option:focus-visible {\n    outline: borderWidthTertiary dashed Highlight;\n    outline-offset: calc(-1 * borderWidthTertiary);\n  }\n}\n\n.disabled {\n  color: colorTextDisabled;\n  pointer-events: none;\n}\n\n.disabled .optionTextSecondaryLabel {\n  color: colorTextDisabled;\n}\n\n.menuDivider {\n  padding-top: spaceXSmall;\n  padding-bottom: spaceXSmall;\n}\n\n.menuDivider:not(:first-of-type) {\n  border-top: borderWidthPrimary solid colorBorderPrimary;\n  padding-top: spaceXSmall;\n  padding-bottom: spaceXSmall;\n}\n\n.hideDivider {\n  border-top: none;\n}\n\n.menuDivider:first-child {\n  padding-top: spaceNone;\n}\n\n.menuDivider:last-child {\n  padding-bottom: spaceNone;\n}\n\n.optionsWrapper {\n  display: flex;\n  flex-flow: column;\n}\n\n/*\n * Wraps only the option list so the listbox role contains option children\n * exclusively (search/header/footer stay outside it). display:contents keeps\n * the existing flex layout of .menuCard unchanged.\n */\n.optionsListbox {\n  display: contents;\n}\n\n/*\n * The listbox as the element that actually scrolls. Under virtualization\n * react-window's own scroll box carries the role (see ListboxOuter); this is the\n * same arrangement for a plain option list, and it matters beyond tidiness: the\n * options are not focusable themselves whenever a combobox trigger drives the\n * menu, so a\n * scroll container that is NOT the combobox's popup reads as an unreachable\n * scroll area (axe `scrollable-region-focusable`). Making the listbox the\n * scroller means the region IS the popup, which that rule exempts.\n */\n.optionsListboxScroll {\n  display: flex;\n  flex-flow: column;\n  flex: 1 1 auto;\n  min-height: 0;\n  overflow-y: auto;\n}\n\n/*\n * The listbox takes a tab stop only where the menu owns its filter field, and in\n * that shape it reports the cursor through `aria-activedescendant` — the ring is\n * drawn on the active OPTION, which is what APG prescribes for that pattern.\n * Leaving the browser's own ring on the container as well shows two focus\n * indicators at once, the outer one around a box the user cannot move, which\n * reads as a rendering fault rather than as focus. Applied to whichever element\n * holds the role: this one, or react-window's scroll box when virtualized.\n */\n.listboxFocusContainer:focus,\n.listboxFocusContainer:focus-visible {\n  outline: none;\n}\n\n/*\n * role=\"group\" wrapper around each titled option group. display:contents keeps\n * the existing flex layout (title + options) unchanged.\n */\n.optionGroup {\n  display: contents;\n}\n\n.groupTitleWrapper {\n  composes: formLabelSmall from '../../styles/typography.module.css';\n  display: flex;\n  padding-bottom: spaceXSmall;\n  padding-left: spaceSmall;\n  padding-right: calc(spaceXSmall / 2);\n  color: colorTextTertiary;\n  padding-top: spaceSmall;\n}\n\n.filterOptionsResultText {\n  margin-top: calc(spaceXSmall * 2);\n  margin-bottom: spaceXSmall;\n  margin-left: spaceSmall;\n}\n\n/*\n * Pinned by living OUTSIDE the options scroll container rather than by sticking\n * inside it, so it never has the option list's scrollbar running behind it and\n * never has an option tucked under it. `relative` positions the divider below.\n */\n.menuHeader {\n  position: sticky;\n  background-color: colorBackgroundTertiary;\n  padding: spaceXSmall spaceNone;\n  top: spaceNone;\n  margin-bottom: spaceXSmall;\n  z-index: calc(elevationCard/4);\n  min-height: size50;\n  max-height: size50;\n}\n\n/*\n * With the opt-in the options carry their own scroll container, so the bars are\n * pinned by living OUTSIDE it rather than by sticking inside it: the option\n * list's scrollbar never runs behind them and no option is ever tucked under\n * them. `relative` positions the divider below.\n */\n.menuCardA11y .menuHeader,\n.menuCardA11y .menuFooter {\n  position: relative;\n  flex: 0 0 auto;\n  top: auto;\n  bottom: auto;\n}\n\n.menuHeader::after {\n  content: '';\n  position: absolute;\n  left: calc(spaceXSmall * -1);\n  right: calc(spaceXSmall * -1);\n  bottom: spaceNone;\n  border-bottom: borderWidthPrimary solid colorBorderPrimary;\n}\n\n/* As `.menuHeader`, pinned by sitting outside the options scroll container. */\n.menuFooter {\n  position: sticky;\n  background-color: colorBackgroundTertiary;\n  padding: spaceXSmall spaceNone;\n  bottom: spaceNone;\n  margin-top: spaceXSmall;\n  min-height: size50;\n  max-height: size50;\n}\n\n.menuFooter::before {\n  content: '';\n  position: absolute;\n  left: calc(spaceXSmall * -1);\n  right: calc(spaceXSmall * -1);\n  top: spaceNone;\n  border-top: borderWidthPrimary solid colorBorderPrimary;\n}\n\n/*\n * While the keyboard is driving, a pointer left sitting over a row must stop\n * tinting it. Without this, arrowing away from where the mouse happens to rest\n * leaves two tinted rows and nothing to say which one Enter takes. The active\n * row is exempt — that tint is the answer to exactly that question — and a real\n * pointer move clears the class, so hover comes straight back.\n */\n.menuCardA11y.pointerQuiet .option:hover:not(.active) {\n  background: none;\n  color: colorTextSecondary;\n}\n\n/*\n * Inside the opt-in the ring has exactly one source: `.activeRing`. The\n * browser's own keyboard-focus ring has to stand down, or a roving menu opened\n * with ArrowDown would paint one on the option it focuses itself on — before the\n * user has navigated anywhere, and only when opened by keyboard, so the same\n * menu would look different depending on how it was opened. Rows that DO carry\n * `.activeRing` are left alone, so this never cancels the real ring.\n */\n.menuCardA11y .option:focus-visible:not(.activeRing) {\n  box-shadow: none;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Menu/Menu';\nexport * from '../../components/Menu/MenuOptionButton';\nexport * from '../../components/Menu/useMenuTrigger';\nexport * from '../../components/Menu/useMenuKeyboardNavigation';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "MenuFocusScope.d.ts": {
            "path": "MenuFocusScope.d.ts",
            "content": "import * as React from 'react';\nimport { FloatingFocusManager } from '@floating-ui/react';\n/**\n * floating-ui's `FloatingFocusManager`, or nothing at all.\n *\n * Mounting it is what manages focus, so there is no `disabled` prop to pass —\n * the choice has to be whether the element exists. Every popup trigger in the\n * dropdown family needs that choice: without `enableA11y` focus is managed by\n * floating-ui exactly as it always was, and with it, `Menu` takes over, because\n * the one thing `FloatingFocusManager` cannot express is returning focus to a\n * trigger that lives OUTSIDE the popup.\n */\nexport declare const MenuFocusScope: ({ enabled, context, initialFocus, returnFocus, children, }: {\n    enabled: boolean;\n    context: React.ComponentProps<typeof FloatingFocusManager>[\"context\"];\n    initialFocus: React.RefObject<HTMLElement | null>;\n    /** Passed through; `Typeahead` opts out, as it did before. */\n    returnFocus?: boolean;\n    children: React.ReactElement;\n}) => React.JSX.Element;\n//# sourceMappingURL=MenuFocusScope.d.ts.map"
          },
          "MenuOptionButton.d.ts": {
            "path": "MenuOptionButton.d.ts",
            "content": "import * as React from 'react';\nimport type { CSSProperties } from 'react';\nimport type { BaseMenuProps, MenuOption } from '../../components/Menu/Menu';\nexport interface MenuOptionProps extends Omit<BaseMenuProps, 'option' | 'isLastItem' | 'style'> {\n    option: MenuOption;\n    /**\n     * Last option in the list. Without `enableA11y` this is how the menu knows\n     * where Tab leaves it: the last option carries a keydown listener that calls\n     * `onTabOut`. With the opt-in, the keyboard hook owns Tab for the whole menu\n     * and this is ignored.\n     */\n    isLastItem?: boolean;\n    style?: CSSProperties | undefined;\n    /** Total option count — set for virtualized lists so AT announces \"N of total\". */\n    setSize?: number;\n    /** 1-based position — set for virtualized lists (windowed DOM hides the rest). */\n    posInSet?: number;\n    /**\n     * Whether the keyboard has yet to navigate this menu. True from the moment it\n     * opens, however it was opened, and cleared by the first navigation key — so\n     * it gates the focus RING, not the background tint.\n     */\n    suppressInitialHighlight?: boolean;\n    /**\n     * Whether the POINTER is driving the menu. The active option's tint is dropped\n     * while it is, so a cursor moving down the list is the only mark on screen.\n     */\n    pointerDriving?: boolean;\n    /**\n     * Whether focus is inside the menu. A roving menu's highlight IS its DOM\n     * focus, so it must not be drawn once focus has moved elsewhere on the page —\n     * the active option is still remembered, it is just no longer shown. The\n     * combobox modes ignore this: there the trigger input outside the menu holds\n     * focus by design and this highlight is the user's only cursor.\n     */\n    menuHasFocus?: boolean;\n    testId?: string;\n}\nexport declare const MenuOptionButton: (props: MenuOptionProps) => React.JSX.Element;\n//# sourceMappingURL=MenuOptionButton.d.ts.map"
          },
          "menuOptionId.d.ts": {
            "path": "menuOptionId.d.ts",
            "content": "/**\n * The DOM id of an option row — the one thing the row itself, the listbox's\n * `aria-activedescendant`, and a combobox trigger's `aria-activedescendant`\n * must all agree on, so it is built in exactly one place.\n *\n * Option keys are consumer data and may contain whitespace (\"New York\"), which\n * an id can hold but an IDREF cannot: `aria-activedescendant=\"m-option-New\n * York\"` is a list of two references, neither of which resolves. Encoding the\n * key keeps the id a single token.\n */\nexport declare const menuOptionId: (menuId: string, key: string) => string;\n//# sourceMappingURL=menuOptionId.d.ts.map"
          },
          "useMenuKeyboardNavigation.d.ts": {
            "path": "useMenuKeyboardNavigation.d.ts",
            "content": "import * as React from 'react';\n/**\n * Keyboard navigation for the Menu option list. Three interaction models,\n * selected via `mode`:\n *\n * 1. `'roving'` — ROVING FOCUS (default; menu-button popups). Options are native\n *    <button>s, so ArrowUp/ArrowDown move real DOM focus between the enabled\n *    options and Space/Enter activate the focused option natively. Home/End jump\n *    to the first/last option, PageUp/PageDown move by a page, and typing a\n *    printable character jumps to the next matching label (type-ahead).\n *\n * 2. `'activedescendant'` — SELECT-ONLY COMBOBOX. DOM focus stays on the\n *    combobox input; the \"active\" option is a virtual highlight reported via\n *    `setActiveOptionKey` (surfaced as the input's aria-activedescendant) and\n *    NEVER takes real focus. Arrows/Home/End/PageUp/PageDown move the highlight,\n *    printable characters type-ahead, and Enter selects the active option.\n *\n * 3. `'search'` — EDITABLE COMBOBOX. Like `'activedescendant'`, but the input is\n *    a free-text field: printable keys, Left/Right and Home/End are left to the\n *    input for text editing (no type-ahead). Arrows/PageUp/PageDown move the\n *    highlight and Enter selects.\n *\n * Navigation wraps around at the ends. Options are discovered from the DOM\n * (`[data-menu-option-key]`) so it always matches what is rendered after search\n * filtering / grouping.\n *\n * Tab / Shift+Tab keep focus moving through the menu's own focus zones in DOM\n * order — header → search → options → footer — and only close the menu (via\n * `onTabOut`) when focus would leave the menu entirely (Tab past the last\n * focusable, Shift+Tab before the first). This keeps focus from silently\n * dropping to <body> when the popup renders in a portal with nothing after it.\n */\nexport type MenuNavigationMode = 'roving' | 'activedescendant' | 'search';\n/** One navigable option, for menus whose option DOM is windowed. */\nexport interface MenuNavigationOption {\n    key: string;\n    label: string;\n}\ninterface UseMenuKeyboardNavigationArgs {\n    /** Ref to the element that contains the option buttons (the Menu listbox). */\n    containerRef: React.RefObject<HTMLElement | null>;\n    /** Disable all handling (e.g. when the menu is disabled or closed). */\n    enabled?: boolean;\n    /** Interaction model — see the file header. Defaults to `'roving'`. */\n    mode?: MenuNavigationMode;\n    /** Key of the option currently highlighted (needed for the non-roving modes). */\n    activeOptionKey?: string | null;\n    /** Select the option with the given key (used for Enter in the combobox modes). */\n    onSelectKey?: (key: string) => void;\n    /** Report the option key that owns the roving tab stop / active descendant. */\n    setActiveOptionKey: (key: string | null) => void;\n    /** Close the menu when Tab / Shift+Tab would move focus out of it. */\n    onTabOut?: () => void;\n    /**\n     * Combobox menus only: return focus to the trigger input (keeping the menu\n     * open) when Tab / Shift+Tab moves off a header/footer control back toward the\n     * input — which sits OUTSIDE the menu DOM, so the input is the logical centre\n     * of the tab order (header ← input → footer), not an edge. When omitted (the\n     * roving menus) the input lives inside the menu, so the simple boundary close\n     * applies instead.\n     */\n    onReturnFocusToInput?: () => void;\n    /**\n     * Enabled options in render order. Supply this when the option DOM is WINDOWED\n     * (react-window virtualization): only a slice of the rows exists at any moment,\n     * so DOM discovery would confine Home/End, PageUp/PageDown, wrap-around and\n     * type-ahead to that slice — e.g. End on a 100-page Pagination would stop at\n     * page 10. When supplied, all index maths resolve against this list and the\n     * consumer is responsible for scrolling the active option into view (Menu does\n     * this from `activeOptionKey`). Omit it for plain menus: the DOM is then the\n     * source of truth, which keeps grouped/compose layouts and `resolveLabel`\n     * type-ahead working off the text actually rendered.\n     */\n    options?: MenuNavigationOption[];\n}\n/**\n * Focusable controls inside the menu's sticky header / footer region, in DOM\n * order. Used by combobox triggers (Dropdown / Typeahead) so Tab / Shift+Tab can\n * move focus into the footer / header instead of closing the menu when one\n * holds focusable controls (e.g. Cancel / Save buttons).\n */\nexport declare const getMenuRegionFocusables: (menu: HTMLElement | null, region: \"header\" | \"footer\") => HTMLElement[];\n/**\n * Move focus into the menu's footer (Tab) or header (Shift+Tab) edge if that\n * region has focusable controls. Returns true when it moved focus, so a combobox\n * trigger can close the menu only when there was no chrome to land on.\n */\nexport declare const moveFocusToMenuChrome: (menu: HTMLElement | null, shiftKey: boolean) => boolean;\nexport declare const useMenuKeyboardNavigation: ({ containerRef, enabled, mode, activeOptionKey, onSelectKey, setActiveOptionKey, onTabOut, onReturnFocusToInput, options, }: UseMenuKeyboardNavigationArgs) => {\n    onKeyDown: (event: React.KeyboardEvent<HTMLElement>) => void;\n};\nexport {};\n//# sourceMappingURL=useMenuKeyboardNavigation.d.ts.map"
          },
          "useMenuTrigger.d.ts": {
            "path": "useMenuTrigger.d.ts",
            "content": "import * as React from 'react';\nimport type { MenuOption, MenuProps } from '../../components/Menu/Menu';\n/**\n * Wires a trigger to the Menu it opens.\n *\n * Three things have to live on the trigger rather than in Menu, because they\n * exist while the menu does NOT: `aria-haspopup`, `aria-expanded=\"false\"`, and\n * the ArrowDown/ArrowUp that opens the popup in the first place. That is the\n * floor — no Menu prop can supply them — so these hooks hand them over as props\n * to spread instead, and own everything else: the ids, the tie between the\n * trigger's name and the listbox, and the ref Menu focuses into on open.\n *\n * `useMenuTrigger` is for triggers whose popup options own focus — a button, a\n * tab overflow chevron, an inline label — so arrows move real DOM focus.\n * `useComboboxMenuTrigger` is for triggers that are text inputs, where focus\n * stays put and the highlight is virtual (`aria-activedescendant`).\n *\n * `getTriggerProps` is a getter rather than a static object because open state\n * belongs to the consumer's `ClickAway`, which exposes it through a render\n * callback — where a hook cannot be called.\n *\n *     const menuTrigger = useMenuTrigger({id: props.id, ariaLabel: menu?.ariaLabel});\n *     <ClickAway restoreFocusOnClose>\n *       {({isOpen, onOpen, clickAway}) => (\n *         <>\n *           <Button {...props} {...menuTrigger.getTriggerProps({isOpen, onOpen})} />\n *           {isOpen && (\n *             <Menu\n *               {...menu}\n *               {...menuTrigger.menuProps}\n *               enableA11y\n *               onTabOut={clickAway}\n *             />\n *           )}\n *         </>\n *       )}\n *     </ClickAway>\n *\n * `restoreFocusOnClose` is what returns focus to the trigger when the menu\n * closes. Menu moves focus INTO the popup on open, so without it Escape, a\n * selection or Tab leaves focus on `document.body` — the components in this\n * package pass it alongside their own `enableA11y`.\n */\nexport interface UseMenuTriggerArgs {\n    /**\n     * Produce the wiring at all. False returns empty props and an inert handler,\n     * so a consumer can call the hook unconditionally (hooks cannot be\n     * conditional) while its own accessibility opt-in is off.\n     */\n    enabled?: boolean;\n    /**\n     * The trigger's own `id`, when the consumer supplied one. It is kept — the\n     * hook only mints an id when there is none, since the listbox is named after\n     * the trigger through it.\n     */\n    id?: string;\n    /** The listbox id, when the consumer set `menu.menuId`. Minted otherwise. */\n    menuId?: string;\n    /** Literal name for the listbox. Wins over naming it after the trigger. */\n    ariaLabel?: string;\n    /** Id of the element naming the listbox. Defaults to the trigger itself. */\n    ariaLabelledBy?: string;\n}\n/**\n * Generic in the trigger element so the returned handler matches whatever it is\n * spread onto — inferred from the trigger's own `onKeyDown` where it has one.\n */\nexport interface GetTriggerPropsArgs<T extends HTMLElement = HTMLElement> {\n    /** The consumer's popup state — what ClickAway reports. */\n    isOpen: boolean;\n    onOpen: () => void;\n    /** The trigger's own key handler, if it has one. Runs first. */\n    onKeyDown?: React.KeyboardEventHandler<T>;\n}\nexport interface MenuTriggerProps<T extends HTMLElement = HTMLElement> {\n    id: string;\n    'aria-haspopup': 'listbox';\n    'aria-expanded': boolean;\n    'aria-controls': string | undefined;\n    onKeyDown: React.KeyboardEventHandler<T>;\n}\nexport interface MenuTriggerMenuProps {\n    menuId: string;\n    ariaLabelledBy?: string;\n    ariaLabel?: string;\n    initialFocusRef: React.RefObject<HTMLElement | null>;\n}\nexport declare const useMenuTrigger: ({ enabled, id, menuId: consumerMenuId, ariaLabel, ariaLabelledBy, }?: UseMenuTriggerArgs) => {\n    getTriggerProps: <T extends HTMLElement = HTMLElement>(args: GetTriggerPropsArgs<T>) => MenuTriggerProps<T>;\n    menuProps: MenuTriggerMenuProps;\n};\n/**\n * Which of ARIA's two combobox patterns the trigger implements.\n *\n * - `select` — a read-only field standing in for a `<select>`. An option is\n *   highlighted as soon as the list opens, Space selects it (the field has no\n *   typing role), and Enter or Space opens the list in the first place.\n * - `autocomplete` — an editable field that filters the list as you type. The\n *   best match is highlighted for the user as the list narrows under them (APG\n *   calls this automatic selection), so Enter takes it without arrowing to it\n *   first. Space types a space, and only the arrow keys open the list.\n */\nexport type ComboboxPattern = 'select' | 'autocomplete';\nexport interface UseComboboxMenuTriggerArgs {\n    /**\n     * Produce the wiring at all. False returns empty props and an inert handler,\n     * so a consumer can call the hook unconditionally while its own accessibility\n     * opt-in is off.\n     */\n    enabled?: boolean;\n    /** Which pattern this trigger implements. Defaults to `select`. */\n    pattern?: ComboboxPattern;\n    /**\n     * The menu this trigger opens. Read for the option source (unless `options`\n     * is given), the selection, `virtualization`, `menuDisabled`, `resolveLabel`,\n     * `allowSearch` and the consumer's own `menuId` / `ariaLabel` /\n     * `ariaLabelledBy`, all of which win over what the hook would derive.\n     */\n    menu?: MenuProps;\n    /**\n     * Option source, when it is not `menu` — a consumer that owns filtering and\n     * hands the already-filtered options to Menu supplies them here instead. Every\n     * derivation (navigation list, highlight seed, selection lookup) uses it.\n     */\n    options?: Array<MenuOption>;\n    /**\n     * Refuse to open, e.g. until enough has been typed. Consulted only for the\n     * keys that would otherwise open the list.\n     */\n    canOpen?: () => boolean;\n    /** Ref on the rendered Menu, for reaching its header/footer controls. */\n    menuRef: React.RefObject<HTMLElement | null>;\n    /**\n     * The consumer's popup state — what ClickAway reports. Drives which keys the\n     * trigger handles (open-state navigation vs. closed-state opening) and the\n     * highlight's lifecycle. If the listbox can be WITHHELD while the popup is\n     * open (still loading, no matches), keep passing the open state here and hand\n     * `isExpanded` to `getTriggerProps` for the ARIA — routing keys off the\n     * rendered state instead would make an arrow key call `onOpen` on an\n     * already-open popup, and `onOpen` toggles.\n     */\n    isOpen: boolean;\n    /** Apply a selection. Called with the option the keyboard acted on. */\n    onSelectOption: (option: MenuOption) => void;\n    /** Close the popup — used when Tab leaves a menu with no chrome to land on. */\n    onClose: () => void;\n    /** Put focus back on the trigger input, keeping the menu open. */\n    focusTrigger: () => void;\n    /** What already labels the trigger, used to name the listbox after it. */\n    triggerAriaLabelledBy?: string;\n    triggerAriaLabel?: string;\n    /**\n     * Literal name for the listbox when nothing else supplies one. Defaults to\n     * `'Options'`; a suggestion list wants something truer to what it holds.\n     */\n    defaultAriaLabel?: string;\n}\nexport interface GetComboboxTriggerPropsArgs<T extends HTMLElement = HTMLElement> extends GetTriggerPropsArgs<T> {\n    /**\n     * Whether the listbox is actually rendered right now, when that can differ\n     * from `isOpen` (a popup withheld while loading or with no matches). Drives\n     * `aria-expanded`, `aria-controls` and `aria-activedescendant`, so the trigger\n     * never claims an expanded listbox that is not in the DOM. Defaults to\n     * `isOpen`.\n     */\n    isExpanded?: boolean;\n}\nexport interface ComboboxTriggerProps<T extends HTMLElement = HTMLElement> {\n    role: 'combobox';\n    'aria-haspopup': 'listbox';\n    'aria-expanded': boolean;\n    'aria-controls': string | undefined;\n    'aria-autocomplete': 'none' | 'list';\n    'aria-activedescendant': string | undefined;\n    onKeyDown: React.KeyboardEventHandler<T>;\n}\nexport interface ComboboxMenuProps {\n    menuId: string;\n    ariaLabelledBy?: string;\n    ariaLabel?: string;\n    externalKeyboardNav: boolean;\n    activeOptionKey?: string | null;\n    onActiveOptionKeyChange?: (key: string | null) => void;\n    onReturnFocusToInput?: () => void;\n    initialFocusRef?: React.RefObject<HTMLElement | null>;\n}\n/**\n * Wires a COMBOBOX trigger — a text input — to the Menu it opens. Focus stays\n * on the input and the highlight is virtual, reported through\n * `aria-activedescendant`, because the input has to keep receiving the keys it\n * filters with.\n *\n * Driving the highlight from outside Menu means owning the active option as\n * state, and owning it means deriving the same option list, initial highlight\n * and navigation list that Menu derives internally. Both combobox consumers had\n * grown their own copies of all three; they come from Menu itself now.\n *\n * A menu that carries its own filter field (`menu.allowSearch`) inverts the\n * model: navigation lives inside Menu, so the trigger stops driving it and\n * hands over an `initialFocusRef` instead. Both shapes come out of this hook.\n */\nexport declare const useComboboxMenuTrigger: ({ enabled, pattern, menu, options, canOpen, menuRef, isOpen, onSelectOption, onClose, focusTrigger, triggerAriaLabelledBy, triggerAriaLabel, defaultAriaLabel, }: UseComboboxMenuTriggerArgs) => {\n    getTriggerProps: <T extends HTMLElement = HTMLElement>(args: GetComboboxTriggerPropsArgs<T>) => ComboboxTriggerProps<T>;\n    menuProps: ComboboxMenuProps;\n    activeOptionKey: string | null;\n};\n//# sourceMappingURL=useMenuTrigger.d.ts.map"
          }
        }
      },
      "allFiles": [
        "Menu.module.css",
        "Menu.stories.module.css",
        "Menu.stories.tsx",
        "Menu.tsx",
        "MenuFocusScope.tsx",
        "MenuOptionButton.tsx",
        "index.ts",
        "menuOptionId.ts",
        "useMenuKeyboardNavigation.ts",
        "useMenuTrigger.ts"
      ]
    },
    "Modal": {
      "name": "Modal",
      "path": "src/components/Modal",
      "files": {
        "main": {
          "path": "Modal.d.ts",
          "content": "import * as React from 'react';\nimport type { UseTransitionStylesProps } from '@floating-ui/react';\ntype ClassNames = Readonly<{\n    container?: string;\n    content?: string;\n    backdrop?: string;\n}>;\ntype FooterClassNames = Readonly<{\n    wrapper?: string;\n    actions?: string;\n}>;\nexport interface ModalProps {\n    classNames?: ClassNames;\n    children?: React.ReactNode;\n    isOpen?: boolean;\n    onClose?: ((arg1: React.SyntheticEvent<HTMLElement>) => unknown) | null | undefined;\n    hideBackdrop?: boolean;\n    tapOutsideToClose?: boolean;\n    allowBackgroundInteraction?: boolean;\n    initialFocus?: number;\n    customAnimation?: UseTransitionStylesProps;\n    testId?: string;\n}\nexport type ModalSize = 'small' | 'medium' | 'large';\nexport type OverlayType = 'Modal' | 'Dialog' | 'Panel';\nexport type OverlaySize = 'small' | 'medium' | 'large' | 'fullscreen';\nexport type OverlayAnchor = 'left' | 'right';\nexport interface OverlayEventDetail {\n    /** Stable identifier to correlate mount/unmount pairs */\n    id: string;\n    overlayType: OverlayType;\n    size?: OverlaySize;\n    anchor?: OverlayAnchor;\n    /** Whether the overlay renders a visible backdrop */\n    hasBackdrop: boolean;\n    tapOutsideToClose: boolean;\n    allowBackgroundInteraction: boolean;\n    /** Dialog semantic (neutral, success, warning, danger, information) */\n    semantic?: string;\n    testId?: string;\n}\nexport declare const OVERLAY_MOUNT_EVENT: \"ds:overlay:mount\";\nexport declare const OVERLAY_UNMOUNT_EVENT: \"ds:overlay:unmount\";\nexport type OverlayMountEvent = CustomEvent<OverlayEventDetail>;\nexport type OverlayUnmountEvent = CustomEvent<OverlayEventDetail>;\ndeclare global {\n    interface WindowEventMap {\n        'ds:overlay:mount': OverlayMountEvent;\n        'ds:overlay:unmount': OverlayUnmountEvent;\n    }\n}\nexport interface BaseModalProps extends Omit<ModalProps, 'size'> {\n    size?: ModalSize;\n    /** @internal Used by Panel/Dialog to identify overlay type in lifecycle events */\n    overlayType?: OverlayType;\n    /** @internal Used by Panel/Dialog to report size in lifecycle events */\n    overlaySize?: OverlaySize;\n    /** @internal Used by Panel to report anchor in lifecycle events */\n    overlayAnchor?: OverlayAnchor;\n    /** @internal Used by Dialog to report semantic variant in lifecycle events */\n    overlaySemantic?: string;\n}\nexport interface ModalHeaderProps {\n    children?: React.ReactNode;\n    hideCloseBtn?: boolean;\n    onCloseButtonClick?: React.MouseEventHandler<HTMLButtonElement>;\n    className?: string;\n    testId?: string;\n}\nexport interface ModalFooterProps {\n    children?: React.ReactNode;\n    classNames?: FooterClassNames;\n    testId?: string;\n}\nexport interface ModalBodyProps {\n    children?: React.ReactNode;\n    className?: string;\n    testId?: string;\n}\nexport declare const ModalHeader: ({ children, hideCloseBtn, onCloseButtonClick, className, testId, }: ModalHeaderProps) => React.JSX.Element;\nexport declare const ModalBody: ({ children, className, testId }: ModalBodyProps) => React.JSX.Element;\nexport declare const ModalFooter: ({ children, classNames, testId, }: ModalFooterProps) => React.JSX.Element;\nexport declare const Modal: ({ classNames, children, isOpen, onClose, hideBackdrop, tapOutsideToClose, initialFocus, customAnimation, allowBackgroundInteraction, testId, size, overlayType, overlaySize, overlayAnchor, overlaySemantic, }: BaseModalProps) => React.ReactPortal | null;\nexport declare const FullScreenModal: ({ classNames, testId, ...props }: ModalProps) => React.JSX.Element;\nexport {};\n//# sourceMappingURL=Modal.d.ts.map"
        },
        "story": {
          "path": "Modal.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {Button} from 'src/components/Button';\nimport {SimpleDropdown} from 'src/components/Dropdown';\nimport {Input} from 'src/components/Input';\nimport type {MenuOption} from 'src/components/Menu';\nimport type {ModalProps} from 'src/components/Modal/Modal';\nimport {\n  Modal,\n  ModalBody,\n  ModalFooter,\n  ModalHeader,\n} from 'src/components/Modal/Modal';\nimport {SubTitleLarge} from 'src/components/Text';\nimport {Textarea} from 'src/components/Textarea';\nimport {Tooltip} from 'src/components/Tooltip';\n\n\nconst options: MenuOption[] = [\n  {\n    key: '1',\n    label: 'Option one',\n    iconLeft: 'coffee',\n  },\n  {key: '2', label: 'Option two', iconLeft: 'user'},\n  {\n    key: '4',\n    label:\n      'Option three is a very long option that would truncate and keep going to make it even longer than before. You can hover over the label to see the full text. ShowLabelTooltip maxLines is used to define the number of lines to show in the tooltip.',\n    iconLeft: 'face-party',\n  },\n  {\n    key: '5',\n    label: 'Option five(disabled)',\n    disabled: true,\n    iconLeft: 'flag',\n  },\n];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Modal',\n  argTypes: {\n    isOpen: {\n      description: 'if **true**, the modal is presented',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    size: {\n      description: `\nModal supports only three size variants namely small, medium and large. \\`small\\` < \\`medium\\` < \\`large\\`.\nYou can always override the sizing by a className. The default value is currently not set to support backward compatibility\n      `,\n      options: ['small', 'medium', 'large'],\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: ''},\n      },\n    },\n    hideBackdrop: {\n      description:\n        'if **true**, dark backdrop is removed and transparent backdrop is applied on the DOM',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    tapOutsideToClose: {\n      description: 'if **true**, closes the modal on tap of backdrop',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'true'},\n      },\n    },\n    classNames: {\n      description: 'External classnames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{container?: string, content?: string, backdrop?: string}',\n        },\n      },\n    },\n    customAnimation: {\n      description: `\\`<Modal>\\` and its derivatives(\\`<Dialog>\\`, \\`<Panel>\\`) support\n      \\`customAnimation: UseTransitionStylesProps\\` prop for\n      all your custom animation needs.\n      It defines the following properties: \\n\\n\n- \\`duration\\` (optional): Specifies the duration of the animation in milliseconds.\nIt can be a single number to set the duration for both opening and closing animations,\nor an object with separate open and close properties to specify different durations\nfor opening and closing animations.\n- \\`initial\\` (optional): Represents the initial CSS styles for the modal component when\nit is first mounted. This property allows you to define the initial appearance of the\nmodal before any animations occur.\n- \\`open\\` (optional): Defines the CSS styles that should be applied when the modal is fully\nopened. This property specifies the appearance of the modal when it transitions from the\ninitial state to the fully open state.\n- \\`close\\` (optional): Specifies the CSS styles for the modal when it is being closed. This\nproperty determines the appearance of the modal when it transitions from the fully open\nstate to the closed state.\n- \\`common\\` (optional): Represents the CSS styles that are common to all states of the modal\ncomponent. These styles will be applied throughout the entire lifecycle of the modal,\nregardless of whether it is in the initial, open, or close state. You can use this property\nto define shared styles that should be present in all states.\n\\n\\nThe modal component follows a predefined order of states as it transitions through\nits lifecycle. It starts in the \\`unmounted\\` state, then moves to the \\`initial\\` state when mounted.\nFrom there, it can transition to the \\`open\\` state when fully opened, and then to the \\`close\\` state\nwhen being closed. Finally, it returns to the \\`unmounted\\` state when it is no longer needed. This\nis the transition order: \\`unmounted\\` -> \\`initial\\` -> \\`open\\` -> \\`close\\` -> \\`unmounted\\`\nBy specifying the appropriate values for the \\`duration\\`, \\`initial\\`, \\`open\\`, \\`close\\`, and \\`common\\` properties,\nyou can control the animation and styling of the modal at each stage of its lifecycle.\n      `,\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: 'UseTransitionStylesProps'},\n      },\n    },\n    children: {\n      description: 'The children to rendered inside the Modal window',\n      table: {\n        type: {summary: 'React.Node'},\n      },\n    },\n    onClose: {\n      description: '**onClose** handler is triggered on backdrop click',\n      action: 'clicked',\n      table: {\n        type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n      },\n    },\n    initialFocus: {\n      description:\n        'Which element to initially focus. Can be a number (tabbable index as specified by the order)',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: '-1'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Modal component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Modal, ModalBody, ModalHeader, ModalFooter } from \"@spaced-out/ui-design-system/lib/components/Modal\";\n\\`\\`\\`\n**Modal** component provides the foundational base for creating elements which blocks interaction with the rest of the application.\nIt is used as base for Dialog and Panel components. A **Modal** component can be used in cases where you want to have a custom implementation.\nModal component renders its children on top of a backdrop spanning across the whole page. The backdrop in turn also blurs the background.\nSome features of the Modal components are listed below:\n\n\\`Modal implements Focus trapping where in the focus is trapped and rotated inside a modal element only.\\`\n\n\\`When the Modal is presented, page scrolling is disabled \\`\n\n\\`Manages stacking \\`\n\nModal is attached on the \\`body\\` using **React Portal**.\n\nSemantically a \\`Modal\\` component should be composed from \\`ModalHeader\\`, \\`ModalBody\\`, and \\`ModalFooter\\` components,\nthese are nothing but layout components which defines appropriate spacing for the children living in them.\n\\`ModalHeader\\` adds a **close icon** by default and provides a callback on click. You can pass a **prop to show/hide the close button** as well.\n\n**Styling: **\n\n\\`Modal\\` accepts a \\`classNames\\` object. You can style the modal(if required) using the **content className**. Most of the use\ncases of Modal sizing can be handled by \\`size\\` prop of Modal which accepts \\`small\\` \\`medium\\` \\`large\\` as value.\n\nIf you want to assign custom props the parent should set those props of the\nModal using the content className.\n\nEach of these components also exposes a className\n\n**Usage: **\n\n\\`\\`\\`jsx\n<Modal\n  isOpen={isOpen}\n  onClose={() => setIsOpen(false)}\n  classNames={{content: css.modalContent}}\n>\n  <ModalHeader onCloseButtonClick={() => setIsOpen(false)}>\n    <SubTitleLarge>\n      The quick brown fox jumps over the lazy dog is an English-language pangram—a sentence that contain\n    </SubTitleLarge>\n  </ModalHeader>\n  <ModalBody>\n    <BodyLarge color=\"secondary\">\n      \"The quick brown fox jumps over the lazy dog\" is an English-language pangram—a sentence that contains all the letters of the alphabet.\n      The phrase is commonly used for touch-typing practice, testing typewriters and computer keyboards, displaying examples of fonts,\n      and other applications involving text where the use of all letters in the alphabet is desired.\n    </BodyLarge>\n  </ModalBody>\n  <ModalFooter>\n    <Button type=\"secondary\" onClick={() => setIsOpen(false)}>Secondary Button</Button>\n    <Button type=\"primary\" onClick={() => setIsOpen(false)}>Primary Button</Button>\n  </ModalFooter>\n</Modal>\n\\`\\`\\`\n\\`\\`\\`css\n// You can style the modal(if required) using the **content className**. Most of the use\n// cases of Modal sizing can be handled by size prop of Modal which accepts small, medium and large as value.\n.modalContent {\n  max-height: size720;\n}\n\\`\\`\\`\n\n---\n\n### Overlay Lifecycle Events\n\n\\`Modal\\`, \\`Dialog\\`, and \\`Panel\\` all emit **strongly-typed window events** when they mount and unmount. Since Dialog and Panel internally use Modal,\nthe event system is centralized — every overlay that opens or closes dispatches a pair of events on \\`window\\`.\n\n**Event names (exported constants):**\n\n| Constant | Value |\n|---|---|\n| \\`OVERLAY_MOUNT_EVENT\\` | \\`'ds:overlay:mount'\\` |\n| \\`OVERLAY_UNMOUNT_EVENT\\` | \\`'ds:overlay:unmount'\\` |\n\n**Event payload (\\`OverlayEventDetail\\`):**\n\n| Field | Type | Description |\n|---|---|---|\n| \\`id\\` | \\`string\\` | Stable UUID per overlay instance — use to correlate mount/unmount pairs |\n| \\`overlayType\\` | \\`'Modal' \\\\| 'Dialog' \\\\| 'Panel'\\` | Which component emitted the event |\n| \\`size\\` | \\`'small' \\\\| 'medium' \\\\| 'large' \\\\| 'fullscreen'\\` | Size variant of the overlay |\n| \\`anchor\\` | \\`'left' \\\\| 'right'\\` | Anchor position (Panel only) |\n| \\`hasBackdrop\\` | \\`boolean\\` | Whether the overlay renders a visible backdrop |\n| \\`tapOutsideToClose\\` | \\`boolean\\` | Whether clicking the backdrop dismisses the overlay |\n| \\`allowBackgroundInteraction\\` | \\`boolean\\` | Whether the background remains interactive |\n| \\`semantic\\` | \\`string\\` | Dialog semantic variant — \\`neutral\\`, \\`success\\`, \\`warning\\`, \\`danger\\`, \\`information\\` |\n| \\`testId\\` | \\`string\\` | The \\`testId\\` prop passed to the component |\n\n**Import:**\n\n\\`\\`\\`ts\nimport {\n  OVERLAY_MOUNT_EVENT,\n  OVERLAY_UNMOUNT_EVENT,\n} from \"@spaced-out/ui-design-system/lib/components/Modal\";\n// Types (if needed)\nimport type {\n  OverlayEventDetail,\n  OverlayMountEvent,\n  OverlayUnmountEvent,\n  OverlayType,\n  OverlaySize,\n  OverlayAnchor,\n} from \"@spaced-out/ui-design-system/lib/components/Modal\";\n\\`\\`\\`\n\n**Basic usage — listen for mount/unmount:**\n\n\\`\\`\\`ts\nwindow.addEventListener(OVERLAY_MOUNT_EVENT, (e) => {\n  // e is fully typed as CustomEvent<OverlayEventDetail>\n  console.log('Opened:', e.detail.overlayType, e.detail.size);\n});\n\nwindow.addEventListener(OVERLAY_UNMOUNT_EVENT, (e) => {\n  console.log('Closed:', e.detail.overlayType, e.detail.id);\n});\n\\`\\`\\`\n\n**Track all open overlays:**\n\n\\`\\`\\`ts\nconst openOverlays = new Map<string, OverlayEventDetail>();\n\nwindow.addEventListener(OVERLAY_MOUNT_EVENT, (e) => {\n  openOverlays.set(e.detail.id, e.detail);\n});\nwindow.addEventListener(OVERLAY_UNMOUNT_EVENT, (e) => {\n  openOverlays.delete(e.detail.id);\n});\n\\`\\`\\`\n\n**React hook pattern — \\`useOverlayLifecycle\\`:**\n\n\\`\\`\\`tsx\nimport { useEffect } from 'react';\nimport {\n  OVERLAY_MOUNT_EVENT,\n  OVERLAY_UNMOUNT_EVENT,\n} from \"@spaced-out/ui-design-system/lib/components/Modal\";\nimport type { OverlayEventDetail } from \"@spaced-out/ui-design-system/lib/components/Modal\";\n\nfunction useOverlayLifecycle(\n  onMount?: (detail: OverlayEventDetail) => void,\n  onUnmount?: (detail: OverlayEventDetail) => void,\n) {\n  useEffect(() => {\n    const handleMount = (e: CustomEvent<OverlayEventDetail>) => onMount?.(e.detail);\n    const handleUnmount = (e: CustomEvent<OverlayEventDetail>) => onUnmount?.(e.detail);\n    window.addEventListener(OVERLAY_MOUNT_EVENT, handleMount);\n    window.addEventListener(OVERLAY_UNMOUNT_EVENT, handleUnmount);\n    return () => {\n      window.removeEventListener(OVERLAY_MOUNT_EVENT, handleMount);\n      window.removeEventListener(OVERLAY_UNMOUNT_EVENT, handleUnmount);\n    };\n  }, [onMount, onUnmount]);\n}\n\\`\\`\\`\n\n**Correlating mount/unmount with \\`id\\`:**\n\nEach overlay instance gets a stable UUID. The same \\`id\\` appears in both the mount and unmount events,\nso you can measure how long an overlay stayed open:\n\n\\`\\`\\`ts\nconst timestamps = new Map<string, number>();\n\nwindow.addEventListener(OVERLAY_MOUNT_EVENT, (e) => {\n  timestamps.set(e.detail.id, Date.now());\n});\nwindow.addEventListener(OVERLAY_UNMOUNT_EVENT, (e) => {\n  const opened = timestamps.get(e.detail.id);\n  if (opened) {\n    const duration = Date.now() - opened;\n    analytics.track('overlay_closed', { ...e.detail, durationMs: duration });\n    timestamps.delete(e.detail.id);\n  }\n});\n\\`\\`\\`\n\n**Example payloads by component:**\n\nModal (medium):\n\\`\\`\\`json\n{ \"id\": \"a1b2c3\", \"overlayType\": \"Modal\", \"size\": \"medium\", \"hasBackdrop\": true,\n  \"tapOutsideToClose\": true, \"allowBackgroundInteraction\": false }\n\\`\\`\\`\n\nPanel (right, large):\n\\`\\`\\`json\n{ \"id\": \"d4e5f6\", \"overlayType\": \"Panel\", \"size\": \"large\", \"anchor\": \"right\",\n  \"hasBackdrop\": false, \"tapOutsideToClose\": true, \"allowBackgroundInteraction\": false }\n\\`\\`\\`\n\nDialog (danger):\n\\`\\`\\`json\n{ \"id\": \"g7h8i9\", \"overlayType\": \"Dialog\", \"hasBackdrop\": true,\n  \"tapOutsideToClose\": false, \"allowBackgroundInteraction\": false, \"semantic\": \"danger\" }\n\\`\\`\\`\n          `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Modal/Modal',\n    },\n  },\n};\n\nexport const ModalStory = (args: ModalProps) => {\n  const [isOpen, setIsOpen] = React.useState(args.isOpen);\n\n  React.useEffect(() => {\n    setIsOpen(args.isOpen);\n  }, [args.isOpen]);\n\n  return (\n    <>\n      <Tooltip title=\"Open\">\n        <Button onClick={() => setIsOpen(!isOpen)}>Open Modal</Button>\n      </Tooltip>\n      <Modal {...args} isOpen={isOpen} onClose={() => setIsOpen(false)}>\n        <ModalHeader onCloseButtonClick={() => setIsOpen(false)}>\n          <SubTitleLarge>Modal Title</SubTitleLarge>\n        </ModalHeader>\n        <ModalBody>\n          <Input\n            type=\"email\"\n            label=\"Email Address\"\n            placeholder=\"Enter your email address\"\n          />\n          <br />\n          <SimpleDropdown\n            label=\"Issue Type\"\n            placeholder=\"Select an issue type\"\n            options={[\n              {\n                iconLeft: 'bug',\n                iconLeftType: 'duotone',\n                key: '1',\n                label: 'Production Issue',\n              },\n              {\n                iconLeft: 'bug-slash',\n                iconLeftType: 'duotone',\n                key: '2',\n                label: 'Dev Issue',\n              },\n              {\n                iconLeft: 'ban-bug',\n                iconLeftType: 'duotone',\n                key: '4',\n                label: 'Product Issue',\n              },\n            ]}\n          />\n          <br />\n          <Textarea\n            label=\"Description\"\n            placeholder=\"Enter the issue description\"\n          />\n        </ModalBody>\n        <ModalFooter>\n          <Tooltip title=\"Some text\" elevation=\"modal\">\n            <Button type=\"tertiary\" onClick={() => setIsOpen(false)}>\n              Cancel\n            </Button>\n          </Tooltip>\n          <Button type=\"secondary\" onClick={() => setIsOpen(false)}>\n            Action\n          </Button>\n        </ModalFooter>\n      </Modal>\n    </>\n  );\n};\n\nModalStory.args = {\n  hideBackdrop: false,\n  tapOutsideToClose: true,\n  initialFocus: 1,\n  size: 'medium',\n  testId: 'modal-story',\n};\n\nexport const ModalWithOverflowBodyStory = (args: ModalProps) => {\n  const [isOpen, setIsOpen] = React.useState(args.isOpen);\n\n  React.useEffect(() => {\n    setIsOpen(args.isOpen);\n  }, [args.isOpen]);\n\n  return (\n    <>\n      <Tooltip title=\"Open\">\n        <Button onClick={() => setIsOpen(!isOpen)}>Open Modal</Button>\n      </Tooltip>\n      <Modal {...args} isOpen={isOpen} onClose={() => setIsOpen(false)}>\n        <ModalHeader onCloseButtonClick={() => setIsOpen(false)}>\n          <SubTitleLarge>Modal Title</SubTitleLarge>\n        </ModalHeader>\n        <ModalBody>\n          <Input\n            type=\"email\"\n            label=\"Email Address\"\n            placeholder=\"Enter your email address\"\n          />\n          <br />\n          <SimpleDropdown\n            label=\"Issue Type\"\n            placeholder=\"Select an issue type\"\n            showLabelTooltip={{maxLines: 6}}\n            options={options}\n          />\n        </ModalBody>\n      </Modal>\n    </>\n  );\n};\n\nModalWithOverflowBodyStory.args = {\n  hideBackdrop: false,\n  tapOutsideToClose: true,\n  initialFocus: 1,\n  size: 'medium',\n  testId: 'modal-overflow-body-story',\n};\n\n// export const _FullScreenModal = (args: ModalProps): React.Node => {\n//   const [isOpen, setIsOpen] = React.useState(args.isOpen);\n\n//   React.useEffect(() => {\n//     setIsOpen(args.isOpen);\n//   }, [args.isOpen]);\n\n//   return (\n//     <div className={css.container}>\n//       <Tooltip title=\"Open\">\n//         <Button onClick={() => setIsOpen(!isOpen)}>Open Modal</Button>\n//       </Tooltip>\n//       <FullScreenModal\n//         {...args}\n//         isOpen={isOpen}\n//         onClose={() => setIsOpen(false)}\n//       >\n//         <ModalHeader onCloseButtonClick={() => setIsOpen(false)}>\n//           <SubTitleLarge>Modal Title</SubTitleLarge>\n//         </ModalHeader>\n//         <ModalBody>\n//           <Input\n//             type=\"email\"\n//             label=\"Email Address\"\n//             placeholder=\"Enter your email address\"\n//           />\n//           <br />\n//           <SimpleDropdown\n//             label=\"Issue Type\"\n//             placeholder=\"Select an issue type\"\n//             options={[\n//               {\n//                 iconLeft: 'bug',\n//                 iconLeftType: 'duotone',\n//                 key: '1',\n//                 label: 'Production Issue',\n//               },\n//               {\n//                 iconLeft: 'bug-slash',\n//                 iconLeftType: 'duotone',\n//                 key: '2',\n//                 label: 'Dev Issue',\n//               },\n//               {\n//                 iconLeft: 'ban-bug',\n//                 iconLeftType: 'duotone',\n//                 key: '4',\n//                 label: 'Product Issue',\n//               },\n//             ]}\n//           />\n//           <br />\n//           <Textarea\n//             label=\"Description\"\n//             placeholder=\"Enter the issue description\"\n//           />\n//         </ModalBody>\n//         <ModalFooter>\n//           <Tooltip title=\"Some text\" elevation=\"modal\">\n//             <Button type=\"tertiary\" onClick={() => setIsOpen(false)}>\n//               Cancel\n//             </Button>\n//           </Tooltip>\n//           <Button type=\"secondary\" onClick={() => setIsOpen(false)}>\n//             Action\n//           </Button>\n//         </ModalFooter>\n//       </FullScreenModal>\n//     </div>\n//   );\n// };\n\n// _FullScreenModal.args = {\n//   hideBackdrop: false,\n//   tapOutsideToClose: true,\n//   initialFocus: 1,\n//   size: 'medium',\n// };\nModalStory.storyName = 'Modal';\nModalWithOverflowBodyStory.storyName = 'Modal With Overflow Body';\n"
        },
        "css": {
          "path": "Modal.module.css",
          "content": "@value (\n  colorBackgroundTertiary, \n  colorBackgroundPrimary, \n  colorBackdropFill\n) from '../../styles/variables/_color.css';\n@value (\n  spaceNone, \n  spaceSmall, \n  spaceXSmall, \n  spaceMedium, \n  spaceXXSmall, \n  spaceHalfFluid, \n  spaceNegHalfFluid\n) from '../../styles/variables/_space.css';\n@value (\n  sizeFluid, \n  size58, \n  size60, \n  size66,\n  size320, \n  size480, \n  size640\n) from '../../styles/variables/_size.css';\n@value (\n  elevationNone, \n  elevationModal, \n  elevationBackdrop\n) from '../../styles/variables/_elevation.css';\n@value (\n  opacity100, \n  opacity0\n) from '../../styles/variables/_opacity.css';\n@value (\n  motionDurationNormal\n) from '../../styles/variables/_motion.css';\n@value (\n  borderRadiusMedium\n) from '../../styles/variables/_border.css';\n\n.modalContainer {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.modal {\n  position: fixed;\n  top: spaceHalfFluid;\n  left: spaceHalfFluid;\n  transform: translate(spaceNegHalfFluid, spaceNegHalfFluid);\n  composes: boxShadow4 from '../../styles/shadow.module.css';\n  display: flex;\n  max-height: sizeFluid;\n  flex-flow: column;\n  background: colorBackgroundTertiary;\n  overflow: auto;\n  z-index: elevationModal;\n  border-radius: borderRadiusMedium;\n}\n\n.small {\n  width: size320;\n}\n\n.medium {\n  width: size480;\n}\n\n.large {\n  width: size640;\n}\n\n.fullscreenModalContainer {\n  width: sizeFluid;\n  height: sizeFluid;\n  border-radius: initial;\n}\n\n.modalContainer.open.in .modal {\n  opacity: opacity100;\n  transform: translate(spaceNegHalfFluid, spaceNegHalfFluid) scale(1);\n}\n\n.backdrop {\n  display: flex;\n  flex-flow: column;\n  visibility: hidden;\n  opacity: opacity0;\n  background-color: transparent;\n  backdrop-filter: blur(spaceNone);\n  width: sizeFluid;\n  height: sizeFluid;\n  top: spaceNone;\n  left: spaceNone;\n  position: fixed;\n  pointer-events: none;\n  z-index: elevationNone;\n  transition: visibility motionDurationNormal,\n    backdrop-filter motionDurationNormal;\n}\n\n.modalContainer.open.in .backdrop {\n  visibility: visible;\n  opacity: opacity100;\n  pointer-events: auto;\n  z-index: elevationBackdrop;\n}\n\n.modalContainer.open.in .darkBackdrop {\n  backdrop-filter: blur(spaceXXSmall);\n  background-color: colorBackdropFill;\n}\n\n.modalHeader {\n  composes: borderBottomPrimary from '../../styles/border.module.css';\n  composes: subTitleLarge from '../../styles/typography.module.css';\n  padding: spaceSmall spaceSmall spaceSmall spaceMedium;\n  min-height: size58;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  gap: spaceXSmall;\n}\n\n.headerContent {\n  display: flex;\n}\n\n.modalBody {\n  padding: spaceMedium;\n  height: sizeFluid;\n  overflow: auto;\n}\n\n.modalFooter {\n  composes: borderTopPrimary from '../../styles/border.module.css';\n  min-height: size66;\n  background-color: colorBackgroundPrimary;\n  margin-top: auto;\n  padding: spaceSmall spaceMedium;\n  display: flex;\n  justify-content: flex-end;\n  align-items: center;\n  gap: spaceXSmall;\n}\n\n.modalFooterActions {\n  display: flex;\n  gap: spaceXSmall;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export type { BaseModalProps, ModalBodyProps, ModalFooterProps, ModalHeaderProps, ModalProps, OverlayAnchor, OverlayEventDetail, OverlayMountEvent, OverlaySize, OverlayType, OverlayUnmountEvent, } from '../../components/Modal/Modal';\nexport { FullScreenModal, Modal, ModalBody, ModalFooter, ModalHeader, OVERLAY_MOUNT_EVENT, OVERLAY_UNMOUNT_EVENT, } from '../../components/Modal/Modal';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "Modal.module.css",
        "Modal.stories.tsx",
        "Modal.tsx",
        "index.ts"
      ]
    },
    "Notification": {
      "name": "Notification",
      "path": "src/components/Notification",
      "files": {
        "main": {
          "path": "Notification.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { IconType } from '../../components/Icon';\nexport declare const NOTIFICATION_SEMANTIC: Readonly<{\n    success: \"success\";\n    information: \"information\";\n    danger: \"danger\";\n}>;\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    text?: string;\n}>;\nexport type NotificationSemanticType = (typeof NOTIFICATION_SEMANTIC)[keyof typeof NOTIFICATION_SEMANTIC];\ninterface BaseNotificationProps {\n    classNames?: ClassNames;\n    semantic: NotificationSemanticType;\n    iconLeftName?: string;\n    iconLeftType?: IconType;\n    dismissable?: boolean;\n    children?: string;\n    onCloseClick?: React.MouseEventHandler<HTMLDivElement>;\n    testId?: string;\n}\ntype NotificationBaseProps = BaseNotificationProps & {\n    classNames?: ClassNames;\n} & ({\n    dismissable: true;\n    onCloseClick?: React.MouseEventHandler<HTMLDivElement>;\n    selfDismiss?: boolean;\n} | {\n    dismissable?: false;\n    selfDismiss?: never;\n    onCloseClick?: never;\n});\nexport interface NotificationProps extends Omit<NotificationBaseProps, 'semantic'> {\n    semantic: NotificationSemanticType;\n}\nexport declare const Notification: Flow.AbstractComponent<NotificationProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=Notification.d.ts.map"
        },
        "story": {
          "path": "Notification.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {Notification, NOTIFICATION_SEMANTIC} from 'src/components/Notification';\nimport type {NotificationProps} from 'src/components/Notification/Notification';\n\nimport css from 'src/components/Notification/Notification.stories.module.css';\n\n\nconst semanticOptions: Array<unknown> = [\n  ...Object.values(NOTIFICATION_SEMANTIC),\n];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Notification',\n  argTypes: {\n    semantic: {\n      options: semanticOptions,\n      description: `Semantic type of Notification.\n        It changes the background color of the notification bar`,\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: NOTIFICATION_SEMANTIC.success},\n      },\n    },\n    onCloseClick: {\n      name: 'onCloseClick',\n      action: 'Close Click',\n      description: 'Callback function for dismissable alert',\n      type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n    },\n    dismissable: {\n      description: 'Close Icon will appear in right side in case it is true',\n      name: 'dismissable',\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    selfDismiss: {\n      description: `This prop is valid only in case dismissable is true.\n      It handles whether the dismissal should be handled by the component or it will just pass callback onclick of closeIcon and dismissal will be handled externally`,\n      name: 'selfDismiss',\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    iconLeftName: {\n      description:\n        'Left icon to be applied to the notification, it internally uses the `Icon` component to render icons',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    iconLeftType: {\n      description:\n        'Type of Left Icon. Type represents 4 unique icon styles :- Solid, Regular, Duotone and Brands',\n      options: ['regular', 'solid', 'duotone', 'brands'],\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'regular'},\n      },\n    },\n    children: {\n      description: 'Pass the notification message text as children',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    classNames: {\n      description:\n        'Provide an optional className to be applied to the wrapper, text',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{wrapper?: string, text?: string}',\n        },\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Notification component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Notification } from \"@spaced-out/ui-design-system/lib/components/Notification\";\n\\`\\`\\`\nUse Notification component to show short message of different semantics like - success, warning etc. It will take width of the container.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Notification/Notification',\n    },\n  },\n};\n\nexport const DefaultStory = (args: NotificationProps) => (\n  <div className={css.storyContainer}>\n    <Notification {...args}></Notification>\n  </div>\n);\n\nDefaultStory.args = {\n  semantic: NOTIFICATION_SEMANTIC.success,\n  iconLeftName: 'face-party',\n  children: 'The quick brown fox jumps over the lazy dog',\n  dismissable: false,\n  testId: 'notification-default-story',\n};\n\nexport const DismissableStory = (args: NotificationProps) => (\n  <div className={css.storyContainer}>\n    <Notification {...args}></Notification>\n  </div>\n);\n\nDismissableStory.args = {\n  semantic: NOTIFICATION_SEMANTIC.success,\n  children: 'The quick brown fox jumps over the lazy dog',\n  iconLeftName: 'face-party',\n  dismissable: true,\n  selfDismiss: false,\n  testId: 'notification-dismissable-story',\n};\nDefaultStory.storyName = 'Default';\nDismissableStory.storyName = 'Dismissable';\n"
        },
        "css": {
          "path": "Notification.module.css",
          "content": "@value (borderRadiusXSmall) from '../../styles/variables/_border.css';\n@value (colorFillPrimary,\n  colorTextPrimary,\n  colorSuccess,\n  colorInformation,\n  colorDanger\n) from '../../styles/variables/_color.css';\n\n@value (\n  spaceXSmall,\n  spaceSmall,\n  spaceLarge\n) from '../../styles/variables/_space.css';\n\n@value (\n  size34,\n  sizeFluid\n) from '../../styles/variables/_size.css';\n\n.baseContainer {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  justify-content: center;\n  gap: spaceXSmall;\n  width: sizeFluid;\n  min-height: size34;\n  position: relative;\n  padding: spaceXSmall spaceSmall;\n  word-break: normal;\n  overflow-wrap: anywhere;\n}\n\n.baseContainer.dismissable {\n  padding-right: spaceLarge;\n}\n\n.content {\n  display: flex;\n}\n\n.success {\n  background-color: colorSuccess;\n}\n\n.information {\n  background-color: colorInformation;\n}\n\n.danger {\n  background-color: colorDanger;\n}\n\n.closeIcon {\n  cursor: pointer;\n  position: absolute;\n  right: spaceSmall;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export { Notification, NOTIFICATION_SEMANTIC, } from '../../components/Notification/Notification';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "Notification.module.css",
        "Notification.stories.module.css",
        "Notification.stories.tsx",
        "Notification.tsx",
        "index.ts"
      ]
    },
    "OptionButton": {
      "name": "OptionButton",
      "path": "src/components/OptionButton",
      "files": {
        "main": {
          "path": "OptionButton.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { ClickAwayRefType } from '../../utils/click-away';\nimport type { ButtonProps } from '../../components/Button';\nimport type { AnchorType } from '../../components/ButtonDropdown';\nimport type { MenuOption, MenuProps } from '../../components/Menu';\nimport type { BaseTooltipProps } from '../../components/Tooltip';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    baseButtonWrapper?: string;\n    baseButtonIcon?: string;\n    optionsButtonWrapper?: string;\n    optionsButtonIcon?: string;\n    dropdownContainer?: string;\n}>;\nexport interface OptionButtonTooltipProps {\n    baseButton?: BaseTooltipProps;\n    optionsButton?: BaseTooltipProps;\n}\nexport interface OptionButtonProps extends Omit<ButtonProps, 'menu' | 'anchorPosition' | 'onOptionSelect' | 'onButtonClick' | 'onMenuOpen' | 'onMenuClose' | 'tooltip' | 'classNames' | 'clickAwayRef'> {\n    menu?: MenuProps;\n    anchorPosition?: AnchorType;\n    onOptionSelect?: (option: MenuOption, arg2?: React.SyntheticEvent<HTMLElement> | null | undefined) => unknown;\n    onButtonClick?: React.MouseEventHandler<HTMLButtonElement>;\n    onMenuOpen?: () => unknown;\n    onMenuClose?: () => unknown;\n    tooltip?: OptionButtonTooltipProps;\n    classNames?: ClassNames;\n    clickAwayRef?: React.RefObject<ClickAwayRefType | null>;\n    /**\n     * Opt in to the accessibility behavior. Forwarded to the `ButtonDropdown`\n     * this renders, which owns the trigger and the menu.\n     *\n     * Off by default, and off is this component exactly as it behaved before any\n     * of it existed.\n     */\n    enableA11y?: boolean;\n    /**\n     * Accessible name for the options button — the icon-only half of the split\n     * button, which has no text of its own. It also names the listbox that button\n     * opens, so without it the listbox ends up unnamed. Override it for another\n     * language, as `TabList` does with `overflowTabLabel`. A consumer's own\n     * `ariaLabel` still wins.\n     */\n    optionsLabel?: string;\n    testId?: string;\n}\nexport declare const OptionButton: Flow.AbstractComponent<OptionButtonProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=OptionButton.d.ts.map"
        },
        "story": {
          "path": "OptionButton.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {ClickAwayRefType} from 'src/utils/click-away';\n\nimport {BUTTON_ACTION_TYPE} from 'src/components/Button';\nimport {ANCHOR_POSITION_TYPE} from 'src/components/ButtonDropdown';\nimport type {MenuOption, MenuProps} from 'src/components/Menu';\nimport {MenuFooter, MenuHeader} from 'src/components/Menu/Menu.stories';\nimport type {OptionButtonProps} from 'src/components/OptionButton/OptionButton';\nimport {OptionButton} from 'src/components/OptionButton/OptionButton';\n\nimport css from 'src/components/OptionButton/OptionButton.stories.module.css';\n\n\nconst anchorPositionOptions: Array<unknown> = [\n  ...Object.values(ANCHOR_POSITION_TYPE),\n];\n\nconst actionTypeOptions: Array<unknown> = [\n  ...Object.values(BUTTON_ACTION_TYPE),\n];\nconst textOptions: MenuOption[] = [\n  {key: '1', label: 'Option one'},\n  {key: '2', label: 'Option two'},\n  {\n    key: '3',\n    label: 'Option three this is a very long option that would truncate',\n  },\n  {\n    key: '4',\n    label: 'Option four very long option that would truncate',\n  },\n  {key: '5', label: 'Option five(disabled)', disabled: true},\n  {\n    key: '6',\n    label: 'Option six(disabled) very long option that would truncate',\n    disabled: true,\n  },\n  {key: '7', label: 'Option Seven'},\n  {key: '8', label: 'Option Eight'},\n  {key: '9', label: 'Option Night'},\n];\n\nconst menuProps: MenuProps = {\n  isFluid: false,\n  menuDisabled: false,\n  options: textOptions,\n};\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Option Button/Generic Option Button',\n  component: OptionButton,\n  argTypes: {\n    enableA11y: {\n      description:\n        '**enableA11y** opts into the accessibility behavior: `aria-haspopup` / `aria-expanded` / `aria-controls` on the trigger, the arrow key that opens the popup, and focus moving into the menu and back. Off by default, where `OptionButton` behaves exactly as it did before any of it existed. Off here too, as everywhere: turn the control on to see the accessible behavior.',\n      control: {type: 'boolean'},\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    onButtonClick: {\n      description:\n        '**onButtonClick** handler that is applied to the root `<button>` element',\n      action: 'clicked',\n      table: {\n        type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n      },\n    },\n    menu: {\n      description:\n        '**menu** contains a list of choices as options on a temporary surface. It appears on interacts with option button.',\n      defaultValue: menuProps,\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: 'MenuProps'},\n      },\n    },\n    iconLeftName: {\n      description:\n        'Left icon to be applied to the button, it internally uses the `Icon` component to render icons',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    iconLeftType: {\n      description:\n        'Type of Left Icon. Type represents 4 unique icon styles :- Solid, Regular, Duotone and Brands',\n      options: ['regular', 'solid', 'duotone', 'brands'],\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'regular'},\n      },\n    },\n    type: {\n      options: ['primary', 'secondary', 'tertiary', 'ghost', 'danger'],\n      description: 'Type of Button. Supported types are listed on the dropdown',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'primary'},\n      },\n    },\n    actionType: {\n      options: actionTypeOptions,\n      description:\n        'Action type of Button. Supported types are listed on the dropdown',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'submit'},\n      },\n    },\n    size: {\n      description:\n        'Option Button supports only two size variants namely small and medium. `small` < `medium`',\n      control: {\n        type: 'radio',\n      },\n      options: ['small', 'medium'],\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    disabled: {\n      description: 'If **true**, the component is disabled',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    isLoading: {\n      description:\n        'If **true**, the component would show a circular loader and also preserve the current size of button so that there are no jumps',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    isFluid: {\n      description:\n        'If **true**, the component would take the container\\'s `width`',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    children: {\n      description: 'The content of the Button',\n      table: {\n        type: {summary: 'React.Component | string'},\n      },\n    },\n    ariaLabel: {\n      control: {\n        type: 'text',\n      },\n      description:\n        '**aria-label** should be used where Option Button do not have have discernible text. This would avoid accessibility violations in screen readers',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    onOptionSelect: {\n      description:\n        '**onOptionSelect** handler is triggered when there is a change in selected option',\n      action: 'clicked',\n      table: {\n        type: {\n          summary:\n            '(option: MenuOption, ?SyntheticEvent<HTMLElement>) => mixed',\n        },\n      },\n    },\n    onMenuOpen: {\n      description:\n        '**onMenuOpen** handler is triggered when menu is opened. This should be helpful in cases where you want to change Button icon / text on this trigger.',\n      action: 'clicked',\n      table: {\n        type: {summary: '() => mixed'},\n      },\n    },\n    onMenuClose: {\n      description:\n        '**onMenuClose** handler is triggered when menu is closed. This should be helpful in cases where you want to change Button icon / text on this trigger.',\n      action: 'clicked',\n      table: {\n        type: {summary: '() => mixed'},\n      },\n    },\n    anchorPosition: {\n      options: anchorPositionOptions,\n      description:\n        'Position of Menu. It can be any one value from the dropdown',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'bottom-start'},\n      },\n    },\n    classNames: {\n      description: 'External classNames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary:\n            '{wrapper?: string, baseButtonWrapper?: string, baseButtonIcon?: string, optionsButtonWrapper?: string, optionsButtonIcon?: string, dropdownContainer?: string,}',\n        },\n      },\n    },\n    tooltip: {\n      control: {\n        type: 'object',\n      },\n      description:\n        'Field to set the **Tooltip** for Base Button and Options Button',\n      table: {\n        type: {summary: 'OptionButtonTooltipProps'},\n      },\n    },\n    clickAwayRef: {\n      type: {optional: true},\n      description: 'ref that contains the functions to open or close the child',\n      table: {\n        type: {\n          summary: 'ClickAwayRefType',\n        },\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a OptionButton component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { OptionButton } from \"@spaced-out/ui-design-system/lib/components/OptionButton\";\n\\`\\`\\`\nOption Button allow users to take the main action, and also provides with multiple options related to the main action. OptionButton comes with multiple variants and has various states(hover, focus, etc). There are two parts of OptionButton, left button to perform main action, right button to select any further options related to main action.\n\n- You can always force Open  the options instance from ref by using \\`clickAwayRef.current?.forceOpen\\`. This might be useful when want to force Open as per you needs.\n- You can always force Close the options instance from ref by using \\`clickAwayRef.current?.forceClose\\`. This might be useful when want to force Close as per you needs.\n\n\n**Note: ** Always use \\`ariaLabel\\` with Icon only option button to avoid accessibility violation\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/OptionButton/OptionButton',\n    },\n  },\n};\n\nexport const DefaultStory = (args: OptionButtonProps) => (\n  <div className={css.optionBtnWrapper}>\n    <OptionButton {...args} />\n  </div>\n);\n\nDefaultStory.args = {\n  children: 'Send',\n  type: 'primary',\n  size: 'small',\n  iconLeftName: 'paper-plane-top',\n  iconRightName: 'chevron-down',\n  ariaLabel: 'Icon Button',\n  isFluid: false,\n  actionType: 'submit',\n  menu: menuProps,\n  testId: 'option-button-default-story',\n};\n\nexport const WithTruncateOptionsTooltipStory = (args: OptionButtonProps) => (\n  <div className={css.optionBtnWrapper}>\n    <OptionButton {...args} />\n  </div>\n);\n\nWithTruncateOptionsTooltipStory.args = {\n  children: 'Send',\n  type: 'primary',\n  size: 'small',\n  iconLeftName: 'paper-plane-top',\n  iconRightName: 'chevron-down',\n  ariaLabel: 'Icon Button',\n  isFluid: false,\n  actionType: 'submit',\n  menu: {...menuProps, showLabelTooltip: {maxLines: 2}},\n  testId: 'option-button-with-truncate-options-tooltip-story',\n};\n\nexport const WithTooltipStory = (args: OptionButtonProps) => (\n  <div className={css.optionBtnWrapper}>\n    <OptionButton {...args} />\n  </div>\n);\n\nWithTooltipStory.args = {\n  children: 'Send',\n  type: 'primary',\n  size: 'small',\n  iconLeftName: 'paper-plane-top',\n  iconRightName: 'chevron-down',\n  ariaLabel: 'Icon Button',\n  isFluid: false,\n  actionType: 'submit',\n  menu: menuProps,\n  tooltip: {\n    baseButton: {\n      body: 'Send now',\n      placement: 'top-start',\n    },\n    optionsButton: {\n      body: 'Schedule for later',\n      placement: 'top-end',\n    },\n  },\n  testId: 'option-button-with-tooltip-story',\n};\n\nexport const WithHeaderAndFooterStory = (args: OptionButtonProps) => (\n  <WithHeaderAndFooter {...args} />\n);\n\nexport const WithHeaderAndFooter = (args: OptionButtonProps) => {\n  const clickAwayRef = React.useRef<ClickAwayRefType | null>(null);\n  const [selectedKeys, setSelectedKeys] = React.useState<string[]>([]);\n\n  const handleOptionSelect = ({key}: MenuOption) => {\n    if (selectedKeys.includes(key)) {\n      setSelectedKeys((currentKeys) =>\n        currentKeys.filter((currKey) => currKey !== key),\n      );\n    } else {\n      setSelectedKeys((currentKeys) => [...currentKeys, key]);\n    }\n  };\n\n  const onSave = () => {\n    if (clickAwayRef.current) {\n      clickAwayRef.current?.forceClose();\n    }\n  };\n\n  return (\n    <div className={css.optionBtnWrapper}>\n      <OptionButton\n        {...args}\n        menu={{\n          ...args.menu,\n          selectedKeys,\n          header: <MenuHeader />,\n          footer: <MenuFooter onSave={onSave} />,\n        }}\n        onOptionSelect={handleOptionSelect}\n        clickAwayRef={clickAwayRef}\n      />\n    </div>\n  );\n};\n\nconst menuPropsWithHeaderAndFooter: MenuProps = {\n  options: textOptions,\n  isFluid: false,\n  menuDisabled: false,\n  optionsVariant: 'checkbox',\n};\n\nWithHeaderAndFooterStory.args = {\n  children: 'Send',\n  type: 'primary',\n  size: 'small',\n  iconLeftName: 'paper-plane-top',\n  iconRightName: 'chevron-down',\n  ariaLabel: 'Icon Button',\n  isFluid: false,\n  actionType: 'submit',\n  menu: menuPropsWithHeaderAndFooter,\n  tooltip: {\n    baseButton: {\n      body: 'Send now',\n      placement: 'top-start',\n    },\n    optionsButton: {\n      body: 'Schedule for later',\n      placement: 'top-end',\n    },\n  },\n  testId: 'option-button-with-header-and-footer-story',\n};\nDefaultStory.storyName = 'Default';\nWithTruncateOptionsTooltipStory.storyName = 'With Truncate Options Tooltip';\nWithTooltipStory.storyName = 'With Tooltip';\nWithHeaderAndFooterStory.storyName = 'With Header And Footer';\n"
        },
        "css": {
          "path": "OptionButton.module.css",
          "content": "@value (\n  borderRadiusNone\n) from '../../styles/variables/_border.css';\n\n@value (spaceXXSmall) from '../../styles/variables/_space.css';\n\n@value (sizeFluid) from '../../styles/variables/_size.css';\n\n.container {\n  display: flex;\n}\n\n.isFluid {\n  width: sizeFluid;\n}\n\n.leftButton {\n  border-top-right-radius: borderRadiusNone;\n  border-bottom-right-radius: borderRadiusNone;\n  min-width: initial;\n}\n\n.rightButton {\n  border-top-left-radius: borderRadiusNone;\n  border-bottom-left-radius: borderRadiusNone;\n  margin-left: calc(spaceXXSmall / 4);\n}\n\n.dropDownContainer {\n  width: max-content;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/OptionButton/OptionButton';\nexport * from '../../components/OptionButton/SimpleOptionButton';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "SimpleOptionButton.d.ts": {
            "path": "SimpleOptionButton.d.ts",
            "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { MenuClassNames, MenuLabelTooltip } from '../../types/menu';\nimport type { ClickAwayRefType } from '../../utils/click-away';\nimport type { ButtonProps } from '../../components/Button';\nimport type { AnchorType } from '../../components/ButtonDropdown';\nimport type { MenuOption, MenuOptionsVariant, Virtualization } from '../../components/Menu';\nimport type { OptionButtonTooltipProps } from '../../components/OptionButton/OptionButton';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    baseButtonWrapper?: string;\n    baseButtonIcon?: string;\n    optionsButtonWrapper?: string;\n    optionsButtonIcon?: string;\n    dropdownContainer?: string;\n}>;\nexport interface SimpleOptionButtonRef {\n    selectedKeys?: Array<string>;\n}\nexport interface SimpleOptionButtonProps extends Omit<ButtonProps, 'classNames' | 'anchorPosition' | 'tooltip' | 'menuSize' | 'options' | 'optionsVariant' | 'allowSearch' | 'selectedKeys' | 'menuVirtualization' | 'header' | 'footer' | 'menuClassNames' | 'showLabelTooltip' | 'allowWrap' | 'onOptionSelect' | 'onButtonClick' | 'onMenuOpen' | 'onMenuClose' | 'resolveLabel' | 'resolveSecondaryLabel' | 'clickAwayRef' | 'testId'> {\n    classNames?: ClassNames;\n    anchorPosition?: AnchorType;\n    tooltip?: OptionButtonTooltipProps;\n    menuSize?: 'small' | 'medium';\n    options?: Array<MenuOption>;\n    optionsVariant?: MenuOptionsVariant;\n    allowSearch?: boolean;\n    selectedKeys?: Array<string>;\n    menuVirtualization?: Virtualization;\n    header?: React.ReactNode;\n    footer?: React.ReactNode;\n    menuClassNames?: MenuClassNames;\n    showLabelTooltip?: MenuLabelTooltip;\n    allowWrap?: boolean;\n    onOptionSelect?: (option: MenuOption, arg2?: React.SyntheticEvent<HTMLElement> | null | undefined) => unknown;\n    onButtonClick?: React.MouseEventHandler<HTMLButtonElement>;\n    onMenuOpen?: () => unknown;\n    onMenuClose?: () => unknown;\n    resolveLabel?: (option: MenuOption) => string | React.ReactNode;\n    resolveSecondaryLabel?: (option: MenuOption) => string | React.ReactNode;\n    clickAwayRef?: React.RefObject<ClickAwayRefType | null>;\n    /**\n     * Opt in to the accessibility behavior of the `OptionButton` this renders: its\n     * ARIA roles and state, keyboard navigation of the options, and focus\n     * handling on close. Forwarded unchanged.\n     *\n     * Off by default, and off is this component exactly as it behaved before\n     * any of it existed.\n     */\n    enableA11y?: boolean;\n    testId?: string;\n}\nexport declare const SimpleOptionButton: Flow.AbstractComponent<SimpleOptionButtonProps, SimpleOptionButtonRef>;\nexport {};\n//# sourceMappingURL=SimpleOptionButton.d.ts.map"
          }
        }
      },
      "allFiles": [
        "OptionButton.module.css",
        "OptionButton.stories.module.css",
        "OptionButton.stories.tsx",
        "OptionButton.tsx",
        "SimpleOptionButton.stories.tsx",
        "SimpleOptionButton.tsx",
        "index.ts"
      ]
    },
    "PageTitle": {
      "name": "PageTitle",
      "path": "src/components/PageTitle",
      "files": {
        "main": {
          "path": "PageTitle.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    leftSlot?: string;\n    rightSlot?: string;\n}>;\nexport interface PageTitleProps {\n    classNames?: ClassNames;\n    children?: React.ReactNode;\n    pageNameKey?: string;\n    showBackButton?: boolean;\n    onBack?: () => void;\n    testId?: string;\n}\nexport declare const PAGE_NAME_LIST: Readonly<{\n    dashboard: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    tasks: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    engage: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    journeys: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    workflows: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    trm: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    analytics: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    messaging: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    chatbot: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    referrals: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    records: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    bulkCleanup: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    support: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    audit: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    timeline: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    people: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    jobs: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    contacts: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    meetings: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    contacts3: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    tracking: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    earnings: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    settings: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    broadcast: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n}>;\nexport interface TabSlotProps {\n    children?: React.ReactNode;\n    className: string;\n    testId?: string;\n}\nexport declare const TabSlot: {\n    ({ children, className, testId, ...props }: TabSlotProps): React.JSX.Element;\n    displayName: string;\n};\nexport interface RightSlotProps {\n    children?: React.ReactNode;\n    className?: string;\n    testId?: string;\n}\nexport declare const RightSlot: {\n    ({ children, testId, ...props }: RightSlotProps): React.JSX.Element;\n    displayName: string;\n};\nexport interface PageNameProps {\n    children?: React.ReactNode;\n    testId?: string;\n}\nexport declare const PageName: {\n    ({ children, testId, ...props }: PageNameProps): React.JSX.Element;\n    displayName: string;\n};\nexport declare const PageTitle: Flow.AbstractComponent<PageTitleProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=PageTitle.d.ts.map"
        },
        "story": {
          "path": "PageTitle.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {TEXT_COLORS} from 'src/types/typography';\n\nimport {Button, BUTTON_TYPES} from 'src/components/Button';\nimport {Icon} from 'src/components/Icon';\nimport type {PageTitleProps} from 'src/components/PageTitle/PageTitle';\nimport {\n  PAGE_NAME_LIST,\n  PageName,\n  PageTitle,\n  RightSlot,\n  TabSlot,\n} from 'src/components/PageTitle/PageTitle';\nimport {Tab, TabList} from 'src/components/Tabs';\nimport {TitleMedium} from 'src/components/Text';\n\nimport css from 'src/components/PageTitle/PageTitle.stories.module.css';\n\n\nconst pageNameOptions: Array<string> = [...Object.keys(PAGE_NAME_LIST)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Page Title',\n  argTypes: {\n    pageNameKey: {\n      options: pageNameOptions,\n      description:\n        'pageNameKey for different page title. It will have predefined Icon for each page and Page title for different pageNameKey',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'dashboard'},\n      },\n    },\n    classNames: {\n      description:\n        'Provide an optional className to be applied to the wrapper, leftSlot or rightSlot',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{wrapper?: string, leftSlot?: string, rightSlot?: string}',\n        },\n      },\n    },\n    showBackButton: {\n      description:\n        'Toggle visibility of back button, if **true**, back button will be visible',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {\n          summary: 'boolean',\n        },\n        defaultValue: {summary: 'false'},\n      },\n    },\n    onBack: {\n      description:\n        '**onBack** handler is triggered when back button is clicked',\n      action: 'backButtonClicked',\n      table: {\n        type: {summary: '() => void'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a PageTitle component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { PageTitle, TabSlot, RightSlot  } from \"@spaced-out/ui-design-system/lib/components/PageTitle\";\n\\`\\`\\`\nPage Title component can be used to generate the page title along with predefined page icons.\nTwo child components can be passed named as TabSlot and RightSlot. TabSlot is essentially for TabList and RightSlot is a slot for anything.\nYou can also pass <a href=\"../?path=/docs/components-page-title--custom-page-name\"> custom PageName child </a>\nif you need Page Title other than the mappings provided.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/PageTitle/PageTitle',\n    },\n  },\n};\n\nexport const PageTitleStory = (args: PageTitleProps) => (\n  <div className={css.storyContainer}>\n    <PageTitle {...args}>\n      <RightSlot className={css.rightSlot}>\n        <Button\n          ariaLabel=\"Icon Button\"\n          iconRightName=\"ellipsis\"\n          size=\"medium\"\n          type={BUTTON_TYPES.ghost}\n        />\n        <Button type={BUTTON_TYPES.secondary} size=\"medium\">\n          Button\n        </Button>\n        <Button type={BUTTON_TYPES.primary} size=\"medium\">\n          Button\n        </Button>\n      </RightSlot>\n    </PageTitle>\n  </div>\n);\n\nPageTitleStory.args = {\n  pageNameKey: 'engage',\n  testId: 'page-title-story',\n};\n\nexport const PageTitleWithTabsStory = (args: PageTitleProps) => {\n  const [selectedTab, setSelectedTab] = React.useState<\n    | {\n        label?: string;\n        tabId: string;\n      }\n    | undefined\n  >(undefined);\n  const onSelectHandler = (params: {label?: string; tabId: string}): void => {\n    setSelectedTab(params);\n  };\n\n  return (\n    <div className={css.storyContainer}>\n      <PageTitle {...args}>\n        <TabSlot className={css.tabSlot}>\n          <TabList\n            onSelect={onSelectHandler}\n            selectedTab={selectedTab}\n            size=\"medium\"\n          >\n            <Tab\n              iconName=\"trophy\"\n              iconType=\"solid\"\n              label=\"Tab Link 1\"\n              tabId=\"tab-1\"\n            />\n            <Tab\n              iconName=\"face-party\"\n              iconType=\"solid\"\n              label=\"Tab Link 2\"\n              tabId=\"tab-2\"\n            />\n            <Tab\n              iconName=\"\"\n              iconType=\"solid\"\n              label=\"Tab Link 3\"\n              tabId=\"tab-3\"\n            />\n            <Tab\n              iconName=\"\"\n              iconType=\"solid\"\n              label=\"Tab Link 4\"\n              tabId=\"tab-4\"\n            />\n            <Tab\n              iconName=\"\"\n              iconType=\"solid\"\n              label=\"Tab Link 5\"\n              tabId=\"tab-5\"\n            />\n            <Tab\n              iconName=\"\"\n              iconType=\"solid\"\n              label=\"Tab Link 6\"\n              tabId=\"tab-6\"\n            />\n            <Tab\n              iconName=\"coffee\"\n              iconType=\"solid\"\n              label=\"Tab Link 7\"\n              tabId=\"tab-7\"\n            />\n            <Tab size=\"small\" label=\"Tab Link 8\" tabId=\"tab-8\" />\n            <Tab\n              iconName=\"bookmark\"\n              iconType=\"solid\"\n              label=\"Tab Link 9\"\n              tabId=\"tab-9\"\n            />\n            <Tab\n              iconName=\"close\"\n              iconType=\"solid\"\n              label=\"Tab Link 10\"\n              tabId=\"tab-10\"\n            />\n            <Tab\n              iconName=\"bug\"\n              iconType=\"solid\"\n              label=\"Tab Link 11\"\n              tabId=\"tab-11\"\n            />\n          </TabList>\n        </TabSlot>\n\n        <RightSlot className={css.rightSlot}>\n          <Button\n            ariaLabel=\"Icon Button\"\n            iconRightName=\"ellipsis\"\n            size=\"medium\"\n            type={BUTTON_TYPES.ghost}\n          />\n          <Button type={BUTTON_TYPES.secondary} size=\"medium\">\n            Button\n          </Button>\n          <Button type={BUTTON_TYPES.primary} size=\"medium\">\n            Button\n          </Button>\n        </RightSlot>\n      </PageTitle>\n    </div>\n  );\n};\n\nPageTitleWithTabsStory.args = {\n  pageNameKey: 'engage',\n  testId: 'page-title-with-tabs-story',\n};\n\nexport const CustomPageNameStory = (_args: PageTitleProps) => (\n  <PageTitle>\n    <PageName>\n      <TitleMedium>{'Listings'}</TitleMedium>\n      <Icon\n        type=\"duotone\"\n        name=\"list\"\n        size=\"medium\"\n        color={TEXT_COLORS.primary}\n        swapOpacity={true}\n      />\n    </PageName>\n    <RightSlot className={css.rightSlot}>\n      <Button type=\"secondary\" size=\"small\">\n        Button\n      </Button>\n      <Button type=\"primary\" size=\"small\">\n        Button\n      </Button>\n    </RightSlot>\n  </PageTitle>\n);\nPageTitleStory.storyName = 'Page Title';\nPageTitleWithTabsStory.storyName = 'Page Title With Tabs';\nCustomPageNameStory.storyName = 'Custom Page Name';\n"
        },
        "css": {
          "path": "PageTitle.module.css",
          "content": "@value (colorBackgroundTertiary) from '../../styles/variables/_color.css';\n@value (spaceNone, spaceXSmall, spaceSmall, spaceMedium) from '../../styles/variables/_space.css';\n\n@value (sizeFluid) from '../../styles/variables/_size.css';\n\n.pageTitleWrapper {\n  composes: borderBottomPrimary from '../../styles/border.module.css';\n  background: colorBackgroundTertiary;\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  box-sizing: border-box;\n  padding: spaceSmall spaceMedium;\n  width: sizeFluid;\n  gap: spaceMedium;\n  height: fit-content;\n}\n\n.leftSlot {\n  display: flex;\n  flex-direction: column;\n  gap: spaceXSmall;\n  justify-content: center;\n}\n\n.pageTitle {\n  display: flex;\n  flex-direction: row;\n  gap: spaceXSmall;\n  justify-content: flex-start;\n  align-items: center;\n}\n\n.rightSlot {\n  display: flex;\n  flex-direction: column;\n  justify-content: flex-end;\n}\n\n.headerWithBackBtn {\n  display: flex;\n  gap: spaceXSmall;\n  align-items: center;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/PageTitle/PageTitle';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "PageTitle.module.css",
        "PageTitle.stories.module.css",
        "PageTitle.stories.tsx",
        "PageTitle.tsx",
        "index.ts"
      ]
    },
    "Pagination": {
      "name": "Pagination",
      "path": "src/components/Pagination",
      "files": {
        "main": {
          "path": "Pagination.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    children?: string;\n    paginator?: string;\n}>;\ntype MixedEvent = React.SyntheticEvent<EventTarget> | Event;\nexport type PaginationItemType = 'first' | 'previous' | 'page' | 'start-ellipsis' | 'end-ellipsis' | 'last' | 'next';\nexport interface PaginationBaseProps {\n    currentPage?: number;\n    disabled?: boolean;\n    onChange?: (value?: number | null | undefined, event?: MixedEvent | null | undefined) => void;\n    totalPages?: number;\n    showFirstButton?: boolean;\n    showLastButton?: boolean;\n    hideNextButton?: boolean;\n    hidePrevButton?: boolean;\n    boundaryCount?: number;\n    siblingCount?: number;\n    style?: 'primary' | 'secondary';\n    staticPaginationLabel?: string;\n}\nexport interface PaginationProps extends Omit<{\n    children?: React.ReactNode;\n}, keyof PaginationBaseProps | keyof {\n    classNames?: ClassNames;\n}>, PaginationBaseProps {\n    classNames?: ClassNames;\n    testId?: string;\n}\nexport interface PaginationItemProps {\n    id: string;\n    disabled: boolean;\n    onClick: (event: React.SyntheticEvent<HTMLElement>) => void;\n    page: number | null | undefined;\n    selected: boolean;\n    type: PaginationItemType;\n    testId?: string;\n}\nexport declare const Pagination: Flow.AbstractComponent<PaginationProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=Pagination.d.ts.map"
        },
        "story": {
          "path": "Pagination.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {Dropdown} from 'src/components/Dropdown';\nimport type {PaginationProps} from 'src/components/Pagination';\nimport {Pagination} from 'src/components/Pagination/Pagination';\nimport {SubTitleExtraSmall} from 'src/components/Text';\n\nimport css from 'src/components/Pagination/Pagination.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Pagination',\n  component: Pagination,\n  argTypes: {\n    children: {\n      description: 'Children occupy left slot of Pagination component',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: 'React.Node',\n        },\n      },\n    },\n    style: {\n      options: ['primary', 'secondary'],\n      description:\n        'Pagination component comes in two flavours. **Note:** For secondary pagination, if the total items in the dropdown > 50, virtualization is enabled by default',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {\n          summary: 'primary',\n        },\n      },\n    },\n    staticPaginationLabel: {\n      description: 'Custom language label to translate pagination text',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    classNames: {\n      description: 'Provide an optional className to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{wrapper?: string, children?: string, paginator?: string,}',\n        },\n      },\n    },\n    boundaryCount: {\n      description: 'The number of pages to be shown on left and right boundary',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {\n          summary: 'number',\n        },\n        defaultValue: {summary: '1'},\n      },\n    },\n    siblingCount: {\n      description:\n        'The number of sibling page numbers to display to the left and right of the current page',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {\n          summary: 'number',\n        },\n        defaultValue: {summary: '1'},\n      },\n    },\n    totalPages: {\n      description: 'The total number of pages in the pagination',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {\n          summary: 'number',\n        },\n        defaultValue: {summary: '1'},\n      },\n    },\n    currentPage: {\n      description: 'The current active page',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {\n          summary: 'number',\n        },\n        defaultValue: {summary: '1'},\n      },\n    },\n    onChange: {\n      description:\n        'An optional callback function that will be called every time the user clicks on any of the buttons',\n      action: 'changed',\n      table: {\n        type: {summary: '(value?: ?number, event?: ?MixedEvent) => mixed'},\n      },\n    },\n    disabled: {\n      description: 'If true, disables all the buttons on the pagination',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n      },\n    },\n    showFirstButton: {\n      description: 'If true, shows the \"first\" button',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n      },\n    },\n    showLastButton: {\n      description: 'If true, shows the \"last\" button',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n      },\n    },\n    hideNextButton: {\n      description: 'If true, hides the \"next\" button',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n      },\n    },\n    hidePrevButton: {\n      description: 'If true, hides the \"previous\" button',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Pagination component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Pagination } from \"@spaced-out/ui-design-system/lib/components/Pagination\";\n\\`\\`\\`\nWith the Pagination component, the user can choose a page of their choice from a set of available pages.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Pagination/Pagination',\n    },\n  },\n};\n\nexport const PrimaryStory = (args: PaginationProps) => {\n  const [currPage, setCurrPage] = React.useState(args.currentPage);\n\n  return (\n    <div\n      className={\n        args.style === 'secondary' ? css.largeContainer : css.container\n      }\n    >\n      <Pagination\n        {...args}\n        currentPage={currPage}\n        totalPages={args.totalPages}\n        onChange={(page) => setCurrPage(page || 1)}\n      >\n        <SubTitleExtraSmall color=\"secondary\">\n          Showing page {currPage} of {args.totalPages}\n        </SubTitleExtraSmall>\n      </Pagination>\n    </div>\n  );\n};\n\nPrimaryStory.args = {\n  totalPages: 20,\n  currentPage: 10,\n  testId: 'pagination-primary-story',\n};\n\n/** Secondary navigation supports page jump */\nexport const SecondaryStory = (args: PaginationProps) => {\n  const [currPage, setCurrPage] = React.useState(args.currentPage);\n  const [noOfPages, setNoOfPages] = React.useState(10);\n\n  const allCountOptions = ['10', '20', '50', '100'].map((option) => ({\n    key: option,\n    label: option,\n  }));\n\n  return (\n    <div\n      className={\n        args.style === 'secondary' ? css.largeContainer : css.container\n      }\n    >\n      <Pagination\n        {...args}\n        currentPage={currPage}\n        totalPages={args.totalPages}\n        onChange={(page) => setCurrPage(page || 1)}\n      >\n        <div className={css.slot}>\n          <SubTitleExtraSmall color=\"secondary\">\n            Items per page:\n          </SubTitleExtraSmall>\n          <Dropdown\n            size=\"small\"\n            classNames={{wrapper: css.dropdownWrapper}}\n            menu={{\n              options: allCountOptions,\n              isFluid: true,\n              classNames: {wrapper: css.menuWrapper},\n              selectedKeys: noOfPages ? [noOfPages.toString()] : [],\n            }}\n            dropdownInputText={noOfPages.toString()}\n            onChange={(option) => setNoOfPages(parseInt(option.key))}\n          />\n        </div>\n      </Pagination>\n    </div>\n  );\n};\n\nSecondaryStory.args = {\n  totalPages: 20,\n  currentPage: 10,\n  style: 'secondary',\n  testId: 'pagination-secondary-story',\n};\nPrimaryStory.storyName = 'Primary';\nSecondaryStory.storyName = 'Secondary';\n"
        },
        "css": {
          "path": "Pagination.module.css",
          "content": "@value (colorFillPrimary, colorTextSecondary, colorTextDisabled) from '../../styles/variables/_color.css';\n@value (spaceXXSmall, spaceNone, spaceSmall, spaceXSmall) from '../../styles/variables/_space.css';\n@value (size34, sizeFluid, size40) from '../../styles/variables/_size.css';\n\n.wrapper {\n  display: flex;\n  align-items: center;\n  width: sizeFluid;\n  height: fit-content;\n  justify-content: space-between;\n}\n\n.wrapperCompact {\n  justify-content: center;\n}\n\n.childrenSlot {\n  display: flex;\n}\n\n.paginatorSlot {\n  display: flex;\n  gap: spaceXXSmall;\n}\n\n.paginatorSlots {\n  display: flex;\n  align-items: center;\n  gap: spaceSmall;\n}\n\n.secondaryLabel {\n  margin-right: spaceXSmall;\n}\n\n.paginatorButton {\n  min-width: size34;\n  padding: spaceNone;\n  color: colorTextSecondary;\n}\n\n.pageNumbers {\n  display: flex;\n  align-items: center;\n  gap: spaceXXSmall;\n}\n\n.separator {\n  display: flex;\n  width: size34;\n  height: size34;\n  align-items: center;\n  justify-content: center;\n}\n\n.paginatorButton.disabled {\n  background-color: initial;\n}\n\n.paginatorButton.selected {\n  pointer-events: none;\n}\n\n.icon {\n  color: colorTextSecondary;\n}\n\n.icon.disabled {\n  color: colorTextDisabled;\n}\n\n.dropdownWrapper {\n  width: calc(size40 * 2);\n}\n\n.menuWrapper {\n  min-width: calc(size40 * 2);\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Pagination/Pagination';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "PaginationItem.d.ts": {
            "path": "PaginationItem.d.ts",
            "content": "import * as React from 'react';\nimport type { PaginationItemProps } from '../../components/Pagination/Pagination';\nexport declare const PaginationButton: (props: PaginationItemProps) => React.JSX.Element | undefined;\nexport declare const PaginationItem: (props: PaginationItemProps) => React.JSX.Element;\n//# sourceMappingURL=PaginationItem.d.ts.map"
          }
        }
      },
      "allFiles": [
        "Pagination.module.css",
        "Pagination.stories.module.css",
        "Pagination.stories.tsx",
        "Pagination.tsx",
        "PaginationItem.tsx",
        "index.ts"
      ]
    },
    "Panel": {
      "name": "Panel",
      "path": "src/components/Panel",
      "files": {
        "main": {
          "path": "Panel.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { ModalProps } from '../../components/Modal';\nexport type PanelSize = 'small' | 'medium' | 'large';\nexport type PanelAnchor = 'left' | 'right';\nexport interface PanelHeaderProps {\n    children?: React.ReactNode;\n    hideCloseBtn?: boolean;\n    onCloseButtonClick?: React.MouseEventHandler<HTMLButtonElement>;\n    className?: string;\n    size?: 'medium' | 'small';\n    testId?: string;\n    leftSlot?: React.ReactNode;\n    rightSlot?: React.ReactNode;\n}\ntype FooterClassNames = Readonly<{\n    wrapper?: string;\n    actions?: string;\n}>;\nexport interface PanelFooterProps {\n    children?: React.ReactNode;\n    classNames?: FooterClassNames;\n    testId?: string;\n}\nexport interface PanelBodyProps {\n    children?: React.ReactNode;\n    className?: string;\n    testId?: string;\n}\nexport interface PanelProps extends Omit<ModalProps, 'allowBackgroundInteraction' | 'size' | 'anchor'> {\n    allowBackgroundInteraction?: boolean;\n    size?: PanelSize;\n    anchor?: PanelAnchor;\n    testId?: string;\n}\nexport declare const PanelHeader: ({ children, hideCloseBtn, onCloseButtonClick, className, size, testId, rightSlot, leftSlot, }: PanelHeaderProps) => React.JSX.Element;\nexport declare const PanelBody: Flow.AbstractComponent<PanelBodyProps, HTMLDivElement>;\nexport declare const PanelFooter: ({ children, classNames, testId, }: PanelFooterProps) => React.JSX.Element;\nexport declare const Panel: ({ children, isOpen, size, anchor, onClose, hideBackdrop, classNames, customAnimation, tapOutsideToClose, allowBackgroundInteraction, testId, ...restPanelProps }: PanelProps) => React.JSX.Element;\nexport {};\n//# sourceMappingURL=Panel.d.ts.map"
        },
        "story": {
          "path": "Panel.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {Button} from 'src/components/Button';\nimport {\n  Dialog,\n  DialogBody,\n  DialogFooter,\n  DialogHeader,\n} from 'src/components/Dialog';\nimport {SimpleDropdown} from 'src/components/Dropdown';\nimport {Input} from 'src/components/Input';\nimport type {PanelProps} from 'src/components/Panel/Panel';\nimport {\n  Panel,\n  PanelBody,\n  PanelFooter,\n  PanelHeader,\n} from 'src/components/Panel/Panel';\nimport {BodyLarge, SubTitleLarge} from 'src/components/Text';\nimport {Textarea} from 'src/components/Textarea';\nimport {Tooltip} from 'src/components/Tooltip';\n\nimport css from 'src/components/Panel/Panel.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Panel',\n  argTypes: {\n    isOpen: {\n      description: 'if **true**, the modal is presented',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    classNames: {\n      description: 'External classnames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{container?: string, content?: string, backdrop?: string}',\n        },\n      },\n    },\n    tapOutsideToClose: {\n      description: 'if **true**, closes the modal on tap of backdrop',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'true'},\n      },\n    },\n    anchor: {\n      options: ['left', 'right'],\n      description: 'Position of Panel',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'left'},\n      },\n    },\n    allowBackgroundInteraction: {\n      description:\n        'if **true**, allows interaction with the background content. This would remove the backdrop layer for the panel and set tapOutsideToClose to false',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    size: {\n      description:\n        'Panel supports only three size variants namely small, medium and large. `small` < `medium` < `large`',\n      options: ['small', 'medium', 'large'],\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    children: {\n      description: 'The children to rendered inside the Modal window',\n      table: {\n        type: {summary: 'React.Node'},\n      },\n    },\n    onClose: {\n      description: '**onClose** handler is triggered on backdrop click',\n      action: 'clicked',\n      table: {\n        type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n      },\n    },\n    customAnimation: {\n      description: `\n\\`<Modal>\\` and its derivatives(\\`<Dialog>\\`, \\`<Panel>\\`) support\n\\`customAnimation: UseTransitionStylesProps\\` prop for\nall your custom animation needs.\nIt defines the following properties:\n\n- \\`duration\\` (optional): Specifies the duration of the animation in milliseconds.\nIt can be a single number to set the duration for both opening and closing animations,\nor an object with separate open and close properties to specify different durations\nfor opening and closing animations.\n- \\`initial\\` (optional): Represents the initial CSS styles for the modal component when\nit is first mounted. This property allows you to define the initial appearance of the\nmodal before any animations occur.\n- \\`open\\` (optional): Defines the CSS styles that should be applied when the modal is fully\nopened. This property specifies the appearance of the modal when it transitions from the\ninitial state to the fully open state.\n- \\`close\\` (optional): Specifies the CSS styles for the modal when it is being closed. This\nproperty determines the appearance of the modal when it transitions from the fully open\nstate to the closed state.\n- \\`common\\` (optional): Represents the CSS styles that are common to all states of the modal\ncomponent. These styles will be applied throughout the entire lifecycle of the modal,\nregardless of whether it is in the initial, open, or close state. You can use this property\nto define shared styles that should be present in all states.\n\nThe modal component follows a predefined order of states as it transitions through\nits lifecycle. It starts in the \\`unmounted\\` state, then moves to the \\`initial\\` state when mounted.\nFrom there, it can transition to the \\`open\\` state when fully opened, and then to the \\`close\\` state\nwhen being closed. Finally, it returns to the \\`unmounted\\` state when it is no longer needed.\n\nThis is the transition order: \\`unmounted\\` -> \\`initial\\` -> \\`open\\` -> \\`close\\` -> \\`unmounted\\`\nBy specifying the appropriate values for the \\`duration\\`, \\`initial\\`, \\`open\\`, \\`close\\`, and \\`common\\` properties,\nyou can control the animation and styling of the modal at each stage of its lifecycle.\n      `,\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: 'UseTransitionStylesProps'},\n      },\n    },\n    hideBackdrop: {\n      description:\n        'if **true**, dark backdrop is removed and transparent backdrop is applied on the DOM',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'true'},\n      },\n    },\n    initialFocus: {\n      description:\n        'Which element to initially focus. Can be a number (tabbable index as specified by the order)',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: '-1'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Panel component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Panel, PanelBody, PanelHeader, PanelFooter } from \"@spaced-out/ui-design-system/lib/components/Panel\";\n\\`\\`\\`\nDestinations in the app are accessible through Panels. Panels are **side sheets**, which are attached to the left or\nright edge of the screen and are surfaces with extra content. Panels can either be permanently on-screen or controlled by an **action**.\n\nPanel is a variation of a **<a href=\"../?path=/docs/components-modal--docs\">Modal</a>** with additional animation, position and size overrides.\n\nSemantically a Panel component should be composed from \\`PanelHeader\\`, \\`PanelBody\\`, and \\`PanelFooter\\` **components**, these are nothing but layout components which defines\nappropriate spacing for the children living in them. \\`PanelHeader\\` adds a close icon by default and provides a callback on click. You can pass a prop to\nshow/hide the close button as well.\nEach of these components also exposes a className\n\n---\n\n### Overlay Lifecycle Events\n\nPanel emits **strongly-typed window events** when it mounts and unmounts (see **<a href=\"../?path=/docs/components-modal--docs\">Modal docs</a>** for the full API reference, all event types, and advanced usage patterns).\n\nPanel-specific fields in the event payload:\n\n| Field | Value |\n|---|---|\n| \\`overlayType\\` | \\`'Panel'\\` |\n| \\`size\\` | \\`'small' \\\\| 'medium' \\\\| 'large'\\` (from the \\`size\\` prop) |\n| \\`anchor\\` | \\`'left' \\\\| 'right'\\` (from the \\`anchor\\` prop) |\n| \\`hasBackdrop\\` | Derived from \\`hideBackdrop\\` (default \\`false\\` for Panel) |\n| \\`allowBackgroundInteraction\\` | From the \\`allowBackgroundInteraction\\` prop |\n\n**Listening for Panel events:**\n\n\\`\\`\\`ts\nimport {\n  OVERLAY_MOUNT_EVENT,\n  OVERLAY_UNMOUNT_EVENT,\n} from \"@spaced-out/ui-design-system/lib/components/Modal\";\n\nwindow.addEventListener(OVERLAY_MOUNT_EVENT, (e) => {\n  if (e.detail.overlayType === 'Panel') {\n    console.log(\\\\\\`Panel opened: size=\\\\\\${e.detail.size}, anchor=\\\\\\${e.detail.anchor}\\\\\\`);\n  }\n});\n\nwindow.addEventListener(OVERLAY_UNMOUNT_EVENT, (e) => {\n  if (e.detail.overlayType === 'Panel') {\n    console.log(\\\\\\`Panel closed: id=\\\\\\${e.detail.id}\\\\\\`);\n  }\n});\n\\`\\`\\`\n\n**Example payload (Panel, right, medium):**\n\n\\`\\`\\`json\n{\n  \"id\": \"d4e5f6\",\n  \"overlayType\": \"Panel\",\n  \"size\": \"medium\",\n  \"anchor\": \"right\",\n  \"hasBackdrop\": false,\n  \"tapOutsideToClose\": true,\n  \"allowBackgroundInteraction\": false,\n  \"testId\": \"my-panel\"\n}\n\\`\\`\\`\n          `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Panel/Panel',\n    },\n  },\n};\n\nexport const NormalStory = (args: PanelProps) => {\n  const [isOpen, setIsOpen] = React.useState(args.isOpen);\n\n  React.useEffect(() => {\n    setIsOpen(args.isOpen);\n  }, [args.isOpen]);\n\n  return (\n    <div className={css.container}>\n      <Button onClick={() => setIsOpen(!isOpen)}>Open Panel</Button>\n      <Panel {...args} isOpen={isOpen} onClose={() => setIsOpen(false)}>\n        <PanelHeader onCloseButtonClick={() => setIsOpen(false)} size=\"medium\">\n          <SubTitleLarge>Panel Title</SubTitleLarge>\n        </PanelHeader>\n\n        <PanelBody>\n          <Input\n            type=\"email\"\n            label=\"Email Address\"\n            placeholder=\"Enter your email address\"\n          />\n          <br />\n          <SimpleDropdown\n            label=\"Issue Type\"\n            placeholder=\"Select an issue type\"\n            options={[\n              {\n                iconLeft: 'bug',\n                iconLeftType: 'duotone',\n                key: '1',\n                label: 'Production Issue',\n              },\n              {\n                iconLeft: 'bug-slash',\n                iconLeftType: 'duotone',\n                key: '2',\n                label: 'Dev Issue',\n              },\n              {\n                iconLeft: 'ban-bug',\n                iconLeftType: 'duotone',\n                key: '4',\n                label: 'Product Issue',\n              },\n            ]}\n          />\n          <br />\n          <Textarea\n            label=\"Description\"\n            placeholder=\"Enter the issue description\"\n          />\n        </PanelBody>\n\n        <PanelFooter>\n          <Button type=\"tertiary\" onClick={() => setIsOpen(false)}>\n            Close\n          </Button>\n          <Button type=\"secondary\" onClick={() => setIsOpen(false)}>\n            Save\n          </Button>\n        </PanelFooter>\n      </Panel>\n    </div>\n  );\n};\n\nNormalStory.args = {\n  anchor: 'right',\n  size: 'medium',\n  tapOutsideToClose: true,\n  initialFocus: 1,\n  testId: 'panel-normal-story',\n};\n\nexport const WithNestedDialogStory = (args: PanelProps) => {\n  const [isOpen, setIsOpen] = React.useState<boolean>(args.isOpen || false);\n  const [isOpen2, setIsOpen2] = React.useState(false);\n\n  React.useEffect(() => {\n    setIsOpen(args.isOpen || false);\n  }, [args.isOpen]);\n\n  return (\n    <div className={css.container}>\n      <Button onClick={() => setIsOpen(!isOpen)}>\n        Open Panel With Nested Dialog\n      </Button>\n      <Panel {...args} isOpen={isOpen} onClose={() => setIsOpen(false)}>\n        <PanelHeader onCloseButtonClick={() => setIsOpen(false)} size=\"medium\">\n          <SubTitleLarge>Panel Title(First Elevation)</SubTitleLarge>\n        </PanelHeader>\n\n        <PanelBody>\n          <Input\n            type=\"email\"\n            label=\"Email Address\"\n            placeholder=\"Enter your email address\"\n          />\n          <br />\n          <SimpleDropdown\n            label=\"Issue Type\"\n            placeholder=\"Select an issue type\"\n            options={[\n              {\n                iconLeft: 'bug',\n                iconLeftType: 'duotone',\n                key: '1',\n                label: 'Production Issue',\n              },\n              {\n                iconLeft: 'bug-slash',\n                iconLeftType: 'duotone',\n                key: '2',\n                label: 'Dev Issue',\n              },\n              {\n                iconLeft: 'ban-bug',\n                iconLeftType: 'duotone',\n                key: '4',\n                label: 'Product Issue',\n              },\n            ]}\n          />\n          <br />\n          <Textarea\n            label=\"Description\"\n            placeholder=\"Enter the issue description\"\n          />\n          <Dialog\n            initialFocus={1}\n            onClose={() => setIsOpen2(false)}\n            semantic=\"neutral\"\n            isOpen={isOpen2}\n          >\n            <DialogHeader>\n              <SubTitleLarge> Dialog Title</SubTitleLarge>\n            </DialogHeader>\n            <DialogBody>\n              <BodyLarge color=\"secondary\">\n                Dialogs should only be used occasionally because they are\n                intended to be disruptive. Dialogs come in multiple variants.\n              </BodyLarge>\n            </DialogBody>\n            <DialogFooter>\n              <Button isFluid onClick={() => setIsOpen2(false)} type=\"tertiary\">\n                Close\n              </Button>\n              <Button\n                isFluid\n                onClick={() => setIsOpen2(false)}\n                type=\"secondary\"\n              >\n                Confirm\n              </Button>\n            </DialogFooter>\n          </Dialog>\n        </PanelBody>\n\n        <PanelFooter>\n          <Button type=\"tertiary\" onClick={() => setIsOpen(false)}>\n            Close\n          </Button>\n          <Button type=\"secondary\" onClick={() => setIsOpen2(true)}>\n            Open Nested Dialog\n          </Button>\n        </PanelFooter>\n      </Panel>\n    </div>\n  );\n};\n\nWithNestedDialogStory.args = {\n  anchor: 'right',\n  size: 'medium',\n  tapOutsideToClose: true,\n  initialFocus: 1,\n  testId: 'panel-with-nested-dialog-story',\n};\n\nexport const WithInteractiveBackgroundStory = (args: PanelProps) => {\n  const [isOpen, setIsOpen] = React.useState(args.isOpen);\n\n  React.useEffect(() => {\n    setIsOpen(args.isOpen);\n  }, [args.isOpen]);\n\n  return (\n    <div className={css.container}>\n      <Button onClick={() => setIsOpen(!isOpen)}>Open Panel</Button>\n      <div className={css.interactionContainer}>\n        <Tooltip\n          body=\"When the panel opens, the background content is interactive\"\n          bodyMaxLines={2}\n          placement=\"top\"\n          title=\"I am interactive tooltip\"\n        >\n          <Button iconLeftName=\"face-sunglasses\" type=\"tertiary\">\n            Hover Me after opening the panel\n          </Button>\n        </Tooltip>\n      </div>\n\n      <Panel {...args} isOpen={isOpen} onClose={() => setIsOpen(false)}>\n        <PanelHeader onCloseButtonClick={() => setIsOpen(false)} size=\"medium\">\n          <SubTitleLarge>Panel Title</SubTitleLarge>\n        </PanelHeader>\n\n        <PanelBody>\n          <Input\n            type=\"email\"\n            label=\"Email Address\"\n            placeholder=\"Enter your email address\"\n          />\n          <br />\n          <SimpleDropdown\n            label=\"Issue Type\"\n            placeholder=\"Select an issue type\"\n            options={[\n              {\n                iconLeft: 'bug',\n                iconLeftType: 'duotone',\n                key: '1',\n                label: 'Production Issue',\n              },\n              {\n                iconLeft: 'bug-slash',\n                iconLeftType: 'duotone',\n                key: '2',\n                label: 'Dev Issue',\n              },\n              {\n                iconLeft: 'ban-bug',\n                iconLeftType: 'duotone',\n                key: '4',\n                label: 'Product Issue',\n              },\n            ]}\n          />\n          <br />\n          <Textarea\n            label=\"Description\"\n            placeholder=\"Enter the issue description\"\n          />\n        </PanelBody>\n\n        <PanelFooter>\n          <Button type=\"tertiary\" onClick={() => setIsOpen(false)}>\n            Close\n          </Button>\n          <Button type=\"secondary\" onClick={() => setIsOpen(false)}>\n            Save\n          </Button>\n        </PanelFooter>\n      </Panel>\n    </div>\n  );\n};\n\nWithInteractiveBackgroundStory.args = {\n  anchor: 'right',\n  size: 'medium',\n  initialFocus: 1,\n  allowBackgroundInteraction: true,\n  testId: 'panel-with-interactive-background-story',\n};\n\nexport const WithHeaderSlotsStory = (args: PanelProps) => {\n  const [isOpen, setIsOpen] = React.useState(args.isOpen);\n\n  React.useEffect(() => {\n    setIsOpen(args.isOpen);\n  }, [args.isOpen]);\n\n  return (\n    <div className={css.container}>\n      <Button onClick={() => setIsOpen(!isOpen)}>Open Panel</Button>\n      <Panel {...args} isOpen={isOpen} onClose={() => setIsOpen(false)}>\n        <PanelHeader\n          onCloseButtonClick={() => setIsOpen(false)}\n          size=\"medium\"\n          leftSlot={<Button iconLeftName=\"bookmark\" type=\"tertiary\" />}\n          rightSlot={\n            <div className={css.headerRightSlot}>\n              <Button\n                iconLeftName=\"circle-info\"\n                type=\"ghost\"\n                classNames={{wrapper: css.helpButton}}\n              >\n                Help\n              </Button>\n            </div>\n          }\n        >\n          <SubTitleLarge>Panel Title</SubTitleLarge>\n        </PanelHeader>\n\n        <PanelBody>\n          <Input\n            type=\"email\"\n            label=\"Email Address\"\n            placeholder=\"Enter your email address\"\n          />\n          <br />\n          <SimpleDropdown\n            label=\"Issue Type\"\n            placeholder=\"Select an issue type\"\n            options={[\n              {\n                iconLeft: 'bug',\n                iconLeftType: 'duotone',\n                key: '1',\n                label: 'Production Issue',\n              },\n              {\n                iconLeft: 'bug-slash',\n                iconLeftType: 'duotone',\n                key: '2',\n                label: 'Dev Issue',\n              },\n              {\n                iconLeft: 'ban-bug',\n                iconLeftType: 'duotone',\n                key: '4',\n                label: 'Product Issue',\n              },\n            ]}\n          />\n          <br />\n          <Textarea\n            label=\"Description\"\n            placeholder=\"Enter the issue description\"\n          />\n        </PanelBody>\n\n        <PanelFooter>\n          <Button type=\"tertiary\" onClick={() => setIsOpen(false)}>\n            Close\n          </Button>\n          <Button type=\"secondary\" onClick={() => setIsOpen(false)}>\n            Save\n          </Button>\n        </PanelFooter>\n      </Panel>\n    </div>\n  );\n};\n\nWithHeaderSlotsStory.args = {\n  anchor: 'right',\n  size: 'medium',\n  tapOutsideToClose: true,\n  initialFocus: 1,\n  testId: 'panel-with-header-slots-story',\n};\n\nNormalStory.storyName = 'Normal';\nWithNestedDialogStory.storyName = 'With Nested Dialog';\nWithInteractiveBackgroundStory.storyName = 'With Interactive Background';\nWithHeaderSlotsStory.storyName = 'With Header Slots';\n"
        },
        "css": {
          "path": "Panel.module.css",
          "content": "@value (spaceNegFluid, spaceNone, spaceMedium, spaceSmall, spaceFluid) from '../../styles/variables/_space.css';\n@value (size4, size60, size480, size580, size720, sizeFluid) from '../../styles/variables/_size.css';\n@value (motionDurationNormal, motionEaseInEaseOut) from '../../styles/variables/_motion.css';\n@value (colorBackgroundTertiary, colorBackgroundPrimary) from '../../styles/variables/_color.css';\n@value (borderRadiusNone) from '../../styles/variables/_border.css';\n\n.panel {\n  opacity: initial;\n  height: sizeFluid;\n  background-color: colorBackgroundTertiary;\n  border-radius: borderRadiusNone;\n}\n\n.small {\n  width: size480;\n}\n\n.medium {\n  width: size580;\n}\n\n.large {\n  width: size720;\n}\n\n.panel.left {\n  top: spaceNone;\n  left: spaceNone;\n  right: initial;\n  transform: translateX(spaceNegFluid);\n}\n\n.panel.right {\n  top: spaceNone;\n  right: spaceNone;\n  left: initial;\n  transform: translateX(spaceFluid);\n}\n\n.panelContainer.open.in .left,\n.panelContainer.open.in .right {\n  transform: translateX(spaceNone);\n}\n\n.panelHeader {\n  composes: borderBottomPrimary from '../../styles/border.module.css';\n  composes: subTitleLarge from '../../styles/typography.module.css';\n  padding: spaceNone spaceSmall spaceNone spaceMedium;\n  min-height: size60;\n  display: flex;\n  align-items: center;\n  gap: spaceSmall;\n  background-color: colorBackgroundTertiary;\n}\n\n.headerContent {\n  display: flex;\n}\n\n.closeButton {\n  margin-left: auto;\n}\n\n.panelBody {\n  padding: spaceMedium;\n  height: sizeFluid;\n  overflow: auto;\n  background-color: colorBackgroundPrimary;\n}\n\n.panelFooter {\n  composes: borderTopPrimary from '../../styles/border.module.css';\n  background-color: colorBackgroundTertiary;\n  margin-top: auto;\n  padding: spaceMedium;\n  display: flex;\n  justify-content: flex-end;\n  align-items: center;\n  gap: spaceSmall;\n}\n\n.panelFooterActions {\n  display: flex;\n  gap: spaceSmall;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export type { PanelAnchor, PanelBodyProps, PanelFooterProps, PanelHeaderProps, PanelProps, PanelSize, } from '../../components/Panel/Panel';\nexport { Panel, PanelBody, PanelFooter, PanelHeader, } from '../../components/Panel/Panel';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "Panel.module.css",
        "Panel.stories.module.css",
        "Panel.stories.tsx",
        "Panel.tsx",
        "index.ts"
      ]
    },
    "PastChatCard": {
      "name": "PastChatCard",
      "path": "src/components/PastChatCard",
      "files": {
        "main": {
          "path": "PastChatCard.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport { type AlertSemanticType } from '../../types/common';\nimport type { IconSize, IconType } from '../../components/Icon';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n}>;\nexport interface PastChatCardProps {\n    title: string;\n    subTitle: string;\n    iconName?: string;\n    iconType?: IconType;\n    iconSize?: IconSize;\n    semantic?: AlertSemanticType;\n    disabled?: boolean;\n    classNames?: ClassNames;\n    onClick?: (event: React.SyntheticEvent<HTMLDivElement>) => void;\n    testId?: string;\n}\nexport declare const PastChatCard: Flow.AbstractComponent<PastChatCardProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=PastChatCard.d.ts.map"
        },
        "story": {
          "path": "PastChatCard.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {ALERT_SEMANTIC} from 'src/types/common';\n\nimport {ICON_SIZE, ICON_TYPE} from 'src/components/Icon';\nimport type {PastChatCardProps} from 'src/components/PastChatCard/PastChatCard';\nimport {PastChatCard} from 'src/components/PastChatCard/PastChatCard';\n\nimport css from 'src/components/PastChatCard/PastChatCard.stories.module.css';\n\n\nconst iconTypeOptions: Array<unknown> = [...Object.values(ICON_TYPE)];\nconst iconSizeOptions: Array<unknown> = [...Object.values(ICON_SIZE)];\nconst semanticOptions: Array<unknown> = [...Object.values(ALERT_SEMANTIC)];\n\nconst meta = {\n  tags: ['autodocs'],\n  title: 'Components/Past Chat Card',\n  component: PastChatCard,\n  argTypes: {\n    title: {\n      description: 'The main title text displayed in the card',\n      control: {type: 'text'},\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    subTitle: {\n      description: 'The text displayed below the title',\n      control: {type: 'text'},\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    iconName: {\n      description: 'Name of the icon to be displayed in the PastChatCard.',\n      control: {type: 'text'},\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    iconType: {\n      description: 'The type of icon (solid, regular, duotone, brands)',\n      control: {type: 'select'},\n      options: iconTypeOptions,\n      table: {\n        type: {summary: 'IconType'},\n        defaultValue: {summary: ICON_TYPE.solid},\n      },\n    },\n    iconSize: {\n      description: 'The size of the icon',\n      control: {type: 'select'},\n      options: iconSizeOptions,\n      table: {\n        type: {summary: 'IconSize'},\n        defaultValue: {summary: ICON_SIZE.small},\n      },\n    },\n    semantic: {\n      description: 'Semantic of the icon to be displayed in the PastChatCard.',\n      control: {type: 'select'},\n      options: semanticOptions,\n      table: {\n        type: {summary: 'AlertSemanticType'},\n        defaultValue: {summary: ALERT_SEMANTIC.neutral},\n      },\n    },\n    disabled: {\n      description: 'If **true**, the card will be in disabled state',\n      control: {type: 'boolean'},\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    classNames: {\n      description:\n        'Additional CSS classes to customize the appearance of the PastChatCard.',\n      control: {type: 'object'},\n      table: {\n        type: {summary: '{ wrapper?: string }'},\n      },\n    },\n    onClick: {\n      description: 'onClick handler that is applied to the root <div> element.',\n      action: 'clicked',\n      table: {\n        type: {\n          summary: '(event: React.SyntheticEvent<HTMLDivElement>) => void',\n        },\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a PastChatCard component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { PastChatCard } from \"@spaced-out/ui-design-system/lib/components/PastChatCard\";\n\\`\\`\\`\nPastChatCard component is for displaying past chat conversations with an optional icon, title, subtitle, and chevron indicator.\nThe card supports hover and focus states for interactive use.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/PastChatCard/PastChatCard.tsx',\n    },\n  },\n};\n\nexport default meta;\n\nexport const Default = {\n  render: (args: PastChatCardProps) => (\n    <div className={css.container}>\n      <PastChatCard {...args} />\n    </div>\n  ),\n  args: {\n    title: 'Meeting scheduled rates last 30 days',\n    subTitle: 'Sep 19, 9:28 AM',\n    iconName: 'analytics',\n    iconType: ICON_TYPE.solid,\n    iconSize: ICON_SIZE.small,\n    semantic: ALERT_SEMANTIC.information,\n  },\n};\n\nexport const MultipleCards = {\n  render: () => (\n    <div className={css.container}>\n      <div className={css.multipleCardsContainer}>\n        <PastChatCard\n          title=\"Meeting scheduled rates last 30 days\"\n          subTitle=\"Sep 19, 9:28 AM\"\n          iconName=\"analytics\"\n          iconType={ICON_TYPE.solid}\n          iconSize={ICON_SIZE.small}\n          semantic={ALERT_SEMANTIC.information}\n        />\n        <PastChatCard\n          title=\"Weekly sales report\"\n          subTitle=\"Sep 18, 2:15 PM\"\n          iconName=\"file-chart-column\"\n          iconType={ICON_TYPE.solid}\n          iconSize={ICON_SIZE.small}\n          semantic={ALERT_SEMANTIC.danger}\n        />\n        <PastChatCard\n          title=\"Customer feedback summary\"\n          subTitle=\"Sep 17, 11:45 AM\"\n        />\n      </div>\n    </div>\n  ),\n};\n\nexport const Disabled = {\n  render: (args: PastChatCardProps) => (\n    <div className={css.container}>\n      <PastChatCard {...args} />\n    </div>\n  ),\n  args: {\n    title: 'Meeting scheduled rates last 30 days',\n    subTitle: 'Sep 19, 9:28 AM',\n    iconName: 'analytics',\n    iconType: ICON_TYPE.solid,\n    iconSize: ICON_SIZE.small,\n    semantic: ALERT_SEMANTIC.information,\n    disabled: true,\n  },\n};\n"
        },
        "css": {
          "path": "PastChatCard.module.css",
          "content": "@value (\n  spaceSmall,\n  spaceXSmall,\n  spaceXXSmall\n) from '../../styles/variables/_space.css';\n\n@value (\n  colorBorderPrimary,\n  colorBorderTertiary,\n  colorBackgroundTertiary,\n  colorBackgroundPrimary,\n  colorFocusPrimary,\n  colorTextClickable\n) from '../../styles/variables/_color.css';\n\n@value (\n  borderWidthPrimary,\n  borderWidthTertiary,\n  borderWidthNone,\n  borderRadiusSmall\n) from '../../styles/variables/_border.css';\n\n@value (\n  sizeFluid\n) from '../../styles/variables/_size.css';\n\n.card {\n  display: flex;\n  align-items: center;\n  gap: spaceXSmall;\n  padding: spaceSmall;\n  background-color: colorBackgroundTertiary;\n  composes: borderPrimary from '../../styles/border.module.css';\n  border-radius: borderRadiusSmall;\n  cursor: pointer;\n  width: sizeFluid;\n  min-width: fit-content;\n\n  &:focus {\n    border-color: colorTextClickable;\n    box-shadow: borderWidthNone borderWidthNone borderWidthNone\n      borderWidthTertiary colorFocusPrimary;\n    outline: none;\n  }\n\n  &:hover {\n    background-color: colorBackgroundPrimary;\n\n    &:not(:focus) {\n      border-color: colorBorderTertiary;\n    }\n  }\n\n  &.disabled {\n    cursor: not-allowed;\n    pointer-events: none;\n  }\n}\n\n.textContent {\n  display: flex;\n  flex-direction: column;\n  gap: spaceXXSmall;\n  flex: 1;\n}\n\n.title,\n.subTitle {\n  width: sizeFluid;\n}\n\n.chevronIcon {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.semanticIcon {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border-radius: borderRadiusSmall;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/PastChatCard/PastChatCard';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "PastChatCard.module.css",
        "PastChatCard.stories.module.css",
        "PastChatCard.stories.tsx",
        "PastChatCard.tsx",
        "index.ts"
      ]
    },
    "Popover": {
      "name": "Popover",
      "path": "src/components/Popover",
      "files": {
        "main": {
          "path": "Popover.d.ts",
          "content": "import * as React from 'react';\nimport type { PaddingSizeType } from '../../components/Card';\nimport type { ElevationType } from '../../components/Tooltip';\ntype ClassNames = Readonly<{\n    popover?: string;\n    card?: string;\n}>;\nexport declare const POPOVER_PLACEMENTS: readonly string[];\nexport type PopoverPlacementType = 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end' | 'right' | 'right-start' | 'right-end';\nexport interface PopoverChildProps {\n    className?: string;\n    children: React.ReactNode;\n    testId?: string;\n}\nexport declare const PopoverHeader: (props: PopoverChildProps) => React.JSX.Element;\nexport declare const PopoverTitle: (props: PopoverChildProps) => React.JSX.Element;\nexport declare const PopoverActions: (props: PopoverChildProps) => React.JSX.Element;\nexport declare const PopoverContent: ({ className, ...props }: PopoverChildProps) => React.JSX.Element;\nexport declare const PopoverFooter: (props: PopoverChildProps) => React.JSX.Element;\nexport interface BasePopoverProps {\n    classNames?: ClassNames;\n    content?: React.ReactNode;\n    placement?: PopoverPlacementType;\n    offset?: number;\n    padding?: PaddingSizeType;\n    isOpen?: boolean;\n    defaultOpen?: boolean;\n    onOpenChange?: (isOpen: boolean) => unknown;\n    disabled?: boolean;\n    elevation?: ElevationType;\n    testId?: string;\n}\nexport interface PopoverProps extends BasePopoverProps {\n    children: React.ReactNode;\n}\nexport declare const Popover: ({ classNames, children, content, placement, offset, padding, isOpen, defaultOpen, onOpenChange, disabled, elevation, testId, }: PopoverProps) => React.JSX.Element;\nexport {};\n//# sourceMappingURL=Popover.d.ts.map"
        },
        "story": {
          "path": "Popover.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {Avatar} from 'src/components/Avatar';\nimport {Button} from 'src/components/Button';\nimport {SimpleButtonDropdown} from 'src/components/ButtonDropdown';\nimport {ClickableIcon, Icon} from 'src/components/Icon';\nimport type {MenuOption} from 'src/components/Menu';\nimport type {PopoverProps} from 'src/components/Popover/Popover';\nimport {Popover, POPOVER_PLACEMENTS} from 'src/components/Popover/Popover';\nimport {Separator} from 'src/components/Separator';\nimport {BodySmall, SubTitleMedium} from 'src/components/Text';\nimport {ELEVATION_TYPES} from 'src/components/Tooltip';\nimport {Truncate} from 'src/components/Truncate';\n\nimport css from 'src/components/Popover/Popover.stories.module.css';\n\n\nconst placementOptions: Array<unknown> = [...POPOVER_PLACEMENTS];\n\nconst elevationOptions: Array<unknown> = [...Object.values(ELEVATION_TYPES)];\n\nconst paddingOptions: Array<unknown> = ['none', 'small', 'medium', 'large'];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Popover',\n  argTypes: {\n    content: {\n      description: `**Content** of the popover. It is rendered inside a \\`<Card>\\`,\n        so you only need to pass what goes inside the card. Accepts any react node -\n        text, a list, a form or a whole profile summary`,\n      control: {\n        type: 'null',\n      },\n      table: {\n        type: {summary: 'React.Node'},\n      },\n    },\n    children: {\n      type: {required: true},\n      description: `React Node that the popover wraps on and uses as its trigger.\n        Popover preserves the consumer's references`,\n      control: {\n        type: 'null',\n      },\n      table: {\n        type: {summary: 'React.Node'},\n      },\n    },\n    placement: {\n      options: placementOptions,\n      description: 'Placement of the popover with respect to the trigger',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'bottom'},\n      },\n    },\n    offset: {\n      description: 'Distance in **px** between the trigger and the popover',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: 8},\n      },\n    },\n    padding: {\n      options: paddingOptions,\n      description: 'Padding applied on all sides of the popover `<Card>`',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    isOpen: {\n      description: `Open state of the popover. Pass this along with \\`onOpenChange\\`\n        to control the popover from outside. Leave it **undefined** to let the popover\n        manage its own state`,\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n      },\n    },\n    defaultOpen: {\n      description:\n        'Initial open state of the uncontrolled popover. Ignored when `isOpen` is passed',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    onOpenChange: {\n      description: `Called with the next open state whenever the popover is opened or\n        dismissed - trigger click, outside click or \\`Esc\\``,\n      table: {\n        type: {summary: '(isOpen: boolean) => unknown'},\n      },\n    },\n    disabled: {\n      description:\n        'If set to **true**, the trigger stops opening the popover and an already open popover is closed',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    elevation: {\n      description:\n        'z-index of the popover. This is by default set to elevationMenu which is `12`. Use this prop when you want to render the popover at higher elevation elements like Modal, Toast, etc.',\n      options: elevationOptions,\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'menu'},\n      },\n    },\n    classNames: {\n      description: 'External classnames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: '{popover?: string, card?: string}'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Popover component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport {\n  Popover,\n  PopoverHeader,\n  PopoverTitle,\n  PopoverActions,\n  PopoverContent,\n  PopoverFooter\n} from \"@spaced-out/ui-design-system/lib/components/Popover\";\n\\`\\`\\`\nA **popover** shows rich content on top of the page when the user clicks its trigger. Unlike a\n\\`Tooltip\\`, it opens on **click**, its content can be focused and interacted with, and it is\ndismissed by clicking the trigger again, clicking outside or pressing \\`Esc\\`.\n\n\\`Popover\\` should be wrapped over the element that acts as the trigger, and the floating content is\npassed through the \\`content\\` prop. Content is always rendered inside a \\`<Card>\\`, so you only pass\nwhat goes inside it.\n\nFor anything more than a single block of content, compose it out of \\`<PopoverHeader>\\`,\n\\`<PopoverContent>\\` and \\`<PopoverFooter>\\`. These are the \\`<Card>\\` parts of the same name, so the\ndividers and typography match a \\`<Card>\\`. Once any of them is present the surface stops padding\nitself and \\`<PopoverContent>\\` carries the \\`padding\\` prop instead, which keeps the header and footer\nrunning edge to edge.\n\nInside a header or a footer, use \\`<PopoverTitle>\\` for the label and \\`<PopoverActions>\\` to group the\nbuttons. Actions are pushed to the far end of the row, so a title and a set of actions sit at\nopposite edges without any extra styling.\n\nThere are 12 possible placements for the Popover. Popover container has a max-width of \\`320px\\`.\n\n**Note:** \\`<Popover>\\` gets attached to \\`<body>\\`. You can manage elevation of the popover when you want to use it at elevated surfaces.\n\n**Note:** \\`<Popover>\\` trigger needs ref to work. If you are not able to provide ref normally, you would need to wrap the component in a \\`<div>\\`.\n\n**Note:** when the trigger lives inside a \\`<Menu>\\` option, raise \\`elevation\\` above \\`menu\\` or the popover\npaints under the open menu, and stop the trigger's click from bubbling so opening the popover does not\nalso pick the option. Because the popover is portaled, a click **inside** it counts as a click away for\nthe surrounding dropdown - \\`ButtonDropdown\\` does not pass \\`containsNestedFloatingPortals\\` to\n\\`ClickAway\\`, so keep such popovers read-only for now.\n\n\\`\\`\\`jsx\n/* Prefer a \\`<ClickableIcon>\\` over a bare \\`<Icon>\\` for an icon trigger - it is a real\nbutton, so it is focusable and announced, and it takes the popover's ref directly */\n<Popover content={<BodySmall>Anything can go in here</BodySmall>}>\n  <ClickableIcon name=\"circle-info\" color=\"tertiary\" ariaLabel=\"More info\" />\n</Popover>\n\n/* Controlled popover */\nconst [isOpen, setIsOpen] = React.useState(false);\n\n<Popover\n  isOpen={isOpen}\n  onOpenChange={setIsOpen}\n  placement=\"bottom-start\"\n  content={<ProfileDetails />}\n>\n  <Button type=\"tertiary\">John Doe</Button>\n</Popover>\n\n/* Popover with a header and a footer */\n<Popover\n  placement=\"bottom-start\"\n  content={\n    <>\n      <PopoverHeader>\n        <PopoverTitle>Filter jobs</PopoverTitle>\n        <PopoverActions>\n          <Button type=\"ghost\" size=\"small\" iconLeftName=\"xmark\" ariaLabel=\"Close\" />\n        </PopoverActions>\n      </PopoverHeader>\n      <PopoverContent>\n        <JobFilters />\n      </PopoverContent>\n      <PopoverFooter>\n        <Button type=\"tertiary\" size=\"small\">Clear all</Button>\n        <PopoverActions>\n          <Button type=\"primary\" size=\"small\">Apply</Button>\n        </PopoverActions>\n      </PopoverFooter>\n    </>\n  }\n>\n  <Button type=\"tertiary\" iconLeftName=\"filter\">Filters</Button>\n</Popover>\n\\`\\`\\`\n          `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Popover/Popover',\n    },\n  },\n};\n\nconst DetailRow = ({\n  iconName,\n  children,\n}: {\n  iconName: string;\n  children: React.ReactNode;\n}) => (\n  <div className={css.detailRow}>\n    <Icon name={iconName} size=\"small\" color=\"tertiary\" />\n    <BodySmall color=\"secondary\">{children}</BodySmall>\n  </div>\n);\n\nconst ProfileDetails = () => (\n  <div className={css.profile}>\n    <div className={css.profileHeader}>\n      <Avatar\n        imageSrc=\"https://cdn.sensehq.com/genesis/hashed/static/images/personas/1.png\"\n        size=\"large\"\n        ring\n      />\n      <div className={css.profileHeading}>\n        <SubTitleMedium>John Doe</SubTitleMedium>\n        <BodySmall color=\"tertiary\">@john.doe</BodySmall>\n      </div>\n    </div>\n\n    <div className={css.detailsGroup}>\n      <DetailRow iconName=\"envelope\">john.doe@sensehq.com</DetailRow>\n      <DetailRow iconName=\"phone\">+1 (415) 555-0132</DetailRow>\n      <DetailRow iconName=\"location-dot\">San Francisco, CA</DetailRow>\n    </div>\n\n    <Separator orientation=\"horizontal\" />\n\n    <div className={css.detailsGroup}>\n      <DetailRow iconName=\"briefcase\">Senior Product Designer</DetailRow>\n      <DetailRow iconName=\"building\">Design Systems, Sense</DetailRow>\n      <DetailRow iconName=\"calendar\">Joined March 2021</DetailRow>\n    </div>\n  </div>\n);\n\nexport const SimpleStory = (args: PopoverProps) => (\n  <div className={css.container}>\n    <div className={css.content}>\n      <Popover {...args} content={<ProfileDetails />}>\n        <ClickableIcon\n          name=\"circle-info\"\n          color=\"tertiary\"\n          ariaLabel=\"About John Doe\"\n        />\n      </Popover>\n      <div className={css.info}>\n        <Icon color=\"tertiary\" size=\"small\" name=\"circle-info\" />\n        <BodySmall color=\"tertiary\">\n          Click the info icon to see John Doe&apos;s profile\n        </BodySmall>\n      </div>\n    </div>\n  </div>\n);\n\nSimpleStory.args = {\n  placement: 'bottom',\n  offset: 8,\n  padding: 'medium',\n  children: null,\n  testId: 'popover-simple-story',\n};\n\nexport const PlacementsStory = (args: PopoverProps) => (\n  <div className={css.container}>\n    <div className={css.placements}>\n      {['top', 'right', 'bottom-start', 'left'].map((placement) => (\n        <Popover\n          {...args}\n          key={placement}\n          placement={placement as PopoverProps['placement']}\n          content={<BodySmall>Placed on {placement}</BodySmall>}\n          testId={`popover-placement-${placement}`}\n        >\n          <Button type=\"tertiary\" size=\"small\">\n            {placement}\n          </Button>\n        </Popover>\n      ))}\n    </div>\n    <div className={css.info}>\n      <Icon color=\"tertiary\" size=\"small\" name=\"circle-info\" />\n      <BodySmall color=\"tertiary\">\n        Popover flips automatically when there is no room on the preferred side\n      </BodySmall>\n    </div>\n  </div>\n);\n\nPlacementsStory.args = {\n  padding: 'small',\n  children: null,\n};\n\nexport const ControlledStory = (args: PopoverProps) => {\n  const [isOpen, setIsOpen] = React.useState(false);\n\n  return (\n    <div className={css.container}>\n      <div className={css.content}>\n        <Popover\n          {...args}\n          isOpen={isOpen}\n          onOpenChange={setIsOpen}\n          content={\n            <div className={css.profile}>\n              <SubTitleMedium>Remove John Doe?</SubTitleMedium>\n              <BodySmall color=\"secondary\">\n                They will lose access to all the projects they are a part of.\n              </BodySmall>\n              <div className={css.actions}>\n                <Button\n                  type=\"primary\"\n                  size=\"small\"\n                  onClick={() => setIsOpen(false)}\n                >\n                  Remove\n                </Button>\n                <Button\n                  type=\"tertiary\"\n                  size=\"small\"\n                  onClick={() => setIsOpen(false)}\n                >\n                  Cancel\n                </Button>\n              </div>\n            </div>\n          }\n        >\n          <Button type=\"tertiary\" iconLeftName=\"trash\">\n            {isOpen ? 'Close popover' : 'Open popover'}\n          </Button>\n        </Popover>\n        <div className={css.info}>\n          <Icon color=\"tertiary\" size=\"small\" name=\"circle-info\" />\n          <BodySmall color=\"tertiary\">\n            Open state is owned by the consumer using `isOpen` and\n            `onOpenChange`\n          </BodySmall>\n        </div>\n      </div>\n    </div>\n  );\n};\n\nControlledStory.args = {\n  placement: 'bottom-start',\n  children: null,\n  testId: 'popover-controlled-story',\n};\n\nconst COLUMN_FIELDS = [\n  {\n    key: 'job-post-date',\n    label: 'Job/Post Date',\n    info: 'The date the job was posted to the board, not the date it was created.',\n  },\n  {\n    key: 'published-date',\n    label: 'Published Date',\n    info: 'The date the job first became visible to candidates.',\n  },\n  {\n    key: 'opened-date',\n    label: 'Opened Date',\n    info: 'The date the requisition was approved and opened for sourcing.',\n  },\n  {key: 'owner', label: 'Owner'},\n  {key: 'status', label: 'Status'},\n];\n\nconst ColumnFieldOption = ({label, info}: {label: string; info: string}) => (\n  <div className={css.infoOption}>\n    <Truncate>{label}</Truncate>\n    <Popover\n      placement=\"right\"\n      padding=\"small\"\n      // Note: above elevationMenu so it is not painted under the open menu\n      elevation=\"modal\"\n      content={<BodySmall color=\"secondary\">{info}</BodySmall>}\n      testId={`popover-menu-option-info-${label}`}\n    >\n      {/* Note: stopPropagation so opening the popover does not pick the option */}\n      <ClickableIcon\n        name=\"circle-info\"\n        size=\"small\"\n        color=\"tertiary\"\n        ariaLabel={`About ${label}`}\n        onClick={(event) => event.stopPropagation()}\n      />\n    </Popover>\n  </div>\n);\n\nexport const MenuOptionInfoStory = () => {\n  const [selectedKeys, setSelectedKeys] = React.useState(['job-post-date']);\n\n  return (\n    <div className={css.container}>\n      <div className={css.content}>\n        <SimpleButtonDropdown\n          type=\"secondary\"\n          iconLeftName=\"table-columns\"\n          size=\"medium\"\n          isFluid={false}\n          selectedKeys={selectedKeys}\n          optionsVariant=\"checkbox\"\n          // Note: lets the option row stretch so the icon sits at its far end\n          menuClassNames={{optionTextContainer: css.infoOptionContainer}}\n          onOptionSelect={(option: MenuOption) =>\n            setSelectedKeys((current) =>\n              current.includes(option.key)\n                ? current.filter((key) => key !== option.key)\n                : [...current, option.key],\n            )\n          }\n          options={COLUMN_FIELDS.map((field) =>\n            field.info\n              ? {\n                  key: field.key,\n                  label: field.label,\n                  customComponent: (\n                    <ColumnFieldOption label={field.label} info={field.info} />\n                  ),\n                }\n              : {key: field.key, label: field.label},\n          )}\n        >\n          Columns\n        </SimpleButtonDropdown>\n        <div className={css.info}>\n          <Icon color=\"tertiary\" size=\"small\" name=\"circle-info\" />\n          <BodySmall color=\"tertiary\">\n            The three date fields carry an info icon that opens a popover\n            explaining them\n          </BodySmall>\n        </div>\n      </div>\n    </div>\n  );\n};\n\nSimpleStory.storyName = 'Simple';\nPlacementsStory.storyName = 'Placements';\nControlledStory.storyName = 'Controlled';\nMenuOptionInfoStory.storyName = 'Inside a Menu Option';\n"
        },
        "css": {
          "path": "Popover.module.css",
          "content": "@value (size320) from '../../styles/variables/_size.css';\n@value (elevationMenu) from '../../styles/variables/_elevation.css';\n@value (borderRadiusMedium) from '../../styles/variables/_border.css';\n\n.popover {\n  --popover-elevation: elevationMenu;\n  display: flex;\n  flex-flow: column;\n  max-width: size320;\n  z-index: var(--popover-elevation);\n  outline: none;\n}\n\n.card {\n  flex-flow: column;\n  border-radius: borderRadiusMedium;\n  composes: boxShadow2 from '../../styles/shadow.module.css';\n}\n\n/* Note: Card content is a row, a popover is narrow so it stacks */\n.content {\n  flex-flow: column;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Popover/Popover';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "Popover.module.css",
        "Popover.stories.module.css",
        "Popover.stories.tsx",
        "Popover.tsx",
        "index.ts"
      ]
    },
    "PreviewCard": {
      "name": "PreviewCard",
      "path": "src/components/PreviewCard",
      "files": {
        "main": {
          "path": "PreviewCard.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { ColorTypes } from '../../types/typography';\nimport type { IconSize, IconType } from '../../components/Icon';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    card?: string;\n    titleText?: string;\n    previewText?: string;\n    cardIconSection?: string;\n    helperText?: string;\n}>;\nexport interface PreviewCardProps {\n    title: string;\n    previewText: string;\n    cardImgIconName?: string;\n    isSelected: boolean;\n    disabled?: boolean;\n    onClick?: (e: React.SyntheticEvent<HTMLElement>) => unknown;\n    helperTextIconName?: string;\n    helperTextIconColor?: ColorTypes;\n    helperTextIconType?: IconType;\n    helperTextIconSize?: IconSize;\n    helperText?: string;\n    classNames?: ClassNames;\n    testId?: string;\n}\nexport declare const PreviewCard: Flow.AbstractComponent<PreviewCardProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=PreviewCard.d.ts.map"
        },
        "story": {
          "path": "PreviewCard.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {TEXT_COLORS} from 'src/types/typography';\n\nimport {ICON_SIZE, ICON_TYPE} from 'src/components/Icon';\nimport type {PreviewCardProps} from 'src/components/PreviewCard/PreviewCard';\nimport {PreviewCard} from 'src/components/PreviewCard/PreviewCard';\n\nimport css from 'src/components/PreviewCard/PreviewCard.stories.module.css';\n\n\nconst colorOptions: Array<unknown> = [...Object.values(TEXT_COLORS)];\nconst iconTypeOptions: Array<unknown> = [...Object.values(ICON_TYPE)];\nconst iconSizeOptions: Array<unknown> = [...Object.values(ICON_SIZE)];\n\nconst meta = {\n  tags: ['autodocs'],\n  title: 'Components/Preview Card',\n  component: PreviewCard,\n  argTypes: {\n    title: {\n      description: 'Main title text displayed in the card',\n      control: {type: 'text'},\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    previewText: {\n      description: 'Preview text displayed below the title',\n      control: {type: 'text'},\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    cardImgIconName: {\n      description: 'Icon name for the animated card image displayed at right.',\n      control: {type: 'text'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'sparkles'},\n      },\n    },\n    isSelected: {\n      description: 'If **true**, the card will be in selected state',\n      control: {type: 'boolean'},\n      table: {\n        type: {summary: 'boolean'},\n      },\n    },\n    disabled: {\n      description: 'If **true**, the card will be in disabled state',\n      control: {type: 'boolean'},\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    onClick: {\n      description: 'Callback function called when card is clicked',\n      action: 'card-clicked',\n      table: {\n        type: {summary: '(e: React.SyntheticEvent<HTMLElement>) => unknown'},\n      },\n    },\n    helperTextIconName: {\n      description: 'Icon name for the helper text icon',\n      control: {type: 'text'},\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    helperTextIconColor: {\n      description: 'Icon Color for the helper text icon',\n      control: {type: 'select'},\n      options: colorOptions,\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: TEXT_COLORS.primary},\n      },\n    },\n    helperTextIconType: {\n      description: 'Icon Type of the helper text icon',\n      control: {type: 'select'},\n      options: iconTypeOptions,\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: ICON_TYPE.regular},\n      },\n    },\n    helperTextIconSize: {\n      description: 'Icon Size of the helper text icon',\n      control: {type: 'select'},\n      options: iconSizeOptions,\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: ICON_SIZE.small},\n      },\n    },\n    helperText: {\n      description: 'Helper text displayed below the card',\n      control: {type: 'text'},\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    classNames: {\n      description:\n        'Provide optional classNames to be applied to different parts',\n      control: {type: 'object'},\n      table: {\n        type: {\n          summary:\n            '{ wrapper?: string; card?: string; titleText?: string; previewText?: string; cardIconSection?: string; helperText?: string }',\n        },\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {type: 'text'},\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a PreviewCard component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { PreviewCard } from \"@spaced-out/ui-design-system/lib/components/PreviewCard\";\n\\`\\`\\`\nThe PreviewCard component displays a clickable card with an animated card image displayed at right, with a title, preview text, and optional helper text.\nIt supports three states: default, hovered, and selected.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/PreviewCard/PreviewCard.tsx',\n    },\n  },\n};\n\nexport default meta;\n\nexport const Default = {\n  render: (args: PreviewCardProps) => (\n    <div className={css.container}>\n      <PreviewCard {...args} />\n    </div>\n  ),\n  args: {\n    title: 'The rate of conversations initiated by outbound',\n    previewText: 'Preview',\n    cardImgIconName: 'sparkles',\n    isSelected: false,\n  },\n};\n\nexport const WithHelperText = {\n  render: (args: PreviewCardProps) => (\n    <div className={css.container}>\n      <PreviewCard {...args} />\n    </div>\n  ),\n  args: {\n    title: 'The rate of conversations initiated by outbound',\n    previewText: 'Preview',\n    cardImgIconName: 'sparkles',\n    isSelected: false,\n    helperText: 'Checkpoint made 3 days ago',\n    helperTextIconName: 'check-circle',\n    helperTextIconType: ICON_TYPE.regular,\n    helperTextIconColor: TEXT_COLORS.success,\n    helperTextIconSize: ICON_SIZE.small,\n  },\n};\n\nexport const Selected = {\n  render: (args: PreviewCardProps) => (\n    <div className={css.container}>\n      <PreviewCard {...args} />\n    </div>\n  ),\n  args: {\n    title: 'The rate of conversations initiated by outbound',\n    previewText: 'Preview',\n    cardImgIconName: 'sparkles',\n    isSelected: true,\n    helperText: 'Checkpoint made 3 days ago',\n    helperTextIconName: 'check-circle',\n    helperTextIconType: ICON_TYPE.regular,\n    helperTextIconColor: TEXT_COLORS.success,\n    helperTextIconSize: ICON_SIZE.small,\n  },\n};\n\nexport const Disabled = {\n  render: (args: PreviewCardProps) => (\n    <div className={css.container}>\n      <PreviewCard {...args} />\n    </div>\n  ),\n  args: {\n    title: 'The rate of conversations initiated by outbound',\n    previewText: 'Preview',\n    cardImgIconName: 'sparkles',\n    isSelected: false,\n    disabled: true,\n    helperText: 'Checkpoint made 3 days ago',\n    helperTextIconName: 'check-circle',\n    helperTextIconType: ICON_TYPE.regular,\n    helperTextIconColor: TEXT_COLORS.success,\n    helperTextIconSize: ICON_SIZE.small,\n  },\n};\n"
        },
        "css": {
          "path": "PreviewCard.module.css",
          "content": "@value (\n  spaceSmall,\n  spaceXSmall,\n  spaceXXSmall,\n  spaceXLarge,\n  spaceNone\n) from '../../styles/variables/_space.css';\n\n@value (\n  colorBorderPrimary,\n  colorBackgroundTertiary,\n  colorNeutralLightest,\n  colorFillSecondary,\n  colorInformationLightest,\n  colorFillPrimary,\n  colorInformation,\n  colorTextClickable,\n  colorFocusPrimary,\n  colorDataViz1,\n  colorDataViz2,\n  colorTextDisabled\n) from '../../styles/variables/_color.css';\n\n@value (\n  borderRadiusSmall,\n  borderRadiusMedium,\n  borderWidthPrimary,\n  borderWidthTertiary,\n  borderWidthNone\n) from '../../styles/variables/_border.css';\n\n@value (\n  shadowBoxShadow1X,\n  shadowBoxShadow1Y,\n  shadowBoxShadow1Blur,\n  shadowBoxShadow2X,\n  shadowBoxShadow2Y,\n  shadowBoxShadow2Blur,\n  shadowBoxShadow1Spread,\n  shadowBoxShadow1Color,\n  shadowBoxShadow4Spread\n) from '../../styles/variables/_shadow.css';\n\n@value (\n  sizeFluid,\n  size66,\n  size50,\n  size4,\n  size120,\n  size10\n) from '../../styles/variables/_size.css';\n\n@value (\n  motionDurationNormal,\n  motionDurationSlow,\n  motionEaseInEaseOut\n) from '../../styles/variables/_motion.css';\n\n.wrapper {\n  display: flex;\n  flex-direction: column;\n  gap: spaceXSmall;\n  width: sizeFluid;\n}\n\n.previewTextContainer {\n  display: flex;\n  align-items: center;\n  gap: spaceXXSmall;\n}\n\n.card {\n  background-color: colorBackgroundTertiary;\n  border: borderWidthPrimary solid colorBorderPrimary;\n  border-radius: borderRadiusMedium;\n  cursor: pointer;\n  outline: none;\n  transition: all motionDurationNormal motionEaseInEaseOut;\n  width: sizeFluid;\n  min-height: fit-content;\n  overflow: hidden;\n\n  &:focus {\n    border-color: colorTextClickable;\n    box-shadow: borderWidthNone borderWidthNone borderWidthNone\n      borderWidthTertiary colorFocusPrimary;\n  }\n\n  &:hover:not(:focus) {\n    box-shadow: shadowBoxShadow1X shadowBoxShadow1Y shadowBoxShadow1Blur\n      shadowBoxShadow1Spread shadowBoxShadow1Color;\n    background-color: colorNeutralLightest;\n    border-color: transparent;\n    background-image: linear-gradient(\n        colorNeutralLightest,\n        colorNeutralLightest\n      ),\n      linear-gradient(to right, colorDataViz2, colorDataViz1);\n    background-clip: content-box, border-box;\n    background-origin: border-box;\n  }\n\n  &:focus:hover {\n    box-shadow: borderWidthNone borderWidthNone borderWidthNone\n      borderWidthTertiary colorFocusPrimary;\n    background-color: colorNeutralLightest;\n  }\n\n  &.selected {\n    border: borderWidthPrimary solid transparent;\n    border-radius: borderRadiusMedium;\n    background-image: linear-gradient(\n        colorFillSecondary,\n        colorInformationLightest\n      ),\n      linear-gradient(to right, colorFillPrimary, colorInformation);\n    background-clip: content-box, border-box;\n    background-origin: border-box;\n    box-shadow: none;\n\n    &:focus {\n      box-shadow: borderWidthNone borderWidthNone borderWidthNone\n        borderWidthTertiary colorFocusPrimary;\n      border-color: colorTextClickable;\n    }\n\n    &:focus:hover {\n      background-image: linear-gradient(\n        colorNeutralLightest,\n        colorNeutralLightest\n      );\n    }\n  }\n\n  &.disabled {\n    cursor: not-allowed;\n    pointer-events: none;\n    background-color: colorBackgroundTertiary;\n    border: borderWidthPrimary solid colorBorderPrimary;\n  }\n}\n\n.cardContent {\n  display: flex;\n  align-items: flex-start;\n  padding: spaceSmall;\n  gap: spaceSmall;\n  position: relative;\n  min-height: size66;\n  width: sizeFluid;\n}\n\n.mainContent {\n  display: flex;\n  flex-direction: column;\n  gap: spaceXSmall;\n  flex: 1;\n  min-width: spaceNone;\n  padding-right: calc(spaceXLarge + spaceXSmall + spaceSmall);\n}\n\n.titleText {\n  width: sizeFluid;\n}\n\n.previewText {\n  width: fit-content;\n}\n\n.cardIconSection {\n  display: flex;\n  align-items: flex-start;\n  justify-content: center;\n  height: calc(size120 + size10);\n  width: calc(size50 + size4);\n  flex-shrink: 0;\n  border-radius: borderRadiusSmall;\n  background-color: colorNeutralLightest;\n  border: borderWidthPrimary solid colorBorderPrimary;\n  transition: all motionDurationSlow motionEaseInEaseOut;\n  transform: rotate(-3deg);\n  padding-top: spaceSmall;\n  position: absolute;\n  right: spaceXSmall;\n  box-shadow: shadowBoxShadow2X shadowBoxShadow2Y shadowBoxShadow2Blur\n    shadowBoxShadow4Spread shadowBoxShadow1Color;\n}\n\n.card:hover .cardIconSection {\n  transform: rotate(5deg);\n}\n\n.card.selected .cardIconSection,\n.card:hover .cardIconSection {\n  border: borderWidthPrimary solid colorBorderPrimary;\n  background-image: linear-gradient(\n    colorBackgroundTertiary,\n    colorBackgroundTertiary\n  );\n  background-clip: border-box;\n  background-origin: border-box;\n}\n\n.card.selected .cardIconSection > div,\n.card:hover .cardIconSection > div {\n  color: colorTextClickable;\n}\n\n.card.disabled .cardIconSection > div {\n  color: colorTextDisabled;\n}\n\n.helperText {\n  display: flex;\n  align-items: center;\n  gap: spaceXXSmall;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/PreviewCard/PreviewCard';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "PreviewCard.module.css",
        "PreviewCard.stories.module.css",
        "PreviewCard.stories.tsx",
        "PreviewCard.tsx",
        "index.ts"
      ]
    },
    "ProgressDonut": {
      "name": "ProgressDonut",
      "path": "src/components/ProgressDonut",
      "files": {
        "main": {
          "path": "ProgressDonut.d.ts",
          "content": "import type { Flow } from 'flow-to-typescript-codemod';\nimport * as COLORS from '../../styles/variables/_color';\nimport type { IconProps } from '../../components/Icon';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    donutChart?: string;\n}>;\nexport type ProgressDonutProps = {\n    classNames?: ClassNames;\n    color?: keyof typeof COLORS;\n    size?: 'small' | 'medium';\n    testId?: string;\n    icon?: Omit<IconProps, 'size'>;\n} & ({\n    percentage?: number;\n    rating?: never;\n} | {\n    rating: number;\n    percentage?: never;\n});\nexport declare const ProgressDonut: Flow.AbstractComponent<ProgressDonutProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=ProgressDonut.d.ts.map"
        },
        "story": {
          "path": "ProgressDonut.stories.tsx",
          "content": "import * as React from 'react';\n\nimport * as COLORS from 'src/styles/variables/_color';\n\nimport type {ProgressDonutProps} from 'src/components/ProgressDonut';\nimport {ProgressDonut} from 'src/components/ProgressDonut';\n\nimport css from 'src/components/ProgressDonut/ProgressDonut.stories.module.css';\n\n\nconst colorOptions: Array<unknown> = [\n  '--',\n  ...Object.keys(COLORS).filter((color) => color.startsWith('colorText')),\n];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Progress Donut',\n  component: ProgressDonut,\n  argTypes: {\n    classNames: {\n      description:\n        'Provide an optional classNames to be applied to the wrapper, {wrapper?: string, donutChart?: string}',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{ wrapper?: string, donutChart?: string }',\n        },\n      },\n    },\n    percentage: {\n      description:\n        'Represents the completion percentage of the donut progress, ranging from 0 to 100 inclusive. Mutually exclusive with `rating`.',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: 0},\n      },\n    },\n    rating: {\n      description:\n        'Represents a rating from 0 to 10. The donut fill reflects the rating proportionally, and the rating value is displayed inside instead of a percentage. Mutually exclusive with `percentage`.',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'number'},\n      },\n    },\n    size: {\n      description:\n        'Size variant of the donut. `medium` renders at 72x72, `small` renders at 34x34.',\n      options: ['small', 'medium'],\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: '\\'small\\' | \\'medium\\''},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    color: {\n      description:\n        'Pass different text color token string to show loader in different color',\n      options: colorOptions,\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    icon: {\n      description:\n        'Optional icon to render in the center of the donut in place of the percentage/rating text. Accepts all `IconProps` except `size`, which is derived from the donut `size` (donut `small` → icon `small`, donut `medium` → icon `large`).',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: 'Omit<IconProps, \\'size\\'>',\n        },\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a ProgressDonut component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { ProgressDonut } from \"@spaced-out/ui-design-system/lib/components/ProgressDonut\";\n\\`\\`\\`\nA progress indicator in the shape of a donut chart to visually represent completion percentages or ratings. This component uses configurable colors based on the percentage range, and supports an optional custom color. When an \\`icon\\` is provided, it replaces the percentage/rating text in the center.\n\n**Usage: **\n\\`\\`\\`\n// Percentage mode (default)\n<ProgressDonut percentage={75} />\n\n// Rating mode (0-10 scale)\n<ProgressDonut rating={6} size=\"small\" />\n\n// Icon in the center (replaces percentage/rating text)\n<ProgressDonut\n  percentage={80}\n  icon={{name: 'check', type: 'solid', color: 'success'}}\n/>\n\\`\\`\\`\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/ProgressDonut/ProgressDonut',\n    },\n  },\n};\n\nexport const DefaultStory = (args: ProgressDonutProps) => (\n  <div className={css.container}>\n    <ProgressDonut {...args} />\n  </div>\n);\n\nDefaultStory.args = {\n  percentage: 90,\n  testId: 'progress-donut-default-story',\n};\n\nexport const WithCustomColorStory = (args: ProgressDonutProps) => (\n  <div className={css.container}>\n    <ProgressDonut {...args} />\n  </div>\n);\n\nWithCustomColorStory.args = {\n  percentage: 47,\n  color: 'colorTextInformation',\n  testId: 'progress-donut-custom-color-story',\n};\nexport const SmallSizeStory = (args: ProgressDonutProps) => (\n  <div className={css.container}>\n    <ProgressDonut {...args} />\n  </div>\n);\n\nSmallSizeStory.args = {\n  percentage: 75,\n  size: 'small',\n  testId: 'progress-donut-small-size-story',\n};\n\nexport const RatingStory = (args: ProgressDonutProps) => (\n  <div className={css.container}>\n    <ProgressDonut {...args} />\n  </div>\n);\n\nRatingStory.args = {\n  rating: 6,\n  testId: 'progress-donut-rating-story',\n};\n\nexport const SmallRatingStory = (args: ProgressDonutProps) => (\n  <div className={css.container}>\n    <ProgressDonut {...args} />\n  </div>\n);\n\nSmallRatingStory.args = {\n  rating: 6,\n  size: 'small',\n  testId: 'progress-donut-small-rating-story',\n};\n\nexport const WithIconStory = (args: ProgressDonutProps) => (\n  <div className={css.container}>\n    <ProgressDonut {...args} />\n  </div>\n);\n\nWithIconStory.args = {\n  percentage: 80,\n  icon: {name: 'check', type: 'solid', color: 'success'},\n  testId: 'progress-donut-with-icon-story',\n};\n\nexport const SmallWithIconStory = (args: ProgressDonutProps) => (\n  <div className={css.container}>\n    <ProgressDonut {...args} />\n  </div>\n);\n\nSmallWithIconStory.args = {\n  rating: 6,\n  size: 'small',\n  icon: {name: 'star', type: 'solid'},\n  testId: 'progress-donut-small-with-icon-story',\n};\n\nDefaultStory.storyName = 'Default';\nWithCustomColorStory.storyName = 'With Custom Color';\nSmallSizeStory.storyName = 'Small Size';\nRatingStory.storyName = 'Rating';\nSmallRatingStory.storyName = 'Small Rating';\nWithIconStory.storyName = 'With Icon';\nSmallWithIconStory.storyName = 'Small With Icon';\n"
        },
        "css": {
          "path": "ProgressDonut.module.css",
          "content": "@value (\n  borderRadiusSmall\n) from '../../styles/variables/_border.css';\n@value (spaceHalfFluid, spaceNegHalfFluid) from '../../styles/variables/_space.css';\n@value (fontSize12) from '../../styles/variables/_font.css';\n@value (size10, size20, sizeFluid) from\n  '../../styles/variables/_size.css';\n@value (\n  colorBorderPrimary,\n  colorBackgroundSecondary,\n  colorBackgroundPrimary\n) from '../../styles/variables/_color.css';\n@value (motionDurationSlower) from\n'../../styles/variables/_motion.css';\n\n.donutChart {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  background-color: colorBackgroundPrimary;\n}\n\n.donutChartSvg {\n  transform: rotate(-90deg);\n}\n\n.donutChartBackground,\n.donutChartForeground {\n  fill: none;\n}\n\n.donutChartBackground {\n  stroke: colorBackgroundSecondary;\n}\n\n.donutChartForeground {\n  transition: stroke-dashoffset motionDurationSlower;\n}\n\n.donutChartPercentage {\n  position: absolute;\n}\n\n.donutChartPercentageSmallPercent {\n  font-size: fontSize12;\n}\n\n.donutChartIcon {\n  position: absolute;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/ProgressDonut/ProgressDonut';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "ProgressDonut.module.css",
        "ProgressDonut.stories.module.css",
        "ProgressDonut.stories.tsx",
        "ProgressDonut.tsx",
        "index.ts"
      ]
    },
    "PromptChip": {
      "name": "PromptChip",
      "path": "src/components/PromptChip",
      "files": {
        "main": {
          "path": "PromptChip.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { ColorTypes } from '../../types/typography';\nimport type { IconType } from '../../components/Icon';\nimport type { BaseTooltipProps } from '../../components/Tooltip';\ntype ClassNames = Readonly<{\n    icon?: string;\n    wrapper?: string;\n    children?: string;\n    leftSlot?: string;\n    rightSlot?: string;\n    container?: string;\n}>;\nexport declare const PROMPT_CHIP_TYPE: Readonly<{\n    primary: \"primary\";\n    secondary: \"secondary\";\n}>;\nexport type PromptChipType = (typeof PROMPT_CHIP_TYPE)[keyof typeof PROMPT_CHIP_TYPE];\nexport type PromptChipProps = {\n    classNames?: ClassNames;\n    testId?: string;\n} & ({\n    onDismiss?: (e: React.SyntheticEvent<HTMLElement>) => unknown;\n    dismissable: true;\n    selfDismiss?: boolean;\n} | {\n    dismissable?: false;\n    onDismiss?: never;\n    selfDismiss?: never;\n}) & {\n    type?: PromptChipType;\n    onClick?: ((arg1: React.SyntheticEvent<HTMLElement>) => unknown) | null | undefined;\n    iconName?: string;\n    iconType?: IconType;\n    children?: React.ReactNode;\n    iconColor?: ColorTypes;\n    rightSlot?: React.ReactNode;\n    showInfoIcon?: boolean;\n    infoIconTooltip?: BaseTooltipProps;\n    isMultiline?: boolean;\n};\nexport declare const PromptChip: Flow.AbstractComponent<PromptChipProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=PromptChip.d.ts.map"
        },
        "story": {
          "path": "PromptChip.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {TEXT_COLORS} from 'src/types/typography';\n\nimport {Button} from 'src/components/Button';\nimport type {PromptChipProps} from 'src/components/PromptChip/PromptChip';\nimport {\n  PROMPT_CHIP_TYPE,\n  PromptChip,\n} from 'src/components/PromptChip/PromptChip';\n\nimport css from 'src/components/PromptChip/PromptChip.stories.module.css';\n\n\nconst typeOptions: Array<unknown> = [...Object.values(PROMPT_CHIP_TYPE)];\nconst colorOptions: Array<unknown> = [...Object.values(TEXT_COLORS)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'AI Prompt Components/Prompt Chip',\n  component: PromptChip,\n  argTypes: {\n    type: {\n      options: typeOptions,\n      description:\n        'Type of PromptChip. It will have different Border and background color for different type',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: PROMPT_CHIP_TYPE.primary},\n      },\n    },\n    onClick: {\n      description:\n        '**onClick** handler that is applied to the wrapper div element',\n      action: 'clicked',\n      table: {\n        type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n      },\n    },\n    iconType: {\n      description:\n        'Type of Left Icon. Type represents 4 unique icon styles :- Solid, Regular, Duotone and Brands',\n      options: ['regular', 'solid', 'duotone', 'brands'],\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'solid'},\n      },\n    },\n    iconName: {\n      description:\n        'Icon Name represents name of icon as supported by fontawesome',\n      type: {required: true},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'lightbulb'},\n      },\n    },\n    iconColor: {\n      description: 'Same set of colors as supported in text',\n      options: colorOptions,\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'clickable'},\n      },\n    },\n    classNames: {\n      description: 'External classNames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary:\n            '{wrapper?: string, icon?: string, children?: string, container?: string, leftSlot?: string, rightSlot?: string}',\n        },\n      },\n    },\n    dismissable: {\n      description: 'Close Icon will appear in right side in case it is true',\n      name: 'dismissable',\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    onDismiss: {\n      description:\n        '**onDismiss** handler that is applied to close icon of prompt chip.',\n      action: 'onDismiss',\n      table: {\n        type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n      },\n    },\n    selfDismiss: {\n      description: `This prop is valid only in case dismissable is true.\n      It handles whether the dismissal should be handled by the component or it will just pass callback onclick of closeIcon and dismissal will be handled externally`,\n      name: 'selfDismiss',\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    showInfoIcon: {\n      description: `Info icon will appear on the right in case it is true`,\n      name: 'showInfoIcon',\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    infoIconTooltip: {\n      description: `Tooltip props to use on the info icon. This prop is valid only in case showInfoIcon is true.`,\n      name: 'infoIconTooltip',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: 'TooltipProps'},\n      },\n    },\n    children: {\n      description: 'The content of the PromptChip',\n      table: {\n        type: {summary: 'React.Component | string'},\n      },\n    },\n    rightSlot: {\n      description: 'The content on the right side of PromptChip',\n      table: {\n        type: {summary: 'React.Component | string'},\n      },\n    },\n    isMultiline: {\n      description:\n        'If **true**, the children will be displayed in a new div below the left section and right section',\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Prompt Chip component',\n      description: {\n        component: `\n\\`\\`\\`jsx\nimport { PromptChip } from \"@spaced-out/ui-design-system/lib/components/PromptChip\";\n\\`\\`\\`\n**PromptChip**\n\nUse this component to easily display a set of interactive prompt chips that users can select by clicking on them. Each chip represents a prompt or option, allowing users to make a quick selection in a compact and visually appealing way.\n\n**Usage:**\n\n\\`\\`\\`jsx\n<PromptChip\n  children='Would you like to schedule a meeting with the candidate?'\n/>\n\\`\\`\\`\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/PromptChip/PromptChip',\n    },\n  },\n};\n\nexport const DefaultStory = (args: PromptChipProps) => (\n  <div className={css.storyContainer}>\n    <PromptChip {...args} />\n  </div>\n);\n\nDefaultStory.args = {\n  children: 'Would you like to schedule a meeting with the candidate?',\n  testId: 'prompt-chip-default-story',\n};\n\nexport const WithRightSlotStory = (args: PromptChipProps) => (\n  <div className={css.storyContainer}>\n    <PromptChip {...args} />\n  </div>\n);\n\nWithRightSlotStory.args = {\n  children: 'The quick brown fox jumps over the lazy dog',\n  type: 'secondary',\n  onClick: null,\n  rightSlot: (\n    <>\n      <Button type=\"secondary\" size=\"small\" children=\"Secondary\" />\n      <Button size=\"small\" children=\"Primary\" />\n    </>\n  ) as React.ReactElement<React.ComponentProps<React.ComponentType>>,\n  testId: 'prompt-chip-with-right-slot-story',\n};\n\nexport const WithInfoIconStory = (args: PromptChipProps) => (\n  <div className={css.storyContainer}>\n    <PromptChip {...args} />\n  </div>\n);\n\nWithInfoIconStory.args = {\n  children: 'The quick brown fox jumps over the lazy dog',\n  infoIconTooltip: {\n    title: 'This is info icon',\n  },\n  showInfoIcon: true,\n  testId: 'prompt-chip-with-info-icon-story',\n};\n\nexport const WithMultilineStory = (args: PromptChipProps) => (\n  <div className={css.storyContainer}>\n    <PromptChip {...args} />\n  </div>\n);\n\nWithMultilineStory.args = {\n  children:\n    'The quick brown fox jumps over the lazy dog is an English-language pangram—a sentence that contains all the letters of the alphabet.',\n  isMultiline: true,\n  showInfoIcon: true,\n  testId: 'prompt-chip-with-multiline-story',\n};\n\nDefaultStory.storyName = 'Default';\nWithRightSlotStory.storyName = 'With Right Slot';\nWithInfoIconStory.storyName = 'With Info Icon';\nWithMultilineStory.storyName = 'Multiline';\n"
        },
        "css": {
          "path": "PromptChip.module.css",
          "content": "@value (\n  spaceSmall,\n  spaceXSmall,\n  spaceFluid\n) from '../../styles/variables/_space.css';\n\n@value (\n  colorDataViz2,\n  colorFocusPrimary,\n  colorFocusInformation,\n  colorInformation,\n  colorFillPrimary,\n  colorTextClickable,\n  colorNeutralLightest,\n  colorBackgroundTertiary,\n  colorFillSecondary,\n  colorInformationLightest\n) from '../../styles/variables/_color.css';\n\n@value (\n  borderWidthNone,\n  borderRadiusMedium,\n  borderWidthPrimary,\n  borderWidthTertiary\n) from '../../styles/variables/_border.css';\n\n@value (\n  opacity0,\n  opacity100\n) from '../../styles/variables/_opacity.css';\n\n.promptChipWrapper {\n  composes: boxShadow2 from '../../styles/shadow.module.css';\n  display: flex;\n  border-radius: borderRadiusMedium;\n  outline: none;\n  width: spaceFluid;\n\n  &:focus {\n    box-shadow: borderWidthNone borderWidthNone borderWidthNone\n      borderWidthTertiary colorFocusPrimary;\n  }\n}\n\n.primary {\n  border: borderWidthPrimary solid transparent;\n  background-image: linear-gradient(\n      colorBackgroundTertiary,\n      colorBackgroundTertiary\n    ),\n    linear-gradient(to right, colorFocusPrimary, colorFocusInformation);\n  background-clip: content-box, border-box;\n  background-origin: border-box;\n\n  &:hover {\n    background-image: linear-gradient(\n        colorFillSecondary,\n        colorInformationLightest\n      ),\n      linear-gradient(to right, colorFillPrimary, colorInformation);\n  }\n}\n\n.secondary {\n  background-color: colorNeutralLightest;\n}\n\n/* ---- Grid Layout for Content ---- */\n.promptChipContainer {\n  display: grid;\n  width: spaceFluid;\n  gap: spaceSmall;\n  padding: spaceXSmall;\n  padding-left: spaceSmall;\n  align-items: center;\n  border-radius: borderRadiusMedium;\n\n  .chipIconDefaultColor {\n    color: colorDataViz2;\n  }\n\n  /* \n    NORMAL MODE (when isMultiline={false}):\n    - single row, 3 columns: icon | children | right\n  */\n  &:not(.multilinePromptChipContainer) {\n    grid-template-columns: auto 1fr auto;\n    grid-template-areas: 'leftSection childrenWrapper rightSection';\n  }\n\n  /*\n    MULTILINE MODE (when isMultiline={true}):\n    - 2 rows: first row for icon (leftSection) and actions (rightSection)\n    - children on second row spanning full width\n  */\n  &.multilinePromptChipContainer {\n    grid-template-columns: auto 1fr auto;\n    grid-template-areas:\n      'leftSection . rightSection'\n      'childrenWrapper childrenWrapper childrenWrapper';\n  }\n\n  &.promptChipContainerHover:hover {\n    background-image: linear-gradient(\n      to right,\n      colorFillSecondary,\n      colorInformationLightest\n    );\n    cursor: pointer;\n\n    .chipIconDefaultColor {\n      color: colorTextClickable;\n    }\n  }\n}\n\n.leftSection {\n  grid-area: leftSection;\n  display: flex;\n  gap: spaceSmall;\n  align-items: center;\n}\n\n.childrenWrapper {\n  grid-area: childrenWrapper;\n  composes: bodyMedium from '../../styles/typography.module.css';\n}\n\n.rightSection {\n  grid-area: rightSection;\n  display: flex;\n  gap: spaceSmall;\n  align-items: center;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/PromptChip/PromptChip';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "PromptChip.module.css",
        "PromptChip.stories.module.css",
        "PromptChip.stories.tsx",
        "PromptChip.tsx",
        "index.ts"
      ]
    },
    "PromptInput": {
      "name": "PromptInput",
      "path": "src/components/PromptInput",
      "files": {
        "main": {
          "path": "PromptInput.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { IconType } from '../../components/Icon';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    inputBox?: string;\n    textarea?: string;\n    buttonWrapper?: string;\n    buttonIcon?: string;\n    buttonText?: string;\n}>;\nexport interface PromptInputProps {\n    value?: string;\n    onInputChange?: (evt: React.ChangeEvent<HTMLTextAreaElement>, isEnter?: boolean) => unknown;\n    onInputFocus?: (e: React.FocusEvent<HTMLTextAreaElement>) => unknown;\n    onInputBlur?: (e: React.FocusEvent<HTMLTextAreaElement>) => unknown;\n    onInputKeyDown?: (e: React.KeyboardEvent<HTMLTextAreaElement>) => unknown;\n    inputName?: string;\n    inputDisabled?: boolean;\n    inputPlaceholder?: string;\n    inputLocked?: boolean;\n    inputError?: boolean;\n    inputErrorText?: string;\n    helperContent?: React.ReactNode;\n    textCountLimit?: number;\n    classNames?: ClassNames;\n    withPadding?: boolean;\n    buttonText?: string;\n    buttonDisabled?: boolean;\n    onButtonClick?: React.MouseEventHandler<HTMLButtonElement>;\n    buttonAriaLabel?: string;\n    isButtonLoading?: boolean;\n    buttonIconLeftName?: string;\n    buttonIconLeftType?: IconType;\n    testId?: string;\n}\nexport declare const PromptInput: Flow.AbstractComponent<PromptInputProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=PromptInput.d.ts.map"
        },
        "story": {
          "path": "PromptInput.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {TEXT_COLORS} from 'src/types/typography';\n\nimport {Icon, ICON_SIZE} from 'src/components/Icon';\nimport type {PromptInputProps} from 'src/components/PromptInput/PromptInput';\nimport {PromptInput} from 'src/components/PromptInput/PromptInput';\nimport {BodySmallBold} from 'src/components/Text';\nimport {Tooltip} from 'src/components/Tooltip';\n\nimport css from 'src/components/PromptInput/PromptInput.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'AI Prompt Components/Prompt Input',\n  component: PromptInput,\n  argTypes: {\n    value: {\n      description: 'The current value of the text area.',\n      control: 'text',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    onInputChange: {\n      description: 'Handler for input change event.',\n      action: 'onInputChange',\n      table: {\n        type: {\n          summary:\n            '(evt: SyntheticInputEvent<HTMLInputElement>, isEnter?: boolean) => mixed',\n        },\n      },\n    },\n    onInputFocus: {\n      description: 'Handler for input focus event.',\n      action: 'onInputFocus',\n      table: {\n        type: {summary: '(e: SyntheticInputEvent<HTMLInputElement>) => mixed'},\n      },\n    },\n    onInputBlur: {\n      description: 'Handler for input blur event.',\n      action: 'onInputBlur',\n      table: {\n        type: {summary: '(e: SyntheticInputEvent<HTMLInputElement>) => mixed'},\n      },\n    },\n    onInputKeyDown: {\n      description: 'Handler for key down event.',\n      action: 'onInputKeyDown',\n      table: {\n        type: {\n          summary: '(e: SyntheticKeyboardEvent<HTMLInputElement>) => mixed',\n        },\n      },\n    },\n    inputName: {\n      description: 'Name attribute for the input element.',\n      control: 'text',\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'prompt-textarea'},\n      },\n    },\n    inputDisabled: {\n      description: 'Disables the input field.',\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    inputPlaceholder: {\n      description: 'Placeholder text for the input.',\n      control: 'text',\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'Ask me anything'},\n      },\n    },\n    inputLocked: {\n      description: 'Locks the input field.',\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    inputError: {\n      description: 'Sets error state for the input.',\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    inputErrorText: {\n      description: 'Error message displayed below the input.',\n      control: 'text',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    helperContent: {\n      description: 'Content displayed as helper text below the input.',\n      control: 'object',\n      table: {\n        type: {summary: 'React.Node'},\n      },\n    },\n    textCountLimit: {\n      description: 'Character limit for the input field.',\n      control: 'number',\n      table: {\n        type: {summary: 'number'},\n      },\n    },\n    withPadding: {\n      description: 'Adds internal padding around the component.',\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: true},\n      },\n    },\n    classNames: {\n      description: 'Optional class names for various parts of the component.',\n      control: 'object',\n    },\n    buttonText: {\n      description: 'Text displayed on the button.',\n      control: 'text',\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'Generate'},\n      },\n    },\n    buttonDisabled: {\n      description: 'Disables the button.',\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    onButtonClick: {\n      description: 'Handler for button click event.',\n      action: 'onButtonClick',\n      table: {\n        type: {summary: '(e: SyntheticEvent<HTMLElement>) => mixed'},\n      },\n    },\n    buttonAriaLabel: {\n      description: 'Aria label for the button.',\n      control: 'text',\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'Prompt Button'},\n      },\n    },\n    isButtonLoading: {\n      description: 'Displays a loading state for the button.',\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    buttonIconLeftName: {\n      description: 'Name of the left icon on the button.',\n      control: 'text',\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'sparkles'},\n      },\n    },\n    buttonIconLeftType: {\n      description: 'Type of the left icon (e.g., solid, outline).',\n      control: 'text',\n      table: {\n        type: {summary: 'IconType'},\n        defaultValue: {summary: 'solid'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle:\n        'A flexible and accessible input field with button integration, helper text, and character count.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { PromptInput } from \"@spaced-out/ui-design-system/lib/components/PromptInput\";\n\\`\\`\\`\n\n**PromptInput** is a versatile input and action component designed for user prompts. It includes a textarea that dynamically grows in height and a customizable action button.\n\n### Features:\n\n1. **Auto-Growing Textarea**\n   - The input automatically resizes its height as the user types.\n   - It grows dynamically until a maximum height of **200px**.\n   - Once the content exceeds the 200px limit, an **internal scroll bar** appears within the textarea to ensure content remains accessible.\n\n2. **Character Count Enforcement**\n   - Supports a configurable **character limit**.\n   - If the text exceeds the limit, the component enters an error state, and an error message or helper text can be displayed.\n\n3. **Error State Handling**\n   - Highlights the input field with an error style when in an error state.\n   - Accepts an optional \\`inputErrorText\\` to display a custom error message.\n\n4. **Helper Content Display**\n   - Displays helper content below the input field.\n   - Supports both **plain text** and **React nodes** (e.g., tooltips, icons).\n\n5. **Customizable Action Button**\n   - A button is positioned adjacent to the input field for performing actions like \"Submit\" or \"Generate\".\n   - The button supports:\n     - Custom text (e.g., \"Generate\")\n     - Loading state with a spinner\n     - Left-aligned icons (e.g., \"sparkles\")\n     - Disabled state\n     - Accessible \\`aria-label\\`.\n\n6. **Padding and Layout**\n   - Optionally adds internal padding to the component for better spacing.\n   - Flexible \\`classNames\\` props allow overriding styles for various parts of the component.\n\n### Accessibility:\n- Fully supports keyboard navigation and screen readers.\n- The button includes an \\`aria-label\\` for accessibility.\n\n### Example Usage:\n\n\\`\\`\\`jsx\n<PromptInput\n  value=\"Hello World\"\n  onInputChange={(e) => console.log(e.target.value)}\n  inputPlaceholder=\"Ask me anything...\"\n  helperContent={<span>Provide your query here</span>}\n/>\n\\`\\`\\`\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/PromptInput/PromptInput',\n    },\n  },\n};\n\nconst TOOLTIP_HELPER_TEXT = 'Some Help Text goes here';\n\nconst HelperText = (): React.ReactElement<React.ComponentProps<'div'>> => (\n  <div className={css.helperContent}>\n    <BodySmallBold color={TEXT_COLORS.secondary}>Helper Text</BodySmallBold>\n    <Tooltip body={TOOLTIP_HELPER_TEXT}>\n      <Icon\n        name=\"info-circle\"\n        color={TEXT_COLORS.secondary}\n        size={ICON_SIZE.small}\n      />\n    </Tooltip>\n  </div>\n);\n\nexport const DefaultStory = (args: PromptInputProps) => {\n  const [value, setValue] = React.useState(args.value);\n\n  React.useEffect(() => {\n    setValue(args.value);\n  }, [args.value]);\n\n  return (\n    <div className={css.container}>\n      <PromptInput\n        {...args}\n        value={value}\n        onInputChange={(e) => setValue(e.target.value)}\n      />\n    </div>\n  );\n};\n\nexport const WithHelperTextStory = (args: PromptInputProps) => {\n  const [value, setValue] = React.useState(args.value);\n\n  React.useEffect(() => {\n    setValue(args.value);\n  }, [args.value]);\n\n  return (\n    <div className={css.container}>\n      <PromptInput\n        {...args}\n        value={value}\n        onInputChange={(e) => setValue(e.target.value)}\n        helperContent={<HelperText />}\n      />\n    </div>\n  );\n};\n\nexport const WithTextCounterStory = (args: PromptInputProps) => {\n  const [value, setValue] = React.useState(args.value);\n\n  React.useEffect(() => {\n    setValue(args.value);\n  }, [args.value]);\n\n  return (\n    <div className={css.container}>\n      <PromptInput\n        {...args}\n        value={value}\n        onInputChange={(e) => setValue(e.target.value)}\n      />\n    </div>\n  );\n};\n\nWithTextCounterStory.args = {\n  textCountLimit: 500,\n  testId: 'prompt-input-text-counter-story',\n};\n\nexport const WithHelperTextAndTextCounterStory = (args: PromptInputProps) => {\n  const [value, setValue] = React.useState(args.value);\n\n  React.useEffect(() => {\n    setValue(args.value);\n  }, [args.value]);\n\n  return (\n    <div className={css.container}>\n      <PromptInput\n        {...args}\n        value={value}\n        onInputChange={(e) => setValue(e.target.value)}\n        helperContent={<HelperText />}\n      />\n    </div>\n  );\n};\n\nWithHelperTextAndTextCounterStory.args = {\n  textCountLimit: 500,\n  testId: 'prompt-input-helper-text-counter-story',\n};\nDefaultStory.storyName = 'Default';\nWithHelperTextStory.storyName = 'With Helper Text';\nWithTextCounterStory.storyName = 'With Text Counter';\nWithHelperTextAndTextCounterStory.storyName =\n  'With Helper Text And Text Counter';\n"
        },
        "css": {
          "path": "PromptInput.module.css",
          "content": "@value (colorBackgroundTertiary) from '../../styles/variables/_color.css';\n@value (\n  sizeFluid,\n  size140,\n  size42,\n  size200,\n  size160\n) from '../../styles/variables/_size.css';\n@value (\n  spaceSmall,\n  spaceMedium\n) from '../../styles/variables/_space.css';\n\n.wrapper {\n  display: flex;\n  flex-flow: column;\n  width: sizeFluid;\n  gap: spaceSmall;\n}\n\n.inputActionWrapper {\n  display: flex;\n  width: sizeFluid;\n  gap: spaceSmall;\n}\n\n.styledPromptContainer {\n  composes: borderTopPrimary from '../../styles/border.module.css';\n  background: colorBackgroundTertiary;\n  padding: spaceMedium;\n}\n\n.actionButton {\n  width: auto;\n  flex-shrink: 0;\n}\n\n.promptInputBox {\n  height: initial;\n  min-height: size42;\n}\n\n.textarea {\n  width: sizeFluid;\n  max-height: size200;\n  min-height: sizeFluid;\n}\n\n.secondaryRow {\n  display: flex;\n  justify-content: space-between;\n  align-items: flex-start;\n}\n\n.textCounter {\n  margin-left: auto;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/PromptInput/PromptInput';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "PromptInput.module.css",
        "PromptInput.stories.module.css",
        "PromptInput.stories.tsx",
        "PromptInput.tsx",
        "index.ts"
      ]
    },
    "RadioButton": {
      "name": "RadioButton",
      "path": "src/components/RadioButton",
      "files": {
        "main": {
          "path": "RadioButton.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { GroupAlign } from '../../types/common';\n/**\n * Note:\n * Do not wrap Radio in a label. For simplicity's sake, Radio uses an\n * internal label tag to handle click delegation to the hidden input, and\n * nesting labels is a bad idea.\n */\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    label?: string;\n    radio?: string;\n}>;\nexport interface RadioButtonProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'children' | 'value' | 'disabled' | 'focused' | 'name' | 'selectedValue' | 'align' | 'classNames' | 'error' | 'onChange' | 'tabIndex' | 'ariaLabel'> {\n    children?: React.ReactNode;\n    value?: string;\n    disabled?: boolean;\n    focused?: boolean;\n    name?: string;\n    selectedValue?: string;\n    align?: GroupAlign;\n    classNames?: ClassNames;\n    error?: boolean;\n    onChange?: (newValue: string) => unknown;\n    tabIndex?: number;\n    ariaLabel?: string;\n    testId?: string;\n}\nexport declare const RadioButton: Flow.AbstractComponent<RadioButtonProps, HTMLInputElement>;\nexport {};\n//# sourceMappingURL=RadioButton.d.ts.map"
        },
        "story": {
          "path": "RadioButton.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {RadioButtonProps} from 'src/components/RadioButton/RadioButton';\nimport {RadioButton} from 'src/components/RadioButton/RadioButton';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Form Components/Radio Button',\n  component: RadioButton,\n  argTypes: {\n    name: {\n      description: 'Specify the name of the underlying `input` node',\n    },\n    // controlled selectedValue prop\n    selectedValue: {\n      name: 'selectedValue',\n      description:\n        'selectedValue will be compared with value of this radio to show as checked or unchecked',\n      table: {\n        type: {summary: 'string'},\n      },\n      control: {\n        disable: true,\n      },\n    },\n    tabIndex: {\n      description: 'Tab index applied to input',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 0},\n      },\n    },\n    value: {\n      name: 'value',\n      description:\n        'Value of this radio input. It is compared with selected value, to determine whether the radio is selected',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    disabled: {\n      name: 'disabled',\n      description: `Disabled RadioButton. When true, User can not interact with the the RadioButton.`,\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    focused: {\n      description: `When passed true the RadioButton will be focused to start with.`,\n      name: 'focused',\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    error: {\n      name: 'error',\n      description:\n        'Error state, when you need to show individual RadioButton in error state then use this prop',\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    classNames: {\n      description: 'External classNames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: '{wrapper?: string, label?: string, radio?: string}'},\n      },\n    },\n    children: {\n      description: 'Pass label as children',\n      table: {\n        type: {summary: 'React.Component | string'},\n      },\n    },\n    onChange: {\n      description:\n        '**onChange** handler that is applied to the input type=radio element',\n      action: 'value selected',\n      type: {summary: '(string) => mixed'},\n    },\n    align: {\n      description: 'To be used internally for Checkbox Group,',\n    },\n    ariaLabel: {\n      description:\n        'Pass label as ariaLabel. It is mandatory parameter for accessibility in case children is not a simple string.',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Radio Button component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { RadioButton } from \"@spaced-out/ui-design-system/lib/components/RadioButton\";\n\\`\\`\\`\nRadioButtons are used when only one choice may be selected in a series of options.\nRadioButtons component has been implemented using <code>< input type=\"radio\" >  <input type=\"radio\" > </code>\nIt is a controlled component, meaning that, you need to pass the selectedValue, if selectedValue is same as value then radio button will shown as checked.\nYou will pass a callback function in onChange prop, if radio is clicked this function will be called and you will receive\nthe selectedValue which will the value prop of RadioButton.\n\nRadioButton has to be only used as children to RadioGroup.\nRefer the <a href=\"../?path=/docs/form-components-radio-group--docs\">RadioGroup</a> documentation for details.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/RadioButton/RadioButton',\n    },\n  },\n};\n\nexport const RadioButtonStory = (args: RadioButtonProps) => {\n  const [selectedValue, setSelectedValue] = React.useState(args.selectedValue);\n  const onChangeHandler = (newValue: string): void => {\n    args.onChange?.(newValue);\n    setSelectedValue(newValue);\n  };\n  return (\n    <RadioButton\n      {...args}\n      onChange={onChangeHandler}\n      selectedValue={selectedValue}\n    />\n  );\n};\n\nRadioButtonStory.args = {\n  disabled: false,\n  focused: false,\n  children: 'Radio Button Label',\n  value: 'sample',\n  error: false,\n  testId: 'radio-button-story',\n};\nRadioButtonStory.storyName = 'Radio Button';\n"
        },
        "css": {
          "path": "RadioButton.module.css",
          "content": "@value (\n  borderWidthNone,\n  borderWidthTertiary,\n  borderRadiusMedium,\n  borderRadiusRadioButton\n) from '../../styles/variables/_border.css';\n\n@value (\n  colorBackgroundTertiary,\n  colorBorderSecondary,\n  colorBorderDanger,\n  colorFillPrimary,\n  colorFillDisabled,\n  colorFocusPrimary,\n  colorFocusDanger,\n  colorTextDisabled\n) from '../../styles/variables/_color.css';\n\n@value (\n  size20,\n  size110,\n  size160,\n  size240,\n  size500\n) from '../../styles/variables/_size.css';\n\n@value (\n  spaceNone,\n  spaceSmall,\n  spaceMedium,\n  spaceXSmall\n) from '../../styles/variables/_space.css';\n\n.container {\n  display: flex;\n  flex-direction: row;\n  gap: spaceSmall;\n  cursor: pointer;\n  align-items: center;\n  cursor: pointer;\n}\n\n.containerDisabled {\n  cursor: not-allowed;\n}\n\n.radio {\n  /* secret sauce to styling radio buttons */\n  appearance: none;\n  -webkit-appearance: none;\n  -mozilla-appearance: none;\n  vertical-align: text-bottom;\n  box-sizing: border-box;\n  border-radius: borderRadiusMedium;\n  height: size20;\n  width: size20;\n  min-width: size20;\n  min-height: size20;\n  background: colorBackgroundTertiary;\n  margin: spaceNone;\n  cursor: pointer;\n}\n\n.unselected {\n  border: borderWidthTertiary solid colorBorderSecondary;\n}\n\n.radio[disabled] {\n  border: borderWidthTertiary solid colorFillDisabled;\n  cursor: not-allowed;\n}\n\n.radio[disabled]:checked {\n  border: borderRadiusRadioButton solid colorFillDisabled;\n  background: colorBorderSecondary;\n}\n\n.radio:focus {\n  border: borderWidthTertiary solid colorFocusPrimary;\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n\n.radio:checked:focus .radio:focus:checked {\n  border: borderWidthTertiary solid colorFillPrimary;\n  border-radius: borderRadiusMedium;\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n\n.radio:checked {\n  border: borderRadiusRadioButton solid colorFillPrimary;\n}\n\n.selected {\n  border: borderRadiusRadioButton solid colorFillPrimary;\n}\n\n.radioLabel {\n  composes: formLabelMedium from '../../styles/typography.module.css';\n  composes: secondary from '../../styles/typography.module.css';\n}\n\n.labelDisabled {\n  color: colorTextDisabled;\n}\n\n.horizontalRadioButton {\n  flex: 1 0 size160; /*  grow, don't shrink, start with size160 width */\n}\n\n.fluidRadioButton {\n  flex: 0 0 auto; /* don't grow, don't shrink, auto width */\n}\n\n.error {\n  border: borderWidthTertiary solid colorBorderDanger;\n  border-radius: borderRadiusMedium;\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusDanger;\n}\n\n.error:focus {\n  border: borderWidthTertiary solid colorBorderDanger;\n  border-radius: borderRadiusMedium;\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusDanger;\n}\n\n.error:checked {\n  border: borderRadiusRadioButton solid colorBorderDanger;\n  border-radius: borderRadiusMedium;\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusDanger;\n  color: colorFocusDanger;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export { RadioButton } from '../../components/RadioButton/RadioButton';\nexport { RadioGroup } from '../../components/RadioButton/RadioGroup';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "RadioGroup.d.ts": {
            "path": "RadioGroup.d.ts",
            "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { GroupAlign } from '../../types/common';\n/**\n * Note:\n * Do not wrap Radio in a label. For simplicity's sake, Radio uses an\n * internal label tag to handle click delegation to the hidden input, and\n * nesting labels is a bad idea.\n */\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    radioGroup?: string;\n    errorText?: string;\n}>;\nexport interface RadioGroupProps {\n    align?: GroupAlign;\n    name: string;\n    value?: string;\n    onChange?: (value: string) => unknown;\n    children?: React.ReactNode;\n    classNames?: ClassNames;\n    error?: boolean;\n    errorText?: string;\n    testId?: string;\n}\nexport declare const RadioGroup: Flow.AbstractComponent<RadioGroupProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=RadioGroup.d.ts.map"
          }
        }
      },
      "allFiles": [
        "RadioButton.module.css",
        "RadioButton.stories.tsx",
        "RadioButton.tsx",
        "RadioGroup.module.css",
        "RadioGroup.stories.module.css",
        "RadioGroup.stories.tsx",
        "RadioGroup.tsx",
        "index.ts"
      ]
    },
    "RadioTile": {
      "name": "RadioTile",
      "path": "src/components/RadioTile",
      "files": {
        "main": {
          "path": "RadioTile.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { AlertSemanticType } from '../../types/common';\nimport type { IconSize, IconType } from '../../components/Icon';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n}>;\nexport interface RadioTileProps {\n    id: string;\n    classNames?: ClassNames;\n    semantic?: AlertSemanticType;\n    header?: string;\n    description?: string;\n    chipItems?: Array<string>;\n    onTileClick?: (e: React.SyntheticEvent<HTMLElement>, id: string) => void;\n    iconName?: string;\n    iconSize?: IconSize;\n    iconType?: IconType;\n    isSelected?: boolean;\n    testId?: string;\n}\nexport declare const RadioTile: Flow.AbstractComponent<RadioTileProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=RadioTile.d.ts.map"
        },
        "story": {
          "path": "RadioTile.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {ALERT_SEMANTIC} from 'src/types/common';\n\nimport {ICON_SIZE, ICON_TYPE} from 'src/components/Icon';\nimport type {RadioTileProps} from 'src/components/RadioTile';\nimport {RadioTile} from 'src/components/RadioTile';\nimport {SubTitleSmall} from 'src/components/Text';\n\nimport css from 'src/components/RadioTile/RadioTile.stories.module.css';\n\n\nconst semanticOptions: Array<unknown> = [...Object.values(ALERT_SEMANTIC)];\nconst iconSizeOptions: Array<unknown> = [...Object.values(ICON_SIZE)];\nconst iconTypeOptions: Array<unknown> = [...Object.values(ICON_TYPE)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'AI Prompt Components/Radio Tile',\n  component: RadioTile,\n  argTypes: {\n    id: {\n      description: 'id to be set for each RadioTile.',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {\n          summary: 'string',\n        },\n      },\n    },\n    header: {\n      description: 'Content to be displayed at the top of the RadioTile.',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {\n          summary: 'string',\n        },\n      },\n    },\n    description: {\n      description: 'Content to be displayed in the middle of the RadioTile.',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {\n          summary: 'string',\n        },\n      },\n    },\n    chipItems: {\n      description:\n        'Content to be displayed at the bottom in chips of the RadioTile.',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: 'Array<string>',\n        },\n      },\n    },\n    isSelected: {\n      description: 'isSelected indicates selection of the RadioTile.',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {\n          summary: 'boolean',\n        },\n      },\n    },\n    onTileClick: {\n      description:\n        '**onTileClick** handler that is applied to the RadioTile when clicked.',\n      action: 'clicked',\n      table: {\n        type: {summary: '(SyntheticEvent<HTMLElement>) => mixed'},\n      },\n    },\n    iconName: {\n      description: 'Name of the icon to be displayed in the RadioTile.',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {\n          summary: 'string',\n        },\n      },\n    },\n    semantic: {\n      description: 'Semantic of the icon to be displayed in the RadioTile.',\n      options: semanticOptions,\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {\n          summary: 'AlertSemanticType',\n          defaultValue: {summary: ALERT_SEMANTIC.neutral},\n        },\n      },\n    },\n    iconSize: {\n      description: 'Size of the icon in the RadioTile.',\n      control: {\n        type: 'select',\n      },\n      options: iconSizeOptions,\n      table: {\n        type: {\n          summary: 'IconSize',\n        },\n        defaultValue: {summary: ICON_SIZE.medium},\n      },\n    },\n    iconType: {\n      description: 'Type of the icon (e.g., outline, solid, duotone).',\n      control: {\n        type: 'select',\n      },\n      options: iconTypeOptions,\n      table: {\n        type: {\n          summary: 'IconType',\n        },\n        defaultValue: {summary: ICON_TYPE.solid},\n      },\n    },\n    classNames: {\n      description:\n        'Additional CSS classes to customize the appearance of the RadioTile.',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{wrapper?: string}',\n        },\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a RadioTile component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { RadioTile } from \"@spaced-out/ui-design-system/lib/components/RadioTile\";\n\\`\\`\\`\nThe RadioTile component is a user-interactive tile that combines a RadioButton with customizable content and optional icons. It is ideal for selection-based interfaces where users need to pick one option among a group of visually distinct tiles.\nThis component is particularly useful in dashboards, reporting applications, or forms where highlighting specific metrics, options, or data is required.\n\n### Usage\n\n\\`\\`\\`jsx\n<RadioTile\n  header=\"Candidate Skills\"\n  description=\"Extract skills from an VoiceFlow conversation\"\n  chipItems={['ATS Candidate', 'Candidate']}\n  iconName=\"chart-bar\"\n/>\n\\`\\`\\`\n\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/RadioTile/RadioTile',\n    },\n  },\n};\n\nexport const RadioTileStory = (args: RadioTileProps) => {\n  const [isSelected, setIsSelected] = React.useState(false);\n\n  const handleTileClick = (\n    _e: React.SyntheticEvent<HTMLElement>,\n    _id: string,\n  ) => {\n    setIsSelected(true);\n  };\n  return (\n    <>\n      <SubTitleSmall>Customizable</SubTitleSmall>\n      <br />\n      <div className={css.container}>\n        <RadioTile\n          {...args}\n          id=\"tile0\"\n          isSelected={isSelected}\n          onTileClick={handleTileClick}\n        />\n      </div>\n    </>\n  );\n};\n\nRadioTileStory.args = {\n  header: 'Candidate Skills',\n  description: 'Extract skills from an VoiceFlow conversation',\n  chipItems: ['ATS Candidate', 'Candidate'],\n  iconName: 'users',\n  semantic: 'neutral',\n  iconType: 'duotone',\n  testId: 'radio-tile-story',\n};\n\nexport const RadioTileGroupStory = (args: RadioTileProps) => {\n  const [selectedId, setSelectedId] = React.useState<string | null>(null);\n\n  const handleTileClick = (\n    _e: React.SyntheticEvent<HTMLElement>,\n    id: string,\n  ) => {\n    setSelectedId(id);\n  };\n\n  return (\n    <div className={css.groupContainer}>\n      <RadioTile\n        {...args}\n        id=\"tile1\"\n        isSelected={selectedId === 'tile1'}\n        semantic=\"information\"\n        header=\"Summarize Text\"\n        description=\"Extract skills from an VoiceFlow conversation.\"\n        chipItems={['Text Analyzation']}\n        iconName=\"calendar\"\n        onTileClick={handleTileClick}\n      />\n\n      <RadioTile\n        {...args}\n        id=\"tile2\"\n        isSelected={selectedId === 'tile2'}\n        semantic=\"warning\"\n        header=\"Candidate Skills\"\n        description=\"Extract skills from an VoiceFlow conversation.\"\n        chipItems={['ATS Database', 'Candidate']}\n        iconName=\"chart-bar\"\n        onTileClick={handleTileClick}\n      />\n\n      <RadioTile\n        {...args}\n        id=\"tile3\"\n        isSelected={selectedId === 'tile3'}\n        semantic=\"neutral\"\n        header=\"Categorize Sentiment\"\n        description=\"Categorize the sentiment of SMS survey results.\"\n        chipItems={['Text Analyzation', 'Survey']}\n        iconName=\"analytics\"\n        onTileClick={handleTileClick}\n      />\n\n      <RadioTile\n        {...args}\n        id=\"tile4\"\n        isSelected={selectedId === 'tile4'}\n        semantic=\"danger\"\n        header=\"Custom Report\"\n        description=\"Generate an automation with your own custom prompt\"\n        chipItems={['Custom Config']}\n        iconName=\"books\"\n        onTileClick={handleTileClick}\n      />\n    </div>\n  );\n};\n\nRadioTileGroupStory.args = {\n  iconSize: 'medium',\n  iconType: 'solid',\n  testId: 'radio-tile-group-story',\n};\nRadioTileStory.storyName = 'Radio Tile';\nRadioTileGroupStory.storyName = 'Radio Tile Group';\n"
        },
        "css": {
          "path": "RadioTile.module.css",
          "content": "@value (spaceXXSmall, spaceXSmall, spaceSmall) from '../../styles/variables/_space.css';\n@value (size252, size26) from '../../styles/variables/_size.css';\n\n.wrapper {\n  display: flex;\n  min-width: size252;\n  height: fit-content;\n  gap: spaceSmall;\n}\n\n.btnContainer {\n  align-self: center;\n  margin-left: auto;\n}\n\n.radioButtonWrapper {\n  padding-left: size26;\n}\n\n.iconContainer {\n  align-self: flex-start;\n}\n\n.chipsContainer {\n  display: flex;\n  flex-wrap: wrap;\n  gap: spaceXSmall;\n  margin-top: auto;\n}\n\n.contentContainer {\n  display: flex;\n  flex-direction: column;\n  gap: spaceSmall;\n}\n\n.textContainer {\n  display: flex;\n  flex-direction: column;\n  gap: spaceXXSmall;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/RadioTile/RadioTile';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "RadioTile.module.css",
        "RadioTile.stories.module.css",
        "RadioTile.stories.tsx",
        "RadioTile.tsx",
        "index.ts"
      ]
    },
    "RangeSlider": {
      "name": "RangeSlider",
      "path": "src/components/RangeSlider",
      "files": {
        "main": {
          "path": "RangeSlider.d.ts",
          "content": "import type { Flow } from 'flow-to-typescript-codemod';\nimport type { ButtonSize } from '../../components/Button';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n}>;\nexport interface RangeSliderProps {\n    min?: number;\n    max?: number;\n    step?: number;\n    value?: number;\n    onChange?: (value: number) => void;\n    showTicks?: boolean;\n    iconLeftName?: string;\n    btnLeftSize?: ButtonSize;\n    iconRightName?: string;\n    btnRightSize?: ButtonSize;\n    disabled?: boolean;\n    hideLeftBtn?: boolean;\n    hideRightBtn?: boolean;\n    classNames?: ClassNames;\n    ariaLabel?: string;\n    showRange?: boolean;\n    hideValueInput?: boolean;\n    testId?: string;\n}\nexport declare const RangeSlider: Flow.AbstractComponent<RangeSliderProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=RangeSlider.d.ts.map"
        },
        "story": {
          "path": "RangeSlider.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {BUTTON_SIZE} from 'src/components/Button';\nimport type {RangeSliderProps} from 'src/components/RangeSlider/RangeSlider';\nimport {RangeSlider} from 'src/components/RangeSlider/RangeSlider';\nimport {SubTitleSmall} from 'src/components/Text';\n\nimport css from 'src/components/RangeSlider/RangeSlider.stories.module.css';\n\n\nconst btnSizeOptions: Array<unknown> = [...Object.values(BUTTON_SIZE)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Form Components/Range Slider',\n  component: RangeSlider,\n  argTypes: {\n    classNames: {\n      description: 'Provide an optional className to be applied to the wrapper',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{wrapper?: string}',\n        },\n      },\n    },\n    disabled: {\n      description: 'If **true**, the component is disabled',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    showRange: {\n      description:\n        'If **true**, the component would show min and max value as text instead of icons',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    hideValueInput: {\n      description:\n        'If **true**, the component would hide the value input to the right of the slider',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    min: {\n      description: 'The minimum value of the slider',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: '0'},\n      },\n    },\n    max: {\n      description: 'The maximum value of the slider',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: '100'},\n      },\n    },\n    step: {\n      description: 'The step size of the slider',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: '1'},\n      },\n    },\n    value: {\n      description: 'The current value of the slider',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: '10'},\n      },\n    },\n    showTicks: {\n      description: 'If **true**, show ticks on the slider',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    iconLeftName: {\n      description: 'The name of the left icon',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'minus'},\n      },\n    },\n    btnLeftSize: {\n      description: 'The size of the left icon',\n      options: btnSizeOptions,\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'IconSize'},\n        defaultValue: {summary: 'small'},\n      },\n    },\n    iconRightName: {\n      description: 'The name of the right icon',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'plus'},\n      },\n    },\n    btnRightSize: {\n      description: 'The size of the right icon',\n      options: btnSizeOptions,\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'IconSize'},\n        defaultValue: {summary: 'small'},\n      },\n    },\n    hideLeftBtn: {\n      description: 'If **true**, hide the left icon',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    hideRightBtn: {\n      description: 'If **true**, hide the right icon',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    onChange: {\n      description: 'Callback function to handle value changes',\n      control: {\n        type: 'function',\n      },\n      table: {\n        type: {summary: '(value: number) => void'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a RangeSlider component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { RangeSlider } from \"@spaced-out/ui-design-system/lib/components/RangeSlider\";\n\\`\\`\\`\nThe **RangeSlider** component is a customizable slider input that allows users to select a value from a specified range.\nIt supports optional icons on either side, a tick mark display, and disabled states.\n\n### Usage\n\nHere is how you can use the **RangeSlider** component in your React application:\n\n\\`\\`\\`jsx\nimport { RangeSlider } from \"@spaced-out/ui-design-system/lib/components/RangeSlider\";\n\nconst App = () => {\n  const [value, setValue] = React.useState(50);\n\n  const handleChange = (newValue) => {\n    setValue(newValue);\n  };\n\n  return (\n    <RangeSlider\n      value={value}\n      onChange={handleChange}\n    />\n  );\n};\n\\`\\`\\`\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/RangeSlider/RangeSlider',\n    },\n  },\n};\n\nexport const SimpleStory = (args: RangeSliderProps) => {\n  const [value, setValue] = React.useState(args.value);\n\n  React.useEffect(() => {\n    setValue(args.value);\n  }, [args.value]);\n\n  return (\n    <div className={css.container}>\n      <RangeSlider\n        {...args}\n        value={value}\n        onChange={(value) => setValue(value)}\n      />\n\n      <SubTitleSmall color={args.disabled ? 'disabled' : 'secondary'}>\n        Value: {value}\n      </SubTitleSmall>\n    </div>\n  );\n};\n\nSimpleStory.args = {\n  classNames: {wrapper: ''},\n  value: 10,\n  testId: 'range-slider-simple-story',\n};\n\nexport const WithRangeTextStory = (args: RangeSliderProps) => {\n  const [value, setValue] = React.useState(args.value);\n\n  React.useEffect(() => {\n    setValue(args.value);\n  }, [args.value]);\n\n  return (\n    <div className={css.container}>\n      <RangeSlider\n        {...args}\n        value={value}\n        onChange={(value) => setValue(value)}\n      />\n\n      <SubTitleSmall color={args.disabled ? 'disabled' : 'secondary'}>\n        Value: {value}\n      </SubTitleSmall>\n    </div>\n  );\n};\n\nWithRangeTextStory.args = {\n  classNames: {wrapper: ''},\n  value: 10,\n  showRange: true,\n  testId: 'range-slider-range-text-story',\n};\n\nexport const WithCustomIconStory = (args: RangeSliderProps) => {\n  const [value, setValue] = React.useState(args.value);\n\n  React.useEffect(() => {\n    setValue(args.value);\n  }, [args.value]);\n\n  return (\n    <div className={css.container}>\n      <RangeSlider\n        {...args}\n        value={value}\n        onChange={(value) => setValue(value)}\n      />\n\n      <SubTitleSmall color={args.disabled ? 'disabled' : 'secondary'}>\n        Value: {value}\n      </SubTitleSmall>\n    </div>\n  );\n};\n\nWithCustomIconStory.args = {\n  classNames: {wrapper: ''},\n  value: 10,\n  step: 10,\n  iconLeftName: 'volume-low',\n  iconRightName: 'volume-high',\n  testId: 'range-slider-custom-icon-story',\n};\n\nexport const WithTicksStory = (args: RangeSliderProps) => {\n  const [value, setValue] = React.useState(args.value);\n\n  React.useEffect(() => {\n    setValue(args.value);\n  }, [args.value]);\n\n  const handleChange = (value: number) => {\n    console.error(value);\n    setValue(value);\n  };\n\n  return (\n    <div className={css.container}>\n      <RangeSlider\n        {...args}\n        value={value}\n        onChange={(value) => handleChange(value)}\n      />\n\n      <SubTitleSmall color={args.disabled ? 'disabled' : 'secondary'}>\n        Value: {value}\n      </SubTitleSmall>\n    </div>\n  );\n};\n\nWithTicksStory.args = {\n  classNames: {wrapper: ''},\n  value: 0,\n  step: 1,\n  min: 0,\n  max: 20,\n  showTicks: true,\n  showRange: true,\n  testId: 'range-slider-ticks-story',\n};\nSimpleStory.storyName = 'Simple';\nWithRangeTextStory.storyName = 'With Range Text';\nWithCustomIconStory.storyName = 'With Custom Icon';\nWithTicksStory.storyName = 'With Ticks';\n"
        },
        "css": {
          "path": "RangeSlider.module.css",
          "content": "@value (colorFillPrimary, colorGrayLightest, colorBackgroundTertiary, colorFocusPrimary, colorTextDisabled) from '../../styles/variables/_color.css';\n@value (sizeFluid, size4, size20, size2, size34) from '../../styles/variables/_size.css';\n@value (spaceXXSmall, spaceNone) from '../../styles/variables/_space.css';\n@value (borderRadiusLarge, borderRadiusCircle, borderWidthTertiary, borderWidthNone) from '../../styles/variables/_border.css';\n\n@value thumbSize: size20;\n@value tickSize: size2;\n\n.wrapper {\n  display: flex;\n  align-items: center;\n  width: sizeFluid;\n  gap: spaceXXSmall;\n}\n\n.sliderContainer {\n  display: flex;\n  flex-flow: column;\n  align-items: center;\n  position: relative;\n  width: sizeFluid;\n}\n\n.slider {\n  display: flex;\n  align-items: center;\n  -webkit-appearance: none;\n  appearance: none;\n  width: sizeFluid;\n  height: size4;\n  background-color: colorGrayLightest;\n  border-radius: borderRadiusLarge;\n  outline: none;\n  cursor: pointer;\n}\n\n.slider::-webkit-slider-thumb {\n  -webkit-appearance: none;\n  appearance: none;\n  width: thumbSize;\n  height: thumbSize;\n  border-radius: borderRadiusCircle;\n  background: colorFillPrimary;\n  cursor: progress;\n  border: borderWidthTertiary solid colorBackgroundTertiary;\n  cursor: move; /* fallback if grab cursor is unsupported */\n  cursor: grab;\n  cursor: -webkit-grab;\n}\n\n.slider:active::-webkit-slider-thumb {\n  cursor: grabbing;\n  cursor: -webkit-grabbing;\n}\n\n.disabled .slider::-webkit-slider-thumb {\n  background: colorTextDisabled; /* Disabled thumb color */\n  cursor: not-allowed;\n}\n\n.slider::-moz-range-thumb {\n  width: thumbSize;\n  height: thumbSize;\n  border-radius: borderRadiusCircle;\n  background: colorFillPrimary;\n  cursor: progress;\n  border: borderWidthTertiary solid colorBackgroundTertiary;\n  cursor: move; /* fallback if grab cursor is unsupported */\n  cursor: grab;\n  cursor: -moz-grab;\n}\n\n.slider:active::-moz-range-thumb {\n  cursor: grabbing;\n  cursor: -moz-grabbing;\n}\n\n.disabled .slider::-moz-range-thumb {\n  background: colorTextDisabled; /* Disabled thumb color */\n  cursor: not-allowed;\n}\n\n/***** Focus Styles *****/\n/* Removes default focus */\n.slider:focus {\n  outline: none;\n}\n\n.slider:focus::-webkit-slider-thumb {\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n\n.slider:focus::-moz-range-thumb {\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n\n.sliderTicks {\n  display: flex;\n  position: absolute;\n  top: calc(spaceXXSmall / 4);\n  width: sizeFluid;\n  justify-content: space-between;\n  pointer-events: none; /* Prevent ticks from interfering with slider interaction */\n  padding: spaceNone calc(thumbSize / 2); /* Half of thumb size */\n}\n\n.sliderTicks option {\n  display: flex;\n  background-color: colorFillPrimary;\n  width: tickSize;\n  height: tickSize;\n  border-radius: borderRadiusLarge;\n  display: flex;\n  padding-block-start: spaceNone;\n  padding-block-end: spaceNone;\n  min-block-size: tickSize;\n  padding-inline: spaceNone;\n  white-space: nowrap;\n}\n\n.sliderTicks option.disabled {\n  background-color: colorTextDisabled;\n}\n\n.rangeText {\n  display: flex;\n  min-width: size34;\n  min-height: size34;\n  justify-content: center;\n  align-items: center;\n}\n\n.valueInputWrapper {\n  max-width: 58px;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/RangeSlider/RangeSlider';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "RangeSlider.module.css",
        "RangeSlider.stories.module.css",
        "RangeSlider.stories.tsx",
        "RangeSlider.tsx",
        "index.ts"
      ]
    },
    "Rating": {
      "name": "Rating",
      "path": "src/components/Rating",
      "files": {
        "main": {
          "path": "Rating.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { ColorTypes } from '../../types/typography';\nimport type { ChipSemanticType } from '../../components/Chip';\nexport declare const RATING_SIZE: Readonly<{\n    small: \"small\";\n    medium: \"medium\";\n}>;\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    icon?: string;\n    button?: string;\n}>;\ntype RatingSize = (typeof RATING_SIZE)[keyof typeof RATING_SIZE];\nexport interface RatingProps {\n    size?: RatingSize;\n    start?: number;\n    end?: number;\n    quiet?: boolean;\n    rating?: number;\n    labels?: Array<string>;\n    iconColor?: ColorTypes;\n    onChange?: (rating: number, arg2?: React.SyntheticEvent<HTMLElement> | null | undefined) => unknown;\n    readOnly?: boolean;\n    hideLabel?: boolean;\n    iconName?: string;\n    classNames?: ClassNames;\n    chipSemantic?: ChipSemanticType;\n    testId?: string;\n}\nexport declare const Rating: Flow.AbstractComponent<RatingProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=Rating.d.ts.map"
        },
        "story": {
          "path": "Rating.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {TEXT_COLORS} from 'src/types/typography';\nimport {RATINGS} from 'src/utils/rating';\n\nimport {BUTTON_SIZE} from 'src/components/Button';\nimport {CHIP_SEMANTIC} from 'src/components/Chip';\nimport type {RatingProps} from 'src/components/Rating/Rating';\nimport {Rating, RATING_SIZE} from 'src/components/Rating/Rating';\n\n\nconst colorOptions: Array<unknown> = [...Object.values(TEXT_COLORS)];\nconst sizeOptions: Array<unknown> = [...Object.values(BUTTON_SIZE)];\nconst chipSemanticOptions: Array<unknown> = [...Object.values(CHIP_SEMANTIC)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Rating',\n  component: Rating,\n  argTypes: {\n    classNames: {\n      description: 'External classNames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{wrapper?: string, icon?: string, button?: string}',\n        },\n      },\n    },\n    rating: {\n      description: 'The current rating',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: 0},\n      },\n    },\n    start: {\n      description: 'Range starting value (exclusive)',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: 0},\n      },\n    },\n    end: {\n      description: 'Range stop value (inclusive)',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: 5},\n      },\n    },\n    iconName: {\n      description:\n        'Icon Name represents name of icon as supported by fontawesome',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'star'},\n      },\n    },\n    size: {\n      description: 'The size of the Rating Component',\n      options: sizeOptions,\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'RatingSize'},\n        defaultValue: {summary: RATING_SIZE.medium},\n      },\n    },\n    hideLabel: {\n      description: 'If **true**, hide the right label',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    readOnly: {\n      description:\n        'If **true**, the icon\\'s hover and selection are disabled, and the button wrapper around it is removed',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    quiet: {\n      description: 'If **true**, disables hover',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    onChange: {\n      description: 'Callback function to handle value changes',\n      control: {\n        type: 'function',\n      },\n      action: 'selected',\n      table: {\n        type: {summary: '(value: number) => void'},\n      },\n    },\n    iconColor: {\n      description: 'Same set of colors as supported in text',\n      options: colorOptions,\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: TEXT_COLORS.favorite},\n      },\n    },\n    chipSemantic: {\n      options: chipSemanticOptions,\n      description:\n        'Semantic type of a Chip. It will have different background color for different semantic type',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: CHIP_SEMANTIC.warning},\n      },\n    },\n    labels: {\n      description: 'Assign labels to each rating value',\n      control: {\n        type: 'array',\n      },\n      table: {\n        type: {summary: 'Array<string>'},\n        defaultValue: {summary: RATINGS.join(',|') as string},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Rating component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Rating } from \"@spaced-out/ui-design-system/lib/components/Rating\";\n\\`\\`\\`\nThe **Rating** component enables users to select a rating by hovering over and choosing a number of icons. A label appears beside the icons, indicating the significance of the selected rating, offering clear user feedback. The component is customizable to fit various design needs.\n### Usage\n\nHere is how you can use the **Rating** component in your React application:\n\n\\`\\`\\`jsx\nimport { Rating } from \"@spaced-out/ui-design-system/lib/components/Rating\";\n\nconst App = () => {\nconst [rating, setRating] = React.useState(args.rating);\n\nreturn (\n  <Rating\n    {...args}\n    rating={rating}\n    onChange={(newRating) => setRating(newRating)}\n  />\n};\n\\`\\`\\`\n          `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Rating/Rating',\n    },\n  },\n};\n\nexport const SimpleStory = (args: RatingProps) => {\n  const [rating, setRating] = React.useState(args.rating);\n\n  React.useEffect(() => {\n    setRating(args.rating);\n  }, [args.rating]);\n\n  const onChangeHandler = (newRating: number) => {\n    args.onChange?.(newRating);\n    setRating(newRating);\n  };\n\n  return <Rating {...args} rating={rating} onChange={onChangeHandler} />;\n};\n\nSimpleStory.args = {\n  classNames: {wrapper: ''},\n  rating: 1,\n  testId: 'rating-simple-story',\n};\n\nexport const ReadOnlyStory = (args: RatingProps) => {\n  const [rating, setRating] = React.useState(args.rating);\n\n  React.useEffect(() => {\n    setRating(args.rating);\n  }, [args.rating]);\n\n  const onChangeHandler = (newRating: number) => {\n    args.onChange?.(newRating);\n    setRating(newRating);\n  };\n\n  return <Rating {...args} rating={rating} onChange={onChangeHandler} />;\n};\n\nReadOnlyStory.args = {\n  classNames: {wrapper: ''},\n  iconColor: TEXT_COLORS.tertiary,\n  hideLabel: true,\n  readOnly: true,\n  testId: 'rating-read-only-story',\n};\n\nexport const CustomLabelsStory = (args: RatingProps) => {\n  const [rating, setRating] = React.useState(args.rating);\n\n  React.useEffect(() => {\n    setRating(args.rating);\n  }, [args.rating]);\n\n  const onChangeHandler = (newRating: number) => {\n    args.onChange?.(newRating);\n    setRating(newRating);\n  };\n\n  return <Rating {...args} rating={rating} onChange={onChangeHandler} />;\n};\n\nCustomLabelsStory.args = {\n  classNames: {wrapper: ''},\n  iconColor: TEXT_COLORS.information,\n  chipSemantic: CHIP_SEMANTIC.information,\n  start: 2,\n  end: 6,\n  rating: 2,\n  labels: ['Worst', 'Bad', 'Good', 'Better', 'Best'],\n  testId: 'rating-custom-labels-story',\n};\nSimpleStory.storyName = 'Simple';\nReadOnlyStory.storyName = 'Read Only';\nCustomLabelsStory.storyName = 'Custom Labels';\n"
        },
        "css": {
          "path": "Rating.module.css",
          "content": "@value (\n    spaceNone,\n    spaceXSmall,\n    spaceXXSmall\n) from '../../styles/variables/_space.css';\n@value (\n  colorFocusPrimary\n) from '../../styles/variables/_color.css';\n@value (\n  borderRadiusXSmall,\n  borderWidthNone,\n  borderWidthTertiary\n) from '../../styles/variables/_border.css';\n\n.ratingContainer {\n  width: fit-content;\n  display: flex;\n  align-items: center;\n  gap: spaceXSmall;\n  margin: spaceXXSmall spaceXSmall;\n}\n\n.stars {\n  display: flex;\n}\n\n.icon {\n  composes: motionEaseInEaseOut from '../../styles/animation.module.css';\n  margin: spaceNone spaceXXSmall;\n}\n\n.button {\n  border-radius: borderRadiusXSmall;\n  outline: none;\n  cursor: pointer;\n}\n\n.button:focus {\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Rating/Rating';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "Rating.module.css",
        "Rating.stories.tsx",
        "Rating.tsx",
        "index.ts"
      ]
    },
    "ScoreBar": {
      "name": "ScoreBar",
      "path": "src/components/ScoreBar",
      "files": {
        "main": {
          "path": "ScoreBar.d.ts",
          "content": "import type { Flow } from 'flow-to-typescript-codemod';\nexport declare const Direction: Readonly<{\n    horizontal: \"horizontal\";\n    vertical: \"vertical\";\n}>;\ntype ClassNames = Readonly<{\n    container?: string;\n    wrapper?: string;\n    bar?: string;\n    label?: string;\n}>;\nexport type ScoreBarDirection = (typeof Direction)[keyof typeof Direction];\nexport type ScoreBarColorMap = Readonly<{\n    [key: string]: string;\n}>;\nexport type ScoreBarLabelMap = ScoreBarColorMap;\nexport interface ScoreBarProps {\n    classNames?: ClassNames;\n    direction?: ScoreBarDirection;\n    colorMap?: ScoreBarColorMap;\n    labelMap?: ScoreBarLabelMap;\n    totalBars?: number;\n    score?: number;\n    withBorder?: boolean;\n    testId?: string;\n}\nexport declare const DEFAULT_COLOR_MAP: ScoreBarColorMap;\nexport declare const ScoreBar: Flow.AbstractComponent<ScoreBarProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=ScoreBar.d.ts.map"
        },
        "story": {
          "path": "ScoreBar.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {ScoreBarProps} from 'src/components/ScoreBar/ScoreBar';\nimport {\n  DEFAULT_COLOR_MAP,\n  Direction,\n  ScoreBar,\n} from 'src/components/ScoreBar/ScoreBar';\n\n\nconst scoreBarDirectionOptions: Array<unknown> = [...Object.values(Direction)];\n\nconst SAMPLE_LABEL_MAP = Object.freeze({\n  '100': 'Excellent Match',\n  '80': 'Good Match',\n  '60': 'Average Match',\n  '40': 'Below Average Match',\n  '20': 'Poor match',\n});\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Score Bar',\n  component: ScoreBar,\n  argTypes: {\n    classNames: {\n      description: 'External classNames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{wrapper?: string, container?: string, bar?: string}',\n        },\n      },\n    },\n    score: {\n      description: 'The current score',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: 0},\n      },\n    },\n    totalBars: {\n      description: 'The bar count, with a minimum value of 1',\n      control: {\n        type: 'number',\n        min: 1,\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: 5},\n        disable: true,\n      },\n    },\n    colorMap: {\n      description:\n        'The **colorMap** prop is an object where each key is a numeric string representing a percentage of totalBars, and its value is the color to be applied for inputs within a specific range. The ranges are determined by the keys.',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: 'object'},\n        defaultValue: {\n          summary: Array.from(\n            Object.entries(DEFAULT_COLOR_MAP),\n            ([name, value]: [string, string]) => `${name}: ${String(value)}`,\n          ).join(',|') as string,\n        },\n      },\n    },\n    labelMap: {\n      description:\n        'The **labelMap** prop is an object where each key is a numeric string representing a percentage of totalBars, and its value is the label to be applied for inputs within a specific range. The ranges are determined by the keys.',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: 'object'},\n      },\n    },\n    direction: {\n      description: 'The direction in which the bars will be stacked.',\n      options: scoreBarDirectionOptions,\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: Direction.vertical},\n        disable: true,\n      },\n    },\n    withBorder: {\n      description: 'Determines whether a border is applied to the ScoreBar.',\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Score Bar component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { ScoreBar } from \"@spaced-out/ui-design-system/lib/components/ScoreBar\";\n\\`\\`\\`\nThe **ScoreBar** component is intended to display a score based on a total rating of 100%.\nWhen the score equals the totalBars, it is termed a perfect score.\nSimilarly, percentages are determined using the totalBars and score.\nThe score is divided into five percentage categories, each represented by a separate color.\nThe process enables users to rapidly determine where a score falls in a straightforward and logical manner. If the score does not fall inside a specified range, the inactive color is applied.\n\n**Note:**\nThe labelMap and colorMap props are objects where each key is a numeric string representing a percentage of totalBars as a boundary, and their values define labels or colors to be applied to inputs within specific ranges. The ranges are determined by the keys, and the labels or colors are assigned based on the following rules:\n\n- **Boundary Definition:** Each key in labelMap or colorMap acts as a boundary. Inputs are grouped into ranges based on these keys, starting from 0 up to the highest key.\n- **Value Assignment:** For labelMap and colorMap, the value is the label or color applied to all inputs within a range. For colorMap, the value is the color applied to inputs in the same range. colorMap also takes an extra key **inactive** which is applied to the bars outside the range.\n- **Closest Upper Key:** If an input does not match an exact key, the label or color of the closest higher key is applied.\n- **Fallback for Higher Inputs:** If an input exceeds the highest key, it inherits the label or color of the highest key. The highest key should not exceed 100, as the maximum percentage is always 100%.\n\n**Example:**\nIf the labelMap is \\`\\`\\`{ '20': 'Low', '50': 'Medium', '80': 'High' }\\`\\`\\`:\n- **0% - 20%:** label 'Low' will be used.\n- **21% - 50%:** label 'Medium' will be used.\n- **51% - 80%:** label 'High' will be used.\n- **>80%:** label 'High' (of the highest key) will be used.\n- **inactive:** Used only in **colorMap** to represent segments outside the calculated range.\n\n### Usage\n\nHere is how you can use the **ScoreBar** component in your React application:\n\n\\`\\`\\`jsx\nimport { ScoreBar } from \"@spaced-out/ui-design-system/lib/components/ScoreBar\";\n\nconst App = () => {\nconst [score, setScore] = args.score;\n\nreturn (\n  <ScoreBar\n    {...args}\n    score={score}\n  />\n};\n\\`\\`\\`\n          `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/ScoreBar/ScoreBar',\n    },\n  },\n};\n\nexport const SimpleStory = (args: ScoreBarProps) => <ScoreBar {...args} />;\n\nSimpleStory.args = {\n  score: 1,\n  testId: 'score-bar-simple-story',\n};\n\nexport const WithBorderStory = (args: ScoreBarProps) => <ScoreBar {...args} />;\n\nWithBorderStory.args = {\n  score: 3,\n  withBorder: true,\n  testId: 'score-bar-with-border-story',\n};\n\nexport const WithLabelStory = (args: ScoreBarProps) => <ScoreBar {...args} />;\n\nWithLabelStory.args = {\n  score: 4,\n  labelMap: SAMPLE_LABEL_MAP,\n  testId: 'score-bar-with-label-story',\n};\n\nexport const WithLabelAndBorderStory = (args: ScoreBarProps) => (\n  <ScoreBar {...args} />\n);\n\nWithLabelAndBorderStory.args = {\n  score: 5,\n  withBorder: true,\n  labelMap: SAMPLE_LABEL_MAP,\n  testId: 'score-bar-with-label-and-border-story',\n};\nSimpleStory.storyName = 'Simple';\nWithBorderStory.storyName = 'With Border';\nWithLabelStory.storyName = 'With Label';\nWithLabelAndBorderStory.storyName = 'With Label And Border';\n"
        },
        "css": {
          "path": "ScoreBar.module.css",
          "content": "@value (\n    spaceXSmall,\n    spaceXXSmall\n) from '../../styles/variables/_space.css';\n@value (\n    borderRadiusSmall,\n    borderRadiusXSmall\n) from '../../styles/variables/_border.css';\n\n.scoreBarWrapper {\n  display: flex;\n  padding: spaceXSmall;\n  align-items: center;\n  justify-content: center;\n  width: fit-content;\n}\n\n.scoreBarContainer {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: calc(spaceXXSmall / 2);\n  width: var(--width);\n  height: var(--height);\n  flex-direction: var(--direction);\n}\n\n.bar {\n  width: var(--width);\n  height: var(--height);\n  border-radius: borderRadiusXSmall;\n  background-color: var(--background-color);\n}\n\n.scoreBarBorder {\n  composes: borderPrimary from '../../styles/border.module.css';\n  border-radius: borderRadiusSmall;\n}\n\n.scoreBarLabel {\n  padding-left: spaceXSmall;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/ScoreBar/ScoreBar';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "ScoreBar.module.css",
        "ScoreBar.stories.tsx",
        "ScoreBar.tsx",
        "index.ts"
      ]
    },
    "ScrollingLoader": {
      "name": "ScrollingLoader",
      "path": "src/components/ScrollingLoader",
      "files": {
        "main": {
          "path": "ScrollingLoader.d.ts",
          "content": "import type { Flow } from 'flow-to-typescript-codemod';\nexport declare const SCROLLING_LOADER_SIZE: Readonly<{\n    medium: \"medium\";\n    large: \"large\";\n    fluid: \"fluid\";\n}>;\nexport type ScrollingLoaderSize = (typeof SCROLLING_LOADER_SIZE)[keyof typeof SCROLLING_LOADER_SIZE];\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    skeletonContainer?: string;\n    textContainer?: string;\n}>;\nexport interface IconItem {\n    name: string;\n    type?: 'regular' | 'solid' | 'duotone' | 'brands';\n}\nexport interface ScrollingLoaderProps {\n    /** List of icons to display in skeleton rows */\n    iconList: IconItem[];\n    /** List of text messages to cycle through */\n    textList: string[];\n    /** Size variant of the loader */\n    size?: ScrollingLoaderSize;\n    /** Custom class names for styling */\n    classNames?: ClassNames;\n    /** Test ID for the component */\n    testId?: string;\n    /** Animation duration in ms for each text item (default: 2500) */\n    textAnimationDuration?: number;\n    /** Whether to loop through texts or stop at the last one (default: false) */\n    loopTexts?: boolean;\n}\nexport declare const ScrollingLoader: Flow.AbstractComponent<ScrollingLoaderProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=ScrollingLoader.d.ts.map"
        },
        "story": {
          "path": "ScrollingLoader.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {ScrollingLoaderProps} from 'src/components/ScrollingLoader/ScrollingLoader';\nimport {\n  SCROLLING_LOADER_SIZE,\n  ScrollingLoader,\n} from 'src/components/ScrollingLoader/ScrollingLoader';\n\nimport css from 'src/components/ScrollingLoader/ScrollingLoader.stories.module.css';\n\n\nconst sizeOptions: Array<unknown> = [...Object.values(SCROLLING_LOADER_SIZE)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'AI Prompt Components/Scrolling Loader',\n  component: ScrollingLoader,\n  argTypes: {\n    iconList: {\n      description:\n        'List of icons to display in the skeleton rows. Each item should have a `name` and optional `type`.',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary:\n            'Array<{ name: string; type?: \"regular\" | \"solid\" | \"duotone\" | \"brands\" }>',\n        },\n      },\n    },\n    textList: {\n      description: 'List of text messages to cycle through with fade animation',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: 'Array<string>'},\n      },\n    },\n    size: {\n      description:\n        'Size variant of the loader. Medium (284px), Large (320px), or Fluid (100%)',\n      options: sizeOptions,\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: SCROLLING_LOADER_SIZE.medium},\n      },\n    },\n    textAnimationDuration: {\n      description: 'Duration in milliseconds for each text item display',\n      control: {type: 'number'},\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: 2500},\n      },\n    },\n    classNames: {\n      description: 'External classNames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary:\n            '{wrapper?: string, skeletonContainer?: string, textContainer?: string}',\n        },\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    loopTexts: {\n      description:\n        'Whether to loop through texts continuously or stop at the last one. When false, animation stops at the last text received.',\n      control: {type: 'boolean'},\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'A scrolling loader with skeleton animation and cycling text',\n      description: {\n        component: `\n\\`\\`\\`jsx\nimport { ScrollingLoader } from \"@spaced-out/ui-design-system/lib/components/ScrollingLoader\";\n\\`\\`\\`\n**ScrollingLoader**\n\nUse this component to display a loading state with animated skeleton rows and cycling text messages.\nPerfect for showing progress during agent creation, publishing, or other multi-step processes.\n\n**Features:**\n- Infinite scrolling skeleton rows with icons\n- Smooth fade-in/fade-out text transitions\n- Gradient fades at top and bottom for seamless loop effect\n- Three size variants: medium, large, and fluid\n- Streaming support: texts can be added dynamically without breaking animations\n\n**Usage:**\n\n\\`\\`\\`jsx\n<ScrollingLoader\n  iconList={[\n    { name: 'envelope' },\n    { name: 'list-check' },\n    { name: 'filter' },\n    { name: 'calendar' },\n    { name: 'circle-question' },\n    { name: 'hand-wave' },\n  ]}\n  textList={[\n    'Publishing your agent...',\n    'Generating Greetings prompt...',\n    'Generating Data Collection prompt...',\n    'Setting things up for you…',\n  ]}\n  size=\"medium\"\n/>\n\\`\\`\\`\n\n**Streaming Usage:**\n\nWhen receiving texts from a stream (e.g., WebSocket, SSE), you can pass them dynamically.\nBy default (\\`loopTexts={false}\\`), the animation stops at the last text and resumes when new texts arrive.\n\n\\`\\`\\`jsx\nconst [streamedTexts, setStreamedTexts] = useState<string[]>([]);\n\n// In your stream handler:\nonStreamMessage((text) => {\n  setStreamedTexts(prev => [...prev, text]);\n});\n\n<ScrollingLoader\n  iconList={iconList}\n  textList={streamedTexts}\n  size=\"medium\"\n/>\n\\`\\`\\`\n\nSet \\`loopTexts={true}\\` if you want the texts to cycle continuously.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/ScrollingLoader/ScrollingLoader',\n    },\n  },\n};\n\nconst DEFAULT_ICONS = [\n  {name: 'envelope'},\n  {name: 'list-check'},\n  {name: 'filter'},\n  {name: 'calendar'},\n  {name: 'circle-question'},\n  {name: 'hand-wave'},\n];\n\nconst PUBLISHING_TEXT_LIST = [\n  'Generating Greetings prompt...',\n  'Generating FAQ prompt...',\n  'Setting things up for you…',\n  'Almost there…',\n];\n\nconst CREATING_TEXT_LIST = [\n  'Getting Greetings Ready...',\n  'Setting Up Data Collection...',\n  'Preparing Screening...',\n  'Preparing Scheduling...',\n  'Preparing FAQ...',\n  'Setting up Closing...',\n];\n\nexport const DefaultStory = (args: ScrollingLoaderProps) => (\n  <div className={css.storyContainer}>\n    <ScrollingLoader {...args} />\n  </div>\n);\n\nDefaultStory.args = {\n  iconList: DEFAULT_ICONS,\n  textList: PUBLISHING_TEXT_LIST,\n  size: SCROLLING_LOADER_SIZE.medium,\n  testId: 'scrolling-loader-default-story',\n};\n\nexport const FluidSizeStory = (args: ScrollingLoaderProps) => (\n  <div className={css.storyContainerFluid}>\n    <ScrollingLoader {...args} />\n  </div>\n);\n\nFluidSizeStory.args = {\n  iconList: DEFAULT_ICONS,\n  textList: PUBLISHING_TEXT_LIST,\n  size: SCROLLING_LOADER_SIZE.fluid,\n  testId: 'scrolling-loader-fluid-story',\n};\n\nexport const CreatingAgentStory = (args: ScrollingLoaderProps) => (\n  <div className={css.storyContainer}>\n    <ScrollingLoader {...args} />\n  </div>\n);\n\nCreatingAgentStory.args = {\n  iconList: DEFAULT_ICONS,\n  textList: CREATING_TEXT_LIST,\n  size: SCROLLING_LOADER_SIZE.medium,\n  textAnimationDuration: 2000,\n  testId: 'scrolling-loader-creating-story',\n};\n\nexport const CustomIconsStory = (args: ScrollingLoaderProps) => (\n  <div className={css.storyContainer}>\n    <ScrollingLoader {...args} />\n  </div>\n);\n\nCustomIconsStory.args = {\n  iconList: [\n    {name: 'robot', type: 'solid'},\n    {name: 'brain', type: 'solid'},\n    {name: 'microchip', type: 'solid'},\n    {name: 'network-wired', type: 'solid'},\n    {name: 'database', type: 'solid'},\n    {name: 'cloud', type: 'solid'},\n  ],\n  textList: [\n    'Initializing AI models...',\n    'Loading neural networks...',\n    'Connecting to services...',\n    'Preparing your experience...',\n  ],\n  size: SCROLLING_LOADER_SIZE.medium,\n  loopTexts: true,\n  testId: 'scrolling-loader-custom-icons-story',\n};\n\n// Streaming example - simulates receiving texts one by one from a stream\nconst STREAMING_TEXT_LIST = [\n  'Connecting to AI service...',\n  'Analyzing your request...',\n  'Generating response...',\n  'Processing data...',\n  'Optimizing results...',\n  'Finalizing output...',\n];\n\nconst StreamingLoaderWrapper = () => {\n  const [streamedTexts, setStreamedTexts] = React.useState<string[]>([\n    STREAMING_TEXT_LIST[0],\n  ]);\n\n  React.useEffect(() => {\n    if (streamedTexts.length >= STREAMING_TEXT_LIST.length) {\n      return;\n    }\n\n    const timeout = setTimeout(() => {\n      setStreamedTexts((prev) => [...prev, STREAMING_TEXT_LIST[prev.length]]);\n    }, 3000); // Add a new text every 3 seconds\n\n    return () => clearTimeout(timeout);\n  }, [streamedTexts.length]);\n\n  return (\n    <div className={css.storyContainer}>\n      <div>\n        Texts received: {streamedTexts.length} / {STREAMING_TEXT_LIST.length}\n      </div>\n      <ScrollingLoader\n        iconList={DEFAULT_ICONS}\n        textList={streamedTexts}\n        size={SCROLLING_LOADER_SIZE.medium}\n        textAnimationDuration={2000}\n        loopTexts={false}\n        testId=\"scrolling-loader-streaming-story\"\n      />\n    </div>\n  );\n};\n\nexport const StreamingStory = () => <StreamingLoaderWrapper />;\n\nStreamingStory.parameters = {\n  docs: {\n    description: {\n      story: `\n**Streaming Use Case**\n\nThis example demonstrates how the ScrollingLoader handles texts being added one by one,\nsimulating a streaming scenario where texts arrive from an API or WebSocket.\n\nWith \\`loopTexts={false}\\`, the animation:\n- Stops at the last text received\n- Resumes when new texts arrive\n- Stops again at the new last text\n\n**Usage with streaming:**\n\\`\\`\\`jsx\nconst [streamedTexts, setStreamedTexts] = useState<string[]>([]);\n\n// In your stream handler:\nonStreamMessage((text) => {\n  setStreamedTexts(prev => [...prev, text]);\n});\n\n<ScrollingLoader\n  iconList={iconList}\n  textList={streamedTexts}\n  size=\"medium\"\n  loopTexts={false}\n/>\n\\`\\`\\`\n      `,\n    },\n  },\n};\n\nDefaultStory.storyName = 'Default (Medium)';\nFluidSizeStory.storyName = 'Fluid Size';\nCreatingAgentStory.storyName = 'Creating Agent';\nCustomIconsStory.storyName = 'Custom Icons';\nStreamingStory.storyName = 'Streaming (Dynamic Texts)';\n"
        },
        "css": {
          "path": "ScrollingLoader.module.css",
          "content": "@value (\n  colorBackgroundTertiary,\n  colorBackgroundSecondary,\n  colorBorderTertiary,\n  colorTextPrimary,\n  colorFillNone\n) from '../../styles/variables/_color.css';\n\n@value (\n  spaceNone,\n  spaceXXSmall,\n  spaceXSmall,\n  spaceSmall,\n  spaceMedium,\n  spaceFluid,\n  spaceNegHalfFluid\n) from '../../styles/variables/_space.css';\n\n@value (\n  size8,\n  size12,\n  size16,\n  size20,\n  size24,\n  size34,\n  size42,\n  size90,\n  size100,\n  size150,\n  size200,\n  size240,\n  size260,\n  size276,\n  size284,\n  size300,\n  size320,\n  size426,\n  sizeFluid\n) from '../../styles/variables/_size.css';\n\n@value (\n  borderRadiusXSmall,\n  borderRadiusMedium,\n  borderWidthPrimary\n) from '../../styles/variables/_border.css';\n\n@value (\n  motionDurationNormal,\n  motionDurationSlow,\n  motionEaseInEaseOut\n) from '../../styles/variables/_motion.css';\n\n@value (\n  opacity0,\n  opacity100\n) from '../../styles/variables/_opacity.css';\n\n@value (\n  fontWeightMedium\n) from '../../styles/variables/_font.css';\n\n.wrapper {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  gap: spaceMedium;\n}\n\n.medium {\n  width: size284;\n}\n\n.large {\n  width: size426;\n}\n\n.fluid {\n  width: sizeFluid;\n}\n\n/* Skeleton Container */\n.skeletonContainer {\n  position: relative;\n  width: sizeFluid;\n  overflow: hidden;\n  border: borderWidthPrimary dashed colorBorderTertiary;\n  border-radius: borderRadiusMedium;\n  background-color: colorBackgroundTertiary;\n}\n\n/* Size-specific skeleton container heights */\n.medium .skeletonContainer {\n  height: size200;\n}\n\n.large .skeletonContainer,\n.fluid .skeletonContainer {\n  height: size300;\n}\n\n.skeletonScroller {\n  --animation-duration: 9s;\n  display: flex;\n  flex-direction: column;\n  gap: spaceMedium;\n  animation: scrollUp var(--animation-duration) linear infinite;\n}\n\n/* Size-specific skeleton scroller padding */\n.medium .skeletonScroller {\n  padding: spaceSmall;\n}\n\n.large .skeletonScroller,\n.fluid .skeletonScroller {\n  padding: spaceMedium;\n}\n\n.skeletonRow {\n  display: flex;\n  align-items: center;\n  gap: spaceXSmall;\n  flex-shrink: 0;\n}\n\n.skeletonRowSmall {\n  gap: spaceXSmall;\n}\n\n.skeletonRowLarge {\n  gap: spaceSmall;\n}\n\n.skeletonBars {\n  display: flex;\n  flex-direction: column;\n  gap: spaceXSmall;\n  flex: 1;\n}\n\n.skeletonBarTitle {\n  width: size90;\n  height: size12;\n  background-color: colorBackgroundSecondary;\n  border-radius: borderRadiusXSmall;\n}\n\n.skeletonBarSubtitle {\n  width: sizeFluid;\n  height: size8;\n  background-color: colorBackgroundSecondary;\n  border-radius: borderRadiusXSmall;\n}\n\n.skeletonRowLarge .skeletonBarTitle {\n  height: calc(size8 * 2);\n}\n\n.skeletonRowLarge .skeletonBarSubtitle {\n  height: size12;\n}\n\n/* Gradient Overlays */\n.gradientTop {\n  position: absolute;\n  top: calc(borderWidthPrimary * -1);\n  left: calc(borderWidthPrimary * -1);\n  right: calc(borderWidthPrimary * -1);\n  background: linear-gradient(\n    to bottom,\n    colorBackgroundTertiary opacity0,\n    colorFillNone opacity100\n  );\n  pointer-events: none;\n}\n\n.gradientBottom {\n  position: absolute;\n  bottom: calc(borderWidthPrimary * -1);\n  left: calc(borderWidthPrimary * -1);\n  right: calc(borderWidthPrimary * -1);\n  background: linear-gradient(\n    to top,\n    colorBackgroundTertiary opacity0,\n    colorFillNone opacity100\n  );\n  pointer-events: none;\n}\n\n/* Size-specific gradient overlay heights (50% of container height) */\n.medium .gradientTop,\n.medium .gradientBottom {\n  height: size100;\n}\n\n.large .gradientTop,\n.large .gradientBottom,\n.fluid .gradientTop,\n.fluid .gradientBottom {\n  height: size150;\n}\n\n/* Text Container */\n.textContainer {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  position: relative;\n  width: sizeFluid;\n  overflow: hidden;\n}\n\n/* Size-specific text container heights */\n.medium .textContainer {\n  height: calc(size20 + borderWidthPrimary);\n}\n\n.large .textContainer,\n.fluid .textContainer {\n  height: size24;\n}\n\n.textScroller {\n  position: absolute;\n  top: spaceNone;\n  left: spaceNone;\n  right: spaceNone;\n  bottom: spaceNone;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n}\n\n.textItem {\n  position: absolute;\n  white-space: nowrap;\n  color: colorTextPrimary;\n  font-weight: fontWeightMedium;\n  opacity: opacity0;\n  transform: translateY(spaceFluid);\n  /* No transition by default - allows instant reset without animation */\n}\n\n/* Size-specific text typography - applied conditionally via TSX */\n.textItemMedium {\n  composes: bodyMedium from '../../styles/typography.module.css';\n}\n\n.textItemLarge {\n  composes: bodyLarge from '../../styles/typography.module.css';\n}\n\n/* Active state - text sliding in and visible */\n.textItemActive {\n  opacity: opacity100;\n  transform: translateY(spaceNone);\n  transition: opacity motionDurationNormal motionEaseInEaseOut,\n    transform motionDurationNormal motionEaseInEaseOut;\n}\n\n/* Exiting state - text sliding out upward */\n.textItemExiting {\n  opacity: opacity0;\n  transform: translateY(spaceNegHalfFluid);\n  transition: opacity motionDurationNormal motionEaseInEaseOut,\n    transform motionDurationNormal motionEaseInEaseOut;\n}\n\n/* Static state for single item - no animation */\n.textItemStatic {\n  opacity: opacity100;\n  transform: translateY(spaceNone);\n}\n\n/* Scroll Animation */\n@keyframes scrollUp {\n  0% {\n    transform: translateY(spaceNone);\n  }\n  100% {\n    transform: translateY(spaceNegHalfFluid);\n  }\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/ScrollingLoader/ScrollingLoader';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "ScrollingLoader.module.css",
        "ScrollingLoader.stories.module.css",
        "ScrollingLoader.stories.tsx",
        "ScrollingLoader.tsx",
        "index.ts"
      ]
    },
    "SearchInput": {
      "name": "SearchInput",
      "path": "src/components/SearchInput",
      "files": {
        "main": {
          "path": "SearchInput.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { InputProps } from '../../components/Input';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    box?: string;\n    iconLeft?: string;\n}>;\nexport interface SearchInputProps extends Omit<InputProps, 'classNames' | 'onClear' | 'isLoading'> {\n    classNames?: ClassNames;\n    onClear?: () => void;\n    isLoading?: boolean;\n    testId?: string;\n    rightSlot?: React.ReactNode;\n}\nexport declare const SearchInput: Flow.AbstractComponent<SearchInputProps, HTMLInputElement>;\nexport {};\n//# sourceMappingURL=SearchInput.d.ts.map"
        },
        "story": {
          "path": "SearchInput.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {SearchInputProps} from 'src/components/SearchInput/SearchInput';\nimport {SearchInput} from 'src/components/SearchInput/SearchInput';\nimport {Toggle} from 'src/components/Toggle';\nimport {Tooltip} from 'src/components/Tooltip';\n\nimport css from 'src/components/SearchInput/SearchInput.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Search Input',\n  component: SearchInput,\n  argTypes: {\n    size: {\n      description:\n        'Search Input supports only two size variants namely small and medium. `small` < `medium`',\n      options: ['medium', 'small'],\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    iconLeftName: {\n      description:\n        'Left icon to be applied to the button, it internally uses the `Icon` component to render icons. By default search input has magnifying-glass icon',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'magnifying-glass'},\n      },\n    },\n    isLoading: {\n      description:\n        'if **true**, the component would add a loader. The loader occupies space outside the container.',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    value: {\n      description: 'Value of the search input',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    name: {\n      description: 'Name of the search input',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    disabled: {\n      description: 'if **true**, the component is disabled',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    placeholder: {\n      description: 'Placeholder of input. This appears inside the input box',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    required: {\n      description: 'if **true**, a red star would be added to the label',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    locked: {\n      description:\n        'if **true**, the component is locked, Locked state is the readonly state of the search input',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    error: {\n      description:\n        'if **true**, the component is moved to error state, Error state displays a red border surrounding input',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    errorText: {\n      description:\n        'Error text to be displayed on the bottom of the input. This uses `colorTextDanger`',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    label: {\n      description: 'Primary label of the input. This appears on top of input',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    helperText: {\n      description:\n        'Secondary label of the input. This appears on bottom of input, if the input is in `error` state the priority is given to `errorText`, in such cases secondary label wont be displayed',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    rightSlot: {\n      description: 'Right slot to be applied to the search input',\n      control: {\n        type: 'React.ReactNode',\n      },\n      table: {\n        type: {summary: 'React.ReactNode'},\n      },\n    },\n    classNames: {\n      description: 'External classnames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: '{wrapper?: string, box?: string}'},\n      },\n    },\n    onChange: {\n      description:\n        '**onChange** handler is triggered when there is a change in input value',\n      action: 'changed',\n      table: {\n        type: {\n          summary:\n            'onChange?: ( evt: SyntheticInputEvent<HTMLInputElement>, isEnter?: boolean, ) => mixed',\n        },\n      },\n    },\n    onFocus: {\n      description: '**onFocus** handler is triggered when input is focussed',\n      action: 'focussed',\n      table: {\n        type: {summary: '(e: SyntheticInputEvent<HTMLInputElement>) => mixed'},\n      },\n    },\n    onBlur: {\n      description: '**onBlur** handler is triggered when input is blurred',\n      action: 'blurred',\n      table: {\n        type: {summary: '(e: SyntheticInputEvent<HTMLInputElement>) => mixed'},\n      },\n    },\n    onKeyDown: {\n      description: '**onKeyDown** handler is triggered on keypress',\n      action: 'onKeyDowned',\n      table: {\n        type: {summary: '(e: SyntheticInputEvent<HTMLInputElement>) => mixed'},\n      },\n    },\n    onPaste: {\n      description:\n        '**onPaste** handler is triggered when text is pasted from the clipboard',\n      action: 'pasted',\n      table: {\n        type: {summary: '(e: ClipboardEvent) => mixed'},\n      },\n    },\n    onClear: {\n      description:\n        '**onClear** handler is triggered when clear button is clicked. Pass empty string in value after onClear.',\n      action: 'cleared',\n      table: {\n        type: {summary: '() => void'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a SearchInput component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { SearchInput } from \"@spaced-out/ui-design-system/lib/components/SearchInput\";\n\\`\\`\\`\nSearch input is nothing but a specialized **<a href=\"../?path=/docs/form-components-input--docs\">Input</a>**\ncomponent where a search icon is locked as left icon.\n\nSearch input also fixes a clear icon on the end which is used to clear the\nvalue if present. It is a controlled Input component. So, you need to pass the updated value received\nin event.target.value as value and empty string in case of onClear.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/SearchInput/SearchInput',\n    },\n  },\n};\n\nexport const SearchInputStory = (args: SearchInputProps) => {\n  const [value, setValue] = React.useState(args.value);\n\n  React.useEffect(() => {\n    setValue(args.value);\n  }, [args.value]);\n\n  const onChangeHandler = (e: React.ChangeEvent<HTMLInputElement>) => {\n    setValue(e.target.value);\n  };\n\n  const onClear = () => {\n    setValue('');\n    args.onClear?.();\n  };\n\n  return (\n    <div className={css.inputContainer}>\n      <SearchInput\n        {...args}\n        onChange={onChangeHandler}\n        classNames={{box: css.box}}\n        value={value}\n        onClear={onClear}\n      />\n    </div>\n  );\n};\n\nSearchInputStory.args = {\n  label: 'Search Label',\n  size: 'medium',\n  value: '',\n  testId: 'search-input-story',\n};\n\nexport const SearchInputWithRightSlotStory = (args: SearchInputProps) => {\n  const [checked, setChecked] = React.useState(false);\n  const [value, setValue] = React.useState(args.value);\n  const onChangeHandler = (e: React.ChangeEvent<HTMLInputElement>) => {\n    setValue(e.target.value);\n  };\n\n  const onClear = () => {\n    setValue('');\n    args.onClear?.();\n  };\n\n  return (\n    <div className={css.inputContainer}>\n      <SearchInput\n        {...args}\n        onChange={onChangeHandler}\n        classNames={{box: css.box}}\n        value={value}\n        onClear={onClear}\n        rightSlot={\n          <Tooltip title={checked ? 'Disable AI Search' : 'Enable AI Search'}>\n            <div className={css.toggleContainer}>\n              <Toggle\n                checked={checked}\n                onChange={() => {\n                  setChecked(!checked);\n                }}\n              />\n            </div>\n          </Tooltip>\n        }\n      />\n    </div>\n  );\n};\n\nSearchInputWithRightSlotStory.args = {\n  label: 'Search Label',\n  size: 'medium',\n  value: '',\n  testId: 'search-input-story',\n};\n\nSearchInputStory.storyName = 'Search Input';\nSearchInputWithRightSlotStory.storyName = 'Search Input With Right Slot';\n"
        },
        "css": {
          "path": "SearchInput.module.css",
          "content": "@value (\n  colorTextPrimary,\n  colorBackgroundTertiary\n) from '../../styles/variables/_color.css';\n\n@value (\n  size42,\n  size34\n) from '../../styles/variables/_size.css';\n\n.searchInputWrapper {\n  display: flex;\n  position: relative;\n  align-items: flex-end;\n  height: fit-content;\n}\n\n.clickable {\n  cursor: pointer;\n}\n\n.primaryText {\n  color: colorTextPrimary;\n}\n\n.loaderContainer {\n  display: flex;\n  height: size42;\n  width: size42;\n  align-items: center;\n  justify-content: center;\n  margin-left: calc(size42 * -1);\n}\n\n.loaderContainer.small {\n  height: size34;\n  width: size34;\n  margin-left: calc(size34 * -1);\n}\n\n.loader {\n  background-color: colorBackgroundTertiary;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export type { SearchInputProps } from '../../components/SearchInput/SearchInput';\nexport { SearchInput } from '../../components/SearchInput/SearchInput';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "SearchInput.module.css",
        "SearchInput.stories.module.css",
        "SearchInput.stories.tsx",
        "SearchInput.tsx",
        "index.ts"
      ]
    },
    "Separator": {
      "name": "Separator",
      "path": "src/components/Separator",
      "files": {
        "main": {
          "path": "Separator.d.ts",
          "content": "import type { Flow } from 'flow-to-typescript-codemod';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n}>;\nexport declare const ORIENTATION: Readonly<{\n    horizontal: \"horizontal\";\n    vertical: \"vertical\";\n}>;\nexport type OrientationType = (typeof ORIENTATION)[keyof typeof ORIENTATION];\nexport interface SeparatorProps {\n    classNames?: ClassNames;\n    orientation?: OrientationType;\n    width?: string;\n    height?: string;\n    testId?: string;\n}\nexport declare const Separator: Flow.AbstractComponent<SeparatorProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=Separator.d.ts.map"
        },
        "story": {
          "path": "Separator.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {size2, size60} from 'src/styles/variables/_size';\n\nimport type {SeparatorProps} from 'src/components/Separator';\nimport {ORIENTATION, Separator} from 'src/components/Separator/Separator';\n\nimport css from 'src/components/Separator/Separator.stories.module.css';\n\n\nconst orientation: Array<unknown> = [...Object.values(ORIENTATION)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'AI Prompt Components/Separator',\n  component: Separator,\n  argTypes: {\n    orientation: {\n      description:\n        'Choose between horizontal or vertical separators, ideal for structuring both column and row layouts.',\n      control: {\n        type: 'select',\n      },\n      options: orientation,\n      table: {\n        type: {summary: 'orientation'},\n        defaultValue: {summary: ORIENTATION.vertical},\n      },\n    },\n    width: {\n      description:\n        'Specifies the width of the separator. This is applied only if the orientation is vertical. Defaults to 2px for vertical separators.',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    height: {\n      description:\n        'Specifies the height of the separator. This is applied only if the orientation is horizontal. Defaults to 2px for horizontal separators.',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    classNames: {\n      description: 'Provide an optional className to be applied to the wrapper',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{wrapper?: string}',\n        },\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Separator component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Separator } from \"@spaced-out/ui-design-system/lib/components/Separator\";\n\\`\\`\\`\nThe Separator component is designed to provide a visually distinct break between different sections of content within your application. It can be used to separate text, lists, or cards, improving the layout and readability of the interface. Whether you need a simple horizontal or vertical line, the Separator can be easily customized with orientation, width, and height to match your design needs.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Separator/Separator',\n    },\n  },\n};\n\nexport const SeparatorStory = (args: SeparatorProps) => {\n  const dimensions = {\n    width: args.orientation === 'vertical' ? size2 : size60,\n    height: args.orientation === 'vertical' ? size60 : size2,\n  } as const;\n  return (\n    <div className={css.container}>\n      <Separator {...dimensions} {...args} />\n    </div>\n  );\n};\n\nSeparatorStory.args = {\n  classNames: {wrapper: ''},\n  orientation: 'vertical',\n  testId: 'separator-story',\n};\nSeparatorStory.storyName = 'Separator';\n"
        },
        "css": {
          "path": "Separator.module.css",
          "content": "@value (colorBorderSecondary) from '../../styles/variables/_color.css';\n@value (borderRadiusSmall) from '../../styles/variables/_border.css';\n\n.wrapper {\n  display: flex;\n  background-color: colorBorderSecondary;\n  width: var(--separator-width);\n  height: var(--separator-height);\n  border-radius: borderRadiusSmall;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Separator/Separator';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "Separator.module.css",
        "Separator.stories.module.css",
        "Separator.stories.tsx",
        "Separator.tsx",
        "index.ts"
      ]
    },
    "Shimmer": {
      "name": "Shimmer",
      "path": "src/components/Shimmer",
      "files": {
        "main": {
          "path": "Shimmer.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n}>;\nexport declare const SHIMMER_TYPES: Readonly<{\n    text: \"text\";\n    rounded: \"rounded\";\n    circular: \"circular\";\n    rectangular: \"rectangular\";\n}>;\nexport declare const SHIMMER_TYPE_TO_BORDER_RADIUS_MAP: Readonly<{\n    text: \"4px\";\n    rounded: \"12px\";\n    circular: \"50%\";\n    rectangular: \"0px\";\n}>;\nexport type ShimmerType = (typeof SHIMMER_TYPES)[keyof typeof SHIMMER_TYPES];\nexport interface ShimmerProps {\n    classNames?: ClassNames;\n    show?: boolean;\n    type?: ShimmerType;\n    width?: number | string;\n    height?: number | string;\n    borderRadius?: number | string;\n    children?: React.ReactNode;\n    testId?: string;\n}\nexport interface ShimmerWrapperProps {\n    children?: React.ReactNode;\n    testId?: string;\n}\n/**\n * Note(Nishant): ShimmerWrapper is a wrapper component for Shimmer component. This should only be used for Text based Shimmers\n * This solves a very annoying problem with out text components where the display prop is set to flex.\n * Genesis assumes that every element is flexible for simplicity and for text text shimmers to work in use cases\n * where text wraps across multiple lines, we need to wrap the shimmer in a span element.\n * to avoid the misuse where consumers use there own / other block level components, we have this wrapper.\n * This would ensure the layout remains same even when you toggle the shimmer to show your actual content\n * @param {React.Node} children - The children to be rendered\n */\nexport declare const ShimmerWrapper: ({ children, testId, }: ShimmerWrapperProps) => React.ReactElement<React.ComponentProps<\"span\">>;\nexport declare const Shimmer: Flow.AbstractComponent<ShimmerProps, HTMLSpanElement>;\ntype KPIShimmerClassNames = Readonly<{\n    wrapper?: string;\n    icon?: string;\n    text?: string;\n}>;\nexport interface KPIShimmerProps {\n    textWidth?: number | string;\n    hasTopContent?: boolean;\n    hasMiddleContent?: boolean;\n    hasBottomContent?: boolean;\n    hasIcon?: boolean;\n    classNames?: KPIShimmerClassNames;\n    testId?: string;\n}\nexport declare const KPIShimmer: ({ textWidth, hasBottomContent, hasIcon, hasTopContent, hasMiddleContent, classNames, testId, }: KPIShimmerProps) => React.JSX.Element;\nexport {};\n//# sourceMappingURL=Shimmer.d.ts.map"
        },
        "story": {
          "path": "Shimmer.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {ShimmerProps} from 'src/components/Shimmer/Shimmer';\nimport {\n  KPIShimmer,\n  Shimmer,\n  SHIMMER_TYPES,\n  ShimmerWrapper,\n} from 'src/components/Shimmer/Shimmer';\nimport {BodyLarge} from 'src/components/Text';\n\nimport css from 'src/components/Shimmer/Shimmer.stories.module.css';\n\n\nconst shimmerTypeOptions: Array<unknown> = [...Object.values(SHIMMER_TYPES)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Shimmer',\n  component: Shimmer,\n  argTypes: {\n    classNames: {\n      description: 'Provide an optional className to be applied to the wrapper',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{wrapper?: string}',\n        },\n      },\n    },\n    show: {\n      description:\n        'Determine whether to show the shimmer effect. Shimmer effect is visible by default',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {\n          summary: 'boolean',\n        },\n        defaultValue: {summary: 'true'},\n      },\n    },\n    width: {\n      description: 'Width of the shimmer effect',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {\n          summary: 'number | string',\n        },\n        defaultValue: {summary: 'size40'},\n      },\n    },\n    height: {\n      description: 'Height of the shimmer effect',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {\n          summary: 'number | string',\n        },\n        defaultValue: {summary: 'sizeFluid'},\n      },\n    },\n    type: {\n      description: 'Type of the shimmer effect',\n      control: {\n        type: 'select',\n      },\n      options: shimmerTypeOptions,\n      table: {\n        type: {\n          summary: 'enum',\n        },\n        defaultValue: {summary: 'text'},\n      },\n    },\n    children: {\n      description: `Children to be rendered inside the shimmer effect. This is rendered when shimmer's \\`show\\` is set to \\`false\\``,\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: 'React.Node',\n        },\n      },\n    },\n    borderRadius: {\n      description: 'Border radius of the shimmer effect',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {\n          summary: 'number | string',\n        },\n        defaultValue: {summary: 'borderRadiusXSmall'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Shimmer component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Shimmer } from \"@spaced-out/ui-design-system/lib/components/Shimmer\";\n\\`\\`\\`\nThe Shimmer component is a versatile and reusable React component designed to create a shimmering placeholder effect,\ntypically used to indicate loading content. This component is built with various configuration options, allowing it to adapt\nto different use cases such as text placeholders, rounded shapes, circular shapes, and rectangular shapes. The shimmering effect\nprovides a visual cue that content is being loaded or is in the process of being fetched, enhancing the user experience by\ngiving a sense of ongoing activity.\n\n**Important Note:**\n- While using **text** shimmer, make sure you wrap the text inside a\n\\`<ShimmerWrapper></ShimmerWrapper>\\` to ensure the shimmer effect is applied correctly and the layout doesn't break.\n\n\\`\\`\\`jsx\n<BodyLarge>\n  <ShimmerWrapper>\n    Hello{' '}\n    <Shimmer width={100}>\n      {name},{' '}\n    </Shimmer>\n    How are you?\n  </ShimmerWrapper>\n</BodyLarge>\n\\`\\`\\`\n\n**Usage: **\n\n\\`\\`\\`jsx\n<Shimmer\n  type=\"circular\"\n  width={100}\n  height={100}\n  classNames={{wrapper: css.profilePic}}\n></Shimmer>\n\n<Shimmer type=\"text\" width={200} height={25}></Shimmer>\n\n<Shimmer type=\"rounded\" width={60} height={60}></Shimmer>\n\\`\\`\\`\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Shimmer/Shimmer',\n    },\n  },\n};\n\nexport const TextFragmentShimmerStory = (args: ShimmerProps) => {\n  const variable1 = 'Async Await ';\n  const variable2 = 'Machine Learning';\n  const variable3 = 'Git Repository';\n\n  return (\n    <div className={css.container}>\n      <div className={css.action}>\n        <BodyLarge>\n          <ShimmerWrapper>\n            Understanding <Shimmer {...args}>{variable1}</Shimmer> is crucial\n            for asynchronous operations. Training{' '}\n            <Shimmer {...args}>{variable2}</Shimmer> is like trying to teach\n            your cat to bark—it's challenging, but sometimes it surprises you.\n            Pushing to the wrong <Shimmer {...args}>{variable3}</Shimmer> is\n            like yelling at your own mirror—it reflects poorly on your code\n            hygiene!\n          </ShimmerWrapper>\n        </BodyLarge>\n      </div>\n    </div>\n  );\n};\n\nTextFragmentShimmerStory.args = {\n  width: 89,\n  show: true,\n  testId: 'text-fragment-shimmer-story',\n};\n\nexport const MultilineTextShimmerStory = (args: ShimmerProps) => (\n  <div className={css.container}>\n    <div className={css.action}>\n      <Shimmer {...args}></Shimmer>\n    </div>\n    <div className={css.action}>\n      <Shimmer {...args}></Shimmer>\n    </div>\n    <div className={css.action}>\n      <Shimmer {...args}></Shimmer>\n    </div>\n    <div className={css.action}>\n      <Shimmer {...args}></Shimmer>\n    </div>\n    <div className={css.action}>\n      <Shimmer {...args}></Shimmer>\n    </div>\n  </div>\n);\n\nMultilineTextShimmerStory.args = {\n  show: true,\n  width: 500,\n  height: 20,\n  testId: 'multiline-text-shimmer-story',\n};\n\nexport const RoundedShimmerStory = (args: ShimmerProps) => (\n  <div className={css.container}>\n    <div className={css.action}>\n      <Shimmer {...args}></Shimmer>\n    </div>\n  </div>\n);\n\nRoundedShimmerStory.args = {\n  show: true,\n  width: 300,\n  height: 200,\n  type: 'rounded',\n  testId: 'rounded-shimmer-story',\n};\n\nexport const CircularShimmerStory = (args: ShimmerProps) => (\n  <div className={css.container}>\n    <div className={css.action}>\n      <Shimmer {...args}></Shimmer>\n    </div>\n  </div>\n);\n\nCircularShimmerStory.args = {\n  show: true,\n  width: 200,\n  height: 200,\n  type: 'circular',\n  testId: 'circular-shimmer-story',\n};\n\n/**\n * The KPIShimmer component is a React component used to display placeholder content with a shimmering effect,\n * typically utilized as a loading indicator for KPIs (Key Performance Indicators).\n * It provides flexibility to configure various parts like text and icons.\n *\n * Props:\n *\n * - `textWidth` (number | string) [optional]:\n *   - Specifies the width of the shimmering text placeholders.\n *   - The default value is `150`.\n *   - Examples: `textWidth={200}`\n *\n * - `hasTopContent` (boolean) [optional]:\n *   - Determines if the top text content should be displayed.\n *   - The default value is `true`.\n *   - Example: `hasTopContent={false}`\n *\n * - `hasMiddleContent` (boolean) [optional]:\n *   - Determines if the middle text content should be displayed.\n *   - The default value is `true`.\n *   - Example: `hasMiddleContent={false}`\n *\n * - `hasBottomContent` (boolean) [optional]:\n *   - Determines if the bottom text content should be displayed.\n *   - The default value is `true`.\n *   - Example: `hasBottomContent={false}`\n *\n * - `hasIcon` (boolean) [optional]:\n *   - Determines if an icon should be displayed at the top.\n *   - The default value is `true`.\n *   - Example: `hasIcon={false}`\n *\n * - `classNames` (object) [optional]:\n *   - Adds a className to the parent wrapper\n *\n * Usage:\n *\n * ```jsx\n * import { KPIShimmer } from 'your-component-library';\n *\n * const MyComponent = () => (\n *   <KPIShimmer\n *     textWidth={200}\n *     hasTopContent={true}\n *     hasMiddleContent={false}\n *     hasBottomContent={true}\n *     hasIcon={true}\n *   />\n * );\n * ```\n *\n * Example Scenarios:\n *\n * 1. Display only top and bottom content with custom text width:\n * ```jsx\n * <KPIShimmer textWidth={75} hasMiddleContent={false} />\n * ```\n *\n * 2. Display no icon and only middle content:\n * ```jsx\n * <KPIShimmer hasIcon={false} hasTopContent={false} hasBottomContent={false} />\n * ```\n */\nexport const KPIShimmerStory = () => (\n  <div className={css.container}>\n    <KPIShimmer textWidth={200} testId=\"kpi-shimmer-story\"></KPIShimmer>\n  </div>\n);\n\nexport const CardShimmerStory = () => (\n  <div className={css.container}>\n    <div className={css.box}>\n      <div className={css.section}>\n        <Shimmer\n          type=\"circular\"\n          width={100}\n          height={100}\n          classNames={{wrapper: css.profilePic}}\n          testId=\"card-shimmer-avatar\"\n        ></Shimmer>\n        <Shimmer\n          type=\"text\"\n          width={200}\n          height={25}\n          testId=\"card-shimmer-title\"\n        ></Shimmer>\n        <Shimmer\n          type=\"text\"\n          width={200}\n          height={15}\n          testId=\"card-shimmer-line-1\"\n        ></Shimmer>\n        <Shimmer\n          type=\"text\"\n          width={200}\n          height={15}\n          testId=\"card-shimmer-line-2\"\n        ></Shimmer>\n        <Shimmer\n          type=\"text\"\n          width={200}\n          height={15}\n          testId=\"card-shimmer-line-3\"\n        ></Shimmer>\n      </div>\n    </div>\n  </div>\n);\nTextFragmentShimmerStory.storyName = 'Text Fragment Shimmer';\nMultilineTextShimmerStory.storyName = 'Multiline Text Shimmer';\nRoundedShimmerStory.storyName = 'Rounded Shimmer';\nCircularShimmerStory.storyName = 'Circular Shimmer';\nKPIShimmerStory.storyName = 'KPIShimmer';\nCardShimmerStory.storyName = 'Card Shimmer';\n"
        },
        "css": {
          "path": "Shimmer.module.css",
          "content": "@value (colorFillPrimary, colorNeutralLightest, colorNeutralLight, colorBackgroundTertiary) from '../../styles/variables/_color.css';\n@value (spaceXSmall,spaceXXSmall, spaceNone, spaceLarge, spaceMedium, spaceSmall) from '../../styles/variables/_space.css';\n@value (sizeFluid, size40, size252) from '../../styles/variables/_size.css';\n@value (borderRadiusXSmall, borderRadiusMedium) from '../../styles/variables/_border.css';\n@value (opacity20, opacity40, opacity60) from '../../styles/variables/_opacity.css';\n@value (motionDurationSlowest) from '../../styles/variables/_motion.css';\n\n@value backgroundSizeInitial: calc(sizeFluid * 2);\n@value backgroundSizeFinal: calc(sizeFluid * -2);\n@value motionDuration: calc(motionDurationSlowest * 1.5);\n\n.wrapper {\n  --width: size40;\n  --border-radius: borderRadiusXSmall;\n  --height: sizeFluid;\n  height: var(--height);\n  width: var(--width);\n  border-radius: var(--border-radius);\n  background: linear-gradient(\n    to right,\n    colorNeutralLightest opacity20,\n    colorNeutralLight opacity40,\n    colorNeutralLightest opacity60\n  );\n  background-size: backgroundSizeInitial sizeFluid;\n  animation: shimmer motionDuration infinite linear;\n  vertical-align: middle;\n\n  &.text {\n    margin-right: spaceXXSmall;\n    width: initial;\n    padding-left: var(--width);\n  }\n}\n\n.kpiBox {\n  display: flex;\n  composes: borderPrimary from '../../styles/border.module.css';\n  min-width: size252;\n  width: fit-content;\n  height: fit-content;\n  align-items: center;\n  gap: spaceSmall;\n  background-color: colorBackgroundTertiary;\n  border-radius: borderRadiusMedium;\n  padding: spaceLarge spaceMedium;\n}\n\n.section {\n  display: flex;\n  width: sizeFluid;\n  flex-flow: column;\n  gap: spaceXSmall;\n  align-items: center;\n}\n\n.iconSection {\n  width: initial;\n}\n\n@keyframes shimmer {\n  from {\n    background-position: backgroundSizeInitial spaceNone;\n  }\n  to {\n    background-position: backgroundSizeFinal spaceNone;\n  }\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Shimmer/Shimmer';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "Shimmer.module.css",
        "Shimmer.stories.module.css",
        "Shimmer.stories.tsx",
        "Shimmer.tsx",
        "index.ts"
      ]
    },
    "SideMenuLink": {
      "name": "SideMenuLink",
      "path": "src/components/SideMenuLink",
      "files": {
        "main": {
          "path": "SideMenuLink.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { BaseLinkProps } from '../../components/Link';\nimport type { StatusSemanticType } from '../../components/StatusIndicator';\nimport type { BaseTooltipProps } from '../../components/Tooltip';\nexport declare const MENU_NAME_LIST: Readonly<{\n    dashboard: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    tasks: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    engage: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    journeys: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    automation: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    trm: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    analytics: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    'recruiter-hub': {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    messaging: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    messages: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    chatbot: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    referral: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    referrals: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    records: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    'database-cleanup': {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    support: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    audit: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    schedule: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    people: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    contacts: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    meetings: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    contacts3: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    senseai: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    'sense-jd-ai': {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    'ai-team': {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    tracking: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    jobs: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    drive: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    conversations: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    pages: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    sourcing: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    earnings: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    settings: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    configuration: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    supportLinks: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    voiceflow: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    broadcast: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    liveAgentTransfer: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    dataManagement: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n    notifications: {\n        title: string;\n        iconName: string;\n        iconType: string;\n    };\n}>;\ntype ClassNames = Readonly<{\n    wrapper?: string;\n}>;\nexport interface SideMenuLinkProps {\n    classNames?: ClassNames;\n    children?: React.ReactNode;\n    customTitle?: string;\n    pageNameKey: string;\n    disabled?: boolean;\n    hovered?: boolean;\n    selectedValue?: string;\n    opened?: boolean;\n    onChange?: (e: React.SyntheticEvent<HTMLElement>, newValue: string) => unknown;\n    tabIndex?: number;\n    tooltip?: BaseTooltipProps;\n    isGroupMenuLink?: boolean;\n    to?: string;\n    rightSlot?: React.ReactNode;\n    linkComponent?: Flow.AbstractComponent<BaseLinkProps, HTMLAnchorElement | null | undefined>;\n    status?: StatusSemanticType;\n    testId?: string;\n}\nexport declare const SideMenuLink: Flow.AbstractComponent<SideMenuLinkProps, HTMLButtonElement>;\nexport {};\n//# sourceMappingURL=SideMenuLink.d.ts.map"
        },
        "story": {
          "path": "SideMenuLink.stories.tsx",
          "content": "import * as React from 'react';\n\nimport classify from 'src/utils/classify';\n\nimport type {SideMenuLinkProps} from 'src/components/SideMenuLink/SideMenuLink';\nimport {\n  MENU_NAME_LIST,\n  SideMenuLink,\n} from 'src/components/SideMenuLink/SideMenuLink';\nimport {STATUS_SEMANTIC} from 'src/components/StatusIndicator';\n\nimport css from 'src/components/SideMenuLink/SideMenuLink.stories.module.css';\n\n\nconst pageNameOptions: Array<string> = [...Object.keys(MENU_NAME_LIST)];\nconst statusOptions: Array<unknown> = [...Object.values(STATUS_SEMANTIC)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Side Menu Link',\n  argTypes: {\n    pageNameKey: {\n      options: pageNameOptions,\n      type: {required: true},\n      description:\n        'pageNameKey for different page title. It will have predefined Icon for each page and Page title for different pageNameKey',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'dashboard'},\n      },\n    },\n    // controlled selectedValue prop\n    selectedValue: {\n      name: 'selectedValue',\n      description:\n        'selectedValue will be compared with value(pageNameKey) of the Side Menu Link to show as selected or unselected',\n      table: {\n        type: {summary: 'string'},\n      },\n      control: {\n        disable: true,\n      },\n    },\n    customTitle: {\n      name: 'customTitle',\n      control: {\n        type: 'text',\n      },\n      description:\n        'The would override the text fetched from the default page names config',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    opened: {\n      description: 'Opened state of Side Menu Link',\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n      },\n      defaultValue: {summary: false},\n    },\n    status: {\n      options: statusOptions,\n      description:\n        'Status type of a the indicator to indicate any notifications on the menu',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a SideMenuLink component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { SideMenuLink } from \"@spaced-out/ui-design-system/lib/components/SideMenuLink\";\n\\`\\`\\`\nSideMenuLink is anatomy component for Side Nav.\n\nIt is a controlled component, meaning that, you need to pass the selectedValue, if selectedValue is same as value then Menu Link will be shown as selected.\nYou will pass a callback function in onChange prop, if Menu Link is clicked this function will be called and you will receive\nthe selectedValue which will the pageNameKey prop of Menu Link.\n\n**Note: ** If any new product Icon is needed or missing, it should be added in MENU_NAME_LIST of SideMenuLink component\n          `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/SideMenuLink/SideMenuLink',\n    },\n  },\n};\n\nexport const SideMenuLinkStory = (args: SideMenuLinkProps) => {\n  const [selectedValue, setSelectedValue] = React.useState(args.selectedValue);\n  const onChangeHandler = (\n    e: React.SyntheticEvent<HTMLElement>,\n    newValue: string,\n  ): void => {\n    args.onChange?.(e, newValue);\n    setSelectedValue(newValue);\n  };\n\n  return (\n    <div\n      className={classify(css.storyContainer, {\n        [css.opened]: args.opened,\n        [css.closed]: !args.opened,\n      })}\n    >\n      <SideMenuLink\n        {...args}\n        onChange={onChangeHandler}\n        selectedValue={selectedValue}\n        to={'/?path=/docs/introduction--docs'}\n      />\n      <SideMenuLink\n        opened={args.opened}\n        pageNameKey=\"engage\"\n        onChange={onChangeHandler}\n        selectedValue={selectedValue}\n      />\n      <SideMenuLink\n        opened={args.opened}\n        pageNameKey=\"database-cleanup\"\n        onChange={onChangeHandler}\n        selectedValue={selectedValue}\n        to={'/?path=/docs/components-table-bulk-actions--docs'}\n      />\n      <SideMenuLink\n        opened={args.opened}\n        pageNameKey=\"voiceflow\"\n        onChange={onChangeHandler}\n        selectedValue={selectedValue}\n        to={'/voiceflow'}\n      />\n    </div>\n  );\n};\n\nSideMenuLinkStory.args = {\n  opened: false,\n  pageNameKey: 'dashboard',\n  selectedValue: 'dashboard',\n  testId: 'side-menu-link-story',\n};\nSideMenuLinkStory.storyName = 'Side Menu Link';\n"
        },
        "css": {
          "path": "SideMenuLink.module.css",
          "content": "@value ( colorFillPrimary,\n  colorFillInversePrimary,\n  colorNeutralDarkest,\n  colorTextInverseSecondary,\n  colorTextInversePrimary,\n  colorSideMenuIconDefault,\n  colorSideMenuIconActive,\n  colorSideMenuBackgroundDefault,\n  colorSideMenuBackgroundHovered,\n  colorSideMenuBackgroundSelected,\n  colorGroupMenuTextDefault,\n  colorFocusPrimary\n  ) from '../../styles/variables/_color.css';\n@value ( spaceNone, spaceXXSmall, spaceXSmall, spaceSmall ) from '../../styles/variables/_space.css';\n@value ( size28, size32, sizeFluid) from '../../styles/variables/_size.css';\n@value (\n  borderWidthPrimary,\n  borderWidthTertiary,\n  borderWidthNone,\n  borderRadiusSmall,\n  borderRadiusNone\n  ) from '../../styles/variables/_border.css';\n\n.linkWrapper {\n  display: flex;\n  background: colorSideMenuBackgroundDefault;\n  color: colorTextInverseSecondary;\n  flex-direction: row;\n  gap: spaceXSmall;\n  justify-content: flex-start;\n  align-items: center;\n  max-height: size32;\n  min-height: size32;\n  border-radius: borderRadiusSmall;\n  width: sizeFluid;\n  cursor: pointer;\n  user-select: none;\n  padding: spaceNone;\n}\n\n.linkWrapper:focus-visible {\n  outline: none;\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n\n.linkWrapper.closed {\n  width: size32;\n  min-width: size32;\n  justify-content: center;\n}\n\n.linkWrapper:not(.selected):not(.inActive):hover {\n  background: colorSideMenuBackgroundHovered;\n  color: colorTextInversePrimary;\n}\n\n.menuIcon {\n  height: size32;\n  width: size32;\n  min-height: size32;\n  min-width: size32;\n  color: colorSideMenuIconDefault;\n}\n\n.linkComponent {\n  width: sizeFluid;\n  text-decoration: none;\n}\n\n.linkComponent.closed {\n  width: size32;\n  min-width: size32;\n  justify-content: center;\n}\n\n.linkComponent:focus-visible {\n  border-radius: borderRadiusSmall;\n  outline: none;\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n\n.linkWrapper.selected {\n  background: colorSideMenuBackgroundSelected;\n  color: colorTextInversePrimary;\n}\n\n.linkWrapper.selected .menuIcon,\n.linkWrapper.selected .menuLinkText {\n  color: colorSideMenuIconActive;\n}\n\n.linkWrapper:hover .menuIcon {\n  color: colorSideMenuIconActive;\n}\n\n.groupMenuLinkText {\n  color: inherit;\n  margin-right: spaceSmall;\n  white-space: nowrap;\n  padding-right: spaceXXSmall;\n}\n\n.menuLinkText {\n  color: colorGroupMenuTextDefault;\n  margin-right: spaceSmall;\n  white-space: nowrap;\n  padding-right: spaceXXSmall;\n}\n\n.linkWrapper:hover .menuLinkText {\n  color: colorSideMenuIconActive;\n}\n\n.menuLabelContainer {\n  color: inherit;\n  display: flex;\n  flex: 1;\n  justify-content: space-between;\n  padding-right: spaceXSmall;\n}\n\n.iconContainer {\n  display: flex;\n  position: relative;\n}\n\n.statusIndicatorBlock {\n  position: absolute;\n  top: calc(spaceNone - (spaceXXSmall/2));\n  right: calc(spaceNone - (spaceXXSmall/2));\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/SideMenuLink/SideMenuLink';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "SideMenuLink.module.css",
        "SideMenuLink.stories.module.css",
        "SideMenuLink.stories.tsx",
        "SideMenuLink.tsx",
        "index.ts"
      ]
    },
    "StageArrows": {
      "name": "StageArrows",
      "path": "src/components/StageArrows",
      "files": {
        "main": {
          "path": "StageArrows.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n}>;\nexport interface StageArrowsProps {\n    disabled?: boolean;\n    children: React.ReactNode;\n    classNames?: ClassNames;\n    onStageArrowClick?: ((id: string, e?: React.SyntheticEvent<HTMLElement> | null | undefined) => unknown) | null | undefined;\n    testId?: string;\n}\nexport declare const StageArrows: Flow.AbstractComponent<StageArrowsProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=StageArrows.d.ts.map"
        },
        "story": {
          "path": "StageArrows.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {StageArrow} from 'src/components/StageArrows/StageArrow/StageArrow';\nimport type {StageArrowsProps} from 'src/components/StageArrows/StageArrows';\nimport {StageArrows} from 'src/components/StageArrows/StageArrows';\n\nimport css from 'src/components/StageArrows/StageArrows.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Stage Arrows/Stage Arrows',\n  component: StageArrows,\n  argTypes: {\n    classNames: {\n      description: 'Provide an optional className to be applied to the wrapper',\n      control: {type: 'object'},\n      table: {\n        type: {summary: '{ wrapper?: string }'},\n      },\n    },\n    disabled: {\n      description: 'If **true**, the component is disabled',\n      control: {type: 'boolean'},\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a StageArrows component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { StageArrows } from \"@spaced-out/ui-design-system/lib/components/StageArrows\";\n\\`\\`\\`\nThe StageArrows component is a horizontal navigation component that displays a series of connected stages in a workflow or process. Each stage is represented by a <a href=\"../?path=/docs/components-stage-arrows-stage-arrow--docs\">\\`<StageArrow/>\\`</a> component that can be customized with different types (primary, warning, danger, success, information), icons, and states (disabled, locked)\n\n**note:** -\n1. If only one stage is passed in the StageArrows component, it will be rendered as a In-Between stage arrow.\n2. If two stages are passed in the StageArrows component, the first stage will be rendered as a Start stage arrow and the last stage will be rendered as a End stage arrow.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/StageArrows/StageArrows.tsx',\n    },\n  },\n};\n\n\nexport const _TextOnly = (args: StageArrowsProps): React.ReactNode => (\n  <div className={css.container}>\n    <StageArrows {...args}>\n      <StageArrow id=\"1\" type=\"primary\">\n        Stage 1\n      </StageArrow>\n      <StageArrow id=\"3\" type=\"warning\">\n        Stage 2\n      </StageArrow>\n      <StageArrow id=\"4\" type=\"danger\">\n        Stage 3\n      </StageArrow>\n      <StageArrow id=\"6\" type=\"success\">\n        Stage 4\n      </StageArrow>\n      <StageArrow id=\"7\" type=\"information\">\n        Stage 5\n      </StageArrow>\n    </StageArrows>\n  </div>\n);\n\n_TextOnly.args = {\n  classNames: {wrapper: ''},\n};\n\nexport const _TextAndIcon = (args: StageArrowsProps): React.ReactNode => (\n  <div className={css.container}>\n    <StageArrows {...args}>\n      <StageArrow id=\"1\" type=\"primary\" iconRightName=\"sitemap\">\n        Stage 1\n      </StageArrow>\n      <StageArrow id=\"3\" type=\"warning\" iconRightName=\"sitemap\">\n        Stage 2\n      </StageArrow>\n      <StageArrow id=\"4\" type=\"danger\" iconRightName=\"sitemap\">\n        Stage 3\n      </StageArrow>\n      <StageArrow id=\"6\" type=\"success\" iconRightName=\"sitemap\">\n        Stage 4\n      </StageArrow>\n      <StageArrow id=\"7\" type=\"information\" iconRightName=\"sitemap\">\n        Stage 5\n      </StageArrow>\n    </StageArrows>\n  </div>\n);\n\n_TextAndIcon.args = {\n  classNames: {wrapper: ''},\n};\n\nexport const _Disabled = (args: StageArrowsProps): React.ReactNode => (\n  <div className={css.container}>\n    <StageArrows {...args}>\n      <StageArrow id=\"1\" type=\"primary\" iconLeftName=\"sitemap\">\n        Stage 1\n      </StageArrow>\n      <StageArrow id=\"3\" type=\"warning\" iconLeftName=\"sitemap\" disabled>\n        Stage 2\n      </StageArrow>\n      <StageArrow id=\"4\" type=\"danger\" iconLeftName=\"sitemap\">\n        Stage 3\n      </StageArrow>\n      <StageArrow id=\"6\" type=\"success\" iconLeftName=\"sitemap\">\n        Stage 4\n      </StageArrow>\n      <StageArrow id=\"7\" type=\"information\" iconLeftName=\"sitemap\" disabled>\n        Stage 5\n      </StageArrow>\n    </StageArrows>\n  </div>\n);\n\n_Disabled.args = {\n  classNames: {wrapper: ''},\n};\n"
        },
        "css": {
          "path": "StageArrows.module.css",
          "content": ".stageArrowsWrapper {\n  display: flex;\n  flex-direction: row;\n  align-items: flex-start;\n  overflow: auto;\n  -ms-overflow-style: none;\n  scrollbar-width: none;\n}\n\n.stageArrowsWrapper::-webkit-scrollbar {\n  display: none;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/StageArrows/StageArrow';\nexport * from '../../components/StageArrows/StageArrows';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "StageArrow/StageArrow.d.ts": {
            "path": "StageArrow/StageArrow.d.ts",
            "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { IconType } from '../../../components/Icon';\nimport type { BaseTooltipProps } from '../../../components/Tooltip/Tooltip';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    icon?: string;\n}>;\nexport declare const STAGE_ARROW_TYPE: Readonly<{\n    primary: \"primary\";\n    danger: \"danger\";\n    success: \"success\";\n    warning: \"warning\";\n    information: \"information\";\n}>;\nexport type StageArrowType = (typeof STAGE_ARROW_TYPE)[keyof typeof STAGE_ARROW_TYPE];\nexport interface StageArrowProps {\n    id: string;\n    type?: StageArrowType;\n    disabled?: boolean;\n    iconLeftName?: string;\n    iconLeftType?: IconType;\n    iconRightName?: string;\n    iconRightType?: IconType;\n    classNames?: ClassNames;\n    isEndStageArrow?: boolean;\n    isStartStageArrow?: boolean;\n    onStageArrowClick?: ((id: string, e?: React.SyntheticEvent<HTMLElement> | null | undefined) => unknown) | null | undefined;\n    children: React.ReactNode;\n    tooltip?: BaseTooltipProps;\n    testId?: string;\n    locked?: boolean;\n}\nexport declare const StageArrow: Flow.AbstractComponent<StageArrowProps, HTMLButtonElement>;\nexport {};\n//# sourceMappingURL=StageArrow.d.ts.map"
          },
          "StageArrow/index.d.ts": {
            "path": "StageArrow/index.d.ts",
            "content": "export * from '../../../components/StageArrows/StageArrow/StageArrow';\n//# sourceMappingURL=index.d.ts.map"
          }
        }
      },
      "allFiles": [
        "StageArrow/StageArrow.module.css",
        "StageArrow/StageArrow.stories.module.css",
        "StageArrow/StageArrow.stories.tsx",
        "StageArrow/StageArrow.tsx",
        "StageArrow/index.ts",
        "StageArrows.module.css",
        "StageArrows.stories.module.css",
        "StageArrows.stories.tsx",
        "StageArrows.tsx",
        "index.ts"
      ]
    },
    "StatusIndicator": {
      "name": "StatusIndicator",
      "path": "src/components/StatusIndicator",
      "files": {
        "main": {
          "path": "StatusIndicator.d.ts",
          "content": "import type { Flow } from 'flow-to-typescript-codemod';\nimport * as COLORS from '../../styles/variables/_color';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n}>;\nexport declare const STATUS_SEMANTIC: Readonly<{\n    primary: \"primary\";\n    information: \"information\";\n    success: \"success\";\n    warning: \"warning\";\n    danger: \"danger\";\n    neutral: \"neutral\";\n    secondary: \"secondary\";\n}>;\nexport type StatusSemanticType = (typeof STATUS_SEMANTIC)[keyof typeof STATUS_SEMANTIC];\nexport interface StatusIndicatorProps {\n    classNames?: ClassNames;\n    status?: StatusSemanticType;\n    withBorder?: boolean;\n    borderColorToken?: keyof typeof COLORS;\n    disabled?: boolean;\n    testId?: string;\n}\nexport declare const StatusIndicator: Flow.AbstractComponent<StatusIndicatorProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=StatusIndicator.d.ts.map"
        },
        "story": {
          "path": "StatusIndicator.stories.tsx",
          "content": "import * as React from 'react';\n\nimport * as COLORS from 'src/styles/variables/_color';\nimport classify from 'src/utils/classify';\n\nimport type {StatusIndicatorProps} from 'src/components/StatusIndicator';\nimport {STATUS_SEMANTIC, StatusIndicator} from 'src/components/StatusIndicator';\nimport {BodySmall} from 'src/components/Text';\n\nimport css from 'src/components/StatusIndicator/StatusIndicator.stories.module.css';\n\n\nconst statusOptions: Array<unknown> = [...Object.values(STATUS_SEMANTIC)];\nconst colorOptions: Array<unknown> = [...Object.keys(COLORS)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Status Indicator',\n  component: StatusIndicator,\n  argTypes: {\n    status: {\n      options: statusOptions,\n      description:\n        'Status type of a the indicator. It will have different background color for different status',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: STATUS_SEMANTIC.information},\n      },\n    },\n    disabled: {\n      description: 'If **true**, the component is disabled',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    borderColorToken: {\n      description:\n        'Pass different color token string to show border in different color',\n      options: colorOptions,\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'colorBackgroundTertiary'},\n      },\n    },\n    classNames: {\n      description: 'Provide an optional className to be applied to the wrapper',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{wrapper?: string}',\n        },\n      },\n    },\n    withBorder: {\n      description: 'If **true**, the component would have a white border',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a StatusIndicator component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { StatusIndicator } from \"@spaced-out/ui-design-system/lib/components/StatusIndicator\";\n\\`\\`\\`\nThis component indicates status using a small dot with background in the DOM. Use this in conjunction with other components.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/StatusIndicator/StatusIndicator',\n    },\n  },\n};\n\nexport const StatusIndicatorStory = (args: StatusIndicatorProps) => (\n  <div\n    className={classify(css.contentWrapper, {\n      [css.withBackdrop]: args.withBorder,\n    })}\n  >\n    <div className={css.statusWrap}>\n      <StatusIndicator\n        {...args}\n        status=\"information\"\n        testId=\"status-information\"\n      />\n      <BodySmall\n        color={args.withBorder ? 'inversePrimary' : 'tertiary'}\n        testId=\"status-information-text\"\n      >\n        Information\n      </BodySmall>\n    </div>\n    <div className={css.statusWrap}>\n      <StatusIndicator {...args} status=\"success\" testId=\"status-success\" />\n      <BodySmall\n        color={args.withBorder ? 'inversePrimary' : 'tertiary'}\n        testId=\"status-success-text\"\n      >\n        Success\n      </BodySmall>\n    </div>\n    <div className={css.statusWrap}>\n      <StatusIndicator {...args} status=\"warning\" testId=\"status-warning\" />\n      <BodySmall\n        color={args.withBorder ? 'inversePrimary' : 'tertiary'}\n        testId=\"status-warning-text\"\n      >\n        Warning\n      </BodySmall>\n    </div>\n    <div className={css.statusWrap}>\n      <StatusIndicator {...args} status=\"danger\" testId=\"status-danger\" />\n      <BodySmall\n        color={args.withBorder ? 'inversePrimary' : 'tertiary'}\n        testId=\"status-danger-text\"\n      >\n        Danger\n      </BodySmall>\n    </div>\n    <div className={css.statusWrap}>\n      <StatusIndicator {...args} status=\"neutral\" testId=\"status-neutral\" />\n      <BodySmall\n        color={args.withBorder ? 'inversePrimary' : 'tertiary'}\n        testId=\"status-neutral-text\"\n      >\n        Neutral\n      </BodySmall>\n    </div>\n  </div>\n);\nStatusIndicatorStory.args = {\n  testId: 'status-indicator-story',\n};\nStatusIndicatorStory.storyName = 'Status Indicator';\n"
        },
        "css": {
          "path": "StatusIndicator.module.css",
          "content": "@value (\n  colorInformation,\n  colorSuccess,\n  colorWarning,\n  colorDanger,\n  colorNeutral,\n  colorBackgroundTertiary,\n  colorFillPrimary,\n  colorTextPrimary,\n  colorTextDisabled\n) from '../../styles/variables/_color.css';\n@value (size8) from '../../styles/variables/_size.css';\n@value (borderRadiusCircle, borderWidthTertiary) from '../../styles/variables/_border.css';\n\n.statusWrapper {\n  --border-color: colorBackgroundTertiary;\n  display: flex;\n  color: colorFillPrimary;\n  width: size8;\n  min-width: size8;\n  height: size8;\n  min-height: size8;\n  border-radius: borderRadiusCircle;\n  background-color: colorTextPrimary;\n  box-sizing: content-box;\n}\n\n.information {\n  background-color: colorInformation;\n}\n\n.success {\n  background-color: colorSuccess;\n}\n\n.warning {\n  background-color: colorWarning;\n}\n\n.danger {\n  background-color: colorDanger;\n}\n\n.neutral {\n  background-color: colorNeutral;\n}\n\n.disabled {\n  background-color: colorTextDisabled;\n}\n\n.withBorder {\n  border: borderWidthTertiary solid var(--border-color);\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/StatusIndicator/StatusIndicator';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "StatusIndicator.module.css",
        "StatusIndicator.stories.module.css",
        "StatusIndicator.stories.tsx",
        "StatusIndicator.tsx",
        "index.ts"
      ]
    },
    "Stepper": {
      "name": "Stepper",
      "path": "src/components/Stepper",
      "files": {
        "main": {
          "path": "Stepper.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n}>;\nexport interface StepperProps {\n    classNames?: ClassNames;\n    activeStep?: number;\n    children: React.ReactNode;\n    orientation?: 'horizontal' | 'vertical';\n    disabled?: boolean;\n    testId?: string;\n}\nexport declare const Stepper: Flow.AbstractComponent<StepperProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=Stepper.d.ts.map"
        },
        "story": {
          "path": "Stepper.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {Button} from 'src/components/Button';\nimport {BasicDialog} from 'src/components/Dialog';\nimport type {StepperProps} from 'src/components/Stepper';\nimport {Step} from 'src/components/Stepper/Step/Step';\nimport {StepContent} from 'src/components/Stepper/Step/StepContent';\nimport {StepLabel} from 'src/components/Stepper/Step/StepLabel';\nimport {Stepper} from 'src/components/Stepper/Stepper';\n\nimport css from 'src/components/Stepper/Stepper.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Stepper/Stepper',\n  component: Stepper,\n  argTypes: {\n    classNames: {\n      description: 'Provide an optional className to be applied to the wrapper',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{wrapper?: string}',\n        },\n      },\n    },\n    activeStep: {\n      control: {type: 'number'},\n      description: 'Set the active step (zero-based index). Defaults to 0.',\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: '0'},\n      },\n    },\n    orientation: {\n      control: {type: 'select'},\n      options: ['horizontal', 'vertical'],\n      description:\n        'The component orientation (layout flow direction). Defaults to \"horizontal\".',\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'horizontal'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Stepper component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport type {StepperProps} from '@spaced-out/ui-design-system/lib/components/Stepper';\nimport {Stepper, Step, StepLabel, StepContent} from '@spaced-out/ui-design-system/lib/components/Stepper';\n\\`\\`\\`\n\nThe Stepper component provides a wizard-like workflow for progressing through a series of steps.\nIt is commonly used to guide users through a multi-step process, such as a form or a tutorial.\n\n### Usage\n\nThe Stepper component takes in the following props:\n\n\\`\\`\\`jsx\n<Stepper\n  activeStep={1}\n  orientation=\"horizontal\"\n  classNames={{}}\n>\n  {/* Step components go here */}\n</Stepper>\n\\`\\`\\`\n\nThe Stepper component should be used with one or more Step components as children.\nEach Step component represents an individual step in the Stepper. The Step component is responsible for\nrendering the step label and content. Make sure to import the Step component as well.\n\n### Step Component\n\nThe Step component represents a single step within the Stepper. It should be used as a child component of the Stepper. Each Step component can have its own unique label and content.\n\n\\`\\`\\`jsx\nimport { Step } from \"@spaced-out/ui-design-system/lib/components/Stepper\";\n\n<Stepper activeStep={1} orientation=\"horizontal / vertical\">\n  <Step index={0} completed={false} classNames={{wrapper: css.stepWrapper}}>\n    {/* Step label and content go here */}\n  </Step>\n  {/* Add more Step components for additional steps */}\n</Stepper>\n\\`\\`\\`\n\nPlease note that the Step component should be imported separately in order to use it within the Stepper component.\n\nRemember to customize the props, labels, and content according to your specific use case.\n\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Stepper/Stepper',\n    },\n  },\n};\n\nconst steps = [\n  {\n    id: '1',\n    label: 'Step 1',\n    description: 'A quick brown fox jumps over the lazy dog',\n  },\n  {\n    id: '2',\n    label: 'Step 2',\n    description:\n      'A quick brown fox jumps over the lazy dog. A quick brown fox jumps over the lazy dog',\n  },\n  {\n    id: '3',\n    label: 'Step 3',\n    description:\n      'A quick brown fox jumps over the lazy dog. A quick brown fox jumps over the lazy dog. A quick brown fox jumps over the lazy dog',\n  },\n];\n\n/**\n * Renders a Stepper component with Completed check\n *\n * Below conditions are required for the step to be clickable:\n *\n * 1. The step should have an `onClick` handler\n * 2. The current step should not be `active`\n * 3. The previous step should be `completed`\n *\n */\nexport const StepperStory = (args: StepperProps) => {\n  const [openDialog, setOpenDialog] = React.useState(false);\n  const [activeStep, setActiveStep] = React.useState(args.activeStep || 0);\n  const [completedSteps, setCompletedSteps] = React.useState<\n    Record<string, boolean>\n  >({\n    '0': false,\n    '1': false,\n    '2': false,\n  });\n\n  const handleNext = () => {\n    if (completedSteps[activeStep] === false) {\n      setOpenDialog(true);\n      return;\n    }\n    setActiveStep((prevStep) => prevStep + 1);\n  };\n\n  const handleBack = () => {\n    setActiveStep((prevStep) => prevStep - 1);\n  };\n\n  const handleClick = (idx: number) => {\n    setActiveStep(idx);\n  };\n\n  const handleMarkComplete = () => {\n    const newCompletedSteps = {...completedSteps};\n    for (let i = 0; i <= activeStep; i++) {\n      newCompletedSteps[i] = true;\n    }\n    setCompletedSteps(newCompletedSteps);\n  };\n\n  const handleMarkInComplete = () => {\n    const newCompletedSteps = {...completedSteps};\n    for (let i = activeStep; i <= 2; i++) {\n      newCompletedSteps[i] = false;\n    }\n    setCompletedSteps(newCompletedSteps);\n  };\n\n  React.useEffect(() => {\n    setActiveStep(args.activeStep || 0);\n  }, [args.activeStep]);\n\n  return (\n    <div className={css.container}>\n      <Stepper {...args} activeStep={activeStep}>\n        {steps.map((stepDetails, index) => (\n          <Step\n            key={stepDetails.id}\n            index={index}\n            onClick={handleClick}\n            completed={completedSteps[index]}\n            testId={`stepper-step-${index}`}\n          >\n            <StepLabel testId={`stepper-step-label-${index}`}>\n              {stepDetails.label}\n            </StepLabel>\n            <StepContent testId={`stepper-step-content-${index}`}>\n              {stepDetails.description}\n            </StepContent>\n          </Step>\n        ))}\n      </Stepper>\n      <div className={css.spacedActions}>\n        <div className={css.actionBlock}>\n          <Button\n            size=\"small\"\n            type=\"secondary\"\n            onClick={handleBack}\n            disabled={!(activeStep > 0)}\n            iconLeftName=\"arrow-left\"\n            testId=\"stepper-back-button\"\n          >\n            Back\n          </Button>\n          <Button\n            size=\"small\"\n            type=\"secondary\"\n            onClick={handleNext}\n            disabled={!(activeStep < steps.length - 1)}\n            iconRightName=\"arrow-right\"\n            testId=\"stepper-next-button\"\n          >\n            Next\n          </Button>\n        </div>\n        <div className={css.actionBlock}>\n          <Button\n            size=\"small\"\n            type=\"primary\"\n            onClick={handleMarkComplete}\n            iconLeftName=\"circle-check\"\n            disabled={completedSteps[activeStep]}\n            testId=\"stepper-mark-complete-button\"\n          >\n            Mark Complete\n          </Button>\n          <Button\n            size=\"small\"\n            type=\"danger\"\n            onClick={handleMarkInComplete}\n            iconLeftName=\"circle-xmark\"\n            disabled={!completedSteps[activeStep]}\n            testId=\"stepper-mark-incomplete-button\"\n          >\n            Mark Incomplete\n          </Button>\n        </div>\n      </div>\n\n      <BasicDialog\n        isOpen={openDialog}\n        abortText=\"Close\"\n        body=\"Please mark the current step complete to move on to the next one!\"\n        handleAbort={() => setOpenDialog(false)}\n        heading=\"Unable to proceed to next step\"\n        semantic=\"danger\"\n        // testId=\"stepper-dialog\"\n      />\n    </div>\n  );\n};\n\nStepperStory.args = {\n  activeStep: 0,\n  testId: 'stepper-story',\n};\n\n/**\n * Renders a Stepper component with Completed check\n *\n * Below conditions are required for the step to be clickable:\n *\n * 1. The step should have an `onClick` handler\n * 2. The current step should not be `active`\n * 3. The previous step should be `completed`\n *\n */\n/**\nexport const _WithStepIcon = (args: StepperProps): React.Node => {\n  const [openDialog, setOpenDialog] = React.useState(false);\n  const [activeStep, setActiveStep] = React.useState(args.activeStep || 0);\n  const [completedSteps, setCompletedSteps] = React.useState({\n    '0': false,\n    '1': false,\n    '2': false,\n  });\n\n  const handleNext = () => {\n    if (completedSteps[activeStep] === false) {\n      setOpenDialog(true);\n      return;\n    }\n    setActiveStep((prevStep) => prevStep + 1);\n  };\n\n  const handleBack = () => {\n    setActiveStep((prevStep) => prevStep - 1);\n  };\n\n  const handleClick = (idx) => {\n    setActiveStep(idx);\n  };\n\n  const handleMarkComplete = () => {\n    const newCompletedSteps = {...completedSteps};\n    for (let i = 0; i <= activeStep; i++) {\n      newCompletedSteps[i] = true;\n    }\n    setCompletedSteps(newCompletedSteps);\n  };\n\n  const handleMarkInComplete = () => {\n    const newCompletedSteps = {...completedSteps};\n    for (let i = activeStep; i <= 2; i++) {\n      newCompletedSteps[i] = false;\n    }\n    setCompletedSteps(newCompletedSteps);\n  };\n\n  React.useEffect(() => {\n    setActiveStep(args.activeStep || 0);\n  }, [args.activeStep]);\n\n  return (\n    <div className={css.container}>\n      <Stepper {...args} activeStep={activeStep}>\n        {stepsWithIcon.map((stepDetails, index) => (\n          <Step\n            key={stepDetails.id}\n            index={index}\n            iconName={stepDetails.iconName}\n            iconType={stepDetails.iconType}\n            onClick={handleClick}\n            completed={completedSteps[index]}\n          >\n            <StepLabel>{stepDetails.label}</StepLabel>\n            <StepContent>{stepDetails.description}</StepContent>\n          </Step>\n        ))}\n      </Stepper>\n      <div className={css.spacedActions}>\n        <div className={css.actionBlock}>\n          <Button\n            size=\"small\"\n            type=\"secondary\"\n            onClick={handleBack}\n            disabled={!(activeStep > 0)}\n            iconLeftName=\"arrow-left\"\n          >\n            Back\n          </Button>\n          <Button\n            size=\"small\"\n            type=\"secondary\"\n            onClick={handleNext}\n            disabled={!(activeStep < steps.length - 1)}\n            iconRightName=\"arrow-right\"\n          >\n            Next\n          </Button>\n        </div>\n        <div className={css.actionBlock}>\n          <Button\n            size=\"small\"\n            type=\"primary\"\n            onClick={handleMarkComplete}\n            iconLeftName=\"circle-check\"\n            disabled={completedSteps[activeStep]}\n          >\n            Mark Complete\n          </Button>\n          <Button\n            size=\"small\"\n            type=\"danger\"\n            onClick={handleMarkInComplete}\n            iconLeftName=\"circle-xmark\"\n            disabled={!completedSteps[activeStep]}\n          >\n            Mark Incomplete\n          </Button>\n        </div>\n      </div>\n\n      <BasicDialog\n        isOpen={openDialog}\n        abortText=\"Close\"\n        body=\"Please mark the current step complete to move on to the next one!\"\n        handleAbort={() => setOpenDialog(false)}\n        heading=\"Unable to proceed to next step\"\n        semantic=\"danger\"\n      />\n    </div>\n  );\n};\n\n_WithStepIcon.args = {\n  activeStep: 0,\n};\n*/\nStepperStory.storyName = 'Stepper';\n"
        },
        "css": {
          "path": "Stepper.module.css",
          "content": "@value (\n  colorFillPrimary,\n  colorFillSecondary,\n  colorButtonFillPrimaryEnabled,\n  colorFillDisabled,\n  colorTextSecondary,\n  colorTextPrimary,\n  colorTextClickable,\n  colorTextDisabled,\n  colorTextInversePrimary,\n  colorBorderSecondary\n) from '../../styles/variables/_color.css';\n@value (\n  size12,\n  size24,\n  sizeFluid\n) from '../../styles/variables/_size.css';\n@value (\n  spaceNone,\n  spaceLarge,\n  spaceMedium,\n  spaceSmall,\n  spaceXXSmall\n) from '../../styles/variables/_space.css';\n@value (\n  borderWidthPrimary,\n  borderRadiusCircle\n) from '../../styles/variables/_border.css';\n\n.stepperWrapper {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  gap: spaceXXSmall;\n}\n\n.stepperWrapper.vertical {\n  flex-direction: column;\n  gap: spaceNone;\n  justify-content: initial;\n}\n\n.stepWrapper {\n  position: relative;\n  display: flex;\n  align-items: flex-start;\n  gap: spaceSmall;\n  width: sizeFluid;\n}\n\n.stepWrapperCounter {\n  display: flex;\n  composes: motionEaseInEaseOut from '../../styles/animation.module.css';\n  composes: subTitleExtraSmall from '../../styles/typography.module.css';\n  height: size24;\n  width: size24;\n  min-height: size24;\n  min-width: size24;\n  justify-content: center;\n  align-items: center;\n  border-radius: borderRadiusCircle;\n  background-color: transparent;\n  border: borderWidthPrimary solid colorBorderSecondary;\n  color: colorTextSecondary;\n}\n\n.stepWrapperCounter.completed {\n  background-color: colorFillPrimary;\n  border: borderWidthPrimary solid transparent;\n  color: colorTextInversePrimary;\n}\n\n.stepWrapperCounter.selected {\n  background-color: colorFillSecondary;\n  border: borderWidthPrimary solid transparent;\n  color: colorTextClickable;\n}\n\n.stepWrapperCounter.completed.selected:not(.disabled) {\n  background-color: colorButtonFillPrimaryEnabled;\n  border: borderWidthPrimary solid transparent;\n  color: colorTextInversePrimary;\n}\n\n.stepWrapperCounter.disabled {\n  background-color: colorFillDisabled;\n  border: borderWidthPrimary solid transparent;\n  color: colorTextDisabled;\n}\n\n.stepIcon {\n  color: inherit;\n}\n\n.stepContent {\n  display: flex;\n  flex-flow: column;\n  gap: spaceXXSmall;\n  margin-top: spaceXXSmall;\n}\n\n.stepLabelWrapper {\n  composes: subTitleSmall from '../../styles/typography.module.css';\n  color: colorTextSecondary;\n}\n\n.stepLabelWrapper.active {\n  color: colorTextPrimary;\n}\n\n.stepLabelWrapper.disabled {\n  color: colorTextDisabled;\n}\n\n.stepContentWrapper {\n  composes: bodySmall from '../../styles/typography.module.css';\n  color: colorTextSecondary;\n}\n\n.stepContentWrapper.disabled {\n  color: colorTextDisabled;\n}\n\n.clickable {\n  cursor: pointer;\n}\n\n.stepCounterColumn {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  gap: spaceXXSmall;\n}\n\n.connector {\n  pointer-events: none;\n}\n\n.stepperWrapper.vertical .stepCounterColumn {\n  align-self: stretch;\n}\n\n.stepperWrapper.vertical .connector {\n  flex: 1;\n  width: calc(size2 / 2);\n}\n\n.stepperWrapper.vertical .stepWrapper:not(:last-child) .stepContent {\n  padding-bottom: spaceMedium;\n}\n\n.stepperWrapper:not(.vertical) .connector {\n  flex: 1;\n  align-self: flex-start;\n  margin-top: size12;\n  min-width: spaceLarge;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Stepper/Step';\nexport * from '../../components/Stepper/Stepper';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "Step/Step.d.ts": {
            "path": "Step/Step.d.ts",
            "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { IconType } from '../../../components/Icon';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    stepCounter?: string;\n    content?: string;\n}>;\nexport interface StepProps {\n    active?: boolean;\n    children: React.ReactNode;\n    completed?: boolean;\n    disabled?: boolean;\n    expanded?: boolean;\n    index: number;\n    last?: boolean;\n    classNames?: ClassNames;\n    allowClick?: boolean;\n    onClick?: (idx: number, e?: React.SyntheticEvent<HTMLElement> | null | undefined) => unknown;\n    iconName?: string;\n    iconType?: IconType;\n    orientation?: 'horizontal' | 'vertical';\n    testId?: string;\n}\nexport declare const Step: Flow.AbstractComponent<StepProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=Step.d.ts.map"
          },
          "Step/StepContent.d.ts": {
            "path": "Step/StepContent.d.ts",
            "content": "import * as React from 'react';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n}>;\nexport interface StepContentProps {\n    children: React.ReactNode;\n    active?: boolean;\n    completed?: boolean;\n    disabled?: boolean;\n    classNames?: ClassNames;\n    testId?: string;\n}\nexport declare const StepContent: ({ children, classNames, active, completed, disabled, testId, }: StepContentProps) => React.JSX.Element;\nexport {};\n//# sourceMappingURL=StepContent.d.ts.map"
          },
          "Step/StepLabel.d.ts": {
            "path": "Step/StepLabel.d.ts",
            "content": "import * as React from 'react';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n}>;\nexport interface StepLabelProps {\n    children: React.ReactNode;\n    active?: boolean;\n    completed?: boolean;\n    disabled?: boolean;\n    classNames?: ClassNames;\n    testId?: string;\n}\nexport declare const StepLabel: ({ children, classNames, active, completed, disabled, testId, }: StepLabelProps) => React.JSX.Element;\nexport {};\n//# sourceMappingURL=StepLabel.d.ts.map"
          },
          "Step/index.d.ts": {
            "path": "Step/index.d.ts",
            "content": "export * from '../../../components/Stepper/Step/Step';\nexport * from '../../../components/Stepper/Step/StepContent';\nexport * from '../../../components/Stepper/Step/StepLabel';\n//# sourceMappingURL=index.d.ts.map"
          }
        }
      },
      "allFiles": [
        "Step/Step.stories.tsx",
        "Step/Step.tsx",
        "Step/StepContent.tsx",
        "Step/StepLabel.tsx",
        "Step/index.ts",
        "Stepper.module.css",
        "Stepper.stories.module.css",
        "Stepper.stories.tsx",
        "Stepper.tsx",
        "index.ts"
      ]
    },
    "StickyBar": {
      "name": "StickyBar",
      "path": "src/components/StickyBar",
      "files": {
        "main": {
          "path": "StickyBar.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nexport interface StickyBarProps {\n    className?: string;\n    children: React.ReactNode;\n    position?: 'top' | 'bottom';\n    testId?: string;\n}\nexport interface StickyBarChildProps {\n    className?: string;\n    children: React.ReactNode;\n    testId?: string;\n}\nexport declare const StickyBarLeftSlot: ({ className, children, testId, ...props }: StickyBarChildProps) => React.JSX.Element;\nexport declare const StickyBarRightSlot: ({ className, children, testId, ...props }: StickyBarChildProps) => React.JSX.Element;\nexport declare const StickyBar: Flow.AbstractComponent<StickyBarProps, HTMLDivElement>;\n//# sourceMappingURL=StickyBar.d.ts.map"
        },
        "story": {
          "path": "StickyBar.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {Button} from 'src/components/Button';\nimport {Col, Row} from 'src/components/Grid';\nimport type {StickyBarProps} from 'src/components/StickyBar';\nimport {\n  StickyBar,\n  StickyBarLeftSlot,\n  StickyBarRightSlot,\n} from 'src/components/StickyBar/StickyBar';\nimport {BodySmall} from 'src/components/Text';\n\nimport css from 'src/components/StickyBar/StickyBar.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Sticky Footer',\n  component: StickyBar,\n  argTypes: {\n    classNames: {\n      description: 'Provide an optional className to be applied to the wrapper',\n      control: {\n        type: 'string',\n      },\n      table: {\n        type: {\n          summary: 'string',\n        },\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    // position: {\n    //   description: 'Position of the StickyBar',\n    //   options: ['top', 'bottom'],\n    //   control: {\n    //     type: 'select',\n    //   },\n    //   table: {\n    //     type: {\n    //       summary: 'string',\n    //     },\n    //     defaultValue: {\n    //       summary: 'bottom',\n    //     },\n    //   },\n    // },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a StickyFooter component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport {\n  StickyBar,\n  StickyBarLeftSlot,\n  StickyBarRightSlot\n} from \"@spaced-out/ui-design-system/lib/components/StickyBar\";\n\\`\\`\\`\n\nThe \\`StickyBar\\` component is a flexible and customizable sticky bar that can be used\nto display content in a fixed position at bottom of the screen(You would need to set/manage the \\`position\\` attribute). It consists\nof two slots, one on the left and one on the right, where you can place children elements,\nsuch as buttons or icons.\n\nSlots:\n\n- \\`StickyBarLeftSlot\\`: Use this slot to place content on the left side of the \\`StickyBar\\`.\n- \\`StickyBarRightSlot\\`: Use this slot to place content on the right side of the \\`StickyBar\\`.\n\nExample Usage:\n\n\\`\\`\\`jsx\nconst MyComponent = () => (\n  <StickyBar>\n    <StickyBarLeftSlot>\n      <Button type=\"tertiary\">Button Text</Button>\n      <Button type=\"ghost\">Button Text</Button>\n    </StickyBarLeftSlot>\n    <StickyBarRightSlot>\n      <Button type=\"ghost\">Button Text</Button>\n      <Button type=\"primary\">Button Text</Button>\n    </StickyBarRightSlot>\n  </StickyBar>\n);\n\\`\\`\\`\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/StickyBar/StickyBar',\n    },\n  },\n};\n\nexport const StickyFooterStory = (args: StickyBarProps) => (\n  <div className={css.container}>\n    <StickyBar {...args}>\n      <StickyBarLeftSlot>\n        <Button type=\"tertiary\">Button Text</Button>\n        <Button type=\"ghost\">Button Text</Button>\n      </StickyBarLeftSlot>\n      <StickyBarRightSlot>\n        <Button type=\"ghost\">Button Text</Button>\n        <Button type=\"primary\">Button Text</Button>\n      </StickyBarRightSlot>\n    </StickyBar>\n  </div>\n);\nStickyFooterStory.args = {\n  testId: 'sticky-footer-story',\n};\n\nexport const WithGridStory = (args: StickyBarProps) => (\n  <>\n    <div className={css.container}>\n      <BodySmall color=\"information\">\n        Column Offset: 1, Column Span: 11\n      </BodySmall>\n      <StickyBar {...args}>\n        <Row className={css.noPadding}>\n          <Col offset={1} span={11}>\n            <StickyBarLeftSlot>\n              <Button type=\"ghost\">Cancel</Button>\n              <Button>Save Changes</Button>\n            </StickyBarLeftSlot>\n          </Col>\n        </Row>\n      </StickyBar>\n    </div>\n    <div className={css.container}>\n      <BodySmall color=\"information\">\n        Column Offset: 6, Column Span: 6\n      </BodySmall>\n      <StickyBar {...args}>\n        <Row className={css.noPadding}>\n          <Col offset={6} span={6}>\n            <StickyBarLeftSlot>\n              <Button type=\"ghost\">Cancel</Button>\n              <Button>Save Changes</Button>\n            </StickyBarLeftSlot>\n          </Col>\n        </Row>\n      </StickyBar>\n    </div>\n    <div className={css.container}>\n      <BodySmall color=\"information\">\n        Column Offset: 9, Column Span: 3\n      </BodySmall>\n      <StickyBar {...args}>\n        <Row className={css.noPadding}>\n          <Col offset={9} span={3} className={css.stickRight}>\n            <StickyBarRightSlot>\n              <Button type=\"ghost\">Cancel</Button>\n              <Button>Save Changes</Button>\n            </StickyBarRightSlot>\n          </Col>\n        </Row>\n      </StickyBar>\n    </div>\n  </>\n);\nStickyFooterStory.storyName = 'Sticky Footer';\nWithGridStory.storyName = 'With Grid';\n"
        },
        "css": {
          "path": "StickyBar.module.css",
          "content": "@value (colorFillPrimary, colorBackgroundTertiary) from '../../styles/variables/_color.css';\n@value (sizeFluid) from '../../styles/variables/_size.css';\n@value (spaceMedium, spaceXSmall, spaceSmall) from '../../styles/variables/_space.css';\n\n.wrapper {\n  display: flex;\n  width: sizeFluid;\n  align-items: center;\n  justify-content: space-between;\n  padding: spaceMedium spaceMedium;\n  gap: spaceXSmall;\n  background: colorBackgroundTertiary;\n}\n\n.top {\n  composes: borderBottomPrimary from '../../styles/border.module.css';\n}\n\n.bottom {\n  composes: borderTopPrimary from '../../styles/border.module.css';\n}\n\n.leftSlot,\n.rightSlot {\n  display: flex;\n  align-items: center;\n  gap: spaceSmall;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/StickyBar/StickyBar';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "StickyBar.module.css",
        "StickyBar.stories.module.css",
        "StickyBar.stories.tsx",
        "StickyBar.tsx",
        "index.ts"
      ]
    },
    "SubMenu": {
      "name": "SubMenu",
      "path": "src/components/SubMenu",
      "files": {
        "main": {
          "path": "SubMenu.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { IconSize, IconType } from '../../components/Icon';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n}>;\nexport interface SubMenuProps {\n    classNames?: ClassNames;\n    title: string;\n    titleIcon?: string;\n    titleIconSize?: IconSize;\n    titleIconType?: IconType;\n    children?: React.ReactNode;\n    onClose?: () => unknown;\n    showClose?: boolean;\n    testId?: string;\n}\nexport declare const SubMenu: Flow.AbstractComponent<SubMenuProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=SubMenu.d.ts.map"
        },
        "story": {
          "path": "SubMenu.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {TEXT_COLORS} from 'src/types/typography';\nimport {classify} from 'src/utils/classify';\n\nimport {Badge} from 'src/components/Badge';\nimport {ClickableIcon, Icon} from 'src/components/Icon';\nimport type {SubMenuProps} from 'src/components/SubMenu';\nimport {SubMenu} from 'src/components/SubMenu/SubMenu';\nimport {SubMenuGroup} from 'src/components/SubMenu/SubMenuGroup';\nimport {\n  SubMenuItem,\n  SubMenuItemAction,\n  SubMenuItemBadges,\n  SubMenuItemText,\n} from 'src/components/SubMenu/SubMenuItem';\nimport {SubMenuLink} from 'src/components/SubMenu/SubMenuLink';\n\nimport css from 'src/components/SubMenu/SubMenu.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Sub Menu',\n  component: SubMenu,\n  argTypes: {\n    title: {\n      type: {required: true},\n      description: 'The title of the SubMenu',\n      table: {\n        type: {summary: 'React.Component | string'},\n      },\n    },\n    titleIcon: {\n      description: 'Optional Icon before the title of the SubMenu',\n      control: {\n        type: 'string',\n      },\n      table: {\n        type: {summary: 'React.Component | string'},\n      },\n    },\n    titleIconType: {\n      description: 'Provide a type for the Icon',\n      control: {type: 'select'},\n      options: ['regular', 'solid', 'duotone', 'brands'],\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    titleIconSize: {\n      control: {type: 'select'},\n      options: ['small', 'medium'],\n      description: 'Optional size for the Icon',\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    classNames: {\n      description:\n        'Provide an optional classNames to be applied to the wrapper of submenu. And for SubMenuGroup apply classNames to wrapper, groupHeader & menuGroup',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary:\n            'SubMenu: {wrapper?: string} SubMenuGroup: { wrapper?: string, groupHeader?: string, menuGroup?: string} ',\n        },\n      },\n    },\n    onClose: {\n      description:\n        '**onClose** handler that is applied to the Header close button',\n      action: 'closed',\n      table: {\n        type: {summary: '() => mixed'},\n      },\n    },\n    showClose: {\n      description:\n        'If **true**, the component would show the Header close button',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle:\n        'Generates a SubMenu, SubMenuGroup, SubMenuItem, SubMenuLink, SubMenuItemIcon, SubMenuItemText and SubMenuItemAction components.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport {SubMenu} from '@spaced-out/ui-design-system/lib/components/SubMenu';\nimport {SubMenuGroup} from '@spaced-out/ui-design-system/lib/components/SubMenu/SubMenuGroup';\nimport {\n  SubMenuItem,\n  SubMenuItemAction,\n  SubMenuItemBadges,\n  SubMenuItemIcon,\n  SubMenuItemText,\n} from '@spaced-out/ui-design-system/lib/components/SubMenu/SubMenuItem';\nimport {SubMenuLink} from '@spaced-out/ui-design-system/lib/components/SubMenu/SubMenuLink';\n\\`\\`\\`\n\nSubMenu offers different components for different slots. SubMenu renders all of its children passed to it.\nChildren of SubMenu can be SubMenuGroup, SubMenuLink or any other React component for cases like implementing search features in sub menu.\n\nSubMenuGroup accepts few props named groupTitle, collapsible and multiple SubMenuItem as children.\nIt is a controlled component, which means, you need to pass the selectedMenuKey, if selectedMenuKey is same as menuKey then Sub\nMenu Item will be shown as selected. And if its a part of a group then that SubMenuGroup remains expanded. When an item from another group\nis selected then all other groups are collapsed.\nYou will pass a callback function in onChange prop, if Sub Menu Item is clicked this function will be called and you will receive\nthe selectedMenuKey which will be the menuKey prop of Sub Menu Item.\n\nSubMenuItem accepts four named child components:- SubMenuItemIcon, SubMenuItemText, SubMenuItemBadges, and SubMenuItemAction.\nSubMenuItemIcon, SubMenuItemText and SubMenuItemBadges are aligned at start and SubMenuItemAction is aligned at end.\nSubMenuItemAction button is shown on mouse hover, focus and selection of the SubMenuItem.\n\nThe SubMenuLink takes the following props: menuLinkTitle, menuLinkIcon, onChange, selectedMenuKey.\nIf selectedMenuKey is same as menuKey then SubMenuLink will be shown as selected.\n      `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/SubMenu/SubMenu',\n    },\n  },\n};\n\nexport const SubMenuStory = (args: SubMenuProps) => {\n  const [selectedMenu, setSelectedMenu] = React.useState('menu-0');\n  const onMenuItemChangeHandler = (menu: string): void => {\n    setSelectedMenu(menu);\n  };\n\n  return (\n    <div className={css.container}>\n      <SubMenu\n        title={args.title}\n        showClose={args.showClose}\n        titleIcon={args.titleIcon}\n        titleIconType={args.titleIconType}\n        onClose={args.onClose}\n        testId={args.testId}\n      >\n        <SubMenuGroup\n          groupTitle=\"Inbox\"\n          groupIcon=\"fa-duotone fa-messages\"\n          groupIconSize=\"small\"\n          groupIconType=\"duotone\"\n          collapsible={true}\n          onChange={onMenuItemChangeHandler}\n          selectedMenuKey={selectedMenu}\n          status=\"information\"\n        >\n          <SubMenuItem\n            menuKey={'menu-0'}\n            classNames={{\n              wrapper: classify(css.menuItem, {\n                [css.selected]: selectedMenu === 'menu-0',\n              }),\n            }}\n          >\n            <SubMenuItemText>San Francisco</SubMenuItemText>\n            <SubMenuItemBadges className={css.subMenuItemBadges}>\n              <Icon\n                name=\"star\"\n                size=\"small\"\n                type=\"solid\"\n                className={css.iconStar}\n              />\n            </SubMenuItemBadges>\n            <SubMenuItemAction>\n              <ClickableIcon\n                name=\"ellipsis\"\n                size=\"small\"\n                color={TEXT_COLORS.inverseSecondary}\n                type=\"solid\"\n                ariaLabel=\"More Actions\"\n                className={css.actionsMenuBtn}\n              />\n              <div className={css.actionItemsContainer}>\n                <Icon\n                  name=\"whatsapp\"\n                  type=\"brands\"\n                  color={TEXT_COLORS.inverseSecondary}\n                  size=\"small\"\n                />\n                <Icon\n                  name=\"comment-sms\"\n                  color={TEXT_COLORS.inverseSecondary}\n                  size=\"small\"\n                />\n              </div>\n            </SubMenuItemAction>\n          </SubMenuItem>\n          <SubMenuItem\n            menuKey={'menu-1'}\n            classNames={{\n              wrapper: classify(css.menuItem, {\n                [css.selected]: selectedMenu === 'menu-1',\n              }),\n            }}\n          >\n            <SubMenuItemText>Boston</SubMenuItemText>\n            <SubMenuItemAction>\n              <ClickableIcon\n                name=\"ellipsis\"\n                size=\"small\"\n                color={TEXT_COLORS.inverseSecondary}\n                type=\"solid\"\n                ariaLabel=\"More Actions\"\n                className={css.actionsMenuBtn}\n              />\n              <div className={css.actionItemsContainer}>\n                <Icon\n                  name=\"whatsapp\"\n                  type=\"brands\"\n                  color={TEXT_COLORS.inverseSecondary}\n                  size=\"small\"\n                />\n                <Icon\n                  name=\"comment-sms\"\n                  color={TEXT_COLORS.inverseSecondary}\n                  size=\"small\"\n                />\n              </div>\n            </SubMenuItemAction>\n          </SubMenuItem>\n          <SubMenuItem\n            menuKey={'menu-2'}\n            classNames={{\n              wrapper: classify(css.menuItem, {\n                [css.selected]: selectedMenu === 'menu-2',\n              }),\n            }}\n          >\n            <SubMenuItemText>Miami</SubMenuItemText>\n            <SubMenuItemBadges className={css.subMenuItemBadges}>\n              <Badge\n                text=\"3\"\n                fill=\"blueDark\"\n                classNames={{text: css.badgeTextColor}}\n              />\n            </SubMenuItemBadges>\n            <SubMenuItemAction>\n              <ClickableIcon\n                name=\"ellipsis\"\n                size=\"small\"\n                color={TEXT_COLORS.inverseSecondary}\n                type=\"solid\"\n                ariaLabel=\"More Actions\"\n                className={css.actionsMenuBtn}\n              />\n              <div className={css.actionItemsContainer}>\n                <Icon\n                  name=\"whatsapp\"\n                  type=\"brands\"\n                  color={TEXT_COLORS.inverseSecondary}\n                  size=\"small\"\n                />\n                <Icon\n                  name=\"comment-sms\"\n                  color={TEXT_COLORS.inverseSecondary}\n                  size=\"small\"\n                />\n              </div>\n            </SubMenuItemAction>\n          </SubMenuItem>\n          <SubMenuItem\n            menuKey={'menu-3'}\n            classNames={{\n              wrapper: classify(css.menuItem, {\n                [css.selected]: selectedMenu === 'menu-3',\n              }),\n            }}\n          >\n            <SubMenuItemText>New York</SubMenuItemText>\n            <SubMenuItemBadges className={css.subMenuItemBadges}>\n              <Badge\n                text=\"12\"\n                fill=\"blueDark\"\n                classNames={{text: css.badgeTextColor}}\n              />\n            </SubMenuItemBadges>\n            <SubMenuItemAction>\n              <ClickableIcon\n                name=\"ellipsis\"\n                size=\"small\"\n                color={TEXT_COLORS.inverseSecondary}\n                type=\"solid\"\n                ariaLabel=\"More Actions\"\n                className={css.actionsMenuBtn}\n              />\n              <div className={css.actionItemsContainer}>\n                <Icon\n                  name=\"whatsapp\"\n                  type=\"brands\"\n                  color={TEXT_COLORS.inverseSecondary}\n                  size=\"small\"\n                />\n                <Icon\n                  name=\"comment-sms\"\n                  color={TEXT_COLORS.inverseSecondary}\n                  size=\"small\"\n                />\n              </div>\n            </SubMenuItemAction>\n          </SubMenuItem>\n          <SubMenuItem\n            menuKey={'menu-4'}\n            disabled\n            classNames={{\n              wrapper: classify(css.menuItem, {\n                [css.selected]: selectedMenu === 'menu-4',\n              }),\n            }}\n          >\n            <SubMenuItemText>Disabled</SubMenuItemText>\n            <SubMenuItemAction tabIndex={-1}>\n              <ClickableIcon\n                name=\"ellipsis\"\n                size=\"small\"\n                color={TEXT_COLORS.inverseSecondary}\n                type=\"solid\"\n                ariaLabel=\"More Actions\"\n                className={css.actionsMenuBtn}\n              />\n              <div className={css.actionItemsContainer}>\n                <Icon\n                  name=\"whatsapp\"\n                  type=\"brands\"\n                  color={TEXT_COLORS.inverseSecondary}\n                  size=\"small\"\n                />\n                <Icon\n                  name=\"comment-sms\"\n                  color={TEXT_COLORS.inverseSecondary}\n                  size=\"small\"\n                />\n              </div>\n            </SubMenuItemAction>\n          </SubMenuItem>\n        </SubMenuGroup>\n        <SubMenuGroup\n          groupTitle=\"Live Agent Transfer\"\n          groupIcon=\"headset\"\n          groupIconSize=\"small\"\n          groupIconType=\"duotone\"\n          collapsible={true}\n          onChange={onMenuItemChangeHandler}\n          selectedMenuKey={selectedMenu}\n        >\n          <SubMenuItem menuKey={'menu-5'}>\n            <SubMenuItemText>Queue #1</SubMenuItemText>\n          </SubMenuItem>\n          <SubMenuItem menuKey={'menu-6'}>\n            <SubMenuItemText>Queue #2</SubMenuItemText>\n          </SubMenuItem>\n        </SubMenuGroup>\n        <div className={css.menuDivider} />\n        <SubMenuGroup\n          groupTitle=\"AI Generation\"\n          groupIcon=\"sparkles\"\n          groupIconSize=\"small\"\n          groupIconType=\"duotone\"\n          collapsible={true}\n          onChange={onMenuItemChangeHandler}\n          selectedMenuKey={selectedMenu}\n        >\n          <SubMenuItem menuKey={'menu-7'}>\n            <SubMenuItemText>Queue #1</SubMenuItemText>\n          </SubMenuItem>\n          <SubMenuItem menuKey={'menu-8'}>\n            <SubMenuItemText>Queue #2</SubMenuItemText>\n          </SubMenuItem>\n        </SubMenuGroup>\n        <SubMenuLink\n          menuLinkTitle=\"Jobs\"\n          menuLinkIcon=\"screen-users\"\n          menuLinkIconSize=\"small\"\n          menuLinkIconType=\"duotone\"\n          menuKey=\"menu-link-0\"\n          selectedMenuKey={selectedMenu}\n          onChange={onMenuItemChangeHandler}\n        />\n        <SubMenuLink\n          menuLinkTitle=\"Referrals\"\n          menuLinkIcon=\"user-check\"\n          menuLinkIconSize=\"small\"\n          menuLinkIconType=\"duotone\"\n          menuKey=\"menu-link-1\"\n          selectedMenuKey={selectedMenu}\n          onChange={onMenuItemChangeHandler}\n        />\n      </SubMenu>\n    </div>\n  );\n};\n\nSubMenuStory.args = {\n  title: 'Messaging',\n  titleIcon: 'messages',\n  titleIconType: 'duotone',\n  showClose: true,\n  testId: 'sub-menu-story',\n};\nSubMenuStory.storyName = 'Sub Menu';\n"
        },
        "css": {
          "path": "SubMenu.module.css",
          "content": "@value ( size34, size60, size300, sizeFluid, sizeFullViewportHeight) from '../../styles/variables/_size.css';\n\n@value (\n  colorFillNone,\n  colorFillPrimary,\n  colorFocusPrimary,\n  colorNeutralDark,\n  colorNeutralDarkest,\n  colorTextInverseSecondary,\n  colorTextInversePrimary,\n  colorSubMenuBackgroundDefault,\n  colorSideMenuIconDefault,\n  colorSideMenuIconActive,\n  colorSuccess,\n  colorFocusDanger\n  ) from '../../styles/variables/_color.css';\n\n@value (\n  spaceNone,\n  spaceXXSmall,\n  spaceXSmall,\n  spaceSmall,\n  spaceMedium,\n  spaceLarge \n  ) from '../../styles/variables/_space.css';\n\n@value (\n  borderWidthPrimary,\n  borderWidthTertiary,\n  borderWidthNone,\n  borderRadiusSmall,\n  borderRadiusNone\n  ) from '../../styles/variables/_border.css';\n\n.subMenuWrapper {\n  background: colorSubMenuBackgroundDefault;\n  width: sizeFluid;\n  min-height: sizeFullViewportHeight;\n  cursor: default;\n  display: flex;\n  flex-direction: column;\n  user-select: none;\n}\n\n.subMenuTitleAndButton {\n  height: size60;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  border-bottom: borderWidthPrimary solid colorNeutralDarkest;\n  margin: spaceNone spaceNone spaceXXSmall spaceXXSmall;\n}\n\n.subMenuTitleWrapper {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  padding: spaceSmall;\n}\n\n.subMenuCloseButton {\n  margin: spaceSmall;\n}\n\n.subMenuCloseButton:hover {\n  background-color: colorNeutralDarkest;\n}\n\n.subMenuCloseIcon {\n  color: colorSideMenuIconActive;\n}\n\n.subMenuHeader {\n  height: size60;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  padding: spaceMedium spaceXSmall;\n}\n\n.menuChildWrap {\n  margin: spaceNone spaceSmall;\n}\n\n.menuChildWrap:last-child {\n  border-bottom: none;\n}\n\n.subMenuGroupWrapper,\n.subMenuLinkWrapper {\n  display: flex;\n  flex-direction: column;\n  margin: spaceXXSmall spaceNone;\n  flex: auto;\n}\n\n.subMenuGroupWrapper {\n  background: colorNeutralDarkest;\n  border-radius: borderRadiusSmall;\n}\n\n.subMenuGroupHeader,\n.subMenuLink {\n  color: colorSideMenuIconDefault;\n  background: colorSubMenuBackgroundDefault;\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  cursor: pointer;\n  padding: spaceXSmall;\n  border-radius: borderRadiusSmall;\n}\n\n.subMenuGroupHeader:hover,\n.subMenuLink:hover {\n  background: colorNeutralDarkest;\n  .groupTitle,\n  .menuLinkTitle {\n    color: colorTextInversePrimary;\n  }\n}\n\n.subMenuGroupHeader:focus-visible,\n.subMenuGroup:focus-visible,\n.subMenuLink:focus-visible {\n  outline: none;\n}\n\n.subMenuGroupHeader.collapsible:focus,\n.subMenuLink:focus {\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n\n.subMenuGroupHeader:not(.collapsible) {\n  background: colorNeutralDarkest;\n}\n\n.subMenuGroupHeader.collapsed,\n.subMenuLink.collapsed {\n  background: colorNeutralDarkest;\n}\n\n.subMenuGroupHeader.highlightedMenu {\n  border: borderWidthPrimary solid colorNeutralDark;\n  margin: calc(-1 * (borderWidthPrimary));\n  .groupTitle {\n    color: colorTextInversePrimary;\n  }\n}\n\n.subMenuLink.highlightedMenu {\n  background: colorNeutralDarkest;\n  .menuLinkTitle {\n    color: colorTextInversePrimary;\n  }\n}\n\n.groupTitleWrapper {\n  display: flex;\n  gap: spaceXXSmall;\n}\n\n.groupIconWrapper {\n  display: flex;\n  position: relative;\n  padding-right: spaceXSmall;\n}\n\n.statusIndicatorWrapper {\n  position: absolute;\n  top: calc(-1 * (spaceXXSmall));\n  right: spaceNone;\n}\n\n.groupTitle,\n.menuLinkTitle {\n  color: colorTextInverseSecondary;\n}\n\n.menuLinkIcon {\n  margin-right: spaceXSmall;\n}\n\n.subMenuGroup,\n.subMenuFocusWrapper {\n  outline: none;\n  display: flex;\n  flex-direction: column;\n}\n\n.subMenuGroup {\n  margin: spaceXSmall spaceXXSmall;\n  gap: spaceXXSmall;\n  background: colorNeutralDarkest;\n  border-radius: borderRadiusSmall;\n}\n\n.subMenuGroup.collapsed {\n  display: none !important;\n}\n\n.menuItem {\n  display: flex;\n  flex-direction: row;\n  color: colorTextInverseSecondary;\n  flex-direction: row;\n  justify-content: space-between;\n  gap: spaceXSmall;\n  align-items: center;\n  flex: auto;\n  height: size34;\n  min-height: size34;\n  border-radius: borderRadiusSmall;\n  cursor: pointer;\n  padding: spaceXXSmall;\n  margin: spaceXXSmall;\n  box-sizing: border-box;\n}\n\n.menuItem:not(.selected):hover {\n  color: colorTextInversePrimary;\n}\n\n.menuItem:focus-visible {\n  outline: none;\n}\n\n.menuItem:focus {\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n\n.menuIcon {\n  color: inherit;\n}\n\n.menuItem.selected {\n  color: colorTextInversePrimary;\n}\n\n.menuItem.selected::before {\n  position: absolute;\n  content: '';\n  border-radius: borderRadiusSmall;\n  background-color: colorFillPrimary;\n  width: spaceXXSmall;\n  height: spaceMedium;\n}\n\n.menuItem.disabled {\n  pointer-events: none;\n}\n\n.menuIconName {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: spaceXXSmall;\n  padding-left: spaceSmall;\n  margin-left: spaceXXSmall;\n}\n\n.subMenuItemText {\n  color: inherit;\n}\n\n.subMenuItemBadges {\n  display: flex;\n  align-items: center;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/SubMenu/SubMenu';\nexport * from '../../components/SubMenu/SubMenuGroup';\nexport * from '../../components/SubMenu/SubMenuItem';\nexport * from '../../components/SubMenu/SubMenuLink';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "SubMenuGroup.d.ts": {
            "path": "SubMenuGroup.d.ts",
            "content": "import * as React from 'react';\nimport type { IconSize, IconType } from '../../components/Icon';\nimport type { StatusSemanticType } from '../../components/StatusIndicator';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    groupHeader?: string;\n    menuGroup?: string;\n}>;\nexport interface SubMenuGroupProps {\n    children?: React.ReactNode;\n    groupTitle?: string;\n    groupIcon?: string;\n    groupIconSize?: IconSize;\n    groupIconType?: IconType;\n    collapsible?: boolean;\n    disabled?: boolean;\n    onChange?: (value: string) => unknown;\n    selectedMenuKey?: string;\n    status?: StatusSemanticType;\n    classNames?: ClassNames;\n}\nexport declare const SubMenuGroup: ({ children, groupTitle, groupIcon, groupIconSize, groupIconType, collapsible, disabled, onChange, selectedMenuKey, status, classNames, }: SubMenuGroupProps) => React.JSX.Element;\nexport {};\n//# sourceMappingURL=SubMenuGroup.d.ts.map"
          },
          "SubMenuItem.d.ts": {
            "path": "SubMenuItem.d.ts",
            "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { ColorTypes } from '../../types/typography';\nimport type { IconProps } from '../../components/Icon';\nimport type { TextProps } from '../../components/Text';\nexport declare const SubMenuItemIcon: {\n    ({ className, ...props }: IconProps): React.JSX.Element;\n    displayName: string;\n};\nexport declare const SubMenuItemText: {\n    ({ children, className, ...props }: TextProps): React.JSX.Element;\n    displayName: string;\n};\nexport interface SubMenuItemBadgesProps {\n    children?: React.ReactNode;\n    className?: string;\n}\nexport declare const SubMenuItemBadges: {\n    ({ children, className, ...props }: SubMenuItemBadgesProps): React.JSX.Element;\n    displayName: string;\n};\nexport interface SubMenuItemActionProps {\n    isMenuItemSelected?: boolean;\n    children?: React.ReactNode;\n    color?: ColorTypes;\n    className?: string;\n    tabIndex?: number;\n}\nexport declare const SubMenuItemAction: Flow.AbstractComponent<SubMenuItemActionProps, HTMLDivElement>;\ntype ClassNames = Readonly<{\n    wrapper?: string;\n}>;\nexport interface SubMenuItemProps {\n    classNames?: ClassNames;\n    children?: React.ReactNode;\n    selectedMenuKey?: string;\n    disabled?: boolean;\n    onChange?: (selectedMenuKey: string) => unknown;\n    menuKey: string;\n}\nexport declare const SubMenuItem: Flow.AbstractComponent<SubMenuItemProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=SubMenuItem.d.ts.map"
          },
          "SubMenuLink.d.ts": {
            "path": "SubMenuLink.d.ts",
            "content": "import type { Flow } from 'flow-to-typescript-codemod';\nimport type { IconSize, IconType } from '../../components/Icon';\nexport interface SubMenuLinkProps {\n    menuLinkTitle?: string;\n    menuLinkIcon: string;\n    menuLinkIconSize?: IconSize;\n    menuLinkIconType?: IconType;\n    menuKey: string;\n    selectedMenuKey?: string;\n    disabled?: boolean;\n    onChange?: (selectedMenuLinkKey: string) => unknown;\n}\nexport declare const SubMenuLink: Flow.AbstractComponent<SubMenuLinkProps, HTMLDivElement>;\n//# sourceMappingURL=SubMenuLink.d.ts.map"
          }
        }
      },
      "allFiles": [
        "SubMenu.module.css",
        "SubMenu.stories.module.css",
        "SubMenu.stories.tsx",
        "SubMenu.tsx",
        "SubMenuGroup.tsx",
        "SubMenuItem.tsx",
        "SubMenuLink.tsx",
        "index.ts"
      ]
    },
    "Table": {
      "name": "Table",
      "path": "src/components/Table",
      "files": {
        "main": {
          "path": "Table.d.ts",
          "content": "import * as React from 'react';\nimport type { TableRow } from '../../components/Table/DefaultRow';\nimport type { GenericHeaderItems } from '../../components/Table/DefaultTableHeader';\nimport type { SortDirection } from '../../components/Table/hooks';\nexport interface GenericObject {\n    [key: string]: unknown;\n}\nexport type TableClassNames = Readonly<{\n    wrapper?: string;\n    table?: string;\n    tableHeader?: string;\n    tableBody?: string;\n    tableRow?: string;\n    checkbox?: string;\n}>;\ninterface VirtualizationOptions {\n    rowsCount: number;\n    rowHeight?: string;\n    onEndReached?: () => void;\n    isEndLoading?: boolean;\n    isAllDataFetched?: boolean;\n}\nexport interface TableProps<T, U> {\n    classNames?: TableClassNames;\n    className?: string;\n    TableRow?: TableRow<T, U>;\n    headers: GenericHeaderItems<T, U>;\n    entries: Array<T>;\n    extras?: U;\n    sortable?: boolean;\n    showHeader?: boolean;\n    tableHeaderClassName?: string;\n    headerIconClassName?: string;\n    defaultSortKey?: string;\n    defaultSortDirection?: 'asc' | 'desc' | 'original';\n    enableInternalSorting?: boolean;\n    selectedKeys?: string[];\n    disabledKeys?: string[];\n    onSelect?: (keys: string[]) => unknown;\n    idName?: keyof T;\n    onSort?: (key: keyof T, direction: SortDirection) => void;\n    isLoading?: boolean;\n    emptyText?: React.ReactNode;\n    disabled?: boolean;\n    customLoader?: React.ReactNode;\n    borderRadius?: string;\n    stickyHeader?: boolean;\n    virtualizationOptions?: VirtualizationOptions;\n    testId?: string;\n}\n/**\n * Table\n * @param {React.ComponentType} Row - React.ComponentType<{data: Data, extras?: Extras, sortedKeys?: string[]}>\n * @param {string} className - string\n *\n **/\n/**\n * Table\n * @param {React.ComponentType} Row - React.ComponentType<{data: Data, extras?: Extras, sortedKeys?: string[]}>\n * @param {string} className - string\n *\n */\nexport declare function Table<Data extends GenericObject, Extras extends GenericObject>(props: TableProps<Data, Extras>): React.JSX.Element;\nexport {};\n//# sourceMappingURL=Table.d.ts.map"
        },
        "story": null,
        "css": {
          "path": "Table.module.css",
          "content": "@value (\n  colorFillPrimary,\n  colorFillSecondary,\n  colorTextPrimary,\n  colorTextSecondary,\n  colorBorderPrimary,\n  colorBorderSecondary,\n  colorFillSecondary,\n  colorBackgroundPrimary,\n  colorBackgroundTertiary,\n  colorGrayLightest\n) from '../../styles/variables/_color.css';\n@value (\n  spaceNone, \n  spaceXXSmall, \n  spaceXSmall,\n   spaceSmall, \n   spaceMedium\n) from '../../styles/variables/_space.css';\n@value (\n  sizeFluid, \n  size2, \n  size8, \n  size48, \n  size60, \n  size240, \n  size300\n) from '../../styles/variables/_size.css';\n@value (\n  borderWidthNone, \n  borderWidthPrimary, \n  borderRadiusNone, \n  borderRadiusMedium, \n  borderWidthSecondary\n) from '../../styles/variables/_border.css';\n@value (\n  fontLineHeight170\n) from '../../styles/variables/_font.css';\n@value (\n  elevationCard\n) from '../../styles/variables/_elevation.css';\n\n@value tableRowTotalPadding: calc(spaceMedium * 2);\n\n.fooBar {\n  color: colorFillPrimary;\n}\n\n.tableContainer {\n  --border-radius: borderRadiusMedium;\n  --table-width: sizeFluid;\n  height: var(--table-height);\n  composes: borderPrimary from '../../styles/border.module.css';\n  width: sizeFluid;\n  overflow-x: auto;\n  border-radius: var(--border-radius);\n}\n\n.defaultTable {\n  min-width: sizeFluid;\n  height: fit-content;\n  flex-flow: column;\n  overflow-x: auto;\n  border-collapse: collapse;\n  box-sizing: border-box;\n  border-radius: var(--border-radius);\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone borderWidthPrimary\n    colorBorderPrimary;\n  table-layout: fixed;\n  white-space: nowrap;\n}\n.fullHeightTable {\n  height: sizeFluid;\n}\n.defaultTableBody {\n  flex-flow: column;\n  border-radius: borderRadiusNone borderRadiusNone var(--border-radius)\n    var(--border-radius);\n  background: colorBackgroundTertiary;\n}\n\n.defaultSelectedBodyRow {\n  background: colorFillSecondary;\n}\n\n.labelContents {\n  display: flex;\n  justify-content: space-between;\n  flex: 1;\n}\n.labelContainer {\n  align-items: center;\n}\n\n.defaultHeaderCellSortable.sorted .sortArrow {\n  visibility: visible;\n}\n\n.defaultCell,\n.defaultSingleCell,\n.defaultDoubleCell {\n  height: size48;\n  align-items: center;\n  padding: spaceNone spaceXSmall;\n  background: colorBackgroundTertiary;\n}\n\n.defaultDoubleCell {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  justify-content: center;\n}\n\n.paddedTitleBlock {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n}\n\n.defaultSingleCell {\n  /*used to retain bottom border on cell if content is full-bleed */\n  padding-bottom: borderWidthPrimary;\n}\n\n.defaultHeadCell {\n  composes: defaultCell;\n  background: colorBackgroundPrimary;\n}\n\n.defaultDoubleCell {\n  height: size60;\n}\n\n.singleContentCell {\n  composes: defaultCell;\n  padding: spaceNone spaceXSmall;\n}\n.doubleContentCell {\n  composes: defaultDoubleCell;\n  padding: spaceNone spaceXSmall;\n}\n\n.doubleTitle {\n  margin: spaceNone;\n}\n.doubleSubtitle {\n  display: block;\n  height: fontLineHeight170;\n}\n\n.stickyHeaderCell,\n.stickyCell {\n  position: sticky;\n  left: spaceNone;\n  z-index: calc(elevationCard / 2);\n}\n\n.stickyHeaderCell::after,\n.stickyCell::after {\n  content: '';\n  position: absolute;\n  right: calc(borderWidthPrimary * -1);\n  top: spaceNone;\n  width: calc(size2 / 2);\n  height: sizeFluid;\n  background: colorBorderSecondary;\n}\n\n.stickyHeaderCell {\n  background: colorBackgroundPrimary;\n}\n\n/**\n  Row CSS\n*/\n\n.defaultRow {\n  composes: borderBottomPrimary from '../../styles/border.module.css';\n  height: size48;\n  background: colorBackgroundTertiary;\n}\n\n.defaultTable .defaultRow:last-child td:first-child {\n  border-bottom-left-radius: var(--border-radius);\n}\n\n.defaultTable .defaultRow:last-child td:last-child {\n  border-bottom-right-radius: var(--border-radius);\n}\n\n.defaultTable .defaultRow:last-child {\n  border-bottom: none;\n}\n\n.emptyRow {\n  display: flex;\n  width: calc(var(--table-width) - tableRowTotalPadding);\n  position: sticky;\n  left: spaceMedium;\n  flex: 0 0 auto;\n  align-items: center;\n  justify-content: center;\n}\n\n.defaultLoader {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  height: size240;\n}\n\n.defaultEmptyText {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  height: size240;\n}\n\n.defaultHeaderCell.checkbox {\n  padding: spaceSmall spaceMedium spaceSmall spaceNone;\n  max-width: size60;\n}\n\n.defaultTable td:first-child {\n  padding-left: spaceMedium;\n}\n\n.defaultTable th:first-child {\n  padding-left: spaceMedium;\n}\n\n/* Header CSS */\n\n.defaultTableHead {\n  flex-flow: column;\n  border-radius: var(--border-radius) var(--border-radius) borderRadiusNone\n    borderRadiusNone;\n  composes: borderBottomPrimary from '../../styles/border.module.css';\n  padding: spaceSmall;\n}\n\n.defaultHeaderRow {\n  box-sizing: border-box;\n  background: colorBackgroundPrimary;\n  border-radius: var(--border-radius) var(--border-radius) borderRadiusNone\n    borderRadiusNone;\n}\n\n.labelContents {\n  display: flex;\n  justify-content: flex-start;\n  flex: 1;\n  flex-direction: row;\n  align-items: flex-start;\n  padding: spaceNone;\n  gap: spaceXXSmall;\n}\n\n.labelContainer {\n  align-items: center;\n}\n\n.defaultHeaderCellSortable {\n  cursor: pointer;\n}\n\n.defaultHeaderCell,\n.defaultHeaderCellSortable {\n  padding: spaceNone spaceXSmall;\n  text-align: left;\n  align-items: center;\n}\n\n.defaultHeaderCell:first-child {\n  border-top-left-radius: var(--border-radius);\n}\n\n.defaultHeaderCell:last-child {\n  border-top-right-radius: var(--border-radius);\n}\n\n.defaultHeaderCell:not(.selectedHeader):hover {\n  background: colorGrayLightest;\n}\n\n.selectedHeader {\n  color: colorTextPrimary;\n  background: colorFillSecondary;\n}\n\n.sortArrow {\n  color: colorTextSecondary;\n}\n\n.selectedSortArrow {\n  color: colorTextPrimary;\n}\n\n.stickyHeader {\n  position: sticky;\n  top: spaceNone;\n  z-index: elevationCard;\n}\n\n.stickyHeader::after {\n  content: '';\n  position: absolute;\n  bottom: calc(borderWidthSecondary * -1);\n  left: spaceNone;\n  width: sizeFluid;\n  height: calc(size2 / 2);\n  background: colorBorderPrimary;\n}\n\n.fetchMoreLoaderContainer {\n  display: flex;\n  text-align: center;\n  justify-content: center;\n  padding: size8;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Table/Cell';\nexport * from '../../components/Table/DefaultRow';\nexport * from '../../components/Table/DefaultTableHeader';\nexport * from '../../components/Table/StaticTable';\nexport * from '../../components/Table/Table';\nexport * from '../../components/Table/TableActionBar';\nexport * from '../../components/Table/TableBottomBar';\nexport * from '../../components/Table/TableTopBar';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "Cell.d.ts": {
            "path": "Cell.d.ts",
            "content": "import * as React from 'react';\nimport type { ClassNameComponent } from '../../utils/makeClassNameComponent';\ninterface CellsProps {\n    children?: React.ReactNode;\n    className?: string | null | undefined;\n    truncatedText?: React.ReactNode;\n    onClick?: (e: React.SyntheticEvent<HTMLElement>) => unknown;\n    testId?: string;\n}\nexport declare const Cells: ({ children, className, testId, ...rest }: CellsProps) => React.ReactElement<React.ComponentProps<\"div\">>;\nexport declare const Cell: ({ children, className, testId, }: CellsProps) => React.ReactElement<React.ComponentProps<\"div\">>;\nexport declare const BasicSingleCell: ClassNameComponent<'td'>;\nexport declare const BasicDoubleCell: ClassNameComponent<'td'>;\nexport declare const PaddedContentCell: ClassNameComponent<'td'>;\nexport declare const PaddedDoubleContentCell: ClassNameComponent<'td'>;\nexport declare const SingleCell: ({ title, className, testId, }: {\n    title: string;\n    icon?: React.ReactNode;\n    className?: string;\n    testId?: string;\n}) => React.JSX.Element;\nexport declare const DoubleCell: ({ title, subtitle, className, testId, }: {\n    title: React.ReactNode;\n    subtitle?: React.ReactNode;\n    className?: string;\n    testId?: string;\n}) => React.JSX.Element;\nexport declare const DateCell: ({ date, className, testId, }: {\n    date: string | Date;\n    className?: string;\n    testId?: string;\n}) => React.JSX.Element;\nexport declare const Monogram: ({ initials, testId, }: {\n    initials: string;\n    testId?: string;\n}) => React.JSX.Element;\nexport declare const MonogramCell: ({ initials, className, testId, }: {\n    initials: string;\n    className?: string;\n    testId?: string;\n}) => React.JSX.Element;\nexport {};\n//# sourceMappingURL=Cell.d.ts.map"
          },
          "DefaultRow.d.ts": {
            "path": "DefaultRow.d.ts",
            "content": "import * as React from 'react';\nimport type { ClassNameComponent } from '../../utils/makeClassNameComponent';\nimport type { GenericHeaderItems } from '../../components/Table/DefaultTableHeader';\nimport type { GenericObject } from '../../components/Table/Table';\ntype ClassNames = Readonly<{\n    tableRow?: string;\n    checkbox?: string;\n}>;\nexport interface TableRowProps<T, U> {\n    data: T;\n    extras?: U;\n    sortedKeys?: string[];\n    headers?: GenericHeaderItems<T, U>;\n    selected?: boolean;\n    disabled?: boolean;\n    testId?: string;\n}\nexport type TableRow<T, U> = React.ComponentType<TableRowProps<T, U>>;\nexport declare const BasicRow: ClassNameComponent<'tr'>;\ninterface EmptyRowProps {\n    emptyText?: React.ReactNode;\n    isLoading?: boolean;\n    headersLength: number;\n    customLoader?: React.ReactNode;\n    testId?: string;\n}\nexport declare const EmptyRow: ({ isLoading, emptyText, headersLength, customLoader, testId, }: EmptyRowProps) => React.ReactElement<React.ComponentProps<\"tr\">>;\nexport declare function DefaultRow<T extends GenericObject, U extends GenericObject>({ data, extras, headers, selected, onSelect, classNames, disabled, testId, }: {\n    data: T;\n    extras?: U;\n    headers: GenericHeaderItems<T, U>;\n    selected?: boolean;\n    onSelect?: (arg1: {\n        value: string;\n        checked: boolean;\n    }) => unknown;\n    classNames?: ClassNames;\n    disabled?: boolean;\n    testId?: string;\n}): React.JSX.Element;\nexport {};\n//# sourceMappingURL=DefaultRow.d.ts.map"
          },
          "DefaultTableHeader.d.ts": {
            "path": "DefaultTableHeader.d.ts",
            "content": "import * as React from 'react';\nimport type { ClassNameComponent } from '../../utils/makeClassNameComponent';\nimport type { SortDirection } from '../../components/Table/hooks';\nimport type { GenericObject } from '../../components/Table/Table';\nexport interface GenericHeaderItem<T, U> {\n    label: React.ReactNode;\n    key: keyof T;\n    className?: string;\n    filterIcon?: React.ReactNode;\n    filtered?: boolean;\n    subtext?: string;\n    sortable?: boolean;\n    headerIconClassName?: string;\n    sticky?: boolean;\n    render?: React.ComponentType<{\n        data: T;\n        extras?: U;\n        className?: string;\n        selected?: boolean;\n        disabled?: boolean;\n        testId?: string;\n    }>;\n}\nexport type GenericHeaderItems<T, U> = GenericHeaderItem<T, U>[];\nexport declare const BasicHeadCell: ClassNameComponent<'th'>;\nexport declare const BasicTableHead: ClassNameComponent<'thead'>;\nexport interface TableHeaderProps<T, U> {\n    className?: string;\n    tableHeaderClassName?: string;\n    sortable?: boolean;\n    columns: GenericHeaderItems<T, U>;\n    handleSortClick?: (sortKey: keyof T) => unknown;\n    sortKey?: keyof T;\n    sortDirection?: SortDirection;\n    checked?: 'true' | 'false' | 'mixed';\n    handleCheckboxClick?: (arg1: {\n        value: string;\n        checked: boolean;\n    }) => unknown;\n    disabled?: boolean;\n    stickyHeader?: boolean;\n    checkboxClassName?: string;\n    testId?: string;\n}\nexport declare function DefaultTableHeader<T extends GenericObject, U extends GenericObject>(props: TableHeaderProps<T, U>): React.JSX.Element;\n//# sourceMappingURL=DefaultTableHeader.d.ts.map"
          },
          "StaticTable.d.ts": {
            "path": "StaticTable.d.ts",
            "content": "import * as React from 'react';\nimport type { ClassNameComponent } from '../../utils/makeClassNameComponent';\nimport type { SortDirection } from '../../components/Table/hooks';\nimport type { GenericObject, TableProps } from '../../components/Table/Table';\nexport declare const BasicTable: ClassNameComponent<'table'>;\nexport declare const BasicTableBody: ClassNameComponent<'tbody'>;\n/**\n * A Static Default Table.\n *\n * Our\n */\nexport declare function StaticTable<Data extends GenericObject, Extras extends GenericObject>(props: TableProps<Data, Extras> & {\n    handleSortClick?: (sortKey: string) => unknown;\n    sortKey?: string;\n    sortDirection?: SortDirection;\n    rowKeys?: string[];\n}): React.JSX.Element;\nexport declare function StaticTableVirtualized<Data extends GenericObject, Extras extends GenericObject>(props: TableProps<Data, Extras> & {\n    handleSortClick?: (sortKey: string) => unknown;\n    sortKey?: string;\n    sortDirection?: SortDirection;\n    rowKeys?: string[];\n}): React.JSX.Element;\n//# sourceMappingURL=StaticTable.d.ts.map"
          },
          "Table.docs.d.ts": {
            "path": "Table.docs.d.ts",
            "content": "export declare const TABLE_DOCS: {\n    readonly argTypes: {\n        readonly headers: {\n            readonly type: {\n                readonly required: true;\n            };\n            readonly description: \"Provide an array of objects to render the header, each object should consist of label(*), key(*), sortable, sticky and render function\";\n            readonly control: {\n                readonly type: \"object\";\n            };\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"{label: React.Node, key: $Keys<T>, className?: string, filterIcon?: React.Node, filtered?: boolean, subtext?: string, sortable?: boolean, headerIconClassName?: string, sticky?: boolean, render?: React.ComponentType<{data: T, extras?: U, className?: string, selected?: boolean,}>, }\";\n                };\n            };\n        };\n        readonly entries: {\n            readonly type: {\n                readonly required: true;\n            };\n            readonly description: \"Provide an array of object. Each object belong on one row in the table. Each object should have id and all the keys with values that is being passed in headers array\";\n            readonly control: {\n                readonly type: \"object\";\n            };\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"Array<T>\";\n                };\n            };\n        };\n        readonly classNames: {\n            readonly description: \"Provide optional classNames to be applied to the wrapper, table, tableHeader, tableBody, tableRow, or checkbox\";\n            readonly control: {\n                readonly type: \"object\";\n            };\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"{wrapper?: string, table?: string, tableHeader?: string, tableBody?: string, tableRow?: string, checkbox?: string}\";\n                };\n            };\n        };\n        readonly Row: {\n            readonly description: \"Custom Row component to be passed to table\";\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"TableRow<T, U>\";\n                };\n            };\n        };\n        readonly sortable: {\n            readonly description: \"Sort Icon will appear in right side of column's header with column level true sortable value\";\n            readonly name: \"sortable\";\n            readonly options: readonly [false, true];\n            readonly control: \"boolean\";\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"boolean\";\n                };\n                readonly defaultValue: {\n                    readonly summary: true;\n                };\n            };\n        };\n        readonly showHeader: {\n            readonly description: \"Show or hide header\";\n            readonly options: readonly [false, true];\n            readonly control: \"boolean\";\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"boolean\";\n                };\n                readonly defaultValue: {\n                    readonly summary: true;\n                };\n            };\n        };\n        readonly defaultSortKey: {\n            readonly description: \"key name for which table should be sorted by default. headers array should have sortable true for that key object\";\n            readonly control: {\n                readonly type: \"text\";\n            };\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"string\";\n                };\n            };\n        };\n        readonly defaultSortDirection: {\n            readonly description: \"default sorting direction for the defaultSortKey column\";\n            readonly control: {\n                readonly type: \"text\";\n            };\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"'asc' | 'desc' | 'original'\";\n                };\n            };\n        };\n        readonly selectedKeys: {\n            readonly description: \"array of keys which are selected. This prop is also used to decide weather to show checkboxes or not. So, pass an empty array in case no row is selected.\";\n            readonly control: {\n                readonly type: \"object\";\n            };\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"string[]\";\n                };\n            };\n        };\n        readonly disabledKeys: {\n            readonly description: \"array of keys which are disabled. This prop is used to disable the checkbox and its events for particular rows.\";\n            readonly control: {\n                readonly type: \"object\";\n            };\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"string[]\";\n                };\n            };\n        };\n        readonly onSelect: {\n            readonly description: \"callback function when any row is selected\";\n            readonly action: \"selected\";\n            readonly type: {\n                readonly summary: \"(keys: string[]) => mixed\";\n            };\n        };\n        readonly idName: {\n            readonly description: \"name of key in row objects that has to be used as id\";\n        };\n        readonly onSort: {\n            readonly description: \"callback function when any table is sorted\";\n            readonly action: \"sorted\";\n            readonly type: {\n                readonly summary: \"(key: $Keys<T>, direction: SortDirection) => void\";\n            };\n        };\n        readonly isLoading: {\n            readonly description: \"to wait for data to populate in table and show loading state when entries array is empty.\";\n            readonly options: readonly [false, true];\n            readonly control: \"boolean\";\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"boolean\";\n                };\n                readonly defaultValue: {\n                    readonly summary: false;\n                };\n            };\n        };\n        readonly emptyText: {\n            readonly description: \"Provide component to be shown in case of empty data\";\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"React.Component\";\n                };\n            };\n        };\n        readonly customLoader: {\n            readonly description: \"Provide optional component to be shown in case of loading state. It will override the default loader.\";\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"React.Component\";\n                };\n            };\n        };\n        readonly disabled: {\n            readonly description: \"disable all the checkboxes of each row in the table\";\n            readonly options: readonly [false, true];\n            readonly control: \"boolean\";\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"boolean\";\n                };\n                readonly defaultValue: {\n                    readonly summary: false;\n                };\n            };\n        };\n        readonly borderRadius: {\n            readonly description: \"Border Radius of all four corners of the table. Default value is borderRadiusMedium i.e., 12px.\";\n            readonly control: \"text\";\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"string\";\n                };\n                readonly defaultValue: {\n                    readonly summary: \"12px\";\n                };\n            };\n        };\n        readonly stickyHeader: {\n            readonly description: \"Sticky header will stick the header to the top of the table when scrolling. This would only work if the table wrapper is scrollable.\";\n            readonly control: \"boolean\";\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"boolean\";\n                };\n                readonly defaultValue: {\n                    readonly summary: false;\n                };\n            };\n        };\n        readonly enableInternalSorting: {\n            readonly description: \"Enable internal sorting for the table. This would sort the table data internally and not rely on the apis sorting\";\n            readonly control: \"boolean\";\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"?boolean\";\n                };\n                readonly defaultValue: {\n                    readonly summary: true;\n                };\n            };\n        };\n        readonly rowsCount: {\n            readonly name: \"virtualizationOptions.rowsCount\";\n            readonly description: \"Total number of virtual rows.\";\n            readonly control: {\n                readonly type: \"number\";\n            };\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"number\";\n                };\n                readonly defaultValue: {\n                    readonly summary: 20;\n                };\n            };\n        };\n        readonly rowHeight: {\n            readonly name: \"virtualizationOptions.rowHeight\";\n            readonly description: \"Row height in CSS units (e.g., \\\"48px\\\"). Should be provided correctly, otherwise it will not work as expected.\";\n            readonly control: {\n                readonly type: \"text\";\n            };\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"string\";\n                };\n                readonly defaultValue: {\n                    readonly summary: \"48px\";\n                };\n            };\n        };\n        readonly isEndLoading: {\n            readonly name: \"virtualizationOptions.isEndLoading\";\n            readonly description: \"Whether to show loading spinner at the bottom.\";\n            readonly control: {\n                readonly type: \"boolean\";\n            };\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"boolean\";\n                };\n                readonly defaultValue: {\n                    readonly summary: false;\n                };\n            };\n        };\n        readonly isAllDataFetched: {\n            readonly name: \"virtualizationOptions.isAllDataFetched\";\n            readonly description: \"Whether all rows are fetched (disables infinite loading).\";\n            readonly control: {\n                readonly type: \"boolean\";\n            };\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"boolean\";\n                };\n                readonly defaultValue: {\n                    readonly summary: false;\n                };\n            };\n        };\n        readonly onEndReached: {\n            readonly name: \"virtualizationOptions.onEndReached\";\n            readonly description: \"Callback triggered when end of list is reached.\";\n            readonly action: \"onEndReached\";\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"() => void\";\n                };\n            };\n        };\n        readonly testId: {\n            readonly description: \"Test ID for the component\";\n            readonly control: {\n                readonly type: \"text\";\n            };\n            readonly table: {\n                readonly type: {\n                    readonly summary: \"string\";\n                };\n            };\n        };\n    };\n    readonly parameters: {\n        readonly docs: {\n            readonly subtitle: \"Generates a Table component.\";\n            readonly description: {\n                readonly component: \"\\n```js\\nimport {\\n  Table,\\n  StaticTable,\\n  DefaultRow,\\n  BasicSingleCell,\\n  DateCell,\\n  DoubleCell,\\n  SingleCell,\\n  MonogramCell,\\n  TableActionBar,\\n  ButtonCta,\\n  DropdownCta,\\n  TableTopBar,\\n  TableBottomBar\\n} from \\\"@spaced-out/ui-design-system/lib/components/Table\\\";\\n```\\nTable component internally uses HTML Table, Thead, Tbody, Tr, Th and Td tags. It accepts entries and headers for showing table.\\nThe Table component takes care of lots of things for you but it's not a magical component, it wraps a lot of behavior, so you can have,\\nfor instance, a static table with no sorting options.\\n\\nStaticTables work just like regular tables, except they don't have interactive headers, so you lose sorting.\\nBut remember, a regular interactive table uses a static table under the hood,\\nso how does it work? You can think of the StaticTable as a kind of controlled table component.\\nexcept that traditionally we'd update the entries prop and rerender from that.\\nThat would work just fine, but instead we can just pass in the keys we care about. By using StaticTable,\\nwe can simplify filtering and sorting outside of the table while the table keeps a stable value reference to all the entities.\\n\\nTo make any of rows selectable, we can do that by also passing in another property, selectedKeys.\\n\\nLet's say we want to also make any of the rows selectable, we can do that by also passing in another property, selectedKeys.\\n\\n### Custom Cells\\n\\nIt's possible you need to render out a custom cell, not just the default cell.\\nThere are two ways to do that. If you only need to modify a single cell,\\nyou can simply add a render: `React.ComponentType<{data: T, extras?: U}>`\\nkey to any given header item.\\n\\nThis cell renderer receives the _whole row_ of data, not just the individual cell, it's up to you what to do with it.\\n\\n### With Table Top, Bottom Bar and Actions\\n\\nYou can attach a top, bottom and action bar to the table by adding `TableTopBar`, `TableBottomBar` and `TableActionBar` components.\\nThere are just semantic components which just provide padding and border standardization. You can add any component inside these components.\\nThese also accept **className** prop.\\n\\n### Best Practices\\n* A Data Table should always have a `TableTopBar`\\n* Use `stickyHeader` prop to make the header sticky\\n* Always assign a height to the table wrapper to make it scrollable\\n* Manage the Table's Wrapper height effectively when using `TableActionBar` component\\n* Always use local `ButtonCta` and `DropdownCta` for actions in Action bar. These components are\\njust CSS Wrappers for Button and SimpleButtonDropdown components\\n* Use ButtonCta component to add a button CTA in the `TableActionBar`\\n* Use DropdownCta component to add a dropdown CTA button in the `TableActionBar` for screen width less than size1280(1280px)\\n\\n### Handling Sticky Headers with Virtualization\\n* When using **virtualization**, always assign a fixed `min-width` and `max-width` to sticky table headers with **same value**.\\nThis ensures a strict, fixed width for header cells. Directly using `width` (non strict for table headers) alone is not sufficient, as\\nit can be overridden by content width due to table layout behavior, causing headers to shift.\\n* If the cell content may exceed the defined width, or if you're unsure of its maximum width, also use `white-space: normal;` and `word-break: break-word;`\\nto ensure the content wraps within the cell instead of overflowing or causing layout shifts.\\n\\nThis helps maintain consistent column alignment and improves readability across varying data lengths.\\n\\n```jsx\\n<Table\\n  headers={TABLE_HEADERS}\\n  entries={TABLE_DATA}\\n  stickyHeader={true}\\n  classNames={{\\n    wrapper: classify(css.tableWrapper, {\\n      [css.withActionBar]: getNumberOfEntriesSelected() > 0,\\n    })\\n  }}\\n/>\\n```\\n\\n```css\\n.tableWrapper {\\n  height: calc(sizeFullViewportHeight - size160);\\n}\\n\\n.tableWrapper.withActionBar {\\n  height: calc((sizeFullViewportHeight - size160) - actionBarHeight);\\n}\\n```\\n\\n### Usage\\n\\n```jsx\\nconst TABLE_HEADERS = [\\n  { label: \\\"Name\\\", key: \\\"name\\\", sortable: true, className: css.mediumColumn },\\n  { label: \\\"Tel\\\", key: \\\"phone\\\", sortable: true, className: css.mediumColumn },\\n];\\n\\nconst TABLE_DATA = [\\n  {\\n    id: \\\"1\\\",\\n    name: \\\"Alice\\\",\\n    phone: \\\"123-456-7890\\\",\\n  },\\n  {\\n    id: \\\"2\\\",\\n    name: \\\"Bob\\\",\\n    phone: \\\"987-654-3210\\\",\\n  },\\n];\\n\\nexport const _TableExample = (): React.Node => {\\n  return (\\n    <div className={css.container}>\\n      {/* Top Bar with Filters */}\\n      <TableTopBar>\\n        <div className={css.left}>\\n          <SubTitleMedium className={css.title}>Basic Data Table</SubTitleMedium>\\n          <SearchInput />\\n        </div>\\n      </TableTopBar>\\n\\n      {/* Table */}\\n      <Table\\n        headers={TABLE_HEADERS}\\n        entries={TABLE_DATA}\\n        isLoading={isLoading}\\n        stickyHeader={true}\\n        borderRadius={'0'}\\n        selectedKeys={staticTableKeysAcrossPages[currPage] || []}\\n        onSelect={(keys) => {\\n          setSelectAllEntries(false);\\n          setStaticTableKeysAcrossPages({\\n            ...staticTableKeysAcrossPages,\\n            [currPage]: keys,\\n          });\\n        }}\\n        classNames={{\\n          wrapper: classify(css.tableWrapper, {\\n            [css.withActionBar]: getNumberOfEntriesSelected() > 0,\\n          })\\n        }}\\n      />\\n\\n      {/* Table Actions */}\\n      {getNumberOfEntriesSelected() > 0 && (\\n        <TableActionBar className={css.actionBar}>\\n          <div className={css.leftActionSlot}>\\n            <ButtonCta\\n              onClick={() => {\\n                setSelectAllEntries(true);\\n                setStaticTableKeysAcrossPages({\\n                  ...staticTableKeysAcrossPages,\\n                  [currPage]: tableEntries.map((entry) => entry.id),\\n                });\\n              }}\\n            >\\n              Select all items\\n            </ButtonCta>\\n            {getNumberOfEntriesSelected() > 0 && (\\n              <BodySmall color=\\\"inversePrimary\\\">\\n                {getNumberOfEntriesSelected() entries selected}\\n              </BodySmall>\\n            )}\\n          </div>\\n          <div className={classify(css.middleActionSlot, css.fullTable)}>\\n            <ButtonCta size=\\\"small\\\" iconLeftName=\\\"folder-plus\\\">\\n              Add to group\\n            </ButtonCta>\\n          </div>\\n          <div className={classify(css.middleActionSlot, css.smallTable)}>\\n            <ButtonCta size=\\\"small\\\" iconLeftName=\\\"folder-plus\\\">\\n              Add to group\\n            </ButtonCta>\\n            <DropdownCta\\n              ariaLabel=\\\"Icon Button Dropdown\\\"\\n              iconLeftName=\\\"ellipsis\\\"\\n              options={[\\n                {\\n                  iconLeft: 'layer-plus',\\n                  key: '1',\\n                  label: 'Create group',\\n                },\\n              ]}\\n              selectedKeys={selectedKeys}\\n              onOptionSelect={() => setSelectedKeys([])}\\n              size=\\\"small\\\"\\n            />\\n          </div>\\n          <div className={css.rightActionSlot}>\\n            <ButtonCta\\n              iconLeftName=\\\"close\\\"\\n              onClick={() => {\\n                setSelectAllEntries(false);\\n                setStaticTableKeysAcrossPages({});\\n              }}\\n            >\\n              Close\\n            </ButtonCta>\\n          </div>\\n        </TableActionBar>\\n      )}\\n\\n      {/* Bottom Bar with Pagination */}\\n      <TableBottomBar>\\n        <Pagination\\n          currentPage={currPage}\\n          totalPages={totalPages}\\n          onChange={(page) => {\\n            onMove(page || 1);\\n          }}\\n        >\\n          <SubTitleExtraSmall color=\\\"secondary\\\">\\n            Showing page {currPage} of {totalPages}\\n          </SubTitleExtraSmall>\\n        </Pagination>\\n      </TableBottomBar>\\n    </div>\\n  );\\n};\\n```\\n\\n```css\\n@value actionBarHeight: size50;\\n\\n.container {\\n  width: sizeFluid;\\n}\\n\\n.left {\\n  display: flex;\\n  align-items: center;\\n}\\n\\n.title {\\n  margin-right: spaceMedium;\\n}\\n\\n.mediumColumn {\\n  width: calc(sizeFluid / 5);\\n}\\n\\n.tableWrapper {\\n  height: calc(sizeFullViewportHeight - size160);\\n}\\n\\n.actionBar {\\n  display: flex;\\n  align-items: center;\\n  gap: spaceXSmall;\\n}\\n\\n.tableWrapper.withActionBar {\\n  height: calc((sizeFullViewportHeight - size160) - actionBarHeight);\\n}\\n\\n.leftActionSlot,\\n.rightActionSlot,\\n.middleActionSlot {\\n  display: flex;\\n  gap: spaceSmall;\\n  align-items: center;\\n}\\n\\n.leftActionSlot,\\n.rightActionSlot {\\n  width: calc(sizeFluid / 4);\\n}\\n\\n.leftActionSlot {\\n  justify-content: flex-start;\\n}\\n\\n.middleActionSlot {\\n  width: calc(sizeFluid / 2);\\n  justify-content: center;\\n  gap: spaceXXSmall;\\n}\\n\\n.rightActionSlot {\\n  justify-content: flex-end;\\n}\\n\\n.smallTable {\\n  display: none;\\n}\\n\\n@media only screen and (max-width: size1280) {\\n  .fullTable {\\n    display: none;\\n  }\\n\\n  .smallTable {\\n    display: flex;\\n  }\\n}\\n\\n.dangerText {\\n  color: colorTextDanger;\\n}\\n\\n.dangerText:hover,\\n.dangerText:active,\\n.dangerText:focus {\\n  color: colorTextDanger;\\n}\\n\\n```\\n        \";\n            };\n        };\n        readonly storySource: {\n            readonly componentPath: \"/src/components/Table/Table\";\n        };\n    };\n};\n//# sourceMappingURL=Table.docs.d.ts.map"
          },
          "TableActionBar.d.ts": {
            "path": "TableActionBar.d.ts",
            "content": "import * as React from 'react';\nimport type { ButtonProps } from '../../components/Button';\nimport type { SimpleButtonDropdownProps } from '../../components/ButtonDropdown';\nexport interface TableActionBarProps {\n    children?: React.ReactNode;\n    className?: string;\n    testId?: string;\n}\nexport declare const ButtonCta: ({ classNames, testId, ...props }: ButtonProps & {\n    testId?: string;\n}) => React.JSX.Element;\nexport declare const DropdownCta: ({ classNames, testId, ...props }: SimpleButtonDropdownProps & {\n    testId?: string;\n}) => React.JSX.Element;\nexport declare const TableActionBar: ({ children, className, testId, ...props }: TableActionBarProps) => React.JSX.Element;\n//# sourceMappingURL=TableActionBar.d.ts.map"
          },
          "TableBottomBar.d.ts": {
            "path": "TableBottomBar.d.ts",
            "content": "import * as React from 'react';\nexport interface TableBottomBarProps {\n    children?: React.ReactNode;\n    className?: string;\n    testId?: string;\n}\nexport declare const TableBottomBar: ({ children, className, testId, ...props }: TableBottomBarProps) => React.JSX.Element;\n//# sourceMappingURL=TableBottomBar.d.ts.map"
          },
          "TableTopBar.d.ts": {
            "path": "TableTopBar.d.ts",
            "content": "import * as React from 'react';\nexport interface TableTopBarProps {\n    children?: React.ReactNode;\n    className?: string;\n    testId?: string;\n}\nexport declare const TableTopBar: ({ children, className, testId, ...props }: TableTopBarProps) => React.JSX.Element;\n//# sourceMappingURL=TableTopBar.d.ts.map"
          },
          "dummyTableData.d.ts": {
            "path": "dummyTableData.d.ts",
            "content": "export declare const LARGE_TABLE_DATA: readonly [{\n    readonly id: \"1\";\n    readonly name: \"Alice\";\n    readonly phone: \"123-456-7890\";\n    readonly notes: \"likes candy\";\n    readonly email: \"alice@symbolics.co\";\n    readonly sign: \"taurus\";\n    readonly address: \"8475 Bedford Lane Addison, IL 60101\";\n}, {\n    readonly id: \"2\";\n    readonly name: \"Bob\";\n    readonly phone: \"987-654-3210\";\n    readonly notes: \"enjoys hiking\";\n    readonly email: \"bob@example.com\";\n    readonly sign: \"virgo\";\n    readonly address: \"1234 Oak Street Springfield, MO 65802\";\n}, {\n    readonly id: \"3\";\n    readonly name: \"Charlie\";\n    readonly phone: \"555-123-4567\";\n    readonly notes: \"loves photography\";\n    readonly email: \"charlie@testmail.com\";\n    readonly sign: \"libra\";\n    readonly address: \"456 Pine Avenue San Diego, CA 92101\";\n}, {\n    readonly id: \"4\";\n    readonly name: \"David\";\n    readonly phone: \"222-333-4444\";\n    readonly notes: \"avid reader\";\n    readonly email: \"david@examplemail.com\";\n    readonly sign: \"leo\";\n    readonly address: \"789 Elm Street Dallas, TX 75201\";\n}, {\n    readonly id: \"5\";\n    readonly name: \"Emma\";\n    readonly phone: \"666-777-8888\";\n    readonly notes: \"animal lover\";\n    readonly email: \"emma@testmail.co\";\n    readonly sign: \"cancer\";\n    readonly address: \"567 Willow Lane New York, NY 10001\";\n}, {\n    readonly id: \"6\";\n    readonly name: \"Frank\";\n    readonly phone: \"444-555-6666\";\n    readonly notes: \"technology enthusiast\";\n    readonly email: \"frank@examplemail.co\";\n    readonly sign: \"aquarius\";\n    readonly address: \"234 Birch Street Seattle, WA 98101\";\n}, {\n    readonly id: \"7\";\n    readonly name: \"Grace\";\n    readonly phone: \"777-888-9999\";\n    readonly notes: \"foodie\";\n    readonly email: \"grace@testmail.com\";\n    readonly sign: \"sagittarius\";\n    readonly address: \"456 Oak Lane Los Angeles, CA 90001\";\n}, {\n    readonly id: \"8\";\n    readonly name: \"Henry\";\n    readonly phone: \"111-222-3333\";\n    readonly notes: \"gardening lover\";\n    readonly email: \"henry@example.com\";\n    readonly sign: \"capricorn\";\n    readonly address: \"789 Maple Street Chicago, IL 60601\";\n}, {\n    readonly id: \"9\";\n    readonly name: \"Isabella\";\n    readonly phone: \"888-999-0000\";\n    readonly notes: \"musician\";\n    readonly email: \"isabella@testmail.co\";\n    readonly sign: \"pisces\";\n    readonly address: \"567 Cedar Lane Miami, FL 33101\";\n}, {\n    readonly id: \"10\";\n    readonly name: \"Jack\";\n    readonly phone: \"444-555-6666\";\n    readonly notes: \"travel enthusiast\";\n    readonly email: \"jack@examplemail.com\";\n    readonly sign: \"aries\";\n    readonly address: \"234 Oak Avenue San Francisco, CA 94101\";\n}, {\n    readonly id: \"11\";\n    readonly name: \"Kate\";\n    readonly phone: \"222-333-4444\";\n    readonly notes: \"coffee lover\";\n    readonly email: \"kate@testmail.co\";\n    readonly sign: \"gemini\";\n    readonly address: \"789 Birch Lane Denver, CO 80201\";\n}, {\n    readonly id: \"12\";\n    readonly name: \"Liam\";\n    readonly phone: \"777-888-9999\";\n    readonly notes: \"sports enthusiast\";\n    readonly email: \"liam@example.com\";\n    readonly sign: \"leo\";\n    readonly address: \"567 Oak Street Austin, TX 78701\";\n}, {\n    readonly id: \"13\";\n    readonly name: \"Mia\";\n    readonly phone: \"333-444-5555\";\n    readonly notes: \"art lover\";\n    readonly email: \"mia@testmail.co\";\n    readonly sign: \"libra\";\n    readonly address: \"123 Pine Lane Portland, OR 97201\";\n}, {\n    readonly id: \"14\";\n    readonly name: \"Noah\";\n    readonly phone: \"888-999-0000\";\n    readonly notes: \"pet lover\";\n    readonly email: \"noah@examplemail.com\";\n    readonly sign: \"virgo\";\n    readonly address: \"234 Cedar Street Phoenix, AZ 85001\";\n}, {\n    readonly id: \"15\";\n    readonly name: \"Olivia\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"bookworm\";\n    readonly email: \"olivia@testmail.co\";\n    readonly sign: \"taurus\";\n    readonly address: \"567 Maple Lane Nashville, TN 37201\";\n}, {\n    readonly id: \"16\";\n    readonly name: \"Patrick\";\n    readonly phone: \"333-444-5555\";\n    readonly notes: \"nature lover\";\n    readonly email: \"patrick@example.com\";\n    readonly sign: \"aquarius\";\n    readonly address: \"789 Elm Avenue Atlanta, GA 30301\";\n}, {\n    readonly id: \"17\";\n    readonly name: \"Quinn\";\n    readonly phone: \"666-777-8888\";\n    readonly notes: \"fitness enthusiast\";\n    readonly email: \"quinn@testmail.co\";\n    readonly sign: \"sagittarius\";\n    readonly address: \"234 Oak Lane Minneapolis, MN 55401\";\n}, {\n    readonly id: \"18\";\n    readonly name: \"Ryan\";\n    readonly phone: \"111-222-3333\";\n    readonly notes: \"movie buff\";\n    readonly email: \"ryan@examplemail.com\";\n    readonly sign: \"capricorn\";\n    readonly address: \"567 Pine Street Houston, TX 77001\";\n}, {\n    readonly id: \"19\";\n    readonly name: \"Sophia\";\n    readonly phone: \"777-888-9999\";\n    readonly notes: \"gamer\";\n    readonly email: \"sophia@testmail.co\";\n    readonly sign: \"pisces\";\n    readonly address: \"789 Cedar Lane Philadelphia, PA 19019\";\n}, {\n    readonly id: \"20\";\n    readonly name: \"Thomas\";\n    readonly phone: \"222-333-4444\";\n    readonly notes: \"cooking enthusiast\";\n    readonly email: \"thomas@example.com\";\n    readonly sign: \"aries\";\n    readonly address: \"123 Birch Avenue Detroit, MI 48201\";\n}, {\n    readonly id: \"21\";\n    readonly name: \"Uma\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"yoga lover\";\n    readonly email: \"uma@testmail.co\";\n    readonly sign: \"gemini\";\n    readonly address: \"789 Elm Street Austin, TX 78701\";\n}, {\n    readonly id: \"22\";\n    readonly name: \"Victor\";\n    readonly phone: \"333-444-5555\";\n    readonly notes: \"skateboarding enthusiast\";\n    readonly email: \"victor@example.com\";\n    readonly sign: \"leo\";\n    readonly address: \"234 Pine Lane Denver, CO 80201\";\n}, {\n    readonly id: \"23\";\n    readonly name: \"Wendy\";\n    readonly phone: \"888-999-0000\";\n    readonly notes: \"animal rights activist\";\n    readonly email: \"wendy@testmail.co\";\n    readonly sign: \"libra\";\n    readonly address: \"567 Oak Avenue San Francisco, CA 94101\";\n}, {\n    readonly id: \"24\";\n    readonly name: \"Xavier\";\n    readonly phone: \"777-888-9999\";\n    readonly notes: \"guitar player\";\n    readonly email: \"xavier@examplemail.com\";\n    readonly sign: \"virgo\";\n    readonly address: \"234 Birch Lane Seattle, WA 98101\";\n}, {\n    readonly id: \"25\";\n    readonly name: \"Yarn\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"hiking enthusiast\";\n    readonly email: \"yara@testmail.co\";\n    readonly sign: \"taurus\";\n    readonly address: \"789 Cedar Street Portland, OR 97201\";\n}, {\n    readonly id: \"26\";\n    readonly name: \"Zane\";\n    readonly phone: \"111-222-3333\";\n    readonly notes: \"movie critic\";\n    readonly email: \"zane@example.com\";\n    readonly sign: \"aquarius\";\n    readonly address: \"123 Maple Lane Los Angeles, CA 90001\";\n}, {\n    readonly id: \"27\";\n    readonly name: \"Ava\";\n    readonly phone: \"777-888-9999\";\n    readonly notes: \"dance enthusiast\";\n    readonly email: \"ava@testmail.co\";\n    readonly sign: \"sagittarius\";\n    readonly address: \"567 Pine Avenue Chicago, IL 60601\";\n}, {\n    readonly id: \"28\";\n    readonly name: \"Benjamin\";\n    readonly phone: \"222-333-4444\";\n    readonly notes: \"soccer player\";\n    readonly email: \"benjamin@examplemail.com\";\n    readonly sign: \"capricorn\";\n    readonly address: \"789 Oak Street Miami, FL 33101\";\n}, {\n    readonly id: \"29\";\n    readonly name: \"Chloe\";\n    readonly phone: \"888-999-0000\";\n    readonly notes: \"painter\";\n    readonly email: \"chloe@testmail.co\";\n    readonly sign: \"pisces\";\n    readonly address: \"234 Elm Lane Houston, TX 77001\";\n}, {\n    readonly id: \"30\";\n    readonly name: \"Daniel\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"technology blogger\";\n    readonly email: \"daniel@example.com\";\n    readonly sign: \"aries\";\n    readonly address: \"789 Birch Avenue Philadelphia, PA 19019\";\n}, {\n    readonly id: \"31\";\n    readonly name: \"Ella\";\n    readonly phone: \"333-444-5555\";\n    readonly notes: \"book lover\";\n    readonly email: \"ella@testmail.co\";\n    readonly sign: \"gemini\";\n    readonly address: \"123 Oak Street Detroit, MI 48201\";\n}, {\n    readonly id: \"32\";\n    readonly name: \"Finn\";\n    readonly phone: \"777-888-9999\";\n    readonly notes: \"avid traveler\";\n    readonly email: \"finn@examplemail.com\";\n    readonly sign: \"leo\";\n    readonly address: \"567 Pine Lane Austin, TX 78701\";\n}, {\n    readonly id: \"33\";\n    readonly name: \"Grace\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"gamer\";\n    readonly email: \"grace@testmail.co\";\n    readonly sign: \"libra\";\n    readonly address: \"789 Elm Avenue Denver, CO 80201\";\n}, {\n    readonly id: \"34\";\n    readonly name: \"Henry\";\n    readonly phone: \"888-999-0000\";\n    readonly notes: \"nature lover\";\n    readonly email: \"henry@example.com\";\n    readonly sign: \"virgo\";\n    readonly address: \"234 Birch Lane San Francisco, CA 94101\";\n}, {\n    readonly id: \"35\";\n    readonly name: \"Isaac\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"science enthusiast\";\n    readonly email: \"isaac@testmail.co\";\n    readonly sign: \"taurus\";\n    readonly address: \"789 Cedar Street Portland, OR 97201\";\n}, {\n    readonly id: \"36\";\n    readonly name: \"Julia\";\n    readonly phone: \"333-444-5555\";\n    readonly notes: \"musician\";\n    readonly email: \"julia@examplemail.com\";\n    readonly sign: \"aquarius\";\n    readonly address: \"123 Oak Lane Los Angeles, CA 90001\";\n}, {\n    readonly id: \"37\";\n    readonly name: \"Kevin\";\n    readonly phone: \"777-888-9999\";\n    readonly notes: \"foodie\";\n    readonly email: \"kevin@testmail.co\";\n    readonly sign: \"sagittarius\";\n    readonly address: \"567 Pine Avenue Chicago, IL 60601\";\n}, {\n    readonly id: \"38\";\n    readonly name: \"Lily\";\n    readonly phone: \"222-333-4444\";\n    readonly notes: \"photographer\";\n    readonly email: \"lily@example.com\";\n    readonly sign: \"capricorn\";\n    readonly address: \"789 Oak Street Miami, FL 33101\";\n}, {\n    readonly id: \"39\";\n    readonly name: \"Mason\";\n    readonly phone: \"888-999-0000\";\n    readonly notes: \"soccer player\";\n    readonly email: \"mason@testmail.co\";\n    readonly sign: \"pisces\";\n    readonly address: \"234 Elm Lane Houston, TX 77001\";\n}, {\n    readonly id: \"40\";\n    readonly name: \"Nora\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"animal lover\";\n    readonly email: \"nora@examplemail.com\";\n    readonly sign: \"aries\";\n    readonly address: \"789 Birch Avenue Philadelphia, PA 19019\";\n}, {\n    readonly id: \"41\";\n    readonly name: \"Oliver\";\n    readonly phone: \"333-444-5555\";\n    readonly notes: \"chess player\";\n    readonly email: \"oliver@testmail.co\";\n    readonly sign: \"gemini\";\n    readonly address: \"123 Oak Lane Denver, CO 80201\";\n}, {\n    readonly id: \"42\";\n    readonly name: \"Penelope\";\n    readonly phone: \"777-888-9999\";\n    readonly notes: \"gardening lover\";\n    readonly email: \"penelope@example.com\";\n    readonly sign: \"leo\";\n    readonly address: \"567 Pine Street San Francisco, CA 94101\";\n}, {\n    readonly id: \"43\";\n    readonly name: \"Quentin\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"film buff\";\n    readonly email: \"quentin@testmail.co\";\n    readonly sign: \"libra\";\n    readonly address: \"789 Elm Avenue Seattle, WA 98101\";\n}, {\n    readonly id: \"44\";\n    readonly name: \"Ruby\";\n    readonly phone: \"888-999-0000\";\n    readonly notes: \"music lover\";\n    readonly email: \"ruby@examplemail.com\";\n    readonly sign: \"virgo\";\n    readonly address: \"234 Birch Lane Los Angeles, CA 90001\";\n}, {\n    readonly id: \"45\";\n    readonly name: \"Samuel\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"fitness enthusiast\";\n    readonly email: \"samuel@testmail.co\";\n    readonly sign: \"taurus\";\n    readonly address: \"789 Cedar Street Portland, OR 97201\";\n}, {\n    readonly id: \"46\";\n    readonly name: \"Tessa\";\n    readonly phone: \"333-444-5555\";\n    readonly notes: \"book lover\";\n    readonly email: \"tessa@examplemail.com\";\n    readonly sign: \"aquarius\";\n    readonly address: \"123 Oak Lane Austin, TX 78701\";\n}, {\n    readonly id: \"47\";\n    readonly name: \"Uriah\";\n    readonly phone: \"777-888-9999\";\n    readonly notes: \"basketball player\";\n    readonly email: \"uriah@testmail.co\";\n    readonly sign: \"sagittarius\";\n    readonly address: \"567 Pine Avenue Denver, CO 80201\";\n}, {\n    readonly id: \"48\";\n    readonly name: \"Valentino\";\n    readonly phone: \"222-333-4444\";\n    readonly notes: \"art enthusiast\";\n    readonly email: \"valentina@example.com\";\n    readonly sign: \"capricorn\";\n    readonly address: \"789 Oak Street San Francisco, CA 94101\";\n}, {\n    readonly id: \"49\";\n    readonly name: \"William\";\n    readonly phone: \"888-999-0000\";\n    readonly notes: \"animal lover\";\n    readonly email: \"william@testmail.co\";\n    readonly sign: \"pisces\";\n    readonly address: \"234 Elm Lane Seattle, WA 98101\";\n}, {\n    readonly id: \"50\";\n    readonly name: \"Xenia\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"travel enthusiast\";\n    readonly email: \"xena@examplemail.com\";\n    readonly sign: \"aries\";\n    readonly address: \"789 Birch Avenue Portland, OR 97201\";\n}, {\n    readonly id: \"51\";\n    readonly name: \"Yanina\";\n    readonly phone: \"333-444-5555\";\n    readonly notes: \"swimming enthusiast\";\n    readonly email: \"yannis@testmail.co\";\n    readonly sign: \"gemini\";\n    readonly address: \"123 Oak Lane Los Angeles, CA 90001\";\n}, {\n    readonly id: \"52\";\n    readonly name: \"Zara\";\n    readonly phone: \"777-888-9999\";\n    readonly notes: \"foodie\";\n    readonly email: \"zara@example.com\";\n    readonly sign: \"leo\";\n    readonly address: \"567 Pine Street Chicago, IL 60601\";\n}, {\n    readonly id: \"53\";\n    readonly name: \"Aaron\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"video game developer\";\n    readonly email: \"aaron@testmail.co\";\n    readonly sign: \"libra\";\n    readonly address: \"789 Elm Avenue Miami, FL 33101\";\n}, {\n    readonly id: \"54\";\n    readonly name: \"Bella\";\n    readonly phone: \"888-999-0000\";\n    readonly notes: \"nature lover\";\n    readonly email: \"bella@examplemail.com\";\n    readonly sign: \"virgo\";\n    readonly address: \"234 Birch Lane Houston, TX 77001\";\n}, {\n    readonly id: \"55\";\n    readonly name: \"Caleb\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"science geek\";\n    readonly email: \"caleb@testmail.co\";\n    readonly sign: \"taurus\";\n    readonly address: \"789 Cedar Street Philadelphia, PA 19019\";\n}, {\n    readonly id: \"56\";\n    readonly name: \"Daisy\";\n    readonly phone: \"333-444-5555\";\n    readonly notes: \"musician\";\n    readonly email: \"daisy@example.com\";\n    readonly sign: \"aquarius\";\n    readonly address: \"123 Oak Lane Austin, TX 78701\";\n}, {\n    readonly id: \"57\";\n    readonly name: \"Ethan\";\n    readonly phone: \"777-888-9999\";\n    readonly notes: \"soccer player\";\n    readonly email: \"ethan@testmail.co\";\n    readonly sign: \"sagittarius\";\n    readonly address: \"567 Pine Avenue Denver, CO 80201\";\n}, {\n    readonly id: \"58\";\n    readonly name: \"Fiona\";\n    readonly phone: \"222-333-4444\";\n    readonly notes: \"bookworm\";\n    readonly email: \"fiona@examplemail.com\";\n    readonly sign: \"capricorn\";\n    readonly address: \"789 Oak Street San Francisco, CA 94101\";\n}, {\n    readonly id: \"59\";\n    readonly name: \"Gavin\";\n    readonly phone: \"888-999-0000\";\n    readonly notes: \"gamer\";\n    readonly email: \"gavin@testmail.co\";\n    readonly sign: \"pisces\";\n    readonly address: \"234 Elm Lane Seattle, WA 98101\";\n}, {\n    readonly id: \"60\";\n    readonly name: \"Hannah\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"yoga lover\";\n    readonly email: \"hannah@examplemail.com\";\n    readonly sign: \"aries\";\n    readonly address: \"789 Birch Avenue Portland, OR 97201\";\n}, {\n    readonly id: \"61\";\n    readonly name: \"Ian\";\n    readonly phone: \"333-444-5555\";\n    readonly notes: \"painter\";\n    readonly email: \"ian@testmail.co\";\n    readonly sign: \"gemini\";\n    readonly address: \"123 Oak Lane Los Angeles, CA 90001\";\n}, {\n    readonly id: \"62\";\n    readonly name: \"Jasmine\";\n    readonly phone: \"777-888-9999\";\n    readonly notes: \"photographer\";\n    readonly email: \"jasmine@example.com\";\n    readonly sign: \"leo\";\n    readonly address: \"567 Pine Street Chicago, IL 60601\";\n}, {\n    readonly id: \"63\";\n    readonly name: \"Kevin\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"film enthusiast\";\n    readonly email: \"kevin@testmail.co\";\n    readonly sign: \"libra\";\n    readonly address: \"789 Elm Avenue Miami, FL 33101\";\n}, {\n    readonly id: \"64\";\n    readonly name: \"Luna\";\n    readonly phone: \"888-999-0000\";\n    readonly notes: \"astronomy lover\";\n    readonly email: \"luna@examplemail.com\";\n    readonly sign: \"virgo\";\n    readonly address: \"234 Birch Lane Houston, TX 77001\";\n}, {\n    readonly id: \"65\";\n    readonly name: \"Milo\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"travel enthusiast\";\n    readonly email: \"milo@testmail.co\";\n    readonly sign: \"taurus\";\n    readonly address: \"789 Cedar Street Philadelphia, PA 19019\";\n}, {\n    readonly id: \"66\";\n    readonly name: \"Nina\";\n    readonly phone: \"333-444-5555\";\n    readonly notes: \"dancer\";\n    readonly email: \"nina@example.com\";\n    readonly sign: \"aquarius\";\n    readonly address: \"123 Oak Lane Austin, TX 78701\";\n}, {\n    readonly id: \"67\";\n    readonly name: \"Owen\";\n    readonly phone: \"777-888-9999\";\n    readonly notes: \"soccer player\";\n    readonly email: \"owen@testmail.co\";\n    readonly sign: \"sagittarius\";\n    readonly address: \"567 Pine Avenue Denver, CO 80201\";\n}, {\n    readonly id: \"68\";\n    readonly name: \"Piper\";\n    readonly phone: \"222-333-4444\";\n    readonly notes: \"gamer\";\n    readonly email: \"piper@examplemail.com\";\n    readonly sign: \"capricorn\";\n    readonly address: \"789 Oak Street San Francisco, CA 94101\";\n}, {\n    readonly id: \"69\";\n    readonly name: \"Quincy\";\n    readonly phone: \"888-999-0000\";\n    readonly notes: \"music lover\";\n    readonly email: \"quincy@testmail.co\";\n    readonly sign: \"pisces\";\n    readonly address: \"234 Elm Lane Seattle, WA 98101\";\n}, {\n    readonly id: \"70\";\n    readonly name: \"Riley\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"athlete\";\n    readonly email: \"riley@examplemail.com\";\n    readonly sign: \"aries\";\n    readonly address: \"789 Birch Avenue Portland, OR 97201\";\n}, {\n    readonly id: \"71\";\n    readonly name: \"Sophie\";\n    readonly phone: \"333-444-5555\";\n    readonly notes: \"animal lover\";\n    readonly email: \"sophie@example.com\";\n    readonly sign: \"gemini\";\n    readonly address: \"123 Oak Lane Los Angeles, CA 90001\";\n}, {\n    readonly id: \"72\";\n    readonly name: \"Thea\";\n    readonly phone: \"777-888-9999\";\n    readonly notes: \"video game developer\";\n    readonly email: \"theo@testmail.co\";\n    readonly sign: \"leo\";\n    readonly address: \"567 Pine Street Chicago, IL 60601\";\n}, {\n    readonly id: \"73\";\n    readonly name: \"Violet\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"nature lover\";\n    readonly email: \"violet@example.com\";\n    readonly sign: \"libra\";\n    readonly address: \"789 Elm Avenue Miami, FL 33101\";\n}, {\n    readonly id: \"74\";\n    readonly name: \"Wyatt\";\n    readonly phone: \"888-999-0000\";\n    readonly notes: \"outdoor enthusiast\";\n    readonly email: \"wyatt@examplemail.com\";\n    readonly sign: \"virgo\";\n    readonly address: \"234 Birch Lane Houston, TX 77001\";\n}, {\n    readonly id: \"75\";\n    readonly name: \"Xavier\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"musician\";\n    readonly email: \"xavier@testmail.co\";\n    readonly sign: \"taurus\";\n    readonly address: \"789 Cedar Street Philadelphia, PA 19019\";\n}, {\n    readonly id: \"76\";\n    readonly name: \"Cara\";\n    readonly phone: \"333-444-5555\";\n    readonly notes: \"foodie\";\n    readonly email: \"yara@example.com\";\n    readonly sign: \"aquarius\";\n    readonly address: \"123 Oak Lane Austin, TX 78701\";\n}, {\n    readonly id: \"77\";\n    readonly name: \"Zane\";\n    readonly phone: \"777-888-9999\";\n    readonly notes: \"technology enthusiast\";\n    readonly email: \"zane@testmail.co\";\n    readonly sign: \"sagittarius\";\n    readonly address: \"567 Pine Avenue Denver, CO 80201\";\n}, {\n    readonly id: \"78\";\n    readonly name: \"Abigail\";\n    readonly phone: \"222-333-4444\";\n    readonly notes: \"bookworm\";\n    readonly email: \"abigail@examplemail.com\";\n    readonly sign: \"capricorn\";\n    readonly address: \"789 Oak Street San Francisco, CA 94101\";\n}, {\n    readonly id: \"79\";\n    readonly name: \"Bentley\";\n    readonly phone: \"888-999-0000\";\n    readonly notes: \"dog lover\";\n    readonly email: \"bentley@testmail.co\";\n    readonly sign: \"pisces\";\n    readonly address: \"234 Elm Lane Seattle, WA 98101\";\n}, {\n    readonly id: \"80\";\n    readonly name: \"Charlotte\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"art enthusiast\";\n    readonly email: \"charlotte@example.com\";\n    readonly sign: \"aries\";\n    readonly address: \"789 Birch Avenue Portland, OR 97201\";\n}, {\n    readonly id: \"81\";\n    readonly name: \"Dylan\";\n    readonly phone: \"333-444-5555\";\n    readonly notes: \"music producer\";\n    readonly email: \"dylan@testmail.co\";\n    readonly sign: \"gemini\";\n    readonly address: \"123 Oak Lane Los Angeles, CA 90001\";\n}, {\n    readonly id: \"82\";\n    readonly name: \"Eva\";\n    readonly phone: \"777-888-9999\";\n    readonly notes: \"photographer\";\n    readonly email: \"eva@example.com\";\n    readonly sign: \"leo\";\n    readonly address: \"567 Pine Street Chicago, IL 60601\";\n}, {\n    readonly id: \"83\";\n    readonly name: \"Finn\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"coffee lover\";\n    readonly email: \"finn@testmail.co\";\n    readonly sign: \"libra\";\n    readonly address: \"789 Elm Avenue Miami, FL 33101\";\n}, {\n    readonly id: \"84\";\n    readonly name: \"Grace\";\n    readonly phone: \"888-999-0000\";\n    readonly notes: \"nature lover\";\n    readonly email: \"grace@examplemail.com\";\n    readonly sign: \"virgo\";\n    readonly address: \"234 Birch Lane Houston, TX 77001\";\n}, {\n    readonly id: \"85\";\n    readonly name: \"Henry\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"travel enthusiast\";\n    readonly email: \"henry@testmail.co\";\n    readonly sign: \"taurus\";\n    readonly address: \"789 Cedar Street Philadelphia, PA 19019\";\n}, {\n    readonly id: \"86\";\n    readonly name: \"Isabella\";\n    readonly phone: \"333-444-5555\";\n    readonly notes: \"foodie\";\n    readonly email: \"isabella@example.com\";\n    readonly sign: \"aquarius\";\n    readonly address: \"123 Oak Lane Austin, TX 78701\";\n}, {\n    readonly id: \"87\";\n    readonly name: \"Jack\";\n    readonly phone: \"777-888-9999\";\n    readonly notes: \"hiking enthusiast\";\n    readonly email: \"jack@testmail.co\";\n    readonly sign: \"sagittarius\";\n    readonly address: \"567 Pine Avenue Denver, CO 80201\";\n}, {\n    readonly id: \"88\";\n    readonly name: \"Katherine\";\n    readonly phone: \"222-333-4444\";\n    readonly notes: \"art lover\";\n    readonly email: \"katherine@examplemail.com\";\n    readonly sign: \"capricorn\";\n    readonly address: \"789 Oak Street San Francisco, CA 94101\";\n}, {\n    readonly id: \"89\";\n    readonly name: \"Liam\";\n    readonly phone: \"888-999-0000\";\n    readonly notes: \"animal lover\";\n    readonly email: \"liam@testmail.co\";\n    readonly sign: \"pisces\";\n    readonly address: \"234 Elm Lane Seattle, WA 98101\";\n}, {\n    readonly id: \"90\";\n    readonly name: \"Mia\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"bookworm\";\n    readonly email: \"mia@example.com\";\n    readonly sign: \"aries\";\n    readonly address: \"789 Birch Avenue Portland, OR 97201\";\n}, {\n    readonly id: \"91\";\n    readonly name: \"Noah\";\n    readonly phone: \"333-444-5555\";\n    readonly notes: \"gamer\";\n    readonly email: \"noah@examplemail.com\";\n    readonly sign: \"gemini\";\n    readonly address: \"123 Oak Lane Los Angeles, CA 90001\";\n}, {\n    readonly id: \"92\";\n    readonly name: \"Olivia\";\n    readonly phone: \"777-888-9999\";\n    readonly notes: \"technology enthusiast\";\n    readonly email: \"olivia@testmail.co\";\n    readonly sign: \"leo\";\n    readonly address: \"567 Pine Street Chicago, IL 60601\";\n}, {\n    readonly id: \"93\";\n    readonly name: \"Patrick\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"sports enthusiast\";\n    readonly email: \"patrick@example.com\";\n    readonly sign: \"libra\";\n    readonly address: \"789 Elm Avenue Miami, FL 33101\";\n}, {\n    readonly id: \"94\";\n    readonly name: \"Quinn\";\n    readonly phone: \"888-999-0000\";\n    readonly notes: \"nature lover\";\n    readonly email: \"quinn@examplemail.com\";\n    readonly sign: \"virgo\";\n    readonly address: \"234 Birch Lane Houston, TX 77001\";\n}, {\n    readonly id: \"95\";\n    readonly name: \"Ryan\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"musician\";\n    readonly email: \"ryan@testmail.co\";\n    readonly sign: \"taurus\";\n    readonly address: \"789 Cedar Street Philadelphia, PA 19019\";\n}, {\n    readonly id: \"96\";\n    readonly name: \"Sophia\";\n    readonly phone: \"333-444-5555\";\n    readonly notes: \"foodie\";\n    readonly email: \"sophia@example.com\";\n    readonly sign: \"aquarius\";\n    readonly address: \"123 Oak Lane Austin, TX 78701\";\n}, {\n    readonly id: \"97\";\n    readonly name: \"Thomas\";\n    readonly phone: \"777-888-9999\";\n    readonly notes: \"hiking enthusiast\";\n    readonly email: \"thomas@testmail.co\";\n    readonly sign: \"sagittarius\";\n    readonly address: \"567 Pine Avenue Denver, CO 80201\";\n}, {\n    readonly id: \"98\";\n    readonly name: \"Uma\";\n    readonly phone: \"222-333-4444\";\n    readonly notes: \"art lover\";\n    readonly email: \"uma@examplemail.com\";\n    readonly sign: \"capricorn\";\n    readonly address: \"789 Oak Street San Francisco, CA 94101\";\n}, {\n    readonly id: \"99\";\n    readonly name: \"Victor\";\n    readonly phone: \"888-999-0000\";\n    readonly notes: \"animal lover\";\n    readonly email: \"victor@testmail.co\";\n    readonly sign: \"pisces\";\n    readonly address: \"234 Elm Lane Seattle, WA 98101\";\n}, {\n    readonly id: \"100\";\n    readonly name: \"Wendy\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"bookworm\";\n    readonly email: \"wendy@example.com\";\n    readonly sign: \"aries\";\n    readonly address: \"789 Birch Avenue Portland, OR 97201\";\n}, {\n    readonly id: \"101\";\n    readonly name: \"Bander\";\n    readonly phone: \"333-444-5555\";\n    readonly notes: \"chess player\";\n    readonly email: \"xander@testmail.co\";\n    readonly sign: \"gemini\";\n    readonly address: \"123 Oak Lane Los Angeles, CA 90001\";\n}, {\n    readonly id: \"102\";\n    readonly name: \"Jasmine\";\n    readonly phone: \"777-888-9999\";\n    readonly notes: \"gardening enthusiast\";\n    readonly email: \"yasmine@example.com\";\n    readonly sign: \"leo\";\n    readonly address: \"567 Pine Street Chicago, IL 60601\";\n}, {\n    readonly id: \"103\";\n    readonly name: \"Zara\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"film buff\";\n    readonly email: \"zara@testmail.co\";\n    readonly sign: \"libra\";\n    readonly address: \"789 Elm Avenue Miami, FL 33101\";\n}, {\n    readonly id: \"104\";\n    readonly name: \"Alex\";\n    readonly phone: \"888-999-0000\";\n    readonly notes: \"music lover\";\n    readonly email: \"alex@examplemail.com\";\n    readonly sign: \"virgo\";\n    readonly address: \"234 Birch Lane Houston, TX 77001\";\n}, {\n    readonly id: \"105\";\n    readonly name: \"Bianca\";\n    readonly phone: \"555-666-7777\";\n    readonly notes: \"travel enthusiast\";\n    readonly email: \"bianca@example.com\";\n    readonly sign: \"taurus\";\n    readonly address: \"789 Cedar Street Philadelphia, PA 19019\";\n}, {\n    readonly id: \"106\";\n    readonly name: \"Cameron\";\n    readonly phone: \"333-444-5555\";\n    readonly notes: \"book lover\";\n    readonly email: \"cameron@examplemail.com\";\n    readonly sign: \"aquarius\";\n    readonly address: \"123 Oak Lane Austin, TX 78701\";\n}, {\n    readonly id: \"107\";\n    readonly name: \"Diana\";\n    readonly phone: \"777-888-9999\";\n    readonly notes: \"basketball player\";\n    readonly email: \"diana@testmail.co\";\n    readonly sign: \"sagittarius\";\n    readonly address: \"567 Pine Avenue Denver, CO 80201\";\n}, {\n    readonly id: \"108\";\n    readonly name: \"John\";\n    readonly phone: \"555-123-4567\";\n    readonly notes: \"Software Engineer\";\n    readonly email: \"john@example.com\";\n    readonly sign: \"Aries\";\n    readonly address: \"123 Oak Street, San Francisco, CA 94101\";\n}, {\n    readonly id: \"109\";\n    readonly name: \"Alice\";\n    readonly phone: \"999-555-1212\";\n    readonly notes: \"Teacher\";\n    readonly email: \"alice@testmail.co\";\n    readonly sign: \"Leo\";\n    readonly address: \"456 Elm Road, New York, NY 10001\";\n}, {\n    readonly id: \"110\";\n    readonly name: \"David\";\n    readonly phone: \"777-333-9999\";\n    readonly notes: \"Doctor\";\n    readonly email: \"david@example.com\";\n    readonly sign: \"Scorpio\";\n    readonly address: \"789 Maple Avenue, Los Angeles, CA 90001\";\n}, {\n    readonly id: \"111\";\n    readonly name: \"Emma\";\n    readonly phone: \"888-777-5555\";\n    readonly notes: \"Graphic Designer\";\n    readonly email: \"emma@testmail.co\";\n    readonly sign: \"Gemini\";\n    readonly address: \"321 Birch Street, Chicago, IL 60601\";\n}, {\n    readonly id: \"112\";\n    readonly name: \"Daniel\";\n    readonly phone: \"444-666-2222\";\n    readonly notes: \"Lawyer\";\n    readonly email: \"daniel@example.com\";\n    readonly sign: \"Taurus\";\n    readonly address: \"567 Pine Avenue, Denver, CO 80201\";\n}, {\n    readonly id: \"113\";\n    readonly name: \"Sophie\";\n    readonly phone: \"666-999-1111\";\n    readonly notes: \"Chef\";\n    readonly email: \"sophie@testmail.co\";\n    readonly sign: \"Capricorn\";\n    readonly address: \"890 Cedar Road, Miami, FL 33101\";\n}, {\n    readonly id: \"114\";\n    readonly name: \"William\";\n    readonly phone: \"111-444-7777\";\n    readonly notes: \"Architect\";\n    readonly email: \"william@example.com\";\n    readonly sign: \"Sagittarius\";\n    readonly address: \"123 Elm Street, Seattle, WA 98101\";\n}, {\n    readonly id: \"115\";\n    readonly name: \"Olivia\";\n    readonly phone: \"222-888-9999\";\n    readonly notes: \"Nurse\";\n    readonly email: \"olivia@testmail.co\";\n    readonly sign: \"Pisces\";\n    readonly address: \"456 Oak Lane, San Francisco, CA 94101\";\n}, {\n    readonly id: \"116\";\n    readonly name: \"James\";\n    readonly phone: \"555-777-2222\";\n    readonly notes: \"Police Officer\";\n    readonly email: \"james@example.com\";\n    readonly sign: \"Virgo\";\n    readonly address: \"789 Birch Road, New York, NY 10001\";\n}, {\n    readonly id: \"117\";\n    readonly name: \"Ava\";\n    readonly phone: \"111-555-6666\";\n    readonly notes: \"Dentist\";\n    readonly email: \"ava@testmail.co\";\n    readonly sign: \"Cancer\";\n    readonly address: \"890 Oak Street, Los Angeles, CA 90001\";\n}, {\n    readonly id: \"118\";\n    readonly name: \"Liam\";\n    readonly phone: \"777-555-8888\";\n    readonly notes: \"Teacher\";\n    readonly email: \"liam@example.com\";\n    readonly sign: \"Libra\";\n    readonly address: \"123 Cedar Road, Chicago, IL 60601\";\n}, {\n    readonly id: \"119\";\n    readonly name: \"Mia\";\n    readonly phone: \"333-666-1111\";\n    readonly notes: \"Software Developer\";\n    readonly email: \"mia@testmail.co\";\n    readonly sign: \"Leo\";\n    readonly address: \"456 Pine Avenue, Denver, CO 80201\";\n}, {\n    readonly id: \"120\";\n    readonly name: \"Benjamin\";\n    readonly phone: \"999-777-5555\";\n    readonly notes: \"Engineer\";\n    readonly email: \"benjamin@example.com\";\n    readonly sign: \"Scorpio\";\n    readonly address: \"567 Elm Lane, Miami, FL 33101\";\n}, {\n    readonly id: \"121\";\n    readonly name: \"Isabella\";\n    readonly phone: \"888-111-4444\";\n    readonly notes: \"Artist\";\n    readonly email: \"isabella@testmail.co\";\n    readonly sign: \"Gemini\";\n    readonly address: \"321 Cedar Avenue, Seattle, WA 98101\";\n}, {\n    readonly id: \"122\";\n    readonly name: \"Eva\";\n    readonly phone: \"444-666-8888\";\n    readonly notes: \"Accountant\";\n    readonly email: \"eva@example.com\";\n    readonly sign: \"Virgo\";\n    readonly address: \"567 Birch Lane, Houston, TX 77001\";\n}, {\n    readonly id: \"123\";\n    readonly name: \"Oliver\";\n    readonly phone: \"333-999-7777\";\n    readonly notes: \"Writer\";\n    readonly email: \"oliver@testmail.co\";\n    readonly sign: \"Cancer\";\n    readonly address: \"890 Cedar Road, Miami, FL 33101\";\n}, {\n    readonly id: \"124\";\n    readonly name: \"Sophia\";\n    readonly phone: \"777-888-2222\";\n    readonly notes: \"Dentist\";\n    readonly email: \"sophia@example.com\";\n    readonly sign: \"Libra\";\n    readonly address: \"123 Elm Street, Seattle, WA 98101\";\n}, {\n    readonly id: \"125\";\n    readonly name: \"Liam\";\n    readonly phone: \"555-123-4567\";\n    readonly notes: \"Software Engineer\";\n    readonly email: \"liam@example.com\";\n    readonly sign: \"Aries\";\n    readonly address: \"123 Oak Street, San Francisco, CA 94101\";\n}, {\n    readonly id: \"126\";\n    readonly name: \"Olivia\";\n    readonly phone: \"999-555-1212\";\n    readonly notes: \"Teacher\";\n    readonly email: \"olivia@testmail.co\";\n    readonly sign: \"Leo\";\n    readonly address: \"456 Elm Road, New York, NY 10001\";\n}, {\n    readonly id: \"127\";\n    readonly name: \"Noah\";\n    readonly phone: \"777-333-9999\";\n    readonly notes: \"Doctor\";\n    readonly email: \"noah@example.com\";\n    readonly sign: \"Scorpio\";\n    readonly address: \"789 Maple Avenue, Los Angeles, CA 90001\";\n}, {\n    readonly id: \"128\";\n    readonly name: \"Sophia\";\n    readonly phone: \"888-777-5555\";\n    readonly notes: \"Graphic Designer\";\n    readonly email: \"sophia@testmail.co\";\n    readonly sign: \"Gemini\";\n    readonly address: \"321 Birch Street, Chicago, IL 60601\";\n}, {\n    readonly id: \"129\";\n    readonly name: \"William\";\n    readonly phone: \"444-666-2222\";\n    readonly notes: \"Lawyer\";\n    readonly email: \"william@example.com\";\n    readonly sign: \"Taurus\";\n    readonly address: \"567 Pine Avenue, Denver, CO 80201\";\n}, {\n    readonly id: \"130\";\n    readonly name: \"Olivia\";\n    readonly phone: \"666-999-1111\";\n    readonly notes: \"Chef\";\n    readonly email: \"olivia@testmail.co\";\n    readonly sign: \"Capricorn\";\n    readonly address: \"890 Cedar Road, Miami, FL 33101\";\n}, {\n    readonly id: \"131\";\n    readonly name: \"James\";\n    readonly phone: \"111-444-7777\";\n    readonly notes: \"Architect\";\n    readonly email: \"james@example.com\";\n    readonly sign: \"Sagittarius\";\n    readonly address: \"123 Elm Street, Seattle, WA 98101\";\n}, {\n    readonly id: \"132\";\n    readonly name: \"Emma\";\n    readonly phone: \"222-888-9999\";\n    readonly notes: \"Nurse\";\n    readonly email: \"emma@testmail.co\";\n    readonly sign: \"Pisces\";\n    readonly address: \"456 Oak Lane, San Francisco, CA 94101\";\n}, {\n    readonly id: \"133\";\n    readonly name: \"Ava\";\n    readonly phone: \"555-777-2222\";\n    readonly notes: \"Police Officer\";\n    readonly email: \"ava@example.com\";\n    readonly sign: \"Virgo\";\n    readonly address: \"789 Birch Road, New York, NY 10001\";\n}, {\n    readonly id: \"134\";\n    readonly name: \"Benjamin\";\n    readonly phone: \"111-555-6666\";\n    readonly notes: \"Dentist\";\n    readonly email: \"benjamin@example.com\";\n    readonly sign: \"Cancer\";\n    readonly address: \"890 Oak Street, Los Angeles, CA 90001\";\n}, {\n    readonly id: \"135\";\n    readonly name: \"Sophia\";\n    readonly phone: \"777-555-8888\";\n    readonly notes: \"Teacher\";\n    readonly email: \"sophia@example.com\";\n    readonly sign: \"Libra\";\n    readonly address: \"123 Cedar Road, Chicago, IL 60601\";\n}, {\n    readonly id: \"136\";\n    readonly name: \"Mia\";\n    readonly phone: \"333-666-1111\";\n    readonly notes: \"Software Developer\";\n    readonly email: \"mia@testmail.co\";\n    readonly sign: \"Leo\";\n    readonly address: \"456 Pine Avenue, Denver, CO 80201\";\n}, {\n    readonly id: \"137\";\n    readonly name: \"Benjamin\";\n    readonly phone: \"999-777-5555\";\n    readonly notes: \"Engineer\";\n    readonly email: \"benjamin@example.com\";\n    readonly sign: \"Scorpio\";\n    readonly address: \"567 Elm Lane, Miami, FL 33101\";\n}, {\n    readonly id: \"138\";\n    readonly name: \"Isabella\";\n    readonly phone: \"888-111-4444\";\n    readonly notes: \"Artist\";\n    readonly email: \"isabella@testmail.co\";\n    readonly sign: \"Gemini\";\n    readonly address: \"321 Cedar Avenue, Seattle, WA 98101\";\n}, {\n    readonly id: \"139\";\n    readonly name: \"Eva\";\n    readonly phone: \"444-666-8888\";\n    readonly notes: \"Accountant\";\n    readonly email: \"eva@example.com\";\n    readonly sign: \"Virgo\";\n    readonly address: \"567 Birch Lane, Houston, TX 77001\";\n}, {\n    readonly id: \"140\";\n    readonly name: \"Oliver\";\n    readonly phone: \"333-999-7777\";\n    readonly notes: \"Writer\";\n    readonly email: \"oliver@testmail.co\";\n    readonly sign: \"Cancer\";\n    readonly address: \"890 Cedar Road, Miami, FL 33101\";\n}, {\n    readonly id: \"141\";\n    readonly name: \"Sophia\";\n    readonly phone: \"777-888-2222\";\n    readonly notes: \"Dentist\";\n    readonly email: \"sophia@example.com\";\n    readonly sign: \"Libra\";\n    readonly address: \"123 Elm Street, Seattle, WA 98101\";\n}, {\n    readonly id: \"142\";\n    readonly name: \"Liam\";\n    readonly phone: \"555-123-4567\";\n    readonly notes: \"Software Engineer\";\n    readonly email: \"liam@example.com\";\n    readonly sign: \"Aries\";\n    readonly address: \"123 Oak Street, San Francisco, CA 94101\";\n}, {\n    readonly id: \"143\";\n    readonly name: \"Olivia\";\n    readonly phone: \"999-555-1212\";\n    readonly notes: \"Teacher\";\n    readonly email: \"olivia@testmail.co\";\n    readonly sign: \"Leo\";\n    readonly address: \"456 Elm Road, New York, NY 10001\";\n}, {\n    readonly id: \"144\";\n    readonly name: \"Noah\";\n    readonly phone: \"777-333-9999\";\n    readonly notes: \"Doctor\";\n    readonly email: \"noah@example.com\";\n    readonly sign: \"Scorpio\";\n    readonly address: \"789 Maple Avenue, Los Angeles, CA 90001\";\n}, {\n    readonly id: \"145\";\n    readonly name: \"Sophia\";\n    readonly phone: \"888-777-5555\";\n    readonly notes: \"Graphic Designer\";\n    readonly email: \"sophia@testmail.co\";\n    readonly sign: \"Gemini\";\n    readonly address: \"321 Birch Street, Chicago, IL 60601\";\n}, {\n    readonly id: \"146\";\n    readonly name: \"William\";\n    readonly phone: \"444-666-2222\";\n    readonly notes: \"Lawyer\";\n    readonly email: \"william@example.com\";\n    readonly sign: \"Taurus\";\n    readonly address: \"567 Pine Avenue, Denver, CO 80201\";\n}, {\n    readonly id: \"147\";\n    readonly name: \"Olivia\";\n    readonly phone: \"666-999-1111\";\n    readonly notes: \"Chef\";\n    readonly email: \"olivia@testmail.co\";\n    readonly sign: \"Capricorn\";\n    readonly address: \"890 Cedar Road, Miami, FL 33101\";\n}, {\n    readonly id: \"148\";\n    readonly name: \"James\";\n    readonly phone: \"111-444-7777\";\n    readonly notes: \"Architect\";\n    readonly email: \"james@example.com\";\n    readonly sign: \"Sagittarius\";\n    readonly address: \"123 Elm Street, Seattle, WA 98101\";\n}, {\n    readonly id: \"149\";\n    readonly name: \"Emma\";\n    readonly phone: \"222-888-9999\";\n    readonly notes: \"Nurse\";\n    readonly email: \"emma@testmail.co\";\n    readonly sign: \"Pisces\";\n    readonly address: \"456 Oak Lane, San Francisco, CA 94101\";\n}, {\n    readonly id: \"150\";\n    readonly name: \"Ava\";\n    readonly phone: \"555-777-2222\";\n    readonly notes: \"Police Officer\";\n    readonly email: \"ava@example.com\";\n    readonly sign: \"Virgo\";\n    readonly address: \"789 Birch Road, New York, NY 10001\";\n}, {\n    readonly id: \"151\";\n    readonly name: \"Benjamin\";\n    readonly phone: \"111-555-6666\";\n    readonly notes: \"Dentist\";\n    readonly email: \"benjamin@example.com\";\n    readonly sign: \"Cancer\";\n    readonly address: \"890 Oak Street, Los Angeles, CA 90001\";\n}, {\n    readonly id: \"152\";\n    readonly name: \"Sophia\";\n    readonly phone: \"777-555-8888\";\n    readonly notes: \"Teacher\";\n    readonly email: \"sophia@example.com\";\n    readonly sign: \"Libra\";\n    readonly address: \"123 Cedar Road, Chicago, IL 60601\";\n}, {\n    readonly id: \"153\";\n    readonly name: \"Mia\";\n    readonly phone: \"333-666-1111\";\n    readonly notes: \"Software Developer\";\n    readonly email: \"mia@testmail.co\";\n    readonly sign: \"Leo\";\n    readonly address: \"456 Pine Avenue, Denver, CO 80201\";\n}, {\n    readonly id: \"154\";\n    readonly name: \"Benjamin\";\n    readonly phone: \"999-777-5555\";\n    readonly notes: \"Engineer\";\n    readonly email: \"benjamin@example.com\";\n    readonly sign: \"Scorpio\";\n    readonly address: \"567 Elm Lane, Miami, FL 33101\";\n}, {\n    readonly id: \"155\";\n    readonly name: \"Isabella\";\n    readonly phone: \"888-111-4444\";\n    readonly notes: \"Artist\";\n    readonly email: \"isabella@testmail.co\";\n    readonly sign: \"Gemini\";\n    readonly address: \"321 Cedar Avenue, Seattle, WA 98101\";\n}, {\n    readonly id: \"156\";\n    readonly name: \"Eva\";\n    readonly phone: \"444-666-8888\";\n    readonly notes: \"Accountant\";\n    readonly email: \"eva@example.com\";\n    readonly sign: \"Virgo\";\n    readonly address: \"567 Birch Lane, Houston, TX 77001\";\n}, {\n    readonly id: \"157\";\n    readonly name: \"Oliver\";\n    readonly phone: \"333-999-7777\";\n    readonly notes: \"Writer\";\n    readonly email: \"oliver@testmail.co\";\n    readonly sign: \"Cancer\";\n    readonly address: \"890 Cedar Road, Miami, FL 33101\";\n}, {\n    readonly id: \"158\";\n    readonly name: \"Sophia\";\n    readonly phone: \"777-888-2222\";\n    readonly notes: \"Dentist\";\n    readonly email: \"sophia@example.com\";\n    readonly sign: \"Libra\";\n    readonly address: \"123 Elm Street, Seattle, WA 98101\";\n}, {\n    readonly id: \"159\";\n    readonly name: \"Liam\";\n    readonly phone: \"555-123-4567\";\n    readonly notes: \"Software Engineer\";\n    readonly email: \"liam@example.com\";\n    readonly sign: \"Aries\";\n    readonly address: \"123 Oak Street, San Francisco, CA 94101\";\n}, {\n    readonly id: \"160\";\n    readonly name: \"Olivia\";\n    readonly phone: \"999-555-1212\";\n    readonly notes: \"Teacher\";\n    readonly email: \"olivia@testmail.co\";\n    readonly sign: \"Leo\";\n    readonly address: \"456 Elm Road, New York, NY 10001\";\n}, {\n    readonly id: \"161\";\n    readonly name: \"Noah\";\n    readonly phone: \"777-333-9999\";\n    readonly notes: \"Doctor\";\n    readonly email: \"noah@example.com\";\n    readonly sign: \"Scorpio\";\n    readonly address: \"789 Maple Avenue, Los Angeles, CA 90001\";\n}, {\n    readonly id: \"162\";\n    readonly name: \"Sophia\";\n    readonly phone: \"888-777-5555\";\n    readonly notes: \"Graphic Designer\";\n    readonly email: \"sophia@testmail.co\";\n    readonly sign: \"Gemini\";\n    readonly address: \"321 Birch Street, Chicago, IL 60601\";\n}, {\n    readonly id: \"163\";\n    readonly name: \"William\";\n    readonly phone: \"444-666-2222\";\n    readonly notes: \"Lawyer\";\n    readonly email: \"william@example.com\";\n    readonly sign: \"Taurus\";\n    readonly address: \"567 Pine Avenue, Denver, CO 80201\";\n}, {\n    readonly id: \"164\";\n    readonly name: \"Olivia\";\n    readonly phone: \"666-999-1111\";\n    readonly notes: \"Chef\";\n    readonly email: \"olivia@testmail.co\";\n    readonly sign: \"Capricorn\";\n    readonly address: \"890 Cedar Road, Miami, FL 33101\";\n}, {\n    readonly id: \"165\";\n    readonly name: \"James\";\n    readonly phone: \"111-444-7777\";\n    readonly notes: \"Architect\";\n    readonly email: \"james@example.com\";\n    readonly sign: \"Sagittarius\";\n    readonly address: \"123 Elm Street, Seattle, WA 98101\";\n}, {\n    readonly id: \"166\";\n    readonly name: \"Emma\";\n    readonly phone: \"222-888-9999\";\n    readonly notes: \"Nurse\";\n    readonly email: \"emma@testmail.co\";\n    readonly sign: \"Pisces\";\n    readonly address: \"456 Oak Lane, San Francisco, CA 94101\";\n}, {\n    readonly id: \"167\";\n    readonly name: \"Ava\";\n    readonly phone: \"555-777-2222\";\n    readonly notes: \"Police Officer\";\n    readonly email: \"ava@example.com\";\n    readonly sign: \"Virgo\";\n    readonly address: \"789 Birch Road, New York, NY 10001\";\n}, {\n    readonly id: \"168\";\n    readonly name: \"Benjamin\";\n    readonly phone: \"111-555-6666\";\n    readonly notes: \"Dentist\";\n    readonly email: \"benjamin@example.com\";\n    readonly sign: \"Cancer\";\n    readonly address: \"890 Oak Street, Los Angeles, CA 90001\";\n}, {\n    readonly id: \"169\";\n    readonly name: \"Sophia\";\n    readonly phone: \"777-555-8888\";\n    readonly notes: \"Teacher\";\n    readonly email: \"sophia@example.com\";\n    readonly sign: \"Libra\";\n    readonly address: \"123 Cedar Road, Chicago, IL 60601\";\n}, {\n    readonly id: \"170\";\n    readonly name: \"Mia\";\n    readonly phone: \"333-666-1111\";\n    readonly notes: \"Software Developer\";\n    readonly email: \"mia@testmail.co\";\n    readonly sign: \"Leo\";\n    readonly address: \"456 Pine Avenue, Denver, CO 80201\";\n}, {\n    readonly id: \"171\";\n    readonly name: \"Benjamin\";\n    readonly phone: \"999-777-5555\";\n    readonly notes: \"Engineer\";\n    readonly email: \"benjamin@example.com\";\n    readonly sign: \"Scorpio\";\n    readonly address: \"567 Elm Lane, Miami, FL 33101\";\n}, {\n    readonly id: \"172\";\n    readonly name: \"Isabella\";\n    readonly phone: \"888-111-4444\";\n    readonly notes: \"Artist\";\n    readonly email: \"isabella@testmail.co\";\n    readonly sign: \"Gemini\";\n    readonly address: \"321 Cedar Avenue, Seattle, WA 98101\";\n}, {\n    readonly id: \"173\";\n    readonly name: \"Eva\";\n    readonly phone: \"444-666-8888\";\n    readonly notes: \"Accountant\";\n    readonly email: \"eva@example.com\";\n    readonly sign: \"Virgo\";\n    readonly address: \"567 Birch Lane, Houston, TX 77001\";\n}, {\n    readonly id: \"174\";\n    readonly name: \"Oliver\";\n    readonly phone: \"333-999-7777\";\n    readonly notes: \"Writer\";\n    readonly email: \"oliver@testmail.co\";\n    readonly sign: \"Cancer\";\n    readonly address: \"890 Cedar Road, Miami, FL 33101\";\n}, {\n    readonly id: \"175\";\n    readonly name: \"Sophia\";\n    readonly phone: \"777-888-2222\";\n    readonly notes: \"Dentist\";\n    readonly email: \"sophia@example.com\";\n    readonly sign: \"Libra\";\n    readonly address: \"123 Elm Street, Seattle, WA 98101\";\n}, {\n    readonly id: \"176\";\n    readonly name: \"Liam\";\n    readonly phone: \"555-123-4567\";\n    readonly notes: \"Software Engineer\";\n    readonly email: \"liam@example.com\";\n    readonly sign: \"Aries\";\n    readonly address: \"123 Oak Street, San Francisco, CA 94101\";\n}, {\n    readonly id: \"177\";\n    readonly name: \"Olivia\";\n    readonly phone: \"999-555-1212\";\n    readonly notes: \"Teacher\";\n    readonly email: \"olivia@testmail.co\";\n    readonly sign: \"Leo\";\n    readonly address: \"456 Elm Road, New York, NY 10001\";\n}, {\n    readonly id: \"178\";\n    readonly name: \"Noah\";\n    readonly phone: \"777-333-9999\";\n    readonly notes: \"Doctor\";\n    readonly email: \"noah@example.com\";\n    readonly sign: \"Scorpio\";\n    readonly address: \"789 Maple Avenue, Los Angeles, CA 90001\";\n}, {\n    readonly id: \"179\";\n    readonly name: \"Sophia\";\n    readonly phone: \"888-777-5555\";\n    readonly notes: \"Graphic Designer\";\n    readonly email: \"sophia@testmail.co\";\n    readonly sign: \"Gemini\";\n    readonly address: \"321 Birch Street, Chicago, IL 60601\";\n}, {\n    readonly id: \"180\";\n    readonly name: \"William\";\n    readonly phone: \"444-666-2222\";\n    readonly notes: \"Lawyer\";\n    readonly email: \"william@example.com\";\n    readonly sign: \"Taurus\";\n    readonly address: \"567 Pine Avenue, Denver, CO 80201\";\n}, {\n    readonly id: \"181\";\n    readonly name: \"Olivia\";\n    readonly phone: \"666-999-1111\";\n    readonly notes: \"Chef\";\n    readonly email: \"olivia@testmail.co\";\n    readonly sign: \"Capricorn\";\n    readonly address: \"890 Cedar Road, Miami, FL 33101\";\n}, {\n    readonly id: \"182\";\n    readonly name: \"James\";\n    readonly phone: \"111-444-7777\";\n    readonly notes: \"Architect\";\n    readonly email: \"james@example.com\";\n    readonly sign: \"Sagittarius\";\n    readonly address: \"123 Elm Street, Seattle, WA 98101\";\n}, {\n    readonly id: \"183\";\n    readonly name: \"Emma\";\n    readonly phone: \"222-888-9999\";\n    readonly notes: \"Nurse\";\n    readonly email: \"emma@testmail.co\";\n    readonly sign: \"Pisces\";\n    readonly address: \"456 Oak Lane, San Francisco, CA 94101\";\n}, {\n    readonly id: \"184\";\n    readonly name: \"Ava\";\n    readonly phone: \"555-777-2222\";\n    readonly notes: \"Police Officer\";\n    readonly email: \"ava@example.com\";\n    readonly sign: \"Virgo\";\n    readonly address: \"789 Birch Road, New York, NY 10001\";\n}, {\n    readonly id: \"185\";\n    readonly name: \"Benjamin\";\n    readonly phone: \"111-555-6666\";\n    readonly notes: \"Dentist\";\n    readonly email: \"benjamin@example.com\";\n    readonly sign: \"Cancer\";\n    readonly address: \"890 Oak Street, Los Angeles, CA 90001\";\n}, {\n    readonly id: \"186\";\n    readonly name: \"Sophia\";\n    readonly phone: \"777-555-8888\";\n    readonly notes: \"Teacher\";\n    readonly email: \"sophia@example.com\";\n    readonly sign: \"Libra\";\n    readonly address: \"123 Cedar Road, Chicago, IL 60601\";\n}, {\n    readonly id: \"187\";\n    readonly name: \"Mia\";\n    readonly phone: \"333-666-1111\";\n    readonly notes: \"Software Developer\";\n    readonly email: \"mia@testmail.co\";\n    readonly sign: \"Leo\";\n    readonly address: \"456 Pine Avenue, Denver, CO 80201\";\n}, {\n    readonly id: \"188\";\n    readonly name: \"Benjamin\";\n    readonly phone: \"999-777-5555\";\n    readonly notes: \"Engineer\";\n    readonly email: \"benjamin@example.com\";\n    readonly sign: \"Scorpio\";\n    readonly address: \"567 Elm Lane, Miami, FL 33101\";\n}, {\n    readonly id: \"189\";\n    readonly name: \"Isabella\";\n    readonly phone: \"888-111-4444\";\n    readonly notes: \"Artist\";\n    readonly email: \"isabella@testmail.co\";\n    readonly sign: \"Gemini\";\n    readonly address: \"321 Cedar Avenue, Seattle, WA 98101\";\n}, {\n    readonly id: \"190\";\n    readonly name: \"Eva\";\n    readonly phone: \"444-666-8888\";\n    readonly notes: \"Accountant\";\n    readonly email: \"eva@example.com\";\n    readonly sign: \"Virgo\";\n    readonly address: \"567 Birch Lane, Houston, TX 77001\";\n}, {\n    readonly id: \"191\";\n    readonly name: \"Oliver\";\n    readonly phone: \"333-999-7777\";\n    readonly notes: \"Writer\";\n    readonly email: \"oliver@testmail.co\";\n    readonly sign: \"Cancer\";\n    readonly address: \"890 Cedar Road, Miami, FL 33101\";\n}, {\n    readonly id: \"192\";\n    readonly name: \"Sophia\";\n    readonly phone: \"777-888-2222\";\n    readonly notes: \"Dentist\";\n    readonly email: \"sophia@example.com\";\n    readonly sign: \"Libra\";\n    readonly address: \"123 Elm Street, Seattle, WA 98101\";\n}, {\n    readonly id: \"193\";\n    readonly name: \"Liam\";\n    readonly phone: \"555-123-4567\";\n    readonly notes: \"Software Engineer\";\n    readonly email: \"liam@example.com\";\n    readonly sign: \"Aries\";\n    readonly address: \"123 Oak Street, San Francisco, CA 94101\";\n}, {\n    readonly id: \"194\";\n    readonly name: \"Olivia\";\n    readonly phone: \"999-555-1212\";\n    readonly notes: \"Teacher\";\n    readonly email: \"olivia@testmail.co\";\n    readonly sign: \"Leo\";\n    readonly address: \"456 Elm Road, New York, NY 10001\";\n}, {\n    readonly id: \"195\";\n    readonly name: \"Noah\";\n    readonly phone: \"777-333-9999\";\n    readonly notes: \"Doctor\";\n    readonly email: \"noah@example.com\";\n    readonly sign: \"Scorpio\";\n    readonly address: \"789 Maple Avenue, Los Angeles, CA 90001\";\n}, {\n    readonly id: \"196\";\n    readonly name: \"Sophia\";\n    readonly phone: \"888-777-5555\";\n    readonly notes: \"Graphic Designer\";\n    readonly email: \"sophia@testmail.co\";\n    readonly sign: \"Gemini\";\n    readonly address: \"321 Birch Street, Chicago, IL 60601\";\n}, {\n    readonly id: \"197\";\n    readonly name: \"William\";\n    readonly phone: \"444-666-2222\";\n    readonly notes: \"Lawyer\";\n    readonly email: \"william@example.com\";\n    readonly sign: \"Taurus\";\n    readonly address: \"567 Pine Avenue, Denver, CO 80201\";\n}, {\n    readonly id: \"198\";\n    readonly name: \"Olivia\";\n    readonly phone: \"666-999-1111\";\n    readonly notes: \"Chef\";\n    readonly email: \"olivia@testmail.co\";\n    readonly sign: \"Capricorn\";\n    readonly address: \"890 Cedar Road, Miami, FL 33101\";\n}, {\n    readonly id: \"199\";\n    readonly name: \"James\";\n    readonly phone: \"111-444-7777\";\n    readonly notes: \"Architect\";\n    readonly email: \"james@example.com\";\n    readonly sign: \"Sagittarius\";\n    readonly address: \"123 Elm Street, Seattle, WA 98101\";\n}, {\n    readonly id: \"200\";\n    readonly name: \"Emma\";\n    readonly phone: \"222-888-9999\";\n    readonly notes: \"Nurse\";\n    readonly email: \"emma@testmail.co\";\n    readonly sign: \"Pisces\";\n    readonly address: \"456 Oak Lane, San Francisco, CA 94101\";\n}, {\n    readonly id: \"201\";\n    readonly name: \"Ava\";\n    readonly phone: \"555-777-2222\";\n    readonly notes: \"Police Officer\";\n    readonly email: \"ava@example.com\";\n    readonly sign: \"Virgo\";\n    readonly address: \"789 Birch Road, New York, NY 10001\";\n}, {\n    readonly id: \"202\";\n    readonly name: \"Benjamin\";\n    readonly phone: \"111-555-6666\";\n    readonly notes: \"Dentist\";\n    readonly email: \"benjamin@example.com\";\n    readonly sign: \"Cancer\";\n    readonly address: \"890 Oak Street, Los Angeles, CA 90001\";\n}, {\n    readonly id: \"203\";\n    readonly name: \"Sophia\";\n    readonly phone: \"777-555-8888\";\n    readonly notes: \"Teacher\";\n    readonly email: \"sophia@example.com\";\n    readonly sign: \"Libra\";\n    readonly address: \"123 Cedar Road, Chicago, IL 60601\";\n}, {\n    readonly id: \"204\";\n    readonly name: \"Mia\";\n    readonly phone: \"333-666-1111\";\n    readonly notes: \"Software Developer\";\n    readonly email: \"mia@testmail.co\";\n    readonly sign: \"Leo\";\n    readonly address: \"456 Pine Avenue, Denver, CO 80201\";\n}, {\n    readonly id: \"205\";\n    readonly name: \"Benjamin\";\n    readonly phone: \"999-777-5555\";\n    readonly notes: \"Engineer\";\n    readonly email: \"benjamin@example.com\";\n    readonly sign: \"Scorpio\";\n    readonly address: \"567 Elm Lane, Miami, FL 33101\";\n}, {\n    readonly id: \"206\";\n    readonly name: \"Isabella\";\n    readonly phone: \"888-111-4444\";\n    readonly notes: \"Artist\";\n    readonly email: \"isabella@testmail.co\";\n    readonly sign: \"Gemini\";\n    readonly address: \"321 Cedar Avenue, Seattle, WA 98101\";\n}, {\n    readonly id: \"207\";\n    readonly name: \"Eva\";\n    readonly phone: \"444-666-8888\";\n    readonly notes: \"Accountant\";\n    readonly email: \"eva@example.com\";\n    readonly sign: \"Virgo\";\n    readonly address: \"567 Birch Lane, Houston, TX 77001\";\n}, {\n    readonly id: \"208\";\n    readonly name: \"Oliver\";\n    readonly phone: \"333-999-7777\";\n    readonly notes: \"Writer\";\n    readonly email: \"oliver@testmail.co\";\n    readonly sign: \"Cancer\";\n    readonly address: \"890 Cedar Road, Miami, FL 33101\";\n}, {\n    readonly id: \"209\";\n    readonly name: \"Sophia\";\n    readonly phone: \"777-888-2222\";\n    readonly notes: \"Dentist\";\n    readonly email: \"sophia@example.com\";\n    readonly sign: \"Libra\";\n    readonly address: \"123 Elm Street, Seattle, WA 98101\";\n}, {\n    readonly id: \"210\";\n    readonly name: \"Liam\";\n    readonly phone: \"555-123-4567\";\n    readonly notes: \"Software Engineer\";\n    readonly email: \"liam@example.com\";\n    readonly sign: \"Aries\";\n    readonly address: \"123 Oak Street, San Francisco, CA 94101\";\n}, {\n    readonly id: \"211\";\n    readonly name: \"Olivia\";\n    readonly phone: \"999-555-1212\";\n    readonly notes: \"Teacher\";\n    readonly email: \"olivia@testmail.co\";\n    readonly sign: \"Leo\";\n    readonly address: \"456 Elm Road, New York, NY 10001\";\n}, {\n    readonly id: \"212\";\n    readonly name: \"Noah\";\n    readonly phone: \"777-333-9999\";\n    readonly notes: \"Doctor\";\n    readonly email: \"noah@example.com\";\n    readonly sign: \"Scorpio\";\n    readonly address: \"789 Maple Avenue, Los Angeles, CA 90001\";\n}, {\n    readonly id: \"213\";\n    readonly name: \"Sophia\";\n    readonly phone: \"888-777-5555\";\n    readonly notes: \"Graphic Designer\";\n    readonly email: \"sophia@testmail.co\";\n    readonly sign: \"Gemini\";\n    readonly address: \"321 Birch Street, Chicago, IL 60601\";\n}, {\n    readonly id: \"214\";\n    readonly name: \"William\";\n    readonly phone: \"444-666-2222\";\n    readonly notes: \"Lawyer\";\n    readonly email: \"william@example.com\";\n    readonly sign: \"Taurus\";\n    readonly address: \"567 Pine Avenue, Denver, CO 80201\";\n}, {\n    readonly id: \"215\";\n    readonly name: \"Olivia\";\n    readonly phone: \"666-999-1111\";\n    readonly notes: \"Chef\";\n    readonly email: \"olivia@testmail.co\";\n    readonly sign: \"Capricorn\";\n    readonly address: \"890 Cedar Road, Miami, FL 33101\";\n}, {\n    readonly id: \"216\";\n    readonly name: \"James\";\n    readonly phone: \"111-444-7777\";\n    readonly notes: \"Architect\";\n    readonly email: \"james@example.com\";\n    readonly sign: \"Sagittarius\";\n    readonly address: \"123 Elm Street, Seattle, WA 98101\";\n}, {\n    readonly id: \"217\";\n    readonly name: \"Emma\";\n    readonly phone: \"222-888-9999\";\n    readonly notes: \"Nurse\";\n    readonly email: \"emma@testmail.co\";\n    readonly sign: \"Pisces\";\n    readonly address: \"456 Oak Lane, San Francisco, CA 94101\";\n}, {\n    readonly id: \"218\";\n    readonly name: \"Ava\";\n    readonly phone: \"555-777-2222\";\n    readonly notes: \"Police Officer\";\n    readonly email: \"ava@example.com\";\n    readonly sign: \"Virgo\";\n    readonly address: \"789 Birch Road, New York, NY 10001\";\n}, {\n    readonly id: \"219\";\n    readonly name: \"Benjamin\";\n    readonly phone: \"111-555-6666\";\n    readonly notes: \"Dentist\";\n    readonly email: \"benjamin@example.com\";\n    readonly sign: \"Cancer\";\n    readonly address: \"890 Oak Street, Los Angeles, CA 90001\";\n}, {\n    readonly id: \"220\";\n    readonly name: \"Sophia\";\n    readonly phone: \"777-555-8888\";\n    readonly notes: \"Teacher\";\n    readonly email: \"sophia@example.com\";\n    readonly sign: \"Libra\";\n    readonly address: \"123 Cedar Road, Chicago, IL 60601\";\n}, {\n    readonly id: \"221\";\n    readonly name: \"Mia\";\n    readonly phone: \"333-666-1111\";\n    readonly notes: \"Software Developer\";\n    readonly email: \"mia@testmail.co\";\n    readonly sign: \"Leo\";\n    readonly address: \"456 Pine Avenue, Denver, CO 80201\";\n}, {\n    readonly id: \"222\";\n    readonly name: \"Benjamin\";\n    readonly phone: \"999-777-5555\";\n    readonly notes: \"Engineer\";\n    readonly email: \"benjamin@example.com\";\n    readonly sign: \"Scorpio\";\n    readonly address: \"567 Elm Lane, Miami, FL 33101\";\n}, {\n    readonly id: \"223\";\n    readonly name: \"Isabella\";\n    readonly phone: \"888-111-4444\";\n    readonly notes: \"Artist\";\n    readonly email: \"isabella@testmail.co\";\n    readonly sign: \"Gemini\";\n    readonly address: \"321 Cedar Avenue, Seattle, WA 98101\";\n}, {\n    readonly id: \"224\";\n    readonly name: \"Eva\";\n    readonly phone: \"444-666-8888\";\n    readonly notes: \"Accountant\";\n    readonly email: \"eva@example.com\";\n    readonly sign: \"Virgo\";\n    readonly address: \"567 Birch Lane, Houston, TX 77001\";\n}, {\n    readonly id: \"225\";\n    readonly name: \"Oliver\";\n    readonly phone: \"333-999-7777\";\n    readonly notes: \"Writer\";\n    readonly email: \"oliver@testmail.co\";\n    readonly sign: \"Cancer\";\n    readonly address: \"890 Cedar Road, Miami, FL 33101\";\n}, {\n    readonly id: \"226\";\n    readonly name: \"Sophia\";\n    readonly phone: \"777-888-2222\";\n    readonly notes: \"Dentist\";\n    readonly email: \"sophia@example.com\";\n    readonly sign: \"Libra\";\n    readonly address: \"123 Elm Street, Seattle, WA 98101\";\n}, {\n    readonly id: \"227\";\n    readonly name: \"Liam\";\n    readonly phone: \"555-123-4567\";\n    readonly notes: \"Software Engineer\";\n    readonly email: \"liam@example.com\";\n    readonly sign: \"Aries\";\n    readonly address: \"123 Oak Street, San Francisco, CA 94101\";\n}, {\n    readonly id: \"228\";\n    readonly name: \"Olivia\";\n    readonly phone: \"999-555-1212\";\n    readonly notes: \"Teacher\";\n    readonly email: \"olivia@testmail.co\";\n    readonly sign: \"Leo\";\n    readonly address: \"456 Elm Road, New York, NY 10001\";\n}, {\n    readonly id: \"229\";\n    readonly name: \"Noah\";\n    readonly phone: \"777-333-9999\";\n    readonly notes: \"Doctor\";\n    readonly email: \"noah@example.com\";\n    readonly sign: \"Scorpio\";\n    readonly address: \"789 Maple Avenue, Los Angeles, CA 90001\";\n}, {\n    readonly id: \"230\";\n    readonly name: \"Sophia\";\n    readonly phone: \"888-777-5555\";\n    readonly notes: \"Graphic Designer\";\n    readonly email: \"sophia@testmail.co\";\n    readonly sign: \"Gemini\";\n    readonly address: \"321 Birch Street, Chicago, IL 60601\";\n}, {\n    readonly id: \"231\";\n    readonly name: \"William\";\n    readonly phone: \"444-666-2222\";\n    readonly notes: \"Lawyer\";\n    readonly email: \"william@example.com\";\n    readonly sign: \"Taurus\";\n    readonly address: \"567 Pine Avenue, Denver, CO 80201\";\n}, {\n    readonly id: \"232\";\n    readonly name: \"Olivia\";\n    readonly phone: \"666-999-1111\";\n    readonly notes: \"Chef\";\n    readonly email: \"olivia@testmail.co\";\n    readonly sign: \"Capricorn\";\n    readonly address: \"890 Cedar Road, Miami, FL 33101\";\n}, {\n    readonly id: \"233\";\n    readonly name: \"James\";\n    readonly phone: \"111-444-7777\";\n    readonly notes: \"Architect\";\n    readonly email: \"james@example.com\";\n    readonly sign: \"Sagittarius\";\n    readonly address: \"123 Elm Street, Seattle, WA 98101\";\n}, {\n    readonly id: \"234\";\n    readonly name: \"Emma\";\n    readonly phone: \"222-888-9999\";\n    readonly notes: \"Nurse\";\n    readonly email: \"emma@testmail.co\";\n    readonly sign: \"Pisces\";\n    readonly address: \"456 Oak Lane, San Francisco, CA 94101\";\n}, {\n    readonly id: \"235\";\n    readonly name: \"Ava\";\n    readonly phone: \"555-777-2222\";\n    readonly notes: \"Police Officer\";\n    readonly email: \"ava@example.com\";\n    readonly sign: \"Virgo\";\n    readonly address: \"789 Birch Road, New York, NY 10001\";\n}, {\n    readonly id: \"236\";\n    readonly name: \"Benjamin\";\n    readonly phone: \"111-555-6666\";\n    readonly notes: \"Dentist\";\n    readonly email: \"benjamin@example.com\";\n    readonly sign: \"Cancer\";\n    readonly address: \"890 Oak Street, Los Angeles, CA 90001\";\n}, {\n    readonly id: \"237\";\n    readonly name: \"Sophia\";\n    readonly phone: \"777-555-8888\";\n    readonly notes: \"Teacher\";\n    readonly email: \"sophia@example.com\";\n    readonly sign: \"Libra\";\n    readonly address: \"123 Cedar Road, Chicago, IL 60601\";\n}, {\n    readonly id: \"238\";\n    readonly name: \"Mia\";\n    readonly phone: \"333-666-1111\";\n    readonly notes: \"Software Developer\";\n    readonly email: \"mia@testmail.co\";\n    readonly sign: \"Leo\";\n    readonly address: \"456 Pine Avenue, Denver, CO 80201\";\n}, {\n    readonly id: \"239\";\n    readonly name: \"Benjamin\";\n    readonly phone: \"999-777-5555\";\n    readonly notes: \"Engineer\";\n    readonly email: \"benjamin@example.com\";\n    readonly sign: \"Scorpio\";\n    readonly address: \"567 Elm Lane, Miami, FL 33101\";\n}, {\n    readonly id: \"240\";\n    readonly name: \"Isabella\";\n    readonly phone: \"888-111-4444\";\n    readonly notes: \"Artist\";\n    readonly email: \"isabella@testmail.co\";\n    readonly sign: \"Gemini\";\n    readonly address: \"321 Cedar Avenue, Seattle, WA 98101\";\n}, {\n    readonly id: \"241\";\n    readonly name: \"Eva\";\n    readonly phone: \"444-666-8888\";\n    readonly notes: \"Accountant\";\n    readonly email: \"eva@example.com\";\n    readonly sign: \"Virgo\";\n    readonly address: \"567 Birch Lane, Houston, TX 77001\";\n}, {\n    readonly id: \"242\";\n    readonly name: \"Oliver\";\n    readonly phone: \"333-999-7777\";\n    readonly notes: \"Writer\";\n    readonly email: \"oliver@testmail.co\";\n    readonly sign: \"Cancer\";\n    readonly address: \"890 Cedar Road, Miami, FL 33101\";\n}, {\n    readonly id: \"243\";\n    readonly name: \"Sophia\";\n    readonly phone: \"777-888-2222\";\n    readonly notes: \"Dentist\";\n    readonly email: \"sophia@example.com\";\n    readonly sign: \"Libra\";\n    readonly address: \"123 Elm Street, Seattle, WA 98101\";\n}];\n//# sourceMappingURL=dummyTableData.d.ts.map"
          },
          "hooks.d.ts": {
            "path": "hooks.d.ts",
            "content": "import type { GenericObject } from '../../components/Table/Table';\nexport type SortDirection = 'asc' | 'desc' | 'original';\nexport declare function useSortableEntries<T extends GenericObject>(entries: Array<T>, idName: keyof T, { defaultSortKey, defaultSortDirection, onSort, enableInternalSorting, }: {\n    defaultSortKey?: keyof T;\n    defaultSortDirection?: SortDirection;\n    onSort?: (sortKey: string, sortDirection: SortDirection) => unknown;\n    enableInternalSorting?: boolean;\n}): {\n    handleSortClick: (sortKey: keyof T) => unknown;\n    sortDirection: SortDirection;\n    sortKey?: string;\n    sortedEntries: T[];\n    sortedKeys: keyof T[];\n};\n//# sourceMappingURL=hooks.d.ts.map"
          }
        }
      },
      "allFiles": [
        "BasicTable.stories.tsx",
        "BulkActions.stories.tsx",
        "Cell.tsx",
        "DefaultRow.tsx",
        "DefaultTableHeader.tsx",
        "InlineEdit.stories.tsx",
        "StaticTable.tsx",
        "Table.docs.ts",
        "Table.module.css",
        "Table.stories.module.css",
        "Table.tsx",
        "TableActionBar.tsx",
        "TableBar.module.css",
        "TableBottomBar.tsx",
        "TableTopBar.tsx",
        "dummyTableData.ts",
        "hooks.ts",
        "index.ts"
      ]
    },
    "Tabs": {
      "name": "Tabs",
      "path": "src/components/Tabs",
      "files": {
        "main": null,
        "story": null,
        "css": null,
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Tabs/Tab';\nexport * from '../../components/Tabs/TabList';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "Tab/Tab.d.ts": {
            "path": "Tab/Tab.d.ts",
            "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { IconType } from '../../../components/Icon';\nimport type { ElevationType } from '../../../components/Tooltip';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    iconTextWrap?: string;\n}>;\nexport declare const TAB_SIZE: Readonly<{\n    small: \"small\";\n    medium: \"medium\";\n}>;\nexport declare const tabSizeOptions: Array<unknown>;\nexport type TabSize = keyof typeof TAB_SIZE;\n/**\n * Attributes forwarded straight to the underlying `<button>`. Declared rather\n * than relied on: `Tab` spreads its rest props, so these reached the DOM\n * whether or not the type mentioned them — which meant a future refactor could\n * drop a popup trigger's ARIA with no type error anywhere.\n */\ntype ForwardedButtonProps = Pick<React.ButtonHTMLAttributes<HTMLButtonElement>, 'id' | 'aria-label' | 'aria-haspopup' | 'aria-expanded' | 'aria-controls' | 'onKeyDown'>;\nexport interface TabProps extends ForwardedButtonProps {\n    classNames?: ClassNames;\n    onSelect?: (arg1: {\n        tabId?: string;\n        label?: string;\n    }) => unknown;\n    size?: TabSize;\n    selectedTab?: {\n        tabId?: string;\n        label?: string;\n    };\n    disabled?: boolean;\n    tabId?: string;\n    label?: string;\n    iconName?: string;\n    iconType?: IconType;\n    maxWidth?: string;\n    elevation?: ElevationType;\n    onClick?: (e: React.SyntheticEvent<HTMLElement>) => unknown;\n    testId?: string;\n}\nexport declare const Tab: Flow.AbstractComponent<TabProps, HTMLButtonElement>;\nexport {};\n//# sourceMappingURL=Tab.d.ts.map"
          },
          "Tab/index.d.ts": {
            "path": "Tab/index.d.ts",
            "content": "export * from '../../../components/Tabs/Tab/Tab';\n//# sourceMappingURL=index.d.ts.map"
          },
          "TabList/TabDropdown.d.ts": {
            "path": "TabList/TabDropdown.d.ts",
            "content": "import * as React from 'react';\nimport type { AnchorType } from '../../../components/ButtonDropdown';\nimport type { MenuOption, MenuProps } from '../../../components/Menu';\nimport type { TabProps } from '../../../components/Tabs/Tab';\nimport type { ElevationType } from '../../../components/Tooltip';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n}>;\nexport interface TabDropdownProps {\n    anchorPosition?: AnchorType;\n    size?: 'medium' | 'small';\n    props?: {\n        tab: TabProps;\n        menu: MenuProps;\n    };\n    onOptionSelect?: (option: MenuOption, arg2?: React.SyntheticEvent<HTMLElement> | null | undefined) => unknown;\n    classNames?: ClassNames;\n    selected?: boolean;\n    disabled?: boolean;\n    /**\n     * Opt in to the accessibility behavior: `aria-haspopup` / `aria-expanded` /\n     * `aria-controls` on the tab, the arrow key that opens the popup, and focus\n     * moving into the menu and back. Forwarded to the `Menu` this opens.\n     *\n     * Off by default, and off is this component exactly as it behaved before any\n     * of it existed.\n     */\n    enableA11y?: boolean;\n    elevation?: ElevationType;\n    testId?: string;\n}\nexport declare const TabDropdown: ({ anchorPosition, size, onOptionSelect, props, elevation, classNames, enableA11y, testId, }: TabDropdownProps) => React.JSX.Element;\nexport {};\n//# sourceMappingURL=TabDropdown.d.ts.map"
          },
          "TabList/TabList.d.ts": {
            "path": "TabList/TabList.d.ts",
            "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { ElevationType } from '../../../components/Tooltip';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n}>;\nexport interface TabListProps {\n    classNames?: ClassNames;\n    onSelect?: (arg1: {\n        tabId: string;\n        label?: string;\n    }) => unknown;\n    children?: React.ReactNode;\n    size?: 'medium' | 'small';\n    selectedTab?: {\n        tabId: string;\n        label?: string;\n    };\n    menuWidth?: string;\n    elevation?: ElevationType;\n    maxTabWidth?: string;\n    /**\n     * Accessible name for the overflow tab, which is icon-only and therefore has\n     * no text of its own — it also names the listbox that tab opens. Override it\n     * for another language, as `ButtonTabs` does with `wrapTabTitle`.\n     */\n    overflowTabLabel?: string;\n    /**\n     * Opt in to the accessibility behavior for the overflow tab and the menu it\n     * opens, and give that icon-only tab an accessible name.\n     *\n     * Off by default, and off is this component exactly as it behaved before any\n     * of it existed.\n     */\n    enableA11y?: boolean;\n    testId?: string;\n}\nexport declare const TabList: Flow.AbstractComponent<TabListProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=TabList.d.ts.map"
          },
          "TabList/index.d.ts": {
            "path": "TabList/index.d.ts",
            "content": "export * from '../../../components/Tabs/TabList/TabList';\n//# sourceMappingURL=index.d.ts.map"
          }
        }
      },
      "allFiles": [
        "Tab/Tab.module.css",
        "Tab/Tab.stories.tsx",
        "Tab/Tab.tsx",
        "Tab/index.ts",
        "TabList/TabDropdown.module.css",
        "TabList/TabDropdown.tsx",
        "TabList/TabList.module.css",
        "TabList/TabList.stories.module.css",
        "TabList/TabList.stories.tsx",
        "TabList/TabList.tsx",
        "TabList/index.ts",
        "index.ts"
      ]
    },
    "TemplateCard": {
      "name": "TemplateCard",
      "path": "src/components/TemplateCard",
      "files": {
        "main": {
          "path": "TemplateCard.d.ts",
          "content": "import * as React from 'react';\nimport type { IconType } from '../../components/Icon';\nexport declare const TEMPLATE_CARD_HEADER_COLOR: Readonly<{\n    information: \"information\";\n    success: \"success\";\n    warning: \"warning\";\n    error: \"error\";\n    neutral: \"neutral\";\n    pending: \"pending\";\n}>;\nexport type HeaderColorType = (typeof TEMPLATE_CARD_HEADER_COLOR)[keyof typeof TEMPLATE_CARD_HEADER_COLOR];\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    header?: string;\n    content?: string;\n    footer?: string;\n}>;\nexport interface TemplateCardProps {\n    headerColor?: HeaderColorType;\n    iconName: string;\n    iconType?: IconType;\n    footer?: React.ReactNode;\n    children?: React.ReactNode;\n    classNames?: ClassNames;\n    testId?: string;\n}\nexport declare const TemplateCard: React.ForwardRefExoticComponent<TemplateCardProps & React.RefAttributes<HTMLDivElement>>;\nexport {};\n//# sourceMappingURL=TemplateCard.d.ts.map"
        },
        "story": {
          "path": "TemplateCard.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {Button} from 'src/components/Button';\nimport {Chip} from 'src/components/Chip';\nimport type {TemplateCardProps} from 'src/components/TemplateCard';\nimport {\n  TEMPLATE_CARD_HEADER_COLOR,\n  TemplateCard,\n} from 'src/components/TemplateCard';\nimport {BodyMedium, BodySmall, SubTitleSmall} from 'src/components/Text';\n\nimport css from 'src/components/TemplateCard/TemplateCard.stories.module.css';\n\n\nconst headerColorOptions: Array<unknown> = [\n  ...Object.values(TEMPLATE_CARD_HEADER_COLOR),\n];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Template Card',\n  component: TemplateCard,\n  argTypes: {\n    headerColor: {\n      options: headerColorOptions,\n      description:\n        'State-based header color. Applies background color to header strip, icon container, and icon color.',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'HeaderColorType'},\n        defaultValue: {summary: TEMPLATE_CARD_HEADER_COLOR.neutral},\n      },\n    },\n    iconName: {\n      description:\n        'Icon name (string). See Icon component for available icons.',\n      type: {required: true},\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {\n          summary: 'string',\n        },\n      },\n    },\n    iconType: {\n      description:\n        'Type of Icon (regular, solid, duotone, brands). Imported from Icon component.',\n      options: ['regular', 'solid', 'duotone', 'brands'],\n      control: {type: 'select'},\n      table: {\n        type: {summary: 'IconType'},\n        defaultValue: {summary: 'solid'},\n      },\n    },\n    footer: {\n      description:\n        'Optional footer content. Accepts any React.ReactNode. Only renders if provided.',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: 'React.ReactNode',\n        },\n      },\n    },\n    children: {\n      description:\n        'Main content of the card. Accepts any React.ReactNode. Only renders if provided.',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: 'React.ReactNode',\n        },\n      },\n    },\n    classNames: {\n      description:\n        'Optional classNames to be applied to wrapper, header, content, or footer',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary:\n            '{wrapper?: string, header?: string, content?: string, footer?: string}',\n        },\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'A flexible template card with colored header and icon.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { TemplateCard, TEMPLATE_CARD_HEADER_COLOR } from \"@spaced-out/ui-design-system/lib/components/TemplateCard\";\n\\`\\`\\`\n\n**Template Card** provides a structured card layout with:\n- A colored header strip with state-based styling\n- An overlapping circular icon container\n- Flexible content area (children)\n- Optional footer area\n\nThe component accepts any content via \\`children\\` and \\`footer\\` props, giving you full control over what to display.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/TemplateCard/TemplateCard',\n    },\n  },\n};\n\nexport const DefaultStory = (args: TemplateCardProps) => (\n  <div className={css.container}>\n    <TemplateCard {...args}>\n      <div className={css.contentSection}>\n        <SubTitleSmall>Happy Birthday Campaign</SubTitleSmall>\n        <BodySmall>\n          Easily send personalized birthday wishes for each customer&apos;s\n          special day. Connect with personalized messages that show you truly\n          care.\n        </BodySmall>\n      </div>\n    </TemplateCard>\n  </div>\n);\n\nDefaultStory.args = {\n  headerColor: 'information',\n  iconName: 'face-party',\n  iconType: 'solid',\n  testId: 'template-card-default-story',\n};\n\nexport const WithFooterStory = (args: TemplateCardProps) => (\n  <div className={css.container}>\n    <TemplateCard\n      {...args}\n      footer={\n        <div className={css.footerContent}>\n          <Button type=\"secondary\" isFluid>\n            Preview\n          </Button>\n          <Button type=\"primary\" isFluid>\n            Use Template\n          </Button>\n        </div>\n      }\n    >\n      <div className={css.contentSection}>\n        <SubTitleSmall>Happy Birthday Campaign</SubTitleSmall>\n        <BodySmall>\n          Easily send personalized birthday wishes for each customer&apos;s\n          special day.\n        </BodySmall>\n        <div className={css.chipGroup}>\n          <Chip>Engagement</Chip>\n          <Chip>Campaign</Chip>\n          <Chip>9 Workflows Created</Chip>\n        </div>\n      </div>\n    </TemplateCard>\n  </div>\n);\n\nWithFooterStory.args = {\n  headerColor: 'information',\n  iconName: 'face-party',\n  iconType: 'solid',\n  testId: 'template-card-with-footer-story',\n};\n\nexport const InformationStateStory = (args: TemplateCardProps) => (\n  <div className={css.container}>\n    <TemplateCard\n      {...args}\n      footer={\n        <div className={css.footerContent}>\n          <Button type=\"tertiary\" isFluid>\n            Learn More\n          </Button>\n          <Button type=\"primary\" isFluid>\n            Get Started\n          </Button>\n        </div>\n      }\n    >\n      <div className={css.contentSection}>\n        <SubTitleSmall>Customer Onboarding Flow</SubTitleSmall>\n        <BodySmall>\n          Welcome new customers with a personalized onboarding experience. Guide\n          them through key features and help them get started quickly.\n        </BodySmall>\n        <div className={css.chipGroup}>\n          <Chip>Onboarding</Chip>\n          <Chip>Automation</Chip>\n        </div>\n      </div>\n    </TemplateCard>\n  </div>\n);\n\nInformationStateStory.args = {\n  headerColor: 'information',\n  iconName: 'circle-info',\n  iconType: 'solid',\n  testId: 'template-card-information-story',\n};\n\nexport const SuccessStateStory = (args: TemplateCardProps) => (\n  <div className={css.container}>\n    <TemplateCard\n      {...args}\n      footer={\n        <div className={css.footerContent}>\n          <Button type=\"secondary\" isFluid>\n            View Details\n          </Button>\n          <Button type=\"primary\" isFluid>\n            Apply Template\n          </Button>\n        </div>\n      }\n    >\n      <div className={css.contentSection}>\n        <SubTitleSmall>Order Confirmation Workflow</SubTitleSmall>\n        <BodySmall>\n          Automatically send order confirmations and shipping updates to keep\n          customers informed throughout their purchase journey.\n        </BodySmall>\n        <div className={css.chipGroup}>\n          <Chip>E-commerce</Chip>\n          <Chip>Transactional</Chip>\n        </div>\n      </div>\n    </TemplateCard>\n  </div>\n);\n\nSuccessStateStory.args = {\n  headerColor: 'success',\n  iconName: 'circle-check',\n  iconType: 'solid',\n  testId: 'template-card-success-story',\n};\n\nexport const WarningStateStory = (args: TemplateCardProps) => (\n  <div className={css.container}>\n    <TemplateCard\n      {...args}\n      footer={\n        <div className={css.footerContent}>\n          <Button type=\"secondary\" isFluid>\n            Dismiss\n          </Button>\n          <Button type=\"primary\" isFluid>\n            Review Template\n          </Button>\n        </div>\n      }\n    >\n      <div className={css.contentSection}>\n        <SubTitleSmall>Cart Abandonment Recovery</SubTitleSmall>\n        <BodySmall>\n          Recover lost sales by reminding customers about items left in their\n          cart. Send timely reminders with personalized incentives.\n        </BodySmall>\n        <div className={css.chipGroup}>\n          <Chip>Revenue Recovery</Chip>\n          <Chip>Reminder</Chip>\n        </div>\n      </div>\n    </TemplateCard>\n  </div>\n);\n\nWarningStateStory.args = {\n  headerColor: 'warning',\n  iconName: 'triangle-exclamation',\n  iconType: 'solid',\n  testId: 'template-card-warning-story',\n};\n\nexport const ErrorStateStory = (args: TemplateCardProps) => (\n  <div className={css.container}>\n    <TemplateCard\n      {...args}\n      footer={\n        <div className={css.footerContent}>\n          <Button type=\"secondary\" isFluid>\n            Cancel\n          </Button>\n          <Button type=\"danger\" isFluid>\n            Fix Issues\n          </Button>\n        </div>\n      }\n    >\n      <div className={css.contentSection}>\n        <SubTitleSmall>Payment Failed Notification</SubTitleSmall>\n        <BodySmall>\n          Alert customers when payment processing fails and guide them to update\n          their payment information to complete their order.\n        </BodySmall>\n        <div className={css.chipGroup}>\n          <Chip>Critical</Chip>\n          <Chip>Payment</Chip>\n        </div>\n      </div>\n    </TemplateCard>\n  </div>\n);\n\nErrorStateStory.args = {\n  headerColor: 'error',\n  iconName: 'circle-xmark',\n  iconType: 'solid',\n  testId: 'template-card-error-story',\n};\n\nexport const PendingStateStory = (args: TemplateCardProps) => (\n  <div className={css.container}>\n    <TemplateCard\n      {...args}\n      footer={\n        <div className={css.footerContent}>\n          <Button type=\"tertiary\" isFluid>\n            Cancel\n          </Button>\n          <Button type=\"secondary\" isFluid>\n            Continue Editing\n          </Button>\n        </div>\n      }\n    >\n      <div className={css.contentSection}>\n        <SubTitleSmall>Draft Campaign Template</SubTitleSmall>\n        <BodySmall>\n          This template is currently in draft status. Complete the setup and\n          review before publishing to make it available for use.\n        </BodySmall>\n        <div className={css.chipGroup}>\n          <Chip>Draft</Chip>\n          <Chip>In Progress</Chip>\n        </div>\n      </div>\n    </TemplateCard>\n  </div>\n);\n\nPendingStateStory.args = {\n  headerColor: 'pending',\n  iconName: 'clock',\n  iconType: 'solid',\n  testId: 'template-card-pending-story',\n};\n\nexport const NeutralStateStory = (args: TemplateCardProps) => (\n  <div className={css.container}>\n    <TemplateCard\n      {...args}\n      footer={\n        <div className={css.footerContent}>\n          <Button type=\"secondary\" isFluid>\n            Preview\n          </Button>\n          <Button type=\"primary\" isFluid>\n            Use Template\n          </Button>\n        </div>\n      }\n    >\n      <div className={css.contentSection}>\n        <SubTitleSmall>Weekly Newsletter Template</SubTitleSmall>\n        <BodySmall>\n          Keep your subscribers engaged with a regular newsletter featuring your\n          latest content, products, and updates.\n        </BodySmall>\n        <div className={css.chipGroup}>\n          <Chip>Newsletter</Chip>\n          <Chip>Content</Chip>\n        </div>\n      </div>\n    </TemplateCard>\n  </div>\n);\n\nNeutralStateStory.args = {\n  headerColor: 'neutral',\n  iconName: 'envelope',\n  iconType: 'solid',\n  testId: 'template-card-neutral-story',\n};\n\nexport const MinimalContentStory = (args: TemplateCardProps) => (\n  <div className={css.container}>\n    <TemplateCard {...args}>\n      <div className={css.contentSection}>\n        <SubTitleSmall>Quick Start Template</SubTitleSmall>\n      </div>\n    </TemplateCard>\n  </div>\n);\n\nMinimalContentStory.args = {\n  headerColor: 'information',\n  iconName: 'rocket',\n  iconType: 'solid',\n  testId: 'template-card-minimal-story',\n};\n\nexport const NoFooterStory = (args: TemplateCardProps) => (\n  <div className={css.container}>\n    <TemplateCard {...args}>\n      <div className={css.contentSection}>\n        <SubTitleSmall>Simple Template Card</SubTitleSmall>\n        <BodyMedium>\n          This template card has no footer, demonstrating how the footer is\n          conditionally rendered only when the footer prop is provided.\n        </BodyMedium>\n      </div>\n    </TemplateCard>\n  </div>\n);\n\nNoFooterStory.args = {\n  headerColor: 'success',\n  iconName: 'check',\n  iconType: 'solid',\n  testId: 'template-card-no-footer-story',\n};\n\nexport const CustomContentStory = (args: TemplateCardProps) => (\n  <div className={css.container}>\n    <TemplateCard\n      {...args}\n      footer={\n        <div className={css.customFooter}>\n          <BodySmall>Frame 485088808</BodySmall>\n          <Button type=\"tertiary\">Default</Button>\n        </div>\n      }\n    >\n      <div className={css.customContent}>\n        <div className={css.labelRow}>\n          <BodySmall className={css.label}>label</BodySmall>\n          <BodySmall>Text + Icon</BodySmall>\n        </div>\n        <div className={css.contentRow}>\n          <SubTitleSmall>\n            Easily send personalized birthday wishes! Set rem...\n          </SubTitleSmall>\n        </div>\n        <div className={css.labelRow}>\n          <BodySmall className={css.label}>label</BodySmall>\n          <BodySmall>Text + Icon</BodySmall>\n        </div>\n      </div>\n    </TemplateCard>\n  </div>\n);\n\nCustomContentStory.args = {\n  headerColor: 'warning',\n  iconName: 'gift',\n  iconType: 'solid',\n  testId: 'template-card-custom-story',\n};\n\nDefaultStory.storyName = 'Default';\nWithFooterStory.storyName = 'With Footer';\nInformationStateStory.storyName = 'Information State';\nSuccessStateStory.storyName = 'Success State';\nWarningStateStory.storyName = 'Warning State';\nErrorStateStory.storyName = 'Error State';\nPendingStateStory.storyName = 'Pending State';\nNeutralStateStory.storyName = 'Neutral State';\nMinimalContentStory.storyName = 'Minimal Content';\nNoFooterStory.storyName = 'No Footer';\nCustomContentStory.storyName = 'Custom Content';\n"
        },
        "css": {
          "path": "TemplateCard.module.css",
          "content": "@value (\n  colorBorderPrimary,\n  colorBackgroundTertiary,\n  colorNeutralLightest,\n  colorNeutral,\n  colorInformationLightest,\n  colorInformation,\n  colorSuccessLightest,\n  colorSuccess,\n  colorDangerLightest,\n  colorDanger,\n  colorWarningLightest,\n  colorWarning\n) from '../../styles/variables/_color.css';\n\n@value (\n  size58,\n  sizeFluid\n) from '../../styles/variables/_size.css';\n\n@value (\n  spaceSmall,\n  spaceMedium,\n  spaceLarge\n) from '../../styles/variables/_space.css';\n\n@value (\n  borderRadiusSmall,\n  borderRadiusCircle,\n  borderWidthPrimary,\n  borderWidthSecondary\n) from '../../styles/variables/_border.css';\n\n.wrapper {\n  display: flex;\n  flex-direction: column;\n  width: sizeFluid;\n  background-color: colorBackgroundTertiary;\n  border-radius: borderRadiusSmall;\n  border: borderWidthPrimary solid colorBorderPrimary;\n  overflow: hidden;\n}\n\n.header {\n  position: relative;\n  width: sizeFluid;\n  height: 49px;\n  display: flex;\n  align-items: flex-start;\n}\n\n/* Header background colors for each state */\n.header.neutral {\n  background-color: colorNeutralLightest;\n}\n\n.header.information {\n  background-color: colorInformationLightest;\n}\n\n.header.success {\n  background-color: colorSuccessLightest;\n}\n\n.header.warning {\n  background-color: colorWarningLightest;\n}\n\n.header.error {\n  background-color: colorDangerLightest;\n}\n\n.header.pending {\n  background-color: colorWarningLightest;\n}\n\n.iconContainer {\n  position: absolute;\n  left: spaceSmall;\n  top: spaceSmall;\n  width: size58;\n  height: size58;\n  min-width: size58;\n  min-height: size58;\n  border-radius: borderRadiusCircle;\n  border: borderWidthSecondary solid colorBackgroundTertiary;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n/* Icon container background colors for each state */\n.iconContainer.neutral {\n  background-color: colorNeutralLightest;\n}\n\n.iconContainer.information {\n  background-color: colorInformationLightest;\n}\n\n.iconContainer.success {\n  background-color: colorSuccessLightest;\n}\n\n.iconContainer.warning {\n  background-color: colorWarningLightest;\n}\n\n.iconContainer.error {\n  background-color: colorDangerLightest;\n}\n\n.iconContainer.pending {\n  background-color: colorWarningLightest;\n}\n\n/* Icon colors using descendant selectors */\n.iconContainer .neutral {\n  color: colorNeutral;\n}\n\n.iconContainer .information {\n  color: colorInformation;\n}\n\n.iconContainer .success {\n  color: colorSuccess;\n}\n\n.iconContainer .warning {\n  color: colorWarning;\n}\n\n.iconContainer .error {\n  color: colorDanger;\n}\n\n.iconContainer .pending {\n  color: colorWarning;\n}\n\n.content {\n  display: flex;\n  flex-direction: column;\n  background-color: colorBackgroundTertiary;\n  padding: spaceSmall spaceMedium;\n  padding-top: spaceLarge;\n}\n\n.footer {\n  display: flex;\n  flex-direction: column;\n  background-color: colorBackgroundTertiary;\n  padding: spaceSmall spaceMedium;\n  padding-top: 0;\n  gap: spaceSmall;\n}\n\n.footerSeparator {\n  width: sizeFluid;\n  height: 0;\n  composes: borderTopPrimary from '../../styles/border.module.css';\n}\n\n.footerContent {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  width: sizeFluid;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/TemplateCard/TemplateCard';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "TemplateCard.module.css",
        "TemplateCard.stories.module.css",
        "TemplateCard.stories.tsx",
        "TemplateCard.tsx",
        "index.ts"
      ]
    },
    "Text": {
      "name": "Text",
      "path": "src/components/Text",
      "files": {
        "main": {
          "path": "Text.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { ColorTypes } from '../../types/typography';\nexport interface TextProps {\n    color?: ColorTypes;\n    children?: React.ReactNode;\n    className?: string;\n    highlightedTextClassName?: string;\n    highlightString?: string | string[];\n    caseSensitiveHighlighting?: boolean;\n    highlightWithBackground?: boolean;\n    testId?: string;\n}\nexport interface HighlightTextProps {\n    text: string;\n    highlight: string | string[];\n    highlightClassName?: string;\n    caseSensitiveHighlighting?: boolean;\n    highlightWithBackground?: boolean;\n    testId?: string;\n}\nexport declare const JumboLarge: Flow.AbstractComponent<TextProps, HTMLSpanElement>;\nexport declare const JumboMedium: Flow.AbstractComponent<TextProps, HTMLSpanElement>;\nexport declare const JumboSmall: Flow.AbstractComponent<TextProps, HTMLSpanElement>;\nexport declare const TitleMedium: Flow.AbstractComponent<TextProps, HTMLHeadingElement>;\nexport declare const SubTitleLarge: Flow.AbstractComponent<TextProps, HTMLHeadingElement>;\nexport declare const SubTitleMedium: Flow.AbstractComponent<TextProps, HTMLHeadingElement>;\nexport declare const SubTitleSmall: Flow.AbstractComponent<TextProps, HTMLHeadingElement>;\nexport declare const SubTitleExtraSmall: Flow.AbstractComponent<TextProps, HTMLHeadingElement>;\nexport declare const ButtonTextMedium: Flow.AbstractComponent<TextProps, HTMLSpanElement>;\nexport declare const ButtonTextSmall: Flow.AbstractComponent<TextProps, HTMLSpanElement>;\nexport declare const MenuTextMedium: Flow.AbstractComponent<TextProps, HTMLSpanElement>;\nexport declare const MenuTextSmall: Flow.AbstractComponent<TextProps, HTMLSpanElement>;\nexport declare const ButtonTextExtraSmall: Flow.AbstractComponent<TextProps, HTMLSpanElement>;\nexport declare const ButtonTextMediumUnderline: Flow.AbstractComponent<TextProps, HTMLSpanElement>;\nexport declare const ButtonTextSmallUnderline: Flow.AbstractComponent<TextProps, HTMLSpanElement>;\nexport declare const ButtonTextExtraSmallUnderline: Flow.AbstractComponent<TextProps, HTMLSpanElement>;\nexport declare const FormInputMedium: Flow.AbstractComponent<TextProps, HTMLParagraphElement>;\nexport declare const FormInputSmall: Flow.AbstractComponent<TextProps, HTMLParagraphElement>;\nexport declare const BodyLarge: Flow.AbstractComponent<TextProps, HTMLParagraphElement>;\nexport declare const BodyMedium: Flow.AbstractComponent<TextProps, HTMLParagraphElement>;\nexport declare const BodySmall: Flow.AbstractComponent<TextProps, HTMLParagraphElement>;\nexport declare const BodyLargeBold: Flow.AbstractComponent<TextProps, HTMLParagraphElement>;\nexport declare const BodyMediumBold: Flow.AbstractComponent<TextProps, HTMLParagraphElement>;\nexport declare const BodySmallBold: Flow.AbstractComponent<TextProps, HTMLParagraphElement>;\nexport declare const FormLabelMedium: Flow.AbstractComponent<TextProps, HTMLSpanElement>;\nexport declare const FormLabelSmall: Flow.AbstractComponent<TextProps, HTMLSpanElement>;\n//# sourceMappingURL=Text.d.ts.map"
        },
        "story": {
          "path": "Text.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {Flow} from 'flow-to-typescript-codemod';\n\nimport {TEXT_COLORS} from 'src/types/typography';\n\nimport {\n  BodyLarge,\n  BodyLargeBold,\n  BodyMedium,\n  BodyMediumBold,\n  BodySmall,\n  BodySmallBold,\n  ButtonTextExtraSmall,\n  ButtonTextExtraSmallUnderline,\n  ButtonTextMedium,\n  ButtonTextMediumUnderline,\n  ButtonTextSmall,\n  ButtonTextSmallUnderline,\n  FormInputMedium,\n  FormInputSmall,\n  FormLabelMedium,\n  FormLabelSmall,\n  JumboLarge,\n  JumboMedium,\n  JumboSmall,\n  SubTitleExtraSmall,\n  SubTitleLarge,\n  SubTitleMedium,\n  SubTitleSmall,\n  TitleMedium,\n} from 'src/components/Text';\nimport type {TextProps} from 'src/components/Text/Text';\n\n\nconst DEFAULT_TEXT = 'The quick brown fox jumps over the lazy dog';\nconst colorOptions: Array<unknown> = [...Object.values(TEXT_COLORS)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Tokens/Typography',\n  argTypes: {\n    color: {\n      options: colorOptions,\n      description:\n        'Color of text. Should be one of the predefined color string',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'primary'},\n      },\n    },\n    className: {\n      description: 'External className to be applied on text wrapper',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    children: {\n      description: 'Content to be displayed',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'React.Component | string'},\n      },\n    },\n    highlightString: {\n      description:\n        '`String` that needs to be highlighted. This can either be a **string** or a **string[]**',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: 'string | string[]'},\n      },\n    },\n    highlightedTextClassName: {\n      description: '`Highlighted string` className',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    highlightWithBackground: {\n      description: 'Highlight string with a background color',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'false'},\n      },\n    },\n    caseSensitiveHighlighting: {\n      description: 'Match case while highlighting a `String`',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'false'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Text component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { BodyLarge, BodyMedium, TEXT_COLORS } from \"@spaced-out/ui-design-system/lib/components/Text\";\n\\`\\`\\`\nText Components are simple wrappers on top of h1/h2/h2/p/span tags, classes are also exposed for additional styling.\n\n**Note**: Color can be passed to the text components as a prop(enum). Color accepts predefined set of values. External class overrides\nthe color params.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Text/Text',\n    },\n  },\n};\n\nexport const JumboLargeStory = (\n  args: TextProps,\n): React.ReactElement<\n  React.ComponentProps<Flow.AbstractComponent<TextProps, HTMLSpanElement>>\n> => <JumboLarge {...args}>{args.children}</JumboLarge>;\n\nJumboLargeStory.args = {\n  color: TEXT_COLORS.primary,\n  children: DEFAULT_TEXT,\n  testId: 'jumbo-large-story',\n};\n\nexport const JumboMediumStory = (\n  args: TextProps,\n): React.ReactElement<\n  React.ComponentProps<Flow.AbstractComponent<TextProps, HTMLSpanElement>>\n> => <JumboMedium {...args}>{args.children}</JumboMedium>;\n\nJumboMediumStory.args = {\n  color: TEXT_COLORS.primary,\n  children: DEFAULT_TEXT,\n  testId: 'jumbo-medium-story',\n};\n\nexport const JumboSmallStory = (\n  args: TextProps,\n): React.ReactElement<\n  React.ComponentProps<Flow.AbstractComponent<TextProps, HTMLSpanElement>>\n> => <JumboSmall {...args}>{args.children}</JumboSmall>;\n\nJumboSmallStory.args = {\n  color: TEXT_COLORS.success,\n  children: DEFAULT_TEXT,\n  testId: 'jumbo-small-story',\n};\n\nexport const TitleMediumStory = (\n  args: TextProps,\n): React.ReactElement<\n  React.ComponentProps<Flow.AbstractComponent<TextProps, HTMLHeadingElement>>\n> => <TitleMedium {...args}>{args.children}</TitleMedium>;\n\nTitleMediumStory.args = {\n  color: TEXT_COLORS.secondary,\n  children: DEFAULT_TEXT,\n  testId: 'title-medium-story',\n};\n\nexport const SubTitleLargeStory = (\n  args: TextProps,\n): React.ReactElement<\n  React.ComponentProps<Flow.AbstractComponent<TextProps, HTMLHeadingElement>>\n> => <SubTitleLarge {...args}>{args.children}</SubTitleLarge>;\n\nSubTitleLargeStory.args = {\n  color: TEXT_COLORS.tertiary,\n  children: DEFAULT_TEXT,\n  testId: 'subtitle-large-story',\n};\n\nexport const SubTitleMediumStory = (\n  args: TextProps,\n): React.ReactElement<\n  React.ComponentProps<Flow.AbstractComponent<TextProps, HTMLHeadingElement>>\n> => <SubTitleMedium {...args}>{args.children}</SubTitleMedium>;\n\nSubTitleMediumStory.args = {\n  color: TEXT_COLORS.disabled,\n  children: DEFAULT_TEXT,\n  testId: 'subtitle-medium-story',\n};\n\nexport const SubTitleSmallStory = (\n  args: TextProps,\n): React.ReactElement<\n  React.ComponentProps<Flow.AbstractComponent<TextProps, HTMLHeadingElement>>\n> => <SubTitleSmall {...args}>{args.children}</SubTitleSmall>;\n\nSubTitleSmallStory.args = {\n  color: TEXT_COLORS.information,\n  children: DEFAULT_TEXT,\n  testId: 'subtitle-small-story',\n};\n\nexport const SubTitleExtraSmallStory = (\n  args: TextProps,\n): React.ReactElement<\n  React.ComponentProps<Flow.AbstractComponent<TextProps, HTMLHeadingElement>>\n> => <SubTitleExtraSmall {...args}>{args.children}</SubTitleExtraSmall>;\n\nSubTitleExtraSmallStory.args = {\n  color: TEXT_COLORS.warning,\n  children: DEFAULT_TEXT,\n  testId: 'subtitle-extra-small-story',\n};\n\nexport const ButtonTextMediumStory = (\n  args: TextProps,\n): React.ReactElement<\n  React.ComponentProps<Flow.AbstractComponent<TextProps, HTMLSpanElement>>\n> => <ButtonTextMedium {...args}>{args.children}</ButtonTextMedium>;\n\nButtonTextMediumStory.args = {\n  color: TEXT_COLORS.danger,\n  children: DEFAULT_TEXT,\n  testId: 'button-text-medium-story',\n};\n\nexport const ButtonTextSmallStory = (\n  args: TextProps,\n): React.ReactElement<\n  React.ComponentProps<Flow.AbstractComponent<TextProps, HTMLSpanElement>>\n> => <ButtonTextSmall {...args}>{args.children}</ButtonTextSmall>;\n\nButtonTextSmallStory.args = {\n  color: TEXT_COLORS.clickable,\n  children: DEFAULT_TEXT,\n  testId: 'button-text-small-story',\n};\n\nexport const ButtonTextExtraSmallStory = (\n  args: TextProps,\n): React.ReactElement<\n  React.ComponentProps<Flow.AbstractComponent<TextProps, HTMLSpanElement>>\n> => <ButtonTextExtraSmall {...args}>{args.children}</ButtonTextExtraSmall>;\n\nButtonTextExtraSmallStory.args = {\n  color: TEXT_COLORS.inversePrimary,\n  children: DEFAULT_TEXT,\n  testId: 'button-text-extra-small-story',\n};\n\nexport const ButtonTextMediumUnderlineStory = (\n  args: TextProps,\n): React.ReactElement<\n  React.ComponentProps<Flow.AbstractComponent<TextProps, HTMLSpanElement>>\n> => (\n  <ButtonTextMediumUnderline {...args}>\n    {args.children}\n  </ButtonTextMediumUnderline>\n);\n\nButtonTextMediumUnderlineStory.args = {\n  color: TEXT_COLORS.inverseSecondary,\n  children: DEFAULT_TEXT,\n  testId: 'button-text-medium-underline-story',\n};\n\nexport const ButtonTextSmallUnderlineStory = (\n  args: TextProps,\n): React.ReactElement<\n  React.ComponentProps<Flow.AbstractComponent<TextProps, HTMLSpanElement>>\n> => (\n  <ButtonTextSmallUnderline {...args}>{args.children}</ButtonTextSmallUnderline>\n);\n\nButtonTextSmallUnderlineStory.args = {\n  color: TEXT_COLORS.clickable,\n  children: DEFAULT_TEXT,\n  testId: 'button-text-small-underline-story',\n};\n\nexport const ButtonTextExtraSmallUnderlineStory = (\n  args: TextProps,\n): React.ReactElement<\n  React.ComponentProps<Flow.AbstractComponent<TextProps, HTMLSpanElement>>\n> => (\n  <ButtonTextExtraSmallUnderline {...args}>\n    {args.children}\n  </ButtonTextExtraSmallUnderline>\n);\n\nButtonTextExtraSmallUnderlineStory.args = {\n  color: TEXT_COLORS.clickable,\n  children: DEFAULT_TEXT,\n  testId: 'button-text-extra-small-underline-story',\n};\n\nexport const FormInputMediumStory = (\n  args: TextProps,\n): React.ReactElement<\n  React.ComponentProps<Flow.AbstractComponent<TextProps, HTMLSpanElement>>\n> => <FormInputMedium {...args}>{args.children}</FormInputMedium>;\n\nFormInputMediumStory.args = {\n  color: TEXT_COLORS.clickable,\n  children: DEFAULT_TEXT,\n  testId: 'form-input-medium-story',\n};\n\nexport const FormInputSmallStory = (\n  args: TextProps,\n): React.ReactElement<\n  React.ComponentProps<Flow.AbstractComponent<TextProps, HTMLSpanElement>>\n> => <FormInputSmall {...args}>{args.children}</FormInputSmall>;\n\nFormInputSmallStory.args = {\n  color: TEXT_COLORS.clickable,\n  children: DEFAULT_TEXT,\n  testId: 'form-input-small-story',\n};\n\nexport const BodyLargeStory = (\n  args: TextProps,\n): React.ReactElement<\n  React.ComponentProps<Flow.AbstractComponent<TextProps, HTMLParagraphElement>>\n> => <BodyLarge {...args}>{args.children}</BodyLarge>;\n\nBodyLargeStory.args = {\n  color: TEXT_COLORS.clickable,\n  children: DEFAULT_TEXT,\n  testId: 'body-large-story',\n};\n\nexport const BodyMediumStory = (\n  args: TextProps,\n): React.ReactElement<\n  React.ComponentProps<Flow.AbstractComponent<TextProps, HTMLParagraphElement>>\n> => <BodyMedium {...args}>{args.children}</BodyMedium>;\n\nBodyMediumStory.args = {\n  color: TEXT_COLORS.clickable,\n  children: DEFAULT_TEXT,\n  testId: 'body-medium-story',\n};\n\nexport const BodySmallStory = (\n  args: TextProps,\n): React.ReactElement<\n  React.ComponentProps<Flow.AbstractComponent<TextProps, HTMLParagraphElement>>\n> => <BodySmall {...args}>{args.children}</BodySmall>;\n\nBodySmallStory.args = {\n  color: TEXT_COLORS.clickable,\n  children: DEFAULT_TEXT,\n  testId: 'body-small-story',\n};\n\nexport const BodyLargeBoldStory = (\n  args: TextProps,\n): React.ReactElement<\n  React.ComponentProps<Flow.AbstractComponent<TextProps, HTMLParagraphElement>>\n> => <BodyLargeBold {...args}>{args.children}</BodyLargeBold>;\n\nBodyLargeBoldStory.args = {\n  color: TEXT_COLORS.primary,\n  children: DEFAULT_TEXT,\n  testId: 'body-large-bold-story',\n};\n\nexport const BodyMediumBoldStory = (\n  args: TextProps,\n): React.ReactElement<\n  React.ComponentProps<Flow.AbstractComponent<TextProps, HTMLParagraphElement>>\n> => <BodyMediumBold {...args}>{args.children}</BodyMediumBold>;\n\nBodyMediumBoldStory.args = {\n  color: TEXT_COLORS.secondary,\n  children: DEFAULT_TEXT,\n  testId: 'body-medium-bold-story',\n};\n\nexport const BodySmallBoldStory = (\n  args: TextProps,\n): React.ReactElement<\n  React.ComponentProps<Flow.AbstractComponent<TextProps, HTMLParagraphElement>>\n> => <BodySmallBold {...args}>{args.children}</BodySmallBold>;\n\nBodySmallBoldStory.args = {\n  color: TEXT_COLORS.tertiary,\n  children: DEFAULT_TEXT,\n  testId: 'body-small-bold-story',\n};\n\nexport const FormLabelMediumStory = (\n  args: TextProps,\n): React.ReactElement<\n  React.ComponentProps<Flow.AbstractComponent<TextProps, HTMLSpanElement>>\n> => <FormLabelMedium {...args}>{args.children}</FormLabelMedium>;\n\nFormLabelMediumStory.args = {\n  color: TEXT_COLORS.disabled,\n  children: DEFAULT_TEXT,\n  testId: 'form-label-medium-story',\n};\n\nexport const FormLabelSmallStory = (\n  args: TextProps,\n): React.ReactElement<\n  React.ComponentProps<Flow.AbstractComponent<TextProps, HTMLSpanElement>>\n> => <FormLabelSmall {...args}>{args.children}</FormLabelSmall>;\n\nFormLabelSmallStory.args = {\n  color: TEXT_COLORS.clickable,\n  children: DEFAULT_TEXT,\n  testId: 'form-label-small-story',\n};\nJumboLargeStory.storyName = 'Jumbo Large';\nJumboMediumStory.storyName = 'Jumbo Medium';\nJumboSmallStory.storyName = 'Jumbo Small';\nTitleMediumStory.storyName = 'Title Medium';\nSubTitleLargeStory.storyName = 'Sub Title Large';\nSubTitleMediumStory.storyName = 'Sub Title Medium';\nSubTitleSmallStory.storyName = 'Sub Title Small';\nSubTitleExtraSmallStory.storyName = 'Sub Title Extra Small';\nButtonTextMediumStory.storyName = 'Button Text Medium';\nButtonTextSmallStory.storyName = 'Button Text Small';\nButtonTextExtraSmallStory.storyName = 'Button Text Extra Small';\nButtonTextMediumUnderlineStory.storyName = 'Button Text Medium Underline';\nButtonTextSmallUnderlineStory.storyName = 'Button Text Small Underline';\nButtonTextExtraSmallUnderlineStory.storyName =\n  'Button Text Extra Small Underline';\nFormInputMediumStory.storyName = 'Form Input Medium';\nFormInputSmallStory.storyName = 'Form Input Small';\nBodyLargeStory.storyName = 'Body Large';\nBodyMediumStory.storyName = 'Body Medium';\nBodySmallStory.storyName = 'Body Small';\nBodyLargeBoldStory.storyName = 'Body Large Bold';\nBodyMediumBoldStory.storyName = 'Body Medium Bold';\nBodySmallBoldStory.storyName = 'Body Small Bold';\nFormLabelMediumStory.storyName = 'Form Label Medium';\nFormLabelSmallStory.storyName = 'Form Label Small';\n"
        },
        "css": null,
        "index": {
          "path": "index.d.ts",
          "content": "export { TEXT_COLORS } from '../../types/typography';\nexport type { TextProps } from '../../components/Text/Text';\nexport { BodyLarge, BodyLargeBold, BodyMedium, BodyMediumBold, BodySmall, BodySmallBold, ButtonTextExtraSmall, ButtonTextExtraSmallUnderline, ButtonTextMedium, ButtonTextMediumUnderline, ButtonTextSmall, ButtonTextSmallUnderline, FormInputMedium, FormInputSmall, FormLabelMedium, FormLabelSmall, JumboLarge, JumboMedium, JumboSmall, MenuTextMedium, MenuTextSmall, SubTitleExtraSmall, SubTitleLarge, SubTitleMedium, SubTitleSmall, TitleMedium, } from '../../components/Text/Text';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "HighlightedText.stories.tsx",
        "Text.stories.tsx",
        "Text.tsx",
        "index.ts"
      ]
    },
    "TextTile": {
      "name": "TextTile",
      "path": "src/components/TextTile",
      "files": {
        "main": {
          "path": "TextTile.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\ntype ClassNames = Readonly<{\n    icon?: string;\n    title?: string;\n    wrapper?: string;\n}>;\nexport interface TextTileProps {\n    header?: React.ReactNode;\n    iconName?: string;\n    classNames?: ClassNames;\n    description?: React.ReactNode;\n    testId?: string;\n}\nexport declare const TextTile: Flow.AbstractComponent<TextTileProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=TextTile.d.ts.map"
        },
        "story": {
          "path": "TextTile.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {TextTileProps} from 'src/components/TextTile';\nimport {TextTile} from 'src/components/TextTile/TextTile';\n\nimport css from 'src/components/TextTile/TextTile.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'AI Prompt Components/Text Tile',\n  component: TextTile,\n  argTypes: {\n    classNames: {\n      description: 'External classNames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{wrapper?: string, title?: string, icon?: string}',\n        },\n      },\n    },\n    header: {\n      description: 'The title of the tile',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string | React.ReactNode'},\n      },\n    },\n    description: {\n      description: 'The description of the tile',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string | React.ReactNode'},\n      },\n    },\n    iconName: {\n      description:\n        'Icon Name represents name of icon as supported by fontawesome',\n      type: {required: true},\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'sparkles'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a TextTile component.',\n      description: {\n        component: `\n\\`\\`\\`jsx\nimport { TextTile } from \"@spaced-out/ui-design-system/lib/components/TextTile\";\n\\`\\`\\`\n**TextTile**\n\nThis component serves as the entry point for the AI-powered Copilot chat interface. It features a title with a visually appealing icon and a description.\n\n**Usage:**\n\n\\`\\`\\`jsx\n<TextTile\n  header='Copilot'\n  description='Ask anything to accomplish tasks in Sense.'\n/>\n\\`\\`\\`\n`,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/TextTile/TextTile',\n    },\n  },\n};\n\nexport const TextTileStory = (args: TextTileProps) => (\n  <div className={css.container}>\n    <TextTile {...args} />\n  </div>\n);\n\nTextTileStory.args = {\n  header: 'Copilot',\n  description: 'Ask anything to accomplish tasks in Sense.',\n  testId: 'text-tile-story',\n};\nTextTileStory.storyName = 'Text Tile';\n"
        },
        "css": {
          "path": "TextTile.module.css",
          "content": "@value (\n  spaceSmall,\n  spaceXSmall\n) from '../../styles/variables/_space.css';\n@value (\n  colorFillPrimary,\n  colorInformation\n) from '../../styles/variables/_color.css';\n@value (size44) from '../../styles/variables/_size.css';\n\n.textTileWrapper {\n  display: flex;\n  gap: spaceSmall;\n  flex-direction: column;\n  align-items: center;\n}\n\n.textTileTitle {\n  display: flex;\n  gap: spaceXSmall;\n  justify-content: center;\n  margin-left: calc(-1 * size44);\n}\n\n.sparkles {\n  background: linear-gradient(to right, colorFillPrimary, colorInformation);\n  background-clip: text;\n  -webkit-text-fill-color: transparent;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/TextTile/TextTile';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "TextTile.module.css",
        "TextTile.stories.module.css",
        "TextTile.stories.tsx",
        "TextTile.tsx",
        "index.ts"
      ]
    },
    "Textarea": {
      "name": "Textarea",
      "path": "src/components/Textarea",
      "files": {
        "main": {
          "path": "Textarea.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\ntype ClassNames = Readonly<{\n    box?: string;\n    textarea?: string;\n}>;\nexport interface TextareaProps extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'value' | 'onChange' | 'onFocus' | 'onBlur' | 'onKeyDown' | 'name' | 'disabled' | 'placeholder' | 'locked' | 'error' | 'errorText' | 'label' | 'helperText' | 'classNames' | 'size' | 'required' | 'textCountLimit'> {\n    value?: string;\n    onChange?: (evt: React.ChangeEvent<HTMLTextAreaElement>, isEnter?: boolean) => unknown;\n    onFocus?: (e: React.FocusEvent<HTMLTextAreaElement>) => unknown;\n    onBlur?: (e: React.FocusEvent<HTMLTextAreaElement>) => unknown;\n    onKeyDown?: (e: React.KeyboardEvent<HTMLTextAreaElement>) => unknown;\n    name?: string;\n    disabled?: boolean;\n    placeholder?: string;\n    locked?: boolean;\n    error?: boolean;\n    errorText?: string;\n    label?: string | React.ReactNode;\n    helperText?: string | React.ReactNode;\n    classNames?: ClassNames;\n    size?: 'medium' | 'small';\n    required?: boolean;\n    textCountLimit?: number;\n    testId?: string;\n}\nexport declare const Textarea: Flow.AbstractComponent<TextareaProps, HTMLTextAreaElement>;\nexport {};\n//# sourceMappingURL=Textarea.d.ts.map"
        },
        "story": {
          "path": "Textarea.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {TextareaProps} from 'src/components/Textarea/Textarea';\nimport {Textarea} from 'src/components/Textarea/Textarea';\n\nimport css from 'src/components/Textarea/Textarea.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Form Components/Textarea',\n  component: Textarea,\n  argTypes: {\n    size: {\n      description:\n        'Textarea supports only two size variants namely small and medium. `small` < `medium`',\n      options: ['medium', 'small'],\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    value: {\n      description: 'Value of the textarea',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    name: {\n      description: 'Name of the textarea',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    disabled: {\n      description: 'if **true**, the component is disabled',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    required: {\n      description: 'if **true**, a red star would be added to the label',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    placeholder: {\n      description:\n        'Placeholder of textarea. This appears inside the textarea box',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    locked: {\n      description:\n        'if **true**, the component is locked, Locked state is the readonly state of the input',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    error: {\n      description:\n        'if **true**, the component is moved to error state, Error state displays a red border surrounding textarea',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    errorText: {\n      description:\n        'Error text to be displayed on the bottom of the textarea. This uses `colorTextDanger`',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    label: {\n      description:\n        'Primary label of the textarea. This appears on top of textarea',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    helperText: {\n      description:\n        'Secondary label of the textarea. This appears on bottom of textarea, if the textarea is in `error` state the priority is given to `errorText`, in such cases secondary label wont be displayed',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    classNames: {\n      description: 'External classnames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: '{box?: string, textarea?: string}'},\n      },\n    },\n    textCountLimit: {\n      description:\n        'A limit counter is appended to the top right of textarea. Text area would automatically move to error state if the text count exceeds limit. The counter keeps updating on keydown',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'number'},\n      },\n    },\n    onChange: {\n      description:\n        '**onChange** handler is triggered when there is a change in input value',\n      action: 'changed',\n      table: {\n        type: {\n          summary:\n            'onChange?: ( evt: SyntheticInputEvent<HTMLInputElement>) => mixed',\n        },\n      },\n    },\n    onFocus: {\n      description: '**onFocus** handler is triggered when input is focussed',\n      action: 'focussed',\n      table: {\n        type: {summary: '(e: SyntheticInputEvent<HTMLInputElement>) => mixed'},\n      },\n    },\n    onBlur: {\n      description: '**onBlur** handler is triggered when input is blurred',\n      action: 'blurred',\n      table: {\n        type: {summary: '(e: SyntheticInputEvent<HTMLInputElement>) => mixed'},\n      },\n    },\n    onKeyDown: {\n      description: '**onKeyDown** handler is triggered on keypress',\n      action: 'onKeyDowned',\n      table: {\n        type: {summary: '(e: SyntheticInputEvent<HTMLInputElement>) => mixed'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Textarea component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Textarea } from \"@spaced-out/ui-design-system/lib/components/Textarea\";\n\\`\\`\\`\nBasic textarea component which supports error, disabled and locked states.\nTextarea alo supports a bunch of callbacks listed below.\nTextarea supports helperText prop to pass in the secondary label.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Textarea/Textarea',\n    },\n  },\n};\n\nexport const DefaultStory = (args: TextareaProps) => {\n  const [value, setValue] = React.useState(args.value);\n\n  React.useEffect(() => {\n    setValue(args.value);\n  }, [args.value]);\n\n  return (\n    <div className={css.inputContainer}>\n      <Textarea\n        {...args}\n        onChange={(e) => setValue(e.target.value)}\n        value={value}\n      />\n    </div>\n  );\n};\n\nDefaultStory.args = {\n  label: 'Form Label',\n  placeholder: 'Input Some text here',\n  size: 'medium',\n  testId: 'textarea-default-story',\n};\n\nexport const WithHelperTextStory = (args: TextareaProps) => {\n  const [value, setValue] = React.useState(args.value);\n\n  React.useEffect(() => {\n    setValue(args.value);\n  }, [args.value]);\n\n  return (\n    <div className={css.inputContainer}>\n      <Textarea\n        {...args}\n        onChange={(e) => setValue(e.target.value)}\n        value={value}\n      />\n    </div>\n  );\n};\n\nWithHelperTextStory.args = {\n  label: 'Form Label',\n  placeholder: 'Input Some text here',\n  helperText: 'Gain some help from here',\n  size: 'medium',\n  testId: 'textarea-with-helper-text-story',\n};\n\nexport const RequiredStory = (args: TextareaProps) => {\n  const [value, setValue] = React.useState(args.value);\n\n  React.useEffect(() => {\n    setValue(args.value);\n  }, [args.value]);\n\n  return (\n    <div className={css.inputContainer}>\n      <Textarea\n        {...args}\n        onChange={(e) => setValue(e.target.value)}\n        value={value}\n      />\n    </div>\n  );\n};\n\nRequiredStory.args = {\n  label: 'Form Label',\n  placeholder: 'Input Some text here',\n  required: true,\n  size: 'medium',\n  testId: 'textarea-required-story',\n};\n\nexport const TextCounterStory = (args: TextareaProps) => {\n  const [value, setValue] = React.useState(args.value);\n\n  React.useEffect(() => {\n    setValue(args.value);\n  }, [args.value]);\n\n  return (\n    <div className={css.inputContainer}>\n      <Textarea\n        {...args}\n        onChange={(e) => setValue(e.target.value)}\n        value={value}\n      />\n    </div>\n  );\n};\n\nTextCounterStory.args = {\n  label: 'Form Label',\n  placeholder: 'Input Some text here',\n  helperText:\n    'Text area would automatically move to error state when the text count exceeds limit',\n  size: 'medium',\n  textCountLimit: 500,\n  testId: 'textarea-text-counter-story',\n};\n\nexport const ErrorStory = (args: TextareaProps) => {\n  const [value, setValue] = React.useState(args.value);\n\n  React.useEffect(() => {\n    setValue(args.value);\n  }, [args.value]);\n\n  return (\n    <div className={css.inputContainer}>\n      <Textarea\n        {...args}\n        onChange={(e) => setValue(e.target.value)}\n        value={value}\n      />\n    </div>\n  );\n};\n\nErrorStory.args = {\n  label: 'Form Label',\n  placeholder: 'Input Some text here',\n  required: true,\n  size: 'medium',\n  error: true,\n  errorText: 'This is an error text.',\n  testId: 'textarea-error-story',\n};\nDefaultStory.storyName = 'Default';\nWithHelperTextStory.storyName = 'With Helper Text';\nRequiredStory.storyName = 'Required';\nTextCounterStory.storyName = 'Text Counter';\nErrorStory.storyName = 'Error';\n"
        },
        "css": {
          "path": "Textarea.module.css",
          "content": "@value (\n  size160,\n  size140,\n  sizeFluid\n) from '../../styles/variables/_size.css';\n\n@value (\n  spaceNone,\n  spaceSmall,\n  spaceXSmall,\n  spaceXXSmall\n) from '../../styles/variables/_space.css';\n\n@value (\n  borderRadiusMedium,\n  borderRadiusSmall,\n  borderWidthPrimary,\n  borderWidthTertiary,\n  borderWidthNone\n) from '../../styles/variables/_border.css';\n\n@value (\n  colorTextPrimary,\n  colorTextTertiary,\n  colorBorderPrimary,\n  colorFillPrimary,\n  colorFocusPrimary,\n  colorFocusDanger,\n  colorTextDisabled,\n  colorFillDisabled,\n  colorTextDanger,\n  colorBackgroundTertiary,\n  colorBorderTertiary\n) from '../../styles/variables/_color.css';\n\n.container {\n  color: colorTextPrimary;\n  width: sizeFluid;\n}\n\n.box {\n  display: flex;\n  align-items: center;\n  color: colorTextPrimary;\n  gap: spaceSmall;\n  height: size160;\n  border: borderWidthPrimary solid colorBorderPrimary;\n  background-color: colorBackgroundTertiary;\n}\n\n.wrapper:not(.withError) .box:not(.inputDisabled):not(.locked):hover {\n  border-color: colorBorderTertiary;\n}\n\n.wrapper:not(.withError):focus-within\n  .box:not(.inputDisabled):not(.locked):hover {\n  border-color: colorFillPrimary;\n}\n\n.box textarea {\n  padding: spaceXSmall spaceSmall;\n}\n\n.locked {\n  border-style: dashed;\n}\n\n.medium {\n  composes: formInputMedium from '../../styles/typography.module.css';\n  height: size160;\n  border-radius: borderRadiusMedium;\n}\n\n.small {\n  composes: formInputSmall from '../../styles/typography.module.css';\n  height: size140;\n  border-radius: borderRadiusSmall;\n}\n\n.wrapper.withError .box {\n  border-color: colorTextDanger;\n}\n\n.wrapper.withError:focus-within .box {\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusDanger;\n}\n\n.box textarea {\n  width: sizeFluid;\n  height: sizeFluid;\n  resize: none;\n}\n\n.wrapper:not(.withError):focus-within .box:not(.inputDisabled) {\n  border-color: colorFillPrimary;\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n\n.inputDisabled {\n  color: colorTextDisabled;\n  border-color: colorBorderPrimary;\n  background-color: colorFillDisabled;\n}\n\n:where(.box) textarea::placeholder {\n  color: colorTextTertiary;\n}\n\n.inputDisabled textarea::placeholder {\n  color: inherit;\n}\n\n.wrapper {\n  display: flex;\n  flex-direction: column;\n  width: sizeFluid;\n  gap: spaceXXSmall;\n}\n\n.info {\n  display: flex;\n  justify-content: space-between;\n}\n\n.infoContent {\n  display: flex;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export type { TextareaProps } from '../../components/Textarea/Textarea';\nexport { Textarea } from '../../components/Textarea/Textarea';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "Textarea.module.css",
        "Textarea.stories.module.css",
        "Textarea.stories.tsx",
        "Textarea.tsx",
        "index.ts"
      ]
    },
    "Timeline": {
      "name": "Timeline",
      "path": "src/components/Timeline",
      "files": {
        "main": {
          "path": "Timeline.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nexport declare const ORIENTATION: Readonly<{\n    left: \"left\";\n    right: \"right\";\n}>;\ntype ClassNames = Readonly<{\n    wrapper?: string;\n}>;\nexport type Orientation = (typeof ORIENTATION)[keyof typeof ORIENTATION];\nexport interface TimelineProps {\n    children: React.ReactNode;\n    classNames?: ClassNames;\n    orientation?: Orientation;\n    testId?: string;\n}\nexport declare const Timeline: Flow.AbstractComponent<TimelineProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=Timeline.d.ts.map"
        },
        "story": {
          "path": "Timeline.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {CardContent} from 'src/components/Card';\nimport {SimpleInlineDropdown} from 'src/components/InlineDropdown';\nimport {BodyMedium, BodyMediumBold} from 'src/components/Text';\nimport type {TimelineProps} from 'src/components/Timeline';\nimport {ORIENTATION, Timeline} from 'src/components/Timeline/Timeline';\nimport {TimelineItem} from 'src/components/Timeline/TimelineItem';\n\nimport css from 'src/components/Timeline/Timeline.stories.module.css';\n\n\nconst orientationOptions: Array<unknown> = [...Object.values(ORIENTATION)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Timeline/Timeline',\n  component: Timeline,\n  argTypes: {\n    classNames: {\n      description: 'Provide an optional className to be applied to the wrapper',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{wrapper?: string}',\n        },\n      },\n    },\n    orientation: {\n      control: {type: 'select'},\n      options: orientationOptions,\n      description: 'The main content\\'s placement with respect to the timeline.',\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: ORIENTATION.left},\n        disable: true, // to hide argType's row from the table\n      },\n    },\n    children: {\n      description:\n        'A list of `TimelineItem` components to be displayed as timeline.',\n      type: {required: true},\n      table: {\n        type: {\n          summary: 'React.Node',\n        },\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Timeline component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport type {TimelineProps} from '@spaced-out/ui-design-system/lib/components/Timeline';\nimport {Timeline, TimelineItem} from '@spaced-out/ui-design-system/lib/components/Timeline';\n\\`\\`\\`\n\nThe timeline component displays events in chronological order, showing dates and descriptions to track progress over time.\n\n### Usage\n\nThe Timeline component takes in the following props:\n\n\\`\\`\\`jsx\n<Timeline\n  orientation=\"left\"\n  classNames={{}}\n>\n  {/* TimelineItem components go here */}\n</Timeline>\n\\`\\`\\`\n\nThe Timeline component should be used with one or more TimelineItem components as children. Each TimelineItem component represents an individual event in the Timeline. The TimelineItem component is responsible for rendering the TimelineItem title and content. Make sure to import the TimelineItem component as well.\n\n### TimelineItem Component\n\nThe TimelineItem component represents a single Event within the Timeline. It should be used as a child component of the Timeline. Each TimelineItem component can have its own unique icon, title and content.\n\n\\`\\`\\`jsx\nimport { TimelineItem } from \"@spaced-out/ui-design-system/lib/components/Timeline\";\n\n<Timeline orientation=\"left / right\">\n  <TimelineItem id=\"convocation\" iconName=\"calendar\" title=\"Convocation 2024\" classNames={{wrapper: css.timelineItemWrapper}}>\n    {/* TimelineItem content go here */}\n  </TimelineItem>\n  {/* Add more TimelineItem components for additional events */}\n</Timeline>\n\\`\\`\\`\n\nPlease note that the TimelineItem component should be imported separately in order to use it within the Timeline component.\n\nRemember to customize the props, title, and content according to your specific use case.`,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Timeline/Timeline',\n    },\n  },\n};\n\nexport const TimelineStory = (args: TimelineProps) => (\n  <Timeline {...args}>\n    <TimelineItem\n      iconName=\"calendar\"\n      title=\"Yesterday\"\n      description=\"Wed, June 28\"\n      testId=\"timeline-item-yesterday\"\n    >\n      <CardContent className={css.content}>\n        <BodyMediumBold>Aristotle</BodyMediumBold>\n        <BodyMedium color=\"secondary\">\n          Happiness depends upon ourselves.\n        </BodyMedium>\n      </CardContent>\n    </TimelineItem>\n    <TimelineItem\n      iconName=\"calendar\"\n      title=\"Today\"\n      description=\"Wed, June 29\"\n      testId=\"timeline-item-today\"\n    >\n      <CardContent className={css.content}>\n        <BodyMediumBold>Nelson Mandela</BodyMediumBold>\n        <BodyMedium color=\"secondary\">\n          It always seems impossible until it's done.\n        </BodyMedium>\n      </CardContent>\n    </TimelineItem>\n    <TimelineItem\n      iconName=\"calendar\"\n      title=\"Tomorrow\"\n      description=\"Wed, June 30\"\n      testId=\"timeline-item-tomorrow\"\n    >\n      <CardContent className={css.content}>\n        <BodyMediumBold>Mahatma Gandhi</BodyMediumBold>\n        <BodyMedium color=\"secondary\">\n          Live as if you were to die tomorrow.\n        </BodyMedium>\n      </CardContent>\n    </TimelineItem>\n    <TimelineItem\n      iconName=\"calendar\"\n      title=\"Next month\"\n      description=\"Wed, July 1\"\n      testId=\"timeline-item-next-month\"\n    >\n      <CardContent className={css.content}>\n        <BodyMediumBold>Martin Luther King Jr. </BodyMediumBold>\n        <BodyMedium color=\"secondary\">\n          The time is always right to do what is right.\n        </BodyMedium>\n      </CardContent>\n    </TimelineItem>\n  </Timeline>\n);\n\nconst DATE_OPTIONS = [\n  {\n    key: 'today',\n    label: 'Today',\n  },\n  {\n    key: 'yesterday',\n    label: 'Yesterday',\n  },\n  {\n    key: 'last-week',\n    label: 'Last week',\n  },\n  {\n    key: 'last-month',\n    label: 'Last month',\n  },\n  {\n    key: 'beginning',\n    label: 'The very beginning',\n  },\n];\n\nconst DropdownComponent = ({id}: {id: string}) => (\n  <SimpleInlineDropdown\n    size=\"small\"\n    children={id}\n    options={DATE_OPTIONS.filter(({label}) => label !== id)}\n    onOptionSelect={(option) => {\n      const elementId = option.key;\n      const element = document.getElementById(elementId);\n      if (element) {\n        element.scrollIntoView({\n          behavior: 'smooth',\n          block: 'start',\n        });\n      }\n    }}\n  />\n);\n\nconst DummyContent = ({count}: {count: number}) => (\n  <CardContent className={css.content}>\n    <BodyMediumBold>Timeline Item {count}</BodyMediumBold>\n    <BodyMedium color=\"secondary\">\n      Cupcake ipsum dolor. Sit amet candy canes powder cotton candy. Gummy bears\n      cotton candy halvah candy canes. Sweet roll lollipop tootsie roll\n      cheesecake marshmallow macaroon chocolate bar biscuit candy.\n    </BodyMedium>\n  </CardContent>\n);\n\nexport const DynamicTimelineStory = (args: TimelineProps) => (\n  <Timeline {...args}>\n    <TimelineItem\n      id=\"today\"\n      title=\"Today\"\n      iconName=\"calendar\"\n      description=\"7:12 AM\"\n      parentComponent={<DropdownComponent id=\"Today\" />}\n      testId=\"dynamic-timeline-item-today\"\n    >\n      <DummyContent count={1} />\n    </TimelineItem>\n    <TimelineItem\n      title=\"Today\"\n      description=\"1:12 PM\"\n      iconName=\"calendar\"\n      testId=\"dynamic-timeline-item-today-2\"\n    >\n      <DummyContent count={2} />\n    </TimelineItem>\n    <TimelineItem\n      title=\"Today\"\n      description=\"5:24 PM\"\n      iconName=\"calendar\"\n      testId=\"dynamic-timeline-item-today-3\"\n    >\n      <DummyContent count={3} />\n    </TimelineItem>\n    <TimelineItem\n      id=\"yesterday\"\n      title=\"Yesterday\"\n      iconName=\"calendar\"\n      description=\"May 8, 2024, 8:00 AM\"\n      parentComponent={<DropdownComponent id=\"Yesterday\" />}\n      testId=\"dynamic-timeline-item-yesterday\"\n    >\n      <DummyContent count={4} />\n    </TimelineItem>\n    <TimelineItem\n      title=\"Yesterday\"\n      description=\"May 8, 2024, 12:01 PM\"\n      iconName=\"calendar\"\n      testId=\"dynamic-timeline-item-yesterday-2\"\n    >\n      <DummyContent count={5} />\n    </TimelineItem>\n    <TimelineItem\n      id=\"last-week\"\n      title=\"Last week\"\n      iconName=\"calendar\"\n      description=\"May 2, 2024\"\n      parentComponent={<DropdownComponent id=\"Last week\" />}\n      testId=\"dynamic-timeline-item-last-week\"\n    >\n      <DummyContent count={6} />\n    </TimelineItem>\n    <TimelineItem\n      id=\"last-month\"\n      title=\"Last month\"\n      iconName=\"calendar\"\n      description=\"Apr 12, 2024\"\n      parentComponent={<DropdownComponent id=\"Last month\" />}\n      testId=\"dynamic-timeline-item-last-month\"\n    >\n      <DummyContent count={7} />\n    </TimelineItem>\n    <TimelineItem\n      id=\"beginning\"\n      title=\"Beginning\"\n      iconName=\"calendar\"\n      description=\"Jan 1, 2024\"\n      parentComponent={<DropdownComponent id=\"The very beginning\" />}\n      testId=\"dynamic-timeline-item-beginning\"\n    >\n      <DummyContent count={8} />\n    </TimelineItem>\n  </Timeline>\n);\nTimelineStory.storyName = 'Timeline';\nDynamicTimelineStory.storyName = 'Dynamic Timeline';\n"
        },
        "css": {
          "path": "Timeline.module.css",
          "content": "@value (\n  size26\n) from '../../styles/variables/_size.css';\n@value (\n  spaceXXSmall,\n  spaceMedium,\n  spaceXSmall,\n  spaceSmall,\n  spaceFluid,\n  spaceNone\n) from '../../styles/variables/_space.css';\n@value (\n  colorBorderPrimary,\n  colorInformationLightest\n) from '../../styles/variables/_color.css';\n@value (\n  borderWidthPrimary,\n  borderRadiusCircle\n) from '../../styles/variables/_border.css';\n\n.timelineWrapper {\n  display: flex;\n  box-sizing: border-box;\n  flex-direction: column;\n  justify-content: space-between;\n  gap: spaceSmall;\n}\n\n.timelineItemWrapper {\n  display: flex;\n  gap: spaceSmall;\n  box-sizing: border-box;\n  flex-direction: column;\n  justify-content: space-between;\n  align-items: var(--align);\n\n  /* According to the design specification, the last timeline item's content will not have any space at the bottom. */\n  &:last-child .timelineItemContent .timelineItemEventDetails {\n    margin-bottom: spaceNone;\n  }\n}\n\n.timelineItemIconWrapper {\n  display: flex;\n  gap: spaceXXSmall;\n  flex-direction: column;\n}\n\n.timelineItemIcon {\n  width: size26;\n  height: size26;\n  border-radius: borderRadiusCircle;\n  background-color: colorInformationLightest;\n}\n\n.timelineItemContent {\n  display: flex;\n  gap: spaceSmall;\n  width: spaceFluid;\n  flex-direction: var(--direction);\n}\n\n.timelineItemBorder {\n  display: flex;\n  width: size26;\n  flex: 1;\n  box-sizing: border-box;\n  justify-content: center;\n\n  & .border {\n    height: spaceFluid;\n    border-left: borderWidthPrimary dashed colorBorderPrimary;\n  }\n}\n\n.timelineItemEventDetails {\n  display: flex;\n  gap: spaceXSmall;\n  width: spaceFluid;\n  flex-direction: column;\n  margin-bottom: spaceMedium;\n\n  & .timelineItemInfo {\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    align-items: var(--align);\n    min-height: size26;\n  }\n}\n\n.timelineItemTitle {\n  composes: bodyMedium from '../../styles/typography.module.css';\n}\n\n.timelineItemDescription {\n  composes: bodySmall from '../../styles/typography.module.css';\n  composes: secondary from '../../styles/typography.module.css';\n}\n\n.timelineItemCardWrapper {\n  width: spaceFluid;\n}\n\n.timelineItemLoader {\n  display: flex;\n  width: spaceFluid;\n  justify-content: center;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Timeline/Timeline';\nexport * from '../../components/Timeline/TimelineItem';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "TimelineItem/TimelineItem.d.ts": {
            "path": "TimelineItem/TimelineItem.d.ts",
            "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { ColorTypes } from '../../../types/typography';\nimport type { IconType } from '../../../components/Icon';\nimport type { Orientation } from '../../../components/Timeline/Timeline';\ntype ClassNames = Readonly<{\n    card?: string;\n    icon?: string;\n    title?: string;\n    wrapper?: string;\n    description?: string;\n}>;\nexport interface TimelineItemProps {\n    id?: string;\n    last?: boolean;\n    title?: React.ReactNode;\n    iconName: string;\n    children: React.ReactNode;\n    iconType?: IconType;\n    iconColor?: ColorTypes;\n    classNames?: ClassNames;\n    description?: React.ReactNode;\n    orientation?: Orientation;\n    parentComponent?: React.ReactNode;\n    enableCardWrapper?: boolean;\n    testId?: string;\n}\nexport declare const TimelineItem: Flow.AbstractComponent<TimelineItemProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=TimelineItem.d.ts.map"
          },
          "TimelineItem/index.d.ts": {
            "path": "TimelineItem/index.d.ts",
            "content": "export * from '../../../components/Timeline/TimelineItem/TimelineItem';\n//# sourceMappingURL=index.d.ts.map"
          }
        }
      },
      "allFiles": [
        "Timeline.module.css",
        "Timeline.stories.module.css",
        "Timeline.stories.tsx",
        "Timeline.tsx",
        "TimelineItem/TimelineItem.stories.tsx",
        "TimelineItem/TimelineItem.tsx",
        "TimelineItem/index.ts",
        "index.ts"
      ]
    },
    "Toast": {
      "name": "Toast",
      "path": "src/components/Toast",
      "files": {
        "main": {
          "path": "Toast.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    time?: string;\n}>;\nexport declare const TOAST_SEMANTIC: Readonly<{\n    success: \"success\";\n    information: \"information\";\n    warning: \"warning\";\n    danger: \"danger\";\n    primary: \"primary\";\n}>;\nexport type ToastSemanticType = (typeof TOAST_SEMANTIC)[keyof typeof TOAST_SEMANTIC];\nexport interface ToastProps {\n    classNames?: ClassNames;\n    children?: React.ReactNode;\n    time?: string;\n    semantic?: ToastSemanticType;\n    onClose?: () => void;\n    initialFocus?: number;\n    customIcon?: React.ReactNode;\n    hideCloseIcon?: boolean;\n    testId?: string;\n}\nexport interface ToastTitleProps {\n    children?: React.ReactNode;\n    className?: string;\n    testId?: string;\n}\nexport declare const ToastTitle: Flow.AbstractComponent<ToastTitleProps, HTMLDivElement>;\nexport interface ToastBodyProps {\n    children?: React.ReactNode;\n    className?: string;\n    testId?: string;\n}\nexport declare const ToastBody: Flow.AbstractComponent<ToastBodyProps, HTMLDivElement>;\nexport interface ToastFooterProps {\n    children?: React.ReactNode;\n    onClose?: () => void;\n    testId?: string;\n}\nexport declare const ToastFooter: {\n    ({ children, onClose, testId }: ToastFooterProps): React.JSX.Element | null;\n    displayName: string;\n};\nexport declare const Toast: ({ classNames, children, time, semantic, onClose, initialFocus, customIcon, hideCloseIcon, testId, }: ToastProps) => React.JSX.Element;\nexport {};\n//# sourceMappingURL=Toast.d.ts.map"
        },
        "story": {
          "path": "Toast.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {Button} from 'src/components/Button/Button';\nimport {Icon} from 'src/components/Icon';\nimport {TEXT_COLORS} from 'src/components/Text';\nimport type {ToastProps} from 'src/components/Toast';\nimport {\n  Toast,\n  TOAST_SEMANTIC,\n  toastApi,\n  ToastBody,\n  ToastContainer,\n  ToastFooter,\n  ToastTitle,\n} from 'src/components/Toast';\n\nimport css from 'src/components/Toast/Toast.stories.module.css';\n\n\nconst semanticOptions: Array<unknown> = [...Object.values(TOAST_SEMANTIC)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Toast',\n  argTypes: {\n    semantic: {\n      options: semanticOptions,\n      description: 'Semantic type of Toast card',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: TOAST_SEMANTIC.success},\n      },\n    },\n    hideCloseIcon: {\n      description: 'Hide the close icon',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    time: {\n      description: 'Pass the time string after converting it right format',\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: null},\n      },\n    },\n    initialFocus: {\n      description:\n        'Which element to initially focus. Can be a number (tabbable index as specified by the order)',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: '-1'},\n      },\n    },\n    customIcon: {\n      description: 'Pass the custom Icon component',\n      table: {\n        type: {summary: 'React.Node'},\n        defaultValue: {summary: null},\n      },\n    },\n    classNames: {\n      description:\n        'Provide an optional className to be applied to the wrapper, time',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{wrapper?: string, time?: string}',\n        },\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Toast component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport {\n  Toast,\n  TOAST_SEMANTIC,\n  ToastBody,\n  ToastFooter,\n  ToastTitle,\n  toastApi\n} from \"@spaced-out/ui-design-system/lib/components/Toast\";\n\\`\\`\\`\n  There are two parts of toast component\\n\n1. One is, how you create a toast card of different semantics, you can create toast card like below(Click on show code to check sample code)\n\n\\`\\`\\`jsx\nconst toastJsx =\n<Toast>\n  <ToastTitle> </ToastTitle>\n  <ToastBody> </ToastBody>\n  <ToastFooter> </ToastFooter>\n</Toast>\n\\`\\`\\`\n\n2. Second is, how you show and manage the toast in your app.\n\n\\`\\`\\`jsx\nimport {ToastContainer} and add <ToastContainer></ToastContainer>\n\\`\\`\\`\nonce in your application tree.\nIf you can't figure out where to put it, rendering it in the application root would be the best bet\n\n\\`\\`\\`jsx\nimport {toastApi}\n// now use\nconst toastId = toastApi.show(toastJsx)\n\\`\\`\\`\n\nif you want to remove the toast then use toastApi.remove and pass the toastId returned while adding the toast.\n\\`toastApi.remove(toastId);\\`\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Toast/Toast',\n    },\n  },\n};\n\nexport const ToastStory = (args: ToastProps) => {\n  const toast1 = (\n    <Toast semantic={TOAST_SEMANTIC.success} {...args}>\n      <ToastTitle>Toast Title Sample</ToastTitle>\n      <ToastBody>The quick brown fox jumps over the lazy dog</ToastBody>\n      <ToastFooter>\n        <Button\n          children=\"Dismiss\"\n          onClick={() => {\n            // eslint-disable-next-line no-console\n            console.log('Secondary Action Clicked');\n          }}\n          testId=\"toast-dismiss-button\"\n        />\n        <Button\n          children=\"Primary Action\"\n          onClick={() => {\n            // eslint-disable-next-line no-console\n            console.log('Primary Action Clicked');\n          }}\n          testId=\"toast-primary-action-button\"\n        />\n      </ToastFooter>\n    </Toast>\n  );\n\n  const toast2 = (\n    <Toast {...args} semantic={TOAST_SEMANTIC.danger}>\n      <ToastTitle>Danger Toast </ToastTitle>\n      <ToastBody>The quick brown fox jumps over the lazy dog</ToastBody>\n    </Toast>\n  );\n\n  const toast3 = (\n    <Toast {...args} semantic={TOAST_SEMANTIC.warning}>\n      <ToastTitle>Warning Toast</ToastTitle>\n      <ToastBody>The quick brown fox jumps over the lazy dog</ToastBody>\n    </Toast>\n  );\n\n  const toast4 = (\n    <Toast\n      {...args}\n      semantic={TOAST_SEMANTIC.information}\n      customIcon={\n        <Icon name=\"sparkles\" type={'solid'} color={TEXT_COLORS.information} />\n      }\n    >\n      <ToastTitle> Warning Toast </ToastTitle>\n      <ToastBody>The quick brown fox jumps over the lazy dog</ToastBody>\n      <ToastFooter>\n        <Button\n          children=\"Dismiss\"\n          onClick={() => {\n            // eslint-disable-next-line no-console\n            console.log('Secondary Action Clicked');\n          }}\n          testId=\"toast-custom-icon-dismiss-button\"\n        />\n        <Button\n          children=\"Primary Action\"\n          onClick={() => {\n            // eslint-disable-next-line no-console\n            console.log('Primary Action Clicked');\n          }}\n          testId=\"toast-custom-icon-primary-action-button\"\n        />\n      </ToastFooter>\n    </Toast>\n  );\n\n  React.useEffect(() => {\n    try {\n      const toastId = toastApi.show(toast1, {autoClose: false});\n      const timeoutID = setTimeout(() => {\n        toastApi.remove(toastId);\n      }, 10000);\n\n      return () => {\n        clearTimeout(timeoutID);\n      };\n    } catch (error: unknown) {\n      console.error(error);\n    }\n  }, []);\n\n  return (\n    <div className={css.storyContainer}>\n      {toast1}\n      <div className={css.buttonContainer}>\n        <Button\n          size=\"small\"\n          onClick={() =>\n            toastApi.show(toast1, {\n              autoClose: false,\n            })\n          }\n          testId=\"toast-show-action-button\"\n        >\n          Toast With Action\n        </Button>\n        <Button\n          size=\"small\"\n          onClick={() =>\n            toastApi.show(toast3, {\n              timeout: 10000,\n            })\n          }\n          testId=\"toast-show-warning-button\"\n        >\n          Warning Toast\n        </Button>\n        <Button\n          size=\"small\"\n          onClick={() =>\n            toastApi.show(toast2, {\n              timeout: 10000,\n            })\n          }\n          testId=\"toast-show-danger-button\"\n        >\n          Danger Toast\n        </Button>\n        <Button\n          size=\"small\"\n          onClick={() =>\n            toastApi.show(toast4, {\n              timeout: 10000,\n            })\n          }\n          testId=\"toast-show-custom-icon-button\"\n        >\n          Custom Icon Toast\n        </Button>\n      </div>\n      <ToastContainer />\n    </div>\n  );\n};\n\nToastStory.args = {\n  time: 'Today 4:00pm',\n  semantic: TOAST_SEMANTIC.success,\n  initialFocus: 0,\n  testId: 'toast-story',\n};\nToastStory.storyName = 'Toast';\n"
        },
        "css": {
          "path": "Toast.module.css",
          "content": "@value (spaceNone,spaceXXSmall, spaceSmall, spaceMedium) from '../../styles/variables/_space.css';\n\n@value (size24, size400) from '../../styles/variables/_size.css';\n\n@value (\n  colorBorderPrimary,\n  colorBackgroundTertiary,\n  colorTextPrimary,\n  colorTextSecondary\n) from '../../styles/variables/_color.css';\n\n@value (borderWidthPrimary, borderRadiusMedium) from '../../styles/variables/_border.css';\n\n.toastContainer {\n  composes: boxShadow1 from '../../styles/shadow.module.css';\n  composes: borderPrimary from '../../styles/border.module.css';\n  display: flex;\n  flex-direction: row;\n  align-items: flex-start;\n  padding: spaceMedium;\n  gap: spaceSmall;\n  width: size400;\n  min-width: size400;\n  border-radius: borderRadiusMedium;\n  background: colorBackgroundTertiary;\n}\n\n.toastMidSection {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  padding: spaceNone;\n  gap: spaceMedium;\n}\n\n.contentWrap {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  padding-top: spaceXXSmall;\n  gap: spaceSmall;\n}\n\n.titleBodyWrap {\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  padding: spaceNone;\n  gap: spaceXXSmall;\n}\n\n.toastBody {\n  composes: bodyMedium from '../../styles/typography.module.css';\n  color: colorTextSecondary;\n}\n\n.toastFooterActions {\n  display: flex;\n  flex-direction: row;\n  align-items: flex-start;\n  gap: spaceSmall;\n}\n\n.closeIcon {\n  margin-left: auto;\n}\n\n.toastTitle {\n  composes: subTitleSmall from '../../styles/typography.module.css';\n  color: colorTextPrimary;\n}\n\n.toastTime {\n  color: colorTextSecondary;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export type { ToastProps, ToastSemanticType } from '../../components/Toast/Toast';\nexport { Toast, TOAST_SEMANTIC, ToastBody, ToastFooter, ToastTitle, } from '../../components/Toast/Toast';\nexport { ToastContainer } from '../../components/Toast/ToastContainer';\nexport { toastApi, toastManager } from '../../components/Toast/ToastManager';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "ToastContainer.d.ts": {
            "path": "ToastContainer.d.ts",
            "content": "import React from 'react';\nexport declare const ToastContainer: () => null | React.ReactPortal;\n//# sourceMappingURL=ToastContainer.d.ts.map"
          },
          "ToastManager.d.ts": {
            "path": "ToastManager.d.ts",
            "content": "import type { CallbackFuncTypes, ContentTypes, ToastOptions } from '../../types/toast';\nexport declare const POSITIONS: {\n    readonly TOP_CENTER: \"topCenter\";\n    readonly TOP_LEFT: \"topLeft\";\n    readonly TOP_RIGHT: \"topRight\";\n    readonly BOTTOM_LEFT: \"bottomLeft\";\n    readonly BOTTOM_RIGHT: \"bottomRight\";\n    readonly BOTTOM_CENTER: \"bottomCenter\";\n};\nexport declare const ACTIONS: {\n    readonly ADD: \"ADD\";\n    readonly REMOVE: \"REMOVE\";\n};\nexport declare const toastManager: {\n    add: (content: ContentTypes, options?: ToastOptions) => string;\n    remove: (id: string) => boolean;\n    subscribe: (callback: CallbackFuncTypes) => void;\n};\nexport declare const toastApi: {\n    readonly show: (content: ContentTypes, options?: ToastOptions) => string;\n    readonly remove: (id: string) => boolean;\n};\n//# sourceMappingURL=ToastManager.d.ts.map"
          }
        }
      },
      "allFiles": [
        "Toast.module.css",
        "Toast.stories.module.css",
        "Toast.stories.tsx",
        "Toast.tsx",
        "ToastContainer.module.css",
        "ToastContainer.tsx",
        "ToastManager.ts",
        "index.ts"
      ]
    },
    "Toggle": {
      "name": "Toggle",
      "path": "src/components/Toggle",
      "files": {
        "main": {
          "path": "Toggle.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\n/**\n * Note:\n * Do not wrap Toggle in a label. For simplicity's sake, Toggle uses an\n * internal label tag to handle click delegation to the hidden input, and\n * nesting labels is a bad idea.\n */\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    label?: string;\n}>;\nexport interface ToggleProps {\n    name?: string;\n    classNames?: ClassNames;\n    children?: React.ReactNode;\n    checked?: boolean;\n    onChange?: (arg1: {\n        value: string;\n        checked: boolean;\n    }) => unknown;\n    disabled?: boolean;\n    focused?: boolean;\n    value?: string;\n    ariaLabel?: string;\n    labelPosition?: 'left' | 'right';\n    testId?: string;\n}\nexport declare const Toggle: Flow.AbstractComponent<ToggleProps, HTMLInputElement>;\nexport {};\n//# sourceMappingURL=Toggle.d.ts.map"
        },
        "story": {
          "path": "Toggle.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {Avatar} from 'src/components/Avatar';\nimport {ButtonTextMedium} from 'src/components/Text';\nimport type {ToggleProps} from 'src/components/Toggle/Toggle';\nimport {Toggle} from 'src/components/Toggle/Toggle';\nimport {Truncate} from 'src/components/Truncate';\n\nimport css from 'src/components/Toggle/Toggle.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Form Components/Toggle',\n  component: Toggle,\n  argTypes: {\n    name: {\n      description: 'Specify the name of the underlying `input` node',\n    },\n    value: {\n      description:\n        'The value to be used in the input type checkbox internally. This is the value that will be returned on form submission',\n      name: 'value',\n      table: {\n        type: {summary: 'string'},\n      },\n      control: {\n        disable: true,\n      },\n    },\n    // controlled checked prop\n    checked: {\n      table: {\n        type: {summary: 'boolean'},\n      },\n    },\n    disabled: {\n      description: 'if **true**, the component is disabled',\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    focused: {\n      description: 'if **true**, the component is focussed',\n      options: [false, true],\n      control: 'boolean',\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    labelPosition: {\n      description: 'Position of the label',\n      options: ['left', 'right'],\n      control: 'radio',\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'right'},\n      },\n    },\n    classNames: {\n      description: 'External classNames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: '{wrapper?: string, label?: string}'},\n      },\n    },\n    children: {\n      description: 'The label of the Toggle',\n      table: {\n        type: {summary: 'React.Component | string'},\n      },\n    },\n    onChange: {\n      description: '**onChange** handler that is applied to the element',\n      action: 'selected',\n      type: {summary: '({value: string, checked: boolean}) => mixed'},\n    },\n    ariaLabel: {\n      description:\n        'Pass label as ariaLabel. It is mandatory parameter for accessibility in case children is not a simple string.',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Toggle component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Toggle } from \"@spaced-out/ui-design-system/lib/components/Toggle\";\n\\`\\`\\`\nToggle changes the state of a single setting on or off.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Toggle/Toggle',\n    },\n  },\n};\n\nexport const ToggleStory = (args: ToggleProps) => {\n  const [selected, setSelected] = React.useState(args.checked);\n  const onChangeHandler = ({\n    value,\n    checked,\n  }: {\n    value: string;\n    checked: boolean;\n  }): void => {\n    args.onChange?.({value, checked});\n\n    setSelected(checked);\n  };\n  return (\n    <div className={css.storyContainer}>\n      <Toggle {...args} onChange={onChangeHandler} checked={selected} />\n    </div>\n  );\n};\n\nToggleStory.args = {\n  name: 'sample-toggle',\n  disabled: false,\n  focused: false,\n  children: 'Toggle Label',\n  checked: false,\n  value: 'sample-value',\n  labelPosition: 'left',\n  testId: 'toggle-story',\n};\n\nexport const CustomToggleStory = (args: ToggleProps) => {\n  const [selected, setSelected] = React.useState(args.checked);\n  const onChangeHandler = ({\n    value,\n    checked,\n  }: {\n    value: string;\n    checked: boolean;\n  }): void => {\n    args.onChange?.({value, checked});\n\n    setSelected(checked);\n  };\n  return (\n    <div className={css.storyContainer}>\n      <Toggle\n        {...args}\n        onChange={onChangeHandler}\n        checked={selected}\n        classNames={{label: css.toggleLabel}}\n      >\n        <Avatar\n          iconType=\"regular\"\n          size=\"small\"\n          text={'Toggle Label'}\n          color={'green'}\n        />\n        <ButtonTextMedium color=\"secondary\">\n          <Truncate>{'Toggle Label'}</Truncate>\n        </ButtonTextMedium>\n      </Toggle>\n    </div>\n  );\n};\n\nCustomToggleStory.args = {\n  name: 'sample-toggle',\n  disabled: false,\n  focused: false,\n  children: 'Toggle Label',\n  checked: false,\n  value: 'sample-value',\n  ariaLabel: 'Toggle Label',\n  labelPosition: 'left',\n  testId: 'custom-toggle-story',\n};\nToggleStory.storyName = 'Toggle';\nCustomToggleStory.storyName = 'Custom Toggle';\n"
        },
        "css": {
          "path": "Toggle.module.css",
          "content": "@value (\n  borderWidthNone,\n  borderWidthTertiary,\n  borderRadiusMedium,\n  borderRadiusLarge\n) from '../../styles/variables/_border.css';\n\n@value (\n  colorBackgroundTertiary,\n  colorBorderSecondary,\n  colorFillPrimary,\n  colorFillDisabled,\n  colorFocusPrimary,\n  colorBorderSecondary\n) from '../../styles/variables/_color.css';\n\n@value (\n  motionDurationSlow\n) from '../../styles/variables/_motion.css';\n\n@value (\n  spaceNone,\n  spaceXXSmall,\n  spaceMedium\n) from '../../styles/variables/_space.css';\n\n@value (\n  shadowBoxShadow1X,\n  shadowBoxShadow1Y,\n  shadowBoxShadow1Blur,\n  shadowBoxShadow1Spread,\n  shadowBoxShadow1Color ) from '../../styles/variables/_shadow.css';\n\n@value (\n  size10,\n  size18,\n  size24,\n  size36,\n  size40\n) from '../../styles/variables/_size.css';\n\n.container {\n  position: relative;\n  display: flex;\n  gap: spaceMedium;\n  height: size24;\n  align-items: center;\n  cursor: pointer;\n}\n\n.disabled {\n  cursor: not-allowed;\n}\n\n.toggleWrap input[type='checkbox'] {\n  opacity: 0;\n  position: absolute;\n  width: size36;\n  height: size18;\n}\n\n.toggleWrap input[type='checkbox']:disabled {\n  cursor: not-allowed;\n  pointer-events: none;\n}\n\n.toggleWrap {\n  width: size40;\n  height: size24;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.toggle {\n  position: relative;\n  width: size36;\n  height: size18;\n  box-sizing: border-box;\n  cursor: pointer;\n  transition: motionDurationSlow;\n  background: colorBorderSecondary;\n  border-radius: borderRadiusLarge;\n}\n\n.toggle::before {\n  position: absolute;\n  content: '';\n  height: size10;\n  width: size10;\n  margin: auto;\n  top: spaceNone;\n  bottom: spaceNone;\n  left: spaceXXSmall;\n  transition: motionDurationSlow;\n  background: colorBackgroundTertiary;\n  border-radius: borderRadiusMedium;\n}\n\n.container input:checked + .toggle::before {\n  transform: translateX(size18);\n}\n\n.container input:checked + .toggle {\n  background-color: colorFillPrimary;\n}\n\n.container input:focus + .toggle {\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n\n.container input:active + .toggle {\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n\n/* disabled/unchecked */\n.disabledButton {\n  pointer-events: none;\n  cursor: not-allowed;\n  background: colorFillDisabled;\n}\n\n.disabledButton::before {\n  background: colorBorderSecondary;\n}\n\n/* disabled/checked */\n.container input[type='checkbox']:checked + .disabled {\n  border: borderWidthNone;\n  background: colorFillDisabled;\n  cursor: not-allowed;\n}\n\n.container input[type='checkbox']:checked + .disabled::before {\n  background: colorBorderSecondary;\n}\n\n.toggleLabel {\n  composes: formLabelMedium from '../../styles/typography.module.css';\n  composes: secondary from '../../styles/typography.module.css';\n  margin-left: spaceNone;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Toggle/Toggle';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "Toggle.module.css",
        "Toggle.stories.module.css",
        "Toggle.stories.tsx",
        "Toggle.tsx",
        "index.ts"
      ]
    },
    "TokenListInput": {
      "name": "TokenListInput",
      "path": "src/components/TokenListInput",
      "files": {
        "main": {
          "path": "TokenListInput.d.ts",
          "content": "import * as React from 'react';\nimport type { ClickAwayRefType } from '../../utils/click-away/click-away';\nimport type { InputProps } from '../../components/Input';\nimport type { BaseMenuProps } from '../../components/Menu';\nimport type { ResolveTokenValueProps } from '../../components/TokenListInput/TokenValueChips';\nimport type { ElevationType } from '../../components/Tooltip';\nexport declare const DEFAULT_LIMIT_VALUE = 100;\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    box?: string;\n    input?: string;\n}>;\nexport interface TokenListMenuOptionTypes<T> {\n    options?: Array<T>;\n    groupTitleOptions?: Array<TokenGroupTitleOption<T>>;\n    resolveLabel?: (option: T) => string;\n}\nexport interface TokenGroupTitleOption<T> {\n    groupTitle?: React.ReactNode;\n    options?: Array<T>;\n    showLineDivider?: boolean;\n}\nexport interface TokenListMenuProps<T> extends Omit<BaseMenuProps, 'resolveLabel'>, TokenListMenuOptionTypes<T> {\n    resolveLabel?: (option: T) => string;\n}\nexport interface Props<T> {\n    classNames?: ClassNames;\n    clickAwayRef?: React.RefObject<ClickAwayRefType | null>;\n    disabled?: boolean;\n    error?: boolean;\n    errorText?: string;\n    focusOnMount?: boolean;\n    helperText?: string;\n    inputValue?: string;\n    inputPlaceholder?: string;\n    limit?: number;\n    isLoading?: boolean;\n    locked?: boolean;\n    onChange: (values: Array<T>) => unknown;\n    onInputBlur?: React.FocusEventHandler<HTMLInputElement>;\n    onInputChange?: (value: string) => unknown;\n    onInputFocus?: React.FocusEventHandler<HTMLInputElement>;\n    placeholder?: string;\n    size?: 'medium' | 'small';\n    tabIndex?: number;\n    values: Array<T>;\n    menu?: TokenListMenuProps<T>;\n    onMenuOpen?: () => unknown;\n    onMenuClose?: () => unknown;\n    resolveTokenValue?: (arg1: ResolveTokenValueProps<T>) => React.ReactNode;\n    inputProps?: Omit<InputProps, 'size'>;\n    elevation?: ElevationType;\n    testId?: string;\n    inputRef?: React.RefObject<HTMLInputElement | null>;\n    actionsSlot?: React.ReactNode;\n}\nexport declare function TokenListInput<T>(props: Props<T>): React.JSX.Element;\nexport declare namespace TokenListInput {\n    var displayName: string;\n}\nexport {};\n//# sourceMappingURL=TokenListInput.d.ts.map"
        },
        "story": {
          "path": "TokenListInput.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {useArbitraryOptionAddition} from 'src/hooks/useArbitraryOptionAddition';\nimport {useFilteredOptions} from 'src/hooks/useFilteredOptions';\nimport {classify} from 'src/utils/classify';\n\nimport {Icon} from 'src/components/Icon';\nimport type {MenuOption} from 'src/components/Menu';\nimport {\n  ButtonTextExtraSmallUnderline,\n  FormLabelSmall,\n  TEXT_COLORS,\n} from 'src/components/Text';\nimport type {Props} from 'src/components/TokenListInput/TokenListInput';\nimport {TokenListInput} from 'src/components/TokenListInput/TokenListInput';\nimport {ELEVATION_TYPES, Tooltip} from 'src/components/Tooltip';\n\nimport css from 'src/components/TokenListInput/TokenListInput.stories.module.css';\n\n// Type definitions\ninterface TokenListOption extends Omit<MenuOption, 'arbitrary'> {\n  arbitrary?: boolean;\n}\n\ninterface SimpleTokenOption {\n  label: string;\n  key: string;\n}\n\ninterface GroupTitleOption {\n  groupTitle: React.ReactNode;\n  options: TokenListOption[];\n  showLineDivider?: boolean;\n}\n\ninterface InputProps {\n  id?: string;\n  [key: string]: unknown;\n}\n\nconst elevationOptions: Array<unknown> = [...Object.values(ELEVATION_TYPES)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Form Components/Token List Input',\n  component: TokenListInput,\n  argTypes: {\n    inputRef: {\n      description: 'Ref for the input element.',\n      control: {type: 'object'},\n      table: {type: {summary: 'RefObject<HTMLInputElement>'}},\n    },\n    actionsSlot: {\n      description:\n        'Actions slot to be displayed at the bottom of the input. This is useful if you want the actions to be visible while menu is open.',\n      control: {type: 'object'},\n      table: {type: {summary: 'React.ReactNode'}},\n    },\n    classNames: {\n      description:\n        'Custom class names for styling the wrapper, box, and input.',\n      control: {type: 'object'},\n      table: {\n        type: {summary: '{ wrapper?: string, box?: string, input?: string }'},\n      },\n    },\n    clickAwayRef: {\n      description:\n        'Ref for the click-away handler, used to detect clicks outside the component.',\n      control: false,\n      table: {type: {summary: 'ClickAwayRefType'}},\n    },\n    disabled: {\n      description: 'Disables user interaction with the input and menu.',\n      control: {type: 'boolean'},\n      table: {type: {summary: 'boolean'}, defaultValue: {summary: 'false'}},\n    },\n    elevation: {\n      description:\n        'This is passed to TokenListInput. Elevation level for the dropdown menu controls the z-index stacking order. Default is set to \"modal\" elevation. Use higher elevation levels when rendering the dropdown above other elevated elements like Modal, Toast, etc.',\n      control: {\n        type: 'select',\n      },\n      options: elevationOptions,\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'modal'},\n      },\n    },\n    error: {\n      description:\n        'if **true**, the component is moved to error state, Error state displays a red border surrounding input',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    errorText: {\n      description:\n        'Error text to be displayed on the bottom of the input. This uses `colorTextDanger`',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    focusOnMount: {\n      description:\n        'If true, the input will be focused automatically when the component mounts.',\n      control: {type: 'boolean'},\n      table: {type: {summary: 'boolean'}},\n    },\n    helperText: {\n      description:\n        'Additional information or guidance displayed below the input. Hidden if errorText is present.',\n      control: {type: 'text'},\n      table: {type: {summary: 'string'}},\n    },\n    placeholder: {\n      description:\n        'Placeholder text for the input field. Used if values are empty.',\n      control: {type: 'text'},\n      table: {type: {summary: 'string'}},\n    },\n    inputValue: {\n      description: 'The current value of the input field.',\n      control: {type: 'text'},\n      table: {type: {summary: 'string'}},\n    },\n    inputPlaceholder: {\n      description:\n        'Placeholder text for the input field. Used if provided, otherwise falls back to `placeholder`.',\n      control: {type: 'text'},\n      table: {type: {summary: 'string'}},\n    },\n    limit: {\n      description:\n        'Maximum number of tokens that can be added. When the limit is reached, the input is disabled.',\n      control: {type: 'number'},\n      table: {type: {summary: 'number'}, defaultValue: {summary: '100'}},\n    },\n    isLoading: {\n      description: 'if **true**, the component would add a loader.',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    locked: {\n      description:\n        'If true, the input and tokens are locked and cannot be changed.',\n      control: {type: 'boolean'},\n      table: {type: {summary: 'boolean'}},\n    },\n    onChange: {\n      description: 'Callback fired when the list of selected tokens changes.',\n      control: false,\n      table: {type: {summary: '(values: Array<T>) => mixed'}},\n    },\n    onInputBlur: {\n      description: 'Callback fired when the input loses focus.',\n      control: false,\n      table: {\n        type: {summary: '(e: SyntheticEvent<HTMLInputElement>) => mixed'},\n      },\n    },\n    onInputChange: {\n      description: 'Callback fired when the input value changes.',\n      control: false,\n      table: {type: {summary: '(value: string) => mixed'}},\n    },\n    onInputFocus: {\n      description: 'Callback fired when the input gains focus.',\n      control: false,\n      table: {\n        type: {summary: '(e: SyntheticEvent<HTMLInputElement>) => mixed'},\n      },\n    },\n\n    size: {\n      description:\n        'Controls the overall size of the input field. Choose between \"medium\" (default) and \"small\".',\n      options: ['medium', 'small'],\n      control: {type: 'select'},\n      table: {\n        type: {summary: '\"medium\" | \"small\"'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    tabIndex: {\n      description: 'Tab index for the input field.',\n      control: {type: 'number'},\n      table: {type: {summary: 'number'}},\n    },\n    values: {\n      description: 'The current list of selected tokens.',\n      control: {type: 'object'},\n      table: {type: {summary: 'Array<T>'}},\n    },\n    menu: {\n      description:\n        'Props for the dropdown menu, including options, grouped options, and custom label resolver.',\n      control: {type: 'object'},\n      table: {type: {summary: 'TokenListMenuProps<T>'}},\n    },\n    onMenuOpen: {\n      description: 'Callback fired when the menu is opened.',\n      control: false,\n      table: {type: {summary: '() => mixed'}},\n    },\n    onMenuClose: {\n      description: 'Callback fired when the menu is closed.',\n      control: false,\n      table: {type: {summary: '() => mixed'}},\n    },\n    resolveTokenValue: {\n      description: 'Custom render function for displaying a token value.',\n      control: false,\n      table: {type: {summary: '(ResolveTokenValueProps<T>) => React.Node'}},\n    },\n    inputProps: {\n      description: 'Additional props to spread onto the input element.',\n      control: {type: 'object'},\n      table: {type: {summary: 'InputProps'}},\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle:\n        'A flexible input for managing a list of tokens, supporting both selection from a dropdown and free-form entry.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { TokenListInput } from '@spaced-out/ui-design-system/lib/components/TokenListInput';\n\\`\\`\\`\n\n**TokenListInput** provides a user-friendly interface for entering and managing multiple values as tokens. Users can select from a dropdown menu or add their own custom entries (if enabled). This component is ideal for tagging, multi-select, and similar use cases.\n\n**Features:**\n- Add, remove, and manage tokens with ease\n- Supports both predefined and user-defined (arbitrary) options\n- Customizable option rendering (icons, custom components, etc.)\n- Configurable maximum token limit\n- Disabled and locked states for controlled usage\n- Helper and error text for enhanced user feedback\n\n**Props Overview:**\n- \\`classNames\\`: Custom class names for styling\n- \\`clickAwayRef\\`: Ref for click-away detection\n- \\`disabled\\`: Disables the input and menu\n- \\`errorText\\`: Error message below the input\n- \\`focusOnMount\\`: Auto-focus input on mount\n- \\`helperText\\`: Guidance below the input\n- \\`inputValue\\`: Current input value\n- \\`inputPlaceholder\\`: Placeholder for the input field\n- \\`limit\\`: Maximum number of tokens\n- \\`locked\\`: Locks the input and tokens\n- \\`onChange\\`: Callback for token changes\n- \\`onInputBlur\\`: Callback for input blur\n- \\`onInputChange\\`: Callback for input value change\n- \\`onInputFocus\\`: Callback for input focus\n- \\`placeholder\\`: Fallback placeholder for the input\n- \\`size\\`: Input size (\"medium\" or \"small\")\n- \\`tabIndex\\`: Tab index for the input\n- \\`values\\`: Selected tokens\n- \\`menu\\`: Dropdown menu props\n- \\`onMenuOpen\\`: Callback for menu open\n- \\`onMenuClose\\`: Callback for menu close\n- \\`resolveTokenValue\\`: Custom token renderer\n- \\`inputProps\\`: Additional input props\n\n**Usage Example:**\n\n\\`\\`\\`jsx\n<TokenListInput\n  values={[{ key: 'react', label: 'React' }]}\n  onChange={setValues}\n  inputValue={input}\n  onInputChange={setInput}\n  inputPlaceholder=\"Add a tag\"\n  limit={5}\n  helperText=\"Add up to 5 tags\"\n  errorText=\"\"\n  size=\"medium\"\n  disabled={false}\n  locked={false}\n  menu={{\n    options: [\n      { key: 'react', label: 'React' },\n      { key: 'vue', label: 'Vue' },\n      { key: 'angular', label: 'Angular' },\n    ],\n  }}\n/>\n\\`\\`\\`\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/TokenListInput/TokenListInput',\n    },\n  },\n};\n\nexport const TokenListInputStory = (args: Props<TokenListOption>) => {\n  const options: Array<TokenListOption> = [\n    {key: '1', label: 'Option 1'},\n    {key: '2', label: 'Option 2'},\n    {key: '3', label: 'Option 3'},\n    {key: '4', label: 'Option 4'},\n  ];\n\n  const [values, setValues] = React.useState<Array<TokenListOption>>([\n    {label: 'apple', key: 'ap'},\n    {label: 'b', key: 'b'},\n  ]);\n\n  const [input, setInput] = React.useState('');\n  return (\n    <div className={css.tokenListWrapper}>\n      <TokenListInput\n        {...args}\n        values={values}\n        onChange={setValues}\n        inputValue={input}\n        onInputChange={setInput}\n        menu={{options}}\n      />\n    </div>\n  );\n};\n\nTokenListInputStory.args = {\n  classNames: {wrapper: ''},\n  testId: 'token-list-input',\n};\n\nexport const TokenListInputWithActionsSlotStory = (\n  args: Props<TokenListOption>,\n) => {\n  const options: Array<TokenListOption> = [\n    {key: '1', label: 'Option 1'},\n    {key: '2', label: 'Option 2'},\n    {key: '3', label: 'Option 3'},\n    {key: '4', label: 'Option 4'},\n  ];\n\n  const [values, setValues] = React.useState<Array<TokenListOption>>([\n    {label: 'apple', key: 'ap'},\n    {label: 'b', key: 'b'},\n  ]);\n\n  const [input, setInput] = React.useState('');\n  return (\n    <div className={css.tokenListWrapper}>\n      <TokenListInput\n        {...args}\n        values={values}\n        onChange={setValues}\n        inputValue={input}\n        onInputChange={setInput}\n        menu={{options}}\n      />\n    </div>\n  );\n};\n\nTokenListInputWithActionsSlotStory.args = {\n  classNames: {wrapper: ''},\n  testId: 'token-list-input',\n  actionsSlot: (\n    <div className={css.actionsSlot}>\n      <ButtonTextExtraSmallUnderline color={TEXT_COLORS.clickable}>\n        Add All\n      </ButtonTextExtraSmallUnderline>\n      <ButtonTextExtraSmallUnderline color={TEXT_COLORS.clickable}>\n        Clear All\n      </ButtonTextExtraSmallUnderline>\n    </div>\n  ),\n};\n\nexport const TokenListInputWithErrorStory = (args: Props<TokenListOption>) => {\n  const options: Array<TokenListOption> = [\n    {key: '1', label: 'Eden Porter', iconLeft: 'user'},\n    {key: '2', label: 'Verda Rodgers', iconLeft: 'user'},\n    {key: '3', label: 'Paisley Badman', iconLeft: 'user'},\n    {key: '4', label: 'Miranda Black', iconLeft: 'user'},\n    {key: '5', label: 'Pamela Fennimore', iconLeft: 'user'},\n    {key: '6', label: 'Geneva Rhodes', iconLeft: 'user'},\n    {key: '7', label: 'Rolf Kim', iconLeft: 'user'},\n    {key: '8', label: 'Marsh Saunders', iconLeft: 'user'},\n    {key: '9', label: 'Prunella Webb', iconLeft: 'user'},\n    {key: '10', label: 'Andy Mullins', iconLeft: 'user'},\n    {key: '11', label: 'Jade Watkins', iconLeft: 'user'},\n    {key: '12', label: 'Wally Wolfe', iconLeft: 'user'},\n    {key: '13', label: 'Misty Lipsey', iconLeft: 'user'},\n    {key: '14', label: 'Dwight Gibbs', iconLeft: 'user'},\n    {key: '15', label: 'Ronald Rhodes', iconLeft: 'user'},\n  ];\n\n  const [values, setValues] = React.useState<Array<TokenListOption>>([]);\n  const [input, setInput] = React.useState('');\n  const onChangeHandler = (newValues: Array<TokenListOption>) => {\n    setValues(newValues);\n  };\n\n  return (\n    <div className={css.tokenListWrapper}>\n      <TokenListInput\n        {...args}\n        menu={{options}}\n        values={values}\n        onChange={onChangeHandler}\n        errorText={'This is an error'}\n        helperText=\"Hint text for the users\"\n        inputValue={input}\n        onInputChange={setInput}\n      />\n    </div>\n  );\n};\n\nexport const TokenListInputLockedStory = (args: Props<TokenListOption>) => {\n  const values: Array<TokenListOption> = [\n    {key: '1', label: 'Eden Porter', iconLeft: 'user'},\n    {key: '2', label: 'Verda Rodgers', iconLeft: 'user'},\n    {key: '3', label: 'Paisley Badman', iconLeft: 'user'},\n    {key: '4', label: 'Miranda Black', iconLeft: 'user'},\n    {key: '5', label: 'Pamela Fennimore', iconLeft: 'user'},\n    {key: '6', label: 'Geneva Rhodes', iconLeft: 'user'},\n    {key: '7', label: 'Rolf Kim', iconLeft: 'user'},\n    {key: '8', label: 'Marsh Saunders', iconLeft: 'user'},\n  ];\n  const [input, setInput] = React.useState('');\n  return (\n    <div className={css.tokenListWrapper}>\n      <TokenListInput\n        {...args}\n        values={values}\n        inputValue={input}\n        onInputChange={setInput}\n      />\n    </div>\n  );\n};\n\nTokenListInputLockedStory.args = {\n  locked: true,\n  testId: 'token-list-input-locked',\n};\n\nexport const TokenListInputDisabledStory = (args: Props<TokenListOption>) => {\n  const values: Array<TokenListOption> = [\n    {key: '1', label: 'Eden Porter', iconLeft: 'user'},\n    {key: '2', label: 'Verda Rodgers', iconLeft: 'user'},\n    {key: '3', label: 'Paisley Badman', iconLeft: 'user'},\n    {key: '4', label: 'Miranda Black', iconLeft: 'user'},\n    {key: '5', label: 'Pamela Fennimore', iconLeft: 'user'},\n    {key: '6', label: 'Geneva Rhodes', iconLeft: 'user'},\n    {key: '7', label: 'Rolf Kim', iconLeft: 'user'},\n    {key: '8', label: 'Marsh Saunders', iconLeft: 'user'},\n  ];\n  const [input, setInput] = React.useState('');\n  return (\n    <div className={css.tokenListWrapper}>\n      <TokenListInput\n        {...args}\n        values={values}\n        inputValue={input}\n        onInputChange={setInput}\n      />\n    </div>\n  );\n};\n\nTokenListInputDisabledStory.args = {\n  classNames: {wrapper: css.tokenListInputWrapper},\n  disabled: true,\n  testId: 'token-list-input-disabled',\n};\n\nconst TokenListInputGroupWrap = (args: Props<TokenListOption>) => {\n  const [values, setValues] = React.useState<Array<TokenListOption>>([\n    {label: 'apple', key: 'app'},\n    {label: 'banana', key: 'ban'},\n  ]);\n  const [inputValue, setInputValue] = React.useState('');\n  const {filteredGroupTitleOptions} = useFilteredOptions({\n    searchTerm: inputValue,\n    groupTitleOptions: args.menu?.groupTitleOptions as\n      | GroupTitleOption[]\n      | undefined,\n    excludedKeys: values.map((value) => value.key),\n  });\n  const {groupTitleOptionsWithArbitrary} = useArbitraryOptionAddition({\n    searchTerm: inputValue,\n    groupTitleOptions: filteredGroupTitleOptions,\n    excludedKeys: values.map((value) => value.key),\n    makeArbitraryValue: (value) => ({\n      key: value,\n      label: value,\n      arbitrary: true,\n    }),\n  });\n  return (\n    <div className={css.tokenListWrapper}>\n      <TokenListInput\n        {...args}\n        inputValue={inputValue}\n        onInputChange={setInputValue}\n        values={values}\n        onChange={setValues}\n        menu={{\n          groupTitleOptions: groupTitleOptionsWithArbitrary,\n          resolveLabel: (option: TokenListOption) => {\n            if (option.arbitrary && option.label) {\n              return `Create New \"${option.label}\"`;\n            }\n            return option.label || '';\n          },\n        }}\n      />\n    </div>\n  );\n};\n\nexport const TokenListInputGroupStory = (args: Props<TokenListOption>) => (\n  <TokenListInputGroupWrap {...args} />\n);\n\nTokenListInputGroupStory.args = {\n  menu: {\n    groupTitleOptions: [\n      {\n        groupTitle: () => (\n          <div className={css.titleWrapper}>\n            <FormLabelSmall color=\"tertiary\">Fast Food</FormLabelSmall>\n            <div className={css.infoContainer}>\n              <Tooltip title=\"Hello!\" elevation=\"modal\">\n                <Icon name=\"circle-info\" size=\"small\" color=\"tertiary\" />\n              </Tooltip>\n            </div>\n          </div>\n        ),\n        options: [\n          {\n            key: 'burger',\n            iconLeft: 'burger',\n            label: 'Burger',\n          },\n          {\n            key: 'pizza',\n            iconLeft: 'pizza',\n            label: 'Pizza',\n          },\n          {\n            key: 'fries',\n            iconLeft: 'french-fries',\n            label: 'Fries',\n          },\n        ],\n      },\n      {\n        showLineDivider: true,\n        groupTitle: (\n          <div className={css.titleWrapper}>\n            <FormLabelSmall color=\"tertiary\">Fruits</FormLabelSmall>\n            <div className={css.infoContainer}>\n              <Tooltip title=\"Hello!\" elevation=\"modal\">\n                <Icon name=\"circle-info\" size=\"small\" color=\"tertiary\" />\n              </Tooltip>\n            </div>\n          </div>\n        ) as React.ReactNode,\n        options: [\n          {\n            key: 'banana',\n            iconLeft: 'banana',\n            label: 'Banana',\n          },\n          {\n            key: 'pear',\n            iconLeft: 'pear',\n            label: 'Pear',\n          },\n          {\n            key: 'lemon',\n            iconLeft: 'lemon',\n            label: 'Lemon',\n          },\n        ],\n      },\n    ],\n  },\n  testId: 'token-list-input-group',\n};\n\nconst CustomOptionTokenListInput = (args: Props<TokenListOption>) => {\n  const options = [\n    {\n      key: '1',\n      label: 'Mango',\n      customComponent: (\n        <div className={css.titleWrapper}>\n          <FormLabelSmall color=\"tertiary\">Mango</FormLabelSmall>\n          <div className={css.infoContainer}>\n            <Tooltip title=\"Hello!\" elevation=\"modal\">\n              <Icon\n                name=\"circle-info\"\n                size=\"large\"\n                color=\"success\"\n                type=\"duotone\"\n              />\n            </Tooltip>\n          </div>\n        </div>\n      ),\n    },\n    {\n      key: '2',\n      label: 'Watermelon',\n      customComponent: (\n        <div className={css.titleWrapper}>\n          <FormLabelSmall color=\"tertiary\">Watermelon</FormLabelSmall>\n          <div className={css.infoContainer}>\n            <Tooltip title=\"Hello!\" elevation=\"modal\">\n              <Icon\n                name=\"circle-info\"\n                size=\"large\"\n                color=\"danger\"\n                type=\"duotone\"\n              />\n            </Tooltip>\n          </div>\n        </div>\n      ),\n    },\n    {key: '3', label: 'Option 3'},\n    {key: '4', label: 'Option 4'},\n  ];\n\n  const [values, setValues] = React.useState<SimpleTokenOption[]>([\n    {label: 'apple', key: 'a'},\n    {label: 'b', key: 'b'},\n  ]);\n\n  const [input, setInput] = React.useState('');\n\n  return (\n    <div className={css.tokenListWrapper}>\n      <TokenListInput\n        {...(args as Props<SimpleTokenOption>)}\n        inputValue={input}\n        onInputChange={setInput}\n        values={values}\n        onChange={setValues}\n        menu={{options}}\n      />\n    </div>\n  );\n};\n\nexport const CustomOptionTokenListInputStory = (\n  args: Props<TokenListOption>,\n) => <CustomOptionTokenListInput {...args} />;\n\nexport const AllowArbitraryValuesStory = (args: Props<TokenListOption>) => {\n  const [values, setValues] = React.useState<Array<TokenListOption>>([]);\n  const [inputValue, setInputValue] = React.useState('');\n  const {filteredOptions} = useFilteredOptions({\n    searchTerm: inputValue,\n    options: args.menu?.options,\n    excludedKeys: values.map((value) => value.key),\n  });\n  const {optionsWithArbitrary} = useArbitraryOptionAddition({\n    searchTerm: inputValue,\n    options: filteredOptions,\n    excludedKeys: values.map((value) => value.key),\n    makeArbitraryValue: (value) => ({\n      key: value,\n      label: value,\n      arbitrary: true,\n    }),\n  });\n  const clearHandler = () => {\n    setValues([]);\n    setInputValue('');\n  };\n  return (\n    <div className={css.tokenListWrapper}>\n      <div className={css.tokenListHeader}>\n        <label htmlFor=\"token-list-input\">\n          <FormLabelSmall color={TEXT_COLORS.secondary}>\n            Select Tokens\n          </FormLabelSmall>\n        </label>\n        {!args.disabled && !args.locked && values.length > 0 && (\n          <button\n            type=\"button\"\n            className={classify(css.clearAllButton, {})}\n            onClick={() => {\n              clearHandler();\n            }}\n            onKeyDown={(e: React.KeyboardEvent) => {\n              if (e.key === 'Enter') {\n                clearHandler();\n              }\n            }}\n            tabIndex={0}\n            style={{\n              background: 'none',\n              border: 'none',\n              padding: 0,\n              cursor: 'pointer',\n            }}\n          >\n            <ButtonTextExtraSmallUnderline color={TEXT_COLORS.clickable}>\n              Clear all\n            </ButtonTextExtraSmallUnderline>\n          </button>\n        )}\n      </div>\n      <TokenListInput\n        {...args}\n        values={values}\n        inputValue={inputValue}\n        onInputChange={setInputValue}\n        onChange={(newValues: Array<TokenListOption>) => {\n          setValues(newValues);\n          setInputValue('');\n        }}\n        menu={{\n          options: optionsWithArbitrary as Array<TokenListOption>,\n          resolveLabel: (option: TokenListOption) => {\n            if (option.arbitrary && option.label) {\n              return `Create New \\\"${option.label}\\\"`;\n            }\n            return option.label || '';\n          },\n        }}\n        inputProps={\n          {\n            id: 'token-list-input',\n          } as InputProps\n        }\n      />\n    </div>\n  );\n};\nAllowArbitraryValuesStory.args = {\n  menu: {\n    options: [\n      {key: '1', label: 'Option 1'},\n      {key: '2', label: 'Option 2'},\n      {key: '3', label: 'Option 3'},\n    ],\n  },\n  disabled: false,\n  locked: false,\n  testId: 'token-list-input-arbitrary',\n};\nTokenListInputStory.storyName = 'Token List Input';\nTokenListInputWithErrorStory.storyName = 'Token List Input With Error';\nTokenListInputLockedStory.storyName = 'Token List Input Locked';\nTokenListInputDisabledStory.storyName = 'Token List Input Disabled';\nTokenListInputGroupStory.storyName = 'Token List Input Group';\nCustomOptionTokenListInputStory.storyName = 'Custom Option Token List Input';\nAllowArbitraryValuesStory.storyName = 'Allow Arbitrary Values';\n"
        },
        "css": {
          "path": "TokenListInput.module.css",
          "content": "@value (\n  spaceNone,\n  spaceSmall,\n  spaceXSmall,\n  spaceXXSmall\n) from '../../styles/variables/_space.css';\n@value (\n  colorFocusDanger,\n  colorFillPrimary,\n  colorFillDisabled,\n  colorFocusPrimary,\n  colorBorderDanger,\n  colorBorderPrimary,\n  colorBorderTertiary,\n  colorTextTertiary\n) from '../../styles/variables/_color.css';\n@value (\n  borderWidthPrimary,\n  borderRadiusMedium,\n  borderRadiusSmall,\n  borderWidthNone,\n  borderWidthTertiary\n) from '../../styles/variables/_border.css';\n@value (\n  size2,\n  size4,\n  size8,\n  size26,\n  size228,\n  sizeFluid\n) from '../../styles/variables/_size.css';\n\n@value tokenListHeaderHeight: 18px;\n@value smallBoxHeight: 34px;\n@value mediumBoxHeight: 42px;\n\n.box {\n  display: flex;\n  gap: size8;\n  align-items: center;\n  flex-wrap: wrap;\n  width: sizeFluid;\n  max-height: size228;\n  flex: 0 0 auto;\n  overflow: auto;\n  cursor: pointer;\n  border: borderWidthPrimary solid colorBorderPrimary;\n}\n\n.box:not(.withError):not(.inputDisabled):not(.inputLocked):not(.inputHidden) {\n  border-color: colorBorderPrimary;\n}\n\n.box:not(.withError):not(.inputDisabled):not(.inputLocked):not(\n    .inputHidden\n  ):hover {\n  border-color: colorBorderTertiary;\n}\n\n.box:focus-within {\n  border-color: colorFillPrimary;\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n\n.box.withError {\n  border-color: colorBorderDanger;\n}\n\n.box.withError:focus-within {\n  border-color: colorBorderDanger;\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusDanger;\n}\n\n.box.inputLocked {\n  border-color: colorBorderPrimary;\n  border-style: dashed;\n}\n\n.box.inputDisabled {\n  border-color: colorBorderPrimary;\n}\n\n.tokenListContainer {\n  display: flex;\n  position: relative;\n  flex-flow: column;\n  width: sizeFluid;\n  gap: spaceXXSmall;\n}\n\n.tokenListHeader {\n  display: flex;\n  width: sizeFluid;\n  height: tokenListHeaderHeight;\n  justify-content: space-between;\n}\n\n.clearAllButton {\n  cursor: pointer;\n}\n\n.clearAllButton:focus-visible {\n  box-shadow: borderWidthNone borderWidthNone borderWidthNone\n    borderWidthTertiary colorFocusPrimary;\n}\n\n.medium {\n  border-radius: borderRadiusMedium;\n  padding: spaceXSmall spaceSmall;\n  min-height: mediumBoxHeight;\n}\n\n.small {\n  border-radius: borderRadiusSmall;\n  padding: spaceXXSmall spaceSmall;\n  min-height: smallBoxHeight;\n}\n\n.tokenListInputWrapper {\n  display: flex;\n  flex-direction: column;\n  gap: spaceXSmall;\n}\n\n.inputMedium {\n  composes: formInputMedium from '../../styles/typography.module.css';\n  min-width: calc(sizeFluid/4);\n  outline: none;\n  border: none;\n  background-color: transparent;\n  padding: spaceNone spaceNone spaceNone spaceNone;\n  flex: 1 0;\n}\n\n.inputSmall {\n  composes: formInputSmall from '../../styles/typography.module.css';\n  min-width: calc(sizeFluid/4);\n  outline: none;\n  border: none;\n  background-color: transparent;\n  padding: spaceNone spaceNone spaceNone spaceNone;\n  flex: 1 0;\n}\n\n:where(.box) input::placeholder {\n  color: colorTextTertiary;\n}\n\n.lockIcon {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin-left: auto;\n}\n\n.loaderContainer {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: size26;\n  height: size26;\n  margin-left: auto;\n}\n\n.menuWrapper {\n  width: var(--dropdown-width);\n  z-index: var(--menu-elevation);\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/TokenListInput/TokenListInput';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "TokenValueChips.d.ts": {
            "path": "TokenValueChips.d.ts",
            "content": "import * as React from 'react';\ninterface Props<T> {\n    values: Array<T>;\n    disabled?: boolean;\n    locked?: boolean;\n    onDismiss: (arg1: T) => unknown;\n    resolveTokenValue?: (arg1: ResolveTokenValueProps<T>) => React.ReactNode;\n    testId?: string;\n}\nexport interface ResolveTokenValueProps<T> {\n    token: T;\n    disabled?: boolean;\n    onDismiss?: (arg1: T) => unknown;\n    locked?: boolean;\n    testId?: string;\n}\nexport declare function TokenValueChips<T>(props: Props<T>): (string | number | bigint | boolean | React.JSX.Element | Iterable<React.ReactNode> | Promise<string | number | bigint | boolean | React.ReactPortal | React.ReactElement<unknown, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined> | null | undefined)[];\nexport declare namespace TokenValueChips {\n    var displayName: string;\n}\nexport {};\n//# sourceMappingURL=TokenValueChips.d.ts.map"
          }
        }
      },
      "allFiles": [
        "TokenListInput.module.css",
        "TokenListInput.stories.module.css",
        "TokenListInput.stories.tsx",
        "TokenListInput.tsx",
        "TokenValueChips.tsx",
        "index.ts"
      ]
    },
    "Tooltip": {
      "name": "Tooltip",
      "path": "src/components/Tooltip",
      "files": {
        "main": {
          "path": "Tooltip.d.ts",
          "content": "import * as React from 'react';\ntype ClassNames = Readonly<{\n    tooltip?: string;\n    title?: string;\n    body?: string;\n}>;\nexport declare const DELAY_MOTION_DURATION_TYPES: Readonly<{\n    none: \"none\";\n    fast: \"fast\";\n    normal: \"normal\";\n    slow: \"slow\";\n    slower: \"slower\";\n    slowest: \"slowest\";\n}>;\nexport type DelayMotionDurationType = (typeof DELAY_MOTION_DURATION_TYPES)[keyof typeof DELAY_MOTION_DURATION_TYPES];\nexport declare const ELEVATION_TYPES: Readonly<{\n    none: \"none\";\n    card: \"card\";\n    tooltip: \"tooltip\";\n    menu: \"menu\";\n    backdrop: \"backdrop\";\n    modal: \"modal\";\n    toast: \"toast\";\n}>;\nexport type ElevationType = (typeof ELEVATION_TYPES)[keyof typeof ELEVATION_TYPES];\nexport type PlacementType = 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'right';\nexport interface BaseTooltipProps {\n    classNames?: ClassNames;\n    title?: string | React.ReactNode;\n    body?: string | React.ReactNode;\n    placement?: PlacementType;\n    bodyMaxLines?: number;\n    titleMaxLines?: number;\n    delayMotionDuration?: DelayMotionDurationType;\n    hidden?: boolean;\n    elevation?: ElevationType;\n    testId?: string;\n}\nexport interface TooltipProps extends Omit<BaseTooltipProps, 'children'> {\n    children: React.ReactNode;\n}\nexport declare const getElevationValue: (elevation: string) => string;\nexport declare const Tooltip: ({ classNames, children, title, body, placement, bodyMaxLines, titleMaxLines, delayMotionDuration, elevation, hidden, testId, }: TooltipProps) => React.JSX.Element;\nexport {};\n//# sourceMappingURL=Tooltip.d.ts.map"
        },
        "story": {
          "path": "Tooltip.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {Avatar} from 'src/components/Avatar';\nimport {Button} from 'src/components/Button';\nimport {Icon} from 'src/components/Icon';\nimport {BodyMedium, BodySmall} from 'src/components/Text';\nimport type {TooltipProps} from 'src/components/Tooltip/Tooltip';\nimport {\n  DELAY_MOTION_DURATION_TYPES,\n  ELEVATION_TYPES,\n  Tooltip,\n} from 'src/components/Tooltip/Tooltip';\n\nimport css from 'src/components/Tooltip/Tooltip.stories.module.css';\n\n\nconst delayMotionDurationOptions: Array<unknown> = [\n  ...Object.values(DELAY_MOTION_DURATION_TYPES),\n];\n\nconst elevationOptions: Array<unknown> = [...Object.values(ELEVATION_TYPES)];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Tooltip',\n  argTypes: {\n    title: {\n      description: `**Title** of the tooltip. This is first section in the tooltip\n        container. It internally uses truncate to show ellipsis\n        when the text is large(based on \\`titleMaxLines\\` prop, defaults to **1 Line**). While\n        using title as a react component, you should pass content wrapped inside an\n        inline tag like \\`<span>\\`\n        `,\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string | React.Node'},\n      },\n    },\n    body: {\n      description: `**Body** of the tooltip. This is second section in the tooltip\n      container. It internally uses truncate to show ellipsis\n      when the text is large(based on \\`bodyMaxLines\\` prop, defaults to **2 Lines**). While\n      using body as a react component, you should pass content wrapped inside an\n      inline tag like \\`<span>\\`\n      `,\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string | React.Node'},\n      },\n    },\n    placement: {\n      options: [\n        'top',\n        'top-start',\n        'top-end',\n        'bottom',\n        'bottom-start',\n        'bottom-end',\n        'left',\n        'right',\n      ],\n      description: 'Placement of tooltip',\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'top'},\n      },\n    },\n    delayMotionDuration: {\n      options: delayMotionDurationOptions,\n      description: `Delay in showing the Tooltip \\n\n      none: 0ms \\n\n      fast: 100ms \\n\n      normal: 200ms \\n\n      slow: 300ms \\n\n      slower: 500ms \\n\n      slowest: 1000ms `,\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'none'},\n      },\n    },\n    elevation: {\n      description:\n        'z-index to the tooltip. This is by default set to elevationTooltip which is `4`. Use this prop when you want to render tooltip at higher elevation elements like Modal, Toast, Menu, etc.',\n      control: {\n        type: 'select',\n      },\n      options: elevationOptions,\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'tooltip'},\n      },\n    },\n    hidden: {\n      description:\n        'If set to **true** tooltip wont be visible. Use this if you want to programmatically control the tooltip show/hide',\n      control: {\n        type: 'boolean',\n      },\n    },\n    classNames: {\n      description: 'External classnames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: '{tooltip?: string, title?: string, body?: string}'},\n      },\n    },\n    bodyMaxLines: {\n      description:\n        'Maximum number of lines allowed for body text in the Tooltip. Tooltip would automatically **truncate** content after that',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: 2},\n      },\n    },\n    titleMaxLines: {\n      description:\n        'Maximum number of lines allowed for title text in the Tooltip. Tooltip would automatically **truncate** content after that',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: 1},\n      },\n    },\n    children: {\n      type: {required: true},\n      description:\n        'React Node that tooltip wraps on. Tooltip preserves the consumer\\'s references',\n      control: {\n        type: 'null',\n      },\n      table: {\n        type: {summary: 'React.Node'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Tooltip component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Tooltip } from \"@spaced-out/ui-design-system/lib/components/Tooltip\";\n\\`\\`\\`\nWhen users hover over, focus on, or tap an element, **tooltips** provide descriptive text. \\`Tooltip\\` should be wrapped over\nthe element for it to function.\n\nThere are 8 possible placements for the Tooltip. Tooltip container has a max-width of \\`300px\\`. It wraps content if the width exceeds\n\n**Note: **\\`<Tooltip>\\`** get attached to \\`<body>\\`. You can manage elevation of the tooltip when you want to use at elevated surfaces.\n\n**Note: **\\`<Tooltip>\\`** wrapper needs ref to work. If you are not able to provide ref normally, you would need to wrap the component in a \\`<div>\\`.\n\n\\`\\`\\`jsx\n<Tooltip title=\"Hello\"><div><BodySmall>Hello World</BodySmall></div></Tooltip>\n\n/* Multiline tooltip **/\n<Tooltip\n  title=\"Person\"\n  body={\n    <span>\n      Damian Marley <br />\n      Chris Stapleton <br />\n      Michael Jackson <br />\n      Elton John <br />\n      James Brown <br />\n      Lil Wayne <br />\n      Elvis Crespo <br />\n      Cody Jinks\n    </span>\n  }\n  bodyMaxLines={7}\n  placement={'top-start'}\n>\n  <Button type=\"tertiary\" iconLeftName=\"face-smirking\">\n    Multiline Tooltip\n  </Button>\n</Tooltip>\n\\`\\`\\`\n          `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Tooltip/Tooltip',\n    },\n  },\n};\n\nconst Names = () => (\n  <>\n    <span>\n      Damian Marley <br />\n      Chris Stapleton <br />\n      Michael Jackson <br />\n      Elton John <br />\n      James Brown <br />\n      Lil Wayne <br />\n      Elvis Crespo <br />\n      Cody Jinks\n    </span>\n  </>\n);\n\nconst CustomComponent = () => (\n  <div className={css.namesContainer}>\n    <div className={css.name}>\n      <Avatar\n        imageSrc=\"https://cdn.sensehq.com/genesis/hashed/static/images/personas/1.png\"\n        ring\n      />\n      <BodyMedium color=\"inversePrimary\">Persona 1</BodyMedium>\n    </div>\n    <div className={css.name}>\n      <Avatar\n        imageSrc=\"https://cdn.sensehq.com/genesis/hashed/static/images/personas/4.png\"\n        ring\n      />\n      <BodyMedium color=\"inversePrimary\">Persona 2</BodyMedium>\n    </div>\n    <div className={css.name}>\n      <Avatar\n        imageSrc=\"https://cdn.sensehq.com/genesis/hashed/static/images/personas/5.png\"\n        ring\n      />\n      <BodyMedium color=\"inversePrimary\">Persona 3</BodyMedium>\n    </div>\n    <div className={css.name}>\n      <Avatar\n        imageSrc=\"https://cdn.sensehq.com/genesis/hashed/static/images/personas/6.png\"\n        ring\n      />\n      <BodyMedium color=\"inversePrimary\">Persona 4</BodyMedium>\n    </div>\n  </div>\n);\n\nexport const SimpleStory = (args: TooltipProps) => (\n  <div className={css.tooltipContainer}>\n    <div className={css.tooltipContent}>\n      <Tooltip {...args}>\n        <Button type=\"tertiary\" iconLeftName=\"face-sunglasses\">\n          Hover Me\n        </Button>\n      </Tooltip>\n      <div className={css.info}>\n        <Icon color=\"tertiary\" size=\"small\" name=\"circle-info\" />\n        <BodySmall color=\"tertiary\">\n          With title, body & max lines for title and body\n        </BodySmall>\n      </div>\n    </div>\n  </div>\n);\n\nSimpleStory.args = {\n  title: 'Label',\n  body: `The quick brown fox jumps over the dog,\n  The quick brown fox jumps over the dog\n  The quick brown fox jumps over the dog`,\n  placement: 'top',\n  children: null,\n  bodyMaxLines: 2,\n  titleMaxLines: 1,\n  testId: 'tooltip-simple-story',\n};\n\nexport const WithCustomComponentStory = (args: TooltipProps) => (\n  <div className={css.tooltipContainer}>\n    <div className={css.tooltipContent}>\n      <Tooltip {...args} body={<CustomComponent />}>\n        <Button type=\"tertiary\" iconLeftName=\"face-smirking\">\n          With Custom Component as Body\n        </Button>\n      </Tooltip>\n      <div className={css.info}>\n        <Icon color=\"tertiary\" size=\"small\" name=\"circle-info\" />\n        <BodySmall color=\"tertiary\">\n          Can pass any custom component as body\n        </BodySmall>\n      </div>\n    </div>\n  </div>\n);\n\nWithCustomComponentStory.args = {\n  title: '',\n  testId: 'tooltip-with-custom-component-story',\n};\n\nexport const MultilineStory = (args: TooltipProps) => (\n  <div className={css.tooltipContainer}>\n    <div className={css.tooltipContent}>\n      <Tooltip {...args} body={<Names />}>\n        <Button type=\"tertiary\" iconLeftName=\"face-smirking\">\n          Multiline Tooltip\n        </Button>\n      </Tooltip>\n      <div className={css.info}>\n        <Icon color=\"tertiary\" size=\"small\" name=\"circle-info\" />\n        <BodySmall color=\"tertiary\">\n          With fixed body and bodyMaxLines = 7\n        </BodySmall>\n      </div>\n    </div>\n  </div>\n);\n\nMultilineStory.args = {\n  title: '',\n  bodyMaxLines: 7,\n  placement: 'top',\n  testId: 'tooltip-multiline-story',\n};\nSimpleStory.storyName = 'Simple';\nWithCustomComponentStory.storyName = 'With Custom Component';\nMultilineStory.storyName = 'Multiline';\n"
        },
        "css": {
          "path": "Tooltip.module.css",
          "content": "@value (colorTooltipFill, colorTextInversePrimary, colorTextInverseSecondary) from '../../styles/variables/_color.css';\n@value (size300) from '../../styles/variables/_size.css';\n@value (spaceXSmall, spaceSmall, spaceXXSmall) from '../../styles/variables/_space.css';\n@value (borderRadiusSmall) from '../../styles/variables/_border.css';\n@value (elevationTooltip) from '../../styles/variables/_elevation.css';\n\n.tooltip {\n  --tooltip-elevation: elevationTooltip;\n  display: flex;\n  flex-flow: column;\n  max-width: size300;\n  gap: spaceXXSmall;\n  padding: spaceXSmall spaceSmall;\n  background: colorTooltipFill;\n  pointer-events: none;\n  border-radius: borderRadiusSmall;\n  word-wrap: break-word;\n  z-index: var(--tooltip-elevation);\n}\n\n.title {\n  composes: subTitleExtraSmall from '../../styles/typography.module.css';\n  color: colorTextInversePrimary;\n}\n\n.body {\n  composes: bodyMedium from '../../styles/typography.module.css';\n  color: colorTextInversePrimary;\n}\n\n.hasTitle {\n  color: colorTextInverseSecondary;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Tooltip/Tooltip';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "Tooltip.module.css",
        "Tooltip.stories.module.css",
        "Tooltip.stories.tsx",
        "Tooltip.tsx",
        "index.ts"
      ]
    },
    "Truncate": {
      "name": "Truncate",
      "path": "src/components/Truncate",
      "files": {
        "main": {
          "path": "Truncate.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nexport interface TruncateProps {\n    children?: React.ReactNode;\n    line?: number;\n    showFullTextOnHover?: boolean;\n    wordBreak?: string;\n    className?: string;\n    testId?: string;\n}\nexport declare const BaseTruncate: Flow.AbstractComponent<TruncateProps, HTMLSpanElement>;\nexport declare const Truncate: Flow.AbstractComponent<TruncateProps, HTMLSpanElement>;\n//# sourceMappingURL=Truncate.d.ts.map"
        },
        "story": {
          "path": "Truncate.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {BodyLarge} from 'src/components/Text';\nimport type {TruncateProps} from 'src/components/Truncate';\nimport {Truncate} from 'src/components/Truncate';\n\nimport css from 'src/components/Truncate/Truncate.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Truncate',\n  argTypes: {\n    line: {\n      description:\n        'Number of lines to show, and lines after that will be truncated',\n      control: {\n        type: 'number',\n        min: 1,\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: 1},\n      },\n    },\n    children: {\n      description: 'Content to be displayed',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    showFullTextOnHover: {\n      description:\n        'If **true**, full text **would be displayed** as a browser tooltip on hover',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    className: {\n      description: 'External className to be applied on truncate wrapper',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    wordBreak: {\n      description: 'word-break style to be applied on truncate',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'break-all'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Truncate component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Truncate } from \"@spaced-out/ui-design-system/lib/components/Truncate\";\n\\`\\`\\`\nTruncate Component is a wrapper for line clamping.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Truncate/Truncate',\n    },\n  },\n};\n\nexport const TruncateStory = ({children, ...args}: TruncateProps) => (\n  <div className={css.storyContainer}>\n    <BodyLarge>\n      <Truncate {...args}>\n        Toggle *showFullTextOnHover* to show/hide full text tooltip {children}\n      </Truncate>\n    </BodyLarge>\n  </div>\n);\n\nTruncateStory.args = {\n  line: 2,\n  showFullTextOnHover: false,\n  children: `The quick brown fox jumps over the lazy dog\" is an English-language pangram—a\n  sentence that contains all the letters of the alphabet.\n  The phrase is commonly used for touch-typing practice, testing\n  typewriters and computer keyboards, displaying examples of fonts, and other\n  applications involving text where the use of all letters in the alphabet is desired.`,\n  testId: 'truncate-story',\n};\nTruncateStory.storyName = 'Truncate';\n"
        },
        "css": {
          "path": "Truncate.module.css",
          "content": ".truncateLineClamp {\n  composes: truncate from '../../styles/typography.module.css';\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export type { TruncateProps } from '../../components/Truncate/Truncate';\nexport { Truncate } from '../../components/Truncate/Truncate';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "Truncate.module.css",
        "Truncate.stories.module.css",
        "Truncate.stories.tsx",
        "Truncate.tsx",
        "index.ts"
      ]
    },
    "TruncatedTextWithTooltip": {
      "name": "TruncatedTextWithTooltip",
      "path": "src/components/TruncatedTextWithTooltip",
      "files": {
        "main": {
          "path": "TruncatedTextWithTooltip.d.ts",
          "content": "import * as React from 'react';\nimport type { BaseTooltipProps } from '../../components/Tooltip';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n}>;\nexport interface TruncatedTextWithTooltipProps {\n    children?: React.ReactNode;\n    tooltip?: BaseTooltipProps;\n    classNames?: ClassNames;\n    line?: number;\n    wordBreak?: string;\n    wrapText?: boolean;\n    testId?: string;\n}\nexport declare const TruncatedTextWithTooltip: ({ classNames, children, tooltip, wrapText, line, wordBreak, testId, }: TruncatedTextWithTooltipProps) => React.JSX.Element;\nexport {};\n//# sourceMappingURL=TruncatedTextWithTooltip.d.ts.map"
        },
        "story": {
          "path": "TruncatedTextWithTooltip.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {BodyLarge} from 'src/components/Text';\nimport type {TruncatedTextWithTooltipProps} from 'src/components/TruncatedTextWithTooltip';\nimport {TruncatedTextWithTooltip} from 'src/components/TruncatedTextWithTooltip/TruncatedTextWithTooltip';\n\nimport css from 'src/components/TruncatedTextWithTooltip/TruncatedTextWithTooltip.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Components/Truncated Text With Tooltip',\n  component: TruncatedTextWithTooltip,\n  argTypes: {\n    children: {\n      description: 'The content to be displayed inside the component.',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'React.Node'},\n      },\n    },\n    tooltip: {\n      description: 'Props for customizing the tooltip.',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: 'BaseTooltipProps'},\n      },\n    },\n    classNames: {\n      description:\n        'Provide an optional className to be applied to the wrapper.',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {\n          summary: '{ wrapper?: string }',\n        },\n      },\n    },\n    wrapText: {\n      description:\n        'If **true**, allows the text to wrap instead of truncating.',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    line: {\n      description:\n        'Number of lines to show, and lines after that will be truncated \\n note: this is only applicable if wrapText is false',\n      control: {\n        type: 'number',\n        min: 1,\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: 1},\n      },\n    },\n    wordBreak: {\n      description: 'word-break style to be applied on truncate',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'break-all'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a TruncatedTextWithTooltip component.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { TruncatedTextWithTooltip } from \"@spaced-out/ui-design-system/lib/components/TruncatedTextWithTooltip\";\n\\`\\`\\`\n\n**TruncatedTextWithTooltip** component is designed to handle text truncation and display tooltips when the text is truncated.\nIt provides a clean way to present long text content while allowing users to view the full content through tooltips when necessary.\nThe component would automatically detect if the text is truncated and display a tooltip when the text is truncated. The tooltip content\nwould be the same as the text content(children) by default, but you can also assign custom tooltip content.\n\n### Usage\n\\`\\`\\`jsx\n<BodyLarge>\n  <TruncatedTextWithTooltip>\n    Tooltip would appear only when the text is truncated. Change the width of the container to see it in action.\n  </TruncatedTextWithTooltip>\n</BodyLarge>\n\n<BodyLarge>\n  <TruncatedTextWithTooltip\n    tooltip={{ body: 'Custom tooltip text' }}\n  >\n    You can also assign custom tooltip text when the text is truncated.\n  </TruncatedTextWithTooltip>\n</BodyLarge>\n\\`\\`\\`\n\n**Note:**\n- \\`<TruncatedTextWithTooltip>\\` should always be wrapped inside a **Typography** component.\n- Adjust the component's props and styles as needed to fit your specific use cases.\n        `,\n      },\n    },\n    storySource: {\n      componentPath:\n        '/src/components/TruncatedTextWithTooltip/TruncatedTextWithTooltip',\n    },\n  },\n};\n\nexport const TruncatedTextWithTooltipStory = (\n  args: TruncatedTextWithTooltipProps,\n) => (\n  <>\n    <div className={css.container}>\n      <BodyLarge color=\"secondary\">\n        <TruncatedTextWithTooltip {...args}></TruncatedTextWithTooltip>\n      </BodyLarge>\n    </div>\n    <div className={css.container}>\n      <BodyLarge color=\"secondary\">\n        <TruncatedTextWithTooltip\n          {...args}\n          tooltip={{body: 'Custom tooltip text'}}\n        >\n          You can also assign a custom tip text when the text is truncated.\n        </TruncatedTextWithTooltip>\n      </BodyLarge>\n    </div>\n  </>\n);\n\nTruncatedTextWithTooltipStory.args = {\n  classNames: {wrapper: ''},\n  children: `Tooltip would appear only when the text is truncated. Change width of\n  the container to see it in action.`,\n  tooltip: {bodyMaxLines: 3},\n  testId: 'truncated-text-with-tooltip-story',\n};\nTruncatedTextWithTooltipStory.storyName = 'Truncated Text With Tooltip';\n"
        },
        "css": {
          "path": "TruncatedTextWithTooltip.module.css",
          "content": ".truncateLineClamp {\n  composes: truncate from '../../styles/typography.module.css';\n  white-space: normal;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/TruncatedTextWithTooltip/TruncatedTextWithTooltip';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "TruncatedTextWithTooltip.module.css",
        "TruncatedTextWithTooltip.stories.module.css",
        "TruncatedTextWithTooltip.stories.tsx",
        "TruncatedTextWithTooltip.tsx",
        "index.ts"
      ]
    },
    "Typeahead": {
      "name": "Typeahead",
      "path": "src/components/Typeahead",
      "files": {
        "main": {
          "path": "Typeahead.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { ClickAwayRefType } from '../../utils/click-away';\nimport type { InputProps } from '../../components/Input';\nimport type { MenuOption, MenuProps } from '../../components/Menu';\nimport type { ElevationType } from '../../components/Tooltip';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    box?: string;\n}>;\ninterface BaseTypeaheadProps extends Omit<InputProps, 'classNames' | 'onSelect' | 'onSearch' | 'onMenuOpen' | 'onMenuClose' | 'typeaheadInputText' | 'menu' | 'onClear' | 'isLoading' | 'menuOpenOffset' | 'clickAwayRef' | 'elevation'> {\n    classNames?: ClassNames;\n    onSelect?: (option: MenuOption, arg2?: React.SyntheticEvent<HTMLElement> | null | undefined) => unknown;\n    onSearch?: (evt: React.ChangeEvent<HTMLInputElement>) => unknown;\n    onMenuOpen?: () => unknown;\n    onMenuClose?: () => unknown;\n    typeaheadInputText?: string;\n    menu?: MenuProps;\n    onClear?: () => void;\n    isLoading?: boolean;\n    menuOpenOffset?: number;\n    clickAwayRef?: React.RefObject<ClickAwayRefType | null>;\n    elevation?: ElevationType;\n    /**\n     * Opt in to the accessibility behavior: the `combobox` role and its ARIA,\n     * arrow-key navigation of the suggestions from the input, and focus handling\n     * on close. Forwarded to the `Menu` this opens.\n     *\n     * Off by default, and off is this component exactly as it behaved before any\n     * of it existed.\n     */\n    enableA11y?: boolean;\n    testId?: string;\n    rightSlot?: React.ReactNode;\n}\nexport interface TypeaheadProps extends Omit<BaseTypeaheadProps, 'allowInternalFilter'> {\n    allowInternalFilter?: boolean;\n}\nexport declare const Typeahead: Flow.AbstractComponent<TypeaheadProps, HTMLInputElement>;\nexport {};\n//# sourceMappingURL=Typeahead.d.ts.map"
        },
        "story": {
          "path": "Typeahead.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {useDebounce} from 'src/hooks/useDebounce';\nimport type {ClickAwayRefType} from 'src/utils/click-away';\n\nimport type {MenuOption, MenuProps} from 'src/components/Menu';\nimport {MenuFooter, MenuHeader} from 'src/components/Menu/Menu.stories';\nimport {Toggle} from 'src/components/Toggle';\nimport {ELEVATION_TYPES, Tooltip} from 'src/components/Tooltip';\nimport type {TypeaheadProps} from 'src/components/Typeahead/Typeahead';\nimport {Typeahead} from 'src/components/Typeahead/Typeahead';\n\nimport css from 'src/components/Typeahead/Typeahead.stories.module.css';\n\n\nconst DEFAULT_LIMIT = 10;\nconst DEFAULT_OFFSET = 0;\nconst elevationOptions: Array<unknown> = [...Object.values(ELEVATION_TYPES)];\n\nconst options: MenuOption[] = [\n  {key: '1', label: 'Eden Porter', iconLeft: 'user'},\n  {key: '2', label: 'Verda Rodgers', iconLeft: 'user'},\n  {\n    key: '3',\n    label:\n      'Option three this is a very long option that would truncate, and it continues even further to demonstrate how the text will behave when it exceeds the typical display width of the dropdown or typeahead component, ensuring that truncation, ellipsis, or wrapping is handled gracefully by the UI.',\n    iconLeft: 'user',\n  },\n  {key: '4', label: 'Rolf Kim', iconLeft: 'user'},\n  {key: '5', label: 'Ava Clark', iconLeft: 'user'},\n  {key: '6', label: 'Geneva Rhodes', iconLeft: 'user'},\n  {key: '7', label: 'Miranda Black', iconLeft: 'user'},\n  {key: '8', label: 'Marsh Saunders', iconLeft: 'user'},\n  {key: '9', label: 'Prunella Webb', iconLeft: 'user'},\n  {key: '10', label: 'Andy Mullins', iconLeft: 'user'},\n  {key: '11', label: 'Jade Watkins', iconLeft: 'user'},\n  {key: '12', label: 'Wally Wolfe', iconLeft: 'user'},\n  {key: '13', label: 'Misty Lipsey', iconLeft: 'user'},\n  {key: '14', label: 'Dwight Gibbs', iconLeft: 'user'},\n  {key: '15', label: 'Ronald Rhodes', iconLeft: 'user'},\n  {key: '16', label: 'Sophia Evans', iconLeft: 'user'},\n  {key: '17', label: 'Liam Harris', iconLeft: 'user'},\n  {key: '18', label: 'Olivia Grant', iconLeft: 'user'},\n  {key: '19', label: 'Ethan Daniels', iconLeft: 'user'},\n  {key: '20', label: 'Chloe Thomas', iconLeft: 'user'},\n  {key: '21', label: 'Lucas Martinez', iconLeft: 'user'},\n  {key: '22', label: 'Benjamin Wright', iconLeft: 'user'},\n  {key: '23', label: 'Amelia King', iconLeft: 'user'},\n  {key: '24', label: 'James Lewis', iconLeft: 'user'},\n  {key: '25', label: 'Pamela Fennimore', iconLeft: 'user'},\n];\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Form Components/Typeahead/Generic Typeahead',\n  component: Typeahead,\n  argTypes: {\n    enableA11y: {\n      description:\n        '**enableA11y** opts into the accessibility behavior: the `combobox` role and its ARIA, arrow-key navigation of the suggestions from the input, and focus handling on close. Off by default, where the component behaves exactly as it did before any of it existed. Off here too, as everywhere: turn the control on to see the accessible behavior.',\n      control: {type: 'boolean'},\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    size: {\n      description:\n        'Typeahead supports only two size variants namely small and medium. `small` < `medium`',\n      options: ['medium', 'small'],\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    menuSize: {\n      description:\n        'Size of the menu.If not specified menu would take the size prop of typeahead. `small` < `medium`',\n      options: ['medium', 'small'],\n      control: {\n        type: 'select',\n      },\n      table: {\n        type: {summary: 'enum'},\n      },\n    },\n    elevation: {\n      description:\n        'This is passed to Typeahead. Elevation level for the dropdown menu controls the z-index stacking order. Default is set to \"modal\" elevation. Use higher elevation levels when rendering the dropdown above other elevated elements like Modal, Toast, etc.',\n      control: {\n        type: 'select',\n      },\n      options: elevationOptions,\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'modal'},\n      },\n    },\n    name: {\n      description: 'Name of the typeahead',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    options: {\n      description:\n        'Typeahead options to be displayed. Each option should atleast have `{key: string, label: string}` Each option additionally supports `iconLeft` and `iconRight`',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: 'MenuOption[]'},\n      },\n    },\n    disabled: {\n      description: 'if **true**, the component is disabled',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    isLoading: {\n      description:\n        'if **true**, the component would add a loader. The loader occupies space outside the container.',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    menuOpenOffset: {\n      description:\n        'A number indicating how many characters are needed to open menu',\n      control: {\n        type: 'number',\n      },\n      table: {\n        type: {summary: 'number'},\n        defaultValue: {summary: 1},\n      },\n    },\n    placeholder: {\n      description:\n        'Placeholder of typeahead. This appears inside the input box',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    locked: {\n      description:\n        'if **true**, the component is locked, Locked state is the readonly state of the typeahead',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    error: {\n      description:\n        'if **true**, the component is moved to error state, Error state displays a red border surrounding input',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    errorText: {\n      description:\n        'Error text to be displayed on the bottom of the input. This uses `colorTextDanger`',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    label: {\n      description:\n        'Primary label of the typeahead. This appears on top of typeahead input',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    helperText: {\n      description:\n        'Secondary label of the typeahead. This appears on bottom of typeahead input, if the typeahead is in `error` state the priority is given to `errorText`, in such cases secondary label wont be displayed',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    rightSlot: {\n      description: 'Right slot to be applied to the typeahead',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: 'React.ReactNode'},\n      },\n    },\n    classNames: {\n      description: 'External classnames to be applied',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: '{wrapper?: string, box?: string}'},\n      },\n    },\n    onSelect: {\n      description:\n        '**onSelect** handler is triggered when there is a selection of an option from Menu',\n      action: 'Option Selected',\n      table: {\n        type: {\n          summary:\n            '(option: MenuOption, ?SyntheticEvent<HTMLElement>) => mixed',\n        },\n      },\n    },\n    iconLeftName: {\n      description:\n        'Left icon to be applied to the button, it internally uses the `Icon` component to render icons. By default Typeahead has magnifying-glass icon',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n        defaultValue: {summary: 'magnifying-glass'},\n      },\n    },\n    onClear: {\n      description:\n        '**onClear** handler is triggered when clear button is clicked.',\n      action: 'cleared',\n      table: {\n        type: {summary: '() => void'},\n      },\n    },\n    onSearch: {\n      description:\n        '**onSearch** handler is triggered when there change in the input value',\n      action: 'Searched',\n      table: {\n        type: {\n          summary: '(evt: SyntheticInputEvent<HTMLInputElement>) => mixed',\n        },\n      },\n    },\n    onFocus: {\n      description:\n        '**onFocus** handler is triggered when typeahead is focussed',\n      action: 'focussed',\n      table: {\n        type: {summary: '(e: SyntheticInputEvent<HTMLInputElement>) => mixed'},\n      },\n    },\n    onBlur: {\n      description: '**onBlur** handler is triggered when typeahead is blurred',\n      action: 'blurred',\n      table: {\n        type: {summary: '(e: SyntheticInputEvent<HTMLInputElement>) => mixed'},\n      },\n    },\n    typeaheadInputText: {\n      description:\n        'Text that appears inside the top input. Since Typeahead is a controlled component, this has to be set by caller',\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n    menu: {\n      description: 'Menu props to use',\n      control: {\n        type: 'object',\n      },\n      table: {\n        type: {summary: 'MenuProps'},\n      },\n    },\n    onMenuOpen: {\n      description:\n        '**onMenuOpen** handler is triggered when menu is opened. This should be helpful in cases where you want to change Button icon / text on this trigger.',\n      action: 'clicked',\n      table: {\n        type: {summary: '() => mixed'},\n      },\n    },\n    onMenuClose: {\n      description:\n        '**onMenuClose** handler is triggered when menu is closed. This should be helpful in cases where you want to change Button icon / text on this trigger.',\n      action: 'clicked',\n      table: {\n        type: {summary: '() => mixed'},\n      },\n    },\n    clickAwayRef: {\n      type: {optional: true},\n      description: 'ref that contains the functions to open or close the child',\n      table: {\n        type: {\n          summary: 'ClickAwayRefType',\n        },\n      },\n    },\n    allowInternalFilter: {\n      description:\n        'Allows the **MenuOptions** to be filtered internally based on the **label** of each option. When this is set to false, the internal filtering mechanism that matches options against the search text is skipped. This means it assumes that the **MenuOptions** has already been filtered externally and will display the provided options as they are without any further processing.',\n      control: {\n        type: 'boolean',\n      },\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: true},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle: 'Generates a Typeahead component',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { Typeahead } from \"@spaced-out/ui-design-system/lib/components/Typeahead\";\n\\`\\`\\`\n**Typeahead** is implemented as a combination of **<a href=\"../?path=/docs/form-components-input--docs\">Input</a>** and **<a href=\"../?path=/docs/components-menu--docs\">Menu</a>**\ncomponents. It internally uses **Floating UI** to\nposition itself in context of DOM. Supports a bunch of callbacks listed below. Typeahead automatically filters options when a\nsubstring match is found in option(s). This is done using \\`label\\` prop of option.\n\n- Supports passing a \\`clickAwayRef\\` prop to the component.\n- You can always force Open the dropdown from ref by using \\`clickAwayRef.current?.forceOpen()\\`. This might be useful when want to force Open as per you needs.\n- You can always force Close the dropdown from ref by using \\`clickAwayRef.current?.forceClose()\\`. This might be useful when want to force Close as per you needs.\n\n**Purpose:** The Typeahead component is designed to enhance performance and user experience by initially displaying a limited set of menu options (e.g., most popular or recently used items). Once the user begins typing into the input field, the component dynamically queries the API and displays all matching results based on the input text. This approach minimizes initial load time while ensuring that users can still access the full range of options through search-driven filtering.\n\nCurrently typeahead only supports simple menu options.\n\n\\`\\`\\`jsx\nexport const _BasicTypeahead = (args: TypeaheadProps): React.Node => {\n  const clickAwayRef = React.useRef(null);\n  const [inputText, setInputText] = React.useState('');\n  const [isLoading, setIsLoading] = React.useState(false);\n  const [menuOptions, setMenuOptions] = React.useState([]);\n\n  const debouncedInputText = useDebounce(inputText, 500);\n\n  const fetchData = async () => {\n    setIsLoading(true);\n    const newOptions = await getPaginatedData(\n      debouncedInputText,\n      DEFAULT_OFFSET,\n      DEFAULT_LIMIT,\n    );\n    setMenuOptions(newOptions);\n    setIsLoading(false);\n  };\n\n  React.useEffect(() => {\n    fetchData();\n  }, [debouncedInputText]);\n\n  return (\n    <div className={css.typeaheadWrapper}>\n      <Typeahead\n        {...args}\n        menu={{\n          options: menuOptions,\n          virtualization: {enable: true},\n        }}\n        onClear={() => setInputText('')}\n        onSearch={(e) => setInputText(e.target.value)}\n        onSelect={({label}) => setInputText(label || '')}\n        isLoading={isLoading}\n        clickAwayRef={clickAwayRef}\n        typeaheadInputText={inputText}\n        allowInternalFilter={false}\n      />\n    </div>\n  );\n}\n\\`\\`\\`\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/Typeahead/Typeahead',\n    },\n  },\n};\n\nconst menuProps: MenuProps = {\n  options,\n};\n\nexport const TypeaheadStory = (args: TypeaheadProps) => {\n  const [inputText, setInputText] = React.useState<string | undefined>('');\n  return (\n    <div className={css.typeaheadWrapper}>\n      <Typeahead\n        {...args}\n        typeaheadInputText={inputText}\n        onSearch={(e) => setInputText(e.target.value)}\n        onSelect={(option) => {\n          setInputText(option.label);\n        }}\n        onClear={() => setInputText('')}\n      />\n    </div>\n  );\n};\n\nTypeaheadStory.args = {\n  label: 'Search a name',\n  menu: menuProps,\n  testId: 'typeahead-story',\n};\n\n/*\n * The same typeahead as `Typeahead`, with the accessibility opt-in on.\n *\n * With `enableA11y` the field is an `autocomplete` combobox using APG's\n * automatic selection: each time the suggestions narrow, the first one is\n * highlighted, so Enter takes the best match without arrowing to it first. Your\n * own highlight stands between those changes — arrowing down does not get stolen\n * back to the top. Typing keeps reaching the field, the arrow keys move\n * `aria-activedescendant`, and a polite live region announces the result count\n * and the loading state. The field only claims to be expanded while a listbox is\n * actually rendered.\n *\n * Every other story here leaves the prop off, which is the default and is this\n * component exactly as it behaved before any of this existed.\n */\nexport const AccessibleTypeaheadStory = (args: TypeaheadProps) => {\n  const [inputText, setInputText] = React.useState<string | undefined>('');\n  return (\n    <div className={css.typeaheadWrapper}>\n      <Typeahead\n        {...args}\n        typeaheadInputText={inputText}\n        onSearch={(e) => setInputText(e.target.value)}\n        onSelect={(option) => {\n          setInputText(option.label);\n        }}\n        onClear={() => setInputText('')}\n      />\n    </div>\n  );\n};\n\nAccessibleTypeaheadStory.args = {\n  enableA11y: true,\n  label: 'Search a name',\n  menu: menuProps,\n  testId: 'typeahead-accessible-story',\n};\n\nexport const TypeaheadWithTooltipOptionsStory = (args: TypeaheadProps) => {\n  const [inputText, setInputText] = React.useState<string | undefined>('');\n  return (\n    <div className={css.typeaheadWrapper}>\n      <Typeahead\n        {...args}\n        typeaheadInputText={inputText}\n        onSearch={(e) => setInputText(e.target.value)}\n        onSelect={(option) => {\n          setInputText(option.label);\n        }}\n        onClear={() => setInputText('')}\n      />\n    </div>\n  );\n};\n\nTypeaheadWithTooltipOptionsStory.args = {\n  label: 'Search a name',\n  menu: {...menuProps, showLabelTooltip: {maxLines: 10}},\n  testId: 'typeahead-with-tooltip-options-story',\n};\n\nexport const WithHeaderAndFooterStory = (args: TypeaheadProps) => (\n  <WithHeaderAndFooter {...args} />\n);\n\nexport const WithHeaderAndFooter = (args: TypeaheadProps) => {\n  const clickAwayRef = React.useRef<ClickAwayRefType | null>(null);\n  const [inputText, setInputText] = React.useState<string | undefined>('');\n\n  const onSave = () => {\n    if (clickAwayRef.current) {\n      clickAwayRef.current?.forceClose();\n    }\n  };\n\n  return (\n    <div className={css.typeaheadWrapper}>\n      <Typeahead\n        {...args}\n        typeaheadInputText={inputText}\n        onSearch={(e) => setInputText(e.target.value)}\n        onSelect={(option) => {\n          setInputText(option.label);\n        }}\n        menu={{\n          options,\n          header: <MenuHeader />,\n          footer: <MenuFooter onSave={onSave} />,\n        }}\n        onClear={() => setInputText('')}\n        clickAwayRef={clickAwayRef}\n      />\n    </div>\n  );\n};\n\nWithHeaderAndFooterStory.args = {\n  label: 'Search a name',\n  testId: 'typeahead-with-header-and-footer-story',\n};\n\nconst getPaginatedData = ({\n  limit,\n  offset,\n  searchText,\n}: {\n  limit: number;\n  offset: number;\n  searchText: string;\n}) =>\n  new Promise(\n    (\n      resolve: (result: Promise<Array<MenuOption>> | Array<MenuOption>) => void,\n    ) =>\n      setTimeout(() => {\n        const filteredOptions = options.filter((option) =>\n          option.label\n            ? option.label.toLowerCase().includes(searchText.toLowerCase())\n            : true,\n        );\n\n        resolve(filteredOptions.slice(offset, offset + limit));\n      }, 1000),\n  );\n\nexport const WithPaginationAndVirtualizationStory = (args: TypeaheadProps) => {\n  const clickAwayRef = React.useRef(null);\n  const [inputText, setInputText] = React.useState('');\n  const [isLoading, setIsLoading] = React.useState(false);\n  const [menuOptions, setMenuOptions] = React.useState<MenuOption[]>([]);\n\n  const debouncedInputText = useDebounce(inputText, 500);\n\n  const fetchData = async () => {\n    setIsLoading(true);\n    const newOptions = await getPaginatedData({\n      limit: DEFAULT_LIMIT,\n      offset: DEFAULT_OFFSET,\n      searchText: debouncedInputText,\n    });\n    setMenuOptions(newOptions);\n    setIsLoading(false);\n  };\n\n  React.useEffect(() => {\n    fetchData();\n  }, [debouncedInputText]);\n\n  return (\n    <div className={css.typeaheadWrapper}>\n      <Typeahead\n        {...args}\n        menu={{\n          options: menuOptions,\n          virtualization: {enable: true},\n        }}\n        onClear={() => setInputText('')}\n        onSearch={(e) => setInputText(e.target.value)}\n        onSelect={({label}) => setInputText(label || '')}\n        isLoading={isLoading}\n        clickAwayRef={clickAwayRef}\n        typeaheadInputText={inputText}\n        allowInternalFilter={false}\n      />\n    </div>\n  );\n};\n\nWithPaginationAndVirtualizationStory.args = {\n  label: 'Search a name',\n  menuOpenOffset: 0,\n  testId: 'typeahead-with-pagination-and-virtualization-story',\n};\n\nexport const TypeaheadWithRightSlotStory = (args: TypeaheadProps) => {\n  const [inputText, setInputText] = React.useState<string | undefined>('');\n  const [checked, setChecked] = React.useState(false);\n  return (\n    <div className={css.typeaheadWrapper}>\n      <Typeahead\n        {...args}\n        typeaheadInputText={inputText}\n        onSearch={(e) => setInputText(e.target.value)}\n        onSelect={(option) => {\n          setInputText(option.label);\n        }}\n        onClear={() => setInputText('')}\n        rightSlot={\n          <Tooltip title={checked ? 'Disable AI Search' : 'Enable AI Search'}>\n            <div className={css.toggleContainer}>\n              <Toggle\n                checked={checked}\n                onChange={() => {\n                  setChecked(!checked);\n                }}\n              />\n            </div>\n          </Tooltip>\n        }\n      />\n    </div>\n  );\n};\n\nTypeaheadWithRightSlotStory.args = {\n  label: 'Search a name',\n  menu: menuProps,\n  testId: 'typeahead-story',\n};\n\nTypeaheadStory.storyName = 'Typeahead';\nAccessibleTypeaheadStory.storyName = 'Accessible (enableA11y)';\nTypeaheadWithTooltipOptionsStory.storyName = 'Typeahead With Tooltip Options';\nWithHeaderAndFooterStory.storyName = 'With Header And Footer';\nWithPaginationAndVirtualizationStory.storyName =\n  'With Pagination And Virtualization';\nTypeaheadWithRightSlotStory.storyName = 'Typeahead With Right Slot';\n"
        },
        "css": {
          "path": "Typeahead.module.css",
          "content": "@value (\n  sizeFluid\n) from '../../styles/variables/_size.css';\n\n.typeaheadContainer {\n  display: flex;\n  position: relative;\n  flex-flow: column;\n  width: sizeFluid;\n  height: fit-content;\n}\n\n.menuWrapper {\n  width: var(--dropdown-width);\n  z-index: var(--menu-elevation);\n}\n\n/* Announced by screen readers (loading / result count) but visually hidden. */\n.visuallyHidden {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  border: 0;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  white-space: nowrap;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/Typeahead/SimpleTypeahead';\nexport * from '../../components/Typeahead/Typeahead';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "SimpleTypeahead.d.ts": {
            "path": "SimpleTypeahead.d.ts",
            "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nimport type { MenuClassNames, MenuLabelTooltip } from '../../types/menu';\nimport type { ClickAwayRefType } from '../../utils/click-away';\nimport type { InputProps } from '../../components/Input';\nimport type { MenuOption, Virtualization } from '../../components/Menu';\nimport type { ElevationType } from '../../components/Tooltip';\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    box?: string;\n}>;\nexport interface SimpleTypeaheadRef {\n    selectedKeys?: Array<string>;\n}\nexport interface SimpleTypeaheadProps extends Omit<InputProps, 'isLoading' | 'menuOpenOffset' | 'classNames' | 'options' | 'selectedKeys' | 'menuVirtualization' | 'header' | 'footer' | 'menuClassNames' | 'showLabelTooltip' | 'allowWrap' | 'elevation' | 'onSelect' | 'onSearch' | 'onMenuOpen' | 'onMenuClose' | 'onClear' | 'resolveLabel' | 'resolveSecondaryLabel' | 'clickAwayRef' | 'allowInternalFilter' | 'typeaheadInputText'> {\n    isLoading?: boolean;\n    menuOpenOffset?: number;\n    classNames?: ClassNames;\n    options?: Array<MenuOption>;\n    selectedKeys?: Array<string>;\n    menuVirtualization?: Virtualization;\n    header?: React.ReactNode;\n    footer?: React.ReactNode;\n    menuClassNames?: MenuClassNames;\n    showLabelTooltip?: MenuLabelTooltip;\n    allowWrap?: boolean;\n    elevation?: ElevationType;\n    onSelect?: (option: MenuOption, arg2?: React.SyntheticEvent<HTMLElement> | null | undefined) => unknown;\n    onSearch?: (evt: React.ChangeEvent<HTMLInputElement>) => unknown;\n    onMenuOpen?: () => unknown;\n    onMenuClose?: () => unknown;\n    onClear?: () => void;\n    resolveLabel?: (option: MenuOption) => string | React.ReactNode;\n    resolveSecondaryLabel?: (option: MenuOption) => string | React.ReactNode;\n    clickAwayRef?: React.RefObject<ClickAwayRefType | null>;\n    allowInternalFilter?: boolean;\n    typeaheadInputText?: string;\n    /**\n     * Opt in to the accessibility behavior of the `Typeahead` this renders: its\n     * ARIA roles and state, keyboard navigation of the options, and focus\n     * handling on close. Forwarded unchanged.\n     *\n     * Off by default, and off is this component exactly as it behaved before\n     * any of it existed.\n     */\n    enableA11y?: boolean;\n    testId?: string;\n}\nexport declare const SimpleTypeahead: Flow.AbstractComponent<SimpleTypeaheadProps, SimpleTypeaheadRef>;\nexport {};\n//# sourceMappingURL=SimpleTypeahead.d.ts.map"
          }
        }
      },
      "allFiles": [
        "SimpleTypeahead.stories.tsx",
        "SimpleTypeahead.tsx",
        "Typeahead.module.css",
        "Typeahead.stories.module.css",
        "Typeahead.stories.tsx",
        "Typeahead.tsx",
        "index.ts"
      ]
    },
    "VoiceOrb": {
      "name": "VoiceOrb",
      "path": "src/components/VoiceOrb",
      "files": {
        "main": null,
        "story": null,
        "css": null,
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/VoiceOrb/Microphone';\nexport * from '../../components/VoiceOrb/VoiceOrb';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {
          "Microphone/MicIcon.d.ts": {
            "path": "Microphone/MicIcon.d.ts",
            "content": "import * as React from 'react';\nexport declare const MicIcon: () => React.JSX.Element;\n//# sourceMappingURL=MicIcon.d.ts.map"
          },
          "Microphone/Microphone.d.ts": {
            "path": "Microphone/Microphone.d.ts",
            "content": "import * as React from 'react';\ntype ClassNames = Readonly<{\n    barsContainer?: string;\n    bar?: string;\n}>;\nexport interface MicrophoneProps {\n    classNames?: ClassNames;\n    enableMicrophone?: boolean;\n    testId?: string;\n}\ndeclare const Microphone: React.FC<MicrophoneProps>;\nexport { Microphone };\n//# sourceMappingURL=Microphone.d.ts.map"
          },
          "Microphone/index.d.ts": {
            "path": "Microphone/index.d.ts",
            "content": "export * from '../../../components/VoiceOrb/Microphone/Microphone';\n//# sourceMappingURL=index.d.ts.map"
          },
          "VoiceOrb/VoiceOrb.d.ts": {
            "path": "VoiceOrb/VoiceOrb.d.ts",
            "content": "import * as React from 'react';\ntype ClassNames = Readonly<{\n    container?: string;\n    orbContainer?: string;\n    orb?: string;\n}>;\nexport interface VoiceOrbHandle {\n    setVolume: (volume: number) => void;\n}\nexport interface VoiceOrbProps {\n    classNames?: ClassNames;\n    /** Enable listening to microphone audio input for bar animation */\n    enableMicrophone?: boolean;\n    testId?: string;\n    loading?: boolean;\n}\nexport declare const VoiceOrb: React.ForwardRefExoticComponent<VoiceOrbProps & React.RefAttributes<VoiceOrbHandle>>;\nexport {};\n//# sourceMappingURL=VoiceOrb.d.ts.map"
          },
          "VoiceOrb/index.d.ts": {
            "path": "VoiceOrb/index.d.ts",
            "content": "export * from '../../../components/VoiceOrb/VoiceOrb/VoiceOrb';\n//# sourceMappingURL=index.d.ts.map"
          },
          "constants.d.ts": {
            "path": "constants.d.ts",
            "content": "export declare const BAR_COUNT = 5;\nexport declare const BASE_HEIGHT = 4;\nexport declare const MAX_MULTIPLIERS: readonly [4, 8, 12, 8, 4];\nexport declare const MIN_SHADOW_BLUR = 0;\nexport declare const MAX_SHADOW_BLUR = 30;\nexport declare const MIN_SHADOW_BLUR_2 = 0;\nexport declare const MAX_SHADOW_BLUR_2 = 50;\nexport declare const MIN_SHADOW_BLUR_3 = 0;\nexport declare const MAX_SHADOW_BLUR_3 = 70;\nexport declare const MIN_OPACITY_1 = 0.3;\nexport declare const MAX_OPACITY_1 = 0.8;\nexport declare const MIN_OPACITY_2 = 0.2;\nexport declare const MAX_OPACITY_2 = 0.6;\nexport declare const MIN_OPACITY_3 = 0.15;\nexport declare const MAX_OPACITY_3 = 0.4;\nexport declare function calculateOrbShadowVars(volume: number): Record<string, string>;\nexport declare function uuid(): string;\n//# sourceMappingURL=constants.d.ts.map"
          }
        }
      },
      "allFiles": [
        "Microphone/MicIcon.tsx",
        "Microphone/Microphone.module.css",
        "Microphone/Microphone.stories.module.css",
        "Microphone/Microphone.stories.tsx",
        "Microphone/Microphone.tsx",
        "Microphone/index.ts",
        "VoiceOrb/VoiceOrb.module.css",
        "VoiceOrb/VoiceOrb.stories.module.css",
        "VoiceOrb/VoiceOrb.stories.tsx",
        "VoiceOrb/VoiceOrb.tsx",
        "VoiceOrb/index.ts",
        "constants.ts",
        "index.ts"
      ]
    },
    "WeekdayPicker": {
      "name": "WeekdayPicker",
      "path": "src/components/WeekdayPicker",
      "files": {
        "main": {
          "path": "WeekdayPicker.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\nexport declare const WEEKDAY_PICKER_SIZE: Readonly<{\n    small: \"small\";\n    medium: \"medium\";\n}>;\ntype ClassNames = Readonly<{\n    wrapper?: string;\n    button?: string;\n    label?: string;\n    helperText?: string;\n    selectedButton?: string;\n}>;\ntype WeekdayPickerSize = (typeof WEEKDAY_PICKER_SIZE)[keyof typeof WEEKDAY_PICKER_SIZE];\nexport interface Weekday {\n    key: string;\n    label: string;\n    secondaryLabel?: string;\n}\nexport interface WeekdayPickerProps {\n    size?: WeekdayPickerSize;\n    selectedWeekDays?: Array<Weekday>;\n    hiddenWeekDays?: Array<string>;\n    disabledWeekDays?: Array<string>;\n    customDayLabels?: Array<Weekday>;\n    onChange?: (selectedDays: Array<Weekday>, arg2?: React.SyntheticEvent<HTMLElement> | null | undefined) => unknown;\n    readOnly?: boolean;\n    classNames?: ClassNames;\n    showWeekends?: boolean;\n    ariaLabel?: string;\n    label?: React.ReactNode;\n    helperText?: React.ReactNode;\n    disableMultiSelect?: boolean;\n    testId?: string;\n}\nexport declare const WeekdayPicker: Flow.AbstractComponent<WeekdayPickerProps, HTMLDivElement>;\nexport {};\n//# sourceMappingURL=WeekdayPicker.d.ts.map"
        },
        "story": {
          "path": "WeekdayPicker.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {Weekday, WeekdayPickerProps} from 'src/components/WeekdayPicker';\nimport {WeekdayPicker} from 'src/components/WeekdayPicker/WeekdayPicker';\n\n\nexport default {\n  title: 'Form Components/Weekday Picker',\n  component: WeekdayPicker,\n  tags: ['autodocs'],\n  argTypes: {\n    size: {\n      description: 'The size of the WeekdayPicker, either small or medium.',\n      control: {\n        type: 'radio',\n      },\n      options: ['small', 'medium'],\n      table: {\n        type: {summary: 'enum'},\n        defaultValue: {summary: 'medium'},\n      },\n    },\n    selectedWeekDays: {\n      description: 'The days that are selected by default.',\n      control: {type: 'object'},\n      table: {\n        type: {summary: 'Array<{ key: string, label: string }>'},\n      },\n    },\n    hiddenWeekDays: {\n      description: 'Days that should be hidden from the picker.',\n      control: {type: 'object'},\n      table: {\n        type: {summary: 'Array<string>'},\n      },\n    },\n    disabledWeekDays: {\n      description: 'Days that are disabled and cannot be selected.',\n      control: {type: 'object'},\n      table: {\n        type: {summary: 'Array<string>'},\n      },\n    },\n    customDayLabels: {\n      description: 'Custom labels for the days of the week.',\n      control: {type: 'object'},\n      table: {\n        type: {\n          summary:\n            'Array<{ key: string, label: string, secondaryLabel?: string }>',\n        },\n      },\n    },\n    showWeekends: {\n      description: 'Show or hide weekends (Saturday and Sunday).',\n      control: {type: 'boolean'},\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: true},\n      },\n    },\n    readOnly: {\n      description: 'If true, the picker becomes non-interactive and read-only.',\n      control: {type: 'boolean'},\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    disableMultiSelect: {\n      description: 'If true, only one day can be selected at a time.',\n      control: {type: 'boolean'},\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: false},\n      },\n    },\n    onChange: {\n      description: 'Callback function triggered when the selected days change.',\n      action: 'onChange',\n      table: {\n        type: {\n          summary:\n            '(selectedDays: Array<Weekday>, event?: SyntheticEvent<HTMLElement>) => void',\n        },\n      },\n    },\n    label: {\n      description: 'Optional label for the picker.',\n      control: {type: 'text'},\n      table: {\n        type: {summary: 'React.Node'},\n      },\n    },\n    helperText: {\n      description: 'Optional helper text for the picker.',\n      control: {type: 'text'},\n      table: {\n        type: {summary: 'React.Node'},\n      },\n    },\n    testId: {\n      description: 'Test ID for the component',\n      control: {\n        type: 'text',\n      },\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle:\n        'Generates a WeekdayPicker component for selecting days of the week.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { WeekdayPicker } from \"@spaced-out/ui-design-system/lib/components/WeekdayPicker\";\n\\`\\`\\`\nThe \\`WeekdayPicker\\` component allows users to select one or multiple days of the week. It supports custom labels, disabled days, hidden days, and customizable size variants. It is also accessible, allowing for read-only mode, keyboard navigation, and ARIA support.\n\n- **Single Selection Mode**: When \\`disableMultiSelect\\` is set to true, only one day can be selected at a time, similar to a radio button group.\n- **Custom Labels**: You can provide custom day labels (e.g., localization).\n- **Disabled Days**: Certain days can be disabled from selection.\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/components/WeekdayPicker/WeekdayPicker',\n    },\n  },\n};\n\nexport const WithWeekendDisabledStory = (args: WeekdayPickerProps) => {\n  const [selectedDays, setSelectedDays] = React.useState<Array<Weekday>>([]);\n\n  return (\n    <WeekdayPicker\n      {...args}\n      selectedWeekDays={selectedDays}\n      onChange={(days) => setSelectedDays(days)}\n    />\n  );\n};\n\nWithWeekendDisabledStory.args = {\n  size: 'medium',\n  selectedWeekDays: [{key: 'mon', label: 'M'}],\n  disabledWeekDays: ['sun', 'sat'],\n  showWeekends: true,\n  label: 'Select your preferred weekdays',\n  helperText: 'Click to select multiple days. Weekends are disabled.',\n  testId: 'weekday-picker-weekend-disabled-story',\n};\n\nexport const WithCustomLabelsStory = (args: WeekdayPickerProps) => (\n  <WeekdayPicker {...args} />\n);\n\nWithCustomLabelsStory.args = {\n  size: 'medium',\n  customDayLabels: [\n    {key: 'sun', label: 'Do'},\n    {key: 'mon', label: 'Lu'},\n    {key: 'tue', label: 'Ma'},\n    {key: 'wed', label: 'Mi'},\n    {key: 'thu', label: 'Ju'},\n    {key: 'fri', label: 'Vi'},\n    {key: 'sat', label: 'Sá'},\n  ],\n  showWeekends: true,\n  testId: 'weekday-picker-custom-labels-story',\n};\n\nexport const WithoutWeekendsStory = (args: WeekdayPickerProps) => (\n  <WeekdayPicker {...args} />\n);\n\nWithoutWeekendsStory.args = {\n  size: 'medium',\n  showWeekends: false,\n  testId: 'weekday-picker-without-weekends-story',\n};\n\nexport const ReadOnlyStory = (args: WeekdayPickerProps) => (\n  <WeekdayPicker {...args} />\n);\n\nReadOnlyStory.args = {\n  readOnly: true,\n  selectedWeekDays: [\n    {key: 'mon', label: 'M'},\n    {key: 'wed', label: 'W'},\n    {key: 'fri', label: 'F'},\n  ],\n  showWeekends: true,\n  testId: 'weekday-picker-read-only-story',\n};\n\nexport const MultipleSelectionStory = (args: WeekdayPickerProps) => {\n  const [selectedDays, setSelectedDays] = React.useState([\n    {key: 'mon', label: 'M'},\n    {key: 'wed', label: 'W'},\n  ]);\n\n  return (\n    <WeekdayPicker\n      {...args}\n      selectedWeekDays={selectedDays}\n      onChange={(days) => setSelectedDays(days)}\n    />\n  );\n};\n\nMultipleSelectionStory.args = {\n  size: 'medium',\n  showWeekends: true,\n  testId: 'weekday-picker-multiple-selection-story',\n};\n\nexport const DisabledWeekDaysStory = (args: WeekdayPickerProps) => {\n  const [selectedDays, setSelectedDays] = React.useState([\n    {key: 'wed', label: 'W'},\n  ]);\n\n  return (\n    <WeekdayPicker\n      {...args}\n      selectedWeekDays={selectedDays}\n      onChange={(days) => setSelectedDays(days)}\n    />\n  );\n};\n\nDisabledWeekDaysStory.args = {\n  size: 'medium',\n  showWeekends: true,\n  disabledWeekDays: ['tue', 'thu'],\n  testId: 'weekday-picker-disabled-week-days-story',\n};\n\nexport const SingleSelectionStory = (args: WeekdayPickerProps) => {\n  const [selectedDay, setSelectedDay] = React.useState<Array<Weekday>>([]);\n\n  return (\n    <WeekdayPicker\n      {...args}\n      selectedWeekDays={selectedDay}\n      disableMultiSelect\n      onChange={(days) => setSelectedDay(days)}\n    />\n  );\n};\n\nSingleSelectionStory.args = {\n  size: 'medium',\n  showWeekends: true,\n  testId: 'weekday-picker-single-selection-story',\n};\n\nexport const WithHiddenDaysStory = (args: WeekdayPickerProps) => (\n  <WeekdayPicker {...args} />\n);\n\nWithHiddenDaysStory.args = {\n  size: 'medium',\n  showWeekends: true,\n  hiddenWeekDays: ['tue', 'thu'],\n  testId: 'weekday-picker-hidden-days-story',\n};\n\nexport const WithWeekdayNamesStory = (args: WeekdayPickerProps) => (\n  <WeekdayPicker {...args} />\n);\n\nWithWeekdayNamesStory.args = {\n  size: 'medium',\n  customDayLabels: [\n    {key: 'sun', label: 'S', secondaryLabel: 'Sun'},\n    {key: 'mon', label: 'M', secondaryLabel: 'Mon'},\n    {key: 'tue', label: 'T', secondaryLabel: 'Tue'},\n    {key: 'wed', label: 'W', secondaryLabel: 'Wed'},\n    {key: 'thu', label: 'T', secondaryLabel: 'Thu'},\n    {key: 'fri', label: 'F', secondaryLabel: 'Fri'},\n    {key: 'sat', label: 'S', secondaryLabel: 'Sat'},\n  ],\n  testId: 'weekday-picker-weekday-names-story',\n};\nWithWeekendDisabledStory.storyName = 'With Weekend Disabled';\nWithCustomLabelsStory.storyName = 'With Custom Labels';\nWithoutWeekendsStory.storyName = 'Without Weekends';\nReadOnlyStory.storyName = 'Read Only';\nMultipleSelectionStory.storyName = 'Multiple Selection';\nDisabledWeekDaysStory.storyName = 'Disabled Week Days';\nSingleSelectionStory.storyName = 'Single Selection';\nWithHiddenDaysStory.storyName = 'With Hidden Days';\nWithWeekdayNamesStory.storyName = 'With Weekday Names';\n"
        },
        "css": {
          "path": "WeekdayPicker.module.css",
          "content": "@value (colorTextSecondary,\n  colorFillSecondary,\n  colorButtonFillTertiaryHovered,\n  colorTextPrimary,\n  colorButtonFillPrimaryEnabled,\n  colorTextInversePrimary,\n  colorButtonFillPrimaryHovered,\n  colorTextDisabled,\n  colorFillDisabled,\n  colorFocusPrimary,\n  colorBackgroundSecondary,\n  colorGrayLightest) from '../../styles/variables/_color.css';\n\n@value (spaceXXSmall, spaceXSmall, spaceSmall) from '../../styles/variables/_space.css';\n@value (size8, size42, size34) from '../../styles/variables/_size.css';\n\n@value (borderRadiusSmall, borderWidthNone, borderWidthTertiary) from '../../styles/variables/_border.css';\n\n.weekdayPickerContainer {\n  display: flex;\n  flex-direction: column;\n  gap: spaceXXSmall;\n}\n\n.weekdayPickerDays {\n  display: flex;\n  gap: spaceSmall;\n}\n\n.weekdayButton {\n  composes: formLabelSmall from '../../styles/typography.module.css';\n  composes: motionEaseInEaseOut from '../../styles/animation.module.css';\n  flex-direction: column;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background-color: colorBackgroundSecondary;\n  color: colorTextSecondary;\n  padding: spaceXSmall spaceSmall;\n  border-radius: borderRadiusSmall;\n\n  &:hover,\n  &:focus-visible {\n    background-color: colorGrayLightest;\n    color: colorTextPrimary;\n    cursor: pointer;\n  }\n\n  &:focus-visible {\n    box-shadow: borderWidthNone borderWidthNone borderWidthNone\n      borderWidthTertiary colorFocusPrimary;\n  }\n}\n\n.weekdayButtonMedium {\n  composes: buttonTextMedium from '../../styles/typography.module.css';\n  height: size42;\n  width: size42;\n}\n\n.weekdayButtonSmall {\n  composes: buttonTextSmall from '../../styles/typography.module.css';\n  height: size34;\n  width: size34;\n\n  .secondaryLabel {\n    font-size: size8;\n  }\n}\n\n.weekdayButtonSelected {\n  background-color: colorButtonFillPrimaryEnabled;\n  color: colorTextInversePrimary;\n\n  &:hover,\n  &:focus-visible {\n    background-color: colorButtonFillPrimaryHovered;\n    color: colorTextInversePrimary;\n  }\n}\n\n.weekdayButtonDisabled {\n  background-color: colorFillDisabled;\n  color: colorTextDisabled;\n  pointer-events: none;\n  cursor: not-allowed;\n}\n\n.secondaryLabel {\n  composes: bodySmall from '../../styles/typography.module.css';\n  color: colorTextSecondary;\n  background-color: transparent;\n\n  /* Added a transition to .secondaryLabel for smoother and immediate style updates \n   during hover or focus-visible states of .secondaryLabelSelected. This ensures the \n   change feels intentional, even if there’s a minor rendering delay. */\n  transition: background-color 0.1s, color 0.1s, font-size 0.1s;\n}\n\n.secondaryLabelSelected {\n  color: colorTextInversePrimary;\n}\n\n.secondaryLabelDisabled {\n  background-color: colorFillDisabled;\n  color: colorTextDisabled;\n  pointer-events: none;\n  cursor: not-allowed;\n}\n\n.weekdayLabel {\n  composes: formLabelSmall from '../../styles/typography.module.css';\n  color: colorTextSecondary;\n}\n\n.weekdayHelperText {\n  composes: bodySmall from '../../styles/typography.module.css';\n  color: colorTextSecondary;\n}\n\n.weekdayReadOnly {\n  pointer-events: none;\n  cursor: not-allowed;\n}\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../components/WeekdayPicker/WeekdayPicker';\n//# sourceMappingURL=index.d.ts.map"
        },
        "additional": {}
      },
      "allFiles": [
        "WeekdayPicker.module.css",
        "WeekdayPicker.stories.module.css",
        "WeekdayPicker.stories.tsx",
        "WeekdayPicker.tsx",
        "index.ts"
      ]
    }
  },
  "hooks": {
    "useArbitraryOptionAddition": {
      "name": "useArbitraryOptionAddition",
      "path": "src/hooks/useArbitraryOptionAddition",
      "files": {
        "main": {
          "path": "useArbitraryOptionAddition.d.ts",
          "content": "import type { BaseOption, GroupTitleOption } from '../../hooks/useFilteredOptions';\nexport interface ArbitraryOption {\n    key: string;\n    label: string;\n    arbitrary?: boolean;\n    multiArbitrary?: boolean;\n}\nexport declare function useArbitraryOptionAddition<V extends BaseOption>({ searchTerm, options, excludedKeys, allowArbitraryValues, allowMultiArbitraryValues, validateArbitraryValue, makeArbitraryValue, makeMultiArbitraryValue, groupTitleOptions, arbitraryGroup, searchOptionsBy, }: {\n    searchTerm: string;\n    options?: V[];\n    excludedKeys?: string[];\n    allowArbitraryValues?: boolean;\n    allowMultiArbitraryValues?: boolean;\n    validateArbitraryValue?: (arg1: string) => boolean;\n    makeArbitraryValue?: (arg1: string) => V;\n    makeMultiArbitraryValue?: (arg1: string) => V | undefined;\n    groupTitleOptions?: GroupTitleOption<V>[];\n    arbitraryGroup?: GroupTitleOption<V>;\n    searchOptionsBy?: (option: V, searchTerm: string) => boolean;\n}): {\n    optionsWithArbitrary: Array<V>;\n    groupTitleOptionsWithArbitrary: Array<GroupTitleOption<V>>;\n};\n//# sourceMappingURL=useArbitraryOptionAddition.d.ts.map"
        },
        "story": {
          "path": "useArbitraryOptionAddition.stories.tsx",
          "content": "import * as React from 'react';\n\n// Use a plain input to avoid import errors\nimport {useArbitraryOptionAddition} from 'src/hooks/useArbitraryOptionAddition/useArbitraryOptionAddition';\n\nimport {Input} from 'src/components/Input';\nimport type {MenuOption} from 'src/components/Menu';\nimport {Menu} from 'src/components/Menu';\n\nimport css from 'src/hooks/useArbitraryOptionAddition/useArbitraryOptionAddition.stories.module.css';\n\n// Create a type that extends both BaseOption and MenuOption\ninterface ExtendedMenuOption\n  extends Omit<MenuOption, 'arbitrary' | 'multiArbitrary'> {\n  arbitrary?: boolean;\n  multiArbitrary?: boolean;\n}\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Hooks/useArbitraryOptionAddition',\n  component: useArbitraryOptionAddition,\n  parameters: {\n    docs: {\n      description: {\n        component: `\n\\`\\`\\`js\nimport { useArbitraryOptionAddition } from \"@spaced-out/ui-design-system/lib/hooks/useArbitraryOptionAddition\";\n\\`\\`\\`\nThe \\`useArbitraryOptionAddition\\` hook allows you to add arbitrary (user-defined) options to a list, such as for tag or token inputs. It works with both flat and grouped options, and supports custom validation and creation logic.\n\n### Parameters\n- \\`searchTerm\\`: The search term to filter the options.\n- \\`options\\`: The options to filter.\n- \\`groupTitleOptions\\`: The grouped options to filter.\n- \\`excludedKeys\\`: The keys to exclude from the options.\n- \\`allowArbitraryValues\\`: Whether to allow arbitrary values. Defaults to \\`true\\`.\n- \\`allowMultiArbitraryValues\\`: Whether to allow multiple arbitrary values. Defaults to \\`false\\`.\n- \\`validateArbitraryValue\\`: The function to validate the arbitrary value. Defaults to \\`(value) => value.trim() !== ''.\\`\n- \\`makeArbitraryValue\\`: The function to make the arbitrary value. Defaults to \\`(searchTerm) => ({key: searchTerm, label: searchTerm, arbitrary: true}).\\`\n- \\`makeMultiArbitraryValue\\`: The function to make the multi-arbitrary value. Defaults to \\`(searchTerm) => ({key: searchTerm, label: searchTerm, multiArbitrary: true}).\\`\n\n\n### Return Type\n- An object with:\n  - \\`arbitraryOptionsAdded\\`: The filtered options array, with arbitrary options added if appropriate.\n  - \\`arbitraryGroupTitleOptionsAdded\\`: The filtered grouped options array, with arbitrary options added if appropriate.\n\n### Usage\n\\`\\`\\`jsx\nconst { arbitraryOptionsAdded, arbitraryGroupTitleOptionsAdded } = useArbitraryOptionAddition({\n  searchTerm,\n  options,\n  groupTitleOptions,\n  excludedKeys,\n  allowArbitraryValues,\n  allowMultiArbitraryValues,\n  validateArbitraryValue,\n  makeArbitraryValue,\n  makeMultiArbitraryValue,\n});\n\\`\\`\\`\n\n####Note:\n - The \\`arbitraryOptionsAdded\\` and \\`arbitraryGroupTitleOptionsAdded\\` arrays are the filtered options with arbitrary options added if appropriate.\n        `,\n      },\n    },\n  },\n};\n\nconst options: ExtendedMenuOption[] = [\n  {key: 'apple', label: 'Apple'},\n  {key: 'banana', label: 'Banana'},\n  {key: 'orange', label: 'Orange'},\n  {key: 'grape', label: 'Grape'},\n];\n\nexport const Basic = () => {\n  const [searchTerm, setSearchTerm] = React.useState('');\n  const {optionsWithArbitrary} = useArbitraryOptionAddition<ExtendedMenuOption>(\n    {\n      searchTerm,\n      options,\n    },\n  );\n\n  return (\n    <div className={css.container}>\n      <Input\n        type=\"text\"\n        value={searchTerm}\n        onChange={(e) => setSearchTerm(String(e.target.value))}\n        placeholder=\"Search for fruits\"\n      />\n      <Menu\n        options={optionsWithArbitrary}\n        onSelect={(option) => {\n          // eslint-disable-next-line no-console\n          console.log('Selected:', option);\n        }}\n        resolveLabel={(option: ExtendedMenuOption) => {\n          if (option.arbitrary && option.label) {\n            return `Create New \"${option.label}\"`;\n          }\n          return option.label;\n        }}\n      />\n    </div>\n  );\n};\n\nconst groupTitleOptions = [\n  {\n    groupTitle: <span>Fruits</span>,\n    groupId: 'fruits',\n    options: [\n      {key: 'apple', label: 'Apple'},\n      {key: 'banana', label: 'Banana'},\n      {key: 'orange', label: 'Orange'},\n      {key: 'grape', label: 'Grape'},\n    ] as ExtendedMenuOption[],\n  },\n  {\n    groupTitle: <span>Vegetables</span>,\n    groupId: 'vegetables',\n    options: [\n      {key: 'carrot', label: 'Carrot'},\n      {key: 'broccoli', label: 'Broccoli'},\n      {key: 'spinach', label: 'Spinach'},\n    ] as ExtendedMenuOption[],\n  },\n];\n\nexport const Grouped = () => {\n  const [searchTerm, setSearchTerm] = React.useState('');\n  const {groupTitleOptionsWithArbitrary} =\n    useArbitraryOptionAddition<ExtendedMenuOption>({\n      searchTerm,\n      groupTitleOptions,\n    });\n\n  return (\n    <div className={css.container}>\n      <Input\n        type=\"text\"\n        value={searchTerm}\n        onChange={(e) => setSearchTerm(String(e.target.value))}\n        placeholder=\"Type to add or filter...\"\n      />\n      <Menu\n        groupTitleOptions={groupTitleOptionsWithArbitrary}\n        onSelect={(option) => {\n          // eslint-disable-next-line no-console\n          console.log('Selected:', option);\n        }}\n        resolveLabel={(option: ExtendedMenuOption) => {\n          if (option.arbitrary && option.label) {\n            return `Create New \"${option.label}\"`;\n          }\n          return option.label;\n        }}\n      />\n    </div>\n  );\n};\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../hooks/useArbitraryOptionAddition/useArbitraryOptionAddition';\n//# sourceMappingURL=index.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "useArbitraryOptionAddition.stories.module.css",
        "useArbitraryOptionAddition.stories.tsx",
        "useArbitraryOptionAddition.ts"
      ]
    },
    "useAudioAnalyzer": {
      "name": "useAudioAnalyzer",
      "path": "src/hooks/useAudioAnalyzer",
      "files": {
        "main": {
          "path": "useAudioAnalyzer.d.ts",
          "content": "export interface AudioAnalyzerOptions {\n    /** Enable/disable audio analysis */\n    isListening: boolean;\n    /** Optional external MediaStream to use */\n    audioStream?: MediaStream | null;\n    /** Number of bars to generate intensity values for */\n    barCount?: number;\n    /** Smoothing factor for the analyzer (0-1) */\n    smoothingTimeConstant?: number;\n    /** FFT size for frequency analysis */\n    fftSize?: number;\n    /** Called on every rAF tick with computed intensities -- can use for imperative DOM updates */\n    onAnalyze?: (intensities: number[]) => void;\n    /** Minimum ms between state updates (throttle). Default 50 (~20fps). */\n    updateIntervalMs?: number;\n}\nexport interface AudioAnalyzerResult {\n    /** Whether the audio stream is active */\n    isActive: boolean;\n    /** Any error that occurred */\n    error: Error | null;\n}\nexport declare const useAudioAnalyzer: {\n    (options: AudioAnalyzerOptions): AudioAnalyzerResult;\n    displayName: string;\n};\n//# sourceMappingURL=useAudioAnalyzer.d.ts.map"
        },
        "story": {
          "path": "useAudioAnalyzer.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {MicrophoneProps} from 'src/components/VoiceOrb/Microphone/Microphone';\nimport {Microphone} from 'src/components/VoiceOrb/Microphone/Microphone';\n\nimport css from 'src/hooks/useAudioAnalyzer/useAudioAnalyzer.stories.module.css';\n\n\nconst meta = {\n  tags: ['autodocs'],\n  title: 'Hooks/useAudioAnalyzer',\n  component: Microphone,\n  argTypes: {\n    enableMicrophone: {\n      description:\n        'When **true**, activates the microphone and begins audio analysis.',\n      control: {type: 'boolean'},\n      table: {\n        type: {summary: 'boolean'},\n        defaultValue: {summary: 'false'},\n      },\n    },\n    classNames: {\n      description:\n        'Optional classNames to customize internal elements of the Microphone visualizer.',\n      control: {type: 'object'},\n      table: {\n        type: {summary: '{ barsContainer?: string; bar?: string }'},\n      },\n    },\n    testId: {\n      description: 'Base test id used to generate element-specific test ids.',\n      control: {type: 'text'},\n      table: {\n        type: {summary: 'string'},\n      },\n    },\n  },\n  parameters: {\n    docs: {\n      subtitle:\n        'Analyzes microphone audio input and delivers intensity values via callback.',\n      description: {\n        component: `\n\\`\\`\\`js\nimport { useAudioAnalyzer } from \"@spaced-out/ui-design-system/lib/hooks/useAudioAnalyzer\";\n\\`\\`\\`\nA hook that captures microphone audio (or accepts an external \\`MediaStream\\`), runs FFT frequency analysis,\nand delivers normalised intensity values (0–1) via an \\`onAnalyze\\` callback on every animation frame.\nThe example below uses the \\`Microphone\\` component which consumes \\`useAudioAnalyzer\\` internally to render animated level bars.\\n\n__NOTE__: \nMic Permission will not work in non-secure contexts (storybook dev mode - http).\n\n### Options\n- \\`isListening\\`: Enable/disable audio analysis.\n- \\`audioStream\\` (optional): An external \\`MediaStream\\` to analyse instead of the default microphone.\n- \\`barCount\\` (optional): Number of intensity values to produce. Default \\`5\\`.\n- \\`smoothingTimeConstant\\` (optional): Smoothing factor for the analyser (0–1). Default \\`0.8\\`.\n- \\`fftSize\\` (optional): FFT size for frequency analysis. Default \\`256\\`.\n- \\`onAnalyze\\` (optional): Callback invoked on every animation frame with computed intensities — use for imperative DOM updates.\n- \\`updateIntervalMs\\` (optional): Minimum ms between \\`onAnalyze\\` invocations (throttle). Default \\`50\\` (~20 fps).\n\n### Return Value\n- \\`isActive\\`: Whether the audio stream is currently active.\n- \\`error\\`: Any error that occurred (e.g. microphone permission denied).\n\n### Usage\n\\`\\`\\`jsx\nimport { useCallback, useRef } from \"react\";\nimport { useAudioAnalyzer } from \"@spaced-out/ui-design-system/lib/hooks/useAudioAnalyzer\";\n\nconst BAR_COUNT = 5;\nconst BASE_HEIGHT = 4;\n\nconst AudioVisualizer = () => {\n  const barsRef = useRef(null);\n\n  const onAnalyze = useCallback((intensities) => {\n    const container = barsRef.current;\n    if (!container) return;\n    const bars = container.children;\n    for (let i = 0; i < intensities.length; i++) {\n      bars[i].style.height = BASE_HEIGHT + intensities[i] * 40 + \"px\";\n    }\n  }, []);\n\n  const { isActive, error } = useAudioAnalyzer({\n    isListening: true,\n    barCount: BAR_COUNT,\n    onAnalyze,\n  });\n\n  if (error) return <span>Error: {error.message}</span>;\n\n  return (\n    <div ref={barsRef} style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n      {Array.from({ length: BAR_COUNT }, (_, i) => (\n        <div\n          key={i}\n          style={{\n            width: 6,\n            height: BASE_HEIGHT,\n            borderRadius: 3,\n            background: isActive ? \"#4f46e5\" : \"#d1d5db\",\n          }}\n        />\n      ))}\n    </div>\n  );\n};\n\\`\\`\\`\n        `,\n      },\n    },\n    storySource: {\n      componentPath: '/src/hooks/useAudioAnalyzer/useAudioAnalyzer.tsx',\n    },\n  },\n};\n\nexport default meta;\n\nexport const _useAudioAnalyzer = {\n  render: (args: MicrophoneProps) => (\n    <div className={css.container}>\n      <Microphone {...args} />\n    </div>\n  ),\n  args: {\n    enableMicrophone: true,\n    classNames: {},\n    testId: 'use-audio-analyzer',\n  },\n};\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../hooks/useAudioAnalyzer/useAudioAnalyzer';\n//# sourceMappingURL=index.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "useAudioAnalyzer.stories.module.css",
        "useAudioAnalyzer.stories.tsx",
        "useAudioAnalyzer.tsx"
      ]
    },
    "useCopyToClipboard": {
      "name": "useCopyToClipboard",
      "path": "src/hooks/useCopyToClipboard",
      "files": {
        "main": {
          "path": "useCopyToClipboard.d.ts",
          "content": "type CopiedValue = string | null;\ntype CopyFn = (text: string) => Promise<boolean>;\nexport declare function useCopyToClipboard(): [CopiedValue, CopyFn];\nexport {};\n//# sourceMappingURL=useCopyToClipboard.d.ts.map"
        },
        "story": {
          "path": "useCopyToClipboard.stories.tsx",
          "content": "import React from 'react';\n\nimport {useCopyToClipboard} from 'src/hooks/useCopyToClipboard/useCopyToClipboard';\n\nimport {Button} from 'src/components/Button';\nimport {BodyLarge} from 'src/components/Text';\n\nimport css from 'src/hooks/useCopyToClipboard/useCopyToClipboard.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Hooks/useCopyToClipboard',\n  component: useCopyToClipboard,\n  parameters: {\n    docs: {\n      description: {\n        component: `\n\\`\\`\\`js\nimport { useCopyToClipboard } from \"@spaced-out/ui-design-system/lib/hooks/useCopyToClipboard\";\n\\`\\`\\`\nThe \\`useCopyToClipboard\\` hook is a custom hook that provides functionality for copying text to the clipboard.\nIt returns a state value indicating whether the text was successfully copied, as well as a function to initiate the copy operation.\n\n### State Returned\n- \\`copiedText\\`: The text that was successfully copied. Returns \\`null\\` if the copy operation failed.\n\n### Function Returned\n- \\`copy\\`: A function that takes a string argument and attempts to copy it to the clipboard. Returns a promise that resolves to a boolean indicating the success of the copy operation.\n\n### Usage\n\\`\\`\\`jsx\nimport { useCopyToClipboard } from './useCopyToClipboard';\n\nconst MyComponent = () => {\n  const [copiedText, copy] = useCopyToClipboard();\n  const text = 'A quick brown fox jumps over the lazy dog';\n\n  const handleCopy = () => {\n    copy(text)\n      .then((success) => {\n        if (success) {\n          // Success handling\n        } else {\n          // Error handling\n        }\n      })\n      .catch((_error) => {\n        // Error handling\n      });\n  };\n\n  return (\n    <div className={css.container}>\n      <div>\n        <BodyLarge>Text to copy:</BodyLarge>\n        <BodyLarge>{text}</BodyLarge>\n      </div>\n      <Button onClick={handleCopy}>Copy Text</Button>\n      {copiedText && <div className={css.copiedText}>Copied: {copiedText}</div>}\n    </div>\n  );\n};\n\nexport default MyComponent;\n\\`\\`\\`\n        `,\n      },\n    },\n  },\n};\n\nexport const Example = (): React.ReactElement<React.ComponentProps<'div'>> => {\n  const [copiedText, copy] = useCopyToClipboard();\n  const text = 'A quick brown fox jumps over the lazy dog';\n\n  const handleCopy = () => {\n    copy(text)\n      .then((success) => {\n        if (success) {\n          // Success handling\n        } else {\n          // Error handling\n        }\n      })\n      .catch((_error) => {\n        // Error handling\n      });\n  };\n\n  return (\n    <div className={css.container}>\n      <div className={css.copiedText}>\n        <BodyLarge>Text to copy: {text}</BodyLarge>\n      </div>\n      <Button classNames={{wrapper: css.copiedText}} onClick={handleCopy}>\n        Copy Text\n      </Button>\n      {copiedText && (\n        <BodyLarge className={css.copiedText} color=\"success\">\n          Copied: {copiedText}\n        </BodyLarge>\n      )}\n    </div>\n  );\n};\n\nExample.parameters = {\n  docs: {\n    page: false,\n  },\n};\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../hooks/useCopyToClipboard/useCopyToClipboard';\n//# sourceMappingURL=index.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "useCopyToClipboard.stories.module.css",
        "useCopyToClipboard.stories.tsx",
        "useCopyToClipboard.ts"
      ]
    },
    "useDebounce": {
      "name": "useDebounce",
      "path": "src/hooks/useDebounce",
      "files": {
        "main": {
          "path": "useDebounce.d.ts",
          "content": "export declare const useDebounce: <T>(value: T, delay: number) => T;\n//# sourceMappingURL=useDebounce.d.ts.map"
        },
        "story": {
          "path": "useDebounce.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {useDebounce} from 'src/hooks/useDebounce/useDebounce';\n\nimport type {InputProps} from 'src/components/Input/Input';\nimport {Input} from 'src/components/Input/Input';\nimport {BodyLarge} from 'src/components/Text';\n\nimport css from 'src/hooks/useDebounce/useDebounce.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Hooks/useDebounce',\n  component: useDebounce,\n  parameters: {\n    docs: {\n      description: {\n        component: `\n\\`\\`\\`js\nimport { useDebounce } from \"@spaced-out/ui-design-system/lib/hooks/useDebounce\";\n\\`\\`\\`\nThe \\`useDebounce\\` hook is a custom hook that delays updating a value until after a specified delay period has passed since the last change.\n\n### Props Accepted\n- \\`value\\`: The value that needs to be debounced.\n- \\`delay\\`: The debounce delay time in milliseconds. Defaults to 300ms.\n\n### Props Returned\n- \\`debouncedValue\\`: The debounced value, updated after the specified delay.\n\n### Usage\n\\`\\`\\`jsx\nimport { useDebounce } from './useDebounce';\n\nconst MyComponent = () => {\n  const [inputValue, setInputValue] = useState('');\n  const debouncedValue = useDebounce(inputValue, 500);\n\n  return (\n    <div>\n      <input\n        type=\"text\"\n        value={inputValue}\n        onChange={(e) => setInputValue(e.target.value)}\n        placeholder=\"Type something...\"\n      />\n      <BodyLarge>{debouncedValue}</BodyLarge>\n    </div>\n  );\n};\n\nexport default MyComponent;\n\\`\\`\\`\n          `,\n      },\n    },\n  },\n};\n\nexport const ExampleStory = (\n  args: InputProps,\n): React.ReactElement<React.ComponentProps<'div'>> => {\n  const [value, setValue] = React.useState(args.value);\n  const debouncedValue = useDebounce(value, 500);\n\n  return (\n    <div className={css.inputContainer}>\n      <Input\n        {...args}\n        value={value}\n        onChange={(e) => setValue(e.target.value)}\n      />\n      <BodyLarge>{debouncedValue}</BodyLarge>\n    </div>\n  );\n};\n\nExampleStory.args = {\n  type: 'text',\n  size: 'medium',\n  label: 'Form Label',\n  value: '',\n  placeholder: 'Input Some text here',\n};\nExampleStory.storyName = 'Example';\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../hooks/useDebounce/useDebounce';\n//# sourceMappingURL=index.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "useDebounce.stories.module.css",
        "useDebounce.stories.tsx",
        "useDebounce.ts"
      ]
    },
    "useFileUpload": {
      "name": "useFileUpload",
      "path": "src/hooks/useFileUpload",
      "files": {
        "main": {
          "path": "useFileUpload.d.ts",
          "content": "import { type DropzoneInputProps, type DropzoneRootProps } from 'react-dropzone';\nimport type { FileObject, FileProgress, FileUploadBaseProps } from '../../components/FileUpload';\ntype GetRootProps = <T extends DropzoneRootProps>(props?: T) => T;\ntype GetInputProps = <T extends DropzoneInputProps>(props?: T) => T;\nexport interface UseFileUploadReturnProps {\n    validFiles: Array<FileObject>;\n    rejectedFiles: Array<FileObject>;\n    isDragActive: boolean;\n    shouldAcceptFiles: boolean;\n    getRootProps: GetRootProps;\n    getInputProps: GetInputProps;\n    handleFileClear: (id: string) => void;\n    handleClear: () => void;\n    moveFileToProgress: (id: string, progress: FileProgress) => void;\n    moveFileToSuccess: (id: string, successMessage?: string) => void;\n    moveFileToReject: (id: string, rejectReason?: string) => void;\n    setShowReUpload: (id: string, showReUpload?: boolean) => void;\n}\nexport declare const useFileUpload: ({ maxFiles, maxSize, accept, disabled, onValidFilesDrop, onRejectedFilesDrop, onFileClear, onClear, }: FileUploadBaseProps) => UseFileUploadReturnProps;\nexport {};\n//# sourceMappingURL=useFileUpload.d.ts.map"
        },
        "story": {
          "path": "useFileUpload.stories.tsx",
          "content": "import React from 'react';\n\nimport {useFileUpload} from 'src/hooks/useFileUpload/useFileUpload';\n\nimport {Button} from 'src/components/Button';\nimport {Card} from 'src/components/Card';\nimport {Dropdown} from 'src/components/Dropdown';\nimport {ClickableIcon, Icon} from 'src/components/Icon';\nimport {LinearLoader} from 'src/components/LinearLoader';\nimport type {MenuOption} from 'src/components/Menu';\nimport {BodyLarge, BodySmall} from 'src/components/Text';\nimport {Truncate} from 'src/components/Truncate';\n\nimport css from 'src/hooks/useFileUpload/useFileUpload.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Hooks/useFileUpload',\n  component: useFileUpload,\n  parameters: {\n    docs: {\n      description: {\n        component: `\n\\`\\`\\`js\nimport { useFileUpload } from \"@spaced-out/ui-design-system/lib/hooks/useFileUpload\";\n\\`\\`\\`\nThe \\`useFileUpload\\` hook is a custom hook that provides functionality for handling file uploads.\nIt allows you to manage the state of selected files, handle file validation and rejection,\nand perform various actions on the files.\n\n### Props Accepted\n- \\`maxFiles\\` (optional): The maximum number of files that can be selected. Defaults to 1.\n- \\`maxSize\\` (optional): The maximum size of the file that can be uploaded, in bytes.\n- \\`accept\\` (optional): An object specifying accepted file types. The keys are MIME types, and the values are arrays of file extensions.\n- \\`disabled\\` (optional): If set to \\`true\\`, the file upload functionality is disabled.\n- \\`onValidFilesDrop\\` (optional): A callback function called when valid files are selected or dropped. Receives an array of accepted files.\n- \\`onRejectedFilesDrop\\` (optional): A callback function called when files are rejected due to validation errors. Receives an array of rejected files.\n- \\`onFileClear\\` (optional): A callback function called when a file is cleared. Receives the ID of the cleared file.\n- \\`onClear\\` (optional): A callback function called when all files are cleared.\n\n### Props Returned\n- \\`validFiles\\`: An array of valid files that have been selected.\n- \\`rejectedFiles\\`: An array of rejected files with associated rejection reasons.\n- \\`isDragActive\\`: A boolean indicating whether a file is being dragged over the dropzone.\n- \\`shouldAcceptFiles\\`: A function that returns whether the dropzone should accept files based on the current state.\n- \\`getRootProps\\`: A function that returns props to be spread onto the dropzone container element.\n- \\`getInputProps\\`: A function that returns props to be spread onto the file input element.\n- \\`handleFileClear\\`: A function to clear a specific file from the selected files.\n- \\`handleClear\\`: A function to clear all selected files.\n- \\`moveFileToProgress\\`: A function to move a file to the progress state. Accepts the file ID and progress value.\n- \\`moveFileToSuccess\\`: A function to move a file to the success state. Accepts the file ID and optional success message.\n- \\`moveFileToReject\\`: A function to move a file to the reject state. Accepts the file ID and optional reject reason.\n- \\`setShowReUpload\\`: A function to set the \\`showReUpload\\` property of a file. Accepts the file ID and optional boolean value.\n\n### Usage\n\\`\\`\\`jsx\nimport { useFileUpload } from './useFileUpload';\n\nexport const Example = (): React$Element<'div'> => {\n  const [selectedFile, setSelectedFile] = React.useState(null);\n  const { validFiles, rejectedFiles, isDragActive, shouldAcceptFiles, getRootProps, getInputProps, handleFileClear, handleClear, moveFileToProgress, moveFileToSuccess, moveFileToReject,  } = useFileUpload({\n    maxFiles: 5,\n    maxSize: 5242880, // 5MB\n    accept: {\n      'image/*': ['.jpg', '.jpeg', '.png'],\n      'audio/*': ['.mp3', '.wav'],\n    },\n    disabled: false,\n    onValidFilesDrop: (acceptedFiles) => {\n      console.error('Valid files selected:', acceptedFiles);\n    },\n    onRejectedFilesDrop: (fileRejections) => {\n      console.error('Rejected files:', fileRejections);\n    },\n    onFileClear: (id) => {\n      console.error('File cleared:', id);\n    },\n    onClear: () => {\n      console.error('All files cleared');\n    },\n  });\n\n  return (\n    <div className={css.container}>\n      {/* Render the dropzone area */}\n      <div className={css.content}>\n        <div className={css.heading} {...getRootProps()}>\n          <input {...getInputProps()} />\n          {isDragActive ? (\n            <BodyLarge color=\"information\">Drop the files here...</BodyLarge>\n          ) : (\n            <BodyLarge color=\"information\">\n              Drag and drop files here or click to select files\n            </BodyLarge>\n          )}\n        </div>\n\n        {/* Render the clear all files button */}\n        {[...validFiles, ...rejectedFiles].length > 0 && (\n          <div className={css.globalClose}>\n            <Button type=\"ghost\" iconLeftName=\"trash-can\" onClick={handleClear}>\n              Clear all Files\n            </Button>\n          </div>\n        )}\n\n        {/* Render the list of valid files */}\n        {validFiles.length > 0 && (\n          <>\n            <BodyLarge color=\"success\">Valid Files:</BodyLarge>\n            <Card classNames={{wrapper: css.filesBlock}}>\n              <ul className={css.noPadding}>\n                {validFiles.map((file) => (\n                  <li key={file.id}>\n                    <div className={css.list}>\n                      <BodyLarge color=\"success\">\n                        <Truncate>\n                          {file.file.name} - {file.file.size} bytes{' '}\n                        </Truncate>\n                      </BodyLarge>\n                      <ClickableIcon\n                        name=\"trash-can\"\n                        color=\"success\"\n                        onClick={() => handleFileClear(file.id)}\n                      ></ClickableIcon>\n                    </div>\n                    {file.success && (\n                      <div className={css.stateMsg}>\n                        <Icon name=\"circle-check\" color=\"success\" />\n                        <BodySmall color=\"success\">\n                          {file.successMessage}\n                        </BodySmall>\n                      </div>\n                    )}\n                    {!!file.progress && (\n                      <div className={css.stateMsg}>\n                        <LinearLoader size=\"small\" value={file.progress} />\n                      </div>\n                    )}\n                  </li>\n                ))}\n              </ul>\n            </Card>\n          </>\n        )}\n\n        {/* Render the list of rejected files */}\n        {rejectedFiles.length > 0 && (\n          <>\n            <BodyLarge color=\"danger\">Rejected Files:</BodyLarge>\n            <Card classNames={{wrapper: css.filesBlock}}>\n              <ul className={css.noPadding}>\n                {rejectedFiles.map((file) => (\n                  <li key={file.id}>\n                    <div className={css.list}>\n                      <BodyLarge color=\"danger\">\n                        <Truncate>\n                          {file.file.name} - {file.file.size} bytes{' '}\n                        </Truncate>\n                      </BodyLarge>\n                      <ClickableIcon\n                        name=\"trash-can\"\n                        color=\"danger\"\n                        onClick={() => handleFileClear(file.id)}\n                      ></ClickableIcon>\n                    </div>\n                    {file.reject && (\n                      <div className={css.stateMsg}>\n                        <Icon name=\"bomb\" color=\"danger\" />\n                        <BodySmall color=\"danger\">\n                          {file.rejectReason}\n                        </BodySmall>\n                      </div>\n                    )}\n                    {!!file.progress && (\n                      <div className={css.stateMsg}>\n                        <LinearLoader size=\"small\" value={file.progress} />\n                      </div>\n                    )}\n                  </li>\n                ))}\n              </ul>\n            </Card>\n          </>\n        )}\n\n        {[...validFiles, ...rejectedFiles].length > 0 && (\n          <div className={css.tooling}>\n            <Dropdown\n              classNames={{wrapper: css.ddWrapper}}\n              label=\"Move File\"\n              dropdownInputText={selectedFile?.label}\n              placeholder=\"Select a file\"\n              menu={{\n                options: [...validFiles, ...rejectedFiles].map((option) => ({\n                  key: option.id,\n                  label: option.file.name,\n                })),\n              }}\n              onChange={(option) => setSelectedFile(option)}\n            ></Dropdown>\n            {!!selectedFile?.key && (\n              <div className={css.buttons}>\n                <Button\n                  type=\"tertiary\"\n                  onClick={() =>\n                    selectedFile.key &&\n                    moveFileToSuccess(\n                      selectedFile.key,\n                      'Your custom Success Message',\n                    )\n                  }\n                >\n                  Move to Success\n                </Button>\n                <Button\n                  type=\"tertiary\"\n                  onClick={() =>\n                    selectedFile.key &&\n                    moveFileToReject(\n                      selectedFile.key,\n                      'Your custom reject reason',\n                    )\n                  }\n                >\n                  Move to Reject\n                </Button>\n                <Button\n                  type=\"tertiary\"\n                  onClick={() =>\n                    selectedFile.key &&\n                    moveFileToProgress(\n                      selectedFile.key,\n                      ([...validFiles, ...rejectedFiles].find(\n                        (op) => op.id === selectedFile.key,\n                      )?.progress || 0) + 10,\n                    )\n                  }\n                >\n                  Set Progress + 10\n                </Button>\n              </div>\n            )}\n          </div>\n        )}\n      </div>\n    </div>\n  );\n};\n\nexport default MyComponent;\n\\`\\`\\`\n          `,\n      },\n    },\n  },\n};\n\nexport const Example = (): React.ReactElement<React.ComponentProps<'div'>> => {\n  const [selectedFile, setSelectedFile] = React.useState<\n    MenuOption | null | undefined\n  >(null);\n  const {\n    validFiles,\n    rejectedFiles,\n    isDragActive,\n    getRootProps,\n    getInputProps,\n    handleFileClear,\n    handleClear,\n    moveFileToProgress,\n    moveFileToSuccess,\n    moveFileToReject,\n  } = useFileUpload({\n    maxFiles: 5,\n    maxSize: 5242880, // 5MB\n    accept: {\n      'image/*': ['.jpg', '.jpeg', '.png'],\n      'audio/*': ['.mp3', '.wav'],\n    },\n    disabled: false,\n    onValidFilesDrop: (acceptedFiles) => {\n      console.error('Valid files selected:', acceptedFiles);\n    },\n    onRejectedFilesDrop: (fileRejections) => {\n      console.error('Rejected files:', fileRejections);\n    },\n    onFileClear: (id) => {\n      console.error('File cleared:', id);\n    },\n    onClear: () => {\n      console.error('All files cleared');\n    },\n  });\n\n  return (\n    <div className={css.container}>\n      {/* Render the dropzone area */}\n      <div className={css.content}>\n        <div className={css.heading} {...getRootProps()}>\n          <input {...getInputProps()} />\n          {isDragActive ? (\n            <BodyLarge color=\"information\">Drop the files here...</BodyLarge>\n          ) : (\n            <BodyLarge color=\"information\">\n              Drag and drop files here or click to select files\n            </BodyLarge>\n          )}\n        </div>\n\n        {/* Render the clear all files button */}\n        {[...validFiles, ...rejectedFiles].length > 0 && (\n          <div className={css.globalClose}>\n            <Button type=\"ghost\" iconLeftName=\"trash-can\" onClick={handleClear}>\n              Clear all Files\n            </Button>\n          </div>\n        )}\n\n        {/* Render the list of valid files */}\n        {validFiles.length > 0 && (\n          <>\n            <BodyLarge color=\"success\">Valid Files:</BodyLarge>\n            <Card classNames={{wrapper: css.filesBlock}}>\n              <div className={css.noPadding}>\n                {validFiles.map((file) => (\n                  <div key={file.id} className={css.col}>\n                    <div className={css.list}>\n                      {file.success && (\n                        <Icon name=\"circle-check\" color=\"success\" />\n                      )}\n                      <BodyLarge color=\"success\">\n                        <Truncate>\n                          {file.file.name} - {file.file.size} bytes{' '}\n                        </Truncate>\n                      </BodyLarge>\n                      <ClickableIcon\n                        name=\"trash-can\"\n                        color=\"success\"\n                        onClick={() => handleFileClear(file.id)}\n                      ></ClickableIcon>\n                    </div>\n\n                    {file.successMessage && (\n                      <div className={css.stateMsg}>\n                        <BodySmall color=\"success\">\n                          {file.successMessage}\n                        </BodySmall>\n                      </div>\n                    )}\n\n                    {!!file.progress && (\n                      <div className={css.stateMsg}>\n                        <LinearLoader\n                          size=\"small\"\n                          value={\n                            file.progress === 'indeterminate'\n                              ? 0\n                              : file.progress\n                          }\n                          indeterminate={file.progress === 'indeterminate'}\n                        />\n                      </div>\n                    )}\n                  </div>\n                ))}\n              </div>\n            </Card>\n          </>\n        )}\n\n        {/* Render the list of rejected files */}\n        {rejectedFiles.length > 0 && (\n          <>\n            <BodyLarge color=\"danger\">Rejected Files:</BodyLarge>\n            <Card classNames={{wrapper: css.filesBlock}}>\n              <div className={css.noPadding}>\n                {rejectedFiles.map((file) => (\n                  <div key={file.id} className={css.col}>\n                    <div className={css.list}>\n                      {file.reject && <Icon name=\"bomb\" color=\"danger\" />}\n                      <BodyLarge color=\"danger\">\n                        <Truncate>\n                          {file.file.name} - {file.file.size} bytes{' '}\n                        </Truncate>\n                      </BodyLarge>\n                      <ClickableIcon\n                        name=\"trash-can\"\n                        color=\"danger\"\n                        onClick={() => handleFileClear(file.id)}\n                      ></ClickableIcon>\n                    </div>\n\n                    {!!file.rejectReason && (\n                      <div className={css.stateMsg}>\n                        <BodySmall color=\"danger\">\n                          {file.rejectReason}\n                        </BodySmall>\n                      </div>\n                    )}\n\n                    {!!file.progress && (\n                      <div className={css.stateMsg}>\n                        <LinearLoader\n                          size=\"small\"\n                          value={\n                            file.progress === 'indeterminate'\n                              ? 0\n                              : file.progress\n                          }\n                          indeterminate={file.progress === 'indeterminate'}\n                        />\n                      </div>\n                    )}\n                  </div>\n                ))}\n              </div>\n            </Card>\n          </>\n        )}\n\n        {[...validFiles, ...rejectedFiles].length > 0 && (\n          <div className={css.tooling}>\n            <Dropdown\n              classNames={{wrapper: css.ddWrapper}}\n              label=\"Move File\"\n              dropdownInputText={selectedFile?.label}\n              placeholder=\"Select a file\"\n              menu={{\n                options: [...validFiles, ...rejectedFiles].map((option) => ({\n                  key: option.id,\n                  label: option.file.name,\n                })),\n              }}\n              onChange={(option) => setSelectedFile(option)}\n            ></Dropdown>\n            {!!selectedFile?.key && (\n              <div className={css.buttons}>\n                <Button\n                  type=\"tertiary\"\n                  onClick={() =>\n                    selectedFile.key &&\n                    moveFileToSuccess(\n                      selectedFile.key,\n                      'Your custom Success Message',\n                    )\n                  }\n                >\n                  Move to Success\n                </Button>\n                <Button\n                  type=\"tertiary\"\n                  onClick={() =>\n                    selectedFile.key &&\n                    moveFileToReject(\n                      selectedFile.key,\n                      'Your custom reject reason',\n                    )\n                  }\n                >\n                  Move to Reject\n                </Button>\n                <Button\n                  type=\"tertiary\"\n                  onClick={() =>\n                    selectedFile.key &&\n                    moveFileToProgress(selectedFile.key, 'indeterminate')\n                  }\n                >\n                  Set Progress + 10\n                </Button>\n              </div>\n            )}\n          </div>\n        )}\n      </div>\n    </div>\n  );\n};\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../hooks/useFileUpload/useFileUpload';\n//# sourceMappingURL=index.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "useFileUpload.stories.module.css",
        "useFileUpload.stories.tsx",
        "useFileUpload.ts"
      ]
    },
    "useFilteredOptions": {
      "name": "useFilteredOptions",
      "path": "src/hooks/useFilteredOptions",
      "files": {
        "main": {
          "path": "useFilteredOptions.d.ts",
          "content": "import * as React from 'react';\nexport interface GroupTitleOption<V> {\n    groupTitle: React.ReactNode;\n    options?: V[];\n    showLineDivider?: boolean;\n}\nexport interface BaseOption {\n    key: string;\n    label?: string;\n}\nexport declare function useFilteredOptions<V extends BaseOption>({ searchTerm, options, excludedKeys, groupTitleOptions, searchOptionsBy, }: {\n    searchTerm: string;\n    options?: V[];\n    groupTitleOptions?: GroupTitleOption<V>[];\n    excludedKeys?: string[];\n    searchOptionsBy?: (option: V, searchTerm: string) => boolean;\n}): {\n    filteredOptions: V[];\n    filteredGroupTitleOptions: GroupTitleOption<V>[];\n};\n//# sourceMappingURL=useFilteredOptions.d.ts.map"
        },
        "story": {
          "path": "useFilteredOptions.stories.tsx",
          "content": "import * as React from 'react';\n\nimport type {GroupTitleOption} from 'src/hooks/useFilteredOptions/useFilteredOptions';\nimport {useFilteredOptions} from 'src/hooks/useFilteredOptions/useFilteredOptions';\n\nimport {Input} from 'src/components/Input';\nimport type {MenuOption} from 'src/components/Menu';\nimport {Menu} from 'src/components/Menu';\n\nimport css from 'src/hooks/useFilteredOptions/useFilteredOptions.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Hooks/useFilteredOptions',\n  component: useFilteredOptions,\n  parameters: {\n    docs: {\n      description: {\n        component: `\n\\`\\`\\`js\nimport { useFilteredOptions } from \"@spaced-out/ui-design-system/lib/hooks/useFilteredOptions\";\n\\`\\`\\`\nThe \\`useFilteredOptions\\` hook provides a way to filter a flat or grouped list of options based on a search term and excluded keys.\n\n### Parameters\n- \\`searchTerm\\`: The string to filter options by.\n- \\`options\\`: (optional) Flat array of options.\n- \\`groupTitleOptions\\`: (optional) Array of grouped options.\n- \\`excludedKeys\\`: (optional) Array of keys to exclude from results.\n- \\`searchOptionsBy\\`: (optional) Custom filter function.\n\n### Return Type\n- An object with:\n  - \\`filteredOptions\\`: The filtered flat options array.\n  - \\`filteredGroupTitleOptions\\`: The filtered grouped options array.\n\n### Usage\n\\`\\`\\`jsx\nconst { filteredOptions, filteredGroupTitleOptions } = useFilteredOptions({\n  searchTerm,\n  options,\n  groupTitleOptions,\n  excludedKeys,\n  searchOptionsBy,\n});\n\\`\\`\\`\n\n- \\`searchTerm\\`: The string to filter options by.\n- \\`options\\`: (optional) Flat array of options.\n- \\`groupTitleOptions\\`: (optional) Array of grouped options.\n- \\`excludedKeys\\`: (optional) Array of keys to exclude from results.\n- \\`searchOptionsBy\\`: (optional) Custom filter function.\n\nSee the examples below for both flat and grouped options.\n        `,\n      },\n    },\n  },\n};\n\nconst options: MenuOption[] = [\n  {key: 'apple', label: 'Apple'},\n  {key: 'banana', label: 'Banana'},\n  {key: 'orange', label: 'Orange'},\n  {key: 'grape', label: 'Grape'},\n];\n\nexport const Basic = () => {\n  const [searchTerm, setSearchTerm] = React.useState('');\n  const {filteredOptions} = useFilteredOptions({\n    searchTerm,\n    options,\n  });\n\n  return (\n    <div className={css.container}>\n      <Input\n        type=\"text\"\n        value={searchTerm}\n        onChange={(e) => setSearchTerm(e.target.value)}\n        placeholder=\"Search fruits...\"\n      />\n\n      <Menu\n        options={filteredOptions}\n        onSelect={(option) => {\n          // You can add a handler here if you want to show selection\n          // For demo, just log the selected option\n          // eslint-disable-next-line no-console\n          console.log('Selected:', option);\n        }}\n      />\n    </div>\n  );\n};\n\nconst groupTitleOptions: GroupTitleOption<MenuOption>[] = [\n  {\n    groupTitle: <span>Fruits</span>,\n    options: [\n      {key: 'apple', label: 'Apple'},\n      {key: 'banana', label: 'Banana'},\n      {key: 'orange', label: 'Orange'},\n      {key: 'grape', label: 'Grape'},\n    ],\n  },\n  {\n    groupTitle: <span>Vegetables</span>,\n    options: [\n      {key: 'carrot', label: 'Carrot'},\n      {key: 'broccoli', label: 'Broccoli'},\n      {key: 'spinach', label: 'Spinach'},\n    ],\n  },\n];\n\nexport const Grouped = () => {\n  const [searchTerm, setSearchTerm] = React.useState('');\n  const {filteredGroupTitleOptions} = useFilteredOptions<MenuOption>({\n    searchTerm,\n    groupTitleOptions,\n  });\n\n  return (\n    <div style={{maxWidth: 300}}>\n      <Input\n        type=\"text\"\n        value={searchTerm}\n        onChange={(e) => setSearchTerm(e.target.value)}\n        placeholder=\"Search fruits or vegetables...\"\n      />\n      <Menu\n        groupTitleOptions={filteredGroupTitleOptions}\n        onSelect={(option) => {\n          // eslint-disable-next-line no-console\n          console.log('Selected:', option);\n        }}\n      />\n    </div>\n  );\n};\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../hooks/useFilteredOptions/useFilteredOptions';\n//# sourceMappingURL=index.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "useFilteredOptions.stories.module.css",
        "useFilteredOptions.stories.tsx",
        "useFilteredOptions.ts"
      ]
    },
    "useInfiniteScroll": {
      "name": "useInfiniteScroll",
      "path": "src/hooks/useInfiniteScroll",
      "files": {
        "main": {
          "path": "useInfiniteScroll.d.ts",
          "content": "interface InfiniteScrollOptions {\n    itemSize: number | ((index: number) => number);\n    threshold: number;\n    itemsLength: number;\n    hasNextPage: boolean;\n    loadMoreItems: () => Promise<void>;\n    containerHeight: number;\n    isVariableSizeList?: boolean;\n}\nexport declare function useInfiniteScroll({ itemSize, threshold, itemsLength, hasNextPage, loadMoreItems, containerHeight, isVariableSizeList, }: InfiniteScrollOptions): (scrollData: {\n    scrollOffset: number;\n    scrollDirection: 'forward' | 'backward';\n}) => void;\nexport {};\n//# sourceMappingURL=useInfiniteScroll.d.ts.map"
        },
        "story": null,
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../hooks/useInfiniteScroll/useInfiniteScroll';\n//# sourceMappingURL=index.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "useInfiniteScroll.ts"
      ]
    },
    "useInputState": {
      "name": "useInputState",
      "path": "src/hooks/useInputState",
      "files": {
        "main": {
          "path": "useInputState.d.ts",
          "content": "import * as React from 'react';\ntype ReturnType = [\n    string,\n    (event: React.ChangeEvent<HTMLInputElement>) => void\n];\n/**\n * Simple Hook to use with input tag. The primary purpose is an abstraction over input onChange property.\n * () => {\n *   const [value, onChange] = useInputState(\"\");\n *\n *   return <Input type=\"text\" value={value} onChange={onChange} />;\n * }\n */\nexport declare const useInputState: (initialState?: string) => ReturnType;\nexport {};\n//# sourceMappingURL=useInputState.d.ts.map"
        },
        "story": {
          "path": "useInputState.stories.tsx",
          "content": "import * as React from 'react';\n\nimport {useInputState} from 'src/hooks/useInputState/useInputState';\n\nimport {Input} from 'src/components/Input';\nimport {BodyLarge} from 'src/components/Text';\n\nimport css from 'src/hooks/useInputState/useInputState.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Hooks/useInputState',\n  component: useInputState,\n  parameters: {\n    docs: {\n      description: {\n        component: `\n\\`\\`\\`js\nimport { useInputState } from \"@spaced-out/ui-design-system/lib/hooks/useInputState\";\n\\`\\`\\`\nThe \\`useInputState\\` hook is a simple hook that provides state management for input elements.\nIt abstracts the onChange property of the input and returns the current value and a callback function to update it.\n\n### Return Type\n- An array with two elements:\n  - \\`value\\`: The current value of the input.\n  - \\`onChange\\`: A callback function to handle changes in the input value.\n\n### Usage\n\\`\\`\\`jsx\nimport { useInputState } from './useInputState';\n\nconst MyComponent = () => {\n  const [value, onChange] = useInputState('');\n\n  return (\n    <div className={css.container}>\n      <Input type=\"text\" value={value} onChange={onChange} />\n      <BodyLarge>Value: {value}</BodyLarge>\n    </div>\n  );\n};\n\nexport default MyComponent;\n\\`\\`\\`\n        `,\n      },\n    },\n  },\n};\n\nexport const Example = () => {\n  const [value, onChange] = useInputState('');\n\n  return (\n    <div className={css.container}>\n      <Input type=\"text\" value={value} onChange={onChange} />\n      <BodyLarge className={css.value}>Value: {value}</BodyLarge>\n    </div>\n  );\n};\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../hooks/useInputState/useInputState';\n//# sourceMappingURL=index.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "useInputState.stories.module.css",
        "useInputState.stories.tsx",
        "useInputState.ts"
      ]
    },
    "useInteractionModality": {
      "name": "useInteractionModality",
      "path": "src/hooks/useInteractionModality",
      "files": {
        "main": {
          "path": "useInteractionModality.d.ts",
          "content": "export type InteractionModality = 'keyboard' | 'pointer';\n/**\n * Begin tracking. Idempotent, and session-scoped by design: the listeners live\n * for the life of the page, so there is nothing to tear down.\n *\n * Tracking has to start BEFORE the thing that wants the answer exists. The\n * interesting question is \"how was the popup that just mounted opened?\", and the\n * keypress that opened it happened while the popup did not yet exist — so a\n * component reading this on mount is always too late to have attached the\n * listener itself. Whatever renders earlier and knows a popup may follow — a\n * menu trigger — primes it.\n *\n * It is not primed on import. Attaching document listeners is a side effect, and\n * a consumer that has not opted into any of this should get none: an app merely\n * importing a component from this package must not start listening to its\n * keyboard. Capture phase, so the modality is recorded before any component\n * handler reacts to the same event.\n */\nexport declare const startInteractionModalityTracking: () => void;\n/**\n * How the user last interacted with the page, read imperatively.\n *\n * Use this when the answer is needed during render or in an effect rather than\n * as reactive state — for example a popup deciding on mount whether it was opened\n * by keyboard, where re-rendering on later modality changes would be wrong.\n */\nexport declare const getInteractionModality: () => InteractionModality;\n/**\n * How the user last interacted with the page, as reactive state. Re-renders the\n * caller when the user switches between keyboard and pointer.\n */\nexport declare const useInteractionModality: (\n/**\n * Subscribe at all. False leaves the caller on the default and attaches\n * nothing — for a component whose consumer has not opted into the behavior\n * this modality serves.\n */\nenabled?: boolean) => InteractionModality;\n//# sourceMappingURL=useInteractionModality.d.ts.map"
        },
        "story": null,
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../hooks/useInteractionModality/useInteractionModality';\n//# sourceMappingURL=index.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "useInteractionModality.ts"
      ]
    },
    "useLockedBody": {
      "name": "useLockedBody",
      "path": "src/hooks/useLockedBody",
      "files": {
        "main": {
          "path": "useLockedBody.d.ts",
          "content": "type ReturnType = [boolean, (locked: boolean) => void];\nexport declare function useLockedBody(initialLocked?: boolean): ReturnType;\nexport {};\n//# sourceMappingURL=useLockedBody.d.ts.map"
        },
        "story": {
          "path": "useLockedBody.stories.tsx",
          "content": "import React from 'react';\n\nimport {useLockedBody} from 'src/hooks/useLockedBody/useLockedBody';\n\nimport {Button} from 'src/components/Button';\n\nimport css from 'src/hooks/useLockedBody/useLockedBody.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Hooks/useLockedBody',\n  component: useLockedBody,\n  parameters: {\n    docs: {\n      description: {\n        component: `\n\\`\\`\\`js\nimport { useLockedBody } from \"@spaced-out/ui-design-system/lib/hooks/useLockedBody\";\n\\`\\`\\`\nThe \\`useLockedBody\\` hook is a custom hook that allows locking and unlocking the scroll of the document's body.\nIt prevents the user from scrolling the page by setting the overflow and padding-right styles of the body element.\n\n### Return Type\n- An array with two elements:\n  - \\`locked\\`: A boolean indicating whether the body scroll is locked or not.\n  - \\`setLocked\\`: A function to toggle the locked state.\n\n### Usage\n\\`\\`\\`jsx\nimport { useLockedBody } from './useLockedBody';\n\nconst MyComponent = () => {\n  const [locked, setLocked] = useLockedBody(false);\n\n  const toggleLock = () => {\n    setLocked(!locked);\n  };\n\n  return (\n    <div className={css.container}>\n      <Button onClick={toggleLock}>\n        {locked ? 'Unlock Scroll' : 'Lock Scroll'}\n      </Button>\n    </div>\n  );\n};\n\nexport default MyComponent;\n\\`\\`\\`\n        `,\n      },\n    },\n  },\n};\n\nexport const Example = (): React.ReactElement<React.ComponentProps<'div'>> => {\n  const [locked, setLocked] = useLockedBody(false);\n\n  const toggleLock = () => {\n    setLocked(!locked);\n  };\n\n  return (\n    <div className={css.container}>\n      <Button onClick={toggleLock}>\n        {locked ? 'Unlock Scroll' : 'Lock Scroll'}\n      </Button>\n    </div>\n  );\n};\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../hooks/useLockedBody/useLockedBody';\n//# sourceMappingURL=index.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "useLockedBody.stories.module.css",
        "useLockedBody.stories.tsx",
        "useLockedBody.ts"
      ]
    },
    "useModal": {
      "name": "useModal",
      "path": "src/hooks/useModal",
      "files": {
        "main": {
          "path": "useModal.d.ts",
          "content": "import type { DialogSemanticType } from '../../components/Dialog';\nexport interface UseModalExtrasBase {\n    semantic?: DialogSemanticType;\n    title?: React.ReactNode;\n    description?: React.ReactNode;\n    cancelText?: string;\n    confirmText?: string;\n    onConfirmClick?: () => void;\n    onCancelClick?: () => void;\n}\nexport type UseModalExtras<T extends object = object> = UseModalExtrasBase & Omit<T, keyof UseModalExtrasBase>;\nexport interface UseModalReturnType<T extends object = object> {\n    isOpen: boolean;\n    openModal: (extras?: Partial<UseModalExtras<T>>) => void;\n    closeModal: () => void;\n    extras: UseModalExtras<T>;\n}\nexport declare function useModal<T extends object = object>(): UseModalReturnType<T>;\n//# sourceMappingURL=useModal.d.ts.map"
        },
        "story": {
          "path": "useModal.stories.tsx",
          "content": "import React from 'react';\n\nimport type {UseModalExtras} from 'src/hooks/useModal/useModal';\nimport {useModal} from 'src/hooks/useModal/useModal';\n\nimport {Button} from 'src/components/Button';\nimport {BasicDialog, DIALOG_SEMANTIC} from 'src/components/Dialog';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Hooks/useModal',\n  component: useModal,\n  parameters: {\n    docs: {\n      description: {\n        component: `\n\\`\\`\\`js\nimport { useModal } from \"@spaced-out/ui-design-system/lib/hooks/useModal\";\n\\`\\`\\`\nThe \\`useModal\\` hook is a simple hook that provides state management for Modal(Dialog) when triggered from hooks (non-components).\nYou can provide all the additional details in extras as shown in the example to invoke Modal(Dialog).\n\\n**Note:** You don't need this hook if you are using Dialog from a component.\n\n### Return Type\n- An Object with four elements:\n  - \\`isOpen\\`: The current value of if the Dialog is open.\n  - \\`openModal\\`: A callback function to perform open action on the Dialog with additional info which you can pass as params (title, description, ...).\n  - \\`closeModal\\`: A callback function to perform close action on the Dialog.\n  - \\`extras\\`: This is an object when the calling hook can set additional information and handlers as required for a particular use case. Refer the example for better understanding.\n\n### Usage\n\\`\\`\\`jsx\nimport { useModal } from './useModal';\n\nconst useIntermediateExampleHook = (\n    openModal: (extras?: UseModalExtras) => void,\n    closeModal: () => void,\n  ): ({handleClick: () => void}) => {\n    const onConfirmClick = () => {\n      console.error('onConfirmClick handler called');\n      closeModal();\n    };\n    const handleClick = () => {\n      openModal({\n        title: 'Dialog title',\n        description: 'Dialog description',\n        cancelText: 'Cancel',\n        confirmText: 'Confirm',\n        semantic: 'danger',\n        onConfirmClick,\n      });\n      console.error('some action in click handler useIntermediateExampleHook');\n    };\n    return {handleClick};\n  };\n\nexport const MyComponent = (): React$Element<'div'> => {\n    const { isOpen, openModal, closeModal, extras } = useModal();\n    const { handleClick } = useIntermediateExampleHook(openModal, closeModal);\n    return (\n      <div>\n        <Button type=\"primary\" onClick={handleClick}>\n          Open Dialog\n        </Button>\n        <BasicDialog\n          initialFocus={1}\n          onClose={closeModal}\n          semantic={extras.semantic}\n          isOpen={isOpen}\n          heading={extras.title}\n          body={extras.description}\n          confirmText={extras.confirmText}\n          abortText={extras.cancelText}\n          handleConfirm={extras.onConfirmClick}\n          handleAbort={closeModal}\n        />\n      </div>\n    );\n  };\n\n\nexport default MyComponent;\n\\`\\`\\`\n        `,\n      },\n    },\n  },\n};\n\nconst useIntermediateExampleHook = (\n  openModal: (extras: UseModalExtras<{someRandomProp: string}>) => void,\n  closeModal: () => void,\n): {\n  handleClick: () => void;\n} => {\n  const onConfirmClick = () => {\n    console.error('onConfirmClick handler called');\n    closeModal();\n  };\n  const handleClick = () => {\n    openModal({\n      title: 'Dialog title - useModal',\n      description: 'Dialog description - useModal',\n      cancelText: 'Cancel',\n      confirmText: 'Confirm',\n      semantic: DIALOG_SEMANTIC.danger,\n      onConfirmClick,\n      someRandomProp: '(Some Random Text)',\n    });\n    console.error('some action in click handler useIntermediateExampleHook');\n  };\n  return {handleClick};\n};\n\nexport const Example = (): React.ReactElement<React.ComponentProps<'div'>> => {\n  const {isOpen, openModal, closeModal, extras} = useModal<{\n    someRandomProp: string;\n  }>();\n  const {handleClick} = useIntermediateExampleHook(openModal, closeModal);\n  return (\n    <div>\n      <Button type=\"primary\" onClick={handleClick}>\n        Open Dialog{extras.someRandomProp}\n      </Button>\n      <BasicDialog\n        initialFocus={1}\n        onClose={closeModal}\n        semantic={extras.semantic}\n        isOpen={isOpen}\n        heading={extras.title}\n        body={extras.description}\n        confirmText={extras.confirmText}\n        abortText={extras.cancelText}\n        handleConfirm={extras.onConfirmClick}\n        handleAbort={closeModal}\n      />\n    </div>\n  );\n};\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../hooks/useModal/useModal';\n//# sourceMappingURL=index.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "useModal.stories.tsx",
        "useModal.ts"
      ]
    },
    "useMountTransition": {
      "name": "useMountTransition",
      "path": "src/hooks/useMountTransition",
      "files": {
        "main": null,
        "story": {
          "path": "useMountTransition.stories.tsx",
          "content": "import React from 'react';\n\nimport useMountTransition from 'src/hooks/useMountTransition';\n\nimport {BodyLarge} from 'src/components/Text';\n\nimport css from 'src/hooks/useMountTransition/useMountTransition.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Hooks/useMountTransition',\n  component: useMountTransition,\n  parameters: {\n    docs: {\n      description: {\n        component: `\n\\`\\`\\`js\nimport { useMountTransition } from \"@spaced-out/ui-design-system/lib/hooks/useMountTransition\";\n\\`\\`\\`\nThe \\`useMountTransition\\` hook is a custom hook that tracks the mount and unmount transitions of a component.\n\n### Props Accepted\n- \\`isMounted\\`: A boolean value indicating whether the component is mounted or not.\n- \\`unmountDelay\\`: The delay in milliseconds before transitioning from mounted to unmounted state.\n\n### Return Value\n- \\`isTransitioning\\`: A boolean value indicating whether the component is currently transitioning.\n\n### Usage\n\\`\\`\\`jsx\nimport useMountTransition from './useMountTransition';\n\nconst MyComponent = () => {\n  const isMounted = ...; // Some value indicating whether the component is mounted or not\n  const unmountDelay = ...; // Delay before transitioning from mounted to unmounted state\n\n  const isTransitioning = useMountTransition(isMounted, unmountDelay);\n\n  useEffect(() => {\n    // Perform any additional actions during transition\n    if (isTransitioning) {\n      // ...\n    }\n  }, [isTransitioning]);\n\n  return (\n    <div className={\\`${css.container} \\${isTransitioning ? css.transitioning : ''}\\`}>\n      <BodyLarge>Component content</BodyLarge>\n    </div>\n  );\n};\n\nexport default MyComponent;\n\\`\\`\\`\n        `,\n      },\n    },\n  },\n};\n\nexport const Example = (): React.ReactElement<React.ComponentProps<'div'>> => (\n  <div>\n    <BodyLarge>Usage documented above</BodyLarge>\n  </div>\n);\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "declare const useMountTransition: (isMounted: boolean, unmountDelay: number) => boolean;\nexport default useMountTransition;\n//# sourceMappingURL=index.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "useMountTransition.stories.module.css",
        "useMountTransition.stories.tsx"
      ]
    },
    "usePagination": {
      "name": "usePagination",
      "path": "src/hooks/usePagination",
      "files": {
        "main": {
          "path": "usePagination.d.ts",
          "content": "import type { PaginationBaseProps, PaginationItemProps } from '../../components/Pagination';\nexport declare const usePagination: (props: PaginationBaseProps) => {\n    items: Array<PaginationItemProps> | null | undefined;\n};\n//# sourceMappingURL=usePagination.d.ts.map"
        },
        "story": {
          "path": "usePagination.stories.tsx",
          "content": "import React from 'react';\n\nimport {usePagination} from 'src/hooks/usePagination/usePagination';\n\nimport {Pagination} from 'src/components/Pagination';\n\nimport css from 'src/hooks/usePagination/usePagination.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Hooks/usePagination',\n  component: usePagination,\n  parameters: {\n    docs: {\n      description: {\n        component: `\n\\`\\`\\`js\nimport { usePagination } from \"@spaced-out/ui-design-system/lib/hooks/usePagination\";\n\\`\\`\\`\nThe \\`usePagination\\` hook is a custom hook that provides pagination functionality.\nIt generates a list of pagination items based on the provided props, including\nthe current page, total number of pages, and various display options.\n\n### Props Accepted\n- \\`boundaryCount\\` (optional): The number of pages to display at the beginning and end of the pagination. Defaults to 1.\n- \\`totalPages\\` (optional): The total number of pages. Defaults to 1.\n- \\`disabled\\` (optional): If set to \\`true\\`, the pagination functionality is disabled.\n- \\`hideNextButton\\` (optional): If set to \\`true\\`, the next button is hidden.\n- \\`hidePrevButton\\` (optional): If set to \\`true\\`, the previous button is hidden.\n- \\`onChange\\` (optional): A callback function called when a pagination item is clicked. Receives the selected page number and the event object.\n- \\`currentPage\\` (optional): The currently selected page. Defaults to 1.\n- \\`showFirstButton\\` (optional): If set to \\`true\\`, the first button is shown.\n- \\`showLastButton\\` (optional): If set to \\`true\\`, the last button is shown.\n- \\`siblingCount\\` (optional): The number of sibling pages to display before and after the current page. Defaults to 1.\n- \\`style\\` (optional): The style of the pagination. Can be 'primary' or 'secondary'. Defaults to 'primary'.\n\n### Props Returned\n- \\`items\\`: An array of pagination items with associated props.\n\n### Usage\n\\`\\`\\`jsx\nimport { usePagination } from './usePagination';\n\nconst MyComponent = () => {\n  const { items } = usePagination({\n    boundaryCount: 1,\n    totalPages: 10,\n    disabled: false,\n    hideNextButton: false,\n    hidePrevButton: false,\n    onChange: (selectedPage, event) => {\n    },\n    currentPage: 1,\n    showFirstButton: false,\n    showLastButton: false,\n    siblingCount: 1,\n    style: 'primary',\n  });\n};\n\nexport default MyComponent;\n\\`\\`\\`\n          `,\n      },\n    },\n  },\n};\n\nexport const Example = (): React.ReactElement<React.ComponentProps<'div'>> => (\n  <div className={css.pagination}>\n    <Pagination currentPage={10} totalPages={20}></Pagination>\n  </div>\n);\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../hooks/usePagination/usePagination';\n//# sourceMappingURL=index.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "usePagination.stories.module.css",
        "usePagination.stories.tsx",
        "usePagination.ts"
      ]
    },
    "useReferenceElementWidth": {
      "name": "useReferenceElementWidth",
      "path": "src/hooks/useReferenceElementWidth",
      "files": {
        "main": {
          "path": "useReferenceElementWidth.d.ts",
          "content": "export declare function useReferenceElementWidth(ref?: HTMLElement | null, minWidth?: number): string;\n//# sourceMappingURL=useReferenceElementWidth.d.ts.map"
        },
        "story": null,
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../hooks/useReferenceElementWidth/useReferenceElementWidth';\n//# sourceMappingURL=index.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "useReferenceElementWidth.ts"
      ]
    },
    "useResizeObserver": {
      "name": "useResizeObserver",
      "path": "src/hooks/useResizeObserver",
      "files": {
        "main": {
          "path": "useResizeObserver.d.ts",
          "content": "import * as React from 'react';\nexport declare function useResizeObserver(): [React.Ref<HTMLDivElement>, number];\n//# sourceMappingURL=useResizeObserver.d.ts.map"
        },
        "story": null,
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../hooks/useResizeObserver/useResizeObserver';\n//# sourceMappingURL=index.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "useResizeObserver.ts"
      ]
    },
    "useToastPortal": {
      "name": "useToastPortal",
      "path": "src/hooks/useToastPortal",
      "files": {
        "main": {
          "path": "useToastPortal.d.ts",
          "content": "interface UseToastPortal {\n    toastRef: {\n        current: HTMLDivElement | null;\n    };\n}\nexport declare const useToastPortal: ({ toastRef, }: UseToastPortal) => {\n    loaded: boolean;\n};\nexport {};\n//# sourceMappingURL=useToastPortal.d.ts.map"
        },
        "story": null,
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../hooks/useToastPortal/useToastPortal';\n//# sourceMappingURL=index.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "useToastPortal.ts"
      ]
    },
    "useToggle": {
      "name": "useToggle",
      "path": "src/hooks/useToggle",
      "files": {
        "main": {
          "path": "useToggle.d.ts",
          "content": "export declare function useToggle(initialState?: boolean): [boolean, (newValue: boolean) => void];\n//# sourceMappingURL=useToggle.d.ts.map"
        },
        "story": {
          "path": "useToggle.stories.tsx",
          "content": "import React from 'react';\n\nimport {useToggle} from 'src/hooks/useToggle/useToggle';\n\nimport {Button} from 'src/components/Button';\nimport {BodyLarge} from 'src/components/Text';\n\nimport css from 'src/hooks/useToggle/useToggle.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Hooks/useToggle',\n  component: useToggle,\n  parameters: {\n    docs: {\n      description: {\n        component: `\n\\`\\`\\`js\nimport { useToggle } from \"@spaced-out/ui-design-system/lib/hooks/useToggle\";\n\\`\\`\\`\nThe \\`useToggle\\` hook is a custom hook that provides a boolean state value and a function to toggle its value between true and false.\n\n### Props Accepted\n- \\`initialState\\` (optional): The initial state value. Defaults to false.\n\n### Props Returned\n- \\`stateValue\\`: The current state value.\n- \\`toggle\\`: A function to toggle the state value.\n\n### Usage\n\\`\\`\\`jsx\nimport { useToggle } from './useToggle';\n\nconst MyComponent = () => {\n  const [isActive, toggleActive] = useToggle(false);\n\n  return (\n    <div>\n      <button onClick={toggleActive}>\n        Toggle\n      </button>\n      {isActive && <BodyLarge>Active</BodyLarge>}\n    </div>\n  );\n};\n\nexport default MyComponent;\n\\`\\`\\`\n          `,\n      },\n    },\n  },\n};\n\nexport const Example = (): React.ReactElement<React.ComponentProps<'div'>> => {\n  const [isActive, toggleActive] = useToggle(false);\n\n  return (\n    <div>\n      {}\n      <Button onClick={() => toggleActive(!isActive)}>Toggle</Button>\n      {isActive && <BodyLarge className={css.text}>Active</BodyLarge>}\n      {!isActive && <BodyLarge className={css.text}>InActive</BodyLarge>}\n    </div>\n  );\n};\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../hooks/useToggle/useToggle';\n//# sourceMappingURL=index.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "useToggle.stories.module.css",
        "useToggle.stories.tsx",
        "useToggle.ts"
      ]
    },
    "useWindowSize": {
      "name": "useWindowSize",
      "path": "src/hooks/useWindowSize",
      "files": {
        "main": {
          "path": "useWindowSize.d.ts",
          "content": "interface WindowSize {\n    width: number;\n    height: number;\n}\nexport declare function useWindowSize(): WindowSize;\nexport {};\n//# sourceMappingURL=useWindowSize.d.ts.map"
        },
        "story": {
          "path": "useWindowSize.stories.tsx",
          "content": "import React from 'react';\n\nimport {useWindowSize} from 'src/hooks/useWindowSize/useWindowSize';\n\nimport {BodyLarge} from 'src/components/Text';\n\nimport css from 'src/hooks/useWindowSize/useWindowSize.stories.module.css';\n\n\nexport default {\n  tags: ['autodocs'],\n  title: 'Hooks/useWindowSize',\n  component: useWindowSize,\n  parameters: {\n    docs: {\n      description: {\n        component: `\n\\`\\`\\`js\nimport { useWindowSize } from \"@spaced-out/ui-design-system/lib/hooks/useWindowSize\";\n\\`\\`\\`\nThe \\`useWindowSize\\` hook is a custom hook that provides the current dimensions of the window as an object with the \\`width\\` and \\`height\\` properties.\n\n### Props Returned\n- \\`windowSize\\`: An object containing the current dimensions of the window.\n\n### Usage\n\\`\\`\\`jsx\nimport { useWindowSize } from './useWindowSize';\n\nconst MyComponent = () => {\n  const windowSize = useWindowSize();\n\n  return (\n    <div>\n      <BodyLarge>Window Width: {windowSize.width}px</BodyLarge>\n      <BodyLarge>Window Height: {windowSize.height}px</BodyLarge>\n    </div>\n  );\n};\n\nexport default MyComponent;\n\\`\\`\\`\n          `,\n      },\n    },\n  },\n};\n\nexport const Example = (): React.ReactElement<React.ComponentProps<'div'>> => {\n  const windowSize = useWindowSize();\n\n  return (\n    <div>\n      <BodyLarge className={css.text}>\n        Window Width: {windowSize.width}px\n      </BodyLarge>\n      <BodyLarge className={css.text}>\n        Window Height: {windowSize.height}px\n      </BodyLarge>\n    </div>\n  );\n};\n"
        },
        "index": {
          "path": "index.d.ts",
          "content": "export * from '../../hooks/useWindowSize/useWindowSize';\n//# sourceMappingURL=index.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "useWindowSize.stories.module.css",
        "useWindowSize.stories.tsx",
        "useWindowSize.ts"
      ]
    }
  },
  "tokens": {
    "border": {
      "app-border": {
        "border": {
          "width": {
            "none": {
              "value": "{baseBorder.width.0.value}"
            },
            "primary": {
              "value": "{baseBorder.width.1.value}"
            },
            "secondary": {
              "value": "{baseBorder.width.1_5.value}"
            },
            "tertiary": {
              "value": "{baseBorder.width.2.value}"
            }
          },
          "radius": {
            "none": {
              "value": "{baseBorder.radius.0.value}"
            },
            "x-small": {
              "value": "{baseBorder.radius.4.value}"
            },
            "radio-button": {
              "value": "{baseBorder.radius.6.value}"
            },
            "small": {
              "value": "{baseBorder.radius.8.value}"
            },
            "medium": {
              "value": "{baseBorder.radius.12.value}"
            },
            "large": {
              "value": "{baseBorder.radius.20.value}"
            },
            "x-large": {
              "value": "{baseBorder.radius.30.value}"
            },
            "circle": {
              "value": "{baseBorder.radius.50%.value}"
            }
          }
        }
      },
      "base-border": {
        "baseBorder": {
          "radius": {
            "0": {
              "value": "0px"
            },
            "4": {
              "value": "4px"
            },
            "6": {
              "value": "6px"
            },
            "8": {
              "value": "8px"
            },
            "12": {
              "value": "12px"
            },
            "20": {
              "value": "20px"
            },
            "30": {
              "value": "30px"
            },
            "50%": {
              "value": "50%"
            }
          },
          "width": {
            "0": {
              "value": "0px"
            },
            "1": {
              "value": "1px"
            },
            "2": {
              "value": "2px"
            },
            "1_5": {
              "value": "1.5px"
            }
          }
        }
      }
    },
    "color": {
      "app-color": {
        "color": {
          "text": {
            "primary": {
              "value": "{baseColor.indigo.940.value}"
            },
            "secondary": {
              "value": "{baseColor.gray.600.value}"
            },
            "tertiary": {
              "value": "{baseColor.gray.400.value}"
            },
            "disabled": {
              "value": "{baseColor.gray.200.value}"
            },
            "clickable": {
              "value": "{baseColor.purple.500.value}"
            },
            "neutral": {
              "value": "{baseColor.indigo.500.value}"
            },
            "success": {
              "value": "{baseColor.green.700.value}"
            },
            "information": {
              "value": "{baseColor.blue.600.value}"
            },
            "warning": {
              "value": "{baseColor.orange.700.value}"
            },
            "danger": {
              "value": "{baseColor.red.600.value}"
            },
            "inverse": {
              "primary": {
                "value": "{baseColor.white.100.value}"
              },
              "secondary": {
                "value": "{baseColor.indigo.300.value}"
              }
            },
            "favorite": {
              "value": "{baseColor.yellow.500.value}"
            }
          },
          "icon": {
            "primary": {
              "value": "{baseColor.indigo.400.value}"
            },
            "secondary": {
              "value": "{baseColor.indigo.800.value}"
            }
          },
          "border": {
            "primary": {
              "value": "{baseColor.gray.100.value}"
            },
            "secondary": {
              "value": "{baseColor.gray.200.value}"
            },
            "tertiary": {
              "value": "{baseColor.gray.250.value}"
            },
            "danger": {
              "value": "{baseColor.red.500.value}"
            }
          },
          "background": {
            "brand": {
              "value": "{baseColor.purple.900.value}"
            },
            "primary": {
              "value": "{baseColor.gray.25.value}"
            },
            "secondary": {
              "value": "{baseColor.gray.50.value}"
            },
            "tertiary": {
              "value": "{baseColor.white.100.value}"
            }
          },
          "focus": {
            "primary": {
              "value": "{baseColor.purple.100.value}"
            },
            "secondary": {
              "value": "{baseColor.purple.500.value}"
            },
            "information": {
              "value": "{baseColor.blue.100.value}"
            },
            "danger": {
              "value": "{baseColor.red.100.value}"
            }
          },
          "fill": {
            "primary": {
              "value": "{baseColor.purple.500.value}"
            },
            "secondary": {
              "value": "{baseColor.purple.50.value}"
            },
            "none": {
              "value": "{baseColor.transparent.0.value}"
            },
            "disabled": {
              "value": "{baseColor.gray.50.value}"
            },
            "inverse": {
              "primary": {
                "value": "{baseColor.indigo.940.value}"
              }
            }
          },
          "tooltip-fill": {
            "value": "{baseColor.indigo.940.95.value}"
          },
          "backdrop-fill": {
            "value": "{baseColor.indigo.940.70.value}"
          },
          "button-fill": {
            "tableAction": {
              "enabled": {
                "value": "{baseColor.purple.600.value}"
              },
              "hovered": {
                "value": "{baseColor.purple.700.value}"
              },
              "pressed": {
                "value": "{baseColor.purple.700.value}"
              },
              "border": {
                "value": "{baseColor.purple.400.value}"
              }
            },
            "primary": {
              "enabled": {
                "value": "{baseColor.purple.500.value}"
              },
              "hovered": {
                "value": "{baseColor.purple.700.value}"
              },
              "pressed": {
                "value": "{baseColor.purple.700.value}"
              }
            },
            "secondary": {
              "enabled": {
                "value": "{baseColor.purple.50.value}"
              },
              "hovered": {
                "value": "{baseColor.purple.100.value}"
              },
              "pressed": {
                "value": "{baseColor.purple.100.value}"
              }
            },
            "tertiary": {
              "enabled": {
                "value": "{baseColor.white.100.value}"
              },
              "hovered": {
                "value": "{baseColor.gray.75.value}"
              },
              "pressed": {
                "value": "{baseColor.gray.75.value}"
              }
            },
            "ghost": {
              "enabled": {
                "value": "{baseColor.transparent.0.value}"
              },
              "hovered": {
                "value": "{baseColor.gray.75.value}"
              },
              "pressed": {
                "value": "{baseColor.gray.75.value}"
              }
            },
            "danger": {
              "enabled": {
                "value": "{baseColor.red.500.value}"
              },
              "hovered": {
                "value": "{baseColor.red.600.value}"
              },
              "pressed": {
                "value": "{baseColor.red.600.value}"
              }
            }
          },
          "side-menu": {
            "background": {
              "default": {
                "value": "{baseColor.indigo.940.value}"
              },
              "hovered": {
                "value": "{baseColor.indigo.920.value}"
              },
              "selected": {
                "value": "{baseColor.purple.500.value}"
              }
            },
            "icon": {
              "default": {
                "value": "{baseColor.indigo.300.value}"
              },
              "active": {
                "value": "{baseColor.white.100.value}"
              }
            },
            "account-bar": {
              "fill": {
                "value": "{baseColor.indigo.920.value}"
              }
            }
          },
          "group-menu": {
            "background": {
              "default": {
                "value": "{baseColor.indigo.940.value}"
              },
              "hovered": {
                "value": "{baseColor.indigo.920.value}"
              },
              "selected": {
                "value": "{baseColor.purple.500.value}"
              }
            },
            "text": {
              "default": {
                "value": "{baseColor.indigo.200.value}"
              }
            }
          },
          "sub-menu": {
            "background": {
              "default": {
                "value": "{baseColor.indigo.920.value}"
              }
            },
            "star": {
              "value": "{baseColor.yellow.500.value}"
            }
          },
          "data-viz": {
            "1": {
              "value": "{baseColor.blue.200.value}"
            },
            "2": {
              "value": "{baseColor.purple.200.value}"
            },
            "3": {
              "value": "{baseColor.green.200.value}"
            },
            "4": {
              "value": "{baseColor.orange.200.value}"
            },
            "5": {
              "value": "{baseColor.red.200.value}"
            },
            "6": {
              "value": "{baseColor.teal.100.value}"
            },
            "7": {
              "value": "{baseColor.pink.100.value}"
            },
            "8": {
              "value": "{baseColor.yellow.100.value}"
            }
          },
          "score-bar": {
            "level": {
              "1": {
                "value": "{baseColor.gray.400.value}"
              },
              "2": {
                "value": "{baseColor.red.400.value}"
              },
              "3": {
                "value": "{baseColor.orange.400.value}"
              },
              "4": {
                "value": "{baseColor.blue.400.value}"
              },
              "5": {
                "value": "{baseColor.green.400.value}"
              }
            },
            "inactive": {
              "value": "{baseColor.gray.200.value}"
            }
          },
          "gray.lightest": {
            "value": "{baseColor.gray.75.value}"
          },
          "neutral": {
            "value": "{baseColor.indigo.500.value}"
          },
          "neutral.lightest": {
            "value": "{baseColor.indigo.50.value}"
          },
          "neutral.light": {
            "value": "{baseColor.indigo.200.value}"
          },
          "neutral.dark": {
            "value": "{baseColor.indigo.700.value}"
          },
          "neutral.darkest": {
            "value": "{baseColor.indigo.900.value}"
          },
          "success": {
            "value": "{baseColor.green.500.value}"
          },
          "success.lightest": {
            "value": "{baseColor.green.50.value}"
          },
          "success.light": {
            "value": "{baseColor.green.200.value}"
          },
          "success.dark": {
            "value": "{baseColor.green.700.value}"
          },
          "success.darkest": {
            "value": "{baseColor.green.900.value}"
          },
          "information": {
            "value": "{baseColor.blue.500.value}"
          },
          "information.lightest": {
            "value": "{baseColor.blue.50.value}"
          },
          "information.light": {
            "value": "{baseColor.blue.200.value}"
          },
          "information.dark": {
            "value": "{baseColor.blue.700.value}"
          },
          "information.darkest": {
            "value": "{baseColor.blue.900.value}"
          },
          "warning": {
            "value": "{baseColor.orange.500.value}"
          },
          "warning.lightest": {
            "value": "{baseColor.orange.50.value}"
          },
          "warning.light": {
            "value": "{baseColor.orange.200.value}"
          },
          "warning.dark": {
            "value": "{baseColor.orange.700.value}"
          },
          "warning.darkest": {
            "value": "{baseColor.orange.900.value}"
          },
          "danger": {
            "value": "{baseColor.red.500.value}"
          },
          "danger.lightest": {
            "value": "{baseColor.red.50.value}"
          },
          "danger.light": {
            "value": "{baseColor.red.200.value}"
          },
          "danger.dark": {
            "value": "{baseColor.red.700.value}"
          },
          "danger.darkest": {
            "value": "{baseColor.red.900.value}"
          }
        }
      },
      "base-color": {
        "baseColor": {
          "purple": {
            "50": {
              "value": "#efebfa"
            },
            "100": {
              "value": "#ccc0f0"
            },
            "200": {
              "value": "#b4a2e8"
            },
            "300": {
              "value": "#9277de"
            },
            "400": {
              "value": "#7d5dd7"
            },
            "500": {
              "value": "#5c34cd"
            },
            "600": {
              "value": "#542fbb"
            },
            "700": {
              "value": "#412592"
            },
            "800": {
              "value": "#331d71"
            },
            "900": {
              "value": "#271656"
            }
          },
          "gray": {
            "25": {
              "value": "#fafafa"
            },
            "50": {
              "value": "#f4f4f4"
            },
            "75": {
              "value": "#EBEBEB"
            },
            "100": {
              "value": "#e1e1e1"
            },
            "200": {
              "value": "#d1d1d1"
            },
            "250": {
              "value": "#AEAEAE"
            },
            "300": {
              "value": "#939393"
            },
            "400": {
              "value": "#7e7e7e"
            },
            "500": {
              "value": "#5e5e5e"
            },
            "600": {
              "value": "#565656"
            },
            "700": {
              "value": "#434343"
            },
            "800": {
              "value": "#343434"
            },
            "900": {
              "value": "#272727"
            },
            "920": {
              "value": "#1e1e1e"
            },
            "940": {
              "value": "#171717"
            },
            "960": {
              "value": "#121212"
            }
          },
          "indigo": {
            "50": {
              "value": "#f1f1f5"
            },
            "100": {
              "value": "#E6E5EF"
            },
            "200": {
              "value": "#D3D2E0"
            },
            "300": {
              "value": "#9F9FBC"
            },
            "400": {
              "value": "#8D8CAF"
            },
            "500": {
              "value": "#706F9B"
            },
            "600": {
              "value": "#66658D"
            },
            "700": {
              "value": "#504F6E"
            },
            "800": {
              "value": "#3E3D55"
            },
            "900": {
              "value": "#2C2C47"
            },
            "920": {
              "value": "#1F1F36"
            },
            "940": {
              "70": {
                "value": "rgba(23, 23, 42, 0.7)"
              },
              "95": {
                "value": "rgba(23, 23, 42, 0.95)"
              },
              "value": "#17172A"
            }
          },
          "blue": {
            "50": {
              "value": "#e6f0fe"
            },
            "100": {
              "value": "#b2d1fa"
            },
            "200": {
              "value": "#8dbaf8"
            },
            "300": {
              "value": "#599bf5"
            },
            "400": {
              "value": "#3987f3"
            },
            "500": {
              "value": "#0769f0"
            },
            "600": {
              "value": "#0660da"
            },
            "700": {
              "value": "#054baa"
            },
            "800": {
              "value": "#043a84"
            },
            "900": {
              "value": "#032c65"
            }
          },
          "green": {
            "50": {
              "value": "#e6f5ed"
            },
            "100": {
              "value": "#b1dec8"
            },
            "200": {
              "value": "#8bcfad"
            },
            "300": {
              "value": "#56b988"
            },
            "400": {
              "value": "#35ab71"
            },
            "500": {
              "value": "#03964d"
            },
            "600": {
              "value": "#038946"
            },
            "700": {
              "value": "#026b37"
            },
            "800": {
              "value": "#02532a"
            },
            "900": {
              "value": "#013f20"
            }
          },
          "orange": {
            "50": {
              "value": "#fcf2e7"
            },
            "100": {
              "value": "#f5d7b4"
            },
            "200": {
              "value": "#f0c48f"
            },
            "300": {
              "value": "#eaa95c"
            },
            "400": {
              "value": "#e5983d"
            },
            "500": {
              "value": "#df7e0c"
            },
            "600": {
              "value": "#cb730b"
            },
            "700": {
              "value": "#9e5909"
            },
            "800": {
              "value": "#7b4507"
            },
            "900": {
              "value": "#5e3505"
            }
          },
          "red": {
            "50": {
              "value": "#fce8ed"
            },
            "100": {
              "value": "#f6b9c8"
            },
            "200": {
              "value": "#f297ad"
            },
            "300": {
              "value": "#ec6787"
            },
            "400": {
              "value": "#e94970"
            },
            "500": {
              "value": "#e31c4c"
            },
            "600": {
              "value": "#cf1945"
            },
            "700": {
              "value": "#a11436"
            },
            "800": {
              "value": "#7d0f2a"
            },
            "900": {
              "value": "#5f0c20"
            }
          },
          "yellow": {
            "50": {
              "value": "#FCF8E7"
            },
            "100": {
              "value": "#F5EBB4"
            },
            "200": {
              "value": "#F0E190"
            },
            "300": {
              "value": "#EAD35D"
            },
            "400": {
              "value": "#E5CA3D"
            },
            "500": {
              "value": "#DFBD0D"
            },
            "600": {
              "value": "#CBAC0C"
            },
            "700": {
              "value": "#9E8609"
            },
            "800": {
              "value": "#7B6807"
            },
            "900": {
              "value": "#5E4F05"
            }
          },
          "teal": {
            "50": {
              "value": "#E6FAF6"
            },
            "100": {
              "value": "#B0F0E3"
            },
            "200": {
              "value": "#8AE9D6"
            },
            "300": {
              "value": "#54E0C3"
            },
            "400": {
              "value": "#33D9B8"
            },
            "500": {
              "value": "#00D0A6"
            },
            "600": {
              "value": "#00BD97"
            },
            "700": {
              "value": "#009476"
            },
            "800": {
              "value": "#00725B"
            },
            "900": {
              "value": "#005746"
            }
          },
          "violet": {
            "50": {
              "value": "#F7E9FB"
            },
            "100": {
              "value": "#E7BCF2"
            },
            "200": {
              "value": "#DC9CEB"
            },
            "300": {
              "value": "#CC6EE2"
            },
            "400": {
              "value": "#C252DD"
            },
            "500": {
              "value": "#B327D4"
            },
            "600": {
              "value": "#A323C1"
            },
            "700": {
              "value": "#7F1C97"
            },
            "800": {
              "value": "#621575"
            },
            "900": {
              "value": "#4B1059"
            }
          },
          "pink": {
            "50": {
              "value": "#FCE8F5"
            },
            "100": {
              "value": "#F5B8E1"
            },
            "200": {
              "value": "#F196D2"
            },
            "300": {
              "value": "#EA66BD"
            },
            "400": {
              "value": "#E648B1"
            },
            "500": {
              "value": "#E01A9D"
            },
            "600": {
              "value": "#CC188F"
            },
            "700": {
              "value": "#9F126F"
            },
            "800": {
              "value": "#7B0E56"
            },
            "900": {
              "value": "#5E0B42"
            }
          },
          "white": {
            "100": {
              "value": "#ffffff"
            }
          },
          "transparent": {
            "0": {
              "value": "rgba(255,255,255,0)"
            }
          }
        }
      }
    },
    "elevation": {
      "app-elevation": {
        "elevation": {
          "none": {
            "value": "{baseElevation.0.value}"
          },
          "card": {
            "value": "{baseElevation.4.value}"
          },
          "tooltip": {
            "value": "{baseElevation.4.value}"
          },
          "menu": {
            "value": "{baseElevation.12.value}"
          },
          "backdrop": {
            "value": "{baseElevation.40.value}"
          },
          "modal": {
            "value": "{baseElevation.40.value}"
          },
          "toast": {
            "value": "{baseElevation.60.value}"
          }
        }
      },
      "base-elevation": {
        "baseElevation": {
          "0": {
            "value": "0"
          },
          "4": {
            "value": "4"
          },
          "12": {
            "value": "12"
          },
          "40": {
            "value": "40"
          },
          "60": {
            "value": "60"
          }
        }
      }
    },
    "font": {
      "base-font": {
        "font": {
          "family": {
            "centra": {
              "value": "\"Centra No 2\""
            }
          },
          "weight": {
            "book": {
              "value": "400"
            },
            "medium": {
              "value": "500"
            }
          },
          "size": {
            "12": {
              "value": "12px"
            },
            "13": {
              "value": "13px"
            },
            "14": {
              "value": "14px"
            },
            "16": {
              "value": "16px"
            },
            "18": {
              "value": "18px"
            },
            "24": {
              "value": "24px"
            },
            "26": {
              "value": "26px"
            },
            "36": {
              "value": "36px"
            },
            "46": {
              "value": "46px"
            }
          },
          "letter-spacing": {
            "0": {
              "value": "0em"
            },
            "1": {
              "value": "0.01em"
            },
            "2": {
              "value": "0.02em"
            },
            "4": {
              "value": "0.04em"
            },
            "minus1": {
              "value": "-0.01em"
            },
            "minus2": {
              "value": "-0.02em"
            },
            "minus3": {
              "value": "-0.03em"
            },
            "minus4": {
              "value": "-0.04em"
            }
          },
          "line-height": {
            "100%": {
              "value": "100%"
            },
            "120%": {
              "value": "120%"
            },
            "125%": {
              "value": "125%"
            },
            "130%": {
              "value": "130%"
            },
            "140%": {
              "value": "140%"
            },
            "150%": {
              "value": "150%"
            },
            "170%": {
              "value": "170%"
            }
          },
          "paragraph-spacing": {
            "0": {
              "value": "0"
            }
          },
          "text-case": {
            "none": {
              "value": "none"
            }
          },
          "text-decoration": {
            "none": {
              "value": "none"
            }
          }
        }
      }
    },
    "motion": {
      "app-motion": {
        "motion": {
          "duration": {
            "fast": {
              "value": "{baseMotion.transition.duration.100.value}"
            },
            "normal": {
              "value": "{baseMotion.transition.duration.200.value}"
            },
            "slow": {
              "value": "{baseMotion.transition.duration.300.value}"
            },
            "slower": {
              "value": "{baseMotion.transition.duration.500.value}"
            },
            "slowest": {
              "value": "{baseMotion.transition.duration.1000.value}"
            }
          },
          "ease-in-ease-out": {
            "value": "{baseMotion.transition.timingFunction.easeInOut.value}"
          }
        }
      },
      "base-motion": {
        "baseMotion": {
          "transition": {
            "timingFunction": {
              "linear": {
                "value": "linear"
              },
              "ease": {
                "value": "ease"
              },
              "easeIn": {
                "value": "ease-in"
              },
              "easeInOut": {
                "value": "ease-in-out"
              },
              "easeOut": {
                "value": "ease-out"
              }
            },
            "duration": {
              "100": {
                "value": "100ms"
              },
              "200": {
                "value": "200ms"
              },
              "300": {
                "value": "300ms"
              },
              "500": {
                "value": "500ms"
              },
              "1000": {
                "value": "1000ms"
              }
            }
          }
        }
      }
    },
    "opacity": {
      "base-opacity": {
        "opacity": {
          "100%": {
            "value": "100%"
          },
          "95%": {
            "value": "95%"
          },
          "90%": {
            "value": "90%"
          },
          "85%": {
            "value": "85%"
          },
          "80%": {
            "value": "80%"
          },
          "70%": {
            "value": "70%"
          },
          "60%": {
            "value": "60%"
          },
          "50%": {
            "value": "50%"
          },
          "40%": {
            "value": "40%"
          },
          "30%": {
            "value": "30%"
          },
          "20%": {
            "value": "20%"
          },
          "15%": {
            "value": "15%"
          },
          "10%": {
            "value": "10%"
          },
          "5%": {
            "value": "5%"
          },
          "0%": {
            "value": "0%"
          }
        }
      }
    },
    "shadow": {
      "base-shadow": {
        "shadow": {
          "box-shadow": {
            "1": {
              "color": {
                "value": "#12121214"
              },
              "type": {
                "value": "dropShadow"
              },
              "x": {
                "value": "0px"
              },
              "y": {
                "value": "4px"
              },
              "blur": {
                "value": "4px"
              },
              "spread": {
                "value": "0px"
              }
            },
            "2": {
              "color": {
                "value": "#12121214"
              },
              "type": {
                "value": "dropShadow"
              },
              "x": {
                "value": "0px"
              },
              "y": {
                "value": "8px"
              },
              "blur": {
                "value": "8px"
              },
              "spread": {
                "value": "0px"
              }
            },
            "3": {
              "color": {
                "value": "#1212121f"
              },
              "type": {
                "value": "dropShadow"
              },
              "x": {
                "value": "0px"
              },
              "y": {
                "value": "12px"
              },
              "blur": {
                "value": "12px"
              },
              "spread": {
                "value": "0px"
              }
            },
            "4": {
              "color": {
                "value": "#12121233"
              },
              "type": {
                "value": "dropShadow"
              },
              "x": {
                "value": "0px"
              },
              "y": {
                "value": "20px"
              },
              "blur": {
                "value": "20px"
              },
              "spread": {
                "value": "0px"
              }
            }
          }
        }
      }
    },
    "size": {
      "base-size": {
        "size": {
          "2": {
            "value": "2px"
          },
          "4": {
            "value": "4px"
          },
          "5": {
            "value": "5px"
          },
          "8": {
            "value": "8px"
          },
          "10": {
            "value": "10px"
          },
          "12": {
            "value": "12px"
          },
          "16": {
            "value": "16px"
          },
          "18": {
            "value": "18px"
          },
          "20": {
            "value": "20px"
          },
          "22": {
            "value": "22px"
          },
          "24": {
            "value": "24px"
          },
          "26": {
            "value": "26px"
          },
          "28": {
            "value": "28px"
          },
          "30": {
            "value": "30px"
          },
          "32": {
            "value": "32px"
          },
          "34": {
            "value": "34px"
          },
          "36": {
            "value": "36px"
          },
          "38": {
            "value": "38px"
          },
          "40": {
            "value": "40px"
          },
          "42": {
            "value": "42px"
          },
          "44": {
            "value": "44px"
          },
          "48": {
            "value": "48px"
          },
          "50": {
            "value": "50px"
          },
          "58": {
            "value": "58px"
          },
          "60": {
            "value": "60px"
          },
          "66": {
            "value": "66px"
          },
          "68": {
            "value": "68px"
          },
          "70": {
            "value": "70px"
          },
          "90": {
            "value": "90px"
          },
          "100": {
            "value": "100px"
          },
          "110": {
            "value": "110px"
          },
          "120": {
            "value": "120px"
          },
          "125": {
            "value": "125px"
          },
          "140": {
            "value": "140px"
          },
          "150": {
            "value": "150px"
          },
          "160": {
            "value": "160px"
          },
          "180": {
            "value": "180px"
          },
          "200": {
            "value": "200px"
          },
          "228": {
            "value": "228px"
          },
          "240": {
            "value": "240px"
          },
          "252": {
            "value": "252px"
          },
          "260": {
            "value": "260px"
          },
          "276": {
            "value": "276px"
          },
          "284": {
            "value": "284px"
          },
          "300": {
            "value": "300px"
          },
          "320": {
            "value": "320px"
          },
          "380": {
            "value": "380px"
          },
          "400": {
            "value": "400px"
          },
          "426": {
            "value": "426px"
          },
          "480": {
            "value": "480px"
          },
          "500": {
            "value": "500px"
          },
          "540": {
            "value": "540px"
          },
          "580": {
            "value": "580px"
          },
          "640": {
            "value": "640px"
          },
          "660": {
            "value": "660px"
          },
          "720": {
            "value": "720px"
          },
          "800": {
            "value": "800px"
          },
          "880": {
            "value": "880px"
          },
          "960": {
            "value": "960px"
          },
          "1280": {
            "value": "1280px"
          },
          "fluid": {
            "value": "100%"
          },
          "fullViewportHeight": {
            "value": "100vh"
          },
          "fullViewportWidth": {
            "value": "100vw"
          }
        }
      }
    },
    "space": {
      "app-space": {
        "space": {
          "none": {
            "value": "{baseSpace.0.value}"
          },
          "x-x-small": {
            "value": "{baseSpace.4.value}"
          },
          "x-small": {
            "value": "{baseSpace.8.value}"
          },
          "small": {
            "value": "{baseSpace.12.value}"
          },
          "medium": {
            "value": "{baseSpace.20.value}"
          },
          "large": {
            "value": "{baseSpace.32.value}"
          },
          "x-large": {
            "value": "{baseSpace.52.value}"
          },
          "x-x-large": {
            "value": "{baseSpace.84.value}"
          },
          "fluid": {
            "value": "{baseSpace.100%.value}"
          },
          "neg-fluid": {
            "value": "{baseSpace.minus100%.value}"
          },
          "half-fluid": {
            "value": "{baseSpace.50%.value}"
          },
          "neg-half-fluid": {
            "value": "{baseSpace.minus50%.value}"
          }
        }
      },
      "base-space": {
        "baseSpace": {
          "0": {
            "value": "0px"
          },
          "4": {
            "value": "4px"
          },
          "8": {
            "value": "8px"
          },
          "12": {
            "value": "12px"
          },
          "20": {
            "value": "20px"
          },
          "32": {
            "value": "32px"
          },
          "52": {
            "value": "52px"
          },
          "84": {
            "value": "84px"
          },
          "100%": {
            "value": "100%"
          },
          "minus100%": {
            "value": "-100%"
          },
          "50%": {
            "value": "50%"
          },
          "minus50%": {
            "value": "-50%"
          }
        }
      }
    }
  },
  "utils": {
    "array": {
      "name": "array",
      "path": "src/utils/array",
      "files": {
        "are-arrays-equal.d.ts": {
          "path": "are-arrays-equal.d.ts",
          "content": "type ItemComparer<Item> = (a: Item, b: Item) => boolean;\nexport declare function areArraysEqual<Item>(array1: Item[], array2: Item[], itemComparer?: ItemComparer<Item>): boolean;\nexport {};\n//# sourceMappingURL=are-arrays-equal.d.ts.map"
        },
        "index.d.ts": {
          "path": "index.d.ts",
          "content": "export * from '../../utils/array/are-arrays-equal';\n//# sourceMappingURL=index.d.ts.map"
        }
      },
      "allFiles": [
        "are-arrays-equal.ts",
        "index.ts"
      ]
    },
    "charts": {
      "name": "charts",
      "path": "src/utils/charts",
      "files": {
        "charts.d.ts": {
          "path": "charts.d.ts",
          "content": "import type { ChartOptions } from '../../types/charts';\nexport declare const DATA_VIZ_COLORS: readonly [\"#8dbaf8\", \"#b4a2e8\", \"#8bcfad\", \"#f0c48f\", \"#f297ad\", \"#B0F0E3\", \"#F5B8E1\", \"#F5EBB4\"];\nexport declare const getDataVizColor: (dataIndex: number) => string;\nexport declare const breadcrumbStyle: {\n    readonly color: \"#565656\";\n    readonly fontSize: \"12px\";\n    readonly letterSpacing: \"0em\";\n    readonly fontFamily: \"Centra No 2\";\n    readonly fontStyle: \"normal\";\n    readonly margin: 0;\n    readonly fontWeight: \"500\";\n    readonly display: \"flex\";\n    readonly alignItems: \"center\";\n};\nexport declare const commonChartOptions: Partial<ChartOptions>;\nexport declare const mergeChartUserOptions: (defaultoptions: Partial<ChartOptions>, userOptions: Partial<ChartOptions>) => ChartOptions;\n//# sourceMappingURL=charts.d.ts.map"
        },
        "columnChart.d.ts": {
          "path": "columnChart.d.ts",
          "content": "import type { ChartOptions } from '../../types/charts';\n/**\n * This function modifies the the common chart behavior to column chart default behavior.\n * It will not take userPassed option into account.\n */\nexport declare const getColumnChartOptions: () => ChartOptions;\nexport declare const columnPlotWidth = 28;\n//# sourceMappingURL=columnChart.d.ts.map"
        },
        "donutChart.d.ts": {
          "path": "donutChart.d.ts",
          "content": "import type { ChartOptions, LegendOptionsType } from '../../types/charts';\ninterface DonutChartPropsType {\n    legend?: LegendOptionsType;\n    defaultCenterHTML?: string;\n    /**\n     * Formatter for each legend item. When provided, the legend renders as HTML\n     * so items can show the point value and percentage alongside the name.\n     */\n    legendLabelFormatter?: LegendOptionsType['labelFormatter'];\n    /**\n     * Formats the center total for a given value. When provided, the center is\n     * recomputed from the visible points on every render (applied via\n     * textContent) so an auto-computed total stays in sync with the\n     * (redistributed) legend percentages after a slice is toggled off.\n     */\n    getCenterTextForVisibleTotal?: (visibleTotal: number) => string;\n}\n/**\n * Marker class on the center total element. The auto-total's text is updated\n * in place (via textContent) as slices are toggled, so it must be locatable\n * without rebuilding the subtitle HTML. A class is used (not a data-attribute)\n * because Highcharts' useHTML sanitizer keeps the class attribute but strips\n * unknown data-* attributes.\n */\nexport declare const CENTER_TOTAL_CLASS = \"donut-center-total\";\nexport declare const rightLegendColumn: {\n    readonly layout: \"vertical\";\n    readonly align: \"right\";\n    readonly verticalAlign: \"middle\";\n    readonly itemMarginBottom: 12;\n    readonly symbolPadding: 8;\n    readonly symbolWidth: 8;\n    readonly width: \"36%\";\n};\n/**\n * This function modifies the the common chart behavior to donut chart default behavior.\n * It will not take userPassed option into account.\n */\nexport declare const getDonutChartOptions: ({ legend, defaultCenterHTML, legendLabelFormatter, getCenterTextForVisibleTotal, }: DonutChartPropsType) => ChartOptions;\nexport {};\n//# sourceMappingURL=donutChart.d.ts.map"
        },
        "funnelChart.d.ts": {
          "path": "funnelChart.d.ts",
          "content": "import type Highcharts from 'highcharts';\nimport type { ChartOptions, Drilldown } from '../../types/charts';\nimport type { FunnelSeriesItem } from '../../components/Charts/FunnelChart/FunnelChart';\n/**\n * This function modifies the the common chart behavior to funnel chart default behavior.\n * It will not take userPassed option into account.\n */\nexport declare const getFunnelChartOptions: () => ChartOptions;\nexport declare const addColorsToFunnelSeries: (series: Array<FunnelSeriesItem>, showInLegend?: boolean) => Array<Highcharts.SeriesFunnelOptions>;\nexport declare const addColorsToFunnelDrilldownSeries: (drilldownSeries: Drilldown, showInLegend?: boolean) => Drilldown;\n//# sourceMappingURL=funnelChart.d.ts.map"
        },
        "helpers.d.ts": {
          "path": "helpers.d.ts",
          "content": "export declare const deepMerge: <T extends object>(obj1: Partial<T> | null | undefined, obj2: Partial<T> | null | undefined, ...args: Array<Partial<T> | null | undefined>) => T;\n/**\n * Default number formatter used by charts for center totals and legend values.\n * Abbreviates large numbers into a compact, locale-aware form, keeping up to\n * two decimal places (e.g. 1460 -> \"1.46K\", 1260 -> \"1.26K\", 1200 -> \"1.2K\",\n * 200 -> \"200\").\n */\nexport declare const formatCompactNumber: (value: number) => string;\nexport declare const rightLineLegendColumn: {\n    readonly layout: \"vertical\";\n    readonly align: \"right\";\n    readonly verticalAlign: \"middle\";\n    readonly itemMarginBottom: 12;\n    readonly symbolPadding: 4;\n    readonly symbolWidth: 16;\n    readonly width: \"40%\";\n};\nexport declare const bottomLegendRow: {\n    readonly layout: \"horizontal\";\n    readonly align: \"center\";\n    readonly verticalAlign: \"bottom\";\n    readonly itemDistance: 20;\n    readonly symbolPadding: 4;\n    readonly symbolWidth: 16;\n};\nexport declare const yAxisTitleStyle: {\n    readonly color: \"#565656\";\n    readonly fontSize: \"12px\";\n    readonly fontWeight: \"400\";\n    readonly letterSpacing: \"0.04em\";\n    readonly fontFamily: \"Centra No 2\";\n    readonly fontStyle: \"normal\";\n    readonly margin: 0;\n    readonly display: \"flex\";\n    readonly alignItems: \"center\";\n};\nexport declare const xAxisTitleStyle: {\n    readonly color: \"#565656\";\n    readonly fontSize: \"12px\";\n    readonly fontWeight: \"400\";\n    readonly letterSpacing: \"0.04em\";\n    readonly fontFamily: \"Centra No 2\";\n    readonly fontStyle: \"normal\";\n    readonly margin: 0;\n    readonly display: \"flex\";\n    readonly alignItems: \"center\";\n};\nexport declare const yAxisLabelStyle: {\n    readonly fontSize: \"12px\";\n    readonly fontFamily: \"Centra No 2\";\n    readonly fontStyle: \"normal\";\n    readonly margin: 0;\n    readonly color: \"#17172A\";\n    readonly letterSpacing: \"0em\";\n    readonly fontWeight: \"500\";\n    readonly display: \"flex\";\n    readonly alignItems: \"center\";\n};\nexport declare const xAxisLabelStyle: {\n    readonly fontSize: \"12px\";\n    readonly letterSpacing: \"0.01em\";\n    readonly fontFamily: \"Centra No 2\";\n    readonly fontStyle: \"normal\";\n    readonly margin: 0;\n    readonly color: \"#17172A\";\n    readonly fontWeight: \"500\";\n    readonly display: \"flex\";\n    readonly alignItems: \"center\";\n};\nexport declare const activeLabelStyle: {\n    readonly color: \"#17172A\";\n    readonly fill: \"#17172A\";\n    readonly textDecoration: \"underline\";\n    readonly fontSize: \"12px\";\n    readonly letterSpacing: \"0.01em\";\n    readonly fontFamily: \"Centra No 2\";\n    readonly fontStyle: \"normal\";\n    readonly margin: 0;\n    readonly fontWeight: \"500\";\n    readonly display: \"flex\";\n    readonly alignItems: \"center\";\n};\n//# sourceMappingURL=helpers.d.ts.map"
        },
        "index.d.ts": {
          "path": "index.d.ts",
          "content": "export * from '../../utils/charts/charts';\nexport * from '../../utils/charts/columnChart';\nexport * from '../../utils/charts/donutChart';\nexport * from '../../utils/charts/funnelChart';\nexport * from '../../utils/charts/helpers';\nexport * from '../../utils/charts/lineChart';\nexport * from '../../utils/charts/sankeyChart';\nexport * from '../../utils/charts/spiderChart';\nexport * from '../../utils/charts/stackedBarChart';\nexport * from '../../utils/charts/stackedBarLineChart';\nexport * from '../../utils/charts/typography';\n//# sourceMappingURL=index.d.ts.map"
        },
        "lineChart.d.ts": {
          "path": "lineChart.d.ts",
          "content": "import type { ChartOptions } from '../../types/charts';\n/**\n * This function modifies the the common chart behavior to line chart default behavior.\n * It will not take userPassed option into account.\n */\nexport declare const getLineChartOptions: () => ChartOptions;\n//# sourceMappingURL=lineChart.d.ts.map"
        },
        "sankeyChart.d.ts": {
          "path": "sankeyChart.d.ts",
          "content": "import type { ChartOptions } from '../../types/charts';\ninterface SankeyChartOptionsType {\n    nodeWidth?: number;\n    nodePadding?: number;\n    showLegend?: boolean;\n}\nexport declare const getSankeyChartOptions: ({ nodeWidth, showLegend, nodePadding, }: SankeyChartOptionsType) => ChartOptions;\nexport {};\n//# sourceMappingURL=sankeyChart.d.ts.map"
        },
        "spiderChart.d.ts": {
          "path": "spiderChart.d.ts",
          "content": "import type { ChartOptions } from '../../types/charts';\nexport declare const bodySmallSecondary: {\n    readonly color: \"#565656\";\n    readonly fontSize: \"12px\";\n    readonly fontWeight: \"400\";\n    readonly letterSpacing: \"0.04em\";\n    readonly fontFamily: \"Centra No 2\";\n    readonly fontStyle: \"normal\";\n    readonly margin: 0;\n    readonly display: \"flex\";\n    readonly alignItems: \"center\";\n};\n/**\n * This function modifies the the common chart behavior to spider chart default behavior.\n * It will not take userPassed option into account.\n */\nexport declare const getSpiderChartOptions: () => ChartOptions;\n//# sourceMappingURL=spiderChart.d.ts.map"
        },
        "stackedBarChart.d.ts": {
          "path": "stackedBarChart.d.ts",
          "content": "import type { ChartOptions } from '../../types/charts';\n/**\n * Orientation of the stacked bars.\n * - `horizontal` (default): bars run left-to-right; categories on the vertical\n *   axis. Backed by Highcharts `chart.type: 'bar'` (an inverted chart).\n * - `vertical`: bars run bottom-to-top; categories on the horizontal x-axis.\n *   Backed by Highcharts `chart.type: 'column'`.\n */\nexport type StackedBarOrientation = 'horizontal' | 'vertical';\nexport declare const getStackedBarChartOptions: (orientation?: StackedBarOrientation) => ChartOptions;\n//# sourceMappingURL=stackedBarChart.d.ts.map"
        },
        "stackedBarLineChart.d.ts": {
          "path": "stackedBarLineChart.d.ts",
          "content": "import type { ChartOptions } from '../../types/charts';\nexport declare const getStackedBarLineChartOptions: () => ChartOptions;\n//# sourceMappingURL=stackedBarLineChart.d.ts.map"
        },
        "typography.d.ts": {
          "path": "typography.d.ts",
          "content": "export declare const baseType: {\n    readonly fontFamily: \"Centra No 2\";\n    readonly fontStyle: \"normal\";\n    readonly margin: 0;\n    readonly color: \"#17172A\";\n    readonly letterSpacing: \"0em\";\n    readonly fontWeight: \"500\";\n    readonly display: \"flex\";\n    readonly alignItems: \"center\";\n};\nexport declare const bodySmall: {\n    readonly fontSize: \"12px\";\n    readonly fontWeight: \"400\";\n    readonly letterSpacing: \"0.04em\";\n    readonly fontFamily: \"Centra No 2\";\n    readonly fontStyle: \"normal\";\n    readonly margin: 0;\n    readonly color: \"#17172A\";\n    readonly display: \"flex\";\n    readonly alignItems: \"center\";\n};\nexport declare const formLabelSmall: {\n    readonly fontSize: \"12px\";\n    readonly fontFamily: \"Centra No 2\";\n    readonly fontStyle: \"normal\";\n    readonly margin: 0;\n    readonly color: \"#17172A\";\n    readonly letterSpacing: \"0em\";\n    readonly fontWeight: \"500\";\n    readonly display: \"flex\";\n    readonly alignItems: \"center\";\n};\nexport declare const buttonTextExtraSmall: {\n    readonly fontSize: \"12px\";\n    readonly letterSpacing: \"0.01em\";\n    readonly fontFamily: \"Centra No 2\";\n    readonly fontStyle: \"normal\";\n    readonly margin: 0;\n    readonly color: \"#17172A\";\n    readonly fontWeight: \"500\";\n    readonly display: \"flex\";\n    readonly alignItems: \"center\";\n};\nexport declare const underline: {\n    readonly textDecoration: \"underline\";\n};\nexport declare const subTitleExtraSmall: {\n    readonly fontSize: \"12px\";\n    readonly letterSpacing: \"0em\";\n    readonly fontFamily: \"Centra No 2\";\n    readonly fontStyle: \"normal\";\n    readonly margin: 0;\n    readonly color: \"#17172A\";\n    readonly fontWeight: \"500\";\n    readonly display: \"flex\";\n    readonly alignItems: \"center\";\n};\n//# sourceMappingURL=typography.d.ts.map"
        }
      },
      "allFiles": [
        "charts.ts",
        "columnChart.ts",
        "donutChart.ts",
        "funnelChart.ts",
        "helpers.ts",
        "index.ts",
        "lineChart.ts",
        "sankeyChart.ts",
        "spiderChart.ts",
        "stackedBarChart.ts",
        "stackedBarLineChart.ts",
        "typography.ts"
      ]
    },
    "classify": {
      "name": "classify",
      "path": "src/utils/classify",
      "files": {
        "index.d.ts": {
          "path": "index.d.ts",
          "content": "export declare function classify(...args: Array<unknown>): string;\nexport default classify;\n//# sourceMappingURL=index.d.ts.map"
        }
      },
      "allFiles": [
        "classify.stories.module.css",
        "classify.stories.tsx",
        "index.ts"
      ]
    },
    "click-away": {
      "name": "click-away",
      "path": "src/utils/click-away",
      "files": {
        "click-away.d.ts": {
          "path": "click-away.d.ts",
          "content": "import * as React from 'react';\ntype BoundaryRefType<T extends HTMLElement> = React.RefObject<T | null>;\ntype TriggerRefType<T extends HTMLElement> = React.RefObject<T | null>;\nexport interface ChildProps<TTrigger extends HTMLElement = HTMLButtonElement, TBoundary extends HTMLElement = HTMLDivElement> {\n    onOpen: () => void;\n    isOpen: boolean;\n    height: number | null | undefined;\n    pageBottom: number | null | undefined;\n    clickAway: () => void;\n    boundaryRef: BoundaryRefType<TBoundary>;\n    triggerRef: TriggerRefType<TTrigger>;\n}\nexport interface ClickAwayRefType {\n    forceClose: () => void;\n    forceOpen: () => void;\n}\nexport interface ClickAwayProps<TTrigger extends HTMLElement = HTMLButtonElement, TBoundary extends HTMLElement = HTMLDivElement> {\n    closeOnEscapeKeypress?: boolean;\n    /**\n     * Return focus to whatever had it before the popup opened, when the popup\n     * closes with focus still inside it (Escape, a selection, Tab past the edge).\n     * A click elsewhere on the page is exempt: focus belongs where the user\n     * clicked.\n     *\n     * Off by default. It is only wanted where something moves focus INTO the\n     * popup — otherwise focus never left the trigger and there is nothing to\n     * restore, and calling `focus()` on a trigger that already has it can be\n     * enough to disturb a consumer (a field that opens its own menu on focus\n     * would reopen the popup that just closed).\n     */\n    restoreFocusOnClose?: boolean;\n    children: (props: ChildProps<TTrigger, TBoundary>) => React.ReactNode;\n    onChange?: (isOpen: boolean) => unknown;\n    clickAwayRef?: React.RefObject<ClickAwayRefType | null>;\n    /**\n     * When containsNestedFloatingPortals is true, prevents ClickAway from closing the dropdown if the click target\n     * is inside a floating portal root element.\n     *\n     * This is necessary for nested dropdowns rendered using floating portals,\n     * such as via `@floating-ui/react`. Floating portals render elements outside\n     * the normal DOM tree (often directly into `document.body` or another container)\n     * using `ReactDOM.createPortal`. As a result, these nested dropdowns do not\n     * appear inside the parent dropdown's `boundaryRef` or `triggerRef` subtree.\n     *\n     * To address this, the floating portal ensures that all nested dropdowns\n     * are mounted into a **shared root element** — effectively maintaining a\n     * common DOM ancestry. This allows parent dropdowns to detect when clicks\n     * occur within any of their nested children, even if rendered via portals.\n     * The shared root element is the closest parent element that has a `data-floating-ui-portal` attribute.\n     * Because of this, the ClickAway logic will not close the parent menu if the click target is inside boundaryRef's parentElement.\n     *\n     * Enabling `containsNestedFloatingPortals` allows the ClickAway logic to account\n     * for this shared root and avoids incorrectly closing the parent menu when\n     * interacting with nested dropdowns.\n     */\n    containsNestedFloatingPortals?: boolean;\n}\ninterface ClickAwayState {\n    isOpen: boolean;\n    height: number | null | undefined;\n    pageBottom: number | null | undefined;\n}\nexport declare class ClickAway<TTrigger extends HTMLElement = HTMLButtonElement, TBoundary extends HTMLElement = HTMLDivElement> extends React.Component<ClickAwayProps<TTrigger, TBoundary>, ClickAwayState> {\n    static defaultProps: {\n        containsNestedFloatingPortals?: boolean;\n        closeOnEscapeKeypress?: boolean;\n    };\n    state: ClickAwayState;\n    el: HTMLElement | null | undefined;\n    boundaryRef: BoundaryRefType<TBoundary>;\n    triggerRef: TriggerRefType<TTrigger>;\n    previouslyFocused: HTMLElement | null;\n    closedByOutsideClick: boolean;\n    componentDidMount(): void;\n    componentDidUpdate(_prevProps: Readonly<ClickAwayProps<TTrigger, TBoundary>>, prevState: Readonly<ClickAwayState>): void;\n    componentWillUnmount(): void;\n    render(): React.ReactNode;\n    handleOpenClick: () => void;\n    restoreFocus: () => void;\n    handleCloseClick: (evt: MouseEvent) => void;\n    handleCloseOnEscapeKeypress: (evt?: KeyboardEvent) => void;\n    forceClose: () => void;\n    handleOnChange: () => unknown;\n    pageBottom(): number;\n}\nexport {};\n//# sourceMappingURL=click-away.d.ts.map"
        },
        "index.d.ts": {
          "path": "index.d.ts",
          "content": "export * from '../../utils/click-away/click-away';\n//# sourceMappingURL=index.d.ts.map"
        }
      },
      "allFiles": [
        "ClickAway.stories.module.css",
        "ClickAway.stories.tsx",
        "click-away.ts",
        "index.ts"
      ]
    },
    "date-range-picker": {
      "name": "date-range-picker",
      "path": "src/utils/date-range-picker",
      "files": {
        "date-range-picker.d.ts": {
          "path": "date-range-picker.d.ts",
          "content": "import type { Moment } from 'moment';\nimport type { DateRange, DateRangePickerError, DateRangePickerErrorTypes, DateRangeWithTimezone, TimeUnit } from '../../types/date-range-picker';\nimport type { MenuOption } from '../../components/Menu';\nexport declare const makeKey: (value: string) => string;\nexport declare const NAVIGATION_ACTION: Readonly<{\n    NEXT: \"next\";\n    PREV: \"prev\";\n}>;\nexport declare const MARKERS: Readonly<{\n    DATE_RANGE_START: \"FIRST\";\n    DATE_RANGE_END: \"SECOND\";\n}>;\nexport declare const WEEKDAYS: readonly [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"];\nexport declare const getMonths: (t?: ((key: string, fallback: string) => string) | null) => Array<MenuOption>;\nexport declare const getDateRangePickerErrors: (t?: ((key: string, fallback: string) => string) | null) => DateRangePickerErrorTypes;\nexport declare const checkRangeValidity: (rangeStart: string | null | undefined, rangeEnd: string | null | undefined, errorBody: DateRangePickerError, onError?: (arg1: DateRangePickerError) => void) => boolean;\nexport declare const wrangleMoment: (date?: string | Date | Moment) => Date;\nexport declare const formatIsoDate: (date?: Moment | string | Date, format?: string) => string;\nexport declare const isStartOfRange: ({ startDate }: DateRange, date: string) => boolean;\nexport declare const isEndOfRange: ({ endDate }: DateRange, date: string) => boolean;\nexport declare const inDateRange: ({ startDate, endDate }: DateRange, date: string) => boolean;\nexport declare const isStartDateEndDateSame: ({ startDate, endDate, }: DateRange) => boolean;\nexport declare const getDaysInMonth: (date: string) => Array<Array<string>>;\nexport declare const getAddedDate: (date: Moment | string, addCount: number, timeUnit: TimeUnit) => string;\nexport declare const getSubtractedDate: (date: Moment | string, subtractCount: number, timeUnit: TimeUnit) => string;\nexport declare const getMonthEndDate: (date: Moment | string) => string;\nexport declare const getTimezones: (t?: ((key: string, fallback: string) => string) | null) => Array<MenuOption>;\nexport declare const generateAvailableYears: ({ marker, minDate, maxDate, rangeStartMonth, rangeEndMonth, }: {\n    marker?: (typeof MARKERS)[keyof typeof MARKERS];\n    minDate: string;\n    maxDate: string;\n    rangeStartMonth?: string;\n    rangeEndMonth?: string;\n}) => Array<MenuOption>;\nexport declare const getAvailableMonths: ({ marker, minDate, maxDate, rangeStartMonth, rangeEndMonth, t, }: {\n    marker: (typeof MARKERS)[keyof typeof MARKERS];\n    minDate: string;\n    maxDate: string;\n    rangeStartMonth: string;\n    rangeEndMonth: string;\n    t: ((key: string, fallback: string) => string) | null | undefined;\n}) => Array<MenuOption>;\nexport declare const getAvailableMonthsSingleCalendar: ({ date, minDate, maxDate, t, }: {\n    date: string;\n    minDate: string;\n    maxDate: string;\n    t: ((key: string, fallback: string) => string) | null | undefined;\n}) => Array<MenuOption>;\nexport declare const getValidDates: ({ selectedDateRange, minDate, maxDate, today, onError, t, }: {\n    selectedDateRange: DateRangeWithTimezone;\n    minDate?: string | null | undefined;\n    maxDate?: string | null | undefined;\n    today: string;\n    onError?: (arg1: DateRangePickerError) => void;\n    t: ((key: string, fallback: string) => string) | null | undefined;\n}) => {\n    validMinDate: string;\n    validMaxDate: string;\n    validDateRange: DateRange;\n};\nexport declare const isSame: (date1: Moment | string | Date, date2: Moment | string | Date, unit: \"d\" | \"month\") => boolean;\nexport declare const isBefore: (date1: Moment | string | Date, date2: Moment | string | Date) => boolean;\nexport declare const isAfter: (date1: Moment | string | Date, date2: Moment | string | Date) => boolean;\nexport declare const isSameOrBefore: (date1?: Moment | string | Date | null, date2?: Moment | string | Date | null, unit?: \"d\" | \"month\") => boolean;\nexport declare const isSameOrAfter: (date1?: Moment | string | Date | null, date2?: Moment | string | Date | null, unit?: \"d\" | \"month\") => boolean;\nexport declare const isBetween: (date: Moment | string | Date, startRange: Moment | string | Date, endRange: Moment | string | Date) => boolean;\nexport declare const isValid: (date?: string | null) => boolean;\nexport declare const getFormattedDate: (marker: string, dateRange: DateRange, locale?: string) => string;\nexport declare const getTranslation: (t: ((key: string, fallback: string) => string) | null | undefined, labelToTranslate: string) => string;\n//# sourceMappingURL=date-range-picker.d.ts.map"
        },
        "index.d.ts": {
          "path": "index.d.ts",
          "content": "export * from '../../utils/date-range-picker/date-range-picker';\nexport * from '../../utils/date-range-picker/timezones';\n//# sourceMappingURL=index.d.ts.map"
        },
        "timezones.d.ts": {
          "path": "timezones.d.ts",
          "content": "export declare const TIMEZONES: Record<string, string>;\nexport declare const addTimezoneStartOfDay: (date: string, timezone: string) => string;\nexport declare const addTimezoneEndOfDay: (date: string, timezone: string) => string;\nexport declare const getTodayInTimezone: (timezone: string) => string;\n//# sourceMappingURL=timezones.d.ts.map"
        }
      },
      "allFiles": [
        "date-range-picker.ts",
        "index.ts",
        "timezones.ts"
      ]
    },
    "dom": {
      "name": "dom",
      "path": "src/utils/dom",
      "files": {
        "dom.d.ts": {
          "path": "dom.d.ts",
          "content": "import type * as React from 'react';\nexport type Placement = 'top' | 'left' | 'right' | 'bottom';\nexport type ArrowPosition = 'start' | 'center' | 'end';\nexport type Justify = ArrowPosition;\nexport interface PositionedPlacement {\n    placement: Placement;\n    x: number;\n    y: number;\n}\nexport declare function createElement(document: Document, type: string, props: Record<string, unknown>): HTMLElement;\nexport declare function pageHeight(): number;\nexport declare function getFixedAnchorPosition(element: HTMLElement, placement?: Placement, pad?: number, justify?: Justify): PositionedPlacement;\nexport declare function getAnchorPosition(element: HTMLElement, placement?: Placement, pad?: number, justify?: Justify): PositionedPlacement;\nexport declare function pxToNumber(px: string): number;\ntype EventListenerOptionsOrUseCapture = boolean | AddEventListenerOptions;\ntype Handlers = Partial<Record<string, EventListener>>;\nexport declare function listen(target: EventTarget, handlers: Handlers, options?: EventListenerOptionsOrUseCapture, hook?: 'addEventListener' | 'removeEventListener'): void;\nexport declare function forget(target: EventTarget, events: Handlers, options?: EventListenerOptionsOrUseCapture): void;\ntype MixedEvent = React.SyntheticEvent<EventTarget> | Event;\nexport declare function stopEvent(event: MixedEvent): void;\nexport declare function stopEventImmediately(event: React.SyntheticEvent<EventTarget>): void;\nexport declare function cancelEvent(event: MixedEvent): void;\nexport declare function requestPointerLock(element: Element): Promise<void>;\nexport declare function checkDateInputSupport(): boolean;\nexport declare const getListPasteHandler: ({ listItemSeparatorRegex, handleValue, }: {\n    listItemSeparatorRegex?: RegExp;\n    handleValue?: (arg1: string[]) => unknown;\n}) => ((arg1: ClipboardEvent) => unknown);\nexport {};\n//# sourceMappingURL=dom.d.ts.map"
        },
        "index.d.ts": {
          "path": "index.d.ts",
          "content": "export * from '../../utils/dom/dom';\n//# sourceMappingURL=index.d.ts.map"
        }
      },
      "allFiles": [
        "dom.stories.module.css",
        "dom.stories.tsx",
        "dom.ts",
        "index.ts"
      ]
    },
    "helpers": {
      "name": "helpers",
      "path": "src/utils/helpers",
      "files": {
        "helpers.d.ts": {
          "path": "helpers.d.ts",
          "content": "export declare const uuid: () => string;\nexport declare const range: (start: number, end: number) => Array<number>;\nexport declare const convertFileSize: (fileSize?: number) => string;\n//# sourceMappingURL=helpers.d.ts.map"
        },
        "index.d.ts": {
          "path": "index.d.ts",
          "content": "export * from '../../utils/helpers/helpers';\n//# sourceMappingURL=index.d.ts.map"
        }
      },
      "allFiles": [
        "helpers.stories.module.css",
        "helpers.stories.tsx",
        "helpers.ts",
        "index.ts"
      ]
    },
    "makeClassNameComponent": {
      "name": "makeClassNameComponent",
      "path": "src/utils/makeClassNameComponent",
      "files": {
        "index.d.ts": {
          "path": "index.d.ts",
          "content": "export * from '../../utils/makeClassNameComponent/makeClassNameComponent';\n//# sourceMappingURL=index.d.ts.map"
        },
        "makeClassNameComponent.d.ts": {
          "path": "makeClassNameComponent.d.ts",
          "content": "import * as React from 'react';\nimport type { Flow } from 'flow-to-typescript-codemod';\n/** Extract the actual ref instance type from a JSX element/component type */\ntype RefOf<E extends React.ElementType> = React.ComponentPropsWithRef<E> extends {\n    ref?: React.Ref<infer R>;\n} ? R : never;\n/** Public props for generated components: original props (no ref) + optional className */\nexport type ComponentProps<E extends React.ElementType> = React.ComponentPropsWithoutRef<E> & {\n    className?: string;\n};\n/** HOC display name helper: sets Wrapper.displayName = `${hocName}(WrappedName)` */\nexport declare function nameHoc<C, T extends React.ComponentType<C>, C2>(WrapperComponent: T, WrappedComponent: React.ComponentType<C2>, hocName: string): T;\n/** Public alias for “className-merging” components */\nexport type ClassNameComponent<T extends React.ElementType = 'div'> = Flow.AbstractComponent<ComponentProps<T>, RefOf<T>>;\n/**\n * Factory: builds a component for a given intrinsic tag or component type\n * that merges `className` with a base class and forwards its ref.\n */\nexport declare function makeClassNameComponent<C extends React.ElementType = 'div'>(baseClassName: string, ComponentType?: C, name?: string): Flow.AbstractComponent<ComponentProps<C>, RefOf<C>>;\nexport {};\n//# sourceMappingURL=makeClassNameComponent.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "makeClassNameComponent.stories.module.css",
        "makeClassNameComponent.stories.tsx",
        "makeClassNameComponent.tsx"
      ]
    },
    "menu": {
      "name": "menu",
      "path": "src/utils/menu",
      "files": {
        "index.d.ts": {
          "path": "index.d.ts",
          "content": "export * from '../../utils/menu/menu';\n//# sourceMappingURL=index.d.ts.map"
        },
        "menu.d.ts": {
          "path": "menu.d.ts",
          "content": "import type * as React from 'react';\nimport type { MenuGroupTitleOption, MenuOption } from '../../components/Menu';\n/**\n * Toggle an option in or out of a multi-select set.\n *\n * A missing `currentSelectedKeys` means \"nothing is selected yet\", not \"bad\n * input\": it is simply what an uncontrolled multi-select dropdown has before its\n * first pick. Treating it as invalid and returning an empty set meant every\n * toggle threw the selection away, so a checkbox-variant dropdown that was never\n * given an initial array could not select anything at all — by mouse as much as\n * by keyboard. Only a missing option key is genuinely nothing to toggle.\n */\nexport declare const getSelectedKeysFromSelectedOption: (currentOption?: MenuOption, currentSelectedKeys?: Array<string>) => Array<string>;\nexport declare const getTextLabelFromSelectedKeys: (currentSelectedKeys?: Array<string>, options?: MenuOption[]) => string;\nexport declare const getButtonLabelFromSelectedKeys: (currentSelectedKeys?: Array<string>, label?: React.ReactNode) => React.ReactNode;\nexport declare const getOptionFromKey: (options?: MenuOption[], key?: string) => MenuOption | null | undefined;\nexport declare const getOptionsFromKeys: (options?: MenuOption[], keys?: Array<string>) => Array<MenuOption>;\nexport declare const getFilteredOptionsFromSearchText: (options: MenuOption[], searchText: string) => MenuOption[];\nexport declare const getFilteredOptionsResultText: (options: MenuOption[], staticLabels: {\n    [key: string]: string;\n}) => string;\nexport declare const getFilteredComposeOptionsFromSearchText: (composeOptions: Array<Array<MenuOption>>, searchText: string) => Array<Array<MenuOption>>;\nexport declare const getFilteredComposeOptionsResultText: (composeOptions: Array<Array<MenuOption>>, staticLabels: {\n    [key: string]: string;\n}) => string;\nexport declare const getFilteredGroupTitleOptionsFromSearchText: (groupTitleOptions: Array<MenuGroupTitleOption>, searchText: string) => Array<MenuGroupTitleOption>;\nexport declare const getFilteredGroupTitleOptionsResultText: (groupTitleOptions: Array<MenuGroupTitleOption>, staticLabels: {\n    [key: string]: string;\n}) => string;\n//# sourceMappingURL=menu.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "menu.ts"
      ]
    },
    "merge-refs": {
      "name": "merge-refs",
      "path": "src/utils/merge-refs",
      "files": {
        "index.d.ts": {
          "path": "index.d.ts",
          "content": "export * from '../../utils/merge-refs/merge-refs';\n//# sourceMappingURL=index.d.ts.map"
        },
        "merge-refs.d.ts": {
          "path": "merge-refs.d.ts",
          "content": "import type * as React from 'react';\nexport declare function mergeRefs<T>(refs: Array<React.Ref<T> | null | undefined>): React.RefCallback<T>;\n//# sourceMappingURL=merge-refs.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "merge-refs.stories.module.css",
        "merge-refs.stories.tsx",
        "merge-refs.ts"
      ]
    },
    "qa": {
      "name": "qa",
      "path": "src/utils/qa",
      "files": {
        "index.d.ts": {
          "path": "index.d.ts",
          "content": "export * from '../../utils/qa/qa';\n//# sourceMappingURL=index.d.ts.map"
        },
        "qa.d.ts": {
          "path": "qa.d.ts",
          "content": "/**\n * Generate a stable `data-testid` string.\n *\n * Format:\n *   <base>[__<slot>][--<index>][--<modifierA>--<modifierB>...]\n *\n * Examples:\n *   generateTestId({ base: \"profile__email\", slot: \"input\" })\n *   // \"profile__email__input\"\n *\n *   generateTestId({ base: \"users\", slot: \"item\", index: \"u-100\" })\n *   // \"users__item--u-100\"\n *\n *   generateTestId({ base: \"filters\", slot: \"chip\", modifiers: [\"selected\", \"lg\"] })\n *   // \"filters__chip--selected--lg\"\n *\n * Guidance:\n * - Keep `base` stable and human-readable (don’t derive from user text or use UUIDs).\n * - For repeated items, prefer stable business keys for `index` (e.g., `user.id`).\n * - Use `modifiers` to encode state/variants cleanly in selectors.\n */\nexport interface GenerateTestIdParams {\n    base?: string;\n    slot?: string;\n    index?: number | string;\n    modifiers?: ReadonlyArray<string | number | boolean | null | undefined>;\n}\n/** Returns the composed id, or `undefined` if `base` is missing. */\nexport declare function generateTestId(params: GenerateTestIdParams): string | undefined;\n//# sourceMappingURL=qa.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "qa.stories.module.css",
        "qa.stories.tsx",
        "qa.tsx"
      ]
    },
    "rating": {
      "name": "rating",
      "path": "src/utils/rating",
      "files": {
        "index.d.ts": {
          "path": "index.d.ts",
          "content": "export * from '../../utils/rating/rating';\n//# sourceMappingURL=index.d.ts.map"
        },
        "rating.d.ts": {
          "path": "rating.d.ts",
          "content": "export declare const RATING_ERRORS: Readonly<{\n    INVALID_RANGE: {\n        type: string;\n        description: string;\n    };\n    INVALID_RATING_LABELS: {\n        type: string;\n        description: string;\n    };\n}>;\nexport declare const RATINGS: Array<string>;\nexport declare const getRatingLabel: (rating: number, labels: Array<string>) => string;\n//# sourceMappingURL=rating.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "rating.ts"
      ]
    },
    "score-bar": {
      "name": "score-bar",
      "path": "src/utils/score-bar",
      "files": {
        "index.d.ts": {
          "path": "index.d.ts",
          "content": "export * from '../../utils/score-bar/score-bar';\n//# sourceMappingURL=index.d.ts.map"
        },
        "score-bar.d.ts": {
          "path": "score-bar.d.ts",
          "content": "import type { ScoreBarColorMap, ScoreBarLabelMap } from '../../components/ScoreBar';\nexport declare const getColorByScorePercentage: (totalBars: number, score: number, currentBarNumber: number, colorMap: ScoreBarColorMap) => string;\nexport declare const getLabelByScorePercentage: (score: number, totalBars: number, labelMap?: ScoreBarLabelMap) => string;\nexport declare const SCORE_BAR_ERRORS: Readonly<{\n    INVALID_BAR_COUNT: {\n        type: string;\n        description: string;\n    };\n}>;\n//# sourceMappingURL=score-bar.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "score-bar.ts"
      ]
    },
    "string": {
      "name": "string",
      "path": "src/utils/string",
      "files": {
        "index.d.ts": {
          "path": "index.d.ts",
          "content": "export * from '../../utils/string/string';\n//# sourceMappingURL=index.d.ts.map"
        },
        "string.d.ts": {
          "path": "string.d.ts",
          "content": "export declare const capitalize: (word: string) => string;\nexport declare const escapeRegExp: (str: string) => string;\nexport declare const formatWord: (word: string, count: number) => string;\nexport declare const truncateString: (inputString: string, maxLength: number) => string;\nexport declare const appendPx: (value?: number | string) => string;\n//# sourceMappingURL=string.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "string.stories.module.css",
        "string.stories.tsx",
        "string.ts"
      ]
    },
    "token-list-input": {
      "name": "token-list-input",
      "path": "src/utils/token-list-input",
      "files": {
        "token-list-input.d.ts": {
          "path": "token-list-input.d.ts",
          "content": "import type * as React from 'react';\ninterface V {\n    key: string;\n    label: string;\n    arbitrary?: boolean;\n    multiarbitrary?: boolean;\n}\ninterface Group<V> {\n    options?: Array<V>;\n    groupTitle?: React.ReactNode;\n}\nexport declare const getFirstOption: (options: Array<V>) => V | null;\nexport declare const getFirstOptionFromGroup: (groupTitleOptions: Array<Group<V>>) => V | null;\nexport {};\n//# sourceMappingURL=token-list-input.d.ts.map"
        }
      },
      "allFiles": [
        "token-list-input.ts"
      ]
    },
    "tokens": {
      "name": "tokens",
      "path": "src/utils/tokens",
      "files": {
        "index.d.ts": {
          "path": "index.d.ts",
          "content": "export * from '../../utils/tokens/tokens';\n//# sourceMappingURL=index.d.ts.map"
        },
        "tokens.d.ts": {
          "path": "tokens.d.ts",
          "content": "interface TokenObject {\n    [key: string]: string;\n}\nexport type SortOrder = 'asc' | 'desc';\nexport type SortBy = 'name' | 'value';\nexport interface TableDataItem {\n    id: string | number;\n    name: string;\n    value: string;\n    demo: string;\n    [key: string]: unknown;\n}\nexport type TableData = Array<TableDataItem>;\nexport interface DataVariation {\n    title: string;\n    description: string;\n}\nexport declare const dataVariations: Array<DataVariation>;\n/**\n *\n * This function takes in an object containing key-value pairs of tokens,\n * where values are strings representing numerical\n * values with optional percentage or viewport units. It also takes in an optional\n * sort order ('asc' or 'desc') and an optional sort by parameter ('name' or 'value').\n *\n * The function sorts the tokens by either their key names (if sortBy='name') or their\n * numerical values (if sortBy='value'). The sort order can be specified as\n * ascending (order='asc') or descending (order='desc').\n *\n * The function handles values with different units by comparing their numerical values.\n * If both values have the same unit, their numerical values are compared directly.\n * If their units are different, tokens with percentage values are considered greater than\n * those with viewport units, and tokens without a percentage or viewport unit are compared\n * based on their numerical values.\n *\n */\nexport declare const getSortedTokenNames: (obj: TokenObject, order?: SortOrder, sortBy?: SortBy) => Array<string>;\nexport declare const filterTableDataBySearchText: (TABLE_DATA: TableData, searchText: string) => TableData;\nexport declare const getRandomDataVariation: () => DataVariation;\nexport declare const handleDownload: (filePath: string, fileName: string) => void;\nexport {};\n//# sourceMappingURL=tokens.d.ts.map"
        }
      },
      "allFiles": [
        "index.ts",
        "tokens.ts"
      ]
    }
  },
  "types": {
    "charts": {
      "name": "charts",
      "path": "src/types/charts.ts",
      "content": "import type Highcharts from 'highcharts';\n\n\nexport type ChartOptions = Highcharts.Options;\nexport type AxisOptions = Highcharts.AxisOptions;\nexport type BreadcrumbsOptions = Highcharts.NavigationBreadcrumbsOptions;\nexport type LegendOptionsType = Highcharts.LegendOptions;\nexport type CSSObject = Highcharts.CSSObject;\nexport type DataOptionsType = Highcharts.PointOptionsObject;\nexport type SeriesOptionsType = Highcharts.SeriesOptionsType;\nexport type ColumnSeriesOptions = Highcharts.SeriesColumnOptions;\nexport type LineSeriesOptions = Highcharts.SeriesLineOptions;\nexport type PieSeriesOptions = Highcharts.SeriesPieOptions;\nexport type FunnelSeriesOptions = Highcharts.SeriesFunnelOptions;\nexport type SankeySeriesOptions = Highcharts.SeriesSankeyOptions;\nexport type SankeyNodeOptions = Highcharts.SeriesSankeyNodesOptionsObject;\nexport type SankeyPointOptions = Highcharts.SeriesSankeyPointOptionsObject;\nexport type Drilldown = Highcharts.DrilldownOptions;\nexport type PlotOptionsType = Highcharts.PlotOptions;\nexport type ChartTooltip = Highcharts.TooltipOptions;\nexport type Legend = Highcharts.LegendOptions;\nexport type Credits = Highcharts.CreditsOptions;\nexport type Navigation = Highcharts.NavigationOptions;\nexport type ChartBreadcrumbs = Highcharts.NavigationBreadcrumbsOptions;\nexport type ButtonTheme = Highcharts.NavigationBreadcrumbsButtonThemeOptions;\nexport type Position = Highcharts.NavigationBreadcrumbsPositionOptions;\n\nexport interface ChartRef {\n  chart?: Highcharts.Chart;\n}\n"
    },
    "common": {
      "name": "common",
      "path": "src/types/common.ts",
      "content": "export type GroupAlign = 'vertical' | 'horizontal-fixed' | 'horizontal-fluid';\n\nexport const ALERT_SEMANTIC = Object.freeze({\n  neutral: 'neutral',\n  success: 'success',\n  information: 'information',\n  warning: 'warning',\n  danger: 'danger',\n});\n\nexport type AlertSemanticType =\n  (typeof ALERT_SEMANTIC)[keyof typeof ALERT_SEMANTIC];\n"
    },
    "date-range-picker": {
      "name": "date-range-picker",
      "path": "src/types/date-range-picker.ts",
      "content": "export type TimeUnit = 'years' | 'months' | 'days' | 'd' | 'M' | 'y';\n\nexport interface DateRange {\n  startDate?: string | null | undefined;\n  endDate?: string | null | undefined;\n}\n\nexport interface DateRangePickerErrorTypes {\n  [key: string]: {\n    type: string;\n    description: string;\n  };\n}\n\nexport interface DateRangePickerError {\n  type: string;\n  description: string;\n}\n\nexport interface DateRangeWithTimezone\n  extends Omit<DateRange, 'startDateUTC' | 'endDateUTC' | 'timezone'> {\n  startDateUTC?: string | null | undefined;\n  endDateUTC?: string | null | undefined;\n  timezone?: string;\n}\n"
    },
    "index": {
      "name": "index",
      "path": "src/types/index.ts",
      "content": "export * from 'src/types/charts';\nexport * from 'src/types/common';\nexport * from 'src/types/date-range-picker';\nexport * from 'src/types/menu';\nexport * from 'src/types/toast';\nexport * from 'src/types/typography';\nexport * from 'src/types/utils';\n"
    },
    "menu": {
      "name": "menu",
      "path": "src/types/menu.ts",
      "content": "export type MenuClassNames = Readonly<{\n  wrapper?: string;\n  option?: string;\n  groupTitle?: string;\n  optionTextContainer?: string;\n  optionTextLabel?: string;\n  header?: string;\n  footer?: string;\n}>;\n\nexport interface MenuLabelTooltip {\n  maxLines?: number;\n}\n"
    },
    "toast": {
      "name": "toast",
      "path": "src/types/toast.ts",
      "content": "import type * as React from 'react';\n\n\nexport const POSITIONS = {\n  TOP_CENTER: 'topCenter',\n  TOP_LEFT: 'topLeft',\n  TOP_RIGHT: 'topRight',\n  BOTTOM_LEFT: 'bottomLeft',\n  BOTTOM_RIGHT: 'bottomRight',\n  BOTTOM_CENTER: 'bottomCenter',\n} as const;\n\nexport const ACTIONS = {\n  ADD: 'ADD',\n  REMOVE: 'REMOVE',\n} as const;\n\nexport type PositionTypes = (typeof POSITIONS)[keyof typeof POSITIONS];\nexport type ActionTypes = (typeof ACTIONS)[keyof typeof ACTIONS];\n\nexport type ContentTypes = React.ReactNode;\n\nexport interface ToastOptions {\n  timeout?: number;\n  position?: PositionTypes;\n  autoClose?: boolean;\n  uniqueCode?: string | number;\n}\n\nexport interface OptionTypes extends Omit<ToastOptions, 'id' | 'key'> {\n  id: string;\n  key?: string;\n}\n\nexport type CallbackFuncTypes = (\n  type: ActionTypes,\n  content: ContentTypes,\n  options: OptionTypes,\n) => void;\n"
    },
    "typography": {
      "name": "typography",
      "path": "src/types/typography.ts",
      "content": "export const TEXT_COLORS = Object.freeze({\n  primary: 'primary',\n  secondary: 'secondary',\n  tertiary: 'tertiary',\n  disabled: 'disabled',\n  clickable: 'clickable',\n  neutral: 'neutral',\n  success: 'success',\n  information: 'information',\n  warning: 'warning',\n  danger: 'danger',\n  inversePrimary: 'inversePrimary',\n  inverseSecondary: 'inverseSecondary',\n  favorite: 'favorite',\n});\n\nexport type ColorTypes = (typeof TEXT_COLORS)[keyof typeof TEXT_COLORS];\n"
    },
    "utils": {
      "name": "utils",
      "path": "src/types/utils.ts",
      "content": "/**\n * ------------------------------------------------------------------------\n * Utility types for Flow-style spread + override semantics\n * ------------------------------------------------------------------------\n *\n * WHY THIS Type EXISTS\n * --------------------\n * In Flow you can write:\n *\n *   type B = { ...A, c: number };\n *\n * which means \"take all of A's properties, but if there is a conflict,\n * override with the new definition.\" In TypeScript, doing the naive\n *\n *   type B = A & { c: number };\n *\n * will give you `c: string & number` (=> `never`) instead of the\n * intended override. That leads to subtle bugs or unusable types.\n *\n * To avoid this pitfall and to set a clear team standard, we define\n * short utilities here (`Over`, `OverAll`, etc.) that encode the\n * intended semantics: **include everything from the left, right side\n * wins on conflicts**.\n *\n *\n * WHAT EACH UTILITY DOES\n * ----------------------\n *\n *   Over<T, R>\n *     - Include all properties from T\n *     - Add properties from R\n *     - For overlapping keys, R overrides T\n *\n *   OverAll<T, [R1, R2, ...]>\n *     - Fold multiple overrides in sequence, left → right\n *     - Equivalent to: Over(Over(Over(T, R1), R2), ...)\n *     - Rightmost definition of a key always wins\n *\n *   OverOnly<T, R>\n *     - Same as Over, but disallows adding brand-new keys\n *     - Useful when you want to enforce \"true override only\"\n *\n *   OverAllOnly<T, [R1, R2, ...]>\n *     - Same as OverAll, but strict: every key in every R must\n *       already exist in T (or an earlier override)\n *\n *\n * EXAMPLES\n * --------\n *\n *   // Base shape\n *   type A = { a: boolean; b: number; c: string };\n *\n *   // Simple override\n *   type B = Over<A, { c: number }>;\n *   // => { a: boolean; b: number; c: number }\n *\n *   // Multiple overrides\n *   type C = OverAll<A, [\n *     { c: number },\n *     { b: string },\n *     { d: Date }\n *   ]>;\n *   // => { a: boolean; c: number; b: string; d: Date }\n *\n *   // Strict variant (no new keys allowed)\n *   type D = OverOnly<A, { c: number }>;         // OK\n *   type E = OverOnly<A, { d: Date }>;           // ERROR (d not in A)\n *\n *\n * DESIGN SYSTEM USAGE\n * -------------------\n * - Use **Over** by default whenever you would otherwise write\n *   `A & { ... }`. This ensures right-biased override and prevents\n *   \"never\" bugs.\n *\n * - Use **OverAll** if you are combining 3+ prop bags or when you\n *   have `A & B & C & { ... }`.\n *\n * - Use **OverOnly / OverAllOnly** when you want to *forbid*\n *   introducing brand-new props, e.g. when extending a public API\n *   contract that must not grow new keys.\n *\n *\n * TEAM STANDARD\n * -------------\n * ✅ Always prefer Over / OverAll for prop composition in DS components.\n * ❌ Avoid raw `& { ... }` intersections for overrides — they will\n *    produce `never` on conflicts.\n *\n * This makes our type contracts predictable, Flow-like, and safer\n * against accidental regressions when new keys are added upstream.\n *\n */\n\nexport type Over<T extends object, R extends object> = Omit<T, keyof R> & R;\n\nexport type OverAll<\n  T extends object,\n  Rs extends readonly object[],\n> = Rs extends [infer H extends object, ...infer Tail extends readonly object[]]\n  ? OverAll<Over<T, H>, Tail>\n  : T;\n\n// Strict: only allow overriding keys that already exist in T\nexport type OverOnly<\n  T extends object,\n  R extends {[K in keyof R & keyof T]: unknown} & object,\n> = Omit<T, keyof R> & R;\n\nexport type OverAllOnly<\n  T extends object,\n  Rs extends readonly object[],\n> = Rs extends [infer H extends object, ...infer Tail extends readonly object[]]\n  ? OverAllOnly<OverOnly<T, H>, Tail>\n  : T;\n"
    }
  }
}