@brycks/core-front 0.3.1 → 0.3.2

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 (109) hide show
  1. package/dist/components/data/List/List.cjs +1 -1
  2. package/dist/components/data/List/List.cjs.map +1 -1
  3. package/dist/components/data/List/List.js +92 -88
  4. package/dist/components/data/List/List.js.map +1 -1
  5. package/dist/components/data/Table/Table.cjs +1 -1
  6. package/dist/components/data/Table/Table.cjs.map +1 -1
  7. package/dist/components/data/Table/Table.js +129 -125
  8. package/dist/components/data/Table/Table.js.map +1 -1
  9. package/dist/components/data/TreeView/TreeView.cjs +2 -0
  10. package/dist/components/data/TreeView/TreeView.cjs.map +1 -0
  11. package/dist/components/data/TreeView/TreeView.js +256 -0
  12. package/dist/components/data/TreeView/TreeView.js.map +1 -0
  13. package/dist/components/data/VirtualList/VirtualList.cjs +2 -0
  14. package/dist/components/data/VirtualList/VirtualList.cjs.map +1 -0
  15. package/dist/components/data/VirtualList/VirtualList.js +186 -0
  16. package/dist/components/data/VirtualList/VirtualList.js.map +1 -0
  17. package/dist/components/data.cjs +1 -1
  18. package/dist/components/data.js +21 -16
  19. package/dist/components/data.js.map +1 -1
  20. package/dist/components/feedback/Modal/Modal.cjs +1 -1
  21. package/dist/components/feedback/Modal/Modal.cjs.map +1 -1
  22. package/dist/components/feedback/Modal/Modal.js +81 -77
  23. package/dist/components/feedback/Modal/Modal.js.map +1 -1
  24. package/dist/components/form/Combobox/Combobox.cjs +7 -0
  25. package/dist/components/form/Combobox/Combobox.cjs.map +1 -0
  26. package/dist/components/form/Combobox/Combobox.js +338 -0
  27. package/dist/components/form/Combobox/Combobox.js.map +1 -0
  28. package/dist/components/form/DateRangePicker/DateRangePicker.cjs +2 -0
  29. package/dist/components/form/DateRangePicker/DateRangePicker.cjs.map +1 -0
  30. package/dist/components/form/DateRangePicker/DateRangePicker.js +372 -0
  31. package/dist/components/form/DateRangePicker/DateRangePicker.js.map +1 -0
  32. package/dist/components/form/MultiSelect/MultiSelect.cjs +2 -0
  33. package/dist/components/form/MultiSelect/MultiSelect.cjs.map +1 -0
  34. package/dist/components/form/MultiSelect/MultiSelect.js +393 -0
  35. package/dist/components/form/MultiSelect/MultiSelect.js.map +1 -0
  36. package/dist/components/form/Rating/Rating.cjs +2 -0
  37. package/dist/components/form/Rating/Rating.cjs.map +1 -0
  38. package/dist/components/form/Rating/Rating.js +163 -0
  39. package/dist/components/form/Rating/Rating.js.map +1 -0
  40. package/dist/components/form/Slider/Slider.cjs +1 -1
  41. package/dist/components/form/Slider/Slider.cjs.map +1 -1
  42. package/dist/components/form/Slider/Slider.js +120 -85
  43. package/dist/components/form/Slider/Slider.js.map +1 -1
  44. package/dist/components/form/TagInput/TagInput.cjs +2 -0
  45. package/dist/components/form/TagInput/TagInput.cjs.map +1 -0
  46. package/dist/components/form/TagInput/TagInput.js +286 -0
  47. package/dist/components/form/TagInput/TagInput.js.map +1 -0
  48. package/dist/components/form/TimePicker/TimePicker.cjs +2 -0
  49. package/dist/components/form/TimePicker/TimePicker.cjs.map +1 -0
  50. package/dist/components/form/TimePicker/TimePicker.js +328 -0
  51. package/dist/components/form/TimePicker/TimePicker.js.map +1 -0
  52. package/dist/components/form.cjs +1 -1
  53. package/dist/components/form.js +34 -22
  54. package/dist/components/form.js.map +1 -1
  55. package/dist/components/layout/Card/Card.cjs +1 -1
  56. package/dist/components/layout/Card/Card.cjs.map +1 -1
  57. package/dist/components/layout/Card/Card.js +62 -59
  58. package/dist/components/layout/Card/Card.js.map +1 -1
  59. package/dist/components/layout/Collapse/Collapse.cjs +2 -0
  60. package/dist/components/layout/Collapse/Collapse.cjs.map +1 -0
  61. package/dist/components/layout/Collapse/Collapse.js +140 -0
  62. package/dist/components/layout/Collapse/Collapse.js.map +1 -0
  63. package/dist/components/layout.cjs +1 -1
  64. package/dist/components/layout.js +27 -24
  65. package/dist/components/layout.js.map +1 -1
  66. package/dist/components/navigation/Breadcrumb/Breadcrumb.cjs +1 -1
  67. package/dist/components/navigation/Breadcrumb/Breadcrumb.cjs.map +1 -1
  68. package/dist/components/navigation/Breadcrumb/Breadcrumb.js +66 -62
  69. package/dist/components/navigation/Breadcrumb/Breadcrumb.js.map +1 -1
  70. package/dist/components/navigation/ContextMenu/ContextMenu.cjs +2 -0
  71. package/dist/components/navigation/ContextMenu/ContextMenu.cjs.map +1 -0
  72. package/dist/components/navigation/ContextMenu/ContextMenu.js +227 -0
  73. package/dist/components/navigation/ContextMenu/ContextMenu.js.map +1 -0
  74. package/dist/components/navigation/Dropdown/Dropdown.cjs +2 -2
  75. package/dist/components/navigation/Dropdown/Dropdown.cjs.map +1 -1
  76. package/dist/components/navigation/Dropdown/Dropdown.js +84 -80
  77. package/dist/components/navigation/Dropdown/Dropdown.js.map +1 -1
  78. package/dist/components/navigation/Menu/Menu.cjs +1 -1
  79. package/dist/components/navigation/Menu/Menu.cjs.map +1 -1
  80. package/dist/components/navigation/Menu/Menu.js +132 -94
  81. package/dist/components/navigation/Menu/Menu.js.map +1 -1
  82. package/dist/components/navigation/Pagination/Pagination.cjs +1 -1
  83. package/dist/components/navigation/Pagination/Pagination.cjs.map +1 -1
  84. package/dist/components/navigation/Pagination/Pagination.js +111 -107
  85. package/dist/components/navigation/Pagination/Pagination.js.map +1 -1
  86. package/dist/components/navigation/Stepper/Stepper.cjs +2 -0
  87. package/dist/components/navigation/Stepper/Stepper.cjs.map +1 -0
  88. package/dist/components/navigation/Stepper/Stepper.js +187 -0
  89. package/dist/components/navigation/Stepper/Stepper.js.map +1 -0
  90. package/dist/components/navigation.cjs +1 -1
  91. package/dist/components/navigation.js +27 -21
  92. package/dist/components/navigation.js.map +1 -1
  93. package/dist/components/utility/Badge/Badge.cjs +1 -1
  94. package/dist/components/utility/Badge/Badge.cjs.map +1 -1
  95. package/dist/components/utility/Badge/Badge.js +38 -35
  96. package/dist/components/utility/Badge/Badge.js.map +1 -1
  97. package/dist/data.d.ts +116 -0
  98. package/dist/form.d.ts +316 -0
  99. package/dist/hooks/useInteractionState.cjs +2 -0
  100. package/dist/hooks/useInteractionState.cjs.map +1 -0
  101. package/dist/hooks/useInteractionState.js +67 -0
  102. package/dist/hooks/useInteractionState.js.map +1 -0
  103. package/dist/hooks.cjs +1 -1
  104. package/dist/hooks.d.ts +87 -0
  105. package/dist/hooks.js +16 -14
  106. package/dist/hooks.js.map +1 -1
  107. package/dist/layout.d.ts +44 -0
  108. package/dist/navigation.d.ts +88 -0
  109. package/package.json +1 -1
@@ -0,0 +1,163 @@
1
+ import { jsx as s, jsxs as R } from "react/jsx-runtime";
2
+ import { forwardRef as U, useState as w, useCallback as h } from "react";
3
+ import { cx as _ } from "../../../utils/styles.js";
4
+ import { spacing as l } from "../../../design-system/tokens/spacing.js";
5
+ import { durations as q, easings as H } from "../../../design-system/tokens/motion.js";
6
+ const J = {
7
+ sm: { size: l[4], gap: l[0.5] },
8
+ md: { size: l[5], gap: l[1] },
9
+ lg: { size: l[6], gap: l[1] },
10
+ xl: { size: l[8], gap: l[1.5] }
11
+ };
12
+ function L({ filled: b, half: c }) {
13
+ return c ? /* @__PURE__ */ R("svg", { viewBox: "0 0 24 24", fill: "none", children: [
14
+ /* @__PURE__ */ s("defs", { children: /* @__PURE__ */ R("linearGradient", { id: "halfGradient", children: [
15
+ /* @__PURE__ */ s("stop", { offset: "50%", stopColor: "currentColor" }),
16
+ /* @__PURE__ */ s("stop", { offset: "50%", stopColor: "transparent" })
17
+ ] }) }),
18
+ /* @__PURE__ */ s(
19
+ "path",
20
+ {
21
+ d: "M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z",
22
+ fill: "url(#halfGradient)",
23
+ stroke: "currentColor",
24
+ strokeWidth: "1.5",
25
+ strokeLinecap: "round",
26
+ strokeLinejoin: "round"
27
+ }
28
+ )
29
+ ] }) : /* @__PURE__ */ s("svg", { viewBox: "0 0 24 24", fill: "none", children: /* @__PURE__ */ s(
30
+ "path",
31
+ {
32
+ d: "M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z",
33
+ fill: b ? "currentColor" : "none",
34
+ stroke: "currentColor",
35
+ strokeWidth: "1.5",
36
+ strokeLinecap: "round",
37
+ strokeLinejoin: "round"
38
+ }
39
+ ) });
40
+ }
41
+ const P = U(function({
42
+ value: c,
43
+ defaultValue: D = 0,
44
+ onChange: C,
45
+ max: u = 5,
46
+ size: M = "md",
47
+ allowHalf: i = !1,
48
+ readOnly: v = !1,
49
+ disabled: d = !1,
50
+ allowClear: z = !0,
51
+ filledIcon: S,
52
+ emptyIcon: x,
53
+ halfIcon: A,
54
+ color: F = "var(--brycks-warning-default)",
55
+ "aria-label": $ = "Rating",
56
+ className: j,
57
+ testId: B
58
+ }, V) {
59
+ const [G, I] = w(D), [p, k] = w(null), o = c !== void 0 ? c : G, f = p !== null ? p : o, m = J[M], n = !v && !d, a = h(
60
+ (t) => {
61
+ if (!n) return;
62
+ const e = z && t === o ? 0 : t;
63
+ c === void 0 && I(e), C?.(e);
64
+ },
65
+ [n, z, o, c, C]
66
+ ), K = h(
67
+ (t, e) => {
68
+ if (!n) return;
69
+ const r = t.currentTarget.getBoundingClientRect(), y = t.clientX - r.left < r.width / 2;
70
+ k(i && y ? e + 0.5 : e + 1);
71
+ },
72
+ [n, i]
73
+ ), N = h(
74
+ (t, e) => {
75
+ if (!n) return;
76
+ const r = t.currentTarget.getBoundingClientRect(), y = t.clientX - r.left < r.width / 2;
77
+ a(i && y ? e + 0.5 : e + 1);
78
+ },
79
+ [n, i, a]
80
+ ), T = h(
81
+ (t) => {
82
+ if (!n) return;
83
+ const e = i ? 0.5 : 1;
84
+ switch (t.key) {
85
+ case "ArrowRight":
86
+ case "ArrowUp":
87
+ t.preventDefault(), a(Math.min(o + e, u));
88
+ break;
89
+ case "ArrowLeft":
90
+ case "ArrowDown":
91
+ t.preventDefault(), a(Math.max(o - e, 0));
92
+ break;
93
+ case "Home":
94
+ t.preventDefault(), a(0);
95
+ break;
96
+ case "End":
97
+ t.preventDefault(), a(u);
98
+ break;
99
+ }
100
+ },
101
+ [n, i, o, u, a]
102
+ ), W = {
103
+ display: "inline-flex",
104
+ alignItems: "center",
105
+ gap: m.gap,
106
+ cursor: n ? "pointer" : "default",
107
+ opacity: d ? 0.5 : 1,
108
+ outline: "none"
109
+ }, X = (t) => {
110
+ const e = t + 1, r = f >= e, g = i && f >= e - 0.5 && f < e;
111
+ return {
112
+ width: m.size,
113
+ height: m.size,
114
+ color: r || g ? F : "var(--brycks-border-default)",
115
+ transition: `all ${q.fast}ms ${H.easeOut}`,
116
+ transform: p !== null && p >= e ? "scale(1.1)" : "scale(1)"
117
+ };
118
+ }, E = (t) => {
119
+ const e = t + 1, r = f >= e;
120
+ return i && f >= e - 0.5 && f < e ? A || /* @__PURE__ */ s(L, { filled: !1, half: !0 }) : r ? S || /* @__PURE__ */ s(L, { filled: !0 }) : x || /* @__PURE__ */ s(L, { filled: !1 });
121
+ };
122
+ return /* @__PURE__ */ s(
123
+ "div",
124
+ {
125
+ ref: V,
126
+ role: "slider",
127
+ "aria-label": $,
128
+ "aria-valuemin": 0,
129
+ "aria-valuemax": u,
130
+ "aria-valuenow": o,
131
+ "aria-valuetext": `${o} out of ${u} stars`,
132
+ "aria-disabled": d,
133
+ "aria-readonly": v,
134
+ tabIndex: n ? 0 : -1,
135
+ className: _(
136
+ "brycks-rating",
137
+ `brycks-rating--${M}`,
138
+ v && "brycks-rating--readonly",
139
+ d && "brycks-rating--disabled",
140
+ j
141
+ ),
142
+ style: W,
143
+ onKeyDown: T,
144
+ onMouseLeave: () => n && k(null),
145
+ "data-testid": B,
146
+ children: Array.from({ length: u }, (t, e) => /* @__PURE__ */ s(
147
+ "span",
148
+ {
149
+ style: X(e),
150
+ onMouseMove: (r) => K(r, e),
151
+ onClick: (r) => N(r, e),
152
+ children: E(e)
153
+ },
154
+ e
155
+ ))
156
+ }
157
+ );
158
+ });
159
+ P.displayName = "Rating";
160
+ export {
161
+ P as Rating
162
+ };
163
+ //# sourceMappingURL=Rating.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Rating.js","sources":["../../../../src/components/form/Rating/Rating.tsx"],"sourcesContent":["/**\n * Rating Component\n *\n * A star rating component for collecting user ratings.\n * Supports half stars, custom icons, and keyboard navigation.\n *\n * @module components/form/Rating\n */\n\nimport {\n forwardRef,\n useState,\n useCallback,\n type CSSProperties,\n type ReactNode,\n type KeyboardEvent,\n type MouseEvent,\n} from 'react'\nimport { cx } from '../../../utils/styles'\nimport { spacing, durations, easings } from '../../../design-system'\n\nexport type RatingSize = 'sm' | 'md' | 'lg' | 'xl'\n\nexport interface RatingProps {\n /** Current rating value */\n value?: number\n /** Default rating value (uncontrolled) */\n defaultValue?: number\n /** Callback when rating changes */\n onChange?: (value: number) => void\n /** Maximum rating (number of stars) */\n max?: number\n /** Component size */\n size?: RatingSize\n /** Whether to allow half stars */\n allowHalf?: boolean\n /** Whether the rating is read-only */\n readOnly?: boolean\n /** Whether the rating is disabled */\n disabled?: boolean\n /** Whether to allow clearing (clicking same value again) */\n allowClear?: boolean\n /** Custom filled icon */\n filledIcon?: ReactNode\n /** Custom empty icon */\n emptyIcon?: ReactNode\n /** Custom half-filled icon */\n halfIcon?: ReactNode\n /** Color for filled stars */\n color?: string\n /** Label for accessibility */\n 'aria-label'?: string\n /** Custom class name */\n className?: string\n /** Test ID */\n testId?: string\n}\n\nconst sizeConfig: Record<RatingSize, { size: number; gap: number }> = {\n sm: { size: spacing[4], gap: spacing[0.5] },\n md: { size: spacing[5], gap: spacing[1] },\n lg: { size: spacing[6], gap: spacing[1] },\n xl: { size: spacing[8], gap: spacing[1.5] },\n}\n\nfunction StarIcon({ filled, half }: { filled: boolean; half?: boolean }) {\n if (half) {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\">\n <defs>\n <linearGradient id=\"halfGradient\">\n <stop offset=\"50%\" stopColor=\"currentColor\" />\n <stop offset=\"50%\" stopColor=\"transparent\" />\n </linearGradient>\n </defs>\n <path\n d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\"\n fill=\"url(#halfGradient)\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n }\n\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\"\n fill={filled ? 'currentColor' : 'none'}\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nexport const Rating = forwardRef<HTMLDivElement, RatingProps>(function Rating(\n {\n value: controlledValue,\n defaultValue = 0,\n onChange,\n max = 5,\n size = 'md',\n allowHalf = false,\n readOnly = false,\n disabled = false,\n allowClear = true,\n filledIcon,\n emptyIcon,\n halfIcon,\n color = 'var(--brycks-warning-default)',\n 'aria-label': ariaLabel = 'Rating',\n className,\n testId,\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue)\n const [hoverValue, setHoverValue] = useState<number | null>(null)\n\n const value = controlledValue !== undefined ? controlledValue : internalValue\n const displayValue = hoverValue !== null ? hoverValue : value\n const config = sizeConfig[size]\n\n const isInteractive = !readOnly && !disabled\n\n const handleSelect = useCallback(\n (newValue: number) => {\n if (!isInteractive) return\n\n // Allow clearing if clicking same value\n const finalValue = allowClear && newValue === value ? 0 : newValue\n\n if (controlledValue === undefined) {\n setInternalValue(finalValue)\n }\n onChange?.(finalValue)\n },\n [isInteractive, allowClear, value, controlledValue, onChange]\n )\n\n const handleMouseMove = useCallback(\n (e: MouseEvent<HTMLSpanElement>, starIndex: number) => {\n if (!isInteractive) return\n\n const rect = e.currentTarget.getBoundingClientRect()\n const x = e.clientX - rect.left\n const isLeftHalf = x < rect.width / 2\n\n if (allowHalf && isLeftHalf) {\n setHoverValue(starIndex + 0.5)\n } else {\n setHoverValue(starIndex + 1)\n }\n },\n [isInteractive, allowHalf]\n )\n\n const handleClick = useCallback(\n (e: MouseEvent<HTMLSpanElement>, starIndex: number) => {\n if (!isInteractive) return\n\n const rect = e.currentTarget.getBoundingClientRect()\n const x = e.clientX - rect.left\n const isLeftHalf = x < rect.width / 2\n\n if (allowHalf && isLeftHalf) {\n handleSelect(starIndex + 0.5)\n } else {\n handleSelect(starIndex + 1)\n }\n },\n [isInteractive, allowHalf, handleSelect]\n )\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (!isInteractive) return\n\n const step = allowHalf ? 0.5 : 1\n\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n e.preventDefault()\n handleSelect(Math.min(value + step, max))\n break\n case 'ArrowLeft':\n case 'ArrowDown':\n e.preventDefault()\n handleSelect(Math.max(value - step, 0))\n break\n case 'Home':\n e.preventDefault()\n handleSelect(0)\n break\n case 'End':\n e.preventDefault()\n handleSelect(max)\n break\n }\n },\n [isInteractive, allowHalf, value, max, handleSelect]\n )\n\n const containerStyle: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: config.gap,\n cursor: isInteractive ? 'pointer' : 'default',\n opacity: disabled ? 0.5 : 1,\n outline: 'none',\n }\n\n const starStyle = (index: number): CSSProperties => {\n const starValue = index + 1\n const isFilled = displayValue >= starValue\n const isHalfFilled = allowHalf && displayValue >= starValue - 0.5 && displayValue < starValue\n\n return {\n width: config.size,\n height: config.size,\n color: isFilled || isHalfFilled ? color : 'var(--brycks-border-default)',\n transition: `all ${durations.fast}ms ${easings.easeOut}`,\n transform: hoverValue !== null && hoverValue >= starValue ? 'scale(1.1)' : 'scale(1)',\n }\n }\n\n const renderStar = (index: number) => {\n const starValue = index + 1\n const isFilled = displayValue >= starValue\n const isHalfFilled = allowHalf && displayValue >= starValue - 0.5 && displayValue < starValue\n\n if (isHalfFilled) {\n return halfIcon || <StarIcon filled={false} half />\n }\n if (isFilled) {\n return filledIcon || <StarIcon filled />\n }\n return emptyIcon || <StarIcon filled={false} />\n }\n\n return (\n <div\n ref={ref}\n role=\"slider\"\n aria-label={ariaLabel}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={value}\n aria-valuetext={`${value} out of ${max} stars`}\n aria-disabled={disabled}\n aria-readonly={readOnly}\n tabIndex={isInteractive ? 0 : -1}\n className={cx(\n 'brycks-rating',\n `brycks-rating--${size}`,\n readOnly && 'brycks-rating--readonly',\n disabled && 'brycks-rating--disabled',\n className\n )}\n style={containerStyle}\n onKeyDown={handleKeyDown}\n onMouseLeave={() => isInteractive && setHoverValue(null)}\n data-testid={testId}\n >\n {Array.from({ length: max }, (_, index) => (\n <span\n key={index}\n style={starStyle(index)}\n onMouseMove={(e) => handleMouseMove(e, index)}\n onClick={(e) => handleClick(e, index)}\n >\n {renderStar(index)}\n </span>\n ))}\n </div>\n )\n})\n\nRating.displayName = 'Rating'\n"],"names":["sizeConfig","spacing","StarIcon","filled","half","jsxs","jsx","Rating","forwardRef","controlledValue","defaultValue","onChange","max","size","allowHalf","readOnly","disabled","allowClear","filledIcon","emptyIcon","halfIcon","color","ariaLabel","className","testId","ref","internalValue","setInternalValue","useState","hoverValue","setHoverValue","value","displayValue","config","isInteractive","handleSelect","useCallback","newValue","finalValue","handleMouseMove","e","starIndex","rect","isLeftHalf","handleClick","handleKeyDown","step","containerStyle","starStyle","index","starValue","isFilled","isHalfFilled","durations","easings","renderStar","cx","_"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),r=require("react"),V=require("../../../utils/styles.cjs"),A={sm:{track:4,thumb:14,fontSize:12},md:{track:6,thumb:18,fontSize:14},lg:{track:8,thumb:22,fontSize:16}},x=r.forwardRef(function({size:g="md",min:o=0,max:i=100,step:w=1,value:d,defaultValue:j=o,onChange:p,showValue:b=!1,formatValue:R=y=>String(y),label:f,disabled:n=!1,className:C,style:z,testId:M,...E},l){const[y,I]=r.useState(j),[c,u]=r.useState(!1),[$,m]=r.useState(!1),v=r.useRef(null),h=d??y,t=A[g],S=(h-o)/(i-o)*100,k=r.useCallback(e=>{const a=Math.max(o,Math.min(i,e));d===void 0&&I(a),p?.(a)},[d,o,i,p]);r.useEffect(()=>{const e=v.current;if(!e)return;const a=P=>{const U=P.target;k(parseFloat(U.value))};return e.addEventListener("input",a),()=>e.removeEventListener("input",a)},[k]);const D={display:"flex",flexDirection:"column",gap:8,opacity:n?.5:1,...z},q={display:"flex",alignItems:"center",justifyContent:"space-between",gap:12},L={fontSize:t.fontSize,fontWeight:500,color:"var(--brycks-foreground-default)"},N={fontSize:t.fontSize,fontWeight:500,color:"var(--brycks-foreground-muted)",fontVariantNumeric:"tabular-nums"},T={position:"relative",display:"flex",alignItems:"center",height:t.thumb,cursor:n?"not-allowed":"pointer"},H={position:"absolute",width:"100%",height:t.track,borderRadius:t.track/2,backgroundColor:"var(--brycks-background-muted)"},W={position:"absolute",left:0,height:t.track,width:`${S}%`,borderRadius:t.track/2,backgroundColor:n?"var(--brycks-foreground-muted)":"var(--brycks-primary-default)",transition:c?"none":"width 100ms ease-out"},F={position:"absolute",left:`calc(${S}% - ${t.thumb/2}px)`,width:t.thumb,height:t.thumb,borderRadius:"50%",backgroundColor:"white",border:`2px solid ${n?"var(--brycks-foreground-muted)":"var(--brycks-primary-default)"}`,boxShadow:c||$?"var(--brycks-shadow-md)":"var(--brycks-shadow-sm)",transform:c?"scale(1.1)":"scale(1)",transition:c?"transform 100ms ease-out, box-shadow 100ms ease-out":"all 100ms ease-out",pointerEvents:"none"},O={position:"absolute",width:"100%",height:t.thumb,margin:0,padding:0,opacity:0,cursor:n?"not-allowed":"pointer"};return s.jsxs("div",{className:V.cx("brycks-slider",`brycks-slider--${g}`,C),style:D,children:[(f||b)&&s.jsxs("div",{style:q,children:[f&&s.jsx("span",{style:L,children:f}),b&&s.jsx("span",{style:N,children:R(h)})]}),s.jsxs("div",{style:T,onMouseEnter:()=>m(!0),onMouseLeave:()=>m(!1),children:[s.jsx("div",{style:H}),s.jsx("div",{style:W}),s.jsx("div",{style:F}),s.jsx("input",{ref:e=>{v.current=e,typeof l=="function"?l(e):l&&(l.current=e)},type:"range",min:o,max:i,step:w,value:h,disabled:n,style:O,onMouseDown:()=>u(!0),onMouseUp:()=>u(!1),onTouchStart:()=>u(!0),onTouchEnd:()=>u(!1),"data-testid":M,...E})]})]})});x.displayName="Slider";exports.Slider=x;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react/jsx-runtime"),i=require("react"),J=require("../../../utils/styles.cjs"),m=require("../../../design-system/tokens/typography.cjs"),l=require("../../../design-system/tokens/spacing.cjs"),z=require("../../../design-system/primitives/sizing.cjs"),c=require("../../../design-system/tokens/motion.cjs"),Q={sm:{track:l.spacing[1],thumb:l.spacing[3.5],fontSize:m.fontSizes.sm},md:{track:z.componentGap.sm,thumb:l.spacing[4]+l.spacing[.5],fontSize:m.fontSizes.base},lg:{track:l.spacing[2],thumb:l.spacing[5]+l.spacing[.5],fontSize:m.fontSizes.md}},R=i.forwardRef(function({size:k="md",min:a=0,max:u=100,step:f=1,value:b,defaultValue:C=a,onChange:S,showValue:w=!1,formatValue:x=v=>String(v),label:p,disabled:d=!1,className:q,style:E,testId:M,...I},g){const[v,O]=i.useState(C),[y,h]=i.useState(!1),[A,D]=i.useState(!1),$=i.useRef(null),s=b??v,t=Q[k],j=(s-a)/(u-a)*100,r=i.useCallback(e=>{const n=Math.max(a,Math.min(u,e));b===void 0&&O(n),S?.(n)},[b,a,u,S]);i.useEffect(()=>{const e=$.current;if(!e)return;const n=V=>{const B=V.target;r(parseFloat(B.value))};return e.addEventListener("input",n),()=>e.removeEventListener("input",n)},[r]);const L=i.useCallback(e=>{const n=e.shiftKey?f*10:f;switch(e.key){case"ArrowRight":case"ArrowUp":e.preventDefault(),r(s+n);break;case"ArrowLeft":case"ArrowDown":e.preventDefault(),r(s-n);break;case"Home":e.preventDefault(),r(a);break;case"End":e.preventDefault(),r(u);break;case"PageUp":e.preventDefault(),r(s+n*10);break;case"PageDown":e.preventDefault(),r(s-n*10);break}},[s,f,a,u,r]),H={display:"flex",flexDirection:"column",gap:l.spacing[2],opacity:d?.5:1,...E},K={display:"flex",alignItems:"center",justifyContent:"space-between",gap:z.componentGap.xl},N={fontSize:t.fontSize,fontWeight:500,color:"var(--brycks-foreground-default)"},P={fontSize:t.fontSize,fontWeight:500,color:"var(--brycks-foreground-muted)",fontVariantNumeric:"tabular-nums"},T={position:"relative",display:"flex",alignItems:"center",height:t.thumb,cursor:d?"not-allowed":"pointer"},U={position:"absolute",width:"100%",height:t.track,borderRadius:t.track/2,backgroundColor:"var(--brycks-background-muted)"},G={position:"absolute",left:0,height:t.track,width:`${j}%`,borderRadius:t.track/2,backgroundColor:d?"var(--brycks-foreground-muted)":"var(--brycks-primary-default)",transition:y?"none":`width ${c.durations.fast}ms ${c.easings.easeOut}`},W={position:"absolute",left:`calc(${j}% - ${t.thumb/2}px)`,width:t.thumb,height:t.thumb,borderRadius:"50%",backgroundColor:"white",border:`2px solid ${d?"var(--brycks-foreground-muted)":"var(--brycks-primary-default)"}`,boxShadow:y||A?"var(--brycks-shadow-md)":"var(--brycks-shadow-sm)",transform:y?"scale(1.1)":"scale(1)",transition:y?`transform ${c.durations.fast}ms ${c.easings.easeOut}, box-shadow ${c.durations.fast}ms ${c.easings.easeOut}`:`all ${c.durations.fast}ms ${c.easings.easeOut}`,pointerEvents:"none"},F={position:"absolute",width:"100%",height:t.thumb,margin:0,padding:0,opacity:0,cursor:d?"not-allowed":"pointer"};return o.jsxs("div",{className:J.cx("brycks-slider",`brycks-slider--${k}`,q),style:H,children:[(p||w)&&o.jsxs("div",{style:K,children:[p&&o.jsx("span",{style:N,children:p}),w&&o.jsx("span",{style:P,children:x(s)})]}),o.jsxs("div",{style:T,onMouseEnter:()=>D(!0),onMouseLeave:()=>D(!1),children:[o.jsx("div",{style:U}),o.jsx("div",{style:G}),o.jsx("div",{style:W}),o.jsx("input",{ref:e=>{$.current=e,typeof g=="function"?g(e):g&&(g.current=e)},type:"range",role:"slider","aria-valuemin":a,"aria-valuemax":u,"aria-valuenow":s,"aria-valuetext":x(s),"aria-label":p,min:a,max:u,step:f,value:s,disabled:d,style:F,onKeyDown:L,onMouseDown:()=>h(!0),onMouseUp:()=>h(!1),onTouchStart:()=>h(!0),onTouchEnd:()=>h(!1),"data-testid":M,...I})]})]})});R.displayName="Slider";exports.Slider=R;
2
2
  //# sourceMappingURL=Slider.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Slider.cjs","sources":["../../../../src/components/form/Slider/Slider.tsx"],"sourcesContent":["/**\n * Slider Component\n *\n * Accessible range slider with custom styling.\n * Supports different sizes and shows value feedback.\n */\n\nimport {\n forwardRef,\n useState,\n useCallback,\n useRef,\n useEffect,\n type CSSProperties,\n type InputHTMLAttributes,\n} from 'react'\nimport { cx } from '../../../utils/styles'\n\nexport type SliderSize = 'sm' | 'md' | 'lg'\n\nexport interface SliderProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'type' | 'onChange'> {\n /** Slider size */\n size?: SliderSize\n /** Minimum value */\n min?: number\n /** Maximum value */\n max?: number\n /** Step increment */\n step?: number\n /** Current value (controlled) */\n value?: number\n /** Default value (uncontrolled) */\n defaultValue?: number\n /** Callback when value changes */\n onChange?: (value: number) => void\n /** Whether to show the value label */\n showValue?: boolean\n /** Format the value for display */\n formatValue?: (value: number) => string\n /** Label for the slider */\n label?: string\n /** Whether the slider is disabled */\n disabled?: boolean\n /** Custom class name */\n className?: string\n /** Test ID */\n testId?: string\n}\n\nconst sizeConfig: Record<SliderSize, { track: number; thumb: number; fontSize: number }> = {\n sm: { track: 4, thumb: 14, fontSize: 12 },\n md: { track: 6, thumb: 18, fontSize: 14 },\n lg: { track: 8, thumb: 22, fontSize: 16 },\n}\n\nexport const Slider = forwardRef<HTMLInputElement, SliderProps>(function Slider(\n {\n size = 'md',\n min = 0,\n max = 100,\n step = 1,\n value: controlledValue,\n defaultValue = min,\n onChange,\n showValue = false,\n formatValue = (v) => String(v),\n label,\n disabled = false,\n className,\n style,\n testId,\n ...props\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue)\n const [isDragging, setIsDragging] = useState(false)\n const [isHovered, setIsHovered] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n\n const value = controlledValue ?? internalValue\n const config = sizeConfig[size]\n const percentage = ((value - min) / (max - min)) * 100\n\n const handleChange = useCallback(\n (newValue: number) => {\n const clampedValue = Math.max(min, Math.min(max, newValue))\n if (controlledValue === undefined) {\n setInternalValue(clampedValue)\n }\n onChange?.(clampedValue)\n },\n [controlledValue, min, max, onChange]\n )\n\n useEffect(() => {\n const input = inputRef.current\n if (!input) return\n\n const handleInputChange = (e: Event) => {\n const target = e.target as HTMLInputElement\n handleChange(parseFloat(target.value))\n }\n\n input.addEventListener('input', handleInputChange)\n return () => input.removeEventListener('input', handleInputChange)\n }, [handleChange])\n\n const containerStyle: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n opacity: disabled ? 0.5 : 1,\n ...style,\n }\n\n const labelRowStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n }\n\n const labelStyle: CSSProperties = {\n fontSize: config.fontSize,\n fontWeight: 500,\n color: 'var(--brycks-foreground-default)',\n }\n\n const valueStyle: CSSProperties = {\n fontSize: config.fontSize,\n fontWeight: 500,\n color: 'var(--brycks-foreground-muted)',\n fontVariantNumeric: 'tabular-nums',\n }\n\n const sliderContainerStyle: CSSProperties = {\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n height: config.thumb,\n cursor: disabled ? 'not-allowed' : 'pointer',\n }\n\n const trackStyle: CSSProperties = {\n position: 'absolute',\n width: '100%',\n height: config.track,\n borderRadius: config.track / 2,\n backgroundColor: 'var(--brycks-background-muted)',\n }\n\n const fillStyle: CSSProperties = {\n position: 'absolute',\n left: 0,\n height: config.track,\n width: `${percentage}%`,\n borderRadius: config.track / 2,\n backgroundColor: disabled\n ? 'var(--brycks-foreground-muted)'\n : 'var(--brycks-primary-default)',\n transition: isDragging ? 'none' : 'width 100ms ease-out',\n }\n\n const thumbStyle: CSSProperties = {\n position: 'absolute',\n left: `calc(${percentage}% - ${config.thumb / 2}px)`,\n width: config.thumb,\n height: config.thumb,\n borderRadius: '50%',\n backgroundColor: 'white',\n border: `2px solid ${\n disabled ? 'var(--brycks-foreground-muted)' : 'var(--brycks-primary-default)'\n }`,\n boxShadow: isDragging || isHovered\n ? 'var(--brycks-shadow-md)'\n : 'var(--brycks-shadow-sm)',\n transform: isDragging ? 'scale(1.1)' : 'scale(1)',\n transition: isDragging\n ? 'transform 100ms ease-out, box-shadow 100ms ease-out'\n : 'all 100ms ease-out',\n pointerEvents: 'none',\n }\n\n const inputStyle: CSSProperties = {\n position: 'absolute',\n width: '100%',\n height: config.thumb,\n margin: 0,\n padding: 0,\n opacity: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n }\n\n return (\n <div className={cx('brycks-slider', `brycks-slider--${size}`, className)} style={containerStyle}>\n {(label || showValue) && (\n <div style={labelRowStyle}>\n {label && <span style={labelStyle}>{label}</span>}\n {showValue && <span style={valueStyle}>{formatValue(value)}</span>}\n </div>\n )}\n <div\n style={sliderContainerStyle}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n <div style={trackStyle} />\n <div style={fillStyle} />\n <div style={thumbStyle} />\n <input\n ref={(node) => {\n (inputRef as React.MutableRefObject<HTMLInputElement | null>).current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n }}\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={value}\n disabled={disabled}\n style={inputStyle}\n onMouseDown={() => setIsDragging(true)}\n onMouseUp={() => setIsDragging(false)}\n onTouchStart={() => setIsDragging(true)}\n onTouchEnd={() => setIsDragging(false)}\n data-testid={testId}\n {...props}\n />\n </div>\n </div>\n )\n})\n\nSlider.displayName = 'Slider'\n"],"names":["sizeConfig","Slider","forwardRef","size","min","max","step","controlledValue","defaultValue","onChange","showValue","formatValue","v","label","disabled","className","style","testId","props","ref","internalValue","setInternalValue","useState","isDragging","setIsDragging","isHovered","setIsHovered","inputRef","useRef","value","config","percentage","handleChange","useCallback","newValue","clampedValue","useEffect","input","handleInputChange","e","target","containerStyle","labelRowStyle","labelStyle","valueStyle","sliderContainerStyle","trackStyle","fillStyle","thumbStyle","inputStyle","jsxs","cx","jsx","node"],"mappings":"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"}
1
+ {"version":3,"file":"Slider.cjs","sources":["../../../../src/components/form/Slider/Slider.tsx"],"sourcesContent":["/**\n * Slider Component\n *\n * Accessible range slider with custom styling.\n * Supports different sizes and shows value feedback.\n */\n\nimport {\n forwardRef,\n useState,\n useCallback,\n useRef,\n useEffect,\n type CSSProperties,\n type InputHTMLAttributes,\n type KeyboardEvent,\n} from 'react'\nimport { cx } from '../../../utils/styles'\nimport { spacing, fontSizes, durations, easings } from '../../../design-system'\nimport { componentGap } from '../../../design-system/primitives'\n\nexport type SliderSize = 'sm' | 'md' | 'lg'\n\nexport interface SliderProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'type' | 'onChange'> {\n /** Slider size */\n size?: SliderSize\n /** Minimum value */\n min?: number\n /** Maximum value */\n max?: number\n /** Step increment */\n step?: number\n /** Current value (controlled) */\n value?: number\n /** Default value (uncontrolled) */\n defaultValue?: number\n /** Callback when value changes */\n onChange?: (value: number) => void\n /** Whether to show the value label */\n showValue?: boolean\n /** Format the value for display */\n formatValue?: (value: number) => string\n /** Label for the slider */\n label?: string\n /** Whether the slider is disabled */\n disabled?: boolean\n /** Custom class name */\n className?: string\n /** Test ID */\n testId?: string\n}\n\nconst sizeConfig: Record<SliderSize, { track: number; thumb: number; fontSize: number }> = {\n sm: { track: spacing[1], thumb: spacing[3.5], fontSize: fontSizes.sm },\n md: { track: componentGap.sm, thumb: spacing[4] + spacing[0.5], fontSize: fontSizes.base },\n lg: { track: spacing[2], thumb: spacing[5] + spacing[0.5], fontSize: fontSizes.md },\n}\n\nexport const Slider = forwardRef<HTMLInputElement, SliderProps>(function Slider(\n {\n size = 'md',\n min = 0,\n max = 100,\n step = 1,\n value: controlledValue,\n defaultValue = min,\n onChange,\n showValue = false,\n formatValue = (v) => String(v),\n label,\n disabled = false,\n className,\n style,\n testId,\n ...props\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue)\n const [isDragging, setIsDragging] = useState(false)\n const [isHovered, setIsHovered] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n\n const value = controlledValue ?? internalValue\n const config = sizeConfig[size]\n const percentage = ((value - min) / (max - min)) * 100\n\n const handleChange = useCallback(\n (newValue: number) => {\n const clampedValue = Math.max(min, Math.min(max, newValue))\n if (controlledValue === undefined) {\n setInternalValue(clampedValue)\n }\n onChange?.(clampedValue)\n },\n [controlledValue, min, max, onChange]\n )\n\n useEffect(() => {\n const input = inputRef.current\n if (!input) return\n\n const handleInputChange = (e: Event) => {\n const target = e.target as HTMLInputElement\n handleChange(parseFloat(target.value))\n }\n\n input.addEventListener('input', handleInputChange)\n return () => input.removeEventListener('input', handleInputChange)\n }, [handleChange])\n\n // Keyboard navigation for accessibility\n const handleKeyDown = useCallback((e: KeyboardEvent<HTMLInputElement>) => {\n const stepValue = e.shiftKey ? step * 10 : step\n\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n e.preventDefault()\n handleChange(value + stepValue)\n break\n case 'ArrowLeft':\n case 'ArrowDown':\n e.preventDefault()\n handleChange(value - stepValue)\n break\n case 'Home':\n e.preventDefault()\n handleChange(min)\n break\n case 'End':\n e.preventDefault()\n handleChange(max)\n break\n case 'PageUp':\n e.preventDefault()\n handleChange(value + stepValue * 10)\n break\n case 'PageDown':\n e.preventDefault()\n handleChange(value - stepValue * 10)\n break\n }\n }, [value, step, min, max, handleChange])\n\n const containerStyle: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: spacing[2],\n opacity: disabled ? 0.5 : 1,\n ...style,\n }\n\n const labelRowStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: componentGap.xl,\n }\n\n const labelStyle: CSSProperties = {\n fontSize: config.fontSize,\n fontWeight: 500,\n color: 'var(--brycks-foreground-default)',\n }\n\n const valueStyle: CSSProperties = {\n fontSize: config.fontSize,\n fontWeight: 500,\n color: 'var(--brycks-foreground-muted)',\n fontVariantNumeric: 'tabular-nums',\n }\n\n const sliderContainerStyle: CSSProperties = {\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n height: config.thumb,\n cursor: disabled ? 'not-allowed' : 'pointer',\n }\n\n const trackStyle: CSSProperties = {\n position: 'absolute',\n width: '100%',\n height: config.track,\n borderRadius: config.track / 2,\n backgroundColor: 'var(--brycks-background-muted)',\n }\n\n const fillStyle: CSSProperties = {\n position: 'absolute',\n left: 0,\n height: config.track,\n width: `${percentage}%`,\n borderRadius: config.track / 2,\n backgroundColor: disabled\n ? 'var(--brycks-foreground-muted)'\n : 'var(--brycks-primary-default)',\n transition: isDragging ? 'none' : `width ${durations.fast}ms ${easings.easeOut}`,\n }\n\n const thumbStyle: CSSProperties = {\n position: 'absolute',\n left: `calc(${percentage}% - ${config.thumb / 2}px)`,\n width: config.thumb,\n height: config.thumb,\n borderRadius: '50%',\n backgroundColor: 'white',\n border: `2px solid ${\n disabled ? 'var(--brycks-foreground-muted)' : 'var(--brycks-primary-default)'\n }`,\n boxShadow: isDragging || isHovered\n ? 'var(--brycks-shadow-md)'\n : 'var(--brycks-shadow-sm)',\n transform: isDragging ? 'scale(1.1)' : 'scale(1)',\n transition: isDragging\n ? `transform ${durations.fast}ms ${easings.easeOut}, box-shadow ${durations.fast}ms ${easings.easeOut}`\n : `all ${durations.fast}ms ${easings.easeOut}`,\n pointerEvents: 'none',\n }\n\n const inputStyle: CSSProperties = {\n position: 'absolute',\n width: '100%',\n height: config.thumb,\n margin: 0,\n padding: 0,\n opacity: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n }\n\n return (\n <div className={cx('brycks-slider', `brycks-slider--${size}`, className)} style={containerStyle}>\n {(label || showValue) && (\n <div style={labelRowStyle}>\n {label && <span style={labelStyle}>{label}</span>}\n {showValue && <span style={valueStyle}>{formatValue(value)}</span>}\n </div>\n )}\n <div\n style={sliderContainerStyle}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n <div style={trackStyle} />\n <div style={fillStyle} />\n <div style={thumbStyle} />\n <input\n ref={(node) => {\n (inputRef as React.MutableRefObject<HTMLInputElement | null>).current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n }}\n type=\"range\"\n role=\"slider\"\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n aria-valuetext={formatValue(value)}\n aria-label={label}\n min={min}\n max={max}\n step={step}\n value={value}\n disabled={disabled}\n style={inputStyle}\n onKeyDown={handleKeyDown}\n onMouseDown={() => setIsDragging(true)}\n onMouseUp={() => setIsDragging(false)}\n onTouchStart={() => setIsDragging(true)}\n onTouchEnd={() => setIsDragging(false)}\n data-testid={testId}\n {...props}\n />\n </div>\n </div>\n )\n})\n\nSlider.displayName = 'Slider'\n"],"names":["sizeConfig","spacing","fontSizes","componentGap","Slider","forwardRef","size","min","max","step","controlledValue","defaultValue","onChange","showValue","formatValue","label","disabled","className","style","testId","props","ref","internalValue","setInternalValue","useState","isDragging","setIsDragging","isHovered","setIsHovered","inputRef","useRef","value","config","percentage","handleChange","useCallback","newValue","clampedValue","useEffect","input","handleInputChange","e","target","handleKeyDown","stepValue","containerStyle","labelRowStyle","labelStyle","valueStyle","sliderContainerStyle","trackStyle","fillStyle","durations","easings","thumbStyle","inputStyle","jsxs","cx","jsx","node"],"mappings":"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"}
@@ -1,138 +1,173 @@
1
- import { jsxs as p, jsx as n } from "react/jsx-runtime";
2
- import { forwardRef as B, useState as y, useRef as G, useCallback as J, useEffect as K } from "react";
3
- import { cx as O } from "../../../utils/styles.js";
4
- const P = {
5
- sm: { track: 4, thumb: 14, fontSize: 12 },
6
- md: { track: 6, thumb: 18, fontSize: 14 },
7
- lg: { track: 8, thumb: 22, fontSize: 16 }
8
- }, Q = B(function({
9
- size: g = "md",
10
- min: o = 0,
11
- max: a = 100,
12
- step: x = 1,
13
- value: u,
14
- defaultValue: C = o,
15
- onChange: m,
16
- showValue: b = !1,
17
- formatValue: z = (f) => String(f),
18
- label: d,
19
- disabled: r = !1,
20
- className: R,
21
- style: E,
22
- testId: I,
23
- ...M
24
- }, i) {
25
- const [f, $] = y(C), [l, c] = y(!1), [D, v] = y(!1), k = G(null), h = u ?? f, t = P[g], S = (h - o) / (a - o) * 100, w = J(
1
+ import { jsxs as v, jsx as c } from "react/jsx-runtime";
2
+ import { forwardRef as X, useState as k, useRef as Y, useCallback as E, useEffect as Z } from "react";
3
+ import { cx as _ } from "../../../utils/styles.js";
4
+ import { fontSizes as w } from "../../../design-system/tokens/typography.js";
5
+ import { spacing as s } from "../../../design-system/tokens/spacing.js";
6
+ import { componentGap as I } from "../../../design-system/primitives/sizing.js";
7
+ import { durations as m, easings as y } from "../../../design-system/tokens/motion.js";
8
+ const ee = {
9
+ sm: { track: s[1], thumb: s[3.5], fontSize: w.sm },
10
+ md: { track: I.sm, thumb: s[4] + s[0.5], fontSize: w.base },
11
+ lg: { track: s[2], thumb: s[5] + s[0.5], fontSize: w.md }
12
+ }, te = X(function({
13
+ size: S = "md",
14
+ min: a = 0,
15
+ max: i = 100,
16
+ step: u = 1,
17
+ value: g,
18
+ defaultValue: M = a,
19
+ onChange: D,
20
+ showValue: $ = !1,
21
+ formatValue: x = (b) => String(b),
22
+ label: f,
23
+ disabled: l = !1,
24
+ className: A,
25
+ style: L,
26
+ testId: O,
27
+ ...j
28
+ }, d) {
29
+ const [b, H] = k(M), [p, h] = k(!1), [K, z] = k(!1), C = Y(null), r = g ?? b, t = ee[S], R = (r - a) / (i - a) * 100, n = E(
26
30
  (e) => {
27
- const s = Math.max(o, Math.min(a, e));
28
- u === void 0 && $(s), m?.(s);
31
+ const o = Math.max(a, Math.min(i, e));
32
+ g === void 0 && H(o), D?.(o);
29
33
  },
30
- [u, o, a, m]
34
+ [g, a, i, D]
31
35
  );
32
- K(() => {
33
- const e = k.current;
36
+ Z(() => {
37
+ const e = C.current;
34
38
  if (!e) return;
35
- const s = (q) => {
36
- const A = q.target;
37
- w(parseFloat(A.value));
39
+ const o = (J) => {
40
+ const Q = J.target;
41
+ n(parseFloat(Q.value));
38
42
  };
39
- return e.addEventListener("input", s), () => e.removeEventListener("input", s);
40
- }, [w]);
41
- const j = {
43
+ return e.addEventListener("input", o), () => e.removeEventListener("input", o);
44
+ }, [n]);
45
+ const N = E((e) => {
46
+ const o = e.shiftKey ? u * 10 : u;
47
+ switch (e.key) {
48
+ case "ArrowRight":
49
+ case "ArrowUp":
50
+ e.preventDefault(), n(r + o);
51
+ break;
52
+ case "ArrowLeft":
53
+ case "ArrowDown":
54
+ e.preventDefault(), n(r - o);
55
+ break;
56
+ case "Home":
57
+ e.preventDefault(), n(a);
58
+ break;
59
+ case "End":
60
+ e.preventDefault(), n(i);
61
+ break;
62
+ case "PageUp":
63
+ e.preventDefault(), n(r + o * 10);
64
+ break;
65
+ case "PageDown":
66
+ e.preventDefault(), n(r - o * 10);
67
+ break;
68
+ }
69
+ }, [r, u, a, i, n]), U = {
42
70
  display: "flex",
43
71
  flexDirection: "column",
44
- gap: 8,
45
- opacity: r ? 0.5 : 1,
46
- ...E
47
- }, L = {
72
+ gap: s[2],
73
+ opacity: l ? 0.5 : 1,
74
+ ...L
75
+ }, P = {
48
76
  display: "flex",
49
77
  alignItems: "center",
50
78
  justifyContent: "space-between",
51
- gap: 12
52
- }, N = {
79
+ gap: I.xl
80
+ }, T = {
53
81
  fontSize: t.fontSize,
54
82
  fontWeight: 500,
55
83
  color: "var(--brycks-foreground-default)"
56
- }, H = {
84
+ }, W = {
57
85
  fontSize: t.fontSize,
58
86
  fontWeight: 500,
59
87
  color: "var(--brycks-foreground-muted)",
60
88
  fontVariantNumeric: "tabular-nums"
61
- }, T = {
89
+ }, F = {
62
90
  position: "relative",
63
91
  display: "flex",
64
92
  alignItems: "center",
65
93
  height: t.thumb,
66
- cursor: r ? "not-allowed" : "pointer"
67
- }, W = {
94
+ cursor: l ? "not-allowed" : "pointer"
95
+ }, G = {
68
96
  position: "absolute",
69
97
  width: "100%",
70
98
  height: t.track,
71
99
  borderRadius: t.track / 2,
72
100
  backgroundColor: "var(--brycks-background-muted)"
73
- }, F = {
101
+ }, V = {
74
102
  position: "absolute",
75
103
  left: 0,
76
104
  height: t.track,
77
- width: `${S}%`,
105
+ width: `${R}%`,
78
106
  borderRadius: t.track / 2,
79
- backgroundColor: r ? "var(--brycks-foreground-muted)" : "var(--brycks-primary-default)",
80
- transition: l ? "none" : "width 100ms ease-out"
81
- }, U = {
107
+ backgroundColor: l ? "var(--brycks-foreground-muted)" : "var(--brycks-primary-default)",
108
+ transition: p ? "none" : `width ${m.fast}ms ${y.easeOut}`
109
+ }, q = {
82
110
  position: "absolute",
83
- left: `calc(${S}% - ${t.thumb / 2}px)`,
111
+ left: `calc(${R}% - ${t.thumb / 2}px)`,
84
112
  width: t.thumb,
85
113
  height: t.thumb,
86
114
  borderRadius: "50%",
87
115
  backgroundColor: "white",
88
- border: `2px solid ${r ? "var(--brycks-foreground-muted)" : "var(--brycks-primary-default)"}`,
89
- boxShadow: l || D ? "var(--brycks-shadow-md)" : "var(--brycks-shadow-sm)",
90
- transform: l ? "scale(1.1)" : "scale(1)",
91
- transition: l ? "transform 100ms ease-out, box-shadow 100ms ease-out" : "all 100ms ease-out",
116
+ border: `2px solid ${l ? "var(--brycks-foreground-muted)" : "var(--brycks-primary-default)"}`,
117
+ boxShadow: p || K ? "var(--brycks-shadow-md)" : "var(--brycks-shadow-sm)",
118
+ transform: p ? "scale(1.1)" : "scale(1)",
119
+ transition: p ? `transform ${m.fast}ms ${y.easeOut}, box-shadow ${m.fast}ms ${y.easeOut}` : `all ${m.fast}ms ${y.easeOut}`,
92
120
  pointerEvents: "none"
93
- }, V = {
121
+ }, B = {
94
122
  position: "absolute",
95
123
  width: "100%",
96
124
  height: t.thumb,
97
125
  margin: 0,
98
126
  padding: 0,
99
127
  opacity: 0,
100
- cursor: r ? "not-allowed" : "pointer"
128
+ cursor: l ? "not-allowed" : "pointer"
101
129
  };
102
- return /* @__PURE__ */ p("div", { className: O("brycks-slider", `brycks-slider--${g}`, R), style: j, children: [
103
- (d || b) && /* @__PURE__ */ p("div", { style: L, children: [
104
- d && /* @__PURE__ */ n("span", { style: N, children: d }),
105
- b && /* @__PURE__ */ n("span", { style: H, children: z(h) })
130
+ return /* @__PURE__ */ v("div", { className: _("brycks-slider", `brycks-slider--${S}`, A), style: U, children: [
131
+ (f || $) && /* @__PURE__ */ v("div", { style: P, children: [
132
+ f && /* @__PURE__ */ c("span", { style: T, children: f }),
133
+ $ && /* @__PURE__ */ c("span", { style: W, children: x(r) })
106
134
  ] }),
107
- /* @__PURE__ */ p(
135
+ /* @__PURE__ */ v(
108
136
  "div",
109
137
  {
110
- style: T,
111
- onMouseEnter: () => v(!0),
112
- onMouseLeave: () => v(!1),
138
+ style: F,
139
+ onMouseEnter: () => z(!0),
140
+ onMouseLeave: () => z(!1),
113
141
  children: [
114
- /* @__PURE__ */ n("div", { style: W }),
115
- /* @__PURE__ */ n("div", { style: F }),
116
- /* @__PURE__ */ n("div", { style: U }),
117
- /* @__PURE__ */ n(
142
+ /* @__PURE__ */ c("div", { style: G }),
143
+ /* @__PURE__ */ c("div", { style: V }),
144
+ /* @__PURE__ */ c("div", { style: q }),
145
+ /* @__PURE__ */ c(
118
146
  "input",
119
147
  {
120
148
  ref: (e) => {
121
- k.current = e, typeof i == "function" ? i(e) : i && (i.current = e);
149
+ C.current = e, typeof d == "function" ? d(e) : d && (d.current = e);
122
150
  },
123
151
  type: "range",
124
- min: o,
125
- max: a,
126
- step: x,
127
- value: h,
128
- disabled: r,
129
- style: V,
130
- onMouseDown: () => c(!0),
131
- onMouseUp: () => c(!1),
132
- onTouchStart: () => c(!0),
133
- onTouchEnd: () => c(!1),
134
- "data-testid": I,
135
- ...M
152
+ role: "slider",
153
+ "aria-valuemin": a,
154
+ "aria-valuemax": i,
155
+ "aria-valuenow": r,
156
+ "aria-valuetext": x(r),
157
+ "aria-label": f,
158
+ min: a,
159
+ max: i,
160
+ step: u,
161
+ value: r,
162
+ disabled: l,
163
+ style: B,
164
+ onKeyDown: N,
165
+ onMouseDown: () => h(!0),
166
+ onMouseUp: () => h(!1),
167
+ onTouchStart: () => h(!0),
168
+ onTouchEnd: () => h(!1),
169
+ "data-testid": O,
170
+ ...j
136
171
  }
137
172
  )
138
173
  ]
@@ -140,8 +175,8 @@ const P = {
140
175
  )
141
176
  ] });
142
177
  });
143
- Q.displayName = "Slider";
178
+ te.displayName = "Slider";
144
179
  export {
145
- Q as Slider
180
+ te as Slider
146
181
  };
147
182
  //# sourceMappingURL=Slider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Slider.js","sources":["../../../../src/components/form/Slider/Slider.tsx"],"sourcesContent":["/**\n * Slider Component\n *\n * Accessible range slider with custom styling.\n * Supports different sizes and shows value feedback.\n */\n\nimport {\n forwardRef,\n useState,\n useCallback,\n useRef,\n useEffect,\n type CSSProperties,\n type InputHTMLAttributes,\n} from 'react'\nimport { cx } from '../../../utils/styles'\n\nexport type SliderSize = 'sm' | 'md' | 'lg'\n\nexport interface SliderProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'type' | 'onChange'> {\n /** Slider size */\n size?: SliderSize\n /** Minimum value */\n min?: number\n /** Maximum value */\n max?: number\n /** Step increment */\n step?: number\n /** Current value (controlled) */\n value?: number\n /** Default value (uncontrolled) */\n defaultValue?: number\n /** Callback when value changes */\n onChange?: (value: number) => void\n /** Whether to show the value label */\n showValue?: boolean\n /** Format the value for display */\n formatValue?: (value: number) => string\n /** Label for the slider */\n label?: string\n /** Whether the slider is disabled */\n disabled?: boolean\n /** Custom class name */\n className?: string\n /** Test ID */\n testId?: string\n}\n\nconst sizeConfig: Record<SliderSize, { track: number; thumb: number; fontSize: number }> = {\n sm: { track: 4, thumb: 14, fontSize: 12 },\n md: { track: 6, thumb: 18, fontSize: 14 },\n lg: { track: 8, thumb: 22, fontSize: 16 },\n}\n\nexport const Slider = forwardRef<HTMLInputElement, SliderProps>(function Slider(\n {\n size = 'md',\n min = 0,\n max = 100,\n step = 1,\n value: controlledValue,\n defaultValue = min,\n onChange,\n showValue = false,\n formatValue = (v) => String(v),\n label,\n disabled = false,\n className,\n style,\n testId,\n ...props\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue)\n const [isDragging, setIsDragging] = useState(false)\n const [isHovered, setIsHovered] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n\n const value = controlledValue ?? internalValue\n const config = sizeConfig[size]\n const percentage = ((value - min) / (max - min)) * 100\n\n const handleChange = useCallback(\n (newValue: number) => {\n const clampedValue = Math.max(min, Math.min(max, newValue))\n if (controlledValue === undefined) {\n setInternalValue(clampedValue)\n }\n onChange?.(clampedValue)\n },\n [controlledValue, min, max, onChange]\n )\n\n useEffect(() => {\n const input = inputRef.current\n if (!input) return\n\n const handleInputChange = (e: Event) => {\n const target = e.target as HTMLInputElement\n handleChange(parseFloat(target.value))\n }\n\n input.addEventListener('input', handleInputChange)\n return () => input.removeEventListener('input', handleInputChange)\n }, [handleChange])\n\n const containerStyle: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n opacity: disabled ? 0.5 : 1,\n ...style,\n }\n\n const labelRowStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 12,\n }\n\n const labelStyle: CSSProperties = {\n fontSize: config.fontSize,\n fontWeight: 500,\n color: 'var(--brycks-foreground-default)',\n }\n\n const valueStyle: CSSProperties = {\n fontSize: config.fontSize,\n fontWeight: 500,\n color: 'var(--brycks-foreground-muted)',\n fontVariantNumeric: 'tabular-nums',\n }\n\n const sliderContainerStyle: CSSProperties = {\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n height: config.thumb,\n cursor: disabled ? 'not-allowed' : 'pointer',\n }\n\n const trackStyle: CSSProperties = {\n position: 'absolute',\n width: '100%',\n height: config.track,\n borderRadius: config.track / 2,\n backgroundColor: 'var(--brycks-background-muted)',\n }\n\n const fillStyle: CSSProperties = {\n position: 'absolute',\n left: 0,\n height: config.track,\n width: `${percentage}%`,\n borderRadius: config.track / 2,\n backgroundColor: disabled\n ? 'var(--brycks-foreground-muted)'\n : 'var(--brycks-primary-default)',\n transition: isDragging ? 'none' : 'width 100ms ease-out',\n }\n\n const thumbStyle: CSSProperties = {\n position: 'absolute',\n left: `calc(${percentage}% - ${config.thumb / 2}px)`,\n width: config.thumb,\n height: config.thumb,\n borderRadius: '50%',\n backgroundColor: 'white',\n border: `2px solid ${\n disabled ? 'var(--brycks-foreground-muted)' : 'var(--brycks-primary-default)'\n }`,\n boxShadow: isDragging || isHovered\n ? 'var(--brycks-shadow-md)'\n : 'var(--brycks-shadow-sm)',\n transform: isDragging ? 'scale(1.1)' : 'scale(1)',\n transition: isDragging\n ? 'transform 100ms ease-out, box-shadow 100ms ease-out'\n : 'all 100ms ease-out',\n pointerEvents: 'none',\n }\n\n const inputStyle: CSSProperties = {\n position: 'absolute',\n width: '100%',\n height: config.thumb,\n margin: 0,\n padding: 0,\n opacity: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n }\n\n return (\n <div className={cx('brycks-slider', `brycks-slider--${size}`, className)} style={containerStyle}>\n {(label || showValue) && (\n <div style={labelRowStyle}>\n {label && <span style={labelStyle}>{label}</span>}\n {showValue && <span style={valueStyle}>{formatValue(value)}</span>}\n </div>\n )}\n <div\n style={sliderContainerStyle}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n <div style={trackStyle} />\n <div style={fillStyle} />\n <div style={thumbStyle} />\n <input\n ref={(node) => {\n (inputRef as React.MutableRefObject<HTMLInputElement | null>).current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n }}\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={value}\n disabled={disabled}\n style={inputStyle}\n onMouseDown={() => setIsDragging(true)}\n onMouseUp={() => setIsDragging(false)}\n onTouchStart={() => setIsDragging(true)}\n onTouchEnd={() => setIsDragging(false)}\n data-testid={testId}\n {...props}\n />\n </div>\n </div>\n )\n})\n\nSlider.displayName = 'Slider'\n"],"names":["sizeConfig","Slider","forwardRef","size","min","max","step","controlledValue","defaultValue","onChange","showValue","formatValue","v","label","disabled","className","style","testId","props","ref","internalValue","setInternalValue","useState","isDragging","setIsDragging","isHovered","setIsHovered","inputRef","useRef","value","config","percentage","handleChange","useCallback","newValue","clampedValue","useEffect","input","handleInputChange","e","target","containerStyle","labelRowStyle","labelStyle","valueStyle","sliderContainerStyle","trackStyle","fillStyle","thumbStyle","inputStyle","jsxs","cx","jsx","node"],"mappings":"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"}
1
+ {"version":3,"file":"Slider.js","sources":["../../../../src/components/form/Slider/Slider.tsx"],"sourcesContent":["/**\n * Slider Component\n *\n * Accessible range slider with custom styling.\n * Supports different sizes and shows value feedback.\n */\n\nimport {\n forwardRef,\n useState,\n useCallback,\n useRef,\n useEffect,\n type CSSProperties,\n type InputHTMLAttributes,\n type KeyboardEvent,\n} from 'react'\nimport { cx } from '../../../utils/styles'\nimport { spacing, fontSizes, durations, easings } from '../../../design-system'\nimport { componentGap } from '../../../design-system/primitives'\n\nexport type SliderSize = 'sm' | 'md' | 'lg'\n\nexport interface SliderProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'type' | 'onChange'> {\n /** Slider size */\n size?: SliderSize\n /** Minimum value */\n min?: number\n /** Maximum value */\n max?: number\n /** Step increment */\n step?: number\n /** Current value (controlled) */\n value?: number\n /** Default value (uncontrolled) */\n defaultValue?: number\n /** Callback when value changes */\n onChange?: (value: number) => void\n /** Whether to show the value label */\n showValue?: boolean\n /** Format the value for display */\n formatValue?: (value: number) => string\n /** Label for the slider */\n label?: string\n /** Whether the slider is disabled */\n disabled?: boolean\n /** Custom class name */\n className?: string\n /** Test ID */\n testId?: string\n}\n\nconst sizeConfig: Record<SliderSize, { track: number; thumb: number; fontSize: number }> = {\n sm: { track: spacing[1], thumb: spacing[3.5], fontSize: fontSizes.sm },\n md: { track: componentGap.sm, thumb: spacing[4] + spacing[0.5], fontSize: fontSizes.base },\n lg: { track: spacing[2], thumb: spacing[5] + spacing[0.5], fontSize: fontSizes.md },\n}\n\nexport const Slider = forwardRef<HTMLInputElement, SliderProps>(function Slider(\n {\n size = 'md',\n min = 0,\n max = 100,\n step = 1,\n value: controlledValue,\n defaultValue = min,\n onChange,\n showValue = false,\n formatValue = (v) => String(v),\n label,\n disabled = false,\n className,\n style,\n testId,\n ...props\n },\n ref\n) {\n const [internalValue, setInternalValue] = useState(defaultValue)\n const [isDragging, setIsDragging] = useState(false)\n const [isHovered, setIsHovered] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n\n const value = controlledValue ?? internalValue\n const config = sizeConfig[size]\n const percentage = ((value - min) / (max - min)) * 100\n\n const handleChange = useCallback(\n (newValue: number) => {\n const clampedValue = Math.max(min, Math.min(max, newValue))\n if (controlledValue === undefined) {\n setInternalValue(clampedValue)\n }\n onChange?.(clampedValue)\n },\n [controlledValue, min, max, onChange]\n )\n\n useEffect(() => {\n const input = inputRef.current\n if (!input) return\n\n const handleInputChange = (e: Event) => {\n const target = e.target as HTMLInputElement\n handleChange(parseFloat(target.value))\n }\n\n input.addEventListener('input', handleInputChange)\n return () => input.removeEventListener('input', handleInputChange)\n }, [handleChange])\n\n // Keyboard navigation for accessibility\n const handleKeyDown = useCallback((e: KeyboardEvent<HTMLInputElement>) => {\n const stepValue = e.shiftKey ? step * 10 : step\n\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n e.preventDefault()\n handleChange(value + stepValue)\n break\n case 'ArrowLeft':\n case 'ArrowDown':\n e.preventDefault()\n handleChange(value - stepValue)\n break\n case 'Home':\n e.preventDefault()\n handleChange(min)\n break\n case 'End':\n e.preventDefault()\n handleChange(max)\n break\n case 'PageUp':\n e.preventDefault()\n handleChange(value + stepValue * 10)\n break\n case 'PageDown':\n e.preventDefault()\n handleChange(value - stepValue * 10)\n break\n }\n }, [value, step, min, max, handleChange])\n\n const containerStyle: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: spacing[2],\n opacity: disabled ? 0.5 : 1,\n ...style,\n }\n\n const labelRowStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: componentGap.xl,\n }\n\n const labelStyle: CSSProperties = {\n fontSize: config.fontSize,\n fontWeight: 500,\n color: 'var(--brycks-foreground-default)',\n }\n\n const valueStyle: CSSProperties = {\n fontSize: config.fontSize,\n fontWeight: 500,\n color: 'var(--brycks-foreground-muted)',\n fontVariantNumeric: 'tabular-nums',\n }\n\n const sliderContainerStyle: CSSProperties = {\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n height: config.thumb,\n cursor: disabled ? 'not-allowed' : 'pointer',\n }\n\n const trackStyle: CSSProperties = {\n position: 'absolute',\n width: '100%',\n height: config.track,\n borderRadius: config.track / 2,\n backgroundColor: 'var(--brycks-background-muted)',\n }\n\n const fillStyle: CSSProperties = {\n position: 'absolute',\n left: 0,\n height: config.track,\n width: `${percentage}%`,\n borderRadius: config.track / 2,\n backgroundColor: disabled\n ? 'var(--brycks-foreground-muted)'\n : 'var(--brycks-primary-default)',\n transition: isDragging ? 'none' : `width ${durations.fast}ms ${easings.easeOut}`,\n }\n\n const thumbStyle: CSSProperties = {\n position: 'absolute',\n left: `calc(${percentage}% - ${config.thumb / 2}px)`,\n width: config.thumb,\n height: config.thumb,\n borderRadius: '50%',\n backgroundColor: 'white',\n border: `2px solid ${\n disabled ? 'var(--brycks-foreground-muted)' : 'var(--brycks-primary-default)'\n }`,\n boxShadow: isDragging || isHovered\n ? 'var(--brycks-shadow-md)'\n : 'var(--brycks-shadow-sm)',\n transform: isDragging ? 'scale(1.1)' : 'scale(1)',\n transition: isDragging\n ? `transform ${durations.fast}ms ${easings.easeOut}, box-shadow ${durations.fast}ms ${easings.easeOut}`\n : `all ${durations.fast}ms ${easings.easeOut}`,\n pointerEvents: 'none',\n }\n\n const inputStyle: CSSProperties = {\n position: 'absolute',\n width: '100%',\n height: config.thumb,\n margin: 0,\n padding: 0,\n opacity: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n }\n\n return (\n <div className={cx('brycks-slider', `brycks-slider--${size}`, className)} style={containerStyle}>\n {(label || showValue) && (\n <div style={labelRowStyle}>\n {label && <span style={labelStyle}>{label}</span>}\n {showValue && <span style={valueStyle}>{formatValue(value)}</span>}\n </div>\n )}\n <div\n style={sliderContainerStyle}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n <div style={trackStyle} />\n <div style={fillStyle} />\n <div style={thumbStyle} />\n <input\n ref={(node) => {\n (inputRef as React.MutableRefObject<HTMLInputElement | null>).current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) ref.current = node\n }}\n type=\"range\"\n role=\"slider\"\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n aria-valuetext={formatValue(value)}\n aria-label={label}\n min={min}\n max={max}\n step={step}\n value={value}\n disabled={disabled}\n style={inputStyle}\n onKeyDown={handleKeyDown}\n onMouseDown={() => setIsDragging(true)}\n onMouseUp={() => setIsDragging(false)}\n onTouchStart={() => setIsDragging(true)}\n onTouchEnd={() => setIsDragging(false)}\n data-testid={testId}\n {...props}\n />\n </div>\n </div>\n )\n})\n\nSlider.displayName = 'Slider'\n"],"names":["sizeConfig","spacing","fontSizes","componentGap","Slider","forwardRef","size","min","max","step","controlledValue","defaultValue","onChange","showValue","formatValue","v","label","disabled","className","style","testId","props","ref","internalValue","setInternalValue","useState","isDragging","setIsDragging","isHovered","setIsHovered","inputRef","useRef","value","config","percentage","handleChange","useCallback","newValue","clampedValue","useEffect","input","handleInputChange","e","target","handleKeyDown","stepValue","containerStyle","labelRowStyle","labelStyle","valueStyle","sliderContainerStyle","trackStyle","fillStyle","durations","easings","thumbStyle","inputStyle","jsxs","cx","jsx","node"],"mappings":"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"}