@mich8060/unified-design-system 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.lib.md +103 -0
- package/README.md +265 -0
- package/dist/LICENSE +21 -0
- package/dist/README.md +103 -0
- package/dist/package.json +49 -0
- package/dist/styles.css +20544 -0
- package/dist/uds-components.es.js +67031 -0
- package/dist/uds-components.es.js.map +1 -0
- package/dist/uds-components.umd.js +67048 -0
- package/dist/uds-components.umd.js.map +1 -0
- package/package.json +158 -0
- package/src/styles/_typography.scss +932 -0
- package/src/styles/_utilities.scss +3738 -0
- package/src/styles/_variables.scss +620 -0
- package/src/styles/prism-custom.css +204 -0
- package/src/styles/prism-custom.scss +205 -0
- package/src/styles/tokens.css +1463 -0
- package/src/styles/tokens.scss +1116 -0
- package/src/ui/Accordion/Accordion.ai.md +69 -0
- package/src/ui/Accordion/Accordion.scss +87 -0
- package/src/ui/Accordion/Accordion.spec.ts +25 -0
- package/src/ui/Accordion/Accordion.stories.tsx +46 -0
- package/src/ui/Accordion/Accordion.test.tsx +54 -0
- package/src/ui/Accordion/Accordion.tsx +73 -0
- package/src/ui/Accordion/Accordion.types.ts +15 -0
- package/src/ui/Accordion/index.js +1 -0
- package/src/ui/ActionMenu/ActionMenu.ai.md +106 -0
- package/src/ui/ActionMenu/ActionMenu.jsx +437 -0
- package/src/ui/ActionMenu/ActionMenu.scss +252 -0
- package/src/ui/ActionMenu/ActionMenu.spec.ts +12 -0
- package/src/ui/ActionMenu/ActionMenu.stories.jsx +14 -0
- package/src/ui/ActionMenu/ActionMenu.stories.tsx +124 -0
- package/src/ui/ActionMenu/ActionMenu.test.tsx +1 -0
- package/src/ui/ActionMenu/ActionMenu.tsx +6 -0
- package/src/ui/ActionMenu/ActionMenu.types.ts +3 -0
- package/src/ui/ActionMenu/index.js +1 -0
- package/src/ui/Avatar/Avatar.ai.md +54 -0
- package/src/ui/Avatar/Avatar.jsx +49 -0
- package/src/ui/Avatar/Avatar.scss +87 -0
- package/src/ui/Avatar/Avatar.spec.ts +12 -0
- package/src/ui/Avatar/Avatar.stories.jsx +14 -0
- package/src/ui/Avatar/Avatar.stories.tsx +14 -0
- package/src/ui/Avatar/Avatar.test.tsx +1 -0
- package/src/ui/Avatar/Avatar.tsx +6 -0
- package/src/ui/Avatar/Avatar.types.ts +3 -0
- package/src/ui/Avatar/index.js +1 -0
- package/src/ui/Badge/Badge.ai.md +37 -0
- package/src/ui/Badge/Badge.jsx +64 -0
- package/src/ui/Badge/Badge.scss +84 -0
- package/src/ui/Badge/Badge.spec.ts +12 -0
- package/src/ui/Badge/Badge.stories.jsx +14 -0
- package/src/ui/Badge/Badge.stories.tsx +14 -0
- package/src/ui/Badge/Badge.test.tsx +1 -0
- package/src/ui/Badge/Badge.tsx +6 -0
- package/src/ui/Badge/Badge.types.ts +3 -0
- package/src/ui/Badge/index.js +1 -0
- package/src/ui/Branding/Branding.ai.md +81 -0
- package/src/ui/Branding/Branding.jsx +127 -0
- package/src/ui/Branding/Branding.scss +57 -0
- package/src/ui/Branding/Branding.spec.ts +12 -0
- package/src/ui/Branding/Branding.stories.jsx +14 -0
- package/src/ui/Branding/Branding.stories.tsx +14 -0
- package/src/ui/Branding/Branding.test.tsx +1 -0
- package/src/ui/Branding/Branding.tsx +6 -0
- package/src/ui/Branding/Branding.types.ts +3 -0
- package/src/ui/Branding/index.js +1 -0
- package/src/ui/Breadcrumb/Breadcrumb.ai.md +50 -0
- package/src/ui/Breadcrumb/Breadcrumb.jsx +167 -0
- package/src/ui/Breadcrumb/Breadcrumb.scss +46 -0
- package/src/ui/Breadcrumb/Breadcrumb.spec.ts +12 -0
- package/src/ui/Breadcrumb/Breadcrumb.stories.jsx +26 -0
- package/src/ui/Breadcrumb/Breadcrumb.stories.tsx +14 -0
- package/src/ui/Breadcrumb/Breadcrumb.test.tsx +1 -0
- package/src/ui/Breadcrumb/Breadcrumb.tsx +6 -0
- package/src/ui/Breadcrumb/Breadcrumb.types.ts +3 -0
- package/src/ui/Breadcrumb/index.js +2 -0
- package/src/ui/Button/Button.ai.md +122 -0
- package/src/ui/Button/Button.figma.tsx +49 -0
- package/src/ui/Button/Button.scss +188 -0
- package/src/ui/Button/Button.spec.ts +52 -0
- package/src/ui/Button/Button.stories.tsx +199 -0
- package/src/ui/Button/Button.test.tsx +85 -0
- package/src/ui/Button/Button.tsx +131 -0
- package/src/ui/Button/Button.types.ts +32 -0
- package/src/ui/Button/index.js +1 -0
- package/src/ui/Calendar/Calendar.ai.md +151 -0
- package/src/ui/Calendar/Calendar.jsx +504 -0
- package/src/ui/Calendar/Calendar.scss +451 -0
- package/src/ui/Calendar/Calendar.spec.ts +12 -0
- package/src/ui/Calendar/Calendar.stories.jsx +14 -0
- package/src/ui/Calendar/Calendar.stories.tsx +14 -0
- package/src/ui/Calendar/Calendar.test.tsx +1 -0
- package/src/ui/Calendar/Calendar.tsx +6 -0
- package/src/ui/Calendar/Calendar.types.ts +3 -0
- package/src/ui/Calendar/index.js +1 -0
- package/src/ui/Card/Card.ai.md +41 -0
- package/src/ui/Card/Card.jsx +25 -0
- package/src/ui/Card/Card.scss +47 -0
- package/src/ui/Card/Card.spec.ts +12 -0
- package/src/ui/Card/Card.stories.jsx +28 -0
- package/src/ui/Card/Card.stories.tsx +14 -0
- package/src/ui/Card/Card.test.tsx +1 -0
- package/src/ui/Card/Card.tsx +6 -0
- package/src/ui/Card/Card.types.ts +3 -0
- package/src/ui/Card/index.js +1 -0
- package/src/ui/Checkbox/Checkbox.ai.md +50 -0
- package/src/ui/Checkbox/Checkbox.jsx +73 -0
- package/src/ui/Checkbox/Checkbox.scss +115 -0
- package/src/ui/Checkbox/Checkbox.spec.ts +12 -0
- package/src/ui/Checkbox/Checkbox.stories.jsx +14 -0
- package/src/ui/Checkbox/Checkbox.stories.tsx +14 -0
- package/src/ui/Checkbox/Checkbox.test.tsx +1 -0
- package/src/ui/Checkbox/Checkbox.tsx +6 -0
- package/src/ui/Checkbox/Checkbox.types.ts +3 -0
- package/src/ui/Checkbox/index.js +1 -0
- package/src/ui/Chip/Chip.ai.md +43 -0
- package/src/ui/Chip/Chip.jsx +102 -0
- package/src/ui/Chip/Chip.scss +118 -0
- package/src/ui/Chip/Chip.spec.ts +12 -0
- package/src/ui/Chip/Chip.stories.jsx +14 -0
- package/src/ui/Chip/Chip.stories.tsx +14 -0
- package/src/ui/Chip/Chip.test.tsx +1 -0
- package/src/ui/Chip/Chip.tsx +6 -0
- package/src/ui/Chip/Chip.types.ts +3 -0
- package/src/ui/Chip/index.js +1 -0
- package/src/ui/Datepicker/Datepicker.ai.md +45 -0
- package/src/ui/Datepicker/Datepicker.jsx +330 -0
- package/src/ui/Datepicker/Datepicker.scss +206 -0
- package/src/ui/Datepicker/Datepicker.spec.ts +12 -0
- package/src/ui/Datepicker/Datepicker.stories.jsx +14 -0
- package/src/ui/Datepicker/Datepicker.stories.tsx +14 -0
- package/src/ui/Datepicker/Datepicker.test.tsx +1 -0
- package/src/ui/Datepicker/Datepicker.tsx +6 -0
- package/src/ui/Datepicker/Datepicker.types.ts +3 -0
- package/src/ui/Datepicker/index.js +2 -0
- package/src/ui/Divider/Divider.ai.md +34 -0
- package/src/ui/Divider/Divider.jsx +89 -0
- package/src/ui/Divider/Divider.scss +116 -0
- package/src/ui/Divider/Divider.spec.ts +12 -0
- package/src/ui/Divider/Divider.stories.jsx +14 -0
- package/src/ui/Divider/Divider.stories.tsx +14 -0
- package/src/ui/Divider/Divider.test.tsx +1 -0
- package/src/ui/Divider/Divider.tsx +6 -0
- package/src/ui/Divider/Divider.types.ts +3 -0
- package/src/ui/Divider/index.js +1 -0
- package/src/ui/DotStatus/DotStatus.ai.md +36 -0
- package/src/ui/DotStatus/DotStatus.jsx +64 -0
- package/src/ui/DotStatus/DotStatus.scss +87 -0
- package/src/ui/DotStatus/DotStatus.spec.ts +12 -0
- package/src/ui/DotStatus/DotStatus.stories.jsx +14 -0
- package/src/ui/DotStatus/DotStatus.stories.tsx +14 -0
- package/src/ui/DotStatus/DotStatus.test.tsx +1 -0
- package/src/ui/DotStatus/DotStatus.tsx +6 -0
- package/src/ui/DotStatus/DotStatus.types.ts +3 -0
- package/src/ui/DotStatus/index.js +1 -0
- package/src/ui/Dropdown/Dropdown.ai.md +118 -0
- package/src/ui/Dropdown/Dropdown.scss +129 -0
- package/src/ui/Dropdown/Dropdown.spec.ts +54 -0
- package/src/ui/Dropdown/Dropdown.stories.tsx +59 -0
- package/src/ui/Dropdown/Dropdown.test.tsx +37 -0
- package/src/ui/Dropdown/Dropdown.tsx +119 -0
- package/src/ui/Dropdown/Dropdown.types.ts +25 -0
- package/src/ui/Dropdown/index.js +1 -0
- package/src/ui/EventCard/EventCard.ai.md +101 -0
- package/src/ui/EventCard/EventCard.jsx +92 -0
- package/src/ui/EventCard/EventCard.scss +186 -0
- package/src/ui/EventCard/EventCard.spec.ts +12 -0
- package/src/ui/EventCard/EventCard.stories.jsx +14 -0
- package/src/ui/EventCard/EventCard.stories.tsx +14 -0
- package/src/ui/EventCard/EventCard.test.tsx +1 -0
- package/src/ui/EventCard/EventCard.tsx +6 -0
- package/src/ui/EventCard/EventCard.types.ts +3 -0
- package/src/ui/EventCard/index.js +1 -0
- package/src/ui/Field/Field.ai.md +69 -0
- package/src/ui/Field/Field.jsx +89 -0
- package/src/ui/Field/Field.scss +76 -0
- package/src/ui/Field/Field.spec.ts +12 -0
- package/src/ui/Field/Field.stories.jsx +14 -0
- package/src/ui/Field/Field.stories.tsx +14 -0
- package/src/ui/Field/Field.test.tsx +1 -0
- package/src/ui/Field/Field.tsx +6 -0
- package/src/ui/Field/Field.types.ts +3 -0
- package/src/ui/Field/index.js +1 -0
- package/src/ui/FileUpload/FileUpload.ai.md +38 -0
- package/src/ui/FileUpload/FileUpload.figma.tsx +28 -0
- package/src/ui/FileUpload/FileUpload.jsx +153 -0
- package/src/ui/FileUpload/FileUpload.scss +78 -0
- package/src/ui/FileUpload/FileUpload.spec.ts +12 -0
- package/src/ui/FileUpload/FileUpload.stories.jsx +14 -0
- package/src/ui/FileUpload/FileUpload.stories.tsx +14 -0
- package/src/ui/FileUpload/FileUpload.test.tsx +1 -0
- package/src/ui/FileUpload/FileUpload.tsx +6 -0
- package/src/ui/FileUpload/FileUpload.types.ts +3 -0
- package/src/ui/FileUpload/index.js +2 -0
- package/src/ui/Flex/Flex.ai.md +130 -0
- package/src/ui/Flex/Flex.jsx +53 -0
- package/src/ui/Flex/Flex.scss +119 -0
- package/src/ui/Flex/Flex.spec.ts +12 -0
- package/src/ui/Flex/Flex.stories.jsx +14 -0
- package/src/ui/Flex/Flex.stories.tsx +14 -0
- package/src/ui/Flex/Flex.test.tsx +1 -0
- package/src/ui/Flex/Flex.tsx +6 -0
- package/src/ui/Flex/Flex.types.ts +3 -0
- package/src/ui/Flex/index.js +1 -0
- package/src/ui/Icon/Icon.ai.md +46 -0
- package/src/ui/Icon/Icon.figma.tsx +22 -0
- package/src/ui/Icon/Icon.jsx +47 -0
- package/src/ui/Icon/Icon.scss +1 -0
- package/src/ui/Icon/Icon.spec.ts +12 -0
- package/src/ui/Icon/Icon.stories.jsx +14 -0
- package/src/ui/Icon/Icon.stories.tsx +14 -0
- package/src/ui/Icon/Icon.test.tsx +1 -0
- package/src/ui/Icon/Icon.tsx +6 -0
- package/src/ui/Icon/Icon.types.ts +3 -0
- package/src/ui/Icon/index.js +1 -0
- package/src/ui/ImageAspect/ImageAspect.ai.md +37 -0
- package/src/ui/ImageAspect/ImageAspect.jsx +56 -0
- package/src/ui/ImageAspect/ImageAspect.scss +62 -0
- package/src/ui/ImageAspect/ImageAspect.spec.ts +12 -0
- package/src/ui/ImageAspect/ImageAspect.stories.jsx +14 -0
- package/src/ui/ImageAspect/ImageAspect.stories.tsx +14 -0
- package/src/ui/ImageAspect/ImageAspect.test.tsx +1 -0
- package/src/ui/ImageAspect/ImageAspect.tsx +6 -0
- package/src/ui/ImageAspect/ImageAspect.types.ts +3 -0
- package/src/ui/ImageAspect/index.js +1 -0
- package/src/ui/Input/Input.ai.md +89 -0
- package/src/ui/Input/Input.figma.tsx +35 -0
- package/src/ui/Input/Input.scss +126 -0
- package/src/ui/Input/Input.spec.ts +54 -0
- package/src/ui/Input/Input.stories.tsx +72 -0
- package/src/ui/Input/Input.test.tsx +70 -0
- package/src/ui/Input/Input.tsx +91 -0
- package/src/ui/Input/Input.types.ts +22 -0
- package/src/ui/Input/index.js +2 -0
- package/src/ui/Key/Key.ai.md +31 -0
- package/src/ui/Key/Key.jsx +37 -0
- package/src/ui/Key/Key.scss +31 -0
- package/src/ui/Key/Key.spec.ts +12 -0
- package/src/ui/Key/Key.stories.jsx +14 -0
- package/src/ui/Key/Key.stories.tsx +14 -0
- package/src/ui/Key/Key.test.tsx +1 -0
- package/src/ui/Key/Key.tsx +6 -0
- package/src/ui/Key/Key.types.ts +3 -0
- package/src/ui/Key/index.js +1 -0
- package/src/ui/Menu/Menu.jsx +232 -0
- package/src/ui/Menu/Menu.scss +370 -0
- package/src/ui/Menu/Menu.spec.ts +12 -0
- package/src/ui/Menu/Menu.stories.jsx +41 -0
- package/src/ui/Menu/Menu.stories.tsx +14 -0
- package/src/ui/Menu/Menu.test.tsx +1 -0
- package/src/ui/Menu/Menu.tsx +6 -0
- package/src/ui/Menu/Menu.types.ts +3 -0
- package/src/ui/Menu/index.js +1 -0
- package/src/ui/MicroCalendar/MicroCalendar.ai.md +35 -0
- package/src/ui/MicroCalendar/MicroCalendar.jsx +393 -0
- package/src/ui/MicroCalendar/MicroCalendar.scss +289 -0
- package/src/ui/MicroCalendar/MicroCalendar.spec.ts +12 -0
- package/src/ui/MicroCalendar/MicroCalendar.stories.jsx +14 -0
- package/src/ui/MicroCalendar/MicroCalendar.stories.tsx +14 -0
- package/src/ui/MicroCalendar/MicroCalendar.test.tsx +1 -0
- package/src/ui/MicroCalendar/MicroCalendar.tsx +6 -0
- package/src/ui/MicroCalendar/MicroCalendar.types.ts +3 -0
- package/src/ui/MicroCalendar/index.js +1 -0
- package/src/ui/Modal/Modal.ai.md +150 -0
- package/src/ui/Modal/Modal.jsx +173 -0
- package/src/ui/Modal/Modal.scss +179 -0
- package/src/ui/Modal/Modal.spec.ts +12 -0
- package/src/ui/Modal/Modal.stories.jsx +14 -0
- package/src/ui/Modal/Modal.stories.tsx +14 -0
- package/src/ui/Modal/Modal.test.tsx +1 -0
- package/src/ui/Modal/Modal.tsx +6 -0
- package/src/ui/Modal/Modal.types.ts +3 -0
- package/src/ui/Modal/index.js +1 -0
- package/src/ui/Pagination/Pagination.ai.md +30 -0
- package/src/ui/Pagination/Pagination.jsx +237 -0
- package/src/ui/Pagination/Pagination.scss +182 -0
- package/src/ui/Pagination/Pagination.spec.ts +12 -0
- package/src/ui/Pagination/Pagination.stories.jsx +14 -0
- package/src/ui/Pagination/Pagination.stories.tsx +14 -0
- package/src/ui/Pagination/Pagination.test.tsx +1 -0
- package/src/ui/Pagination/Pagination.tsx +6 -0
- package/src/ui/Pagination/Pagination.types.ts +3 -0
- package/src/ui/Pagination/index.js +1 -0
- package/src/ui/PillToggle/PillToggle.ai.md +44 -0
- package/src/ui/PillToggle/PillToggle.jsx +56 -0
- package/src/ui/PillToggle/PillToggle.scss +84 -0
- package/src/ui/PillToggle/PillToggle.spec.ts +12 -0
- package/src/ui/PillToggle/PillToggle.stories.jsx +14 -0
- package/src/ui/PillToggle/PillToggle.stories.tsx +14 -0
- package/src/ui/PillToggle/PillToggle.test.tsx +1 -0
- package/src/ui/PillToggle/PillToggle.tsx +6 -0
- package/src/ui/PillToggle/PillToggle.types.ts +3 -0
- package/src/ui/PillToggle/index.js +1 -0
- package/src/ui/Playground/Playground.ai.md +96 -0
- package/src/ui/Playground/Playground.jsx +524 -0
- package/src/ui/Playground/Playground.scss +310 -0
- package/src/ui/Playground/Playground.spec.ts +12 -0
- package/src/ui/Playground/Playground.stories.jsx +14 -0
- package/src/ui/Playground/Playground.stories.tsx +14 -0
- package/src/ui/Playground/Playground.test.tsx +1 -0
- package/src/ui/Playground/Playground.tsx +6 -0
- package/src/ui/Playground/Playground.types.ts +3 -0
- package/src/ui/Playground/index.js +2 -0
- package/src/ui/ProgressCircle/ProgressCircle.ai.md +36 -0
- package/src/ui/ProgressCircle/ProgressCircle.jsx +147 -0
- package/src/ui/ProgressCircle/ProgressCircle.scss +143 -0
- package/src/ui/ProgressCircle/ProgressCircle.spec.ts +12 -0
- package/src/ui/ProgressCircle/ProgressCircle.stories.jsx +14 -0
- package/src/ui/ProgressCircle/ProgressCircle.stories.tsx +14 -0
- package/src/ui/ProgressCircle/ProgressCircle.test.tsx +1 -0
- package/src/ui/ProgressCircle/ProgressCircle.tsx +6 -0
- package/src/ui/ProgressCircle/ProgressCircle.types.ts +3 -0
- package/src/ui/ProgressCircle/index.js +1 -0
- package/src/ui/ProgressIndicator/ProgressIndicator.ai.md +27 -0
- package/src/ui/ProgressIndicator/ProgressIndicator.jsx +92 -0
- package/src/ui/ProgressIndicator/ProgressIndicator.scss +133 -0
- package/src/ui/ProgressIndicator/ProgressIndicator.spec.ts +12 -0
- package/src/ui/ProgressIndicator/ProgressIndicator.stories.jsx +14 -0
- package/src/ui/ProgressIndicator/ProgressIndicator.stories.tsx +14 -0
- package/src/ui/ProgressIndicator/ProgressIndicator.test.tsx +1 -0
- package/src/ui/ProgressIndicator/ProgressIndicator.tsx +6 -0
- package/src/ui/ProgressIndicator/ProgressIndicator.types.ts +3 -0
- package/src/ui/ProgressIndicator/index.js +1 -0
- package/src/ui/Radio/Radio.ai.md +53 -0
- package/src/ui/Radio/Radio.jsx +57 -0
- package/src/ui/Radio/Radio.scss +89 -0
- package/src/ui/Radio/Radio.spec.ts +12 -0
- package/src/ui/Radio/Radio.stories.jsx +14 -0
- package/src/ui/Radio/Radio.stories.tsx +14 -0
- package/src/ui/Radio/Radio.test.tsx +1 -0
- package/src/ui/Radio/Radio.tsx +6 -0
- package/src/ui/Radio/Radio.types.ts +3 -0
- package/src/ui/Radio/index.js +1 -0
- package/src/ui/Slider/Slider.ai.md +33 -0
- package/src/ui/Slider/Slider.jsx +283 -0
- package/src/ui/Slider/Slider.scss +156 -0
- package/src/ui/Slider/Slider.spec.ts +12 -0
- package/src/ui/Slider/Slider.stories.jsx +14 -0
- package/src/ui/Slider/Slider.stories.tsx +14 -0
- package/src/ui/Slider/Slider.test.tsx +1 -0
- package/src/ui/Slider/Slider.tsx +6 -0
- package/src/ui/Slider/Slider.types.ts +3 -0
- package/src/ui/Slider/index.js +1 -0
- package/src/ui/Status/Status.ai.md +36 -0
- package/src/ui/Status/Status.jsx +66 -0
- package/src/ui/Status/Status.scss +90 -0
- package/src/ui/Status/Status.spec.ts +12 -0
- package/src/ui/Status/Status.stories.jsx +14 -0
- package/src/ui/Status/Status.stories.tsx +14 -0
- package/src/ui/Status/Status.test.tsx +1 -0
- package/src/ui/Status/Status.tsx +6 -0
- package/src/ui/Status/Status.types.ts +3 -0
- package/src/ui/Status/index.js +1 -0
- package/src/ui/Steps/Steps.ai.md +56 -0
- package/src/ui/Steps/Steps.jsx +201 -0
- package/src/ui/Steps/Steps.scss +240 -0
- package/src/ui/Steps/Steps.spec.ts +12 -0
- package/src/ui/Steps/Steps.stories.jsx +14 -0
- package/src/ui/Steps/Steps.stories.tsx +14 -0
- package/src/ui/Steps/Steps.test.tsx +1 -0
- package/src/ui/Steps/Steps.tsx +6 -0
- package/src/ui/Steps/Steps.types.ts +3 -0
- package/src/ui/Steps/index.js +1 -0
- package/src/ui/Table/Table.ai.md +108 -0
- package/src/ui/Table/Table.jsx +143 -0
- package/src/ui/Table/Table.scss +90 -0
- package/src/ui/Table/Table.spec.ts +12 -0
- package/src/ui/Table/Table.stories.jsx +14 -0
- package/src/ui/Table/Table.stories.tsx +14 -0
- package/src/ui/Table/Table.test.tsx +1 -0
- package/src/ui/Table/Table.tsx +6 -0
- package/src/ui/Table/Table.types.ts +3 -0
- package/src/ui/Table/index.js +1 -0
- package/src/ui/Tabs/TabItem.jsx +80 -0
- package/src/ui/Tabs/Tabs.ai.md +52 -0
- package/src/ui/Tabs/Tabs.figma.tsx +30 -0
- package/src/ui/Tabs/Tabs.jsx +318 -0
- package/src/ui/Tabs/Tabs.scss +164 -0
- package/src/ui/Tabs/Tabs.spec.ts +12 -0
- package/src/ui/Tabs/Tabs.stories.jsx +18 -0
- package/src/ui/Tabs/Tabs.stories.tsx +14 -0
- package/src/ui/Tabs/Tabs.test.tsx +1 -0
- package/src/ui/Tabs/Tabs.tsx +6 -0
- package/src/ui/Tabs/Tabs.types.ts +3 -0
- package/src/ui/Tabs/index.js +3 -0
- package/src/ui/Tag/Tag.ai.md +59 -0
- package/src/ui/Tag/Tag.figma.tsx +29 -0
- package/src/ui/Tag/Tag.jsx +93 -0
- package/src/ui/Tag/Tag.scss +258 -0
- package/src/ui/Tag/Tag.spec.ts +12 -0
- package/src/ui/Tag/Tag.stories.jsx +14 -0
- package/src/ui/Tag/Tag.stories.tsx +14 -0
- package/src/ui/Tag/Tag.test.tsx +1 -0
- package/src/ui/Tag/Tag.tsx +6 -0
- package/src/ui/Tag/Tag.types.ts +3 -0
- package/src/ui/Tag/index.js +2 -0
- package/src/ui/Textarea/Textarea.ai.md +40 -0
- package/src/ui/Textarea/Textarea.figma.tsx +35 -0
- package/src/ui/Textarea/Textarea.jsx +68 -0
- package/src/ui/Textarea/Textarea.scss +71 -0
- package/src/ui/Textarea/Textarea.spec.ts +12 -0
- package/src/ui/Textarea/Textarea.stories.jsx +14 -0
- package/src/ui/Textarea/Textarea.stories.tsx +14 -0
- package/src/ui/Textarea/Textarea.test.tsx +1 -0
- package/src/ui/Textarea/Textarea.tsx +6 -0
- package/src/ui/Textarea/Textarea.types.ts +3 -0
- package/src/ui/Textarea/index.js +2 -0
- package/src/ui/Toast/Toast.ai.md +47 -0
- package/src/ui/Toast/Toast.jsx +75 -0
- package/src/ui/Toast/Toast.scss +132 -0
- package/src/ui/Toast/Toast.spec.ts +12 -0
- package/src/ui/Toast/Toast.stories.jsx +14 -0
- package/src/ui/Toast/Toast.stories.tsx +14 -0
- package/src/ui/Toast/Toast.test.tsx +1 -0
- package/src/ui/Toast/Toast.tsx +6 -0
- package/src/ui/Toast/Toast.types.ts +3 -0
- package/src/ui/Toast/index.js +2 -0
- package/src/ui/Toggle/Toggle.ai.md +37 -0
- package/src/ui/Toggle/Toggle.jsx +73 -0
- package/src/ui/Toggle/Toggle.scss +139 -0
- package/src/ui/Toggle/Toggle.spec.ts +12 -0
- package/src/ui/Toggle/Toggle.stories.jsx +14 -0
- package/src/ui/Toggle/Toggle.stories.tsx +14 -0
- package/src/ui/Toggle/Toggle.test.tsx +1 -0
- package/src/ui/Toggle/Toggle.tsx +6 -0
- package/src/ui/Toggle/Toggle.types.ts +3 -0
- package/src/ui/Toggle/index.js +1 -0
- package/src/ui/Tooltip/Tooltip.ai.md +33 -0
- package/src/ui/Tooltip/Tooltip.figma.tsx +24 -0
- package/src/ui/Tooltip/Tooltip.jsx +125 -0
- package/src/ui/Tooltip/Tooltip.scss +80 -0
- package/src/ui/Tooltip/Tooltip.spec.ts +12 -0
- package/src/ui/Tooltip/Tooltip.stories.jsx +14 -0
- package/src/ui/Tooltip/Tooltip.stories.tsx +14 -0
- package/src/ui/Tooltip/Tooltip.test.tsx +1 -0
- package/src/ui/Tooltip/Tooltip.tsx +6 -0
- package/src/ui/Tooltip/Tooltip.types.ts +3 -0
- package/src/ui/Tooltip/index.js +2 -0
- package/src/ui/UDS/UDS.jsx +52 -0
- package/src/ui/UDS/UDS.scss +49 -0
- package/src/ui/UDS/UDS.spec.ts +12 -0
- package/src/ui/UDS/UDS.stories.jsx +22 -0
- package/src/ui/UDS/UDS.stories.tsx +14 -0
- package/src/ui/UDS/UDS.test.tsx +1 -0
- package/src/ui/UDS/UDS.tsx +6 -0
- package/src/ui/UDS/UDS.types.ts +3 -0
- package/src/ui/UDS/index.js +1 -0
- package/src/ui/_spec/createMetaFromSpec.ts +35 -0
- package/src/ui/_spec/createStoryArgsFromSpec.ts +8 -0
- package/src/ui/_spec/generated/spec-props-reference.md +55 -0
- package/src/ui/_spec/specStorySync.test.ts +73 -0
- package/src/ui/_spec/types.ts +21 -0
- package/src/ui/index.js +66 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# MicroCalendar
|
|
2
|
+
|
|
3
|
+
Compact inline calendar widget for displaying dates at a glance.
|
|
4
|
+
|
|
5
|
+
## When to Use
|
|
6
|
+
- Compact date display in cards, list items, or dashboards
|
|
7
|
+
- Visual date badge showing month and day
|
|
8
|
+
- Calendar widgets in tight spaces
|
|
9
|
+
|
|
10
|
+
## Props
|
|
11
|
+
|
|
12
|
+
| Prop | Type | Default | Description |
|
|
13
|
+
|------|------|---------|-------------|
|
|
14
|
+
| `date` | `Date\|string` | — | Date to display |
|
|
15
|
+
| `size` | `string` | `"default"` | `"small"`, `"default"`, `"large"` |
|
|
16
|
+
| `color` | `string` | `"blue"` | Accent color |
|
|
17
|
+
| `className` | `string` | `""` | Additional CSS classes |
|
|
18
|
+
|
|
19
|
+
## Examples
|
|
20
|
+
|
|
21
|
+
```jsx
|
|
22
|
+
<MicroCalendar date={new Date()} />
|
|
23
|
+
<MicroCalendar date="2024-03-15" size="small" />
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### In a list item
|
|
27
|
+
```jsx
|
|
28
|
+
<Flex gap="12" alignItems="center">
|
|
29
|
+
<MicroCalendar date={event.date} size="small" />
|
|
30
|
+
<Flex direction="column">
|
|
31
|
+
<strong>{event.title}</strong>
|
|
32
|
+
<span>{event.location}</span>
|
|
33
|
+
</Flex>
|
|
34
|
+
</Flex>
|
|
35
|
+
```
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
import React, { useState, useMemo } from "react";
|
|
2
|
+
import Icon from "../Icon/Icon";
|
|
3
|
+
import Button from "../Button/Button";
|
|
4
|
+
import "./MicroCalendar.scss";
|
|
5
|
+
|
|
6
|
+
const BASE_CLASS = "uds-micro-calendar";
|
|
7
|
+
|
|
8
|
+
const DAYS_OF_WEEK = ["S", "M", "T", "W", "T", "F", "S"];
|
|
9
|
+
const MONTHS = [
|
|
10
|
+
"January",
|
|
11
|
+
"February",
|
|
12
|
+
"March",
|
|
13
|
+
"April",
|
|
14
|
+
"May",
|
|
15
|
+
"June",
|
|
16
|
+
"July",
|
|
17
|
+
"August",
|
|
18
|
+
"September",
|
|
19
|
+
"October",
|
|
20
|
+
"November",
|
|
21
|
+
"December",
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* MicroCalendar component - A compact calendar with expand/collapse functionality
|
|
26
|
+
* @param {Date} value - Selected date (optional)
|
|
27
|
+
* @param {Date} month - Month to display (default: current month)
|
|
28
|
+
* @param {function} onDateSelect - Callback when a date is selected: (date: Date) => void
|
|
29
|
+
* @param {array} unavailableDates - Array of dates that are unavailable
|
|
30
|
+
* @param {object} dateData - Object mapping dates to data (travel, onAssignment)
|
|
31
|
+
* @param {boolean} defaultExpanded - Whether calendar starts expanded (default: true)
|
|
32
|
+
* @param {boolean} showLegend - Whether to show the legend (default: true)
|
|
33
|
+
* @param {boolean} showExpandCollapse - Whether to show the expand/collapse button (default: true)
|
|
34
|
+
* @param {string} className - Additional CSS classes
|
|
35
|
+
* @param {object} props - Additional props
|
|
36
|
+
*/
|
|
37
|
+
export default function MicroCalendar({
|
|
38
|
+
value,
|
|
39
|
+
month,
|
|
40
|
+
onDateSelect,
|
|
41
|
+
unavailableDates = [],
|
|
42
|
+
dateData = {},
|
|
43
|
+
defaultExpanded = true,
|
|
44
|
+
showLegend = true,
|
|
45
|
+
showExpandCollapse = true,
|
|
46
|
+
className = "",
|
|
47
|
+
...props
|
|
48
|
+
}) {
|
|
49
|
+
const [currentMonth, setCurrentMonth] = useState(month || new Date());
|
|
50
|
+
const [isExpanded, setIsExpanded] = useState(defaultExpanded);
|
|
51
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
52
|
+
const today = useMemo(() => { const d = new Date(); d.setHours(0, 0, 0, 0); return d; }, []);
|
|
53
|
+
|
|
54
|
+
const year = currentMonth.getFullYear();
|
|
55
|
+
const monthIndex = currentMonth.getMonth();
|
|
56
|
+
|
|
57
|
+
// Get first day of month and number of days
|
|
58
|
+
const firstDay = new Date(year, monthIndex, 1);
|
|
59
|
+
const lastDay = new Date(year, monthIndex + 1, 0);
|
|
60
|
+
const daysInMonth = lastDay.getDate();
|
|
61
|
+
const startingDayOfWeek = firstDay.getDay();
|
|
62
|
+
|
|
63
|
+
// Generate calendar days
|
|
64
|
+
const calendarDays = useMemo(() => {
|
|
65
|
+
const days = [];
|
|
66
|
+
|
|
67
|
+
// Add empty cells for days before month starts
|
|
68
|
+
for (let i = 0; i < startingDayOfWeek; i++) {
|
|
69
|
+
days.push(null);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Add days of the month
|
|
73
|
+
for (let day = 1; day <= daysInMonth; day++) {
|
|
74
|
+
const date = new Date(year, monthIndex, day);
|
|
75
|
+
date.setHours(0, 0, 0, 0);
|
|
76
|
+
days.push(date);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return days;
|
|
80
|
+
}, [year, monthIndex, startingDayOfWeek, daysInMonth]);
|
|
81
|
+
|
|
82
|
+
const isToday = (date) => {
|
|
83
|
+
if (!date) return false;
|
|
84
|
+
return date.getTime() === today.getTime();
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const isSelected = (date) => {
|
|
88
|
+
if (!date) return false;
|
|
89
|
+
if (value) {
|
|
90
|
+
const selectedDate = new Date(value);
|
|
91
|
+
selectedDate.setHours(0, 0, 0, 0);
|
|
92
|
+
return date.getTime() === selectedDate.getTime();
|
|
93
|
+
}
|
|
94
|
+
return false;
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const isUnavailable = (date) => {
|
|
98
|
+
if (!date) return false;
|
|
99
|
+
return unavailableDates.some((unavail) => {
|
|
100
|
+
const unavailDate = new Date(unavail);
|
|
101
|
+
unavailDate.setHours(0, 0, 0, 0);
|
|
102
|
+
return date.getTime() === unavailDate.getTime();
|
|
103
|
+
});
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const getDateData = (date) => {
|
|
107
|
+
if (!date) return null;
|
|
108
|
+
const dateKey = date.toISOString().split("T")[0];
|
|
109
|
+
return dateData[dateKey] || null;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
// Check if a date is the first day of a string of on-assignment days
|
|
113
|
+
const isFirstOnAssignmentDay = (date, dateIndex) => {
|
|
114
|
+
if (!date || !getDateData(date)?.onAssignment) return false;
|
|
115
|
+
|
|
116
|
+
// Check previous day in calendar
|
|
117
|
+
if (dateIndex > 0) {
|
|
118
|
+
const prevDate = calendarDays[dateIndex - 1];
|
|
119
|
+
if (prevDate && getDateData(prevDate)?.onAssignment) {
|
|
120
|
+
return false; // Previous day also has onAssignment
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return true; // This is the first day
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
// Check if a date is the last day of a string of on-assignment days
|
|
127
|
+
const isLastOnAssignmentDay = (date, dateIndex) => {
|
|
128
|
+
if (!date || !getDateData(date)?.onAssignment) return false;
|
|
129
|
+
|
|
130
|
+
// Check next day in calendar
|
|
131
|
+
if (dateIndex < calendarDays.length - 1) {
|
|
132
|
+
const nextDate = calendarDays[dateIndex + 1];
|
|
133
|
+
if (nextDate && getDateData(nextDate)?.onAssignment) {
|
|
134
|
+
return false; // Next day also has onAssignment
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return true; // This is the last day
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
const handleDateClick = (date) => {
|
|
141
|
+
if (date && !isUnavailable(date) && onDateSelect) {
|
|
142
|
+
onDateSelect(date);
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
const handlePrevMonth = () => {
|
|
147
|
+
setCurrentMonth(new Date(year, monthIndex - 1, 1));
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
const handleNextMonth = () => {
|
|
151
|
+
setCurrentMonth(new Date(year, monthIndex + 1, 1));
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
const toggleExpand = () => {
|
|
155
|
+
setIsExpanded(!isExpanded);
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
// Check if we're viewing the current month
|
|
159
|
+
const isCurrentMonth = useMemo(() => {
|
|
160
|
+
const todayMonth = today.getMonth();
|
|
161
|
+
const todayYear = today.getFullYear();
|
|
162
|
+
return monthIndex === todayMonth && year === todayYear;
|
|
163
|
+
}, [monthIndex, year, today]);
|
|
164
|
+
|
|
165
|
+
// Calculate which week to show when collapsed
|
|
166
|
+
const weekOffset = useMemo(() => {
|
|
167
|
+
if (isExpanded) return 0;
|
|
168
|
+
|
|
169
|
+
// If not viewing current month, always show first week
|
|
170
|
+
if (!isCurrentMonth) {
|
|
171
|
+
return 0;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Find the index of today in the calendar
|
|
175
|
+
const todayIndex = calendarDays.findIndex((date) => {
|
|
176
|
+
if (!date) return false;
|
|
177
|
+
return date.getTime() === today.getTime();
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
// If today is not in the current month's calendar, show first week
|
|
181
|
+
if (todayIndex === -1) {
|
|
182
|
+
return 0;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Find the start of the week (Sunday = 0)
|
|
186
|
+
const weekStartIndex = Math.floor(todayIndex / 7) * 7;
|
|
187
|
+
return weekStartIndex / 7; // Convert to week number (0-based)
|
|
188
|
+
}, [isExpanded, calendarDays, today, isCurrentMonth]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
// Always show all days, we'll use transform to slide to the correct week when collapsed
|
|
192
|
+
const visibleDays = calendarDays;
|
|
193
|
+
|
|
194
|
+
// Calculate the number of weeks in the month for height adjustment
|
|
195
|
+
const numberOfWeeks = useMemo(() => {
|
|
196
|
+
return Math.ceil(calendarDays.length / 7);
|
|
197
|
+
}, [calendarDays]);
|
|
198
|
+
|
|
199
|
+
const classNames = [BASE_CLASS, className].filter(Boolean).join(" ");
|
|
200
|
+
|
|
201
|
+
return (
|
|
202
|
+
<div className={classNames} {...props}>
|
|
203
|
+
{/* Header */}
|
|
204
|
+
<div className={`${BASE_CLASS}__header`}>
|
|
205
|
+
<Button icon="ArrowLeft" size="small" appearance="text" onClick={handlePrevMonth} aria-label="Previous month" />
|
|
206
|
+
<h3 className={`${BASE_CLASS}__title`}>
|
|
207
|
+
{MONTHS[monthIndex]} {year}
|
|
208
|
+
</h3>
|
|
209
|
+
<Button icon="ArrowRight" size="small" appearance="text" onClick={handleNextMonth} aria-label="Next month" />
|
|
210
|
+
</div>
|
|
211
|
+
|
|
212
|
+
{/* Weekday Header */}
|
|
213
|
+
<div className={`${BASE_CLASS}__weekdays`}>
|
|
214
|
+
{DAYS_OF_WEEK.map((day, index) => (
|
|
215
|
+
<div key={index} className={`${BASE_CLASS}__weekday`}>
|
|
216
|
+
{day}
|
|
217
|
+
</div>
|
|
218
|
+
))}
|
|
219
|
+
</div>
|
|
220
|
+
|
|
221
|
+
{/* Calendar Grid */}
|
|
222
|
+
<div
|
|
223
|
+
key={`grid-${year}-${monthIndex}`}
|
|
224
|
+
className={`${BASE_CLASS}__grid-wrapper ${isExpanded ? `${BASE_CLASS}__grid-wrapper--expanded` : `${BASE_CLASS}__grid-wrapper--collapsed}`}`}
|
|
225
|
+
style={isExpanded ? { height: `${numberOfWeeks * 64.3}px` } : {}}
|
|
226
|
+
>
|
|
227
|
+
<div
|
|
228
|
+
className={`${BASE_CLASS}__grid`}
|
|
229
|
+
style={{
|
|
230
|
+
transform: !isExpanded
|
|
231
|
+
? weekOffset === 0
|
|
232
|
+
? 'translateY(0px)'
|
|
233
|
+
: `translateY(-${weekOffset * 64.3 - 1}px)`
|
|
234
|
+
: 'translateY(0px)'
|
|
235
|
+
}}
|
|
236
|
+
>
|
|
237
|
+
{visibleDays.map((date, index) => {
|
|
238
|
+
if (!date) {
|
|
239
|
+
return (
|
|
240
|
+
<div
|
|
241
|
+
key={`empty-${index}`}
|
|
242
|
+
className={`${BASE_CLASS}__day ${BASE_CLASS}__day--empty`}
|
|
243
|
+
/>
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
const dateInfo = getDateData(date);
|
|
248
|
+
const travel = dateInfo?.travel || false;
|
|
249
|
+
const onAssignment = dateInfo?.onAssignment || false;
|
|
250
|
+
const unavailable = isUnavailable(date);
|
|
251
|
+
const today = isToday(date);
|
|
252
|
+
const selected = isSelected(date);
|
|
253
|
+
|
|
254
|
+
// Determine if this is first or last day of on-assignment string
|
|
255
|
+
const firstOnAssignment = isFirstOnAssignmentDay(date, index);
|
|
256
|
+
const lastOnAssignment = isLastOnAssignmentDay(date, index);
|
|
257
|
+
|
|
258
|
+
// Determine icon order based on rules:
|
|
259
|
+
// - First day of on-assignment string with travel: travel comes first
|
|
260
|
+
// - Last day of on-assignment string with both: on-assignment comes first
|
|
261
|
+
// - Default: travel first, then on-assignment
|
|
262
|
+
// eslint-disable-next-line no-unused-vars
|
|
263
|
+
const showTravelFirst = firstOnAssignment && travel && onAssignment;
|
|
264
|
+
const showAssignmentFirst = lastOnAssignment && travel && onAssignment;
|
|
265
|
+
|
|
266
|
+
let dayState = "available";
|
|
267
|
+
if (unavailable) {
|
|
268
|
+
dayState = "unavailable";
|
|
269
|
+
} else if (selected) {
|
|
270
|
+
dayState = "selected";
|
|
271
|
+
} else if (onAssignment && !travel) {
|
|
272
|
+
dayState = "on-assignment";
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
return (
|
|
276
|
+
<button
|
|
277
|
+
key={date.toISOString()}
|
|
278
|
+
type="button"
|
|
279
|
+
className={[
|
|
280
|
+
`${BASE_CLASS}__day`,
|
|
281
|
+
`${BASE_CLASS}__day--${dayState}`,
|
|
282
|
+
today && `${BASE_CLASS}__day--today`,
|
|
283
|
+
]
|
|
284
|
+
.filter(Boolean)
|
|
285
|
+
.join(" ")}
|
|
286
|
+
onClick={() => handleDateClick(date)}
|
|
287
|
+
disabled={unavailable}
|
|
288
|
+
aria-label={`${date.getDate()} ${MONTHS[monthIndex]} ${year}`}
|
|
289
|
+
>
|
|
290
|
+
<span className={`${BASE_CLASS}__day-number`}>
|
|
291
|
+
{date.getDate()}
|
|
292
|
+
</span>
|
|
293
|
+
{unavailable && (
|
|
294
|
+
<span className={`${BASE_CLASS}__day-unavailable-line`} />
|
|
295
|
+
)}
|
|
296
|
+
{(travel || onAssignment) && (
|
|
297
|
+
<div className={`${BASE_CLASS}__icons`}>
|
|
298
|
+
{showAssignmentFirst ? (
|
|
299
|
+
// Last day: on-assignment first, then travel
|
|
300
|
+
<>
|
|
301
|
+
{onAssignment && (
|
|
302
|
+
<span className={`${BASE_CLASS}__icon ${BASE_CLASS}__icon--assignment`}>
|
|
303
|
+
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
304
|
+
<circle cx="8" cy="8" r="7.5" fill="#DBEAFF" stroke="#1D4ED7"/>
|
|
305
|
+
</svg>
|
|
306
|
+
</span>
|
|
307
|
+
)}
|
|
308
|
+
{travel && (
|
|
309
|
+
<span className={`${BASE_CLASS}__icon ${BASE_CLASS}__icon--travel`}>
|
|
310
|
+
<svg width="19" height="16" viewBox="0 0 19 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
311
|
+
<path d="M17.5791 15.4736H0.865265L9.22171 1L17.5791 15.4736Z" fill="#DCFCE7" stroke="#157F3D"/>
|
|
312
|
+
</svg>
|
|
313
|
+
</span>
|
|
314
|
+
)}
|
|
315
|
+
</>
|
|
316
|
+
) : (
|
|
317
|
+
// First day or default: travel first, then on-assignment
|
|
318
|
+
<>
|
|
319
|
+
{travel && (
|
|
320
|
+
<span className={`${BASE_CLASS}__icon ${BASE_CLASS}__icon--travel`}>
|
|
321
|
+
<svg width="19" height="16" viewBox="0 0 19 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
322
|
+
<path d="M17.5791 15.4736H0.865265L9.22171 1L17.5791 15.4736Z" fill="#DCFCE7" stroke="#157F3D"/>
|
|
323
|
+
</svg>
|
|
324
|
+
</span>
|
|
325
|
+
)}
|
|
326
|
+
{onAssignment && (
|
|
327
|
+
<span className={`${BASE_CLASS}__icon ${BASE_CLASS}__icon--assignment`}>
|
|
328
|
+
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
329
|
+
<circle cx="8" cy="8" r="7.5" fill="#DBEAFF" stroke="#1D4ED7"/>
|
|
330
|
+
</svg>
|
|
331
|
+
</span>
|
|
332
|
+
)}
|
|
333
|
+
</>
|
|
334
|
+
)}
|
|
335
|
+
</div>
|
|
336
|
+
)}
|
|
337
|
+
</button>
|
|
338
|
+
);
|
|
339
|
+
})}
|
|
340
|
+
</div>
|
|
341
|
+
</div>
|
|
342
|
+
|
|
343
|
+
{/* Legend */}
|
|
344
|
+
{showLegend && isExpanded && (
|
|
345
|
+
<div className={`${BASE_CLASS}__legend`}>
|
|
346
|
+
<div className={`${BASE_CLASS}__legend-column`}>
|
|
347
|
+
<div className={`${BASE_CLASS}__legend-item`}>
|
|
348
|
+
<div className={`${BASE_CLASS}__legend-square ${BASE_CLASS}__legend-square--available`}>
|
|
349
|
+
</div>
|
|
350
|
+
<span className={`${BASE_CLASS}__legend-label`}>Available</span>
|
|
351
|
+
</div>
|
|
352
|
+
<div className={`${BASE_CLASS}__legend-item`}>
|
|
353
|
+
<div className={`${BASE_CLASS}__legend-square ${BASE_CLASS}__legend-square--unavailable`}>
|
|
354
|
+
<span className={`${BASE_CLASS}__legend-unavailable-line`} />
|
|
355
|
+
</div>
|
|
356
|
+
<span className={`${BASE_CLASS}__legend-label`}>Unavailable</span>
|
|
357
|
+
</div>
|
|
358
|
+
</div>
|
|
359
|
+
<div className={`${BASE_CLASS}__legend-column`}>
|
|
360
|
+
<div className={`${BASE_CLASS}__legend-item`}>
|
|
361
|
+
<div className={`${BASE_CLASS}__legend-square ${BASE_CLASS}__legend-square--assignment`}>
|
|
362
|
+
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" className={`${BASE_CLASS}__legend-icon ${BASE_CLASS}__legend-icon--assignment`}>
|
|
363
|
+
<circle cx="8" cy="8" r="7.5" fill="#DBEAFF" stroke="#1D4ED7"/>
|
|
364
|
+
</svg>
|
|
365
|
+
</div>
|
|
366
|
+
<span className={`${BASE_CLASS}__legend-label`}>On Assignment</span>
|
|
367
|
+
</div>
|
|
368
|
+
<div className={`${BASE_CLASS}__legend-item`}>
|
|
369
|
+
<div className={`${BASE_CLASS}__legend-square ${BASE_CLASS}__legend-square--available`}>
|
|
370
|
+
<svg width="19" height="16" viewBox="0 0 19 16" fill="none" xmlns="http://www.w3.org/2000/svg" className={`${BASE_CLASS}__legend-icon`}>
|
|
371
|
+
<path d="M17.5791 15.4736H0.865265L9.22171 1L17.5791 15.4736Z" fill="#DCFCE7" stroke="#157F3D"/>
|
|
372
|
+
</svg>
|
|
373
|
+
</div>
|
|
374
|
+
<span className={`${BASE_CLASS}__legend-label`}>Travel</span>
|
|
375
|
+
</div>
|
|
376
|
+
</div>
|
|
377
|
+
</div>
|
|
378
|
+
)}
|
|
379
|
+
|
|
380
|
+
{/* Expand/Collapse Button */}
|
|
381
|
+
{showExpandCollapse && (
|
|
382
|
+
<button
|
|
383
|
+
type="button"
|
|
384
|
+
className={`${BASE_CLASS}__toggle`}
|
|
385
|
+
onClick={toggleExpand}
|
|
386
|
+
aria-label={isExpanded ? "Collapse calendar" : "Expand calendar"}
|
|
387
|
+
>
|
|
388
|
+
<Icon name={isExpanded ? "CaretUp" : "CaretDown"} size={16} />
|
|
389
|
+
</button>
|
|
390
|
+
)}
|
|
391
|
+
</div>
|
|
392
|
+
);
|
|
393
|
+
}
|