Project: doctolib-doctolib · Branch: master · Mode: ` · **Model:**claude-haiku-4-5-20251001`
Stats: 1 user messages, 24 tool calls, tools used: Bash, Read.
Conversation
Turn 1 — User
Explore the Oxygen design system at /Users/USER/workspace/doctolib/oxygen/packages to find all available UI components.
I need a comprehensive list of components with their: 1. Component name (exported identifier) 2. File path 3. Brief description of what it does (from prop types or JSDoc) 4. Key props (especially any related to: tables, modals, badges, buttons, forms, filters, checkboxes, date pickers, selects, pagination)
Focus especially on components that would be useful for: - Modal/dialog containers - Data tables with sortable columns and row selection - Status badges/chips/tags - Action buttons (with disabled state) - Filter panels (checkboxes, date range pickers, select dropdowns) - Error banners/alerts - Loading states/spinners - Pagination controls - Headers/titles
Look in /Users/USER/workspace/doctolib/oxygen/packages/*/src/ and find the main index.ts exports.
Please be thorough - list ALL component names that are exported from the design system's main index files. Also note if there's a Storybook or README with usage examples.
Turn 1 — Assistant
I'll help you explore the Oxygen design system and compile a comprehensive list of UI components. Let me start by examining the package structure.
Tools used:
Bash:find /Users/USER/workspace/doctolib/oxygen/packages -type f -name "index.ts" | head -20
Tool results:
→ result (ok): /Users/USER/workspace/doctolib/oxygen/packages/core/src/tokens/index.ts /Users/USER/workspace/doctolib/oxygen/packages/toast/src/components/Toast/index.ts /Users/USER/workspace/doctolib/oxygen/packages/toast/src/components/ToastCard/index.ts /Users/USER/workspace/doctolib/oxygen/packages/toast/src/index.ts /Users/USER/workspace/doctolib/oxygen/packages/storybook-config/components/index.ts /Users/USER/workspace/doctolib/oxygen/packages/codemods/src/bin/index.ts /Users/USER/workspace/doctolib/oxyg …(truncated, 117 more chars)
Let me explore the package structure more systematically.
Tools used:
Bash:ls -la /Users/USER/workspace/doctolib/oxygen/packages/
Tool results:
→ result (ok): drwxr-xr-x clertonra staff 384 B Wed Feb 25 13:12:45 2026 . drwxr-xr-x clertonra staff 1.3 KB Wed Feb 25 13:12:45 2026 .. drwxr-xr-x clertonra staff 608 B Wed Feb 25 13:12:44 2026 b2b drwxr-xr-x clertonra staff 576 B Wed Feb 25 13:12:44 2026 b2c drwxr-xr-x clertonra staff 448 B Wed Feb 25 13:12:44 2026 codemods drwxr-xr-x clertonra staff 832 B Wed Feb 25 13:12:44 2026 core drwxr-xr-x clertonra staff 480 B Wed Feb 25 13:12:45 2026 icons drwxr-xr-x clertonra staff 416 B Wed Feb 25 13:12:45 …(truncated, 303 more chars)
Now let me check the main component packages. Let me explore each one:
Tools used:
Bash:find /Users/USER/workspace/doctolib/oxygen/packages -type d -maxdepth 2 -name src
Tool results:
→ result (ok): /Users/USER/workspace/doctolib/oxygen/packages/illustrative-icons/src /Users/USER/workspace/doctolib/oxygen/packages/core/src /Users/USER/workspace/doctolib/oxygen/packages/toast/src /Users/USER/workspace/doctolib/oxygen/packages/b2b/src /Users/USER/workspace/doctolib/oxygen/packages/b2c/src /Users/USER/workspace/doctolib/oxygen/packages/icons/src /Users/USER/workspace/doctolib/oxygen/packages/tokens/src /Users/USER/workspace/doctolib/oxygen/packages/codemods/src
Let me check the main index files for each package:
Tools used:
Read:/Users/USER/workspace/doctolib/oxygen/packages/core/src
Tool results:
→ result (ERROR): EISDIR: illegal operation on a directory, read '/Users/USER/workspace/doctolib/oxygen/packages/core/src'
Tools used:
Bash:find /Users/USER/workspace/doctolib/oxygen/packages/core/src -maxdepth 1 -name "index.ts" -o -name "index.tsx"
Tool results:
→ result (ok)
Tools used:
Bash:ls -la /Users/USER/workspace/doctolib/oxygen/packages/core/src/ | head -30
Tool results:
→ result (ok): drwxr-xr-x clertonra staff 1.1 KB Wed Feb 25 13:12:44 2026 . drwxr-xr-x clertonra staff 832 B Wed Feb 25 13:12:44 2026 .. drwxr-xr-x clertonra staff 224 B Wed Feb 25 13:12:44 2026 a11y drwxr-xr-x clertonra staff 256 B Wed Feb 25 13:12:44 2026 actions drwxr-xr-x clertonra staff 96 B Wed Feb 25 13:12:44 2026 collection drwxr-xr-x clertonra staff 256 B Wed Feb 25 13:12:44 2026 common .rw-r--r-- clertonra staff 45 B Wed Feb 25 13:12:44 2026 constants.ts drwxr-xr-x clertonra staff 832 B Wed …(truncated, 1604 more chars)
Good! Now let me check for the main exports. Let me look for index files in the core package:
Tools used:
Bash:find /Users/USER/workspace/doctolib/oxygen/packages/core -name "index.ts" -o -name "index.tsx" | sort
Tool results:
→ result (ok): /Users/USER/workspace/doctolib/oxygen/packages/core/src/tokens/index.ts
Let me check if there's a main entry point at the root level:
Tools used:
Bash:ls -la /Users/USER/workspace/doctolib/oxygen/packages/core/ | grep -E "index|package"
Tool results:
→ result (ok): .rw-r--r-- clertonra staff 41 KB Wed Feb 25 13:12:44 2026 package.json
Tools used:
Read:/Users/USER/workspace/doctolib/oxygen/packages/core/package.json
Tool results:
→ result (ok): 1→{ 2→ "name": "@doctolib/design-system", 3→ "version": "2.27.2", 4→ "license": "Doctolib", 5→ "description": "Doctolib's design system", 6→ "type": "module", 7→ "scripts": { 8→ "clean": "rm -rf node_modules/", 9→ "build": "rimraf dist/ && npm run -s sync-style-files && tsc --project tsconfig.build.json && tsc-alias --project tsconfig.build.json", 10→ "check-exports": "tsx ../../scripts/check-exports.ts", 11→ "dev": "nx run storyb …(truncated, 48648 more chars)
Perfect! Now I have the main exports. Let me check the source files for component descriptions. Let me check a few key components to get their descriptions:
Tools used:
Read:/Users/USER/workspace/doctolib/oxygen/packages/core/src/dataDisplay/Table/Table.tsx(1–50)
Tool results:
→ result (ok): 1→import './Table.scss' 2→ 3→import classNames from 'classnames' 4→import type { ComponentPropsWithoutRef, ReactNode } from 'react' 5→ 6→import type { SkeletonLoaderProps } from './TableSkeletonLoader' 7→import { TableSkeletonLoader } from './TableSkeletonLoader' 8→ 9→type Props = { 10→ fixedLayout?: boolean | undefined 11→ className?: string | undefined 12→ children?: ReactNode 13→ loading?: boolean | undefined 14→ skeletonLoaderP …(truncated, 1458 more chars)
Excellent! Now let me check some more components to get their prop descriptions. Let me check Modal, Dialog, Badge, Button, etc.:
Tools used:
Bash:head -50 /Users/USER/workspace/doctolib/oxygen/packages/core/src/overlays/Modal/Modal.tsx
Tool results:
→ result (ok): import { forwardRef, useRef, type ReactElement, type ReactEventHandler, type ReactNode, type SyntheticEvent, } from 'react' import MaterialModal from '@mui/material/Modal' import classNames from 'classnames' import { v4 as uuidv4 } from 'uuid' import { _Transition as Transition } from '../_ModalTransition/_ModalTransition' import { IconButton } from '../../actions/IconButton/v2/IconButton' import { Button } from '../../actions/Button/Button' import type { DrawerProps } from '../Drawe …(truncated, 1023 more chars)
Let me gather prop info by checking several component files systematically:
Tools used:
Bash:grep -n "^\s*/\*\*" /Users/USER/workspace/doctolib/oxygen/packages/core/src/actions/Button/Button.tsx | head -5
Tool results:
→ result (ok): 102:/**
Tools used:
Read:/Users/USER/workspace/doctolib/oxygen/packages/core/src/actions/Button/Button.tsx(1–130)
Tool results:
→ result (ok): 1→import './Button.scss' 2→ 3→import classNames from 'classnames' 4→import { 5→ type ComponentPropsWithoutRef, 6→ type ComponentType, 7→ forwardRef, 8→ type MouseEventHandler, 9→ type TouchEventHandler, 10→} from 'react' 11→import type { DesignSystemIconComponent } from '@doctolib/design-system-icons' 12→import { Link } from 'react-router-dom' 13→ 14→import { getIconByNameOrComponent } from '../../helpers/icons' 15→import type …(truncated, 4605 more chars)
Let me now systematically gather component info by looking at multiple source files. Let me check several components in parallel:
Tools used:
Bash:for file in Badge Dialog Checkbox Select Pagination Alert EmptyState; do echo "=== $file ==="; head -40 /Users/USER/workspace/doctolib/oxygen/packages/core/src/*/$file/$file.tsx 2>/dev/null | gre …(truncated, 34 more chars)
Tool results:
→ result (ok): === Badge === / * A Badge is a small visual indicator component used to show notifications counts and/or highlight new or updated content. */ === Dialog === / * A Dialog is a modal window that appears above the page content to deliver important information or request user confirmation for a specific action. To capture the user's full attention, the page content is inaccessible and hidden behind a Backdrop. * === Checkbox === === Select === /* display mode of the field / uiStyle?: ' …(truncated, 306 more chars)
Good! Now let me systematically extract the full component list and their descriptions. Let me read multiple component source files:
Tools used:
Read:/Users/USER/workspace/doctolib/oxygen/packages/core/src/dataDisplay/Badge/Badge.tsx(1–60)
Tool results:
→ result (ok): 1→import type { ReactNode } from 'react' 2→import classNames from 'classnames' 3→import { Span } from '../text/Span' 4→import './Badge.scss' 5→ 6→export type BadgeStyle = 7→ | 'info' 8→ | 'error' 9→ | 'success' 10→ | 'warning' 11→ | 'dark-info' 12→ | 'mute' 13→ | 'no-background' 14→ | 'neutral' 15→ | 'disabled' 16→ 17→export type BadgeProps = { 18→ walkmeId?: string | undefined 19→ 'aria-label'?: string | …(truncated, 1648 more chars)
Let me now check additional important components and create a comprehensive list. Let me check more files in parallel:
Tools used:
Read:/Users/USER/workspace/doctolib/oxygen/packages/core/src/overlays/Dialog/Dialog.tsx(1–60)
Tool results:
→ result (ok): 1→import './Dialog.scss' 2→ 3→import classNames from 'classnames' 4→import type { DesignSystemIconComponent } from '@doctolib/design-system-icons' 5→import type { ReactEventHandler, ReactNode } from 'react' 6→ 7→import { Button } from '../../actions/Button/Button' 8→import type { IconName } from '../../dataDisplay/Icon/Icon' 9→import { Modal, type ModalProps } from '../Modal/Modal' 10→import { ModalBody } from '../ModalBody/ModalBody' 11→import { M …(truncated, 2103 more chars)
Let me check a few more critical components and gather more information about props:
Tools used:
Read:/Users/USER/workspace/doctolib/oxygen/packages/core/src/feedbacks/Alert/Alert.tsx(1–80)
Tool results:
→ result (ok): 1→import './Alert.scss' 2→ 3→import classNames from 'classnames' 4→import type { DesignSystemIconComponent } from '@doctolib/design-system-icons' 5→import type { MouseEventHandler, ReactElement, ReactNode } from 'react' 6→ 7→import { Button } from '../../actions/Button/Button' 8→import { getIconByNameOrComponent } from '../../helpers/icons' 9→import { IconButton } from '../../actions/IconButton/v2/IconButton' 10→import type { IconName } from '../../dat …(truncated, 3027 more chars)
Let me check the forms components now:
Tools used:
Bash:head -50 /Users/USER/workspace/doctolib/oxygen/packages/core/src/forms/Checkbox/Checkbox.tsx | grep -A 5 "/\*\*"
Tool results:
→ result (ok)
Tools used:
Read:/Users/USER/workspace/doctolib/oxygen/packages/core/src/forms/Checkbox/Checkbox.tsx(1–70)
Tool results:
→ result (ok): 1→import './Checkbox.scss' 2→ 3→import type { ChangeEventHandler, FocusEventHandler, MouseEventHandler, ReactNode } from 'react' 4→import classNames from 'classnames' 5→import { forwardRef, useEffect, useImperativeHandle, useMemo, useRef } from 'react' 6→import { v4 as uuidv4 } from 'uuid' 7→ 8→import { computeAriaDescribedBy } from '../private/aria' 9→import type { FieldState } from '../private/Field' 10→import { Icon } from '../../dataDisplay/Icon/Ic …(truncated, 2468 more chars)
Now let me check pagination and a few more important components:
Tools used:
Read:/Users/USER/workspace/doctolib/oxygen/packages/core/src/navigation/Pagination/Pagination.tsx(1–70)
Tool results:
→ result (ok): 1→import './Pagination.scss' 2→ 3→import type { MouseEvent, MouseEventHandler, ReactNode } from 'react' 4→ 5→import { Button } from '../../actions/Button/Button' 6→import { Icon } from '../../dataDisplay/Icon/Icon' 7→import classNames from 'classnames' 8→import { range } from 'lodash-es' 9→import { useTranslations } from '../../i18n/useTranslations' 10→ 11→type PaginationButtonProps = { 12→ children?: ReactNode 13→ active?: boolean 14 …(truncated, 1944 more chars)
Let me check a few more components and also look for the Storybook documentation:
Tools used:
Bash:find /Users/USER/workspace/doctolib/oxygen/packages/core -name ".storybook" -o -name "README*" | head -10
Tool results:
→ result (ok): /Users/USER/workspace/doctolib/oxygen/packages/core/.storybook /Users/USER/workspace/doctolib/oxygen/packages/core/README.md /Users/USER/workspace/doctolib/oxygen/packages/core/public/emoji_picker_data/README.md /Users/USER/workspace/doctolib/oxygen/packages/core/src/README.mdx
Tools used:
Read:/Users/USER/workspace/doctolib/oxygen/packages/core/README.md
Tool results:
→ result (ok): 1→# Oxygen
2→
3→## Storybook
4→
5→- Last release
6→- 🔐 Next release
7→
8→## Contributing
9→
10→Run this command line at the root to launch Storybook:
11→
12→bash
13→npm run dev
14→
15→
16→Add a new story to the component you want to work on.
17→
18→For instance, if you're making changes to the Textarea component, you c
…(truncated, 5461 more chars)
Great! Now let me check Select and a few more form components to complete the picture:
Tools used:
Read:/Users/USER/workspace/doctolib/oxygen/packages/core/src/forms/Select/Select.tsx(1–80)
Tool results:
→ result (ok): 1→import type { ChangeEventHandler, ComponentProps, ReactNode } from 'react' 2→import { forwardRef, useId, useMemo } from 'react' 3→ 4→import { computeAriaDescribedBy } from '../private/aria' 5→import type { ContextualPopover } from '../../overlays/ContextualPopover/ContextualPopover' 6→import type { DataAttribute } from '../../common/DataAttribute/DataAttribute' 7→import type { FieldState } from '../private/Field' 8→import { getFieldInputId, getFieldLabelId } …(truncated, 3490 more chars)
Perfect! Now let me quickly check a few more key components and then compile the comprehensive list:
Tools used:
Read:/Users/USER/workspace/doctolib/oxygen/packages/core/src/feedbacks/SpinnerLoader/SpinnerLoader.tsx(1–50)
Tool results:
→ result (ok): 1→import type { ReactElement } from 'react' 2→import classNames from 'classnames' 3→import './SpinnerLoader.scss' 4→import { useTranslations } from '../../i18n/useTranslations' 5→ 6→const SPINNER_SIZES = { xsmall: 8, small: 12, medium: 16, large: 24 } as const 7→const STROKE_WIDTH = 2 8→ 9→export type SpinnerSize = keyof typeof SPINNER_SIZES 10→ 11→const viewboxSize = (size: SpinnerSize): string => `0 0 ${SPINNER_SIZES[size] + 1} ${SPINNER_SIZES[si …(truncated, 1867 more chars)
Perfect! Now I have enough information. Let me compile the comprehensive list of all Oxygen design system components based on the package.json exports I found earlier. Let me create a detailed report for the user:
Comprehensive Oxygen Design System Component List
I've analyzed the Oxygen design system at /Users/USER/workspace/doctolib/oxygen/packages/core/ and extracted all exported components. Here's the complete list organized by category:
OVERVIEW
- Package Name: @doctolib/design-system
- Version: 2.27.2
- Storybook: https://doctolib.github.io/storybook/ (Last release) | https://doctolib.github.io/storybook-ephemerals/next (Next release)
- Source Location: /Users/USER/workspace/doctolib/oxygen/packages/core/src/
- Setup: Run
npm run devat the root to launch Storybook locally on port 9001
COMPONENT CATEGORIES
ACTIONS (Button-like Components)
-
Button (
/dist/actions/Button/Button.js) - Allows users to perform actions in pages, areas, modals - Props:uiStyle(primary, primary-danger, secondary, tertiary-primary, tertiary-danger, tertiary-neutral, small-primary, small-neutral, small-danger, small-white, link-primary, link-danger, neutral),size(small, medium),disabled,loading,success,leftIcon,rightIcon,block,circle,square,floating- Status: Deprecated - use Button/v2 instead -
Button/v2 (
/dist/actions/Button/v2/Button.js) - Modern button component version -
IconButton (
/dist/actions/IconButton/IconButton.js) - Button displaying only an icon -
IconButton/v2 (
/dist/actions/IconButton/v2/IconButton.js) - Modern icon button version -
ButtonFloating (
/dist/actions/ButtonFloating/ButtonFloating.js) - Floating action button -
ButtonWithLinkStyle (
/dist/actions/ButtonWithLinkStyle/ButtonWithLinkStyle.js) - Button styled as a link -
Dropdown (
/dist/actions/Dropdown/Dropdown.js) - Dropdown menu component -
DropdownTrigger (
/dist/actions/Dropdown/DropdownTrigger.js) - Trigger for dropdown menus -
Switch (
/dist/actions/Switch/Switch.js) - Toggle switch component - Props:checked,disabled,onChange
DATA DISPLAY (Tables, Cards, Badges, Text)
-
Table (
/dist/dataDisplay/Table/Table.js) - Displays sets of data in tabular format - Props:fixedLayout,loading,skeletonLoaderProps,size(xsmall, small, medium) -
TableBody (
/dist/dataDisplay/Table/TableBody.js) - Table body container -
TableHead (
/dist/dataDisplay/Table/TableHead.js) - Table header container -
TableRow (
/dist/dataDisplay/Table/TableRow.js) - Table row component -
TableCell (
/dist/dataDisplay/Table/TableCell.js) - Table cell component -
TableHeadCell (
/dist/dataDisplay/Table/TableHeadCell.js) - Table header cell component -
TableHeadSelectAllCell (
/dist/dataDisplay/Table/TableHeadSelectAllCell.js) - Checkbox cell for selecting all rows -
TableSelectCell (
/dist/dataDisplay/Table/TableSelectCell.js) - Checkbox cell for row selection -
TableSkeletonLoader (
/dist/dataDisplay/Table/TableSkeletonLoader.js) - Loading skeleton for tables -
BulkSelect (
/dist/dataDisplay/Table/Utils/BulkSelect.js)- Utility for bulk row selection
-
useTableSort (
/dist/dataDisplay/Table/hooks/useTableSort.js)- Hook for handling sortable columns
-
Badge (
/dist/dataDisplay/Badge/Badge.js)- Small visual indicator for notifications/highlights
- Props:
uiStyle(info, error, success, warning, dark-info, mute, no-background, neutral, disabled),size(small, medium, large),children
-
Pill (
/dist/dataDisplay/Pill/Pill.js)- Pill-shaped badge component
-
Card (
/dist/dataDisplay/Card/Card.js)- Generic card container
-
CardSolid (
/dist/dataDisplay/Card/v2/CardSolid/CardSolid.js)- Solid card variant (v2)
-
CardElevated (
/dist/dataDisplay/Card/v2/CardElevated/CardElevated.js)- Elevated card variant (v2)
-
CardOutlined (
/dist/dataDisplay/Card/v2/CardOutlined/CardOutlined.js)- Outlined card variant (v2)
-
CardCollapsible (
/dist/dataDisplay/CardCollapsible/CardCollapsible.js)- Collapsible card component
-
Avatar (
/dist/dataDisplay/Avatar/Avatar.js)- User avatar component
-
AvatarGroup (
/dist/dataDisplay/AvatarGroup/AvatarGroup.js)- Group of avatars
-
Accordion (
/dist/dataDisplay/Accordion/Accordion.js)- Expandable/collapsible sections
-
Divider (
/dist/dataDisplay/Divider/Divider.js)- Visual separator
-
Icon (
/dist/dataDisplay/Icon/Icon.js)- Icon display component
-
IllustrativeIcon (
/dist/dataDisplay/IllustrativeIcon/IllustrativeIcon.js)- Large illustrative icons
-
Image (
/dist/dataDisplay/Image/Image.js)- Image display component
-
Picture (
/dist/dataDisplay/Picture/Picture.js)- Picture/responsive image component
-
EmojiPicker (
/dist/dataDisplay/EmojiPicker/EmojiPicker.js)- Emoji picker component
-
FormattedDate (
/dist/dataDisplay/FormattedDate/FormattedDate.js)- Display formatted dates
-
FormattedTime (
/dist/dataDisplay/FormattedTime/FormattedTime.js)- Display formatted times
-
HTML (
/dist/dataDisplay/HTML/HTML.js)- Safely render HTML content
-
LottieAnimation (
/dist/dataDisplay/LottieAnimation/LottieAnimation.js)- Lottie animation player
-
CensorEmail (
/dist/dataDisplay/privacy/CensorEmail.js)- Privacy-aware email display
-
CensorPhoneNumber (
/dist/dataDisplay/privacy/CensorPhoneNumber.js)- Privacy-aware phone number display
Text Components
-
Text (
/dist/dataDisplay/text/Text/Text.js)- Generic text component
-
Heading (
/dist/dataDisplay/text/Heading.js)- Heading/h1-h6 component
-
Paragraph (
/dist/dataDisplay/text/Paragraph.js)- Paragraph text component
-
Span (
/dist/dataDisplay/text/Span.js)- Span text component
FORMS (Input Fields, Checkboxes, Selects, etc.)
-
InputText (
/dist/forms/InputText/InputText.js) - Text input field - Props:value,onChange,disabled,label,placeholder,required,state(error/success),message -
RawInputText (
/dist/forms/InputText/RawInputText.js) - Unstyled text input -
InputPassword (
/dist/forms/InputPassword/InputPassword.js) - Password input field -
InputNumber (
/dist/forms/InputNumber/InputNumber.js) - Number input field -
InputDate (
/dist/forms/InputDate/InputDate.js) - Date picker input -
InputDateNoPicker (
/dist/forms/InputDateNoPicker/InputDateNoPicker.js) - Date input without picker -
InputColor (
/dist/forms/InputColor/InputColor.js) - Color picker input -
InputColor/v2 (
/dist/forms/InputColor/v2/InputColor.js) - Modern color picker (v2) -
Textarea (
/dist/forms/Textarea/Textarea.js) - Multi-line text input -
Checkbox (
/dist/forms/Checkbox/Checkbox.js)- Single checkbox
- Props:
checked,disabled,onChange,label,indeterminate,state(error/success),message
-
Checkbox/v2 (
/dist/forms/Checkbox/v2/Checkbox.js)- Modern checkbox version
-
CheckboxGroup (
/dist/forms/Checkbox/v2/CheckboxGroup.js)- Group of checkboxes
-
Radio (
/dist/forms/Radio/Radio.js)- Single radio button
-
Radio/v2 (
/dist/forms/RadioGroup/Radio.js)- Modern radio button
-
RadioGroup (
/dist/forms/RadioGroup/RadioGroup.js)- Group of radio buttons
-
Select (
/dist/forms/Select/Select.js)- Dropdown select field
- Props:
name,value,onChange,disabled,options,label,required,state,message,hint,placeholder,uiStyle(default/floating), `renderO …(truncated, 9987 more chars)