@neynar/ui 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/README.md +1 -1
  2. package/context7.json +17 -0
  3. package/llm/components/accordion.llm.md +205 -0
  4. package/llm/components/alert-dialog.llm.md +289 -0
  5. package/llm/components/alert.llm.md +310 -0
  6. package/llm/components/aspect-ratio.llm.md +110 -0
  7. package/llm/components/avatar.llm.md +282 -0
  8. package/llm/components/badge.llm.md +185 -0
  9. package/llm/components/blockquote.llm.md +86 -0
  10. package/llm/components/breadcrumb.llm.md +245 -0
  11. package/llm/components/button-group.llm.md +248 -0
  12. package/llm/components/button.llm.md +247 -0
  13. package/llm/components/calendar.llm.md +252 -0
  14. package/llm/components/card.llm.md +356 -0
  15. package/llm/components/carousel.llm.md +281 -0
  16. package/llm/components/chart.llm.md +278 -0
  17. package/llm/components/checkbox.llm.md +234 -0
  18. package/llm/components/code.llm.md +75 -0
  19. package/llm/components/collapsible.llm.md +271 -0
  20. package/llm/components/color-mode.llm.md +196 -0
  21. package/llm/components/combobox.llm.md +346 -0
  22. package/llm/components/command.llm.md +353 -0
  23. package/llm/components/context-menu.llm.md +368 -0
  24. package/llm/components/dialog.llm.md +283 -0
  25. package/llm/components/drawer.llm.md +326 -0
  26. package/llm/components/dropdown-menu.llm.md +404 -0
  27. package/llm/components/empty.llm.md +282 -0
  28. package/llm/components/field.llm.md +303 -0
  29. package/llm/components/first-light.llm.md +129 -0
  30. package/llm/components/hover-card.llm.md +278 -0
  31. package/llm/components/input-group.llm.md +334 -0
  32. package/llm/components/input-otp.llm.md +270 -0
  33. package/llm/components/input.llm.md +197 -0
  34. package/llm/components/item.llm.md +347 -0
  35. package/llm/components/kbd.llm.md +221 -0
  36. package/llm/components/label.llm.md +219 -0
  37. package/llm/components/menubar.llm.md +378 -0
  38. package/llm/components/navigation-menu.llm.md +320 -0
  39. package/llm/components/pagination.llm.md +337 -0
  40. package/llm/components/popover.llm.md +278 -0
  41. package/llm/components/progress.llm.md +259 -0
  42. package/llm/components/radio-group.llm.md +269 -0
  43. package/llm/components/resizable.llm.md +222 -0
  44. package/llm/components/scroll-area.llm.md +290 -0
  45. package/llm/components/select.llm.md +338 -0
  46. package/llm/components/separator.llm.md +129 -0
  47. package/llm/components/sheet.llm.md +275 -0
  48. package/llm/components/sidebar.llm.md +528 -0
  49. package/llm/components/skeleton.llm.md +140 -0
  50. package/llm/components/slider.llm.md +213 -0
  51. package/llm/components/sonner.llm.md +299 -0
  52. package/llm/components/spinner.llm.md +187 -0
  53. package/llm/components/switch.llm.md +258 -0
  54. package/llm/components/table.llm.md +334 -0
  55. package/llm/components/tabs.llm.md +245 -0
  56. package/llm/components/text.llm.md +108 -0
  57. package/llm/components/textarea.llm.md +236 -0
  58. package/llm/components/title.llm.md +88 -0
  59. package/llm/components/toggle-group.llm.md +228 -0
  60. package/llm/components/toggle.llm.md +235 -0
  61. package/llm/components/tooltip.llm.md +191 -0
  62. package/llm/contributing.llm.md +273 -0
  63. package/llm/hooks.llm.md +91 -0
  64. package/llm/index.llm.md +178 -0
  65. package/llm/theming.llm.md +381 -0
  66. package/llm/utilities.llm.md +97 -0
  67. package/llms-full.txt +15995 -0
  68. package/llms.txt +182 -0
  69. package/package.json +6 -2
@@ -0,0 +1,273 @@
1
+ # Contributing to @neynar/ui (LLM Guide)
2
+
3
+ Technical reference for AI assistants modifying this package.
4
+
5
+ ## Critical Rules
6
+
7
+ 1. **Never export defaults** - Named exports only
8
+ 2. **Always add `data-slot`** - Root element of every component
9
+ 3. **Use `type` not `interface`** - For prop definitions
10
+ 4. **`"use client"` only when needed** - Only for components using React hooks
11
+ 5. **Run type-check** - `yarn type-check` must pass before committing
12
+
13
+ ## File Locations
14
+
15
+ ```
16
+ src/
17
+ ├── components/
18
+ │ ├── ui/ # Base UI components
19
+ │ │ ├── button.tsx
20
+ │ │ └── stories/ # Storybook stories
21
+ │ │ └── button.stories.tsx
22
+ │ └── neynar/ # Neynar-specific components
23
+ │ ├── typography/
24
+ │ ├── color-mode/
25
+ │ └── first-light/
26
+ ├── hooks/ # Custom hooks
27
+ ├── lib/ # Utilities (cn, variants)
28
+ └── styles/ # CSS and themes
29
+ └── themes/
30
+
31
+ llm/ # LLM documentation
32
+ ├── components/ # Per-component docs
33
+ ├── index.llm.md # Package overview
34
+ ├── hooks.llm.md
35
+ ├── utilities.llm.md
36
+ └── theming.llm.md
37
+
38
+ package.json # Exports map (auto-generated)
39
+ ```
40
+
41
+ ## Component Template
42
+
43
+ ```tsx
44
+ // Add "use client" ONLY if component uses hooks
45
+ import { Primitive } from "@base-ui/react/primitive"
46
+ import { cva, type VariantProps } from "class-variance-authority"
47
+ import { cn } from "@/lib/utils"
48
+
49
+ const componentVariants = cva("base-classes", {
50
+ variants: {
51
+ variant: {
52
+ default: "...",
53
+ secondary: "...",
54
+ },
55
+ },
56
+ defaultVariants: {
57
+ variant: "default",
58
+ },
59
+ })
60
+
61
+ type ComponentProps = Primitive.Props & VariantProps<typeof componentVariants>
62
+
63
+ /**
64
+ * Brief description.
65
+ *
66
+ * @example
67
+ * ```tsx
68
+ * <Component>Content</Component>
69
+ * ```
70
+ */
71
+ function Component({ className, variant, ...props }: ComponentProps) {
72
+ return (
73
+ <Primitive
74
+ data-slot="component"
75
+ className={cn(componentVariants({ variant, className }))}
76
+ {...props}
77
+ />
78
+ )
79
+ }
80
+
81
+ export { Component, componentVariants, type ComponentProps }
82
+ ```
83
+
84
+ ## Story Template
85
+
86
+ ```tsx
87
+ import type { Meta, StoryObj } from "@storybook/react"
88
+ import { Component } from "../component"
89
+
90
+ const meta: Meta<typeof Component> = {
91
+ title: "UI/Component",
92
+ component: Component,
93
+ tags: ["autodocs"],
94
+ }
95
+
96
+ export default meta
97
+ type Story = StoryObj<typeof Component>
98
+
99
+ export const Default: Story = {
100
+ args: { children: "Example" },
101
+ }
102
+
103
+ export const Variants: Story = {
104
+ render: () => (
105
+ <div className="flex gap-4">
106
+ <Component variant="default">Default</Component>
107
+ <Component variant="secondary">Secondary</Component>
108
+ </div>
109
+ ),
110
+ }
111
+ ```
112
+
113
+ ## LLM Documentation Template
114
+
115
+ ```markdown
116
+ # ComponentName
117
+
118
+ One sentence description.
119
+
120
+ ## Import
121
+
122
+ \`\`\`tsx
123
+ import { Component } from "@neynar/ui/component"
124
+ \`\`\`
125
+
126
+ ## Usage
127
+
128
+ \`\`\`tsx
129
+ <Component>Content</Component>
130
+ \`\`\`
131
+
132
+ ## Props
133
+
134
+ | Prop | Type | Default | Description |
135
+ |------|------|---------|-------------|
136
+ | variant | "default" \| "secondary" | "default" | Visual style |
137
+
138
+ ## Examples
139
+
140
+ ### With variant
141
+ \`\`\`tsx
142
+ <Component variant="secondary">Secondary</Component>
143
+ \`\`\`
144
+ ```
145
+
146
+ ## data-slot Convention
147
+
148
+ Every component root element MUST have `data-slot`:
149
+
150
+ ```tsx
151
+ // Single component
152
+ <Button data-slot="button" />
153
+
154
+ // Compound component
155
+ <Dialog data-slot="dialog">
156
+ <DialogTrigger data-slot="dialog-trigger" />
157
+ <DialogContent data-slot="dialog-content">
158
+ <DialogHeader data-slot="dialog-header" />
159
+ <DialogTitle data-slot="dialog-title" />
160
+ <DialogDescription data-slot="dialog-description" />
161
+ <DialogFooter data-slot="dialog-footer" />
162
+ </DialogContent>
163
+ </Dialog>
164
+ ```
165
+
166
+ ## "use client" Rules
167
+
168
+ **ADD** when component:
169
+ - Uses `useState`, `useEffect`, `useRef`, `useContext`
170
+ - Uses custom hooks (`useColorMode`, `useMobile`)
171
+ - Has event handlers that need client hydration
172
+
173
+ **OMIT** when component:
174
+ - Is a pure wrapper around Base UI primitive
175
+ - Only passes props through
176
+ - Has no React hooks
177
+
178
+ Current components with `"use client"`:
179
+ - avatar, calendar, carousel, chart, collapsible
180
+ - combobox, command, dialog, drawer, field
181
+ - hover-card, input-otp, label, progress, resizable
182
+ - select, sidebar, slider, switch, tabs
183
+ - toggle-group, tooltip
184
+ - color-mode/*, first-light/*
185
+
186
+ ## Semantic Color Tokens
187
+
188
+ ```css
189
+ /* Backgrounds */
190
+ bg-background, bg-card, bg-popover, bg-muted, bg-accent
191
+
192
+ /* Foregrounds */
193
+ text-foreground, text-muted-foreground, text-card-foreground
194
+
195
+ /* Status */
196
+ bg-primary, text-primary-foreground
197
+ bg-secondary, text-secondary-foreground
198
+ bg-destructive, text-destructive
199
+ bg-success, text-success
200
+ bg-warning, text-warning
201
+ bg-info, text-info
202
+
203
+ /* Borders */
204
+ border-border, border-input, border-ring
205
+ ```
206
+
207
+ ## Package.json Exports
208
+
209
+ Exports are auto-generated by `scripts/generate-exports.ts` during build.
210
+
211
+ Each component gets an entry:
212
+ ```json
213
+ {
214
+ "./button": {
215
+ "types": "./dist/components/ui/button.d.ts",
216
+ "import": "./dist/components/ui/button.js"
217
+ }
218
+ }
219
+ ```
220
+
221
+ ## Validation Commands
222
+
223
+ ```bash
224
+ # Must pass before commit
225
+ yarn type-check # TypeScript
226
+ yarn lint # ESLint
227
+ yarn build # Build check
228
+
229
+ # Development
230
+ yarn storybook # Visual testing
231
+ ```
232
+
233
+ ## Common Patterns
234
+
235
+ ### Polymorphism with `render` prop
236
+ ```tsx
237
+ <Button render={<a href="/link" />}>Link Button</Button>
238
+ ```
239
+
240
+ ### Compound Components
241
+ ```tsx
242
+ <Dialog>
243
+ <DialogTrigger>Open</DialogTrigger>
244
+ <DialogContent>
245
+ <DialogTitle>Title</DialogTitle>
246
+ <DialogDescription>Description</DialogDescription>
247
+ </DialogContent>
248
+ </Dialog>
249
+ ```
250
+
251
+ ### Forwarding refs (handled by Base UI)
252
+ ```tsx
253
+ // Base UI handles ref forwarding automatically
254
+ // No need for forwardRef wrapper
255
+ function Component(props: ComponentProps) {
256
+ return <Primitive {...props} />
257
+ }
258
+ ```
259
+
260
+ ### Icon sizing
261
+ ```tsx
262
+ // Icons auto-size via [&_svg:not([class*='size-'])]:size-4
263
+ <Button>
264
+ <PlusIcon /> {/* Inherits size-4 */}
265
+ Add Item
266
+ </Button>
267
+ ```
268
+
269
+ ## Debugging Tips
270
+
271
+ - Check `data-slot` attributes in DevTools for component boundaries
272
+ - Use `?path=/story/ui-button--default` in Storybook URL
273
+ - Run `yarn type-check 2>&1 | head -20` for focused error output
@@ -0,0 +1,91 @@
1
+ # Hooks
2
+
3
+ React hooks provided by @neynar/ui.
4
+
5
+ ## useIsMobile
6
+
7
+ Detects mobile viewport using `matchMedia`. Returns reactive boolean.
8
+
9
+ ### Import
10
+
11
+ ```tsx
12
+ import { useIsMobile } from "@neynar/ui/use-mobile"
13
+ ```
14
+
15
+ ### Returns
16
+
17
+ | Type | Description |
18
+ |------|-------------|
19
+ | `boolean` | `true` when viewport < 768px, `false` otherwise |
20
+
21
+ ### Behavior
22
+
23
+ - Returns `false` during SSR (hydration-safe)
24
+ - Updates reactively on viewport resize
25
+ - Uses `matchMedia` for performance (no resize listener spam)
26
+ - Breakpoint: 768px (CSS `md:` equivalent)
27
+
28
+ ### Example: Responsive Navigation
29
+
30
+ ```tsx
31
+ import { useIsMobile } from "@neynar/ui/use-mobile"
32
+
33
+ function ResponsiveNav() {
34
+ const isMobile = useIsMobile()
35
+ return isMobile ? <MobileNav /> : <DesktopNav />
36
+ }
37
+ ```
38
+
39
+ ### Example: Responsive Modal
40
+
41
+ Use Sheet for mobile, Dialog for desktop:
42
+
43
+ ```tsx
44
+ import { useIsMobile } from "@neynar/ui/use-mobile"
45
+ import { Sheet, SheetContent } from "@neynar/ui/sheet"
46
+ import { Dialog, DialogContent } from "@neynar/ui/dialog"
47
+
48
+ function ResponsiveModal({ open, onOpenChange, children }) {
49
+ const isMobile = useIsMobile()
50
+
51
+ if (isMobile) {
52
+ return (
53
+ <Sheet open={open} onOpenChange={onOpenChange}>
54
+ <SheetContent side="bottom">{children}</SheetContent>
55
+ </Sheet>
56
+ )
57
+ }
58
+
59
+ return (
60
+ <Dialog open={open} onOpenChange={onOpenChange}>
61
+ <DialogContent>{children}</DialogContent>
62
+ </Dialog>
63
+ )
64
+ }
65
+ ```
66
+
67
+ ### Example: Conditional Rendering
68
+
69
+ ```tsx
70
+ import { useIsMobile } from "@neynar/ui/use-mobile"
71
+
72
+ function Dashboard() {
73
+ const isMobile = useIsMobile()
74
+
75
+ return (
76
+ <div className="flex">
77
+ {!isMobile && <Sidebar />}
78
+ <main className="flex-1">
79
+ <Content />
80
+ </main>
81
+ {isMobile && <MobileBottomNav />}
82
+ </div>
83
+ )
84
+ }
85
+ ```
86
+
87
+ ### Related
88
+
89
+ - [Sheet](./components/sheet.llm.md) - Often used with mobile detection for bottom sheets
90
+ - [Drawer](./components/drawer.llm.md) - Mobile-first bottom sheet component
91
+ - [Sidebar](./components/sidebar.llm.md) - Responsive sidebar that can use mobile detection
@@ -0,0 +1,178 @@
1
+ # @neynar/ui
2
+
3
+ > React component library built on Base UI primitives + Tailwind CSS v4. 53 production-ready components with per-component imports, SSR-safe dark mode, and two visual themes.
4
+
5
+ ## For AI Agents
6
+
7
+ **How to use this documentation:**
8
+
9
+ 1. **Start here** for quick reference and component discovery
10
+ 2. **Load specific component docs** from `./components/{name}.llm.md` when working with that component
11
+ 3. **Load theming.llm.md** when dealing with themes, colors, or dark mode
12
+ 4. **Each doc is self-contained** with imports, props, examples, and accessibility info
13
+
14
+ **Key patterns to remember:**
15
+ - Import path: `import { X } from "@neynar/ui/x"` (lowercase, kebab-case)
16
+ - All components have `data-slot` attributes for CSS targeting
17
+ - Compound components export multiple parts from same path
18
+ - `render` prop (not `asChild`) for polymorphism
19
+
20
+ ## Quick Start
21
+
22
+ ```tsx
23
+ import { Button } from "@neynar/ui/button";
24
+ import { Card, CardHeader, CardContent } from "@neynar/ui/card";
25
+ import "@neynar/ui/themes/purple-dawn";
26
+
27
+ export function App() {
28
+ return (
29
+ <Card>
30
+ <CardHeader>Welcome</CardHeader>
31
+ <CardContent>
32
+ <Button>Get Started</Button>
33
+ </CardContent>
34
+ </Card>
35
+ );
36
+ }
37
+ ```
38
+
39
+ ## Import Pattern
40
+
41
+ Each component has its own entry point:
42
+
43
+ ```tsx
44
+ import { Button } from "@neynar/ui/button";
45
+ import { Dialog, DialogTrigger, DialogContent } from "@neynar/ui/dialog";
46
+ import { Input } from "@neynar/ui/input";
47
+ import { cn } from "@neynar/ui/utils";
48
+ ```
49
+
50
+ ## Themes
51
+
52
+ ```tsx
53
+ // Purple Dawn - elegant translucent surfaces (default)
54
+ import "@neynar/ui/themes/purple-dawn";
55
+
56
+ // First Light - hand-drawn wireframe aesthetic
57
+ import "@neynar/ui/themes/first-light";
58
+ ```
59
+
60
+ ## Color Mode
61
+
62
+ SSR-safe dark mode with automatic system detection:
63
+
64
+ ```tsx
65
+ import { ColorModeInitializer, ColorModeToggle } from "@neynar/ui/color-mode";
66
+
67
+ // In layout.tsx <head>
68
+ <ColorModeInitializer />
69
+
70
+ // Anywhere for user control
71
+ <ColorModeToggle />
72
+ ```
73
+
74
+ ## Component Index
75
+
76
+ ### Core Inputs
77
+ | Component | Import Path | Description |
78
+ |-----------|-------------|-------------|
79
+ | Button | `@neynar/ui/button` | 9 variants, 8 sizes |
80
+ | Checkbox | `@neynar/ui/checkbox` | Boolean toggle |
81
+ | Input | `@neynar/ui/input` | Text input |
82
+ | RadioGroup | `@neynar/ui/radio-group` | Single selection |
83
+ | Select | `@neynar/ui/select` | Dropdown selection |
84
+ | Slider | `@neynar/ui/slider` | Range input |
85
+ | Switch | `@neynar/ui/switch` | Toggle switch |
86
+ | Textarea | `@neynar/ui/textarea` | Multi-line text |
87
+ | Toggle | `@neynar/ui/toggle` | Pressable toggle |
88
+ | ToggleGroup | `@neynar/ui/toggle-group` | Multiple toggles |
89
+ | Combobox | `@neynar/ui/combobox` | Searchable select |
90
+
91
+ ### Form & Field
92
+ | Component | Import Path | Description |
93
+ |-----------|-------------|-------------|
94
+ | ButtonGroup | `@neynar/ui/button-group` | Connected buttons |
95
+ | Calendar | `@neynar/ui/calendar` | Date picker |
96
+ | Field | `@neynar/ui/field` | Form field wrapper |
97
+ | InputGroup | `@neynar/ui/input-group` | Input with addons |
98
+ | InputOTP | `@neynar/ui/input-otp` | One-time password |
99
+ | Label | `@neynar/ui/label` | Form labels |
100
+
101
+ ### Layout & Structure
102
+ | Component | Import Path | Description |
103
+ |-----------|-------------|-------------|
104
+ | Accordion | `@neynar/ui/accordion` | Expandable sections |
105
+ | AspectRatio | `@neynar/ui/aspect-ratio` | Maintain ratio |
106
+ | Card | `@neynar/ui/card` | Content container |
107
+ | Collapsible | `@neynar/ui/collapsible` | Show/hide content |
108
+ | Resizable | `@neynar/ui/resizable` | Resizable panels |
109
+ | ScrollArea | `@neynar/ui/scroll-area` | Custom scrollbars |
110
+ | Separator | `@neynar/ui/separator` | Visual divider |
111
+ | Table | `@neynar/ui/table` | Data tables |
112
+
113
+ ### Navigation & Menus
114
+ | Component | Import Path | Description |
115
+ |-----------|-------------|-------------|
116
+ | Breadcrumb | `@neynar/ui/breadcrumb` | Path indicator |
117
+ | ContextMenu | `@neynar/ui/context-menu` | Right-click menu |
118
+ | DropdownMenu | `@neynar/ui/dropdown-menu` | Trigger dropdown |
119
+ | Menubar | `@neynar/ui/menubar` | Horizontal menu |
120
+ | NavigationMenu | `@neynar/ui/navigation-menu` | Site navigation |
121
+ | Pagination | `@neynar/ui/pagination` | Page navigation |
122
+ | Sidebar | `@neynar/ui/sidebar` | Collapsible nav |
123
+ | Tabs | `@neynar/ui/tabs` | Tabbed content |
124
+
125
+ ### Overlays & Dialogs
126
+ | Component | Import Path | Description |
127
+ |-----------|-------------|-------------|
128
+ | AlertDialog | `@neynar/ui/alert-dialog` | Confirmation |
129
+ | Dialog | `@neynar/ui/dialog` | Modal dialog |
130
+ | Drawer | `@neynar/ui/drawer` | Bottom drawer |
131
+ | HoverCard | `@neynar/ui/hover-card` | Rich hover preview |
132
+ | Popover | `@neynar/ui/popover` | Floating content |
133
+ | Sheet | `@neynar/ui/sheet` | Side panel |
134
+ | Tooltip | `@neynar/ui/tooltip` | Hover info |
135
+
136
+ ### Feedback & Status
137
+ | Component | Import Path | Description |
138
+ |-----------|-------------|-------------|
139
+ | Alert | `@neynar/ui/alert` | Contextual messages |
140
+ | Badge | `@neynar/ui/badge` | Status indicators |
141
+ | Empty | `@neynar/ui/empty` | Empty state |
142
+ | Progress | `@neynar/ui/progress` | Progress bars |
143
+ | Skeleton | `@neynar/ui/skeleton` | Loading placeholders |
144
+ | Sonner | `@neynar/ui/sonner` | Toast notifications |
145
+ | Spinner | `@neynar/ui/spinner` | Loading spinner |
146
+
147
+ ### Advanced
148
+ | Component | Import Path | Description |
149
+ |-----------|-------------|-------------|
150
+ | Avatar | `@neynar/ui/avatar` | User avatars |
151
+ | Carousel | `@neynar/ui/carousel` | Content slider |
152
+ | Chart | `@neynar/ui/chart` | Recharts wrapper |
153
+ | Command | `@neynar/ui/command` | Command palette |
154
+ | Kbd | `@neynar/ui/kbd` | Keyboard shortcuts |
155
+ | Item | `@neynar/ui/item` | List items |
156
+
157
+ ### Typography
158
+ | Component | Import Path | Description |
159
+ |-----------|-------------|-------------|
160
+ | Title | `@neynar/ui/typography` | Headings (h1-h6) |
161
+ | Text | `@neynar/ui/typography` | Paragraph text |
162
+ | Code | `@neynar/ui/typography` | Inline code |
163
+ | Blockquote | `@neynar/ui/typography` | Quote blocks |
164
+
165
+ ### Theme Utilities
166
+ | Component | Import Path | Description |
167
+ |-----------|-------------|-------------|
168
+ | ColorModeInitializer | `@neynar/ui/color-mode` | FOUC prevention script |
169
+ | ColorModeToggle | `@neynar/ui/color-mode` | Mode switcher dropdown |
170
+ | useColorMode | `@neynar/ui/color-mode` | Programmatic control hook |
171
+ | FirstLightFilters | `@neynar/ui/first-light` | SVG wobble filters |
172
+
173
+ ## Additional Documentation
174
+
175
+ - [Theming](./theming.llm.md) - Themes, color mode, CSS variables, customization
176
+ - [Hooks](./hooks.llm.md) - useIsMobile responsive hook
177
+ - [Utilities](./utilities.llm.md) - cn() class merging utility
178
+ - [Contributing](./contributing.llm.md) - Component patterns, data-slot, templates