@octanejs/shadcn 0.0.38 → 0.0.40
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/{LICENSE → LICENSE.upstream} +1 -1
- package/README.md +15 -11
- package/package.json +16 -9
- package/src/bases/base-ui/ui/accordion.tsrx +1 -1
- package/src/bases/base-ui/ui/alert-dialog.tsrx +1 -1
- package/src/bases/base-ui/ui/alert.tsrx +1 -1
- package/src/bases/base-ui/ui/aspect-ratio.tsrx +1 -1
- package/src/bases/base-ui/ui/avatar.tsrx +1 -1
- package/src/bases/base-ui/ui/badge.tsrx +1 -1
- package/src/bases/base-ui/ui/breadcrumb.tsrx +1 -1
- package/src/bases/base-ui/ui/button.tsrx +1 -1
- package/src/bases/base-ui/ui/card.tsrx +1 -1
- package/src/bases/base-ui/ui/checkbox.tsrx +1 -1
- package/src/bases/base-ui/ui/context-menu.tsrx +1 -1
- package/src/bases/base-ui/ui/dialog.tsrx +1 -1
- package/src/bases/base-ui/ui/dropdown-menu.tsrx +1 -1
- package/src/bases/base-ui/ui/empty.tsrx +1 -1
- package/src/bases/base-ui/ui/field.tsrx +1 -1
- package/src/bases/base-ui/ui/hover-card.tsrx +1 -1
- package/src/bases/base-ui/ui/input.tsrx +1 -1
- package/src/bases/base-ui/ui/item.tsrx +1 -1
- package/src/bases/base-ui/ui/kbd.tsrx +1 -1
- package/src/bases/base-ui/ui/label.tsrx +1 -1
- package/src/bases/base-ui/ui/menubar.tsrx +1 -1
- package/src/bases/base-ui/ui/native-select.tsrx +1 -1
- package/src/bases/base-ui/ui/navigation-menu.tsrx +137 -0
- package/src/bases/base-ui/ui/pagination.tsrx +1 -1
- package/src/bases/base-ui/ui/popover.tsrx +1 -1
- package/src/bases/base-ui/ui/progress.tsrx +1 -1
- package/src/bases/base-ui/ui/radio-group.tsrx +1 -1
- package/src/bases/base-ui/ui/scroll-area.tsrx +44 -0
- package/src/bases/base-ui/ui/select.tsrx +157 -0
- package/src/bases/base-ui/ui/separator.tsrx +1 -1
- package/src/bases/base-ui/ui/sheet.tsrx +1 -1
- package/src/bases/base-ui/ui/sidebar.tsrx +1 -1
- package/src/bases/base-ui/ui/skeleton.tsrx +1 -1
- package/src/bases/base-ui/ui/slider.tsrx +1 -1
- package/src/bases/base-ui/ui/spinner.tsrx +1 -1
- package/src/bases/base-ui/ui/switch.tsrx +1 -1
- package/src/bases/base-ui/ui/table.tsrx +1 -1
- package/src/bases/base-ui/ui/tabs.tsrx +1 -1
- package/src/bases/base-ui/ui/textarea.tsrx +1 -1
- package/src/bases/base-ui/ui/toggle-group.tsrx +1 -1
- package/src/bases/base-ui/ui/toggle.tsrx +1 -1
- package/src/bases/base-ui/ui/tooltip.tsrx +1 -1
- package/src/bases/radix/ui/accordion.tsrx +1 -1
- package/src/bases/radix/ui/alert-dialog.tsrx +1 -1
- package/src/bases/radix/ui/alert.tsrx +1 -1
- package/src/bases/radix/ui/avatar.tsrx +1 -1
- package/src/bases/radix/ui/badge.tsrx +1 -1
- package/src/bases/radix/ui/breadcrumb.tsrx +1 -1
- package/src/bases/radix/ui/button.tsrx +1 -1
- package/src/bases/radix/ui/card.tsrx +1 -1
- package/src/bases/radix/ui/checkbox.tsrx +1 -1
- package/src/bases/radix/ui/context-menu.tsrx +1 -1
- package/src/bases/radix/ui/dialog.tsrx +1 -1
- package/src/bases/radix/ui/dropdown-menu.tsrx +1 -1
- package/src/bases/radix/ui/empty.tsrx +1 -1
- package/src/bases/radix/ui/field.tsrx +1 -1
- package/src/bases/radix/ui/hover-card.tsrx +1 -1
- package/src/bases/radix/ui/input.tsrx +1 -1
- package/src/bases/radix/ui/item.tsrx +1 -1
- package/src/bases/radix/ui/kbd.tsrx +1 -1
- package/src/bases/radix/ui/label.tsrx +1 -1
- package/src/bases/radix/ui/menubar.tsrx +1 -1
- package/src/bases/radix/ui/native-select.tsrx +1 -1
- package/src/bases/radix/ui/navigation-menu.tsrx +1 -1
- package/src/bases/radix/ui/pagination.tsrx +1 -1
- package/src/bases/radix/ui/popover.tsrx +1 -1
- package/src/bases/radix/ui/progress.tsrx +1 -1
- package/src/bases/radix/ui/radio-group.tsrx +1 -1
- package/src/bases/radix/ui/scroll-area.tsrx +1 -1
- package/src/bases/radix/ui/select.tsrx +1 -1
- package/src/bases/radix/ui/separator.tsrx +1 -1
- package/src/bases/radix/ui/sheet.tsrx +1 -1
- package/src/bases/radix/ui/sidebar.tsrx +1 -1
- package/src/bases/radix/ui/skeleton.tsrx +1 -1
- package/src/bases/radix/ui/slider.tsrx +1 -1
- package/src/bases/radix/ui/spinner.tsrx +1 -1
- package/src/bases/radix/ui/switch.tsrx +1 -1
- package/src/bases/radix/ui/table.tsrx +1 -1
- package/src/bases/radix/ui/tabs.tsrx +1 -1
- package/src/bases/radix/ui/textarea.tsrx +1 -1
- package/src/bases/radix/ui/toggle-group.tsrx +1 -1
- package/src/bases/radix/ui/toggle.tsrx +1 -1
- package/src/bases/radix/ui/tooltip.tsrx +1 -1
- package/src/bases/react-aria/ui/accordion.tsrx +1 -1
- package/src/bases/react-aria/ui/alert-dialog.tsrx +1 -1
- package/src/bases/react-aria/ui/alert.tsrx +1 -1
- package/src/bases/react-aria/ui/aspect-ratio.tsrx +1 -1
- package/src/bases/react-aria/ui/avatar.tsrx +1 -1
- package/src/bases/react-aria/ui/badge.tsrx +1 -1
- package/src/bases/react-aria/ui/breadcrumb.tsrx +1 -1
- package/src/bases/react-aria/ui/button.tsrx +1 -1
- package/src/bases/react-aria/ui/card.tsrx +1 -1
- package/src/bases/react-aria/ui/checkbox.tsrx +1 -1
- package/src/bases/react-aria/ui/dialog.tsrx +1 -1
- package/src/bases/react-aria/ui/empty.tsrx +1 -1
- package/src/bases/react-aria/ui/field.tsrx +1 -1
- package/src/bases/react-aria/ui/input.tsrx +1 -1
- package/src/bases/react-aria/ui/item.tsrx +1 -1
- package/src/bases/react-aria/ui/kbd.tsrx +1 -1
- package/src/bases/react-aria/ui/label.tsrx +1 -1
- package/src/bases/react-aria/ui/native-select.tsrx +1 -1
- package/src/bases/react-aria/ui/pagination.tsrx +1 -1
- package/src/bases/react-aria/ui/popover.tsrx +1 -1
- package/src/bases/react-aria/ui/radio-group.tsrx +1 -1
- package/src/bases/react-aria/ui/scroll-area.tsrx +1 -1
- package/src/bases/react-aria/ui/separator.tsrx +1 -1
- package/src/bases/react-aria/ui/sheet.tsrx +1 -1
- package/src/bases/react-aria/ui/skeleton.tsrx +1 -1
- package/src/bases/react-aria/ui/slider.tsrx +1 -1
- package/src/bases/react-aria/ui/spinner.tsrx +1 -1
- package/src/bases/react-aria/ui/switch.tsrx +1 -1
- package/src/bases/react-aria/ui/table.tsrx +1 -1
- package/src/bases/react-aria/ui/tabs.tsrx +1 -1
- package/src/bases/react-aria/ui/textarea.tsrx +1 -1
- package/src/bases/react-aria/ui/toggle.tsrx +1 -1
- package/src/lib/utils.ts +1 -8
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@ npm install @octanejs/shadcn
|
|
|
10
10
|
pnpm add @octanejs/shadcn
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
Upstream pin: `shadcn-ui/ui@
|
|
13
|
+
Upstream pin: `shadcn-ui/ui@7c9eaba1` + CLI `shadcn@4.21.0`.
|
|
14
14
|
|
|
15
15
|
## What ships
|
|
16
16
|
|
|
@@ -33,16 +33,20 @@ Upstream pin: `shadcn-ui/ui@4baadbc6` + CLI `shadcn@4.14.1`.
|
|
|
33
33
|
## Component coverage
|
|
34
34
|
|
|
35
35
|
The coverage table tracks the families ported for each primitive base.
|
|
36
|
-
Switching `style` changes which primitive a component
|
|
37
|
-
|
|
36
|
+
Switching `style` changes which primitive a component uses. Each base retains its
|
|
37
|
+
upstream API; for example, Base UI Navigation Menu exposes a Positioner that owns
|
|
38
|
+
its viewport, and Base UI Select aliases its hostless Root.
|
|
38
39
|
|
|
39
|
-
The Base UI wrappers target `@octanejs/base-ui`'s Base UI 1.8.0 API
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
The Base UI wrappers target `@octanejs/base-ui`'s Base UI 1.8.0 API, including
|
|
41
|
+
Select, Navigation Menu, and Scroll Area from the 4.21.0 registry with Nova
|
|
42
|
+
utilities. Combobox is outside this package's current family inventory.
|
|
43
|
+
|
|
44
|
+
All three bases use `cn@0.2.6`, matching the upstream update. Existing Octane
|
|
45
|
+
adaptations and styling remain intact; `@octanejs/shadcn/cn` re-exports the same helper.
|
|
42
46
|
|
|
43
47
|
<!-- BEGIN COVERAGE -->
|
|
44
48
|
|
|
45
|
-
**44 families** — Radix 44/44 · React Aria 33/44 · Base UI
|
|
49
|
+
**44 families** — Radix 44/44 · React Aria 33/44 · Base UI 43/44
|
|
46
50
|
|
|
47
51
|
✅ ported · — not ported yet (fair game) · ⛔ blocked, see notes below
|
|
48
52
|
|
|
@@ -71,13 +75,13 @@ Combobox, Navigation Menu, and Scroll Area primitives are available from
|
|
|
71
75
|
| `label` | ✅ | ✅ | ✅ |
|
|
72
76
|
| `menubar` | ✅ | ⛔ | ✅ |
|
|
73
77
|
| `native-select` | ✅ | ✅ | ✅ |
|
|
74
|
-
| `navigation-menu` | ✅ | ⛔ |
|
|
78
|
+
| `navigation-menu` | ✅ | ⛔ | ✅ |
|
|
75
79
|
| `pagination` | ✅ | ✅ | ✅ |
|
|
76
80
|
| `popover` | ✅ | ✅ | ✅ |
|
|
77
81
|
| `progress` | ✅ | ⛔ | ✅ |
|
|
78
82
|
| `radio-group` | ✅ | ✅ | ✅ |
|
|
79
|
-
| `scroll-area` | ✅ | ✅ |
|
|
80
|
-
| `select` | ✅ | ⛔ |
|
|
83
|
+
| `scroll-area` | ✅ | ✅ | ✅ |
|
|
84
|
+
| `select` | ✅ | ⛔ | ✅ |
|
|
81
85
|
| `separator` | ✅ | ✅ | ✅ |
|
|
82
86
|
| `sheet` | ✅ | ✅ | ✅ |
|
|
83
87
|
| `sidebar` | ✅ | ⛔ | ✅ |
|
|
@@ -142,7 +146,7 @@ same mechanism shadcn uses upstream, where its own registry is
|
|
|
142
146
|
|
|
143
147
|
| `style` | Primitives | Families |
|
|
144
148
|
| --- | --- | --- |
|
|
145
|
-
| `base-nova` *(default)* | `@octanejs/base-ui` |
|
|
149
|
+
| `base-nova` *(default)* | `@octanejs/base-ui` | 43 |
|
|
146
150
|
| `radix-nova` | `@octanejs/radix` | 44 |
|
|
147
151
|
| `aria-nova` | `@octanejs/aria` | 33 |
|
|
148
152
|
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@octanejs/shadcn",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.40",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
7
7
|
"node": ">=22.22.2"
|
|
8
8
|
},
|
|
9
|
-
"description": "shadcn/ui for
|
|
9
|
+
"description": "shadcn/ui components for Octane, with Base UI, Radix, and React Aria implementations and an installable source registry.",
|
|
10
10
|
"author": {
|
|
11
11
|
"name": "Dominic Gannaway",
|
|
12
12
|
"email": "dg@domgan.com"
|
|
@@ -21,7 +21,8 @@
|
|
|
21
21
|
},
|
|
22
22
|
"files": [
|
|
23
23
|
"src",
|
|
24
|
-
"README.md"
|
|
24
|
+
"README.md",
|
|
25
|
+
"LICENSE.upstream"
|
|
25
26
|
],
|
|
26
27
|
"sideEffects": [
|
|
27
28
|
"./src/styles/theme.css"
|
|
@@ -127,10 +128,13 @@
|
|
|
127
128
|
"./base-ui/Label": "./src/bases/base-ui/ui/label.tsrx",
|
|
128
129
|
"./base-ui/Menubar": "./src/bases/base-ui/ui/menubar.tsrx",
|
|
129
130
|
"./base-ui/NativeSelect": "./src/bases/base-ui/ui/native-select.tsrx",
|
|
131
|
+
"./base-ui/NavigationMenu": "./src/bases/base-ui/ui/navigation-menu.tsrx",
|
|
130
132
|
"./base-ui/Pagination": "./src/bases/base-ui/ui/pagination.tsrx",
|
|
131
133
|
"./base-ui/Popover": "./src/bases/base-ui/ui/popover.tsrx",
|
|
132
134
|
"./base-ui/Progress": "./src/bases/base-ui/ui/progress.tsrx",
|
|
133
135
|
"./base-ui/RadioGroup": "./src/bases/base-ui/ui/radio-group.tsrx",
|
|
136
|
+
"./base-ui/ScrollArea": "./src/bases/base-ui/ui/scroll-area.tsrx",
|
|
137
|
+
"./base-ui/Select": "./src/bases/base-ui/ui/select.tsrx",
|
|
134
138
|
"./base-ui/Separator": "./src/bases/base-ui/ui/separator.tsrx",
|
|
135
139
|
"./base-ui/Sheet": "./src/bases/base-ui/ui/sheet.tsrx",
|
|
136
140
|
"./base-ui/Sidebar": "./src/bases/base-ui/ui/sidebar.tsrx",
|
|
@@ -151,10 +155,9 @@
|
|
|
151
155
|
},
|
|
152
156
|
"dependencies": {
|
|
153
157
|
"class-variance-authority": "0.7.1",
|
|
154
|
-
"
|
|
155
|
-
"
|
|
156
|
-
"@octanejs/
|
|
157
|
-
"@octanejs/base-ui": "0.1.51",
|
|
158
|
+
"cn": "0.2.6",
|
|
159
|
+
"@octanejs/aria": "0.0.48",
|
|
160
|
+
"@octanejs/base-ui": "0.1.52",
|
|
158
161
|
"@octanejs/lucide": "0.1.47",
|
|
159
162
|
"@octanejs/radix": "0.1.52",
|
|
160
163
|
"@octanejs/sonner": "0.1.47"
|
|
@@ -163,14 +166,18 @@
|
|
|
163
166
|
"octane": "^0.2.5"
|
|
164
167
|
},
|
|
165
168
|
"devDependencies": {
|
|
166
|
-
"@
|
|
169
|
+
"@base-ui/react": "1.8.0",
|
|
170
|
+
"@tsrx/react": "^0.2.71",
|
|
171
|
+
"@types/react": "^19.2.17",
|
|
172
|
+
"clsx": "^2.1.1",
|
|
167
173
|
"esbuild": "^0.28.1",
|
|
168
174
|
"lucide-react": "1.24.0",
|
|
169
175
|
"radix-ui": "^1.6.4",
|
|
170
176
|
"react": "19.2.7",
|
|
171
177
|
"react-dom": "19.2.7",
|
|
178
|
+
"tailwind-merge": "3.6.0",
|
|
172
179
|
"vitest": "^4.1.10",
|
|
173
|
-
"octane": "0.2.
|
|
180
|
+
"octane": "0.2.8"
|
|
174
181
|
},
|
|
175
182
|
"scripts": {
|
|
176
183
|
"test": "vitest run",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
import { Accordion as AccordionPrimitive } from '@octanejs/base-ui/accordion';
|
|
13
13
|
import { ChevronDownIcon, ChevronUpIcon } from '@octanejs/lucide';
|
|
14
14
|
|
|
15
|
-
import { cn } from '
|
|
15
|
+
import { cn } from 'cn';
|
|
16
16
|
|
|
17
17
|
export function Accordion({ className, ...props }: Record<string, any>) @{
|
|
18
18
|
<AccordionPrimitive.Root
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
// props.children channel.
|
|
18
18
|
import { AlertDialog as AlertDialogPrimitive } from '@octanejs/base-ui/alert-dialog';
|
|
19
19
|
|
|
20
|
-
import { cn } from '
|
|
20
|
+
import { cn } from 'cn';
|
|
21
21
|
import type { DivProps } from '../../../lib/types';
|
|
22
22
|
import { Button } from './button.tsrx';
|
|
23
23
|
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
// interleave, so every part uses the `@{ … }` shorthand.
|
|
11
11
|
import { cva, type VariantProps } from 'class-variance-authority';
|
|
12
12
|
|
|
13
|
-
import { cn } from '
|
|
13
|
+
import { cn } from 'cn';
|
|
14
14
|
import type { DivProps } from '../../../lib/types';
|
|
15
15
|
|
|
16
16
|
export const alertVariants = cva(
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// `alert` was confirmed byte-identical between the two bases, which is why this is plausible —
|
|
6
6
|
// but it is not proof, and the bases DO diverge elsewhere. Diff the class strings against the
|
|
7
7
|
// upstream source before treating this as ported.
|
|
8
|
-
import { cn } from '
|
|
8
|
+
import { cn } from 'cn';
|
|
9
9
|
import type { DivProps } from '../../../lib/types';
|
|
10
10
|
|
|
11
11
|
export interface AspectRatioProps extends DivProps {
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
// transcribed from upstream's Base UI source.
|
|
14
14
|
import { Avatar as AvatarPrimitive } from '@octanejs/base-ui/avatar';
|
|
15
15
|
|
|
16
|
-
import { cn } from '
|
|
16
|
+
import { cn } from 'cn';
|
|
17
17
|
|
|
18
18
|
type Props = { className?: string } & Record<string, unknown>;
|
|
19
19
|
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
// spread `badgeVariants({ variant })` onto it directly, which is what the class export is for.
|
|
19
19
|
import { cva, type VariantProps } from 'class-variance-authority';
|
|
20
20
|
|
|
21
|
-
import { cn } from '
|
|
21
|
+
import { cn } from 'cn';
|
|
22
22
|
import type { HostProps } from '../../../lib/types';
|
|
23
23
|
|
|
24
24
|
export const badgeVariants = cva(
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
import { ChevronRightIcon, MoreHorizontalIcon } from '@octanejs/lucide';
|
|
27
27
|
import { type OctaneNode } from 'octane';
|
|
28
28
|
|
|
29
|
-
import { cn } from '
|
|
29
|
+
import { cn } from 'cn';
|
|
30
30
|
|
|
31
31
|
type Props = { className?: string } & Record<string, unknown>;
|
|
32
32
|
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
import { cva, type VariantProps } from 'class-variance-authority';
|
|
16
16
|
import { Button as ButtonPrimitive } from '@octanejs/base-ui/button';
|
|
17
17
|
|
|
18
|
-
import { cn } from '
|
|
18
|
+
import { cn } from 'cn';
|
|
19
19
|
|
|
20
20
|
export const buttonVariants = cva(
|
|
21
21
|
'group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=\'size-\'])]:size-4',
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// UNVERIFIED PROVENANCE: derived from this package's React Aria base rather than transcribed
|
|
4
4
|
// from upstream's `bases/base-ui/ui/card.tsx`, which was not available at port time.
|
|
5
5
|
// Diff the class strings against the upstream source before treating this as ported.
|
|
6
|
-
import { cn } from '
|
|
6
|
+
import { cn } from 'cn';
|
|
7
7
|
import type { DivProps } from '../../../lib/types';
|
|
8
8
|
|
|
9
9
|
export interface CardProps extends DivProps {
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
import { Checkbox as CheckboxPrimitive } from '@octanejs/base-ui/checkbox';
|
|
19
19
|
import { CheckIcon } from '@octanejs/lucide';
|
|
20
20
|
|
|
21
|
-
import { cn } from '
|
|
21
|
+
import { cn } from 'cn';
|
|
22
22
|
|
|
23
23
|
export interface CheckboxProps extends Record<string, unknown> {
|
|
24
24
|
className?: string;
|
|
@@ -26,7 +26,7 @@ import { type OctaneNode } from 'octane';
|
|
|
26
26
|
import { ContextMenu as ContextMenuPrimitive } from '@octanejs/base-ui/context-menu';
|
|
27
27
|
import { CheckIcon, ChevronRightIcon } from '@octanejs/lucide';
|
|
28
28
|
|
|
29
|
-
import { cn } from '
|
|
29
|
+
import { cn } from 'cn';
|
|
30
30
|
|
|
31
31
|
type Props = { className?: string; children?: OctaneNode } & Record<string, unknown>;
|
|
32
32
|
|
|
@@ -14,7 +14,7 @@ import { type OctaneNode } from 'octane';
|
|
|
14
14
|
import { Dialog as DialogPrimitive } from '@octanejs/base-ui/dialog';
|
|
15
15
|
import { XIcon } from '@octanejs/lucide';
|
|
16
16
|
|
|
17
|
-
import { cn } from '
|
|
17
|
+
import { cn } from 'cn';
|
|
18
18
|
import { Button } from './button.tsrx';
|
|
19
19
|
|
|
20
20
|
type Props = { className?: string; children?: OctaneNode } & Record<string, unknown>;
|
|
@@ -41,7 +41,7 @@ import { type OctaneNode } from 'octane';
|
|
|
41
41
|
import { Menu as MenuPrimitive } from '@octanejs/base-ui/menu';
|
|
42
42
|
import { CheckIcon, ChevronRightIcon } from '@octanejs/lucide';
|
|
43
43
|
|
|
44
|
-
import { cn } from '
|
|
44
|
+
import { cn } from 'cn';
|
|
45
45
|
|
|
46
46
|
type Props = { className?: string; children?: OctaneNode } & Record<string, unknown>;
|
|
47
47
|
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// Diff the class strings against the upstream source before treating this as ported.
|
|
6
6
|
import { cva, type VariantProps } from 'class-variance-authority';
|
|
7
7
|
|
|
8
|
-
import { cn } from '
|
|
8
|
+
import { cn } from 'cn';
|
|
9
9
|
import type { DivProps, HostProps } from '../../../lib/types';
|
|
10
10
|
|
|
11
11
|
export function Empty({ className, ...props }: DivProps) @{
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
import { createElement, useMemo, type OctaneNode } from 'octane';
|
|
20
20
|
import { cva, type VariantProps } from 'class-variance-authority';
|
|
21
21
|
|
|
22
|
-
import { cn } from '
|
|
22
|
+
import { cn } from 'cn';
|
|
23
23
|
import { Label } from './label.tsrx';
|
|
24
24
|
import { Separator } from './separator.tsrx';
|
|
25
25
|
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
import { createElement } from 'octane';
|
|
27
27
|
import { PreviewCard as PreviewCardPrimitive } from '@octanejs/base-ui/preview-card';
|
|
28
28
|
|
|
29
|
-
import { cn } from '
|
|
29
|
+
import { cn } from 'cn';
|
|
30
30
|
|
|
31
31
|
/** Props routed to the Positioner rather than the popup. */
|
|
32
32
|
export type BaseUiPositioningProps =
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
// keeps its commit-on-blur meaning.
|
|
14
14
|
import { Input as InputPrimitive } from '@octanejs/base-ui/input';
|
|
15
15
|
|
|
16
|
-
import { cn } from '
|
|
16
|
+
import { cn } from 'cn';
|
|
17
17
|
|
|
18
18
|
export function Input({ className, type, ...props }: Record<string, any>) @{
|
|
19
19
|
<InputPrimitive
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
// apply `itemVariants({ variant, size })` directly, which is what the class export is for.
|
|
14
14
|
import { cva, type VariantProps } from 'class-variance-authority';
|
|
15
15
|
|
|
16
|
-
import { cn } from '
|
|
16
|
+
import { cn } from 'cn';
|
|
17
17
|
import { Separator } from './separator.tsrx';
|
|
18
18
|
|
|
19
19
|
type DivProps = { className?: string } & Record<string, unknown>;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
//
|
|
5
5
|
// UNVERIFIED PROVENANCE: class strings taken from this package's React Aria base rather than
|
|
6
6
|
// transcribed from upstream's Base UI source.
|
|
7
|
-
import { cn } from '
|
|
7
|
+
import { cn } from 'cn';
|
|
8
8
|
import type { HostProps } from '../../../lib/types';
|
|
9
9
|
|
|
10
10
|
export function Kbd({ className, ...props }: HostProps<'kbd'>) @{
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
// UNVERIFIED PROVENANCE: the class string is taken from this package's React Aria base rather
|
|
17
17
|
// than transcribed from upstream's Base UI source. It carries one utility the Radix base omits
|
|
18
18
|
// (`peer-data-disabled:opacity-50`).
|
|
19
|
-
import { cn } from '
|
|
19
|
+
import { cn } from 'cn';
|
|
20
20
|
import type { HostProps } from '../../../lib/types';
|
|
21
21
|
|
|
22
22
|
export function Label({ className, ...props }: HostProps<'label'>) @{
|
|
@@ -29,7 +29,7 @@ import { Menubar as MenubarPrimitive } from '@octanejs/base-ui/menubar';
|
|
|
29
29
|
import { Menu as MenuPrimitive } from '@octanejs/base-ui/menu';
|
|
30
30
|
import { CheckIcon, ChevronRightIcon } from '@octanejs/lucide';
|
|
31
31
|
|
|
32
|
-
import { cn } from '
|
|
32
|
+
import { cn } from 'cn';
|
|
33
33
|
|
|
34
34
|
type Props = { className?: string; children?: OctaneNode } & Record<string, unknown>;
|
|
35
35
|
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
// `onChange` handlers are passed through unrenamed.
|
|
10
10
|
import { ChevronDownIcon } from '@octanejs/lucide';
|
|
11
11
|
|
|
12
|
-
import { cn } from '
|
|
12
|
+
import { cn } from 'cn';
|
|
13
13
|
import type { HostProps } from '../../../lib/types';
|
|
14
14
|
|
|
15
15
|
export type NativeSelectProps =
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
// Adapted from shadcn/ui 4.21.0 (7c9eaba1), Base UI with the Nova style.
|
|
2
|
+
// MIT: see LICENSE.upstream. Octane uses native events and refs as props.
|
|
3
|
+
import * as React from 'octane';
|
|
4
|
+
import { ChevronDownIcon } from '@octanejs/lucide';
|
|
5
|
+
import { NavigationMenu as NavigationMenuPrimitive } from '@octanejs/base-ui/navigation-menu';
|
|
6
|
+
import { cva } from 'class-variance-authority';
|
|
7
|
+
import { cn } from 'cn';
|
|
8
|
+
|
|
9
|
+
function NavigationMenu({
|
|
10
|
+
align = 'start',
|
|
11
|
+
className,
|
|
12
|
+
children,
|
|
13
|
+
...props
|
|
14
|
+
}: NavigationMenuPrimitive.Root.Props & Pick<NavigationMenuPrimitive.Positioner.Props, 'align'>) {
|
|
15
|
+
return <NavigationMenuPrimitive.Root
|
|
16
|
+
data-slot="navigation-menu"
|
|
17
|
+
className={cn(
|
|
18
|
+
'group/navigation-menu relative flex max-w-max flex-1 items-center justify-center',
|
|
19
|
+
className,
|
|
20
|
+
)}
|
|
21
|
+
{...props}
|
|
22
|
+
>
|
|
23
|
+
{children}
|
|
24
|
+
<NavigationMenuPositioner align={align} />
|
|
25
|
+
</NavigationMenuPrimitive.Root>;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function NavigationMenuList({ className, ...props }: React.ComponentPropsWithRef<
|
|
29
|
+
typeof NavigationMenuPrimitive.List
|
|
30
|
+
>) {
|
|
31
|
+
return <NavigationMenuPrimitive.List
|
|
32
|
+
data-slot="navigation-menu-list"
|
|
33
|
+
className={cn('gap-0 group flex flex-1 list-none items-center justify-center', className)}
|
|
34
|
+
{...props}
|
|
35
|
+
/>;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function NavigationMenuItem({ className, ...props }: React.ComponentPropsWithRef<
|
|
39
|
+
typeof NavigationMenuPrimitive.Item
|
|
40
|
+
>) {
|
|
41
|
+
return <NavigationMenuPrimitive.Item
|
|
42
|
+
data-slot="navigation-menu-item"
|
|
43
|
+
className={cn('relative', className)}
|
|
44
|
+
{...props}
|
|
45
|
+
/>;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const navigationMenuTriggerStyle = cva(
|
|
49
|
+
'hover:bg-muted focus:bg-muted data-open:hover:bg-muted data-open:focus:bg-muted data-open:bg-muted/50 focus-visible:ring-ring/50 data-popup-open:bg-muted/50 data-popup-open:hover:bg-muted rounded-lg px-2.5 py-1.5 text-sm font-medium transition-all focus-visible:ring-3 focus-visible:outline-1 disabled:opacity-50 group/navigation-menu-trigger inline-flex h-9 w-max items-center justify-center outline-none disabled:pointer-events-none',
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
function NavigationMenuTrigger({
|
|
53
|
+
className,
|
|
54
|
+
children,
|
|
55
|
+
...props
|
|
56
|
+
}: NavigationMenuPrimitive.Trigger.Props) {
|
|
57
|
+
return <NavigationMenuPrimitive.Trigger
|
|
58
|
+
data-slot="navigation-menu-trigger"
|
|
59
|
+
className={cn(navigationMenuTriggerStyle(), 'group', className)}
|
|
60
|
+
{...props}
|
|
61
|
+
>
|
|
62
|
+
{children}
|
|
63
|
+
{' '}
|
|
64
|
+
<ChevronDownIcon
|
|
65
|
+
className="relative top-px ml-1 size-3 transition duration-300 group-data-open/navigation-menu-trigger:rotate-180 group-data-popup-open/navigation-menu-trigger:rotate-180"
|
|
66
|
+
aria-hidden="true"
|
|
67
|
+
/>
|
|
68
|
+
</NavigationMenuPrimitive.Trigger>;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function NavigationMenuContent({ className, ...props }: NavigationMenuPrimitive.Content.Props) {
|
|
72
|
+
return <NavigationMenuPrimitive.Content
|
|
73
|
+
data-slot="navigation-menu-content"
|
|
74
|
+
className={cn(
|
|
75
|
+
'data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:data-open:animate-in group-data-[viewport=false]/navigation-menu:data-closed:animate-out group-data-[viewport=false]/navigation-menu:data-closed:zoom-out-95 group-data-[viewport=false]/navigation-menu:data-open:zoom-in-95 group-data-[viewport=false]/navigation-menu:data-open:fade-in-0 group-data-[viewport=false]/navigation-menu:data-closed:fade-out-0 group-data-[viewport=false]/navigation-menu:ring-foreground/10 p-1 ease-[cubic-bezier(0.22,1,0.36,1)] group-data-[viewport=false]/navigation-menu:rounded-lg group-data-[viewport=false]/navigation-menu:shadow group-data-[viewport=false]/navigation-menu:ring-1 group-data-[viewport=false]/navigation-menu:duration-300 data-ending-style:data-activation-direction=left:translate-x-[50%] data-ending-style:data-activation-direction=right:translate-x-[-50%] data-starting-style:data-activation-direction=left:translate-x-[-50%] data-starting-style:data-activation-direction=right:translate-x-[50%] h-full w-auto transition-[opacity,transform,translate] duration-[0.35s] data-ending-style:opacity-0 data-starting-style:opacity-0 **:data-[slot=navigation-menu-link]:focus:ring-0 **:data-[slot=navigation-menu-link]:focus:outline-none',
|
|
76
|
+
className,
|
|
77
|
+
)}
|
|
78
|
+
{...props}
|
|
79
|
+
/>;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function NavigationMenuPositioner({
|
|
83
|
+
className,
|
|
84
|
+
side = 'bottom',
|
|
85
|
+
sideOffset = 8,
|
|
86
|
+
align = 'start',
|
|
87
|
+
alignOffset = 0,
|
|
88
|
+
...props
|
|
89
|
+
}: NavigationMenuPrimitive.Positioner.Props) {
|
|
90
|
+
return <NavigationMenuPrimitive.Portal>
|
|
91
|
+
<NavigationMenuPrimitive.Positioner
|
|
92
|
+
side={side}
|
|
93
|
+
sideOffset={sideOffset}
|
|
94
|
+
align={align}
|
|
95
|
+
alignOffset={alignOffset}
|
|
96
|
+
className={cn(
|
|
97
|
+
'ease-[cubic-bezier(0.22,1,0.36,1)] data-[side=bottom]:before:top-[-10px] data-[side=bottom]:before:right-0 data-[side=bottom]:before:left-0 isolate z-50 h-(--positioner-height) w-(--positioner-width) max-w-(--available-width) transition-[top,left,right,bottom] duration-[0.35s] data-instant:transition-none',
|
|
98
|
+
className,
|
|
99
|
+
)}
|
|
100
|
+
{...props}
|
|
101
|
+
>
|
|
102
|
+
<NavigationMenuPrimitive.Popup
|
|
103
|
+
className="bg-popover text-popover-foreground ring-foreground/10 rounded-lg shadow ring-1 outline-none data-ending-style:scale-90 data-ending-style:opacity-0 data-ending-style:duration-150 data-starting-style:scale-90 data-starting-style:opacity-0 data-[ending-style]:easing-[ease] xs:w-(--popup-width) relative h-(--popup-height) w-(--popup-width) origin-(--transform-origin) transition-[opacity,transform,width,height,scale,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)]"
|
|
104
|
+
>
|
|
105
|
+
<NavigationMenuPrimitive.Viewport className="relative size-full overflow-hidden" />
|
|
106
|
+
</NavigationMenuPrimitive.Popup>
|
|
107
|
+
</NavigationMenuPrimitive.Positioner>
|
|
108
|
+
</NavigationMenuPrimitive.Portal>;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function NavigationMenuLink({ className, ...props }: NavigationMenuPrimitive.Link.Props) {
|
|
112
|
+
return <NavigationMenuPrimitive.Link
|
|
113
|
+
data-slot="navigation-menu-link"
|
|
114
|
+
className={cn(
|
|
115
|
+
'data-active:focus:bg-muted data-active:hover:bg-muted data-active:bg-muted/50 focus-visible:ring-ring/50 hover:bg-muted focus:bg-muted flex items-center gap-2 rounded-lg p-2 text-sm transition-all outline-none focus-visible:ring-3 focus-visible:outline-1 in-data-[slot=navigation-menu-content]:rounded-md [&_svg:not([class*=\'size-\'])]:size-4',
|
|
116
|
+
className,
|
|
117
|
+
)}
|
|
118
|
+
{...props}
|
|
119
|
+
/>;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function NavigationMenuIndicator({ className, ...props }: React.ComponentPropsWithRef<
|
|
123
|
+
typeof NavigationMenuPrimitive.Icon
|
|
124
|
+
>) {
|
|
125
|
+
return <NavigationMenuPrimitive.Icon
|
|
126
|
+
data-slot="navigation-menu-indicator"
|
|
127
|
+
className={cn(
|
|
128
|
+
'data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in top-full z-1 flex h-1.5 items-end justify-center overflow-hidden',
|
|
129
|
+
className,
|
|
130
|
+
)}
|
|
131
|
+
{...props}
|
|
132
|
+
>
|
|
133
|
+
<div className="bg-border rounded-tl-sm shadow-md relative top-[60%] h-2 w-2 rotate-45" />
|
|
134
|
+
</NavigationMenuPrimitive.Icon>;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export { NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, navigationMenuTriggerStyle, NavigationMenuPositioner };
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
import { createElement, type OctaneNode } from 'octane';
|
|
22
22
|
import { ChevronLeftIcon, ChevronRightIcon, MoreHorizontalIcon } from '@octanejs/lucide';
|
|
23
23
|
|
|
24
|
-
import { cn } from '
|
|
24
|
+
import { cn } from 'cn';
|
|
25
25
|
import { Button, type ButtonProps } from './button.tsrx';
|
|
26
26
|
|
|
27
27
|
type Props = { className?: string } & Record<string, unknown>;
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
import { createElement } from 'octane';
|
|
30
30
|
import { Popover as PopoverPrimitive } from '@octanejs/base-ui/popover';
|
|
31
31
|
|
|
32
|
-
import { cn } from '
|
|
32
|
+
import { cn } from 'cn';
|
|
33
33
|
|
|
34
34
|
type Props = { className?: string } & Record<string, unknown>;
|
|
35
35
|
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
// Indicator to match the extra part.
|
|
22
22
|
import { Progress as ProgressPrimitive } from '@octanejs/base-ui/progress';
|
|
23
23
|
|
|
24
|
-
import { cn } from '
|
|
24
|
+
import { cn } from 'cn';
|
|
25
25
|
|
|
26
26
|
export interface ProgressProps extends Record<string, unknown> {
|
|
27
27
|
className?: string;
|
|
@@ -28,7 +28,7 @@ import { RadioGroup as RadioGroupPrimitive } from '@octanejs/base-ui/radio-group
|
|
|
28
28
|
import { Radio as RadioPrimitive } from '@octanejs/base-ui/radio';
|
|
29
29
|
import { CircleIcon } from '@octanejs/lucide';
|
|
30
30
|
|
|
31
|
-
import { cn } from '
|
|
31
|
+
import { cn } from 'cn';
|
|
32
32
|
|
|
33
33
|
type Props = { className?: string } & Record<string, unknown>;
|
|
34
34
|
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// Adapted from shadcn/ui 4.21.0 (7c9eaba1), Base UI with the Nova style.
|
|
2
|
+
// MIT: see LICENSE.upstream. Octane uses native events and refs as props.
|
|
3
|
+
import * as React from 'octane';
|
|
4
|
+
import { ScrollArea as ScrollAreaPrimitive } from '@octanejs/base-ui/scroll-area';
|
|
5
|
+
import { cn } from 'cn';
|
|
6
|
+
|
|
7
|
+
function ScrollArea({ className, children, ...props }: ScrollAreaPrimitive.Root.Props) {
|
|
8
|
+
return <ScrollAreaPrimitive.Root
|
|
9
|
+
data-slot="scroll-area"
|
|
10
|
+
className={cn('relative', className)}
|
|
11
|
+
{...props}
|
|
12
|
+
>
|
|
13
|
+
<ScrollAreaPrimitive.Viewport
|
|
14
|
+
data-slot="scroll-area-viewport"
|
|
15
|
+
className="size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1"
|
|
16
|
+
>{children}</ScrollAreaPrimitive.Viewport>
|
|
17
|
+
<ScrollBar />
|
|
18
|
+
<ScrollAreaPrimitive.Corner />
|
|
19
|
+
</ScrollAreaPrimitive.Root>;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function ScrollBar({
|
|
23
|
+
className,
|
|
24
|
+
orientation = 'vertical',
|
|
25
|
+
...props
|
|
26
|
+
}: ScrollAreaPrimitive.Scrollbar.Props) {
|
|
27
|
+
return <ScrollAreaPrimitive.Scrollbar
|
|
28
|
+
data-slot="scroll-area-scrollbar"
|
|
29
|
+
data-orientation={orientation}
|
|
30
|
+
orientation={orientation}
|
|
31
|
+
className={cn(
|
|
32
|
+
'data-horizontal:h-2.5 data-horizontal:flex-col data-horizontal:border-t data-horizontal:border-t-transparent data-vertical:h-full data-vertical:w-2.5 data-vertical:border-l data-vertical:border-l-transparent flex touch-none p-px transition-colors select-none',
|
|
33
|
+
className,
|
|
34
|
+
)}
|
|
35
|
+
{...props}
|
|
36
|
+
>
|
|
37
|
+
<ScrollAreaPrimitive.Thumb
|
|
38
|
+
data-slot="scroll-area-thumb"
|
|
39
|
+
className="rounded-full relative flex-1 bg-border"
|
|
40
|
+
/>
|
|
41
|
+
</ScrollAreaPrimitive.Scrollbar>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export { ScrollArea, ScrollBar };
|