{"TotalCount":118,"Files":[{"Ident":"dogecoin.ssoundboard","Path":"ui/controls/color/colorhuecontrol.cs.scss","FileName":"colorhuecontrol.cs.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":341579,"Code":"ColorHueControl\r\n{\r\n\tgap: 0.5rem;\r\n\tflex-grow: 1;\r\n\tpointer-events: all;\r\n\tbackground: linear-gradient( to right, red, yellow, lime, cyan, blue, magenta, red );\r\n\tborder-radius: 4px;\r\n\tpadding: 2px;\r\n\theight: 12px;\r\n\tposition: relative;\r\n\tcursor: pointer;\r\n\tmargin: 10px 0;\r\n\tborder: 1px solid #333;\r\n\r\n\t\u0026:hover\r\n\t{\r\n\t\tborder: 1px solid #08f;\r\n\t}\r\n\r\n\t\u0026:active\r\n\t{\r\n\t\tborder: 1px solid #fff;\r\n\t}\r\n\r\n\t.handle\r\n\t{\r\n\t\ttop: -5px;\r\n\t\tbottom: -5px;\r\n\t\taspect-ratio: 1;\r\n\t\tborder-radius: 100px;\r\n\t\tborder: 2px solid #444;\r\n\t\tposition: absolute;\r\n\t\tbackground-color: white;\r\n\t\tbox-shadow: 2px 2px 16px #000a;\r\n\t\ttransform: translateX( -50% );\r\n\t\tpointer-events: none;\r\n\t}\r\n}\r\n"},{"Ident":"dogecoin.ssoundboard","Path":"styles/rootpanel.scss","FileName":"rootpanel.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":341579,"Code":"\r\n\r\nRootPanel\r\n{\r\n\tfont-family: Roboto;\r\n\tcolor: white;\r\n}\r\n\r\nIconPanel, i\r\n{\r\n\tfont-family: Material Icons;\r\n\tbackground-position: center;\r\n\tbackground-size: contain;\r\n}\r\n\r\n.tooltip\r\n{\r\n\tbackground-color: rgba( black, 0.8 );\r\n\tborder: 1px solid rgba( #555, 0.1 );\r\n\tpadding: 10px;\r\n\tborder-radius: 4px;\r\n\tcolor: white;\r\n\tfont-family: Inter;\r\n\tfont-weight: bold;\r\n\ttransition: opacity 0.09s ease;\r\n\topacity: 1;\r\n\tmargin: 0px;\r\n\r\n\t\u0026:intro, \u0026:outro\r\n\t{\r\n\t\topacity: 0;\r\n\t}\r\n}\r\n\r\n.textentry\r\n{\r\n\tcursor: text;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\twhite-space: nowrap;\r\n\toverflow: hidden;\r\n\tflex-direction: row;\r\n\tposition: relative;\r\n\tpadding: 10px;\r\n\r\n\t\u0026.disabled\r\n\t{\r\n\t\tcursor: default;\r\n\t}\r\n\r\n\t\u0026.is-multiline\r\n\t{\r\n\t\talign-items: flex-start;\r\n\t\twhite-space: normal;\r\n\t}\r\n\r\n\t.content-label,\r\n\t.placeholder\r\n\t{\r\n\t\tflex-grow: 1;\r\n\t}\r\n\r\n\t.placeholder\r\n\t{\r\n\t\topacity: 0.2;\r\n\t\tpointer-events: none;\r\n\t}\r\n\r\n\t.iconpanel\r\n\t{\r\n\t\tposition: absolute;\r\n\t\tright: 0;\r\n\t\tpadding-right: 10px;\r\n\t\tpointer-events: none;\r\n\r\n\t\t\u0026.clearbutton\r\n\t\t{\r\n\t\t\tcolor: #fff;\r\n\t\t\tpointer-events: all;\r\n\t\t\tcursor: pointer;\r\n\t\t\topacity: 0.1;\r\n\r\n\t\t\t\u0026:hover\r\n\t\t\t{\r\n\t\t\t\topacity: 0.5;\r\n\t\t\t}\r\n\r\n\t\t\t\u0026:active\r\n\t\t\t{\r\n\t\t\t\topacity: 1;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t\u0026:empty\r\n\t{\r\n\t\t.clearbutton\r\n\t\t{\r\n\t\t\tdisplay: none;\r\n\t\t}\r\n\t}\r\n\r\n\t\u0026.has-icon\r\n\t{\r\n\t\tpadding-right: 30px;\r\n\t}\r\n\r\n\t.content-label,\r\n\t.prefix-label,\r\n\t.suffix-label,\r\n\t.placeholder\r\n\t{\r\n\t\toverflow: hidden;\r\n\t}\r\n\r\n\t.content-label\r\n\t{\r\n\t\torder: 1;\r\n\t}\r\n\r\n\t.suffix-label\r\n\t{\r\n\t\torder: 2;\r\n\t}\r\n\r\n\t.prefix-label,\r\n\t.suffix-label\r\n\t{\r\n\t\tflex-shrink: 0;\r\n\t\topacity: 0.5;\r\n\t}\r\n\r\n\t\u0026.invalid\r\n\t{\r\n\t\tbox-shadow: 0px 0px 1px 2px #f8356b;\r\n\t}\r\n}\r\n\r\n.popup-panel\r\n{\r\n\tbackground-color: #1b202c;\r\n\tflex-direction: column;\r\n\tcolor: #8e9ec2;\r\n\ttransition: all 0.1s ease-out;\r\n\tposition: absolute;\r\n\tz-index: 2000;\r\n\tmin-height: 20px;\r\n\tmin-width: 10px;\r\n\toverflow: scroll;\r\n\tpointer-events: all;\r\n\tbox-shadow: 3px 3px 64px #000;\r\n\tborder-radius: 4px;\r\n\r\n\t\u0026.medium\r\n\t{\r\n\t\tmax-width: 300px;\r\n\t}\r\n\r\n\t\u0026.center-horizontal\r\n\t{\r\n\t\ttransform-origin: top center;\r\n\t}\r\n\r\n\t\u0026.below-center\r\n\t{\r\n\t\ttransform: translateX( -50% );\r\n\t\ttransform-origin: 0% 0%;\r\n\t}\r\n\r\n\t\u0026.above-left\r\n\t{\r\n\t\ttransform-origin: 0% 100%;\r\n\t}\r\n\r\n\t\u0026.above-center\r\n\t{\r\n\t\ttransform: translateX( -50% );\r\n\t\ttransform-origin: 0% 100%;\r\n\t}\r\n\r\n\t\u0026.left\r\n\t{\r\n\t\ttransform-origin: 100% 50%;\r\n\t\ttransform: translate( 00% -50% );\r\n\t}\r\n\r\n\t\u0026.right\r\n\t{\r\n\t\ttransform-origin: 0 50%;\r\n\t\ttransform: translate( 0% -50% );\r\n\t}\r\n\r\n\t\u0026:intro\r\n\t{\r\n\t\ttransform: scale( 0 );\r\n\t\tpointer-events: none;\r\n\t\topacity: 0;\r\n\t}\r\n\r\n\t\u0026:outro\r\n\t{\r\n\t\topacity: 0;\r\n\t\ttransition: all 0.1s ease-in;\r\n\t\tmargin-top: 50px;\r\n\t\tpointer-events: none;\r\n\t}\r\n\r\n\t\u0026.below-stretch\r\n\t{\r\n\t\ttransform-origin: 0% 0%;\r\n\r\n\t\t\u0026:intro\r\n\t\t{\r\n\t\t\ttransform: scaleY( 0.1 );\r\n\t\t}\r\n\t}\r\n\r\n\t\u003E .canvas\r\n\t{\r\n\t\tflex-direction: column;\r\n\t}\r\n\r\n\t.information\r\n\t{\r\n\t\tpadding: 16px;\r\n\t\tfont-size: 14px;\r\n\t\topacity: 0.5;\r\n\t}\r\n\r\n\tbutton\r\n\t{\r\n\t\tpadding: 2px 8px;\r\n\t\tcursor: pointer;\r\n\t\tfont-family: Poppins;\r\n\t\tfont-weight: 600;\r\n\t\tflex-shrink: 0;\r\n\r\n\t\t\u0026:hover\r\n\t\t{\r\n\t\t\tbackground-color: #08f;\r\n\t\t\tcolor: #fff;\r\n\t\t}\r\n\t}\r\n}\r\n"},{"Ident":"dogecoin.ssoundboard","Path":"ui/components/anchorpad/anchorpad.razor.scss","FileName":"anchorpad.razor.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":341579,"Code":"@import \u0022/ui/styles/_theme.scss\u0022;\n\n.anchor-pad {\n\twidth: 130px;\n\theight: 90px;\n\tbackground-color: $bg-2;\n\tborder: 1px solid $line-strong;\n\tpadding: 6px;\n\tposition: relative;\n\n\t.anchor-cell {\n\t\tpointer-events: all;\n\t\tbackground-color: rgba(255,255,255,0.04);\n\t\tborder: 1px solid $line-strong;\n\t\tcursor: pointer;\n\t\tposition: absolute;\n\t\twidth: 34px;\n\t\theight: 22px;\n\t\ttransition: background-color 0.1s ease, border-color 0.1s ease;\n\n\t\t\u0026:hover { background-color: rgba(255,255,255,0.1); border-color: $accent; }\n\n\t\t\u0026.active {\n\t\t\tbackground-color: $accent;\n\t\t\tborder-color: $accent;\n\t\t}\n\n\t\t\u0026.anchor-topleft     { left: 6px;  top: 6px; }\n\t\t\u0026.anchor-topright    { right: 6px; top: 6px; }\n\t\t\u0026.anchor-bottomleft  { left: 6px;  bottom: 6px; }\n\t\t\u0026.anchor-bottomright { right: 6px; bottom: 6px; }\n\t\t\u0026.anchor-center      { left: 50%; top: 50%; transform: translate(-50%, -50%); }\n\t}\n}\n"},{"Ident":"dogecoin.ssoundboard","Path":"ui/components/hintbox/hintbox.scss","FileName":"hintbox.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":341579,"Code":"@import \u0022/ui/styles/_theme.scss\u0022;\n\n.hint-box {\n\tpadding: 14px 16px;\n\tbackground-color: rgba(98, 200, 255, 0.07);\n\tborder-left: 3px solid $info;\n\tcolor: $text-dim;\n\tfont-size: $fs-3;\n\tfont-weight: 500;\n\tletter-spacing: 0.2px;\n\tcode { color: $info; font-family: $font-mono; font-weight: 700; }\n}\n"},{"Ident":"dogecoin.ssoundboard","Path":"ui/components/tile/tile.scss","FileName":"tile.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":341579,"Code":"@import \u0022/ui/styles/_theme.scss\u0022;\n\n.tile {\n\tflex-direction: column;\n\twidth: 140px;\n\tpadding: 0;\n\tbackground-color: $bg-2;\n\tborder: 1px solid $line-strong;\n\toverflow: hidden;\n\tcursor: pointer;\n\ttransition: border-color 0.1s ease;\n\n\t.tile-swatch {\n\t\twidth: 100%;\n\t\theight: 80px;\n\t\tposition: relative;\n\t\toverflow: hidden;\n\t\tbackground-color: #1a1f2e;\n\t\tbackground-size: cover;\n\t\tbackground-position: center;\n\t}\n\n\t.tile-thumb {\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tobject-fit: contain;\n\t}\n\n\t.tile-placeholder {\n\t\twidth: 100%;\n\t\theight: 100%;\n\t}\n\n\t.tile-vignette {\n\t\tposition: absolute;\n\t\tleft: 0; top: 0; right: 0; bottom: 0;\n\t\tbackground-color: rgba(0,0,0,0.25);\n\t\tpointer-events: none;\n\t}\n\n\t.tile-label {\n\t\theight: 42px;\n\t\tpadding: 8px 10px;\n\t\tflex-shrink: 0;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tfont-size: $fs-1;\n\t\tfont-weight: 700;\n\t\tcolor: $text-dim;\n\t\ttext-align: center;\n\t\tfont-family: $font-mono;\n\t\tletter-spacing: 1px;\n\t\ttext-transform: uppercase;\n\t\tborder-top: 1px solid $line;\n\t}\n\n\t\u0026:hover {\n\t\tborder-color: $accent;\n\t\t.tile-label { color: $text; }\n\t}\n\t\u0026.active {\n\t\tborder-color: $accent;\n\t\t.tile-label { color: $text; background-color: $accent-soft; font-weight: 800; }\n\t}\n}\n"},{"Ident":"dogecoin.ssoundboard","Path":"ui/components/vector3field/vector3field.razor.scss","FileName":"vector3field.razor.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":341579,"Code":"@import \u0022/ui/styles/_theme.scss\u0022;\n@import \u0022/ui/components/field/field.scss\u0022;\n\n.v3-field {\n\t.v3-row {\n\t\tflex-direction: row;\n\t\tgap: 6px;\n\t\talign-items: stretch;\n\t\twidth: 100%;\n\t}\n}\n"},{"Ident":"dogecoin.ssoundboard","Path":"ui/components/packageflairbar.razor.scss","FileName":"packageflairbar.razor.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":341579,"Code":"PackageFlairBar\r\n{\r\n\tposition: absolute;\r\n\ttop: 6px;\r\n\tleft: 6px;\r\n\tz-index: 2;\r\n\tflex-direction: row;\r\n\tgap: 5px;\r\n\tpointer-events: none;\r\n\r\n\t.flair\r\n\t{\r\n\t\tposition: relative;\r\n\t\talign-items: center;\r\n\t\tjustify-content: center;\r\n\t\twidth: 22px;\r\n\t\theight: 22px;\r\n\t\tpointer-events: all;\r\n\t\tborder-radius: 4px;\r\n\t\tcolor: white;\r\n\t\tborder: 1px solid rgba( white, 0.1 );\r\n\t\toutline: 1px solid #0006;\r\n\t\topacity: 0.7;\r\n\r\n\t\t\u0026:hover\r\n\t\t{\r\n\t\t\topacity: 1;\r\n\t\t}\r\n\r\n\t\ticon\r\n\t\t{\r\n\t\t\tfont-size: 15px;\r\n\t\t}\r\n\t}\r\n}\r\n"},{"Ident":"dogecoin.ssoundboard","Path":"soundboardpanel.razor.scss","FileName":"soundboardpanel.razor.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":341579,"Code":"@import \u0022/UI/Styles/_Theme.scss\u0022;\n@import \u0022/UI/Styles/_Fonts.scss\u0022;\n@import \u0022/UI/Components/Tile/Tile.scss\u0022;\n@import \u0022/UI/Components/Button/Button.scss\u0022;\n\nSoundBoardPanel\n{\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tpointer-events: all;\n\toverflow: hidden;\n\n\t.sb\n\t{\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tflex-direction: column;\n\t\tbackground-color: $bg-0;\n\t\toverflow: hidden;\n\t}\n\n\t.sb-shell\n\t{\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tflex-direction: column;\n\t\tflex-grow: 1;\n\t\tflex-shrink: 1;\n\t\tmin-height: 0;\n\t\tpadding: 20px 24px 18px;\n\t\toverflow: hidden;\n\t}\n\n\t.sb-topbar\n\t{\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t\tgap: 16px;\n\t\theight: 64px;\n\t\tmin-height: 64px;\n\t\tmax-height: 64px;\n\t\tmargin-bottom: 14px;\n\t\tpadding-bottom: 14px;\n\t\tborder-bottom: 1px solid $line;\n\t\tflex-shrink: 0;\n\t\tflex-wrap: nowrap;\n\t\toverflow: hidden;\n\t}\n\n\t.sb-brand-block\n\t{\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 12px;\n\t\tmin-width: 0;\n\t\tflex-grow: 1;\n\t}\n\n\t.sb-status-led\n\t{\n\t\twidth: 10px;\n\t\theight: 10px;\n\t\tborder-radius: 50%;\n\t\tbackground-color: $bg-2;\n\t\tborder: 1px solid $line;\n\t\tflex-shrink: 0;\n\n\t\t\u0026.is-live\n\t\t{\n\t\t\tbackground-color: $success;\n\t\t\tborder-color: $success-line;\n\t\t}\n\t}\n\n\t.sb-brand-copy\n\t{\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 2px;\n\t\tmin-width: 0;\n\t}\n\n\t.sb-eyebrow\n\t{\n\t\tfont-size: $fs-1;\n\t\tfont-weight: 700;\n\t\tletter-spacing: $ls-xwide;\n\t\tcolor: $text-faint;\n\t\tfont-family: $font-mono;\n\t}\n\n\t.sb-title\n\t{\n\t\tfont-size: $fs-5;\n\t\tfont-weight: 800;\n\t\tcolor: $text;\n\t\tfont-family: $font-primary;\n\t\twhite-space: nowrap;\n\t\toverflow: hidden;\n\t}\n\n\t.sb-voice-chip\n\t{\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tjustify-content: center;\n\t\tgap: 6px;\n\t\twidth: 128px;\n\t\theight: 52px;\n\t\tmin-width: 128px;\n\t\tmax-width: 128px;\n\t\tpadding: 8px 12px;\n\t\tborder-radius: 4px;\n\t\tbackground-color: $bg-2;\n\t\tborder: 1px solid $line-strong;\n\t\tflex-shrink: 0;\n\t\toverflow: hidden;\n\t}\n\n\t.sb-voice-chip-head\n\t{\n\t\tdisplay: flex;\n\t\talign-items: baseline;\n\t\tjustify-content: space-between;\n\t\tgap: 8px;\n\t}\n\n\t.sb-voice-chip-label\n\t{\n\t\tfont-size: $fs-1;\n\t\tfont-weight: 700;\n\t\tletter-spacing: $ls-wide;\n\t\tcolor: $text-faint;\n\t\tfont-family: $font-mono;\n\t}\n\n\t.sb-voice-chip-value\n\t{\n\t\tfont-size: $fs-4;\n\t\tfont-weight: 800;\n\t\tline-height: 1;\n\t\tcolor: $accent;\n\t\tfont-family: $font-mono;\n\t}\n\n\t.sb-voice-meter-stack\n\t{\n\t\twidth: 100%;\n\t\theight: 18px;\n\t\tmin-height: 18px;\n\t\tmax-height: 18px;\n\t\tflex-direction: column;\n\t\tjustify-content: flex-end;\n\t\tgap: 2px;\n\t\toverflow: hidden;\n\t}\n\n\t.sb-voice-meter-tier\n\t{\n\t\twidth: 100%;\n\t\theight: 3px;\n\t\tmin-height: 3px;\n\t\tmax-height: 3px;\n\t\tborder-radius: 999px;\n\t\tbackground-color: $bg-inset;\n\t\toverflow: hidden;\n\t}\n\n\t.sb-voice-meter-fill\n\t{\n\t\theight: 100%;\n\t\tborder-radius: 999px;\n\t\ttransition: width 0.16s ease;\n\t}\n\n\t.sb-tabs-bar\n\t{\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\tflex-shrink: 0;\n\t\talign-items: center;\n\t\tgap: 8px;\n\t\twidth: 100%;\n\t\theight: 48px;\n\t\tmargin-bottom: 10px;\n\t\tpointer-events: all;\n\t}\n\n\t.sb-search-bar\n\t{\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\tflex-shrink: 0;\n\t\talign-items: center;\n\t\tgap: 10px;\n\t\twidth: 100%;\n\t\theight: 40px;\n\t\tmargin-bottom: 12px;\n\t\tpadding: 0 12px;\n\t\tborder-radius: 8px;\n\t\tbackground-color: $bg-2;\n\t\tborder: 1px solid $line-strong;\n\t\tpointer-events: all;\n\t}\n\n\t.sb-search-icon\n\t{\n\t\tflex-shrink: 0;\n\t\tfont-size: 16px;\n\t\tfont-weight: 700;\n\t\tcolor: $text-faint;\n\t\tline-height: 1;\n\t}\n\n\t.sb-search-input\n\t{\n\t\tflex-grow: 1;\n\t\tflex-shrink: 1;\n\t\tmin-width: 0;\n\t\theight: 36px;\n\t\tmin-height: 36px;\n\t\tpadding: 0 4px;\n\t\tbackground-color: transparent;\n\t\tborder: 0;\n\t\tcolor: $text;\n\t\tfont-size: $fs-2;\n\t\tfont-weight: 600;\n\t\tfont-family: $font-mono;\n\t\tletter-spacing: 0.04em;\n\t}\n\n\t.sb-search-clear\n\t{\n\t\tdisplay: flex;\n\t\tflex-shrink: 0;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 28px;\n\t\theight: 28px;\n\t\tborder-radius: 6px;\n\t\tbackground-color: $bg-inset;\n\t\tborder: 1px solid $line;\n\t\tcolor: $text-dim;\n\t\tfont-size: 12px;\n\t\tfont-weight: 800;\n\t\tcursor: pointer;\n\t\tpointer-events: all;\n\n\t\t\u0026:hover\n\t\t{\n\t\t\tborder-color: $accent;\n\t\t\tcolor: $accent;\n\t\t}\n\n\t\t\u0026:active\n\t\t{\n\t\t\tsound-in: \u0022ui.button.press\u0022;\n\t\t\ttransform: scale(0.96);\n\t\t}\n\t}\n\n\t.sb-search-count\n\t{\n\t\tflex-shrink: 0;\n\t\tmin-width: 36px;\n\t\ttext-align: right;\n\t\tfont-size: $fs-1;\n\t\tfont-weight: 700;\n\t\tletter-spacing: $ls-wide;\n\t\tcolor: $text-faint;\n\t\tfont-family: $font-mono;\n\t\twhite-space: nowrap;\n\t}\n\n\t.sb-empty\n\t{\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tgap: 8px;\n\t\twidth: 100%;\n\t\tmin-height: 180px;\n\t\tpadding: 32px 16px;\n\t\tpointer-events: none;\n\t}\n\n\t.sb-empty-title\n\t{\n\t\tfont-size: $fs-4;\n\t\tfont-weight: 800;\n\t\tcolor: $text-dim;\n\t\tfont-family: $font-mono;\n\t\tletter-spacing: 0.08em;\n\t}\n\n\t.sb-empty-body\n\t{\n\t\tfont-size: $fs-2;\n\t\tfont-weight: 500;\n\t\tcolor: $text-faint;\n\t\tfont-family: $font-mono;\n\t\ttext-align: center;\n\t}\n\n\t.sb-tabs-arrow\n\t{\n\t\tdisplay: flex;\n\t\tflex-shrink: 0;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 36px;\n\t\theight: 40px;\n\t\tborder-radius: 8px;\n\t\tbackground-color: $bg-2;\n\t\tborder: 1px solid $line-strong;\n\t\tcolor: $text;\n\t\tfont-size: 22px;\n\t\tfont-weight: 800;\n\t\tcursor: pointer;\n\t\tpointer-events: all;\n\t\tz-index: 2;\n\n\t\t\u0026:hover\n\t\t{\n\t\t\tborder-color: $accent;\n\t\t\tcolor: $accent;\n\t\t}\n\n\t\t\u0026:active\n\t\t{\n\t\t\tsound-in: \u0022ui.button.press\u0022;\n\t\t\ttransform: scale(0.96);\n\t\t}\n\n\t\t\u0026.is-disabled\n\t\t{\n\t\t\topacity: 0.35;\n\t\t\tcursor: default;\n\t\t\tpointer-events: none;\n\t\t}\n\t}\n\n\t.sb-tabs-scroll\n\t{\n\t\tflex-grow: 1;\n\t\tflex-shrink: 1;\n\t\tmin-width: 0;\n\t\theight: 100%;\n\t\t// Clip the track; scrolling is done via margin-left on .sb-tabs-track\n\t\t// because Panel.ScrollSize often stays 0 for horizontal flex content.\n\t\toverflow: hidden;\n\t\tpointer-events: all;\n\t}\n\n\t.sb-tabs-track\n\t{\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\tflex-wrap: nowrap;\n\t\talign-items: center;\n\t\tgap: 6px;\n\t\t// Must grow with chips so content width \u003E viewport (enables overflow).\n\t\twidth: auto;\n\t\tflex-shrink: 0;\n\t\theight: 100%;\n\t\tpadding: 2px 2px 4px;\n\t\t// margin-left is driven from code for arrow / wheel scrolling.\n\t}\n\n\t.sb-tab-chip\n\t{\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\tflex-shrink: 0;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tgap: 6px;\n\t\theight: 36px;\n\t\tpadding: 0 14px;\n\t\tborder-radius: 6px;\n\t\tbackground-color: $bg-2;\n\t\tborder: 1px solid $line-strong;\n\t\tcursor: pointer;\n\t\tpointer-events: all;\n\t\twhite-space: nowrap;\n\n\t\t\u0026:hover\n\t\t{\n\t\t\tborder-color: $accent;\n\t\t}\n\n\t\t\u0026.is-active\n\t\t{\n\t\t\tbackground-color: $accent;\n\t\t\tborder-color: $accent;\n\t\t\tcolor: $accent-ink;\n\n\t\t\t.sb-tab-chip-label\n\t\t\t{\n\t\t\t\tcolor: $accent-ink;\n\t\t\t}\n\t\t}\n\n\t\t\u0026.is-search\n\t\t{\n\t\t\tbackground-color: #2a6df4;\n\t\t\tborder-color: #5b8dff;\n\t\t\tcolor: #fff;\n\n\t\t\t.sb-tab-chip-label\n\t\t\t{\n\t\t\t\tcolor: #fff;\n\t\t\t}\n\t\t}\n\n\t\t\u0026:active\n\t\t{\n\t\t\tsound-in: \u0022ui.button.press\u0022;\n\t\t\ttransform: scale(0.97);\n\t\t}\n\t}\n\n\t.sb-tab-chip-icon\n\t{\n\t\tfont-size: 13px;\n\t\tflex-shrink: 0;\n\t}\n\n\t.sb-tab-chip-label\n\t{\n\t\tfont-size: $fs-2;\n\t\tfont-weight: 700;\n\t\tfont-family: $font-mono;\n\t\tletter-spacing: 1.2px;\n\t\tcolor: $text-dim;\n\t\twhite-space: nowrap;\n\t\tflex-shrink: 0;\n\t}\n\n\t.sb-board\n\t{\n\t\tflex-grow: 1;\n\t\tflex-shrink: 1;\n\t\tmin-height: 0;\n\t\tmargin-bottom: 14px;\n\t\tborder: 1px solid $line;\n\t\tbackground-color: $bg-1;\n\t\tflex-direction: column;\n\t\toverflow: hidden;\n\t\tpointer-events: all;\n\t}\n\n\t.sb-board-scroll\n\t{\n\t\tflex-grow: 1;\n\t\tflex-shrink: 1;\n\t\tmin-height: 0;\n\t\tflex-direction: column;\n\t\toverflow-y: scroll;\n\t\toverflow-x: hidden;\n\t\tpointer-events: all;\n\t}\n\n\t.sb-pad-content\n\t{\n\t\tflex-direction: column;\n\t\tflex-shrink: 0;\n\t\twidth: 100%;\n\t\tpointer-events: all;\n\t}\n\n\t.tile-grid\n\t{\n\t\tflex-direction: row;\n\t\tflex-wrap: wrap;\n\t\talign-content: flex-start;\n\t\twidth: 100%;\n\t\tflex-shrink: 0;\n\t\tgap: 12px;\n\t\tpadding: 8px;\n\t\tpointer-events: all;\n\n\t\t.tile\n\t\t{\n\t\t\tpointer-events: all;\n\t\t\tflex-shrink: 0;\n\t\t}\n\t}\n\n\t.sb-pad-grid\n\t{\n\t\tpadding: 4px 4px 24px;\n\t}\n\n\t.tile\n\t{\n\t\twidth: 112px;\n\n\t\t\u0026.is-loading\n\t\t{\n\t\t\tborder-color: $line-strong;\n\n\t\t\t.tile-swatch\n\t\t\t{\n\t\t\t\topacity: 0.55;\n\t\t\t}\n\n\t\t\t.tile-label\n\t\t\t{\n\t\t\t\tcolor: $text-dim;\n\t\t\t}\n\t\t}\n\n\t\t// Lobby co-op: pad lit by someone in the lobby (avatar \u002B username).\n\t\t\u0026.is-remote\n\t\t{\n\t\t\tborder-color: #5b8dff;\n\n\t\t\t.tile-label\n\t\t\t{\n\t\t\t\tcolor: #e8f0ff;\n\t\t\t\tbackground-color: rgba(42, 109, 244, 0.45);\n\t\t\t\tfont-weight: 800;\n\t\t\t}\n\t\t}\n\t}\n\n\t.tile-swatch\n\t{\n\t\theight: 64px;\n\t\tposition: relative;\n\t}\n\n\t.tile-remote-avatar\n\t{\n\t\tposition: absolute;\n\t\ttop: 4px;\n\t\tright: 4px;\n\t\twidth: 28px;\n\t\theight: 28px;\n\t\tborder-radius: 50%;\n\t\tbackground-size: cover;\n\t\tbackground-position: center;\n\t\tbackground-color: #0b1220;\n\t\tborder: 2px solid #ffffff;\n\t\tz-index: 3;\n\t\tpointer-events: none;\n\t}\n\n\t.tile-remote-name\n\t{\n\t\tposition: absolute;\n\t\tleft: 3px;\n\t\tright: 3px;\n\t\tbottom: 3px;\n\t\tpadding: 2px 4px;\n\t\tborder-radius: 4px;\n\t\tbackground-color: rgba(0, 0, 0, 0.72);\n\t\tcolor: #ffffff;\n\t\tfont-size: 9px;\n\t\tfont-weight: 800;\n\t\tfont-family: $font-mono;\n\t\tletter-spacing: 0.04em;\n\t\ttext-align: center;\n\t\ttext-transform: none;\n\t\twhite-space: nowrap;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\tz-index: 3;\n\t\tpointer-events: none;\n\t}\n\n\t.sb-controls\n\t{\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\talign-items: center;\n\t\tgap: 12px;\n\t\tflex-shrink: 0;\n\t\tmin-height: 56px;\n\t}\n\n\t// LOOP \u002B CO-OP share one baseline.\n\t.sb-toggle-row\n\t{\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\talign-items: center;\n\t\tflex-shrink: 0;\n\t\tgap: 10px;\n\t}\n\n\t.sb-toggle\n\t{\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tflex-shrink: 0;\n\t\twidth: 100px;\n\t\theight: 44px;\n\t\tmin-width: 100px;\n\t\tmin-height: 44px;\n\t\tmax-height: 44px;\n\t\tpadding: 0 12px;\n\t\tborder-radius: 10px;\n\t\tfont-size: 13px;\n\t\tfont-weight: 900;\n\t\tletter-spacing: 0.16em;\n\t\tcolor: #ffffff;\n\t\tcursor: pointer;\n\t\tpointer-events: all;\n\t\t// s\u0026box UI: use border shorthand only (border-style is invalid).\n\t\tborder: 3px solid #2a0000;\n\t\tbackground-color: #c10f0f;\n\t\tbox-shadow: 0 3px 0 #3a0000, inset 0 1px 4px rgba(255, 255, 255, 0.2);\n\t\ttext-shadow: 0 1px 0 rgba(0, 0, 0, 0.35);\n\n\t\t\u0026.is-on\n\t\t{\n\t\t\tborder: 3px solid #0a3d14;\n\t\t\tbackground-color: #1fbf3a;\n\t\t\tbox-shadow: 0 3px 0 #0f5a1c, 0 0 14px rgba(57, 255, 80, 0.35), inset 0 1px 4px rgba(255, 255, 255, 0.25);\n\t\t}\n\n\t\t\u0026.is-off\n\t\t{\n\t\t\tborder: 3px solid #2a0000;\n\t\t\tbackground-color: #c10f0f;\n\t\t\tbox-shadow: 0 3px 0 #3a0000, inset 0 1px 4px rgba(255, 255, 255, 0.2);\n\t\t}\n\n\t\t// CO-OP on uses same green as LOOP (is-on); is-coop is optional marker.\n\t\t\u0026.is-on.is-coop\n\t\t{\n\t\t\tborder: 3px solid #0a3d14;\n\t\t\tbackground-color: #1fbf3a;\n\t\t\tbox-shadow: 0 3px 0 #0f5a1c, 0 0 14px rgba(57, 255, 80, 0.35), inset 0 1px 4px rgba(255, 255, 255, 0.25);\n\t\t}\n\n\t\t\u0026:active\n\t\t{\n\t\t\tsound-in: \u0022ui.button.press\u0022;\n\t\t\ttransform: translateY(2px);\n\t\t}\n\t}\n\n\t.sb-now-playing\n\t{\n\t\tflex-grow: 1;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 10px;\n\t\tmin-width: 0;\n\t\tpadding: 10px 14px;\n\t\tbackground-color: $bg-2;\n\t\tborder: 1px solid $line;\n\t}\n\n\t.sb-now-playing-dot\n\t{\n\t\twidth: 8px;\n\t\theight: 8px;\n\t\tborder-radius: 50%;\n\t\tbackground-color: $line-strong;\n\t\tflex-shrink: 0;\n\n\t\t\u0026.is-live\n\t\t{\n\t\t\tbackground-color: $accent;\n\t\t}\n\t}\n\n\t.sb-now-playing-text\n\t{\n\t\tfont-size: $fs-2;\n\t\tfont-weight: 600;\n\t\tcolor: $text-dim;\n\t\tfont-family: $font-mono;\n\t\twhite-space: nowrap;\n\t\toverflow: hidden;\n\t}\n\n\t.sb-kill-btn\n\t{\n\t\tmin-width: 148px;\n\t\tflex-shrink: 0;\n\t}\n\n\t\u0026.is-wide\n\t{\n\t\t.tile\n\t\t{\n\t\t\twidth: 120px;\n\t\t}\n\t}\n\n\t\u0026.is-medium\n\t{\n\t\t.sb-shell\n\t\t{\n\t\t\tpadding: 18px 20px 16px;\n\t\t}\n\n\t\t.sb-title\n\t\t{\n\t\t\tfont-size: $fs-4;\n\t\t}\n\n\t\t.tile\n\t\t{\n\t\t\twidth: 104px;\n\t\t}\n\t}\n\n\t\u0026.is-compact\n\t{\n\t\t.sb-shell\n\t\t{\n\t\t\tpadding: 14px 14px 12px;\n\t\t}\n\n\t\t.sb-voice-chip\n\t\t{\n\t\t\twidth: 116px;\n\t\t\tmin-width: 116px;\n\t\t\tmax-width: 116px;\n\t\t}\n\n\t\t.tile\n\t\t{\n\t\t\twidth: 96px;\n\t\t}\n\n\t\t.tile-swatch\n\t\t{\n\t\t\theight: 56px;\n\t\t}\n\t}\n\n\t\u0026.is-tight\n\t{\n\t\t.sb-shell\n\t\t{\n\t\t\tpadding: 12px 10px 10px;\n\t\t}\n\n\t\t.sb-search-bar\n\t\t{\n\t\t\theight: 36px;\n\t\t\tpadding: 0 10px;\n\t\t}\n\n\t\t.sb-search-count\n\t\t{\n\t\t\tmin-width: 28px;\n\t\t\tfont-size: 10px;\n\t\t}\n\n\t\t.sb-topbar\n\t\t{\n\t\t\theight: 58px;\n\t\t\tmin-height: 58px;\n\t\t\tmax-height: 58px;\n\t\t}\n\n\t\t.sb-voice-chip\n\t\t{\n\t\t\twidth: 108px;\n\t\t\tmin-width: 108px;\n\t\t\tmax-width: 108px;\n\t\t\theight: 48px;\n\t\t\tmin-height: 48px;\n\t\t\tmax-height: 48px;\n\t\t}\n\n\t\t.sb-voice-chip-value\n\t\t{\n\t\t\tfont-size: $fs-3;\n\t\t}\n\n\t\t.sb-title\n\t\t{\n\t\t\tfont-size: $fs-3;\n\t\t}\n\n\t\t.sb-tabs-bar\n\t\t{\n\t\t\theight: 44px;\n\t\t}\n\n\t\t.sb-tab-chip\n\t\t{\n\t\t\theight: 32px;\n\t\t\tpadding: 0 10px;\n\t\t}\n\n\t\t.sb-tab-chip-label\n\t\t{\n\t\t\tfont-size: 11px;\n\t\t}\n\n\t\t.tile\n\t\t{\n\t\t\twidth: 88px;\n\t\t}\n\n\t\t.tile-swatch\n\t\t{\n\t\t\theight: 50px;\n\t\t}\n\n\t\t.sb-controls\n\t\t{\n\t\t\tflex-wrap: wrap;\n\t\t}\n\n\t\t.sb-now-playing\n\t\t{\n\t\t\twidth: 100%;\n\t\t\torder: 3;\n\t\t}\n\n\t\t.sb-kill-btn\n\t\t{\n\t\t\twidth: 100%;\n\t\t\torder: 2;\n\t\t}\n\t}\n\n\t\u0026.has-voices\n\t{\n\t\t.sb-topbar\n\t\t{\n\t\t\tborder-bottom-color: $accent-line;\n\t\t}\n\t}\n\n\t.sb-ach\n\t{\n\t\tposition: absolute;\n\t\tleft: 24px;\n\t\tbottom: 28px;\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\talign-items: center;\n\t\tgap: 14px;\n\t\tmax-width: 420px;\n\t\tpadding: 14px 18px;\n\t\tborder-radius: 12px;\n\t\tbackground-color: rgba(12, 8, 20, 0.94);\n\t\tborder: 2px solid rgba(255, 210, 80, 0.75);\n\t\tbox-shadow: 0 12px 36px rgba(0, 0, 0, 0.55), 0 0 24px rgba(255, 180, 40, 0.22);\n\t\tpointer-events: none;\n\t\tz-index: 50;\n\t}\n\n\t.sb-ach-icon\n\t{\n\t\tfont-size: 28px;\n\t\tflex-shrink: 0;\n\t}\n\n\t.sb-ach-copy\n\t{\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 3px;\n\t\tmin-width: 0;\n\t}\n\n\t.sb-ach-kicker\n\t{\n\t\tfont-size: 9px;\n\t\tfont-weight: 800;\n\t\tletter-spacing: 0.2em;\n\t\tcolor: #ffd24a;\n\t}\n\n\t.sb-ach-title\n\t{\n\t\tfont-size: 15px;\n\t\tfont-weight: 900;\n\t\tletter-spacing: 0.04em;\n\t\tcolor: #fff;\n\t}\n\n\t.sb-ach-body\n\t{\n\t\tfont-size: 11px;\n\t\tfont-weight: 500;\n\t\tletter-spacing: 0.02em;\n\t\tcolor: rgba(255, 255, 255, 0.72);\n\t\twhite-space: normal;\n\t}\n}\n"},{"Ident":"dogecoin.ssoundboard","Path":"UI/Components/Modal/ModalPanel.razor","FileName":"ModalPanel.razor","PackageType":"game","CodeKind":"Game","AssetVersionId":341579,"Code":"@namespace Sunless.Libraries.UI\n@using Sandbox\n@using Sandbox.UI\n@attribute [StyleSheet]\n@inherits Panel\n\n\u003Croot class=\u0022modal-overlay @(IsOpen ? \u0022is-open\u0022 : \u0022\u0022) @ExtraClass\u0022\u003E\n\t@if ( IsOpen )\n\t{\n\t\t\u003Cdiv class=\u0022modal-scrim\u0022 @onclick=@HandleScrimClick\u003E\u003C/div\u003E\n\t\t\u003Cdiv class=\u0022modal-dialog\u0022 style=@DialogStyle\u003E\n\t\t\t@if ( Header is not null || !string.IsNullOrEmpty( Title ) || ShowClose )\n\t\t\t{\n\t\t\t\t\u003Cdiv class=\u0022modal-header\u0022\u003E\n\t\t\t\t\t@if ( Header is not null )\n\t\t\t\t\t{\n\t\t\t\t\t\t@Header\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t\u003Cdiv class=\u0022modal-title\u0022\u003E@Title\u003C/div\u003E\n\t\t\t\t\t}\n\t\t\t\t\t@if ( ShowClose )\n\t\t\t\t\t{\n\t\t\t\t\t\t\u003Cdiv class=\u0022modal-close\u0022 @onclick=@HandleClose\u003EX\u003C/div\u003E\n\t\t\t\t\t}\n\t\t\t\t\u003C/div\u003E\n\t\t\t}\n\n\t\t\t@if ( Body is not null )\n\t\t\t{\n\t\t\t\t\u003Cdiv class=\u0022modal-body\u0022\u003E@Body\u003C/div\u003E\n\t\t\t}\n\n\t\t\t@if ( Footer is not null )\n\t\t\t{\n\t\t\t\t\u003Cdiv class=\u0022modal-footer\u0022\u003E@Footer\u003C/div\u003E\n\t\t\t}\n\t\t\u003C/div\u003E\n\t}\n\u003C/root\u003E\n\n@code\n{\n\tpublic bool IsOpen { get; set; }\n\tpublic string Title { get; set; }\n\tpublic bool ShowClose { get; set; } = true;\n\tpublic bool DismissOnScrim { get; set; } = true;\n\tpublic string ExtraClass { get; set; }\n\tpublic string DialogStyle { get; set; }\n\tpublic Action OnClose { get; set; }\n\n\tpublic RenderFragment Header { get; set; }\n\tpublic RenderFragment Body { get; set; }\n\tpublic RenderFragment Footer { get; set; }\n\n\tvoid HandleClose()\n\t{\n\t\ttry { OnClose?.Invoke(); } catch ( Exception e ) { Log.Warning( $\u0022[Modal] OnClose threw: {e.Message}\u0022 ); }\n\t}\n\n\tvoid HandleScrimClick()\n\t{\n\t\tif ( !DismissOnScrim ) return;\n\t\tHandleClose();\n\t}\n\n\tprotected override int BuildHash() =\u003E HashCode.Combine( IsOpen, Title, ShowClose, ExtraClass, DialogStyle );\n}\n"},{"Ident":"dogecoin.ssoundboard","Path":"UI/Components/Toast/Toast.cs","FileName":"Toast.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":341579,"Code":"namespace Sunless.Libraries.UI;\n\nusing System;\nusing Sandbox;\n\n// Singleton toast state. Host \u003CToastHost /\u003E once. Call:\n//\n//   Toaster.Show( \u0022#toast.saved\u0022 );\n//   Toaster.New().WithIcon( \u0022save\u0022 ).WithCopy( path ).Show( \u0022#toast.saved\u0022, path );\n//\npublic static class Toaster\n{\n\tpublic static string Title { get; private set; }\n\tpublic static string Message { get; private set; }\n\tpublic static string Icon { get; private set; }\n\tpublic static bool ShowCopy { get; private set; }\n\tpublic static string CopyValue { get; private set; }\n\tpublic static ToastTone Tone { get; private set; }\n\tpublic static bool IsOpen =\u003E !string.IsNullOrEmpty( Message );\n\tpublic static int Version { get; private set; }\n\n\tpublic static Action OnShowSound { get; set; }\n\tpublic static Action OnCopySound { get; set; }\n\n\tpublic static ToastBuilder New() =\u003E new();\n\n\tpublic static void Show( string message, string title = null )\n\t\t=\u003E New().Show( message, title );\n\n\tpublic static void Dismiss()\n\t{\n\t\tif ( !IsOpen ) return;\n\t\tMessage = null;\n\t\tTitle = null;\n\t\tIcon = null;\n\t\tCopyValue = null;\n\t\tShowCopy = false;\n\t\tTone = ToastTone.Default;\n\t\tVersion\u002B\u002B;\n\t}\n\n\tinternal static void RaiseCopySound()\n\t{\n\t\ttry { OnCopySound?.Invoke(); } catch ( Exception e ) { Log.Warning( $\u0022[Toaster] copy sound threw: {e.Message}\u0022 ); }\n\t}\n\n\tinternal static void Commit( ToastBuilder b )\n\t{\n\t\tMessage = b._message;\n\t\tTitle = b._title;\n\t\tIcon = b._icon;\n\t\tShowCopy = b._showCopy;\n\t\tCopyValue = b._copyValue;\n\t\tTone = b._tone;\n\t\tVersion\u002B\u002B;\n\t\ttry { (b._onShowSound ?? OnShowSound)?.Invoke(); } catch ( Exception e ) { Log.Warning( $\u0022[Toaster] show sound threw: {e.Message}\u0022 ); }\n\t}\n}\n\npublic enum ToastTone { Default, Ok, Warn, Danger, Info }\n\npublic sealed class ToastBuilder\n{\n\tinternal string _title;\n\tinternal string _message;\n\tinternal string _icon;\n\tinternal bool _showCopy;\n\tinternal string _copyValue;\n\tinternal ToastTone _tone = ToastTone.Default;\n\tinternal Action _onShowSound;\n\n\tpublic ToastBuilder WithTitle( string title ) { _title = title; return this; }\n\tpublic ToastBuilder WithIcon( string ligature ) { _icon = ligature; return this; }\n\tpublic ToastBuilder WithCopy( string value = null ) { _showCopy = true; _copyValue = value; return this; }\n\tpublic ToastBuilder WithTone( ToastTone tone ) { _tone = tone; return this; }\n\tpublic ToastBuilder WithSound( Action sound ) { _onShowSound = sound; return this; }\n\n\tpublic void Show( string message, string title = null )\n\t{\n\t\t_message = message;\n\t\tif ( title is not null ) _title = title;\n\t\tToaster.Commit( this );\n\t}\n}\n"},{"Ident":"dogecoin.ssoundboard","Path":"styles/base.scss","FileName":"base.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":341579,"Code":"@import \u0022base/_splitcontainer.scss\u0022;\r\n@import \u0022base/_navigator.scss\u0022;\r\n\r\nbutton\r\n{\r\n\tcursor: pointer;\r\n}\r\n\r\nIconPanel\r\n{\r\n\tfont-family: Material Icons;\r\n}\r\n\r\n.is-half\r\n{\r\n\twidth: 50%;\r\n}\r\n\r\n.is-third\r\n{\r\n\twidth: 33%;\r\n}\r\n\r\n.is-quarter\r\n{\r\n\twidth: 25%;\r\n}\r\n\r\nbutton.has-subtitle\r\n{\r\n\tposition: relative;\r\n\tflex-direction: column;\r\n\tjustify-content: flex-start;\r\n\talign-items: flex-start;\r\n\tpadding-left: 40px; // icon space\r\n\r\n\t.iconpanel\r\n\t{\r\n\t\tposition: absolute;\r\n\t\tleft: 5px;\r\n\t\ttop: 0;\r\n\t\tbottom: 0;\r\n\t\talign-items: center;\r\n\t}\r\n\r\n\t.button-label\r\n\t{\r\n\t\tfont-weight: bold;\r\n\t}\r\n\r\n\t.button-subtitle\r\n\t{\r\n\t\tfont-size: 12px;\r\n\t\topacity: 0.5;\r\n\t\tmix-blend-mode: lighten;\r\n\t}\r\n}"},{"Ident":"dogecoin.ssoundboard","Path":"ui/controlsheet/controlsheetrow.cs.scss","FileName":"controlsheetrow.cs.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":341579,"Code":"\r\nControlSheetRow\r\n{\r\n\tflex-direction: row;\r\n\tflex-shrink: 0;\r\n\tmax-height: 32px;\r\n\tborder-radius: 4px;\r\n\r\n\t\u0026.hidden\r\n\t{\r\n\t\tdisplay: none;\r\n\t}\r\n}\r\n\r\nControlSheetRow \u003E .left\r\n{\r\n\twidth: 150px;\r\n\tflex-shrink: 0;\r\n\tflex-grow: 0;\r\n\tpadding: 6px;\r\n}\r\n\r\nControlSheetRow \u003E .right\r\n{\r\n\tflex-grow: 1;\r\n}\r\n\r\nControlSheetRow \u003E .left \u003E .title\r\n{\r\n\twidth: 150px;\r\n\tflex-shrink: 0;\r\n\tflex-grow: 0;\r\n\tfont-size: 13px;\r\n\twhite-space: nowrap;\r\n\toverflow: hidden;\r\n}\r\n\r\nControlSheetRow \u003E .right \u003E textentry,\r\nControlSheetRow \u003E .right numberentry\r\n{\r\n\tbackground-color: #000a;\r\n\tflex-grow: 1;\r\n\tpadding: 4px 8px;\r\n\tborder-radius: 2px;\r\n}\r\n\r\n"},{"Ident":"dogecoin.ssoundboard","Path":"ui/components/floatdock/floatdock.scss","FileName":"floatdock.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":341579,"Code":"@import \u0022/ui/styles/_theme.scss\u0022;\n\n.float-dock {\n\tpointer-events: all;\n\tbackground-color: $bg-1;\n\tborder: 1px solid $line-strong;\n\tborder-left: 2px solid @import \u0022/ui/styles/_theme.scss\u0022;\n\n.float-dock {\n\tpointer-events: all;\n\tbackground-color: $bg-1;\n\tborder: 1px solid $line-strong;\n\tborder-left: 2px solid $accent;\n\tpadding: 10px 14px;\n\tflex-direction: column;\n\tgap: 8px;\n\n\t\u0026.float-dock--row { flex-direction: row; align-items: center; }\n\t\u0026.float-dock--quiet { border-left-color: $line-mid; }\n\t\u0026.float-dock--focus { border-left-color: $accent; }\n\t\u0026.float-dock--danger { border-left-color: $danger; }\n}\n_TMP_PRIMARY;\n\tpadding: 10px 14px;\n\tflex-direction: column;\n\tgap: 8px;\n\n\t\u0026.float-dock--row { flex-direction: row; align-items: center; }\n\t\u0026.float-dock--quiet { border-left-color: $line-mid; }\n\t\u0026.float-dock--focus { border-left-color: $accent; }\n\t\u0026.float-dock--danger { border-left-color: $danger; }\n}\n"},{"Ident":"dogecoin.ssoundboard","Path":"ui/components/inputglyph/inputglyph.razor.scss","FileName":"inputglyph.razor.scss","PackageType":"game","CodeKind":"Game","AssetVersionId":341579,"Code":"@import \u0022/ui/styles/_theme.scss\u0022;\n\n.input-glyph {\n\tflex-direction: row;\n\talign-items: center;\n\tjustify-content: center;\n\n\timg {\n\t\twidth: 32px;\n\t\theight: 32px;\n\t}\n\n\t.input-glyph__fallback {\n\t\tpadding: 3px 8px;\n\t\tbackground-color: rgba(255, 255, 255, 0.06);\n\t\tborder: 1px solid $line-strong;\n\t\tcolor: $text;\n\t\tfont-family: $font-mono;\n\t\tfont-size: $fs-1;\n\t\tfont-weight: 800;\n\t\tletter-spacing: 1px;\n\t\ttext-transform: uppercase;\n\t}\n}\n"},{"Ident":"dogecoin.ssoundboard","Path":"UI/Components/EmptyState/EmptyState.razor","FileName":"EmptyState.razor","PackageType":"game","CodeKind":"Game","AssetVersionId":341579,"Code":"@namespace Sunless.Libraries.UI\n@using Sandbox\n@using Sandbox.UI\n@attribute [StyleSheet]\n@inherits Panel\n\n\u003Croot\u003E\n\t\u003Cdiv class=\u0022empty\u0022\u003E\n\t\t\u003Cdiv class=\u0022empty-icon\u0022\u003E@Icon\u003C/div\u003E\n\t\t\u003Cdiv class=\u0022empty-title\u0022\u003E@Title\u003C/div\u003E\n\t\t@if ( !string.IsNullOrEmpty( Sub ) )\n\t\t{\n\t\t\t\u003Cdiv class=\u0022empty-sub\u0022\u003E@Sub\u003C/div\u003E\n\t\t}\n\t\u003C/div\u003E\n\u003C/root\u003E\n\n@code\n{\n\tpublic string Icon { get; set; } = \u0022-- --\u0022;\n\tpublic string Title { get; set; } = \u0022\u0022;\n\tpublic string Sub { get; set; } = \u0022\u0022;\n\n\tprotected override int BuildHash() =\u003E HashCode.Combine( Icon, Title, Sub );\n}\n"},{"Ident":"dogecoin.ssoundboard","Path":"UI/Components/Icon/Icon.razor","FileName":"Icon.razor","PackageType":"game","CodeKind":"Game","AssetVersionId":341579,"Code":"@namespace Sunless.Libraries.UI\n@using Sandbox\n@using Sandbox.UI\n@attribute [StyleSheet]\n@inherits Panel\n\n\u003Croot class=\u0022icon @SizeClass @ExtraClass\u0022\u003E@Name\u003C/root\u003E\n\n@code\n{\n\tpublic string Name { get; set; } = \u0022\u0022;\n\tpublic IconSize Size { get; set; } = IconSize.Medium;\n\tpublic string ExtraClass { get; set; }\n\n\tstring SizeClass =\u003E Size switch\n\t{\n\t\tIconSize.Small  =\u003E \u0022icon-sm\u0022,\n\t\tIconSize.Large  =\u003E \u0022icon-lg\u0022,\n\t\tIconSize.XLarge =\u003E \u0022icon-xl\u0022,\n\t\t_               =\u003E \u0022icon-md\u0022,\n\t};\n\n\tprotected override int BuildHash() =\u003E HashCode.Combine( Name, Size, ExtraClass );\n}\n"},{"Ident":"dogecoin.ssoundboard","Path":"UI/Components/Menu/MenuWidgetBuilders.cs","FileName":"MenuWidgetBuilders.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":341579,"Code":"namespace Sunless.Libraries.UI;\n\nusing System;\nusing System.Collections.Generic;\n\npublic sealed class MenuLinkBuilder\n{\n\treadonly MenuScreenBuilder _screen;\n\treadonly MenuLinkWidget _w;\n\n\tinternal MenuLinkBuilder( MenuScreenBuilder screen, string label, string icon )\n\t{\n\t\t_screen = screen;\n\t\t_w = new MenuLinkWidget { Label = label, Icon = icon, Style = MenuLinkStyle.Row };\n\t}\n\n\tpublic MenuLinkBuilder WithStyle( MenuLinkStyle style )  { _w.Style = style; return this; }\n\tpublic MenuLinkBuilder WithTone( MenuTone tone )         { _w.Tone = tone; return this; }\n\tpublic MenuLinkBuilder WithHint( string hint )           { _w.Hint = hint; return this; }\n\tpublic MenuLinkBuilder WhenEnabled( Func\u003Cbool\u003E enabled ) { _w.Enabled = enabled; return this; }\n\tpublic MenuLinkBuilder WithGoTo( string routeId )        { _w.RouteId = routeId; return this; }\n\tpublic MenuLinkBuilder WithAction( Action invoke )       { _w.Invoke = invoke; return this; }\n\tpublic MenuLinkBuilder Grows()                           { _w.Grow = true; return this; }\n\n\tpublic MenuScreenBuilder EndLink()\n\t{\n\t\t_screen.AddWidget( _w );\n\t\treturn _screen;\n\t}\n}\n\npublic sealed class MenuToggleBuilder\n{\n\treadonly MenuScreenBuilder _screen;\n\treadonly MenuToggleWidget _w;\n\n\tinternal MenuToggleBuilder( MenuScreenBuilder screen, string label )\n\t{\n\t\t_screen = screen;\n\t\t_w = new MenuToggleWidget { Label = label };\n\t}\n\n\tpublic MenuToggleBuilder WithHint( string hint )        { _w.Hint = hint; return this; }\n\tpublic MenuToggleBuilder WithGetter( Func\u003Cbool\u003E get )   { _w.Get = get; return this; }\n\tpublic MenuToggleBuilder WithSetter( Action\u003Cbool\u003E set ) { _w.Set = set; return this; }\n\n\tpublic MenuToggleBuilder Bind( Func\u003Cbool\u003E get, Action\u003Cbool\u003E set )\n\t{\n\t\t_w.Get = get;\n\t\t_w.Set = set;\n\t\treturn this;\n\t}\n\n\tpublic MenuScreenBuilder EndToggle()\n\t{\n\t\t_screen.AddWidget( _w );\n\t\treturn _screen;\n\t}\n}\n\npublic sealed class MenuRangeBuilder\n{\n\treadonly MenuScreenBuilder _screen;\n\treadonly MenuRangeWidget _w;\n\n\tinternal MenuRangeBuilder( MenuScreenBuilder screen, string label )\n\t{\n\t\t_screen = screen;\n\t\t_w = new MenuRangeWidget { Label = label, Min = 0f, Max = 1f, Step = 0.01f, Format = \u00220.00\u0022 };\n\t}\n\n\tpublic MenuRangeBuilder WithHint( string hint )         { _w.Hint = hint; return this; }\n\tpublic MenuRangeBuilder WithRange( float min, float max ) { _w.Min = min; _w.Max = max; return this; }\n\tpublic MenuRangeBuilder WithStep( float step )            { _w.Step = step; return this; }\n\tpublic MenuRangeBuilder WithFormat( string format )       { _w.Format = format; return this; }\n\n\tpublic MenuRangeBuilder Bind( Func\u003Cfloat\u003E get, Action\u003Cfloat\u003E set )\n\t{\n\t\t_w.Get = get;\n\t\t_w.Set = set;\n\t\treturn this;\n\t}\n\n\tpublic MenuScreenBuilder EndRange()\n\t{\n\t\t_screen.AddWidget( _w );\n\t\treturn _screen;\n\t}\n}\n\npublic sealed class MenuSegmentedBuilder\n{\n\treadonly MenuScreenBuilder _screen;\n\treadonly MenuSegmentedWidget _w;\n\n\tinternal MenuSegmentedBuilder( MenuScreenBuilder screen, string label, string[] choices )\n\t{\n\t\t_screen = screen;\n\t\t_w = new MenuSegmentedWidget { Label = label, Choices = choices };\n\t}\n\n\tpublic MenuSegmentedBuilder WithHint( string hint ) { _w.Hint = hint; return this; }\n\n\tpublic MenuSegmentedBuilder Bind( Func\u003Cint\u003E get, Action\u003Cint\u003E set )\n\t{\n\t\t_w.Get = get;\n\t\t_w.Set = set;\n\t\treturn this;\n\t}\n\n\tpublic MenuScreenBuilder EndSegmented()\n\t{\n\t\t_screen.AddWidget( _w );\n\t\treturn _screen;\n\t}\n}\n\npublic sealed class MenuRadioBuilder\n{\n\treadonly MenuScreenBuilder _screen;\n\treadonly MenuRadioWidget _w;\n\treadonly List\u003CMenuRadioWidget.Option\u003E _options = new();\n\n\tinternal MenuRadioBuilder( MenuScreenBuilder screen, string label )\n\t{\n\t\t_screen = screen;\n\t\t_w = new MenuRadioWidget { Label = label };\n\t}\n\n\tpublic MenuRadioBuilder WithHint( string hint ) { _w.Hint = hint; return this; }\n\n\tpublic MenuRadioBuilder WithOption( string label, string icon = null, string hint = null )\n\t{\n\t\t_options.Add( new MenuRadioWidget.Option { Label = label, Icon = icon, Hint = hint } );\n\t\treturn this;\n\t}\n\n\tpublic MenuRadioBuilder Bind( Func\u003Cint\u003E get, Action\u003Cint\u003E set )\n\t{\n\t\t_w.Get = get;\n\t\t_w.Set = set;\n\t\treturn this;\n\t}\n\n\tpublic MenuScreenBuilder EndRadio()\n\t{\n\t\t_w.Options = _options;\n\t\t_screen.AddWidget( _w );\n\t\treturn _screen;\n\t}\n}\n\npublic sealed class MenuInfoBuilder\n{\n\treadonly MenuScreenBuilder _screen;\n\treadonly MenuInfoWidget _w;\n\n\tinternal MenuInfoBuilder( MenuScreenBuilder screen, string label )\n\t{\n\t\t_screen = screen;\n\t\t_w = new MenuInfoWidget { Label = label };\n\t}\n\n\tpublic MenuInfoBuilder WithIcon( string icon )         { _w.Icon = icon; return this; }\n\tpublic MenuInfoBuilder WithGetter( Func\u003Cstring\u003E get )  { _w.Get = get; return this; }\n\tpublic MenuInfoBuilder WithValue( string value )       { _w.Get = () =\u003E value; return this; }\n\n\tpublic MenuScreenBuilder EndInfo()\n\t{\n\t\t_screen.AddWidget( _w );\n\t\treturn _screen;\n\t}\n}\n\npublic sealed class MenuTextFieldBuilder\n{\n\treadonly MenuScreenBuilder _screen;\n\treadonly MenuTextFieldWidget _w;\n\n\tinternal MenuTextFieldBuilder( MenuScreenBuilder screen, string label )\n\t{\n\t\t_screen = screen;\n\t\t_w = new MenuTextFieldWidget { Label = label };\n\t}\n\n\tpublic MenuTextFieldBuilder WithHint( string hint ) { _w.Hint = hint; return this; }\n\n\tpublic MenuTextFieldBuilder Bind( Func\u003Cstring\u003E get, Action\u003Cstring\u003E set )\n\t{\n\t\t_w.Get = get;\n\t\t_w.Set = set;\n\t\treturn this;\n\t}\n\n\tpublic MenuScreenBuilder EndTextField()\n\t{\n\t\t_screen.AddWidget( _w );\n\t\treturn _screen;\n\t}\n}\n\n// === Composite widgets ===============================================\n\npublic sealed class MenuHeroCardBuilder\n{\n\treadonly MenuScreenBuilder _screen;\n\treadonly MenuHeroCardWidget _w = new();\n\n\tinternal MenuHeroCardBuilder( MenuScreenBuilder screen ) { _screen = screen; }\n\n\tpublic MenuHeroCardBuilder WithTitle( string title )             { _w.Title = title; return this; }\n\tpublic MenuHeroCardBuilder WithSubtitle( string subtitle )       { _w.Subtitle = subtitle; return this; }\n\tpublic MenuHeroCardBuilder WithDescription( string description ) { _w.Description = description; return this; }\n\tpublic MenuHeroCardBuilder WithImage( string url )               { _w.Image = url; return this; }\n\tpublic MenuHeroCardBuilder WithIcon( string icon )               { _w.Icon = icon; return this; }\n\n\tpublic MenuScreenBuilder EndHeroCard()\n\t{\n\t\t_screen.AddWidget( _w );\n\t\treturn _screen;\n\t}\n}\n\npublic sealed class MenuMapCardBuilder\n{\n\treadonly MenuScreenBuilder _screen;\n\treadonly MenuMapCardWidget _w = new();\n\n\tinternal MenuMapCardBuilder( MenuScreenBuilder screen ) { _screen = screen; }\n\n\tpublic MenuMapCardBuilder WithTitle( string title )             { _w.Title = title; return this; }\n\tpublic MenuMapCardBuilder WithDescription( string description ) { _w.Description = description; return this; }\n\tpublic MenuMapCardBuilder WithImage( string url )               { _w.Image = url; return this; }\n\n\tpublic MenuMapCardBuilder WithChip( string label, string icon = null, MenuTone tone = MenuTone.Confirm )\n\t{\n\t\t_w.ChipLabel = label;\n\t\t_w.ChipIcon = icon;\n\t\t_w.ChipTone = tone;\n\t\treturn this;\n\t}\n\n\tpublic MenuMapCardBuilder WithAction( string label, string icon, Action invoke, string routeId = null )\n\t{\n\t\t_w.ActionLabel = label;\n\t\t_w.ActionIcon = icon;\n\t\t_w.ActionInvoke = invoke;\n\t\t_w.ActionRouteId = routeId;\n\t\treturn this;\n\t}\n\n\tpublic MenuScreenBuilder EndMapCard()\n\t{\n\t\t_screen.AddWidget( _w );\n\t\treturn _screen;\n\t}\n}\n\npublic sealed class MenuMapGridBuilder\n{\n\treadonly MenuScreenBuilder _screen;\n\treadonly MenuMapGridWidget _w = new();\n\treadonly List\u003CMenuMapGridWidget.Card\u003E _cards = new();\n\n\tinternal MenuMapGridBuilder( MenuScreenBuilder screen ) { _screen = screen; }\n\n\tpublic MenuMapGridBuilder WithActive( Func\u003Cint\u003E get )  { _w.Active = get; return this; }\n\tpublic MenuMapGridBuilder OnPick( Action\u003Cint\u003E set )    { _w.Pick = set; return this; }\n\n\tpublic MenuMapCardCardBuilder WithCard( string title )\n\t\t=\u003E new( this, title );\n\n\tinternal void AddCard( MenuMapGridWidget.Card card ) =\u003E _cards.Add( card );\n\n\tbool _closed;\n\n\tpublic MenuScreenBuilder EndMapGrid()\n\t{\n\t\tif ( _closed ) return _screen;\n\t\t_closed = true;\n\t\t_w.Cards = _cards;\n\t\t_screen.AddWidget( _w );\n\t\treturn _screen;\n\t}\n}\n\npublic sealed class MenuMapCardCardBuilder\n{\n\treadonly MenuMapGridBuilder _grid;\n\treadonly MenuMapGridWidget.Card _c;\n\n\tinternal MenuMapCardCardBuilder( MenuMapGridBuilder grid, string title )\n\t{\n\t\t_grid = grid;\n\t\t_c = new MenuMapGridWidget.Card { Title = title };\n\t}\n\n\tpublic MenuMapCardCardBuilder WithDescription( string text ) { _c.Description = text; return this; }\n\tpublic MenuMapCardCardBuilder WithImage( string url )        { _c.Image = url; return this; }\n\tpublic MenuMapCardCardBuilder WithBadge( string label, MenuTone tone = MenuTone.Confirm )\n\t{\n\t\t_c.BadgeLabel = label;\n\t\t_c.BadgeTone = tone;\n\t\treturn this;\n\t}\n\n\tpublic MenuMapCardCardBuilder ComingSoon( bool v = true ) { _c.ComingSoon = v; return this; }\n\tpublic MenuMapCardCardBuilder Locked( bool v = true )     { _c.Locked = v; return this; }\n\n\tpublic MenuMapGridBuilder EndCard()\n\t{\n\t\t_grid.AddCard( _c );\n\t\treturn _grid;\n\t}\n}\n\npublic sealed class MenuTileGridBuilder\n{\n\treadonly MenuScreenBuilder _screen;\n\treadonly MenuTileGridWidget _w = new();\n\treadonly List\u003CMenuTileGridWidget.Item\u003E _items = new();\n\n\tinternal MenuTileGridBuilder( MenuScreenBuilder screen ) { _screen = screen; }\n\n\tpublic MenuTileGridBuilder WithTile( string label, string color = null, string image = null )\n\t{\n\t\t_items.Add( new MenuTileGridWidget.Item { Label = label, Color = color, Image = image } );\n\t\treturn this;\n\t}\n\n\tpublic MenuTileGridBuilder WithActive( Func\u003Cint\u003E get ) { _w.Active = get; return this; }\n\tpublic MenuTileGridBuilder OnPick( Action\u003Cint\u003E set )   { _w.Pick = set; return this; }\n\n\tpublic MenuScreenBuilder EndTileGrid()\n\t{\n\t\t_w.Items = _items;\n\t\t_screen.AddWidget( _w );\n\t\treturn _screen;\n\t}\n}\n\npublic sealed class MenuPlayerListBuilder\n{\n\treadonly MenuScreenBuilder _screen;\n\treadonly MenuPlayerListWidget _w = new();\n\treadonly List\u003CMenuPlayerListWidget.Player\u003E _players = new();\n\n\tinternal MenuPlayerListBuilder( MenuScreenBuilder screen ) { _screen = screen; }\n\n\tpublic MenuPlayerListBuilder WithPlayer( string name, bool ready = false, bool host = false )\n\t{\n\t\t_players.Add( new MenuPlayerListWidget.Player { Name = name, Ready = ready, Host = host } );\n\t\treturn this;\n\t}\n\n\tpublic MenuScreenBuilder EndPlayerList()\n\t{\n\t\t_w.Players = _players;\n\t\t_screen.AddWidget( _w );\n\t\treturn _screen;\n\t}\n}\n\npublic sealed class MenuKeyBindingsBuilder\n{\n\treadonly MenuScreenBuilder _screen;\n\treadonly MenuKeyBindingsWidget _w = new();\n\treadonly List\u003CMenuKeyBindingsWidget.Binding\u003E _bindings = new();\n\n\tinternal MenuKeyBindingsBuilder( MenuScreenBuilder screen ) { _screen = screen; }\n\n\tpublic MenuKeyBindingsBuilder WithBinding( string action, params string[] keys )\n\t{\n\t\t_bindings.Add( new MenuKeyBindingsWidget.Binding { Action = action, Keys = keys } );\n\t\treturn this;\n\t}\n\n\tpublic MenuScreenBuilder EndKeyBindings()\n\t{\n\t\t_w.Bindings = _bindings;\n\t\t_screen.AddWidget( _w );\n\t\treturn _screen;\n\t}\n}\n\npublic sealed class MenuPromptCardBuilder\n{\n\treadonly MenuScreenBuilder _screen;\n\treadonly MenuPromptCardWidget _w = new() { Verb = \u0022Press\u0022 };\n\n\tinternal MenuPromptCardBuilder( MenuScreenBuilder screen ) { _screen = screen; }\n\n\tpublic MenuPromptCardBuilder WithVerb( string verb )      { _w.Verb = verb; return this; }\n\tpublic MenuPromptCardBuilder WithPrompt( string prompt )  { _w.Prompt = prompt; return this; }\n\tpublic MenuPromptCardBuilder WithGlyph( string ligature ) { _w.Glyph = ligature; return this; }\n\tpublic MenuPromptCardBuilder WithCost( int cost )         { _w.Cost = cost; return this; }\n\tpublic MenuPromptCardBuilder WhenDisabled( Func\u003Cbool\u003E d ) { _w.Disabled = d; return this; }\n\tpublic MenuPromptCardBuilder WithHoldProgress( Func\u003Cfloat\u003E p ) { _w.Progress = p; return this; }\n\n\tpublic MenuScreenBuilder EndPromptCard()\n\t{\n\t\t_screen.AddWidget( _w );\n\t\treturn _screen;\n\t}\n}\n\npublic sealed class MenuActionRowBuilder\n{\n\treadonly MenuScreenBuilder _screen;\n\treadonly MenuActionRowWidget _w = new();\n\treadonly List\u003CMenuLinkWidget\u003E _links = new();\n\n\tinternal MenuActionRowBuilder( MenuScreenBuilder screen ) { _screen = screen; }\n\n\tpublic MenuActionRowLinkBuilder WithLink( string label, string icon = null )\n\t\t=\u003E new( this, label, icon );\n\n\tinternal void AddLink( MenuLinkWidget link ) =\u003E _links.Add( link );\n\n\tpublic MenuScreenBuilder EndActionRow()\n\t{\n\t\t_w.Links = _links;\n\t\t_screen.AddWidget( _w );\n\t\treturn _screen;\n\t}\n}\n\npublic sealed class MenuActionRowLinkBuilder\n{\n\treadonly MenuActionRowBuilder _row;\n\treadonly MenuLinkWidget _w;\n\n\tinternal MenuActionRowLinkBuilder( MenuActionRowBuilder row, string label, string icon )\n\t{\n\t\t_row = row;\n\t\t_w = new MenuLinkWidget { Label = label, Icon = icon, Style = MenuLinkStyle.Button };\n\t}\n\n\tpublic MenuActionRowLinkBuilder WithTone( MenuTone tone )         { _w.Tone = tone; return this; }\n\tpublic MenuActionRowLinkBuilder WithGoTo( string routeId )        { _w.RouteId = routeId; return this; }\n\tpublic MenuActionRowLinkBuilder WithAction( Action invoke )       { _w.Invoke = invoke; return this; }\n\tpublic MenuActionRowLinkBuilder WhenEnabled( Func\u003Cbool\u003E enabled ) { _w.Enabled = enabled; return this; }\n\tpublic MenuActionRowLinkBuilder Grows()                           { _w.Grow = true; return this; }\n\n\tpublic MenuActionRowBuilder EndLink()\n\t{\n\t\t_row.AddLink( _w );\n\t\treturn _row;\n\t}\n}\n"},{"Ident":"dogecoin.ssoundboard","Path":"UI/Components/Menu/PromptCard.razor","FileName":"PromptCard.razor","PackageType":"game","CodeKind":"Game","AssetVersionId":341579,"Code":"@namespace Sunless.Libraries.UI\n@using Sandbox\n@using Sandbox.UI\n@inherits Panel\n@attribute [StyleSheet]\n\n\u003Croot class=\u0022@(IsDisabled ? \u0022disabled\u0022 : \u0022\u0022)\u0022\u003E\n\t\u003Cdiv class=\u0022prompt-frame\u0022\u003E\n\t\t\u003Cdiv class=\u0022prompt-vignette\u0022\u003E\u003C/div\u003E\n\n\t\t\u003Cdiv class=\u0022prompt-content\u0022\u003E\n\t\t\t\u003Cdiv class=\u0022prompt-glyph\u0022\u003E\n\t\t\t\t@if ( !string.IsNullOrEmpty( Glyph ) )\n\t\t\t\t{\n\t\t\t\t\t\u003Cdiv class=\u0022kbd\u0022\u003E@Glyph\u003C/div\u003E\n\t\t\t\t}\n\t\t\t\u003C/div\u003E\n\n\t\t\t\u003Cdiv class=\u0022prompt-text\u0022\u003E\n\t\t\t\t\u003Cdiv class=\u0022prompt-verb\u0022\u003E@EffectiveVerb\u003C/div\u003E\n\t\t\t\t\u003Cdiv class=\u0022prompt-label\u0022\u003E@Prompt\u003C/div\u003E\n\t\t\t\u003C/div\u003E\n\n\t\t\t@if ( Cost \u003E 0 )\n\t\t\t{\n\t\t\t\t\u003Cdiv class=\u0022prompt-cost\u0022\u003E\n\t\t\t\t\t\u003Cdiv class=\u0022prompt-cost-value\u0022\u003E@Cost\u003C/div\u003E\n\t\t\t\t\t\u003Cdiv class=\u0022prompt-cost-unit\u0022\u003EPTS\u003C/div\u003E\n\t\t\t\t\u003C/div\u003E\n\t\t\t}\n\t\t\u003C/div\u003E\n\n\t\t\u003Cdiv class=\u0022prompt-rule\u0022\u003E\n\t\t\t\u003Cdiv class=\u0022prompt-rule-fill\u0022 @ref=\u0022ruleFill\u0022\u003E\u003C/div\u003E\n\t\t\u003C/div\u003E\n\t\u003C/div\u003E\n\u003C/root\u003E\n\n@code\n{\n\tpublic string Verb { get; set; } = \u0022Press\u0022;\n\tpublic string Prompt { get; set; } = \u0022\u0022;\n\tpublic string Glyph { get; set; } = \u0022E\u0022;\n\tpublic int Cost { get; set; }\n\tpublic bool IsDisabled { get; set; }\n\tpublic Func\u003Cfloat\u003E HoldProgressFn { get; set; }\n\n\tPanel ruleFill { get; set; }\n\n\tstring EffectiveVerb =\u003E IsDisabled \u0026\u0026 Cost \u003E 0 ? \u0022Not enough points\u0022 : Verb;\n\n\tpublic override void Tick()\n\t{\n\t\tif ( ruleFill is null ) return;\n\n\t\tvar p = HoldProgressFn?.Invoke() ?? 0f;\n\t\tif ( p \u003C 0f ) p = 0f;\n\t\telse if ( p \u003E 1f ) p = 1f;\n\n\t\truleFill.Style.Opacity = p \u003E 0f ? 1f : 0f;\n\t\truleFill.Style.Width = Length.Percent( p * 100f );\n\t}\n\n\tprotected override int BuildHash() =\u003E HashCode.Combine( Verb, Prompt, Glyph, Cost, IsDisabled );\n}\n"},{"Ident":"dogecoin.ssoundboard","Path":"SoundBoardNet.cs","FileName":"SoundBoardNet.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":341579,"Code":"using System;\n\nnamespace SSoundboard;\n\n/// \u003Csummary\u003E\n/// Network relay for co-op pad presses. Host owns one scene object; clients\n/// call Rpc.Host then host rebroadcasts so every machine hears the chaos.\n/// \u003C/summary\u003E\npublic sealed class SoundBoardNet : Component\n{\n\tpublic static SoundBoardNet Instance { get; private set; }\n\n\tprotected override void OnEnabled()\n\t{\n\t\tInstance = this;\n\t}\n\n\tprotected override void OnDisabled()\n\t{\n\t\tif ( Instance == this )\n\t\t\tInstance = null;\n\t}\n\n\tprotected override void OnDestroy()\n\t{\n\t\tif ( Instance == this )\n\t\t\tInstance = null;\n\t}\n\n\t/// \u003Csummary\u003EHost creates a networked singleton when a multiplayer session is live.\u003C/summary\u003E\n\tpublic static void EnsureHostRelay()\n\t{\n\t\ttry\n\t\t{\n\t\t\tif ( !Networking.IsActive )\n\t\t\t\treturn;\n\n\t\t\tif ( Instance.IsValid() )\n\t\t\t\treturn;\n\n\t\t\tif ( !Networking.IsHost )\n\t\t\t\treturn;\n\n\t\t\tvar go = new GameObject( true, \u0022SoundBoardNet\u0022 );\n\t\t\tgo.Components.Create\u003CSoundBoardNet\u003E();\n\t\t\tgo.NetworkSpawn();\n\t\t\tLog.Info( \u0022[S\u0026Soundboard] CO-OP network relay spawned\u0022 );\n\t\t}\n\t\tcatch ( Exception e )\n\t\t{\n\t\t\tLog.Warning( $\u0022[S\u0026Soundboard] CO-OP relay spawn failed: {e.Message}\u0022 );\n\t\t}\n\t}\n\n\t/// \u003Csummary\u003ELocal player pressed a pad while CO-OP is on \u2014 share with the lobby.\u003C/summary\u003E\n\tpublic static void SharePadPress( SoundPad pad )\n\t{\n\t\tif ( pad is null || string.IsNullOrWhiteSpace( pad.SoundId ) )\n\t\t\treturn;\n\n\t\tif ( !SoundBoardCoop.Enabled )\n\t\t\treturn;\n\n\t\ttry\n\t\t{\n\t\t\tif ( !Networking.IsActive )\n\t\t\t\treturn;\n\n\t\t\tEnsureHostRelay();\n\n\t\t\tvar net = Instance;\n\t\t\tif ( !net.IsValid() )\n\t\t\t\treturn;\n\n\t\t\t// Calling Rpc on a non-networked object throws (\u0022must be networked\u0022).\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif ( net.GameObject is null || !net.GameObject.Network.Active )\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t\tcatch\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tnet.RequestPad(\n\t\t\t\tpad.SoundId,\n\t\t\t\tpad.Label ?? \u0022\u0022,\n\t\t\t\tpad.Color ?? \u0022#ffffff\u0022,\n\t\t\t\tpad.Volume \u003C= 0f ? 1f : pad.Volume );\n\t\t}\n\t\tcatch ( Exception e )\n\t\t{\n\t\t\t// Never let lobby sync break local button presses.\n\t\t\tLog.Warning( $\u0022[S\u0026Soundboard] CO-OP share failed: {e.GetType().Name}: {e.Message}\u0022 );\n\t\t}\n\t}\n\n\t[Rpc.Host]\n\tvoid RequestPad( string soundId, string label, string color, float volume )\n\t{\n\t\ttry\n\t\t{\n\t\t\tif ( string.IsNullOrWhiteSpace( soundId ) )\n\t\t\t\treturn;\n\n\t\t\tvar caller = Rpc.Caller;\n\t\t\tvar name = ResolveDisplayName( caller );\n\t\t\tvar steamId = ResolveSteamId( caller );\n\n\t\t\t// Host rebroadcasts to everyone (including the original presser).\n\t\t\tReceivePad( soundId, label ?? \u0022\u0022, color ?? \u0022#ffffff\u0022, volume, name, steamId );\n\t\t}\n\t\tcatch ( Exception e )\n\t\t{\n\t\t\tLog.Warning( $\u0022[S\u0026Soundboard] CO-OP RequestPad failed: {e.GetType().Name}: {e.Message}\u0022 );\n\t\t}\n\t}\n\n\tstatic string ResolveDisplayName( Connection caller )\n\t{\n\t\tif ( caller is null )\n\t\t\treturn \u0022Player\u0022;\n\n\t\ttry\n\t\t{\n\t\t\tif ( !string.IsNullOrWhiteSpace( caller.DisplayName ) )\n\t\t\t\treturn caller.DisplayName;\n\t\t}\n\t\tcatch { /* ignore */ }\n\n\t\ttry\n\t\t{\n\t\t\tif ( !string.IsNullOrWhiteSpace( caller.Name ) )\n\t\t\t\treturn caller.Name;\n\t\t}\n\t\tcatch { /* ignore */ }\n\n\t\treturn \u0022Player\u0022;\n\t}\n\n\tstatic long ResolveSteamId( Connection caller )\n\t{\n\t\tif ( caller is null )\n\t\t\treturn 0;\n\n\t\t// Prefer string parse \u2014 SteamId / Friend.Id shapes vary; never throw on cast.\n\t\ttry\n\t\t{\n\t\t\tvar id = ParseSteamId( caller.FriendInfo.Id );\n\t\t\tif ( id != 0 )\n\t\t\t\treturn id;\n\t\t}\n\t\tcatch { /* ignore */ }\n\n\t\ttry\n\t\t{\n\t\t\tvar id = ParseSteamId( caller.SteamId );\n\t\t\tif ( id != 0 )\n\t\t\t\treturn id;\n\t\t}\n\t\tcatch { /* ignore */ }\n\n\t\ttry\n\t\t{\n\t\t\treturn ParseSteamId( caller.OwnerSteamId );\n\t\t}\n\t\tcatch\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tstatic long ParseSteamId( object value )\n\t{\n\t\tif ( value is null )\n\t\t\treturn 0;\n\n\t\ttry\n\t\t{\n\t\t\tswitch ( value )\n\t\t\t{\n\t\t\t\tcase long l:\n\t\t\t\t\treturn l;\n\t\t\t\tcase ulong ul:\n\t\t\t\t\treturn unchecked( (long)ul );\n\t\t\t\tcase int i:\n\t\t\t\t\treturn i;\n\t\t\t\tcase uint ui:\n\t\t\t\t\treturn ui;\n\t\t\t}\n\t\t}\n\t\tcatch { /* fall through */ }\n\n\t\ttry\n\t\t{\n\t\t\tvar s = value.ToString();\n\t\t\tif ( string.IsNullOrWhiteSpace( s ) )\n\t\t\t\treturn 0;\n\t\t\t// SteamId.ToString() is typically the numeric account id.\n\t\t\tif ( long.TryParse( s, out var parsed ) )\n\t\t\t\treturn parsed;\n\t\t}\n\t\tcatch { /* ignore */ }\n\n\t\treturn 0;\n\t}\n\n\t[Rpc.Broadcast( NetFlags.HostOnly | NetFlags.Reliable )]\n\tvoid ReceivePad( string soundId, string label, string color, float volume, string playerName, long steamId )\n\t{\n\t\tSoundBoardCoop.OnNetworkPad( soundId, label, color, volume, playerName, steamId );\n\t}\n}\n"},{"Ident":"dogecoin.ssoundboard","Path":"SoundPreloadService.cs","FileName":"SoundPreloadService.cs","PackageType":"game","CodeKind":"Game","AssetVersionId":341579,"Code":"using System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nnamespace SSoundboard;\n\n/// \u003Csummary\u003E\n/// On-demand sound loading. Prefer TryGet (already compiled); LoadAsync only on click.\n/// \u003C/summary\u003E\npublic static class SoundPreloadService\n{\n\tenum LoadState { Pending, Loading, Ready, Failed }\n\n\tstatic readonly Dictionary\u003Cstring, LoadState\u003E _states = new( StringComparer.OrdinalIgnoreCase );\n\tstatic readonly List\u003Cstring\u003E _priority = new();\n\tstatic readonly Dictionary\u003Cstring, SoundPad\u003E _pendingPlays = new( StringComparer.OrdinalIgnoreCase );\n\n\tstatic int _loaded;\n\tstatic int _registered;\n\tstatic int _activeLoads;\n\tstatic bool _initialized;\n\tstatic bool _startupComplete;\n\n\tconst int MaxConcurrentLoads = 2;\n\tconst int StartupWarmCap = 32;\n\n\tpublic static event Action Changed;\n\n\tpublic static int LoadedCount =\u003E _loaded;\n\tpublic static bool IsInitialized =\u003E _initialized;\n\tpublic static bool IsStartupComplete =\u003E _startupComplete;\n\t/// \u003Csummary\u003EBumps when pending-play set changes \u2014 cheap UI rebuild signal.\u003C/summary\u003E\n\tpublic static int PendingRevision { get; private set; }\n\n\tpublic static void Initialize()\n\t{\n\t\tif ( _initialized )\n\t\t\treturn;\n\n\t\t_initialized = true;\n\n\t\tvar warmed = 0;\n\t\tforeach ( var soundId in SoundBoardData.StartupSoundIds )\n\t\t{\n\t\t\tif ( string.IsNullOrWhiteSpace( soundId ) )\n\t\t\t\tcontinue;\n\n\t\t\tif ( TryMarkReadyIfPresent( Normalize( soundId ) ) )\n\t\t\t\twarmed\u002B\u002B;\n\n\t\t\tif ( warmed \u003E= StartupWarmCap )\n\t\t\t\tbreak;\n\t\t}\n\n\t\t_startupComplete = true;\n\t\tChanged?.Invoke();\n\t}\n\n\tstatic void EnsureInitialized()\n\t{\n\t\tif ( !_initialized )\n\t\t\tInitialize();\n\t}\n\n\tpublic static bool IsReady( string soundId )\n\t{\n\t\tif ( string.IsNullOrWhiteSpace( soundId ) )\n\t\t\treturn false;\n\n\t\tEnsureInitialized();\n\t\tvar key = Normalize( soundId );\n\n\t\tif ( _states.TryGetValue( key, out var state ) )\n\t\t{\n\t\t\tif ( state == LoadState.Ready )\n\t\t\t\treturn true;\n\t\t\tif ( state is LoadState.Failed or LoadState.Loading )\n\t\t\t\treturn false;\n\t\t}\n\n\t\treturn TryMarkReadyIfPresent( key );\n\t}\n\n\tpublic static void BumpPriority( string soundId )\n\t{\n\t\tif ( string.IsNullOrWhiteSpace( soundId ) )\n\t\t\treturn;\n\n\t\tEnsureInitialized();\n\t\tvar key = Normalize( soundId );\n\n\t\tif ( IsReady( key ) )\n\t\t\treturn;\n\n\t\tif ( _states.TryGetValue( key, out var state ) )\n\t\t{\n\t\t\tif ( state is LoadState.Loading or LoadState.Ready )\n\t\t\t\treturn;\n\n\t\t\tif ( state == LoadState.Failed )\n\t\t\t\t_states[key] = LoadState.Pending;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t_states[key] = LoadState.Pending;\n\t\t\t_registered\u002B\u002B;\n\t\t}\n\n\t\t_priority.Remove( key );\n\t\t_priority.Insert( 0, key );\n\t\tChanged?.Invoke();\n\t}\n\n\tpublic static void QueuePlayWhenReady( SoundPad pad )\n\t{\n\t\tif ( pad is null || string.IsNullOrWhiteSpace( pad.SoundId ) )\n\t\t\treturn;\n\n\t\tvar key = Normalize( pad.SoundId );\n\t\t_pendingPlays[key] = pad;\n\t\tPendingRevision\u002B\u002B;\n\t\tBumpPriority( key );\n\t}\n\n\tpublic static bool TryTakePendingPlay( string soundId, out SoundPad pad )\n\t{\n\t\tvar removed = _pendingPlays.Remove( Normalize( soundId ), out pad );\n\t\tif ( removed )\n\t\t\tPendingRevision\u002B\u002B;\n\t\treturn removed;\n\t}\n\n\tpublic static bool IsPendingPlay( string soundId )\n\t{\n\t\treturn _pendingPlays.ContainsKey( Normalize( soundId ) );\n\t}\n\n\tpublic static void Tick()\n\t{\n\t\tEnsureInitialized();\n\t\tTryPumpLoads();\n\t}\n\n\tstatic void TryPumpLoads()\n\t{\n\t\twhile ( _activeLoads \u003C MaxConcurrentLoads \u0026\u0026 TryDequeue( out var soundId ) )\n\t\t{\n\t\t\tif ( TryMarkReadyIfPresent( soundId ) )\n\t\t\t{\n\t\t\t\tSoundBoardManager.OnSoundReady( soundId );\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t_activeLoads\u002B\u002B;\n\t\t\t_states[soundId] = LoadState.Loading;\n\t\t\t_ = LoadOneAsync( soundId );\n\t\t}\n\t}\n\n\tstatic bool TryDequeue( out string soundId )\n\t{\n\t\twhile ( _priority.Count \u003E 0 )\n\t\t{\n\t\t\tvar next = _priority[0];\n\t\t\t_priority.RemoveAt( 0 );\n\n\t\t\tif ( !_states.TryGetValue( next, out var st ) || st != LoadState.Pending )\n\t\t\t\tcontinue;\n\n\t\t\tsoundId = next;\n\t\t\treturn true;\n\t\t}\n\n\t\tsoundId = null;\n\t\treturn false;\n\t}\n\n\tstatic async Task LoadOneAsync( string soundId )\n\t{\n\t\tvar path = ToSoundPath( soundId );\n\n\t\ttry\n\t\t{\n\t\t\tif ( ResourceLibrary.TryGet\u003CSoundEvent\u003E( path, out _ ) )\n\t\t\t{\n\t\t\t\tMarkReady( soundId );\n\t\t\t\tSoundBoardManager.OnSoundReady( soundId );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar loaded = await ResourceLibrary.LoadAsync\u003CSoundEvent\u003E( path );\n\t\t\tif ( loaded is null )\n\t\t\t{\n\t\t\t\tMarkFailed( soundId );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry { Sound.Preload( path ); }\n\t\t\tcatch { /* playable without preload */ }\n\n\t\t\tMarkReady( soundId );\n\t\t\tSoundBoardManager.OnSoundReady( soundId );\n\t\t}\n\t\tcatch ( Exception e )\n\t\t{\n\t\t\tLog.Warning( $\u0022[S\u0026Soundboard] Sound load skipped: {path} ({e.GetType().Name})\u0022 );\n\t\t\tMarkFailed( soundId );\n\t\t}\n\t\tfinally\n\t\t{\n\t\t\t_activeLoads = Math.Max( 0, _activeLoads - 1 );\n\t\t}\n\t}\n\n\tstatic bool TryMarkReadyIfPresent( string key )\n\t{\n\t\ttry\n\t\t{\n\t\t\tif ( !ResourceLibrary.TryGet\u003CSoundEvent\u003E( ToSoundPath( key ), out _ ) )\n\t\t\t\treturn false;\n\t\t}\n\t\tcatch\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tMarkReady( key );\n\t\treturn true;\n\t}\n\n\tstatic void MarkReady( string key )\n\t{\n\t\tvar already = _states.TryGetValue( key, out var prev ) \u0026\u0026 prev == LoadState.Ready;\n\t\t_states[key] = LoadState.Ready;\n\t\tif ( !already )\n\t\t\t_loaded\u002B\u002B;\n\t\tChanged?.Invoke();\n\t}\n\n\tstatic void MarkFailed( string key )\n\t{\n\t\t_states[key] = LoadState.Failed;\n\t\tif ( _pendingPlays.Remove( key ) )\n\t\t\tPendingRevision\u002B\u002B;\n\t\tChanged?.Invoke();\n\t}\n\n\tstatic string Normalize( string soundId )\n\t{\n\t\tif ( string.IsNullOrWhiteSpace( soundId ) )\n\t\t\treturn soundId;\n\n\t\tsoundId = soundId.Replace( \u0027\\\\\u0027, \u0027/\u0027 ).Trim();\n\t\treturn soundId.EndsWith( \u0022.sound\u0022, StringComparison.OrdinalIgnoreCase )\n\t\t\t? soundId[..^6]\n\t\t\t: soundId;\n\t}\n\n\tstatic string ToSoundPath( string soundId ) =\u003E $\u0022{Normalize( soundId )}.sound\u0022;\n}\n"}]}