@geoffcox/sterling-svelte 0.0.8 → 0.0.10

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.
@@ -1,7 +1,10 @@
1
1
  <script>import { onMount } from "svelte";
2
+ import { v4 as uuid } from "uuid";
3
+ import Label from "../display/Label.svelte";
2
4
  export let checked = false;
3
5
  export let group = void 0;
4
6
  export let disabled = false;
7
+ const inputId = uuid();
5
8
  const onChange = (e) => {
6
9
  if (e.currentTarget.checked) {
7
10
  group = $$restProps.value;
@@ -26,140 +29,153 @@ $: {
26
29
  A styled HTML input type=radio element with optional label.
27
30
  -->
28
31
  <!-- svelte-ignore a11y-label-has-associated-control -->
29
- <label class="sterling-radio">
30
- <div class="container">
31
- <input
32
- type="radio"
33
- on:blur
34
- on:click
35
- on:change
36
- on:change={onChange}
37
- on:dblclick
38
- on:focus
39
- on:focusin
40
- on:focusout
41
- on:keydown
42
- on:keypress
43
- on:keyup
44
- on:input
45
- on:mousedown
46
- on:mouseenter
47
- on:mouseleave
48
- on:mousemove
49
- on:mouseover
50
- on:mouseout
51
- on:mouseup
52
- on:toggle
53
- on:wheel
54
- checked={group === $$restProps.value}
55
- {...$$restProps}
56
- {disabled}
57
- />
58
- <div class="indicator" />
59
- </div>
60
- <div class="label-content" class:disabled>
61
- <slot name="label" />
62
- </div>
63
- </label>
32
+ <div class="sterling-radio">
33
+ <div class="container">
34
+ <input
35
+ type="radio"
36
+ on:blur
37
+ on:click
38
+ on:change
39
+ on:change={onChange}
40
+ on:dblclick
41
+ on:focus
42
+ on:focusin
43
+ on:focusout
44
+ on:keydown
45
+ on:keypress
46
+ on:keyup
47
+ on:input
48
+ on:mousedown
49
+ on:mouseenter
50
+ on:mouseleave
51
+ on:mousemove
52
+ on:mouseover
53
+ on:mouseout
54
+ on:mouseup
55
+ on:toggle
56
+ on:wheel
57
+ checked={group === $$restProps.value}
58
+ {...$$restProps}
59
+ {disabled}
60
+ id={inputId}
61
+ />
62
+ <div class="indicator" />
63
+ </div>
64
+ {#if $$slots.label}
65
+ <div class="label">
66
+ <Label {disabled} for={inputId}>
67
+ <slot name="label" />
68
+ </Label>
69
+ </div>
70
+ {/if}
71
+ </div>
64
72
 
65
73
  <style>
66
- label {
67
- display: inline-flex;
68
- align-items: center;
69
- gap: 0.4em;
70
- outline: none;
71
- padding: 0;
72
- margin: 0;
73
- }
74
-
75
- /*
74
+ .sterling-radio {
75
+ display: inline-flex;
76
+ align-content: stretch;
77
+ align-items: stretch;
78
+ box-sizing: border-box;
79
+ font: inherit;
80
+ gap: 0.4em;
81
+ outline: none;
82
+ padding: 0;
83
+ margin: 0;
84
+ }
85
+ /*
76
86
  The container
77
87
  - allows the input to be hidden
78
88
  - avoids input participating in layout
79
89
  - prevents collisions with surrounding slots
80
90
  */
81
- .container {
82
- box-sizing: border-box;
83
- position: relative;
84
- font: inherit;
85
- display: flex;
86
- align-items: center;
87
- }
91
+ .container {
92
+ box-sizing: border-box;
93
+ position: relative;
94
+ font: inherit;
95
+ display: flex;
96
+ align-items: center;
97
+ }
88
98
 
89
- /*
99
+ /*
90
100
  The input is hidden since the built-in browser radio cannot be customized
91
101
  */
92
- input {
93
- font: inherit;
94
- margin: 0;
95
- padding: 0;
96
- position: absolute;
97
- opacity: 0;
98
- }
102
+ input {
103
+ font: inherit;
104
+ margin: 0;
105
+ padding: 0;
106
+ position: absolute;
107
+ opacity: 0;
108
+ height: 21px;
109
+ width: 21px;
110
+ }
99
111
 
100
- /*
112
+ /*
101
113
  The indicator handles both the radio box and circle mark.
102
114
  The box cannot be on the container since the adjacent sibling selector is needed
103
115
  and there is not a parent CSS selector.
104
116
  */
105
- .indicator {
106
- background-color: var(--Input__background-color);
107
- border-color: var(--Input__border-color);
108
- border-style: var(--Input__border-style);
109
- border-width: var(--Input__border-width);
110
- border-radius: 10000px;
111
- box-sizing: border-box;
112
- display: inline-block;
113
- height: 21px;
114
- position: relative;
115
- transition: background-color 250ms, color 250ms, border-color 250ms;
116
- width: 21px;
117
- }
117
+ .indicator {
118
+ background-color: var(--Input__background-color);
119
+ border-color: var(--Input__border-color);
120
+ border-style: var(--Input__border-style);
121
+ border-width: var(--Input__border-width);
122
+ border-radius: 10000px;
123
+ box-sizing: border-box;
124
+ display: inline-block;
125
+ height: 21px;
126
+ position: relative;
127
+ pointer-events: none;
128
+ transition: background-color 250ms, color 250ms, border-color 250ms;
129
+ width: 21px;
130
+ }
118
131
 
119
- input:checked + .indicator {
120
- background-color: var(--Input__background-color);
121
- border-color: var(--Input__border-color);
122
- }
132
+ input:checked + .indicator {
133
+ background-color: var(--Input__background-color);
134
+ border-color: var(--Input__border-color);
135
+ }
123
136
 
124
- input:focus-visible + .indicator {
125
- outline-color: var(--Common__outline-color);
126
- outline-offset: var(--Common__outline-offset);
127
- outline-style: var(--Common__outline-style);
128
- outline-width: var(--Common__outline-width);
129
- }
137
+ input:focus-visible + .indicator {
138
+ outline-color: var(--Common__outline-color);
139
+ outline-offset: var(--Common__outline-offset);
140
+ outline-style: var(--Common__outline-style);
141
+ outline-width: var(--Common__outline-width);
142
+ }
130
143
 
131
- input:disabled + .indicator {
132
- background-color: var(--Input__background-color--disabled);
133
- border-color: var(--Input__border-color--disabled);
134
- }
144
+ input:disabled + .indicator {
145
+ background-color: var(--Input__background-color--disabled);
146
+ border-color: var(--Input__border-color--disabled);
147
+ }
135
148
 
136
- .indicator::after {
137
- background-color: transparent;
138
- border-radius: 10000px;
139
- content: '';
140
- height: 9px;
141
- left: 50%;
142
- position: absolute;
143
- top: 50%;
144
- transform: translate(-50%, -50%);
145
- transition: background-color 250ms;
146
- width: 9px;
147
- }
149
+ .indicator::after {
150
+ background-color: transparent;
151
+ border-radius: 10000px;
152
+ content: '';
153
+ height: 9px;
154
+ left: 50%;
155
+ position: absolute;
156
+ top: 50%;
157
+ transform: translate(-50%, -50%);
158
+ transition: background-color 250ms;
159
+ width: 9px;
160
+ }
148
161
 
149
- input:checked + .indicator::after {
150
- background-color: var(--Input__color);
151
- }
162
+ input:checked + .indicator::after {
163
+ background-color: var(--Input__color);
164
+ }
152
165
 
153
- input:checked:disabled + .indicator::after {
154
- background-color: var(--Input__color--disabled);
155
- }
166
+ input:checked:disabled + .indicator::after {
167
+ background-color: var(--Input__color--disabled);
168
+ }
156
169
 
157
- .label-content {
158
- color: var(--Input__color);
159
- transition: background-color 250ms, color 250ms, border-color 250ms;
160
- }
170
+ .label {
171
+ user-select: none;
172
+ margin-top: 0.25em;
173
+ }
161
174
 
162
- .label-content.disabled {
163
- color: var(--Input__color--disabled);
164
- }
175
+ @media (prefers-reduced-motion) {
176
+ .indicator,
177
+ .indicator::after {
178
+ transition: none;
179
+ }
180
+ }
165
181
  </style>