@knkcs/contenthub-ui 0.3.0 → 0.3.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-library-DoiD_FOJ.js","names":["common","settings","blockReasons","requiredChecks","collections","changeSets","branch","changeSet","library","content","en","de","FORM_ID","_Fragment","MAX_BLUEPRINT_IDS","InvalidInputError","ChangeSetClosedError","ContentRefusedError","contenthubKeys","filter","id","heads","changeSetId","branchId","target","revisionId","base","source","period","day","ids","blueprintId","de_default","\"cancel\"","\"section\"","\"title\"","\"subtitle\"","\"tabs\"","\"requiredChecks\"","\"blockReasons\"","\"collections\"","\"create\"","\"columns\"","\"name\"","\"updated\"","\"actions\"","\"rename\"","\"remove\"","\"count_one\"","\"count_other\"","\"empty\"","\"emptyHint\"","\"loadError\"","\"form\"","\"createTitle\"","\"renameTitle\"","\"nameHelp\"","\"nameRequired\"","\"nameTooLong\"","\"oneLine\"","\"nameTaken\"","\"failed\"","\"createSubmit\"","\"renameSubmit\"","\"removeDialog\"","\"message\"","\"confirm\"","\"scope\"","\"blueprints\"","\"independent\"","\"recorders\"","\"branch\"","\"change_set\"","\"everyBlueprint\"","\"everyMember\"","\"nobody\"","\"recordersUnknown\"","\"manageRecorders\"","\"workspaceMode\"","\"description\"","\"intro\"","\"roster\"","\"you\"","\"removeOf\"","\"restoreEveryMember\"","\"person\"","\"personHelp\"","\"personPlaceholder\"","\"personRequired\"","\"add\"","\"close\"","\"breakGlass\"","\"denied\"","\"yes\"","\"no\"","\"edit\"","\"editTitle\"","\"scopeHelp\"","\"scopeRequired\"","\"accessors\"","\"accessorsHelp\"","\"accessorsRequired\"","\"accessorTooLong\"","\"independentLabel\"","\"independentHelp\"","\"recordersHelp\"","\"editSubmit\"","\"access\"","\"inPath\"","\"root\"","\"restricted\"","\"open\"","\"moveAction\"","\"restrict\"","\"unrestrict\"","\"manageAccess\"","\"parent\"","\"restrictedLabel\"","\"restrictedHelp\"","\"move\"","\"parentHelp\"","\"submit\"","\"restrictDialog\"","\"unrestrictDialog\"","\"levels\"","\"owner\"","\"editor\"","\"viewer\"","\"revoke\"","\"revokeOf\"","\"level\"","\"grant\"","\"state\"","\"status\"","\"assignees\"","\"created\"","\"published\"","\"discarded\"","\"sourceLine\"","\"filter\"","\"anyState\"","\"assignee\"","\"anyone\"","\"me\"","\"tooLong\"","\"sourceDate\"","\"sourceDateHelp\"","\"sourceReference\"","\"sourceReferenceHelp\"","\"sourceDateRequired\"","\"sourceReferenceRequired\"","\"more\"","\"loading\"","\"unavailable\"","\"notFound\"","\"content\"","\"release\"","\"compare\"","\"references\"","\"save\"","\"saveChanged_one\"","\"saveChanged_other\"","\"saved\"","\"unsavedChanges\"","\"noRelease\"","\"otherBranch\"","\"closed\"","\"reload\"","\"violation\"","\"refused\"","\"stale\"","\"staleHint\"","\"violations_one\"","\"violations_other\"","\"invalid\"","\"releaseInvalid\"","\"covers\"","\"coversHint\"","\"supersede\"","\"releaseViolations_one\"","\"releaseViolations_other\"","\"contentSaved\"","\"leave\"","\"pendingMerge\"","\"unplanned\"","\"planIt\"","\"firstDay\"","\"lastDay\"","\"lastDayHelp\"","\"undated\"","\"supersedes\"","\"supersedesHelp\"","\"supersedesNone\"","\"specTitle\"","\"cutsInto\"","\"coversWarning\"","\"proposals\"","\"proposalsHelp\"","\"noProposals\"","\"cut\"","\"tail\"","\"withheld\"","\"firstDayRequired\"","\"lastDayBefore\"","\"ends\"","\"what\"","\"period\"","\"fork\"","\"main\"","\"between\"","\"born\"","\"rail\"","\"eyebrow\"","\"about\"","\"forkMain\"","\"forkBorn\"","\"effectiveOn\"","\"position\"","\"positionOf\"","\"head\"","\"pendingMergeYes\"","\"updateFromMain\"","\"resolveMerge\"","\"compareFork\"","\"preview\"","\"appendBranch\"","\"dropChain\"","\"update\"","\"merged\"","\"upToDate\"","\"stopped\"","\"resolve\"","\"merge\"","\"conflict\"","\"ours\"","\"theirs\"","\"base\"","\"decide\"","\"abort\"","\"none\"","\"day\"","\"dayHelp\"","\"nothing\"","\"planned\"","\"badDay\"","\"append\"","\"required\"","\"after\"","\"drop\"","\"collectionsError\"","\"allContent\"","\"blueprint\"","\"readOn\"","\"revised\"","\"view\"","\"in_force\"","\"searchPlaceholder\"","\"searchInForce\"","\"changeSet\"","\"noOpenChangeSet\"","\"anyBlueprint\"","\"button\"","\"blueprintHelp\"","\"pickBlueprint\"","\"blueprintRequired\"","\"releaseHelp\"","\"releaseRequired\"","\"noUsableRelease\"","\"releasesFailed\"","\"refusedRelease\"","\"refusedReleases\"","\"refusedReleaseReasons\"","\"changeSetHelp\"","\"changeSetRequired\"","\"newChangeSet\"","\"changeSetName\"","\"changeSetClosed\"","\"data\"","\"releases\"","\"revisions\"","\"changeSets\"","\"filing\"","\"badges\"","\"blocked\"","\"archived\"","\"inForce\"","\"inForceRelease\"","\"noneInForce\"","\"block\"","\"blockedBy\"","\"notBlocked\"","\"startEditing\"","\"openBranch\"","\"duplicate\"","\"repeal\"","\"withdraw\"","\"unblock\"","\"archive\"","\"unarchive\"","\"readOnMain\"","\"readOnBranch\"","\"general\"","\"find\"","\"noFields\"","\"ordinal\"","\"kind\"","\"proposed\"","\"revision\"","\"date_only\"","\"withdrawal\"","\"openPeriod\"","\"inForceToday\"","\"notInForce\"","\"plannedTitle\"","\"noPlanned\"","\"written\"","\"author\"","\"cause\"","\"upgrade\"","\"unspecified\"","\"pickToCompare\"","\"titleParent\"","\"titleMain\"","\"field\"","\"before\"","\"added\"","\"removed\"","\"changed\"","\"same\"","\"outgoing\"","\"referrers\"","\"outdated\"","\"target\"","\"pin\"","\"source\"","\"foundIn\"","\"inForceNow\"","\"reference\"","\"toc\"","\"include\"","\"exclude\"","\"replace\"","\"annotate\"","\"link\"","\"footnote\"","\"anchor\"","\"media\"","\"followsInForce\"","\"inRelease\"","\"inChangeSet\"","\"gap\"","\"noOutgoing\"","\"noReferrers\"","\"noOutdated\"","\"opened\"","\"collectionsHelp\"","\"nowhere\"","\"assigneesHelp\"","\"notASave\"","\"effectiveOnHelp\"","\"dateRequired\"","\"forksFrom\"","\"forksFromMain\"","\"carriesForward\"","\"hint\"","\"endForce\"","\"lastDayRequired\"","\"gapReferrers_one\"","\"gapReferrers_other\"","\"done\"","\"reason\"","\"reasonHelp\"","\"reasonRequired\"","\"noReasons\"","\"openBlockReasons\"","\"allowed\"","\"allowedHelp\"","en_default","\"contents\"","\"checks\"","\"transition\"","\"staleStatus\"","\"guarded\"","\"noSource\"","\"createdBy\"","\"frozenHint\"","\"work\"","\"noStatus\"","\"statusHelp\"","\"statusFrozen\"","\"dependencies\"","\"dependenciesHelp\"","\"dependenciesClosed\"","\"noDependencies\"","\"branches\"","\"bornHere\"","\"onMain\"","\"publish\"","\"discard\"","\"blockers_one\"","\"blockers_other\"","\"readiness\"","\"ready\"","\"unknownReadiness\"","\"review\"","\"checking\"","\"headsTitle\"","\"headsHint\"","\"headLine\"","\"noHeads\"","\"blockersTitle_one\"","\"blockersTitle_other\"","\"blockersHint\"","\"releasesTitle\"","\"noReleases\"","\"releaseLine\"","\"again\"","\"alreadyPublished\"","\"openContent\"","\"blockers\"","\"moved_head\"","\"moved_head_unreviewed\"","\"moved_head_gone\"","\"unplanned_branch\"","\"several_branches\"","\"behind_base\"","\"superseded_release\"","\"overlapping_periods\"","\"covers_release\"","\"pending_merge\"","\"nothing_in_force\"","\"withdrawal_with_chain\"","\"dated_changed\"","\"unpublished_dependency\"","\"discarded_dependency\"","\"dangling_pin\"","\"second_toc_parent\"","\"missing_asset\"","\"media_unavailable\"","\"missing_required_field\"","\"outstanding_check\"","\"outstanding_check_on\"","\"unknown\"","\"pins\"","\"origin\"","\"openEnd\"","\"branchHead\"","\"plannedByHand\"","\"splitFrom\"","\"proposedHint\"","\"covered\"","\"coveredHint\"","\"coveredColumns\"","\"by\"","\"outcome\"","\"superseded\"","\"blocks\"","\"noCovered\"","\"check\"","\"on\"","\"latest\"","\"standing\"","\"wholeChangeSet\"","\"onBranch\"","\"onRelease\"","\"passed\"","\"waived\"","\"cleared\"","\"outstanding\"","\"record\"","\"note\"","\"noteHelp\"","\"noteRequired\"","\"noteTooLong\"","\"merged_one\"","\"merged_other\"","\"nothingMerged\"","\"stopped_one\"","\"stopped_other\"","\"noneMerged\"","\"pendingTitle\"","\"pendingLine\"","CONTENTHUB_UI_NS","i18nResources","contenthubTranslations","blueprintSourceFromClient","client","input","unique","chunks","i","chunk","useBlueprintSource","useMemo","OPEN_CHANGE_SETS","useOpenChangeSets","useQuery","ALL","collectionPath","byId","collections","c","out","seen","at","RestrictedMark","useTranslation","Lock","t","CollectionTree","tree","childrenOf","parent","list","build","kids","node","k","next","roots","r","createTreeCollection","expanded","useState","activeId","TreeViewRoot","picked","details","onSelect","TreeViewLabel","TreeViewTree","TreeViewNode","nodeState","TreeViewBranchControl","TreeViewBranchIndicator","ChevronRight","TreeViewBranchText","TreeViewItem","TreeViewItemText","EMPTY","FORM_ID$1","ONE_LINE","CreateChangeSetModal","schema","z","v","ctx","methods","useForm","zodResolver","refusal","setRefusal","submitting","open","submit","onSubmit","values","err","Modal","HStack","Button","onClose","FormProvider","Stack","InputField","Alert","NEW_CHANGE_SET","changeSetChoiceIssue","name","nameOptional","ChangeSetChoiceFields","openChangeSets","options","cs","useWatch","Fragment","BaseSelectField","nameHelperText","FORM_ID","usable","reasonText","CreateContentModal","queryClient","useQueryClient","issue","empty","initialChangeSetId","changeSetOptions","releases","blueprintSource","releaseOptions","refused","releasesOf","useRef","current","noRelease","noUsableRelease","searchBlueprints","useCallback","page","cursor","b","resolveBlueprints","found","wrote","created","content","onCreated","refusalText","reasons","LookupSelectField","o","Text","VIEWS","PAGE_SIZE","SEARCH_DEBOUNCE_MS","BLUEPRINT_OPTION_PAGES","ME","COLLECTION_PARAM","contentLabel","data","ContentLibrary","params","setParams","useSearchParams","collectionId","viewKind","setViewKind","viewChangeSetId","setViewChangeSetId","searchText","setSearchText","search","setSearch","setBlueprintId","assignee","setAssignee","creating","setCreating","useHostIdentity","timer","selectCollection","prev","changeSetName","changeSetForView","view","userId","query","useInfiniteQuery","pageParam","last","keepPreviousData","contents","blueprintIds","blueprintNames","blueprintName","blueprintOptions","all","pageToken","res","namedBlueprints","blueprintFilterOptions","a","columns","label","row","TruncatedTextCell","where","DateCell","createButton","Plus","loadError","heading","IndexPageTemplate","Toolbar","NativeSelect","members","m","SubNavLayout","Spinner","DataTable","onOpenContent","EmptyState","FileText","onOpenBranch"],"sources":["../src/common/query-keys.ts","../src/i18n/de.json","../src/i18n/en.json","../src/i18n/resources.ts","../src/common/blueprint-source.ts","../src/common/use-open-change-sets.ts","../src/screens/collection-tree.tsx","../src/screens/create-change-set-modal.tsx","../src/screens/change-set-choice.tsx","../src/screens/create-content-modal.tsx","../src/screens/content-library.tsx"],"sourcesContent":["// One prefix for every key, so a host sharing its QueryClient with other\n// packages can never collide with ours, and `invalidateQueries([\"contenthub\"])`\n// reaches all of them.\nexport const contenthubKeys = {\n\tall: [\"contenthub\"] as const,\n\tblockReasons: () => [...contenthubKeys.all, \"block-reasons\"] as const,\n\tchangeSets: () => [...contenthubKeys.all, \"change-sets\"] as const,\n\tchangeSetLists: () => [...contenthubKeys.changeSets(), \"list\"] as const,\n\tchangeSetList: (filter: { state?: string; assigneeId?: string }) =>\n\t\t[...contenthubKeys.changeSetLists(), filter] as const,\n\t// Every open Change Set in one read, for pickers: a plain query, so never\n\t// under a key the index's infinite query uses.\n\topenChangeSets: () => [...contenthubKeys.changeSetLists(), \"open-picker\"] as const,\n\tchangeSet: (id: string) => [...contenthubKeys.changeSets(), \"detail\", id] as const,\n\t// What a Publish of the Change Set at its current heads would meet: the\n\t// rail's readiness tile. Keyed by the heads too, so a moved head asks again.\n\tpublishReadiness: (id: string) => [...contenthubKeys.changeSets(), \"readiness\", id] as const,\n\tpublishReadinessAt: (id: string, heads: Record<string, string>) =>\n\t\t[...contenthubKeys.publishReadiness(id), heads] as const,\n\tcheckStandings: (id: string) => [...contenthubKeys.changeSets(), \"checks\", id] as const,\n\t// The host's statushub catalogue, read through the StatusSource port.\n\tchangeSetStatuses: () => [...contenthubKeys.all, \"change-set-statuses\"] as const,\n\trequiredChecks: () => [...contenthubKeys.all, \"required-checks\"] as const,\n\trequiredCheckRecorders: (id: string) =>\n\t\t[...contenthubKeys.requiredChecks(), \"recorders\", id] as const,\n\tcollections: () => [...contenthubKeys.all, \"collections\"] as const,\n\tcollectionGrants: (id: string) => [...contenthubKeys.collections(), \"grants\", id] as const,\n\tcontents: () => [...contenthubKeys.all, \"contents\"] as const,\n\tcontentLists: () => [...contenthubKeys.contents(), \"list\"] as const,\n\tcontentList: (filter: object) => [...contenthubKeys.contentLists(), filter] as const,\n\t// One Content and its reads, under one prefix so a write to it refreshes them all.\n\tcontent: (id: string) => [...contenthubKeys.contents(), \"detail\", id] as const,\n\tcontentRead: (id: string, changeSetId: string) =>\n\t\t[...contenthubKeys.content(id), \"read\", changeSetId] as const,\n\t// One Branch's read: its own key, so opening another Branch of the Chain\n\t// never starts from this one's (#252).\n\tcontentBranchRead: (id: string, changeSetId: string, branchId: string) =>\n\t\t[...contenthubKeys.contentRead(id, changeSetId), \"branch\", branchId] as const,\n\tcontentTimeline: (id: string) => [...contenthubKeys.content(id), \"timeline\"] as const,\n\tcontentRevisions: (id: string, target: object) =>\n\t\t[...contenthubKeys.content(id), \"revisions\", target] as const,\n\tcontentCompare: (id: string, revisionId: string, base: object) =>\n\t\t[...contenthubKeys.content(id), \"compare\", revisionId, base] as const,\n\tcontentReferences: (id: string, revisionId: string) =>\n\t\t[...contenthubKeys.content(id), \"references\", revisionId] as const,\n\tcontentReferrers: (id: string) => [...contenthubKeys.content(id), \"referrers\"] as const,\n\tcontentOutdatedPins: (id: string, source: object) =>\n\t\t[...contenthubKeys.content(id), \"outdated-pins\", source] as const,\n\tcontentChangeSets: (id: string) => [...contenthubKeys.content(id), \"change-sets\"] as const,\n\t// What a Chain or a plan's period would meet (PreviewChain), and a\n\t// Preview's read with a Change Set as if published: under the Content,\n\t// so a write to it refreshes them.\n\tchainPreview: (id: string, changeSetId: string, ...period: string[]) =>\n\t\t[...contenthubKeys.content(id), \"preview\", changeSetId, ...period] as const,\n\tpreviewInForce: (id: string, changeSetId: string, day: string) =>\n\t\t[...contenthubKeys.content(id), \"preview-in-force\", changeSetId, day] as const,\n\t// A Branch's Pending Merge, read afresh by each resolution dialog.\n\tpendingMerge: (branchId: string) => [...contenthubKeys.all, \"pending-merge\", branchId] as const,\n\t// The workspace's Blueprints, read through the BlueprintSource: contenthub's\n\t// catalog, or a host's override.\n\tblueprints: () => [...contenthubKeys.all, \"blueprints\"] as const,\n\tblueprintNames: (ids: string[]) => [...contenthubKeys.blueprints(), \"names\", ids] as const,\n\tblueprintFilterOptions: () => [...contenthubKeys.blueprints(), \"filter-options\"] as const,\n\tblueprintReleases: (blueprintId: string) =>\n\t\t[...contenthubKeys.blueprints(), \"releases\", blueprintId] as const,\n};\n","{\n\t\"common\": {\n\t\t\"cancel\": \"Abbrechen\"\n\t},\n\t\"settings\": {\n\t\t\"section\": \"Einstellungen\",\n\t\t\"title\": \"Inhaltseinstellungen\",\n\t\t\"subtitle\": \"Was die Veröffentlichung verlangt, warum Inhalte gesperrt werden und wie Inhalte abgelegt werden.\",\n\t\t\"tabs\": {\n\t\t\t\"requiredChecks\": \"Pflichtprüfungen\",\n\t\t\t\"blockReasons\": \"Sperrgründe\",\n\t\t\t\"collections\": \"Sammlungen\"\n\t\t}\n\t},\n\t\"blockReasons\": {\n\t\t\"title\": \"Sperrgründe\",\n\t\t\"create\": \"Neuer Sperrgrund\",\n\t\t\"columns\": {\n\t\t\t\"name\": \"Name\",\n\t\t\t\"updated\": \"Zuletzt geändert\",\n\t\t\t\"actions\": \"Aktionen\"\n\t\t},\n\t\t\"rename\": \"Umbenennen\",\n\t\t\"remove\": \"Entfernen\",\n\t\t\"count_one\": \"{{count}} Sperrgrund\",\n\t\t\"count_other\": \"{{count}} Sperrgründe\",\n\t\t\"empty\": \"Noch keine Sperrgründe\",\n\t\t\"emptyHint\": \"Wer einen Content sperrt, nennt einen der eigenen Gründe des Workspace. Lege die Gründe an, die eure Redaktion verwendet, etwa „Wird vom Autor überarbeitet“.\",\n\t\t\"loadError\": \"Die Sperrgründe konnten nicht geladen werden.\",\n\t\t\"form\": {\n\t\t\t\"createTitle\": \"Neuer Sperrgrund\",\n\t\t\t\"renameTitle\": \"Sperrgrund umbenennen\",\n\t\t\t\"name\": \"Name\",\n\t\t\t\"nameHelp\": \"Redakteure wählen ihn beim Sperren eines Contents und sehen ihn neben einem gesperrten Content.\",\n\t\t\t\"nameRequired\": \"Gib einen Namen ein.\",\n\t\t\t\"nameTooLong\": \"Höchstens {{max}} Zeichen.\",\n\t\t\t\"oneLine\": \"Ein Name ist eine einzige Textzeile.\",\n\t\t\t\"nameTaken\": \"Es gibt bereits einen Sperrgrund „{{name}}“.\",\n\t\t\t\"failed\": \"Der Sperrgrund konnte nicht gespeichert werden. Versuche es erneut.\",\n\t\t\t\"createSubmit\": \"Anlegen\",\n\t\t\t\"renameSubmit\": \"Umbenennen\"\n\t\t},\n\t\t\"removeDialog\": {\n\t\t\t\"title\": \"Sperrgrund entfernen\",\n\t\t\t\"message\": \"Den Sperrgrund „{{name}}“ entfernen? Das lässt sich nicht rückgängig machen.\",\n\t\t\t\"confirm\": \"Entfernen\",\n\t\t\t\"failed\": \"Der Sperrgrund konnte nicht entfernt werden. Versuche es erneut.\"\n\t\t}\n\t},\n\t\"requiredChecks\": {\n\t\t\"create\": \"Neue Pflichtprüfung\",\n\t\t\"columns\": {\n\t\t\t\"name\": \"Name\",\n\t\t\t\"scope\": \"Umfang\",\n\t\t\t\"blueprints\": \"Blueprints\",\n\t\t\t\"independent\": \"Unabhängig\",\n\t\t\t\"recorders\": \"Wer sie erfasst\",\n\t\t\t\"actions\": \"Aktionen\"\n\t\t},\n\t\t\"scope\": {\n\t\t\t\"branch\": \"Jeder Branch\",\n\t\t\t\"change_set\": \"Das Change Set einmal\"\n\t\t},\n\t\t\"everyBlueprint\": \"Alle Blueprints\",\n\t\t\"everyMember\": \"Alle Mitglieder\",\n\t\t\"nobody\": \"Niemand\",\n\t\t\"recordersUnknown\": \"Unbekannt\",\n\t\t\"manageRecorders\": \"Wer sie erfasst\",\n\t\t\"workspaceMode\": {\n\t\t\t\"title\": \"Im Workspace-Modus erfasst jedes Mitglied jede Prüfung.\",\n\t\t\t\"description\": \"Dieses contenthub läuft im Workspace-Modus, daher lässt sich nicht auf benannte Personen einschränken, wer eine Pflichtprüfung erfasst. Dafür braucht es den Guardian-Modus.\"\n\t\t},\n\t\t\"recorders\": {\n\t\t\t\"title\": \"Wer „{{name}}“ erfasst\",\n\t\t\t\"intro\": \"Eine neue Prüfung erfasst jedes Mitglied. Zum Einschränken fügen Sie die Personen hinzu, die sie erfassen sollen, und entfernen dann alle Mitglieder. Auch ein Admin erfasst sie nur, wenn er hinzugefügt ist.\",\n\t\t\t\"roster\": \"Wer sie erfasst\",\n\t\t\t\"everyMember\": \"Alle Mitglieder des Arbeitsbereichs\",\n\t\t\t\"you\": \"{{name}} (Sie)\",\n\t\t\t\"nobody\": \"Niemand erfasst diese Prüfung: Die Veröffentlichung wartet auf sie, bis jemand hinzugefügt ist.\",\n\t\t\t\"remove\": \"Entfernen\",\n\t\t\t\"removeOf\": \"{{name}} entfernen\",\n\t\t\t\"restoreEveryMember\": \"Alle Mitglieder erfassen lassen\",\n\t\t\t\"person\": \"Person\",\n\t\t\t\"personHelp\": \"Ein Mitglied des Arbeitsbereichs.\",\n\t\t\t\"personPlaceholder\": \"Mitglied wählen\",\n\t\t\t\"personRequired\": \"Wählen Sie ein Mitglied.\",\n\t\t\t\"add\": \"Hinzufügen\",\n\t\t\t\"close\": \"Schließen\",\n\t\t\t\"breakGlass\": \"Sie fügen sich selbst als Erfassende hinzu. Das wird angekündigt wie jede Änderung daran, wer eine Prüfung erfasst.\",\n\t\t\t\"denied\": \"Nur ein Admin des Arbeitsbereichs sieht und ändert, wer eine Pflichtprüfung erfasst.\",\n\t\t\t\"loadError\": \"Wer sie erfasst, konnte nicht geladen werden.\",\n\t\t\t\"failed\": \"Wer sie erfasst, konnte nicht geändert werden. Versuchen Sie es erneut.\"\n\t\t},\n\t\t\"yes\": \"Ja\",\n\t\t\"no\": \"Nein\",\n\t\t\"edit\": \"Bearbeiten\",\n\t\t\"remove\": \"Entfernen\",\n\t\t\"count_one\": \"{{count}} Pflichtprüfung\",\n\t\t\"count_other\": \"{{count}} Pflichtprüfungen\",\n\t\t\"empty\": \"Noch keine Pflichtprüfungen\",\n\t\t\"emptyHint\": \"Die Veröffentlichung wartet, bis jede Pflichtprüfung bestanden oder erlassen ist, etwa die juristische Prüfung jedes Branches oder eine Druckprobe des ganzen Change Sets.\",\n\t\t\"loadError\": \"Die Pflichtprüfungen konnten nicht geladen werden.\",\n\t\t\"form\": {\n\t\t\t\"createTitle\": \"Neue Pflichtprüfung\",\n\t\t\t\"editTitle\": \"Pflichtprüfung bearbeiten\",\n\t\t\t\"name\": \"Name\",\n\t\t\t\"nameHelp\": \"Prüfende sehen ihn im Reiter Prüfungen eines Change Sets.\",\n\t\t\t\"nameRequired\": \"Geben Sie einen Namen ein.\",\n\t\t\t\"nameTooLong\": \"Höchstens {{max}} Zeichen.\",\n\t\t\t\"oneLine\": \"Ein Name ist eine Zeile Text.\",\n\t\t\t\"nameTaken\": \"Es gibt bereits eine Pflichtprüfung namens „{{name}}“.\",\n\t\t\t\"scope\": \"Umfang\",\n\t\t\t\"scopeHelp\": \"Jeder Branch braucht ein Ergebnis je erfasstem Inhalt; das Change Set einmal braucht ein Ergebnis für das ganze Change Set.\",\n\t\t\t\"scopeRequired\": \"Wählen Sie einen Umfang.\",\n\t\t\t\"everyBlueprint\": \"Gilt für Inhalte jedes Blueprints\",\n\t\t\t\"accessors\": \"Blueprint-Accessoren\",\n\t\t\t\"accessorsHelp\": \"Ein Accessor je Zeile: Die Prüfung gilt nur für Inhalte dieser Blueprints.\",\n\t\t\t\"accessorsRequired\": \"Nennen Sie mindestens einen Blueprint oder lassen Sie sie für alle gelten.\",\n\t\t\t\"accessorTooLong\": \"Ein Accessor hat höchstens {{max}} Zeichen.\",\n\t\t\t\"independentLabel\": \"Unabhängig\",\n\t\t\t\"independentHelp\": \"Bestanden und erlassen werden abgelehnt, wenn sie von jemandem kommen, der eine Revision am Geprüften geschrieben hat.\",\n\t\t\t\"recorders\": \"Wer sie erfasst\",\n\t\t\t\"recordersHelp\": \"Die Ergebnisse einer neuen Prüfung erfasst jedes Mitglied des Arbeitsbereichs. Auf benannte Personen einschränken lässt es sich in der Zeile der Prüfung unter „Wer sie erfasst“.\",\n\t\t\t\"failed\": \"Die Pflichtprüfung konnte nicht gespeichert werden. Versuchen Sie es erneut.\",\n\t\t\t\"createSubmit\": \"Anlegen\",\n\t\t\t\"editSubmit\": \"Speichern\"\n\t\t},\n\t\t\"removeDialog\": {\n\t\t\t\"title\": \"Pflichtprüfung entfernen\",\n\t\t\t\"message\": \"Die Pflichtprüfung „{{name}}“ entfernen? Sie hält die Veröffentlichung sofort nicht mehr auf; ihre Ergebnisse bleiben erhalten und zählen nicht mehr.\",\n\t\t\t\"confirm\": \"Entfernen\",\n\t\t\t\"failed\": \"Die Pflichtprüfung konnte nicht entfernt werden. Versuchen Sie es erneut.\"\n\t\t}\n\t},\n\t\"collections\": {\n\t\t\"create\": \"Neue Sammlung\",\n\t\t\"columns\": {\n\t\t\t\"name\": \"Sammlung\",\n\t\t\t\"access\": \"Zugriff\",\n\t\t\t\"actions\": \"Aktionen\"\n\t\t},\n\t\t\"inPath\": \"in {{path}}\",\n\t\t\"root\": \"Oberste Ebene\",\n\t\t\"restricted\": \"Eingeschränkt\",\n\t\t\"open\": \"Offen\",\n\t\t\"rename\": \"Umbenennen\",\n\t\t\"moveAction\": \"Verschieben\",\n\t\t\"restrict\": \"Einschränken\",\n\t\t\"unrestrict\": \"Freigeben\",\n\t\t\"manageAccess\": \"Zugriff verwalten\",\n\t\t\"remove\": \"Entfernen\",\n\t\t\"count_one\": \"{{count}} Sammlung\",\n\t\t\"count_other\": \"{{count}} Sammlungen\",\n\t\t\"empty\": \"Noch keine Sammlungen\",\n\t\t\"emptyHint\": \"Sammlungen legen Inhalte nach der Ordnung des Arbeitsbereichs ab; eine eingeschränkte verbirgt ihre Inhalte vor allen ohne Freigabe.\",\n\t\t\"loadError\": \"Die Sammlungen konnten nicht geladen werden.\",\n\t\t\"workspaceMode\": {\n\t\t\t\"title\": \"Eingeschränkte Sammlungen brauchen den Guardian-Modus.\",\n\t\t\t\"description\": \"Dieser contenthub läuft im Workspace-Modus, in dem nichts eine Einschränkung durchsetzen könnte; Sammlungen einschränken und Zugriff gewähren sind daher aus. Früher eingeschränkte Sammlungen lassen sich weiterhin freigeben.\"\n\t\t},\n\t\t\"form\": {\n\t\t\t\"createTitle\": \"Neue Sammlung\",\n\t\t\t\"renameTitle\": \"Sammlung umbenennen\",\n\t\t\t\"name\": \"Name\",\n\t\t\t\"nameHelp\": \"Eindeutig unter den Sammlungen daneben.\",\n\t\t\t\"nameRequired\": \"Geben Sie einen Namen ein.\",\n\t\t\t\"nameTooLong\": \"Höchstens {{max}} Zeichen.\",\n\t\t\t\"oneLine\": \"Ein Name ist eine Zeile Text.\",\n\t\t\t\"nameTaken\": \"Dort gibt es bereits eine Sammlung namens „{{name}}“.\",\n\t\t\t\"parent\": \"In\",\n\t\t\t\"restrictedLabel\": \"Eingeschränkt\",\n\t\t\t\"restrictedHelp\": \"Darin abgelegte Inhalte sehen nur, die dafür freigegeben sind. Sie werden ihr Eigentümer.\",\n\t\t\t\"failed\": \"Die Sammlung konnte nicht gespeichert werden. Versuchen Sie es erneut.\",\n\t\t\t\"createSubmit\": \"Anlegen\",\n\t\t\t\"renameSubmit\": \"Umbenennen\"\n\t\t},\n\t\t\"move\": {\n\t\t\t\"title\": \"„{{name}}“ verschieben\",\n\t\t\t\"parent\": \"Verschieben nach\",\n\t\t\t\"parentHelp\": \"Alles darunter wandert mit. Was darin abgelegt ist, bleibt abgelegt.\",\n\t\t\t\"submit\": \"Verschieben\"\n\t\t},\n\t\t\"restrictDialog\": {\n\t\t\t\"title\": \"Sammlung einschränken\",\n\t\t\t\"message\": \"„{{name}}“ einschränken? Darin abgelegte Inhalte sind dann in der Bearbeitung vor allen ohne Freigabe verborgen, und Sie werden ihr Eigentümer, der die Freigaben verwaltet.\",\n\t\t\t\"confirm\": \"Einschränken\",\n\t\t\t\"failed\": \"Die Sammlung konnte nicht eingeschränkt werden. Versuchen Sie es erneut.\"\n\t\t},\n\t\t\"unrestrictDialog\": {\n\t\t\t\"title\": \"Sammlung freigeben\",\n\t\t\t\"message\": \"„{{name}}“ freigeben? Alle Mitglieder des Arbeitsbereichs sehen dann die darin abgelegten Inhalte, und alle Freigaben darauf entfallen. Damit wird gesperrte Arbeit offengelegt.\",\n\t\t\t\"confirm\": \"Freigeben und offenlegen\",\n\t\t\t\"failed\": \"Die Sammlung konnte nicht freigegeben werden. Versuchen Sie es erneut.\"\n\t\t},\n\t\t\"removeDialog\": {\n\t\t\t\"title\": \"Sammlung entfernen\",\n\t\t\t\"message\": \"Die Sammlung „{{name}}“ entfernen? Die darin abgelegten Inhalte werden aus ihr entfernt und bleiben sonst unverändert.\",\n\t\t\t\"confirm\": \"Entfernen\",\n\t\t\t\"failed\": \"Die Sammlung konnte nicht entfernt werden. Versuchen Sie es erneut.\"\n\t\t},\n\t\t\"access\": {\n\t\t\t\"title\": \"Zugriff auf „{{name}}“\",\n\t\t\t\"intro\": \"Nur die Personen unten sehen die hier abgelegten Inhalte. Sich selbst Zugriff zu geben ist ein Notzugriff: Der Eigentümer erfährt davon wie von jeder Freigabe.\",\n\t\t\t\"roster\": \"Wer Zugriff hat\",\n\t\t\t\"levels\": {\n\t\t\t\t\"owner\": \"Eigentümer\",\n\t\t\t\t\"editor\": \"Bearbeiten\",\n\t\t\t\t\"viewer\": \"Ansehen\"\n\t\t\t},\n\t\t\t\"you\": \"{{name}} (Sie)\",\n\t\t\t\"nobody\": \"Außer dem Eigentümer ist niemand freigegeben.\",\n\t\t\t\"revoke\": \"Entziehen\",\n\t\t\t\"revokeOf\": \"{{name}} entziehen\",\n\t\t\t\"person\": \"Person\",\n\t\t\t\"personHelp\": \"Ein Mitglied des Arbeitsbereichs. Eine erneute Freigabe ändert die Stufe.\",\n\t\t\t\"personPlaceholder\": \"Mitglied wählen\",\n\t\t\t\"personRequired\": \"Wählen Sie ein Mitglied.\",\n\t\t\t\"level\": \"Stufe\",\n\t\t\t\"grant\": \"Freigeben\",\n\t\t\t\"close\": \"Schließen\",\n\t\t\t\"breakGlass\": \"Sie geben sich selbst Zugriff auf eingeschränkte Arbeit. Der Eigentümer erfährt davon wie von jeder Freigabe.\",\n\t\t\t\"denied\": \"Nur der Eigentümer der Sammlung oder ein Admin des Arbeitsbereichs sieht und verwaltet die Freigaben.\",\n\t\t\t\"loadError\": \"Die Freigaben konnten nicht geladen werden.\",\n\t\t\t\"failed\": \"Die Freigabe konnte nicht geändert werden. Versuchen Sie es erneut.\"\n\t\t}\n\t},\n\t\"changeSets\": {\n\t\t\"title\": \"Change Sets\",\n\t\t\"create\": \"Neues Change Set\",\n\t\t\"columns\": {\n\t\t\t\"name\": \"Name\",\n\t\t\t\"state\": \"Zustand\",\n\t\t\t\"status\": \"Status\",\n\t\t\t\"assignees\": \"Zuständig\",\n\t\t\t\"created\": \"Angelegt\"\n\t\t},\n\t\t\"state\": {\n\t\t\t\"open\": \"Offen\",\n\t\t\t\"published\": \"Veröffentlicht\",\n\t\t\t\"discarded\": \"Verworfen\"\n\t\t},\n\t\t\"sourceLine\": \"{{reference}}, {{date}}\",\n\t\t\"filter\": {\n\t\t\t\"state\": \"Zustand\",\n\t\t\t\"anyState\": \"Jeder Zustand\",\n\t\t\t\"assignee\": \"Zuständig\",\n\t\t\t\"anyone\": \"Alle\",\n\t\t\t\"me\": \"Mir zugewiesen\"\n\t\t},\n\t\t\"count_one\": \"{{count}} Change Set\",\n\t\t\"count_other\": \"{{count}} Change Sets\",\n\t\t\"empty\": \"Hier gibt es keine Change Sets\",\n\t\t\"emptyHint\": \"Ein Change Set bündelt die Arbeit, die eine Veröffentlichung auslöst, etwa eine Verkündung im Gesetzblatt, und wird als Ganzes veröffentlicht.\",\n\t\t\"loadError\": \"Die Change Sets konnten nicht geladen werden.\",\n\t\t\"form\": {\n\t\t\t\"createTitle\": \"Neues Change Set\",\n\t\t\t\"name\": \"Name\",\n\t\t\t\"nameHelp\": \"Woran die Redaktion es erkennt, etwa das Gesetzblatt, das es umsetzt.\",\n\t\t\t\"nameRequired\": \"Gib einen Namen ein.\",\n\t\t\t\"tooLong\": \"Höchstens {{max}} Zeichen.\",\n\t\t\t\"oneLine\": \"Eine einzige Textzeile.\",\n\t\t\t\"sourceDate\": \"Datum der Quelle\",\n\t\t\t\"sourceDateHelp\": \"Der Tag, an dem die auslösende Veröffentlichung erschien. Lass beide Felder der Quelle leer für eine Korrektur ohne Quelle.\",\n\t\t\t\"sourceReference\": \"Fundstelle der Quelle\",\n\t\t\t\"sourceReferenceHelp\": \"Wie die Veröffentlichung zitiert wird, etwa „BGBl. 2026 I Nr. 270“.\",\n\t\t\t\"sourceDateRequired\": \"Eine Quelle braucht auch ihr Datum.\",\n\t\t\t\"sourceReferenceRequired\": \"Eine Quelle braucht auch ihre Fundstelle.\",\n\t\t\t\"failed\": \"Das Change Set konnte nicht angelegt werden. Versuche es erneut.\",\n\t\t\t\"createSubmit\": \"Anlegen\"\n\t\t},\n\t\t\"more\": \"Mehr anzeigen\"\n\t},\n\t\"branch\": {\n\t\t\"loading\": \"Inhalt wird geladen…\",\n\t\t\"unavailable\": \"Inhalt nicht verfügbar\",\n\t\t\"notFound\": \"Diesen Inhalt gibt es in diesem Change Set nicht.\",\n\t\t\"loadError\": \"Der Inhalt konnte nicht geladen werden.\",\n\t\t\"tabs\": {\n\t\t\t\"content\": \"Inhalt\",\n\t\t\t\"release\": \"Release\",\n\t\t\t\"compare\": \"Vergleich\",\n\t\t\t\"references\": \"Verweise\"\n\t\t},\n\t\t\"save\": \"Speichern\",\n\t\t\"saveChanged_one\": \"Speichern · {{count}} Tab geändert\",\n\t\t\"saveChanged_other\": \"Speichern · {{count}} Tabs geändert\",\n\t\t\"saved\": \"Gespeichert.\",\n\t\t\"unsavedChanges\": \"Ungespeicherte Änderungen\",\n\t\t\"noRelease\": \"Das Blueprint Release dieses Inhalts lässt sich nicht anzeigen, daher sind seine Daten hier nicht bearbeitbar.\",\n\t\t\"otherBranch\": \"Dies ist ein früherer Branch seiner Chain. Bearbeitet wird hier nur der letzte Branch der Chain.\",\n\t\t\"closed\": \"Dieses Change Set ist geschlossen: seine Inhalte sind nicht mehr bearbeitbar.\",\n\t\t\"reload\": \"Neu laden\",\n\t\t\"violation\": \"Abgelehnt: {{code}}\",\n\t\t\"refused\": {\n\t\t\t\"stale\": \"Jemand hat diesen Branch inzwischen gespeichert. Ihre Änderungen wurden nicht gespeichert.\",\n\t\t\t\"staleHint\": \"Laden Sie neu, um das Gespeicherte zu bearbeiten; Ihre ungespeicherten Änderungen gehen dabei verloren. Es wird nichts zusammengeführt.\",\n\t\t\t\"violations_one\": \"Die Daten wurden aus {{count}} Grund abgelehnt.\",\n\t\t\t\"violations_other\": \"Die Daten wurden aus {{count}} Gründen abgelehnt.\",\n\t\t\t\"invalid\": \"Einige Felder müssen vor dem Speichern korrigiert werden.\",\n\t\t\t\"releaseInvalid\": \"Das Release muss vor dem Speichern korrigiert werden. Nichts wurde gespeichert.\",\n\t\t\t\"covers\": \"Der Gültigkeitszeitraum würde {{releases}} vollständig überdecken, daher wurde das Release nicht geplant.\",\n\t\t\t\"coversHint\": \"Ersetzen Sie sie oder ändern Sie die Daten.\",\n\t\t\t\"supersede\": \"Ersetzen\",\n\t\t\t\"releaseViolations_one\": \"Die Release-Spec-Werte wurden aus {{count}} Grund abgelehnt.\",\n\t\t\t\"releaseViolations_other\": \"Die Release-Spec-Werte wurden aus {{count}} Gründen abgelehnt.\",\n\t\t\t\"contentSaved\": \"Der Inhalt wurde gespeichert, das Release nicht.\"\n\t\t},\n\t\t\"leave\": {\n\t\t\t\"title\": \"Mit ungespeicherten Änderungen verlassen?\",\n\t\t\t\"message\": \"Ihre Änderungen an diesem Branch sind noch nicht gespeichert. Trotzdem verlassen?\",\n\t\t\t\"confirm\": \"Verlassen\",\n\t\t\t\"cancel\": \"Bleiben\"\n\t\t},\n\t\t\"pendingMerge\": \"Die Aktualisierung von Main ist auf diesem Branch angehalten: Lösen oder verwerfen Sie die Zusammenführung über die Seitenleiste, bevor Sie speichern.\",\n\t\t\"release\": {\n\t\t\t\"unplanned\": \"Für diesen Branch ist noch kein Release geplant: Die Veröffentlichung würde ihn ablehnen.\",\n\t\t\t\"planIt\": \"Release dieses Branches planen\",\n\t\t\t\"firstDay\": \"Erster Tag\",\n\t\t\t\"lastDay\": \"Letzter Tag\",\n\t\t\t\"lastDayHelp\": \"Leer lassen für ein offenes Ende: Es endet dann am Tag vor dem Beginn des nächsten späteren Release.\",\n\t\t\t\"undated\": \"Dieser Inhalt ist undatiert: Sein Release gilt ab der Veröffentlichung des Change Sets.\",\n\t\t\t\"supersedes\": \"Ersetzt\",\n\t\t\t\"supersedesHelp\": \"Die Releases, die dieses ersetzt: das korrigierte oder die von seinem Zeitraum überdeckten.\",\n\t\t\t\"supersedesNone\": \"Keine\",\n\t\t\t\"specTitle\": \"Release Spec\",\n\t\t\t\"cutsInto\": \"Schneidet an\",\n\t\t\t\"covers\": \"Überdeckt vollständig\",\n\t\t\t\"coversWarning\": \"Dieser Zeitraum überdeckt {{releases}} vollständig: Ersetzen Sie sie oder ändern Sie die Daten.\",\n\t\t\t\"proposals\": \"Vorschläge\",\n\t\t\t\"proposalsHelp\": \"Vom Change Set bei jeder Planänderung aus den Plänen abgeleitet; nie von Hand bearbeitet.\",\n\t\t\t\"noProposals\": \"Keine Vorschläge: Die Pläne schneiden kein Release an.\",\n\t\t\t\"cut\": \"Beendet es am Vortag\",\n\t\t\t\"tail\": \"Setzt {{release}} danach fort\",\n\t\t\t\"withheld\": \"Zurückgehalten: Ein Plan ersetzt das Release, das er trägt\",\n\t\t\t\"firstDayRequired\": \"Ein Release datierter Inhalte braucht seinen ersten Tag.\",\n\t\t\t\"lastDayBefore\": \"Der letzte Tag kann nicht vor dem ersten liegen.\",\n\t\t\t\"columns\": {\n\t\t\t\t\"ends\": \"Release\",\n\t\t\t\t\"what\": \"Vorschlag\",\n\t\t\t\t\"period\": \"Gültigkeitszeitraum\"\n\t\t\t}\n\t\t},\n\t\t\"compare\": {\n\t\t\t\"fork\": \"Mit dem Abzweig\",\n\t\t\t\"main\": \"Mit Main\",\n\t\t\t\"between\": \"{{head}} verglichen mit {{base}}\",\n\t\t\t\"born\": \"Dieser Inhalt ist im Change Set entstanden: Es gibt kein Main zum Vergleichen.\"\n\t\t},\n\t\t\"rail\": {\n\t\t\t\"eyebrow\": \"Branch\",\n\t\t\t\"actions\": \"Aktionen\",\n\t\t\t\"about\": \"Info\",\n\t\t\t\"fork\": \"Abgezweigt von\",\n\t\t\t\"forkMain\": \"Stand von Main\",\n\t\t\t\"forkBorn\": \"In diesem Change Set entstanden\",\n\t\t\t\"effectiveOn\": \"Gilt ab\",\n\t\t\t\"undated\": \"Mit der Veröffentlichung\",\n\t\t\t\"position\": \"In seiner Kette\",\n\t\t\t\"positionOf\": \"Branch {{position}} von {{count}}\",\n\t\t\t\"head\": \"Stand\",\n\t\t\t\"pendingMerge\": \"Offene Zusammenführung\",\n\t\t\t\"pendingMergeYes\": \"Wartet auf Auflösung\",\n\t\t\t\"updateFromMain\": \"Von Main aktualisieren\",\n\t\t\t\"resolveMerge\": \"Zusammenführung lösen\",\n\t\t\t\"compareFork\": \"Mit dem Abzweig vergleichen\",\n\t\t\t\"preview\": \"Vorschau\",\n\t\t\t\"appendBranch\": \"Branch anhängen\",\n\t\t\t\"dropChain\": \"Kette entfernen\"\n\t\t},\n\t\t\"update\": {\n\t\t\t\"title\": \"Von Main aktualisieren\",\n\t\t\t\"message\": \"Übernimmt in die Kette dieses Inhalts, was inzwischen veröffentlicht wurde. Widersprüchliche Felder halten die Zusammenführung an; nichts wird ungefragt zusammengeführt.\",\n\t\t\t\"merged\": \"Dieser Branch hat übernommen, was Main hinzugewonnen hat.\",\n\t\t\t\"upToDate\": \"Dieser Branch war aktuell.\",\n\t\t\t\"stopped\": \"Die Zusammenführung ist auf diesem Branch angehalten: Lösen Sie sie Feld für Feld oder verwerfen Sie sie.\",\n\t\t\t\"resolve\": \"Zusammenführung lösen\"\n\t\t},\n\t\t\"merge\": {\n\t\t\t\"title\": \"Zusammenführung lösen\",\n\t\t\t\"conflict\": \"Beide Seiten haben diese Felder geändert. Wählen Sie für jedes den Wert; alle anderen Felder werden zusammengeführt.\",\n\t\t\t\"invalid\": \"Die zusammengeführten Daten verletzen das Blueprint-Release in diesen Feldern. Wählen Sie für jedes den Wert.\",\n\t\t\t\"ours\": \"Dieser Branch: {{value}}\",\n\t\t\t\"theirs\": \"Übernommen: {{value}}\",\n\t\t\t\"base\": \"Vorher: {{value}}\",\n\t\t\t\"decide\": \"Wählen Sie einen Wert.\",\n\t\t\t\"resolve\": \"Lösen\",\n\t\t\t\"abort\": \"Zusammenführung verwerfen\",\n\t\t\t\"none\": \"Dieser Branch hat keine offene Zusammenführung.\",\n\t\t\t\"loadError\": \"Die offene Zusammenführung konnte nicht geladen werden.\",\n\t\t\t\"stale\": \"Jemand hat diesen Branch inzwischen gespeichert: Schließen und öffnen Sie die Zusammenführung erneut.\"\n\t\t},\n\t\t\"preview\": {\n\t\t\t\"title\": \"Vorschau\",\n\t\t\t\"day\": \"In Kraft am\",\n\t\t\t\"dayHelp\": \"Gelesen, als wäre dieses Change Set jetzt veröffentlicht. Leer ist heute.\",\n\t\t\t\"nothing\": \"An diesem Tag wäre nichts in Kraft.\",\n\t\t\t\"planned\": \"Das Release {{release}} dieses Change Sets wäre in Kraft.\",\n\t\t\t\"published\": \"Das veröffentlichte Release {{release}} bliebe in Kraft.\",\n\t\t\t\"withheld\": \"Eingeschränkter Inhalt ohne Freigabe für Sie: Was das Change Set daran ändert, bleibt verborgen.\",\n\t\t\t\"period\": \"Gültigkeitszeitraum\",\n\t\t\t\"badDay\": \"Geben Sie einen Tag als JJJJ-MM-TT an oder lassen Sie das Feld leer für heute.\"\n\t\t},\n\t\t\"append\": {\n\t\t\t\"title\": \"Branch anhängen\",\n\t\t\t\"message\": \"Ändert diesen Inhalt ab einem späteren Datum erneut: Der neue Branch beginnt beim letzten Stand dieser Kette.\",\n\t\t\t\"effectiveOn\": \"Gilt ab\",\n\t\t\t\"required\": \"Geben Sie das Datum an, ab dem die Änderung gilt.\",\n\t\t\t\"after\": \"Geben Sie einen Tag nach {{day}} an, dem letzten Datum der Kette.\",\n\t\t\t\"submit\": \"Anhängen\"\n\t\t},\n\t\t\"drop\": {\n\t\t\t\"title\": \"Kette entfernen\",\n\t\t\t\"message\": \"Entfernt {{content}} mit seinen geplanten Releases aus diesem Change Set. Seine Revisionen bleiben in der Historie.\",\n\t\t\t\"confirm\": \"Kette entfernen\",\n\t\t\t\"failed\": \"Die Kette konnte nicht entfernt werden. Bitte erneut versuchen.\"\n\t\t}\n\t},\n\t\"changeSet\": {\n\t\t\"loading\": \"Change Set wird geladen\",\n\t\t\"unavailable\": \"Change Set nicht verfügbar\",\n\t\t\"notFound\": \"Dieses Change Set gibt es nicht.\",\n\t\t\"loadError\": \"Das Change Set konnte nicht geladen werden.\",\n\t\t\"tabs\": {\n\t\t\t\"general\": \"Allgemein\",\n\t\t\t\"contents\": \"Inhalte\",\n\t\t\t\"releases\": \"Releases\",\n\t\t\t\"checks\": \"Prüfungen\"\n\t\t},\n\t\t\"save\": \"Speichern\",\n\t\t\"saveChanged_one\": \"Speichern · {{count}} Tab geändert\",\n\t\t\"saveChanged_other\": \"Speichern · {{count}} Tabs geändert\",\n\t\t\"saved\": \"Gespeichert.\",\n\t\t\"refused\": {\n\t\t\t\"transition\": \"Der Status kann nicht von {{from}} zu {{to}} wechseln.\",\n\t\t\t\"staleStatus\": \"Inzwischen hat jemand den Status auf {{current}} gesetzt. Wähle erneut und speichere.\",\n\t\t\t\"closed\": \"Dieses Change Set ist geschlossen: Es wurde inzwischen veröffentlicht oder verworfen.\",\n\t\t\t\"invalid\": \"Die Änderung wurde abgelehnt.\",\n\t\t\t\"failed\": \"Die Änderungen konnten nicht gespeichert werden. Versuche es erneut.\",\n\t\t\t\"guarded\": \"Du darfst den Status nicht von {{from}} zu {{to}} wechseln.\",\n\t\t\t\"unavailable\": \"Change-Set-Status können gerade nicht geprüft werden. Speichere gleich noch einmal.\"\n\t\t},\n\t\t\"leave\": {\n\t\t\t\"title\": \"Mit ungespeicherten Änderungen verlassen?\",\n\t\t\t\"message\": \"Deine Änderungen an diesem Change Set sind noch nicht gespeichert. Trotzdem verlassen?\",\n\t\t\t\"confirm\": \"Verlassen\",\n\t\t\t\"cancel\": \"Bleiben\"\n\t\t},\n\t\t\"general\": {\n\t\t\t\"about\": \"Überblick\",\n\t\t\t\"name\": \"Name\",\n\t\t\t\"source\": \"Quelle\",\n\t\t\t\"noSource\": \"Keine\",\n\t\t\t\"state\": \"Zustand\",\n\t\t\t\"createdBy\": \"Angelegt von\",\n\t\t\t\"frozenHint\": \"Name und Quelle ändern sich nicht mehr: Das Change Set ist abgeschlossen.\",\n\t\t\t\"work\": \"Arbeit\",\n\t\t\t\"status\": \"Status\",\n\t\t\t\"noStatus\": \"Kein Status\",\n\t\t\t\"statusHelp\": \"Wo die Arbeit steht. Er entscheidet nie, ob das Change Set veröffentlicht werden kann.\",\n\t\t\t\"statusFrozen\": \"Eingefroren: Das Change Set ist geschlossen.\",\n\t\t\t\"assignees\": \"Zuständig\",\n\t\t\t\"assigneesHelp\": \"Wer gerade daran arbeitet.\",\n\t\t\t\"nobody\": \"Niemand\",\n\t\t\t\"dependencies\": \"Hängt ab von\",\n\t\t\t\"dependenciesHelp\": \"Offene Change Sets, auf denen dieses aufbaut. Es kann erst nach ihnen veröffentlicht werden.\",\n\t\t\t\"dependenciesClosed\": \"Abhängigkeiten ändern sich nicht mehr, sobald ein Change Set geschlossen ist.\",\n\t\t\t\"noDependencies\": \"Keine Abhängigkeiten\"\n\t\t},\n\t\t\"contents\": {\n\t\t\t\"columns\": {\n\t\t\t\t\"content\": \"Content\",\n\t\t\t\t\"branches\": \"Branches\",\n\t\t\t\t\"born\": \"Herkunft\"\n\t\t\t},\n\t\t\t\"branch\": \"Branch\",\n\t\t\t\"branches\": \"Branches\",\n\t\t\t\"bornHere\": \"Hier angelegt\",\n\t\t\t\"onMain\": \"Veröffentlicht\",\n\t\t\t\"empty\": \"Noch kein Content in diesem Change Set\",\n\t\t\t\"emptyHint\": \"Beginne, einen Content in diesem Change Set zu bearbeiten, dann erscheint seine Chain hier.\"\n\t\t},\n\t\t\"rail\": {\n\t\t\t\"eyebrow\": \"Change Set\",\n\t\t\t\"actions\": \"Aktionen\",\n\t\t\t\"publish\": \"Veröffentlichen\",\n\t\t\t\"updateFromMain\": \"Aus Main aktualisieren\",\n\t\t\t\"discard\": \"Verwerfen\",\n\t\t\t\"about\": \"Überblick\",\n\t\t\t\"blockers_one\": \"Hindernis\",\n\t\t\t\"blockers_other\": \"Hindernisse\",\n\t\t\t\"readiness\": \"Bereit zur Veröffentlichung\",\n\t\t\t\"ready\": \"Bereit\",\n\t\t\t\"unknownReadiness\": \"Unbekannt\",\n\t\t\t\"status\": \"Status\",\n\t\t\t\"noStatus\": \"Kein Status\",\n\t\t\t\"state\": \"Zustand\",\n\t\t\t\"source\": \"Quelle\",\n\t\t\t\"noSource\": \"Keine Quelle\"\n\t\t},\n\t\t\"review\": {\n\t\t\t\"title\": \"{{name}} veröffentlichen\",\n\t\t\t\"checking\": \"Prüfe, was die Veröffentlichung täte …\",\n\t\t\t\"loadError\": \"Die Prüfung konnte nicht laufen. Schließe sie und versuche es erneut.\",\n\t\t\t\"headsTitle\": \"Geprüfte Stände\",\n\t\t\t\"headsHint\": \"Veröffentlicht werden genau diese Stände. Ändert sich einer davor, wird die Veröffentlichung abgelehnt und nichts geschrieben.\",\n\t\t\t\"headLine\": \"{{content}} · Branch {{branch}} auf {{head}}\",\n\t\t\t\"noHeads\": \"Keine Branches: es entstehen nur Releases ohne Branch.\",\n\t\t\t\"blockersTitle_one\": \"{{count}} Hindernis\",\n\t\t\t\"blockersTitle_other\": \"{{count}} Hindernisse\",\n\t\t\t\"blockersHint\": \"Behebe jedes davon und prüfe dann erneut.\",\n\t\t\t\"ready\": \"Nichts steht dieser Veröffentlichung im Weg.\",\n\t\t\t\"releasesTitle\": \"Entstehende Releases\",\n\t\t\t\"noReleases\": \"Es entsteht kein Release.\",\n\t\t\t\"releaseLine\": \"{{content}} · {{kind}} · {{period}}\",\n\t\t\t\"publish\": \"Veröffentlichen\",\n\t\t\t\"again\": \"Erneut prüfen\",\n\t\t\t\"refused\": \"Die Veröffentlichung wurde abgelehnt. Nichts wurde geschrieben.\",\n\t\t\t\"closed\": \"Dieses Change Set wurde inzwischen veröffentlicht oder verworfen.\",\n\t\t\t\"withheld\": \"Dieses Change Set enthält Arbeit, die du nicht sehen kannst. Nur wer alle seine Inhalte sieht, kann es veröffentlichen.\",\n\t\t\t\"failed\": \"Die Veröffentlichung ist fehlgeschlagen. Versuche es erneut.\",\n\t\t\t\"published\": \"Veröffentlicht.\",\n\t\t\t\"alreadyPublished\": \"Es ist mit diesen Ständen bereits veröffentlicht.\",\n\t\t\t\"openContent\": \"{{content}} öffnen\"\n\t\t},\n\t\t\"blockers\": {\n\t\t\t\"moved_head\": \"{{content}}: Branch {{branch}} ist seit der Prüfung von {{expected}} auf {{current}} weitergegangen.\",\n\t\t\t\"moved_head_unreviewed\": \"{{content}}: Branch {{branch}} auf {{current}} war nicht Teil der Prüfung.\",\n\t\t\t\"moved_head_gone\": \"Branch {{branch}} wurde geprüft, gehört aber nicht mehr zu diesem Change Set.\",\n\t\t\t\"unplanned_branch\": \"{{content}}: Branch {{branch}} hat kein geplantes Release; die Veröffentlichung würde ihn beenden, ohne ihn zu releasen.\",\n\t\t\t\"several_branches\": \"{{content}} ist undatierter Content auf mehr als einem Branch; er wird auf genau einem bearbeitet.\",\n\t\t\t\"behind_base\": \"{{content}}: Branch {{branch}} liegt hinter {{current}}, zuletzt übernommen wurde {{expected}}. Aus Main aktualisieren.\",\n\t\t\t\"superseded_release\": \"{{content}}: Das geplante Release {{release}} ersetzt {{overlaps}}, das bereits ersetzt ist.\",\n\t\t\t\"overlapping_periods\": \"{{content}}: Der Gültigkeitszeitraum von {{release}} überschneidet sich mit dem von {{overlaps}}. Ersetze es oder ändere die Daten.\",\n\t\t\t\"covers_release\": \"{{content}}: Der Gültigkeitszeitraum von {{release}} deckt Release {{covered}} vollständig ab. Ersetze es oder ändere die Daten.\",\n\t\t\t\"pending_merge\": \"{{content}}: Branch {{branch}} hat einen offenen Merge. Löse ihn im Branch-Editor auf oder brich ihn ab.\",\n\t\t\t\"nothing_in_force\": \"{{content}}: Die Aufhebung {{release}} findet nichts mehr in Kraft, das sie aufheben könnte.\",\n\t\t\t\"withdrawal_with_chain\": \"{{content}} wird in diesem Change Set zugleich aufgehoben ({{release}}) und bearbeitet. Entferne eines davon.\",\n\t\t\t\"dated_changed\": \"{{content}} ist datierter Content geworden, nachdem {{release}} undatiert geplant wurde. Entferne die Chain und beginne sie mit Datum neu.\",\n\t\t\t\"unpublished_dependency\": \"Es hängt von Change Set {{dependency}} ab, das noch offen ist. Veröffentliche es zuerst oder entferne die Abhängigkeit.\",\n\t\t\t\"discarded_dependency\": \"Es hängt von Change Set {{dependency}} ab, das verworfen wurde. Entferne die Abhängigkeit und aktualisiere dann aus Main.\",\n\t\t\t\"dangling_pin\": \"{{content}}: Der Wert an {{path}} verweist auf Release {{release}} von {{target}}, das es nicht geben wird.\",\n\t\t\t\"second_toc_parent\": \"{{content}} stünde im Inhaltsverzeichnis von {{parents}}; es kann nur in einem stehen.\",\n\t\t\t\"missing_asset\": \"{{content}}: Der Wert an {{path}} zeigt Asset {{asset}}, das es nicht gibt.\",\n\t\t\t\"media_unavailable\": \"MediaHub ist für diesen Workspace nicht verfügbar.\",\n\t\t\t\"missing_required_field\": \"{{content}}: Das Pflichtfeld {{path}} ist in {{revision}} leer. Fülle es im Branch-Editor aus.\",\n\t\t\t\"outstanding_check\": \"{{check}} hat kein bestandenes oder erlassenes Ergebnis auf den aktuellen Ständen.\",\n\t\t\t\"outstanding_check_on\": \"{{check}} hat kein bestandenes oder erlassenes Ergebnis für {{content}} ({{subject}}).\",\n\t\t\t\"unknown\": \"Blockiert: {{code}}.\"\n\t\t},\n\t\t\"releases\": {\n\t\t\t\"planned\": \"Geplante Releases\",\n\t\t\t\"columns\": {\n\t\t\t\t\"content\": \"Content\",\n\t\t\t\t\"kind\": \"Art\",\n\t\t\t\t\"period\": \"Gültigkeitszeitraum\",\n\t\t\t\t\"pins\": \"Verweist auf\",\n\t\t\t\t\"origin\": \"Herkunft\"\n\t\t\t},\n\t\t\t\"kind\": {\n\t\t\t\t\"revision\": \"Revision\",\n\t\t\t\t\"date_only\": \"Nur Datum\",\n\t\t\t\t\"repeal\": \"Aufhebung\",\n\t\t\t\t\"withdrawal\": \"Rücknahme\"\n\t\t\t},\n\t\t\t\"openEnd\": \"offen\",\n\t\t\t\"undated\": \"Undatiert\",\n\t\t\t\"period\": \"{{first}} – {{last}}\",\n\t\t\t\"branchHead\": \"Stand von Branch {{branch}}\",\n\t\t\t\"revision\": \"Revision {{revision}}\",\n\t\t\t\"plannedByHand\": \"Geplant\",\n\t\t\t\"proposed\": \"Vorgeschlagen für {{release}}\",\n\t\t\t\"splitFrom\": \"Setzt {{release}} fort\",\n\t\t\t\"withheld\": \"Zurückgehalten: ein Plan ersetzt, was es trägt\",\n\t\t\t\"proposedHint\": \"Vorschläge folgen aus den geplanten Gültigkeitszeiträumen und werden mit jedem Plan neu berechnet; sie sind nicht bearbeitbar.\",\n\t\t\t\"empty\": \"Noch keine geplanten Releases\",\n\t\t\t\"emptyHint\": \"Plane ein Release auf einem Branch im Branch-Editor, dann erscheint hier, was die Veröffentlichung erzeugt.\",\n\t\t\t\"covered\": \"Abgedeckte Releases\",\n\t\t\t\"coveredHint\": \"Veröffentlichte Releases, die ein Plan abdeckt: Die Veröffentlichung ersetzt die, die ein Plan nennt, und wird für die übrigen abgelehnt, bis ein Plan sie ersetzt oder sich die Daten ändern.\",\n\t\t\t\"coveredColumns\": {\n\t\t\t\t\"release\": \"Release\",\n\t\t\t\t\"by\": \"Abgedeckt von\",\n\t\t\t\t\"outcome\": \"Bei Veröffentlichung\"\n\t\t\t},\n\t\t\t\"superseded\": \"Ersetzt\",\n\t\t\t\"blocks\": \"Verhindert die Veröffentlichung\",\n\t\t\t\"noCovered\": \"Kein veröffentlichtes Release ist abgedeckt.\"\n\t\t},\n\t\t\"checks\": {\n\t\t\t\"columns\": {\n\t\t\t\t\"check\": \"Pflichtprüfung\",\n\t\t\t\t\"on\": \"Für\",\n\t\t\t\t\"latest\": \"Letztes Ergebnis\",\n\t\t\t\t\"standing\": \"Stand\",\n\t\t\t\t\"actions\": \"Aktionen\"\n\t\t\t},\n\t\t\t\"wholeChangeSet\": \"Das ganze Change Set\",\n\t\t\t\"onBranch\": \"{{content}} · Branch {{branch}}\",\n\t\t\t\"onRelease\": \"{{content}} · Release {{release}}\",\n\t\t\t\"none\": \"Noch kein Ergebnis\",\n\t\t\t\"latest\": \"{{outcome}} von {{who}}\",\n\t\t\t\"outcome\": {\n\t\t\t\t\"passed\": \"Bestanden\",\n\t\t\t\t\"failed\": \"Nicht bestanden\",\n\t\t\t\t\"waived\": \"Erlassen\"\n\t\t\t},\n\t\t\t\"cleared\": \"Erfüllt\",\n\t\t\t\"stale\": \"Veraltet: seitdem gespeichert\",\n\t\t\t\"outstanding\": \"Ausstehend\",\n\t\t\t\"record\": \"Ergebnis erfassen\",\n\t\t\t\"independent\": \"Unabhängig\",\n\t\t\t\"empty\": \"Keine Pflichtprüfung gilt\",\n\t\t\t\"emptyHint\": \"Die Pflichtprüfungen des Workspaces sperren die Veröffentlichung des Contents, den sie nennen. Keine davon gilt für dieses Change Set.\",\n\t\t\t\"loadError\": \"Die Prüfergebnisse konnten nicht geladen werden.\",\n\t\t\t\"form\": {\n\t\t\t\t\"title\": \"Ergebnis von {{check}} erfassen\",\n\t\t\t\t\"on\": \"Für {{subject}}, auf den Ständen, die du jetzt siehst.\",\n\t\t\t\t\"outcome\": \"Ergebnis\",\n\t\t\t\t\"note\": \"Notiz\",\n\t\t\t\t\"noteHelp\": \"Warum, bei einem Erlass; sonst optional.\",\n\t\t\t\t\"noteRequired\": \"Ein Erlass braucht eine Notiz mit dem Grund.\",\n\t\t\t\t\"noteTooLong\": \"Höchstens {{max}} Zeichen.\",\n\t\t\t\t\"submit\": \"Erfassen\",\n\t\t\t\t\"stale\": \"Seit dem Öffnen hat jemand gespeichert. Schließe den Dialog, sieh erneut hin und erfasse auf den neuen Ständen.\",\n\t\t\t\t\"denied\": \"Du darfst dieses Ergebnis nicht erfassen.\",\n\t\t\t\t\"closed\": \"Dieses Change Set ist geschlossen und nimmt keine Ergebnisse mehr an.\",\n\t\t\t\t\"failed\": \"Das Ergebnis konnte nicht erfasst werden. Versuche es erneut.\"\n\t\t\t}\n\t\t},\n\t\t\"update\": {\n\t\t\t\"title\": \"Aus Main aktualisieren\",\n\t\t\t\"message\": \"Übernimm, was Main und die Abhängigkeiten dieses Change Sets seitdem hinzugewonnen haben, in jede Chain. Wie jedes Speichern macht das bisherige Prüfergebnisse veraltet.\",\n\t\t\t\"confirm\": \"Aktualisieren\",\n\t\t\t\"close\": \"Schließen\",\n\t\t\t\"done\": \"Aktualisiert.\",\n\t\t\t\"merged_one\": \"{{count}} Branch hat einen Merge übernommen.\",\n\t\t\t\"merged_other\": \"{{count}} Branches haben einen Merge übernommen.\",\n\t\t\t\"nothingMerged\": \"Nichts zu übernehmen: jeder Branch ist aktuell.\",\n\t\t\t\"stopped_one\": \"Der Merge ist bei {{count}} Branch angehalten.\",\n\t\t\t\"stopped_other\": \"Der Merge ist bei {{count}} Branches angehalten.\",\n\t\t\t\"noneMerged\": \"Kein Branch hat einen Merge übernommen.\",\n\t\t\t\"pendingTitle\": \"Mit offenem Merge, im Branch-Editor aufzulösen:\",\n\t\t\t\"pendingLine\": \"{{content}} · Branch {{branch}}\",\n\t\t\t\"closed\": \"Dieses Change Set ist geschlossen.\",\n\t\t\t\"withheld\": \"Dieses Change Set enthält Arbeit, die du nicht sehen kannst. Nur wer alle seine Inhalte sieht, kann es als Ganzes aktualisieren.\",\n\t\t\t\"failed\": \"Die Aktualisierung ist fehlgeschlagen. Versuche es erneut.\"\n\t\t},\n\t\t\"discard\": {\n\t\t\t\"title\": \"Change Set verwerfen\",\n\t\t\t\"message\": \"„{{name}}“ verwerfen? Seine Branches enden, und darin angelegter Content verschwindet. Das kann nicht rückgängig gemacht werden.\",\n\t\t\t\"confirm\": \"Verwerfen\",\n\t\t\t\"closed\": \"Dieses Change Set ist bereits geschlossen.\",\n\t\t\t\"withheld\": \"Dieses Change Set enthält Arbeit, die du nicht sehen kannst. Nur wer alle seine Inhalte sieht, kann es verwerfen.\",\n\t\t\t\"failed\": \"Das Change Set konnte nicht verworfen werden. Versuche es erneut.\"\n\t\t}\n\t},\n\t\"library\": {\n\t\t\"title\": \"Inhalte\",\n\t\t\"collections\": \"Sammlungen\",\n\t\t\"collectionsError\": \"Die Sammlungen konnten nicht geladen werden.\",\n\t\t\"allContent\": \"Alle Inhalte\",\n\t\t\"restricted\": \"Eingeschränkt\",\n\t\t\"columns\": {\n\t\t\t\"content\": \"Inhalt\",\n\t\t\t\"blueprint\": \"Blueprint\",\n\t\t\t\"readOn\": \"Gelesen auf\",\n\t\t\t\"revised\": \"Zuletzt überarbeitet\"\n\t\t},\n\t\t\"view\": {\n\t\t\t\"main\": \"Main\",\n\t\t\t\"in_force\": \"Heute in Kraft\",\n\t\t\t\"change_set\": \"In einem Change Set\"\n\t\t},\n\t\t\"readOn\": {\n\t\t\t\"main\": \"Main\",\n\t\t\t\"release\": \"Release in Kraft\"\n\t\t},\n\t\t\"filter\": {\n\t\t\t\"searchPlaceholder\": \"Nach Name, Nummer oder Wortlaut suchen…\",\n\t\t\t\"searchInForce\": \"Die Suche umfasst Main und Change Sets, keine Releases\",\n\t\t\t\"view\": \"Ansicht\",\n\t\t\t\"changeSet\": \"Change Set\",\n\t\t\t\"noOpenChangeSet\": \"Kein offenes Change Set\",\n\t\t\t\"blueprint\": \"Blueprint\",\n\t\t\t\"anyBlueprint\": \"Alle Blueprints\",\n\t\t\t\"assignee\": \"Zuständig\",\n\t\t\t\"anyone\": \"Alle\",\n\t\t\t\"me\": \"Mir zugewiesen\"\n\t\t},\n\t\t\"count_one\": \"{{count}} Inhalt\",\n\t\t\"count_other\": \"{{count}} Inhalte\",\n\t\t\"empty\": \"Hier gibt es keine Inhalte\",\n\t\t\"emptyHint\": \"Nichts passt zu dieser Sammlung und diesen Filtern. Wählen Sie „Alle Inhalte“ oder entfernen Sie einen Filter.\",\n\t\t\"loadError\": \"Die Inhalte konnten nicht geladen werden.\",\n\t\t\"more\": \"Mehr anzeigen\",\n\t\t\"create\": {\n\t\t\t\"button\": \"Neuer Inhalt\",\n\t\t\t\"title\": \"Neuer Inhalt\",\n\t\t\t\"blueprint\": \"Blueprint\",\n\t\t\t\"blueprintHelp\": \"Die Art des Inhalts, wie ein Blueprint sie festlegt.\",\n\t\t\t\"pickBlueprint\": \"Blueprint wählen\",\n\t\t\t\"blueprintRequired\": \"Wählen Sie einen Blueprint.\",\n\t\t\t\"release\": \"Blueprint-Release\",\n\t\t\t\"releaseHelp\": \"Das Release, auf das der Inhalt festgelegt wird. Das neueste ist vorausgewählt.\",\n\t\t\t\"releaseRequired\": \"Wählen Sie ein Release.\",\n\t\t\t\"noRelease\": \"Dieser Blueprint hat noch kein Release. Erstellen Sie zuerst eines in blueprinthub.\",\n\t\t\t\"noUsableRelease\": \"Kein Release dieses Blueprints kann verwendet werden. Korrigieren Sie den Blueprint in blueprinthub und erstellen Sie ein neues Release.\",\n\t\t\t\"releasesFailed\": \"Die Releases konnten nicht geladen werden: blueprinthub antwortet nicht. Versuchen Sie es erneut.\",\n\t\t\t\"refusedRelease\": \"{{name}} (nicht verwendbar)\",\n\t\t\t\"refusedReleases\": \"Auf diese Releases kann contenthub nicht festlegen:\",\n\t\t\t\"refusedReleaseReasons\": \"{{name}}: {{reasons}}\",\n\t\t\t\"changeSet\": \"Change Set\",\n\t\t\t\"changeSetHelp\": \"Ein neuer Inhalt entsteht in einem Change Set und existiert nur dort, bis es veröffentlicht wird.\",\n\t\t\t\"changeSetRequired\": \"Wählen Sie ein Change Set.\",\n\t\t\t\"newChangeSet\": \"Ein neues Change Set\",\n\t\t\t\"changeSetName\": \"Name des neuen Change Sets\",\n\t\t\t\"submit\": \"Anlegen und bearbeiten\",\n\t\t\t\"refused\": \"contenthub hat den neuen Inhalt abgelehnt: {{reasons}}.\",\n\t\t\t\"changeSetClosed\": \"Dieses Change Set ist geschlossen. Wählen Sie ein offenes.\",\n\t\t\t\"failed\": \"Der Inhalt konnte nicht angelegt werden. Versuchen Sie es erneut.\"\n\t\t}\n\t},\n\t\"content\": {\n\t\t\"loading\": \"Content wird geladen …\",\n\t\t\"unavailable\": \"Content nicht verfügbar\",\n\t\t\"notFound\": \"Diesen Content gibt es nicht, oder nur in einem Change Set.\",\n\t\t\"loadError\": \"Der Content konnte nicht geladen werden.\",\n\t\t\"none\": \"Keine\",\n\t\t\"tabs\": {\n\t\t\t\"data\": \"Daten\",\n\t\t\t\"releases\": \"Releases\",\n\t\t\t\"revisions\": \"Revisionen\",\n\t\t\t\"references\": \"Referenzen\",\n\t\t\t\"changeSets\": \"Change Sets\",\n\t\t\t\"filing\": \"Ablage\"\n\t\t},\n\t\t\"badges\": {\n\t\t\t\"born\": \"In einem Change Set\",\n\t\t\t\"blocked\": \"Gesperrt\",\n\t\t\t\"archived\": \"Archiviert\"\n\t\t},\n\t\t\"refused\": {\n\t\t\t\"blocked\": \"Dieser Content ist gesperrt, und die Sperre erlaubt Ihnen keine Bearbeitung.\",\n\t\t\t\"archived\": \"Dieser Content ist archiviert. Holen Sie ihn vor dem Bearbeiten aus dem Archiv.\",\n\t\t\t\"failed\": \"Das hat nicht geklappt. Versuchen Sie es erneut.\"\n\t\t},\n\t\t\"rail\": {\n\t\t\t\"eyebrow\": \"Content\",\n\t\t\t\"actions\": \"Aktionen\",\n\t\t\t\"about\": \"Info\",\n\t\t\t\"blueprint\": \"Blueprint\",\n\t\t\t\"inForce\": \"Heute in Kraft\",\n\t\t\t\"inForceRelease\": \"Release {{ordinal}}, {{period}}\",\n\t\t\t\"noneInForce\": \"Heute nichts in Kraft\",\n\t\t\t\"block\": \"Sperre\",\n\t\t\t\"blockedBy\": \"{{reason}}, von {{who}}\",\n\t\t\t\"notBlocked\": \"Nicht gesperrt\",\n\t\t\t\"archived\": \"Archiviert am\"\n\t\t},\n\t\t\"actions\": {\n\t\t\t\"startEditing\": \"Bearbeiten\",\n\t\t\t\"openBranch\": \"Branch öffnen\",\n\t\t\t\"duplicate\": \"Duplizieren\",\n\t\t\t\"repeal\": \"Aufheben\",\n\t\t\t\"withdraw\": \"Zurücknehmen\",\n\t\t\t\"block\": \"Sperren\",\n\t\t\t\"unblock\": \"Entsperren\",\n\t\t\t\"archive\": \"Archivieren\",\n\t\t\t\"unarchive\": \"Aus dem Archiv holen\"\n\t\t},\n\t\t\"data\": {\n\t\t\t\"readOnMain\": \"Stand von Main, Revision {{revision}}. Nur lesbar: Zum Ändern in einem Branch auf „Bearbeiten“ klicken.\",\n\t\t\t\"readOnBranch\": \"Stand seines Branches, Revision {{revision}}. Nur lesbar: Zum Ändern den Branch öffnen.\",\n\t\t\t\"general\": \"Allgemein\",\n\t\t\t\"find\": \"Feld suchen\",\n\t\t\t\"noFields\": \"Keine Felder gefunden\",\n\t\t\t\"yes\": \"Ja\",\n\t\t\t\"no\": \"Nein\"\n\t\t},\n\t\t\"releases\": {\n\t\t\t\"columns\": {\n\t\t\t\t\"ordinal\": \"Nr.\",\n\t\t\t\t\"release\": \"Release\",\n\t\t\t\t\"kind\": \"Art\",\n\t\t\t\t\"period\": \"Geltungszeitraum\",\n\t\t\t\t\"published\": \"Veröffentlicht\",\n\t\t\t\t\"inForce\": \"Heute\",\n\t\t\t\t\"changeSet\": \"Change Set\",\n\t\t\t\t\"proposed\": \"Herkunft\"\n\t\t\t},\n\t\t\t\"kind\": {\n\t\t\t\t\"revision\": \"Revision\",\n\t\t\t\t\"date_only\": \"Nur Datum\",\n\t\t\t\t\"repeal\": \"Aufhebung\",\n\t\t\t\t\"withdrawal\": \"Rücknahme\"\n\t\t\t},\n\t\t\t\"period\": \"{{first}} – {{last}}\",\n\t\t\t\"openPeriod\": \"ab {{first}}\",\n\t\t\t\"undated\": \"Undatiert\",\n\t\t\t\"inForceToday\": \"In Kraft\",\n\t\t\t\"notInForce\": \"Nicht in Kraft\",\n\t\t\t\"empty\": \"Noch kein Release\",\n\t\t\t\"emptyHint\": \"Ein Release entsteht, wenn ein Change Set mit diesem Content veröffentlicht wird.\",\n\t\t\t\"plannedTitle\": \"Geplante Releases offener Change Sets\",\n\t\t\t\"noPlanned\": \"Kein offenes Change Set plant ein Release davon\",\n\t\t\t\"proposed\": \"Vorgeschlagen\",\n\t\t\t\"planned\": \"Geplant\",\n\t\t\t\"loadError\": \"Die Zeitleiste konnte nicht geladen werden.\"\n\t\t},\n\t\t\"revisions\": {\n\t\t\t\"columns\": {\n\t\t\t\t\"revision\": \"Revision\",\n\t\t\t\t\"written\": \"Geschrieben\",\n\t\t\t\t\"author\": \"Autor\",\n\t\t\t\t\"cause\": \"Anlass\",\n\t\t\t\t\"changeSet\": \"Change Set\"\n\t\t\t},\n\t\t\t\"cause\": {\n\t\t\t\t\"create\": \"Angelegt\",\n\t\t\t\t\"save\": \"Gespeichert\",\n\t\t\t\t\"merge\": \"Aus Main zusammengeführt\",\n\t\t\t\t\"resolve\": \"Zusammenführung aufgelöst\",\n\t\t\t\t\"upgrade\": \"Blueprint aktualisiert\",\n\t\t\t\t\"unspecified\": \"Nicht erfasst\"\n\t\t\t},\n\t\t\t\"discarded\": \"Change Set verworfen\",\n\t\t\t\"empty\": \"Keine Revisionen\",\n\t\t\t\"loadError\": \"Die Revisionen konnten nicht geladen werden.\",\n\t\t\t\"pickToCompare\": \"Wählen Sie eine Revision, um sie mit ihrer Vorgängerin zu vergleichen.\"\n\t\t},\n\t\t\"compare\": {\n\t\t\t\"title\": \"Revision {{revision}}\",\n\t\t\t\"titleParent\": \"Revision {{revision}} im Vergleich mit {{base}}\",\n\t\t\t\"titleMain\": \"Revision {{revision}} im Vergleich mit dem Stand von Main\",\n\t\t\t\"columns\": {\n\t\t\t\t\"field\": \"Feld\",\n\t\t\t\t\"kind\": \"Änderung\",\n\t\t\t\t\"before\": \"Vorher\",\n\t\t\t\t\"after\": \"Nachher\"\n\t\t\t},\n\t\t\t\"kind\": {\n\t\t\t\t\"added\": \"Hinzugefügt\",\n\t\t\t\t\"removed\": \"Entfernt\",\n\t\t\t\t\"changed\": \"Geändert\"\n\t\t\t},\n\t\t\t\"nothing\": \"Das ist die erste Revision des Contents, und es gibt kein Main zum Vergleichen.\",\n\t\t\t\"same\": \"Kein Feld unterscheidet sich\",\n\t\t\t\"loadError\": \"Der Vergleich konnte nicht geladen werden.\"\n\t\t},\n\t\t\"references\": {\n\t\t\t\"outgoing\": \"Referenzen dieses Contents\",\n\t\t\t\"referrers\": \"Referenziert von\",\n\t\t\t\"outdated\": \"Veraltete Fixierungen\",\n\t\t\t\"columns\": {\n\t\t\t\t\"kind\": \"Art\",\n\t\t\t\t\"field\": \"Feld\",\n\t\t\t\t\"target\": \"Ziel\",\n\t\t\t\t\"pin\": \"Fixiert auf\",\n\t\t\t\t\"source\": \"Von\",\n\t\t\t\t\"foundIn\": \"Gefunden in\",\n\t\t\t\t\"inForceNow\": \"Heute in Kraft\"\n\t\t\t},\n\t\t\t\"kind\": {\n\t\t\t\t\"reference\": \"Referenz\",\n\t\t\t\t\"toc\": \"Inhaltsverzeichnis\",\n\t\t\t\t\"include\": \"Einbindung\",\n\t\t\t\t\"exclude\": \"Ausschluss\",\n\t\t\t\t\"replace\": \"Ersetzung\",\n\t\t\t\t\"annotate\": \"Anmerkung\",\n\t\t\t\t\"link\": \"Link\",\n\t\t\t\t\"footnote\": \"Fußnote\",\n\t\t\t\t\"anchor\": \"Anker\",\n\t\t\t\t\"media\": \"Medium\",\n\t\t\t\t\"blueprint\": \"Blueprint\",\n\t\t\t\t\"unspecified\": \"Sonstige\"\n\t\t\t},\n\t\t\t\"followsInForce\": \"Folgt dem geltenden Release\",\n\t\t\t\"inRelease\": \"Release {{release}}\",\n\t\t\t\"inChangeSet\": \"Change Set {{changeSet}}\",\n\t\t\t\"gap\": \"Nichts (eine Lücke)\",\n\t\t\t\"noOutgoing\": \"Er referenziert nichts\",\n\t\t\t\"noReferrers\": \"Nichts referenziert ihn\",\n\t\t\t\"noOutdated\": \"Keine Fixierung ist veraltet\",\n\t\t\t\"loadError\": \"Diese Referenzen konnten nicht geladen werden.\"\n\t\t},\n\t\t\"changeSets\": {\n\t\t\t\"assignee\": \"Zuständige Person\",\n\t\t\t\"assignees\": \"Zuständige\",\n\t\t\t\"opened\": \"Geöffnet\",\n\t\t\t\"empty\": \"Kein offenes Change Set ändert ihn\",\n\t\t\t\"emptyHint\": \"„Bearbeiten“ öffnet eines oder nimmt ihn in ein offenes auf.\",\n\t\t\t\"loadError\": \"Die Change Sets konnten nicht geladen werden.\"\n\t\t},\n\t\t\"filing\": {\n\t\t\t\"title\": \"Ablage\",\n\t\t\t\"collections\": \"Sammlungen\",\n\t\t\t\"collectionsHelp\": \"Wo der Content in der Bibliothek abgelegt ist. Die Ablage wird nicht versioniert.\",\n\t\t\t\"nowhere\": \"Nirgends abgelegt\",\n\t\t\t\"assignees\": \"Zuständige\",\n\t\t\t\"assigneesHelp\": \"Wer diesen Content pflegt.\",\n\t\t\t\"notASave\": \"Das Speichern der Ablage schreibt keine Revision und braucht kein Change Set.\",\n\t\t\t\"saved\": \"Ablage gespeichert.\"\n\t\t},\n\t\t\"startEditing\": {\n\t\t\t\"title\": \"Bearbeiten\",\n\t\t\t\"changeSetHelp\": \"Das Change Set, in dem bearbeitet wird: ein offenes oder ein neues.\",\n\t\t\t\"nameHelp\": \"Leer gelassen, wird es nach dem Content benannt.\",\n\t\t\t\"effectiveOn\": \"Wirksam ab\",\n\t\t\t\"effectiveOnHelp\": \"Der Tag, an dem die Änderung wirksam wird.\",\n\t\t\t\"dateRequired\": \"Wählen Sie den Tag, an dem die Änderung wirksam wird.\",\n\t\t\t\"forksFrom\": \"Abgezweigt von\",\n\t\t\t\"forksFromMain\": \"Stand von Main (dann nichts in Kraft)\",\n\t\t\t\"carriesForward\": \"Fortgeführte spätere Releases\",\n\t\t\t\"cutsInto\": \"Schneidet in\",\n\t\t\t\"covers\": \"Ein Zeitraum ab diesem Tag würde {{releases}} vollständig überdecken.\",\n\t\t\t\"submit\": \"Bearbeiten\"\n\t\t},\n\t\t\"duplicate\": {\n\t\t\t\"title\": \"Duplizieren\",\n\t\t\t\"hint\": \"Die Kopie ist neuer Content: Sie übernimmt die Daten und das Blueprint-Release dieser Revision, aber nichts von ihrer Geschichte.\",\n\t\t\t\"changeSetHelp\": \"Die Kopie existiert bis zur Veröffentlichung nur in diesem Change Set.\",\n\t\t\t\"submit\": \"Duplizieren und bearbeiten\"\n\t\t},\n\t\t\"endForce\": {\n\t\t\t\"repeal\": {\n\t\t\t\t\"title\": \"Aufheben\",\n\t\t\t\t\"hint\": \"Plant eine Aufhebung, die das geltende Release an seinem letzten Tag beendet; danach ist nichts in Kraft. Die Veröffentlichung des Change Sets erzeugt sie.\",\n\t\t\t\t\"submit\": \"Aufhebung planen\",\n\t\t\t\t\"planned\": \"Die Aufhebung ist geplant.\"\n\t\t\t},\n\t\t\t\"withdraw\": {\n\t\t\t\t\"title\": \"Zurücknehmen\",\n\t\t\t\t\"hint\": \"Plant eine Rücknahme, die seine Geltung ab der Veröffentlichung des Change Sets beendet.\",\n\t\t\t\t\"submit\": \"Rücknahme planen\",\n\t\t\t\t\"planned\": \"Die Rücknahme ist geplant.\"\n\t\t\t},\n\t\t\t\"changeSetHelp\": \"Das Change Set, dessen Veröffentlichung die Geltung beendet.\",\n\t\t\t\"lastDay\": \"Letzter Tag in Kraft\",\n\t\t\t\"lastDayHelp\": \"Der letzte Tag, an dem der Content in Kraft ist.\",\n\t\t\t\"lastDayRequired\": \"Wählen Sie den letzten Tag in Kraft.\",\n\t\t\t\"gapReferrers_one\": \"{{count}} Referenz wird auf eine Lücke zeigen\",\n\t\t\t\"gapReferrers_other\": \"{{count}} Referenzen werden auf eine Lücke zeigen\",\n\t\t\t\"done\": \"Fertig\"\n\t\t},\n\t\t\"block\": {\n\t\t\t\"title\": \"Sperren\",\n\t\t\t\"reason\": \"Sperrgrund\",\n\t\t\t\"reasonHelp\": \"Warum der Content gesperrt ist, wie der Workspace seine Gründe nennt.\",\n\t\t\t\"reasonRequired\": \"Wählen Sie einen Sperrgrund.\",\n\t\t\t\"noReasons\": \"Der Workspace hat noch keine Sperrgründe. Legen Sie zuerst in den Einstellungen einen an.\",\n\t\t\t\"openBlockReasons\": \"Zu den Einstellungen der Sperrgründe\",\n\t\t\t\"allowed\": \"Darf weiter bearbeiten\",\n\t\t\t\"allowedHelp\": \"Allen anderen wird jede Bearbeitung verweigert, solange er gesperrt ist.\",\n\t\t\t\"submit\": \"Sperren\"\n\t\t},\n\t\t\"archive\": {\n\t\t\t\"title\": \"Diesen Content archivieren?\",\n\t\t\t\"message\": \"Archivierter Content verschwindet aus der Bibliothek, jeder Auswahl und der Bearbeitung. Seine Releases bleiben lesbar, und „Aus dem Archiv holen“ bringt ihn zurück.\",\n\t\t\t\"confirm\": \"Archivieren\"\n\t\t}\n\t}\n}\n","{\n\t\"common\": {\n\t\t\"cancel\": \"Cancel\"\n\t},\n\t\"settings\": {\n\t\t\"section\": \"Settings\",\n\t\t\"title\": \"Content settings\",\n\t\t\"subtitle\": \"What Publish requires, why Content is blocked, and how Content is filed.\",\n\t\t\"tabs\": {\n\t\t\t\"requiredChecks\": \"Required Checks\",\n\t\t\t\"blockReasons\": \"Block Reasons\",\n\t\t\t\"collections\": \"Collections\"\n\t\t}\n\t},\n\t\"blockReasons\": {\n\t\t\"title\": \"Block Reasons\",\n\t\t\"create\": \"New Block Reason\",\n\t\t\"columns\": {\n\t\t\t\"name\": \"Name\",\n\t\t\t\"updated\": \"Last changed\",\n\t\t\t\"actions\": \"Actions\"\n\t\t},\n\t\t\"rename\": \"Rename\",\n\t\t\"remove\": \"Remove\",\n\t\t\"count_one\": \"{{count}} Block Reason\",\n\t\t\"count_other\": \"{{count}} Block Reasons\",\n\t\t\"empty\": \"No Block Reasons yet\",\n\t\t\"emptyHint\": \"Blocking a Content names one of the workspace's own reasons. Add the reasons your editors use, such as “Being revised by the author”.\",\n\t\t\"loadError\": \"The Block Reasons could not be loaded.\",\n\t\t\"form\": {\n\t\t\t\"createTitle\": \"New Block Reason\",\n\t\t\t\"renameTitle\": \"Rename Block Reason\",\n\t\t\t\"name\": \"Name\",\n\t\t\t\"nameHelp\": \"Editors choose it when they block a Content, and see it beside a blocked Content.\",\n\t\t\t\"nameRequired\": \"Enter a name.\",\n\t\t\t\"nameTooLong\": \"At most {{max}} characters.\",\n\t\t\t\"oneLine\": \"A name is one line of text.\",\n\t\t\t\"nameTaken\": \"There is already a Block Reason named “{{name}}”.\",\n\t\t\t\"failed\": \"The Block Reason could not be saved. Try again.\",\n\t\t\t\"createSubmit\": \"Create\",\n\t\t\t\"renameSubmit\": \"Rename\"\n\t\t},\n\t\t\"removeDialog\": {\n\t\t\t\"title\": \"Remove Block Reason\",\n\t\t\t\"message\": \"Remove the Block Reason “{{name}}”? This cannot be undone.\",\n\t\t\t\"confirm\": \"Remove\",\n\t\t\t\"failed\": \"The Block Reason could not be removed. Try again.\"\n\t\t}\n\t},\n\t\"requiredChecks\": {\n\t\t\"create\": \"New Required Check\",\n\t\t\"columns\": {\n\t\t\t\"name\": \"Name\",\n\t\t\t\"scope\": \"Scope\",\n\t\t\t\"blueprints\": \"Blueprints\",\n\t\t\t\"independent\": \"Independent\",\n\t\t\t\"recorders\": \"Who records it\",\n\t\t\t\"actions\": \"Actions\"\n\t\t},\n\t\t\"scope\": {\n\t\t\t\"branch\": \"Each Branch\",\n\t\t\t\"change_set\": \"The Change Set once\"\n\t\t},\n\t\t\"everyBlueprint\": \"Every Blueprint\",\n\t\t\"everyMember\": \"Every member\",\n\t\t\"nobody\": \"Nobody\",\n\t\t\"recordersUnknown\": \"Unknown\",\n\t\t\"manageRecorders\": \"Who records it\",\n\t\t\"workspaceMode\": {\n\t\t\t\"title\": \"Every member records every check in workspace mode.\",\n\t\t\t\"description\": \"This contenthub runs in workspace mode, so who records a Required Check can't be narrowed to named people. That needs guardian mode.\"\n\t\t},\n\t\t\"recorders\": {\n\t\t\t\"title\": \"Who records “{{name}}”\",\n\t\t\t\"intro\": \"Every member records a new check. To narrow it, add the people who should record it, then remove every member. An admin records it only when added too.\",\n\t\t\t\"roster\": \"Who records it\",\n\t\t\t\"everyMember\": \"Every member of the workspace\",\n\t\t\t\"you\": \"{{name}} (you)\",\n\t\t\t\"nobody\": \"Nobody records this check: Publish waits on it until someone is added.\",\n\t\t\t\"remove\": \"Remove\",\n\t\t\t\"removeOf\": \"Remove {{name}}\",\n\t\t\t\"restoreEveryMember\": \"Let every member record it\",\n\t\t\t\"person\": \"Person\",\n\t\t\t\"personHelp\": \"A member of the workspace.\",\n\t\t\t\"personPlaceholder\": \"Choose a member\",\n\t\t\t\"personRequired\": \"Choose a member.\",\n\t\t\t\"add\": \"Add\",\n\t\t\t\"close\": \"Close\",\n\t\t\t\"breakGlass\": \"You are adding yourself as a recorder. It is announced, as any change of who records a check is.\",\n\t\t\t\"denied\": \"Only a workspace admin sees and changes who records a Required Check.\",\n\t\t\t\"loadError\": \"Who records it could not be loaded.\",\n\t\t\t\"failed\": \"Who records it could not be changed. Try again.\"\n\t\t},\n\t\t\"yes\": \"Yes\",\n\t\t\"no\": \"No\",\n\t\t\"edit\": \"Edit\",\n\t\t\"remove\": \"Remove\",\n\t\t\"count_one\": \"{{count}} Required Check\",\n\t\t\"count_other\": \"{{count}} Required Checks\",\n\t\t\"empty\": \"No Required Checks yet\",\n\t\t\"emptyHint\": \"Publish waits until every Required Check has passed or been waived, such as a lawyer's review of each Branch or a print proof of the whole Change Set.\",\n\t\t\"loadError\": \"The Required Checks could not be loaded.\",\n\t\t\"form\": {\n\t\t\t\"createTitle\": \"New Required Check\",\n\t\t\t\"editTitle\": \"Edit Required Check\",\n\t\t\t\"name\": \"Name\",\n\t\t\t\"nameHelp\": \"Reviewers see it on a Change Set's Checks tab.\",\n\t\t\t\"nameRequired\": \"Enter a name.\",\n\t\t\t\"nameTooLong\": \"At most {{max}} characters.\",\n\t\t\t\"oneLine\": \"A name is one line of text.\",\n\t\t\t\"nameTaken\": \"There is already a Required Check named “{{name}}”.\",\n\t\t\t\"scope\": \"Scope\",\n\t\t\t\"scopeHelp\": \"Each Branch needs a result per Content it covers; the Change Set once needs one result for the whole Change Set.\",\n\t\t\t\"scopeRequired\": \"Choose a scope.\",\n\t\t\t\"everyBlueprint\": \"Applies to Content of every Blueprint\",\n\t\t\t\"accessors\": \"Blueprint accessors\",\n\t\t\t\"accessorsHelp\": \"One accessor a line: the check applies to Content of these Blueprints only.\",\n\t\t\t\"accessorsRequired\": \"Name at least one Blueprint, or apply it to every Blueprint.\",\n\t\t\t\"accessorTooLong\": \"An accessor is at most {{max}} characters.\",\n\t\t\t\"independentLabel\": \"Independent\",\n\t\t\t\"independentHelp\": \"Passed and waived are refused from anyone who wrote a Revision on what the result covers.\",\n\t\t\t\"recorders\": \"Who records it\",\n\t\t\t\"recordersHelp\": \"Every member of the workspace records a new check's results. Narrow it to named people from the check's row, under Who records it.\",\n\t\t\t\"failed\": \"The Required Check could not be saved. Try again.\",\n\t\t\t\"createSubmit\": \"Create\",\n\t\t\t\"editSubmit\": \"Save\"\n\t\t},\n\t\t\"removeDialog\": {\n\t\t\t\"title\": \"Remove Required Check\",\n\t\t\t\"message\": \"Remove the Required Check “{{name}}”? Publish no longer waits for it, at once; its results are kept and count for nothing.\",\n\t\t\t\"confirm\": \"Remove\",\n\t\t\t\"failed\": \"The Required Check could not be removed. Try again.\"\n\t\t}\n\t},\n\t\"collections\": {\n\t\t\"create\": \"New Collection\",\n\t\t\"columns\": {\n\t\t\t\"name\": \"Collection\",\n\t\t\t\"access\": \"Access\",\n\t\t\t\"actions\": \"Actions\"\n\t\t},\n\t\t\"inPath\": \"in {{path}}\",\n\t\t\"root\": \"Top level\",\n\t\t\"restricted\": \"Restricted\",\n\t\t\"open\": \"Open\",\n\t\t\"rename\": \"Rename\",\n\t\t\"moveAction\": \"Move\",\n\t\t\"restrict\": \"Restrict\",\n\t\t\"unrestrict\": \"Unrestrict\",\n\t\t\"manageAccess\": \"Manage access\",\n\t\t\"remove\": \"Remove\",\n\t\t\"count_one\": \"{{count}} Collection\",\n\t\t\"count_other\": \"{{count}} Collections\",\n\t\t\"empty\": \"No Collections yet\",\n\t\t\"emptyHint\": \"Collections file Content the workspace's own way, and a Restricted one hides its Content from everyone not granted.\",\n\t\t\"loadError\": \"The Collections could not be loaded.\",\n\t\t\"workspaceMode\": {\n\t\t\t\"title\": \"Restricted Collections need guardian mode.\",\n\t\t\t\"description\": \"This contenthub runs in workspace mode, where nothing could enforce a restriction, so restricting Collections and granting access are off. Collections restricted before can still be opened again.\"\n\t\t},\n\t\t\"form\": {\n\t\t\t\"createTitle\": \"New Collection\",\n\t\t\t\"renameTitle\": \"Rename Collection\",\n\t\t\t\"name\": \"Name\",\n\t\t\t\"nameHelp\": \"Unique among the Collections beside it.\",\n\t\t\t\"nameRequired\": \"Enter a name.\",\n\t\t\t\"nameTooLong\": \"At most {{max}} characters.\",\n\t\t\t\"oneLine\": \"A name is one line of text.\",\n\t\t\t\"nameTaken\": \"There is already a Collection named “{{name}}” in that place.\",\n\t\t\t\"parent\": \"Inside\",\n\t\t\t\"restrictedLabel\": \"Restricted\",\n\t\t\t\"restrictedHelp\": \"Content filed in it is visible only to those granted on it. You become its owner.\",\n\t\t\t\"failed\": \"The Collection could not be saved. Try again.\",\n\t\t\t\"createSubmit\": \"Create\",\n\t\t\t\"renameSubmit\": \"Rename\"\n\t\t},\n\t\t\"move\": {\n\t\t\t\"title\": \"Move “{{name}}”\",\n\t\t\t\"parent\": \"Move into\",\n\t\t\t\"parentHelp\": \"Everything under it moves along. What is filed in it stays filed.\",\n\t\t\t\"submit\": \"Move\"\n\t\t},\n\t\t\"restrictDialog\": {\n\t\t\t\"title\": \"Restrict Collection\",\n\t\t\t\"message\": \"Restrict “{{name}}”? Content filed in it is then hidden in editing from everyone not granted on it, and you become its owner, who manages its grants.\",\n\t\t\t\"confirm\": \"Restrict\",\n\t\t\t\"failed\": \"The Collection could not be restricted. Try again.\"\n\t\t},\n\t\t\"unrestrictDialog\": {\n\t\t\t\"title\": \"Unrestrict Collection\",\n\t\t\t\"message\": \"Unrestrict “{{name}}”? Every member of the workspace will see the Content filed in it, and every grant on it is dropped. This discloses embargoed work.\",\n\t\t\t\"confirm\": \"Unrestrict and disclose\",\n\t\t\t\"failed\": \"The Collection could not be unrestricted. Try again.\"\n\t\t},\n\t\t\"removeDialog\": {\n\t\t\t\"title\": \"Remove Collection\",\n\t\t\t\"message\": \"Remove the Collection “{{name}}”? The Content filed in it is unfiled from it and otherwise unchanged.\",\n\t\t\t\"confirm\": \"Remove\",\n\t\t\t\"failed\": \"The Collection could not be removed. Try again.\"\n\t\t},\n\t\t\"access\": {\n\t\t\t\"title\": \"Access to “{{name}}”\",\n\t\t\t\"intro\": \"Only the people below see the Content filed here. Granting yourself is break-glass: it is announced to the owner like any grant.\",\n\t\t\t\"roster\": \"Who has access\",\n\t\t\t\"levels\": {\n\t\t\t\t\"owner\": \"Owner\",\n\t\t\t\t\"editor\": \"Editor\",\n\t\t\t\t\"viewer\": \"Viewer\"\n\t\t\t},\n\t\t\t\"you\": \"{{name}} (you)\",\n\t\t\t\"nobody\": \"Nobody is granted besides the owner.\",\n\t\t\t\"revoke\": \"Revoke\",\n\t\t\t\"revokeOf\": \"Revoke {{name}}\",\n\t\t\t\"person\": \"Person\",\n\t\t\t\"personHelp\": \"A member of the workspace. Granting someone again changes their level.\",\n\t\t\t\"personPlaceholder\": \"Choose a member\",\n\t\t\t\"personRequired\": \"Choose a member.\",\n\t\t\t\"level\": \"Level\",\n\t\t\t\"grant\": \"Grant\",\n\t\t\t\"close\": \"Close\",\n\t\t\t\"breakGlass\": \"You are granting yourself access to restricted work. The owner is told, as of any grant.\",\n\t\t\t\"denied\": \"Only the Collection's owner or a workspace admin sees and manages who is granted.\",\n\t\t\t\"loadError\": \"Who is granted could not be loaded.\",\n\t\t\t\"failed\": \"The grant could not be changed. Try again.\"\n\t\t}\n\t},\n\t\"changeSets\": {\n\t\t\"title\": \"Change Sets\",\n\t\t\"create\": \"New Change Set\",\n\t\t\"columns\": {\n\t\t\t\"name\": \"Name\",\n\t\t\t\"state\": \"State\",\n\t\t\t\"status\": \"Status\",\n\t\t\t\"assignees\": \"Assignees\",\n\t\t\t\"created\": \"Created\"\n\t\t},\n\t\t\"state\": {\n\t\t\t\"open\": \"Open\",\n\t\t\t\"published\": \"Published\",\n\t\t\t\"discarded\": \"Discarded\"\n\t\t},\n\t\t\"sourceLine\": \"{{reference}}, {{date}}\",\n\t\t\"filter\": {\n\t\t\t\"state\": \"State\",\n\t\t\t\"anyState\": \"Any state\",\n\t\t\t\"assignee\": \"Assignee\",\n\t\t\t\"anyone\": \"Anyone\",\n\t\t\t\"me\": \"Assigned to me\"\n\t\t},\n\t\t\"count_one\": \"{{count}} Change Set\",\n\t\t\"count_other\": \"{{count}} Change Sets\",\n\t\t\"empty\": \"No Change Sets here\",\n\t\t\"emptyHint\": \"A Change Set groups the work one publication triggers, such as a gazette announcement, and is published as one unit.\",\n\t\t\"loadError\": \"The Change Sets could not be loaded.\",\n\t\t\"form\": {\n\t\t\t\"createTitle\": \"New Change Set\",\n\t\t\t\"name\": \"Name\",\n\t\t\t\"nameHelp\": \"How editors will recognise it, such as the gazette it applies.\",\n\t\t\t\"nameRequired\": \"Enter a name.\",\n\t\t\t\"tooLong\": \"At most {{max}} characters.\",\n\t\t\t\"oneLine\": \"One line of text.\",\n\t\t\t\"sourceDate\": \"Source date\",\n\t\t\t\"sourceDateHelp\": \"The day the publication that triggered it appeared. Leave both Source fields empty for a correction with no Source.\",\n\t\t\t\"sourceReference\": \"Source reference\",\n\t\t\t\"sourceReferenceHelp\": \"How the publication is cited, such as “BGBl. 2026 I Nr. 270”.\",\n\t\t\t\"sourceDateRequired\": \"A Source needs its date as well.\",\n\t\t\t\"sourceReferenceRequired\": \"A Source needs its reference as well.\",\n\t\t\t\"failed\": \"The Change Set could not be created. Try again.\",\n\t\t\t\"createSubmit\": \"Create\"\n\t\t},\n\t\t\"more\": \"Show more\"\n\t},\n\t\"branch\": {\n\t\t\"loading\": \"Loading Content…\",\n\t\t\"unavailable\": \"Content unavailable\",\n\t\t\"notFound\": \"This Content isn't in this Change Set.\",\n\t\t\"loadError\": \"The Content could not be loaded.\",\n\t\t\"tabs\": {\n\t\t\t\"content\": \"Content\",\n\t\t\t\"release\": \"Release\",\n\t\t\t\"compare\": \"Compare\",\n\t\t\t\"references\": \"References\"\n\t\t},\n\t\t\"save\": \"Save\",\n\t\t\"saveChanged_one\": \"Save · {{count}} tab changed\",\n\t\t\"saveChanged_other\": \"Save · {{count}} tabs changed\",\n\t\t\"saved\": \"Saved.\",\n\t\t\"unsavedChanges\": \"Unsaved changes\",\n\t\t\"noRelease\": \"This Content's Blueprint Release can't be shown, so its data can't be edited here.\",\n\t\t\"otherBranch\": \"This is an earlier Branch of its Chain. Only the Chain's last Branch is edited here.\",\n\t\t\"closed\": \"This Change Set is closed: its Content can no longer be edited.\",\n\t\t\"reload\": \"Reload\",\n\t\t\"violation\": \"Refused: {{code}}\",\n\t\t\"refused\": {\n\t\t\t\"stale\": \"Someone saved this Branch meanwhile. Your changes were not saved.\",\n\t\t\t\"staleHint\": \"Reload to edit what was saved; your unsaved changes will be lost. Nothing is merged.\",\n\t\t\t\"violations_one\": \"The data was refused for {{count}} reason.\",\n\t\t\t\"violations_other\": \"The data was refused for {{count}} reasons.\",\n\t\t\t\"invalid\": \"Some fields need attention before saving.\",\n\t\t\t\"releaseInvalid\": \"The Release needs attention before saving. Nothing was saved.\",\n\t\t\t\"covers\": \"The Validity Period would cover {{releases}} entirely, so the Release was not planned.\",\n\t\t\t\"coversHint\": \"Supersede them, or change the dates.\",\n\t\t\t\"supersede\": \"Supersede them\",\n\t\t\t\"releaseViolations_one\": \"The Release Spec values were refused for {{count}} reason.\",\n\t\t\t\"releaseViolations_other\": \"The Release Spec values were refused for {{count}} reasons.\",\n\t\t\t\"contentSaved\": \"The Content was saved; the Release was not.\"\n\t\t},\n\t\t\"leave\": {\n\t\t\t\"title\": \"Leave with unsaved changes?\",\n\t\t\t\"message\": \"Your changes to this Branch are not saved yet. Leave anyway?\",\n\t\t\t\"confirm\": \"Leave\",\n\t\t\t\"cancel\": \"Stay\"\n\t\t},\n\t\t\"pendingMerge\": \"Update from Main stopped on this Branch: resolve or abort its merge from the rail before saving.\",\n\t\t\"release\": {\n\t\t\t\"unplanned\": \"No Release is planned for this Branch yet: Publish would refuse it.\",\n\t\t\t\"planIt\": \"Plan this Branch's Release\",\n\t\t\t\"firstDay\": \"First day\",\n\t\t\t\"lastDay\": \"Last day\",\n\t\t\t\"lastDayHelp\": \"Leave empty for an open end: it then ends the day before the next later Release starts.\",\n\t\t\t\"undated\": \"This Content is undated: its Release takes effect when the Change Set is published.\",\n\t\t\t\"supersedes\": \"Supersedes\",\n\t\t\t\"supersedesHelp\": \"The Releases this one replaces: the one it corrects, or those its period covers.\",\n\t\t\t\"supersedesNone\": \"None\",\n\t\t\t\"specTitle\": \"Release Spec\",\n\t\t\t\"cutsInto\": \"Cuts into\",\n\t\t\t\"covers\": \"Covers entirely\",\n\t\t\t\"coversWarning\": \"This period covers {{releases}} entirely: supersede them or change the dates.\",\n\t\t\t\"proposals\": \"Proposals\",\n\t\t\t\"proposalsHelp\": \"Derived by the Change Set from its plans on every plan change; never edited by hand.\",\n\t\t\t\"noProposals\": \"No proposals: the plans cut into no Release.\",\n\t\t\t\"cut\": \"Ends it the day before\",\n\t\t\t\"tail\": \"Resumes {{release}} afterwards\",\n\t\t\t\"withheld\": \"Withheld: a plan supersedes the Release it carries\",\n\t\t\t\"firstDayRequired\": \"A Release of Dated Content needs its first day.\",\n\t\t\t\"lastDayBefore\": \"The last day can't be before the first.\",\n\t\t\t\"columns\": {\n\t\t\t\t\"ends\": \"Release\",\n\t\t\t\t\"what\": \"Proposal\",\n\t\t\t\t\"period\": \"Validity Period\"\n\t\t\t}\n\t\t},\n\t\t\"compare\": {\n\t\t\t\"fork\": \"Against its fork\",\n\t\t\t\"main\": \"Against Main\",\n\t\t\t\"between\": \"{{head}} compared with {{base}}\",\n\t\t\t\"born\": \"This Content was born in the Change Set: it has no Main to compare with.\"\n\t\t},\n\t\t\"rail\": {\n\t\t\t\"eyebrow\": \"Branch\",\n\t\t\t\"actions\": \"Actions\",\n\t\t\t\"about\": \"About\",\n\t\t\t\"fork\": \"Forked from\",\n\t\t\t\"forkMain\": \"Main's head\",\n\t\t\t\"forkBorn\": \"Born in this Change Set\",\n\t\t\t\"effectiveOn\": \"Takes effect\",\n\t\t\t\"undated\": \"On Publish\",\n\t\t\t\"position\": \"In its Chain\",\n\t\t\t\"positionOf\": \"Branch {{position}} of {{count}}\",\n\t\t\t\"head\": \"Head\",\n\t\t\t\"pendingMerge\": \"Pending Merge\",\n\t\t\t\"pendingMergeYes\": \"Waiting to be resolved\",\n\t\t\t\"updateFromMain\": \"Update from Main\",\n\t\t\t\"resolveMerge\": \"Resolve merge\",\n\t\t\t\"compareFork\": \"Compare to the fork\",\n\t\t\t\"preview\": \"Preview\",\n\t\t\t\"appendBranch\": \"Append a Branch\",\n\t\t\t\"dropChain\": \"Drop Chain\"\n\t\t},\n\t\t\"update\": {\n\t\t\t\"title\": \"Update from Main\",\n\t\t\t\"message\": \"Merge what was published meanwhile into this Content's Chain. Fields that conflict stop the merge, and nothing is merged behind your back.\",\n\t\t\t\"merged\": \"This Branch took in what Main gained.\",\n\t\t\t\"upToDate\": \"This Branch was up to date.\",\n\t\t\t\"stopped\": \"The merge stopped on this Branch: resolve it field by field, or abort it.\",\n\t\t\t\"resolve\": \"Resolve merge\"\n\t\t},\n\t\t\"merge\": {\n\t\t\t\"title\": \"Resolve merge\",\n\t\t\t\"conflict\": \"Both sides changed these fields. Choose which value each keeps; every other field is merged.\",\n\t\t\t\"invalid\": \"The merged data breaks the Blueprint Release in these fields. Choose which value each keeps.\",\n\t\t\t\"ours\": \"This Branch: {{value}}\",\n\t\t\t\"theirs\": \"Merged in: {{value}}\",\n\t\t\t\"base\": \"Before either: {{value}}\",\n\t\t\t\"decide\": \"Choose a value.\",\n\t\t\t\"resolve\": \"Resolve\",\n\t\t\t\"abort\": \"Abort merge\",\n\t\t\t\"none\": \"This Branch has no Pending Merge.\",\n\t\t\t\"loadError\": \"The Pending Merge could not be loaded.\",\n\t\t\t\"stale\": \"Someone saved this Branch meanwhile: close and open the merge again.\"\n\t\t},\n\t\t\"preview\": {\n\t\t\t\"title\": \"Preview\",\n\t\t\t\"day\": \"In Force on\",\n\t\t\t\"dayHelp\": \"Read as if this Change Set were published now. Empty is today.\",\n\t\t\t\"nothing\": \"Nothing would be In Force on that day.\",\n\t\t\t\"planned\": \"This Change Set's Release {{release}} would be In Force.\",\n\t\t\t\"published\": \"The published Release {{release}} would stay In Force.\",\n\t\t\t\"withheld\": \"Restricted Content you aren't granted on: what the Change Set does to it is withheld.\",\n\t\t\t\"period\": \"Validity Period\",\n\t\t\t\"badDay\": \"Give a day as YYYY-MM-DD, or leave it empty for today.\"\n\t\t},\n\t\t\"append\": {\n\t\t\t\"title\": \"Append a Branch\",\n\t\t\t\"message\": \"Amend this Content again from a later date: the new Branch starts at this Chain's last head.\",\n\t\t\t\"effectiveOn\": \"Effective on\",\n\t\t\t\"required\": \"Give the date the change takes effect.\",\n\t\t\t\"after\": \"Give a day after {{day}}, the Chain's last date.\",\n\t\t\t\"submit\": \"Append\"\n\t\t},\n\t\t\"drop\": {\n\t\t\t\"title\": \"Drop Chain\",\n\t\t\t\"message\": \"Remove {{content}} from this Change Set, with its Planned Releases. Its Revisions stay in history.\",\n\t\t\t\"confirm\": \"Drop Chain\",\n\t\t\t\"failed\": \"The Chain could not be dropped. Try again.\"\n\t\t}\n\t},\n\t\"changeSet\": {\n\t\t\"loading\": \"Loading Change Set\",\n\t\t\"unavailable\": \"Change Set unavailable\",\n\t\t\"notFound\": \"There is no such Change Set.\",\n\t\t\"loadError\": \"The Change Set could not be loaded.\",\n\t\t\"tabs\": {\n\t\t\t\"general\": \"General\",\n\t\t\t\"contents\": \"Contents\",\n\t\t\t\"releases\": \"Releases\",\n\t\t\t\"checks\": \"Checks\"\n\t\t},\n\t\t\"save\": \"Save\",\n\t\t\"saveChanged_one\": \"Save · {{count}} tab changed\",\n\t\t\"saveChanged_other\": \"Save · {{count}} tabs changed\",\n\t\t\"saved\": \"Saved.\",\n\t\t\"refused\": {\n\t\t\t\"transition\": \"The status cannot move from {{from}} to {{to}}.\",\n\t\t\t\"staleStatus\": \"Someone set the status to {{current}} meanwhile. Choose again and save.\",\n\t\t\t\"closed\": \"This Change Set is closed: it was published or discarded meanwhile.\",\n\t\t\t\"invalid\": \"The change was refused.\",\n\t\t\t\"failed\": \"The changes could not be saved. Try again.\",\n\t\t\t\"guarded\": \"You may not move the status from {{from}} to {{to}}.\",\n\t\t\t\"unavailable\": \"Change Set statuses can't be checked right now. Save again in a moment.\"\n\t\t},\n\t\t\"leave\": {\n\t\t\t\"title\": \"Leave with unsaved changes?\",\n\t\t\t\"message\": \"Your changes to this Change Set are not saved yet. Leave anyway?\",\n\t\t\t\"confirm\": \"Leave\",\n\t\t\t\"cancel\": \"Stay\"\n\t\t},\n\t\t\"general\": {\n\t\t\t\"about\": \"About\",\n\t\t\t\"name\": \"Name\",\n\t\t\t\"source\": \"Source\",\n\t\t\t\"noSource\": \"None\",\n\t\t\t\"state\": \"State\",\n\t\t\t\"createdBy\": \"Opened by\",\n\t\t\t\"frozenHint\": \"The name and the Source no longer change: the Change Set is closed.\",\n\t\t\t\"work\": \"Work\",\n\t\t\t\"status\": \"Status\",\n\t\t\t\"noStatus\": \"No status\",\n\t\t\t\"statusHelp\": \"Where the work stands. It never decides whether the Change Set can be published.\",\n\t\t\t\"statusFrozen\": \"Frozen: the Change Set is closed.\",\n\t\t\t\"assignees\": \"Assignees\",\n\t\t\t\"assigneesHelp\": \"Who is working on it now.\",\n\t\t\t\"nobody\": \"Nobody\",\n\t\t\t\"dependencies\": \"Depends on\",\n\t\t\t\"dependenciesHelp\": \"Open Change Sets this one builds on. It can be published only after them.\",\n\t\t\t\"dependenciesClosed\": \"Dependencies no longer change once a Change Set is closed.\",\n\t\t\t\"noDependencies\": \"No dependencies\"\n\t\t},\n\t\t\"contents\": {\n\t\t\t\"columns\": {\n\t\t\t\t\"content\": \"Content\",\n\t\t\t\t\"branches\": \"Branches\",\n\t\t\t\t\"born\": \"Origin\"\n\t\t\t},\n\t\t\t\"branch\": \"Branch\",\n\t\t\t\"branches\": \"Branches\",\n\t\t\t\"bornHere\": \"Created here\",\n\t\t\t\"onMain\": \"Published\",\n\t\t\t\"empty\": \"No Content in this Change Set yet\",\n\t\t\t\"emptyHint\": \"Start editing a Content into this Change Set and its Chain appears here.\"\n\t\t},\n\t\t\"rail\": {\n\t\t\t\"eyebrow\": \"Change Set\",\n\t\t\t\"actions\": \"Actions\",\n\t\t\t\"publish\": \"Publish\",\n\t\t\t\"updateFromMain\": \"Update from Main\",\n\t\t\t\"discard\": \"Discard\",\n\t\t\t\"about\": \"About\",\n\t\t\t\"blockers_one\": \"blocker\",\n\t\t\t\"blockers_other\": \"blockers\",\n\t\t\t\"readiness\": \"Publish readiness\",\n\t\t\t\"ready\": \"Ready\",\n\t\t\t\"unknownReadiness\": \"Unknown\",\n\t\t\t\"status\": \"Status\",\n\t\t\t\"noStatus\": \"No status\",\n\t\t\t\"state\": \"State\",\n\t\t\t\"source\": \"Source\",\n\t\t\t\"noSource\": \"No Source\"\n\t\t},\n\t\t\"review\": {\n\t\t\t\"title\": \"Publish {{name}}\",\n\t\t\t\"checking\": \"Checking what Publish would do…\",\n\t\t\t\"loadError\": \"The review could not be run. Close it and try again.\",\n\t\t\t\"headsTitle\": \"Reviewed heads\",\n\t\t\t\"headsHint\": \"Publish sends exactly these heads. If any moves before you publish, Publish is refused and nothing is written.\",\n\t\t\t\"headLine\": \"{{content}} · Branch {{branch}} at {{head}}\",\n\t\t\t\"noHeads\": \"No Branches: only Branch-less Releases are cut.\",\n\t\t\t\"blockersTitle_one\": \"{{count}} blocker\",\n\t\t\t\"blockersTitle_other\": \"{{count}} blockers\",\n\t\t\t\"blockersHint\": \"Fix each of these, then review again.\",\n\t\t\t\"ready\": \"Nothing blocks this Publish.\",\n\t\t\t\"releasesTitle\": \"Releases it cuts\",\n\t\t\t\"noReleases\": \"It cuts no Release.\",\n\t\t\t\"releaseLine\": \"{{content}} · {{kind}} · {{period}}\",\n\t\t\t\"publish\": \"Publish\",\n\t\t\t\"again\": \"Review again\",\n\t\t\t\"refused\": \"Publish was refused. Nothing was written.\",\n\t\t\t\"closed\": \"This Change Set was published or discarded meanwhile.\",\n\t\t\t\"withheld\": \"This Change Set holds work you can't see. Only someone who sees all of its Content can publish all of it.\",\n\t\t\t\"failed\": \"Publish failed. Try again.\",\n\t\t\t\"published\": \"Published.\",\n\t\t\t\"alreadyPublished\": \"It is published with these heads already.\",\n\t\t\t\"openContent\": \"Open {{content}}\"\n\t\t},\n\t\t\"blockers\": {\n\t\t\t\"moved_head\": \"{{content}}: Branch {{branch}} moved from {{expected}} to {{current}} since the review.\",\n\t\t\t\"moved_head_unreviewed\": \"{{content}}: Branch {{branch}} at {{current}} was not part of the review.\",\n\t\t\t\"moved_head_gone\": \"Branch {{branch}} is reviewed but no longer in this Change Set.\",\n\t\t\t\"unplanned_branch\": \"{{content}}: Branch {{branch}} has no Planned Release, so Publish would end it without releasing it.\",\n\t\t\t\"several_branches\": \"{{content}} is undated Content edited on more than one Branch; it is edited on exactly one.\",\n\t\t\t\"behind_base\": \"{{content}}: Branch {{branch}} is behind {{current}}, which it last took in as {{expected}}. Update from Main.\",\n\t\t\t\"superseded_release\": \"{{content}}: Planned Release {{release}} supersedes {{overlaps}}, which is superseded already.\",\n\t\t\t\"overlapping_periods\": \"{{content}}: the Validity Period of {{release}} overlaps that of {{overlaps}}. Supersede it or change the dates.\",\n\t\t\t\"covers_release\": \"{{content}}: the Validity Period of {{release}} covers Release {{covered}} entirely. Supersede it or change the dates.\",\n\t\t\t\"pending_merge\": \"{{content}}: Branch {{branch}} has a Pending Merge. Resolve or abort it in the Branch editor.\",\n\t\t\t\"nothing_in_force\": \"{{content}}: the Withdrawal {{release}} has nothing In Force left to withdraw.\",\n\t\t\t\"withdrawal_with_chain\": \"{{content}} is both withdrawn ({{release}}) and edited in this Change Set. Drop one of them.\",\n\t\t\t\"dated_changed\": \"{{content}} became Dated Content after {{release}} was planned as undated. Drop the Chain and start it again with a date.\",\n\t\t\t\"unpublished_dependency\": \"It depends on Change Set {{dependency}}, which is still open. Publish that first, or remove the dependency.\",\n\t\t\t\"discarded_dependency\": \"It depends on Change Set {{dependency}}, which was discarded. Remove the dependency, then update from Main.\",\n\t\t\t\"dangling_pin\": \"{{content}}: the value at {{path}} pins Release {{release}} of {{target}}, which will not exist.\",\n\t\t\t\"second_toc_parent\": \"{{content}} would be in the table of contents of {{parents}}; it can be in one only.\",\n\t\t\t\"missing_asset\": \"{{content}}: the value at {{path}} shows Asset {{asset}}, which doesn't exist.\",\n\t\t\t\"media_unavailable\": \"MediaHub is not available for this workspace.\",\n\t\t\t\"missing_required_field\": \"{{content}}: the required field {{path}} is empty in {{revision}}. Fill it in the Branch editor.\",\n\t\t\t\"outstanding_check\": \"{{check}} has no passed or waived result on the current heads.\",\n\t\t\t\"outstanding_check_on\": \"{{check}} has no passed or waived result on {{content}} ({{subject}}).\",\n\t\t\t\"unknown\": \"Blocked: {{code}}.\"\n\t\t},\n\t\t\"releases\": {\n\t\t\t\"planned\": \"Planned Releases\",\n\t\t\t\"columns\": {\n\t\t\t\t\"content\": \"Content\",\n\t\t\t\t\"kind\": \"Kind\",\n\t\t\t\t\"period\": \"Validity Period\",\n\t\t\t\t\"pins\": \"Pins\",\n\t\t\t\t\"origin\": \"Origin\"\n\t\t\t},\n\t\t\t\"kind\": {\n\t\t\t\t\"revision\": \"Revision\",\n\t\t\t\t\"date_only\": \"Date only\",\n\t\t\t\t\"repeal\": \"Repeal\",\n\t\t\t\t\"withdrawal\": \"Withdrawal\"\n\t\t\t},\n\t\t\t\"openEnd\": \"open\",\n\t\t\t\"undated\": \"Undated\",\n\t\t\t\"period\": \"{{first}} – {{last}}\",\n\t\t\t\"branchHead\": \"Head of Branch {{branch}}\",\n\t\t\t\"revision\": \"Revision {{revision}}\",\n\t\t\t\"plannedByHand\": \"Planned\",\n\t\t\t\"proposed\": \"Proposed for {{release}}\",\n\t\t\t\"splitFrom\": \"Resumes {{release}}\",\n\t\t\t\"withheld\": \"Withheld: a plan supersedes what it carries\",\n\t\t\t\"proposedHint\": \"Proposals follow from the planned Validity Periods and are recomputed with every plan; they are read-only.\",\n\t\t\t\"empty\": \"No Planned Releases yet\",\n\t\t\t\"emptyHint\": \"Plan a Release on a Branch in the Branch editor, and what Publish will cut appears here.\",\n\t\t\t\"covered\": \"Covered Releases\",\n\t\t\t\"coveredHint\": \"Published Releases a plan covers: Publish supersedes those a plan names, and is refused for the others until a plan supersedes them or the dates change.\",\n\t\t\t\"coveredColumns\": {\n\t\t\t\t\"release\": \"Release\",\n\t\t\t\t\"by\": \"Covered by\",\n\t\t\t\t\"outcome\": \"At Publish\"\n\t\t\t},\n\t\t\t\"superseded\": \"Superseded\",\n\t\t\t\"blocks\": \"Blocks Publish\",\n\t\t\t\"noCovered\": \"No published Release is covered.\"\n\t\t},\n\t\t\"checks\": {\n\t\t\t\"columns\": {\n\t\t\t\t\"check\": \"Required Check\",\n\t\t\t\t\"on\": \"On\",\n\t\t\t\t\"latest\": \"Latest result\",\n\t\t\t\t\"standing\": \"Standing\",\n\t\t\t\t\"actions\": \"Actions\"\n\t\t\t},\n\t\t\t\"wholeChangeSet\": \"The whole Change Set\",\n\t\t\t\"onBranch\": \"{{content}} · Branch {{branch}}\",\n\t\t\t\"onRelease\": \"{{content}} · Release {{release}}\",\n\t\t\t\"none\": \"No result yet\",\n\t\t\t\"latest\": \"{{outcome}} by {{who}}\",\n\t\t\t\"outcome\": {\n\t\t\t\t\"passed\": \"Passed\",\n\t\t\t\t\"failed\": \"Failed\",\n\t\t\t\t\"waived\": \"Waived\"\n\t\t\t},\n\t\t\t\"cleared\": \"Cleared\",\n\t\t\t\"stale\": \"Stale: saved since\",\n\t\t\t\"outstanding\": \"Outstanding\",\n\t\t\t\"record\": \"Record result\",\n\t\t\t\"independent\": \"Independent\",\n\t\t\t\"empty\": \"No Required Check applies\",\n\t\t\t\"emptyHint\": \"The workspace's Required Checks gate Publish of the Content they name. None of them applies to this Change Set.\",\n\t\t\t\"loadError\": \"The Check Results could not be loaded.\",\n\t\t\t\"form\": {\n\t\t\t\t\"title\": \"Record a result of {{check}}\",\n\t\t\t\t\"on\": \"On {{subject}}, at the heads you see now.\",\n\t\t\t\t\"outcome\": \"Outcome\",\n\t\t\t\t\"note\": \"Note\",\n\t\t\t\t\"noteHelp\": \"Why, for a waiver; optional otherwise.\",\n\t\t\t\t\"noteRequired\": \"A waiver needs a note saying why.\",\n\t\t\t\t\"noteTooLong\": \"At most {{max}} characters.\",\n\t\t\t\t\"submit\": \"Record\",\n\t\t\t\t\"stale\": \"Someone saved since you opened this. Close it, look again, and record on the new heads.\",\n\t\t\t\t\"denied\": \"You may not record this result.\",\n\t\t\t\t\"closed\": \"This Change Set is closed and takes no more results.\",\n\t\t\t\t\"failed\": \"The result could not be recorded. Try again.\"\n\t\t\t}\n\t\t},\n\t\t\"update\": {\n\t\t\t\"title\": \"Update from Main\",\n\t\t\t\"message\": \"Merge what Main and this Change Set's dependencies gained since into every Chain. A save since a Check Result makes it stale, and so does this update.\",\n\t\t\t\"confirm\": \"Update\",\n\t\t\t\"close\": \"Close\",\n\t\t\t\"done\": \"Updated.\",\n\t\t\t\"merged_one\": \"{{count}} Branch took in a merge.\",\n\t\t\t\"merged_other\": \"{{count}} Branches took in a merge.\",\n\t\t\t\"nothingMerged\": \"Nothing to take in: every Branch is up to date.\",\n\t\t\t\"stopped_one\": \"The merge stopped on {{count}} Branch.\",\n\t\t\t\"stopped_other\": \"The merge stopped on {{count}} Branches.\",\n\t\t\t\"noneMerged\": \"No Branch took in a merge.\",\n\t\t\t\"pendingTitle\": \"Left with a Pending Merge, to resolve in the Branch editor:\",\n\t\t\t\"pendingLine\": \"{{content}} · Branch {{branch}}\",\n\t\t\t\"closed\": \"This Change Set is closed.\",\n\t\t\t\"withheld\": \"This Change Set holds work you can't see. Only someone who sees all of its Content can update all of it.\",\n\t\t\t\"failed\": \"The update failed. Try again.\"\n\t\t},\n\t\t\"discard\": {\n\t\t\t\"title\": \"Discard Change Set\",\n\t\t\t\"message\": \"Discard “{{name}}”? Its Branches end and Content created in it is gone. This cannot be undone.\",\n\t\t\t\"confirm\": \"Discard\",\n\t\t\t\"closed\": \"This Change Set is closed already.\",\n\t\t\t\"withheld\": \"This Change Set holds work you can't see. Only someone who sees all of its Content can discard all of it.\",\n\t\t\t\"failed\": \"The Change Set could not be discarded. Try again.\"\n\t\t}\n\t},\n\t\"library\": {\n\t\t\"title\": \"Content\",\n\t\t\"collections\": \"Collections\",\n\t\t\"collectionsError\": \"The Collections could not be loaded.\",\n\t\t\"allContent\": \"All Content\",\n\t\t\"restricted\": \"Restricted\",\n\t\t\"columns\": {\n\t\t\t\"content\": \"Content\",\n\t\t\t\"blueprint\": \"Blueprint\",\n\t\t\t\"readOn\": \"Read on\",\n\t\t\t\"revised\": \"Last revised\"\n\t\t},\n\t\t\"view\": {\n\t\t\t\"main\": \"Main\",\n\t\t\t\"in_force\": \"In force today\",\n\t\t\t\"change_set\": \"In a Change Set\"\n\t\t},\n\t\t\"readOn\": {\n\t\t\t\"main\": \"Main\",\n\t\t\t\"release\": \"Release in force\"\n\t\t},\n\t\t\"filter\": {\n\t\t\t\"searchPlaceholder\": \"Search by name, number or phrase…\",\n\t\t\t\"searchInForce\": \"Search covers Main and Change Sets, not Releases\",\n\t\t\t\"view\": \"View\",\n\t\t\t\"changeSet\": \"Change Set\",\n\t\t\t\"noOpenChangeSet\": \"No open Change Set\",\n\t\t\t\"blueprint\": \"Blueprint\",\n\t\t\t\"anyBlueprint\": \"Any Blueprint\",\n\t\t\t\"assignee\": \"Assignee\",\n\t\t\t\"anyone\": \"Anyone\",\n\t\t\t\"me\": \"Assigned to me\"\n\t\t},\n\t\t\"count_one\": \"{{count}} Content\",\n\t\t\"count_other\": \"{{count}} Contents\",\n\t\t\"empty\": \"No Content here\",\n\t\t\"emptyHint\": \"Nothing matches this Collection and these filters. Choose All Content or clear a filter to see more.\",\n\t\t\"loadError\": \"The Content could not be loaded.\",\n\t\t\"more\": \"Show more\",\n\t\t\"create\": {\n\t\t\t\"button\": \"New Content\",\n\t\t\t\"title\": \"New Content\",\n\t\t\t\"blueprint\": \"Blueprint\",\n\t\t\t\"blueprintHelp\": \"The kind of Content, as a Blueprint defines it.\",\n\t\t\t\"pickBlueprint\": \"Choose a Blueprint\",\n\t\t\t\"blueprintRequired\": \"Choose a Blueprint.\",\n\t\t\t\"release\": \"Blueprint Release\",\n\t\t\t\"releaseHelp\": \"The Release the Content pins. The newest is chosen for you.\",\n\t\t\t\"releaseRequired\": \"Choose a Release.\",\n\t\t\t\"noRelease\": \"This Blueprint has no Release yet. Cut one in blueprinthub first.\",\n\t\t\t\"noUsableRelease\": \"No Release of this Blueprint can be used. Fix the Blueprint in blueprinthub and cut a new Release.\",\n\t\t\t\"releasesFailed\": \"The Releases could not be loaded: blueprinthub isn't answering. Try again.\",\n\t\t\t\"refusedRelease\": \"{{name}} (can't be used)\",\n\t\t\t\"refusedReleases\": \"contenthub can't pin these Releases:\",\n\t\t\t\"refusedReleaseReasons\": \"{{name}}: {{reasons}}\",\n\t\t\t\"changeSet\": \"Change Set\",\n\t\t\t\"changeSetHelp\": \"New Content is created in a Change Set and exists only there until it is published.\",\n\t\t\t\"changeSetRequired\": \"Choose a Change Set.\",\n\t\t\t\"newChangeSet\": \"A new Change Set\",\n\t\t\t\"changeSetName\": \"Name of the new Change Set\",\n\t\t\t\"submit\": \"Create and edit\",\n\t\t\t\"refused\": \"contenthub refused the new Content: {{reasons}}.\",\n\t\t\t\"changeSetClosed\": \"That Change Set is closed. Choose an open one.\",\n\t\t\t\"failed\": \"The Content could not be created. Try again.\"\n\t\t}\n\t},\n\t\"content\": {\n\t\t\"loading\": \"Loading Content…\",\n\t\t\"unavailable\": \"Content unavailable\",\n\t\t\"notFound\": \"This Content doesn't exist, or exists only inside a Change Set.\",\n\t\t\"loadError\": \"The Content could not be loaded.\",\n\t\t\"none\": \"None\",\n\t\t\"tabs\": {\n\t\t\t\"data\": \"Data\",\n\t\t\t\"releases\": \"Releases\",\n\t\t\t\"revisions\": \"Revisions\",\n\t\t\t\"references\": \"References\",\n\t\t\t\"changeSets\": \"Change Sets\",\n\t\t\t\"filing\": \"Filing\"\n\t\t},\n\t\t\"badges\": {\n\t\t\t\"born\": \"In a Change Set\",\n\t\t\t\"blocked\": \"Blocked\",\n\t\t\t\"archived\": \"Archived\"\n\t\t},\n\t\t\"refused\": {\n\t\t\t\"blocked\": \"This Content is blocked, and its Block doesn't allow you to edit it.\",\n\t\t\t\"archived\": \"This Content is archived. Unarchive it before editing it.\",\n\t\t\t\"failed\": \"That didn't work. Try again.\"\n\t\t},\n\t\t\"rail\": {\n\t\t\t\"eyebrow\": \"Content\",\n\t\t\t\"actions\": \"Actions\",\n\t\t\t\"about\": \"About\",\n\t\t\t\"blueprint\": \"Blueprint\",\n\t\t\t\"inForce\": \"In force today\",\n\t\t\t\"inForceRelease\": \"Release {{ordinal}}, {{period}}\",\n\t\t\t\"noneInForce\": \"Nothing in force today\",\n\t\t\t\"block\": \"Block\",\n\t\t\t\"blockedBy\": \"{{reason}}, by {{who}}\",\n\t\t\t\"notBlocked\": \"Not blocked\",\n\t\t\t\"archived\": \"Archived on\"\n\t\t},\n\t\t\"actions\": {\n\t\t\t\"startEditing\": \"Start editing\",\n\t\t\t\"openBranch\": \"Open its Branch\",\n\t\t\t\"duplicate\": \"Duplicate\",\n\t\t\t\"repeal\": \"Repeal\",\n\t\t\t\"withdraw\": \"Withdraw\",\n\t\t\t\"block\": \"Block\",\n\t\t\t\"unblock\": \"Unblock\",\n\t\t\t\"archive\": \"Archive\",\n\t\t\t\"unarchive\": \"Unarchive\"\n\t\t},\n\t\t\"data\": {\n\t\t\t\"readOnMain\": \"Main's head, Revision {{revision}}. Read-only: Start editing to change it in a Branch.\",\n\t\t\t\"readOnBranch\": \"Its Branch head, Revision {{revision}}. Read-only: open its Branch to change it.\",\n\t\t\t\"general\": \"General\",\n\t\t\t\"find\": \"Find field\",\n\t\t\t\"noFields\": \"No fields found\",\n\t\t\t\"yes\": \"Yes\",\n\t\t\t\"no\": \"No\"\n\t\t},\n\t\t\"releases\": {\n\t\t\t\"columns\": {\n\t\t\t\t\"ordinal\": \"#\",\n\t\t\t\t\"release\": \"Release\",\n\t\t\t\t\"kind\": \"Kind\",\n\t\t\t\t\"period\": \"Validity Period\",\n\t\t\t\t\"published\": \"Published\",\n\t\t\t\t\"inForce\": \"Today\",\n\t\t\t\t\"changeSet\": \"Change Set\",\n\t\t\t\t\"proposed\": \"Origin\"\n\t\t\t},\n\t\t\t\"kind\": {\n\t\t\t\t\"revision\": \"Revision\",\n\t\t\t\t\"date_only\": \"Date-only\",\n\t\t\t\t\"repeal\": \"Repeal\",\n\t\t\t\t\"withdrawal\": \"Withdrawal\"\n\t\t\t},\n\t\t\t\"period\": \"{{first}} – {{last}}\",\n\t\t\t\"openPeriod\": \"from {{first}}\",\n\t\t\t\"undated\": \"Undated\",\n\t\t\t\"inForceToday\": \"In force\",\n\t\t\t\"notInForce\": \"Not in force\",\n\t\t\t\"empty\": \"No Release yet\",\n\t\t\t\"emptyHint\": \"A Release is cut when a Change Set holding this Content is published.\",\n\t\t\t\"plannedTitle\": \"Planned Releases of open Change Sets\",\n\t\t\t\"noPlanned\": \"No open Change Set plans a Release of it\",\n\t\t\t\"proposed\": \"Proposed\",\n\t\t\t\"planned\": \"Planned\",\n\t\t\t\"loadError\": \"The Timeline could not be loaded.\"\n\t\t},\n\t\t\"revisions\": {\n\t\t\t\"columns\": {\n\t\t\t\t\"revision\": \"Revision\",\n\t\t\t\t\"written\": \"Written\",\n\t\t\t\t\"author\": \"Author\",\n\t\t\t\t\"cause\": \"Cause\",\n\t\t\t\t\"changeSet\": \"Change Set\"\n\t\t\t},\n\t\t\t\"cause\": {\n\t\t\t\t\"create\": \"Created\",\n\t\t\t\t\"save\": \"Saved\",\n\t\t\t\t\"merge\": \"Merged from Main\",\n\t\t\t\t\"resolve\": \"Merge resolved\",\n\t\t\t\t\"upgrade\": \"Blueprint upgraded\",\n\t\t\t\t\"unspecified\": \"Not recorded\"\n\t\t\t},\n\t\t\t\"discarded\": \"Change Set discarded\",\n\t\t\t\"empty\": \"No Revisions\",\n\t\t\t\"loadError\": \"The Revisions could not be loaded.\",\n\t\t\t\"pickToCompare\": \"Choose a Revision to compare it with the one it was built on.\"\n\t\t},\n\t\t\"compare\": {\n\t\t\t\"title\": \"Revision {{revision}}\",\n\t\t\t\"titleParent\": \"Revision {{revision}} compared with {{base}}\",\n\t\t\t\"titleMain\": \"Revision {{revision}} compared with Main's head\",\n\t\t\t\"columns\": {\n\t\t\t\t\"field\": \"Field\",\n\t\t\t\t\"kind\": \"Change\",\n\t\t\t\t\"before\": \"Before\",\n\t\t\t\t\"after\": \"After\"\n\t\t\t},\n\t\t\t\"kind\": {\n\t\t\t\t\"added\": \"Added\",\n\t\t\t\t\"removed\": \"Removed\",\n\t\t\t\t\"changed\": \"Changed\"\n\t\t\t},\n\t\t\t\"nothing\": \"This is the Content's first Revision, and it has no Main to compare with.\",\n\t\t\t\"same\": \"No field differs\",\n\t\t\t\"loadError\": \"The comparison could not be loaded.\"\n\t\t},\n\t\t\"references\": {\n\t\t\t\"outgoing\": \"References from this Content\",\n\t\t\t\"referrers\": \"Referred to by\",\n\t\t\t\"outdated\": \"Outdated pins\",\n\t\t\t\"columns\": {\n\t\t\t\t\"kind\": \"Kind\",\n\t\t\t\t\"field\": \"Field\",\n\t\t\t\t\"target\": \"Target\",\n\t\t\t\t\"pin\": \"Pinned to\",\n\t\t\t\t\"source\": \"From\",\n\t\t\t\t\"foundIn\": \"Found in\",\n\t\t\t\t\"inForceNow\": \"In force today\"\n\t\t\t},\n\t\t\t\"kind\": {\n\t\t\t\t\"reference\": \"Reference\",\n\t\t\t\t\"toc\": \"TOC\",\n\t\t\t\t\"include\": \"Include\",\n\t\t\t\t\"exclude\": \"Exclude\",\n\t\t\t\t\"replace\": \"Replace\",\n\t\t\t\t\"annotate\": \"Annotate\",\n\t\t\t\t\"link\": \"Link\",\n\t\t\t\t\"footnote\": \"Footnote\",\n\t\t\t\t\"anchor\": \"Anchor\",\n\t\t\t\t\"media\": \"Media\",\n\t\t\t\t\"blueprint\": \"Blueprint\",\n\t\t\t\t\"unspecified\": \"Other\"\n\t\t\t},\n\t\t\t\"followsInForce\": \"Follows the Release in force\",\n\t\t\t\"inRelease\": \"Release {{release}}\",\n\t\t\t\"inChangeSet\": \"Change Set {{changeSet}}\",\n\t\t\t\"gap\": \"Nothing (a gap)\",\n\t\t\t\"noOutgoing\": \"It refers to nothing\",\n\t\t\t\"noReferrers\": \"Nothing refers to it\",\n\t\t\t\"noOutdated\": \"No pin is outdated\",\n\t\t\t\"loadError\": \"These references could not be loaded.\"\n\t\t},\n\t\t\"changeSets\": {\n\t\t\t\"assignee\": \"assignee\",\n\t\t\t\"assignees\": \"assignees\",\n\t\t\t\"opened\": \"Opened\",\n\t\t\t\"empty\": \"No open Change Set changes it\",\n\t\t\t\"emptyHint\": \"Start editing opens one, or adds it to one that is open.\",\n\t\t\t\"loadError\": \"The Change Sets could not be loaded.\"\n\t\t},\n\t\t\"filing\": {\n\t\t\t\"title\": \"Filing\",\n\t\t\t\"collections\": \"Collections\",\n\t\t\t\"collectionsHelp\": \"Where the Content is filed in the Library. Filing is not versioned.\",\n\t\t\t\"nowhere\": \"Filed nowhere\",\n\t\t\t\"assignees\": \"Assignees\",\n\t\t\t\"assigneesHelp\": \"Who maintains this Content.\",\n\t\t\t\"notASave\": \"Saving Filing writes no Revision and needs no Change Set.\",\n\t\t\t\"saved\": \"Filing saved.\"\n\t\t},\n\t\t\"startEditing\": {\n\t\t\t\"title\": \"Start editing\",\n\t\t\t\"changeSetHelp\": \"The Change Set the edit is made in: an open one, or a new one.\",\n\t\t\t\"nameHelp\": \"Left empty, it is named after the Content.\",\n\t\t\t\"effectiveOn\": \"Effective on\",\n\t\t\t\"effectiveOnHelp\": \"The day the change takes effect.\",\n\t\t\t\"dateRequired\": \"Choose the day the change takes effect.\",\n\t\t\t\"forksFrom\": \"Forks from\",\n\t\t\t\"forksFromMain\": \"Main's head (nothing in force then)\",\n\t\t\t\"carriesForward\": \"Later Releases carried forward\",\n\t\t\t\"cutsInto\": \"Cuts into\",\n\t\t\t\"covers\": \"A period from this day would cover {{releases}} entirely.\",\n\t\t\t\"submit\": \"Start editing\"\n\t\t},\n\t\t\"duplicate\": {\n\t\t\t\"title\": \"Duplicate\",\n\t\t\t\"hint\": \"The copy is new Content: it takes this Revision's data and Blueprint Release, and none of its history.\",\n\t\t\t\"changeSetHelp\": \"The copy exists only in this Change Set until it is published.\",\n\t\t\t\"submit\": \"Duplicate and edit\"\n\t\t},\n\t\t\"endForce\": {\n\t\t\t\"repeal\": {\n\t\t\t\t\"title\": \"Repeal\",\n\t\t\t\t\"hint\": \"Plans a Repeal ending the Release in force on its last day; nothing is in force after it. Publishing the Change Set cuts it.\",\n\t\t\t\t\"submit\": \"Plan Repeal\",\n\t\t\t\t\"planned\": \"The Repeal is planned.\"\n\t\t\t},\n\t\t\t\"withdraw\": {\n\t\t\t\t\"title\": \"Withdraw\",\n\t\t\t\t\"hint\": \"Plans a Withdrawal ending its force from the Change Set's Publish on.\",\n\t\t\t\t\"submit\": \"Plan Withdrawal\",\n\t\t\t\t\"planned\": \"The Withdrawal is planned.\"\n\t\t\t},\n\t\t\t\"changeSetHelp\": \"The Change Set whose Publish ends its force.\",\n\t\t\t\"lastDay\": \"Last day in force\",\n\t\t\t\"lastDayHelp\": \"The last day the Content is in force.\",\n\t\t\t\"lastDayRequired\": \"Choose its last day in force.\",\n\t\t\t\"gapReferrers_one\": \"{{count}} reference will point at a gap\",\n\t\t\t\"gapReferrers_other\": \"{{count}} references will point at a gap\",\n\t\t\t\"done\": \"Done\"\n\t\t},\n\t\t\"block\": {\n\t\t\t\"title\": \"Block\",\n\t\t\t\"reason\": \"Block Reason\",\n\t\t\t\"reasonHelp\": \"Why the Content is blocked, as the workspace names its reasons.\",\n\t\t\t\"reasonRequired\": \"Choose a Block Reason.\",\n\t\t\t\"noReasons\": \"The workspace has no Block Reasons yet. Add one in the settings first.\",\n\t\t\t\"openBlockReasons\": \"Open the Block Reasons settings\",\n\t\t\t\"allowed\": \"Still allowed to edit\",\n\t\t\t\"allowedHelp\": \"Everyone else is refused every edit while it is blocked.\",\n\t\t\t\"submit\": \"Block\"\n\t\t},\n\t\t\"archive\": {\n\t\t\t\"title\": \"Archive this Content?\",\n\t\t\t\"message\": \"Archived Content leaves the Library, every picker and editing. Its Releases stay readable, and Unarchive brings it back.\",\n\t\t\t\"confirm\": \"Archive\"\n\t\t}\n\t}\n}\n","import de from \"./de.json\";\nimport en from \"./en.json\";\n\n/**\n * The i18next namespace every string in this package is looked up under. A\n * host lists this constant among its namespaces, never the literal, so a\n * rename fails the host's compile rather than rendering raw keys (knkcms/core\n * ADR 0005). The package's own `useTranslation` calls name the same string,\n * which `resources.test.ts` holds them to.\n */\nexport const CONTENTHUB_UI_NS = \"contenthub-ui\";\n\n/** The package's bundled translations, keyed by language, then by `CONTENTHUB_UI_NS`. */\nexport const i18nResources = {\n\ten: { [CONTENTHUB_UI_NS]: en },\n\tde: { [CONTENTHUB_UI_NS]: de },\n};\n\n/**\n * The package's translations as the one `{ namespace, resources }` export a\n * host merges (knkcms/core ADR 0005, core's `mergePackageTranslations`).\n */\nexport const contenthubTranslations = {\n\tnamespace: CONTENTHUB_UI_NS,\n\tresources: i18nResources,\n} as const;\n","import { useMemo } from \"react\";\nimport { type ContenthubClient, MAX_BLUEPRINT_IDS } from \"../client/contenthub-client\";\nimport type { BlueprintSource } from \"../types\";\n\n/**\n * The Blueprint source every screen uses unless a host passes its own:\n * contenthub's `BlueprintCatalogService`, through the screens' own client.\n * blueprinthub is contenthub's direct dependency (ADR 0020 as amended,\n * #238), so a host needs no connection to it for New Content, Blueprint\n * names or the Library's Blueprint filter.\n *\n * `getBlueprints` is contenthub's `GetBlueprints` (#241): archived\n * Blueprints are named too. It asks once per id, in calls of at most\n * `MAX_BLUEPRINT_IDS`, and asks nothing for no ids, since an empty id\n * filter would mean every Blueprint to blueprinthub.\n */\nexport function blueprintSourceFromClient(client: ContenthubClient): BlueprintSource {\n\treturn {\n\t\tsearchBlueprints: (input) => client.searchBlueprints(input),\n\t\tasync getBlueprints(ids) {\n\t\t\tconst unique = [...new Set(ids.filter((id) => id !== \"\"))];\n\t\t\tconst chunks: string[][] = [];\n\t\t\tfor (let i = 0; i < unique.length; i += MAX_BLUEPRINT_IDS) {\n\t\t\t\tchunks.push(unique.slice(i, i + MAX_BLUEPRINT_IDS));\n\t\t\t}\n\t\t\tconst found = await Promise.all(chunks.map((chunk) => client.getBlueprints(chunk)));\n\t\t\treturn found.flat();\n\t\t},\n\t\tlistReleases: (blueprintId) => client.listBlueprintReleases(blueprintId),\n\t};\n}\n\n/** `source` when a host passed one, else the source over `client`. */\nexport function useBlueprintSource(\n\tclient: ContenthubClient,\n\tsource: BlueprintSource | undefined,\n): BlueprintSource {\n\treturn useMemo(() => source ?? blueprintSourceFromClient(client), [client, source]);\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { ContenthubClient } from \"../client/contenthub-client\";\nimport { contenthubKeys } from \"./query-keys\";\n\n/** Open Change Sets a picker offers; more than this is a workspace that searches instead. */\nconst OPEN_CHANGE_SETS = 200;\n\n/**\n * The workspace's open Change Sets, newest first, for the Library's view\n * picker and New Content's Change Set picker, which share the read.\n */\nexport function useOpenChangeSets(client: ContenthubClient, enabled = true) {\n\treturn useQuery({\n\t\tqueryKey: contenthubKeys.openChangeSets(),\n\t\tqueryFn: () => client.listChangeSets({ state: \"open\", pageSize: OPEN_CHANGE_SETS }),\n\t\tenabled,\n\t});\n}\n","import {\n\tcreateTreeCollection,\n\tTreeViewBranchControl,\n\tTreeViewBranchIndicator,\n\tTreeViewBranchText,\n\tTreeViewItem,\n\tTreeViewItemText,\n\tTreeViewLabel,\n\tTreeViewNode,\n\tTreeViewRoot,\n\tTreeViewTree,\n} from \"@knkcs/anker/components\";\nimport { ChevronRight, Lock } from \"lucide-react\";\nimport { useMemo, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { CONTENTHUB_UI_NS } from \"../i18n/resources\";\nimport type { Collection } from \"../types\";\n\n/** The tree's first row, standing for no Collection: every Content. */\nconst ALL = \"__all__\";\n\ninterface CollectionNode {\n\tid: string;\n\tname: string;\n\trestricted: boolean;\n\tchildren?: CollectionNode[];\n}\n\n/**\n * The Collections from the root down to `id`, `id` included; empty for one\n * the caller can't see.\n */\nexport function collectionPath(id: string, collections: Collection[]): Collection[] {\n\tconst byId = new Map(collections.map((c) => [c.id, c]));\n\tconst out: Collection[] = [];\n\tconst seen = new Set<string>();\n\tlet at = byId.get(id);\n\t// A cycle can't come from the service; the guard keeps a bad fixture from hanging.\n\twhile (at && !seen.has(at.id)) {\n\t\tseen.add(at.id);\n\t\tout.unshift(at);\n\t\tat = byId.get(at.parentId);\n\t}\n\treturn out;\n}\n\nfunction RestrictedMark() {\n\tconst { t } = useTranslation(CONTENTHUB_UI_NS);\n\treturn <Lock size={12} aria-label={t(\"library.restricted\")} />;\n}\n\nexport interface CollectionTreeProps {\n\t/** Every Collection of the workspace, in the service's order (by name). */\n\tcollections: Collection[];\n\t/** The selected Collection; \"\" for every Content. */\n\tactiveId: string;\n\t/** \"\" when \"All Content\" is chosen. */\n\tonSelect: (collectionId: string) => void;\n}\n\n/**\n * The workspace's Collections as a tree, with \"All Content\" above them, for\n * the Library's `SubNavLayout.Nav`. The service lists the whole tree in one\n * read, so it is built in full rather than loaded per branch; the selected\n * Collection's ancestors start expanded, so a deep link shows where it is.\n * Managing Collections is administration, under Settings (ADR 0020).\n */\nexport function CollectionTree({ collections, activeId, onSelect }: CollectionTreeProps) {\n\tconst { t } = useTranslation(CONTENTHUB_UI_NS);\n\tconst byId = useMemo(() => new Map(collections.map((c) => [c.id, c])), [collections]);\n\n\tconst tree = useMemo(() => {\n\t\tconst childrenOf = new Map<string, CollectionNode[]>();\n\t\tfor (const c of collections) {\n\t\t\t// One whose parent this caller can't see sits at the root rather than vanishing.\n\t\t\tconst parent = c.parentId !== \"\" && byId.has(c.parentId) ? c.parentId : \"\";\n\t\t\tconst list = childrenOf.get(parent) ?? [];\n\t\t\tlist.push({ id: c.id, name: c.name, restricted: c.restricted });\n\t\t\tchildrenOf.set(parent, list);\n\t\t}\n\t\tconst build = (node: CollectionNode, seen: Set<string>): CollectionNode => {\n\t\t\tconst kids = (childrenOf.get(node.id) ?? []).filter((k) => !seen.has(k.id));\n\t\t\tif (kids.length === 0) return node;\n\t\t\tconst next = new Set(seen).add(node.id);\n\t\t\treturn { ...node, children: kids.map((k) => build(k, next)) };\n\t\t};\n\t\tconst roots = (childrenOf.get(\"\") ?? []).map((r) => build(r, new Set([r.id])));\n\t\treturn createTreeCollection<CollectionNode>({\n\t\t\trootNode: {\n\t\t\t\tid: \"ROOT\",\n\t\t\t\tname: \"\",\n\t\t\t\trestricted: false,\n\t\t\t\tchildren: [{ id: ALL, name: t(\"library.allContent\"), restricted: false }, ...roots],\n\t\t\t},\n\t\t\tnodeToValue: (node) => node.id,\n\t\t\tnodeToString: (node) => node.name,\n\t\t});\n\t}, [collections, byId, t]);\n\n\t// Read once, on mount: after that the expanding and collapsing are the\n\t// user's. The Library mounts the tree once the Collections are in.\n\tconst [expanded] = useState(() =>\n\t\tcollectionPath(activeId, collections)\n\t\t\t.slice(0, -1)\n\t\t\t.map((c) => c.id),\n\t);\n\n\treturn (\n\t\t<TreeViewRoot\n\t\t\tcollection={tree}\n\t\t\tsize=\"sm\"\n\t\t\tselectedValue={[activeId === \"\" ? ALL : activeId]}\n\t\t\tdefaultExpandedValue={expanded}\n\t\t\tonSelectionChange={(details) => {\n\t\t\t\tconst picked = details.selectedValue[0];\n\t\t\t\tif (picked === undefined) return;\n\t\t\t\tonSelect(picked === ALL ? \"\" : picked);\n\t\t\t}}\n\t\t>\n\t\t\t{/* Names the tree for assistive technology; the Nav around it is labelled for sight. */}\n\t\t\t<TreeViewLabel srOnly>{t(\"library.collections\")}</TreeViewLabel>\n\t\t\t<TreeViewTree>\n\t\t\t\t<TreeViewNode<CollectionNode>\n\t\t\t\t\trender={({ node, nodeState }) =>\n\t\t\t\t\t\tnodeState.isBranch ? (\n\t\t\t\t\t\t\t<TreeViewBranchControl>\n\t\t\t\t\t\t\t\t<TreeViewBranchIndicator>\n\t\t\t\t\t\t\t\t\t<ChevronRight size={14} />\n\t\t\t\t\t\t\t\t</TreeViewBranchIndicator>\n\t\t\t\t\t\t\t\t<TreeViewBranchText>{node.name}</TreeViewBranchText>\n\t\t\t\t\t\t\t\t{node.restricted ? <RestrictedMark /> : null}\n\t\t\t\t\t\t\t</TreeViewBranchControl>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<TreeViewItem>\n\t\t\t\t\t\t\t\t<TreeViewItemText>{node.name}</TreeViewItemText>\n\t\t\t\t\t\t\t\t{node.restricted ? <RestrictedMark /> : null}\n\t\t\t\t\t\t\t</TreeViewItem>\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</TreeViewTree>\n\t\t</TreeViewRoot>\n\t);\n}\n","import { zodResolver } from \"@hookform/resolvers/zod\";\nimport { Button } from \"@knkcs/anker/atoms\";\nimport { Modal } from \"@knkcs/anker/components\";\nimport { InputField } from \"@knkcs/anker/forms\";\nimport { Alert, HStack, Stack } from \"@knkcs/anker/primitives\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport { useTranslation } from \"react-i18next\";\nimport { z } from \"zod\";\nimport {\n\tCHANGE_SET_NAME_MAX,\n\tInvalidInputError,\n\tSOURCE_REFERENCE_MAX,\n} from \"../client/contenthub-client\";\nimport { CONTENTHUB_UI_NS } from \"../i18n/resources\";\nimport type { ChangeSetSource } from \"../types\";\n\ntype CreateValues = { name: string; sourceDate: string; sourceReference: string };\n\nconst EMPTY: CreateValues = { name: \"\", sourceDate: \"\", sourceReference: \"\" };\nconst FORM_ID = \"contenthub-create-change-set\";\n/** One line of text: no control characters, as the service requires of names. */\n// biome-ignore lint/suspicious/noControlCharactersInRegex: the rule is exactly \"no control characters\"\nexport const ONE_LINE = /^[^\\u0000-\\u001f\\u007f]*$/;\n\nexport interface CreateChangeSetModalProps {\n\topen: boolean;\n\tonClose: () => void;\n\t/**\n\t * Creates it. An `InvalidInputError` it rejects with is the service's\n\t * guidance and is shown as it is; anything else as a generic failure.\n\t */\n\tonSubmit: (input: { name: string; source?: ChangeSetSource }) => Promise<void>;\n}\n\n/**\n * Asks for a new Change Set's name and, optionally, its Source: the date and\n * reference of the publication that triggered it. A Source is both or\n * neither (CONTEXT.md), which the form says before the service would.\n *\n * Kept mounted and driven by `open`, with `lazyMount unmountOnExit` (anker's\n * Modal rule); every opening resets the form, since an interrupted exit never\n * unmounts the content.\n */\nexport function CreateChangeSetModal({ open, onClose, onSubmit }: CreateChangeSetModalProps) {\n\tconst { t } = useTranslation(CONTENTHUB_UI_NS);\n\tconst schema = useMemo(\n\t\t() =>\n\t\t\tz\n\t\t\t\t.object({\n\t\t\t\t\tname: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.trim()\n\t\t\t\t\t\t.min(1, t(\"changeSets.form.nameRequired\"))\n\t\t\t\t\t\t.max(CHANGE_SET_NAME_MAX, t(\"changeSets.form.tooLong\", { max: CHANGE_SET_NAME_MAX }))\n\t\t\t\t\t\t.regex(ONE_LINE, t(\"changeSets.form.oneLine\")),\n\t\t\t\t\tsourceDate: z.string().trim(),\n\t\t\t\t\tsourceReference: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.trim()\n\t\t\t\t\t\t.max(SOURCE_REFERENCE_MAX, t(\"changeSets.form.tooLong\", { max: SOURCE_REFERENCE_MAX }))\n\t\t\t\t\t\t.regex(ONE_LINE, t(\"changeSets.form.oneLine\")),\n\t\t\t\t})\n\t\t\t\t.superRefine((v, ctx) => {\n\t\t\t\t\t// A Source is a date and a reference, or nothing at all.\n\t\t\t\t\tif (v.sourceReference !== \"\" && v.sourceDate === \"\") {\n\t\t\t\t\t\tctx.addIssue({\n\t\t\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\t\t\tpath: [\"sourceDate\"],\n\t\t\t\t\t\t\tmessage: t(\"changeSets.form.sourceDateRequired\"),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (v.sourceDate !== \"\" && v.sourceReference === \"\") {\n\t\t\t\t\t\tctx.addIssue({\n\t\t\t\t\t\t\tcode: \"custom\",\n\t\t\t\t\t\t\tpath: [\"sourceReference\"],\n\t\t\t\t\t\t\tmessage: t(\"changeSets.form.sourceReferenceRequired\"),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t[t],\n\t);\n\tconst methods = useForm<CreateValues>({ resolver: zodResolver(schema), defaultValues: EMPTY });\n\tconst [refusal, setRefusal] = useState<string | null>(null);\n\tconst submitting = methods.formState.isSubmitting;\n\n\tuseEffect(() => {\n\t\tif (open) {\n\t\t\tmethods.reset(EMPTY);\n\t\t\tsetRefusal(null);\n\t\t}\n\t}, [open, methods]);\n\n\tconst submit = methods.handleSubmit(async (values) => {\n\t\tsetRefusal(null);\n\t\ttry {\n\t\t\tawait onSubmit({\n\t\t\t\tname: values.name,\n\t\t\t\tsource:\n\t\t\t\t\tvalues.sourceDate !== \"\"\n\t\t\t\t\t\t? { date: values.sourceDate, reference: values.sourceReference }\n\t\t\t\t\t\t: undefined,\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tsetRefusal(err instanceof InvalidInputError ? err.message : t(\"changeSets.form.failed\"));\n\t\t}\n\t});\n\n\treturn (\n\t\t<Modal\n\t\t\topen={open}\n\t\t\tonClose={onClose}\n\t\t\tlazyMount\n\t\t\tunmountOnExit\n\t\t\tsize=\"md\"\n\t\t\theader={t(\"changeSets.form.createTitle\")}\n\t\t\tfooter={\n\t\t\t\t<HStack gap=\"2\">\n\t\t\t\t\t<Button size=\"sm\" variant=\"ghost\" onClick={onClose}>\n\t\t\t\t\t\t{t(\"common.cancel\")}\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button type=\"submit\" form={FORM_ID} size=\"sm\" variant=\"solid\" loading={submitting}>\n\t\t\t\t\t\t{t(\"changeSets.form.createSubmit\")}\n\t\t\t\t\t</Button>\n\t\t\t\t</HStack>\n\t\t\t}\n\t\t>\n\t\t\t<FormProvider {...methods}>\n\t\t\t\t<form\n\t\t\t\t\tid={FORM_ID}\n\t\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tvoid submit();\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<Stack gap=\"4\">\n\t\t\t\t\t\t<InputField<CreateValues>\n\t\t\t\t\t\t\tname=\"name\"\n\t\t\t\t\t\t\tlabel={t(\"changeSets.form.name\")}\n\t\t\t\t\t\t\thelperText={t(\"changeSets.form.nameHelp\")}\n\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<InputField<CreateValues>\n\t\t\t\t\t\t\tname=\"sourceDate\"\n\t\t\t\t\t\t\ttype=\"date\"\n\t\t\t\t\t\t\tlabel={t(\"changeSets.form.sourceDate\")}\n\t\t\t\t\t\t\thelperText={t(\"changeSets.form.sourceDateHelp\")}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<InputField<CreateValues>\n\t\t\t\t\t\t\tname=\"sourceReference\"\n\t\t\t\t\t\t\tlabel={t(\"changeSets.form.sourceReference\")}\n\t\t\t\t\t\t\thelperText={t(\"changeSets.form.sourceReferenceHelp\")}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{refusal ? <Alert status=\"error\" title={refusal} /> : null}\n\t\t\t\t\t</Stack>\n\t\t\t\t</form>\n\t\t\t</FormProvider>\n\t\t</Modal>\n\t);\n}\n","import type { BaseOption } from \"@knkcs/anker/atoms\";\nimport { BaseSelectField, InputField } from \"@knkcs/anker/forms\";\nimport type { TFunction } from \"i18next\";\nimport { useMemo } from \"react\";\nimport { type FieldValues, type Path, useWatch } from \"react-hook-form\";\nimport { useTranslation } from \"react-i18next\";\nimport { CHANGE_SET_NAME_MAX, type ContenthubClient } from \"../client/contenthub-client\";\nimport { useOpenChangeSets } from \"../common/use-open-change-sets\";\nimport { CONTENTHUB_UI_NS } from \"../i18n/resources\";\nimport { ONE_LINE } from \"./create-change-set-modal\";\n\n/** The Change Set option that opens a new one, distinct from any id. */\nexport const NEW_CHANGE_SET = \"@new\";\n\n/** The two fields of a Change Set choice, in a form that holds them. */\nexport interface ChangeSetChoiceValues {\n\tchangeSetId: string | null;\n\tchangeSetName: string;\n}\n\n/**\n * Why a choice can't be submitted, in the form's words: none made, or a new\n * Change Set whose name breaks the service's rule. `nameOptional` is for\n * StartEditing, which names a new Change Set after the Content itself.\n */\nexport function changeSetChoiceIssue(\n\tt: TFunction,\n\tv: ChangeSetChoiceValues,\n\tnameOptional = false,\n): { path: \"changeSetId\" | \"changeSetName\"; message: string } | null {\n\tif (!v.changeSetId)\n\t\treturn { path: \"changeSetId\", message: t(\"library.create.changeSetRequired\") };\n\tif (v.changeSetId !== NEW_CHANGE_SET) return null;\n\tconst name = v.changeSetName.trim();\n\tif (name === \"\") {\n\t\treturn nameOptional\n\t\t\t? null\n\t\t\t: { path: \"changeSetName\", message: t(\"changeSets.form.nameRequired\") };\n\t}\n\tif ([...name].length > CHANGE_SET_NAME_MAX) {\n\t\treturn {\n\t\t\tpath: \"changeSetName\",\n\t\t\tmessage: t(\"changeSets.form.tooLong\", { max: CHANGE_SET_NAME_MAX }),\n\t\t};\n\t}\n\tif (!ONE_LINE.test(name)) return { path: \"changeSetName\", message: t(\"changeSets.form.oneLine\") };\n\treturn null;\n}\n\n/**\n * Picks the Change Set an action writes in: an open one, or a new one named\n * here. Rendered inside the form that holds `changeSetId` and\n * `changeSetName`.\n */\nexport function ChangeSetChoiceFields<T extends FieldValues & ChangeSetChoiceValues>({\n\tclient,\n\topen,\n\thelperText,\n\tnameHelperText,\n\tnameOptional = false,\n}: {\n\tclient: ContenthubClient;\n\topen: boolean;\n\thelperText: string;\n\tnameHelperText?: string;\n\tnameOptional?: boolean;\n}) {\n\tconst { t } = useTranslation(CONTENTHUB_UI_NS);\n\tconst openChangeSets = useOpenChangeSets(client, open);\n\tconst options = useMemo<BaseOption[]>(\n\t\t() => [\n\t\t\t{ id: NEW_CHANGE_SET, label: t(\"library.create.newChangeSet\") },\n\t\t\t...(openChangeSets.data?.changeSets ?? []).map((cs) => ({ id: cs.id, label: cs.name })),\n\t\t],\n\t\t[openChangeSets.data, t],\n\t);\n\tconst changeSetId = useWatch({ name: \"changeSetId\" as Path<T> });\n\treturn (\n\t\t<>\n\t\t\t<BaseSelectField<T>\n\t\t\t\tname={\"changeSetId\" as Path<T>}\n\t\t\t\tlabel={t(\"library.create.changeSet\")}\n\t\t\t\thelperText={helperText}\n\t\t\t\toptions={options}\n\t\t\t\tisClearable={false}\n\t\t\t\trequired\n\t\t\t/>\n\t\t\t{changeSetId === NEW_CHANGE_SET ? (\n\t\t\t\t<InputField<T>\n\t\t\t\t\tname={\"changeSetName\" as Path<T>}\n\t\t\t\t\tlabel={t(\"library.create.changeSetName\")}\n\t\t\t\t\thelperText={nameHelperText ?? t(\"changeSets.form.nameHelp\")}\n\t\t\t\t\trequired={!nameOptional}\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t</>\n\t);\n}\n","import { zodResolver } from \"@hookform/resolvers/zod\";\nimport type { BaseOption, LookupResolve, LookupSearch } from \"@knkcs/anker/atoms\";\nimport { Button } from \"@knkcs/anker/atoms\";\nimport { Modal } from \"@knkcs/anker/components\";\nimport { BaseSelectField, InputField, LookupSelectField } from \"@knkcs/anker/forms\";\nimport { Alert, HStack, Stack, Text } from \"@knkcs/anker/primitives\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { FormProvider, useForm, useWatch } from \"react-hook-form\";\nimport { useTranslation } from \"react-i18next\";\nimport { z } from \"zod\";\nimport {\n\tCHANGE_SET_NAME_MAX,\n\tChangeSetClosedError,\n\ttype ContenthubClient,\n\tContentRefusedError,\n\tInvalidInputError,\n} from \"../client/contenthub-client\";\nimport { contenthubKeys } from \"../common/query-keys\";\nimport { useOpenChangeSets } from \"../common/use-open-change-sets\";\nimport { CONTENTHUB_UI_NS } from \"../i18n/resources\";\nimport type { BlueprintReleaseInfo, BlueprintSource, Content } from \"../types\";\nimport { NEW_CHANGE_SET } from \"./change-set-choice\";\nimport { ONE_LINE } from \"./create-change-set-modal\";\n\nconst FORM_ID = \"contenthub-create-content\";\n\ntype CreateValues = {\n\tblueprintId: string | null;\n\treleaseId: string | null;\n\tchangeSetId: string | null;\n\tchangeSetName: string;\n};\n\nexport interface CreateContentModalProps {\n\topen: boolean;\n\tonClose: () => void;\n\tclient: ContenthubClient;\n\tblueprintSource: BlueprintSource;\n\t/** The Change Set to offer first, such as the one the Library is viewing. */\n\tinitialChangeSetId?: string;\n\t/** The Content was created: open it in the Branch editor. */\n\tonCreated: (content: Content) => void;\n}\n\n/** Whether Content can pin it: contenthub refuses it for no reason. */\nconst usable = (r: BlueprintReleaseInfo) => !r.refusals?.length;\n\n/** One refusal reason as the dialog shows it: its code, and where. */\nconst reasonText = (r: { code: string; path: string }) =>\n\tr.path ? `${r.code} (${r.path})` : r.code;\n\n/**\n * Creates a Content (spec #56, story 93): a Blueprint picked through\n * `blueprintSource` (contenthub's catalog unless a host overrides it, #238),\n * the Release of it to pin (the newest Content can pin, by default), and\n * the Change Set to create it in, an open one or a new one named here. A\n * Release contenthub refuses is offered disabled, with its reasons, so a\n * Blueprint author sees why it can't be used. The Content starts empty; its Branch editor is where it is\n * written.\n *\n * A new Change Set is opened before the Content is created. If the Content\n * is then refused, the form switches to that Change Set, so trying again\n * never opens a second one.\n *\n * Kept mounted and driven by `open`, with `lazyMount unmountOnExit` (anker's\n * Modal rule); every opening resets the form.\n */\nexport function CreateContentModal({\n\topen,\n\tonClose,\n\tclient,\n\tblueprintSource,\n\tinitialChangeSetId,\n\tonCreated,\n}: CreateContentModalProps) {\n\tconst { t } = useTranslation(CONTENTHUB_UI_NS);\n\tconst queryClient = useQueryClient();\n\tconst schema = useMemo(\n\t\t() =>\n\t\t\tz\n\t\t\t\t.object({\n\t\t\t\t\tblueprintId: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.nullable()\n\t\t\t\t\t\t.refine((v) => !!v, t(\"library.create.blueprintRequired\")),\n\t\t\t\t\treleaseId: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.nullable()\n\t\t\t\t\t\t.refine((v) => !!v, t(\"library.create.releaseRequired\")),\n\t\t\t\t\tchangeSetId: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.nullable()\n\t\t\t\t\t\t.refine((v) => !!v, t(\"library.create.changeSetRequired\")),\n\t\t\t\t\tchangeSetName: z.string().trim(),\n\t\t\t\t})\n\t\t\t\t.superRefine((v, ctx) => {\n\t\t\t\t\tif (v.changeSetId !== NEW_CHANGE_SET) return;\n\t\t\t\t\tconst issue = (message: string) =>\n\t\t\t\t\t\tctx.addIssue({ code: \"custom\", path: [\"changeSetName\"], message });\n\t\t\t\t\tif (v.changeSetName === \"\") issue(t(\"changeSets.form.nameRequired\"));\n\t\t\t\t\telse if ([...v.changeSetName].length > CHANGE_SET_NAME_MAX)\n\t\t\t\t\t\tissue(t(\"changeSets.form.tooLong\", { max: CHANGE_SET_NAME_MAX }));\n\t\t\t\t\telse if (!ONE_LINE.test(v.changeSetName)) issue(t(\"changeSets.form.oneLine\"));\n\t\t\t\t}),\n\t\t[t],\n\t);\n\tconst empty = useMemo<CreateValues>(\n\t\t() => ({\n\t\t\tblueprintId: null,\n\t\t\treleaseId: null,\n\t\t\tchangeSetId: initialChangeSetId || NEW_CHANGE_SET,\n\t\t\tchangeSetName: \"\",\n\t\t}),\n\t\t[initialChangeSetId],\n\t);\n\tconst methods = useForm<CreateValues>({ resolver: zodResolver(schema), defaultValues: empty });\n\tconst [refusal, setRefusal] = useState<string | null>(null);\n\tconst submitting = methods.formState.isSubmitting;\n\tconst blueprintId = useWatch({ control: methods.control, name: \"blueprintId\" });\n\tconst changeSetId = useWatch({ control: methods.control, name: \"changeSetId\" });\n\n\tuseEffect(() => {\n\t\tif (open) {\n\t\t\tmethods.reset(empty);\n\t\t\tsetRefusal(null);\n\t\t}\n\t}, [open, methods, empty]);\n\n\tconst openChangeSets = useOpenChangeSets(client, open);\n\tconst changeSetOptions = useMemo<BaseOption[]>(\n\t\t() => [\n\t\t\t{ id: NEW_CHANGE_SET, label: t(\"library.create.newChangeSet\") },\n\t\t\t...(openChangeSets.data?.changeSets ?? []).map((cs) => ({ id: cs.id, label: cs.name })),\n\t\t],\n\t\t[openChangeSets.data, t],\n\t);\n\n\tconst releases = useQuery({\n\t\tqueryKey: contenthubKeys.blueprintReleases(blueprintId ?? \"\"),\n\t\tqueryFn: () => blueprintSource.listReleases(blueprintId as string),\n\t\tenabled: open && !!blueprintId,\n\t});\n\tconst releaseOptions = useMemo<BaseOption[]>(\n\t\t() =>\n\t\t\t(releases.data ?? []).map((r) => ({\n\t\t\t\tid: r.id,\n\t\t\t\tlabel: usable(r) ? r.name : t(\"library.create.refusedRelease\", { name: r.name }),\n\t\t\t\tdata: { refused: !usable(r) },\n\t\t\t})),\n\t\t[releases.data, t],\n\t);\n\tconst refused = useMemo(() => (releases.data ?? []).filter((r) => !usable(r)), [releases.data]);\n\t// A Blueprint picked pins its newest usable Release unless the editor\n\t// chooses another. Another Blueprint picked drops the Release first: until\n\t// its own Releases arrive, the old one would otherwise still be submitted,\n\t// creating Content of the Blueprint picked before.\n\tconst releasesOf = useRef(blueprintId);\n\tuseEffect(() => {\n\t\tif (releasesOf.current !== blueprintId) {\n\t\t\treleasesOf.current = blueprintId;\n\t\t\tmethods.setValue(\"releaseId\", null);\n\t\t}\n\t\tconst current = methods.getValues(\"releaseId\");\n\t\tconst list = releases.data;\n\t\tif (!blueprintId) {\n\t\t\tif (current !== null) methods.setValue(\"releaseId\", null);\n\t\t\treturn;\n\t\t}\n\t\tif (list && !list.some((r) => r.id === current && usable(r))) {\n\t\t\tmethods.setValue(\"releaseId\", list.find(usable)?.id ?? null);\n\t\t}\n\t}, [blueprintId, releases.data, methods]);\n\tconst noRelease = !!blueprintId && releases.isSuccess && releases.data.length === 0;\n\tconst noUsableRelease =\n\t\t!!blueprintId && releases.isSuccess && releases.data.length > 0 && !releases.data.some(usable);\n\n\tconst searchBlueprints = useCallback<LookupSearch<BaseOption>>(\n\t\tasync ({ query, cursor, signal }) => {\n\t\t\tconst page = await blueprintSource.searchBlueprints({\n\t\t\t\tquery,\n\t\t\t\tpageToken: cursor ?? undefined,\n\t\t\t\tsignal,\n\t\t\t});\n\t\t\treturn {\n\t\t\t\titems: page.blueprints.map((b) => ({ id: b.id, label: b.name })),\n\t\t\t\tnextCursor: page.nextPageToken || null,\n\t\t\t};\n\t\t},\n\t\t[blueprintSource],\n\t);\n\tconst resolveBlueprints = useCallback<LookupResolve<BaseOption>>(\n\t\tasync ({ ids }) => {\n\t\t\tconst found = await blueprintSource.getBlueprints(ids);\n\t\t\treturn ids.map((id) => ({ id, label: found.find((b) => b.id === id)?.name ?? id }));\n\t\t},\n\t\t[blueprintSource],\n\t);\n\n\tconst submit = methods.handleSubmit(async (values) => {\n\t\tsetRefusal(null);\n\t\tlet target = values.changeSetId as string;\n\t\tlet wrote = false;\n\t\ttry {\n\t\t\tif (target === NEW_CHANGE_SET) {\n\t\t\t\tconst created = await client.createChangeSet({ name: values.changeSetName.trim() });\n\t\t\t\twrote = true;\n\t\t\t\ttarget = created.id;\n\t\t\t\tmethods.setValue(\"changeSetId\", target);\n\t\t\t}\n\t\t\tconst content = await client.createContent({\n\t\t\t\tchangeSetId: target,\n\t\t\t\tblueprintReleaseId: values.releaseId as string,\n\t\t\t});\n\t\t\tvoid queryClient.invalidateQueries({ queryKey: contenthubKeys.contents() });\n\t\t\tonCreated(content);\n\t\t} catch (err) {\n\t\t\tsetRefusal(refusalText(err));\n\t\t\tif (!wrote) return;\n\t\t}\n\t\t// A new Change Set, or a new Chain in one: the Change Set lists are stale\n\t\t// either way, even when the Content itself was then refused.\n\t\tvoid queryClient.invalidateQueries({ queryKey: contenthubKeys.changeSets() });\n\t});\n\n\tfunction refusalText(err: unknown): string {\n\t\tif (err instanceof ContentRefusedError) {\n\t\t\tconst reasons = err.reasons.map(reasonText).join(\", \");\n\t\t\treturn t(\"library.create.refused\", { reasons });\n\t\t}\n\t\tif (err instanceof ChangeSetClosedError) return t(\"library.create.changeSetClosed\");\n\t\tif (err instanceof InvalidInputError) return err.message;\n\t\treturn t(\"library.create.failed\");\n\t}\n\n\treturn (\n\t\t<Modal\n\t\t\topen={open}\n\t\t\tonClose={onClose}\n\t\t\tlazyMount\n\t\t\tunmountOnExit\n\t\t\tsize=\"md\"\n\t\t\theader={t(\"library.create.title\")}\n\t\t\tfooter={\n\t\t\t\t<HStack gap=\"2\">\n\t\t\t\t\t<Button size=\"sm\" variant=\"ghost\" onClick={onClose}>\n\t\t\t\t\t\t{t(\"common.cancel\")}\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\tform={FORM_ID}\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\tvariant=\"solid\"\n\t\t\t\t\t\tloading={submitting}\n\t\t\t\t\t\tdisabled={noRelease || noUsableRelease || releases.isError}\n\t\t\t\t\t>\n\t\t\t\t\t\t{t(\"library.create.submit\")}\n\t\t\t\t\t</Button>\n\t\t\t\t</HStack>\n\t\t\t}\n\t\t>\n\t\t\t<FormProvider {...methods}>\n\t\t\t\t<form\n\t\t\t\t\tid={FORM_ID}\n\t\t\t\t\tonSubmit={(e) => {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tvoid submit();\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<Stack gap=\"4\">\n\t\t\t\t\t\t<LookupSelectField<CreateValues>\n\t\t\t\t\t\t\tname=\"blueprintId\"\n\t\t\t\t\t\t\tlabel={t(\"library.create.blueprint\")}\n\t\t\t\t\t\t\thelperText={t(\"library.create.blueprintHelp\")}\n\t\t\t\t\t\t\tsearch={searchBlueprints}\n\t\t\t\t\t\t\tresolve={resolveBlueprints}\n\t\t\t\t\t\t\tplaceholder={t(\"library.create.pickBlueprint\")}\n\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{blueprintId ? (\n\t\t\t\t\t\t\t<BaseSelectField<CreateValues>\n\t\t\t\t\t\t\t\tname=\"releaseId\"\n\t\t\t\t\t\t\t\tlabel={t(\"library.create.release\")}\n\t\t\t\t\t\t\t\thelperText={t(\"library.create.releaseHelp\")}\n\t\t\t\t\t\t\t\toptions={releaseOptions}\n\t\t\t\t\t\t\t\tisClearable={false}\n\t\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\t\tselectProps={{ isOptionDisabled: (o) => o.data?.refused === true }}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t{noRelease ? <Alert status=\"warning\" title={t(\"library.create.noRelease\")} /> : null}\n\t\t\t\t\t\t{noUsableRelease ? (\n\t\t\t\t\t\t\t<Alert status=\"warning\" title={t(\"library.create.noUsableRelease\")} />\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t{releases.isError ? (\n\t\t\t\t\t\t\t<Alert status=\"error\" title={t(\"library.create.releasesFailed\")} />\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t{refused.length > 0 ? (\n\t\t\t\t\t\t\t<Alert status=\"info\" title={t(\"library.create.refusedReleases\")}>\n\t\t\t\t\t\t\t\t<Stack gap=\"1\">\n\t\t\t\t\t\t\t\t\t{refused.map((r) => (\n\t\t\t\t\t\t\t\t\t\t<Text key={r.id} textStyle=\"sm\">\n\t\t\t\t\t\t\t\t\t\t\t{t(\"library.create.refusedReleaseReasons\", {\n\t\t\t\t\t\t\t\t\t\t\t\tname: r.name,\n\t\t\t\t\t\t\t\t\t\t\t\treasons: (r.refusals ?? []).map(reasonText).join(\", \"),\n\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</Stack>\n\t\t\t\t\t\t\t</Alert>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t<BaseSelectField<CreateValues>\n\t\t\t\t\t\t\tname=\"changeSetId\"\n\t\t\t\t\t\t\tlabel={t(\"library.create.changeSet\")}\n\t\t\t\t\t\t\thelperText={t(\"library.create.changeSetHelp\")}\n\t\t\t\t\t\t\toptions={changeSetOptions}\n\t\t\t\t\t\t\tisClearable={false}\n\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{changeSetId === NEW_CHANGE_SET ? (\n\t\t\t\t\t\t\t<InputField<CreateValues>\n\t\t\t\t\t\t\t\tname=\"changeSetName\"\n\t\t\t\t\t\t\t\tlabel={t(\"library.create.changeSetName\")}\n\t\t\t\t\t\t\t\thelperText={t(\"changeSets.form.nameHelp\")}\n\t\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t{refusal ? <Alert status=\"error\" title={refusal} /> : null}\n\t\t\t\t\t</Stack>\n\t\t\t\t</form>\n\t\t\t</FormProvider>\n\t\t</Modal>\n\t);\n}\n","import { Button, EmptyState } from \"@knkcs/anker/atoms\";\nimport { DataTable, DateCell, Toolbar, TruncatedTextCell } from \"@knkcs/anker/components\";\nimport { useHostIdentity } from \"@knkcs/anker/host\";\nimport { Alert, HStack, NativeSelect, Spinner, Stack, Text } from \"@knkcs/anker/primitives\";\nimport { IndexPageTemplate, SubNavLayout } from \"@knkcs/anker/templates\";\nimport { keepPreviousData, useInfiniteQuery, useQuery } from \"@tanstack/react-query\";\nimport type { ColumnDef } from \"@tanstack/react-table\";\nimport { FileText, Plus } from \"lucide-react\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useSearchParams } from \"react-router\";\nimport {\n\tCONTENT_SEARCH_MAX,\n\ttype ContenthubClient,\n\tInvalidInputError,\n} from \"../client/contenthub-client\";\nimport { useBlueprintSource } from \"../common/blueprint-source\";\nimport { contenthubKeys } from \"../common/query-keys\";\nimport { useOpenChangeSets } from \"../common/use-open-change-sets\";\nimport { CONTENTHUB_UI_NS } from \"../i18n/resources\";\nimport type { BlueprintInfo, BlueprintSource, Content, ContentView } from \"../types\";\nimport type { OpenBranchTarget } from \"./change-set-contents-tab\";\nimport { CollectionTree, collectionPath } from \"./collection-tree\";\nimport { CreateContentModal } from \"./create-content-modal\";\n\n// DataTable wants T extends Record<string, unknown>.\ntype ContentRow = Content & Record<string, unknown>;\n\ntype ViewKind = ContentView[\"kind\"];\nconst VIEWS: ViewKind[] = [\"main\", \"in_force\", \"change_set\"];\n/** Content per page; \"Show more\" asks for the next. */\nconst PAGE_SIZE = 50;\n/** How long typing pauses before the search is sent. */\nconst SEARCH_DEBOUNCE_MS = 300;\n/** Blueprint pages the filter reads for its options; a workspace has few content Blueprints. */\nconst BLUEPRINT_OPTION_PAGES = 5;\n/** The assignee filter's value for whoever is looking. */\nconst ME = \"@me\";\n/** The URL parameter that deep-links a Collection. */\nexport const COLLECTION_PARAM = \"collection\";\n\n/** What the Content page is opened on: a Content, and the Change Set a row read it in. */\nexport interface OpenContentTarget {\n\tcontentId: string;\n\t/**\n\t * The Change Set the row was read in: the Change Set view, or a search on\n\t * Main that found a Branch head. Absent for a row read on Main or at a\n\t * Release. Content born in an open Change Set exists only there.\n\t */\n\tchangeSetId?: string;\n}\n\nexport interface ContentLibraryProps {\n\tclient: ContenthubClient;\n\t/**\n\t * Overrides where Blueprint names, the Blueprint filter and New Content\n\t * read Blueprints from. Absent, they read contenthub's own\n\t * `BlueprintCatalogService` through `client` (#238), which every host\n\t * gets; only tests pass one.\n\t */\n\tblueprintSource?: BlueprintSource;\n\t/** Host navigation to a Content's page: a row's click. */\n\tonOpenContent: (target: OpenContentTarget) => void;\n\t/** Host navigation to the Branch editor: a Content just created. */\n\tonOpenBranch: (target: OpenBranchTarget) => void;\n}\n\n/**\n * A row's name until Blueprints say which field names a Content: its first\n * two short text values (for a paragraph, its number and heading).\n */\nexport function contentLabel(data: Record<string, unknown>): string {\n\treturn Object.values(data)\n\t\t.filter((v): v is string => typeof v === \"string\" && v.trim() !== \"\" && v.length <= 200)\n\t\t.slice(0, 2)\n\t\t.join(\" \");\n}\n\n/**\n * The Content Library (spec #56, stories 88, 89 and 93): the Collection tree\n * in `SubNavLayout.Nav` beside the table, narrowing together with the\n * toolbar's search, view, Blueprint and assignee filters, as mediahub's Folders narrow\n * its library (mediahub ADR 0008, contenthub ADR 0020). The selected\n * Collection is the URL's `?collection=`, so a Collection can be linked.\n *\n * A Collection lists the Content filed in it directly, not in Collections\n * under it: the tree is navigated like folders, and a Content may be filed in\n * several, so a parent's list would repeat its children's.\n *\n * `SubNavLayout` on an index page awaits anker's blessing (anker#248); it\n * follows mediahub's AssetLibrary, the one prior use.\n */\nexport function ContentLibrary({\n\tclient,\n\tblueprintSource,\n\tonOpenContent,\n\tonOpenBranch,\n}: ContentLibraryProps) {\n\tconst { t } = useTranslation(CONTENTHUB_UI_NS);\n\tconst source = useBlueprintSource(client, blueprintSource);\n\tconst [params, setParams] = useSearchParams();\n\tconst collectionId = params.get(COLLECTION_PARAM) ?? \"\";\n\tconst [viewKind, setViewKind] = useState<ViewKind>(\"main\");\n\tconst [viewChangeSetId, setViewChangeSetId] = useState(\"\");\n\t// What is typed, and what is searched for once typing pauses.\n\tconst [searchText, setSearchText] = useState(\"\");\n\tconst [search, setSearch] = useState(\"\");\n\tconst [blueprintId, setBlueprintId] = useState(\"\");\n\tconst [assignee, setAssignee] = useState(\"\");\n\tconst [creating, setCreating] = useState(false);\n\tconst { userId, members } = useHostIdentity();\n\n\tuseEffect(() => {\n\t\tconst timer = setTimeout(() => setSearch(searchText), SEARCH_DEBOUNCE_MS);\n\t\treturn () => clearTimeout(timer);\n\t}, [searchText]);\n\n\tconst selectCollection = useCallback(\n\t\t(id: string) =>\n\t\t\tsetParams((prev) => {\n\t\t\t\tconst next = new URLSearchParams(prev);\n\t\t\t\tif (id) next.set(COLLECTION_PARAM, id);\n\t\t\t\telse next.delete(COLLECTION_PARAM);\n\t\t\t\treturn next;\n\t\t\t}),\n\t\t[setParams],\n\t);\n\n\tconst collections = useQuery({\n\t\tqueryKey: contenthubKeys.collections(),\n\t\tqueryFn: () => client.listCollections(),\n\t});\n\tconst openChangeSets = useOpenChangeSets(client);\n\tconst changeSetName = useCallback(\n\t\t(id: string) => openChangeSets.data?.changeSets.find((cs) => cs.id === id)?.name ?? id,\n\t\t[openChangeSets.data],\n\t);\n\n\t// The Change Set view reads the one picked, or the newest open one.\n\tconst changeSetForView = viewChangeSetId || openChangeSets.data?.changeSets[0]?.id || \"\";\n\tconst view = useMemo<ContentView | undefined>(() => {\n\t\tif (viewKind !== \"change_set\") return { kind: viewKind };\n\t\treturn changeSetForView ? { kind: \"change_set\", changeSetId: changeSetForView } : undefined;\n\t}, [viewKind, changeSetForView]);\n\n\tconst filter = useMemo(\n\t\t() => ({\n\t\t\tview,\n\t\t\tcollectionId: collectionId || undefined,\n\t\t\t// Editor Search never covers Releases (ADR 0019).\n\t\t\tsearch: viewKind === \"in_force\" ? undefined : search.trim() || undefined,\n\t\t\tblueprintIds: blueprintId ? [blueprintId] : undefined,\n\t\t\tassigneeId: assignee === ME ? userId : assignee || undefined,\n\t\t}),\n\t\t[view, collectionId, viewKind, search, blueprintId, assignee, userId],\n\t);\n\tconst query = useInfiniteQuery({\n\t\tqueryKey: contenthubKeys.contentList(filter),\n\t\tqueryFn: ({ pageParam }) =>\n\t\t\tclient.listContents({ ...filter, pageSize: PAGE_SIZE, pageToken: pageParam }),\n\t\tinitialPageParam: \"\",\n\t\tgetNextPageParam: (last) => last.nextPageToken || undefined,\n\t\t// The Change Set view waits for a Change Set to read.\n\t\tenabled: view !== undefined,\n\t\tplaceholderData: keepPreviousData,\n\t});\n\tconst contents = useMemo(\n\t\t() => query.data?.pages.flatMap((page) => page.contents) ?? [],\n\t\t[query.data],\n\t);\n\n\tconst blueprintIds = useMemo(\n\t\t() => [...new Set(contents.map((c) => c.blueprintId))].sort(),\n\t\t[contents],\n\t);\n\tconst blueprintNames = useQuery({\n\t\tqueryKey: contenthubKeys.blueprintNames(blueprintIds),\n\t\tqueryFn: () => source.getBlueprints(blueprintIds),\n\t\tenabled: blueprintIds.length > 0,\n\t\tplaceholderData: keepPreviousData,\n\t\tstaleTime: 60_000,\n\t});\n\tconst blueprintName = useCallback(\n\t\t(id: string) => blueprintNames.data?.find((b) => b.id === id)?.name ?? id,\n\t\t[blueprintNames.data],\n\t);\n\tconst blueprintOptions = useQuery({\n\t\tqueryKey: contenthubKeys.blueprintFilterOptions(),\n\t\tqueryFn: async () => {\n\t\t\tconst all: BlueprintInfo[] = [];\n\t\t\tlet pageToken = \"\";\n\t\t\tfor (let page = 0; page < BLUEPRINT_OPTION_PAGES; page++) {\n\t\t\t\tconst res = await source.searchBlueprints({ query: \"\", pageToken });\n\t\t\t\tall.push(...res.blueprints);\n\t\t\t\tpageToken = res.nextPageToken;\n\t\t\t\tif (pageToken === \"\") break;\n\t\t\t}\n\t\t\treturn all;\n\t\t},\n\t\tstaleTime: 60_000,\n\t});\n\t// The filter offers every Blueprint Content can be made from, and every\n\t// Blueprint named for listed Content since the Library opened: archived\n\t// or Release-less ones too, which the search leaves out (#241). Remembered,\n\t// so the one filtered by stays offered while nothing of it is listed; for\n\t// as long as the source is the same, so another workspace's never are.\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: a new source starts empty.\n\tconst namedBlueprints = useMemo(() => new Map<string, BlueprintInfo>(), [source]);\n\tconst blueprintFilterOptions = useMemo(() => {\n\t\tfor (const b of blueprintNames.data ?? []) namedBlueprints.set(b.id, b);\n\t\tconst byId = new Map(namedBlueprints);\n\t\tfor (const b of blueprintOptions.data ?? []) byId.set(b.id, b);\n\t\treturn [...byId.values()].sort((a, b) => a.name.localeCompare(b.name));\n\t}, [namedBlueprints, blueprintOptions.data, blueprintNames.data]);\n\n\tconst columns = useMemo<ColumnDef<ContentRow, unknown>[]>(\n\t\t() => [\n\t\t\t{\n\t\t\t\tid: \"content\",\n\t\t\t\theader: t(\"library.columns.content\"),\n\t\t\t\tcell: ({ row }) => {\n\t\t\t\t\tconst label = contentLabel(row.original.data);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<TruncatedTextCell\n\t\t\t\t\t\t\tvalue={label || row.original.id}\n\t\t\t\t\t\t\tsubText={label ? row.original.id : undefined}\n\t\t\t\t\t\t/>\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"blueprint\",\n\t\t\t\theader: t(\"library.columns.blueprint\"),\n\t\t\t\tcell: ({ row }) => <TruncatedTextCell value={blueprintName(row.original.blueprintId)} />,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"readOn\",\n\t\t\t\theader: t(\"library.columns.readOn\"),\n\t\t\t\tcell: ({ row }) => {\n\t\t\t\t\tconst c = row.original;\n\t\t\t\t\tconst where = c.changeSetId\n\t\t\t\t\t\t? changeSetName(c.changeSetId)\n\t\t\t\t\t\t: c.releaseId\n\t\t\t\t\t\t\t? t(\"library.readOn.release\")\n\t\t\t\t\t\t\t: t(\"library.readOn.main\");\n\t\t\t\t\treturn <TruncatedTextCell value={where} />;\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"revised\",\n\t\t\t\theader: t(\"library.columns.revised\"),\n\t\t\t\tcell: ({ row }) => <DateCell value={row.original.revisionCreateTime} />,\n\t\t\t},\n\t\t],\n\t\t[t, blueprintName, changeSetName],\n\t);\n\n\tconst createButton = (\n\t\t<Button size=\"sm\" variant=\"solid\" onClick={() => setCreating(true)}>\n\t\t\t<Plus size={16} />\n\t\t\t{t(\"library.create.button\")}\n\t\t</Button>\n\t);\n\n\tconst loadError =\n\t\tquery.error instanceof InvalidInputError ? query.error.message : t(\"library.loadError\");\n\tconst heading = collectionId\n\t\t? collectionPath(collectionId, collections.data ?? [])\n\t\t\t\t.map((c) => c.name)\n\t\t\t\t.join(\" / \") || collectionId\n\t\t: t(\"library.allContent\");\n\n\treturn (\n\t\t<IndexPageTemplate\n\t\t\ttitle={t(\"library.title\")}\n\t\t\tbreadcrumbs={[{ label: t(\"library.title\") }]}\n\t\t\tactions={createButton}\n\t\t\ttoolbar={\n\t\t\t\t<Toolbar>\n\t\t\t\t\t{viewKind === \"in_force\" ? (\n\t\t\t\t\t\t<Text fontSize=\"sm\" color=\"muted\">\n\t\t\t\t\t\t\t{t(\"library.filter.searchInForce\")}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Toolbar.Search\n\t\t\t\t\t\t\tplaceholder={t(\"library.filter.searchPlaceholder\")}\n\t\t\t\t\t\t\tvalue={searchText}\n\t\t\t\t\t\t\t// Editor Search's own limit, kept here so the service never refuses it.\n\t\t\t\t\t\t\tonChange={(next) => setSearchText([...next].slice(0, CONTENT_SEARCH_MAX).join(\"\"))}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t<Toolbar.Filters>\n\t\t\t\t\t\t<NativeSelect\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\taria-label={t(\"library.filter.view\")}\n\t\t\t\t\t\t\tvalue={viewKind}\n\t\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\t\tconst next = e.target.value as ViewKind;\n\t\t\t\t\t\t\t\t// The In Force view has no search: drop the text rather\n\t\t\t\t\t\t\t\t// than keep a narrowing that no longer applies.\n\t\t\t\t\t\t\t\tif (next === \"in_force\") {\n\t\t\t\t\t\t\t\t\tsetSearchText(\"\");\n\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsetViewKind(next);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{VIEWS.map((v) => (\n\t\t\t\t\t\t\t\t<option key={v} value={v}>\n\t\t\t\t\t\t\t\t\t{t(`library.view.${v}`)}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</NativeSelect>\n\t\t\t\t\t\t{viewKind === \"change_set\" ? (\n\t\t\t\t\t\t\t<NativeSelect\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\taria-label={t(\"library.filter.changeSet\")}\n\t\t\t\t\t\t\t\tvalue={changeSetForView}\n\t\t\t\t\t\t\t\tonChange={(e) => setViewChangeSetId(e.target.value)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{openChangeSets.data?.changeSets.length ? null : (\n\t\t\t\t\t\t\t\t\t<option value=\"\">{t(\"library.filter.noOpenChangeSet\")}</option>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{(openChangeSets.data?.changeSets ?? []).map((cs) => (\n\t\t\t\t\t\t\t\t\t<option key={cs.id} value={cs.id}>\n\t\t\t\t\t\t\t\t\t\t{cs.name}\n\t\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</NativeSelect>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t<NativeSelect\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\taria-label={t(\"library.filter.blueprint\")}\n\t\t\t\t\t\t\tvalue={blueprintId}\n\t\t\t\t\t\t\tonChange={(e) => setBlueprintId(e.target.value)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<option value=\"\">{t(\"library.filter.anyBlueprint\")}</option>\n\t\t\t\t\t\t\t{blueprintFilterOptions.map((b) => (\n\t\t\t\t\t\t\t\t<option key={b.id} value={b.id}>\n\t\t\t\t\t\t\t\t\t{b.name}\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</NativeSelect>\n\t\t\t\t\t\t<NativeSelect\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\taria-label={t(\"library.filter.assignee\")}\n\t\t\t\t\t\t\tvalue={assignee}\n\t\t\t\t\t\t\tonChange={(e) => setAssignee(e.target.value)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<option value=\"\">{t(\"library.filter.anyone\")}</option>\n\t\t\t\t\t\t\t<option value={ME}>{t(\"library.filter.me\")}</option>\n\t\t\t\t\t\t\t{members\n\t\t\t\t\t\t\t\t.list()\n\t\t\t\t\t\t\t\t.filter((m) => m.userId !== userId)\n\t\t\t\t\t\t\t\t.map((m) => (\n\t\t\t\t\t\t\t\t\t<option key={m.userId} value={m.userId}>\n\t\t\t\t\t\t\t\t\t\t{m.displayName}\n\t\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</NativeSelect>\n\t\t\t\t\t</Toolbar.Filters>\n\t\t\t\t\t<Toolbar.Right>\n\t\t\t\t\t\t{query.isError ? null : (\n\t\t\t\t\t\t\t<Toolbar.Count>\n\t\t\t\t\t\t\t\t{t(\"library.count\", { count: contents.length })}\n\t\t\t\t\t\t\t\t{query.hasNextPage ? \"+\" : \"\"}\n\t\t\t\t\t\t\t</Toolbar.Count>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Toolbar.Right>\n\t\t\t\t</Toolbar>\n\t\t\t}\n\t\t>\n\t\t\t<SubNavLayout storageKey=\"contenthub-library-subnav\">\n\t\t\t\t<SubNavLayout.Nav aria-label={t(\"library.collections\")}>\n\t\t\t\t\t{collections.isSuccess ? (\n\t\t\t\t\t\t<CollectionTree\n\t\t\t\t\t\t\tcollections={collections.data}\n\t\t\t\t\t\t\tactiveId={collectionId}\n\t\t\t\t\t\t\tonSelect={selectCollection}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : collections.isError ? (\n\t\t\t\t\t\t<Text fontSize=\"sm\" color=\"muted\" px=\"3\" py=\"2\">\n\t\t\t\t\t\t\t{t(\"library.collectionsError\")}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<HStack justify=\"center\" py=\"4\">\n\t\t\t\t\t\t\t<Spinner size=\"sm\" />\n\t\t\t\t\t\t</HStack>\n\t\t\t\t\t)}\n\t\t\t\t</SubNavLayout.Nav>\n\t\t\t\t<SubNavLayout.Detail>\n\t\t\t\t\t<SubNavLayout.Toolbar>\n\t\t\t\t\t\t<Text fontSize=\"sm\" fontWeight=\"medium\">\n\t\t\t\t\t\t\t{heading}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</SubNavLayout.Toolbar>\n\t\t\t\t\t<Stack gap=\"3\">\n\t\t\t\t\t\t{query.isError ? <Alert status=\"error\" title={loadError} mx=\"8\" mt=\"4\" /> : null}\n\t\t\t\t\t\t<DataTable\n\t\t\t\t\t\t\tcolumns={columns}\n\t\t\t\t\t\t\tdata={contents as ContentRow[]}\n\t\t\t\t\t\t\tloading={query.isLoading}\n\t\t\t\t\t\t\tgetRowId={(row) => `${row.id}/${row.branchId}/${row.releaseId}`}\n\t\t\t\t\t\t\tonRowClick={(row) =>\n\t\t\t\t\t\t\t\tonOpenContent({ contentId: row.id, changeSetId: row.changeSetId || undefined })\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tvariant=\"hoverable\"\n\t\t\t\t\t\t\temptyState={\n\t\t\t\t\t\t\t\t<EmptyState\n\t\t\t\t\t\t\t\t\ticon={<FileText size={32} />}\n\t\t\t\t\t\t\t\t\theader={t(\"library.empty\")}\n\t\t\t\t\t\t\t\t\tdescription={t(\"library.emptyHint\")}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{query.hasNextPage ? (\n\t\t\t\t\t\t\t<HStack justify=\"center\" pb=\"4\">\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\t\tloading={query.isFetchingNextPage}\n\t\t\t\t\t\t\t\t\tonClick={() => void query.fetchNextPage()}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{t(\"library.more\")}\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</HStack>\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</Stack>\n\t\t\t\t</SubNavLayout.Detail>\n\t\t\t</SubNavLayout>\n\t\t\t{/* Rendered by the screen, never inside the reported header action:\n\t\t\t a host draws that action outside these providers (anker). */}\n\t\t\t<CreateContentModal\n\t\t\t\topen={creating}\n\t\t\t\tonClose={() => setCreating(false)}\n\t\t\t\tclient={client}\n\t\t\t\tblueprintSource={source}\n\t\t\t\tinitialChangeSetId={viewKind === \"change_set\" ? changeSetForView : undefined}\n\t\t\t\tonCreated={(content) => {\n\t\t\t\t\tsetCreating(false);\n\t\t\t\t\tonOpenBranch({\n\t\t\t\t\t\tchangeSetId: content.changeSetId,\n\t\t\t\t\t\tcontentId: content.id,\n\t\t\t\t\t\tbranchId: content.branchId,\n\t\t\t\t\t});\n\t\t\t\t}}\n\t\t\t/>\n\t\t</IndexPageTemplate>\n\t);\n}\n\nContentLibrary.displayName = \"ContentLibrary\";\n"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}