reshaped 3.4.0 → 3.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +3 -32
- package/dist/bundle.css +1 -1
- package/dist/bundle.js +11 -11
- package/dist/cjs/cli/theming/index.js +0 -1
- package/dist/cjs/themes/_generator/definitions/figma.d.ts +1 -1
- package/dist/cjs/themes/_generator/definitions/figma.js +6 -5
- package/dist/cjs/themes/_generator/utilities/color.js +11 -11
- package/dist/cjs/themes/_generator/utilities/generateBackgroundColors.js +0 -2
- package/dist/cjs/themes/_generator/utilities/generateColors.js +1 -1
- package/dist/cjs/themes/_generator/utilities/generateUnits.js +0 -1
- package/dist/cjs/themes/_generator/utilities/mergeDeep.js +1 -1
- package/dist/cjs/themes/_generator/utilities/resolveTokenReference.js +2 -0
- package/dist/cjs/themes/figma/tailwind.css +1 -1
- package/dist/cjs/themes/figma/theme.css +1 -1
- package/dist/cli/theming/index.js +0 -1
- package/dist/components/Actionable/Actionable.js +2 -0
- package/dist/components/Autocomplete/Autocomplete.js +1 -0
- package/dist/components/Calendar/Calendar.module.css +1 -1
- package/dist/components/Calendar/Calendar.types.d.ts +4 -4
- package/dist/components/Calendar/CalendarControlled.js +2 -2
- package/dist/components/Calendar/CalendarDate.js +29 -11
- package/dist/components/Calendar/CalendarMonth.js +2 -6
- package/dist/components/Calendar/tests/Calendar.stories.d.ts +19 -4
- package/dist/components/Calendar/tests/Calendar.stories.js +237 -26
- package/dist/components/Card/Card.d.ts +1 -1
- package/dist/components/Card/Card.js +2 -4
- package/dist/components/Card/tests/Card.stories.d.ts +1 -1
- package/dist/components/Card/tests/Card.test.stories.d.ts +1 -1
- package/dist/components/Carousel/Carousel.js +1 -2
- package/dist/components/Carousel/Carousel.types.d.ts +1 -5
- package/dist/components/Carousel/Carousel.types.js +1 -5
- package/dist/components/Carousel/CarouselControl.js +2 -3
- package/dist/components/FormControl/FormControl.context.d.ts +4 -0
- package/dist/components/Grid/Grid.js +8 -2
- package/dist/components/Icon/Icon.js +1 -3
- package/dist/components/PinField/PinFieldControlled.js +0 -1
- package/dist/components/Resizable/Resizable.js +1 -0
- package/dist/components/Slider/SliderControlled.js +9 -3
- package/dist/components/Stepper/Stepper.js +7 -2
- package/dist/components/Tabs/TabsList.js +7 -3
- package/dist/components/Text/Text.js +2 -4
- package/dist/components/Timeline/Timeline.js +1 -1
- package/dist/components/Toast/ToastProvider.js +8 -4
- package/dist/components/View/View.js +10 -5
- package/dist/components/_private/Flyout/FlyoutContent.js +1 -1
- package/dist/components/_private/Flyout/FlyoutTrigger.js +1 -1
- package/dist/components/_private/Flyout/useFlyout.js +3 -1
- package/dist/components/_private/Portal/Portal.d.ts +1 -1
- package/dist/config/tailwind.d.ts +1 -1
- package/dist/hooks/_private/useOnClickOutside.d.ts +1 -1
- package/dist/hooks/_private/useOnClickOutside.js +26 -10
- package/dist/hooks/_private/useSingletonHotkeys.js +2 -0
- package/dist/hooks/useResponsiveClientValue.d.ts +1 -1
- package/dist/themes/_generator/definitions/figma.d.ts +1 -1
- package/dist/themes/_generator/definitions/figma.js +6 -5
- package/dist/themes/_generator/utilities/color.js +11 -11
- package/dist/themes/_generator/utilities/generateBackgroundColors.js +0 -2
- package/dist/themes/_generator/utilities/generateColors.js +1 -1
- package/dist/themes/_generator/utilities/generateUnits.js +0 -1
- package/dist/themes/_generator/utilities/mergeDeep.js +1 -1
- package/dist/themes/_generator/utilities/resolveTokenReference.js +2 -0
- package/dist/themes/figma/tailwind.css +1 -1
- package/dist/themes/figma/theme.css +1 -1
- package/dist/types/global.d.ts +2 -2
- package/dist/utilities/helpers.js +4 -1
- package/dist/utilities/platform.js +1 -0
- package/package.json +36 -40
- package/dist/components/Calendar/tests/Calendar.test.stories.d.ts +0 -26
- package/dist/components/Calendar/tests/Calendar.test.stories.js +0 -161
@@ -28,7 +28,6 @@ const transformDefinition = (name, definition, options) => {
|
|
28
28
|
if (code.media)
|
29
29
|
fs_1.default.writeFileSync(themeMediaPath, code.media);
|
30
30
|
const logOutput = `Compiled ${chalk_1.default.bold(name)} theme${isFragment ? " fragment" : ""}`;
|
31
|
-
// eslint-disable-next-line no-console
|
32
31
|
console.log(chalk_1.default.green(logOutput));
|
33
32
|
};
|
34
33
|
const addThemeFragment = (name, definition, options) => {
|
@@ -101,7 +101,6 @@ const theme = {
|
|
101
101
|
radiusMedium: { px: 4 },
|
102
102
|
radiusLarge: { px: 4 },
|
103
103
|
},
|
104
|
-
// @ts-ignore
|
105
104
|
color: {
|
106
105
|
foregroundNeutral: { hex: "#191919", hexDark: "#FFFFFF" },
|
107
106
|
foregroundNeutralFaded: { hex: "#474747", hexDark: "#B2B2B2" },
|
@@ -109,20 +108,19 @@ const theme = {
|
|
109
108
|
foregroundPrimary: { hex: "#007BE5", hexDark: "#7CC4F8" },
|
110
109
|
foregroundPositive: { hex: "#009951", hexDark: "#79D297" },
|
111
110
|
foregroundCritical: { hex: "#DC3412", hexDark: "#FCA397" },
|
111
|
+
foregroundWarning: { hex: "#7b6305", hexDark: "#b4920c" },
|
112
112
|
backgroundNeutral: { hex: "#DFE2EA", hexDark: "#444444" },
|
113
113
|
backgroundNeutralFaded: { hex: "#F5F5F5", hexDark: "#383838" },
|
114
|
-
backgroundNeutralHighlighted: { hex: "#D4D8E3", hexDark: "#525252" },
|
115
114
|
backgroundDisabled: { hex: "#e4e4e4", hexDark: "#474747" },
|
116
115
|
backgroundDisabledFaded: { hex: "#F5F5F5", hexDark: "#3A3A3A" },
|
117
116
|
backgroundPrimary: { hex: "#0D99FF", hexDark: "#0C8CE9" },
|
118
|
-
backgroundPrimaryHighlighted: { hex: "#007BE5", hexDark: "#0A6DC2" },
|
119
117
|
backgroundPrimaryFaded: { hex: "#E5F4FF", hexDark: "#394360" },
|
120
118
|
backgroundPositive: { hex: "#14AE5C", hexDark: "#198F51" },
|
121
119
|
backgroundPositiveFaded: { hex: "#DAECDF", hexDark: "#3d5749" },
|
122
|
-
backgroundPositiveHighlighted: { hex: "#009951", hexDark: "#078348" },
|
123
120
|
backgroundCritical: { hex: "#F24822", hexDark: "#E03E1A" },
|
124
121
|
backgroundCriticalFaded: { hex: "#FFE2E0", hexDark: "#60332A" },
|
125
|
-
|
122
|
+
backgroundWarning: { hex: "#facc15", hexDark: "#f1c512" },
|
123
|
+
backgroundWarningFaded: { hex: "#fffae9", hexDark: "#2c271f" },
|
126
124
|
borderNeutral: { hex: "#E6E6E6", hexDark: "#444444" },
|
127
125
|
borderNeutralFaded: { hex: "#E6E6E6", hexDark: "#444444" },
|
128
126
|
borderDisabled: { hex: "#E6E6E6", hexDark: "#3E3E3E" },
|
@@ -132,12 +130,15 @@ const theme = {
|
|
132
130
|
borderPositiveFaded: { hex: "#BBDDC6", hexDark: "#086338" },
|
133
131
|
borderCritical: { hex: "#DC3412", hexDark: "#FCA397" },
|
134
132
|
borderCriticalFaded: { hex: "#FFC7C2", hexDark: "#803226" },
|
133
|
+
borderWarning: { hex: "#cfa90f", hexDark: "#b4920a" },
|
134
|
+
borderWarningFaded: { hex: "#ece2c4", hexDark: "#453c1e" },
|
135
135
|
backgroundPage: { hex: "#FFFFFF", hexDark: "#2C2C2C" },
|
136
136
|
backgroundPageFaded: { hex: "#FAFAFA", hexDark: "#1E1E1E" },
|
137
137
|
backgroundElevationBase: { hex: "#FFFFFF", hexDark: "#2C2C2C" },
|
138
138
|
backgroundElevationRaised: { hex: "#FFFFFF", hexDark: "#2C2C2C" },
|
139
139
|
backgroundElevationOverlay: { hex: "#FFFFFF", hexDark: "#2C2C2C" },
|
140
140
|
onBackgroundPrimary: { hex: "#FFFFFF" },
|
141
|
+
brand: { hex: "#0D99FF" },
|
141
142
|
black: { hex: "#000000" },
|
142
143
|
white: { hex: "#FFFFFF" },
|
143
144
|
},
|
@@ -338,17 +338,17 @@ const GREEN = 0.7152;
|
|
338
338
|
const BLUE = 0.0722;
|
339
339
|
const GAMMA = 2.4;
|
340
340
|
function luminanceWCAG(r, g, b) {
|
341
|
-
|
341
|
+
const a = [r, g, b].map((v) => {
|
342
342
|
v /= 255;
|
343
343
|
return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, GAMMA);
|
344
344
|
});
|
345
345
|
return a[0] * RED + a[1] * GREEN + a[2] * BLUE;
|
346
346
|
}
|
347
347
|
function contrastWCAG(rgb1, rgb2) {
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
348
|
+
const lum1 = luminanceWCAG(...rgb1);
|
349
|
+
const lum2 = luminanceWCAG(...rgb2);
|
350
|
+
const brightest = Math.max(lum1, lum2);
|
351
|
+
const darkest = Math.min(lum1, lum2);
|
352
352
|
return (brightest + 0.05) / (darkest + 0.05);
|
353
353
|
}
|
354
354
|
const getOnColorWCAG = (args) => {
|
@@ -370,7 +370,7 @@ function luminanceAPCA({ r, g, b }) {
|
|
370
370
|
}
|
371
371
|
function contrastAPCA(backgroundLuminance, textLuminance) {
|
372
372
|
// Calculate the contrast based on APCA
|
373
|
-
|
373
|
+
const Lc = textLuminance - backgroundLuminance;
|
374
374
|
return Math.abs(Lc); // Return the absolute value of contrast
|
375
375
|
}
|
376
376
|
const getOnColorAPCA = (args) => {
|
@@ -385,12 +385,12 @@ const getOnColorAPCA = (args) => {
|
|
385
385
|
b: (1 - bgAlpha) * baseColor.b + bgAlpha * bgColor.b,
|
386
386
|
};
|
387
387
|
// Calculate luminance for background and for white & black
|
388
|
-
|
389
|
-
|
390
|
-
|
388
|
+
const backgroundLuminance = luminanceAPCA({ r, g, b });
|
389
|
+
const whiteLuminance = luminanceAPCA({ r: 255, g: 255, b: 255 });
|
390
|
+
const blackLuminance = luminanceAPCA({ r: 0, g: 0, b: 0 });
|
391
391
|
// Calculate contrast
|
392
|
-
|
393
|
-
|
392
|
+
const contrastWithWhite = contrastAPCA(backgroundLuminance, whiteLuminance);
|
393
|
+
const contrastWithBlack = contrastAPCA(backgroundLuminance, blackLuminance);
|
394
394
|
// Choose the color with higher contrast
|
395
395
|
return contrastWithWhite > contrastWithBlack ? lightHexColor : darkHexColor;
|
396
396
|
};
|
@@ -41,7 +41,6 @@ const generateBackgroundColors = (definition, themeOptions) => {
|
|
41
41
|
algorithm: themeOptions?.colorContrastAlgorithm,
|
42
42
|
...onColorHexMap,
|
43
43
|
});
|
44
|
-
// eslint-disable-next-line no-param-reassign
|
45
44
|
definition.color[generatedForegroundName] = {
|
46
45
|
hex,
|
47
46
|
hexDark: hex !== hexDark ? hexDark : undefined,
|
@@ -50,7 +49,6 @@ const generateBackgroundColors = (definition, themeOptions) => {
|
|
50
49
|
if (needsRGB) {
|
51
50
|
const rgb = (0, color_1.hexToRgb)(bgToken.hex);
|
52
51
|
const rgbDark = bgToken.hexDark && (0, color_1.hexToRgb)(bgToken.hexDark);
|
53
|
-
// eslint-disable-next-line no-param-reassign
|
54
52
|
definition.color[generatedRGBName] = {
|
55
53
|
hex: `${rgb.r}, ${rgb.g}, ${rgb.b}`,
|
56
54
|
hexDark: rgbDark && `${rgbDark.r}, ${rgbDark.g}, ${rgbDark.b}`,
|
@@ -4,7 +4,7 @@ const fn_1 = require("culori/require");
|
|
4
4
|
const hexToOkHsl = (hex) => {
|
5
5
|
const rgb = (0, fn_1.parseHex)(hex);
|
6
6
|
if (!rgb)
|
7
|
-
throw new Error(`[Reshaped] Can
|
7
|
+
throw new Error(`[Reshaped] Can't generate rgb from ${hex} color`);
|
8
8
|
const lrgb = (0, fn_1.convertRgbToLrgb)(rgb);
|
9
9
|
const oklab = (0, fn_1.convertLrgbToOklab)(lrgb);
|
10
10
|
const okhsl = (0, fn_1.convertOklabToOkhsl)(oklab);
|
@@ -1,7 +1,7 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
const isObject = (item) => {
|
4
|
-
return item && typeof item === "object" && !Array.isArray(item);
|
4
|
+
return !!item && typeof item === "object" && !Array.isArray(item);
|
5
5
|
};
|
6
6
|
const mergeDeep = (target, ...sources) => {
|
7
7
|
if (!sources.length)
|
@@ -6,6 +6,8 @@ const resolveTokenReference = (theme, tokenType, ref) => {
|
|
6
6
|
Object.keys(tokenGroup).forEach((tokenName) => {
|
7
7
|
if (referencedToken)
|
8
8
|
return;
|
9
|
+
// Relaxed runtime group resolving
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
9
11
|
if (tokenName === ref)
|
10
12
|
referencedToken = tokenGroup[tokenName];
|
11
13
|
});
|
@@ -1 +1 @@
|
|
1
|
-
@theme{--background-color-primary:var(--rs-color-background-primary);--background-color-primary-faded:var(--rs-color-background-primary-faded);--border-color-primary:var(--rs-color-border-primary);--border-color-primary-faded:var(--rs-color-border-primary-faded);--text-color-primary:var(--rs-color-foreground-primary);--background-color-critical:var(--rs-color-background-critical);--background-color-critical-faded:var(--rs-color-background-critical-faded);--border-color-critical:var(--rs-color-border-critical);--border-color-critical-faded:var(--rs-color-border-critical-faded);--text-color-critical:var(--rs-color-foreground-critical);--background-color-warning:var(--rs-color-background-warning);--background-color-warning-faded:var(--rs-color-background-warning-faded);--border-color-warning:var(--rs-color-border-warning);--border-color-warning-faded:var(--rs-color-border-warning-faded);--text-color-warning:var(--rs-color-foreground-warning);--background-color-positive:var(--rs-color-background-positive);--background-color-positive-faded:var(--rs-color-background-positive-faded);--border-color-positive:var(--rs-color-border-positive);--border-color-positive-faded:var(--rs-color-border-positive-faded);--text-color-positive:var(--rs-color-foreground-positive);--background-color-neutral:var(--rs-color-background-neutral);--background-color-neutral-faded:var(--rs-color-background-neutral-faded);--border-color-neutral:var(--rs-color-border-neutral);--border-color-neutral-faded:var(--rs-color-border-neutral-faded);--text-color-neutral:var(--rs-color-foreground-neutral);--text-color-neutral-faded:var(--rs-color-foreground-neutral-faded);--background-color-disabled:var(--rs-color-background-disabled);--background-color-disabled-faded:var(--rs-color-background-disabled-faded);--border-color-disabled:var(--rs-color-border-disabled);--text-color-disabled:var(--rs-color-foreground-disabled);--background-color-elevation-base:var(--rs-color-background-elevation-base);--background-color-elevation-raised:var(--rs-color-background-elevation-raised);--background-color-elevation-overlay:var(--rs-color-background-elevation-overlay);--background-color-page:var(--rs-color-background-page);--background-color-page-faded:var(--rs-color-background-page-faded);--color-brand:var(--rs-color-brand);--color-white:var(--rs-color-white);--color-black:var(--rs-color-black);--
|
1
|
+
@theme{--background-color-primary:var(--rs-color-background-primary);--background-color-primary-faded:var(--rs-color-background-primary-faded);--border-color-primary:var(--rs-color-border-primary);--border-color-primary-faded:var(--rs-color-border-primary-faded);--text-color-primary:var(--rs-color-foreground-primary);--background-color-critical:var(--rs-color-background-critical);--background-color-critical-faded:var(--rs-color-background-critical-faded);--border-color-critical:var(--rs-color-border-critical);--border-color-critical-faded:var(--rs-color-border-critical-faded);--text-color-critical:var(--rs-color-foreground-critical);--background-color-warning:var(--rs-color-background-warning);--background-color-warning-faded:var(--rs-color-background-warning-faded);--border-color-warning:var(--rs-color-border-warning);--border-color-warning-faded:var(--rs-color-border-warning-faded);--text-color-warning:var(--rs-color-foreground-warning);--background-color-positive:var(--rs-color-background-positive);--background-color-positive-faded:var(--rs-color-background-positive-faded);--border-color-positive:var(--rs-color-border-positive);--border-color-positive-faded:var(--rs-color-border-positive-faded);--text-color-positive:var(--rs-color-foreground-positive);--background-color-neutral:var(--rs-color-background-neutral);--background-color-neutral-faded:var(--rs-color-background-neutral-faded);--border-color-neutral:var(--rs-color-border-neutral);--border-color-neutral-faded:var(--rs-color-border-neutral-faded);--text-color-neutral:var(--rs-color-foreground-neutral);--text-color-neutral-faded:var(--rs-color-foreground-neutral-faded);--background-color-disabled:var(--rs-color-background-disabled);--background-color-disabled-faded:var(--rs-color-background-disabled-faded);--border-color-disabled:var(--rs-color-border-disabled);--text-color-disabled:var(--rs-color-foreground-disabled);--background-color-elevation-base:var(--rs-color-background-elevation-base);--background-color-elevation-raised:var(--rs-color-background-elevation-raised);--background-color-elevation-overlay:var(--rs-color-background-elevation-overlay);--background-color-page:var(--rs-color-background-page);--background-color-page-faded:var(--rs-color-background-page-faded);--color-brand:var(--rs-color-brand);--color-white:var(--rs-color-white);--color-black:var(--rs-color-black);--text-color-on-primary:var(--rs-color-on-background-primary);--text-color-on-critical:var(--rs-color-on-background-critical);--text-color-on-warning:var(--rs-color-on-background-warning);--text-color-on-positive:var(--rs-color-on-background-positive);--text-color-on-neutral:var(--rs-color-on-background-neutral);--text-color-on-brand:var(--rs-color-on-brand);--radius-small:var(--rs-radius-small);--radius-medium:var(--rs-radius-medium);--radius-large:var(--rs-radius-large);--spacing-0:0px;--spacing-x1:var(--rs-unit-x1);--spacing-x2:var(--rs-unit-x2);--spacing-x3:var(--rs-unit-x3);--spacing-x4:var(--rs-unit-x4);--spacing-x5:var(--rs-unit-x5);--spacing-x6:var(--rs-unit-x6);--spacing-x7:var(--rs-unit-x7);--spacing-x8:var(--rs-unit-x8);--spacing-x9:var(--rs-unit-x9);--spacing-x10:var(--rs-unit-x10);--shadow-raised:var(--rs-shadow-raised);--shadow-overlay:var(--rs-shadow-overlay);--breakpoint-m:660px;--breakpoint-l:900px;--breakpoint-xl:1280px}
|
@@ -1 +1 @@
|
|
1
|
-
[data-rs-theme=figma]{--rs-font-family-title:Inter,BlinkMacSystemFont,-apple-system,Roboto,Helvetica,Arial,sans-serif;--rs-font-family-body:Inter,BlinkMacSystemFont,-apple-system,Roboto,Helvetica,Arial,sans-serif;--rs-font-weight-regular:400;--rs-font-weight-medium:500;--rs-font-weight-semibold:600;--rs-font-weight-bold:700;--rs-font-weight-extrabold:800;--rs-font-weight-black:900;--rs-font-size-title-1:5rem;--rs-line-height-title-1:5.25rem;--rs-font-family-title-1:var(--rs-font-family-title);--rs-font-weight-title-1:var(--rs-font-weight-semibold);--rs-letter-spacing-title-1:normal;--rs-font-size-title-2:4rem;--rs-line-height-title-2:4.25rem;--rs-font-family-title-2:var(--rs-font-family-title);--rs-font-weight-title-2:var(--rs-font-weight-semibold);--rs-letter-spacing-title-2:normal;--rs-font-size-title-3:3.5rem;--rs-line-height-title-3:3.75rem;--rs-font-family-title-3:var(--rs-font-family-title);--rs-font-weight-title-3:var(--rs-font-weight-semibold);--rs-letter-spacing-title-3:normal;--rs-font-size-title-4:2.5rem;--rs-line-height-title-4:2.75rem;--rs-font-family-title-4:var(--rs-font-family-title);--rs-font-weight-title-4:var(--rs-font-weight-semibold);--rs-letter-spacing-title-4:normal;--rs-font-size-title-5:2.25rem;--rs-line-height-title-5:2.5rem;--rs-font-family-title-5:var(--rs-font-family-title);--rs-font-weight-title-5:var(--rs-font-weight-semibold);--rs-letter-spacing-title-5:normal;--rs-font-size-title-6:1.5rem;--rs-line-height-title-6:1.75rem;--rs-font-family-title-6:var(--rs-font-family-title);--rs-font-weight-title-6:var(--rs-font-weight-semibold);--rs-letter-spacing-title-6:normal;--rs-font-size-featured-1:1.375rem;--rs-line-height-featured-1:1.75rem;--rs-font-family-featured-1:var(--rs-font-family-body);--rs-letter-spacing-featured-1:normal;--rs-font-size-featured-2:1.25rem;--rs-line-height-featured-2:1.75rem;--rs-font-family-featured-2:var(--rs-font-family-body);--rs-letter-spacing-featured-2:normal;--rs-font-size-featured-3:1.125rem;--rs-line-height-featured-3:1.5rem;--rs-font-family-featured-3:var(--rs-font-family-body);--rs-letter-spacing-featured-3:normal;--rs-font-size-body-1:0.875rem;--rs-line-height-body-1:1.25rem;--rs-font-family-body-1:var(--rs-font-family-body);--rs-letter-spacing-body-1:normal;--rs-font-size-body-2:0.8125rem;--rs-line-height-body-2:1.25rem;--rs-font-family-body-2:var(--rs-font-family-body);--rs-letter-spacing-body-2:normal;--rs-font-size-body-3:0.6875rem;--rs-line-height-body-3:1rem;--rs-font-family-body-3:var(--rs-font-family-body);--rs-letter-spacing-body-3:normal;--rs-font-size-caption-1:0.6875rem;--rs-line-height-caption-1:1rem;--rs-font-family-caption-1:var(--rs-font-family-body);--rs-letter-spacing-caption-1:normal;--rs-font-size-caption-2:0.625rem;--rs-line-height-caption-2:0.75rem;--rs-font-family-caption-2:var(--rs-font-family-body);--rs-letter-spacing-caption-2:normal;--rs-unit-base:4px;--rs-unit-radius-small:4px;--rs-unit-radius-medium:4px;--rs-unit-radius-large:4px;--rs-unit-x1:4px;--rs-unit-x2:8px;--rs-unit-x3:12px;--rs-unit-x4:16px;--rs-unit-x5:20px;--rs-unit-x6:24px;--rs-unit-x7:28px;--rs-unit-x8:32px;--rs-unit-x9:36px;--rs-unit-x10:40px;--rs-radius-small:4px;--rs-radius-medium:8px;--rs-radius-large:12px;--rs-color-brand:#
|
1
|
+
[data-rs-theme=figma]{--rs-font-family-title:Inter,BlinkMacSystemFont,-apple-system,Roboto,Helvetica,Arial,sans-serif;--rs-font-family-body:Inter,BlinkMacSystemFont,-apple-system,Roboto,Helvetica,Arial,sans-serif;--rs-font-weight-regular:400;--rs-font-weight-medium:500;--rs-font-weight-semibold:600;--rs-font-weight-bold:700;--rs-font-weight-extrabold:800;--rs-font-weight-black:900;--rs-font-size-title-1:5rem;--rs-line-height-title-1:5.25rem;--rs-font-family-title-1:var(--rs-font-family-title);--rs-font-weight-title-1:var(--rs-font-weight-semibold);--rs-letter-spacing-title-1:normal;--rs-font-size-title-2:4rem;--rs-line-height-title-2:4.25rem;--rs-font-family-title-2:var(--rs-font-family-title);--rs-font-weight-title-2:var(--rs-font-weight-semibold);--rs-letter-spacing-title-2:normal;--rs-font-size-title-3:3.5rem;--rs-line-height-title-3:3.75rem;--rs-font-family-title-3:var(--rs-font-family-title);--rs-font-weight-title-3:var(--rs-font-weight-semibold);--rs-letter-spacing-title-3:normal;--rs-font-size-title-4:2.5rem;--rs-line-height-title-4:2.75rem;--rs-font-family-title-4:var(--rs-font-family-title);--rs-font-weight-title-4:var(--rs-font-weight-semibold);--rs-letter-spacing-title-4:normal;--rs-font-size-title-5:2.25rem;--rs-line-height-title-5:2.5rem;--rs-font-family-title-5:var(--rs-font-family-title);--rs-font-weight-title-5:var(--rs-font-weight-semibold);--rs-letter-spacing-title-5:normal;--rs-font-size-title-6:1.5rem;--rs-line-height-title-6:1.75rem;--rs-font-family-title-6:var(--rs-font-family-title);--rs-font-weight-title-6:var(--rs-font-weight-semibold);--rs-letter-spacing-title-6:normal;--rs-font-size-featured-1:1.375rem;--rs-line-height-featured-1:1.75rem;--rs-font-family-featured-1:var(--rs-font-family-body);--rs-letter-spacing-featured-1:normal;--rs-font-size-featured-2:1.25rem;--rs-line-height-featured-2:1.75rem;--rs-font-family-featured-2:var(--rs-font-family-body);--rs-letter-spacing-featured-2:normal;--rs-font-size-featured-3:1.125rem;--rs-line-height-featured-3:1.5rem;--rs-font-family-featured-3:var(--rs-font-family-body);--rs-letter-spacing-featured-3:normal;--rs-font-size-body-1:0.875rem;--rs-line-height-body-1:1.25rem;--rs-font-family-body-1:var(--rs-font-family-body);--rs-letter-spacing-body-1:normal;--rs-font-size-body-2:0.8125rem;--rs-line-height-body-2:1.25rem;--rs-font-family-body-2:var(--rs-font-family-body);--rs-letter-spacing-body-2:normal;--rs-font-size-body-3:0.6875rem;--rs-line-height-body-3:1rem;--rs-font-family-body-3:var(--rs-font-family-body);--rs-letter-spacing-body-3:normal;--rs-font-size-caption-1:0.6875rem;--rs-line-height-caption-1:1rem;--rs-font-family-caption-1:var(--rs-font-family-body);--rs-letter-spacing-caption-1:normal;--rs-font-size-caption-2:0.625rem;--rs-line-height-caption-2:0.75rem;--rs-font-family-caption-2:var(--rs-font-family-body);--rs-letter-spacing-caption-2:normal;--rs-unit-base:4px;--rs-unit-radius-small:4px;--rs-unit-radius-medium:4px;--rs-unit-radius-large:4px;--rs-unit-x1:4px;--rs-unit-x2:8px;--rs-unit-x3:12px;--rs-unit-x4:16px;--rs-unit-x5:20px;--rs-unit-x6:24px;--rs-unit-x7:28px;--rs-unit-x8:32px;--rs-unit-x9:36px;--rs-unit-x10:40px;--rs-radius-small:4px;--rs-radius-medium:8px;--rs-radius-large:12px;--rs-color-brand:#0d99ff;--rs-color-white:#fff;--rs-color-black:#000;--rs-color-on-background-primary:#fff;--rs-color-on-background-critical:#000;--rs-color-on-background-warning:#000;--rs-color-on-background-positive:#000;--rs-color-on-brand:#000;--rs-color-rgb-white:255,255,255;--rs-color-rgb-black:0,0,0;--rs-duration-rapid:100ms;--rs-duration-fast:200ms;--rs-duration-medium:300ms;--rs-duration-slow:400ms;--rs-easing-standard:cubic-bezier(0.4,0,0.2,1);--rs-easing-accelerate:cubic-bezier(0.4,0,1,1);--rs-easing-decelerate:cubic-bezier(0,0,0.2,1);--rs-shadow-raised:0px 1px 3px 0px rgba(0,0,0,.15);--rs-shadow-overlay:0px 10px 24px 0px rgba(0,0,0,.1),0px 2px 5px 0px rgba(0,0,0,.04);--rs-viewport-m-min:660;--rs-viewport-l-min:900;--rs-viewport-xl-min:1280}[data-rs-theme=figma][data-rs-color-mode=light]{--rs-color-background-primary:#0d99ff;--rs-color-background-primary-faded:#e5f4ff;--rs-color-border-primary:#007be5;--rs-color-border-primary-faded:#bde3ff;--rs-color-foreground-primary:#007be5;--rs-color-background-critical:#f24822;--rs-color-background-critical-faded:#ffe2e0;--rs-color-border-critical:#dc3412;--rs-color-border-critical-faded:#ffc7c2;--rs-color-foreground-critical:#dc3412;--rs-color-background-warning:#facc15;--rs-color-background-warning-faded:#fffae9;--rs-color-border-warning:#cfa90f;--rs-color-border-warning-faded:#ece2c4;--rs-color-foreground-warning:#7b6305;--rs-color-background-positive:#14ae5c;--rs-color-background-positive-faded:#daecdf;--rs-color-border-positive:#009951;--rs-color-border-positive-faded:#bbddc6;--rs-color-foreground-positive:#009951;--rs-color-background-neutral:#dfe2ea;--rs-color-background-neutral-faded:#f5f5f5;--rs-color-border-neutral:#e6e6e6;--rs-color-border-neutral-faded:#e6e6e6;--rs-color-foreground-neutral:#191919;--rs-color-foreground-neutral-faded:#474747;--rs-color-background-disabled:#e4e4e4;--rs-color-background-disabled-faded:#f5f5f5;--rs-color-border-disabled:#e6e6e6;--rs-color-foreground-disabled:#b2b2b2;--rs-color-background-elevation-base:#fff;--rs-color-background-elevation-raised:#fff;--rs-color-background-elevation-overlay:#fff;--rs-color-background-page:#fff;--rs-color-background-page-faded:#fafafa;--rs-color-rgb-background-primary:13,153,255;--rs-color-rgb-background-primary-faded:229,244,255;--rs-color-rgb-background-critical:242,72,34;--rs-color-rgb-background-critical-faded:255,226,224;--rs-color-rgb-background-warning:250,204,21;--rs-color-rgb-background-warning-faded:255,250,233;--rs-color-rgb-background-positive:20,174,92;--rs-color-rgb-background-positive-faded:218,236,223;--rs-color-on-background-neutral:#000;--rs-color-rgb-background-neutral:223,226,234;--rs-color-rgb-background-neutral-faded:245,245,245;--rs-color-rgb-background-disabled:228,228,228;--rs-color-rgb-background-disabled-faded:245,245,245;--rs-color-rgb-background-elevation-base:255,255,255;--rs-color-rgb-background-elevation-raised:255,255,255;--rs-color-rgb-background-elevation-overlay:255,255,255;--rs-color-rgb-background-page:255,255,255;--rs-color-rgb-background-page-faded:250,250,250}[data-rs-theme=figma][data-rs-color-mode=dark]{--rs-color-background-primary:#0c8ce9;--rs-color-background-primary-faded:#394360;--rs-color-border-primary:#7cc4f8;--rs-color-border-primary-faded:#2a4d72;--rs-color-foreground-primary:#7cc4f8;--rs-color-background-critical:#e03e1a;--rs-color-background-critical-faded:#60332a;--rs-color-border-critical:#fca397;--rs-color-border-critical-faded:#803226;--rs-color-foreground-critical:#fca397;--rs-color-background-warning:#f1c512;--rs-color-background-warning-faded:#2c271f;--rs-color-border-warning:#b4920a;--rs-color-border-warning-faded:#453c1e;--rs-color-foreground-warning:#b4920c;--rs-color-background-positive:#198f51;--rs-color-background-positive-faded:#3d5749;--rs-color-border-positive:#79d297;--rs-color-border-positive-faded:#086338;--rs-color-foreground-positive:#79d297;--rs-color-background-neutral:#444;--rs-color-background-neutral-faded:#383838;--rs-color-border-neutral:#444;--rs-color-border-neutral-faded:#444;--rs-color-foreground-neutral:#fff;--rs-color-foreground-neutral-faded:#b2b2b2;--rs-color-background-disabled:#474747;--rs-color-background-disabled-faded:#3a3a3a;--rs-color-border-disabled:#3e3e3e;--rs-color-foreground-disabled:#656565;--rs-color-background-elevation-base:#2c2c2c;--rs-color-background-elevation-raised:#2c2c2c;--rs-color-background-elevation-overlay:#2c2c2c;--rs-color-background-page:#2c2c2c;--rs-color-background-page-faded:#1e1e1e;--rs-color-rgb-background-primary:12,140,233;--rs-color-rgb-background-primary-faded:57,67,96;--rs-color-rgb-background-critical:224,62,26;--rs-color-rgb-background-critical-faded:96,51,42;--rs-color-rgb-background-warning:241,197,18;--rs-color-rgb-background-warning-faded:44,39,31;--rs-color-rgb-background-positive:25,143,81;--rs-color-rgb-background-positive-faded:61,87,73;--rs-color-on-background-neutral:#fff;--rs-color-rgb-background-neutral:68,68,68;--rs-color-rgb-background-neutral-faded:56,56,56;--rs-color-rgb-background-disabled:71,71,71;--rs-color-rgb-background-disabled-faded:58,58,58;--rs-color-rgb-background-elevation-base:44,44,44;--rs-color-rgb-background-elevation-raised:44,44,44;--rs-color-rgb-background-elevation-overlay:44,44,44;--rs-color-rgb-background-page:44,44,44;--rs-color-rgb-background-page-faded:30,30,30}
|
@@ -22,7 +22,6 @@ const transformDefinition = (name, definition, options) => {
|
|
22
22
|
if (code.media)
|
23
23
|
fs.writeFileSync(themeMediaPath, code.media);
|
24
24
|
const logOutput = `Compiled ${chalk.bold(name)} theme${isFragment ? " fragment" : ""}`;
|
25
|
-
// eslint-disable-next-line no-console
|
26
25
|
console.log(chalk.green(logOutput));
|
27
26
|
};
|
28
27
|
export const addThemeFragment = (name, definition, options) => {
|
@@ -15,6 +15,8 @@ const Actionable = forwardRef((props, ref) => {
|
|
15
15
|
// To make sure it doesn't render a span
|
16
16
|
const isButton = Boolean(hasClickHandler || hasFocusHandler || type || attributes?.ref);
|
17
17
|
const renderedAsButton = !isLink && isButton && (!as || as === "button");
|
18
|
+
// Using any here to let TS save on type resolving, otherwise TS throws an error due to the type complexity
|
19
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
18
20
|
let TagName;
|
19
21
|
if (isLink) {
|
20
22
|
TagName = "a";
|
@@ -70,6 +70,7 @@ const Autocomplete = (props) => {
|
|
70
70
|
return (_jsx(AutocompleteContext.Provider, { value: { onItemClick: handleItemClick }, children: _jsxs(DropdownMenu, { position: "bottom", width: "trigger", triggerType: "focus", trapFocusMode: "selection-menu", active: isDropdownActive, onClose: handleClose, onOpen: handleOpen, containerRef: containerRef, disableHideAnimation: true, instanceRef: instanceRef, children: [_jsx(DropdownMenu.Trigger, { children: ({ ref, ...attributes }) => (_jsx(TextField, { ...textFieldProps, name: name, onChange: handleChange, focused: isDropdownActive, attributes: {
|
71
71
|
...textFieldProps.attributes,
|
72
72
|
// Ignoring the type check since TS can't infer the correct html element type
|
73
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
73
74
|
ref: ref,
|
74
75
|
onClick: attributes.onFocus,
|
75
76
|
}, inputAttributes: {
|
@@ -1 +1 @@
|
|
1
|
-
.selection{table-layout:fixed;width:100%}.weekday{color:var(--rs-color-foreground-neutral-faded);font-weight:var(--rs-font-weight-regular);padding-bottom:var(--rs-unit-x2)}
|
1
|
+
.selection{table-layout:fixed;width:100%}.weekday{color:var(--rs-color-foreground-neutral-faded);font-weight:var(--rs-font-weight-regular);padding-bottom:var(--rs-unit-x2)}[dir=rtl] .control{transform:scaleX(-1)}.cell{isolation:isolate;padding:2px}.cell:hover .cell-button{background-color:rgba(var(--rs-color-rgb-background-neutral),32%)}.cell.--active .cell-button{background-color:var(--rs-color-background-primary);color:var(--rs-color-on-background-primary)}.cell.--selection-range .cell-button{background-color:rgba(var(--rs-color-rgb-background-neutral),32%)}.cell.--selection-range:not(:last-child) .cell-button,.cell.--selection-start:not(:last-child) .cell-button{border-end-end-radius:0;border-start-end-radius:0}.cell.--selection-end:not(:first-child) .cell-button,.cell.--selection-range+:hover .cell-button,.cell.--selection-range:not(:first-child) .cell-button,.cell.--selection-start+:hover .cell-button{border-end-start-radius:0;border-start-start-radius:0}.cell.--selection-range+.--selection-end .cell-button:before,.cell.--selection-range+.--selection-range .cell-button:before,.cell.--selection-range+:hover .cell-button:before,.cell.--selection-start+.--selection-range .cell-button:before,.cell.--selection-start+:hover .cell-button:before{background-color:rgba(var(--rs-color-rgb-background-neutral),32%)}.cell-button{border-radius:var(--rs-radius-small);padding:var(--rs-unit-x2);position:relative;text-align:center;transition:var(--rs-duration-fast) var(--rs-easing-standard);transition-property:color,background-color,border-radius}.cell-button:before{content:"";inset-block:0;inset-inline-start:-4px;position:absolute;transition:var(--rs-duration-fast) var(--rs-easing-standard);transition-property:background-color;width:4px}.cell-button[disabled]{background-color:transparent!important;color:var(--rs-color-foreground-disabled)!important}
|
@@ -4,6 +4,7 @@ export type BaseProps = {
|
|
4
4
|
min?: Date;
|
5
5
|
max?: Date;
|
6
6
|
firstWeekDay?: number;
|
7
|
+
selectedDates?: Date[];
|
7
8
|
renderWeekDay?: (args: {
|
8
9
|
weekDay: number;
|
9
10
|
date: Date;
|
@@ -74,21 +75,20 @@ export type MonthProps = {
|
|
74
75
|
hoveredDate: Date | null;
|
75
76
|
onDateHover: (date: Date) => void;
|
76
77
|
onDateHoverEnd: (date: Date) => void;
|
77
|
-
} & Pick<BaseProps, "max" | "min" | "firstWeekDay" | "renderMonthLabel" | "renderWeekDay" | "renderSelectedMonthLabel" | "renderDateAriaLabel"> & Pick<ControlledProps, "value" | "onChange" | "range">;
|
78
|
+
} & Pick<BaseProps, "max" | "min" | "firstWeekDay" | "selectedDates" | "renderMonthLabel" | "renderWeekDay" | "renderSelectedMonthLabel" | "renderDateAriaLabel"> & Pick<ControlledProps, "value" | "onChange" | "range">;
|
78
79
|
export type YearProps = {
|
79
80
|
monthDate: Date;
|
80
81
|
onMonthClick: (month: number) => void;
|
81
82
|
} & Pick<BaseProps, "renderMonthLabel" | "min" | "max" | "renderMonthAriaLabel">;
|
82
83
|
export type DateProps = {
|
83
84
|
date: Date | null;
|
85
|
+
isoDate: string | null;
|
84
86
|
disabled?: boolean;
|
85
87
|
focusable?: boolean;
|
86
88
|
startValue: Date | null;
|
87
89
|
endValue: Date | null;
|
88
|
-
isActiveStart: boolean;
|
89
|
-
isActiveEnd: boolean;
|
90
90
|
renderAriaLabel?: MonthProps["renderDateAriaLabel"];
|
91
|
-
} & Pick<MonthProps, "hoveredDate" | "onDateHover" | "onDateHoverEnd" | "onChange" | "range" | "min" | "max">;
|
91
|
+
} & Pick<MonthProps, "hoveredDate" | "onDateHover" | "onDateHoverEnd" | "onChange" | "range" | "min" | "max" | "selectedDates">;
|
92
92
|
export type ControlsProps = {
|
93
93
|
selectionMode: SelectionMode;
|
94
94
|
onMonthTitleClick: () => void;
|
@@ -9,7 +9,7 @@ import CalendarMonth from "./CalendarMonth.js";
|
|
9
9
|
import CalendarYear from "./CalendarYear.js";
|
10
10
|
import CalendarControls from "./CalendarControls.js";
|
11
11
|
const CalendarControlled = (props) => {
|
12
|
-
const { value, onChange, defaultMonth, min, max, range, firstWeekDay, renderMonthLabel, renderSelectedMonthLabel, renderWeekDay, previousMonthAriaLabel, previousYearAriaLabel, nextMonthAriaLabel, nextYearAriaLabel, monthSelectionAriaLabel, renderMonthAriaLabel, renderDateAriaLabel, } = props;
|
12
|
+
const { value, onChange, defaultMonth, min, max, range, firstWeekDay, selectedDates, renderMonthLabel, renderSelectedMonthLabel, renderWeekDay, previousMonthAriaLabel, previousYearAriaLabel, nextMonthAriaLabel, nextYearAriaLabel, monthSelectionAriaLabel, renderMonthAriaLabel, renderDateAriaLabel, } = props;
|
13
13
|
const [selectionMode, setSelectionMode] = React.useState("date");
|
14
14
|
const [monthDate, setMonthDate] = React.useState(defaultMonth || new Date());
|
15
15
|
const [hoveredDate, setHoveredDate] = React.useState(null);
|
@@ -63,6 +63,6 @@ const CalendarControlled = (props) => {
|
|
63
63
|
min,
|
64
64
|
max,
|
65
65
|
});
|
66
|
-
return (_jsxs(View, { gap: 2, children: [_jsx(CalendarControls, { renderSelectedMonthLabel: renderSelectedMonthLabel, monthDate: monthDate, selectionMode: selectionMode, isFirstMonth: bounds.isFirstMonth, isLastMonth: bounds.isLastMonth, monthTitleRef: monthTitleRef, onMonthTitleClick: handleMonthTitleClick, onNextClick: handleNextClick, onPreviousClick: handlePreviousClick, previousMonthAriaLabel: previousMonthAriaLabel, previousYearAriaLabel: previousYearAriaLabel, nextMonthAriaLabel: nextMonthAriaLabel, nextYearAriaLabel: nextYearAriaLabel, monthSelectionAriaLabel: monthSelectionAriaLabel }), _jsxs(View.Item, { attributes: { ref: selectionRootRef }, children: [selectionMode === "date" && (_jsx(CalendarMonth, { date: monthDate, value: value, onChange: onChange, min: min, max: max, range: range, firstWeekDay: firstWeekDay, hoveredDate: hoveredDate, onDateHover: handleDateHover, onDateHoverEnd: handleDateHoverEnd, renderWeekDay: renderWeekDay, renderDateAriaLabel: renderDateAriaLabel })), selectionMode === "month" && (_jsx(CalendarYear, { monthDate: monthDate, onMonthClick: handleMonthClick, renderMonthLabel: renderMonthLabel, renderMonthAriaLabel: renderMonthAriaLabel, min: min, max: max }))] })] }));
|
66
|
+
return (_jsxs(View, { gap: 2, children: [_jsx(CalendarControls, { renderSelectedMonthLabel: renderSelectedMonthLabel, monthDate: monthDate, selectionMode: selectionMode, isFirstMonth: bounds.isFirstMonth, isLastMonth: bounds.isLastMonth, monthTitleRef: monthTitleRef, onMonthTitleClick: handleMonthTitleClick, onNextClick: handleNextClick, onPreviousClick: handlePreviousClick, previousMonthAriaLabel: previousMonthAriaLabel, previousYearAriaLabel: previousYearAriaLabel, nextMonthAriaLabel: nextMonthAriaLabel, nextYearAriaLabel: nextYearAriaLabel, monthSelectionAriaLabel: monthSelectionAriaLabel }), _jsxs(View.Item, { attributes: { ref: selectionRootRef }, children: [selectionMode === "date" && (_jsx(CalendarMonth, { date: monthDate, value: value, onChange: onChange, min: min, max: max, range: range, firstWeekDay: firstWeekDay, hoveredDate: hoveredDate, selectedDates: selectedDates, onDateHover: handleDateHover, onDateHoverEnd: handleDateHoverEnd, renderWeekDay: renderWeekDay, renderDateAriaLabel: renderDateAriaLabel })), selectionMode === "month" && (_jsx(CalendarYear, { monthDate: monthDate, onMonthClick: handleMonthClick, renderMonthLabel: renderMonthLabel, renderMonthAriaLabel: renderMonthAriaLabel, min: min, max: max }))] })] }));
|
67
67
|
};
|
68
68
|
export default CalendarControlled;
|
@@ -5,20 +5,38 @@ import { classNames } from "../../utilities/helpers.js";
|
|
5
5
|
import { getLocalISODate } from "./Calendar.utils.js";
|
6
6
|
import s from "./Calendar.module.css";
|
7
7
|
const CalendarDate = (props) => {
|
8
|
-
const { date, startValue, endValue,
|
8
|
+
const { date, isoDate, startValue, endValue, disabled, focusable, onChange, range, hoveredDate, onDateHover, onDateHoverEnd, renderAriaLabel, selectedDates, } = props;
|
9
9
|
if (!date)
|
10
10
|
return _jsx("td", { className: s.cell, "aria-hidden": "true" });
|
11
|
-
const
|
12
|
-
|
13
|
-
|
11
|
+
const isoStartValue = startValue && getLocalISODate({ date: startValue });
|
12
|
+
const isoEndValue = endValue && getLocalISODate({ date: endValue });
|
13
|
+
const isStartValue = !!isoDate && !!isoStartValue && isoDate === isoStartValue;
|
14
|
+
const isEndValue = !!isoDate && !!isoEndValue && isoDate === isoEndValue;
|
15
|
+
const isAfterStartValue = startValue && date > startValue;
|
16
|
+
const isBeforeEndValue = endValue && date < endValue;
|
17
|
+
const isInHoveredRange = hoveredDate && !endValue && hoveredDate > date;
|
18
|
+
const isInSelectedDates = !!selectedDates?.find((selectedDate) => getLocalISODate({ date: selectedDate }) === isoDate);
|
19
|
+
let selection;
|
20
|
+
switch (true) {
|
21
|
+
case isAfterStartValue && isInHoveredRange:
|
22
|
+
case isAfterStartValue && isBeforeEndValue:
|
23
|
+
selection = "range";
|
24
|
+
break;
|
25
|
+
case isStartValue && (!range || isEndValue):
|
26
|
+
case isInSelectedDates:
|
27
|
+
selection = "standalone";
|
28
|
+
break;
|
29
|
+
case isStartValue:
|
30
|
+
selection = "start";
|
31
|
+
break;
|
32
|
+
case isEndValue:
|
33
|
+
selection = "end";
|
34
|
+
break;
|
35
|
+
}
|
14
36
|
const dateClassNames = classNames([
|
15
37
|
s.cell,
|
16
|
-
|
17
|
-
|
18
|
-
(isActiveEnd ||
|
19
|
-
(!endValue && isActiveStart && !(hoveredDate && startValue && hoveredDate > startValue))) &&
|
20
|
-
s["cell--active-end"],
|
21
|
-
inRange && s["cell--in-range"],
|
38
|
+
selection && s["--active"],
|
39
|
+
selection && s[`--selection-${selection}`],
|
22
40
|
]);
|
23
41
|
const handleClick = () => {
|
24
42
|
if (!range) {
|
@@ -46,7 +64,7 @@ const CalendarDate = (props) => {
|
|
46
64
|
"aria-label": renderAriaLabel
|
47
65
|
? renderAriaLabel({ date })
|
48
66
|
: date.toLocaleDateString("en-us", { month: "long", day: "numeric", weekday: "long" }),
|
49
|
-
"aria-checked":
|
67
|
+
"aria-checked": !!selection,
|
50
68
|
"data-rs-date": getLocalISODate({ date }),
|
51
69
|
onMouseEnter: handleMouseEnter,
|
52
70
|
onMouseLeave: handleMouseLeave,
|
@@ -4,7 +4,7 @@ import { getMonthWeeks, getWeekdayNames, getLocalISODate } from "./Calendar.util
|
|
4
4
|
import CalendarDate from "./CalendarDate.js";
|
5
5
|
import s from "./Calendar.module.css";
|
6
6
|
const CalendarMonth = (props) => {
|
7
|
-
const { date, value, onChange, min, max, range, firstWeekDay, hoveredDate, onDateHover, onDateHoverEnd, renderWeekDay, renderDateAriaLabel, } = props;
|
7
|
+
const { date, value, onChange, min, max, range, firstWeekDay, selectedDates, hoveredDate, onDateHover, onDateHoverEnd, renderWeekDay, renderDateAriaLabel, } = props;
|
8
8
|
let foundFocusableDate = false;
|
9
9
|
const month = date.getMonth();
|
10
10
|
const weeks = getMonthWeeks({ date, firstWeekDay });
|
@@ -19,10 +19,6 @@ const CalendarMonth = (props) => {
|
|
19
19
|
const startValue = value && "start" in value ? value.start : value;
|
20
20
|
const endValue = value && "end" in value ? value.end : value;
|
21
21
|
const isoDate = date && getLocalISODate({ date });
|
22
|
-
const isoStartValue = startValue && getLocalISODate({ date: startValue });
|
23
|
-
const isoEndValue = endValue && getLocalISODate({ date: endValue });
|
24
|
-
const isActiveStart = !!isoDate && !!isoStartValue && isoDate === isoStartValue;
|
25
|
-
const isActiveEnd = !!isoDate && !!isoEndValue && isoDate === isoEndValue;
|
26
22
|
/**
|
27
23
|
* Decide if date has to be focusable with Tab (only one date should be)
|
28
24
|
* 1. If there is a selected value - it's focusable
|
@@ -43,7 +39,7 @@ const CalendarMonth = (props) => {
|
|
43
39
|
}
|
44
40
|
if (focusable)
|
45
41
|
foundFocusableDate = true;
|
46
|
-
return (_jsx(CalendarDate, { date: date, disabled: disabled, range: range, focusable: focusable, startValue: startValue, endValue: endValue,
|
42
|
+
return (_jsx(CalendarDate, { date: date, isoDate: isoDate, disabled: disabled, range: range, focusable: focusable, startValue: startValue, endValue: endValue, onChange: onChange, hoveredDate: hoveredDate, onDateHover: onDateHover, onDateHoverEnd: onDateHoverEnd, renderAriaLabel: renderDateAriaLabel, selectedDates: selectedDates }, index));
|
47
43
|
}) }, key));
|
48
44
|
}) })] }));
|
49
45
|
};
|
@@ -1,3 +1,5 @@
|
|
1
|
+
import { StoryObj } from "@storybook/react";
|
2
|
+
import { type Mock } from "@storybook/test";
|
1
3
|
declare const _default: {
|
2
4
|
title: string;
|
3
5
|
component: (props: import("./..").CalendarProps) => import("react").JSX.Element;
|
@@ -8,7 +10,20 @@ declare const _default: {
|
|
8
10
|
};
|
9
11
|
};
|
10
12
|
export default _default;
|
11
|
-
export declare const
|
12
|
-
export declare const
|
13
|
-
|
14
|
-
|
13
|
+
export declare const defaultMonth: StoryObj;
|
14
|
+
export declare const uncontrolled: StoryObj<{
|
15
|
+
handleChange: Mock;
|
16
|
+
}>;
|
17
|
+
export declare const controlled: StoryObj<{
|
18
|
+
handleChange: Mock;
|
19
|
+
}>;
|
20
|
+
export declare const selectedDates: StoryObj;
|
21
|
+
export declare const minMax: StoryObj;
|
22
|
+
export declare const firstWeekDay: StoryObj;
|
23
|
+
export declare const translation: {
|
24
|
+
name: string;
|
25
|
+
render: () => import("react").JSX.Element;
|
26
|
+
};
|
27
|
+
export declare const ariaLabels: StoryObj;
|
28
|
+
export declare const monthSelection: StoryObj;
|
29
|
+
export declare const keyboardNavigation: StoryObj;
|