@rvx/ui 0.1.7 → 0.1.8

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 (101) hide show
  1. package/dist/common/theme-test.js +1 -2
  2. package/dist/common/theme-test.js.map +1 -1
  3. package/dist/common/theme.d.ts +4 -2
  4. package/dist/common/theme.js +2 -1
  5. package/dist/common/theme.js.map +1 -1
  6. package/dist/components/button.d.ts +1 -1
  7. package/dist/components/button.js +2 -2
  8. package/dist/components/button.js.map +1 -1
  9. package/dist/components/checkbox-test.d.ts +3 -0
  10. package/dist/components/checkbox-test.js +30 -0
  11. package/dist/components/checkbox-test.js.map +1 -0
  12. package/dist/components/checkbox.js +5 -8
  13. package/dist/components/checkbox.js.map +1 -1
  14. package/dist/components/collapse.d.ts +2 -1
  15. package/dist/components/collapse.js +2 -2
  16. package/dist/components/collapse.js.map +1 -1
  17. package/dist/components/column.js +2 -2
  18. package/dist/components/column.js.map +1 -1
  19. package/dist/components/control-group.js +1 -2
  20. package/dist/components/control-group.js.map +1 -1
  21. package/dist/components/dialog.js +23 -21
  22. package/dist/components/dialog.js.map +1 -1
  23. package/dist/components/dropdown-input.js.map +1 -1
  24. package/dist/components/dropdown.js +4 -3
  25. package/dist/components/dropdown.js.map +1 -1
  26. package/dist/components/flex-space.js +2 -2
  27. package/dist/components/flex-space.js.map +1 -1
  28. package/dist/components/heading.d.ts +4 -0
  29. package/dist/components/heading.js +6 -2
  30. package/dist/components/heading.js.map +1 -1
  31. package/dist/components/label.js +2 -2
  32. package/dist/components/label.js.map +1 -1
  33. package/dist/components/layer.d.ts +4 -4
  34. package/dist/components/layer.js +7 -13
  35. package/dist/components/layer.js.map +1 -1
  36. package/dist/components/link.js +2 -2
  37. package/dist/components/link.js.map +1 -1
  38. package/dist/components/page.js +1 -2
  39. package/dist/components/page.js.map +1 -1
  40. package/dist/components/popout.d.ts +2 -1
  41. package/dist/components/popout.js +59 -58
  42. package/dist/components/popout.js.map +1 -1
  43. package/dist/components/popover.js +6 -5
  44. package/dist/components/popover.js.map +1 -1
  45. package/dist/components/radio-buttons.js +3 -2
  46. package/dist/components/radio-buttons.js.map +1 -1
  47. package/dist/components/row.js +2 -2
  48. package/dist/components/row.js.map +1 -1
  49. package/dist/components/scroll-view.js +2 -2
  50. package/dist/components/scroll-view.js.map +1 -1
  51. package/dist/components/text-input.js +2 -2
  52. package/dist/components/text-input.js.map +1 -1
  53. package/dist/components/text.js +1 -2
  54. package/dist/components/text.js.map +1 -1
  55. package/dist/components/validation.d.ts +4 -3
  56. package/dist/components/validation.js +6 -7
  57. package/dist/components/validation.js.map +1 -1
  58. package/dist/components/value.js +1 -2
  59. package/dist/components/value.js.map +1 -1
  60. package/dist/index.d.ts +2 -2
  61. package/dist/index.js +2 -2
  62. package/dist/index.js.map +1 -1
  63. package/dist/test.d.ts +1 -0
  64. package/dist/test.js +1 -0
  65. package/dist/test.js.map +1 -1
  66. package/dist/theme.module.css +108 -41
  67. package/dist/theme.module.css.map +1 -1
  68. package/package.json +2 -2
  69. package/src/common/theme-test.tsx +1 -3
  70. package/src/common/theme.tsx +4 -2
  71. package/src/components/button.tsx +3 -4
  72. package/src/components/checkbox-test.tsx +34 -0
  73. package/src/components/checkbox.tsx +5 -7
  74. package/src/components/collapse.tsx +3 -3
  75. package/src/components/column.tsx +2 -3
  76. package/src/components/control-group.tsx +2 -3
  77. package/src/components/dialog.tsx +23 -22
  78. package/src/components/dropdown-input.tsx +0 -1
  79. package/src/components/dropdown.tsx +4 -4
  80. package/src/components/flex-space.tsx +2 -3
  81. package/src/components/heading.tsx +10 -3
  82. package/src/components/label.tsx +3 -2
  83. package/src/components/layer.tsx +13 -19
  84. package/src/components/link.tsx +2 -3
  85. package/src/components/page.tsx +2 -3
  86. package/src/components/popout.tsx +68 -67
  87. package/src/components/popover.tsx +5 -5
  88. package/src/components/radio-buttons.tsx +3 -3
  89. package/src/components/row.tsx +2 -3
  90. package/src/components/scroll-view.tsx +2 -3
  91. package/src/components/text-input.tsx +2 -3
  92. package/src/components/text.tsx +2 -3
  93. package/src/components/validation.tsx +7 -9
  94. package/src/components/value.tsx +2 -3
  95. package/src/index.tsx +2 -2
  96. package/src/test.tsx +1 -0
  97. package/src/theme/base.scss +10 -5
  98. package/src/theme/components/button.scss +58 -31
  99. package/src/theme/components/control-group.scss +6 -1
  100. package/src/theme/components/link.scss +1 -1
  101. package/src/theme/components/text-input.scss +2 -2
@@ -2,6 +2,8 @@
2
2
  font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
3
3
  font-size: 0.875rem;
4
4
  line-height: 1;
5
+ --accent: rgb(0, 192, 255);
6
+ accent-color: var(--accent);
5
7
  --content-column-gap: 1.1428571429rem;
6
8
  --content-row-gap: 1.1428571429rem;
7
9
  --content-radius: 0.5714285714rem;
@@ -12,8 +14,9 @@
12
14
  --content-pad-inline-end: 1.4285714286rem;
13
15
  --control-column-gap: 0.5714285714rem;
14
16
  --control-row-gap: 0.5714285714rem;
15
- --control-radius: 0.2857142857rem;
16
- --control-border: 0.0714285714rem;
17
+ --control-radius: 0.3571428571rem;
18
+ --control-border: 0.1428571429rem;
19
+ --control-shadow: 0 0 0.2142857143rem rgba(0, 0, 0, .5);
17
20
  --control-disabled: opacity(.5);
18
21
  --control-pad-block-start: 0.5714285714rem;
19
22
  --control-pad-inline-start: 0.7142857143rem;
@@ -24,13 +27,14 @@
24
27
  --line-gap: 0.4285714286rem;
25
28
  --space-gap: 0.4285714286rem;
26
29
  --layout-transition: .15s ease;
30
+ --color-transition: .1s ease;
27
31
  }
28
32
 
29
33
  @media (prefers-color-scheme: dark) {
30
34
  :root {
31
- --bg: rgb(32, 32, 32);
35
+ --bg: rgb(36, 36, 36);
32
36
  --fg: white;
33
- --focus-outline: var(--control-border) dashed rgb(0, 127, 255);
37
+ --focus-outline: var(--control-border) dashed var(--accent);
34
38
  color-scheme: dark;
35
39
  }
36
40
  }
@@ -53,35 +57,39 @@ body {
53
57
  }
54
58
 
55
59
  ::selection {
56
- background-color: rgba(0, 100, 200, 0.7);
60
+ background-color: rgba(0, 150, 200, 0.6);
57
61
  }
58
62
 
59
63
  @media (prefers-color-scheme: dark) {
60
64
  :root {
61
- --button-default-bg: rgb(54, 54, 54);
62
- --button-default-bg-lit: rgb(72, 72, 72);
65
+ --button-default-bg: rgb(64, 64, 64);
66
+ --button-default-bg-hover: rgb(90, 90, 90);
63
67
  --button-default-fg: var(--fg);
64
- --button-default-border: rgb(80, 80, 80);
65
- --button-primary-bg: rgb(0, 100, 200);
66
- --button-primary-bg-lit: rgb(0, 128, 255);
67
- --button-primary-fg: white;
68
- --button-primary-border: rgb(0, 100, 200);
68
+ --button-primary-bg: rgb(0, 192, 255);
69
+ --button-primary-bg-hover: rgb(92, 214, 255);
70
+ --button-primary-fg: black;
71
+ --button-primary-focus: rgb(200, 241, 255);
69
72
  --button-success-bg: rgb(0, 200, 100);
70
- --button-success-bg-lit: rgb(0, 242, 121);
73
+ --button-success-bg-hover: rgb(0, 242, 121);
71
74
  --button-success-fg: black;
72
- --button-success-border: rgb(0, 200, 100);
73
- --button-warning-bg: rgb(255, 200, 0);
74
- --button-warning-bg-lit: rgb(255, 224, 122);
75
+ --button-success-focus: rgb(200, 255, 228);
76
+ --button-warning-bg: rgb(230, 180, 0);
77
+ --button-warning-bg-hover: rgb(255, 220, 105);
75
78
  --button-warning-fg: black;
76
- --button-warning-border: rgb(255, 200, 0);
79
+ --button-warning-focus: rgb(255, 243, 200);
77
80
  --button-danger-bg: rgb(255, 0, 64);
78
- --button-danger-bg-lit: rgb(255, 64, 96);
81
+ --button-danger-bg-hover: rgb(255, 70, 100);
79
82
  --button-danger-fg: black;
80
- --button-danger-border: rgb(255, 0, 64);
83
+ --button-danger-focus: rgb(255, 200, 214);
81
84
  --button-input-bg: rgb(16, 16, 16);
82
- --button-input-bg-lit: rgb(36, 36, 36);
85
+ --button-input-bg-hover: rgb(60, 60, 60);
86
+ --button-input-bg-active: rgb(80, 80, 80);
83
87
  --button-input-fg: white;
84
88
  --button-input-border: rgb(80, 80, 80);
89
+ --button-text-bg: transparent;
90
+ --button-text-bg-hover: rgb(80, 80, 80);
91
+ --button-text-bg-active: rgb(100, 100, 100);
92
+ --button-text-fg: var(--fg);
85
93
  color-scheme: dark;
86
94
  }
87
95
  }
@@ -95,6 +103,10 @@ body {
95
103
  padding-block: calc(var(--control-pad-block-start) - var(--control-border)) calc(var(--control-pad-block-end) - var(--control-border));
96
104
  padding-inline: calc(var(--control-pad-inline-start) - var(--control-border)) calc(var(--control-pad-inline-end) - var(--control-border));
97
105
  border-radius: var(--control-radius);
106
+ transition: var(--color-transition) background-color, var(--color-transition) border-color;
107
+ }
108
+ .button:not(.button_text) {
109
+ box-shadow: var(--control-shadow);
98
110
  }
99
111
  .button[disabled] {
100
112
  cursor: default;
@@ -104,55 +116,106 @@ body {
104
116
  .button_default {
105
117
  background-color: var(--button-default-bg);
106
118
  color: var(--button-default-fg);
107
- border: var(--control-border) solid var(--button-default-border, transparent);
119
+ border: var(--button-default-border, transparent) solid var(--control-border);
120
+ }
121
+ .button_default:hover:not(:active):not([disabled]) {
122
+ background-color: var(--button-default-bg-hover);
123
+ }
124
+ .button_default:focus-visible {
125
+ border-color: var(--button-default-focus, var(--accent));
108
126
  }
109
- .button_default:hover:not(:active):not([disabled]), .button_default:focus-visible:not([disabled]) {
110
- background-color: var(--button-default-bg-lit);
127
+ .button_default:active {
128
+ background-color: var(--button-default-bg-active, var(--button-default-bg));
111
129
  }
112
130
 
113
131
  .button_primary {
114
132
  background-color: var(--button-primary-bg);
115
133
  color: var(--button-primary-fg);
116
- border: var(--control-border) solid var(--button-primary-border, transparent);
134
+ border: var(--button-primary-border, transparent) solid var(--control-border);
135
+ }
136
+ .button_primary:hover:not(:active):not([disabled]) {
137
+ background-color: var(--button-primary-bg-hover);
138
+ }
139
+ .button_primary:focus-visible {
140
+ border-color: var(--button-primary-focus, var(--accent));
117
141
  }
118
- .button_primary:hover:not(:active):not([disabled]), .button_primary:focus-visible:not([disabled]) {
119
- background-color: var(--button-primary-bg-lit);
142
+ .button_primary:active {
143
+ background-color: var(--button-primary-bg-active, var(--button-primary-bg));
120
144
  }
121
145
 
122
146
  .button_success {
123
147
  background-color: var(--button-success-bg);
124
148
  color: var(--button-success-fg);
125
- border: var(--control-border) solid var(--button-success-border, transparent);
149
+ border: var(--button-success-border, transparent) solid var(--control-border);
126
150
  }
127
- .button_success:hover:not(:active):not([disabled]), .button_success:focus-visible:not([disabled]) {
128
- background-color: var(--button-success-bg-lit);
151
+ .button_success:hover:not(:active):not([disabled]) {
152
+ background-color: var(--button-success-bg-hover);
153
+ }
154
+ .button_success:focus-visible {
155
+ border-color: var(--button-success-focus, var(--accent));
156
+ }
157
+ .button_success:active {
158
+ background-color: var(--button-success-bg-active, var(--button-success-bg));
129
159
  }
130
160
 
131
161
  .button_warning {
132
162
  background-color: var(--button-warning-bg);
133
163
  color: var(--button-warning-fg);
134
- border: var(--control-border) solid var(--button-warning-border, transparent);
164
+ border: var(--button-warning-border, transparent) solid var(--control-border);
165
+ }
166
+ .button_warning:hover:not(:active):not([disabled]) {
167
+ background-color: var(--button-warning-bg-hover);
135
168
  }
136
- .button_warning:hover:not(:active):not([disabled]), .button_warning:focus-visible:not([disabled]) {
137
- background-color: var(--button-warning-bg-lit);
169
+ .button_warning:focus-visible {
170
+ border-color: var(--button-warning-focus, var(--accent));
171
+ }
172
+ .button_warning:active {
173
+ background-color: var(--button-warning-bg-active, var(--button-warning-bg));
138
174
  }
139
175
 
140
176
  .button_danger {
141
177
  background-color: var(--button-danger-bg);
142
178
  color: var(--button-danger-fg);
143
- border: var(--control-border) solid var(--button-danger-border, transparent);
179
+ border: var(--button-danger-border, transparent) solid var(--control-border);
180
+ }
181
+ .button_danger:hover:not(:active):not([disabled]) {
182
+ background-color: var(--button-danger-bg-hover);
144
183
  }
145
- .button_danger:hover:not(:active):not([disabled]), .button_danger:focus-visible:not([disabled]) {
146
- background-color: var(--button-danger-bg-lit);
184
+ .button_danger:focus-visible {
185
+ border-color: var(--button-danger-focus, var(--accent));
186
+ }
187
+ .button_danger:active {
188
+ background-color: var(--button-danger-bg-active, var(--button-danger-bg));
147
189
  }
148
190
 
149
191
  .button_input {
150
192
  background-color: var(--button-input-bg);
151
193
  color: var(--button-input-fg);
152
- border: var(--control-border) solid var(--button-input-border, transparent);
194
+ border: var(--button-input-border, transparent) solid var(--control-border);
195
+ }
196
+ .button_input:hover:not(:active):not([disabled]) {
197
+ background-color: var(--button-input-bg-hover);
198
+ }
199
+ .button_input:focus-visible {
200
+ border-color: var(--button-input-focus, var(--accent));
201
+ }
202
+ .button_input:active {
203
+ background-color: var(--button-input-bg-active, var(--button-input-bg));
204
+ }
205
+
206
+ .button_text {
207
+ background-color: var(--button-text-bg);
208
+ color: var(--button-text-fg);
209
+ border: var(--button-text-border, transparent) solid var(--control-border);
210
+ }
211
+ .button_text:hover:not(:active):not([disabled]) {
212
+ background-color: var(--button-text-bg-hover);
213
+ }
214
+ .button_text:focus-visible {
215
+ border-color: var(--button-text-focus, var(--accent));
153
216
  }
154
- .button_input:hover:not(:active):not([disabled]), .button_input:focus-visible:not([disabled]) {
155
- background-color: var(--button-input-bg-lit);
217
+ .button_text:active {
218
+ background-color: var(--button-text-bg-active, var(--button-text-bg));
156
219
  }
157
220
 
158
221
  .button_input {
@@ -269,7 +332,10 @@ body {
269
332
  .control_group {
270
333
  display: flex;
271
334
  flex-direction: row;
272
- flex-wrap: wrap;
335
+ box-shadow: var(--control-shadow);
336
+ }
337
+ .control_group * {
338
+ --control-shadow: none;
273
339
  }
274
340
  .control_group > :not(:first-child) {
275
341
  border-start-start-radius: 0;
@@ -421,7 +487,7 @@ h6.heading {
421
487
 
422
488
  @media (prefers-color-scheme: dark) {
423
489
  :root {
424
- --link-fg: rgb(64, 160, 255);
490
+ --link-fg: rgb(64, 208, 255);
425
491
  color-scheme: dark;
426
492
  }
427
493
  }
@@ -619,7 +685,7 @@ h6.heading {
619
685
  --text-input-bg: rgb(16, 16, 16);
620
686
  --text-input-fg: white;
621
687
  --text-input-border: rgb(80, 80, 80);
622
- --text-input-border-lit: rgb(0, 128, 255);
688
+ --text-input-border-lit: var(--accent);
623
689
  color-scheme: dark;
624
690
  }
625
691
  }
@@ -633,6 +699,7 @@ h6.heading {
633
699
  padding-inline: var(--control-pad-inline-start) var(--control-pad-inline-end);
634
700
  border: var(--control-border) solid var(--text-input-border);
635
701
  border-radius: var(--control-radius);
702
+ box-shadow: var(--control-shadow);
636
703
  background-color: var(--text-input-bg);
637
704
  color: var(--text-input-fg);
638
705
  }
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../src/theme/base.scss","../src/theme/common.scss","../src/theme/components/button.scss","../src/theme/components/checkbox.scss","../src/theme/components/collapse.scss","../src/theme/components/column.scss","../src/theme/components/control-group.scss","../src/theme/components/dialog.scss","../src/theme/components/dropdown.scss","../src/theme/components/flex-space.scss","../src/theme/components/heading.scss","../src/theme/components/label.scss","../src/theme/components/link.scss","../src/theme/components/page.scss","../src/theme/components/popover.scss","../src/theme/components/radio-buttons.scss","../src/theme/components/row.scss","../src/theme/components/scroll-view.scss","../src/theme/components/text-input.scss","../src/theme/components/text.scss","../src/theme/components/validation.scss","../src/theme/components/value.scss"],"names":[],"mappings":"AASA;EACC;EACA;EACA;EAEA;EACA;EACA;EACA;ECWA;EACA;EACA;EACA;EDXA;EACA;EACA;EACA;EACA;ECIA;EACA;EACA;EACA;EDJA;EAEA;EAEA;EACA;EAEA;;;ACrBC;EAFD;IANE;IAAA;IAAA;IAUA;;;ADkCH;EACC;EACA;EAEA;;AACA;EALD;IAME;;;;AAIF;EACC;EACA;EACA;EACA;;;AAGD;EACC;;;ACtDC;EAFD;IANE;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAUA;;;ACmEH;EACC;EACA;EACA;EACA;EAEA;EAEA;EDtDC,eACC;EAED,gBACC;ECqDF;;AAEA;EACC;EACA;;;AAKD;EACC;EACA;EACA;;AACA;EAEC;;;AANF;EACC;EACA;EACA;;AACA;EAEC;;;AANF;EACC;EACA;EACA;;AACA;EAEC;;;AANF;EACC;EACA;EACA;;AACA;EAEC;;;AANF;EACC;EACA;EACA;;AACA;EAEC;;;AANF;EACC;EACA;EACA;;AACA;EAEC;;;AAKH;EACC;;;ACjHD;EACC;EACA;EACA;;AAEA;EACC;;AAGD;EACC;;AAGD;EACC;EACA;;;AAIF;EACC;EACA;EACA;;;ACtBD;EACC;EACA;EACA;;;AAGD;EACC,YACC;;;AAIF;EACC;IAAO;;EACP;IAAM;;EACN;IAAM;;EACN;IAAK;;;AAGN;EACC;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;;AAEA;EACC,YACC;;AAIF;EACC;EACA;;;AAIF;EACC;EACA;EACA;EACA;;AAEA;EACC,YACC;;AAKF;EACC;EACA;EACA;;;AC5DF;EACC;EACA;;AAEA;EACC;;AAMD;EACC;;;AAQD;EACC;;AACA;EACC;;;AAHF;EACC;;AACA;EACC;;;ACvBH;EACC;EACA;EACA;;AACA;EACC;EACA;;AAED;EACC;EACA;;;ALEA;EAFD;IANE;IAAA;IAAA;IAAA;IAUA;;;AMEH;EACC;EACA;EAEA;EAEA;EACA;EACA;EAEA;;;AAGD;EACC;EACA;EAEA;EACA;EACA;EACA;ENDC,eACC;EAED,gBACC;;;AMCH;EACC;;;AN7BC;EAFD;IANE;IAAA;IAAA;IAAA;IAUA;;;AOEH;EACC;EACA;;AAEA;EACC;;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;;;AAGD;EACC;EPPC,eACC;EAED,gBACC;;AOMF;EACC;;;AC9CF;EACC;EACA;EACA;;;ACHD;EACC;EACA;;AAEA;EAEC;EACA;EACA;EACA;;;AAIF;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;AAAA;AAAA;EAGC;EACA;EACA;;;ATxBC;EAFD;IANE;IAUA;;;AUPH;EACC;EACA;EAEA;EACA;EACA;;AAEA;EAEC;EACA;EACA;EACA;;;AVRA;EAFD;IANE;IAUA;;;AWPH;EACC;EACA;EAEA;EACA;EACA;EACA;;AAEA;EACC;;AAGD;EACC;;;ACrBF;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;;;AZPC;EAFD;IANE;IAAA;IAAA;IAUA;;;AaDH;EACC;EACA;;;AAGD;EACC;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;EAEA;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EbnBC,eACC;EAED,gBACC;;;AcvCH;EACC;EACA;EACA;;AAEA;EACC;EACA;;;AAIF;EACC;EACA;EACA;;AAEA;EACC;;AAGD;EACC;;;AAIF;EACC;EACA;EACA;;;AC5BD;EACC;EACA;EACA;;;AAIA;EACC;EACA;;AACA;EACC;EACA;;;AALF;EACC;EACA;;AACA;EACC;EACA;;;AfAD;EAFD;IANE;IAAA;IAUA;;;AgBJH;EACC;EACA;EACA;;;AAGD;EACC;EACA;;;AAGD;EACC;EACA;EACA;EACA;;;AAGD;AAAA;EAEC;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AhBpCC;EAFD;IANE;IAAA;IAAA;IAAA;IAUA;;;AiBEH;EACC;EACA;EACA;EAEA;EAEA;EjBmBC,eACC;EAED,gBACC;EiBrBF;EACA;EAEA;EACA;;AAEA;EACC;;AAGD;EACC;EACA;;;AAIF;EACC;;;AC1CD;EACC;;AAEA;EAEC;EACA;EACA;EACA;;;AlBIA;EAFD;IANE;IAUA;;;AmBPH;EACC;;;AAGD;EACC;;;ACZD;EACC","file":"theme.module.css"}
1
+ {"version":3,"sourceRoot":"","sources":["../src/theme/base.scss","../src/theme/common.scss","../src/theme/components/button.scss","../src/theme/components/checkbox.scss","../src/theme/components/collapse.scss","../src/theme/components/column.scss","../src/theme/components/control-group.scss","../src/theme/components/dialog.scss","../src/theme/components/dropdown.scss","../src/theme/components/flex-space.scss","../src/theme/components/heading.scss","../src/theme/components/label.scss","../src/theme/components/link.scss","../src/theme/components/page.scss","../src/theme/components/popover.scss","../src/theme/components/radio-buttons.scss","../src/theme/components/row.scss","../src/theme/components/scroll-view.scss","../src/theme/components/text-input.scss","../src/theme/components/text.scss","../src/theme/components/validation.scss","../src/theme/components/value.scss"],"names":[],"mappings":"AASA;EACC;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;ECQA;EACA;EACA;EACA;EDRA;EACA;EACA;EACA;EACA;EACA;ECAA;EACA;EACA;EACA;EDAA;EAEA;EAEA;EACA;EAEA;EACA;;;AC1BC;EAFD;IANE;IAAA;IAAA;IAUA;;;ADuCH;EACC;EACA;EAEA;;AACA;EALD;IAME;;;;AAIF;EACC;EACA;EACA;EACA;;;AAGD;EACC;;;AC3DC;EAFD;IANE;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAUA;;;ACgFH;EACC;EACA;EACA;EACA;EAEA;EAEA;EDnEC,eACC;EAED,gBACC;ECkEF;EACA;;AAGA;EACC;;AAGD;EACC;EACA;;;AAKD;EACC;EACA;EACA;;AAEA;EACC;;AAGD;EACC;;AAGD;EACC;;;AAdF;EACC;EACA;EACA;;AAEA;EACC;;AAGD;EACC;;AAGD;EACC;;;AAdF;EACC;EACA;EACA;;AAEA;EACC;;AAGD;EACC;;AAGD;EACC;;;AAdF;EACC;EACA;EACA;;AAEA;EACC;;AAGD;EACC;;AAGD;EACC;;;AAdF;EACC;EACA;EACA;;AAEA;EACC;;AAGD;EACC;;AAGD;EACC;;;AAdF;EACC;EACA;EACA;;AAEA;EACC;;AAGD;EACC;;AAGD;EACC;;;AAdF;EACC;EACA;EACA;;AAEA;EACC;;AAGD;EACC;;AAGD;EACC;;;AAKH;EACC;;;AC5ID;EACC;EACA;EACA;;AAEA;EACC;;AAGD;EACC;;AAGD;EACC;EACA;;;AAIF;EACC;EACA;EACA;;;ACtBD;EACC;EACA;EACA;;;AAGD;EACC,YACC;;;AAIF;EACC;IAAO;;EACP;IAAM;;EACN;IAAM;;EACN;IAAK;;;AAGN;EACC;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;;AAEA;EACC,YACC;;AAIF;EACC;EACA;;;AAIF;EACC;EACA;EACA;EACA;;AAEA;EACC,YACC;;AAKF;EACC;EACA;EACA;;;AC5DF;EACC;EACA;;AAEA;EACC;;AAMD;EACC;;;AAQD;EACC;;AACA;EACC;;;AAHF;EACC;;AACA;EACC;;;ACvBH;EACC;EACA;EAEA;;AACA;EACC;;AAGD;EACC;EACA;;AAED;EACC;EACA;;;ALHA;EAFD;IANE;IAAA;IAAA;IAAA;IAUA;;;AMEH;EACC;EACA;EAEA;EAEA;EACA;EACA;EAEA;;;AAGD;EACC;EACA;EAEA;EACA;EACA;EACA;ENDC,eACC;EAED,gBACC;;;AMCH;EACC;;;AN7BC;EAFD;IANE;IAAA;IAAA;IAAA;IAUA;;;AOEH;EACC;EACA;;AAEA;EACC;;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;;;AAGD;EACC;EPPC,eACC;EAED,gBACC;;AOMF;EACC;;;AC9CF;EACC;EACA;EACA;;;ACHD;EACC;EACA;;AAEA;EAEC;EACA;EACA;EACA;;;AAIF;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;AAAA;AAAA;EAGC;EACA;EACA;;;ATxBC;EAFD;IANE;IAUA;;;AUPH;EACC;EACA;EAEA;EACA;EACA;;AAEA;EAEC;EACA;EACA;EACA;;;AVRA;EAFD;IANE;IAUA;;;AWPH;EACC;EACA;EAEA;EACA;EACA;EACA;;AAEA;EACC;;AAGD;EACC;;;ACrBF;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;;;AZPC;EAFD;IANE;IAAA;IAAA;IAUA;;;AaDH;EACC;EACA;;;AAGD;EACC;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;EAEA;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EbnBC,eACC;EAED,gBACC;;;AcvCH;EACC;EACA;EACA;;AAEA;EACC;EACA;;;AAIF;EACC;EACA;EACA;;AAEA;EACC;;AAGD;EACC;;;AAIF;EACC;EACA;EACA;;;AC5BD;EACC;EACA;EACA;;;AAIA;EACC;EACA;;AACA;EACC;EACA;;;AALF;EACC;EACA;;AACA;EACC;EACA;;;AfAD;EAFD;IANE;IAAA;IAUA;;;AgBJH;EACC;EACA;EACA;;;AAGD;EACC;EACA;;;AAGD;EACC;EACA;EACA;EACA;;;AAGD;AAAA;EAEC;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AhBpCC;EAFD;IANE;IAAA;IAAA;IAAA;IAUA;;;AiBEH;EACC;EACA;EACA;EAEA;EAEA;EjBmBC,eACC;EAED,gBACC;EiBrBF;EACA;EACA;EACA;EACA;;AAEA;EACC;;AAGD;EACC;EACA;;;AAIF;EACC;;;AC1CD;EACC;;AAEA;EAEC;EACA;EACA;EACA;;;AlBIA;EAFD;IANE;IAUA;;;AmBPH;EACC;;;AAGD;EACC;;;ACZD;EACC","file":"theme.module.css"}
package/package.json CHANGED
@@ -12,7 +12,7 @@
12
12
  "rvx"
13
13
  ],
14
14
  "license": "MIT",
15
- "version": "0.1.7",
15
+ "version": "0.1.8",
16
16
  "type": "module",
17
17
  "main": "./dist/index.js",
18
18
  "sideEffects": false,
@@ -28,6 +28,6 @@
28
28
  "./dist/": "./dist/"
29
29
  },
30
30
  "dependencies": {
31
- "rvx": "^16.0.2"
31
+ "rvx": "^18.0.1"
32
32
  }
33
33
  }
@@ -1,5 +1,3 @@
1
- import { extract } from "rvx";
2
-
3
1
  import { THEME, Theme } from "./theme.js";
4
2
 
5
3
  /**
@@ -8,7 +6,7 @@ import { THEME, Theme } from "./theme.js";
8
6
  * @throws An error if the current theme doesn't support the specified key.
9
7
  */
10
8
  export function themeClass(key: keyof Theme): string {
11
- const theme = extract(THEME);
9
+ const theme = THEME.current;
12
10
  if (!theme) {
13
11
  throw new Error("theme is not available in the current context");
14
12
  }
@@ -1,6 +1,6 @@
1
- import { ContextKey } from "rvx";
1
+ import { Context } from "rvx";
2
2
 
3
- export const THEME = Symbol.for("rvx-ui:theme") as ContextKey<Theme>;
3
+ export const THEME = new Context<Theme>();
4
4
 
5
5
  /**
6
6
  * A collection of class names that is used as the theme.
@@ -37,6 +37,8 @@ export interface Theme {
37
37
  button_warning?: string;
38
38
  /** Additional class for buttons with the "input" variant */
39
39
  button_input?: string;
40
+ /** Additional class for buttons with the "text" variant */
41
+ button_text?: string;
40
42
 
41
43
  /** Class for all checkbox containing labels */
42
44
  checkbox_label?: string;
@@ -1,12 +1,11 @@
1
- import { ClassValue, Expression, extract, get, optionalString, StyleValue } from "rvx";
1
+ import { ClassValue, Expression, get, optionalString, StyleValue } from "rvx";
2
2
  import { isPending } from "rvx/async";
3
-
4
3
  import { Action, handleActionEvent, keyFor } from "../common/events.js";
5
4
  import { THEME } from "../common/theme.js";
6
5
  import { Validator } from "./validation.js";
7
6
 
8
7
  export type ButtonType = "button" | "submit" | "reset" | "menu";
9
- export type ButtonVariant = "default" | "primary" | "success" | "danger" | "warning" | "input";
8
+ export type ButtonVariant = "default" | "primary" | "success" | "danger" | "warning" | "input" | "text";
10
9
 
11
10
  export function Button(props: {
12
11
  /**
@@ -50,7 +49,7 @@ export function Button(props: {
50
49
 
51
50
  children?: unknown;
52
51
  }): unknown {
53
- const theme = extract(THEME);
52
+ const theme = THEME.current;
54
53
  const disabled = () => isPending() || get(props.disabled);
55
54
 
56
55
  function action(event: Event) {
@@ -0,0 +1,34 @@
1
+ import { themeClass } from "../common/theme-test.js";
2
+
3
+ function assertCheckbox(checkbox: Element): asserts checkbox is HTMLElement {
4
+ if (!checkbox.matches(`.${themeClass("checkbox_label")}`)) {
5
+ throw new Error("checkbox must be a checkbox root element.");
6
+ }
7
+ }
8
+
9
+ function getInput(checkbox: HTMLElement): HTMLInputElement {
10
+ return checkbox.querySelector("input")!;
11
+ }
12
+
13
+ export function isCheckboxChecked(checkbox: Element): boolean | undefined {
14
+ assertCheckbox(checkbox);
15
+ const input = getInput(checkbox);
16
+ return input.indeterminate ? undefined : input.checked;
17
+ }
18
+
19
+ export function toggleCheckbox(checkbox: Element, checked?: boolean): void {
20
+ assertCheckbox(checkbox);
21
+ const input = getInput(checkbox);
22
+ if (input.disabled) {
23
+ return;
24
+ }
25
+ checked ??= !input.checked;
26
+ input.indeterminate = false;
27
+ input.checked = checked;
28
+ input.dispatchEvent(new CustomEvent("input"));
29
+ }
30
+
31
+ export function getCheckboxContent(checkbox: Element): HTMLElement {
32
+ assertCheckbox(checkbox);
33
+ return checkbox.querySelector(`.${themeClass("checkbox_content")}`) as HTMLElement;
34
+ }
@@ -1,5 +1,6 @@
1
- import { ClassValue, Expression, extract, get, optionalString, Signal, string, StyleValue, uniqueId, watch } from "rvx";
1
+ import { ClassValue, Expression, get, optionalString, Signal, string, StyleValue, watch } from "rvx";
2
2
  import { isPending } from "rvx/async";
3
+ import { uniqueId } from "rvx/id";
3
4
 
4
5
  import { THEME } from "../common/theme.js";
5
6
  import { Text } from "./text.js";
@@ -16,7 +17,7 @@ export function Checkbox(props: {
16
17
  children?: unknown;
17
18
  }): unknown {
18
19
  const id = uniqueId();
19
- const theme = extract(THEME);
20
+ const theme = THEME.current;
20
21
 
21
22
  const disabled = props.checked instanceof Signal
22
23
  ? () => isPending() || get(props.disabled)
@@ -41,11 +42,8 @@ export function Checkbox(props: {
41
42
  /> as HTMLInputElement;
42
43
 
43
44
  watch(props.checked, checked => {
44
- if (checked === undefined) {
45
- input.indeterminate = true;
46
- } else {
47
- input.checked = checked;
48
- }
45
+ input.indeterminate = checked === undefined;
46
+ input.checked = checked === true;
49
47
  });
50
48
 
51
49
  return <label
@@ -1,5 +1,5 @@
1
- import { ClassValue, Event, Expression, extract, get, map, optionalString, sig, StyleValue, teardown } from "rvx";
2
-
1
+ import { ClassValue, Expression, get, map, optionalString, sig, StyleValue, teardown } from "rvx";
2
+ import { Event } from "rvx/event";
3
3
  import { THEME } from "../common/theme.js";
4
4
  import { AriaLive, AriaRelevant } from "../common/types.js";
5
5
 
@@ -14,7 +14,7 @@ export function Collapse(props: {
14
14
  "aria-relevant"?: Expression<AriaRelevant | undefined>;
15
15
  "aria-atomic"?: Expression<boolean | undefined>;
16
16
  }): unknown {
17
- const theme = extract(THEME);
17
+ const theme = THEME.current;
18
18
  const visible = map(props.visible, v => v ?? false);
19
19
  const alert = sig(false);
20
20
  const size = sig<number | undefined>(undefined);
@@ -1,5 +1,4 @@
1
- import { ClassValue, Expression, extract, map, StyleValue } from "rvx";
2
-
1
+ import { ClassValue, Expression, map, StyleValue } from "rvx";
3
2
  import { THEME } from "../common/theme.js";
4
3
  import { SizeContext } from "../common/types.js";
5
4
 
@@ -13,7 +12,7 @@ export function Column(props: {
13
12
  id?: Expression<string | undefined>;
14
13
  children?: unknown;
15
14
  }): unknown {
16
- const theme = extract(THEME);
15
+ const theme = THEME.current;
17
16
  return <div
18
17
  class={[
19
18
  theme?.column,
@@ -1,5 +1,4 @@
1
- import { ClassValue, Expression, extract, StyleValue } from "rvx";
2
-
1
+ import { ClassValue, Expression, StyleValue } from "rvx";
3
2
  import { THEME } from "../common/theme.js";
4
3
 
5
4
  export function ControlGroup(props: {
@@ -8,7 +7,7 @@ export function ControlGroup(props: {
8
7
  id?: Expression<string | undefined>;
9
8
  children?: unknown;
10
9
  }): unknown {
11
- const theme = extract(THEME);
10
+ const theme = THEME.current;
12
11
  return <div
13
12
  class={[
14
13
  theme?.control_group,
@@ -1,6 +1,6 @@
1
- import { captureSelf, ClassValue, Expression, extract, map, mount, StyleValue, uniqueId } from "rvx";
1
+ import { captureSelf, ClassValue, Expression, map, mount, StyleValue } from "rvx";
2
2
  import { TASKS, Tasks } from "rvx/async";
3
-
3
+ import { uniqueId } from "rvx/id";
4
4
  import { FlexSpace, Heading, Row, Text, THEME } from "../index.js";
5
5
  import { LAYER, Layer } from "./layer.js";
6
6
 
@@ -23,24 +23,25 @@ export function showDialog<T = void>(init: DialogInit<T>, options?: DialogOption
23
23
  mount(
24
24
  document.body,
25
25
  <Layer modal>
26
- {ctx => {
27
- ctx.set(TASKS, new Tasks());
28
- const dialog: Dialog<T> = {
29
- resolve(value) {
30
- dispose();
31
- resolve(value);
32
- },
33
- reject(reason) {
34
- dispose();
35
- reject(reason);
36
- },
37
- };
38
- if (options?.cancellable ?? true) {
39
- extract(LAYER)?.useHotkey("escape", () => {
40
- dialog.reject(new DialogAbortError());
41
- });
42
- }
43
- return init(dialog);
26
+ {() => {
27
+ return TASKS.inject(new Tasks(), () => {
28
+ const dialog: Dialog<T> = {
29
+ resolve(value) {
30
+ dispose();
31
+ resolve(value);
32
+ },
33
+ reject(reason) {
34
+ dispose();
35
+ reject(reason);
36
+ },
37
+ };
38
+ if (options?.cancellable ?? true) {
39
+ LAYER.current!.useHotkey("escape", () => {
40
+ dialog.reject(new DialogAbortError());
41
+ });
42
+ }
43
+ return init(dialog);
44
+ });
44
45
  }}
45
46
  </Layer>
46
47
  );
@@ -66,7 +67,7 @@ export function DialogBody(props: {
66
67
  "aria-labelledby"?: Expression<string | undefined>;
67
68
  "aria-describedby"?: Expression<string | undefined>;
68
69
  }): unknown {
69
- const theme = extract(THEME);
70
+ const theme = THEME.current;
70
71
 
71
72
  let titleId: string | undefined;
72
73
  let descriptionId: string | undefined;
@@ -116,7 +117,7 @@ export function DialogFooter(props: {
116
117
  links?: unknown;
117
118
  children?: unknown;
118
119
  }): unknown {
119
- const theme = extract(THEME);
120
+ const theme = THEME.current;
120
121
  return <Row
121
122
  size="control"
122
123
  class={[
@@ -1,5 +1,4 @@
1
1
  import { ClassValue, Expression, get, map, Signal, StyleValue } from "rvx";
2
-
3
2
  import { Button, ButtonVariant } from "./button.js";
4
3
  import { Dropdown, DropdownItem } from "./dropdown.js";
5
4
  import { PopoutAlignment, PopoutPlacement } from "./popout.js";
@@ -1,5 +1,5 @@
1
- import { ClassValue, Expression, extract, For, get, map, memo, optionalString, render, sig, StyleValue, uniqueId, View, watch } from "rvx";
2
-
1
+ import { ClassValue, Expression, For, get, map, memo, optionalString, render, sig, StyleValue, View, watch } from "rvx";
2
+ import { uniqueId } from "rvx/id";
3
3
  import { Action, createPassiveActionEvent, handleActionEvent, keyFor, startDelayedHoverOnMouseenter } from "../common/events.js";
4
4
  import { THEME } from "../common/theme.js";
5
5
  import { LAYER } from "./layer.js";
@@ -89,8 +89,8 @@ export function createDropdown(props: {
89
89
  alignment: map(props.alignment, v => v ?? "start"),
90
90
  foreignEvents: props.foreignEvents,
91
91
  content: ({ popout, placement }) => {
92
- const theme = extract(THEME);
93
- const layer = extract(LAYER)!;
92
+ const theme = THEME.current;
93
+ const layer = LAYER.current!;
94
94
 
95
95
  const activeItem = sig<DropdownItem | undefined>(undefined);
96
96
  const instances = new WeakMap<DropdownItem, {
@@ -1,11 +1,10 @@
1
- import { Expression, extract, get } from "rvx";
2
-
1
+ import { Expression, get } from "rvx";
3
2
  import { THEME } from "../common/theme.js";
4
3
 
5
4
  export function FlexSpace(props: {
6
5
  grow?: Expression<number | undefined>;
7
6
  }): unknown {
8
- const theme = extract(THEME);
7
+ const theme = THEME.current;
9
8
  return <div
10
9
  class={theme?.flex_space}
11
10
  style={{
@@ -1,5 +1,4 @@
1
- import { ClassValue, createElement, Expression, extract, StyleValue } from "rvx";
2
-
1
+ import { ClassValue, createElement, Expression, StyleValue } from "rvx";
3
2
  import { THEME } from "../common/theme.js";
4
3
 
5
4
  export type HeadingLevel = "1" | "2" | "3" | "4" | "5" | "6";
@@ -11,7 +10,7 @@ export function Heading(props: {
11
10
  id?: Expression<string | undefined>;
12
11
  children?: unknown;
13
12
  }): unknown {
14
- const theme = extract(THEME);
13
+ const theme = THEME.current;
15
14
  return createElement(`h${props.level}`, {
16
15
  class: [
17
16
  theme?.heading,
@@ -21,3 +20,11 @@ export function Heading(props: {
21
20
  id: props.id,
22
21
  }, props.children);
23
22
  }
23
+
24
+ /**
25
+ * Get the next nested heading level.
26
+ */
27
+ export function getNestedHeadingLevel(level: HeadingLevel): HeadingLevel {
28
+ const l = Number(level) + 1;
29
+ return l > 6 ? "6" : String(l) as HeadingLevel;
30
+ }
@@ -1,6 +1,7 @@
1
- import { ClassValue, Expression, extract, StyleValue, uniqueId } from "rvx";
1
+ import { ClassValue, Expression, StyleValue } from "rvx";
2
2
 
3
3
  import { THEME } from "../common/theme.js";
4
+ import { uniqueId } from "rvx/id";
4
5
 
5
6
  export function Label(props: {
6
7
  class?: ClassValue;
@@ -9,7 +10,7 @@ export function Label(props: {
9
10
  id?: Expression<string | undefined>;
10
11
  children?: unknown;
11
12
  }): unknown {
12
- const theme = extract(THEME);
13
+ const theme = THEME.current;
13
14
  return <label
14
15
  class={[
15
16
  theme?.label,