qc-trousse-sdg 1.4.6 → 1.4.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.
- package/README.md +14 -0
- package/dist/css/qc-sdg-no-grid.min.css +1 -1
- package/dist/css/qc-sdg.min.css +1 -1
- package/dist/js/qc-sdg.min.js +1 -1
- package/package.json +1 -1
- package/public/css/qc-doc-sdg.css +38 -6
- package/public/css/qc-sdg-no-grid.css +67 -40
- package/public/css/qc-sdg.css +67 -40
- package/public/index.html +77 -23
- package/public/js/qc-doc-sdg.js +381 -225
- package/public/js/qc-sdg.js +1053 -633
- package/src/doc/qc-doc-sdg.js +6 -1
- package/src/doc/scss/components/_exemple.scss +5 -1
- package/src/doc/scss/qc-doc-sdg.scss +22 -4
- package/src/sdg/bases/Icon/Icon.svelte +2 -0
- package/src/sdg/bases/links/_links.scss +18 -12
- package/src/sdg/components/Alert/Alert.svelte +28 -9
- package/src/sdg/components/Alert/AlertWC.svelte +20 -5
- package/src/sdg/components/Alert/Test/AlertSvelteTest.svelte +25 -0
- package/src/sdg/components/Alert/Test/alertBaselineTest.html +13 -0
- package/src/sdg/components/Alert/Test/alertSvelteTest.html +1 -0
- package/src/sdg/components/Alert/_alert.html +23 -11
- package/src/sdg/components/Checkbox/Checkbox.svelte +6 -5
- package/src/sdg/components/DropdownList/DropdownList.svelte +65 -14
- package/src/sdg/components/DropdownList/DropdownListButton/DropdownListButton.svelte +2 -6
- package/src/sdg/components/DropdownList/DropdownListItems/DropdownListItems.svelte +4 -22
- package/src/sdg/components/DropdownList/DropdownListItems/DropdownListItemsMultiple/DropdownListItemsMultiple.svelte +2 -1
- package/src/sdg/components/DropdownList/DropdownListItems/DropdownListItemsSingle/DropdownListItemsSingle.svelte +2 -1
- package/src/sdg/components/DropdownList/SelectWC.svelte +39 -13
- package/src/sdg/components/DropdownList/Test/DropdownListSvelteTest.svelte +2 -2
- package/src/sdg/components/DropdownList/Test/dropdownListBaselineTest.html +7 -0
- package/src/sdg/components/DropdownList/_dropdownList.scss +7 -5
- package/src/sdg/components/DropdownList/_select.html +31 -5
- package/src/sdg/components/ExternalLink/ExternalLink.svelte +36 -74
- package/src/sdg/components/ExternalLink/ExternalLinkWC.svelte +44 -1
- package/src/sdg/components/ExternalLink/externalLinkBaselineTest.html +45 -0
- package/src/sdg/components/Fieldset/_fieldset.scss +1 -1
- package/src/sdg/components/Label/LabelText.svelte +2 -1
- package/src/sdg/components/Label/_label.scss +10 -2
- package/src/sdg/components/PivFooter/_pivFooter.html +4 -4
- package/src/sdg/components/SearchInput/SearchInput.svelte +14 -2
- package/src/sdg/components/SearchInput/SearchInputWC.svelte +2 -0
- package/src/sdg/components/SearchInput/_searchInput.html +18 -2
- package/src/sdg/components/SearchInput/_searchInput.scss +10 -1
- package/src/sdg/components/TextField/Test/TextFieldEmbededTest.svelte +19 -3
- package/src/sdg/components/TextField/Test/textFieldBaselineTest.html +5 -2
- package/src/sdg/components/TextField/TextField.svelte +12 -6
- package/src/sdg/components/TextField/TextFieldWC.svelte +19 -4
- package/src/sdg/components/TextField/_textField.html +1 -1
- package/src/sdg/components/TextField/_textField.scss +0 -6
- package/src/sdg/components/TextField/textFieldUtils.js +3 -2
- package/src/sdg/components/utils.js +23 -0
- package/src/sdg/qc-sdg-test.js +2 -1
- package/src/sdg/scss/lib/_mixins.scss +6 -0
- package/src/sdg/scss/utilities/_states.scss +1 -1
- package/tests/alert-baseline.spec.ts +23 -0
- package/tests/alert-svelte.spec.ts +23 -0
- package/tests/buildSvelteTestsIgnore.json +2 -1
- package/tests/dropdown-list-baseline.spec.ts +8 -0
- package/tests/external-link-baseline.spec.ts +30 -0
- package/tests/textfield-baseline.spec.ts +5 -5
- package/tests/textfield-svelte.spec.ts +5 -5
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<script>
|
|
2
2
|
import {Utils} from "../../../utils";
|
|
3
|
+
import {tick} from "svelte";
|
|
3
4
|
|
|
4
5
|
let {
|
|
5
6
|
displayedItems,
|
|
@@ -87,7 +88,7 @@
|
|
|
87
88
|
}
|
|
88
89
|
}
|
|
89
90
|
|
|
90
|
-
|
|
91
|
+
tick().then(() => {
|
|
91
92
|
if (canExit(event, index)) {
|
|
92
93
|
handleExit(event.key);
|
|
93
94
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<script>
|
|
2
2
|
import {Utils} from "../../../utils";
|
|
3
|
+
import {tick} from "svelte";
|
|
3
4
|
|
|
4
5
|
const selectedElementCLass = "qc-dropdown-list-single-selected";
|
|
5
6
|
|
|
@@ -77,7 +78,7 @@
|
|
|
77
78
|
handleSelection(event, item);
|
|
78
79
|
}
|
|
79
80
|
|
|
80
|
-
|
|
81
|
+
tick().then(() => {
|
|
81
82
|
if (canExit(event, index)) {
|
|
82
83
|
handleExit(event.key);
|
|
83
84
|
}
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
placeholder: {attribute: 'placeholder', type: 'String'},
|
|
14
14
|
searchPlaceholder: {attribute: 'search-placeholder', type: 'String'},
|
|
15
15
|
noOptionsMessage: {attribute: 'no-options-message', type: 'String'},
|
|
16
|
-
multiple: {attribute: 'multiple', type: 'Boolean'}
|
|
16
|
+
multiple: {attribute: 'multiple', type: 'Boolean'},
|
|
17
|
+
expanded: {attribute: 'expanded', type: 'Boolean', reflect: true},
|
|
17
18
|
}
|
|
18
19
|
}}"/>
|
|
19
20
|
|
|
@@ -31,14 +32,15 @@
|
|
|
31
32
|
label,
|
|
32
33
|
placeholder,
|
|
33
34
|
width,
|
|
35
|
+
expanded = $bindable(false),
|
|
34
36
|
...rest
|
|
35
37
|
} = $props();
|
|
36
38
|
|
|
37
39
|
let selectElement = $state();
|
|
38
40
|
let items = $state();
|
|
39
41
|
let labelElement = $state();
|
|
40
|
-
|
|
41
|
-
|
|
42
|
+
const observer = Utils.createMutationObserver($host(), setupItemsList);
|
|
43
|
+
const observerOptions = {
|
|
42
44
|
childList: true,
|
|
43
45
|
attributes: true,
|
|
44
46
|
subtree: true,
|
|
@@ -48,6 +50,7 @@
|
|
|
48
50
|
let errorElement = $state();
|
|
49
51
|
let parentRow = $derived($host().closest(".qc-formfield-row"));
|
|
50
52
|
let internalChange = false;
|
|
53
|
+
let previousValue = $state(value);
|
|
51
54
|
|
|
52
55
|
onMount(() => {
|
|
53
56
|
selectElement = $host().querySelector("select");
|
|
@@ -55,12 +58,14 @@
|
|
|
55
58
|
if (labelElement) {
|
|
56
59
|
label = labelElement.innerHTML;
|
|
57
60
|
}
|
|
61
|
+
|
|
58
62
|
if (selectElement) {
|
|
59
63
|
multiple = selectElement.multiple;
|
|
60
64
|
disabled = selectElement.disabled;
|
|
61
65
|
|
|
62
66
|
selectElement.addEventListener("change", handleSelectChange);
|
|
63
|
-
|
|
67
|
+
|
|
68
|
+
observer?.observe(selectElement, observerOptions);
|
|
64
69
|
}
|
|
65
70
|
setupItemsList();
|
|
66
71
|
$host().classList.add("qc-select");
|
|
@@ -75,19 +80,39 @@
|
|
|
75
80
|
if (!selectElement) return;
|
|
76
81
|
if (!selectElement.options) return;
|
|
77
82
|
internalChange = true;
|
|
78
|
-
let newOptionSelected = false;
|
|
79
83
|
for (const option of selectElement.options) {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
newOptionSelected = true;
|
|
84
|
+
const selected = value.includes(option.value);
|
|
85
|
+
if (selected !== option.selected) {
|
|
86
|
+
option.toggleAttribute("selected", selected);
|
|
87
|
+
option.selected = selected;
|
|
85
88
|
}
|
|
86
89
|
}
|
|
87
|
-
|
|
88
|
-
|
|
90
|
+
tick().then(() => internalChange = false);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
$effect(() => {
|
|
94
|
+
if (previousValue.toString() !== value.toString()) {
|
|
95
|
+
previousValue = value;
|
|
96
|
+
selectElement?.dispatchEvent(new CustomEvent('change', {detail: value}));
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
$effect(() => {
|
|
101
|
+
if (expanded) {
|
|
102
|
+
selectElement?.dispatchEvent(
|
|
103
|
+
new CustomEvent('qc.select.show', {
|
|
104
|
+
bubbles: true,
|
|
105
|
+
composed: true
|
|
106
|
+
})
|
|
107
|
+
);
|
|
108
|
+
} else {
|
|
109
|
+
selectElement?.dispatchEvent(
|
|
110
|
+
new CustomEvent('qc.select.hide', {
|
|
111
|
+
bubbles: true,
|
|
112
|
+
composed: true
|
|
113
|
+
})
|
|
114
|
+
);
|
|
89
115
|
}
|
|
90
|
-
tick().then(() => internalChange = false)
|
|
91
116
|
});
|
|
92
117
|
|
|
93
118
|
$effect(() => {
|
|
@@ -134,6 +159,7 @@
|
|
|
134
159
|
{multiple}
|
|
135
160
|
{disabled}
|
|
136
161
|
{required}
|
|
162
|
+
bind:expanded
|
|
137
163
|
{...rest}
|
|
138
164
|
/>
|
|
139
165
|
<link rel='stylesheet' href='{Utils.cssPath}'>
|
|
@@ -61,10 +61,10 @@
|
|
|
61
61
|
items={multipleChoiceOptions}
|
|
62
62
|
/>
|
|
63
63
|
|
|
64
|
-
<div class="qc-formfield-row">
|
|
64
|
+
<div class="qc-formfield-row" style="margin-top: 0;">
|
|
65
65
|
<DropdownList
|
|
66
66
|
id="dropdown-list-invalid"
|
|
67
|
-
label="État invalide"
|
|
67
|
+
label="État initialement invalide dans .qc-formfield-row"
|
|
68
68
|
invalid="true"
|
|
69
69
|
items={invalidOptions}
|
|
70
70
|
/>
|
|
@@ -27,6 +27,13 @@
|
|
|
27
27
|
selectElement.addEventListener("change", (event) => {
|
|
28
28
|
console.log("Option sélectionnée :", event.target.value);
|
|
29
29
|
});
|
|
30
|
+
|
|
31
|
+
selectElement.addEventListener("qc.select.show", (event) => {
|
|
32
|
+
console.log("qc.select.show event:", event);
|
|
33
|
+
});
|
|
34
|
+
selectElement.addEventListener("qc.select.hide", (event) => {
|
|
35
|
+
console.log("qc.select.hide event:", event);
|
|
36
|
+
});
|
|
30
37
|
</script>
|
|
31
38
|
|
|
32
39
|
<div style="height: 40rem;">
|
|
@@ -55,16 +55,18 @@ $border: 1;
|
|
|
55
55
|
|
|
56
56
|
.qc-dropdown-list-expanded {
|
|
57
57
|
position: absolute;
|
|
58
|
-
width: calc(100% +
|
|
59
|
-
left:
|
|
60
|
-
right:
|
|
61
|
-
top:
|
|
58
|
+
width: calc(100% + 2 * var(--dropdown-button-border)px);
|
|
59
|
+
left: calc(var(--dropdown-button-border) * $rem-ratio * -1rem);
|
|
60
|
+
right: calc(var(--dropdown-button-border) * $rem-ratio * -1rem);
|
|
61
|
+
top: calc(var(--dropdown-items-top-offset) * $rem-ratio * 1rem);
|
|
62
|
+
//top: 100%;
|
|
62
63
|
z-index: 11; // Index supérieur à l'index du mixin qc-formcontrol-box
|
|
63
64
|
|
|
64
65
|
background-color: token-value(color, background);
|
|
65
66
|
border-left: rem($border) solid token-value(color, grey, medium);
|
|
66
67
|
border-right: rem($border) solid token-value(color, grey, medium);
|
|
67
|
-
border-bottom:
|
|
68
|
+
border-bottom: calc(var(--dropdown-items-bottom-border) * $rem-ratio * 1rem) solid token-value(color, grey, medium);
|
|
69
|
+
border-top: calc(var(--dropdown-items-top-border) * $rem-ratio * 1rem) solid token-value(color, grey, medium);
|
|
68
70
|
}
|
|
69
71
|
|
|
70
72
|
.qc-dropdown-list-hidden {
|
|
@@ -26,6 +26,20 @@
|
|
|
26
26
|
</select>
|
|
27
27
|
</qc-select>
|
|
28
28
|
|
|
29
|
+
<script>
|
|
30
|
+
const selectElement = document.getElementById("select-single-choice");
|
|
31
|
+
|
|
32
|
+
selectElement.addEventListener("change", (event) => {
|
|
33
|
+
console.log("Option sélectionnée :", event.target.value);
|
|
34
|
+
});
|
|
35
|
+
selectElement.addEventListener("qc.select.show", () => {
|
|
36
|
+
console.log("Options affichées");
|
|
37
|
+
});
|
|
38
|
+
selectElement.addEventListener("qc.select.hide", () => {
|
|
39
|
+
console.log("Options cachées");
|
|
40
|
+
});
|
|
41
|
+
</script>
|
|
42
|
+
|
|
29
43
|
<qc-select id="qc-select-single-choice-search" enable-search>
|
|
30
44
|
<label for="select-single-choice-search">Choix unique avec recherche</label>
|
|
31
45
|
<select id="select-single-choice-search">
|
|
@@ -201,11 +215,11 @@
|
|
|
201
215
|
<div class="table-overflow">
|
|
202
216
|
<table class="qc-table qc-striped component-attributes-description">
|
|
203
217
|
<thead>
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
218
|
+
<tr>
|
|
219
|
+
<th>Nom</th>
|
|
220
|
+
<th>Type</th>
|
|
221
|
+
<th>Description</th>
|
|
222
|
+
</tr>
|
|
209
223
|
</thead>
|
|
210
224
|
<tbody>
|
|
211
225
|
<tr>
|
|
@@ -213,9 +227,21 @@
|
|
|
213
227
|
<td>Tableau de chaîne de caractères</td>
|
|
214
228
|
<td>Valeur(s) sélectionnée(s) dans la liste déroulante</td>
|
|
215
229
|
</tr>
|
|
230
|
+
<tr>
|
|
231
|
+
<td>expanded</td>
|
|
232
|
+
<td>Booléen</td>
|
|
233
|
+
<td>Indique que la liste déroulante est ouverte</td>
|
|
234
|
+
</tr>
|
|
216
235
|
</tbody>
|
|
217
236
|
</table>
|
|
218
237
|
</div>
|
|
219
238
|
|
|
239
|
+
<h5>Événements JS</h5>
|
|
240
|
+
<ul>
|
|
241
|
+
<li>Un événement JS <code class="qc-bg-color-grey-pale">change</code> est émis lors du changement de valeur sélectionnée dans la liste déroulante.</li>
|
|
242
|
+
<li>Un événement JS <code class="qc-bg-color-grey-pale">qc.select.show</code> est émis lorsqu'une liste déroulante est ouverte.</li>
|
|
243
|
+
<li>Un événement JS <code class="qc-bg-color-grey-pale">qc.select.hide</code> est émis lorsqu'une liste déroulante est fermée.</li>
|
|
244
|
+
</ul>
|
|
245
|
+
|
|
220
246
|
<h5>Zone d'ajout de contenu HTML</h5>
|
|
221
247
|
<p>Ce composant ne comporte qu'une seule zone d'ajout de contenu.</p>
|
|
@@ -1,96 +1,58 @@
|
|
|
1
1
|
<script>
|
|
2
2
|
import {Utils} from "../utils";
|
|
3
|
-
import
|
|
3
|
+
import Icon from "../../bases/Icon/Icon.svelte";
|
|
4
|
+
import {tick} from "svelte";
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
let {
|
|
6
7
|
externalIconAlt = Utils.getPageLanguage() === 'fr'
|
|
7
8
|
? "Ce lien dirige vers un autre site."
|
|
8
|
-
: "This link directs to another site."
|
|
9
|
+
: "This link directs to another site.",
|
|
10
|
+
links = [],
|
|
11
|
+
isUpdating = $bindable(false),
|
|
12
|
+
nestedExternalLinks = false
|
|
9
13
|
} = $props();
|
|
10
14
|
|
|
11
15
|
let imgElement = $state();
|
|
16
|
+
let processedLinks = new Set();
|
|
12
17
|
|
|
13
|
-
function
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
NodeFilter.SHOW_ALL,
|
|
17
|
-
{
|
|
18
|
-
acceptNode: node => {
|
|
19
|
-
if (node instanceof Element) {
|
|
20
|
-
if (node.hasAttribute('hidden')) {
|
|
21
|
-
return NodeFilter.FILTER_REJECT;
|
|
22
|
-
}
|
|
23
|
-
const style = window.getComputedStyle(node);
|
|
24
|
-
// Si l'élément est masqué par CSS (display ou visibility), on l'ignore
|
|
25
|
-
if (style.display === 'none'
|
|
26
|
-
|| style.visibility === 'hidden'
|
|
27
|
-
|| style.position === 'absolute') {
|
|
28
|
-
return NodeFilter.FILTER_REJECT;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
if (!node instanceof Text) {
|
|
32
|
-
return NodeFilter.FILTER_SKIP;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// Ignore les nœuds vides
|
|
36
|
-
if (!/\S/.test(node.textContent)) {
|
|
37
|
-
return NodeFilter.FILTER_SKIP;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return NodeFilter.FILTER_ACCEPT;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
onMount(() => {
|
|
47
|
-
imgElement.parentElement.querySelectorAll('a').forEach(link => {
|
|
48
|
-
|
|
49
|
-
// Crée un TreeWalker pour parcourir uniquement les nœuds texte visibles
|
|
50
|
-
const walker = createVisibleNodesTreeWalker();
|
|
51
|
-
|
|
52
|
-
let lastTextNode = null;
|
|
53
|
-
while (walker.nextNode()) {
|
|
54
|
-
lastTextNode = walker.currentNode;
|
|
55
|
-
}
|
|
56
|
-
// S'il n'y a pas de nœud texte visible, on ne fait rien
|
|
57
|
-
if (!lastTextNode) {
|
|
18
|
+
function addExternalLinkIcon(links) {
|
|
19
|
+
links.forEach(link => {
|
|
20
|
+
if (processedLinks.has(link.innerHTML)) {
|
|
58
21
|
return;
|
|
59
22
|
}
|
|
60
23
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const text = lastTextNode.textContent;
|
|
64
|
-
const match = text.match(/^([\s\S]*\s)?(\S+)\s*$/m);
|
|
65
|
-
if (!match) {
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
24
|
+
let linkContent = link.innerHTML;
|
|
25
|
+
linkContent = `<span class="qc-ext-link-text">${linkContent}</span> ${imgElement.outerHTML}`;
|
|
68
26
|
|
|
69
|
-
|
|
70
|
-
|
|
27
|
+
link.innerHTML = linkContent;
|
|
28
|
+
processedLinks.add(linkContent);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
71
31
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
span.appendChild(imgElement)
|
|
32
|
+
$effect(() => {
|
|
33
|
+
if (nestedExternalLinks || links.length <= 0 || !imgElement) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
77
36
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
37
|
+
isUpdating = true;
|
|
38
|
+
|
|
39
|
+
tick().then(() => {
|
|
40
|
+
addExternalLinkIcon(links);
|
|
41
|
+
return tick();
|
|
42
|
+
}).then(() => {
|
|
43
|
+
isUpdating = false;
|
|
85
44
|
});
|
|
86
45
|
});
|
|
87
46
|
</script>
|
|
88
47
|
|
|
89
|
-
<
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
48
|
+
<div hidden>
|
|
49
|
+
<Icon
|
|
50
|
+
type="external-link"
|
|
51
|
+
alt={externalIconAlt}
|
|
52
|
+
bind:rootElement={imgElement}
|
|
53
|
+
class="qc-ext-link-img"
|
|
54
|
+
/>
|
|
55
|
+
</div>
|
|
94
56
|
|
|
95
57
|
|
|
96
58
|
|
|
@@ -8,8 +8,51 @@
|
|
|
8
8
|
|
|
9
9
|
<script>
|
|
10
10
|
import ExternalLink from "./ExternalLink.svelte";
|
|
11
|
+
import {onDestroy, onMount, tick} from "svelte";
|
|
12
|
+
import {Utils} from "../utils";
|
|
11
13
|
|
|
12
14
|
const props = $props();
|
|
15
|
+
const nestedExternalLinks = $host().querySelector('qc-external-link');
|
|
16
|
+
|
|
17
|
+
let links = $state([]);
|
|
18
|
+
const observer = Utils.createMutationObserver($host(), refreshLinks);
|
|
19
|
+
let isUpdating = $state(false);
|
|
20
|
+
let pendingUpdate = false;
|
|
21
|
+
|
|
22
|
+
function queryLinks() {
|
|
23
|
+
return Array.from($host().querySelectorAll('a'));
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function refreshLinks() {
|
|
27
|
+
if (isUpdating || pendingUpdate) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
pendingUpdate = true;
|
|
31
|
+
tick().then(() => {
|
|
32
|
+
if (isUpdating) {
|
|
33
|
+
pendingUpdate = false;
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
links = queryLinks();
|
|
38
|
+
pendingUpdate = false;
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
onMount(() => {
|
|
43
|
+
$host().classList.add('qc-external-link');
|
|
44
|
+
links = queryLinks();
|
|
45
|
+
|
|
46
|
+
observer?.observe($host(), {
|
|
47
|
+
childList: true,
|
|
48
|
+
characterData: true,
|
|
49
|
+
subtree: true,
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
onDestroy(() => {
|
|
54
|
+
observer?.disconnect();
|
|
55
|
+
});
|
|
13
56
|
</script>
|
|
14
57
|
|
|
15
|
-
<ExternalLink {...props} />
|
|
58
|
+
<ExternalLink {links} bind:isUpdating {nestedExternalLinks} {...props} />
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
<div style="border: 1px solid var(--qc-color-text-primary); padding: var(--qc-spacer-sm); max-width: 376px;">
|
|
2
|
+
<p>
|
|
3
|
+
<qc-external-link>
|
|
4
|
+
<a href="#multi-links"
|
|
5
|
+
target="_blank"
|
|
6
|
+
rel="noreferrer nofollow"
|
|
7
|
+
data-external-link="true"
|
|
8
|
+
>
|
|
9
|
+
https:/<wbr>/<wbr>www.quebec.ca/<wbr>gouvernement/<wbr>ministere/<wbr>travail/<wbr>lois-<wbr>reglements#c335465
|
|
10
|
+
</a>
|
|
11
|
+
</qc-external-link>
|
|
12
|
+
</p>
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
<p class="qc-font-size-xl">
|
|
16
|
+
Lorem ipsum
|
|
17
|
+
<qc-external-link><a href="http://www.external.domain.com/">Lorem ipsum dolor sit amet, consectetur
|
|
18
|
+
adipiscing</a></qc-external-link>
|
|
19
|
+
elit
|
|
20
|
+
</p>
|
|
21
|
+
<p class="qc-font-size-lg">
|
|
22
|
+
Lorem ipsum
|
|
23
|
+
<qc-external-link><a href="http://www.external.domain.com/">Lorem ipsum dolor sit amet, consectetur
|
|
24
|
+
adipiscing</a></qc-external-link>
|
|
25
|
+
elit
|
|
26
|
+
</p>
|
|
27
|
+
<p class="qc-font-size-md">
|
|
28
|
+
Lorem ipsum
|
|
29
|
+
<qc-external-link><a href="http://www.external.domain.com/">Lorem ipsum dolor sit amet, consectetur
|
|
30
|
+
adipiscing</a></qc-external-link>
|
|
31
|
+
elit
|
|
32
|
+
</p>
|
|
33
|
+
<p class="qc-font-size-sm">
|
|
34
|
+
Lorem ipsum
|
|
35
|
+
<qc-external-link><a href="http://www.external.domain.com/">Lorem ipsum dolor sit amet, consectetur
|
|
36
|
+
adipiscing</a></qc-external-link>
|
|
37
|
+
elit
|
|
38
|
+
</p>
|
|
39
|
+
|
|
40
|
+
<p class="qc-font-size-md">
|
|
41
|
+
<qc-external-link id="multi-links">
|
|
42
|
+
<a href="http://www.external.domain.com/">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</a>
|
|
43
|
+
<a href="https://www.google.com/">Google</a>
|
|
44
|
+
</qc-external-link>
|
|
45
|
+
</p>
|
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
margin: 0 0 rem(32);
|
|
8
8
|
justify-items: start;
|
|
9
9
|
legend {
|
|
10
|
-
font-weight: token-value(font weight content bold);
|
|
11
10
|
display: inline-block;
|
|
12
11
|
margin-bottom: token-value(spacer, md);
|
|
12
|
+
white-space: nowrap;
|
|
13
13
|
}
|
|
14
14
|
&.qc-compact {
|
|
15
15
|
margin-bottom: token-value(spacer, sm);
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
@use "qc-sdg-lib" as *;
|
|
2
2
|
|
|
3
3
|
.qc-label {
|
|
4
|
-
|
|
5
|
-
display: block;
|
|
4
|
+
display: inline-block;
|
|
6
5
|
width: fit-content;
|
|
6
|
+
white-space: nowrap;
|
|
7
|
+
margin: 0;
|
|
7
8
|
|
|
8
9
|
&.qc-compact {
|
|
9
10
|
font-size: token-value(font size sm);
|
|
@@ -18,3 +19,10 @@
|
|
|
18
19
|
cursor: not-allowed;
|
|
19
20
|
}
|
|
20
21
|
}
|
|
22
|
+
|
|
23
|
+
.qc-label-text {
|
|
24
|
+
white-space: wrap;
|
|
25
|
+
margin: 0;
|
|
26
|
+
|
|
27
|
+
@include content-font(md, bold);
|
|
28
|
+
}
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
<td>Le chemin de l’image en thème clair.</td>
|
|
71
71
|
<td>Le chemin vers l’image dist/img/QUEBEC_couleur.svg de la trousse</td>
|
|
72
72
|
<td>Adresse de l’image du pied de page en thème clair (fond transparent, texte et drapeaux en
|
|
73
|
-
couleur, voir <a href="#piv-footer-ex-2">l’exemple de pied de page PIV personnalisé</a>).
|
|
73
|
+
couleur, voir <a href="#piv-footer-ex-2">l’exemple de pied de page du PIV personnalisé</a>).
|
|
74
74
|
</td>
|
|
75
75
|
</tr>
|
|
76
76
|
<tr>
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
<td>Le chemin de l’image en thème sombre.</td>
|
|
79
79
|
<td>Le chemin vers l’image dist/img/QUEBEC_blanc.svg de la trousse</td>
|
|
80
80
|
<td>Adresse de l’image du pied de page en thème sombre (fond transparent, texte et drapeaux en
|
|
81
|
-
blanc, voir <a href="#piv-footer-ex-2">l’exemple de pied de page PIV personnalisé</a>).
|
|
81
|
+
blanc, voir <a href="#piv-footer-ex-2">l’exemple de pied de page du PIV personnalisé</a>).
|
|
82
82
|
</td>
|
|
83
83
|
</tr>
|
|
84
84
|
<tr>
|
|
@@ -129,7 +129,7 @@
|
|
|
129
129
|
</table>
|
|
130
130
|
</div>
|
|
131
131
|
|
|
132
|
-
<qc-notice type="information">Les images du pied de page PIV doivent respecter
|
|
132
|
+
<qc-notice type="information">Les images du pied de page du PIV doivent respecter
|
|
133
133
|
<qc-external-link><a href="https://www.piv.gouv.qc.ca/fileadmin/documents/guide/section1_general.pdf">les
|
|
134
134
|
normes graphiques du système d’identification visuelle.</a>. Nous vous invitons à privilégier le format
|
|
135
135
|
SVG, qui permet de conserver la lisibilité de l’image en cas de zoom.
|
|
@@ -140,7 +140,7 @@
|
|
|
140
140
|
|
|
141
141
|
<p>Ci-dessous, les zones d’ajout de contenu HTML (balise <slot>) délimitées en pointillé.</p>
|
|
142
142
|
<qc-doc-exemple id="qc-piv-footer-slots"
|
|
143
|
-
caption="Présentation des zones d’ajout de contenu du pied de page PIV">
|
|
143
|
+
caption="Présentation des zones d’ajout de contenu du pied de page du PIV">
|
|
144
144
|
<qc-piv-footer>
|
|
145
145
|
<div style="border:2px dashed;padding: var(--qc-spacer-xs);">
|
|
146
146
|
Contenu par défaut
|
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
import IconButton from "../IconButton/IconButton.svelte";
|
|
3
3
|
import {Utils} from "../utils";
|
|
4
4
|
import Icon from "../../bases/Icon/Icon.svelte";
|
|
5
|
+
import Label from "../Label/Label.svelte";
|
|
5
6
|
|
|
6
7
|
const lang = Utils.getPageLanguage();
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
let {
|
|
10
11
|
value = $bindable(''),
|
|
12
|
+
label = '',
|
|
13
|
+
size = '',
|
|
11
14
|
ariaLabel = lang === "fr" ? "Rechercher..." : "Search...",
|
|
12
15
|
clearAriaLabel = lang === "fr" ? "Effacer le texte" : "Clear text",
|
|
13
16
|
leftIcon = false,
|
|
@@ -25,11 +28,20 @@
|
|
|
25
28
|
}
|
|
26
29
|
</script>
|
|
27
30
|
|
|
31
|
+
{#if label}
|
|
32
|
+
<Label
|
|
33
|
+
disabled={isDisabled}
|
|
34
|
+
text={label}
|
|
35
|
+
forId={id}
|
|
36
|
+
/>
|
|
37
|
+
{/if}
|
|
28
38
|
<div class={[
|
|
29
39
|
"qc-search-input",
|
|
30
40
|
leftIcon && "qc-search-left-icon",
|
|
31
41
|
leftIcon && isDisabled && "qc-search-left-icon-disabled"
|
|
32
|
-
]}
|
|
42
|
+
]}
|
|
43
|
+
size={size}>
|
|
44
|
+
|
|
33
45
|
{#if leftIcon}
|
|
34
46
|
<Icon type="search-thin"
|
|
35
47
|
iconColor="grey-regular"
|
|
@@ -40,7 +52,7 @@
|
|
|
40
52
|
bind:value
|
|
41
53
|
type="search"
|
|
42
54
|
autocomplete="off"
|
|
43
|
-
aria-label={ariaLabel}
|
|
55
|
+
aria-label={label ? undefined : ariaLabel}
|
|
44
56
|
class={isDisabled ? "qc-disabled" : ""}
|
|
45
57
|
id={id}
|
|
46
58
|
{...rest}
|
|
@@ -28,6 +28,16 @@
|
|
|
28
28
|
left-icon
|
|
29
29
|
clear-aria-label="Effacer le texte"
|
|
30
30
|
></qc-search-input>
|
|
31
|
+
|
|
32
|
+
<br>
|
|
33
|
+
|
|
34
|
+
<qc-search-input
|
|
35
|
+
label="Nom de l'article"
|
|
36
|
+
size="md"
|
|
37
|
+
placeholder="Rechercher un article"
|
|
38
|
+
clear-aria-label="Effacer le texte"
|
|
39
|
+
left-icon
|
|
40
|
+
></qc-search-input>
|
|
31
41
|
</qc-doc-exemple>
|
|
32
42
|
|
|
33
43
|
<h3>Documentation technique</h3>
|
|
@@ -75,10 +85,16 @@
|
|
|
75
85
|
<td>Désactive le champ.</td>
|
|
76
86
|
</tr>
|
|
77
87
|
<tr>
|
|
78
|
-
<td>
|
|
88
|
+
<td>label</td>
|
|
79
89
|
<td>Texte</td>
|
|
80
90
|
<td>""</td>
|
|
81
|
-
<td>
|
|
91
|
+
<td>Texte du libellé du champ. Remplace automatiquement l'aria-label lorsqu'il est défini.</td>
|
|
92
|
+
</tr>
|
|
93
|
+
<tr>
|
|
94
|
+
<td>size</td>
|
|
95
|
+
<td>"xs", "sm", "md", "lg", "xl"</td>
|
|
96
|
+
<td>""</td>
|
|
97
|
+
<td>Largeur du champ</td>
|
|
82
98
|
</tr>
|
|
83
99
|
</tbody>
|
|
84
100
|
</table>
|