@uselets/ui 0.6.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +85 -25
- package/dist/cli/uselets.mjs +2 -2
- package/dist/cli/uselets.mjs.map +1 -1
- package/dist/components/alert-dialog.d.ts +5 -3
- package/dist/components/alert-dialog.js +1 -1
- package/dist/components/alert-dialog.js.map +1 -1
- package/dist/components/anchor.js +1 -1
- package/dist/components/anchor.js.map +1 -1
- package/dist/components/avatar.d.ts +1 -1
- package/dist/components/avatar.js +1 -1
- package/dist/components/avatar.js.map +1 -1
- package/dist/components/badge.js +1 -1
- package/dist/components/badge.js.map +1 -1
- package/dist/components/button.d.ts +7 -3
- package/dist/components/button.js +1 -1
- package/dist/components/button.js.map +1 -1
- package/dist/components/calendar.js +1 -1
- package/dist/components/calendar.js.map +1 -1
- package/dist/components/card.d.ts +1 -1
- package/dist/components/card.js +1 -1
- package/dist/components/card.js.map +1 -1
- package/dist/components/checkbox.d.ts +14 -2
- package/dist/components/checkbox.js +1 -1
- package/dist/components/checkbox.js.map +1 -1
- package/dist/components/combobox.d.ts +8 -1
- package/dist/components/combobox.js +1 -1
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/date-range-picker.d.ts +120 -0
- package/dist/components/date-range-picker.js +2 -0
- package/dist/components/date-range-picker.js.map +1 -0
- package/dist/components/grid.d.ts +37 -0
- package/dist/components/grid.js +2 -0
- package/dist/components/grid.js.map +1 -0
- package/dist/components/group.d.ts +2 -2
- package/dist/components/group.js +1 -1
- package/dist/components/group.js.map +1 -1
- package/dist/components/heading.js +1 -1
- package/dist/components/heading.js.map +1 -1
- package/dist/components/label.js +1 -1
- package/dist/components/label.js.map +1 -1
- package/dist/components/list.js +1 -1
- package/dist/components/list.js.map +1 -1
- package/dist/components/native-select.d.ts +1 -1
- package/dist/components/native-select.js +1 -1
- package/dist/components/native-select.js.map +1 -1
- package/dist/components/pagination.js +1 -1
- package/dist/components/pagination.js.map +1 -1
- package/dist/components/radio-group.d.ts +23 -2
- package/dist/components/radio-group.js +1 -1
- package/dist/components/radio-group.js.map +1 -1
- package/dist/components/select.d.ts +1 -1
- package/dist/components/select.js +1 -1
- package/dist/components/select.js.map +1 -1
- package/dist/components/sidebar.d.ts +1 -1
- package/dist/components/sidebar.js +1 -1
- package/dist/components/sidebar.js.map +1 -1
- package/dist/components/simple-grid.d.ts +24 -0
- package/dist/components/simple-grid.js +2 -0
- package/dist/components/simple-grid.js.map +1 -0
- package/dist/components/spinner.d.ts +1 -1
- package/dist/components/spinner.js +1 -1
- package/dist/components/spinner.js.map +1 -1
- package/dist/components/stack.d.ts +2 -2
- package/dist/components/stack.js +1 -1
- package/dist/components/stack.js.map +1 -1
- package/dist/components/switch.d.ts +11 -1
- package/dist/components/switch.js +1 -1
- package/dist/components/switch.js.map +1 -1
- package/dist/components/tabs.d.ts +5 -2
- package/dist/components/tabs.js +1 -1
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/text.js +1 -1
- package/dist/components/text.js.map +1 -1
- package/dist/components/toggle-group.d.ts +2 -0
- package/dist/components/toggle-group.js +1 -1
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/toggle.d.ts +4 -2
- package/dist/components/toggle.js +1 -1
- package/dist/components/toggle.js.map +1 -1
- package/dist/components/visibility.d.ts +25 -0
- package/dist/components/visibility.js +2 -0
- package/dist/components/visibility.js.map +1 -0
- package/dist/hooks/use-breakpoint-value.d.ts +9 -0
- package/dist/hooks/use-breakpoint-value.js +2 -0
- package/dist/hooks/use-breakpoint-value.js.map +1 -0
- package/dist/hooks/use-breakpoint-value.spec.d.ts +1 -0
- package/dist/hooks/use-breakpoint-value.spec.js +15 -0
- package/dist/hooks/use-breakpoint-value.spec.js.map +1 -0
- package/dist/hooks/use-breakpoint.d.ts +9 -0
- package/dist/hooks/use-breakpoint.js +2 -0
- package/dist/hooks/use-breakpoint.js.map +1 -0
- package/dist/hooks/use-breakpoint.spec.d.ts +1 -0
- package/dist/hooks/use-breakpoint.spec.js +2 -0
- package/dist/hooks/use-breakpoint.spec.js.map +1 -0
- package/dist/index.d.ts +10 -4
- package/dist/index.js +1 -1
- package/dist/lib/button.d.ts +12 -8
- package/dist/lib/button.js +1 -1
- package/dist/lib/button.js.map +1 -1
- package/dist/lib/color.d.ts +20 -0
- package/dist/lib/color.js +2 -0
- package/dist/lib/color.js.map +1 -0
- package/dist/skills/uselets-ui/SKILL.md +3 -3
- package/dist/skills/uselets-ui/references/component-catalog.md +34 -4
- package/dist/skills/uselets-ui/references/package-guide.md +51 -17
- package/dist/skills/uselets-ui/scripts/print-public-api.mjs +0 -1
- package/dist/styles/base.css +13 -0
- package/dist/styles/globals.css +8 -0
- package/dist/styles/gomax.css +202 -0
- package/dist/styles/max.css +203 -0
- package/dist/styles/theme.css +195 -0
- package/dist/themes/gomax.css +3 -2
- package/dist/themes/max.css +3 -2
- package/package.json +1 -2
- package/skills/uselets-ui/SKILL.md +3 -3
- package/skills/uselets-ui/references/component-catalog.md +34 -4
- package/skills/uselets-ui/references/package-guide.md +51 -17
- package/skills/uselets-ui/scripts/print-public-api.mjs +0 -1
- package/dist/components/sheet.d.ts +0 -61
- package/dist/components/sheet.js +0 -2
- package/dist/components/sheet.js.map +0 -1
- package/dist/styles.css +0 -2
package/README.md
CHANGED
|
@@ -76,24 +76,33 @@ npm install tailwindcss @tailwindcss/postcss
|
|
|
76
76
|
export { default } from '@uselets/ui/postcss.config'
|
|
77
77
|
```
|
|
78
78
|
|
|
79
|
-
3. Import Tailwind in your global stylesheet:
|
|
79
|
+
3. Import Tailwind, one package theme, and the Inter font in your global stylesheet:
|
|
80
80
|
|
|
81
81
|
```css
|
|
82
82
|
/* app.css */
|
|
83
83
|
@import 'tailwindcss';
|
|
84
|
+
@import '@uselets/ui/themes/max.css';
|
|
85
|
+
@import '@fontsource-variable/inter';
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Use `@uselets/ui/themes/gomax.css` instead for GoMax apps. If your app consumes `@uselets/ui` components, add a
|
|
89
|
+
source directive so Tailwind can generate classes used by the package:
|
|
90
|
+
|
|
91
|
+
```css
|
|
92
|
+
@source '../node_modules/@uselets/ui/dist';
|
|
84
93
|
```
|
|
85
94
|
|
|
86
95
|
## Quick start
|
|
87
96
|
|
|
88
|
-
1. Import one package theme once in your
|
|
97
|
+
1. Import one package theme once in your global stylesheet:
|
|
89
98
|
|
|
90
|
-
```
|
|
91
|
-
import '
|
|
92
|
-
import '@
|
|
99
|
+
```css
|
|
100
|
+
@import 'tailwindcss';
|
|
101
|
+
@import '@uselets/ui/themes/max.css';
|
|
102
|
+
@import '@fontsource-variable/inter';
|
|
93
103
|
```
|
|
94
104
|
|
|
95
|
-
For
|
|
96
|
-
`@uselets/ui/styles.css` entrypoint is still available and is equivalent to the Max theme.
|
|
105
|
+
For GoMax apps, import `@uselets/ui/themes/gomax.css` instead.
|
|
97
106
|
|
|
98
107
|
2. Import components from the package root:
|
|
99
108
|
|
|
@@ -113,6 +122,7 @@ export function Example() {
|
|
|
113
122
|
|
|
114
123
|
```tsx
|
|
115
124
|
import { Button } from '@uselets/ui/button'
|
|
125
|
+
import { useBreakpointValue } from '@uselets/ui/hooks/use-breakpoint-value'
|
|
116
126
|
import { useIsMobile } from '@uselets/ui/hooks/use-mobile'
|
|
117
127
|
import { useDisclosure } from '@uselets/ui/hooks/use-disclosure'
|
|
118
128
|
import { useLocalStorage } from '@uselets/ui/hooks/use-local-storage'
|
|
@@ -126,36 +136,67 @@ The package ships brand theme entrypoints:
|
|
|
126
136
|
- `@uselets/ui/themes/max.css`
|
|
127
137
|
- `@uselets/ui/themes/gomax.css`
|
|
128
138
|
|
|
129
|
-
|
|
139
|
+
Max and GoMax are maintained from their respective Figma style guides. The Storybook
|
|
140
|
+
`Foundations/Themes` story reads the active stylesheet tokens, so it is the theme-backed
|
|
141
|
+
palette preview for both theme entrypoints.
|
|
142
|
+
|
|
143
|
+
### Typography scale
|
|
144
|
+
|
|
145
|
+
The Max theme overrides Tailwind CSS text size utilities from `text-xs` through `text-6xl` to match the
|
|
146
|
+
Figma typography scale. Inter is the default sans-serif family, and each size uses a line height equal to
|
|
147
|
+
`font-size * 1.5`.
|
|
148
|
+
|
|
149
|
+
| Utility | Font size | Line height |
|
|
150
|
+
| --- | --- | --- |
|
|
151
|
+
| `text-xs` | `0.75rem` / `12px` | `1.125rem` / `18px` |
|
|
152
|
+
| `text-sm` | `0.875rem` / `14px` | `1.3125rem` / `21px` |
|
|
153
|
+
| `text-base` | `1rem` / `16px` | `1.5rem` / `24px` |
|
|
154
|
+
| `text-lg` | `1.125rem` / `18px` | `1.6875rem` / `27px` |
|
|
155
|
+
| `text-xl` | `1.25rem` / `20px` | `1.875rem` / `30px` |
|
|
156
|
+
| `text-2xl` | `1.5rem` / `24px` | `2.25rem` / `36px` |
|
|
157
|
+
| `text-3xl` | `1.875rem` / `30px` | `2.8125rem` / `45px` |
|
|
158
|
+
| `text-4xl` | `2.25rem` / `36px` | `3.375rem` / `54px` |
|
|
159
|
+
| `text-5xl` | `3rem` / `48px` | `4.5rem` / `72px` |
|
|
160
|
+
| `text-6xl` | `3.75rem` / `60px` | `5.625rem` / `90px` |
|
|
130
161
|
|
|
131
162
|
### Public palette families
|
|
132
163
|
|
|
133
164
|
The palette follows the Tailwind and shadcn convention of complete `50..950` scales.
|
|
134
165
|
|
|
166
|
+
- `primary`
|
|
135
167
|
- `brand`
|
|
168
|
+
- `gray`
|
|
136
169
|
- `zinc`
|
|
137
170
|
- `red`
|
|
171
|
+
- `yellow`
|
|
138
172
|
- `blue`
|
|
139
173
|
- `indigo`
|
|
140
174
|
- `pink`
|
|
141
175
|
- `green`
|
|
142
176
|
|
|
177
|
+
This same list is exported as `uiColors` and `UIColor` from `@uselets/ui` and `@uselets/ui/lib/color`.
|
|
178
|
+
Color-aware components such as `Button`, `Toggle`, `Checkbox`, `RadioGroupItem`, and `Switch` use `UIColor` for their public `color` props.
|
|
179
|
+
`ButtonColor` remains available as a compatibility alias for existing button consumers.
|
|
180
|
+
|
|
143
181
|
Each family is exposed in two layers:
|
|
144
182
|
|
|
145
|
-
- CSS variables such as `--brand-500` and `--zinc-900`
|
|
146
|
-
- Tailwind v4 theme utilities such as `bg-
|
|
183
|
+
- CSS variables such as `--primary-500`, `--brand-500` and `--zinc-900`
|
|
184
|
+
- Tailwind v4 theme utilities such as `bg-primary-500`, `text-zinc-900`, `border-red-300`
|
|
147
185
|
|
|
148
186
|
### Palette preview
|
|
149
187
|
|
|
150
188
|
| Family | Reference token | Preview |
|
|
151
189
|
| --- | --- | --- |
|
|
190
|
+
| `primary` | `primary-500` | <span style="display:inline-block;width:1.25rem;height:1.25rem;border-radius:0.375rem;border:1px solid #d9d9d9;background:#f93846;"></span> |
|
|
152
191
|
| `brand` | `brand-500` | <span style="display:inline-block;width:1.25rem;height:1.25rem;border-radius:0.375rem;border:1px solid #d9d9d9;background:#ff5c35;"></span> |
|
|
192
|
+
| `gray` | `gray-500` | <span style="display:inline-block;width:1.25rem;height:1.25rem;border-radius:0.375rem;border:1px solid #d9d9d9;background:#99afc4;"></span> |
|
|
153
193
|
| `zinc` | `zinc-500` | <span style="display:inline-block;width:1.25rem;height:1.25rem;border-radius:0.375rem;border:1px solid #d9d9d9;background:#989898;"></span> |
|
|
154
|
-
| `red` | `red-500` | <span style="display:inline-block;width:1.25rem;height:1.25rem;border-radius:0.375rem;border:1px solid #d9d9d9;background:#
|
|
194
|
+
| `red` | `red-500` | <span style="display:inline-block;width:1.25rem;height:1.25rem;border-radius:0.375rem;border:1px solid #d9d9d9;background:#e02535;"></span> |
|
|
195
|
+
| `yellow` | `yellow-500` | <span style="display:inline-block;width:1.25rem;height:1.25rem;border-radius:0.375rem;border:1px solid #d9d9d9;background:#ffa736;"></span> |
|
|
155
196
|
| `blue` | `blue-500` | <span style="display:inline-block;width:1.25rem;height:1.25rem;border-radius:0.375rem;border:1px solid #d9d9d9;background:#408ec5;"></span> |
|
|
156
|
-
| `indigo` | `indigo-500` | <span style="display:inline-block;width:1.25rem;height:1.25rem;border-radius:0.375rem;border:1px solid #d9d9d9;background:#
|
|
197
|
+
| `indigo` | `indigo-500` | <span style="display:inline-block;width:1.25rem;height:1.25rem;border-radius:0.375rem;border:1px solid #d9d9d9;background:#545ad4;"></span> |
|
|
157
198
|
| `pink` | `pink-500` | <span style="display:inline-block;width:1.25rem;height:1.25rem;border-radius:0.375rem;border:1px solid #d9d9d9;background:#bd138b;"></span> |
|
|
158
|
-
| `green` | `green-500` | <span style="display:inline-block;width:1.25rem;height:1.25rem;border-radius:0.375rem;border:1px solid #d9d9d9;background:#
|
|
199
|
+
| `green` | `green-500` | <span style="display:inline-block;width:1.25rem;height:1.25rem;border-radius:0.375rem;border:1px solid #d9d9d9;background:#52af4a;"></span> |
|
|
159
200
|
|
|
160
201
|
### Semantic tokens
|
|
161
202
|
|
|
@@ -174,12 +215,11 @@ The theme also exposes the shadcn foreground pair for destructive surfaces:
|
|
|
174
215
|
|
|
175
216
|
### Gradient tokens
|
|
176
217
|
|
|
177
|
-
The palette includes named gradient
|
|
218
|
+
The palette includes one named gradient token:
|
|
178
219
|
|
|
179
220
|
- `--gradient-primary`
|
|
180
|
-
- `--gradient-secondary`
|
|
181
221
|
|
|
182
|
-
|
|
222
|
+
This gradient is a documentation and styling primitive. It is not exposed as a Tailwind color family.
|
|
183
223
|
|
|
184
224
|
## Components
|
|
185
225
|
|
|
@@ -189,48 +229,60 @@ You can import from the package root (`@uselets/ui`) or by subpath (`@uselets/ui
|
|
|
189
229
|
| --- | --- | --- |
|
|
190
230
|
| `alert` | `Alert`, `AlertTitle`, `AlertDescription`, `AlertAction` | `Alert` supports `variant: 'default' \| 'destructive'` (default: `default`). |
|
|
191
231
|
| `anchor` | `Anchor`, `anchorVariants` | Link primitive rendered as `<a>` with `size: 'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl'`, `underline: 'always' \| 'hover' \| 'never' \| 'not-hover'` (default: `hover`), and `asChild`. |
|
|
192
|
-
| `avatar` | `Avatar`, `AvatarImage`, `AvatarFallback`, `AvatarBadge`, `AvatarGroup`, `AvatarGroupCount` | `Avatar` supports `size: 'sm' \| '
|
|
193
|
-
| `button` | `Button`, `buttonVariants` | `variant: 'solid' \| 'outline' \| 'subtle' \| 'ghost' \| '
|
|
194
|
-
| `
|
|
232
|
+
| `avatar` | `Avatar`, `AvatarImage`, `AvatarFallback`, `AvatarBadge`, `AvatarGroup`, `AvatarGroupCount` | `Avatar` supports `size: 'sm' \| 'md' \| 'lg'` (default: `md`). |
|
|
233
|
+
| `button` | `Button`, `buttonVariants` | `variant: 'solid' \| 'outline' \| 'subtle' \| 'ghost' \| 'link'` (default: `solid`); `color: UIColor` (default: `primary`); `size: 'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl' \| 'icon-xs' \| 'icon-sm' \| 'icon' \| 'icon-lg' \| 'icon-xl'`; `loading?: boolean`. |
|
|
234
|
+
| `calendar` | `Calendar`, `CalendarDayButton` | Also exports the `DateRange` type. Weekends render with destructive text, week numbers are low-emphasis, and selected single/range endpoints use the `primary` palette with a subtle primary range fill. |
|
|
235
|
+
| `date-range-picker` | `DateRangePicker`, `DateRangePickerTrigger`, `DateRangePickerValue`, `DateRangePickerContent`, `DateRangePickerPresets`, `DateRangePickerPreset`, `DateRangePickerCalendar`, `DateRangePickerDateFields`, `DateRangePickerActions`, `DateRangePickerApply`, `DateRangePickerReset` | Compound popover picker backed by `Calendar` range mode. Draft edits from fixed presets, relative-day inputs, date inputs, and calendar stay in sync until `Apply`; reset/clear emits `null` through `onValueChange`. |
|
|
236
|
+
| `card` | `Card`, `CardHeader`, `CardTitle`, `CardDescription`, `CardAction`, `CardContent`, `CardFooter` | `Card` supports `size: 'sm' \| 'md'` (default: `md`). |
|
|
237
|
+
| `checkbox` | `Checkbox` | `Checkbox` supports `size: 'sm' \| 'md' \| 'lg'` (default: `md`), `color: UIColor` (default: `primary`), `label?: React.ReactNode`, and `labelProps` for the composed `Label`. When `label` is provided without `id`, it generates an id and wires `htmlFor` automatically. Label text follows checkbox size: `sm` 12px, `md` 14px, `lg` 20px. |
|
|
195
238
|
| `code` | `Code` | Inline code primitive rendered as `<code>`. |
|
|
239
|
+
| `combobox` | `Combobox`, `ComboboxInput`, `ComboboxContent`, `ComboboxList`, `ComboboxItem`, `ComboboxGroup`, `ComboboxLabel`, `ComboboxCollection`, `ComboboxClear`, `ComboboxEmpty`, `ComboboxSeparator`, `ComboboxChips`, `ComboboxChip`, `ComboboxChipsInput`, `ComboboxTrigger`, `ComboboxValue`, `useComboboxAnchor` | `ComboboxInput` supports `icon?: React.ReactNode`, `triggerIcon?: React.ReactNode`, `showTrigger?: boolean`, and `showClear?: boolean`; the trigger icon defaults to `IconSelector`. |
|
|
196
240
|
| `dialog` | `Dialog`, `DialogTrigger`, `DialogPortal`, `DialogClose`, `DialogOverlay`, `DialogContent`, `DialogHeader`, `DialogFooter`, `DialogTitle`, `DialogDescription` | `Dialog` supports `size: 'sm' \| 'md' \| 'lg' \| 'xl' \| '2xl'` (default: `sm`); `DialogContent.showCloseButton` (default: `true`); `DialogFooter.showCloseButton` (default: `false`). |
|
|
197
241
|
| `drawer` | `Drawer`, `DrawerTrigger`, `DrawerPortal`, `DrawerClose`, `DrawerOverlay`, `DrawerContent`, `DrawerHeader`, `DrawerFooter`, `DrawerTitle`, `DrawerDescription` | `Drawer` supports `size: 'sm' \| 'md' \| 'lg'` (default: `sm`). Direction (`top/right/bottom/left`) is handled by Vaul root props. |
|
|
198
242
|
| `dropzone` | `Dropzone`, `DropzoneArea`, `DropzoneDescription`, `DropzoneFileList`, `DropzoneFileListItem`, `DropzoneFileMessage`, `DropzoneMessage`, `DropzoneRemoveFile`, `DropzoneRetryFile`, `DropzoneTrigger`, `InfiniteProgress`, `useDropzone` | `useDropzone` manages upload lifecycle, validation (`accept`, `minSize`, `maxSize`, `maxFiles`), retry handling, and optional `shiftOnMaxFiles` replacement. Compose the returned state with `Dropzone` and its subcomponents. |
|
|
199
243
|
| `dropdown-menu` | `DropdownMenu`, `DropdownMenuTrigger`, `DropdownMenuContent`, `DropdownMenuItem`, `DropdownMenuCheckboxItem`, `DropdownMenuRadioGroup`, `DropdownMenuRadioItem`, `DropdownMenuSub`, `DropdownMenuSubTrigger`, `DropdownMenuSubContent`, `DropdownMenuSeparator`, `DropdownMenuShortcut` | `DropdownMenuContent` supports `side`, `sideOffset`, `align`, `alignOffset`; items support `inset`, and `DropdownMenuItem` supports `variant: 'default' \| 'destructive'`. |
|
|
200
244
|
| `empty` | `Empty`, `EmptyHeader`, `EmptyMedia`, `EmptyTitle`, `EmptyDescription`, `EmptyContent` | `EmptyMedia` supports `variant: 'default' \| 'icon'` (default: `default`). |
|
|
201
245
|
| `field` | `FieldSet`, `FieldLegend`, `FieldGroup`, `Field`, `FieldContent`, `FieldLabel`, `FieldTitle`, `FieldDescription`, `FieldSeparator`, `FieldError` | `Field.orientation: 'vertical' \| 'horizontal' \| 'responsive'` (default: `vertical`); `FieldLegend.variant: 'legend' \| 'label'`; `FieldError.errors` accepts an array of error objects. |
|
|
246
|
+
| `grid` | `Grid`, `GridItem` | `Grid` is a 12-column CSS grid by default and supports `gap`, `rowGap`, `columnGap`, `templateRows`, and `templateColumns`. `GridItem` defaults to `colSpan={12}` and supports numeric `colSpan` and `rowSpan`; use `useBreakpointValue` when spans or templates need responsive values. |
|
|
202
247
|
| `heading` | `Heading`, `headingVariants` | Heading primitive with `size: 'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl'` (default: `md`) and `asChild`. |
|
|
203
248
|
| `input` | `Input` | Wrapper for Base UI Input with all native `<input>` props. |
|
|
204
249
|
| `input-otp` | `InputOTP`, `InputOTPGroup`, `InputOTPSlot`, `InputOTPSeparator`, `REGEXP_ONLY_CHARS`, `REGEXP_ONLY_DIGITS`, `REGEXP_ONLY_DIGITS_AND_CHARS` | `InputOTP` supports all `input-otp` props plus `containerClassName`; use `maxLength` and `pattern` for validation. |
|
|
205
250
|
| `kbd` | `Kbd`, `KbdGroup` | Keyboard shortcut presentation primitives. |
|
|
206
251
|
| `label` | `Label` | Styled `<label>` wrapper. |
|
|
207
252
|
| `list` | `List`, `ListItem`, `ListIcon`, `listVariants` | `List.type: 'unordered' \| 'ordered'`; `size` and `spacing` use the `xs` to `xl` scale; `ListIcon` can use `asChild` and replaces the default marker with a primary-colored icon. |
|
|
208
|
-
| `native-select` | `NativeSelect`, `NativeSelectOption`, `NativeSelectOptGroup` | Native `<select>` API with `size: 'sm' \| '
|
|
253
|
+
| `native-select` | `NativeSelect`, `NativeSelectOption`, `NativeSelectOptGroup` | Native `<select>` API with `size: 'sm' \| 'md'` (default: `md`). |
|
|
209
254
|
| `popover` | `Popover`, `PopoverTrigger`, `PopoverContent`, `PopoverAnchor`, `PopoverHeader`, `PopoverTitle`, `PopoverDescription` | `PopoverContent` supports positioning props (`side`, `sideOffset`, `align`, `alignOffset`) and can be used in controlled mode via root props (`open`, `onOpenChange`). |
|
|
210
|
-
| `
|
|
255
|
+
| `radio-group` | `RadioGroup`, `RadioGroupItem` | `RadioGroup` supports `color: UIColor` (default: `primary`) for the group. `RadioGroupItem` supports `size: 'sm' \| 'md' \| 'lg'` (default: `md`), optional `color: UIColor` item overrides, `label?: React.ReactNode`, and `labelProps` for the composed `Label`. When `label` is provided without `id`, it generates an id and wires `htmlFor` automatically. Label text follows item size: `sm` 12px, `md` 14px, `lg` 20px. |
|
|
256
|
+
| `select` | `Select`, `SelectTrigger`, `SelectValue`, `SelectContent`, `SelectGroup`, `SelectItem`, `SelectLabel`, `SelectSeparator`, `SelectScrollUpButton`, `SelectScrollDownButton` | `SelectTrigger.size: 'sm' \| 'md'`; `SelectContent` supports positioning props (`side`, `sideOffset`, `align`, `alignOffset`, `alignItemWithTrigger`). |
|
|
211
257
|
| `separator` | `Separator` | `orientation: 'horizontal' \| 'vertical'` (default: `horizontal`). |
|
|
258
|
+
| `simple-grid` | `SimpleGrid` | Simple grid with `cols`, `gap`, `rowGap`, and `columnGap`. `cols` accepts a number; spacing uses the `xs` to `xl` scale. Use `useBreakpointValue` when column count needs responsive values. |
|
|
212
259
|
| `skeleton` | `Skeleton` | Generic loading placeholder block. |
|
|
213
|
-
| `spinner` | `Spinner` | Loader icon (`role="status"`), accepts SVG props and supports `size: 'sm' \| '
|
|
260
|
+
| `spinner` | `Spinner` | Loader icon (`role="status"`), accepts SVG props and supports `size: 'sm' \| 'md' \| 'lg'` (default: `md`). |
|
|
261
|
+
| `switch` | `Switch` | `Switch` supports `size: 'sm' \| 'md' \| 'lg'` (default: `md`), `color: UIColor` (default: `green`), `label?: React.ReactNode`, and `labelProps` for the composed `Label`. When `label` is provided without `id`, it generates an id and wires `htmlFor` automatically. Track size is `sm` 34x16px, `md` 42x20px, and `lg` 48x22px; the thumb and internal indicator scale with the switch. Label text follows switch size: `sm` 12px, `md` 14px, `lg` 20px. |
|
|
262
|
+
| `tabs` | `Tabs`, `TabsContent`, `TabsList`, `TabsTrigger`, `tabsListVariants` | `TabsList.variant: 'line' \| 'enclosed'` (default: `line`); `TabsList.grow?: boolean` makes horizontal tabs share the available width equally; `line` uses a neutral border line with a `primary` active indicator. |
|
|
214
263
|
| `text` | `Text`, `textVariants` | Text primitive with `size: 'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl'` (default: `md`) and `asChild`. |
|
|
215
264
|
| `timeline` | `Timeline`, `TimelineItem`, `TimelineConnector`, `TimelineContent`, `TimelineDescription`, `TimelineEmpty`, `TimelineHeader`, `TimelineIcon`, `TimelineTime`, `TimelineTitle`, `timelineVariants` | `Timeline.size: 'sm' \| 'md' \| 'lg'` (default: `md`); `Timeline.iconSize: 'sm' \| 'md' \| 'lg'`; `TimelineItem.status: 'completed' \| 'in-progress' \| 'pending'`; icon and connector colors use the semantic palette (`primary`, `secondary`, `muted`, `accent`, `destructive`). |
|
|
216
265
|
| `tooltip` | `TooltipProvider`, `Tooltip`, `TooltipTrigger`, `TooltipContent` | `TooltipProvider.delayDuration` controls global hover delay; `Tooltip` supports controlled mode (`open`, `onOpenChange`); `TooltipContent` supports positioning props like `side`, `align`, and `sideOffset`. |
|
|
266
|
+
| `visibility` | `HiddenFrom`, `VisibleFrom` | Breakpoint visibility helpers. `HiddenFrom breakpoint="md"` hides at `md` and above; `VisibleFrom breakpoint="md"` shows at `md` and above. |
|
|
217
267
|
| `sonner` | `Toaster`, `toast` | Toaster wrapper around Sonner with theme integration from `next-themes` and custom icons. |
|
|
218
268
|
|
|
219
269
|
### Additional components
|
|
220
270
|
|
|
221
271
|
The package also exports the following modules through the root entrypoint and subpaths:
|
|
222
272
|
|
|
223
|
-
- Layout and disclosure: `Accordion`, `Carousel`, `Center`, `Collapsible`, `Container`, `Group`, `Resizable`, `ScrollArea`, `
|
|
224
|
-
- Inputs and selection: `Calendar`, `
|
|
273
|
+
- Layout and disclosure: `Accordion`, `Carousel`, `Center`, `Collapsible`, `Container`, `Group`, `Resizable`, `ScrollArea`, `Sidebar`, `Stack`, `Tabs`
|
|
274
|
+
- Inputs and selection: `Calendar`, `DateRangePicker`, `InputGroup`, `RadioGroup`, `Slider`, `Switch`, `Textarea`, `Toggle`, `ToggleGroup`
|
|
225
275
|
- Navigation and feedback: `AlertDialog`, `Breadcrumb`, `NavigationMenu`, `Pagination`, `Progress`
|
|
226
276
|
- Data display and utilities: `Badge`, `ButtonGroup`, `Chart`, `Command`, `HoverCard`, `Table`, `ThemeProvider`, `useTheme`, `ModeToggle`
|
|
227
277
|
|
|
228
278
|
Each module exports its public composition parts and prop types from the same import path, for example `@uselets/ui/accordion` or `@uselets/ui`.
|
|
229
279
|
|
|
230
|
-
Layout primitives follow the same pattern: `Stack
|
|
280
|
+
Layout primitives follow the same pattern: `Stack` and `Group` support `gap: 'xs' | 'sm' | 'md' | 'lg' | 'xl'`; `Group` also supports `wrap`; `Center` supports `size: 'xs' | 'sm' | 'md' | 'lg' | 'xl'` and `direction: 'horizontal' | 'vertical'`; and `Container` supports `size: 'sm' | 'md' | 'lg' | 'full'`. `SimpleGrid`, `Grid`, and `GridItem` accept direct layout values; use `useBreakpointValue` to derive responsive values when needed. `HiddenFrom` and `VisibleFrom` provide breakpoint-based visibility wrappers.
|
|
231
281
|
|
|
232
282
|
Public hooks are exported from the package root and from the `@uselets/ui/hooks/*` namespace:
|
|
233
283
|
|
|
284
|
+
- `useBreakpoint` from `@uselets/ui/hooks/use-breakpoint`
|
|
285
|
+
- `useBreakpointValue` from `@uselets/ui/hooks/use-breakpoint-value`
|
|
234
286
|
- `useDisclosure` from `@uselets/ui/hooks/use-disclosure`
|
|
235
287
|
- `useInterval` from `@uselets/ui/hooks/use-interval`
|
|
236
288
|
- `useIdle` from `@uselets/ui/hooks/use-idle`
|
|
@@ -240,6 +292,14 @@ Public hooks are exported from the package root and from the `@uselets/ui/hooks/
|
|
|
240
292
|
|
|
241
293
|
Legacy hook subpaths such as `@uselets/ui/use-mobile` are not public entrypoints.
|
|
242
294
|
|
|
295
|
+
`useBreakpoint` checks Tailwind's default breakpoints (`base`, `sm`, `md`, `lg`, `xl`, `2xl`) and returns whether the current viewport is at or above the requested breakpoint. `useBreakpointValue` accepts a breakpoint map and returns the largest active value:
|
|
296
|
+
|
|
297
|
+
```tsx
|
|
298
|
+
const cols = useBreakpointValue({ base: 1, md: 2, lg: 3 }) ?? 1
|
|
299
|
+
|
|
300
|
+
return <SimpleGrid cols={cols} gap="md" />
|
|
301
|
+
```
|
|
302
|
+
|
|
243
303
|
`useLocalStorage` returns a tuple like `useState`, persists values as JSON, and syncs changes between browser tabs by default:
|
|
244
304
|
|
|
245
305
|
```tsx
|
package/dist/cli/uselets.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import{spawn as e}from"node:child_process";import t from"node:fs/promises";import n from"node:path";import r from"node:readline/promises";import{fileURLToPath as i}from"node:url";import{Command as a,Option as o}from"commander";const s=`uselets-ui`,c={codex:n.join(`.agents`,`skills`,s),claude:n.join(`.claude`,`skills`,s)},l=Object.keys(c);async function u(e){try{return await t.access(e),!0}catch{return!1}}async function d(e){return JSON.parse(await t.readFile(e,`utf8`))}async function f(){let e=i(new URL(`.`,import.meta.url));for(;;)try{return await t.access(n.join(e,`package.json`)),e}catch{let t=n.dirname(e);if(t===e)throw Error(`Unable to resolve @uselets/ui package root`);e=t}}function p(e){return e===`all`?l:[e]}function m(e,t){return!!(e.dependencies?.[t]||e.devDependencies?.[t]||e.peerDependencies?.[t]||e.optionalDependencies?.[t])}async function h(e,t){let r=t.packageManager?.split(`@`)[0];return r===`bun`||r===`pnpm`||r===`yarn`||r===`npm`?r:await u(n.join(e,`bun.lock`))?`bun`:await u(n.join(e,`pnpm-lock.yaml`))?`pnpm`:await u(n.join(e,`yarn.lock`))?`yarn`:(await u(n.join(e,`package-lock.json`)),`npm`)}function g(e,t,n){switch(e){case`bun`:return[`bun`,`add`,...n?[`-d`]:[],...t];case`pnpm`:return[`pnpm`,`add`,...n?[`-D`]:[],...t];case`yarn`:return[`yarn`,`add`,...n?[`-D`]:[],...t];case`npm`:return[`npm`,`install`,...n?[`-D`]:[],...t]}}async function _(t,n){let[r,...i]=t;if(!r)throw Error(`Missing command`);console.log(`Running: ${t.join(` `)}`),await new Promise((t,a)=>{let o=e(r,i,{cwd:n,stdio:`inherit`});o.on(`error`,a),o.on(`close`,e=>{if(e===0){t();return}a(Error(`${r} exited with code ${e}`))})})}function v(e,t){let n=e.dependencies?.[t]??e.devDependencies?.[t];if(!n)throw Error(`Unable to find ${t} version in @uselets/ui package metadata`);return n}async function y(e,t){let r=await f(),i=await d(n.join(r,`package.json`)),a=await h(e,t),o=[],s=[];if(!i.name||!i.version)throw Error(`Unable to resolve @uselets/ui package name and version`);m(t,i.name)||o.push(`${i.name}@${i.version}`),m(t,`@fontsource-variable/inter`)||o.push(`@fontsource-variable/inter@${v(i,`@fontsource-variable/inter`)}`),m(t,`tailwindcss`)||s.push(`tailwindcss@${v(i,`tailwindcss`)}`),m(t,`@tailwindcss/postcss`)||s.push(`@tailwindcss/postcss@${v(i,`@tailwindcss/postcss`)}`),o.length>0?await _(g(a,o,!1),e):console.log(`Runtime dependencies already declared.`),s.length>0?await _(g(a,s,!0),e):console.log(`Tailwind dependencies already declared.`)}async function b(e){let r=await f(),i=n.join(r,`skills`,s);try{await t.access(i)}catch{throw Error(`Bundled skill not found at ${i}`)}let a=[];for(let r of e){let e=n.join(process.cwd(),c[r]);await t.rm(e,{recursive:!0,force:!0}),await t.mkdir(n.dirname(e),{recursive:!0}),await t.cp(i,e,{recursive:!0}),a.push(e)}console.log(`Installed ${s} skill:`);for(let e of a)console.log(`- ${e}`)}async function x(){return r.createInterface({input:process.stdin,output:process.stdout})}async function S(e){if(!process.stdin.isTTY)return e;let t=await x();try{for(;;){let n=(await t.question(`Theme (max/gomax) [${e}]: `)).trim().toLowerCase();if(!n)return e;if(n===`max`||n===`gomax`)return n;console.log(`Please choose "max" or "gomax".`)}}finally{t.close()}}async function C(e){if(!process.stdin.isTTY)return e;let t=await x();try{return(await t.question(`Global CSS path [${e}]: `)).trim()||e}finally{t.close()}}async function w(){if(!process.stdin.isTTY)return!1;let e=await x();try{for(;;){let t=(await e.question(`Install agent skill? (y/N): `)).trim().toLowerCase();if(!t||t===`n`||t===`no`)return!1;if(t===`y`||t===`yes`)return!0;console.log(`Please answer "y" or "n".`)}}finally{e.close()}}async function T(e){let r=n.join(e,`postcss.config.mjs`);if(await u(r)){console.log(`Preserved existing postcss.config.mjs.`);return}await t.writeFile(r,`export { default } from '@uselets/ui/postcss.config'
|
|
3
|
-
`),console.log(`Created postcss.config.mjs.`)}function E(e,t){let
|
|
3
|
+
`),console.log(`Created postcss.config.mjs.`)}function E(e){let t=n.posix.dirname(e.replaceAll(n.sep,n.posix.sep)),r=n.posix.relative(t,`node_modules/@uselets/ui/dist`);return r.startsWith(`.`)?r:`./${r}`}function D(e,t,n){let r=[],i=/@import\s+['"]tailwindcss['"]/.test(e),a=/@import\s+['"]@uselets\/ui\/themes\/(?:max|gomax)\.css['"]/.test(e),o=/@import\s+['"]@fontsource-variable\/inter['"]/.test(e),s=/@source\s+['"][^'"]*@uselets\/ui\/dist['"]/.test(e);return i||r.push(`@import 'tailwindcss';`),a||r.push(`@import '@uselets/ui/themes/${t}.css';`),o||r.push(`@import '@fontsource-variable/inter';`),s||r.push(`@source '${E(n)}';`),{imports:r,hasTheme:a}}async function O(e,r,i){let a=n.resolve(e,r),o=await u(a)?await t.readFile(a,`utf8`):``,{imports:s,hasTheme:c}=D(o,i,r);if(c&&console.log(`Preserved existing @uselets/ui theme import.`),s.length===0){console.log(`Global CSS already configured at ${r}.`);return}let l=o.length>0&&!o.startsWith(`
|
|
4
4
|
`)?`
|
|
5
5
|
`:``,d=`${s.join(`
|
|
6
|
-
`)}${l}${o}`;await t.mkdir(n.dirname(a),{recursive:!0}),await t.writeFile(a,d),console.log(`Updated global CSS at ${r}.`)}async function
|
|
6
|
+
`)}${l}${o}`;await t.mkdir(n.dirname(a),{recursive:!0}),await t.writeFile(a,d),console.log(`Updated global CSS at ${r}.`)}async function k(e){let t=process.cwd(),r=n.join(t,`package.json`);if(!await u(r))throw Error(`No package.json found in the current directory. Run uselets init from your project root.`);let i=await d(r),a=e.theme??await S(`max`),o=e.css??await C(`src/styles/globals.css`),s=e.installSkill??await w();await y(t,i),await T(t),await O(t,o,a),s&&await b(l)}async function A(){let e=new a;if(e.name(`uselets`).description(`CLI for @uselets/ui`).showHelpAfterError(),e.command(`skill`).description(`Reinstall the ${s} agent skill`).addOption(new o(`--agent <agent>`,`Target agent directory`).choices([`codex`,`claude`,`all`]).default(`all`)).action(async e=>{await b(p(e.agent))}),e.command(`init`).description(`Set up @uselets/ui in this project`).addOption(new o(`--theme <theme>`,`Theme to import`).choices([`max`,`gomax`])).option(`--css <path>`,`Global CSS file path`).option(`--install-skill`,`Install the agent skill without prompting`).option(`--no-install-skill`,`Skip the agent skill prompt and installation`).action(async e=>{await k(e)}),process.argv.length<=2){e.outputHelp();return}await e.parseAsync()}A().catch(e=>{console.error(e instanceof Error?e.message:e),process.exitCode=1});export{};
|
|
7
7
|
//# sourceMappingURL=uselets.mjs.map
|
package/dist/cli/uselets.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uselets.mjs","names":[],"sources":["../../src/cli/uselets.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { spawn } from 'node:child_process'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\nimport readline from 'node:readline/promises'\nimport { fileURLToPath } from 'node:url'\n\nimport { Command, Option } from 'commander'\n\nconst SKILL_NAME = 'uselets-ui'\nconst DEFAULT_CSS_PATH = 'src/styles/globals.css'\nconst POSTCSS_CONFIG = \"export { default } from '@uselets/ui/postcss.config'\\n\"\nconst AGENT_TARGETS = {\n codex: path.join('.agents', 'skills', SKILL_NAME),\n claude: path.join('.claude', 'skills', SKILL_NAME)\n} as const\n\ntype AgentTarget = keyof typeof AGENT_TARGETS\ntype AgentOption = AgentTarget | 'all'\ntype ThemeOption = 'max' | 'gomax'\ntype PackageManager = 'bun' | 'pnpm' | 'yarn' | 'npm'\ntype PackageJson = {\n name?: string\n version?: string\n packageManager?: string\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n peerDependencies?: Record<string, string>\n optionalDependencies?: Record<string, string>\n}\ntype InitOptions = {\n theme?: ThemeOption\n css?: string\n installSkill?: boolean\n}\n\nconst ALL_AGENT_TARGETS = Object.keys(AGENT_TARGETS) as AgentTarget[]\n\nasync function pathExists(targetPath: string) {\n try {\n await fs.access(targetPath)\n return true\n } catch {\n return false\n }\n}\n\nasync function readJsonFile<T>(filePath: string) {\n return JSON.parse(await fs.readFile(filePath, 'utf8')) as T\n}\n\nasync function findPackageRoot() {\n let currentDir = fileURLToPath(new URL('.', import.meta.url))\n\n while (true) {\n try {\n await fs.access(path.join(currentDir, 'package.json'))\n return currentDir\n } catch {\n const parentDir = path.dirname(currentDir)\n\n if (parentDir === currentDir) {\n throw new Error('Unable to resolve @uselets/ui package root')\n }\n\n currentDir = parentDir\n }\n }\n}\n\nfunction resolveTargets(agent: AgentOption) {\n return agent === 'all' ? ALL_AGENT_TARGETS : [agent]\n}\n\nfunction hasDependency(packageJson: PackageJson, dependencyName: string) {\n return Boolean(\n packageJson.dependencies?.[dependencyName] ||\n packageJson.devDependencies?.[dependencyName] ||\n packageJson.peerDependencies?.[dependencyName] ||\n packageJson.optionalDependencies?.[dependencyName]\n )\n}\n\nasync function detectPackageManager(projectRoot: string, packageJson: PackageJson): Promise<PackageManager> {\n const declaredManager = packageJson.packageManager?.split('@')[0]\n\n if (\n declaredManager === 'bun' ||\n declaredManager === 'pnpm' ||\n declaredManager === 'yarn' ||\n declaredManager === 'npm'\n ) {\n return declaredManager\n }\n\n if (await pathExists(path.join(projectRoot, 'bun.lock'))) {\n return 'bun'\n }\n\n if (await pathExists(path.join(projectRoot, 'pnpm-lock.yaml'))) {\n return 'pnpm'\n }\n\n if (await pathExists(path.join(projectRoot, 'yarn.lock'))) {\n return 'yarn'\n }\n\n if (await pathExists(path.join(projectRoot, 'package-lock.json'))) {\n return 'npm'\n }\n\n return 'npm'\n}\n\nfunction buildAddCommand(packageManager: PackageManager, dependencies: string[], dev: boolean) {\n switch (packageManager) {\n case 'bun':\n return ['bun', 'add', ...(dev ? ['-d'] : []), ...dependencies]\n case 'pnpm':\n return ['pnpm', 'add', ...(dev ? ['-D'] : []), ...dependencies]\n case 'yarn':\n return ['yarn', 'add', ...(dev ? ['-D'] : []), ...dependencies]\n case 'npm':\n return ['npm', 'install', ...(dev ? ['-D'] : []), ...dependencies]\n }\n}\n\nasync function runCommand(commandParts: string[], cwd: string) {\n const [command, ...args] = commandParts\n\n if (!command) {\n throw new Error('Missing command')\n }\n\n console.log(`Running: ${commandParts.join(' ')}`)\n\n await new Promise<void>((resolve, reject) => {\n const child = spawn(command, args, { cwd, stdio: 'inherit' })\n\n child.on('error', reject)\n child.on('close', (code) => {\n if (code === 0) {\n resolve()\n return\n }\n\n reject(new Error(`${command} exited with code ${code}`))\n })\n })\n}\n\nfunction getPackageVersion(packageJson: PackageJson, dependencyName: string) {\n const version = packageJson.dependencies?.[dependencyName] ?? packageJson.devDependencies?.[dependencyName]\n\n if (!version) {\n throw new Error(`Unable to find ${dependencyName} version in @uselets/ui package metadata`)\n }\n\n return version\n}\n\nasync function installMissingDependencies(projectRoot: string, projectPackageJson: PackageJson) {\n const packageRoot = await findPackageRoot()\n const packageJson = await readJsonFile<PackageJson>(path.join(packageRoot, 'package.json'))\n const packageManager = await detectPackageManager(projectRoot, projectPackageJson)\n const runtimeDependencies = []\n const devDependencies = []\n\n if (!packageJson.name || !packageJson.version) {\n throw new Error('Unable to resolve @uselets/ui package name and version')\n }\n\n if (!hasDependency(projectPackageJson, packageJson.name)) {\n runtimeDependencies.push(`${packageJson.name}@${packageJson.version}`)\n }\n\n if (!hasDependency(projectPackageJson, '@fontsource-variable/inter')) {\n runtimeDependencies.push(\n `@fontsource-variable/inter@${getPackageVersion(packageJson, '@fontsource-variable/inter')}`\n )\n }\n\n if (!hasDependency(projectPackageJson, 'tailwindcss')) {\n devDependencies.push(`tailwindcss@${getPackageVersion(packageJson, 'tailwindcss')}`)\n }\n\n if (!hasDependency(projectPackageJson, '@tailwindcss/postcss')) {\n devDependencies.push(`@tailwindcss/postcss@${getPackageVersion(packageJson, '@tailwindcss/postcss')}`)\n }\n\n if (runtimeDependencies.length > 0) {\n await runCommand(buildAddCommand(packageManager, runtimeDependencies, false), projectRoot)\n } else {\n console.log('Runtime dependencies already declared.')\n }\n\n if (devDependencies.length > 0) {\n await runCommand(buildAddCommand(packageManager, devDependencies, true), projectRoot)\n } else {\n console.log('Tailwind dependencies already declared.')\n }\n}\n\nasync function installSkill(targets: AgentTarget[]) {\n const packageRoot = await findPackageRoot()\n const sourcePath = path.join(packageRoot, 'skills', SKILL_NAME)\n\n try {\n await fs.access(sourcePath)\n } catch {\n throw new Error(`Bundled skill not found at ${sourcePath}`)\n }\n\n const installedPaths = []\n\n for (const target of targets) {\n const targetPath = path.join(process.cwd(), AGENT_TARGETS[target])\n\n await fs.rm(targetPath, { recursive: true, force: true })\n await fs.mkdir(path.dirname(targetPath), { recursive: true })\n await fs.cp(sourcePath, targetPath, { recursive: true })\n\n installedPaths.push(targetPath)\n }\n\n console.log(`Installed ${SKILL_NAME} skill:`)\n\n for (const installedPath of installedPaths) {\n console.log(`- ${installedPath}`)\n }\n}\n\nasync function createPrompt() {\n return readline.createInterface({ input: process.stdin, output: process.stdout })\n}\n\nasync function promptTheme(defaultTheme: ThemeOption) {\n if (!process.stdin.isTTY) {\n return defaultTheme\n }\n\n const prompt = await createPrompt()\n\n try {\n while (true) {\n const answer = (await prompt.question(`Theme (max/gomax) [${defaultTheme}]: `)).trim().toLowerCase()\n\n if (!answer) {\n return defaultTheme\n }\n\n if (answer === 'max' || answer === 'gomax') {\n return answer\n }\n\n console.log('Please choose \"max\" or \"gomax\".')\n }\n } finally {\n prompt.close()\n }\n}\n\nasync function promptCssPath(defaultCssPath: string) {\n if (!process.stdin.isTTY) {\n return defaultCssPath\n }\n\n const prompt = await createPrompt()\n\n try {\n const answer = (await prompt.question(`Global CSS path [${defaultCssPath}]: `)).trim()\n return answer || defaultCssPath\n } finally {\n prompt.close()\n }\n}\n\nasync function promptInstallSkill() {\n if (!process.stdin.isTTY) {\n return false\n }\n\n const prompt = await createPrompt()\n\n try {\n while (true) {\n const answer = (await prompt.question('Install agent skill? (y/N): ')).trim().toLowerCase()\n\n if (!answer || answer === 'n' || answer === 'no') {\n return false\n }\n\n if (answer === 'y' || answer === 'yes') {\n return true\n }\n\n console.log('Please answer \"y\" or \"n\".')\n }\n } finally {\n prompt.close()\n }\n}\n\nasync function ensurePostcssConfig(projectRoot: string) {\n const postcssPath = path.join(projectRoot, 'postcss.config.mjs')\n\n if (await pathExists(postcssPath)) {\n console.log('Preserved existing postcss.config.mjs.')\n return\n }\n\n await fs.writeFile(postcssPath, POSTCSS_CONFIG)\n console.log('Created postcss.config.mjs.')\n}\n\nfunction buildCssImports(source: string, theme: ThemeOption) {\n const imports = []\n const hasTailwind = /@import\\s+['\"]tailwindcss['\"]/.test(source)\n const hasTheme = /@import\\s+['\"]@uselets\\/ui\\/themes\\/(?:max|gomax)\\.css['\"]/.test(source)\n const hasFont = /@import\\s+['\"]@fontsource-variable\\/inter['\"]/.test(source)\n\n if (!hasTailwind) {\n imports.push(\"@import 'tailwindcss';\")\n }\n\n if (!hasTheme) {\n imports.push(`@import '@uselets/ui/themes/${theme}.css';`)\n }\n\n if (!hasFont) {\n imports.push(\"@import '@fontsource-variable/inter';\")\n }\n\n return { imports, hasTheme }\n}\n\nasync function ensureGlobalCss(projectRoot: string, cssPath: string, theme: ThemeOption) {\n const absoluteCssPath = path.resolve(projectRoot, cssPath)\n const existingSource = (await pathExists(absoluteCssPath)) ? await fs.readFile(absoluteCssPath, 'utf8') : ''\n const { imports, hasTheme } = buildCssImports(existingSource, theme)\n\n if (hasTheme) {\n console.log('Preserved existing @uselets/ui theme import.')\n }\n\n if (imports.length === 0) {\n console.log(`Global CSS already configured at ${cssPath}.`)\n return\n }\n\n const separator = existingSource.length > 0 && !existingSource.startsWith('\\n') ? '\\n' : ''\n const updatedSource = `${imports.join('\\n')}${separator}${existingSource}`\n\n await fs.mkdir(path.dirname(absoluteCssPath), { recursive: true })\n await fs.writeFile(absoluteCssPath, updatedSource)\n console.log(`Updated global CSS at ${cssPath}.`)\n}\n\nasync function initProject(options: InitOptions) {\n const projectRoot = process.cwd()\n const packageJsonPath = path.join(projectRoot, 'package.json')\n\n if (!(await pathExists(packageJsonPath))) {\n throw new Error('No package.json found in the current directory. Run uselets init from your project root.')\n }\n\n const projectPackageJson = await readJsonFile<PackageJson>(packageJsonPath)\n const theme = options.theme ?? (await promptTheme('max'))\n const cssPath = options.css ?? (await promptCssPath(DEFAULT_CSS_PATH))\n const shouldInstallSkill = options.installSkill ?? (await promptInstallSkill())\n\n await installMissingDependencies(projectRoot, projectPackageJson)\n await ensurePostcssConfig(projectRoot)\n await ensureGlobalCss(projectRoot, cssPath, theme)\n\n if (shouldInstallSkill) {\n await installSkill(ALL_AGENT_TARGETS)\n }\n}\n\nasync function main() {\n const program = new Command()\n\n program.name('uselets').description('CLI for @uselets/ui').showHelpAfterError()\n\n program\n .command('skill')\n .description(`Reinstall the ${SKILL_NAME} agent skill`)\n .addOption(\n new Option('--agent <agent>', 'Target agent directory').choices(['codex', 'claude', 'all']).default('all')\n )\n .action(async (options: { agent: AgentOption }) => {\n await installSkill(resolveTargets(options.agent))\n })\n\n program\n .command('init')\n .description('Set up @uselets/ui in this project')\n .addOption(new Option('--theme <theme>', 'Theme to import').choices(['max', 'gomax']))\n .option('--css <path>', 'Global CSS file path')\n .option('--install-skill', 'Install the agent skill without prompting')\n .option('--no-install-skill', 'Skip the agent skill prompt and installation')\n .action(async (options: InitOptions) => {\n await initProject(options)\n })\n\n if (process.argv.length <= 2) {\n program.outputHelp()\n return\n }\n\n await program.parseAsync()\n}\n\nmain().catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : error)\n process.exitCode = 1\n})\n"],"mappings":";mOAUA,MAAM,EAAa,aAGb,EAAgB,CACpB,MAAO,EAAK,KAAK,UAAW,SAAU,EAAW,CACjD,OAAQ,EAAK,KAAK,UAAW,SAAU,EAAW,CACnD,CAqBK,EAAoB,OAAO,KAAK,EAAc,CAEpD,eAAe,EAAW,EAAoB,CAC5C,GAAI,CAEF,OADA,MAAM,EAAG,OAAO,EAAW,CACpB,QACD,CACN,MAAO,IAIX,eAAe,EAAgB,EAAkB,CAC/C,OAAO,KAAK,MAAM,MAAM,EAAG,SAAS,EAAU,OAAO,CAAC,CAGxD,eAAe,GAAkB,CAC/B,IAAI,EAAa,EAAc,IAAI,IAAI,IAAK,OAAO,KAAK,IAAI,CAAC,CAE7D,OACE,GAAI,CAEF,OADA,MAAM,EAAG,OAAO,EAAK,KAAK,EAAY,eAAe,CAAC,CAC/C,OACD,CACN,IAAM,EAAY,EAAK,QAAQ,EAAW,CAE1C,GAAI,IAAc,EAChB,MAAU,MAAM,6CAA6C,CAG/D,EAAa,GAKnB,SAAS,EAAe,EAAoB,CAC1C,OAAO,IAAU,MAAQ,EAAoB,CAAC,EAAM,CAGtD,SAAS,EAAc,EAA0B,EAAwB,CACvE,MAAO,GACL,EAAY,eAAe,IACzB,EAAY,kBAAkB,IAC9B,EAAY,mBAAmB,IAC/B,EAAY,uBAAuB,IAIzC,eAAe,EAAqB,EAAqB,EAAmD,CAC1G,IAAM,EAAkB,EAAY,gBAAgB,MAAM,IAAI,CAAC,GA2B/D,OAxBE,IAAoB,OACpB,IAAoB,QACpB,IAAoB,QACpB,IAAoB,MAEb,EAGL,MAAM,EAAW,EAAK,KAAK,EAAa,WAAW,CAAC,CAC/C,MAGL,MAAM,EAAW,EAAK,KAAK,EAAa,iBAAiB,CAAC,CACrD,OAGL,MAAM,EAAW,EAAK,KAAK,EAAa,YAAY,CAAC,CAChD,QAGL,MAAM,EAAW,EAAK,KAAK,EAAa,oBAAoB,CAAC,CACxD,OAMX,SAAS,EAAgB,EAAgC,EAAwB,EAAc,CAC7F,OAAQ,EAAR,CACE,IAAK,MACH,MAAO,CAAC,MAAO,MAAO,GAAI,EAAM,CAAC,KAAK,CAAG,EAAE,CAAG,GAAG,EAAa,CAChE,IAAK,OACH,MAAO,CAAC,OAAQ,MAAO,GAAI,EAAM,CAAC,KAAK,CAAG,EAAE,CAAG,GAAG,EAAa,CACjE,IAAK,OACH,MAAO,CAAC,OAAQ,MAAO,GAAI,EAAM,CAAC,KAAK,CAAG,EAAE,CAAG,GAAG,EAAa,CACjE,IAAK,MACH,MAAO,CAAC,MAAO,UAAW,GAAI,EAAM,CAAC,KAAK,CAAG,EAAE,CAAG,GAAG,EAAa,EAIxE,eAAe,EAAW,EAAwB,EAAa,CAC7D,GAAM,CAAC,EAAS,GAAG,GAAQ,EAE3B,GAAI,CAAC,EACH,MAAU,MAAM,kBAAkB,CAGpC,QAAQ,IAAI,YAAY,EAAa,KAAK,IAAI,GAAG,CAEjD,MAAM,IAAI,SAAe,EAAS,IAAW,CAC3C,IAAM,EAAQ,EAAM,EAAS,EAAM,CAAE,MAAK,MAAO,UAAW,CAAC,CAE7D,EAAM,GAAG,QAAS,EAAO,CACzB,EAAM,GAAG,QAAU,GAAS,CAC1B,GAAI,IAAS,EAAG,CACd,GAAS,CACT,OAGF,EAAW,MAAM,GAAG,EAAQ,oBAAoB,IAAO,CAAC,EACxD,EACF,CAGJ,SAAS,EAAkB,EAA0B,EAAwB,CAC3E,IAAM,EAAU,EAAY,eAAe,IAAmB,EAAY,kBAAkB,GAE5F,GAAI,CAAC,EACH,MAAU,MAAM,kBAAkB,EAAe,0CAA0C,CAG7F,OAAO,EAGT,eAAe,EAA2B,EAAqB,EAAiC,CAC9F,IAAM,EAAc,MAAM,GAAiB,CACrC,EAAc,MAAM,EAA0B,EAAK,KAAK,EAAa,eAAe,CAAC,CACrF,EAAiB,MAAM,EAAqB,EAAa,EAAmB,CAC5E,EAAsB,EAAE,CACxB,EAAkB,EAAE,CAE1B,GAAI,CAAC,EAAY,MAAQ,CAAC,EAAY,QACpC,MAAU,MAAM,yDAAyD,CAGtE,EAAc,EAAoB,EAAY,KAAK,EACtD,EAAoB,KAAK,GAAG,EAAY,KAAK,GAAG,EAAY,UAAU,CAGnE,EAAc,EAAoB,6BAA6B,EAClE,EAAoB,KAClB,8BAA8B,EAAkB,EAAa,6BAA6B,GAC3F,CAGE,EAAc,EAAoB,cAAc,EACnD,EAAgB,KAAK,eAAe,EAAkB,EAAa,cAAc,GAAG,CAGjF,EAAc,EAAoB,uBAAuB,EAC5D,EAAgB,KAAK,wBAAwB,EAAkB,EAAa,uBAAuB,GAAG,CAGpG,EAAoB,OAAS,EAC/B,MAAM,EAAW,EAAgB,EAAgB,EAAqB,GAAM,CAAE,EAAY,CAE1F,QAAQ,IAAI,yCAAyC,CAGnD,EAAgB,OAAS,EAC3B,MAAM,EAAW,EAAgB,EAAgB,EAAiB,GAAK,CAAE,EAAY,CAErF,QAAQ,IAAI,0CAA0C,CAI1D,eAAe,EAAa,EAAwB,CAClD,IAAM,EAAc,MAAM,GAAiB,CACrC,EAAa,EAAK,KAAK,EAAa,SAAU,EAAW,CAE/D,GAAI,CACF,MAAM,EAAG,OAAO,EAAW,MACrB,CACN,MAAU,MAAM,8BAA8B,IAAa,CAG7D,IAAM,EAAiB,EAAE,CAEzB,IAAK,IAAM,KAAU,EAAS,CAC5B,IAAM,EAAa,EAAK,KAAK,QAAQ,KAAK,CAAE,EAAc,GAAQ,CAElE,MAAM,EAAG,GAAG,EAAY,CAAE,UAAW,GAAM,MAAO,GAAM,CAAC,CACzD,MAAM,EAAG,MAAM,EAAK,QAAQ,EAAW,CAAE,CAAE,UAAW,GAAM,CAAC,CAC7D,MAAM,EAAG,GAAG,EAAY,EAAY,CAAE,UAAW,GAAM,CAAC,CAExD,EAAe,KAAK,EAAW,CAGjC,QAAQ,IAAI,aAAa,EAAW,SAAS,CAE7C,IAAK,IAAM,KAAiB,EAC1B,QAAQ,IAAI,KAAK,IAAgB,CAIrC,eAAe,GAAe,CAC5B,OAAO,EAAS,gBAAgB,CAAE,MAAO,QAAQ,MAAO,OAAQ,QAAQ,OAAQ,CAAC,CAGnF,eAAe,EAAY,EAA2B,CACpD,GAAI,CAAC,QAAQ,MAAM,MACjB,OAAO,EAGT,IAAM,EAAS,MAAM,GAAc,CAEnC,GAAI,CACF,OAAa,CACX,IAAM,GAAU,MAAM,EAAO,SAAS,sBAAsB,EAAa,KAAK,EAAE,MAAM,CAAC,aAAa,CAEpG,GAAI,CAAC,EACH,OAAO,EAGT,GAAI,IAAW,OAAS,IAAW,QACjC,OAAO,EAGT,QAAQ,IAAI,kCAAkC,SAExC,CACR,EAAO,OAAO,EAIlB,eAAe,EAAc,EAAwB,CACnD,GAAI,CAAC,QAAQ,MAAM,MACjB,OAAO,EAGT,IAAM,EAAS,MAAM,GAAc,CAEnC,GAAI,CAEF,OADgB,MAAM,EAAO,SAAS,oBAAoB,EAAe,KAAK,EAAE,MACnE,EAAI,SACT,CACR,EAAO,OAAO,EAIlB,eAAe,GAAqB,CAClC,GAAI,CAAC,QAAQ,MAAM,MACjB,MAAO,GAGT,IAAM,EAAS,MAAM,GAAc,CAEnC,GAAI,CACF,OAAa,CACX,IAAM,GAAU,MAAM,EAAO,SAAS,+BAA+B,EAAE,MAAM,CAAC,aAAa,CAE3F,GAAI,CAAC,GAAU,IAAW,KAAO,IAAW,KAC1C,MAAO,GAGT,GAAI,IAAW,KAAO,IAAW,MAC/B,MAAO,GAGT,QAAQ,IAAI,4BAA4B,SAElC,CACR,EAAO,OAAO,EAIlB,eAAe,EAAoB,EAAqB,CACtD,IAAM,EAAc,EAAK,KAAK,EAAa,qBAAqB,CAEhE,GAAI,MAAM,EAAW,EAAY,CAAE,CACjC,QAAQ,IAAI,yCAAyC,CACrD,OAGF,MAAM,EAAG,UAAU,EAAa;EAAe,CAC/C,QAAQ,IAAI,8BAA8B,CAG5C,SAAS,EAAgB,EAAgB,EAAoB,CAC3D,IAAM,EAAU,EAAE,CACZ,EAAc,gCAAgC,KAAK,EAAO,CAC1D,EAAW,6DAA6D,KAAK,EAAO,CACpF,EAAU,gDAAgD,KAAK,EAAO,CAc5E,OAZK,GACH,EAAQ,KAAK,yBAAyB,CAGnC,GACH,EAAQ,KAAK,+BAA+B,EAAM,QAAQ,CAGvD,GACH,EAAQ,KAAK,wCAAwC,CAGhD,CAAE,UAAS,WAAU,CAG9B,eAAe,EAAgB,EAAqB,EAAiB,EAAoB,CACvF,IAAM,EAAkB,EAAK,QAAQ,EAAa,EAAQ,CACpD,EAAkB,MAAM,EAAW,EAAgB,CAAI,MAAM,EAAG,SAAS,EAAiB,OAAO,CAAG,GACpG,CAAE,UAAS,YAAa,EAAgB,EAAgB,EAAM,CAMpE,GAJI,GACF,QAAQ,IAAI,+CAA+C,CAGzD,EAAQ,SAAW,EAAG,CACxB,QAAQ,IAAI,oCAAoC,EAAQ,GAAG,CAC3D,OAGF,IAAM,EAAY,EAAe,OAAS,GAAK,CAAC,EAAe,WAAW;EAAK,CAAG;EAAO,GACnF,EAAgB,GAAG,EAAQ,KAAK;EAAK,GAAG,IAAY,IAE1D,MAAM,EAAG,MAAM,EAAK,QAAQ,EAAgB,CAAE,CAAE,UAAW,GAAM,CAAC,CAClE,MAAM,EAAG,UAAU,EAAiB,EAAc,CAClD,QAAQ,IAAI,yBAAyB,EAAQ,GAAG,CAGlD,eAAe,EAAY,EAAsB,CAC/C,IAAM,EAAc,QAAQ,KAAK,CAC3B,EAAkB,EAAK,KAAK,EAAa,eAAe,CAE9D,GAAI,CAAE,MAAM,EAAW,EAAgB,CACrC,MAAU,MAAM,2FAA2F,CAG7G,IAAM,EAAqB,MAAM,EAA0B,EAAgB,CACrE,EAAQ,EAAQ,OAAU,MAAM,EAAY,MAAM,CAClD,EAAU,EAAQ,KAAQ,MAAM,EAAc,yBAAiB,CAC/D,EAAqB,EAAQ,cAAiB,MAAM,GAAoB,CAE9E,MAAM,EAA2B,EAAa,EAAmB,CACjE,MAAM,EAAoB,EAAY,CACtC,MAAM,EAAgB,EAAa,EAAS,EAAM,CAE9C,GACF,MAAM,EAAa,EAAkB,CAIzC,eAAe,GAAO,CACpB,IAAM,EAAU,IAAI,EAyBpB,GAvBA,EAAQ,KAAK,UAAU,CAAC,YAAY,sBAAsB,CAAC,oBAAoB,CAE/E,EACG,QAAQ,QAAQ,CAChB,YAAY,iBAAiB,EAAW,cAAc,CACtD,UACC,IAAI,EAAO,kBAAmB,yBAAyB,CAAC,QAAQ,CAAC,QAAS,SAAU,MAAM,CAAC,CAAC,QAAQ,MAAM,CAC3G,CACA,OAAO,KAAO,IAAoC,CACjD,MAAM,EAAa,EAAe,EAAQ,MAAM,CAAC,EACjD,CAEJ,EACG,QAAQ,OAAO,CACf,YAAY,qCAAqC,CACjD,UAAU,IAAI,EAAO,kBAAmB,kBAAkB,CAAC,QAAQ,CAAC,MAAO,QAAQ,CAAC,CAAC,CACrF,OAAO,eAAgB,uBAAuB,CAC9C,OAAO,kBAAmB,4CAA4C,CACtE,OAAO,qBAAsB,+CAA+C,CAC5E,OAAO,KAAO,IAAyB,CACtC,MAAM,EAAY,EAAQ,EAC1B,CAEA,QAAQ,KAAK,QAAU,EAAG,CAC5B,EAAQ,YAAY,CACpB,OAGF,MAAM,EAAQ,YAAY,CAG5B,GAAM,CAAC,MAAO,GAAmB,CAC/B,QAAQ,MAAM,aAAiB,MAAQ,EAAM,QAAU,EAAM,CAC7D,QAAQ,SAAW,GACnB"}
|
|
1
|
+
{"version":3,"file":"uselets.mjs","names":[],"sources":["../../src/cli/uselets.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { spawn } from 'node:child_process'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\nimport readline from 'node:readline/promises'\nimport { fileURLToPath } from 'node:url'\n\nimport { Command, Option } from 'commander'\n\nconst SKILL_NAME = 'uselets-ui'\nconst DEFAULT_CSS_PATH = 'src/styles/globals.css'\nconst POSTCSS_CONFIG = \"export { default } from '@uselets/ui/postcss.config'\\n\"\nconst AGENT_TARGETS = {\n codex: path.join('.agents', 'skills', SKILL_NAME),\n claude: path.join('.claude', 'skills', SKILL_NAME)\n} as const\n\ntype AgentTarget = keyof typeof AGENT_TARGETS\ntype AgentOption = AgentTarget | 'all'\ntype ThemeOption = 'max' | 'gomax'\ntype PackageManager = 'bun' | 'pnpm' | 'yarn' | 'npm'\ntype PackageJson = {\n name?: string\n version?: string\n packageManager?: string\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n peerDependencies?: Record<string, string>\n optionalDependencies?: Record<string, string>\n}\ntype InitOptions = {\n theme?: ThemeOption\n css?: string\n installSkill?: boolean\n}\n\nconst ALL_AGENT_TARGETS = Object.keys(AGENT_TARGETS) as AgentTarget[]\n\nasync function pathExists(targetPath: string) {\n try {\n await fs.access(targetPath)\n return true\n } catch {\n return false\n }\n}\n\nasync function readJsonFile<T>(filePath: string) {\n return JSON.parse(await fs.readFile(filePath, 'utf8')) as T\n}\n\nasync function findPackageRoot() {\n let currentDir = fileURLToPath(new URL('.', import.meta.url))\n\n while (true) {\n try {\n await fs.access(path.join(currentDir, 'package.json'))\n return currentDir\n } catch {\n const parentDir = path.dirname(currentDir)\n\n if (parentDir === currentDir) {\n throw new Error('Unable to resolve @uselets/ui package root')\n }\n\n currentDir = parentDir\n }\n }\n}\n\nfunction resolveTargets(agent: AgentOption) {\n return agent === 'all' ? ALL_AGENT_TARGETS : [agent]\n}\n\nfunction hasDependency(packageJson: PackageJson, dependencyName: string) {\n return Boolean(\n packageJson.dependencies?.[dependencyName] ||\n packageJson.devDependencies?.[dependencyName] ||\n packageJson.peerDependencies?.[dependencyName] ||\n packageJson.optionalDependencies?.[dependencyName]\n )\n}\n\nasync function detectPackageManager(projectRoot: string, packageJson: PackageJson): Promise<PackageManager> {\n const declaredManager = packageJson.packageManager?.split('@')[0]\n\n if (\n declaredManager === 'bun' ||\n declaredManager === 'pnpm' ||\n declaredManager === 'yarn' ||\n declaredManager === 'npm'\n ) {\n return declaredManager\n }\n\n if (await pathExists(path.join(projectRoot, 'bun.lock'))) {\n return 'bun'\n }\n\n if (await pathExists(path.join(projectRoot, 'pnpm-lock.yaml'))) {\n return 'pnpm'\n }\n\n if (await pathExists(path.join(projectRoot, 'yarn.lock'))) {\n return 'yarn'\n }\n\n if (await pathExists(path.join(projectRoot, 'package-lock.json'))) {\n return 'npm'\n }\n\n return 'npm'\n}\n\nfunction buildAddCommand(packageManager: PackageManager, dependencies: string[], dev: boolean) {\n switch (packageManager) {\n case 'bun':\n return ['bun', 'add', ...(dev ? ['-d'] : []), ...dependencies]\n case 'pnpm':\n return ['pnpm', 'add', ...(dev ? ['-D'] : []), ...dependencies]\n case 'yarn':\n return ['yarn', 'add', ...(dev ? ['-D'] : []), ...dependencies]\n case 'npm':\n return ['npm', 'install', ...(dev ? ['-D'] : []), ...dependencies]\n }\n}\n\nasync function runCommand(commandParts: string[], cwd: string) {\n const [command, ...args] = commandParts\n\n if (!command) {\n throw new Error('Missing command')\n }\n\n console.log(`Running: ${commandParts.join(' ')}`)\n\n await new Promise<void>((resolve, reject) => {\n const child = spawn(command, args, { cwd, stdio: 'inherit' })\n\n child.on('error', reject)\n child.on('close', (code) => {\n if (code === 0) {\n resolve()\n return\n }\n\n reject(new Error(`${command} exited with code ${code}`))\n })\n })\n}\n\nfunction getPackageVersion(packageJson: PackageJson, dependencyName: string) {\n const version = packageJson.dependencies?.[dependencyName] ?? packageJson.devDependencies?.[dependencyName]\n\n if (!version) {\n throw new Error(`Unable to find ${dependencyName} version in @uselets/ui package metadata`)\n }\n\n return version\n}\n\nasync function installMissingDependencies(projectRoot: string, projectPackageJson: PackageJson) {\n const packageRoot = await findPackageRoot()\n const packageJson = await readJsonFile<PackageJson>(path.join(packageRoot, 'package.json'))\n const packageManager = await detectPackageManager(projectRoot, projectPackageJson)\n const runtimeDependencies = []\n const devDependencies = []\n\n if (!packageJson.name || !packageJson.version) {\n throw new Error('Unable to resolve @uselets/ui package name and version')\n }\n\n if (!hasDependency(projectPackageJson, packageJson.name)) {\n runtimeDependencies.push(`${packageJson.name}@${packageJson.version}`)\n }\n\n if (!hasDependency(projectPackageJson, '@fontsource-variable/inter')) {\n runtimeDependencies.push(\n `@fontsource-variable/inter@${getPackageVersion(packageJson, '@fontsource-variable/inter')}`\n )\n }\n\n if (!hasDependency(projectPackageJson, 'tailwindcss')) {\n devDependencies.push(`tailwindcss@${getPackageVersion(packageJson, 'tailwindcss')}`)\n }\n\n if (!hasDependency(projectPackageJson, '@tailwindcss/postcss')) {\n devDependencies.push(`@tailwindcss/postcss@${getPackageVersion(packageJson, '@tailwindcss/postcss')}`)\n }\n\n if (runtimeDependencies.length > 0) {\n await runCommand(buildAddCommand(packageManager, runtimeDependencies, false), projectRoot)\n } else {\n console.log('Runtime dependencies already declared.')\n }\n\n if (devDependencies.length > 0) {\n await runCommand(buildAddCommand(packageManager, devDependencies, true), projectRoot)\n } else {\n console.log('Tailwind dependencies already declared.')\n }\n}\n\nasync function installSkill(targets: AgentTarget[]) {\n const packageRoot = await findPackageRoot()\n const sourcePath = path.join(packageRoot, 'skills', SKILL_NAME)\n\n try {\n await fs.access(sourcePath)\n } catch {\n throw new Error(`Bundled skill not found at ${sourcePath}`)\n }\n\n const installedPaths = []\n\n for (const target of targets) {\n const targetPath = path.join(process.cwd(), AGENT_TARGETS[target])\n\n await fs.rm(targetPath, { recursive: true, force: true })\n await fs.mkdir(path.dirname(targetPath), { recursive: true })\n await fs.cp(sourcePath, targetPath, { recursive: true })\n\n installedPaths.push(targetPath)\n }\n\n console.log(`Installed ${SKILL_NAME} skill:`)\n\n for (const installedPath of installedPaths) {\n console.log(`- ${installedPath}`)\n }\n}\n\nasync function createPrompt() {\n return readline.createInterface({ input: process.stdin, output: process.stdout })\n}\n\nasync function promptTheme(defaultTheme: ThemeOption) {\n if (!process.stdin.isTTY) {\n return defaultTheme\n }\n\n const prompt = await createPrompt()\n\n try {\n while (true) {\n const answer = (await prompt.question(`Theme (max/gomax) [${defaultTheme}]: `)).trim().toLowerCase()\n\n if (!answer) {\n return defaultTheme\n }\n\n if (answer === 'max' || answer === 'gomax') {\n return answer\n }\n\n console.log('Please choose \"max\" or \"gomax\".')\n }\n } finally {\n prompt.close()\n }\n}\n\nasync function promptCssPath(defaultCssPath: string) {\n if (!process.stdin.isTTY) {\n return defaultCssPath\n }\n\n const prompt = await createPrompt()\n\n try {\n const answer = (await prompt.question(`Global CSS path [${defaultCssPath}]: `)).trim()\n return answer || defaultCssPath\n } finally {\n prompt.close()\n }\n}\n\nasync function promptInstallSkill() {\n if (!process.stdin.isTTY) {\n return false\n }\n\n const prompt = await createPrompt()\n\n try {\n while (true) {\n const answer = (await prompt.question('Install agent skill? (y/N): ')).trim().toLowerCase()\n\n if (!answer || answer === 'n' || answer === 'no') {\n return false\n }\n\n if (answer === 'y' || answer === 'yes') {\n return true\n }\n\n console.log('Please answer \"y\" or \"n\".')\n }\n } finally {\n prompt.close()\n }\n}\n\nasync function ensurePostcssConfig(projectRoot: string) {\n const postcssPath = path.join(projectRoot, 'postcss.config.mjs')\n\n if (await pathExists(postcssPath)) {\n console.log('Preserved existing postcss.config.mjs.')\n return\n }\n\n await fs.writeFile(postcssPath, POSTCSS_CONFIG)\n console.log('Created postcss.config.mjs.')\n}\n\nfunction buildPackageSource(cssPath: string) {\n const cssDir = path.posix.dirname(cssPath.replaceAll(path.sep, path.posix.sep))\n const relativeSource = path.posix.relative(cssDir, 'node_modules/@uselets/ui/dist')\n\n return relativeSource.startsWith('.') ? relativeSource : `./${relativeSource}`\n}\n\nfunction buildCssImports(source: string, theme: ThemeOption, cssPath: string) {\n const imports = []\n const hasTailwind = /@import\\s+['\"]tailwindcss['\"]/.test(source)\n const hasTheme = /@import\\s+['\"]@uselets\\/ui\\/themes\\/(?:max|gomax)\\.css['\"]/.test(source)\n const hasFont = /@import\\s+['\"]@fontsource-variable\\/inter['\"]/.test(source)\n const hasPackageSource = /@source\\s+['\"][^'\"]*@uselets\\/ui\\/dist['\"]/.test(source)\n\n if (!hasTailwind) {\n imports.push(\"@import 'tailwindcss';\")\n }\n\n if (!hasTheme) {\n imports.push(`@import '@uselets/ui/themes/${theme}.css';`)\n }\n\n if (!hasFont) {\n imports.push(\"@import '@fontsource-variable/inter';\")\n }\n\n if (!hasPackageSource) {\n imports.push(`@source '${buildPackageSource(cssPath)}';`)\n }\n\n return { imports, hasTheme }\n}\n\nasync function ensureGlobalCss(projectRoot: string, cssPath: string, theme: ThemeOption) {\n const absoluteCssPath = path.resolve(projectRoot, cssPath)\n const existingSource = (await pathExists(absoluteCssPath)) ? await fs.readFile(absoluteCssPath, 'utf8') : ''\n const { imports, hasTheme } = buildCssImports(existingSource, theme, cssPath)\n\n if (hasTheme) {\n console.log('Preserved existing @uselets/ui theme import.')\n }\n\n if (imports.length === 0) {\n console.log(`Global CSS already configured at ${cssPath}.`)\n return\n }\n\n const separator = existingSource.length > 0 && !existingSource.startsWith('\\n') ? '\\n' : ''\n const updatedSource = `${imports.join('\\n')}${separator}${existingSource}`\n\n await fs.mkdir(path.dirname(absoluteCssPath), { recursive: true })\n await fs.writeFile(absoluteCssPath, updatedSource)\n console.log(`Updated global CSS at ${cssPath}.`)\n}\n\nasync function initProject(options: InitOptions) {\n const projectRoot = process.cwd()\n const packageJsonPath = path.join(projectRoot, 'package.json')\n\n if (!(await pathExists(packageJsonPath))) {\n throw new Error('No package.json found in the current directory. Run uselets init from your project root.')\n }\n\n const projectPackageJson = await readJsonFile<PackageJson>(packageJsonPath)\n const theme = options.theme ?? (await promptTheme('max'))\n const cssPath = options.css ?? (await promptCssPath(DEFAULT_CSS_PATH))\n const shouldInstallSkill = options.installSkill ?? (await promptInstallSkill())\n\n await installMissingDependencies(projectRoot, projectPackageJson)\n await ensurePostcssConfig(projectRoot)\n await ensureGlobalCss(projectRoot, cssPath, theme)\n\n if (shouldInstallSkill) {\n await installSkill(ALL_AGENT_TARGETS)\n }\n}\n\nasync function main() {\n const program = new Command()\n\n program.name('uselets').description('CLI for @uselets/ui').showHelpAfterError()\n\n program\n .command('skill')\n .description(`Reinstall the ${SKILL_NAME} agent skill`)\n .addOption(\n new Option('--agent <agent>', 'Target agent directory').choices(['codex', 'claude', 'all']).default('all')\n )\n .action(async (options: { agent: AgentOption }) => {\n await installSkill(resolveTargets(options.agent))\n })\n\n program\n .command('init')\n .description('Set up @uselets/ui in this project')\n .addOption(new Option('--theme <theme>', 'Theme to import').choices(['max', 'gomax']))\n .option('--css <path>', 'Global CSS file path')\n .option('--install-skill', 'Install the agent skill without prompting')\n .option('--no-install-skill', 'Skip the agent skill prompt and installation')\n .action(async (options: InitOptions) => {\n await initProject(options)\n })\n\n if (process.argv.length <= 2) {\n program.outputHelp()\n return\n }\n\n await program.parseAsync()\n}\n\nmain().catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : error)\n process.exitCode = 1\n})\n"],"mappings":";mOAUA,MAAM,EAAa,aAGb,EAAgB,CACpB,MAAO,EAAK,KAAK,UAAW,SAAU,EAAW,CACjD,OAAQ,EAAK,KAAK,UAAW,SAAU,EAAW,CACnD,CAqBK,EAAoB,OAAO,KAAK,EAAc,CAEpD,eAAe,EAAW,EAAoB,CAC5C,GAAI,CAEF,OADA,MAAM,EAAG,OAAO,EAAW,CACpB,QACD,CACN,MAAO,IAIX,eAAe,EAAgB,EAAkB,CAC/C,OAAO,KAAK,MAAM,MAAM,EAAG,SAAS,EAAU,OAAO,CAAC,CAGxD,eAAe,GAAkB,CAC/B,IAAI,EAAa,EAAc,IAAI,IAAI,IAAK,OAAO,KAAK,IAAI,CAAC,CAE7D,OACE,GAAI,CAEF,OADA,MAAM,EAAG,OAAO,EAAK,KAAK,EAAY,eAAe,CAAC,CAC/C,OACD,CACN,IAAM,EAAY,EAAK,QAAQ,EAAW,CAE1C,GAAI,IAAc,EAChB,MAAU,MAAM,6CAA6C,CAG/D,EAAa,GAKnB,SAAS,EAAe,EAAoB,CAC1C,OAAO,IAAU,MAAQ,EAAoB,CAAC,EAAM,CAGtD,SAAS,EAAc,EAA0B,EAAwB,CACvE,MAAO,GACL,EAAY,eAAe,IACzB,EAAY,kBAAkB,IAC9B,EAAY,mBAAmB,IAC/B,EAAY,uBAAuB,IAIzC,eAAe,EAAqB,EAAqB,EAAmD,CAC1G,IAAM,EAAkB,EAAY,gBAAgB,MAAM,IAAI,CAAC,GA2B/D,OAxBE,IAAoB,OACpB,IAAoB,QACpB,IAAoB,QACpB,IAAoB,MAEb,EAGL,MAAM,EAAW,EAAK,KAAK,EAAa,WAAW,CAAC,CAC/C,MAGL,MAAM,EAAW,EAAK,KAAK,EAAa,iBAAiB,CAAC,CACrD,OAGL,MAAM,EAAW,EAAK,KAAK,EAAa,YAAY,CAAC,CAChD,QAGL,MAAM,EAAW,EAAK,KAAK,EAAa,oBAAoB,CAAC,CACxD,OAMX,SAAS,EAAgB,EAAgC,EAAwB,EAAc,CAC7F,OAAQ,EAAR,CACE,IAAK,MACH,MAAO,CAAC,MAAO,MAAO,GAAI,EAAM,CAAC,KAAK,CAAG,EAAE,CAAG,GAAG,EAAa,CAChE,IAAK,OACH,MAAO,CAAC,OAAQ,MAAO,GAAI,EAAM,CAAC,KAAK,CAAG,EAAE,CAAG,GAAG,EAAa,CACjE,IAAK,OACH,MAAO,CAAC,OAAQ,MAAO,GAAI,EAAM,CAAC,KAAK,CAAG,EAAE,CAAG,GAAG,EAAa,CACjE,IAAK,MACH,MAAO,CAAC,MAAO,UAAW,GAAI,EAAM,CAAC,KAAK,CAAG,EAAE,CAAG,GAAG,EAAa,EAIxE,eAAe,EAAW,EAAwB,EAAa,CAC7D,GAAM,CAAC,EAAS,GAAG,GAAQ,EAE3B,GAAI,CAAC,EACH,MAAU,MAAM,kBAAkB,CAGpC,QAAQ,IAAI,YAAY,EAAa,KAAK,IAAI,GAAG,CAEjD,MAAM,IAAI,SAAe,EAAS,IAAW,CAC3C,IAAM,EAAQ,EAAM,EAAS,EAAM,CAAE,MAAK,MAAO,UAAW,CAAC,CAE7D,EAAM,GAAG,QAAS,EAAO,CACzB,EAAM,GAAG,QAAU,GAAS,CAC1B,GAAI,IAAS,EAAG,CACd,GAAS,CACT,OAGF,EAAW,MAAM,GAAG,EAAQ,oBAAoB,IAAO,CAAC,EACxD,EACF,CAGJ,SAAS,EAAkB,EAA0B,EAAwB,CAC3E,IAAM,EAAU,EAAY,eAAe,IAAmB,EAAY,kBAAkB,GAE5F,GAAI,CAAC,EACH,MAAU,MAAM,kBAAkB,EAAe,0CAA0C,CAG7F,OAAO,EAGT,eAAe,EAA2B,EAAqB,EAAiC,CAC9F,IAAM,EAAc,MAAM,GAAiB,CACrC,EAAc,MAAM,EAA0B,EAAK,KAAK,EAAa,eAAe,CAAC,CACrF,EAAiB,MAAM,EAAqB,EAAa,EAAmB,CAC5E,EAAsB,EAAE,CACxB,EAAkB,EAAE,CAE1B,GAAI,CAAC,EAAY,MAAQ,CAAC,EAAY,QACpC,MAAU,MAAM,yDAAyD,CAGtE,EAAc,EAAoB,EAAY,KAAK,EACtD,EAAoB,KAAK,GAAG,EAAY,KAAK,GAAG,EAAY,UAAU,CAGnE,EAAc,EAAoB,6BAA6B,EAClE,EAAoB,KAClB,8BAA8B,EAAkB,EAAa,6BAA6B,GAC3F,CAGE,EAAc,EAAoB,cAAc,EACnD,EAAgB,KAAK,eAAe,EAAkB,EAAa,cAAc,GAAG,CAGjF,EAAc,EAAoB,uBAAuB,EAC5D,EAAgB,KAAK,wBAAwB,EAAkB,EAAa,uBAAuB,GAAG,CAGpG,EAAoB,OAAS,EAC/B,MAAM,EAAW,EAAgB,EAAgB,EAAqB,GAAM,CAAE,EAAY,CAE1F,QAAQ,IAAI,yCAAyC,CAGnD,EAAgB,OAAS,EAC3B,MAAM,EAAW,EAAgB,EAAgB,EAAiB,GAAK,CAAE,EAAY,CAErF,QAAQ,IAAI,0CAA0C,CAI1D,eAAe,EAAa,EAAwB,CAClD,IAAM,EAAc,MAAM,GAAiB,CACrC,EAAa,EAAK,KAAK,EAAa,SAAU,EAAW,CAE/D,GAAI,CACF,MAAM,EAAG,OAAO,EAAW,MACrB,CACN,MAAU,MAAM,8BAA8B,IAAa,CAG7D,IAAM,EAAiB,EAAE,CAEzB,IAAK,IAAM,KAAU,EAAS,CAC5B,IAAM,EAAa,EAAK,KAAK,QAAQ,KAAK,CAAE,EAAc,GAAQ,CAElE,MAAM,EAAG,GAAG,EAAY,CAAE,UAAW,GAAM,MAAO,GAAM,CAAC,CACzD,MAAM,EAAG,MAAM,EAAK,QAAQ,EAAW,CAAE,CAAE,UAAW,GAAM,CAAC,CAC7D,MAAM,EAAG,GAAG,EAAY,EAAY,CAAE,UAAW,GAAM,CAAC,CAExD,EAAe,KAAK,EAAW,CAGjC,QAAQ,IAAI,aAAa,EAAW,SAAS,CAE7C,IAAK,IAAM,KAAiB,EAC1B,QAAQ,IAAI,KAAK,IAAgB,CAIrC,eAAe,GAAe,CAC5B,OAAO,EAAS,gBAAgB,CAAE,MAAO,QAAQ,MAAO,OAAQ,QAAQ,OAAQ,CAAC,CAGnF,eAAe,EAAY,EAA2B,CACpD,GAAI,CAAC,QAAQ,MAAM,MACjB,OAAO,EAGT,IAAM,EAAS,MAAM,GAAc,CAEnC,GAAI,CACF,OAAa,CACX,IAAM,GAAU,MAAM,EAAO,SAAS,sBAAsB,EAAa,KAAK,EAAE,MAAM,CAAC,aAAa,CAEpG,GAAI,CAAC,EACH,OAAO,EAGT,GAAI,IAAW,OAAS,IAAW,QACjC,OAAO,EAGT,QAAQ,IAAI,kCAAkC,SAExC,CACR,EAAO,OAAO,EAIlB,eAAe,EAAc,EAAwB,CACnD,GAAI,CAAC,QAAQ,MAAM,MACjB,OAAO,EAGT,IAAM,EAAS,MAAM,GAAc,CAEnC,GAAI,CAEF,OADgB,MAAM,EAAO,SAAS,oBAAoB,EAAe,KAAK,EAAE,MACnE,EAAI,SACT,CACR,EAAO,OAAO,EAIlB,eAAe,GAAqB,CAClC,GAAI,CAAC,QAAQ,MAAM,MACjB,MAAO,GAGT,IAAM,EAAS,MAAM,GAAc,CAEnC,GAAI,CACF,OAAa,CACX,IAAM,GAAU,MAAM,EAAO,SAAS,+BAA+B,EAAE,MAAM,CAAC,aAAa,CAE3F,GAAI,CAAC,GAAU,IAAW,KAAO,IAAW,KAC1C,MAAO,GAGT,GAAI,IAAW,KAAO,IAAW,MAC/B,MAAO,GAGT,QAAQ,IAAI,4BAA4B,SAElC,CACR,EAAO,OAAO,EAIlB,eAAe,EAAoB,EAAqB,CACtD,IAAM,EAAc,EAAK,KAAK,EAAa,qBAAqB,CAEhE,GAAI,MAAM,EAAW,EAAY,CAAE,CACjC,QAAQ,IAAI,yCAAyC,CACrD,OAGF,MAAM,EAAG,UAAU,EAAa;EAAe,CAC/C,QAAQ,IAAI,8BAA8B,CAG5C,SAAS,EAAmB,EAAiB,CAC3C,IAAM,EAAS,EAAK,MAAM,QAAQ,EAAQ,WAAW,EAAK,IAAK,EAAK,MAAM,IAAI,CAAC,CACzE,EAAiB,EAAK,MAAM,SAAS,EAAQ,gCAAgC,CAEnF,OAAO,EAAe,WAAW,IAAI,CAAG,EAAiB,KAAK,IAGhE,SAAS,EAAgB,EAAgB,EAAoB,EAAiB,CAC5E,IAAM,EAAU,EAAE,CACZ,EAAc,gCAAgC,KAAK,EAAO,CAC1D,EAAW,6DAA6D,KAAK,EAAO,CACpF,EAAU,gDAAgD,KAAK,EAAO,CACtE,EAAmB,6CAA6C,KAAK,EAAO,CAkBlF,OAhBK,GACH,EAAQ,KAAK,yBAAyB,CAGnC,GACH,EAAQ,KAAK,+BAA+B,EAAM,QAAQ,CAGvD,GACH,EAAQ,KAAK,wCAAwC,CAGlD,GACH,EAAQ,KAAK,YAAY,EAAmB,EAAQ,CAAC,IAAI,CAGpD,CAAE,UAAS,WAAU,CAG9B,eAAe,EAAgB,EAAqB,EAAiB,EAAoB,CACvF,IAAM,EAAkB,EAAK,QAAQ,EAAa,EAAQ,CACpD,EAAkB,MAAM,EAAW,EAAgB,CAAI,MAAM,EAAG,SAAS,EAAiB,OAAO,CAAG,GACpG,CAAE,UAAS,YAAa,EAAgB,EAAgB,EAAO,EAAQ,CAM7E,GAJI,GACF,QAAQ,IAAI,+CAA+C,CAGzD,EAAQ,SAAW,EAAG,CACxB,QAAQ,IAAI,oCAAoC,EAAQ,GAAG,CAC3D,OAGF,IAAM,EAAY,EAAe,OAAS,GAAK,CAAC,EAAe,WAAW;EAAK,CAAG;EAAO,GACnF,EAAgB,GAAG,EAAQ,KAAK;EAAK,GAAG,IAAY,IAE1D,MAAM,EAAG,MAAM,EAAK,QAAQ,EAAgB,CAAE,CAAE,UAAW,GAAM,CAAC,CAClE,MAAM,EAAG,UAAU,EAAiB,EAAc,CAClD,QAAQ,IAAI,yBAAyB,EAAQ,GAAG,CAGlD,eAAe,EAAY,EAAsB,CAC/C,IAAM,EAAc,QAAQ,KAAK,CAC3B,EAAkB,EAAK,KAAK,EAAa,eAAe,CAE9D,GAAI,CAAE,MAAM,EAAW,EAAgB,CACrC,MAAU,MAAM,2FAA2F,CAG7G,IAAM,EAAqB,MAAM,EAA0B,EAAgB,CACrE,EAAQ,EAAQ,OAAU,MAAM,EAAY,MAAM,CAClD,EAAU,EAAQ,KAAQ,MAAM,EAAc,yBAAiB,CAC/D,EAAqB,EAAQ,cAAiB,MAAM,GAAoB,CAE9E,MAAM,EAA2B,EAAa,EAAmB,CACjE,MAAM,EAAoB,EAAY,CACtC,MAAM,EAAgB,EAAa,EAAS,EAAM,CAE9C,GACF,MAAM,EAAa,EAAkB,CAIzC,eAAe,GAAO,CACpB,IAAM,EAAU,IAAI,EAyBpB,GAvBA,EAAQ,KAAK,UAAU,CAAC,YAAY,sBAAsB,CAAC,oBAAoB,CAE/E,EACG,QAAQ,QAAQ,CAChB,YAAY,iBAAiB,EAAW,cAAc,CACtD,UACC,IAAI,EAAO,kBAAmB,yBAAyB,CAAC,QAAQ,CAAC,QAAS,SAAU,MAAM,CAAC,CAAC,QAAQ,MAAM,CAC3G,CACA,OAAO,KAAO,IAAoC,CACjD,MAAM,EAAa,EAAe,EAAQ,MAAM,CAAC,EACjD,CAEJ,EACG,QAAQ,OAAO,CACf,YAAY,qCAAqC,CACjD,UAAU,IAAI,EAAO,kBAAmB,kBAAkB,CAAC,QAAQ,CAAC,MAAO,QAAQ,CAAC,CAAC,CACrF,OAAO,eAAgB,uBAAuB,CAC9C,OAAO,kBAAmB,4CAA4C,CACtE,OAAO,qBAAsB,+CAA+C,CAC5E,OAAO,KAAO,IAAyB,CACtC,MAAM,EAAY,EAAQ,EAC1B,CAEA,QAAQ,KAAK,QAAU,EAAG,CAC5B,EAAQ,YAAY,CACpB,OAGF,MAAM,EAAQ,YAAY,CAG5B,GAAM,CAAC,MAAO,GAAmB,CAC/B,QAAQ,MAAM,aAAiB,MAAQ,EAAM,QAAU,EAAM,CAC7D,QAAQ,SAAW,GACnB"}
|
|
@@ -10,15 +10,15 @@ type AlertDialogTriggerProps = React.ComponentProps<typeof AlertDialog$1.Trigger
|
|
|
10
10
|
type AlertDialogPortalProps = React.ComponentProps<typeof AlertDialog$1.Portal>;
|
|
11
11
|
type AlertDialogOverlayProps = React.ComponentProps<typeof AlertDialog$1.Overlay>;
|
|
12
12
|
type AlertDialogContentProps = React.ComponentProps<typeof AlertDialog$1.Content> & {
|
|
13
|
-
size?: '
|
|
13
|
+
size?: 'sm' | 'md';
|
|
14
14
|
};
|
|
15
15
|
type AlertDialogHeaderProps = React.ComponentProps<'div'>;
|
|
16
16
|
type AlertDialogFooterProps = React.ComponentProps<'div'>;
|
|
17
17
|
type AlertDialogMediaProps = React.ComponentProps<'div'>;
|
|
18
18
|
type AlertDialogTitleProps = React.ComponentProps<typeof AlertDialog$1.Title>;
|
|
19
19
|
type AlertDialogDescriptionProps = React.ComponentProps<typeof AlertDialog$1.Description>;
|
|
20
|
-
type AlertDialogActionProps = React.ComponentProps<typeof AlertDialog$1.Action> & Pick<React.ComponentProps<typeof Button>, 'variant' | 'size'>;
|
|
21
|
-
type AlertDialogCancelProps = React.ComponentProps<typeof AlertDialog$1.Cancel> & Pick<React.ComponentProps<typeof Button>, 'variant' | 'size'>;
|
|
20
|
+
type AlertDialogActionProps = React.ComponentProps<typeof AlertDialog$1.Action> & Pick<React.ComponentProps<typeof Button>, 'variant' | 'color' | 'size'>;
|
|
21
|
+
type AlertDialogCancelProps = React.ComponentProps<typeof AlertDialog$1.Cancel> & Pick<React.ComponentProps<typeof Button>, 'variant' | 'color' | 'size'>;
|
|
22
22
|
declare function AlertDialog({
|
|
23
23
|
...props
|
|
24
24
|
}: AlertDialogProps): _$react_jsx_runtime0.JSX.Element;
|
|
@@ -60,12 +60,14 @@ declare function AlertDialogDescription({
|
|
|
60
60
|
declare function AlertDialogAction({
|
|
61
61
|
className,
|
|
62
62
|
variant,
|
|
63
|
+
color,
|
|
63
64
|
size,
|
|
64
65
|
...props
|
|
65
66
|
}: AlertDialogActionProps): _$react_jsx_runtime0.JSX.Element;
|
|
66
67
|
declare function AlertDialogCancel({
|
|
67
68
|
className,
|
|
68
69
|
variant,
|
|
70
|
+
color,
|
|
69
71
|
size,
|
|
70
72
|
...props
|
|
71
73
|
}: AlertDialogCancelProps): _$react_jsx_runtime0.JSX.Element;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"../chunk-CHh1Zzun.js";import{cn as e}from"../lib/utils.js";import{Button as t}from"./button.js";import{AlertDialog as n}from"radix-ui";import{jsx as r,jsxs as i}from"react/jsx-runtime";function AlertDialog({...e}){return r(n.Root,{"data-slot":`alert-dialog`,...e})}function AlertDialogTrigger({...e}){return r(n.Trigger,{"data-slot":`alert-dialog-trigger`,...e})}function AlertDialogPortal({...e}){return r(n.Portal,{"data-slot":`alert-dialog-portal`,...e})}function AlertDialogOverlay({className:t,...i}){return r(n.Overlay,{"data-slot":`alert-dialog-overlay`,className:e(`fixed inset-0 z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0`,t),...i})}function AlertDialogContent({className:t,size:a=`
|
|
1
|
+
import"../chunk-CHh1Zzun.js";import{cn as e}from"../lib/utils.js";import{Button as t}from"./button.js";import{AlertDialog as n}from"radix-ui";import{jsx as r,jsxs as i}from"react/jsx-runtime";function AlertDialog({...e}){return r(n.Root,{"data-slot":`alert-dialog`,...e})}function AlertDialogTrigger({...e}){return r(n.Trigger,{"data-slot":`alert-dialog-trigger`,...e})}function AlertDialogPortal({...e}){return r(n.Portal,{"data-slot":`alert-dialog-portal`,...e})}function AlertDialogOverlay({className:t,...i}){return r(n.Overlay,{"data-slot":`alert-dialog-overlay`,className:e(`fixed inset-0 z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0`,t),...i})}function AlertDialogContent({className:t,size:a=`md`,...o}){return i(AlertDialogPortal,{children:[r(AlertDialogOverlay,{}),r(n.Content,{"data-slot":`alert-dialog-content`,"data-size":a,className:e(`group/alert-dialog-content fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-background p-4 ring-1 ring-foreground/10 duration-100 outline-none data-[size=md]:max-w-xs data-[size=sm]:max-w-xs data-[size=md]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95`,t),...o})]})}function AlertDialogHeader({className:t,...n}){return r(`div`,{"data-slot":`alert-dialog-header`,className:e(`grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-4 sm:group-data-[size=md]/alert-dialog-content:place-items-start sm:group-data-[size=md]/alert-dialog-content:text-left sm:group-data-[size=md]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]`,t),...n})}function AlertDialogFooter({className:t,...n}){return r(`div`,{"data-slot":`alert-dialog-footer`,className:e(`-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end`,t),...n})}function AlertDialogMedia({className:t,...n}){return r(`div`,{"data-slot":`alert-dialog-media`,className:e(`mb-2 inline-flex size-10 items-center justify-center rounded-md bg-muted sm:group-data-[size=md]/alert-dialog-content:row-span-2 *:[svg:not([class*='size-'])]:size-6`,t),...n})}function AlertDialogTitle({className:t,...i}){return r(n.Title,{"data-slot":`alert-dialog-title`,className:e(`text-base font-medium sm:group-data-[size=md]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2`,t),...i})}function AlertDialogDescription({className:t,...i}){return r(n.Description,{"data-slot":`alert-dialog-description`,className:e(`text-sm text-balance text-muted-foreground md:text-pretty *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground`,t),...i})}function AlertDialogAction({className:i,variant:a=`solid`,color:o=`primary`,size:s=`md`,...c}){return r(t,{variant:a,color:o,size:s,asChild:!0,children:r(n.Action,{"data-slot":`alert-dialog-action`,className:e(i),...c})})}function AlertDialogCancel({className:i,variant:a=`outline`,color:o=`primary`,size:s=`md`,...c}){return r(t,{variant:a,color:o,size:s,asChild:!0,children:r(n.Cancel,{"data-slot":`alert-dialog-cancel`,className:e(i),...c})})}export{AlertDialog,AlertDialogAction,AlertDialogCancel,AlertDialogContent,AlertDialogDescription,AlertDialogFooter,AlertDialogHeader,AlertDialogMedia,AlertDialogOverlay,AlertDialogPortal,AlertDialogTitle,AlertDialogTrigger};
|
|
2
2
|
//# sourceMappingURL=alert-dialog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alert-dialog.js","names":["AlertDialogPrimitive"],"sources":["../../src/components/alert-dialog.tsx"],"sourcesContent":["import type * as React from 'react'\n\nimport { AlertDialog as AlertDialogPrimitive } from 'radix-ui'\n\nimport { cn } from '../lib/utils'\nimport { Button } from './button'\n\nexport type AlertDialogProps = React.ComponentProps<typeof AlertDialogPrimitive.Root>\n\nexport type AlertDialogTriggerProps = React.ComponentProps<typeof AlertDialogPrimitive.Trigger>\n\nexport type AlertDialogPortalProps = React.ComponentProps<typeof AlertDialogPrimitive.Portal>\n\nexport type AlertDialogOverlayProps = React.ComponentProps<typeof AlertDialogPrimitive.Overlay>\n\nexport type AlertDialogContentProps = React.ComponentProps<typeof AlertDialogPrimitive.Content> & {\n size?: '
|
|
1
|
+
{"version":3,"file":"alert-dialog.js","names":["AlertDialogPrimitive"],"sources":["../../src/components/alert-dialog.tsx"],"sourcesContent":["import type * as React from 'react'\n\nimport { AlertDialog as AlertDialogPrimitive } from 'radix-ui'\n\nimport { cn } from '../lib/utils'\nimport { Button } from './button'\n\nexport type AlertDialogProps = React.ComponentProps<typeof AlertDialogPrimitive.Root>\n\nexport type AlertDialogTriggerProps = React.ComponentProps<typeof AlertDialogPrimitive.Trigger>\n\nexport type AlertDialogPortalProps = React.ComponentProps<typeof AlertDialogPrimitive.Portal>\n\nexport type AlertDialogOverlayProps = React.ComponentProps<typeof AlertDialogPrimitive.Overlay>\n\nexport type AlertDialogContentProps = React.ComponentProps<typeof AlertDialogPrimitive.Content> & {\n size?: 'sm' | 'md'\n}\n\nexport type AlertDialogHeaderProps = React.ComponentProps<'div'>\n\nexport type AlertDialogFooterProps = React.ComponentProps<'div'>\n\nexport type AlertDialogMediaProps = React.ComponentProps<'div'>\n\nexport type AlertDialogTitleProps = React.ComponentProps<typeof AlertDialogPrimitive.Title>\n\nexport type AlertDialogDescriptionProps = React.ComponentProps<typeof AlertDialogPrimitive.Description>\n\nexport type AlertDialogActionProps = React.ComponentProps<typeof AlertDialogPrimitive.Action> &\n Pick<React.ComponentProps<typeof Button>, 'variant' | 'color' | 'size'>\n\nexport type AlertDialogCancelProps = React.ComponentProps<typeof AlertDialogPrimitive.Cancel> &\n Pick<React.ComponentProps<typeof Button>, 'variant' | 'color' | 'size'>\n\nfunction AlertDialog({ ...props }: AlertDialogProps) {\n return <AlertDialogPrimitive.Root data-slot=\"alert-dialog\" {...props} />\n}\n\nfunction AlertDialogTrigger({ ...props }: AlertDialogTriggerProps) {\n return <AlertDialogPrimitive.Trigger data-slot=\"alert-dialog-trigger\" {...props} />\n}\n\nfunction AlertDialogPortal({ ...props }: AlertDialogPortalProps) {\n return <AlertDialogPrimitive.Portal data-slot=\"alert-dialog-portal\" {...props} />\n}\n\nfunction AlertDialogOverlay({ className, ...props }: AlertDialogOverlayProps) {\n return (\n <AlertDialogPrimitive.Overlay\n data-slot=\"alert-dialog-overlay\"\n className={cn(\n 'fixed inset-0 z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogContent({ className, size = 'md', ...props }: AlertDialogContentProps) {\n return (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n data-slot=\"alert-dialog-content\"\n data-size={size}\n className={cn(\n 'group/alert-dialog-content fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-background p-4 ring-1 ring-foreground/10 duration-100 outline-none data-[size=md]:max-w-xs data-[size=sm]:max-w-xs data-[size=md]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95',\n className\n )}\n {...props}\n />\n </AlertDialogPortal>\n )\n}\n\nfunction AlertDialogHeader({ className, ...props }: AlertDialogHeaderProps) {\n return (\n <div\n data-slot=\"alert-dialog-header\"\n className={cn(\n 'grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-4 sm:group-data-[size=md]/alert-dialog-content:place-items-start sm:group-data-[size=md]/alert-dialog-content:text-left sm:group-data-[size=md]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogFooter({ className, ...props }: AlertDialogFooterProps) {\n return (\n <div\n data-slot=\"alert-dialog-footer\"\n className={cn(\n '-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogMedia({ className, ...props }: AlertDialogMediaProps) {\n return (\n <div\n data-slot=\"alert-dialog-media\"\n className={cn(\n \"mb-2 inline-flex size-10 items-center justify-center rounded-md bg-muted sm:group-data-[size=md]/alert-dialog-content:row-span-2 *:[svg:not([class*='size-'])]:size-6\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogTitle({ className, ...props }: AlertDialogTitleProps) {\n return (\n <AlertDialogPrimitive.Title\n data-slot=\"alert-dialog-title\"\n className={cn(\n 'text-base font-medium sm:group-data-[size=md]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogDescription({ className, ...props }: AlertDialogDescriptionProps) {\n return (\n <AlertDialogPrimitive.Description\n data-slot=\"alert-dialog-description\"\n className={cn(\n 'text-sm text-balance text-muted-foreground md:text-pretty *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogAction({\n className,\n variant = 'solid',\n color = 'primary',\n size = 'md',\n ...props\n}: AlertDialogActionProps) {\n return (\n <Button variant={variant} color={color} size={size} asChild>\n <AlertDialogPrimitive.Action data-slot=\"alert-dialog-action\" className={cn(className)} {...props} />\n </Button>\n )\n}\n\nfunction AlertDialogCancel({\n className,\n variant = 'outline',\n color = 'primary',\n size = 'md',\n ...props\n}: AlertDialogCancelProps) {\n return (\n <Button variant={variant} color={color} size={size} asChild>\n <AlertDialogPrimitive.Cancel data-slot=\"alert-dialog-cancel\" className={cn(className)} {...props} />\n </Button>\n )\n}\n\nexport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogMedia,\n AlertDialogOverlay,\n AlertDialogPortal,\n AlertDialogTitle,\n AlertDialogTrigger\n}\n"],"mappings":"gMAmCA,SAAS,YAAY,CAAE,GAAG,GAA2B,CACnD,OAAO,EAACA,EAAqB,KAAtB,CAA2B,YAAU,eAAe,GAAI,EAAS,CAAA,CAG1E,SAAS,mBAAmB,CAAE,GAAG,GAAkC,CACjE,OAAO,EAACA,EAAqB,QAAtB,CAA8B,YAAU,uBAAuB,GAAI,EAAS,CAAA,CAGrF,SAAS,kBAAkB,CAAE,GAAG,GAAiC,CAC/D,OAAO,EAACA,EAAqB,OAAtB,CAA6B,YAAU,sBAAsB,GAAI,EAAS,CAAA,CAGnF,SAAS,mBAAmB,CAAE,YAAW,GAAG,GAAkC,CAC5E,OACE,EAACA,EAAqB,QAAtB,CACE,YAAU,uBACV,UAAW,EACT,gLACA,EACD,CACD,GAAI,EACJ,CAAA,CAIN,SAAS,mBAAmB,CAAE,YAAW,OAAO,KAAM,GAAG,GAAkC,CACzF,OACE,EAAC,kBAAD,CAAA,SAAA,CACE,EAAC,mBAAD,EAAsB,CAAA,CACtB,EAACA,EAAqB,QAAtB,CACE,YAAU,uBACV,YAAW,EACX,UAAW,EACT,8YACA,EACD,CACD,GAAI,EACJ,CAAA,CACgB,CAAA,CAAA,CAIxB,SAAS,kBAAkB,CAAE,YAAW,GAAG,GAAiC,CAC1E,OACE,EAAC,MAAD,CACE,YAAU,sBACV,UAAW,EACT,sYACA,EACD,CACD,GAAI,EACJ,CAAA,CAIN,SAAS,kBAAkB,CAAE,YAAW,GAAG,GAAiC,CAC1E,OACE,EAAC,MAAD,CACE,YAAU,sBACV,UAAW,EACT,gNACA,EACD,CACD,GAAI,EACJ,CAAA,CAIN,SAAS,iBAAiB,CAAE,YAAW,GAAG,GAAgC,CACxE,OACE,EAAC,MAAD,CACE,YAAU,qBACV,UAAW,EACT,wKACA,EACD,CACD,GAAI,EACJ,CAAA,CAIN,SAAS,iBAAiB,CAAE,YAAW,GAAG,GAAgC,CACxE,OACE,EAACA,EAAqB,MAAtB,CACE,YAAU,qBACV,UAAW,EACT,+IACA,EACD,CACD,GAAI,EACJ,CAAA,CAIN,SAAS,uBAAuB,CAAE,YAAW,GAAG,GAAsC,CACpF,OACE,EAACA,EAAqB,YAAtB,CACE,YAAU,2BACV,UAAW,EACT,iIACA,EACD,CACD,GAAI,EACJ,CAAA,CAIN,SAAS,kBAAkB,CACzB,YACA,UAAU,QACV,QAAQ,UACR,OAAO,KACP,GAAG,GACsB,CACzB,OACE,EAAC,EAAD,CAAiB,UAAgB,QAAa,OAAM,QAAA,YAClD,EAACA,EAAqB,OAAtB,CAA6B,YAAU,sBAAsB,UAAW,EAAG,EAAU,CAAE,GAAI,EAAS,CAAA,CAC7F,CAAA,CAIb,SAAS,kBAAkB,CACzB,YACA,UAAU,UACV,QAAQ,UACR,OAAO,KACP,GAAG,GACsB,CACzB,OACE,EAAC,EAAD,CAAiB,UAAgB,QAAa,OAAM,QAAA,YAClD,EAACA,EAAqB,OAAtB,CAA6B,YAAU,sBAAsB,UAAW,EAAG,EAAU,CAAE,GAAI,EAAS,CAAA,CAC7F,CAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"../chunk-CHh1Zzun.js";import{cn as e}from"../lib/utils.js";import{Slot as t}from"radix-ui";import{jsx as n}from"react/jsx-runtime";import{cva as r}from"class-variance-authority";const i=r(`text-primary rounded-sm underline-offset-4 transition-colors outline-none hover:text-primary/80 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-3`,{variants:{size:{xs:`text-xs
|
|
1
|
+
import"../chunk-CHh1Zzun.js";import{cn as e}from"../lib/utils.js";import{Slot as t}from"radix-ui";import{jsx as n}from"react/jsx-runtime";import{cva as r}from"class-variance-authority";const i=r(`text-primary rounded-sm underline-offset-4 transition-colors outline-none hover:text-primary/80 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-3`,{variants:{size:{xs:`text-xs`,sm:`text-sm`,md:`text-base`,lg:`text-lg`,xl:`text-xl`},underline:{always:`underline`,hover:`no-underline hover:underline`,never:`no-underline`,"not-hover":`underline hover:no-underline`}},defaultVariants:{size:`md`,underline:`hover`}});function Anchor({className:r,size:a=`md`,underline:o=`hover`,asChild:s=!1,...c}){return n(s?t.Root:`a`,{"data-slot":`anchor`,"data-size":a,"data-underline":o,className:e(i({size:a,underline:o}),r),...c})}export{Anchor,i as anchorVariants};
|
|
2
2
|
//# sourceMappingURL=anchor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anchor.js","names":[],"sources":["../../src/components/anchor.tsx"],"sourcesContent":["import type * as React from 'react'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { Slot } from 'radix-ui'\n\nimport { cn } from '../lib/utils'\n\nconst anchorVariants = cva(\n 'text-primary rounded-sm underline-offset-4 transition-colors outline-none hover:text-primary/80 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-3',\n {\n variants: {\n size: {\n xs: 'text-xs
|
|
1
|
+
{"version":3,"file":"anchor.js","names":[],"sources":["../../src/components/anchor.tsx"],"sourcesContent":["import type * as React from 'react'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { Slot } from 'radix-ui'\n\nimport { cn } from '../lib/utils'\n\nconst anchorVariants = cva(\n 'text-primary rounded-sm underline-offset-4 transition-colors outline-none hover:text-primary/80 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-3',\n {\n variants: {\n size: {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n xl: 'text-xl'\n },\n underline: {\n always: 'underline',\n hover: 'no-underline hover:underline',\n never: 'no-underline',\n 'not-hover': 'underline hover:no-underline'\n }\n },\n defaultVariants: {\n size: 'md',\n underline: 'hover'\n }\n }\n)\n\nexport type AnchorProps = React.ComponentProps<'a'> &\n VariantProps<typeof anchorVariants> & {\n asChild?: boolean\n }\n\nfunction Anchor({ className, size = 'md', underline = 'hover', asChild = false, ...props }: AnchorProps) {\n const Comp = asChild ? Slot.Root : 'a'\n\n return (\n <Comp\n data-slot=\"anchor\"\n data-size={size}\n data-underline={underline}\n className={cn(anchorVariants({ size, underline }), className)}\n {...props}\n />\n )\n}\n\nexport { Anchor, anchorVariants }\n"],"mappings":"yLAOA,MAAM,EAAiB,EACrB,4KACA,CACE,SAAU,CACR,KAAM,CACJ,GAAI,UACJ,GAAI,UACJ,GAAI,YACJ,GAAI,UACJ,GAAI,UACL,CACD,UAAW,CACT,OAAQ,YACR,MAAO,+BACP,MAAO,eACP,YAAa,+BACd,CACF,CACD,gBAAiB,CACf,KAAM,KACN,UAAW,QACZ,CACF,CACF,CAOD,SAAS,OAAO,CAAE,YAAW,OAAO,KAAM,YAAY,QAAS,UAAU,GAAO,GAAG,GAAsB,CAGvG,OACE,EAHW,EAAU,EAAK,KAAO,IAGjC,CACE,YAAU,SACV,YAAW,EACX,iBAAgB,EAChB,UAAW,EAAG,EAAe,CAAE,OAAM,YAAW,CAAC,CAAE,EAAU,CAC7D,GAAI,EACJ,CAAA"}
|
|
@@ -5,7 +5,7 @@ import * as React from "react";
|
|
|
5
5
|
|
|
6
6
|
//#region src/components/avatar.d.ts
|
|
7
7
|
type AvatarProps = React.ComponentProps<typeof Avatar$1.Root> & {
|
|
8
|
-
size?: '
|
|
8
|
+
size?: 'sm' | 'md' | 'lg';
|
|
9
9
|
};
|
|
10
10
|
type AvatarImageProps = React.ComponentProps<typeof Avatar$1.Image>;
|
|
11
11
|
type AvatarFallbackProps = React.ComponentProps<typeof Avatar$1.Fallback>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"../chunk-CHh1Zzun.js";import{cn as e}from"../lib/utils.js";import{Avatar as t}from"radix-ui";import{jsx as n}from"react/jsx-runtime";function Avatar({className:r,size:i=`
|
|
1
|
+
import"../chunk-CHh1Zzun.js";import{cn as e}from"../lib/utils.js";import{Avatar as t}from"radix-ui";import{jsx as n}from"react/jsx-runtime";function Avatar({className:r,size:i=`md`,...a}){return n(t.Root,{"data-slot":`avatar`,"data-size":i,className:e(`group/avatar relative flex shrink-0 size-8 rounded-full select-none`,`data-[size=lg]:size-10 data-[size=sm]:size-6`,`after:absolute after:inset-0 after:rounded-full after:border after:border-border after:mix-blend-darken dark:after:mix-blend-lighten`,r),...a})}function AvatarImage({className:r,...i}){return n(t.Image,{"data-slot":`avatar-image`,className:e(`rounded-full aspect-square size-full object-cover`,r),...i})}function AvatarFallback({className:r,...i}){return n(t.Fallback,{"data-slot":`avatar-fallback`,className:e(`bg-muted text-muted-foreground rounded-full flex size-full items-center justify-center text-sm group-data-[size=sm]/avatar:text-xs`,r),...i})}function AvatarBadge({className:t,...r}){return n(`span`,{"data-slot":`avatar-badge`,className:e(`bg-primary text-primary-foreground ring-background absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-blend-color ring-2 select-none`,`group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden`,`group-data-[size=md]/avatar:size-2.5 group-data-[size=md]/avatar:[&>svg]:size-2`,`group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2`,t),...r})}function AvatarGroup({className:t,...r}){return n(`div`,{"data-slot":`avatar-group`,className:e(`*:data-[slot=avatar]:ring-background group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2`,t),...r})}function AvatarGroupCount({className:t,...r}){return n(`div`,{"data-slot":`avatar-group-count`,className:e(`bg-muted text-muted-foreground ring-background relative flex shrink-0 items-center justify-center size-8 rounded-full text-sm ring-2`,`group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6`,`[&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3`,t),...r})}export{Avatar,AvatarBadge,AvatarFallback,AvatarGroup,AvatarGroupCount,AvatarImage};
|
|
2
2
|
//# sourceMappingURL=avatar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avatar.js","names":["AvatarPrimitive"],"sources":["../../src/components/avatar.tsx"],"sourcesContent":["import type * as React from 'react'\n\nimport { Avatar as AvatarPrimitive } from 'radix-ui'\n\nimport { cn } from '../lib/utils'\n\nexport type AvatarProps = React.ComponentProps<typeof AvatarPrimitive.Root> & {\n size?: '
|
|
1
|
+
{"version":3,"file":"avatar.js","names":["AvatarPrimitive"],"sources":["../../src/components/avatar.tsx"],"sourcesContent":["import type * as React from 'react'\n\nimport { Avatar as AvatarPrimitive } from 'radix-ui'\n\nimport { cn } from '../lib/utils'\n\nexport type AvatarProps = React.ComponentProps<typeof AvatarPrimitive.Root> & {\n size?: 'sm' | 'md' | 'lg'\n}\n\nexport type AvatarImageProps = React.ComponentProps<typeof AvatarPrimitive.Image>\n\nexport type AvatarFallbackProps = React.ComponentProps<typeof AvatarPrimitive.Fallback>\n\nexport type AvatarBadgeProps = React.ComponentProps<'span'>\n\nexport type AvatarGroupProps = React.ComponentProps<'div'>\n\nexport type AvatarGroupCountProps = React.ComponentProps<'div'>\n\nfunction Avatar({ className, size = 'md', ...props }: AvatarProps) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n data-size={size}\n className={cn(\n 'group/avatar relative flex shrink-0 size-8 rounded-full select-none',\n 'data-[size=lg]:size-10 data-[size=sm]:size-6',\n 'after:absolute after:inset-0 after:rounded-full after:border after:border-border after:mix-blend-darken dark:after:mix-blend-lighten',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({ className, ...props }: AvatarImageProps) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn('rounded-full aspect-square size-full object-cover', className)}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({ className, ...props }: AvatarFallbackProps) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\n 'bg-muted text-muted-foreground rounded-full flex size-full items-center justify-center text-sm group-data-[size=sm]/avatar:text-xs',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarBadge({ className, ...props }: AvatarBadgeProps) {\n return (\n <span\n data-slot=\"avatar-badge\"\n className={cn(\n 'bg-primary text-primary-foreground ring-background absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-blend-color ring-2 select-none',\n 'group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden',\n 'group-data-[size=md]/avatar:size-2.5 group-data-[size=md]/avatar:[&>svg]:size-2',\n 'group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroup({ className, ...props }: AvatarGroupProps) {\n return (\n <div\n data-slot=\"avatar-group\"\n className={cn(\n '*:data-[slot=avatar]:ring-background group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroupCount({ className, ...props }: AvatarGroupCountProps) {\n return (\n <div\n data-slot=\"avatar-group-count\"\n className={cn(\n 'bg-muted text-muted-foreground ring-background relative flex shrink-0 items-center justify-center size-8 rounded-full text-sm ring-2',\n 'group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6',\n '[&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3',\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Avatar, AvatarBadge, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage }\n"],"mappings":"4IAoBA,SAAS,OAAO,CAAE,YAAW,OAAO,KAAM,GAAG,GAAsB,CACjE,OACE,EAACA,EAAgB,KAAjB,CACE,YAAU,SACV,YAAW,EACX,UAAW,EACT,sEACA,+CACA,uIACA,EACD,CACD,GAAI,EACJ,CAAA,CAIN,SAAS,YAAY,CAAE,YAAW,GAAG,GAA2B,CAC9D,OACE,EAACA,EAAgB,MAAjB,CACE,YAAU,eACV,UAAW,EAAG,oDAAqD,EAAU,CAC7E,GAAI,EACJ,CAAA,CAIN,SAAS,eAAe,CAAE,YAAW,GAAG,GAA8B,CACpE,OACE,EAACA,EAAgB,SAAjB,CACE,YAAU,kBACV,UAAW,EACT,qIACA,EACD,CACD,GAAI,EACJ,CAAA,CAIN,SAAS,YAAY,CAAE,YAAW,GAAG,GAA2B,CAC9D,OACE,EAAC,OAAD,CACE,YAAU,eACV,UAAW,EACT,2KACA,gFACA,kFACA,gFACA,EACD,CACD,GAAI,EACJ,CAAA,CAIN,SAAS,YAAY,CAAE,YAAW,GAAG,GAA2B,CAC9D,OACE,EAAC,MAAD,CACE,YAAU,eACV,UAAW,EACT,sGACA,EACD,CACD,GAAI,EACJ,CAAA,CAIN,SAAS,iBAAiB,CAAE,YAAW,GAAG,GAAgC,CACxE,OACE,EAAC,MAAD,CACE,YAAU,qBACV,UAAW,EACT,uIACA,6FACA,2HACA,EACD,CACD,GAAI,EACJ,CAAA"}
|
package/dist/components/badge.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"../chunk-CHh1Zzun.js";import{cn as e}from"../lib/utils.js";import{Slot as t}from"radix-ui";import{jsx as n}from"react/jsx-runtime";import{cva as r}from"class-variance-authority";const i=r(`group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-
|
|
1
|
+
import"../chunk-CHh1Zzun.js";import{cn as e}from"../lib/utils.js";import{Slot as t}from"radix-ui";import{jsx as n}from"react/jsx-runtime";import{cva as r}from"class-variance-authority";const i=r(`group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-[8px] border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!`,{variants:{variant:{default:`bg-primary text-primary-foreground [a]:hover:bg-primary/80`,secondary:`bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80`,destructive:`bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20`,outline:`border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground`,ghost:`hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50`,link:`text-primary underline-offset-4 hover:underline`}},defaultVariants:{variant:`default`}});function Badge({className:r,variant:a=`default`,asChild:o=!1,...s}){return n(o?t.Root:`span`,{"data-slot":`badge`,"data-variant":a,className:e(i({variant:a}),r),...s})}export{Badge,i as badgeVariants};
|
|
2
2
|
//# sourceMappingURL=badge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"badge.js","names":[],"sources":["../../src/components/badge.tsx"],"sourcesContent":["import type * as React from 'react'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { Slot } from 'radix-ui'\n\nimport { cn } from '../lib/utils'\n\nconst badgeVariants = cva(\n 'group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-
|
|
1
|
+
{"version":3,"file":"badge.js","names":[],"sources":["../../src/components/badge.tsx"],"sourcesContent":["import type * as React from 'react'\n\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { Slot } from 'radix-ui'\n\nimport { cn } from '../lib/utils'\n\nconst badgeVariants = cva(\n 'group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-[8px] border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!',\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground [a]:hover:bg-primary/80',\n secondary: 'bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80',\n destructive:\n 'bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20',\n outline: 'border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground',\n ghost: 'hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50',\n link: 'text-primary underline-offset-4 hover:underline'\n }\n },\n defaultVariants: {\n variant: 'default'\n }\n }\n)\n\nexport type BadgeProps = React.ComponentProps<'span'> &\n VariantProps<typeof badgeVariants> & {\n asChild?: boolean\n }\n\nfunction Badge({ className, variant = 'default', asChild = false, ...props }: BadgeProps) {\n const Comp = asChild ? Slot.Root : 'span'\n\n return (\n <Comp data-slot=\"badge\" data-variant={variant} className={cn(badgeVariants({ variant }), className)} {...props} />\n )\n}\n\nexport { Badge, badgeVariants }\n"],"mappings":"yLAOA,MAAM,EAAgB,EACpB,+eACA,CACE,SAAU,CACR,QAAS,CACP,QAAS,6DACT,UAAW,mEACX,YACE,iKACF,QAAS,mFACT,MAAO,oEACP,KAAM,kDACP,CACF,CACD,gBAAiB,CACf,QAAS,UACV,CACF,CACF,CAOD,SAAS,MAAM,CAAE,YAAW,UAAU,UAAW,UAAU,GAAO,GAAG,GAAqB,CAGxF,OACE,EAHW,EAAU,EAAK,KAAO,OAGjC,CAAM,YAAU,QAAQ,eAAc,EAAS,UAAW,EAAG,EAAc,CAAE,UAAS,CAAC,CAAE,EAAU,CAAE,GAAI,EAAS,CAAA"}
|