{"$schema":"https://ui.shadcn.com/schema/registry.json","name":"poetry","homepage":"https://poetryui.com","items":[{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"accordion","type":"registry:component","title":"Accordion","files":[{"path":"app/components/poetry/ui/accordion/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/accordion/component.html.erb"},{"path":"app/components/poetry/ui/accordion/component.rb","type":"registry:file","target":"app/components/poetry/ui/accordion/component.rb"},{"path":"app/components/poetry/ui/accordion/preview.rb","type":"registry:file","target":"app/components/poetry/ui/accordion/preview.rb"},{"path":"app/components/poetry/ui/accordion/style.rb","type":"registry:file","target":"app/components/poetry/ui/accordion/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Accordion::Component","identifier":"poetry--ui--accordion","parts":[{"name":"accordion","description":"The list root - both controllers (the open-set machine and roving focus) ride here","states":[{"attr":"data-orientation","condition":"always vertical - the only axis the accordion ships","values":["vertical"]}]},{"name":"accordion-item","description":"One value-keyed section wrapping its header and panel","states":[{"attr":"data-open","condition":"the item is expanded (server-rendered from open:; the controller flips the pair at runtime)"},{"attr":"data-closed","condition":"the item is collapsed"},{"attr":"data-value","condition":"the item's open-state key (always present)"},{"attr":"data-disabled","condition":"with_item(disabled: true) - the item is locked (styling hook; the trigger carries the native disabled attribute)"}]},{"name":"accordion-header","description":"The heading element (heading_level:, h3 default) hosting the trigger button"},{"name":"accordion-trigger","description":"The toggle button inside the header - the chevron rotation rides aria-expanded, not a data attribute","states":[{"attr":"data-panel-open","condition":"its panel is open (controller-written; absent while closed)"},{"attr":"data-disabled","condition":"with_item(disabled: true) - stamped beside the native disabled attribute; roving focus filters it out at query time"}]},{"name":"accordion-trigger-icon","description":"The chevron svg inside the trigger (aria-hidden) - rotates with the item"},{"name":"accordion-content","description":"The role=region panel - the presence animation and the measured height var ride here","states":[{"attr":"data-open","condition":"panel is open or entering"},{"attr":"data-closed","condition":"panel is closed or animating out (hidden lands after the exit finishes)"}],"vars":[{"name":"--accordion-panel-height","description":"the measured content height (controller-written) that feeds the accordion-down/up keyframes"}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"action-bar","type":"registry:block","title":"Action bar","description":"Bulk actions over a selectable table: a selection-driven floating bar with the live count, the actions, and clear - shown while rows are selected, Escape clears, focus never steals.","files":[{"path":"lib/generators/poetry/block/templates/action_bar.html.erb","type":"registry:file","target":"app/views/blocks/_action_bar.html.erb"}],"registryDependencies":["button","data-table","icon"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"copy-in","keywords":["bulk","selection","batch","actions","action bar","selected","archive","delete rows","multi-select","table actions"]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"adapter-chart","type":"registry:component","title":"Adapter chart","files":[{"path":"app/components/poetry/charts/adapter_chart/component.html.erb","type":"registry:file","target":"app/components/poetry/charts/adapter_chart/component.html.erb"},{"path":"app/components/poetry/charts/adapter_chart/component.rb","type":"registry:file","target":"app/components/poetry/charts/adapter_chart/component.rb"},{"path":"app/components/poetry/charts/adapter_chart/preview.rb","type":"registry:file","target":"app/components/poetry/charts/adapter_chart/preview.rb"},{"path":"app/components/poetry/charts/adapter_chart/style.rb","type":"registry:file","target":"app/components/poetry/charts/adapter_chart/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-charts","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Charts::AdapterChart::Component","identifier":"poetry--charts--adapter_chart","parts":[{"name":"chart-adapter-mount","description":"The engine's drawing surface (role=img carrying the accessible label) - the registered adapter renders into it"},{"name":"chart-spec","description":"The frozen chart-spec v1, served as JSON in an application/json script for the adapter to consume"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"agent-embed","type":"registry:block","title":"In-page agent embed","description":"An opt-in page-agent loader for a poetry app as a Stimulus controller: pinned CDN script (?autoInit=false), session-only BYO key, Turbo-hardened (remounts on turbo:load, idle-only rebuild, module-init catch-up), poetry operator instructions built in. Wire a form with targets model/baseUrl/apiKey/status.","files":[{"path":"app/javascript/controllers/agent_demo_controller.js","type":"registry:file","target":"app/javascript/controllers/agent_demo_controller.js"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"copy-in","kind":"recipe"}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"alert","type":"registry:component","title":"Alert","files":[{"path":"app/components/poetry/ui/alert/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/alert/component.html.erb"},{"path":"app/components/poetry/ui/alert/component.rb","type":"registry:file","target":"app/components/poetry/ui/alert/component.rb"},{"path":"app/components/poetry/ui/alert/preview.rb","type":"registry:file","target":"app/components/poetry/ui/alert/preview.rb"},{"path":"app/components/poetry/ui/alert/style.rb","type":"registry:file","target":"app/components/poetry/ui/alert/style.rb"}],"registryDependencies":["icon"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Alert::Component","identifier":"poetry--ui--alert","parts":[{"name":"alert","description":"The callout root - role rides the variant (destructive announces assertively via role=alert; default is a polite role=status)","states":[{"attr":"data-variant","condition":"always - the resolved variant","values":["default","destructive"]}]},{"name":"alert-title","description":"The heading line, rendered when the title slot is set"},{"name":"alert-action","description":"The corner action well (with_action) - a dismiss or link pinned to the top-right by the theme"},{"name":"alert-description","description":"The body copy - the content block renders here"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"alert-dialog","type":"registry:component","title":"Alert dialog","files":[{"path":"app/components/poetry/ui/alert_dialog/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/alert_dialog/component.html.erb"},{"path":"app/components/poetry/ui/alert_dialog/component.rb","type":"registry:file","target":"app/components/poetry/ui/alert_dialog/component.rb"},{"path":"app/components/poetry/ui/alert_dialog/preview.rb","type":"registry:file","target":"app/components/poetry/ui/alert_dialog/preview.rb"},{"path":"app/components/poetry/ui/alert_dialog/style.rb","type":"registry:file","target":"app/components/poetry/ui/alert_dialog/style.rb"}],"registryDependencies":["dialog","button"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::AlertDialog::Component","identifier":"poetry--ui--alert_dialog","parts":[{"name":"alert-dialog","description":"Root wrapper around the trigger and the <dialog> element"},{"name":"alert-dialog-content","description":"The role=alertdialog <dialog> panel - sizing, animation, and the open state ride here","states":[{"attr":"data-open","condition":"panel is open (the shared dialog controller flips the pair at runtime)"},{"attr":"data-closed","condition":"panel is closed (the server-rendered state)"},{"attr":"data-size","condition":"always - the resolved size","values":["default","sm"]}]},{"name":"alert-dialog-header","description":"Title block - holds the optional media well, the title, and the description"},{"name":"alert-dialog-media","description":"The optional media well above the title (an icon or illustration) - the header's first row; absent unless with_media is used"},{"name":"alert-dialog-title","description":"The heading - the alertdialog's accessible name (required slot)"},{"name":"alert-dialog-description","description":"The explanation, wired to aria-describedby (required slot)"},{"name":"alert-dialog-footer","description":"The choice row - cancel then action"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"app-shell","type":"registry:block","title":"App shell","description":"The frame every screen composes into: an icon-collapsible sidebar with grouped nav, badges and a user footer, plus a topbar with breadcrumb that answers the collapsed state, and a stat-card content grid.","files":[{"path":"lib/generators/poetry/block/templates/app_shell.html.erb","type":"registry:file","target":"app/views/blocks/_app_shell.html.erb"}],"registryDependencies":["avatar","breadcrumb","button","card","icon","separator","sidebar"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"copy-in","keywords":["dashboard","shell","layout","sidebar","workspace","admin","console","overview","stats","chrome"]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"area-chart","type":"registry:component","title":"Area chart","files":[{"path":"app/components/poetry/charts/area_chart/component.html.erb","type":"registry:file","target":"app/components/poetry/charts/area_chart/component.html.erb"},{"path":"app/components/poetry/charts/area_chart/component.rb","type":"registry:file","target":"app/components/poetry/charts/area_chart/component.rb"},{"path":"app/components/poetry/charts/area_chart/preview.rb","type":"registry:file","target":"app/components/poetry/charts/area_chart/preview.rb"},{"path":"app/components/poetry/charts/area_chart/style.rb","type":"registry:file","target":"app/components/poetry/charts/area_chart/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-charts","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Charts::AreaChart::Component","identifier":"poetry--charts--area_chart","parts":[{"name":"chart-brush","description":"The brush strip group (with_brush): track + window + two handles below the x axis"},{"name":"chart-brush-track","description":"The full-width brush rail"},{"name":"chart-brush-window","description":"The selected-range rect the drag moves"},{"name":"chart-brush-handle","description":"One draggable window edge","states":[{"attr":"data-edge","condition":"always - which edge","values":["start","end"]}]},{"name":"chart-zoom-selection","description":"The zoom drag-selection overlay (zoom: true), hidden until a drag starts"},{"name":"chart-live-payload","description":"The embedded {spec, frame} JSON the live renderer recomputes geometry from"},{"name":"chart-svg","description":"The chart canvas (<svg>) - server-computed geometry in a fixed viewBox; role=img, or the focusable role=application accessibilityLayer when the tooltip attaches","states":[{"attr":"data-animate","condition":"present when animate (the default) - the motion stylesheet and controller key the entrance off it"},{"attr":"data-motion","condition":"runtime - the motion rig stamps the animation lifecycle (entrance/morph, then settled)","values":["entrance","morph","settled"]}],"vars":[{"name":"--poetry-motion-duration","description":"the entrance/morph duration (animation_duration, ms)"},{"name":"--poetry-motion-easing","description":"the animation easing keyword (animation_easing)"},{"name":"--poetry-motion-delay","description":"the pre-animation hold (animation_begin, ms)"}]},{"name":"chart-motion-reveal","description":"The entrance clipPath rect (the ported area reveal) - the motion stylesheet scales it 0 -> 1; only when animate"},{"name":"chart-grid","description":"The gridline group (with_grid) - horizontal and/or vertical rules across the plot"},{"name":"chart-cursor","description":"The hover cursor, hidden until the tooltip controller positions and reveals it at the active index - a vertical rule or a translucent band rect (bar charts)"},{"name":"chart-areas","description":"The area-mark group - a fill path plus top-curve stroke per series, clipped by the reveal rect while animating"},{"name":"chart-area","description":"One series' fill path (var(--color-<key>) or its gradient)","states":[{"attr":"data-key","condition":"the series key"}]},{"name":"chart-area-stroke","description":"One series' top-curve stroke path (the source strokes the curve, never the area outline)","states":[{"attr":"data-key","condition":"the series key"}]},{"name":"chart-active-dots","description":"The hover-marker group (with_tooltip) - pre-rendered hidden circles for every series x index"},{"name":"chart-active-dot","description":"One hover marker - display=none until the tooltip controller reveals the active index's dot","states":[{"attr":"data-key","condition":"the series key"},{"attr":"data-index","condition":"the datum index"},{"attr":"data-active","condition":"runtime - rides the marker while its index is the active one"}]},{"name":"chart-x-axis","description":"The x-axis tick-label group (with_x_axis)"},{"name":"chart-y-axis","description":"The y-axis tick-label group (with_y_axis)"},{"name":"chart-coordinates","description":"The embedded per-index geometry payload (<script type=application/json>) the tooltip controller reads - zero chart math in the browser"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"aspect-ratio","type":"registry:component","title":"Aspect ratio","files":[{"path":"app/components/poetry/ui/aspect_ratio/component.rb","type":"registry:file","target":"app/components/poetry/ui/aspect_ratio/component.rb"},{"path":"app/components/poetry/ui/aspect_ratio/preview.rb","type":"registry:file","target":"app/components/poetry/ui/aspect_ratio/preview.rb"},{"path":"app/components/poetry/ui/aspect_ratio/style.rb","type":"registry:file","target":"app/components/poetry/ui/aspect_ratio/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::AspectRatio::Component","identifier":"poetry--ui--aspect_ratio","parts":[{"name":"aspect-ratio","description":"The ratio-locked box - the content block fills it","vars":[{"name":"--ratio","description":"always - the ratio: fraction verbatim ('16/9'), consumed by the theme's aspect-ratio rule"}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"attachment","type":"registry:component","title":"Attachment","files":[{"path":"app/components/poetry/ui/attachment/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/attachment/component.html.erb"},{"path":"app/components/poetry/ui/attachment/component.rb","type":"registry:file","target":"app/components/poetry/ui/attachment/component.rb"},{"path":"app/components/poetry/ui/attachment/preview.rb","type":"registry:file","target":"app/components/poetry/ui/attachment/preview.rb"},{"path":"app/components/poetry/ui/attachment/style.rb","type":"registry:file","target":"app/components/poetry/ui/attachment/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Attachment::Component","identifier":"poetry--ui--attachment","parts":[{"name":"attachment","description":"The chip root - the server-owned upload lifecycle rides here (flip data-upload-state by re-render / Turbo Stream replace)","states":[{"attr":"data-upload-state","condition":"always - the resolved state","values":["idle","uploading","processing","error","done"]},{"attr":"data-size","condition":"always - the resolved size","values":["default","sm","xs"]},{"attr":"data-orientation","condition":"always - the resolved orientation","values":["horizontal","vertical"]}]},{"name":"attachment-media","description":"The media slot's box - the icon tile or the caller's <img>","states":[{"attr":"data-variant","condition":"always - the media variant","values":["icon","image"]}]},{"name":"attachment-content","description":"Text column wrapping title/description - renders when either slot is set"},{"name":"attachment-title","description":"The file name line (title slot; user content, never html_safe)"},{"name":"attachment-description","description":"Muted metadata / failure copy under the title"},{"name":"attachment-actions","description":"Row of with_action poetry Buttons"},{"name":"attachment-trigger","description":"The whole-chip control (with_trigger: a button or tag: :a anchor) - wraps the picker/download affordance"},{"name":"attachment-status","description":"sr-only role=status announcement for the in-flight and error states (uploading/processing/error)"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"autocomplete","type":"registry:component","title":"Autocomplete","files":[{"path":"app/components/poetry/ui/autocomplete/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/autocomplete/component.html.erb"},{"path":"app/components/poetry/ui/autocomplete/component.rb","type":"registry:file","target":"app/components/poetry/ui/autocomplete/component.rb"},{"path":"app/components/poetry/ui/autocomplete/preview.rb","type":"registry:file","target":"app/components/poetry/ui/autocomplete/preview.rb"},{"path":"app/components/poetry/ui/autocomplete/style.rb","type":"registry:file","target":"app/components/poetry/ui/autocomplete/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Autocomplete::Component","identifier":"poetry--ui--autocomplete","parts":[{"name":"autocomplete","description":"Root wrapper carrying the controller + popper pair"},{"name":"autocomplete-input","description":"The REAL text input - role=combobox with aria-expanded tracking the popup, the form value itself"},{"name":"autocomplete-content","description":"The popper-positioned popup shell","states":[{"attr":"data-open","condition":"popup visible"},{"attr":"data-closed","condition":"popup hidden (the server-rendered default)"},{"attr":"data-empty","condition":"no item matches the query - the empty state shows"}]},{"name":"autocomplete-list","description":"role=listbox holding the options"},{"name":"autocomplete-item","description":"One suggestion - role=option; commit writes its label (or value:) into the input","states":[{"attr":"data-label","condition":"always - what filtering matches and commit writes"},{"attr":"data-value","condition":"value: given - overrides the committed text"},{"attr":"data-highlighted","condition":"the keyboard/pointer highlight"},{"attr":"data-disabled","condition":"disabled: - skipped by filtering and commit"}]},{"name":"autocomplete-empty","description":"The no-matches message (hidden while anything matches)"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"avatar","type":"registry:component","title":"Avatar","files":[{"path":"app/components/poetry/ui/avatar/component.rb","type":"registry:file","target":"app/components/poetry/ui/avatar/component.rb"},{"path":"app/components/poetry/ui/avatar/group_preview.html.erb","type":"registry:file","target":"app/components/poetry/ui/avatar/group_preview.html.erb"},{"path":"app/components/poetry/ui/avatar/preview.rb","type":"registry:file","target":"app/components/poetry/ui/avatar/preview.rb"},{"path":"app/components/poetry/ui/avatar/style.rb","type":"registry:file","target":"app/components/poetry/ui/avatar/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Avatar::Component","identifier":"poetry--ui--avatar","parts":[{"name":"avatar","description":"Root span (role=img carrying the accessible name) - fallback, image, and badge layer inside it","states":[{"attr":"data-size","condition":"always - the resolved size","values":["default","sm","lg"]}]},{"name":"avatar-fallback","description":"The initials layer (the content block) - always in the DOM, showing until the image covers it"},{"name":"avatar-image","description":"The <img> layered absolutely over the fallback - only when src: is given; a failed load paints nothing"},{"name":"avatar-badge","description":"The decorative presence dot (the badge slot), bottom-right"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"badge","type":"registry:component","title":"Badge","files":[{"path":"app/components/poetry/ui/badge/component.rb","type":"registry:file","target":"app/components/poetry/ui/badge/component.rb"},{"path":"app/components/poetry/ui/badge/preview.rb","type":"registry:file","target":"app/components/poetry/ui/badge/preview.rb"},{"path":"app/components/poetry/ui/badge/style.rb","type":"registry:file","target":"app/components/poetry/ui/badge/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Badge::Component","identifier":"poetry--ui--badge","parts":[{"name":"badge","description":"The status pill itself (a <span>; a real <a> when href: is given) - the whole component is this one element","states":[{"attr":"data-variant","condition":"always - the resolved variant","values":["default","secondary","destructive","outline","ghost","link","success","warning","info"]}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"bar-chart","type":"registry:component","title":"Bar chart","files":[{"path":"app/components/poetry/charts/bar_chart/component.html.erb","type":"registry:file","target":"app/components/poetry/charts/bar_chart/component.html.erb"},{"path":"app/components/poetry/charts/bar_chart/component.rb","type":"registry:file","target":"app/components/poetry/charts/bar_chart/component.rb"},{"path":"app/components/poetry/charts/bar_chart/preview.rb","type":"registry:file","target":"app/components/poetry/charts/bar_chart/preview.rb"},{"path":"app/components/poetry/charts/bar_chart/style.rb","type":"registry:file","target":"app/components/poetry/charts/bar_chart/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-charts","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Charts::BarChart::Component","identifier":"poetry--charts--bar_chart","parts":[{"name":"chart-brush","description":"The brush strip group (with_brush): track + window + two handles below the x axis"},{"name":"chart-brush-track","description":"The full-width brush rail"},{"name":"chart-brush-window","description":"The selected-range rect the drag moves"},{"name":"chart-brush-handle","description":"One draggable window edge","states":[{"attr":"data-edge","condition":"always - which edge","values":["start","end"]}]},{"name":"chart-zoom-selection","description":"The zoom drag-selection overlay (zoom: true), hidden until a drag starts"},{"name":"chart-live-payload","description":"The embedded {spec, frame} JSON the live renderer recomputes geometry from"},{"name":"chart-svg","description":"The chart canvas (<svg>) - server-computed geometry in a fixed viewBox; role=img, or the focusable role=application accessibilityLayer when the tooltip attaches","states":[{"attr":"data-animate","condition":"present when animate (the default) - the motion stylesheet and controller key the entrance off it"},{"attr":"data-motion","condition":"runtime - the motion rig stamps the animation lifecycle (entrance/morph, then settled)","values":["entrance","morph","settled"]}],"vars":[{"name":"--poetry-motion-duration","description":"the entrance/morph duration (animation_duration, ms)"},{"name":"--poetry-motion-easing","description":"the animation easing keyword (animation_easing)"},{"name":"--poetry-motion-delay","description":"the pre-animation hold (animation_begin, ms)"}]},{"name":"chart-grid","description":"The gridline group (with_grid) - horizontal and/or vertical rules across the plot"},{"name":"chart-cursor","description":"The hover cursor, hidden until the tooltip controller positions and reveals it at the active index - a vertical rule or a translucent band rect (bar charts)"},{"name":"chart-bars","description":"The bar-mark group wrapping every series"},{"name":"chart-bar-series","description":"One series' bar group","states":[{"attr":"data-key","condition":"the series key"}]},{"name":"chart-bar","description":"One bar cell (a per-corner rounded-rect path)","states":[{"attr":"data-key","condition":"the series key"},{"attr":"data-index","condition":"the datum index"},{"attr":"data-active","condition":"the highlighted cell - server-rendered from active_index:, and the tooltip controller marks the hovered index at runtime"},{"attr":"data-motion-origin","condition":"when animate - the zero edge the entrance grows from","values":["bottom","top","left","right"]}]},{"name":"chart-labels","description":"One series' value-label group (labels: true)","states":[{"attr":"data-key","condition":"the series key"}]},{"name":"chart-x-axis","description":"The x-axis tick-label group (with_x_axis)"},{"name":"chart-y-axis","description":"The y-axis tick-label group (with_y_axis)"},{"name":"chart-coordinates","description":"The embedded per-index geometry payload (<script type=application/json>) the tooltip controller reads - zero chart math in the browser"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"breadcrumb","type":"registry:component","title":"Breadcrumb","files":[{"path":"app/components/poetry/ui/breadcrumb/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/breadcrumb/component.html.erb"},{"path":"app/components/poetry/ui/breadcrumb/component.rb","type":"registry:file","target":"app/components/poetry/ui/breadcrumb/component.rb"},{"path":"app/components/poetry/ui/breadcrumb/dropdown_crumb_preview.html.erb","type":"registry:file","target":"app/components/poetry/ui/breadcrumb/dropdown_crumb_preview.html.erb"},{"path":"app/components/poetry/ui/breadcrumb/preview.rb","type":"registry:file","target":"app/components/poetry/ui/breadcrumb/preview.rb"},{"path":"app/components/poetry/ui/breadcrumb/style.rb","type":"registry:file","target":"app/components/poetry/ui/breadcrumb/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Breadcrumb::Component","identifier":"poetry--ui--breadcrumb","parts":[{"name":"breadcrumb","description":"The <nav> landmark (aria-label=breadcrumb) around the trail"},{"name":"breadcrumb-list","description":"The <ol> laying crumbs and separators out as one wrapping row"},{"name":"breadcrumb-item","description":"One <li> of the trail - wraps a link, the current page, the ellipsis, or a block item's own content (a dropdown crumb, a custom link)"},{"name":"breadcrumb-link","description":"A crumb with href: - a real <a> to an ancestor page"},{"name":"breadcrumb-page","description":"The current page (the item without href:) - aria-current=page, not a link"},{"name":"breadcrumb-separator","description":"The chevron <li> between crumbs - presentational, aria-hidden"},{"name":"breadcrumb-ellipsis","description":"The collapsed-middle glyph (with_ellipsis) - aria-hidden; a sibling sr-only 'More' announces it"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"bubble","type":"registry:component","title":"Bubble","files":[{"path":"app/components/poetry/ui/bubble/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/bubble/component.html.erb"},{"path":"app/components/poetry/ui/bubble/component.rb","type":"registry:file","target":"app/components/poetry/ui/bubble/component.rb"},{"path":"app/components/poetry/ui/bubble/preview.rb","type":"registry:file","target":"app/components/poetry/ui/bubble/preview.rb"},{"path":"app/components/poetry/ui/bubble/style.rb","type":"registry:file","target":"app/components/poetry/ui/bubble/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Bubble::Component","identifier":"poetry--ui--bubble","parts":[{"name":"bubble","description":"The message surface root - variant and alignment ride here","states":[{"attr":"data-variant","condition":"always - the resolved variant","values":["default","secondary","muted","tinted","outline","ghost","destructive"]},{"attr":"data-align","condition":"always - the resolved align","values":["start","end"]}]},{"name":"bubble-content","description":"The body (<div>, or a <button>/<a> quick reply via tag:) - the content block renders here"},{"name":"bubble-reactions","description":"The reactions pill overlay (role=group, named by label:)","states":[{"attr":"data-side","condition":"always - which edge the pill overlays (default bottom)"},{"attr":"data-align","condition":"always - placement along that edge (default end)"}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"button","type":"registry:component","title":"Button","files":[{"path":"app/components/poetry/ui/button/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/button/component.html.erb"},{"path":"app/components/poetry/ui/button/component.rb","type":"registry:file","target":"app/components/poetry/ui/button/component.rb"},{"path":"app/components/poetry/ui/button/preview.rb","type":"registry:file","target":"app/components/poetry/ui/button/preview.rb"},{"path":"app/components/poetry/ui/button/style.rb","type":"registry:file","target":"app/components/poetry/ui/button/style.rb"}],"registryDependencies":["icon"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Button::Component","identifier":"poetry--ui--button","parts":[{"name":"button","description":"The rendered control itself (<button>, or <a> when tag: :a) - every visual state rides here","states":[{"attr":"data-variant","condition":"always - the resolved variant","values":["default","destructive","outline","secondary","ghost","link"]},{"attr":"data-size","condition":"always - the resolved size","values":["default","xs","sm","lg","icon","icon-xs","icon-sm","icon-lg"]},{"attr":"data-loading","condition":"loading: is set (aria-busy rides along)"}]},{"name":"icon","description":"Wrapper span around leading/trailing slot content - sizes and centers whatever it holds"},{"name":"label","description":"The content block's span (display: contents - children join the root's flex row directly)"},{"name":"spinner","description":"The loading indicator, swapped in for the leading icon while loading:"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"button-group","type":"registry:component","title":"Button group","files":[{"path":"app/components/poetry/ui/button_group/component.rb","type":"registry:file","target":"app/components/poetry/ui/button_group/component.rb"},{"path":"app/components/poetry/ui/button_group/popup_triggers_preview.html.erb","type":"registry:file","target":"app/components/poetry/ui/button_group/popup_triggers_preview.html.erb"},{"path":"app/components/poetry/ui/button_group/preview.rb","type":"registry:file","target":"app/components/poetry/ui/button_group/preview.rb"},{"path":"app/components/poetry/ui/button_group/style.rb","type":"registry:file","target":"app/components/poetry/ui/button_group/style.rb"},{"path":"app/components/poetry/ui/button_group/text_prefix_preview.html.erb","type":"registry:file","target":"app/components/poetry/ui/button_group/text_prefix_preview.html.erb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::ButtonGroup::Component","identifier":"poetry--ui--button_group","parts":[{"name":"button-group","description":"The role=group root - its selectors join ANY data-slot children into the segmented unit","states":[{"attr":"data-orientation","condition":"the join axis","values":["horizontal","vertical"]}]},{"name":"button-group-text","description":"A non-button member (the poetry_button_group_text helper's div) - a text affix joined like a button"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"calendar","type":"registry:component","title":"Calendar","files":[{"path":"app/components/poetry/ui/calendar/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/calendar/component.html.erb"},{"path":"app/components/poetry/ui/calendar/component.rb","type":"registry:file","target":"app/components/poetry/ui/calendar/component.rb"},{"path":"app/components/poetry/ui/calendar/preview.rb","type":"registry:file","target":"app/components/poetry/ui/calendar/preview.rb"},{"path":"app/components/poetry/ui/calendar/style.rb","type":"registry:file","target":"app/components/poetry/ui/calendar/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Calendar::Component","identifier":"poetry--ui--calendar","parts":[{"name":"calendar","description":"Root wrapper - the calendar controller (navigation, selection, roving arrow keys) rides here"},{"name":"calendar-nav","description":"The header row - previous/next month Buttons around the caption"},{"name":"calendar-caption","description":"The month label ('July 2026') - the controller rewrites it on navigation from the localized month names; under caption_layout: :dropdown it holds the month/year NativeSelect pair instead (the controller reflects navigation into them)"},{"name":"calendar-week-number","description":"The ISO week column (week_numbers:) - a columnheader stub plus one muted rowheader number per week; non-interactive"},{"name":"calendar-dropdown","description":"One caption dropdown unit (caption_layout: :dropdown) - the visible label with the real <select> stretched invisibly over it (the invisible-overlay pattern)","states":[{"attr":"data-calendar-unit","condition":"always - which unit this select drives","values":["month","year"]}]},{"name":"calendar-caption-label","description":"The visible text + chevron of a caption dropdown (aria-hidden - the overlaid select carries the value)"},{"name":"calendar-dropdown-value","description":"The label's text span - the controller rewrites it on navigation (month name or year)"},{"name":"calendar-grid","description":"The role=grid - the weekday header row plus six week rows (42 cells, always full weeks)"},{"name":"calendar-weekdays","description":"The role=row of weekday column headers"},{"name":"calendar-weekday","description":"One role=columnheader two-letter day label"},{"name":"calendar-week","description":"One role=row of seven day cells"},{"name":"calendar-day-cell","description":"The role=gridcell wrapper - aria-selected lives HERE (the ARIA grid contract; it is not valid on the button)"},{"name":"calendar-day","description":"One day <button> - the selection vocabulary and the roving tab stop ride here","states":[{"attr":"data-date","condition":"always - the day's ISO date (the controller's selection key)"},{"attr":"data-selected","condition":"the day is the single-mode pick, or a start-only range pick (bare; a complete range wears the range-* trio instead)"},{"attr":"data-range-start","condition":"the day starts a COMPLETE range"},{"attr":"data-range-end","condition":"the day ends a COMPLETE range"},{"attr":"data-range-middle","condition":"the day sits strictly inside a complete range"},{"attr":"data-today","condition":"the day is today (aria-current=date rides along)"},{"attr":"data-outside","condition":"the day belongs to a neighbouring month (leading/trailing fill)"}]},{"name":"calendar-day-label","description":"The day-number span inside the button"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"card","type":"registry:component","title":"Card","files":[{"path":"app/components/poetry/ui/card/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/card/component.html.erb"},{"path":"app/components/poetry/ui/card/component.rb","type":"registry:file","target":"app/components/poetry/ui/card/component.rb"},{"path":"app/components/poetry/ui/card/preview.rb","type":"registry:file","target":"app/components/poetry/ui/card/preview.rb"},{"path":"app/components/poetry/ui/card/style.rb","type":"registry:file","target":"app/components/poetry/ui/card/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Card::Component","identifier":"poetry--ui--card","parts":[{"name":"card","description":"Root container - the vertical flex stack"},{"name":"card-header","description":"The title row grid - gains a trailing auto column when card-action is present"},{"name":"card-title","description":"The heading (title_tag, h3 by default)"},{"name":"card-description","description":"Muted one-liner under the title"},{"name":"card-action","description":"The header's trailing corner control"},{"name":"card-content","description":"The body - the content block renders here"},{"name":"card-footer","description":"The bottom row (actions/meta)"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"carousel","type":"registry:component","title":"Carousel","files":[{"path":"app/components/poetry/ui/carousel/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/carousel/component.html.erb"},{"path":"app/components/poetry/ui/carousel/component.rb","type":"registry:file","target":"app/components/poetry/ui/carousel/component.rb"},{"path":"app/components/poetry/ui/carousel/preview.rb","type":"registry:file","target":"app/components/poetry/ui/carousel/preview.rb"},{"path":"app/components/poetry/ui/carousel/style.rb","type":"registry:file","target":"app/components/poetry/ui/carousel/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Carousel::Component","identifier":"poetry--ui--carousel","parts":[{"name":"carousel","description":"The role=region root - the controller (paging, button state, arrow keys) rides here","states":[{"attr":"data-orientation","condition":"the scroll axis","values":["horizontal","vertical"]}]},{"name":"carousel-content","description":"The viewport - a real scroll-snap container (tabindex=0); the platform owns the physics"},{"name":"carousel-item","description":"One role=group slide - sized by item classes (basis-full default)"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"checkbox","type":"registry:component","title":"Checkbox","files":[{"path":"app/components/poetry/ui/checkbox/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/checkbox/component.html.erb"},{"path":"app/components/poetry/ui/checkbox/component.rb","type":"registry:file","target":"app/components/poetry/ui/checkbox/component.rb"},{"path":"app/components/poetry/ui/checkbox/preview.rb","type":"registry:file","target":"app/components/poetry/ui/checkbox/preview.rb"},{"path":"app/components/poetry/ui/checkbox/style.rb","type":"registry:file","target":"app/components/poetry/ui/checkbox/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Checkbox::Component","identifier":"poetry--ui--checkbox","parts":[{"name":"checkbox","description":"The visual button[role=checkbox] - reflects the hidden input via aria-checked plus the checked triple","states":[{"attr":"data-checked","condition":"checked (the controller reflects every toggle here, aria-checked in step)"},{"attr":"data-unchecked","condition":"unchecked - the indicator goes invisible"},{"attr":"data-indeterminate","condition":"checked: :indeterminate (server/programmatic only; the first toggle resolves it to checked)"}]},{"name":"checkbox-indicator","description":"Centering span around the check glyph (minus when indeterminate) - CSS-hidden while unchecked, never unmounted","states":[{"attr":"data-checked","condition":"mirrors the control (the controller reflects state on every part wearing the triple)"},{"attr":"data-unchecked","condition":"mirrors the control - the indicator is invisible"},{"attr":"data-indeterminate","condition":"mirrors the control - the glyph swaps to minus"}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"clipboard-text","type":"registry:component","title":"Clipboard text","files":[{"path":"app/components/poetry/ui/clipboard_text/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/clipboard_text/component.html.erb"},{"path":"app/components/poetry/ui/clipboard_text/component.rb","type":"registry:file","target":"app/components/poetry/ui/clipboard_text/component.rb"},{"path":"app/components/poetry/ui/clipboard_text/preview.rb","type":"registry:file","target":"app/components/poetry/ui/clipboard_text/preview.rb"},{"path":"app/components/poetry/ui/clipboard_text/style.rb","type":"registry:file","target":"app/components/poetry/ui/clipboard_text/style.rb"}],"registryDependencies":["input","input-group","button","icon"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::ClipboardText::Component","identifier":"poetry--ui--clipboard_text","parts":[{"name":"clipboard-text","description":"Root - the controller rides here","states":[{"attr":"data-copied","condition":"stamped for a beat after a successful copy (the stacked copy/check glyphs swap off it)"}]},{"name":"clipboard-text-group","description":"The bordered field surface - InputGroup's chrome"},{"name":"input-group-control","description":"The readonly mono <input> showing the value - selectable, never editable; InputGroup's control slot"},{"name":"input-group-addon","description":"The trailing cell holding the copy affordance - InputGroup's addon vocabulary","states":[{"attr":"data-align","condition":"always - inline-end holds the copy button","values":["inline-end"]}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"code-block","type":"registry:component","title":"Code block","files":[{"path":"app/components/poetry/ui/code_block/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/code_block/component.html.erb"},{"path":"app/components/poetry/ui/code_block/component.rb","type":"registry:file","target":"app/components/poetry/ui/code_block/component.rb"},{"path":"app/components/poetry/ui/code_block/preview.rb","type":"registry:file","target":"app/components/poetry/ui/code_block/preview.rb"},{"path":"app/components/poetry/ui/code_block/style.rb","type":"registry:file","target":"app/components/poetry/ui/code_block/style.rb"}],"registryDependencies":["button","icon"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::CodeBlock::Component","identifier":"poetry--ui--code_block","parts":[{"name":"code-block","description":"Root - the syntax-palette surface (cn-code-block)","states":[{"attr":"data-language","condition":"always - the lexer name, a styling/tooling hook"},{"attr":"data-line-numbers","condition":"line_numbers: - turns on the ::before CSS counters"},{"attr":"data-copied","condition":"copy: only - stamped for a beat after a successful copy (the clipboard-text engine)"}]},{"name":"code-block-pre","description":"The scroll container - tabindex 0 + role region + label (a scrollable region must be keyboard-reachable and named)"},{"name":"code-block-code","description":"The code element - rouge's .line/.hll spans and the seven --syntax-* token maps live under it; the copy affordance reads ITS textContent"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"collapsible","type":"registry:component","title":"Collapsible","files":[{"path":"app/components/poetry/ui/collapsible/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/collapsible/component.html.erb"},{"path":"app/components/poetry/ui/collapsible/component.rb","type":"registry:file","target":"app/components/poetry/ui/collapsible/component.rb"},{"path":"app/components/poetry/ui/collapsible/preview.rb","type":"registry:file","target":"app/components/poetry/ui/collapsible/preview.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Collapsible::Component","identifier":"poetry--ui--collapsible","parts":[{"name":"collapsible","description":"The disclosure root - the state controller flips the pair here","states":[{"attr":"data-open","condition":"expanded (server-rendered from open:; the controller flips the pair at runtime)"},{"attr":"data-closed","condition":"collapsed (the server-rendered default)"}]},{"name":"collapsible-trigger","description":"The disclosure button - mirrors aria-expanded","states":[{"attr":"data-panel-open","condition":"its content is open (controller-written; absent while closed)"}]},{"name":"collapsible-content","description":"The disclosure panel - stays in the DOM when closed (hidden) and rides the presence helper on exit","states":[{"attr":"data-open","condition":"content is open or entering"},{"attr":"data-closed","condition":"content is closed or animating out (hidden lands after the exit finishes)"}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"combobox","type":"registry:component","title":"Combobox","files":[{"path":"app/components/poetry/ui/combobox/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/combobox/component.html.erb"},{"path":"app/components/poetry/ui/combobox/component.rb","type":"registry:file","target":"app/components/poetry/ui/combobox/component.rb"},{"path":"app/components/poetry/ui/combobox/preview.rb","type":"registry:file","target":"app/components/poetry/ui/combobox/preview.rb"},{"path":"app/components/poetry/ui/combobox/style.rb","type":"registry:file","target":"app/components/poetry/ui/combobox/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Combobox::Component","identifier":"poetry--ui--combobox","parts":[{"name":"combobox","description":"Root wrapper carrying both controllers (combobox + popper) and the optional dir attribute"},{"name":"combobox-native","description":"The visually-hidden native <select> - the serialization truth (Select's decision verbatim); plumbing, never styled or targeted"},{"name":"combobox-trigger","description":"The role=combobox button (the demo's outline Button) the field label reaches - value display and chevrons ride inside","states":[{"attr":"data-placeholder","condition":"no option is committed (bare; the controller toggles it on every commit)"},{"attr":"data-popup-open","condition":"the popup is open (bare while open, absent while closed - the controller flips it with the open state)"}]},{"name":"combobox-value","description":"The value display span - the selected option's label, or the placeholder","states":[{"attr":"data-placeholder","condition":"placeholder: is given - carries the placeholder text so the controller can restore it"}]},{"name":"combobox-chip-input","description":"The inline filter input beside the chips (multiple: only) - the one typing surface; the source's chip input"},{"name":"combobox-content","description":"The popper-positioned popup housing the embedded Command anatomy - open/closed and the resolved placement ride here","states":[{"attr":"data-open","condition":"popup is open (the controller flips the pair at runtime)"},{"attr":"data-closed","condition":"popup is closed or animating out (the server-rendered state)"},{"attr":"data-chips","condition":"multiple: - chips mode; the popup's minimum width follows the chips field"},{"attr":"data-side","condition":"the placement side - server-rendered from side:, rewritten to the resolved side by popper on open","values":["top","right","bottom","left"]},{"attr":"data-align","condition":"the placement alignment - server-rendered from align:, rewritten by popper on open","values":["start","center","end"]}],"vars":[{"name":"--transform-origin","description":"popper - the animation origin matching the resolved placement"},{"name":"--available-width","description":"popper - viewport space available to the popup post-flip"},{"name":"--available-height","description":"popper - viewport space available to the popup post-flip"},{"name":"--anchor-width","description":"popper - the trigger's measured width (the popup width tracks it - one knob, two surfaces)"},{"name":"--anchor-height","description":"popper - the trigger's measured height"}]},{"name":"combobox-clear","description":"The show_clear: deselection X - a trigger sibling seated over the chevron slot; pressing it commits the blank value and returns focus to the trigger. Wears the html hidden attribute while no value is committed (the controller flips it on every commit; the chevron swap derives from that one flip in CSS)"},{"name":"combobox-command","description":"The embedded engine root - Command's anatomy rendered here against its own controller (composition at the markup contract)"},{"name":"combobox-input-wrapper","description":"The input row - search icon + filter input above the list"},{"name":"combobox-search-icon","description":"Decorative search glyph beside the input"},{"name":"combobox-input","description":"The filter input (role=combobox) - the typing session and aria-activedescendant live here. Single: in the popup with its own accessible name; multiple: INLINE in the chips frame (the input-inside layout), where the field label reaches it","states":[{"attr":"data-popup-open","condition":"multiple: the popup is open (bare while open, absent while closed - the input carries the flip; single's trigger owns it)"}]},{"name":"combobox-list","description":"THE role=listbox - the aria-controls target of both combobox roles"},{"name":"combobox-empty","description":"Zero-matches message - rendered hidden; the engine unhides it when the filter pass leaves no visible items"},{"name":"combobox-group","description":"role=group labelled by its heading - hidden by the engine when every member item is filtered out"},{"name":"combobox-label","description":"The group heading - styled, no ARIA role (the group points at it via aria-labelledby)"},{"name":"combobox-item","description":"One role=option div wearing BOTH meanings - a Command item (filtering + highlight) AND Select's committed-value surface","states":[{"attr":"data-value","condition":"always - the option's committable value (the native <option> twin)"},{"attr":"data-selected","condition":"the option is committed (bare; absent while unselected - the controller twin-writes it with aria-selected)"},{"attr":"data-highlighted","condition":"the item holds the activedescendant highlight (the server seeds it; the engine moves it with the input's aria-activedescendant)"},{"attr":"data-disabled","condition":"disabled: is set (aria-disabled rides along)"},{"attr":"data-hidden","condition":"the filter scored the item zero (the engine pairs it with hidden; never rendered server-side)"}]},{"name":"combobox-item-text","description":"The option's label span - the filter/typematch text source"},{"name":"combobox-item-indicator","description":"The trailing committed-value check (ms-auto per the demo) - the parent item's data-selected absence hides it"},{"name":"combobox-separator","description":"Decorative divider (aria-hidden) - hidden by the engine whenever the query is non-empty"},{"name":"combobox-loading","description":"Pending affordance (role=status) - rendered hidden; the HOST unhides it around async refills"},{"name":"combobox-status","description":"The engine's sr-only polite result-count live region","states":[{"attr":"data-zero","condition":"always - the localized zero-results template"},{"attr":"data-one","condition":"always - the localized one-result template"},{"attr":"data-other","condition":"always - the localized many-results template (a literal count placeholder the controller interpolates)"}]},{"name":"combobox-chips","description":"The chips FIELD frame (multiple: only) - the popper anchor replacing the trigger; chips + the inline input flex-wrap inside, and role=toolbar rides it only while it holds >=1 chip","states":[{"attr":"data-placeholder","condition":"the selection is empty (bare; the controller flips it on every commit - the toolbar role departs with it)"},{"attr":"data-disabled","condition":"disabled: is set - every chip mutation is gated"},{"attr":"data-remove-label","condition":"always - the localized chip-remove template (a literal label placeholder the controller interpolates for client-built chips)"}]},{"name":"combobox-chip","description":"One committed value (multiple: only) - a div taking REAL focus (tabindex=-1, styled by :focus-visible; chips NEVER wear data-highlighted), named by its value text, holding the remove button","states":[{"attr":"data-value","condition":"always - the chip's committed value (the native <option> twin)"},{"attr":"data-disabled","condition":"disabled: is set (chip focus is blocked entirely)"}]},{"name":"combobox-chip-remove","description":"The chip's native remove button (tabindex=-1, labelled 'Remove <label>') - a press removes the value and is never a chips-area press"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"command","type":"registry:component","title":"Command","files":[{"path":"app/components/poetry/ui/command/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/command/component.html.erb"},{"path":"app/components/poetry/ui/command/component.rb","type":"registry:file","target":"app/components/poetry/ui/command/component.rb"},{"path":"app/components/poetry/ui/command/preview.rb","type":"registry:file","target":"app/components/poetry/ui/command/preview.rb"},{"path":"app/components/poetry/ui/command/style.rb","type":"registry:file","target":"app/components/poetry/ui/command/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Command::Component","identifier":"poetry--ui--command","parts":[{"name":"command","description":"Root of the palette - the input row over the listbox, carrying the engine controller"},{"name":"command-input-wrapper","description":"The input row - search icon + filter input above the list"},{"name":"command-search-icon","description":"Decorative search glyph beside the input"},{"name":"command-input","description":"The role=combobox filter input - real focus stays pinned here for the whole session; the highlight rides aria-activedescendant"},{"name":"command-list","description":"The role=listbox holding empty/loading/items - the input's aria-controls target"},{"name":"command-empty","description":"Zero-matches message - rendered hidden; the controller unhides it when the filter pass leaves no visible items"},{"name":"command-loading","description":"Pending affordance (role=status) - rendered hidden; the HOST toggles it (Turbo frame events), Command never does"},{"name":"command-group","description":"role=group labelled by its heading - hidden by the controller when every member item is filtered out","states":[{"attr":"data-always-render","condition":"always_render: is set - the group survives every filter pass"}]},{"name":"command-group-heading","description":"The group heading - styled, no ARIA role (the group points at it via aria-labelledby)"},{"name":"command-item","description":"One role=option action row - highlight, filtering, and disablement ride here (never aria-selected in a bare Command)","states":[{"attr":"data-value","condition":"always - the item's unique value (its server-stable id follows registration order)"},{"attr":"data-highlighted","condition":"the item holds the highlight (bare; the controller twin-writes it with the input's aria-activedescendant)"},{"attr":"data-disabled","condition":"disabled: is set (aria-disabled rides along)"},{"attr":"data-keywords","condition":"keywords: given - extra filter terms beyond the label"},{"attr":"data-always-render","condition":"always_render: is set - the item survives every filter pass"},{"attr":"data-hidden","condition":"the filter scored the item zero (the controller pairs it with hidden; never rendered server-side)"}]},{"name":"command-item-text","description":"The item's label span - the filter/typematch text source (shortcuts and icons excluded)"},{"name":"command-shortcut","description":"Presentational keyboard hint - excluded from the filter text; Command never binds the hinted key"},{"name":"command-separator","description":"Decorative divider (aria-hidden) - hidden by the controller whenever the query is non-empty"},{"name":"command-status","description":"The sr-only polite result-count live region - the controller writes the debounced count from the localized templates","states":[{"attr":"data-zero","condition":"always - the localized zero-results template"},{"attr":"data-one","condition":"always - the localized one-result template"},{"attr":"data-other","condition":"always - the localized many-results template (a literal count placeholder the controller interpolates)"}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"command-dialog","type":"registry:component","title":"Command dialog","files":[{"path":"app/components/poetry/ui/command/dialog_component.html.erb","type":"registry:file","target":"app/components/poetry/ui/command/dialog_component.html.erb"},{"path":"app/components/poetry/ui/command/dialog_component.rb","type":"registry:file","target":"app/components/poetry/ui/command/dialog_component.rb"},{"path":"app/components/poetry/ui/command/dialog_preview.rb","type":"registry:file","target":"app/components/poetry/ui/command/dialog_preview.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Command::DialogComponent","identifier":"poetry--ui--command--dialog","parts":[{"name":"command-dialog","description":"Root wrapper around the trigger and the <dialog> - the palette's own chrome; the embedded Command inside carries its own part contract"},{"name":"dialog-content","description":"The <dialog> panel (Dialog's chrome retuned to overflow-hidden p-0) - positioning, animation, and the open state ride here","states":[{"attr":"data-open","condition":"panel is open (the dialog controller flips the pair at runtime)"},{"attr":"data-closed","condition":"panel is closed or animating out (the server-rendered state)"}]},{"name":"dialog-header","description":"Dialog's title block, sr-only here - the palette owns the visible surface"},{"name":"dialog-title","description":"The sr-only heading - the dialog's accessible name (defaults to the source string)"},{"name":"dialog-description","description":"The sr-only description wired to aria-describedby"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"composed-chart","type":"registry:component","title":"Composed chart","files":[{"path":"app/components/poetry/charts/composed_chart/component.html.erb","type":"registry:file","target":"app/components/poetry/charts/composed_chart/component.html.erb"},{"path":"app/components/poetry/charts/composed_chart/component.rb","type":"registry:file","target":"app/components/poetry/charts/composed_chart/component.rb"},{"path":"app/components/poetry/charts/composed_chart/preview.rb","type":"registry:file","target":"app/components/poetry/charts/composed_chart/preview.rb"},{"path":"app/components/poetry/charts/composed_chart/style.rb","type":"registry:file","target":"app/components/poetry/charts/composed_chart/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-charts","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Charts::ComposedChart::Component","identifier":"poetry--charts--composed_chart","parts":[{"name":"chart-svg","description":"The chart canvas (<svg>) - server-computed geometry in a fixed viewBox; role=img, or the focusable role=application accessibilityLayer when the tooltip attaches","states":[{"attr":"data-animate","condition":"present when animate (the default) - the motion stylesheet and controller key the entrance off it"},{"attr":"data-motion","condition":"runtime - the motion rig stamps the animation lifecycle (entrance/morph, then settled)","values":["entrance","morph","settled"]}],"vars":[{"name":"--poetry-motion-duration","description":"the entrance/morph duration (animation_duration, ms)"},{"name":"--poetry-motion-easing","description":"the animation easing keyword (animation_easing)"},{"name":"--poetry-motion-delay","description":"the pre-animation hold (animation_begin, ms)"}]},{"name":"chart-motion-reveal","description":"The entrance clipPath rect (the ported area reveal) - the motion stylesheet scales it 0 -> 1; only when animate"},{"name":"chart-grid","description":"The gridline group (with_grid) - horizontal and/or vertical rules across the plot"},{"name":"chart-cursor","description":"The hover cursor, hidden until the tooltip controller positions and reveals it at the active index - a vertical rule or a translucent band rect (bar charts)"},{"name":"chart-areas","description":"The area-mark group - a fill path plus top-curve stroke per series, clipped by the reveal rect while animating"},{"name":"chart-area","description":"One series' fill path (var(--color-<key>) or its gradient)","states":[{"attr":"data-key","condition":"the series key"}]},{"name":"chart-area-stroke","description":"One series' top-curve stroke path (the source strokes the curve, never the area outline)","states":[{"attr":"data-key","condition":"the series key"}]},{"name":"chart-bar-series","description":"One series' bar group","states":[{"attr":"data-key","condition":"the series key"}]},{"name":"chart-bar","description":"One bar cell (a per-corner rounded-rect path)","states":[{"attr":"data-key","condition":"the series key"},{"attr":"data-index","condition":"the datum index"},{"attr":"data-active","condition":"runtime - the tooltip controller marks the hovered index"},{"attr":"data-motion-origin","condition":"when animate - the zero edge the entrance grows from","values":["bottom","top"]}]},{"name":"chart-lines","description":"The line-mark group - each series' curve plus its companion marks"},{"name":"chart-line","description":"One series' stroked curve - pathLength=1 when animating so the dash draw-in needs no measurement","states":[{"attr":"data-key","condition":"the series key"}]},{"name":"chart-dots","description":"One series' point-dot group (dots: true)","states":[{"attr":"data-key","condition":"the series key"}]},{"name":"chart-dot","description":"One point dot (<circle>)"},{"name":"chart-active-dots","description":"The hover-marker group (with_tooltip) - pre-rendered hidden circles for every series x index"},{"name":"chart-active-dot","description":"One hover marker - display=none until the tooltip controller reveals the active index's dot","states":[{"attr":"data-key","condition":"the series key"},{"attr":"data-index","condition":"the datum index"},{"attr":"data-active","condition":"runtime - rides the marker while its index is the active one"}]},{"name":"chart-x-axis","description":"The x-axis tick-label group (with_x_axis)"},{"name":"chart-coordinates","description":"The embedded per-index geometry payload (<script type=application/json>) the tooltip controller reads - zero chart math in the browser"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"container","type":"registry:component","title":"Container","files":[{"path":"app/components/poetry/charts/container/component.html.erb","type":"registry:file","target":"app/components/poetry/charts/container/component.html.erb"},{"path":"app/components/poetry/charts/container/component.rb","type":"registry:file","target":"app/components/poetry/charts/container/component.rb"},{"path":"app/components/poetry/charts/container/preview.rb","type":"registry:file","target":"app/components/poetry/charts/container/preview.rb"},{"path":"app/components/poetry/charts/container/style.rb","type":"registry:file","target":"app/components/poetry/charts/container/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-charts","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Charts::Container::Component","identifier":"poetry--charts--container","parts":[{"name":"chart","description":"The chart frame (<div>) - the aspect-video chrome, the tooltip layer's positioning anchor, and the id scope the per-series colors are emitted for","states":[{"attr":"data-chart","condition":"always - the chart instance id (explicit id: or unique per render); the scoped color emission keys off it"}],"vars":[{"name":"--color-*","description":"per-series color, one entry per series key - the frame's <style> block emits them for [data-chart=<id>] in both themes"}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"context-menu","type":"registry:component","title":"Context menu","files":[{"path":"app/components/poetry/ui/context_menu/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/context_menu/component.html.erb"},{"path":"app/components/poetry/ui/context_menu/component.rb","type":"registry:file","target":"app/components/poetry/ui/context_menu/component.rb"},{"path":"app/components/poetry/ui/context_menu/preview.rb","type":"registry:file","target":"app/components/poetry/ui/context_menu/preview.rb"},{"path":"app/components/poetry/ui/context_menu/style.rb","type":"registry:file","target":"app/components/poetry/ui/context_menu/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::ContextMenu::Component","identifier":"poetry--ui--context_menu","parts":[{"name":"context-menu","description":"Root wrapper hosting the context-menu + menu + popper controllers around the surface and content"},{"name":"context-menu-trigger","description":"The right-click/long-press SURFACE wrapping the logical object - not a widget: no role, no aria-haspopup","states":[{"attr":"data-popup-open","condition":"the menu is open (absence is the closed state - no aria-expanded on a role-less surface)"},{"attr":"data-disabled","condition":"the surface is inert (disabled: true)"}]},{"name":"context-menu-content","description":"The role=menu popup panel - anchored at the pointer via popper's virtual-anchor mode; open state and animation ride here","states":[{"attr":"data-open","condition":"menu is open (presence flips the pair at runtime)"},{"attr":"data-closed","condition":"menu is closed or animating out (the server-rendered state)"},{"attr":"data-side","condition":"the placement side (the side: option, default right; popper re-writes it after collision flips)","values":["top","right","bottom","left"]},{"attr":"data-align","condition":"the alignment (forced start initially; popper re-resolves it)","values":["start","center","end"]}],"vars":[{"name":"--transform-origin","description":"popper's anchor-facing animation origin"},{"name":"--available-width","description":"popper: viewport space left for the panel (post-flip)"},{"name":"--available-height","description":"popper: viewport space left for the panel (post-flip)"},{"name":"--anchor-width","description":"popper: the anchor rect's measured width"},{"name":"--anchor-height","description":"popper: the anchor rect's measured height"}]},{"name":"context-menu-group","description":"role=group semantic grouping between separators"},{"name":"context-menu-label","description":"Non-interactive heading for a run of items","states":[{"attr":"data-inset","condition":"indented to align with checkbox/radio item text (inset: true)"}]},{"name":"context-menu-item","description":"One role=menuitem action row","states":[{"attr":"data-variant","condition":"default or destructive (the danger treatment)"},{"attr":"data-inset","condition":"indented to align with checkbox/radio item text (inset: true)"},{"attr":"data-disabled","condition":"item is disabled (always written together with aria-disabled)"}]},{"name":"context-menu-checkbox-item","description":"A role=menuitemcheckbox toggle row","states":[{"attr":"data-checked","condition":"checked (the controller re-writes the pair with aria-checked on activation)"},{"attr":"data-unchecked","condition":"unchecked"},{"attr":"data-disabled","condition":"item is disabled (always written together with aria-disabled)"},{"attr":"data-close-on-select","condition":"per-item override of the menu's close-on-select default (\"false\" keeps the menu open)"}]},{"name":"context-menu-radio-group","description":"role=group scoping one single-select value","states":[{"attr":"data-value","condition":"the selected radio value (the controller re-writes it on change)"}]},{"name":"context-menu-radio-item","description":"A role=menuitemradio row inside a radio group","states":[{"attr":"data-checked","condition":"the selected radio (the controller re-writes the pair with aria-checked)"},{"attr":"data-unchecked","condition":"not selected"},{"attr":"data-value","condition":"the radio's value"},{"attr":"data-disabled","condition":"item is disabled (always written together with aria-disabled)"}]},{"name":"context-menu-checkbox-item-indicator","description":"The check glyph inside checkbox items (aria-hidden; the item carries the checked state)"},{"name":"context-menu-radio-item-indicator","description":"The circle glyph inside radio items (aria-hidden; the item carries the checked state)"},{"name":"context-menu-separator","description":"role=separator rule between groups"},{"name":"context-menu-shortcut","description":"The trailing keybinding HINT - aria-hidden, never binds the key"},{"name":"context-menu-sub","description":"A submenu scope - hosts its own popper around the sub trigger/content pair"},{"name":"context-menu-sub-trigger","description":"The role=menuitem row opening its submenu","states":[{"attr":"data-popup-open","condition":"its submenu is open (written with aria-expanded; absence is the closed state)"},{"attr":"data-inset","condition":"indented to align with checkbox/radio item text (inset: true)"}]},{"name":"context-menu-sub-content","description":"The nested role=menu panel - its own popper content on the same presence machinery","states":[{"attr":"data-open","condition":"submenu is open (presence flips the pair at runtime)"},{"attr":"data-closed","condition":"submenu is closed (the server-rendered state)"},{"attr":"data-side","condition":"the placement side (right/left by direction; popper resolves it at runtime)","values":["top","right","bottom","left"]},{"attr":"data-align","condition":"the alignment against the sub-trigger (popper resolves it at runtime)","values":["start","center","end"]}],"vars":[{"name":"--transform-origin","description":"popper's anchor-facing animation origin"},{"name":"--available-width","description":"popper: viewport space left for the panel (post-flip)"},{"name":"--available-height","description":"popper: viewport space left for the panel (post-flip)"},{"name":"--anchor-width","description":"popper: the sub-trigger's measured width"},{"name":"--anchor-height","description":"popper: the sub-trigger's measured height"}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"data-index","type":"registry:block","title":"Data index","description":"A contained records screen: title bar with primary action, search-and-filter toolbar, status-badged table with a totals footer, and a result count paired with pagination.","files":[{"path":"lib/generators/poetry/block/templates/data_index.html.erb","type":"registry:file","target":"app/views/blocks/_data_index.html.erb"}],"registryDependencies":["badge","button","button-group","icon","input-group","label","native-select","pagination","table"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"copy-in","keywords":["index","list","listing","table","records","directory","filter","pagination","management","browse","catalog"]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"data-table","type":"registry:component","title":"Data table","files":[{"path":"app/components/poetry/ui/data_table/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/data_table/component.html.erb"},{"path":"app/components/poetry/ui/data_table/component.rb","type":"registry:file","target":"app/components/poetry/ui/data_table/component.rb"},{"path":"app/components/poetry/ui/data_table/preview.rb","type":"registry:file","target":"app/components/poetry/ui/data_table/preview.rb"},{"path":"app/components/poetry/ui/data_table/state.rb","type":"registry:file","target":"app/components/poetry/ui/data_table/state.rb"},{"path":"app/components/poetry/ui/data_table/style.rb","type":"registry:file","target":"app/components/poetry/ui/data_table/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::DataTable::Component","identifier":"poetry--ui--data_table","parts":[{"name":"data-table","description":"Root surface - toolbar, table, and pagination footer stack here"},{"name":"data-table-toolbar","description":"The row above the table holding the filter form - renders unless filter: false"},{"name":"data-table-filter","description":"The GET filter form (role=search) - hidden fields carry the current sort; a new filter resets the page"},{"name":"table-container","description":"The composed Table's scroll container - Table renders it, this surface owns where it sits"},{"name":"data-table-footer","description":"The Pagination row - renders when total: is more than one page"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"date-field","type":"registry:component","title":"Date field","files":[{"path":"app/components/poetry/ui/date_field/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/date_field/component.html.erb"},{"path":"app/components/poetry/ui/date_field/component.rb","type":"registry:file","target":"app/components/poetry/ui/date_field/component.rb"},{"path":"app/components/poetry/ui/date_field/preview.rb","type":"registry:file","target":"app/components/poetry/ui/date_field/preview.rb"},{"path":"app/components/poetry/ui/date_field/style.rb","type":"registry:file","target":"app/components/poetry/ui/date_field/style.rb"}],"registryDependencies":["input"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::DateField::Component","identifier":"poetry--ui--date_field","parts":[{"name":"date-field","description":"Root - the controller and the enhanced/disabled surface ride here","states":[{"attr":"data-enhanced","condition":"the controller connected and built segments (no JS = the native input, visible and styled)"},{"attr":"data-disabled","condition":"disabled: is set"},{"attr":"data-invalid","condition":"invalid: is set (the group wears the destructive ring)"}]},{"name":"date-field-group","description":"The bordered segment row (cn-input chrome, focus-within ring) - hidden until enhancement, then the editing surface the controller fills with segments","states":[{"attr":"data-disabled","condition":"disabled: is set (chrome dims, pointer events off)"},{"attr":"data-invalid","condition":"invalid: is set (destructive border + ring)"}]},{"name":"date-field-input","description":"The native <input type=date> - THE form value in both modes; tabindex -1 + aria-hidden once segments exist"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"date-picker","type":"registry:component","title":"Date picker","files":[{"path":"app/components/poetry/ui/date_picker/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/date_picker/component.html.erb"},{"path":"app/components/poetry/ui/date_picker/component.rb","type":"registry:file","target":"app/components/poetry/ui/date_picker/component.rb"},{"path":"app/components/poetry/ui/date_picker/preview.rb","type":"registry:file","target":"app/components/poetry/ui/date_picker/preview.rb"},{"path":"app/components/poetry/ui/date_picker/style.rb","type":"registry:file","target":"app/components/poetry/ui/date_picker/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::DatePicker::Component","identifier":"poetry--ui--date_picker","parts":[{"name":"date-picker","description":"Root wrapper - the glue controller (formats the trigger label, closes on pick) around the composed Popover + Calendar"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"date-time-field","type":"registry:component","title":"Date time field","files":[{"path":"app/components/poetry/ui/date_time_field/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/date_time_field/component.html.erb"},{"path":"app/components/poetry/ui/date_time_field/component.rb","type":"registry:file","target":"app/components/poetry/ui/date_time_field/component.rb"},{"path":"app/components/poetry/ui/date_time_field/preview.rb","type":"registry:file","target":"app/components/poetry/ui/date_time_field/preview.rb"},{"path":"app/components/poetry/ui/date_time_field/style.rb","type":"registry:file","target":"app/components/poetry/ui/date_time_field/style.rb"}],"registryDependencies":["date-field","input"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::DateTimeField::Component","identifier":"poetry--ui--date_time_field","parts":[{"name":"date-time-field","description":"Root - the controller and the enhanced/disabled surface ride here (segments inside share the date-field-* vocabulary)","states":[{"attr":"data-enhanced","condition":"the controller connected and built segments (no JS = the native input, visible and styled)"},{"attr":"data-disabled","condition":"disabled: is set"},{"attr":"data-invalid","condition":"invalid: is set (the group wears the destructive ring)"}]},{"name":"date-time-field-group","description":"The bordered segment row - hidden until enhancement, then the editing surface (cn-input chrome, focus-within ring)","states":[{"attr":"data-disabled","condition":"disabled: is set (chrome dims, pointer events off)"},{"attr":"data-invalid","condition":"invalid: is set (destructive border + ring)"}]},{"name":"date-time-field-input","description":"The native <input type=datetime-local> - THE form value in both modes; tabindex -1 + aria-hidden once segments exist"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"deferred","type":"registry:component","title":"Deferred","files":[{"path":"app/components/poetry/ui/deferred/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/deferred/component.html.erb"},{"path":"app/components/poetry/ui/deferred/component.rb","type":"registry:file","target":"app/components/poetry/ui/deferred/component.rb"},{"path":"app/components/poetry/ui/deferred/preview.rb","type":"registry:file","target":"app/components/poetry/ui/deferred/preview.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Deferred::Component","identifier":"poetry--ui--deferred","parts":[{"name":"deferred","description":"The <turbo-frame> root - src is armed at connect(); failure is a state reflected here, never silent blankness","states":[{"attr":"data-error","condition":"a frame fetch failed (error response, missing frame, or network error) - the controller stamps the error card; retry clears it"}]},{"name":"deferred-error","description":"The retryable error card, stamped into the frame from the slotted <template> on failure"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"destructive-panel","type":"registry:block","title":"Destructive panel","description":"A guarded destructive action: heading and consequences in plain language, a severity-tinted alert with the blast radius, and a cancel/confirm action pair.","files":[{"path":"lib/generators/poetry/block/templates/destructive_panel.html.erb","type":"registry:file","target":"app/views/blocks/_destructive_panel.html.erb"}],"registryDependencies":["alert","button","icon"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"copy-in","keywords":["deletion","deactivate","irreversible","permanently"]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"dialog","type":"registry:component","title":"Dialog","files":[{"path":"app/components/poetry/ui/dialog/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/dialog/component.html.erb"},{"path":"app/components/poetry/ui/dialog/component.rb","type":"registry:file","target":"app/components/poetry/ui/dialog/component.rb"},{"path":"app/components/poetry/ui/dialog/preview.rb","type":"registry:file","target":"app/components/poetry/ui/dialog/preview.rb"},{"path":"app/components/poetry/ui/dialog/style.rb","type":"registry:file","target":"app/components/poetry/ui/dialog/style.rb"}],"registryDependencies":["button","icon"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Dialog::Component","identifier":"poetry--ui--dialog","parts":[{"name":"dialog","description":"Root wrapper around the trigger and the <dialog> element"},{"name":"dialog-content","description":"The <dialog> panel - positioning, animation, and the open state ride here","states":[{"attr":"data-open","condition":"panel is open (the controller flips the pair at runtime)"},{"attr":"data-closed","condition":"panel is closed or animating out (the server-rendered state)"}]},{"name":"dialog-header","description":"Title block at the top of the panel"},{"name":"dialog-title","description":"The heading - the dialog's accessible name (required slot)"},{"name":"dialog-description","description":"Muted copy under the title, wired to aria-describedby"},{"name":"dialog-footer","description":"Action row at the bottom of the panel"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"drawer","type":"registry:component","title":"Drawer","files":[{"path":"app/components/poetry/ui/drawer/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/drawer/component.html.erb"},{"path":"app/components/poetry/ui/drawer/component.rb","type":"registry:file","target":"app/components/poetry/ui/drawer/component.rb"},{"path":"app/components/poetry/ui/drawer/preview.rb","type":"registry:file","target":"app/components/poetry/ui/drawer/preview.rb"},{"path":"app/components/poetry/ui/drawer/style.rb","type":"registry:file","target":"app/components/poetry/ui/drawer/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Drawer::Component","identifier":"poetry--ui--drawer","parts":[{"name":"drawer","description":"Root wrapper around the trigger and the <dialog> element"},{"name":"drawer-content","description":"The <dialog> popup - the edge chrome, presence animation, and the swipe contract all ride here (::backdrop inherits the swipe vars, so the overlay fade rides along)","states":[{"attr":"data-open","condition":"popup is open (the controller flips the pair at runtime)"},{"attr":"data-closed","condition":"popup is closed or animating out (the server-rendered state)"},{"attr":"data-swipe-direction","condition":"always - the dismiss direction","values":["down","up","left","right"]},{"attr":"data-swiping","condition":"a pointer drag is tracking (transitions go duration-0 - the drawer follows the finger)"},{"attr":"data-snap-points","condition":"snap_points: present - the popup runs full-height and --drawer-snap-point-offset rests it at the current point"},{"attr":"data-starting-style","condition":"the enter transition's first frame (the presence helper's two-frame trick)"},{"attr":"data-ending-style","condition":"held through the exit transition before the native close()"}],"vars":[{"name":"--drawer-swipe-movement-x","description":"px dragged toward a left/right dismissal (controller-written during swipes)"},{"name":"--drawer-swipe-movement-y","description":"px dragged toward an up/down dismissal (controller-written during swipes)"},{"name":"--drawer-swipe-progress","description":"0..1 fraction of the dismiss travel (the backdrop fade rides it)"},{"name":"--drawer-swipe-strength","description":"remaining-travel factor set on release - scales the exit duration so a mostly-swiped drawer closes fast"}]},{"name":"drawer-swipe-handle","description":"The grab pill (show_swipe_handle: true, aria-hidden) - a drag may always start on it"},{"name":"drawer-header","description":"Title block at the top of the popup"},{"name":"drawer-title","description":"The heading - the drawer's accessible name (required slot)"},{"name":"drawer-description","description":"Muted copy under the title, wired to aria-describedby"},{"name":"drawer-body","description":"The scrollable content region between header and footer"},{"name":"drawer-footer","description":"Action row pinned to the bottom of the popup"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"dropdown-menu","type":"registry:component","title":"Dropdown menu","files":[{"path":"app/components/poetry/ui/dropdown_menu/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/dropdown_menu/component.html.erb"},{"path":"app/components/poetry/ui/dropdown_menu/component.rb","type":"registry:file","target":"app/components/poetry/ui/dropdown_menu/component.rb"},{"path":"app/components/poetry/ui/dropdown_menu/preview.rb","type":"registry:file","target":"app/components/poetry/ui/dropdown_menu/preview.rb"},{"path":"app/components/poetry/ui/dropdown_menu/style.rb","type":"registry:file","target":"app/components/poetry/ui/dropdown_menu/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::DropdownMenu::Component","identifier":"poetry--ui--dropdown_menu","parts":[{"name":"dropdown-menu","description":"Root wrapper hosting the menu + popper controllers around the trigger and content"},{"name":"dropdown-menu-content","description":"The role=menu popup panel - positioning, animation, and the open state ride here","states":[{"attr":"data-open","condition":"menu is open (presence flips the pair at runtime)"},{"attr":"data-closed","condition":"menu is closed or animating out (the server-rendered state)"},{"attr":"data-side","condition":"the placement side (popper re-writes it after collision flips)","values":["top","right","bottom","left"]},{"attr":"data-align","condition":"the alignment against the trigger (popper re-resolves it)","values":["start","center","end"]}],"vars":[{"name":"--transform-origin","description":"popper's anchor-facing animation origin"},{"name":"--available-width","description":"popper: viewport space left for the panel (post-flip)"},{"name":"--available-height","description":"popper: viewport space left for the panel (post-flip)"},{"name":"--anchor-width","description":"popper: the trigger's measured width"},{"name":"--anchor-height","description":"popper: the trigger's measured height"}]},{"name":"dropdown-menu-group","description":"role=group semantic grouping between separators"},{"name":"dropdown-menu-label","description":"Non-interactive heading for a run of items","states":[{"attr":"data-inset","condition":"indented to align with checkbox/radio item text (inset: true)"}]},{"name":"dropdown-menu-item","description":"One role=menuitem action row","states":[{"attr":"data-variant","condition":"default or destructive (the danger treatment)"},{"attr":"data-inset","condition":"indented to align with checkbox/radio item text (inset: true)"},{"attr":"data-disabled","condition":"item is disabled (always written together with aria-disabled)"}]},{"name":"dropdown-menu-checkbox-item","description":"A role=menuitemcheckbox toggle row","states":[{"attr":"data-checked","condition":"checked (the controller re-writes the pair with aria-checked on activation)"},{"attr":"data-unchecked","condition":"unchecked"},{"attr":"data-disabled","condition":"item is disabled (always written together with aria-disabled)"},{"attr":"data-close-on-select","condition":"per-item override of the menu's close-on-select default (\"false\" keeps the menu open)"}]},{"name":"dropdown-menu-radio-group","description":"role=group scoping one single-select value","states":[{"attr":"data-value","condition":"the selected radio value (the controller re-writes it on change)"}]},{"name":"dropdown-menu-radio-item","description":"A role=menuitemradio row inside a radio group","states":[{"attr":"data-checked","condition":"the selected radio (the controller re-writes the pair with aria-checked)"},{"attr":"data-unchecked","condition":"not selected"},{"attr":"data-value","condition":"the radio's value"},{"attr":"data-disabled","condition":"item is disabled (always written together with aria-disabled)"}]},{"name":"dropdown-menu-checkbox-item-indicator","description":"The check glyph inside checkbox items (aria-hidden; the item carries the checked state)"},{"name":"dropdown-menu-radio-item-indicator","description":"The circle glyph inside radio items (aria-hidden; the item carries the checked state)"},{"name":"dropdown-menu-separator","description":"role=separator rule between groups"},{"name":"dropdown-menu-shortcut","description":"The trailing keybinding HINT - aria-hidden, never binds the key"},{"name":"dropdown-menu-sub","description":"A submenu scope - hosts its own popper around the sub trigger/content pair"},{"name":"dropdown-menu-sub-trigger","description":"The role=menuitem row opening its submenu","states":[{"attr":"data-popup-open","condition":"its submenu is open (written with aria-expanded; absence is the closed state)"},{"attr":"data-inset","condition":"indented to align with checkbox/radio item text (inset: true)"}]},{"name":"dropdown-menu-sub-content","description":"The nested role=menu panel - its own popper content on the same presence machinery","states":[{"attr":"data-open","condition":"submenu is open (presence flips the pair at runtime)"},{"attr":"data-closed","condition":"submenu is closed (the server-rendered state)"},{"attr":"data-side","condition":"the placement side (right/left by direction; popper resolves it at runtime)","values":["top","right","bottom","left"]},{"attr":"data-align","condition":"the alignment against the sub-trigger (popper resolves it at runtime)","values":["start","center","end"]}],"vars":[{"name":"--transform-origin","description":"popper's anchor-facing animation origin"},{"name":"--available-width","description":"popper: viewport space left for the panel (post-flip)"},{"name":"--available-height","description":"popper: viewport space left for the panel (post-flip)"},{"name":"--anchor-width","description":"popper: the sub-trigger's measured width"},{"name":"--anchor-height","description":"popper: the sub-trigger's measured height"}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"empty","type":"registry:component","title":"Empty","files":[{"path":"app/components/poetry/ui/empty/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/empty/component.html.erb"},{"path":"app/components/poetry/ui/empty/component.rb","type":"registry:file","target":"app/components/poetry/ui/empty/component.rb"},{"path":"app/components/poetry/ui/empty/preview.rb","type":"registry:file","target":"app/components/poetry/ui/empty/preview.rb"},{"path":"app/components/poetry/ui/empty/style.rb","type":"registry:file","target":"app/components/poetry/ui/empty/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Empty::Component","identifier":"poetry--ui--empty","parts":[{"name":"empty","description":"The empty-state root - the centered header and content stack"},{"name":"empty-header","description":"Wrapper around media/title/description - renders when at least one of those slots is set"},{"name":"empty-icon","description":"The media slot's box - media_variant: :icon gives the rounded muted icon tile","states":[{"attr":"data-variant","condition":"always - the resolved media_variant","values":["default","icon"]}]},{"name":"empty-title","description":"The title as a real heading (title_tag, h3 by default)"},{"name":"empty-description","description":"Muted copy under the title"},{"name":"empty-content","description":"The actions that fix the emptiness - the content block renders here"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"field","type":"registry:component","title":"Field","files":[{"path":"app/components/poetry/ui/field/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/field/component.html.erb"},{"path":"app/components/poetry/ui/field/component.rb","type":"registry:file","target":"app/components/poetry/ui/field/component.rb"},{"path":"app/components/poetry/ui/field/preview.html.erb","type":"registry:file","target":"app/components/poetry/ui/field/preview.html.erb"},{"path":"app/components/poetry/ui/field/preview.rb","type":"registry:file","target":"app/components/poetry/ui/field/preview.rb"},{"path":"app/components/poetry/ui/field/style.rb","type":"registry:file","target":"app/components/poetry/ui/field/style.rb"}],"registryDependencies":["label","input"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Field::Component","identifier":"poetry--ui--field","parts":[{"name":"field","description":"The quartet's grid root - label, control, hint, and error stack inside","states":[{"attr":"data-invalid","condition":"always - true when error: is present or invalid: is set, else false","values":["true","false"]},{"attr":"data-orientation","condition":"always - the resolved orientation (horizontal is the boolean-control layout)","values":["vertical","horizontal","setting","responsive"]}]},{"name":"field-label","description":"The Label (composed) wearing the source's field-label slot - names the control"},{"name":"field-description","description":"The hint <p> (the source's description) - its id lands in the control's aria-describedby"},{"name":"field-error","description":"The error <p> - present only when error: is set; its id leads the control's aria-describedby"},{"name":"checkbox-input","description":"A nested Checkbox's hidden native input - the toggle renders as a wrapper-free fragment, so its sibling form store sits directly in the field's DOM (the horizontal boolean-control layout)"},{"name":"switch-input","description":"A nested Switch's hidden native input - the same wrapper-free fragment escape as checkbox-input (the setting-row layout)"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"field-group","type":"registry:component","title":"Field group","files":[{"path":"app/components/poetry/ui/field_group/component.rb","type":"registry:file","target":"app/components/poetry/ui/field_group/component.rb"},{"path":"app/components/poetry/ui/field_group/preview.html.erb","type":"registry:file","target":"app/components/poetry/ui/field_group/preview.html.erb"},{"path":"app/components/poetry/ui/field_group/preview.rb","type":"registry:file","target":"app/components/poetry/ui/field_group/preview.rb"},{"path":"app/components/poetry/ui/field_group/style.rb","type":"registry:file","target":"app/components/poetry/ui/field_group/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::FieldGroup::Component","identifier":"poetry--ui--field_group","parts":[{"name":"field-group","description":"The stacking container - fields, fieldsets, and separators render as direct children; also the @container responsive fields measure against"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"field-separator","type":"registry:component","title":"Field separator","files":[{"path":"app/components/poetry/ui/field_separator/component.rb","type":"registry:file","target":"app/components/poetry/ui/field_separator/component.rb"},{"path":"app/components/poetry/ui/field_separator/preview.rb","type":"registry:file","target":"app/components/poetry/ui/field_separator/preview.rb"},{"path":"app/components/poetry/ui/field_separator/style.rb","type":"registry:file","target":"app/components/poetry/ui/field_separator/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::FieldSeparator::Component","identifier":"poetry--ui--field_separator","parts":[{"name":"field-separator","description":"The divider row - a decorative Separator drawn across it","states":[{"attr":"data-content","condition":"always - whether the inline caption renders","values":["true","false"]}]},{"name":"field-separator-content","description":"The inline caption span (block content) - sits on the line, backed by the page background"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"fieldset","type":"registry:component","title":"Fieldset","files":[{"path":"app/components/poetry/ui/fieldset/component.rb","type":"registry:file","target":"app/components/poetry/ui/fieldset/component.rb"},{"path":"app/components/poetry/ui/fieldset/preview.html.erb","type":"registry:file","target":"app/components/poetry/ui/fieldset/preview.html.erb"},{"path":"app/components/poetry/ui/fieldset/preview.rb","type":"registry:file","target":"app/components/poetry/ui/fieldset/preview.rb"},{"path":"app/components/poetry/ui/fieldset/style.rb","type":"registry:file","target":"app/components/poetry/ui/fieldset/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Fieldset::Component","identifier":"poetry--ui--fieldset","parts":[{"name":"field-set","description":"The <fieldset> root - legend, optional hint, then the fields"},{"name":"field-legend","description":"The <legend> - the group's accessible name","states":[{"attr":"data-variant","condition":"always - the legend's size treatment","values":["legend","label"]}]},{"name":"field-set-hint","description":"Muted description under the legend (hint:)"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"file-input","type":"registry:component","title":"File input","files":[{"path":"app/components/poetry/ui/file_input/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/file_input/component.html.erb"},{"path":"app/components/poetry/ui/file_input/component.rb","type":"registry:file","target":"app/components/poetry/ui/file_input/component.rb"},{"path":"app/components/poetry/ui/file_input/preview.rb","type":"registry:file","target":"app/components/poetry/ui/file_input/preview.rb"},{"path":"app/components/poetry/ui/file_input/style.rb","type":"registry:file","target":"app/components/poetry/ui/file_input/style.rb"}],"registryDependencies":["input","icon"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::FileInput::Component","identifier":"poetry--ui--file_input","parts":[{"name":"file-input","description":"The dropzone root - wraps the zone, the selection list, and clear","states":[{"attr":"data-variant","condition":"always on the dropzone root (the input variant renders the Input component instead)","values":["dropzone"]},{"attr":"data-dragging","condition":"a file drag is over the zone (controller-written, enter/leave counted)"},{"attr":"data-populated","condition":"the native input holds at least one file (controller-written)"}]},{"name":"file-input-dropzone","description":"The <label> drop surface - dashed, platform click-to-browse; its text is the control's accessible name"},{"name":"file-input-control","description":"The native <input type=file> - visually hidden in the dropzone, THE form value in both variants"},{"name":"file-input-prompt","description":"The zone's instruction line (prompt: overrides the default)"},{"name":"file-input-hint","description":"Muted constraints copy under the prompt (hint: - formats, size)"},{"name":"file-input-list","description":"The selected-file <ul> the controller fills (name + size per item; items are controller-built, not server parts)"},{"name":"file-input-clear","description":"The clear affordance - hidden until populated; never re-opens the picker"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"hover-card","type":"registry:component","title":"Hover card","files":[{"path":"app/components/poetry/ui/hover_card/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/hover_card/component.html.erb"},{"path":"app/components/poetry/ui/hover_card/component.rb","type":"registry:file","target":"app/components/poetry/ui/hover_card/component.rb"},{"path":"app/components/poetry/ui/hover_card/preview.rb","type":"registry:file","target":"app/components/poetry/ui/hover_card/preview.rb"},{"path":"app/components/poetry/ui/hover_card/style.rb","type":"registry:file","target":"app/components/poetry/ui/hover_card/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::HoverCard::Component","identifier":"poetry--ui--hover_card","parts":[{"name":"hover-card","description":"Root wrapper around the trigger link and the panel"},{"name":"hover-card-trigger","description":"The enriched link itself - simultaneously the no-JS fallback, the touch path, and the keyboard path","states":[{"attr":"data-popup-open","condition":"bare while the card is open; absent while closed (absence IS the closed state)"}]},{"name":"hover-card-content","description":"The role-less preview panel (invisible to AT on purpose) - positioning, animation, and the open state ride here","states":[{"attr":"data-open","condition":"card is open (the controller flips the pair at runtime)"},{"attr":"data-closed","condition":"card is closed (the server-rendered state; hidden rides along)"},{"attr":"data-side","condition":"always - the side (initial placement, re-resolved live by popper after flip)","values":["top","right","bottom","left"]},{"attr":"data-align","condition":"always - the alignment (re-resolved live by popper)","values":["start","center","end"]}],"vars":[{"name":"--transform-origin","description":"the anchor-facing origin popper writes for scale-in animation"},{"name":"--available-width","description":"viewport space left for the panel (popper, post-flip)"},{"name":"--available-height","description":"viewport space left for the panel (popper, post-flip)"},{"name":"--anchor-width","description":"the anchor's measured width (popper)"},{"name":"--anchor-height","description":"the anchor's measured height (popper)"}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"icon","type":"registry:component","title":"Icon","files":[{"path":"app/components/poetry/ui/icon/component.rb","type":"registry:file","target":"app/components/poetry/ui/icon/component.rb"},{"path":"app/components/poetry/ui/icon/preview.rb","type":"registry:file","target":"app/components/poetry/ui/icon/preview.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Icon::Component","identifier":"poetry--ui--icon","parts":[{"name":"icon","description":"The <svg> root itself - the vendored icon markup renders inside; ARIA (label: vs decorative) rides here"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"input","type":"registry:component","title":"Input","files":[{"path":"app/components/poetry/ui/input/component.rb","type":"registry:file","target":"app/components/poetry/ui/input/component.rb"},{"path":"app/components/poetry/ui/input/preview.rb","type":"registry:file","target":"app/components/poetry/ui/input/preview.rb"},{"path":"app/components/poetry/ui/input/style.rb","type":"registry:file","target":"app/components/poetry/ui/input/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Input::Component","identifier":"poetry--ui--input","parts":[{"name":"input","description":"The <input> element itself - no inner anatomy; error state is aria-invalid (set by Field/FormBuilder), never a parallel class","states":[{"attr":"data-raw","condition":"mask: is set - the unmasked value, kept live by the mask controller (the masked text is what submits)"}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"input-group","type":"registry:component","title":"Input group","files":[{"path":"app/components/poetry/ui/input_group/button_preview.html.erb","type":"registry:file","target":"app/components/poetry/ui/input_group/button_preview.html.erb"},{"path":"app/components/poetry/ui/input_group/component.rb","type":"registry:file","target":"app/components/poetry/ui/input_group/component.rb"},{"path":"app/components/poetry/ui/input_group/preview.rb","type":"registry:file","target":"app/components/poetry/ui/input_group/preview.rb"},{"path":"app/components/poetry/ui/input_group/search_preview.html.erb","type":"registry:file","target":"app/components/poetry/ui/input_group/search_preview.html.erb"},{"path":"app/components/poetry/ui/input_group/style.rb","type":"registry:file","target":"app/components/poetry/ui/input_group/style.rb"},{"path":"app/components/poetry/ui/input_group/textarea_preview.html.erb","type":"registry:file","target":"app/components/poetry/ui/input_group/textarea_preview.html.erb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::InputGroup::Component","identifier":"poetry--ui--input_group","parts":[{"name":"input-group","description":"The bordered group surface (role=group) - wears the border, the focus-within ring, and the invalid ring for the borderless control inside"},{"name":"input-group-addon","description":"One addon cell (icons, text, kbd hints, tiny buttons) rendered by poetry_input_group_addon around the control","states":[{"attr":"data-align","condition":"always - the addon's align: axis (inline rides the row, block takes a full-width row)","values":["inline-start","inline-end","block-start","block-end"]}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"input-otp","type":"registry:component","title":"Input otp","files":[{"path":"app/components/poetry/ui/input_otp/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/input_otp/component.html.erb"},{"path":"app/components/poetry/ui/input_otp/component.rb","type":"registry:file","target":"app/components/poetry/ui/input_otp/component.rb"},{"path":"app/components/poetry/ui/input_otp/preview.rb","type":"registry:file","target":"app/components/poetry/ui/input_otp/preview.rb"},{"path":"app/components/poetry/ui/input_otp/style.rb","type":"registry:file","target":"app/components/poetry/ui/input_otp/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::InputOtp::Component","identifier":"poetry--ui--input_otp","parts":[{"name":"input-otp-container","description":"Root row (forced dir=ltr - slot order equals string index order even on RTL pages) wrapping the real input and the mirror cells"},{"name":"input-otp","description":"THE real native <input> (autocomplete one-time-code) stretched invisibly over the row - the only AT and serialization surface"},{"name":"input-otp-group","description":"One aria-hidden cluster of mirror cells (groups: clustering)"},{"name":"input-otp-slot","description":"One presentational mirror cell - paints its char and the active-cell ring","states":[{"attr":"data-active","condition":"\"true\" while the native caret sits on this cell (the controller projects selectionStart while the input is focused; the server renders \"false\")","values":["true","false"]}]},{"name":"input-otp-caret","description":"The fake-caret overlay - hidden server-side; the controller unhides it on the active EMPTY cell"},{"name":"input-otp-separator","description":"The between-groups dash - role=separator kept for parity but aria-hidden (a recorded divergence)"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"item","type":"registry:component","title":"Item","files":[{"path":"app/components/poetry/ui/item/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/item/component.html.erb"},{"path":"app/components/poetry/ui/item/component.rb","type":"registry:file","target":"app/components/poetry/ui/item/component.rb"},{"path":"app/components/poetry/ui/item/group_preview.html.erb","type":"registry:file","target":"app/components/poetry/ui/item/group_preview.html.erb"},{"path":"app/components/poetry/ui/item/preview.rb","type":"registry:file","target":"app/components/poetry/ui/item/preview.rb"},{"path":"app/components/poetry/ui/item/style.rb","type":"registry:file","target":"app/components/poetry/ui/item/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Item::Component","identifier":"poetry--ui--item","parts":[{"name":"item","description":"The row root (a div by default; tag: :a for a clickable row) - variant and density land here as data attributes","states":[{"attr":"data-variant","condition":"the row's visual variant","values":["default","outline","muted"]},{"attr":"data-size","condition":"the row's density","values":["default","sm","xs"]}]},{"name":"item-media","description":"The leading media cell - sized and rounded by its variant","states":[{"attr":"data-variant","condition":"the media treatment","values":["default","icon","image"]}]},{"name":"item-content","description":"The center column collecting title, description, and loose content"},{"name":"item-title","description":"The title row"},{"name":"item-description","description":"The muted description line"},{"name":"item-header","description":"Full-width row above the media/content columns"},{"name":"item-actions","description":"The trailing actions cell"},{"name":"item-footer","description":"Full-width row below the media/content columns"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"kbd","type":"registry:component","title":"Kbd","files":[{"path":"app/components/poetry/ui/kbd/component.rb","type":"registry:file","target":"app/components/poetry/ui/kbd/component.rb"},{"path":"app/components/poetry/ui/kbd/group_preview.html.erb","type":"registry:file","target":"app/components/poetry/ui/kbd/group_preview.html.erb"},{"path":"app/components/poetry/ui/kbd/preview.rb","type":"registry:file","target":"app/components/poetry/ui/kbd/preview.rb"},{"path":"app/components/poetry/ui/kbd/style.rb","type":"registry:file","target":"app/components/poetry/ui/kbd/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Kbd::Component","identifier":"poetry--ui--kbd","parts":[{"name":"kbd","description":"The <kbd> element itself - the key text renders here"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"label","type":"registry:component","title":"Label","files":[{"path":"app/components/poetry/ui/label/component.rb","type":"registry:file","target":"app/components/poetry/ui/label/component.rb"},{"path":"app/components/poetry/ui/label/preview.html.erb","type":"registry:file","target":"app/components/poetry/ui/label/preview.html.erb"},{"path":"app/components/poetry/ui/label/preview.rb","type":"registry:file","target":"app/components/poetry/ui/label/preview.rb"},{"path":"app/components/poetry/ui/label/style.rb","type":"registry:file","target":"app/components/poetry/ui/label/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Label::Component","identifier":"poetry--ui--label","parts":[{"name":"label","description":"The <label> element itself - for= rides it (dropped in group mode, where the group names itself via aria-labelledby at this label's id)"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"legend-content","type":"registry:component","title":"Legend content","files":[{"path":"app/components/poetry/charts/legend_content/component.html.erb","type":"registry:file","target":"app/components/poetry/charts/legend_content/component.html.erb"},{"path":"app/components/poetry/charts/legend_content/component.rb","type":"registry:file","target":"app/components/poetry/charts/legend_content/component.rb"},{"path":"app/components/poetry/charts/legend_content/preview.rb","type":"registry:file","target":"app/components/poetry/charts/legend_content/preview.rb"},{"path":"app/components/poetry/charts/legend_content/style.rb","type":"registry:file","target":"app/components/poetry/charts/legend_content/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-charts","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Charts::LegendContent::Component","identifier":"poetry--charts--legend_content","parts":[{"name":"chart-legend-content","description":"The legend row (<div>) - centered swatch + label pairs"},{"name":"chart-legend-item","description":"One legend entry (<div>; a <button> in toggle mode)","states":[{"attr":"data-key","condition":"in toggle mode - the series key the button toggles"},{"attr":"data-hidden","condition":"in toggle mode - the item's series is toggled off (the live controller stamps it at runtime; the item dims)"}]},{"name":"chart-legend-swatch","description":"The color swatch (<div>) - inline background-color carries the entry's color; omitted with hide_icon or colorless entries"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"line-chart","type":"registry:component","title":"Line chart","files":[{"path":"app/components/poetry/charts/line_chart/component.html.erb","type":"registry:file","target":"app/components/poetry/charts/line_chart/component.html.erb"},{"path":"app/components/poetry/charts/line_chart/component.rb","type":"registry:file","target":"app/components/poetry/charts/line_chart/component.rb"},{"path":"app/components/poetry/charts/line_chart/preview.rb","type":"registry:file","target":"app/components/poetry/charts/line_chart/preview.rb"},{"path":"app/components/poetry/charts/line_chart/style.rb","type":"registry:file","target":"app/components/poetry/charts/line_chart/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-charts","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Charts::LineChart::Component","identifier":"poetry--charts--line_chart","parts":[{"name":"chart-brush","description":"The brush strip group (with_brush): track + window + two handles below the x axis"},{"name":"chart-brush-track","description":"The full-width brush rail"},{"name":"chart-brush-window","description":"The selected-range rect the drag moves"},{"name":"chart-brush-handle","description":"One draggable window edge","states":[{"attr":"data-edge","condition":"always - which edge","values":["start","end"]}]},{"name":"chart-zoom-selection","description":"The zoom drag-selection overlay (zoom: true), hidden until a drag starts"},{"name":"chart-live-payload","description":"The embedded {spec, frame} JSON the live renderer recomputes geometry from"},{"name":"chart-svg","description":"The chart canvas (<svg>) - server-computed geometry in a fixed viewBox; role=img, or the focusable role=application accessibilityLayer when the tooltip attaches","states":[{"attr":"data-animate","condition":"present when animate (the default) - the motion stylesheet and controller key the entrance off it"},{"attr":"data-motion","condition":"runtime - the motion rig stamps the animation lifecycle (entrance/morph, then settled)","values":["entrance","morph","settled"]}],"vars":[{"name":"--poetry-motion-duration","description":"the entrance/morph duration (animation_duration, ms)"},{"name":"--poetry-motion-easing","description":"the animation easing keyword (animation_easing)"},{"name":"--poetry-motion-delay","description":"the pre-animation hold (animation_begin, ms)"}]},{"name":"chart-grid","description":"The gridline group (with_grid) - horizontal and/or vertical rules across the plot"},{"name":"chart-cursor","description":"The hover cursor, hidden until the tooltip controller positions and reveals it at the active index - a vertical rule or a translucent band rect (bar charts)"},{"name":"chart-lines","description":"The line-mark group - each series' curve plus its companion marks"},{"name":"chart-line","description":"One series' stroked curve - pathLength=1 when animating so the dash draw-in needs no measurement","states":[{"attr":"data-key","condition":"the series key"}]},{"name":"chart-dots","description":"One series' point-dot group (dots: true)","states":[{"attr":"data-key","condition":"the series key"}]},{"name":"chart-dot","description":"One point dot (<circle>)"},{"name":"chart-error-bars","description":"One series' error-whisker group (error_key:) - cap-stem-cap paths in the foreground color","states":[{"attr":"data-key","condition":"the series key"}]},{"name":"chart-labels","description":"One series' value-label group (labels: true)","states":[{"attr":"data-key","condition":"the series key"}]},{"name":"chart-reference","description":"The reference-mark group (with_reference_line/_area/_dot), painted above the series"},{"name":"chart-active-dots","description":"The hover-marker group (with_tooltip) - pre-rendered hidden circles for every series x index"},{"name":"chart-active-dot","description":"One hover marker - display=none until the tooltip controller reveals the active index's dot","states":[{"attr":"data-key","condition":"the series key"},{"attr":"data-index","condition":"the datum index"},{"attr":"data-active","condition":"runtime - rides the marker while its index is the active one"}]},{"name":"chart-x-axis","description":"The x-axis tick-label group (with_x_axis)"},{"name":"chart-coordinates","description":"The embedded per-index geometry payload (<script type=application/json>) the tooltip controller reads - zero chart math in the browser"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"link","type":"registry:component","title":"Link","files":[{"path":"app/components/poetry/ui/link/component.rb","type":"registry:file","target":"app/components/poetry/ui/link/component.rb"},{"path":"app/components/poetry/ui/link/preview.rb","type":"registry:file","target":"app/components/poetry/ui/link/preview.rb"},{"path":"app/components/poetry/ui/link/style.rb","type":"registry:file","target":"app/components/poetry/ui/link/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Link::Component","identifier":"poetry--ui--link","parts":[{"name":"link","description":"The rendered <a> - the whole component; current: marks it aria-current=page"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"marker","type":"registry:component","title":"Marker","files":[{"path":"app/components/poetry/ui/marker/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/marker/component.html.erb"},{"path":"app/components/poetry/ui/marker/component.rb","type":"registry:file","target":"app/components/poetry/ui/marker/component.rb"},{"path":"app/components/poetry/ui/marker/preview.rb","type":"registry:file","target":"app/components/poetry/ui/marker/preview.rb"},{"path":"app/components/poetry/ui/marker/style.rb","type":"registry:file","target":"app/components/poetry/ui/marker/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Marker::Component","identifier":"poetry--ui--marker","parts":[{"name":"marker","description":"The divider/status root - the label is real announced content (role=status when announce: :status; never role=separator)","states":[{"attr":"data-variant","condition":"always - the resolved variant","values":["default","separator","border"]}]},{"name":"marker-icon","description":"Decorative icon wrapper (aria-hidden always)"},{"name":"marker-content","description":"The label span - the marker text itself"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"menubar","type":"registry:component","title":"Menubar","files":[{"path":"app/components/poetry/ui/menubar/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/menubar/component.html.erb"},{"path":"app/components/poetry/ui/menubar/component.rb","type":"registry:file","target":"app/components/poetry/ui/menubar/component.rb"},{"path":"app/components/poetry/ui/menubar/preview.rb","type":"registry:file","target":"app/components/poetry/ui/menubar/preview.rb"},{"path":"app/components/poetry/ui/menubar/style.rb","type":"registry:file","target":"app/components/poetry/ui/menubar/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Menubar::Component","identifier":"poetry--ui--menubar","parts":[{"name":"menubar","description":"The role=menubar bar - one horizontal roving tab stop across the triggers","states":[{"attr":"data-open","condition":"some menu is open (value present; the coordinator flips the pair)"},{"attr":"data-closed","condition":"no menu is open"}]},{"name":"menubar-menu","description":"One logical menu - a display:contents wrapper hosting the trigger + content pair's menu and popper controllers"},{"name":"menubar-trigger","description":"The top-level menu button - a role=menuitem INSIDE the bar","states":[{"attr":"data-value","condition":"the menu's value - the coordinator's open/close key"},{"attr":"data-popup-open","condition":"its menu is open (written with aria-expanded; absence is the closed state)"},{"attr":"data-disabled","condition":"trigger is disabled (written together with the disabled property)"}]},{"name":"menubar-content","description":"The role=menu popup panel - positioning, animation, and the open state ride here","states":[{"attr":"data-open","condition":"menu is open (presence flips the pair at runtime)"},{"attr":"data-closed","condition":"menu is closed or animating out (the server-rendered state)"},{"attr":"data-side","condition":"the placement side (bottom initially; popper re-writes it after collision flips)","values":["top","right","bottom","left"]},{"attr":"data-align","condition":"the alignment against the trigger (start initially; popper re-resolves it)","values":["start","center","end"]}],"vars":[{"name":"--transform-origin","description":"popper's anchor-facing animation origin"},{"name":"--available-width","description":"popper: viewport space left for the panel (post-flip)"},{"name":"--available-height","description":"popper: viewport space left for the panel (post-flip)"},{"name":"--anchor-width","description":"popper: the trigger's measured width"},{"name":"--anchor-height","description":"popper: the trigger's measured height"}]},{"name":"menubar-group","description":"role=group semantic grouping between separators"},{"name":"menubar-label","description":"Non-interactive heading for a run of items","states":[{"attr":"data-inset","condition":"indented to align with checkbox/radio item text (inset: true)"}]},{"name":"menubar-item","description":"One role=menuitem action row","states":[{"attr":"data-variant","condition":"default or destructive (the danger treatment)"},{"attr":"data-inset","condition":"indented to align with checkbox/radio item text (inset: true)"},{"attr":"data-disabled","condition":"item is disabled (always written together with aria-disabled)"}]},{"name":"menubar-checkbox-item","description":"A role=menuitemcheckbox toggle row","states":[{"attr":"data-checked","condition":"checked (the controller re-writes the pair with aria-checked on activation)"},{"attr":"data-unchecked","condition":"unchecked"},{"attr":"data-disabled","condition":"item is disabled (always written together with aria-disabled)"},{"attr":"data-close-on-select","condition":"per-item override of the menu's close-on-select default (\"false\" keeps the menu open)"}]},{"name":"menubar-radio-group","description":"role=group scoping one single-select value","states":[{"attr":"data-value","condition":"the selected radio value (the controller re-writes it on change)"}]},{"name":"menubar-radio-item","description":"A role=menuitemradio row inside a radio group","states":[{"attr":"data-checked","condition":"the selected radio (the controller re-writes the pair with aria-checked)"},{"attr":"data-unchecked","condition":"not selected"},{"attr":"data-value","condition":"the radio's value"},{"attr":"data-disabled","condition":"item is disabled (always written together with aria-disabled)"}]},{"name":"menubar-checkbox-item-indicator","description":"The check glyph slot inside checkbox items - aria-hidden; the item's aria-checked/data-checked pair carries state"},{"name":"menubar-radio-item-indicator","description":"The circle glyph slot inside radio items - aria-hidden; the item's aria-checked/data-checked pair carries state"},{"name":"menubar-separator","description":"role=separator rule between groups"},{"name":"menubar-shortcut","description":"The trailing keybinding HINT - aria-hidden, never binds the key"},{"name":"menubar-sub","description":"A submenu scope - hosts its own popper around the sub trigger/content pair"},{"name":"menubar-sub-trigger","description":"The role=menuitem row opening its submenu","states":[{"attr":"data-popup-open","condition":"its submenu is open (written with aria-expanded; absence is the closed state)"},{"attr":"data-inset","condition":"indented to align with checkbox/radio item text (inset: true)"}]},{"name":"menubar-sub-content","description":"The nested role=menu panel - its own popper content on the same presence machinery","states":[{"attr":"data-open","condition":"submenu is open (presence flips the pair at runtime)"},{"attr":"data-closed","condition":"submenu is closed (the server-rendered state)"},{"attr":"data-side","condition":"the placement side (right/left by direction; popper resolves it at runtime)","values":["top","right","bottom","left"]},{"attr":"data-align","condition":"the alignment against the sub-trigger (popper resolves it at runtime)","values":["start","center","end"]}],"vars":[{"name":"--transform-origin","description":"popper's anchor-facing animation origin"},{"name":"--available-width","description":"popper: viewport space left for the panel (post-flip)"},{"name":"--available-height","description":"popper: viewport space left for the panel (post-flip)"},{"name":"--anchor-width","description":"popper: the sub-trigger's measured width"},{"name":"--anchor-height","description":"popper: the sub-trigger's measured height"}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"message","type":"registry:component","title":"Message","files":[{"path":"app/components/poetry/ui/message/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/message/component.html.erb"},{"path":"app/components/poetry/ui/message/component.rb","type":"registry:file","target":"app/components/poetry/ui/message/component.rb"},{"path":"app/components/poetry/ui/message/preview.rb","type":"registry:file","target":"app/components/poetry/ui/message/preview.rb"},{"path":"app/components/poetry/ui/message/style.rb","type":"registry:file","target":"app/components/poetry/ui/message/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Message::Component","identifier":"poetry--ui--message","parts":[{"name":"message","description":"The chat-row root - avatar plus a content column; align: :end mirrors the row for the local user's side","states":[{"attr":"data-align","condition":"always - the resolved align","values":["start","end"]}]},{"name":"message-avatar","description":"The avatar slot's box, kept out of the content column"},{"name":"message-content","description":"The content column - header, the body block (the Bubbles), footer"},{"name":"message-header","description":"Sender identity line above the bubbles (header slot)"},{"name":"message-footer","description":"Timestamps / delivery state below the bubbles (footer slot - it lifts the avatar)"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"message-scroller","type":"registry:component","title":"Message scroller","files":[{"path":"app/components/poetry/ui/message_scroller/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/message_scroller/component.html.erb"},{"path":"app/components/poetry/ui/message_scroller/component.rb","type":"registry:file","target":"app/components/poetry/ui/message_scroller/component.rb"},{"path":"app/components/poetry/ui/message_scroller/preview.rb","type":"registry:file","target":"app/components/poetry/ui/message_scroller/preview.rb"},{"path":"app/components/poetry/ui/message_scroller/style.rb","type":"registry:file","target":"app/components/poetry/ui/message_scroller/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::MessageScroller::Component","identifier":"poetry--ui--message_scroller","parts":[{"name":"message-scroller","description":"The transcript root the controller drives - runtime scroll state is mirrored here","states":[{"attr":"data-mode","condition":"always once connected - the 4-state machine","values":["following-bottom","free-scrolling","anchored-to-message","settling-jump"]},{"attr":"data-scrollable","condition":"overflow exists - carries which edges have room (start, end, or both as a space-separated pair)"},{"attr":"data-autoscrolling","condition":"a programmatic scroll is settling - the follow-bottom release is suppressed while set"}]},{"name":"message-scroller-viewport","description":"The native scroll region (role=region, focusable) - the controller mirrors the same runtime attributes here","states":[{"attr":"data-scrollable","condition":"overflow exists - the same edge tokens as the root"},{"attr":"data-autoscrolling","condition":"a programmatic scroll is settling"}]},{"name":"message-scroller-content","description":"The row container and Turbo Stream append target (stable dom id <id>-messages); role=log announces additions"},{"name":"message-scroller-item","description":"One transcript row (poetry_message_scroller_item) - the id is how anchoring and Streams find it","states":[{"attr":"data-message-id","condition":"always - the row's message id"},{"attr":"data-scroll-anchor","condition":"anchor: true - the turn the controller holds at the reading line"}]},{"name":"message-scroller-spacer","description":"Tail spacer faking scroll room below a short anchored turn - hidden at height 0"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"metadata-list","type":"registry:component","title":"Metadata list","files":[{"path":"app/components/poetry/ui/metadata_list/component.rb","type":"registry:file","target":"app/components/poetry/ui/metadata_list/component.rb"},{"path":"app/components/poetry/ui/metadata_list/preview.rb","type":"registry:file","target":"app/components/poetry/ui/metadata_list/preview.rb"},{"path":"app/components/poetry/ui/metadata_list/style.rb","type":"registry:file","target":"app/components/poetry/ui/metadata_list/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::MetadataList::Component","identifier":"poetry--ui--metadata_list","parts":[{"name":"metadata-list","description":"The <dl> root - the record's fact sheet","states":[{"attr":"data-orientation","condition":"always - label placement","values":["vertical","horizontal"]},{"attr":"data-columns","condition":"always - the column count word","values":["one","two","three"]}]},{"name":"metadata-list-item","description":"One fact group (a <div> holding its <dt>/<dd> pair)"},{"name":"metadata-list-label","description":"The fact's name (<dt>) - muted, small"},{"name":"metadata-list-value","description":"The fact's value (<dd>) - composes text, badges, links"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"meter","type":"registry:component","title":"Meter","files":[{"path":"app/components/poetry/ui/meter/component.rb","type":"registry:file","target":"app/components/poetry/ui/meter/component.rb"},{"path":"app/components/poetry/ui/meter/preview.rb","type":"registry:file","target":"app/components/poetry/ui/meter/preview.rb"},{"path":"app/components/poetry/ui/meter/style.rb","type":"registry:file","target":"app/components/poetry/ui/meter/style.rb"}],"registryDependencies":["progress"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Meter::Component","identifier":"poetry--ui--meter","parts":[{"name":"meter","description":"Root (role=meter, aria-value*, and the accessible name); label, readout, and track stack here"},{"name":"meter-label","description":"The visible caption span (label:)"},{"name":"meter-value","description":"The readout - value_text: verbatim, else the range percentage; renders unless show_value: false"},{"name":"meter-track","description":"The full-width rail (Progress's cn chrome)"},{"name":"meter-indicator","description":"The filled bar - inline width percentage of the range"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"native-select","type":"registry:component","title":"Native select","files":[{"path":"app/components/poetry/ui/native_select/component.rb","type":"registry:file","target":"app/components/poetry/ui/native_select/component.rb"},{"path":"app/components/poetry/ui/native_select/labelled_preview.html.erb","type":"registry:file","target":"app/components/poetry/ui/native_select/labelled_preview.html.erb"},{"path":"app/components/poetry/ui/native_select/preview.rb","type":"registry:file","target":"app/components/poetry/ui/native_select/preview.rb"},{"path":"app/components/poetry/ui/native_select/style.rb","type":"registry:file","target":"app/components/poetry/ui/native_select/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::NativeSelect::Component","identifier":"poetry--ui--native_select","parts":[{"name":"native-select-wrapper","description":"Relative shell around the select and the chevron - dims the pair when the select is disabled","states":[{"attr":"data-size","condition":"always - the resolved size","values":["default","sm"]}]},{"name":"native-select","description":"The real <select> - appearance-none (the chevron replaces the native arrow); platform picker and form submission stay native","states":[{"attr":"data-size","condition":"always - the resolved size (mirrors the wrapper)","values":["default","sm"]}]},{"name":"native-select-icon","description":"The decorative chevron wrapper - absolutely pinned, aria-hidden"},{"name":"native-select-option","description":"An <option> from the options: fast path (or poetry_native_select_option) - Canvas system colors keep the native dropdown legible"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"navigation-menu","type":"registry:component","title":"Navigation menu","files":[{"path":"app/components/poetry/ui/navigation_menu/bar_preview.html.erb","type":"registry:file","target":"app/components/poetry/ui/navigation_menu/bar_preview.html.erb"},{"path":"app/components/poetry/ui/navigation_menu/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/navigation_menu/component.html.erb"},{"path":"app/components/poetry/ui/navigation_menu/component.rb","type":"registry:file","target":"app/components/poetry/ui/navigation_menu/component.rb"},{"path":"app/components/poetry/ui/navigation_menu/preview.rb","type":"registry:file","target":"app/components/poetry/ui/navigation_menu/preview.rb"},{"path":"app/components/poetry/ui/navigation_menu/style.rb","type":"registry:file","target":"app/components/poetry/ui/navigation_menu/style.rb"},{"path":"app/components/poetry/ui/navigation_menu/viewport_preview.html.erb","type":"registry:file","target":"app/components/poetry/ui/navigation_menu/viewport_preview.html.erb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::NavigationMenu::Component","identifier":"poetry--ui--navigation_menu","parts":[{"name":"navigation-menu","description":"The <nav> landmark around the whole disclosure bar","states":[{"attr":"data-viewport","condition":"the mode marker (\"true\" = shared morphing viewport, \"false\" = per-item panels) - the dictionary's group-data chrome keys on it"}]},{"name":"navigation-menu-list","description":"The bar row holding every item"},{"name":"navigation-menu-item","description":"One bar entry - wraps a trigger + panel pair or a top-level link","states":[{"attr":"data-value","condition":"the entry's value - the controller's open/close key"}]},{"name":"navigation-menu-trigger","description":"The disclosure button opening its panel","states":[{"attr":"data-popup-open","condition":"its panel is open (written with aria-expanded - the chevron rotation hook)"},{"attr":"data-open","condition":"its panel is open (the controller writes both vocabularies)"},{"attr":"data-closed","condition":"its panel is closed (written after the first close)"}]},{"name":"navigation-menu-content","description":"One item's panel - presence-animated; in viewport mode it is adopted into the shared viewport on first activation","states":[{"attr":"data-open","condition":"panel is open (presence flips the pair at runtime)"},{"attr":"data-closed","condition":"panel is closed or animating out (the server-rendered state)"},{"attr":"data-activation-direction","condition":"which way the activation traveled between triggers (left/right, viewport mode) - keys the slide styles"},{"attr":"data-viewport-panel","condition":"stamped once the panel is adopted into the shared viewport"}]},{"name":"navigation-menu-positioner","description":"The viewport-mode shell popper positions against the active trigger","states":[{"attr":"data-instant","condition":"suppresses the morph transitions for one painted frame (cold opens)"}],"vars":[{"name":"--positioner-width","description":"the pinned morph width (reset to auto once the transition settles)"},{"name":"--positioner-height","description":"the pinned morph height (reset to auto once the transition settles)"}]},{"name":"navigation-menu-popup","description":"The morphing card inside the positioner - open state and the size transition ride here","states":[{"attr":"data-open","condition":"a panel is showing (the controller flips the pair)"},{"attr":"data-closed","condition":"the popup is closed (the server-rendered state)"},{"attr":"data-instant","condition":"suppresses the morph transitions for one painted frame (cold opens)"},{"attr":"data-starting-style","condition":"the enter transition's first frame (the presence module's two-frame trick)"},{"attr":"data-ending-style","condition":"held through the exit transition before the popup hides"}],"vars":[{"name":"--popup-width","description":"the pinned morph width (reset to auto once the transition settles)"},{"name":"--popup-height","description":"the pinned morph height (reset to auto once the transition settles)"}]},{"name":"navigation-menu-viewport","description":"The adoption container inside the popup - adopted panels stack absolutely in it"},{"name":"navigation-menu-link","description":"A REAL destination link - top-level (with_link) or a panel entry (poetry_navigation_menu_link)","states":[{"attr":"data-active","condition":"the current page (active: true)"}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"number-field","type":"registry:component","title":"Number field","files":[{"path":"app/components/poetry/ui/number_field/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/number_field/component.html.erb"},{"path":"app/components/poetry/ui/number_field/component.rb","type":"registry:file","target":"app/components/poetry/ui/number_field/component.rb"},{"path":"app/components/poetry/ui/number_field/preview.rb","type":"registry:file","target":"app/components/poetry/ui/number_field/preview.rb"},{"path":"app/components/poetry/ui/number_field/style.rb","type":"registry:file","target":"app/components/poetry/ui/number_field/style.rb"}],"registryDependencies":["input","input-group","button","icon"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::NumberField::Component","identifier":"poetry--ui--number_field","parts":[{"name":"number-field","description":"Root wrapper - the controller, disabled/invalid/filled state, and the two-input pair ride here","states":[{"attr":"data-disabled","condition":"disabled: is set (steppers disable, the group chrome dims)"},{"attr":"data-invalid","condition":"invalid: is set (the group wears the destructive ring via the control's aria-invalid)"},{"attr":"data-filled","condition":"the value is non-null (the controller keeps it live)"}]},{"name":"number-field-group","description":"The bordered field surface - wears InputGroup's chrome (cn-input-group), focus ring keyed on the control inside"},{"name":"input-group-addon","description":"The two stepper cells - InputGroup's addon vocabulary, reused so the group paddings compose","states":[{"attr":"data-align","condition":"always - inline-start holds the decrement, inline-end the increment","values":["inline-start","inline-end"]}]},{"name":"input-group-control","description":"The visible formatted <input type=text> - InputGroup's control slot (the themes' focus-ring hook); aria-roledescription \"Number field\", never a spinbutton"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"page-header","type":"registry:block","title":"Page header","description":"The furniture a screen opens with: breadcrumb trail, page title with supporting description, and a right-aligned action group over a grounding rule.","files":[{"path":"lib/generators/poetry/block/templates/page_header.html.erb","type":"registry:file","target":"app/views/blocks/_page_header.html.erb"}],"registryDependencies":["breadcrumb","button","icon","separator"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"copy-in","keywords":["header","breadcrumb"]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"pagination","type":"registry:component","title":"Pagination","files":[{"path":"app/components/poetry/ui/pagination/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/pagination/component.html.erb"},{"path":"app/components/poetry/ui/pagination/component.rb","type":"registry:file","target":"app/components/poetry/ui/pagination/component.rb"},{"path":"app/components/poetry/ui/pagination/preview.rb","type":"registry:file","target":"app/components/poetry/ui/pagination/preview.rb"},{"path":"app/components/poetry/ui/pagination/style.rb","type":"registry:file","target":"app/components/poetry/ui/pagination/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Pagination::Component","identifier":"poetry--ui--pagination","parts":[{"name":"pagination","description":"The <nav> landmark (role=navigation, aria-label) around the page list"},{"name":"pagination-content","description":"The <ul> holding every entry as one horizontal row"},{"name":"pagination-item","description":"One <li> per entry - previous/next, a page link, or a gap"},{"name":"pagination-ellipsis","description":"The elided-pages marker between windows - aria-hidden with an sr-only 'More pages'"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"pie-chart","type":"registry:component","title":"Pie chart","files":[{"path":"app/components/poetry/charts/pie_chart/component.html.erb","type":"registry:file","target":"app/components/poetry/charts/pie_chart/component.html.erb"},{"path":"app/components/poetry/charts/pie_chart/component.rb","type":"registry:file","target":"app/components/poetry/charts/pie_chart/component.rb"},{"path":"app/components/poetry/charts/pie_chart/preview.rb","type":"registry:file","target":"app/components/poetry/charts/pie_chart/preview.rb"},{"path":"app/components/poetry/charts/pie_chart/style.rb","type":"registry:file","target":"app/components/poetry/charts/pie_chart/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-charts","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Charts::PieChart::Component","identifier":"poetry--charts--pie_chart","parts":[{"name":"chart-svg","description":"The chart canvas (<svg>) - the aria-label surface, the tooltip's focus/keyboard surface (role=application when it attaches), and the motion rig's mount","states":[{"attr":"data-animate","condition":"when animate (the default) - the entrance tier's flag the motion stylesheet and controller key off"},{"attr":"data-motion","condition":"runtime, when animate - the motion engine's lifecycle stamp","values":["entrance","morph","settled"]}],"vars":[{"name":"--poetry-motion-delay","description":"the motion rig's entrance delay (animation_begin)"},{"name":"--poetry-motion-duration","description":"the motion rig's entrance duration (animation_duration)"},{"name":"--poetry-motion-easing","description":"the motion rig's easing keyword (animation_easing)"}]},{"name":"chart-pie","description":"One pie's slice group (<g>) - a ring per with_pie slot","states":[{"attr":"data-key","condition":"always - the series key"}]},{"name":"chart-pie-sector","description":"One slice (<path>) - fill from its row's color, popped out when active","states":[{"attr":"data-key","condition":"always - the series key"},{"attr":"data-index","condition":"on the first pie's slices - the datum index the tooltip walks"},{"attr":"data-active","condition":"the active slice - server-rendered via active_index:, and reflected onto the hovered/arrow-keyed index by the tooltip controller at runtime"},{"attr":"data-motion-group","condition":"when animate - the motion rig's sweep group (one per ring)"},{"attr":"data-motion-sector","condition":"when animate - the motion rig's server-computed sector params for the fan-out sweep"}]},{"name":"chart-labels","description":"A series' value labels (<g> of <text>, aria-hidden), rendered when the series opts into labels","states":[{"attr":"data-key","condition":"always - the series key"}]},{"name":"chart-center-label","description":"The center text (<text>) - title tspan plus optional subtitle filling the chart's middle"},{"name":"chart-coordinates","description":"The embedded JSON payload (<script>) the tooltip controller reads - per-category anchors and pre-formatted values, zero chart math in the browser"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"popover","type":"registry:component","title":"Popover","files":[{"path":"app/components/poetry/ui/popover/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/popover/component.html.erb"},{"path":"app/components/poetry/ui/popover/component.rb","type":"registry:file","target":"app/components/poetry/ui/popover/component.rb"},{"path":"app/components/poetry/ui/popover/preview.html.erb","type":"registry:file","target":"app/components/poetry/ui/popover/preview.html.erb"},{"path":"app/components/poetry/ui/popover/preview.rb","type":"registry:file","target":"app/components/poetry/ui/popover/preview.rb"},{"path":"app/components/poetry/ui/popover/style.rb","type":"registry:file","target":"app/components/poetry/ui/popover/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Popover::Component","identifier":"poetry--ui--popover","parts":[{"name":"popover","description":"Root wrapper around the trigger, the optional anchor, and the panel"},{"name":"popover-anchor","description":"Optional alternate popper anchor - when present the panel positions against it instead of the trigger"},{"name":"popover-content","description":"The role=dialog panel - positioning, animation, and the open state ride here","states":[{"attr":"data-open","condition":"panel is open (the controller flips the pair at runtime)"},{"attr":"data-closed","condition":"panel is closed (the server-rendered state; hidden rides along)"},{"attr":"data-side","condition":"always - the side (initial placement, re-resolved live by popper after flip)","values":["top","right","bottom","left"]},{"attr":"data-align","condition":"always - the alignment (re-resolved live by popper)","values":["start","center","end"]}],"vars":[{"name":"--transform-origin","description":"the anchor-facing origin popper writes for scale-in animation"},{"name":"--available-width","description":"viewport space left for the panel (popper, post-flip)"},{"name":"--available-height","description":"viewport space left for the panel (popper, post-flip)"},{"name":"--anchor-width","description":"the anchor's measured width (popper)"},{"name":"--anchor-height","description":"the anchor's measured height (popper)"}]},{"name":"popover-header","description":"Title block wrapping the title and description (renders only when either is present)"},{"name":"popover-title","description":"The heading - the panel's accessible name via aria-labelledby"},{"name":"popover-description","description":"Muted copy under the title, wired to aria-describedby"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"progress","type":"registry:component","title":"Progress","files":[{"path":"app/components/poetry/ui/progress/component.rb","type":"registry:file","target":"app/components/poetry/ui/progress/component.rb"},{"path":"app/components/poetry/ui/progress/preview.rb","type":"registry:file","target":"app/components/poetry/ui/progress/preview.rb"},{"path":"app/components/poetry/ui/progress/style.rb","type":"registry:file","target":"app/components/poetry/ui/progress/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Progress::Component","identifier":"poetry--ui--progress","parts":[{"name":"progress","description":"Root (role=progressbar, aria-value* and the accessible name) - label, value readout, and track stack here"},{"name":"progress-label","description":"The visible caption span (label:)"},{"name":"progress-value","description":"The tabular percent readout - renders unless show_value: false"},{"name":"progress-track","description":"The full-width rail the indicator fills"},{"name":"progress-indicator","description":"The filled bar - sized by an inline width percentage computed from value:/max:"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"questionnaire","type":"registry:component","title":"Questionnaire","files":[{"path":"app/components/poetry/ui/questionnaire/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/questionnaire/component.html.erb"},{"path":"app/components/poetry/ui/questionnaire/component.rb","type":"registry:file","target":"app/components/poetry/ui/questionnaire/component.rb"},{"path":"app/components/poetry/ui/questionnaire/preview.rb","type":"registry:file","target":"app/components/poetry/ui/questionnaire/preview.rb"},{"path":"app/components/poetry/ui/questionnaire/style.rb","type":"registry:file","target":"app/components/poetry/ui/questionnaire/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Questionnaire::Component","identifier":"poetry--ui--questionnaire","parts":[{"name":"questionnaire","description":"The root <form> the controller drives - navigation, validation gating, and the keyboard map all ride here"},{"name":"questionnaire-progress","description":"The polite progressbar ('Question X of Y'; block content replaces the text). Always carries live data-current/data-total, and a [data-progress-count] child gets the live 'X of Y' text - custom segment bars ride data-[current=N] variants","states":[{"attr":"data-custom","condition":"block content supplied - the controller leaves the text alone"},{"attr":"data-current","condition":"always - the active question number (live)"},{"attr":"data-total","condition":"always - the enabled question count (live)"}]},{"name":"questionnaire-item","description":"One question <fieldset> - exactly one is active","states":[{"attr":"data-name","condition":"always - the item's param name"},{"attr":"data-active","condition":"the visible question (inactive items are hidden + inert)"},{"attr":"data-status","condition":"always - the answer state","values":["unanswered","answered","skipped"]},{"attr":"data-required","condition":"required: true - Skip hides and Next validates"},{"attr":"data-multiple","condition":"multiple: true - checkbox choices named <name>[]"},{"attr":"data-invalid","condition":"validation attempted and unanswered - the error shows"},{"attr":"data-validated","condition":"a navigation has demanded this answer at least once"},{"attr":"data-skipped","condition":"explicitly skipped (cleared by any interaction)"}]},{"name":"questionnaire-title","description":"The question heading - a real <legend>"},{"name":"questionnaire-description","description":"Muted copy under the title; its id rides the fieldset's aria-describedby"},{"name":"questionnaire-choices","description":"The answer grid for one item"},{"name":"questionnaire-choice","description":"One answer <label> wrapping its native input","states":[{"attr":"data-type","condition":"always - the input kind","values":["radio","checkbox"]},{"attr":"data-checked","condition":"the choice is selected"},{"attr":"data-unchecked","condition":"the choice is not selected"},{"attr":"data-shortcut","condition":"shortcuts: on - the key label (A, B... or 1-9)"},{"attr":"data-disabled","condition":"choice or item disabled"}]},{"name":"questionnaire-choice-input","description":"THE native radio/checkbox - stretched invisibly over the row (paste of the input-otp posture)","states":[{"attr":"data-checked","condition":"selected"},{"attr":"data-unchecked","condition":"not selected"}]},{"name":"questionnaire-choice-indicator","description":"The box/circle glyph (aria-hidden) - dot for radio, check for checkbox"},{"name":"questionnaire-choice-indicator-dot","description":"The radio dot (shown while checked)"},{"name":"questionnaire-choice-indicator-check","description":"The checkbox check icon (shown while checked)"},{"name":"questionnaire-choice-label","description":"The label column - answer text over the optional description"},{"name":"questionnaire-choice-description","description":"Muted copy under the answer text"},{"name":"questionnaire-choice-shortcut","description":"The key hint chip (aria-hidden; hidden unless the choice carries data-shortcut)"},{"name":"questionnaire-input-wrapper","description":"The free-text answer's positioning wrapper"},{"name":"questionnaire-input","description":"The free-text answer - a real text input named after the item","states":[{"attr":"data-filled","condition":"has a value (counts as answered)"},{"attr":"data-empty","condition":"blank"}]},{"name":"questionnaire-error","description":"The validation message (hidden until a navigation demands the answer; role=alert while shown)"},{"name":"questionnaire-actions","description":"The navigation row - Previous / Skip / Next / Submit (the buttons ride composed Buttons, so those elements belong to Button's anatomy, not this contract; each carries data-visible/data-hidden + hidden/inert)"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"radar-chart","type":"registry:component","title":"Radar chart","files":[{"path":"app/components/poetry/charts/radar_chart/component.html.erb","type":"registry:file","target":"app/components/poetry/charts/radar_chart/component.html.erb"},{"path":"app/components/poetry/charts/radar_chart/component.rb","type":"registry:file","target":"app/components/poetry/charts/radar_chart/component.rb"},{"path":"app/components/poetry/charts/radar_chart/preview.rb","type":"registry:file","target":"app/components/poetry/charts/radar_chart/preview.rb"},{"path":"app/components/poetry/charts/radar_chart/style.rb","type":"registry:file","target":"app/components/poetry/charts/radar_chart/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-charts","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Charts::RadarChart::Component","identifier":"poetry--charts--radar_chart","parts":[{"name":"chart-svg","description":"The chart canvas (<svg>) - the aria-label surface, the tooltip's focus/keyboard surface (role=application when it attaches), and the motion rig's mount","states":[{"attr":"data-animate","condition":"when animate (the default) - the entrance tier's flag the motion stylesheet and controller key off"},{"attr":"data-motion","condition":"runtime, when animate - the motion engine's lifecycle stamp","values":["entrance","morph","settled"]}],"vars":[{"name":"--poetry-motion-delay","description":"the motion rig's entrance delay (animation_begin)"},{"name":"--poetry-motion-duration","description":"the motion rig's entrance duration (animation_duration)"},{"name":"--poetry-motion-easing","description":"the motion rig's easing keyword (animation_easing)"},{"name":"--poetry-motion-center","description":"the polar center the CSS entrance scales the series from"}]},{"name":"chart-polar-grid","description":"The polar grid (<g>, aria-hidden) - ring and spoke linework behind the series"},{"name":"chart-radars","description":"The series layer (<g>) - every radar polygon renders here; the CSS entrance scales this group from the polar center"},{"name":"chart-radar","description":"One series' closed polygon (<path>) - config color, 0.6 fill by default","states":[{"attr":"data-key","condition":"always - the series key"}]},{"name":"chart-dots","description":"A series' vertex dots (<g>), rendered when dots: true","states":[{"attr":"data-key","condition":"always - the series key"}]},{"name":"chart-dot","description":"One vertex dot (<circle>) - solid, at the series color"},{"name":"chart-angle-axis","description":"The category labels around the rim (<g> of <text>)"},{"name":"chart-hit-wedges","description":"The tooltip's hit layer (<g>), rendered when the tooltip attaches"},{"name":"chart-hit-wedge","description":"One per-category hit wedge (<path>, transparent but painted so it hit-tests) - the tooltip's hover target","states":[{"attr":"data-index","condition":"always - the datum index"},{"attr":"data-active","condition":"the hovered/arrow-keyed category - the tooltip controller reflects the active index here at runtime"}]},{"name":"chart-coordinates","description":"The embedded JSON payload (<script>) the tooltip controller reads - per-category anchors and pre-formatted values, zero chart math in the browser"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"radial-bar-chart","type":"registry:component","title":"Radial bar chart","files":[{"path":"app/components/poetry/charts/radial_bar_chart/component.html.erb","type":"registry:file","target":"app/components/poetry/charts/radial_bar_chart/component.html.erb"},{"path":"app/components/poetry/charts/radial_bar_chart/component.rb","type":"registry:file","target":"app/components/poetry/charts/radial_bar_chart/component.rb"},{"path":"app/components/poetry/charts/radial_bar_chart/preview.rb","type":"registry:file","target":"app/components/poetry/charts/radial_bar_chart/preview.rb"},{"path":"app/components/poetry/charts/radial_bar_chart/style.rb","type":"registry:file","target":"app/components/poetry/charts/radial_bar_chart/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-charts","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Charts::RadialBarChart::Component","identifier":"poetry--charts--radial_bar_chart","parts":[{"name":"chart-svg","description":"The chart canvas (<svg>) - the aria-label surface, the tooltip's focus/keyboard surface (role=application when it attaches), and the motion rig's mount","states":[{"attr":"data-animate","condition":"when animate (the default) - the entrance tier's flag the motion stylesheet and controller key off"},{"attr":"data-motion","condition":"runtime, when animate - the motion engine's lifecycle stamp","values":["entrance","morph","settled"]}],"vars":[{"name":"--poetry-motion-delay","description":"the motion rig's entrance delay (animation_begin)"},{"name":"--poetry-motion-duration","description":"the motion rig's entrance duration (animation_duration)"},{"name":"--poetry-motion-easing","description":"the motion rig's easing keyword (animation_easing)"}]},{"name":"chart-polar-grid","description":"The polar grid (<g>, aria-hidden) - ring and spoke linework behind the series"},{"name":"chart-radial-series","description":"One series' ring group (<g>)","states":[{"attr":"data-key","condition":"always - the series key"}]},{"name":"chart-radial-background","description":"The muted track ring (<path>) behind a bar, rendered when background: true"},{"name":"chart-radial-bar","description":"One angular bar (<path>) - a ring per data row, sweep proportional to value","states":[{"attr":"data-key","condition":"always - the series key"},{"attr":"data-index","condition":"on the first series' bars - the datum index the tooltip walks"},{"attr":"data-active","condition":"the hovered/arrow-keyed bar - the tooltip controller reflects the active index here at runtime"},{"attr":"data-motion-group","condition":"when animate - the motion rig's sweep group (one per ring)"},{"attr":"data-motion-sector","condition":"when animate - the motion rig's server-computed sector params for the fan-out sweep"}]},{"name":"chart-labels","description":"A series' value labels (<g> of <text>, aria-hidden), rendered when the series opts into labels","states":[{"attr":"data-key","condition":"always - the series key"}]},{"name":"chart-center-label","description":"The center text (<text>) - title tspan plus optional subtitle filling the chart's middle"},{"name":"chart-coordinates","description":"The embedded JSON payload (<script>) the tooltip controller reads - per-category anchors and pre-formatted values, zero chart math in the browser"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"radio-group","type":"registry:component","title":"Radio group","files":[{"path":"app/components/poetry/ui/radio_group/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/radio_group/component.html.erb"},{"path":"app/components/poetry/ui/radio_group/component.rb","type":"registry:file","target":"app/components/poetry/ui/radio_group/component.rb"},{"path":"app/components/poetry/ui/radio_group/preview.rb","type":"registry:file","target":"app/components/poetry/ui/radio_group/preview.rb"},{"path":"app/components/poetry/ui/radio_group/style.rb","type":"registry:file","target":"app/components/poetry/ui/radio_group/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::RadioGroup::Component","identifier":"poetry--ui--radio_group","parts":[{"name":"radio-group","description":"The role=radiogroup root - one Tab stop; items (and their label-pairing rows) render as direct children","states":[{"attr":"data-disabled","condition":"disabled: is set on the root - every item disables with it"}]},{"name":"radio-group-item","description":"A button[role=radio] per item - carries its own hidden native radio as a sibling","states":[{"attr":"data-checked","condition":"the checked item (the controller writes the pair and aria-checked together on every item)"},{"attr":"data-unchecked","condition":"every other item"},{"attr":"data-disabled","condition":"the item (or the whole group) is disabled - also the roving-focus collection filter"},{"attr":"data-value","condition":"always - the item's value (keys the checked-value machine)"}]},{"name":"radio-group-indicator","description":"The theme-sized centering box holding the checked dot (the dot itself is the themed .cn-radio-group-indicator-icon span) - hidden (the native attribute, toggled by the controller) while unchecked"},{"name":"radio-group-card","description":"The choice-card row (variant: :card) - a <label> for= the radio button, so the whole card toggles; the checked treatments key on data-checked inside it"},{"name":"radio-group-card-content","description":"Text column of a choice-card item (variant: :card) - title and description stack inside the card label"},{"name":"radio-group-card-title","description":"The choice card's title line (the item label:)"},{"name":"radio-group-card-description","description":"Muted copy under the choice card's title (description:)"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"resizable","type":"registry:component","title":"Resizable","files":[{"path":"app/components/poetry/ui/resizable/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/resizable/component.html.erb"},{"path":"app/components/poetry/ui/resizable/component.rb","type":"registry:file","target":"app/components/poetry/ui/resizable/component.rb"},{"path":"app/components/poetry/ui/resizable/preview.rb","type":"registry:file","target":"app/components/poetry/ui/resizable/preview.rb"},{"path":"app/components/poetry/ui/resizable/style.rb","type":"registry:file","target":"app/components/poetry/ui/resizable/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Resizable::Component","identifier":"poetry--ui--resizable","parts":[{"name":"resizable-panel-group","description":"The flex group root - the splitter controller rides here","states":[{"attr":"data-orientation","condition":"the group axis","values":["horizontal","vertical"]}]},{"name":"resizable-panel","description":"One flex child whose flex-grow IS its percentage - the controller rewrites the inline flex on every resize","states":[{"attr":"data-min-size","condition":"the panel's minimum percentage, rendered when with_panel passes min_size: (the controller's clamp floor)"},{"attr":"data-max-size","condition":"the panel's maximum percentage, rendered when with_panel passes max_size: (the controller's clamp ceiling)"}]},{"name":"resizable-handle","description":"The role=separator splitter between panels - drag and keyboard resizing live here; its aria-valuenow tracks the preceding panel"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"scaffold-templates","type":"registry:block","title":"poetry scaffold templates","description":"The lib/templates override set that makes the STANDARD `rails g scaffold` emit poetry-composed views and a matching controller - the same files `bin/rails g poetry:scaffold_templates` copies.","files":[{"path":"_form.html.erb.tt","type":"registry:file","target":"lib/templates/erb/scaffold/_form.html.erb.tt"},{"path":"controller.rb.tt","type":"registry:file","target":"lib/templates/rails/scaffold_controller/controller.rb.tt"},{"path":"edit.html.erb.tt","type":"registry:file","target":"lib/templates/erb/scaffold/edit.html.erb.tt"},{"path":"index.html.erb.tt","type":"registry:file","target":"lib/templates/erb/scaffold/index.html.erb.tt"},{"path":"new.html.erb.tt","type":"registry:file","target":"lib/templates/erb/scaffold/new.html.erb.tt"},{"path":"partial.html.erb.tt","type":"registry:file","target":"lib/templates/erb/scaffold/partial.html.erb.tt"},{"path":"show.html.erb.tt","type":"registry:file","target":"lib/templates/erb/scaffold/show.html.erb.tt"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"copy-in","kind":"recipe"}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"scatter-chart","type":"registry:component","title":"Scatter chart","files":[{"path":"app/components/poetry/charts/scatter_chart/component.html.erb","type":"registry:file","target":"app/components/poetry/charts/scatter_chart/component.html.erb"},{"path":"app/components/poetry/charts/scatter_chart/component.rb","type":"registry:file","target":"app/components/poetry/charts/scatter_chart/component.rb"},{"path":"app/components/poetry/charts/scatter_chart/preview.rb","type":"registry:file","target":"app/components/poetry/charts/scatter_chart/preview.rb"},{"path":"app/components/poetry/charts/scatter_chart/style.rb","type":"registry:file","target":"app/components/poetry/charts/scatter_chart/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-charts","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Charts::ScatterChart::Component","identifier":"poetry--charts--scatter_chart","parts":[{"name":"chart-svg","description":"The chart canvas (<svg>) - server-computed geometry in a fixed viewBox; role=img, or the focusable role=application accessibilityLayer when the tooltip attaches","states":[{"attr":"data-animate","condition":"present when animate (the default) - the motion stylesheet and controller key the entrance off it"},{"attr":"data-motion","condition":"runtime - the motion rig stamps the animation lifecycle (entrance/morph, then settled)","values":["entrance","morph","settled"]}],"vars":[{"name":"--poetry-motion-duration","description":"the entrance/morph duration (animation_duration, ms)"},{"name":"--poetry-motion-easing","description":"the animation easing keyword (animation_easing)"},{"name":"--poetry-motion-delay","description":"the pre-animation hold (animation_begin, ms)"}]},{"name":"chart-grid","description":"The gridline group (with_grid) - horizontal and/or vertical rules across the plot"},{"name":"chart-scatters","description":"The scatter-mark group - every series' points flattened with a global index"},{"name":"chart-scatter-point","description":"One data point (<circle>) - r carries the z-axis area sizing","states":[{"attr":"data-key","condition":"the series key"},{"attr":"data-index","condition":"the point's global index across every series"},{"attr":"data-active","condition":"runtime - the tooltip controller marks the hovered point"}]},{"name":"chart-error-bars","description":"One series' error-whisker group (error_key:) - cap-stem-cap paths in the foreground color","states":[{"attr":"data-key","condition":"the series key"}]},{"name":"chart-reference","description":"The reference-mark group (with_reference_line/_area/_dot), painted above the series"},{"name":"chart-x-axis","description":"The x-axis tick-label group (with_x_axis)"},{"name":"chart-y-axis","description":"The y-axis tick-label group (with_y_axis)"},{"name":"chart-coordinates","description":"The embedded per-index geometry payload (<script type=application/json>) the tooltip controller reads - zero chart math in the browser"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"screen-data-index","type":"registry:block","title":"Data index screen","description":"The data-index block as a working feature slice: OrdersController, its index view rendering the block, and a system test. Add `resources :orders, only: :index` to routes.","files":[{"path":"app/controllers/orders_controller.rb","type":"registry:file","target":"app/controllers/orders_controller.rb"},{"path":"app/views/orders/index.html.erb","type":"registry:file","target":"app/views/orders/index.html.erb"},{"path":"test/system/orders_index_test.rb","type":"registry:file","target":"test/system/orders_index_test.rb"}],"registryDependencies":["data-index"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"copy-in","kind":"recipe"}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"screen-settings","type":"registry:block","title":"Settings screen","description":"A settings page composed from the page-header, section-card, and destructive-panel blocks: SettingsController, the composed view, and a system test. Add `resource :settings, only: :show` to routes.","files":[{"path":"app/controllers/settings_controller.rb","type":"registry:file","target":"app/controllers/settings_controller.rb"},{"path":"app/views/settings/show.html.erb","type":"registry:file","target":"app/views/settings/show.html.erb"},{"path":"test/system/settings_show_test.rb","type":"registry:file","target":"test/system/settings_show_test.rb"}],"registryDependencies":["page-header","section-card","destructive-panel"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"copy-in","kind":"recipe"}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"scroll-area","type":"registry:component","title":"Scroll area","files":[{"path":"app/components/poetry/ui/scroll_area/component.rb","type":"registry:file","target":"app/components/poetry/ui/scroll_area/component.rb"},{"path":"app/components/poetry/ui/scroll_area/preview.rb","type":"registry:file","target":"app/components/poetry/ui/scroll_area/preview.rb"},{"path":"app/components/poetry/ui/scroll_area/style.rb","type":"registry:file","target":"app/components/poetry/ui/scroll_area/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::ScrollArea::Component","identifier":"poetry--ui--scroll_area","parts":[{"name":"scroll-area","description":"The bounding wrapper - size it with classes; content decides the overflow"},{"name":"scroll-area-viewport","description":"The focusable native scroll region (role=region + tabindex=0) with themed platform scrollbars - zero JS"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"search-field","type":"registry:component","title":"Search field","files":[{"path":"app/components/poetry/ui/search_field/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/search_field/component.html.erb"},{"path":"app/components/poetry/ui/search_field/component.rb","type":"registry:file","target":"app/components/poetry/ui/search_field/component.rb"},{"path":"app/components/poetry/ui/search_field/preview.rb","type":"registry:file","target":"app/components/poetry/ui/search_field/preview.rb"},{"path":"app/components/poetry/ui/search_field/style.rb","type":"registry:file","target":"app/components/poetry/ui/search_field/style.rb"}],"registryDependencies":["input","input-group","button","icon"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::SearchField::Component","identifier":"poetry--ui--search_field","parts":[{"name":"search-field","description":"Root - the controller and the emptiness state ride here","states":[{"attr":"data-empty","condition":"the input holds no text (server-set, controller-kept; hides the clear affordance)"}]},{"name":"input-group-addon","description":"The leading search-glyph cell - InputGroup's addon vocabulary (the NumberField precedent)","states":[{"attr":"data-align","condition":"always - inline-start holds the glyph, inline-end the clear button","values":["inline-start","inline-end"]}]},{"name":"search-field-group","description":"The bordered field surface - InputGroup's chrome, focus ring keyed on the control inside"},{"name":"input-group-control","description":"The native <input type=search> - InputGroup's control slot (the themes' focus-ring hook); WebKit's own cancel affordance suppressed"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"section-card","type":"registry:block","title":"Section card","description":"A contained content section: header row with title, supporting description and a status badge, body copy with a feature list, and a footer pairing meta text with a call-to-action.","files":[{"path":"lib/generators/poetry/block/templates/section_card.html.erb","type":"registry:file","target":"app/views/blocks/_section_card.html.erb"}],"registryDependencies":["badge","card","icon","link"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"copy-in","keywords":["settings","section","panel","account","detail","summary","form"]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"select","type":"registry:component","title":"Select","files":[{"path":"app/components/poetry/ui/select/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/select/component.html.erb"},{"path":"app/components/poetry/ui/select/component.rb","type":"registry:file","target":"app/components/poetry/ui/select/component.rb"},{"path":"app/components/poetry/ui/select/preview.rb","type":"registry:file","target":"app/components/poetry/ui/select/preview.rb"},{"path":"app/components/poetry/ui/select/style.rb","type":"registry:file","target":"app/components/poetry/ui/select/style.rb"}],"registryDependencies":["icon"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Select::Component","identifier":"poetry--ui--select","parts":[{"name":"select","description":"Root wrapper carrying both controllers (select + popper) and the optional dir attribute"},{"name":"select-native","description":"The visually-hidden native <select> - the serialization truth (name/required/disabled + every option); plumbing, never styled or targeted"},{"name":"select-trigger","description":"The role=combobox button the field label reaches - the value display and chevron ride inside","states":[{"attr":"data-size","condition":"always - the resolved size variant","values":["sm","default"]},{"attr":"data-placeholder","condition":"no option is committed (bare; the controller toggles it on every commit)"},{"attr":"data-popup-open","condition":"the popup is open (bare while open, absent while closed - the controller flips it with the open state)"}]},{"name":"select-value","description":"The value display span - the selected option's label, or the placeholder","states":[{"attr":"data-placeholder","condition":"placeholder: is given - carries the placeholder text so a later clear can restore it"}]},{"name":"select-content","description":"The popper-positioned popup shell (scroll buttons + viewport) - open/closed and the resolved placement ride here","states":[{"attr":"data-open","condition":"popup is open (the controller flips the pair at runtime)"},{"attr":"data-closed","condition":"popup is closed or animating out (the server-rendered state)"},{"attr":"data-side","condition":"the placement side - server-rendered from side:, rewritten to the resolved side by popper on open","values":["top","right","bottom","left"]},{"attr":"data-align","condition":"the placement alignment - server-rendered from align:, rewritten by popper on open","values":["start","center","end"]}],"vars":[{"name":"--transform-origin","description":"popper - the animation origin matching the resolved placement"},{"name":"--available-width","description":"popper - viewport space available to the popup post-flip"},{"name":"--available-height","description":"popper - viewport space available to the popup post-flip"},{"name":"--anchor-width","description":"popper - the trigger's measured width"},{"name":"--anchor-height","description":"popper - the trigger's measured height"},{"name":"--radix-select-trigger-width","description":"the select controller measures the trigger on open - the viewport's min-width binding"},{"name":"--radix-select-trigger-height","description":"the select controller measures the trigger on open - the viewport's MINIMUM-height binding (a hard height collapses the popup to the trigger; the list grows past it)"}]},{"name":"select-scroll-up-button","description":"Hover-scroll affordance above the viewport - rendered always but hidden; the controller unhides it per scroll extremes (aria-hidden)"},{"name":"select-scroll-down-button","description":"Hover-scroll affordance below the viewport (the same contract as the up button)"},{"name":"select-viewport","description":"The role=listbox scroll container - the options' actual parent, labelled from the trigger"},{"name":"select-group","description":"role=group wrapper labelled by its select-label heading"},{"name":"select-label","description":"The group heading - styled, no ARIA role (the group points at it via aria-labelledby)"},{"name":"select-item","description":"One role=option div - selection, disablement, and the committable value ride here","states":[{"attr":"data-value","condition":"always - the option's committable value (the native <option> twin)"},{"attr":"data-selected","condition":"the option is committed (bare; absent while unselected - the controller twin-writes it with aria-selected)"},{"attr":"data-disabled","condition":"disabled: is set (aria-disabled rides along)"}]},{"name":"select-item-indicator","description":"The check gutter - server-rendered always; the parent item's data-selected absence hides it"},{"name":"select-item-text","description":"The option's label span - the value display copies from it"},{"name":"select-separator","description":"Decorative divider between options (aria-hidden)"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"sensitive-input","type":"registry:component","title":"Sensitive input","files":[{"path":"app/components/poetry/ui/sensitive_input/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/sensitive_input/component.html.erb"},{"path":"app/components/poetry/ui/sensitive_input/component.rb","type":"registry:file","target":"app/components/poetry/ui/sensitive_input/component.rb"},{"path":"app/components/poetry/ui/sensitive_input/preview.rb","type":"registry:file","target":"app/components/poetry/ui/sensitive_input/preview.rb"},{"path":"app/components/poetry/ui/sensitive_input/style.rb","type":"registry:file","target":"app/components/poetry/ui/sensitive_input/style.rb"}],"registryDependencies":["input","input-group","button","icon","clipboard-text"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::SensitiveInput::Component","identifier":"poetry--ui--sensitive_input","parts":[{"name":"sensitive-input","description":"Root - the state machine rides here","states":[{"attr":"data-state","condition":"always - masked (value hidden, group is the reveal button), revealed, or empty","values":["masked","revealed","empty"]},{"attr":"data-copied","condition":"copy: only - stamped for a beat after a successful copy (the clipboard-text engine)"},{"attr":"data-disabled","condition":"disabled: - the masked group loses its tab stop and pointer affordances"}]},{"name":"sensitive-input-group","description":"The bordered field surface (InputGroup's chrome) - clicks anywhere on it reveal; wears the focus ring when the mask button inside holds focus"},{"name":"input-group-control","description":"The real input - rendered in every state for layout stability; inert while masked (aria-hidden, tabindex -1, readonly, transparent); type=password unless revealed"},{"name":"sensitive-input-mask","description":"The overlay painting the masked state - while masked it IS the reveal button (role=button, tabindex 0, \"{label}, masked.\", described by the sr hint; only text spans inside, so no nested-interactive); bullet dots swap to the reveal hint on hover/focus with no layout shift"},{"name":"input-group-addon","description":"The trailing cell holding the eye (and copy: affordance)","states":[{"attr":"data-align","condition":"always - inline-end holds the actions","values":["inline-end"]}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"separator","type":"registry:component","title":"Separator","files":[{"path":"app/components/poetry/ui/separator/component.rb","type":"registry:file","target":"app/components/poetry/ui/separator/component.rb"},{"path":"app/components/poetry/ui/separator/preview.rb","type":"registry:file","target":"app/components/poetry/ui/separator/preview.rb"},{"path":"app/components/poetry/ui/separator/style.rb","type":"registry:file","target":"app/components/poetry/ui/separator/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Separator::Component","identifier":"poetry--ui--separator","parts":[{"name":"separator","description":"The divider itself - decorative (aria-hidden) by default, role=separator when decorative: false","states":[{"attr":"data-orientation","condition":"always - the resolved orientation","values":["horizontal","vertical"]}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"sheet","type":"registry:component","title":"Sheet","files":[{"path":"app/components/poetry/ui/sheet/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/sheet/component.html.erb"},{"path":"app/components/poetry/ui/sheet/component.rb","type":"registry:file","target":"app/components/poetry/ui/sheet/component.rb"},{"path":"app/components/poetry/ui/sheet/preview.rb","type":"registry:file","target":"app/components/poetry/ui/sheet/preview.rb"},{"path":"app/components/poetry/ui/sheet/style.rb","type":"registry:file","target":"app/components/poetry/ui/sheet/style.rb"}],"registryDependencies":["dialog","button","icon"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Sheet::Component","identifier":"poetry--ui--sheet","parts":[{"name":"sheet","description":"Root wrapper around the trigger and the <dialog> element"},{"name":"sheet-content","description":"The <dialog> panel, anchored to a screen edge - the slide animation and the open state ride here","states":[{"attr":"data-open","condition":"panel is open (the controller flips the pair at runtime)"},{"attr":"data-closed","condition":"panel is closed or animating out (the server-rendered state; the presence-hold close rides the closed slide-out)"},{"attr":"data-side","condition":"always - the edge the sheet slides in from","values":["top","right","bottom","left"]}]},{"name":"sheet-header","description":"Title block at the top of the panel"},{"name":"sheet-title","description":"The heading - the sheet's accessible name (required slot)"},{"name":"sheet-description","description":"Muted copy under the title, wired to aria-describedby"},{"name":"sheet-footer","description":"Action row pinned to the bottom of the panel"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"sidebar","type":"registry:component","title":"Sidebar","files":[{"path":"app/components/poetry/ui/sidebar/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/sidebar/component.html.erb"},{"path":"app/components/poetry/ui/sidebar/component.rb","type":"registry:file","target":"app/components/poetry/ui/sidebar/component.rb"},{"path":"app/components/poetry/ui/sidebar/preview.rb","type":"registry:file","target":"app/components/poetry/ui/sidebar/preview.rb"},{"path":"app/components/poetry/ui/sidebar/shell_preview.html.erb","type":"registry:file","target":"app/components/poetry/ui/sidebar/shell_preview.html.erb"},{"path":"app/components/poetry/ui/sidebar/style.rb","type":"registry:file","target":"app/components/poetry/ui/sidebar/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Sidebar::Component","identifier":"poetry--ui--sidebar","parts":[{"name":"sidebar-wrapper","description":"The provider shell around the column, the mobile dialog, and the inset","vars":[{"name":"--sidebar-width","description":"the expanded column width (16rem) - the gap/container geometry reads it"},{"name":"--sidebar-width-icon","description":"the collapsed icon-rail width (3rem)"}]},{"name":"sidebar","description":"The desktop state peer - the collapse state lives here and the pure-CSS group-data chrome keys on it","states":[{"attr":"data-state","condition":"expanded or collapsed - the controller flips it and persists the cookie"},{"attr":"data-collapsible","condition":"the collapse mode WHILE collapsed (empty while expanded - source parity)","values":["offcanvas","icon","none"]},{"attr":"data-variant","condition":"the column treatment","values":["sidebar","floating","inset"]},{"attr":"data-side","condition":"which edge the column hangs on","values":["left","right"]}]},{"name":"sidebar-gap","description":"The in-flow width ghost that pushes the inset over - its width animates on collapse"},{"name":"sidebar-container","description":"The fixed-position column itself","states":[{"attr":"data-side","condition":"which edge it pins to","values":["left","right"]}]},{"name":"sidebar-inner","description":"The flex column receiving the nav slot - the mobile mode adopts its children from here"},{"name":"sidebar-mobile","description":"The mobile sheet <dialog> (below md) - server-rendered empty; the controller adopts the nav children on open","states":[{"attr":"data-open","condition":"sheet is open (presence flips the pair at runtime)"},{"attr":"data-closed","condition":"sheet is closed (the server-rendered state)"},{"attr":"data-mobile","condition":"always \"true\" - the mobile-mode marker"},{"attr":"data-side","condition":"which edge the sheet slides from","values":["left","right"]},{"attr":"data-sidebar","condition":"always \"sidebar\" - the suite-wide sub-part marker"}],"vars":[{"name":"--sidebar-width","description":"overridden inline to the mobile sheet width (18rem)"}]},{"name":"sidebar-mobile-inner","description":"The adoption container the nav children move into while the sheet is open"},{"name":"sidebar-inset","description":"The <main> page area beside the column"},{"name":"sidebar-header","description":"Top block of the column (with_nav content)"},{"name":"sidebar-footer","description":"Bottom block of the column"},{"name":"sidebar-content","description":"The scrollable middle of the column"},{"name":"sidebar-group","description":"One titled section inside the content"},{"name":"sidebar-group-label","description":"The section heading - fades and collapses away in icon mode"},{"name":"sidebar-menu","description":"The <ul> of menu items inside a group"},{"name":"sidebar-menu-item","description":"One <li> menu row (the group/menu-item hover scope)"},{"name":"sidebar-menu-button","description":"The row's link (href:) or button - the navigation entry itself","states":[{"attr":"data-active","condition":"the current route (active: - links also get aria-current=page)"},{"attr":"data-open","condition":"when the button is a collapsible's trigger - the disclosure state the collapsible controller flips"},{"attr":"data-size","condition":"the row size variant (default, sm, or lg) - the action/badge tops key on it"},{"attr":"data-variant","condition":"always - the treatment","values":["default","outline"]}]},{"name":"sidebar-menu-action","description":"The item-corner action button, absolutely positioned in the row","states":[{"attr":"data-sidebar","condition":"always \"menu-action\" - the suite-wide sub-part marker"}]},{"name":"sidebar-menu-badge","description":"The trailing count/status chrome in the row corner - pointer-transparent","states":[{"attr":"data-sidebar","condition":"always \"menu-badge\" - the suite-wide sub-part marker"}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"skeleton","type":"registry:component","title":"Skeleton","files":[{"path":"app/components/poetry/ui/skeleton/component.rb","type":"registry:file","target":"app/components/poetry/ui/skeleton/component.rb"},{"path":"app/components/poetry/ui/skeleton/preview.rb","type":"registry:file","target":"app/components/poetry/ui/skeleton/preview.rb"},{"path":"app/components/poetry/ui/skeleton/style.rb","type":"registry:file","target":"app/components/poetry/ui/skeleton/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Skeleton::Component","identifier":"poetry--ui--skeleton","parts":[{"name":"skeleton","description":"The pulsing placeholder box itself - sized entirely by utility classes"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"skill-poetry","type":"registry:block","title":"poetry skill bundle","description":"The component-usage Claude Code skill (SKILL.md + per-family references), generated from the live registry - the same files `bin/rails g poetry:skill` installs.","files":[{"path":"SKILL.md","type":"registry:file","target":".claude/skills/poetry/SKILL.md"},{"path":"references/forms.md","type":"registry:file","target":".claude/skills/poetry/references/forms.md"},{"path":"references/overlays.md","type":"registry:file","target":".claude/skills/poetry/references/overlays.md"},{"path":"references/data.md","type":"registry:file","target":".claude/skills/poetry/references/data.md"},{"path":"references/feedback.md","type":"registry:file","target":".claude/skills/poetry/references/feedback.md"},{"path":"references/navigation.md","type":"registry:file","target":".claude/skills/poetry/references/navigation.md"},{"path":"references/foundations.md","type":"registry:file","target":".claude/skills/poetry/references/foundations.md"},{"path":"references/chat.md","type":"registry:file","target":".claude/skills/poetry/references/chat.md"},{"path":"references/layout.md","type":"registry:file","target":".claude/skills/poetry/references/layout.md"},{"path":"references/blocks.md","type":"registry:file","target":".claude/skills/poetry/references/blocks.md"},{"path":"references/deciding.md","type":"registry:file","target":".claude/skills/poetry/references/deciding.md"},{"path":"references/charts.md","type":"registry:file","target":".claude/skills/poetry/references/charts.md"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"copy-in","kind":"recipe"}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"skill-poetry-component","type":"registry:block","title":"poetry-component skill bundle","description":"The component-authoring Claude Code skill (anatomy / documentation / audit references) - the same files `bin/rails g poetry:skill` installs.","files":[{"path":"SKILL.md","type":"registry:file","target":".claude/skills/poetry-component/SKILL.md"},{"path":"references/anatomy.md","type":"registry:file","target":".claude/skills/poetry-component/references/anatomy.md"},{"path":"references/checklist.md","type":"registry:file","target":".claude/skills/poetry-component/references/checklist.md"},{"path":"references/documentation.md","type":"registry:file","target":".claude/skills/poetry-component/references/documentation.md"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"copy-in","kind":"recipe"}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"skill-poetry-design","type":"registry:block","title":"poetry-design skill bundle","description":"The design-taste Claude Code skill (theme / compose / audit / study references) - the same files `bin/rails g poetry:skill` installs.","files":[{"path":"SKILL.md","type":"registry:file","target":".claude/skills/poetry-design/SKILL.md"},{"path":"references/audit.md","type":"registry:file","target":".claude/skills/poetry-design/references/audit.md"},{"path":"references/compose.md","type":"registry:file","target":".claude/skills/poetry-design/references/compose.md"},{"path":"references/figma.md","type":"registry:file","target":".claude/skills/poetry-design/references/figma.md"},{"path":"references/paper.md","type":"registry:file","target":".claude/skills/poetry-design/references/paper.md"},{"path":"references/study.md","type":"registry:file","target":".claude/skills/poetry-design/references/study.md"},{"path":"references/theme.md","type":"registry:file","target":".claude/skills/poetry-design/references/theme.md"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"copy-in","kind":"recipe"}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"slider","type":"registry:component","title":"Slider","files":[{"path":"app/components/poetry/ui/slider/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/slider/component.html.erb"},{"path":"app/components/poetry/ui/slider/component.rb","type":"registry:file","target":"app/components/poetry/ui/slider/component.rb"},{"path":"app/components/poetry/ui/slider/preview.rb","type":"registry:file","target":"app/components/poetry/ui/slider/preview.rb"},{"path":"app/components/poetry/ui/slider/style.rb","type":"registry:file","target":"app/components/poetry/ui/slider/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Slider::Component","identifier":"poetry--ui--slider","parts":[{"name":"slider","description":"Root - the controller, the geometry vars, and pointer capture ride here","states":[{"attr":"data-orientation","condition":"always - the axis","values":["horizontal","vertical"]},{"attr":"data-disabled","condition":"disabled: is set (the control is inert; the hidden inputs still submit)"},{"attr":"data-dragging","condition":"a pointer drag is in flight (the controller sets it for the gesture; never rendered server-side)"}],"vars":[{"name":"--slider-start","description":"the filled range's start edge as a percentage - server-rendered (no first-paint jump), rewritten by the controller on every move"},{"name":"--slider-end","description":"the filled range's end edge as a percentage (the single-thumb value rides here)"}]},{"name":"slider-track","description":"The full-length rail the range paints over","states":[{"attr":"data-orientation","condition":"always - mirrors the root","values":["horizontal","vertical"]}]},{"name":"slider-range","description":"The filled span between --slider-start and --slider-end","states":[{"attr":"data-orientation","condition":"always - mirrors the root","values":["horizontal","vertical"]}]},{"name":"slider-anchor","description":"Absolutely positioned thumb wrapper (one per thumb, with its hidden input alongside) seated on the geometry vars","states":[{"attr":"data-orientation","condition":"always - mirrors the root","values":["horizontal","vertical"]}]},{"name":"slider-thumb","description":"The role=slider handle - its own Tab stop, carrying the aria-value* surface (bounds neighbor-clamped in range mode)","states":[{"attr":"data-orientation","condition":"always - mirrors the root","values":["horizontal","vertical"]},{"attr":"data-disabled","condition":"disabled: is set (tabindex drops to -1)"},{"attr":"data-dragging","condition":"this thumb is the one being dragged (the controller pairs it with the root's)"}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"spinner","type":"registry:component","title":"Spinner","files":[{"path":"app/components/poetry/ui/spinner/component.rb","type":"registry:file","target":"app/components/poetry/ui/spinner/component.rb"},{"path":"app/components/poetry/ui/spinner/preview.rb","type":"registry:file","target":"app/components/poetry/ui/spinner/preview.rb"},{"path":"app/components/poetry/ui/spinner/style.rb","type":"registry:file","target":"app/components/poetry/ui/spinner/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Spinner::Component","identifier":"poetry--ui--spinner","parts":[{"name":"spinner","description":"The spinning <svg> itself (the lucide loader-circle) - announces as role=status with aria-label from label:"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"stat","type":"registry:component","title":"Stat","files":[{"path":"app/components/poetry/ui/stat/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/stat/component.html.erb"},{"path":"app/components/poetry/ui/stat/component.rb","type":"registry:file","target":"app/components/poetry/ui/stat/component.rb"},{"path":"app/components/poetry/ui/stat/preview.rb","type":"registry:file","target":"app/components/poetry/ui/stat/preview.rb"},{"path":"app/components/poetry/ui/stat/style.rb","type":"registry:file","target":"app/components/poetry/ui/stat/style.rb"}],"registryDependencies":["icon"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Stat::Component","identifier":"poetry--ui--stat","parts":[{"name":"stat","description":"The stat root - a label/value/delta/description column"},{"name":"stat-label","description":"The muted metric name above the value"},{"name":"stat-value","description":"The metric itself - large, semibold, tabular numerals"},{"name":"stat-delta","description":"The change pill beside the value - arrow icon + delta text with an sr-only trend word","states":[{"attr":"data-trend","condition":"always - the arrow direction","values":["up","down","flat"]},{"attr":"data-sentiment","condition":"always - resolved sentiment (trend-derived unless overridden)","values":["positive","negative","neutral"]}]},{"name":"stat-description","description":"Muted supporting copy under the value"},{"name":"stat-media","description":"The trend-visual slot (sparkline, chart, glyph) below the text stack"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"stepper","type":"registry:block","title":"Stepper","description":"A multi-step flow header: numbered step indicators with connectors and completed/current/upcoming states over the current step's panel with back/continue actions.","files":[{"path":"lib/generators/poetry/block/templates/stepper.html.erb","type":"registry:file","target":"app/views/blocks/_stepper.html.erb"}],"registryDependencies":["button","card","icon"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"copy-in","keywords":["stepper","wizard","steps","checkout","onboarding","progress","multi-step"]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"switch","type":"registry:component","title":"Switch","files":[{"path":"app/components/poetry/ui/switch/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/switch/component.html.erb"},{"path":"app/components/poetry/ui/switch/component.rb","type":"registry:file","target":"app/components/poetry/ui/switch/component.rb"},{"path":"app/components/poetry/ui/switch/preview.rb","type":"registry:file","target":"app/components/poetry/ui/switch/preview.rb"},{"path":"app/components/poetry/ui/switch/style.rb","type":"registry:file","target":"app/components/poetry/ui/switch/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Switch::Component","identifier":"poetry--ui--switch","parts":[{"name":"switch","description":"The visual button[role=switch] - reflects the hidden input via aria-checked plus the checked pair (never indeterminate)","states":[{"attr":"data-checked","condition":"on (the shared checked controller reflects every toggle here, aria-checked in step)"},{"attr":"data-unchecked","condition":"off (the server-rendered default)"},{"attr":"data-size","condition":"always - the resolved size (the thumb reads it via group/switch selectors)","values":["default","sm"]}]},{"name":"switch-thumb","description":"The sliding knob - travel is pure CSS off the checked pair","states":[{"attr":"data-checked","condition":"mirrors the control (the controller reflects state on every part wearing the pair)"},{"attr":"data-unchecked","condition":"mirrors the control - the thumb sits at the start"}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"table","type":"registry:component","title":"Table","files":[{"path":"app/components/poetry/ui/table/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/table/component.html.erb"},{"path":"app/components/poetry/ui/table/component.rb","type":"registry:file","target":"app/components/poetry/ui/table/component.rb"},{"path":"app/components/poetry/ui/table/preview.rb","type":"registry:file","target":"app/components/poetry/ui/table/preview.rb"},{"path":"app/components/poetry/ui/table/style.rb","type":"registry:file","target":"app/components/poetry/ui/table/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Table::Component","identifier":"poetry--ui--table","parts":[{"name":"table","description":"The semantic <table> element itself - the root the part helpers compose into"},{"name":"table-caption","description":"The <caption> (poetry_table_caption) - the table's accessible purpose"},{"name":"table-header","description":"The <thead> (poetry_table_header) holding the column-header row"},{"name":"table-body","description":"The <tbody> (poetry_table_body) holding the data rows"},{"name":"table-footer","description":"The <tfoot> (poetry_table_footer) - totals/summary rows"},{"name":"table-row","description":"A <tr> (poetry_table_row) in any section","states":[{"attr":"data-selected","condition":"the row is marked selected (presence attribute, no value) - the theme tints it"}]},{"name":"table-head","description":"A column header <th> (poetry_table_head)"},{"name":"table-cell","description":"A data <td> (poetry_table_cell)"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"tabs","type":"registry:component","title":"Tabs","files":[{"path":"app/components/poetry/ui/tabs/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/tabs/component.html.erb"},{"path":"app/components/poetry/ui/tabs/component.rb","type":"registry:file","target":"app/components/poetry/ui/tabs/component.rb"},{"path":"app/components/poetry/ui/tabs/preview.rb","type":"registry:file","target":"app/components/poetry/ui/tabs/preview.rb"},{"path":"app/components/poetry/ui/tabs/style.rb","type":"registry:file","target":"app/components/poetry/ui/tabs/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Tabs::Component","identifier":"poetry--ui--tabs","parts":[{"name":"tabs","description":"Root wrapper - the orientation rides here and flips the flex direction","states":[{"attr":"data-orientation","condition":"the tab axis (matches aria-orientation on the list)","values":["horizontal","vertical"]}]},{"name":"tabs-list","description":"The role=tablist row of triggers - the roving-focus keyboard group and the visual variant ride here","states":[{"attr":"data-variant","condition":"the list treatment - default (filled capsule) or line (underline indicator)"}]},{"name":"tabs-trigger","description":"One role=tab button per tab","states":[{"attr":"data-active","condition":"the selected tab (the controller moves it with aria-selected on activation)"},{"attr":"data-disabled","condition":"tab is disabled - also filters it from the roving-focus collection"},{"attr":"data-value","condition":"the tab's value - the key the controller matches panels against"}]},{"name":"tabs-content","description":"One role=tabpanel per tab - only the active panel is visible","states":[{"attr":"data-hidden","condition":"panel is inactive (paired with the hidden property - the controller flips both)"},{"attr":"data-value","condition":"the owning tab's value"}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"tag-group","type":"registry:component","title":"Tag group","files":[{"path":"app/components/poetry/ui/tag_group/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/tag_group/component.html.erb"},{"path":"app/components/poetry/ui/tag_group/component.rb","type":"registry:file","target":"app/components/poetry/ui/tag_group/component.rb"},{"path":"app/components/poetry/ui/tag_group/preview.rb","type":"registry:file","target":"app/components/poetry/ui/tag_group/preview.rb"},{"path":"app/components/poetry/ui/tag_group/style.rb","type":"registry:file","target":"app/components/poetry/ui/tag_group/style.rb"}],"registryDependencies":["icon"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::TagGroup::Component","identifier":"poetry--ui--tag_group","parts":[{"name":"tag-group","description":"The labelled wrapper - caption span + grid stack here"},{"name":"tag-group-label","description":"The caption span (label:), wired via aria-labelledby (a grid is not a labelable form control - never a <label>)"},{"name":"tag-group-grid","description":"The tag collection (role=grid; role=group + the tab stop when empty) - roving focus, removal keys, and the focus-scoped live region ride here","states":[{"attr":"data-empty","condition":"no tags remain (controller-kept after removals)"}]},{"name":"tag-group-tag","description":"One chip (role=row > gridcell): content, the remove button, and - in form mode - the hidden name[] input","states":[{"attr":"data-disabled","condition":"the tag is disabled (skipped by arrows and removal)"},{"attr":"data-value","condition":"always - the tag's value (the remove event's detail and the hidden input's value)"}]},{"name":"tag-group-remove","description":"The per-tag remove button - tabbable (Tab steps from the row into it), removes exactly its own tag"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"textarea","type":"registry:component","title":"Textarea","files":[{"path":"app/components/poetry/ui/textarea/component.rb","type":"registry:file","target":"app/components/poetry/ui/textarea/component.rb"},{"path":"app/components/poetry/ui/textarea/preview.rb","type":"registry:file","target":"app/components/poetry/ui/textarea/preview.rb"},{"path":"app/components/poetry/ui/textarea/style.rb","type":"registry:file","target":"app/components/poetry/ui/textarea/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Textarea::Component","identifier":"poetry--ui--textarea","parts":[{"name":"textarea","description":"The <textarea> element itself - value renders as content; auto-grow is the field-sizing-content CSS property, zero JS"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"time-field","type":"registry:component","title":"Time field","files":[{"path":"app/components/poetry/ui/time_field/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/time_field/component.html.erb"},{"path":"app/components/poetry/ui/time_field/component.rb","type":"registry:file","target":"app/components/poetry/ui/time_field/component.rb"},{"path":"app/components/poetry/ui/time_field/preview.rb","type":"registry:file","target":"app/components/poetry/ui/time_field/preview.rb"},{"path":"app/components/poetry/ui/time_field/style.rb","type":"registry:file","target":"app/components/poetry/ui/time_field/style.rb"}],"registryDependencies":["date-field","input"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::TimeField::Component","identifier":"poetry--ui--time_field","parts":[{"name":"time-field","description":"Root - the controller and the enhanced/disabled surface ride here (segments inside share the date-field-* vocabulary)","states":[{"attr":"data-enhanced","condition":"the controller connected and built segments (no JS = the native input, visible and styled)"},{"attr":"data-disabled","condition":"disabled: is set"},{"attr":"data-invalid","condition":"invalid: is set (the group wears the destructive ring)"}]},{"name":"time-field-group","description":"The bordered segment row - hidden until enhancement, then the editing surface (cn-input chrome, focus-within ring)","states":[{"attr":"data-disabled","condition":"disabled: is set (chrome dims, pointer events off)"},{"attr":"data-invalid","condition":"invalid: is set (destructive border + ring)"}]},{"name":"time-field-input","description":"The native <input type=time> - THE form value in both modes; tabindex -1 + aria-hidden once segments exist"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"timeline","type":"registry:component","title":"Timeline","files":[{"path":"app/components/poetry/ui/timeline/component.rb","type":"registry:file","target":"app/components/poetry/ui/timeline/component.rb"},{"path":"app/components/poetry/ui/timeline/preview.rb","type":"registry:file","target":"app/components/poetry/ui/timeline/preview.rb"},{"path":"app/components/poetry/ui/timeline/style.rb","type":"registry:file","target":"app/components/poetry/ui/timeline/style.rb"}],"registryDependencies":["icon"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Timeline::Component","identifier":"poetry--ui--timeline","parts":[{"name":"timeline","description":"The <ol> root - the event sequence","states":[{"attr":"data-orientation","condition":"always - the layout axis","values":["vertical","horizontal"]}]},{"name":"timeline-item","description":"One event (<li>): indicator + rail segment + header + description","states":[{"attr":"data-completed","condition":"the step is done - recolors its indicator and rail segment"}]},{"name":"timeline-indicator","description":"The decorative marker on the rail - a dot, or icon:'s glyph (aria-hidden; the sequence lives in the list semantics)"},{"name":"timeline-separator","description":"The decorative rail segment toward the next item - hidden on the last"},{"name":"timeline-header","description":"The title/time row"},{"name":"timeline-title","description":"The event's name"},{"name":"timeline-time","description":"The event's <time> - muted, small"},{"name":"timeline-content","description":"Muted description under the header (the item's block)"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"toast","type":"registry:component","title":"Toast","files":[{"path":"app/components/poetry/ui/toast/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/toast/component.html.erb"},{"path":"app/components/poetry/ui/toast/component.rb","type":"registry:file","target":"app/components/poetry/ui/toast/component.rb"},{"path":"app/components/poetry/ui/toast/preview.rb","type":"registry:file","target":"app/components/poetry/ui/toast/preview.rb"},{"path":"app/components/poetry/ui/toast/style.rb","type":"registry:file","target":"app/components/poetry/ui/toast/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Toast::Component","identifier":"poetry--ui--toast","parts":[{"name":"toast","description":"The notification item itself (<li>, role=status) - variant, open state, and the toaster's stack facts all ride here","states":[{"attr":"data-open","condition":"toast is showing (the server-rendered state; the dismiss exit flips the pair before removal)"},{"attr":"data-closed","condition":"toast is animating out"},{"attr":"data-variant","condition":"always - the resolved variant","values":["default","success","info","warning","destructive","loading"]},{"attr":"data-queued","condition":"the toaster holds it hidden past the visible limit (timer paused until a slot frees up)"}],"vars":[{"name":"--poetry-toast-index","description":"stack position written by the toaster's reflow (newest visible toast = 0)"}]},{"name":"toast-icon","description":"The variant's icon well (aria-hidden; the default variant renders none)"},{"name":"toast-title","description":"The message - the announced payload's first line (required slot)"},{"name":"toast-description","description":"Supporting copy under the title"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"toast-trigger","type":"registry:component","title":"Toast trigger","files":[{"path":"app/components/poetry/ui/toast_trigger/addressed_preview.html.erb","type":"registry:file","target":"app/components/poetry/ui/toast_trigger/addressed_preview.html.erb"},{"path":"app/components/poetry/ui/toast_trigger/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/toast_trigger/component.html.erb"},{"path":"app/components/poetry/ui/toast_trigger/component.rb","type":"registry:file","target":"app/components/poetry/ui/toast_trigger/component.rb"},{"path":"app/components/poetry/ui/toast_trigger/default_preview.html.erb","type":"registry:file","target":"app/components/poetry/ui/toast_trigger/default_preview.html.erb"},{"path":"app/components/poetry/ui/toast_trigger/preview.rb","type":"registry:file","target":"app/components/poetry/ui/toast_trigger/preview.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::ToastTrigger::Component","identifier":"poetry--ui--toast_trigger","parts":[{"name":"toast-trigger","description":"The stamping button - press clones the template's toast into the toaster region","states":[{"attr":"data-variant","condition":"always - the Button variant the trigger renders at"},{"attr":"data-size","condition":"always - the Button size the trigger renders at"}]},{"name":"label","description":"The Button's label span (the trigger renders AS a poetry Button)"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"toaster","type":"registry:component","title":"Toaster","files":[{"path":"app/components/poetry/ui/toaster/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/toaster/component.html.erb"},{"path":"app/components/poetry/ui/toaster/component.rb","type":"registry:file","target":"app/components/poetry/ui/toaster/component.rb"},{"path":"app/components/poetry/ui/toaster/positions_preview.html.erb","type":"registry:file","target":"app/components/poetry/ui/toaster/positions_preview.html.erb"},{"path":"app/components/poetry/ui/toaster/preview.rb","type":"registry:file","target":"app/components/poetry/ui/toaster/preview.rb"},{"path":"app/components/poetry/ui/toaster/stamp_preview.html.erb","type":"registry:file","target":"app/components/poetry/ui/toaster/stamp_preview.html.erb"},{"path":"app/components/poetry/ui/toaster/style.rb","type":"registry:file","target":"app/components/poetry/ui/toaster/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Toaster::Component","identifier":"poetry--ui--toaster","parts":[{"name":"toaster","description":"The toast viewport itself (<ol>, role=region, data-turbo-permanent) - the corner geometry and the Turbo Stream append target ride here","states":[{"attr":"data-position","condition":"always - the corner; each toast's slide direction keys off it via group/toaster","values":["top-left","top-center","top-right","bottom-left","bottom-center","bottom-right"]},{"attr":"data-poetry-top-layer","condition":"always - the dismissal layer exempts presses here, so clicking a toast never dismisses the overlay under it"}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"toggle","type":"registry:component","title":"Toggle","files":[{"path":"app/components/poetry/ui/toggle/component.rb","type":"registry:file","target":"app/components/poetry/ui/toggle/component.rb"},{"path":"app/components/poetry/ui/toggle/preview.rb","type":"registry:file","target":"app/components/poetry/ui/toggle/preview.rb"},{"path":"app/components/poetry/ui/toggle/style.rb","type":"registry:file","target":"app/components/poetry/ui/toggle/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Toggle::Component","identifier":"poetry--ui--toggle","parts":[{"name":"toggle","description":"The pressed-state <button> - the whole component; aria-pressed carries the state and the controller flips both together","states":[{"attr":"data-pressed","condition":"pressed (bare presence boolean - absent when unpressed, never data-pressed=false)"},{"attr":"data-disabled","condition":"disabled (rendered alongside native disabled for styling-hook parity)"},{"attr":"data-variant","condition":"the visual variant","values":["default","outline"]},{"attr":"data-size","condition":"the size","values":["default","sm","lg"]}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"toggle-group","type":"registry:component","title":"Toggle group","files":[{"path":"app/components/poetry/ui/toggle_group/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/toggle_group/component.html.erb"},{"path":"app/components/poetry/ui/toggle_group/component.rb","type":"registry:file","target":"app/components/poetry/ui/toggle_group/component.rb"},{"path":"app/components/poetry/ui/toggle_group/preview.rb","type":"registry:file","target":"app/components/poetry/ui/toggle_group/preview.rb"},{"path":"app/components/poetry/ui/toggle_group/style.rb","type":"registry:file","target":"app/components/poetry/ui/toggle_group/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::ToggleGroup::Component","identifier":"poetry--ui--toggle_group","parts":[{"name":"toggle-group","description":"The role=radiogroup (single) / role=toolbar (multiple) root - the value-set machine and roving focus ride here; the axes cascade to items","states":[{"attr":"data-variant","condition":"the shared Toggle variant (root wins)","values":["default","outline"]},{"attr":"data-size","condition":"the shared Toggle size (root wins)","values":["default","sm","lg"]},{"attr":"data-spacing","condition":"the gap step - 0 is the segmented chain (joined corners), >0 free-standing"},{"attr":"data-orientation","condition":"the roving axis","values":["horizontal","vertical"]},{"attr":"data-disabled","condition":"the whole group is disabled (disables every item)"}],"vars":[{"name":"--gap","description":"the item gap, set inline from spacing: - the root's gap utility consumes it"}]},{"name":"toggle-group-item","description":"One dumb <button> under the group machine - Toggle-styled, no per-item controller","states":[{"attr":"data-pressed","condition":"pressed (bare presence boolean - absent when off; the controller rederives the type-correct aria attribute from it)"},{"attr":"data-disabled","condition":"the item (or the whole group) is disabled - the roving-focus collection filter"},{"attr":"data-value","condition":"the item's key in the value set (always present, unique)"},{"attr":"data-variant","condition":"cascaded from the root","values":["default","outline"]},{"attr":"data-size","condition":"cascaded from the root","values":["default","sm","lg"]},{"attr":"data-spacing","condition":"cascaded from the root - keys the segmented corner/border chain"}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"toolbar","type":"registry:component","title":"Toolbar","files":[{"path":"app/components/poetry/ui/toolbar/component.rb","type":"registry:file","target":"app/components/poetry/ui/toolbar/component.rb"},{"path":"app/components/poetry/ui/toolbar/preview.rb","type":"registry:file","target":"app/components/poetry/ui/toolbar/preview.rb"},{"path":"app/components/poetry/ui/toolbar/style.rb","type":"registry:file","target":"app/components/poetry/ui/toolbar/style.rb"}],"registryDependencies":["button","input","separator"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Toolbar::Component","identifier":"poetry--ui--toolbar","parts":[{"name":"toolbar","description":"The role=toolbar root - one Tab stop; arrow keys rove across the slotted controls (roving-focus, with the caret guard protecting inputs)","states":[{"attr":"data-orientation","condition":"always - which arrows rove","values":["horizontal","vertical"]}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"tooltip","type":"registry:component","title":"Tooltip","files":[{"path":"app/components/poetry/ui/tooltip/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/tooltip/component.html.erb"},{"path":"app/components/poetry/ui/tooltip/component.rb","type":"registry:file","target":"app/components/poetry/ui/tooltip/component.rb"},{"path":"app/components/poetry/ui/tooltip/preview.rb","type":"registry:file","target":"app/components/poetry/ui/tooltip/preview.rb"},{"path":"app/components/poetry/ui/tooltip/previews/provider_row.html.erb","type":"registry:file","target":"app/components/poetry/ui/tooltip/previews/provider_row.html.erb"},{"path":"app/components/poetry/ui/tooltip/style.rb","type":"registry:file","target":"app/components/poetry/ui/tooltip/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Tooltip::Component","identifier":"poetry--ui--tooltip","parts":[{"name":"tooltip","description":"Root wrapper around the trigger and the bubble"},{"name":"tooltip-content","description":"The role=tooltip bubble - positioning, animation, and the open state ride here","states":[{"attr":"data-open","condition":"bubble is open (the controller flips the pair at runtime)"},{"attr":"data-closed","condition":"bubble is closed (the server-rendered state; hidden rides along)"},{"attr":"data-instant","condition":"the open skipped the delay - warm-grace/programmatic or keyboard focus (runtime-only; absent on a delayed open)","values":["delay","focus"]},{"attr":"data-side","condition":"always - the side (initial placement, re-resolved live by popper after flip)","values":["top","right","bottom","left"]},{"attr":"data-align","condition":"always - the alignment (re-resolved live by popper)","values":["start","center","end"]}],"vars":[{"name":"--transform-origin","description":"the anchor-facing origin popper writes for scale-in animation"},{"name":"--available-width","description":"viewport space left for the bubble (popper, post-flip)"},{"name":"--available-height","description":"viewport space left for the bubble (popper, post-flip)"},{"name":"--anchor-width","description":"the anchor's measured width (popper)"},{"name":"--anchor-height","description":"the anchor's measured height (popper)"}]},{"name":"tooltip-arrow","description":"The arrow wrapper (aria-hidden) - popper pins it to the bubble's anchor-facing edge and rotates it toward the anchor","states":[{"attr":"data-side","condition":"written by popper alongside the content's - the resolved side, for per-side restyling","values":["top","right","bottom","left"]}]}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"tooltip-content","type":"registry:component","title":"Tooltip content","files":[{"path":"app/components/poetry/charts/tooltip_content/component.html.erb","type":"registry:file","target":"app/components/poetry/charts/tooltip_content/component.html.erb"},{"path":"app/components/poetry/charts/tooltip_content/component.rb","type":"registry:file","target":"app/components/poetry/charts/tooltip_content/component.rb"},{"path":"app/components/poetry/charts/tooltip_content/preview.rb","type":"registry:file","target":"app/components/poetry/charts/tooltip_content/preview.rb"},{"path":"app/components/poetry/charts/tooltip_content/style.rb","type":"registry:file","target":"app/components/poetry/charts/tooltip_content/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-charts","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Charts::TooltipContent::Component","identifier":"poetry--charts--tooltip_content","parts":[{"name":"chart-tooltip-content","description":"The tooltip box (<div>) - the styled chrome the chart's tooltip controller positions and text-swaps"},{"name":"chart-tooltip-label","description":"The category label (<div>) - above the rows, or nested inside the single row for line/dashed indicators"},{"name":"chart-tooltip-item","description":"One series row (<div>) - indicator + name + value","states":[{"attr":"data-key","condition":"always - the series key the controller matches values by"}]},{"name":"chart-tooltip-indicator","description":"The row's swatch (<div>) - dot/line/dashed per indicator:, hidden with hide_indicator","vars":[{"name":"--color-bg","description":"the swatch fill - carries the row's series color (inline; polar charts retint it to the hovered slice's color at runtime)"},{"name":"--color-border","description":"the swatch border - the same series color as the fill"}]},{"name":"chart-tooltip-name","description":"The series name (<span>) - resolved through the chart config"},{"name":"chart-tooltip-value","description":"The formatted value (<span>) - the mono tabular column, numbers delimited"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"tooltip-layer","type":"registry:component","title":"Tooltip layer","files":[{"path":"app/components/poetry/charts/tooltip_layer/component.html.erb","type":"registry:file","target":"app/components/poetry/charts/tooltip_layer/component.html.erb"},{"path":"app/components/poetry/charts/tooltip_layer/component.rb","type":"registry:file","target":"app/components/poetry/charts/tooltip_layer/component.rb"},{"path":"app/components/poetry/charts/tooltip_layer/style.rb","type":"registry:file","target":"app/components/poetry/charts/tooltip_layer/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-charts","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Charts::TooltipLayer::Component","identifier":"poetry--charts--tooltip_layer"}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"top-nav","type":"registry:block","title":"Top nav","description":"A site navigation bar: brand mark, a products dropdown of rich title-and-description links, direct destinations, and the log-in / sign-up action pair.","files":[{"path":"lib/generators/poetry/block/templates/top_nav.html.erb","type":"registry:file","target":"app/views/blocks/_top_nav.html.erb"}],"registryDependencies":["button","icon","link","navigation-menu"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"copy-in","keywords":["navigation","navbar","topbar","site","marketing","links"]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"tree","type":"registry:component","title":"Tree","files":[{"path":"app/components/poetry/ui/tree/component.html.erb","type":"registry:file","target":"app/components/poetry/ui/tree/component.html.erb"},{"path":"app/components/poetry/ui/tree/component.rb","type":"registry:file","target":"app/components/poetry/ui/tree/component.rb"},{"path":"app/components/poetry/ui/tree/preview.rb","type":"registry:file","target":"app/components/poetry/ui/tree/preview.rb"},{"path":"app/components/poetry/ui/tree/style.rb","type":"registry:file","target":"app/components/poetry/ui/tree/style.rb"}],"registryDependencies":["icon"],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Tree::Component","identifier":"poetry--ui--tree","parts":[{"name":"tree","description":"The treegrid container (role=treegrid, the accessible name) - roving focus, expansion keys, and typeahead ride here; rows are FLAT siblings"},{"name":"tree-item","description":"One row (role=row > gridcell) - hierarchy in aria-level/posinset/setsize, indentation via --poetry-tree-level; rows under a collapsed ancestor render hidden","states":[{"attr":"data-expanded","condition":"the row's subtree is open (parents only; aria-expanded is the canonical twin)"},{"attr":"data-disabled","condition":"the item is disabled (skipped by arrows and typeahead)"},{"attr":"data-value","condition":"always - the toggle event's identity"},{"attr":"data-level","condition":"always - the 1-based depth (aria-level's twin; --poetry-tree-level drives the indent)"}],"vars":[{"name":"--poetry-tree-level","description":"the 1-based depth - indentation is calc((level - 1) * step) in the dictionary"}]},{"name":"tree-item-toggle","description":"The chevron (parents only): tabindex -1, never steals focus, aria-label flips Expand/Collapse","states":[{"attr":"data-expand-label","condition":"always - the localized Expand string the controller swaps in on collapse"},{"attr":"data-collapse-label","condition":"always - the localized Collapse string the controller swaps in on expand"}]},{"name":"tree-item-label","description":"The row's text - a link when href: is given"}]}},{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"typeset","type":"registry:component","title":"Typeset","files":[{"path":"app/components/poetry/ui/typeset/component.rb","type":"registry:file","target":"app/components/poetry/ui/typeset/component.rb"},{"path":"app/components/poetry/ui/typeset/preview.rb","type":"registry:file","target":"app/components/poetry/ui/typeset/preview.rb"},{"path":"app/components/poetry/ui/typeset/style.rb","type":"registry:file","target":"app/components/poetry/ui/typeset/style.rb"}],"registryDependencies":[],"meta":{"gem":"poetry-ui","gem_version":"0.0.3","provided":"runtime-gem","class_name":"Poetry::Ui::Typeset::Component","identifier":"poetry--ui--typeset","parts":[{"name":"typeset","description":"The prose container - every bare element inside is styled by the app-owned typeset.css; not-typeset (class or data attribute) opts a subtree out"}]}}]}