From e0ffb0310e0d375dc3951c2c0776ba25ef8d02bb Mon Sep 17 00:00:00 2001 From: Devon Govett Date: Mon, 10 Nov 2025 16:16:40 -0800 Subject: [PATCH] docs: Fix sandboxes, localStorage, and search cards (#9135) * Fix ZIP/CodeSandbox/Stackblitz for all examples * docs: Fix ZIP download, CodeSandbox, and StackBlitz * Refactor local storage * Use ListBox for ComponentCardView * Update node to latest 22.x * Fix getting text from wrong element * namespace local storage keys * Fix focus ring --- .circleci/config.yml | 8 +- packages/@react-spectrum/s2/src/Tabs.tsx | 6 +- .../dev/s2-docs/pages/react-aria/Calendar.mdx | 16 +- .../dev/s2-docs/pages/react-aria/DropZone.mdx | 1 + .../pages/react-aria/RangeCalendar.mdx | 16 +- .../{EmojiPicker => }/EmojiPicker.css | 0 .../examples/EmojiPicker/EmojiPicker.tsx | 50 ---- .../react-aria/examples/{tabs => }/Tab.tsx | 0 .../examples/{tabs => }/TabList.tsx | 0 .../examples/{tabs => }/TabPanel.tsx | 0 .../examples/{tabs => }/TabPanelCarousel.tsx | 0 .../{tabs => }/TabSelectionIndicator.tsx | 0 .../react-aria/examples/{tabs => }/Tabs.tsx | 0 .../pages/react-aria/examples/crud.mdx | 4 +- .../react-aria/examples/emoji-picker.mdx | 52 +++- .../pages/react-aria/examples/photos.mdx | 2 +- .../pages/react-aria/examples/photos/App.css | 1 + .../pages/react-aria/examples/photos/App.tsx | 2 +- .../pages/react-aria/examples/plants/App.tsx | 4 +- .../react-aria/examples/plants/Labels.tsx | 6 +- .../examples/plants/PlantActionMenu.tsx | 2 +- .../examples/plants/PlantDialog.tsx | 2 +- .../react-aria/examples/plants/PlantList.tsx | 2 +- .../react-aria/examples/plants/PlantTable.tsx | 2 +- .../react-aria/examples/plants/plants.ts | 256 ++++++++++++++++++ .../examples/plants/plants/agapanthus.jpg | Bin 0 -> 124915 bytes .../examples/plants/plants/aloe.jpg | Bin 0 -> 110529 bytes .../examples/plants/plants/dracaena.jpg | Bin 0 -> 94040 bytes .../examples/plants/plants/fern.jpg | Bin 0 -> 124442 bytes .../react-aria/examples/plants/plants/fig.jpg | Bin 0 -> 99588 bytes .../examples/plants/plants/gardenia.jpg | Bin 0 -> 112688 bytes .../react-aria/examples/plants/plants/ivy.jpg | Bin 0 -> 120770 bytes .../examples/plants/plants/jacaranda.jpg | Bin 0 -> 136234 bytes .../examples/plants/plants/maidenhair.jpg | Bin 0 -> 125530 bytes .../examples/plants/plants/money.jpg | Bin 0 -> 80336 bytes .../examples/plants/plants/monstera.jpg | Bin 0 -> 132270 bytes .../examples/plants/plants/morning.jpg | Bin 0 -> 87325 bytes .../examples/plants/plants/nasturtium.jpg | Bin 0 -> 113538 bytes .../examples/plants/plants/oleander.jpg | Bin 0 -> 113559 bytes .../examples/plants/plants/poplar.jpg | Bin 0 -> 136072 bytes .../examples/plants/plants/spider.jpg | Bin 0 -> 104647 bytes .../examples/plants/plants/star.jpg | Bin 0 -> 129927 bytes .../examples/plants/plants/tree_fern.jpg | Bin 0 -> 126119 bytes .../examples/plants/plants/xmas.jpg | Bin 0 -> 141004 bytes .../react-aria/examples/plants/plants/zz.jpg | Bin 0 -> 78466 bytes .../react-aria/examples/ripple-button.mdx | 2 +- .../react-aria/examples/swipeable-tabs.mdx | 14 +- packages/dev/s2-docs/pages/s2/Calendar.mdx | 16 +- packages/dev/s2-docs/pages/s2/Menu.mdx | 2 +- .../dev/s2-docs/pages/s2/RangeCalendar.mdx | 16 +- packages/dev/s2-docs/pages/s2/Skeleton.mdx | 2 +- packages/dev/s2-docs/src/BundlerSwitcher.tsx | 32 +-- packages/dev/s2-docs/src/CodeBlock.tsx | 193 +++++++++---- packages/dev/s2-docs/src/CodeFold.tsx | 2 +- packages/dev/s2-docs/src/CodePlatter.tsx | 111 +++++--- packages/dev/s2-docs/src/CodeSandbox.tsx | 50 ++-- .../dev/s2-docs/src/ComponentCardView.tsx | 52 +++- packages/dev/s2-docs/src/ExampleApp.tsx | 17 +- packages/dev/s2-docs/src/ExampleSwitcher.tsx | 64 ++--- packages/dev/s2-docs/src/InstallCommand.tsx | 18 +- packages/dev/s2-docs/src/SearchMenu.tsx | 36 ++- .../dev/s2-docs/src/SearchMenuTrigger.tsx | 5 +- packages/dev/s2-docs/src/ShadcnCommand.tsx | 15 +- packages/dev/s2-docs/src/StackBlitz.tsx | 30 +- packages/dev/s2-docs/src/StarterKits.tsx | 2 +- packages/dev/s2-docs/src/Step.tsx | 14 - packages/dev/s2-docs/src/VisualExample.tsx | 37 ++- .../dev/s2-docs/src/VisualExampleClient.tsx | 52 ++-- packages/dev/s2-docs/src/useLocalStorage.ts | 71 +++++ packages/react-aria-components/src/Tabs.tsx | 2 +- 70 files changed, 853 insertions(+), 434 deletions(-) rename packages/dev/s2-docs/pages/react-aria/examples/{EmojiPicker => }/EmojiPicker.css (100%) delete mode 100644 packages/dev/s2-docs/pages/react-aria/examples/EmojiPicker/EmojiPicker.tsx rename packages/dev/s2-docs/pages/react-aria/examples/{tabs => }/Tab.tsx (100%) rename packages/dev/s2-docs/pages/react-aria/examples/{tabs => }/TabList.tsx (100%) rename packages/dev/s2-docs/pages/react-aria/examples/{tabs => }/TabPanel.tsx (100%) rename packages/dev/s2-docs/pages/react-aria/examples/{tabs => }/TabPanelCarousel.tsx (100%) rename packages/dev/s2-docs/pages/react-aria/examples/{tabs => }/TabSelectionIndicator.tsx (100%) rename packages/dev/s2-docs/pages/react-aria/examples/{tabs => }/Tabs.tsx (100%) create mode 100644 packages/dev/s2-docs/pages/react-aria/examples/plants/plants.ts create mode 100644 packages/dev/s2-docs/pages/react-aria/examples/plants/plants/agapanthus.jpg create mode 100644 packages/dev/s2-docs/pages/react-aria/examples/plants/plants/aloe.jpg create mode 100644 packages/dev/s2-docs/pages/react-aria/examples/plants/plants/dracaena.jpg create mode 100644 packages/dev/s2-docs/pages/react-aria/examples/plants/plants/fern.jpg create mode 100644 packages/dev/s2-docs/pages/react-aria/examples/plants/plants/fig.jpg create mode 100644 packages/dev/s2-docs/pages/react-aria/examples/plants/plants/gardenia.jpg create mode 100644 packages/dev/s2-docs/pages/react-aria/examples/plants/plants/ivy.jpg create mode 100644 packages/dev/s2-docs/pages/react-aria/examples/plants/plants/jacaranda.jpg create mode 100644 packages/dev/s2-docs/pages/react-aria/examples/plants/plants/maidenhair.jpg create mode 100644 packages/dev/s2-docs/pages/react-aria/examples/plants/plants/money.jpg create mode 100644 packages/dev/s2-docs/pages/react-aria/examples/plants/plants/monstera.jpg create mode 100644 packages/dev/s2-docs/pages/react-aria/examples/plants/plants/morning.jpg create mode 100644 packages/dev/s2-docs/pages/react-aria/examples/plants/plants/nasturtium.jpg create mode 100644 packages/dev/s2-docs/pages/react-aria/examples/plants/plants/oleander.jpg create mode 100644 packages/dev/s2-docs/pages/react-aria/examples/plants/plants/poplar.jpg create mode 100644 packages/dev/s2-docs/pages/react-aria/examples/plants/plants/spider.jpg create mode 100644 packages/dev/s2-docs/pages/react-aria/examples/plants/plants/star.jpg create mode 100644 packages/dev/s2-docs/pages/react-aria/examples/plants/plants/tree_fern.jpg create mode 100644 packages/dev/s2-docs/pages/react-aria/examples/plants/plants/xmas.jpg create mode 100644 packages/dev/s2-docs/pages/react-aria/examples/plants/plants/zz.jpg create mode 100644 packages/dev/s2-docs/src/useLocalStorage.ts diff --git a/.circleci/config.yml b/.circleci/config.yml index 26b0f100c9c..c2b8ad22988 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -16,14 +16,14 @@ parameters: executors: rsp: docker: - - image: cimg/node:22.13.1 + - image: cimg/node:22.21.1 environment: CACHE_VERSION: v1 working_directory: ~/react-spectrum rsp-large: docker: - - image: cimg/node:22.13.1 + - image: cimg/node:22.21.1 resource_class: large environment: CACHE_VERSION: v1 @@ -31,7 +31,7 @@ executors: rsp-xlarge: docker: - - image: cimg/node:22.13.1 + - image: cimg/node:22.21.1 resource_class: xlarge environment: CACHE_VERSION: v1 @@ -39,7 +39,7 @@ executors: rsp-2xlarge: docker: - - image: cimg/node:22.13.1 + - image: cimg/node:22.21.1 resource_class: 2xlarge environment: CACHE_VERSION: v1 diff --git a/packages/@react-spectrum/s2/src/Tabs.tsx b/packages/@react-spectrum/s2/src/Tabs.tsx index e3af2c8fb9b..f6646dcc4aa 100644 --- a/packages/@react-spectrum/s2/src/Tabs.tsx +++ b/packages/@react-spectrum/s2/src/Tabs.tsx @@ -448,7 +448,11 @@ const tabPanel = style({ marginTop: 4, color: 'gray-800', flexGrow: 1, - minHeight: 0 + minHeight: 0, + display: { + default: 'block', + isInert: 'none' + } }, getAllowedOverrides({height: true})); export function TabPanel(props: TabPanelProps): ReactNode | null { diff --git a/packages/dev/s2-docs/pages/react-aria/Calendar.mdx b/packages/dev/s2-docs/pages/react-aria/Calendar.mdx index 4325cdc604c..37de09881a0 100644 --- a/packages/dev/s2-docs/pages/react-aria/Calendar.mdx +++ b/packages/dev/s2-docs/pages/react-aria/Calendar.mdx @@ -85,13 +85,15 @@ import type {AnyCalendarDate} from '@internationalized/date'; import {CalendarDate, startOfWeek, toCalendar, GregorianCalendar} from '@internationalized/date'; import {Calendar} from 'vanilla-starter/Calendar'; -export default ( - new Custom454()} /> - ///- end highlight -/// -); +export default function Example() { + return ( + new Custom454()} /> + ///- end highlight -/// + ); +} // See @internationalized/date docs linked above. ///- begin collapse -/// diff --git a/packages/dev/s2-docs/pages/react-aria/DropZone.mdx b/packages/dev/s2-docs/pages/react-aria/DropZone.mdx index bbba85ff6c2..74d53895a07 100644 --- a/packages/dev/s2-docs/pages/react-aria/DropZone.mdx +++ b/packages/dev/s2-docs/pages/react-aria/DropZone.mdx @@ -86,6 +86,7 @@ export const tags = ['file', 'drag', 'dnd', 'upload']; ); + } ``` diff --git a/packages/dev/s2-docs/pages/react-aria/RangeCalendar.mdx b/packages/dev/s2-docs/pages/react-aria/RangeCalendar.mdx index 7d746d4392b..b189c1b42d1 100644 --- a/packages/dev/s2-docs/pages/react-aria/RangeCalendar.mdx +++ b/packages/dev/s2-docs/pages/react-aria/RangeCalendar.mdx @@ -95,13 +95,15 @@ import type {AnyCalendarDate} from '@internationalized/date'; import {CalendarDate, startOfWeek, toCalendar, GregorianCalendar} from '@internationalized/date'; import {RangeCalendar} from 'vanilla-starter/RangeCalendar'; -export default ( - new Custom454()} /> - ///- end highlight -/// -); +export default function Example() { + return ( + new Custom454()} /> + ///- end highlight -/// + ); +} // See @internationalized/date docs linked above. ///- begin collapse -/// diff --git a/packages/dev/s2-docs/pages/react-aria/examples/EmojiPicker/EmojiPicker.css b/packages/dev/s2-docs/pages/react-aria/examples/EmojiPicker.css similarity index 100% rename from packages/dev/s2-docs/pages/react-aria/examples/EmojiPicker/EmojiPicker.css rename to packages/dev/s2-docs/pages/react-aria/examples/EmojiPicker.css diff --git a/packages/dev/s2-docs/pages/react-aria/examples/EmojiPicker/EmojiPicker.tsx b/packages/dev/s2-docs/pages/react-aria/examples/EmojiPicker/EmojiPicker.tsx deleted file mode 100644 index 9ee9068c68e..00000000000 --- a/packages/dev/s2-docs/pages/react-aria/examples/EmojiPicker/EmojiPicker.tsx +++ /dev/null @@ -1,50 +0,0 @@ -"use client"; -import {Autocomplete, GridLayout, ListBox, ListBoxItem, Select, SelectValue, Size, useFilter, Virtualizer} from 'react-aria-components'; -import {Button} from 'vanilla-starter/Button'; -import {Popover} from 'vanilla-starter/Popover'; -import {SearchField} from 'vanilla-starter/SearchField'; -import _emojis from 'emojibase-data/en/compact.json'; -import './EmojiPicker.css'; - -const emojis = _emojis.filter((e) => !e.label.startsWith('regional indicator')); - -export function EmojiPicker() { - let {contains} = useFilter({ sensitivity: 'base' }); - - return ( - - ); -} - -function EmojiItem({ id, item }: { id: string; item: (typeof emojis)[0] }) { - return ( - - {item.unicode} - - ); -} diff --git a/packages/dev/s2-docs/pages/react-aria/examples/tabs/Tab.tsx b/packages/dev/s2-docs/pages/react-aria/examples/Tab.tsx similarity index 100% rename from packages/dev/s2-docs/pages/react-aria/examples/tabs/Tab.tsx rename to packages/dev/s2-docs/pages/react-aria/examples/Tab.tsx diff --git a/packages/dev/s2-docs/pages/react-aria/examples/tabs/TabList.tsx b/packages/dev/s2-docs/pages/react-aria/examples/TabList.tsx similarity index 100% rename from packages/dev/s2-docs/pages/react-aria/examples/tabs/TabList.tsx rename to packages/dev/s2-docs/pages/react-aria/examples/TabList.tsx diff --git a/packages/dev/s2-docs/pages/react-aria/examples/tabs/TabPanel.tsx b/packages/dev/s2-docs/pages/react-aria/examples/TabPanel.tsx similarity index 100% rename from packages/dev/s2-docs/pages/react-aria/examples/tabs/TabPanel.tsx rename to packages/dev/s2-docs/pages/react-aria/examples/TabPanel.tsx diff --git a/packages/dev/s2-docs/pages/react-aria/examples/tabs/TabPanelCarousel.tsx b/packages/dev/s2-docs/pages/react-aria/examples/TabPanelCarousel.tsx similarity index 100% rename from packages/dev/s2-docs/pages/react-aria/examples/tabs/TabPanelCarousel.tsx rename to packages/dev/s2-docs/pages/react-aria/examples/TabPanelCarousel.tsx diff --git a/packages/dev/s2-docs/pages/react-aria/examples/tabs/TabSelectionIndicator.tsx b/packages/dev/s2-docs/pages/react-aria/examples/TabSelectionIndicator.tsx similarity index 100% rename from packages/dev/s2-docs/pages/react-aria/examples/tabs/TabSelectionIndicator.tsx rename to packages/dev/s2-docs/pages/react-aria/examples/TabSelectionIndicator.tsx diff --git a/packages/dev/s2-docs/pages/react-aria/examples/tabs/Tabs.tsx b/packages/dev/s2-docs/pages/react-aria/examples/Tabs.tsx similarity index 100% rename from packages/dev/s2-docs/pages/react-aria/examples/tabs/Tabs.tsx rename to packages/dev/s2-docs/pages/react-aria/examples/Tabs.tsx diff --git a/packages/dev/s2-docs/pages/react-aria/examples/crud.mdx b/packages/dev/s2-docs/pages/react-aria/examples/crud.mdx index 9f0ad710b22..a95ecbf1479 100644 --- a/packages/dev/s2-docs/pages/react-aria/examples/crud.mdx +++ b/packages/dev/s2-docs/pages/react-aria/examples/crud.mdx @@ -3,7 +3,7 @@ export default Layout; import '../../../tailwind/tailwind.css'; -import {App} from './plants/App'; +import App from './plants/App'; import {ExampleApp} from '../../../src/ExampleApp'; import {ComponentList} from '../../../src/ComponentCard'; @@ -18,7 +18,7 @@ export const description = 'Table with search, filters, column resizing, and for - + ## Components diff --git a/packages/dev/s2-docs/pages/react-aria/examples/emoji-picker.mdx b/packages/dev/s2-docs/pages/react-aria/examples/emoji-picker.mdx index a242b406b84..71651f9095f 100644 --- a/packages/dev/s2-docs/pages/react-aria/examples/emoji-picker.mdx +++ b/packages/dev/s2-docs/pages/react-aria/examples/emoji-picker.mdx @@ -12,11 +12,57 @@ export const description = 'With autocomplete, virtualized scrolling, and keyboa An emoji picker with autocomplete, virtualized scrolling, and arrow key navigation. -```tsx render files={['packages/dev/s2-docs/pages/react-aria/examples/EmojiPicker/EmojiPicker.tsx', 'packages/dev/s2-docs/pages/react-aria/examples/EmojiPicker/EmojiPicker.css']} type="vanilla" hideExampleCode expanded includeAllImports +```tsx render dir="react-aria/examples" files={['packages/dev/s2-docs/pages/react-aria/examples/EmojiPicker.css']} type="vanilla" expanded includeAllImports "use client"; -import {EmojiPicker} from './EmojiPicker/EmojiPicker'; +import {Autocomplete, GridLayout, ListBox, ListBoxItem, Select, SelectValue, Size, useFilter, Virtualizer} from 'react-aria-components'; +import {Button} from 'vanilla-starter/Button'; +import {Popover} from 'vanilla-starter/Popover'; +import {SearchField} from 'vanilla-starter/SearchField'; +import _emojis from 'emojibase-data/en/compact.json'; +import './EmojiPicker.css'; - +const emojis = _emojis.filter((e) => !e.label.startsWith('regional indicator')); + +export default function EmojiPicker() { + let {contains} = useFilter({ sensitivity: 'base' }); + + return ( + + ); +} + +function EmojiItem({ id, item }: { id: string; item: (typeof emojis)[0] }) { + return ( + + {item.unicode} + + ); +} ``` ## Components diff --git a/packages/dev/s2-docs/pages/react-aria/examples/photos.mdx b/packages/dev/s2-docs/pages/react-aria/examples/photos.mdx index 502bb85f7c6..c1c7a744713 100644 --- a/packages/dev/s2-docs/pages/react-aria/examples/photos.mdx +++ b/packages/dev/s2-docs/pages/react-aria/examples/photos.mdx @@ -1,7 +1,7 @@ import {Layout} from '../../../src/Layout'; export default Layout; -import {App} from './photos/App'; +import App from './photos/App'; import {ExampleApp} from '../../../src/ExampleApp'; import {ComponentList} from '../../../src/ComponentCard'; diff --git a/packages/dev/s2-docs/pages/react-aria/examples/photos/App.css b/packages/dev/s2-docs/pages/react-aria/examples/photos/App.css index 629b3d4d444..fa901e5dc7d 100644 --- a/packages/dev/s2-docs/pages/react-aria/examples/photos/App.css +++ b/packages/dev/s2-docs/pages/react-aria/examples/photos/App.css @@ -7,6 +7,7 @@ padding: 0; color-scheme: light dark; font: 1rem system-ui; + color: light-dark(black, white); background: light-dark(white, #111); border: 1px solid light-dark(#eee, #222); border-radius: 10px; diff --git a/packages/dev/s2-docs/pages/react-aria/examples/photos/App.tsx b/packages/dev/s2-docs/pages/react-aria/examples/photos/App.tsx index eada54fa1e9..77a6da3314e 100644 --- a/packages/dev/s2-docs/pages/react-aria/examples/photos/App.tsx +++ b/packages/dev/s2-docs/pages/react-aria/examples/photos/App.tsx @@ -8,7 +8,7 @@ import {PhotoDetail} from './PhotoDetail'; type Photo = typeof photos[0]; -export function App() { +export default function App() { let [album, setAlbum] = useState('library'); let [library, setLibrary] = useState(photos); let [isMobile, setMobile] = useState(false); diff --git a/packages/dev/s2-docs/pages/react-aria/examples/plants/App.tsx b/packages/dev/s2-docs/pages/react-aria/examples/plants/App.tsx index b922516411d..e167647027c 100644 --- a/packages/dev/s2-docs/pages/react-aria/examples/plants/App.tsx +++ b/packages/dev/s2-docs/pages/react-aria/examples/plants/App.tsx @@ -7,7 +7,7 @@ import {DialogTrigger, Heading, Key, Selection, SortDescriptor, TooltipTrigger} import {Dialog} from 'tailwind-starter/Dialog'; import {Menu, MenuItem, MenuTrigger} from 'tailwind-starter/Menu'; import {Modal} from 'tailwind-starter/Modal'; -import plants, {Plant} from '@react-spectrum/docs/pages/react-aria/home/plants'; +import plants, {Plant} from './plants'; import {Popover} from 'tailwind-starter/Popover'; import React, {useState} from 'react'; import {SearchField} from 'tailwind-starter/SearchField'; @@ -19,7 +19,7 @@ import {PlantTable} from './PlantTable'; import {PlantDialog} from './PlantDialog'; import {PlantList} from './PlantList'; -export function App(): React.ReactNode { +export default function App(): React.ReactNode { let [allItems, setAllItems] = useState(() => plants.map(p => ({...p, isFavorite: false}))); let [sortDescriptor, setSortDescriptor] = useState({ column: 'common_name', diff --git a/packages/dev/s2-docs/pages/react-aria/examples/plants/Labels.tsx b/packages/dev/s2-docs/pages/react-aria/examples/plants/Labels.tsx index 6a2e4e1fd6b..d04e39e7bb4 100644 --- a/packages/dev/s2-docs/pages/react-aria/examples/plants/Labels.tsx +++ b/packages/dev/s2-docs/pages/react-aria/examples/plants/Labels.tsx @@ -1,6 +1,6 @@ -import { Plant } from "@react-spectrum/docs/pages/react-aria/home/plants"; -import { CloudSun, Dessert, Droplet, Droplets, RefreshCw, Sun, SunDim } from "lucide-react"; -import { ReactElement } from "react"; +import { Plant } from './plants'; +import { CloudSun, Dessert, Droplet, Droplets, RefreshCw, Sun, SunDim } from 'lucide-react'; +import { ReactElement } from 'react'; const labelStyles = { gray: 'bg-gray-100 text-gray-600 border-gray-200 dark:bg-zinc-700 dark:text-zinc-300 dark:border-zinc-600', diff --git a/packages/dev/s2-docs/pages/react-aria/examples/plants/PlantActionMenu.tsx b/packages/dev/s2-docs/pages/react-aria/examples/plants/PlantActionMenu.tsx index 5f1d74cf040..0488dfb4988 100644 --- a/packages/dev/s2-docs/pages/react-aria/examples/plants/PlantActionMenu.tsx +++ b/packages/dev/s2-docs/pages/react-aria/examples/plants/PlantActionMenu.tsx @@ -1,7 +1,7 @@ import {Button} from 'tailwind-starter/Button'; import {Mail, MoreHorizontal, PencilIcon, ShareIcon, StarIcon, TrashIcon, Twitter} from 'lucide-react'; import {Menu, MenuItem, MenuTrigger, SubmenuTrigger} from 'tailwind-starter/Menu'; -import { Plant } from '@react-spectrum/docs/pages/react-aria/home/plants'; +import {Plant} from './plants'; interface PlantActionMenuProps { item: Plant, diff --git a/packages/dev/s2-docs/pages/react-aria/examples/plants/PlantDialog.tsx b/packages/dev/s2-docs/pages/react-aria/examples/plants/PlantDialog.tsx index f32eb413a3f..a98e9b72e7a 100644 --- a/packages/dev/s2-docs/pages/react-aria/examples/plants/PlantDialog.tsx +++ b/packages/dev/s2-docs/pages/react-aria/examples/plants/PlantDialog.tsx @@ -6,7 +6,7 @@ import {Dialog} from 'tailwind-starter/Dialog'; import {DropZone} from 'tailwind-starter/DropZone'; import {Form} from 'tailwind-starter/Form'; import {getLocalTimeZone, today} from '@internationalized/date'; -import plants, {Plant} from '@react-spectrum/docs/pages/react-aria/home/plants'; +import plants, {Plant} from './plants'; import {Select, SelectItem} from 'tailwind-starter/Select'; import {TextField} from 'tailwind-starter/TextField'; import {cycleIcon, getSunlight, sunIcons, wateringIcons} from './Labels'; diff --git a/packages/dev/s2-docs/pages/react-aria/examples/plants/PlantList.tsx b/packages/dev/s2-docs/pages/react-aria/examples/plants/PlantList.tsx index 734a578e5c7..72aa99d0898 100644 --- a/packages/dev/s2-docs/pages/react-aria/examples/plants/PlantList.tsx +++ b/packages/dev/s2-docs/pages/react-aria/examples/plants/PlantList.tsx @@ -1,6 +1,6 @@ "use client"; import {GridList, GridListItem} from 'tailwind-starter/GridList'; -import {Plant} from '@react-spectrum/docs/pages/react-aria/home/plants'; +import {Plant} from './plants'; import {PlantActionMenu} from './PlantActionMenu'; interface PlantListProps { diff --git a/packages/dev/s2-docs/pages/react-aria/examples/plants/PlantTable.tsx b/packages/dev/s2-docs/pages/react-aria/examples/plants/PlantTable.tsx index 2c24fd21663..7ff2789a8b4 100644 --- a/packages/dev/s2-docs/pages/react-aria/examples/plants/PlantTable.tsx +++ b/packages/dev/s2-docs/pages/react-aria/examples/plants/PlantTable.tsx @@ -2,7 +2,7 @@ import {Cell, Column, Row, Table, TableHeader, TableBody} from 'tailwind-starter import {StarIcon} from 'lucide-react'; import {ColumnProps, Key, SortDescriptor, ToggleButton, ToggleButtonProps, VisuallyHidden} from 'react-aria-components'; import {focusRing} from 'tailwind-starter/utils'; -import {Plant} from '@react-spectrum/docs/pages/react-aria/home/plants'; +import {Plant} from './plants'; import React, {useMemo} from 'react'; import {tv} from 'tailwind-variants'; import {CycleLabel, getSunlight, SunLabel, WateringLabel} from './Labels'; diff --git a/packages/dev/s2-docs/pages/react-aria/examples/plants/plants.ts b/packages/dev/s2-docs/pages/react-aria/examples/plants/plants.ts new file mode 100644 index 00000000000..d5d334c336b --- /dev/null +++ b/packages/dev/s2-docs/pages/react-aria/examples/plants/plants.ts @@ -0,0 +1,256 @@ +import agapanthus from 'url:./plants/agapanthus.jpg'; +import aloe from 'url:./plants/aloe.jpg'; +import dracaena from 'url:./plants/dracaena.jpg'; +import fern from 'url:./plants/fern.jpg'; +import fig from 'url:./plants/fig.jpg'; +import gardenia from 'url:./plants/gardenia.jpg'; +import ivy from 'url:./plants/ivy.jpg'; +import jacaranda from 'url:./plants/jacaranda.jpg'; +import maidenhair from 'url:./plants/maidenhair.jpg'; +import money from 'url:./plants/money.jpg'; +import monstera from 'url:./plants/monstera.jpg'; +import morning from 'url:./plants/morning.jpg'; +import nasturtium from 'url:./plants/nasturtium.jpg'; +import oleander from 'url:./plants/oleander.jpg'; +import poplar from 'url:./plants/poplar.jpg'; +import spider from 'url:./plants/spider.jpg'; +import star from 'url:./plants/star.jpg'; +import tree_fern from 'url:./plants/tree_fern.jpg'; +import xmas from 'url:./plants/xmas.jpg'; +import zz from 'url:./plants/zz.jpg'; + +export interface Plant { + id: number, + common_name: string, + scientific_name: string[], + watering: string, + sunlight: string[], + cycle: string, + default_image: { + thumbnail: string + }, + isFavorite?: boolean +} + +export default [ + { + id: 1, + common_name: 'Aloe', + scientific_name: ['Aloe vera'], + watering: 'Minimum', + sunlight: ['full sun'], + cycle: 'Perennial', + default_image: { + thumbnail: aloe + } + }, + { + id: 2, + common_name: 'Blue Jacaranda', + scientific_name: ['Jacaranda mimosifolia'], + watering: 'Minimum', + sunlight: ['full sun'], + cycle: 'Perennial', + default_image: { + thumbnail: jacaranda + } + }, + { + id: 3, + common_name: 'Oleander', + scientific_name: ['Nerium oleander'], + watering: 'Minimum', + sunlight: ['full sun'], + cycle: 'Perennial', + default_image: { + thumbnail: oleander + } + }, + { + id: 4, + common_name: 'Poplar', + scientific_name: ['Populus'], + watering: 'Average', + sunlight: ['full sun'], + cycle: 'Perennial', + default_image: { + thumbnail: poplar + } + }, + { + id: 5, + common_name: 'Zanzibar Gem', + scientific_name: ['Zamioculcas'], + watering: 'Average', + sunlight: ['part sun'], + cycle: 'Perennial', + default_image: { + thumbnail: zz + } + }, + { + id: 6, + common_name: 'Morning Glory', + scientific_name: ['Ipomoea'], + watering: 'Frequent', + sunlight: ['full sun'], + cycle: 'Perennial', + default_image: { + thumbnail: morning + } + }, + { + id: 7, + common_name: 'Christmas Bush', + scientific_name: ['Ceratopetalum gummiferum'], + watering: 'Average', + sunlight: ['full sun'], + cycle: 'Perennial', + default_image: { + thumbnail: xmas + } + }, + { + id: 8, + common_name: 'Gardenia', + scientific_name: ['Gardenia jasminoides'], + watering: 'Average', + sunlight: ['part sun'], + cycle: 'Perennial', + default_image: { + thumbnail: gardenia + } + }, + { + id: 9, + common_name: 'Spider Plant', + scientific_name: ['Chlorophytum comosum'], + watering: 'Average', + sunlight: ['part sun'], + cycle: 'Perennial', + default_image: { + thumbnail: spider + } + }, + { + id: 10, + common_name: 'Chinese Money Plant', + scientific_name: ['Pilea peperomioides'], + watering: 'Average', + sunlight: ['part sun'], + cycle: 'Perennial', + default_image: { + thumbnail: money + } + }, + { + id: 11, + common_name: 'Fiddle Leaf Fig', + scientific_name: ['Ficus lyrata'], + watering: 'Average', + sunlight: ['full sun'], + cycle: 'Perennial', + default_image: { + thumbnail: fig + } + }, + { + id: 12, + common_name: 'Tuberous Sword Fern', + scientific_name: ['Nephrolepis cordifolia'], + watering: 'Frequent', + sunlight: ['part shade'], + cycle: 'Perennial', + default_image: { + thumbnail: fern + } + }, + { + id: 13, + common_name: 'Star Jasmine', + scientific_name: ['Trachelospermum jasminoides'], + watering: 'Frequent', + sunlight: ['full sun'], + cycle: 'Perennial', + default_image: { + thumbnail: star + } + }, + { + id: 14, + common_name: 'Split-leaf Philodendron', + scientific_name: ['Monstera deliciosa'], + watering: 'Frequent', + sunlight: ['part shade'], + cycle: 'Perennial', + default_image: { + thumbnail: monstera + } + }, + { + id: 15, + common_name: 'Agapanthus', + scientific_name: ['Agapanthus praecox'], + watering: 'Minimum', + sunlight: ['full sun'], + cycle: 'Perennial', + default_image: { + thumbnail: agapanthus + } + }, + { + id: 16, + common_name: 'Tree Fern', + scientific_name: ['Cyatheaceae'], + watering: 'Frequent', + sunlight: ['part sun'], + cycle: 'Annual', + default_image: { + thumbnail: tree_fern + } + }, + { + id: 17, + common_name: 'Striped Dracaena', + scientific_name: ['Asparagaceae'], + watering: 'Average', + sunlight: ['part sun'], + cycle: 'Perennial', + default_image: { + thumbnail: dracaena + } + }, + { + id: 18, + common_name: 'Delta Maidenhair Fern', + scientific_name: ['Adiantum raddianum'], + watering: 'Average', + sunlight: ['part shade'], + cycle: 'Perennial', + default_image: { + thumbnail: maidenhair + } + }, + { + id: 19, + common_name: 'Ivy', + scientific_name: ['Hedera'], + watering: 'Frequent', + sunlight: ['part sun'], + cycle: 'Perennial', + default_image: { + thumbnail: ivy + } + }, + { + id: 20, + common_name: 'Nasturtium', + scientific_name: ['Tropaeolum'], + watering: 'Average', + sunlight: ['full sun'], + cycle: 'Annual', + default_image: { + thumbnail: nasturtium + } + } +] as Plant[]; diff --git a/packages/dev/s2-docs/pages/react-aria/examples/plants/plants/agapanthus.jpg b/packages/dev/s2-docs/pages/react-aria/examples/plants/plants/agapanthus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..30b911f42f470751417b39e382f323d660c5599f GIT binary patch literal 124915 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