@tonyarbor/components 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/dist/ButtonSegmented.d.mts +61 -0
  2. package/dist/ButtonSegmented.d.ts +61 -0
  3. package/dist/ButtonSegmented.js +167 -0
  4. package/dist/ButtonSegmented.js.map +1 -0
  5. package/dist/ButtonSegmented.mjs +7 -0
  6. package/dist/ButtonSegmented.mjs.map +1 -0
  7. package/dist/ListRow.d.mts +72 -0
  8. package/dist/ListRow.d.ts +72 -0
  9. package/dist/ListRow.js +194 -0
  10. package/dist/ListRow.js.map +1 -0
  11. package/dist/ListRow.mjs +7 -0
  12. package/dist/ListRow.mjs.map +1 -0
  13. package/dist/ListRowMultiLine.d.mts +56 -0
  14. package/dist/ListRowMultiLine.d.ts +56 -0
  15. package/dist/ListRowMultiLine.js +182 -0
  16. package/dist/ListRowMultiLine.js.map +1 -0
  17. package/dist/ListRowMultiLine.mjs +7 -0
  18. package/dist/ListRowMultiLine.mjs.map +1 -0
  19. package/dist/Logo.d.mts +39 -0
  20. package/dist/Logo.d.ts +39 -0
  21. package/dist/Logo.js +119 -0
  22. package/dist/Logo.js.map +1 -0
  23. package/dist/Logo.mjs +7 -0
  24. package/dist/Logo.mjs.map +1 -0
  25. package/dist/Section.d.mts +57 -0
  26. package/dist/Section.d.ts +57 -0
  27. package/dist/Section.js +72 -0
  28. package/dist/Section.js.map +1 -0
  29. package/dist/Section.mjs +7 -0
  30. package/dist/Section.mjs.map +1 -0
  31. package/dist/SectionHeading.d.mts +111 -0
  32. package/dist/SectionHeading.d.ts +111 -0
  33. package/dist/SectionHeading.js +385 -0
  34. package/dist/SectionHeading.js.map +1 -0
  35. package/dist/SectionHeading.mjs +8 -0
  36. package/dist/SectionHeading.mjs.map +1 -0
  37. package/dist/SectionHeadingInteractive.d.mts +67 -0
  38. package/dist/SectionHeadingInteractive.d.ts +67 -0
  39. package/dist/SectionHeadingInteractive.js +225 -0
  40. package/dist/SectionHeadingInteractive.js.map +1 -0
  41. package/dist/SectionHeadingInteractive.mjs +7 -0
  42. package/dist/SectionHeadingInteractive.mjs.map +1 -0
  43. package/dist/SectionIcon.d.mts +35 -0
  44. package/dist/SectionIcon.d.ts +35 -0
  45. package/dist/SectionIcon.js +142 -0
  46. package/dist/SectionIcon.js.map +1 -0
  47. package/dist/SectionIcon.mjs +7 -0
  48. package/dist/SectionIcon.mjs.map +1 -0
  49. package/dist/SubSectionHeading.d.mts +75 -0
  50. package/dist/SubSectionHeading.d.ts +75 -0
  51. package/dist/SubSectionHeading.js +225 -0
  52. package/dist/SubSectionHeading.js.map +1 -0
  53. package/dist/SubSectionHeading.mjs +7 -0
  54. package/dist/SubSectionHeading.mjs.map +1 -0
  55. package/dist/SubSectionInteractive.d.mts +65 -0
  56. package/dist/SubSectionInteractive.d.ts +65 -0
  57. package/dist/SubSectionInteractive.js +211 -0
  58. package/dist/SubSectionInteractive.js.map +1 -0
  59. package/dist/SubSectionInteractive.mjs +7 -0
  60. package/dist/SubSectionInteractive.mjs.map +1 -0
  61. package/dist/chunk-7NYBJKJS.mjs +106 -0
  62. package/dist/chunk-7NYBJKJS.mjs.map +1 -0
  63. package/dist/chunk-ALLCJATI.mjs +189 -0
  64. package/dist/chunk-ALLCJATI.mjs.map +1 -0
  65. package/dist/chunk-F6JVEIWC.mjs +158 -0
  66. package/dist/chunk-F6JVEIWC.mjs.map +1 -0
  67. package/dist/chunk-GHATS25Y.mjs +249 -0
  68. package/dist/chunk-GHATS25Y.mjs.map +1 -0
  69. package/dist/chunk-ILLGBZ6R.mjs +131 -0
  70. package/dist/chunk-ILLGBZ6R.mjs.map +1 -0
  71. package/dist/chunk-NNYU4DPD.mjs +83 -0
  72. package/dist/chunk-NNYU4DPD.mjs.map +1 -0
  73. package/dist/chunk-ODKT7LGV.mjs +146 -0
  74. package/dist/chunk-ODKT7LGV.mjs.map +1 -0
  75. package/dist/chunk-RL4G7MR3.mjs +189 -0
  76. package/dist/chunk-RL4G7MR3.mjs.map +1 -0
  77. package/dist/chunk-X2CW5GF3.mjs +175 -0
  78. package/dist/chunk-X2CW5GF3.mjs.map +1 -0
  79. package/dist/chunk-YJ36ZZJQ.mjs +36 -0
  80. package/dist/chunk-YJ36ZZJQ.mjs.map +1 -0
  81. package/dist/index.d.mts +10 -0
  82. package/dist/index.d.ts +10 -0
  83. package/dist/index.js +1440 -0
  84. package/dist/index.js.map +1 -1
  85. package/dist/index.mjs +40 -0
  86. package/package.json +51 -1
@@ -0,0 +1,106 @@
1
+ // src/SectionIcon/SectionIcon.tsx
2
+ import * as React from "react";
3
+ import { clsx } from "clsx";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ var WarningIcon = ({ color }) => /* @__PURE__ */ jsxs("svg", { width: "14", height: "12", viewBox: "0 0 14 12", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
6
+ /* @__PURE__ */ jsx(
7
+ "path",
8
+ {
9
+ d: "M7 0.5L13.5 11.5H0.5L7 0.5Z",
10
+ stroke: color,
11
+ strokeWidth: "1.2",
12
+ strokeLinejoin: "round",
13
+ fill: "none"
14
+ }
15
+ ),
16
+ /* @__PURE__ */ jsx(
17
+ "path",
18
+ {
19
+ d: "M7 4.5V7",
20
+ stroke: color,
21
+ strokeWidth: "1.2",
22
+ strokeLinecap: "round"
23
+ }
24
+ ),
25
+ /* @__PURE__ */ jsx("circle", { cx: "7", cy: "9", r: "0.75", fill: color })
26
+ ] });
27
+ var InfoIcon = ({ color }) => /* @__PURE__ */ jsxs("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
28
+ /* @__PURE__ */ jsx("circle", { cx: "7", cy: "7", r: "6", stroke: color, strokeWidth: "1.2", fill: "none" }),
29
+ /* @__PURE__ */ jsx("path", { d: "M7 6V10", stroke: color, strokeWidth: "1.2", strokeLinecap: "round" }),
30
+ /* @__PURE__ */ jsx("circle", { cx: "7", cy: "4", r: "0.75", fill: color })
31
+ ] });
32
+ var SuccessIcon = ({ color }) => /* @__PURE__ */ jsxs("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
33
+ /* @__PURE__ */ jsx("circle", { cx: "7", cy: "7", r: "6", stroke: color, strokeWidth: "1.2", fill: "none" }),
34
+ /* @__PURE__ */ jsx("path", { d: "M4 7L6 9L10 5", stroke: color, strokeWidth: "1.2", strokeLinecap: "round", strokeLinejoin: "round" })
35
+ ] });
36
+ var variantConfig = {
37
+ warning: {
38
+ backgroundColor: "#fffaf5",
39
+ iconColor: "#e4720d"
40
+ },
41
+ danger: {
42
+ backgroundColor: "#fff5f5",
43
+ iconColor: "#c93232"
44
+ },
45
+ info: {
46
+ backgroundColor: "#f5fbff",
47
+ iconColor: "#2c8bca"
48
+ },
49
+ success: {
50
+ backgroundColor: "#f5fff8",
51
+ iconColor: "#16a33d"
52
+ }
53
+ };
54
+ var sectionIconStyles = {
55
+ container: {
56
+ display: "inline-flex",
57
+ alignItems: "center",
58
+ justifyContent: "center",
59
+ padding: "4px",
60
+ borderRadius: "99px"
61
+ },
62
+ iconWrapper: {
63
+ display: "flex",
64
+ alignItems: "center",
65
+ justifyContent: "center",
66
+ width: "16px",
67
+ height: "16px"
68
+ }
69
+ };
70
+ var SectionIcon = React.forwardRef(
71
+ ({ variant = "info", className, style, ...props }, ref) => {
72
+ const config = variantConfig[variant];
73
+ const renderIcon = () => {
74
+ switch (variant) {
75
+ case "warning":
76
+ case "danger":
77
+ return /* @__PURE__ */ jsx(WarningIcon, { color: config.iconColor });
78
+ case "success":
79
+ return /* @__PURE__ */ jsx(SuccessIcon, { color: config.iconColor });
80
+ case "info":
81
+ default:
82
+ return /* @__PURE__ */ jsx(InfoIcon, { color: config.iconColor });
83
+ }
84
+ };
85
+ return /* @__PURE__ */ jsx(
86
+ "div",
87
+ {
88
+ ref,
89
+ className: clsx("arbor-section-icon", className),
90
+ style: {
91
+ ...sectionIconStyles.container,
92
+ backgroundColor: config.backgroundColor,
93
+ ...style
94
+ },
95
+ ...props,
96
+ children: /* @__PURE__ */ jsx("div", { style: sectionIconStyles.iconWrapper, children: renderIcon() })
97
+ }
98
+ );
99
+ }
100
+ );
101
+ SectionIcon.displayName = "SectionIcon";
102
+
103
+ export {
104
+ SectionIcon
105
+ };
106
+ //# sourceMappingURL=chunk-7NYBJKJS.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/SectionIcon/SectionIcon.tsx"],"sourcesContent":["import * as React from 'react';\nimport { clsx } from 'clsx';\n\nexport type SectionIconVariant = 'warning' | 'danger' | 'info' | 'success';\n\nexport interface SectionIconProps {\n /**\n * The variant/style of the section icon\n * @default 'info'\n */\n variant?: SectionIconVariant;\n /**\n * Additional CSS class name\n */\n className?: string;\n /**\n * Additional inline styles\n */\n style?: React.CSSProperties;\n}\n\n// Warning triangle icon\nconst WarningIcon = ({ color }: { color: string }) => (\n <svg width=\"14\" height=\"12\" viewBox=\"0 0 14 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M7 0.5L13.5 11.5H0.5L7 0.5Z\"\n stroke={color}\n strokeWidth=\"1.2\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n <path\n d=\"M7 4.5V7\"\n stroke={color}\n strokeWidth=\"1.2\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"7\" cy=\"9\" r=\"0.75\" fill={color} />\n </svg>\n);\n\n// Info circle icon\nconst InfoIcon = ({ color }: { color: string }) => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke={color} strokeWidth=\"1.2\" fill=\"none\" />\n <path d=\"M7 6V10\" stroke={color} strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n <circle cx=\"7\" cy=\"4\" r=\"0.75\" fill={color} />\n </svg>\n);\n\n// Success checkmark icon\nconst SuccessIcon = ({ color }: { color: string }) => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke={color} strokeWidth=\"1.2\" fill=\"none\" />\n <path d=\"M4 7L6 9L10 5\" stroke={color} strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\n// Variant configurations\nconst variantConfig: Record<SectionIconVariant, { backgroundColor: string; iconColor: string }> = {\n warning: {\n backgroundColor: '#fffaf5',\n iconColor: '#e4720d',\n },\n danger: {\n backgroundColor: '#fff5f5',\n iconColor: '#c93232',\n },\n info: {\n backgroundColor: '#f5fbff',\n iconColor: '#2c8bca',\n },\n success: {\n backgroundColor: '#f5fff8',\n iconColor: '#16a33d',\n },\n};\n\n// Arbor Design System section icon styles\nconst sectionIconStyles = {\n container: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '4px',\n borderRadius: '99px',\n },\n iconWrapper: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n },\n};\n\n/**\n * SectionIcon component - Arbor Design System\n *\n * A small badge-like icon used in section headings to indicate status or alerts.\n * Available in 4 variants: warning (orange), danger (red), info (blue), success (green).\n *\n * @example\n * ```tsx\n * <SectionIcon variant=\"warning\" />\n * <SectionIcon variant=\"danger\" />\n * <SectionIcon variant=\"info\" />\n * <SectionIcon variant=\"success\" />\n * ```\n */\nexport const SectionIcon = React.forwardRef<HTMLDivElement, SectionIconProps>(\n ({ variant = 'info', className, style, ...props }, ref) => {\n const config = variantConfig[variant];\n\n const renderIcon = () => {\n switch (variant) {\n case 'warning':\n case 'danger':\n return <WarningIcon color={config.iconColor} />;\n case 'success':\n return <SuccessIcon color={config.iconColor} />;\n case 'info':\n default:\n return <InfoIcon color={config.iconColor} />;\n }\n };\n\n return (\n <div\n ref={ref}\n className={clsx('arbor-section-icon', className)}\n style={{\n ...sectionIconStyles.container,\n backgroundColor: config.backgroundColor,\n ...style,\n }}\n {...props}\n >\n <div style={sectionIconStyles.iconWrapper}>\n {renderIcon()}\n </div>\n </div>\n );\n }\n);\n\nSectionIcon.displayName = 'SectionIcon';\n"],"mappings":"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","names":[]}
@@ -0,0 +1,189 @@
1
+ // src/SubSectionHeading/SubSectionHeading.tsx
2
+ import * as React from "react";
3
+ import { clsx } from "clsx";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ var InfoIcon = () => /* @__PURE__ */ jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
6
+ /* @__PURE__ */ jsx("circle", { cx: "8", cy: "8", r: "6.5", stroke: "#2f2f2f", strokeWidth: "1.2" }),
7
+ /* @__PURE__ */ jsx(
8
+ "path",
9
+ {
10
+ d: "M8 7V11",
11
+ stroke: "#2f2f2f",
12
+ strokeWidth: "1.2",
13
+ strokeLinecap: "round"
14
+ }
15
+ ),
16
+ /* @__PURE__ */ jsx("circle", { cx: "8", cy: "5", r: "0.75", fill: "#2f2f2f" })
17
+ ] });
18
+ var PlusIcon = ({ color = "#2f2f2f" }) => /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ jsx(
19
+ "path",
20
+ {
21
+ d: "M8 3V13M3 8H13",
22
+ stroke: color,
23
+ strokeWidth: "1.2",
24
+ strokeLinecap: "round",
25
+ strokeLinejoin: "round"
26
+ }
27
+ ) });
28
+ var subSectionHeadingStyles = {
29
+ container: {
30
+ display: "flex",
31
+ alignItems: "center",
32
+ width: "100%",
33
+ borderBottom: "1px solid #efefef",
34
+ fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
35
+ boxSizing: "border-box"
36
+ },
37
+ containerNoButton: {
38
+ padding: "12px 8px",
39
+ gap: "0px"
40
+ },
41
+ containerWithButton: {
42
+ padding: "8px",
43
+ gap: "12px",
44
+ justifyContent: "space-between"
45
+ },
46
+ textContainer: {
47
+ display: "flex",
48
+ alignItems: "center",
49
+ gap: "8px",
50
+ flex: 1,
51
+ minHeight: "16px"
52
+ },
53
+ title: {
54
+ fontSize: "18px",
55
+ fontWeight: "600",
56
+ color: "#2f2f2f",
57
+ lineHeight: "1.25",
58
+ margin: 0,
59
+ whiteSpace: "nowrap"
60
+ },
61
+ iconWrapper: {
62
+ display: "flex",
63
+ alignItems: "center",
64
+ justifyContent: "center",
65
+ width: "16px",
66
+ height: "16px",
67
+ flexShrink: 0
68
+ },
69
+ buttonBase: {
70
+ display: "flex",
71
+ alignItems: "center",
72
+ justifyContent: "center",
73
+ gap: "8px",
74
+ height: "32px",
75
+ minHeight: "32px",
76
+ padding: "0 16px",
77
+ borderRadius: "99px",
78
+ border: "none",
79
+ cursor: "pointer",
80
+ fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
81
+ fontSize: "13px",
82
+ fontWeight: "600",
83
+ lineHeight: "1.5",
84
+ whiteSpace: "nowrap",
85
+ flexShrink: 0,
86
+ transition: "background-color 0.15s ease-in-out, opacity 0.15s ease-in-out"
87
+ },
88
+ buttonPrimary: {
89
+ backgroundColor: "#0e8a0e",
90
+ color: "#ffffff"
91
+ },
92
+ buttonPrimaryHover: {
93
+ backgroundColor: "#0a6b0a"
94
+ },
95
+ buttonTertiary: {
96
+ backgroundColor: "#efefef",
97
+ color: "#2f2f2f"
98
+ },
99
+ buttonTertiaryHover: {
100
+ backgroundColor: "#e5e5e5"
101
+ },
102
+ buttonIconWrapper: {
103
+ display: "flex",
104
+ alignItems: "center",
105
+ justifyContent: "center",
106
+ width: "16px",
107
+ height: "16px",
108
+ flexShrink: 0
109
+ }
110
+ };
111
+ var SubSectionHeading = React.forwardRef(
112
+ ({
113
+ title,
114
+ icon = false,
115
+ button,
116
+ buttonText = "Button Text",
117
+ buttonIcon,
118
+ onButtonClick,
119
+ className,
120
+ style,
121
+ ...props
122
+ }, ref) => {
123
+ const [isButtonHovered, setIsButtonHovered] = React.useState(false);
124
+ const containerStyle = {
125
+ ...subSectionHeadingStyles.container,
126
+ ...button ? subSectionHeadingStyles.containerWithButton : subSectionHeadingStyles.containerNoButton,
127
+ ...style
128
+ };
129
+ const getButtonStyle = () => {
130
+ const baseStyle = { ...subSectionHeadingStyles.buttonBase };
131
+ if (button === "primary") {
132
+ return {
133
+ ...baseStyle,
134
+ ...subSectionHeadingStyles.buttonPrimary,
135
+ ...isButtonHovered && subSectionHeadingStyles.buttonPrimaryHover
136
+ };
137
+ }
138
+ if (button === "tertiary") {
139
+ return {
140
+ ...baseStyle,
141
+ ...subSectionHeadingStyles.buttonTertiary,
142
+ ...isButtonHovered && subSectionHeadingStyles.buttonTertiaryHover
143
+ };
144
+ }
145
+ return baseStyle;
146
+ };
147
+ const renderButtonIcon = () => {
148
+ if (buttonIcon) {
149
+ return /* @__PURE__ */ jsx("span", { style: subSectionHeadingStyles.buttonIconWrapper, children: buttonIcon });
150
+ }
151
+ return /* @__PURE__ */ jsx("span", { style: subSectionHeadingStyles.buttonIconWrapper, children: /* @__PURE__ */ jsx(PlusIcon, { color: button === "primary" ? "#ffffff" : "#2f2f2f" }) });
152
+ };
153
+ return /* @__PURE__ */ jsxs(
154
+ "div",
155
+ {
156
+ ref,
157
+ className: clsx("arbor-sub-section-heading", className),
158
+ style: containerStyle,
159
+ ...props,
160
+ children: [
161
+ /* @__PURE__ */ jsxs("div", { style: subSectionHeadingStyles.textContainer, children: [
162
+ /* @__PURE__ */ jsx("h3", { style: subSectionHeadingStyles.title, children: title }),
163
+ icon && /* @__PURE__ */ jsx("span", { style: subSectionHeadingStyles.iconWrapper, children: /* @__PURE__ */ jsx(InfoIcon, {}) })
164
+ ] }),
165
+ button && /* @__PURE__ */ jsxs(
166
+ "button",
167
+ {
168
+ type: "button",
169
+ style: getButtonStyle(),
170
+ onClick: onButtonClick,
171
+ onMouseEnter: () => setIsButtonHovered(true),
172
+ onMouseLeave: () => setIsButtonHovered(false),
173
+ children: [
174
+ renderButtonIcon(),
175
+ /* @__PURE__ */ jsx("span", { children: buttonText })
176
+ ]
177
+ }
178
+ )
179
+ ]
180
+ }
181
+ );
182
+ }
183
+ );
184
+ SubSectionHeading.displayName = "SubSectionHeading";
185
+
186
+ export {
187
+ SubSectionHeading
188
+ };
189
+ //# sourceMappingURL=chunk-ALLCJATI.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/SubSectionHeading/SubSectionHeading.tsx"],"sourcesContent":["import * as React from 'react';\nimport { clsx } from 'clsx';\n\nexport interface SubSectionHeadingProps {\n /**\n * The heading text (required)\n */\n title: string;\n /**\n * Show an info icon next to the heading text\n * @default false\n */\n icon?: boolean;\n /**\n * Button variant to display on the right\n * - 'primary': Green button with white text\n * - 'tertiary': Gray button with dark text\n * - undefined: No button\n */\n button?: 'primary' | 'tertiary';\n /**\n * Text to display in the button (required if button is specified)\n */\n buttonText?: string;\n /**\n * Icon to display in the button (renders before button text)\n */\n buttonIcon?: React.ReactNode;\n /**\n * Click handler for the button\n */\n onButtonClick?: () => void;\n /**\n * Additional CSS class name\n */\n className?: string;\n /**\n * Additional inline styles\n */\n style?: React.CSSProperties;\n}\n\n// Info icon (circle with i)\nconst InfoIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"#2f2f2f\" strokeWidth=\"1.2\" />\n <path\n d=\"M8 7V11\"\n stroke=\"#2f2f2f\"\n strokeWidth=\"1.2\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"8\" cy=\"5\" r=\"0.75\" fill=\"#2f2f2f\" />\n </svg>\n);\n\n// Default plus icon for buttons\nconst PlusIcon = ({ color = '#2f2f2f' }: { color?: string }) => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M8 3V13M3 8H13\"\n stroke={color}\n strokeWidth=\"1.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Arbor Design System sub-section heading styles\nconst subSectionHeadingStyles = {\n container: {\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n borderBottom: '1px solid #efefef',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n boxSizing: 'border-box' as const,\n },\n containerNoButton: {\n padding: '12px 8px',\n gap: '0px',\n },\n containerWithButton: {\n padding: '8px',\n gap: '12px',\n justifyContent: 'space-between',\n },\n textContainer: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n flex: 1,\n minHeight: '16px',\n },\n title: {\n fontSize: '18px',\n fontWeight: '600',\n color: '#2f2f2f',\n lineHeight: '1.25',\n margin: 0,\n whiteSpace: 'nowrap' as const,\n },\n iconWrapper: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n flexShrink: 0,\n },\n buttonBase: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n height: '32px',\n minHeight: '32px',\n padding: '0 16px',\n borderRadius: '99px',\n border: 'none',\n cursor: 'pointer',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n fontSize: '13px',\n fontWeight: '600',\n lineHeight: '1.5',\n whiteSpace: 'nowrap' as const,\n flexShrink: 0,\n transition: 'background-color 0.15s ease-in-out, opacity 0.15s ease-in-out',\n },\n buttonPrimary: {\n backgroundColor: '#0e8a0e',\n color: '#ffffff',\n },\n buttonPrimaryHover: {\n backgroundColor: '#0a6b0a',\n },\n buttonTertiary: {\n backgroundColor: '#efefef',\n color: '#2f2f2f',\n },\n buttonTertiaryHover: {\n backgroundColor: '#e5e5e5',\n },\n buttonIconWrapper: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n flexShrink: 0,\n },\n};\n\n/**\n * SubSectionHeading component - Arbor Design System\n *\n * A sub-section heading component for dividing content within sections.\n * Supports optional icon next to text and optional button on the right.\n *\n * @example\n * ```tsx\n * // Basic sub-section heading\n * <SubSectionHeading title=\"Details\" />\n *\n * // With info icon\n * <SubSectionHeading title=\"Details\" icon />\n *\n * // With primary button\n * <SubSectionHeading\n * title=\"Items\"\n * button=\"primary\"\n * buttonText=\"Add Item\"\n * onButtonClick={() => handleAdd()}\n * />\n *\n * // With tertiary button and icon\n * <SubSectionHeading\n * title=\"Settings\"\n * icon\n * button=\"tertiary\"\n * buttonText=\"Configure\"\n * onButtonClick={() => handleConfigure()}\n * />\n * ```\n */\nexport const SubSectionHeading = React.forwardRef<HTMLDivElement, SubSectionHeadingProps>(\n (\n {\n title,\n icon = false,\n button,\n buttonText = 'Button Text',\n buttonIcon,\n onButtonClick,\n className,\n style,\n ...props\n },\n ref\n ) => {\n const [isButtonHovered, setIsButtonHovered] = React.useState(false);\n\n const containerStyle: React.CSSProperties = {\n ...subSectionHeadingStyles.container,\n ...(button\n ? subSectionHeadingStyles.containerWithButton\n : subSectionHeadingStyles.containerNoButton),\n ...style,\n };\n\n const getButtonStyle = (): React.CSSProperties => {\n const baseStyle = { ...subSectionHeadingStyles.buttonBase };\n\n if (button === 'primary') {\n return {\n ...baseStyle,\n ...subSectionHeadingStyles.buttonPrimary,\n ...(isButtonHovered && subSectionHeadingStyles.buttonPrimaryHover),\n };\n }\n\n if (button === 'tertiary') {\n return {\n ...baseStyle,\n ...subSectionHeadingStyles.buttonTertiary,\n ...(isButtonHovered && subSectionHeadingStyles.buttonTertiaryHover),\n };\n }\n\n return baseStyle;\n };\n\n const renderButtonIcon = () => {\n if (buttonIcon) {\n return (\n <span style={subSectionHeadingStyles.buttonIconWrapper}>{buttonIcon}</span>\n );\n }\n // Default icon based on button type\n return (\n <span style={subSectionHeadingStyles.buttonIconWrapper}>\n <PlusIcon color={button === 'primary' ? '#ffffff' : '#2f2f2f'} />\n </span>\n );\n };\n\n return (\n <div\n ref={ref}\n className={clsx('arbor-sub-section-heading', className)}\n style={containerStyle}\n {...props}\n >\n <div style={subSectionHeadingStyles.textContainer}>\n <h3 style={subSectionHeadingStyles.title}>{title}</h3>\n {icon && (\n <span style={subSectionHeadingStyles.iconWrapper}>\n <InfoIcon />\n </span>\n )}\n </div>\n {button && (\n <button\n type=\"button\"\n style={getButtonStyle()}\n onClick={onButtonClick}\n onMouseEnter={() => setIsButtonHovered(true)}\n onMouseLeave={() => setIsButtonHovered(false)}\n >\n {renderButtonIcon()}\n <span>{buttonText}</span>\n </button>\n )}\n </div>\n );\n }\n);\n\nSubSectionHeading.displayName = 'SubSectionHeading';\n"],"mappings":"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","names":[]}
@@ -0,0 +1,158 @@
1
+ // src/ListRow/ListRow.tsx
2
+ import * as React from "react";
3
+ import { clsx } from "clsx";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ var CaretIcon = ({ isHovered }) => {
6
+ if (isHovered) {
7
+ return /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ jsx(
8
+ "path",
9
+ {
10
+ d: "M6 4L10 8L6 12",
11
+ stroke: "#2f2f2f",
12
+ strokeWidth: "1.2",
13
+ strokeLinecap: "round",
14
+ strokeLinejoin: "round"
15
+ }
16
+ ) });
17
+ }
18
+ return /* @__PURE__ */ jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ jsx(
19
+ "path",
20
+ {
21
+ d: "M6 4L10 8L6 12",
22
+ stroke: "#b3b3b3",
23
+ strokeWidth: "1.2",
24
+ strokeLinecap: "round",
25
+ strokeLinejoin: "round"
26
+ }
27
+ ) });
28
+ };
29
+ var listRowStyles = {
30
+ container: {
31
+ display: "flex",
32
+ alignItems: "center",
33
+ width: "100%",
34
+ borderBottom: "1px solid #f8f8f8",
35
+ fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
36
+ boxSizing: "border-box",
37
+ borderRadius: "8px",
38
+ transition: "background-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out",
39
+ outline: "none"
40
+ },
41
+ containerHover: {
42
+ backgroundColor: "#f8f8f8"
43
+ },
44
+ containerFocus: {
45
+ outline: "3px solid #3cad51",
46
+ outlineOffset: "-3px"
47
+ },
48
+ containerClickable: {
49
+ cursor: "pointer"
50
+ },
51
+ content: {
52
+ display: "flex",
53
+ alignItems: "center",
54
+ justifyContent: "space-between",
55
+ width: "100%",
56
+ padding: "4px 8px",
57
+ minHeight: "28px"
58
+ },
59
+ label: {
60
+ fontSize: "13px",
61
+ fontWeight: "600",
62
+ color: "#2f2f2f",
63
+ lineHeight: "1.5",
64
+ width: "190px",
65
+ flexShrink: 0
66
+ },
67
+ valueContainer: {
68
+ flex: 1,
69
+ display: "flex",
70
+ alignItems: "center"
71
+ },
72
+ value: {
73
+ fontSize: "13px",
74
+ fontWeight: "400",
75
+ color: "#2f2f2f",
76
+ lineHeight: "1.5"
77
+ },
78
+ rightContainer: {
79
+ display: "flex",
80
+ alignItems: "center",
81
+ justifyContent: "flex-end",
82
+ gap: "8px",
83
+ flexShrink: 0
84
+ },
85
+ note: {
86
+ fontSize: "13px",
87
+ fontWeight: "400",
88
+ fontStyle: "italic",
89
+ color: "#2f2f2f",
90
+ lineHeight: "1.5",
91
+ textAlign: "right"
92
+ },
93
+ iconWrapper: {
94
+ display: "flex",
95
+ alignItems: "center",
96
+ justifyContent: "center",
97
+ width: "16px",
98
+ height: "16px",
99
+ flexShrink: 0
100
+ }
101
+ };
102
+ var ListRow = React.forwardRef(
103
+ ({ value, label, note, icon = false, onClick, className, style, ...props }, ref) => {
104
+ const [isHovered, setIsHovered] = React.useState(false);
105
+ const [isFocused, setIsFocused] = React.useState(false);
106
+ const showHoverState = icon && isHovered;
107
+ const isClickable = icon && onClick;
108
+ const containerStyle = {
109
+ ...listRowStyles.container,
110
+ ...showHoverState && listRowStyles.containerHover,
111
+ ...isFocused && listRowStyles.containerFocus,
112
+ ...isClickable && listRowStyles.containerClickable,
113
+ ...style
114
+ };
115
+ const handleClick = () => {
116
+ if (isClickable && onClick) {
117
+ onClick();
118
+ }
119
+ };
120
+ const handleKeyDown = (event) => {
121
+ if (isClickable && (event.key === "Enter" || event.key === " ")) {
122
+ event.preventDefault();
123
+ onClick?.();
124
+ }
125
+ };
126
+ return /* @__PURE__ */ jsx(
127
+ "div",
128
+ {
129
+ ref,
130
+ className: clsx("arbor-list-row", className),
131
+ style: containerStyle,
132
+ onClick: handleClick,
133
+ onMouseEnter: () => icon && setIsHovered(true),
134
+ onMouseLeave: () => setIsHovered(false),
135
+ onFocus: () => setIsFocused(true),
136
+ onBlur: () => setIsFocused(false),
137
+ onKeyDown: handleKeyDown,
138
+ tabIndex: isClickable ? 0 : void 0,
139
+ role: isClickable ? "button" : void 0,
140
+ ...props,
141
+ children: /* @__PURE__ */ jsxs("div", { style: listRowStyles.content, children: [
142
+ label && /* @__PURE__ */ jsx("div", { style: listRowStyles.label, children: label }),
143
+ /* @__PURE__ */ jsx("div", { style: listRowStyles.valueContainer, children: /* @__PURE__ */ jsx("span", { style: listRowStyles.value, children: value }) }),
144
+ /* @__PURE__ */ jsxs("div", { style: listRowStyles.rightContainer, children: [
145
+ note && /* @__PURE__ */ jsx("span", { style: listRowStyles.note, children: note }),
146
+ icon && /* @__PURE__ */ jsx("div", { style: listRowStyles.iconWrapper, children: /* @__PURE__ */ jsx(CaretIcon, { isHovered }) })
147
+ ] })
148
+ ] })
149
+ }
150
+ );
151
+ }
152
+ );
153
+ ListRow.displayName = "ListRow";
154
+
155
+ export {
156
+ ListRow
157
+ };
158
+ //# sourceMappingURL=chunk-F6JVEIWC.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ListRow/ListRow.tsx"],"sourcesContent":["import * as React from 'react';\nimport { clsx } from 'clsx';\n\nexport interface ListRowProps {\n /**\n * The main value/content text (required)\n */\n value: string;\n /**\n * Optional label text displayed on the left\n */\n label?: string;\n /**\n * Optional note text displayed on the right (italic)\n */\n note?: string;\n /**\n * Show the right arrow icon - enables hover state and indicates row is clickable\n * @default false\n */\n icon?: boolean;\n /**\n * Click handler - typically used with icon prop for navigation\n */\n onClick?: () => void;\n /**\n * Additional CSS class name\n */\n className?: string;\n /**\n * Additional inline styles\n */\n style?: React.CSSProperties;\n}\n\n// Caret/Arrow icon - transforms on hover\nconst CaretIcon = ({ isHovered }: { isHovered: boolean }) => {\n if (isHovered) {\n // Arrow pointing right on hover\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M6 4L10 8L6 12\"\n stroke=\"#2f2f2f\"\n strokeWidth=\"1.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n }\n // Default caret (chevron right)\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M6 4L10 8L6 12\"\n stroke=\"#b3b3b3\"\n strokeWidth=\"1.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\n// Arbor Design System list row styles\nconst listRowStyles = {\n container: {\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n borderBottom: '1px solid #f8f8f8',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n boxSizing: 'border-box' as const,\n borderRadius: '8px',\n transition: 'background-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out',\n outline: 'none',\n },\n containerHover: {\n backgroundColor: '#f8f8f8',\n },\n containerFocus: {\n outline: '3px solid #3cad51',\n outlineOffset: '-3px',\n },\n containerClickable: {\n cursor: 'pointer',\n },\n content: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n padding: '4px 8px',\n minHeight: '28px',\n },\n label: {\n fontSize: '13px',\n fontWeight: '600',\n color: '#2f2f2f',\n lineHeight: '1.5',\n width: '190px',\n flexShrink: 0,\n },\n valueContainer: {\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n },\n value: {\n fontSize: '13px',\n fontWeight: '400',\n color: '#2f2f2f',\n lineHeight: '1.5',\n },\n rightContainer: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: '8px',\n flexShrink: 0,\n },\n note: {\n fontSize: '13px',\n fontWeight: '400',\n fontStyle: 'italic',\n color: '#2f2f2f',\n lineHeight: '1.5',\n textAlign: 'right' as const,\n },\n iconWrapper: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '16px',\n height: '16px',\n flexShrink: 0,\n },\n};\n\n/**\n * ListRow component - Arbor Design System\n *\n * A flexible list row component for displaying content within sections.\n * Supports optional label, note, and icon props.\n * Hover state is only enabled when icon is present (indicating clickable row).\n *\n * @example\n * ```tsx\n * // Basic row with just value\n * <ListRow value=\"John Smith\" />\n *\n * // With label\n * <ListRow label=\"Name\" value=\"John Smith\" />\n *\n * // With label and note\n * <ListRow label=\"Name\" value=\"John Smith\" note=\"Primary contact\" />\n *\n * // Clickable row with icon\n * <ListRow\n * label=\"Name\"\n * value=\"John Smith\"\n * icon\n * onClick={() => navigate('/user/123')}\n * />\n *\n * // All props\n * <ListRow\n * label=\"Name\"\n * value=\"John Smith\"\n * note=\"View profile\"\n * icon\n * onClick={() => navigate('/user/123')}\n * />\n * ```\n */\nexport const ListRow = React.forwardRef<HTMLDivElement, ListRowProps>(\n ({ value, label, note, icon = false, onClick, className, style, ...props }, ref) => {\n const [isHovered, setIsHovered] = React.useState(false);\n const [isFocused, setIsFocused] = React.useState(false);\n\n // Only enable hover state when icon is present\n const showHoverState = icon && isHovered;\n const isClickable = icon && onClick;\n\n const containerStyle: React.CSSProperties = {\n ...listRowStyles.container,\n ...(showHoverState && listRowStyles.containerHover),\n ...(isFocused && listRowStyles.containerFocus),\n ...(isClickable && listRowStyles.containerClickable),\n ...style,\n };\n\n const handleClick = () => {\n if (isClickable && onClick) {\n onClick();\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (isClickable && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n onClick?.();\n }\n };\n\n return (\n <div\n ref={ref}\n className={clsx('arbor-list-row', className)}\n style={containerStyle}\n onClick={handleClick}\n onMouseEnter={() => icon && setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n onKeyDown={handleKeyDown}\n tabIndex={isClickable ? 0 : undefined}\n role={isClickable ? 'button' : undefined}\n {...props}\n >\n <div style={listRowStyles.content}>\n {label && <div style={listRowStyles.label}>{label}</div>}\n <div style={listRowStyles.valueContainer}>\n <span style={listRowStyles.value}>{value}</span>\n </div>\n <div style={listRowStyles.rightContainer}>\n {note && <span style={listRowStyles.note}>{note}</span>}\n {icon && (\n <div style={listRowStyles.iconWrapper}>\n <CaretIcon isHovered={isHovered} />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n }\n);\n\nListRow.displayName = 'ListRow';\n"],"mappings":"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","names":[]}