@geoffcox/sterling-svelte 0.0.9 → 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,169 +1,127 @@
1
- <script>export let value = "";
1
+ <script>import { v4 as uuid } from "uuid";
2
+ import Label from "../display/Label.svelte";
3
+ export let value = "";
2
4
  export let disabled = false;
5
+ const inputId = uuid();
3
6
  </script>
4
7
 
5
8
  <!--
6
9
  @component
7
10
  A styled HTML input element with optional label.
8
11
  -->
9
- <!-- svelte-ignore a11y-label-has-associated-control -->
10
- {#if $$slots.label}
11
- <label class="sterling-input-label">
12
- <div class="label-content" class:disabled>
13
- <slot name="label" />
14
- </div>
15
- <input
16
- class="sterling-input labeled"
17
- bind:value
18
- on:blur
19
- on:click
20
- on:change
21
- on:copy
22
- on:cut
23
- on:paste
24
- on:dblclick
25
- on:focus
26
- on:focusin
27
- on:focusout
28
- on:input
29
- on:invalid
30
- on:keydown
31
- on:keypress
32
- on:keyup
33
- on:mousedown
34
- on:mouseenter
35
- on:mouseleave
36
- on:mousemove
37
- on:mouseover
38
- on:mouseout
39
- on:mouseup
40
- on:select
41
- on:submit
42
- on:reset
43
- on:wheel
44
- {...$$restProps}
45
- {disabled}
46
- />
47
- </label>
48
- {:else}
49
- <input
50
- class="sterling-input"
51
- bind:value
52
- on:blur
53
- on:click
54
- on:change
55
- on:copy
56
- on:cut
57
- on:paste
58
- on:dblclick
59
- on:focus
60
- on:focusin
61
- on:focusout
62
- on:input
63
- on:invalid
64
- on:keydown
65
- on:keypress
66
- on:keyup
67
- on:mousedown
68
- on:mouseenter
69
- on:mouseleave
70
- on:mousemove
71
- on:mouseover
72
- on:mouseout
73
- on:mouseup
74
- on:select
75
- on:submit
76
- on:reset
77
- on:wheel
78
- {...$$restProps}
79
- {disabled}
80
- />
81
- {/if}
12
+ <div class="sterling-input">
13
+ {#if $$slots.label}
14
+ <div class="label">
15
+ <Label {disabled} for={inputId}>
16
+ <slot name="label" />
17
+ </Label>
18
+ </div>
19
+ {/if}
20
+ <input
21
+ bind:value
22
+ on:blur
23
+ on:click
24
+ on:change
25
+ on:copy
26
+ on:cut
27
+ on:paste
28
+ on:dblclick
29
+ on:focus
30
+ on:focusin
31
+ on:focusout
32
+ on:input
33
+ on:invalid
34
+ on:keydown
35
+ on:keypress
36
+ on:keyup
37
+ on:mousedown
38
+ on:mouseenter
39
+ on:mouseleave
40
+ on:mousemove
41
+ on:mouseover
42
+ on:mouseout
43
+ on:mouseup
44
+ on:select
45
+ on:submit
46
+ on:reset
47
+ on:wheel
48
+ {...$$restProps}
49
+ {disabled}
50
+ id={inputId}
51
+ />
52
+ </div>
82
53
 
83
54
  <style>
84
- .sterling-input-label {
85
- display: flex;
86
- flex-direction: column;
87
- }
55
+ .sterling-input {
56
+ display: flex;
57
+ flex-direction: column;
58
+ background-color: var(--Input__background-color);
59
+ border-color: var(--Input__border-color);
60
+ border-radius: var(--Input__border-radius);
61
+ border-style: var(--Input__border-style);
62
+ border-width: var(--Input__border-width);
63
+ color: var(--Input__color);
64
+ font: inherit;
65
+ margin: 0;
66
+ transition: background-color 250ms, color 250ms, border-color 250ms;
67
+ }
88
68
 
89
- .label-content {
90
- font-size: 0.7em;
91
- margin: 0.5em 0 0 0.7em;
92
- color: var(--Display__color--subtle);
93
- transition: background-color 250ms, color 250ms, border-color 250ms;
94
- }
69
+ .sterling-input:hover {
70
+ background-color: var(--Input__background-color--hover);
71
+ border-color: var(--Input__border-color--hover);
72
+ color: var(--Input__color--hover);
73
+ }
95
74
 
96
- .label-content.disabled {
97
- color: var(--Display__color--disabled);
98
- }
75
+ .sterling-input:focus-within {
76
+ background-color: var(--Input__background-color--focus);
77
+ border-color: var(--Input__border-color--focus);
78
+ color: var(--Input__color--focus);
79
+ outline-color: var(--Common__outline-color);
80
+ outline-offset: var(--Common__outline-offset);
81
+ outline-style: var(--Common__outline-style);
82
+ outline-width: var(--Common__outline-width);
83
+ }
99
84
 
100
- .sterling-input-label,
101
- .sterling-input {
102
- background-color: var(--Input__background-color);
103
- border-color: var(--Input__border-color);
104
- border-radius: var(--Input__border-radius);
105
- border-style: var(--Input__border-style);
106
- border-width: var(--Input__border-width);
107
- color: var(--Input__color);
108
- font: inherit;
109
- margin: 0;
110
- transition: background-color 250ms, color 250ms, border-color 250ms;
111
- }
85
+ .sterling-input:disabled {
86
+ background-color: var(--Input__background-color--disabled);
87
+ border-color: var(---Input__border-color--disabled);
88
+ color: var(--Input__color--disabled);
89
+ cursor: not-allowed;
90
+ }
112
91
 
113
- .sterling-input-label:hover,
114
- .sterling-input:hover {
115
- background-color: var(--Input__background-color--hover);
116
- border-color: var(--Input__border-color--hover);
117
- color: var(--Input__color--hover);
118
- }
92
+ .sterling-input input {
93
+ font: inherit;
94
+ color: inherit;
95
+ padding: 0.5em 0.5em;
96
+ }
119
97
 
120
- .sterling-input-label:focus-within,
121
- .sterling-input:focus-within {
122
- background-color: var(--Input__background-color--focus);
123
- border-color: var(--Input__border-color--focus);
124
- color: var(--Input__color--focus);
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
- }
98
+ .sterling-input input,
99
+ .sterling-input input:hover,
100
+ .sterling-input input:focus-within,
101
+ .sterling-input input:disabled {
102
+ background-color: transparent;
103
+ border: none;
104
+ outline: none;
105
+ }
130
106
 
131
- .sterling-input-label:disabled,
132
- .sterling-input:disabled {
133
- background-color: var(--Input__background-color--disabled);
134
- border-color: var(---Input__border-color--disabled);
135
- color: var(--Input__color--disabled);
136
- cursor: not-allowed;
137
- }
107
+ .sterling-input input::placeholder {
108
+ color: var(--Display__color--faint);
109
+ transition: background-color 250ms, color 250ms, border-color 250ms;
110
+ }
138
111
 
139
- .sterling-input {
140
- padding: 0.5em 0.5em;
141
- }
112
+ .sterling-input input:disabled::placeholder {
113
+ color: var(--Display__color--disabled);
114
+ }
142
115
 
143
- .sterling-input.labeled,
144
- .sterling-input.labeled:hover,
145
- .sterling-input.labeled:focus-within,
146
- .sterling-input.labeled:disabled {
147
- background-color: transparent;
148
- border: none;
149
- outline: none;
150
- }
116
+ .label {
117
+ font-size: 0.7em;
118
+ margin: 0.5em 0 0 0.7em;
119
+ }
151
120
 
152
- .sterling-input::placeholder {
153
- color: var(--Display__color--faint);
154
- transition: background-color 250ms, color 250ms, border-color 250ms;
155
- }
156
-
157
- .sterling-input:disabled::placeholder {
158
- color: var(--Display__color--disabled);
159
- }
160
-
161
- @media (prefers-reduced-motion) {
162
- .sterling-input-label,
163
- .sterling-input,
164
- .label-content,
165
- .sterling-input::placeholder {
166
- transition: none;
167
- }
168
- }
121
+ @media (prefers-reduced-motion) {
122
+ .sterling-input,
123
+ .sterling-input input::placeholder {
124
+ transition: none;
125
+ }
126
+ }
169
127
  </style>
@@ -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,148 +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
- }
118
-
119
- input:checked + .indicator {
120
- background-color: var(--Input__background-color);
121
- border-color: var(--Input__border-color);
122
- }
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
+ }
123
131
 
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
- }
132
+ input:checked + .indicator {
133
+ background-color: var(--Input__background-color);
134
+ border-color: var(--Input__border-color);
135
+ }
130
136
 
131
- input:disabled + .indicator {
132
- background-color: var(--Input__background-color--disabled);
133
- border-color: var(--Input__border-color--disabled);
134
- }
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
+ }
135
143
 
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
- }
144
+ input:disabled + .indicator {
145
+ background-color: var(--Input__background-color--disabled);
146
+ border-color: var(--Input__border-color--disabled);
147
+ }
148
148
 
149
- input:checked + .indicator::after {
150
- background-color: var(--Input__color);
151
- }
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
+ }
152
161
 
153
- input:checked:disabled + .indicator::after {
154
- background-color: var(--Input__color--disabled);
155
- }
162
+ input:checked + .indicator::after {
163
+ background-color: var(--Input__color);
164
+ }
156
165
 
157
- .label-content {
158
- color: var(--Input__color);
159
- transition: background-color 250ms, color 250ms, border-color 250ms;
160
- }
166
+ input:checked:disabled + .indicator::after {
167
+ background-color: var(--Input__color--disabled);
168
+ }
161
169
 
162
- .label-content.disabled {
163
- color: var(--Input__color--disabled);
164
- }
170
+ .label {
171
+ user-select: none;
172
+ margin-top: 0.25em;
173
+ }
165
174
 
166
- @media (prefers-reduced-motion) {
167
- .indicator,
168
- .indicator::after,
169
- .label-content {
170
- transition: none;
171
- }
172
- }
175
+ @media (prefers-reduced-motion) {
176
+ .indicator,
177
+ .indicator::after {
178
+ transition: none;
179
+ }
180
+ }
173
181
  </style>