Skip to content

Commit a5a0ce0

Browse files
authored
🔀 Merge 'metadata-constraints' into main
✨ Metadata constraints (range & pattern)
2 parents 9708a11 + 37cf67c commit a5a0ce0

21 files changed

+1333
-260
lines changed

‎bun.lock‎

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎examples/kitchensink.cigaleprotocol.yaml‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# yaml-language-server: $schema=https://cigaleapp.github.io/cigale/protocol.schema.json
1+
# yaml-language-server: $schema=../static/protocol.schema.json
22
id: io.github.cigaleapp.kitchensink
33
name: Kitchen sink
44
description: Made to demo all of the available data types and features that are supported by CIGALE protocols.
@@ -19,6 +19,7 @@ sessionMetadata:
1919
mergeMethod: none
2020
required: true
2121
type: string
22+
pattern: year month day hours minutes then uppercase letter minimum 2 times
2223
description: |
2324
Le code du transect est composé de la date, de l'heure, et de vos initiales. Par exemple, un transect réalisé par Martin Galli le 07/12/2023 à 14h50 s'écrira : 202312071450MG
2425
default: |
@@ -32,6 +33,7 @@ sessionMetadata:
3233
required: false
3334
type: float
3435
description: '*watches*'
36+
range: 0..10
3537
default: 6.7
3638

3739
has_no_default:
@@ -48,7 +50,7 @@ sessionMetadata:
4850
type: file
4951
description: 'A file that is accessible from all snippets in the session'
5052
size:
51-
minimum: 1 Ko
53+
minimum: 1 ko
5254
maximum: 1.2 Mo
5355
accept: [.jpeg, .jpg, .png, image/tiff, video/*]
5456

@@ -73,6 +75,7 @@ metadata:
7375
mergeMethod: average
7476
required: false
7577
type: date
78+
range: future
7679

7780
enum:
7881
description: enum metadata
@@ -101,13 +104,15 @@ metadata:
101104
mergeMethod: average
102105
required: false
103106
type: integer
107+
range: <= 100
104108

105109
string:
106110
description: string metadata
107111
label: string
108112
mergeMethod: average
109113
required: false
110114
type: string
115+
regex: ^ohio (understandment|respect).*$
111116

112117
location:
113118
description: location metadata

‎package.json‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@
157157
"marked": "^17.0.2",
158158
"microdiff": "^1.5.0",
159159
"nanoid": "^5.1.6",
160+
"natural-regex": "^0.5.0",
160161
"onnxruntime-web": "^1.22.0",
161162
"pica-gpu": "^0.2.0",
162163
"piexifjs": "^1.0.6",
@@ -175,5 +176,8 @@
175176
"wuchale": "^0.19.4",
176177
"xss": "^1.0.15",
177178
"yaml": "^2.8.2"
179+
},
180+
"patchedDependencies": {
181+
"natural-regex@0.5.0": "patches/natural-regex@0.5.0.patch"
178182
}
179183
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
diff --git a/node_modules/natural-regex/.bun-tag-4d61ccb1a34513f7 b/.bun-tag-4d61ccb1a34513f7
2+
new file mode 100644
3+
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
4+
diff --git a/node_modules/natural-regex/.bun-tag-cc74b0ee2e59fb b/.bun-tag-cc74b0ee2e59fb
5+
new file mode 100644
6+
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
7+
diff --git a/es/language.js b/es/language.js
8+
index 08a4d3a31de7cdc93ecec9bdbf41115d39f1f863..8daa2ec795ff68ab7e33e95276d73a8210b8b757 100644
9+
--- a/es/language.js
10+
+++ b/es/language.js
11+
@@ -1427,7 +1427,4 @@ if (typeof require !== 'undefined' && typeof exports !== 'undefined') {
12+
var source = require('fs').readFileSync(require('path').normalize(args[1]), "utf8");
13+
return exports.parser.parse(source);
14+
};
15+
- if (typeof module !== 'undefined' && require.main === module) {
16+
- exports.main(process.argv.slice(1));
17+
- }
18+
}
19+
diff --git a/lib/language.js b/lib/language.js
20+
index 08a4d3a31de7cdc93ecec9bdbf41115d39f1f863..b5b0be29415ca1f40879bdc8a5edf7946d113fb7 100644
21+
--- a/lib/language.js
22+
+++ b/lib/language.js
23+
@@ -1427,7 +1427,4 @@ if (typeof require !== 'undefined' && typeof exports !== 'undefined') {
24+
var source = require('fs').readFileSync(require('path').normalize(args[1]), "utf8");
25+
return exports.parser.parse(source);
26+
};
27+
- if (typeof module !== 'undefined' && require.main === module) {
28+
- exports.main(process.argv.slice(1));
29+
- }
30+
}
31+
\ No newline at end of file
32+
diff --git a/src/language.js b/src/language.js
33+
index 79b45d59ccf4723b80f361a481190dcd80dce56b..10c2711ca153e01cf8cde556fdad2230e2b3608a 100644
34+
--- a/src/language.js
35+
+++ b/src/language.js
36+
@@ -1189,7 +1189,4 @@ exports.main = function commonjsMain(args) {
37+
var source = require('fs').readFileSync(require('path').normalize(args[1]), "utf8");
38+
return exports.parser.parse(source);
39+
};
40+
-if (typeof module !== 'undefined' && require.main === module) {
41+
- exports.main(process.argv.slice(1));
42+
-}
43+
}
44+
\ No newline at end of file

‎src/lib/InputRange.svelte‎

Lines changed: 229 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,229 @@
1+
<script lang="ts">
2+
import { range, unique } from './utils.js';
3+
4+
interface Props {
5+
min: number;
6+
max: number;
7+
/** Maximum step size */
8+
granularity?: number | undefined;
9+
/** Number of steps to use. If not set, uses as much steps as granularity allows */
10+
stepcount?: number;
11+
/** Array of numbers to specify every tick's value, a single number of specify a number of ticks to uniformly distribute on the slider */
12+
ticks?: number | number[];
13+
value: number | undefined;
14+
disabled?: boolean;
15+
onblur?: () => void;
16+
// eslint-disable-next-line no-unused-vars
17+
onvalue?: (value: number) => void;
18+
}
19+
20+
let {
21+
min,
22+
max,
23+
stepcount = Infinity,
24+
granularity,
25+
ticks = 0,
26+
value = $bindable(),
27+
disabled,
28+
onblur,
29+
onvalue
30+
}: Props = $props();
31+
32+
const componentId = $props.id();
33+
34+
const stepsize = $derived((max - min) / (stepcount - 1));
35+
const step = $derived(granularity ? Math.max(stepsize, granularity) : stepsize);
36+
</script>
37+
38+
<input
39+
type="range"
40+
{min}
41+
{max}
42+
{step}
43+
{disabled}
44+
bind:value
45+
list="{componentId}-ticks"
46+
style:--slider-width="{value ? ((value - min) / (max - min)) * 100 : 0}%"
47+
{onblur}
48+
oninput={({ currentTarget }) => {
49+
onvalue?.(
50+
granularity && granularity >= 1
51+
? Number.parseInt(currentTarget.value, 10)
52+
: Number.parseFloat(currentTarget.value)
53+
);
54+
}}
55+
/>
56+
57+
{#if Array.isArray(ticks) || ticks > 0}
58+
<datalist id="{componentId}-ticks">
59+
{#if Array.isArray(ticks)}
60+
{#each unique(ticks) as tick (tick)}
61+
<option value={tick}></option>
62+
{/each}
63+
{:else}
64+
{#each range(ticks) as i (i)}
65+
<option value={min + (i * (max - min)) / (ticks - 1)}></option>
66+
{/each}
67+
{/if}
68+
</datalist>
69+
{/if}
70+
71+
<style>
72+
/* Many thanks to CSS Tricks: https://css-tricks.com/sliding-nightmare-understanding-range-input/ */
73+
74+
input {
75+
margin: 0;
76+
padding: 0;
77+
width: 100%;
78+
height: 1.5em;
79+
background: transparent;
80+
81+
--track-height: 0.5em;
82+
--track-color: var(--track-background, var(--bg-primary-translucent));
83+
--track-filled-color: var(--track-fill, var(--bg-primary));
84+
--thumb-color: var(--track-thumb, var(--bg-neutral));
85+
86+
&:is(:hover, :focus-visible) {
87+
--track-filled-color: var(--track-fill, var(--fg-primary));
88+
}
89+
}
90+
91+
input,
92+
input::-webkit-slider-thumb {
93+
-webkit-appearance: none;
94+
}
95+
96+
input::-ms-tooltip {
97+
display: none;
98+
}
99+
100+
/* Full track */
101+
102+
input::-webkit-slider-runnable-track {
103+
box-sizing: border-box;
104+
border: none;
105+
width: 100%;
106+
height: var(--track-height);
107+
background: var(--track-color);
108+
border-radius: 9999px;
109+
}
110+
111+
input:is(:focus-visible)::-webkit-slider-runnable-track {
112+
border: 1px solid var(--fg-neutral);
113+
}
114+
115+
input::-moz-range-track {
116+
box-sizing: border-box;
117+
border: none;
118+
width: 100%;
119+
height: var(--track-height);
120+
background: var(--track-color);
121+
border-radius: 9999px;
122+
}
123+
124+
input:is(:focus-visible)::-moz-range-track {
125+
border: 1px solid var(--fg-neutral);
126+
}
127+
128+
input::-ms-track {
129+
box-sizing: border-box;
130+
border: none;
131+
width: 100%;
132+
height: var(--track-height);
133+
background: var(--track-color);
134+
border-radius: 9999px;
135+
}
136+
137+
input:is(:focus-visible)::-ms-track {
138+
border: 1px solid var(--fg-neutral);
139+
}
140+
141+
/* Thumb */
142+
143+
input::-webkit-slider-thumb {
144+
cursor: pointer;
145+
margin-top: -0.625em;
146+
box-sizing: border-box;
147+
border: none;
148+
width: 1.5em;
149+
height: 1.5em;
150+
border-radius: 50%;
151+
background: var(--thumb-color);
152+
border: 1px solid var(--fg-neutral);
153+
transition: border 0.1s ease;
154+
}
155+
156+
input:is(:hover, :focus-visible)::-webkit-slider-thumb {
157+
border-color: var(--track-filled-color);
158+
}
159+
160+
input:is(:active)::-webkit-slider-thumb {
161+
border-width: calc(1.5em / 2 - 5px);
162+
}
163+
164+
input::-moz-range-thumb {
165+
cursor: pointer;
166+
box-sizing: border-box;
167+
border: none;
168+
width: 1.5em;
169+
height: 1.5em;
170+
border-radius: 50%;
171+
background: var(--thumb-color);
172+
border: 1px solid var(--fg-neutral);
173+
transition: border 0.1s ease;
174+
}
175+
176+
input:is(:hover, :focus-visible)::-moz-range-thumb {
177+
border-color: var(--track-filled-color);
178+
}
179+
180+
input:is(:active)::-moz-range-thumb {
181+
border-width: calc(1.5em / 2 - 5px);
182+
}
183+
184+
input::-ms-thumb {
185+
cursor: pointer;
186+
margin-top: 0;
187+
box-sizing: border-box;
188+
border: none;
189+
width: 1.5em;
190+
height: 1.5em;
191+
border-radius: 50%;
192+
background: var(--thumb-color);
193+
border: 1px solid var(--fg-neutral);
194+
transition: border 0.1s ease;
195+
}
196+
197+
input:is(:hover, :focus-visible)::-ms-thumb {
198+
border-color: var(--track-filled-color);
199+
}
200+
201+
input:is(:active)::-ms-thumb {
202+
border-width: calc(1.5em / 2 - 5px);
203+
}
204+
205+
/* Filled track */
206+
207+
input::-webkit-slider-runnable-track {
208+
transition: background 0.1s ease;
209+
background: linear-gradient(
210+
to right,
211+
var(--track-filled-color) var(--slider-width),
212+
var(--track-color) var(--slider-width)
213+
);
214+
}
215+
216+
input::-moz-range-progress {
217+
transition: background 0.1s ease;
218+
height: var(--track-height);
219+
background: var(--track-filled-color);
220+
border-radius: 9999px;
221+
}
222+
223+
input::-ms-fill-lower {
224+
transition: background 0.1s ease;
225+
height: var(--track-height);
226+
background: var(--track-filled-color);
227+
border-radius: 9999px;
228+
}
229+
</style>

0 commit comments

Comments
 (0)