├── packages ├── actify │ ├── src │ │ ├── themes │ │ │ └── index.ts │ │ ├── utils │ │ │ └── index.ts │ │ ├── components │ │ │ ├── Cards │ │ │ │ ├── index.ts │ │ │ │ ├── card.module.css │ │ │ │ └── Card.tsx │ │ │ ├── Icon │ │ │ │ ├── index.ts │ │ │ │ ├── icon.module.css │ │ │ │ └── Icon.tsx │ │ │ ├── Label │ │ │ │ ├── index.ts │ │ │ │ └── Label.tsx │ │ │ ├── Modal │ │ │ │ ├── index.ts │ │ │ │ ├── modal.module.css │ │ │ │ └── Modal.tsx │ │ │ ├── Text │ │ │ │ ├── index.ts │ │ │ │ └── Text.tsx │ │ │ ├── Avatar │ │ │ │ ├── index.ts │ │ │ │ └── Avatar.tsx │ │ │ ├── Badges │ │ │ │ ├── index.tsx │ │ │ │ ├── badges.module.css │ │ │ │ └── Badges.tsx │ │ │ ├── Divider │ │ │ │ ├── index.ts │ │ │ │ ├── divider.module.css │ │ │ │ └── Divider.tsx │ │ │ ├── Popover │ │ │ │ ├── index.ts │ │ │ │ └── popover.module.css │ │ │ ├── Ripple │ │ │ │ ├── index.ts │ │ │ │ └── ripple.module.css │ │ │ ├── Sliders │ │ │ │ └── index.ts │ │ │ ├── Spacer │ │ │ │ ├── index.ts │ │ │ │ └── Spacer.tsx │ │ │ ├── Switch │ │ │ │ └── index.ts │ │ │ ├── Terminal │ │ │ │ └── index.ts │ │ │ ├── Elevation │ │ │ │ ├── index.ts │ │ │ │ └── Elevation.tsx │ │ │ ├── FocusRing │ │ │ │ ├── index.ts │ │ │ │ └── FocusRing.tsx │ │ │ ├── Item │ │ │ │ ├── index.ts │ │ │ │ └── Item.tsx │ │ │ ├── TextFields │ │ │ │ └── index.ts │ │ │ ├── TopAppBar │ │ │ │ └── index.ts │ │ │ ├── BeforeAfter │ │ │ │ └── index.ts │ │ │ ├── NavigationBar │ │ │ │ ├── index.ts │ │ │ │ ├── navigation-bar.module.css │ │ │ │ └── NavigationBar.tsx │ │ │ ├── LinearProgress │ │ │ │ └── index.ts │ │ │ ├── NavigationRail │ │ │ │ ├── index.ts │ │ │ │ └── navigation-rail.module.css │ │ │ ├── Select │ │ │ │ ├── SelectOption.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── trailingIcon.module.css │ │ │ │ ├── TrailingIcon.tsx │ │ │ │ └── OutlinedField.tsx │ │ │ ├── VisuallyHidden │ │ │ │ ├── index.ts │ │ │ │ ├── visually-hidden.module.css │ │ │ │ └── VisuallyHidden.tsx │ │ │ ├── CircularProgress │ │ │ │ └── index.ts │ │ │ ├── Radio │ │ │ │ ├── index.ts │ │ │ │ └── radio-group.module.css │ │ │ ├── Slot │ │ │ │ └── index.ts │ │ │ ├── Swiper │ │ │ │ ├── index.ts │ │ │ │ ├── SwiperItem.tsx │ │ │ │ └── swiper.module.css │ │ │ ├── Tabs │ │ │ │ ├── index.ts │ │ │ │ ├── TabPanel.tsx │ │ │ │ ├── Tab.tsx │ │ │ │ └── tabs.module.css │ │ │ ├── Carousel │ │ │ │ ├── index.ts │ │ │ │ ├── carousel.module.css │ │ │ │ ├── carousel-control.module.css │ │ │ │ ├── CarouselItem.tsx │ │ │ │ ├── CarouselIndicator.tsx │ │ │ │ ├── carousel-indicator.module.css │ │ │ │ └── Carousel.tsx │ │ │ ├── ListBox │ │ │ │ ├── index.ts │ │ │ │ ├── listbox.module.css │ │ │ │ ├── ListBox.tsx │ │ │ │ └── ListBoxOption.tsx │ │ │ ├── Checkbox │ │ │ │ ├── index.ts │ │ │ │ ├── checkbox-group.module.css │ │ │ │ └── CheckboxGroup.tsx │ │ │ ├── Field │ │ │ │ ├── index.ts │ │ │ │ ├── styles │ │ │ │ │ └── supporting.module.css │ │ │ │ ├── FilledField.tsx │ │ │ │ ├── OutlinedField.tsx │ │ │ │ └── SupportingText.tsx │ │ │ ├── PopoverMenu │ │ │ │ ├── index.ts │ │ │ │ └── PopoverMenuItem.tsx │ │ │ ├── Autocomplete │ │ │ │ ├── index.ts │ │ │ │ └── autocomplete.module.css │ │ │ ├── Snackbar │ │ │ │ ├── index.ts │ │ │ │ ├── ToastProvider.tsx │ │ │ │ ├── ToastRegion.tsx │ │ │ │ ├── toast.module.css │ │ │ │ └── Toast.tsx │ │ │ ├── ActionMenu │ │ │ │ ├── index.ts │ │ │ │ ├── MenuItems.tsx │ │ │ │ └── Menu.tsx │ │ │ ├── Chips │ │ │ │ ├── index.ts │ │ │ │ ├── chip-group.module.css │ │ │ │ └── ChipGroup.tsx │ │ │ ├── Lists │ │ │ │ ├── index.ts │ │ │ │ ├── list.module.css │ │ │ │ ├── ListContext.tsx │ │ │ │ ├── list-item.module.css │ │ │ │ ├── List.tsx │ │ │ │ └── list-group.module.css │ │ │ ├── SegmentedButton │ │ │ │ ├── index.ts │ │ │ │ └── SegmentedButtonSet.tsx │ │ │ ├── Buttons │ │ │ │ ├── index.ts │ │ │ │ ├── styles │ │ │ │ │ └── color.module.css │ │ │ │ ├── icon-button.module.css │ │ │ │ ├── fab.module.css │ │ │ │ └── IconButton.tsx │ │ │ ├── Pagination │ │ │ │ ├── index.ts │ │ │ │ ├── PaginationNumber.tsx │ │ │ │ ├── pagination.module.css │ │ │ │ └── generatePagination.ts │ │ │ ├── BottomAppBar │ │ │ │ ├── index.ts │ │ │ │ ├── BottomAppBarFab.tsx │ │ │ │ ├── BottomAppBarIcons.tsx │ │ │ │ ├── BottomAppBar.tsx │ │ │ │ └── bottom-app-bar.module.css │ │ │ ├── Dialogs │ │ │ │ ├── index.ts │ │ │ │ ├── Dialog.tsx │ │ │ │ └── DialogActivator.tsx │ │ │ ├── NavigationDrawer │ │ │ │ ├── index.ts │ │ │ │ ├── NavigationDrawer.tsx │ │ │ │ ├── DrawerActivator.tsx │ │ │ │ └── DrawerContext.tsx │ │ │ ├── BottomSheets │ │ │ │ ├── index.ts │ │ │ │ ├── BottomSheets.tsx │ │ │ │ ├── BottomSheetsActivator.tsx │ │ │ │ └── BottomSheetsContext.tsx │ │ │ ├── Table │ │ │ │ ├── index.ts │ │ │ │ ├── TableHeader.tsx │ │ │ │ ├── TableHeaderRow.tsx │ │ │ │ ├── TableRowGroup.tsx │ │ │ │ ├── TableCheckboxCell.tsx │ │ │ │ ├── TableCell.tsx │ │ │ │ ├── TableSelectAllCell.tsx │ │ │ │ └── table.module.css │ │ │ ├── Tooltips │ │ │ │ ├── index.ts │ │ │ │ ├── TooltipGroup.tsx │ │ │ │ └── TooltipTrigger.tsx │ │ │ ├── Menus │ │ │ │ ├── index.ts │ │ │ │ ├── Submenu.tsx │ │ │ │ ├── Menu.tsx │ │ │ │ ├── ListBox.tsx │ │ │ │ ├── listbox.module.css │ │ │ │ ├── ListBoxItem.tsx │ │ │ │ ├── menu-popover.module.css │ │ │ │ └── MenuButton.tsx │ │ │ ├── Accordion │ │ │ │ ├── index.ts │ │ │ │ ├── accordion.module.css │ │ │ │ ├── AccordionItem.tsx │ │ │ │ ├── AccordionContext.tsx │ │ │ │ ├── Accordion.tsx │ │ │ │ └── AccordionContent.tsx │ │ │ └── SideSheets │ │ │ │ ├── SideSheetsAction.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── SideSheets.tsx │ │ │ │ ├── SideSheetsBody.tsx │ │ │ │ ├── SideSheetsHeader.tsx │ │ │ │ ├── SideSheetsActivator.tsx │ │ │ │ └── SideSheetsContext.tsx │ │ ├── css-module.d.ts │ │ ├── hooks │ │ │ ├── useDebounce.ts │ │ │ ├── useResizeObserver.tsx │ │ │ ├── index.ts │ │ │ ├── usePrevious.ts │ │ │ ├── useAttachable.ts │ │ │ ├── useInterval.ts │ │ │ ├── mergeRefs.tsx │ │ │ ├── useOnClickOutside.ts │ │ │ └── useControllable.ts │ │ └── animations │ │ │ └── index.ts │ ├── tsconfig.rollup.json │ └── tsconfig.json └── create-actify │ ├── package.json │ └── index.ts ├── .npmrc ├── vercel.json ├── apps └── docs │ ├── content │ ├── getting-started │ │ ├── theme.md │ │ ├── icons.md │ │ └── why-actify.md │ └── components │ │ ├── dialogs.md │ │ ├── swiper.md │ │ ├── avatar.md │ │ ├── time-pickers.md │ │ ├── snackbar.md │ │ ├── buttons │ │ ├── icon-button.md │ │ ├── fab.md │ │ └── segmented-button.md │ │ ├── ripple.md │ │ ├── navigation │ │ ├── navigation-bar.md │ │ ├── navigation-rail.md │ │ └── navigation-drawer.md │ │ ├── app-bars │ │ ├── top-app-bar.md │ │ └── bottom-app-bar.md │ │ ├── autocomplete.md │ │ ├── label.md │ │ ├── badges.md │ │ ├── sheets │ │ ├── bottom-sheets.md │ │ └── side-sheets.md │ │ ├── chips.md │ │ ├── pagination.md │ │ ├── divider.md │ │ ├── terminal.md │ │ ├── accordion.md │ │ ├── tabs.md │ │ ├── progress │ │ ├── linear-progress.md │ │ └── circular-progress.md │ │ ├── radio.md │ │ ├── lists.md │ │ ├── cards.md │ │ ├── before-after.md │ │ ├── focus-ring.md │ │ ├── sliders.md │ │ ├── carousel.md │ │ ├── checkbox.md │ │ └── date-pickers.md │ ├── public │ ├── favicon.ico │ ├── images │ │ ├── after.png │ │ └── before.jpg │ ├── short-cut-icon.png │ ├── apple-touch-icon.png │ ├── icons │ │ ├── icon-48x48.png │ │ ├── icon-72x72.png │ │ ├── icon-96x96.png │ │ ├── icon-128x128.png │ │ ├── icon-144x144.png │ │ ├── icon-152x152.png │ │ ├── icon-192x192.png │ │ └── icon-512x512.png │ └── actify.svg │ ├── postcss.config.mjs │ ├── src │ ├── usages │ │ ├── avatar.tsx │ │ ├── before-after.tsx │ │ ├── terminal.tsx │ │ ├── tooltips.tsx │ │ ├── app-bars │ │ │ ├── top-app-bar.tsx │ │ │ └── bottom-app-bar.tsx │ │ ├── divider.tsx │ │ ├── pagination.tsx │ │ ├── lists.tsx │ │ ├── snackbar.tsx │ │ ├── navigation │ │ │ ├── navigation-rail.tsx │ │ │ └── navigation-bar.tsx │ │ ├── sheets │ │ │ ├── bottom-sheets.tsx │ │ │ └── side-sheets.tsx │ │ ├── sliders.tsx │ │ ├── ripple.tsx │ │ ├── autocomplete.tsx │ │ ├── focus-ring.tsx │ │ ├── buttons │ │ │ ├── icon-button.tsx │ │ │ └── fab.tsx │ │ ├── badges.tsx │ │ ├── radio.tsx │ │ ├── switch.tsx │ │ ├── text-fields.tsx │ │ ├── swiper.tsx │ │ ├── progress │ │ │ ├── circular-progress.tsx │ │ │ └── linear-progress.tsx │ │ ├── dialogs.tsx │ │ ├── menus.tsx │ │ └── carousel.tsx │ ├── utils │ │ └── cn.ts │ ├── lib │ │ ├── raw.ts │ │ └── doc.ts │ ├── hooks │ │ ├── useMounted.ts │ │ └── useAutoTheme.ts │ ├── app │ │ ├── fonts.ts │ │ ├── layout.tsx │ │ ├── template.tsx │ │ └── (docs) │ │ │ ├── layout.tsx │ │ │ └── [...slug] │ │ │ └── page.tsx │ └── components │ │ ├── App.tsx │ │ ├── EditOnGitHub.tsx │ │ ├── NavLink.tsx │ │ ├── AppDrawer.tsx │ │ ├── Logo.tsx │ │ ├── GettingStarted.tsx │ │ ├── Sponsors.tsx │ │ └── Dropdown.tsx │ ├── next.config.mjs │ ├── .gitignore │ ├── tsconfig.json │ └── package.json ├── .prettierrc ├── .github └── ISSUE_TEMPLATE │ ├── custom.md │ ├── feature_request.md │ └── bug_report.md ├── pnpm-workspace.yaml ├── .gitignore ├── package.json ├── todo.md ├── turbo.json ├── biome.json └── LICENSE.md /packages/actify/src/themes/index.ts: -------------------------------------------------------------------------------- 1 | export {} 2 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | auto-install-peers = true 2 | node-linker=hoisted -------------------------------------------------------------------------------- /packages/actify/src/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './utils' 2 | -------------------------------------------------------------------------------- /packages/actify/src/components/Cards/index.ts: -------------------------------------------------------------------------------- 1 | export { Card } from './Card' 2 | -------------------------------------------------------------------------------- /packages/actify/src/components/Icon/index.ts: -------------------------------------------------------------------------------- 1 | export { Icon } from './Icon' 2 | -------------------------------------------------------------------------------- /packages/actify/src/components/Label/index.ts: -------------------------------------------------------------------------------- 1 | export { Label } from './Label' 2 | -------------------------------------------------------------------------------- /packages/actify/src/components/Modal/index.ts: -------------------------------------------------------------------------------- 1 | export { Modal } from './Modal' 2 | -------------------------------------------------------------------------------- /packages/actify/src/components/Text/index.ts: -------------------------------------------------------------------------------- 1 | export { Text } from './Text' 2 | -------------------------------------------------------------------------------- /packages/actify/src/components/Avatar/index.ts: -------------------------------------------------------------------------------- 1 | export { Avatar } from './Avatar' 2 | -------------------------------------------------------------------------------- /packages/actify/src/components/Badges/index.tsx: -------------------------------------------------------------------------------- 1 | export { Badge } from './Badges' 2 | -------------------------------------------------------------------------------- /packages/actify/src/components/Divider/index.ts: -------------------------------------------------------------------------------- 1 | export { Divider } from './Divider' 2 | -------------------------------------------------------------------------------- /packages/actify/src/components/Popover/index.ts: -------------------------------------------------------------------------------- 1 | export { Popover } from './Popover' 2 | -------------------------------------------------------------------------------- /packages/actify/src/components/Ripple/index.ts: -------------------------------------------------------------------------------- 1 | export { Ripple } from './Ripple' 2 | -------------------------------------------------------------------------------- /packages/actify/src/components/Sliders/index.ts: -------------------------------------------------------------------------------- 1 | export { Slider } from './Slider' 2 | -------------------------------------------------------------------------------- /packages/actify/src/components/Spacer/index.ts: -------------------------------------------------------------------------------- 1 | export { Spacer } from './Spacer' 2 | -------------------------------------------------------------------------------- /packages/actify/src/components/Switch/index.ts: -------------------------------------------------------------------------------- 1 | export { Switch } from './Switch' 2 | -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "rewrites": [{ "source": "/(.*)", "destination": "/" }] 3 | } 4 | -------------------------------------------------------------------------------- /packages/actify/src/components/Terminal/index.ts: -------------------------------------------------------------------------------- 1 | export { Terminal } from './Terminal' 2 | -------------------------------------------------------------------------------- /packages/actify/src/components/Elevation/index.ts: -------------------------------------------------------------------------------- 1 | export { Elevation } from './Elevation' 2 | -------------------------------------------------------------------------------- /packages/actify/src/components/FocusRing/index.ts: -------------------------------------------------------------------------------- 1 | export { FocusRing } from './FocusRing' 2 | -------------------------------------------------------------------------------- /packages/actify/src/components/Item/index.ts: -------------------------------------------------------------------------------- 1 | export { Item, type ItemProps } from './Item' 2 | -------------------------------------------------------------------------------- /packages/actify/src/components/TextFields/index.ts: -------------------------------------------------------------------------------- 1 | export { TextField } from './TextField' 2 | -------------------------------------------------------------------------------- /packages/actify/src/components/TopAppBar/index.ts: -------------------------------------------------------------------------------- 1 | export { TopAppBar } from './TopAppBar' 2 | -------------------------------------------------------------------------------- /packages/actify/src/components/BeforeAfter/index.ts: -------------------------------------------------------------------------------- 1 | export { BeforeAfter } from './BeforeAfter' 2 | -------------------------------------------------------------------------------- /apps/docs/content/getting-started/theme.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Theme 3 | --- 4 | 5 | 6 | -------------------------------------------------------------------------------- /apps/docs/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actifyjs/actify/HEAD/apps/docs/public/favicon.ico -------------------------------------------------------------------------------- /packages/actify/src/components/NavigationBar/index.ts: -------------------------------------------------------------------------------- 1 | export { NavigationBar } from './NavigationBar' 2 | -------------------------------------------------------------------------------- /packages/actify/src/components/LinearProgress/index.ts: -------------------------------------------------------------------------------- 1 | export { LinearProgress } from './LinearProgress' 2 | -------------------------------------------------------------------------------- /packages/actify/src/components/NavigationRail/index.ts: -------------------------------------------------------------------------------- 1 | export { NavigationRail } from './NavigationRail' 2 | -------------------------------------------------------------------------------- /packages/actify/src/components/Select/SelectOption.tsx: -------------------------------------------------------------------------------- 1 | export { Item as SelectOption } from 'react-stately' 2 | -------------------------------------------------------------------------------- /packages/actify/src/components/VisuallyHidden/index.ts: -------------------------------------------------------------------------------- 1 | export { VisuallyHidden } from './VisuallyHidden' 2 | -------------------------------------------------------------------------------- /apps/docs/public/images/after.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actifyjs/actify/HEAD/apps/docs/public/images/after.png -------------------------------------------------------------------------------- /packages/actify/src/components/CircularProgress/index.ts: -------------------------------------------------------------------------------- 1 | export { CircularProgress } from './CircularProgress' 2 | -------------------------------------------------------------------------------- /apps/docs/public/images/before.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actifyjs/actify/HEAD/apps/docs/public/images/before.jpg -------------------------------------------------------------------------------- /apps/docs/public/short-cut-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actifyjs/actify/HEAD/apps/docs/public/short-cut-icon.png -------------------------------------------------------------------------------- /apps/docs/public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actifyjs/actify/HEAD/apps/docs/public/apple-touch-icon.png -------------------------------------------------------------------------------- /apps/docs/public/icons/icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actifyjs/actify/HEAD/apps/docs/public/icons/icon-48x48.png -------------------------------------------------------------------------------- /apps/docs/public/icons/icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actifyjs/actify/HEAD/apps/docs/public/icons/icon-72x72.png -------------------------------------------------------------------------------- /apps/docs/public/icons/icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actifyjs/actify/HEAD/apps/docs/public/icons/icon-96x96.png -------------------------------------------------------------------------------- /packages/actify/src/components/Radio/index.ts: -------------------------------------------------------------------------------- 1 | export { Radio } from './Radio' 2 | export { RadioGroup } from './RadioGroup' 3 | -------------------------------------------------------------------------------- /apps/docs/public/icons/icon-128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actifyjs/actify/HEAD/apps/docs/public/icons/icon-128x128.png -------------------------------------------------------------------------------- /apps/docs/public/icons/icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actifyjs/actify/HEAD/apps/docs/public/icons/icon-144x144.png -------------------------------------------------------------------------------- /apps/docs/public/icons/icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actifyjs/actify/HEAD/apps/docs/public/icons/icon-152x152.png -------------------------------------------------------------------------------- /apps/docs/public/icons/icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actifyjs/actify/HEAD/apps/docs/public/icons/icon-192x192.png -------------------------------------------------------------------------------- /apps/docs/public/icons/icon-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/actifyjs/actify/HEAD/apps/docs/public/icons/icon-512x512.png -------------------------------------------------------------------------------- /packages/actify/src/components/Slot/index.ts: -------------------------------------------------------------------------------- 1 | export { 2 | Slot, 3 | Slottable, 4 | // 5 | Root 6 | } from './Slot' 7 | -------------------------------------------------------------------------------- /packages/actify/src/components/Swiper/index.ts: -------------------------------------------------------------------------------- 1 | export { Swiper } from './Swiper' 2 | export { SwiperItem } from './SwiperItem' 3 | -------------------------------------------------------------------------------- /packages/actify/src/components/Select/index.ts: -------------------------------------------------------------------------------- 1 | export { Select } from './Select' 2 | export { SelectOption } from './SelectOption' 3 | -------------------------------------------------------------------------------- /packages/actify/src/components/Tabs/index.ts: -------------------------------------------------------------------------------- 1 | export { Tabs } from './Tabs' 2 | 3 | export { Item as TabItem } from 'react-stately' 4 | -------------------------------------------------------------------------------- /apps/docs/postcss.config.mjs: -------------------------------------------------------------------------------- 1 | const config = { 2 | plugins: { 3 | '@tailwindcss/postcss': {} 4 | } 5 | } 6 | export default config 7 | -------------------------------------------------------------------------------- /packages/actify/src/components/Carousel/index.ts: -------------------------------------------------------------------------------- 1 | export { Carousel } from './Carousel' 2 | export { CarouselItem } from './CarouselItem' 3 | -------------------------------------------------------------------------------- /packages/actify/src/components/ListBox/index.ts: -------------------------------------------------------------------------------- 1 | export { ListBox } from './ListBox' 2 | export { ListBoxOption } from './ListBoxOption' 3 | -------------------------------------------------------------------------------- /apps/docs/src/usages/avatar.tsx: -------------------------------------------------------------------------------- 1 | import { Avatar } from 'actify' 2 | 3 | export default () => 4 | -------------------------------------------------------------------------------- /packages/actify/src/components/Checkbox/index.ts: -------------------------------------------------------------------------------- 1 | export { Checkbox } from './Checkbox' 2 | export { CheckboxGroup } from './CheckboxGroup' 3 | -------------------------------------------------------------------------------- /packages/actify/src/components/Field/index.ts: -------------------------------------------------------------------------------- 1 | export { FilledField } from './FilledField' 2 | export { OutlinedField } from './OutlinedField' 3 | -------------------------------------------------------------------------------- /packages/actify/src/components/PopoverMenu/index.ts: -------------------------------------------------------------------------------- 1 | export { PopoverMenu } from './PopoverMenu' 2 | export { PopoverMenuItem } from './PopoverMenuItem' 3 | -------------------------------------------------------------------------------- /packages/actify/src/css-module.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.module.css' { 2 | const classes: { [key: string]: string } 3 | export default classes 4 | } 5 | -------------------------------------------------------------------------------- /packages/actify/src/components/Autocomplete/index.ts: -------------------------------------------------------------------------------- 1 | export { Autocomplete } from './Autocomplete' 2 | export { Item as AutocompleteItem } from 'react-stately' 3 | -------------------------------------------------------------------------------- /packages/actify/src/components/Snackbar/index.ts: -------------------------------------------------------------------------------- 1 | export { Toast as Snackbar } from './Toast' 2 | export { ToastProvider as SnackbarProvider } from './ToastProvider' 3 | -------------------------------------------------------------------------------- /packages/actify/src/components/ActionMenu/index.ts: -------------------------------------------------------------------------------- 1 | export { ActionMenu } from './ActionMenu' 2 | export { Item as MenuItem, Section as MenuSection } from 'react-stately' 3 | -------------------------------------------------------------------------------- /packages/actify/src/components/Chips/index.ts: -------------------------------------------------------------------------------- 1 | export { ChipGroup } from './ChipGroup' 2 | export { useListData, Item as ChipItem, type Selection } from 'react-stately' 3 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 2, 3 | "semi": false, 4 | "printWidth": 80, 5 | "singleQuote": true, 6 | "trailingComma": "none", 7 | "bracketSameLine": false 8 | } 9 | -------------------------------------------------------------------------------- /packages/actify/src/components/Lists/index.ts: -------------------------------------------------------------------------------- 1 | export { List } from './List' 2 | 3 | export { ListItem } from './ListItem' 4 | export { ListGroup } from './ListGroup' 5 | -------------------------------------------------------------------------------- /packages/actify/src/components/SegmentedButton/index.ts: -------------------------------------------------------------------------------- 1 | export { SegmentedButton } from './SegmentedButton' 2 | export { SegmentedButtonSet } from './SegmentedButtonSet' 3 | -------------------------------------------------------------------------------- /apps/docs/next.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | distDir: 'dist', 4 | output: 'export' 5 | } 6 | 7 | export default nextConfig 8 | -------------------------------------------------------------------------------- /apps/docs/content/components/dialogs.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Dialogs 3 | description: Dialogs provide important prompts in a user flow 4 | --- 5 | 6 | ## Usage 7 | 8 | 9 | -------------------------------------------------------------------------------- /apps/docs/content/components/swiper.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Swiper 3 | description: Swiper is simple banner slider with a lot of features. 4 | --- 5 | 6 | ## Usage 7 | 8 | 9 | -------------------------------------------------------------------------------- /packages/actify/src/components/Autocomplete/autocomplete.module.css: -------------------------------------------------------------------------------- 1 | .autocomplete { 2 | width: 100%; 3 | position: relative; 4 | display: inline-flex; 5 | flex-direction: column; 6 | } 7 | -------------------------------------------------------------------------------- /apps/docs/content/components/avatar.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Avatar 3 | description: Avatar is a component that can be used to display a user's avatar. 4 | --- 5 | 6 | ## Usage 7 | 8 | 9 | -------------------------------------------------------------------------------- /apps/docs/content/components/time-pickers.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Time pickers 3 | description: Time pickers help users select and set a specific time 4 | --- 5 | 6 | ## Usage 7 | 8 | 9 | -------------------------------------------------------------------------------- /apps/docs/src/usages/before-after.tsx: -------------------------------------------------------------------------------- 1 | import { BeforeAfter } from 'actify' 2 | 3 | export default () => { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/custom.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Custom issue template 3 | about: Describe this issue template's purpose here. 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | 11 | -------------------------------------------------------------------------------- /apps/docs/content/components/snackbar.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Snackbar 3 | description: Snackbars show short updates about app processes at the bottom of the screen 4 | --- 5 | 6 | ## Usage 7 | 8 | 9 | -------------------------------------------------------------------------------- /apps/docs/content/getting-started/icons.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Icon 3 | --- 4 | 5 | > Icons are based on Material Icons 6 | 7 | 8 | -------------------------------------------------------------------------------- /packages/actify/src/components/Buttons/index.ts: -------------------------------------------------------------------------------- 1 | export { Button } from './Button' 2 | export { Fab } from './Fab' 3 | export { IconButton } from './IconButton' 4 | export { LinkButton } from './LinkButton' 5 | -------------------------------------------------------------------------------- /packages/actify/src/components/Pagination/index.ts: -------------------------------------------------------------------------------- 1 | export { Pagination } from './Pagination' 2 | export type { PaginationProps } from './Pagination' 3 | export { PaginationNumber } from './PaginationNumber' 4 | -------------------------------------------------------------------------------- /apps/docs/content/components/buttons/icon-button.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Icon buttons 3 | description: Icon buttons help people take minor actions with one tap 4 | --- 5 | 6 | ## Usage 7 | 8 | 9 | -------------------------------------------------------------------------------- /apps/docs/content/components/ripple.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Ripple 3 | description: Ripples are state layers used to communicate the status of a component or interactive element. 4 | --- 5 | 6 | 7 | -------------------------------------------------------------------------------- /apps/docs/src/utils/cn.ts: -------------------------------------------------------------------------------- 1 | import { clsx, type ClassValue } from 'clsx' 2 | import { twMerge } from 'tailwind-merge' 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)) 6 | } 7 | -------------------------------------------------------------------------------- /packages/actify/src/components/BottomAppBar/index.ts: -------------------------------------------------------------------------------- 1 | export { BottomAppBar } from './BottomAppBar' 2 | export { BottomAppBarIcons } from './BottomAppBarIcons' 3 | export { BottomAppBarFab } from './BottomAppBarFab' 4 | -------------------------------------------------------------------------------- /packages/actify/src/components/Dialogs/index.ts: -------------------------------------------------------------------------------- 1 | export { Dialog } from './Dialog' 2 | export { DialogActivator } from './DialogActivator' 3 | export { useOverlayTriggerState as useDialogState } from 'react-stately' 4 | -------------------------------------------------------------------------------- /apps/docs/content/components/buttons/fab.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Floating action buttons 3 | description: Floating action buttons (FABs) help people take primary actions 4 | --- 5 | 6 | ## Usage 7 | 8 | 9 | -------------------------------------------------------------------------------- /packages/actify/src/components/NavigationDrawer/index.ts: -------------------------------------------------------------------------------- 1 | export { NavigationDrawer } from './NavigationDrawer' 2 | 3 | export { DrawerActivator } from './DrawerActivator' 4 | export { DrawerContent } from './DrawerContent' 5 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - 'apps/*' 3 | - 'packages/*' 4 | 5 | catalog: 6 | 'react': '^19.0.0' 7 | 'react-dom': '^19.0.0' 8 | '@types/react': '^19.0.0' 9 | '@types/react-dom': '^19.0.0' 10 | -------------------------------------------------------------------------------- /apps/docs/content/components/navigation/navigation-bar.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Navigation bar 3 | description: Navigation bars let people switch between UI views on smaller devices 4 | --- 5 | 6 | ## Usage 7 | 8 | 9 | -------------------------------------------------------------------------------- /apps/docs/content/components/app-bars/top-app-bar.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Top app bars 3 | description: The top app bar displays information and actions relating to the current screen. 4 | --- 5 | 6 | ## Usage 7 | 8 | 9 | -------------------------------------------------------------------------------- /apps/docs/content/components/navigation/navigation-rail.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Navigation rail 3 | description: Navigation rails let people switch between UI views on mid-sized devices 4 | --- 5 | 6 | ## Usage 7 | 8 | 9 | -------------------------------------------------------------------------------- /packages/actify/src/components/BottomSheets/index.ts: -------------------------------------------------------------------------------- 1 | export { BottomSheets } from './BottomSheets' 2 | 3 | export { BottomSheetsActivator } from './BottomSheetsActivator' 4 | export { BottomSheetsContent } from './BottomSheetsContent' 5 | -------------------------------------------------------------------------------- /packages/actify/src/components/Table/index.ts: -------------------------------------------------------------------------------- 1 | export { Table } from './Table' 2 | 3 | export { 4 | Cell, 5 | Column, 6 | Row, 7 | TableBody, 8 | TableHeader, 9 | useAsyncList 10 | } from 'react-stately' 11 | -------------------------------------------------------------------------------- /packages/actify/src/components/Tooltips/index.ts: -------------------------------------------------------------------------------- 1 | export { Tooltip } from './Tooltip' 2 | export { TooltipGroup } from './TooltipGroup' 3 | export { OverlayArrow } from './OverlayArrow' 4 | export { TooltipTrigger } from './TooltipTrigger' 5 | -------------------------------------------------------------------------------- /packages/actify/src/components/Menus/index.ts: -------------------------------------------------------------------------------- 1 | export { Menu } from './Menu' 2 | export { Submenu } from './Submenu' 3 | export { MenuItem } from './MenuItem' 4 | export { MenuButton } from './MenuButton' 5 | export { MenuPopover } from './MenuPopover' 6 | -------------------------------------------------------------------------------- /apps/docs/content/components/app-bars/bottom-app-bar.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Bottom app bar 3 | description: Bottom app bars display navigation and key actions at the bottom of mobile and tablet screens 4 | --- 5 | 6 | ## Usage 7 | 8 | 9 | -------------------------------------------------------------------------------- /packages/actify/src/components/Accordion/index.ts: -------------------------------------------------------------------------------- 1 | export { Accordion } from './Accordion' 2 | export { AccordionItem } from './AccordionItem' 3 | export { AccordionHeader } from './AccordionHeader' 4 | export { AccordionContent } from './AccordionContent' 5 | -------------------------------------------------------------------------------- /packages/actify/src/components/Table/TableHeader.tsx: -------------------------------------------------------------------------------- 1 | import { TableHeaderProps } from 'react-stately' 2 | 3 | const TableHeader = (props: TableHeaderProps) => { 4 | return <>{props.children} 5 | } 6 | 7 | export { TableHeader } 8 | -------------------------------------------------------------------------------- /packages/actify/src/components/Chips/chip-group.module.css: -------------------------------------------------------------------------------- 1 | .chip-group { 2 | display: flex; 3 | flex-direction: column; 4 | gap: 4px; 5 | } 6 | 7 | .chip-group [role='grid'] { 8 | display: flex; 9 | flex-wrap: wrap; 10 | gap: 8px; 11 | } 12 | -------------------------------------------------------------------------------- /apps/docs/src/lib/raw.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs/promises' 2 | 3 | export async function getFileRaw(filepath: string) { 4 | let content = undefined 5 | try { 6 | content = await fs.readFile(filepath, 'utf-8') 7 | } catch {} 8 | return content 9 | } 10 | -------------------------------------------------------------------------------- /apps/docs/src/hooks/useMounted.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react' 2 | 3 | export const useMounted = () => { 4 | const [mounted, setMounted] = useState(false) 5 | 6 | useEffect(() => { 7 | setMounted(true) 8 | }) 9 | return mounted 10 | } 11 | -------------------------------------------------------------------------------- /packages/actify/src/components/Lists/list.module.css: -------------------------------------------------------------------------------- 1 | .ul { 2 | list-style: none; 3 | margin: 0; 4 | padding: 0; 5 | padding-top: 0.5rem /* 8px */; 6 | padding-bottom: 0.5rem /* 8px */; 7 | overflow: hidden; 8 | background-color: var(--md-sys-color-surface); 9 | } 10 | -------------------------------------------------------------------------------- /packages/actify/tsconfig.rollup.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "jsx": "react-jsx", 4 | "allowSyntheticDefaultImports": true, 5 | "module": "ESNext", 6 | "declaration": true, 7 | "outDir": "./dist" 8 | }, 9 | "exclude": ["node_modules", "dist"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/docs/src/usages/terminal.tsx: -------------------------------------------------------------------------------- 1 | import { Terminal } from 'actify' 2 | 3 | export default () => { 4 | return ( 5 | 6 | yarn 7 | add actify 8 | 9 | ) 10 | } 11 | -------------------------------------------------------------------------------- /packages/actify/src/components/Select/trailingIcon.module.css: -------------------------------------------------------------------------------- 1 | .trailing-icon { 2 | height: 100%; 3 | display: inline-flex; 4 | align-items: center; 5 | margin-inline: var(--_content-space) 6 | var(--_with-trailing-content-trailing-space); 7 | } 8 | .open { 9 | rotate: 180deg; 10 | } 11 | -------------------------------------------------------------------------------- /packages/actify/src/components/Buttons/styles/color.module.css: -------------------------------------------------------------------------------- 1 | .secondary { 2 | --md-sys-color-primary: var(--md-sys-color-secondary); 3 | } 4 | .tertiary { 5 | --md-sys-color-primary: var(--md-sys-color-tertiary); 6 | } 7 | .error { 8 | --md-sys-color-primary: var(--md-sys-color-error); 9 | } 10 | -------------------------------------------------------------------------------- /packages/actify/src/components/Text/Text.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { Text as AriaText, TextProps } from 'react-aria-components' 4 | 5 | const Text = (props: TextProps) => { 6 | return 7 | } 8 | 9 | Text.displayName = 'Actify.Text' 10 | 11 | export { Text } 12 | -------------------------------------------------------------------------------- /packages/actify/src/components/Carousel/carousel.module.css: -------------------------------------------------------------------------------- 1 | .carousel { 2 | display: inline-flex; 3 | width: 100%; 4 | min-height: 25rem /* 400px */; 5 | position: relative; 6 | border-radius: 0.5rem /* 8px */; 7 | align-items: center; 8 | justify-content: center; 9 | overflow: hidden; 10 | } 11 | -------------------------------------------------------------------------------- /apps/docs/content/components/autocomplete.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Autocomplete 3 | description: Autocomplete component offers simple and flexible type-ahead functionality. This is useful when searching large sets of data or even dynamically requesting information from an API. 4 | --- 5 | 6 | ## Usage 7 | 8 | 9 | -------------------------------------------------------------------------------- /packages/actify/src/components/Lists/ListContext.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { Transition } from 'motion/react' 4 | import { createContext } from 'react' 5 | 6 | const ListContext = createContext({ 7 | layoutId: '', 8 | transition: undefined as undefined | Transition 9 | }) 10 | 11 | export { ListContext } 12 | -------------------------------------------------------------------------------- /packages/actify/src/components/Menus/Submenu.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { 4 | SubmenuTrigger as AriaSubmenuTrigger, 5 | SubmenuTriggerProps 6 | } from 'react-aria-components' 7 | 8 | const Submenu = (props: SubmenuTriggerProps) => { 9 | return 10 | } 11 | 12 | export { Submenu } 13 | -------------------------------------------------------------------------------- /packages/actify/src/components/SideSheets/SideSheetsAction.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import styles from './side-sheets.module.css' 3 | 4 | const SideSheetsAction = ({ children }: React.ComponentProps<'div'>) => { 5 | return
{children}
6 | } 7 | 8 | export { SideSheetsAction } 9 | -------------------------------------------------------------------------------- /apps/docs/src/usages/tooltips.tsx: -------------------------------------------------------------------------------- 1 | import { Button, Tooltip, TooltipTrigger } from 'actify' 2 | 3 | export default () => { 4 | return ( 5 | <> 6 | 7 | 8 | Hello Tooltip 9 | 10 | 11 | ) 12 | } 13 | -------------------------------------------------------------------------------- /packages/actify/src/components/Carousel/carousel-control.module.css: -------------------------------------------------------------------------------- 1 | .control { 2 | top: 50%; 3 | z-index: 30; 4 | position: absolute; 5 | transform: translateY(-50%); 6 | background-color: var(--md-sys-color-primary); 7 | } 8 | .left { 9 | left: 1rem; 10 | } 11 | .right { 12 | right: 1rem; 13 | } 14 | .icon { 15 | color: white; 16 | } 17 | -------------------------------------------------------------------------------- /packages/actify/src/components/Menus/Menu.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { Menu as AriaMenu, MenuProps } from 'react-aria-components' 4 | 5 | import styles from './menu.module.css' 6 | 7 | const Menu = (props: MenuProps) => { 8 | return 9 | } 10 | 11 | export { Menu } 12 | -------------------------------------------------------------------------------- /packages/actify/src/components/Spacer/Spacer.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const Spacer = ({ style, className, ...rest }: React.ComponentProps<'div'>) => { 4 | return ( 5 |
6 | ) 7 | } 8 | 9 | Spacer.displayName = 'Actify.Spacer' 10 | 11 | export { Spacer } 12 | -------------------------------------------------------------------------------- /apps/docs/public/actify.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /packages/actify/src/components/Carousel/CarouselItem.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const CarouselItem = (props: React.ComponentProps<'div'>) => { 4 | const { className, children, ...rest } = props 5 | 6 | return ( 7 |
8 | {children} 9 |
10 | ) 11 | } 12 | 13 | export { CarouselItem } 14 | -------------------------------------------------------------------------------- /packages/actify/src/components/SideSheets/index.ts: -------------------------------------------------------------------------------- 1 | export { SideSheets } from './SideSheets' 2 | 3 | export { SideSheetsAction } from './SideSheetsAction' 4 | export { SideSheetsActivator } from './SideSheetsActivator' 5 | export { SideSheetsBody } from './SideSheetsBody' 6 | export { SideSheetsContent } from './SideSheetsContent' 7 | export { SideSheetsHeader } from './SideSheetsHeader' 8 | -------------------------------------------------------------------------------- /packages/actify/src/components/VisuallyHidden/visually-hidden.module.css: -------------------------------------------------------------------------------- 1 | .visually-hidden { 2 | /* https://github.com/twbs/bootstrap/blob/main/scss/mixins/_visually-hidden.scss */ 3 | position: absolute; 4 | border: 0; 5 | width: 1px; 6 | height: 1px; 7 | padding: 0; 8 | margin: -1px; 9 | overflow: hidden; 10 | clip: rect(0, 0, 0, 0); 11 | white-space: nowrap; 12 | } 13 | -------------------------------------------------------------------------------- /packages/actify/src/components/Checkbox/checkbox-group.module.css: -------------------------------------------------------------------------------- 1 | .checkbox-group[aria-orientation='horizontal'] { 2 | gap: 14px; 3 | align-items: center; 4 | } 5 | .checkbox-group[aria-orientation='vertical'] { 6 | flex-direction: column; 7 | } 8 | .description { 9 | font-size: 12px; 10 | } 11 | .error-message { 12 | font-size: 12px; 13 | color: var(--md-sys-color-error); 14 | } 15 | -------------------------------------------------------------------------------- /packages/actify/src/components/Select/TrailingIcon.tsx: -------------------------------------------------------------------------------- 1 | import { Icon } from '../Icon' 2 | import clsx from 'clsx' 3 | import styles from './trailingIcon.module.css' 4 | 5 | export const TrailingIcon = ({ isOpen }: { isOpen: boolean }) => { 6 | return ( 7 | 8 | Arrow_Drop_Down 9 | 10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /apps/docs/src/usages/app-bars/top-app-bar.tsx: -------------------------------------------------------------------------------- 1 | import { TopAppBar } from 'actify' 2 | 3 | export default () => { 4 | return ( 5 |
6 | 7 | 8 | 9 | 10 |
11 | ) 12 | } 13 | -------------------------------------------------------------------------------- /apps/docs/content/components/buttons/segmented-button.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Segmented button 3 | description: Segmented buttons help people select options, switch views, or sort elements 4 | --- 5 | 6 | ## Usage 7 | 8 | 9 | 10 | ## Props 11 | 12 | | Props | Type | Description | Default | 13 | | -------- | --------- | ----------- | ------- | 14 | | selected | `boolean` | | `false` | 15 | -------------------------------------------------------------------------------- /packages/actify/src/components/Radio/radio-group.module.css: -------------------------------------------------------------------------------- 1 | .radio-group { 2 | display: flex; 3 | } 4 | .radio-group[aria-orientation='horizontal'] { 5 | gap: 14px; 6 | align-items: center; 7 | } 8 | .radio-group[aria-orientation='vertical'] { 9 | flex-direction: column; 10 | } 11 | .description { 12 | font-size: 12px; 13 | } 14 | .error-message { 15 | font-size: 12px; 16 | color: var(--md-sys-color-error); 17 | } 18 | -------------------------------------------------------------------------------- /packages/actify/src/components/Swiper/SwiperItem.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import clsx from 'clsx' 3 | import styles from './swiper.module.css' 4 | 5 | const SwiperItem = (props: React.ComponentProps<'div'>) => { 6 | const { className, children, ...rest } = props 7 | return ( 8 |
9 | {children} 10 |
11 | ) 12 | } 13 | 14 | export { SwiperItem } 15 | -------------------------------------------------------------------------------- /apps/docs/src/app/fonts.ts: -------------------------------------------------------------------------------- 1 | import { Fira_Code, Poppins } from 'next/font/google' 2 | 3 | export const poppins = Poppins({ 4 | display: 'swap', 5 | subsets: ['latin'], 6 | variable: '--font-poppins', 7 | weight: ['100', '200', '300', '400', '500', '600', '700', '800', '900'] 8 | }) 9 | 10 | export const fira_code = Fira_Code({ 11 | subsets: ['latin'], 12 | variable: '--font-fira-code', 13 | display: 'swap' 14 | }) 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | 26 | .next 27 | .turbo 28 | 29 | 30 | # Contentlayer 31 | .contentlayer 32 | -------------------------------------------------------------------------------- /apps/docs/src/components/App.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import packageInfo from 'actify/package.json' 3 | 4 | export default function App({ children }: { children: React.ReactNode }) { 5 | return ( 6 |
11 | {children} 12 |
13 | ) 14 | } 15 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "actifyjs", 3 | "private": true, 4 | "scripts": { 5 | "build": "turbo run build", 6 | "dev": "turbo run dev --no-cache --continue" 7 | }, 8 | "dependencies": { 9 | "@changesets/cli": "^2.27.9", 10 | "@manypkg/cli": "^0.22.0", 11 | "eslint": "^9.13.0", 12 | "turbo": "^2.2.3" 13 | }, 14 | "packageManager": "pnpm@9.5.0", 15 | "devDependencies": { 16 | "@biomejs/biome": "2.2.6" 17 | } 18 | } -------------------------------------------------------------------------------- /packages/actify/src/components/Menus/ListBox.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { ListBox as AriaListBox, ListBoxProps } from 'react-aria-components' 4 | 5 | import styles from './listbox.module.css' 6 | 7 | const ListBox = ({ children, ...props }: ListBoxProps) => { 8 | return ( 9 | 10 | {children} 11 | 12 | ) 13 | } 14 | 15 | export { ListBox } 16 | -------------------------------------------------------------------------------- /packages/actify/src/components/SegmentedButton/SegmentedButtonSet.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | interface SegmentedButtonSetProps extends React.ComponentProps<'div'> {} 4 | const SegmentedButtonSet = (props: SegmentedButtonSetProps) => { 5 | const { children, ...rest } = props 6 | 7 | return ( 8 |
9 | {children} 10 |
11 | ) 12 | } 13 | 14 | export { SegmentedButtonSet } 15 | -------------------------------------------------------------------------------- /packages/create-actify/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "create-actify", 3 | "version": "0.0.1", 4 | "author": "Lerte Smith", 5 | "publishConfig": { 6 | "registry": "https://registry.npmjs.com/" 7 | }, 8 | "type": "module", 9 | "scripts": {}, 10 | "dependencies": { 11 | "prompts": "^2.4.2" 12 | }, 13 | "devDependencies": { 14 | "@types/prompts": "^2.4.9", 15 | "kolorist": "^1.8.0", 16 | "minimist": "^1.2.8" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /packages/actify/src/components/NavigationBar/navigation-bar.module.css: -------------------------------------------------------------------------------- 1 | .root { 2 | width: 100%; 3 | display: flex; 4 | align-items: center; 5 | justify-content: center; 6 | min-height: 5rem /* 80px */; 7 | background-color: var(--md-sys-color-surface); 8 | } 9 | .list { 10 | display: grid; 11 | width: 100%; 12 | height: 100%; 13 | gap: 0.5rem /* 8px */; 14 | padding: 0.75rem 0.5rem 1rem; 15 | grid-template-columns: repeat(4, minmax(0, 1fr)); 16 | } 17 | -------------------------------------------------------------------------------- /apps/docs/content/components/label.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Label 3 | description: Use original html label tag, but prevented text selection when double clicked 4 | --- 5 | 6 | ## Usage with Checkbox 7 | 8 | 9 | 10 | ## Usage with Raido 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /apps/docs/src/usages/divider.tsx: -------------------------------------------------------------------------------- 1 | import { Divider } from 'actify' 2 | 3 | export default () => { 4 | return ( 5 |
6 |
7 | Content above 8 | 9 | Content below 10 |
11 |
12 | Content left 13 | 14 | Content right 15 |
16 |
17 | ) 18 | } 19 | -------------------------------------------------------------------------------- /packages/actify/src/components/BottomSheets/BottomSheets.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { 4 | BottomSheetsProvider, 5 | BottomSheetsProviderProps 6 | } from './BottomSheetsContext' 7 | 8 | const BottomSheets = (props: BottomSheetsProviderProps) => { 9 | const { children, ...rest } = props 10 | return {children} 11 | } 12 | 13 | BottomSheets.displayName = 'Actify.BottomSheets' 14 | 15 | export { BottomSheets } 16 | -------------------------------------------------------------------------------- /packages/actify/src/hooks/useDebounce.ts: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { useEffect, useState } from 'react' 4 | 5 | const useDebounce = (value: T, delay: number): T => { 6 | const [debouncedValue, setDebouncedValue] = useState(value) 7 | useEffect(() => { 8 | const timer = setTimeout(() => setDebouncedValue(value), delay || 500) 9 | return () => { 10 | clearTimeout(timer) 11 | } 12 | }, [value, delay]) 13 | return debouncedValue 14 | } 15 | 16 | export { useDebounce } 17 | -------------------------------------------------------------------------------- /apps/docs/src/usages/pagination.tsx: -------------------------------------------------------------------------------- 1 | import { Pagination } from 'actify' 2 | import { useState } from 'react' 3 | 4 | export default () => { 5 | const totalPages = 20 6 | const [currentPage, setCurrentPage] = useState(1) 7 | 8 | const handlePageChange = (page: number) => { 9 | setCurrentPage(page) 10 | } 11 | 12 | return ( 13 | 18 | ) 19 | } 20 | -------------------------------------------------------------------------------- /packages/actify/src/components/Lists/list-item.module.css: -------------------------------------------------------------------------------- 1 | .root { 2 | display: flex; 3 | padding-left: 1rem /* 16px */; 4 | padding-top: 0.5rem /* 8px */; 5 | padding-bottom: 0.5rem /* 8px */; 6 | isolation: isolate; 7 | min-height: 3.5rem /* 56px */; 8 | position: relative; 9 | align-items: center; 10 | line-height: 1.5; 11 | cursor: pointer; 12 | } 13 | .hovered { 14 | position: absolute; 15 | inset: 0; 16 | z-index: -1; 17 | background-color: var(--md-sys-color-surface-variant); 18 | } 19 | -------------------------------------------------------------------------------- /packages/actify/src/components/Avatar/Avatar.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | export interface AvatarProps extends React.ComponentProps<'img'> {} 4 | 5 | const Avatar = (props: AvatarProps) => { 6 | const { alt, src, ...rest } = props 7 | 8 | return ( 9 | {alt 14 | ) 15 | } 16 | 17 | Avatar.displayName = 'Actify.Avatar' 18 | 19 | export { Avatar } 20 | -------------------------------------------------------------------------------- /todo.md: -------------------------------------------------------------------------------- 1 | - [x] radio component 2 | - [x] divider component 3 | - [ ] sub-memu component 4 | - [x] segmented button with label styles 5 | - [ ] TailwindCSS -> css module 6 | - [ ] sub component -> render props 7 | - [x] open in stackblitz use ts template 8 | - [x] open in codesandbox use ts template 9 | - [ ] create-actify cli generate templates (vite[js,ts], next[js,ts]) 10 | - [ ] [Dot notation client component breaks consuming RSC.](https://github.com/vercel/next.js/issues/51593) 11 | Accordion.Item -> AccordionItem 12 | -------------------------------------------------------------------------------- /packages/actify/src/components/BottomAppBar/BottomAppBarFab.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import clsx from 'clsx' 3 | import styles from './bottom-app-bar.module.css' 4 | 5 | interface BottomAppBarFabProps extends React.ComponentProps<'div'> {} 6 | 7 | const BottomAppBarFab = ({ 8 | children, 9 | className, 10 | ...rest 11 | }: BottomAppBarFabProps) => { 12 | return ( 13 |
14 | {children} 15 |
16 | ) 17 | } 18 | 19 | export { BottomAppBarFab } 20 | -------------------------------------------------------------------------------- /apps/docs/content/components/badges.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Badge 3 | description: Badges show notifications, counts, or status information on navigation items and icons 4 | --- 5 | 6 | ## Usage 7 | 8 | 9 | 10 | ## Props 11 | 12 | | Props | Type | Description | Default | 13 | | ------- | ----------------- | ------------------------- | ------- | 14 | | `value` | `string` `number` | The content of the badge. | `null` | 15 | | `color` | `string` | The color of the badge. | `error` | 16 | -------------------------------------------------------------------------------- /packages/actify/src/components/BottomAppBar/BottomAppBarIcons.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import clsx from 'clsx' 3 | import styles from './bottom-app-bar.module.css' 4 | 5 | interface BottomAppBarIconsProps extends React.ComponentProps<'div'> {} 6 | 7 | const BottomAppBarIcons = ({ 8 | children, 9 | className, 10 | ...rest 11 | }: BottomAppBarIconsProps) => { 12 | return ( 13 |
14 | {children} 15 |
16 | ) 17 | } 18 | 19 | export { BottomAppBarIcons } 20 | -------------------------------------------------------------------------------- /apps/docs/src/usages/lists.tsx: -------------------------------------------------------------------------------- 1 | import { List, ListItem, ListGroup } from 'actify' 2 | 3 | export default () => { 4 | const list = ['HTML', 'Tailwind CSS', 'Vue'] 5 | 6 | return ( 7 | 8 | {list.map((item) => ( 9 | {item} 10 | ))} 11 | 12 | {['Next.js', 'Floating-UI', 'Framer Motion', 'Actify'].map((item) => ( 13 | {item} 14 | ))} 15 | 16 | 17 | ) 18 | } 19 | -------------------------------------------------------------------------------- /packages/actify/src/components/SideSheets/SideSheets.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import React from 'react' 4 | import { SideSheetsProvider } from './SideSheetsContext' 5 | 6 | type SideSheetsProps = Omit, 'onChange'> & { 7 | divider?: boolean 8 | onChange?: () => void 9 | } 10 | 11 | const SideSheets = ({ children, ...rest }: SideSheetsProps) => { 12 | return {children} 13 | } 14 | 15 | SideSheets.displayName = 'Actify.SideSheets' 16 | 17 | export { SideSheets } 18 | -------------------------------------------------------------------------------- /apps/docs/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | /dist/ 16 | 17 | # production 18 | /build 19 | 20 | # misc 21 | .DS_Store 22 | *.pem 23 | 24 | # debug 25 | npm-debug.log* 26 | yarn-debug.log* 27 | yarn-error.log* 28 | 29 | # local env files 30 | .env*.local 31 | 32 | # vercel 33 | .vercel 34 | 35 | # typescript 36 | *.tsbuildinfo 37 | next-env.d.ts 38 | -------------------------------------------------------------------------------- /packages/actify/src/components/ListBox/listbox.module.css: -------------------------------------------------------------------------------- 1 | .items { 2 | list-style: none; 3 | margin: 0; 4 | display: block; 5 | padding-block: 8px; 6 | list-style-type: none; 7 | outline: none; 8 | box-sizing: border-box; 9 | background-color: var( 10 | --md-menu-container-color, 11 | var(--md-sys-color-surface-container, #f3edf7) 12 | ); 13 | width: var(--reference-width); 14 | height: inherit; 15 | max-height: inherit; 16 | overflow: auto; 17 | min-width: inherit; 18 | max-width: inherit; 19 | border-radius: inherit; 20 | scrollbar-width: inherit; 21 | } 22 | -------------------------------------------------------------------------------- /packages/actify/src/components/Menus/listbox.module.css: -------------------------------------------------------------------------------- 1 | .items { 2 | list-style: none; 3 | margin: 0; 4 | display: block; 5 | padding-block: 8px; 6 | list-style-type: none; 7 | outline: none; 8 | box-sizing: border-box; 9 | background-color: var( 10 | --md-menu-container-color, 11 | var(--md-sys-color-surface-container, #f3edf7) 12 | ); 13 | width: var(--reference-width); 14 | height: inherit; 15 | max-height: inherit; 16 | overflow: auto; 17 | min-width: inherit; 18 | max-width: inherit; 19 | border-radius: inherit; 20 | scrollbar-width: inherit; 21 | } 22 | -------------------------------------------------------------------------------- /packages/actify/src/components/Modal/modal.module.css: -------------------------------------------------------------------------------- 1 | .modal { 2 | position: fixed; 3 | inset: 0; 4 | z-index: 9999; 5 | display: flex; 6 | align-items: center; 7 | justify-content: center; 8 | } 9 | .scrim { 10 | position: absolute; 11 | inset: 0; 12 | opacity: 32%; 13 | background: var(--md-sys-color-scrim, #000000); 14 | } 15 | 16 | .content { 17 | z-index: 1; 18 | background: var( 19 | --md-dialog-container-color, 20 | var(--md-sys-color-surface-container-high, #ece6f0) 21 | ); 22 | } 23 | .content [role='dialog']:focus-visible { 24 | outline: none; 25 | } 26 | -------------------------------------------------------------------------------- /packages/actify/src/hooks/useResizeObserver.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const useResizeObserver = (ref: React.RefObject) => { 4 | const [width, setWidth] = React.useState(0) 5 | React.useEffect(() => { 6 | const resizeObserver = new ResizeObserver(() => { 7 | const width = ref?.current?.getBoundingClientRect().width 8 | setWidth(width) 9 | }) 10 | resizeObserver.observe(ref?.current as Element) 11 | return () => { 12 | resizeObserver.disconnect() 13 | } 14 | }, []) 15 | return width 16 | } 17 | 18 | export { useResizeObserver } 19 | -------------------------------------------------------------------------------- /packages/actify/src/components/Cards/card.module.css: -------------------------------------------------------------------------------- 1 | .root { 2 | position: relative; 3 | display: inline-flex; 4 | flex-direction: column; 5 | border-radius: 0.75rem /* 12px */; 6 | } 7 | .filled { 8 | background-color: var(--md-sys-color-inverse-surface); 9 | } 10 | .outlined { 11 | border-width: 1px; 12 | --tw-border-opacity: 1; 13 | border-color: var(--md-sys-color-outline) / var(--tw-border-opacity); 14 | } 15 | .card { 16 | position: relative; 17 | overflow: hidden; 18 | border-top-left-radius: 0.75rem /* 12px */; 19 | border-top-right-radius: 0.75rem /* 12px */; 20 | } 21 | -------------------------------------------------------------------------------- /apps/docs/content/components/sheets/bottom-sheets.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Bottom sheets 3 | description: Bottom sheets show secondary content anchored to the bottom of the screen 4 | --- 5 | 6 | ## Usage 7 | 8 | 9 | 10 | ## Activator Props 11 | 12 | | Props | Type | Description | Default | 13 | | --------- | --------- | ------------------------------------------ | ------- | 14 | | `asChild` | `boolean` | set true pass any element as the activator | `false` | 15 | | `open` | `boolean` | Whether the sheets is open or not | `false` | 16 | -------------------------------------------------------------------------------- /apps/docs/src/components/EditOnGitHub.tsx: -------------------------------------------------------------------------------- 1 | import { Button, Icon } from 'actify' 2 | 3 | type EditOnGitHubProps = { 4 | pathname: string | null 5 | } 6 | const EditOnGitHub = ({ pathname }: EditOnGitHubProps) => { 7 | return ( 8 | 13 | 17 | 18 | ) 19 | } 20 | 21 | export default EditOnGitHub 22 | -------------------------------------------------------------------------------- /apps/docs/content/components/chips.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Chips 3 | description: Chips help people enter information, make selections, filter content, or trigger actions 4 | --- 5 | 6 | ## Usage 7 | 8 | 9 | 10 | ## Props 11 | 12 | | Prop | Type | Description | Default | 13 | | -------- | -------- | ---------------------- | ------- | 14 | | `lable` | `string` | The label of the chip | `null` | 15 | | `type` | `string` | The type of the chip | `null` | 16 | | `href` | `string` | The href of the chip | `null` | 17 | | `target` | `string` | The target of the chip | `null` | 18 | -------------------------------------------------------------------------------- /packages/actify/src/hooks/index.ts: -------------------------------------------------------------------------------- 1 | export { useFocusRing } from 'react-aria' 2 | 3 | export { usePrevious } from './usePrevious' 4 | export { useInterval } from './useInterval' 5 | export { useDebounce } from './useDebounce' 6 | export { useInputState } from './useInputState' 7 | export { useAttachable } from './useAttachable' 8 | export { useControllable } from './useControllable' 9 | export { mergeRefs, useMergedRefs } from './mergeRefs' 10 | export { useOnClickOutside } from './useOnClickOutside' 11 | export { useResizeObserver } from './useResizeObserver' 12 | export { useControllableState } from './useControllableState' 13 | -------------------------------------------------------------------------------- /packages/actify/src/hooks/usePrevious.ts: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | function usePrevious(value: T) { 4 | const ref = React.useRef({ value, previous: value }) 5 | 6 | // We compare values before making an update to ensure that 7 | // a change has been made. This ensures the previous value is 8 | // persisted correctly between renders. 9 | return React.useMemo(() => { 10 | if (ref.current.value !== value) { 11 | ref.current.previous = ref.current.value 12 | ref.current.value = value 13 | } 14 | return ref.current.previous 15 | }, [value]) 16 | } 17 | 18 | export { usePrevious } 19 | -------------------------------------------------------------------------------- /packages/actify/src/components/Field/styles/supporting.module.css: -------------------------------------------------------------------------------- 1 | .text { 2 | color: var(--_supporting-text-color); 3 | display: flex; 4 | font-family: var(--_supporting-text-font); 5 | font-size: var(--_supporting-text-size); 6 | line-height: var(--_supporting-text-line-height); 7 | font-weight: var(--_supporting-text-weight); 8 | gap: 16px; 9 | justify-content: space-between; 10 | padding-inline-start: var(--_supporting-text-leading-space); 11 | padding-inline-end: var(--_supporting-text-trailing-space); 12 | padding-top: var(--_supporting-text-top-space); 13 | } 14 | .counter { 15 | flex-shrink: 0; 16 | } 17 | -------------------------------------------------------------------------------- /turbo.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://turbo.build/schema.json", 3 | "globalDependencies": [ 4 | "**/.env.*local" 5 | ], 6 | "tasks": { 7 | "build": { 8 | "outputs": [ 9 | "dist/**", 10 | ".next/**", 11 | "!.next/cache/**" 12 | ], 13 | "dependsOn": [ 14 | "^build" 15 | ] 16 | }, 17 | "test": { 18 | "outputs": [ 19 | "coverage/**" 20 | ], 21 | "dependsOn": [] 22 | }, 23 | "lint": {}, 24 | "dev": { 25 | "cache": false, 26 | "persistent": true 27 | }, 28 | "clean": { 29 | "cache": false 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /apps/docs/src/usages/snackbar.tsx: -------------------------------------------------------------------------------- 1 | import { Button, SnackbarProvider } from 'actify' 2 | 3 | export default () => { 4 | return ( 5 | 6 | {(state) => ( 7 | 16 | )} 17 | 18 | ) 19 | } 20 | -------------------------------------------------------------------------------- /biome.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://biomejs.dev/schemas/2.2.6/schema.json", 3 | "vcs": { 4 | "enabled": false, 5 | "clientKind": "git", 6 | "useIgnoreFile": false 7 | }, 8 | "files": { 9 | "ignoreUnknown": false 10 | }, 11 | "formatter": { 12 | "enabled": true, 13 | "indentStyle": "tab" 14 | }, 15 | "linter": { 16 | "enabled": true, 17 | "rules": { 18 | "recommended": true 19 | } 20 | }, 21 | "javascript": { 22 | "formatter": { 23 | "quoteStyle": "double" 24 | } 25 | }, 26 | "assist": { 27 | "enabled": true, 28 | "actions": { 29 | "source": { 30 | "organizeImports": "on" 31 | } 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /packages/actify/src/components/Elevation/Elevation.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import React from 'react' 4 | import clsx from 'clsx' 5 | import elevation from './elevation.module.css' 6 | 7 | interface ElevationProps 8 | extends Omit, 'children'> { 9 | disabled?: boolean 10 | } 11 | 12 | const Elevation = ({ disabled = false, ...rest }: ElevationProps) => { 13 | const classes = clsx(elevation['shadow'], disabled && elevation['disabled']) 14 | return