@noya-app/noya-designsystem 0.1.60 → 0.1.62
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/.turbo/turbo-build.log +10 -10
- package/CHANGELOG.md +16 -0
- package/dist/index.css +1 -1
- package/dist/index.d.mts +19 -1
- package/dist/index.d.ts +19 -1
- package/dist/index.js +45 -51
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +45 -51
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
- package/src/components/BaseToolbar.tsx +1 -0
- package/src/components/Button.tsx +2 -2
- package/src/components/Checkbox.tsx +2 -2
- package/src/components/Collection.tsx +1 -0
- package/src/components/Divider.tsx +15 -11
- package/src/components/Grid.tsx +4 -0
- package/src/components/List.tsx +4 -0
- package/src/components/MediaThumbnail.tsx +1 -0
- package/src/components/SegmentedControl.tsx +1 -1
- package/src/components/SelectionToolbar.tsx +4 -2
- package/src/components/Slider.tsx +21 -57
- package/src/index.css +24 -4
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@noya-app/noya-designsystem",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.62",
|
|
4
4
|
"main": "./dist/index.js",
|
|
5
5
|
"module": "./dist/index.mjs",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -22,12 +22,12 @@
|
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"@dnd-kit/core": "6.3.1",
|
|
24
24
|
"@dnd-kit/sortable": "10.0.0",
|
|
25
|
-
"@noya-app/noya-colorpicker": "0.1.
|
|
25
|
+
"@noya-app/noya-colorpicker": "0.1.25",
|
|
26
26
|
"@noya-app/noya-utils": "0.1.5",
|
|
27
|
-
"@noya-app/noya-geometry": "0.1.
|
|
27
|
+
"@noya-app/noya-geometry": "0.1.12",
|
|
28
28
|
"@noya-app/noya-icons": "0.1.10",
|
|
29
29
|
"@noya-app/noya-keymap": "0.1.3",
|
|
30
|
-
"@noya-app/noya-tailwind-config": "0.1.
|
|
30
|
+
"@noya-app/noya-tailwind-config": "0.1.4",
|
|
31
31
|
"@radix-ui/primitive": "^1.0.0",
|
|
32
32
|
"@radix-ui/react-avatar": "^1.0.1",
|
|
33
33
|
"@radix-ui/react-compose-refs": "^1.0.0",
|
|
@@ -25,7 +25,7 @@ type ButtonSize = "small" | "normal" | "large" | "floating";
|
|
|
25
25
|
|
|
26
26
|
const variantStyles: Record<ButtonVariant, string> = {
|
|
27
27
|
normal:
|
|
28
|
-
"bg-
|
|
28
|
+
"bg-button-background text-button-text hover:bg-button-background-hover active:bg-button-background-active min-w-[31px]",
|
|
29
29
|
primary:
|
|
30
30
|
"bg-primary text-white hover:bg-primary-light active:bg-primary min-w-[31px]",
|
|
31
31
|
secondary:
|
|
@@ -96,7 +96,7 @@ export const Button = forwardRef(function Button(
|
|
|
96
96
|
disabled ? "opacity-25" : "",
|
|
97
97
|
!className?.includes("flex") ? "flex-none" : "",
|
|
98
98
|
active
|
|
99
|
-
? "bg-
|
|
99
|
+
? "bg-button-background-active text-button-text-active hover:bg-button-background-active-hover min-w-[31px]"
|
|
100
100
|
: variantStyles[variant],
|
|
101
101
|
sizeStyles[
|
|
102
102
|
variant === "thin"
|
|
@@ -15,7 +15,7 @@ const colorSchemeStyles = {
|
|
|
15
15
|
|
|
16
16
|
export const Checkbox = React.memo(
|
|
17
17
|
React.forwardRef<HTMLInputElement, CheckboxProps>(function Checkbox(
|
|
18
|
-
{ className, style, colorScheme = "
|
|
18
|
+
{ className, style, colorScheme = "primary", ...props },
|
|
19
19
|
ref
|
|
20
20
|
) {
|
|
21
21
|
const { fieldId: id } = useLabel({ fieldId: props.id });
|
|
@@ -39,10 +39,10 @@ export const Checkbox = React.memo(
|
|
|
39
39
|
m-0
|
|
40
40
|
rounded
|
|
41
41
|
bg-input-background
|
|
42
|
-
|
|
43
42
|
border
|
|
44
43
|
border-divider
|
|
45
44
|
disabled:opacity-50
|
|
45
|
+
cursor-pointer
|
|
46
46
|
disabled:cursor-not-allowed
|
|
47
47
|
focus:ring-2
|
|
48
48
|
focus:ring-primary
|
|
@@ -20,11 +20,12 @@ export const Divider = memo(function Divider({
|
|
|
20
20
|
return (
|
|
21
21
|
<div
|
|
22
22
|
className={cx(
|
|
23
|
-
`
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
`h-px min-h-px self-stretch`,
|
|
24
|
+
variant === "strong"
|
|
25
|
+
? "bg-divider-strong"
|
|
26
|
+
: variant === "subtle"
|
|
27
|
+
? "bg-divider-subtle"
|
|
28
|
+
: "bg-divider",
|
|
28
29
|
className
|
|
29
30
|
)}
|
|
30
31
|
style={{
|
|
@@ -46,12 +47,15 @@ export const DividerVertical = memo(function DividerVertical({
|
|
|
46
47
|
}: DividerProps) {
|
|
47
48
|
return (
|
|
48
49
|
<div
|
|
49
|
-
className={cx(
|
|
50
|
-
w-px min-w-px
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
50
|
+
className={cx(
|
|
51
|
+
`w-px min-w-px self-stretch`,
|
|
52
|
+
variant === "strong"
|
|
53
|
+
? "bg-divider-strong"
|
|
54
|
+
: variant === "subtle"
|
|
55
|
+
? "bg-divider-subtle"
|
|
56
|
+
: "bg-divider",
|
|
57
|
+
className
|
|
58
|
+
)}
|
|
55
59
|
style={{
|
|
56
60
|
marginTop: `-${overflow}px`,
|
|
57
61
|
marginBottom: `-${overflow}px`,
|
package/src/components/Grid.tsx
CHANGED
package/src/components/List.tsx
CHANGED
|
@@ -336,6 +336,7 @@ const pyMap: Record<CollectionItemSize, string> = {
|
|
|
336
336
|
xs: "py-0.5",
|
|
337
337
|
small: "py-0.5",
|
|
338
338
|
medium: "py-1",
|
|
339
|
+
mediumLarge: "py-1.5",
|
|
339
340
|
large: "py-2",
|
|
340
341
|
xl: "py-3",
|
|
341
342
|
};
|
|
@@ -345,6 +346,7 @@ const thumbnailSizeMap: Record<CollectionItemSize, string> = {
|
|
|
345
346
|
xs: "w-5 h-5",
|
|
346
347
|
small: "w-5 h-5",
|
|
347
348
|
medium: "w-8 h-8",
|
|
349
|
+
mediumLarge: "w-12 h-12",
|
|
348
350
|
large: "w-16 h-16",
|
|
349
351
|
xl: "w-24 h-24",
|
|
350
352
|
};
|
|
@@ -354,6 +356,7 @@ const rowGapMap: Record<CollectionItemSize, string> = {
|
|
|
354
356
|
xs: "gap-2",
|
|
355
357
|
small: "gap-2",
|
|
356
358
|
medium: "gap-3",
|
|
359
|
+
mediumLarge: "gap-3",
|
|
357
360
|
large: "gap-3",
|
|
358
361
|
xl: "gap-4",
|
|
359
362
|
};
|
|
@@ -363,6 +366,7 @@ const fontStyleMap: Record<CollectionItemSize, string> = {
|
|
|
363
366
|
xs: "font-medium text-list-small",
|
|
364
367
|
small: "font-medium text-list-small",
|
|
365
368
|
medium: "font-medium",
|
|
369
|
+
mediumLarge: "font-medium",
|
|
366
370
|
large: "font-medium",
|
|
367
371
|
xl: "font-medium text-heading4 text-text",
|
|
368
372
|
};
|
|
@@ -88,7 +88,7 @@ const SegmentedControlItem = forwardRef(function SegmentedControlItem<
|
|
|
88
88
|
? "aria-checked:bg-secondary aria-checked:text-white"
|
|
89
89
|
: colorScheme === "primary"
|
|
90
90
|
? "aria-checked:bg-primary aria-checked:text-white"
|
|
91
|
-
: "aria-checked:bg-background aria-checked:text-text",
|
|
91
|
+
: "aria-checked:bg-segmented-control-item-active-background aria-checked:text-segmented-control-item-active-text",
|
|
92
92
|
"focus:z-interactable",
|
|
93
93
|
variant === "default"
|
|
94
94
|
? "px-1 rounded aria-checked:shadow-segment"
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
|
+
cssVarNames,
|
|
2
3
|
portalScopeProps,
|
|
3
4
|
usePortalScopeId,
|
|
4
5
|
} from "@noya-app/noya-designsystem";
|
|
@@ -6,7 +7,7 @@ import { Rect } from "@noya-app/noya-geometry";
|
|
|
6
7
|
import { useSize } from "@noya-app/react-utils";
|
|
7
8
|
import * as PopperPrimitive from "@radix-ui/react-popper";
|
|
8
9
|
import type { MeasurableElement } from "@radix-ui/utils";
|
|
9
|
-
import React, {
|
|
10
|
+
import React, { memo, useMemo } from "react";
|
|
10
11
|
import { createPortal } from "react-dom";
|
|
11
12
|
|
|
12
13
|
// Create a Measurable from a Rect
|
|
@@ -61,7 +62,8 @@ export const SelectionToolbarContainer = memo(
|
|
|
61
62
|
zIndex: 1000,
|
|
62
63
|
opacity: size ? 1 : 0,
|
|
63
64
|
transition: "opacity 0.2s ease-in-out",
|
|
64
|
-
[
|
|
65
|
+
[cssVarNames.colors.inputBackground]: "transparent",
|
|
66
|
+
[cssVarNames.colors.buttonBackground]: "transparent",
|
|
65
67
|
}}
|
|
66
68
|
>
|
|
67
69
|
<div
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import * as RadixSlider from "@radix-ui/react-slider";
|
|
2
2
|
import React, { FocusEventHandler, memo, useCallback, useMemo } from "react";
|
|
3
|
-
import { useLabel
|
|
3
|
+
import { useLabel } from "../hooks/useLabel";
|
|
4
4
|
import { cx } from "../utils/classNames";
|
|
5
|
-
import { getInsetEndStyles } from "../utils/inputs";
|
|
6
|
-
import { Label } from "./Label";
|
|
7
5
|
|
|
8
6
|
type ColorScheme = "primary" | "secondary";
|
|
9
7
|
|
|
@@ -29,8 +27,6 @@ const thumbStyle = {
|
|
|
29
27
|
width: THUMB_WIDTH,
|
|
30
28
|
};
|
|
31
29
|
|
|
32
|
-
const insetEndStyles = getInsetEndStyles();
|
|
33
|
-
|
|
34
30
|
export const Slider = memo(function Slider({
|
|
35
31
|
style,
|
|
36
32
|
className,
|
|
@@ -50,11 +46,9 @@ export const Slider = memo(function Slider({
|
|
|
50
46
|
[value, min, max]
|
|
51
47
|
);
|
|
52
48
|
|
|
53
|
-
const {
|
|
54
|
-
label: props.label,
|
|
49
|
+
const { fieldId: id } = useLabel({
|
|
55
50
|
fieldId: props.id,
|
|
56
51
|
});
|
|
57
|
-
const labelPosition = useLabelPosition();
|
|
58
52
|
|
|
59
53
|
const handleValueChange = useCallback(
|
|
60
54
|
(arrayValue: number[]) => {
|
|
@@ -63,31 +57,7 @@ export const Slider = memo(function Slider({
|
|
|
63
57
|
[onValueChange]
|
|
64
58
|
);
|
|
65
59
|
|
|
66
|
-
const
|
|
67
|
-
// Calculate the raw percentage (for label)
|
|
68
|
-
const rawPercent = (arrayValue[0] - min) / (max - min);
|
|
69
|
-
// Adjust the percentage to account for thumb width (for fill)
|
|
70
|
-
const adjustedPercent =
|
|
71
|
-
rawPercent * (100 - (THUMB_WIDTH * 100) / 300) + (THUMB_WIDTH * 50) / 300;
|
|
72
|
-
return {
|
|
73
|
-
raw: rawPercent * 100,
|
|
74
|
-
adjusted: adjustedPercent,
|
|
75
|
-
};
|
|
76
|
-
}, [arrayValue, min, max]);
|
|
77
|
-
|
|
78
|
-
const trackFillStyle = useMemo(
|
|
79
|
-
() => ({
|
|
80
|
-
clipPath: `inset(0 ${100 - percentage.adjusted}% 0 0)`,
|
|
81
|
-
}),
|
|
82
|
-
[percentage.adjusted]
|
|
83
|
-
);
|
|
84
|
-
|
|
85
|
-
const labelStyle = useMemo(
|
|
86
|
-
() => ({
|
|
87
|
-
clipPath: `inset(0 ${100 - percentage.raw}% 0 0)`,
|
|
88
|
-
}),
|
|
89
|
-
[percentage.raw]
|
|
90
|
-
);
|
|
60
|
+
const ratio = (arrayValue[0] - min) / (max - min);
|
|
91
61
|
|
|
92
62
|
return (
|
|
93
63
|
<RadixSlider.Root
|
|
@@ -98,7 +68,7 @@ export const Slider = memo(function Slider({
|
|
|
98
68
|
value={arrayValue}
|
|
99
69
|
onValueChange={handleValueChange}
|
|
100
70
|
className={cx(
|
|
101
|
-
"flex relative items-center select-none touch-none h-input-height rounded
|
|
71
|
+
"flex relative items-center select-none touch-none h-input-height rounded flex-grow max-h-input-height cursor-pointer",
|
|
102
72
|
className
|
|
103
73
|
)}
|
|
104
74
|
style={style}
|
|
@@ -106,34 +76,28 @@ export const Slider = memo(function Slider({
|
|
|
106
76
|
onBlur={onBlur}
|
|
107
77
|
disabled={readOnly}
|
|
108
78
|
>
|
|
109
|
-
<
|
|
110
|
-
{label && labelPosition === "inset" && (
|
|
111
|
-
<div className={insetEndStyles}>
|
|
112
|
-
<Label htmlFor={id} className="text-text-disabled">
|
|
113
|
-
{label}
|
|
114
|
-
</Label>
|
|
115
|
-
</div>
|
|
116
|
-
)}
|
|
79
|
+
<div className="relative flex-grow h-[3px] overflow-hidden">
|
|
117
80
|
<div
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
)}
|
|
81
|
+
className="absolute h-full rounded-l bg-primary"
|
|
82
|
+
style={{
|
|
83
|
+
left: 0,
|
|
84
|
+
width: `calc(${ratio * 100}% - ${ratio * 8}px - 2px)`,
|
|
85
|
+
}}
|
|
124
86
|
/>
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
{
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
87
|
+
<div
|
|
88
|
+
className="absolute h-full rounded-r bg-input-background"
|
|
89
|
+
style={{
|
|
90
|
+
right: 0,
|
|
91
|
+
width: `calc(100% - ${ratio * 100}% + ${ratio * 8}px - 10px)`,
|
|
92
|
+
}}
|
|
93
|
+
/>
|
|
94
|
+
</div>
|
|
133
95
|
<RadixSlider.Thumb
|
|
134
96
|
style={thumbStyle}
|
|
135
97
|
className={cx(
|
|
136
|
-
"block h-
|
|
98
|
+
"block h-[21px] rounded-sm bg-slider-thumb-background shadow-sliderThumb transition-colors focus:outline-primary focus:outline-2",
|
|
99
|
+
"cursor-ew-resize",
|
|
100
|
+
// "outline-none outline outline-2 outline-offset-[0px] outline-background",
|
|
137
101
|
colorScheme === undefined && "border-slider-border",
|
|
138
102
|
colorScheme === "primary" && "border-primary",
|
|
139
103
|
colorScheme === "secondary" && "border-secondary"
|
package/src/index.css
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
:root {
|
|
2
2
|
--n-primary-900: rgb(45, 25, 95); /* dark: --n-primary-pastel */
|
|
3
|
+
--n-primary-800: rgb(64, 39, 140);
|
|
4
|
+
--n-primary-700: rgb(95, 68, 190);
|
|
3
5
|
--n-primary-600: rgb(103, 70, 255); /* --n-primary */
|
|
4
6
|
--n-primary-500: rgb(119, 66, 255); /* dark: --n-primary */
|
|
5
7
|
--n-primary-400: rgb(147, 86, 255); /* --n-primary-light */
|
|
@@ -8,6 +10,7 @@
|
|
|
8
10
|
--n-primary-200: rgb(188, 160, 255);
|
|
9
11
|
--n-primary-150: rgb(225, 219, 255);
|
|
10
12
|
--n-primary-100: rgb(234, 230, 255); /* --n-primary-pastel */
|
|
13
|
+
--n-primary-50: rgb(243, 242, 255);
|
|
11
14
|
|
|
12
15
|
--n-indigo-950: rgb(18, 26, 37);
|
|
13
16
|
--n-indigo-900: rgb(30, 40, 60);
|
|
@@ -41,6 +44,7 @@
|
|
|
41
44
|
--n-secondary-light: rgb(0, 160, 129);
|
|
42
45
|
--n-secondary-pastel: rgb(205, 238, 231);
|
|
43
46
|
--n-secondary-bright: #0ab557;
|
|
47
|
+
--n-input-background: var(--n-indigo-100);
|
|
44
48
|
--n-input-background-light: rgb(243, 245, 249);
|
|
45
49
|
--n-code-background: rgb(250, 250, 250);
|
|
46
50
|
--n-code-background-dark: var(--n-indigo-950);
|
|
@@ -48,6 +52,12 @@
|
|
|
48
52
|
--n-breadcrumb-text: var(--n-indigo-500);
|
|
49
53
|
--n-breadcrumb-text-hover: var(--n-indigo-400);
|
|
50
54
|
--n-breadcrumb-icon: var(--n-indigo-300);
|
|
55
|
+
--n-button-background: var(--n-input-background);
|
|
56
|
+
--n-button-background-hover: var(--n-input-background-light);
|
|
57
|
+
--n-button-background-active: var(--n-primary-100);
|
|
58
|
+
--n-button-background-active-hover: var(--n-primary-50);
|
|
59
|
+
--n-button-text: var(--n-text);
|
|
60
|
+
--n-button-text-active: var(--n-primary);
|
|
51
61
|
--n-canvas-background: var(--n-indigo-25);
|
|
52
62
|
--n-canvas-grid: rgba(0, 0, 0, 0.05);
|
|
53
63
|
--n-sidebar-background: rgb(255, 255, 255);
|
|
@@ -55,7 +65,6 @@
|
|
|
55
65
|
--n-popover-divider: transparent;
|
|
56
66
|
--n-listview-raised-background: rgba(0, 0, 0, 0.03);
|
|
57
67
|
--n-listview-editing-background: #fff;
|
|
58
|
-
--n-input-background: var(--n-indigo-100);
|
|
59
68
|
--n-list-view-hover-background: rgb(244, 246, 250);
|
|
60
69
|
--n-list-view-thumbnail-background: var(--n-input-background);
|
|
61
70
|
--n-slider-thumb-background: white;
|
|
@@ -84,6 +93,8 @@
|
|
|
84
93
|
--n-icon-selected: rgb(220, 220, 220);
|
|
85
94
|
--n-warning: rgb(251, 211, 0);
|
|
86
95
|
--n-segmented-control-item: rgb(139, 139, 139);
|
|
96
|
+
--n-segmented-control-item-active-background: var(--n-background);
|
|
97
|
+
--n-segmented-control-item-active-text: var(--n-text);
|
|
87
98
|
--n-dot: rgba(0, 0, 0, 0.25);
|
|
88
99
|
--n-row-highlight: #3390ff10;
|
|
89
100
|
--n-table-row-background: var(--n-background);
|
|
@@ -125,6 +136,8 @@
|
|
|
125
136
|
|
|
126
137
|
[data-theme="dark"] {
|
|
127
138
|
--n-background: #111111;
|
|
139
|
+
--n-input-background: rgb(45 43 54);
|
|
140
|
+
--n-input-background-light: rgb(60 58 70);
|
|
128
141
|
--n-logo-fill: rgb(248, 248, 250);
|
|
129
142
|
--n-logo-highlight: rgb(248, 248, 250);
|
|
130
143
|
--n-text: rgb(248, 248, 250);
|
|
@@ -136,12 +149,17 @@
|
|
|
136
149
|
--n-divider-strong: rgba(0, 0, 0, 1);
|
|
137
150
|
--n-primary: var(--n-primary-500);
|
|
138
151
|
--n-primary-light: var(--n-primary-300);
|
|
152
|
+
--n-icon: var(--n-text-muted);
|
|
139
153
|
--n-selected-list-item-background: var(--n-primary-900);
|
|
140
|
-
--n-selected-list-item-text: var(--n-primary-
|
|
154
|
+
--n-selected-list-item-text: var(--n-primary-100);
|
|
141
155
|
--n-selected-list-item-icon-background: var(--n-primary-900);
|
|
156
|
+
--n-button-background: var(--n-input-background);
|
|
157
|
+
--n-button-background-hover: var(--n-input-background-light);
|
|
158
|
+
--n-button-background-active: var(--n-primary-900);
|
|
159
|
+
--n-button-background-active-hover: var(--n-primary-800);
|
|
160
|
+
--n-button-text: var(--n-text);
|
|
161
|
+
--n-button-text-active: var(--n-primary-100);
|
|
142
162
|
--n-secondary-bright: #36fe91;
|
|
143
|
-
--n-input-background: rgba(181, 178, 255, 0.08);
|
|
144
|
-
--n-input-background-light: rgba(181, 178, 255, 0.1);
|
|
145
163
|
--n-code-background: rgb(20, 19, 23);
|
|
146
164
|
--n-canvas-background: rgb(20, 19, 23);
|
|
147
165
|
--n-canvas-grid: rgba(0, 0, 0, 0.1);
|
|
@@ -154,6 +172,8 @@
|
|
|
154
172
|
--n-list-view-thumbnail-background: var(--n-input-background);
|
|
155
173
|
--n-slider-thumb-background: var(--n-input-background-light);
|
|
156
174
|
--n-slider-border: var(--n-divider);
|
|
175
|
+
--n-segmented-control-item-active-text: var(--n-text);
|
|
176
|
+
--n-segmented-control-item-active-background: var(--n-input-background-light);
|
|
157
177
|
--n-mask: rgb(102, 187, 106);
|
|
158
178
|
--n-transparent-checker: rgba(255, 255, 255, 0.3);
|
|
159
179
|
--n-scrollbar: rgba(199, 199, 199, 0.2);
|