@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.
- package/package.json +1 -1
- package/src/category/index.ts +2 -1
- package/src/entries.ts +4 -0
- package/src/index.ts +1 -0
- package/src/pages/[locale]/[slug].astro +7 -4
- package/src/tests/locale_completeness.test.ts +1 -1
- package/src/tests/tool_validation.test.ts +1 -1
- package/src/tool/civic-priority-matrix/bibliography.astro +6 -0
- package/src/tool/civic-priority-matrix/bibliography.ts +12 -0
- package/src/tool/civic-priority-matrix/civic-priority-matrix.css +531 -0
- package/src/tool/civic-priority-matrix/component.astro +108 -0
- package/src/tool/civic-priority-matrix/contract.test.ts +16 -0
- package/src/tool/civic-priority-matrix/controller.ts +168 -0
- package/src/tool/civic-priority-matrix/dom-views.ts +123 -0
- package/src/tool/civic-priority-matrix/entry.ts +28 -0
- package/src/tool/civic-priority-matrix/evaluator.ts +13 -0
- package/src/tool/civic-priority-matrix/i18n/de.ts +52 -0
- package/src/tool/civic-priority-matrix/i18n/en.ts +73 -0
- package/src/tool/civic-priority-matrix/i18n/es.ts +52 -0
- package/src/tool/civic-priority-matrix/i18n/fr.ts +50 -0
- package/src/tool/civic-priority-matrix/i18n/id.ts +50 -0
- package/src/tool/civic-priority-matrix/i18n/it.ts +50 -0
- package/src/tool/civic-priority-matrix/i18n/ja.ts +121 -0
- package/src/tool/civic-priority-matrix/i18n/ko.ts +121 -0
- package/src/tool/civic-priority-matrix/i18n/nl.ts +45 -0
- package/src/tool/civic-priority-matrix/i18n/pl.ts +35 -0
- package/src/tool/civic-priority-matrix/i18n/pt.ts +32 -0
- package/src/tool/civic-priority-matrix/i18n/ru.ts +32 -0
- package/src/tool/civic-priority-matrix/i18n/sv.ts +32 -0
- package/src/tool/civic-priority-matrix/i18n/tr.ts +32 -0
- package/src/tool/civic-priority-matrix/i18n/zh.ts +121 -0
- package/src/tool/civic-priority-matrix/index.ts +11 -0
- package/src/tool/civic-priority-matrix/logic.test.ts +68 -0
- package/src/tool/civic-priority-matrix/logic.ts +124 -0
- package/src/tool/civic-priority-matrix/seo.astro +12 -0
- package/src/tool/civic-priority-matrix/storage.ts +50 -0
- package/src/tool/civic-priority-matrix/ui.ts +96 -0
- package/src/tools.ts +2 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
3
|
+
import type { CivicPriorityLocaleContent } from '../entry';
|
|
4
|
+
import type { CivicPriorityUI } from '../ui';
|
|
5
|
+
|
|
6
|
+
const ui: CivicPriorityUI = {
|
|
7
|
+
addInitiative: 'Dodaj inicjatywę', initiativeList: 'Inicjatywy do oceny', inputHint: 'Przed porównaniem przypisz każdej propozycji tę samą skalę od 1 do 5.', initiative: 'Inicjatywa', impact: 'Wpływ', urgency: 'Pilność', effort: 'Wysiłek', scoreScale: 'Oceń od 1 do 5', scoreHint: 'Wyższa wartość oznacza większy wpływ, pilność lub wysiłek.', removeInitiative: 'Usuń inicjatywę', reset: 'Przywróć przykład', resultTitle: 'Pole decyzji', rankingTitle: 'Wyjaśnialna kolejność', matrixLabel: 'Inicjatywy rozmieszczone według wpływu i pilności', summaryPrefix: 'Wyświetlane inicjatywy:', summarySuffix: 'ocenionych', rank: 'Miejsce', priorityScore: 'Wynik priorytetu', denominator: 'Mianownik wysiłku', quadrant: 'Ćwiartka', emptyState: 'Dodaj inicjatywę, aby otworzyć pole decyzji.', invalidState: 'Popraw zaznaczone wartości, aby obliczyć kolejność priorytetów.', nameRequired: 'Nazwa jest wymagana.', impactInvalid: 'Wpływ musi być liczbą całkowitą od 1 do 5.', urgencyInvalid: 'Pilność musi być liczbą całkowitą od 1 do 5.', effortInvalid: 'Wysiłek musi być liczbą całkowitą od 0 do 5.', actNow: 'Działaj teraz', plan: 'Zaplanuj', quickResponse: 'Zareaguj szybko', defer: 'Odłóż', highImpact: 'Duży wpływ', lowImpact: 'Mały wpływ', highUrgency: 'Wysoka pilność', lowUrgency: 'Niska pilność', methodTitle: 'Zastosowana metoda', methodText: 'Wynik priorytetu to wpływ pomnożony przez pilność i podzielony przez wysiłek. Wpływ, pilność i wysiłek mają widoczną skalę od 1 do 5. Wysiłek 0 traktuje się jako 1, aby bezpłatne lub już przygotowane działanie zachowało skończony wynik. Przy remisie kolejność porównuje wpływ, pilność, mniejszy wysiłek, a następnie kolejność wpisania.', notDoTitle: 'Czego to narzędzie nie robi', notDoText: 'Nie ustala obiektywnej wartości społecznej, nie mierzy automatycznie rezultatów i nie zastępuje narady. Wysoki wynik to przejrzysty scenariusz oparty na założeniach, a nie nakaz ani prognoza korzyści publicznej.', edgeCasesTitle: 'Przypadki brzegowe i ostrzeżenia', edgeCasesText: 'W każdej linii używaj tego samego znaczenia oceny. Brakująca lub niecałkowita wartość wyklucza wiersz do czasu poprawy. Wartość 3 oddziela stronę wysoką od niskiej. Równe wyniki zachowują stabilną kolejność po zastosowaniu opisanych reguł rozstrzygania. Podczas rozmowy grupowej zmieniaj jedną ocenę naraz.', warningTitle: 'Sprawdź przed decyzją', zeroEffortWarning: 'Wysiłek 0 używa mianownika 1, aby wynik pozostał skończony i porównywalny.', invalidRowsWarning: 'Niektóre wiersze są wykluczone do czasu poprawy zaznaczonych wartości.', noInitiatives: 'Nie wpisano jeszcze żadnych inicjatyw.', scoreOutOf: 'z maksymalnie 25',
|
|
8
|
+
};
|
|
9
|
+
const softwareApplication: SoftwareApplication = { '@type': 'SoftwareApplication', name: 'Macierz priorytetów obywatelskich', applicationCategory: 'BusinessApplication', operatingSystem: 'Any', description: 'Oceniaj inicjatywy obywatelskie według wpływu, pilności i wysiłku, aby utworzyć wyjaśnialną kolejność priorytetów.', url: 'https://gamebob.dev/pl/macierz-priorytetow-inicjatyw-obywatelskich', offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' } };
|
|
10
|
+
const faqPage: FAQPage = { '@type': 'FAQPage', mainEntity: [
|
|
11
|
+
{ '@type': 'Question', name: 'Jak oblicza się wynik priorytetu?', acceptedAnswer: { '@type': 'Answer', text: 'Pomnóż wpływ przez pilność i podziel przez wysiłek. Wysiłek 0 używa mianownika 1, aby nie powstał nieskończony wynik.' } },
|
|
12
|
+
{ '@type': 'Question', name: 'Co oznacza pozycja w ćwiartce?', acceptedAnswer: { '@type': 'Answer', text: 'Wpływ i pilność od 3 do 5 są po stronie wysokiej. Cztery strefy sugerują działanie, planowanie, szybką reakcję albo odłożenie.' } },
|
|
13
|
+
{ '@type': 'Question', name: 'Czy wysoki wynik dowodzi, że inicjatywa jest najlepsza?', acceptedAnswer: { '@type': 'Answer', text: 'Nie. Wynik odzwierciedla założenia grupy. Nie mierzy obiektywnej wartości społecznej i nie zastępuje rozmowy z osobami, których dotyczy decyzja.' } },
|
|
14
|
+
{ '@type': 'Question', name: 'Dlaczego dwie inicjatywy mogą mieć ten sam wynik?', acceptedAnswer: { '@type': 'Answer', text: 'Różne kombinacje wpływu, pilności i wysiłku mogą dać ten sam iloraz. Przejrzyste reguły rozstrzygają kolejność.' } },
|
|
15
|
+
] };
|
|
16
|
+
const howTo: HowTo = { '@type': 'HowTo', name: 'Utwórz wyjaśnialną kolejność priorytetów obywatelskich', step: [
|
|
17
|
+
{ '@type': 'HowToStep', name: 'Wpisz inicjatywy', text: 'Wpisz jedną jasno nazwaną propozycję w każdym wierszu i nie łącz kilku działań.' }, { '@type': 'HowToStep', name: 'Uzgodnij skalę', text: 'Ustal znaczenie wpływu, pilności i wysiłku, a potem stosuj skalę od 1 do 5 tak samo w każdej linii.' }, { '@type': 'HowToStep', name: 'Odczytaj pole decyzji', text: 'Potraktuj cztery strefy jako punkt rozmowy i sprawdź, czy 3 jest wspólną granicą.' }, { '@type': 'HowToStep', name: 'Sprawdź kolejność', text: 'Porównaj każdy wynik z trzema wartościami wejściowymi i mianownikiem wysiłku.' }, { '@type': 'HowToStep', name: 'Zapisz decyzję', text: 'Użyj listy jako agendy i dodaj dowody, odpowiedzialność, ograniczenia oraz głosy osób dotkniętych decyzją.' },
|
|
18
|
+
] };
|
|
19
|
+
export const content: CivicPriorityLocaleContent = {
|
|
20
|
+
slug: 'macierz-priorytetow-inicjatyw-obywatelskich', title: 'Macierz priorytetów obywatelskich', description: 'Uszereguj inicjatywy obywatelskie za pomocą przejrzystych ocen wpływu, pilności i wysiłku. Zobacz, co wymaga działania, planu, szybkiej reakcji albo późniejszego przeglądu.', ui,
|
|
21
|
+
seo: [
|
|
22
|
+
{ type: 'title', text: 'Zamień pomysły obywatelskie we wspólną kolejność priorytetów', level: 2 }, { type: 'paragraph', html: 'Grupy często mają więcej dobrych propozycji niż czasu, pieniędzy lub osób potrzebnych do ich realizacji. Macierz zadaje każdej inicjatywie te same trzy pytania: jak duże znaczenie może mieć zmiana, jak pilny jest problem i ile wysiłku wymaga wykonanie? Wynik tworzy widoczny punkt wyjścia do rozmowy o kolejności i dostępnych zasobach, ale nie zastępuje wspólnej decyzji.' },
|
|
23
|
+
{ type: 'title', text: 'Jak działa wynik priorytetu', level: 2 }, { type: 'paragraph', html: 'Wzór to wpływ pomnożony przez pilność i podzielony przez wysiłek. Inicjatywa z wpływem 5, pilnością 4 i wysiłkiem 2 otrzymuje 10 punktów. To zwięzła heurystyka, a nie pomiar wartości społecznej. Jej zaletą jest widoczność każdego założenia, dzięki czemu uczestnicy mogą powtórzyć rachunek i rozmawiać o różnicach ocen.' },
|
|
24
|
+
{ type: 'table', headers: ['Wartość', 'Skala', 'Pytanie dla grupy'], rows: [['Wpływ', '1 do 5', 'Jak wiele może znaczyć ta zmiana dla osób lub wyniku, którego dotyczy?'], ['Pilność', '1 do 5', 'Jaki jest koszt czekania albo presja czasu?'], ['Wysiłek', '0 do 5', 'Jak trudne, kosztowne lub zasobochłonne będzie wykonanie?']] },
|
|
25
|
+
{ type: 'title', text: 'Odczytaj cztery strefy decyzji', level: 2 }, { type: 'paragraph', html: 'Pole umieszcza inicjatywy według wpływu i pilności, a 3 jest granicą na obu osiach. Działaj teraz oznacza wysoki wpływ i wysoką pilność. Zaplanuj oznacza wysoki wpływ przy mniejszej pilności. Zareaguj szybko wskazuje mniejszy wpływ i dużą pilność, gdy mała interwencja może zmniejszyć presję. Odłóż obejmuje niskie wartości i oznacza późniejszy przegląd, nie automatyczne odrzucenie.' },
|
|
26
|
+
{ type: 'list', items: ['Uzgodnij najpierw, co wpływ oznacza dla tej grupy.', 'Używaj tego samego horyzontu czasu przy ocenie pilności.', 'Traktuj wysiłek jako potrzebne zasoby, nie karę za niepopularny pomysł.', 'Czytaj trzy składowe obok każdego miejsca w rankingu.', 'Oceń ponownie po nowych dowodach, zmianie terminu lub dostępności zasobów.'] },
|
|
27
|
+
{ type: 'title', text: 'Wykorzystaj wynik w rozmowie obywatelskiej', level: 2 }, { type: 'paragraph', html: 'Macierz jest najmocniejsza, gdy kilka osób ocenia te same inicjatywy i tłumaczy różnice. Jedna osoba może przyznać wysoki wpływ działaniu, które głęboko pomaga małej grupie, a inna obniżyć go z powodu ograniczonego zasięgu. Taka różnica pokazuje kryterium wymagające doprecyzowania. Zapisz powody i uwzględnione głosy zamiast ukrywać rozbieżność.' },
|
|
28
|
+
{ type: 'tip', title: 'Wynik to zadeklarowany scenariusz', html: 'Wysoki wynik oznacza tylko, że wprowadzona kombinacja znalazła się wysoko według tego wzoru. Nie dowodzi sprawiedliwości, nie tworzy obowiązku prawnego, nie przewiduje rezultatów i nie zastępuje publicznego procesu decyzyjnego. Zachowaj uzasadnienia ocen przy każdej decyzji opartej na tej kolejności.' },
|
|
29
|
+
{ type: 'title', text: 'Ograniczenia i przypadki szczególne', level: 2 }, { type: 'paragraph', html: 'Wysiłek 0 otrzymuje mianownik 1, aby nie tworzyć nieskończonego wyniku. Brakująca, ułamkowa lub poza zakresem wartość wyklucza wiersz do czasu poprawy. Równe wyniki są rozstrzygane według opisanych zasad, a potem zachowują kolejność wpisania. Ćwiartka nie jest analizą ryzyka: pilna inicjatywa o dużym wpływie może nadal wymagać oceny prawnej, finansowej, bezpieczeństwa lub dostępności.' },
|
|
30
|
+
], faq: [
|
|
31
|
+
{ question: 'Jak oblicza się wynik priorytetu?', answer: 'Pomnóż wpływ przez pilność i podziel przez wysiłek. Dla wysiłku 0 mianownik wynosi 1.' }, { question: 'Co oznacza pozycja w polu?', answer: 'Wpływ i pilność od 3 są po stronie wysokiej. Cztery strefy pomagają omówić kolejność.' }, { question: 'Czy wysoki wynik oznacza najlepszą inicjatywę?', answer: 'Nie. To przejrzysty wynik oparty na zadeklarowanych założeniach, a nie dowód wartości społecznej.' }, { question: 'Dlaczego wyniki bywają równe?', answer: 'Różne dane mogą dać ten sam iloraz. Reguły rozstrzygające utrzymują kolejność możliwą do odtworzenia.' },
|
|
32
|
+
], bibliography, howTo: [
|
|
33
|
+
{ name: 'Wpisz inicjatywy', text: 'Dodaj jedną jasno opisaną propozycję w każdym wierszu.' }, { name: 'Uzgodnij skalę', text: 'Stosuj to samo znaczenie wartości od 1 do 5.' }, { name: 'Odczytaj pole', text: 'Użyj czterech stref do rozmowy o kolejności.' }, { name: 'Sprawdź ranking', text: 'Porównaj miejsce z wpływem, pilnością, wysiłkiem i mianownikiem.' }, { name: 'Dodaj dowody', text: 'Zapisz ograniczenia i głosy osób dotkniętych decyzją.' },
|
|
34
|
+
], schemas: [softwareApplication, faqPage, howTo] as unknown as Record<string, unknown>[],
|
|
35
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
3
|
+
import type { CivicPriorityLocaleContent } from '../entry';
|
|
4
|
+
import type { CivicPriorityUI } from '../ui';
|
|
5
|
+
|
|
6
|
+
const ui: CivicPriorityUI = {
|
|
7
|
+
addInitiative: 'Adicionar iniciativa', initiativeList: 'Iniciativas para avaliar', inputHint: 'Dê a cada proposta a mesma escala de 1 a 5 antes de compará-las.', initiative: 'Iniciativa', impact: 'Impacto', urgency: 'Urgência', effort: 'Esforço', scoreScale: 'Pontue de 1 a 5', scoreHint: 'Um valor maior indica mais impacto, urgência ou esforço.', removeInitiative: 'Remover iniciativa', reset: 'Restaurar exemplo', resultTitle: 'Campo de decisão', rankingTitle: 'Ordem explicável', matrixLabel: 'Iniciativas posicionadas por impacto e urgência', summaryPrefix: 'Mostrando', summarySuffix: 'iniciativas pontuadas', rank: 'Posição', priorityScore: 'Pontuação de prioridade', denominator: 'Denominador do esforço', quadrant: 'Quadrante', emptyState: 'Adicione uma iniciativa para abrir o campo de decisão.', invalidState: 'Corrija os valores destacados para calcular uma ordem de prioridade.', nameRequired: 'O nome é obrigatório.', impactInvalid: 'O impacto deve ser um número inteiro de 1 a 5.', urgencyInvalid: 'A urgência deve ser um número inteiro de 1 a 5.', effortInvalid: 'O esforço deve ser um número inteiro de 0 a 5.', actNow: 'Agir agora', plan: 'Planejar', quickResponse: 'Responder rápido', defer: 'Adiar', highImpact: 'Impacto alto', lowImpact: 'Impacto baixo', highUrgency: 'Urgência alta', lowUrgency: 'Urgência baixa', methodTitle: 'Método aplicado', methodText: 'A pontuação de prioridade é o impacto multiplicado pela urgência e dividido pelo esforço. Impacto, urgência e esforço usam uma escala visível de 1 a 5. O esforço 0 é tratado como 1 para que uma ação gratuita ou já preparada mantenha um resultado finito. Em caso de empate, a ordem compara impacto, urgência, menor esforço e depois a ordem de entrada.', notDoTitle: 'O que esta ferramenta não faz', notDoText: 'Ela não estabelece um valor social objetivo, não mede resultados automaticamente e não substitui a deliberação. Uma pontuação alta é um cenário transparente baseado nas suas suposições, não um mandato nem uma previsão de benefício público.', edgeCasesTitle: 'Casos-limite e avisos', edgeCasesText: 'Mantenha o mesmo significado para cada pontuação em todas as linhas. Uma pontuação ausente ou não inteira exclui a linha até ser corrigida. O valor 3 separa os lados alto e baixo. Pontuações iguais mantêm uma ordem estável depois dos critérios de desempate documentados. Ao discutir em grupo, altere uma avaliação de cada vez.', warningTitle: 'Revise antes de decidir', zeroEffortWarning: 'Um esforço de 0 usa denominador 1 para manter a pontuação finita e comparável.', invalidRowsWarning: 'Algumas linhas ficam excluídas até que os valores destacados sejam corrigidos.', noInitiatives: 'Nenhuma iniciativa foi inserida ainda.', scoreOutOf: 'de no máximo 25',
|
|
8
|
+
};
|
|
9
|
+
const softwareApplication: SoftwareApplication = { '@type': 'SoftwareApplication', name: 'Matriz de prioridades cívicas', applicationCategory: 'BusinessApplication', operatingSystem: 'Any', description: 'Avalie iniciativas cívicas por impacto, urgência e esforço para criar uma ordem de prioridades explicável.', url: 'https://gamebob.dev/pt/matriz-prioridades-iniciativas-civicas', offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' } };
|
|
10
|
+
const faqPage: FAQPage = { '@type': 'FAQPage', mainEntity: [
|
|
11
|
+
{ '@type': 'Question', name: 'Como a pontuação de prioridade é calculada?', acceptedAnswer: { '@type': 'Answer', text: 'Multiplique o impacto pela urgência e divida pelo esforço. Um esforço de 0 usa denominador 1 para evitar uma pontuação infinita.' } }, { '@type': 'Question', name: 'O que significa a posição no quadrante?', acceptedAnswer: { '@type': 'Answer', text: 'Impacto e urgência de 3 a 5 ficam no lado alto. As quatro zonas sugerem agir, planejar, responder rápido ou adiar.' } }, { '@type': 'Question', name: 'Uma pontuação alta prova que uma iniciativa é a melhor?', acceptedAnswer: { '@type': 'Answer', text: 'Não. Ela reflete as suposições inseridas pelo grupo. Não mede valor social objetivo e não substitui a conversa com as pessoas afetadas.' } }, { '@type': 'Question', name: 'Por que duas iniciativas podem ter a mesma pontuação?', acceptedAnswer: { '@type': 'Answer', text: 'Combinações diferentes de impacto, urgência e esforço podem produzir o mesmo quociente. Critérios transparentes mantêm a ordem reproduzível.' } },
|
|
12
|
+
] };
|
|
13
|
+
const howTo: HowTo = { '@type': 'HowTo', name: 'Criar uma ordem explicável de prioridades cívicas', step: [
|
|
14
|
+
{ '@type': 'HowToStep', name: 'Liste as iniciativas', text: 'Insira uma proposta claramente nomeada por linha e não misture várias ações em um item.' }, { '@type': 'HowToStep', name: 'Combine a escala', text: 'Defina o significado de impacto, urgência e esforço e use a mesma escala de 1 a 5 em todas as linhas.' }, { '@type': 'HowToStep', name: 'Leia o campo de decisão', text: 'Use os quatro quadrantes como ponto de conversa e confira o 3 como fronteira comum.' }, { '@type': 'HowToStep', name: 'Confira a ordem', text: 'Compare cada pontuação com as três entradas e com o denominador do esforço.' }, { '@type': 'HowToStep', name: 'Registre a decisão', text: 'Use a lista como agenda e acrescente evidências, responsáveis, restrições e vozes afetadas.' },
|
|
15
|
+
] };
|
|
16
|
+
export const content: CivicPriorityLocaleContent = {
|
|
17
|
+
slug: 'matriz-prioridade-iniciativas-civicas', title: 'Matriz de prioridades cívicas', description: 'Ordene iniciativas cívicas com pontuações transparentes de impacto, urgência e esforço. Veja quais propostas pedem ação, planejamento, resposta rápida ou revisão posterior.', ui,
|
|
18
|
+
seo: [
|
|
19
|
+
{ type: 'title', text: 'Transforme ideias cívicas em uma ordem de prioridades compartilhada', level: 2 }, { type: 'paragraph', html: 'Grupos costumam ter mais propostas úteis do que tempo, dinheiro ou pessoas para executá-las. Esta matriz faz as mesmas três perguntas para cada iniciativa: quanto a mudança poderia importar, qual é a urgência do problema e quanto esforço a execução exige? O resultado cria um ponto de partida visível para discutir sequência e capacidade, sem substituir a decisão do grupo.' },
|
|
20
|
+
{ type: 'title', text: 'Como funciona a pontuação de prioridade', level: 2 }, { type: 'paragraph', html: 'A fórmula é impacto multiplicado por urgência e dividido por esforço. Uma iniciativa com impacto 5, urgência 4 e esforço 2 recebe 10 pontos. É uma heurística compacta, não uma medida de valor social. Sua utilidade está em manter cada suposição visível, permitindo que os participantes refaçam a conta, expliquem diferenças e melhorem os critérios.' },
|
|
21
|
+
{ type: 'table', headers: ['Entrada', 'Escala', 'Pergunta para o grupo'], rows: [['Impacto', '1 a 5', 'Quanto essa mudança poderia importar para as pessoas ou para o resultado envolvido?'], ['Urgência', '1 a 5', 'Qual é o custo de esperar ou que pressão de prazo existe?'], ['Esforço', '0 a 5', 'Que dificuldade, gasto ou recursos a execução exige?']] },
|
|
22
|
+
{ type: 'title', text: 'Leia as quatro zonas de decisão', level: 2 }, { type: 'paragraph', html: 'O campo posiciona as iniciativas por impacto e urgência, usando 3 como fronteira nos dois eixos. Agir agora reúne impacto e urgência altos. Planejar indica impacto alto com urgência menor. Responder rápido mostra urgência alta com impacto menor, quando uma intervenção pequena pode aliviar a pressão. Adiar reúne valores baixos e pede uma revisão futura, não uma rejeição automática.' },
|
|
23
|
+
{ type: 'list', items: ['Combine primeiro o que impacto significa para este grupo.', 'Use o mesmo horizonte de tempo ao julgar a urgência.', 'Trate esforço como recursos necessários, não como punição por impopularidade.', 'Leia os três componentes ao lado de cada posição.', 'Pontue novamente após novas evidências, prazos ou mudanças de capacidade.'] },
|
|
24
|
+
{ type: 'title', text: 'Use o resultado em uma conversa cívica', level: 2 }, { type: 'paragraph', html: 'A matriz é mais forte quando várias pessoas pontuam as mesmas iniciativas e explicam suas diferenças. Uma pessoa pode dar impacto alto porque uma medida afeta profundamente um grupo pequeno, enquanto outra reduz a nota por causa do alcance limitado. A discordância revela um critério que precisa ser definido. Registre motivos e vozes consultadas em vez de esconder a diferença.' },
|
|
25
|
+
{ type: 'tip', title: 'A pontuação é um cenário declarado', html: 'Um resultado alto significa apenas que a combinação inserida sobe no ranking segundo esta fórmula. Não prova justiça, não cria obrigação legal, não prevê resultados e não substitui um processo público de decisão. Guarde as razões das notas ao lado de qualquer decisão que use esta ordem.' },
|
|
26
|
+
{ type: 'title', text: 'Limites e casos especiais', level: 2 }, { type: 'paragraph', html: 'O esforço 0 é protegido por um denominador de 1 para impedir resultados infinitos. Um valor ausente, fracionário ou fora do intervalo exclui a linha até que seja corrigido. Pontuações iguais seguem critérios de desempate documentados e depois preservam a ordem de entrada. Um quadrante também não é uma análise de risco: uma iniciativa urgente e de alto impacto pode exigir revisão jurídica, financeira, de segurança ou acessibilidade.' },
|
|
27
|
+
], faq: [
|
|
28
|
+
{ question: 'Como a pontuação de prioridade é calculada?', answer: 'Multiplique impacto por urgência e divida por esforço. Para esforço 0, o denominador usado é 1.' }, { question: 'O que significa a posição no campo?', answer: 'Impacto e urgência a partir de 3 ficam no lado alto. As quatro zonas ajudam a discutir a sequência.' }, { question: 'Uma pontuação alta prova que a iniciativa é a melhor?', answer: 'Não. É um resultado transparente sob suposições declaradas, não uma prova de valor social.' }, { question: 'Por que há pontuações iguais?', answer: 'Combinações diferentes podem produzir o mesmo quociente. Os desempates deixam a ordem reproduzível.' },
|
|
29
|
+
], bibliography, howTo: [
|
|
30
|
+
{ name: 'Liste as iniciativas', text: 'Insira uma proposta clara por linha.' }, { name: 'Combine a escala', text: 'Use o mesmo significado de 1 a 5 em cada linha.' }, { name: 'Leia o campo', text: 'Use os quatro quadrantes para discutir a sequência.' }, { name: 'Confira a ordem', text: 'Compare cada posição com impacto, urgência, esforço e denominador.' }, { name: 'Adicione evidências', text: 'Registre restrições e vozes afetadas depois da conversa.' },
|
|
31
|
+
], schemas: [softwareApplication, faqPage, howTo] as unknown as Record<string, unknown>[],
|
|
32
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
3
|
+
import type { CivicPriorityLocaleContent } from '../entry';
|
|
4
|
+
import type { CivicPriorityUI } from '../ui';
|
|
5
|
+
|
|
6
|
+
const ui: CivicPriorityUI = {
|
|
7
|
+
addInitiative: 'Добавить инициативу', initiativeList: 'Инициативы для оценки', inputHint: 'Перед сравнением задайте каждой инициативе одну шкалу от 1 до 5.', initiative: 'Инициатива', impact: 'Влияние', urgency: 'Срочность', effort: 'Затраты', scoreScale: 'Оценка от 1 до 5', scoreHint: 'Большее значение означает большее влияние, срочность или затраты.', removeInitiative: 'Удалить инициативу', reset: 'Сбросить пример', resultTitle: 'Поле решений', rankingTitle: 'Понятный порядок', matrixLabel: 'Инициативы по влиянию и срочности', summaryPrefix: 'Показано', summarySuffix: 'оцененных инициатив', rank: 'Место', priorityScore: 'Баллы приоритета', denominator: 'Знаменатель затрат', quadrant: 'Квадрант', emptyState: 'Добавьте инициативу, чтобы открыть поле решений.', invalidState: 'Исправьте отмеченные значения, чтобы рассчитать порядок приоритетов.', nameRequired: 'Укажите название.', impactInvalid: 'Влияние должно быть целым числом от 1 до 5.', urgencyInvalid: 'Срочность должна быть целым числом от 1 до 5.', effortInvalid: 'Затраты должны быть целым числом от 0 до 5.', actNow: 'Действовать сейчас', plan: 'Планировать', quickResponse: 'Быстро ответить', defer: 'Отложить', highImpact: 'Высокое влияние', lowImpact: 'Низкое влияние', highUrgency: 'Высокая срочность', lowUrgency: 'Низкая срочность', methodTitle: 'Примененный метод', methodText: 'Баллы приоритета равны влиянию, умноженному на срочность и разделенному на затраты. Для влияния, срочности и затрат используется видимая шкала от 1 до 5. Затраты 0 считаются равными 1, чтобы бесплатное или уже подготовленное действие сохраняло конечный результат. При равенстве сравниваются влияние, срочность, меньшие затраты, а затем порядок ввода.', notDoTitle: 'Чего этот инструмент не делает', notDoText: 'Он не устанавливает объективную общественную ценность, не измеряет результаты автоматически и не заменяет обсуждение. Высокий балл - это прозрачный сценарий на основе ваших предположений, а не приказ и не прогноз общественной пользы.', edgeCasesTitle: 'Особые случаи и предупреждения', edgeCasesText: 'Используйте один и тот же смысл каждой оценки во всех строках. Пропущенное или нецелое значение исключает строку до исправления. Значение 3 разделяет высокую и низкую стороны. Равные баллы сохраняют порядок ввода после применения описанных правил. При обсуждении в группе меняйте только одну оценку за раз.', warningTitle: 'Проверьте перед решением', zeroEffortWarning: 'Затраты 0 используют знаменатель 1, чтобы балл оставался конечным и сопоставимым.', invalidRowsWarning: 'Некоторые строки исключены, пока не будут исправлены отмеченные значения.', noInitiatives: 'Инициативы пока не введены.', scoreOutOf: 'из 25 максимум',
|
|
8
|
+
};
|
|
9
|
+
const softwareApplication: SoftwareApplication = { '@type': 'SoftwareApplication', name: 'Матрица гражданских приоритетов', applicationCategory: 'BusinessApplication', operatingSystem: 'Any', description: 'Оценивайте гражданские инициативы по влиянию, срочности и затратам, чтобы получить понятный порядок приоритетов.', url: 'https://gamebob.dev/ru/матрица-приоритетов-гражданских-инициатив', offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' } };
|
|
10
|
+
const faqPage: FAQPage = { '@type': 'FAQPage', mainEntity: [
|
|
11
|
+
{ '@type': 'Question', name: 'Как рассчитываются баллы приоритета?', acceptedAnswer: { '@type': 'Answer', text: 'Умножьте влияние на срочность и разделите на затраты. При затратах 0 используется знаменатель 1, чтобы не получить бесконечный результат.' } }, { '@type': 'Question', name: 'Что означает положение в квадранте?', acceptedAnswer: { '@type': 'Answer', text: 'Влияние и срочность от 3 до 5 находятся на высокой стороне. Четыре зоны подсказывают, действовать, планировать, быстро отвечать или отложить.' } }, { '@type': 'Question', name: 'Доказывает ли высокий балл, что инициатива лучшая?', acceptedAnswer: { '@type': 'Answer', text: 'Нет. Балл отражает предположения группы. Он не измеряет объективную общественную ценность и не заменяет разговор с затронутыми людьми.' } }, { '@type': 'Question', name: 'Почему две инициативы могут получить одинаковый балл?', acceptedAnswer: { '@type': 'Answer', text: 'Разные сочетания влияния, срочности и затрат могут дать один и тот же результат деления. Прозрачные правила затем сохраняют понятный порядок.' } },
|
|
12
|
+
] };
|
|
13
|
+
const howTo: HowTo = { '@type': 'HowTo', name: 'Создать понятный порядок гражданских приоритетов', step: [
|
|
14
|
+
{ '@type': 'HowToStep', name: 'Перечислить инициативы', text: 'Введите в каждой строке одно предложение с ясным названием и не объединяйте разные действия.' }, { '@type': 'HowToStep', name: 'Согласовать шкалу', text: 'Определите смысл влияния, срочности и затрат и одинаково применяйте шкалу от 1 до 5.' }, { '@type': 'HowToStep', name: 'Прочитать поле решений', text: 'Используйте четыре зоны как повод для разговора и проверьте значение 3 как общую границу.' }, { '@type': 'HowToStep', name: 'Проверить порядок', text: 'Сопоставьте каждый балл с тремя входными значениями и знаменателем затрат.' }, { '@type': 'HowToStep', name: 'Записать решение', text: 'Используйте список как повестку и добавьте доказательства, ответственных, ограничения и голоса затронутых людей.' },
|
|
15
|
+
] };
|
|
16
|
+
export const content: CivicPriorityLocaleContent = {
|
|
17
|
+
slug: 'matritsa-prioritetov-grazhdanskikh-initsiativ', title: 'Матрица гражданских приоритетов', description: 'Ранжируйте гражданские инициативы с прозрачными оценками влияния, срочности и затрат. Узнайте, что требует действия, плана, быстрого ответа или позднего пересмотра.', ui,
|
|
18
|
+
seo: [
|
|
19
|
+
{ type: 'title', text: 'Превратите гражданские идеи в общий порядок приоритетов', level: 2 }, { type: 'paragraph', html: 'У группы часто больше полезных предложений, чем времени, денег или людей для их реализации. Матрица задает каждой инициативе одни и те же три вопроса: насколько важным может быть изменение, насколько срочна проблема и сколько затрат потребует выполнение? Результат создает видимую основу для разговора о последовательности и возможностях, но не подменяет решение группы.' },
|
|
20
|
+
{ type: 'title', text: 'Как работает балл приоритета', level: 2 }, { type: 'paragraph', html: 'Формула такова: влияние умножается на срочность и делится на затраты. Инициатива с влиянием 5, срочностью 4 и затратами 2 получает 10 баллов. Это компактная эвристика, а не измерение общественной ценности. Все предположения остаются видимыми, поэтому участники могут повторить расчет, объяснить расхождения и уточнить критерии.' },
|
|
21
|
+
{ type: 'table', headers: ['Ввод', 'Шкала', 'Вопрос для группы'], rows: [['Влияние', '1 до 5', 'Насколько это изменение может быть важно для людей или результата?'], ['Срочность', '1 до 5', 'Какова цена ожидания или давление времени?'], ['Затраты', '0 до 5', 'Насколько выполнение сложно, дорого или требует ресурсов?']] },
|
|
22
|
+
{ type: 'title', text: 'Прочитайте четыре зоны решений', level: 2 }, { type: 'paragraph', html: 'Поле размещает инициативы по влиянию и срочности, а 3 является границей на обеих осях. Действовать сейчас означает высокое влияние и высокую срочность. Планировать означает высокое влияние при меньшей срочности. Быстро ответить означает меньший эффект, но высокую срочность, когда небольшое действие может снизить давление. Отложить означает низкие значения и предлагает вернуться к вопросу позже, а не отклонять его автоматически.' },
|
|
23
|
+
{ type: 'list', items: ['Сначала определите, что означает влияние для этой группы.', 'Используйте один временной горизонт при оценке срочности.', 'Считайте затраты нужными ресурсами, а не наказанием за непопулярную идею.', 'Читайте три составляющие рядом с каждым местом.', 'Оценивайте снова после новых данных, изменения срока или доступных возможностей.'] },
|
|
24
|
+
{ type: 'title', text: 'Используйте результат в гражданском обсуждении', level: 2 }, { type: 'paragraph', html: 'Матрица полезнее, когда несколько человек оценивают одни и те же инициативы и объясняют различия. Один участник может дать высокое влияние действию, которое глубоко помогает небольшой группе, а другой учтет ограниченный охват. Такое расхождение показывает критерий, который нужно определить точнее. Записывайте причины и услышанные голоса, а не скрывайте различие.' },
|
|
25
|
+
{ type: 'tip', title: 'Балл это заявленный сценарий', html: 'Высокий результат означает только, что введенное сочетание поднялось в порядке по этой формуле. Он не доказывает справедливость, не создает юридическую обязанность, не предсказывает результат и не заменяет публичный процесс решения. Сохраняйте обоснования рядом с решениями, использующими этот порядок.' },
|
|
26
|
+
{ type: 'title', text: 'Ограничения и особые случаи', level: 2 }, { type: 'paragraph', html: 'Затраты 0 защищены знаменателем 1, чтобы избежать бесконечных результатов. Пропущенное, дробное или выходящее за диапазон значение исключает строку до исправления. Равные баллы упорядочиваются по описанным правилам, а затем сохраняют порядок ввода. Квадрант также не является анализом рисков: срочная инициатива с высоким влиянием может потребовать юридической, финансовой, защитной или инклюзивной проверки.' },
|
|
27
|
+
], faq: [
|
|
28
|
+
{ question: 'Как рассчитываются баллы приоритета?', answer: 'Умножьте влияние на срочность и разделите на затраты. При затратах 0 знаменатель равен 1.' }, { question: 'Что означает положение в поле?', answer: 'Влияние и срочность от 3 находятся на высокой стороне. Четыре зоны помогают обсудить порядок.' }, { question: 'Доказывает ли высокий балл лучшую инициативу?', answer: 'Нет. Это прозрачный результат заявленных предположений, а не доказательство общественной ценности.' }, { question: 'Почему баллы бывают одинаковыми?', answer: 'Разные сочетания входных данных дают один результат деления. Правила сохраняют воспроизводимый порядок.' },
|
|
29
|
+
], bibliography, howTo: [
|
|
30
|
+
{ name: 'Перечислить инициативы', text: 'Введите одно ясное предложение в каждой строке.' }, { name: 'Согласовать шкалу', text: 'Одинаково используйте смысл от 1 до 5 в каждой строке.' }, { name: 'Прочитать поле', text: 'Используйте четыре зоны для разговора о порядке.' }, { name: 'Проверить порядок', text: 'Сопоставьте место с влиянием, срочностью, затратами и знаменателем.' }, { name: 'Добавить доказательства', text: 'Запишите ограничения и голоса затронутых людей после обсуждения.' },
|
|
31
|
+
], schemas: [softwareApplication, faqPage, howTo] as unknown as Record<string, unknown>[],
|
|
32
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
3
|
+
import type { CivicPriorityLocaleContent } from '../entry';
|
|
4
|
+
import type { CivicPriorityUI } from '../ui';
|
|
5
|
+
|
|
6
|
+
const ui: CivicPriorityUI = {
|
|
7
|
+
addInitiative: 'Lägg till initiativ', initiativeList: 'Initiativ att bedöma', inputHint: 'Ge varje förslag samma skala från 1 till 5 innan du jämför dem.', initiative: 'Initiativ', impact: 'Påverkan', urgency: 'Brådska', effort: 'Insats', scoreScale: 'Skala från 1 till 5', scoreHint: 'Högre värde betyder större påverkan, brådska eller insats.', removeInitiative: 'Ta bort initiativ', reset: 'Återställ exempel', resultTitle: 'Beslutsfält', rankingTitle: 'Förklarbar ordning', matrixLabel: 'Initiativ placerade efter påverkan och brådska', summaryPrefix: 'Visar', summarySuffix: 'bedömda initiativ', rank: 'Placering', priorityScore: 'Prioritetspoäng', denominator: 'Insatsens nämnare', quadrant: 'Kvadrant', emptyState: 'Lägg till ett initiativ för att öppna beslutsfältet.', invalidState: 'Korrigera de markerade värdena för att beräkna en prioritetsordning.', nameRequired: 'Namn krävs.', impactInvalid: 'Påverkan måste vara ett heltal från 1 till 5.', urgencyInvalid: 'Brådska måste vara ett heltal från 1 till 5.', effortInvalid: 'Insats måste vara ett heltal från 0 till 5.', actNow: 'Agera nu', plan: 'Planera', quickResponse: 'Svara snabbt', defer: 'Senarelägg', highImpact: 'Stor påverkan', lowImpact: 'Liten påverkan', highUrgency: 'Hög brådska', lowUrgency: 'Låg brådska', methodTitle: 'Tillämpad metod', methodText: 'Prioritetspoängen är påverkan multiplicerad med brådska och dividerad med insats. Påverkan, brådska och insats använder en synlig skala från 1 till 5. Insats 0 behandlas som 1 så att en kostnadsfri eller redan förberedd åtgärd får ett ändligt resultat. Vid lika poäng jämförs påverkan, brådska, lägre insats och därefter inmatningsordningen.', notDoTitle: 'Vad verktyget inte gör', notDoText: 'Det fastställer inte ett objektivt samhällsvärde, mäter inte resultat automatiskt och ersätter inte överläggning. En hög poäng är ett öppet scenario utifrån dina antaganden, inte ett mandat eller en prognos för allmän nytta.', edgeCasesTitle: 'Gränsfall och varningar', edgeCasesText: 'Använd samma betydelse för varje poäng i alla rader. Ett saknat eller icke-heltal utesluter raden tills det har korrigerats. Värdet 3 är gränsen mellan hög och låg sida. Lika poäng behåller en stabil ordning efter de dokumenterade skiljereglerna. Ändra en bedömning i taget när resultatet diskuteras i grupp.', warningTitle: 'Kontrollera före beslut', zeroEffortWarning: 'Insats 0 använder nämnaren 1 så att poängen förblir ändlig och jämförbar.', invalidRowsWarning: 'Vissa rader är uteslutna tills de markerade värdena har korrigerats.', noInitiatives: 'Inga initiativ har skrivits in ännu.', scoreOutOf: 'av högst 25',
|
|
8
|
+
};
|
|
9
|
+
const softwareApplication: SoftwareApplication = { '@type': 'SoftwareApplication', name: 'Matris för medborgerliga prioriteringar', applicationCategory: 'BusinessApplication', operatingSystem: 'Any', description: 'Bedöm medborgerliga initiativ efter påverkan, brådska och insats för att skapa en förklarbar prioritetsordning.', url: 'https://gamebob.dev/sv/prioritetsmatris-medborgerliga-initiativ', offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' } };
|
|
10
|
+
const faqPage: FAQPage = { '@type': 'FAQPage', mainEntity: [
|
|
11
|
+
{ '@type': 'Question', name: 'Hur beräknas prioritetspoängen?', acceptedAnswer: { '@type': 'Answer', text: 'Multiplicera påverkan med brådska och dela med insats. Insats 0 använder nämnaren 1 så att resultatet inte blir oändligt.' } }, { '@type': 'Question', name: 'Vad betyder positionen i kvadranten?', acceptedAnswer: { '@type': 'Answer', text: 'Påverkan och brådska från 3 till 5 ligger på den höga sidan. De fyra zonerna föreslår att agera, planera, svara snabbt eller senarelägga.' } }, { '@type': 'Question', name: 'Bevisar en hög poäng att ett initiativ är bäst?', acceptedAnswer: { '@type': 'Answer', text: 'Nej. Poängen speglar gruppens antaganden. Den mäter inte ett objektivt samhällsvärde och ersätter inte samtal med berörda personer.' } }, { '@type': 'Question', name: 'Varför kan två initiativ få samma poäng?', acceptedAnswer: { '@type': 'Answer', text: 'Olika kombinationer av påverkan, brådska och insats kan ge samma kvot. Transparenta regler håller sedan ordningen reproducerbar.' } },
|
|
12
|
+
] };
|
|
13
|
+
const howTo: HowTo = { '@type': 'HowTo', name: 'Skapa en förklarbar ordning för medborgerliga prioriteringar', step: [
|
|
14
|
+
{ '@type': 'HowToStep', name: 'Lista initiativen', text: 'Skriv in ett tydligt namngivet förslag per rad och slå inte ihop flera åtgärder.' }, { '@type': 'HowToStep', name: 'Kom överens om skalan', text: 'Bestäm vad påverkan, brådska och insats betyder och använd samma skala från 1 till 5 överallt.' }, { '@type': 'HowToStep', name: 'Läs beslutsfältet', text: 'Använd de fyra zonerna som underlag för samtal och kontrollera 3 som gemensam gräns.' }, { '@type': 'HowToStep', name: 'Granska ordningen', text: 'Jämför varje poäng med de tre inmatningarna och insatsens nämnare.' }, { '@type': 'HowToStep', name: 'Dokumentera beslutet', text: 'Använd listan som agenda och lägg till belägg, ansvar, begränsningar och berörda röster.' },
|
|
15
|
+
] };
|
|
16
|
+
export const content: CivicPriorityLocaleContent = {
|
|
17
|
+
slug: 'prioritetsmatris-medborgerliga-initiativ', title: 'Matris för medborgerliga prioriteringar', description: 'Rangordna medborgerliga initiativ med öppna poäng för påverkan, brådska och insats. Se vad som bör göras nu, planeras, besvaras snabbt eller granskas senare.', ui,
|
|
18
|
+
seo: [
|
|
19
|
+
{ type: 'title', text: 'Gör medborgerliga idéer till en gemensam prioritetsordning', level: 2 }, { type: 'paragraph', html: 'Grupper har ofta fler användbara förslag än tid, pengar eller personer att genomföra dem. Matrisen ställer samma tre frågor för varje initiativ: hur mycket kan förändringen betyda, hur brådskande är problemet och vilken insats kräver genomförandet? Resultatet ger en synlig utgångspunkt för att tala om ordning och kapacitet utan att ersätta gruppens omdöme.' },
|
|
20
|
+
{ type: 'title', text: 'Så fungerar prioritetspoängen', level: 2 }, { type: 'paragraph', html: 'Formeln är påverkan multiplicerad med brådska och dividerad med insats. Ett initiativ med påverkan 5, brådska 4 och insats 2 får 10 poäng. Det är en enkel tumregel, inte ett mått på samhällsvärde. Varje antagande hålls synligt så att deltagarna kan räkna om, förklara skillnader och komma överens om bättre kriterier.' },
|
|
21
|
+
{ type: 'table', headers: ['Inmatning', 'Skala', 'Fråga att ställa'], rows: [['Påverkan', '1 till 5', 'Hur mycket kan förändringen betyda för berörda människor eller resultatet?'], ['Brådska', '1 till 5', 'Vad kostar det att vänta eller vilken tidspress finns?'], ['Insats', '0 till 5', 'Hur svårt, dyrt eller resurskrävande är genomförandet?']] },
|
|
22
|
+
{ type: 'title', text: 'Läs de fyra beslutszonerna', level: 2 }, { type: 'paragraph', html: 'Fältet placerar initiativen efter påverkan och brådska, där 3 är gränsen på båda axlarna. Agera nu samlar hög påverkan och hög brådska. Planera betyder hög påverkan med lägre brådska. Svara snabbt betyder lägre påverkan men hög brådska, när en liten åtgärd kan minska trycket. Senarelägg betyder låga värden och en senare granskning, inte ett automatiskt avslag.' },
|
|
23
|
+
{ type: 'list', items: ['Bestäm först vad påverkan betyder för just den här gruppen.', 'Använd samma tidshorisont när ni bedömer brådska.', 'Se insats som nödvändiga resurser, inte som straff för en impopulär idé.', 'Läs de tre delvärdena bredvid varje placering.', 'Bedöm på nytt efter nya belägg, ändrade tidsfrister eller annan kapacitet.'] },
|
|
24
|
+
{ type: 'title', text: 'Använd resultatet i ett medborgerligt samtal', level: 2 }, { type: 'paragraph', html: 'Matrisen blir bättre när flera personer bedömer samma initiativ och förklarar sina skillnader. En person kan ge hög påverkan eftersom en åtgärd hjälper en liten grupp på djupet, medan en annan väger den begränsade räckvidden tyngre. Oenigheten visar vilket kriterium som behöver förtydligas. Skriv ner skälen och de röster som hörts i stället för att dölja skillnaden.' },
|
|
25
|
+
{ type: 'tip', title: 'Poängen är ett uttalat scenario', html: 'En hög poäng betyder bara att kombinationen hamnar högt enligt denna formel. Den bevisar inte rättvisa, skapar ingen juridisk skyldighet, förutsäger inte resultat och ersätter inte ett offentligt beslut. Behåll motiveringarna bredvid beslut som använder ordningen.' },
|
|
26
|
+
{ type: 'title', text: 'Begränsningar och specialfall', level: 2 }, { type: 'paragraph', html: 'Insats 0 skyddas med nämnaren 1 för att undvika oändliga resultat. Ett saknat, bråkformigt eller felaktigt värde utesluter raden tills den rättats. Lika poäng hanteras med dokumenterade skiljeregler och behåller sedan inmatningsordningen. En kvadrant är inte heller en riskanalys: brådskande arbete med hög påverkan kan behöva juridisk, ekonomisk, säkerhetsmässig eller tillgänglighetsrelaterad granskning.' },
|
|
27
|
+
], faq: [
|
|
28
|
+
{ question: 'Hur beräknas prioritetspoängen?', answer: 'Multiplicera påverkan med brådska och dela med insats. Vid insats 0 är nämnaren 1.' }, { question: 'Vad betyder positionen i fältet?', answer: 'Påverkan och brådska från 3 ligger på den höga sidan. Zonerna hjälper gruppen att diskutera ordningen.' }, { question: 'Är en hög poäng ett bevis på bästa initiativ?', answer: 'Nej. Det är ett öppet resultat utifrån uttalade antaganden, inte ett bevis på samhällsvärde.' }, { question: 'Varför blir poäng ibland lika?', answer: 'Olika kombinationer kan ge samma kvot. Skiljereglerna gör ordningen möjlig att återskapa.' },
|
|
29
|
+
], bibliography, howTo: [
|
|
30
|
+
{ name: 'Lista initiativen', text: 'Skriv ett tydligt förslag per rad.' }, { name: 'Kom överens om skalan', text: 'Använd samma betydelse för 1 till 5 i varje rad.' }, { name: 'Läs fältet', text: 'Använd de fyra zonerna för att tala om ordning.' }, { name: 'Granska ordningen', text: 'Jämför placeringen med påverkan, brådska, insats och nämnare.' }, { name: 'Lägg till belägg', text: 'Dokumentera begränsningar och berörda röster efter samtalet.' },
|
|
31
|
+
], schemas: [softwareApplication, faqPage, howTo] as unknown as Record<string, unknown>[],
|
|
32
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
3
|
+
import type { CivicPriorityLocaleContent } from '../entry';
|
|
4
|
+
import type { CivicPriorityUI } from '../ui';
|
|
5
|
+
|
|
6
|
+
const ui: CivicPriorityUI = {
|
|
7
|
+
addInitiative: 'Girişim ekle', initiativeList: 'Değerlendirilecek girişimler', inputHint: 'Karşılaştırmadan önce her öneriye aynı 1 ile 5 ölçeğini verin.', initiative: 'Girişim', impact: 'Etki', urgency: 'Aciliyet', effort: 'Çaba', scoreScale: '1 ile 5 arasında puanlayın', scoreHint: 'Yüksek değer daha fazla etki, aciliyet veya çaba demektir.', removeInitiative: 'Girişimi kaldır', reset: 'Örneği sıfırla', resultTitle: 'Karar alanı', rankingTitle: 'Açıklanabilir sıralama', matrixLabel: 'Etki ve aciliyete göre yerleştirilen girişimler', summaryPrefix: 'Gösterilen', summarySuffix: 'puanlanmış girişim', rank: 'Sıra', priorityScore: 'Öncelik puanı', denominator: 'Çaba paydası', quadrant: 'Bölge', emptyState: 'Karar alanını açmak için bir girişim ekleyin.', invalidState: 'Öncelik sıralaması hesaplamak için işaretli değerleri düzeltin.', nameRequired: 'Ad gereklidir.', impactInvalid: 'Etki 1 ile 5 arasında bir tam sayı olmalıdır.', urgencyInvalid: 'Aciliyet 1 ile 5 arasında bir tam sayı olmalıdır.', effortInvalid: 'Çaba 0 ile 5 arasında bir tam sayı olmalıdır.', actNow: 'Şimdi harekete geç', plan: 'Planla', quickResponse: 'Hızlı yanıt ver', defer: 'Ertele', highImpact: 'Yüksek etki', lowImpact: 'Düşük etki', highUrgency: 'Yüksek aciliyet', lowUrgency: 'Düşük aciliyet', methodTitle: 'Uygulanan yöntem', methodText: 'Öncelik puanı etki çarpı aciliyet bölü çabadır. Etki, aciliyet ve çaba görünür bir 1 ile 5 ölçeği kullanır. Ücretsiz veya kaynakları hazır bir eylem sonsuz değere dönüşmesin diye çaba 0, 1 olarak ele alınır. Eşitliklerde sıralama etkiyi, aciliyeti, daha düşük çabayı ve ardından giriş sırasını karşılaştırır.', notDoTitle: 'Bu araç ne yapmaz', notDoText: 'Nesnel bir toplumsal değer belirlemez, sonuçları otomatik olarak ölçmez ve müzakerenin yerini tutmaz. Yüksek puan varsayımlarınıza dayalı şeffaf bir senaryodur; emir ya da kamusal fayda tahmini değildir.', edgeCasesTitle: 'Sınır durumları ve uyarılar', edgeCasesText: 'Her satırda puanların anlamını aynı tutun. Eksik veya tam sayı olmayan bir değer düzeltilene kadar satırı dışarıda bırakır. 3 değeri yüksek ve düşük taraf arasındaki sınırdır. Eşit puanlar belgelenen eşitlik kurallarından sonra giriş sırasını korur. Grup tartışmasında her seferinde tek bir değerlendirmeyi değiştirin.', warningTitle: 'Karar vermeden önce inceleyin', zeroEffortWarning: 'Çaba 0, puanı sonlu ve karşılaştırılabilir tutmak için 1 paydasını kullanır.', invalidRowsWarning: 'İşaretli değerler düzeltilene kadar bazı satırlar dışarıda tutulur.', noInitiatives: 'Henüz girişim girilmedi.', scoreOutOf: 'en fazla 25 üzerinden',
|
|
8
|
+
};
|
|
9
|
+
const softwareApplication: SoftwareApplication = { '@type': 'SoftwareApplication', name: 'Yurttaşlık Öncelik Matrisi', applicationCategory: 'BusinessApplication', operatingSystem: 'Any', description: 'Yurttaşlık girişimlerini etki, aciliyet ve çabaya göre puanlayarak açıklanabilir bir öncelik sırası oluşturun.', url: 'https://gamebob.dev/tr/yurttaslik-girisimleri-oncelik-matrisi', offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' } };
|
|
10
|
+
const faqPage: FAQPage = { '@type': 'FAQPage', mainEntity: [
|
|
11
|
+
{ '@type': 'Question', name: 'Öncelik puanı nasıl hesaplanır?', acceptedAnswer: { '@type': 'Answer', text: 'Etkiyi aciliyetle çarpın ve çabaya bölün. Çaba 0 olduğunda sonsuz sonuç oluşmaması için payda 1 kullanılır.' } }, { '@type': 'Question', name: 'Bölgedeki konum ne anlama gelir?', acceptedAnswer: { '@type': 'Answer', text: '3 ile 5 arasındaki etki ve aciliyet değerleri yüksek taraftadır. Dört bölge şimdi harekete geçme, planlama, hızlı yanıt veya erteleme fikri verir.' } }, { '@type': 'Question', name: 'Yüksek puan girişimin en iyi olduğunu kanıtlar mı?', acceptedAnswer: { '@type': 'Answer', text: 'Hayır. Puan, grubun girdiği varsayımları yansıtır. Nesnel toplumsal değeri ölçmez ve etkilenen kişilerle yapılacak görüşmenin yerini tutmaz.' } }, { '@type': 'Question', name: 'İki girişim neden aynı puanı alabilir?', acceptedAnswer: { '@type': 'Answer', text: 'Etki, aciliyet ve çabanın farklı birleşimleri aynı bölümü verebilir. Şeffaf eşitlik kuralları sıralamayı belirler.' } },
|
|
12
|
+
] };
|
|
13
|
+
const howTo: HowTo = { '@type': 'HowTo', name: 'Açıklanabilir bir yurttaşlık öncelik sırası oluşturun', step: [
|
|
14
|
+
{ '@type': 'HowToStep', name: 'Girişimleri listeleyin', text: 'Her satıra açıkça adlandırılmış bir öneri yazın ve farklı eylemleri tek bir maddede birleştirmeyin.' }, { '@type': 'HowToStep', name: 'Ölçeği kararlaştırın', text: 'Etki, aciliyet ve çabanın anlamını belirleyin ve 1 ile 5 ölçeğini her satırda aynı kullanın.' }, { '@type': 'HowToStep', name: 'Karar alanını okuyun', text: 'Dört bölgeyi tartışma başlangıcı olarak kullanın ve 3 değerinin ortak sınır olduğunu kontrol edin.' }, { '@type': 'HowToStep', name: 'Sıralamayı inceleyin', text: 'Her puanı üç girdisi ve çaba paydası ile karşılaştırın.' }, { '@type': 'HowToStep', name: 'Kararı kaydedin', text: 'Listeyi gündem olarak kullanın ve kanıtları, sorumluları, kısıtları ve etkilenen sesleri ekleyin.' },
|
|
15
|
+
] };
|
|
16
|
+
export const content: CivicPriorityLocaleContent = {
|
|
17
|
+
slug: 'yurttaslik-girisimleri-oncelik-matrisi', title: 'Yurttaşlık öncelik matrisi', description: 'Yurttaşlık girişimlerini şeffaf etki, aciliyet ve çaba puanlarıyla sıralayın. Hangi önerinin eylem, plan, hızlı yanıt veya daha sonra inceleme gerektirdiğini görün.', ui,
|
|
18
|
+
seo: [
|
|
19
|
+
{ type: 'title', text: 'Yurttaşlık fikirlerini ortak bir öncelik sırasına dönüştürün', level: 2 }, { type: 'paragraph', html: 'Grupların çoğu, ellerindeki zaman, bütçe veya insan sayısının uygulayabileceğinden daha fazla yararlı öneriye sahiptir. Bu matris her girişime aynı üç soruyu sorar: değişim ne kadar önemli olabilir, sorun ne kadar acil ve uygulama ne kadar çaba ister? Sonuç, grubun kararını değiştirmek yerine sıra ve kapasite üzerine konuşmak için görünür bir başlangıç noktası sağlar.' },
|
|
20
|
+
{ type: 'title', text: 'Öncelik puanı nasıl çalışır', level: 2 }, { type: 'paragraph', html: 'Formül etki çarpı aciliyet bölü çabadır. Etkisi 5, aciliyeti 4 ve çabası 2 olan bir girişim 10 puan alır. Bu kısa bir sezgisel yöntemdir, toplumsal değer ölçümü değildir. Her varsayımı görünür tuttuğu için katılımcılar hesabı tekrar yapabilir, farklılıkları açıklayabilir ve net olmayan ölçütleri düzeltebilir.' },
|
|
21
|
+
{ type: 'table', headers: ['Girdi', 'Ölçek', 'Sorulacak soru'], rows: [['Etki', '1 ile 5', 'Bu değişim ilgili insanlar veya sonuç için ne kadar önemli olabilir?'], ['Aciliyet', '1 ile 5', 'Beklemenin maliyeti ya da zaman baskısı nedir?'], ['Çaba', '0 ile 5', 'Uygulama ne kadar zor, pahalı veya kaynak yoğun?']] },
|
|
22
|
+
{ type: 'title', text: 'Dört karar bölgesini okuyun', level: 2 }, { type: 'paragraph', html: 'Alan, girişimleri etki ve aciliyete göre yerleştirir; her iki eksende de 3 sınır değeridir. Şimdi harekete geç yüksek etki ve yüksek aciliyeti birleştirir. Planla, aciliyeti daha düşük olsa da etkisi yüksek işleri gösterir. Hızlı yanıt ver, etkisi daha düşük fakat aciliyeti yüksek işlerde küçük bir müdahalenin baskıyı azaltabileceğini hatırlatır. Ertele düşük değerleri toplar ve otomatik ret yerine daha sonra inceleme önerir.' },
|
|
23
|
+
{ type: 'list', items: ['Önce etkiyi bu grubun nasıl tanımladığında anlaşın.', 'Aciliyeti değerlendirirken her öneri için aynı zaman aralığını kullanın.', 'Çabayı gerekli kaynaklar olarak görün, popüler olmayan fikre ceza olarak değil.', 'Her sıranın yanındaki üç bileşeni de okuyun.', 'Yeni kanıt, değişen son tarih veya farklı kapasite sonrası yeniden puanlayın.'] },
|
|
24
|
+
{ type: 'title', text: 'Sonucu yurttaşlık tartışmasında kullanın', level: 2 }, { type: 'paragraph', html: 'Birden fazla kişi aynı girişimleri puanlayıp farklarını açıkladığında matris daha yararlı olur. Bir kişi küçük bir grubu derinden etkileyen bir eyleme yüksek etki verebilir; başka biri sınırlı erişimi daha ağır basan bir unsur sayabilir. Bu anlaşmazlık hangi ölçütün açıklığa kavuşması gerektiğini gösterir. Nedenleri ve dinlenen sesleri kaydedin, farkı gizlemeyin.' },
|
|
25
|
+
{ type: 'tip', title: 'Puan açıklanmış bir senaryodur', html: 'Yüksek sonuç yalnızca girilen birleşimin bu formüle göre üst sıralara çıktığı anlamına gelir. Adaleti kanıtlamaz, yasal yükümlülük oluşturmaz, sonuçları tahmin etmez ve kamu karar sürecinin yerini tutmaz. Bu sırayı kullanan kararların yanında puan gerekçelerini saklayın.' },
|
|
26
|
+
{ type: 'title', text: 'Sınırlar ve özel durumlar', level: 2 }, { type: 'paragraph', html: 'Çaba 0, sonsuz sonuç oluşmaması için 1 paydasıyla korunur. Eksik, kesirli veya aralık dışı değer düzeltilene kadar satırı dışarıda bırakır. Eşit puanlar belgelenen eşitlik kurallarıyla sıralanır ve sonra giriş sırasını korur. Bölge bir risk analizi değildir: acil ve yüksek etkili bir çalışma yine hukuki, mali, güvenlik veya erişilebilirlik incelemesi gerektirebilir.' },
|
|
27
|
+
], faq: [
|
|
28
|
+
{ question: 'Öncelik puanı nasıl hesaplanır?', answer: 'Etkiyi aciliyetle çarpıp çabaya bölün. Çaba 0 ise payda 1 olur.' }, { question: 'Karar alanındaki konum ne demek?', answer: '3 ve üzeri etki ve aciliyet yüksek taraftadır. Dört bölge sırayı tartışmaya yardım eder.' }, { question: 'Yüksek puan en iyi girişimi kanıtlar mı?', answer: 'Hayır. Bu, açıklanmış varsayımlara dayalı şeffaf bir sonuçtur ve toplumsal değer kanıtı değildir.' }, { question: 'Puanlar neden eşit olabilir?', answer: 'Farklı girdiler aynı bölümü üretebilir. Eşitlik kuralları sıralamanın yeniden üretilebilmesini sağlar.' },
|
|
29
|
+
], bibliography, howTo: [
|
|
30
|
+
{ name: 'Girişimleri listeleyin', text: 'Her satıra bir açık öneri yazın.' }, { name: 'Ölçeği kararlaştırın', text: '1 ile 5 arasındaki anlamı her satırda aynı kullanın.' }, { name: 'Alanı okuyun', text: 'Dört bölgeyi sıra tartışmasının çerçevesi yapın.' }, { name: 'Sıralamayı inceleyin', text: 'Yeri etki, aciliyet, çaba ve paydayla karşılaştırın.' }, { name: 'Kanıt ekleyin', text: 'Tartışma sonrasında kısıtları ve etkilenen sesleri yazın.' },
|
|
31
|
+
], schemas: [softwareApplication, faqPage, howTo] as unknown as Record<string, unknown>[],
|
|
32
|
+
};
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import type { FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import { bibliography } from '../bibliography';
|
|
3
|
+
import type { CivicPriorityLocaleContent } from '../entry';
|
|
4
|
+
import type { CivicPriorityUI } from '../ui';
|
|
5
|
+
|
|
6
|
+
const ui: CivicPriorityUI = {
|
|
7
|
+
addInitiative: '添加倡议',
|
|
8
|
+
initiativeList: '待评估倡议',
|
|
9
|
+
inputHint: '比较之前, 请用相同的1到5标准评估每项提案。',
|
|
10
|
+
initiative: '倡议',
|
|
11
|
+
impact: '影响力',
|
|
12
|
+
urgency: '紧迫性',
|
|
13
|
+
effort: '执行成本',
|
|
14
|
+
scoreScale: '按1到5评分',
|
|
15
|
+
scoreHint: '数字越高, 表示影响力、紧迫性或执行成本越高。',
|
|
16
|
+
removeInitiative: '删除倡议',
|
|
17
|
+
reset: '重置示例',
|
|
18
|
+
resultTitle: '决策区域',
|
|
19
|
+
rankingTitle: '可解释的排序',
|
|
20
|
+
matrixLabel: '按影响力和紧迫性放置的倡议',
|
|
21
|
+
summaryPrefix: '正在显示:',
|
|
22
|
+
summarySuffix: '项已评分倡议',
|
|
23
|
+
rank: '排名',
|
|
24
|
+
priorityScore: '优先分数',
|
|
25
|
+
denominator: '执行成本分母',
|
|
26
|
+
quadrant: '区域',
|
|
27
|
+
emptyState: '添加一项倡议后即可打开决策区域。',
|
|
28
|
+
invalidState: '修正突出显示的数值后才能计算优先顺序。',
|
|
29
|
+
nameRequired: '必须填写名称。',
|
|
30
|
+
impactInvalid: '影响力必须是1到5之间的整数。',
|
|
31
|
+
urgencyInvalid: '紧迫性必须是1到5之间的整数。',
|
|
32
|
+
effortInvalid: '执行成本必须是0到5之间的整数。',
|
|
33
|
+
actNow: '立即行动',
|
|
34
|
+
plan: '制定计划',
|
|
35
|
+
quickResponse: '快速响应',
|
|
36
|
+
defer: '稍后处理',
|
|
37
|
+
highImpact: '高影响力',
|
|
38
|
+
lowImpact: '低影响力',
|
|
39
|
+
highUrgency: '高紧迫性',
|
|
40
|
+
lowUrgency: '低紧迫性',
|
|
41
|
+
methodTitle: '使用的方法',
|
|
42
|
+
methodText: '优先分数等于影响力乘以紧迫性, 再除以执行成本。三个数值都使用清晰可见的1到5标准。执行成本为0时按分母1处理, 让免费或已有资源支持的行动仍能得到有限的分数。分数相同时, 依次比较影响力、紧迫性、较低的执行成本, 最后保持输入顺序。',
|
|
43
|
+
notDoTitle: '此工具不会做什么',
|
|
44
|
+
notDoText: '它不会确定客观的社会价值, 自动衡量结果, 或取代公众协商。高分只是基于输入假设的透明情景, 不是公共利益的命令或预测。',
|
|
45
|
+
edgeCasesTitle: '边界情况和提醒',
|
|
46
|
+
edgeCasesText: '请在每一行中保持各项分数的含义一致。缺少数值或使用非整数的行会在修正前被排除。决策区域以3作为分界线。相同分数经过记录的排序规则后仍保持输入顺序。与小组讨论结果时, 每次只改变一项判断。',
|
|
47
|
+
warningTitle: '决定前请复核',
|
|
48
|
+
zeroEffortWarning: '执行成本为0时使用分母1, 以保持分数有限且可比较。',
|
|
49
|
+
invalidRowsWarning: '突出显示的数值修正前, 部分行不会参与排序。',
|
|
50
|
+
noInitiatives: '还没有输入倡议。',
|
|
51
|
+
scoreOutOf: '满分25分',
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
const softwareApplication: SoftwareApplication = {
|
|
55
|
+
'@type': 'SoftwareApplication',
|
|
56
|
+
name: '公民倡议优先级矩阵',
|
|
57
|
+
applicationCategory: 'BusinessApplication',
|
|
58
|
+
operatingSystem: 'Any',
|
|
59
|
+
description: '用影响力、紧迫性和执行成本评估公民倡议, 创建可解释的优先顺序。',
|
|
60
|
+
url: 'https://gamebob.dev/zh/civic-priority-matrix',
|
|
61
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const faqPage: FAQPage = {
|
|
65
|
+
'@type': 'FAQPage',
|
|
66
|
+
mainEntity: [
|
|
67
|
+
{ '@type': 'Question', name: '优先分数如何计算?', acceptedAnswer: { '@type': 'Answer', text: '将影响力乘以紧迫性, 再除以执行成本。每项使用1到5评分, 执行成本为0时使用分母1。' } },
|
|
68
|
+
{ '@type': 'Question', name: '区域位置代表什么?', acceptedAnswer: { '@type': 'Answer', text: '区域只使用影响力和紧迫性。3或以上属于高侧, 四个区域分别提示立即行动、制定计划、快速响应或稍后处理。' } },
|
|
69
|
+
{ '@type': 'Question', name: '高分是否证明倡议最好?', acceptedAnswer: { '@type': 'Answer', text: '不是。它只是输入假设下的透明结果, 不能证明社会价值, 也不能预测结果。' } },
|
|
70
|
+
{ '@type': 'Question', name: '为什么两个倡议会得到相同排名?', acceptedAnswer: { '@type': 'Answer', text: '不同的影响力、紧迫性和执行成本组合可能产生相同的商。工具会使用透明的并列规则和稳定的输入顺序。' } },
|
|
71
|
+
],
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const howTo: HowTo = {
|
|
75
|
+
'@type': 'HowTo',
|
|
76
|
+
name: '建立可解释的公民倡议优先顺序',
|
|
77
|
+
step: [
|
|
78
|
+
{ '@type': 'HowToStep', name: '列出倡议', text: '每行输入一个名称清晰的提案。不要把多个行动合并成一项。' },
|
|
79
|
+
{ '@type': 'HowToStep', name: '统一评分标准', text: '让所有行中的影响力、紧迫性和执行成本含义一致, 将1视为低, 5视为高。' },
|
|
80
|
+
{ '@type': 'HowToStep', name: '阅读决策区域', text: '把四个区域当作讨论顺序的提示, 并始终用3作为分界线。' },
|
|
81
|
+
{ '@type': 'HowToStep', name: '检查排序', text: '将每个排名与三个输入值和分母对照。意外的顺序说明需要重新检查假设。' },
|
|
82
|
+
{ '@type': 'HowToStep', name: '记录决定', text: '用排序结果形成讨论议程, 再记录证据、负责人、限制条件和受影响者的声音。' },
|
|
83
|
+
],
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export const content: CivicPriorityLocaleContent = {
|
|
87
|
+
slug: 'civic-priority-matrix',
|
|
88
|
+
title: '公民倡议优先级矩阵',
|
|
89
|
+
description: '用透明的影响力、紧迫性和执行成本评分排列公民倡议, 找出应立即行动、制定计划、快速响应或稍后复核的提案。',
|
|
90
|
+
ui,
|
|
91
|
+
seo: [
|
|
92
|
+
{ type: 'title', text: '把公民想法变成共同的优先顺序', level: 2 },
|
|
93
|
+
{ type: 'paragraph', html: '社区提出的有用方案通常多于可用的时间、预算或人手。公民倡议优先级矩阵为每项倡议提出相同的三个问题: 它可能带来多大影响, 问题有多紧迫, 执行需要多少成本。结果是一个可见的起点, 方便团队讨论行动顺序和取舍。' },
|
|
94
|
+
{ type: 'title', text: '优先分数如何运作', level: 2 },
|
|
95
|
+
{ type: 'paragraph', html: '分数等于影响力乘以紧迫性, 再除以执行成本。例如影响力5、紧迫性4、执行成本2会得到10分。这个分数是简洁的启发式, 不是社会价值的测量。它的价值在于每个组成部分都保持可见, 其他人可以重新计算并检查假设。' },
|
|
96
|
+
{ type: 'table', headers: ['输入', '范围', '可以提问'], rows: [['影响力', '1到5', '它能给相关人群或结果带来多大改变?'], ['紧迫性', '1到5', '等待会产生什么成本或时间压力?'], ['执行成本', '0到5', '交付需要多少难度、费用或资源?']] },
|
|
97
|
+
{ type: 'title', text: '阅读四个决策区域', level: 2 },
|
|
98
|
+
{ type: 'paragraph', html: '影响力和紧迫性都以3作为分界。两项都高的倡议属于立即行动, 影响力高但紧迫性低的属于制定计划, 影响力低但紧迫性高的属于快速响应, 两项都低的属于稍后处理。稍后处理意味着安排复核, 并不等于自动否决。' },
|
|
99
|
+
{ type: 'list', items: ['输入分数前, 先为这个群体定义影响力。', '判断所有倡议的紧迫性时使用相同的时间范围。', '把执行成本理解为交付所需的资源, 不要把它当作不受欢迎想法的惩罚。', '讨论排序前, 先查看每一行的三个组成数值。', '证据、截止日期或可用能力发生变化后重新评分。'] },
|
|
100
|
+
{ type: 'title', text: '让结果服务于公民讨论', level: 2 },
|
|
101
|
+
{ type: 'paragraph', html: '当多人为相同倡议评分并解释差异时, 矩阵最有价值。有人可能因为一项方案深刻影响小群体而给出高影响力, 另一个人可能因为覆盖范围有限而给出低分。分歧会暴露需要先定义的标准。请记录理由以及参与最终选择的受影响者声音。' },
|
|
102
|
+
{ type: 'tip', title: '分数是一个已声明的情景', html: '高分表示在当前公式以及输入的影响力、紧迫性和执行成本组合下排名靠前。它不能证明法律义务、公平性或公共利益, 也不能预测结果。使用排序做决定时, 请同时保存评分依据。' },
|
|
103
|
+
{ type: 'title', text: '限制和边界情况', level: 2 },
|
|
104
|
+
{ type: 'paragraph', html: '执行成本为0时使用分母1, 避免出现无穷大。缺少数值、使用小数或超出范围的行会在修正前被排除。相同分数不会被无声地重新排列, 工具会按公开的并列规则处理并保持输入顺序。区域也不是风险评估, 高影响且紧迫的工作仍可能需要安全、法律、财务或无障碍审查。' },
|
|
105
|
+
],
|
|
106
|
+
faq: [
|
|
107
|
+
{ question: '优先分数如何计算?', answer: '将影响力乘以紧迫性, 再除以执行成本。执行成本0使用分母1。' },
|
|
108
|
+
{ question: '区域位置代表什么?', answer: '影响力和紧迫性达到3或以上时属于高侧。四个区域帮助讨论行动顺序。' },
|
|
109
|
+
{ question: '高分是否证明倡议最好?', answer: '不是。它是基于已声明假设的透明结果, 不是社会价值的证明。' },
|
|
110
|
+
{ question: '为什么会出现相同分数?', answer: '不同的输入组合可能得到相同的商。工具使用公开的并列规则和输入顺序。' },
|
|
111
|
+
],
|
|
112
|
+
bibliography,
|
|
113
|
+
howTo: [
|
|
114
|
+
{ name: '列出倡议', text: '每行输入一个名称清晰的提案。' },
|
|
115
|
+
{ name: '统一标准', text: '让所有行使用相同的1到5含义。' },
|
|
116
|
+
{ name: '阅读区域', text: '用四个区域讨论行动顺序。' },
|
|
117
|
+
{ name: '检查排序', text: '将排名与影响力、紧迫性、执行成本和分母对照。' },
|
|
118
|
+
{ name: '补充证据', text: '把结果作为议程, 记录限制条件和受影响者的声音。' },
|
|
119
|
+
],
|
|
120
|
+
schemas: [softwareApplication, faqPage, howTo] as unknown as Record<string, unknown>[],
|
|
121
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ToolDefinition } from '../../types';
|
|
2
|
+
import { civicPriorityMatrix } from './entry';
|
|
3
|
+
|
|
4
|
+
export * from './entry';
|
|
5
|
+
export * from './logic';
|
|
6
|
+
export const CIVIC_PRIORITY_MATRIX_TOOL: ToolDefinition = {
|
|
7
|
+
entry: civicPriorityMatrix,
|
|
8
|
+
Component: () => import('./component.astro'),
|
|
9
|
+
SEOComponent: () => import('./seo.astro'),
|
|
10
|
+
BibliographyComponent: () => import('./bibliography.astro'),
|
|
11
|
+
};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { analyzeInitiatives, type InitiativeInput } from './logic';
|
|
3
|
+
|
|
4
|
+
const item = (overrides: Partial<InitiativeInput> = {}): InitiativeInput => ({
|
|
5
|
+
id: 'one',
|
|
6
|
+
name: 'Accessible bus stops',
|
|
7
|
+
impact: 5,
|
|
8
|
+
urgency: 4,
|
|
9
|
+
effort: 2,
|
|
10
|
+
...overrides,
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
describe('civic priority matrix logic', () => {
|
|
14
|
+
it('handles an empty list', () => {
|
|
15
|
+
const result = analyzeInitiatives([]);
|
|
16
|
+
expect(result.valid).toBe(false);
|
|
17
|
+
expect(result.error).toContain('one initiative');
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('calculates, ranks and assigns a quadrant', () => {
|
|
21
|
+
const result = analyzeInitiatives([
|
|
22
|
+
item(),
|
|
23
|
+
item({ id: 'two', name: 'Cooling centres', impact: 4, urgency: 2, effort: 1 }),
|
|
24
|
+
]);
|
|
25
|
+
expect(result.initiatives[0]).toMatchObject({ priorityScore: 10, quadrant: 'act-now', denominator: 2 });
|
|
26
|
+
expect(result.initiatives[1]).toMatchObject({ priorityScore: 8, quadrant: 'plan' });
|
|
27
|
+
expect(result.quadrantCounts).toMatchObject({ 'act-now': 1, plan: 1 });
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('uses one as the safe denominator for zero effort', () => {
|
|
31
|
+
const result = analyzeInitiatives([item({ effort: 0 })]);
|
|
32
|
+
expect(result.initiatives[0]).toMatchObject({ priorityScore: 20, denominator: 1 });
|
|
33
|
+
expect(result.warnings[0]).toContain('denominator of 1');
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('rejects invalid scores without silently discarding the row', () => {
|
|
37
|
+
const result = analyzeInitiatives([item(), item({ id: 'bad', name: 'Bad row', impact: 6, urgency: 2, effort: -1 })]);
|
|
38
|
+
expect(result.initiatives).toHaveLength(1);
|
|
39
|
+
expect(result.errors.map((error) => error.field)).toEqual(['impact', 'effort']);
|
|
40
|
+
expect(result.warnings).toContain('Some rows are excluded until their highlighted values are fixed.');
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('reports missing names and all-invalid input', () => {
|
|
44
|
+
const result = analyzeInitiatives([item({ name: ' ', impact: 0 })]);
|
|
45
|
+
expect(result.valid).toBe(false);
|
|
46
|
+
expect(result.errors.map((error) => error.field)).toEqual(['name', 'impact']);
|
|
47
|
+
expect(result.error).toContain('Fix the highlighted values');
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('makes duplicate names unique and places all quadrants', () => {
|
|
51
|
+
const result = analyzeInitiatives([
|
|
52
|
+
item({ name: 'Same', impact: 5, urgency: 5 }),
|
|
53
|
+
item({ id: 'two', name: 'same', impact: 5, urgency: 1 }),
|
|
54
|
+
item({ id: 'three', name: 'Low urgent', impact: 1, urgency: 5 }),
|
|
55
|
+
item({ id: 'four', name: 'Low', impact: 1, urgency: 1 }),
|
|
56
|
+
]);
|
|
57
|
+
expect(result.initiatives.map((entry) => entry.normalizedName)).toContain('same (2)');
|
|
58
|
+
expect(result.quadrantCounts).toEqual({ 'act-now': 1, plan: 1, 'quick-response': 1, defer: 1 });
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('uses stable tie breakers', () => {
|
|
62
|
+
const result = analyzeInitiatives([
|
|
63
|
+
item({ id: 'first', name: 'First', impact: 4, urgency: 4, effort: 4 }),
|
|
64
|
+
item({ id: 'second', name: 'Second', impact: 4, urgency: 4, effort: 4 }),
|
|
65
|
+
]);
|
|
66
|
+
expect(result.initiatives.map((entry) => entry.id)).toEqual(['first', 'second']);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
export const SCORE_MIN = 1;
|
|
2
|
+
export const SCORE_MAX = 5;
|
|
3
|
+
export const EFFORT_MIN = 0;
|
|
4
|
+
|
|
5
|
+
export type PriorityQuadrant = 'act-now' | 'plan' | 'quick-response' | 'defer';
|
|
6
|
+
|
|
7
|
+
export interface InitiativeInput {
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
impact: number;
|
|
11
|
+
urgency: number;
|
|
12
|
+
effort: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface InitiativeResult extends InitiativeInput {
|
|
16
|
+
originalIndex: number;
|
|
17
|
+
priorityScore: number;
|
|
18
|
+
scorePercent: number;
|
|
19
|
+
quadrant: PriorityQuadrant;
|
|
20
|
+
denominator: number;
|
|
21
|
+
normalizedName: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface InitiativeError {
|
|
25
|
+
index: number;
|
|
26
|
+
field: keyof InitiativeInput;
|
|
27
|
+
message: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface PriorityAnalysis {
|
|
31
|
+
valid: boolean;
|
|
32
|
+
error: string;
|
|
33
|
+
initiatives: InitiativeResult[];
|
|
34
|
+
errors: InitiativeError[];
|
|
35
|
+
warnings: string[];
|
|
36
|
+
quadrantCounts: Record<PriorityQuadrant, number>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const emptyQuadrants = (): Record<PriorityQuadrant, number> => ({
|
|
40
|
+
'act-now': 0,
|
|
41
|
+
plan: 0,
|
|
42
|
+
'quick-response': 0,
|
|
43
|
+
defer: 0,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
function isWholeScore(value: number, minimum: number): boolean {
|
|
47
|
+
return Number.isSafeInteger(value) && value >= minimum && value <= SCORE_MAX;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function validateInput(input: InitiativeInput, index: number): InitiativeError[] {
|
|
51
|
+
const errors: InitiativeError[] = [];
|
|
52
|
+
if (!input.name.trim()) errors.push({ index, field: 'name', message: 'Name is required.' });
|
|
53
|
+
if (!isWholeScore(input.impact, SCORE_MIN)) errors.push({ index, field: 'impact', message: 'Impact must be a whole number from 1 to 5.' });
|
|
54
|
+
if (!isWholeScore(input.urgency, SCORE_MIN)) errors.push({ index, field: 'urgency', message: 'Urgency must be a whole number from 1 to 5.' });
|
|
55
|
+
if (!isWholeScore(input.effort, EFFORT_MIN)) errors.push({ index, field: 'effort', message: 'Effort must be a whole number from 0 to 5.' });
|
|
56
|
+
return errors;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function uniqueName(name: string, counts: Map<string, number>): string {
|
|
60
|
+
const cleanName = name.trim();
|
|
61
|
+
const key = cleanName.toLocaleLowerCase();
|
|
62
|
+
const count = (counts.get(key) ?? 0) + 1;
|
|
63
|
+
counts.set(key, count);
|
|
64
|
+
return count === 1 ? cleanName : `${cleanName} (${count})`;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function round(value: number): number {
|
|
68
|
+
return Math.round(value * 100) / 100;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function getQuadrant(impact: number, urgency: number): PriorityQuadrant {
|
|
72
|
+
const highImpact = impact >= 3;
|
|
73
|
+
const highUrgency = urgency >= 3;
|
|
74
|
+
if (highImpact && highUrgency) return 'act-now';
|
|
75
|
+
if (highImpact) return 'plan';
|
|
76
|
+
if (highUrgency) return 'quick-response';
|
|
77
|
+
return 'defer';
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function makeResult(input: InitiativeInput, index: number, normalizedName: string): InitiativeResult {
|
|
81
|
+
const denominator = Math.max(input.effort, 1);
|
|
82
|
+
const priorityScore = round((input.impact * input.urgency) / denominator);
|
|
83
|
+
return {
|
|
84
|
+
...input,
|
|
85
|
+
name: input.name.trim(),
|
|
86
|
+
originalIndex: index,
|
|
87
|
+
priorityScore,
|
|
88
|
+
scorePercent: round((priorityScore / 25) * 100),
|
|
89
|
+
quadrant: getQuadrant(input.impact, input.urgency),
|
|
90
|
+
denominator,
|
|
91
|
+
normalizedName,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function compareResults(left: InitiativeResult, right: InitiativeResult): number {
|
|
96
|
+
if (right.priorityScore !== left.priorityScore) return right.priorityScore - left.priorityScore;
|
|
97
|
+
if (right.impact !== left.impact) return right.impact - left.impact;
|
|
98
|
+
if (right.urgency !== left.urgency) return right.urgency - left.urgency;
|
|
99
|
+
if (left.effort !== right.effort) return left.effort - right.effort;
|
|
100
|
+
return left.originalIndex - right.originalIndex;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function collectWarnings(results: InitiativeResult[], errors: InitiativeError[]): string[] {
|
|
104
|
+
const warnings: string[] = [];
|
|
105
|
+
if (results.some((item) => item.effort === 0)) warnings.push('An effort score of 0 uses a denominator of 1 to keep the score finite and comparable.');
|
|
106
|
+
if (errors.length > 0) warnings.push('Some rows are excluded until their highlighted values are fixed.');
|
|
107
|
+
return warnings;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export function analyzeInitiatives(inputs: InitiativeInput[]): PriorityAnalysis {
|
|
111
|
+
const quadrants = emptyQuadrants();
|
|
112
|
+
if (inputs.length === 0) return { valid: false, error: 'Add at least one initiative.', initiatives: [], errors: [], warnings: [], quadrantCounts: quadrants };
|
|
113
|
+
const errors = inputs.flatMap((input, index) => validateInput(input, index));
|
|
114
|
+
const invalidIndexes = new Set(errors.map((error) => error.index));
|
|
115
|
+
const counts = new Map<string, number>();
|
|
116
|
+
const initiatives = inputs
|
|
117
|
+
.map((input, index) => invalidIndexes.has(index) ? null : makeResult(input, index, uniqueName(input.name, counts)))
|
|
118
|
+
.filter((item): item is InitiativeResult => item !== null)
|
|
119
|
+
.sort(compareResults);
|
|
120
|
+
initiatives.forEach((item) => { quadrants[item.quadrant] += 1; });
|
|
121
|
+
const hasValidData = initiatives.length > 0;
|
|
122
|
+
const error = hasValidData ? '' : 'Fix the highlighted values to calculate a priority order.';
|
|
123
|
+
return { valid: hasValidData, error, initiatives, errors, warnings: collectWarnings(initiatives, errors), quadrantCounts: quadrants };
|
|
124
|
+
}
|