pixelize-design-library 2.4.2-beta.2 → 2.4.2-beta.20

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 (192) hide show
  1. package/dist/Components/Accordion/Accordion.js +2 -2
  2. package/dist/Components/Button/Button.d.ts +2 -2
  3. package/dist/Components/Button/Button.js +3 -3
  4. package/dist/Components/Button/Button.styles.js +4 -3
  5. package/dist/Components/Button/ButtonProps.d.ts +6 -1
  6. package/dist/Components/ButtonGroupIcon/ButtonGroupIcon.js +6 -6
  7. package/dist/Components/Card/Card.d.ts +1 -1
  8. package/dist/Components/Card/Card.js +2 -2
  9. package/dist/Components/Card/CardProps.d.ts +0 -1
  10. package/dist/Components/Checkbox/Checkbox.js +1 -1
  11. package/dist/Components/Checkbox/Checkbox.styles.js +2 -0
  12. package/dist/Components/Common/fieldStyles.js +1 -1
  13. package/dist/Components/CopyButton/CopyButton.js +1 -1
  14. package/dist/Components/CustomModulesTable/EditModuleModal.js +1 -1
  15. package/dist/Components/DatePicker/CalendarPanel.js +1 -1
  16. package/dist/Components/DatePicker/RangeDatePicker.js +2 -2
  17. package/dist/Components/DatePicker/SingleDatePicker.js +2 -2
  18. package/dist/Components/DatePicker/TimeOnlyPicker.js +1 -1
  19. package/dist/Components/Dropdown/DropDown.js +3 -13
  20. package/dist/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.js +1 -1
  21. package/dist/Components/FilePreview/FilePreview.js +1 -1
  22. package/dist/Components/FileUpload/FileUpload.js +3 -2
  23. package/dist/Components/FileUpload/FileUploadProps.d.ts +2 -1
  24. package/dist/Components/FileUpload/constants.js +1 -0
  25. package/dist/Components/FilterSidebar/FilterSidebar.js +4 -4
  26. package/dist/Components/Form/FormWrapper.js +1 -1
  27. package/dist/Components/Input/TextInput.styles.js +6 -4
  28. package/dist/Components/InputTextArea/InputTextArea.style.js +5 -4
  29. package/dist/Components/KanbanBoard/KanbanBoard.js +5 -45
  30. package/dist/Components/LimitReachedModal/LimitReachedModal.js +4 -5
  31. package/dist/Components/MultiSelect/MultiSelect.js +1 -1
  32. package/dist/Components/NavigationBar/NavigationBar.js +3 -3
  33. package/dist/Components/NoteTextArea/NoteTextArea.js +5 -3
  34. package/dist/Components/NumberInput/NumberInput.styles.js +5 -4
  35. package/dist/Components/OrgSwitcher/OrgSwitcher.js +2 -2
  36. package/dist/Components/PinInput/PinInput.js +1 -1
  37. package/dist/Components/PlanPill/PlanPill.js +5 -5
  38. package/dist/Components/PlanPill/planPillGradient.d.ts +2 -14
  39. package/dist/Components/PlanPill/planPillGradient.js +3 -15
  40. package/dist/Components/ProductCard/ProductPrice.js +1 -1
  41. package/dist/Components/ProfileCard/ProfileCard.js +1 -1
  42. package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +1 -1
  43. package/dist/Components/RadioButton/RadioButton.js +1 -1
  44. package/dist/Components/Reorder/Reorder.js +1 -1
  45. package/dist/Components/ScrollbarBox/ScrollbarBox.d.ts +13 -0
  46. package/dist/Components/ScrollbarBox/ScrollbarBox.js +11 -0
  47. package/dist/Components/SearchSelect/SearchSelect.js +5 -4
  48. package/dist/Components/Select/Select.styles.js +3 -2
  49. package/dist/Components/SelectSearch/SelectSearch.js +3 -3
  50. package/dist/Components/SelectV2/SelectV2.js +5 -11
  51. package/dist/Components/SideBar/SecondaryBar.js +1 -1
  52. package/dist/Components/StageProgress/StageProgress.js +2 -9
  53. package/dist/Components/Table/Table.d.ts +1 -1
  54. package/dist/Components/Table/Table.js +17 -24
  55. package/dist/Components/Table/TableProps.d.ts +4 -0
  56. package/dist/Components/Table/components/TableActions.js +2 -2
  57. package/dist/Components/Table/components/TableBody.js +41 -12
  58. package/dist/Components/Table/components/TableGroupRow.js +1 -1
  59. package/dist/Components/Table/components/TableHeader.js +21 -8
  60. package/dist/Components/Table/components/TableSearch.js +1 -1
  61. package/dist/Components/Table/filters/ActiveFilters.js +2 -18
  62. package/dist/Components/Table/settings/ManageColumns.js +3 -17
  63. package/dist/Components/Table/settings/TableSettings.js +5 -11
  64. package/dist/Components/Table/variants/TableVariantContext.d.ts +4 -0
  65. package/dist/Components/Table/variants/TableVariantContext.js +17 -0
  66. package/dist/Components/Table/variants/classic.d.ts +6 -0
  67. package/dist/Components/Table/variants/classic.js +47 -0
  68. package/dist/Components/Table/variants/index.d.ts +7 -0
  69. package/dist/Components/Table/variants/index.js +27 -0
  70. package/dist/Components/Table/variants/pillInk.d.ts +6 -0
  71. package/dist/Components/Table/variants/pillInk.js +21 -0
  72. package/dist/Components/Table/variants/studio.d.ts +6 -0
  73. package/dist/Components/Table/variants/studio.js +50 -0
  74. package/dist/Components/Table/variants/tokens.d.ts +49 -0
  75. package/dist/Components/Table/variants/tokens.js +2 -0
  76. package/dist/Components/Timeline/Timeline.js +2 -2
  77. package/dist/Components/Toaster/Toaster.js +1 -1
  78. package/dist/Components/Trail/TrailWorks.js +1 -1
  79. package/dist/Components/UpgradeButton/UpgradeButton.js +3 -3
  80. package/dist/Constants/Sidebar.js +3 -2
  81. package/dist/Theme/chakra/Menu.styles.d.ts +9 -6
  82. package/dist/Theme/chakra/Menu.styles.js +11 -5
  83. package/dist/Theme/chakra/Popover.styles.d.ts +6 -3
  84. package/dist/Theme/chakra/Popover.styles.js +11 -6
  85. package/dist/Theme/chakra/Switch.styles.d.ts +1 -1
  86. package/dist/Theme/chakra/Switch.styles.js +7 -9
  87. package/dist/Theme/chakra/componentStyles.d.ts +15 -9
  88. package/dist/Theme/chakra/createBrandTheme.js +3 -16
  89. package/dist/Theme/provider/PixelizeThemeProvider.js +18 -20
  90. package/dist/Theme/provider/ThemeSwitcher.js +13 -20
  91. package/dist/Theme/tokens/brands/lavender/palette.light.js +2 -6
  92. package/dist/Theme/tokens/brands/slate/palette.light.js +1 -5
  93. package/dist/Theme/tokens/builders/chartColorsFromTheme.js +1 -1
  94. package/dist/Theme/tokens/builders/gradientInk.d.ts +22 -0
  95. package/dist/Theme/tokens/builders/gradientInk.js +28 -0
  96. package/dist/Theme/tokens/builders/index.d.ts +3 -0
  97. package/dist/Theme/tokens/builders/index.js +3 -0
  98. package/dist/Theme/tokens/builders/outlineRung.d.ts +32 -3
  99. package/dist/Theme/tokens/builders/outlineRung.js +74 -5
  100. package/dist/Theme/tokens/builders/placeholderInk.d.ts +19 -0
  101. package/dist/Theme/tokens/builders/placeholderInk.js +35 -0
  102. package/dist/Theme/tokens/builders/resolvedRungs.d.ts +5 -1
  103. package/dist/Theme/tokens/builders/resolvedRungs.js +7 -2
  104. package/dist/Theme/tokens/builders/scrollbar.d.ts +12 -0
  105. package/dist/Theme/tokens/builders/scrollbar.js +57 -0
  106. package/dist/Theme/tokens/builders/surfaceRungs.d.ts +5 -0
  107. package/dist/Theme/tokens/builders/surfaceRungs.js +20 -5
  108. package/dist/esm/Components/Accordion/Accordion.js +2 -2
  109. package/dist/esm/Components/Button/Button.js +4 -4
  110. package/dist/esm/Components/Button/Button.styles.js +5 -4
  111. package/dist/esm/Components/ButtonGroupIcon/ButtonGroupIcon.js +6 -6
  112. package/dist/esm/Components/Card/Card.js +2 -2
  113. package/dist/esm/Components/Checkbox/Checkbox.js +1 -1
  114. package/dist/esm/Components/Checkbox/Checkbox.styles.js +2 -0
  115. package/dist/esm/Components/Common/fieldStyles.js +1 -1
  116. package/dist/esm/Components/CopyButton/CopyButton.js +1 -1
  117. package/dist/esm/Components/CustomModulesTable/EditModuleModal.js +1 -1
  118. package/dist/esm/Components/DatePicker/CalendarPanel.js +1 -1
  119. package/dist/esm/Components/DatePicker/RangeDatePicker.js +2 -2
  120. package/dist/esm/Components/DatePicker/SingleDatePicker.js +2 -2
  121. package/dist/esm/Components/DatePicker/TimeOnlyPicker.js +1 -1
  122. package/dist/esm/Components/Dropdown/DropDown.js +3 -13
  123. package/dist/esm/Components/EmailCards/VerifyEmailOtp/VerifyEmailOtp.js +1 -1
  124. package/dist/esm/Components/FilePreview/FilePreview.js +1 -1
  125. package/dist/esm/Components/FileUpload/FileUpload.js +4 -3
  126. package/dist/esm/Components/FileUpload/constants.js +1 -0
  127. package/dist/esm/Components/FilterSidebar/FilterSidebar.js +4 -4
  128. package/dist/esm/Components/Form/FormWrapper.js +1 -1
  129. package/dist/esm/Components/Input/TextInput.styles.js +6 -4
  130. package/dist/esm/Components/InputTextArea/InputTextArea.style.js +5 -4
  131. package/dist/esm/Components/KanbanBoard/KanbanBoard.js +5 -45
  132. package/dist/esm/Components/LimitReachedModal/LimitReachedModal.js +4 -5
  133. package/dist/esm/Components/MultiSelect/MultiSelect.js +1 -1
  134. package/dist/esm/Components/NavigationBar/NavigationBar.js +3 -3
  135. package/dist/esm/Components/NoteTextArea/NoteTextArea.js +5 -3
  136. package/dist/esm/Components/NumberInput/NumberInput.styles.js +5 -4
  137. package/dist/esm/Components/OrgSwitcher/OrgSwitcher.js +2 -2
  138. package/dist/esm/Components/PinInput/PinInput.js +1 -1
  139. package/dist/esm/Components/PlanPill/PlanPill.js +6 -6
  140. package/dist/esm/Components/PlanPill/planPillGradient.js +3 -15
  141. package/dist/esm/Components/ProductCard/ProductPrice.js +1 -1
  142. package/dist/esm/Components/ProfileCard/ProfileCard.js +1 -1
  143. package/dist/esm/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +1 -1
  144. package/dist/esm/Components/RadioButton/RadioButton.js +1 -1
  145. package/dist/esm/Components/Reorder/Reorder.js +1 -1
  146. package/dist/esm/Components/ScrollbarBox/ScrollbarBox.js +9 -0
  147. package/dist/esm/Components/SearchSelect/SearchSelect.js +5 -4
  148. package/dist/esm/Components/Select/Select.styles.js +3 -2
  149. package/dist/esm/Components/SelectSearch/SelectSearch.js +3 -3
  150. package/dist/esm/Components/SelectV2/SelectV2.js +5 -11
  151. package/dist/esm/Components/SideBar/SecondaryBar.js +1 -1
  152. package/dist/esm/Components/StageProgress/StageProgress.js +2 -9
  153. package/dist/esm/Components/Table/Table.js +17 -24
  154. package/dist/esm/Components/Table/components/TableActions.js +2 -2
  155. package/dist/esm/Components/Table/components/TableBody.js +42 -13
  156. package/dist/esm/Components/Table/components/TableGroupRow.js +1 -1
  157. package/dist/esm/Components/Table/components/TableHeader.js +21 -8
  158. package/dist/esm/Components/Table/components/TableSearch.js +1 -1
  159. package/dist/esm/Components/Table/filters/ActiveFilters.js +2 -18
  160. package/dist/esm/Components/Table/settings/ManageColumns.js +3 -17
  161. package/dist/esm/Components/Table/settings/TableSettings.js +5 -11
  162. package/dist/esm/Components/Table/variants/TableVariantContext.js +13 -0
  163. package/dist/esm/Components/Table/variants/classic.js +43 -0
  164. package/dist/esm/Components/Table/variants/index.js +9 -0
  165. package/dist/esm/Components/Table/variants/pillInk.js +18 -0
  166. package/dist/esm/Components/Table/variants/studio.js +46 -0
  167. package/dist/esm/Components/Table/variants/tokens.js +1 -0
  168. package/dist/esm/Components/Timeline/Timeline.js +2 -2
  169. package/dist/esm/Components/Toaster/Toaster.js +1 -1
  170. package/dist/esm/Components/Trail/TrailWorks.js +1 -1
  171. package/dist/esm/Components/UpgradeButton/UpgradeButton.js +3 -3
  172. package/dist/esm/Constants/Sidebar.js +3 -2
  173. package/dist/esm/Theme/chakra/Menu.styles.js +11 -5
  174. package/dist/esm/Theme/chakra/Popover.styles.js +11 -6
  175. package/dist/esm/Theme/chakra/Switch.styles.js +7 -9
  176. package/dist/esm/Theme/chakra/createBrandTheme.js +3 -16
  177. package/dist/esm/Theme/provider/PixelizeThemeProvider.js +18 -20
  178. package/dist/esm/Theme/provider/ThemeSwitcher.js +13 -20
  179. package/dist/esm/Theme/tokens/brands/lavender/palette.light.js +2 -6
  180. package/dist/esm/Theme/tokens/brands/slate/palette.light.js +1 -5
  181. package/dist/esm/Theme/tokens/builders/chartColorsFromTheme.js +1 -1
  182. package/dist/esm/Theme/tokens/builders/gradientInk.js +22 -0
  183. package/dist/esm/Theme/tokens/builders/index.js +3 -0
  184. package/dist/esm/Theme/tokens/builders/outlineRung.js +70 -4
  185. package/dist/esm/Theme/tokens/builders/placeholderInk.js +29 -0
  186. package/dist/esm/Theme/tokens/builders/resolvedRungs.js +7 -2
  187. package/dist/esm/Theme/tokens/builders/scrollbar.js +52 -0
  188. package/dist/esm/Theme/tokens/builders/surfaceRungs.js +20 -5
  189. package/dist/esm/index.js +5 -1
  190. package/dist/index.d.ts +10 -2
  191. package/dist/index.js +17 -3
  192. package/package.json +4 -2
@@ -70,26 +70,29 @@ export declare const componentStyles: {
70
70
  Menu: {
71
71
  baseStyle?: (({ theme }: StyleFunctionProps) => {
72
72
  list: {
73
- [x: string]: any;
73
+ [x: string]: string;
74
74
  bg: string;
75
- color: any;
75
+ color: string;
76
+ borderWidth: string;
77
+ borderStyle: string;
78
+ borderColor: string;
76
79
  };
77
80
  item: {
78
81
  bg: string;
79
82
  _focus: {
80
- [x: string]: any;
83
+ [x: string]: string;
81
84
  bg: string;
82
85
  };
83
86
  _hover: {
84
- [x: string]: any;
87
+ [x: string]: string;
85
88
  bg: string;
86
89
  };
87
90
  _active: {
88
- [x: string]: any;
91
+ [x: string]: string;
89
92
  bg: string;
90
93
  };
91
94
  _expanded: {
92
- [x: string]: any;
95
+ [x: string]: string;
93
96
  bg: string;
94
97
  };
95
98
  };
@@ -139,9 +142,12 @@ export declare const componentStyles: {
139
142
  Popover: {
140
143
  baseStyle?: (({ theme }: StyleFunctionProps) => {
141
144
  content: {
142
- [x: string]: any;
145
+ [x: string]: string;
143
146
  bg: string;
144
- color: any;
147
+ color: string;
148
+ borderWidth: string;
149
+ borderStyle: string;
150
+ borderColor: string;
145
151
  };
146
152
  }) | undefined;
147
153
  sizes?: {
@@ -188,7 +194,7 @@ export declare const componentStyles: {
188
194
  Switch: {
189
195
  baseStyle?: (({ theme }: StyleFunctionProps) => {
190
196
  thumb: {
191
- [x: string]: any;
197
+ [x: string]: string;
192
198
  bg: string;
193
199
  };
194
200
  }) | undefined;
@@ -9,6 +9,7 @@ const common_web_1 = __importDefault(require("./common.web"));
9
9
  const fonts_web_1 = __importDefault(require("./fonts.web"));
10
10
  const componentStyles_1 = require("./componentStyles");
11
11
  const accentText_1 = require("../tokens/builders/accentText");
12
+ const scrollbar_1 = require("../tokens/builders/scrollbar");
12
13
  /**
13
14
  * Builds a Chakra theme from a pure brand palette.
14
15
  *
@@ -89,22 +90,8 @@ const createBrandTheme = (palette, options = {}) => {
89
90
  color: (0, accentText_1.onFilled)(palette.primary[500], palette.white, palette.black),
90
91
  },
91
92
  // `color-scheme: dark` gives WebKit/Blink a dark scrollbar by default, but it's the
92
- // OS's generic dark gray, not brand-aware — style it explicitly so it matches the
93
- // canvas instead of floating as a mismatched gray bar.
94
- "::-webkit-scrollbar": {
95
- width: "10px",
96
- height: "10px",
97
- },
98
- "::-webkit-scrollbar-track": {
99
- background: palette.backgroundColor.main,
100
- },
101
- "::-webkit-scrollbar-thumb": {
102
- background: palette.gray[600],
103
- borderRadius: "6px",
104
- },
105
- "::-webkit-scrollbar-thumb:hover": {
106
- background: palette.gray[500],
107
- },
93
+ // OS's generic dark gray, not brand-aware.
94
+ ...(0, scrollbar_1.globalScrollbarStyles)(palette),
108
95
  // Chrome/Edge autofill paints its own opaque yellow/white fill behind the input
109
96
  // text via `-webkit-box-shadow` (not `background`), so a plain `bg` override never
110
97
  // reaches it — a bright light box survives on every dark autofilled field unless
@@ -165,42 +165,40 @@ const PixelizeThemeProvider = ({ children, brand: brandProp = DEFAULT_BRAND, onB
165
165
  * `data-mode` for consumers that want to hook their own dark CSS.
166
166
  */
167
167
  (0, react_1.useLayoutEffect)(() => {
168
- var _a, _b, _c, _d, _e, _f, _g;
169
168
  const root = document.documentElement;
170
169
  root.dataset.mode = resolvedMode;
171
- const colors = resolvedTheme.colors;
172
- const sem = (_a = colors.semantic) !== null && _a !== void 0 ? _a : {};
173
- const gray = colors.gray;
170
+ const { colors } = resolvedTheme;
171
+ const { gray, semantic } = colors;
174
172
  const HUE_SCALES = [
175
173
  "primary", "gray", "red", "orange", "yellow",
176
174
  "green", "teal", "blue", "cyan", "purple", "pink",
177
175
  ];
178
- const SEMANTIC_SCALES = ["success", "error", "warning", "info"]; // nested under colors.semantic
176
+ const SEMANTIC_SCALES = ["success", "error", "warning", "info"];
179
177
  const RUNGS = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900];
180
- // Single-value semantic vars → palette scale+rung. The dark gray ramp runs dark(50) → light(900),
181
- // so low rungs read as surfaces and high rungs as text — correct in dark, cleared in light.
178
+ // The dark gray ramp runs dark(50) → light(900), so low rungs read as surfaces
179
+ // and high rungs as text — correct in dark, cleared in light.
182
180
  const SEMANTIC_VARS = {
183
- "text-heading": gray === null || gray === void 0 ? void 0 : gray[900], "text-body": gray === null || gray === void 0 ? void 0 : gray[700],
184
- "text-subtle": gray === null || gray === void 0 ? void 0 : gray[500], "text-input": gray === null || gray === void 0 ? void 0 : gray[500],
185
- "bg-main": gray === null || gray === void 0 ? void 0 : gray[50], "bg-secondary": gray === null || gray === void 0 ? void 0 : gray[100], "bg-tertiary": gray === null || gray === void 0 ? void 0 : gray[100],
186
- "bg-quaternary": gray === null || gray === void 0 ? void 0 : gray[200], "bg-light": gray === null || gray === void 0 ? void 0 : gray[50], "bg-medium": gray === null || gray === void 0 ? void 0 : gray[100],
187
- "bg-accent": gray === null || gray === void 0 ? void 0 : gray[200], "bg-subtle": gray === null || gray === void 0 ? void 0 : gray[100], "bg-muted": gray === null || gray === void 0 ? void 0 : gray[200],
188
- "bg-neutral": gray === null || gray === void 0 ? void 0 : gray[100], "bg-base": gray === null || gray === void 0 ? void 0 : gray[50], "bg-table-header": gray === null || gray === void 0 ? void 0 : gray[100],
189
- "border-default": gray === null || gray === void 0 ? void 0 : gray[200], "border-light": gray === null || gray === void 0 ? void 0 : gray[100],
190
- "border-dark": gray === null || gray === void 0 ? void 0 : gray[300], "border-input": gray === null || gray === void 0 ? void 0 : gray[300],
191
- "border-error": (_b = sem.error) === null || _b === void 0 ? void 0 : _b[500], "border-success": (_c = sem.success) === null || _c === void 0 ? void 0 : _c[500],
192
- "border-warning": (_d = sem.warning) === null || _d === void 0 ? void 0 : _d[500], "border-info": (_e = sem.info) === null || _e === void 0 ? void 0 : _e[500],
181
+ "text-heading": gray[900], "text-body": gray[700],
182
+ "text-subtle": gray[500], "text-input": gray[500],
183
+ "bg-main": gray[50], "bg-secondary": gray[100], "bg-tertiary": gray[100],
184
+ "bg-quaternary": gray[200], "bg-light": gray[50], "bg-medium": gray[100],
185
+ "bg-accent": gray[200], "bg-subtle": gray[100], "bg-muted": gray[200],
186
+ "bg-neutral": gray[100], "bg-base": gray[50], "bg-table-header": gray[100],
187
+ "border-default": gray[200], "border-light": gray[100],
188
+ "border-dark": gray[300], "border-input": gray[300],
189
+ "border-error": semantic.error[500], "border-success": semantic.success[500],
190
+ "border-warning": semantic.warning[500], "border-info": semantic.info[500],
193
191
  };
194
- const set = (name, val) => val && root.style.setProperty(`--color-${name}`, val);
192
+ const set = (name, val) => root.style.setProperty(`--color-${name}`, val);
195
193
  const clear = (name) => root.style.removeProperty(`--color-${name}`);
196
194
  const allRampNames = [...HUE_SCALES, ...SEMANTIC_SCALES].flatMap((s) => RUNGS.map((r) => `${s}-${r}`));
197
195
  if (resolvedMode === "dark") {
198
196
  for (const s of HUE_SCALES)
199
197
  for (const r of RUNGS)
200
- set(`${s}-${r}`, (_f = colors[s]) === null || _f === void 0 ? void 0 : _f[r]);
198
+ set(`${s}-${r}`, colors[s][r]);
201
199
  for (const s of SEMANTIC_SCALES)
202
200
  for (const r of RUNGS)
203
- set(`${s}-${r}`, (_g = sem[s]) === null || _g === void 0 ? void 0 : _g[r]);
201
+ set(`${s}-${r}`, semantic[s][r]);
204
202
  for (const [name, val] of Object.entries(SEMANTIC_VARS))
205
203
  set(name, val);
206
204
  }
@@ -25,33 +25,26 @@ const toBrandLabel = (brand) => brand.charAt(0).toUpperCase() + brand.slice(1);
25
25
  * the dot always matches what selecting that brand actually looks like,
26
26
  * regardless of which brand/mode is currently active.
27
27
  */
28
- const brandSwatchColor = (brand) => {
29
- var _a, _b, _c, _d, _e;
30
- return (_e = (_d = (_c = (_b = (_a = index_1.brandThemes[brand]) === null || _a === void 0 ? void 0 : _a.light) === null || _b === void 0 ? void 0 : _b.colors) === null || _c === void 0 ? void 0 : _c.primary) === null || _d === void 0 ? void 0 : _d[500]) !== null && _e !== void 0 ? _e : "gray.400";
28
+ const brandSwatchColor = (brand) => index_1.brandThemes[brand].light.colors.primary[500];
29
+ const BrandSwatch = ({ brand }) => {
30
+ const { colors } = (0, useCustomTheme_1.useCustomTheme)();
31
+ return ((0, jsx_runtime_1.jsx)(react_2.Box, { as: "span", display: "inline-block", w: "0.625rem", h: "0.625rem", borderRadius: "full", bg: brandSwatchColor(brand), border: "1px solid", borderColor: colors.boxborder[200], flexShrink: 0 }));
31
32
  };
32
- const BrandSwatch = ({ brand }) => ((0, jsx_runtime_1.jsx)(react_2.Box, { as: "span", display: "inline-block", w: "0.625rem", h: "0.625rem", borderRadius: "full", bg: brandSwatchColor(brand), border: "1px solid", borderColor: "whiteAlpha.300", flexShrink: 0 }));
33
33
  /**
34
34
  * Palette values already differ per color mode (`brandThemes[brand].light|dark`), so tokens
35
35
  * are read straight from the active theme — no `useColorModeValue` pairing needed here.
36
- * Fallbacks are Chakra token names, never literal colors, for themes without a brand palette.
37
36
  */
38
37
  const useSwitcherColors = () => {
39
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0;
40
- const colors = (0, useCustomTheme_1.useCustomTheme)().colors;
38
+ const { colors } = (0, useCustomTheme_1.useCustomTheme)();
41
39
  return {
42
- trackBg: (_d = (_b = (_a = colors === null || colors === void 0 ? void 0 : colors.backgroundColor) === null || _a === void 0 ? void 0 : _a.secondary) !== null && _b !== void 0 ? _b : (_c = colors === null || colors === void 0 ? void 0 : colors.gray) === null || _c === void 0 ? void 0 : _c[100]) !== null && _d !== void 0 ? _d : "gray.100",
43
- activeBg: (_g = (_f = (_e = colors === null || colors === void 0 ? void 0 : colors.backgroundColor) === null || _e === void 0 ? void 0 : _e.main) !== null && _f !== void 0 ? _f : colors === null || colors === void 0 ? void 0 : colors.white) !== null && _g !== void 0 ? _g : "white",
44
- activeColor: (_l = (_j = (_h = colors === null || colors === void 0 ? void 0 : colors.primary) === null || _h === void 0 ? void 0 : _h[500]) !== null && _j !== void 0 ? _j : (_k = colors === null || colors === void 0 ? void 0 : colors.text) === null || _k === void 0 ? void 0 : _k[900]) !== null && _l !== void 0 ? _l : "inherit",
45
- mutedColor: (_q = (_o = (_m = colors === null || colors === void 0 ? void 0 : colors.text) === null || _m === void 0 ? void 0 : _m[600]) !== null && _o !== void 0 ? _o : (_p = colors === null || colors === void 0 ? void 0 : colors.gray) === null || _p === void 0 ? void 0 : _p[600]) !== null && _q !== void 0 ? _q : "gray.600",
46
- hoverBg: (_s = (_r = colors === null || colors === void 0 ? void 0 : colors.gray) === null || _r === void 0 ? void 0 : _r[100]) !== null && _s !== void 0 ? _s : "gray.100",
47
- borderColor: (_w = (_u = (_t = colors === null || colors === void 0 ? void 0 : colors.border) === null || _t === void 0 ? void 0 : _t[200]) !== null && _u !== void 0 ? _u : (_v = colors === null || colors === void 0 ? void 0 : colors.gray) === null || _v === void 0 ? void 0 : _v[200]) !== null && _w !== void 0 ? _w : "gray.200",
48
- // `--menu-bg` (and its hover/focus/active states) is now fixed centrally in the theme's
49
- // Menu component style (Theme/chakra/Menu.styles.ts) — every MenuList gets it from there.
50
- // Re-deriving it here too and pushing it back via `sx` on every render caused a redundant
51
- // Emotion style recompute per render, which showed up as flicker while hovering/scrolling
52
- // this list. Keep menuColor (Menu.styles.ts doesn't set list `color` per this component's
53
- // needs) but stop duplicating menuBg.
54
- menuColor: (_0 = (_y = (_x = colors === null || colors === void 0 ? void 0 : colors.text) === null || _x === void 0 ? void 0 : _x[900]) !== null && _y !== void 0 ? _y : (_z = colors === null || colors === void 0 ? void 0 : colors.gray) === null || _z === void 0 ? void 0 : _z[900]) !== null && _0 !== void 0 ? _0 : "gray.900",
40
+ trackBg: colors.backgroundColor.secondary,
41
+ activeBg: colors.backgroundColor.main,
42
+ activeColor: colors.primary[500],
43
+ mutedColor: colors.text[600],
44
+ hoverBg: colors.gray[100],
45
+ borderColor: colors.boxborder[200],
46
+ // NOTE: menuBg lives in Menu.styles.ts re-pushing it via `sx` flickers on every render.
47
+ menuColor: colors.text[900],
55
48
  };
56
49
  };
57
50
  const BrandMenu = ({ size }) => {
@@ -188,12 +188,8 @@ const disabled = {
188
188
  800: "#625d75",
189
189
  900: "#4b4759",
190
190
  };
191
- // Two-tone brand gradient (violet pink). Each theme overrides with its own pair.
192
- // `to` stop retuned so white gradient-button text (onGradient, accentText.ts) clears AA — the
193
- // original let white drop to 3.53 there (`from` already passed at 5.76, unchanged).
194
- // Nudged one step further (4.511 -> 4.609): the first pass cleared AA by <0.02, too thin a
195
- // margin to trust against rounding/rendering variance.
196
- const gradient = { from: "#8B3FC8", to: "#df187a" };
191
+ // Single-hue gradient: white clears AA by margin, not by hundredths. See gradientTone.test.ts.
192
+ const gradient = { from: "#8b3fc8", to: "#762d9d" };
197
193
  const palette = {
198
194
  gradient,
199
195
  primary,
@@ -20,11 +20,7 @@ const primary = {
20
20
  const palette = {
21
21
  ...neutrals_1.neutralTokens,
22
22
  ...(0, brandInk_1.buildBrandInk)(PRIMARY_500),
23
- // `to` stop retuned so white gradient-button text (onGradient, accentText.ts) clears AA — the
24
- // original let white drop to 2.98 there (`from` already passed at 4.83, unchanged).
25
- // Nudged one step further (4.520 -> 4.608): the first pass cleared AA by <0.02, too thin a
26
- // margin to trust against rounding/rendering variance.
27
- gradient: { from: "#6b7280", to: "#5664f6" }, // slate gray → indigo
23
+ gradient: { from: "#666d7a", to: "#4a4e59" },
28
24
  primary,
29
25
  tertiary: { ...primary },
30
26
  gray: {
@@ -34,7 +34,7 @@ function chartInk(colors) {
34
34
  surface,
35
35
  text: colors.text[900],
36
36
  muted: colors.text[500],
37
- grid: colors.border[500],
37
+ grid: colors.boxborder[200],
38
38
  axis: colors.text[500],
39
39
  tooltipBg: colors.backgroundColor.secondary,
40
40
  };
@@ -0,0 +1,22 @@
1
+ export type Gradient = {
2
+ from: string;
3
+ to: string;
4
+ };
5
+ /** A gradient already safe to paint, plus the ink that is guaranteed legible on it. */
6
+ export type ResolvedGradient = Gradient & {
7
+ ink: string;
8
+ };
9
+ /**
10
+ * Sinks both stops until WHITE ink clears AA, keeping each stop's hue. Any mid-tone gradient
11
+ * otherwise flips `onGradient` to black ink, so the same element reads white-on-colour in one
12
+ * brand and black-on-pastel in the next.
13
+ */
14
+ export declare const inkSafeGradient: (gradient: Gradient) => Gradient;
15
+ /**
16
+ * The only correct way to paint text on a gradient: returns the stops to draw AND the ink for
17
+ * them. Calling `onGradient` on raw stops is the black-text bug — it picks ink for a backdrop
18
+ * that is then painted differently.
19
+ */
20
+ export declare const resolveGradient: (gradient: Gradient, white: string, black: string) => ResolvedGradient;
21
+ /** `linear-gradient(...)` for a resolved pair — one spelling of the CSS everywhere. */
22
+ export declare const gradientCss: (g: Gradient, angle?: string) => string;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.gradientCss = exports.resolveGradient = exports.inkSafeGradient = void 0;
4
+ const accentText_1 = require("./accentText");
5
+ const statusTone_1 = require("./statusTone");
6
+ /**
7
+ * Sinks both stops until WHITE ink clears AA, keeping each stop's hue. Any mid-tone gradient
8
+ * otherwise flips `onGradient` to black ink, so the same element reads white-on-colour in one
9
+ * brand and black-on-pastel in the next.
10
+ */
11
+ const inkSafeGradient = (gradient) => ({
12
+ from: (0, statusTone_1.resolveAvatarFill)(gradient.from),
13
+ to: (0, statusTone_1.resolveAvatarFill)(gradient.to),
14
+ });
15
+ exports.inkSafeGradient = inkSafeGradient;
16
+ /**
17
+ * The only correct way to paint text on a gradient: returns the stops to draw AND the ink for
18
+ * them. Calling `onGradient` on raw stops is the black-text bug — it picks ink for a backdrop
19
+ * that is then painted differently.
20
+ */
21
+ const resolveGradient = (gradient, white, black) => {
22
+ const { from, to } = (0, exports.inkSafeGradient)(gradient);
23
+ return { from, to, ink: (0, accentText_1.onGradient)(from, to, white, black) };
24
+ };
25
+ exports.resolveGradient = resolveGradient;
26
+ /** `linear-gradient(...)` for a resolved pair — one spelling of the CSS everywhere. */
27
+ const gradientCss = (g, angle = "135deg") => `linear-gradient(${angle}, ${g.from} 0%, ${g.to} 100%)`;
28
+ exports.gradientCss = gradientCss;
@@ -3,3 +3,6 @@ export * from "./buildBrandTokens";
3
3
  export * from "./buildDarkPalette";
4
4
  export * from "./chartColorsFromTheme";
5
5
  export * from "./color";
6
+ export * from "./scrollbar";
7
+ export * from "./gradientInk";
8
+ export * from "./placeholderInk";
@@ -19,3 +19,6 @@ __exportStar(require("./buildBrandTokens"), exports);
19
19
  __exportStar(require("./buildDarkPalette"), exports);
20
20
  __exportStar(require("./chartColorsFromTheme"), exports);
21
21
  __exportStar(require("./color"), exports);
22
+ __exportStar(require("./scrollbar"), exports);
23
+ __exportStar(require("./gradientInk"), exports);
24
+ __exportStar(require("./placeholderInk"), exports);
@@ -7,6 +7,22 @@ import type { PaletteProps } from "../types";
7
7
  export declare const MIN_PERCEPTIBLE_STEP = 1.15;
8
8
  /** WCAG 1.4.11 — a control outline is a UI component boundary, held to 3:1. */
9
9
  export declare const AA_NON_TEXT = 3;
10
+ /**
11
+ * Resting chrome — card, popover and field outlines — settles here, not at `AA_NON_TEXT`.
12
+ * At 3:1 a container border is text-weight and the UI reads as a wireframe; every mainstream
13
+ * system draws this line far lighter (Tailwind gray-200 1.24, Chakra gray.200 1.30, Material
14
+ * outline-variant 1.61). 1.4.11 asks that a control be identifiable, not that its resting
15
+ * border carry the whole job: the fill, the label and the focus ring do that, and the focus
16
+ * ring is still held to `AA_NON_TEXT`.
17
+ */
18
+ export declare const CHROME_BORDER = 1.5;
19
+ export declare const CHROME_RULE = 1.31;
20
+ /**
21
+ * A rule is decorative, so it has a ceiling and no floor: soften it until the surface it reads
22
+ * hardest against sits at `target`, and leave a already-fainter rung alone. Never `settleAcross`
23
+ * here — that clears a floor on EVERY surface, so one tinted surface drags the rule darker.
24
+ */
25
+ export declare function ruleInk(hex: string, surfaces: readonly string[], target: number): string;
10
26
  /**
11
27
  * Walks a hex toward `target` contrast against `backdrop`, keeping hue and saturation.
12
28
  * Direction is DERIVED from the backdrop, never passed: a mode argument here was redundant
@@ -14,11 +30,17 @@ export declare const AA_NON_TEXT = 3;
14
30
  * Tries the far side first, falls back to the near side, and stops at the first passing step.
15
31
  */
16
32
  export declare function liftToContrast(hex: string, backdrop: string, target?: number): string;
33
+ /**
34
+ * Mirror of `liftToContrast`: walks ink TOWARD the backdrop, stopping at the last step that
35
+ * still clears `target`. For ink that must stay legible without reading as body copy.
36
+ */
37
+ export declare function softenToContrast(hex: string, backdrop: string, target: number): string;
17
38
  /**
18
39
  * `boxborder[500]` is the rung every control outline reads (Checkbox, SearchSelect, the date
19
- * pickers, the editor's inputs). It was authored as a decorative value measured 1.30-2.56:1
20
- * across brands, so those controls rendered effectively borderless in BOTH modes. Resolved here
21
- * rather than hand-pinned per brand: a copied hex goes stale the moment a canvas moves.
40
+ * pickers, the editor's inputs). Settled onto `CHROME_BORDER` lifted when a brand authored it
41
+ * invisibly pale, softened when it overshoots. It was previously lifted to `AA_NON_TEXT`, which
42
+ * shipped 3.85-4.95:1 outlines: a text-weight box around every card and popover.
43
+ * Resolved here rather than hand-pinned per brand: a copied hex goes stale the moment a canvas moves.
22
44
  *
23
45
  * `border[*]` is deliberately untouched — that ramp draws table gridlines, which are decorative
24
46
  * and outside 1.4.11.
@@ -33,3 +55,10 @@ export declare function withOutlineRung(palette: PaletteProps): PaletteProps;
33
55
  * its OWN list background, not necessarily the page canvas.
34
56
  */
35
57
  export declare function resolveHoverTint(seed: string, restSurface: string): string;
58
+ /**
59
+ * Settles ink into `target` against EVERY surface at once. Softening one step can change which
60
+ * surface is hardest, so resolving against a single pre-computed "hardest" one lands under the
61
+ * floor on another — that is how radiant and rosewood ended up with an invisible outline on
62
+ * their muted surface.
63
+ */
64
+ export declare function settleAcross(hex: string, surfaces: readonly string[], target: number): string;
@@ -1,9 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AA_NON_TEXT = exports.MIN_PERCEPTIBLE_STEP = void 0;
3
+ exports.CHROME_RULE = exports.CHROME_BORDER = exports.AA_NON_TEXT = exports.MIN_PERCEPTIBLE_STEP = void 0;
4
+ exports.ruleInk = ruleInk;
4
5
  exports.liftToContrast = liftToContrast;
6
+ exports.softenToContrast = softenToContrast;
5
7
  exports.withOutlineRung = withOutlineRung;
6
8
  exports.resolveHoverTint = resolveHoverTint;
9
+ exports.settleAcross = settleAcross;
7
10
  const color_1 = require("./color");
8
11
  /**
9
12
  * The floor a hover/active state's step off its own resting surface must clear to be seen at
@@ -13,6 +16,29 @@ const color_1 = require("./color");
13
16
  exports.MIN_PERCEPTIBLE_STEP = 1.15;
14
17
  /** WCAG 1.4.11 — a control outline is a UI component boundary, held to 3:1. */
15
18
  exports.AA_NON_TEXT = 3;
19
+ /**
20
+ * Resting chrome — card, popover and field outlines — settles here, not at `AA_NON_TEXT`.
21
+ * At 3:1 a container border is text-weight and the UI reads as a wireframe; every mainstream
22
+ * system draws this line far lighter (Tailwind gray-200 1.24, Chakra gray.200 1.30, Material
23
+ * outline-variant 1.61). 1.4.11 asks that a control be identifiable, not that its resting
24
+ * border carry the whole job: the fill, the label and the focus ring do that, and the focus
25
+ * ring is still held to `AA_NON_TEXT`.
26
+ */
27
+ exports.CHROME_BORDER = 1.5;
28
+ // The resting rule between two surfaces — a card edge, a divider, a menu outline. Lighter than
29
+ // CHROME_BORDER, which outlines a control the user acts on.
30
+ exports.CHROME_RULE = 1.31;
31
+ /**
32
+ * A rule is decorative, so it has a ceiling and no floor: soften it until the surface it reads
33
+ * hardest against sits at `target`, and leave a already-fainter rung alone. Never `settleAcross`
34
+ * here — that clears a floor on EVERY surface, so one tinted surface drags the rule darker.
35
+ */
36
+ function ruleInk(hex, surfaces, target) {
37
+ const loudest = surfaces.reduce((worst, s) => (0, color_1.contrastRatio)(hex, s) > (0, color_1.contrastRatio)(hex, worst) ? s : worst);
38
+ return (0, color_1.contrastRatio)(hex, loudest) > target
39
+ ? softenToContrast(hex, loudest, target)
40
+ : hex;
41
+ }
16
42
  /**
17
43
  * Walks a hex toward `target` contrast against `backdrop`, keeping hue and saturation.
18
44
  * Direction is DERIVED from the backdrop, never passed: a mode argument here was redundant
@@ -36,11 +62,30 @@ function liftToContrast(hex, backdrop, target = exports.AA_NON_TEXT) {
36
62
  const ends = [(0, color_1.withLightness)(hex, 100, s), (0, color_1.withLightness)(hex, 0, s)];
37
63
  return (0, color_1.contrastRatio)(ends[0], backdrop) >= (0, color_1.contrastRatio)(ends[1], backdrop) ? ends[0] : ends[1];
38
64
  }
65
+ /**
66
+ * Mirror of `liftToContrast`: walks ink TOWARD the backdrop, stopping at the last step that
67
+ * still clears `target`. For ink that must stay legible without reading as body copy.
68
+ */
69
+ function softenToContrast(hex, backdrop, target) {
70
+ if ((0, color_1.contrastRatio)(hex, backdrop) <= target)
71
+ return hex;
72
+ const { s, l: start } = (0, color_1.hexToHsl)(hex);
73
+ const toward = (0, color_1.relativeLuminance)(backdrop) < 0.5 ? -1 : 1;
74
+ let softest = hex;
75
+ for (let l = start; l > 0 && l < 100; l += toward) {
76
+ const next = (0, color_1.withLightness)(hex, l, s);
77
+ if ((0, color_1.contrastRatio)(next, backdrop) < target)
78
+ break;
79
+ softest = next;
80
+ }
81
+ return softest;
82
+ }
39
83
  /**
40
84
  * `boxborder[500]` is the rung every control outline reads (Checkbox, SearchSelect, the date
41
- * pickers, the editor's inputs). It was authored as a decorative value measured 1.30-2.56:1
42
- * across brands, so those controls rendered effectively borderless in BOTH modes. Resolved here
43
- * rather than hand-pinned per brand: a copied hex goes stale the moment a canvas moves.
85
+ * pickers, the editor's inputs). Settled onto `CHROME_BORDER` lifted when a brand authored it
86
+ * invisibly pale, softened when it overshoots. It was previously lifted to `AA_NON_TEXT`, which
87
+ * shipped 3.85-4.95:1 outlines: a text-weight box around every card and popover.
88
+ * Resolved here rather than hand-pinned per brand: a copied hex goes stale the moment a canvas moves.
44
89
  *
45
90
  * `border[*]` is deliberately untouched — that ramp draws table gridlines, which are decorative
46
91
  * and outside 1.4.11.
@@ -53,7 +98,9 @@ function withOutlineRung(palette) {
53
98
  (0, color_1.contrastRatio)(current, palette.background[50])
54
99
  ? palette.backgroundColor.main
55
100
  : palette.background[50];
56
- const resolved = liftToContrast(current, backdrop);
101
+ const resolved = (0, color_1.contrastRatio)(current, backdrop) > exports.CHROME_BORDER
102
+ ? softenToContrast(current, backdrop, exports.CHROME_BORDER)
103
+ : liftToContrast(current, backdrop, exports.CHROME_BORDER);
57
104
  if (resolved === current)
58
105
  return palette;
59
106
  return { ...palette, boxborder: { ...palette.boxborder, 500: resolved } };
@@ -69,3 +116,25 @@ function withOutlineRung(palette) {
69
116
  function resolveHoverTint(seed, restSurface) {
70
117
  return liftToContrast(seed, restSurface, exports.MIN_PERCEPTIBLE_STEP);
71
118
  }
119
+ /**
120
+ * Settles ink into `target` against EVERY surface at once. Softening one step can change which
121
+ * surface is hardest, so resolving against a single pre-computed "hardest" one lands under the
122
+ * floor on another — that is how radiant and rosewood ended up with an invisible outline on
123
+ * their muted surface.
124
+ */
125
+ function settleAcross(hex, surfaces, target) {
126
+ const clearsAll = (c) => surfaces.every((s) => (0, color_1.contrastRatio)(c, s) >= target);
127
+ if (!clearsAll(hex)) {
128
+ return surfaces.reduce((ink, s) => liftToContrast(ink, s, target), hex);
129
+ }
130
+ const { s: sat, l: start } = (0, color_1.hexToHsl)(hex);
131
+ const toward = (0, color_1.relativeLuminance)(surfaces[0]) < 0.5 ? -1 : 1;
132
+ let settled = hex;
133
+ for (let l = start; l > 0 && l < 100; l += toward) {
134
+ const next = (0, color_1.withLightness)(hex, l, sat);
135
+ if (!clearsAll(next))
136
+ break;
137
+ settled = next;
138
+ }
139
+ return settled;
140
+ }
@@ -0,0 +1,19 @@
1
+ import type { PaletteProps } from "../types";
2
+ /** A field always renders on at least one surface — the first is the reference backdrop. */
3
+ export type FieldSurfaces = readonly [string, ...string[]];
4
+ /**
5
+ * The hint ink for a field: the brand's authored rung settled onto `PLACEHOLDER_TEXT` against the
6
+ * hardest surface a field can land on — lifted when it falls short, softened when it overshoots.
7
+ *
8
+ * Settled rather than floored because the authored rungs measured 3.96-7.73:1 across the brands,
9
+ * and anything much past the floor reads as a field already typed into. The floor is the look:
10
+ * one hint weight for every brand in both modes, instead of a per-brand accident.
11
+ */
12
+ export declare const placeholderInkOn: (palette: PaletteProps, surfaces: FieldSurfaces) => string;
13
+ /**
14
+ * Every surface an ENABLED field renders on. Disabled fields are deliberately absent — 1.4.3
15
+ * exempts them, and folding their dimmer fill in here would darken the hint on every other field.
16
+ */
17
+ export declare const fieldSurfaces: (palette: PaletteProps) => FieldSurfaces;
18
+ /** The hint ink every field in this library reads. Takes no backdrop: see `fieldSurfaces`. */
19
+ export declare const placeholderInk: (palette: PaletteProps) => string;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.placeholderInk = exports.fieldSurfaces = exports.placeholderInkOn = void 0;
4
+ const color_1 = require("./color");
5
+ const outlineRung_1 = require("./outlineRung");
6
+ const surfaceRungs_1 = require("./surfaceRungs");
7
+ /**
8
+ * The hint ink for a field: the brand's authored rung settled onto `PLACEHOLDER_TEXT` against the
9
+ * hardest surface a field can land on — lifted when it falls short, softened when it overshoots.
10
+ *
11
+ * Settled rather than floored because the authored rungs measured 3.96-7.73:1 across the brands,
12
+ * and anything much past the floor reads as a field already typed into. The floor is the look:
13
+ * one hint weight for every brand in both modes, instead of a per-brand accident.
14
+ */
15
+ const placeholderInkOn = (palette, surfaces) => {
16
+ const rung = palette.placeholder[500];
17
+ const hardest = surfaces.reduce((worst, s) => (0, color_1.contrastRatio)(rung, s) < (0, color_1.contrastRatio)(rung, worst) ? s : worst);
18
+ return (0, color_1.contrastRatio)(rung, hardest) > surfaceRungs_1.PLACEHOLDER_TEXT
19
+ ? (0, outlineRung_1.softenToContrast)(rung, hardest, surfaceRungs_1.PLACEHOLDER_TEXT)
20
+ : (0, outlineRung_1.liftToContrast)(rung, hardest, surfaceRungs_1.PLACEHOLDER_TEXT);
21
+ };
22
+ exports.placeholderInkOn = placeholderInkOn;
23
+ /**
24
+ * Every surface an ENABLED field renders on. Disabled fields are deliberately absent — 1.4.3
25
+ * exempts them, and folding their dimmer fill in here would darken the hint on every other field.
26
+ */
27
+ const fieldSurfaces = (palette) => [
28
+ palette.gray[50],
29
+ palette.background[50],
30
+ palette.backgroundColor.main,
31
+ ];
32
+ exports.fieldSurfaces = fieldSurfaces;
33
+ /** The hint ink every field in this library reads. Takes no backdrop: see `fieldSurfaces`. */
34
+ const placeholderInk = (palette) => (0, exports.placeholderInkOn)(palette, (0, exports.fieldSurfaces)(palette));
35
+ exports.placeholderInk = placeholderInk;
@@ -1,6 +1,10 @@
1
1
  import { AA_NON_TEXT } from "./outlineRung";
2
2
  import type { PaletteProps } from "../types";
3
- /** Placeholder text measured 4.32:1 on a card for 8 of 9 brands — text, so held to 4.5:1. */
3
+ /**
4
+ * A hint is floored at 3:1, not 4.5:1. Held to body-text contrast it stopped reading as a hint —
5
+ * an empty field looked like one already typed into — and the published library ships this rung
6
+ * as the brand authored it. See CHROME-CONSISTENCY.md.
7
+ */
4
8
  export declare function withPlaceholderRung(palette: PaletteProps): PaletteProps;
5
9
  /** The hover row is a SURFACE, so it steps away from the ink rather than the ink moving. */
6
10
  export declare function withTableHoverRung(palette: PaletteProps): PaletteProps;
@@ -6,9 +6,14 @@ exports.withTableHoverRung = withTableHoverRung;
6
6
  const outlineRung_1 = require("./outlineRung");
7
7
  Object.defineProperty(exports, "AA_NON_TEXT", { enumerable: true, get: function () { return outlineRung_1.AA_NON_TEXT; } });
8
8
  const accentText_1 = require("./accentText");
9
- /** Placeholder text measured 4.32:1 on a card for 8 of 9 brands — text, so held to 4.5:1. */
9
+ const surfaceRungs_1 = require("./surfaceRungs");
10
+ /**
11
+ * A hint is floored at 3:1, not 4.5:1. Held to body-text contrast it stopped reading as a hint —
12
+ * an empty field looked like one already typed into — and the published library ships this rung
13
+ * as the brand authored it. See CHROME-CONSISTENCY.md.
14
+ */
10
15
  function withPlaceholderRung(palette) {
11
- const resolved = (0, outlineRung_1.liftToContrast)(palette.placeholder[500], palette.background[50], accentText_1.AA_NORMAL_TEXT);
16
+ const resolved = (0, outlineRung_1.liftToContrast)(palette.placeholder[500], palette.background[50], surfaceRungs_1.PLACEHOLDER_TEXT);
12
17
  if (resolved === palette.placeholder[500])
13
18
  return palette;
14
19
  return { ...palette, placeholder: { ...palette.placeholder, 500: resolved } };
@@ -0,0 +1,12 @@
1
+ import type { PaletteProps } from "../types";
2
+ export type ScrollbarStyle = Record<string, unknown>;
3
+ /** One width everywhere. The 3px, 4px, 5px and 10px bars in use were all accidents. */
4
+ export declare const SCROLLBAR_WIDTH = "6px";
5
+ export type ScrollbarVariant = "default" | "overlay" | "hover";
6
+ /**
7
+ * The single source of scrollbar chrome. `overlay` drops the track for bars that float over a
8
+ * card; `hover` keeps the thumb invisible until the region is hovered.
9
+ */
10
+ export declare function scrollbarStyles(palette: PaletteProps, variant?: ScrollbarVariant): ScrollbarStyle;
11
+ /** The same chrome for the document itself, where `&` selectors do not apply. */
12
+ export declare function globalScrollbarStyles(palette: PaletteProps): ScrollbarStyle;