@jjlmoya/utils-civic 1.4.0 → 1.5.0

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 (38) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -1
  3. package/src/entries.ts +4 -0
  4. package/src/index.ts +1 -0
  5. package/src/pages/[locale]/[slug].astro +7 -4
  6. package/src/tests/locale_completeness.test.ts +1 -1
  7. package/src/tests/tool_validation.test.ts +1 -1
  8. package/src/tool/civic-priority-matrix/bibliography.astro +6 -0
  9. package/src/tool/civic-priority-matrix/bibliography.ts +12 -0
  10. package/src/tool/civic-priority-matrix/civic-priority-matrix.css +531 -0
  11. package/src/tool/civic-priority-matrix/component.astro +108 -0
  12. package/src/tool/civic-priority-matrix/contract.test.ts +16 -0
  13. package/src/tool/civic-priority-matrix/controller.ts +168 -0
  14. package/src/tool/civic-priority-matrix/dom-views.ts +123 -0
  15. package/src/tool/civic-priority-matrix/entry.ts +28 -0
  16. package/src/tool/civic-priority-matrix/evaluator.ts +13 -0
  17. package/src/tool/civic-priority-matrix/i18n/de.ts +52 -0
  18. package/src/tool/civic-priority-matrix/i18n/en.ts +73 -0
  19. package/src/tool/civic-priority-matrix/i18n/es.ts +52 -0
  20. package/src/tool/civic-priority-matrix/i18n/fr.ts +50 -0
  21. package/src/tool/civic-priority-matrix/i18n/id.ts +50 -0
  22. package/src/tool/civic-priority-matrix/i18n/it.ts +50 -0
  23. package/src/tool/civic-priority-matrix/i18n/ja.ts +121 -0
  24. package/src/tool/civic-priority-matrix/i18n/ko.ts +121 -0
  25. package/src/tool/civic-priority-matrix/i18n/nl.ts +45 -0
  26. package/src/tool/civic-priority-matrix/i18n/pl.ts +35 -0
  27. package/src/tool/civic-priority-matrix/i18n/pt.ts +32 -0
  28. package/src/tool/civic-priority-matrix/i18n/ru.ts +32 -0
  29. package/src/tool/civic-priority-matrix/i18n/sv.ts +32 -0
  30. package/src/tool/civic-priority-matrix/i18n/tr.ts +32 -0
  31. package/src/tool/civic-priority-matrix/i18n/zh.ts +121 -0
  32. package/src/tool/civic-priority-matrix/index.ts +11 -0
  33. package/src/tool/civic-priority-matrix/logic.test.ts +68 -0
  34. package/src/tool/civic-priority-matrix/logic.ts +124 -0
  35. package/src/tool/civic-priority-matrix/seo.astro +12 -0
  36. package/src/tool/civic-priority-matrix/storage.ts +50 -0
  37. package/src/tool/civic-priority-matrix/ui.ts +96 -0
  38. package/src/tools.ts +2 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlmoya/utils-civic",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -1,4 +1,5 @@
1
1
  import { coalitionMajorityCalculator } from '../tool/coalition-majority-calculator/entry';
2
+ import { civicPriorityMatrix } from '../tool/civic-priority-matrix/entry';
2
3
  import { electionSeatApportionmentCalculator } from '../tool/election-seat-apportionment-calculator/entry';
3
4
  import { referendumThresholdCalculator } from '../tool/referendum-threshold-calculator/entry';
4
5
  import { voteSeatDisproportionalityAnalyzer } from '../tool/vote-seat-disproportionality-analyzer/entry';
@@ -6,7 +7,7 @@ import type { CategoryLocaleContent, KnownLocale } from '../types';
6
7
 
7
8
  export const civicCategory = {
8
9
  icon: 'mdi:bank-outline',
9
- tools: [coalitionMajorityCalculator, electionSeatApportionmentCalculator, referendumThresholdCalculator, voteSeatDisproportionalityAnalyzer],
10
+ tools: [civicPriorityMatrix, coalitionMajorityCalculator, electionSeatApportionmentCalculator, referendumThresholdCalculator, voteSeatDisproportionalityAnalyzer],
10
11
  i18n: {
11
12
  en: () => import('./i18n/en').then((m) => m.content),
12
13
  de: () => import('./i18n/de').then((m) => m.content),
package/src/entries.ts CHANGED
@@ -1,16 +1,20 @@
1
1
  export { electionSeatApportionmentCalculator } from './tool/election-seat-apportionment-calculator/entry';
2
2
  export type { ElectionSeatUI, ElectionSeatLocaleContent } from './tool/election-seat-apportionment-calculator/entry';
3
+ export { civicPriorityMatrix } from './tool/civic-priority-matrix/entry';
4
+ export type { CivicPriorityUI, CivicPriorityLocaleContent } from './tool/civic-priority-matrix/entry';
3
5
  export { voteSeatDisproportionalityAnalyzer } from './tool/vote-seat-disproportionality-analyzer/entry';
4
6
  export type { VoteSeatUI, VoteSeatLocaleContent } from './tool/vote-seat-disproportionality-analyzer/entry';
5
7
  export { civicCategory } from './category';
6
8
 
7
9
  import { coalitionMajorityCalculator } from './tool/coalition-majority-calculator/entry';
10
+ import { civicPriorityMatrix } from './tool/civic-priority-matrix/entry';
8
11
  import { electionSeatApportionmentCalculator } from './tool/election-seat-apportionment-calculator/entry';
9
12
  import { referendumThresholdCalculator } from './tool/referendum-threshold-calculator/entry';
10
13
  import { voteSeatDisproportionalityAnalyzer } from './tool/vote-seat-disproportionality-analyzer/entry';
11
14
 
12
15
  export const ALL_ENTRIES = [
13
16
  coalitionMajorityCalculator,
17
+ civicPriorityMatrix,
14
18
  electionSeatApportionmentCalculator,
15
19
  referendumThresholdCalculator,
16
20
  voteSeatDisproportionalityAnalyzer,
package/src/index.ts CHANGED
@@ -3,6 +3,7 @@ export const civicCategorySEO = () => import('./category/CivicCategorySEO.astro'
3
3
 
4
4
  export { electionSeatApportionmentCalculator, ELECTION_SEAT_APPORTIONMENT_CALCULATOR_TOOL } from './tool/election-seat-apportionment-calculator';
5
5
  export { referendumThresholdCalculator, REFERENDUM_THRESHOLD_CALCULATOR_TOOL } from './tool/referendum-threshold-calculator';
6
+ export { civicPriorityMatrix, CIVIC_PRIORITY_MATRIX_TOOL } from './tool/civic-priority-matrix';
6
7
  export { voteSeatDisproportionalityAnalyzer, VOTE_SEAT_DISPROPORTIONALITY_ANALYZER_TOOL } from './tool/vote-seat-disproportionality-analyzer';
7
8
 
8
9
  export type {
@@ -89,9 +89,12 @@ const toolCss = cssLoader ? await cssLoader() : "";
89
89
 
90
90
  const seoContent: UtilitySEOContent = { locale, sections: content.seo ?? [] };
91
91
 
92
- const words = content.title.split(" ");
93
- const titleHighlight = words[0] || "";
94
- const titleBase = words.slice(1).join(" ") || "";
92
+ const words = content.title.split(/\s+/).filter(Boolean);
93
+ const titleParts = words.length > 1
94
+ ? [words[0] || "", words.slice(1).join(" ")]
95
+ : [content.title.slice(0, Math.ceil(content.title.length / 2)), content.title.slice(Math.ceil(content.title.length / 2))];
96
+ const titleHighlight = titleParts[0] || "";
97
+ const titleBase = titleParts[1] || "";
95
98
  ---
96
99
 
97
100
  <PreviewLayout
@@ -126,7 +129,7 @@ const titleBase = words.slice(1).join(" ") || "";
126
129
  />
127
130
 
128
131
  <section class="section-tool">
129
- <Component ui={content.ui} />
132
+ <Component ui={content.ui} locale={locale} />
130
133
  </section>
131
134
 
132
135
  <section class="section-seo">
@@ -18,6 +18,6 @@ describe('Locale Completeness Validation', () => {
18
18
  });
19
19
 
20
20
  it('all tools registered', () => {
21
- expect(ALL_TOOLS.length).toBe(4);
21
+ expect(ALL_TOOLS.length).toBe(5);
22
22
  });
23
23
  });
@@ -5,7 +5,7 @@ import { civicCategory } from '../data';
5
5
  describe('Tool Validation Suite', () => {
6
6
  describe('Library Registration', () => {
7
7
  it('should have tools in ALL_TOOLS', () => {
8
- expect(ALL_TOOLS.length).toBe(4);
8
+ expect(ALL_TOOLS.length).toBe(5);
9
9
  });
10
10
 
11
11
  it('civicCategory should be defined', () => {
@@ -0,0 +1,6 @@
1
+ ---
2
+ import { Bibliography } from '@jjlmoya/utils-shared';
3
+ import { bibliography } from './bibliography';
4
+ ---
5
+
6
+ <Bibliography links={bibliography} />
@@ -0,0 +1,12 @@
1
+ import type { BibliographyEntry } from '../../types';
2
+
3
+ export const bibliography: BibliographyEntry[] = [
4
+ {
5
+ name: "Ministère de l'Economie, des Finances et de la Souveraineté industrielle et numérique, Matrice Impact-Effort",
6
+ url: 'https://www.economie.gouv.fr/mission-innovation/boite-outils/prendre-une-decision',
7
+ },
8
+ {
9
+ name: 'Government Digital Service, Deciding on priorities',
10
+ url: 'https://www.gov.uk/service-manual/agile-delivery/deciding-on-priorities',
11
+ },
12
+ ];
@@ -0,0 +1,531 @@
1
+ :root {
2
+ --n-page: #f4f0e7;
3
+ --n-surface: #fffdf8;
4
+ --n-surface-soft: #f0ebe0;
5
+ --n-ink: #20252a;
6
+ --n-muted: #687078;
7
+ --n-line: #d7d0c2;
8
+ --n-accent: #a34f35;
9
+ --n-accent-dark: #743725;
10
+ --n-plan: #dce8eb;
11
+ --n-act: #f2d9c5;
12
+ --n-defer: #e9e5dc;
13
+ --n-quick: #dfe7cf;
14
+ --n-warning: #8b5b22;
15
+ --n-focus: #155d78;
16
+ --n-shadow: transparent;
17
+ }
18
+
19
+ .theme-dark {
20
+ --n-page: #17191c;
21
+ --n-surface: #23272b;
22
+ --n-surface-soft: #2c3136;
23
+ --n-ink: #f4f0e7;
24
+ --n-muted: #b9c0c5;
25
+ --n-line: #525a61;
26
+ --n-accent: #e49a78;
27
+ --n-accent-dark: #ffc3a5;
28
+ --n-plan: #2a4048;
29
+ --n-act: #553a2e;
30
+ --n-defer: #363631;
31
+ --n-quick: #34402e;
32
+ --n-warning: #f0bf6a;
33
+ --n-focus: #84d3ed;
34
+ --n-shadow: transparent;
35
+ }
36
+
37
+ .civic-priority-tool {
38
+ --n-local-page: var(--n-page);
39
+ --n-local-surface: var(--n-surface);
40
+ --n-local-surface-soft: var(--n-surface-soft);
41
+ --n-local-ink: var(--n-ink);
42
+ --n-local-muted: var(--n-muted);
43
+ --n-local-line: var(--n-line);
44
+ --n-local-accent: var(--n-accent);
45
+ --n-local-accent-dark: var(--n-accent-dark);
46
+ --n-local-plan: var(--n-plan);
47
+ --n-local-act: var(--n-act);
48
+ --n-local-defer: var(--n-defer);
49
+ --n-local-quick: var(--n-quick);
50
+ --n-local-warning: var(--n-warning);
51
+ --n-local-focus: var(--n-focus);
52
+ --n-local-shadow: var(--n-shadow);
53
+
54
+ display: block;
55
+ color: var(--n-local-ink);
56
+ }
57
+
58
+ .priority-main-surface {
59
+ background: var(--n-local-surface);
60
+ border: 1px solid var(--n-local-line);
61
+ border-radius: 1.25rem;
62
+ overflow: hidden;
63
+ }
64
+
65
+ .priority-main-flow {
66
+ display: grid;
67
+ grid-template-columns: minmax(20rem, .85fr) minmax(34rem, 1.15fr);
68
+ align-items: start;
69
+ }
70
+
71
+ .priority-control-surface,
72
+ .priority-result-surface {
73
+ padding: clamp(1rem, 2vw, 1.5rem);
74
+ }
75
+
76
+ .priority-control-surface {
77
+ border-right: 1px solid var(--n-local-line);
78
+ }
79
+
80
+ .priority-control-header,
81
+ .priority-result-heading,
82
+ .priority-control-footer {
83
+ display: flex;
84
+ align-items: flex-start;
85
+ justify-content: space-between;
86
+ gap: 1rem;
87
+ }
88
+
89
+ .priority-kicker {
90
+ margin: 0;
91
+ color: var(--n-local-accent-dark);
92
+ font-size: .75rem;
93
+ font-weight: 800;
94
+ letter-spacing: .08em;
95
+ text-transform: uppercase;
96
+ }
97
+
98
+ .priority-input-hint,
99
+ .priority-summary,
100
+ .priority-scale-note,
101
+ .priority-form-status,
102
+ .priority-method-card p {
103
+ color: var(--n-local-muted);
104
+ font-size: .9rem;
105
+ line-height: 1.55;
106
+ }
107
+
108
+ .priority-input-hint,
109
+ .priority-summary,
110
+ .priority-form-status {
111
+ margin: .35rem 0 0;
112
+ }
113
+
114
+ .priority-add,
115
+ .priority-reset {
116
+ border: 1px solid var(--n-local-accent);
117
+ border-radius: .7rem;
118
+ cursor: pointer;
119
+ font: inherit;
120
+ font-weight: 750;
121
+ padding: .7rem .95rem;
122
+ }
123
+
124
+ .priority-add {
125
+ background: var(--n-local-accent);
126
+ color: var(--n-local-surface);
127
+ }
128
+
129
+ .priority-reset {
130
+ background: transparent;
131
+ color: var(--n-local-accent-dark);
132
+ }
133
+
134
+ .priority-add:focus-visible,
135
+ .priority-reset:focus-visible,
136
+ .priority-remove:focus-visible,
137
+ .priority-input:focus-visible {
138
+ outline: 3px solid var(--n-local-focus);
139
+ outline-offset: 2px;
140
+ }
141
+
142
+ .priority-scale-note {
143
+ display: flex;
144
+ flex-wrap: wrap;
145
+ gap: .4rem 1rem;
146
+ margin: 1rem 0;
147
+ }
148
+
149
+ .priority-scale-note span:first-child {
150
+ color: var(--n-local-ink);
151
+ font-weight: 750;
152
+ }
153
+
154
+ .priority-initiative-list {
155
+ display: grid;
156
+ gap: .6rem;
157
+ }
158
+
159
+ .priority-initiative-row {
160
+ position: relative;
161
+ display: grid;
162
+ grid-template-columns: minmax(10rem, 2fr) repeat(3, minmax(3rem, .65fr));
163
+ align-items: end;
164
+ gap: .5rem;
165
+ padding: .65rem 2rem .75rem .7rem;
166
+ border-bottom: 1px solid var(--n-local-line);
167
+ }
168
+
169
+ .priority-field-control {
170
+ display: grid;
171
+ gap: .3rem;
172
+ color: var(--n-local-muted);
173
+ font-size: .75rem;
174
+ font-weight: 700;
175
+ }
176
+
177
+ .priority-input {
178
+ width: 100%;
179
+ box-sizing: border-box;
180
+ border: 1px solid var(--n-local-line);
181
+ border-radius: .55rem;
182
+ background: var(--n-local-surface-soft);
183
+ color: var(--n-local-ink);
184
+ font: inherit;
185
+ font-weight: 650;
186
+ min-height: 2.7rem;
187
+ padding: .55rem .65rem;
188
+ }
189
+
190
+ .priority-input[aria-invalid="true"] {
191
+ border-color: var(--n-local-accent);
192
+ box-shadow: 0 0 0 2px var(--n-local-shadow);
193
+ }
194
+
195
+ .priority-remove {
196
+ position: absolute;
197
+ top: .7rem;
198
+ right: 0;
199
+ border: 0;
200
+ background: transparent;
201
+ color: var(--n-local-muted);
202
+ cursor: pointer;
203
+ font-size: 1.4rem;
204
+ line-height: 1;
205
+ padding: .45rem;
206
+ }
207
+
208
+ .priority-row-error {
209
+ grid-column: 1 / -1;
210
+ margin: -.3rem 0 0;
211
+ color: var(--n-local-accent-dark);
212
+ font-size: .75rem;
213
+ min-height: 1rem;
214
+ }
215
+
216
+ .priority-row-error:empty {
217
+ display: none;
218
+ }
219
+
220
+ .priority-control-footer {
221
+ align-items: center;
222
+ margin-top: 1rem;
223
+ }
224
+
225
+ .priority-form-status {
226
+ color: var(--n-local-accent-dark);
227
+ text-align: right;
228
+ }
229
+
230
+ .priority-result-surface {
231
+ padding-top: clamp(1.25rem, 3vw, 2rem);
232
+ padding-bottom: clamp(1.25rem, 3vw, 2rem);
233
+ }
234
+
235
+ .priority-empty-mark::before,
236
+ .priority-empty-mark::after {
237
+ position: absolute;
238
+ content: '';
239
+ background: var(--n-local-accent);
240
+ }
241
+
242
+ .priority-empty-mark::before {
243
+ top: 50%;
244
+ left: 15%;
245
+ width: 70%;
246
+ height: 1px;
247
+ }
248
+
249
+ .priority-empty-mark::after {
250
+ top: 15%;
251
+ left: 50%;
252
+ width: 1px;
253
+ height: 70%;
254
+ }
255
+
256
+ .priority-scene-wrap {
257
+ margin: 1rem -0.25rem 0;
258
+ padding: .5rem;
259
+ border: 1px solid var(--n-local-line);
260
+ border-radius: 1rem;
261
+ background: var(--n-local-page);
262
+ }
263
+
264
+ .priority-scene {
265
+ min-height: 18rem;
266
+ }
267
+
268
+ .priority-field {
269
+ display: block;
270
+ width: 100%;
271
+ max-height: 27rem;
272
+ }
273
+
274
+ .priority-quadrant-plan { fill: var(--n-local-plan); }
275
+ .priority-quadrant-act { fill: var(--n-local-act); }
276
+ .priority-quadrant-defer { fill: var(--n-local-defer); }
277
+ .priority-quadrant-quick { fill: var(--n-local-quick); }
278
+ .priority-axis {
279
+ fill: none;
280
+ stroke: var(--n-local-line);
281
+ stroke-width: 2;
282
+ }
283
+
284
+ .priority-axis-label,
285
+ .priority-quadrant-label {
286
+ fill: var(--n-local-muted);
287
+ font-size: 12px;
288
+ font-weight: 750;
289
+ letter-spacing: .05em;
290
+ text-transform: uppercase;
291
+ }
292
+
293
+ .priority-axis-end {
294
+ fill: var(--n-local-muted);
295
+ font-size: 10px;
296
+ font-weight: 650;
297
+ }
298
+
299
+ .priority-point circle {
300
+ stroke: var(--n-local-surface);
301
+ stroke-width: 3;
302
+ }
303
+
304
+ .priority-point text {
305
+ fill: var(--n-local-ink);
306
+ font-size: 12px;
307
+ font-weight: 750;
308
+ }
309
+
310
+ .priority-point .priority-point-score {
311
+ fill: var(--n-local-muted);
312
+ font-size: 10px;
313
+ font-weight: 600;
314
+ }
315
+ .priority-point-act-now circle { fill: var(--n-local-accent); }
316
+ .priority-point-plan circle { fill: var(--n-local-focus); }
317
+ .priority-point-quick-response circle { fill: var(--n-local-warning); }
318
+ .priority-point-defer circle { fill: var(--n-local-muted); }
319
+
320
+ .priority-legend {
321
+ display: flex;
322
+ flex-wrap: wrap;
323
+ gap: .5rem 1rem;
324
+ padding: .7rem .5rem .2rem;
325
+ color: var(--n-local-muted);
326
+ font-size: .78rem;
327
+ font-weight: 700;
328
+ }
329
+
330
+ .priority-legend span {
331
+ display: inline-flex;
332
+ align-items: center;
333
+ gap: .35rem;
334
+ }
335
+
336
+ .priority-legend-dot {
337
+ width: .65rem;
338
+ height: .65rem;
339
+ border-radius: 50%;
340
+ }
341
+
342
+ .priority-dot-plan { background: var(--n-local-focus); }
343
+ .priority-dot-act { background: var(--n-local-accent); }
344
+ .priority-dot-defer { background: var(--n-local-muted); }
345
+ .priority-dot-quick { background: var(--n-local-warning); }
346
+
347
+ .priority-ranking-block {
348
+ margin-top: 1.25rem;
349
+ }
350
+
351
+ .priority-ranking-block h2,
352
+ .priority-method-card h2 {
353
+ margin: 0 0 .65rem;
354
+ font-size: 1rem;
355
+ }
356
+
357
+ .priority-ranking-table {
358
+ width: 100%;
359
+ border-collapse: collapse;
360
+ font-size: .86rem;
361
+ }
362
+
363
+ .priority-ranking-table th,
364
+ .priority-ranking-table td {
365
+ padding: .7rem .45rem;
366
+ border-bottom: 1px solid var(--n-local-line);
367
+ text-align: left;
368
+ vertical-align: middle;
369
+ }
370
+
371
+ .priority-header-cell {
372
+ color: var(--n-local-muted);
373
+ font-size: .7rem;
374
+ letter-spacing: .06em;
375
+ text-transform: uppercase;
376
+ }
377
+
378
+ .priority-rank-cell {
379
+ color: var(--n-local-accent-dark);
380
+ font-weight: 850;
381
+ }
382
+
383
+ .priority-badge {
384
+ display: inline-block;
385
+ border-radius: 999px;
386
+ padding: .25rem .5rem;
387
+ font-size: .72rem;
388
+ font-weight: 800;
389
+ white-space: nowrap;
390
+ }
391
+
392
+ .priority-badge-warm {
393
+ background: var(--n-local-act);
394
+ color: var(--n-local-accent-dark);
395
+ }
396
+
397
+ .priority-badge-cool {
398
+ background: var(--n-local-plan);
399
+ color: var(--n-local-focus);
400
+ }
401
+
402
+ .priority-badge-bright {
403
+ background: var(--n-local-quick);
404
+ color: var(--n-local-warning);
405
+ }
406
+
407
+ .priority-badge-quiet {
408
+ background: var(--n-local-defer);
409
+ color: var(--n-local-muted);
410
+ }
411
+
412
+ .priority-warnings {
413
+ display: grid;
414
+ gap: .35rem;
415
+ margin-top: .8rem;
416
+ }
417
+
418
+ .priority-warning {
419
+ margin: 0;
420
+ border-left: 3px solid var(--n-local-warning);
421
+ color: var(--n-local-warning);
422
+ font-size: .82rem;
423
+ line-height: 1.5;
424
+ padding: .35rem .7rem;
425
+ }
426
+
427
+ .priority-empty {
428
+ display: grid;
429
+ min-height: 16rem;
430
+ place-items: center;
431
+ align-content: center;
432
+ gap: 1rem;
433
+ color: var(--n-local-muted);
434
+ text-align: center;
435
+ }
436
+
437
+ .priority-empty-mark {
438
+ position: relative;
439
+ width: 4rem;
440
+ height: 4rem;
441
+ border: 1px solid var(--n-local-accent);
442
+ border-radius: 50%;
443
+ }
444
+
445
+ .priority-empty p {
446
+ max-width: 24rem;
447
+ margin: 0;
448
+ }
449
+
450
+ .priority-method-grid {
451
+ display: grid;
452
+ grid-template-columns: repeat(3, minmax(0, 1fr));
453
+ padding: clamp(1.25rem, 3vw, 2rem) clamp(1rem, 2vw, 1.5rem);
454
+ }
455
+
456
+ .priority-method-card {
457
+ padding: 0 1rem;
458
+ }
459
+
460
+ .priority-method-card + .priority-method-card {
461
+ border-left: 1px solid var(--n-local-line);
462
+ }
463
+
464
+ .priority-method-card p {
465
+ margin: 0;
466
+ }
467
+
468
+ .visually-hidden {
469
+ position: absolute;
470
+ width: 1px;
471
+ height: 1px;
472
+ overflow: hidden;
473
+ clip-path: inset(50%);
474
+ white-space: nowrap;
475
+ }
476
+
477
+ @media (max-width: 980px) {
478
+ .priority-main-flow {
479
+ grid-template-columns: 1fr;
480
+ }
481
+
482
+ .priority-control-surface {
483
+ border-right: 0;
484
+ border-bottom: 1px solid var(--n-local-line);
485
+ }
486
+ }
487
+
488
+ @media (max-width: 700px) {
489
+ .priority-control-header,
490
+ .priority-control-footer,
491
+ .priority-result-heading {
492
+ flex-direction: column;
493
+ }
494
+
495
+ .priority-add,
496
+ .priority-reset {
497
+ width: 100%;
498
+ }
499
+
500
+ .priority-initiative-row {
501
+ grid-template-columns: minmax(0, 1fr) repeat(3, minmax(3.5rem, 1fr));
502
+ gap: .4rem;
503
+ padding-right: 2rem;
504
+ padding-left: 0;
505
+ }
506
+
507
+ .priority-field-control {
508
+ font-size: .68rem;
509
+ }
510
+
511
+ .priority-ranking-table {
512
+ display: block;
513
+ overflow-x: auto;
514
+ white-space: nowrap;
515
+ }
516
+
517
+ .priority-method-grid {
518
+ grid-template-columns: 1fr;
519
+ }
520
+
521
+ .priority-method-card {
522
+ padding: 0;
523
+ }
524
+
525
+ .priority-method-card + .priority-method-card {
526
+ margin-top: 1.25rem;
527
+ padding-top: 1.25rem;
528
+ border-top: 1px solid var(--n-local-line);
529
+ border-left: 0;
530
+ }
531
+ }