@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
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Toggle/Toggle.tsx"],"sourcesContent":["import * as React from 'react';\nimport { clsx } from 'clsx';\n\nexport interface ToggleProps {\n /**\n * The label for the toggle\n */\n label?: string;\n /**\n * Whether the toggle is on\n */\n checked?: boolean;\n /**\n * Callback when toggle state changes\n */\n onChange?: (checked: boolean) => void;\n /**\n * Whether the toggle 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\n */\n name?: string;\n /**\n * Value attribute for form submission\n */\n value?: string;\n}\n\nconst toggleContainerStyles: React.CSSProperties = {\n width: '40px',\n height: '24px',\n borderRadius: '16px',\n border: '1px solid',\n position: 'relative',\n cursor: 'pointer',\n transition: 'all 0.2s ease-in-out',\n};\n\nconst knobStyles: React.CSSProperties = {\n width: '18px',\n height: '18px',\n borderRadius: '50%',\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n transition: 'all 0.2s ease-in-out',\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 * Toggle component - Arbor Design System\n *\n * A toggle switch input with label support.\n */\nexport const Toggle = React.forwardRef<HTMLInputElement, ToggleProps>(\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 [isActive, setIsActive] = React.useState(false);\n const toggleId = React.useId();\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!disabled) {\n onChange?.(e.target.checked);\n }\n };\n\n // Container styles based on state\n const getContainerStyles = (): React.CSSProperties => {\n if (disabled) {\n return {\n ...toggleContainerStyles,\n backgroundColor: checked ? '#d1d1d1' : '#ffffff',\n borderColor: checked ? '#d1d1d1' : '#d1d1d1',\n cursor: 'not-allowed',\n };\n }\n\n if (checked) {\n if (isActive && isFocused) {\n return {\n ...toggleContainerStyles,\n backgroundColor: '#024002',\n borderColor: '#024002',\n boxShadow: '0px 0px 0px 3px #3cad51',\n };\n }\n if (isActive) {\n return {\n ...toggleContainerStyles,\n backgroundColor: '#024002',\n borderColor: '#024002',\n };\n }\n if (isHovered) {\n return {\n ...toggleContainerStyles,\n backgroundColor: '#005700',\n borderColor: '#005700',\n };\n }\n if (isFocused) {\n return {\n ...toggleContainerStyles,\n backgroundColor: '#0b800b',\n borderColor: '#0b800b',\n boxShadow: '0px 0px 0px 3px #3cad51',\n };\n }\n return {\n ...toggleContainerStyles,\n backgroundColor: '#0b800b',\n borderColor: '#0b800b',\n };\n } else {\n if (isActive && isFocused) {\n return {\n ...toggleContainerStyles,\n backgroundColor: '#efefef',\n borderColor: '#2f2f2f',\n boxShadow: '0px 0px 0px 3px #3cad51',\n };\n }\n if (isActive) {\n return {\n ...toggleContainerStyles,\n backgroundColor: '#efefef',\n borderColor: '#2f2f2f',\n };\n }\n if (isHovered) {\n return {\n ...toggleContainerStyles,\n backgroundColor: '#f8f8f8',\n borderColor: '#595959',\n };\n }\n if (isFocused) {\n return {\n ...toggleContainerStyles,\n backgroundColor: '#ffffff',\n borderColor: '#7e7e7e',\n boxShadow: '0px 0px 0px 3px #3cad51',\n };\n }\n return {\n ...toggleContainerStyles,\n backgroundColor: '#ffffff',\n borderColor: '#7e7e7e',\n };\n }\n };\n\n // Knob styles based on state\n const getKnobStyles = (): React.CSSProperties => {\n const baseKnob = {\n ...knobStyles,\n left: checked ? '18px' : '2px',\n };\n\n if (disabled) {\n return {\n ...baseKnob,\n backgroundColor: checked ? '#f8f8f8' : '#d1d1d1',\n };\n }\n\n if (checked) {\n if (isActive) {\n return {\n ...baseKnob,\n backgroundColor: '#efefef',\n };\n }\n if (isHovered) {\n return {\n ...baseKnob,\n backgroundColor: '#f8f8f8',\n };\n }\n return {\n ...baseKnob,\n backgroundColor: '#ffffff',\n };\n } else {\n if (isActive) {\n return {\n ...baseKnob,\n backgroundColor: '#2f2f2f',\n };\n }\n if (isHovered) {\n return {\n ...baseKnob,\n backgroundColor: '#595959',\n };\n }\n return {\n ...baseKnob,\n backgroundColor: '#7e7e7e',\n };\n }\n };\n\n return (\n <div\n className={clsx('arbor-toggle-wrapper', className)}\n style={{ ...wrapperStyles, ...style }}\n data-testid={dataTestId}\n >\n <input\n ref={ref}\n id={toggleId}\n type=\"checkbox\"\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={toggleId}\n onMouseEnter={() => !disabled && setIsHovered(true)}\n onMouseLeave={() => !disabled && setIsHovered(false)}\n onMouseDown={() => !disabled && setIsActive(true)}\n onMouseUp={() => !disabled && setIsActive(false)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n cursor: disabled ? 'not-allowed' : 'pointer',\n }}\n >\n <div style={getContainerStyles()}>\n <div style={getKnobStyles()} />\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\nToggle.displayName = 'Toggle';\n"],"mappings":"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","names":[]}
@@ -1,13 +1,13 @@
1
1
  // src/Checkbox/Checkbox.tsx
2
2
  import * as React from "react";
3
3
  import { clsx } from "clsx";
4
- import { Check } from "lucide-react";
4
+ import { Check, Minus } from "lucide-react";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  var checkboxStyles = {
7
- width: "20px",
8
- height: "20px",
9
- border: "2px solid #d1d1d1",
10
- // grey-300
7
+ width: "16px",
8
+ height: "16px",
9
+ border: "1px solid #7e7e7e",
10
+ // grey-500
11
11
  borderRadius: "4px",
12
12
  display: "flex",
13
13
  alignItems: "center",
@@ -18,9 +18,18 @@ var checkboxStyles = {
18
18
  backgroundColor: "#ffffff"
19
19
  };
20
20
  var checkedStyles = {
21
- backgroundColor: "#3cad51",
22
- // brand-500
23
- borderColor: "#3cad51"
21
+ backgroundColor: "#0e8a0e",
22
+ // brand-600
23
+ border: "1px solid #0e8a0e"
24
+ };
25
+ var checkedHoverStyles = {
26
+ backgroundColor: "#005700",
27
+ // brand-800
28
+ border: "1px solid #005700"
29
+ };
30
+ var uncheckedHoverStyles = {
31
+ border: "1px solid #474747"
32
+ // grey-700
24
33
  };
25
34
  var labelStyles = {
26
35
  fontSize: "13px",
@@ -44,10 +53,24 @@ var Checkbox = React.forwardRef(
44
53
  style,
45
54
  "data-testid": dataTestId,
46
55
  name,
47
- value
56
+ value,
57
+ indeterminate = false
48
58
  }, ref) => {
49
59
  const [isFocused, setIsFocused] = React.useState(false);
60
+ const [isHovered, setIsHovered] = React.useState(false);
50
61
  const checkboxId = React.useId();
62
+ const innerRef = React.useRef(null);
63
+ React.useEffect(() => {
64
+ const node = innerRef.current;
65
+ if (node) {
66
+ node.indeterminate = indeterminate;
67
+ if (typeof ref === "function") {
68
+ ref(node);
69
+ } else if (ref) {
70
+ ref.current = node;
71
+ }
72
+ }
73
+ }, [indeterminate, ref]);
51
74
  const handleChange = (e) => {
52
75
  if (!disabled) {
53
76
  onChange?.(e.target.checked);
@@ -55,12 +78,16 @@ var Checkbox = React.forwardRef(
55
78
  };
56
79
  const boxStyle = {
57
80
  ...checkboxStyles,
58
- ...checked && !disabled && checkedStyles,
59
- ...disabled && !checked && { backgroundColor: "#f8f8f8", borderColor: "#efefef" },
60
- ...disabled && checked && { backgroundColor: "#7e7e7e", borderColor: "#7e7e7e" },
61
- ...isFocused && !disabled && { borderColor: "#3cad51", outline: "2px solid rgba(60, 173, 81, 0.2)" }
81
+ ...(checked || indeterminate) && !disabled && checkedStyles,
82
+ ...isHovered && !disabled && !(checked || indeterminate) && uncheckedHoverStyles,
83
+ ...isHovered && !disabled && (checked || indeterminate) && checkedHoverStyles,
84
+ ...disabled && !checked && !indeterminate && { backgroundColor: "#efefef", border: "1px solid #b3b3b3" },
85
+ ...disabled && (checked || indeterminate) && { backgroundColor: "#b3b3b3", border: "1px solid #b3b3b3" },
86
+ ...isFocused && !disabled && {
87
+ boxShadow: "0px 0px 0px 3px #3cad51"
88
+ }
62
89
  };
63
- const checkmarkColor = disabled ? "#d1d1d1" : "#ffffff";
90
+ const checkmarkColor = "#ffffff";
64
91
  return /* @__PURE__ */ jsxs(
65
92
  "div",
66
93
  {
@@ -71,7 +98,7 @@ var Checkbox = React.forwardRef(
71
98
  /* @__PURE__ */ jsx(
72
99
  "input",
73
100
  {
74
- ref,
101
+ ref: innerRef,
75
102
  id: checkboxId,
76
103
  type: "checkbox",
77
104
  checked,
@@ -87,13 +114,15 @@ var Checkbox = React.forwardRef(
87
114
  width: 0,
88
115
  height: 0
89
116
  },
90
- "aria-checked": checked
117
+ "aria-checked": indeterminate ? "mixed" : checked
91
118
  }
92
119
  ),
93
120
  /* @__PURE__ */ jsxs(
94
121
  "label",
95
122
  {
96
123
  htmlFor: checkboxId,
124
+ onMouseEnter: () => !disabled && setIsHovered(true),
125
+ onMouseLeave: () => !disabled && setIsHovered(false),
97
126
  style: {
98
127
  display: "flex",
99
128
  alignItems: "center",
@@ -101,7 +130,7 @@ var Checkbox = React.forwardRef(
101
130
  cursor: disabled ? "not-allowed" : "pointer"
102
131
  },
103
132
  children: [
104
- /* @__PURE__ */ jsx("div", { style: boxStyle, children: checked && /* @__PURE__ */ jsx(Check, { size: 14, color: checkmarkColor, strokeWidth: 3 }) }),
133
+ /* @__PURE__ */ jsx("div", { style: boxStyle, children: (checked || indeterminate) && (indeterminate ? /* @__PURE__ */ jsx(Minus, { size: 12, color: checkmarkColor, strokeWidth: 3 }) : /* @__PURE__ */ jsx(Check, { size: 16, color: checkmarkColor, strokeWidth: 3 })) }),
105
134
  label && /* @__PURE__ */ jsx(
106
135
  "span",
107
136
  {
@@ -126,4 +155,4 @@ Checkbox.displayName = "Checkbox";
126
155
  export {
127
156
  Checkbox
128
157
  };
129
- //# sourceMappingURL=chunk-BCYJIUQX.mjs.map
158
+ //# sourceMappingURL=chunk-CUTYEIFE.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Checkbox/Checkbox.tsx"],"sourcesContent":["import * as React from 'react';\nimport { clsx } from 'clsx';\nimport { Check, Minus } from 'lucide-react';\n\nexport interface CheckboxProps {\n /**\n * The label for the checkbox\n */\n label?: string;\n /**\n * Whether the checkbox is checked\n */\n checked?: boolean;\n /**\n * Callback when checked state changes\n */\n onChange?: (checked: boolean) => void;\n /**\n * Whether the checkbox 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\n */\n name?: string;\n /**\n * Value attribute for form submission\n */\n value?: string;\n /**\n * Indeterminate state (shows minus icon)\n */\n indeterminate?: boolean;\n}\n\nconst checkboxStyles: React.CSSProperties = {\n width: '16px',\n height: '16px',\n border: '1px solid #7e7e7e', // grey-500\n borderRadius: '4px',\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 backgroundColor: '#0e8a0e', // brand-600\n border: '1px solid #0e8a0e',\n};\n\nconst checkedHoverStyles: React.CSSProperties = {\n backgroundColor: '#005700', // brand-800\n border: '1px solid #005700',\n};\n\nconst uncheckedHoverStyles: React.CSSProperties = {\n border: '1px solid #474747', // grey-700\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 * Checkbox component - Arbor Design System\n *\n * A checkbox input with label support.\n */\nexport const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\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 indeterminate = false,\n },\n ref\n ) => {\n const [isFocused, setIsFocused] = React.useState(false);\n const [isHovered, setIsHovered] = React.useState(false);\n const checkboxId = React.useId();\n const innerRef = React.useRef<HTMLInputElement | null>(null);\n\n // Merge refs\n React.useEffect(() => {\n const node = innerRef.current;\n if (node) {\n // Set indeterminate property on the native input element\n node.indeterminate = indeterminate;\n\n // Forward to external ref if provided\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current = node;\n }\n }\n }, [indeterminate, ref]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!disabled) {\n onChange?.(e.target.checked);\n }\n };\n\n const boxStyle: React.CSSProperties = {\n ...checkboxStyles,\n ...((checked || indeterminate) && !disabled && checkedStyles),\n ...(isHovered && !disabled && !(checked || indeterminate) && uncheckedHoverStyles),\n ...(isHovered && !disabled && (checked || indeterminate) && checkedHoverStyles),\n ...(disabled && !checked && !indeterminate && { backgroundColor: '#efefef', border: '1px solid #b3b3b3' }),\n ...(disabled && (checked || indeterminate) && { backgroundColor: '#b3b3b3', border: '1px solid #b3b3b3' }),\n ...(isFocused && !disabled && {\n boxShadow: '0px 0px 0px 3px #3cad51',\n }),\n };\n\n const checkmarkColor = '#ffffff';\n\n return (\n <div\n className={clsx('arbor-checkbox-wrapper', className)}\n style={{ ...wrapperStyles, ...style }}\n data-testid={dataTestId}\n >\n <input\n ref={innerRef}\n id={checkboxId}\n type=\"checkbox\"\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={indeterminate ? 'mixed' : checked}\n />\n <label\n htmlFor={checkboxId}\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={boxStyle}>\n {(checked || indeterminate) && (\n indeterminate ? (\n <Minus size={12} color={checkmarkColor} strokeWidth={3} />\n ) : (\n <Check size={16} color={checkmarkColor} strokeWidth={3} />\n )\n )}\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\nCheckbox.displayName = 'Checkbox';\n"],"mappings":"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","names":[]}
@@ -0,0 +1,133 @@
1
+ // src/Toast/Toast.tsx
2
+ import * as React from "react";
3
+ import { clsx } from "clsx";
4
+ import { Info, AlertCircle, AlertTriangle, CheckCircle, AlertOctagon } from "lucide-react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ var baseToastStyles = {
7
+ width: "360px",
8
+ padding: "16px",
9
+ borderRadius: "8px",
10
+ border: "1px solid",
11
+ display: "flex",
12
+ alignItems: "center",
13
+ gap: "12px",
14
+ boxShadow: "0px 4px 12px 0px rgba(32, 32, 32, 0.08)",
15
+ fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
16
+ };
17
+ var messageStyles = {
18
+ fontSize: "13px",
19
+ fontWeight: 600,
20
+ flex: 1
21
+ };
22
+ var closeButtonStyles = {
23
+ width: "24px",
24
+ height: "24px",
25
+ borderRadius: "50%",
26
+ border: "none",
27
+ background: "transparent",
28
+ cursor: "pointer",
29
+ display: "flex",
30
+ alignItems: "center",
31
+ justifyContent: "center",
32
+ flexShrink: 0,
33
+ transition: "background-color 0.2s ease-in-out"
34
+ };
35
+ var variantConfig = {
36
+ information: {
37
+ backgroundColor: "#f5fbff",
38
+ borderColor: "#2c8bca",
39
+ textColor: "#053a61",
40
+ icon: Info,
41
+ iconColor: "#2c8bca",
42
+ closeHoverBg: "#e0f3ff"
43
+ },
44
+ danger: {
45
+ backgroundColor: "#fff5f5",
46
+ borderColor: "#c93232",
47
+ textColor: "#610202",
48
+ icon: AlertCircle,
49
+ iconColor: "#c93232",
50
+ closeHoverBg: "#ffe0e0"
51
+ },
52
+ warning: {
53
+ backgroundColor: "#fffaf5",
54
+ borderColor: "#e4720d",
55
+ textColor: "#611f00",
56
+ icon: AlertTriangle,
57
+ iconColor: "#e4720d",
58
+ closeHoverBg: "#ffedd5"
59
+ },
60
+ success: {
61
+ backgroundColor: "#f0faf3",
62
+ borderColor: "#5ec171",
63
+ textColor: "#024002",
64
+ icon: CheckCircle,
65
+ iconColor: "#5ec171",
66
+ closeHoverBg: "#d9f2df"
67
+ },
68
+ caution: {
69
+ backgroundColor: "#fffdf5",
70
+ borderColor: "#edae06",
71
+ textColor: "#613f00",
72
+ icon: AlertOctagon,
73
+ iconColor: "#edae06",
74
+ closeHoverBg: "#fff8d5"
75
+ }
76
+ };
77
+ var Toast = React.forwardRef(
78
+ ({
79
+ variant,
80
+ message,
81
+ onClose,
82
+ className,
83
+ style,
84
+ "data-testid": dataTestId
85
+ }, ref) => {
86
+ const [isCloseHovered, setIsCloseHovered] = React.useState(false);
87
+ const config = variantConfig[variant];
88
+ const IconComponent = config.icon;
89
+ const toastStyle = {
90
+ ...baseToastStyles,
91
+ backgroundColor: config.backgroundColor,
92
+ borderColor: config.borderColor,
93
+ ...style
94
+ };
95
+ const closeStyle = {
96
+ ...closeButtonStyles,
97
+ ...isCloseHovered && { backgroundColor: config.closeHoverBg }
98
+ };
99
+ return /* @__PURE__ */ jsxs(
100
+ "div",
101
+ {
102
+ ref,
103
+ className: clsx("arbor-toast", `arbor-toast-${variant}`, className),
104
+ style: toastStyle,
105
+ "data-testid": dataTestId,
106
+ role: "alert",
107
+ "aria-live": "polite",
108
+ children: [
109
+ /* @__PURE__ */ jsx(IconComponent, { size: 16, color: config.iconColor, style: { flexShrink: 0 } }),
110
+ /* @__PURE__ */ jsx("span", { style: { ...messageStyles, color: config.textColor }, children: message }),
111
+ onClose && /* @__PURE__ */ jsx(
112
+ "button",
113
+ {
114
+ onClick: onClose,
115
+ onMouseEnter: () => setIsCloseHovered(true),
116
+ onMouseLeave: () => setIsCloseHovered(false),
117
+ style: closeStyle,
118
+ "aria-label": "Close notification",
119
+ type: "button",
120
+ children: /* @__PURE__ */ jsx("span", { style: { fontSize: "18px", lineHeight: 1, color: "#595959", fontWeight: "bold" }, children: "\xD7" })
121
+ }
122
+ )
123
+ ]
124
+ }
125
+ );
126
+ }
127
+ );
128
+ Toast.displayName = "Toast";
129
+
130
+ export {
131
+ Toast
132
+ };
133
+ //# sourceMappingURL=chunk-DULH2KRW.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Toast/Toast.tsx"],"sourcesContent":["import * as React from 'react';\nimport { clsx } from 'clsx';\nimport { Info, AlertCircle, AlertTriangle, CheckCircle, AlertOctagon } from 'lucide-react';\n\nexport interface ToastProps {\n /**\n * The variant of the toast\n */\n variant: 'information' | 'danger' | 'warning' | 'success' | 'caution';\n /**\n * The message to display\n */\n message: string;\n /**\n * Callback when close button is clicked\n */\n onClose?: () => 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\nconst baseToastStyles: React.CSSProperties = {\n width: '360px',\n padding: '16px',\n borderRadius: '8px',\n border: '1px solid',\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n boxShadow: '0px 4px 12px 0px rgba(32, 32, 32, 0.08)',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n};\n\nconst messageStyles: React.CSSProperties = {\n fontSize: '13px',\n fontWeight: 600,\n flex: 1,\n};\n\nconst closeButtonStyles: React.CSSProperties = {\n width: '24px',\n height: '24px',\n borderRadius: '50%',\n border: 'none',\n background: 'transparent',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n transition: 'background-color 0.2s ease-in-out',\n};\n\nconst variantConfig = {\n information: {\n backgroundColor: '#f5fbff',\n borderColor: '#2c8bca',\n textColor: '#053a61',\n icon: Info,\n iconColor: '#2c8bca',\n closeHoverBg: '#e0f3ff',\n },\n danger: {\n backgroundColor: '#fff5f5',\n borderColor: '#c93232',\n textColor: '#610202',\n icon: AlertCircle,\n iconColor: '#c93232',\n closeHoverBg: '#ffe0e0',\n },\n warning: {\n backgroundColor: '#fffaf5',\n borderColor: '#e4720d',\n textColor: '#611f00',\n icon: AlertTriangle,\n iconColor: '#e4720d',\n closeHoverBg: '#ffedd5',\n },\n success: {\n backgroundColor: '#f0faf3',\n borderColor: '#5ec171',\n textColor: '#024002',\n icon: CheckCircle,\n iconColor: '#5ec171',\n closeHoverBg: '#d9f2df',\n },\n caution: {\n backgroundColor: '#fffdf5',\n borderColor: '#edae06',\n textColor: '#613f00',\n icon: AlertOctagon,\n iconColor: '#edae06',\n closeHoverBg: '#fff8d5',\n },\n};\n\n/**\n * Toast component - Arbor Design System\n *\n * A notification toast with different variants for different message types.\n *\n * IMPORTANT: Toasts are designed to overlay content in the top-right corner.\n * Use absolute/fixed positioning to display them above page content.\n *\n * For inline notifications that flow with page content, use the Banner component instead.\n *\n * Example usage with positioning:\n * ```tsx\n * <div style={{ position: 'fixed', top: '24px', right: '24px', zIndex: 1000 }}>\n * <Toast variant=\"success\" message=\"Changes saved!\" onClose={() => {}} />\n * </div>\n * ```\n */\nexport const Toast = React.forwardRef<HTMLDivElement, ToastProps>(\n (\n {\n variant,\n message,\n onClose,\n className,\n style,\n 'data-testid': dataTestId,\n },\n ref\n ) => {\n const [isCloseHovered, setIsCloseHovered] = React.useState(false);\n const config = variantConfig[variant];\n const IconComponent = config.icon;\n\n const toastStyle: React.CSSProperties = {\n ...baseToastStyles,\n backgroundColor: config.backgroundColor,\n borderColor: config.borderColor,\n ...style,\n };\n\n const closeStyle: React.CSSProperties = {\n ...closeButtonStyles,\n ...(isCloseHovered && { backgroundColor: config.closeHoverBg }),\n };\n\n return (\n <div\n ref={ref}\n className={clsx('arbor-toast', `arbor-toast-${variant}`, className)}\n style={toastStyle}\n data-testid={dataTestId}\n role=\"alert\"\n aria-live=\"polite\"\n >\n <IconComponent size={16} color={config.iconColor} style={{ flexShrink: 0 }} />\n <span style={{ ...messageStyles, color: config.textColor }}>\n {message}\n </span>\n {onClose && (\n <button\n onClick={onClose}\n onMouseEnter={() => setIsCloseHovered(true)}\n onMouseLeave={() => setIsCloseHovered(false)}\n style={closeStyle}\n aria-label=\"Close notification\"\n type=\"button\"\n >\n <span style={{ fontSize: '18px', lineHeight: 1, color: '#595959', fontWeight: 'bold' }}>×</span>\n </button>\n )}\n </div>\n );\n }\n);\n\nToast.displayName = 'Toast';\n"],"mappings":"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","names":[]}