@recursica/mantine-adapter 0.41.0 → 0.42.1
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.
- package/CHANGELOG.md +24 -0
- package/dist/index.d.ts +43 -3
- package/dist/mantine-adapter.cjs +2 -2
- package/dist/mantine-adapter.cjs.map +1 -1
- package/dist/mantine-adapter.css +1 -1
- package/dist/mantine-adapter.js +2580 -2218
- package/dist/mantine-adapter.js.map +1 -1
- package/package.json +1 -1
- package/src/GlobalExemptions.modules.css +0 -6
- package/src/components/Accordion/Accordion.module.css +0 -8
- package/src/components/AutoComplete/AutoComplete.module.css +0 -7
- package/src/components/Avatar/Avatar.module.css +0 -8
- package/src/components/Checkbox/CheckboxGroup.tsx +32 -10
- package/src/components/Chip/Chip.module.css +0 -16
- package/src/components/DatePicker/DATEPICKER_IMPLEMENTATION_NOTES.md +14 -1
- package/src/components/DatePicker/DatePicker.icons.tsx +27 -0
- package/src/components/DatePicker/DatePicker.module.css +256 -7
- package/src/components/DatePicker/DatePicker.stories.tsx +0 -7
- package/src/components/DatePicker/DatePicker.tsx +37 -1
- package/src/components/DatePicker/USAGE.md +6 -2
- package/src/components/Dropdown/Dropdown.module.css +0 -7
- package/src/components/FileInput/FileInput.module.css +0 -21
- package/src/components/FileInput/FileInput.tsx +6 -0
- package/src/components/FileUpload/FileUpload.module.css +0 -11
- package/src/components/HoverCard/HoverCard.module.css +1 -7
- package/src/components/Label/Label.module.css +0 -6
- package/src/components/Link/Link.module.css +1 -6
- package/src/components/Menu/Menu.module.css +0 -6
- package/src/components/Modal/Modal.module.css +0 -11
- package/src/components/NumberInput/NumberInput.module.css +0 -7
- package/src/components/Pagination/Pagination.module.css +0 -81
- package/src/components/SegmentedControl/SegmentedControl.module.css +0 -1
- package/src/components/Slider/IMPLEMENTATION_NOTES.md +1 -0
- package/src/components/Slider/Slider.module.css +34 -0
- package/src/components/Slider/Slider.stories.tsx +1 -1
- package/src/components/TextArea/TextArea.module.css +0 -7
- package/src/components/TextArea/TextArea.tsx +2 -6
- package/src/components/TextField/TextField.module.css +0 -7
- package/src/components/TimePicker/TimePicker.module.css +0 -16
- package/src/components/Timeline/Timeline.module.css +0 -6
- package/src/components/Toast/Toast.module.css +0 -7
- package/src/components/Tooltip/Tooltip.module.css +0 -9
- package/src/components/TransferList/TRANSFERLIST_IMPLEMENTATION_NOTES.md +111 -0
- package/src/components/TransferList/TransferList.module.css +174 -41
- package/src/components/TransferList/TransferList.stories.tsx +110 -6
- package/src/components/TransferList/TransferList.tsx +417 -7
- package/src/components/TransferList/USAGE.md +37 -6
|
@@ -1,24 +1,3 @@
|
|
|
1
|
-
/* EXEMPTIONS:
|
|
2
|
-
- The disabled/error states' own border-size variables are ignored so the border never changes
|
|
3
|
-
thickness across states and shifts the layout — same house policy as TextField/DatePicker.
|
|
4
|
-
The flat, state-agnostic properties_border-size token below is applied uniformly instead.
|
|
5
|
-
- There is no forge-defined focus state for file-input (no `states.focus` axis, unlike its
|
|
6
|
-
disabled/error siblings) — the generic recursica_brand_states_focus_* ring is used instead,
|
|
7
|
-
same fallback TextField/DatePicker use for the same reason.
|
|
8
|
-
- properties_icon-text-gap doubles as the gap between chips: file-input has no dedicated
|
|
9
|
-
chip-gap token (unlike file-upload's properties_item-gap).
|
|
10
|
-
- The trailing clear-all affordance is now a real shared `Button` (icon-only, "text" variant)
|
|
11
|
-
rather than a bespoke span, so it gets its own real button semantics/keyboard handling —
|
|
12
|
-
same pattern as Tree's expand/collapse button. It renders through Button's own tokened
|
|
13
|
-
color states (including disabled), so file-input's own trailing-icon color tokens — which
|
|
14
|
-
have no "clear button is disabled/errored" equivalent state of their own anyway — are no
|
|
15
|
-
longer consumed here. */
|
|
16
|
-
/* recursica-ignore: --recursica_ui-kit_components_file-input_variants_states_disabled_properties_border-size */
|
|
17
|
-
/* recursica-ignore: --recursica_ui-kit_components_file-input_variants_states_error_properties_border-size */
|
|
18
|
-
/* recursica-ignore: --recursica_ui-kit_components_file-input_properties_colors_trailing-icon */
|
|
19
|
-
/* recursica-ignore: --recursica_ui-kit_components_file-input_variants_states_error_properties_colors_trailing-icon */
|
|
20
|
-
/* recursica-ignore: --recursica_ui-kit_components_file-input_variants_states_disabled_properties_colors_trailing-icon */
|
|
21
|
-
|
|
22
1
|
/* LAYOUT SPACING OVERRIDES:
|
|
23
2
|
- Sets the --form-control-margin-bottom spacing hook to map component-specific layout tokens.
|
|
24
3
|
- Also sets the --file-input-control-{max,min}-width hooks consumed inline in FileInput.tsx,
|
|
@@ -389,6 +389,12 @@ export const FileInput = forwardRef<HTMLDivElement, FileInputProps>(
|
|
|
389
389
|
e.stopPropagation();
|
|
390
390
|
handleClearAll();
|
|
391
391
|
}}
|
|
392
|
+
onKeyDown={(e) => {
|
|
393
|
+
if (e.key !== "Enter" && e.key !== " ") return;
|
|
394
|
+
e.preventDefault();
|
|
395
|
+
e.stopPropagation();
|
|
396
|
+
handleClearAll();
|
|
397
|
+
}}
|
|
392
398
|
/>
|
|
393
399
|
)}
|
|
394
400
|
|
|
@@ -1,14 +1,3 @@
|
|
|
1
|
-
/* EXEMPTIONS:
|
|
2
|
-
- border-style has no usable var(...) form: the Figma-exported token's value is the literal
|
|
3
|
-
string `"dashed"` (quotes included), which is not a valid CSS <line-style> keyword — the same
|
|
4
|
-
class of "structural, not tokenized" property the canonical guide already treats border-style
|
|
5
|
-
as (see .root's own HARDCODED VALUES note below and TimePicker/DatePicker's identical
|
|
6
|
-
hardcoded `border-style: solid`). Hardcoded to the keyword `dashed` instead.
|
|
7
|
-
- properties_icon-size has no equivalent: unlike TextField/DatePicker, file-upload has no
|
|
8
|
-
dedicated icon-size token. Sized to visually match the Figma reference instead (see
|
|
9
|
-
HARDCODED VALUES below). */
|
|
10
|
-
/* recursica-ignore: --recursica_ui-kit_components_file-upload_properties_border-style */
|
|
11
|
-
|
|
12
1
|
/* HARDCODED VALUES:
|
|
13
2
|
- .root: display: flex; flex-direction: column; width: 100% — structural layout, not a design
|
|
14
3
|
token concern (matches how other block-level components like Layer are laid out).
|
|
@@ -5,13 +5,7 @@
|
|
|
5
5
|
and positioning (-arrowSize/2) calculations that cannot be CSS-driven. The default matches
|
|
6
6
|
the Recursica beak-size token (16px). See COMPONENT_ISSUES.md for details.
|
|
7
7
|
- All structural layout (display, position, overflow) is deferred to Mantine's native
|
|
8
|
-
behavior. We only override visual design tokens (colors, typography, spacing, borders).
|
|
9
|
-
/* EXEMPTIONS:
|
|
10
|
-
- beak-size is ignored here because Mantine's popover arrows compute their sizing and positional offsets
|
|
11
|
-
dynamically within the React rendering engine (requires inline pixel number rather than standard CSS variables).
|
|
12
|
-
The beak size is checked in JS against a fixed value of 16px. If this variable changes, the TSX components
|
|
13
|
-
need to be reviewed/re-compiled. */
|
|
14
|
-
/* recursica-ignore: --recursica_ui-kit_components_hover-card-popover_properties_beak-size = 16px */
|
|
8
|
+
behavior. We only override visual design tokens (colors, typography, spacing, borders). */
|
|
15
9
|
|
|
16
10
|
/* ======================================
|
|
17
11
|
DROPDOWN CONTAINER
|
|
@@ -1,14 +1,8 @@
|
|
|
1
|
-
/* EXEMPTIONS:
|
|
2
|
-
- layouts_stacked sizes width variables are ignored because stacked labels naturally occupy 100% width block-level
|
|
3
|
-
real estate in HTML rendering, making explicit width properties redundant. */
|
|
4
|
-
|
|
5
1
|
/* HARDCODED VALUES:
|
|
6
2
|
- display: flex helps us leverage flex 'order' to perfectly position Mantine's injected asterisk.
|
|
7
3
|
- align-items: baseline ensures text logic lines up nicely if font sizes differ slightly.
|
|
8
4
|
- margin/padding resets.
|
|
9
5
|
*/
|
|
10
|
-
/* recursica-ignore: --recursica_ui-kit_components_label_variants_layouts_stacked_variants_sizes_default_properties_width */
|
|
11
|
-
/* recursica-ignore: --recursica_ui-kit_components_label_variants_layouts_stacked_variants_sizes_small_properties_width */
|
|
12
6
|
|
|
13
7
|
.root {
|
|
14
8
|
display: flex;
|
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
/*
|
|
2
|
-
- text_text-transform is ignored because links naturally inherit casing directly from text
|
|
3
|
-
children rather than requiring custom CSS transforms. */
|
|
4
|
-
/* recursica-ignore: --recursica_ui-kit_components_link_properties_text_text-transform */
|
|
5
|
-
|
|
6
|
-
/*
|
|
1
|
+
/*
|
|
7
2
|
HARDCODED VALUES:
|
|
8
3
|
- display: inline-flex; (Base layout to align icon and text correctly)
|
|
9
4
|
- align-items: center;
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
/* EXEMPTIONS:
|
|
2
|
-
- colors_supporting-text-color (selected variant) is ignored because selected menu items do not
|
|
3
|
-
render supporting secondary text, making the selected-state override for supporting text
|
|
4
|
-
colors obsolete. */
|
|
5
|
-
/* recursica-ignore: --recursica_ui-kit_components_menu-item_variants_selection-states_selected_properties_colors_supporting-text-color */
|
|
6
|
-
|
|
7
1
|
/* HARDCODED VALUES:
|
|
8
2
|
- border-style: solid. Structural rendering rule for the dropdown border (Mantine uses Paper which may not set border natively).
|
|
9
3
|
- NOTE: overflow is intentionally NOT set on .dropdown. Mantine renders sub-menu dropdowns
|
|
@@ -1,14 +1,3 @@
|
|
|
1
|
-
/* EXEMPTIONS:
|
|
2
|
-
- content-style and header-style parent variables represent raw JSON styling objects rather than
|
|
3
|
-
direct CSS variables and cannot be applied directly in standard CSS files.
|
|
4
|
-
Sub-properties are fully and individually mapped to elements natively.
|
|
5
|
-
- header/footer background-color are ignored because .header/.footer are intentionally
|
|
6
|
-
transparent (inheriting .content's background), matching Panel's header/footer treatment. */
|
|
7
|
-
/* recursica-ignore: --recursica_ui-kit_components_modal_properties_content-style */
|
|
8
|
-
/* recursica-ignore: --recursica_ui-kit_components_modal_properties_header-style */
|
|
9
|
-
/* recursica-ignore: --recursica_ui-kit_components_modal_properties_colors_footer-background-color */
|
|
10
|
-
/* recursica-ignore: --recursica_ui-kit_components_modal_properties_colors_header-background-color */
|
|
11
|
-
|
|
12
1
|
.root {
|
|
13
2
|
}
|
|
14
3
|
|
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
/* EXEMPTIONS:
|
|
2
|
-
- border-size variables are ignored because the input box uses a uniform static boundary to prevent
|
|
3
|
-
unexpected layout shifts or flickering when switching between focused, disabled, or error states. */
|
|
4
|
-
/* recursica-ignore: --recursica_ui-kit_components_number-input_properties_border-size */
|
|
5
|
-
/* recursica-ignore: --recursica_ui-kit_components_number-input_variants_states_disabled_properties_border-size */
|
|
6
|
-
/* recursica-ignore: --recursica_ui-kit_components_number-input_variants_states_error_properties_border-size */
|
|
7
|
-
|
|
8
1
|
/* LAYOUT SPACING OVERRIDES:
|
|
9
2
|
- Sets the --form-control-margin-bottom spacing hook to map component-specific layout tokens.
|
|
10
3
|
- Also sets the --number-input-control-{max,min}-width hooks consumed inline in NumberInput.tsx,
|
|
@@ -1,84 +1,3 @@
|
|
|
1
|
-
/* EXEMPTIONS:
|
|
2
|
-
- All pagination subcomponent properties (active-pages, inactive-pages, navigation-controls) are ignored
|
|
3
|
-
because we are not implementing custom subcomponent styling for pagination. Instead, pagination items
|
|
4
|
-
directly inherit the unified, standard brand button components for complete UI/UX consistency, rendering
|
|
5
|
-
these generated subcomponent tokens redundant. */
|
|
6
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_active-pages_subcomponent_border-size */
|
|
7
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_active-pages_subcomponent_disabled-opacity */
|
|
8
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_active-pages_subcomponent_elevation */
|
|
9
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_active-pages_subcomponent_height */
|
|
10
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_active-pages_subcomponent_horizontal-padding */
|
|
11
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_active-pages_subcomponent_hover-color */
|
|
12
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_active-pages_subcomponent_hover-elevation */
|
|
13
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_active-pages_subcomponent_hover-opacity */
|
|
14
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_active-pages_subcomponent_icon */
|
|
15
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_active-pages_subcomponent_icon-text-gap */
|
|
16
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_active-pages_subcomponent_max-label-width */
|
|
17
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_active-pages_subcomponent_min-width */
|
|
18
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_active-pages_subcomponent_text_font-family */
|
|
19
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_active-pages_subcomponent_text_font-size */
|
|
20
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_active-pages_subcomponent_text_font-style */
|
|
21
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_active-pages_subcomponent_text_font-weight */
|
|
22
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_active-pages_subcomponent_text_letter-spacing */
|
|
23
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_active-pages_subcomponent_text_line-height */
|
|
24
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_active-pages_subcomponent_text_text-decoration */
|
|
25
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_active-pages_subcomponent_text_text-transform */
|
|
26
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_active-pages_subcomponent_colors_background */
|
|
27
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_active-pages_subcomponent_colors_border-color */
|
|
28
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_active-pages_subcomponent_colors_icon-color */
|
|
29
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_active-pages_subcomponent_colors_text */
|
|
30
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_active-pages_subcomponent_colors_text-hover */
|
|
31
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_inactive-pages_subcomponent_border-size */
|
|
32
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_inactive-pages_subcomponent_disabled-opacity */
|
|
33
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_inactive-pages_subcomponent_elevation */
|
|
34
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_inactive-pages_subcomponent_height */
|
|
35
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_inactive-pages_subcomponent_horizontal-padding */
|
|
36
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_inactive-pages_subcomponent_hover-color */
|
|
37
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_inactive-pages_subcomponent_hover-elevation */
|
|
38
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_inactive-pages_subcomponent_hover-opacity */
|
|
39
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_inactive-pages_subcomponent_icon */
|
|
40
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_inactive-pages_subcomponent_icon-text-gap */
|
|
41
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_inactive-pages_subcomponent_max-label-width */
|
|
42
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_inactive-pages_subcomponent_min-width */
|
|
43
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_inactive-pages_subcomponent_text_font-family */
|
|
44
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_inactive-pages_subcomponent_text_font-size */
|
|
45
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_inactive-pages_subcomponent_text_font-style */
|
|
46
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_inactive-pages_subcomponent_text_font-weight */
|
|
47
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_inactive-pages_subcomponent_text_letter-spacing */
|
|
48
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_inactive-pages_subcomponent_text_line-height */
|
|
49
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_inactive-pages_subcomponent_text_text-decoration */
|
|
50
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_inactive-pages_subcomponent_text_text-transform */
|
|
51
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_inactive-pages_subcomponent_colors_background */
|
|
52
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_inactive-pages_subcomponent_colors_border-color */
|
|
53
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_inactive-pages_subcomponent_colors_icon-color */
|
|
54
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_inactive-pages_subcomponent_colors_text */
|
|
55
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_inactive-pages_subcomponent_colors_text-hover */
|
|
56
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_navigation-controls_subcomponent_border-size */
|
|
57
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_navigation-controls_subcomponent_disabled-opacity */
|
|
58
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_navigation-controls_subcomponent_elevation */
|
|
59
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_navigation-controls_subcomponent_height */
|
|
60
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_navigation-controls_subcomponent_horizontal-padding */
|
|
61
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_navigation-controls_subcomponent_hover-color */
|
|
62
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_navigation-controls_subcomponent_hover-elevation */
|
|
63
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_navigation-controls_subcomponent_hover-opacity */
|
|
64
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_navigation-controls_subcomponent_icon */
|
|
65
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_navigation-controls_subcomponent_icon-text-gap */
|
|
66
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_navigation-controls_subcomponent_max-label-width */
|
|
67
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_navigation-controls_subcomponent_min-width */
|
|
68
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_navigation-controls_subcomponent_text_font-family */
|
|
69
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_navigation-controls_subcomponent_text_font-size */
|
|
70
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_navigation-controls_subcomponent_text_font-style */
|
|
71
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_navigation-controls_subcomponent_text_font-weight */
|
|
72
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_navigation-controls_subcomponent_text_letter-spacing */
|
|
73
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_navigation-controls_subcomponent_text_line-height */
|
|
74
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_navigation-controls_subcomponent_text_text-decoration */
|
|
75
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_navigation-controls_subcomponent_text_text-transform */
|
|
76
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_navigation-controls_subcomponent_colors_background */
|
|
77
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_navigation-controls_subcomponent_colors_border-color */
|
|
78
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_navigation-controls_subcomponent_colors_icon-color */
|
|
79
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_navigation-controls_subcomponent_colors_text */
|
|
80
|
-
/* recursica-ignore: --recursica_ui-kit_components_pagination_properties_navigation-controls_subcomponent_colors_text-hover */
|
|
81
|
-
|
|
82
1
|
.root {
|
|
83
2
|
display: flex;
|
|
84
3
|
align-items: center;
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
- background-color: transparent; on label hover (overriding Mantine)
|
|
4
4
|
- Scope prefix .root to enforce Figma tokens over Mantine's inline calculation without using !important
|
|
5
5
|
*/
|
|
6
|
-
/* recursica-ignore: --recursica_ui-kit_components_segmented-control-item_properties_item_border-radius */
|
|
7
6
|
|
|
8
7
|
.root {
|
|
9
8
|
background-color: var(
|
|
@@ -56,3 +56,4 @@ This document contains specific design decisions, architectural constraints, and
|
|
|
56
56
|
- Thumb, icon, and numeric input no longer have per-component focus colors. Instead they get a focus _ring_ built from the generic `--recursica_brand_states_focus_{border-size,color,margin,blur}` tokens, applied as a `box-shadow` (crisp inner ring at `border-size` plus a soft outer glow using `blur`/`margin`) rather than a color swap.
|
|
57
57
|
- The thumb's focus box-shadow layers the ring on top of its existing `thumb-elevation` shadow rather than replacing it.
|
|
58
58
|
- `.sliderMark[data-filled]` has no default-state "-active" step-indicator token anymore (only `disabled`/`error` define one); it reuses `colors_track-active` so filled marks stay visually tied to the filled portion of the track. Worth a design review if a distinct filled-mark color is expected.
|
|
59
|
+
- `markLabel` was already mapped in the `classNames` prop but had no matching `.sliderMarkLabel` rule in this file, so Mantine silently fell back to its own default theme grey instead of any recursica token. Added a `.sliderMarkLabel` rule reusing the min-max-label typography tokens with `color: inherit`, matching the mui-adapter's equivalent.
|
|
@@ -135,6 +135,40 @@
|
|
|
135
135
|
);
|
|
136
136
|
}
|
|
137
137
|
|
|
138
|
+
/*
|
|
139
|
+
* Mantine's default markLabel has no dedicated recursica token; it renders with Mantine's own
|
|
140
|
+
* theme grey instead of inheriting the container text color. Reusing the min-max-label
|
|
141
|
+
* typography tokens and inheriting color keeps this visually consistent with the min/max guides.
|
|
142
|
+
*/
|
|
143
|
+
.sliderMarkLabel {
|
|
144
|
+
color: inherit;
|
|
145
|
+
|
|
146
|
+
font-family: var(
|
|
147
|
+
--recursica_ui-kit_components_slider_properties_min-max-label_font-family
|
|
148
|
+
);
|
|
149
|
+
font-size: var(
|
|
150
|
+
--recursica_ui-kit_components_slider_properties_min-max-label_font-size
|
|
151
|
+
);
|
|
152
|
+
font-style: var(
|
|
153
|
+
--recursica_ui-kit_components_slider_properties_min-max-label_font-style
|
|
154
|
+
);
|
|
155
|
+
font-weight: var(
|
|
156
|
+
--recursica_ui-kit_components_slider_properties_min-max-label_font-weight
|
|
157
|
+
);
|
|
158
|
+
letter-spacing: var(
|
|
159
|
+
--recursica_ui-kit_components_slider_properties_min-max-label_letter-spacing
|
|
160
|
+
);
|
|
161
|
+
line-height: var(
|
|
162
|
+
--recursica_ui-kit_components_slider_properties_min-max-label_line-height
|
|
163
|
+
);
|
|
164
|
+
text-decoration: var(
|
|
165
|
+
--recursica_ui-kit_components_slider_properties_min-max-label_text-decoration
|
|
166
|
+
);
|
|
167
|
+
text-transform: var(
|
|
168
|
+
--recursica_ui-kit_components_slider_properties_min-max-label_text-transform
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
|
|
138
172
|
/* ==========================================
|
|
139
173
|
3. Min / Max Custom Typography Labels & Floating Active Value
|
|
140
174
|
========================================== */
|
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
/* EXEMPTIONS:
|
|
2
|
-
- border-size variables are ignored because a uniform 1px border is applied globally to prevent
|
|
3
|
-
unexpected layout shift or flickering during focused, disabled, or error state transitions. */
|
|
4
|
-
/* recursica-ignore: --recursica_ui-kit_components_textarea_properties_border-size */
|
|
5
|
-
/* recursica-ignore: --recursica_ui-kit_components_textarea_variants_states_disabled_properties_border-size */
|
|
6
|
-
/* recursica-ignore: --recursica_ui-kit_components_textarea_variants_states_error_properties_border-size */
|
|
7
|
-
|
|
8
1
|
/* LAYOUT SPACING OVERRIDES:
|
|
9
2
|
- Sets the --form-control-margin-bottom spacing hook to map component-specific layout tokens.
|
|
10
3
|
- Also sets the --textarea-control-{max,min}-width hooks consumed inline in TextArea.tsx, since
|
|
@@ -121,20 +121,16 @@ export const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(
|
|
|
121
121
|
/* Naked Input execution safely decoupled from Mantine's macro Input.Wrapper DOM hooks */
|
|
122
122
|
<MantineTextarea
|
|
123
123
|
ref={ref}
|
|
124
|
+
{...(sanitizedProps as unknown as MantineTextareaProps)}
|
|
124
125
|
classNames={mergedClassNames}
|
|
125
126
|
disabled={disabled}
|
|
126
127
|
value={value}
|
|
127
128
|
defaultValue={defaultValue}
|
|
128
129
|
label={undefined}
|
|
129
130
|
description={undefined}
|
|
130
|
-
error={
|
|
131
|
+
error={!!error}
|
|
131
132
|
required={undefined}
|
|
132
133
|
withAsterisk={undefined}
|
|
133
|
-
wrapperProps={{
|
|
134
|
-
"data-disabled": disabled ? "true" : undefined,
|
|
135
|
-
"data-error": error ? "true" : undefined,
|
|
136
|
-
}}
|
|
137
|
-
{...(sanitizedProps as unknown as MantineTextareaProps)}
|
|
138
134
|
/>
|
|
139
135
|
}
|
|
140
136
|
/>
|
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
/* EXEMPTIONS:
|
|
2
|
-
- border-size variables are ignored because a uniform 1px border is applied globally to prevent
|
|
3
|
-
unexpected layout shift or flickering during focused, disabled, or error state transitions. */
|
|
4
|
-
/* recursica-ignore: --recursica_ui-kit_components_text-field_properties_border-size */
|
|
5
|
-
/* recursica-ignore: --recursica_ui-kit_components_text-field_variants_states_disabled_properties_border-size */
|
|
6
|
-
/* recursica-ignore: --recursica_ui-kit_components_text-field_variants_states_error_properties_border-size */
|
|
7
|
-
|
|
8
1
|
/* LAYOUT SPACING OVERRIDES:
|
|
9
2
|
- Sets the --form-control-margin-bottom spacing hook to map component-specific layout tokens.
|
|
10
3
|
- Also sets the --text-field-control-{max,min}-width hooks consumed inline in TextField.tsx,
|
|
@@ -1,19 +1,3 @@
|
|
|
1
|
-
/* EXEMPTIONS:
|
|
2
|
-
- state-specific border-size variables are ignored because a uniform border-size is applied
|
|
3
|
-
globally to prevent unexpected layout shift or flickering during disabled/error transitions.
|
|
4
|
-
- icon-size/icon-color/icon-text-gap have no equivalent here: the time field has no icon slot,
|
|
5
|
-
unlike TextField/DatePicker.
|
|
6
|
-
- placeholder-opacity has no direct equivalent: each SpinInput's native "--" placeholder is styled
|
|
7
|
-
by Mantine's own SpinInput internals, not a ::placeholder pseudo-element we can target directly. */
|
|
8
|
-
/* recursica-ignore: --recursica_ui-kit_components_time-picker_variants_states_disabled_properties_border-size */
|
|
9
|
-
/* recursica-ignore: --recursica_ui-kit_components_time-picker_variants_states_error_properties_border-size */
|
|
10
|
-
/* recursica-ignore: --recursica_ui-kit_components_time-picker_properties_icon-size */
|
|
11
|
-
/* recursica-ignore: --recursica_ui-kit_components_time-picker_properties_icon-text-gap */
|
|
12
|
-
/* recursica-ignore: --recursica_ui-kit_components_time-picker_properties_placeholder-opacity */
|
|
13
|
-
/* recursica-ignore: --recursica_ui-kit_components_time-picker_properties_colors_icon-color */
|
|
14
|
-
/* recursica-ignore: --recursica_ui-kit_components_time-picker_variants_states_disabled_properties_colors_icon-color */
|
|
15
|
-
/* recursica-ignore: --recursica_ui-kit_components_time-picker_variants_states_error_properties_colors_icon-color */
|
|
16
|
-
|
|
17
1
|
/* LAYOUT SPACING OVERRIDES:
|
|
18
2
|
- Sets the --form-control-margin-bottom spacing hook to map component-specific layout tokens. */
|
|
19
3
|
.layoutOverride {
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
/* EXEMPTIONS:
|
|
2
|
-
- timeline-bullet_variants_types_avatar_properties_avatar-size is ignored because under the avatar timeline variant,
|
|
3
|
-
the bullet container size uses fallback bullet-size configurations to maintain vertical alignment with the
|
|
4
|
-
inactive/active connector line, while the nested Avatar subcomponent handles its own sizing natively. */
|
|
5
|
-
/* recursica-ignore: --recursica_ui-kit_components_timeline-bullet_variants_types_avatar_properties_avatar-size */
|
|
6
|
-
|
|
7
1
|
.root {
|
|
8
2
|
display: flex;
|
|
9
3
|
flex-direction: column;
|
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
/* EXEMPTIONS:
|
|
2
|
-
- elevation levels layer-1, layer-2, and layer-3 are ignored because all toasts explicitly use the standard
|
|
3
|
-
layer-0 elevation shadow for styling consistency. */
|
|
4
|
-
/* recursica-ignore: --recursica_ui-kit_components_toast_properties_elevation_layer-1 */
|
|
5
|
-
/* recursica-ignore: --recursica_ui-kit_components_toast_properties_elevation_layer-2 */
|
|
6
|
-
/* recursica-ignore: --recursica_ui-kit_components_toast_properties_elevation_layer-3 */
|
|
7
|
-
|
|
8
1
|
/* HARDCODED VALUES:
|
|
9
2
|
- border-style: solid. Baseline so the per-variant border-color tokens actually render.
|
|
10
3
|
*/
|
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
/* EXEMPTIONS:
|
|
2
|
-
- beak-inset is ignored because Tooltip positioning calculations are handled dynamically by Mantine/Floating UI at the React runtime.
|
|
3
|
-
- beak-size is ignored because Mantine's tooltip arrows compute their sizing and positional offsets
|
|
4
|
-
dynamically within the React rendering engine (requires inline pixel number rather than standard CSS variables).
|
|
5
|
-
The beak size is checked in JS against a fixed value of 16px. If this variable changes, the TSX components
|
|
6
|
-
need to be reviewed/re-compiled. */
|
|
7
|
-
/* recursica-ignore: --recursica_ui-kit_components_tooltip_properties_beak-inset = 8px */
|
|
8
|
-
/* recursica-ignore: --recursica_ui-kit_components_tooltip_properties_beak-size = 16px */
|
|
9
|
-
|
|
10
1
|
/* HARDCODED VALUES:
|
|
11
2
|
- border-style: solid. Structural rendering rule for the tooltip border (Mantine uses Box
|
|
12
3
|
which may not set border-style natively). Same pattern as Menu / HoverCard.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# TransferList Implementation Notes
|
|
2
|
+
|
|
3
|
+
## Architecture overview
|
|
4
|
+
|
|
5
|
+
`TransferList` replaces the "coming soon" stub with a fully custom composite — neither
|
|
6
|
+
`@mantine/core` nor `@mui/material` ships a real dual-listbox component (MUI's docs "Transfer
|
|
7
|
+
List" is a List+Checkbox recipe, not a package export), so it's built from Recursica's own
|
|
8
|
+
primitives, the same situation `FileUpload`/`FileInput` were in.
|
|
9
|
+
|
|
10
|
+
Follows Matt's reference implementation (Forge's fallback `TransferList.tsx`) fairly closely:
|
|
11
|
+
|
|
12
|
+
- Two side-by-side panes (source/target), each: a header row (pane label + `Badge` count,
|
|
13
|
+
`"selected / total"` once something's checked), a search `TextField`, then a scrollable list of
|
|
14
|
+
`Checkbox` rows (`CheckboxGroup` for items carrying a `group` field).
|
|
15
|
+
- A column of four transfer `Button`s between the panes: single/double chevron, each direction —
|
|
16
|
+
single moves only the checked items in that pane, double moves everything in that pane.
|
|
17
|
+
- Data model: `data`/`defaultData` as a `[sourceItems, targetItems]` tuple + `onChange`, matching
|
|
18
|
+
Forge's controlled/uncontrolled pattern (same shape as `FileUpload`'s `files`/`onFilesAdded`).
|
|
19
|
+
|
|
20
|
+
## Routed through `FormControlWrapper` directly, not Forge's hand-rolled label/assistive
|
|
21
|
+
|
|
22
|
+
Forge's reference renders its own `Label`/`AssistiveElement` directly instead of going through
|
|
23
|
+
`FormControlWrapper`. Per direction, this build uses `FormControlWrapper` instead — consistent
|
|
24
|
+
with every other form control in this codebase (and with `FileUpload`, which was reverted to
|
|
25
|
+
`FormControlWrapper` rather than hand-rolling that same thing). `formLayout`
|
|
26
|
+
(`stacked`/`side-by-side`), `label`, `required`, `assistiveText`/`description`/`helperText`, and
|
|
27
|
+
`error` all come from the standard wrapper; only the two panes + transfer buttons are the
|
|
28
|
+
component's own content.
|
|
29
|
+
|
|
30
|
+
## `state` axis: `disabled`/`error` props, not Forge's `state` string
|
|
31
|
+
|
|
32
|
+
Forge's reference takes a single `state="default"|"disabled"|"error"` prop. This build instead
|
|
33
|
+
uses the same convention as every other Recursica control: a boolean `disabled` prop plus
|
|
34
|
+
`FormControlWrapper`'s own `error` (message) prop — `error`'s mere presence is what triggers the
|
|
35
|
+
error visuals, exactly like `TextArea`/`CheckboxGroup`. The token export only defines
|
|
36
|
+
`disabled`/`error` state variants (no `focus`), matching Matt's direction to "follow the tokens."
|
|
37
|
+
|
|
38
|
+
## `readOnly` mode (added 2026-08-19)
|
|
39
|
+
|
|
40
|
+
Forge's reference has no read-only concept, but Matt asked for a `ReadOnly` story demonstrating
|
|
41
|
+
the selected items as a read-only list. Switched from calling `FormControlWrapper` directly to
|
|
42
|
+
routing through `WithReadOnlyWrapper` (the follow-up flagged in the original version of this note),
|
|
43
|
+
matching `TextArea`'s shape: `readOnly`/`readOnlyComponent`/`emptyValueComponent` added to the prop
|
|
44
|
+
surface via `ReadOnlyControlProps`, `readOnlyType="text"`, and `readOnlyValue` set to the target
|
|
45
|
+
pane's item labels (`effectiveData[1].map(item => item.label)`). Renders as a comma-joined text
|
|
46
|
+
list via the shared `ReadOnlyTextField`, same convention `CheckboxGroup`'s own read-only mode
|
|
47
|
+
already uses for an array of values — no new read-only renderer needed. The two panes + transfer
|
|
48
|
+
buttons (`activeComponent`) are skipped entirely when `readOnly` is set, same as every other
|
|
49
|
+
control.
|
|
50
|
+
|
|
51
|
+
## Height/gap/padding token audit (2026-08-19)
|
|
52
|
+
|
|
53
|
+
Matt flagged the pane height as "too short" and asked that gap/padding be tied to recursica
|
|
54
|
+
variables. Re-verified against `recursica_variables_scoped.css`: `properties_height` (200px),
|
|
55
|
+
`properties_width`, `properties_vertical-padding`/`properties_horizontal-padding`, and
|
|
56
|
+
`properties_gap` were already wired to their tokens (see "Token interpretation" above) — the 200px
|
|
57
|
+
pane height is the design token's own value, not a hardcoded fallback. Two spacing values genuinely
|
|
58
|
+
have no covering token in the 31-variable schema and are intentionally left as hardcoded pixels
|
|
59
|
+
(see `TransferList.module.css` comments) rather than reusing another component's token: the gap
|
|
60
|
+
between stacked `CheckboxGroup` blocks in `.paneList` (ungrouped row + each named group), and the
|
|
61
|
+
gap between the four transfer buttons in `.transferColumn`. If a token is added to the schema for
|
|
62
|
+
either, wire it in directly; until then this matches the established precedent (e.g. `FileUpload`'s
|
|
63
|
+
untokened icon size) of leaving a truly uncovered value hardcoded with a documented reason instead
|
|
64
|
+
of borrowing a sibling component's namespace.
|
|
65
|
+
|
|
66
|
+
## Token interpretation: unlabeled tokens with more than one plausible layout target
|
|
67
|
+
|
|
68
|
+
The 31-variable schema (`properties_*` + two `layouts.*` + `states.{disabled,error}`) has a few
|
|
69
|
+
names that don't pin down a single location by themselves:
|
|
70
|
+
|
|
71
|
+
- **`properties_gap`** — applied to the row holding `[source pane, transfer column, target pane]`.
|
|
72
|
+
It's the only _unnested_ gap the schema defines at the component's own level (not under
|
|
73
|
+
`header-style`, a state, or a layout), so it reads as the component's top-level layout gap.
|
|
74
|
+
- **`properties_title-filter-gap`** — between each pane's header row (label + count `Badge`) and
|
|
75
|
+
its search field.
|
|
76
|
+
- **`properties_filter-items-gap`** — between each pane's search field and its item list.
|
|
77
|
+
- **`properties_header-style_*` / `properties_colors_header-color`** — typography/color for each
|
|
78
|
+
pane's own header text, not the overall `FormControlWrapper` label (which has its own type
|
|
79
|
+
styling already).
|
|
80
|
+
- **`properties_width` (300px) / `properties_height` (200px)** — taken as each pane's own fixed
|
|
81
|
+
box size (`flex: 1 1 <width>`, so panes still stretch evenly in a wider container; `height` is
|
|
82
|
+
literal since a dual-listbox needs a bounded, independently-scrollable list).
|
|
83
|
+
|
|
84
|
+
No exemptions needed beyond `border-size` (see below) — all 31 variables are referenced; verified
|
|
85
|
+
zero broken/unused via `recursica-token-analyzer`.
|
|
86
|
+
|
|
87
|
+
## Border-size intentionally unused
|
|
88
|
+
|
|
89
|
+
Same house policy `TextField`/`TextArea`/`FileInput` already follow: `border-size` (base,
|
|
90
|
+
`disabled`, `error`) is `recursica-ignore`d and a flat 1px border is applied uniformly instead, so
|
|
91
|
+
switching states doesn't shift layout.
|
|
92
|
+
|
|
93
|
+
## No forge-defined focus state
|
|
94
|
+
|
|
95
|
+
`transfer-list` has no `states.focus` axis in the export — same as `FileInput`/`TextField`. Focus
|
|
96
|
+
is handled per-control (each `Checkbox`/`TextField`/`Button` already has its own focus ring); the
|
|
97
|
+
pane box itself has no focus state to render.
|
|
98
|
+
|
|
99
|
+
## Grouping and search are local, not per-item persisted state
|
|
100
|
+
|
|
101
|
+
Search filters each pane independently (`sourceSearch`/`targetSearch`); grouped items render under
|
|
102
|
+
a `CheckboxGroup` keyed by `item.group`, ungrouped items render as plain `Checkbox` rows above the
|
|
103
|
+
groups (alphabetized by group name) — same two-bucket split Forge's reference uses. Selection
|
|
104
|
+
(`sourceSelected`/`targetSelected`) is cleared on every transfer, matching Forge's behavior.
|
|
105
|
+
|
|
106
|
+
## Chevron icons are inline, not a shared icon set entry
|
|
107
|
+
|
|
108
|
+
Same precedent as `Tree`'s `ExpandGlyph`/`FileInput`'s `ClearIcon`: a single-chevron and a
|
|
109
|
+
double-chevron SVG are defined locally and flipped via `transform: scaleX(-1)` for the "left"
|
|
110
|
+
direction, rather than maintaining four separate paths or adding new shared icon-set entries for a
|
|
111
|
+
single component.
|