@mason-ds/react 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +141 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +17 -3
- package/dist/index.d.ts +17 -3
- package/dist/index.js +140 -8
- package/dist/index.js.map +1 -1
- package/llms.txt +57 -0
- package/package.json +4 -3
package/dist/index.cjs
CHANGED
|
@@ -28,6 +28,7 @@ __export(index_exports, {
|
|
|
28
28
|
Divider: () => Divider,
|
|
29
29
|
Link: () => Link,
|
|
30
30
|
MasonProvider: () => MasonProvider,
|
|
31
|
+
Radio: () => Radio,
|
|
31
32
|
Select: () => Select,
|
|
32
33
|
Spinner: () => Spinner,
|
|
33
34
|
Stack: () => Stack,
|
|
@@ -637,6 +638,21 @@ function fieldErrorStyle() {
|
|
|
637
638
|
...typographyStyle("body.sm")
|
|
638
639
|
};
|
|
639
640
|
}
|
|
641
|
+
function visuallyHiddenControlStyle() {
|
|
642
|
+
return {
|
|
643
|
+
position: "absolute",
|
|
644
|
+
width: 1,
|
|
645
|
+
height: 1,
|
|
646
|
+
padding: 0,
|
|
647
|
+
margin: -1,
|
|
648
|
+
overflow: "hidden",
|
|
649
|
+
clip: "rect(0, 0, 0, 0)",
|
|
650
|
+
whiteSpace: "nowrap",
|
|
651
|
+
borderWidth: 0,
|
|
652
|
+
borderStyle: "solid",
|
|
653
|
+
borderColor: "transparent"
|
|
654
|
+
};
|
|
655
|
+
}
|
|
640
656
|
|
|
641
657
|
// src/field.tsx
|
|
642
658
|
var import_jsx_runtime11 = require("react/jsx-runtime");
|
|
@@ -806,6 +822,7 @@ function Select({
|
|
|
806
822
|
}
|
|
807
823
|
|
|
808
824
|
// src/checkboxStyles.ts
|
|
825
|
+
var CONTROL_SIZE = "1.125rem";
|
|
809
826
|
function checkboxRootStyle() {
|
|
810
827
|
return {
|
|
811
828
|
display: "flex",
|
|
@@ -824,14 +841,19 @@ function checkboxLabelStyle(disabled = false) {
|
|
|
824
841
|
...typographyStyle("body.md")
|
|
825
842
|
};
|
|
826
843
|
}
|
|
827
|
-
function
|
|
844
|
+
function checkboxIndicatorStyle() {
|
|
828
845
|
return {
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
846
|
+
display: "inline-flex",
|
|
847
|
+
alignItems: "center",
|
|
848
|
+
justifyContent: "center",
|
|
849
|
+
width: CONTROL_SIZE,
|
|
850
|
+
height: CONTROL_SIZE,
|
|
851
|
+
marginBlockStart: "0.2em",
|
|
852
|
+
flexShrink: 0,
|
|
853
|
+
boxSizing: "border-box",
|
|
854
|
+
borderRadius: radiusVar("sm"),
|
|
855
|
+
borderStyle: "solid",
|
|
856
|
+
borderWidth: "1.5px"
|
|
835
857
|
};
|
|
836
858
|
}
|
|
837
859
|
|
|
@@ -876,9 +898,10 @@ function Checkbox({
|
|
|
876
898
|
disabled,
|
|
877
899
|
"aria-invalid": isInvalid || void 0,
|
|
878
900
|
"aria-describedby": ids.describedBy,
|
|
879
|
-
style:
|
|
901
|
+
style: visuallyHiddenControlStyle()
|
|
880
902
|
}
|
|
881
903
|
),
|
|
904
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { "data-mason-slot": "indicator", "aria-hidden": "true", style: checkboxIndicatorStyle() }),
|
|
882
905
|
label ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { "data-mason-slot": "label-text", children: label }) : null
|
|
883
906
|
]
|
|
884
907
|
}
|
|
@@ -906,6 +929,115 @@ function Checkbox({
|
|
|
906
929
|
}
|
|
907
930
|
);
|
|
908
931
|
}
|
|
932
|
+
|
|
933
|
+
// src/radioStyles.ts
|
|
934
|
+
var CONTROL_SIZE2 = "1.125rem";
|
|
935
|
+
function radioRootStyle() {
|
|
936
|
+
return {
|
|
937
|
+
display: "flex",
|
|
938
|
+
flexDirection: "column",
|
|
939
|
+
gap: spacingVar("stack", "sm"),
|
|
940
|
+
minWidth: 0
|
|
941
|
+
};
|
|
942
|
+
}
|
|
943
|
+
function radioLabelStyle(disabled = false) {
|
|
944
|
+
return {
|
|
945
|
+
display: "inline-flex",
|
|
946
|
+
alignItems: "flex-start",
|
|
947
|
+
gap: spacingVar("inline", "sm"),
|
|
948
|
+
cursor: disabled ? "not-allowed" : "pointer",
|
|
949
|
+
color: disabled ? cssVar("color.text.disabled") : cssVar("color.text.primary"),
|
|
950
|
+
...typographyStyle("body.md")
|
|
951
|
+
};
|
|
952
|
+
}
|
|
953
|
+
function radioIndicatorStyle() {
|
|
954
|
+
return {
|
|
955
|
+
display: "inline-flex",
|
|
956
|
+
alignItems: "center",
|
|
957
|
+
justifyContent: "center",
|
|
958
|
+
width: CONTROL_SIZE2,
|
|
959
|
+
height: CONTROL_SIZE2,
|
|
960
|
+
marginBlockStart: "0.2em",
|
|
961
|
+
flexShrink: 0,
|
|
962
|
+
boxSizing: "border-box",
|
|
963
|
+
borderRadius: "999px",
|
|
964
|
+
borderStyle: "solid",
|
|
965
|
+
borderWidth: "1.5px"
|
|
966
|
+
};
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
// src/Radio.tsx
|
|
970
|
+
var import_jsx_runtime15 = require("react/jsx-runtime");
|
|
971
|
+
function Radio({
|
|
972
|
+
label,
|
|
973
|
+
description,
|
|
974
|
+
error,
|
|
975
|
+
invalid,
|
|
976
|
+
id,
|
|
977
|
+
disabled = false,
|
|
978
|
+
className,
|
|
979
|
+
style,
|
|
980
|
+
...rest
|
|
981
|
+
}) {
|
|
982
|
+
const ids = useFieldIds({ id, description, error });
|
|
983
|
+
const isInvalid = invalid ?? Boolean(error);
|
|
984
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
|
|
985
|
+
"div",
|
|
986
|
+
{
|
|
987
|
+
"data-mason-component": "radio",
|
|
988
|
+
"data-invalid": isInvalid || void 0,
|
|
989
|
+
"data-disabled": disabled || void 0,
|
|
990
|
+
className: mergeClassName(className),
|
|
991
|
+
style: { ...radioRootStyle(), ...style },
|
|
992
|
+
children: [
|
|
993
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
|
|
994
|
+
"label",
|
|
995
|
+
{
|
|
996
|
+
"data-mason-slot": "label",
|
|
997
|
+
htmlFor: ids.controlId,
|
|
998
|
+
style: radioLabelStyle(disabled),
|
|
999
|
+
children: [
|
|
1000
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
1001
|
+
"input",
|
|
1002
|
+
{
|
|
1003
|
+
...rest,
|
|
1004
|
+
type: "radio",
|
|
1005
|
+
id: ids.controlId,
|
|
1006
|
+
"data-mason-slot": "control",
|
|
1007
|
+
disabled,
|
|
1008
|
+
"aria-invalid": isInvalid || void 0,
|
|
1009
|
+
"aria-describedby": ids.describedBy,
|
|
1010
|
+
style: visuallyHiddenControlStyle()
|
|
1011
|
+
}
|
|
1012
|
+
),
|
|
1013
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { "data-mason-slot": "indicator", "aria-hidden": "true", style: radioIndicatorStyle() }),
|
|
1014
|
+
label ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { "data-mason-slot": "label-text", children: label }) : null
|
|
1015
|
+
]
|
|
1016
|
+
}
|
|
1017
|
+
),
|
|
1018
|
+
description ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
1019
|
+
"p",
|
|
1020
|
+
{
|
|
1021
|
+
"data-mason-slot": "description",
|
|
1022
|
+
id: ids.descriptionId,
|
|
1023
|
+
style: fieldDescriptionStyle(),
|
|
1024
|
+
children: description
|
|
1025
|
+
}
|
|
1026
|
+
) : null,
|
|
1027
|
+
error ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
1028
|
+
"p",
|
|
1029
|
+
{
|
|
1030
|
+
"data-mason-slot": "error",
|
|
1031
|
+
id: ids.errorId,
|
|
1032
|
+
role: "alert",
|
|
1033
|
+
style: fieldErrorStyle(),
|
|
1034
|
+
children: error
|
|
1035
|
+
}
|
|
1036
|
+
) : null
|
|
1037
|
+
]
|
|
1038
|
+
}
|
|
1039
|
+
);
|
|
1040
|
+
}
|
|
909
1041
|
// Annotate the CommonJS export names for ESM import in node:
|
|
910
1042
|
0 && (module.exports = {
|
|
911
1043
|
Badge,
|
|
@@ -916,6 +1048,7 @@ function Checkbox({
|
|
|
916
1048
|
Divider,
|
|
917
1049
|
Link,
|
|
918
1050
|
MasonProvider,
|
|
1051
|
+
Radio,
|
|
919
1052
|
Select,
|
|
920
1053
|
Spinner,
|
|
921
1054
|
Stack,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/provider.tsx","../src/styles.ts","../src/textStyles.ts","../src/Text.tsx","../src/stackStyles.ts","../src/Stack.tsx","../src/cardStyles.ts","../src/Card.tsx","../src/dividerStyles.ts","../src/Divider.tsx","../src/linkStyles.ts","../src/Link.tsx","../src/spinnerStyles.ts","../src/Spinner.tsx","../src/buttonStyles.ts","../src/Button.tsx","../src/badgeStyles.ts","../src/Badge.tsx","../src/calloutStyles.ts","../src/Callout.tsx","../src/field.tsx","../src/fieldStyles.ts","../src/TextField.tsx","../src/Select.tsx","../src/checkboxStyles.ts","../src/Checkbox.tsx"],"sourcesContent":["export { MasonProvider, type MasonProviderProps, type MasonTheme } from './provider.js'\n\n// Token-derived prop unions shared by the components\nexport type {\n FeedbackTone,\n Level,\n RadiusLevel,\n ShadowLevel,\n TextTone,\n TextVariant,\n} from './styles.js'\n\n// Primitives\nexport { Text, type TextAlign, type TextElement, type TextProps } from './Text.js'\nexport {\n Stack,\n type StackAlign,\n type StackDirection,\n type StackJustify,\n type StackProps,\n} from './Stack.js'\nexport { Card, type CardProps, type CardTone } from './Card.js'\nexport { Divider, type DividerOrientation, type DividerProps } from './Divider.js'\nexport { Link, type LinkProps, type LinkTone, type LinkUnderline } from './Link.js'\n\n// Actions & status\nexport { Button, type ButtonProps, type ButtonSize, type ButtonVariant } from './Button.js'\nexport { Spinner, type SpinnerProps, type SpinnerSize } from './Spinner.js'\nexport { Badge, type BadgeProps, type BadgeSize, type BadgeTone } from './Badge.js'\nexport { Callout, type CalloutProps } from './Callout.js'\n\n// Form controls\nexport { TextField, type FieldSize, type TextFieldProps } from './TextField.js'\nexport { Select, type SelectProps } from './Select.js'\nexport { Checkbox, type CheckboxProps } from './Checkbox.js'\n","import type { ReactNode } from 'react'\n\nexport type MasonTheme = 'light' | 'dark' | 'system'\n\nexport interface MasonProviderProps {\n children: ReactNode\n theme?: MasonTheme\n}\n\n/** Root provider for mason-ds React apps. */\nexport function MasonProvider({ children, theme = 'light' }: MasonProviderProps) {\n return <div data-mason-provider data-mason-theme={theme}>{children}</div>\n}\n","import { getSemanticCssVar, type SemanticTokenPath } from '@mason-ds/tokens'\n\n/**\n * Prop unions are derived from the semantic token paths, so adding or removing\n * a token role changes the component API instead of silently drifting from it.\n */\ntype FontRoleOf<Path> = Path extends `font.${infer Role}.family` ? Role : never\ntype TextToneOf<Path> = Path extends `color.text.${infer Tone}` ? Tone : never\ntype FeedbackToneOf<Path> = Path extends `color.feedback.${infer Tone}.bg` ? Tone : never\ntype LevelOf<Path> = Path extends `spacing.inset.${infer Level}` ? Level : never\ntype RadiusOf<Path> = Path extends `radius.${infer Level}` ? Level : never\ntype ShadowOf<Path> = Path extends `shadow.${infer Level}` ? Level : never\n\n/** Typography roles, e.g. `heading.h2`, `body.md`, `code.md`. */\nexport type TextVariant = FontRoleOf<SemanticTokenPath>\n/** Text color roles, e.g. `primary`, `secondary`, `link`, `danger`. */\nexport type TextTone = TextToneOf<SemanticTokenPath>\n/** Status roles shared by Badge / Callout. */\nexport type FeedbackTone = FeedbackToneOf<SemanticTokenPath>\n/** Spacing steps — sm / md / lg. */\nexport type Level = LevelOf<SemanticTokenPath>\nexport type RadiusLevel = RadiusOf<SemanticTokenPath>\nexport type ShadowLevel = ShadowOf<SemanticTokenPath>\n\n/** Reference a semantic token as `var(--mason-*)`. */\nexport function cssVar(path: SemanticTokenPath): string {\n return `var(${getSemanticCssVar(path)})`\n}\n\nexport function spacingVar(axis: 'inset' | 'stack' | 'inline', level: Level): string {\n return cssVar(`spacing.${axis}.${level}`)\n}\n\nexport function radiusVar(level: RadiusLevel): string {\n return cssVar(`radius.${level}`)\n}\n\nexport function shadowVar(level: ShadowLevel): string {\n return cssVar(`shadow.${level}`)\n}\n\nexport function textColorVar(tone: TextTone): string {\n return cssVar(`color.text.${tone}`)\n}\n\nexport function typographyStyle(variant: TextVariant): {\n fontFamily: string\n fontSize: string\n fontWeight: string\n lineHeight: string\n letterSpacing: string\n} {\n return {\n fontFamily: cssVar(`font.${variant}.family`),\n fontSize: cssVar(`font.${variant}.size`),\n fontWeight: cssVar(`font.${variant}.weight`),\n lineHeight: cssVar(`font.${variant}.lineHeight`),\n letterSpacing: cssVar(`font.${variant}.letterSpacing`),\n }\n}\n\nexport function mergeClassName(...parts: (string | undefined)[]): string | undefined {\n const merged = parts.filter(Boolean).join(' ')\n return merged.length > 0 ? merged : undefined\n}\n","import type { CSSProperties } from 'react'\nimport { textColorVar, typographyStyle, type TextTone, type TextVariant } from './styles.js'\n\nexport type TextAlign = 'start' | 'center' | 'end'\n\nexport function textStyle({\n variant = 'body.md',\n tone = 'primary',\n align,\n truncate = false,\n}: {\n variant?: TextVariant\n tone?: TextTone\n align?: TextAlign\n truncate?: boolean\n}): CSSProperties {\n return {\n margin: 0,\n color: textColorVar(tone),\n ...typographyStyle(variant),\n ...(align ? { textAlign: align } : null),\n ...(truncate\n ? { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }\n : null),\n }\n}\n","import type { ElementType, HTMLAttributes } from 'react'\nimport { mergeClassName, type TextTone, type TextVariant } from './styles.js'\nimport { textStyle, type TextAlign } from './textStyles.js'\n\nexport type { TextAlign } from './textStyles.js'\n\nexport type TextElement =\n | 'p'\n | 'span'\n | 'div'\n | 'label'\n | 'strong'\n | 'code'\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n\nexport interface TextProps extends HTMLAttributes<HTMLElement> {\n as?: TextElement\n variant?: TextVariant\n tone?: TextTone\n align?: TextAlign\n truncate?: boolean\n}\n\n/**\n * Typography primitive. `variant` covers every font role in the token set,\n * `tone` every `color.text.*` role.\n *\n * Pick `as` for semantics (a heading role does not imply an `<h2>`).\n */\nexport function Text({\n as = 'p',\n variant = 'body.md',\n tone = 'primary',\n align,\n truncate = false,\n className,\n style,\n children,\n ...rest\n}: TextProps) {\n const Component: ElementType = as\n\n return (\n <Component\n data-mason-component=\"text\"\n data-variant={variant}\n className={mergeClassName(className)}\n style={{ ...textStyle({ variant, tone, align, truncate }), ...style }}\n {...rest}\n >\n {children}\n </Component>\n )\n}\n","import type { CSSProperties } from 'react'\nimport { spacingVar, type Level } from './styles.js'\n\nexport type StackDirection = 'row' | 'column'\nexport type StackAlign = 'start' | 'center' | 'end' | 'stretch' | 'baseline'\nexport type StackJustify = 'start' | 'center' | 'end' | 'between'\n\nconst FLEX_ALIGN = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n stretch: 'stretch',\n baseline: 'baseline',\n} as const satisfies Record<StackAlign, string>\n\nconst FLEX_JUSTIFY = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n between: 'space-between',\n} as const satisfies Record<StackJustify, string>\n\n/** Row gaps come from `spacing.inline`, column gaps from `spacing.stack`. */\nexport function stackStyle({\n direction = 'column',\n gap = 'md',\n align,\n justify,\n wrap = false,\n inline = false,\n}: {\n direction?: StackDirection\n gap?: Level\n align?: StackAlign\n justify?: StackJustify\n wrap?: boolean\n inline?: boolean\n}): CSSProperties {\n return {\n display: inline ? 'inline-flex' : 'flex',\n flexDirection: direction,\n gap: spacingVar(direction === 'row' ? 'inline' : 'stack', gap),\n flexWrap: wrap ? 'wrap' : 'nowrap',\n minWidth: 0,\n ...(align ? { alignItems: FLEX_ALIGN[align] } : null),\n ...(justify ? { justifyContent: FLEX_JUSTIFY[justify] } : null),\n }\n}\n","import type { HTMLAttributes } from 'react'\nimport { mergeClassName, type Level } from './styles.js'\nimport {\n stackStyle,\n type StackAlign,\n type StackDirection,\n type StackJustify,\n} from './stackStyles.js'\n\nexport type {\n StackAlign,\n StackDirection,\n StackJustify,\n} from './stackStyles.js'\n\nexport interface StackProps extends HTMLAttributes<HTMLDivElement> {\n direction?: StackDirection\n gap?: Level\n align?: StackAlign\n justify?: StackJustify\n wrap?: boolean\n inline?: boolean\n}\n\n/** Layout primitive — flex row/column with token gaps. */\nexport function Stack({\n direction = 'column',\n gap = 'md',\n align,\n justify,\n wrap = false,\n inline = false,\n className,\n style,\n children,\n ...rest\n}: StackProps) {\n return (\n <div\n data-mason-component=\"stack\"\n data-direction={direction}\n className={mergeClassName(className)}\n style={{\n ...stackStyle({ direction, gap, align, justify, wrap, inline }),\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import type { CSSProperties } from 'react'\nimport {\n cssVar,\n radiusVar,\n shadowVar,\n spacingVar,\n type Level,\n type RadiusLevel,\n type ShadowLevel,\n} from './styles.js'\n\nexport type CardTone = 'surface' | 'canvas' | 'elevated'\n\nconst TONE_BG = {\n surface: 'color.bg.surface',\n canvas: 'color.bg.canvas',\n elevated: 'color.bg.elevated',\n} as const\n\nexport function cardStyle({\n padding = 'md',\n elevation = 'sm',\n radius = 'md',\n tone = 'surface',\n bordered = true,\n}: {\n padding?: Level\n elevation?: ShadowLevel\n radius?: RadiusLevel\n tone?: CardTone\n bordered?: boolean\n}): CSSProperties {\n return {\n display: 'block',\n padding: spacingVar('inset', padding),\n backgroundColor: cssVar(TONE_BG[tone]),\n color: cssVar('color.text.primary'),\n border: bordered ? `1px solid ${cssVar('color.border.subtle')}` : 'none',\n borderRadius: radiusVar(radius),\n boxShadow: shadowVar(elevation),\n boxSizing: 'border-box',\n minWidth: 0,\n }\n}\n","import type { HTMLAttributes } from 'react'\nimport {\n mergeClassName,\n type Level,\n type RadiusLevel,\n type ShadowLevel,\n} from './styles.js'\nimport { cardStyle, type CardTone } from './cardStyles.js'\n\nexport type { CardTone } from './cardStyles.js'\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n padding?: Level\n elevation?: ShadowLevel\n radius?: RadiusLevel\n tone?: CardTone\n bordered?: boolean\n}\n\n/** Surface primitive — background, border, radius and shadow from tokens. */\nexport function Card({\n padding = 'md',\n elevation = 'sm',\n radius = 'md',\n tone = 'surface',\n bordered = true,\n className,\n style,\n children,\n ...rest\n}: CardProps) {\n return (\n <div\n data-mason-component=\"card\"\n data-tone={tone}\n className={mergeClassName(className)}\n style={{\n ...cardStyle({ padding, elevation, radius, tone, bordered }),\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import type { CSSProperties } from 'react'\nimport { cssVar } from './styles.js'\n\nexport type DividerOrientation = 'horizontal' | 'vertical'\n\nexport function dividerStyle(orientation: DividerOrientation = 'horizontal'): CSSProperties {\n const line = `1px solid ${cssVar('color.border.subtle')}`\n\n if (orientation === 'vertical') {\n return {\n alignSelf: 'stretch',\n width: 0,\n minHeight: '1em',\n margin: 0,\n border: 'none',\n borderInlineStart: line,\n }\n }\n\n return {\n width: '100%',\n height: 0,\n margin: 0,\n border: 'none',\n borderBlockStart: line,\n }\n}\n","import type { HTMLAttributes } from 'react'\nimport { mergeClassName } from './styles.js'\nimport { dividerStyle, type DividerOrientation } from './dividerStyles.js'\n\nexport type { DividerOrientation } from './dividerStyles.js'\n\nexport interface DividerProps extends HTMLAttributes<HTMLHRElement> {\n orientation?: DividerOrientation\n}\n\n/** Separator line. `<hr>` already carries the separator role. */\nexport function Divider({\n orientation = 'horizontal',\n className,\n style,\n ...rest\n}: DividerProps) {\n return (\n <hr\n data-mason-component=\"divider\"\n data-orientation={orientation}\n aria-orientation={orientation === 'vertical' ? 'vertical' : undefined}\n className={mergeClassName(className)}\n style={{ ...dividerStyle(orientation), ...style }}\n {...rest}\n />\n )\n}\n","import type { CSSProperties } from 'react'\nimport { radiusVar, textColorVar } from './styles.js'\n\nexport type LinkTone = 'link' | 'inherit'\nexport type LinkUnderline = 'hover' | 'always' | 'none'\n\n/** Link inherits typography from its container so it can sit inside Text. */\nexport function linkStyle({\n tone = 'link',\n underline = 'hover',\n}: {\n tone?: LinkTone\n underline?: LinkUnderline\n}): CSSProperties {\n return {\n color: tone === 'inherit' ? 'inherit' : textColorVar('link'),\n textDecoration: underline === 'always' ? 'underline' : 'none',\n textUnderlineOffset: '0.15em',\n borderRadius: radiusVar('sm'),\n cursor: 'pointer',\n }\n}\n","import type { AnchorHTMLAttributes } from 'react'\nimport { mergeClassName } from './styles.js'\nimport { linkStyle, type LinkTone, type LinkUnderline } from './linkStyles.js'\n\nexport type { LinkTone, LinkUnderline } from './linkStyles.js'\n\nexport interface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n tone?: LinkTone\n underline?: LinkUnderline\n /** Adds `target=\"_blank\"` and a safe `rel`. */\n external?: boolean\n}\n\n/**\n * Navigational anchor. Typography is inherited, so it composes inside Text.\n *\n * For client-side routing, pass the router's component via `asChild`-style\n * composition on the consumer side (`<Link href>` stays a plain `<a>`).\n */\nexport function Link({\n tone = 'link',\n underline = 'hover',\n external = false,\n className,\n style,\n children,\n ...rest\n}: LinkProps) {\n const externalProps = external\n ? { target: '_blank', rel: 'noreferrer noopener' }\n : null\n\n return (\n <a\n data-mason-component=\"link\"\n data-tone={tone}\n data-underline={underline}\n className={mergeClassName(className)}\n style={{ ...linkStyle({ tone, underline }), ...style }}\n {...externalProps}\n {...rest}\n >\n {children}\n </a>\n )\n}\n","import type { CSSProperties } from 'react'\nimport { cssVar } from './styles.js'\n\n/** `inherit` follows the surrounding font size — used inside Button. */\nexport type SpinnerSize = 'sm' | 'md' | 'lg' | 'inherit'\n\nconst SIZE_DIMENSION = {\n sm: cssVar('font.body.sm.size'),\n md: cssVar('font.body.md.size'),\n lg: cssVar('font.display.lg.size'),\n inherit: '1em',\n} as const satisfies Record<SpinnerSize, string>\n\nexport function spinnerStyle(size: SpinnerSize = 'md'): CSSProperties {\n const dimension = SIZE_DIMENSION[size]\n\n return {\n width: dimension,\n height: dimension,\n border: '2px solid currentColor',\n borderTopColor: 'transparent',\n borderRadius: '50%',\n display: 'inline-block',\n flexShrink: 0,\n }\n}\n","import type { HTMLAttributes } from 'react'\nimport { mergeClassName } from './styles.js'\nimport { spinnerStyle, type SpinnerSize } from './spinnerStyles.js'\n\nexport type { SpinnerSize } from './spinnerStyles.js'\n\nexport interface SpinnerProps extends HTMLAttributes<HTMLSpanElement> {\n size?: SpinnerSize\n /** Announced while loading. Without it the spinner is `aria-hidden`. */\n label?: string\n}\n\n/** Indeterminate loading indicator. The rotation lives in `tokens.css`. */\nexport function Spinner({\n size = 'md',\n label,\n className,\n style,\n ...rest\n}: SpinnerProps) {\n return (\n <span\n data-mason-component=\"spinner\"\n data-size={size}\n role={label ? 'status' : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n className={mergeClassName(className)}\n style={{ ...spinnerStyle(size), ...style }}\n {...rest}\n />\n )\n}\n","import type { CSSProperties } from 'react'\nimport { cssVar, typographyStyle, type TextVariant } from './styles.js'\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger'\nexport type ButtonSize = 'sm' | 'md' | 'lg'\n\ntype ActionColorPath =\n | `color.action.${ButtonVariant | 'disabled'}.${'bg' | 'text' | 'border'}`\n\nfunction actionColors(variant: ButtonVariant | 'disabled'): {\n bg: ActionColorPath\n text: ActionColorPath\n border: ActionColorPath\n} {\n return {\n bg: `color.action.${variant}.bg`,\n text: `color.action.${variant}.text`,\n border: `color.action.${variant}.border`,\n }\n}\n\n/**\n * Size ladder — padding / radius / type. Height comes from content, not min-height.\n */\nconst sizeStyles = {\n sm: {\n paddingBlock: cssVar('spacing.inset.sm'),\n paddingInline: cssVar('spacing.inset.md'),\n gap: cssVar('spacing.inline.sm'),\n radius: cssVar('radius.sm'),\n font: 'label.sm' as TextVariant,\n },\n md: {\n paddingBlock: cssVar('spacing.inset.md'),\n paddingInline: cssVar('spacing.inset.lg'),\n gap: cssVar('spacing.inline.md'),\n radius: cssVar('radius.md'),\n font: 'label.md' as TextVariant,\n },\n lg: {\n paddingBlock: cssVar('spacing.inset.lg'),\n paddingInline: `calc(${cssVar('spacing.inset.lg')} + ${cssVar('spacing.inset.md')})`,\n gap: cssVar('spacing.inline.md'),\n radius: cssVar('radius.lg'),\n font: 'label.lg' as TextVariant,\n },\n} as const satisfies Record<\n ButtonSize,\n {\n paddingBlock: string\n paddingInline: string\n gap: string\n radius: string\n font: TextVariant\n }\n>\n\nexport function buttonStyle({\n variant = 'primary',\n size = 'md',\n disabled = false,\n loading = false,\n}: {\n variant?: ButtonVariant\n size?: ButtonSize\n disabled?: boolean\n loading?: boolean\n}): CSSProperties {\n const inactive = disabled || loading\n const colors = actionColors(inactive ? 'disabled' : variant)\n const sizing = sizeStyles[size]\n\n return {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: sizing.gap,\n paddingBlock: sizing.paddingBlock,\n paddingInline: sizing.paddingInline,\n margin: 0,\n backgroundColor: cssVar(colors.bg),\n color: cssVar(colors.text),\n border: `1px solid ${cssVar(colors.border)}`,\n borderRadius: sizing.radius,\n boxSizing: 'border-box',\n ...typographyStyle(sizing.font),\n textDecoration: 'none',\n whiteSpace: 'nowrap',\n }\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react'\nimport { mergeClassName } from './styles.js'\nimport { Spinner } from './Spinner.js'\nimport { buttonStyle, type ButtonSize, type ButtonVariant } from './buttonStyles.js'\n\nexport type { ButtonSize, ButtonVariant } from './buttonStyles.js'\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant\n size?: ButtonSize\n loading?: boolean\n leadingSlot?: ReactNode\n trailingSlot?: ReactNode\n}\n\n/**\n * Primary action component. Native `<button>` with token-backed styles.\n *\n * Icon-only usage requires an `aria-label`.\n */\nexport function Button({\n variant = 'primary',\n size = 'md',\n disabled = false,\n loading = false,\n leadingSlot,\n trailingSlot,\n className,\n style,\n children,\n type = 'button',\n ...rest\n}: ButtonProps) {\n const isDisabled = disabled || loading\n\n return (\n <button\n type={type}\n data-mason-component=\"button\"\n data-variant={variant}\n data-size={size}\n disabled={isDisabled}\n aria-busy={loading || undefined}\n className={mergeClassName(className)}\n style={{\n ...buttonStyle({ variant, size, disabled, loading }),\n ...style,\n }}\n {...rest}\n >\n {loading ? (\n <Spinner size=\"inherit\" data-mason-slot=\"spinner\" />\n ) : leadingSlot ? (\n <span data-mason-slot=\"leading\">{leadingSlot}</span>\n ) : null}\n {children ? <span data-mason-slot=\"label\">{children}</span> : null}\n {trailingSlot && !loading ? (\n <span data-mason-slot=\"trailing\">{trailingSlot}</span>\n ) : null}\n </button>\n )\n}\n","import type { CSSProperties } from 'react'\nimport {\n cssVar,\n radiusVar,\n spacingVar,\n typographyStyle,\n type FeedbackTone,\n} from './styles.js'\n\nexport type BadgeTone = FeedbackTone | 'neutral'\nexport type BadgeSize = 'sm' | 'md'\n\nexport function badgeStyle({\n tone = 'neutral',\n size = 'sm',\n}: {\n tone?: BadgeTone\n size?: BadgeSize\n}): CSSProperties {\n const colors =\n tone === 'neutral'\n ? {\n bg: cssVar('color.bg.canvas'),\n text: cssVar('color.text.secondary'),\n border: cssVar('color.border.subtle'),\n }\n : {\n bg: cssVar(`color.feedback.${tone}.bg`),\n text: cssVar(`color.feedback.${tone}.text`),\n border: cssVar(`color.feedback.${tone}.border`),\n }\n\n return {\n display: 'inline-flex',\n alignItems: 'center',\n gap: spacingVar('inline', 'sm'),\n paddingBlock: '0.125em',\n paddingInline: spacingVar('inset', 'sm'),\n backgroundColor: colors.bg,\n color: colors.text,\n border: `1px solid ${colors.border}`,\n borderRadius: radiusVar('full'),\n ...typographyStyle(size === 'sm' ? 'label.sm' : 'label.md'),\n whiteSpace: 'nowrap',\n }\n}\n","import type { HTMLAttributes } from 'react'\nimport { mergeClassName } from './styles.js'\nimport { badgeStyle, type BadgeSize, type BadgeTone } from './badgeStyles.js'\n\nexport type { BadgeSize, BadgeTone } from './badgeStyles.js'\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n tone?: BadgeTone\n size?: BadgeSize\n}\n\n/**\n * Compact status chip. Colour carries no meaning on its own — keep the label\n * readable (`활성`, not just a green dot).\n */\nexport function Badge({\n tone = 'neutral',\n size = 'sm',\n className,\n style,\n children,\n ...rest\n}: BadgeProps) {\n return (\n <span\n data-mason-component=\"badge\"\n data-tone={tone}\n data-size={size}\n className={mergeClassName(className)}\n style={{ ...badgeStyle({ tone, size }), ...style }}\n {...rest}\n >\n {children}\n </span>\n )\n}\n","import type { CSSProperties } from 'react'\nimport {\n cssVar,\n radiusVar,\n spacingVar,\n typographyStyle,\n type FeedbackTone,\n} from './styles.js'\n\nexport function calloutStyle(tone: FeedbackTone = 'info'): CSSProperties {\n return {\n display: 'flex',\n gap: spacingVar('inline', 'md'),\n padding: spacingVar('inset', 'md'),\n backgroundColor: cssVar(`color.feedback.${tone}.bg`),\n color: cssVar(`color.feedback.${tone}.text`),\n border: `1px solid ${cssVar(`color.feedback.${tone}.border`)}`,\n borderRadius: radiusVar('md'),\n boxSizing: 'border-box',\n ...typographyStyle('body.md'),\n }\n}\n\nexport function calloutContentStyle(): CSSProperties {\n return {\n display: 'flex',\n flexDirection: 'column',\n gap: spacingVar('stack', 'sm'),\n minWidth: 0,\n }\n}\n\nexport function calloutTitleStyle(): CSSProperties {\n return { margin: 0, ...typographyStyle('label.md') }\n}\n\nexport function calloutBodyStyle(): CSSProperties {\n return { margin: 0, ...typographyStyle('body.sm') }\n}\n","import type { HTMLAttributes, ReactNode } from 'react'\nimport { mergeClassName, type FeedbackTone } from './styles.js'\nimport {\n calloutBodyStyle,\n calloutContentStyle,\n calloutStyle,\n calloutTitleStyle,\n} from './calloutStyles.js'\n\n/** `title` is the heading slot, so the native tooltip attribute is not available. */\nexport interface CalloutProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n tone?: FeedbackTone\n title?: ReactNode\n iconSlot?: ReactNode\n}\n\n/**\n * Inline message block for page-level feedback.\n *\n * It is static content by default — for something that appears in response to\n * an action, pass `role=\"status\"` (or `\"alert\"` when it must interrupt).\n */\nexport function Callout({\n tone = 'info',\n title,\n iconSlot,\n className,\n style,\n children,\n ...rest\n}: CalloutProps) {\n return (\n <div\n data-mason-component=\"callout\"\n data-tone={tone}\n className={mergeClassName(className)}\n style={{ ...calloutStyle(tone), ...style }}\n {...rest}\n >\n {iconSlot ? (\n <span data-mason-slot=\"icon\" aria-hidden=\"true\">\n {iconSlot}\n </span>\n ) : null}\n <div data-mason-slot=\"content\" style={calloutContentStyle()}>\n {title ? (\n <p data-mason-slot=\"title\" style={calloutTitleStyle()}>\n {title}\n </p>\n ) : null}\n {children ? (\n <div data-mason-slot=\"body\" style={calloutBodyStyle()}>\n {children}\n </div>\n ) : null}\n </div>\n </div>\n )\n}\n","import { useId, type CSSProperties, type ReactNode } from 'react'\nimport { mergeClassName } from './styles.js'\nimport {\n fieldDescriptionStyle,\n fieldErrorStyle,\n fieldLabelStyle,\n fieldRootStyle,\n type FieldSize,\n} from './fieldStyles.js'\n\nexport interface FieldIds {\n controlId: string\n descriptionId: string\n errorId: string\n /** `aria-describedby` value, or undefined when there is nothing to describe. */\n describedBy: string | undefined\n}\n\n/** Stable ids wiring a control to its label, description and error. */\nexport function useFieldIds({\n id,\n description,\n error,\n}: {\n id?: string\n description?: ReactNode\n error?: ReactNode\n}): FieldIds {\n const generated = useId()\n const controlId = id ?? `mason-field-${generated}`\n const descriptionId = `${controlId}-description`\n const errorId = `${controlId}-error`\n const describedBy =\n [description ? descriptionId : null, error ? errorId : null]\n .filter(Boolean)\n .join(' ') || undefined\n\n return { controlId, descriptionId, errorId, describedBy }\n}\n\nexport interface FieldFrameProps {\n /** `data-mason-component` value of the wrapper, e.g. `text-field`. */\n component: string\n ids: FieldIds\n label?: ReactNode\n description?: ReactNode\n error?: ReactNode\n size?: FieldSize\n invalid?: boolean\n disabled?: boolean\n className?: string\n style?: CSSProperties\n children: ReactNode\n}\n\n/**\n * Shared label / description / error chrome for form controls.\n * Internal — consumers use TextField, Select or Checkbox.\n */\nexport function FieldFrame({\n component,\n ids,\n label,\n description,\n error,\n size = 'md',\n invalid = false,\n disabled = false,\n className,\n style,\n children,\n}: FieldFrameProps) {\n return (\n <div\n data-mason-component={component}\n data-size={size}\n data-invalid={invalid || undefined}\n data-disabled={disabled || undefined}\n className={mergeClassName(className)}\n style={{ ...fieldRootStyle(), ...style }}\n >\n {label ? (\n <label\n data-mason-slot=\"label\"\n htmlFor={ids.controlId}\n style={fieldLabelStyle(size)}\n >\n {label}\n </label>\n ) : null}\n {children}\n {description ? (\n <p\n data-mason-slot=\"description\"\n id={ids.descriptionId}\n style={fieldDescriptionStyle()}\n >\n {description}\n </p>\n ) : null}\n {error ? (\n <p\n data-mason-slot=\"error\"\n id={ids.errorId}\n role=\"alert\"\n style={fieldErrorStyle()}\n >\n {error}\n </p>\n ) : null}\n </div>\n )\n}\n","import type { CSSProperties } from 'react'\nimport {\n cssVar,\n radiusVar,\n spacingVar,\n typographyStyle,\n type Level,\n type TextVariant,\n} from './styles.js'\n\n/** Field sizes reuse the spacing ladder — sm / md / lg. */\nexport type FieldSize = Level\n\nconst CONTROL_FONT = {\n sm: 'body.sm',\n md: 'body.md',\n lg: 'body.lg',\n} as const satisfies Record<FieldSize, TextVariant>\n\nconst LABEL_FONT = {\n sm: 'label.sm',\n md: 'label.md',\n lg: 'label.lg',\n} as const satisfies Record<FieldSize, TextVariant>\n\nconst CONTROL_PADDING_BLOCK = { sm: 'sm', md: 'sm', lg: 'md' } as const satisfies Record<\n FieldSize,\n Level\n>\n\nconst CONTROL_PADDING_INLINE = { sm: 'sm', md: 'md', lg: 'md' } as const satisfies Record<\n FieldSize,\n Level\n>\n\nexport function fieldRootStyle(): CSSProperties {\n return {\n display: 'flex',\n flexDirection: 'column',\n gap: spacingVar('stack', 'sm'),\n minWidth: 0,\n }\n}\n\nexport function fieldLabelStyle(size: FieldSize = 'md'): CSSProperties {\n return {\n color: cssVar('color.text.primary'),\n ...typographyStyle(LABEL_FONT[size]),\n }\n}\n\nexport function fieldControlStyle({\n size = 'md',\n invalid = false,\n disabled = false,\n}: {\n size?: FieldSize\n invalid?: boolean\n disabled?: boolean\n}): CSSProperties {\n return {\n width: '100%',\n boxSizing: 'border-box',\n margin: 0,\n paddingBlock: spacingVar('inset', CONTROL_PADDING_BLOCK[size]),\n paddingInline: spacingVar('inset', CONTROL_PADDING_INLINE[size]),\n backgroundColor: disabled\n ? cssVar('color.action.disabled.bg')\n : cssVar('color.field.bg'),\n color: disabled ? cssVar('color.text.disabled') : cssVar('color.field.text'),\n border: `1px solid ${cssVar(\n invalid ? 'color.field.borderInvalid' : 'color.field.border',\n )}`,\n borderRadius: radiusVar('md'),\n ...typographyStyle(CONTROL_FONT[size]),\n }\n}\n\nexport function fieldDescriptionStyle(): CSSProperties {\n return {\n margin: 0,\n color: cssVar('color.text.secondary'),\n ...typographyStyle('body.sm'),\n }\n}\n\nexport function fieldErrorStyle(): CSSProperties {\n return {\n margin: 0,\n color: cssVar('color.text.danger'),\n ...typographyStyle('body.sm'),\n }\n}\n","import type { InputHTMLAttributes, ReactNode } from 'react'\nimport { FieldFrame, useFieldIds } from './field.js'\nimport { fieldControlStyle, type FieldSize } from './fieldStyles.js'\n\nexport type { FieldSize } from './fieldStyles.js'\n\nexport interface TextFieldProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {\n label?: ReactNode\n description?: ReactNode\n /** Present error text switches the field to its invalid styling. */\n error?: ReactNode\n size?: FieldSize\n invalid?: boolean\n}\n\n/**\n * Labelled text input. `className` / `style` apply to the wrapper; every other\n * prop goes to the native `<input>`.\n */\nexport function TextField({\n label,\n description,\n error,\n size = 'md',\n invalid,\n id,\n disabled = false,\n className,\n style,\n ...rest\n}: TextFieldProps) {\n const ids = useFieldIds({ id, description, error })\n const isInvalid = invalid ?? Boolean(error)\n\n return (\n <FieldFrame\n component=\"text-field\"\n ids={ids}\n label={label}\n description={description}\n error={error}\n size={size}\n invalid={isInvalid}\n disabled={disabled}\n className={className}\n style={style}\n >\n <input\n {...rest}\n id={ids.controlId}\n data-mason-slot=\"control\"\n disabled={disabled}\n aria-invalid={isInvalid || undefined}\n aria-describedby={ids.describedBy}\n style={fieldControlStyle({ size, invalid: isInvalid, disabled })}\n />\n </FieldFrame>\n )\n}\n","import type { ReactNode, SelectHTMLAttributes } from 'react'\nimport { FieldFrame, useFieldIds } from './field.js'\nimport { fieldControlStyle, type FieldSize } from './fieldStyles.js'\n\nexport interface SelectProps\n extends Omit<SelectHTMLAttributes<HTMLSelectElement>, 'size'> {\n label?: ReactNode\n description?: ReactNode\n error?: ReactNode\n size?: FieldSize\n invalid?: boolean\n /** Rendered as a leading empty `<option>`. */\n placeholder?: string\n}\n\n/**\n * Labelled native `<select>`. Children are the `<option>` elements, so the\n * browser's own popup and keyboard behaviour is preserved.\n */\nexport function Select({\n label,\n description,\n error,\n size = 'md',\n invalid,\n placeholder,\n id,\n disabled = false,\n className,\n style,\n children,\n ...rest\n}: SelectProps) {\n const ids = useFieldIds({ id, description, error })\n const isInvalid = invalid ?? Boolean(error)\n\n return (\n <FieldFrame\n component=\"select\"\n ids={ids}\n label={label}\n description={description}\n error={error}\n size={size}\n invalid={isInvalid}\n disabled={disabled}\n className={className}\n style={style}\n >\n <select\n {...rest}\n id={ids.controlId}\n data-mason-slot=\"control\"\n disabled={disabled}\n aria-invalid={isInvalid || undefined}\n aria-describedby={ids.describedBy}\n style={fieldControlStyle({ size, invalid: isInvalid, disabled })}\n >\n {placeholder ? <option value=\"\">{placeholder}</option> : null}\n {children}\n </select>\n </FieldFrame>\n )\n}\n","import type { CSSProperties } from 'react'\nimport { cssVar, spacingVar, typographyStyle } from './styles.js'\n\nexport function checkboxRootStyle(): CSSProperties {\n return {\n display: 'flex',\n flexDirection: 'column',\n gap: spacingVar('stack', 'sm'),\n minWidth: 0,\n }\n}\n\nexport function checkboxLabelStyle(disabled = false): CSSProperties {\n return {\n display: 'inline-flex',\n alignItems: 'flex-start',\n gap: spacingVar('inline', 'sm'),\n cursor: disabled ? 'not-allowed' : 'pointer',\n color: disabled ? cssVar('color.text.disabled') : cssVar('color.text.primary'),\n ...typographyStyle('body.md'),\n }\n}\n\nexport function checkboxControlStyle(): CSSProperties {\n return {\n width: '1em',\n height: '1em',\n margin: 0,\n marginBlockStart: '0.15em',\n accentColor: cssVar('color.action.primary.bg'),\n flexShrink: 0,\n }\n}\n","import type { InputHTMLAttributes, ReactNode } from 'react'\nimport { useFieldIds } from './field.js'\nimport { mergeClassName } from './styles.js'\nimport { fieldDescriptionStyle, fieldErrorStyle } from './fieldStyles.js'\nimport {\n checkboxControlStyle,\n checkboxLabelStyle,\n checkboxRootStyle,\n} from './checkboxStyles.js'\n\nexport interface CheckboxProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'> {\n label?: ReactNode\n description?: ReactNode\n error?: ReactNode\n invalid?: boolean\n}\n\n/**\n * Native checkbox with a token-backed label row.\n * The check mark uses `accent-color`, so platform behaviour is untouched.\n */\nexport function Checkbox({\n label,\n description,\n error,\n invalid,\n id,\n disabled = false,\n className,\n style,\n ...rest\n}: CheckboxProps) {\n const ids = useFieldIds({ id, description, error })\n const isInvalid = invalid ?? Boolean(error)\n\n return (\n <div\n data-mason-component=\"checkbox\"\n data-invalid={isInvalid || undefined}\n data-disabled={disabled || undefined}\n className={mergeClassName(className)}\n style={{ ...checkboxRootStyle(), ...style }}\n >\n <label\n data-mason-slot=\"label\"\n htmlFor={ids.controlId}\n style={checkboxLabelStyle(disabled)}\n >\n <input\n {...rest}\n type=\"checkbox\"\n id={ids.controlId}\n data-mason-slot=\"control\"\n disabled={disabled}\n aria-invalid={isInvalid || undefined}\n aria-describedby={ids.describedBy}\n style={checkboxControlStyle()}\n />\n {label ? <span data-mason-slot=\"label-text\">{label}</span> : null}\n </label>\n {description ? (\n <p\n data-mason-slot=\"description\"\n id={ids.descriptionId}\n style={fieldDescriptionStyle()}\n >\n {description}\n </p>\n ) : null}\n {error ? (\n <p\n data-mason-slot=\"error\"\n id={ids.errorId}\n role=\"alert\"\n style={fieldErrorStyle()}\n >\n {error}\n </p>\n ) : null}\n </div>\n )\n}\n"],"mappings":"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","names":["import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/provider.tsx","../src/styles.ts","../src/textStyles.ts","../src/Text.tsx","../src/stackStyles.ts","../src/Stack.tsx","../src/cardStyles.ts","../src/Card.tsx","../src/dividerStyles.ts","../src/Divider.tsx","../src/linkStyles.ts","../src/Link.tsx","../src/spinnerStyles.ts","../src/Spinner.tsx","../src/buttonStyles.ts","../src/Button.tsx","../src/badgeStyles.ts","../src/Badge.tsx","../src/calloutStyles.ts","../src/Callout.tsx","../src/field.tsx","../src/fieldStyles.ts","../src/TextField.tsx","../src/Select.tsx","../src/checkboxStyles.ts","../src/Checkbox.tsx","../src/radioStyles.ts","../src/Radio.tsx"],"sourcesContent":["export { MasonProvider, type MasonProviderProps, type MasonTheme } from './provider.js'\n\n// Token-derived prop unions shared by the components\nexport type {\n FeedbackTone,\n Level,\n RadiusLevel,\n ShadowLevel,\n TextTone,\n TextVariant,\n} from './styles.js'\n\n// Primitives\nexport { Text, type TextAlign, type TextElement, type TextProps } from './Text.js'\nexport {\n Stack,\n type StackAlign,\n type StackDirection,\n type StackJustify,\n type StackProps,\n} from './Stack.js'\nexport { Card, type CardProps, type CardTone } from './Card.js'\nexport { Divider, type DividerOrientation, type DividerProps } from './Divider.js'\nexport { Link, type LinkProps, type LinkTone, type LinkUnderline } from './Link.js'\n\n// Actions & status\nexport { Button, type ButtonProps, type ButtonSize, type ButtonVariant } from './Button.js'\nexport { Spinner, type SpinnerProps, type SpinnerSize } from './Spinner.js'\nexport { Badge, type BadgeProps, type BadgeSize, type BadgeTone } from './Badge.js'\nexport { Callout, type CalloutProps } from './Callout.js'\n\n// Form controls\nexport { TextField, type FieldSize, type TextFieldProps } from './TextField.js'\nexport { Select, type SelectProps } from './Select.js'\nexport { Checkbox, type CheckboxProps } from './Checkbox.js'\nexport { Radio, type RadioProps } from './Radio.js'\n","import type { ReactNode } from 'react'\n\nexport type MasonTheme = 'light' | 'dark' | 'system'\n\nexport interface MasonProviderProps {\n children: ReactNode\n theme?: MasonTheme\n}\n\n/** Root provider for mason-ds React apps. */\nexport function MasonProvider({ children, theme = 'light' }: MasonProviderProps) {\n return <div data-mason-provider data-mason-theme={theme}>{children}</div>\n}\n","import { getSemanticCssVar, type SemanticTokenPath } from '@mason-ds/tokens'\n\n/**\n * Prop unions are derived from the semantic token paths, so adding or removing\n * a token role changes the component API instead of silently drifting from it.\n */\ntype FontRoleOf<Path> = Path extends `font.${infer Role}.family` ? Role : never\ntype TextToneOf<Path> = Path extends `color.text.${infer Tone}` ? Tone : never\ntype FeedbackToneOf<Path> = Path extends `color.feedback.${infer Tone}.bg` ? Tone : never\ntype LevelOf<Path> = Path extends `spacing.inset.${infer Level}` ? Level : never\ntype RadiusOf<Path> = Path extends `radius.${infer Level}` ? Level : never\ntype ShadowOf<Path> = Path extends `shadow.${infer Level}` ? Level : never\n\n/** Typography roles, e.g. `heading.h2`, `body.md`, `code.md`. */\nexport type TextVariant = FontRoleOf<SemanticTokenPath>\n/** Text color roles, e.g. `primary`, `secondary`, `link`, `danger`. */\nexport type TextTone = TextToneOf<SemanticTokenPath>\n/** Status roles shared by Badge / Callout. */\nexport type FeedbackTone = FeedbackToneOf<SemanticTokenPath>\n/** Spacing steps — sm / md / lg. */\nexport type Level = LevelOf<SemanticTokenPath>\nexport type RadiusLevel = RadiusOf<SemanticTokenPath>\nexport type ShadowLevel = ShadowOf<SemanticTokenPath>\n\n/** Reference a semantic token as `var(--mason-*)`. */\nexport function cssVar(path: SemanticTokenPath): string {\n return `var(${getSemanticCssVar(path)})`\n}\n\nexport function spacingVar(axis: 'inset' | 'stack' | 'inline', level: Level): string {\n return cssVar(`spacing.${axis}.${level}`)\n}\n\nexport function radiusVar(level: RadiusLevel): string {\n return cssVar(`radius.${level}`)\n}\n\nexport function shadowVar(level: ShadowLevel): string {\n return cssVar(`shadow.${level}`)\n}\n\nexport function textColorVar(tone: TextTone): string {\n return cssVar(`color.text.${tone}`)\n}\n\nexport function typographyStyle(variant: TextVariant): {\n fontFamily: string\n fontSize: string\n fontWeight: string\n lineHeight: string\n letterSpacing: string\n} {\n return {\n fontFamily: cssVar(`font.${variant}.family`),\n fontSize: cssVar(`font.${variant}.size`),\n fontWeight: cssVar(`font.${variant}.weight`),\n lineHeight: cssVar(`font.${variant}.lineHeight`),\n letterSpacing: cssVar(`font.${variant}.letterSpacing`),\n }\n}\n\nexport function mergeClassName(...parts: (string | undefined)[]): string | undefined {\n const merged = parts.filter(Boolean).join(' ')\n return merged.length > 0 ? merged : undefined\n}\n","import type { CSSProperties } from 'react'\nimport { textColorVar, typographyStyle, type TextTone, type TextVariant } from './styles.js'\n\nexport type TextAlign = 'start' | 'center' | 'end'\n\nexport function textStyle({\n variant = 'body.md',\n tone = 'primary',\n align,\n truncate = false,\n}: {\n variant?: TextVariant\n tone?: TextTone\n align?: TextAlign\n truncate?: boolean\n}): CSSProperties {\n return {\n margin: 0,\n color: textColorVar(tone),\n ...typographyStyle(variant),\n ...(align ? { textAlign: align } : null),\n ...(truncate\n ? { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }\n : null),\n }\n}\n","import type { ElementType, HTMLAttributes } from 'react'\nimport { mergeClassName, type TextTone, type TextVariant } from './styles.js'\nimport { textStyle, type TextAlign } from './textStyles.js'\n\nexport type { TextAlign } from './textStyles.js'\n\nexport type TextElement =\n | 'p'\n | 'span'\n | 'div'\n | 'label'\n | 'strong'\n | 'code'\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n\nexport interface TextProps extends HTMLAttributes<HTMLElement> {\n as?: TextElement\n variant?: TextVariant\n tone?: TextTone\n align?: TextAlign\n truncate?: boolean\n}\n\n/**\n * Typography primitive. `variant` covers every font role in the token set,\n * `tone` every `color.text.*` role.\n *\n * Pick `as` for semantics (a heading role does not imply an `<h2>`).\n */\nexport function Text({\n as = 'p',\n variant = 'body.md',\n tone = 'primary',\n align,\n truncate = false,\n className,\n style,\n children,\n ...rest\n}: TextProps) {\n const Component: ElementType = as\n\n return (\n <Component\n data-mason-component=\"text\"\n data-variant={variant}\n className={mergeClassName(className)}\n style={{ ...textStyle({ variant, tone, align, truncate }), ...style }}\n {...rest}\n >\n {children}\n </Component>\n )\n}\n","import type { CSSProperties } from 'react'\nimport { spacingVar, type Level } from './styles.js'\n\nexport type StackDirection = 'row' | 'column'\nexport type StackAlign = 'start' | 'center' | 'end' | 'stretch' | 'baseline'\nexport type StackJustify = 'start' | 'center' | 'end' | 'between'\n\nconst FLEX_ALIGN = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n stretch: 'stretch',\n baseline: 'baseline',\n} as const satisfies Record<StackAlign, string>\n\nconst FLEX_JUSTIFY = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n between: 'space-between',\n} as const satisfies Record<StackJustify, string>\n\n/** Row gaps come from `spacing.inline`, column gaps from `spacing.stack`. */\nexport function stackStyle({\n direction = 'column',\n gap = 'md',\n align,\n justify,\n wrap = false,\n inline = false,\n}: {\n direction?: StackDirection\n gap?: Level\n align?: StackAlign\n justify?: StackJustify\n wrap?: boolean\n inline?: boolean\n}): CSSProperties {\n return {\n display: inline ? 'inline-flex' : 'flex',\n flexDirection: direction,\n gap: spacingVar(direction === 'row' ? 'inline' : 'stack', gap),\n flexWrap: wrap ? 'wrap' : 'nowrap',\n minWidth: 0,\n ...(align ? { alignItems: FLEX_ALIGN[align] } : null),\n ...(justify ? { justifyContent: FLEX_JUSTIFY[justify] } : null),\n }\n}\n","import type { HTMLAttributes } from 'react'\nimport { mergeClassName, type Level } from './styles.js'\nimport {\n stackStyle,\n type StackAlign,\n type StackDirection,\n type StackJustify,\n} from './stackStyles.js'\n\nexport type {\n StackAlign,\n StackDirection,\n StackJustify,\n} from './stackStyles.js'\n\nexport interface StackProps extends HTMLAttributes<HTMLDivElement> {\n direction?: StackDirection\n gap?: Level\n align?: StackAlign\n justify?: StackJustify\n wrap?: boolean\n inline?: boolean\n}\n\n/** Layout primitive — flex row/column with token gaps. */\nexport function Stack({\n direction = 'column',\n gap = 'md',\n align,\n justify,\n wrap = false,\n inline = false,\n className,\n style,\n children,\n ...rest\n}: StackProps) {\n return (\n <div\n data-mason-component=\"stack\"\n data-direction={direction}\n className={mergeClassName(className)}\n style={{\n ...stackStyle({ direction, gap, align, justify, wrap, inline }),\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import type { CSSProperties } from 'react'\nimport {\n cssVar,\n radiusVar,\n shadowVar,\n spacingVar,\n type Level,\n type RadiusLevel,\n type ShadowLevel,\n} from './styles.js'\n\nexport type CardTone = 'surface' | 'canvas' | 'elevated'\n\nconst TONE_BG = {\n surface: 'color.bg.surface',\n canvas: 'color.bg.canvas',\n elevated: 'color.bg.elevated',\n} as const\n\nexport function cardStyle({\n padding = 'md',\n elevation = 'sm',\n radius = 'md',\n tone = 'surface',\n bordered = true,\n}: {\n padding?: Level\n elevation?: ShadowLevel\n radius?: RadiusLevel\n tone?: CardTone\n bordered?: boolean\n}): CSSProperties {\n return {\n display: 'block',\n padding: spacingVar('inset', padding),\n backgroundColor: cssVar(TONE_BG[tone]),\n color: cssVar('color.text.primary'),\n border: bordered ? `1px solid ${cssVar('color.border.subtle')}` : 'none',\n borderRadius: radiusVar(radius),\n boxShadow: shadowVar(elevation),\n boxSizing: 'border-box',\n minWidth: 0,\n }\n}\n","import type { HTMLAttributes } from 'react'\nimport {\n mergeClassName,\n type Level,\n type RadiusLevel,\n type ShadowLevel,\n} from './styles.js'\nimport { cardStyle, type CardTone } from './cardStyles.js'\n\nexport type { CardTone } from './cardStyles.js'\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n padding?: Level\n elevation?: ShadowLevel\n radius?: RadiusLevel\n tone?: CardTone\n bordered?: boolean\n}\n\n/** Surface primitive — background, border, radius and shadow from tokens. */\nexport function Card({\n padding = 'md',\n elevation = 'sm',\n radius = 'md',\n tone = 'surface',\n bordered = true,\n className,\n style,\n children,\n ...rest\n}: CardProps) {\n return (\n <div\n data-mason-component=\"card\"\n data-tone={tone}\n className={mergeClassName(className)}\n style={{\n ...cardStyle({ padding, elevation, radius, tone, bordered }),\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import type { CSSProperties } from 'react'\nimport { cssVar } from './styles.js'\n\nexport type DividerOrientation = 'horizontal' | 'vertical'\n\nexport function dividerStyle(orientation: DividerOrientation = 'horizontal'): CSSProperties {\n const line = `1px solid ${cssVar('color.border.subtle')}`\n\n if (orientation === 'vertical') {\n return {\n alignSelf: 'stretch',\n width: 0,\n minHeight: '1em',\n margin: 0,\n border: 'none',\n borderInlineStart: line,\n }\n }\n\n return {\n width: '100%',\n height: 0,\n margin: 0,\n border: 'none',\n borderBlockStart: line,\n }\n}\n","import type { HTMLAttributes } from 'react'\nimport { mergeClassName } from './styles.js'\nimport { dividerStyle, type DividerOrientation } from './dividerStyles.js'\n\nexport type { DividerOrientation } from './dividerStyles.js'\n\nexport interface DividerProps extends HTMLAttributes<HTMLHRElement> {\n orientation?: DividerOrientation\n}\n\n/** Separator line. `<hr>` already carries the separator role. */\nexport function Divider({\n orientation = 'horizontal',\n className,\n style,\n ...rest\n}: DividerProps) {\n return (\n <hr\n data-mason-component=\"divider\"\n data-orientation={orientation}\n aria-orientation={orientation === 'vertical' ? 'vertical' : undefined}\n className={mergeClassName(className)}\n style={{ ...dividerStyle(orientation), ...style }}\n {...rest}\n />\n )\n}\n","import type { CSSProperties } from 'react'\nimport { radiusVar, textColorVar } from './styles.js'\n\nexport type LinkTone = 'link' | 'inherit'\nexport type LinkUnderline = 'hover' | 'always' | 'none'\n\n/** Link inherits typography from its container so it can sit inside Text. */\nexport function linkStyle({\n tone = 'link',\n underline = 'hover',\n}: {\n tone?: LinkTone\n underline?: LinkUnderline\n}): CSSProperties {\n return {\n color: tone === 'inherit' ? 'inherit' : textColorVar('link'),\n textDecoration: underline === 'always' ? 'underline' : 'none',\n textUnderlineOffset: '0.15em',\n borderRadius: radiusVar('sm'),\n cursor: 'pointer',\n }\n}\n","import type { AnchorHTMLAttributes } from 'react'\nimport { mergeClassName } from './styles.js'\nimport { linkStyle, type LinkTone, type LinkUnderline } from './linkStyles.js'\n\nexport type { LinkTone, LinkUnderline } from './linkStyles.js'\n\nexport interface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n tone?: LinkTone\n underline?: LinkUnderline\n /** Adds `target=\"_blank\"` and a safe `rel`. */\n external?: boolean\n}\n\n/**\n * Navigational anchor. Typography is inherited, so it composes inside Text.\n *\n * For client-side routing, pass the router's component via `asChild`-style\n * composition on the consumer side (`<Link href>` stays a plain `<a>`).\n */\nexport function Link({\n tone = 'link',\n underline = 'hover',\n external = false,\n className,\n style,\n children,\n ...rest\n}: LinkProps) {\n const externalProps = external\n ? { target: '_blank', rel: 'noreferrer noopener' }\n : null\n\n return (\n <a\n data-mason-component=\"link\"\n data-tone={tone}\n data-underline={underline}\n className={mergeClassName(className)}\n style={{ ...linkStyle({ tone, underline }), ...style }}\n {...externalProps}\n {...rest}\n >\n {children}\n </a>\n )\n}\n","import type { CSSProperties } from 'react'\nimport { cssVar } from './styles.js'\n\n/** `inherit` follows the surrounding font size — used inside Button. */\nexport type SpinnerSize = 'sm' | 'md' | 'lg' | 'inherit'\n\nconst SIZE_DIMENSION = {\n sm: cssVar('font.body.sm.size'),\n md: cssVar('font.body.md.size'),\n lg: cssVar('font.display.lg.size'),\n inherit: '1em',\n} as const satisfies Record<SpinnerSize, string>\n\nexport function spinnerStyle(size: SpinnerSize = 'md'): CSSProperties {\n const dimension = SIZE_DIMENSION[size]\n\n return {\n width: dimension,\n height: dimension,\n border: '2px solid currentColor',\n borderTopColor: 'transparent',\n borderRadius: '50%',\n display: 'inline-block',\n flexShrink: 0,\n }\n}\n","import type { HTMLAttributes } from 'react'\nimport { mergeClassName } from './styles.js'\nimport { spinnerStyle, type SpinnerSize } from './spinnerStyles.js'\n\nexport type { SpinnerSize } from './spinnerStyles.js'\n\nexport interface SpinnerProps extends HTMLAttributes<HTMLSpanElement> {\n size?: SpinnerSize\n /** Announced while loading. Without it the spinner is `aria-hidden`. */\n label?: string\n}\n\n/** Indeterminate loading indicator. The rotation lives in `tokens.css`. */\nexport function Spinner({\n size = 'md',\n label,\n className,\n style,\n ...rest\n}: SpinnerProps) {\n return (\n <span\n data-mason-component=\"spinner\"\n data-size={size}\n role={label ? 'status' : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n className={mergeClassName(className)}\n style={{ ...spinnerStyle(size), ...style }}\n {...rest}\n />\n )\n}\n","import type { CSSProperties } from 'react'\nimport { cssVar, typographyStyle, type TextVariant } from './styles.js'\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger'\nexport type ButtonSize = 'sm' | 'md' | 'lg'\n\ntype ActionColorPath =\n | `color.action.${ButtonVariant | 'disabled'}.${'bg' | 'text' | 'border'}`\n\nfunction actionColors(variant: ButtonVariant | 'disabled'): {\n bg: ActionColorPath\n text: ActionColorPath\n border: ActionColorPath\n} {\n return {\n bg: `color.action.${variant}.bg`,\n text: `color.action.${variant}.text`,\n border: `color.action.${variant}.border`,\n }\n}\n\n/**\n * Size ladder — padding / radius / type. Height comes from content, not min-height.\n */\nconst sizeStyles = {\n sm: {\n paddingBlock: cssVar('spacing.inset.sm'),\n paddingInline: cssVar('spacing.inset.md'),\n gap: cssVar('spacing.inline.sm'),\n radius: cssVar('radius.sm'),\n font: 'label.sm' as TextVariant,\n },\n md: {\n paddingBlock: cssVar('spacing.inset.md'),\n paddingInline: cssVar('spacing.inset.lg'),\n gap: cssVar('spacing.inline.md'),\n radius: cssVar('radius.md'),\n font: 'label.md' as TextVariant,\n },\n lg: {\n paddingBlock: cssVar('spacing.inset.lg'),\n paddingInline: `calc(${cssVar('spacing.inset.lg')} + ${cssVar('spacing.inset.md')})`,\n gap: cssVar('spacing.inline.md'),\n radius: cssVar('radius.lg'),\n font: 'label.lg' as TextVariant,\n },\n} as const satisfies Record<\n ButtonSize,\n {\n paddingBlock: string\n paddingInline: string\n gap: string\n radius: string\n font: TextVariant\n }\n>\n\nexport function buttonStyle({\n variant = 'primary',\n size = 'md',\n disabled = false,\n loading = false,\n}: {\n variant?: ButtonVariant\n size?: ButtonSize\n disabled?: boolean\n loading?: boolean\n}): CSSProperties {\n const inactive = disabled || loading\n const colors = actionColors(inactive ? 'disabled' : variant)\n const sizing = sizeStyles[size]\n\n return {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: sizing.gap,\n paddingBlock: sizing.paddingBlock,\n paddingInline: sizing.paddingInline,\n margin: 0,\n backgroundColor: cssVar(colors.bg),\n color: cssVar(colors.text),\n border: `1px solid ${cssVar(colors.border)}`,\n borderRadius: sizing.radius,\n boxSizing: 'border-box',\n ...typographyStyle(sizing.font),\n textDecoration: 'none',\n whiteSpace: 'nowrap',\n }\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react'\nimport { mergeClassName } from './styles.js'\nimport { Spinner } from './Spinner.js'\nimport { buttonStyle, type ButtonSize, type ButtonVariant } from './buttonStyles.js'\n\nexport type { ButtonSize, ButtonVariant } from './buttonStyles.js'\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant\n size?: ButtonSize\n loading?: boolean\n leadingSlot?: ReactNode\n trailingSlot?: ReactNode\n}\n\n/**\n * Primary action component. Native `<button>` with token-backed styles.\n *\n * Icon-only usage requires an `aria-label`.\n */\nexport function Button({\n variant = 'primary',\n size = 'md',\n disabled = false,\n loading = false,\n leadingSlot,\n trailingSlot,\n className,\n style,\n children,\n type = 'button',\n ...rest\n}: ButtonProps) {\n const isDisabled = disabled || loading\n\n return (\n <button\n type={type}\n data-mason-component=\"button\"\n data-variant={variant}\n data-size={size}\n disabled={isDisabled}\n aria-busy={loading || undefined}\n className={mergeClassName(className)}\n style={{\n ...buttonStyle({ variant, size, disabled, loading }),\n ...style,\n }}\n {...rest}\n >\n {loading ? (\n <Spinner size=\"inherit\" data-mason-slot=\"spinner\" />\n ) : leadingSlot ? (\n <span data-mason-slot=\"leading\">{leadingSlot}</span>\n ) : null}\n {children ? <span data-mason-slot=\"label\">{children}</span> : null}\n {trailingSlot && !loading ? (\n <span data-mason-slot=\"trailing\">{trailingSlot}</span>\n ) : null}\n </button>\n )\n}\n","import type { CSSProperties } from 'react'\nimport {\n cssVar,\n radiusVar,\n spacingVar,\n typographyStyle,\n type FeedbackTone,\n} from './styles.js'\n\nexport type BadgeTone = FeedbackTone | 'neutral'\nexport type BadgeSize = 'sm' | 'md'\n\nexport function badgeStyle({\n tone = 'neutral',\n size = 'sm',\n}: {\n tone?: BadgeTone\n size?: BadgeSize\n}): CSSProperties {\n const colors =\n tone === 'neutral'\n ? {\n bg: cssVar('color.bg.canvas'),\n text: cssVar('color.text.secondary'),\n border: cssVar('color.border.subtle'),\n }\n : {\n bg: cssVar(`color.feedback.${tone}.bg`),\n text: cssVar(`color.feedback.${tone}.text`),\n border: cssVar(`color.feedback.${tone}.border`),\n }\n\n return {\n display: 'inline-flex',\n alignItems: 'center',\n gap: spacingVar('inline', 'sm'),\n paddingBlock: '0.125em',\n paddingInline: spacingVar('inset', 'sm'),\n backgroundColor: colors.bg,\n color: colors.text,\n border: `1px solid ${colors.border}`,\n borderRadius: radiusVar('full'),\n ...typographyStyle(size === 'sm' ? 'label.sm' : 'label.md'),\n whiteSpace: 'nowrap',\n }\n}\n","import type { HTMLAttributes } from 'react'\nimport { mergeClassName } from './styles.js'\nimport { badgeStyle, type BadgeSize, type BadgeTone } from './badgeStyles.js'\n\nexport type { BadgeSize, BadgeTone } from './badgeStyles.js'\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n tone?: BadgeTone\n size?: BadgeSize\n}\n\n/**\n * Compact status chip. Colour carries no meaning on its own — keep the label\n * readable (`활성`, not just a green dot).\n */\nexport function Badge({\n tone = 'neutral',\n size = 'sm',\n className,\n style,\n children,\n ...rest\n}: BadgeProps) {\n return (\n <span\n data-mason-component=\"badge\"\n data-tone={tone}\n data-size={size}\n className={mergeClassName(className)}\n style={{ ...badgeStyle({ tone, size }), ...style }}\n {...rest}\n >\n {children}\n </span>\n )\n}\n","import type { CSSProperties } from 'react'\nimport {\n cssVar,\n radiusVar,\n spacingVar,\n typographyStyle,\n type FeedbackTone,\n} from './styles.js'\n\nexport function calloutStyle(tone: FeedbackTone = 'info'): CSSProperties {\n return {\n display: 'flex',\n gap: spacingVar('inline', 'md'),\n padding: spacingVar('inset', 'md'),\n backgroundColor: cssVar(`color.feedback.${tone}.bg`),\n color: cssVar(`color.feedback.${tone}.text`),\n border: `1px solid ${cssVar(`color.feedback.${tone}.border`)}`,\n borderRadius: radiusVar('md'),\n boxSizing: 'border-box',\n ...typographyStyle('body.md'),\n }\n}\n\nexport function calloutContentStyle(): CSSProperties {\n return {\n display: 'flex',\n flexDirection: 'column',\n gap: spacingVar('stack', 'sm'),\n minWidth: 0,\n }\n}\n\nexport function calloutTitleStyle(): CSSProperties {\n return { margin: 0, ...typographyStyle('label.md') }\n}\n\nexport function calloutBodyStyle(): CSSProperties {\n return { margin: 0, ...typographyStyle('body.sm') }\n}\n","import type { HTMLAttributes, ReactNode } from 'react'\nimport { mergeClassName, type FeedbackTone } from './styles.js'\nimport {\n calloutBodyStyle,\n calloutContentStyle,\n calloutStyle,\n calloutTitleStyle,\n} from './calloutStyles.js'\n\n/** `title` is the heading slot, so the native tooltip attribute is not available. */\nexport interface CalloutProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n tone?: FeedbackTone\n title?: ReactNode\n iconSlot?: ReactNode\n}\n\n/**\n * Inline message block for page-level feedback.\n *\n * It is static content by default — for something that appears in response to\n * an action, pass `role=\"status\"` (or `\"alert\"` when it must interrupt).\n */\nexport function Callout({\n tone = 'info',\n title,\n iconSlot,\n className,\n style,\n children,\n ...rest\n}: CalloutProps) {\n return (\n <div\n data-mason-component=\"callout\"\n data-tone={tone}\n className={mergeClassName(className)}\n style={{ ...calloutStyle(tone), ...style }}\n {...rest}\n >\n {iconSlot ? (\n <span data-mason-slot=\"icon\" aria-hidden=\"true\">\n {iconSlot}\n </span>\n ) : null}\n <div data-mason-slot=\"content\" style={calloutContentStyle()}>\n {title ? (\n <p data-mason-slot=\"title\" style={calloutTitleStyle()}>\n {title}\n </p>\n ) : null}\n {children ? (\n <div data-mason-slot=\"body\" style={calloutBodyStyle()}>\n {children}\n </div>\n ) : null}\n </div>\n </div>\n )\n}\n","import { useId, type CSSProperties, type ReactNode } from 'react'\nimport { mergeClassName } from './styles.js'\nimport {\n fieldDescriptionStyle,\n fieldErrorStyle,\n fieldLabelStyle,\n fieldRootStyle,\n type FieldSize,\n} from './fieldStyles.js'\n\nexport interface FieldIds {\n controlId: string\n descriptionId: string\n errorId: string\n /** `aria-describedby` value, or undefined when there is nothing to describe. */\n describedBy: string | undefined\n}\n\n/** Stable ids wiring a control to its label, description and error. */\nexport function useFieldIds({\n id,\n description,\n error,\n}: {\n id?: string\n description?: ReactNode\n error?: ReactNode\n}): FieldIds {\n const generated = useId()\n const controlId = id ?? `mason-field-${generated}`\n const descriptionId = `${controlId}-description`\n const errorId = `${controlId}-error`\n const describedBy =\n [description ? descriptionId : null, error ? errorId : null]\n .filter(Boolean)\n .join(' ') || undefined\n\n return { controlId, descriptionId, errorId, describedBy }\n}\n\nexport interface FieldFrameProps {\n /** `data-mason-component` value of the wrapper, e.g. `text-field`. */\n component: string\n ids: FieldIds\n label?: ReactNode\n description?: ReactNode\n error?: ReactNode\n size?: FieldSize\n invalid?: boolean\n disabled?: boolean\n className?: string\n style?: CSSProperties\n children: ReactNode\n}\n\n/**\n * Shared label / description / error chrome for form controls.\n * Internal — consumers use TextField, Select or Checkbox.\n */\nexport function FieldFrame({\n component,\n ids,\n label,\n description,\n error,\n size = 'md',\n invalid = false,\n disabled = false,\n className,\n style,\n children,\n}: FieldFrameProps) {\n return (\n <div\n data-mason-component={component}\n data-size={size}\n data-invalid={invalid || undefined}\n data-disabled={disabled || undefined}\n className={mergeClassName(className)}\n style={{ ...fieldRootStyle(), ...style }}\n >\n {label ? (\n <label\n data-mason-slot=\"label\"\n htmlFor={ids.controlId}\n style={fieldLabelStyle(size)}\n >\n {label}\n </label>\n ) : null}\n {children}\n {description ? (\n <p\n data-mason-slot=\"description\"\n id={ids.descriptionId}\n style={fieldDescriptionStyle()}\n >\n {description}\n </p>\n ) : null}\n {error ? (\n <p\n data-mason-slot=\"error\"\n id={ids.errorId}\n role=\"alert\"\n style={fieldErrorStyle()}\n >\n {error}\n </p>\n ) : null}\n </div>\n )\n}\n","import type { CSSProperties } from 'react'\nimport {\n cssVar,\n radiusVar,\n spacingVar,\n typographyStyle,\n type Level,\n type TextVariant,\n} from './styles.js'\n\n/** Field sizes reuse the spacing ladder — sm / md / lg. */\nexport type FieldSize = Level\n\nconst CONTROL_FONT = {\n sm: 'body.sm',\n md: 'body.md',\n lg: 'body.lg',\n} as const satisfies Record<FieldSize, TextVariant>\n\nconst LABEL_FONT = {\n sm: 'label.sm',\n md: 'label.md',\n lg: 'label.lg',\n} as const satisfies Record<FieldSize, TextVariant>\n\nconst CONTROL_PADDING_BLOCK = { sm: 'sm', md: 'sm', lg: 'md' } as const satisfies Record<\n FieldSize,\n Level\n>\n\nconst CONTROL_PADDING_INLINE = { sm: 'sm', md: 'md', lg: 'md' } as const satisfies Record<\n FieldSize,\n Level\n>\n\nexport function fieldRootStyle(): CSSProperties {\n return {\n display: 'flex',\n flexDirection: 'column',\n gap: spacingVar('stack', 'sm'),\n minWidth: 0,\n }\n}\n\nexport function fieldLabelStyle(size: FieldSize = 'md'): CSSProperties {\n return {\n color: cssVar('color.text.primary'),\n ...typographyStyle(LABEL_FONT[size]),\n }\n}\n\nexport function fieldControlStyle({\n size = 'md',\n invalid = false,\n disabled = false,\n}: {\n size?: FieldSize\n invalid?: boolean\n disabled?: boolean\n}): CSSProperties {\n return {\n width: '100%',\n boxSizing: 'border-box',\n margin: 0,\n paddingBlock: spacingVar('inset', CONTROL_PADDING_BLOCK[size]),\n paddingInline: spacingVar('inset', CONTROL_PADDING_INLINE[size]),\n backgroundColor: disabled\n ? cssVar('color.action.disabled.bg')\n : cssVar('color.field.bg'),\n color: disabled ? cssVar('color.text.disabled') : cssVar('color.field.text'),\n border: `1px solid ${cssVar(\n invalid ? 'color.field.borderInvalid' : 'color.field.border',\n )}`,\n borderRadius: radiusVar('md'),\n ...typographyStyle(CONTROL_FONT[size]),\n }\n}\n\nexport function fieldDescriptionStyle(): CSSProperties {\n return {\n margin: 0,\n color: cssVar('color.text.secondary'),\n ...typographyStyle('body.sm'),\n }\n}\n\nexport function fieldErrorStyle(): CSSProperties {\n return {\n margin: 0,\n color: cssVar('color.text.danger'),\n ...typographyStyle('body.sm'),\n }\n}\n\n/** Native input kept for a11y; the visible chrome is a sibling indicator. */\nexport function visuallyHiddenControlStyle(): CSSProperties {\n return {\n position: 'absolute',\n width: 1,\n height: 1,\n padding: 0,\n margin: -1,\n overflow: 'hidden',\n clip: 'rect(0, 0, 0, 0)',\n whiteSpace: 'nowrap',\n borderWidth: 0,\n borderStyle: 'solid',\n borderColor: 'transparent',\n }\n}\n","import type { InputHTMLAttributes, ReactNode } from 'react'\nimport { FieldFrame, useFieldIds } from './field.js'\nimport { fieldControlStyle, type FieldSize } from './fieldStyles.js'\n\nexport type { FieldSize } from './fieldStyles.js'\n\nexport interface TextFieldProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {\n label?: ReactNode\n description?: ReactNode\n /** Present error text switches the field to its invalid styling. */\n error?: ReactNode\n size?: FieldSize\n invalid?: boolean\n}\n\n/**\n * Labelled text input. `className` / `style` apply to the wrapper; every other\n * prop goes to the native `<input>`.\n */\nexport function TextField({\n label,\n description,\n error,\n size = 'md',\n invalid,\n id,\n disabled = false,\n className,\n style,\n ...rest\n}: TextFieldProps) {\n const ids = useFieldIds({ id, description, error })\n const isInvalid = invalid ?? Boolean(error)\n\n return (\n <FieldFrame\n component=\"text-field\"\n ids={ids}\n label={label}\n description={description}\n error={error}\n size={size}\n invalid={isInvalid}\n disabled={disabled}\n className={className}\n style={style}\n >\n <input\n {...rest}\n id={ids.controlId}\n data-mason-slot=\"control\"\n disabled={disabled}\n aria-invalid={isInvalid || undefined}\n aria-describedby={ids.describedBy}\n style={fieldControlStyle({ size, invalid: isInvalid, disabled })}\n />\n </FieldFrame>\n )\n}\n","import type { ReactNode, SelectHTMLAttributes } from 'react'\nimport { FieldFrame, useFieldIds } from './field.js'\nimport { fieldControlStyle, type FieldSize } from './fieldStyles.js'\n\nexport interface SelectProps\n extends Omit<SelectHTMLAttributes<HTMLSelectElement>, 'size'> {\n label?: ReactNode\n description?: ReactNode\n error?: ReactNode\n size?: FieldSize\n invalid?: boolean\n /** Rendered as a leading empty `<option>`. */\n placeholder?: string\n}\n\n/**\n * Labelled native `<select>`. Children are the `<option>` elements, so the\n * browser's own popup and keyboard behaviour is preserved.\n */\nexport function Select({\n label,\n description,\n error,\n size = 'md',\n invalid,\n placeholder,\n id,\n disabled = false,\n className,\n style,\n children,\n ...rest\n}: SelectProps) {\n const ids = useFieldIds({ id, description, error })\n const isInvalid = invalid ?? Boolean(error)\n\n return (\n <FieldFrame\n component=\"select\"\n ids={ids}\n label={label}\n description={description}\n error={error}\n size={size}\n invalid={isInvalid}\n disabled={disabled}\n className={className}\n style={style}\n >\n <select\n {...rest}\n id={ids.controlId}\n data-mason-slot=\"control\"\n disabled={disabled}\n aria-invalid={isInvalid || undefined}\n aria-describedby={ids.describedBy}\n style={fieldControlStyle({ size, invalid: isInvalid, disabled })}\n >\n {placeholder ? <option value=\"\">{placeholder}</option> : null}\n {children}\n </select>\n </FieldFrame>\n )\n}\n","import type { CSSProperties } from 'react'\nimport { radiusVar, spacingVar, typographyStyle, cssVar } from './styles.js'\n\nconst CONTROL_SIZE = '1.125rem'\n\nexport function checkboxRootStyle(): CSSProperties {\n return {\n display: 'flex',\n flexDirection: 'column',\n gap: spacingVar('stack', 'sm'),\n minWidth: 0,\n }\n}\n\nexport function checkboxLabelStyle(disabled = false): CSSProperties {\n return {\n display: 'inline-flex',\n alignItems: 'flex-start',\n gap: spacingVar('inline', 'sm'),\n cursor: disabled ? 'not-allowed' : 'pointer',\n color: disabled ? cssVar('color.text.disabled') : cssVar('color.text.primary'),\n ...typographyStyle('body.md'),\n }\n}\n\n/** Geometry only — colors / check mark live in foundationsCss. */\nexport function checkboxIndicatorStyle(): CSSProperties {\n return {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: CONTROL_SIZE,\n height: CONTROL_SIZE,\n marginBlockStart: '0.2em',\n flexShrink: 0,\n boxSizing: 'border-box',\n borderRadius: radiusVar('sm'),\n borderStyle: 'solid',\n borderWidth: '1.5px',\n }\n}\n","import type { InputHTMLAttributes, ReactNode } from 'react'\nimport { useFieldIds } from './field.js'\nimport { mergeClassName } from './styles.js'\nimport {\n fieldDescriptionStyle,\n fieldErrorStyle,\n visuallyHiddenControlStyle,\n} from './fieldStyles.js'\nimport {\n checkboxIndicatorStyle,\n checkboxLabelStyle,\n checkboxRootStyle,\n} from './checkboxStyles.js'\n\nexport interface CheckboxProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'> {\n label?: ReactNode\n description?: ReactNode\n error?: ReactNode\n invalid?: boolean\n}\n\n/**\n * Token-backed checkbox with a drawn indicator.\n * A visually hidden native input keeps form / keyboard behaviour.\n * The check mark is painted with `::after` in foundationsCss.\n */\nexport function Checkbox({\n label,\n description,\n error,\n invalid,\n id,\n disabled = false,\n className,\n style,\n ...rest\n}: CheckboxProps) {\n const ids = useFieldIds({ id, description, error })\n const isInvalid = invalid ?? Boolean(error)\n\n return (\n <div\n data-mason-component=\"checkbox\"\n data-invalid={isInvalid || undefined}\n data-disabled={disabled || undefined}\n className={mergeClassName(className)}\n style={{ ...checkboxRootStyle(), ...style }}\n >\n <label\n data-mason-slot=\"label\"\n htmlFor={ids.controlId}\n style={checkboxLabelStyle(disabled)}\n >\n <input\n {...rest}\n type=\"checkbox\"\n id={ids.controlId}\n data-mason-slot=\"control\"\n disabled={disabled}\n aria-invalid={isInvalid || undefined}\n aria-describedby={ids.describedBy}\n style={visuallyHiddenControlStyle()}\n />\n <span data-mason-slot=\"indicator\" aria-hidden=\"true\" style={checkboxIndicatorStyle()} />\n {label ? <span data-mason-slot=\"label-text\">{label}</span> : null}\n </label>\n {description ? (\n <p\n data-mason-slot=\"description\"\n id={ids.descriptionId}\n style={fieldDescriptionStyle()}\n >\n {description}\n </p>\n ) : null}\n {error ? (\n <p\n data-mason-slot=\"error\"\n id={ids.errorId}\n role=\"alert\"\n style={fieldErrorStyle()}\n >\n {error}\n </p>\n ) : null}\n </div>\n )\n}\n","import type { CSSProperties } from 'react'\nimport { cssVar, spacingVar, typographyStyle } from './styles.js'\n\nconst CONTROL_SIZE = '1.125rem'\n\nexport function radioRootStyle(): CSSProperties {\n return {\n display: 'flex',\n flexDirection: 'column',\n gap: spacingVar('stack', 'sm'),\n minWidth: 0,\n }\n}\n\nexport function radioLabelStyle(disabled = false): CSSProperties {\n return {\n display: 'inline-flex',\n alignItems: 'flex-start',\n gap: spacingVar('inline', 'sm'),\n cursor: disabled ? 'not-allowed' : 'pointer',\n color: disabled ? cssVar('color.text.disabled') : cssVar('color.text.primary'),\n ...typographyStyle('body.md'),\n }\n}\n\n/** Geometry only — colors / selected dot live in foundationsCss. */\nexport function radioIndicatorStyle(): CSSProperties {\n return {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: CONTROL_SIZE,\n height: CONTROL_SIZE,\n marginBlockStart: '0.2em',\n flexShrink: 0,\n boxSizing: 'border-box',\n borderRadius: '999px',\n borderStyle: 'solid',\n borderWidth: '1.5px',\n }\n}\n","import type { InputHTMLAttributes, ReactNode } from 'react'\nimport { useFieldIds } from './field.js'\nimport { mergeClassName } from './styles.js'\nimport {\n fieldDescriptionStyle,\n fieldErrorStyle,\n visuallyHiddenControlStyle,\n} from './fieldStyles.js'\nimport {\n radioIndicatorStyle,\n radioLabelStyle,\n radioRootStyle,\n} from './radioStyles.js'\n\nexport interface RadioProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'> {\n label?: ReactNode\n description?: ReactNode\n error?: ReactNode\n invalid?: boolean\n}\n\n/**\n * Token-backed radio with a drawn indicator.\n * A visually hidden native input keeps form / keyboard behaviour.\n * The selected dot is painted with `::after` in foundationsCss.\n */\nexport function Radio({\n label,\n description,\n error,\n invalid,\n id,\n disabled = false,\n className,\n style,\n ...rest\n}: RadioProps) {\n const ids = useFieldIds({ id, description, error })\n const isInvalid = invalid ?? Boolean(error)\n\n return (\n <div\n data-mason-component=\"radio\"\n data-invalid={isInvalid || undefined}\n data-disabled={disabled || undefined}\n className={mergeClassName(className)}\n style={{ ...radioRootStyle(), ...style }}\n >\n <label\n data-mason-slot=\"label\"\n htmlFor={ids.controlId}\n style={radioLabelStyle(disabled)}\n >\n <input\n {...rest}\n type=\"radio\"\n id={ids.controlId}\n data-mason-slot=\"control\"\n disabled={disabled}\n aria-invalid={isInvalid || undefined}\n aria-describedby={ids.describedBy}\n style={visuallyHiddenControlStyle()}\n />\n <span data-mason-slot=\"indicator\" aria-hidden=\"true\" style={radioIndicatorStyle()} />\n {label ? <span data-mason-slot=\"label-text\">{label}</span> : null}\n </label>\n {description ? (\n <p\n data-mason-slot=\"description\"\n id={ids.descriptionId}\n style={fieldDescriptionStyle()}\n >\n {description}\n </p>\n ) : null}\n {error ? (\n <p\n data-mason-slot=\"error\"\n id={ids.errorId}\n role=\"alert\"\n style={fieldErrorStyle()}\n >\n {error}\n </p>\n ) : null}\n </div>\n )\n}\n"],"mappings":"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","names":["import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","CONTROL_SIZE","import_jsx_runtime"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -195,9 +195,23 @@ interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'typ
|
|
|
195
195
|
invalid?: boolean;
|
|
196
196
|
}
|
|
197
197
|
/**
|
|
198
|
-
*
|
|
199
|
-
*
|
|
198
|
+
* Token-backed checkbox with a drawn indicator.
|
|
199
|
+
* A visually hidden native input keeps form / keyboard behaviour.
|
|
200
|
+
* The check mark is painted with `::after` in foundationsCss.
|
|
200
201
|
*/
|
|
201
202
|
declare function Checkbox({ label, description, error, invalid, id, disabled, className, style, ...rest }: CheckboxProps): react.JSX.Element;
|
|
202
203
|
|
|
203
|
-
|
|
204
|
+
interface RadioProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'> {
|
|
205
|
+
label?: ReactNode;
|
|
206
|
+
description?: ReactNode;
|
|
207
|
+
error?: ReactNode;
|
|
208
|
+
invalid?: boolean;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Token-backed radio with a drawn indicator.
|
|
212
|
+
* A visually hidden native input keeps form / keyboard behaviour.
|
|
213
|
+
* The selected dot is painted with `::after` in foundationsCss.
|
|
214
|
+
*/
|
|
215
|
+
declare function Radio({ label, description, error, invalid, id, disabled, className, style, ...rest }: RadioProps): react.JSX.Element;
|
|
216
|
+
|
|
217
|
+
export { Badge, type BadgeProps, type BadgeSize, type BadgeTone, Button, type ButtonProps, type ButtonSize, type ButtonVariant, Callout, type CalloutProps, Card, type CardProps, type CardTone, Checkbox, type CheckboxProps, Divider, type DividerOrientation, type DividerProps, type FeedbackTone, type FieldSize, type Level, Link, type LinkProps, type LinkTone, type LinkUnderline, MasonProvider, type MasonProviderProps, type MasonTheme, Radio, type RadioProps, type RadiusLevel, Select, type SelectProps, type ShadowLevel, Spinner, type SpinnerProps, type SpinnerSize, Stack, type StackAlign, type StackDirection, type StackJustify, type StackProps, Text, type TextAlign, type TextElement, TextField, type TextFieldProps, type TextProps, type TextTone, type TextVariant };
|
package/dist/index.d.ts
CHANGED
|
@@ -195,9 +195,23 @@ interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'typ
|
|
|
195
195
|
invalid?: boolean;
|
|
196
196
|
}
|
|
197
197
|
/**
|
|
198
|
-
*
|
|
199
|
-
*
|
|
198
|
+
* Token-backed checkbox with a drawn indicator.
|
|
199
|
+
* A visually hidden native input keeps form / keyboard behaviour.
|
|
200
|
+
* The check mark is painted with `::after` in foundationsCss.
|
|
200
201
|
*/
|
|
201
202
|
declare function Checkbox({ label, description, error, invalid, id, disabled, className, style, ...rest }: CheckboxProps): react.JSX.Element;
|
|
202
203
|
|
|
203
|
-
|
|
204
|
+
interface RadioProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'> {
|
|
205
|
+
label?: ReactNode;
|
|
206
|
+
description?: ReactNode;
|
|
207
|
+
error?: ReactNode;
|
|
208
|
+
invalid?: boolean;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Token-backed radio with a drawn indicator.
|
|
212
|
+
* A visually hidden native input keeps form / keyboard behaviour.
|
|
213
|
+
* The selected dot is painted with `::after` in foundationsCss.
|
|
214
|
+
*/
|
|
215
|
+
declare function Radio({ label, description, error, invalid, id, disabled, className, style, ...rest }: RadioProps): react.JSX.Element;
|
|
216
|
+
|
|
217
|
+
export { Badge, type BadgeProps, type BadgeSize, type BadgeTone, Button, type ButtonProps, type ButtonSize, type ButtonVariant, Callout, type CalloutProps, Card, type CardProps, type CardTone, Checkbox, type CheckboxProps, Divider, type DividerOrientation, type DividerProps, type FeedbackTone, type FieldSize, type Level, Link, type LinkProps, type LinkTone, type LinkUnderline, MasonProvider, type MasonProviderProps, type MasonTheme, Radio, type RadioProps, type RadiusLevel, Select, type SelectProps, type ShadowLevel, Spinner, type SpinnerProps, type SpinnerSize, Stack, type StackAlign, type StackDirection, type StackJustify, type StackProps, Text, type TextAlign, type TextElement, TextField, type TextFieldProps, type TextProps, type TextTone, type TextVariant };
|
package/dist/index.js
CHANGED
|
@@ -599,6 +599,21 @@ function fieldErrorStyle() {
|
|
|
599
599
|
...typographyStyle("body.sm")
|
|
600
600
|
};
|
|
601
601
|
}
|
|
602
|
+
function visuallyHiddenControlStyle() {
|
|
603
|
+
return {
|
|
604
|
+
position: "absolute",
|
|
605
|
+
width: 1,
|
|
606
|
+
height: 1,
|
|
607
|
+
padding: 0,
|
|
608
|
+
margin: -1,
|
|
609
|
+
overflow: "hidden",
|
|
610
|
+
clip: "rect(0, 0, 0, 0)",
|
|
611
|
+
whiteSpace: "nowrap",
|
|
612
|
+
borderWidth: 0,
|
|
613
|
+
borderStyle: "solid",
|
|
614
|
+
borderColor: "transparent"
|
|
615
|
+
};
|
|
616
|
+
}
|
|
602
617
|
|
|
603
618
|
// src/field.tsx
|
|
604
619
|
import { jsx as jsx11, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
@@ -768,6 +783,7 @@ function Select({
|
|
|
768
783
|
}
|
|
769
784
|
|
|
770
785
|
// src/checkboxStyles.ts
|
|
786
|
+
var CONTROL_SIZE = "1.125rem";
|
|
771
787
|
function checkboxRootStyle() {
|
|
772
788
|
return {
|
|
773
789
|
display: "flex",
|
|
@@ -786,14 +802,19 @@ function checkboxLabelStyle(disabled = false) {
|
|
|
786
802
|
...typographyStyle("body.md")
|
|
787
803
|
};
|
|
788
804
|
}
|
|
789
|
-
function
|
|
805
|
+
function checkboxIndicatorStyle() {
|
|
790
806
|
return {
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
807
|
+
display: "inline-flex",
|
|
808
|
+
alignItems: "center",
|
|
809
|
+
justifyContent: "center",
|
|
810
|
+
width: CONTROL_SIZE,
|
|
811
|
+
height: CONTROL_SIZE,
|
|
812
|
+
marginBlockStart: "0.2em",
|
|
813
|
+
flexShrink: 0,
|
|
814
|
+
boxSizing: "border-box",
|
|
815
|
+
borderRadius: radiusVar("sm"),
|
|
816
|
+
borderStyle: "solid",
|
|
817
|
+
borderWidth: "1.5px"
|
|
797
818
|
};
|
|
798
819
|
}
|
|
799
820
|
|
|
@@ -838,9 +859,10 @@ function Checkbox({
|
|
|
838
859
|
disabled,
|
|
839
860
|
"aria-invalid": isInvalid || void 0,
|
|
840
861
|
"aria-describedby": ids.describedBy,
|
|
841
|
-
style:
|
|
862
|
+
style: visuallyHiddenControlStyle()
|
|
842
863
|
}
|
|
843
864
|
),
|
|
865
|
+
/* @__PURE__ */ jsx14("span", { "data-mason-slot": "indicator", "aria-hidden": "true", style: checkboxIndicatorStyle() }),
|
|
844
866
|
label ? /* @__PURE__ */ jsx14("span", { "data-mason-slot": "label-text", children: label }) : null
|
|
845
867
|
]
|
|
846
868
|
}
|
|
@@ -868,6 +890,115 @@ function Checkbox({
|
|
|
868
890
|
}
|
|
869
891
|
);
|
|
870
892
|
}
|
|
893
|
+
|
|
894
|
+
// src/radioStyles.ts
|
|
895
|
+
var CONTROL_SIZE2 = "1.125rem";
|
|
896
|
+
function radioRootStyle() {
|
|
897
|
+
return {
|
|
898
|
+
display: "flex",
|
|
899
|
+
flexDirection: "column",
|
|
900
|
+
gap: spacingVar("stack", "sm"),
|
|
901
|
+
minWidth: 0
|
|
902
|
+
};
|
|
903
|
+
}
|
|
904
|
+
function radioLabelStyle(disabled = false) {
|
|
905
|
+
return {
|
|
906
|
+
display: "inline-flex",
|
|
907
|
+
alignItems: "flex-start",
|
|
908
|
+
gap: spacingVar("inline", "sm"),
|
|
909
|
+
cursor: disabled ? "not-allowed" : "pointer",
|
|
910
|
+
color: disabled ? cssVar("color.text.disabled") : cssVar("color.text.primary"),
|
|
911
|
+
...typographyStyle("body.md")
|
|
912
|
+
};
|
|
913
|
+
}
|
|
914
|
+
function radioIndicatorStyle() {
|
|
915
|
+
return {
|
|
916
|
+
display: "inline-flex",
|
|
917
|
+
alignItems: "center",
|
|
918
|
+
justifyContent: "center",
|
|
919
|
+
width: CONTROL_SIZE2,
|
|
920
|
+
height: CONTROL_SIZE2,
|
|
921
|
+
marginBlockStart: "0.2em",
|
|
922
|
+
flexShrink: 0,
|
|
923
|
+
boxSizing: "border-box",
|
|
924
|
+
borderRadius: "999px",
|
|
925
|
+
borderStyle: "solid",
|
|
926
|
+
borderWidth: "1.5px"
|
|
927
|
+
};
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
// src/Radio.tsx
|
|
931
|
+
import { jsx as jsx15, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
932
|
+
function Radio({
|
|
933
|
+
label,
|
|
934
|
+
description,
|
|
935
|
+
error,
|
|
936
|
+
invalid,
|
|
937
|
+
id,
|
|
938
|
+
disabled = false,
|
|
939
|
+
className,
|
|
940
|
+
style,
|
|
941
|
+
...rest
|
|
942
|
+
}) {
|
|
943
|
+
const ids = useFieldIds({ id, description, error });
|
|
944
|
+
const isInvalid = invalid ?? Boolean(error);
|
|
945
|
+
return /* @__PURE__ */ jsxs6(
|
|
946
|
+
"div",
|
|
947
|
+
{
|
|
948
|
+
"data-mason-component": "radio",
|
|
949
|
+
"data-invalid": isInvalid || void 0,
|
|
950
|
+
"data-disabled": disabled || void 0,
|
|
951
|
+
className: mergeClassName(className),
|
|
952
|
+
style: { ...radioRootStyle(), ...style },
|
|
953
|
+
children: [
|
|
954
|
+
/* @__PURE__ */ jsxs6(
|
|
955
|
+
"label",
|
|
956
|
+
{
|
|
957
|
+
"data-mason-slot": "label",
|
|
958
|
+
htmlFor: ids.controlId,
|
|
959
|
+
style: radioLabelStyle(disabled),
|
|
960
|
+
children: [
|
|
961
|
+
/* @__PURE__ */ jsx15(
|
|
962
|
+
"input",
|
|
963
|
+
{
|
|
964
|
+
...rest,
|
|
965
|
+
type: "radio",
|
|
966
|
+
id: ids.controlId,
|
|
967
|
+
"data-mason-slot": "control",
|
|
968
|
+
disabled,
|
|
969
|
+
"aria-invalid": isInvalid || void 0,
|
|
970
|
+
"aria-describedby": ids.describedBy,
|
|
971
|
+
style: visuallyHiddenControlStyle()
|
|
972
|
+
}
|
|
973
|
+
),
|
|
974
|
+
/* @__PURE__ */ jsx15("span", { "data-mason-slot": "indicator", "aria-hidden": "true", style: radioIndicatorStyle() }),
|
|
975
|
+
label ? /* @__PURE__ */ jsx15("span", { "data-mason-slot": "label-text", children: label }) : null
|
|
976
|
+
]
|
|
977
|
+
}
|
|
978
|
+
),
|
|
979
|
+
description ? /* @__PURE__ */ jsx15(
|
|
980
|
+
"p",
|
|
981
|
+
{
|
|
982
|
+
"data-mason-slot": "description",
|
|
983
|
+
id: ids.descriptionId,
|
|
984
|
+
style: fieldDescriptionStyle(),
|
|
985
|
+
children: description
|
|
986
|
+
}
|
|
987
|
+
) : null,
|
|
988
|
+
error ? /* @__PURE__ */ jsx15(
|
|
989
|
+
"p",
|
|
990
|
+
{
|
|
991
|
+
"data-mason-slot": "error",
|
|
992
|
+
id: ids.errorId,
|
|
993
|
+
role: "alert",
|
|
994
|
+
style: fieldErrorStyle(),
|
|
995
|
+
children: error
|
|
996
|
+
}
|
|
997
|
+
) : null
|
|
998
|
+
]
|
|
999
|
+
}
|
|
1000
|
+
);
|
|
1001
|
+
}
|
|
871
1002
|
export {
|
|
872
1003
|
Badge,
|
|
873
1004
|
Button,
|
|
@@ -877,6 +1008,7 @@ export {
|
|
|
877
1008
|
Divider,
|
|
878
1009
|
Link,
|
|
879
1010
|
MasonProvider,
|
|
1011
|
+
Radio,
|
|
880
1012
|
Select,
|
|
881
1013
|
Spinner,
|
|
882
1014
|
Stack,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/provider.tsx","../src/styles.ts","../src/textStyles.ts","../src/Text.tsx","../src/stackStyles.ts","../src/Stack.tsx","../src/cardStyles.ts","../src/Card.tsx","../src/dividerStyles.ts","../src/Divider.tsx","../src/linkStyles.ts","../src/Link.tsx","../src/spinnerStyles.ts","../src/Spinner.tsx","../src/buttonStyles.ts","../src/Button.tsx","../src/badgeStyles.ts","../src/Badge.tsx","../src/calloutStyles.ts","../src/Callout.tsx","../src/field.tsx","../src/fieldStyles.ts","../src/TextField.tsx","../src/Select.tsx","../src/checkboxStyles.ts","../src/Checkbox.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\n\nexport type MasonTheme = 'light' | 'dark' | 'system'\n\nexport interface MasonProviderProps {\n children: ReactNode\n theme?: MasonTheme\n}\n\n/** Root provider for mason-ds React apps. */\nexport function MasonProvider({ children, theme = 'light' }: MasonProviderProps) {\n return <div data-mason-provider data-mason-theme={theme}>{children}</div>\n}\n","import { getSemanticCssVar, type SemanticTokenPath } from '@mason-ds/tokens'\n\n/**\n * Prop unions are derived from the semantic token paths, so adding or removing\n * a token role changes the component API instead of silently drifting from it.\n */\ntype FontRoleOf<Path> = Path extends `font.${infer Role}.family` ? Role : never\ntype TextToneOf<Path> = Path extends `color.text.${infer Tone}` ? Tone : never\ntype FeedbackToneOf<Path> = Path extends `color.feedback.${infer Tone}.bg` ? Tone : never\ntype LevelOf<Path> = Path extends `spacing.inset.${infer Level}` ? Level : never\ntype RadiusOf<Path> = Path extends `radius.${infer Level}` ? Level : never\ntype ShadowOf<Path> = Path extends `shadow.${infer Level}` ? Level : never\n\n/** Typography roles, e.g. `heading.h2`, `body.md`, `code.md`. */\nexport type TextVariant = FontRoleOf<SemanticTokenPath>\n/** Text color roles, e.g. `primary`, `secondary`, `link`, `danger`. */\nexport type TextTone = TextToneOf<SemanticTokenPath>\n/** Status roles shared by Badge / Callout. */\nexport type FeedbackTone = FeedbackToneOf<SemanticTokenPath>\n/** Spacing steps — sm / md / lg. */\nexport type Level = LevelOf<SemanticTokenPath>\nexport type RadiusLevel = RadiusOf<SemanticTokenPath>\nexport type ShadowLevel = ShadowOf<SemanticTokenPath>\n\n/** Reference a semantic token as `var(--mason-*)`. */\nexport function cssVar(path: SemanticTokenPath): string {\n return `var(${getSemanticCssVar(path)})`\n}\n\nexport function spacingVar(axis: 'inset' | 'stack' | 'inline', level: Level): string {\n return cssVar(`spacing.${axis}.${level}`)\n}\n\nexport function radiusVar(level: RadiusLevel): string {\n return cssVar(`radius.${level}`)\n}\n\nexport function shadowVar(level: ShadowLevel): string {\n return cssVar(`shadow.${level}`)\n}\n\nexport function textColorVar(tone: TextTone): string {\n return cssVar(`color.text.${tone}`)\n}\n\nexport function typographyStyle(variant: TextVariant): {\n fontFamily: string\n fontSize: string\n fontWeight: string\n lineHeight: string\n letterSpacing: string\n} {\n return {\n fontFamily: cssVar(`font.${variant}.family`),\n fontSize: cssVar(`font.${variant}.size`),\n fontWeight: cssVar(`font.${variant}.weight`),\n lineHeight: cssVar(`font.${variant}.lineHeight`),\n letterSpacing: cssVar(`font.${variant}.letterSpacing`),\n }\n}\n\nexport function mergeClassName(...parts: (string | undefined)[]): string | undefined {\n const merged = parts.filter(Boolean).join(' ')\n return merged.length > 0 ? merged : undefined\n}\n","import type { CSSProperties } from 'react'\nimport { textColorVar, typographyStyle, type TextTone, type TextVariant } from './styles.js'\n\nexport type TextAlign = 'start' | 'center' | 'end'\n\nexport function textStyle({\n variant = 'body.md',\n tone = 'primary',\n align,\n truncate = false,\n}: {\n variant?: TextVariant\n tone?: TextTone\n align?: TextAlign\n truncate?: boolean\n}): CSSProperties {\n return {\n margin: 0,\n color: textColorVar(tone),\n ...typographyStyle(variant),\n ...(align ? { textAlign: align } : null),\n ...(truncate\n ? { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }\n : null),\n }\n}\n","import type { ElementType, HTMLAttributes } from 'react'\nimport { mergeClassName, type TextTone, type TextVariant } from './styles.js'\nimport { textStyle, type TextAlign } from './textStyles.js'\n\nexport type { TextAlign } from './textStyles.js'\n\nexport type TextElement =\n | 'p'\n | 'span'\n | 'div'\n | 'label'\n | 'strong'\n | 'code'\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n\nexport interface TextProps extends HTMLAttributes<HTMLElement> {\n as?: TextElement\n variant?: TextVariant\n tone?: TextTone\n align?: TextAlign\n truncate?: boolean\n}\n\n/**\n * Typography primitive. `variant` covers every font role in the token set,\n * `tone` every `color.text.*` role.\n *\n * Pick `as` for semantics (a heading role does not imply an `<h2>`).\n */\nexport function Text({\n as = 'p',\n variant = 'body.md',\n tone = 'primary',\n align,\n truncate = false,\n className,\n style,\n children,\n ...rest\n}: TextProps) {\n const Component: ElementType = as\n\n return (\n <Component\n data-mason-component=\"text\"\n data-variant={variant}\n className={mergeClassName(className)}\n style={{ ...textStyle({ variant, tone, align, truncate }), ...style }}\n {...rest}\n >\n {children}\n </Component>\n )\n}\n","import type { CSSProperties } from 'react'\nimport { spacingVar, type Level } from './styles.js'\n\nexport type StackDirection = 'row' | 'column'\nexport type StackAlign = 'start' | 'center' | 'end' | 'stretch' | 'baseline'\nexport type StackJustify = 'start' | 'center' | 'end' | 'between'\n\nconst FLEX_ALIGN = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n stretch: 'stretch',\n baseline: 'baseline',\n} as const satisfies Record<StackAlign, string>\n\nconst FLEX_JUSTIFY = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n between: 'space-between',\n} as const satisfies Record<StackJustify, string>\n\n/** Row gaps come from `spacing.inline`, column gaps from `spacing.stack`. */\nexport function stackStyle({\n direction = 'column',\n gap = 'md',\n align,\n justify,\n wrap = false,\n inline = false,\n}: {\n direction?: StackDirection\n gap?: Level\n align?: StackAlign\n justify?: StackJustify\n wrap?: boolean\n inline?: boolean\n}): CSSProperties {\n return {\n display: inline ? 'inline-flex' : 'flex',\n flexDirection: direction,\n gap: spacingVar(direction === 'row' ? 'inline' : 'stack', gap),\n flexWrap: wrap ? 'wrap' : 'nowrap',\n minWidth: 0,\n ...(align ? { alignItems: FLEX_ALIGN[align] } : null),\n ...(justify ? { justifyContent: FLEX_JUSTIFY[justify] } : null),\n }\n}\n","import type { HTMLAttributes } from 'react'\nimport { mergeClassName, type Level } from './styles.js'\nimport {\n stackStyle,\n type StackAlign,\n type StackDirection,\n type StackJustify,\n} from './stackStyles.js'\n\nexport type {\n StackAlign,\n StackDirection,\n StackJustify,\n} from './stackStyles.js'\n\nexport interface StackProps extends HTMLAttributes<HTMLDivElement> {\n direction?: StackDirection\n gap?: Level\n align?: StackAlign\n justify?: StackJustify\n wrap?: boolean\n inline?: boolean\n}\n\n/** Layout primitive — flex row/column with token gaps. */\nexport function Stack({\n direction = 'column',\n gap = 'md',\n align,\n justify,\n wrap = false,\n inline = false,\n className,\n style,\n children,\n ...rest\n}: StackProps) {\n return (\n <div\n data-mason-component=\"stack\"\n data-direction={direction}\n className={mergeClassName(className)}\n style={{\n ...stackStyle({ direction, gap, align, justify, wrap, inline }),\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import type { CSSProperties } from 'react'\nimport {\n cssVar,\n radiusVar,\n shadowVar,\n spacingVar,\n type Level,\n type RadiusLevel,\n type ShadowLevel,\n} from './styles.js'\n\nexport type CardTone = 'surface' | 'canvas' | 'elevated'\n\nconst TONE_BG = {\n surface: 'color.bg.surface',\n canvas: 'color.bg.canvas',\n elevated: 'color.bg.elevated',\n} as const\n\nexport function cardStyle({\n padding = 'md',\n elevation = 'sm',\n radius = 'md',\n tone = 'surface',\n bordered = true,\n}: {\n padding?: Level\n elevation?: ShadowLevel\n radius?: RadiusLevel\n tone?: CardTone\n bordered?: boolean\n}): CSSProperties {\n return {\n display: 'block',\n padding: spacingVar('inset', padding),\n backgroundColor: cssVar(TONE_BG[tone]),\n color: cssVar('color.text.primary'),\n border: bordered ? `1px solid ${cssVar('color.border.subtle')}` : 'none',\n borderRadius: radiusVar(radius),\n boxShadow: shadowVar(elevation),\n boxSizing: 'border-box',\n minWidth: 0,\n }\n}\n","import type { HTMLAttributes } from 'react'\nimport {\n mergeClassName,\n type Level,\n type RadiusLevel,\n type ShadowLevel,\n} from './styles.js'\nimport { cardStyle, type CardTone } from './cardStyles.js'\n\nexport type { CardTone } from './cardStyles.js'\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n padding?: Level\n elevation?: ShadowLevel\n radius?: RadiusLevel\n tone?: CardTone\n bordered?: boolean\n}\n\n/** Surface primitive — background, border, radius and shadow from tokens. */\nexport function Card({\n padding = 'md',\n elevation = 'sm',\n radius = 'md',\n tone = 'surface',\n bordered = true,\n className,\n style,\n children,\n ...rest\n}: CardProps) {\n return (\n <div\n data-mason-component=\"card\"\n data-tone={tone}\n className={mergeClassName(className)}\n style={{\n ...cardStyle({ padding, elevation, radius, tone, bordered }),\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import type { CSSProperties } from 'react'\nimport { cssVar } from './styles.js'\n\nexport type DividerOrientation = 'horizontal' | 'vertical'\n\nexport function dividerStyle(orientation: DividerOrientation = 'horizontal'): CSSProperties {\n const line = `1px solid ${cssVar('color.border.subtle')}`\n\n if (orientation === 'vertical') {\n return {\n alignSelf: 'stretch',\n width: 0,\n minHeight: '1em',\n margin: 0,\n border: 'none',\n borderInlineStart: line,\n }\n }\n\n return {\n width: '100%',\n height: 0,\n margin: 0,\n border: 'none',\n borderBlockStart: line,\n }\n}\n","import type { HTMLAttributes } from 'react'\nimport { mergeClassName } from './styles.js'\nimport { dividerStyle, type DividerOrientation } from './dividerStyles.js'\n\nexport type { DividerOrientation } from './dividerStyles.js'\n\nexport interface DividerProps extends HTMLAttributes<HTMLHRElement> {\n orientation?: DividerOrientation\n}\n\n/** Separator line. `<hr>` already carries the separator role. */\nexport function Divider({\n orientation = 'horizontal',\n className,\n style,\n ...rest\n}: DividerProps) {\n return (\n <hr\n data-mason-component=\"divider\"\n data-orientation={orientation}\n aria-orientation={orientation === 'vertical' ? 'vertical' : undefined}\n className={mergeClassName(className)}\n style={{ ...dividerStyle(orientation), ...style }}\n {...rest}\n />\n )\n}\n","import type { CSSProperties } from 'react'\nimport { radiusVar, textColorVar } from './styles.js'\n\nexport type LinkTone = 'link' | 'inherit'\nexport type LinkUnderline = 'hover' | 'always' | 'none'\n\n/** Link inherits typography from its container so it can sit inside Text. */\nexport function linkStyle({\n tone = 'link',\n underline = 'hover',\n}: {\n tone?: LinkTone\n underline?: LinkUnderline\n}): CSSProperties {\n return {\n color: tone === 'inherit' ? 'inherit' : textColorVar('link'),\n textDecoration: underline === 'always' ? 'underline' : 'none',\n textUnderlineOffset: '0.15em',\n borderRadius: radiusVar('sm'),\n cursor: 'pointer',\n }\n}\n","import type { AnchorHTMLAttributes } from 'react'\nimport { mergeClassName } from './styles.js'\nimport { linkStyle, type LinkTone, type LinkUnderline } from './linkStyles.js'\n\nexport type { LinkTone, LinkUnderline } from './linkStyles.js'\n\nexport interface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n tone?: LinkTone\n underline?: LinkUnderline\n /** Adds `target=\"_blank\"` and a safe `rel`. */\n external?: boolean\n}\n\n/**\n * Navigational anchor. Typography is inherited, so it composes inside Text.\n *\n * For client-side routing, pass the router's component via `asChild`-style\n * composition on the consumer side (`<Link href>` stays a plain `<a>`).\n */\nexport function Link({\n tone = 'link',\n underline = 'hover',\n external = false,\n className,\n style,\n children,\n ...rest\n}: LinkProps) {\n const externalProps = external\n ? { target: '_blank', rel: 'noreferrer noopener' }\n : null\n\n return (\n <a\n data-mason-component=\"link\"\n data-tone={tone}\n data-underline={underline}\n className={mergeClassName(className)}\n style={{ ...linkStyle({ tone, underline }), ...style }}\n {...externalProps}\n {...rest}\n >\n {children}\n </a>\n )\n}\n","import type { CSSProperties } from 'react'\nimport { cssVar } from './styles.js'\n\n/** `inherit` follows the surrounding font size — used inside Button. */\nexport type SpinnerSize = 'sm' | 'md' | 'lg' | 'inherit'\n\nconst SIZE_DIMENSION = {\n sm: cssVar('font.body.sm.size'),\n md: cssVar('font.body.md.size'),\n lg: cssVar('font.display.lg.size'),\n inherit: '1em',\n} as const satisfies Record<SpinnerSize, string>\n\nexport function spinnerStyle(size: SpinnerSize = 'md'): CSSProperties {\n const dimension = SIZE_DIMENSION[size]\n\n return {\n width: dimension,\n height: dimension,\n border: '2px solid currentColor',\n borderTopColor: 'transparent',\n borderRadius: '50%',\n display: 'inline-block',\n flexShrink: 0,\n }\n}\n","import type { HTMLAttributes } from 'react'\nimport { mergeClassName } from './styles.js'\nimport { spinnerStyle, type SpinnerSize } from './spinnerStyles.js'\n\nexport type { SpinnerSize } from './spinnerStyles.js'\n\nexport interface SpinnerProps extends HTMLAttributes<HTMLSpanElement> {\n size?: SpinnerSize\n /** Announced while loading. Without it the spinner is `aria-hidden`. */\n label?: string\n}\n\n/** Indeterminate loading indicator. The rotation lives in `tokens.css`. */\nexport function Spinner({\n size = 'md',\n label,\n className,\n style,\n ...rest\n}: SpinnerProps) {\n return (\n <span\n data-mason-component=\"spinner\"\n data-size={size}\n role={label ? 'status' : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n className={mergeClassName(className)}\n style={{ ...spinnerStyle(size), ...style }}\n {...rest}\n />\n )\n}\n","import type { CSSProperties } from 'react'\nimport { cssVar, typographyStyle, type TextVariant } from './styles.js'\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger'\nexport type ButtonSize = 'sm' | 'md' | 'lg'\n\ntype ActionColorPath =\n | `color.action.${ButtonVariant | 'disabled'}.${'bg' | 'text' | 'border'}`\n\nfunction actionColors(variant: ButtonVariant | 'disabled'): {\n bg: ActionColorPath\n text: ActionColorPath\n border: ActionColorPath\n} {\n return {\n bg: `color.action.${variant}.bg`,\n text: `color.action.${variant}.text`,\n border: `color.action.${variant}.border`,\n }\n}\n\n/**\n * Size ladder — padding / radius / type. Height comes from content, not min-height.\n */\nconst sizeStyles = {\n sm: {\n paddingBlock: cssVar('spacing.inset.sm'),\n paddingInline: cssVar('spacing.inset.md'),\n gap: cssVar('spacing.inline.sm'),\n radius: cssVar('radius.sm'),\n font: 'label.sm' as TextVariant,\n },\n md: {\n paddingBlock: cssVar('spacing.inset.md'),\n paddingInline: cssVar('spacing.inset.lg'),\n gap: cssVar('spacing.inline.md'),\n radius: cssVar('radius.md'),\n font: 'label.md' as TextVariant,\n },\n lg: {\n paddingBlock: cssVar('spacing.inset.lg'),\n paddingInline: `calc(${cssVar('spacing.inset.lg')} + ${cssVar('spacing.inset.md')})`,\n gap: cssVar('spacing.inline.md'),\n radius: cssVar('radius.lg'),\n font: 'label.lg' as TextVariant,\n },\n} as const satisfies Record<\n ButtonSize,\n {\n paddingBlock: string\n paddingInline: string\n gap: string\n radius: string\n font: TextVariant\n }\n>\n\nexport function buttonStyle({\n variant = 'primary',\n size = 'md',\n disabled = false,\n loading = false,\n}: {\n variant?: ButtonVariant\n size?: ButtonSize\n disabled?: boolean\n loading?: boolean\n}): CSSProperties {\n const inactive = disabled || loading\n const colors = actionColors(inactive ? 'disabled' : variant)\n const sizing = sizeStyles[size]\n\n return {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: sizing.gap,\n paddingBlock: sizing.paddingBlock,\n paddingInline: sizing.paddingInline,\n margin: 0,\n backgroundColor: cssVar(colors.bg),\n color: cssVar(colors.text),\n border: `1px solid ${cssVar(colors.border)}`,\n borderRadius: sizing.radius,\n boxSizing: 'border-box',\n ...typographyStyle(sizing.font),\n textDecoration: 'none',\n whiteSpace: 'nowrap',\n }\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react'\nimport { mergeClassName } from './styles.js'\nimport { Spinner } from './Spinner.js'\nimport { buttonStyle, type ButtonSize, type ButtonVariant } from './buttonStyles.js'\n\nexport type { ButtonSize, ButtonVariant } from './buttonStyles.js'\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant\n size?: ButtonSize\n loading?: boolean\n leadingSlot?: ReactNode\n trailingSlot?: ReactNode\n}\n\n/**\n * Primary action component. Native `<button>` with token-backed styles.\n *\n * Icon-only usage requires an `aria-label`.\n */\nexport function Button({\n variant = 'primary',\n size = 'md',\n disabled = false,\n loading = false,\n leadingSlot,\n trailingSlot,\n className,\n style,\n children,\n type = 'button',\n ...rest\n}: ButtonProps) {\n const isDisabled = disabled || loading\n\n return (\n <button\n type={type}\n data-mason-component=\"button\"\n data-variant={variant}\n data-size={size}\n disabled={isDisabled}\n aria-busy={loading || undefined}\n className={mergeClassName(className)}\n style={{\n ...buttonStyle({ variant, size, disabled, loading }),\n ...style,\n }}\n {...rest}\n >\n {loading ? (\n <Spinner size=\"inherit\" data-mason-slot=\"spinner\" />\n ) : leadingSlot ? (\n <span data-mason-slot=\"leading\">{leadingSlot}</span>\n ) : null}\n {children ? <span data-mason-slot=\"label\">{children}</span> : null}\n {trailingSlot && !loading ? (\n <span data-mason-slot=\"trailing\">{trailingSlot}</span>\n ) : null}\n </button>\n )\n}\n","import type { CSSProperties } from 'react'\nimport {\n cssVar,\n radiusVar,\n spacingVar,\n typographyStyle,\n type FeedbackTone,\n} from './styles.js'\n\nexport type BadgeTone = FeedbackTone | 'neutral'\nexport type BadgeSize = 'sm' | 'md'\n\nexport function badgeStyle({\n tone = 'neutral',\n size = 'sm',\n}: {\n tone?: BadgeTone\n size?: BadgeSize\n}): CSSProperties {\n const colors =\n tone === 'neutral'\n ? {\n bg: cssVar('color.bg.canvas'),\n text: cssVar('color.text.secondary'),\n border: cssVar('color.border.subtle'),\n }\n : {\n bg: cssVar(`color.feedback.${tone}.bg`),\n text: cssVar(`color.feedback.${tone}.text`),\n border: cssVar(`color.feedback.${tone}.border`),\n }\n\n return {\n display: 'inline-flex',\n alignItems: 'center',\n gap: spacingVar('inline', 'sm'),\n paddingBlock: '0.125em',\n paddingInline: spacingVar('inset', 'sm'),\n backgroundColor: colors.bg,\n color: colors.text,\n border: `1px solid ${colors.border}`,\n borderRadius: radiusVar('full'),\n ...typographyStyle(size === 'sm' ? 'label.sm' : 'label.md'),\n whiteSpace: 'nowrap',\n }\n}\n","import type { HTMLAttributes } from 'react'\nimport { mergeClassName } from './styles.js'\nimport { badgeStyle, type BadgeSize, type BadgeTone } from './badgeStyles.js'\n\nexport type { BadgeSize, BadgeTone } from './badgeStyles.js'\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n tone?: BadgeTone\n size?: BadgeSize\n}\n\n/**\n * Compact status chip. Colour carries no meaning on its own — keep the label\n * readable (`활성`, not just a green dot).\n */\nexport function Badge({\n tone = 'neutral',\n size = 'sm',\n className,\n style,\n children,\n ...rest\n}: BadgeProps) {\n return (\n <span\n data-mason-component=\"badge\"\n data-tone={tone}\n data-size={size}\n className={mergeClassName(className)}\n style={{ ...badgeStyle({ tone, size }), ...style }}\n {...rest}\n >\n {children}\n </span>\n )\n}\n","import type { CSSProperties } from 'react'\nimport {\n cssVar,\n radiusVar,\n spacingVar,\n typographyStyle,\n type FeedbackTone,\n} from './styles.js'\n\nexport function calloutStyle(tone: FeedbackTone = 'info'): CSSProperties {\n return {\n display: 'flex',\n gap: spacingVar('inline', 'md'),\n padding: spacingVar('inset', 'md'),\n backgroundColor: cssVar(`color.feedback.${tone}.bg`),\n color: cssVar(`color.feedback.${tone}.text`),\n border: `1px solid ${cssVar(`color.feedback.${tone}.border`)}`,\n borderRadius: radiusVar('md'),\n boxSizing: 'border-box',\n ...typographyStyle('body.md'),\n }\n}\n\nexport function calloutContentStyle(): CSSProperties {\n return {\n display: 'flex',\n flexDirection: 'column',\n gap: spacingVar('stack', 'sm'),\n minWidth: 0,\n }\n}\n\nexport function calloutTitleStyle(): CSSProperties {\n return { margin: 0, ...typographyStyle('label.md') }\n}\n\nexport function calloutBodyStyle(): CSSProperties {\n return { margin: 0, ...typographyStyle('body.sm') }\n}\n","import type { HTMLAttributes, ReactNode } from 'react'\nimport { mergeClassName, type FeedbackTone } from './styles.js'\nimport {\n calloutBodyStyle,\n calloutContentStyle,\n calloutStyle,\n calloutTitleStyle,\n} from './calloutStyles.js'\n\n/** `title` is the heading slot, so the native tooltip attribute is not available. */\nexport interface CalloutProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n tone?: FeedbackTone\n title?: ReactNode\n iconSlot?: ReactNode\n}\n\n/**\n * Inline message block for page-level feedback.\n *\n * It is static content by default — for something that appears in response to\n * an action, pass `role=\"status\"` (or `\"alert\"` when it must interrupt).\n */\nexport function Callout({\n tone = 'info',\n title,\n iconSlot,\n className,\n style,\n children,\n ...rest\n}: CalloutProps) {\n return (\n <div\n data-mason-component=\"callout\"\n data-tone={tone}\n className={mergeClassName(className)}\n style={{ ...calloutStyle(tone), ...style }}\n {...rest}\n >\n {iconSlot ? (\n <span data-mason-slot=\"icon\" aria-hidden=\"true\">\n {iconSlot}\n </span>\n ) : null}\n <div data-mason-slot=\"content\" style={calloutContentStyle()}>\n {title ? (\n <p data-mason-slot=\"title\" style={calloutTitleStyle()}>\n {title}\n </p>\n ) : null}\n {children ? (\n <div data-mason-slot=\"body\" style={calloutBodyStyle()}>\n {children}\n </div>\n ) : null}\n </div>\n </div>\n )\n}\n","import { useId, type CSSProperties, type ReactNode } from 'react'\nimport { mergeClassName } from './styles.js'\nimport {\n fieldDescriptionStyle,\n fieldErrorStyle,\n fieldLabelStyle,\n fieldRootStyle,\n type FieldSize,\n} from './fieldStyles.js'\n\nexport interface FieldIds {\n controlId: string\n descriptionId: string\n errorId: string\n /** `aria-describedby` value, or undefined when there is nothing to describe. */\n describedBy: string | undefined\n}\n\n/** Stable ids wiring a control to its label, description and error. */\nexport function useFieldIds({\n id,\n description,\n error,\n}: {\n id?: string\n description?: ReactNode\n error?: ReactNode\n}): FieldIds {\n const generated = useId()\n const controlId = id ?? `mason-field-${generated}`\n const descriptionId = `${controlId}-description`\n const errorId = `${controlId}-error`\n const describedBy =\n [description ? descriptionId : null, error ? errorId : null]\n .filter(Boolean)\n .join(' ') || undefined\n\n return { controlId, descriptionId, errorId, describedBy }\n}\n\nexport interface FieldFrameProps {\n /** `data-mason-component` value of the wrapper, e.g. `text-field`. */\n component: string\n ids: FieldIds\n label?: ReactNode\n description?: ReactNode\n error?: ReactNode\n size?: FieldSize\n invalid?: boolean\n disabled?: boolean\n className?: string\n style?: CSSProperties\n children: ReactNode\n}\n\n/**\n * Shared label / description / error chrome for form controls.\n * Internal — consumers use TextField, Select or Checkbox.\n */\nexport function FieldFrame({\n component,\n ids,\n label,\n description,\n error,\n size = 'md',\n invalid = false,\n disabled = false,\n className,\n style,\n children,\n}: FieldFrameProps) {\n return (\n <div\n data-mason-component={component}\n data-size={size}\n data-invalid={invalid || undefined}\n data-disabled={disabled || undefined}\n className={mergeClassName(className)}\n style={{ ...fieldRootStyle(), ...style }}\n >\n {label ? (\n <label\n data-mason-slot=\"label\"\n htmlFor={ids.controlId}\n style={fieldLabelStyle(size)}\n >\n {label}\n </label>\n ) : null}\n {children}\n {description ? (\n <p\n data-mason-slot=\"description\"\n id={ids.descriptionId}\n style={fieldDescriptionStyle()}\n >\n {description}\n </p>\n ) : null}\n {error ? (\n <p\n data-mason-slot=\"error\"\n id={ids.errorId}\n role=\"alert\"\n style={fieldErrorStyle()}\n >\n {error}\n </p>\n ) : null}\n </div>\n )\n}\n","import type { CSSProperties } from 'react'\nimport {\n cssVar,\n radiusVar,\n spacingVar,\n typographyStyle,\n type Level,\n type TextVariant,\n} from './styles.js'\n\n/** Field sizes reuse the spacing ladder — sm / md / lg. */\nexport type FieldSize = Level\n\nconst CONTROL_FONT = {\n sm: 'body.sm',\n md: 'body.md',\n lg: 'body.lg',\n} as const satisfies Record<FieldSize, TextVariant>\n\nconst LABEL_FONT = {\n sm: 'label.sm',\n md: 'label.md',\n lg: 'label.lg',\n} as const satisfies Record<FieldSize, TextVariant>\n\nconst CONTROL_PADDING_BLOCK = { sm: 'sm', md: 'sm', lg: 'md' } as const satisfies Record<\n FieldSize,\n Level\n>\n\nconst CONTROL_PADDING_INLINE = { sm: 'sm', md: 'md', lg: 'md' } as const satisfies Record<\n FieldSize,\n Level\n>\n\nexport function fieldRootStyle(): CSSProperties {\n return {\n display: 'flex',\n flexDirection: 'column',\n gap: spacingVar('stack', 'sm'),\n minWidth: 0,\n }\n}\n\nexport function fieldLabelStyle(size: FieldSize = 'md'): CSSProperties {\n return {\n color: cssVar('color.text.primary'),\n ...typographyStyle(LABEL_FONT[size]),\n }\n}\n\nexport function fieldControlStyle({\n size = 'md',\n invalid = false,\n disabled = false,\n}: {\n size?: FieldSize\n invalid?: boolean\n disabled?: boolean\n}): CSSProperties {\n return {\n width: '100%',\n boxSizing: 'border-box',\n margin: 0,\n paddingBlock: spacingVar('inset', CONTROL_PADDING_BLOCK[size]),\n paddingInline: spacingVar('inset', CONTROL_PADDING_INLINE[size]),\n backgroundColor: disabled\n ? cssVar('color.action.disabled.bg')\n : cssVar('color.field.bg'),\n color: disabled ? cssVar('color.text.disabled') : cssVar('color.field.text'),\n border: `1px solid ${cssVar(\n invalid ? 'color.field.borderInvalid' : 'color.field.border',\n )}`,\n borderRadius: radiusVar('md'),\n ...typographyStyle(CONTROL_FONT[size]),\n }\n}\n\nexport function fieldDescriptionStyle(): CSSProperties {\n return {\n margin: 0,\n color: cssVar('color.text.secondary'),\n ...typographyStyle('body.sm'),\n }\n}\n\nexport function fieldErrorStyle(): CSSProperties {\n return {\n margin: 0,\n color: cssVar('color.text.danger'),\n ...typographyStyle('body.sm'),\n }\n}\n","import type { InputHTMLAttributes, ReactNode } from 'react'\nimport { FieldFrame, useFieldIds } from './field.js'\nimport { fieldControlStyle, type FieldSize } from './fieldStyles.js'\n\nexport type { FieldSize } from './fieldStyles.js'\n\nexport interface TextFieldProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {\n label?: ReactNode\n description?: ReactNode\n /** Present error text switches the field to its invalid styling. */\n error?: ReactNode\n size?: FieldSize\n invalid?: boolean\n}\n\n/**\n * Labelled text input. `className` / `style` apply to the wrapper; every other\n * prop goes to the native `<input>`.\n */\nexport function TextField({\n label,\n description,\n error,\n size = 'md',\n invalid,\n id,\n disabled = false,\n className,\n style,\n ...rest\n}: TextFieldProps) {\n const ids = useFieldIds({ id, description, error })\n const isInvalid = invalid ?? Boolean(error)\n\n return (\n <FieldFrame\n component=\"text-field\"\n ids={ids}\n label={label}\n description={description}\n error={error}\n size={size}\n invalid={isInvalid}\n disabled={disabled}\n className={className}\n style={style}\n >\n <input\n {...rest}\n id={ids.controlId}\n data-mason-slot=\"control\"\n disabled={disabled}\n aria-invalid={isInvalid || undefined}\n aria-describedby={ids.describedBy}\n style={fieldControlStyle({ size, invalid: isInvalid, disabled })}\n />\n </FieldFrame>\n )\n}\n","import type { ReactNode, SelectHTMLAttributes } from 'react'\nimport { FieldFrame, useFieldIds } from './field.js'\nimport { fieldControlStyle, type FieldSize } from './fieldStyles.js'\n\nexport interface SelectProps\n extends Omit<SelectHTMLAttributes<HTMLSelectElement>, 'size'> {\n label?: ReactNode\n description?: ReactNode\n error?: ReactNode\n size?: FieldSize\n invalid?: boolean\n /** Rendered as a leading empty `<option>`. */\n placeholder?: string\n}\n\n/**\n * Labelled native `<select>`. Children are the `<option>` elements, so the\n * browser's own popup and keyboard behaviour is preserved.\n */\nexport function Select({\n label,\n description,\n error,\n size = 'md',\n invalid,\n placeholder,\n id,\n disabled = false,\n className,\n style,\n children,\n ...rest\n}: SelectProps) {\n const ids = useFieldIds({ id, description, error })\n const isInvalid = invalid ?? Boolean(error)\n\n return (\n <FieldFrame\n component=\"select\"\n ids={ids}\n label={label}\n description={description}\n error={error}\n size={size}\n invalid={isInvalid}\n disabled={disabled}\n className={className}\n style={style}\n >\n <select\n {...rest}\n id={ids.controlId}\n data-mason-slot=\"control\"\n disabled={disabled}\n aria-invalid={isInvalid || undefined}\n aria-describedby={ids.describedBy}\n style={fieldControlStyle({ size, invalid: isInvalid, disabled })}\n >\n {placeholder ? <option value=\"\">{placeholder}</option> : null}\n {children}\n </select>\n </FieldFrame>\n )\n}\n","import type { CSSProperties } from 'react'\nimport { cssVar, spacingVar, typographyStyle } from './styles.js'\n\nexport function checkboxRootStyle(): CSSProperties {\n return {\n display: 'flex',\n flexDirection: 'column',\n gap: spacingVar('stack', 'sm'),\n minWidth: 0,\n }\n}\n\nexport function checkboxLabelStyle(disabled = false): CSSProperties {\n return {\n display: 'inline-flex',\n alignItems: 'flex-start',\n gap: spacingVar('inline', 'sm'),\n cursor: disabled ? 'not-allowed' : 'pointer',\n color: disabled ? cssVar('color.text.disabled') : cssVar('color.text.primary'),\n ...typographyStyle('body.md'),\n }\n}\n\nexport function checkboxControlStyle(): CSSProperties {\n return {\n width: '1em',\n height: '1em',\n margin: 0,\n marginBlockStart: '0.15em',\n accentColor: cssVar('color.action.primary.bg'),\n flexShrink: 0,\n }\n}\n","import type { InputHTMLAttributes, ReactNode } from 'react'\nimport { useFieldIds } from './field.js'\nimport { mergeClassName } from './styles.js'\nimport { fieldDescriptionStyle, fieldErrorStyle } from './fieldStyles.js'\nimport {\n checkboxControlStyle,\n checkboxLabelStyle,\n checkboxRootStyle,\n} from './checkboxStyles.js'\n\nexport interface CheckboxProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'> {\n label?: ReactNode\n description?: ReactNode\n error?: ReactNode\n invalid?: boolean\n}\n\n/**\n * Native checkbox with a token-backed label row.\n * The check mark uses `accent-color`, so platform behaviour is untouched.\n */\nexport function Checkbox({\n label,\n description,\n error,\n invalid,\n id,\n disabled = false,\n className,\n style,\n ...rest\n}: CheckboxProps) {\n const ids = useFieldIds({ id, description, error })\n const isInvalid = invalid ?? Boolean(error)\n\n return (\n <div\n data-mason-component=\"checkbox\"\n data-invalid={isInvalid || undefined}\n data-disabled={disabled || undefined}\n className={mergeClassName(className)}\n style={{ ...checkboxRootStyle(), ...style }}\n >\n <label\n data-mason-slot=\"label\"\n htmlFor={ids.controlId}\n style={checkboxLabelStyle(disabled)}\n >\n <input\n {...rest}\n type=\"checkbox\"\n id={ids.controlId}\n data-mason-slot=\"control\"\n disabled={disabled}\n aria-invalid={isInvalid || undefined}\n aria-describedby={ids.describedBy}\n style={checkboxControlStyle()}\n />\n {label ? <span data-mason-slot=\"label-text\">{label}</span> : null}\n </label>\n {description ? (\n <p\n data-mason-slot=\"description\"\n id={ids.descriptionId}\n style={fieldDescriptionStyle()}\n >\n {description}\n </p>\n ) : null}\n {error ? (\n <p\n data-mason-slot=\"error\"\n id={ids.errorId}\n role=\"alert\"\n style={fieldErrorStyle()}\n >\n {error}\n </p>\n ) : null}\n </div>\n )\n}\n"],"mappings":"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","names":["jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsxs","jsx","jsxs","jsx","jsx","jsxs","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":["../src/provider.tsx","../src/styles.ts","../src/textStyles.ts","../src/Text.tsx","../src/stackStyles.ts","../src/Stack.tsx","../src/cardStyles.ts","../src/Card.tsx","../src/dividerStyles.ts","../src/Divider.tsx","../src/linkStyles.ts","../src/Link.tsx","../src/spinnerStyles.ts","../src/Spinner.tsx","../src/buttonStyles.ts","../src/Button.tsx","../src/badgeStyles.ts","../src/Badge.tsx","../src/calloutStyles.ts","../src/Callout.tsx","../src/field.tsx","../src/fieldStyles.ts","../src/TextField.tsx","../src/Select.tsx","../src/checkboxStyles.ts","../src/Checkbox.tsx","../src/radioStyles.ts","../src/Radio.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\n\nexport type MasonTheme = 'light' | 'dark' | 'system'\n\nexport interface MasonProviderProps {\n children: ReactNode\n theme?: MasonTheme\n}\n\n/** Root provider for mason-ds React apps. */\nexport function MasonProvider({ children, theme = 'light' }: MasonProviderProps) {\n return <div data-mason-provider data-mason-theme={theme}>{children}</div>\n}\n","import { getSemanticCssVar, type SemanticTokenPath } from '@mason-ds/tokens'\n\n/**\n * Prop unions are derived from the semantic token paths, so adding or removing\n * a token role changes the component API instead of silently drifting from it.\n */\ntype FontRoleOf<Path> = Path extends `font.${infer Role}.family` ? Role : never\ntype TextToneOf<Path> = Path extends `color.text.${infer Tone}` ? Tone : never\ntype FeedbackToneOf<Path> = Path extends `color.feedback.${infer Tone}.bg` ? Tone : never\ntype LevelOf<Path> = Path extends `spacing.inset.${infer Level}` ? Level : never\ntype RadiusOf<Path> = Path extends `radius.${infer Level}` ? Level : never\ntype ShadowOf<Path> = Path extends `shadow.${infer Level}` ? Level : never\n\n/** Typography roles, e.g. `heading.h2`, `body.md`, `code.md`. */\nexport type TextVariant = FontRoleOf<SemanticTokenPath>\n/** Text color roles, e.g. `primary`, `secondary`, `link`, `danger`. */\nexport type TextTone = TextToneOf<SemanticTokenPath>\n/** Status roles shared by Badge / Callout. */\nexport type FeedbackTone = FeedbackToneOf<SemanticTokenPath>\n/** Spacing steps — sm / md / lg. */\nexport type Level = LevelOf<SemanticTokenPath>\nexport type RadiusLevel = RadiusOf<SemanticTokenPath>\nexport type ShadowLevel = ShadowOf<SemanticTokenPath>\n\n/** Reference a semantic token as `var(--mason-*)`. */\nexport function cssVar(path: SemanticTokenPath): string {\n return `var(${getSemanticCssVar(path)})`\n}\n\nexport function spacingVar(axis: 'inset' | 'stack' | 'inline', level: Level): string {\n return cssVar(`spacing.${axis}.${level}`)\n}\n\nexport function radiusVar(level: RadiusLevel): string {\n return cssVar(`radius.${level}`)\n}\n\nexport function shadowVar(level: ShadowLevel): string {\n return cssVar(`shadow.${level}`)\n}\n\nexport function textColorVar(tone: TextTone): string {\n return cssVar(`color.text.${tone}`)\n}\n\nexport function typographyStyle(variant: TextVariant): {\n fontFamily: string\n fontSize: string\n fontWeight: string\n lineHeight: string\n letterSpacing: string\n} {\n return {\n fontFamily: cssVar(`font.${variant}.family`),\n fontSize: cssVar(`font.${variant}.size`),\n fontWeight: cssVar(`font.${variant}.weight`),\n lineHeight: cssVar(`font.${variant}.lineHeight`),\n letterSpacing: cssVar(`font.${variant}.letterSpacing`),\n }\n}\n\nexport function mergeClassName(...parts: (string | undefined)[]): string | undefined {\n const merged = parts.filter(Boolean).join(' ')\n return merged.length > 0 ? merged : undefined\n}\n","import type { CSSProperties } from 'react'\nimport { textColorVar, typographyStyle, type TextTone, type TextVariant } from './styles.js'\n\nexport type TextAlign = 'start' | 'center' | 'end'\n\nexport function textStyle({\n variant = 'body.md',\n tone = 'primary',\n align,\n truncate = false,\n}: {\n variant?: TextVariant\n tone?: TextTone\n align?: TextAlign\n truncate?: boolean\n}): CSSProperties {\n return {\n margin: 0,\n color: textColorVar(tone),\n ...typographyStyle(variant),\n ...(align ? { textAlign: align } : null),\n ...(truncate\n ? { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }\n : null),\n }\n}\n","import type { ElementType, HTMLAttributes } from 'react'\nimport { mergeClassName, type TextTone, type TextVariant } from './styles.js'\nimport { textStyle, type TextAlign } from './textStyles.js'\n\nexport type { TextAlign } from './textStyles.js'\n\nexport type TextElement =\n | 'p'\n | 'span'\n | 'div'\n | 'label'\n | 'strong'\n | 'code'\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n\nexport interface TextProps extends HTMLAttributes<HTMLElement> {\n as?: TextElement\n variant?: TextVariant\n tone?: TextTone\n align?: TextAlign\n truncate?: boolean\n}\n\n/**\n * Typography primitive. `variant` covers every font role in the token set,\n * `tone` every `color.text.*` role.\n *\n * Pick `as` for semantics (a heading role does not imply an `<h2>`).\n */\nexport function Text({\n as = 'p',\n variant = 'body.md',\n tone = 'primary',\n align,\n truncate = false,\n className,\n style,\n children,\n ...rest\n}: TextProps) {\n const Component: ElementType = as\n\n return (\n <Component\n data-mason-component=\"text\"\n data-variant={variant}\n className={mergeClassName(className)}\n style={{ ...textStyle({ variant, tone, align, truncate }), ...style }}\n {...rest}\n >\n {children}\n </Component>\n )\n}\n","import type { CSSProperties } from 'react'\nimport { spacingVar, type Level } from './styles.js'\n\nexport type StackDirection = 'row' | 'column'\nexport type StackAlign = 'start' | 'center' | 'end' | 'stretch' | 'baseline'\nexport type StackJustify = 'start' | 'center' | 'end' | 'between'\n\nconst FLEX_ALIGN = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n stretch: 'stretch',\n baseline: 'baseline',\n} as const satisfies Record<StackAlign, string>\n\nconst FLEX_JUSTIFY = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n between: 'space-between',\n} as const satisfies Record<StackJustify, string>\n\n/** Row gaps come from `spacing.inline`, column gaps from `spacing.stack`. */\nexport function stackStyle({\n direction = 'column',\n gap = 'md',\n align,\n justify,\n wrap = false,\n inline = false,\n}: {\n direction?: StackDirection\n gap?: Level\n align?: StackAlign\n justify?: StackJustify\n wrap?: boolean\n inline?: boolean\n}): CSSProperties {\n return {\n display: inline ? 'inline-flex' : 'flex',\n flexDirection: direction,\n gap: spacingVar(direction === 'row' ? 'inline' : 'stack', gap),\n flexWrap: wrap ? 'wrap' : 'nowrap',\n minWidth: 0,\n ...(align ? { alignItems: FLEX_ALIGN[align] } : null),\n ...(justify ? { justifyContent: FLEX_JUSTIFY[justify] } : null),\n }\n}\n","import type { HTMLAttributes } from 'react'\nimport { mergeClassName, type Level } from './styles.js'\nimport {\n stackStyle,\n type StackAlign,\n type StackDirection,\n type StackJustify,\n} from './stackStyles.js'\n\nexport type {\n StackAlign,\n StackDirection,\n StackJustify,\n} from './stackStyles.js'\n\nexport interface StackProps extends HTMLAttributes<HTMLDivElement> {\n direction?: StackDirection\n gap?: Level\n align?: StackAlign\n justify?: StackJustify\n wrap?: boolean\n inline?: boolean\n}\n\n/** Layout primitive — flex row/column with token gaps. */\nexport function Stack({\n direction = 'column',\n gap = 'md',\n align,\n justify,\n wrap = false,\n inline = false,\n className,\n style,\n children,\n ...rest\n}: StackProps) {\n return (\n <div\n data-mason-component=\"stack\"\n data-direction={direction}\n className={mergeClassName(className)}\n style={{\n ...stackStyle({ direction, gap, align, justify, wrap, inline }),\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import type { CSSProperties } from 'react'\nimport {\n cssVar,\n radiusVar,\n shadowVar,\n spacingVar,\n type Level,\n type RadiusLevel,\n type ShadowLevel,\n} from './styles.js'\n\nexport type CardTone = 'surface' | 'canvas' | 'elevated'\n\nconst TONE_BG = {\n surface: 'color.bg.surface',\n canvas: 'color.bg.canvas',\n elevated: 'color.bg.elevated',\n} as const\n\nexport function cardStyle({\n padding = 'md',\n elevation = 'sm',\n radius = 'md',\n tone = 'surface',\n bordered = true,\n}: {\n padding?: Level\n elevation?: ShadowLevel\n radius?: RadiusLevel\n tone?: CardTone\n bordered?: boolean\n}): CSSProperties {\n return {\n display: 'block',\n padding: spacingVar('inset', padding),\n backgroundColor: cssVar(TONE_BG[tone]),\n color: cssVar('color.text.primary'),\n border: bordered ? `1px solid ${cssVar('color.border.subtle')}` : 'none',\n borderRadius: radiusVar(radius),\n boxShadow: shadowVar(elevation),\n boxSizing: 'border-box',\n minWidth: 0,\n }\n}\n","import type { HTMLAttributes } from 'react'\nimport {\n mergeClassName,\n type Level,\n type RadiusLevel,\n type ShadowLevel,\n} from './styles.js'\nimport { cardStyle, type CardTone } from './cardStyles.js'\n\nexport type { CardTone } from './cardStyles.js'\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n padding?: Level\n elevation?: ShadowLevel\n radius?: RadiusLevel\n tone?: CardTone\n bordered?: boolean\n}\n\n/** Surface primitive — background, border, radius and shadow from tokens. */\nexport function Card({\n padding = 'md',\n elevation = 'sm',\n radius = 'md',\n tone = 'surface',\n bordered = true,\n className,\n style,\n children,\n ...rest\n}: CardProps) {\n return (\n <div\n data-mason-component=\"card\"\n data-tone={tone}\n className={mergeClassName(className)}\n style={{\n ...cardStyle({ padding, elevation, radius, tone, bordered }),\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import type { CSSProperties } from 'react'\nimport { cssVar } from './styles.js'\n\nexport type DividerOrientation = 'horizontal' | 'vertical'\n\nexport function dividerStyle(orientation: DividerOrientation = 'horizontal'): CSSProperties {\n const line = `1px solid ${cssVar('color.border.subtle')}`\n\n if (orientation === 'vertical') {\n return {\n alignSelf: 'stretch',\n width: 0,\n minHeight: '1em',\n margin: 0,\n border: 'none',\n borderInlineStart: line,\n }\n }\n\n return {\n width: '100%',\n height: 0,\n margin: 0,\n border: 'none',\n borderBlockStart: line,\n }\n}\n","import type { HTMLAttributes } from 'react'\nimport { mergeClassName } from './styles.js'\nimport { dividerStyle, type DividerOrientation } from './dividerStyles.js'\n\nexport type { DividerOrientation } from './dividerStyles.js'\n\nexport interface DividerProps extends HTMLAttributes<HTMLHRElement> {\n orientation?: DividerOrientation\n}\n\n/** Separator line. `<hr>` already carries the separator role. */\nexport function Divider({\n orientation = 'horizontal',\n className,\n style,\n ...rest\n}: DividerProps) {\n return (\n <hr\n data-mason-component=\"divider\"\n data-orientation={orientation}\n aria-orientation={orientation === 'vertical' ? 'vertical' : undefined}\n className={mergeClassName(className)}\n style={{ ...dividerStyle(orientation), ...style }}\n {...rest}\n />\n )\n}\n","import type { CSSProperties } from 'react'\nimport { radiusVar, textColorVar } from './styles.js'\n\nexport type LinkTone = 'link' | 'inherit'\nexport type LinkUnderline = 'hover' | 'always' | 'none'\n\n/** Link inherits typography from its container so it can sit inside Text. */\nexport function linkStyle({\n tone = 'link',\n underline = 'hover',\n}: {\n tone?: LinkTone\n underline?: LinkUnderline\n}): CSSProperties {\n return {\n color: tone === 'inherit' ? 'inherit' : textColorVar('link'),\n textDecoration: underline === 'always' ? 'underline' : 'none',\n textUnderlineOffset: '0.15em',\n borderRadius: radiusVar('sm'),\n cursor: 'pointer',\n }\n}\n","import type { AnchorHTMLAttributes } from 'react'\nimport { mergeClassName } from './styles.js'\nimport { linkStyle, type LinkTone, type LinkUnderline } from './linkStyles.js'\n\nexport type { LinkTone, LinkUnderline } from './linkStyles.js'\n\nexport interface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n tone?: LinkTone\n underline?: LinkUnderline\n /** Adds `target=\"_blank\"` and a safe `rel`. */\n external?: boolean\n}\n\n/**\n * Navigational anchor. Typography is inherited, so it composes inside Text.\n *\n * For client-side routing, pass the router's component via `asChild`-style\n * composition on the consumer side (`<Link href>` stays a plain `<a>`).\n */\nexport function Link({\n tone = 'link',\n underline = 'hover',\n external = false,\n className,\n style,\n children,\n ...rest\n}: LinkProps) {\n const externalProps = external\n ? { target: '_blank', rel: 'noreferrer noopener' }\n : null\n\n return (\n <a\n data-mason-component=\"link\"\n data-tone={tone}\n data-underline={underline}\n className={mergeClassName(className)}\n style={{ ...linkStyle({ tone, underline }), ...style }}\n {...externalProps}\n {...rest}\n >\n {children}\n </a>\n )\n}\n","import type { CSSProperties } from 'react'\nimport { cssVar } from './styles.js'\n\n/** `inherit` follows the surrounding font size — used inside Button. */\nexport type SpinnerSize = 'sm' | 'md' | 'lg' | 'inherit'\n\nconst SIZE_DIMENSION = {\n sm: cssVar('font.body.sm.size'),\n md: cssVar('font.body.md.size'),\n lg: cssVar('font.display.lg.size'),\n inherit: '1em',\n} as const satisfies Record<SpinnerSize, string>\n\nexport function spinnerStyle(size: SpinnerSize = 'md'): CSSProperties {\n const dimension = SIZE_DIMENSION[size]\n\n return {\n width: dimension,\n height: dimension,\n border: '2px solid currentColor',\n borderTopColor: 'transparent',\n borderRadius: '50%',\n display: 'inline-block',\n flexShrink: 0,\n }\n}\n","import type { HTMLAttributes } from 'react'\nimport { mergeClassName } from './styles.js'\nimport { spinnerStyle, type SpinnerSize } from './spinnerStyles.js'\n\nexport type { SpinnerSize } from './spinnerStyles.js'\n\nexport interface SpinnerProps extends HTMLAttributes<HTMLSpanElement> {\n size?: SpinnerSize\n /** Announced while loading. Without it the spinner is `aria-hidden`. */\n label?: string\n}\n\n/** Indeterminate loading indicator. The rotation lives in `tokens.css`. */\nexport function Spinner({\n size = 'md',\n label,\n className,\n style,\n ...rest\n}: SpinnerProps) {\n return (\n <span\n data-mason-component=\"spinner\"\n data-size={size}\n role={label ? 'status' : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n className={mergeClassName(className)}\n style={{ ...spinnerStyle(size), ...style }}\n {...rest}\n />\n )\n}\n","import type { CSSProperties } from 'react'\nimport { cssVar, typographyStyle, type TextVariant } from './styles.js'\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger'\nexport type ButtonSize = 'sm' | 'md' | 'lg'\n\ntype ActionColorPath =\n | `color.action.${ButtonVariant | 'disabled'}.${'bg' | 'text' | 'border'}`\n\nfunction actionColors(variant: ButtonVariant | 'disabled'): {\n bg: ActionColorPath\n text: ActionColorPath\n border: ActionColorPath\n} {\n return {\n bg: `color.action.${variant}.bg`,\n text: `color.action.${variant}.text`,\n border: `color.action.${variant}.border`,\n }\n}\n\n/**\n * Size ladder — padding / radius / type. Height comes from content, not min-height.\n */\nconst sizeStyles = {\n sm: {\n paddingBlock: cssVar('spacing.inset.sm'),\n paddingInline: cssVar('spacing.inset.md'),\n gap: cssVar('spacing.inline.sm'),\n radius: cssVar('radius.sm'),\n font: 'label.sm' as TextVariant,\n },\n md: {\n paddingBlock: cssVar('spacing.inset.md'),\n paddingInline: cssVar('spacing.inset.lg'),\n gap: cssVar('spacing.inline.md'),\n radius: cssVar('radius.md'),\n font: 'label.md' as TextVariant,\n },\n lg: {\n paddingBlock: cssVar('spacing.inset.lg'),\n paddingInline: `calc(${cssVar('spacing.inset.lg')} + ${cssVar('spacing.inset.md')})`,\n gap: cssVar('spacing.inline.md'),\n radius: cssVar('radius.lg'),\n font: 'label.lg' as TextVariant,\n },\n} as const satisfies Record<\n ButtonSize,\n {\n paddingBlock: string\n paddingInline: string\n gap: string\n radius: string\n font: TextVariant\n }\n>\n\nexport function buttonStyle({\n variant = 'primary',\n size = 'md',\n disabled = false,\n loading = false,\n}: {\n variant?: ButtonVariant\n size?: ButtonSize\n disabled?: boolean\n loading?: boolean\n}): CSSProperties {\n const inactive = disabled || loading\n const colors = actionColors(inactive ? 'disabled' : variant)\n const sizing = sizeStyles[size]\n\n return {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: sizing.gap,\n paddingBlock: sizing.paddingBlock,\n paddingInline: sizing.paddingInline,\n margin: 0,\n backgroundColor: cssVar(colors.bg),\n color: cssVar(colors.text),\n border: `1px solid ${cssVar(colors.border)}`,\n borderRadius: sizing.radius,\n boxSizing: 'border-box',\n ...typographyStyle(sizing.font),\n textDecoration: 'none',\n whiteSpace: 'nowrap',\n }\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react'\nimport { mergeClassName } from './styles.js'\nimport { Spinner } from './Spinner.js'\nimport { buttonStyle, type ButtonSize, type ButtonVariant } from './buttonStyles.js'\n\nexport type { ButtonSize, ButtonVariant } from './buttonStyles.js'\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant\n size?: ButtonSize\n loading?: boolean\n leadingSlot?: ReactNode\n trailingSlot?: ReactNode\n}\n\n/**\n * Primary action component. Native `<button>` with token-backed styles.\n *\n * Icon-only usage requires an `aria-label`.\n */\nexport function Button({\n variant = 'primary',\n size = 'md',\n disabled = false,\n loading = false,\n leadingSlot,\n trailingSlot,\n className,\n style,\n children,\n type = 'button',\n ...rest\n}: ButtonProps) {\n const isDisabled = disabled || loading\n\n return (\n <button\n type={type}\n data-mason-component=\"button\"\n data-variant={variant}\n data-size={size}\n disabled={isDisabled}\n aria-busy={loading || undefined}\n className={mergeClassName(className)}\n style={{\n ...buttonStyle({ variant, size, disabled, loading }),\n ...style,\n }}\n {...rest}\n >\n {loading ? (\n <Spinner size=\"inherit\" data-mason-slot=\"spinner\" />\n ) : leadingSlot ? (\n <span data-mason-slot=\"leading\">{leadingSlot}</span>\n ) : null}\n {children ? <span data-mason-slot=\"label\">{children}</span> : null}\n {trailingSlot && !loading ? (\n <span data-mason-slot=\"trailing\">{trailingSlot}</span>\n ) : null}\n </button>\n )\n}\n","import type { CSSProperties } from 'react'\nimport {\n cssVar,\n radiusVar,\n spacingVar,\n typographyStyle,\n type FeedbackTone,\n} from './styles.js'\n\nexport type BadgeTone = FeedbackTone | 'neutral'\nexport type BadgeSize = 'sm' | 'md'\n\nexport function badgeStyle({\n tone = 'neutral',\n size = 'sm',\n}: {\n tone?: BadgeTone\n size?: BadgeSize\n}): CSSProperties {\n const colors =\n tone === 'neutral'\n ? {\n bg: cssVar('color.bg.canvas'),\n text: cssVar('color.text.secondary'),\n border: cssVar('color.border.subtle'),\n }\n : {\n bg: cssVar(`color.feedback.${tone}.bg`),\n text: cssVar(`color.feedback.${tone}.text`),\n border: cssVar(`color.feedback.${tone}.border`),\n }\n\n return {\n display: 'inline-flex',\n alignItems: 'center',\n gap: spacingVar('inline', 'sm'),\n paddingBlock: '0.125em',\n paddingInline: spacingVar('inset', 'sm'),\n backgroundColor: colors.bg,\n color: colors.text,\n border: `1px solid ${colors.border}`,\n borderRadius: radiusVar('full'),\n ...typographyStyle(size === 'sm' ? 'label.sm' : 'label.md'),\n whiteSpace: 'nowrap',\n }\n}\n","import type { HTMLAttributes } from 'react'\nimport { mergeClassName } from './styles.js'\nimport { badgeStyle, type BadgeSize, type BadgeTone } from './badgeStyles.js'\n\nexport type { BadgeSize, BadgeTone } from './badgeStyles.js'\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n tone?: BadgeTone\n size?: BadgeSize\n}\n\n/**\n * Compact status chip. Colour carries no meaning on its own — keep the label\n * readable (`활성`, not just a green dot).\n */\nexport function Badge({\n tone = 'neutral',\n size = 'sm',\n className,\n style,\n children,\n ...rest\n}: BadgeProps) {\n return (\n <span\n data-mason-component=\"badge\"\n data-tone={tone}\n data-size={size}\n className={mergeClassName(className)}\n style={{ ...badgeStyle({ tone, size }), ...style }}\n {...rest}\n >\n {children}\n </span>\n )\n}\n","import type { CSSProperties } from 'react'\nimport {\n cssVar,\n radiusVar,\n spacingVar,\n typographyStyle,\n type FeedbackTone,\n} from './styles.js'\n\nexport function calloutStyle(tone: FeedbackTone = 'info'): CSSProperties {\n return {\n display: 'flex',\n gap: spacingVar('inline', 'md'),\n padding: spacingVar('inset', 'md'),\n backgroundColor: cssVar(`color.feedback.${tone}.bg`),\n color: cssVar(`color.feedback.${tone}.text`),\n border: `1px solid ${cssVar(`color.feedback.${tone}.border`)}`,\n borderRadius: radiusVar('md'),\n boxSizing: 'border-box',\n ...typographyStyle('body.md'),\n }\n}\n\nexport function calloutContentStyle(): CSSProperties {\n return {\n display: 'flex',\n flexDirection: 'column',\n gap: spacingVar('stack', 'sm'),\n minWidth: 0,\n }\n}\n\nexport function calloutTitleStyle(): CSSProperties {\n return { margin: 0, ...typographyStyle('label.md') }\n}\n\nexport function calloutBodyStyle(): CSSProperties {\n return { margin: 0, ...typographyStyle('body.sm') }\n}\n","import type { HTMLAttributes, ReactNode } from 'react'\nimport { mergeClassName, type FeedbackTone } from './styles.js'\nimport {\n calloutBodyStyle,\n calloutContentStyle,\n calloutStyle,\n calloutTitleStyle,\n} from './calloutStyles.js'\n\n/** `title` is the heading slot, so the native tooltip attribute is not available. */\nexport interface CalloutProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n tone?: FeedbackTone\n title?: ReactNode\n iconSlot?: ReactNode\n}\n\n/**\n * Inline message block for page-level feedback.\n *\n * It is static content by default — for something that appears in response to\n * an action, pass `role=\"status\"` (or `\"alert\"` when it must interrupt).\n */\nexport function Callout({\n tone = 'info',\n title,\n iconSlot,\n className,\n style,\n children,\n ...rest\n}: CalloutProps) {\n return (\n <div\n data-mason-component=\"callout\"\n data-tone={tone}\n className={mergeClassName(className)}\n style={{ ...calloutStyle(tone), ...style }}\n {...rest}\n >\n {iconSlot ? (\n <span data-mason-slot=\"icon\" aria-hidden=\"true\">\n {iconSlot}\n </span>\n ) : null}\n <div data-mason-slot=\"content\" style={calloutContentStyle()}>\n {title ? (\n <p data-mason-slot=\"title\" style={calloutTitleStyle()}>\n {title}\n </p>\n ) : null}\n {children ? (\n <div data-mason-slot=\"body\" style={calloutBodyStyle()}>\n {children}\n </div>\n ) : null}\n </div>\n </div>\n )\n}\n","import { useId, type CSSProperties, type ReactNode } from 'react'\nimport { mergeClassName } from './styles.js'\nimport {\n fieldDescriptionStyle,\n fieldErrorStyle,\n fieldLabelStyle,\n fieldRootStyle,\n type FieldSize,\n} from './fieldStyles.js'\n\nexport interface FieldIds {\n controlId: string\n descriptionId: string\n errorId: string\n /** `aria-describedby` value, or undefined when there is nothing to describe. */\n describedBy: string | undefined\n}\n\n/** Stable ids wiring a control to its label, description and error. */\nexport function useFieldIds({\n id,\n description,\n error,\n}: {\n id?: string\n description?: ReactNode\n error?: ReactNode\n}): FieldIds {\n const generated = useId()\n const controlId = id ?? `mason-field-${generated}`\n const descriptionId = `${controlId}-description`\n const errorId = `${controlId}-error`\n const describedBy =\n [description ? descriptionId : null, error ? errorId : null]\n .filter(Boolean)\n .join(' ') || undefined\n\n return { controlId, descriptionId, errorId, describedBy }\n}\n\nexport interface FieldFrameProps {\n /** `data-mason-component` value of the wrapper, e.g. `text-field`. */\n component: string\n ids: FieldIds\n label?: ReactNode\n description?: ReactNode\n error?: ReactNode\n size?: FieldSize\n invalid?: boolean\n disabled?: boolean\n className?: string\n style?: CSSProperties\n children: ReactNode\n}\n\n/**\n * Shared label / description / error chrome for form controls.\n * Internal — consumers use TextField, Select or Checkbox.\n */\nexport function FieldFrame({\n component,\n ids,\n label,\n description,\n error,\n size = 'md',\n invalid = false,\n disabled = false,\n className,\n style,\n children,\n}: FieldFrameProps) {\n return (\n <div\n data-mason-component={component}\n data-size={size}\n data-invalid={invalid || undefined}\n data-disabled={disabled || undefined}\n className={mergeClassName(className)}\n style={{ ...fieldRootStyle(), ...style }}\n >\n {label ? (\n <label\n data-mason-slot=\"label\"\n htmlFor={ids.controlId}\n style={fieldLabelStyle(size)}\n >\n {label}\n </label>\n ) : null}\n {children}\n {description ? (\n <p\n data-mason-slot=\"description\"\n id={ids.descriptionId}\n style={fieldDescriptionStyle()}\n >\n {description}\n </p>\n ) : null}\n {error ? (\n <p\n data-mason-slot=\"error\"\n id={ids.errorId}\n role=\"alert\"\n style={fieldErrorStyle()}\n >\n {error}\n </p>\n ) : null}\n </div>\n )\n}\n","import type { CSSProperties } from 'react'\nimport {\n cssVar,\n radiusVar,\n spacingVar,\n typographyStyle,\n type Level,\n type TextVariant,\n} from './styles.js'\n\n/** Field sizes reuse the spacing ladder — sm / md / lg. */\nexport type FieldSize = Level\n\nconst CONTROL_FONT = {\n sm: 'body.sm',\n md: 'body.md',\n lg: 'body.lg',\n} as const satisfies Record<FieldSize, TextVariant>\n\nconst LABEL_FONT = {\n sm: 'label.sm',\n md: 'label.md',\n lg: 'label.lg',\n} as const satisfies Record<FieldSize, TextVariant>\n\nconst CONTROL_PADDING_BLOCK = { sm: 'sm', md: 'sm', lg: 'md' } as const satisfies Record<\n FieldSize,\n Level\n>\n\nconst CONTROL_PADDING_INLINE = { sm: 'sm', md: 'md', lg: 'md' } as const satisfies Record<\n FieldSize,\n Level\n>\n\nexport function fieldRootStyle(): CSSProperties {\n return {\n display: 'flex',\n flexDirection: 'column',\n gap: spacingVar('stack', 'sm'),\n minWidth: 0,\n }\n}\n\nexport function fieldLabelStyle(size: FieldSize = 'md'): CSSProperties {\n return {\n color: cssVar('color.text.primary'),\n ...typographyStyle(LABEL_FONT[size]),\n }\n}\n\nexport function fieldControlStyle({\n size = 'md',\n invalid = false,\n disabled = false,\n}: {\n size?: FieldSize\n invalid?: boolean\n disabled?: boolean\n}): CSSProperties {\n return {\n width: '100%',\n boxSizing: 'border-box',\n margin: 0,\n paddingBlock: spacingVar('inset', CONTROL_PADDING_BLOCK[size]),\n paddingInline: spacingVar('inset', CONTROL_PADDING_INLINE[size]),\n backgroundColor: disabled\n ? cssVar('color.action.disabled.bg')\n : cssVar('color.field.bg'),\n color: disabled ? cssVar('color.text.disabled') : cssVar('color.field.text'),\n border: `1px solid ${cssVar(\n invalid ? 'color.field.borderInvalid' : 'color.field.border',\n )}`,\n borderRadius: radiusVar('md'),\n ...typographyStyle(CONTROL_FONT[size]),\n }\n}\n\nexport function fieldDescriptionStyle(): CSSProperties {\n return {\n margin: 0,\n color: cssVar('color.text.secondary'),\n ...typographyStyle('body.sm'),\n }\n}\n\nexport function fieldErrorStyle(): CSSProperties {\n return {\n margin: 0,\n color: cssVar('color.text.danger'),\n ...typographyStyle('body.sm'),\n }\n}\n\n/** Native input kept for a11y; the visible chrome is a sibling indicator. */\nexport function visuallyHiddenControlStyle(): CSSProperties {\n return {\n position: 'absolute',\n width: 1,\n height: 1,\n padding: 0,\n margin: -1,\n overflow: 'hidden',\n clip: 'rect(0, 0, 0, 0)',\n whiteSpace: 'nowrap',\n borderWidth: 0,\n borderStyle: 'solid',\n borderColor: 'transparent',\n }\n}\n","import type { InputHTMLAttributes, ReactNode } from 'react'\nimport { FieldFrame, useFieldIds } from './field.js'\nimport { fieldControlStyle, type FieldSize } from './fieldStyles.js'\n\nexport type { FieldSize } from './fieldStyles.js'\n\nexport interface TextFieldProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {\n label?: ReactNode\n description?: ReactNode\n /** Present error text switches the field to its invalid styling. */\n error?: ReactNode\n size?: FieldSize\n invalid?: boolean\n}\n\n/**\n * Labelled text input. `className` / `style` apply to the wrapper; every other\n * prop goes to the native `<input>`.\n */\nexport function TextField({\n label,\n description,\n error,\n size = 'md',\n invalid,\n id,\n disabled = false,\n className,\n style,\n ...rest\n}: TextFieldProps) {\n const ids = useFieldIds({ id, description, error })\n const isInvalid = invalid ?? Boolean(error)\n\n return (\n <FieldFrame\n component=\"text-field\"\n ids={ids}\n label={label}\n description={description}\n error={error}\n size={size}\n invalid={isInvalid}\n disabled={disabled}\n className={className}\n style={style}\n >\n <input\n {...rest}\n id={ids.controlId}\n data-mason-slot=\"control\"\n disabled={disabled}\n aria-invalid={isInvalid || undefined}\n aria-describedby={ids.describedBy}\n style={fieldControlStyle({ size, invalid: isInvalid, disabled })}\n />\n </FieldFrame>\n )\n}\n","import type { ReactNode, SelectHTMLAttributes } from 'react'\nimport { FieldFrame, useFieldIds } from './field.js'\nimport { fieldControlStyle, type FieldSize } from './fieldStyles.js'\n\nexport interface SelectProps\n extends Omit<SelectHTMLAttributes<HTMLSelectElement>, 'size'> {\n label?: ReactNode\n description?: ReactNode\n error?: ReactNode\n size?: FieldSize\n invalid?: boolean\n /** Rendered as a leading empty `<option>`. */\n placeholder?: string\n}\n\n/**\n * Labelled native `<select>`. Children are the `<option>` elements, so the\n * browser's own popup and keyboard behaviour is preserved.\n */\nexport function Select({\n label,\n description,\n error,\n size = 'md',\n invalid,\n placeholder,\n id,\n disabled = false,\n className,\n style,\n children,\n ...rest\n}: SelectProps) {\n const ids = useFieldIds({ id, description, error })\n const isInvalid = invalid ?? Boolean(error)\n\n return (\n <FieldFrame\n component=\"select\"\n ids={ids}\n label={label}\n description={description}\n error={error}\n size={size}\n invalid={isInvalid}\n disabled={disabled}\n className={className}\n style={style}\n >\n <select\n {...rest}\n id={ids.controlId}\n data-mason-slot=\"control\"\n disabled={disabled}\n aria-invalid={isInvalid || undefined}\n aria-describedby={ids.describedBy}\n style={fieldControlStyle({ size, invalid: isInvalid, disabled })}\n >\n {placeholder ? <option value=\"\">{placeholder}</option> : null}\n {children}\n </select>\n </FieldFrame>\n )\n}\n","import type { CSSProperties } from 'react'\nimport { radiusVar, spacingVar, typographyStyle, cssVar } from './styles.js'\n\nconst CONTROL_SIZE = '1.125rem'\n\nexport function checkboxRootStyle(): CSSProperties {\n return {\n display: 'flex',\n flexDirection: 'column',\n gap: spacingVar('stack', 'sm'),\n minWidth: 0,\n }\n}\n\nexport function checkboxLabelStyle(disabled = false): CSSProperties {\n return {\n display: 'inline-flex',\n alignItems: 'flex-start',\n gap: spacingVar('inline', 'sm'),\n cursor: disabled ? 'not-allowed' : 'pointer',\n color: disabled ? cssVar('color.text.disabled') : cssVar('color.text.primary'),\n ...typographyStyle('body.md'),\n }\n}\n\n/** Geometry only — colors / check mark live in foundationsCss. */\nexport function checkboxIndicatorStyle(): CSSProperties {\n return {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: CONTROL_SIZE,\n height: CONTROL_SIZE,\n marginBlockStart: '0.2em',\n flexShrink: 0,\n boxSizing: 'border-box',\n borderRadius: radiusVar('sm'),\n borderStyle: 'solid',\n borderWidth: '1.5px',\n }\n}\n","import type { InputHTMLAttributes, ReactNode } from 'react'\nimport { useFieldIds } from './field.js'\nimport { mergeClassName } from './styles.js'\nimport {\n fieldDescriptionStyle,\n fieldErrorStyle,\n visuallyHiddenControlStyle,\n} from './fieldStyles.js'\nimport {\n checkboxIndicatorStyle,\n checkboxLabelStyle,\n checkboxRootStyle,\n} from './checkboxStyles.js'\n\nexport interface CheckboxProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'> {\n label?: ReactNode\n description?: ReactNode\n error?: ReactNode\n invalid?: boolean\n}\n\n/**\n * Token-backed checkbox with a drawn indicator.\n * A visually hidden native input keeps form / keyboard behaviour.\n * The check mark is painted with `::after` in foundationsCss.\n */\nexport function Checkbox({\n label,\n description,\n error,\n invalid,\n id,\n disabled = false,\n className,\n style,\n ...rest\n}: CheckboxProps) {\n const ids = useFieldIds({ id, description, error })\n const isInvalid = invalid ?? Boolean(error)\n\n return (\n <div\n data-mason-component=\"checkbox\"\n data-invalid={isInvalid || undefined}\n data-disabled={disabled || undefined}\n className={mergeClassName(className)}\n style={{ ...checkboxRootStyle(), ...style }}\n >\n <label\n data-mason-slot=\"label\"\n htmlFor={ids.controlId}\n style={checkboxLabelStyle(disabled)}\n >\n <input\n {...rest}\n type=\"checkbox\"\n id={ids.controlId}\n data-mason-slot=\"control\"\n disabled={disabled}\n aria-invalid={isInvalid || undefined}\n aria-describedby={ids.describedBy}\n style={visuallyHiddenControlStyle()}\n />\n <span data-mason-slot=\"indicator\" aria-hidden=\"true\" style={checkboxIndicatorStyle()} />\n {label ? <span data-mason-slot=\"label-text\">{label}</span> : null}\n </label>\n {description ? (\n <p\n data-mason-slot=\"description\"\n id={ids.descriptionId}\n style={fieldDescriptionStyle()}\n >\n {description}\n </p>\n ) : null}\n {error ? (\n <p\n data-mason-slot=\"error\"\n id={ids.errorId}\n role=\"alert\"\n style={fieldErrorStyle()}\n >\n {error}\n </p>\n ) : null}\n </div>\n )\n}\n","import type { CSSProperties } from 'react'\nimport { cssVar, spacingVar, typographyStyle } from './styles.js'\n\nconst CONTROL_SIZE = '1.125rem'\n\nexport function radioRootStyle(): CSSProperties {\n return {\n display: 'flex',\n flexDirection: 'column',\n gap: spacingVar('stack', 'sm'),\n minWidth: 0,\n }\n}\n\nexport function radioLabelStyle(disabled = false): CSSProperties {\n return {\n display: 'inline-flex',\n alignItems: 'flex-start',\n gap: spacingVar('inline', 'sm'),\n cursor: disabled ? 'not-allowed' : 'pointer',\n color: disabled ? cssVar('color.text.disabled') : cssVar('color.text.primary'),\n ...typographyStyle('body.md'),\n }\n}\n\n/** Geometry only — colors / selected dot live in foundationsCss. */\nexport function radioIndicatorStyle(): CSSProperties {\n return {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: CONTROL_SIZE,\n height: CONTROL_SIZE,\n marginBlockStart: '0.2em',\n flexShrink: 0,\n boxSizing: 'border-box',\n borderRadius: '999px',\n borderStyle: 'solid',\n borderWidth: '1.5px',\n }\n}\n","import type { InputHTMLAttributes, ReactNode } from 'react'\nimport { useFieldIds } from './field.js'\nimport { mergeClassName } from './styles.js'\nimport {\n fieldDescriptionStyle,\n fieldErrorStyle,\n visuallyHiddenControlStyle,\n} from './fieldStyles.js'\nimport {\n radioIndicatorStyle,\n radioLabelStyle,\n radioRootStyle,\n} from './radioStyles.js'\n\nexport interface RadioProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'> {\n label?: ReactNode\n description?: ReactNode\n error?: ReactNode\n invalid?: boolean\n}\n\n/**\n * Token-backed radio with a drawn indicator.\n * A visually hidden native input keeps form / keyboard behaviour.\n * The selected dot is painted with `::after` in foundationsCss.\n */\nexport function Radio({\n label,\n description,\n error,\n invalid,\n id,\n disabled = false,\n className,\n style,\n ...rest\n}: RadioProps) {\n const ids = useFieldIds({ id, description, error })\n const isInvalid = invalid ?? Boolean(error)\n\n return (\n <div\n data-mason-component=\"radio\"\n data-invalid={isInvalid || undefined}\n data-disabled={disabled || undefined}\n className={mergeClassName(className)}\n style={{ ...radioRootStyle(), ...style }}\n >\n <label\n data-mason-slot=\"label\"\n htmlFor={ids.controlId}\n style={radioLabelStyle(disabled)}\n >\n <input\n {...rest}\n type=\"radio\"\n id={ids.controlId}\n data-mason-slot=\"control\"\n disabled={disabled}\n aria-invalid={isInvalid || undefined}\n aria-describedby={ids.describedBy}\n style={visuallyHiddenControlStyle()}\n />\n <span data-mason-slot=\"indicator\" aria-hidden=\"true\" style={radioIndicatorStyle()} />\n {label ? <span data-mason-slot=\"label-text\">{label}</span> : null}\n </label>\n {description ? (\n <p\n data-mason-slot=\"description\"\n id={ids.descriptionId}\n style={fieldDescriptionStyle()}\n >\n {description}\n </p>\n ) : null}\n {error ? (\n <p\n data-mason-slot=\"error\"\n id={ids.errorId}\n role=\"alert\"\n style={fieldErrorStyle()}\n >\n {error}\n </p>\n ) : null}\n </div>\n )\n}\n"],"mappings":"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","names":["jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsxs","jsx","jsxs","jsx","jsx","jsxs","jsx","jsxs","CONTROL_SIZE","jsx","jsxs"]}
|
package/llms.txt
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# @mason-ds/react
|
|
2
|
+
|
|
3
|
+
> React components for mason-ds. Consume **semantic** tokens only (`@mason-ds/tokens/tokens.css`). Palette-first: identity comes from tokens, not hardcoded brand colors.
|
|
4
|
+
|
|
5
|
+
## Peer / deps
|
|
6
|
+
|
|
7
|
+
- `react`, `react-dom` ^18 || ^19
|
|
8
|
+
- `@mason-ds/tokens` (workspace / same major on npm)
|
|
9
|
+
|
|
10
|
+
## Setup
|
|
11
|
+
|
|
12
|
+
```tsx
|
|
13
|
+
import '@mason-ds/tokens/tokens.css'
|
|
14
|
+
import { MasonProvider, Button } from '@mason-ds/react'
|
|
15
|
+
|
|
16
|
+
export function App() {
|
|
17
|
+
return (
|
|
18
|
+
<MasonProvider>
|
|
19
|
+
<Button variant="primary">Save</Button>
|
|
20
|
+
</MasonProvider>
|
|
21
|
+
)
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Wrap the tree in `MasonProvider`. Import `tokens.css` (or a `mason-tokens build` output) once at the app root.
|
|
26
|
+
|
|
27
|
+
## Components
|
|
28
|
+
|
|
29
|
+
Provider: `MasonProvider` (`theme` when light/dark is configured)
|
|
30
|
+
|
|
31
|
+
Primitives: `Text` · `Stack` · `Card` · `Divider` · `Link`
|
|
32
|
+
|
|
33
|
+
Actions / status: `Button` · `Spinner` · `Badge` · `Callout`
|
|
34
|
+
|
|
35
|
+
Forms: `TextField` · `Select` · `Checkbox` · `Radio`
|
|
36
|
+
|
|
37
|
+
Size / spacing / radius levels: **sm / md / lg** only.
|
|
38
|
+
|
|
39
|
+
## Notable APIs
|
|
40
|
+
|
|
41
|
+
- `Button`: `variant` primary|secondary|ghost|danger · `size` sm|md|lg · `loading` · `disabled` · `leadingSlot` · `trailingSlot` · icon-only needs `aria-label`
|
|
42
|
+
- `Text`: `variant` (font roles e.g. `body.md`) · `tone` (text color roles) · `as`
|
|
43
|
+
- `Checkbox` / `Radio`: drawn indicators; native input kept for a11y; `label` · `description` · `error`
|
|
44
|
+
- Form fields share `label` · `description` · `error` wiring (`aria-describedby`)
|
|
45
|
+
|
|
46
|
+
## Do / don't
|
|
47
|
+
|
|
48
|
+
- Do: reference semantic CSS variables / token helpers from styles
|
|
49
|
+
- Don't: import `palette*` inside components
|
|
50
|
+
- Vue parity: `@mason-ds/vue` — same components; slots named `leading` / `trailing` instead of `*Slot` props
|
|
51
|
+
|
|
52
|
+
## Links
|
|
53
|
+
|
|
54
|
+
- npm: https://www.npmjs.com/package/@mason-ds/react
|
|
55
|
+
- Repo: https://github.com/FE-HyunSu/mason-ds/tree/main/packages/react
|
|
56
|
+
- Tokens: `@mason-ds/tokens`
|
|
57
|
+
- License: Apache-2.0
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mason-ds/react",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Button component for mason-ds",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -23,10 +23,11 @@
|
|
|
23
23
|
"dist",
|
|
24
24
|
"README.md",
|
|
25
25
|
"LICENSE",
|
|
26
|
-
"NOTICE"
|
|
26
|
+
"NOTICE",
|
|
27
|
+
"llms.txt"
|
|
27
28
|
],
|
|
28
29
|
"dependencies": {
|
|
29
|
-
"@mason-ds/tokens": "0.2.
|
|
30
|
+
"@mason-ds/tokens": "0.2.1"
|
|
30
31
|
},
|
|
31
32
|
"peerDependencies": {
|
|
32
33
|
"react": "^18.0.0 || ^19.0.0",
|