@kushagradhawan/kookie-ui 0.1.21 → 0.1.23
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/components.css +854 -582
- package/dist/cjs/components/_internal/base-checkbox.props.d.ts +2 -2
- package/dist/cjs/components/_internal/base-checkbox.props.js +1 -1
- package/dist/cjs/components/_internal/base-checkbox.props.js.map +2 -2
- package/dist/cjs/components/_internal/base-radio.props.d.ts +2 -2
- package/dist/cjs/components/_internal/base-radio.props.js +1 -1
- package/dist/cjs/components/_internal/base-radio.props.js.map +2 -2
- package/dist/cjs/components/checkbox-cards.d.ts.map +1 -1
- package/dist/cjs/components/checkbox-cards.js +1 -1
- package/dist/cjs/components/checkbox-cards.js.map +3 -3
- package/dist/cjs/components/checkbox-cards.props.d.ts +5 -0
- package/dist/cjs/components/checkbox-cards.props.d.ts.map +1 -1
- package/dist/cjs/components/checkbox-cards.props.js +1 -1
- package/dist/cjs/components/checkbox-cards.props.js.map +3 -3
- package/dist/cjs/components/checkbox-group.props.d.ts +2 -2
- package/dist/cjs/components/image.d.ts.map +1 -1
- package/dist/cjs/components/image.js +1 -1
- package/dist/cjs/components/image.js.map +2 -2
- package/dist/cjs/components/radio-cards.d.ts.map +1 -1
- package/dist/cjs/components/radio-cards.js +1 -1
- package/dist/cjs/components/radio-cards.js.map +3 -3
- package/dist/cjs/components/radio-cards.props.d.ts +5 -0
- package/dist/cjs/components/radio-cards.props.d.ts.map +1 -1
- package/dist/cjs/components/radio-cards.props.js +1 -1
- package/dist/cjs/components/radio-cards.props.js.map +3 -3
- package/dist/cjs/components/radio-group.props.d.ts +2 -2
- package/dist/cjs/components/radio-group.props.js +1 -1
- package/dist/cjs/components/radio-group.props.js.map +2 -2
- package/dist/cjs/components/segmented-control.props.d.ts +5 -0
- package/dist/cjs/components/segmented-control.props.d.ts.map +1 -1
- package/dist/cjs/components/segmented-control.props.js +1 -1
- package/dist/cjs/components/segmented-control.props.js.map +2 -2
- package/dist/esm/components/_internal/base-checkbox.props.d.ts +2 -2
- package/dist/esm/components/_internal/base-checkbox.props.js +1 -1
- package/dist/esm/components/_internal/base-checkbox.props.js.map +2 -2
- package/dist/esm/components/_internal/base-radio.props.d.ts +2 -2
- package/dist/esm/components/_internal/base-radio.props.js +1 -1
- package/dist/esm/components/_internal/base-radio.props.js.map +2 -2
- package/dist/esm/components/checkbox-cards.d.ts.map +1 -1
- package/dist/esm/components/checkbox-cards.js +1 -1
- package/dist/esm/components/checkbox-cards.js.map +3 -3
- package/dist/esm/components/checkbox-cards.props.d.ts +5 -0
- package/dist/esm/components/checkbox-cards.props.d.ts.map +1 -1
- package/dist/esm/components/checkbox-cards.props.js +1 -1
- package/dist/esm/components/checkbox-cards.props.js.map +3 -3
- package/dist/esm/components/checkbox-group.props.d.ts +2 -2
- package/dist/esm/components/image.d.ts.map +1 -1
- package/dist/esm/components/image.js +1 -1
- package/dist/esm/components/image.js.map +2 -2
- package/dist/esm/components/radio-cards.d.ts.map +1 -1
- package/dist/esm/components/radio-cards.js +1 -1
- package/dist/esm/components/radio-cards.js.map +3 -3
- package/dist/esm/components/radio-cards.props.d.ts +5 -0
- package/dist/esm/components/radio-cards.props.d.ts.map +1 -1
- package/dist/esm/components/radio-cards.props.js +1 -1
- package/dist/esm/components/radio-cards.props.js.map +3 -3
- package/dist/esm/components/radio-group.props.d.ts +2 -2
- package/dist/esm/components/radio-group.props.js +1 -1
- package/dist/esm/components/radio-group.props.js.map +2 -2
- package/dist/esm/components/segmented-control.props.d.ts +5 -0
- package/dist/esm/components/segmented-control.props.d.ts.map +1 -1
- package/dist/esm/components/segmented-control.props.js +1 -1
- package/dist/esm/components/segmented-control.props.js.map +2 -2
- package/package.json +1 -1
- package/src/components/_internal/base-button.css +16 -7
- package/src/components/_internal/base-card.css +31 -0
- package/src/components/_internal/base-checkbox.css +84 -24
- package/src/components/_internal/base-checkbox.props.ts +2 -2
- package/src/components/_internal/base-radio.css +68 -12
- package/src/components/_internal/base-radio.props.ts +2 -2
- package/src/components/_internal/base-tab-list.css +6 -1
- package/src/components/animations.css +4 -4
- package/src/components/avatar.css +10 -0
- package/src/components/badge.css +1 -1
- package/src/components/card.css +115 -63
- package/src/components/checkbox-cards.css +36 -14
- package/src/components/checkbox-cards.props.tsx +3 -0
- package/src/components/checkbox-cards.tsx +13 -6
- package/src/components/image.css +33 -9
- package/src/components/image.tsx +2 -1
- package/src/components/progress.css +29 -27
- package/src/components/radio-cards.css +33 -9
- package/src/components/radio-cards.props.tsx +3 -0
- package/src/components/radio-cards.tsx +10 -5
- package/src/components/radio-group.props.tsx +2 -2
- package/src/components/segmented-control.css +71 -26
- package/src/components/segmented-control.props.tsx +6 -0
- package/src/components/select.css +42 -32
- package/src/components/slider.css +19 -19
- package/src/components/switch.css +6 -6
- package/src/components/text-area.css +31 -11
- package/src/components/text-field.css +31 -11
- package/src/styles/tokens/constants.css +141 -20
- package/src/styles/tokens/transition.css +27 -8
- package/styles.css +948 -604
- package/tokens/base.css +14 -6
- package/tokens.css +94 -22
|
@@ -22,8 +22,9 @@
|
|
|
22
22
|
-webkit-tap-highlight-color: transparent;
|
|
23
23
|
|
|
24
24
|
&:where(:has(:focus-visible)) {
|
|
25
|
-
|
|
26
|
-
outline
|
|
25
|
+
transition: var(--transition-focus);
|
|
26
|
+
outline: var(--focus-outline-width) solid var(--focus-8);
|
|
27
|
+
outline-offset: var(--focus-outline-offset-inset);
|
|
27
28
|
|
|
28
29
|
&::after {
|
|
29
30
|
outline: inherit;
|
|
@@ -65,20 +66,20 @@
|
|
|
65
66
|
font-size: var(--font-size-2);
|
|
66
67
|
--line-height: var(--line-height-2);
|
|
67
68
|
--letter-spacing: var(--letter-spacing-2);
|
|
68
|
-
--checkbox-cards-item-padding-top: calc(var(--space-3)
|
|
69
|
-
--checkbox-cards-item-padding-bottom: calc(var(--space-3)
|
|
69
|
+
--checkbox-cards-item-padding-top: calc(var(--space-3) * var(--spacing-multiplier-medium));
|
|
70
|
+
--checkbox-cards-item-padding-bottom: calc(var(--space-3) * var(--spacing-multiplier-medium));
|
|
70
71
|
--checkbox-cards-item-padding-left: var(--space-3);
|
|
71
72
|
--checkbox-cards-item-border-radius: var(--radius-3);
|
|
72
73
|
/* keep in sync with checkbox */
|
|
73
|
-
--checkbox-cards-item-checkbox-size: calc(var(--space-4) *
|
|
74
|
+
--checkbox-cards-item-checkbox-size: calc(var(--space-4) * var(--spacing-multiplier-medium));
|
|
74
75
|
}
|
|
75
76
|
/* 48px height for the card with one line of text */
|
|
76
77
|
&:where(.rt-r-size-2) {
|
|
77
78
|
font-size: var(--font-size-2);
|
|
78
79
|
--line-height: var(--line-height-2);
|
|
79
80
|
--letter-spacing: var(--letter-spacing-2);
|
|
80
|
-
--checkbox-cards-item-padding-top: calc(var(--space-4) *
|
|
81
|
-
--checkbox-cards-item-padding-bottom: calc(var(--space-4) *
|
|
81
|
+
--checkbox-cards-item-padding-top: calc(var(--space-4) * var(--spacing-multiplier-medium));
|
|
82
|
+
--checkbox-cards-item-padding-bottom: calc(var(--space-4) * var(--spacing-multiplier-medium));
|
|
82
83
|
--checkbox-cards-item-padding-left: var(--space-4);
|
|
83
84
|
--checkbox-cards-item-border-radius: var(--radius-3);
|
|
84
85
|
/* keep in sync with checkbox */
|
|
@@ -89,12 +90,12 @@
|
|
|
89
90
|
font-size: var(--font-size-3);
|
|
90
91
|
--line-height: var(--line-height-3);
|
|
91
92
|
--letter-spacing: var(--letter-spacing-3);
|
|
92
|
-
--checkbox-cards-item-padding-top: calc(var(--space-5)
|
|
93
|
-
--checkbox-cards-item-padding-bottom: calc(var(--space-5)
|
|
93
|
+
--checkbox-cards-item-padding-top: calc(var(--space-5) * var(--spacing-multiplier-medium));
|
|
94
|
+
--checkbox-cards-item-padding-bottom: calc(var(--space-5) * var(--spacing-multiplier-medium));
|
|
94
95
|
--checkbox-cards-item-padding-left: var(--space-5);
|
|
95
96
|
--checkbox-cards-item-border-radius: var(--radius-4);
|
|
96
97
|
/* keep in sync with checkbox */
|
|
97
|
-
--checkbox-cards-item-checkbox-size: calc(var(--space-4) *
|
|
98
|
+
--checkbox-cards-item-checkbox-size: calc(var(--space-4) * var(--spacing-multiplier-large));
|
|
98
99
|
}
|
|
99
100
|
}
|
|
100
101
|
}
|
|
@@ -107,9 +108,11 @@
|
|
|
107
108
|
|
|
108
109
|
:where(.rt-CheckboxCardsRoot.rt-variant-surface) {
|
|
109
110
|
.rt-CheckboxCardsItem {
|
|
110
|
-
--checkbox-cards-item-border-width:
|
|
111
|
+
--checkbox-cards-item-border-width: var(--border-width-standard);
|
|
111
112
|
--checkbox-cards-item-background-color: var(--color-surface);
|
|
112
113
|
|
|
114
|
+
transition: var(--transition-card);
|
|
115
|
+
|
|
113
116
|
&::before {
|
|
114
117
|
background-color: var(--checkbox-cards-item-background-color);
|
|
115
118
|
}
|
|
@@ -118,12 +121,22 @@
|
|
|
118
121
|
}
|
|
119
122
|
@media (hover: hover) {
|
|
120
123
|
&:where(:not(:has(:disabled)):hover) {
|
|
124
|
+
transition-duration: var(--duration-1);
|
|
121
125
|
&::after {
|
|
122
126
|
box-shadow: var(--base-card-surface-hover-box-shadow);
|
|
123
127
|
}
|
|
124
128
|
}
|
|
125
129
|
}
|
|
126
130
|
}
|
|
131
|
+
|
|
132
|
+
/* Component-level panel background overrides (higher specificity) */
|
|
133
|
+
&:where([data-panel-background='solid']) .rt-CheckboxCardsItem {
|
|
134
|
+
--color-surface: var(--color-surface-solid);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
&:where([data-panel-background='translucent']) .rt-CheckboxCardsItem {
|
|
138
|
+
--color-surface: var(--color-surface-translucent);
|
|
139
|
+
}
|
|
127
140
|
}
|
|
128
141
|
|
|
129
142
|
/* * * * * * * * * * * * * * * * * * * */
|
|
@@ -134,10 +147,10 @@
|
|
|
134
147
|
|
|
135
148
|
:where(.rt-CheckboxCardsRoot.rt-variant-classic) {
|
|
136
149
|
.rt-CheckboxCardsItem {
|
|
137
|
-
--checkbox-cards-item-border-width:
|
|
150
|
+
--checkbox-cards-item-border-width: var(--border-width-standard);
|
|
138
151
|
--checkbox-cards-item-background-color: var(--color-surface);
|
|
139
152
|
|
|
140
|
-
transition:
|
|
153
|
+
transition: var(--transition-card);
|
|
141
154
|
box-shadow: var(--base-card-classic-box-shadow-outer);
|
|
142
155
|
|
|
143
156
|
&::before {
|
|
@@ -148,7 +161,7 @@
|
|
|
148
161
|
}
|
|
149
162
|
@media (hover: hover) {
|
|
150
163
|
&:where(:not(:has(:disabled)):hover) {
|
|
151
|
-
transition-duration:
|
|
164
|
+
transition-duration: var(--duration-1);
|
|
152
165
|
box-shadow: var(--base-card-classic-hover-box-shadow-outer);
|
|
153
166
|
&::after {
|
|
154
167
|
box-shadow: var(--base-card-classic-hover-box-shadow-inner);
|
|
@@ -156,6 +169,15 @@
|
|
|
156
169
|
}
|
|
157
170
|
}
|
|
158
171
|
}
|
|
172
|
+
|
|
173
|
+
/* Component-level panel background overrides (higher specificity) */
|
|
174
|
+
&:where([data-panel-background='solid']) .rt-CheckboxCardsItem {
|
|
175
|
+
--color-surface: var(--color-surface-solid);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
&:where([data-panel-background='translucent']) .rt-CheckboxCardsItem {
|
|
179
|
+
--color-surface: var(--color-surface-translucent);
|
|
180
|
+
}
|
|
159
181
|
}
|
|
160
182
|
|
|
161
183
|
/* * * * * * * * * * * * * * * * * * * */
|
|
@@ -7,11 +7,13 @@ import type { PropDef } from '../props/prop-def.js';
|
|
|
7
7
|
|
|
8
8
|
const sizes = ['1', '2', '3'] as const;
|
|
9
9
|
const variants = ['surface', 'classic'] as const;
|
|
10
|
+
const panelBackgrounds = ['solid', 'translucent'] as const;
|
|
10
11
|
|
|
11
12
|
const checkboxCardsRootPropDefs = {
|
|
12
13
|
...asChildPropDef,
|
|
13
14
|
size: { type: 'enum', className: 'rt-r-size', values: sizes, default: '2', responsive: true },
|
|
14
15
|
variant: { type: 'enum', className: 'rt-variant', values: variants, default: 'surface' },
|
|
16
|
+
panelBackground: { type: 'enum', values: panelBackgrounds, default: undefined },
|
|
15
17
|
...colorPropDef,
|
|
16
18
|
...highContrastPropDef,
|
|
17
19
|
columns: { ...gridPropDefs.columns, default: 'repeat(auto-fit, minmax(200px, 1fr))' },
|
|
@@ -19,6 +21,7 @@ const checkboxCardsRootPropDefs = {
|
|
|
19
21
|
} satisfies {
|
|
20
22
|
size: PropDef<(typeof sizes)[number]>;
|
|
21
23
|
variant: PropDef<(typeof variants)[number]>;
|
|
24
|
+
panelBackground: PropDef<(typeof panelBackgrounds)[number] | undefined>;
|
|
22
25
|
columns: PropDef<(typeof gridPropDefs.columns.values)[number]>;
|
|
23
26
|
gap: PropDef<(typeof gridPropDefs.gap.values)[number]>;
|
|
24
27
|
};
|
|
@@ -12,6 +12,7 @@ import { Grid } from './grid.js';
|
|
|
12
12
|
import { ThickCheckIcon } from './icons.js';
|
|
13
13
|
import { extractProps } from '../helpers/extract-props.js';
|
|
14
14
|
import { marginPropDefs } from '../props/margin.props.js';
|
|
15
|
+
import { useThemeContext } from './theme.js';
|
|
15
16
|
|
|
16
17
|
import type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';
|
|
17
18
|
import type { MarginProps } from '../props/margin.props.js';
|
|
@@ -44,11 +45,15 @@ interface CheckboxCardsRootProps
|
|
|
44
45
|
CheckboxCardsRootOwnProps {}
|
|
45
46
|
const CheckboxCardsRoot = React.forwardRef<CheckboxCardsRootElement, CheckboxCardsRootProps>(
|
|
46
47
|
(props: ScopedProps<CheckboxCardsRootProps>, forwardedRef) => {
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
48
|
+
const themeContext = useThemeContext();
|
|
49
|
+
const panelBackground = props.panelBackground ?? themeContext.panelBackground;
|
|
50
|
+
const {
|
|
51
|
+
__scopeCheckboxCards,
|
|
52
|
+
className,
|
|
53
|
+
color,
|
|
54
|
+
panelBackground: _,
|
|
55
|
+
...rootProps
|
|
56
|
+
} = extractProps(props, checkboxCardsRootPropDefs, marginPropDefs);
|
|
52
57
|
const checkboxGroupScope = useCheckboxGroupScope(__scopeCheckboxCards);
|
|
53
58
|
return (
|
|
54
59
|
<CheckboxCardsProvider
|
|
@@ -60,6 +65,7 @@ const CheckboxCardsRoot = React.forwardRef<CheckboxCardsRootElement, CheckboxCar
|
|
|
60
65
|
<CheckboxGroupPrimitive.Root
|
|
61
66
|
{...checkboxGroupScope}
|
|
62
67
|
data-accent-color={color}
|
|
68
|
+
data-panel-background={panelBackground}
|
|
63
69
|
{...rootProps}
|
|
64
70
|
ref={forwardedRef}
|
|
65
71
|
className={classNames('rt-CheckboxCardsRoot', className)}
|
|
@@ -81,9 +87,10 @@ const CheckboxCardsItem = React.forwardRef<
|
|
|
81
87
|
>(({ __scopeCheckboxCards, children, className, style, ...props }, forwardedRef) => {
|
|
82
88
|
const context = useCheckboxCardsContext('CheckboxCardsItem', __scopeCheckboxCards);
|
|
83
89
|
const checkboxGroupScope = useCheckboxGroupScope(__scopeCheckboxCards);
|
|
90
|
+
|
|
84
91
|
const { className: checkboxClassName } = extractProps(
|
|
85
92
|
// Pass size / highContrast values from the context and static variant to generate styles
|
|
86
|
-
{ size: context?.size, variant: '
|
|
93
|
+
{ size: context?.size, variant: 'solid', highContrast: context?.highContrast },
|
|
87
94
|
// Pass size & variant prop defs to allow it to be extracted
|
|
88
95
|
baseCheckboxPropDefs,
|
|
89
96
|
);
|
package/src/components/image.css
CHANGED
|
@@ -16,23 +16,47 @@
|
|
|
16
16
|
|
|
17
17
|
@media (hover: hover) {
|
|
18
18
|
&:where(:hover) {
|
|
19
|
-
transform: scale(1.02);
|
|
20
19
|
box-shadow:
|
|
21
20
|
var(--box-shadow, var(--shadow-2)),
|
|
22
21
|
0 0 0 1px var(--gray-a4);
|
|
22
|
+
filter: brightness(1.05) contrast(1.02);
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
&:where(:active) {
|
|
27
|
+
filter: brightness(0.98) contrast(1.02);
|
|
28
|
+
}
|
|
29
|
+
|
|
26
30
|
&:where(:focus-visible) {
|
|
27
31
|
outline: 2px solid var(--focus-8);
|
|
28
|
-
outline-offset: 2px;
|
|
32
|
+
outline-offset: -2px;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* Interactive states for asChild usage - target the wrapper element */
|
|
37
|
+
:where(:any-link, button, label) .rt-Image {
|
|
38
|
+
cursor: pointer;
|
|
39
|
+
|
|
40
|
+
@media (hover: hover) {
|
|
41
|
+
&:where(:hover) {
|
|
42
|
+
box-shadow:
|
|
43
|
+
var(--box-shadow, var(--shadow-2)),
|
|
44
|
+
0 0 0 1px var(--gray-a4);
|
|
45
|
+
filter: brightness(1.05) contrast(1.02);
|
|
46
|
+
}
|
|
29
47
|
}
|
|
30
48
|
|
|
31
49
|
&:where(:active) {
|
|
32
|
-
|
|
50
|
+
filter: brightness(0.98) contrast(1.02);
|
|
33
51
|
}
|
|
34
52
|
}
|
|
35
53
|
|
|
54
|
+
/* Focus states for asChild usage - apply to the wrapper */
|
|
55
|
+
:where(:any-link, button, label):where(:focus-visible) .rt-Image {
|
|
56
|
+
outline: 2px solid var(--focus-8);
|
|
57
|
+
outline-offset: -2px;
|
|
58
|
+
}
|
|
59
|
+
|
|
36
60
|
/* Blur variant wrapper */
|
|
37
61
|
.rt-variant-blur {
|
|
38
62
|
position: relative;
|
|
@@ -46,17 +70,17 @@
|
|
|
46
70
|
|
|
47
71
|
@media (hover: hover) {
|
|
48
72
|
&:where(:hover) {
|
|
49
|
-
|
|
73
|
+
filter: brightness(1.05) contrast(1.02);
|
|
50
74
|
}
|
|
51
75
|
}
|
|
52
76
|
|
|
53
|
-
&:where(:
|
|
54
|
-
|
|
55
|
-
outline-offset: 2px;
|
|
77
|
+
&:where(:active) {
|
|
78
|
+
filter: brightness(0.98) contrast(1.02);
|
|
56
79
|
}
|
|
57
80
|
|
|
58
|
-
&:where(:
|
|
59
|
-
|
|
81
|
+
&:where(:focus-visible) {
|
|
82
|
+
outline: 2px solid var(--focus-8);
|
|
83
|
+
outline-offset: -2px;
|
|
60
84
|
}
|
|
61
85
|
}
|
|
62
86
|
|
package/src/components/image.tsx
CHANGED
|
@@ -287,7 +287,7 @@ const Image = React.forwardRef<ImageElement, ImageProps>((props, forwardedRef) =
|
|
|
287
287
|
} else {
|
|
288
288
|
// For surface variant with asChild
|
|
289
289
|
return React.cloneElement(child, {
|
|
290
|
-
className: classNames(child.props?.className
|
|
290
|
+
className: classNames(child.props?.className),
|
|
291
291
|
style: {
|
|
292
292
|
textDecoration: 'none', // Reset link underlines
|
|
293
293
|
color: 'inherit', // Reset link colors
|
|
@@ -296,6 +296,7 @@ const Image = React.forwardRef<ImageElement, ImageProps>((props, forwardedRef) =
|
|
|
296
296
|
padding: 0, // Reset button padding
|
|
297
297
|
font: 'inherit', // Reset button fonts
|
|
298
298
|
cursor: 'pointer', // Ensure interactive cursor
|
|
299
|
+
display: 'inline-block', // Ensure proper sizing
|
|
299
300
|
...child.props?.style, // Allow user overrides
|
|
300
301
|
},
|
|
301
302
|
children: imageWithPlaceholder,
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
.rt-ProgressRoot {
|
|
2
2
|
--progress-value: 0;
|
|
3
3
|
--progress-max: 100;
|
|
4
|
-
--progress-duration:
|
|
4
|
+
--progress-duration: var(--progress-default-duration);
|
|
5
5
|
pointer-events: none;
|
|
6
6
|
position: relative;
|
|
7
7
|
overflow: hidden;
|
|
8
8
|
flex-grow: 1;
|
|
9
9
|
height: var(--progress-height);
|
|
10
10
|
border-radius: max(
|
|
11
|
-
calc(var(--radius-factor) * var(--progress-height) /
|
|
11
|
+
calc(var(--radius-factor) * var(--progress-height) / var(--progress-border-radius-factor)),
|
|
12
12
|
calc(var(--radius-factor) * var(--radius-thumb))
|
|
13
13
|
);
|
|
14
14
|
|
|
@@ -30,18 +30,18 @@
|
|
|
30
30
|
}
|
|
31
31
|
.rt-ProgressIndicator {
|
|
32
32
|
display: block;
|
|
33
|
-
height:
|
|
34
|
-
width:
|
|
33
|
+
height: var(--position-full);
|
|
34
|
+
width: var(--position-full);
|
|
35
35
|
|
|
36
36
|
transform: scaleX(calc(var(--progress-value) / var(--progress-max)));
|
|
37
37
|
transform-origin: left center;
|
|
38
|
-
transition:
|
|
38
|
+
transition: var(--transition-progress);
|
|
39
39
|
|
|
40
40
|
&:where([data-state='indeterminate']) {
|
|
41
41
|
animation-name: rt-progress-indicator-indeterminate-grow, var(--progress-indicator-indeterminate-animation-start),
|
|
42
42
|
var(--progress-indicator-indeterminate-animation-repeat);
|
|
43
|
-
animation-delay: 0s, calc(var(--progress-duration) +
|
|
44
|
-
animation-duration: var(--progress-duration),
|
|
43
|
+
animation-delay: 0s, calc(var(--progress-duration) + var(--progress-animation-delay-start)), calc(var(--progress-duration) + var(--progress-animation-delay-shine));
|
|
44
|
+
animation-duration: var(--progress-duration), var(--progress-animation-duration-fade), var(--progress-animation-duration-pulse);
|
|
45
45
|
animation-iteration-count: 1, 1, infinite;
|
|
46
46
|
animation-fill-mode: both, none, none;
|
|
47
47
|
animation-direction: normal, normal, alternate;
|
|
@@ -51,19 +51,19 @@
|
|
|
51
51
|
position: absolute;
|
|
52
52
|
inset: 0;
|
|
53
53
|
content: '';
|
|
54
|
-
width:
|
|
54
|
+
width: calc(var(--position-full) * var(--progress-shine-width-multiplier));
|
|
55
55
|
|
|
56
56
|
animation-name: rt-progress-indicator-indeterminate-shine-from-left;
|
|
57
|
-
animation-delay: calc(var(--progress-duration) +
|
|
58
|
-
animation-duration:
|
|
57
|
+
animation-delay: calc(var(--progress-duration) + var(--progress-animation-delay-start));
|
|
58
|
+
animation-duration: var(--progress-animation-duration-pulse);
|
|
59
59
|
animation-fill-mode: backwards;
|
|
60
60
|
animation-iteration-count: infinite;
|
|
61
61
|
|
|
62
62
|
background-image: linear-gradient(
|
|
63
63
|
to right,
|
|
64
|
-
transparent
|
|
64
|
+
transparent var(--progress-gradient-stop-start),
|
|
65
65
|
var(--progress-indicator-after-linear-gradient),
|
|
66
|
-
transparent
|
|
66
|
+
transparent var(--progress-gradient-stop-end)
|
|
67
67
|
);
|
|
68
68
|
}
|
|
69
69
|
}
|
|
@@ -71,29 +71,29 @@
|
|
|
71
71
|
|
|
72
72
|
@keyframes rt-progress-indicator-indeterminate-grow {
|
|
73
73
|
0% {
|
|
74
|
-
transform: scaleX(
|
|
74
|
+
transform: scaleX(var(--progress-scale-initial));
|
|
75
75
|
}
|
|
76
76
|
20% {
|
|
77
|
-
transform: scaleX(
|
|
77
|
+
transform: scaleX(var(--progress-scale-step-1));
|
|
78
78
|
}
|
|
79
79
|
30% {
|
|
80
|
-
transform: scaleX(
|
|
80
|
+
transform: scaleX(var(--progress-scale-step-2));
|
|
81
81
|
}
|
|
82
82
|
40%,
|
|
83
83
|
50% {
|
|
84
|
-
transform: scaleX(
|
|
84
|
+
transform: scaleX(var(--progress-scale-step-3));
|
|
85
85
|
}
|
|
86
86
|
100% {
|
|
87
|
-
transform: scaleX(
|
|
87
|
+
transform: scaleX(var(--progress-scale-final));
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
@keyframes rt-progress-indicator-indeterminate-shine-from-left {
|
|
92
92
|
0% {
|
|
93
|
-
transform: translateX(-
|
|
93
|
+
transform: translateX(var(--position-negative-full));
|
|
94
94
|
}
|
|
95
95
|
100% {
|
|
96
|
-
transform: translateX(
|
|
96
|
+
transform: translateX(var(--position-zero));
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
|
|
@@ -109,7 +109,7 @@
|
|
|
109
109
|
--progress-height: var(--space-1);
|
|
110
110
|
}
|
|
111
111
|
&:where(.rt-r-size-2) {
|
|
112
|
-
--progress-height: calc(var(--space-2) *
|
|
112
|
+
--progress-height: calc(var(--space-2) * var(--size-multiplier-small));
|
|
113
113
|
}
|
|
114
114
|
&:where(.rt-r-size-3) {
|
|
115
115
|
--progress-height: var(--space-2);
|
|
@@ -131,7 +131,7 @@
|
|
|
131
131
|
background-color: var(--gray-a3);
|
|
132
132
|
|
|
133
133
|
&::after {
|
|
134
|
-
box-shadow: inset 0 0 0
|
|
134
|
+
box-shadow: inset 0 0 0 var(--border-width-standard) var(--gray-a4);
|
|
135
135
|
}
|
|
136
136
|
|
|
137
137
|
& :where(.rt-ProgressIndicator) {
|
|
@@ -159,10 +159,12 @@
|
|
|
159
159
|
.rt-ProgressRoot:where(.rt-variant-classic) {
|
|
160
160
|
--progress-indicator-indeterminate-animation-start: rt-progress-indicator-classic-indeterminate-fade;
|
|
161
161
|
--progress-indicator-indeterminate-animation-repeat: rt-progress-indicator-classic-indeterminate-pulse;
|
|
162
|
+
position: relative;
|
|
163
|
+
top: calc(var(--classic-elevation-offset) / var(--classic-elevation-factor-subtle));
|
|
162
164
|
background-color: var(--gray-a3);
|
|
163
165
|
|
|
164
166
|
&::after {
|
|
165
|
-
box-shadow: var(--shadow-
|
|
167
|
+
box-shadow: var(--classic-inset-shadow-dark);
|
|
166
168
|
}
|
|
167
169
|
|
|
168
170
|
& :where(.rt-ProgressIndicator) {
|
|
@@ -199,7 +201,7 @@
|
|
|
199
201
|
background-color: var(--accent-8);
|
|
200
202
|
|
|
201
203
|
&::after {
|
|
202
|
-
opacity:
|
|
204
|
+
opacity: var(--opacity-soft-variant);
|
|
203
205
|
}
|
|
204
206
|
}
|
|
205
207
|
}
|
|
@@ -228,22 +230,22 @@
|
|
|
228
230
|
background-color: var(--accent-12);
|
|
229
231
|
|
|
230
232
|
&::after {
|
|
231
|
-
opacity:
|
|
233
|
+
opacity: var(--opacity-soft-variant);
|
|
232
234
|
}
|
|
233
235
|
}
|
|
234
236
|
}
|
|
235
237
|
|
|
236
238
|
@keyframes rt-progress-indicator-high-contrast-indeterminate-fade {
|
|
237
239
|
100% {
|
|
238
|
-
opacity:
|
|
240
|
+
opacity: var(--opacity-high-contrast);
|
|
239
241
|
}
|
|
240
242
|
}
|
|
241
243
|
|
|
242
244
|
@keyframes rt-progress-indicator-high-contrast-indeterminate-pulse {
|
|
243
245
|
0% {
|
|
244
|
-
opacity:
|
|
246
|
+
opacity: var(--opacity-high-contrast);
|
|
245
247
|
}
|
|
246
248
|
100% {
|
|
247
|
-
opacity:
|
|
249
|
+
opacity: var(--progress-scale-final);
|
|
248
250
|
}
|
|
249
251
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
@import './_internal/base-card.css';
|
|
2
|
+
@import './_internal/base-radio.css';
|
|
2
3
|
|
|
3
4
|
.rt-RadioCardsRoot {
|
|
4
5
|
line-height: var(--line-height);
|
|
@@ -47,7 +48,7 @@
|
|
|
47
48
|
--line-height: var(--line-height-2);
|
|
48
49
|
--letter-spacing: var(--letter-spacing-2);
|
|
49
50
|
--radio-cards-item-padding-x: var(--space-3);
|
|
50
|
-
--radio-cards-item-padding-y: calc(var(--space-3)
|
|
51
|
+
--radio-cards-item-padding-y: calc(var(--space-3) * var(--spacing-multiplier-medium));
|
|
51
52
|
--radio-cards-item-border-radius: var(--radius-3);
|
|
52
53
|
}
|
|
53
54
|
/* 48px height for the card with one line of text */
|
|
@@ -56,7 +57,7 @@
|
|
|
56
57
|
--line-height: var(--line-height-2);
|
|
57
58
|
--letter-spacing: var(--letter-spacing-2);
|
|
58
59
|
--radio-cards-item-padding-x: var(--space-4);
|
|
59
|
-
--radio-cards-item-padding-y: calc(var(--space-4) *
|
|
60
|
+
--radio-cards-item-padding-y: calc(var(--space-4) * var(--spacing-multiplier-medium));
|
|
60
61
|
--radio-cards-item-border-radius: var(--radius-3);
|
|
61
62
|
}
|
|
62
63
|
/* 64px height for the card with one line of text */
|
|
@@ -65,7 +66,7 @@
|
|
|
65
66
|
--line-height: var(--line-height-3);
|
|
66
67
|
--letter-spacing: var(--letter-spacing-3);
|
|
67
68
|
--radio-cards-item-padding-x: var(--space-5);
|
|
68
|
-
--radio-cards-item-padding-y: calc(var(--space-5)
|
|
69
|
+
--radio-cards-item-padding-y: calc(var(--space-5) * var(--spacing-multiplier-medium));
|
|
69
70
|
--radio-cards-item-border-radius: var(--radius-4);
|
|
70
71
|
}
|
|
71
72
|
}
|
|
@@ -79,9 +80,11 @@
|
|
|
79
80
|
|
|
80
81
|
:where(.rt-RadioCardsRoot.rt-variant-surface) {
|
|
81
82
|
.rt-RadioCardsItem {
|
|
82
|
-
--radio-cards-item-border-width:
|
|
83
|
+
--radio-cards-item-border-width: var(--border-width-standard);
|
|
83
84
|
--radio-cards-item-background-color: var(--color-surface);
|
|
84
85
|
|
|
86
|
+
transition: var(--transition-card);
|
|
87
|
+
|
|
85
88
|
&::before {
|
|
86
89
|
background-color: var(--radio-cards-item-background-color);
|
|
87
90
|
}
|
|
@@ -90,12 +93,22 @@
|
|
|
90
93
|
}
|
|
91
94
|
@media (hover: hover) {
|
|
92
95
|
&:where(:not(:disabled):not([data-state='checked']):hover) {
|
|
96
|
+
transition-duration: var(--duration-1);
|
|
93
97
|
&::after {
|
|
94
98
|
box-shadow: var(--base-card-surface-hover-box-shadow);
|
|
95
99
|
}
|
|
96
100
|
}
|
|
97
101
|
}
|
|
98
102
|
}
|
|
103
|
+
|
|
104
|
+
/* Component-level panel background overrides (higher specificity) */
|
|
105
|
+
&:where([data-panel-background='solid']) .rt-RadioCardsItem {
|
|
106
|
+
--color-surface: var(--color-surface-solid);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
&:where([data-panel-background='translucent']) .rt-RadioCardsItem {
|
|
110
|
+
--color-surface: var(--color-surface-translucent);
|
|
111
|
+
}
|
|
99
112
|
}
|
|
100
113
|
|
|
101
114
|
/* * * * * * * * * * * * * * * * * * * */
|
|
@@ -106,10 +119,10 @@
|
|
|
106
119
|
|
|
107
120
|
:where(.rt-RadioCardsRoot.rt-variant-classic) {
|
|
108
121
|
.rt-RadioCardsItem {
|
|
109
|
-
--radio-cards-item-border-width:
|
|
122
|
+
--radio-cards-item-border-width: var(--border-width-standard);
|
|
110
123
|
--radio-cards-item-background-color: var(--color-surface);
|
|
111
124
|
|
|
112
|
-
transition:
|
|
125
|
+
transition: var(--transition-card);
|
|
113
126
|
box-shadow: var(--base-card-classic-box-shadow-outer);
|
|
114
127
|
|
|
115
128
|
&::before {
|
|
@@ -120,7 +133,7 @@
|
|
|
120
133
|
}
|
|
121
134
|
@media (hover: hover) {
|
|
122
135
|
&:where(:not(:disabled):not([data-state='checked']):hover) {
|
|
123
|
-
transition-duration:
|
|
136
|
+
transition-duration: var(--duration-1);
|
|
124
137
|
box-shadow: var(--base-card-classic-hover-box-shadow-outer);
|
|
125
138
|
&::after {
|
|
126
139
|
box-shadow: var(--base-card-classic-hover-box-shadow-inner);
|
|
@@ -128,6 +141,15 @@
|
|
|
128
141
|
}
|
|
129
142
|
}
|
|
130
143
|
}
|
|
144
|
+
|
|
145
|
+
/* Component-level panel background overrides (higher specificity) */
|
|
146
|
+
&:where([data-panel-background='solid']) .rt-RadioCardsItem {
|
|
147
|
+
--color-surface: var(--color-surface-solid);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
&:where([data-panel-background='translucent']) .rt-RadioCardsItem {
|
|
151
|
+
--color-surface: var(--color-surface-translucent);
|
|
152
|
+
}
|
|
131
153
|
}
|
|
132
154
|
|
|
133
155
|
/* * * * * * * * * * * * * * * * * * * */
|
|
@@ -137,8 +159,9 @@
|
|
|
137
159
|
/* * * * * * * * * * * * * * * * * * * */
|
|
138
160
|
|
|
139
161
|
.rt-RadioCardsItem:where([data-state='checked']) {
|
|
162
|
+
transition: var(--transition-fast);
|
|
140
163
|
&::after {
|
|
141
|
-
outline:
|
|
164
|
+
outline: var(--focus-outline-width) solid var(--accent-indicator);
|
|
142
165
|
}
|
|
143
166
|
:where(.rt-RadioCardsRoot.rt-high-contrast) & {
|
|
144
167
|
&::after {
|
|
@@ -154,8 +177,9 @@
|
|
|
154
177
|
/* * * * * * * * * * * * * * * * * * * */
|
|
155
178
|
|
|
156
179
|
.rt-RadioCardsItem:where(:focus-visible) {
|
|
180
|
+
transition: var(--transition-focus);
|
|
157
181
|
&::after {
|
|
158
|
-
outline:
|
|
182
|
+
outline: var(--focus-outline-width) solid var(--focus-8);
|
|
159
183
|
}
|
|
160
184
|
&:where([data-state='checked']) {
|
|
161
185
|
&::before {
|
|
@@ -7,11 +7,13 @@ import type { PropDef } from '../props/prop-def.js';
|
|
|
7
7
|
|
|
8
8
|
const sizes = ['1', '2', '3'] as const;
|
|
9
9
|
const variants = ['surface', 'classic'] as const;
|
|
10
|
+
const panelBackgrounds = ['solid', 'translucent'] as const;
|
|
10
11
|
|
|
11
12
|
const radioCardsRootPropDefs = {
|
|
12
13
|
...asChildPropDef,
|
|
13
14
|
size: { type: 'enum', className: 'rt-r-size', values: sizes, default: '2', responsive: true },
|
|
14
15
|
variant: { type: 'enum', className: 'rt-variant', values: variants, default: 'surface' },
|
|
16
|
+
panelBackground: { type: 'enum', values: panelBackgrounds, default: undefined },
|
|
15
17
|
...colorPropDef,
|
|
16
18
|
...highContrastPropDef,
|
|
17
19
|
columns: { ...gridPropDefs.columns, default: 'repeat(auto-fit, minmax(160px, 1fr))' },
|
|
@@ -19,6 +21,7 @@ const radioCardsRootPropDefs = {
|
|
|
19
21
|
} satisfies {
|
|
20
22
|
size: PropDef<(typeof sizes)[number]>;
|
|
21
23
|
variant: PropDef<(typeof variants)[number]>;
|
|
24
|
+
panelBackground: PropDef<(typeof panelBackgrounds)[number] | undefined>;
|
|
22
25
|
columns: PropDef<(typeof gridPropDefs.columns.values)[number]>;
|
|
23
26
|
gap: PropDef<(typeof gridPropDefs.gap.values)[number]>;
|
|
24
27
|
};
|
|
@@ -6,6 +6,7 @@ import { radioCardsRootPropDefs } from './radio-cards.props.js';
|
|
|
6
6
|
import { Grid } from './grid.js';
|
|
7
7
|
import { extractProps } from '../helpers/extract-props.js';
|
|
8
8
|
import { marginPropDefs } from '../props/margin.props.js';
|
|
9
|
+
import { useThemeContext } from './theme.js';
|
|
9
10
|
|
|
10
11
|
import type { MarginProps } from '../props/margin.props.js';
|
|
11
12
|
import type { ComponentPropsWithout, RemovedProps } from '../helpers/component-props.js';
|
|
@@ -22,15 +23,19 @@ interface RadioCardsRootProps
|
|
|
22
23
|
RadioCardsRootOwnProps {}
|
|
23
24
|
const RadioCardsRoot = React.forwardRef<RadioCardsRootElement, RadioCardsRootProps>(
|
|
24
25
|
(props, forwardedRef) => {
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
const themeContext = useThemeContext();
|
|
27
|
+
const panelBackground = props.panelBackground ?? themeContext.panelBackground;
|
|
28
|
+
const {
|
|
29
|
+
className,
|
|
30
|
+
color,
|
|
31
|
+
panelBackground: _,
|
|
32
|
+
...rootProps
|
|
33
|
+
} = extractProps(props, radioCardsRootPropDefs, marginPropDefs);
|
|
30
34
|
return (
|
|
31
35
|
<Grid asChild>
|
|
32
36
|
<RadioGroupPrimitive.Root
|
|
33
37
|
data-accent-color={color}
|
|
38
|
+
data-panel-background={panelBackground}
|
|
34
39
|
{...rootProps}
|
|
35
40
|
ref={forwardedRef}
|
|
36
41
|
className={classNames('rt-RadioCardsRoot', className)}
|
|
@@ -5,12 +5,12 @@ import { highContrastPropDef } from '../props/high-contrast.prop.js';
|
|
|
5
5
|
import type { PropDef } from '../props/prop-def.js';
|
|
6
6
|
|
|
7
7
|
const sizes = ['1', '2', '3'] as const;
|
|
8
|
-
const variants = ['classic', '
|
|
8
|
+
const variants = ['classic', 'solid', 'soft'] as const;
|
|
9
9
|
|
|
10
10
|
const radioGroupRootPropDefs = {
|
|
11
11
|
...asChildPropDef,
|
|
12
12
|
size: { type: 'enum', className: 'rt-r-size', values: sizes, default: '2', responsive: true },
|
|
13
|
-
variant: { type: 'enum', className: 'rt-variant', values: variants, default: '
|
|
13
|
+
variant: { type: 'enum', className: 'rt-variant', values: variants, default: 'solid' },
|
|
14
14
|
...colorPropDef,
|
|
15
15
|
...highContrastPropDef,
|
|
16
16
|
} satisfies {
|