lutra 0.0.19 → 0.0.33

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 (192) hide show
  1. package/dist/color.css +0 -0
  2. package/dist/display/Avatar.svelte +1 -1
  3. package/dist/display/Avatar.svelte.d.ts +18 -22
  4. package/dist/display/Badge.svelte +2 -4
  5. package/dist/display/Badge.svelte.d.ts +28 -32
  6. package/dist/display/Callout.svelte +8 -8
  7. package/dist/display/Callout.svelte.d.ts +27 -35
  8. package/dist/display/Close.svelte.d.ts +17 -20
  9. package/dist/display/Code.svelte +26 -31
  10. package/dist/display/Code.svelte.d.ts +31 -30
  11. package/dist/display/ContextTip.svelte +2 -5
  12. package/dist/display/ContextTip.svelte.d.ts +16 -20
  13. package/dist/display/DataList.svelte +16 -0
  14. package/dist/display/DataList.svelte.d.ts +21 -0
  15. package/dist/display/Details.svelte.d.ts +25 -30
  16. package/dist/display/Hero.svelte.d.ts +24 -28
  17. package/dist/display/Icon.svelte +3 -4
  18. package/dist/display/Icon.svelte.d.ts +18 -23
  19. package/dist/display/IconButton.svelte +12 -5
  20. package/dist/display/IconButton.svelte.d.ts +26 -29
  21. package/dist/display/Image.svelte.d.ts +25 -36
  22. package/dist/display/Indicator.svelte.d.ts +21 -22
  23. package/dist/display/Inset.svelte.d.ts +16 -20
  24. package/dist/display/LineChart.svelte +385 -0
  25. package/dist/display/LineChart.svelte.d.ts +24 -0
  26. package/dist/display/LoadingIndicator.svelte +33 -0
  27. package/dist/display/LoadingIndicator.svelte.d.ts +15 -0
  28. package/dist/display/Modal.svelte +116 -0
  29. package/dist/display/Modal.svelte.d.ts +27 -0
  30. package/dist/display/Notification.svelte.d.ts +22 -41
  31. package/dist/display/Panel.svelte +23 -0
  32. package/dist/display/Panel.svelte.d.ts +19 -0
  33. package/dist/display/Popup.svelte.d.ts +23 -28
  34. package/dist/{data → display}/Stat.svelte +9 -17
  35. package/dist/display/Stat.svelte.d.ts +30 -0
  36. package/dist/display/Table.svelte +14 -10
  37. package/dist/display/Table.svelte.d.ts +22 -32
  38. package/dist/display/TablePaginator.svelte +51 -0
  39. package/dist/display/TablePaginator.svelte.d.ts +21 -0
  40. package/dist/display/Tag.svelte.d.ts +29 -32
  41. package/dist/display/Tooltip.svelte +5 -4
  42. package/dist/display/Tooltip.svelte.d.ts +21 -26
  43. package/dist/display/chart.d.ts +78 -0
  44. package/dist/display/chart.js +212 -0
  45. package/dist/display/index.d.ts +11 -1
  46. package/dist/display/index.js +11 -1
  47. package/dist/display/notifications.svelte.d.ts +3 -3
  48. package/dist/display/notifications.svelte.js +2 -2
  49. package/dist/form/Button.svelte +7 -2
  50. package/dist/form/Button.svelte.d.ts +25 -35
  51. package/dist/form/FieldActions.svelte +25 -3
  52. package/dist/form/FieldActions.svelte.d.ts +18 -22
  53. package/dist/form/FieldContainer.svelte +1 -1
  54. package/dist/form/FieldContainer.svelte.d.ts +17 -22
  55. package/dist/form/FieldContent.svelte +52 -33
  56. package/dist/form/FieldContent.svelte.d.ts +28 -56
  57. package/dist/form/FieldError.svelte.d.ts +17 -20
  58. package/dist/form/FieldSection.svelte.d.ts +18 -32
  59. package/dist/form/Fieldset.svelte.d.ts +29 -40
  60. package/dist/form/Form.svelte +55 -16
  61. package/dist/form/Form.svelte.d.ts +36 -31
  62. package/dist/form/ImageUpload.svelte +259 -0
  63. package/dist/form/ImageUpload.svelte.d.ts +31 -0
  64. package/dist/form/Input.svelte +192 -153
  65. package/dist/form/Input.svelte.d.ts +115 -140
  66. package/dist/form/InputLength.svelte.d.ts +19 -20
  67. package/dist/form/Label.svelte +21 -4
  68. package/dist/form/Label.svelte.d.ts +24 -30
  69. package/dist/form/LogoUpload.svelte +100 -0
  70. package/dist/form/LogoUpload.svelte.d.ts +29 -0
  71. package/dist/form/Select.svelte +84 -36
  72. package/dist/form/Select.svelte.d.ts +69 -96
  73. package/dist/form/Textarea.svelte +163 -0
  74. package/dist/form/Textarea.svelte.d.ts +108 -0
  75. package/dist/form/Toggle.svelte +2 -0
  76. package/dist/form/Toggle.svelte.d.ts +15 -0
  77. package/dist/form/client.svelte.d.ts +8 -9
  78. package/dist/form/client.svelte.js +18 -10
  79. package/dist/form/form.d.ts +6 -4
  80. package/dist/form/form.js +23 -9
  81. package/dist/form/index.d.ts +6 -3
  82. package/dist/form/index.js +6 -3
  83. package/dist/form/types.d.ts +11 -1
  84. package/dist/icons/IconAlert.svelte.d.ts +23 -0
  85. package/dist/icons/{Copy.svelte → IconCopy.svelte} +1 -1
  86. package/dist/icons/IconCopy.svelte.d.ts +23 -0
  87. package/dist/icons/IconDone.svelte.d.ts +23 -0
  88. package/dist/icons/IconError.svelte.d.ts +23 -0
  89. package/dist/icons/IconHelp.svelte.d.ts +23 -0
  90. package/dist/icons/IconHide.svelte.d.ts +23 -0
  91. package/dist/icons/IconInfo.svelte.d.ts +23 -0
  92. package/dist/icons/IconLink.svelte.d.ts +23 -0
  93. package/dist/icons/IconMenuBurger.svelte.d.ts +23 -0
  94. package/dist/icons/IconMenuDots.svelte.d.ts +23 -0
  95. package/dist/icons/IconSearch.svelte +3 -0
  96. package/dist/icons/IconSearch.svelte.d.ts +23 -0
  97. package/dist/icons/IconShow.svelte.d.ts +23 -0
  98. package/dist/icons/IconSuccess.svelte.d.ts +23 -0
  99. package/dist/icons/IconWarning.svelte.d.ts +23 -0
  100. package/dist/icons/index.d.ts +14 -11
  101. package/dist/icons/index.js +14 -11
  102. package/dist/layout/Layout.svelte +7 -5
  103. package/dist/layout/Layout.svelte.d.ts +19 -22
  104. package/dist/layout/LayoutFooter.svelte.d.ts +17 -18
  105. package/dist/layout/LayoutGrid.svelte.d.ts +25 -36
  106. package/dist/layout/LayoutHeader.svelte +3 -0
  107. package/dist/layout/LayoutHeader.svelte.d.ts +33 -38
  108. package/dist/layout/LayoutSideMenu.svelte +18 -17
  109. package/dist/layout/LayoutSideMenu.svelte.d.ts +18 -22
  110. package/dist/layout/Overlay.svelte.d.ts +22 -32
  111. package/dist/layout/OverlayContainer.svelte.d.ts +14 -15
  112. package/dist/layout/OverlayLayer.svelte +6 -11
  113. package/dist/layout/OverlayLayer.svelte.d.ts +17 -20
  114. package/dist/layout/PageContent.svelte +9 -24
  115. package/dist/layout/PageContent.svelte.d.ts +23 -26
  116. package/dist/layout/Theme.svelte +19 -4
  117. package/dist/layout/Theme.svelte.d.ts +17 -22
  118. package/dist/layout/UIContent.svelte.d.ts +16 -20
  119. package/dist/layout/index.d.ts +5 -1
  120. package/dist/layout/index.js +5 -1
  121. package/dist/layout/overlays.svelte.d.ts +2 -2
  122. package/dist/nav/Breadcrumb.svelte +1 -1
  123. package/dist/nav/Breadcrumb.svelte.d.ts +26 -31
  124. package/dist/nav/Menu.svelte +6 -13
  125. package/dist/nav/Menu.svelte.d.ts +25 -31
  126. package/dist/nav/MenuItem.svelte +15 -8
  127. package/dist/nav/MenuItem.svelte.d.ts +20 -24
  128. package/dist/nav/MenuTypes.d.ts +7 -7
  129. package/dist/nav/NavMenu.svelte +7 -9
  130. package/dist/nav/NavMenu.svelte.d.ts +17 -18
  131. package/dist/nav/TabbedContent.svelte +1 -1
  132. package/dist/nav/TabbedContent.svelte.d.ts +21 -22
  133. package/dist/nav/Tabs.svelte +53 -13
  134. package/dist/nav/Tabs.svelte.d.ts +24 -25
  135. package/dist/nav/index.d.ts +2 -1
  136. package/dist/nav/index.js +2 -1
  137. package/dist/style.css +176 -79
  138. package/dist/typo/Clamp.svelte.d.ts +22 -26
  139. package/dist/typo/H.svelte.d.ts +26 -30
  140. package/dist/typo/H1.svelte.d.ts +24 -28
  141. package/dist/typo/H2.svelte.d.ts +24 -28
  142. package/dist/typo/H3.svelte.d.ts +24 -28
  143. package/dist/typo/H4.svelte.d.ts +24 -28
  144. package/dist/typo/H5.svelte.d.ts +24 -28
  145. package/dist/typo/H6.svelte.d.ts +24 -28
  146. package/dist/typo/P.svelte.d.ts +24 -28
  147. package/dist/utils/StringOrComponent.svelte +14 -0
  148. package/dist/utils/StringOrComponent.svelte.d.ts +19 -0
  149. package/dist/utils/StringOrSnippet.svelte +11 -0
  150. package/dist/utils/StringOrSnippet.svelte.d.ts +19 -0
  151. package/dist/utils/color.d.ts +1 -1
  152. package/dist/utils/index.d.ts +2 -1
  153. package/dist/utils/index.js +2 -1
  154. package/dist/utils/isSnippet.d.ts +3 -5
  155. package/dist/utils/isSnippet.js +9 -4
  156. package/package.json +32 -25
  157. package/dist/data/Stat.svelte.d.ts +0 -39
  158. package/dist/data/index.d.ts +0 -1
  159. package/dist/data/index.js +0 -1
  160. package/dist/grid/Column.svelte +0 -11
  161. package/dist/grid/Column.svelte.d.ts +0 -22
  162. package/dist/grid/Grid.svelte +0 -19
  163. package/dist/grid/Grid.svelte.d.ts +0 -24
  164. package/dist/grid/Row.svelte +0 -44
  165. package/dist/grid/Row.svelte.d.ts +0 -24
  166. package/dist/icons/Alert.svelte.d.ts +0 -23
  167. package/dist/icons/Copy.svelte.d.ts +0 -23
  168. package/dist/icons/Done.svelte.d.ts +0 -23
  169. package/dist/icons/Error.svelte.d.ts +0 -23
  170. package/dist/icons/Help.svelte.d.ts +0 -23
  171. package/dist/icons/Hide.svelte.d.ts +0 -23
  172. package/dist/icons/Info.svelte.d.ts +0 -23
  173. package/dist/icons/Link.svelte.d.ts +0 -23
  174. package/dist/icons/MenuBurger.svelte.d.ts +0 -23
  175. package/dist/icons/MenuDots.svelte.d.ts +0 -23
  176. package/dist/icons/Show.svelte.d.ts +0 -23
  177. package/dist/icons/Success.svelte.d.ts +0 -23
  178. package/dist/icons/Warning.svelte.d.ts +0 -23
  179. package/dist/utils/StringOrComponentOrSnippet.svelte +0 -14
  180. package/dist/utils/StringOrComponentOrSnippet.svelte.d.ts +0 -24
  181. /package/dist/icons/{Alert.svelte → IconAlert.svelte} +0 -0
  182. /package/dist/icons/{Done.svelte → IconDone.svelte} +0 -0
  183. /package/dist/icons/{Error.svelte → IconError.svelte} +0 -0
  184. /package/dist/icons/{Help.svelte → IconHelp.svelte} +0 -0
  185. /package/dist/icons/{Hide.svelte → IconHide.svelte} +0 -0
  186. /package/dist/icons/{Info.svelte → IconInfo.svelte} +0 -0
  187. /package/dist/icons/{Link.svelte → IconLink.svelte} +0 -0
  188. /package/dist/icons/{MenuBurger.svelte → IconMenuBurger.svelte} +0 -0
  189. /package/dist/icons/{MenuDots.svelte → IconMenuDots.svelte} +0 -0
  190. /package/dist/icons/{Show.svelte → IconShow.svelte} +0 -0
  191. /package/dist/icons/{Success.svelte → IconSuccess.svelte} +0 -0
  192. /package/dist/icons/{Warning.svelte → IconWarning.svelte} +0 -0
@@ -1,9 +1,9 @@
1
- <script lang="ts">import { getContext } from "svelte";
1
+ <script lang="ts">import { getContext, onMount } from "svelte";
2
2
  import { createId } from "../utils/id.js";
3
- import Copy from "../icons/Copy.svelte";
4
- import Done from "../icons/Done.svelte";
5
- import Show from "../icons/Show.svelte";
6
- import Hide from "../icons/Hide.svelte";
3
+ import Copy from "../icons/IconCopy.svelte";
4
+ import Done from "../icons/IconDone.svelte";
5
+ import Show from "../icons/IconShow.svelte";
6
+ import Hide from "../icons/IconHide.svelte";
7
7
  import Tooltip from "../display/Tooltip.svelte";
8
8
  import IconButton from "../display/IconButton.svelte";
9
9
  import { fieldChange, fieldKeydown, ignoreKeys } from "./client.svelte.js";
@@ -11,9 +11,12 @@ import FieldError from "./FieldError.svelte";
11
11
  import { getFromObjWithStringPath } from "./form.js";
12
12
  import { ZodType } from "zod";
13
13
  import FieldContent from "./FieldContent.svelte";
14
+ import { on } from "svelte/events";
15
+ import { fade } from "svelte/transition";
16
+ import Theme from "../layout/Theme.svelte";
14
17
  let {
15
18
  alt,
16
- attrs,
19
+ autofocus,
17
20
  autocapitalize,
18
21
  autocomplete,
19
22
  autocorrect,
@@ -22,7 +25,6 @@ let {
22
25
  contained,
23
26
  copyable,
24
27
  defaultValue,
25
- dirname,
26
28
  disabled,
27
29
  enterkeyhint,
28
30
  height,
@@ -52,15 +54,14 @@ let {
52
54
  prefix,
53
55
  readonly,
54
56
  required,
55
- results,
56
57
  shape = "rounded",
57
58
  size,
58
59
  src,
59
60
  step,
60
- tabindex,
61
61
  title,
62
62
  type,
63
- value = $bindable(),
63
+ unit,
64
+ value = $bindable(""),
64
65
  viewable,
65
66
  webkitdirectory,
66
67
  ...rest
@@ -74,13 +75,15 @@ let viewBtnIcon = $state(Show);
74
75
  const form = getContext("form");
75
76
  const field = $derived(form?.fields[name]);
76
77
  const issue = $derived(form?.issues?.find((issue2) => issue2.name === name));
78
+ $effect(() => {
79
+ console.log("issue", issue);
80
+ });
77
81
  const validator = getContext("form.validators")?.[name];
78
82
  const data = form?.data;
79
83
  const originalData = form?.originalData;
80
84
  function view(e) {
81
85
  e.preventDefault();
82
- if (!el)
83
- return;
86
+ if (!el) return;
84
87
  if (el.type === "password") {
85
88
  el.type = "text";
86
89
  viewBtnIcon = Hide;
@@ -94,10 +97,9 @@ function view(e) {
94
97
  }
95
98
  function copy(e) {
96
99
  e.preventDefault();
97
- if (!el)
98
- return;
100
+ if (!el) return;
99
101
  if (navigator.clipboard) {
100
- navigator.clipboard.writeText(value);
102
+ navigator.clipboard.writeText(value.toString());
101
103
  } else {
102
104
  el.focus();
103
105
  el.select();
@@ -113,131 +115,163 @@ function copy(e) {
113
115
  }, 1500);
114
116
  el.focus();
115
117
  }
118
+ if (!value) value = form ? getFromObjWithStringPath(Object.assign(originalData ?? {}, data ?? {}), name) || form?.fields?.[name]?.defaultValue : "";
119
+ onMount(() => {
120
+ if (value) fieldChange(form, name, () => el)({});
121
+ });
122
+ let focused = $state(false);
123
+ let rangeValueLeft = $derived.by(() => {
124
+ if (!el) return 0;
125
+ value;
126
+ return (el.valueAsNumber - min) / (max - min) * 100;
127
+ });
128
+ function focus(e) {
129
+ focused = true;
130
+ if (onfocus) return onfocus(e);
131
+ }
132
+ function blur(e) {
133
+ focused = false;
134
+ if (onblur) return onblur(e);
135
+ }
116
136
  </script>
117
137
 
118
- {#snippet input()}
119
- <input
120
- bind:this={el}
121
- {alt}
122
- autocapitalize={typeof autocapitalize === 'string' ? autocapitalize : (typeof autocapitalize === 'boolean' ? (autocapitalize ? 'on' : 'off') : undefined)}
123
- {autocomplete}
124
- autocorrect={typeof autocorrect === 'boolean' ? (autocorrect ? 'on' : 'off') : undefined}
125
- {capture}
126
- {checked}
127
- {dirname}
128
- {disabled}
129
- {enterkeyhint}
130
- {height}
131
- {id}
132
- {indeterminate}
133
- {inputmode}
134
- {list}
135
- maxlength={maxlength ? maxlength : field?.maxlength}
136
- minlength={minlength ? minlength : field?.minlength}
137
- max={max ? max : field?.max}
138
- min={min ? min : field?.min}
139
- {multiple}
140
- {name}
141
- {onblur}
142
- {onclick}
143
- onchange={fieldChange(form, name, () => el, validator, onchange)}
144
- {onfocus}
145
- onkeydown={fieldKeydown(form, name, () => el, validator, onkeydown)}
146
- {onkeyup}
147
- {onkeypress}
148
- pattern={pattern ? pattern : field?.pattern}
149
- {placeholder}
150
- {readonly}
151
- required={required || field?.required}
152
- {results}
153
- {size}
154
- {src}
155
- {step}
156
- {tabindex}
157
- {title}
158
- {type}
159
- value={value || getFromObjWithStringPath(Object.assign(originalData ?? {}, data ?? {}), name) || form?.fields?.[name]?.defaultValue || ''}
160
- {webkitdirectory}
161
- {...rest}
162
- />
138
+ {#snippet input()}
139
+ {#if type === 'checkbox'}
140
+ <input
141
+ type="checkbox"
142
+ bind:this={el}
143
+ {alt}
144
+ {autofocus}
145
+ {disabled}
146
+ {enterkeyhint}
147
+ {height}
148
+ {id}
149
+ {indeterminate}
150
+ {inputmode}
151
+ {name}
152
+ onblur={blur}
153
+ {onclick}
154
+ onchange={fieldChange(form, name, () => el, validator, onchange)}
155
+ onfocus={focus}
156
+ onkeydown={fieldKeydown(form, name, () => el, validator, onkeydown)}
157
+ {onkeyup}
158
+ {onkeypress}
159
+ {readonly}
160
+ required={required || field?.required}
161
+ {title}
162
+ bind:checked={value}
163
+ {...rest}
164
+ />
165
+ {:else}
166
+ <input
167
+ bind:this={el}
168
+ {alt}
169
+ {autofocus}
170
+ autocapitalize={typeof autocapitalize === 'string' ? autocapitalize : (typeof autocapitalize === 'boolean' ? (autocapitalize ? 'on' : 'off') : undefined)}
171
+ {autocomplete}
172
+ autocorrect={typeof autocorrect === 'boolean' ? (autocorrect ? 'on' : 'off') : undefined}
173
+ {capture}
174
+ {checked}
175
+ {disabled}
176
+ {enterkeyhint}
177
+ {height}
178
+ {id}
179
+ {inputmode}
180
+ {list}
181
+ maxlength={maxlength ? maxlength : field?.maxlength}
182
+ minlength={minlength ? minlength : field?.minlength}
183
+ max={max ? max : field?.max}
184
+ min={min ? min : field?.min}
185
+ {multiple}
186
+ {name}
187
+ onblur={blur}
188
+ {onclick}
189
+ onchange={fieldChange(form, name, () => el, validator, onchange)}
190
+ onfocus={focus}
191
+ onkeydown={fieldKeydown(form, name, () => el, validator, onkeydown)}
192
+ {onkeyup}
193
+ {onkeypress}
194
+ pattern={pattern ? pattern : field?.pattern}
195
+ {placeholder}
196
+ {readonly}
197
+ required={required || field?.required}
198
+ {size}
199
+ {src}
200
+ {step}
201
+ {title}
202
+ {type}
203
+ bind:value={value}
204
+ {webkitdirectory}
205
+ {...rest}
206
+ />
207
+ {/if}
163
208
  {/snippet}
164
209
 
165
- <FieldContent
166
- {id}
167
- {label}
168
- {labelTip}
169
- contained={type === "checkbox" || type === "radio" ? false : true}
170
- direction={(type === "checkbox" || type === "radio") ? 'row' : 'column'}
171
- {field}
172
- {issue}
173
- {prefix}
174
- {suffix}
175
- >
210
+ {#if type === 'hidden'}
211
+ {@render input()}
212
+ {:else}
213
+ <FieldContent
214
+ {id}
215
+ {label}
216
+ {labelTip}
217
+ contained={type === "checkbox" || type === "radio" || type === "color" || type === "range" ? false : true}
218
+ direction={(type === "checkbox" || type === "radio") ? 'row' : 'column'}
219
+ {field}
220
+ {issue}
221
+ {type}
222
+ {help}
223
+ {prefix}
224
+ {suffix}
225
+ {required}
226
+ >
176
227
 
177
- {#if type === "checkbox" || type === "radio"}
178
- {@render input()}
179
- {:else}
228
+ {#if type === "checkbox" || type === "radio"}
229
+ {@render input()}
230
+ {:else if type === "range"}
231
+ <div class="Range">
232
+ {#if min?.toString().length}
233
+ <span>{min}{unit}</span>
234
+ {/if}
235
+ <div class="RangeInput">
236
+ {@render input()}
237
+ {#if focused && min?.toString().length && max?.toString().length}
238
+ <Theme theme="invert">
239
+ <div
240
+ class="RangeValue"
241
+ in:fade={{ duration: 100 }}
242
+ out:fade={{ duration: 100 }}
243
+ style="left: {rangeValueLeft}%"
244
+ >
245
+ {value}{unit}
246
+ </div>
247
+ </Theme>
248
+ {/if}
249
+ </div>
250
+ {#if max?.toString().length}
251
+ <span>{max}{unit}</span>
252
+ {/if}
253
+ </div>
254
+ {:else}
180
255
 
181
- {@render input()}
256
+ {@render input()}
182
257
 
183
- {#if copyable}
184
- <Tooltip tip={copyTitle} open={copyTooltipOpen}>
185
- <IconButton icon={copyBtnIcon} onclick={copy} disabled={copyTooltipOpen} />
186
- </Tooltip>
187
- {/if}
188
-
189
- {#if type === "password" && viewable}
190
- <Tooltip tip={viewTitle}>
191
- <IconButton icon={viewBtnIcon} onclick={view} />
192
- </Tooltip>
193
- {/if}
258
+ {#if copyable}
259
+ <Tooltip tip={copyTitle} open={copyTooltipOpen}>
260
+ <IconButton icon={copyBtnIcon} onclick={copy} disabled={copyTooltipOpen} />
261
+ </Tooltip>
262
+ {/if}
263
+
264
+ {#if type === "password" && viewable}
265
+ <Tooltip tip={viewTitle}>
266
+ <IconButton icon={viewBtnIcon} onclick={view} />
267
+ </Tooltip>
268
+ {/if}
194
269
 
195
- {/if}
196
- </FieldContent>
270
+ {/if}
271
+ </FieldContent>
272
+ {/if}
197
273
 
198
274
  <style>
199
- .FieldContainer {
200
- display: flex;
201
- gap: 0.75em;
202
- flex-direction: column;
203
- font-size: var(--font-size, 1em);
204
- }
205
- .Field {
206
- background-color: var(--field-bg);
207
- border: var(--field-border-size) var(--field-border-style) var(--field-border-color);
208
- border-radius: var(--field-radius);
209
- display: flex;
210
- padding-inline: 0.15em;
211
- }
212
- .Field:has(input:user-invalid),
213
- .Field.invalid {
214
- border-color: var(--field-border-color-error);
215
- }
216
- .Field > *:not(input) {
217
- flex-grow: 0;
218
- flex-shrink: 0;
219
- }
220
- .Fix {
221
- display: flex;
222
- align-items: center;
223
- padding-inline: 0.65em;
224
- font-size: 1em;
225
- line-height: 1.5;
226
- color: var(--text-subtle);
227
- }
228
- .Suffix {
229
- padding-inline-start: 0;
230
- }
231
- .Prefix {
232
- padding-inline-end: 0;
233
- }
234
- .Field:has(input:focus-visible) {
235
- outline: var(--focus-outline);
236
- }
237
- .Field:has(input:focus-visible:user-invalid),
238
- .Field.invalid:has(input:focus-visible) {
239
- outline-color: var(--focus-color-error);
240
- }
241
275
  /**
242
276
  * Input element
243
277
  */
@@ -250,16 +284,8 @@ function copy(e) {
250
284
  input:not([type="checkbox"]):not([type="radio"]):active {
251
285
  outline: none;
252
286
  }
253
- .Field.hasPrefix input {
254
- padding-inline-start: 0.35em;
255
- }
256
- /**
257
- * Buttons
258
- */
259
- .Field :global(button:focus-visible) {
260
- outline: var(--focus-outline);
261
- outline-offset: 3px;
262
- border-radius: calc(var(--field-radius) - 2px);
287
+ input[type="range"] {
288
+ display: block;
263
289
  }
264
290
  /**
265
291
  * Checkbox and radio
@@ -267,21 +293,34 @@ function copy(e) {
267
293
  input[type="checkbox"] {
268
294
  border-radius: 6px;
269
295
  }
270
-
271
- .FieldContainer.checkOrRadio {
272
- flex-direction: row-reverse;
273
- align-items: center;
274
- justify-content: start;
275
- gap: 1em;
276
- width: fit-content;
277
- }
278
- .FieldContainer.checkOrRadio .Field {
296
+ .Range {
279
297
  display: flex;
298
+ gap: 0.5em;
280
299
  align-items: center;
281
- border: none;
282
300
  }
283
- .FieldContainer.checkOrRadio input:focus-visible,
284
- .FieldContainer.checkOrRadio input:hover {
285
- outline: var(--focus-outline);
301
+ .RangeValue {
302
+ position: absolute;
303
+ top: 0;
304
+ font-size: max(0.85em, 9px);
305
+ color: var(--text-subtle);
306
+ background: var(--bg-app);
307
+ padding: 0.15em 0.35em;
308
+ border-radius: var(--border-radius);
309
+ transform: translate(-50%, -125%);
310
+ border: var(--border);
311
+ min-inline-size: 1em;
312
+ box-shadow: 0 0.5rem 1rem var(--shadow);
313
+ font-weight: 600;
314
+ }
315
+ .Range span {
316
+ font-size: 0.75em;
317
+ color: var(--text-subtle);
318
+ }
319
+ .RangeInput {
320
+ position: relative;
321
+ flex-grow: 1;
322
+ }
323
+ .RangeInput :global(input) {
324
+ width: 100%;
286
325
  }
287
326
  </style>