@zovaris/sephiro 0.5.0 → 0.6.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/README.md +1 -1
- package/dist/components.css +6 -14
- package/dist/index.css +44 -27
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/themes.css +38 -13
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -36,7 +36,7 @@ Sephiro to Tailwind's source scan.
|
|
|
36
36
|
</main>
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
-
Available presets: `dark`, `light`, `asterism`, `fizza`, and `pulso`. The
|
|
39
|
+
Available presets: `default`, `dark`, `light`, `asterism`, `fizza`, and `pulso`. The default, dark, and light presets use the pine-rose palette; Pulso remains light by default with a forest-green accent and follows `data-theme="dark"` from its own element or an ancestor. Multiple themes can coexist on one page through `data-sephiro-theme` on any ancestor.
|
|
40
40
|
|
|
41
41
|
## Sizing
|
|
42
42
|
|
package/dist/components.css
CHANGED
|
@@ -1017,15 +1017,9 @@
|
|
|
1017
1017
|
white-space: nowrap;
|
|
1018
1018
|
}
|
|
1019
1019
|
.sph-select__caret {
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
border-bottom: 1.5px solid currentColor;
|
|
1024
|
-
transform: translateY(-2px) rotate(45deg);
|
|
1025
|
-
transition: transform var(--sph-motion-fast) var(--sph-ease-standard);
|
|
1026
|
-
}
|
|
1027
|
-
.sph-select__trigger[aria-expanded="true"] .sph-select__caret {
|
|
1028
|
-
transform: translateY(2px) rotate(225deg);
|
|
1020
|
+
flex: 0 0 auto;
|
|
1021
|
+
font-size: 18px;
|
|
1022
|
+
transition: color var(--sph-motion-fast) var(--sph-ease-standard);
|
|
1029
1023
|
}
|
|
1030
1024
|
.sph-select__trigger:disabled {
|
|
1031
1025
|
opacity: 50%;
|
|
@@ -1082,11 +1076,9 @@
|
|
|
1082
1076
|
cursor: not-allowed;
|
|
1083
1077
|
}
|
|
1084
1078
|
.sph-select__check {
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
border-bottom: 2px solid var(--sph-accent);
|
|
1089
|
-
transform: rotate(-45deg);
|
|
1079
|
+
flex: 0 0 auto;
|
|
1080
|
+
color: var(--sph-accent);
|
|
1081
|
+
font-size: 18px;
|
|
1090
1082
|
}
|
|
1091
1083
|
@media (prefers-reduced-motion: reduce) {
|
|
1092
1084
|
.sph-select__trigger, .sph-select__caret {
|
package/dist/index.css
CHANGED
|
@@ -36,32 +36,57 @@
|
|
|
36
36
|
--sph-control-height-lg: 40px;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
[data-sephiro-theme="default"],
|
|
40
|
+
[data-sephiro-theme="dark"] {
|
|
41
|
+
--sph-bg: #211719;
|
|
42
|
+
--sph-surface: #2a1d20;
|
|
43
|
+
--sph-surface-elevated: #342428;
|
|
44
|
+
--sph-raised: #3a292e;
|
|
45
|
+
--sph-border: #513b42;
|
|
46
|
+
--sph-border-strong: #9d6475;
|
|
47
|
+
--sph-text: #f6edf0;
|
|
48
|
+
--sph-text-muted: #cbb9be;
|
|
49
|
+
--sph-accent: #b85c79;
|
|
50
|
+
--sph-accent-hover: #c96c89;
|
|
51
|
+
--sph-accent-pressed: #9f4c67;
|
|
52
|
+
--sph-accent-soft: color-mix(in srgb, var(--sph-accent) 18%, transparent);
|
|
53
|
+
--sph-accent-strong: #e39aae;
|
|
54
|
+
--sph-on-accent: #ffffff;
|
|
55
|
+
--sph-success: #78b894;
|
|
56
|
+
--sph-warning: #e0b468;
|
|
57
|
+
--sph-danger: #e47b78;
|
|
58
|
+
--sph-focus: #e39aae;
|
|
59
|
+
--sph-focus-ring: color-mix(in srgb, var(--sph-accent) 24%, transparent);
|
|
60
|
+
--sph-shadow-popover: 0 14px 36px rgb(0 0 0 / 0.38);
|
|
61
|
+
color-scheme: dark;
|
|
62
|
+
}
|
|
63
|
+
|
|
39
64
|
:where([data-sephiro-theme="default"], [data-sephiro-theme="dark"]) {
|
|
40
65
|
color-scheme: dark;
|
|
41
66
|
}
|
|
42
67
|
|
|
43
68
|
[data-sephiro-theme="light"] {
|
|
44
|
-
--sph-bg: #
|
|
45
|
-
--sph-surface: #
|
|
69
|
+
--sph-bg: #f8f1f2;
|
|
70
|
+
--sph-surface: #fffafb;
|
|
46
71
|
--sph-surface-elevated: #ffffff;
|
|
47
|
-
--sph-raised: #
|
|
48
|
-
--sph-border: #
|
|
49
|
-
--sph-border-strong: #
|
|
50
|
-
--sph-text: #
|
|
51
|
-
--sph-text-muted: #
|
|
52
|
-
--sph-accent: #
|
|
53
|
-
--sph-accent-hover: #
|
|
54
|
-
--sph-accent-pressed: #
|
|
55
|
-
--sph-accent-strong: #
|
|
72
|
+
--sph-raised: #f2e4e8;
|
|
73
|
+
--sph-border: #dfcbd1;
|
|
74
|
+
--sph-border-strong: #b98797;
|
|
75
|
+
--sph-text: #2b2023;
|
|
76
|
+
--sph-text-muted: #6d5b61;
|
|
77
|
+
--sph-accent: #a84f6d;
|
|
78
|
+
--sph-accent-hover: #923f5b;
|
|
79
|
+
--sph-accent-pressed: #7c334c;
|
|
80
|
+
--sph-accent-strong: #8f3f5b;
|
|
56
81
|
--sph-accent-soft: color-mix(in srgb, var(--sph-accent) 13%, transparent);
|
|
57
82
|
--sph-on-accent: #ffffff;
|
|
58
|
-
--sph-success: #
|
|
83
|
+
--sph-success: #39734d;
|
|
59
84
|
--sph-success-soft: color-mix(in srgb, var(--sph-success) 12%, transparent);
|
|
60
85
|
--sph-warning: #805b17;
|
|
61
86
|
--sph-warning-soft: color-mix(in srgb, var(--sph-warning) 12%, transparent);
|
|
62
87
|
--sph-danger: #a43d3d;
|
|
63
88
|
--sph-danger-soft: color-mix(in srgb, var(--sph-danger) 12%, transparent);
|
|
64
|
-
--sph-focus: #
|
|
89
|
+
--sph-focus: #a84f6d;
|
|
65
90
|
--sph-focus-ring: color-mix(in srgb, var(--sph-accent) 18%, transparent);
|
|
66
91
|
--sph-shadow-popover: 0 14px 36px rgb(32 42 31 / 0.14);
|
|
67
92
|
color-scheme: light;
|
|
@@ -1191,15 +1216,9 @@
|
|
|
1191
1216
|
white-space: nowrap;
|
|
1192
1217
|
}
|
|
1193
1218
|
.sph-select__caret {
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
border-bottom: 1.5px solid currentColor;
|
|
1198
|
-
transform: translateY(-2px) rotate(45deg);
|
|
1199
|
-
transition: transform var(--sph-motion-fast) var(--sph-ease-standard);
|
|
1200
|
-
}
|
|
1201
|
-
.sph-select__trigger[aria-expanded="true"] .sph-select__caret {
|
|
1202
|
-
transform: translateY(2px) rotate(225deg);
|
|
1219
|
+
flex: 0 0 auto;
|
|
1220
|
+
font-size: 18px;
|
|
1221
|
+
transition: color var(--sph-motion-fast) var(--sph-ease-standard);
|
|
1203
1222
|
}
|
|
1204
1223
|
.sph-select__trigger:disabled {
|
|
1205
1224
|
opacity: 50%;
|
|
@@ -1256,11 +1275,9 @@
|
|
|
1256
1275
|
cursor: not-allowed;
|
|
1257
1276
|
}
|
|
1258
1277
|
.sph-select__check {
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
border-bottom: 2px solid var(--sph-accent);
|
|
1263
|
-
transform: rotate(-45deg);
|
|
1278
|
+
flex: 0 0 auto;
|
|
1279
|
+
color: var(--sph-accent);
|
|
1280
|
+
font-size: 18px;
|
|
1264
1281
|
}
|
|
1265
1282
|
@media (prefers-reduced-motion: reduce) {
|
|
1266
1283
|
.sph-select__trigger, .sph-select__caret {
|
package/dist/index.js
CHANGED
|
@@ -864,6 +864,7 @@ function RadioGroup({
|
|
|
864
864
|
}
|
|
865
865
|
|
|
866
866
|
// src/molecules/Select/index.tsx
|
|
867
|
+
import { CaretDownIcon, CaretUpIcon, CheckIcon as CheckIcon3 } from "@phosphor-icons/react";
|
|
867
868
|
import { cn as cn21 } from "cn";
|
|
868
869
|
import { useEffect as useEffect4, useId as useId7, useRef as useRef4, useState as useState3 } from "react";
|
|
869
870
|
import { jsx as jsx21, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
@@ -963,7 +964,7 @@ function Select({
|
|
|
963
964
|
onKeyDown: handleKeyDown,
|
|
964
965
|
children: [
|
|
965
966
|
/* @__PURE__ */ jsx21("span", { className: "sph-select__value", children: node(selected?.label ?? placeholder) }),
|
|
966
|
-
/* @__PURE__ */ jsx21("
|
|
967
|
+
open ? /* @__PURE__ */ jsx21(CaretUpIcon, { className: "sph-select__caret", "aria-hidden": "true" }) : /* @__PURE__ */ jsx21(CaretDownIcon, { className: "sph-select__caret", "aria-hidden": "true" })
|
|
967
968
|
]
|
|
968
969
|
}
|
|
969
970
|
),
|
|
@@ -981,7 +982,7 @@ function Select({
|
|
|
981
982
|
onClick: () => choose(index),
|
|
982
983
|
children: [
|
|
983
984
|
/* @__PURE__ */ jsx21("span", { children: node(option.label) }),
|
|
984
|
-
index === selectedIndex && /* @__PURE__ */ jsx21(
|
|
985
|
+
index === selectedIndex && /* @__PURE__ */ jsx21(CheckIcon3, { className: "sph-select__check", "aria-hidden": "true" })
|
|
985
986
|
]
|
|
986
987
|
},
|
|
987
988
|
option.value
|
|
@@ -1080,7 +1081,7 @@ function Tabs({
|
|
|
1080
1081
|
}
|
|
1081
1082
|
|
|
1082
1083
|
// src/molecules/Toast/index.tsx
|
|
1083
|
-
import { CheckIcon as
|
|
1084
|
+
import { CheckIcon as CheckIcon4, InfoIcon as InfoIcon2, WarningIcon as WarningIcon2, XIcon as XIcon3 } from "@phosphor-icons/react";
|
|
1084
1085
|
import { cn as cn23 } from "cn";
|
|
1085
1086
|
import { useEffect as useEffect5 } from "react";
|
|
1086
1087
|
import {
|
|
@@ -1089,7 +1090,7 @@ import {
|
|
|
1089
1090
|
} from "sonner";
|
|
1090
1091
|
import { jsx as jsx23 } from "react/jsx-runtime";
|
|
1091
1092
|
var toastIcons = {
|
|
1092
|
-
success: /* @__PURE__ */ jsx23("span", { className: "sph-toast__status-icon", children: /* @__PURE__ */ jsx23(
|
|
1093
|
+
success: /* @__PURE__ */ jsx23("span", { className: "sph-toast__status-icon", children: /* @__PURE__ */ jsx23(CheckIcon4, { size: 20 }) }),
|
|
1093
1094
|
info: /* @__PURE__ */ jsx23("span", { className: "sph-toast__status-icon", children: /* @__PURE__ */ jsx23(InfoIcon2, { size: 20 }) }),
|
|
1094
1095
|
warning: /* @__PURE__ */ jsx23("span", { className: "sph-toast__status-icon", children: /* @__PURE__ */ jsx23(WarningIcon2, { size: 20 }) }),
|
|
1095
1096
|
error: /* @__PURE__ */ jsx23("span", { className: "sph-toast__status-icon", children: /* @__PURE__ */ jsx23(XIcon3, { size: 20 }) })
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/atoms/Badge/index.tsx","../src/lib/node.ts","../src/atoms/Button/index.tsx","../src/atoms/Spinner/index.tsx","../src/atoms/Checkbox/index.tsx","../src/atoms/IconButton/index.tsx","../src/atoms/Input/index.tsx","../src/atoms/Separator/index.tsx","../src/atoms/Skeleton/index.tsx","../src/atoms/Slider/index.tsx","../src/atoms/Surface/index.tsx","../src/atoms/Textarea/index.tsx","../src/atoms/Toggle/index.tsx","../src/molecules/Alert/index.tsx","../src/molecules/Card/index.tsx","../src/molecules/Dialog/index.tsx","../src/molecules/Field/index.tsx","../src/molecules/FieldMessage/index.tsx","../src/molecules/Menu/index.tsx","../src/molecules/Popover/index.tsx","../src/molecules/RadioGroup/index.tsx","../src/molecules/Select/index.tsx","../src/molecules/Tabs/index.tsx","../src/molecules/Toast/index.tsx","../src/molecules/Toolbar/index.tsx","../src/molecules/Tooltip/index.tsx","../src/organisms/EmptyState/index.tsx","../src/organisms/Table/index.tsx"],"sourcesContent":["import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type BadgeProps = Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> & {\n variant?: \"neutral\" | \"accent\" | \"success\" | \"warning\" | \"danger\";\n size?: ControlSize;\n children?: Renderable;\n};\n\nexport function Badge({\n variant = \"neutral\",\n size = \"sm\",\n className,\n children,\n ...props\n}: BadgeProps) {\n return (\n <span\n {...node(props)}\n className={cn(\"sph-badge\", className)}\n data-variant={variant}\n data-size={size}\n >\n {node(children)}\n </span>\n );\n}\n","export type RenderableElement = {\n type: any;\n props: any;\n key?: any;\n};\n\nexport type Renderable =\n | string\n | number\n | boolean\n | null\n | undefined\n | Iterable<Renderable>\n | RenderableElement;\n\nexport const node = (value: unknown): any => value;\n","import { cn } from \"cn\";\nimport type { ButtonHTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\nimport { Spinner } from \"../Spinner\";\n\nexport type ButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\"\n> & {\n variant?: \"primary\" | \"secondary\" | \"quiet\";\n size?: ControlSize;\n loading?: boolean;\n children?: Renderable;\n};\n\nexport function Button({\n variant = \"secondary\",\n size = \"md\",\n loading = false,\n disabled,\n className,\n type = \"button\",\n children,\n \"aria-busy\": ariaBusy,\n ...props\n}: ButtonProps) {\n return (\n <button\n type={type}\n className={cn(\"sph-button\", className)}\n data-variant={variant}\n data-size={size}\n data-loading={loading || undefined}\n disabled={disabled || loading}\n {...node(props)}\n aria-busy={ariaBusy ?? (loading || undefined)}\n >\n {loading && <Spinner size=\"sm\" />}\n <span className=\"sph-button__label\">{node(children)}</span>\n </button>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type SpinnerProps = HTMLAttributes<HTMLSpanElement> & {\n size?: ControlSize;\n label?: string;\n};\n\nexport function Spinner({\n size = \"md\",\n label,\n className,\n ...props\n}: SpinnerProps) {\n return (\n <span\n {...node(props)}\n className={cn(\"sph-spinner\", `sph-spinner--${size}`, className)}\n role={label ? \"status\" : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n />\n );\n}\n","import { CheckIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { InputHTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type CheckboxProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"size\"\n> & {\n label?: Renderable;\n size?: ControlSize;\n invalid?: boolean;\n};\n\nexport function Checkbox({\n label,\n size = \"md\",\n invalid = false,\n className,\n ...props\n}: CheckboxProps) {\n const control = (\n <input\n {...node(props)}\n type=\"checkbox\"\n className=\"sph-checkbox__input\"\n data-size={size}\n aria-invalid={invalid ? true : props[\"aria-invalid\"]}\n />\n );\n\n if (label === undefined) return control;\n\n return (\n <label className={cn(\"sph-checkbox\", className)} data-size={size}>\n {control}\n <span className=\"sph-checkbox__box\" aria-hidden=\"true\">\n <CheckIcon className=\"sph-checkbox__check\" />\n </span>\n <span className=\"sph-checkbox__label\">{node(label)}</span>\n </label>\n );\n}\n","import { cn } from \"cn\";\nimport type { ButtonHTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\nimport { Spinner } from \"../Spinner\";\n\nexport type IconButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\"\n> & {\n icon: Renderable;\n label: string;\n size?: ControlSize;\n variant?: \"ghost\" | \"solid\" | \"outline\";\n loading?: boolean;\n};\n\nexport function IconButton({\n icon,\n label,\n size = \"md\",\n variant = \"ghost\",\n loading = false,\n disabled,\n className,\n type = \"button\",\n ...props\n}: IconButtonProps) {\n return (\n <button\n {...node(props)}\n type={type}\n className={cn(\"sph-icon-button\", className)}\n data-size={size}\n data-variant={variant}\n data-loading={loading || undefined}\n aria-label={label}\n aria-busy={loading ? true : props[\"aria-busy\"]}\n disabled={disabled || loading}\n >\n {loading ? <Spinner size={size === \"lg\" ? \"md\" : \"sm\"} /> : node(icon)}\n </button>\n );\n}\n","import { cn } from \"cn\";\nimport type { InputHTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type InputProps = Omit<InputHTMLAttributes<HTMLInputElement>, \"size\"> & {\n invalid?: boolean;\n size?: ControlSize;\n};\n\nexport function Input({\n invalid = false,\n size = \"md\",\n className,\n \"aria-invalid\": ariaInvalid,\n ...props\n}: InputProps) {\n return (\n <input\n {...node(props)}\n className={cn(\"sph-input\", className)}\n data-size={size}\n aria-invalid={ariaInvalid ?? (invalid || undefined)}\n />\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\n\nexport type SeparatorProps = Omit<HTMLAttributes<HTMLHRElement>, \"children\"> & {\n orientation?: \"horizontal\" | \"vertical\";\n decorative?: boolean;\n};\n\nexport function Separator({\n orientation = \"horizontal\",\n decorative = true,\n className,\n ...props\n}: SeparatorProps) {\n return (\n <hr\n {...node(props)}\n className={cn(\"sph-separator\", className)}\n data-orientation={orientation}\n role={decorative ? \"presentation\" : \"separator\"}\n aria-orientation={decorative ? undefined : orientation}\n />\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\n\nexport type SkeletonProps = HTMLAttributes<HTMLSpanElement> & {\n width?: string | number;\n height?: string | number;\n};\n\nexport function Skeleton({\n width,\n height,\n className,\n style,\n \"aria-label\": ariaLabel,\n ...props\n}: SkeletonProps) {\n return (\n <span\n {...node(props)}\n className={cn(\"sph-skeleton\", className)}\n style={{ ...style, width, height }}\n aria-hidden={ariaLabel ? undefined : true}\n />\n );\n}\n","import { cn } from \"cn\";\nimport type { CSSProperties, InputHTMLAttributes } from \"react\";\nimport { useId } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type SliderProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n | \"size\"\n | \"type\"\n | \"value\"\n | \"defaultValue\"\n | \"onChange\"\n | \"children\"\n | \"min\"\n | \"max\"\n | \"step\"\n> & {\n value: number;\n onValueChange: (value: number) => void;\n label: Renderable;\n min?: number;\n max?: number;\n step?: number;\n size?: ControlSize;\n valueLabel?: Renderable;\n invalid?: boolean;\n};\n\nexport function Slider({\n value,\n onValueChange,\n label,\n min = 0,\n max = 100,\n step = 1,\n size = \"md\",\n valueLabel,\n invalid = false,\n className,\n disabled,\n style,\n id,\n \"aria-label\": ariaLabel,\n \"aria-valuetext\": ariaValueText,\n \"aria-invalid\": ariaInvalid,\n ...props\n}: SliderProps) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const range = max - min || 1;\n const progress = Math.min(100, Math.max(0, ((value - min) / range) * 100));\n const trackStyle = {\n ...style,\n \"--sph-slider-progress\": `${progress}%`,\n } as CSSProperties;\n\n return (\n <div\n className={cn(\"sph-slider\", className)}\n data-size={size}\n data-disabled={disabled || undefined}\n data-invalid={invalid || undefined}\n >\n <div className=\"sph-slider__head\">\n <label className=\"sph-slider__label\" htmlFor={inputId}>\n {node(label)}\n </label>\n {valueLabel !== undefined && (\n <output\n className=\"sph-slider__value\"\n htmlFor={inputId}\n aria-hidden=\"true\"\n >\n {node(valueLabel)}\n </output>\n )}\n </div>\n <input\n {...node(props)}\n id={inputId}\n type=\"range\"\n className=\"sph-slider__input\"\n min={min}\n max={max}\n step={step}\n value={value}\n disabled={disabled}\n aria-label={ariaLabel}\n aria-valuetext={\n ariaValueText ??\n (typeof valueLabel === \"string\" ? valueLabel : undefined)\n }\n aria-invalid={ariaInvalid ?? (invalid || undefined)}\n style={trackStyle}\n onInput={(event) => onValueChange(Number(event.currentTarget.value))}\n />\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type SurfaceProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> & {\n children?: Renderable;\n tone?: \"base\" | \"elevated\" | \"raised\";\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\";\n};\n\nexport function Surface({\n tone = \"base\",\n padding = \"md\",\n className,\n children,\n ...props\n}: SurfaceProps) {\n return (\n <div\n {...node(props)}\n className={cn(\"sph-surface\", className)}\n data-tone={tone}\n data-padding={padding}\n >\n {node(children)}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { TextareaHTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type TextareaProps = TextareaHTMLAttributes<HTMLTextAreaElement> & {\n invalid?: boolean;\n size?: ControlSize;\n};\n\nexport function Textarea({\n invalid = false,\n size = \"md\",\n className,\n \"aria-invalid\": ariaInvalid,\n ...props\n}: TextareaProps) {\n return (\n <textarea\n {...node(props)}\n className={cn(\"sph-textarea\", className)}\n data-size={size}\n aria-invalid={ariaInvalid ?? (invalid || undefined)}\n />\n );\n}\n","import { cn } from \"cn\";\nimport type { ButtonHTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type ToggleProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"onChange\" | \"onClick\"\n> & {\n checked: boolean;\n onCheckedChange: (checked: boolean) => void;\n label: string;\n size?: ControlSize;\n onClick?: (event: { preventDefault(): void }) => void;\n};\n\nexport function Toggle({\n checked,\n onCheckedChange,\n label,\n className,\n disabled,\n onClick,\n size = \"md\",\n \"aria-checked\": ariaChecked,\n \"aria-label\": ariaLabel = label,\n ...props\n}: ToggleProps) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={ariaChecked ?? checked}\n aria-label={ariaLabel ?? label}\n disabled={disabled}\n className={cn(\"sph-toggle\", className)}\n data-state={checked ? \"checked\" : \"unchecked\"}\n data-size={size}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) onCheckedChange(!checked);\n }}\n {...node(props)}\n >\n <span className=\"sph-toggle__track\">\n <span className=\"sph-toggle__thumb\" />\n </span>\n </button>\n );\n}\n","import { CheckIcon, InfoIcon, WarningIcon, XIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type AlertProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\" | \"title\"\n> & {\n variant?: \"info\" | \"success\" | \"warning\" | \"danger\";\n title?: Renderable;\n children?: Renderable;\n dismissible?: boolean;\n onDismiss?: () => void;\n};\n\nconst alertIcons = {\n info: <InfoIcon size={16} />,\n success: <CheckIcon size={16} />,\n warning: <WarningIcon size={16} />,\n danger: <XIcon size={16} />,\n};\n\nexport function Alert({\n variant = \"info\",\n title,\n children,\n dismissible = false,\n onDismiss,\n className,\n role,\n ...props\n}: AlertProps) {\n if (title === undefined && children === undefined) return null;\n\n return (\n <div\n {...node(props)}\n className={cn(\"sph-alert\", className)}\n data-variant={variant}\n role={role ?? (variant === \"danger\" ? \"alert\" : \"status\")}\n aria-live={\n role ? undefined : variant === \"danger\" ? \"assertive\" : \"polite\"\n }\n >\n <span className=\"sph-alert__icon\" aria-hidden=\"true\">\n {alertIcons[variant]}\n </span>\n <div className=\"sph-alert__body\">\n {title !== undefined && (\n <p className=\"sph-alert__title\">{node(title)}</p>\n )}\n {children !== undefined && (\n <div className=\"sph-alert__content\">{node(children)}</div>\n )}\n </div>\n {dismissible && (\n <button\n type=\"button\"\n className=\"sph-alert__dismiss\"\n aria-label=\"Dismiss notification\"\n onClick={onDismiss}\n >\n <XIcon size={12} aria-hidden=\"true\" />\n </button>\n )}\n </div>\n );\n}\n\nexport const Notice = Alert;\nexport type NoticeProps = AlertProps;\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type CardProps = Omit<\n HTMLAttributes<HTMLElement>,\n \"children\" | \"title\"\n> & {\n title?: Renderable;\n description?: Renderable;\n header?: Renderable;\n footer?: Renderable;\n children?: Renderable;\n interactive?: boolean;\n selected?: boolean;\n};\n\nexport function Card({\n title,\n description,\n header,\n footer,\n children,\n interactive = false,\n selected = false,\n className,\n ...props\n}: CardProps) {\n const hasHeader =\n header !== undefined || title !== undefined || description !== undefined;\n\n return (\n <article\n {...node(props)}\n className={cn(\"sph-card\", className)}\n data-interactive={interactive || undefined}\n data-selected={selected || undefined}\n >\n {hasHeader && (\n <header className=\"sph-card__header\">\n {node(header)}\n {title !== undefined && (\n <h3 className=\"sph-card__title\">{node(title)}</h3>\n )}\n {description !== undefined && (\n <p className=\"sph-card__description\">{node(description)}</p>\n )}\n </header>\n )}\n {children !== undefined && (\n <div className=\"sph-card__content\">{node(children)}</div>\n )}\n {footer !== undefined && (\n <footer className=\"sph-card__footer\">{node(footer)}</footer>\n )}\n </article>\n );\n}\n","import { XIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect, useId, useRef } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type DialogProps = {\n open: boolean;\n onClose: () => void;\n title: Renderable;\n description?: Renderable;\n children?: Renderable;\n footer?: Renderable;\n closeLabel?: string;\n closeOnOverlayClick?: boolean;\n className?: string;\n};\n\nexport function Dialog({\n open,\n onClose,\n title,\n description,\n children,\n footer,\n closeLabel = \"Close dialog\",\n closeOnOverlayClick = true,\n className,\n}: DialogProps) {\n const id = useId();\n const titleId = `${id}-title`;\n const descriptionId = description ? `${id}-description` : undefined;\n const dialogRef = useRef<HTMLElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const dialog = dialogRef.current;\n const focusable = () =>\n Array.from(\n dialog?.querySelectorAll<HTMLElement>(\n \"button, [href], input, select, textarea, [tabindex]:not([tabindex='-1'])\",\n ) ?? [],\n ).filter((element) => !element.hasAttribute(\"disabled\"));\n requestAnimationFrame(() => focusable()[0]?.focus());\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n return;\n }\n if (event.key !== \"Tab\") return;\n const elements = focusable();\n if (elements.length === 0) {\n event.preventDefault();\n return;\n }\n const first = elements[0];\n const last = elements[elements.length - 1];\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [onClose, open]);\n\n if (!open) return null;\n\n return (\n <div\n className=\"sph-dialog__backdrop\"\n role=\"presentation\"\n onMouseDown={(event) => {\n if (closeOnOverlayClick && event.target === event.currentTarget)\n onClose();\n }}\n >\n <section\n ref={dialogRef}\n className={cn(\"sph-dialog\", className)}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n >\n <header className=\"sph-dialog__header\">\n <div className=\"sph-dialog__heading\">\n <h2 id={titleId} className=\"sph-dialog__title\">\n {node(title)}\n </h2>\n {description !== undefined && (\n <p id={descriptionId} className=\"sph-dialog__description\">\n {node(description)}\n </p>\n )}\n </div>\n <button\n type=\"button\"\n className=\"sph-dialog__close\"\n aria-label={closeLabel}\n onClick={onClose}\n >\n <XIcon size={14} aria-hidden=\"true\" />\n </button>\n </header>\n {children !== undefined && (\n <div className=\"sph-dialog__content\">{node(children)}</div>\n )}\n {footer !== undefined && (\n <footer className=\"sph-dialog__footer\">{node(footer)}</footer>\n )}\n </section>\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport { useId } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { FieldMessage, type FieldMessageProps } from \"../FieldMessage\";\n\nexport type FieldProps = {\n label?: Renderable;\n htmlFor?: string;\n description?: Renderable;\n message?: Renderable;\n messageType?: FieldMessageProps[\"variant\"];\n required?: boolean;\n className?: string;\n children?: Renderable;\n};\n\nexport function Field({\n label,\n htmlFor,\n description,\n message,\n messageType = \"hint\",\n required = false,\n className,\n children,\n}: FieldProps) {\n const generatedId = useId();\n const descriptionId = description ? `${generatedId}-description` : undefined;\n const messageId = message ? `${generatedId}-message` : undefined;\n\n return (\n <div className={cn(\"sph-field\", className)}>\n {label !== undefined && (\n <label className=\"sph-field__label\" htmlFor={htmlFor}>\n <span>{node(label)}</span>\n {required && <span className=\"sph-field__required\">Required</span>}\n </label>\n )}\n {description !== undefined && description !== null && (\n <p id={descriptionId} className=\"sph-field__description\">\n {node(description)}\n </p>\n )}\n <div className=\"sph-field__control\">{node(children)}</div>\n {message !== undefined && message !== null && (\n <FieldMessage id={messageId} variant={messageType}>\n {node(message)}\n </FieldMessage>\n )}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type FieldMessageProps = Omit<\n HTMLAttributes<HTMLParagraphElement>,\n \"children\"\n> & {\n variant?: \"hint\" | \"error\" | \"success\";\n children?: Renderable;\n};\n\nexport function FieldMessage({\n variant = \"hint\",\n className,\n children,\n ...props\n}: FieldMessageProps) {\n if (children === undefined || children === null) return null;\n\n return (\n <p\n {...node(props)}\n className={cn(\"sph-field-message\", className)}\n data-variant={variant}\n role={variant === \"error\" ? \"alert\" : undefined}\n >\n {node(children)}\n </p>\n );\n}\n","import { cn } from \"cn\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type MenuItem = {\n value?: string;\n label?: Renderable;\n icon?: Renderable;\n shortcut?: Renderable;\n disabled?: boolean;\n danger?: boolean;\n separator?: boolean;\n};\n\nexport type MenuProps = {\n trigger: Renderable;\n items: MenuItem[];\n onSelect?: (value: string) => void;\n label?: string;\n align?: \"start\" | \"end\";\n disabled?: boolean;\n className?: string;\n};\n\nexport function Menu({\n trigger,\n items,\n onSelect,\n label = \"Open menu\",\n align = \"start\",\n disabled = false,\n className,\n}: MenuProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const menuId = useId();\n const [open, setOpen] = useState(false);\n const enabledIndexes = items.flatMap((item, index) =>\n !item.separator && !item.disabled ? [index] : [],\n );\n const close = () => setOpen(false);\n const focusItem = (index: number) =>\n document.getElementById(`${menuId}-${index}`)?.focus();\n\n useEffect(() => {\n if (!open) return;\n const handlePointerDown = (event: PointerEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) close();\n };\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown);\n }, [open]);\n\n const choose = (item: MenuItem) => {\n if (item.disabled || item.separator || item.value === undefined) return;\n onSelect?.(item.value);\n close();\n };\n\n const handleKeyDown = (event: KeyboardActionEvent) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n close();\n return;\n }\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n setOpen(true);\n const index =\n enabledIndexes[\n event.key === \"ArrowDown\" ? 0 : enabledIndexes.length - 1\n ];\n if (index !== undefined) requestAnimationFrame(() => focusItem(index));\n }\n };\n\n const handleItemKeyDown = (event: KeyboardActionEvent, index: number) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n close();\n rootRef.current\n ?.querySelector<HTMLButtonElement>(\".sph-menu__trigger\")\n ?.focus();\n return;\n }\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n choose(items[index]);\n return;\n }\n if (![\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"].includes(event.key)) return;\n event.preventDefault();\n const current = enabledIndexes.indexOf(index);\n const nextPosition =\n event.key === \"Home\"\n ? 0\n : event.key === \"End\"\n ? enabledIndexes.length - 1\n : (current +\n (event.key === \"ArrowDown\" ? 1 : -1) +\n enabledIndexes.length) %\n enabledIndexes.length;\n const nextIndex = enabledIndexes[nextPosition];\n if (nextIndex !== undefined) focusItem(nextIndex);\n };\n\n return (\n <div id={menuId} ref={rootRef} className={cn(\"sph-menu\", className)}>\n <button\n type=\"button\"\n className=\"sph-menu__trigger\"\n aria-label={label}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n disabled={disabled}\n onClick={() => setOpen((current) => !current)}\n onKeyDown={handleKeyDown}\n >\n {node(trigger)}\n </button>\n {open && (\n <div className=\"sph-menu__content\" data-align={align} role=\"menu\">\n {items.map((item, index) =>\n item.separator ? (\n <div\n key={`separator-${index}`}\n className=\"sph-menu__separator\"\n role=\"separator\"\n />\n ) : (\n <button\n key={item.value ?? `item-${index}`}\n id={`${menuId}-${index}`}\n type=\"button\"\n role=\"menuitem\"\n className=\"sph-menu__item\"\n data-danger={item.danger || undefined}\n disabled={item.disabled}\n onClick={() => choose(item)}\n onKeyDown={(event) => handleItemKeyDown(event, index)}\n >\n <span className=\"sph-menu__item-label\">\n {node(item.icon)}\n <span>{node(item.label)}</span>\n </span>\n {item.shortcut !== undefined && (\n <span className=\"sph-menu__shortcut\">\n {node(item.shortcut)}\n </span>\n )}\n </button>\n ),\n )}\n </div>\n )}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type PopoverProps = {\n trigger: Renderable;\n children: Renderable;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n ariaLabel?: string;\n placement?: \"start\" | \"end\";\n disabled?: boolean;\n className?: string;\n};\n\nexport function Popover({\n trigger,\n children,\n open,\n defaultOpen = false,\n onOpenChange,\n ariaLabel = \"Popover\",\n placement = \"start\",\n disabled = false,\n className,\n}: PopoverProps) {\n const id = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const isOpen = open ?? uncontrolledOpen;\n const setOpen = (next: boolean) => {\n setUncontrolledOpen(next);\n onOpenChange?.(next);\n };\n\n useEffect(() => {\n if (!isOpen) return;\n const handlePointerDown = (event: PointerEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) setOpen(false);\n };\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key === \"Escape\") setOpen(false);\n };\n document.addEventListener(\"pointerdown\", handlePointerDown);\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [isOpen]);\n\n const handleTriggerKeyDown = (event: KeyboardActionEvent) => {\n if (\n event.key === \"ArrowDown\" ||\n event.key === \"Enter\" ||\n event.key === \" \"\n ) {\n event.preventDefault();\n setOpen(true);\n }\n };\n\n return (\n <div\n ref={rootRef}\n className={cn(\"sph-popover\", className)}\n data-open={isOpen || undefined}\n >\n <button\n type=\"button\"\n className=\"sph-popover__trigger\"\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? id : undefined}\n disabled={disabled}\n onClick={() => setOpen(!isOpen)}\n onKeyDown={handleTriggerKeyDown}\n >\n {node(trigger)}\n </button>\n {isOpen && (\n <div\n id={id}\n className=\"sph-popover__content\"\n data-placement={placement}\n role=\"dialog\"\n aria-label={ariaLabel}\n >\n {node(children)}\n </div>\n )}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport { useId } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type RadioOption = {\n value: string;\n label: Renderable;\n description?: Renderable;\n disabled?: boolean;\n};\n\nexport type RadioGroupProps = {\n value: string;\n options: RadioOption[];\n onValueChange: (value: string) => void;\n name: string;\n label?: Renderable;\n description?: Renderable;\n size?: ControlSize;\n orientation?: \"horizontal\" | \"vertical\";\n disabled?: boolean;\n className?: string;\n};\n\nexport function RadioGroup({\n value,\n options,\n onValueChange,\n name,\n label,\n description,\n size = \"md\",\n orientation = \"vertical\",\n disabled = false,\n className,\n}: RadioGroupProps) {\n const groupId = useId();\n const descriptionId = description ? `${groupId}-description` : undefined;\n\n return (\n <fieldset\n className={cn(\"sph-radio-group\", className)}\n data-size={size}\n data-orientation={orientation}\n disabled={disabled}\n aria-describedby={descriptionId}\n >\n {label !== undefined && (\n <legend className=\"sph-radio-group__legend\">{node(label)}</legend>\n )}\n {description !== undefined && (\n <p id={descriptionId} className=\"sph-radio-group__description\">\n {node(description)}\n </p>\n )}\n <div className=\"sph-radio-group__options\">\n {options.map((option, index) => {\n const optionId = `${groupId}-${index}`;\n const optionDescriptionId = option.description\n ? `${optionId}-description`\n : undefined;\n\n return (\n <label\n key={option.value}\n className=\"sph-radio-group__option\"\n data-disabled={option.disabled || undefined}\n >\n <input\n id={optionId}\n type=\"radio\"\n name={name}\n value={option.value}\n checked={value === option.value}\n disabled={disabled || option.disabled}\n aria-describedby={optionDescriptionId}\n onChange={() => onValueChange(option.value)}\n />\n <span className=\"sph-radio-group__control\" aria-hidden=\"true\" />\n <span className=\"sph-radio-group__content\">\n <span className=\"sph-radio-group__label\">\n {node(option.label)}\n </span>\n {option.description !== undefined && (\n <span\n id={optionDescriptionId}\n className=\"sph-radio-group__option-description\"\n >\n {node(option.description)}\n </span>\n )}\n </span>\n </label>\n );\n })}\n </div>\n </fieldset>\n );\n}\n","import { cn } from \"cn\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type SelectOption = {\n value: string;\n label: Renderable;\n disabled?: boolean;\n};\n\nexport type SelectProps = {\n value: string;\n options: SelectOption[];\n onValueChange: (value: string) => void;\n id?: string;\n className?: string;\n placeholder?: Renderable;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n disabled?: boolean;\n size?: ControlSize;\n};\n\nfunction nextEnabled(\n options: SelectOption[],\n start: number,\n direction: 1 | -1,\n) {\n if (options.length === 0) return -1;\n for (let step = 1; step <= options.length; step += 1) {\n const index = (start + step * direction + options.length) % options.length;\n if (!options[index]?.disabled) return index;\n }\n return -1;\n}\n\nexport function Select({\n value,\n options,\n onValueChange,\n id,\n className,\n placeholder = \"Select an option\",\n ariaLabel,\n ariaLabelledBy,\n disabled = false,\n size = \"md\",\n}: SelectProps) {\n const generatedId = useId();\n const triggerId = id ?? `sph-select-${generatedId}`;\n const listboxId = `${triggerId}-listbox`;\n const rootRef = useRef<HTMLDivElement>(null);\n const selectedIndex = options.findIndex((option) => option.value === value);\n const firstEnabled = options.findIndex((option) => !option.disabled);\n const [open, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(\n selectedIndex >= 0 ? selectedIndex : firstEnabled,\n );\n\n useEffect(() => {\n if (!open) return;\n const close = (event: PointerEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) setOpen(false);\n };\n document.addEventListener(\"pointerdown\", close);\n return () => document.removeEventListener(\"pointerdown\", close);\n }, [open]);\n\n useEffect(() => {\n if (!open)\n setActiveIndex(selectedIndex >= 0 ? selectedIndex : firstEnabled);\n }, [firstEnabled, open, selectedIndex]);\n\n function choose(index: number) {\n const option = options[index];\n if (!option || option.disabled) return;\n onValueChange(option.value);\n setOpen(false);\n }\n\n function handleKeyDown(event: KeyboardActionEvent) {\n if (event.key === \"Escape\") {\n setOpen(false);\n return;\n }\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n const next = nextEnabled(\n options,\n activeIndex,\n event.key === \"ArrowDown\" ? 1 : -1,\n );\n setOpen(true);\n if (next >= 0) setActiveIndex(next);\n return;\n }\n if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n const edge =\n event.key === \"Home\" ? firstEnabled : nextEnabled(options, 0, -1);\n setOpen(true);\n if (edge >= 0) setActiveIndex(edge);\n return;\n }\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n if (open) choose(activeIndex);\n else setOpen(true);\n }\n }\n\n const selected = selectedIndex >= 0 ? options[selectedIndex] : undefined;\n\n return (\n <div ref={rootRef} className={cn(\"sph-select\", className)} data-size={size}>\n <button\n id={triggerId}\n type=\"button\"\n className=\"sph-select__trigger\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listboxId : undefined}\n aria-activedescendant={\n open && activeIndex >= 0 ? `${listboxId}-${activeIndex}` : undefined\n }\n disabled={disabled || firstEnabled < 0}\n onClick={() => setOpen((current) => !current)}\n onKeyDown={handleKeyDown}\n >\n <span className=\"sph-select__value\">\n {node(selected?.label ?? placeholder)}\n </span>\n <span className=\"sph-select__caret\" aria-hidden=\"true\" />\n </button>\n\n {open && (\n <div id={listboxId} role=\"listbox\" className=\"sph-select__listbox\">\n {options.map((option, index) => (\n <button\n key={option.value}\n id={`${listboxId}-${index}`}\n type=\"button\"\n role=\"option\"\n aria-selected={index === selectedIndex}\n disabled={option.disabled}\n className=\"sph-select__option\"\n data-active={index === activeIndex || undefined}\n onPointerMove={() => !option.disabled && setActiveIndex(index)}\n onClick={() => choose(index)}\n >\n <span>{node(option.label)}</span>\n {index === selectedIndex && (\n <span className=\"sph-select__check\" aria-hidden=\"true\" />\n )}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport { useId, useState } from \"react\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type TabItem = {\n value: string;\n label: Renderable;\n disabled?: boolean;\n content?: Renderable;\n};\n\nexport type TabsProps = {\n items: TabItem[];\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n children?: Renderable;\n ariaLabel?: string;\n orientation?: \"horizontal\" | \"vertical\";\n className?: string;\n};\n\nfunction firstEnabled(items: TabItem[]) {\n return items.find((item) => !item.disabled)?.value;\n}\n\nexport function Tabs({\n items,\n value,\n defaultValue,\n onValueChange,\n children,\n ariaLabel = \"Tabs\",\n orientation = \"horizontal\",\n className,\n}: TabsProps) {\n const generatedId = useId();\n const [uncontrolledValue, setUncontrolledValue] = useState(\n defaultValue ?? firstEnabled(items) ?? \"\",\n );\n const activeValue = value ?? uncontrolledValue;\n const activeIndex = Math.max(\n 0,\n items.findIndex((item) => item.value === activeValue),\n );\n const activeItem = items[activeIndex];\n const setValue = (nextValue: string) => {\n setUncontrolledValue(nextValue);\n onValueChange?.(nextValue);\n };\n const move = (event: KeyboardActionEvent, index: number) => {\n const direction =\n orientation === \"vertical\"\n ? event.key === \"ArrowDown\"\n ? 1\n : -1\n : event.key === \"ArrowRight\"\n ? 1\n : -1;\n if (\n ![\"ArrowLeft\", \"ArrowRight\", \"ArrowUp\", \"ArrowDown\"].includes(event.key)\n )\n return;\n event.preventDefault();\n for (let step = 1; step <= items.length; step += 1) {\n const next = (index + step * direction + items.length) % items.length;\n if (!items[next]?.disabled) {\n setValue(items[next].value);\n document.getElementById(`${generatedId}-${next}`)?.focus();\n return;\n }\n }\n };\n const panelId = `${generatedId}-panel`;\n\n return (\n <div className={cn(\"sph-tabs\", className)} data-orientation={orientation}>\n <div\n className=\"sph-tabs__list\"\n role=\"tablist\"\n aria-label={ariaLabel}\n aria-orientation={orientation}\n >\n {items.map((item, index) => {\n const selected = item.value === activeValue;\n return (\n <button\n key={item.value}\n id={`${generatedId}-${index}`}\n type=\"button\"\n role=\"tab\"\n className=\"sph-tabs__tab\"\n aria-selected={selected}\n aria-controls={selected ? panelId : undefined}\n tabIndex={selected ? 0 : -1}\n disabled={item.disabled}\n data-selected={selected || undefined}\n onClick={() => !item.disabled && setValue(item.value)}\n onKeyDown={(event) => move(event, index)}\n >\n {node(item.label)}\n </button>\n );\n })}\n </div>\n {activeItem &&\n (activeItem.content !== undefined || children !== undefined) && (\n <div\n id={panelId}\n className=\"sph-tabs__panel\"\n role=\"tabpanel\"\n aria-labelledby={`${generatedId}-${activeIndex}`}\n >\n {node(activeItem.content ?? children)}\n </div>\n )}\n </div>\n );\n}\n","import { CheckIcon, InfoIcon, WarningIcon, XIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect } from \"react\";\nimport {\n type ExternalToast,\n Toaster as SonnerToaster,\n type ToasterProps as SonnerToasterProps,\n toast,\n} from \"sonner\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type { ExternalToast } from \"sonner\";\nexport { toast };\n\nconst toastIcons = {\n success: (\n <span className=\"sph-toast__status-icon\">\n <CheckIcon size={20} />\n </span>\n ),\n info: (\n <span className=\"sph-toast__status-icon\">\n <InfoIcon size={20} />\n </span>\n ),\n warning: (\n <span className=\"sph-toast__status-icon\">\n <WarningIcon size={20} />\n </span>\n ),\n error: (\n <span className=\"sph-toast__status-icon\">\n <XIcon size={20} />\n </span>\n ),\n};\n\nexport type ToastProps = {\n open?: boolean;\n id?: string | number;\n title: Renderable;\n description?: Renderable;\n variant?: \"neutral\" | \"success\" | \"warning\" | \"danger\";\n action?: ExternalToast[\"action\"];\n duration?: number;\n closeButton?: boolean;\n className?: string;\n};\n\nexport function Toast({\n open = true,\n id,\n title,\n description,\n variant = \"neutral\",\n action,\n duration,\n closeButton = true,\n className,\n}: ToastProps) {\n useEffect(() => {\n if (!open) return;\n const options: ExternalToast = {\n id,\n action,\n closeButton,\n description: node(description),\n duration,\n className: cn(\"sph-toast\", className),\n unstyled: true,\n };\n const toastId =\n variant === \"success\"\n ? toast.success(node(title), options)\n : variant === \"warning\"\n ? toast.warning(node(title), options)\n : variant === \"danger\"\n ? toast.error(node(title), options)\n : toast(node(title), options);\n\n return () => {\n toast.dismiss(toastId);\n };\n }, [open, id, action, closeButton, duration, title, description, variant]);\n\n return null;\n}\n\nexport type ToastViewportProps = Omit<\n SonnerToasterProps,\n \"className\" | \"containerAriaLabel\" | \"icons\" | \"toastOptions\"\n> & {\n label?: string;\n className?: string;\n toastOptions?: SonnerToasterProps[\"toastOptions\"];\n};\n\nexport function ToastViewport({\n label = \"Notifications\",\n className,\n toastOptions,\n theme = \"system\",\n position = \"top-right\",\n closeButton = true,\n expand = false,\n ...props\n}: ToastViewportProps) {\n return (\n <SonnerToaster\n {...node(props)}\n theme={theme}\n position={position}\n closeButton={closeButton}\n icons={toastIcons}\n containerAriaLabel={label}\n expand={expand}\n className={cn(\"sph-toast-viewport\", className)}\n toastOptions={{\n ...toastOptions,\n closeButton: toastOptions?.closeButton ?? closeButton,\n closeButtonAriaLabel:\n toastOptions?.closeButtonAriaLabel ?? \"Dismiss notification\",\n className: cn(\"sph-toast\", toastOptions?.className),\n unstyled: true,\n }}\n />\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type ToolbarProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> & {\n label?: string;\n orientation?: \"horizontal\" | \"vertical\";\n size?: ControlSize;\n start?: Renderable;\n end?: Renderable;\n children?: Renderable;\n};\n\nexport function Toolbar({\n label = \"Toolbar\",\n orientation = \"horizontal\",\n size = \"sm\",\n start,\n end,\n children,\n className,\n ...props\n}: ToolbarProps) {\n return (\n <div\n {...node(props)}\n className={cn(\"sph-toolbar\", className)}\n data-orientation={orientation}\n data-size={size}\n role=\"toolbar\"\n aria-label={label}\n aria-orientation={orientation}\n >\n {start !== undefined && (\n <div className=\"sph-toolbar__start\">{node(start)}</div>\n )}\n {children !== undefined && (\n <div className=\"sph-toolbar__content\">{node(children)}</div>\n )}\n {end !== undefined && <div className=\"sph-toolbar__end\">{node(end)}</div>}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport { useId, useRef, useState } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type TooltipProps = {\n content: Renderable;\n children: Renderable;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n delay?: number;\n disabled?: boolean;\n className?: string;\n};\n\nexport function Tooltip({\n content,\n children,\n side = \"top\",\n delay = 400,\n disabled = false,\n className,\n}: TooltipProps) {\n const id = useId();\n const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const [visible, setVisible] = useState(false);\n const show = () => {\n if (disabled) return;\n timerRef.current = setTimeout(() => setVisible(true), delay);\n };\n const hide = () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n setVisible(false);\n };\n\n return (\n <span\n className={cn(\"sph-tooltip\", className)}\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocus={show}\n onBlur={hide}\n >\n <span\n className=\"sph-tooltip__trigger\"\n aria-describedby={visible ? id : undefined}\n >\n {node(children)}\n </span>\n <span\n id={id}\n className=\"sph-tooltip__content\"\n data-side={side}\n data-visible={visible || undefined}\n role=\"tooltip\"\n hidden={!visible}\n >\n {node(content)}\n </span>\n </span>\n );\n}\n","import { TrayIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type EmptyStateProps = Omit<\n HTMLAttributes<HTMLElement>,\n \"children\" | \"title\"\n> & {\n title: Renderable;\n description?: Renderable;\n icon?: Renderable;\n action?: Renderable;\n compact?: boolean;\n};\n\nconst emptyStateDefaultIcon = <TrayIcon size={20} />;\n\nexport function EmptyState({\n title,\n description,\n icon = emptyStateDefaultIcon,\n action,\n compact = false,\n className,\n ...props\n}: EmptyStateProps) {\n return (\n <section\n {...node(props)}\n className={cn(\"sph-empty-state\", className)}\n data-compact={compact || undefined}\n >\n <div className=\"sph-empty-state__icon\" aria-hidden=\"true\">\n {node(icon)}\n </div>\n <h2 className=\"sph-empty-state__title\">{node(title)}</h2>\n {description !== undefined && (\n <p className=\"sph-empty-state__description\">{node(description)}</p>\n )}\n {action !== undefined && (\n <div className=\"sph-empty-state__action\">{node(action)}</div>\n )}\n </section>\n );\n}\n","import { cn } from \"cn\";\nimport type { TableHTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type TableColumn<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> = {\n key: string;\n label: Renderable;\n align?: \"start\" | \"center\" | \"end\";\n width?: string;\n render?: (row: Row, index: number) => Renderable;\n};\n\nexport type TableProps<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> = Omit<\n TableHTMLAttributes<HTMLTableElement>,\n \"children\" | \"rows\" | \"className\" | \"cellPadding\" | \"cellSpacing\"\n> & {\n columns: TableColumn<Row>[];\n rows: Row[];\n caption?: Renderable;\n emptyMessage?: Renderable;\n rowKey?: keyof Row & string;\n density?: \"compact\" | \"comfortable\";\n striped?: boolean;\n stickyHeader?: boolean;\n className?: string;\n};\n\nexport function Table<\n Row extends Record<string, unknown> = Record<string, unknown>,\n>({\n columns,\n rows,\n caption,\n emptyMessage = \"No results\",\n rowKey,\n density = \"comfortable\",\n striped = false,\n stickyHeader = false,\n className,\n ...props\n}: TableProps<Row>) {\n return (\n <div className={cn(\"sph-table-wrap\", className)}>\n <table\n {...node(props)}\n className=\"sph-table\"\n data-density={density}\n data-striped={striped || undefined}\n data-sticky-header={stickyHeader || undefined}\n >\n {caption !== undefined && <caption>{node(caption)}</caption>}\n <thead>\n <tr>\n {columns.map((column) => (\n <th\n key={column.key}\n scope=\"col\"\n data-align={column.align ?? \"start\"}\n style={{ width: column.width }}\n >\n {node(column.label)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.length === 0 ? (\n <tr>\n <td className=\"sph-table__empty\" colSpan={columns.length}>\n {node(emptyMessage)}\n </td>\n </tr>\n ) : (\n rows.map((row, rowIndex) => (\n <tr key={rowKey ? String(row[rowKey]) : rowIndex}>\n {columns.map((column) => (\n <td key={column.key} data-align={column.align ?? \"start\"}>\n {node(\n column.render\n ? column.render(row, rowIndex)\n : row[column.key],\n )}\n </td>\n ))}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n );\n}\n"],"mappings":"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","names":["cn","cn","jsx","cn","jsx","cn","cn","jsx","jsxs","cn","cn","jsx","cn","cn","jsx","cn","cn","jsx","cn","cn","jsx","cn","cn","jsx","jsxs","cn","cn","jsx","cn","cn","jsx","cn","cn","jsx","cn","CheckIcon","cn","jsx","jsxs","CheckIcon","cn","cn","jsx","jsxs","cn","XIcon","cn","useId","jsx","jsxs","useId","cn","XIcon","cn","useId","cn","jsx","cn","jsx","jsxs","useId","cn","cn","useEffect","useId","useRef","jsx","jsxs","useRef","useId","useEffect","cn","cn","useEffect","useId","useRef","useState","jsx","jsxs","useId","useRef","useState","useEffect","cn","cn","useId","jsx","jsxs","useId","cn","cn","useEffect","useId","useRef","useState","jsx","jsxs","useId","useRef","firstEnabled","useState","useEffect","cn","cn","useId","useState","jsx","jsxs","useId","useState","cn","CheckIcon","InfoIcon","WarningIcon","XIcon","cn","useEffect","jsx","jsx","CheckIcon","InfoIcon","WarningIcon","XIcon","useEffect","cn","cn","jsx","jsxs","cn","cn","useId","useRef","useState","jsx","jsxs","useId","useRef","useState","cn","cn","jsx","jsxs","cn","cn","jsx","jsxs","cn"]}
|
|
1
|
+
{"version":3,"sources":["../src/atoms/Badge/index.tsx","../src/lib/node.ts","../src/atoms/Button/index.tsx","../src/atoms/Spinner/index.tsx","../src/atoms/Checkbox/index.tsx","../src/atoms/IconButton/index.tsx","../src/atoms/Input/index.tsx","../src/atoms/Separator/index.tsx","../src/atoms/Skeleton/index.tsx","../src/atoms/Slider/index.tsx","../src/atoms/Surface/index.tsx","../src/atoms/Textarea/index.tsx","../src/atoms/Toggle/index.tsx","../src/molecules/Alert/index.tsx","../src/molecules/Card/index.tsx","../src/molecules/Dialog/index.tsx","../src/molecules/Field/index.tsx","../src/molecules/FieldMessage/index.tsx","../src/molecules/Menu/index.tsx","../src/molecules/Popover/index.tsx","../src/molecules/RadioGroup/index.tsx","../src/molecules/Select/index.tsx","../src/molecules/Tabs/index.tsx","../src/molecules/Toast/index.tsx","../src/molecules/Toolbar/index.tsx","../src/molecules/Tooltip/index.tsx","../src/organisms/EmptyState/index.tsx","../src/organisms/Table/index.tsx"],"sourcesContent":["import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type BadgeProps = Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> & {\n variant?: \"neutral\" | \"accent\" | \"success\" | \"warning\" | \"danger\";\n size?: ControlSize;\n children?: Renderable;\n};\n\nexport function Badge({\n variant = \"neutral\",\n size = \"sm\",\n className,\n children,\n ...props\n}: BadgeProps) {\n return (\n <span\n {...node(props)}\n className={cn(\"sph-badge\", className)}\n data-variant={variant}\n data-size={size}\n >\n {node(children)}\n </span>\n );\n}\n","export type RenderableElement = {\n type: any;\n props: any;\n key?: any;\n};\n\nexport type Renderable =\n | string\n | number\n | boolean\n | null\n | undefined\n | Iterable<Renderable>\n | RenderableElement;\n\nexport const node = (value: unknown): any => value;\n","import { cn } from \"cn\";\nimport type { ButtonHTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\nimport { Spinner } from \"../Spinner\";\n\nexport type ButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\"\n> & {\n variant?: \"primary\" | \"secondary\" | \"quiet\";\n size?: ControlSize;\n loading?: boolean;\n children?: Renderable;\n};\n\nexport function Button({\n variant = \"secondary\",\n size = \"md\",\n loading = false,\n disabled,\n className,\n type = \"button\",\n children,\n \"aria-busy\": ariaBusy,\n ...props\n}: ButtonProps) {\n return (\n <button\n type={type}\n className={cn(\"sph-button\", className)}\n data-variant={variant}\n data-size={size}\n data-loading={loading || undefined}\n disabled={disabled || loading}\n {...node(props)}\n aria-busy={ariaBusy ?? (loading || undefined)}\n >\n {loading && <Spinner size=\"sm\" />}\n <span className=\"sph-button__label\">{node(children)}</span>\n </button>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type SpinnerProps = HTMLAttributes<HTMLSpanElement> & {\n size?: ControlSize;\n label?: string;\n};\n\nexport function Spinner({\n size = \"md\",\n label,\n className,\n ...props\n}: SpinnerProps) {\n return (\n <span\n {...node(props)}\n className={cn(\"sph-spinner\", `sph-spinner--${size}`, className)}\n role={label ? \"status\" : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n />\n );\n}\n","import { CheckIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { InputHTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type CheckboxProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"size\"\n> & {\n label?: Renderable;\n size?: ControlSize;\n invalid?: boolean;\n};\n\nexport function Checkbox({\n label,\n size = \"md\",\n invalid = false,\n className,\n ...props\n}: CheckboxProps) {\n const control = (\n <input\n {...node(props)}\n type=\"checkbox\"\n className=\"sph-checkbox__input\"\n data-size={size}\n aria-invalid={invalid ? true : props[\"aria-invalid\"]}\n />\n );\n\n if (label === undefined) return control;\n\n return (\n <label className={cn(\"sph-checkbox\", className)} data-size={size}>\n {control}\n <span className=\"sph-checkbox__box\" aria-hidden=\"true\">\n <CheckIcon className=\"sph-checkbox__check\" />\n </span>\n <span className=\"sph-checkbox__label\">{node(label)}</span>\n </label>\n );\n}\n","import { cn } from \"cn\";\nimport type { ButtonHTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\nimport { Spinner } from \"../Spinner\";\n\nexport type IconButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\"\n> & {\n icon: Renderable;\n label: string;\n size?: ControlSize;\n variant?: \"ghost\" | \"solid\" | \"outline\";\n loading?: boolean;\n};\n\nexport function IconButton({\n icon,\n label,\n size = \"md\",\n variant = \"ghost\",\n loading = false,\n disabled,\n className,\n type = \"button\",\n ...props\n}: IconButtonProps) {\n return (\n <button\n {...node(props)}\n type={type}\n className={cn(\"sph-icon-button\", className)}\n data-size={size}\n data-variant={variant}\n data-loading={loading || undefined}\n aria-label={label}\n aria-busy={loading ? true : props[\"aria-busy\"]}\n disabled={disabled || loading}\n >\n {loading ? <Spinner size={size === \"lg\" ? \"md\" : \"sm\"} /> : node(icon)}\n </button>\n );\n}\n","import { cn } from \"cn\";\nimport type { InputHTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type InputProps = Omit<InputHTMLAttributes<HTMLInputElement>, \"size\"> & {\n invalid?: boolean;\n size?: ControlSize;\n};\n\nexport function Input({\n invalid = false,\n size = \"md\",\n className,\n \"aria-invalid\": ariaInvalid,\n ...props\n}: InputProps) {\n return (\n <input\n {...node(props)}\n className={cn(\"sph-input\", className)}\n data-size={size}\n aria-invalid={ariaInvalid ?? (invalid || undefined)}\n />\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\n\nexport type SeparatorProps = Omit<HTMLAttributes<HTMLHRElement>, \"children\"> & {\n orientation?: \"horizontal\" | \"vertical\";\n decorative?: boolean;\n};\n\nexport function Separator({\n orientation = \"horizontal\",\n decorative = true,\n className,\n ...props\n}: SeparatorProps) {\n return (\n <hr\n {...node(props)}\n className={cn(\"sph-separator\", className)}\n data-orientation={orientation}\n role={decorative ? \"presentation\" : \"separator\"}\n aria-orientation={decorative ? undefined : orientation}\n />\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\n\nexport type SkeletonProps = HTMLAttributes<HTMLSpanElement> & {\n width?: string | number;\n height?: string | number;\n};\n\nexport function Skeleton({\n width,\n height,\n className,\n style,\n \"aria-label\": ariaLabel,\n ...props\n}: SkeletonProps) {\n return (\n <span\n {...node(props)}\n className={cn(\"sph-skeleton\", className)}\n style={{ ...style, width, height }}\n aria-hidden={ariaLabel ? undefined : true}\n />\n );\n}\n","import { cn } from \"cn\";\nimport type { CSSProperties, InputHTMLAttributes } from \"react\";\nimport { useId } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type SliderProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n | \"size\"\n | \"type\"\n | \"value\"\n | \"defaultValue\"\n | \"onChange\"\n | \"children\"\n | \"min\"\n | \"max\"\n | \"step\"\n> & {\n value: number;\n onValueChange: (value: number) => void;\n label: Renderable;\n min?: number;\n max?: number;\n step?: number;\n size?: ControlSize;\n valueLabel?: Renderable;\n invalid?: boolean;\n};\n\nexport function Slider({\n value,\n onValueChange,\n label,\n min = 0,\n max = 100,\n step = 1,\n size = \"md\",\n valueLabel,\n invalid = false,\n className,\n disabled,\n style,\n id,\n \"aria-label\": ariaLabel,\n \"aria-valuetext\": ariaValueText,\n \"aria-invalid\": ariaInvalid,\n ...props\n}: SliderProps) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const range = max - min || 1;\n const progress = Math.min(100, Math.max(0, ((value - min) / range) * 100));\n const trackStyle = {\n ...style,\n \"--sph-slider-progress\": `${progress}%`,\n } as CSSProperties;\n\n return (\n <div\n className={cn(\"sph-slider\", className)}\n data-size={size}\n data-disabled={disabled || undefined}\n data-invalid={invalid || undefined}\n >\n <div className=\"sph-slider__head\">\n <label className=\"sph-slider__label\" htmlFor={inputId}>\n {node(label)}\n </label>\n {valueLabel !== undefined && (\n <output\n className=\"sph-slider__value\"\n htmlFor={inputId}\n aria-hidden=\"true\"\n >\n {node(valueLabel)}\n </output>\n )}\n </div>\n <input\n {...node(props)}\n id={inputId}\n type=\"range\"\n className=\"sph-slider__input\"\n min={min}\n max={max}\n step={step}\n value={value}\n disabled={disabled}\n aria-label={ariaLabel}\n aria-valuetext={\n ariaValueText ??\n (typeof valueLabel === \"string\" ? valueLabel : undefined)\n }\n aria-invalid={ariaInvalid ?? (invalid || undefined)}\n style={trackStyle}\n onInput={(event) => onValueChange(Number(event.currentTarget.value))}\n />\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type SurfaceProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> & {\n children?: Renderable;\n tone?: \"base\" | \"elevated\" | \"raised\";\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\";\n};\n\nexport function Surface({\n tone = \"base\",\n padding = \"md\",\n className,\n children,\n ...props\n}: SurfaceProps) {\n return (\n <div\n {...node(props)}\n className={cn(\"sph-surface\", className)}\n data-tone={tone}\n data-padding={padding}\n >\n {node(children)}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { TextareaHTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type TextareaProps = TextareaHTMLAttributes<HTMLTextAreaElement> & {\n invalid?: boolean;\n size?: ControlSize;\n};\n\nexport function Textarea({\n invalid = false,\n size = \"md\",\n className,\n \"aria-invalid\": ariaInvalid,\n ...props\n}: TextareaProps) {\n return (\n <textarea\n {...node(props)}\n className={cn(\"sph-textarea\", className)}\n data-size={size}\n aria-invalid={ariaInvalid ?? (invalid || undefined)}\n />\n );\n}\n","import { cn } from \"cn\";\nimport type { ButtonHTMLAttributes } from \"react\";\nimport { node } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type ToggleProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"onChange\" | \"onClick\"\n> & {\n checked: boolean;\n onCheckedChange: (checked: boolean) => void;\n label: string;\n size?: ControlSize;\n onClick?: (event: { preventDefault(): void }) => void;\n};\n\nexport function Toggle({\n checked,\n onCheckedChange,\n label,\n className,\n disabled,\n onClick,\n size = \"md\",\n \"aria-checked\": ariaChecked,\n \"aria-label\": ariaLabel = label,\n ...props\n}: ToggleProps) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={ariaChecked ?? checked}\n aria-label={ariaLabel ?? label}\n disabled={disabled}\n className={cn(\"sph-toggle\", className)}\n data-state={checked ? \"checked\" : \"unchecked\"}\n data-size={size}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) onCheckedChange(!checked);\n }}\n {...node(props)}\n >\n <span className=\"sph-toggle__track\">\n <span className=\"sph-toggle__thumb\" />\n </span>\n </button>\n );\n}\n","import { CheckIcon, InfoIcon, WarningIcon, XIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type AlertProps = Omit<\n HTMLAttributes<HTMLDivElement>,\n \"children\" | \"title\"\n> & {\n variant?: \"info\" | \"success\" | \"warning\" | \"danger\";\n title?: Renderable;\n children?: Renderable;\n dismissible?: boolean;\n onDismiss?: () => void;\n};\n\nconst alertIcons = {\n info: <InfoIcon size={16} />,\n success: <CheckIcon size={16} />,\n warning: <WarningIcon size={16} />,\n danger: <XIcon size={16} />,\n};\n\nexport function Alert({\n variant = \"info\",\n title,\n children,\n dismissible = false,\n onDismiss,\n className,\n role,\n ...props\n}: AlertProps) {\n if (title === undefined && children === undefined) return null;\n\n return (\n <div\n {...node(props)}\n className={cn(\"sph-alert\", className)}\n data-variant={variant}\n role={role ?? (variant === \"danger\" ? \"alert\" : \"status\")}\n aria-live={\n role ? undefined : variant === \"danger\" ? \"assertive\" : \"polite\"\n }\n >\n <span className=\"sph-alert__icon\" aria-hidden=\"true\">\n {alertIcons[variant]}\n </span>\n <div className=\"sph-alert__body\">\n {title !== undefined && (\n <p className=\"sph-alert__title\">{node(title)}</p>\n )}\n {children !== undefined && (\n <div className=\"sph-alert__content\">{node(children)}</div>\n )}\n </div>\n {dismissible && (\n <button\n type=\"button\"\n className=\"sph-alert__dismiss\"\n aria-label=\"Dismiss notification\"\n onClick={onDismiss}\n >\n <XIcon size={12} aria-hidden=\"true\" />\n </button>\n )}\n </div>\n );\n}\n\nexport const Notice = Alert;\nexport type NoticeProps = AlertProps;\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type CardProps = Omit<\n HTMLAttributes<HTMLElement>,\n \"children\" | \"title\"\n> & {\n title?: Renderable;\n description?: Renderable;\n header?: Renderable;\n footer?: Renderable;\n children?: Renderable;\n interactive?: boolean;\n selected?: boolean;\n};\n\nexport function Card({\n title,\n description,\n header,\n footer,\n children,\n interactive = false,\n selected = false,\n className,\n ...props\n}: CardProps) {\n const hasHeader =\n header !== undefined || title !== undefined || description !== undefined;\n\n return (\n <article\n {...node(props)}\n className={cn(\"sph-card\", className)}\n data-interactive={interactive || undefined}\n data-selected={selected || undefined}\n >\n {hasHeader && (\n <header className=\"sph-card__header\">\n {node(header)}\n {title !== undefined && (\n <h3 className=\"sph-card__title\">{node(title)}</h3>\n )}\n {description !== undefined && (\n <p className=\"sph-card__description\">{node(description)}</p>\n )}\n </header>\n )}\n {children !== undefined && (\n <div className=\"sph-card__content\">{node(children)}</div>\n )}\n {footer !== undefined && (\n <footer className=\"sph-card__footer\">{node(footer)}</footer>\n )}\n </article>\n );\n}\n","import { XIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect, useId, useRef } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type DialogProps = {\n open: boolean;\n onClose: () => void;\n title: Renderable;\n description?: Renderable;\n children?: Renderable;\n footer?: Renderable;\n closeLabel?: string;\n closeOnOverlayClick?: boolean;\n className?: string;\n};\n\nexport function Dialog({\n open,\n onClose,\n title,\n description,\n children,\n footer,\n closeLabel = \"Close dialog\",\n closeOnOverlayClick = true,\n className,\n}: DialogProps) {\n const id = useId();\n const titleId = `${id}-title`;\n const descriptionId = description ? `${id}-description` : undefined;\n const dialogRef = useRef<HTMLElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const dialog = dialogRef.current;\n const focusable = () =>\n Array.from(\n dialog?.querySelectorAll<HTMLElement>(\n \"button, [href], input, select, textarea, [tabindex]:not([tabindex='-1'])\",\n ) ?? [],\n ).filter((element) => !element.hasAttribute(\"disabled\"));\n requestAnimationFrame(() => focusable()[0]?.focus());\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n return;\n }\n if (event.key !== \"Tab\") return;\n const elements = focusable();\n if (elements.length === 0) {\n event.preventDefault();\n return;\n }\n const first = elements[0];\n const last = elements[elements.length - 1];\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [onClose, open]);\n\n if (!open) return null;\n\n return (\n <div\n className=\"sph-dialog__backdrop\"\n role=\"presentation\"\n onMouseDown={(event) => {\n if (closeOnOverlayClick && event.target === event.currentTarget)\n onClose();\n }}\n >\n <section\n ref={dialogRef}\n className={cn(\"sph-dialog\", className)}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n >\n <header className=\"sph-dialog__header\">\n <div className=\"sph-dialog__heading\">\n <h2 id={titleId} className=\"sph-dialog__title\">\n {node(title)}\n </h2>\n {description !== undefined && (\n <p id={descriptionId} className=\"sph-dialog__description\">\n {node(description)}\n </p>\n )}\n </div>\n <button\n type=\"button\"\n className=\"sph-dialog__close\"\n aria-label={closeLabel}\n onClick={onClose}\n >\n <XIcon size={14} aria-hidden=\"true\" />\n </button>\n </header>\n {children !== undefined && (\n <div className=\"sph-dialog__content\">{node(children)}</div>\n )}\n {footer !== undefined && (\n <footer className=\"sph-dialog__footer\">{node(footer)}</footer>\n )}\n </section>\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport { useId } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport { FieldMessage, type FieldMessageProps } from \"../FieldMessage\";\n\nexport type FieldProps = {\n label?: Renderable;\n htmlFor?: string;\n description?: Renderable;\n message?: Renderable;\n messageType?: FieldMessageProps[\"variant\"];\n required?: boolean;\n className?: string;\n children?: Renderable;\n};\n\nexport function Field({\n label,\n htmlFor,\n description,\n message,\n messageType = \"hint\",\n required = false,\n className,\n children,\n}: FieldProps) {\n const generatedId = useId();\n const descriptionId = description ? `${generatedId}-description` : undefined;\n const messageId = message ? `${generatedId}-message` : undefined;\n\n return (\n <div className={cn(\"sph-field\", className)}>\n {label !== undefined && (\n <label className=\"sph-field__label\" htmlFor={htmlFor}>\n <span>{node(label)}</span>\n {required && <span className=\"sph-field__required\">Required</span>}\n </label>\n )}\n {description !== undefined && description !== null && (\n <p id={descriptionId} className=\"sph-field__description\">\n {node(description)}\n </p>\n )}\n <div className=\"sph-field__control\">{node(children)}</div>\n {message !== undefined && message !== null && (\n <FieldMessage id={messageId} variant={messageType}>\n {node(message)}\n </FieldMessage>\n )}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type FieldMessageProps = Omit<\n HTMLAttributes<HTMLParagraphElement>,\n \"children\"\n> & {\n variant?: \"hint\" | \"error\" | \"success\";\n children?: Renderable;\n};\n\nexport function FieldMessage({\n variant = \"hint\",\n className,\n children,\n ...props\n}: FieldMessageProps) {\n if (children === undefined || children === null) return null;\n\n return (\n <p\n {...node(props)}\n className={cn(\"sph-field-message\", className)}\n data-variant={variant}\n role={variant === \"error\" ? \"alert\" : undefined}\n >\n {node(children)}\n </p>\n );\n}\n","import { cn } from \"cn\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type MenuItem = {\n value?: string;\n label?: Renderable;\n icon?: Renderable;\n shortcut?: Renderable;\n disabled?: boolean;\n danger?: boolean;\n separator?: boolean;\n};\n\nexport type MenuProps = {\n trigger: Renderable;\n items: MenuItem[];\n onSelect?: (value: string) => void;\n label?: string;\n align?: \"start\" | \"end\";\n disabled?: boolean;\n className?: string;\n};\n\nexport function Menu({\n trigger,\n items,\n onSelect,\n label = \"Open menu\",\n align = \"start\",\n disabled = false,\n className,\n}: MenuProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const menuId = useId();\n const [open, setOpen] = useState(false);\n const enabledIndexes = items.flatMap((item, index) =>\n !item.separator && !item.disabled ? [index] : [],\n );\n const close = () => setOpen(false);\n const focusItem = (index: number) =>\n document.getElementById(`${menuId}-${index}`)?.focus();\n\n useEffect(() => {\n if (!open) return;\n const handlePointerDown = (event: PointerEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) close();\n };\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown);\n }, [open]);\n\n const choose = (item: MenuItem) => {\n if (item.disabled || item.separator || item.value === undefined) return;\n onSelect?.(item.value);\n close();\n };\n\n const handleKeyDown = (event: KeyboardActionEvent) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n close();\n return;\n }\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n setOpen(true);\n const index =\n enabledIndexes[\n event.key === \"ArrowDown\" ? 0 : enabledIndexes.length - 1\n ];\n if (index !== undefined) requestAnimationFrame(() => focusItem(index));\n }\n };\n\n const handleItemKeyDown = (event: KeyboardActionEvent, index: number) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n close();\n rootRef.current\n ?.querySelector<HTMLButtonElement>(\".sph-menu__trigger\")\n ?.focus();\n return;\n }\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n choose(items[index]);\n return;\n }\n if (![\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"].includes(event.key)) return;\n event.preventDefault();\n const current = enabledIndexes.indexOf(index);\n const nextPosition =\n event.key === \"Home\"\n ? 0\n : event.key === \"End\"\n ? enabledIndexes.length - 1\n : (current +\n (event.key === \"ArrowDown\" ? 1 : -1) +\n enabledIndexes.length) %\n enabledIndexes.length;\n const nextIndex = enabledIndexes[nextPosition];\n if (nextIndex !== undefined) focusItem(nextIndex);\n };\n\n return (\n <div id={menuId} ref={rootRef} className={cn(\"sph-menu\", className)}>\n <button\n type=\"button\"\n className=\"sph-menu__trigger\"\n aria-label={label}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n disabled={disabled}\n onClick={() => setOpen((current) => !current)}\n onKeyDown={handleKeyDown}\n >\n {node(trigger)}\n </button>\n {open && (\n <div className=\"sph-menu__content\" data-align={align} role=\"menu\">\n {items.map((item, index) =>\n item.separator ? (\n <div\n key={`separator-${index}`}\n className=\"sph-menu__separator\"\n role=\"separator\"\n />\n ) : (\n <button\n key={item.value ?? `item-${index}`}\n id={`${menuId}-${index}`}\n type=\"button\"\n role=\"menuitem\"\n className=\"sph-menu__item\"\n data-danger={item.danger || undefined}\n disabled={item.disabled}\n onClick={() => choose(item)}\n onKeyDown={(event) => handleItemKeyDown(event, index)}\n >\n <span className=\"sph-menu__item-label\">\n {node(item.icon)}\n <span>{node(item.label)}</span>\n </span>\n {item.shortcut !== undefined && (\n <span className=\"sph-menu__shortcut\">\n {node(item.shortcut)}\n </span>\n )}\n </button>\n ),\n )}\n </div>\n )}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type PopoverProps = {\n trigger: Renderable;\n children: Renderable;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n ariaLabel?: string;\n placement?: \"start\" | \"end\";\n disabled?: boolean;\n className?: string;\n};\n\nexport function Popover({\n trigger,\n children,\n open,\n defaultOpen = false,\n onOpenChange,\n ariaLabel = \"Popover\",\n placement = \"start\",\n disabled = false,\n className,\n}: PopoverProps) {\n const id = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const isOpen = open ?? uncontrolledOpen;\n const setOpen = (next: boolean) => {\n setUncontrolledOpen(next);\n onOpenChange?.(next);\n };\n\n useEffect(() => {\n if (!isOpen) return;\n const handlePointerDown = (event: PointerEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) setOpen(false);\n };\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key === \"Escape\") setOpen(false);\n };\n document.addEventListener(\"pointerdown\", handlePointerDown);\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [isOpen]);\n\n const handleTriggerKeyDown = (event: KeyboardActionEvent) => {\n if (\n event.key === \"ArrowDown\" ||\n event.key === \"Enter\" ||\n event.key === \" \"\n ) {\n event.preventDefault();\n setOpen(true);\n }\n };\n\n return (\n <div\n ref={rootRef}\n className={cn(\"sph-popover\", className)}\n data-open={isOpen || undefined}\n >\n <button\n type=\"button\"\n className=\"sph-popover__trigger\"\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? id : undefined}\n disabled={disabled}\n onClick={() => setOpen(!isOpen)}\n onKeyDown={handleTriggerKeyDown}\n >\n {node(trigger)}\n </button>\n {isOpen && (\n <div\n id={id}\n className=\"sph-popover__content\"\n data-placement={placement}\n role=\"dialog\"\n aria-label={ariaLabel}\n >\n {node(children)}\n </div>\n )}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport { useId } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type RadioOption = {\n value: string;\n label: Renderable;\n description?: Renderable;\n disabled?: boolean;\n};\n\nexport type RadioGroupProps = {\n value: string;\n options: RadioOption[];\n onValueChange: (value: string) => void;\n name: string;\n label?: Renderable;\n description?: Renderable;\n size?: ControlSize;\n orientation?: \"horizontal\" | \"vertical\";\n disabled?: boolean;\n className?: string;\n};\n\nexport function RadioGroup({\n value,\n options,\n onValueChange,\n name,\n label,\n description,\n size = \"md\",\n orientation = \"vertical\",\n disabled = false,\n className,\n}: RadioGroupProps) {\n const groupId = useId();\n const descriptionId = description ? `${groupId}-description` : undefined;\n\n return (\n <fieldset\n className={cn(\"sph-radio-group\", className)}\n data-size={size}\n data-orientation={orientation}\n disabled={disabled}\n aria-describedby={descriptionId}\n >\n {label !== undefined && (\n <legend className=\"sph-radio-group__legend\">{node(label)}</legend>\n )}\n {description !== undefined && (\n <p id={descriptionId} className=\"sph-radio-group__description\">\n {node(description)}\n </p>\n )}\n <div className=\"sph-radio-group__options\">\n {options.map((option, index) => {\n const optionId = `${groupId}-${index}`;\n const optionDescriptionId = option.description\n ? `${optionId}-description`\n : undefined;\n\n return (\n <label\n key={option.value}\n className=\"sph-radio-group__option\"\n data-disabled={option.disabled || undefined}\n >\n <input\n id={optionId}\n type=\"radio\"\n name={name}\n value={option.value}\n checked={value === option.value}\n disabled={disabled || option.disabled}\n aria-describedby={optionDescriptionId}\n onChange={() => onValueChange(option.value)}\n />\n <span className=\"sph-radio-group__control\" aria-hidden=\"true\" />\n <span className=\"sph-radio-group__content\">\n <span className=\"sph-radio-group__label\">\n {node(option.label)}\n </span>\n {option.description !== undefined && (\n <span\n id={optionDescriptionId}\n className=\"sph-radio-group__option-description\"\n >\n {node(option.description)}\n </span>\n )}\n </span>\n </label>\n );\n })}\n </div>\n </fieldset>\n );\n}\n","import { CaretDownIcon, CaretUpIcon, CheckIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type SelectOption = {\n value: string;\n label: Renderable;\n disabled?: boolean;\n};\n\nexport type SelectProps = {\n value: string;\n options: SelectOption[];\n onValueChange: (value: string) => void;\n id?: string;\n className?: string;\n placeholder?: Renderable;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n disabled?: boolean;\n size?: ControlSize;\n};\n\nfunction nextEnabled(\n options: SelectOption[],\n start: number,\n direction: 1 | -1,\n) {\n if (options.length === 0) return -1;\n for (let step = 1; step <= options.length; step += 1) {\n const index = (start + step * direction + options.length) % options.length;\n if (!options[index]?.disabled) return index;\n }\n return -1;\n}\n\nexport function Select({\n value,\n options,\n onValueChange,\n id,\n className,\n placeholder = \"Select an option\",\n ariaLabel,\n ariaLabelledBy,\n disabled = false,\n size = \"md\",\n}: SelectProps) {\n const generatedId = useId();\n const triggerId = id ?? `sph-select-${generatedId}`;\n const listboxId = `${triggerId}-listbox`;\n const rootRef = useRef<HTMLDivElement>(null);\n const selectedIndex = options.findIndex((option) => option.value === value);\n const firstEnabled = options.findIndex((option) => !option.disabled);\n const [open, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(\n selectedIndex >= 0 ? selectedIndex : firstEnabled,\n );\n\n useEffect(() => {\n if (!open) return;\n const close = (event: PointerEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) setOpen(false);\n };\n document.addEventListener(\"pointerdown\", close);\n return () => document.removeEventListener(\"pointerdown\", close);\n }, [open]);\n\n useEffect(() => {\n if (!open)\n setActiveIndex(selectedIndex >= 0 ? selectedIndex : firstEnabled);\n }, [firstEnabled, open, selectedIndex]);\n\n function choose(index: number) {\n const option = options[index];\n if (!option || option.disabled) return;\n onValueChange(option.value);\n setOpen(false);\n }\n\n function handleKeyDown(event: KeyboardActionEvent) {\n if (event.key === \"Escape\") {\n setOpen(false);\n return;\n }\n if (event.key === \"ArrowDown\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n const next = nextEnabled(\n options,\n activeIndex,\n event.key === \"ArrowDown\" ? 1 : -1,\n );\n setOpen(true);\n if (next >= 0) setActiveIndex(next);\n return;\n }\n if (event.key === \"Home\" || event.key === \"End\") {\n event.preventDefault();\n const edge =\n event.key === \"Home\" ? firstEnabled : nextEnabled(options, 0, -1);\n setOpen(true);\n if (edge >= 0) setActiveIndex(edge);\n return;\n }\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n if (open) choose(activeIndex);\n else setOpen(true);\n }\n }\n\n const selected = selectedIndex >= 0 ? options[selectedIndex] : undefined;\n\n return (\n <div ref={rootRef} className={cn(\"sph-select\", className)} data-size={size}>\n <button\n id={triggerId}\n type=\"button\"\n className=\"sph-select__trigger\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listboxId : undefined}\n aria-activedescendant={\n open && activeIndex >= 0 ? `${listboxId}-${activeIndex}` : undefined\n }\n disabled={disabled || firstEnabled < 0}\n onClick={() => setOpen((current) => !current)}\n onKeyDown={handleKeyDown}\n >\n <span className=\"sph-select__value\">\n {node(selected?.label ?? placeholder)}\n </span>\n {open ? (\n <CaretUpIcon className=\"sph-select__caret\" aria-hidden=\"true\" />\n ) : (\n <CaretDownIcon className=\"sph-select__caret\" aria-hidden=\"true\" />\n )}\n </button>\n\n {open && (\n <div id={listboxId} role=\"listbox\" className=\"sph-select__listbox\">\n {options.map((option, index) => (\n <button\n key={option.value}\n id={`${listboxId}-${index}`}\n type=\"button\"\n role=\"option\"\n aria-selected={index === selectedIndex}\n disabled={option.disabled}\n className=\"sph-select__option\"\n data-active={index === activeIndex || undefined}\n onPointerMove={() => !option.disabled && setActiveIndex(index)}\n onClick={() => choose(index)}\n >\n <span>{node(option.label)}</span>\n {index === selectedIndex && (\n <CheckIcon className=\"sph-select__check\" aria-hidden=\"true\" />\n )}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport { useId, useState } from \"react\";\nimport type { KeyboardActionEvent } from \"@/lib/events.js\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type TabItem = {\n value: string;\n label: Renderable;\n disabled?: boolean;\n content?: Renderable;\n};\n\nexport type TabsProps = {\n items: TabItem[];\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n children?: Renderable;\n ariaLabel?: string;\n orientation?: \"horizontal\" | \"vertical\";\n className?: string;\n};\n\nfunction firstEnabled(items: TabItem[]) {\n return items.find((item) => !item.disabled)?.value;\n}\n\nexport function Tabs({\n items,\n value,\n defaultValue,\n onValueChange,\n children,\n ariaLabel = \"Tabs\",\n orientation = \"horizontal\",\n className,\n}: TabsProps) {\n const generatedId = useId();\n const [uncontrolledValue, setUncontrolledValue] = useState(\n defaultValue ?? firstEnabled(items) ?? \"\",\n );\n const activeValue = value ?? uncontrolledValue;\n const activeIndex = Math.max(\n 0,\n items.findIndex((item) => item.value === activeValue),\n );\n const activeItem = items[activeIndex];\n const setValue = (nextValue: string) => {\n setUncontrolledValue(nextValue);\n onValueChange?.(nextValue);\n };\n const move = (event: KeyboardActionEvent, index: number) => {\n const direction =\n orientation === \"vertical\"\n ? event.key === \"ArrowDown\"\n ? 1\n : -1\n : event.key === \"ArrowRight\"\n ? 1\n : -1;\n if (\n ![\"ArrowLeft\", \"ArrowRight\", \"ArrowUp\", \"ArrowDown\"].includes(event.key)\n )\n return;\n event.preventDefault();\n for (let step = 1; step <= items.length; step += 1) {\n const next = (index + step * direction + items.length) % items.length;\n if (!items[next]?.disabled) {\n setValue(items[next].value);\n document.getElementById(`${generatedId}-${next}`)?.focus();\n return;\n }\n }\n };\n const panelId = `${generatedId}-panel`;\n\n return (\n <div className={cn(\"sph-tabs\", className)} data-orientation={orientation}>\n <div\n className=\"sph-tabs__list\"\n role=\"tablist\"\n aria-label={ariaLabel}\n aria-orientation={orientation}\n >\n {items.map((item, index) => {\n const selected = item.value === activeValue;\n return (\n <button\n key={item.value}\n id={`${generatedId}-${index}`}\n type=\"button\"\n role=\"tab\"\n className=\"sph-tabs__tab\"\n aria-selected={selected}\n aria-controls={selected ? panelId : undefined}\n tabIndex={selected ? 0 : -1}\n disabled={item.disabled}\n data-selected={selected || undefined}\n onClick={() => !item.disabled && setValue(item.value)}\n onKeyDown={(event) => move(event, index)}\n >\n {node(item.label)}\n </button>\n );\n })}\n </div>\n {activeItem &&\n (activeItem.content !== undefined || children !== undefined) && (\n <div\n id={panelId}\n className=\"sph-tabs__panel\"\n role=\"tabpanel\"\n aria-labelledby={`${generatedId}-${activeIndex}`}\n >\n {node(activeItem.content ?? children)}\n </div>\n )}\n </div>\n );\n}\n","import { CheckIcon, InfoIcon, WarningIcon, XIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport { useEffect } from \"react\";\nimport {\n type ExternalToast,\n Toaster as SonnerToaster,\n type ToasterProps as SonnerToasterProps,\n toast,\n} from \"sonner\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type { ExternalToast } from \"sonner\";\nexport { toast };\n\nconst toastIcons = {\n success: (\n <span className=\"sph-toast__status-icon\">\n <CheckIcon size={20} />\n </span>\n ),\n info: (\n <span className=\"sph-toast__status-icon\">\n <InfoIcon size={20} />\n </span>\n ),\n warning: (\n <span className=\"sph-toast__status-icon\">\n <WarningIcon size={20} />\n </span>\n ),\n error: (\n <span className=\"sph-toast__status-icon\">\n <XIcon size={20} />\n </span>\n ),\n};\n\nexport type ToastProps = {\n open?: boolean;\n id?: string | number;\n title: Renderable;\n description?: Renderable;\n variant?: \"neutral\" | \"success\" | \"warning\" | \"danger\";\n action?: ExternalToast[\"action\"];\n duration?: number;\n closeButton?: boolean;\n className?: string;\n};\n\nexport function Toast({\n open = true,\n id,\n title,\n description,\n variant = \"neutral\",\n action,\n duration,\n closeButton = true,\n className,\n}: ToastProps) {\n useEffect(() => {\n if (!open) return;\n const options: ExternalToast = {\n id,\n action,\n closeButton,\n description: node(description),\n duration,\n className: cn(\"sph-toast\", className),\n unstyled: true,\n };\n const toastId =\n variant === \"success\"\n ? toast.success(node(title), options)\n : variant === \"warning\"\n ? toast.warning(node(title), options)\n : variant === \"danger\"\n ? toast.error(node(title), options)\n : toast(node(title), options);\n\n return () => {\n toast.dismiss(toastId);\n };\n }, [open, id, action, closeButton, duration, title, description, variant]);\n\n return null;\n}\n\nexport type ToastViewportProps = Omit<\n SonnerToasterProps,\n \"className\" | \"containerAriaLabel\" | \"icons\" | \"toastOptions\"\n> & {\n label?: string;\n className?: string;\n toastOptions?: SonnerToasterProps[\"toastOptions\"];\n};\n\nexport function ToastViewport({\n label = \"Notifications\",\n className,\n toastOptions,\n theme = \"system\",\n position = \"top-right\",\n closeButton = true,\n expand = false,\n ...props\n}: ToastViewportProps) {\n return (\n <SonnerToaster\n {...node(props)}\n theme={theme}\n position={position}\n closeButton={closeButton}\n icons={toastIcons}\n containerAriaLabel={label}\n expand={expand}\n className={cn(\"sph-toast-viewport\", className)}\n toastOptions={{\n ...toastOptions,\n closeButton: toastOptions?.closeButton ?? closeButton,\n closeButtonAriaLabel:\n toastOptions?.closeButtonAriaLabel ?? \"Dismiss notification\",\n className: cn(\"sph-toast\", toastOptions?.className),\n unstyled: true,\n }}\n />\n );\n}\n","import { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\nimport type { ControlSize } from \"../../lib/control\";\n\nexport type ToolbarProps = Omit<HTMLAttributes<HTMLDivElement>, \"children\"> & {\n label?: string;\n orientation?: \"horizontal\" | \"vertical\";\n size?: ControlSize;\n start?: Renderable;\n end?: Renderable;\n children?: Renderable;\n};\n\nexport function Toolbar({\n label = \"Toolbar\",\n orientation = \"horizontal\",\n size = \"sm\",\n start,\n end,\n children,\n className,\n ...props\n}: ToolbarProps) {\n return (\n <div\n {...node(props)}\n className={cn(\"sph-toolbar\", className)}\n data-orientation={orientation}\n data-size={size}\n role=\"toolbar\"\n aria-label={label}\n aria-orientation={orientation}\n >\n {start !== undefined && (\n <div className=\"sph-toolbar__start\">{node(start)}</div>\n )}\n {children !== undefined && (\n <div className=\"sph-toolbar__content\">{node(children)}</div>\n )}\n {end !== undefined && <div className=\"sph-toolbar__end\">{node(end)}</div>}\n </div>\n );\n}\n","import { cn } from \"cn\";\nimport { useId, useRef, useState } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type TooltipProps = {\n content: Renderable;\n children: Renderable;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n delay?: number;\n disabled?: boolean;\n className?: string;\n};\n\nexport function Tooltip({\n content,\n children,\n side = \"top\",\n delay = 400,\n disabled = false,\n className,\n}: TooltipProps) {\n const id = useId();\n const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const [visible, setVisible] = useState(false);\n const show = () => {\n if (disabled) return;\n timerRef.current = setTimeout(() => setVisible(true), delay);\n };\n const hide = () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n setVisible(false);\n };\n\n return (\n <span\n className={cn(\"sph-tooltip\", className)}\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocus={show}\n onBlur={hide}\n >\n <span\n className=\"sph-tooltip__trigger\"\n aria-describedby={visible ? id : undefined}\n >\n {node(children)}\n </span>\n <span\n id={id}\n className=\"sph-tooltip__content\"\n data-side={side}\n data-visible={visible || undefined}\n role=\"tooltip\"\n hidden={!visible}\n >\n {node(content)}\n </span>\n </span>\n );\n}\n","import { TrayIcon } from \"@phosphor-icons/react\";\nimport { cn } from \"cn\";\nimport type { HTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type EmptyStateProps = Omit<\n HTMLAttributes<HTMLElement>,\n \"children\" | \"title\"\n> & {\n title: Renderable;\n description?: Renderable;\n icon?: Renderable;\n action?: Renderable;\n compact?: boolean;\n};\n\nconst emptyStateDefaultIcon = <TrayIcon size={20} />;\n\nexport function EmptyState({\n title,\n description,\n icon = emptyStateDefaultIcon,\n action,\n compact = false,\n className,\n ...props\n}: EmptyStateProps) {\n return (\n <section\n {...node(props)}\n className={cn(\"sph-empty-state\", className)}\n data-compact={compact || undefined}\n >\n <div className=\"sph-empty-state__icon\" aria-hidden=\"true\">\n {node(icon)}\n </div>\n <h2 className=\"sph-empty-state__title\">{node(title)}</h2>\n {description !== undefined && (\n <p className=\"sph-empty-state__description\">{node(description)}</p>\n )}\n {action !== undefined && (\n <div className=\"sph-empty-state__action\">{node(action)}</div>\n )}\n </section>\n );\n}\n","import { cn } from \"cn\";\nimport type { TableHTMLAttributes } from \"react\";\nimport { node, type Renderable } from \"@/lib/node.js\";\n\nexport type TableColumn<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> = {\n key: string;\n label: Renderable;\n align?: \"start\" | \"center\" | \"end\";\n width?: string;\n render?: (row: Row, index: number) => Renderable;\n};\n\nexport type TableProps<\n Row extends Record<string, unknown> = Record<string, unknown>,\n> = Omit<\n TableHTMLAttributes<HTMLTableElement>,\n \"children\" | \"rows\" | \"className\" | \"cellPadding\" | \"cellSpacing\"\n> & {\n columns: TableColumn<Row>[];\n rows: Row[];\n caption?: Renderable;\n emptyMessage?: Renderable;\n rowKey?: keyof Row & string;\n density?: \"compact\" | \"comfortable\";\n striped?: boolean;\n stickyHeader?: boolean;\n className?: string;\n};\n\nexport function Table<\n Row extends Record<string, unknown> = Record<string, unknown>,\n>({\n columns,\n rows,\n caption,\n emptyMessage = \"No results\",\n rowKey,\n density = \"comfortable\",\n striped = false,\n stickyHeader = false,\n className,\n ...props\n}: TableProps<Row>) {\n return (\n <div className={cn(\"sph-table-wrap\", className)}>\n <table\n {...node(props)}\n className=\"sph-table\"\n data-density={density}\n data-striped={striped || undefined}\n data-sticky-header={stickyHeader || undefined}\n >\n {caption !== undefined && <caption>{node(caption)}</caption>}\n <thead>\n <tr>\n {columns.map((column) => (\n <th\n key={column.key}\n scope=\"col\"\n data-align={column.align ?? \"start\"}\n style={{ width: column.width }}\n >\n {node(column.label)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.length === 0 ? (\n <tr>\n <td className=\"sph-table__empty\" colSpan={columns.length}>\n {node(emptyMessage)}\n </td>\n </tr>\n ) : (\n rows.map((row, rowIndex) => (\n <tr key={rowKey ? String(row[rowKey]) : rowIndex}>\n {columns.map((column) => (\n <td key={column.key} data-align={column.align ?? \"start\"}>\n {node(\n column.render\n ? column.render(row, rowIndex)\n : row[column.key],\n )}\n </td>\n ))}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n );\n}\n"],"mappings":"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","names":["cn","cn","jsx","cn","jsx","cn","cn","jsx","jsxs","cn","cn","jsx","cn","cn","jsx","cn","cn","jsx","cn","cn","jsx","cn","cn","jsx","jsxs","cn","cn","jsx","cn","cn","jsx","cn","cn","jsx","cn","CheckIcon","cn","jsx","jsxs","CheckIcon","cn","cn","jsx","jsxs","cn","XIcon","cn","useId","jsx","jsxs","useId","cn","XIcon","cn","useId","cn","jsx","cn","jsx","jsxs","useId","cn","cn","useEffect","useId","useRef","jsx","jsxs","useRef","useId","useEffect","cn","cn","useEffect","useId","useRef","useState","jsx","jsxs","useId","useRef","useState","useEffect","cn","cn","useId","jsx","jsxs","useId","cn","CheckIcon","cn","useEffect","useId","useRef","useState","jsx","jsxs","useId","useRef","firstEnabled","useState","useEffect","cn","CheckIcon","cn","useId","useState","jsx","jsxs","useId","useState","cn","CheckIcon","InfoIcon","WarningIcon","XIcon","cn","useEffect","jsx","jsx","CheckIcon","InfoIcon","WarningIcon","XIcon","useEffect","cn","cn","jsx","jsxs","cn","cn","useId","useRef","useState","jsx","jsxs","useId","useRef","useState","cn","cn","jsx","jsxs","cn","cn","jsx","jsxs","cn"]}
|
package/dist/themes.css
CHANGED
|
@@ -36,32 +36,57 @@
|
|
|
36
36
|
--sph-control-height-lg: 40px;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
[data-sephiro-theme="default"],
|
|
40
|
+
[data-sephiro-theme="dark"] {
|
|
41
|
+
--sph-bg: #211719;
|
|
42
|
+
--sph-surface: #2a1d20;
|
|
43
|
+
--sph-surface-elevated: #342428;
|
|
44
|
+
--sph-raised: #3a292e;
|
|
45
|
+
--sph-border: #513b42;
|
|
46
|
+
--sph-border-strong: #9d6475;
|
|
47
|
+
--sph-text: #f6edf0;
|
|
48
|
+
--sph-text-muted: #cbb9be;
|
|
49
|
+
--sph-accent: #b85c79;
|
|
50
|
+
--sph-accent-hover: #c96c89;
|
|
51
|
+
--sph-accent-pressed: #9f4c67;
|
|
52
|
+
--sph-accent-soft: color-mix(in srgb, var(--sph-accent) 18%, transparent);
|
|
53
|
+
--sph-accent-strong: #e39aae;
|
|
54
|
+
--sph-on-accent: #ffffff;
|
|
55
|
+
--sph-success: #78b894;
|
|
56
|
+
--sph-warning: #e0b468;
|
|
57
|
+
--sph-danger: #e47b78;
|
|
58
|
+
--sph-focus: #e39aae;
|
|
59
|
+
--sph-focus-ring: color-mix(in srgb, var(--sph-accent) 24%, transparent);
|
|
60
|
+
--sph-shadow-popover: 0 14px 36px rgb(0 0 0 / 0.38);
|
|
61
|
+
color-scheme: dark;
|
|
62
|
+
}
|
|
63
|
+
|
|
39
64
|
:where([data-sephiro-theme="default"], [data-sephiro-theme="dark"]) {
|
|
40
65
|
color-scheme: dark;
|
|
41
66
|
}
|
|
42
67
|
|
|
43
68
|
[data-sephiro-theme="light"] {
|
|
44
|
-
--sph-bg: #
|
|
45
|
-
--sph-surface: #
|
|
69
|
+
--sph-bg: #f8f1f2;
|
|
70
|
+
--sph-surface: #fffafb;
|
|
46
71
|
--sph-surface-elevated: #ffffff;
|
|
47
|
-
--sph-raised: #
|
|
48
|
-
--sph-border: #
|
|
49
|
-
--sph-border-strong: #
|
|
50
|
-
--sph-text: #
|
|
51
|
-
--sph-text-muted: #
|
|
52
|
-
--sph-accent: #
|
|
53
|
-
--sph-accent-hover: #
|
|
54
|
-
--sph-accent-pressed: #
|
|
55
|
-
--sph-accent-strong: #
|
|
72
|
+
--sph-raised: #f2e4e8;
|
|
73
|
+
--sph-border: #dfcbd1;
|
|
74
|
+
--sph-border-strong: #b98797;
|
|
75
|
+
--sph-text: #2b2023;
|
|
76
|
+
--sph-text-muted: #6d5b61;
|
|
77
|
+
--sph-accent: #a84f6d;
|
|
78
|
+
--sph-accent-hover: #923f5b;
|
|
79
|
+
--sph-accent-pressed: #7c334c;
|
|
80
|
+
--sph-accent-strong: #8f3f5b;
|
|
56
81
|
--sph-accent-soft: color-mix(in srgb, var(--sph-accent) 13%, transparent);
|
|
57
82
|
--sph-on-accent: #ffffff;
|
|
58
|
-
--sph-success: #
|
|
83
|
+
--sph-success: #39734d;
|
|
59
84
|
--sph-success-soft: color-mix(in srgb, var(--sph-success) 12%, transparent);
|
|
60
85
|
--sph-warning: #805b17;
|
|
61
86
|
--sph-warning-soft: color-mix(in srgb, var(--sph-warning) 12%, transparent);
|
|
62
87
|
--sph-danger: #a43d3d;
|
|
63
88
|
--sph-danger-soft: color-mix(in srgb, var(--sph-danger) 12%, transparent);
|
|
64
|
-
--sph-focus: #
|
|
89
|
+
--sph-focus: #a84f6d;
|
|
65
90
|
--sph-focus-ring: color-mix(in srgb, var(--sph-accent) 18%, transparent);
|
|
66
91
|
--sph-shadow-popover: 0 14px 36px rgb(32 42 31 / 0.14);
|
|
67
92
|
color-scheme: light;
|