@stainless-api/ui-primitives 0.1.0-beta.0 → 0.1.0-beta.10
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/CHANGELOG.md +60 -0
- package/package.json +1 -1
- package/src/components/Accordion.tsx +41 -0
- package/src/components/Button.tsx +1 -0
- package/src/components/DropdownButton.tsx +24 -13
- package/src/components/accordion.css +145 -0
- package/src/components/button.css +165 -135
- package/src/components/callout.css +57 -59
- package/src/components/dropdown-button.css +33 -31
- package/src/index.ts +1 -1
- package/src/styles/layout.css +1 -1
- package/src/styles/scales.css +1 -1
- package/src/styles/starlight-compat.css +142 -107
- package/src/styles/swatches.css +2 -2
- package/src/styles/theme.css +2 -2
- package/src/styles/typography.css +117 -144
- package/src/styles.css +1 -1
- package/tsconfig.json +2 -6
- package/src/components/DetailsGroup.tsx +0 -17
- package/src/components/details.css +0 -126
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,65 @@
|
|
|
1
1
|
# @stainless-api/ui-primitives
|
|
2
2
|
|
|
3
|
+
## 0.1.0-beta.10
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 3e44a9c: Reduce specificity on prose elements
|
|
8
|
+
|
|
9
|
+
## 0.1.0-beta.9
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- c96f895: Remove css layers, update sidebar styles, add new prose elements
|
|
14
|
+
|
|
15
|
+
## 0.1.0-beta.8
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- d15a520: fix initialization of dropdown buttons
|
|
20
|
+
|
|
21
|
+
## 0.1.0-beta.7
|
|
22
|
+
|
|
23
|
+
### Patch Changes
|
|
24
|
+
|
|
25
|
+
- 34e7c61: verify dependents update
|
|
26
|
+
|
|
27
|
+
## 0.1.0-beta.6
|
|
28
|
+
|
|
29
|
+
### Minor Changes
|
|
30
|
+
|
|
31
|
+
- f664b4d: Creating design system css variables, markdown styles, and typography improvements
|
|
32
|
+
|
|
33
|
+
### Patch Changes
|
|
34
|
+
|
|
35
|
+
- 34cbd12: verify publishing
|
|
36
|
+
|
|
37
|
+
## 0.1.0-beta.5
|
|
38
|
+
|
|
39
|
+
### Patch Changes
|
|
40
|
+
|
|
41
|
+
- e7a2a96: verifying dependent packages update
|
|
42
|
+
|
|
43
|
+
## 0.1.0-beta.4
|
|
44
|
+
|
|
45
|
+
### Patch Changes
|
|
46
|
+
|
|
47
|
+
- 2853ae8: fixing dependency structure
|
|
48
|
+
|
|
49
|
+
## 0.1.0-beta.3
|
|
50
|
+
|
|
51
|
+
### Patch Changes
|
|
52
|
+
|
|
53
|
+
- 870af8d: verify dependent packages update
|
|
54
|
+
|
|
55
|
+
## 0.1.0-beta.2
|
|
56
|
+
|
|
57
|
+
## 0.1.0-beta.1
|
|
58
|
+
|
|
59
|
+
### Patch Changes
|
|
60
|
+
|
|
61
|
+
- 5537225: verify publishing of dependent package works
|
|
62
|
+
|
|
3
63
|
## 0.1.0-beta.0
|
|
4
64
|
|
|
5
65
|
### Minor Changes
|
package/package.json
CHANGED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import clsx from 'clsx';
|
|
3
|
+
|
|
4
|
+
export type AccordionProps = React.ComponentProps<'details'>;
|
|
5
|
+
|
|
6
|
+
export function Accordion({ className, children, ...props }: AccordionProps) {
|
|
7
|
+
const classes = clsx('stl-ui-accordion', className);
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<details className={classes} {...props}>
|
|
11
|
+
{children}
|
|
12
|
+
</details>
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function AccordionSummary({ children, className, ...props }: React.ComponentProps<'summary'>) {
|
|
17
|
+
const classes = clsx('stl-ui-accordion__summary', className);
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<summary className={classes} {...props}>
|
|
21
|
+
{children}
|
|
22
|
+
</summary>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
Accordion.Summary = AccordionSummary;
|
|
27
|
+
|
|
28
|
+
function AccordionGroup({ className, children, ...props }: React.ComponentProps<'div'>) {
|
|
29
|
+
const classes = clsx('stl-ui-accordion-group', className);
|
|
30
|
+
|
|
31
|
+
// TODO: boolean `exclusive` prop assigns a unique `name` to each of the child <details> elements
|
|
32
|
+
// For now this can be handled by the user
|
|
33
|
+
|
|
34
|
+
return (
|
|
35
|
+
<div className={classes} {...props}>
|
|
36
|
+
{children}
|
|
37
|
+
</div>
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
Accordion.Group = AccordionGroup;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import clsx from 'clsx';
|
|
1
2
|
import { ChevronsUpDown, ExternalLink } from 'lucide-react';
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
function PrimaryActionText({ children }: { children?: React.ReactNode }) {
|
|
4
5
|
return <span data-part="primary-action-text">{children}</span>;
|
|
5
6
|
}
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
function PrimaryAction({ children }: { children?: React.ReactNode }) {
|
|
8
9
|
return (
|
|
9
10
|
<button
|
|
10
11
|
type="button"
|
|
@@ -16,7 +17,7 @@ export function DropdownButtonPrimaryAction({ children }: { children?: React.Rea
|
|
|
16
17
|
);
|
|
17
18
|
}
|
|
18
19
|
|
|
19
|
-
|
|
20
|
+
function Trigger() {
|
|
20
21
|
return (
|
|
21
22
|
<button
|
|
22
23
|
className="stl-ui-dropdown-button__button stl-ui-dropdown-button__trigger"
|
|
@@ -29,7 +30,7 @@ export function DropdownButtonTrigger() {
|
|
|
29
30
|
);
|
|
30
31
|
}
|
|
31
32
|
|
|
32
|
-
|
|
33
|
+
function Menu({ children }: { children?: React.ReactNode }) {
|
|
33
34
|
return (
|
|
34
35
|
<div className="stl-ui-dropdown-button__menu" data-state="closed" data-part="menu">
|
|
35
36
|
{children}
|
|
@@ -37,7 +38,7 @@ export function DropdownButtonMenu({ children }: { children?: React.ReactNode })
|
|
|
37
38
|
);
|
|
38
39
|
}
|
|
39
40
|
|
|
40
|
-
|
|
41
|
+
function MenuItemIcon({ children }: { children?: React.ReactNode }) {
|
|
41
42
|
return (
|
|
42
43
|
<div className="stl-ui-dropdown-button__menu-item-icon" data-part="item-icon">
|
|
43
44
|
{children}
|
|
@@ -45,15 +46,20 @@ export function DropdownButtonItemIcon({ children }: { children?: React.ReactNod
|
|
|
45
46
|
);
|
|
46
47
|
}
|
|
47
48
|
|
|
48
|
-
|
|
49
|
+
function MenuItemText({ children, subtle }: { children?: React.ReactNode; subtle?: boolean }) {
|
|
49
50
|
return (
|
|
50
|
-
<span
|
|
51
|
+
<span
|
|
52
|
+
className={clsx(`stl-ui-dropdown-button__menu-item-text`, {
|
|
53
|
+
'stl-ui-dropdown-button__menu-item-text--subtle': subtle,
|
|
54
|
+
})}
|
|
55
|
+
data-part="item-text"
|
|
56
|
+
>
|
|
51
57
|
{children}
|
|
52
58
|
</span>
|
|
53
59
|
);
|
|
54
60
|
}
|
|
55
61
|
|
|
56
|
-
|
|
62
|
+
function MenuItemTextSubtle({ children }: { children?: React.ReactNode }) {
|
|
57
63
|
return (
|
|
58
64
|
<span className="stl-ui-dropdown-button__menu-item-text-subtle" data-part="item-text-subtle">
|
|
59
65
|
{children}
|
|
@@ -61,7 +67,7 @@ export function DropdownButtonItemTextSubtle({ children }: { children?: React.Re
|
|
|
61
67
|
);
|
|
62
68
|
}
|
|
63
69
|
|
|
64
|
-
|
|
70
|
+
function MenuItem({
|
|
65
71
|
children,
|
|
66
72
|
value,
|
|
67
73
|
isExternalLink,
|
|
@@ -85,10 +91,6 @@ export function DropdownButtonItem({
|
|
|
85
91
|
);
|
|
86
92
|
}
|
|
87
93
|
|
|
88
|
-
export function DropdownButtonDivider() {
|
|
89
|
-
return <div className="stl-ui-dropdown-button__divider" data-part="divider" />;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
94
|
export function DropdownButton({ id, children }: { id: string; children?: React.ReactNode }) {
|
|
93
95
|
return (
|
|
94
96
|
<div className="stl-ui-dropdown-button stl-ui-not-prose not-content" id={id}>
|
|
@@ -96,3 +98,12 @@ export function DropdownButton({ id, children }: { id: string; children?: React.
|
|
|
96
98
|
</div>
|
|
97
99
|
);
|
|
98
100
|
}
|
|
101
|
+
|
|
102
|
+
DropdownButton.Menu = Menu;
|
|
103
|
+
DropdownButton.MenuItem = MenuItem;
|
|
104
|
+
DropdownButton.MenuItemIcon = MenuItemIcon;
|
|
105
|
+
DropdownButton.MenuItemText = MenuItemText;
|
|
106
|
+
DropdownButton.MenuItemTextSubtle = MenuItemTextSubtle;
|
|
107
|
+
DropdownButton.PrimaryAction = PrimaryAction;
|
|
108
|
+
DropdownButton.PrimaryActionText = PrimaryActionText;
|
|
109
|
+
DropdownButton.Trigger = Trigger;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/* revert starlight details styles */
|
|
2
|
+
@layer starlight.content {
|
|
3
|
+
/* artificially increase specificity to outcompete selectors in the same layer whose styles we want to revert */
|
|
4
|
+
.stl-ui-prose .sl-markdown-content.sl-markdown-content.sl-markdown-content {
|
|
5
|
+
details,
|
|
6
|
+
summary,
|
|
7
|
+
summary::before,
|
|
8
|
+
summary::marker {
|
|
9
|
+
all: revert-layer;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.stl-ui-accordion {
|
|
15
|
+
--stl-ui-accordion-padding: 12px;
|
|
16
|
+
--stl-ui-accordion-content-padding-bottom: 4px;
|
|
17
|
+
--stl-ui-accordion-marker-size: 1em;
|
|
18
|
+
--stl-ui-accordion-marker-margin: calc((1lh - var(--stl-ui-accordion-marker-size)) / 2);
|
|
19
|
+
--stl-ui-accordion-row-gap: 8px;
|
|
20
|
+
--stl-ui-accordion-summary-column-gap: 8px;
|
|
21
|
+
--stl-ui-accordion-border-radius: var(--stl-ui-layout-border-radius);
|
|
22
|
+
--stl-ui-accordion-hover-film-color: oklch(from var(--stl-ui-foreground) l c h / 0.03);
|
|
23
|
+
/* left inset to make content line up with summary content (after chevron) */
|
|
24
|
+
--stl-ui--internal--accordion-padding-start: calc(
|
|
25
|
+
var(--stl-ui-accordion-padding) + var(--stl-ui-accordion-marker-size) +
|
|
26
|
+
var(--stl-ui-accordion-marker-margin) * 2 + var(--stl-ui-accordion-summary-column-gap)
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
background-color: var(--stl-ui-card-background);
|
|
30
|
+
border: 1px solid var(--stl-ui-border);
|
|
31
|
+
border-radius: var(--stl-ui-accordion-border-radius);
|
|
32
|
+
font-size: var(--stl-ui-typography-text-body);
|
|
33
|
+
|
|
34
|
+
padding: var(--stl-ui-accordion-padding);
|
|
35
|
+
/* indent content to line up with left edge of summary content */
|
|
36
|
+
padding-inline-start: var(--stl-ui--internal--accordion-padding-start);
|
|
37
|
+
|
|
38
|
+
.stl-ui-accordion__summary {
|
|
39
|
+
display: block;
|
|
40
|
+
list-style: none;
|
|
41
|
+
|
|
42
|
+
/* summary extends to the edges of the element in order to increase click target */
|
|
43
|
+
padding: var(--stl-ui-accordion-padding);
|
|
44
|
+
padding-inline-start: var(--stl-ui--internal--accordion-padding-start);
|
|
45
|
+
margin: calc(-1 * var(--stl-ui-accordion-padding));
|
|
46
|
+
margin-inline-start: calc(-1 * var(--stl-ui--internal--accordion-padding-start));
|
|
47
|
+
|
|
48
|
+
cursor: pointer;
|
|
49
|
+
font-weight: 500;
|
|
50
|
+
|
|
51
|
+
border-radius: var(--stl-ui-accordion-border-radius);
|
|
52
|
+
|
|
53
|
+
&::before {
|
|
54
|
+
content: '';
|
|
55
|
+
width: var(--stl-ui-accordion-marker-size);
|
|
56
|
+
height: var(--stl-ui-accordion-marker-size);
|
|
57
|
+
margin: var(--stl-ui-accordion-marker-margin);
|
|
58
|
+
background-color: currentColor;
|
|
59
|
+
display: block;
|
|
60
|
+
position: absolute;
|
|
61
|
+
--stl-ui-accordion--internal--marker-width: calc(
|
|
62
|
+
var(--stl-ui-accordion-marker-size) + var(--stl-ui-accordion-marker-margin) * 2
|
|
63
|
+
);
|
|
64
|
+
--stl-ui-accordion--internal--summary-marker-transform: translateX(
|
|
65
|
+
calc(
|
|
66
|
+
-1 * var(--stl-ui-accordion--internal--marker-width) - var(--stl-ui-accordion-summary-column-gap)
|
|
67
|
+
)
|
|
68
|
+
);
|
|
69
|
+
transform: var(--stl-ui-accordion--internal--summary-marker-transform);
|
|
70
|
+
|
|
71
|
+
--lucide-chevron-right: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJsdWNpZGUgbHVjaWRlLWNoZXZyb24tcmlnaHQtaWNvbiBsdWNpZGUtY2hldnJvbi1yaWdodCI+PHBhdGggZD0ibTkgMTggNi02LTYtNiIvPjwvc3ZnPg==');
|
|
72
|
+
mask-image: var(--lucide-chevron-right);
|
|
73
|
+
mask-size: contain;
|
|
74
|
+
mask-repeat: no-repeat;
|
|
75
|
+
|
|
76
|
+
transition: transform 0.1s ease-out;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
& > :first-child {
|
|
80
|
+
margin-top: 0;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
&[open] {
|
|
85
|
+
border-color: var(--stl-ui-border-emphasis);
|
|
86
|
+
padding-bottom: calc(var(--stl-ui-accordion-padding) + var(--stl-ui-accordion-content-padding-bottom));
|
|
87
|
+
|
|
88
|
+
.stl-ui-accordion__summary {
|
|
89
|
+
/* padding-bottom shouldn’t extend beyond the row gap while open, i.e. we shouldn’t be negative-margin-placing content overlapping summary */
|
|
90
|
+
--stl-ui--internal--summary-padding-bottom: min(
|
|
91
|
+
var(--stl-ui-accordion-padding),
|
|
92
|
+
var(--stl-ui-accordion-row-gap)
|
|
93
|
+
);
|
|
94
|
+
padding-bottom: var(--stl-ui--internal--summary-padding-bottom);
|
|
95
|
+
margin-bottom: calc(var(--stl-ui-accordion-row-gap) - var(--stl-ui--internal--summary-padding-bottom));
|
|
96
|
+
border-bottom-left-radius: 0;
|
|
97
|
+
border-bottom-right-radius: 0;
|
|
98
|
+
|
|
99
|
+
&::before {
|
|
100
|
+
transform: var(--stl-ui-accordion--internal--summary-marker-transform) rotate(90deg);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
&:has(.stl-ui-accordion__summary:hover) {
|
|
106
|
+
background-image: linear-gradient(
|
|
107
|
+
to bottom,
|
|
108
|
+
var(--stl-ui-accordion-hover-film-color),
|
|
109
|
+
var(--stl-ui-accordion-hover-film-color)
|
|
110
|
+
);
|
|
111
|
+
border-color: var(--stl-ui-border-emphasis);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.stl-ui-accordion__summary + * {
|
|
115
|
+
margin-top: 0;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.stl-ui-accordion-group {
|
|
120
|
+
& > .stl-ui-accordion:has(+ .stl-ui-accordion) {
|
|
121
|
+
border-bottom-left-radius: 0;
|
|
122
|
+
border-bottom-right-radius: 0;
|
|
123
|
+
.stl-ui-accordion__summary {
|
|
124
|
+
border-bottom-left-radius: 0;
|
|
125
|
+
border-bottom-right-radius: 0;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
& > .stl-ui-accordion + .stl-ui-accordion {
|
|
130
|
+
margin-top: 0;
|
|
131
|
+
border-top-width: 0;
|
|
132
|
+
border-top-left-radius: 0;
|
|
133
|
+
border-top-right-radius: 0;
|
|
134
|
+
|
|
135
|
+
.stl-ui-accordion__summary {
|
|
136
|
+
border-top-left-radius: 0;
|
|
137
|
+
border-top-right-radius: 0;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.stl-ui-accordion:not(:is([open], :hover)) + .stl-ui-accordion:is([open], :hover) {
|
|
142
|
+
border-top-width: 1px;
|
|
143
|
+
margin-top: -1px;
|
|
144
|
+
}
|
|
145
|
+
}
|