kanto-ds 1.5.2 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/README.md +10 -10
  2. package/dist/chunks/floating-B33g-M_1.js +63 -0
  3. package/dist/chunks/floating-B33g-M_1.js.map +1 -0
  4. package/dist/chunks/{index-STEEvEP7.js → index-TWJzttLX.js} +38 -15
  5. package/dist/chunks/index-TWJzttLX.js.map +1 -0
  6. package/dist/chunks/kt-calendar-CtwOby1R.js +780 -0
  7. package/dist/chunks/kt-calendar-CtwOby1R.js.map +1 -0
  8. package/dist/chunks/{kt-element-Djx2JcGl.js → kt-element-T0VbIBNp.js} +2 -2
  9. package/dist/chunks/{kt-element-Djx2JcGl.js.map → kt-element-T0VbIBNp.js.map} +1 -1
  10. package/dist/chunks/{listbox-llcUu_V-.js → listbox-LsUEyGhQ.js} +2 -2
  11. package/dist/chunks/{listbox-llcUu_V-.js.map → listbox-LsUEyGhQ.js.map} +1 -1
  12. package/dist/chunks/segmented-field-BBXR4XFL.js +384 -0
  13. package/dist/chunks/segmented-field-BBXR4XFL.js.map +1 -0
  14. package/dist/chunks/typed-date-CPAUNHzr.js +103 -0
  15. package/dist/chunks/typed-date-CPAUNHzr.js.map +1 -0
  16. package/dist/components/core/kt-avatar/kt-avatar.js +2 -2
  17. package/dist/components/core/kt-badge/kt-badge.js +2 -2
  18. package/dist/components/core/kt-button/kt-button.js +1 -1
  19. package/dist/components/core/kt-card/kt-card.js +1 -1
  20. package/dist/components/core/kt-code/kt-code.js +13 -13
  21. package/dist/components/core/kt-code/kt-code.js.map +1 -1
  22. package/dist/components/core/kt-icon/kt-icon.js +1 -1
  23. package/dist/components/core/kt-kbd/kt-kbd.js +5 -5
  24. package/dist/components/core/kt-kbd/kt-kbd.js.map +1 -1
  25. package/dist/components/core/kt-split-button/kt-split-button.js +3 -3
  26. package/dist/components/data/kt-chart/kt-chart.js +3 -3
  27. package/dist/components/data/kt-chart/kt-chart.js.map +1 -1
  28. package/dist/components/data/kt-meter/kt-meter.js +1 -1
  29. package/dist/components/data/kt-pagination/kt-pagination.js +2 -2
  30. package/dist/components/data/kt-stat/kt-stat.js +1 -1
  31. package/dist/components/data/kt-table/kt-table.js +85 -85
  32. package/dist/components/data/kt-table/kt-table.js.map +1 -1
  33. package/dist/components/data/kt-timeline/kt-timeline.js +1 -1
  34. package/dist/components/feedback/kt-alert/kt-alert.js +15 -15
  35. package/dist/components/feedback/kt-alert/kt-alert.js.map +1 -1
  36. package/dist/components/feedback/kt-empty-state/kt-empty-state.js +1 -1
  37. package/dist/components/feedback/kt-progress-bar/kt-progress-bar.js +1 -1
  38. package/dist/components/feedback/kt-skeleton/kt-skeleton.js +13 -13
  39. package/dist/components/feedback/kt-skeleton/kt-skeleton.js.map +1 -1
  40. package/dist/components/feedback/kt-toast/kt-toast.js +3 -3
  41. package/dist/components/feedback/kt-toast/kt-toast.js.map +1 -1
  42. package/dist/components/feedback/kt-toast-container/kt-toast-container.js +1 -1
  43. package/dist/components/feedback/kt-tooltip/kt-tooltip.js +1 -1
  44. package/dist/components/forms/kt-calendar/kt-calendar.d.ts +35 -9
  45. package/dist/components/forms/kt-calendar/kt-calendar.js +3 -3
  46. package/dist/components/forms/kt-checkbox/kt-checkbox.js +2 -2
  47. package/dist/components/forms/kt-date-input/kt-date-input.d.ts +65 -0
  48. package/dist/components/forms/kt-date-input/kt-date-input.js +241 -0
  49. package/dist/components/forms/kt-date-input/kt-date-input.js.map +1 -0
  50. package/dist/components/forms/kt-date-picker/kt-date-picker.d.ts +47 -3
  51. package/dist/components/forms/kt-date-picker/kt-date-picker.js +430 -199
  52. package/dist/components/forms/kt-date-picker/kt-date-picker.js.map +1 -1
  53. package/dist/components/forms/kt-drag-drop/kt-drag-drop.js +3 -3
  54. package/dist/components/forms/kt-drag-drop/kt-drag-drop.js.map +1 -1
  55. package/dist/components/forms/kt-form/kt-form.js +2 -2
  56. package/dist/components/forms/kt-input/kt-input.js +10 -10
  57. package/dist/components/forms/kt-input/kt-input.js.map +1 -1
  58. package/dist/components/forms/kt-input-menu/kt-input-menu.js +4 -4
  59. package/dist/components/forms/kt-label-input/kt-label-input.js +1 -1
  60. package/dist/components/forms/kt-multi-select/kt-multi-select.d.ts +113 -0
  61. package/dist/components/forms/kt-multi-select/kt-multi-select.js +532 -0
  62. package/dist/components/forms/kt-multi-select/kt-multi-select.js.map +1 -0
  63. package/dist/components/forms/kt-radio-group/kt-radio-group.js +56 -51
  64. package/dist/components/forms/kt-radio-group/kt-radio-group.js.map +1 -1
  65. package/dist/components/forms/kt-select/kt-select.js +4 -4
  66. package/dist/components/forms/kt-textarea/kt-textarea.js +2 -2
  67. package/dist/components/forms/kt-time-input/kt-time-input.d.ts +48 -0
  68. package/dist/components/forms/kt-time-input/kt-time-input.js +114 -0
  69. package/dist/components/forms/kt-time-input/kt-time-input.js.map +1 -0
  70. package/dist/components/forms/kt-toggle/kt-toggle.js +1 -1
  71. package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js +6 -6
  72. package/dist/components/navigation/kt-breadcrumb/kt-breadcrumb.js.map +1 -1
  73. package/dist/components/navigation/kt-header/kt-header.js +2 -2
  74. package/dist/components/navigation/kt-page-header/kt-page-header.js +1 -1
  75. package/dist/components/navigation/kt-segmented-control/kt-segmented-control.js +2 -2
  76. package/dist/components/navigation/kt-sub-menu-navigation/kt-sub-menu-navigation.js +2 -2
  77. package/dist/components/navigation/kt-tabs/kt-tabs.js +2 -2
  78. package/dist/components/navigation/kt-tabs/kt-tabs.js.map +1 -1
  79. package/dist/components/navigation/kt-toggle-button/kt-toggle-button.js +1 -1
  80. package/dist/components/navigation/kt-toggle-button-group/kt-toggle-button-group.js +2 -2
  81. package/dist/components/overlays/kt-collapsible/kt-collapsible.js +3 -3
  82. package/dist/components/overlays/kt-collapsible/kt-collapsible.js.map +1 -1
  83. package/dist/components/overlays/kt-confirm-dialog/kt-confirm-dialog.js +2 -2
  84. package/dist/components/overlays/kt-dropdown/kt-dropdown.js +24 -24
  85. package/dist/components/overlays/kt-dropdown/kt-dropdown.js.map +1 -1
  86. package/dist/components/overlays/kt-modal/kt-modal.js +2 -2
  87. package/dist/components/overlays/kt-side-panel/kt-side-panel.js +2 -2
  88. package/dist/custom-elements.json +2230 -842
  89. package/dist/index.d.ts +9 -1
  90. package/dist/index.js +316 -109
  91. package/dist/index.js.map +1 -1
  92. package/dist/internal/floating.d.ts +3 -0
  93. package/dist/internal/segmented-field.d.ts +114 -0
  94. package/dist/internal/segments.d.ts +30 -0
  95. package/dist/internal/strings.d.ts +30 -0
  96. package/dist/internal/typed-date.d.ts +33 -0
  97. package/dist/react/index.d.ts +23 -0
  98. package/dist/react/index.js +193 -169
  99. package/dist/react/index.js.map +1 -1
  100. package/dist/react/jsx.d.ts +20 -1
  101. package/dist/strings/index.js +1 -1
  102. package/dist/theme/accent.d.ts +51 -0
  103. package/dist/theme/appearance.d.ts +37 -0
  104. package/dist/tokens/README.md +100 -1
  105. package/dist/tokens/accents.css +80 -0
  106. package/dist/tokens/appearance.css +65 -0
  107. package/dist/tokens/base.css +3 -0
  108. package/dist/tokens/colors.css +78 -25
  109. package/dist/tokens/index.css +2 -0
  110. package/dist/tokens/responsive.css +160 -75
  111. package/dist/tokens/spacing.css +47 -28
  112. package/dist/tokens/theme-light.css +124 -38
  113. package/dist/tokens/typography.css +20 -13
  114. package/dist/vscode.css-custom-data.json +36 -1
  115. package/dist/vscode.html-custom-data.json +67 -2
  116. package/dist/vue/index.d.ts +6 -0
  117. package/dist/vue/index.js +11 -8
  118. package/dist/vue/index.js.map +1 -1
  119. package/dist/web-types.json +190 -3
  120. package/package.json +13 -1
  121. package/dist/chunks/floating-B7_Dahpn.js +0 -54
  122. package/dist/chunks/floating-B7_Dahpn.js.map +0 -1
  123. package/dist/chunks/index-STEEvEP7.js.map +0 -1
  124. package/dist/chunks/kt-calendar-B_hFdD9V.js +0 -640
  125. package/dist/chunks/kt-calendar-B_hFdD9V.js.map +0 -1
@@ -17,17 +17,23 @@
17
17
  * them their colour.
18
18
  */
19
19
 
20
- :root {
20
+ /* The accent and the tint of the neutrals are inputs: set them on any
21
+ element — directly, through a data-accent preset (accents.css) or with
22
+ setAccent() — and the tokens below follow. Each falls back to Kanto's
23
+ violet. An element carrying data-accent re-declares the tokens, so an
24
+ accent set on a container themes that container. */
25
+ :root,
26
+ [data-accent] {
21
27
  color-scheme: dark;
22
28
 
23
29
  /* === BRAND === */
24
30
  --color-white: rgba(244, 244, 245, 1);
25
31
  /* Dark enough to carry white text at 4.5:1 in both themes — hover steps
26
32
  darker, not lighter, for the same reason. */
27
- --color-primary-base: rgba(95, 93, 234, 1);
28
- --color-primary-hover: rgba(88, 86, 224, 1);
29
- --color-primary-soft: rgba(95, 93, 234, 0.12);
30
- --color-secondary-hover: rgba(111, 116, 246, 0.16);
33
+ --color-primary-base: var(--accent-base, rgba(95, 93, 234, 1));
34
+ --color-primary-hover: var(--accent-hover, rgba(88, 86, 224, 1));
35
+ --color-primary-soft: color-mix(in srgb, var(--color-primary-base) 12%, transparent);
36
+ --color-secondary-hover: var(--accent-wash, rgba(111, 116, 246, 0.16));
31
37
 
32
38
  /* === SEMANTIC === */
33
39
  --color-danger-base: rgba(245, 61, 92, 1);
@@ -50,34 +56,73 @@
50
56
  --color-success-soft: rgba(53, 221, 131, 0.12);
51
57
 
52
58
  /* === TEXT STEPS OF THE BRAND AND SEMANTIC COLOURS === */
53
- --color-primary-text: #8e97ff;
59
+ --color-primary-text: var(--accent-text-dark, #8e97ff);
54
60
  --color-danger-text: #ff727f;
55
61
  --color-info-text: #06b0fc;
56
62
  --color-warning-text: #fca80d;
57
63
  --color-success-text: #01df7e;
58
64
 
59
- /* === TEXT (100 = highest contrast) === */
60
- --color-text-100: rgba(244, 244, 245, 1);
65
+ /* === TEXT (100 = highest contrast) ===
66
+ Neutral, tinted by the accent: each step keeps its lightness and chroma
67
+ and sits at a fixed offset from --neutral-hue, so the default reproduces
68
+ the ramp Kanto shipped to within a tenth of an sRGB unit. */
69
+ --color-text-100: oklch(
70
+ 0.9674 calc(0.0013 * var(--neutral-chroma, 1)) calc(var(--neutral-hue, 278) + 8.4)
71
+ );
61
72
  /* 4.5:1 on every surface up to --color-dark-24, and on the tinted alerts. */
62
- --color-text-400: rgba(169, 169, 181, 1);
63
- --color-text-500: rgba(101, 101, 114, 1);
64
- --color-text-600: rgba(75, 75, 88, 1);
65
- --color-text-700: rgba(66, 66, 77, 1);
66
- --color-text-800: rgba(58, 58, 68, 1);
67
- --color-text-900: rgba(39, 39, 42, 1);
73
+ --color-text-400: oklch(
74
+ 0.7386 calc(0.0171 * var(--neutral-chroma, 1)) calc(var(--neutral-hue, 278) + 8)
75
+ );
76
+ --color-text-500: oklch(
77
+ 0.5113 calc(0.0204 * var(--neutral-chroma, 1)) calc(var(--neutral-hue, 278) + 7.7)
78
+ );
79
+ --color-text-600: oklch(
80
+ 0.4178 calc(0.0215 * var(--neutral-chroma, 1)) calc(var(--neutral-hue, 278) + 7.4)
81
+ );
82
+ --color-text-700: oklch(
83
+ 0.3833 calc(0.0186 * var(--neutral-chroma, 1)) calc(var(--neutral-hue, 278) + 7.5)
84
+ );
85
+ --color-text-800: oklch(
86
+ 0.3524 calc(0.0172 * var(--neutral-chroma, 1)) calc(var(--neutral-hue, 278) + 7.5)
87
+ );
88
+ --color-text-900: oklch(
89
+ 0.2739 calc(0.0055 * var(--neutral-chroma, 1)) calc(var(--neutral-hue, 278) + 8)
90
+ );
68
91
 
69
92
  /* === SURFACES (low → high elevation) === */
70
- --color-dark-8: rgba(19, 18, 22, 1);
71
- --color-dark-12: rgba(29, 28, 34, 1);
72
- --color-dark-14: rgba(34, 33, 39, 1);
73
- --color-dark-15: rgba(36, 35, 41, 1);
74
- --color-dark-16: rgba(38, 37, 44, 1);
75
- --color-dark-18: rgba(43, 42, 50, 1);
76
- --color-dark-19: rgba(45, 44, 53, 1);
77
- --color-dark-20: rgba(48, 46, 56, 1);
78
- --color-dark-22: rgba(53, 51, 61, 1);
79
- --color-dark-23: rgba(55, 53, 64, 1);
80
- --color-dark-24: rgba(58, 56, 67, 1);
93
+ --color-dark-8: oklch(
94
+ 0.1852 calc(0.0082 * var(--neutral-chroma, 1)) calc(var(--neutral-hue, 278) + 19)
95
+ );
96
+ --color-dark-12: oklch(
97
+ 0.2302 calc(0.0115 * var(--neutral-chroma, 1)) calc(var(--neutral-hue, 278) + 15.1)
98
+ );
99
+ --color-dark-14: oklch(
100
+ 0.2514 calc(0.0113 * var(--neutral-chroma, 1)) calc(var(--neutral-hue, 278) + 15.2)
101
+ );
102
+ --color-dark-15: oklch(
103
+ 0.2597 calc(0.0112 * var(--neutral-chroma, 1)) calc(var(--neutral-hue, 278) + 15.3)
104
+ );
105
+ --color-dark-16: oklch(
106
+ 0.2685 calc(0.0129 * var(--neutral-chroma, 1)) calc(var(--neutral-hue, 278) + 14.1)
107
+ );
108
+ --color-dark-18: oklch(
109
+ 0.2894 calc(0.0145 * var(--neutral-chroma, 1)) calc(var(--neutral-hue, 278) + 13.2)
110
+ );
111
+ --color-dark-19: oklch(
112
+ 0.2979 calc(0.0162 * var(--neutral-chroma, 1)) calc(var(--neutral-hue, 278) + 12.5)
113
+ );
114
+ --color-dark-20: oklch(
115
+ 0.3074 calc(0.018 * var(--neutral-chroma, 1)) calc(var(--neutral-hue, 278) + 16.5)
116
+ );
117
+ --color-dark-22: oklch(
118
+ 0.3271 calc(0.0177 * var(--neutral-chroma, 1)) calc(var(--neutral-hue, 278) + 16.6)
119
+ );
120
+ --color-dark-23: oklch(
121
+ 0.3354 calc(0.0193 * var(--neutral-chroma, 1)) calc(var(--neutral-hue, 278) + 15.7)
122
+ );
123
+ --color-dark-24: oklch(
124
+ 0.3471 calc(0.0191 * var(--neutral-chroma, 1)) calc(var(--neutral-hue, 278) + 15.7)
125
+ );
81
126
 
82
127
  /* === NAVIGATION === */
83
128
  --color-navigation-top-icon: #f4f4f5;
@@ -137,6 +182,14 @@
137
182
  /* Deliberately opposite the page, for anything that must read as floating
138
183
  above it — the tooltip. */
139
184
  --surface-inverted: var(--color-dark-8);
185
+
186
+ /* What floats over the page — a list, a calendar, a menu. In the dark the
187
+ ramp sets it apart on its own: a lighter surface, no edge, no shadow. */
188
+ --surface-popover: var(--color-dark-20);
189
+ --border-popover: transparent;
190
+ --shadow-popover: none;
191
+ /* Lines inside a popover: --border-subtle is the popover's own colour here. */
192
+ --divider-popover: var(--color-dark-24);
140
193
  --text-inverted: var(--color-text-100);
141
194
  --text-body: var(--color-text-100);
142
195
  --text-muted: var(--color-text-400);
@@ -7,6 +7,8 @@
7
7
 
8
8
  @import './colors.css';
9
9
  @import './theme-light.css';
10
+ @import './accents.css';
10
11
  @import './typography.css';
11
12
  @import './spacing.css';
12
13
  @import './responsive.css';
14
+ @import './appearance.css';
@@ -8,62 +8,116 @@
8
8
 
9
9
  /* === MOBILE (< 600px) === */
10
10
  @media (max-width: 599px) {
11
- :root {
12
- --font-title-studio: 400 36px/44px var(--font-family-display);
13
- --font-title-h1: 600 30px/36px var(--font-family-display);
14
- --font-title-h4: 400 22px/28px var(--font-family-display);
15
- --font-title-h6: 600 18px/22px var(--font-family-display);
16
- --font-normal-regular: 400 12px/18px var(--font-family-body);
17
- --font-normal-medium: 500 12px/18px var(--font-family-body);
18
- --font-normal-small: 400 10px/14px var(--font-family-body);
11
+ :root,
12
+ [data-radius],
13
+ [data-density],
14
+ [data-text-size],
15
+ [data-font] {
16
+ --font-title-studio: 400 calc(36px * var(--text-scale, 1)) / calc(44px * var(--text-scale, 1))
17
+ var(--font-family-display);
18
+ --font-title-h1: 600 calc(30px * var(--text-scale, 1)) / calc(36px * var(--text-scale, 1))
19
+ var(--font-family-display);
20
+ --font-title-h4: 400 calc(22px * var(--text-scale, 1)) / calc(28px * var(--text-scale, 1))
21
+ var(--font-family-display);
22
+ --font-title-h6: 600 calc(18px * var(--text-scale, 1)) / calc(22px * var(--text-scale, 1))
23
+ var(--font-family-display);
24
+ --font-normal-regular: 400 calc(12px * var(--text-scale, 1)) / calc(18px * var(--text-scale, 1))
25
+ var(--font-family-body);
26
+ --font-normal-medium: 500 calc(12px * var(--text-scale, 1)) / calc(18px * var(--text-scale, 1))
27
+ var(--font-family-body);
28
+ --font-normal-small: 400 calc(10px * var(--text-scale, 1)) / calc(14px * var(--text-scale, 1))
29
+ var(--font-family-body);
19
30
  /* 16px keeps iOS Safari from zooming on focus. */
20
- --font-input: 400 16px/1.4 var(--font-family-body);
21
- --font-code-regular: 400 12px/16px var(--font-family-code);
22
-
23
- --padding-card: 16px;
24
- --padding-modal: 16px;
25
- --padding-input: 8px 0;
26
- --padding-form: 12px;
27
- --button-padding-x: 12px;
28
-
29
- --gap-card: 14px;
30
- --gap-modal: 14px;
31
- --gap-element: 4px;
32
- --gap-form: 12px;
33
- --gap-button: 8px;
34
-
35
- --button-height-small: 30px;
36
- --button-height: 36px;
37
- --button-height-large: 42px;
31
+ --font-input: 400 calc(16px * var(--text-scale, 1))/1.4 var(--font-family-body);
32
+ --font-code-regular: 400 calc(12px * var(--text-scale, 1)) / calc(16px * var(--text-scale, 1))
33
+ var(--font-family-code);
34
+
35
+ --padding-card: calc(16px * var(--density-scale, 1));
36
+ --padding-modal: calc(16px * var(--density-scale, 1));
37
+ --padding-input: calc(8px * var(--density-scale, 1)) 0;
38
+ --padding-form: calc(12px * var(--density-scale, 1));
39
+ --button-padding-x: calc(12px * var(--density-scale, 1));
40
+
41
+ --gap-card: calc(14px * var(--density-scale, 1));
42
+ --gap-modal: calc(14px * var(--density-scale, 1));
43
+ --gap-element: calc(4px * var(--density-scale, 1));
44
+ --gap-form: calc(12px * var(--density-scale, 1));
45
+ --gap-button: calc(8px * var(--density-scale, 1));
46
+
47
+ --button-height-small: calc(30px * var(--density-scale, 1));
48
+ --button-height: calc(36px * var(--density-scale, 1));
49
+ --button-height-large: calc(42px * var(--density-scale, 1));
50
+ }
51
+
52
+ /* Heights land on even pixels, so text centres on whole ones. CSS rounding
53
+ is newer than the rest of Kanto's CSS: behind @supports, an older
54
+ browser keeps the unrounded height rather than losing it. */
55
+ @supports (width: round(nearest, 1px, 1px)) {
56
+ :root,
57
+ [data-radius],
58
+ [data-density],
59
+ [data-text-size],
60
+ [data-font] {
61
+ --button-height-small: round(nearest, calc(30px * var(--density-scale, 1)), 2px);
62
+ --button-height: round(nearest, calc(36px * var(--density-scale, 1)), 2px);
63
+ --button-height-large: round(nearest, calc(42px * var(--density-scale, 1)), 2px);
64
+ }
38
65
  }
39
66
  }
40
67
 
41
68
  /* === TABLET (600px – 1023px) === */
42
69
  @media (min-width: 600px) and (max-width: 1023px) {
43
- :root {
44
- --font-title-studio: 400 44px/52px var(--font-family-display);
45
- --font-title-h1: 600 36px/42px var(--font-family-display);
46
- --font-title-h4: 400 26px/32px var(--font-family-display);
47
- --font-title-h6: 600 20px/24px var(--font-family-display);
48
- --font-normal-regular: 400 14px/18px var(--font-family-body);
49
- --font-normal-medium: 500 14px/18px var(--font-family-body);
50
- --font-normal-small: 400 12px/16px var(--font-family-body);
51
- --font-code-regular: 400 14px/18px var(--font-family-code);
52
-
53
- --padding-card: 20px;
54
- --padding-modal: 20px;
55
- --padding-input: 10px 0;
56
- --padding-form: 16px;
57
-
58
- --gap-card: 18px;
59
- --gap-modal: 18px;
60
- --gap-element: 4px;
61
- --gap-form: 14px;
62
- --gap-button: 10px;
63
-
64
- --button-height-small: 32px;
65
- --button-height: 40px;
66
- --button-height-large: 46px;
70
+ :root,
71
+ [data-radius],
72
+ [data-density],
73
+ [data-text-size],
74
+ [data-font] {
75
+ --font-title-studio: 400 calc(44px * var(--text-scale, 1)) / calc(52px * var(--text-scale, 1))
76
+ var(--font-family-display);
77
+ --font-title-h1: 600 calc(36px * var(--text-scale, 1)) / calc(42px * var(--text-scale, 1))
78
+ var(--font-family-display);
79
+ --font-title-h4: 400 calc(26px * var(--text-scale, 1)) / calc(32px * var(--text-scale, 1))
80
+ var(--font-family-display);
81
+ --font-title-h6: 600 calc(20px * var(--text-scale, 1)) / calc(24px * var(--text-scale, 1))
82
+ var(--font-family-display);
83
+ --font-normal-regular: 400 calc(14px * var(--text-scale, 1)) / calc(18px * var(--text-scale, 1))
84
+ var(--font-family-body);
85
+ --font-normal-medium: 500 calc(14px * var(--text-scale, 1)) / calc(18px * var(--text-scale, 1))
86
+ var(--font-family-body);
87
+ --font-normal-small: 400 calc(12px * var(--text-scale, 1)) / calc(16px * var(--text-scale, 1))
88
+ var(--font-family-body);
89
+ --font-code-regular: 400 calc(14px * var(--text-scale, 1)) / calc(18px * var(--text-scale, 1))
90
+ var(--font-family-code);
91
+
92
+ --padding-card: calc(20px * var(--density-scale, 1));
93
+ --padding-modal: calc(20px * var(--density-scale, 1));
94
+ --padding-input: calc(10px * var(--density-scale, 1)) 0;
95
+ --padding-form: calc(16px * var(--density-scale, 1));
96
+
97
+ --gap-card: calc(18px * var(--density-scale, 1));
98
+ --gap-modal: calc(18px * var(--density-scale, 1));
99
+ --gap-element: calc(4px * var(--density-scale, 1));
100
+ --gap-form: calc(14px * var(--density-scale, 1));
101
+ --gap-button: calc(10px * var(--density-scale, 1));
102
+
103
+ --button-height-small: calc(32px * var(--density-scale, 1));
104
+ --button-height: calc(40px * var(--density-scale, 1));
105
+ --button-height-large: calc(46px * var(--density-scale, 1));
106
+ }
107
+
108
+ /* Heights land on even pixels, so text centres on whole ones. CSS rounding
109
+ is newer than the rest of Kanto's CSS: behind @supports, an older
110
+ browser keeps the unrounded height rather than losing it. */
111
+ @supports (width: round(nearest, 1px, 1px)) {
112
+ :root,
113
+ [data-radius],
114
+ [data-density],
115
+ [data-text-size],
116
+ [data-font] {
117
+ --button-height-small: round(nearest, calc(32px * var(--density-scale, 1)), 2px);
118
+ --button-height: round(nearest, calc(40px * var(--density-scale, 1)), 2px);
119
+ --button-height-large: round(nearest, calc(46px * var(--density-scale, 1)), 2px);
120
+ }
67
121
  }
68
122
  }
69
123
 
@@ -71,36 +125,67 @@
71
125
  Kanto ships on trading-desk and NOC displays; at 21:9 the desktop scale
72
126
  reads as tiny rather than dense. */
73
127
  @media (min-aspect-ratio: 21/9) {
74
- :root {
75
- --font-title-studio: 400 72px/84px var(--font-family-display);
76
- --font-title-h1: 600 56px/64px var(--font-family-display);
77
- --font-title-h4: 400 36px/44px var(--font-family-display);
78
- --font-title-h6: 600 28px/34px var(--font-family-display);
79
- --font-normal-regular: 400 16px/22px var(--font-family-body);
80
- --font-normal-medium: 500 16px/22px var(--font-family-body);
81
- --font-normal-small: 400 14px/18px var(--font-family-body);
82
- --font-code-regular: 400 16px/22px var(--font-family-code);
83
-
84
- --padding-card: 36px;
85
- --padding-modal: 36px;
86
- --padding-input: 16px 0;
87
- --padding-form: 24px;
88
-
89
- --gap-card: 32px;
90
- --gap-modal: 32px;
91
- --gap-element: 6px;
92
- --gap-form: 20px;
93
- --gap-button: 16px;
94
-
95
- --button-height-small: 40px;
96
- --button-height: 52px;
97
- --button-height-large: 60px;
128
+ :root,
129
+ [data-radius],
130
+ [data-density],
131
+ [data-text-size],
132
+ [data-font] {
133
+ --font-title-studio: 400 calc(72px * var(--text-scale, 1)) / calc(84px * var(--text-scale, 1))
134
+ var(--font-family-display);
135
+ --font-title-h1: 600 calc(56px * var(--text-scale, 1)) / calc(64px * var(--text-scale, 1))
136
+ var(--font-family-display);
137
+ --font-title-h4: 400 calc(36px * var(--text-scale, 1)) / calc(44px * var(--text-scale, 1))
138
+ var(--font-family-display);
139
+ --font-title-h6: 600 calc(28px * var(--text-scale, 1)) / calc(34px * var(--text-scale, 1))
140
+ var(--font-family-display);
141
+ --font-normal-regular: 400 calc(16px * var(--text-scale, 1)) / calc(22px * var(--text-scale, 1))
142
+ var(--font-family-body);
143
+ --font-normal-medium: 500 calc(16px * var(--text-scale, 1)) / calc(22px * var(--text-scale, 1))
144
+ var(--font-family-body);
145
+ --font-normal-small: 400 calc(14px * var(--text-scale, 1)) / calc(18px * var(--text-scale, 1))
146
+ var(--font-family-body);
147
+ --font-code-regular: 400 calc(16px * var(--text-scale, 1)) / calc(22px * var(--text-scale, 1))
148
+ var(--font-family-code);
149
+
150
+ --padding-card: calc(36px * var(--density-scale, 1));
151
+ --padding-modal: calc(36px * var(--density-scale, 1));
152
+ --padding-input: calc(16px * var(--density-scale, 1)) 0;
153
+ --padding-form: calc(24px * var(--density-scale, 1));
154
+
155
+ --gap-card: calc(32px * var(--density-scale, 1));
156
+ --gap-modal: calc(32px * var(--density-scale, 1));
157
+ --gap-element: calc(6px * var(--density-scale, 1));
158
+ --gap-form: calc(20px * var(--density-scale, 1));
159
+ --gap-button: calc(16px * var(--density-scale, 1));
160
+
161
+ --button-height-small: calc(40px * var(--density-scale, 1));
162
+ --button-height: calc(52px * var(--density-scale, 1));
163
+ --button-height-large: calc(60px * var(--density-scale, 1));
164
+ }
165
+
166
+ /* Heights land on even pixels, so text centres on whole ones. CSS rounding
167
+ is newer than the rest of Kanto's CSS: behind @supports, an older
168
+ browser keeps the unrounded height rather than losing it. */
169
+ @supports (width: round(nearest, 1px, 1px)) {
170
+ :root,
171
+ [data-radius],
172
+ [data-density],
173
+ [data-text-size],
174
+ [data-font] {
175
+ --button-height-small: round(nearest, calc(40px * var(--density-scale, 1)), 2px);
176
+ --button-height: round(nearest, calc(52px * var(--density-scale, 1)), 2px);
177
+ --button-height-large: round(nearest, calc(60px * var(--density-scale, 1)), 2px);
178
+ }
98
179
  }
99
180
  }
100
181
 
101
182
  /* === REDUCED MOTION === */
102
183
  @media (prefers-reduced-motion: reduce) {
103
- :root {
184
+ :root,
185
+ [data-radius],
186
+ [data-density],
187
+ [data-text-size],
188
+ [data-font] {
104
189
  --duration-instant: 0s;
105
190
  --duration-fast: 0s;
106
191
  --duration-normal: 0s;
@@ -3,43 +3,47 @@
3
3
  * overrides live in `responsive.css`.
4
4
  */
5
5
 
6
- :root {
6
+ :root,
7
+ [data-radius],
8
+ [data-density],
9
+ [data-text-size],
10
+ [data-font] {
7
11
  /* === RADIUS === */
8
- --border-radius: 8px; /* inputs, buttons, square chips */
9
- --border-radius-card: 12px;
10
- --radius-input: 8px;
11
- --radius-modal: 12px;
12
- --radius-sub-menu: 2px;
12
+ --border-radius: calc(8px * var(--radius-scale, 1)); /* inputs, buttons, square chips */
13
+ --border-radius-card: calc(12px * var(--radius-scale, 1));
14
+ --radius-input: calc(8px * var(--radius-scale, 1));
15
+ --radius-modal: calc(12px * var(--radius-scale, 1));
16
+ --radius-sub-menu: calc(2px * var(--radius-scale, 1));
13
17
  --radius-pill: 20px; /* tag chips */
14
18
  --radius-full: 9999px; /* toggle track and thumb */
15
19
 
16
20
  /* === PADDING === */
17
- --padding-card: 24px;
18
- --padding-modal: 24px;
19
- --padding-input: 8px 0;
20
- --padding-form: 16px;
21
- --padding-sub-menu: 12px 24px;
22
- --padding-sub-menu-item: 8px 16px;
23
- --padding-expand: 8px;
24
- --padding-expand-item: 8px 16px;
25
- --padding-drag-drop: 16px 24px;
26
- --padding-chip: 4px 12px;
27
- --text-area-padding: 10px 16px;
21
+ --padding-card: calc(24px * var(--density-scale, 1));
22
+ --padding-modal: calc(24px * var(--density-scale, 1));
23
+ --padding-input: calc(8px * var(--density-scale, 1)) 0;
24
+ --padding-form: calc(16px * var(--density-scale, 1));
25
+ --padding-sub-menu: calc(12px * var(--density-scale, 1)) calc(24px * var(--density-scale, 1));
26
+ --padding-sub-menu-item: calc(8px * var(--density-scale, 1)) calc(16px * var(--density-scale, 1));
27
+ --padding-expand: calc(8px * var(--density-scale, 1));
28
+ --padding-expand-item: calc(8px * var(--density-scale, 1)) calc(16px * var(--density-scale, 1));
29
+ --padding-drag-drop: calc(16px * var(--density-scale, 1)) calc(24px * var(--density-scale, 1));
30
+ --padding-chip: calc(4px * var(--density-scale, 1)) calc(12px * var(--density-scale, 1));
31
+ --text-area-padding: calc(10px * var(--density-scale, 1)) calc(16px * var(--density-scale, 1));
28
32
 
29
33
  /* === GAP === */
30
- --gap-element: 4px;
31
- --gap-button: 8px;
32
- --gap-drag-drop: 12px;
33
- --gap-form: 16px;
34
- --gap-card: 20px;
35
- --gap-modal: 20px;
36
- --gap-sub-menu: 24px;
34
+ --gap-element: calc(4px * var(--density-scale, 1));
35
+ --gap-button: calc(8px * var(--density-scale, 1));
36
+ --gap-drag-drop: calc(12px * var(--density-scale, 1));
37
+ --gap-form: calc(16px * var(--density-scale, 1));
38
+ --gap-card: calc(20px * var(--density-scale, 1));
39
+ --gap-modal: calc(20px * var(--density-scale, 1));
40
+ --gap-sub-menu: calc(24px * var(--density-scale, 1));
37
41
 
38
42
  /* === DIMENSIONS === */
39
- --button-height-small: 32px;
40
- --button-height: 40px;
41
- --button-height-large: 48px;
42
- --button-padding-x: 16px;
43
+ --button-height-small: calc(32px * var(--density-scale, 1));
44
+ --button-height: calc(40px * var(--density-scale, 1));
45
+ --button-height-large: calc(48px * var(--density-scale, 1));
46
+ --button-padding-x: calc(16px * var(--density-scale, 1));
43
47
 
44
48
  /* === BORDERS === */
45
49
  --border-width: 1px;
@@ -65,3 +69,18 @@
65
69
  --z-modal: 400;
66
70
  --z-toast: 500;
67
71
  }
72
+
73
+ /* Heights land on even pixels, so text centres on whole ones. CSS rounding
74
+ is newer than the rest of Kanto's CSS: behind @supports, an older
75
+ browser keeps the unrounded height rather than losing it. */
76
+ @supports (width: round(nearest, 1px, 1px)) {
77
+ :root,
78
+ [data-radius],
79
+ [data-density],
80
+ [data-text-size],
81
+ [data-font] {
82
+ --button-height-small: round(nearest, calc(32px * var(--density-scale, 1)), 2px);
83
+ --button-height: round(nearest, calc(40px * var(--density-scale, 1)), 2px);
84
+ --button-height-large: round(nearest, calc(48px * var(--density-scale, 1)), 2px);
85
+ }
86
+ }