@redocly/config-rules-builder 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-rules-builder.js","names":["Spacer","_Fragment","_Fragment","_Fragment","Wrapper","_Fragment","useEffect","useId","useMemo","useRef","useState","styled","css","Oas3_1Types","YamlParseError","createConfig","getAstNodeByPointer","lintFromString","safeLoad","dump","load","Fragment","jsx","jsxs","defaultKeymap","history","historyKeymap","yaml","defaultHighlightStyle","syntaxHighlighting","EditorState","RangeSet","StateEffect","StateField","Decoration","EditorView","GutterMarker","gutter","hoverTooltip","keymap","lineNumbers","FONT_FAMILY","MONO_FONT_FAMILY","SECTION_TONES","SUCCESS_COLORS","SEVERITY_COLORS","DEFAULT_SPEC","pruneRule","rule","cleanSubject","pruneWhere","where","entries","entry","subject","property","ruleId","name","index","COLLECTOR_PLUGIN_ID","SHADOW_RULE_PREFIX","queue","enqueue","task","run","evaluateRules","specText","rules","fileName","indexed","named","all","lint","message","errorMessage","isSpecLevelError","result","item","single","matchesByPointer","outcome","collect","_value","options","context","ctx","ruleIndex","pointer","id","match","propertyPointer","configRules","ruleIdToIndex","config","problems","problem","location","error","createPointerRangeResolver","ast","lineStarts","reportOnKey","node","from","to","offset","lo","hi","mid","line","makeId","toNamedRules","createRuleEntry","createDefaultRule","existingNames","serializeRules","namedRule","ProblemsPanel","ruleErrors","specError","isRunning","onSelect","errorCount","p","warnCount","PanelContainer","PanelTitle","CountPill","RunningNote","Scroll","ErrorRow","EmptyRow","s","ProblemRow","Dot","Content","TopRow","SevBadge","RuleId","Spacer$1","Position","Message","Suggestions","suggestion","i","Suggestion","Modal","title","subtitle","onClose","children","footer","width","onKey","e","Overlay","Dialog","HeadRow","HeadTitle","HeadSubtitle","CloseButton","BodyArea","Foot","InlineSelect","InlineInput","MonoInput","ToolbarButton","TriggerButton","SecondaryButton","PrimaryButton","Keyword","SectionLabel","SectionHint","SectionWrapper","SectionHead","SectionTitleRow","SectionLine","Section","tone","label","hint","colors","SentenceRow","Chevron","open","wavySvg","color","errorSquiggle","SquiggleWrap","FieldSquiggle","style","ConfigPreview","host","setOpen","copied","setCopied","copy","text","download","url","link","FileIcon","DownloadIcon","Snippet","isPlainObject","value","looksLikeRule","normalizeAssertions","raw","normalizeWhere","normalizeImportedRule","parseImportedRules","parsed","root","rulesMap","key","skipped","Segmented","onChange","ariaLabel","PillGroup","option","PillButton","ImportPanel","onImport","mode","setMode","setText","setError","notice","setNotice","dragging","setDragging","fileInputRef","close","runImport","source","importFile","file","reader","ImportIcon","ModeRow","PasteArea","Drop","event","DropIcon","DropTitle","DropHint","ErrorText","NoticeText","size","CASING_STYLES","DOCUMENTED_NODE_TYPES","NODE_TYPES","ASSERTION_META","ASSERTION_META_BY_KEY","m","MESSAGE_PLACEHOLDERS","NAME_PATTERN","hasSubjectProperty","isValidRegex","pattern","lastSlash","isSlashWrapped","validateSubject","prefix","errors","validateAssertions","assertions","hasProperty","meta","path","validateRule","ChipsContainer","Chip","ChipRemove","ChipInput","ChipListInput","values","placeholder","draft","setDraft","add","v","DEFAULT_VALUES","AssertionsEditor","keyword","errorPrefix","usedKeys","availableKeys","readOnlyKeys","toneColor","setValue","replaceKey","oldKey","newKey","next","remove","Rows","AssertCard","AssertKw","AssertionValueInput","RowHint","RemoveX","ReadOnlyKey","ReadOnlyValue","AddAssertion","assertionKey","SeverityPill","Wrapper$1","Trigger","Caret","Listbox","Option","Empty","Combobox","query","setQuery","activeIndex","setActiveIndex","wrapperRef","listRef","listboxId","filtered","q","o","onPointerDown","commit","onKeyDown","propertyAsText","textAsProperty","parts","part","SubjectEditor","lead","ariaPrefix","hasAdvanced","advancedOpen","setAdvancedOpen","propertyDraft","setPropertyDraft","lastPropertyRef","setTargetMode","restored","type","Accordion","AccordionHead","ActiveDot","AccordionBody","AdvRow","NEW_WHERE_ENTRY","RuleCard","selected","matchCount","isDuplicateName","isEvaluating","onToggle","onRemove","messageRef","patch","partial","whereEntries","whereKeysRef","patchWhere","whereEntry","removeWhere","_","insertPlaceholder","input","at","nameError","severity","Card","Header","ChevronButton","NameWrap","NamePrefix","NameInput","StaticName","Meta","Badge","RemoveButton","Body","WhereBlock","WhereTop","WhereKw","Descends","WhereX","AddButton","MessageInput","ChipRow","PlaceholderChip","suggest","RuleList","selectedId","matchCountById","onChangeEntry","onAdd","importProps","configPreviewProps","names","Column","Head","Title","Count","Spacer","ScrollArea","OverviewRuler","markers","totalLines","onMarkerClick","Strip","marker","Marker","EMPTY_HIGHLIGHTS","Panel","Toolbar","FileName","UploadError","MatchPill","MatchPillPosition","NoMatchPill","NoMatchDot","NoMatchBanner","EditorHost","setHighlights","setGutterMarkers","setFlash","SeverityGutterMarker","other","wrap","dot","gutterMarkerField","tr","effect","highlightField","field","flashDecoration","flashField","LINE_DECORATIONS","failsByLine","fails","doc","byLine","fail","MARKS","buildDecorations","highlights","ranges","push","list","mark","range","overlapsFailure","f","buildGutterMarkers","MAX_UPLOAD_BYTES","SpecPanel","spec","rulerMarkers","matchTargets","jump","showMatchStatus","onSpecChange","onResetSpec","uploadError","onUploadError","hostRef","viewRef","failsRef","onSpecChangeRef","flashTimerRef","matchCursor","setMatchCursor","reveal","view","pickSpec","picked","revealNextMatch","tooltipExtension","_view","pos","hit","dom","update","Root","Icon","Wrapper","LiveDot","TitleBlock","PanelsRow","SpecColumn","SpecArea","TextBlock","DEMO_RULE","EMPTY_RESULT","RulesBuilder","defaultSpec","defaultSpecFileName","initialRule","initialRuleName","onRuleChange","height","initialSpec","initialFileName","setEntries","setSelectedId","setSpec","setLint","setIsRunning","setJump","setUploadError","runIdRef","namedRules","runId","timer","ruleIds","selectedIndex","problemsWithLines","firstMatchRange","firstProblemRange","resolver","failByRange","target","propertyRanges","valueRange","anchor","keyRange","blockRange","a","b","selectedEntry","selectedMatchCount","hasSelectedRule","targetingSignature","assertionSignature","previousTargetingRef","previousAssertionRef","pendingReveal","setPendingReveal","targetingChanged","assertionsChanged","jumpToProblem","removeEntry","current","importRules","imported","importedEntries"],"sources":["../src/styles.ts","../src/default-spec.ts","../src/normalize.ts","../src/engine/evaluate.ts","../src/engine/offsets.ts","../src/state.ts","../src/yaml/serialize.ts","../src/components/ProblemsPanel.tsx","../src/components/Modal.tsx","../src/components/controls/primitives.tsx","../src/components/ConfigPreview.tsx","../src/yaml/parse.ts","../src/components/controls/Segmented.tsx","../src/components/ImportPanel.tsx","../src/constants.ts","../src/validation.ts","../src/components/controls/ChipListInput.tsx","../src/components/AssertionsEditor.tsx","../src/components/controls/SeverityPill.tsx","../src/components/controls/Combobox.tsx","../src/components/SubjectEditor.tsx","../src/components/RuleCard.tsx","../src/components/RuleList.tsx","../src/components/OverviewRuler.tsx","../src/components/SpecPanel.tsx","../src/components/RulesBuilder.tsx"],"sourcesContent":["import type { Severity } from './types';\n\nexport const FONT_FAMILY =\n \"var(--font-family-base, 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif)\";\n\nexport const MONO_FONT_FAMILY =\n \"var(--font-family-monospaced, 'SF Mono', 'JetBrains Mono', ui-monospace, Menlo, Monaco, 'Courier New', monospace)\";\n\nexport type SectionTone = 'subject' | 'where' | 'assert' | 'message' | 'suggest';\n\nexport const SECTION_TONES: Record<SectionTone, { fg: string; line: string; soft: string }> = {\n subject: { fg: '#2563eb', line: '#c9dafb', soft: '#eff4fe' },\n where: { fg: '#7c3aed', line: '#e2d6fa', soft: '#f4f0fe' },\n assert: { fg: '#b45309', line: '#f5ddb8', soft: '#fef3e2' },\n message: { fg: '#15803d', line: '#c9e8d3', soft: '#eaf7ef' },\n suggest: { fg: '#0e7490', line: '#bfe3ec', soft: '#e7f4f8' },\n};\n\nexport const SUCCESS_COLORS = {\n bg: 'var(--color-success-bg, #eaf7ef)',\n fg: 'var(--color-success-text, #15803d)',\n};\n\nexport const SEVERITY_COLORS: Record<Severity, { bg: string; fg: string }> = {\n error: { bg: 'var(--color-error-bg, #fef2f2)', fg: 'var(--color-error-base, #dc2626)' },\n warn: { bg: 'var(--color-warning-bg, #fef3e2)', fg: 'var(--color-warning-text, #b45309)' },\n off: { bg: 'var(--color-warm-grey-1, #fbfbfc)', fg: 'var(--text-color-secondary, #64748b)' },\n};\n","export const DEFAULT_SPEC: string = `openapi: 3.1.0\ninfo:\n title: Redocly Museum API\n description: Imaginary, but delightful Museum API for interacting with museum services and information. Built with love by Redocly.\n version: 1.2.1\n termsOfService: 'https://redocly.com/subscription-agreement/'\n contact:\n email: team@redocly.com\n url: \"https://redocly.com/docs/cli/\"\n license:\n name: MIT\n url: \"https://opensource.org/license/mit/\"\nservers:\n - url: \"https://redocly.com/_mock/docs/openapi/museum-api\"\npaths:\n /museum-hours:\n get:\n summary: Get museum hours\n description: Get upcoming museum operating hours.\n operationId: getMuseumHours\n tags:\n - Operations\n parameters:\n - $ref: \"#/components/parameters/StartDate\"\n - $ref: \"#/components/parameters/PaginationPage\"\n - $ref: \"#/components/parameters/PaginationLimit\"\n responses:\n \"200\":\n description: Success.\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/MuseumHours\"\n examples:\n default_example:\n $ref: \"#/components/examples/GetMuseumHoursResponseExample\"\n \"400\":\n $ref: '#/components/responses/BadRequest'\n \"404\":\n $ref: '#/components/responses/NotFound'\n /special-events:\n post:\n summary: Create special events\n description: Creates a new special event for the museum.\n operationId: createSpecialEvent\n tags:\n - Events\n requestBody:\n required: true\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/SpecialEvent\"\n examples:\n default_example:\n $ref: \"#/components/examples/CreateSpecialEventRequestExample\"\n responses:\n \"201\":\n description: Created.\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/SpecialEvent\"\n examples:\n default_example:\n $ref: \"#/components/examples/CreateSpecialEventResponseExample\"\n \"400\":\n $ref: '#/components/responses/BadRequest'\n \"404\":\n $ref: '#/components/responses/NotFound'\n get:\n summary: List special events\n description: Return a list of upcoming special events at the museum.\n operationId: listSpecialEvents\n tags:\n - Events\n parameters:\n - $ref: \"#/components/parameters/StartDate\"\n - $ref: \"#/components/parameters/EndDate\"\n - $ref: \"#/components/parameters/PaginationPage\"\n - $ref: \"#/components/parameters/PaginationLimit\"\n responses:\n \"200\":\n description: Success.\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/SpecialEventCollection\"\n examples:\n default_example:\n $ref: \"#/components/examples/ListSpecialEventsResponseExample\"\n \"400\":\n $ref: '#/components/responses/BadRequest'\n \"404\":\n $ref: '#/components/responses/NotFound'\n /special-events/{eventId}:\n get:\n summary: Get special event\n description: Get details about a special event.\n operationId: getSpecialEvent\n tags:\n - Events\n parameters:\n - $ref: \"#/components/parameters/EventId\"\n responses:\n \"200\":\n description: Success.\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/SpecialEvent\"\n examples:\n default_example:\n $ref: \"#/components/examples/GetSpecialEventResponseExample\"\n \"400\":\n $ref: '#/components/responses/BadRequest'\n \"404\":\n $ref: '#/components/responses/NotFound'\n patch:\n summary: Update special event\n description: Update the details of a special event.\n operationId: updateSpecialEvent\n tags:\n - Events\n parameters:\n - $ref: \"#/components/parameters/EventId\"\n requestBody:\n required: true\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/SpecialEventFields\"\n examples:\n default_example:\n $ref: \"#/components/examples/UpdateSpecialEventRequestExample\"\n responses:\n \"200\":\n description: Success.\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/SpecialEvent\"\n examples:\n default_example:\n $ref: \"#/components/examples/UpdateSpecialEventResponseExample\"\n \"400\":\n $ref: '#/components/responses/BadRequest'\n \"404\":\n $ref: '#/components/responses/NotFound'\n delete:\n summary: Delete special event\n description: Delete a special event from the collection. Allows museum to cancel planned events.\n operationId: deleteSpecialEvent\n tags:\n - Events\n parameters:\n - $ref: \"#/components/parameters/EventId\"\n responses:\n \"204\":\n description: Success - no content.\n \"400\":\n $ref: '#/components/responses/BadRequest'\n \"401\":\n $ref: '#/components/responses/Unauthorized'\n \"404\":\n $ref: '#/components/responses/NotFound'\n /tickets:\n post:\n summary: Buy museum tickets\n description: Purchase museum tickets for general entry or special events.\n operationId: buyMuseumTickets\n tags:\n - Tickets\n requestBody:\n required: true\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/BuyMuseumTickets\"\n examples:\n general_entry:\n $ref: \"#/components/examples/BuyGeneralTicketsRequestExample\"\n event_entry:\n $ref: \"#/components/examples/BuyEventTicketsRequestExample\"\n responses:\n \"201\":\n description: Created.\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/MuseumTicketsConfirmation\"\n examples:\n general_entry:\n $ref: \"#/components/examples/BuyGeneralTicketsResponseExample\"\n event_entry:\n $ref: \"#/components/examples/BuyEventTicketsResponseExample\"\n \"400\":\n $ref: '#/components/responses/BadRequest'\n \"404\":\n $ref: '#/components/responses/NotFound'\n /tickets/{ticketId}/qr:\n get:\n summary: Get ticket QR code\n description: Return an image of your ticket with scannable QR code. Used for event entry.\n operationId: getTicketCode\n tags:\n - Tickets\n parameters:\n - $ref: \"#/components/parameters/TicketId\"\n responses:\n \"200\":\n description: Scannable event ticket in image format.\n content:\n image/png:\n schema:\n $ref: \"#/components/schemas/TicketCodeImage\"\n \"400\":\n $ref: '#/components/responses/BadRequest'\n \"404\":\n $ref: '#/components/responses/NotFound'\nwebhooks:\n publishNewEvent:\n post:\n summary: New special event added\n description: Publish details of a new or updated event.\n operationId: publishNewEvent\n tags:\n - Events\n requestBody:\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/SpecialEvent\"\n examples:\n default_example:\n $ref: \"#/components/examples/GetSpecialEventResponseExample\"\n responses:\n \"202\":\n description: Data accepted.\n\ncomponents:\n schemas:\n TicketType:\n description: Type of ticket being purchased. Use \\`general\\` for regular museum entry and \\`event\\` for tickets to special events.\n type: string\n enum:\n - event\n - general\n example: event\n Date:\n type: string\n format: date\n example: '2023-10-29'\n Email:\n description: Email address for ticket purchaser.\n type: string\n format: email\n example: museum-lover@example.com\n BuyMuseumTickets:\n description: Data to purchase a ticket.\n type: object\n allOf:\n - type: object\n properties:\n email:\n $ref: \"#/components/schemas/Email\"\n - $ref: \"#/components/schemas/Ticket\"\n TicketMessage:\n description: Confirmation message after a ticket purchase.\n type: string\n example: Museum general entry ticket purchased\n TicketId:\n description: Unique identifier for museum ticket. Generated when purchased.\n type: string\n format: uuid\n example: a54a57ca-36f8-421b-a6b4-2e8f26858a4c\n TicketConfirmation:\n description: Unique confirmation code used to verify ticket purchase.\n type: string\n example: 'ticket-event-a98c8f-7eb12'\n Ticket:\n description: Ticket for museum entry, can be general admission or special event.\n type: object\n properties:\n ticketId:\n $ref: \"#/components/schemas/TicketId\"\n ticketDate:\n description: Date when this ticket can be used for museum entry.\n $ref: \"#/components/schemas/Date\"\n ticketType:\n $ref: \"#/components/schemas/TicketType\"\n eventId:\n description: Unique identifier for a special event. Required if purchasing tickets for the museum's special events.\n $ref: \"#/components/schemas/EventId\"\n required:\n - ticketType\n - ticketDate\n MuseumTicketsConfirmation:\n description: Details for a museum ticket after a successful purchase.\n allOf:\n - $ref: \"#/components/schemas/Ticket\"\n - type: object\n properties:\n message:\n $ref: \"#/components/schemas/TicketMessage\"\n confirmationCode:\n $ref: \"#/components/schemas/TicketConfirmation\"\n required:\n - message\n - confirmationCode\n TicketCodeImage:\n description: Image of a ticket with a QR code used for museum or event entry.\n type: string\n format: binary\n MuseumHours:\n description: List of museum operating hours for a date range.\n type: array\n items:\n $ref: \"#/components/schemas/MuseumDailyHours\"\n MuseumDailyHours:\n description: Daily operating hours for the museum.\n type: object\n properties:\n date:\n description: Date the operating hours apply to.\n $ref: \"#/components/schemas/Date\"\n example: '2024-12-31'\n timeOpen:\n type: string\n pattern: '^([01]\\\\d|2[0-3]):?([0-5]\\\\d)$'\n description: Time the museum opens on a specific date. Uses 24 hour time format (\\`HH:mm\\`).\n example: 09:00\n timeClose:\n description: Time the museum closes on a specific date. Uses 24 hour time format (\\`HH:mm\\`).\n type: string\n pattern: '^([01]\\\\d|2[0-3]):?([0-5]\\\\d)$'\n example: 18:00\n required:\n - date\n - timeOpen\n - timeClose\n EventId:\n description: Identifier for a special event.\n type: string\n format: uuid\n example: 3be6453c-03eb-4357-ae5a-984a0e574a54\n EventName:\n type: string\n description: Name of the special event.\n example: Pirate Coding Workshop\n EventLocation:\n type: string\n description: Location where the special event is held.\n example: Computer Room\n EventDescription:\n type: string\n description: Description of the special event.\n example: Captain Blackbeard shares his love of the C...language. And possibly Arrrrr (R lang).\n EventDates:\n type: array\n items:\n $ref: \"#/components/schemas/Date\"\n description: List of planned dates for the special event.\n EventPrice:\n description: Price of a ticket for the special event.\n type: number\n format: float\n example: 25\n SpecialEventFields:\n type: object\n properties:\n name:\n $ref: \"#/components/schemas/EventName\"\n location:\n $ref: \"#/components/schemas/EventLocation\"\n eventDescription:\n $ref: \"#/components/schemas/EventDescription\"\n dates:\n $ref: \"#/components/schemas/EventDates\"\n price:\n $ref: \"#/components/schemas/EventPrice\"\n SpecialEvent:\n type: object\n properties:\n eventId:\n $ref: \"#/components/schemas/EventId\"\n name:\n $ref: \"#/components/schemas/EventName\"\n location:\n $ref: \"#/components/schemas/EventLocation\"\n eventDescription:\n $ref: \"#/components/schemas/EventDescription\"\n dates:\n $ref: \"#/components/schemas/EventDates\"\n price:\n $ref: \"#/components/schemas/EventPrice\"\n required:\n - name\n - location\n - eventDescription\n - dates\n - price\n SpecialEventCollection:\n description: List of upcoming special events.\n type: array\n items:\n $ref: \"#/components/schemas/SpecialEvent\"\n Error:\n type: object\n properties:\n type:\n type: string\n example: object\n title:\n type: string\n example: Validation failed\n\n securitySchemes:\n MuseumPlaceholderAuth:\n type: http\n scheme: basic\n examples:\n BuyGeneralTicketsRequestExample:\n summary: General entry ticket\n value:\n ticketType: general\n ticketDate: '2023-09-07'\n email: todd@example.com\n BuyEventTicketsRequestExample:\n summary: Special event ticket\n value:\n ticketType: event\n eventId: dad4bce8-f5cb-4078-a211-995864315e39\n ticketDate: '2023-09-05'\n email: todd@example.com\n BuyGeneralTicketsResponseExample:\n summary: General entry ticket\n value:\n message: Museum general entry ticket purchased\n ticketId: 382c0820-0530-4f4b-99af-13811ad0f17a\n ticketType: general\n ticketDate: '2023-09-07'\n confirmationCode: ticket-general-e5e5c6-dce78\n BuyEventTicketsResponseExample:\n summary: Special event ticket\n value:\n message: Museum special event ticket purchased\n ticketId: b811f723-17b2-44f7-8952-24b03e43d8a9\n eventName: Mermaid Treasure Identification and Analysis\n ticketType: event\n ticketDate: '2023-09-05'\n confirmationCode: ticket-event-9c55eg-8v82a\n CreateSpecialEventRequestExample:\n summary: Create special event\n value:\n name: Mermaid Treasure Identification and Analysis\n location: Under the seaaa 🦀 🎶 🌊.\n eventDescription: Join us as we review and classify a rare collection of 20 thingamabobs, gadgets, gizmos, whoosits, and whatsits, kindly donated by Ariel.\n dates:\n - '2023-09-05'\n - '2023-09-08'\n price: 0\n CreateSpecialEventResponseExample:\n summary: Special event created\n value:\n eventId: dad4bce8-f5cb-4078-a211-995864315e39\n name: Mermaid Treasure Identification and Analysis\n location: Under the seaaa 🦀 🎶 🌊.\n eventDescription: Join us as we review and classify a rare collection of 20 thingamabobs, gadgets, gizmos, whoosits, and whatsits, kindly donated by Ariel.\n dates:\n - '2023-09-05'\n - '2023-09-08'\n price: 30\n GetSpecialEventResponseExample:\n summary: Get special event\n value:\n eventId: 6744a0da-4121-49cd-8479-f8cc20526495\n name: Time Traveler Tea Party\n location: Temporal Tearoom\n eventDescription: Sip tea with important historical figures.\n dates:\n - '2023-11-18'\n - '2023-11-25'\n - '2023-12-02'\n price: 60\n ListSpecialEventsResponseExample:\n summary: List of special events\n value:\n - eventId: f3e0e76e-e4a8-466e-ab9c-ae36c15b8e97\n name: Sasquatch Ballet\n location: Seattle... probably\n eventDescription: They're big, they're hairy, but they're also graceful. Come learn how the biggest feet can have the lightest touch.\n dates:\n - '2023-12-15'\n - '2023-12-22'\n price: 40\n - eventId: 2f14374a-9c65-4ee5-94b7-fba66d893483\n name: Solar Telescope Demonstration\n location: Far from the sun.\n eventDescription: Look at the sun without going blind!\n dates:\n - '2023-09-07'\n - '2023-09-14'\n price: 50\n - eventId: 6aaa61ba-b2aa-4868-b803-603dbbf7bfdb\n name: Cook like a Caveman\n location: Fire Pit on East side\n eventDescription: Learn to cook on an open flame.\n dates:\n - '2023-11-10'\n - '2023-11-17'\n - '2023-11-24'\n price: 5\n - eventId: 602b75e1-5696-4ab8-8c7a-f9e13580f910\n name: Underwater Basket Weaving\n location: Rec Center Pool next door.\n eventDescription: Learn to weave baskets underwater.\n dates:\n - '2023-09-12'\n - '2023-09-15'\n price: 15\n - eventId: dad4bce8-f5cb-4078-a211-995864315e39\n name: Mermaid Treasure Identification and Analysis\n location: Room Sea-12\n eventDescription: Join us as we review and classify a rare collection of 20 thingamabobs, gadgets, gizmos, whoosits, and whatsits — kindly donated by Ariel.\n dates:\n - '2023-09-05'\n - '2023-09-08'\n price: 30\n - eventId: 6744a0da-4121-49cd-8479-f8cc20526495\n name: Time Traveler Tea Party\n location: Temporal Tearoom\n eventDescription: Sip tea with important historical figures.\n dates:\n - '2023-11-18'\n - '2023-11-25'\n - '2023-12-02'\n price: 60\n - eventId: 3be6453c-03eb-4357-ae5a-984a0e574a54\n name: Pirate Coding Workshop\n location: Computer Room\n eventDescription: Captain Blackbeard shares his love of the C...language. And possibly Arrrrr (R lang).\n dates:\n - '2023-10-29'\n - '2023-10-30'\n - '2023-10-31'\n price: 45\n - eventId: 9d90d29a-2af5-4206-97d9-9ea9ceadcb78\n name: Llama Street Art Through the Ages\n location: Auditorium\n eventDescription: Llama street art?! Alpaca my bags -- let's go!\n dates:\n - '2023-10-29'\n - '2023-10-30'\n - '2023-10-31'\n price: 45\n - eventId: a3c7b2c4-b5fb-4ef7-9322-00a919864957\n name: The Great Parrot Debate\n location: Outdoor Amphitheatre\n eventDescription: See leading parrot minds discuss important geopolitical issues.\n dates:\n - '2023-11-03'\n - '2023-11-10'\n price: 35\n - eventId: b92d46b7-4c5d-422b-87a5-287767e26f29\n name: Eat a Bunch of Corn\n location: Cafeteria\n eventDescription: We accidentally bought too much corn. Please come eat it.\n dates:\n - '2023-11-10'\n - '2023-11-17'\n - '2023-11-24'\n price: 5\n UpdateSpecialEventRequestExample:\n summary: Update special event request\n value:\n location: On the beach.\n price: 15\n UpdateSpecialEventResponseExample:\n summary: Update special event\n value:\n eventId: dad4bce8-f5cb-4078-a211-995864315e39\n name: Mermaid Treasure Identification and Analysis\n location: On the beach.\n eventDescription: Join us as we review and classify a rare collection of 20 thingamabobs, gadgets, gizmos, whoosits, and whatsits, kindly donated by Ariel.\n dates:\n - '2023-09-05'\n - '2023-09-08'\n price: 15\n GetMuseumHoursResponseExample:\n summary: Get hours response\n value:\n - date: \"2023-09-11\"\n timeOpen: \"09:00\"\n timeClose: \"18:00\"\n - date: \"2023-09-12\"\n timeOpen: \"09:00\"\n timeClose: \"18:00\"\n - date: \"2023-09-13\"\n timeOpen: \"09:00\"\n timeClose: \"18:00\"\n - date: \"2023-09-14\"\n timeOpen: \"09:00\"\n timeClose: \"18:00\"\n - date: \"2023-09-15\"\n timeOpen: \"10:00\"\n timeClose: \"16:00\"\n - date: \"2023-09-18\"\n timeOpen: \"09:00\"\n timeClose: \"18:00\"\n - date: \"2023-09-19\"\n timeOpen: \"09:00\"\n timeClose: \"18:00\"\n - date: \"2023-09-20\"\n timeOpen: \"09:00\"\n timeClose: \"18:00\"\n - date: \"2023-09-21\"\n timeOpen: \"09:00\"\n timeClose: \"18:00\"\n - date: \"2023-09-22\"\n timeOpen: \"10:00\"\n timeClose: \"16:00\"\n parameters:\n PaginationPage:\n name: page\n in: query\n description: Page number to retrieve.\n schema:\n type: integer\n default: 1\n example: 2\n PaginationLimit:\n name: limit\n in: query\n description: Number of days per page.\n schema:\n type: integer\n default: 10\n maximum: 30\n example: 15\n EventId:\n name: eventId\n in: path\n description: Identifier for a special event.\n required: true\n schema:\n type: string\n format: uuid\n example: dad4bce8-f5cb-4078-a211-995864315e39\n StartDate:\n name: startDate\n in: query\n description: Starting date to retrieve future operating hours from. Defaults to today's date.\n schema:\n type: string\n format: date\n example: '2023-02-23'\n EndDate:\n name: endDate\n in: query\n description: End of a date range to retrieve special events for. Defaults to 7 days after \\`startDate\\`.\n schema:\n type: string\n format: date\n example: '2023-04-18'\n TicketId:\n name: ticketId\n in: path\n description: Identifier for a ticket to a museum event. Used to generate ticket image.\n required: true\n schema:\n type: string\n format: uuid\n example: a54a57ca-36f8-421b-a6b4-2e8f26858a4c\n responses:\n BadRequest:\n description: Bad request.\n content:\n application/problem+json:\n schema:\n $ref: '#/components/schemas/Error'\n NotFound:\n description: Not found.\n content:\n application/problem+json:\n schema:\n $ref: '#/components/schemas/Error'\n Unauthorized:\n description: Unauthorized.\n content:\n application/problem+json:\n schema:\n $ref: '#/components/schemas/Error'\ntags:\n - name: Operations\n description: Operational information about the museum.\n - name: Events\n description: Special events hosted by the museum.\n - name: Tickets\n description: Museum tickets for general entrance or special events.\nsecurity:\n - MuseumPlaceholderAuth: []\n`;\n","import type { ConfigurableRule, SubjectObject } from './types';\n\nexport function pruneRule(rule: ConfigurableRule) {\n return {\n subject: cleanSubject(rule.subject),\n assertions: rule.assertions ?? {},\n ...(pruneWhere(rule.where) ? { where: pruneWhere(rule.where) } : {}),\n ...(rule.message ? { message: rule.message } : {}),\n ...(rule.suggest?.length ? { suggest: rule.suggest } : {}),\n ...(rule.reference ? { reference: rule.reference } : {}),\n ...(rule.severity && rule.severity !== 'error' ? { severity: rule.severity } : {}),\n };\n}\n\nexport function pruneWhere(where: ConfigurableRule['where']) {\n if (!where?.length) return undefined;\n const entries = where\n .filter((entry) => entry.subject?.type)\n .map((entry) => ({\n subject: cleanSubject(entry.subject),\n assertions: entry.assertions ?? {},\n }));\n return entries.length ? entries : undefined;\n}\n\nexport function cleanSubject(subject: SubjectObject) {\n const property = Array.isArray(subject.property)\n ? subject.property.filter(Boolean)\n : subject.property;\n return {\n type: subject.type,\n ...(property && (!Array.isArray(property) || property.length)\n ? { property: Array.isArray(property) && property.length === 1 ? property[0] : property }\n : {}),\n ...(subject.filterInParentKeys?.length\n ? { filterInParentKeys: subject.filterInParentKeys }\n : {}),\n ...(subject.filterOutParentKeys?.length\n ? { filterOutParentKeys: subject.filterOutParentKeys }\n : {}),\n ...(subject.matchParentKeys ? { matchParentKeys: subject.matchParentKeys } : {}),\n };\n}\n\nexport function ruleId(name: string, index: number): string {\n const slug = (name || `untitled-${index + 1}`).trim().replace(/\\s+/g, '-');\n return `rule/${slug}`;\n}\n","import {\n createConfig,\n lintFromString,\n YamlParseError,\n type Plugin,\n type RawUniversalConfig,\n} from '@redocly/openapi-core';\nimport { cleanSubject, pruneRule, pruneWhere, ruleId } from '../normalize';\nimport type { EvaluationResult, MatchedNode, NamedRule, ProblemInfo } from '../types';\n\nconst COLLECTOR_PLUGIN_ID = 'rules-builder';\nconst SHADOW_RULE_PREFIX = 'rule/rules-builder-match-';\n\ntype CustomAssertion = NonNullable<Plugin['assertions']>[string];\n\ntype CollectorContext = {\n location?: { pointer?: string };\n baseLocation?: { pointer?: string };\n key?: string | number;\n type?: { name?: string };\n};\n\ninterface IndexedRule {\n named: NamedRule;\n index: number;\n}\n\ninterface LintOutcome {\n matches: MatchedNode[];\n problems: ProblemInfo[];\n ruleErrors: string[];\n error?: unknown;\n}\n\nlet queue: Promise<unknown> = Promise.resolve();\n\nfunction enqueue<T>(task: () => Promise<T>): Promise<T> {\n const run = queue.then(task, task);\n queue = run.catch(() => undefined);\n return run;\n}\n\nexport function evaluateRules(\n specText: string,\n rules: NamedRule[],\n fileName = 'openapi.yaml',\n): Promise<EvaluationResult> {\n return enqueue(async () => {\n const indexed = rules.map((named, index) => ({ named, index }));\n const all = await lint(specText, indexed, fileName);\n if (all.error === undefined) {\n return { matches: all.matches, problems: all.problems, ruleErrors: all.ruleErrors };\n }\n\n const message = errorMessage(all.error);\n if (all.error instanceof YamlParseError || isSpecLevelError(message)) {\n return { matches: [], problems: [], ruleErrors: [], specError: message };\n }\n\n const result: EvaluationResult = { matches: [], problems: [], ruleErrors: [] };\n for (const item of indexed) {\n const single = await lint(specText, [item], fileName);\n if (single.error !== undefined) {\n result.ruleErrors.push(`rule/${item.named.name}: ${errorMessage(single.error)}`);\n continue;\n }\n result.matches.push(...single.matches);\n result.problems.push(...single.problems);\n result.ruleErrors.push(...single.ruleErrors);\n }\n return result;\n });\n}\n\nasync function lint(\n specText: string,\n rules: IndexedRule[],\n fileName: string,\n): Promise<LintOutcome> {\n const matchesByPointer = new Map<string, MatchedNode>();\n const outcome: LintOutcome = { matches: [], problems: [], ruleErrors: [] };\n\n const collect: CustomAssertion = (_value, options, context) => {\n const ctx = context as unknown as CollectorContext;\n const { ruleIndex } = options as { ruleIndex: number };\n const pointer = ctx.location?.pointer;\n if (pointer === undefined) return [];\n const id = `${ruleIndex}:${pointer}`;\n let match = matchesByPointer.get(id);\n if (!match) {\n match = {\n ruleIndex,\n pointer,\n nodeType: ctx.type?.name ?? '',\n key: String(ctx.key ?? ''),\n propertyPointers: [],\n };\n matchesByPointer.set(id, match);\n }\n const propertyPointer = ctx.baseLocation?.pointer;\n if (propertyPointer && propertyPointer !== pointer) {\n match.propertyPointers.push(propertyPointer);\n }\n return [];\n };\n\n const configRules: Record<string, unknown> = {};\n const ruleIdToIndex = new Map<string, number>();\n\n for (const { named, index } of rules) {\n const rule = named.rule;\n if (!rule.subject?.type) continue;\n\n if (rule.severity !== 'off') {\n let id = ruleId(named.name, index);\n while (ruleIdToIndex.has(id)) id += '-dup';\n ruleIdToIndex.set(id, index);\n configRules[id] = pruneRule(rule);\n }\n\n configRules[`${SHADOW_RULE_PREFIX}${index}`] = {\n subject: cleanSubject(rule.subject),\n where: pruneWhere(rule.where),\n assertions: { [`${COLLECTOR_PLUGIN_ID}/collect`]: { ruleIndex: index } },\n };\n }\n\n try {\n const config = await createConfig({\n extends: [],\n plugins: [{ id: COLLECTOR_PLUGIN_ID, assertions: { collect } }],\n rules: configRules as RawUniversalConfig['rules'],\n });\n\n const problems = await lintFromString({\n source: specText,\n absoluteRef: `/${fileName}`,\n config,\n });\n\n for (const problem of problems) {\n const ruleIndex = ruleIdToIndex.get(problem.ruleId);\n if (ruleIndex === undefined) {\n if (problem.ruleId.startsWith(SHADOW_RULE_PREFIX)) continue;\n outcome.ruleErrors.push(problem.message);\n continue;\n }\n const location = problem.location?.[0];\n outcome.problems.push({\n ruleIndex,\n ruleId: problem.ruleId,\n severity: problem.severity === 'warn' ? 'warn' : 'error',\n message: problem.message,\n suggest: problem.suggest ?? [],\n pointer: (location && 'pointer' in location && location.pointer) || '#/',\n reportOnKey: Boolean(location?.reportOnKey),\n });\n }\n } catch (error) {\n outcome.error = error ?? new Error('Unknown lint error');\n }\n\n outcome.matches = Array.from(matchesByPointer.values());\n return outcome;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction isSpecLevelError(message: string): boolean {\n return /parse|unsupported|version|document/i.test(message);\n}\n","import { getAstNodeByPointer } from '@redocly/openapi-core';\nimport { safeLoad } from 'yaml-ast-parser';\n\nexport interface CharRange {\n from: number;\n to: number;\n}\n\nexport interface PointerRangeResolver {\n resolve(pointer: string, reportOnKey: boolean): CharRange | undefined;\n lineAt(offset: number): number;\n lineCount: number;\n lineRange(line: number): CharRange;\n}\n\nexport function createPointerRangeResolver(specText: string): PointerRangeResolver {\n let ast: Parameters<typeof getAstNodeByPointer>[0] | undefined;\n try {\n ast = safeLoad(specText) as typeof ast;\n } catch {\n ast = undefined;\n }\n\n const lineStarts: number[] = [0];\n for (let i = 0; i < specText.length; i++) {\n if (specText[i] === '\\n') lineStarts.push(i + 1);\n }\n\n return {\n resolve(pointer, reportOnKey) {\n if (!ast) return undefined;\n let node;\n try {\n node = getAstNodeByPointer(ast, pointer, reportOnKey);\n } catch {\n return undefined;\n }\n if (!node || typeof node.startPosition !== 'number' || typeof node.endPosition !== 'number') {\n return undefined;\n }\n const from = Math.max(0, Math.min(node.startPosition, specText.length));\n const to = Math.max(from, Math.min(node.endPosition, specText.length));\n if (to <= from) return undefined;\n return { from, to };\n },\n lineAt(offset) {\n let lo = 0;\n let hi = lineStarts.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (lineStarts[mid] <= offset) lo = mid;\n else hi = mid - 1;\n }\n return lo + 1;\n },\n lineCount: lineStarts.length,\n lineRange(line) {\n const from = lineStarts[line - 1] ?? 0;\n const to = line < lineStarts.length ? lineStarts[line] - 1 : specText.length;\n return { from, to: Math.max(from, to) };\n },\n };\n}\n","import type { ConfigurableRule, NamedRule } from './types';\n\nexport interface RuleEntry {\n id: string;\n name: string;\n rule: ConfigurableRule;\n}\n\nexport function makeId(): string {\n return typeof crypto !== 'undefined' && 'randomUUID' in crypto\n ? crypto.randomUUID()\n : Math.random().toString(36).slice(2);\n}\n\nexport function toNamedRules(entries: RuleEntry[]): NamedRule[] {\n return entries.map(({ name, rule }) => ({ name, rule }));\n}\n\nexport function createRuleEntry(named: NamedRule): RuleEntry {\n return { id: makeId(), name: named.name, rule: named.rule };\n}\n\nexport function createDefaultRule(existingNames: string[]): RuleEntry {\n let index = existingNames.length + 1;\n while (existingNames.includes(`my-rule-${index}`)) index++;\n return {\n id: makeId(),\n name: `my-rule-${index}`,\n rule: {\n subject: { type: 'Operation' },\n assertions: { defined: true },\n severity: 'warn',\n },\n };\n}\n","import { dump } from 'js-yaml';\nimport { pruneRule, ruleId } from '../normalize';\nimport type { NamedRule } from '../types';\n\nexport function serializeRules(rules: NamedRule[]): string {\n const entries: Record<string, unknown> = {};\n rules.forEach((namedRule, index) => {\n if (!namedRule.rule.subject?.type) return;\n let id = ruleId(namedRule.name, index);\n while (id in entries) id += '-dup';\n entries[id] = pruneRule(namedRule.rule);\n });\n return dump({ rules: entries }, { noRefs: true, lineWidth: 100, quotingType: \"'\" });\n}\n","import styled from 'styled-components';\nimport { MONO_FONT_FAMILY, SECTION_TONES, SEVERITY_COLORS } from '../styles';\nimport type { ProblemInfo } from '../types';\n\nexport interface ProblemsPanelProps {\n problems: ProblemInfo[];\n ruleErrors: string[];\n specError?: string;\n isRunning: boolean;\n onSelect: (problem: ProblemInfo) => void;\n}\n\nexport function ProblemsPanel({\n problems,\n ruleErrors,\n specError,\n isRunning,\n onSelect,\n}: ProblemsPanelProps) {\n const errorCount = problems.filter((p) => p.severity === 'error').length;\n const warnCount = problems.length - errorCount;\n\n return (\n <PanelContainer>\n <PanelTitle>\n Problems\n {errorCount > 0 && (\n <CountPill\n style={{ background: SEVERITY_COLORS.error.bg, color: SEVERITY_COLORS.error.fg }}\n >\n {errorCount} error{errorCount === 1 ? '' : 's'}\n </CountPill>\n )}\n {warnCount > 0 && (\n <CountPill\n style={{ background: SEVERITY_COLORS.warn.bg, color: SEVERITY_COLORS.warn.fg }}\n >\n {warnCount} warning{warnCount === 1 ? '' : 's'}\n </CountPill>\n )}\n {isRunning && <RunningNote>checking…</RunningNote>}\n </PanelTitle>\n <Scroll>\n {specError && <ErrorRow role=\"alert\">Could not lint the document: {specError}</ErrorRow>}\n {ruleErrors.map((error, index) => (\n <ErrorRow role=\"alert\" key={index}>\n Rule configuration error: {error}\n </ErrorRow>\n ))}\n {!specError && problems.length === 0 && (\n <EmptyRow>No problems found in the current document.</EmptyRow>\n )}\n {problems.map((problem, index) => {\n const s = SEVERITY_COLORS[problem.severity];\n return (\n <ProblemRow\n key={`${problem.pointer}-${index}`}\n type=\"button\"\n style={{ background: s.bg, ['--sev' as string]: s.fg }}\n onClick={() => onSelect(problem)}\n >\n <Dot style={{ background: s.fg }} />\n <Content>\n <TopRow>\n <SevBadge style={{ color: s.fg }}>{problem.severity}</SevBadge>\n <RuleId style={{ color: s.fg }}>{problem.ruleId}</RuleId>\n <Spacer />\n {problem.line !== undefined && (\n <Position style={{ color: s.fg }}>\n :{problem.line}\n {problem.col !== undefined ? `:${problem.col}` : ''}\n </Position>\n )}\n </TopRow>\n <Message>{problem.message}</Message>\n {problem.suggest.length > 0 && (\n <Suggestions>\n {problem.suggest.map((suggestion, i) => (\n <Suggestion key={i}>{suggestion}</Suggestion>\n ))}\n </Suggestions>\n )}\n </Content>\n </ProblemRow>\n );\n })}\n </Scroll>\n </PanelContainer>\n );\n}\n\nconst PanelContainer = styled.div`\n border: 1px solid var(--border-color-secondary, #e5e9f0);\n border-radius: 16px;\n padding: 10px 14px 12px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n max-height: 240px;\n background: var(--bg-color, #ffffff);\n`;\n\nconst PanelTitle = styled.div`\n font-weight: 700;\n font-size: 14px;\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--text-color-primary, #1b2430);\n flex-shrink: 0;\n`;\n\nconst CountPill = styled.span`\n border-radius: 999px;\n font-size: 11.5px;\n font-weight: 700;\n padding: 2px 9px;\n`;\n\nconst RunningNote = styled.span`\n color: var(--text-color-secondary, #64748b);\n font-size: 12px;\n font-weight: 400;\n`;\n\nconst Scroll = styled.div`\n display: flex;\n flex-direction: column;\n gap: 8px;\n overflow-y: auto;\n`;\n\nconst ProblemRow = styled.button`\n display: flex;\n gap: 12px;\n border: 1px solid transparent;\n font: inherit;\n text-align: left;\n padding: 10px 14px;\n border-radius: 12px;\n cursor: pointer;\n flex-shrink: 0;\n transition: border-color 0.12s;\n\n &:hover {\n border-color: var(--sev);\n }\n\n &:focus-visible {\n outline: 2px solid var(--sev);\n outline-offset: -2px;\n }\n`;\n\nconst Dot = styled.span`\n width: 7px;\n height: 7px;\n border-radius: 50%;\n flex-shrink: 0;\n margin-top: 6px;\n`;\n\nconst Content = styled.div`\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 3px;\n min-width: 0;\n`;\n\nconst TopRow = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n`;\n\nconst SevBadge = styled.span`\n font-size: 10.5px;\n font-weight: 700;\n background: rgba(255, 255, 255, 0.75);\n border-radius: 6px;\n padding: 1px 7px;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n`;\n\nconst RuleId = styled.span`\n font-family: ${MONO_FONT_FAMILY};\n font-size: 12px;\n font-weight: 600;\n`;\n\nconst Spacer = styled.span`\n flex: 1;\n`;\n\nconst Position = styled.span`\n font-family: ${MONO_FONT_FAMILY};\n font-size: 11.5px;\n opacity: 0.75;\n`;\n\nconst Message = styled.span`\n font-size: 12.5px;\n color: var(--text-color-primary, #1b2430);\n line-height: 1.45;\n`;\n\nconst Suggestions = styled.ul`\n margin: 5px 0 0;\n padding: 0;\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 3px;\n`;\n\nconst Suggestion = styled.li`\n display: flex;\n align-items: baseline;\n gap: 6px;\n font-size: 12px;\n line-height: 1.4;\n color: ${SECTION_TONES.suggest.fg};\n background: rgba(255, 255, 255, 0.65);\n border-radius: 8px;\n padding: 3px 8px;\n align-self: flex-start;\n\n &::before {\n content: '→';\n opacity: 0.75;\n }\n`;\n\nconst EmptyRow = styled.div`\n font-size: 13px;\n color: var(--text-color-secondary, #64748b);\n padding: 3px 4px;\n`;\n\nconst ErrorRow = styled.div`\n font-size: 12px;\n color: var(--color-error-base, #dc2626);\n background: var(--color-error-bg, #fef2f2);\n border-radius: 10px;\n padding: 5px 8px;\n white-space: pre-wrap;\n`;\n","import { useEffect, type ReactNode } from 'react';\nimport styled from 'styled-components';\n\nexport interface ModalProps {\n title: string;\n subtitle?: string;\n onClose: () => void;\n children: ReactNode;\n footer?: ReactNode;\n width?: number;\n}\n\nexport function Modal({ title, subtitle, onClose, children, footer, width = 560 }: ModalProps) {\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => e.key === 'Escape' && onClose();\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [onClose]);\n\n return (\n <Overlay onClick={onClose}>\n <Dialog\n role=\"dialog\"\n aria-modal\n aria-label={title}\n style={{ maxWidth: width }}\n onClick={(e) => e.stopPropagation()}\n >\n <HeadRow>\n <div style={{ flex: 1 }}>\n <HeadTitle>{title}</HeadTitle>\n {subtitle && <HeadSubtitle>{subtitle}</HeadSubtitle>}\n </div>\n <CloseButton type=\"button\" aria-label=\"Close\" onClick={onClose}>\n ×\n </CloseButton>\n </HeadRow>\n <BodyArea>{children}</BodyArea>\n {footer && <Foot>{footer}</Foot>}\n </Dialog>\n </Overlay>\n );\n}\n\nconst Overlay = styled.div`\n position: fixed;\n inset: 0;\n background: rgba(15, 23, 42, 0.45);\n z-index: 50;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n`;\n\nconst Dialog = styled.div`\n background: var(--bg-color, #ffffff);\n border-radius: 16px;\n width: 100%;\n max-height: 86vh;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n box-shadow: 0 24px 64px rgba(15, 23, 42, 0.24);\n`;\n\nconst HeadRow = styled.div`\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 18px 20px 14px;\n border-bottom: 1px solid var(--border-color-secondary, #e5e9f0);\n`;\n\nconst HeadTitle = styled.div`\n font-size: 15.5px;\n font-weight: 700;\n color: var(--text-color-primary, #1b2430);\n`;\n\nconst HeadSubtitle = styled.div`\n font-size: 12.5px;\n color: var(--text-color-secondary, #64748b);\n margin-top: 3px;\n`;\n\nconst CloseButton = styled.button`\n background: none;\n border: none;\n color: var(--color-warm-grey-6, #94a3b8);\n font-size: 18px;\n cursor: pointer;\n line-height: 1;\n padding: 4px;\n\n &:hover {\n color: var(--text-color-primary, #1b2430);\n }\n`;\n\nconst BodyArea = styled.div`\n padding: 20px;\n overflow: auto;\n flex: 1;\n`;\n\nconst Foot = styled.div`\n display: flex;\n justify-content: flex-end;\n gap: 10px;\n padding: 14px 20px;\n border-top: 1px solid var(--border-color-secondary, #e5e9f0);\n background: var(--color-warm-grey-1, #fbfbfc);\n flex-wrap: wrap;\n`;\n","import type { CSSProperties, ReactNode } from 'react';\nimport styled, { css } from 'styled-components';\nimport { MONO_FONT_FAMILY, SECTION_TONES, type SectionTone } from '../../styles';\n\nexport const InlineSelect = styled.select`\n border: 1px solid var(--border-color-secondary, #e5e9f0);\n border-radius: 10px;\n background: var(--bg-color, #ffffff);\n color: var(--text-color-primary, #1b2430);\n font: inherit;\n font-size: 13px;\n font-weight: 600;\n padding: 2px 6px;\n cursor: pointer;\n max-width: 260px;\n\n &:focus-visible {\n outline: none;\n border-color: var(--color-primary-base, #2563eb);\n }\n`;\n\nexport const InlineInput = styled.input`\n border: 1px solid var(--border-color-secondary, #e5e9f0);\n border-radius: 10px;\n background: var(--bg-color, #ffffff);\n color: var(--text-color-primary, #1b2430);\n font: inherit;\n font-size: 13px;\n padding: 2px 8px;\n min-width: 60px;\n box-sizing: border-box;\n\n &:focus {\n outline: none;\n border-color: var(--color-primary-base, #2563eb);\n }\n\n &::placeholder {\n color: var(--text-color-secondary, #64748b);\n opacity: 0.8;\n }\n`;\n\nexport const MonoInput = styled(InlineInput)`\n font-family: ${MONO_FONT_FAMILY};\n font-size: 12px;\n`;\n\nexport const ToolbarButton = styled.button`\n border: 1px solid var(--border-color-secondary, #e5e9f0);\n border-radius: 10px;\n background: transparent;\n font: inherit;\n font-size: 13px;\n padding: 3px 10px;\n cursor: pointer;\n color: var(--text-color-primary, #1b2430);\n\n &:hover {\n border-color: var(--color-primary-base, #2563eb);\n color: var(--color-primary-base, #2563eb);\n }\n\n &:focus-visible {\n outline: 2px solid var(--color-primary-base, #2563eb);\n }\n`;\n\nexport const TriggerButton = styled.button`\n display: inline-flex;\n align-items: center;\n gap: 7px;\n background: var(--bg-color, #ffffff);\n color: var(--text-color-primary, #1b2430);\n border: 1px solid var(--border-color-primary, #d6dde8);\n border-radius: 8px;\n padding: 6px 12px;\n font: inherit;\n font-size: 12.5px;\n cursor: pointer;\n white-space: nowrap;\n\n &:hover {\n border-color: var(--color-primary-base, #2563eb);\n color: var(--color-primary-base, #2563eb);\n }\n\n &:focus-visible {\n outline: 2px solid var(--color-primary-base, #2563eb);\n }\n`;\n\nexport const SecondaryButton = styled.button`\n background: var(--bg-color, #ffffff);\n color: var(--text-color-primary, #1b2430);\n border: 1px solid var(--border-color-primary, #d6dde8);\n border-radius: 8px;\n padding: 7px 14px;\n font: inherit;\n font-size: 12.5px;\n cursor: pointer;\n\n &:hover {\n border-color: var(--color-primary-base, #2563eb);\n color: var(--color-primary-base, #2563eb);\n }\n`;\n\nexport const PrimaryButton = styled.button`\n display: inline-flex;\n align-items: center;\n gap: 7px;\n background: var(--color-primary-base, #2563eb);\n color: #fff;\n border: none;\n border-radius: 8px;\n padding: 7px 14px;\n font: inherit;\n font-size: 12.5px;\n font-weight: 600;\n cursor: pointer;\n white-space: nowrap;\n\n &:hover {\n filter: brightness(1.05);\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n filter: none;\n }\n\n &:focus-visible {\n outline: 2px solid var(--text-color-primary, #1b2430);\n outline-offset: 1px;\n }\n`;\n\nexport const Keyword = styled.span`\n color: var(--text-color-secondary, #64748b);\n font-style: italic;\n`;\n\nconst SectionLabel = styled.span`\n font-size: 13px;\n font-weight: 700;\n color: var(--sec);\n flex-shrink: 0;\n`;\n\nconst SectionHint = styled.span`\n display: block;\n font-size: 12px;\n color: var(--text-color-secondary, #64748b);\n margin-top: 4px;\n`;\n\nconst SectionWrapper = styled.div`\n padding: 16px 2px 6px;\n\n & + & {\n border-top: 1px solid var(--border-color-secondary, #e5e9f0);\n }\n`;\n\nconst SectionHead = styled.div`\n margin-bottom: 12px;\n`;\n\nconst SectionTitleRow = styled.div`\n display: flex;\n align-items: center;\n gap: 12px;\n`;\n\nconst SectionLine = styled.span`\n flex: 1;\n height: 1px;\n background: var(--sec-line);\n`;\n\nexport function Section({\n tone,\n label,\n hint,\n children,\n}: {\n tone: SectionTone;\n label: string;\n hint: string;\n children: ReactNode;\n}) {\n const colors = SECTION_TONES[tone];\n return (\n <SectionWrapper\n style={{ ['--sec' as string]: colors.fg, ['--sec-line' as string]: colors.line }}\n >\n <SectionHead>\n <SectionTitleRow>\n <SectionLabel>{label}</SectionLabel>\n <SectionLine />\n </SectionTitleRow>\n <SectionHint>{hint}</SectionHint>\n </SectionHead>\n {children}\n </SectionWrapper>\n );\n}\n\nexport const SentenceRow = styled.div`\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n color: var(--text-color-primary, #1b2430);\n`;\n\nexport function Chevron({ open }: { open: boolean }) {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n aria-hidden\n style={{\n transition: 'transform .15s',\n transform: open ? 'rotate(90deg)' : 'none',\n flexShrink: 0,\n }}\n >\n <path\n d=\"M4 2l4 4-4 4\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nconst wavySvg = (color: string) =>\n `url(\"data:image/svg+xml,${encodeURIComponent(\n `<svg xmlns='http://www.w3.org/2000/svg' width='6' height='3' viewBox='0 0 6 3'><path d='M0 2.5 Q1.5 0.5 3 2.5 Q4.5 4.5 6 2.5' fill='none' stroke='${color}' stroke-width='1'/></svg>`,\n )}\")`;\n\nconst errorSquiggle = css`\n background-image: ${wavySvg('#dc2626')};\n background-repeat: repeat-x;\n background-position: bottom left;\n background-size: 6px 3px;\n padding-bottom: 3px;\n`;\n\nconst SquiggleWrap = styled.span<{ $error?: string }>`\n display: inline-flex;\n align-items: center;\n gap: 6px;\n\n ${(p) => p.$error && errorSquiggle}\n`;\n\nexport function FieldSquiggle({\n error,\n children,\n style,\n}: {\n error?: string;\n children: ReactNode;\n style?: CSSProperties;\n}) {\n return (\n <SquiggleWrap\n $error={error}\n title={error}\n aria-invalid={Boolean(error) || undefined}\n style={style}\n >\n {children}\n </SquiggleWrap>\n );\n}\n","import { useState } from 'react';\nimport styled from 'styled-components';\nimport { MONO_FONT_FAMILY } from '../styles';\nimport type { HostAdapters } from '../types';\nimport { Modal } from './Modal';\nimport { PrimaryButton, SecondaryButton, TriggerButton } from './controls/primitives';\n\nexport interface ConfigPreviewProps {\n yaml: string;\n host?: HostAdapters;\n fileName?: string;\n}\n\nexport function ConfigPreview({ yaml, host, fileName = 'redocly.yaml' }: ConfigPreviewProps) {\n const [open, setOpen] = useState(false);\n const [copied, setCopied] = useState(false);\n\n const copy = async () => {\n const write = host?.copyToClipboard ?? ((text: string) => navigator.clipboard.writeText(text));\n const ok = await write(yaml).then(\n () => true,\n () => false,\n );\n if (!ok) return;\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n const download = async () => {\n if (host?.downloadFile) {\n await host.downloadFile(fileName, yaml);\n return;\n }\n const url = URL.createObjectURL(new Blob([yaml], { type: 'text/yaml' }));\n const link = document.createElement('a');\n link.href = url;\n link.download = fileName;\n document.body.appendChild(link);\n link.click();\n link.remove();\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n };\n\n return (\n <>\n <TriggerButton type=\"button\" onClick={() => setOpen(true)}>\n <FileIcon /> Generated {fileName}\n </TriggerButton>\n {open && (\n <Modal\n title={`Generated ${fileName}`}\n subtitle=\"Ready to drop into your project root\"\n width={620}\n onClose={() => setOpen(false)}\n footer={\n <>\n <SecondaryButton type=\"button\" onClick={() => setOpen(false)}>\n Close\n </SecondaryButton>\n <SecondaryButton type=\"button\" onClick={copy}>\n {copied ? 'Copied!' : 'Copy'}\n </SecondaryButton>\n <PrimaryButton type=\"button\" onClick={download}>\n <DownloadIcon /> Download {fileName}\n </PrimaryButton>\n </>\n }\n >\n <Snippet aria-label={`Generated ${fileName}`}>{yaml}</Snippet>\n </Modal>\n )}\n </>\n );\n}\n\nfunction FileIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 14 14\" aria-hidden>\n <path\n d=\"M3 1.5h5.5L11.5 4.5v8a1 1 0 01-1 1H3a1 1 0 01-1-1v-10a1 1 0 011-1z\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M8.5 1.5v3h3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction DownloadIcon() {\n return (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 14 14\" aria-hidden>\n <path\n d=\"M7 1.5v7M4 6l3 2.5L10 6M2 10.5v1.5a1 1 0 001 1h8a1 1 0 001-1v-1.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nconst Snippet = styled.pre`\n margin: 0;\n background: #0f172a;\n color: #cbd5e1;\n border-radius: 12px;\n padding: 16px;\n font-family: ${MONO_FONT_FAMILY};\n font-size: 12px;\n line-height: 1.75;\n overflow: auto;\n max-height: 420px;\n`;\n","import { load } from 'js-yaml';\nimport type {\n AssertionObject,\n ConfigurableRule,\n NamedRule,\n SubjectObject,\n WhereObject,\n} from '../types';\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport interface ImportResult {\n rules: NamedRule[];\n skipped: string[];\n error?: string;\n}\n\nfunction looksLikeRule(value: unknown): value is ConfigurableRule {\n return (\n isPlainObject(value) &&\n isPlainObject((value as { subject?: unknown }).subject) &&\n typeof (value as { subject: { type?: unknown } }).subject.type === 'string'\n );\n}\n\nfunction normalizeAssertions(raw: unknown): AssertionObject {\n return isPlainObject(raw) ? (raw as AssertionObject) : {};\n}\n\nfunction normalizeWhere(raw: unknown[]): WhereObject[] {\n return raw.map((entry) => {\n const item = isPlainObject(entry) ? entry : {};\n const subject = isPlainObject(item.subject) ? item.subject : {};\n return {\n subject: {\n ...(subject as Partial<SubjectObject>),\n type: typeof subject.type === 'string' ? subject.type : '',\n },\n assertions: normalizeAssertions(item.assertions),\n };\n });\n}\n\nfunction normalizeImportedRule(raw: ConfigurableRule): ConfigurableRule {\n return {\n subject: raw.subject,\n assertions: normalizeAssertions(raw.assertions),\n ...(Array.isArray(raw.where) ? { where: normalizeWhere(raw.where) } : {}),\n ...(typeof raw.message === 'string' ? { message: raw.message } : {}),\n ...(Array.isArray(raw.suggest) ? { suggest: raw.suggest } : {}),\n ...(typeof raw.reference === 'string' ? { reference: raw.reference } : {}),\n ...(raw.severity === 'warn' || raw.severity === 'off' || raw.severity === 'error'\n ? { severity: raw.severity }\n : {}),\n };\n}\n\nexport function parseImportedRules(text: string): ImportResult {\n let parsed: unknown;\n try {\n parsed = load(text);\n } catch (error) {\n return {\n rules: [],\n skipped: [],\n error: `Could not parse the document: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n\n if (!isPlainObject(parsed)) {\n return { rules: [], skipped: [], error: 'Expected a YAML/JSON object' };\n }\n\n const root = parsed as Record<string, unknown>;\n\n if (looksLikeRule(root)) {\n return { rules: [{ name: 'imported-rule', rule: normalizeImportedRule(root) }], skipped: [] };\n }\n\n const rulesMap = isPlainObject(root.rules)\n ? (root.rules as Record<string, unknown>)\n : Object.keys(root).some((key) => key.startsWith('rule/'))\n ? root\n : undefined;\n\n if (!rulesMap) {\n return {\n rules: [],\n skipped: [],\n error:\n 'No configurable rules found — expected a `rules:` map with `rule/<name>` entries, or a single rule object',\n };\n }\n\n const rules: NamedRule[] = [];\n const skipped: string[] = [];\n for (const [key, value] of Object.entries(rulesMap)) {\n if (key.startsWith('rule/') && looksLikeRule(value)) {\n rules.push({ name: key.slice('rule/'.length), rule: normalizeImportedRule(value) });\n } else {\n skipped.push(key);\n }\n }\n\n if (rules.length === 0) {\n return { rules, skipped, error: 'No `rule/<name>` entries with a valid subject found' };\n }\n\n return { rules, skipped };\n}\n","import styled, { css } from 'styled-components';\n\nexport interface SegmentedOption<T extends string> {\n value: T;\n label: string;\n activeColor?: string;\n}\n\nexport interface SegmentedProps<T extends string> {\n value: T;\n options: SegmentedOption<T>[];\n onChange: (value: T) => void;\n ariaLabel: string;\n}\n\nexport function Segmented<T extends string>({\n value,\n options,\n onChange,\n ariaLabel,\n}: SegmentedProps<T>) {\n return (\n <PillGroup role=\"radiogroup\" aria-label={ariaLabel}>\n {options.map((option) => (\n <PillButton\n key={option.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={value === option.value}\n $active={value === option.value}\n $activeColor={option.activeColor}\n onClick={(e) => {\n e.stopPropagation();\n onChange(option.value);\n }}\n >\n {option.label}\n </PillButton>\n ))}\n </PillGroup>\n );\n}\n\nconst PillGroup = styled.span`\n display: inline-flex;\n background: var(--bg-color, #ffffff);\n border: 1px solid var(--border-color-primary, #d6dde8);\n border-radius: 999px;\n padding: 2px;\n gap: 2px;\n flex-shrink: 0;\n`;\n\nconst PillButton = styled.button<{ $active: boolean; $activeColor?: string }>`\n border: none;\n border-radius: 999px;\n background: transparent;\n cursor: pointer;\n font: inherit;\n font-size: 12px;\n font-weight: 600;\n padding: 4px 12px;\n color: var(--text-color-secondary, #64748b);\n white-space: nowrap;\n transition:\n background 0.12s,\n color 0.12s;\n\n ${(p) =>\n p.$active &&\n css`\n color: #fff;\n background: ${p.$activeColor ?? 'var(--color-primary-base, #2563eb)'};\n `}\n\n &:focus-visible {\n outline: 2px solid var(--color-primary-base, #2563eb);\n outline-offset: -2px;\n }\n`;\n","import { useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { MONO_FONT_FAMILY } from '../styles';\nimport { parseImportedRules } from '../yaml/parse';\nimport type { NamedRule } from '../types';\nimport { Modal } from './Modal';\nimport { Segmented } from './controls/Segmented';\nimport { PrimaryButton, SecondaryButton, TriggerButton } from './controls/primitives';\n\nexport interface ImportPanelProps {\n onImport: (rules: NamedRule[]) => void;\n}\n\nexport function ImportPanel({ onImport }: ImportPanelProps) {\n const [open, setOpen] = useState(false);\n const [mode, setMode] = useState<'paste' | 'upload'>('paste');\n const [text, setText] = useState('');\n const [error, setError] = useState<string>();\n const [notice, setNotice] = useState<string>();\n const [dragging, setDragging] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const close = () => {\n setOpen(false);\n setError(undefined);\n setNotice(undefined);\n };\n\n const runImport = (source: string) => {\n const result = parseImportedRules(source);\n if (result.error) {\n setError(result.error);\n setNotice(undefined);\n return;\n }\n onImport(result.rules);\n setText('');\n if (result.skipped.length) {\n setError(undefined);\n setNotice(\n `Imported ${result.rules.length} rule(s); skipped non-configurable entries: ${result.skipped.join(', ')}`,\n );\n } else {\n close();\n }\n };\n\n const importFile = (file: File) => {\n const reader = new FileReader();\n reader.onload = () => runImport(String(reader.result ?? ''));\n reader.onerror = () => setError('Could not read the file');\n reader.readAsText(file);\n };\n\n return (\n <>\n <TriggerButton type=\"button\" onClick={() => setOpen(true)}>\n <ImportIcon /> Import rules\n </TriggerButton>\n {open && (\n <Modal\n title=\"Import rules\"\n subtitle=\"Add existing rules from a redocly.yaml file\"\n onClose={close}\n footer={\n <>\n <SecondaryButton type=\"button\" onClick={close}>\n Cancel\n </SecondaryButton>\n {mode === 'paste' && (\n <PrimaryButton\n type=\"button\"\n disabled={!text.trim()}\n onClick={() => runImport(text)}\n >\n Import rules\n </PrimaryButton>\n )}\n </>\n }\n >\n <ModeRow>\n <Segmented<'paste' | 'upload'>\n ariaLabel=\"Import mode\"\n value={mode}\n onChange={setMode}\n options={[\n { value: 'paste', label: 'paste' },\n { value: 'upload', label: 'upload file' },\n ]}\n />\n </ModeRow>\n {mode === 'paste' ? (\n <PasteArea\n aria-label=\"Rules YAML\"\n value={text}\n placeholder={\n 'rules:\\n rule/operation-summary:\\n subject:\\n type: Operation\\n property: summary\\n assertions:\\n defined: true\\n maxLength: 20'\n }\n onChange={(e) => setText(e.target.value)}\n />\n ) : (\n <Drop\n $active={dragging}\n onClick={() => fileInputRef.current?.click()}\n onDragOver={(event) => {\n event.preventDefault();\n event.dataTransfer.dropEffect = 'copy';\n if (!dragging) setDragging(true);\n }}\n onDragLeave={(event) => {\n if (event.currentTarget.contains(event.relatedTarget as Node | null)) return;\n setDragging(false);\n }}\n onDrop={(event) => {\n event.preventDefault();\n setDragging(false);\n const file = event.dataTransfer.files?.[0];\n if (file) importFile(file);\n }}\n >\n <DropIcon>\n <ImportIcon size={18} />\n </DropIcon>\n <DropTitle>Drop your redocly.yaml here</DropTitle>\n <DropHint>\n or <b>browse files</b> · .yaml, .yml, .json\n </DropHint>\n </Drop>\n )}\n {error && <ErrorText role=\"alert\">{error}</ErrorText>}\n {notice && <NoticeText>{notice}</NoticeText>}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".yaml,.yml,.json,.txt\"\n hidden\n aria-label=\"Upload rules file\"\n onChange={(event) => {\n const file = event.target.files?.[0];\n event.target.value = '';\n if (file) importFile(file);\n }}\n />\n </Modal>\n )}\n </>\n );\n}\n\nfunction ImportIcon({ size = 13 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 14 14\" aria-hidden>\n <path\n d=\"M7 1.5v7M4 6l3 2.5L10 6M2 10.5v1.5a1 1 0 001 1h8a1 1 0 001-1v-1.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nconst ModeRow = styled.div`\n margin-bottom: 14px;\n`;\n\nconst PasteArea = styled.textarea`\n width: 100%;\n box-sizing: border-box;\n display: block;\n height: 220px;\n background: var(--color-warm-grey-1, #fbfbfc);\n border: 1px solid var(--border-color-primary, #d6dde8);\n border-radius: 12px;\n padding: 14px;\n font-family: ${MONO_FONT_FAMILY};\n font-size: 12px;\n line-height: 1.7;\n color: var(--text-color-primary, #1b2430);\n resize: vertical;\n outline: none;\n\n &:focus {\n border-color: var(--color-primary-base, #2563eb);\n }\n`;\n\nconst Drop = styled.div<{ $active: boolean }>`\n border: 1.5px dashed ${(p) => (p.$active ? 'var(--color-primary-base, #2563eb)' : 'var(--border-color-primary, #d6dde8)')};\n border-radius: 12px;\n background: var(--color-warm-grey-1, #fbfbfc);\n padding: 38px 20px;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n cursor: pointer;\n text-align: center;\n\n &:hover {\n border-color: var(--color-primary-base, #2563eb);\n }\n`;\n\nconst DropIcon = styled.div`\n width: 40px;\n height: 40px;\n border-radius: 12px;\n background: var(--color-primary-bg, #eff4fe);\n color: var(--color-primary-base, #2563eb);\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nconst DropTitle = styled.div`\n font-size: 13.5px;\n font-weight: 600;\n color: var(--text-color-primary, #1b2430);\n`;\n\nconst DropHint = styled.div`\n font-size: 12.5px;\n color: var(--text-color-secondary, #64748b);\n\n b {\n color: var(--color-primary-base, #2563eb);\n }\n`;\n\nconst ErrorText = styled.p`\n color: var(--color-error-base, #dc2626);\n font-size: 12.5px;\n margin: 12px 0 0;\n`;\n\nconst NoticeText = styled.p`\n color: var(--text-color-secondary, #64748b);\n font-size: 12.5px;\n margin: 12px 0 0;\n`;\n","import { Oas3_1Types } from '@redocly/openapi-core';\nimport type { AssertionKey, CasingStyle } from './types';\n\nexport const CASING_STYLES: CasingStyle[] = [\n 'camelCase',\n 'kebab-case',\n 'snake_case',\n 'PascalCase',\n 'MACRO_CASE',\n 'COBOL-CASE',\n 'flatcase',\n];\n\nconst DOCUMENTED_NODE_TYPES = [\n 'Root',\n 'Info',\n 'Contact',\n 'License',\n 'Server',\n 'ServerList',\n 'ServerVariables',\n 'Paths',\n 'PathItem',\n 'Operation',\n 'Parameter',\n 'ParameterList',\n 'RequestBody',\n 'MediaTypesMap',\n 'MediaType',\n 'Responses',\n 'Response',\n 'Schema',\n 'SchemaProperties',\n 'Discriminator',\n 'DiscriminatorMapping',\n 'Example',\n 'ExamplesMap',\n 'Encoding',\n 'Header',\n 'HeadersMap',\n 'Link',\n 'LinksMap',\n 'Callback',\n 'CallbacksMap',\n 'XCodeSample',\n 'WebhooksMap',\n 'Components',\n 'NamedSchemas',\n 'NamedResponses',\n 'NamedParameters',\n 'NamedExamples',\n 'NamedRequestBodies',\n 'NamedHeaders',\n 'NamedPathItems',\n 'NamedSecuritySchemes',\n 'NamedLinks',\n 'NamedCallbacks',\n 'SecurityScheme',\n 'SecurityRequirement',\n 'OAuth2Flows',\n 'ImplicitFlow',\n 'PasswordFlow',\n 'AuthorizationCode',\n 'ClientCredentials',\n 'Tag',\n 'TagList',\n 'ExternalDocs',\n];\n\nexport const NODE_TYPES: string[] = [\n 'any',\n ...Array.from(new Set([...DOCUMENTED_NODE_TYPES, ...Object.keys(Oas3_1Types)])).sort(),\n];\n\nexport type AssertionValueKind =\n | 'casing'\n | 'text'\n | 'regex'\n | 'stringList'\n | 'number'\n | 'boolean'\n | 'refValue';\n\nexport interface AssertionMeta {\n key: AssertionKey;\n kind: AssertionValueKind;\n propertyMode: 'forbidden' | 'required' | 'either';\n hint: string;\n}\n\nexport const ASSERTION_META: AssertionMeta[] = [\n { key: 'casing', kind: 'casing', propertyMode: 'either', hint: 'value matches a casing style' },\n { key: 'const', kind: 'text', propertyMode: 'either', hint: 'value equals exactly' },\n {\n key: 'contains',\n kind: 'stringList',\n propertyMode: 'required',\n hint: 'array value includes all of',\n },\n { key: 'defined', kind: 'boolean', propertyMode: 'either', hint: 'property is defined' },\n {\n key: 'disallowed',\n kind: 'stringList',\n propertyMode: 'forbidden',\n hint: 'none of these keys are defined',\n },\n { key: 'enum', kind: 'stringList', propertyMode: 'either', hint: 'value is one of' },\n {\n key: 'maxLength',\n kind: 'number',\n propertyMode: 'either',\n hint: 'string/array length at most (exclusive)',\n },\n {\n key: 'minLength',\n kind: 'number',\n propertyMode: 'either',\n hint: 'string/array length at least (inclusive)',\n },\n {\n key: 'mutuallyExclusive',\n kind: 'stringList',\n propertyMode: 'forbidden',\n hint: 'at most one of these keys is defined',\n },\n {\n key: 'mutuallyRequired',\n kind: 'stringList',\n propertyMode: 'forbidden',\n hint: 'these keys are defined together or not at all',\n },\n { key: 'nonEmpty', kind: 'boolean', propertyMode: 'required', hint: 'value is not empty' },\n {\n key: 'notPattern',\n kind: 'regex',\n propertyMode: 'either',\n hint: 'value does not match regex',\n },\n { key: 'pattern', kind: 'regex', propertyMode: 'either', hint: 'value matches regex' },\n {\n key: 'ref',\n kind: 'refValue',\n propertyMode: 'either',\n hint: '$ref is (not) used, or matches pattern',\n },\n {\n key: 'required',\n kind: 'stringList',\n propertyMode: 'forbidden',\n hint: 'all of these keys are defined',\n },\n {\n key: 'requireAny',\n kind: 'stringList',\n propertyMode: 'forbidden',\n hint: 'at least one of these keys is defined',\n },\n];\n\nexport const ASSERTION_META_BY_KEY: Record<string, AssertionMeta> = Object.fromEntries(\n ASSERTION_META.map((m) => [m.key, m]),\n);\n\nexport const MESSAGE_PLACEHOLDERS = [\n '{{assertionName}}',\n '{{nodeType}}',\n '{{key}}',\n '{{property}}',\n '{{problems}}',\n '{{pointer}}',\n '{{file}}',\n];\n","import { ASSERTION_META_BY_KEY } from './constants';\nimport type { AssertionKey, ConfigurableRule, SubjectObject } from './types';\n\nconst NAME_PATTERN = /^[a-zA-Z][a-zA-Z0-9-]*$/;\n\nexport type RuleErrors = Record<string, string>;\n\nexport function hasSubjectProperty(subject: SubjectObject): boolean {\n return Array.isArray(subject.property) ? subject.property.length > 0 : Boolean(subject.property);\n}\n\nfunction isValidRegex(pattern: string): boolean {\n const lastSlash = pattern.lastIndexOf('/');\n const isSlashWrapped = pattern.startsWith('/') && lastSlash > 0;\n try {\n if (isSlashWrapped) new RegExp(pattern.slice(1, lastSlash), pattern.slice(lastSlash + 1));\n else new RegExp(pattern);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction validateSubject(subject: SubjectObject, prefix: string, errors: RuleErrors) {\n if (!subject.type) {\n errors[`${prefix}type`] = 'Choose a node type';\n }\n if (subject.matchParentKeys && !isValidRegex(subject.matchParentKeys)) {\n errors[`${prefix}matchParentKeys`] = 'Invalid regular expression';\n }\n}\n\nfunction validateAssertions(\n assertions: ConfigurableRule['assertions'],\n subject: SubjectObject,\n prefix: string,\n errors: RuleErrors,\n) {\n const hasProperty = hasSubjectProperty(subject);\n\n for (const [key, value] of Object.entries(assertions)) {\n const meta = ASSERTION_META_BY_KEY[key as AssertionKey];\n if (!meta) continue;\n const path = `${prefix}assertion:${key}`;\n\n if (meta.propertyMode === 'required' && !hasProperty) {\n errors[path] = `\\`${key}\\` needs a single property target`;\n continue;\n }\n if (meta.propertyMode === 'forbidden' && hasProperty) {\n errors[path] = `\\`${key}\\` asserts on key names — target the whole node`;\n continue;\n }\n\n switch (meta.kind) {\n case 'regex':\n if (typeof value !== 'string' || !value) errors[path] = 'Enter a regular expression';\n else if (!isValidRegex(value)) errors[path] = 'Invalid regular expression';\n break;\n case 'stringList':\n if (!Array.isArray(value) || value.length === 0) errors[path] = 'Add at least one value';\n break;\n case 'number':\n if (!Number.isInteger(value) || (value as number) < 0)\n errors[path] = 'Enter a non-negative integer';\n break;\n case 'text':\n if (typeof value !== 'string' || value.trim() === '') errors[path] = 'Enter a value';\n break;\n case 'refValue':\n if (typeof value === 'string' && (!value || !isValidRegex(value)))\n errors[path] = 'Enter a valid pattern';\n break;\n default:\n break;\n }\n }\n}\n\nexport function validateRule(name: string, rule: ConfigurableRule): RuleErrors {\n const errors: RuleErrors = {};\n if (!NAME_PATTERN.test(name)) {\n errors.name = 'Use letters, digits and dashes, starting with a letter';\n }\n validateSubject(rule.subject, 'subject.', errors);\n validateAssertions(rule.assertions ?? {}, rule.subject, '', errors);\n (rule.where ?? []).forEach((entry, index) => {\n validateSubject(entry.subject, `where:${index}.`, errors);\n validateAssertions(entry.assertions ?? {}, entry.subject, `where:${index}.`, errors);\n });\n return errors;\n}\n","import { useState } from 'react';\nimport styled from 'styled-components';\nimport { MONO_FONT_FAMILY } from '../../styles';\n\nconst ChipsContainer = styled.span`\n display: inline-flex;\n flex-wrap: wrap;\n gap: 4px;\n align-items: center;\n border: 1px dashed var(--border-color-secondary, #e5e9f0);\n border-radius: 10px;\n padding: 2px 6px;\n background: var(--bg-color, #ffffff);\n\n &:focus-within {\n border-color: var(--color-primary-base, #2563eb);\n border-style: solid;\n }\n`;\n\nconst Chip = styled.span`\n display: inline-flex;\n align-items: center;\n gap: 3px;\n font-size: 12px;\n font-family: ${MONO_FONT_FAMILY};\n background: var(--color-primary-bg, #eff4fe);\n color: var(--text-color-primary, #1b2430);\n border-radius: 10px;\n padding: 1px 3px 1px 7px;\n`;\n\nconst ChipRemove = styled.button`\n font: inherit;\n font-size: 12px;\n line-height: 1;\n border: none;\n background: transparent;\n color: var(--text-color-secondary, #64748b);\n cursor: pointer;\n padding: 2px 4px;\n border-radius: 3px;\n\n &:hover {\n color: var(--color-error-base, #dc2626);\n }\n\n &:focus-visible {\n outline: 2px solid var(--color-primary-base, #2563eb);\n }\n`;\n\nconst ChipInput = styled.input`\n font: inherit;\n font-size: 12px;\n font-family: ${MONO_FONT_FAMILY};\n border: none;\n outline: none;\n background: transparent;\n color: var(--text-color-primary, #1b2430);\n min-width: 64px;\n flex: 1;\n padding: 1px 2px;\n\n &::placeholder {\n color: var(--text-color-secondary, #64748b);\n opacity: 0.8;\n }\n`;\n\nexport interface ChipListInputProps {\n values: string[];\n onChange: (values: string[]) => void;\n ariaLabel: string;\n placeholder?: string;\n}\n\nexport function ChipListInput({ values, onChange, ariaLabel, placeholder }: ChipListInputProps) {\n const [draft, setDraft] = useState('');\n\n const add = (raw: string) => {\n const value = raw.trim();\n if (value && !values.includes(value)) onChange([...values, value]);\n setDraft('');\n };\n\n return (\n <ChipsContainer role=\"group\" aria-label={ariaLabel}>\n {values.map((value) => (\n <Chip key={value}>\n {value}\n <ChipRemove\n type=\"button\"\n aria-label={`Remove ${value}`}\n onClick={() => onChange(values.filter((v) => v !== value))}\n >\n ×\n </ChipRemove>\n </Chip>\n ))}\n <ChipInput\n value={draft}\n aria-label={`Add value to ${ariaLabel}`}\n placeholder={values.length === 0 ? (placeholder ?? 'add value…') : 'add…'}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ',') {\n e.preventDefault();\n add(draft);\n } else if (e.key === 'Backspace' && draft === '' && values.length) {\n onChange(values.slice(0, -1));\n }\n }}\n onBlur={() => draft.trim() && add(draft)}\n />\n </ChipsContainer>\n );\n}\n","import styled from 'styled-components';\nimport { ASSERTION_META, ASSERTION_META_BY_KEY, CASING_STYLES } from '../constants';\nimport { MONO_FONT_FAMILY, SECTION_TONES, type SectionTone } from '../styles';\nimport type { AssertionKey, AssertionObject, CasingStyle } from '../types';\nimport type { RuleErrors } from '../validation';\nimport { ChipListInput } from './controls/ChipListInput';\nimport { FieldSquiggle, InlineInput, InlineSelect, MonoInput } from './controls/primitives';\n\nconst DEFAULT_VALUES: Record<string, unknown> = {\n casing: 'camelCase',\n const: '',\n contains: [],\n defined: true,\n disallowed: [],\n enum: [],\n maxLength: 10,\n minLength: 1,\n mutuallyExclusive: [],\n mutuallyRequired: [],\n nonEmpty: true,\n notPattern: '',\n pattern: '',\n ref: true,\n required: [],\n requireAny: [],\n};\n\nexport interface AssertionsEditorProps {\n assertions: AssertionObject;\n onChange: (assertions: AssertionObject) => void;\n keyword: string;\n tone: SectionTone;\n errors: RuleErrors;\n errorPrefix: string;\n}\n\nexport function AssertionsEditor({\n assertions,\n onChange,\n keyword,\n tone,\n errors,\n errorPrefix,\n}: AssertionsEditorProps) {\n const usedKeys = ASSERTION_META.filter((m) => assertions[m.key] !== undefined).map((m) => m.key);\n const availableKeys = ASSERTION_META.filter((m) => assertions[m.key] === undefined);\n const readOnlyKeys = (Object.keys(assertions) as AssertionKey[]).filter(\n (key) => !ASSERTION_META_BY_KEY[key] && assertions[key] !== undefined,\n );\n const toneColor = SECTION_TONES[tone].fg;\n\n const setValue = (key: AssertionKey, value: unknown) => {\n onChange({ ...assertions, [key]: value } as AssertionObject);\n };\n\n const replaceKey = (oldKey: AssertionKey, newKey: AssertionKey) => {\n const next = { ...assertions };\n delete next[oldKey];\n onChange({ ...next, [newKey]: DEFAULT_VALUES[newKey] } as AssertionObject);\n };\n\n const remove = (key: AssertionKey) => {\n const next = { ...assertions };\n delete next[key];\n onChange(next);\n };\n\n return (\n <Rows>\n {usedKeys.map((key) => {\n const meta = ASSERTION_META_BY_KEY[key];\n const error = errors[`${errorPrefix}assertion:${key}`];\n return (\n <AssertCard key={key}>\n <AssertKw style={{ color: toneColor }}>{keyword}</AssertKw>\n <InlineSelect\n aria-label=\"Assertion kind\"\n value={key}\n onChange={(e) => replaceKey(key, e.target.value as AssertionKey)}\n >\n <option value={key}>{key}</option>\n {availableKeys.map((m) => (\n <option key={m.key} value={m.key}>\n {m.key}\n </option>\n ))}\n </InlineSelect>\n <FieldSquiggle error={error}>\n <AssertionValueInput\n assertionKey={key}\n value={assertions[key]}\n onChange={(value) => setValue(key, value)}\n />\n </FieldSquiggle>\n <RowHint>{meta.hint}</RowHint>\n <RemoveX\n type=\"button\"\n aria-label={`Remove ${key} assertion`}\n onClick={() => remove(key)}\n >\n ×\n </RemoveX>\n </AssertCard>\n );\n })}\n {readOnlyKeys.map((key) => (\n <AssertCard key={key}>\n <AssertKw style={{ color: toneColor }}>{keyword}</AssertKw>\n <ReadOnlyKey>{key}</ReadOnlyKey>\n <ReadOnlyValue>{JSON.stringify(assertions[key])}</ReadOnlyValue>\n <RowHint>edit in the generated YAML</RowHint>\n <RemoveX type=\"button\" aria-label={`Remove ${key} assertion`} onClick={() => remove(key)}>\n ×\n </RemoveX>\n </AssertCard>\n ))}\n {availableKeys.length > 0 && (\n <AddAssertion\n type=\"button\"\n style={{ color: toneColor }}\n onClick={() => setValue(availableKeys[0].key, DEFAULT_VALUES[availableKeys[0].key])}\n >\n + Add assertion\n </AddAssertion>\n )}\n </Rows>\n );\n}\n\nfunction AssertionValueInput({\n assertionKey,\n value,\n onChange,\n}: {\n assertionKey: AssertionKey;\n value: unknown;\n onChange: (value: unknown) => void;\n}) {\n const meta = ASSERTION_META_BY_KEY[assertionKey];\n const label = `${assertionKey} value`;\n\n switch (meta.kind) {\n case 'casing':\n return (\n <InlineSelect\n aria-label={label}\n value={value as CasingStyle}\n onChange={(e) => onChange(e.target.value)}\n >\n {CASING_STYLES.map((style) => (\n <option key={style} value={style}>\n {style}\n </option>\n ))}\n </InlineSelect>\n );\n case 'boolean':\n return (\n <InlineSelect\n aria-label={label}\n value={String(Boolean(value))}\n onChange={(e) => onChange(e.target.value === 'true')}\n >\n <option value=\"true\">yes</option>\n <option value=\"false\">no</option>\n </InlineSelect>\n );\n case 'number':\n return (\n <InlineInput\n type=\"number\"\n aria-label={label}\n value={value as number}\n min={0}\n style={{ width: 70 }}\n onChange={(e) => onChange(Number(e.target.value))}\n />\n );\n case 'regex':\n return (\n <MonoInput\n aria-label={label}\n value={value as string}\n placeholder=\"/\\\\.$/\"\n style={{ width: 150 }}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n case 'stringList':\n return (\n <ChipListInput ariaLabel={label} values={(value as string[]) ?? []} onChange={onChange} />\n );\n case 'refValue': {\n const mode = typeof value === 'string' ? 'pattern' : String(Boolean(value));\n return (\n <>\n <InlineSelect\n aria-label={`${assertionKey} mode`}\n value={mode}\n onChange={(e) => {\n const next = e.target.value;\n onChange(next === 'pattern' ? '' : next === 'true');\n }}\n >\n <option value=\"true\">must use $ref</option>\n <option value=\"false\">must not use $ref</option>\n <option value=\"pattern\">$ref matches pattern…</option>\n </InlineSelect>\n {mode === 'pattern' && (\n <MonoInput\n aria-label={`${assertionKey} pattern`}\n value={value as string}\n placeholder=\"/components\\\\/schemas/\"\n style={{ width: 170 }}\n onChange={(e) => onChange(e.target.value)}\n />\n )}\n </>\n );\n }\n case 'text':\n default:\n return (\n <InlineInput\n aria-label={label}\n value={(value as string) ?? ''}\n placeholder=\"value\"\n style={{ width: 150 }}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n }\n}\n\nconst Rows = styled.div`\n display: flex;\n flex-direction: column;\n gap: 8px;\n`;\n\nconst AssertCard = styled.div`\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n min-width: 0;\n background: var(--color-warm-grey-1, #fbfbfc);\n border: 1px solid var(--border-color-secondary, #e5e9f0);\n border-radius: 12px;\n padding: 8px 12px;\n`;\n\nconst AssertKw = styled.span`\n font-size: 13px;\n font-style: italic;\n flex-shrink: 0;\n`;\n\nconst ReadOnlyKey = styled.span`\n font-family: ${MONO_FONT_FAMILY};\n font-size: 13px;\n font-weight: 600;\n`;\n\nconst ReadOnlyValue = styled.code`\n font-family: ${MONO_FONT_FAMILY};\n font-size: 12px;\n color: var(--text-color-secondary, #64748b);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 260px;\n`;\n\nconst RowHint = styled.span`\n font-size: 12px;\n color: var(--color-warm-grey-6, #94a3b8);\n flex: 1 1 140px;\n min-width: 120px;\n`;\n\nconst RemoveX = styled.button`\n background: none;\n border: none;\n cursor: pointer;\n color: var(--color-warm-grey-6, #94a3b8);\n font-size: 15px;\n line-height: 1;\n margin-left: auto;\n\n &:hover {\n color: var(--color-error-base, #dc2626);\n }\n\n &:focus-visible {\n outline: 2px solid var(--color-primary-base, #2563eb);\n }\n`;\n\nconst AddAssertion = styled.button`\n align-self: flex-start;\n background: none;\n border: none;\n font: inherit;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n padding: 2px 2px;\n\n &:focus-visible {\n outline: 2px solid currentColor;\n }\n`;\n","import { SEVERITY_COLORS } from '../../styles';\nimport type { Severity } from '../../types';\nimport { Segmented } from './Segmented';\n\nexport function SeverityPill({\n value,\n onChange,\n}: {\n value: Severity;\n onChange: (value: Severity) => void;\n}) {\n return (\n <Segmented<Severity>\n ariaLabel=\"Severity\"\n value={value}\n onChange={onChange}\n options={[\n { value: 'error', label: 'error', activeColor: SEVERITY_COLORS.error.fg },\n { value: 'warn', label: 'warn', activeColor: SEVERITY_COLORS.warn.fg },\n { value: 'off', label: 'off', activeColor: SEVERITY_COLORS.off.fg },\n ]}\n />\n );\n}\n","import { useEffect, useId, useMemo, useRef, useState } from 'react';\nimport styled from 'styled-components';\n\nconst Wrapper = styled.div`\n position: relative;\n display: inline-block;\n`;\n\nconst Trigger = styled.input`\n font: inherit;\n font-size: 13px;\n font-weight: 600;\n color: var(--text-color-primary, #1b2430);\n background: var(--bg-color, #ffffff);\n border: 1px solid var(--border-color-secondary, #e5e9f0);\n border-radius: 10px;\n padding: 2px 20px 2px 6px;\n width: 160px;\n box-sizing: border-box;\n cursor: pointer;\n\n &:hover {\n border-color: var(--color-primary-base, #2563eb);\n }\n\n &:focus-visible {\n outline: none;\n border-color: var(--color-primary-base, #2563eb);\n }\n`;\n\nconst Caret = styled.span`\n position: absolute;\n right: 7px;\n top: 50%;\n transform: translateY(-50%);\n pointer-events: none;\n font-size: 9px;\n color: var(--text-color-secondary, #64748b);\n`;\n\nconst Listbox = styled.ul`\n position: absolute;\n z-index: 30;\n top: calc(100% + 4px);\n left: 0;\n margin: 0;\n padding: 4px;\n list-style: none;\n min-width: 210px;\n max-height: 260px;\n overflow-y: auto;\n background: var(--bg-color, #ffffff);\n border: 1px solid var(--border-color-secondary, #e5e9f0);\n border-radius: 16px;\n box-shadow: 0 8px 24px rgba(15, 20, 40, 0.14);\n`;\n\nconst Option = styled.li<{ $active: boolean }>`\n padding: 5px 10px;\n border-radius: 5px;\n font-size: 13px;\n cursor: pointer;\n color: var(--text-color-primary, #1b2430);\n background: ${(p) => (p.$active ? 'var(--color-primary-bg, #eff4fe)' : 'transparent')};\n`;\n\nconst Empty = styled.li`\n padding: 5px 10px;\n font-size: 12px;\n color: var(--text-color-secondary, #64748b);\n`;\n\nexport interface ComboboxProps {\n value: string;\n options: string[];\n onChange: (value: string) => void;\n ariaLabel: string;\n placeholder?: string;\n width?: number;\n}\n\nexport function Combobox({\n value,\n options,\n onChange,\n ariaLabel,\n placeholder,\n width,\n}: ComboboxProps) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState<string | null>(null);\n const [activeIndex, setActiveIndex] = useState(0);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const listRef = useRef<HTMLUListElement>(null);\n const listboxId = useId();\n\n const filtered = useMemo(() => {\n if (query === null || query === '') return options;\n const q = query.toLowerCase();\n return options.filter((o) => o.toLowerCase().includes(q));\n }, [options, query]);\n\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (event: PointerEvent) => {\n if (!wrapperRef.current?.contains(event.target as Node)) {\n setOpen(false);\n setQuery(null);\n }\n };\n document.addEventListener('pointerdown', onPointerDown);\n return () => document.removeEventListener('pointerdown', onPointerDown);\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n const item = listRef.current?.children[activeIndex] as HTMLElement | undefined;\n item?.scrollIntoView({ block: 'nearest' });\n }, [activeIndex, open]);\n\n const commit = (option: string) => {\n onChange(option);\n setOpen(false);\n setQuery(null);\n };\n\n const onKeyDown = (event: React.KeyboardEvent) => {\n if (!open && (event.key === 'ArrowDown' || event.key === 'Enter')) {\n setOpen(true);\n setActiveIndex(Math.max(0, filtered.indexOf(value)));\n event.preventDefault();\n return;\n }\n if (!open) return;\n switch (event.key) {\n case 'ArrowDown':\n setActiveIndex((i) => Math.min(i + 1, filtered.length - 1));\n event.preventDefault();\n break;\n case 'ArrowUp':\n setActiveIndex((i) => Math.max(i - 1, 0));\n event.preventDefault();\n break;\n case 'Enter':\n if (filtered[activeIndex]) commit(filtered[activeIndex]);\n event.preventDefault();\n break;\n case 'Escape':\n setOpen(false);\n setQuery(null);\n event.preventDefault();\n break;\n }\n };\n\n return (\n <Wrapper ref={wrapperRef}>\n <Trigger\n role=\"combobox\"\n aria-expanded={open}\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-label={ariaLabel}\n aria-activedescendant={open ? `${listboxId}-${activeIndex}` : undefined}\n value={query ?? value}\n placeholder={placeholder ?? 'Select...'}\n style={width ? { width } : undefined}\n onChange={(e) => {\n setQuery(e.target.value);\n setActiveIndex(0);\n setOpen(true);\n }}\n onClick={() => {\n setOpen((o) => !o);\n setActiveIndex(Math.max(0, filtered.indexOf(value)));\n }}\n onKeyDown={onKeyDown}\n onBlur={() => {\n setTimeout(() => setQuery(null), 150);\n }}\n />\n <Caret aria-hidden>▾</Caret>\n {open && (\n <Listbox role=\"listbox\" id={listboxId} ref={listRef}>\n {filtered.length === 0 && <Empty>No matches</Empty>}\n {filtered.map((option, index) => (\n <Option\n key={option}\n id={`${listboxId}-${index}`}\n role=\"option\"\n aria-selected={option === value}\n $active={index === activeIndex}\n onMouseEnter={() => setActiveIndex(index)}\n onMouseDown={(e) => {\n e.preventDefault();\n commit(option);\n }}\n >\n {option}\n </Option>\n ))}\n </Listbox>\n )}\n </Wrapper>\n );\n}\n","import { useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { NODE_TYPES } from '../constants';\nimport type { SubjectObject } from '../types';\nimport { hasSubjectProperty, type RuleErrors } from '../validation';\nimport { ChipListInput } from './controls/ChipListInput';\nimport { Combobox } from './controls/Combobox';\nimport {\n Chevron,\n FieldSquiggle,\n Keyword,\n MonoInput,\n InlineInput,\n SentenceRow,\n} from './controls/primitives';\nimport { Segmented } from './controls/Segmented';\n\nexport interface SubjectEditorProps {\n subject: SubjectObject;\n onChange: (subject: SubjectObject) => void;\n lead: string;\n ariaPrefix: string;\n errors: RuleErrors;\n errorPrefix: string;\n}\n\nfunction propertyAsText(property: SubjectObject['property']): string {\n if (!property) return '';\n return Array.isArray(property) ? property.join(', ') : property;\n}\n\nfunction textAsProperty(text: string): SubjectObject['property'] {\n const parts = text\n .split(',')\n .map((part) => part.trim())\n .filter(Boolean);\n if (parts.length === 0) return undefined;\n return parts.length === 1 ? parts[0] : parts;\n}\n\nexport function SubjectEditor({\n subject,\n onChange,\n lead,\n ariaPrefix,\n errors,\n errorPrefix,\n}: SubjectEditorProps) {\n const hasProperty = hasSubjectProperty(subject);\n const hasAdvanced = Boolean(\n subject.filterInParentKeys?.length ||\n subject.filterOutParentKeys?.length ||\n subject.matchParentKeys,\n );\n const [advancedOpen, setAdvancedOpen] = useState(hasAdvanced);\n const [propertyDraft, setPropertyDraft] = useState(propertyAsText(subject.property));\n const lastPropertyRef = useRef(propertyAsText(subject.property));\n\n const setTargetMode = (mode: 'node' | 'property') => {\n if (mode === 'node') {\n if (hasProperty) lastPropertyRef.current = propertyAsText(subject.property);\n setPropertyDraft('');\n onChange({ ...subject, property: undefined });\n } else {\n const restored = lastPropertyRef.current;\n setPropertyDraft(restored);\n onChange({ ...subject, property: textAsProperty(restored) ?? '' });\n }\n };\n\n return (\n <>\n <SentenceRow>\n <span>{lead}</span>\n <FieldSquiggle error={errors[`${errorPrefix}type`]}>\n <Combobox\n ariaLabel={`${ariaPrefix} node type`}\n value={subject.type}\n options={NODE_TYPES}\n onChange={(type) => onChange({ ...subject, type })}\n />\n </FieldSquiggle>\n <span>node, check</span>\n <Segmented<'node' | 'property'>\n ariaLabel={`${ariaPrefix} target`}\n value={hasProperty || subject.property === '' ? 'property' : 'node'}\n onChange={setTargetMode}\n options={[\n { value: 'node', label: 'whole node' },\n { value: 'property', label: 'single property' },\n ]}\n />\n {(hasProperty || subject.property === '') && (\n <InlineInput\n aria-label={`${ariaPrefix} property name`}\n value={propertyDraft}\n placeholder=\"e.g. summary\"\n style={{ width: 140 }}\n onChange={(e) => {\n setPropertyDraft(e.target.value);\n onChange({ ...subject, property: textAsProperty(e.target.value) ?? '' });\n }}\n />\n )}\n </SentenceRow>\n <Accordion>\n <AccordionHead\n type=\"button\"\n aria-expanded={advancedOpen}\n onClick={() => setAdvancedOpen((open) => !open)}\n >\n <Chevron open={advancedOpen} /> Advanced\n {!advancedOpen && hasAdvanced && <ActiveDot title=\"Parent-key filters are set\" />}\n </AccordionHead>\n {advancedOpen && (\n <AccordionBody>\n <AdvRow>\n <Keyword>under parent keys</Keyword>\n <ChipListInput\n ariaLabel={`${ariaPrefix} filterInParentKeys`}\n values={subject.filterInParentKeys ?? []}\n placeholder=\"post, put…\"\n onChange={(values) =>\n onChange({ ...subject, filterInParentKeys: values.length ? values : undefined })\n }\n />\n </AdvRow>\n <AdvRow>\n <Keyword>not under parent keys</Keyword>\n <ChipListInput\n ariaLabel={`${ariaPrefix} filterOutParentKeys`}\n values={subject.filterOutParentKeys ?? []}\n placeholder=\"none\"\n onChange={(values) =>\n onChange({ ...subject, filterOutParentKeys: values.length ? values : undefined })\n }\n />\n </AdvRow>\n <AdvRow>\n <Keyword>under parent keys matching</Keyword>\n <FieldSquiggle error={errors[`${errorPrefix}matchParentKeys`]}>\n <MonoInput\n aria-label={`${ariaPrefix} matchParentKeys regex`}\n value={subject.matchParentKeys ?? ''}\n placeholder=\"^x-\"\n style={{ width: 140 }}\n onChange={(e) =>\n onChange({ ...subject, matchParentKeys: e.target.value || undefined })\n }\n />\n </FieldSquiggle>\n </AdvRow>\n </AccordionBody>\n )}\n </Accordion>\n </>\n );\n}\n\nconst Accordion = styled.div`\n margin-top: 10px;\n border: 1px solid var(--border-color-secondary, #e5e9f0);\n border-radius: 12px;\n overflow: hidden;\n`;\n\nconst AccordionHead = styled.button`\n width: 100%;\n display: flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n cursor: pointer;\n padding: 8px 12px;\n font: inherit;\n font-size: 12.5px;\n font-weight: 600;\n color: var(--text-color-secondary, #64748b);\n text-align: left;\n\n &:hover {\n color: var(--color-primary-base, #2563eb);\n }\n\n &:focus-visible {\n outline: 2px solid var(--color-primary-base, #2563eb);\n outline-offset: -2px;\n }\n`;\n\nconst ActiveDot = styled.span`\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--color-primary-base, #2563eb);\n`;\n\nconst AccordionBody = styled.div`\n border-top: 1px solid var(--border-color-secondary, #e5e9f0);\n padding: 6px 8px;\n display: flex;\n flex-direction: column;\n gap: 2px;\n`;\n\nconst AdvRow = styled(SentenceRow)`\n padding: 3px 4px;\n border-radius: 8px;\n\n &:hover {\n background: var(--color-warm-grey-1, #fbfbfc);\n }\n`;\n","import { useMemo, useRef } from 'react';\nimport styled, { css } from 'styled-components';\nimport { MESSAGE_PLACEHOLDERS } from '../constants';\nimport { makeId, type RuleEntry } from '../state';\nimport { MONO_FONT_FAMILY, SECTION_TONES, SEVERITY_COLORS, SUCCESS_COLORS } from '../styles';\nimport type { ConfigurableRule, WhereObject } from '../types';\nimport { validateRule } from '../validation';\nimport { AssertionsEditor } from './AssertionsEditor';\nimport { ChipListInput } from './controls/ChipListInput';\nimport {\n Chevron,\n FieldSquiggle,\n InlineInput,\n Keyword,\n Section,\n SentenceRow,\n} from './controls/primitives';\nimport { SeverityPill } from './controls/SeverityPill';\nimport { SubjectEditor } from './SubjectEditor';\n\nexport interface RuleCardProps {\n entry: RuleEntry;\n selected: boolean;\n matchCount: number;\n isDuplicateName: boolean;\n isEvaluating: boolean;\n onToggle: () => void;\n onChange: (entry: RuleEntry) => void;\n onRemove: () => void;\n}\n\nconst NEW_WHERE_ENTRY: WhereObject = {\n subject: { type: 'PathItem' },\n assertions: { defined: true },\n};\n\nexport function RuleCard({\n entry,\n selected,\n matchCount,\n isDuplicateName,\n isEvaluating,\n onToggle,\n onChange,\n onRemove,\n}: RuleCardProps) {\n const { name, rule } = entry;\n const messageRef = useRef<HTMLTextAreaElement>(null);\n const errors = useMemo(() => validateRule(name, rule), [name, rule]);\n\n const patch = (partial: Partial<ConfigurableRule>) => {\n onChange({ ...entry, rule: { ...rule, ...partial } });\n };\n\n const whereEntries = rule.where ?? [];\n const whereKeysRef = useRef<string[]>([]);\n while (whereKeysRef.current.length < whereEntries.length) {\n whereKeysRef.current.push(makeId());\n }\n if (whereKeysRef.current.length > whereEntries.length) {\n whereKeysRef.current.length = whereEntries.length;\n }\n\n const patchWhere = (index: number, whereEntry: WhereObject) => {\n const where = [...whereEntries];\n where[index] = whereEntry;\n patch({ where });\n };\n\n const removeWhere = (index: number) => {\n whereKeysRef.current.splice(index, 1);\n patch({ where: whereEntries.filter((_, i) => i !== index) });\n };\n\n const insertPlaceholder = (placeholder: string) => {\n const input = messageRef.current;\n const message = rule.message ?? '';\n const at = input?.selectionStart ?? message.length;\n patch({ message: message.slice(0, at) + placeholder + message.slice(at) });\n requestAnimationFrame(() => {\n input?.focus();\n input?.setSelectionRange(at + placeholder.length, at + placeholder.length);\n });\n };\n\n const nameError = errors.name ?? (isDuplicateName ? 'Rule names must be unique' : undefined);\n const severity = rule.severity ?? 'error';\n\n return (\n <Card $selected={selected}>\n <Header onClick={onToggle}>\n <ChevronButton\n type=\"button\"\n aria-expanded={selected}\n aria-label={`${selected ? 'Collapse' : 'Expand'} rule ${name}`}\n onClick={(e) => {\n e.stopPropagation();\n onToggle();\n }}\n >\n <Chevron open={selected} />\n </ChevronButton>\n <NameWrap onClick={(e) => selected && e.stopPropagation()}>\n <NamePrefix>rule/</NamePrefix>\n {selected ? (\n <FieldSquiggle error={nameError} style={{ flex: 1 }}>\n <NameInput\n aria-label=\"Rule name\"\n value={name}\n onChange={(e) => onChange({ ...entry, name: e.target.value.replace(/\\s+/g, '-') })}\n />\n </FieldSquiggle>\n ) : (\n <StaticName>{name}</StaticName>\n )}\n </NameWrap>\n <Meta>\n {selected ? (\n <SeverityPill value={severity} onChange={(next) => patch({ severity: next })} />\n ) : (\n <Badge\n style={{\n background: SEVERITY_COLORS[severity].bg,\n color: SEVERITY_COLORS[severity].fg,\n }}\n >\n {severity}\n </Badge>\n )}\n {matchCount > 0 ? (\n <Badge\n key={matchCount}\n $dim={isEvaluating}\n title=\"Nodes matched in the current document\"\n style={{ background: SUCCESS_COLORS.bg, color: SUCCESS_COLORS.fg }}\n >\n {matchCount} matched\n </Badge>\n ) : (\n <Badge\n key=\"none\"\n $dim={isEvaluating}\n title=\"The subject and where conditions match no nodes in this document\"\n style={{ background: SEVERITY_COLORS.warn.bg, color: SEVERITY_COLORS.warn.fg }}\n >\n no matches\n </Badge>\n )}\n <RemoveButton\n type=\"button\"\n aria-label={`Remove rule ${name}`}\n title=\"Remove rule\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" aria-hidden>\n <path d=\"M2.5 6h7\" stroke=\"currentColor\" strokeWidth=\"1.7\" strokeLinecap=\"round\" />\n </svg>\n </RemoveButton>\n </Meta>\n </Header>\n\n {selected && (\n <Body>\n <Section tone=\"subject\" label=\"Subject\" hint=\"what the rule checks\">\n <SubjectEditor\n lead=\"On each\"\n subject={rule.subject}\n ariaPrefix=\"Subject\"\n errors={errors}\n errorPrefix=\"subject.\"\n onChange={(subject) => patch({ subject })}\n />\n </Section>\n\n <Section\n tone=\"where\"\n label=\"Where\"\n hint=\"narrows top-to-bottom — each condition is a descendant of the previous one\"\n >\n {whereEntries.map((whereEntry, index) => (\n <WhereBlock key={whereKeysRef.current[index]} style={{ marginTop: index ? 8 : 0 }}>\n <WhereTop>\n <WhereKw>where</WhereKw>\n {index > 0 && <Descends>descendant of condition {index}</Descends>}\n <WhereX\n type=\"button\"\n aria-label={`Remove where condition ${index + 1}`}\n onClick={() => removeWhere(index)}\n >\n ×\n </WhereX>\n </WhereTop>\n <SubjectEditor\n lead=\"inside a\"\n subject={whereEntry.subject}\n ariaPrefix={`Where ${index + 1}`}\n errors={errors}\n errorPrefix={`where:${index}.`}\n onChange={(subject) => patchWhere(index, { ...whereEntry, subject })}\n />\n <AssertionsEditor\n tone=\"where\"\n keyword=\"that satisfies\"\n assertions={whereEntry.assertions}\n errors={errors}\n errorPrefix={`where:${index}.`}\n onChange={(assertions) => patchWhere(index, { ...whereEntry, assertions })}\n />\n </WhereBlock>\n ))}\n <AddButton\n type=\"button\"\n $tone={SECTION_TONES.where.fg}\n onClick={() => patch({ where: [...whereEntries, structuredClone(NEW_WHERE_ENTRY)] })}\n >\n + Add condition\n </AddButton>\n </Section>\n\n <Section\n tone=\"assert\"\n label=\"Assert\"\n hint=\"flags a problem when an assertion evaluates to false\"\n >\n <AssertionsEditor\n tone=\"assert\"\n keyword=\"assert\"\n assertions={rule.assertions}\n errors={errors}\n errorPrefix=\"\"\n onChange={(assertions) => patch({ assertions })}\n />\n </Section>\n\n <Section\n tone=\"message\"\n label=\"Message\"\n hint=\"optional — click a placeholder to insert it\"\n >\n <SentenceRow>\n <Keyword>message</Keyword>\n <MessageInput\n ref={messageRef}\n aria-label=\"Problem message\"\n rows={1}\n value={rule.message ?? ''}\n placeholder=\"Problem message (optional)\"\n onChange={(e) => patch({ message: e.target.value || undefined })}\n />\n </SentenceRow>\n <ChipRow>\n {MESSAGE_PLACEHOLDERS.map((placeholder) => (\n <PlaceholderChip\n key={placeholder}\n type=\"button\"\n onClick={() => insertPlaceholder(placeholder)}\n >\n {placeholder}\n </PlaceholderChip>\n ))}\n </ChipRow>\n <SentenceRow style={{ marginTop: 8 }}>\n <Keyword>reference</Keyword>\n <InlineInput\n aria-label=\"Reference link\"\n value={rule.reference ?? ''}\n placeholder=\"Link to the style guide entry (optional)\"\n style={{ flex: 1 }}\n onChange={(e) => patch({ reference: e.target.value || undefined })}\n />\n </SentenceRow>\n </Section>\n\n <Section\n tone=\"suggest\"\n label=\"Suggest\"\n hint=\"suggestions to display when the problem occurs\"\n >\n <ChipListInput\n ariaLabel=\"Suggestions\"\n values={rule.suggest ?? []}\n placeholder=\"add a suggestion…\"\n onChange={(suggest) => patch({ suggest: suggest.length ? suggest : undefined })}\n />\n </Section>\n </Body>\n )}\n </Card>\n );\n}\n\nconst Card = styled.div<{ $selected: boolean }>`\n background: var(--bg-color, #ffffff);\n border: 1px solid var(--border-color-secondary, #e5e9f0);\n border-radius: 16px;\n overflow: hidden;\n flex-shrink: 0;\n\n ${(p) =>\n p.$selected &&\n css`\n border-color: var(--color-primary-base, #2563eb);\n `}\n`;\n\nconst Header = styled.div`\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 11px 14px;\n cursor: pointer;\n min-width: 0;\n`;\n\nconst ChevronButton = styled.button`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n color: var(--color-warm-grey-6, #94a3b8);\n padding: 2px;\n border-radius: 8px;\n cursor: pointer;\n flex-shrink: 0;\n\n &:hover {\n color: var(--color-primary-base, #2563eb);\n background: var(--color-warm-grey-1, #fbfbfc);\n }\n\n &:focus-visible {\n outline: 2px solid var(--color-primary-base, #2563eb);\n }\n`;\n\nconst NameWrap = styled.div`\n display: flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n flex: 1;\n`;\n\nconst NamePrefix = styled.span`\n color: var(--color-warm-grey-6, #94a3b8);\n font-family: ${MONO_FONT_FAMILY};\n font-size: 13px;\n flex-shrink: 0;\n`;\n\nconst NameInput = styled.input`\n border: none;\n border-bottom: 1px dashed var(--border-color-primary, #d6dde8);\n background: transparent;\n font-family: ${MONO_FONT_FAMILY};\n font-size: 13px;\n color: inherit;\n outline: none;\n flex: 1;\n min-width: 80px;\n max-width: 240px;\n\n &:focus {\n border-bottom-color: var(--color-primary-base, #2563eb);\n }\n`;\n\nconst StaticName = styled.span`\n font-family: ${MONO_FONT_FAMILY};\n font-size: 13px;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nconst Meta = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n margin-left: auto;\n`;\n\nexport const Badge = styled.span<{ $dim?: boolean }>`\n font-size: 12px;\n font-weight: 600;\n border-radius: 999px;\n padding: 4px 12px;\n white-space: nowrap;\n display: inline-block;\n animation: crb-count-pop 0.45s ease-out;\n opacity: ${(p) => (p.$dim ? 0.5 : 1)};\n transition: opacity 0.15s;\n\n @keyframes crb-count-pop {\n 0% {\n transform: scale(0.86);\n }\n 55% {\n transform: scale(1.08);\n }\n 100% {\n transform: scale(1);\n }\n }\n`;\n\nconst RemoveButton = styled.button`\n width: 28px;\n height: 28px;\n border-radius: 8px;\n flex-shrink: 0;\n border: 1px solid var(--border-color-primary, #d6dde8);\n background: var(--bg-color, #ffffff);\n color: var(--color-warm-grey-6, #94a3b8);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n\n &:hover {\n border-color: var(--color-error-base, #dc2626);\n background: var(--color-error-bg, #fef2f2);\n color: var(--color-error-base, #dc2626);\n }\n\n &:focus-visible {\n outline: 2px solid var(--color-primary-base, #2563eb);\n }\n`;\n\nconst Body = styled.div`\n padding: 2px 16px 14px;\n border-top: 1px solid var(--border-color-secondary, #e5e9f0);\n`;\n\nconst WhereBlock = styled.div`\n display: flex;\n flex-direction: column;\n gap: 8px;\n background: var(--color-warm-grey-1, #fbfbfc);\n border: 1px solid var(--border-color-secondary, #e5e9f0);\n border-left: 3px solid ${SECTION_TONES.where.fg};\n border-radius: 12px;\n padding: 10px 14px;\n`;\n\nconst WhereTop = styled.div`\n display: flex;\n align-items: center;\n gap: 10px;\n`;\n\nconst WhereKw = styled.span`\n font-size: 12.5px;\n color: ${SECTION_TONES.where.fg};\n font-style: italic;\n font-weight: 600;\n`;\n\nconst Descends = styled.span`\n font-size: 11.5px;\n color: var(--text-color-secondary, #64748b);\n`;\n\nconst WhereX = styled.button`\n background: none;\n border: none;\n cursor: pointer;\n color: var(--color-warm-grey-6, #94a3b8);\n font-size: 15px;\n margin-left: auto;\n line-height: 1;\n\n &:hover {\n color: var(--color-error-base, #dc2626);\n }\n`;\n\nconst AddButton = styled.button<{ $tone: string }>`\n align-self: flex-start;\n margin-top: 8px;\n background: none;\n border: none;\n color: ${(p) => p.$tone};\n font: inherit;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n padding: 4px 2px;\n\n &:focus-visible {\n outline: 2px solid ${(p) => p.$tone};\n }\n`;\n\nconst MessageInput = styled.textarea`\n flex: 1;\n min-height: 30px;\n resize: vertical;\n border: 1px solid var(--border-color-secondary, #e5e9f0);\n border-radius: 10px;\n background: var(--bg-color, #ffffff);\n color: var(--text-color-primary, #1b2430);\n font: inherit;\n font-size: 13px;\n line-height: 1.4;\n padding: 4px 8px;\n box-sizing: border-box;\n\n &:focus {\n outline: none;\n border-color: var(--color-primary-base, #2563eb);\n }\n\n &::placeholder {\n color: var(--text-color-secondary, #64748b);\n opacity: 0.8;\n }\n`;\n\nconst ChipRow = styled(SentenceRow)`\n margin-top: 10px;\n`;\n\nconst PlaceholderChip = styled.button`\n font: inherit;\n font-size: 11px;\n font-family: ${MONO_FONT_FAMILY};\n color: ${SECTION_TONES.message.fg};\n background: ${SECTION_TONES.message.soft};\n border: none;\n border-radius: 8px;\n padding: 3px 8px;\n cursor: pointer;\n\n &:hover {\n filter: brightness(0.96);\n }\n\n &:focus-visible {\n outline: 2px solid ${SECTION_TONES.message.fg};\n }\n`;\n","import styled from 'styled-components';\nimport type { RuleEntry } from '../state';\nimport { ConfigPreview, type ConfigPreviewProps } from './ConfigPreview';\nimport { ImportPanel, type ImportPanelProps } from './ImportPanel';\nimport { RuleCard } from './RuleCard';\nimport { PrimaryButton } from './controls/primitives';\n\nexport interface RuleListProps {\n entries: RuleEntry[];\n selectedId: string | null;\n matchCountById: Record<string, number>;\n onToggle: (id: string) => void;\n onChangeEntry: (entry: RuleEntry) => void;\n onRemove: (id: string) => void;\n onAdd: () => void;\n isEvaluating: boolean;\n importProps: ImportPanelProps;\n configPreviewProps: ConfigPreviewProps;\n}\n\nexport function RuleList({\n entries,\n selectedId,\n matchCountById,\n onToggle,\n onChangeEntry,\n onRemove,\n onAdd,\n isEvaluating,\n importProps,\n configPreviewProps,\n}: RuleListProps) {\n const names = entries.map((entry) => entry.name);\n return (\n <Column>\n <Head>\n <Title>Rules</Title>\n <Count>{entries.length}</Count>\n <Spacer />\n <ImportPanel {...importProps} />\n <ConfigPreview {...configPreviewProps} />\n <PrimaryButton type=\"button\" onClick={onAdd}>\n + Add rule\n </PrimaryButton>\n </Head>\n <ScrollArea>\n {entries.map((entry) => (\n <RuleCard\n key={entry.id}\n entry={entry}\n selected={entry.id === selectedId}\n matchCount={matchCountById[entry.id] ?? 0}\n isDuplicateName={names.filter((name) => name === entry.name).length > 1}\n isEvaluating={isEvaluating}\n onToggle={() => onToggle(entry.id)}\n onChange={onChangeEntry}\n onRemove={() => onRemove(entry.id)}\n />\n ))}\n </ScrollArea>\n </Column>\n );\n}\n\nconst Column = styled.div`\n display: flex;\n flex-direction: column;\n min-height: 0;\n gap: 12px;\n`;\n\nconst Head = styled.div`\n display: flex;\n align-items: center;\n gap: 10px;\n flex-shrink: 0;\n flex-wrap: wrap;\n background: var(--bg-color, #ffffff);\n border: 1px solid var(--border-color-secondary, #e5e9f0);\n border-radius: 12px;\n padding: 10px 14px;\n`;\n\nconst Title = styled.span`\n font-size: 14.5px;\n font-weight: 700;\n color: var(--text-color-primary, #1b2430);\n`;\n\nconst Count = styled.span`\n background: var(--color-warm-grey-1, #fbfbfc);\n color: var(--text-color-secondary, #64748b);\n font-size: 11.5px;\n font-weight: 700;\n border-radius: 999px;\n padding: 2px 9px;\n`;\n\nconst Spacer = styled.span`\n flex: 1;\n`;\n\nconst ScrollArea = styled.div`\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-height: 0;\n overflow-y: auto;\n padding-right: 4px;\n\n @media (max-width: 1024px) {\n overflow-y: visible;\n }\n`;\n","import styled from 'styled-components';\n\nexport interface RulerMarker {\n line: number;\n from: number;\n to: number;\n kind: 'match' | 'error' | 'warn';\n title?: string;\n}\n\nexport interface OverviewRulerProps {\n markers: RulerMarker[];\n totalLines: number;\n onMarkerClick: (marker: RulerMarker) => void;\n}\n\nexport function OverviewRuler({ markers, totalLines, onMarkerClick }: OverviewRulerProps) {\n return (\n <Strip>\n {markers.map((marker, index) => (\n <Marker\n key={index}\n type=\"button\"\n $kind={marker.kind}\n title={marker.title}\n aria-label={`Jump to line ${marker.line}`}\n style={{ top: `${((marker.line - 0.5) / totalLines) * 100}%` }}\n onClick={() => onMarkerClick(marker)}\n />\n ))}\n </Strip>\n );\n}\n\nconst Strip = styled.div`\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n width: 12px;\n z-index: 5;\n pointer-events: none;\n background: transparent;\n`;\n\nconst Marker = styled.button<{ $kind: RulerMarker['kind'] }>`\n position: absolute;\n right: 2px;\n width: ${(p) => (p.$kind === 'match' ? '4px' : '8px')};\n height: 3px;\n border: none;\n border-radius: 1px;\n padding: 0;\n cursor: pointer;\n pointer-events: auto;\n background: ${(p) =>\n p.$kind === 'error'\n ? 'var(--color-error-base, #dc2626)'\n : p.$kind === 'warn'\n ? 'var(--color-warning-text, #b45309)'\n : `color-mix(in srgb, var(--color-info-base, #2563eb) 60%, transparent)`};\n`;\n","import { defaultKeymap, history, historyKeymap } from '@codemirror/commands';\nimport { yaml } from '@codemirror/lang-yaml';\nimport { defaultHighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport {\n EditorState,\n RangeSet,\n StateEffect,\n StateField,\n type Range,\n type Text,\n} from '@codemirror/state';\nimport {\n Decoration,\n EditorView,\n GutterMarker,\n gutter,\n hoverTooltip,\n keymap,\n lineNumbers,\n} from '@codemirror/view';\nimport type { DecorationSet } from '@codemirror/view';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { FONT_FAMILY, MONO_FONT_FAMILY } from '../styles';\nimport type { HostAdapters } from '../types';\nimport { OverviewRuler, type RulerMarker } from './OverviewRuler';\nimport { ToolbarButton } from './controls/primitives';\n\nexport interface FailRange {\n from: number;\n to: number;\n messages: string[];\n severity: 'error' | 'warn';\n}\n\nexport interface SpecHighlights {\n matchKeys: { from: number; to: number }[];\n matchBlocks: { from: number; to: number }[];\n matchProps: { from: number; to: number }[];\n fails: FailRange[];\n}\n\nexport const EMPTY_HIGHLIGHTS: SpecHighlights = {\n matchKeys: [],\n matchBlocks: [],\n matchProps: [],\n fails: [],\n};\n\nconst Panel = styled.div`\n display: flex;\n flex-direction: column;\n min-height: 0;\n height: 100%;\n border: 1px solid var(--border-color-secondary, #e5e9f0);\n border-radius: 16px;\n background: var(--bg-color, #ffffff);\n overflow: hidden;\n`;\n\nconst Toolbar = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n border-bottom: 1px solid var(--border-color-secondary, #e5e9f0);\n`;\n\nconst FileName = styled.span`\n font-family: ${MONO_FONT_FAMILY};\n font-size: 13px;\n color: var(--text-color-secondary, #64748b);\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nconst UploadError = styled.span`\n color: var(--color-error-base, #dc2626);\n font-size: 12px;\n`;\n\nconst MatchPill = styled.button`\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font: inherit;\n font-size: 11.5px;\n font-weight: 700;\n border: none;\n border-radius: 999px;\n padding: 2px 9px;\n white-space: nowrap;\n cursor: pointer;\n color: var(--color-info-base, #2563eb);\n background: color-mix(in srgb, var(--color-info-base, #2563eb) 12%, transparent);\n\n &:hover {\n background: color-mix(in srgb, var(--color-info-base, #2563eb) 20%, transparent);\n }\n\n &:focus-visible {\n outline: 2px solid var(--color-info-base, #2563eb);\n outline-offset: 1px;\n }\n`;\n\nconst MatchPillPosition = styled.span`\n font-weight: 600;\n opacity: 0.75;\n`;\n\nconst NoMatchPill = styled.span`\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: 11.5px;\n font-weight: 700;\n border-radius: 999px;\n padding: 2px 9px;\n white-space: nowrap;\n color: var(--color-warning-text, #b45309);\n background: var(--color-warning-bg, #fef3e2);\n`;\n\nconst NoMatchDot = styled.span`\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--color-warning-text, #b45309);\n`;\n\nconst NoMatchBanner = styled.div`\n font-size: 12.5px;\n line-height: 1.45;\n color: var(--color-warning-text, #b45309);\n background: var(--color-warning-bg, #fef3e2);\n border-bottom: 1px solid var(--border-color-secondary, #e5e9f0);\n padding: 8px 12px;\n`;\n\nconst EditorHost = styled.div`\n position: relative;\n flex: 1;\n min-height: 0;\n\n .cm-editor {\n height: 100%;\n font-size: 13px;\n }\n\n .cm-scroller {\n font-family: ${MONO_FONT_FAMILY};\n overflow: auto;\n padding-right: 12px;\n }\n\n .cm-rb-match-block {\n background: color-mix(in srgb, var(--color-info-base, #2563eb) 8%, transparent);\n }\n\n .cm-rb-match-key {\n background: color-mix(in srgb, var(--color-info-base, #2563eb) 16%, transparent);\n border-radius: 2px;\n font-weight: 700;\n }\n\n .cm-rb-match-prop {\n background: color-mix(in srgb, var(--color-info-base, #2563eb) 16%, transparent);\n border-radius: 2px;\n }\n\n .cm-rb-fail-error {\n text-decoration: underline wavy var(--color-error-base, #dc2626);\n text-decoration-thickness: 2px;\n text-underline-offset: 3px;\n }\n\n .cm-rb-fail-warn {\n text-decoration: underline wavy var(--color-warning-text, #b45309);\n text-decoration-thickness: 2px;\n text-underline-offset: 3px;\n }\n\n .cm-rb-line-error {\n background: color-mix(in srgb, var(--color-error-base, #dc2626) 9%, transparent);\n box-shadow: inset 3px 0 0 var(--color-error-base, #dc2626);\n }\n\n .cm-rb-line-warn {\n background: color-mix(in srgb, var(--color-warning-text, #b45309) 12%, transparent);\n box-shadow: inset 3px 0 0 var(--color-warning-text, #b45309);\n }\n\n .cm-rb-gutter {\n width: 18px;\n background: var(--bg-color, #ffffff);\n }\n\n .cm-rb-gutter-marker {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n font-size: 10px;\n font-weight: 700;\n line-height: 1;\n color: #fff;\n cursor: default;\n }\n\n .cm-rb-gutter-marker span {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 13px;\n height: 13px;\n border-radius: 50%;\n }\n\n .cm-rb-gutter-error span {\n background: var(--color-error-base, #dc2626);\n }\n\n .cm-rb-gutter-warn span {\n background: var(--color-warning-text, #b45309);\n }\n\n .cm-rb-flash {\n background: color-mix(in srgb, var(--color-primary-base, #2563eb) 22%, transparent);\n animation: cm-rb-flash-fade 1.4s ease-out forwards;\n }\n\n @keyframes cm-rb-flash-fade {\n from {\n background: color-mix(in srgb, var(--color-primary-base, #2563eb) 34%, transparent);\n }\n to {\n background: transparent;\n }\n }\n\n .cm-rb-tooltip {\n max-width: 420px;\n padding: 6px 10px;\n white-space: pre-line;\n font-family: ${FONT_FAMILY};\n font-size: 12px;\n line-height: 1.45;\n color: var(--text-color-primary, #1b2430);\n background: var(--bg-color, #ffffff);\n border: 1px solid var(--color-error-base, #dc2626);\n border-radius: 12px;\n }\n`;\n\nconst setHighlights = StateEffect.define<DecorationSet>();\nconst setGutterMarkers = StateEffect.define<RangeSet<GutterMarker>>();\nconst setFlash = StateEffect.define<{ from: number; to: number } | null>();\n\nclass SeverityGutterMarker extends GutterMarker {\n constructor(private readonly severity: 'error' | 'warn') {\n super();\n }\n\n eq(other: SeverityGutterMarker) {\n return other.severity === this.severity;\n }\n\n toDOM() {\n const wrap = document.createElement('div');\n wrap.className = `cm-rb-gutter-marker cm-rb-gutter-${this.severity}`;\n const dot = document.createElement('span');\n dot.textContent = '!';\n wrap.appendChild(dot);\n return wrap;\n }\n}\n\nconst gutterMarkerField = StateField.define<RangeSet<GutterMarker>>({\n create: () => RangeSet.empty,\n update(value, tr) {\n let next = value.map(tr.changes);\n for (const effect of tr.effects) {\n if (effect.is(setGutterMarkers)) next = effect.value;\n }\n return next;\n },\n});\n\nconst highlightField = StateField.define<DecorationSet>({\n create: () => Decoration.none,\n update(value, tr) {\n let next = value.map(tr.changes);\n for (const effect of tr.effects) {\n if (effect.is(setHighlights)) next = effect.value;\n }\n return next;\n },\n provide: (field) => EditorView.decorations.from(field),\n});\n\nconst flashDecoration = Decoration.mark({ class: 'cm-rb-flash' });\n\nconst flashField = StateField.define<DecorationSet>({\n create: () => Decoration.none,\n update(value, tr) {\n let next = value.map(tr.changes);\n for (const effect of tr.effects) {\n if (effect.is(setFlash)) {\n next = effect.value\n ? Decoration.set([flashDecoration.range(effect.value.from, effect.value.to)])\n : Decoration.none;\n }\n }\n return next;\n },\n provide: (field) => EditorView.decorations.from(field),\n});\n\nconst LINE_DECORATIONS = {\n error: Decoration.line({ class: 'cm-rb-line-error' }),\n warn: Decoration.line({ class: 'cm-rb-line-warn' }),\n};\n\nfunction failsByLine(fails: FailRange[], doc: Text) {\n const byLine = new Map<\n number,\n { lineFrom: number; severity: 'error' | 'warn'; messages: string[] }\n >();\n for (const fail of fails) {\n if (fail.from > doc.length) continue;\n const line = doc.lineAt(fail.from);\n const entry = byLine.get(line.number) ?? {\n lineFrom: line.from,\n severity: fail.severity,\n messages: [],\n };\n if (fail.severity === 'error') entry.severity = 'error';\n entry.messages.push(...fail.messages);\n byLine.set(line.number, entry);\n }\n return byLine;\n}\n\nconst MARKS = {\n block: Decoration.mark({ class: 'cm-rb-match-block' }),\n matchKey: Decoration.mark({ class: 'cm-rb-match-key' }),\n prop: Decoration.mark({ class: 'cm-rb-match-prop' }),\n failError: Decoration.mark({ class: 'cm-rb-fail-error' }),\n failWarn: Decoration.mark({ class: 'cm-rb-fail-warn' }),\n};\n\ntype FailsByLine = ReturnType<typeof failsByLine>;\n\nfunction buildDecorations(\n highlights: SpecHighlights,\n doc: Text,\n byLine: FailsByLine,\n): DecorationSet {\n const ranges: Range<Decoration>[] = [];\n const push = (list: { from: number; to: number }[], mark: Decoration) => {\n for (const range of list) {\n if (range.from < range.to && range.to <= doc.length) {\n ranges.push(mark.range(range.from, range.to));\n }\n }\n };\n\n for (const entry of byLine.values()) {\n ranges.push(LINE_DECORATIONS[entry.severity].range(entry.lineFrom));\n }\n\n const overlapsFailure = (range: { from: number; to: number }) =>\n highlights.fails.some((fail) => fail.from < range.to && range.from < fail.to);\n\n push(highlights.matchBlocks, MARKS.block);\n push(\n highlights.matchProps.filter((range) => !overlapsFailure(range)),\n MARKS.prop,\n );\n push(\n highlights.matchKeys.filter((range) => !overlapsFailure(range)),\n MARKS.matchKey,\n );\n push(\n highlights.fails.filter((f) => f.severity === 'error'),\n MARKS.failError,\n );\n push(\n highlights.fails.filter((f) => f.severity === 'warn'),\n MARKS.failWarn,\n );\n return Decoration.set(ranges, true);\n}\n\nfunction buildGutterMarkers(byLine: FailsByLine): RangeSet<GutterMarker> {\n const ranges: Range<GutterMarker>[] = [];\n for (const entry of byLine.values()) {\n ranges.push(new SeverityGutterMarker(entry.severity).range(entry.lineFrom));\n }\n return RangeSet.of(ranges, true);\n}\n\nconst MAX_UPLOAD_BYTES = 2 * 1024 * 1024;\n\nexport interface SpecPanelProps {\n spec: string;\n fileName: string;\n highlights: SpecHighlights;\n rulerMarkers: RulerMarker[];\n matchTargets: { from: number; to: number }[];\n totalLines: number;\n jump?: { from: number; to: number };\n matchCount: number;\n showMatchStatus: boolean;\n isEvaluating: boolean;\n onSpecChange: (content: string, fileName?: string) => void;\n onResetSpec: () => void;\n uploadError?: string;\n onUploadError: (message?: string) => void;\n host?: HostAdapters;\n}\n\nexport function SpecPanel({\n spec,\n fileName,\n highlights,\n rulerMarkers,\n matchTargets,\n totalLines,\n jump,\n matchCount,\n showMatchStatus,\n isEvaluating,\n onSpecChange,\n onResetSpec,\n uploadError,\n onUploadError,\n host,\n}: SpecPanelProps) {\n const hostRef = useRef<HTMLDivElement>(null);\n const viewRef = useRef<EditorView | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const failsRef = useRef<FailRange[]>(highlights.fails);\n failsRef.current = highlights.fails;\n const onSpecChangeRef = useRef(onSpecChange);\n onSpecChangeRef.current = onSpecChange;\n const flashTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const [matchCursor, setMatchCursor] = useState(-1);\n\n const reveal = (range: { from: number; to: number }) => {\n const view = viewRef.current;\n if (!view) return;\n const to = Math.min(range.to, view.state.doc.length);\n const from = Math.min(range.from, to);\n if (from >= to) return;\n view.dispatch({\n effects: [EditorView.scrollIntoView(from, { y: 'center' }), setFlash.of({ from, to })],\n });\n clearTimeout(flashTimerRef.current);\n flashTimerRef.current = setTimeout(() => {\n viewRef.current?.dispatch({ effects: setFlash.of(null) });\n }, 1400);\n };\n\n useEffect(() => {\n setMatchCursor(-1);\n }, [matchTargets]);\n\n const pickSpec = async () => {\n if (!host?.pickSpecFile) {\n fileInputRef.current?.click();\n return;\n }\n try {\n const picked = await host.pickSpecFile();\n if (!picked) return;\n onUploadError(undefined);\n onSpecChange(picked.content, picked.name);\n } catch (error) {\n onUploadError(error instanceof Error ? error.message : 'Could not read the file');\n }\n };\n\n const revealNextMatch = () => {\n if (!matchTargets.length) return;\n const next = (matchCursor + 1) % matchTargets.length;\n setMatchCursor(next);\n reveal(matchTargets[next]);\n };\n\n const tooltipExtension = useMemo(\n () =>\n hoverTooltip((_view, pos) => {\n const hit = failsRef.current.filter((f) => pos >= f.from && pos <= f.to);\n if (!hit.length) return null;\n return {\n pos,\n above: true,\n create: () => {\n const dom = document.createElement('div');\n dom.className = 'cm-rb-tooltip';\n for (const fail of hit) {\n for (const message of fail.messages) {\n const line = document.createElement('div');\n line.textContent = `✗ ${message}`;\n dom.appendChild(line);\n }\n }\n return { dom };\n },\n };\n }),\n [],\n );\n\n useEffect(() => {\n if (!hostRef.current) return;\n const view = new EditorView({\n parent: hostRef.current,\n state: EditorState.create({\n doc: spec,\n extensions: [\n gutterMarkerField,\n gutter({\n class: 'cm-rb-gutter',\n markers: (view) => view.state.field(gutterMarkerField),\n initialSpacer: () => new SeverityGutterMarker('error'),\n }),\n lineNumbers(),\n history(),\n keymap.of([...defaultKeymap, ...historyKeymap]),\n yaml(),\n syntaxHighlighting(defaultHighlightStyle),\n highlightField,\n flashField,\n tooltipExtension,\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n onSpecChangeRef.current(update.state.doc.toString());\n }\n }),\n ],\n }),\n });\n viewRef.current = view;\n return () => {\n view.destroy();\n viewRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tooltipExtension]);\n\n useEffect(() => {\n const view = viewRef.current;\n if (!view || view.state.doc.toString() === spec) return;\n view.dispatch({\n changes: { from: 0, to: view.state.doc.length, insert: spec },\n effects: [\n setHighlights.of(Decoration.none),\n setGutterMarkers.of(RangeSet.empty),\n setFlash.of(null),\n ],\n });\n }, [spec]);\n\n useEffect(() => {\n const view = viewRef.current;\n if (!view) return;\n const byLine = failsByLine(highlights.fails, view.state.doc);\n view.dispatch({\n effects: [\n setHighlights.of(buildDecorations(highlights, view.state.doc, byLine)),\n setGutterMarkers.of(buildGutterMarkers(byLine)),\n ],\n });\n }, [highlights]);\n\n useEffect(() => {\n if (jump) reveal(jump);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [jump]);\n\n useEffect(() => () => clearTimeout(flashTimerRef.current), []);\n\n return (\n <Panel>\n <Toolbar>\n <FileName>{fileName}</FileName>\n {showMatchStatus &&\n (matchCount > 0 ? (\n <MatchPill\n type=\"button\"\n onClick={revealNextMatch}\n disabled={!matchTargets.length}\n title=\"Jump to the next matched node\"\n >\n {matchCount} node{matchCount === 1 ? '' : 's'} matched\n {matchCursor >= 0 && (\n <MatchPillPosition\n aria-label={`showing match ${matchCursor + 1} of ${matchTargets.length}`}\n >\n {matchCursor + 1}/{matchTargets.length}\n </MatchPillPosition>\n )}\n </MatchPill>\n ) : (\n <NoMatchPill role=\"status\">\n <NoMatchDot aria-hidden />\n Nothing matched\n </NoMatchPill>\n ))}\n {uploadError && <UploadError role=\"alert\">{uploadError}</UploadError>}\n <ToolbarButton type=\"button\" onClick={() => void pickSpec()}>\n Upload\n </ToolbarButton>\n <ToolbarButton type=\"button\" onClick={onResetSpec}>\n Reset sample\n </ToolbarButton>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".yaml,.yml,.json\"\n hidden\n aria-label=\"Upload OpenAPI document\"\n onChange={(event) => {\n const file = event.target.files?.[0];\n event.target.value = '';\n if (!file) return;\n if (file.size > MAX_UPLOAD_BYTES) {\n onUploadError('File is too large (max 2 MB)');\n return;\n }\n const reader = new FileReader();\n reader.onload = () => {\n onUploadError(undefined);\n onSpecChange(String(reader.result ?? ''), file.name);\n };\n reader.onerror = () => onUploadError('Could not read the file');\n reader.readAsText(file);\n }}\n />\n </Toolbar>\n {showMatchStatus && matchCount === 0 && !isEvaluating && (\n <NoMatchBanner role=\"status\">\n No nodes in this document match the rule&rsquo;s subject and where conditions — widen the\n node type or relax the conditions.\n </NoMatchBanner>\n )}\n <EditorHost ref={hostRef} role=\"region\" aria-label=\"OpenAPI document editor\">\n <OverviewRuler markers={rulerMarkers} totalLines={totalLines} onMarkerClick={reveal} />\n </EditorHost>\n </Panel>\n );\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { FONT_FAMILY, SUCCESS_COLORS } from '../styles';\nimport { DEFAULT_SPEC } from '../default-spec';\nimport { evaluateRules } from '../engine/evaluate';\nimport { createPointerRangeResolver, type PointerRangeResolver } from '../engine/offsets';\nimport { createDefaultRule, createRuleEntry, makeId, toNamedRules, type RuleEntry } from '../state';\nimport type {\n ConfigurableRule,\n EvaluationResult,\n HostAdapters,\n NamedRule,\n ProblemInfo,\n} from '../types';\nimport { serializeRules } from '../yaml/serialize';\nimport { ProblemsPanel } from './ProblemsPanel';\nimport { RuleList } from './RuleList';\nimport { EMPTY_HIGHLIGHTS, SpecPanel, type SpecHighlights } from './SpecPanel';\nimport type { RulerMarker } from './OverviewRuler';\nimport { Badge } from './RuleCard';\n\nconst Root = styled.div`\n font-family: ${FONT_FAMILY};\n color: var(--text-color-primary, #1b2430);\n display: flex;\n flex-direction: column;\n background: var(--color-warm-grey-1, #f3f5f8);\n border-radius: 16px;\n`;\n\nconst Icon = styled.div`\n display: flex;\n width: 30px;\n height: 30px;\n justify-content: center;\n align-items: center;\n border-radius: 8px;\n background: var(--color-primary-base, #2563eb);\n color: #fff;\n font-size: 14px;\n font-weight: 800;\n`;\n\nconst Wrapper = styled.div`\n display: flex;\n height: 56px;\n padding: 0 20px;\n align-items: center;\n gap: 12px;\n align-self: stretch;\n\n a {\n color: var(--text-color-secondary, #64748b);\n font-size: 12.5px;\n font-weight: 600;\n text-decoration: none;\n }\n`;\n\nconst LiveDot = styled.span`\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: currentColor;\n margin-right: 6px;\n`;\n\nconst TitleBlock = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-top-left-radius: 16px;\n border-top-right-radius: 16px;\n border-bottom: 1px solid var(--border-color-secondary, #e5e9f0);\n background: var(--bg-color, #ffffff);\n`;\n\nconst PanelsRow = styled.div<{ $height: number }>`\n display: grid;\n grid-template-columns: minmax(380px, 5fr) minmax(420px, 6fr);\n gap: 16px;\n align-items: stretch;\n height: ${(p) => p.$height}px;\n min-height: 420px;\n padding: 16px;\n\n > * {\n min-width: 0;\n }\n\n @media (max-width: 1024px) {\n grid-template-columns: 1fr;\n height: auto;\n min-height: 0;\n }\n`;\n\nconst SpecColumn = styled.div`\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-height: 0;\n min-width: 0;\n`;\n\nconst SpecArea = styled.div`\n flex: 1;\n min-height: 240px;\n min-width: 0;\n\n @media (max-width: 1024px) {\n flex: none;\n height: 60vh;\n }\n`;\n\nconst TextBlock = styled.div`\n display: flex;\n flex-direction: column;\n gap: 1px;\n\n h4 {\n margin: 0;\n color: var(--text-color-primary, #1b2430);\n font-size: 14.5px;\n font-weight: 700;\n line-height: 17.4px;\n }\n\n p {\n margin: 0;\n font-size: 12px;\n font-weight: 400;\n line-height: 1.5;\n color: var(--text-color-secondary, #64748b);\n }\n`;\n\nexport interface RulesBuilderProps {\n defaultSpec?: string;\n defaultSpecFileName?: string;\n initialRule?: ConfigurableRule;\n initialRuleName?: string;\n onRuleChange?: (yaml: string, rules: NamedRule[]) => void;\n host?: HostAdapters;\n height?: number;\n}\n\nconst DEMO_RULE: ConfigurableRule = {\n subject: { type: 'Operation', property: 'summary' },\n assertions: { defined: true, maxLength: 20 },\n severity: 'warn',\n message: 'Operation summary of {{key}} must be defined and under 20 characters.',\n};\n\nconst EMPTY_RESULT: EvaluationResult = { matches: [], problems: [], ruleErrors: [] };\n\ninterface LintState {\n result: EvaluationResult;\n resolver: PointerRangeResolver;\n ruleIds: string[];\n}\n\nexport function RulesBuilder({\n defaultSpec,\n defaultSpecFileName,\n initialRule,\n initialRuleName,\n onRuleChange,\n host,\n height = 640,\n}: RulesBuilderProps) {\n const initialSpec = defaultSpec ?? DEFAULT_SPEC;\n const initialFileName = defaultSpecFileName ?? 'museum-api.yaml';\n\n const [entries, setEntries] = useState<RuleEntry[]>(() => [\n {\n id: makeId(),\n name: initialRuleName ?? 'operation-summary',\n rule: initialRule ? structuredClone(initialRule) : structuredClone(DEMO_RULE),\n },\n ]);\n const [selectedId, setSelectedId] = useState<string | null>(() => entries[0]?.id ?? null);\n const [spec, setSpec] = useState({\n text: initialSpec,\n fileName: initialFileName,\n });\n const [lint, setLint] = useState<LintState>(() => ({\n result: EMPTY_RESULT,\n resolver: createPointerRangeResolver(initialSpec),\n ruleIds: [],\n }));\n const [isRunning, setIsRunning] = useState(false);\n const [jump, setJump] = useState<{ from: number; to: number }>();\n const [uploadError, setUploadError] = useState<string>();\n const runIdRef = useRef(0);\n\n const namedRules = useMemo(() => toNamedRules(entries), [entries]);\n const yaml = useMemo(() => serializeRules(namedRules), [namedRules]);\n\n useEffect(() => {\n const runId = ++runIdRef.current;\n setIsRunning(true);\n const timer = setTimeout(() => {\n const ruleIds = entries.map((entry) => entry.id);\n evaluateRules(spec.text, namedRules, spec.fileName).then((result) => {\n if (runIdRef.current !== runId) return;\n setLint({ result, resolver: createPointerRangeResolver(spec.text), ruleIds });\n setIsRunning(false);\n });\n }, 250);\n return () => clearTimeout(timer);\n }, [spec, namedRules, entries]);\n\n useEffect(() => {\n // oxlint-disable-next-line react-you-might-not-need-an-effect/no-pass-data-to-parent -- onRuleChange is the component's change callback; hosts expect it after every edit and on mount\n onRuleChange?.(yaml, namedRules);\n }, [yaml, namedRules, onRuleChange]);\n\n const selectedIndex = entries.findIndex((entry) => entry.id === selectedId);\n\n const {\n highlights,\n problemsWithLines,\n matchCountById,\n rulerMarkers,\n matchTargets,\n firstMatchRange,\n firstProblemRange,\n } = useMemo(() => {\n const { result, resolver, ruleIds } = lint;\n const highlights: SpecHighlights = {\n matchKeys: [],\n matchBlocks: [],\n matchProps: [],\n fails: [],\n };\n const rulerMarkers: RulerMarker[] = [];\n const matchTargets: { from: number; to: number }[] = [];\n\n const failByRange = new Map<\n string,\n {\n from: number;\n to: number;\n messages: string[];\n severity: 'error' | 'warn';\n }\n >();\n let firstProblemRange: { from: number; to: number } | undefined;\n\n const problemsWithLines: ProblemInfo[] = [];\n for (const problem of result.problems) {\n const range = resolver.resolve(problem.pointer, problem.reportOnKey);\n if (!range) {\n problemsWithLines.push(problem);\n continue;\n }\n const key = `${range.from}-${range.to}`;\n const entry = failByRange.get(key) ?? {\n ...range,\n messages: [],\n severity: problem.severity,\n };\n entry.messages.push(\n [\n `${problem.ruleId}: ${problem.message}`,\n ...problem.suggest.map((suggestion) => `→ ${suggestion}`),\n ].join('\\n'),\n );\n if (problem.severity === 'error') entry.severity = 'error';\n failByRange.set(key, entry);\n if (\n ruleIds[problem.ruleIndex] === selectedId &&\n (!firstProblemRange || range.from < firstProblemRange.from)\n ) {\n firstProblemRange = range;\n }\n problemsWithLines.push({ ...problem, line: resolver.lineAt(range.from) });\n }\n highlights.fails = Array.from(failByRange.values());\n\n for (const fail of highlights.fails) {\n rulerMarkers.push({\n line: resolver.lineAt(fail.from),\n from: fail.from,\n to: fail.to,\n kind: fail.severity,\n title: fail.messages.join('\\n'),\n });\n }\n\n const matchCountById: Record<string, number> = {};\n for (const match of result.matches) {\n const id = ruleIds[match.ruleIndex];\n if (!id) continue;\n matchCountById[id] = (matchCountById[id] ?? 0) + 1;\n\n if (id !== selectedId) continue;\n\n if (match.nodeType === 'Root') {\n const target = resolver.lineRange(1);\n matchTargets.push(target);\n rulerMarkers.push({ line: 1, ...target, kind: 'match', title: 'Matched Root' });\n continue;\n }\n\n const propertyRanges = match.propertyPointers.flatMap((propertyPointer) => {\n const valueRange = resolver.resolve(propertyPointer, false);\n if (!valueRange) return [];\n return [{ key: resolver.resolve(propertyPointer, true), value: valueRange }];\n });\n\n if (propertyRanges.length) {\n for (const { key, value } of propertyRanges) {\n if (key) highlights.matchKeys.push(key);\n highlights.matchProps.push(value);\n const anchor = key ?? value;\n const target = { from: anchor.from, to: value.to };\n matchTargets.push(target);\n rulerMarkers.push({\n line: resolver.lineAt(anchor.from),\n ...target,\n kind: 'match',\n title: `Matched ${match.nodeType} property`,\n });\n }\n continue;\n }\n\n const keyRange = resolver.resolve(match.pointer, true);\n const blockRange = resolver.resolve(match.pointer, false);\n if (keyRange) {\n highlights.matchKeys.push(keyRange);\n matchTargets.push(keyRange);\n rulerMarkers.push({\n line: resolver.lineAt(keyRange.from),\n from: keyRange.from,\n to: keyRange.to,\n kind: 'match',\n title: `Matched ${match.nodeType}`,\n });\n }\n if (blockRange) {\n highlights.matchBlocks.push(blockRange);\n }\n }\n matchTargets.sort((a, b) => a.from - b.from);\n const firstMatchRange = matchTargets[0];\n\n return {\n highlights,\n problemsWithLines,\n matchCountById,\n rulerMarkers,\n matchTargets,\n firstMatchRange,\n firstProblemRange,\n };\n }, [lint, selectedId]);\n\n const selectedEntry = entries[selectedIndex];\n const selectedMatchCount = selectedEntry ? (matchCountById[selectedEntry.id] ?? 0) : 0;\n const hasSelectedRule = Boolean(selectedEntry);\n\n const targetingSignature = useMemo(\n () =>\n selectedEntry\n ? JSON.stringify({\n id: selectedEntry.id,\n subject: selectedEntry.rule.subject,\n where: selectedEntry.rule.where,\n })\n : '',\n [selectedEntry],\n );\n\n const assertionSignature = useMemo(\n () =>\n selectedEntry\n ? JSON.stringify({\n assertions: selectedEntry.rule.assertions,\n severity: selectedEntry.rule.severity,\n })\n : '',\n [selectedEntry],\n );\n\n const previousTargetingRef = useRef(targetingSignature);\n const previousAssertionRef = useRef(assertionSignature);\n const [pendingReveal, setPendingReveal] = useState<'match' | 'problem' | null>(null);\n\n useEffect(() => {\n const targetingChanged = previousTargetingRef.current !== targetingSignature;\n const assertionsChanged = previousAssertionRef.current !== assertionSignature;\n previousTargetingRef.current = targetingSignature;\n previousAssertionRef.current = assertionSignature;\n if (targetingChanged) setPendingReveal('match');\n else if (assertionsChanged) setPendingReveal('problem');\n }, [targetingSignature, assertionSignature]);\n\n useEffect(() => {\n if (!pendingReveal || isRunning) return;\n // oxlint-disable-next-line react-you-might-not-need-an-effect/no-chain-state-updates -- the jump must wait for the evaluation that the same edit started; the pending kind is consumed here\n setPendingReveal(null);\n const target =\n pendingReveal === 'problem' ? (firstProblemRange ?? firstMatchRange) : firstMatchRange;\n // oxlint-disable-next-line react-you-might-not-need-an-effect/no-derived-state -- `jump` is an imperative scroll request for the editor, not a derived value; a fresh object re-triggers the same range\n if (target) setJump({ ...target });\n }, [pendingReveal, isRunning, firstMatchRange, firstProblemRange]);\n\n const jumpToProblem = (problem: ProblemInfo) => {\n const range = lint.resolver.resolve(problem.pointer, problem.reportOnKey);\n if (range) setJump({ ...range });\n };\n\n const removeEntry = (id: string) => {\n setEntries((current) => current.filter((entry) => entry.id !== id));\n if (id === selectedId) {\n setSelectedId(entries.find((entry) => entry.id !== id)?.id ?? null);\n }\n };\n\n const importRules = (imported: NamedRule[]) => {\n const importedEntries = imported.map(createRuleEntry);\n setEntries((current) => [...current, ...importedEntries]);\n if (importedEntries[0]) setSelectedId(importedEntries[0].id);\n };\n\n return (\n <Root>\n <TitleBlock>\n <Wrapper>\n <Icon>R</Icon>\n <TextBlock>\n <h4>Rules Builder</h4>\n <p>\n Build rule/* entries visually · evaluated by @redocly/openapi-core in your browser\n </p>\n </TextBlock>\n </Wrapper>\n <Wrapper>\n <Badge style={{ background: SUCCESS_COLORS.bg, color: SUCCESS_COLORS.fg }}>\n <LiveDot />\n Live linting\n </Badge>\n <a\n href=\"https://redocly.com/docs/cli/rules/configurable-rules\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Docs ↗\n </a>\n </Wrapper>\n </TitleBlock>\n <PanelsRow $height={height}>\n <RuleList\n entries={entries}\n selectedId={selectedId}\n matchCountById={matchCountById}\n onToggle={(id) => setSelectedId((current) => (current === id ? null : id))}\n onChangeEntry={(next) =>\n setEntries((current) => current.map((entry) => (entry.id === next.id ? next : entry)))\n }\n onRemove={removeEntry}\n onAdd={() => {\n const rule = createDefaultRule(entries.map((entry) => entry.name));\n setEntries((current) => [...current, rule]);\n setSelectedId(rule.id);\n }}\n isEvaluating={isRunning}\n importProps={{ onImport: importRules }}\n configPreviewProps={{ yaml, host }}\n />\n <SpecColumn>\n <SpecArea>\n <SpecPanel\n host={host}\n spec={spec.text}\n fileName={spec.fileName}\n highlights={lint.result.specError ? EMPTY_HIGHLIGHTS : highlights}\n rulerMarkers={lint.result.specError ? [] : rulerMarkers}\n matchTargets={lint.result.specError ? [] : matchTargets}\n totalLines={lint.resolver.lineCount}\n jump={jump}\n matchCount={selectedMatchCount}\n showMatchStatus={hasSelectedRule && !lint.result.specError}\n isEvaluating={isRunning}\n uploadError={uploadError}\n onUploadError={setUploadError}\n onSpecChange={(text, fileName) =>\n setSpec((current) => ({\n text,\n fileName: fileName ?? current.fileName,\n }))\n }\n onResetSpec={() => setSpec({ text: initialSpec, fileName: initialFileName })}\n />\n </SpecArea>\n <ProblemsPanel\n problems={problemsWithLines}\n ruleErrors={lint.result.ruleErrors}\n specError={lint.result.specError}\n isRunning={isRunning}\n onSelect={jumpToProblem}\n />\n </SpecColumn>\n </PanelsRow>\n </Root>\n );\n}\n"],"mappings":";;;;;;;;;;;AAEA,IAAayC,KACX,yHAEWC,IACX,qHAIWC,IAAiF;AAAA,EAC5F,SAAS;AAAA,IAAE,IAAI;AAAA,IAAW,MAAM;AAAA,IAAW,MAAM;AAAA,EAAU;AAAA,EAC3D,OAAO;AAAA,IAAE,IAAI;AAAA,IAAW,MAAM;AAAA,IAAW,MAAM;AAAA,EAAU;AAAA,EACzD,QAAQ;AAAA,IAAE,IAAI;AAAA,IAAW,MAAM;AAAA,IAAW,MAAM;AAAA,EAAU;AAAA,EAC1D,SAAS;AAAA,IAAE,IAAI;AAAA,IAAW,MAAM;AAAA,IAAW,MAAM;AAAA,EAAU;AAAA,EAC3D,SAAS;AAAA,IAAE,IAAI;AAAA,IAAW,MAAM;AAAA,IAAW,MAAM;AAAA,EAAU;AAC7D,GAEaC,KAAiB;AAAA,EAC5B,IAAI;AAAA,EACJ,IAAI;AACN,GAEaC,IAAgE;AAAA,EAC3E,OAAO;AAAA,IAAE,IAAI;AAAA,IAAkC,IAAI;AAAA,EAAmC;AAAA,EACtF,MAAM;AAAA,IAAE,IAAI;AAAA,IAAoC,IAAI;AAAA,EAAqC;AAAA,EACzF,KAAK;AAAA,IAAE,IAAI;AAAA,IAAqC,IAAI;AAAA,EAAuC;AAC7F,GC3BaC,KAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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"}