# Ropav — full reference Generated from the library's own sources. The site is https://ropav.netlify.app. ```bash npm install ropav ``` ```ts import "ropav/styles/bundled.css"; import { Button } from "ropav"; ``` The published package also carries one subpath per family — `import { Button } from "ropav/button"` — so a bundler drops what is never imported. ## Rules Ropav components are compound: a family root provides context and named parts arrange inside it. The arrangement is the API, and it is not guessable from the names. - A part only works inside its root. Contexts are strict, so a part rendered outside its family throws during setup rather than degrading. There is no standalone SelectTrigger. - Collections arrive as data, not as children. Select takes a required `items` array; `item-text-value` is the string typeahead matches and `item-key` is the identity. - Overlays take a positional trigger. Modal, Popover, Dropdown, Drawer and AlertDialog make their first child the trigger. There is no trigger slot. - The part holding the state is not always the root. Table takes `class` and `variant`; TableContent owns `aria-label`, `selection-mode`, `v-model:selected-keys` and `v-model:sort-descriptor`. - An indicator belongs to its item. TabsIndicator goes inside each TabsTab, ListBoxItemIndicator inside ListBoxItem, MenuItemIndicator inside MenuItem. - Menu parts are shared. There is no DropdownItem — compose MenuItem inside DropdownMenu. - Menu is the open list and needs its own Surface; Dropdown is that menu in a popover. - Every collection item needs an `id`, and a `text-value` when its content is not plain text. - Props are camelCase in the types and kebab-case in a template: `itemTextValue` is written `item-text-value`. - Every component forwards `class`, `aria-label`, `aria-labelledby` and `aria-describedby`; those are not repeated per component. # Patterns Whole screen fragments, each a single file that runs as it stands. The app shell is the frame the others go inside: put them in its `SidebarInset`, which already sets `min-width: 0`, so a table wider than the room it is given scrolls rather than stopping the sidebar collapsing. An overlay is teleported out of the inset, so that `overflow: hidden` never clips a menu, a dialog or a toast. ## Pattern: app-shell ```vue ``` ## Pattern: async ```vue ``` ## Pattern: data-table ```vue ``` ## Pattern: form ```vue