@tonyarbor/components 0.2.0 → 0.4.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 (140) hide show
  1. package/dist/Avatar.d.mts +42 -0
  2. package/dist/Avatar.d.ts +42 -0
  3. package/dist/Avatar.js +158 -0
  4. package/dist/Avatar.js.map +1 -0
  5. package/dist/Avatar.mjs +7 -0
  6. package/dist/Avatar.mjs.map +1 -0
  7. package/dist/Banner.d.mts +59 -0
  8. package/dist/Banner.d.ts +59 -0
  9. package/dist/Banner.js +222 -0
  10. package/dist/Banner.js.map +1 -0
  11. package/dist/Banner.mjs +7 -0
  12. package/dist/Banner.mjs.map +1 -0
  13. package/dist/Breadcrumbs.d.mts +51 -0
  14. package/dist/Breadcrumbs.d.ts +51 -0
  15. package/dist/Breadcrumbs.js +276 -0
  16. package/dist/Breadcrumbs.js.map +1 -0
  17. package/dist/Breadcrumbs.mjs +7 -0
  18. package/dist/Breadcrumbs.mjs.map +1 -0
  19. package/dist/Checkbox.d.mts +4 -0
  20. package/dist/Checkbox.d.ts +4 -0
  21. package/dist/Checkbox.js +45 -16
  22. package/dist/Checkbox.js.map +1 -1
  23. package/dist/Checkbox.mjs +1 -1
  24. package/dist/DatePicker.d.mts +68 -0
  25. package/dist/DatePicker.d.ts +68 -0
  26. package/dist/DatePicker.js +490 -0
  27. package/dist/DatePicker.js.map +1 -0
  28. package/dist/DatePicker.mjs +7 -0
  29. package/dist/DatePicker.mjs.map +1 -0
  30. package/dist/Pagination.d.mts +36 -0
  31. package/dist/Pagination.d.ts +36 -0
  32. package/dist/Pagination.js +301 -0
  33. package/dist/Pagination.js.map +1 -0
  34. package/dist/Pagination.mjs +7 -0
  35. package/dist/Pagination.mjs.map +1 -0
  36. package/dist/Radio.js +32 -12
  37. package/dist/Radio.js.map +1 -1
  38. package/dist/Radio.mjs +1 -1
  39. package/dist/SearchGlobal.d.mts +45 -0
  40. package/dist/SearchGlobal.d.ts +45 -0
  41. package/dist/SearchGlobal.js +209 -0
  42. package/dist/SearchGlobal.js.map +1 -0
  43. package/dist/SearchGlobal.mjs +7 -0
  44. package/dist/SearchGlobal.mjs.map +1 -0
  45. package/dist/SearchOnPage.d.mts +45 -0
  46. package/dist/SearchOnPage.d.ts +45 -0
  47. package/dist/SearchOnPage.js +171 -0
  48. package/dist/SearchOnPage.js.map +1 -0
  49. package/dist/SearchOnPage.mjs +7 -0
  50. package/dist/SearchOnPage.mjs.map +1 -0
  51. package/dist/Table.d.mts +80 -0
  52. package/dist/Table.d.ts +80 -0
  53. package/dist/Table.js +347 -0
  54. package/dist/Table.js.map +1 -0
  55. package/dist/Table.mjs +8 -0
  56. package/dist/Table.mjs.map +1 -0
  57. package/dist/TableControls.d.mts +76 -0
  58. package/dist/TableControls.d.ts +76 -0
  59. package/dist/TableControls.js +461 -0
  60. package/dist/TableControls.js.map +1 -0
  61. package/dist/TableControls.mjs +7 -0
  62. package/dist/TableControls.mjs.map +1 -0
  63. package/dist/TableFooterPagination.d.mts +56 -0
  64. package/dist/TableFooterPagination.d.ts +56 -0
  65. package/dist/TableFooterPagination.js +499 -0
  66. package/dist/TableFooterPagination.js.map +1 -0
  67. package/dist/TableFooterPagination.mjs +7 -0
  68. package/dist/TableFooterPagination.mjs.map +1 -0
  69. package/dist/Tabs.d.mts +50 -0
  70. package/dist/Tabs.d.ts +50 -0
  71. package/dist/Tabs.js +187 -0
  72. package/dist/Tabs.js.map +1 -0
  73. package/dist/Tabs.mjs +7 -0
  74. package/dist/Tabs.mjs.map +1 -0
  75. package/dist/TextArea.d.mts +64 -0
  76. package/dist/TextArea.d.ts +64 -0
  77. package/dist/TextArea.js +171 -0
  78. package/dist/TextArea.js.map +1 -0
  79. package/dist/TextArea.mjs +7 -0
  80. package/dist/TextArea.mjs.map +1 -0
  81. package/dist/Toast.d.mts +48 -0
  82. package/dist/Toast.d.ts +48 -0
  83. package/dist/Toast.js +169 -0
  84. package/dist/Toast.js.map +1 -0
  85. package/dist/Toast.mjs +7 -0
  86. package/dist/Toast.mjs.map +1 -0
  87. package/dist/Toggle.d.mts +48 -0
  88. package/dist/Toggle.d.ts +48 -0
  89. package/dist/Toggle.js +291 -0
  90. package/dist/Toggle.js.map +1 -0
  91. package/dist/Toggle.mjs +7 -0
  92. package/dist/Toggle.mjs.map +1 -0
  93. package/dist/Tooltip.d.mts +32 -0
  94. package/dist/Tooltip.d.ts +32 -0
  95. package/dist/Tooltip.js +109 -0
  96. package/dist/Tooltip.js.map +1 -0
  97. package/dist/Tooltip.mjs +7 -0
  98. package/dist/Tooltip.mjs.map +1 -0
  99. package/dist/chunk-52TG3BFX.mjs +463 -0
  100. package/dist/chunk-52TG3BFX.mjs.map +1 -0
  101. package/dist/chunk-AI2U34CF.mjs +159 -0
  102. package/dist/chunk-AI2U34CF.mjs.map +1 -0
  103. package/dist/chunk-B7RX3TPX.mjs +135 -0
  104. package/dist/chunk-B7RX3TPX.mjs.map +1 -0
  105. package/dist/chunk-C25FFMRQ.mjs +255 -0
  106. package/dist/chunk-C25FFMRQ.mjs.map +1 -0
  107. package/dist/{chunk-BCYJIUQX.mjs → chunk-CUTYEIFE.mjs} +47 -18
  108. package/dist/chunk-CUTYEIFE.mjs.map +1 -0
  109. package/dist/chunk-DULH2KRW.mjs +133 -0
  110. package/dist/chunk-DULH2KRW.mjs.map +1 -0
  111. package/dist/chunk-G5NVKF2G.mjs +434 -0
  112. package/dist/chunk-G5NVKF2G.mjs.map +1 -0
  113. package/dist/chunk-JSG27ZZS.mjs +122 -0
  114. package/dist/chunk-JSG27ZZS.mjs.map +1 -0
  115. package/dist/{chunk-ARBHNHO7.mjs → chunk-M6DVBEEL.mjs} +33 -13
  116. package/dist/chunk-M6DVBEEL.mjs.map +1 -0
  117. package/dist/chunk-MBUMR2XJ.mjs +135 -0
  118. package/dist/chunk-MBUMR2XJ.mjs.map +1 -0
  119. package/dist/chunk-MNH2TGUX.mjs +73 -0
  120. package/dist/chunk-MNH2TGUX.mjs.map +1 -0
  121. package/dist/chunk-RQP6ZGD7.mjs +240 -0
  122. package/dist/chunk-RQP6ZGD7.mjs.map +1 -0
  123. package/dist/chunk-RRMG2SSZ.mjs +265 -0
  124. package/dist/chunk-RRMG2SSZ.mjs.map +1 -0
  125. package/dist/chunk-U4JXKZZG.mjs +186 -0
  126. package/dist/chunk-U4JXKZZG.mjs.map +1 -0
  127. package/dist/chunk-UPBHDBAK.mjs +173 -0
  128. package/dist/chunk-UPBHDBAK.mjs.map +1 -0
  129. package/dist/chunk-W55QJIAN.mjs +467 -0
  130. package/dist/chunk-W55QJIAN.mjs.map +1 -0
  131. package/dist/chunk-YV4OXFIM.mjs +151 -0
  132. package/dist/chunk-YV4OXFIM.mjs.map +1 -0
  133. package/dist/index.d.mts +15 -0
  134. package/dist/index.d.ts +15 -0
  135. package/dist/index.js +3414 -30
  136. package/dist/index.js.map +1 -1
  137. package/dist/index.mjs +63 -3
  138. package/package.json +78 -1
  139. package/dist/chunk-ARBHNHO7.mjs.map +0 -1
  140. package/dist/chunk-BCYJIUQX.mjs.map +0 -1
@@ -3,10 +3,10 @@ import * as React from "react";
3
3
  import { clsx } from "clsx";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  var radioStyles = {
6
- width: "20px",
7
- height: "20px",
8
- border: "2px solid #d1d1d1",
9
- // grey-300
6
+ width: "16px",
7
+ height: "16px",
8
+ border: "1px solid #7e7e7e",
9
+ // grey-500
10
10
  borderRadius: "50%",
11
11
  display: "flex",
12
12
  alignItems: "center",
@@ -17,17 +17,29 @@ var radioStyles = {
17
17
  backgroundColor: "#ffffff"
18
18
  };
19
19
  var checkedStyles = {
20
- borderColor: "#3cad51"
21
- // brand-500
20
+ border: "1px solid #0e8a0e"
21
+ // brand-600
22
+ };
23
+ var checkedHoverStyles = {
24
+ border: "1px solid #005700"
25
+ // brand-800
26
+ };
27
+ var uncheckedHoverStyles = {
28
+ border: "1px solid #2f2f2f"
29
+ // grey-900
22
30
  };
23
31
  var innerDotStyles = {
24
32
  width: "10px",
25
33
  height: "10px",
26
34
  borderRadius: "50%",
27
- backgroundColor: "#3cad51",
28
- // brand-500
35
+ backgroundColor: "#0e8a0e",
36
+ // brand-600
29
37
  transition: "all 0.2s ease-in-out"
30
38
  };
39
+ var innerDotHoverStyles = {
40
+ backgroundColor: "#005700"
41
+ // brand-800
42
+ };
31
43
  var labelStyles = {
32
44
  fontSize: "13px",
33
45
  color: "#2f2f2f",
@@ -53,6 +65,7 @@ var Radio = React.forwardRef(
53
65
  value
54
66
  }, ref) => {
55
67
  const [isFocused, setIsFocused] = React.useState(false);
68
+ const [isHovered, setIsHovered] = React.useState(false);
56
69
  const radioId = React.useId();
57
70
  const handleChange = (e) => {
58
71
  if (!disabled) {
@@ -62,13 +75,18 @@ var Radio = React.forwardRef(
62
75
  const circleStyle = {
63
76
  ...radioStyles,
64
77
  ...checked && !disabled && checkedStyles,
65
- ...disabled && !checked && { backgroundColor: "#f8f8f8", borderColor: "#efefef" },
66
- ...disabled && checked && { borderColor: "#7e7e7e" },
67
- ...isFocused && !disabled && { borderColor: "#3cad51", outline: "2px solid rgba(60, 173, 81, 0.2)" }
78
+ ...isHovered && !disabled && !checked && uncheckedHoverStyles,
79
+ ...isHovered && !disabled && checked && checkedHoverStyles,
80
+ ...disabled && !checked && { backgroundColor: "#efefef", border: "1px solid #7e7e7e" },
81
+ ...disabled && checked && { backgroundColor: "#efefef", border: "1px solid #7e7e7e" },
82
+ ...isFocused && !disabled && {
83
+ boxShadow: "0px 0px 0px 3px #3cad51"
84
+ }
68
85
  };
69
86
  const dotStyle = {
70
87
  ...innerDotStyles,
71
- backgroundColor: disabled ? "#7e7e7e" : "#3cad51"
88
+ ...isHovered && !disabled && innerDotHoverStyles,
89
+ ...disabled && { backgroundColor: "#7e7e7e" }
72
90
  };
73
91
  return /* @__PURE__ */ jsxs(
74
92
  "div",
@@ -103,6 +121,8 @@ var Radio = React.forwardRef(
103
121
  "label",
104
122
  {
105
123
  htmlFor: radioId,
124
+ onMouseEnter: () => !disabled && setIsHovered(true),
125
+ onMouseLeave: () => !disabled && setIsHovered(false),
106
126
  style: {
107
127
  display: "flex",
108
128
  alignItems: "center",
@@ -135,4 +155,4 @@ Radio.displayName = "Radio";
135
155
  export {
136
156
  Radio
137
157
  };
138
- //# sourceMappingURL=chunk-ARBHNHO7.mjs.map
158
+ //# sourceMappingURL=chunk-M6DVBEEL.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Radio/Radio.tsx"],"sourcesContent":["import * as React from 'react';\nimport { clsx } from 'clsx';\n\nexport interface RadioProps {\n /**\n * The label for the radio button\n */\n label?: string;\n /**\n * Whether the radio is selected\n */\n checked?: boolean;\n /**\n * Callback when selection changes\n */\n onChange?: (checked: boolean) => void;\n /**\n * Whether the radio is disabled\n */\n disabled?: boolean;\n /**\n * Custom className\n */\n className?: string;\n /**\n * Custom style\n */\n style?: React.CSSProperties;\n /**\n * Test ID for testing\n */\n 'data-testid'?: string;\n /**\n * Name attribute for form submission (groups radios together)\n */\n name?: string;\n /**\n * Value attribute for form submission\n */\n value?: string;\n}\n\nconst radioStyles: React.CSSProperties = {\n width: '16px',\n height: '16px',\n border: '1px solid #7e7e7e', // grey-500\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n transition: 'all 0.2s ease-in-out',\n flexShrink: 0,\n backgroundColor: '#ffffff',\n};\n\nconst checkedStyles: React.CSSProperties = {\n border: '1px solid #0e8a0e', // brand-600\n};\n\nconst checkedHoverStyles: React.CSSProperties = {\n border: '1px solid #005700', // brand-800\n};\n\nconst uncheckedHoverStyles: React.CSSProperties = {\n border: '1px solid #2f2f2f', // grey-900\n};\n\nconst innerDotStyles: React.CSSProperties = {\n width: '10px',\n height: '10px',\n borderRadius: '50%',\n backgroundColor: '#0e8a0e', // brand-600\n transition: 'all 0.2s ease-in-out',\n};\n\nconst innerDotHoverStyles: React.CSSProperties = {\n backgroundColor: '#005700', // brand-800\n};\n\nconst labelStyles: React.CSSProperties = {\n fontSize: '13px',\n color: '#2f2f2f',\n cursor: 'pointer',\n userSelect: 'none' as const,\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n};\n\nconst wrapperStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n};\n\n/**\n * Radio component - Arbor Design System\n *\n * A radio button input with label support.\n */\nexport const Radio = React.forwardRef<HTMLInputElement, RadioProps>(\n (\n {\n label,\n checked = false,\n onChange,\n disabled = false,\n className,\n style,\n 'data-testid': dataTestId,\n name,\n value,\n },\n ref\n ) => {\n const [isFocused, setIsFocused] = React.useState(false);\n const [isHovered, setIsHovered] = React.useState(false);\n const radioId = React.useId();\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!disabled) {\n onChange?.(e.target.checked);\n }\n };\n\n const circleStyle: React.CSSProperties = {\n ...radioStyles,\n ...(checked && !disabled && checkedStyles),\n ...(isHovered && !disabled && !checked && uncheckedHoverStyles),\n ...(isHovered && !disabled && checked && checkedHoverStyles),\n ...(disabled && !checked && { backgroundColor: '#efefef', border: '1px solid #7e7e7e' }),\n ...(disabled && checked && { backgroundColor: '#efefef', border: '1px solid #7e7e7e' }),\n ...(isFocused && !disabled && {\n boxShadow: '0px 0px 0px 3px #3cad51',\n }),\n };\n\n const dotStyle: React.CSSProperties = {\n ...innerDotStyles,\n ...(isHovered && !disabled && innerDotHoverStyles),\n ...(disabled && { backgroundColor: '#7e7e7e' }),\n };\n\n return (\n <div\n className={clsx('arbor-radio-wrapper', className)}\n style={{ ...wrapperStyles, ...style }}\n data-testid={dataTestId}\n >\n <input\n ref={ref}\n id={radioId}\n type=\"radio\"\n checked={checked}\n onChange={handleChange}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n disabled={disabled}\n name={name}\n value={value}\n style={{\n position: 'absolute',\n opacity: 0,\n width: 0,\n height: 0,\n }}\n aria-checked={checked}\n />\n <label\n htmlFor={radioId}\n onMouseEnter={() => !disabled && setIsHovered(true)}\n onMouseLeave={() => !disabled && setIsHovered(false)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n }}\n >\n <div style={circleStyle}>\n {checked && <div style={dotStyle} />}\n </div>\n {label && (\n <span\n style={{\n ...labelStyles,\n color: disabled ? '#7e7e7e' : '#2f2f2f',\n cursor: disabled ? 'not-allowed' : 'pointer',\n }}\n >\n {label}\n </span>\n )}\n </label>\n </div>\n );\n }\n);\n\nRadio.displayName = 'Radio';\n"],"mappings":"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","names":[]}
@@ -0,0 +1,135 @@
1
+ // src/TextArea/TextArea.tsx
2
+ import * as React from "react";
3
+ import { clsx } from "clsx";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ var labelStyles = {
6
+ fontSize: "13px",
7
+ fontWeight: 600,
8
+ color: "#2f2f2f",
9
+ marginBottom: "0px",
10
+ display: "block",
11
+ fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
12
+ };
13
+ var textareaWrapperStyles = {
14
+ position: "relative",
15
+ width: "100%"
16
+ };
17
+ var textareaStyles = {
18
+ width: "100%",
19
+ minHeight: "72px",
20
+ padding: "8px",
21
+ fontSize: "13px",
22
+ fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
23
+ border: "1px solid",
24
+ borderRadius: "8px",
25
+ outline: "none",
26
+ resize: "vertical",
27
+ transition: "all 0.2s ease-in-out",
28
+ lineHeight: "1.5"
29
+ };
30
+ var helperTextStyles = {
31
+ fontSize: "13px",
32
+ marginTop: "4px",
33
+ fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
34
+ };
35
+ var TextArea = React.forwardRef(
36
+ ({
37
+ label,
38
+ placeholder,
39
+ value,
40
+ onChange,
41
+ state = "default",
42
+ error,
43
+ helperText,
44
+ disabled = false,
45
+ rows = 3,
46
+ className,
47
+ style,
48
+ "data-testid": dataTestId,
49
+ name
50
+ }, ref) => {
51
+ const [isFocused, setIsFocused] = React.useState(false);
52
+ const [isHovered, setIsHovered] = React.useState(false);
53
+ const textareaId = React.useId();
54
+ const actualState = error ? "error" : state;
55
+ const getBorderColor = () => {
56
+ if (disabled) {
57
+ return "#dfdfdf";
58
+ }
59
+ if (actualState === "error") {
60
+ return "#c93232";
61
+ }
62
+ if (actualState === "success") {
63
+ return "#0e8a0e";
64
+ }
65
+ if (isFocused) {
66
+ return "#0e8a0e";
67
+ }
68
+ if (isHovered) {
69
+ return "#7e7e7e";
70
+ }
71
+ return "#dfdfdf";
72
+ };
73
+ const getBackgroundColor = () => {
74
+ if (disabled) {
75
+ return "#efefef";
76
+ }
77
+ return "#ffffff";
78
+ };
79
+ const getBoxShadow = () => {
80
+ if (isFocused && !disabled) {
81
+ if (actualState === "error") {
82
+ return "0px 0px 0px 3px rgba(201, 50, 50, 0.2)";
83
+ }
84
+ return "0px 0px 0px 3px #3cad51";
85
+ }
86
+ return void 0;
87
+ };
88
+ const textareaStylesCombined = {
89
+ ...textareaStyles,
90
+ borderColor: getBorderColor(),
91
+ backgroundColor: getBackgroundColor(),
92
+ boxShadow: getBoxShadow(),
93
+ color: disabled ? "#7e7e7e" : "#2f2f2f",
94
+ cursor: disabled ? "not-allowed" : "text"
95
+ };
96
+ const helperColor = error ? "#c93232" : actualState === "success" ? "#0e8a0e" : "#595959";
97
+ return /* @__PURE__ */ jsxs(
98
+ "div",
99
+ {
100
+ className: clsx("arbor-textarea-wrapper", className),
101
+ style,
102
+ "data-testid": dataTestId,
103
+ children: [
104
+ label && /* @__PURE__ */ jsx("label", { htmlFor: textareaId, style: labelStyles, children: label }),
105
+ label && /* @__PURE__ */ jsx("div", { style: { height: "8px" } }),
106
+ /* @__PURE__ */ jsx("div", { style: textareaWrapperStyles, children: /* @__PURE__ */ jsx(
107
+ "textarea",
108
+ {
109
+ ref,
110
+ id: textareaId,
111
+ name,
112
+ placeholder,
113
+ value,
114
+ onChange,
115
+ disabled,
116
+ rows,
117
+ onFocus: () => setIsFocused(true),
118
+ onBlur: () => setIsFocused(false),
119
+ onMouseEnter: () => setIsHovered(true),
120
+ onMouseLeave: () => setIsHovered(false),
121
+ style: textareaStylesCombined
122
+ }
123
+ ) }),
124
+ (error || helperText) && /* @__PURE__ */ jsx("div", { style: { ...helperTextStyles, color: helperColor }, role: error ? "alert" : void 0, children: error || helperText })
125
+ ]
126
+ }
127
+ );
128
+ }
129
+ );
130
+ TextArea.displayName = "TextArea";
131
+
132
+ export {
133
+ TextArea
134
+ };
135
+ //# sourceMappingURL=chunk-MBUMR2XJ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/TextArea/TextArea.tsx"],"sourcesContent":["import * as React from 'react';\nimport { clsx } from 'clsx';\n\nexport interface TextAreaProps {\n /**\n * The label for the textarea\n */\n label?: string;\n /**\n * Placeholder text\n */\n placeholder?: string;\n /**\n * Current value\n */\n value?: string;\n /**\n * Change handler\n */\n onChange?: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;\n /**\n * Validation state - affects border color\n */\n state?: 'default' | 'success' | 'error';\n /**\n * Error message (implies error state)\n */\n error?: string;\n /**\n * Helper text shown below input\n */\n helperText?: string;\n /**\n * Whether the textarea is disabled\n */\n disabled?: boolean;\n /**\n * Number of rows (affects height)\n */\n rows?: number;\n /**\n * Custom className\n */\n className?: string;\n /**\n * Custom style\n */\n style?: React.CSSProperties;\n /**\n * Test ID for testing\n */\n 'data-testid'?: string;\n /**\n * Name attribute for form submission\n */\n name?: string;\n}\n\nconst labelStyles: React.CSSProperties = {\n fontSize: '13px',\n fontWeight: 600,\n color: '#2f2f2f',\n marginBottom: '0px',\n display: 'block',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n};\n\nconst textareaWrapperStyles: React.CSSProperties = {\n position: 'relative',\n width: '100%',\n};\n\nconst textareaStyles: React.CSSProperties = {\n width: '100%',\n minHeight: '72px',\n padding: '8px',\n fontSize: '13px',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n border: '1px solid',\n borderRadius: '8px',\n outline: 'none',\n resize: 'vertical',\n transition: 'all 0.2s ease-in-out',\n lineHeight: '1.5',\n};\n\nconst helperTextStyles: React.CSSProperties = {\n fontSize: '13px',\n marginTop: '4px',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n};\n\n/**\n * TextArea component - Arbor Design System\n *\n * A multi-line text input with label, helper text, and validation states.\n */\nexport const TextArea = React.forwardRef<HTMLTextAreaElement, TextAreaProps>(\n (\n {\n label,\n placeholder,\n value,\n onChange,\n state = 'default',\n error,\n helperText,\n disabled = false,\n rows = 3,\n className,\n style,\n 'data-testid': dataTestId,\n name,\n },\n ref\n ) => {\n const [isFocused, setIsFocused] = React.useState(false);\n const [isHovered, setIsHovered] = React.useState(false);\n const textareaId = React.useId();\n\n // Determine the actual state (error overrides state prop)\n const actualState = error ? 'error' : state;\n\n // Get border color based on state and interactions\n const getBorderColor = (): string => {\n if (disabled) {\n return '#dfdfdf';\n }\n\n if (actualState === 'error') {\n return '#c93232';\n }\n\n if (actualState === 'success') {\n return '#0e8a0e';\n }\n\n if (isFocused) {\n return '#0e8a0e';\n }\n\n if (isHovered) {\n return '#7e7e7e';\n }\n\n return '#dfdfdf';\n };\n\n // Get background color\n const getBackgroundColor = (): string => {\n if (disabled) {\n return '#efefef';\n }\n return '#ffffff';\n };\n\n // Get box shadow (focus ring)\n const getBoxShadow = (): string | undefined => {\n if (isFocused && !disabled) {\n if (actualState === 'error') {\n return '0px 0px 0px 3px rgba(201, 50, 50, 0.2)';\n }\n return '0px 0px 0px 3px #3cad51';\n }\n return undefined;\n };\n\n const textareaStylesCombined: React.CSSProperties = {\n ...textareaStyles,\n borderColor: getBorderColor(),\n backgroundColor: getBackgroundColor(),\n boxShadow: getBoxShadow(),\n color: disabled ? '#7e7e7e' : '#2f2f2f',\n cursor: disabled ? 'not-allowed' : 'text',\n };\n\n const helperColor = error ? '#c93232' : actualState === 'success' ? '#0e8a0e' : '#595959';\n\n return (\n <div\n className={clsx('arbor-textarea-wrapper', className)}\n style={style}\n data-testid={dataTestId}\n >\n {label && (\n <label htmlFor={textareaId} style={labelStyles}>\n {label}\n </label>\n )}\n {label && <div style={{ height: '8px' }} />}\n <div style={textareaWrapperStyles}>\n <textarea\n ref={ref}\n id={textareaId}\n name={name}\n placeholder={placeholder}\n value={value}\n onChange={onChange}\n disabled={disabled}\n rows={rows}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n style={textareaStylesCombined}\n />\n </div>\n {(error || helperText) && (\n <div style={{ ...helperTextStyles, color: helperColor }} role={error ? 'alert' : undefined}>\n {error || helperText}\n </div>\n )}\n </div>\n );\n }\n);\n\nTextArea.displayName = 'TextArea';\n"],"mappings":"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","names":[]}
@@ -0,0 +1,73 @@
1
+ // src/Tooltip/Tooltip.tsx
2
+ import * as React from "react";
3
+ import { clsx } from "clsx";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ var tooltipStyles = {
6
+ position: "absolute",
7
+ bottom: "calc(100% + 8px)",
8
+ left: "50%",
9
+ transform: "translateX(-50%)",
10
+ backgroundColor: "#2f2f2f",
11
+ color: "#ffffff",
12
+ padding: "12px",
13
+ borderRadius: "8px",
14
+ boxShadow: "0px 4px 12px 0px rgba(32, 32, 32, 0.08)",
15
+ fontSize: "13px",
16
+ fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
17
+ fontWeight: 400,
18
+ lineHeight: 1.5,
19
+ whiteSpace: "nowrap",
20
+ pointerEvents: "none",
21
+ zIndex: 1e3,
22
+ opacity: 0,
23
+ transition: "opacity 0.2s ease-in-out"
24
+ };
25
+ var wrapperStyles = {
26
+ position: "relative",
27
+ display: "inline-block"
28
+ };
29
+ var Tooltip = React.forwardRef(
30
+ ({
31
+ content,
32
+ children,
33
+ className,
34
+ style,
35
+ "data-testid": dataTestId
36
+ }, ref) => {
37
+ const [isVisible, setIsVisible] = React.useState(false);
38
+ const visibleTooltipStyles = {
39
+ ...tooltipStyles,
40
+ opacity: isVisible ? 1 : 0,
41
+ ...style
42
+ };
43
+ return /* @__PURE__ */ jsxs(
44
+ "div",
45
+ {
46
+ ref,
47
+ style: wrapperStyles,
48
+ onMouseEnter: () => setIsVisible(true),
49
+ onMouseLeave: () => setIsVisible(false),
50
+ "data-testid": dataTestId,
51
+ children: [
52
+ children,
53
+ /* @__PURE__ */ jsx(
54
+ "div",
55
+ {
56
+ className: clsx("arbor-tooltip", className),
57
+ style: visibleTooltipStyles,
58
+ role: "tooltip",
59
+ "aria-hidden": !isVisible,
60
+ children: content
61
+ }
62
+ )
63
+ ]
64
+ }
65
+ );
66
+ }
67
+ );
68
+ Tooltip.displayName = "Tooltip";
69
+
70
+ export {
71
+ Tooltip
72
+ };
73
+ //# sourceMappingURL=chunk-MNH2TGUX.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Tooltip/Tooltip.tsx"],"sourcesContent":["import * as React from 'react';\nimport { clsx } from 'clsx';\n\nexport interface TooltipProps {\n /**\n * The content to display in the tooltip\n */\n content: string;\n /**\n * The trigger element that shows the tooltip on hover\n */\n children: React.ReactNode;\n /**\n * Custom className\n */\n className?: string;\n /**\n * Custom style\n */\n style?: React.CSSProperties;\n /**\n * Test ID for testing\n */\n 'data-testid'?: string;\n}\n\nconst tooltipStyles: React.CSSProperties = {\n position: 'absolute',\n bottom: 'calc(100% + 8px)',\n left: '50%',\n transform: 'translateX(-50%)',\n backgroundColor: '#2f2f2f',\n color: '#ffffff',\n padding: '12px',\n borderRadius: '8px',\n boxShadow: '0px 4px 12px 0px rgba(32, 32, 32, 0.08)',\n fontSize: '13px',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n fontWeight: 400,\n lineHeight: 1.5,\n whiteSpace: 'nowrap',\n pointerEvents: 'none',\n zIndex: 1000,\n opacity: 0,\n transition: 'opacity 0.2s ease-in-out',\n};\n\nconst wrapperStyles: React.CSSProperties = {\n position: 'relative',\n display: 'inline-block',\n};\n\n/**\n * Tooltip component - Arbor Design System\n *\n * A tooltip that appears on hover over a trigger element.\n */\nexport const Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(\n (\n {\n content,\n children,\n className,\n style,\n 'data-testid': dataTestId,\n },\n ref\n ) => {\n const [isVisible, setIsVisible] = React.useState(false);\n\n const visibleTooltipStyles: React.CSSProperties = {\n ...tooltipStyles,\n opacity: isVisible ? 1 : 0,\n ...style,\n };\n\n return (\n <div\n ref={ref}\n style={wrapperStyles}\n onMouseEnter={() => setIsVisible(true)}\n onMouseLeave={() => setIsVisible(false)}\n data-testid={dataTestId}\n >\n {children}\n <div\n className={clsx('arbor-tooltip', className)}\n style={visibleTooltipStyles}\n role=\"tooltip\"\n aria-hidden={!isVisible}\n >\n {content}\n </div>\n </div>\n );\n }\n);\n\nTooltip.displayName = 'Tooltip';\n"],"mappings":";AAAA,YAAY,WAAW;AACvB,SAAS,YAAY;AA4Ef,SAQE,KARF;AAnDN,IAAM,gBAAqC;AAAA,EACzC,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,SAAS;AAAA,EACT,cAAc;AAAA,EACd,WAAW;AAAA,EACX,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,YAAY;AACd;AAEA,IAAM,gBAAqC;AAAA,EACzC,UAAU;AAAA,EACV,SAAS;AACX;AAOO,IAAM,UAAgB;AAAA,EAC3B,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,EACjB,GACA,QACG;AACH,UAAM,CAAC,WAAW,YAAY,IAAU,eAAS,KAAK;AAEtD,UAAM,uBAA4C;AAAA,MAChD,GAAG;AAAA,MACH,SAAS,YAAY,IAAI;AAAA,MACzB,GAAG;AAAA,IACL;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,OAAO;AAAA,QACP,cAAc,MAAM,aAAa,IAAI;AAAA,QACrC,cAAc,MAAM,aAAa,KAAK;AAAA,QACtC,eAAa;AAAA,QAEZ;AAAA;AAAA,UACD;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,KAAK,iBAAiB,SAAS;AAAA,cAC1C,OAAO;AAAA,cACP,MAAK;AAAA,cACL,eAAa,CAAC;AAAA,cAEb;AAAA;AAAA,UACH;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,QAAQ,cAAc;","names":[]}
@@ -0,0 +1,240 @@
1
+ // src/Breadcrumbs/Breadcrumbs.tsx
2
+ import * as React from "react";
3
+ import { Link, ChevronDown, MoreHorizontal } from "lucide-react";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ var Breadcrumbs = React.forwardRef(
6
+ ({
7
+ items,
8
+ onCopy,
9
+ className,
10
+ style,
11
+ "data-testid": dataTestId
12
+ }, ref) => {
13
+ const [hoveredIndex, setHoveredIndex] = React.useState(null);
14
+ const [focusedIndex, setFocusedIndex] = React.useState(null);
15
+ const [showCopyTooltip, setShowCopyTooltip] = React.useState(false);
16
+ const [ellipsisFocused, setEllipsisFocused] = React.useState(false);
17
+ const [ellipsisHovered, setEllipsisHovered] = React.useState(false);
18
+ const displayItems = React.useMemo(() => {
19
+ if (items.length > 6) {
20
+ return [items[0], { label: "...", isEllipsis: true }, items[items.length - 1]];
21
+ }
22
+ return items;
23
+ }, [items]);
24
+ const handleCopy = () => {
25
+ onCopy?.();
26
+ const trail = items.map((item) => item.label).join(" / ");
27
+ navigator.clipboard.writeText(trail);
28
+ };
29
+ const containerStyles = {
30
+ display: "flex",
31
+ alignItems: "center",
32
+ gap: "8px",
33
+ ...style
34
+ };
35
+ const breadcrumbItemStyles = (index, isActive, isEllipsis) => {
36
+ const isFocused = focusedIndex === index;
37
+ if (isEllipsis) {
38
+ return {
39
+ display: "flex",
40
+ alignItems: "center",
41
+ gap: "4px",
42
+ height: "24px",
43
+ overflow: "hidden"
44
+ };
45
+ }
46
+ return {
47
+ display: "flex",
48
+ alignItems: "center",
49
+ gap: "4px",
50
+ height: "24px",
51
+ overflow: "hidden",
52
+ backgroundColor: isFocused ? "rgba(255, 255, 255, 0.01)" : "transparent",
53
+ borderRadius: "99px",
54
+ boxShadow: isFocused ? "0px 0px 0px 3px #3cad51" : "none",
55
+ padding: isFocused ? "0 6px" : "0 2px",
56
+ margin: isFocused ? "0" : "0 4px",
57
+ cursor: isActive ? "default" : "pointer",
58
+ textDecoration: "none"
59
+ };
60
+ };
61
+ const linkStyles = (isActive, isHovered) => ({
62
+ fontFamily: isActive ? "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif" : "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
63
+ fontSize: "13px",
64
+ fontWeight: isActive ? 600 : 400,
65
+ color: isActive ? isHovered ? "#0e8a0e" : "#2f2f2f" : isHovered ? "#0e8a0e" : "#595959",
66
+ lineHeight: "1.5",
67
+ whiteSpace: "nowrap"
68
+ });
69
+ const dividerStyles = {
70
+ fontFamily: "'PT Sans', sans-serif",
71
+ fontSize: "14px",
72
+ color: "#595959",
73
+ lineHeight: "normal",
74
+ whiteSpace: "nowrap"
75
+ };
76
+ const ellipsisButtonStyles = {
77
+ display: "flex",
78
+ alignItems: "center",
79
+ justifyContent: "center",
80
+ width: "24px",
81
+ height: "24px",
82
+ borderRadius: "99px",
83
+ border: "none",
84
+ background: "transparent",
85
+ cursor: "pointer",
86
+ backgroundColor: ellipsisFocused ? "rgba(255, 255, 255, 0.01)" : ellipsisHovered ? "#efefef" : "transparent",
87
+ boxShadow: ellipsisFocused ? "0px 0px 0px 3px #3cad51" : "none"
88
+ };
89
+ const copyButtonStyles = {
90
+ display: "flex",
91
+ alignItems: "center",
92
+ justifyContent: "center",
93
+ width: "24px",
94
+ height: "24px",
95
+ borderRadius: "99px",
96
+ border: "none",
97
+ background: showCopyTooltip ? "#efefef" : "transparent",
98
+ cursor: "pointer",
99
+ position: "relative"
100
+ };
101
+ const tooltipStyles = {
102
+ position: "absolute",
103
+ top: "100%",
104
+ left: "50%",
105
+ transform: "translateX(-50%)",
106
+ marginTop: "8px",
107
+ backgroundColor: "#2f2f2f",
108
+ color: "white",
109
+ padding: "12px",
110
+ borderRadius: "8px",
111
+ fontSize: "13px",
112
+ fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
113
+ fontWeight: 400,
114
+ lineHeight: "1.5",
115
+ whiteSpace: "nowrap",
116
+ boxShadow: "0px 4px 12px rgba(32, 32, 32, 0.08)",
117
+ zIndex: 1e3
118
+ };
119
+ return /* @__PURE__ */ jsx(
120
+ "div",
121
+ {
122
+ ref,
123
+ className,
124
+ style: containerStyles,
125
+ "data-testid": dataTestId,
126
+ children: displayItems.map((item, index) => {
127
+ const isActive = index === displayItems.length - 1;
128
+ const isEllipsis = "isEllipsis" in item && item.isEllipsis;
129
+ if (isEllipsis) {
130
+ return /* @__PURE__ */ jsxs(React.Fragment, { children: [
131
+ /* @__PURE__ */ jsx(
132
+ "button",
133
+ {
134
+ style: ellipsisButtonStyles,
135
+ onFocus: () => setEllipsisFocused(true),
136
+ onBlur: () => setEllipsisFocused(false),
137
+ onMouseEnter: () => setEllipsisHovered(true),
138
+ onMouseLeave: () => setEllipsisHovered(false),
139
+ "aria-label": "More breadcrumbs",
140
+ children: /* @__PURE__ */ jsx(
141
+ MoreHorizontal,
142
+ {
143
+ size: 12,
144
+ color: "#2f2f2f",
145
+ strokeWidth: 2,
146
+ style: { display: "block", flexShrink: 0 }
147
+ }
148
+ )
149
+ }
150
+ ),
151
+ /* @__PURE__ */ jsx("span", { style: dividerStyles, children: " /" })
152
+ ] }, `ellipsis-${index}`);
153
+ }
154
+ const breadcrumbItem = item;
155
+ if (isActive) {
156
+ return /* @__PURE__ */ jsxs(React.Fragment, { children: [
157
+ /* @__PURE__ */ jsx(
158
+ "div",
159
+ {
160
+ style: breadcrumbItemStyles(index, true),
161
+ onMouseEnter: () => setHoveredIndex(index),
162
+ onMouseLeave: () => setHoveredIndex(null),
163
+ onFocus: () => setFocusedIndex(index),
164
+ onBlur: () => setFocusedIndex(null),
165
+ tabIndex: 0,
166
+ children: /* @__PURE__ */ jsx("span", { style: linkStyles(true, hoveredIndex === index), children: breadcrumbItem.label })
167
+ }
168
+ ),
169
+ onCopy && /* @__PURE__ */ jsxs(
170
+ "button",
171
+ {
172
+ style: copyButtonStyles,
173
+ onClick: handleCopy,
174
+ onMouseEnter: () => setShowCopyTooltip(true),
175
+ onMouseLeave: () => setShowCopyTooltip(false),
176
+ "aria-label": "Copy breadcrumb trail",
177
+ children: [
178
+ /* @__PURE__ */ jsx(
179
+ Link,
180
+ {
181
+ size: 12,
182
+ color: "#2f2f2f",
183
+ strokeWidth: 2,
184
+ style: { display: "block", flexShrink: 0 }
185
+ }
186
+ ),
187
+ showCopyTooltip && /* @__PURE__ */ jsx("div", { style: tooltipStyles, children: "Copy breadcrumb trail" })
188
+ ]
189
+ }
190
+ )
191
+ ] }, index);
192
+ }
193
+ const Element = breadcrumbItem.href ? "a" : "button";
194
+ return /* @__PURE__ */ jsxs(React.Fragment, { children: [
195
+ /* @__PURE__ */ jsxs(
196
+ Element,
197
+ {
198
+ ...breadcrumbItem.href ? { href: breadcrumbItem.href } : {},
199
+ style: {
200
+ ...breadcrumbItemStyles(index, false),
201
+ border: "none",
202
+ background: "transparent"
203
+ },
204
+ onClick: (e) => {
205
+ if (!breadcrumbItem.href && breadcrumbItem.onClick) {
206
+ e.preventDefault();
207
+ breadcrumbItem.onClick();
208
+ }
209
+ },
210
+ onMouseEnter: () => setHoveredIndex(index),
211
+ onMouseLeave: () => setHoveredIndex(null),
212
+ onFocus: () => setFocusedIndex(index),
213
+ onBlur: () => setFocusedIndex(null),
214
+ children: [
215
+ /* @__PURE__ */ jsx("span", { style: linkStyles(false, hoveredIndex === index), children: breadcrumbItem.label }),
216
+ breadcrumbItem.hasDropdown && /* @__PURE__ */ jsx(
217
+ ChevronDown,
218
+ {
219
+ size: 12,
220
+ color: hoveredIndex === index ? "#0e8a0e" : "#595959",
221
+ strokeWidth: 2,
222
+ style: { marginLeft: "2px", display: "inline-block", flexShrink: 0 }
223
+ }
224
+ )
225
+ ]
226
+ }
227
+ ),
228
+ /* @__PURE__ */ jsx("span", { style: dividerStyles, children: " /" })
229
+ ] }, index);
230
+ })
231
+ }
232
+ );
233
+ }
234
+ );
235
+ Breadcrumbs.displayName = "Breadcrumbs";
236
+
237
+ export {
238
+ Breadcrumbs
239
+ };
240
+ //# sourceMappingURL=chunk-RQP6ZGD7.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Breadcrumbs/Breadcrumbs.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Link, ChevronDown, MoreHorizontal } from 'lucide-react';\n\nexport interface BreadcrumbItem {\n /**\n * The label to display for this breadcrumb\n */\n label: string;\n /**\n * Optional href for the breadcrumb link\n */\n href?: string;\n /**\n * Optional click handler\n */\n onClick?: () => void;\n /**\n * Whether this breadcrumb has a dropdown menu\n */\n hasDropdown?: boolean;\n}\n\nexport interface BreadcrumbsProps {\n /**\n * Array of breadcrumb items\n */\n items: BreadcrumbItem[];\n /**\n * Callback when copy button is clicked\n */\n onCopy?: () => void;\n /**\n * Custom className\n */\n className?: string;\n /**\n * Custom style\n */\n style?: React.CSSProperties;\n /**\n * Test ID for testing\n */\n 'data-testid'?: string;\n}\n\n/**\n * Breadcrumbs component - Arbor Design System\n *\n * Navigation component showing the current page's location in the site hierarchy.\n * Automatically truncates to show first and last breadcrumb with ellipsis when more than 6 items.\n */\nexport const Breadcrumbs = React.forwardRef<HTMLDivElement, BreadcrumbsProps>(\n (\n {\n items,\n onCopy,\n className,\n style,\n 'data-testid': dataTestId,\n },\n ref\n ) => {\n const [hoveredIndex, setHoveredIndex] = React.useState<number | null>(null);\n const [focusedIndex, setFocusedIndex] = React.useState<number | null>(null);\n const [showCopyTooltip, setShowCopyTooltip] = React.useState(false);\n const [ellipsisFocused, setEllipsisFocused] = React.useState(false);\n const [ellipsisHovered, setEllipsisHovered] = React.useState(false);\n\n // Truncate breadcrumbs if more than 6 items\n const displayItems = React.useMemo(() => {\n if (items.length > 6) {\n // Show first item, ellipsis, and last item\n return [items[0], { label: '...', isEllipsis: true }, items[items.length - 1]];\n }\n return items;\n }, [items]);\n\n const handleCopy = () => {\n onCopy?.();\n // Copy the breadcrumb trail to clipboard\n const trail = items.map(item => item.label).join(' / ');\n navigator.clipboard.writeText(trail);\n };\n\n const containerStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n ...style,\n };\n\n const breadcrumbItemStyles = (index: number, isActive: boolean, isEllipsis?: boolean): React.CSSProperties => {\n const isFocused = focusedIndex === index;\n\n if (isEllipsis) {\n return {\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n height: '24px',\n overflow: 'hidden',\n };\n }\n\n return {\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n height: '24px',\n overflow: 'hidden',\n backgroundColor: isFocused ? 'rgba(255, 255, 255, 0.01)' : 'transparent',\n borderRadius: '99px',\n boxShadow: isFocused ? '0px 0px 0px 3px #3cad51' : 'none',\n padding: isFocused ? '0 6px' : '0 2px',\n margin: isFocused ? '0' : '0 4px',\n cursor: isActive ? 'default' : 'pointer',\n textDecoration: 'none',\n };\n };\n\n const linkStyles = (isActive: boolean, isHovered: boolean): React.CSSProperties => ({\n fontFamily: isActive\n ? \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\"\n : \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n fontSize: '13px',\n fontWeight: isActive ? 600 : 400,\n color: isActive\n ? isHovered\n ? '#0e8a0e'\n : '#2f2f2f'\n : isHovered\n ? '#0e8a0e'\n : '#595959',\n lineHeight: '1.5',\n whiteSpace: 'nowrap',\n });\n\n const dividerStyles: React.CSSProperties = {\n fontFamily: \"'PT Sans', sans-serif\",\n fontSize: '14px',\n color: '#595959',\n lineHeight: 'normal',\n whiteSpace: 'nowrap',\n };\n\n const ellipsisButtonStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '24px',\n height: '24px',\n borderRadius: '99px',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n backgroundColor: ellipsisFocused ? 'rgba(255, 255, 255, 0.01)' : ellipsisHovered ? '#efefef' : 'transparent',\n boxShadow: ellipsisFocused ? '0px 0px 0px 3px #3cad51' : 'none',\n };\n\n const copyButtonStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '24px',\n height: '24px',\n borderRadius: '99px',\n border: 'none',\n background: showCopyTooltip ? '#efefef' : 'transparent',\n cursor: 'pointer',\n position: 'relative',\n };\n\n const tooltipStyles: React.CSSProperties = {\n position: 'absolute',\n top: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginTop: '8px',\n backgroundColor: '#2f2f2f',\n color: 'white',\n padding: '12px',\n borderRadius: '8px',\n fontSize: '13px',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n fontWeight: 400,\n lineHeight: '1.5',\n whiteSpace: 'nowrap',\n boxShadow: '0px 4px 12px rgba(32, 32, 32, 0.08)',\n zIndex: 1000,\n };\n\n return (\n <div\n ref={ref}\n className={className}\n style={containerStyles}\n data-testid={dataTestId}\n >\n {displayItems.map((item, index) => {\n const isActive = index === displayItems.length - 1;\n const isEllipsis = 'isEllipsis' in item && item.isEllipsis;\n\n if (isEllipsis) {\n return (\n <React.Fragment key={`ellipsis-${index}`}>\n <button\n style={ellipsisButtonStyles}\n onFocus={() => setEllipsisFocused(true)}\n onBlur={() => setEllipsisFocused(false)}\n onMouseEnter={() => setEllipsisHovered(true)}\n onMouseLeave={() => setEllipsisHovered(false)}\n aria-label=\"More breadcrumbs\"\n >\n <MoreHorizontal\n size={12}\n color=\"#2f2f2f\"\n strokeWidth={2}\n style={{ display: 'block', flexShrink: 0 }}\n />\n </button>\n <span style={dividerStyles}> /</span>\n </React.Fragment>\n );\n }\n\n const breadcrumbItem = item as BreadcrumbItem;\n\n if (isActive) {\n // Active breadcrumb (last item) - not clickable\n return (\n <React.Fragment key={index}>\n <div\n style={breadcrumbItemStyles(index, true)}\n onMouseEnter={() => setHoveredIndex(index)}\n onMouseLeave={() => setHoveredIndex(null)}\n onFocus={() => setFocusedIndex(index)}\n onBlur={() => setFocusedIndex(null)}\n tabIndex={0}\n >\n <span style={linkStyles(true, hoveredIndex === index)}>\n {breadcrumbItem.label}\n </span>\n </div>\n {/* Copy button - appears immediately after active breadcrumb */}\n {onCopy && (\n <button\n style={copyButtonStyles}\n onClick={handleCopy}\n onMouseEnter={() => setShowCopyTooltip(true)}\n onMouseLeave={() => setShowCopyTooltip(false)}\n aria-label=\"Copy breadcrumb trail\"\n >\n <Link\n size={12}\n color=\"#2f2f2f\"\n strokeWidth={2}\n style={{ display: 'block', flexShrink: 0 }}\n />\n {showCopyTooltip && (\n <div style={tooltipStyles}>Copy breadcrumb trail</div>\n )}\n </button>\n )}\n </React.Fragment>\n );\n }\n\n // Regular breadcrumb link\n const Element = breadcrumbItem.href ? 'a' : 'button';\n return (\n <React.Fragment key={index}>\n <Element\n {...(breadcrumbItem.href ? { href: breadcrumbItem.href } : {})}\n style={{\n ...breadcrumbItemStyles(index, false),\n border: 'none',\n background: 'transparent',\n }}\n onClick={(e) => {\n if (!breadcrumbItem.href && breadcrumbItem.onClick) {\n e.preventDefault();\n breadcrumbItem.onClick();\n }\n }}\n onMouseEnter={() => setHoveredIndex(index)}\n onMouseLeave={() => setHoveredIndex(null)}\n onFocus={() => setFocusedIndex(index)}\n onBlur={() => setFocusedIndex(null)}\n >\n <span style={linkStyles(false, hoveredIndex === index)}>\n {breadcrumbItem.label}\n </span>\n {breadcrumbItem.hasDropdown && (\n <ChevronDown\n size={12}\n color={hoveredIndex === index ? '#0e8a0e' : '#595959'}\n strokeWidth={2}\n style={{ marginLeft: '2px', display: 'inline-block', flexShrink: 0 }}\n />\n )}\n </Element>\n <span style={dividerStyles}> /</span>\n </React.Fragment>\n );\n })}\n </div>\n );\n }\n);\n\nBreadcrumbs.displayName = 'Breadcrumbs';\n"],"mappings":"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","names":[]}