@lattice-php/lattice 0.25.0 → 0.26.0
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/dist/action/components/action-form.js +1 -1
- package/dist/action/components/action-form.js.map +1 -1
- package/dist/action/components/action-group.js +1 -1
- package/dist/action/components/action-group.js.map +1 -1
- package/dist/action/components/action.js +3 -2
- package/dist/action/components/action.js.map +1 -1
- package/dist/action/hooks/use-action.js +2 -1
- package/dist/action/hooks/use-action.js.map +1 -1
- package/dist/appearance/index.d.ts +1 -1
- package/dist/appearance/index.js +8 -8
- package/dist/appearance/index.js.map +1 -1
- package/dist/chat/components/prompt-input.js +1 -2
- package/dist/chat/components/prompt-input.js.map +1 -1
- package/dist/create-app.js +2 -2
- package/dist/create-app.js.map +1 -1
- package/dist/form/components/base/submit-button.d.ts +4 -3
- package/dist/form/components/base/submit-button.js +2 -1
- package/dist/form/components/base/submit-button.js.map +1 -1
- package/dist/form/components/fields/date-picker-field.js +3 -3
- package/dist/form/components/fields/date-picker-field.js.map +1 -1
- package/dist/form/components/fields/number-input.js +1 -1
- package/dist/form/components/fields/number-input.js.map +1 -1
- package/dist/form/components/fields/rich-editor-field.js +1 -1
- package/dist/form/components/fields/rich-editor-field.js.map +1 -1
- package/dist/form/components/fields/row-action-menu.js +3 -3
- package/dist/form/components/fields/row-action-menu.js.map +1 -1
- package/dist/form/components/fields/row-actions.d.ts +1 -1
- package/dist/form/components/fields/row-actions.js +4 -4
- package/dist/form/components/fields/row-actions.js.map +1 -1
- package/dist/form/components/fields/toggle.js +1 -1
- package/dist/form/components/fields/toggle.js.map +1 -1
- package/dist/form/components/form.js +7 -3
- package/dist/form/components/form.js.map +1 -1
- package/dist/form/components/wizard.js +1 -1
- package/dist/form/components/wizard.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/lattice.css +183 -115
- package/dist/notifications/components/notification-item.js +3 -1
- package/dist/notifications/components/notification-item.js.map +1 -1
- package/dist/notifications/components/notifications.js +2 -4
- package/dist/notifications/components/notifications.js.map +1 -1
- package/dist/table/components/bulk-bar.js +2 -0
- package/dist/table/components/bulk-bar.js.map +1 -1
- package/dist/table/components/cells/badge-cell.js +3 -6
- package/dist/table/components/cells/badge-cell.js.map +1 -1
- package/dist/table/components/cells/text-cell.js +6 -9
- package/dist/table/components/cells/text-cell.js.map +1 -1
- package/dist/table/components/column-filter-control.js +2 -2
- package/dist/table/components/column-filter-control.js.map +1 -1
- package/dist/table/components/filter-bar.js +1 -1
- package/dist/table/components/filter-bar.js.map +1 -1
- package/dist/table/components/pagination.js +6 -6
- package/dist/table/components/pagination.js.map +1 -1
- package/dist/table/lib/bulk.d.ts +3 -2
- package/dist/table/lib/bulk.js +2 -1
- package/dist/table/lib/bulk.js.map +1 -1
- package/dist/toast/toast.js +3 -1
- package/dist/toast/toast.js.map +1 -1
- package/dist/toast/variant-styles.js +15 -1
- package/dist/toast/variant-styles.js.map +1 -1
- package/dist/types/generated.d.ts +14 -9
- package/dist/ui/action-menu-context.d.ts +1 -1
- package/dist/ui/action-menu-context.js +1 -1
- package/dist/ui/action-menu-context.js.map +1 -1
- package/dist/ui/affix-group.js +1 -1
- package/dist/ui/affix-group.js.map +1 -1
- package/dist/ui/badge.d.ts +4 -7
- package/dist/ui/badge.js +11 -17
- package/dist/ui/badge.js.map +1 -1
- package/dist/ui/button.d.ts +6 -5
- package/dist/ui/button.js +154 -15
- package/dist/ui/button.js.map +1 -1
- package/dist/ui/chart-view.js +9 -7
- package/dist/ui/chart-view.js.map +1 -1
- package/dist/ui/checkbox.js +1 -1
- package/dist/ui/checkbox.js.map +1 -1
- package/dist/ui/confirm-dialog.d.ts +4 -3
- package/dist/ui/confirm-dialog.js +3 -2
- package/dist/ui/confirm-dialog.js.map +1 -1
- package/dist/ui/control.d.ts +1 -1
- package/dist/ui/control.js +1 -1
- package/dist/ui/control.js.map +1 -1
- package/dist/ui/dialog.js +1 -1
- package/dist/ui/dialog.js.map +1 -1
- package/dist/ui/dropdown-menu.d.ts +2 -2
- package/dist/ui/dropdown-menu.js +2 -2
- package/dist/ui/dropdown-menu.js.map +1 -1
- package/dist/ui/icon-button.d.ts +3 -3
- package/dist/ui/icon-button.js +6 -6
- package/dist/ui/icon-button.js.map +1 -1
- package/dist/ui/image-preview.js +1 -1
- package/dist/ui/image-preview.js.map +1 -1
- package/dist/ui/index.d.ts +2 -2
- package/dist/ui/index.js +2 -2
- package/dist/ui/info-tooltip.js +1 -1
- package/dist/ui/info-tooltip.js.map +1 -1
- package/dist/ui/input-otp.js +1 -1
- package/dist/ui/input-otp.js.map +1 -1
- package/dist/ui/label.js +1 -1
- package/dist/ui/label.js.map +1 -1
- package/dist/ui/password-input.js +1 -1
- package/dist/ui/password-input.js.map +1 -1
- package/dist/ui/progress.js +2 -2
- package/dist/ui/progress.js.map +1 -1
- package/dist/ui/text.js +1 -1
- package/dist/ui/tooltip.js +1 -1
- package/dist/ui/tooltip.js.map +1 -1
- package/dist-standalone/chunks/{chart-view-DEwGTt9d.js → chart-view-8xEKTUJV.js} +1 -1
- package/dist-standalone/chunks/{date-picker-field-CCQ9nWx0.js → date-picker-field-cdhxtVSG.js} +1 -1
- package/dist-standalone/chunks/{rich-editor-field-B9Nv1qia.js → rich-editor-field-47ov3Bny.js} +1 -1
- package/dist-standalone/lattice.css +1 -1
- package/dist-standalone/lattice.js +6 -6
- package/dist-standalone/manifest.json +5 -5
- package/package.json +1 -1
package/dist/ui/badge.js
CHANGED
|
@@ -1,31 +1,25 @@
|
|
|
1
1
|
import { cn } from "../lib/utils.js";
|
|
2
|
+
import { coerceColor, namedColor, toneProps } from "../lib/color.js";
|
|
2
3
|
import "react";
|
|
3
4
|
import { jsx } from "react/jsx-runtime";
|
|
4
|
-
import { Slot } from "@radix-ui/react-slot";
|
|
5
|
-
import { cva } from "class-variance-authority";
|
|
6
5
|
//#region resources/js/ui/badge.tsx
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
secondary: "border-transparent bg-lt-secondary text-lt-secondary-fg [a&]:hover:bg-lt-secondary-hover",
|
|
11
|
-
destructive: "border-transparent bg-lt-danger text-lt-danger-fg [a&]:hover:bg-lt-danger-hover focus-visible:ring-lt-danger/20 dark:focus-visible:ring-lt-danger/40 dark:bg-lt-danger/60",
|
|
12
|
-
outline: "border-lt-border text-lt-fg [a&]:hover:bg-lt-accent [a&]:hover:text-lt-accent-fg"
|
|
13
|
-
} },
|
|
14
|
-
defaultVariants: { variant: "default" }
|
|
15
|
-
});
|
|
16
|
-
function Badge({ className, variant, asChild = false, ...props }) {
|
|
17
|
-
return /* @__PURE__ */ jsx(asChild ? Slot : "span", {
|
|
6
|
+
function Badge({ color, className, style, ...props }) {
|
|
7
|
+
const tone = toneProps(coerceColor(color ?? void 0) ?? namedColor("gray"));
|
|
8
|
+
return /* @__PURE__ */ jsx("span", {
|
|
18
9
|
"data-slot": "badge",
|
|
19
|
-
className: cn(
|
|
10
|
+
className: cn("lt-badge", tone.className, className),
|
|
11
|
+
style: {
|
|
12
|
+
...tone.style,
|
|
13
|
+
...style
|
|
14
|
+
},
|
|
20
15
|
...props
|
|
21
16
|
});
|
|
22
17
|
}
|
|
23
18
|
var BadgeComponent = ({ node }) => /* @__PURE__ */ jsx(Badge, {
|
|
24
|
-
|
|
25
|
-
className: "w-fit px-3 py-1",
|
|
19
|
+
color: node.props.color,
|
|
26
20
|
children: node.props.label
|
|
27
21
|
});
|
|
28
22
|
//#endregion
|
|
29
|
-
export { Badge,
|
|
23
|
+
export { Badge, BadgeComponent as default };
|
|
30
24
|
|
|
31
25
|
//# sourceMappingURL=badge.js.map
|
package/dist/ui/badge.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"badge.js","names":[],"sources":["../../resources/js/ui/badge.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"badge.js","names":[],"sources":["../../resources/js/ui/badge.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { coerceColor, namedColor, toneProps } from \"@lattice-php/lattice/lib/color\";\nimport type { Color } from \"@lattice-php/lattice/types/generated\";\nimport type { RendererComponent } from \"@lattice-php/lattice/core/types\";\n\nfunction Badge({\n color,\n className,\n style,\n ...props\n}: Omit<React.ComponentProps<\"span\">, \"color\"> & { color?: Color | string | null }) {\n const tone = toneProps(coerceColor(color ?? undefined) ?? namedColor(\"gray\"));\n\n return (\n <span\n data-slot=\"badge\"\n className={cn(\"lt-badge\", tone.className, className)}\n style={{ ...tone.style, ...style }}\n {...props}\n />\n );\n}\n\nconst BadgeComponent: RendererComponent<\"badge\"> = ({ node }) => (\n <Badge color={node.props.color}>{node.props.label}</Badge>\n);\n\nexport default BadgeComponent;\nexport { Badge };\n"],"mappings":";;;;;AAMA,SAAS,MAAM,EACb,OACA,WACA,OACA,GAAG,SAC+E;CAClF,MAAM,OAAO,UAAU,YAAY,SAAS,KAAA,CAAS,KAAK,WAAW,MAAM,CAAC;CAE5E,OACE,oBAAC,QAAD;EACE,aAAU;EACV,WAAW,GAAG,YAAY,KAAK,WAAW,SAAS;EACnD,OAAO;GAAE,GAAG,KAAK;GAAO,GAAG;EAAM;EACjC,GAAI;CACL,CAAA;AAEL;AAEA,IAAM,kBAA8C,EAAE,WACpD,oBAAC,OAAD;CAAO,OAAO,KAAK,MAAM;WAAQ,KAAK,MAAM;AAAa,CAAA"}
|
package/dist/ui/button.d.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { VariantProps } from 'class-variance-authority';
|
|
2
2
|
import { RendererComponent } from '../core/types.js';
|
|
3
|
-
import {
|
|
3
|
+
import { Emphasis, Variant } from '../types/generated.js';
|
|
4
4
|
import * as React from "react";
|
|
5
|
-
export type {
|
|
5
|
+
export type { Emphasis, Variant };
|
|
6
6
|
declare const buttonVariants: (props?: ({
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
emphasis?: "link" | "solid" | "outline" | "ghost" | null | undefined;
|
|
8
|
+
variant?: "primary" | "secondary" | "success" | "info" | "warning" | "danger" | null | undefined;
|
|
9
|
+
size?: "sm" | "md" | "lg" | "icon" | null | undefined;
|
|
9
10
|
} & import('class-variance-authority/types').ClassProp) | undefined) => string;
|
|
10
|
-
declare function Button({ className, variant, size, asChild, icon, children, ...props }: React.ComponentProps<"button"> & VariantProps<typeof buttonVariants> & {
|
|
11
|
+
declare function Button({ className, variant, emphasis, size, asChild, icon, children, ...props }: React.ComponentProps<"button"> & VariantProps<typeof buttonVariants> & {
|
|
11
12
|
asChild?: boolean;
|
|
12
13
|
/** Leading icon glyph. Ignored with `asChild` (Slot needs a single child). */
|
|
13
14
|
icon?: string;
|
package/dist/ui/button.js
CHANGED
|
@@ -9,31 +9,165 @@ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
|
9
9
|
import { Slot } from "@radix-ui/react-slot";
|
|
10
10
|
import { cva } from "class-variance-authority";
|
|
11
11
|
//#region resources/js/ui/button.tsx
|
|
12
|
-
var buttonVariants = cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lt-sm text-base font-medium transition-[color,box-shadow] disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-lt-icon-md [&_svg]:shrink-0 outline-none focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 focus-visible:ring-[
|
|
12
|
+
var buttonVariants = cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lt-sm text-base font-medium transition-[color,box-shadow] disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-lt-icon-md [&_svg]:shrink-0 outline-none focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 focus-visible:ring-[length:var(--lt-ring-width)] aria-invalid:ring-lt-danger/20 dark:aria-invalid:ring-lt-danger/40 aria-invalid:border-lt-danger", {
|
|
13
13
|
variants: {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
destructive: "bg-lt-danger text-lt-danger-fg shadow-lt-xs hover:bg-lt-danger-hover active:bg-lt-danger-active focus-visible:ring-lt-danger/20 dark:focus-visible:ring-lt-danger/40 disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:shadow-none",
|
|
17
|
-
success: "bg-lt-success text-lt-success-fg shadow-lt-xs hover:bg-lt-success-hover active:bg-lt-success-active disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:shadow-none",
|
|
18
|
-
info: "bg-lt-info text-lt-info-fg shadow-lt-xs hover:bg-lt-info-hover active:bg-lt-info-active disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:shadow-none",
|
|
14
|
+
emphasis: {
|
|
15
|
+
solid: "shadow-lt-xs disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:shadow-none",
|
|
19
16
|
outline: "border border-lt-input bg-lt-bg shadow-lt-xs hover:bg-lt-accent hover:text-lt-accent-fg disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:border-transparent disabled:shadow-none",
|
|
20
|
-
secondary: "bg-lt-secondary text-lt-secondary-fg shadow-lt-xs hover:bg-lt-secondary-hover active:bg-lt-secondary-active disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:shadow-none",
|
|
21
17
|
ghost: "hover:bg-lt-accent hover:text-lt-accent-fg disabled:text-lt-disabled-fg",
|
|
22
|
-
link: "
|
|
18
|
+
link: "underline-offset-4 hover:underline disabled:text-lt-disabled-fg disabled:no-underline"
|
|
19
|
+
},
|
|
20
|
+
variant: {
|
|
21
|
+
primary: "",
|
|
22
|
+
secondary: "",
|
|
23
|
+
success: "",
|
|
24
|
+
info: "",
|
|
25
|
+
warning: "",
|
|
26
|
+
danger: ""
|
|
23
27
|
},
|
|
24
28
|
size: {
|
|
25
|
-
|
|
29
|
+
md: "h-lt-control-md px-4 py-2 has-[>svg]:px-3",
|
|
26
30
|
sm: "h-lt-control-sm rounded-lt-sm px-3 has-[>svg]:px-2.5",
|
|
27
31
|
lg: "h-lt-control-lg rounded-lt-sm px-6 has-[>svg]:px-4",
|
|
28
32
|
icon: "size-lt-control-md"
|
|
29
33
|
}
|
|
30
34
|
},
|
|
35
|
+
compoundVariants: [
|
|
36
|
+
{
|
|
37
|
+
emphasis: "solid",
|
|
38
|
+
variant: "primary",
|
|
39
|
+
class: "bg-lt-primary text-lt-primary-fg hover:bg-lt-primary-hover active:bg-lt-primary-active"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
emphasis: "solid",
|
|
43
|
+
variant: "secondary",
|
|
44
|
+
class: "bg-lt-secondary text-lt-secondary-fg hover:bg-lt-secondary-hover active:bg-lt-secondary-active"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
emphasis: "solid",
|
|
48
|
+
variant: "success",
|
|
49
|
+
class: "bg-lt-success text-lt-success-fg hover:bg-lt-success-hover active:bg-lt-success-active"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
emphasis: "solid",
|
|
53
|
+
variant: "info",
|
|
54
|
+
class: "bg-lt-info text-lt-info-fg hover:bg-lt-info-hover active:bg-lt-info-active"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
emphasis: "solid",
|
|
58
|
+
variant: "warning",
|
|
59
|
+
class: "bg-lt-warning text-lt-warning-fg hover:bg-lt-warning-hover active:bg-lt-warning-active"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
emphasis: "solid",
|
|
63
|
+
variant: "danger",
|
|
64
|
+
class: "bg-lt-danger text-lt-danger-fg hover:bg-lt-danger-hover active:bg-lt-danger-active focus-visible:ring-lt-danger/20 dark:focus-visible:ring-lt-danger/40"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
emphasis: "outline",
|
|
68
|
+
variant: "primary",
|
|
69
|
+
class: "border-lt-primary/40 text-lt-primary hover:bg-lt-primary/10 hover:text-lt-primary"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
emphasis: "outline",
|
|
73
|
+
variant: "secondary",
|
|
74
|
+
class: "border-lt-secondary text-lt-secondary-fg hover:bg-lt-secondary hover:text-lt-secondary-fg"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
emphasis: "outline",
|
|
78
|
+
variant: "success",
|
|
79
|
+
class: "border-lt-success/40 text-lt-success hover:bg-lt-success/10 hover:text-lt-success"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
emphasis: "outline",
|
|
83
|
+
variant: "info",
|
|
84
|
+
class: "border-lt-info/40 text-lt-info hover:bg-lt-info/10 hover:text-lt-info"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
emphasis: "outline",
|
|
88
|
+
variant: "warning",
|
|
89
|
+
class: "border-lt-warning/40 text-lt-warning hover:bg-lt-warning/10 hover:text-lt-warning"
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
emphasis: "outline",
|
|
93
|
+
variant: "danger",
|
|
94
|
+
class: "border-lt-danger/40 text-lt-danger hover:bg-lt-danger/10 hover:text-lt-danger"
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
emphasis: "ghost",
|
|
98
|
+
variant: "primary",
|
|
99
|
+
class: "text-lt-primary hover:bg-lt-primary/10 hover:text-lt-primary"
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
emphasis: "ghost",
|
|
103
|
+
variant: "secondary",
|
|
104
|
+
class: "text-lt-secondary-fg hover:bg-lt-secondary hover:text-lt-secondary-fg"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
emphasis: "ghost",
|
|
108
|
+
variant: "success",
|
|
109
|
+
class: "text-lt-success hover:bg-lt-success/10 hover:text-lt-success"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
emphasis: "ghost",
|
|
113
|
+
variant: "info",
|
|
114
|
+
class: "text-lt-info hover:bg-lt-info/10 hover:text-lt-info"
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
emphasis: "ghost",
|
|
118
|
+
variant: "warning",
|
|
119
|
+
class: "text-lt-warning hover:bg-lt-warning/10 hover:text-lt-warning"
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
emphasis: "ghost",
|
|
123
|
+
variant: "danger",
|
|
124
|
+
class: "text-lt-danger hover:bg-lt-danger/10 hover:text-lt-danger"
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
emphasis: "link",
|
|
128
|
+
variant: "primary",
|
|
129
|
+
class: "text-lt-primary"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
emphasis: "link",
|
|
133
|
+
variant: "secondary",
|
|
134
|
+
class: "text-lt-secondary-fg"
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
emphasis: "link",
|
|
138
|
+
variant: "success",
|
|
139
|
+
class: "text-lt-success"
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
emphasis: "link",
|
|
143
|
+
variant: "info",
|
|
144
|
+
class: "text-lt-info"
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
emphasis: "link",
|
|
148
|
+
variant: "warning",
|
|
149
|
+
class: "text-lt-warning"
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
emphasis: "link",
|
|
153
|
+
variant: "danger",
|
|
154
|
+
class: "text-lt-danger"
|
|
155
|
+
}
|
|
156
|
+
],
|
|
31
157
|
defaultVariants: {
|
|
32
|
-
|
|
33
|
-
size: "
|
|
158
|
+
emphasis: "solid",
|
|
159
|
+
size: "md"
|
|
34
160
|
}
|
|
35
161
|
});
|
|
36
|
-
|
|
162
|
+
/**
|
|
163
|
+
* Solid and link buttons read as primary when no variant is given; outline and
|
|
164
|
+
* ghost stay neutral so chrome buttons do not turn teal by default.
|
|
165
|
+
*/
|
|
166
|
+
function resolveButtonVariant(emphasis, variant) {
|
|
167
|
+
if (variant) return variant;
|
|
168
|
+
return (emphasis ?? "solid") === "solid" || emphasis === "link" ? "primary" : void 0;
|
|
169
|
+
}
|
|
170
|
+
function Button({ className, variant, emphasis, size, asChild = false, icon, children, ...props }) {
|
|
37
171
|
const Comp = asChild ? Slot : "button";
|
|
38
172
|
const content = icon && !asChild ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Icon, {
|
|
39
173
|
name: icon,
|
|
@@ -42,7 +176,8 @@ function Button({ className, variant, size, asChild = false, icon, children, ...
|
|
|
42
176
|
return /* @__PURE__ */ jsx(Comp, {
|
|
43
177
|
"data-slot": "button",
|
|
44
178
|
className: cn(buttonVariants({
|
|
45
|
-
|
|
179
|
+
emphasis,
|
|
180
|
+
variant: resolveButtonVariant(emphasis, variant),
|
|
46
181
|
size,
|
|
47
182
|
className
|
|
48
183
|
})),
|
|
@@ -52,10 +187,11 @@ function Button({ className, variant, size, asChild = false, icon, children, ...
|
|
|
52
187
|
}
|
|
53
188
|
var ButtonComponent = ({ node }) => {
|
|
54
189
|
const { label, icon } = node.props;
|
|
55
|
-
const variant = node.props.variant ??
|
|
190
|
+
const variant = node.props.variant ?? null;
|
|
191
|
+
const emphasis = node.props.emphasis ?? "solid";
|
|
56
192
|
const testId = nodeIdentity(node);
|
|
57
193
|
const behavior = useClickBehavior(node.props);
|
|
58
|
-
const size = icon ? "icon" : "
|
|
194
|
+
const size = icon ? "icon" : "md";
|
|
59
195
|
const content = icon ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(IconRenderer, {
|
|
60
196
|
className: "size-lt-icon-md",
|
|
61
197
|
icon
|
|
@@ -66,6 +202,7 @@ var ButtonComponent = ({ node }) => {
|
|
|
66
202
|
const triggerButton = ({ onClick, processing }) => /* @__PURE__ */ jsx(Button, {
|
|
67
203
|
"data-test": testId,
|
|
68
204
|
disabled: processing,
|
|
205
|
+
emphasis,
|
|
69
206
|
onClick,
|
|
70
207
|
size,
|
|
71
208
|
variant,
|
|
@@ -74,6 +211,7 @@ var ButtonComponent = ({ node }) => {
|
|
|
74
211
|
if (behavior.kind === "navigate") return /* @__PURE__ */ jsx(Button, {
|
|
75
212
|
asChild: true,
|
|
76
213
|
"data-test": testId,
|
|
214
|
+
emphasis,
|
|
77
215
|
variant,
|
|
78
216
|
size,
|
|
79
217
|
children: /* @__PURE__ */ jsx(Link, {
|
|
@@ -92,6 +230,7 @@ var ButtonComponent = ({ node }) => {
|
|
|
92
230
|
});
|
|
93
231
|
return /* @__PURE__ */ jsx(Button, {
|
|
94
232
|
"data-test": testId,
|
|
233
|
+
emphasis,
|
|
95
234
|
size,
|
|
96
235
|
type: node.props.buttonType,
|
|
97
236
|
variant,
|
package/dist/ui/button.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"button.js","names":[],"sources":["../../resources/js/ui/button.tsx"],"sourcesContent":["import { Link } from \"@inertiajs/react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { Icon, IconRenderer } from \"@lattice-php/lattice/icons\";\nimport { nodeIdentity } from \"@lattice-php/lattice/core/test-id\";\nimport type { RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport { ActionTrigger, type TriggerState, useClickBehavior } from \"./click-behavior\";\nimport type { ButtonVariant } from \"@lattice-php/lattice/types/generated\";\n\nexport type { ButtonVariant };\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lt-sm text-base font-medium transition-[color,box-shadow] disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-lt-icon-md [&_svg]:shrink-0 outline-none focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 focus-visible:ring-[3px] aria-invalid:ring-lt-danger/20 dark:aria-invalid:ring-lt-danger/40 aria-invalid:border-lt-danger\",\n {\n variants: {\n variant: {\n default:\n \"bg-lt-primary text-lt-primary-fg shadow-lt-xs hover:bg-lt-primary-hover active:bg-lt-primary-active disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:shadow-none\",\n destructive:\n \"bg-lt-danger text-lt-danger-fg shadow-lt-xs hover:bg-lt-danger-hover active:bg-lt-danger-active focus-visible:ring-lt-danger/20 dark:focus-visible:ring-lt-danger/40 disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:shadow-none\",\n success:\n \"bg-lt-success text-lt-success-fg shadow-lt-xs hover:bg-lt-success-hover active:bg-lt-success-active disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:shadow-none\",\n info: \"bg-lt-info text-lt-info-fg shadow-lt-xs hover:bg-lt-info-hover active:bg-lt-info-active disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:shadow-none\",\n outline:\n \"border border-lt-input bg-lt-bg shadow-lt-xs hover:bg-lt-accent hover:text-lt-accent-fg disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:border-transparent disabled:shadow-none\",\n secondary:\n \"bg-lt-secondary text-lt-secondary-fg shadow-lt-xs hover:bg-lt-secondary-hover active:bg-lt-secondary-active disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:shadow-none\",\n ghost: \"hover:bg-lt-accent hover:text-lt-accent-fg disabled:text-lt-disabled-fg\",\n link: \"text-lt-primary underline-offset-4 hover:underline disabled:text-lt-disabled-fg disabled:no-underline\",\n },\n size: {\n default: \"h-lt-control-md px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-lt-control-sm rounded-lt-sm px-3 has-[>svg]:px-2.5\",\n lg: \"h-lt-control-lg rounded-lt-sm px-6 has-[>svg]:px-4\",\n icon: \"size-lt-control-md\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n icon,\n children,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n /** Leading icon glyph. Ignored with `asChild` (Slot needs a single child). */\n icon?: string;\n }) {\n const Comp = asChild ? Slot : \"button\";\n const content =\n icon && !asChild ? (\n <>\n <Icon name={icon} aria-hidden=\"true\" />\n {children}\n </>\n ) : (\n children\n );\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n >\n {content}\n </Comp>\n );\n}\n\nconst ButtonComponent: RendererComponent<\"button\"> = ({ node }) => {\n const { label, icon } = node.props;\n const variant = node.props.variant ?? \"default\";\n const testId = nodeIdentity(node);\n const behavior = useClickBehavior(node.props);\n const size = icon ? \"icon\" : \"default\";\n const content = icon ? (\n <>\n <IconRenderer className=\"size-lt-icon-md\" icon={icon} />\n {label ? <span className=\"sr-only\">{label}</span> : null}\n </>\n ) : (\n label\n );\n\n const triggerButton = ({ onClick, processing }: TriggerState) => (\n <Button\n data-test={testId}\n disabled={processing}\n onClick={onClick}\n size={size}\n variant={variant}\n >\n {content}\n </Button>\n );\n\n if (behavior.kind === \"navigate\") {\n return (\n <Button asChild data-test={testId} variant={variant} size={size}>\n <Link href={behavior.href} method={behavior.method}>\n {content}\n </Link>\n </Button>\n );\n }\n\n if (behavior.kind === \"action\") {\n return <ActionTrigger action={behavior.action}>{triggerButton}</ActionTrigger>;\n }\n\n if (behavior.kind === \"effects\") {\n return triggerButton({ onClick: behavior.onClick, processing: false });\n }\n\n return (\n <Button data-test={testId} size={size} type={node.props.buttonType} variant={variant}>\n {content}\n </Button>\n );\n};\n\nexport default ButtonComponent;\nexport { Button, buttonVariants };\n"],"mappings":";;;;;;;;;;;AAaA,IAAM,iBAAiB,IACrB,+bACA;CACE,UAAU;EACR,SAAS;GACP,SACE;GACF,aACE;GACF,SACE;GACF,MAAM;GACN,SACE;GACF,WACE;GACF,OAAO;GACP,MAAM;EACR;EACA,MAAM;GACJ,SAAS;GACT,IAAI;GACJ,IAAI;GACJ,MAAM;EACR;CACF;CACA,iBAAiB;EACf,SAAS;EACT,MAAM;CACR;AACF,CACF;AAEA,SAAS,OAAO,EACd,WACA,SACA,MACA,UAAU,OACV,MACA,UACA,GAAG,SAMA;CACH,MAAM,OAAO,UAAU,OAAO;CAC9B,MAAM,UACJ,QAAQ,CAAC,UACP,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,MAAD;EAAM,MAAM;EAAM,eAAY;CAAQ,CAAA,GACrC,QACD,EAAA,CAAA,IAEF;CAGJ,OACE,oBAAC,MAAD;EACE,aAAU;EACV,WAAW,GAAG,eAAe;GAAE;GAAS;GAAM;EAAU,CAAC,CAAC;EAC1D,GAAI;YAEH;CACG,CAAA;AAEV;AAEA,IAAM,mBAAgD,EAAE,WAAW;CACjE,MAAM,EAAE,OAAO,SAAS,KAAK;CAC7B,MAAM,UAAU,KAAK,MAAM,WAAW;CACtC,MAAM,SAAS,aAAa,IAAI;CAChC,MAAM,WAAW,iBAAiB,KAAK,KAAK;CAC5C,MAAM,OAAO,OAAO,SAAS;CAC7B,MAAM,UAAU,OACd,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,cAAD;EAAc,WAAU;EAAwB;CAAO,CAAA,GACtD,QAAQ,oBAAC,QAAD;EAAM,WAAU;YAAW;CAAY,CAAA,IAAI,IACpD,EAAA,CAAA,IAEF;CAGF,MAAM,iBAAiB,EAAE,SAAS,iBAChC,oBAAC,QAAD;EACE,aAAW;EACX,UAAU;EACD;EACH;EACG;YAER;CACK,CAAA;CAGV,IAAI,SAAS,SAAS,YACpB,OACE,oBAAC,QAAD;EAAQ,SAAA;EAAQ,aAAW;EAAiB;EAAe;YACzD,oBAAC,MAAD;GAAM,MAAM,SAAS;GAAM,QAAQ,SAAS;aACzC;EACG,CAAA;CACA,CAAA;CAIZ,IAAI,SAAS,SAAS,UACpB,OAAO,oBAAC,eAAD;EAAe,QAAQ,SAAS;YAAS;CAA6B,CAAA;CAG/E,IAAI,SAAS,SAAS,WACpB,OAAO,cAAc;EAAE,SAAS,SAAS;EAAS,YAAY;CAAM,CAAC;CAGvE,OACE,oBAAC,QAAD;EAAQ,aAAW;EAAc;EAAM,MAAM,KAAK,MAAM;EAAqB;YAC1E;CACK,CAAA;AAEZ"}
|
|
1
|
+
{"version":3,"file":"button.js","names":[],"sources":["../../resources/js/ui/button.tsx"],"sourcesContent":["import { Link } from \"@inertiajs/react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { Icon, IconRenderer } from \"@lattice-php/lattice/icons\";\nimport { nodeIdentity } from \"@lattice-php/lattice/core/test-id\";\nimport type { RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport { ActionTrigger, type TriggerState, useClickBehavior } from \"./click-behavior\";\nimport type { Emphasis, Variant } from \"@lattice-php/lattice/types/generated\";\n\nexport type { Emphasis, Variant };\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lt-sm text-base font-medium transition-[color,box-shadow] disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-lt-icon-md [&_svg]:shrink-0 outline-none focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 focus-visible:ring-[length:var(--lt-ring-width)] aria-invalid:ring-lt-danger/20 dark:aria-invalid:ring-lt-danger/40 aria-invalid:border-lt-danger\",\n {\n variants: {\n emphasis: {\n solid:\n \"shadow-lt-xs disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:shadow-none\",\n outline:\n \"border border-lt-input bg-lt-bg shadow-lt-xs hover:bg-lt-accent hover:text-lt-accent-fg disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:border-transparent disabled:shadow-none\",\n ghost: \"hover:bg-lt-accent hover:text-lt-accent-fg disabled:text-lt-disabled-fg\",\n link: \"underline-offset-4 hover:underline disabled:text-lt-disabled-fg disabled:no-underline\",\n },\n variant: {\n primary: \"\",\n secondary: \"\",\n success: \"\",\n info: \"\",\n warning: \"\",\n danger: \"\",\n },\n size: {\n md: \"h-lt-control-md px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-lt-control-sm rounded-lt-sm px-3 has-[>svg]:px-2.5\",\n lg: \"h-lt-control-lg rounded-lt-sm px-6 has-[>svg]:px-4\",\n icon: \"size-lt-control-md\",\n },\n },\n compoundVariants: [\n {\n emphasis: \"solid\",\n variant: \"primary\",\n class:\n \"bg-lt-primary text-lt-primary-fg hover:bg-lt-primary-hover active:bg-lt-primary-active\",\n },\n {\n emphasis: \"solid\",\n variant: \"secondary\",\n class:\n \"bg-lt-secondary text-lt-secondary-fg hover:bg-lt-secondary-hover active:bg-lt-secondary-active\",\n },\n {\n emphasis: \"solid\",\n variant: \"success\",\n class:\n \"bg-lt-success text-lt-success-fg hover:bg-lt-success-hover active:bg-lt-success-active\",\n },\n {\n emphasis: \"solid\",\n variant: \"info\",\n class: \"bg-lt-info text-lt-info-fg hover:bg-lt-info-hover active:bg-lt-info-active\",\n },\n {\n emphasis: \"solid\",\n variant: \"warning\",\n class:\n \"bg-lt-warning text-lt-warning-fg hover:bg-lt-warning-hover active:bg-lt-warning-active\",\n },\n {\n emphasis: \"solid\",\n variant: \"danger\",\n class:\n \"bg-lt-danger text-lt-danger-fg hover:bg-lt-danger-hover active:bg-lt-danger-active focus-visible:ring-lt-danger/20 dark:focus-visible:ring-lt-danger/40\",\n },\n {\n emphasis: \"outline\",\n variant: \"primary\",\n class: \"border-lt-primary/40 text-lt-primary hover:bg-lt-primary/10 hover:text-lt-primary\",\n },\n {\n emphasis: \"outline\",\n variant: \"secondary\",\n class:\n \"border-lt-secondary text-lt-secondary-fg hover:bg-lt-secondary hover:text-lt-secondary-fg\",\n },\n {\n emphasis: \"outline\",\n variant: \"success\",\n class: \"border-lt-success/40 text-lt-success hover:bg-lt-success/10 hover:text-lt-success\",\n },\n {\n emphasis: \"outline\",\n variant: \"info\",\n class: \"border-lt-info/40 text-lt-info hover:bg-lt-info/10 hover:text-lt-info\",\n },\n {\n emphasis: \"outline\",\n variant: \"warning\",\n class: \"border-lt-warning/40 text-lt-warning hover:bg-lt-warning/10 hover:text-lt-warning\",\n },\n {\n emphasis: \"outline\",\n variant: \"danger\",\n class: \"border-lt-danger/40 text-lt-danger hover:bg-lt-danger/10 hover:text-lt-danger\",\n },\n {\n emphasis: \"ghost\",\n variant: \"primary\",\n class: \"text-lt-primary hover:bg-lt-primary/10 hover:text-lt-primary\",\n },\n {\n emphasis: \"ghost\",\n variant: \"secondary\",\n class: \"text-lt-secondary-fg hover:bg-lt-secondary hover:text-lt-secondary-fg\",\n },\n {\n emphasis: \"ghost\",\n variant: \"success\",\n class: \"text-lt-success hover:bg-lt-success/10 hover:text-lt-success\",\n },\n {\n emphasis: \"ghost\",\n variant: \"info\",\n class: \"text-lt-info hover:bg-lt-info/10 hover:text-lt-info\",\n },\n {\n emphasis: \"ghost\",\n variant: \"warning\",\n class: \"text-lt-warning hover:bg-lt-warning/10 hover:text-lt-warning\",\n },\n {\n emphasis: \"ghost\",\n variant: \"danger\",\n class: \"text-lt-danger hover:bg-lt-danger/10 hover:text-lt-danger\",\n },\n { emphasis: \"link\", variant: \"primary\", class: \"text-lt-primary\" },\n { emphasis: \"link\", variant: \"secondary\", class: \"text-lt-secondary-fg\" },\n { emphasis: \"link\", variant: \"success\", class: \"text-lt-success\" },\n { emphasis: \"link\", variant: \"info\", class: \"text-lt-info\" },\n { emphasis: \"link\", variant: \"warning\", class: \"text-lt-warning\" },\n { emphasis: \"link\", variant: \"danger\", class: \"text-lt-danger\" },\n ],\n defaultVariants: {\n emphasis: \"solid\",\n size: \"md\",\n },\n },\n);\n\n/**\n * Solid and link buttons read as primary when no variant is given; outline and\n * ghost stay neutral so chrome buttons do not turn teal by default.\n */\nfunction resolveButtonVariant(\n emphasis: Emphasis | null | undefined,\n variant: Variant | null | undefined,\n): Variant | undefined {\n if (variant) {\n return variant;\n }\n\n return (emphasis ?? \"solid\") === \"solid\" || emphasis === \"link\" ? \"primary\" : undefined;\n}\n\nfunction Button({\n className,\n variant,\n emphasis,\n size,\n asChild = false,\n icon,\n children,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n /** Leading icon glyph. Ignored with `asChild` (Slot needs a single child). */\n icon?: string;\n }) {\n const Comp = asChild ? Slot : \"button\";\n const content =\n icon && !asChild ? (\n <>\n <Icon name={icon} aria-hidden=\"true\" />\n {children}\n </>\n ) : (\n children\n );\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(\n buttonVariants({\n emphasis,\n variant: resolveButtonVariant(emphasis, variant),\n size,\n className,\n }),\n )}\n {...props}\n >\n {content}\n </Comp>\n );\n}\n\nconst ButtonComponent: RendererComponent<\"button\"> = ({ node }) => {\n const { label, icon } = node.props;\n const variant = node.props.variant ?? null;\n const emphasis = node.props.emphasis ?? \"solid\";\n const testId = nodeIdentity(node);\n const behavior = useClickBehavior(node.props);\n const size = icon ? \"icon\" : \"md\";\n const content = icon ? (\n <>\n <IconRenderer className=\"size-lt-icon-md\" icon={icon} />\n {label ? <span className=\"sr-only\">{label}</span> : null}\n </>\n ) : (\n label\n );\n\n const triggerButton = ({ onClick, processing }: TriggerState) => (\n <Button\n data-test={testId}\n disabled={processing}\n emphasis={emphasis}\n onClick={onClick}\n size={size}\n variant={variant}\n >\n {content}\n </Button>\n );\n\n if (behavior.kind === \"navigate\") {\n return (\n <Button asChild data-test={testId} emphasis={emphasis} variant={variant} size={size}>\n <Link href={behavior.href} method={behavior.method}>\n {content}\n </Link>\n </Button>\n );\n }\n\n if (behavior.kind === \"action\") {\n return <ActionTrigger action={behavior.action}>{triggerButton}</ActionTrigger>;\n }\n\n if (behavior.kind === \"effects\") {\n return triggerButton({ onClick: behavior.onClick, processing: false });\n }\n\n return (\n <Button\n data-test={testId}\n emphasis={emphasis}\n size={size}\n type={node.props.buttonType}\n variant={variant}\n >\n {content}\n </Button>\n );\n};\n\nexport default ButtonComponent;\nexport { Button, buttonVariants };\n"],"mappings":";;;;;;;;;;;AAaA,IAAM,iBAAiB,IACrB,udACA;CACE,UAAU;EACR,UAAU;GACR,OACE;GACF,SACE;GACF,OAAO;GACP,MAAM;EACR;EACA,SAAS;GACP,SAAS;GACT,WAAW;GACX,SAAS;GACT,MAAM;GACN,SAAS;GACT,QAAQ;EACV;EACA,MAAM;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACJ,MAAM;EACR;CACF;CACA,kBAAkB;EAChB;GACE,UAAU;GACV,SAAS;GACT,OACE;EACJ;EACA;GACE,UAAU;GACV,SAAS;GACT,OACE;EACJ;EACA;GACE,UAAU;GACV,SAAS;GACT,OACE;EACJ;EACA;GACE,UAAU;GACV,SAAS;GACT,OAAO;EACT;EACA;GACE,UAAU;GACV,SAAS;GACT,OACE;EACJ;EACA;GACE,UAAU;GACV,SAAS;GACT,OACE;EACJ;EACA;GACE,UAAU;GACV,SAAS;GACT,OAAO;EACT;EACA;GACE,UAAU;GACV,SAAS;GACT,OACE;EACJ;EACA;GACE,UAAU;GACV,SAAS;GACT,OAAO;EACT;EACA;GACE,UAAU;GACV,SAAS;GACT,OAAO;EACT;EACA;GACE,UAAU;GACV,SAAS;GACT,OAAO;EACT;EACA;GACE,UAAU;GACV,SAAS;GACT,OAAO;EACT;EACA;GACE,UAAU;GACV,SAAS;GACT,OAAO;EACT;EACA;GACE,UAAU;GACV,SAAS;GACT,OAAO;EACT;EACA;GACE,UAAU;GACV,SAAS;GACT,OAAO;EACT;EACA;GACE,UAAU;GACV,SAAS;GACT,OAAO;EACT;EACA;GACE,UAAU;GACV,SAAS;GACT,OAAO;EACT;EACA;GACE,UAAU;GACV,SAAS;GACT,OAAO;EACT;EACA;GAAE,UAAU;GAAQ,SAAS;GAAW,OAAO;EAAkB;EACjE;GAAE,UAAU;GAAQ,SAAS;GAAa,OAAO;EAAuB;EACxE;GAAE,UAAU;GAAQ,SAAS;GAAW,OAAO;EAAkB;EACjE;GAAE,UAAU;GAAQ,SAAS;GAAQ,OAAO;EAAe;EAC3D;GAAE,UAAU;GAAQ,SAAS;GAAW,OAAO;EAAkB;EACjE;GAAE,UAAU;GAAQ,SAAS;GAAU,OAAO;EAAiB;CACjE;CACA,iBAAiB;EACf,UAAU;EACV,MAAM;CACR;AACF,CACF;;;;;AAMA,SAAS,qBACP,UACA,SACqB;CACrB,IAAI,SACF,OAAO;CAGT,QAAQ,YAAY,aAAa,WAAW,aAAa,SAAS,YAAY,KAAA;AAChF;AAEA,SAAS,OAAO,EACd,WACA,SACA,UACA,MACA,UAAU,OACV,MACA,UACA,GAAG,SAMA;CACH,MAAM,OAAO,UAAU,OAAO;CAC9B,MAAM,UACJ,QAAQ,CAAC,UACP,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,MAAD;EAAM,MAAM;EAAM,eAAY;CAAQ,CAAA,GACrC,QACD,EAAA,CAAA,IAEF;CAGJ,OACE,oBAAC,MAAD;EACE,aAAU;EACV,WAAW,GACT,eAAe;GACb;GACA,SAAS,qBAAqB,UAAU,OAAO;GAC/C;GACA;EACF,CAAC,CACH;EACA,GAAI;YAEH;CACG,CAAA;AAEV;AAEA,IAAM,mBAAgD,EAAE,WAAW;CACjE,MAAM,EAAE,OAAO,SAAS,KAAK;CAC7B,MAAM,UAAU,KAAK,MAAM,WAAW;CACtC,MAAM,WAAW,KAAK,MAAM,YAAY;CACxC,MAAM,SAAS,aAAa,IAAI;CAChC,MAAM,WAAW,iBAAiB,KAAK,KAAK;CAC5C,MAAM,OAAO,OAAO,SAAS;CAC7B,MAAM,UAAU,OACd,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,cAAD;EAAc,WAAU;EAAwB;CAAO,CAAA,GACtD,QAAQ,oBAAC,QAAD;EAAM,WAAU;YAAW;CAAY,CAAA,IAAI,IACpD,EAAA,CAAA,IAEF;CAGF,MAAM,iBAAiB,EAAE,SAAS,iBAChC,oBAAC,QAAD;EACE,aAAW;EACX,UAAU;EACA;EACD;EACH;EACG;YAER;CACK,CAAA;CAGV,IAAI,SAAS,SAAS,YACpB,OACE,oBAAC,QAAD;EAAQ,SAAA;EAAQ,aAAW;EAAkB;EAAmB;EAAe;YAC7E,oBAAC,MAAD;GAAM,MAAM,SAAS;GAAM,QAAQ,SAAS;aACzC;EACG,CAAA;CACA,CAAA;CAIZ,IAAI,SAAS,SAAS,UACpB,OAAO,oBAAC,eAAD;EAAe,QAAQ,SAAS;YAAS;CAA6B,CAAA;CAG/E,IAAI,SAAS,SAAS,WACpB,OAAO,cAAc;EAAE,SAAS,SAAS;EAAS,YAAY;CAAM,CAAC;CAGvE,OACE,oBAAC,QAAD;EACE,aAAW;EACD;EACJ;EACN,MAAM,KAAK,MAAM;EACR;YAER;CACK,CAAA;AAEZ"}
|
package/dist/ui/chart-view.js
CHANGED
|
@@ -38,15 +38,17 @@ var tooltipProps = {
|
|
|
38
38
|
labelStyle: { color: "var(--lt-muted-fg)" }
|
|
39
39
|
};
|
|
40
40
|
var palette = [
|
|
41
|
-
"var(--lt-
|
|
42
|
-
"var(--lt-
|
|
43
|
-
"var(--lt-
|
|
44
|
-
"var(--lt-
|
|
45
|
-
"var(--lt-
|
|
46
|
-
"var(--lt-
|
|
41
|
+
"var(--lt-chart-1)",
|
|
42
|
+
"var(--lt-chart-2)",
|
|
43
|
+
"var(--lt-chart-3)",
|
|
44
|
+
"var(--lt-chart-4)",
|
|
45
|
+
"var(--lt-chart-5)",
|
|
46
|
+
"var(--lt-chart-6)",
|
|
47
|
+
"var(--lt-chart-7)",
|
|
48
|
+
"var(--lt-chart-8)"
|
|
47
49
|
];
|
|
48
50
|
function colorAt(index) {
|
|
49
|
-
return palette[index % palette.length] ?? "var(--lt-
|
|
51
|
+
return palette[index % palette.length] ?? "var(--lt-chart-1)";
|
|
50
52
|
}
|
|
51
53
|
function datumColor(datum, series, index) {
|
|
52
54
|
if (isRecord(datum)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-view.js","names":[],"sources":["../../resources/js/ui/chart-view.tsx"],"sourcesContent":["import {\n Area,\n AreaChart,\n Bar,\n BarChart,\n CartesianGrid,\n Cell,\n ComposedChart,\n Legend,\n Line,\n LineChart,\n Pie,\n PieChart,\n PolarAngleAxis,\n RadialBar,\n RadialBarChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport { nodeIdentity } from \"@lattice-php/lattice/core/test-id\";\nimport { isRecord } from \"@lattice-php/lattice/core/materialize\";\nimport type { ComponentPropsOf, RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport { coerceColor, colorValue } from \"@lattice-php/lattice/lib/color\";\nimport { useFormatContext } from \"@lattice-php/lattice/format/format-context\";\nimport { numericValue } from \"@lattice-php/lattice/format/numeric\";\nimport { formatValue } from \"@lattice-php/lattice/format/value\";\n\ntype ChartProps = ComponentPropsOf<\"chart\">;\ntype ChartSeries = ChartProps[\"series\"][number];\ntype ChartDatum = ChartProps[\"data\"][number];\ntype CartesianSeries = ChartSeries & { type: \"area\" | \"bar\" | \"line\" };\ntype SpecialSeries = ChartSeries & { type: \"distribution\" | \"gauge\" | \"pie\" };\ntype ChartMargin = { bottom: number; left: number; right: number; top: number };\ntype CartesianChartComponent = ComponentType<{\n children: ReactNode;\n data: ChartProps[\"data\"];\n margin?: ChartMargin;\n}>;\n\nconst chartMargin: ChartMargin = { bottom: 0, left: 0, right: 16, top: 8 };\nconst compactLegendProps = {\n align: \"center\" as const,\n height: 24,\n iconSize: 7,\n verticalAlign: \"top\" as const,\n wrapperStyle: { fontSize: 11, lineHeight: \"14px\", paddingBottom: 6 },\n};\nconst axisTick = { fontSize: 10 };\nconst tooltipProps = {\n contentStyle: {\n background: \"var(--lt-surface)\",\n border: \"1px solid var(--lt-border)\",\n borderRadius: \"var(--lt-radius-sm)\",\n boxShadow: \"var(--lt-shadow-sm)\",\n color: \"var(--lt-surface-fg)\",\n fontSize: 12,\n },\n itemStyle: { color: \"var(--lt-surface-fg)\" },\n labelStyle: { color: \"var(--lt-muted-fg)\" },\n} as const;\n\nconst palette = [\n \"var(--lt-primary)\",\n \"var(--lt-success)\",\n \"var(--lt-info)\",\n \"var(--lt-warning)\",\n \"var(--lt-danger)\",\n \"var(--lt-muted-fg)\",\n];\n\nfunction colorAt(index: number): string {\n return palette[index % palette.length] ?? \"var(--lt-primary)\";\n}\n\nfunction datumColor(datum: ChartDatum, series: ChartSeries, index: number): string {\n if (isRecord(datum)) {\n const color = coerceColor(datum.color);\n\n if (color) {\n return colorValue(color);\n }\n }\n\n return series.color ? colorValue(series.color) : colorAt(index);\n}\n\nfunction isCartesianSeries(series: ChartSeries): series is CartesianSeries {\n return series.type === \"area\" || series.type === \"bar\" || series.type === \"line\";\n}\n\nfunction isSpecialSeries(series: ChartSeries): series is SpecialSeries {\n return !isCartesianSeries(series);\n}\n\nfunction datumValue(datum: ChartDatum, key: string): number {\n return isRecord(datum) ? (numericValue(datum[key]) ?? 0) : 0;\n}\n\nfunction datumName(datum: ChartDatum, series: ChartSeries): string {\n if (series.nameKey === null || !isRecord(datum)) {\n return series.name;\n }\n\n const name = datum[series.nameKey];\n\n return typeof name === \"string\" ? name : series.name;\n}\n\nfunction cartesianChartFor(series: CartesianSeries[]): CartesianChartComponent {\n const types = new Set(series.map((item) => item.type));\n const firstSeries = series[0];\n\n if (firstSeries === undefined || types.size !== 1) {\n return ComposedChart;\n }\n\n switch (firstSeries.type) {\n case \"area\":\n return AreaChart;\n case \"bar\":\n return BarChart;\n case \"line\":\n return LineChart;\n }\n}\n\nfunction ChartFrame({\n children,\n description,\n id,\n title,\n}: {\n children: ReactNode;\n description: string | null;\n id?: string;\n title: string | null;\n}) {\n const hasHeader = title !== null || description !== null;\n\n return (\n <div\n className=\"flex flex-col gap-3 rounded-lt border border-lt-border bg-lt-surface p-4 text-lt-surface-fg shadow-lt-sm\"\n data-lattice-component={id}\n >\n {hasHeader && (\n <div className=\"flex min-w-0 flex-col gap-1.5\">\n {title !== null && <div className=\"text-sm font-semibold leading-tight\">{title}</div>}\n {description !== null && (\n <div className=\"text-xs leading-5 text-lt-muted-fg\">{description}</div>\n )}\n </div>\n )}\n {children}\n </div>\n );\n}\n\nfunction CartesianChart({ props }: { props: ChartProps }) {\n const series = props.series.filter(isCartesianSeries);\n const RechartsChart = cartesianChartFor(series);\n const ctx = useFormatContext();\n const formatCategory = (value: unknown) => formatValue(value, props.categoryFormat, ctx);\n const formatValueTick = (value: unknown) => formatValue(value, props.valueFormat, ctx);\n const hasBarSeries = series.some((item) => item.type === \"bar\");\n const tooltipCursor = hasBarSeries\n ? { fill: \"var(--lt-muted-fg)\", fillOpacity: 0.15 }\n : { stroke: \"var(--lt-muted-fg)\", strokeOpacity: 0.4 };\n\n return (\n <ResponsiveContainer width=\"100%\" height={props.height} debounce={100}>\n <RechartsChart data={props.data} margin={chartMargin}>\n {props.grid && <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--lt-border)\" />}\n {props.xAxis && props.categoryKey !== null && (\n <XAxis\n dataKey={props.categoryKey}\n stroke=\"var(--lt-muted-fg)\"\n tick={axisTick}\n tickFormatter={formatCategory}\n tickLine={false}\n />\n )}\n {props.yAxis && (\n <YAxis\n stroke=\"var(--lt-muted-fg)\"\n tick={axisTick}\n tickFormatter={formatValueTick}\n tickLine={false}\n width={42}\n />\n )}\n {props.tooltip && (\n <Tooltip\n {...tooltipProps}\n cursor={tooltipCursor}\n formatter={formatValueTick}\n labelFormatter={formatCategory}\n />\n )}\n {props.legend && <Legend {...compactLegendProps} />}\n {series.map((item, index) => {\n const color = item.color ? colorValue(item.color) : colorAt(index);\n const key = `${item.type}:${item.dataKey}`;\n\n if (item.type === \"area\") {\n return (\n <Area\n key={key}\n dataKey={item.dataKey}\n fill={color}\n fillOpacity={0.16}\n name={item.name}\n stackId={item.stackId ?? undefined}\n stroke={color}\n type=\"monotone\"\n />\n );\n }\n\n if (item.type === \"bar\") {\n return (\n <Bar\n key={key}\n dataKey={item.dataKey}\n fill={color}\n name={item.name}\n radius={[4, 4, 0, 0]}\n stackId={item.stackId ?? undefined}\n />\n );\n }\n\n return (\n <Line\n key={key}\n dataKey={item.dataKey}\n dot={false}\n name={item.name}\n stroke={color}\n strokeWidth={2}\n type=\"monotone\"\n />\n );\n })}\n </RechartsChart>\n </ResponsiveContainer>\n );\n}\n\nfunction PieChartView({ props, series }: { props: ChartProps; series: ChartSeries }) {\n const ctx = useFormatContext();\n\n return (\n <ResponsiveContainer width=\"100%\" height={props.height} debounce={100}>\n <PieChart margin={chartMargin}>\n {props.tooltip && (\n <Tooltip\n {...tooltipProps}\n formatter={(value) => formatValue(value, props.valueFormat, ctx)}\n labelFormatter={(value) => formatValue(value, props.categoryFormat, ctx)}\n />\n )}\n {props.legend && <Legend {...compactLegendProps} />}\n <Pie\n data={props.data}\n dataKey={series.dataKey}\n name={series.name}\n nameKey={series.nameKey ?? undefined}\n innerRadius={series.innerRadius}\n outerRadius=\"68%\"\n >\n {props.data.map((datum, index) => (\n <Cell key={index} fill={datumColor(datum, series, index)} />\n ))}\n </Pie>\n </PieChart>\n </ResponsiveContainer>\n );\n}\n\nfunction ChartLegend({\n entries,\n}: {\n entries: Array<{ color: string; label: string; value?: string }>;\n}) {\n return (\n <div className=\"flex flex-wrap items-center justify-center gap-x-3 gap-y-1\">\n {entries.map((entry, index) => (\n <span\n key={index}\n className=\"flex items-center gap-1 text-[11px] leading-[14px] text-lt-muted-fg\"\n >\n <span\n aria-hidden\n className=\"size-[7px] rounded-full\"\n style={{ background: entry.color }}\n />\n {entry.label}\n {entry.value !== undefined && (\n <span className=\"font-medium text-lt-surface-fg\">{entry.value}</span>\n )}\n </span>\n ))}\n </div>\n );\n}\n\nfunction GaugeChartView({ props, series }: { props: ChartProps; series: ChartSeries }) {\n const ctx = useFormatContext();\n const values = props.data.map((datum) => datumValue(datum, series.dataKey));\n const max = series.maxValue ?? Math.max(0, ...values);\n const legendEntries = props.data.map((datum, index) => ({\n color: datumColor(datum, series, index),\n label: datumName(datum, series),\n }));\n\n return (\n <div className=\"flex flex-col gap-1.5\">\n {props.legend && <ChartLegend entries={legendEntries} />}\n <div className=\"relative\">\n <ResponsiveContainer width=\"100%\" height={props.height} debounce={100}>\n <RadialBarChart\n data={props.data}\n endAngle={-30}\n innerRadius={series.innerRadius}\n margin={chartMargin}\n outerRadius=\"100%\"\n startAngle={210}\n >\n <PolarAngleAxis type=\"number\" domain={[0, max]} tick={false} />\n {props.tooltip && (\n <Tooltip\n {...tooltipProps}\n formatter={(value) => formatValue(value, props.valueFormat, ctx)}\n />\n )}\n <RadialBar\n background={{ fill: \"var(--lt-muted)\" }}\n cornerRadius={6}\n dataKey={series.dataKey}\n name={series.name}\n >\n {props.data.map((datum, index) => (\n <Cell key={index} fill={datumColor(datum, series, index)} />\n ))}\n </RadialBar>\n </RadialBarChart>\n </ResponsiveContainer>\n {values.length === 1 && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <span className=\"text-2xl font-semibold text-lt-surface-fg\">\n {formatValue(values[0], props.valueFormat, ctx)}\n </span>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction DistributionChartView({ props, series }: { props: ChartProps; series: ChartSeries }) {\n const ctx = useFormatContext();\n const segments = props.data\n .map((datum, index) => ({\n color: datumColor(datum, series, index),\n label: datumName(datum, series),\n value: datumValue(datum, series.dataKey),\n }))\n .filter((segment) => segment.value > 0);\n const total = segments.reduce((sum, segment) => sum + segment.value, 0);\n\n if (total <= 0) {\n return <div className=\"h-2.5 w-full rounded-full bg-lt-muted\" data-lattice-distribution=\"\" />;\n }\n\n const formatPercent = new Intl.NumberFormat(ctx.locale, {\n maximumFractionDigits: 1,\n style: \"percent\",\n });\n\n return (\n <div className=\"flex flex-col gap-1.5\">\n <div\n className=\"flex h-2.5 w-full gap-0.5 overflow-hidden rounded-full\"\n data-lattice-distribution=\"\"\n >\n {segments.map((segment, index) => (\n <div\n key={index}\n style={{ background: segment.color, width: `${(segment.value / total) * 100}%` }}\n title={\n props.tooltip\n ? `${segment.label}: ${formatValue(segment.value, props.valueFormat, ctx)}`\n : undefined\n }\n />\n ))}\n </div>\n {props.legend && (\n <ChartLegend\n entries={segments.map((segment) => ({\n color: segment.color,\n label: segment.label,\n value: formatPercent.format(segment.value / total),\n }))}\n />\n )}\n </div>\n );\n}\n\nfunction SpecialChart({ props, series }: { props: ChartProps; series: SpecialSeries }) {\n switch (series.type) {\n case \"distribution\":\n return <DistributionChartView props={props} series={series} />;\n case \"gauge\":\n return <GaugeChartView props={props} series={series} />;\n case \"pie\":\n return <PieChartView props={props} series={series} />;\n }\n}\n\nconst ChartView: RendererComponent<\"chart\"> = ({ node }) => {\n const props = node.props;\n const specialSeries = props.series.find(isSpecialSeries);\n const hasCartesianSeries = props.series.some(isCartesianSeries);\n\n return (\n <ChartFrame description={props.description} id={nodeIdentity(node)} title={props.title}>\n <div className=\"min-h-0 w-full\">\n {specialSeries !== undefined && !hasCartesianSeries ? (\n <SpecialChart props={props} series={specialSeries} />\n ) : (\n <CartesianChart props={props} />\n )}\n </div>\n </ChartFrame>\n );\n};\n\nexport default ChartView;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart-view.js","names":[],"sources":["../../resources/js/ui/chart-view.tsx"],"sourcesContent":["import {\n Area,\n AreaChart,\n Bar,\n BarChart,\n CartesianGrid,\n Cell,\n ComposedChart,\n Legend,\n Line,\n LineChart,\n Pie,\n PieChart,\n PolarAngleAxis,\n RadialBar,\n RadialBarChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport { nodeIdentity } from \"@lattice-php/lattice/core/test-id\";\nimport { isRecord } from \"@lattice-php/lattice/core/materialize\";\nimport type { ComponentPropsOf, RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport { coerceColor, colorValue } from \"@lattice-php/lattice/lib/color\";\nimport { useFormatContext } from \"@lattice-php/lattice/format/format-context\";\nimport { numericValue } from \"@lattice-php/lattice/format/numeric\";\nimport { formatValue } from \"@lattice-php/lattice/format/value\";\n\ntype ChartProps = ComponentPropsOf<\"chart\">;\ntype ChartSeries = ChartProps[\"series\"][number];\ntype ChartDatum = ChartProps[\"data\"][number];\ntype CartesianSeries = ChartSeries & { type: \"area\" | \"bar\" | \"line\" };\ntype SpecialSeries = ChartSeries & { type: \"distribution\" | \"gauge\" | \"pie\" };\ntype ChartMargin = { bottom: number; left: number; right: number; top: number };\ntype CartesianChartComponent = ComponentType<{\n children: ReactNode;\n data: ChartProps[\"data\"];\n margin?: ChartMargin;\n}>;\n\nconst chartMargin: ChartMargin = { bottom: 0, left: 0, right: 16, top: 8 };\nconst compactLegendProps = {\n align: \"center\" as const,\n height: 24,\n iconSize: 7,\n verticalAlign: \"top\" as const,\n wrapperStyle: { fontSize: 11, lineHeight: \"14px\", paddingBottom: 6 },\n};\nconst axisTick = { fontSize: 10 };\nconst tooltipProps = {\n contentStyle: {\n background: \"var(--lt-surface)\",\n border: \"1px solid var(--lt-border)\",\n borderRadius: \"var(--lt-radius-sm)\",\n boxShadow: \"var(--lt-shadow-sm)\",\n color: \"var(--lt-surface-fg)\",\n fontSize: 12,\n },\n itemStyle: { color: \"var(--lt-surface-fg)\" },\n labelStyle: { color: \"var(--lt-muted-fg)\" },\n} as const;\n\nconst palette = [\n \"var(--lt-chart-1)\",\n \"var(--lt-chart-2)\",\n \"var(--lt-chart-3)\",\n \"var(--lt-chart-4)\",\n \"var(--lt-chart-5)\",\n \"var(--lt-chart-6)\",\n \"var(--lt-chart-7)\",\n \"var(--lt-chart-8)\",\n];\n\nfunction colorAt(index: number): string {\n return palette[index % palette.length] ?? \"var(--lt-chart-1)\";\n}\n\nfunction datumColor(datum: ChartDatum, series: ChartSeries, index: number): string {\n if (isRecord(datum)) {\n const color = coerceColor(datum.color);\n\n if (color) {\n return colorValue(color);\n }\n }\n\n return series.color ? colorValue(series.color) : colorAt(index);\n}\n\nfunction isCartesianSeries(series: ChartSeries): series is CartesianSeries {\n return series.type === \"area\" || series.type === \"bar\" || series.type === \"line\";\n}\n\nfunction isSpecialSeries(series: ChartSeries): series is SpecialSeries {\n return !isCartesianSeries(series);\n}\n\nfunction datumValue(datum: ChartDatum, key: string): number {\n return isRecord(datum) ? (numericValue(datum[key]) ?? 0) : 0;\n}\n\nfunction datumName(datum: ChartDatum, series: ChartSeries): string {\n if (series.nameKey === null || !isRecord(datum)) {\n return series.name;\n }\n\n const name = datum[series.nameKey];\n\n return typeof name === \"string\" ? name : series.name;\n}\n\nfunction cartesianChartFor(series: CartesianSeries[]): CartesianChartComponent {\n const types = new Set(series.map((item) => item.type));\n const firstSeries = series[0];\n\n if (firstSeries === undefined || types.size !== 1) {\n return ComposedChart;\n }\n\n switch (firstSeries.type) {\n case \"area\":\n return AreaChart;\n case \"bar\":\n return BarChart;\n case \"line\":\n return LineChart;\n }\n}\n\nfunction ChartFrame({\n children,\n description,\n id,\n title,\n}: {\n children: ReactNode;\n description: string | null;\n id?: string;\n title: string | null;\n}) {\n const hasHeader = title !== null || description !== null;\n\n return (\n <div\n className=\"flex flex-col gap-3 rounded-lt border border-lt-border bg-lt-surface p-4 text-lt-surface-fg shadow-lt-sm\"\n data-lattice-component={id}\n >\n {hasHeader && (\n <div className=\"flex min-w-0 flex-col gap-1.5\">\n {title !== null && <div className=\"text-sm font-semibold leading-tight\">{title}</div>}\n {description !== null && (\n <div className=\"text-xs leading-5 text-lt-muted-fg\">{description}</div>\n )}\n </div>\n )}\n {children}\n </div>\n );\n}\n\nfunction CartesianChart({ props }: { props: ChartProps }) {\n const series = props.series.filter(isCartesianSeries);\n const RechartsChart = cartesianChartFor(series);\n const ctx = useFormatContext();\n const formatCategory = (value: unknown) => formatValue(value, props.categoryFormat, ctx);\n const formatValueTick = (value: unknown) => formatValue(value, props.valueFormat, ctx);\n const hasBarSeries = series.some((item) => item.type === \"bar\");\n const tooltipCursor = hasBarSeries\n ? { fill: \"var(--lt-muted-fg)\", fillOpacity: 0.15 }\n : { stroke: \"var(--lt-muted-fg)\", strokeOpacity: 0.4 };\n\n return (\n <ResponsiveContainer width=\"100%\" height={props.height} debounce={100}>\n <RechartsChart data={props.data} margin={chartMargin}>\n {props.grid && <CartesianGrid strokeDasharray=\"3 3\" stroke=\"var(--lt-border)\" />}\n {props.xAxis && props.categoryKey !== null && (\n <XAxis\n dataKey={props.categoryKey}\n stroke=\"var(--lt-muted-fg)\"\n tick={axisTick}\n tickFormatter={formatCategory}\n tickLine={false}\n />\n )}\n {props.yAxis && (\n <YAxis\n stroke=\"var(--lt-muted-fg)\"\n tick={axisTick}\n tickFormatter={formatValueTick}\n tickLine={false}\n width={42}\n />\n )}\n {props.tooltip && (\n <Tooltip\n {...tooltipProps}\n cursor={tooltipCursor}\n formatter={formatValueTick}\n labelFormatter={formatCategory}\n />\n )}\n {props.legend && <Legend {...compactLegendProps} />}\n {series.map((item, index) => {\n const color = item.color ? colorValue(item.color) : colorAt(index);\n const key = `${item.type}:${item.dataKey}`;\n\n if (item.type === \"area\") {\n return (\n <Area\n key={key}\n dataKey={item.dataKey}\n fill={color}\n fillOpacity={0.16}\n name={item.name}\n stackId={item.stackId ?? undefined}\n stroke={color}\n type=\"monotone\"\n />\n );\n }\n\n if (item.type === \"bar\") {\n return (\n <Bar\n key={key}\n dataKey={item.dataKey}\n fill={color}\n name={item.name}\n radius={[4, 4, 0, 0]}\n stackId={item.stackId ?? undefined}\n />\n );\n }\n\n return (\n <Line\n key={key}\n dataKey={item.dataKey}\n dot={false}\n name={item.name}\n stroke={color}\n strokeWidth={2}\n type=\"monotone\"\n />\n );\n })}\n </RechartsChart>\n </ResponsiveContainer>\n );\n}\n\nfunction PieChartView({ props, series }: { props: ChartProps; series: ChartSeries }) {\n const ctx = useFormatContext();\n\n return (\n <ResponsiveContainer width=\"100%\" height={props.height} debounce={100}>\n <PieChart margin={chartMargin}>\n {props.tooltip && (\n <Tooltip\n {...tooltipProps}\n formatter={(value) => formatValue(value, props.valueFormat, ctx)}\n labelFormatter={(value) => formatValue(value, props.categoryFormat, ctx)}\n />\n )}\n {props.legend && <Legend {...compactLegendProps} />}\n <Pie\n data={props.data}\n dataKey={series.dataKey}\n name={series.name}\n nameKey={series.nameKey ?? undefined}\n innerRadius={series.innerRadius}\n outerRadius=\"68%\"\n >\n {props.data.map((datum, index) => (\n <Cell key={index} fill={datumColor(datum, series, index)} />\n ))}\n </Pie>\n </PieChart>\n </ResponsiveContainer>\n );\n}\n\nfunction ChartLegend({\n entries,\n}: {\n entries: Array<{ color: string; label: string; value?: string }>;\n}) {\n return (\n <div className=\"flex flex-wrap items-center justify-center gap-x-3 gap-y-1\">\n {entries.map((entry, index) => (\n <span\n key={index}\n className=\"flex items-center gap-1 text-[11px] leading-[14px] text-lt-muted-fg\"\n >\n <span\n aria-hidden\n className=\"size-[7px] rounded-full\"\n style={{ background: entry.color }}\n />\n {entry.label}\n {entry.value !== undefined && (\n <span className=\"font-medium text-lt-surface-fg\">{entry.value}</span>\n )}\n </span>\n ))}\n </div>\n );\n}\n\nfunction GaugeChartView({ props, series }: { props: ChartProps; series: ChartSeries }) {\n const ctx = useFormatContext();\n const values = props.data.map((datum) => datumValue(datum, series.dataKey));\n const max = series.maxValue ?? Math.max(0, ...values);\n const legendEntries = props.data.map((datum, index) => ({\n color: datumColor(datum, series, index),\n label: datumName(datum, series),\n }));\n\n return (\n <div className=\"flex flex-col gap-1.5\">\n {props.legend && <ChartLegend entries={legendEntries} />}\n <div className=\"relative\">\n <ResponsiveContainer width=\"100%\" height={props.height} debounce={100}>\n <RadialBarChart\n data={props.data}\n endAngle={-30}\n innerRadius={series.innerRadius}\n margin={chartMargin}\n outerRadius=\"100%\"\n startAngle={210}\n >\n <PolarAngleAxis type=\"number\" domain={[0, max]} tick={false} />\n {props.tooltip && (\n <Tooltip\n {...tooltipProps}\n formatter={(value) => formatValue(value, props.valueFormat, ctx)}\n />\n )}\n <RadialBar\n background={{ fill: \"var(--lt-muted)\" }}\n cornerRadius={6}\n dataKey={series.dataKey}\n name={series.name}\n >\n {props.data.map((datum, index) => (\n <Cell key={index} fill={datumColor(datum, series, index)} />\n ))}\n </RadialBar>\n </RadialBarChart>\n </ResponsiveContainer>\n {values.length === 1 && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <span className=\"text-2xl font-semibold text-lt-surface-fg\">\n {formatValue(values[0], props.valueFormat, ctx)}\n </span>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction DistributionChartView({ props, series }: { props: ChartProps; series: ChartSeries }) {\n const ctx = useFormatContext();\n const segments = props.data\n .map((datum, index) => ({\n color: datumColor(datum, series, index),\n label: datumName(datum, series),\n value: datumValue(datum, series.dataKey),\n }))\n .filter((segment) => segment.value > 0);\n const total = segments.reduce((sum, segment) => sum + segment.value, 0);\n\n if (total <= 0) {\n return <div className=\"h-2.5 w-full rounded-full bg-lt-muted\" data-lattice-distribution=\"\" />;\n }\n\n const formatPercent = new Intl.NumberFormat(ctx.locale, {\n maximumFractionDigits: 1,\n style: \"percent\",\n });\n\n return (\n <div className=\"flex flex-col gap-1.5\">\n <div\n className=\"flex h-2.5 w-full gap-0.5 overflow-hidden rounded-full\"\n data-lattice-distribution=\"\"\n >\n {segments.map((segment, index) => (\n <div\n key={index}\n style={{ background: segment.color, width: `${(segment.value / total) * 100}%` }}\n title={\n props.tooltip\n ? `${segment.label}: ${formatValue(segment.value, props.valueFormat, ctx)}`\n : undefined\n }\n />\n ))}\n </div>\n {props.legend && (\n <ChartLegend\n entries={segments.map((segment) => ({\n color: segment.color,\n label: segment.label,\n value: formatPercent.format(segment.value / total),\n }))}\n />\n )}\n </div>\n );\n}\n\nfunction SpecialChart({ props, series }: { props: ChartProps; series: SpecialSeries }) {\n switch (series.type) {\n case \"distribution\":\n return <DistributionChartView props={props} series={series} />;\n case \"gauge\":\n return <GaugeChartView props={props} series={series} />;\n case \"pie\":\n return <PieChartView props={props} series={series} />;\n }\n}\n\nconst ChartView: RendererComponent<\"chart\"> = ({ node }) => {\n const props = node.props;\n const specialSeries = props.series.find(isSpecialSeries);\n const hasCartesianSeries = props.series.some(isCartesianSeries);\n\n return (\n <ChartFrame description={props.description} id={nodeIdentity(node)} title={props.title}>\n <div className=\"min-h-0 w-full\">\n {specialSeries !== undefined && !hasCartesianSeries ? (\n <SpecialChart props={props} series={specialSeries} />\n ) : (\n <CartesianChart props={props} />\n )}\n </div>\n </ChartFrame>\n );\n};\n\nexport default ChartView;\n"],"mappings":";;;;;;;;;AA0CA,IAAM,cAA2B;CAAE,QAAQ;CAAG,MAAM;CAAG,OAAO;CAAI,KAAK;AAAE;AACzE,IAAM,qBAAqB;CACzB,OAAO;CACP,QAAQ;CACR,UAAU;CACV,eAAe;CACf,cAAc;EAAE,UAAU;EAAI,YAAY;EAAQ,eAAe;CAAE;AACrE;AACA,IAAM,WAAW,EAAE,UAAU,GAAG;AAChC,IAAM,eAAe;CACnB,cAAc;EACZ,YAAY;EACZ,QAAQ;EACR,cAAc;EACd,WAAW;EACX,OAAO;EACP,UAAU;CACZ;CACA,WAAW,EAAE,OAAO,uBAAuB;CAC3C,YAAY,EAAE,OAAO,qBAAqB;AAC5C;AAEA,IAAM,UAAU;CACd;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,SAAS,QAAQ,OAAuB;CACtC,OAAO,QAAQ,QAAQ,QAAQ,WAAW;AAC5C;AAEA,SAAS,WAAW,OAAmB,QAAqB,OAAuB;CACjF,IAAI,SAAS,KAAK,GAAG;EACnB,MAAM,QAAQ,YAAY,MAAM,KAAK;EAErC,IAAI,OACF,OAAO,WAAW,KAAK;CAE3B;CAEA,OAAO,OAAO,QAAQ,WAAW,OAAO,KAAK,IAAI,QAAQ,KAAK;AAChE;AAEA,SAAS,kBAAkB,QAAgD;CACzE,OAAO,OAAO,SAAS,UAAU,OAAO,SAAS,SAAS,OAAO,SAAS;AAC5E;AAEA,SAAS,gBAAgB,QAA8C;CACrE,OAAO,CAAC,kBAAkB,MAAM;AAClC;AAEA,SAAS,WAAW,OAAmB,KAAqB;CAC1D,OAAO,SAAS,KAAK,IAAK,aAAa,MAAM,IAAI,KAAK,IAAK;AAC7D;AAEA,SAAS,UAAU,OAAmB,QAA6B;CACjE,IAAI,OAAO,YAAY,QAAQ,CAAC,SAAS,KAAK,GAC5C,OAAO,OAAO;CAGhB,MAAM,OAAO,MAAM,OAAO;CAE1B,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAClD;AAEA,SAAS,kBAAkB,QAAoD;CAC7E,MAAM,QAAQ,IAAI,IAAI,OAAO,KAAK,SAAS,KAAK,IAAI,CAAC;CACrD,MAAM,cAAc,OAAO;CAE3B,IAAI,gBAAgB,KAAA,KAAa,MAAM,SAAS,GAC9C,OAAO;CAGT,QAAQ,YAAY,MAApB;EACE,KAAK,QACH,OAAO;EACT,KAAK,OACH,OAAO;EACT,KAAK,QACH,OAAO;CACX;AACF;AAEA,SAAS,WAAW,EAClB,UACA,aACA,IACA,SAMC;CAGD,OACE,qBAAC,OAAD;EACE,WAAU;EACV,0BAAwB;YAF1B,EAHgB,UAAU,QAAQ,gBAAgB,SAQ9C,qBAAC,OAAD;GAAK,WAAU;aAAf,CACG,UAAU,QAAQ,oBAAC,OAAD;IAAK,WAAU;cAAuC;GAAW,CAAA,GACnF,gBAAgB,QACf,oBAAC,OAAD;IAAK,WAAU;cAAsC;GAAiB,CAAA,CAErE;MAEN,QACE;;AAET;AAEA,SAAS,eAAe,EAAE,SAAgC;CACxD,MAAM,SAAS,MAAM,OAAO,OAAO,iBAAiB;CACpD,MAAM,gBAAgB,kBAAkB,MAAM;CAC9C,MAAM,MAAM,iBAAiB;CAC7B,MAAM,kBAAkB,UAAmB,YAAY,OAAO,MAAM,gBAAgB,GAAG;CACvF,MAAM,mBAAmB,UAAmB,YAAY,OAAO,MAAM,aAAa,GAAG;CAErF,MAAM,gBADe,OAAO,MAAM,SAAS,KAAK,SAAS,KACnC,IAClB;EAAE,MAAM;EAAsB,aAAa;CAAK,IAChD;EAAE,QAAQ;EAAsB,eAAe;CAAI;CAEvD,OACE,oBAAC,qBAAD;EAAqB,OAAM;EAAO,QAAQ,MAAM;EAAQ,UAAU;YAChE,qBAAC,eAAD;GAAe,MAAM,MAAM;GAAM,QAAQ;aAAzC;IACG,MAAM,QAAQ,oBAAC,eAAD;KAAe,iBAAgB;KAAM,QAAO;IAAoB,CAAA;IAC9E,MAAM,SAAS,MAAM,gBAAgB,QACpC,oBAAC,OAAD;KACE,SAAS,MAAM;KACf,QAAO;KACP,MAAM;KACN,eAAe;KACf,UAAU;IACX,CAAA;IAEF,MAAM,SACL,oBAAC,OAAD;KACE,QAAO;KACP,MAAM;KACN,eAAe;KACf,UAAU;KACV,OAAO;IACR,CAAA;IAEF,MAAM,WACL,oBAAC,SAAD;KACE,GAAI;KACJ,QAAQ;KACR,WAAW;KACX,gBAAgB;IACjB,CAAA;IAEF,MAAM,UAAU,oBAAC,QAAD,EAAQ,GAAI,mBAAqB,CAAA;IACjD,OAAO,KAAK,MAAM,UAAU;KAC3B,MAAM,QAAQ,KAAK,QAAQ,WAAW,KAAK,KAAK,IAAI,QAAQ,KAAK;KACjE,MAAM,MAAM,GAAG,KAAK,KAAK,GAAG,KAAK;KAEjC,IAAI,KAAK,SAAS,QAChB,OACE,oBAAC,MAAD;MAEE,SAAS,KAAK;MACd,MAAM;MACN,aAAa;MACb,MAAM,KAAK;MACX,SAAS,KAAK,WAAW,KAAA;MACzB,QAAQ;MACR,MAAK;KACN,GARM,GAQN;KAIL,IAAI,KAAK,SAAS,OAChB,OACE,oBAAC,KAAD;MAEE,SAAS,KAAK;MACd,MAAM;MACN,MAAM,KAAK;MACX,QAAQ;OAAC;OAAG;OAAG;OAAG;MAAC;MACnB,SAAS,KAAK,WAAW,KAAA;KAC1B,GANM,GAMN;KAIL,OACE,oBAAC,MAAD;MAEE,SAAS,KAAK;MACd,KAAK;MACL,MAAM,KAAK;MACX,QAAQ;MACR,aAAa;MACb,MAAK;KACN,GAPM,GAON;IAEL,CAAC;GACY;;CACI,CAAA;AAEzB;AAEA,SAAS,aAAa,EAAE,OAAO,UAAsD;CACnF,MAAM,MAAM,iBAAiB;CAE7B,OACE,oBAAC,qBAAD;EAAqB,OAAM;EAAO,QAAQ,MAAM;EAAQ,UAAU;YAChE,qBAAC,UAAD;GAAU,QAAQ;aAAlB;IACG,MAAM,WACL,oBAAC,SAAD;KACE,GAAI;KACJ,YAAY,UAAU,YAAY,OAAO,MAAM,aAAa,GAAG;KAC/D,iBAAiB,UAAU,YAAY,OAAO,MAAM,gBAAgB,GAAG;IACxE,CAAA;IAEF,MAAM,UAAU,oBAAC,QAAD,EAAQ,GAAI,mBAAqB,CAAA;IAClD,oBAAC,KAAD;KACE,MAAM,MAAM;KACZ,SAAS,OAAO;KAChB,MAAM,OAAO;KACb,SAAS,OAAO,WAAW,KAAA;KAC3B,aAAa,OAAO;KACpB,aAAY;eAEX,MAAM,KAAK,KAAK,OAAO,UACtB,oBAAC,MAAD,EAAkB,MAAM,WAAW,OAAO,QAAQ,KAAK,EAAI,GAAhD,KAAgD,CAC5D;IACE,CAAA;GACG;;CACS,CAAA;AAEzB;AAEA,SAAS,YAAY,EACnB,WAGC;CACD,OACE,oBAAC,OAAD;EAAK,WAAU;YACZ,QAAQ,KAAK,OAAO,UACnB,qBAAC,QAAD;GAEE,WAAU;aAFZ;IAIE,oBAAC,QAAD;KACE,eAAA;KACA,WAAU;KACV,OAAO,EAAE,YAAY,MAAM,MAAM;IAClC,CAAA;IACA,MAAM;IACN,MAAM,UAAU,KAAA,KACf,oBAAC,QAAD;KAAM,WAAU;eAAkC,MAAM;IAAY,CAAA;GAElE;KAZC,KAYD,CACP;CACE,CAAA;AAET;AAEA,SAAS,eAAe,EAAE,OAAO,UAAsD;CACrF,MAAM,MAAM,iBAAiB;CAC7B,MAAM,SAAS,MAAM,KAAK,KAAK,UAAU,WAAW,OAAO,OAAO,OAAO,CAAC;CAC1E,MAAM,MAAM,OAAO,YAAY,KAAK,IAAI,GAAG,GAAG,MAAM;CACpD,MAAM,gBAAgB,MAAM,KAAK,KAAK,OAAO,WAAW;EACtD,OAAO,WAAW,OAAO,QAAQ,KAAK;EACtC,OAAO,UAAU,OAAO,MAAM;CAChC,EAAE;CAEF,OACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACG,MAAM,UAAU,oBAAC,aAAD,EAAa,SAAS,cAAgB,CAAA,GACvD,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,oBAAC,qBAAD;IAAqB,OAAM;IAAO,QAAQ,MAAM;IAAQ,UAAU;cAChE,qBAAC,gBAAD;KACE,MAAM,MAAM;KACZ,UAAU;KACV,aAAa,OAAO;KACpB,QAAQ;KACR,aAAY;KACZ,YAAY;eANd;MAQE,oBAAC,gBAAD;OAAgB,MAAK;OAAS,QAAQ,CAAC,GAAG,GAAG;OAAG,MAAM;MAAQ,CAAA;MAC7D,MAAM,WACL,oBAAC,SAAD;OACE,GAAI;OACJ,YAAY,UAAU,YAAY,OAAO,MAAM,aAAa,GAAG;MAChE,CAAA;MAEH,oBAAC,WAAD;OACE,YAAY,EAAE,MAAM,kBAAkB;OACtC,cAAc;OACd,SAAS,OAAO;OAChB,MAAM,OAAO;iBAEZ,MAAM,KAAK,KAAK,OAAO,UACtB,oBAAC,MAAD,EAAkB,MAAM,WAAW,OAAO,QAAQ,KAAK,EAAI,GAAhD,KAAgD,CAC5D;MACQ,CAAA;KACG;;GACG,CAAA,GACpB,OAAO,WAAW,KACjB,oBAAC,OAAD;IAAK,WAAU;cACb,oBAAC,QAAD;KAAM,WAAU;eACb,YAAY,OAAO,IAAI,MAAM,aAAa,GAAG;IAC1C,CAAA;GACH,CAAA,CAEJ;IACF;;AAET;AAEA,SAAS,sBAAsB,EAAE,OAAO,UAAsD;CAC5F,MAAM,MAAM,iBAAiB;CAC7B,MAAM,WAAW,MAAM,KACpB,KAAK,OAAO,WAAW;EACtB,OAAO,WAAW,OAAO,QAAQ,KAAK;EACtC,OAAO,UAAU,OAAO,MAAM;EAC9B,OAAO,WAAW,OAAO,OAAO,OAAO;CACzC,EAAE,EACD,QAAQ,YAAY,QAAQ,QAAQ,CAAC;CACxC,MAAM,QAAQ,SAAS,QAAQ,KAAK,YAAY,MAAM,QAAQ,OAAO,CAAC;CAEtE,IAAI,SAAS,GACX,OAAO,oBAAC,OAAD;EAAK,WAAU;EAAwC,6BAA0B;CAAI,CAAA;CAG9F,MAAM,gBAAgB,IAAI,KAAK,aAAa,IAAI,QAAQ;EACtD,uBAAuB;EACvB,OAAO;CACT,CAAC;CAED,OACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,OAAD;GACE,WAAU;GACV,6BAA0B;aAEzB,SAAS,KAAK,SAAS,UACtB,oBAAC,OAAD;IAEE,OAAO;KAAE,YAAY,QAAQ;KAAO,OAAO,GAAI,QAAQ,QAAQ,QAAS,IAAI;IAAG;IAC/E,OACE,MAAM,UACF,GAAG,QAAQ,MAAM,IAAI,YAAY,QAAQ,OAAO,MAAM,aAAa,GAAG,MACtE,KAAA;GAEP,GAPM,KAON,CACF;EACE,CAAA,GACJ,MAAM,UACL,oBAAC,aAAD,EACE,SAAS,SAAS,KAAK,aAAa;GAClC,OAAO,QAAQ;GACf,OAAO,QAAQ;GACf,OAAO,cAAc,OAAO,QAAQ,QAAQ,KAAK;EACnD,EAAE,EACH,CAAA,CAEA;;AAET;AAEA,SAAS,aAAa,EAAE,OAAO,UAAwD;CACrF,QAAQ,OAAO,MAAf;EACE,KAAK,gBACH,OAAO,oBAAC,uBAAD;GAA8B;GAAe;EAAS,CAAA;EAC/D,KAAK,SACH,OAAO,oBAAC,gBAAD;GAAuB;GAAe;EAAS,CAAA;EACxD,KAAK,OACH,OAAO,oBAAC,cAAD;GAAqB;GAAe;EAAS,CAAA;CACxD;AACF;AAEA,IAAM,aAAyC,EAAE,WAAW;CAC1D,MAAM,QAAQ,KAAK;CACnB,MAAM,gBAAgB,MAAM,OAAO,KAAK,eAAe;CACvD,MAAM,qBAAqB,MAAM,OAAO,KAAK,iBAAiB;CAE9D,OACE,oBAAC,YAAD;EAAY,aAAa,MAAM;EAAa,IAAI,aAAa,IAAI;EAAG,OAAO,MAAM;YAC/E,oBAAC,OAAD;GAAK,WAAU;aACZ,kBAAkB,KAAA,KAAa,CAAC,qBAC/B,oBAAC,cAAD;IAAqB;IAAO,QAAQ;GAAgB,CAAA,IAEpD,oBAAC,gBAAD,EAAuB,MAAQ,CAAA;EAE9B,CAAA;CACK,CAAA;AAEhB"}
|
package/dist/ui/checkbox.js
CHANGED
|
@@ -7,7 +7,7 @@ import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
|
|
|
7
7
|
function Checkbox({ className, ...props }) {
|
|
8
8
|
return /* @__PURE__ */ jsx(CheckboxPrimitive.Root, {
|
|
9
9
|
"data-slot": "checkbox",
|
|
10
|
-
className: cn("peer border-lt-input data-[state=checked]:bg-lt-primary data-[state=checked]:text-lt-primary-fg data-[state=checked]:border-lt-primary focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 aria-invalid:ring-lt-danger/20 dark:aria-invalid:ring-lt-danger/40 aria-invalid:border-lt-danger size-4 shrink-0 rounded-lt-xs border shadow-lt-xs transition-shadow outline-none focus-visible:ring-[
|
|
10
|
+
className: cn("peer border-lt-input data-[state=checked]:bg-lt-primary data-[state=checked]:text-lt-primary-fg data-[state=checked]:border-lt-primary focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 aria-invalid:ring-lt-danger/20 dark:aria-invalid:ring-lt-danger/40 aria-invalid:border-lt-danger size-4 shrink-0 rounded-lt-xs border shadow-lt-xs transition-shadow outline-none focus-visible:ring-[length:var(--lt-ring-width)] disabled:cursor-not-allowed disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:data-[state=checked]:bg-lt-disabled disabled:data-[state=checked]:text-lt-disabled-fg disabled:data-[state=checked]:border-lt-disabled", className),
|
|
11
11
|
...props,
|
|
12
12
|
children: /* @__PURE__ */ jsx(CheckboxPrimitive.Indicator, {
|
|
13
13
|
"data-slot": "checkbox-indicator",
|
package/dist/ui/checkbox.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkbox.js","names":[],"sources":["../../resources/js/ui/checkbox.tsx"],"sourcesContent":["import { Icon } from \"@lattice-php/lattice/icons\";\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport * as React from \"react\";\n\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\n\nfunction Checkbox({ className, ...props }: React.ComponentProps<typeof CheckboxPrimitive.Root>) {\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n \"peer border-lt-input data-[state=checked]:bg-lt-primary data-[state=checked]:text-lt-primary-fg data-[state=checked]:border-lt-primary focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 aria-invalid:ring-lt-danger/20 dark:aria-invalid:ring-lt-danger/40 aria-invalid:border-lt-danger size-4 shrink-0 rounded-lt-xs border shadow-lt-xs transition-shadow outline-none focus-visible:ring-[
|
|
1
|
+
{"version":3,"file":"checkbox.js","names":[],"sources":["../../resources/js/ui/checkbox.tsx"],"sourcesContent":["import { Icon } from \"@lattice-php/lattice/icons\";\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport * as React from \"react\";\n\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\n\nfunction Checkbox({ className, ...props }: React.ComponentProps<typeof CheckboxPrimitive.Root>) {\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n \"peer border-lt-input data-[state=checked]:bg-lt-primary data-[state=checked]:text-lt-primary-fg data-[state=checked]:border-lt-primary focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 aria-invalid:ring-lt-danger/20 dark:aria-invalid:ring-lt-danger/40 aria-invalid:border-lt-danger size-4 shrink-0 rounded-lt-xs border shadow-lt-xs transition-shadow outline-none focus-visible:ring-[length:var(--lt-ring-width)] disabled:cursor-not-allowed disabled:bg-lt-disabled disabled:text-lt-disabled-fg disabled:data-[state=checked]:bg-lt-disabled disabled:data-[state=checked]:text-lt-disabled-fg disabled:data-[state=checked]:border-lt-disabled\",\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"flex items-center justify-center text-current transition-none\"\n >\n <Icon name=\"check\" className=\"size-lt-icon-sm\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n}\n\nexport { Checkbox };\n"],"mappings":";;;;;;AAMA,SAAS,SAAS,EAAE,WAAW,GAAG,SAA8D;CAC9F,OACE,oBAAC,kBAAkB,MAAnB;EACE,aAAU;EACV,WAAW,GACT,yoBACA,SACF;EACA,GAAI;YAEJ,oBAAC,kBAAkB,WAAnB;GACE,aAAU;GACV,WAAU;aAEV,oBAAC,MAAD;IAAM,MAAK;IAAQ,WAAU;GAAmB,CAAA;EACrB,CAAA;CACP,CAAA;AAE5B"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export declare function ConfirmDialog({ title, description, confirmLabel, cancelLabel, confirmVariant, processing, confirmDisabled, onConfirm, onCancel, }: {
|
|
1
|
+
import { Emphasis, Variant } from '../types/generated.js';
|
|
2
|
+
export declare function ConfirmDialog({ title, description, confirmLabel, cancelLabel, confirmVariant, confirmEmphasis, processing, confirmDisabled, onConfirm, onCancel, }: {
|
|
3
3
|
title: string;
|
|
4
4
|
description?: string;
|
|
5
5
|
confirmLabel: string;
|
|
6
6
|
cancelLabel?: string;
|
|
7
|
-
confirmVariant?:
|
|
7
|
+
confirmVariant?: Variant | null;
|
|
8
|
+
confirmEmphasis?: Emphasis | null;
|
|
8
9
|
processing?: boolean;
|
|
9
10
|
confirmDisabled?: boolean;
|
|
10
11
|
onConfirm: () => void;
|
|
@@ -3,7 +3,7 @@ import { Dialog, DialogContent, DialogDescription, DialogTitle } from "./dialog.
|
|
|
3
3
|
import { Spinner } from "./spinner.js";
|
|
4
4
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
5
|
//#region resources/js/ui/confirm-dialog.tsx
|
|
6
|
-
function ConfirmDialog({ title, description, confirmLabel, cancelLabel = "Cancel", confirmVariant =
|
|
6
|
+
function ConfirmDialog({ title, description, confirmLabel, cancelLabel = "Cancel", confirmVariant = null, confirmEmphasis = null, processing = false, confirmDisabled = false, onConfirm, onCancel }) {
|
|
7
7
|
const blockWhileProcessing = (event) => {
|
|
8
8
|
if (processing) event.preventDefault();
|
|
9
9
|
};
|
|
@@ -24,13 +24,14 @@ function ConfirmDialog({ title, description, confirmLabel, cancelLabel = "Cancel
|
|
|
24
24
|
className: "mt-6 flex justify-end gap-2",
|
|
25
25
|
children: [/* @__PURE__ */ jsx(Button, {
|
|
26
26
|
type: "button",
|
|
27
|
-
|
|
27
|
+
emphasis: "outline",
|
|
28
28
|
"data-test": "confirm-cancel",
|
|
29
29
|
disabled: processing,
|
|
30
30
|
onClick: onCancel,
|
|
31
31
|
children: cancelLabel
|
|
32
32
|
}), /* @__PURE__ */ jsxs(Button, {
|
|
33
33
|
type: "button",
|
|
34
|
+
emphasis: confirmEmphasis,
|
|
34
35
|
variant: confirmVariant,
|
|
35
36
|
"data-test": "confirm-accept",
|
|
36
37
|
disabled: processing || confirmDisabled,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"confirm-dialog.js","names":[],"sources":["../../resources/js/ui/confirm-dialog.tsx"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"confirm-dialog.js","names":[],"sources":["../../resources/js/ui/confirm-dialog.tsx"],"sourcesContent":["import type { Emphasis, Variant } from \"@lattice-php/lattice/types/generated\";\nimport { Button } from \"./button\";\nimport { Dialog, DialogContent, DialogDescription, DialogTitle } from \"./dialog\";\nimport { Spinner } from \"./spinner\";\n\nexport function ConfirmDialog({\n title,\n description,\n confirmLabel,\n cancelLabel = \"Cancel\",\n confirmVariant = null,\n confirmEmphasis = null,\n processing = false,\n confirmDisabled = false,\n onConfirm,\n onCancel,\n}: {\n title: string;\n description?: string;\n confirmLabel: string;\n cancelLabel?: string;\n confirmVariant?: Variant | null;\n confirmEmphasis?: Emphasis | null;\n processing?: boolean;\n confirmDisabled?: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n}) {\n const blockWhileProcessing = (event: Event): void => {\n if (processing) {\n event.preventDefault();\n }\n };\n\n return (\n <Dialog\n open\n onOpenChange={(open) => {\n if (!open) {\n onCancel();\n }\n }}\n >\n <DialogContent\n {...(description ? {} : { \"aria-describedby\": undefined })}\n width=\"md\"\n onEscapeKeyDown={blockWhileProcessing}\n onInteractOutside={blockWhileProcessing}\n >\n <div className=\"grid gap-2\">\n <DialogTitle>{title}</DialogTitle>\n {description && <DialogDescription>{description}</DialogDescription>}\n </div>\n <div className=\"mt-6 flex justify-end gap-2\">\n <Button\n type=\"button\"\n emphasis=\"outline\"\n data-test=\"confirm-cancel\"\n disabled={processing}\n onClick={onCancel}\n >\n {cancelLabel}\n </Button>\n <Button\n type=\"button\"\n emphasis={confirmEmphasis}\n variant={confirmVariant}\n data-test=\"confirm-accept\"\n disabled={processing || confirmDisabled}\n onClick={onConfirm}\n >\n {processing && <Spinner />}\n {confirmLabel}\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":";;;;;AAKA,SAAgB,cAAc,EAC5B,OACA,aACA,cACA,cAAc,UACd,iBAAiB,MACjB,kBAAkB,MAClB,aAAa,OACb,kBAAkB,OAClB,WACA,YAYC;CACD,MAAM,wBAAwB,UAAuB;EACnD,IAAI,YACF,MAAM,eAAe;CAEzB;CAEA,OACE,oBAAC,QAAD;EACE,MAAA;EACA,eAAe,SAAS;GACtB,IAAI,CAAC,MACH,SAAS;EAEb;YAEA,qBAAC,eAAD;GACE,GAAK,cAAc,CAAC,IAAI,EAAE,oBAAoB,KAAA,EAAU;GACxD,OAAM;GACN,iBAAiB;GACjB,mBAAmB;aAJrB,CAME,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,aAAD,EAAA,UAAc,MAAmB,CAAA,GAChC,eAAe,oBAAC,mBAAD,EAAA,UAAoB,YAA+B,CAAA,CAChE;OACL,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,QAAD;KACE,MAAK;KACL,UAAS;KACT,aAAU;KACV,UAAU;KACV,SAAS;eAER;IACK,CAAA,GACR,qBAAC,QAAD;KACE,MAAK;KACL,UAAU;KACV,SAAS;KACT,aAAU;KACV,UAAU,cAAc;KACxB,SAAS;eANX,CAQG,cAAc,oBAAC,SAAD,CAAU,CAAA,GACxB,YACK;MACL;KACQ;;CACT,CAAA;AAEZ"}
|
package/dist/ui/control.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const FOCUS_RING = "focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 focus-visible:ring-[
|
|
1
|
+
export declare const FOCUS_RING = "focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 focus-visible:ring-[length:var(--lt-ring-width)] focus-visible:ring-offset-[length:var(--lt-ring-offset)]";
|
|
2
2
|
/**
|
|
3
3
|
* The shared chrome for single-line form/table controls (text inputs, native
|
|
4
4
|
* selects, and the Select/filter trigger buttons). `density` is the only axis
|
package/dist/ui/control.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { cva } from "class-variance-authority";
|
|
2
2
|
//#region resources/js/ui/control.ts
|
|
3
|
-
var FOCUS_RING = "focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 focus-visible:ring-[
|
|
3
|
+
var FOCUS_RING = "focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 focus-visible:ring-[length:var(--lt-ring-width)] focus-visible:ring-offset-[length:var(--lt-ring-offset)]";
|
|
4
4
|
/**
|
|
5
5
|
* The shared chrome for single-line form/table controls (text inputs, native
|
|
6
6
|
* selects, and the Select/filter trigger buttons). `density` is the only axis
|
package/dist/ui/control.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control.js","names":[],"sources":["../../resources/js/ui/control.ts"],"sourcesContent":["import { cva } from \"class-variance-authority\";\n\nexport const FOCUS_RING =\n \"focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 focus-visible:ring-[
|
|
1
|
+
{"version":3,"file":"control.js","names":[],"sources":["../../resources/js/ui/control.ts"],"sourcesContent":["import { cva } from \"class-variance-authority\";\n\nexport const FOCUS_RING =\n \"focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 focus-visible:ring-[length:var(--lt-ring-width)] focus-visible:ring-offset-[length:var(--lt-ring-offset)]\";\n\n/**\n * The shared chrome for single-line form/table controls (text inputs, native\n * selects, and the Select/filter trigger buttons). `density` is the only axis\n * that differs between forms (comfortable) and table filters (compact); the\n * border, focus ring, invalid, and disabled treatment are unified.\n */\nexport const controlSurface = cva(\n [\n \"w-full min-w-0 rounded-lt-sm border border-lt-input shadow-lt-xs outline-none transition-[color,box-shadow]\",\n \"placeholder:text-lt-muted-fg\",\n FOCUS_RING,\n \"aria-invalid:border-lt-danger aria-invalid:ring-lt-danger/20 dark:aria-invalid:ring-lt-danger/40\",\n \"disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-lt-disabled disabled:text-lt-disabled-fg\",\n ],\n {\n variants: {\n density: {\n comfortable: \"h-lt-control-md bg-transparent px-3 py-1 text-base\",\n compact: \"h-lt-control-md bg-lt-bg px-2 text-sm font-normal\",\n },\n },\n defaultVariants: { density: \"comfortable\" },\n },\n);\n"],"mappings":";;AAEA,IAAa,aACX;;;;;;;AAQF,IAAa,iBAAiB,IAC5B;CACE;CACA;CACA;CACA;CACA;AACF,GACA;CACE,UAAU,EACR,SAAS;EACP,aAAa;EACb,SAAS;CACX,EACF;CACA,iBAAiB,EAAE,SAAS,cAAc;AAC5C,CACF"}
|
package/dist/ui/dialog.js
CHANGED
|
@@ -84,7 +84,7 @@ function DialogHeader({ closeLabel, description, title }) {
|
|
|
84
84
|
"aria-label": closeLabel,
|
|
85
85
|
"data-test": "dialog-close",
|
|
86
86
|
size: "icon",
|
|
87
|
-
|
|
87
|
+
emphasis: "ghost",
|
|
88
88
|
children: /* @__PURE__ */ jsx(Icon, {
|
|
89
89
|
name: "x",
|
|
90
90
|
"aria-hidden": "true",
|