@morscherlab/mint-sdk 1.0.0-alpha.9 → 1.0.0-beta.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 (81) hide show
  1. package/dist/__tests__/components/PluginIcon.test.d.ts +1 -0
  2. package/dist/components/AppTopBar.vue.d.ts +2 -0
  3. package/dist/components/BaseButton.vue.d.ts +1 -1
  4. package/dist/components/BaseCheckbox.vue.d.ts +1 -1
  5. package/dist/components/BaseInput.vue.d.ts +1 -1
  6. package/dist/components/BasePill.vue.d.ts +1 -1
  7. package/dist/components/BaseRadioGroup.vue.d.ts +1 -1
  8. package/dist/components/BaseSelect.vue.d.ts +1 -1
  9. package/dist/components/BaseSlider.vue.d.ts +1 -1
  10. package/dist/components/BaseTextarea.vue.d.ts +1 -1
  11. package/dist/components/BaseToggle.vue.d.ts +1 -1
  12. package/dist/components/ColorSlider.vue.d.ts +1 -1
  13. package/dist/components/ConcentrationInput.vue.d.ts +1 -1
  14. package/dist/components/DatePicker.vue.d.ts +1 -1
  15. package/dist/components/DateTimePicker.vue.d.ts +1 -1
  16. package/dist/components/Divider.vue.d.ts +1 -1
  17. package/dist/components/DropdownButton.vue.d.ts +1 -1
  18. package/dist/components/FileUploader.vue.d.ts +1 -1
  19. package/dist/components/FormulaInput.vue.d.ts +1 -1
  20. package/dist/components/IconButton.vue.d.ts +1 -1
  21. package/dist/components/LoadingSpinner.vue.d.ts +1 -1
  22. package/dist/components/MultiSelect.vue.d.ts +1 -1
  23. package/dist/components/NumberInput.vue.d.ts +1 -1
  24. package/dist/components/PluginIcon.vue.d.ts +11 -0
  25. package/dist/components/ProgressBar.vue.d.ts +1 -1
  26. package/dist/components/ReagentEditor.vue.d.ts +1 -1
  27. package/dist/components/ResourceCard.vue.d.ts +1 -1
  28. package/dist/components/SampleSelector.vue.d.ts +1 -1
  29. package/dist/components/ScientificNumber.vue.d.ts +1 -1
  30. package/dist/components/SegmentedControl.vue.d.ts +1 -1
  31. package/dist/components/SettingsModal.vue.d.ts +22 -2
  32. package/dist/components/TagsInput.vue.d.ts +1 -1
  33. package/dist/components/TimePicker.vue.d.ts +1 -1
  34. package/dist/components/TimeRangeInput.vue.d.ts +1 -1
  35. package/dist/components/UnitInput.vue.d.ts +1 -1
  36. package/dist/components/WellPlate.vue.d.ts +1 -1
  37. package/dist/components/index.d.ts +1 -0
  38. package/dist/components/index.js +3 -3
  39. package/dist/{components-CzbQQPCb.js → components-_XqPEhP9.js} +572 -362
  40. package/dist/components-_XqPEhP9.js.map +1 -0
  41. package/dist/composables/index.js +2 -2
  42. package/dist/composables/usePlatformContext.d.ts +3 -0
  43. package/dist/{composables-BXklV5ii.js → composables-tiZqLu1M.js} +2 -2
  44. package/dist/{composables-BXklV5ii.js.map → composables-tiZqLu1M.js.map} +1 -1
  45. package/dist/index.d.ts +2 -2
  46. package/dist/index.js +4 -4
  47. package/dist/install.js +2 -2
  48. package/dist/stores/auth.d.ts +1 -1
  49. package/dist/styles.css +896 -553
  50. package/dist/types/components.d.ts +39 -0
  51. package/dist/types/index.d.ts +1 -1
  52. package/dist/types/platform.d.ts +1 -0
  53. package/dist/{useScheduleDrag-CxBeqYcu.js → useScheduleDrag-CA9sGNJG.js} +4000 -4000
  54. package/dist/useScheduleDrag-CA9sGNJG.js.map +1 -0
  55. package/package.json +1 -1
  56. package/src/__tests__/components/AppTopBar.test.ts +31 -13
  57. package/src/__tests__/components/PluginIcon.test.ts +119 -0
  58. package/src/components/AppTopBar.vue +32 -27
  59. package/src/components/PluginIcon.story.vue +71 -0
  60. package/src/components/PluginIcon.vue +88 -0
  61. package/src/components/SettingsModal.story.vue +337 -45
  62. package/src/components/SettingsModal.vue +251 -64
  63. package/src/components/index.ts +1 -0
  64. package/src/index.ts +4 -0
  65. package/src/styles/components/app-pill-nav.css +1 -2
  66. package/src/styles/components/app-top-bar.css +1 -2
  67. package/src/styles/components/button.css +3 -7
  68. package/src/styles/components/dropdown-button.css +4 -4
  69. package/src/styles/components/input.css +4 -5
  70. package/src/styles/components/number-input.css +3 -3
  71. package/src/styles/components/plugin-icon.css +38 -0
  72. package/src/styles/components/segmented-control.css +4 -7
  73. package/src/styles/components/settings-modal.css +184 -0
  74. package/src/styles/components/tabs.css +1 -2
  75. package/src/styles/components/textarea.css +4 -5
  76. package/src/styles/components/unit-input.css +3 -3
  77. package/src/types/components.ts +42 -0
  78. package/src/types/index.ts +3 -0
  79. package/src/types/platform.ts +1 -0
  80. package/dist/components-CzbQQPCb.js.map +0 -1
  81. package/dist/useScheduleDrag-CxBeqYcu.js.map +0 -1
package/dist/styles.css CHANGED
@@ -38,20 +38,19 @@
38
38
  cursor: not-allowed;
39
39
  }
40
40
 
41
- /* Size variants — 1px optical padding shift (0.16+).
42
- See CLAUDE.md § Optical Centering. */
41
+ /* Size variants */
43
42
  .mint-input--sm {
44
- padding: 0.3125rem 0.625rem 0.4375rem;
43
+ padding: 0.375rem 0.625rem;
45
44
  font-size: 0.8125rem;
46
45
  min-height: var(--form-height-sm);
47
46
  }
48
47
  .mint-input--md {
49
- padding: 0.4375rem 0.75rem 0.5625rem;
48
+ padding: 0.5rem 0.75rem;
50
49
  font-size: 0.875rem;
51
50
  min-height: var(--form-height-md);
52
51
  }
53
52
  .mint-input--lg {
54
- padding: 0.6875rem 1rem 0.8125rem;
53
+ padding: 0.75rem 1rem;
55
54
  font-size: 1rem;
56
55
  min-height: var(--form-height-lg);
57
56
  }
@@ -98,18 +97,17 @@
98
97
  resize: none;
99
98
  }
100
99
 
101
- /* Size variants — 1px optical padding shift (0.16+).
102
- See CLAUDE.md § Optical Centering. */
100
+ /* Size variants */
103
101
  .mint-textarea--sm {
104
- padding: 0.3125rem 0.625rem 0.4375rem;
102
+ padding: 0.375rem 0.625rem;
105
103
  font-size: 0.8125rem;
106
104
  }
107
105
  .mint-textarea--md {
108
- padding: 0.4375rem 0.75rem 0.5625rem;
106
+ padding: 0.5rem 0.75rem;
109
107
  font-size: 0.875rem;
110
108
  }
111
109
  .mint-textarea--lg {
112
- padding: 0.6875rem 1rem 0.8125rem;
110
+ padding: 0.75rem 1rem;
113
111
  font-size: 1rem;
114
112
  }
115
113
  .mint-textarea--resize-none {
@@ -1425,11 +1423,11 @@
1425
1423
 
1426
1424
  /* Horizontal padding matches BaseInput canonical scale (10/12/16) so FormField's
1427
1425
  12px label indent aligns with the numeric text across all input types. */
1428
- .mint-number-input__input--sm { padding: 0.3125rem 0.625rem 0.4375rem; font-size: 0.875rem;
1426
+ .mint-number-input__input--sm { padding: 0.375rem 0.625rem; font-size: 0.875rem;
1429
1427
  }
1430
- .mint-number-input__input--md { padding: 0.4375rem 0.75rem 0.5625rem; font-size: 0.875rem;
1428
+ .mint-number-input__input--md { padding: 0.5rem 0.75rem; font-size: 0.875rem;
1431
1429
  }
1432
- .mint-number-input__input--lg { padding: 0.6875rem 1rem 0.8125rem; font-size: 1rem;
1430
+ .mint-number-input__input--lg { padding: 0.75rem 1rem; font-size: 1rem;
1433
1431
  }
1434
1432
 
1435
1433
  /* ---------- Unit suffix ---------- */
@@ -1810,306 +1808,206 @@
1810
1808
  transition: none;
1811
1809
  }
1812
1810
  }
1813
- /* MoleculeInput Component Styles */
1814
- .mint-molecule-input {
1815
- display: flex;
1816
- flex-direction: column;
1811
+ /* DateTimePicker Component Styles */
1812
+ .mint-datetime-picker {
1813
+ position: relative;
1814
+ }
1815
+ .mint-datetime-picker__input-wrapper {
1816
+ position: relative;
1817
+ }
1818
+ .mint-datetime-picker__input {
1819
+ width: 100%;
1817
1820
  border-radius: var(--radius-md);
1818
1821
  border: 1px solid var(--border-color);
1819
1822
  background-color: var(--bg-secondary);
1820
- overflow: hidden;
1823
+ color: var(--text-primary);
1821
1824
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
1825
+ cursor: pointer;
1826
+ padding-left: 2.5rem;
1827
+ padding-right: 2.5rem;
1822
1828
  }
1823
- .mint-molecule-input:focus-within {
1829
+ .mint-datetime-picker__input:focus-visible {
1830
+ outline: none;
1824
1831
  border-color: transparent;
1825
1832
  box-shadow: var(--focus-ring);
1826
1833
  }
1827
- .mint-molecule-input--disabled {
1828
- opacity: var(--mint-disabled-opacity);
1829
- pointer-events: none;
1834
+ .mint-datetime-picker__input--sm {
1835
+ padding-top: 0.375rem;
1836
+ padding-bottom: 0.375rem;
1837
+ font-size: 0.875rem;
1830
1838
  }
1831
- .mint-molecule-input--readonly {
1832
- pointer-events: none;
1839
+ .mint-datetime-picker__input--md {
1840
+ padding-top: 0.5rem;
1841
+ padding-bottom: 0.5rem;
1842
+ font-size: 0.875rem;
1833
1843
  }
1834
- .mint-molecule-input--error {
1844
+ .mint-datetime-picker__input--lg {
1845
+ padding-top: 0.75rem;
1846
+ padding-bottom: 0.75rem;
1847
+ font-size: 1rem;
1848
+ }
1849
+ .mint-datetime-picker__input--error {
1835
1850
  border-color: var(--mint-error);
1836
1851
  }
1837
- .mint-molecule-input--error:focus-within {
1852
+ .mint-datetime-picker__input--error:focus-visible {
1838
1853
  box-shadow: var(--focus-ring-error);
1839
1854
  }
1840
-
1841
- /* Editor container */
1842
- .mint-molecule-input__editor {
1843
- position: relative;
1844
- width: 100%;
1845
- min-height: 200px;
1846
- background-color: var(--bg-secondary);
1847
- }
1848
- .mint-molecule-input__editor iframe {
1849
- border: none;
1850
- display: block;
1855
+ .mint-datetime-picker__input--disabled {
1856
+ opacity: var(--mint-disabled-opacity);
1857
+ cursor: not-allowed;
1858
+ background-color: var(--bg-tertiary);
1851
1859
  }
1852
-
1853
- /* Skeleton loader */
1854
- .mint-molecule-input__skeleton {
1860
+ .mint-datetime-picker__icon-calendar {
1861
+ position: absolute;
1862
+ top: 0;
1863
+ bottom: 0;
1864
+ left: 0;
1855
1865
  display: flex;
1856
- flex-direction: column;
1857
1866
  align-items: center;
1858
- justify-content: center;
1859
- gap: 1rem;
1860
- height: 100%;
1861
- min-height: 200px;
1862
- background-color: var(--bg-tertiary);
1863
- }
1864
- .mint-molecule-input__skeleton-icon {
1865
- width: 3rem;
1866
- height: 3rem;
1867
- color: var(--text-muted);
1868
- animation: mint-molecule-pulse 1.5s ease-in-out infinite;
1867
+ padding-left: 0.75rem;
1868
+ pointer-events: none;
1869
1869
  }
1870
- .mint-molecule-input__skeleton-text {
1871
- font-size: 0.875rem;
1870
+ .mint-datetime-picker__icon-calendar svg {
1871
+ width: 1rem;
1872
+ height: 1rem;
1872
1873
  color: var(--text-muted);
1873
1874
  }
1874
- @keyframes mint-molecule-pulse {
1875
- 0%, 100% {
1876
- opacity: 0.4;
1877
- }
1878
- 50% {
1879
- opacity: 1;
1880
- }
1881
- }
1882
-
1883
- /* Readonly SVG display */
1884
- .mint-molecule-input__readonly {
1875
+ .mint-datetime-picker__icon-clock {
1876
+ position: absolute;
1877
+ top: 0;
1878
+ bottom: 0;
1879
+ right: 0;
1885
1880
  display: flex;
1886
1881
  align-items: center;
1887
- justify-content: center;
1888
- min-height: 200px;
1889
- padding: 1rem;
1890
- background-color: var(--bg-tertiary);
1882
+ padding-right: 0.75rem;
1883
+ pointer-events: none;
1891
1884
  }
1892
- .mint-molecule-input__readonly svg {
1893
- max-width: 100%;
1894
- max-height: 100%;
1885
+ .mint-datetime-picker__icon-clock svg {
1886
+ width: 1rem;
1887
+ height: 1rem;
1888
+ color: var(--text-muted);
1895
1889
  }
1896
1890
 
1897
- /* Empty state */
1898
- .mint-molecule-input__empty {
1899
- display: flex;
1900
- flex-direction: column;
1901
- align-items: center;
1902
- justify-content: center;
1903
- gap: 0.5rem;
1904
- min-height: 200px;
1905
- padding: 1rem;
1906
- color: var(--text-muted);
1891
+ /* Dropdown */
1892
+ .mint-datetime-picker__dropdown {
1893
+ position: absolute;
1894
+ z-index: 50;
1895
+ margin-top: 0.25rem;
1896
+ width: 20rem;
1897
+ padding: 0.75rem;
1898
+ border-radius: var(--radius-md);
1899
+ border: 1px solid var(--border-color);
1900
+ background-color: var(--bg-primary);
1901
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
1907
1902
  }
1908
- .mint-molecule-input__empty-icon {
1909
- width: 2.5rem;
1910
- height: 2.5rem;
1903
+
1904
+ /* Calendar section */
1905
+ .mint-datetime-picker__calendar-section {
1906
+ margin-bottom: 0;
1911
1907
  }
1912
- .mint-molecule-input__empty-text {
1913
- font-size: 0.875rem;
1908
+
1909
+ /* Divider */
1910
+ .mint-datetime-picker__divider {
1911
+ height: 1px;
1912
+ background-color: var(--border-color);
1913
+ margin: 0.5rem 0;
1914
1914
  }
1915
1915
 
1916
- /* SMILES preview */
1917
- .mint-molecule-input__smiles {
1918
- padding: 0.5rem 0.75rem;
1919
- font-family: 'Fira Code', monospace;
1920
- font-size: 0.75rem;
1921
- color: var(--text-secondary);
1922
- background-color: var(--bg-tertiary);
1923
- border-top: 1px solid var(--border-color);
1924
- word-break: break-all;
1925
- user-select: all;
1916
+ /* Time section */
1917
+ .mint-datetime-picker__time-section {
1918
+ padding: 0;
1926
1919
  }
1927
- .mint-molecule-input__smiles-label {
1920
+ .mint-datetime-picker__time-label {
1921
+ font-size: 0.6875rem;
1928
1922
  font-weight: 500;
1929
1923
  color: var(--text-muted);
1930
- margin-right: 0.5rem;
1924
+ text-transform: uppercase;
1925
+ letter-spacing: 0.05em;
1926
+ margin-bottom: 0.375rem;
1927
+ }
1928
+ .mint-datetime-picker__time-grid {
1929
+ display: grid;
1930
+ grid-template-columns: repeat(4, 1fr);
1931
+ gap: 0.25rem;
1932
+ max-height: 10rem;
1933
+ overflow-y: auto;
1931
1934
  }
1932
1935
 
1933
- /* Error state */
1934
- .mint-molecule-input__error {
1935
- padding: 0.75rem;
1936
- font-size: 0.875rem;
1937
- color: var(--mint-error);
1938
- background-color: var(--mint-error-bg);
1939
- border-top: 1px solid var(--mint-error);
1936
+ /* Time chips */
1937
+ .mint-datetime-picker__time-chip {
1938
+ padding: 0.25rem 0.5rem;
1939
+ font-size: 0.75rem;
1940
+ border-radius: var(--radius, 0.375rem);
1941
+ border: 1px solid var(--border-color);
1942
+ background-color: var(--bg-secondary);
1943
+ color: var(--text-primary);
1944
+ cursor: pointer;
1945
+ text-align: center;
1946
+ transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
1940
1947
  }
1941
- .mint-molecule-input__error-icon {
1942
- width: 1rem;
1943
- height: 1rem;
1944
- margin-right: 0.5rem;
1945
- vertical-align: middle;
1948
+ .mint-datetime-picker__time-chip:hover {
1949
+ background-color: var(--bg-hover);
1950
+ border-color: var(--color-primary);
1951
+ }
1952
+ .mint-datetime-picker__time-chip--active {
1953
+ background-color: var(--color-primary);
1954
+ border-color: var(--color-primary);
1955
+ color: white;
1956
+ }
1957
+ .mint-datetime-picker__time-chip--active:hover {
1958
+ background-color: var(--color-primary);
1959
+ }
1960
+ .mint-datetime-picker__time-chip--disabled {
1961
+ opacity: 0.3;
1962
+ cursor: not-allowed;
1946
1963
  }
1947
1964
 
1948
- /* Actions toolbar */
1949
- .mint-molecule-input__actions {
1965
+ /* Footer */
1966
+ .mint-datetime-picker__footer {
1950
1967
  display: flex;
1951
- gap: 0.25rem;
1952
- padding: 0.5rem;
1953
- background-color: var(--bg-tertiary);
1968
+ align-items: center;
1969
+ justify-content: space-between;
1970
+ margin-top: 0.75rem;
1971
+ padding-top: 0.75rem;
1954
1972
  border-top: 1px solid var(--border-color);
1955
1973
  }
1956
- .mint-molecule-input__action-btn {
1957
- display: flex;
1958
- align-items: center;
1959
- justify-content: center;
1960
- padding: 0.375rem;
1974
+ .mint-datetime-picker__footer-btn {
1975
+ font-size: 0.75rem;
1961
1976
  background: transparent;
1962
1977
  border: none;
1963
- border-radius: var(--radius-sm);
1964
- color: var(--text-muted);
1965
1978
  cursor: pointer;
1966
- transition: color 0.15s ease, background-color 0.15s ease;
1979
+ transition: color 0.15s ease;
1980
+ color: var(--color-primary);
1967
1981
  }
1968
- .mint-molecule-input__action-btn:hover:not(:disabled) {
1969
- color: var(--text-primary);
1970
- background-color: var(--bg-hover);
1982
+ .mint-datetime-picker__footer-btn:hover {
1983
+ opacity: 0.8;
1971
1984
  }
1972
- .mint-molecule-input__action-btn:disabled {
1973
- opacity: var(--mint-disabled-opacity);
1974
- cursor: not-allowed;
1985
+ .mint-datetime-picker__footer-btn + .mint-datetime-picker__footer-btn {
1986
+ margin-left: 0.75rem;
1975
1987
  }
1976
- .mint-molecule-input__action-btn svg {
1977
- width: 1rem;
1978
- height: 1rem;
1979
- }
1980
- /* ConcentrationInput Component Styles */
1981
- .mint-concentration-input {
1982
- display: flex;
1983
- flex-direction: column;
1984
- gap: 0.25rem;
1985
- }
1986
- .mint-concentration-input__controls {
1987
- display: flex;
1988
- border-radius: var(--radius-md);
1989
- border: 1px solid var(--border-color);
1990
- overflow: hidden;
1991
- box-sizing: border-box;
1992
- transition: border-color 0.15s ease, box-shadow 0.15s ease;
1993
- }
1994
- .mint-concentration-input__controls--sm {
1995
- min-height: var(--form-height-sm);
1996
- }
1997
- .mint-concentration-input__controls--md {
1998
- min-height: var(--form-height-md);
1999
- }
2000
- .mint-concentration-input__controls--lg {
2001
- min-height: var(--form-height-lg);
2002
- }
2003
- .mint-concentration-input__controls:focus-within {
2004
- border-color: transparent;
2005
- box-shadow: var(--focus-ring);
2006
- }
2007
- .mint-concentration-input--error .mint-concentration-input__controls {
2008
- border-color: var(--mint-error);
2009
- }
2010
- .mint-concentration-input--error .mint-concentration-input__controls:focus-within {
2011
- box-shadow: var(--focus-ring-error);
2012
- }
2013
- .mint-concentration-input--disabled .mint-concentration-input__controls {
2014
- opacity: var(--mint-disabled-opacity);
2015
- }
2016
-
2017
- /* Value input */
2018
- .mint-concentration-input__value {
2019
- flex: 1;
2020
- min-width: 0;
2021
- background-color: var(--bg-secondary);
2022
- color: var(--text-primary);
2023
- border: none;
2024
- outline: none;
2025
- line-height: 1.25;
2026
- -webkit-appearance: textfield;
2027
- -moz-appearance: textfield;
2028
- appearance: textfield;
2029
- }
2030
- .mint-concentration-input__value::-webkit-outer-spin-button,
2031
- .mint-concentration-input__value::-webkit-inner-spin-button {
2032
- -webkit-appearance: none;
2033
- margin: 0;
2034
- }
2035
- .mint-concentration-input__value::placeholder {
1988
+ .mint-datetime-picker__footer-btn--muted {
2036
1989
  color: var(--text-muted);
2037
1990
  }
2038
- .mint-concentration-input__value--sm {
2039
- padding: 0.375rem 0.625rem;
2040
- font-size: 0.875rem;
2041
- }
2042
- .mint-concentration-input__value--md {
2043
- padding: 0.5rem 0.75rem;
2044
- font-size: 0.875rem;
2045
- }
2046
- .mint-concentration-input__value--lg {
2047
- padding: 0.75rem 1rem;
2048
- font-size: 1rem;
2049
- }
2050
- .mint-concentration-input__value--disabled {
2051
- cursor: not-allowed;
2052
- background-color: var(--bg-tertiary);
2053
- }
2054
-
2055
- /* Unit select */
2056
- .mint-concentration-input__unit {
2057
- position: relative;
2058
- flex-shrink: 0;
2059
- border-left: 1px solid var(--border-color);
2060
- }
2061
- .mint-concentration-input__unit-select {
2062
- height: 100%;
2063
- background-color: var(--bg-tertiary);
1991
+ .mint-datetime-picker__footer-btn--muted:hover {
2064
1992
  color: var(--text-primary);
2065
- border: none;
2066
- outline: none;
2067
- cursor: pointer;
2068
- font-weight: 500;
2069
- padding-right: 1.5rem;
2070
- appearance: none;
2071
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");
2072
- background-position: right 0.375rem center;
2073
- background-repeat: no-repeat;
2074
- background-size: 1rem 1rem;
2075
- }
2076
- .mint-concentration-input__unit-select--sm {
2077
- padding: 0.375rem 1.5rem 0.375rem 0.5rem;
2078
- font-size: 0.75rem;
2079
- min-width: 4rem;
2080
- }
2081
- .mint-concentration-input__unit-select--md {
2082
- padding: 0.5rem 1.75rem 0.5rem 0.625rem;
2083
- font-size: 0.875rem;
2084
- min-width: 4.5rem;
2085
- }
2086
- .mint-concentration-input__unit-select--lg {
2087
- padding: 0.75rem 2rem 0.75rem 0.75rem;
2088
- font-size: 0.875rem;
2089
- min-width: 5rem;
2090
- }
2091
- .mint-concentration-input__unit-select:disabled {
2092
- cursor: not-allowed;
2093
- opacity: 0.7;
2094
- }
2095
- .mint-concentration-input__unit-select:hover:not(:disabled) {
2096
- background-color: var(--bg-hover);
2097
1993
  }
2098
1994
 
2099
- /* Unit option group */
2100
- .mint-concentration-input__unit-group {
2101
- font-weight: 600;
2102
- color: var(--text-secondary);
1995
+ /* Transition classes */
1996
+ .mint-datetime-picker__dropdown-enter-active {
1997
+ transition: opacity 0.1s ease-out, transform 0.1s ease-out;
2103
1998
  }
2104
-
2105
- /* Conversion hint */
2106
- .mint-concentration-input__conversion {
2107
- font-size: 0.75rem;
2108
- color: var(--text-muted);
2109
- padding-left: 0.125rem;
1999
+ .mint-datetime-picker__dropdown-leave-active {
2000
+ transition: opacity 0.075s ease-in, transform 0.075s ease-in;
2110
2001
  }
2111
- .mint-concentration-input__conversion::before {
2112
- content: '≈ ';
2002
+ .mint-datetime-picker__dropdown-enter-from,
2003
+ .mint-datetime-picker__dropdown-leave-to {
2004
+ opacity: 0;
2005
+ transform: scale(0.95);
2006
+ }
2007
+ .mint-datetime-picker__dropdown-enter-to,
2008
+ .mint-datetime-picker__dropdown-leave-from {
2009
+ opacity: 1;
2010
+ transform: scale(1);
2113
2011
  }
2114
2012
  /* FormulaInput Component Styles */
2115
2013
  .mint-formula-input {
@@ -2362,322 +2260,422 @@
2362
2260
  color: var(--text-primary);
2363
2261
  margin-left: 0.25rem;
2364
2262
  }
2365
- /* UnitInput Component Styles */
2366
- .mint-unit-input {
2263
+ /* MoleculeInput Component Styles */
2264
+ .mint-molecule-input {
2367
2265
  display: flex;
2368
2266
  flex-direction: column;
2369
- gap: 0.375rem;
2370
- }
2371
-
2372
- /* ---------- Controls row (value input + unit chip) ---------- */
2373
- .mint-unit-input__controls {
2374
- display: flex;
2375
- align-items: stretch;
2376
- background-color: var(--bg-secondary);
2267
+ border-radius: var(--radius-md);
2377
2268
  border: 1px solid var(--border-color);
2378
- border-radius: 0.5rem;
2379
- transition: border-color 0.15s ease, box-shadow 0.15s ease;
2269
+ background-color: var(--bg-secondary);
2380
2270
  overflow: hidden;
2271
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
2381
2272
  }
2382
- .mint-unit-input__controls--sm { min-height: var(--form-height-sm);
2383
- }
2384
- .mint-unit-input__controls--md { min-height: var(--form-height-md);
2385
- }
2386
- .mint-unit-input__controls--lg { min-height: var(--form-height-lg);
2273
+ .mint-molecule-input:focus-within {
2274
+ border-color: transparent;
2275
+ box-shadow: var(--focus-ring);
2387
2276
  }
2388
- .mint-unit-input__controls:hover:not(:has(:disabled)) {
2389
- border-color: var(--text-muted);
2277
+ .mint-molecule-input--disabled {
2278
+ opacity: var(--mint-disabled-opacity);
2279
+ pointer-events: none;
2390
2280
  }
2391
- .mint-unit-input__controls:focus-within {
2392
- border-color: var(--color-primary);
2393
- box-shadow: var(--focus-ring-soft);
2281
+ .mint-molecule-input--readonly {
2282
+ pointer-events: none;
2394
2283
  }
2395
- .mint-unit-input--error .mint-unit-input__controls {
2284
+ .mint-molecule-input--error {
2396
2285
  border-color: var(--mint-error);
2397
2286
  }
2398
- .mint-unit-input--error .mint-unit-input__controls:focus-within {
2399
- box-shadow: var(--focus-ring-soft-error);
2287
+ .mint-molecule-input--error:focus-within {
2288
+ box-shadow: var(--focus-ring-error);
2400
2289
  }
2401
- .mint-unit-input--disabled .mint-unit-input__controls {
2402
- opacity: var(--mint-disabled-opacity);
2290
+
2291
+ /* Editor container */
2292
+ .mint-molecule-input__editor {
2293
+ position: relative;
2294
+ width: 100%;
2295
+ min-height: 200px;
2403
2296
  background-color: var(--bg-secondary);
2404
2297
  }
2405
-
2406
- /* ---------- Value input — Fira Code, left-aligned ---------- */
2407
- .mint-unit-input__value {
2408
- flex: 1;
2409
- min-width: 0;
2410
- text-align: left;
2411
- background-color: transparent;
2412
- color: var(--text-primary);
2298
+ .mint-molecule-input__editor iframe {
2413
2299
  border: none;
2414
- outline: none;
2415
- font-family: var(--font-mono, 'Fira Code', monospace);
2416
- -webkit-appearance: textfield;
2417
- -moz-appearance: textfield;
2418
- appearance: textfield;
2300
+ display: block;
2419
2301
  }
2420
- .mint-unit-input__value::-webkit-outer-spin-button,
2421
- .mint-unit-input__value::-webkit-inner-spin-button {
2422
- -webkit-appearance: none;
2423
- margin: 0;
2302
+
2303
+ /* Skeleton loader */
2304
+ .mint-molecule-input__skeleton {
2305
+ display: flex;
2306
+ flex-direction: column;
2307
+ align-items: center;
2308
+ justify-content: center;
2309
+ gap: 1rem;
2310
+ height: 100%;
2311
+ min-height: 200px;
2312
+ background-color: var(--bg-tertiary);
2424
2313
  }
2425
- .mint-unit-input__value:disabled { cursor: not-allowed;
2314
+ .mint-molecule-input__skeleton-icon {
2315
+ width: 3rem;
2316
+ height: 3rem;
2317
+ color: var(--text-muted);
2318
+ animation: mint-molecule-pulse 1.5s ease-in-out infinite;
2426
2319
  }
2427
-
2428
- /* Horizontal padding matches BaseInput canonical scale (10/12/16) so FormField's
2429
- 12px label indent aligns with the value text across all input types. */
2430
- .mint-unit-input__value--sm { padding: 0.3125rem 0.625rem 0.4375rem; font-size: 0.875rem;
2320
+ .mint-molecule-input__skeleton-text {
2321
+ font-size: 0.875rem;
2322
+ color: var(--text-muted);
2323
+ }
2324
+ @keyframes mint-molecule-pulse {
2325
+ 0%, 100% {
2326
+ opacity: 0.4;
2431
2327
  }
2432
- .mint-unit-input__value--md { padding: 0.4375rem 0.75rem 0.5625rem; font-size: 0.875rem;
2328
+ 50% {
2329
+ opacity: 1;
2433
2330
  }
2434
- .mint-unit-input__value--lg { padding: 0.6875rem 1rem 0.8125rem; font-size: 1rem;
2435
2331
  }
2436
2332
 
2437
- /* ---------- Unit chip ---------- */
2438
- .mint-unit-input__unit {
2333
+ /* Readonly SVG display */
2334
+ .mint-molecule-input__readonly {
2439
2335
  display: flex;
2440
2336
  align-items: center;
2441
- padding: 0 0.25rem;
2442
- background-color: var(--color-primary-soft);
2443
- border-left: 1px solid var(--border-color);
2337
+ justify-content: center;
2338
+ min-height: 200px;
2339
+ padding: 1rem;
2340
+ background-color: var(--bg-tertiary);
2444
2341
  }
2445
- .mint-unit-input__unit-select {
2446
- background: transparent;
2447
- border: none;
2448
- color: var(--color-primary-hover);
2449
- font-size: 0.75rem;
2450
- font-weight: 500;
2451
- padding: 0 0.375rem;
2452
- cursor: pointer;
2453
- outline: none;
2454
- text-transform: none;
2455
- font-family: var(--font-mono, 'Fira Code', monospace);
2456
- line-height: 1;
2342
+ .mint-molecule-input__readonly svg {
2343
+ max-width: 100%;
2344
+ max-height: 100%;
2457
2345
  }
2458
- .mint-unit-input__unit-select--sm { font-size: 0.6875rem;
2346
+
2347
+ /* Empty state */
2348
+ .mint-molecule-input__empty {
2349
+ display: flex;
2350
+ flex-direction: column;
2351
+ align-items: center;
2352
+ justify-content: center;
2353
+ gap: 0.5rem;
2354
+ min-height: 200px;
2355
+ padding: 1rem;
2356
+ color: var(--text-muted);
2459
2357
  }
2460
- .mint-unit-input__unit-select--md { font-size: 0.75rem;
2358
+ .mint-molecule-input__empty-icon {
2359
+ width: 2.5rem;
2360
+ height: 2.5rem;
2461
2361
  }
2462
- .mint-unit-input__unit-select--lg { font-size: 0.8125rem;
2362
+ .mint-molecule-input__empty-text {
2363
+ font-size: 0.875rem;
2463
2364
  }
2464
- .mint-unit-input__unit-select:disabled {
2465
- cursor: not-allowed;
2365
+
2366
+ /* SMILES preview */
2367
+ .mint-molecule-input__smiles {
2368
+ padding: 0.5rem 0.75rem;
2369
+ font-family: 'Fira Code', monospace;
2370
+ font-size: 0.75rem;
2371
+ color: var(--text-secondary);
2372
+ background-color: var(--bg-tertiary);
2373
+ border-top: 1px solid var(--border-color);
2374
+ word-break: break-all;
2375
+ user-select: all;
2376
+ }
2377
+ .mint-molecule-input__smiles-label {
2378
+ font-weight: 500;
2466
2379
  color: var(--text-muted);
2380
+ margin-right: 0.5rem;
2467
2381
  }
2468
2382
 
2469
- /* ---------- Conversion hint ---------- */
2470
- .mint-unit-input__conversion-hint {
2471
- font-size: 0.75rem;
2383
+ /* Error state */
2384
+ .mint-molecule-input__error {
2385
+ padding: 0.75rem;
2386
+ font-size: 0.875rem;
2387
+ color: var(--mint-error);
2388
+ background-color: var(--mint-error-bg);
2389
+ border-top: 1px solid var(--mint-error);
2390
+ }
2391
+ .mint-molecule-input__error-icon {
2392
+ width: 1rem;
2393
+ height: 1rem;
2394
+ margin-right: 0.5rem;
2395
+ vertical-align: middle;
2396
+ }
2397
+
2398
+ /* Actions toolbar */
2399
+ .mint-molecule-input__actions {
2400
+ display: flex;
2401
+ gap: 0.25rem;
2402
+ padding: 0.5rem;
2403
+ background-color: var(--bg-tertiary);
2404
+ border-top: 1px solid var(--border-color);
2405
+ }
2406
+ .mint-molecule-input__action-btn {
2407
+ display: flex;
2408
+ align-items: center;
2409
+ justify-content: center;
2410
+ padding: 0.375rem;
2411
+ background: transparent;
2412
+ border: none;
2413
+ border-radius: var(--radius-sm);
2472
2414
  color: var(--text-muted);
2473
- font-style: italic;
2474
- padding: 0 0.75rem;
2415
+ cursor: pointer;
2416
+ transition: color 0.15s ease, background-color 0.15s ease;
2475
2417
  }
2476
- .mint-unit-input__unit-group {
2477
- /* optgroup styling — browsers vary here; minimal override */
2478
- font-weight: 600;
2479
- font-style: normal;
2418
+ .mint-molecule-input__action-btn:hover:not(:disabled) {
2419
+ color: var(--text-primary);
2420
+ background-color: var(--bg-hover);
2480
2421
  }
2481
- /* DateTimePicker Component Styles */
2482
- .mint-datetime-picker {
2483
- position: relative;
2422
+ .mint-molecule-input__action-btn:disabled {
2423
+ opacity: var(--mint-disabled-opacity);
2424
+ cursor: not-allowed;
2484
2425
  }
2485
- .mint-datetime-picker__input-wrapper {
2486
- position: relative;
2426
+ .mint-molecule-input__action-btn svg {
2427
+ width: 1rem;
2428
+ height: 1rem;
2487
2429
  }
2488
- .mint-datetime-picker__input {
2489
- width: 100%;
2430
+ /* ConcentrationInput Component Styles */
2431
+ .mint-concentration-input {
2432
+ display: flex;
2433
+ flex-direction: column;
2434
+ gap: 0.25rem;
2435
+ }
2436
+ .mint-concentration-input__controls {
2437
+ display: flex;
2490
2438
  border-radius: var(--radius-md);
2491
2439
  border: 1px solid var(--border-color);
2492
- background-color: var(--bg-secondary);
2493
- color: var(--text-primary);
2440
+ overflow: hidden;
2441
+ box-sizing: border-box;
2494
2442
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
2495
- cursor: pointer;
2496
- padding-left: 2.5rem;
2497
- padding-right: 2.5rem;
2498
2443
  }
2499
- .mint-datetime-picker__input:focus-visible {
2500
- outline: none;
2501
- border-color: transparent;
2502
- box-shadow: var(--focus-ring);
2444
+ .mint-concentration-input__controls--sm {
2445
+ min-height: var(--form-height-sm);
2503
2446
  }
2504
- .mint-datetime-picker__input--sm {
2505
- padding-top: 0.375rem;
2506
- padding-bottom: 0.375rem;
2507
- font-size: 0.875rem;
2447
+ .mint-concentration-input__controls--md {
2448
+ min-height: var(--form-height-md);
2508
2449
  }
2509
- .mint-datetime-picker__input--md {
2510
- padding-top: 0.5rem;
2511
- padding-bottom: 0.5rem;
2512
- font-size: 0.875rem;
2450
+ .mint-concentration-input__controls--lg {
2451
+ min-height: var(--form-height-lg);
2513
2452
  }
2514
- .mint-datetime-picker__input--lg {
2515
- padding-top: 0.75rem;
2516
- padding-bottom: 0.75rem;
2517
- font-size: 1rem;
2453
+ .mint-concentration-input__controls:focus-within {
2454
+ border-color: transparent;
2455
+ box-shadow: var(--focus-ring);
2518
2456
  }
2519
- .mint-datetime-picker__input--error {
2457
+ .mint-concentration-input--error .mint-concentration-input__controls {
2520
2458
  border-color: var(--mint-error);
2521
2459
  }
2522
- .mint-datetime-picker__input--error:focus-visible {
2460
+ .mint-concentration-input--error .mint-concentration-input__controls:focus-within {
2523
2461
  box-shadow: var(--focus-ring-error);
2524
2462
  }
2525
- .mint-datetime-picker__input--disabled {
2463
+ .mint-concentration-input--disabled .mint-concentration-input__controls {
2526
2464
  opacity: var(--mint-disabled-opacity);
2527
- cursor: not-allowed;
2528
- background-color: var(--bg-tertiary);
2529
2465
  }
2530
- .mint-datetime-picker__icon-calendar {
2531
- position: absolute;
2532
- top: 0;
2533
- bottom: 0;
2534
- left: 0;
2535
- display: flex;
2536
- align-items: center;
2537
- padding-left: 0.75rem;
2538
- pointer-events: none;
2466
+
2467
+ /* Value input */
2468
+ .mint-concentration-input__value {
2469
+ flex: 1;
2470
+ min-width: 0;
2471
+ background-color: var(--bg-secondary);
2472
+ color: var(--text-primary);
2473
+ border: none;
2474
+ outline: none;
2475
+ line-height: 1.25;
2476
+ -webkit-appearance: textfield;
2477
+ -moz-appearance: textfield;
2478
+ appearance: textfield;
2539
2479
  }
2540
- .mint-datetime-picker__icon-calendar svg {
2541
- width: 1rem;
2542
- height: 1rem;
2480
+ .mint-concentration-input__value::-webkit-outer-spin-button,
2481
+ .mint-concentration-input__value::-webkit-inner-spin-button {
2482
+ -webkit-appearance: none;
2483
+ margin: 0;
2484
+ }
2485
+ .mint-concentration-input__value::placeholder {
2543
2486
  color: var(--text-muted);
2544
2487
  }
2545
- .mint-datetime-picker__icon-clock {
2546
- position: absolute;
2547
- top: 0;
2548
- bottom: 0;
2549
- right: 0;
2550
- display: flex;
2551
- align-items: center;
2552
- padding-right: 0.75rem;
2553
- pointer-events: none;
2488
+ .mint-concentration-input__value--sm {
2489
+ padding: 0.375rem 0.625rem;
2490
+ font-size: 0.875rem;
2554
2491
  }
2555
- .mint-datetime-picker__icon-clock svg {
2556
- width: 1rem;
2557
- height: 1rem;
2558
- color: var(--text-muted);
2492
+ .mint-concentration-input__value--md {
2493
+ padding: 0.5rem 0.75rem;
2494
+ font-size: 0.875rem;
2559
2495
  }
2560
-
2561
- /* Dropdown */
2562
- .mint-datetime-picker__dropdown {
2563
- position: absolute;
2564
- z-index: 50;
2565
- margin-top: 0.25rem;
2566
- width: 20rem;
2567
- padding: 0.75rem;
2568
- border-radius: var(--radius-md);
2569
- border: 1px solid var(--border-color);
2570
- background-color: var(--bg-primary);
2571
- box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
2496
+ .mint-concentration-input__value--lg {
2497
+ padding: 0.75rem 1rem;
2498
+ font-size: 1rem;
2572
2499
  }
2573
-
2574
- /* Calendar section */
2575
- .mint-datetime-picker__calendar-section {
2576
- margin-bottom: 0;
2500
+ .mint-concentration-input__value--disabled {
2501
+ cursor: not-allowed;
2502
+ background-color: var(--bg-tertiary);
2577
2503
  }
2578
2504
 
2579
- /* Divider */
2580
- .mint-datetime-picker__divider {
2581
- height: 1px;
2582
- background-color: var(--border-color);
2583
- margin: 0.5rem 0;
2505
+ /* Unit select */
2506
+ .mint-concentration-input__unit {
2507
+ position: relative;
2508
+ flex-shrink: 0;
2509
+ border-left: 1px solid var(--border-color);
2510
+ }
2511
+ .mint-concentration-input__unit-select {
2512
+ height: 100%;
2513
+ background-color: var(--bg-tertiary);
2514
+ color: var(--text-primary);
2515
+ border: none;
2516
+ outline: none;
2517
+ cursor: pointer;
2518
+ font-weight: 500;
2519
+ padding-right: 1.5rem;
2520
+ appearance: none;
2521
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");
2522
+ background-position: right 0.375rem center;
2523
+ background-repeat: no-repeat;
2524
+ background-size: 1rem 1rem;
2525
+ }
2526
+ .mint-concentration-input__unit-select--sm {
2527
+ padding: 0.375rem 1.5rem 0.375rem 0.5rem;
2528
+ font-size: 0.75rem;
2529
+ min-width: 4rem;
2530
+ }
2531
+ .mint-concentration-input__unit-select--md {
2532
+ padding: 0.5rem 1.75rem 0.5rem 0.625rem;
2533
+ font-size: 0.875rem;
2534
+ min-width: 4.5rem;
2535
+ }
2536
+ .mint-concentration-input__unit-select--lg {
2537
+ padding: 0.75rem 2rem 0.75rem 0.75rem;
2538
+ font-size: 0.875rem;
2539
+ min-width: 5rem;
2540
+ }
2541
+ .mint-concentration-input__unit-select:disabled {
2542
+ cursor: not-allowed;
2543
+ opacity: 0.7;
2544
+ }
2545
+ .mint-concentration-input__unit-select:hover:not(:disabled) {
2546
+ background-color: var(--bg-hover);
2584
2547
  }
2585
2548
 
2586
- /* Time section */
2587
- .mint-datetime-picker__time-section {
2588
- padding: 0;
2549
+ /* Unit option group */
2550
+ .mint-concentration-input__unit-group {
2551
+ font-weight: 600;
2552
+ color: var(--text-secondary);
2589
2553
  }
2590
- .mint-datetime-picker__time-label {
2591
- font-size: 0.6875rem;
2592
- font-weight: 500;
2554
+
2555
+ /* Conversion hint */
2556
+ .mint-concentration-input__conversion {
2557
+ font-size: 0.75rem;
2593
2558
  color: var(--text-muted);
2594
- text-transform: uppercase;
2595
- letter-spacing: 0.05em;
2596
- margin-bottom: 0.375rem;
2559
+ padding-left: 0.125rem;
2597
2560
  }
2598
- .mint-datetime-picker__time-grid {
2599
- display: grid;
2600
- grid-template-columns: repeat(4, 1fr);
2601
- gap: 0.25rem;
2602
- max-height: 10rem;
2603
- overflow-y: auto;
2561
+ .mint-concentration-input__conversion::before {
2562
+ content: '≈ ';
2563
+ }
2564
+ /* UnitInput Component Styles */
2565
+ .mint-unit-input {
2566
+ display: flex;
2567
+ flex-direction: column;
2568
+ gap: 0.375rem;
2604
2569
  }
2605
2570
 
2606
- /* Time chips */
2607
- .mint-datetime-picker__time-chip {
2608
- padding: 0.25rem 0.5rem;
2609
- font-size: 0.75rem;
2610
- border-radius: var(--radius, 0.375rem);
2571
+ /* ---------- Controls row (value input + unit chip) ---------- */
2572
+ .mint-unit-input__controls {
2573
+ display: flex;
2574
+ align-items: stretch;
2575
+ background-color: var(--bg-secondary);
2611
2576
  border: 1px solid var(--border-color);
2577
+ border-radius: 0.5rem;
2578
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
2579
+ overflow: hidden;
2580
+ }
2581
+ .mint-unit-input__controls--sm { min-height: var(--form-height-sm);
2582
+ }
2583
+ .mint-unit-input__controls--md { min-height: var(--form-height-md);
2584
+ }
2585
+ .mint-unit-input__controls--lg { min-height: var(--form-height-lg);
2586
+ }
2587
+ .mint-unit-input__controls:hover:not(:has(:disabled)) {
2588
+ border-color: var(--text-muted);
2589
+ }
2590
+ .mint-unit-input__controls:focus-within {
2591
+ border-color: var(--color-primary);
2592
+ box-shadow: var(--focus-ring-soft);
2593
+ }
2594
+ .mint-unit-input--error .mint-unit-input__controls {
2595
+ border-color: var(--mint-error);
2596
+ }
2597
+ .mint-unit-input--error .mint-unit-input__controls:focus-within {
2598
+ box-shadow: var(--focus-ring-soft-error);
2599
+ }
2600
+ .mint-unit-input--disabled .mint-unit-input__controls {
2601
+ opacity: var(--mint-disabled-opacity);
2612
2602
  background-color: var(--bg-secondary);
2603
+ }
2604
+
2605
+ /* ---------- Value input — Fira Code, left-aligned ---------- */
2606
+ .mint-unit-input__value {
2607
+ flex: 1;
2608
+ min-width: 0;
2609
+ text-align: left;
2610
+ background-color: transparent;
2613
2611
  color: var(--text-primary);
2614
- cursor: pointer;
2615
- text-align: center;
2616
- transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
2612
+ border: none;
2613
+ outline: none;
2614
+ font-family: var(--font-mono, 'Fira Code', monospace);
2615
+ -webkit-appearance: textfield;
2616
+ -moz-appearance: textfield;
2617
+ appearance: textfield;
2617
2618
  }
2618
- .mint-datetime-picker__time-chip:hover {
2619
- background-color: var(--bg-hover);
2620
- border-color: var(--color-primary);
2619
+ .mint-unit-input__value::-webkit-outer-spin-button,
2620
+ .mint-unit-input__value::-webkit-inner-spin-button {
2621
+ -webkit-appearance: none;
2622
+ margin: 0;
2621
2623
  }
2622
- .mint-datetime-picker__time-chip--active {
2623
- background-color: var(--color-primary);
2624
- border-color: var(--color-primary);
2625
- color: white;
2624
+ .mint-unit-input__value:disabled { cursor: not-allowed;
2626
2625
  }
2627
- .mint-datetime-picker__time-chip--active:hover {
2628
- background-color: var(--color-primary);
2626
+
2627
+ /* Horizontal padding matches BaseInput canonical scale (10/12/16) so FormField's
2628
+ 12px label indent aligns with the value text across all input types. */
2629
+ .mint-unit-input__value--sm { padding: 0.375rem 0.625rem; font-size: 0.875rem;
2629
2630
  }
2630
- .mint-datetime-picker__time-chip--disabled {
2631
- opacity: 0.3;
2632
- cursor: not-allowed;
2631
+ .mint-unit-input__value--md { padding: 0.5rem 0.75rem; font-size: 0.875rem;
2632
+ }
2633
+ .mint-unit-input__value--lg { padding: 0.75rem 1rem; font-size: 1rem;
2633
2634
  }
2634
2635
 
2635
- /* Footer */
2636
- .mint-datetime-picker__footer {
2636
+ /* ---------- Unit chip ---------- */
2637
+ .mint-unit-input__unit {
2637
2638
  display: flex;
2638
2639
  align-items: center;
2639
- justify-content: space-between;
2640
- margin-top: 0.75rem;
2641
- padding-top: 0.75rem;
2642
- border-top: 1px solid var(--border-color);
2640
+ padding: 0 0.25rem;
2641
+ background-color: var(--color-primary-soft);
2642
+ border-left: 1px solid var(--border-color);
2643
2643
  }
2644
- .mint-datetime-picker__footer-btn {
2645
- font-size: 0.75rem;
2644
+ .mint-unit-input__unit-select {
2646
2645
  background: transparent;
2647
2646
  border: none;
2647
+ color: var(--color-primary-hover);
2648
+ font-size: 0.75rem;
2649
+ font-weight: 500;
2650
+ padding: 0 0.375rem;
2648
2651
  cursor: pointer;
2649
- transition: color 0.15s ease;
2650
- color: var(--color-primary);
2652
+ outline: none;
2653
+ text-transform: none;
2654
+ font-family: var(--font-mono, 'Fira Code', monospace);
2655
+ line-height: 1;
2651
2656
  }
2652
- .mint-datetime-picker__footer-btn:hover {
2653
- opacity: 0.8;
2657
+ .mint-unit-input__unit-select--sm { font-size: 0.6875rem;
2654
2658
  }
2655
- .mint-datetime-picker__footer-btn + .mint-datetime-picker__footer-btn {
2656
- margin-left: 0.75rem;
2659
+ .mint-unit-input__unit-select--md { font-size: 0.75rem;
2657
2660
  }
2658
- .mint-datetime-picker__footer-btn--muted {
2659
- color: var(--text-muted);
2661
+ .mint-unit-input__unit-select--lg { font-size: 0.8125rem;
2660
2662
  }
2661
- .mint-datetime-picker__footer-btn--muted:hover {
2662
- color: var(--text-primary);
2663
+ .mint-unit-input__unit-select:disabled {
2664
+ cursor: not-allowed;
2665
+ color: var(--text-muted);
2663
2666
  }
2664
2667
 
2665
- /* Transition classes */
2666
- .mint-datetime-picker__dropdown-enter-active {
2667
- transition: opacity 0.1s ease-out, transform 0.1s ease-out;
2668
- }
2669
- .mint-datetime-picker__dropdown-leave-active {
2670
- transition: opacity 0.075s ease-in, transform 0.075s ease-in;
2671
- }
2672
- .mint-datetime-picker__dropdown-enter-from,
2673
- .mint-datetime-picker__dropdown-leave-to {
2674
- opacity: 0;
2675
- transform: scale(0.95);
2668
+ /* ---------- Conversion hint ---------- */
2669
+ .mint-unit-input__conversion-hint {
2670
+ font-size: 0.75rem;
2671
+ color: var(--text-muted);
2672
+ font-style: italic;
2673
+ padding: 0 0.75rem;
2676
2674
  }
2677
- .mint-datetime-picker__dropdown-enter-to,
2678
- .mint-datetime-picker__dropdown-leave-from {
2679
- opacity: 1;
2680
- transform: scale(1);
2675
+ .mint-unit-input__unit-group {
2676
+ /* optgroup styling — browsers vary here; minimal override */
2677
+ font-weight: 600;
2678
+ font-style: normal;
2681
2679
  }
2682
2680
  /* BaseButton Component Styles */
2683
2681
  .mint-button {
@@ -2799,23 +2797,18 @@
2799
2797
  }
2800
2798
 
2801
2799
  /* Sizes */
2802
-
2803
- /* Optical centering: Fira Sans' cap-letter midpoint sits above the em-box center.
2804
- Old rule (pre-0.16) compensated with a 2px upward shift; user testing showed
2805
- that read as "too high" across sizes. New rule: 1px upward shift universally.
2806
- See CLAUDE.md § Optical Centering. */
2807
2800
  .mint-button--sm {
2808
- padding: 0.3125rem 0.75rem 0.4375rem;
2801
+ padding: 0.375rem 0.75rem;
2809
2802
  font-size: 0.875rem;
2810
2803
  min-height: var(--form-height-sm);
2811
2804
  }
2812
2805
  .mint-button--md {
2813
- padding: 0.4375rem 1rem 0.5625rem;
2806
+ padding: 0.5rem 1rem;
2814
2807
  font-size: 0.875rem;
2815
2808
  min-height: var(--form-height-md);
2816
2809
  }
2817
2810
  .mint-button--lg {
2818
- padding: 0.6875rem 1.5rem 0.8125rem;
2811
+ padding: 0.75rem 1.5rem;
2819
2812
  font-size: 1rem;
2820
2813
  min-height: var(--form-height-lg);
2821
2814
  }
@@ -2955,10 +2948,8 @@ to {
2955
2948
  background-color: var(--bg-tertiary);
2956
2949
  border-radius: var(--radius-md);
2957
2950
  }
2958
-
2959
- /* 1px optical padding shift (0.16+). See CLAUDE.md § Optical Centering. */
2960
2951
  .mint-tab {
2961
- padding: 0.4375rem 1rem 0.5625rem;
2952
+ padding: 0.5rem 1rem;
2962
2953
  font-size: 0.875rem;
2963
2954
  font-weight: 500;
2964
2955
  transition: color 0.15s ease, background-color 0.15s ease, border-color 0.15s ease;
@@ -3471,22 +3462,19 @@ to {
3471
3462
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
3472
3463
  }
3473
3464
 
3474
- /* Size variants - simple — 1px optical padding shift universally (0.16+).
3475
- See CLAUDE.md § Optical Centering. */
3465
+ /* Size variants - simple */
3476
3466
  .mint-segmented-control__option--simple.mint-segmented-control__option--sm {
3477
- padding: 0.3125rem 0.75rem 0.4375rem;
3467
+ padding: 0.375rem 0.75rem;
3478
3468
  font-size: 0.75rem;
3479
3469
  min-height: var(--form-height-sm);
3480
3470
  }
3481
3471
  .mint-segmented-control__option--simple.mint-segmented-control__option--md {
3482
- padding: 0.4375rem 1rem 0.5625rem;
3472
+ padding: 0.5rem 1rem;
3483
3473
  font-size: 0.875rem;
3484
3474
  min-height: var(--form-height-md);
3485
3475
  }
3486
3476
  .mint-segmented-control__option--simple.mint-segmented-control__option--lg {
3487
- /* 9/11 (not 11/13 like BaseButton lg) — SegmentedControl uses a smaller
3488
- em-box at 1rem font + 1.25 line-height, so the 1px shift lands here. */
3489
- padding: 0.5625rem 1.25rem 0.6875rem;
3477
+ padding: 0.625rem 1.25rem;
3490
3478
  font-size: 1rem;
3491
3479
  min-height: var(--form-height-lg);
3492
3480
  }
@@ -3822,19 +3810,19 @@ html.dark .mint-pill__remove:hover {
3822
3810
  background-color: var(--bg-tertiary);
3823
3811
  }
3824
3812
 
3825
- /* Trigger sizes — 1px optical padding shift (0.16+). See CLAUDE.md § Optical Centering. */
3813
+ /* Trigger sizes */
3826
3814
  .mint-dropdown-button__trigger--sm {
3827
- padding: 0.3125rem 0.75rem 0.4375rem;
3815
+ padding: 0.375rem 0.75rem;
3828
3816
  font-size: 0.875rem;
3829
3817
  min-height: var(--form-height-sm);
3830
3818
  }
3831
3819
  .mint-dropdown-button__trigger--md {
3832
- padding: 0.4375rem 1rem 0.5625rem;
3820
+ padding: 0.5rem 1rem;
3833
3821
  font-size: 0.875rem;
3834
3822
  min-height: var(--form-height-md);
3835
3823
  }
3836
3824
  .mint-dropdown-button__trigger--lg {
3837
- padding: 0.6875rem 1.5rem 0.8125rem;
3825
+ padding: 0.75rem 1.5rem;
3838
3826
  font-size: 1rem;
3839
3827
  min-height: var(--form-height-lg);
3840
3828
  }
@@ -5349,6 +5337,170 @@ html.dark .mint-settings-modal__option-btn--active {
5349
5337
  margin-bottom: 0 !important;
5350
5338
  padding: 0 !important;
5351
5339
  }
5340
+
5341
+ /* ─────────────────────────────────────────────────────────────────────
5342
+ * Schema-driven content grid (used by both layouts)
5343
+ * Cols come from `--mint-settings-cols` set inline by the component;
5344
+ * keeps the data binding minimal and the styling in one place.
5345
+ * ───────────────────────────────────────────────────────────────────── */
5346
+ .mint-settings-modal__group-grid {
5347
+ display: grid;
5348
+ gap: 1rem;
5349
+ grid-template-columns: repeat(var(--mint-settings-cols, 1), minmax(0, 1fr));
5350
+ }
5351
+
5352
+ /* ─────────────────────────────────────────────────────────────────────
5353
+ * Vertical layout — sidebar rail + content pane (opt-in via layout="vertical")
5354
+ * Designed for complex plugins with 5+ setting groups. Existing horizontal
5355
+ * classes above are deliberately untouched.
5356
+ * ───────────────────────────────────────────────────────────────────── */
5357
+ .mint-settings-modal--vertical {
5358
+ flex-direction: row;
5359
+ gap: 1.25rem;
5360
+ align-items: stretch;
5361
+ min-height: 22rem;
5362
+ }
5363
+ .mint-settings-modal__rail {
5364
+ flex-shrink: 0;
5365
+ width: 12.5rem;
5366
+ display: flex;
5367
+ flex-direction: column;
5368
+ gap: 0.125rem;
5369
+ padding-right: 0.75rem;
5370
+ border-right: 1px solid var(--border-light);
5371
+ }
5372
+ .mint-settings-modal__rail-item {
5373
+ display: flex;
5374
+ align-items: flex-start;
5375
+ gap: 0.625rem;
5376
+ width: 100%;
5377
+ padding: 0.5rem 0.75rem;
5378
+ font-size: 0.8125rem;
5379
+ font-weight: 500;
5380
+ color: var(--text-secondary);
5381
+ background: none;
5382
+ border: none;
5383
+ border-radius: var(--radius-md);
5384
+ cursor: pointer;
5385
+ text-align: left;
5386
+ transition:
5387
+ color var(--mint-transition),
5388
+ background-color var(--mint-transition);
5389
+ }
5390
+ .mint-settings-modal__rail-item:hover {
5391
+ background-color: var(--bg-hover);
5392
+ color: var(--text-primary);
5393
+ }
5394
+ .mint-settings-modal__rail-item:focus-visible {
5395
+ outline: none;
5396
+ box-shadow: var(--focus-ring);
5397
+ }
5398
+ .mint-settings-modal__rail-item--active {
5399
+ color: var(--color-primary);
5400
+ background-color: color-mix(in srgb, var(--color-primary) 10%, transparent);
5401
+ }
5402
+ html.dark .mint-settings-modal__rail-item--active {
5403
+ background-color: color-mix(in srgb, var(--color-primary) 18%, transparent);
5404
+ }
5405
+
5406
+ /* Reserved icon column keeps labels aligned whether or not icons are present */
5407
+ .mint-settings-modal__rail-item-icon {
5408
+ flex-shrink: 0;
5409
+ width: 1rem;
5410
+ height: 1rem;
5411
+ display: inline-flex;
5412
+ align-items: center;
5413
+ justify-content: center;
5414
+ margin-top: 0.0625rem;
5415
+ color: currentColor;
5416
+ }
5417
+ .mint-settings-modal__rail-item-icon svg {
5418
+ width: 100%;
5419
+ height: 100%;
5420
+ display: block;
5421
+ }
5422
+ .mint-settings-modal__rail-item-text {
5423
+ display: flex;
5424
+ flex-direction: column;
5425
+ gap: 0.125rem;
5426
+ min-width: 0;
5427
+ flex: 1;
5428
+ }
5429
+ .mint-settings-modal__rail-item-label {
5430
+ line-height: 1.3;
5431
+ }
5432
+ .mint-settings-modal__rail-item-description {
5433
+ font-size: 0.6875rem;
5434
+ font-weight: 400;
5435
+ color: var(--text-muted);
5436
+ line-height: 1.35;
5437
+ }
5438
+ .mint-settings-modal__rail-item--active .mint-settings-modal__rail-item-description {
5439
+ color: color-mix(in srgb, var(--color-primary) 65%, var(--text-secondary));
5440
+ }
5441
+ .mint-settings-modal__pane {
5442
+ flex: 1;
5443
+ min-width: 0;
5444
+ display: flex;
5445
+ flex-direction: column;
5446
+ }
5447
+ .mint-settings-modal__pane-header {
5448
+ margin-bottom: 1rem;
5449
+ padding-bottom: 0.75rem;
5450
+ border-bottom: 1px solid var(--border-light);
5451
+ }
5452
+ .mint-settings-modal__pane-title {
5453
+ font-size: 0.875rem;
5454
+ font-weight: 600;
5455
+ color: var(--text-primary);
5456
+ letter-spacing: -0.005em;
5457
+ margin: 0 !important;
5458
+ padding: 0 !important;
5459
+ line-height: 1.3;
5460
+ }
5461
+ .mint-settings-modal__pane-subtitle {
5462
+ font-size: 0.75rem;
5463
+ color: var(--text-secondary);
5464
+ line-height: 1.45;
5465
+ margin: 0.25rem 0 0 !important;
5466
+ padding: 0 !important;
5467
+ }
5468
+ .mint-settings-modal__pane-body {
5469
+ flex: 1;
5470
+ min-height: 0;
5471
+ /* Trailing breathing room so the last field doesn't hug the modal border */
5472
+ padding-bottom: 0.25rem;
5473
+ }
5474
+
5475
+ /* Mobile — collapse the rail into a horizontal scroll-strip so the modal stays usable.
5476
+ * Touch targets stay ≥40px tall via 0.5rem vertical padding + 1rem text line-height. */
5477
+ @media (max-width: 640px) {
5478
+ .mint-settings-modal--vertical {
5479
+ flex-direction: column;
5480
+ gap: 0.875rem;
5481
+ min-height: 0;
5482
+ }
5483
+ .mint-settings-modal__rail {
5484
+ width: 100%;
5485
+ flex-direction: row;
5486
+ overflow-x: auto;
5487
+ padding: 0 0 0.625rem;
5488
+ border-right: none;
5489
+ border-bottom: 1px solid var(--border-light);
5490
+ gap: 0.25rem;
5491
+ scrollbar-width: thin;
5492
+ }
5493
+ .mint-settings-modal__rail-item {
5494
+ flex-shrink: 0;
5495
+ width: auto;
5496
+ padding: 0.5rem 0.75rem;
5497
+ }
5498
+
5499
+ /* Two-line description hides on mobile so the rail strip stays compact */
5500
+ .mint-settings-modal__rail-item-description {
5501
+ display: none;
5502
+ }
5503
+ }
5352
5504
  /* ConfirmDialog — aligned with refresh design.
5353
5505
  - Title + optional subtitle live in BaseModal's header (top of modal)
5354
5506
  - Body is focused on the message (no forced icon/flex-row layout)
@@ -6729,8 +6881,7 @@ to { transform: rotate(360deg);
6729
6881
  display: inline-flex;
6730
6882
  align-items: center;
6731
6883
  border: 0;
6732
- /* 1px optical centering offset for 13px text. See CLAUDE.md § Optical Centering. */
6733
- padding: 0.3125rem 0.875rem 0.4375rem;
6884
+ padding: 0.375rem 0.875rem;
6734
6885
  border-radius: 9999px;
6735
6886
  font-size: 0.8125rem;
6736
6887
  font-weight: 500;
@@ -7087,6 +7238,48 @@ to { transform: rotate(360deg);
7087
7238
  width: 0.8125rem;
7088
7239
  height: 0.8125rem;
7089
7240
  }
7241
+ /* PluginIcon — BEM. Renders a plugin's icon inside a sized chip with two
7242
+ visual variants. Tintable via `--mint-plugin-icon-tone` custom property. */
7243
+ .mint-plugin-icon {
7244
+ display: inline-flex;
7245
+ align-items: center;
7246
+ justify-content: center;
7247
+ flex-shrink: 0;
7248
+ border-radius: var(--radius-md, 0.5rem);
7249
+ overflow: hidden;
7250
+ }
7251
+
7252
+ /* Sizes */
7253
+ .mint-plugin-icon--sm { width: 1.5rem; height: 1.5rem;
7254
+ }
7255
+ .mint-plugin-icon--md { width: 2rem; height: 2rem;
7256
+ }
7257
+ .mint-plugin-icon--lg { width: 3rem; height: 3rem; border-radius: 0.75rem;
7258
+ }
7259
+
7260
+ /* Variants — `--mint-plugin-icon-tone` falls back to --color-primary */
7261
+ .mint-plugin-icon--solid {
7262
+ background-color: var(--mint-plugin-icon-tone, var(--color-primary));
7263
+ color: white;
7264
+ }
7265
+ .mint-plugin-icon--tinted {
7266
+ background-color: color-mix(in srgb, var(--mint-plugin-icon-tone, var(--color-primary)) 12%, transparent);
7267
+ color: var(--mint-plugin-icon-tone, var(--color-primary));
7268
+ }
7269
+
7270
+ /* Inner svg/img — sized to ~62% of chip */
7271
+ .mint-plugin-icon--sm .mint-plugin-icon__svg,
7272
+ .mint-plugin-icon--sm .mint-plugin-icon__img { width: 0.9375rem; height: 0.9375rem;
7273
+ }
7274
+ .mint-plugin-icon--md .mint-plugin-icon__svg,
7275
+ .mint-plugin-icon--md .mint-plugin-icon__img { width: 1.125rem; height: 1.125rem;
7276
+ }
7277
+ .mint-plugin-icon--lg .mint-plugin-icon__svg,
7278
+ .mint-plugin-icon--lg .mint-plugin-icon__img { width: 1.5rem; height: 1.5rem;
7279
+ }
7280
+ .mint-plugin-icon__img {
7281
+ object-fit: contain;
7282
+ }
7090
7283
  /* AppTopBar - BEM-style naming for external package consumers */
7091
7284
 
7092
7285
  /* Motion tokens — shared across AppTopBar subcomponents */
@@ -7338,8 +7531,7 @@ to { transform: rotate(360deg);
7338
7531
  display: inline-flex;
7339
7532
  align-items: center;
7340
7533
  gap: 0.25rem;
7341
- /* Asymmetric top/bottom padding Fira Sans optical centering. */
7342
- padding: 0.3125rem 0.875rem 0.4375rem;
7534
+ padding: 0.375rem 0.875rem;
7343
7535
  border: 0;
7344
7536
  background: transparent;
7345
7537
  border-radius: 9999px;
@@ -16802,8 +16994,7 @@ code, pre {
16802
16994
  display: inline-flex;
16803
16995
  align-items: center;
16804
16996
  gap: 0.25rem;
16805
- /* Asymmetric top/bottom padding Fira Sans optical centering. */
16806
- padding: 0.3125rem 0.875rem 0.4375rem;
16997
+ padding: 0.375rem 0.875rem;
16807
16998
  border: 0;
16808
16999
  background: transparent;
16809
17000
  border-radius: 9999px;
@@ -17105,22 +17296,18 @@ code, pre {
17105
17296
  background-color: var(--bg-tertiary);
17106
17297
  }
17107
17298
  /* Sizes */
17108
- /* Optical centering: Fira Sans' cap-letter midpoint sits above the em-box center.
17109
- Old rule (pre-0.16) compensated with a 2px upward shift; user testing showed
17110
- that read as "too high" across sizes. New rule: 1px upward shift universally.
17111
- See CLAUDE.md § Optical Centering. */
17112
17299
  .mint-button--sm {
17113
- padding: 0.3125rem 0.75rem 0.4375rem;
17300
+ padding: 0.375rem 0.75rem;
17114
17301
  font-size: 0.875rem;
17115
17302
  min-height: var(--form-height-sm);
17116
17303
  }
17117
17304
  .mint-button--md {
17118
- padding: 0.4375rem 1rem 0.5625rem;
17305
+ padding: 0.5rem 1rem;
17119
17306
  font-size: 0.875rem;
17120
17307
  min-height: var(--form-height-md);
17121
17308
  }
17122
17309
  .mint-button--lg {
17123
- padding: 0.6875rem 1.5rem 0.8125rem;
17310
+ padding: 0.75rem 1.5rem;
17124
17311
  font-size: 1rem;
17125
17312
  min-height: var(--form-height-lg);
17126
17313
  }
@@ -18704,20 +18891,19 @@ code, pre {
18704
18891
  color: var(--text-muted);
18705
18892
  cursor: not-allowed;
18706
18893
  }
18707
- /* Size variants — 1px optical padding shift (0.16+).
18708
- See CLAUDE.md § Optical Centering. */
18894
+ /* Size variants */
18709
18895
  .mint-input--sm {
18710
- padding: 0.3125rem 0.625rem 0.4375rem;
18896
+ padding: 0.375rem 0.625rem;
18711
18897
  font-size: 0.8125rem;
18712
18898
  min-height: var(--form-height-sm);
18713
18899
  }
18714
18900
  .mint-input--md {
18715
- padding: 0.4375rem 0.75rem 0.5625rem;
18901
+ padding: 0.5rem 0.75rem;
18716
18902
  font-size: 0.875rem;
18717
18903
  min-height: var(--form-height-md);
18718
18904
  }
18719
18905
  .mint-input--lg {
18720
- padding: 0.6875rem 1rem 0.8125rem;
18906
+ padding: 0.75rem 1rem;
18721
18907
  font-size: 1rem;
18722
18908
  min-height: var(--form-height-lg);
18723
18909
  }
@@ -19093,9 +19279,9 @@ code, pre {
19093
19279
  .mint-number-input__input:disabled { cursor: not-allowed; }
19094
19280
  /* Horizontal padding matches BaseInput canonical scale (10/12/16) so FormField's
19095
19281
  12px label indent aligns with the numeric text across all input types. */
19096
- .mint-number-input__input--sm { padding: 0.3125rem 0.625rem 0.4375rem; font-size: 0.875rem; }
19097
- .mint-number-input__input--md { padding: 0.4375rem 0.75rem 0.5625rem; font-size: 0.875rem; }
19098
- .mint-number-input__input--lg { padding: 0.6875rem 1rem 0.8125rem; font-size: 1rem; }
19282
+ .mint-number-input__input--sm { padding: 0.375rem 0.625rem; font-size: 0.875rem; }
19283
+ .mint-number-input__input--md { padding: 0.5rem 0.75rem; font-size: 0.875rem; }
19284
+ .mint-number-input__input--lg { padding: 0.75rem 1rem; font-size: 1rem; }
19099
19285
  /* ---------- Unit suffix ---------- */
19100
19286
  .mint-number-input__unit {
19101
19287
  padding: 0 0.625rem 0 0;
@@ -20228,9 +20414,8 @@ code, pre {
20228
20414
  background-color: var(--bg-tertiary);
20229
20415
  border-radius: var(--radius-md);
20230
20416
  }
20231
- /* 1px optical padding shift (0.16+). See CLAUDE.md § Optical Centering. */
20232
20417
  .mint-tab {
20233
- padding: 0.4375rem 1rem 0.5625rem;
20418
+ padding: 0.5rem 1rem;
20234
20419
  font-size: 0.875rem;
20235
20420
  font-weight: 500;
20236
20421
  transition: color 0.15s ease, background-color 0.15s ease, border-color 0.15s ease;
@@ -20502,18 +20687,17 @@ code, pre {
20502
20687
  cursor: not-allowed;
20503
20688
  resize: none;
20504
20689
  }
20505
- /* Size variants — 1px optical padding shift (0.16+).
20506
- See CLAUDE.md § Optical Centering. */
20690
+ /* Size variants */
20507
20691
  .mint-textarea--sm {
20508
- padding: 0.3125rem 0.625rem 0.4375rem;
20692
+ padding: 0.375rem 0.625rem;
20509
20693
  font-size: 0.8125rem;
20510
20694
  }
20511
20695
  .mint-textarea--md {
20512
- padding: 0.4375rem 0.75rem 0.5625rem;
20696
+ padding: 0.5rem 0.75rem;
20513
20697
  font-size: 0.875rem;
20514
20698
  }
20515
20699
  .mint-textarea--lg {
20516
- padding: 0.6875rem 1rem 0.8125rem;
20700
+ padding: 0.75rem 1rem;
20517
20701
  font-size: 1rem;
20518
20702
  }
20519
20703
  .mint-textarea--resize-none {
@@ -24325,22 +24509,19 @@ html.dark .mint-toast__item .mint-toast__message {
24325
24509
  color: var(--text-primary);
24326
24510
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
24327
24511
  }
24328
- /* Size variants - simple — 1px optical padding shift universally (0.16+).
24329
- See CLAUDE.md § Optical Centering. */
24512
+ /* Size variants - simple */
24330
24513
  .mint-segmented-control__option--simple.mint-segmented-control__option--sm {
24331
- padding: 0.3125rem 0.75rem 0.4375rem;
24514
+ padding: 0.375rem 0.75rem;
24332
24515
  font-size: 0.75rem;
24333
24516
  min-height: var(--form-height-sm);
24334
24517
  }
24335
24518
  .mint-segmented-control__option--simple.mint-segmented-control__option--md {
24336
- padding: 0.4375rem 1rem 0.5625rem;
24519
+ padding: 0.5rem 1rem;
24337
24520
  font-size: 0.875rem;
24338
24521
  min-height: var(--form-height-md);
24339
24522
  }
24340
24523
  .mint-segmented-control__option--simple.mint-segmented-control__option--lg {
24341
- /* 9/11 (not 11/13 like BaseButton lg) — SegmentedControl uses a smaller
24342
- em-box at 1rem font + 1.25 line-height, so the 1px shift lands here. */
24343
- padding: 0.5625rem 1.25rem 0.6875rem;
24524
+ padding: 0.625rem 1.25rem;
24344
24525
  font-size: 1rem;
24345
24526
  min-height: var(--form-height-lg);
24346
24527
  }
@@ -24763,19 +24944,19 @@ html.dark .mint-pill__remove:hover {
24763
24944
  .mint-dropdown-button__trigger--ghost:hover:not(.mint-dropdown-button__trigger--disabled) {
24764
24945
  background-color: var(--bg-tertiary);
24765
24946
  }
24766
- /* Trigger sizes — 1px optical padding shift (0.16+). See CLAUDE.md § Optical Centering. */
24947
+ /* Trigger sizes */
24767
24948
  .mint-dropdown-button__trigger--sm {
24768
- padding: 0.3125rem 0.75rem 0.4375rem;
24949
+ padding: 0.375rem 0.75rem;
24769
24950
  font-size: 0.875rem;
24770
24951
  min-height: var(--form-height-sm);
24771
24952
  }
24772
24953
  .mint-dropdown-button__trigger--md {
24773
- padding: 0.4375rem 1rem 0.5625rem;
24954
+ padding: 0.5rem 1rem;
24774
24955
  font-size: 0.875rem;
24775
24956
  min-height: var(--form-height-md);
24776
24957
  }
24777
24958
  .mint-dropdown-button__trigger--lg {
24778
- padding: 0.6875rem 1.5rem 0.8125rem;
24959
+ padding: 0.75rem 1.5rem;
24779
24960
  font-size: 1rem;
24780
24961
  min-height: var(--form-height-lg);
24781
24962
  }
@@ -26733,6 +26914,168 @@ html.dark .mint-settings-modal__option-btn--active {
26733
26914
  margin-bottom: 0 !important;
26734
26915
  padding: 0 !important;
26735
26916
  }
26917
+ /* ─────────────────────────────────────────────────────────────────────
26918
+ * Schema-driven content grid (used by both layouts)
26919
+ * Cols come from `--mint-settings-cols` set inline by the component;
26920
+ * keeps the data binding minimal and the styling in one place.
26921
+ * ───────────────────────────────────────────────────────────────────── */
26922
+ .mint-settings-modal__group-grid {
26923
+ display: grid;
26924
+ gap: 1rem;
26925
+ grid-template-columns: repeat(var(--mint-settings-cols, 1), minmax(0, 1fr));
26926
+ }
26927
+ /* ─────────────────────────────────────────────────────────────────────
26928
+ * Vertical layout — sidebar rail + content pane (opt-in via layout="vertical")
26929
+ * Designed for complex plugins with 5+ setting groups. Existing horizontal
26930
+ * classes above are deliberately untouched.
26931
+ * ───────────────────────────────────────────────────────────────────── */
26932
+ .mint-settings-modal--vertical {
26933
+ flex-direction: row;
26934
+ gap: 1.25rem;
26935
+ align-items: stretch;
26936
+ min-height: 22rem;
26937
+ }
26938
+ .mint-settings-modal__rail {
26939
+ flex-shrink: 0;
26940
+ width: 12.5rem;
26941
+ display: flex;
26942
+ flex-direction: column;
26943
+ gap: 0.125rem;
26944
+ padding-right: 0.75rem;
26945
+ border-right: 1px solid var(--border-light);
26946
+ }
26947
+ .mint-settings-modal__rail-item {
26948
+ display: flex;
26949
+ align-items: flex-start;
26950
+ gap: 0.625rem;
26951
+ width: 100%;
26952
+ padding: 0.5rem 0.75rem;
26953
+ font-size: 0.8125rem;
26954
+ font-weight: 500;
26955
+ color: var(--text-secondary);
26956
+ background: none;
26957
+ border: none;
26958
+ border-radius: var(--radius-md);
26959
+ cursor: pointer;
26960
+ text-align: left;
26961
+ transition:
26962
+ color var(--mint-transition),
26963
+ background-color var(--mint-transition);
26964
+ }
26965
+ .mint-settings-modal__rail-item:hover {
26966
+ background-color: var(--bg-hover);
26967
+ color: var(--text-primary);
26968
+ }
26969
+ .mint-settings-modal__rail-item:focus-visible {
26970
+ outline: none;
26971
+ box-shadow: var(--focus-ring);
26972
+ }
26973
+ .mint-settings-modal__rail-item--active {
26974
+ color: var(--color-primary);
26975
+ background-color: color-mix(in srgb, var(--color-primary) 10%, transparent);
26976
+ }
26977
+ html.dark .mint-settings-modal__rail-item--active {
26978
+ background-color: color-mix(in srgb, var(--color-primary) 18%, transparent);
26979
+ }
26980
+ /* Reserved icon column keeps labels aligned whether or not icons are present */
26981
+ .mint-settings-modal__rail-item-icon {
26982
+ flex-shrink: 0;
26983
+ width: 1rem;
26984
+ height: 1rem;
26985
+ display: inline-flex;
26986
+ align-items: center;
26987
+ justify-content: center;
26988
+ margin-top: 0.0625rem;
26989
+ color: currentColor;
26990
+ }
26991
+ .mint-settings-modal__rail-item-icon svg {
26992
+ width: 100%;
26993
+ height: 100%;
26994
+ display: block;
26995
+ }
26996
+ .mint-settings-modal__rail-item-text {
26997
+ display: flex;
26998
+ flex-direction: column;
26999
+ gap: 0.125rem;
27000
+ min-width: 0;
27001
+ flex: 1;
27002
+ }
27003
+ .mint-settings-modal__rail-item-label {
27004
+ line-height: 1.3;
27005
+ }
27006
+ .mint-settings-modal__rail-item-description {
27007
+ font-size: 0.6875rem;
27008
+ font-weight: 400;
27009
+ color: var(--text-muted);
27010
+ line-height: 1.35;
27011
+ }
27012
+ .mint-settings-modal__rail-item--active .mint-settings-modal__rail-item-description {
27013
+ color: color-mix(in srgb, var(--color-primary) 65%, var(--text-secondary));
27014
+ }
27015
+ .mint-settings-modal__pane {
27016
+ flex: 1;
27017
+ min-width: 0;
27018
+ display: flex;
27019
+ flex-direction: column;
27020
+ }
27021
+ .mint-settings-modal__pane-header {
27022
+ margin-bottom: 1rem;
27023
+ padding-bottom: 0.75rem;
27024
+ border-bottom: 1px solid var(--border-light);
27025
+ }
27026
+ .mint-settings-modal__pane-title {
27027
+ font-size: 0.875rem;
27028
+ font-weight: 600;
27029
+ color: var(--text-primary);
27030
+ letter-spacing: -0.005em;
27031
+ margin: 0 !important;
27032
+ padding: 0 !important;
27033
+ line-height: 1.3;
27034
+ }
27035
+ .mint-settings-modal__pane-subtitle {
27036
+ font-size: 0.75rem;
27037
+ color: var(--text-secondary);
27038
+ line-height: 1.45;
27039
+ margin: 0.25rem 0 0 !important;
27040
+ padding: 0 !important;
27041
+ }
27042
+ .mint-settings-modal__pane-body {
27043
+ flex: 1;
27044
+ min-height: 0;
27045
+ /* Trailing breathing room so the last field doesn't hug the modal border */
27046
+ padding-bottom: 0.25rem;
27047
+ }
27048
+ /* Mobile — collapse the rail into a horizontal scroll-strip so the modal stays usable.
27049
+ * Touch targets stay ≥40px tall via 0.5rem vertical padding + 1rem text line-height. */
27050
+ @media (max-width: 640px) {
27051
+ .mint-settings-modal--vertical {
27052
+ flex-direction: column;
27053
+ gap: 0.875rem;
27054
+ min-height: 0;
27055
+ }
27056
+
27057
+ .mint-settings-modal__rail {
27058
+ width: 100%;
27059
+ flex-direction: row;
27060
+ overflow-x: auto;
27061
+ padding: 0 0 0.625rem;
27062
+ border-right: none;
27063
+ border-bottom: 1px solid var(--border-light);
27064
+ gap: 0.25rem;
27065
+ scrollbar-width: thin;
27066
+ }
27067
+
27068
+ .mint-settings-modal__rail-item {
27069
+ flex-shrink: 0;
27070
+ width: auto;
27071
+ padding: 0.5rem 0.75rem;
27072
+ }
27073
+
27074
+ /* Two-line description hides on mobile so the rail strip stays compact */
27075
+ .mint-settings-modal__rail-item-description {
27076
+ display: none;
27077
+ }
27078
+ }
26736
27079
  /* ScientificNumber Component Styles */
26737
27080
  .mint-sci-number {
26738
27081
  display: inline-flex;
@@ -27124,9 +27467,9 @@ html.dark .mint-settings-modal__option-btn--active {
27124
27467
  .mint-unit-input__value:disabled { cursor: not-allowed; }
27125
27468
  /* Horizontal padding matches BaseInput canonical scale (10/12/16) so FormField's
27126
27469
  12px label indent aligns with the value text across all input types. */
27127
- .mint-unit-input__value--sm { padding: 0.3125rem 0.625rem 0.4375rem; font-size: 0.875rem; }
27128
- .mint-unit-input__value--md { padding: 0.4375rem 0.75rem 0.5625rem; font-size: 0.875rem; }
27129
- .mint-unit-input__value--lg { padding: 0.6875rem 1rem 0.8125rem; font-size: 1rem; }
27470
+ .mint-unit-input__value--sm { padding: 0.375rem 0.625rem; font-size: 0.875rem; }
27471
+ .mint-unit-input__value--md { padding: 0.5rem 0.75rem; font-size: 0.875rem; }
27472
+ .mint-unit-input__value--lg { padding: 0.75rem 1rem; font-size: 1rem; }
27130
27473
  /* ---------- Unit chip ---------- */
27131
27474
  .mint-unit-input__unit {
27132
27475
  display: flex;