@gjsify/example-gtk-adwaita-storybook 0.57.0 → 0.58.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser-main.js +26 -20
- package/dist/gjs.js +8 -8
- package/dist/gjs.node.mjs +7 -7
- package/package.json +5 -5
package/dist/gjs.node.mjs
CHANGED
|
@@ -70,7 +70,7 @@ import{createRequire as e}from"node:module";import"@gjsify/node-gi/globals";impo
|
|
|
70
70
|
</method>${e.length>0?`\n${e.join(`
|
|
71
71
|
`)}`:``}
|
|
72
72
|
</interface>
|
|
73
|
-
</node>`}const ee=e(import.meta.url);let b;function load$4(){return b===void 0&&(b=ee(`@gjsify/node-gi/gi`).requireGi(`Gio`,`2.0`)),b}__name(load$4,`load`);var x=new Proxy(Object.create(null),{get(e,t){return load$4()[t]},has(e,t){return t in load$4()}});function isWin32(){return l.DIR_SEPARATOR===92}function defaultListenAddress(){return isWin32()?`nonce-tcp:host=127.0.0.1`:`unix:tmpdir=${l.get_tmp_dir()}`}var DevtoolsPeerServerError=class extends Error{constructor(e,t,n,r){super(e),this.address=t,this.reason=n,this.name=`DevtoolsPeerServerError`,this.cause=r}};function isAddressInUse(e){return e instanceof l.Error&&e.matches(x.io_error_quark(),x.IOErrorEnum.ADDRESS_IN_USE)}function unixSocketPath(e){if(!e.startsWith(`unix:`))return null;for(let t of e.slice(5).split(`,`)){let e=t.indexOf(`=`);if(!(e<0||t.slice(0,e)!==`path`))try{return decodeURIComponent(t.slice(e+1))}catch{return null}}return null}function inspectExistingSocket(e){try{if((x.File.new_for_path(e).query_info(`unix::mode`,x.FileQueryInfoFlags.NONE,null).get_attribute_uint32(`unix::mode`)&61440)!=49152)return`not-a-socket`}catch{return`not-a-socket`}let t=new x.SocketClient;t.set_timeout(2);let n;try{n=t.connect(x.UnixSocketAddress.new(e),null)}catch{return`dead`}return n.close(null),`live`}function clearReclaimableSocket(e){let t=unixSocketPath(e);if(!t||!l.file_test(t,l.FileTest.EXISTS))return;let n=inspectExistingSocket(t);if(n===`live`)throw new DevtoolsPeerServerError(`cannot listen on ${e}: another process is already listening there. Stop it, or point ${y} (or options.address) at a different socket — GJSIFY_DEVTOOLS_INSTANCE=<label> lets two devtools-enabled apps run side by side.`,e,`address-in-use`);if(n===`not-a-socket`)throw new DevtoolsPeerServerError(`cannot listen on ${e}: ${t} already exists and is not a socket, so it will NOT be removed. Point ${y} (or options.address) at a free path.`,e,`occupied-by-other-file`);try{x.File.new_for_path(t).delete(null)}catch(n){throw new DevtoolsPeerServerError(`cannot listen on ${e}: ${t} is a socket nothing listens on, but removing it failed (${n}). Delete it by hand, or point ${y} at a free path.`,e,`address-in-use`,n)}console.log(`[gjsify-devtools] reclaimed the stale socket ${t}: nothing was listening on it (an abnormal exit — Ctrl-C, SIGKILL, a crash — leaves the inode behind).`)}function flagsForAddress(e){return e.startsWith(`tcp:`)||e.startsWith(`nonce-tcp:`)?x.DBusServerFlags.NONE:x.DBusServerFlags.AUTHENTICATION_REQUIRE_SAME_USER}function startDevtoolsPeerServer(e,t,n){let r=n&&n!==``?n:defaultListenAddress();clearReclaimableSocket(r);let i;try{i=x.DBusServer.new_sync(r,flagsForAddress(r),x.dbus_generate_guid(),null,null)}catch(e){let t=isAddressInUse(e);throw new DevtoolsPeerServerError(t?`cannot listen on ${r}: the address is already in use (${e}). Stop whatever holds it, or point ${y} (or options.address) at a different address.`:`cannot listen on ${r}: ${e}. Check the address form — \`unix:path=/tmp/app.sock\`, \`unix:tmpdir=/tmp\` or \`nonce-tcp:host=127.0.0.1\`.`,r,t?`address-in-use`:`listen-failed`,e)}let a=new Set;i.connect(`new-connection`,(n,r)=>(a.add(r),r.connect(`closed`,()=>{e.unexport(r),a.delete(r)}),e.export(r,t),!0)),i.start();let o=!1;return{address:i.get_client_address(),objectPath:t,get connectionCount(){return a.size},stop(){if(!o){o=!0,i.stop();for(let t of a)e.unexport(t),!t.is_closed()&&t.close(null,(e,t)=>{try{e.close_finish(t)}catch{}});a.clear()}}}}function writeDevtoolsAddressFile(e,t){try{if(l.mkdir_with_parents(l.path_get_dirname(e),448),!l.file_set_contents(e,`${t}\n`))return null}catch(t){return console.error(`[gjsify-devtools] could not publish the peer address to ${e}: ${t}`),null}try{x.File.new_for_path(e).set_attribute_uint32(`unix::mode`,384,x.FileQueryInfoFlags.NONE,null)}catch(t){console.error(`[gjsify-devtools] could not restrict ${e} to the current user: ${t}`)}return e}function removeDevtoolsAddressFile(e){try{x.File.new_for_path(e).delete(null)}catch{}}const te=e(import.meta.url);let ne;function load$3(){return ne===void 0&&(ne=te(`@gjsify/node-gi/gi`).requireGi(`Graphene`,`1.0`)),ne}__name(load$3,`load`);var re=new Proxy(Object.create(null),{get(e,t){return load$3()[t]},has(e,t){return t in load$3()}});function captureWidget(e){let t=e.get_native()?.get_renderer();if(!t)return{png:null,blocker:`no-renderer`};let n=e.get_width(),r=e.get_height();if(n<=0||r<=0)return{png:null,blocker:`zero-size`};let i=h.WidgetPaintable.new(e),a=h.Snapshot.new();i.snapshot(a,n,r);let o=a.to_node();if(!o)return{png:null,blocker:`empty-snapshot`};let s=new re.Rect;s.init(0,0,n,r);let c=t.render_texture(o,s).save_to_png_bytes().get_data();return c?{png:new Uint8Array(c)}:{png:null,blocker:`empty-png`}}function captureWidgetPng(e){return captureWidget(e).png}function dumpGSettings(e){let t=x.SettingsSchemaSource.get_default()?.lookup(e,!0);if(!t)throw Error(formatDbusErrorMessage(`not-found`,`GSettings schema '${e}' is not installed`));let n=new x.Settings({settings_schema:t}),r={};for(let e of t.list_keys())r[e]=n.get_value(e).recursiveUnpack();return r}const ie=e(import.meta.url);let ae;function load$2(){return ae===void 0&&(ae=ie(`@gjsify/node-gi/gi`).requireGi(`GObject`,`2.0`)),ae}__name(load$2,`load`);var S=new Proxy(Object.create(null),{get(e,t){return load$2()[t]},has(e,t){return t in load$2()}});function parseWidgetPath(e){let t=e.split(`/`).filter(e=>e.length>0);if(t.length===0)return null;let n=t[0].match(/^toplevel:(\d+)$/);if(!n)return null;let r=[];for(let e of t.slice(1)){let t=e.match(/^child:(\d+)$/);if(!t)return null;r.push(Number(t[1]))}return{toplevel:Number(n[1]),children:r}}function buildWidgetPath(e,t){return[`toplevel:${e}`,...t.map(e=>`child:${e}`)].join(`/`)}function widgetType(e){return gtypeName(e)??`GtkWidget`}function gtypeName(e){let t=e;return typeof t?.$typeName==`string`&&t.$typeName.length>0?t.$typeName:t?.constructor?.$gtype?.name??null}function widgetIsA(e,t){let n=gtypeName(e);if(n===null||!t)return!1;if(n===t)return!0;let r=S.type_from_name(n),i=S.type_from_name(t);return!r||!i?!1:S.type_is_a(r,i)}function activateWidget(e){let t=e,n=typeof t.get_parent==`function`?t.get_parent():null,r=!!n&&widgetIsA(n,`GtkListBox`);if(!(r&&widgetIsA(e,`GtkListBoxRow`))&&typeof t.activate==`function`&&t.activate()===!0)return!0;if(r){let t=n,r=!1;return typeof t.select_row==`function`&&(t.select_row(e),r=!0),typeof t.emit==`function`&&(t.emit(`row-activated`,e),r=!0),r}return!1}function sendKeyToWidget(e,t,n){let r=e.observe_controllers(),i=!1;for(let e=0;e<r.get_n_items();e++){let a=r.get_item(e);widgetIsA(a,`GtkEventControllerKey`)&&(a.emit(`key-pressed`,t,0,n),i=!0)}return i}function nthChild(e,t){let n=e.get_first_child(),r=0;for(;n&&r<t;)n=n.get_next_sibling(),r++;return r===t?n:null}function listToplevels(){let e=h.Window.get_toplevels(),t=e.get_n_items(),n=[];for(let r=0;r<t;r++){let t=e.get_item(r);t&&n.push({path:`toplevel:${r}`,type:widgetType(t),title:t.get_title?.()??null,mapped:t.get_mapped(),focused:t.is_active??!1})}return n}function resolveWidgetPath(e){let t=parseWidgetPath(e);if(!t)return null;let n=h.Window.get_toplevels().get_item(t.toplevel);if(!n)return null;for(let e of t.children)if(n=nthChild(n,e),!n)return null;return n}function parseWidgetSelector(e){let t=e.indexOf(`:`),n=(t<0?e:e.slice(0,t)).trim(),r=(t<0?``:e.slice(t+1)).trim();return!n&&!r?null:{type:n,cssClass:r}}function findWidgetPath(e,t,n){let r={path:null};return walkForSelector(e,t,n,r)??r.path}function walkForSelector(e,t,n,r){if(!e.get_visible()||!e.get_mapped())return null;if(!t.cssClass||e.get_css_classes().includes(t.cssClass)){if(!t.type||widgetType(e)===t.type)return n;r.path===null&&widgetIsA(e,t.type)&&(r.path=n)}let i=e.get_first_child(),a=0;for(;i;){let e=walkForSelector(i,t,`${n}/child:${a}`,r);if(e)return e;i=i.get_next_sibling(),a++}return null}function geometryOf(e){if(!e.get_mapped())return;let t=e.get_allocation(),n=t.width+e.get_margin_start()+e.get_margin_end(),r=t.height+e.get_margin_top()+e.get_margin_bottom(),[i,a]=e.measure(h.Orientation.HORIZONTAL,-1),o=n>0?Math.max(n,i):-1,[s,c]=e.measure(h.Orientation.VERTICAL,o),l={width:n,height:r,widthRequest:[i,a],heightRequest:[s,c]};return(n<i||r<s)&&(l.short=!0),l}function dumpTree(e,t,n){let r={path:n,type:widgetType(e),name:e.get_name()||null,cssClasses:e.get_css_classes(),mapped:e.get_mapped(),visible:e.get_visible(),children:[]},i=geometryOf(e);if(i!==void 0&&(r.geometry=i),t<=0)return e.get_first_child()&&(r.truncated=!0),r;let a=e.get_first_child(),o=0;for(;a;)r.children.push(dumpTree(a,t-1,`${n}/child:${o}`)),a=a.get_next_sibling(),o++;return r}function jsonSafe(e){let t=typeof e;return e==null||t===`string`||t===`number`||t===`boolean`?e??null:`[${t}]`}function getWidgetProperty(e,t){let n=e,r=t.replace(/-/g,`_`),i=t.replace(/[-_]([a-z])/g,(e,t)=>t.toUpperCase());for(let e of[t,r,i])if(e in n)return jsonSafe(n[e])}function childIndex(e,t){let n=e.get_first_child(),r=0;for(;n;){if(n===t)return r;n=n.get_next_sibling(),r++}return-1}function pathOfWidget(e){let t=[],n=e,r=n.get_parent();for(;r;){let e=childIndex(r,n);if(e<0)return null;t.unshift(e),n=r,r=n.get_parent()}let i=h.Window.get_toplevels(),a=i.get_n_items();for(let e=0;e<a;e++)if(i.get_item(e)===n)return buildWidgetPath(e,t);return null}function isActiveWindowScope(e){return!e||e===`window`||e===`active`}function frameDelay(e){return new Promise(t=>{l.timeout_add(l.PRIORITY_DEFAULT,e,()=>(t(),l.SOURCE_REMOVE))})}async function captureWidgetWhenRenderable(e,t=12,n=50){let r=null;for(let i=0;i<t;i++){let t=captureWidget(e);if(t.png)return{png:t.png,blocker:null};r=t.blocker,await frameDelay(n)}let i=captureWidget(e);return{png:i.png,blocker:i.png?null:i.blocker??r}}var DevtoolsService=class{constructor(e,t){this._app=e,this._options=t,this._exported=new Map,this._peer=null,this._addressFile=null,this._kinds=new Map,this._extensions=t.extend??[];for(let[e,t]of Object.entries(v))this._kinds.set(e,t);for(let e of this._extensions){for(let[t,n]of Object.entries(e.methodKinds))this._kinds.set(t,n);for(let[t,n]of Object.entries(e.handlers)){let e=n;this[t]=(...n)=>(this._guard(t),e(...n))}}}export(e,t){if(this._exported.has(e))return;let n=buildDevtoolsIfaceXml(this._extensions.flatMap(e=>e.methodsXml??[])),r=x.DBusExportedObject.wrapJSObject(n,this);r.export(e,t),this._exported.set(e,r)}unexport(e){if(e){this._exported.get(e)?.unexport(),this._exported.delete(e);return}for(let e of this._exported.values())e.unexport();this._exported.clear(),this._peer?.stop(),this._peer=null,this._addressFile&&=(removeDevtoolsAddressFile(this._addressFile),null)}attachPeerServer(e,t){this._peer=e,this._addressFile=t??null}get peerAddress(){return this._peer?.address??null}get addressFile(){return this._addressFile}GetStatus(){let e=this._app.get_active_window(),t={appId:this._app.get_application_id()??`unknown`,instance:this._options.instance??`default`,activeWindow:e?{id:e.get_name()||`window`,title:e.get_title()??``,mapped:e.get_mapped()}:null,toplevelCount:h.Window.get_toplevels().get_n_items(),focusedWidget:null,paused:this._isPaused()};for(let e of this._extensions){let n=e.contributeStatus?.();n&&Object.assign(t,n)}return JSON.stringify(t)}async ScreenshotAsync(e,t){try{let n=typeof e?.[0]==`string`?e[0]:``,r=await this._captureScopePng(n);t.return_value(new l.Variant(`(ay)`,[r]))}catch(e){t.return_dbus_error(`org.gjsify.Devtools.Error.Screenshot`,e instanceof Error?e.message:String(e))}}async _captureScopePng(e){let t=this._resolveRootWidget(e);if(!t){if(isActiveWindowScope(e))return new Uint8Array;throw Error(formatDbusErrorMessage(`not-found`,`no widget at '${e}'`))}let n=captureWidget(t.widget);if(n.png)return n.png;let r=t.widget.get_root();r instanceof h.Window&&r.present();let i=await captureWidgetWhenRenderable(t.widget);return i.png?i.png:(console.warn(`[devtools] Screenshot('${e}') has no image: ${i.blocker??`unknown`} after 12 tries. Empty bytes follow.`),new Uint8Array)}ListActions(){let e={app:describeActions(this._actionGroup(`app`)),win:describeActions(this._actionGroup(`win`))};return JSON.stringify(e)}ActivateAction(e,t,n){this._guard(`ActivateAction`);let r=this._scope(e);activateAction(this._requireGroup(r,t),t,this._parseValue(n))}ChangeActionState(e,t,n){this._guard(`ChangeActionState`);let r=this._scope(e);changeActionState(this._requireGroup(r,t),t,this._parseValue(n))}PresentWindow(){this._app.get_active_window()?.present()}ResizeWindow(e,t){this._guard(`ResizeWindow`);let n=this._app.get_active_window();if(!n)throw Error(formatDbusErrorMessage(`unavailable`,`no active window to resize`));let r=Math.max(1,Math.round(e)),i=Math.max(1,Math.round(t));return n.is_maximized()&&n.unmaximize(),n.is_fullscreen()&&n.unfullscreen(),n.set_default_size(r,i),[r,i]}ListToplevels(){return JSON.stringify(listToplevels())}DumpTree(e,t){let n=this._resolveRootWidget(e);if(!n)throw Error(formatDbusErrorMessage(`not-found`,`no widget at '${e||`active window`}'`));return JSON.stringify(dumpTree(n.widget,t>0?t:40,n.path))}GetProperty(e,t){let n=this._resolveRootWidget(e);if(!n)throw Error(formatDbusErrorMessage(`not-found`,`no widget at '${e}'`));let r=getWidgetProperty(n.widget,t);if(r===void 0)throw Error(formatDbusErrorMessage(`not-found`,`widget has no property '${t}'`));return JSON.stringify(r)}GetFocused(){let e=this._app.get_active_window(),t=e?e.get_focus():null;return JSON.stringify(t?{path:pathOfWidget(t),name:t.get_name()||null,type:widgetType(t)}:null)}ActivateWidget(e){this._guard(`ActivateWidget`);let t=this._resolveRootWidget(e);if(!t)throw Error(formatDbusErrorMessage(`not-found`,`no widget at '${e}'`));return activateWidget(t.widget)}FindWidget(e){let t=parseWidgetSelector(e);if(!t)throw Error(formatDbusErrorMessage(`invalid-params`,`empty selector '${e}'`));let n=this._resolveRootWidget(``);return n?findWidgetPath(n.widget,t,n.path)??``:``}SendKey(e,t){this._guard(`SendKey`);let[n,r,i]=h.accelerator_parse(e);if(!n)throw Error(formatDbusErrorMessage(`invalid-params`,`cannot parse accelerator '${e}'`));let a;if(a=t?this._resolveRootWidget(t)?.widget??null:this._app.get_active_window()?.get_focus()??null,!a)throw Error(formatDbusErrorMessage(`not-found`,`no widget at '${t||`focus`}'`));return sendKeyToWidget(a,r,i??0)}DumpGSettings(e){return JSON.stringify(dumpGSettings(e))}DumpCss(){return JSON.stringify(dumpCss())}SwapCss(e,t){return this._guard(`SwapCss`),swapCss(e,t)}_resolveRootWidget(e){if(isActiveWindowScope(e)){let e=this._app.get_active_window();return e?{widget:e,path:pathOfWidget(e)??`toplevel:0`}:null}let t=resolveWidgetPath(e);return t?{widget:t,path:e}:null}_isPaused(){return this._options.paused?.()??!1}_guard(e){let t=this._kinds.get(e);if(!t)throw Error(formatDbusErrorMessage(`internal`,`unclassified devtools method '${e}'`));if(t===`mutating`&&this._isPaused())throw Error(formatDbusErrorMessage(`paused`,`${e} rejected — external control is paused. Read-only methods keep working.`))}_scope(e){return e===`app`?`app`:`win`}_actionGroup(e){if(e===`app`)return this._app;if(this._options.winActionGroup)return this._options.winActionGroup;let t=this._app.get_active_window();return t instanceof h.ApplicationWindow?t:null}_requireGroup(e,t){let n=this._actionGroup(e);if(!n)throw Error(formatDbusErrorMessage(`unavailable`,`no '${e}' action group`));if(!n.has_action(t))throw Error(formatDbusErrorMessage(`not-found`,`unknown action ${e}.${t}`));return n}_parseValue(e){if(!e||e===`null`)return null;try{return JSON.parse(e)}catch{throw Error(formatDbusErrorMessage(`invalid-params`,`value_json is not valid JSON: ${e}`))}}};const C=`DBUS_SESSION_BUS_ADDRESS`,oe=new Set;function envEnabled(){return isDevtoolsEnabledValue(l.getenv(`GJSIFY_DEVTOOLS`))}function envValue(e){let t=l.getenv(e);return t&&t!==``?t:null}function sessionBusUsable(){if(!envValue(C))return!1;try{return x.bus_get_sync(x.BusType.SESSION,null),!0}catch{return!1}}function chooseDevtoolsTransport(e){return e.requestedAddress?{kind:`peer`,address:e.requestedAddress,reason:`requested`}:e.hasAppConnection?{kind:`session-bus`}:e.sessionBusUsable?{kind:`unregistered`}:{kind:`peer`,address:null,reason:`no-session-bus`}}function describeMissingConnection(e,t){return e?t?`[gjsify-devtools] the session bus answers but this application is not registered on it yet — call installDevtools() from the GtkApplication "startup" handler (the bus connection and object path exist only after registration).`:`[gjsify-devtools] ${C} is set (${e}) but no bus answers there — using the bus-less peer transport instead. On macOS this is the usual state: Homebrew's dbus listens on launchd, so the advertised address only works while that socket is live.`:`[gjsify-devtools] this machine has no session bus (${C} is unset) — using the bus-less peer transport instead. Point the bridge at the address below, or set ${y} on both the app and \`gjsify debug\` to pin it yourself.`}function installDevtools(e,t={}){if(!(t.enabled??envEnabled()))return null;let n=t.instance??envValue(`GJSIFY_DEVTOOLS_INSTANCE`)??void 0,r=new DevtoolsService(e,{...t,instance:n});try{return exportDevtools(e,r,t,n)}catch(e){return r.unexport(),console.error(`[gjsify-devtools] devtools stayed OFF, the app is unaffected — ${describeInstallFailure(e)}`),null}}function describeInstallFailure(e){return e instanceof DevtoolsPeerServerError||e instanceof Error?e.message:String(e)}function exportDevtools(e,t,n,r){let i=e.get_is_registered(),a=i?e.get_dbus_connection():null,o=i?e.get_dbus_object_path():null,s=envValue(C),c=!!(a&&o),u=c||sessionBusUsable(),d=chooseDevtoolsTransport({requestedAddress:n.address??envValue(y),hasAppConnection:c,sessionBusUsable:u}),f=e.get_application_id()??`unknown`,p=`${o??appIdToObjectPath(f)}/devtools`;if((d.kind===`unregistered`||d.kind===`peer`&&d.reason===`no-session-bus`)&&console.error(describeMissingConnection(s,u)),d.kind===`session-bus`&&a)t.export(a,p),console.log(`[gjsify-devtools] exported ${_} at ${p} (dest ${f})`);else if(d.kind===`peer`){let n=startDevtoolsPeerServer(t,p,d.address??void 0),i=writeDevtoolsAddressFile(devtoolsAddressFilePath(l.get_user_runtime_dir(),f,r),n.address);t.attachPeerServer(n,i),console.log(`[gjsify-devtools] exported ${_} at ${p} (peer address ${n.address}${i?`, published to ${i}`:``})`),i&&e.connect(`shutdown`,()=>removeDevtoolsAddressFile(i))}return oe.add(t),t}const se=`&(?![a-zA-Z][a-zA-Z0-9]*;|#\\d+;|#x[0-9a-fA-F]+;)|<(?![a-zA-Z/!?])`;RegExp(se),RegExp(se,`g`);const ce=[`AdwNavigationSplitView`,`GtkListBox`,`AdwOverlaySplitView`];function probeEnabled(){let e=l.getenv(`GJSIFY_STORYBOOK_PROBE`);if(e==null)return!1;let t=e.toLowerCase();return t!==``&&t!==`0`&&t!==`false`}const le=5e3;function exitIfNotDrained(){if(typeof process>`u`||typeof process.exit!=`function`)return;let e=setTimeout(()=>{console.error(`STORYBOOK PROBE: host still alive ${le}ms after quit(), exiting`),process.exit(process.exitCode??0)},le);typeof e==`object`&&typeof e.unref==`function`&&e.unref()}function collectTypes(e,t){t.add(e.type);for(let n of e.children)collectTypes(n,t)}function installStorybookProbe(e,t,n={}){let r=n.requireChrome??ce,i=n.out??l.getenv(`GJSIFY_STORYBOOK_PROBE_OUT`)??void 0,a=n.timeoutMs??8e3,o=n.storyWidget??l.getenv(`GJSIFY_STORYBOOK_PROBE_STORY_WIDGET`)??void 0,s=t.controller.listStories(),c=[...new Set(s.map(e=>e.category))],u=n.story??l.getenv(`GJSIFY_STORYBOOK_PROBE_STORY`)??s[0]?.title,d=u?t.openStoryByTitle(u):!1,f=t.activeStory,p=new Set;collectTypes(dumpTree(t,60,`toplevel:0`),p);let m=r.filter(e=>!p.has(e)),h=new Set;f&&collectTypes(dumpTree(f,60,`story`),h);let g=h.size,_=o?h.has(o):null,finish=t=>{let n=JSON.stringify(t);if(t.ok)console.log(`STORYBOOK PROBE: PASS ${n}`);else{console.error(`STORYBOOK PROBE: FAIL ${n}`);try{typeof process<`u`&&(process.exitCode=1)}catch{}}if(i)try{l.file_set_contents(i,JSON.stringify(t,null,2))}catch{}e.quit(),exitIfNotDrained()},v=0;l.timeout_add(l.PRIORITY_DEFAULT,100,()=>{v+=100;let e=captureWidgetPng(t),n=t.get_width()>0&&t.get_height()>0;if(!e&&!(v>=a))return l.SOURCE_CONTINUE;let i=f?captureWidgetPng(f):null,p=s.length>=1&&c.length>=1&&m.length===0&&d&&f!=null&&g>1,y;return s.length<1?y=`no stories registered`:c.length<1?y=`no categories`:m.length>0?y=`chrome missing: ${m.join(`, `)}`:!d||f==null?y=`could not open story: ${u??`(none)`}`:g<=1&&(y=`opened story rendered an empty subtree`),p&&o&&!h.has(o)&&(p=!1,y=`story widget ${o} not found in the opened story subtree`),p&&n&&(!e||e.length===0)&&(p=!1,y=`window realized (${t.get_width()}x${t.get_height()}) but the GSK capture was empty`),finish({ok:p,reason:y,stories:s.length,categories:c,opened:d,activeStory:f?f.meta.title:null,requiredChrome:r,missingChrome:m,storySubtreeWidgets:g,storyWidgetPresent:_,windowRealized:n,windowPngBytes:e?e.length:0,storyPngBytes:i?i.length:0}),l.SOURCE_REMOVE})}const ue=e(import.meta.url);let de;function load$1(){return de===void 0&&(de=ue(`@gjsify/node-gi/gi`).requireGi(`Adw`,`1`)),de}__name(load$1,`load`);var w=new Proxy(Object.create(null),{get(e,t){return load$1()[t]},has(e,t){return t in load$1()}});const fe={UNKNOWN:0,CUSTOM:1,GPL_2_0:2,GPL_3_0:3,LGPL_2_1:4,LGPL_3_0:5,BSD:6,MIT_X11:7,ARTISTIC:8,GPL_2_0_ONLY:9,GPL_3_0_ONLY:10,LGPL_2_1_ONLY:11,LGPL_3_0_ONLY:12,AGPL_3_0:13,AGPL_3_0_ONLY:14,BSD_3:15,APACHE_2_0:16,MPL_2_0:17,"0BSD":18};fe.GPL_2_0_ONLY,fe.GPL_3_0_ONLY,fe.UNKNOWN;const pe=[`blue`,`teal`,`green`,`yellow`,`orange`,`red`,`pink`,`purple`,`slate`],me={blue:`#3584e4`,teal:`#2190a4`,green:`#3a944a`,yellow:`#c88800`,orange:`#ed5b00`,red:`#e62d42`,pink:`#d56199`,purple:`#9141ac`,slate:`#6f8396`};function parseHex(e){let t=/^#([0-9a-f]{6})$/i.exec(e.trim());if(!t)return null;let n=Number.parseInt(t[1],16);return[(n>>16&255)/255,(n>>8&255)/255,(n&255)/255]}function toHex(e,t,n){let channel=e=>Math.round(Math.min(1,Math.max(0,e))*255).toString(16).padStart(2,`0`);return`#${channel(e)}${channel(t)}${channel(n)}`}const toLinear=e=>e<=.04045?e/12.92:((e+.055)/1.055)**2.4,fromLinear=e=>e<=.0031308?e*12.92:1.055*e**(1/2.4)-.055;function linearToOklab(e,t,n){let r=Math.cbrt(.4122214708*e+.5363325363*t+.0514459929*n),i=Math.cbrt(.2119034982*e+.6806995451*t+.1073969566*n),a=Math.cbrt(.0883024619*e+.2817188376*t+.6299787005*n);return[.2104542553*r+.793617785*i-.0040720468*a,1.9779984951*r-2.428592205*i+.4505937099*a,.0259040371*r+.7827717662*i-.808675766*a]}function oklabToLinear(e,t,n){let r=(e+.3963377774*t+.2158037573*n)**3,i=(e-.1055613458*t-.0638541728*n)**3,a=(e-.0894841775*t-1.291485548*n)**3;return[4.0767416621*r-3.3077115913*i+.2309699292*a,-1.2684380046*r+2.6097574011*i-.3413193965*a,-.0041960863*r-.7034186147*i+1.707614701*a]}function adwaitaStandaloneColor(e,t){let n=parseHex(e);if(!n)return e;let[r,i,a]=linearToOklab(toLinear(n[0]),toLinear(n[1]),toLinear(n[2])),[o,s,c]=oklabToLinear(t?Math.max(r,.85):Math.min(r,.5),i,a);return toHex(fromLinear(o),fromLinear(s),fromLinear(c))}function adwaitaAccentBgColor(e){return me[e]}function adwaitaAccentColor(e,t){return adwaitaStandaloneColor(me[e],t)}var UnsupportedGObjectError=class extends Error{constructor(e,t){super(t),this.name=`UnsupportedGObjectError`,this.feature=e}};const he=new WeakSet;function makeType(e){let t=Object.freeze({name:e});return he.add(t),t}makeType(`gchararray`),makeType(`gboolean`),makeType(`gint`),makeType(`guint`),makeType(`gdouble`);const T={READABLE:1,WRITABLE:2,READWRITE:3,CONSTRUCT:4,CONSTRUCT_ONLY:8};var ge=class ParamSpec{constructor(e,t,n,r,i,a,o,s){this.kind=e,this.name=t,this.nick=n,this.blurb=r,this.flags=i,this.defaultValue=a,this.minimum=o,this.maximum=s}static boolean(e,t,n,r,i){return new ParamSpec(`boolean`,e,t,n,r,i)}static string(e,t,n,r,i){return new ParamSpec(`string`,e,t,n,r,i)}static int(e,t,n,r,i,a,o){return new ParamSpec(`int`,e,t,n,r,o,i,a)}static uint(e,t,n,r,i,a,o){return new ParamSpec(`uint`,e,t,n,r,o,i,a)}static double(e,t,n,r,i,a,o){return new ParamSpec(`double`,e,t,n,r,o,i,a)}get_default_value(){return this.defaultValue}};const E={GTypeName:Symbol(`GType name`),GTypeFlags:Symbol(`GType flags`),interfaces:Symbol(`GType interfaces`),properties:Symbol(`GObject properties`),signals:Symbol(`GObject signals`),requires:Symbol(`GObject interface requires`),template:Symbol(`GTK widget template`),cssName:Symbol(`GTK widget CSS name`),children:Symbol(`GTK widget template children`),internalChildren:Symbol(`GTK widget template internal children`)};E.GTypeName,E.template,E.internalChildren,E.properties,E.signals,E.cssName,E.children,E.interfaces,E.requires,E.GTypeFlags;const _e=new WeakMap;function chainOf(e){let t=[];for(let n=e;typeof n==`function`;n=Object.getPrototypeOf(n)){let e=_e.get(n);e&&t.push(e)}return t}function chainOfInstance(e){return chainOf(e.constructor)}function typeNameOf(e,t){return t[0]?.typeName??e.constructor.name}function aliasesOf(e){return[e,e.replace(/-/g,`_`),e.replace(/-([a-z])/g,(e,t)=>t.toUpperCase())]}function findProperty(e,t){for(let n of e)for(let e of n.properties)if(aliasesOf(e.name).includes(t))return e}function findSignal(e,t){for(let n of e)if(Object.prototype.hasOwnProperty.call(n.signals,t))return n.signals[t]}const ve=new WeakMap;let ye=0;function stateOf$1(e){let t=ve.get(e);return t||(t={values:new Map,handlers:new Map,connections:new Map},ve.set(e,t)),t}__name(stateOf$1,`stateOf`);function parseSignal(e){let t=e.indexOf(`::`);return t===-1?{name:e}:{name:e.slice(0,t),detail:e.slice(t+2)}}function addHandler(e,t,n){let r=stateOf$1(e),i=++ye,a=r.handlers.get(t)??[];return a.push({id:i,handler:n}),r.handlers.set(t,a),r.connections.set(i,()=>{a.splice(a.findIndex(e=>e.id===i),1)}),i}function runHandlers(e,t,n){let r=stateOf$1(e);for(let{id:i,handler:a}of(r.handlers.get(t)??[]).slice())r.connections.has(i)&&a(e,...n)}function connectInstance(e,t,n){let r=chainOfInstance(e),i=typeNameOf(e,r),{name:a,detail:o}=parseSignal(t),foreign=()=>{let a=r[0]?.door;if(!a)throw Error(`No signal '${t}' on object '${i}'`);let o=++ye,s=a.listen(e,t,n);return stateOf$1(e).connections.set(o,s),o};if(a===`notify`){if(o===void 0)throw new UnsupportedGObjectError(`connect("notify")`,`connect('notify') without a property is outside the GObject subset; connect 'notify::<property>' on '${i}'.`);let t=findProperty(r,o);return t?addHandler(e,`notify::${t.name}`,n):foreign()}if(findSignal(r,a)){if(o!==void 0)throw Error(`Signal '${a}' on object '${i}' has no detail`);return addHandler(e,a,n)}return foreign()}function disconnectInstance(e,t){let n=stateOf$1(e),r=n.connections.get(t);if(!r)throw Error(`No handler with id ${t} is connected to ${String(e)}`);n.connections.delete(t),r()}function emitInstance(e,t,...n){let r=chainOfInstance(e),i=typeNameOf(e,r),a=findSignal(r,t);if(a){if(n.length!==a.length)throw Error(`Signal '${t}' on ${i} requires ${a.length} args got ${n.length}`);runHandlers(e,t,n);return}let o=r[0]?.door;if(!o)throw Error(`No signal '${t}' on object '${i}'`);o.dispatch(e,t,n)}function notifyInstance(e,t){let n=chainOfInstance(e),r=findProperty(n,t);if(r){runHandlers(e,`notify::${r.name}`,[r]);return}let i=n[0]?.door;if(!i)throw Error(`No property ${t} on ${typeNameOf(e,n)}`);i.dispatch(e,`notify::${t}`,[])}function generateAccessors(e,t){let{name:n,flags:r}=e,i=r&T.READABLE,a=r&T.WRITABLE,o=t??{configurable:!0,enumerable:!0};return i&&a?!o.get&&!o.set?(o.get=function(){let{values:t}=stateOf$1(this);return t.has(n)||t.set(n,e.get_default_value()),t.get(n)},o.set=function(e){let{values:t}=stateOf$1(this);e!==t.get(n)&&(t.set(n,e),this.notify(n))}):o.get?o.set||=function(){throw Error(`getter defined without setter for property ${n}`)}:o.get=function(){throw Error(`setter defined without getter for property ${n}`)}:i&&!o.get?o.get=function(){throw Error(`missing getter for read-only property ${n}`)}:a&&!o.set&&(o.set=function(){throw Error(`missing setter for write-only property ${n}`)}),o}function checkAccessors(e,t){let{name:n,flags:r}=t;if(r&T.CONSTRUCT_ONLY)return;let[,i,a]=aliasesOf(n),own=t=>Object.getOwnPropertyDescriptor(e,t),o=own(n),s=o,c=n.includes(`-`),l,u;c&&(l=own(i),u=own(a),o??=l,o??=u);let d=r&T.READABLE,f=r&T.WRITABLE;(!o||d&&!o.get||f&&!o.set)&&(o=generateAccessors(t,o)),s||Object.defineProperty(e,n,o),c&&(l||Object.defineProperty(e,i,o),u||Object.defineProperty(e,a,o))}function defineConstructOnly(e,t,n){let{values:r}=stateOf$1(e);r.set(t.name,n);for(let n of new Set(aliasesOf(t.name)))Object.defineProperty(e,n,{get:()=>r.get(t.name),enumerable:!0,configurable:!0})}function bindProperties(e,t,n,r,i=[]){let a=i.includes(`invert-boolean`),o=!1,transfer=(e,t,n,r)=>()=>{if(!o){o=!0;try{let i=e[t];n[r]=a?!i:i}finally{o=!1}}},s=transfer(e,t,n,r),c=[[e,e.connect(`notify::${t}`,s)]];if(i.includes(`bidirectional`)){let i=transfer(n,r,e,t);c.push([n,n.connect(`notify::${r}`,i)])}return i.includes(`sync-create`)&&s(),{unbind(){for(let[e,t]of c.splice(0))e.disconnect(t)}}}function createClosure(e,t,n,r){let i=r??e;if(n)throw new UnsupportedGObjectError(`swapped`,`Unsupported template signal flag "swapped"`);let a=e[t];if(a===void 0)throw Error(`A handler called ${t} was not defined on ${String(e)}`);return a.bind(i)}function scopeOf(e){return{instance:e,handler:(t,n)=>createClosure(e,t,n?.flags?.includes(`swapped`)??!1,n?.object),bind:bindProperties}}function constructRegistered(e,t={}){let n=chainOfInstance(e),r={},i=new Map;for(let[e,a]of Object.entries(t)){let t=findProperty(n,e);t?i.set(t,a):r[e]=a}let a=[];for(let t of[...n].reverse())t.template&&a.push([t,t.door.createFromTree(t.template,scopeOf(e),e)]);for(let t of n)for(let n of t.properties)n.flags&T.CONSTRUCT_ONLY&&defineConstructOnly(e,n,i.has(n)?i.get(n):n.get_default_value());for(let[t,n]of i)t.flags&T.CONSTRUCT_ONLY||(e[t.name]=n);for(let[t,n]of a){for(let r of t.internalChildren){let i=n.objects[r];if(i===void 0)throw Error(`Template of ${t.typeName} has no child object '${r}' for InternalChildren`);e[`_${r.replace(/-/g,`_`)}`]=i}t.door.attach(e,n)}return r}const be=Symbol(`GIR type`);function registerBaseClass(e,t,n,r=[]){let missing=e=>{throw Error(`No signal '${e}' on object '${t}'`)},i=makeType(t);Object.defineProperty(e,"$gtype",{get:()=>i,enumerable:!1,configurable:!1});for(let t of r)checkAccessors(e.prototype,t);_e.set(e,{klass:e,typeName:t,gtype:i,properties:r,signals:n,internalChildren:[],door:{name:t,dispatch:(e,t)=>missing(t),listen:(e,t)=>missing(t),createFromTree:()=>missing(`template`),attach(){},register(){}}})}var GObjectObject=class{constructor(e){let t=constructRegistered(this,e),n=Object.keys(t)[0];if(n!==void 0)throw Error(`No property ${n} on ${typeNameOf(this,chainOfInstance(this))}`)}notify(e){notifyInstance(this,e)}connect(e,t){return connectInstance(this,e,t)}disconnect(e){disconnectInstance(this,e)}emit(e,...t){emitInstance(this,e,...t)}};function refuse$1(e,t){return new UnsupportedGObjectError(e,`${e} ${t}, which is outside the Gio subset (ADR 0098 § 1).`)}__name(refuse$1,`refuse`);var ActionRegistry=class{constructor(){this._actions=new Map}add(e){this._actions.set(e.name,e)}remove(e){this._actions.delete(e)}lookup_action(e){return this._actions.get(e)??null}has(e){return this._actions.has(e)}list(){return[...this._actions.keys()]}};const xe=new WeakMap;function actionRegistryOf(e,t=!0){let n=xe.get(e);return n===void 0&&t&&(n=new ActionRegistry,xe.set(e,n)),n}function requireAction(e){let t=e;if(typeof t?.name!=`string`||typeof t.activate!=`function`)throw TypeError(`add_action: needs a Gio.Action (a Gio.SimpleAction)`);return t}const Se={add_action(e){actionRegistryOf(this).add(requireAction(e))},lookup_action(e){return actionRegistryOf(this,!1)?.lookup_action(e)??null},remove_action(e){actionRegistryOf(this,!1)?.remove(e)}},Ce={has_action(e){return actionRegistryOf(this,!1)?.has(e)??!1},list_actions(){return actionRegistryOf(this,!1)?.list()??[]},activate_action(e,t=null){if(t!==null)throw refuse$1(`activate_action with a parameter`,`needs a GLib.Variant`);actionRegistryOf(this,!1)?.lookup_action(e)?.activate(null)},get_action_enabled(e){return actionRegistryOf(this,!1)?.lookup_action(e)?.enabled??!1}};function installActionMap(e,t=!1){let n=t?{...Se,...Ce}:{...Se};for(let[t,r]of Object.entries(n))Object.defineProperty(e,t,{value:r,writable:!0,configurable:!0,enumerable:!1})}const we=new WeakMap;function linkWindow(e,t){t===null?we.delete(e):we.set(e,t)}const Te={NONE:0,FLAGS_NONE:0,DEFAULT_FLAGS:0,IS_SERVICE:1,IS_LAUNCHER:2,HANDLES_OPEN:4,HANDLES_COMMAND_LINE:8,SEND_ENVIRONMENT:16,NON_UNIQUE:32,CAN_OVERRIDE_APP_ID:64,ALLOW_REPLACEMENT:128,REPLACE:256};function isValidApplicationId(e){if(typeof e!=`string`||e.length>255||e===``)return!1;let t=e.split(`.`);return t.length>=2&&t.every(e=>/^[A-Za-z_-][A-Za-z0-9_-]*$/.test(e))}function refuse(e,t){return new UnsupportedGObjectError(e,`${e} ${t}, which is outside the Gio subset (ADR 0098 § 1).`)}const Ee=`register.hold.release.mark_busy.unmark_busy.open.set_inactivity_timeout.send_notification.withdraw_notification.register_session.set_option_context_parameter_string.set_option_context_summary.set_option_context_description.add_main_option.add_main_option_entries.add_option_group.set_resource_base_path.get_resource_base_path.set_flags.get_is_remote.get_is_registered.get_dbus_connection.get_dbus_object_path.bind_busy_property.add_action_entries.set_default`.split(`.`),De=[`is_remote`,`is_registered`,`is_busy`,`resource_base_path`,`inactivity_timeout`,`action_group`],Oe=[`open`,`command-line`,`handle-local-options`,`shutdown`,`name-lost`],ke=[`set_accels_for_action`,`get_accels_for_action`,`list_action_descriptions`,`get_actions_for_accel`,`set_menubar`,`get_menubar`,`get_menu_by_id`,`set_app_menu`,`get_app_menu`,`get_menu_by_id`,`inhibit`,`uninhibit`],Ae=new WeakMap;let je=null;function rememberDefault(e){je??=e}function stateOf(e){let t=Ae.get(e);return t===void 0&&(t={id:null,windows:[],running:!1,resolve:()=>{}},Ae.set(e,t)),t}function hostOf(e){let t=e.constructor.host;if(t===void 0)throw Error(`Gio.Application: this class has no ApplicationHost; use the Gtk.Application of a port.`);return t}var GioApplicationBase=class extends GObjectObject{static{this[be]=`Gio.Application`}static id_is_valid(e){return isValidApplicationId(e)}static get_default(){return je}constructor(e){super(e),rememberDefault(this)}get application_id(){return stateOf(this).id}set application_id(e){let t=e??null;if(t!==null&&!isValidApplicationId(t))throw Error(`Gio.Application: '${String(t)}' is not a valid application id (g_application_id_is_valid)`);let n=stateOf(this);if(n.running)throw Error(`Gio.Application: the application id cannot change while it runs`);n.id!==t&&(n.id=t,this.notify(`application-id`))}get flags(){return 0}set flags(e){if(e!==void 0&&e!==Te.NONE)throw refuse(`Gio.ApplicationFlags value ${String(e)}`,`is a flag other than the default`)}get_application_id(){return this.application_id}set_application_id(e){this.application_id=e}get_flags(){return 0}vfunc_startup(){}vfunc_activate(){}run(){throw refuse(`Gio.Application.run()`,`blocks, and a page cannot; use runAsync()`)}connect(e,t){let n=e.split(`::`)[0]??e;if(Oe.includes(n))throw refuse(`the '${n}' signal`,`is not emitted`);return super.connect(e,t)}async runAsync(e=[]){let t=stateOf(this);if(t.running)throw Error(`Gio.Application.runAsync(): the application is already running`);let n=hostOf(this);t.running=!0;let r=new Promise(e=>{t.resolve=e}),i,a=!1,body=()=>{try{if(this.vfunc_startup(),this.emit(`startup`),this.emit(`activate`),this.vfunc_activate(),t.running&&t.windows.length===0&&n.requiresWindow)throw Error(`Gio.Application.runAsync(): activate added no window on ${n.name}; a window must be added synchronously by activate (ADR 0098 § 3).`)}catch(e){i=e,a=!0}return t.windows[0]??null};try{await n.start(body)}catch(e){i=e,a=!0}if(a)throw t.running=!1,n.exit(),i;return t.windows.length===0&&this._finish(0),r}quit(){let e=stateOf(this);if(e.running){for(let t of e.windows.splice(0))linkWindow(t,null),hostOf(this).detach(t);this._finish(0)}}_finish(e){let t=stateOf(this);t.running&&(t.running=!1,t.resolve(e),hostOf(this).exit())}};registerBaseClass(GioApplicationBase,`GApplication`,{startup:[],activate:[]},[ge.string(`application-id`,``,``,T.READWRITE|T.CONSTRUCT,null),ge.uint(`flags`,``,``,T.READWRITE|T.CONSTRUCT,0,4294967295,0)]),installActionMap(GioApplicationBase.prototype,!0);function refuseMembers(e,t,n){for(let n of t)Object.defineProperty(e,n,{value:()=>{throw refuse(`${n}()`,`is not implemented`)},writable:!0,configurable:!0,enumerable:!1});for(let t of n)Object.defineProperty(e,t,{get(){throw refuse(`the '${t}' property`,`is not implemented`)},configurable:!0,enumerable:!1})}refuseMembers(GioApplicationBase.prototype,Ee,De);function withGtkApplication(e){class GtkApplication extends e{get active_window(){return stateOf(this).windows[0]??null}get_active_window(){return this.active_window}get_windows(){return[...stateOf(this).windows]}add_window(e){let t=stateOf(this);t.windows.includes(e)||(t.windows.unshift(e),linkWindow(e,this))}remove_window(e){let t=stateOf(this),n=t.windows.indexOf(e);n!==-1&&(t.windows.splice(n,1),linkWindow(e,null),t.windows.length===0&&this._finish(0))}}return refuseMembers(GtkApplication.prototype,ke,[]),GtkApplication}withGtkApplication(GioApplicationBase),Math.PI*.35,Math.PI*.015,Math.PI*.9;const Me=Math.PI*.9,Ne=Math.PI*.7,Pe=Math.PI*1.1,Fe=Math.PI*1.35,Ie=Me+Pe+Fe-Ne;53*Math.PI*2/Ie,Pe-Ne/2,new Set(`ADC.AND.ASL.BCC.BCS.BEQ.BIT.BMI.BNE.BPL.BRK.BVC.BVS.CLC.CLD.CLI.CLV.CMP.CPX.CPY.DEC.DEX.DEY.EOR.INC.INX.INY.JMP.JSR.LDA.LDX.LDY.LSR.NOP.ORA.PHA.PHP.PLA.PLP.ROL.ROR.RTI.RTS.SBC.SEC.SED.SEI.STA.STX.STY.TAX.TAY.TSX.TXA.TXS.TYA`.split(`.`));const Le={system:`Follow system`,light:`Light`,dark:`Dark`},Re={blue:`Blue`,teal:`Teal`,green:`Green`,yellow:`Yellow`,orange:`Orange`,red:`Red`,pink:`Pink`,purple:`Purple`,slate:`Slate`};var StorybookAppearance=class{constructor(){this._provider=null,this._applying=!1,this._styleManager=w.StyleManager.get_default(),this.settings=new StorybookSettings(()=>this._styleManager.get_dark()),this.settings.subscribe(e=>this._apply(e)),this._styleManager.connect(`notify::dark`,()=>this.settings.systemChanged()),this._apply(this.settings.state)}_apply(e){if(!this._applying){this._applying=!0;try{this._styleManager.set_color_scheme(e.colorScheme===`light`?w.ColorScheme.FORCE_LIGHT:e.colorScheme===`dark`?w.ColorScheme.FORCE_DARK:w.ColorScheme.DEFAULT),this._applyAccent(this.settings.resolvedAccent)}finally{this._applying=!1}}}_applyAccent(e){let t=f.Display.get_default();if(!t)return;if(!this._provider){if(!e)return;this._provider=new h.CssProvider,h.StyleContext.add_provider_for_display(t,this._provider,h.STYLE_PROVIDER_PRIORITY_APPLICATION)}if(!e){this._provider.load_from_string(``);return}let n=adwaitaAccentBgColor(e),r=adwaitaAccentColor(e,this.settings.resolvedDark);this._provider.load_from_string(`:root { --accent-bg-color: ${n}; --accent-color: ${r}; }`)}};function buildSwatch(e,t,n){let r=new h.CheckButton({tooltip_text:t,halign:h.Align.CENTER,valign:h.Align.CENTER,focus_on_click:!1});for(let t of e)r.add_css_class(t);return r.update_property([h.AccessibleProperty.LABEL],[t]),n&&r.set_group(n),r}function buildSwatchCard(e=!1){let t=new w.WrapBox({align:.5,child_spacing:8,line_spacing:8,margin_top:12,margin_bottom:12,margin_start:12,margin_end:12}),n=new w.Bin({child:t,hexpand:!0});return n.add_css_class(`card`),e&&n.add_css_class(`storybook-card-attached`),{card:n,row:t}}function buildAppearanceDialog(e){let t=e.settings,n=new w.PreferencesPage,r=new w.PreferencesGroup({title:`Style`}),{card:i,row:o}=buildSwatchCard(),s=null,c=new Map;for(let e of a){let n=buildSwatch([`storybook-swatch`,`storybook-scheme-swatch`,`storybook-scheme-${e}`],Le[e],s);s??=n,n.set_active(t.colorScheme===e),n.connect(`toggled`,()=>{n.get_active()&&(t.colorScheme=e)}),c.set(e,n),o.append(n)}r.add(i),n.add(r);let l=new w.PreferencesGroup({title:`Accent colour`});l.add_css_class(`storybook-attached-group`);let u=new w.SwitchRow({title:`Use a custom accent colour`,subtitle:`Off follows the desktop, which owns the accent`,active:t.accentMode===`custom`});l.add(u);let{card:d,row:f}=buildSwatchCard(!0),p=null,m=new Map;for(let e of pe){let n=buildSwatch([`storybook-swatch`],Re[e],p);p??=n,n.set_active(t.accent===e);let r=new h.CssProvider;r.load_from_string(`checkbutton { background-color: ${adwaitaAccentBgColor(e)}; }`),n.get_style_context().add_provider(r,h.STYLE_PROVIDER_PRIORITY_APPLICATION),n.connect(`toggled`,()=>{n.get_active()&&(t.accent=e)}),m.set(e,n),f.append(n)}f.set_sensitive(t.accentMode===`custom`),u.connect(`notify::active`,()=>{t.accentMode=u.get_active()?`custom`:`system`}),l.add(d),n.add(l),t.subscribe(e=>{let t=c.get(e.colorScheme);t&&!t.get_active()&&t.set_active(!0);let n=m.get(e.accent);n&&!n.get_active()&&n.set_active(!0);let r=e.accentMode===`custom`;u.get_active()!==r&&u.set_active(r),f.set_sensitive(r)});let g=new w.PreferencesDialog({title:`Appearance`});return g.add(n),g}function adwControlWidgetFactory(){return{text(e,t){let n=new w.EntryRow({title:e});t&&n.set_tooltip_text(t);let r=null;return n.connect(`changed`,()=>r?.(n.get_text())),{node:n,get:()=>n.get_text(),set:e=>n.set_text(e),onChange:e=>{r=e}}},boolean(e,t){let n=new w.SwitchRow({title:e,subtitle:t??``}),r=null;return n.connect(`notify::active`,()=>r?.(n.get_active())),{node:n,get:()=>n.get_active(),set:e=>n.set_active(e),onChange:e=>{r=e}}},number(e){let t=w.SpinRow.new_with_range(e.min??0,e.max??100,e.step??1);t.set_title(e.label||e.name),e.description&&t.set_subtitle(e.description);let n=null;return t.connect(`changed`,()=>n?.(t.get_value())),{node:t,get:()=>t.get_value(),set:e=>t.set_value(e),onChange:e=>{n=e}}},range(e){return buildRangeWidget(e)},select(e){return buildSelectWidget(e)},color(e,t){return buildColorWidget(e,t)}}}function buildRangeWidget(e){let t=e.min??0,n=e.max??100,r=e.step??1,i=typeof e.min==`number`?e.min:0,a=Number.isInteger(r)&&Number.isInteger(i),o=new h.Adjustment({lower:t,upper:n,step_increment:r,value:i});o.step_increment=r;let s=new h.ListBoxRow({selectable:!1,activatable:!1});s.add_css_class(`story-range-row`);let c=new h.Box({orientation:h.Orientation.VERTICAL,spacing:6,margin_top:12,margin_bottom:12,margin_start:12,margin_end:12}),l=new h.Box({orientation:h.Orientation.HORIZONTAL,spacing:12}),u=new h.Label({label:e.label||e.name,halign:h.Align.START,hexpand:!0,ellipsize:3});u.add_css_class(`heading`);let formatValue=e=>a?String(Math.round(e)):e.toFixed(2),d=new h.Label({label:formatValue(i),halign:h.Align.END});if(d.add_css_class(`numeric`),d.add_css_class(`dim-label`),l.append(u),l.append(d),c.append(l),e.description){let t=new h.Label({label:e.description,halign:h.Align.START,xalign:0,wrap:!0,max_width_chars:32});t.add_css_class(`caption`),t.add_css_class(`dim-label`),c.append(t)}let f=new h.Scale({orientation:h.Orientation.HORIZONTAL,adjustment:o,draw_value:!1,hexpand:!0}),p=null,m=!1;return f.connect(`value-changed`,()=>{if(m)return;let e=f.get_value();if(a){let t=Math.round(e);if(t!==e){f.set_value(t);return}e=t}d.set_label(formatValue(e)),p?.(e)}),c.append(f),s.set_child(c),{node:s,get:()=>f.get_value(),set:e=>{m=!0,f.set_value(e),m=!1,d.set_label(formatValue(e))},onChange:e=>{p=e}}}function buildSelectWidget(e){let t=e.options??[],n=h.StringList.new(t.map(e=>e.label)),r=new w.ComboRow({title:e.label||e.name,subtitle:e.description??``,model:n}),i=null;return r.connect(`notify::selected`,()=>i?.(r.get_selected())),{node:r,get:()=>r.get_selected(),set:e=>r.set_selected(e),onChange:e=>{i=e}}}function buildColorWidget(e,t){let n=new w.ActionRow({title:e,subtitle:t??``}),r=new h.ColorDialogButton({dialog:new h.ColorDialog({title:e}),valign:h.Align.CENTER});n.add_suffix(r),n.set_activatable_widget(r);let channel=e=>Math.round(Math.max(0,Math.min(1,e))*255).toString(16).padStart(2,`0`),rgbaToHex=e=>`#${channel(e.red)}${channel(e.green)}${channel(e.blue)}`,i=null,a=!1;return r.connect(`notify::rgba`,()=>{a||i?.(rgbaToHex(r.get_rgba()))}),{node:n,get:()=>rgbaToHex(r.get_rgba()),set:e=>{let t=new f.RGBA;t.parse(e)&&(a=!0,r.set_rgba(t),a=!1)},onChange:e=>{i=e}}}var ze=class StorybookWindow extends w.ApplicationWindow{static{S.registerClass({GTypeName:`StorybookWindow`,Template:`<?xml version="1.0" encoding="UTF-8"?>
|
|
73
|
+
</node>`}const ee=e(import.meta.url);let b;function load$4(){return b===void 0&&(b=ee(`@gjsify/node-gi/gi`).requireGi(`Gio`,`2.0`)),b}__name(load$4,`load`);var x=new Proxy(Object.create(null),{get(e,t){return load$4()[t]},has(e,t){return t in load$4()}});function isWin32(){return l.DIR_SEPARATOR===92}function defaultListenAddress(){return isWin32()?`nonce-tcp:host=127.0.0.1`:`unix:tmpdir=${l.get_tmp_dir()}`}var DevtoolsPeerServerError=class extends Error{constructor(e,t,n,r){super(e),this.address=t,this.reason=n,this.name=`DevtoolsPeerServerError`,this.cause=r}};function isAddressInUse(e){return e instanceof l.Error&&e.matches(x.io_error_quark(),x.IOErrorEnum.ADDRESS_IN_USE)}function unixSocketPath(e){if(!e.startsWith(`unix:`))return null;for(let t of e.slice(5).split(`,`)){let e=t.indexOf(`=`);if(!(e<0||t.slice(0,e)!==`path`))try{return decodeURIComponent(t.slice(e+1))}catch{return null}}return null}function inspectExistingSocket(e){try{if((x.File.new_for_path(e).query_info(`unix::mode`,x.FileQueryInfoFlags.NONE,null).get_attribute_uint32(`unix::mode`)&61440)!=49152)return`not-a-socket`}catch{return`not-a-socket`}let t=new x.SocketClient;t.set_timeout(2);let n;try{n=t.connect(x.UnixSocketAddress.new(e),null)}catch{return`dead`}return n.close(null),`live`}function clearReclaimableSocket(e){let t=unixSocketPath(e);if(!t||!l.file_test(t,l.FileTest.EXISTS))return;let n=inspectExistingSocket(t);if(n===`live`)throw new DevtoolsPeerServerError(`cannot listen on ${e}: another process is already listening there. Stop it, or point ${y} (or options.address) at a different socket — GJSIFY_DEVTOOLS_INSTANCE=<label> lets two devtools-enabled apps run side by side.`,e,`address-in-use`);if(n===`not-a-socket`)throw new DevtoolsPeerServerError(`cannot listen on ${e}: ${t} already exists and is not a socket, so it will NOT be removed. Point ${y} (or options.address) at a free path.`,e,`occupied-by-other-file`);try{x.File.new_for_path(t).delete(null)}catch(n){throw new DevtoolsPeerServerError(`cannot listen on ${e}: ${t} is a socket nothing listens on, but removing it failed (${n}). Delete it by hand, or point ${y} at a free path.`,e,`address-in-use`,n)}console.log(`[gjsify-devtools] reclaimed the stale socket ${t}: nothing was listening on it (an abnormal exit — Ctrl-C, SIGKILL, a crash — leaves the inode behind).`)}function flagsForAddress(e){return e.startsWith(`tcp:`)||e.startsWith(`nonce-tcp:`)?x.DBusServerFlags.NONE:x.DBusServerFlags.AUTHENTICATION_REQUIRE_SAME_USER}function startDevtoolsPeerServer(e,t,n){let r=n&&n!==``?n:defaultListenAddress();clearReclaimableSocket(r);let i;try{i=x.DBusServer.new_sync(r,flagsForAddress(r),x.dbus_generate_guid(),null,null)}catch(e){let t=isAddressInUse(e);throw new DevtoolsPeerServerError(t?`cannot listen on ${r}: the address is already in use (${e}). Stop whatever holds it, or point ${y} (or options.address) at a different address.`:`cannot listen on ${r}: ${e}. Check the address form — \`unix:path=/tmp/app.sock\`, \`unix:tmpdir=/tmp\` or \`nonce-tcp:host=127.0.0.1\`.`,r,t?`address-in-use`:`listen-failed`,e)}let a=new Set;i.connect(`new-connection`,(n,r)=>(a.add(r),r.connect(`closed`,()=>{e.unexport(r),a.delete(r)}),e.export(r,t),!0)),i.start();let o=!1;return{address:i.get_client_address(),objectPath:t,get connectionCount(){return a.size},stop(){if(!o){o=!0,i.stop();for(let t of a)e.unexport(t),!t.is_closed()&&t.close(null,(e,t)=>{try{e.close_finish(t)}catch{}});a.clear()}}}}function writeDevtoolsAddressFile(e,t){try{if(l.mkdir_with_parents(l.path_get_dirname(e),448),!l.file_set_contents(e,`${t}\n`))return null}catch(t){return console.error(`[gjsify-devtools] could not publish the peer address to ${e}: ${t}`),null}try{x.File.new_for_path(e).set_attribute_uint32(`unix::mode`,384,x.FileQueryInfoFlags.NONE,null)}catch(t){console.error(`[gjsify-devtools] could not restrict ${e} to the current user: ${t}`)}return e}function removeDevtoolsAddressFile(e){try{x.File.new_for_path(e).delete(null)}catch{}}const te=e(import.meta.url);let ne;function load$3(){return ne===void 0&&(ne=te(`@gjsify/node-gi/gi`).requireGi(`Graphene`,`1.0`)),ne}__name(load$3,`load`);var re=new Proxy(Object.create(null),{get(e,t){return load$3()[t]},has(e,t){return t in load$3()}});function captureWidget(e){let t=e.get_native()?.get_renderer();if(!t)return{png:null,blocker:`no-renderer`};let n=e.get_width(),r=e.get_height();if(n<=0||r<=0)return{png:null,blocker:`zero-size`};let i=h.WidgetPaintable.new(e),a=h.Snapshot.new();i.snapshot(a,n,r);let o=a.to_node();if(!o)return{png:null,blocker:`empty-snapshot`};let s=new re.Rect;s.init(0,0,n,r);let c=t.render_texture(o,s).save_to_png_bytes().get_data();return c?{png:new Uint8Array(c)}:{png:null,blocker:`empty-png`}}function captureWidgetPng(e){return captureWidget(e).png}function dumpGSettings(e){let t=x.SettingsSchemaSource.get_default()?.lookup(e,!0);if(!t)throw Error(formatDbusErrorMessage(`not-found`,`GSettings schema '${e}' is not installed`));let n=new x.Settings({settings_schema:t}),r={};for(let e of t.list_keys())r[e]=n.get_value(e).recursiveUnpack();return r}const ie=e(import.meta.url);let ae;function load$2(){return ae===void 0&&(ae=ie(`@gjsify/node-gi/gi`).requireGi(`GObject`,`2.0`)),ae}__name(load$2,`load`);var S=new Proxy(Object.create(null),{get(e,t){return load$2()[t]},has(e,t){return t in load$2()}});function parseWidgetPath(e){let t=e.split(`/`).filter(e=>e.length>0);if(t.length===0)return null;let n=t[0].match(/^toplevel:(\d+)$/);if(!n)return null;let r=[];for(let e of t.slice(1)){let t=e.match(/^child:(\d+)$/);if(!t)return null;r.push(Number(t[1]))}return{toplevel:Number(n[1]),children:r}}function buildWidgetPath(e,t){return[`toplevel:${e}`,...t.map(e=>`child:${e}`)].join(`/`)}function widgetType(e){return gtypeName(e)??`GtkWidget`}function gtypeName(e){let t=e;return typeof t?.$typeName==`string`&&t.$typeName.length>0?t.$typeName:t?.constructor?.$gtype?.name??null}function widgetIsA(e,t){let n=gtypeName(e);if(n===null||!t)return!1;if(n===t)return!0;let r=S.type_from_name(n),i=S.type_from_name(t);return!r||!i?!1:S.type_is_a(r,i)}function activateWidget(e){let t=e,n=typeof t.get_parent==`function`?t.get_parent():null,r=!!n&&widgetIsA(n,`GtkListBox`);if(!(r&&widgetIsA(e,`GtkListBoxRow`))&&typeof t.activate==`function`&&t.activate()===!0)return!0;if(r){let t=n,r=!1;return typeof t.select_row==`function`&&(t.select_row(e),r=!0),typeof t.emit==`function`&&(t.emit(`row-activated`,e),r=!0),r}return!1}function sendKeyToWidget(e,t,n){let r=e.observe_controllers(),i=!1;for(let e=0;e<r.get_n_items();e++){let a=r.get_item(e);widgetIsA(a,`GtkEventControllerKey`)&&(a.emit(`key-pressed`,t,0,n),i=!0)}return i}function nthChild(e,t){let n=e.get_first_child(),r=0;for(;n&&r<t;)n=n.get_next_sibling(),r++;return r===t?n:null}function listToplevels(){let e=h.Window.get_toplevels(),t=e.get_n_items(),n=[];for(let r=0;r<t;r++){let t=e.get_item(r);t&&n.push({path:`toplevel:${r}`,type:widgetType(t),title:t.get_title?.()??null,mapped:t.get_mapped(),focused:t.is_active??!1})}return n}function resolveWidgetPath(e){let t=parseWidgetPath(e);if(!t)return null;let n=h.Window.get_toplevels().get_item(t.toplevel);if(!n)return null;for(let e of t.children)if(n=nthChild(n,e),!n)return null;return n}function parseWidgetSelector(e){let t=e.indexOf(`:`),n=(t<0?e:e.slice(0,t)).trim(),r=(t<0?``:e.slice(t+1)).trim();return!n&&!r?null:{type:n,cssClass:r}}function findWidgetPath(e,t,n){let r={path:null};return walkForSelector(e,t,n,r)??r.path}function walkForSelector(e,t,n,r){if(!e.get_visible()||!e.get_mapped())return null;if(!t.cssClass||e.get_css_classes().includes(t.cssClass)){if(!t.type||widgetType(e)===t.type)return n;r.path===null&&widgetIsA(e,t.type)&&(r.path=n)}let i=e.get_first_child(),a=0;for(;i;){let e=walkForSelector(i,t,`${n}/child:${a}`,r);if(e)return e;i=i.get_next_sibling(),a++}return null}function geometryOf(e){if(!e.get_mapped())return;let t=e.get_allocation(),n=t.width+e.get_margin_start()+e.get_margin_end(),r=t.height+e.get_margin_top()+e.get_margin_bottom(),[i,a]=e.measure(h.Orientation.HORIZONTAL,-1),o=n>0?Math.max(n,i):-1,[s,c]=e.measure(h.Orientation.VERTICAL,o),l={width:n,height:r,widthRequest:[i,a],heightRequest:[s,c]};return(n<i||r<s)&&(l.short=!0),l}function dumpTree(e,t,n){let r={path:n,type:widgetType(e),name:e.get_name()||null,cssClasses:e.get_css_classes(),mapped:e.get_mapped(),visible:e.get_visible(),children:[]},i=geometryOf(e);if(i!==void 0&&(r.geometry=i),t<=0)return e.get_first_child()&&(r.truncated=!0),r;let a=e.get_first_child(),o=0;for(;a;)r.children.push(dumpTree(a,t-1,`${n}/child:${o}`)),a=a.get_next_sibling(),o++;return r}function jsonSafe(e){let t=typeof e;return e==null||t===`string`||t===`number`||t===`boolean`?e??null:`[${t}]`}function getWidgetProperty(e,t){let n=e,r=t.replace(/-/g,`_`),i=t.replace(/[-_]([a-z])/g,(e,t)=>t.toUpperCase());for(let e of[t,r,i])if(e in n)return jsonSafe(n[e])}function childIndex(e,t){let n=e.get_first_child(),r=0;for(;n;){if(n===t)return r;n=n.get_next_sibling(),r++}return-1}function pathOfWidget(e){let t=[],n=e,r=n.get_parent();for(;r;){let e=childIndex(r,n);if(e<0)return null;t.unshift(e),n=r,r=n.get_parent()}let i=h.Window.get_toplevels(),a=i.get_n_items();for(let e=0;e<a;e++)if(i.get_item(e)===n)return buildWidgetPath(e,t);return null}function isActiveWindowScope(e){return!e||e===`window`||e===`active`}function frameDelay(e){return new Promise(t=>{l.timeout_add(l.PRIORITY_DEFAULT,e,()=>(t(),l.SOURCE_REMOVE))})}async function captureWidgetWhenRenderable(e,t=12,n=50){let r=null;for(let i=0;i<t;i++){let t=captureWidget(e);if(t.png)return{png:t.png,blocker:null};r=t.blocker,await frameDelay(n)}let i=captureWidget(e);return{png:i.png,blocker:i.png?null:i.blocker??r}}var DevtoolsService=class{constructor(e,t){this._app=e,this._options=t,this._exported=new Map,this._peer=null,this._addressFile=null,this._kinds=new Map,this._extensions=t.extend??[];for(let[e,t]of Object.entries(v))this._kinds.set(e,t);for(let e of this._extensions){for(let[t,n]of Object.entries(e.methodKinds))this._kinds.set(t,n);for(let[t,n]of Object.entries(e.handlers)){let e=n;this[t]=(...n)=>(this._guard(t),e(...n))}}}export(e,t){if(this._exported.has(e))return;let n=buildDevtoolsIfaceXml(this._extensions.flatMap(e=>e.methodsXml??[])),r=x.DBusExportedObject.wrapJSObject(n,this);r.export(e,t),this._exported.set(e,r)}unexport(e){if(e){this._exported.get(e)?.unexport(),this._exported.delete(e);return}for(let e of this._exported.values())e.unexport();this._exported.clear(),this._peer?.stop(),this._peer=null,this._addressFile&&=(removeDevtoolsAddressFile(this._addressFile),null)}attachPeerServer(e,t){this._peer=e,this._addressFile=t??null}get peerAddress(){return this._peer?.address??null}get addressFile(){return this._addressFile}GetStatus(){let e=this._app.get_active_window(),t={appId:this._app.get_application_id()??`unknown`,instance:this._options.instance??`default`,activeWindow:e?{id:e.get_name()||`window`,title:e.get_title()??``,mapped:e.get_mapped()}:null,toplevelCount:h.Window.get_toplevels().get_n_items(),focusedWidget:null,paused:this._isPaused()};for(let e of this._extensions){let n=e.contributeStatus?.();n&&Object.assign(t,n)}return JSON.stringify(t)}async ScreenshotAsync(e,t){try{let n=typeof e?.[0]==`string`?e[0]:``,r=await this._captureScopePng(n);t.return_value(new l.Variant(`(ay)`,[r]))}catch(e){t.return_dbus_error(`org.gjsify.Devtools.Error.Screenshot`,e instanceof Error?e.message:String(e))}}async _captureScopePng(e){let t=this._resolveRootWidget(e);if(!t){if(isActiveWindowScope(e))return new Uint8Array;throw Error(formatDbusErrorMessage(`not-found`,`no widget at '${e}'`))}let n=captureWidget(t.widget);if(n.png)return n.png;let r=t.widget.get_root();r instanceof h.Window&&r.present();let i=await captureWidgetWhenRenderable(t.widget);return i.png?i.png:(console.warn(`[devtools] Screenshot('${e}') has no image: ${i.blocker??`unknown`} after 12 tries. Empty bytes follow.`),new Uint8Array)}ListActions(){let e={app:describeActions(this._actionGroup(`app`)),win:describeActions(this._actionGroup(`win`))};return JSON.stringify(e)}ActivateAction(e,t,n){this._guard(`ActivateAction`);let r=this._scope(e);activateAction(this._requireGroup(r,t),t,this._parseValue(n))}ChangeActionState(e,t,n){this._guard(`ChangeActionState`);let r=this._scope(e);changeActionState(this._requireGroup(r,t),t,this._parseValue(n))}PresentWindow(){this._app.get_active_window()?.present()}ResizeWindow(e,t){this._guard(`ResizeWindow`);let n=this._app.get_active_window();if(!n)throw Error(formatDbusErrorMessage(`unavailable`,`no active window to resize`));let r=Math.max(1,Math.round(e)),i=Math.max(1,Math.round(t));return n.is_maximized()&&n.unmaximize(),n.is_fullscreen()&&n.unfullscreen(),n.set_default_size(r,i),[r,i]}ListToplevels(){return JSON.stringify(listToplevels())}DumpTree(e,t){let n=this._resolveRootWidget(e);if(!n)throw Error(formatDbusErrorMessage(`not-found`,`no widget at '${e||`active window`}'`));return JSON.stringify(dumpTree(n.widget,t>0?t:40,n.path))}GetProperty(e,t){let n=this._resolveRootWidget(e);if(!n)throw Error(formatDbusErrorMessage(`not-found`,`no widget at '${e}'`));let r=getWidgetProperty(n.widget,t);if(r===void 0)throw Error(formatDbusErrorMessage(`not-found`,`widget has no property '${t}'`));return JSON.stringify(r)}GetFocused(){let e=this._app.get_active_window(),t=e?e.get_focus():null;return JSON.stringify(t?{path:pathOfWidget(t),name:t.get_name()||null,type:widgetType(t)}:null)}ActivateWidget(e){this._guard(`ActivateWidget`);let t=this._resolveRootWidget(e);if(!t)throw Error(formatDbusErrorMessage(`not-found`,`no widget at '${e}'`));return activateWidget(t.widget)}FindWidget(e){let t=parseWidgetSelector(e);if(!t)throw Error(formatDbusErrorMessage(`invalid-params`,`empty selector '${e}'`));let n=this._resolveRootWidget(``);return n?findWidgetPath(n.widget,t,n.path)??``:``}SendKey(e,t){this._guard(`SendKey`);let[n,r,i]=h.accelerator_parse(e);if(!n)throw Error(formatDbusErrorMessage(`invalid-params`,`cannot parse accelerator '${e}'`));let a;if(a=t?this._resolveRootWidget(t)?.widget??null:this._app.get_active_window()?.get_focus()??null,!a)throw Error(formatDbusErrorMessage(`not-found`,`no widget at '${t||`focus`}'`));return sendKeyToWidget(a,r,i??0)}DumpGSettings(e){return JSON.stringify(dumpGSettings(e))}DumpCss(){return JSON.stringify(dumpCss())}SwapCss(e,t){return this._guard(`SwapCss`),swapCss(e,t)}_resolveRootWidget(e){if(isActiveWindowScope(e)){let e=this._app.get_active_window();return e?{widget:e,path:pathOfWidget(e)??`toplevel:0`}:null}let t=resolveWidgetPath(e);return t?{widget:t,path:e}:null}_isPaused(){return this._options.paused?.()??!1}_guard(e){let t=this._kinds.get(e);if(!t)throw Error(formatDbusErrorMessage(`internal`,`unclassified devtools method '${e}'`));if(t===`mutating`&&this._isPaused())throw Error(formatDbusErrorMessage(`paused`,`${e} rejected — external control is paused. Read-only methods keep working.`))}_scope(e){return e===`app`?`app`:`win`}_actionGroup(e){if(e===`app`)return this._app;if(this._options.winActionGroup)return this._options.winActionGroup;let t=this._app.get_active_window();return t instanceof h.ApplicationWindow?t:null}_requireGroup(e,t){let n=this._actionGroup(e);if(!n)throw Error(formatDbusErrorMessage(`unavailable`,`no '${e}' action group`));if(!n.has_action(t))throw Error(formatDbusErrorMessage(`not-found`,`unknown action ${e}.${t}`));return n}_parseValue(e){if(!e||e===`null`)return null;try{return JSON.parse(e)}catch{throw Error(formatDbusErrorMessage(`invalid-params`,`value_json is not valid JSON: ${e}`))}}};const C=`DBUS_SESSION_BUS_ADDRESS`,oe=new Set;function envEnabled(){return isDevtoolsEnabledValue(l.getenv(`GJSIFY_DEVTOOLS`))}function envValue(e){let t=l.getenv(e);return t&&t!==``?t:null}function sessionBusUsable(){if(!envValue(C))return!1;try{return x.bus_get_sync(x.BusType.SESSION,null),!0}catch{return!1}}function chooseDevtoolsTransport(e){return e.requestedAddress?{kind:`peer`,address:e.requestedAddress,reason:`requested`}:e.hasAppConnection?{kind:`session-bus`}:e.sessionBusUsable?{kind:`unregistered`}:{kind:`peer`,address:null,reason:`no-session-bus`}}function describeMissingConnection(e,t){return e?t?`[gjsify-devtools] the session bus answers but this application is not registered on it yet — call installDevtools() from the GtkApplication "startup" handler (the bus connection and object path exist only after registration).`:`[gjsify-devtools] ${C} is set (${e}) but no bus answers there — using the bus-less peer transport instead. On macOS this is the usual state: Homebrew's dbus listens on launchd, so the advertised address only works while that socket is live.`:`[gjsify-devtools] this machine has no session bus (${C} is unset) — using the bus-less peer transport instead. Point the bridge at the address below, or set ${y} on both the app and \`gjsify debug\` to pin it yourself.`}function installDevtools(e,t={}){if(!(t.enabled??envEnabled()))return null;let n=t.instance??envValue(`GJSIFY_DEVTOOLS_INSTANCE`)??void 0,r=new DevtoolsService(e,{...t,instance:n});try{return exportDevtools(e,r,t,n)}catch(e){return r.unexport(),console.error(`[gjsify-devtools] devtools stayed OFF, the app is unaffected — ${describeInstallFailure(e)}`),null}}function describeInstallFailure(e){return e instanceof DevtoolsPeerServerError||e instanceof Error?e.message:String(e)}function exportDevtools(e,t,n,r){let i=e.get_is_registered(),a=i?e.get_dbus_connection():null,o=i?e.get_dbus_object_path():null,s=envValue(C),c=!!(a&&o),u=c||sessionBusUsable(),d=chooseDevtoolsTransport({requestedAddress:n.address??envValue(y),hasAppConnection:c,sessionBusUsable:u}),f=e.get_application_id()??`unknown`,p=`${o??appIdToObjectPath(f)}/devtools`;if((d.kind===`unregistered`||d.kind===`peer`&&d.reason===`no-session-bus`)&&console.error(describeMissingConnection(s,u)),d.kind===`session-bus`&&a)t.export(a,p),console.log(`[gjsify-devtools] exported ${_} at ${p} (dest ${f})`);else if(d.kind===`peer`){let n=startDevtoolsPeerServer(t,p,d.address??void 0),i=writeDevtoolsAddressFile(devtoolsAddressFilePath(l.get_user_runtime_dir(),f,r),n.address);t.attachPeerServer(n,i),console.log(`[gjsify-devtools] exported ${_} at ${p} (peer address ${n.address}${i?`, published to ${i}`:``})`),i&&e.connect(`shutdown`,()=>removeDevtoolsAddressFile(i))}return oe.add(t),t}const se=`&(?![a-zA-Z][a-zA-Z0-9]*;|#\\d+;|#x[0-9a-fA-F]+;)|<(?![a-zA-Z/!?])`;RegExp(se),RegExp(se,`g`);const ce=[`AdwNavigationSplitView`,`GtkListBox`,`AdwOverlaySplitView`];function probeEnabled(){let e=l.getenv(`GJSIFY_STORYBOOK_PROBE`);if(e==null)return!1;let t=e.toLowerCase();return t!==``&&t!==`0`&&t!==`false`}const le=5e3;function exitIfNotDrained(){if(typeof process>`u`||typeof process.exit!=`function`)return;let e=setTimeout(()=>{console.error(`STORYBOOK PROBE: host still alive ${le}ms after quit(), exiting`),process.exit(process.exitCode??0)},le);typeof e==`object`&&typeof e.unref==`function`&&e.unref()}function collectTypes(e,t){t.add(e.type);for(let n of e.children)collectTypes(n,t)}function installStorybookProbe(e,t,n={}){let r=n.requireChrome??ce,i=n.out??l.getenv(`GJSIFY_STORYBOOK_PROBE_OUT`)??void 0,a=n.timeoutMs??8e3,o=n.storyWidget??l.getenv(`GJSIFY_STORYBOOK_PROBE_STORY_WIDGET`)??void 0,s=t.controller.listStories(),c=[...new Set(s.map(e=>e.category))],u=n.story??l.getenv(`GJSIFY_STORYBOOK_PROBE_STORY`)??s[0]?.title,d=u?t.openStoryByTitle(u):!1,f=t.activeStory,p=new Set;collectTypes(dumpTree(t,60,`toplevel:0`),p);let m=r.filter(e=>!p.has(e)),h=new Set;f&&collectTypes(dumpTree(f,60,`story`),h);let g=h.size,_=o?h.has(o):null,finish=t=>{let n=JSON.stringify(t);if(t.ok)console.log(`STORYBOOK PROBE: PASS ${n}`);else{console.error(`STORYBOOK PROBE: FAIL ${n}`);try{typeof process<`u`&&(process.exitCode=1)}catch{}}if(i)try{l.file_set_contents(i,JSON.stringify(t,null,2))}catch{}e.quit(),exitIfNotDrained()},v=0;l.timeout_add(l.PRIORITY_DEFAULT,100,()=>{v+=100;let e=captureWidgetPng(t),n=t.get_width()>0&&t.get_height()>0;if(!e&&!(v>=a))return l.SOURCE_CONTINUE;let i=f?captureWidgetPng(f):null,p=s.length>=1&&c.length>=1&&m.length===0&&d&&f!=null&&g>1,y;return s.length<1?y=`no stories registered`:c.length<1?y=`no categories`:m.length>0?y=`chrome missing: ${m.join(`, `)}`:!d||f==null?y=`could not open story: ${u??`(none)`}`:g<=1&&(y=`opened story rendered an empty subtree`),p&&o&&!h.has(o)&&(p=!1,y=`story widget ${o} not found in the opened story subtree`),p&&n&&(!e||e.length===0)&&(p=!1,y=`window realized (${t.get_width()}x${t.get_height()}) but the GSK capture was empty`),finish({ok:p,reason:y,stories:s.length,categories:c,opened:d,activeStory:f?f.meta.title:null,requiredChrome:r,missingChrome:m,storySubtreeWidgets:g,storyWidgetPresent:_,windowRealized:n,windowPngBytes:e?e.length:0,storyPngBytes:i?i.length:0}),l.SOURCE_REMOVE})}const ue=e(import.meta.url);let de;function load$1(){return de===void 0&&(de=ue(`@gjsify/node-gi/gi`).requireGi(`Adw`,`1`)),de}__name(load$1,`load`);var w=new Proxy(Object.create(null),{get(e,t){return load$1()[t]},has(e,t){return t in load$1()}});const fe={UNKNOWN:0,CUSTOM:1,GPL_2_0:2,GPL_3_0:3,LGPL_2_1:4,LGPL_3_0:5,BSD:6,MIT_X11:7,ARTISTIC:8,GPL_2_0_ONLY:9,GPL_3_0_ONLY:10,LGPL_2_1_ONLY:11,LGPL_3_0_ONLY:12,AGPL_3_0:13,AGPL_3_0_ONLY:14,BSD_3:15,APACHE_2_0:16,MPL_2_0:17,"0BSD":18};fe.GPL_2_0_ONLY,fe.GPL_3_0_ONLY,fe.UNKNOWN;const pe=[`blue`,`teal`,`green`,`yellow`,`orange`,`red`,`pink`,`purple`,`slate`],me={blue:`#3584e4`,teal:`#2190a4`,green:`#3a944a`,yellow:`#c88800`,orange:`#ed5b00`,red:`#e62d42`,pink:`#d56199`,purple:`#9141ac`,slate:`#6f8396`};function parseHex(e){let t=/^#([0-9a-f]{6})$/i.exec(e.trim());if(!t)return null;let n=Number.parseInt(t[1],16);return[(n>>16&255)/255,(n>>8&255)/255,(n&255)/255]}function toHex(e,t,n){let channel=e=>Math.round(Math.min(1,Math.max(0,e))*255).toString(16).padStart(2,`0`);return`#${channel(e)}${channel(t)}${channel(n)}`}const toLinear=e=>e<=.04045?e/12.92:((e+.055)/1.055)**2.4,fromLinear=e=>e<=.0031308?e*12.92:1.055*e**(1/2.4)-.055;function linearToOklab(e,t,n){let r=Math.cbrt(.4122214708*e+.5363325363*t+.0514459929*n),i=Math.cbrt(.2119034982*e+.6806995451*t+.1073969566*n),a=Math.cbrt(.0883024619*e+.2817188376*t+.6299787005*n);return[.2104542553*r+.793617785*i-.0040720468*a,1.9779984951*r-2.428592205*i+.4505937099*a,.0259040371*r+.7827717662*i-.808675766*a]}function oklabToLinear(e,t,n){let r=(e+.3963377774*t+.2158037573*n)**3,i=(e-.1055613458*t-.0638541728*n)**3,a=(e-.0894841775*t-1.291485548*n)**3;return[4.0767416621*r-3.3077115913*i+.2309699292*a,-1.2684380046*r+2.6097574011*i-.3413193965*a,-.0041960863*r-.7034186147*i+1.707614701*a]}function adwaitaStandaloneColor(e,t){let n=parseHex(e);if(!n)return e;let[r,i,a]=linearToOklab(toLinear(n[0]),toLinear(n[1]),toLinear(n[2])),[o,s,c]=oklabToLinear(t?Math.max(r,.85):Math.min(r,.5),i,a);return toHex(fromLinear(o),fromLinear(s),fromLinear(c))}function adwaitaAccentBgColor(e){return me[e]}function adwaitaAccentColor(e,t){return adwaitaStandaloneColor(me[e],t)}var UnsupportedGObjectError=class extends Error{constructor(e,t){super(t),this.name=`UnsupportedGObjectError`,this.feature=e}};const he=new WeakSet;function makeType(e){let t=Object.freeze({name:e});return he.add(t),t}makeType(`gchararray`),makeType(`gboolean`),makeType(`gint`),makeType(`guint`),makeType(`gdouble`);const T={READABLE:1,WRITABLE:2,READWRITE:3,CONSTRUCT:4,CONSTRUCT_ONLY:8};var E=class ParamSpec{constructor(e,t,n,r,i,a,o,s){this.kind=e,this.name=t,this.nick=n,this.blurb=r,this.flags=i,this.defaultValue=a,this.minimum=o,this.maximum=s}static boolean(e,t,n,r,i){return new ParamSpec(`boolean`,e,t,n,r,i)}static string(e,t,n,r,i){return new ParamSpec(`string`,e,t,n,r,i)}static int(e,t,n,r,i,a,o){return new ParamSpec(`int`,e,t,n,r,o,i,a)}static uint(e,t,n,r,i,a,o){return new ParamSpec(`uint`,e,t,n,r,o,i,a)}static double(e,t,n,r,i,a,o){return new ParamSpec(`double`,e,t,n,r,o,i,a)}get_default_value(){return this.defaultValue}};const D={GTypeName:Symbol(`GType name`),GTypeFlags:Symbol(`GType flags`),interfaces:Symbol(`GType interfaces`),properties:Symbol(`GObject properties`),signals:Symbol(`GObject signals`),requires:Symbol(`GObject interface requires`),template:Symbol(`GTK widget template`),cssName:Symbol(`GTK widget CSS name`),children:Symbol(`GTK widget template children`),internalChildren:Symbol(`GTK widget template internal children`)};D.GTypeName,D.template,D.internalChildren,D.properties,D.signals,D.cssName,D.children,D.interfaces,D.requires,D.GTypeFlags;const ge=new WeakMap;function chainOf(e){let t=[];for(let n=e;typeof n==`function`;n=Object.getPrototypeOf(n)){let e=ge.get(n);e&&t.push(e)}return t}function chainOfInstance(e){return chainOf(e.constructor)}function typeNameOf(e,t){return t[0]?.typeName??e.constructor.name}function aliasesOf(e){return[e,e.replace(/-/g,`_`),e.replace(/-([a-z])/g,(e,t)=>t.toUpperCase())]}function findProperty(e,t){for(let n of e)for(let e of n.properties)if(aliasesOf(e.name).includes(t))return e}function findSignal(e,t){for(let n of e)if(Object.prototype.hasOwnProperty.call(n.signals,t))return n.signals[t]}const _e=new WeakMap;let ve=0;function stateOf$1(e){let t=_e.get(e);return t||(t={values:new Map,handlers:new Map,connections:new Map,emissions:[]},_e.set(e,t)),t}__name(stateOf$1,`stateOf`);function parseSignal(e){let t=e.indexOf(`::`);return t===-1?{name:e}:{name:e.slice(0,t),detail:e.slice(t+2)}}function addHandler(e,t,n){let r=stateOf$1(e),i=++ve,a=r.handlers.get(t)??[];return a.push({id:i,handler:n}),r.handlers.set(t,a),r.connections.set(i,()=>{a.splice(a.findIndex(e=>e.id===i),1)}),i}function runHandlers(e,t,n){let r=stateOf$1(e),i={key:t,stopped:!1};r.emissions.push(i);try{for(let{id:a,handler:o}of(r.handlers.get(t)??[]).slice()){if(i.stopped)break;r.connections.has(a)&&o(e,...n)}}finally{r.emissions.pop()}}function connectInstance(e,t,n){let r=chainOfInstance(e),i=typeNameOf(e,r),{name:a,detail:o}=parseSignal(t),foreign=()=>{let a=r[0]?.door;if(!a)throw Error(`No signal '${t}' on object '${i}'`);let o=++ve,s=a.listen(e,t,n);return stateOf$1(e).connections.set(o,s),o};if(a===`notify`){if(o===void 0)throw new UnsupportedGObjectError(`connect("notify")`,`connect('notify') without a property is outside the GObject subset; connect 'notify::<property>' on '${i}'.`);let t=findProperty(r,o);return t?addHandler(e,`notify::${t.name}`,n):foreign()}if(findSignal(r,a)){if(o!==void 0)throw Error(`Signal '${a}' on object '${i}' has no detail`);return addHandler(e,a,n)}return foreign()}function disconnectInstance(e,t){let n=stateOf$1(e),r=n.connections.get(t);if(!r)throw Error(`No handler with id ${t} is connected to ${String(e)}`);n.connections.delete(t),r()}function emitInstance(e,t,...n){let r=chainOfInstance(e),i=typeNameOf(e,r),a=findSignal(r,t);if(a){if(n.length!==a.length)throw Error(`Signal '${t}' on ${i} requires ${a.length} args got ${n.length}`);runHandlers(e,t,n);return}let o=r[0]?.door;if(!o)throw Error(`No signal '${t}' on object '${i}'`);o.dispatch(e,t,n)}function notifyInstance(e,t){let n=chainOfInstance(e),r=findProperty(n,t);if(r){runHandlers(e,`notify::${r.name}`,[r]);return}let i=n[0]?.door;if(!i)throw Error(`No property ${t} on ${typeNameOf(e,n)}`);i.dispatch(e,`notify::${t}`,[])}function generateAccessors(e,t){let{name:n,flags:r}=e,i=r&T.READABLE,a=r&T.WRITABLE,o=t??{configurable:!0,enumerable:!0};return i&&a?!o.get&&!o.set?(o.get=function(){let{values:t}=stateOf$1(this);return t.has(n)||t.set(n,e.get_default_value()),t.get(n)},o.set=function(e){let{values:t}=stateOf$1(this);e!==t.get(n)&&(t.set(n,e),this.notify(n))}):o.get?o.set||=function(){throw Error(`getter defined without setter for property ${n}`)}:o.get=function(){throw Error(`setter defined without getter for property ${n}`)}:i&&!o.get?o.get=function(){throw Error(`missing getter for read-only property ${n}`)}:a&&!o.set&&(o.set=function(){throw Error(`missing setter for write-only property ${n}`)}),o}function checkAccessors(e,t){let{name:n,flags:r}=t;if(r&T.CONSTRUCT_ONLY)return;let[,i,a]=aliasesOf(n),own=t=>Object.getOwnPropertyDescriptor(e,t),o=own(n),s=o,c=n.includes(`-`),l,u;c&&(l=own(i),u=own(a),o??=l,o??=u);let d=r&T.READABLE,f=r&T.WRITABLE;(!o||d&&!o.get||f&&!o.set)&&(o=generateAccessors(t,o)),s||Object.defineProperty(e,n,o),c&&(l||Object.defineProperty(e,i,o),u||Object.defineProperty(e,a,o))}function defineConstructOnly(e,t,n){let{values:r}=stateOf$1(e);r.set(t.name,n);for(let n of new Set(aliasesOf(t.name)))Object.defineProperty(e,n,{get:()=>r.get(t.name),enumerable:!0,configurable:!0})}function bindProperties(e,t,n,r,i=[]){let a=i.includes(`invert-boolean`),o=!1,transfer=(e,t,n,r)=>()=>{if(!o){o=!0;try{let i=e[t];n[r]=a?!i:i}finally{o=!1}}},s=transfer(e,t,n,r),c=[[e,e.connect(`notify::${t}`,s)]];if(i.includes(`bidirectional`)){let i=transfer(n,r,e,t);c.push([n,n.connect(`notify::${r}`,i)])}return i.includes(`sync-create`)&&s(),{unbind(){for(let[e,t]of c.splice(0))e.disconnect(t)}}}function createClosure(e,t,n,r){let i=r??e;if(n)throw new UnsupportedGObjectError(`swapped`,`Unsupported template signal flag "swapped"`);let a=e[t];if(a===void 0)throw Error(`A handler called ${t} was not defined on ${String(e)}`);return a.bind(i)}function scopeOf(e){return{instance:e,handler:(t,n)=>createClosure(e,t,n?.flags?.includes(`swapped`)??!1,n?.object),bind:bindProperties}}function constructRegistered(e,t={}){let n=chainOfInstance(e),r={},i=new Map;for(let[e,a]of Object.entries(t)){let t=findProperty(n,e);t?i.set(t,a):r[e]=a}let a=[];for(let t of[...n].reverse())t.template&&a.push([t,t.door.createFromTree(t.template,scopeOf(e),e)]);for(let t of n)for(let n of t.properties)n.flags&T.CONSTRUCT_ONLY&&defineConstructOnly(e,n,i.has(n)?i.get(n):n.get_default_value());for(let[t,n]of i)t.flags&T.CONSTRUCT_ONLY||(e[t.name]=n);for(let[t,n]of a){for(let r of t.internalChildren){let i=n.objects[r];if(i===void 0)throw Error(`Template of ${t.typeName} has no child object '${r}' for InternalChildren`);e[`_${r.replace(/-/g,`_`)}`]=i}t.door.attach(e,n)}return r}const ye=Symbol(`GIR type`);function registerBaseClass(e,t,n,r=[]){let missing=e=>{throw Error(`No signal '${e}' on object '${t}'`)},i=makeType(t);Object.defineProperty(e,"$gtype",{get:()=>i,enumerable:!1,configurable:!1});for(let t of r)checkAccessors(e.prototype,t);ge.set(e,{klass:e,typeName:t,gtype:i,properties:r,signals:n,internalChildren:[],door:{name:t,dispatch:(e,t)=>missing(t),listen:(e,t)=>missing(t),createFromTree:()=>missing(`template`),attach(){},register(){}}})}var GObjectObject=class{constructor(e){let t=constructRegistered(this,e),n=Object.keys(t)[0];if(n!==void 0)throw Error(`No property ${n} on ${typeNameOf(this,chainOfInstance(this))}`)}notify(e){notifyInstance(this,e)}connect(e,t){return connectInstance(this,e,t)}disconnect(e){disconnectInstance(this,e)}emit(e,...t){emitInstance(this,e,...t)}};function refuse$1(e,t){return new UnsupportedGObjectError(e,`${e} ${t}, which is outside the Gio subset (ADR 0098 § 1).`)}__name(refuse$1,`refuse`);var ActionRegistry=class{constructor(){this._actions=new Map}add(e){this._actions.set(e.name,e)}remove(e){this._actions.delete(e)}lookup_action(e){return this._actions.get(e)??null}has(e){return this._actions.has(e)}list(){return[...this._actions.keys()]}};const be=new WeakMap;function actionRegistryOf(e,t=!0){let n=be.get(e);return n===void 0&&t&&(n=new ActionRegistry,be.set(e,n)),n}function requireAction(e){let t=e;if(typeof t?.name!=`string`||typeof t.activate!=`function`)throw TypeError(`add_action: needs a Gio.Action (a Gio.SimpleAction)`);return t}const xe={add_action(e){actionRegistryOf(this).add(requireAction(e))},lookup_action(e){return actionRegistryOf(this,!1)?.lookup_action(e)??null},remove_action(e){actionRegistryOf(this,!1)?.remove(e)}},Se={has_action(e){return actionRegistryOf(this,!1)?.has(e)??!1},list_actions(){return actionRegistryOf(this,!1)?.list()??[]},activate_action(e,t=null){if(t!==null)throw refuse$1(`activate_action with a parameter`,`needs a GLib.Variant`);actionRegistryOf(this,!1)?.lookup_action(e)?.activate(null)},get_action_enabled(e){return actionRegistryOf(this,!1)?.lookup_action(e)?.enabled??!1}};function installActionMap(e,t=!1){let n=t?{...xe,...Se}:{...xe};for(let[t,r]of Object.entries(n))Object.defineProperty(e,t,{value:r,writable:!0,configurable:!0,enumerable:!1})}const Ce=new WeakMap;function linkWindow(e,t){t===null?Ce.delete(e):Ce.set(e,t)}const we={NONE:0,FLAGS_NONE:0,DEFAULT_FLAGS:0,IS_SERVICE:1,IS_LAUNCHER:2,HANDLES_OPEN:4,HANDLES_COMMAND_LINE:8,SEND_ENVIRONMENT:16,NON_UNIQUE:32,CAN_OVERRIDE_APP_ID:64,ALLOW_REPLACEMENT:128,REPLACE:256};function isValidApplicationId(e){if(typeof e!=`string`||e.length>255||e===``)return!1;let t=e.split(`.`);return t.length>=2&&t.every(e=>/^[A-Za-z_-][A-Za-z0-9_-]*$/.test(e))}function refuse(e,t){return new UnsupportedGObjectError(e,`${e} ${t}, which is outside the Gio subset (ADR 0098 § 1).`)}const Te=`register.hold.release.mark_busy.unmark_busy.open.set_inactivity_timeout.send_notification.withdraw_notification.register_session.set_option_context_parameter_string.set_option_context_summary.set_option_context_description.add_main_option.add_main_option_entries.add_option_group.set_resource_base_path.get_resource_base_path.set_flags.get_is_remote.get_is_registered.get_dbus_connection.get_dbus_object_path.bind_busy_property.add_action_entries.set_default`.split(`.`),Ee=[`is_remote`,`is_registered`,`is_busy`,`resource_base_path`,`inactivity_timeout`,`action_group`],De=[`open`,`command-line`,`handle-local-options`,`shutdown`,`name-lost`],Oe=[`set_accels_for_action`,`get_accels_for_action`,`list_action_descriptions`,`get_actions_for_accel`,`set_menubar`,`get_menubar`,`get_menu_by_id`,`set_app_menu`,`get_app_menu`,`get_menu_by_id`,`inhibit`,`uninhibit`],ke=new WeakMap;let Ae=null;function rememberDefault(e){Ae??=e}function stateOf(e){let t=ke.get(e);return t===void 0&&(t={id:null,windows:[],running:!1,resolve:()=>{}},ke.set(e,t)),t}function hostOf(e){let t=e.constructor.host;if(t===void 0)throw Error(`Gio.Application: this class has no ApplicationHost; use the Gtk.Application of a port.`);return t}var GioApplicationBase=class extends GObjectObject{static{this[ye]=`Gio.Application`}static id_is_valid(e){return isValidApplicationId(e)}static get_default(){return Ae}constructor(e){super(e),rememberDefault(this)}get application_id(){return stateOf(this).id}set application_id(e){let t=e??null;if(t!==null&&!isValidApplicationId(t))throw Error(`Gio.Application: '${String(t)}' is not a valid application id (g_application_id_is_valid)`);let n=stateOf(this);if(n.running)throw Error(`Gio.Application: the application id cannot change while it runs`);n.id!==t&&(n.id=t,this.notify(`application-id`))}get flags(){return 0}set flags(e){if(e!==void 0&&e!==we.NONE)throw refuse(`Gio.ApplicationFlags value ${String(e)}`,`is a flag other than the default`)}get_application_id(){return this.application_id}set_application_id(e){this.application_id=e}get_flags(){return 0}vfunc_startup(){}vfunc_activate(){}run(){throw refuse(`Gio.Application.run()`,`blocks, and a page cannot; use runAsync()`)}connect(e,t){let n=e.split(`::`)[0]??e;if(De.includes(n))throw refuse(`the '${n}' signal`,`is not emitted`);return super.connect(e,t)}async runAsync(e=[]){let t=stateOf(this);if(t.running)throw Error(`Gio.Application.runAsync(): the application is already running`);let n=hostOf(this);t.running=!0;let r=new Promise(e=>{t.resolve=e}),i,a=!1,body=()=>{try{if(this.vfunc_startup(),this.emit(`startup`),this.emit(`activate`),this.vfunc_activate(),t.running&&t.windows.length===0&&n.requiresWindow)throw Error(`Gio.Application.runAsync(): activate added no window on ${n.name}; a window must be added synchronously by activate (ADR 0098 § 3).`)}catch(e){i=e,a=!0}return t.windows[0]??null};try{await n.start(body)}catch(e){i=e,a=!0}if(a)throw t.running=!1,n.exit(),i;return t.windows.length===0&&this._finish(0),r}quit(){let e=stateOf(this);if(e.running){for(let t of e.windows.splice(0))linkWindow(t,null),hostOf(this).detach(t);this._finish(0)}}_finish(e){let t=stateOf(this);t.running&&(t.running=!1,t.resolve(e),hostOf(this).exit())}};registerBaseClass(GioApplicationBase,`GApplication`,{startup:[],activate:[]},[E.string(`application-id`,``,``,T.READWRITE|T.CONSTRUCT,null),E.uint(`flags`,``,``,T.READWRITE|T.CONSTRUCT,0,4294967295,0)]),installActionMap(GioApplicationBase.prototype,!0);function refuseMembers(e,t,n){for(let n of t)Object.defineProperty(e,n,{value:()=>{throw refuse(`${n}()`,`is not implemented`)},writable:!0,configurable:!0,enumerable:!1});for(let t of n)Object.defineProperty(e,t,{get(){throw refuse(`the '${t}' property`,`is not implemented`)},configurable:!0,enumerable:!1})}refuseMembers(GioApplicationBase.prototype,Te,Ee);function withGtkApplication(e){class GtkApplication extends e{get active_window(){return stateOf(this).windows[0]??null}get_active_window(){return this.active_window}get_windows(){return[...stateOf(this).windows]}add_window(e){let t=stateOf(this);t.windows.includes(e)||(t.windows.unshift(e),linkWindow(e,this))}remove_window(e){let t=stateOf(this),n=t.windows.indexOf(e);n!==-1&&(t.windows.splice(n,1),linkWindow(e,null),t.windows.length===0&&this._finish(0))}}return refuseMembers(GtkApplication.prototype,Oe,[]),GtkApplication}withGtkApplication(GioApplicationBase),Math.PI*.35,Math.PI*.015,Math.PI*.9;const je=Math.PI*.9,Me=Math.PI*.7,Ne=Math.PI*1.1,Pe=Math.PI*1.35,Fe=je+Ne+Pe-Me;53*Math.PI*2/Fe,Ne-Me/2,new Set(`ADC.AND.ASL.BCC.BCS.BEQ.BIT.BMI.BNE.BPL.BRK.BVC.BVS.CLC.CLD.CLI.CLV.CMP.CPX.CPY.DEC.DEX.DEY.EOR.INC.INX.INY.JMP.JSR.LDA.LDX.LDY.LSR.NOP.ORA.PHA.PHP.PLA.PLP.ROL.ROR.RTI.RTS.SBC.SEC.SED.SEI.STA.STX.STY.TAX.TAY.TSX.TXA.TXS.TYA`.split(`.`));const O=new WeakMap,Ie=new WeakMap;function sourceOf(e){let t=e.constructor.source;if(t===void 0)throw Error(`Adw.StyleManager: this class has no StyleSource; use the Adw.StyleManager of a port.`);return t}var StyleManagerBase=class extends GObjectObject{static{this[ye]=`Adw.StyleManager`}static get_default(){let e=Ie.get(this);if(e===void 0){e=new this,Ie.set(this,e);let t=sourceOf(e);O.set(e,t.dark()),t.subscribe(()=>{let n=t.dark();O.get(e)!==n&&(O.set(e,n),e.notify(`dark`))})}return e}get dark(){return sourceOf(this).dark()}get_dark(){return this.dark}};registerBaseClass(StyleManagerBase,`AdwStyleManager`,{},[E.boolean(`dark`,``,``,T.READABLE,!1)]);const Le={system:`Follow system`,light:`Light`,dark:`Dark`},Re={blue:`Blue`,teal:`Teal`,green:`Green`,yellow:`Yellow`,orange:`Orange`,red:`Red`,pink:`Pink`,purple:`Purple`,slate:`Slate`};var StorybookAppearance=class{constructor(){this._provider=null,this._applying=!1,this._styleManager=w.StyleManager.get_default(),this.settings=new StorybookSettings(()=>this._styleManager.get_dark()),this.settings.subscribe(e=>this._apply(e)),this._styleManager.connect(`notify::dark`,()=>this.settings.systemChanged()),this._apply(this.settings.state)}_apply(e){if(!this._applying){this._applying=!0;try{this._styleManager.set_color_scheme(e.colorScheme===`light`?w.ColorScheme.FORCE_LIGHT:e.colorScheme===`dark`?w.ColorScheme.FORCE_DARK:w.ColorScheme.DEFAULT),this._applyAccent(this.settings.resolvedAccent)}finally{this._applying=!1}}}_applyAccent(e){let t=f.Display.get_default();if(!t)return;if(!this._provider){if(!e)return;this._provider=new h.CssProvider,h.StyleContext.add_provider_for_display(t,this._provider,h.STYLE_PROVIDER_PRIORITY_APPLICATION)}if(!e){this._provider.load_from_string(``);return}let n=adwaitaAccentBgColor(e),r=adwaitaAccentColor(e,this.settings.resolvedDark);this._provider.load_from_string(`:root { --accent-bg-color: ${n}; --accent-color: ${r}; }`)}};function buildSwatch(e,t,n){let r=new h.CheckButton({tooltip_text:t,halign:h.Align.CENTER,valign:h.Align.CENTER,focus_on_click:!1});for(let t of e)r.add_css_class(t);return r.update_property([h.AccessibleProperty.LABEL],[t]),n&&r.set_group(n),r}function buildSwatchCard(e=!1){let t=new w.WrapBox({align:.5,child_spacing:8,line_spacing:8,margin_top:12,margin_bottom:12,margin_start:12,margin_end:12}),n=new w.Bin({child:t,hexpand:!0});return n.add_css_class(`card`),e&&n.add_css_class(`storybook-card-attached`),{card:n,row:t}}function buildAppearanceDialog(e){let t=e.settings,n=new w.PreferencesPage,r=new w.PreferencesGroup({title:`Style`}),{card:i,row:o}=buildSwatchCard(),s=null,c=new Map;for(let e of a){let n=buildSwatch([`storybook-swatch`,`storybook-scheme-swatch`,`storybook-scheme-${e}`],Le[e],s);s??=n,n.set_active(t.colorScheme===e),n.connect(`toggled`,()=>{n.get_active()&&(t.colorScheme=e)}),c.set(e,n),o.append(n)}r.add(i),n.add(r);let l=new w.PreferencesGroup({title:`Accent colour`});l.add_css_class(`storybook-attached-group`);let u=new w.SwitchRow({title:`Use a custom accent colour`,subtitle:`Off follows the desktop, which owns the accent`,active:t.accentMode===`custom`});l.add(u);let{card:d,row:f}=buildSwatchCard(!0),p=null,m=new Map;for(let e of pe){let n=buildSwatch([`storybook-swatch`],Re[e],p);p??=n,n.set_active(t.accent===e);let r=new h.CssProvider;r.load_from_string(`checkbutton { background-color: ${adwaitaAccentBgColor(e)}; }`),n.get_style_context().add_provider(r,h.STYLE_PROVIDER_PRIORITY_APPLICATION),n.connect(`toggled`,()=>{n.get_active()&&(t.accent=e)}),m.set(e,n),f.append(n)}f.set_sensitive(t.accentMode===`custom`),u.connect(`notify::active`,()=>{t.accentMode=u.get_active()?`custom`:`system`}),l.add(d),n.add(l),t.subscribe(e=>{let t=c.get(e.colorScheme);t&&!t.get_active()&&t.set_active(!0);let n=m.get(e.accent);n&&!n.get_active()&&n.set_active(!0);let r=e.accentMode===`custom`;u.get_active()!==r&&u.set_active(r),f.set_sensitive(r)});let g=new w.PreferencesDialog({title:`Appearance`});return g.add(n),g}function adwControlWidgetFactory(){return{text(e,t){let n=new w.EntryRow({title:e});t&&n.set_tooltip_text(t);let r=null;return n.connect(`changed`,()=>r?.(n.get_text())),{node:n,get:()=>n.get_text(),set:e=>n.set_text(e),onChange:e=>{r=e}}},boolean(e,t){let n=new w.SwitchRow({title:e,subtitle:t??``}),r=null;return n.connect(`notify::active`,()=>r?.(n.get_active())),{node:n,get:()=>n.get_active(),set:e=>n.set_active(e),onChange:e=>{r=e}}},number(e){let t=w.SpinRow.new_with_range(e.min??0,e.max??100,e.step??1);t.set_title(e.label||e.name),e.description&&t.set_subtitle(e.description);let n=null;return t.connect(`changed`,()=>n?.(t.get_value())),{node:t,get:()=>t.get_value(),set:e=>t.set_value(e),onChange:e=>{n=e}}},range(e){return buildRangeWidget(e)},select(e){return buildSelectWidget(e)},color(e,t){return buildColorWidget(e,t)}}}function buildRangeWidget(e){let t=e.min??0,n=e.max??100,r=e.step??1,i=typeof e.min==`number`?e.min:0,a=Number.isInteger(r)&&Number.isInteger(i),o=new h.Adjustment({lower:t,upper:n,step_increment:r,value:i});o.step_increment=r;let s=new h.ListBoxRow({selectable:!1,activatable:!1});s.add_css_class(`story-range-row`);let c=new h.Box({orientation:h.Orientation.VERTICAL,spacing:6,margin_top:12,margin_bottom:12,margin_start:12,margin_end:12}),l=new h.Box({orientation:h.Orientation.HORIZONTAL,spacing:12}),u=new h.Label({label:e.label||e.name,halign:h.Align.START,hexpand:!0,ellipsize:3});u.add_css_class(`heading`);let formatValue=e=>a?String(Math.round(e)):e.toFixed(2),d=new h.Label({label:formatValue(i),halign:h.Align.END});if(d.add_css_class(`numeric`),d.add_css_class(`dim-label`),l.append(u),l.append(d),c.append(l),e.description){let t=new h.Label({label:e.description,halign:h.Align.START,xalign:0,wrap:!0,max_width_chars:32});t.add_css_class(`caption`),t.add_css_class(`dim-label`),c.append(t)}let f=new h.Scale({orientation:h.Orientation.HORIZONTAL,adjustment:o,draw_value:!1,hexpand:!0}),p=null,m=!1;return f.connect(`value-changed`,()=>{if(m)return;let e=f.get_value();if(a){let t=Math.round(e);if(t!==e){f.set_value(t);return}e=t}d.set_label(formatValue(e)),p?.(e)}),c.append(f),s.set_child(c),{node:s,get:()=>f.get_value(),set:e=>{m=!0,f.set_value(e),m=!1,d.set_label(formatValue(e))},onChange:e=>{p=e}}}function buildSelectWidget(e){let t=e.options??[],n=h.StringList.new(t.map(e=>e.label)),r=new w.ComboRow({title:e.label||e.name,subtitle:e.description??``,model:n}),i=null;return r.connect(`notify::selected`,()=>i?.(r.get_selected())),{node:r,get:()=>r.get_selected(),set:e=>r.set_selected(e),onChange:e=>{i=e}}}function buildColorWidget(e,t){let n=new w.ActionRow({title:e,subtitle:t??``}),r=new h.ColorDialogButton({dialog:new h.ColorDialog({title:e}),valign:h.Align.CENTER});n.add_suffix(r),n.set_activatable_widget(r);let channel=e=>Math.round(Math.max(0,Math.min(1,e))*255).toString(16).padStart(2,`0`),rgbaToHex=e=>`#${channel(e.red)}${channel(e.green)}${channel(e.blue)}`,i=null,a=!1;return r.connect(`notify::rgba`,()=>{a||i?.(rgbaToHex(r.get_rgba()))}),{node:n,get:()=>rgbaToHex(r.get_rgba()),set:e=>{let t=new f.RGBA;t.parse(e)&&(a=!0,r.set_rgba(t),a=!1)},onChange:e=>{i=e}}}var ze=class StorybookWindow extends w.ApplicationWindow{static{S.registerClass({GTypeName:`StorybookWindow`,Template:`<?xml version="1.0" encoding="UTF-8"?>
|
|
74
74
|
<!--
|
|
75
75
|
DO NOT EDIT!
|
|
76
76
|
This file was @generated by blueprint-compiler. Instead, edit the
|
|
@@ -330,10 +330,10 @@ corresponding .blp file and regenerate this file with blueprint-compiler.
|
|
|
330
330
|
.story-stage {
|
|
331
331
|
padding: 18px;
|
|
332
332
|
}
|
|
333
|
-
\n${this._options.css??``}`);let t=f.Display.get_default();if(!t){console.error(`No display found`);return}h.StyleContext.add_provider_for_display(t,e,h.STYLE_PROVIDER_PRIORITY_APPLICATION)}_onActivate(){if(!this._window){this._window=new ze({application:this}),this._options.title&&this._window.set_title(this._options.title);try{this._window.populateSidebar(this._options.stories)}catch(e){console.error(`Failed to create story instances:`,e)}installDevtools(this,{enabled:this._options.devtools||void 0,extend:[storybookDevtoolsExtension(this._window)]}),probeEnabled()&&installStorybookProbe(this,this._window,this._options.probe)}this._window.present()}};S.type_ensure(Be.$gtype);function collectStoryModules(e){return collectStoryModules$1(e)}function buildGtkChrome(e){let t=new w.PreferencesPage,n=new w.PreferencesGroup,r=new h.Box({orientation:h.Orientation.VERTICAL,halign:h.Align.CENTER,valign:h.Align.CENTER,margin_top:12,margin_bottom:12,spacing:12,hexpand:!0});return r.add_css_class(`story-stage`),n.add(r),t.add(n),e.set_child(t),{root:e,hasStage:!0,setStageContent(e){let t=r.get_first_child();for(;t;)t.unparent(),t=r.get_first_child();r.append(e)},setChromeText(e,t){n.set_title(l.markup_escape_text(e,-1)),n.set_description(l.markup_escape_text(t,-1))}}}var StoryCore=class extends StoryViewBase{constructor(e,t,n){super(),this._widget=e,this.initBase(t,n)}createChrome(e){return buildGtkChrome(this._widget)}initialize(){this._widget.initialize()}updateArgs(e){this._widget.updateArgs(e)}teardown(){this._widget.teardown()}emitArgs(e){super.emitArgs(e),this._widget.notify(`args`)}},
|
|
334
|
-
`||n===` `||n===` `){if(r)continue;e+=` `,r=!0;continue}e+=n,r=!1}n+=escapeMarkup(e)}}return n}function parseDescription(e,t,n){let r=new Map,bucketFor=(e,t)=>{if(localeScore(n,e)===0&&e!==`C`)return null;let i=r.get(e);return i===void 0&&(i=[],r.set(e,i),t!==void 0&&i.push(`<${t}>\n`)),i};for(let n of childElements(e,t.start,t.end))if(n.name===`p`)bucketFor(lang(n))?.push(`<p>${inlineMarkup(e,n)}</p>\n`);else if(n.name===`ul`||n.name===`ol`){for(let e of r.values())e.push(`<${n.name}>\n`);for(let t of childElements(e,n.start,n.end))t.name===`li`&&bucketFor(lang(t),n.name)?.push(`<li>${inlineMarkup(e,t)}</li>\n`);for(let e of r.values())e.push(`</${n.name}>\n`)}let i=r.get(`C`),a=0;for(let[e,t]of r){let r=localeScore(n,e);r>a&&(a=r,i=t)}return i===void 0?null:i.join(``)}function parseAppdata(e,t={}){let n=t.locale??`C`,r=scanXml(e),i=childElements(r,0,r.length).find(e=>e.name===`component`||e.name===`application`);if(i===void 0)return{...He};let a={...He},o={value:null,score:0},s={value:null,score:0},c=[],l=null;for(let e of childElements(r,i.start,i.end))switch(e.name){case`id`:a.applicationId===null&&(a.applicationId=elementText(r,e));break;case`name`:considerTranslatable(o,e,elementText(r,e),localeScore(n,lang(e)));break;case`developer`:for(let t of childElements(r,e.start,e.end)){if(t.name!==`name`)continue;let e=localeScore(n,lang(t))+1024;e>s.score&&(lang(t)===`C`||e>1024)&&(s.score=e,s.value=elementText(r,t))}break;case`developer_name`:considerTranslatable(s,e,elementText(r,e),localeScore(n,lang(e)));break;case`url`:{let t=elementText(r,e);e.attributes.type===`homepage`?a.website=t:e.attributes.type===`bugtracker`?a.issueUrl=t:e.attributes.type===`help`&&(a.supportUrl=t);break}case`launchable`:e.attributes.type===`desktop-id`&&c.push(elementText(r,e));break;case`project_license`:a.license===null&&(a.license=elementText(r,e));break;case`releases`:l===null&&(l=e);break;default:break}if(a.applicationName=o.value,a.developerName=s.value,l!==null){let e=childElements(r,l.start,l.end).filter(e=>e.name===`release`);a.version=e[0]?.attributes.version??null;let i=t.releaseNotesVersion;if(i!==void 0&&i!==``){let t=e.find(e=>e.attributes.version===i),o=t&&childElements(r,t.start,t.end).find(e=>e.name===`description`);o&&(a.releaseNotes=parseDescription(r,o,n))}}a.applicationId!==null&&a.applicationId.endsWith(`.desktop`)&&(c.includes(`${a.applicationId}.desktop`)||(a.applicationId=a.applicationId.slice(0,-8)));for(let e of Object.keys(a))a[e]===``&&(a[e]=null);return a}const Ue={"GPL-2.0-or-later":h.License.GPL_2_0,"GPL-3.0-or-later":h.License.GPL_3_0,"LGPL-2.1-or-later":h.License.LGPL_2_1,"LGPL-3.0-or-later":h.License.LGPL_3_0,"BSD-2-Clause":h.License.BSD,MIT:h.License.MIT_X11,"Artistic-2.0":h.License.ARTISTIC,"GPL-2.0-only":h.License.GPL_2_0_ONLY,"GPL-3.0-only":h.License.GPL_3_0_ONLY,"LGPL-2.1-only":h.License.LGPL_2_1_ONLY,"LGPL-3.0-only":h.License.LGPL_3_0_ONLY,"AGPL-3.0-or-later":h.License.AGPL_3_0,"AGPL-3.0-only":h.License.AGPL_3_0_ONLY,"BSD-3-Clause":h.License.BSD_3,"Apache-2.0":h.License.APACHE_2_0,"MPL-2.0":h.License.MPL_2_0,"0BSD":h.License[`0BSD`],"GPL-2.0":h.License.GPL_2_0_ONLY,"GPL-3.0":h.License.GPL_3_0_ONLY};function licenseTypeFor(e){return Ue[e]??h.License.CUSTOM}function hasAppdataConstructor(e=w){try{return typeof e?.AboutDialog?.new_from_appdata==`function`}catch{return!1}}function applyAppdataFields(e,t,n){return t.applicationId!==null&&(e.applicationIcon=t.applicationId),t.applicationName!==null&&(e.applicationName=t.applicationName),t.developerName!==null&&(e.developerName=t.developerName),t.website!==null&&(e.website=t.website),t.supportUrl!==null&&(e.supportUrl=t.supportUrl),t.issueUrl!==null&&(e.issueUrl=t.issueUrl),t.license!==null&&(e.licenseType=licenseTypeFor(t.license)),n!==void 0&&n!==``&&(e.releaseNotesVersion=n),t.releaseNotes!==null&&(e.releaseNotes=t.releaseNotes),t.version!==null&&(e.version=t.version),e}function buildAboutDialogFromAppdata(e,t={}){let n=parseAppdata(e,{locale:t.locale??appdataLocale(l.get_language_names(),{LANG:l.getenv(`LANG`)??void 0}),releaseNotesVersion:t.releaseNotesVersion});return applyAppdataFields(new w.AboutDialog,n,t.releaseNotesVersion)}function resourceExists(e){try{return x.resources_get_info(e,x.ResourceLookupFlags.NONE),!0}catch{return!1}}function readResource(e){try{let t=x.resources_lookup_data(e,x.ResourceLookupFlags.NONE);return new TextDecoder().decode(t.toArray())}catch{return null}}function readFile(e){try{let[t,n]=l.file_get_contents(e);return t?new TextDecoder().decode(n):null}catch{return null}}let We=!1;function createAboutDialog(e={}){let{appdataResource:t,appdataPath:n,releaseNotesVersion:r}=e,i=t!==void 0&&resourceExists(t),a;if(!e.forceParsedAppdata&&i&&hasAppdataConstructor())a=w.AboutDialog.new_from_appdata(t,r??``);else{let o=(i?readResource(t):null)??(n===void 0?null:readFile(n));o===null?(console.error(`@gjsify/adwaita-app: no AppStream metainfo found for the About dialog; looked at resource ${t??`(none given)`} and file ${n??`(none given)`}`),a=new w.AboutDialog):(!We&&!e.forceParsedAppdata&&i&&(We=!0,console.log(`@gjsify/adwaita-app: Adw.AboutDialog.new_from_appdata is not in this GTK runtime (expected on Windows — gjsify/gjsify#1662); building the About dialog from the AppStream metainfo directly.`)),a=buildAboutDialogFromAppdata(o,{releaseNotesVersion:r}))}return e.applicationIcon!==void 0&&(a.applicationIcon=e.applicationIcon),e.version!==void 0&&(a.version=e.version),a}`application-x-executable.audio-volume-high.audio-volume-low.audio-volume-medium.audio-volume-muted.avatar-default.camera-photo.contact-new.dialog-error.dialog-warning.document-edit.document-open.document-save.edit-clear.edit-copy.edit-find.emblem-system.emoji-activities.emoji-body.emoji-flags.emoji-food.emoji-nature.emoji-objects.emoji-people.emoji-recent.emoji-symbols.emoji-travel.face-smile.folder.folder-documents.folder-download.folder-music.go-down.go-home.go-next.go-previous.go-up.image-missing.list-add.list-remove.mail-reply-sender.mail-send.mail-unread.media-eject.media-playback-pause.media-playback-start.media-playlist-repeat.network-wireless.open-menu.pan-down.pan-end.pan-end-rtl.preferences-system.printer.send-to.sidebar-show.starred.system-search.user-trash.value-decrease.value-increase.view-conceal.view-grid.view-list.view-more.view-paged.view-refresh.view-reveal.window-close.window-maximize.window-minimize.window-restore`.split(`.`);let k=null;function registerBundledIconResource(){if(k)return k;let e=l.base64_decode(`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`);return k=x.Resource.new_from_data(new l.Bytes(e)),x.resources_register(k),k}function addBundledIconsToTheme(e){registerBundledIconResource(),e.add_resource_path(`/eu/jumplink/gjsify/adwaita-app/icons`)}function installBundledIconTheme(e={}){let t=e.prefer??`fallback`;if(t===`host`)return!1;let n=e.display===void 0?f.Display.get_default():e.display;return n?(addBundledIconsToTheme(h.IconTheme.get_for_display(n)),t===`bundled`&&h.Settings.get_for_display(n).set_property(`gtk-icon-theme-name`,`gjsify-adwaita-bundled`),!0):!1}var Ge=class AdwaitaApp extends w.Application{static{S.registerClass({GTypeName:`GjsifyAdwaitaApp`},AdwaitaApp)}constructor(e){super({application_id:e.applicationId,flags:e.flags??x.ApplicationFlags.DEFAULT_FLAGS}),this._window=null,this._options=e,this._initActions(),this.connect(`startup`,()=>this._onStartup()),this.connect(`activate`,()=>this._onActivate())}_initActions(){if(this._options.quitAction!==!1){let e=new x.SimpleAction({name:`quit`});e.connect(`activate`,()=>this.quit()),this.add_action(e),this.set_accels_for_action(`app.quit`,[`<primary>q`])}if(this._options.about||this._options.aboutAppdata){let e=new x.SimpleAction({name:`about`});e.connect(`activate`,()=>this._showAbout()),this.add_action(e)}}_onStartup(){this._installBundledIcons(),this._options.css&&this._loadCss(this._options.css),this._installDevtools(),this._options.onStartup?.(this)}_installBundledIcons(){let e=this._options.bundledIcons;e!==!1&&installBundledIconTheme(typeof e==`object`?e:{})}_loadCss(e){let t=f.Display.get_default();if(!t){console.error(`@gjsify/adwaita-app: no default display; CSS not applied`);return}let n=new h.CssProvider;n.load_from_string(e),h.StyleContext.add_provider_for_display(t,n,h.STYLE_PROVIDER_PRIORITY_APPLICATION)}_installDevtools(){let e=this._options.devtools;if(e===!1)return;let t=typeof e==`object`?e:{enabled:e||void 0};installDevtools(this,t)}_onActivate(){this._window||=this._options.createWindow(this),this._window.present()}_showAbout(){let e=this._options.aboutAppdata;if(e){createAboutDialog(e).present(this.get_active_window());return}let t=this._options.about;if(!t)return;let n=new w.AboutDialog({application_name:t.applicationName,application_icon:t.applicationIcon??this._options.applicationId});t.version&&(n.version=t.version),t.developerName&&(n.developer_name=t.developerName),t.website&&(n.website=t.website),t.issueUrl&&(n.issue_url=t.issueUrl),t.license&&(n.license=t.license),t.comments&&(n.comments=t.comments),t.copyright&&(n.copyright=t.copyright),t.developers?.length&&n.set_developers(t.developers),n.present(this.get_active_window())}};async function runApplication(e,t){let n=!1;try{e.register(null),n=e.get_is_remote()}catch{n=!1}let r=await e.runAsync(t);return n&&console.error(`${e.applicationId??`This application`} is already running — brought the existing instance to the front instead of opening a second window.`),r}S.type_ensure(Ge.$gtype);var Ke=class LoadingStack extends h.Stack{static{S.registerClass({GTypeName:`GjsifyLoadingStack`},LoadingStack)}constructor(e={}){super(e);let t=new h.Box({orientation:h.Orientation.VERTICAL,halign:h.Align.CENTER,valign:h.Align.CENTER,hexpand:!0,vexpand:!0});t.append(new w.Spinner),this.add_named(t,`loading`),this._content=new w.Bin({hexpand:!0,vexpand:!0}),this.add_named(this._content,`content`),this._error=new w.StatusPage({iconName:`dialog-error-symbolic`,title:`Something went wrong`}),this.add_named(this._error,`error`),this.set_visible_child_name(`loading`)}setContent(e){this._content.set_child(e)}setError(e,t){this._error.set_title(e),this._error.set_description(t??``)}showLoading(){this.set_visible_child_name(`loading`)}showContent(){this.set_visible_child_name(`content`)}showError(){this.set_visible_child_name(`error`)}};S.type_ensure(Ke.$gtype);async function runStorybook(e){return runApplication(new Be(e),[t.programInvocationName,...t.programArgs])}const qe={title:`Buttons/Button Content`,description:`Adw.ButtonContent — pairs a symbolic icon with a label inside a Gtk.Button.`,controls:[{name:`label`,label:`Label`,type:i.TEXT,defaultValue:`Download`},{name:`iconName`,label:`Icon`,type:i.SELECT,options:[{label:`Download`,value:`folder-download-symbolic`},{label:`Add`,value:`list-add-symbolic`},{label:`Send`,value:`mail-send-symbolic`},{label:`Star`,value:`starred-symbolic`}],defaultValue:`folder-download-symbolic`},{name:`canShrink`,label:`Can shrink`,type:i.BOOLEAN,defaultValue:!1}]};var Je=__exportAll({ButtonContentStories:()=>Ye,ButtonContentStory:()=>A}),A=class ButtonContentStory extends D{_content=null;_button=null;static{S.registerClass({GTypeName:`AdwStorybookButtonContent`},ButtonContentStory)}constructor(){super(D.fromMeta(ButtonContentStory.getMetadata(),`Default`))}static getMetadata(){return{...qe,component:w.ButtonContent.$gtype}}initialize(){this._content=new w.ButtonContent({label:this.args.label,iconName:this.args.iconName,canShrink:this.args.canShrink}),this._button=new h.Button({child:this._content}),this._button.add_css_class(`suggested-action`),this._button.add_css_class(`pill`),this.addContent(this._button)}updateArgs(e){this._content&&(this._content.label=this.args.label,this._content.iconName=this.args.iconName,this._content.canShrink=this.args.canShrink)}};S.type_ensure(A.$gtype);const Ye={stories:[A]},Xe={title:`Buttons/Button Styles`,description:`Buttons with Adwaita style classes: .pill, .circular, .suggested-action, .destructive-action, .flat.`,controls:[{name:`label`,label:`Demo label`,type:i.TEXT,defaultValue:`Click me`},{name:`style`,label:`Demo style`,type:i.SELECT,options:[{label:`Pill`,value:`pill`},{label:`Circular (icon)`,value:`circular`},{label:`Suggested`,value:`suggested-action`},{label:`Destructive`,value:`destructive-action`},{label:`Flat`,value:`flat`}],defaultValue:`suggested-action`}]};var Ze=__exportAll({ButtonStylesStories:()=>$e,ButtonStylesStory:()=>j});const Qe=[`pill`,`circular`,`suggested-action`,`destructive-action`,`flat`];var j=class ButtonStylesStory extends D{_demo=null;static{S.registerClass({GTypeName:`AdwStorybookButtonStyles`},ButtonStylesStory)}constructor(){super(D.fromMeta(ButtonStylesStory.getMetadata(),`Default`))}static getMetadata(){return{...Xe,component:h.Button.$gtype}}initialize(){let e=new w.WrapBox({childSpacing:12,lineSpacing:12,halign:h.Align.CENTER}),t=new h.Button({label:`Pill`});t.add_css_class(`pill`),e.append(t);let n=new h.Button({iconName:`list-add-symbolic`});n.add_css_class(`circular`),e.append(n);let r=new h.Button({label:`Suggested`});r.add_css_class(`suggested-action`),e.append(r);let i=new h.Button({label:`Delete`});i.add_css_class(`destructive-action`),e.append(i);let a=new h.Button({label:`Flat`});a.add_css_class(`flat`),e.append(a),this._demo=new h.Button({label:this.args.label}),this._applyStyle(this.args.style),e.append(this._demo),this.addContent(e)}_applyStyle(e){if(this._demo){for(let e of Qe)this._demo.remove_css_class(e);this._demo.add_css_class(e)}}updateArgs(e){this._demo&&(this._demo.label=this.args.label,this._applyStyle(this.args.style))}};S.type_ensure(j.$gtype);const $e={stories:[j]},et={title:`Buttons/Color Dialog Button`,description:`Gtk.ColorDialogButton — a button that shows a colour and opens a chooser for it. It is insensitive until a dialog is set, and the swatch announces the channel percentages.`,controls:[{name:`rgba`,label:`Colour`,type:i.TEXT,defaultValue:`#3584e4`},{name:`title`,label:`Dialog title`,type:i.TEXT,defaultValue:`Choose a colour`}]};var tt=__exportAll({ColorDialogButtonStories:()=>nt,ColorDialogButtonStory:()=>M}),M=class ColorDialogButtonStory extends D{_button=null;static{S.registerClass({GTypeName:`AdwStorybookColorDialogButton`},ColorDialogButtonStory)}constructor(){super(D.fromMeta(ColorDialogButtonStory.getMetadata(),`Default`))}static getMetadata(){return{...et,component:h.ColorDialogButton.$gtype}}initialize(){this._button=new h.ColorDialogButton({halign:h.Align.CENTER}),this._button.dialog=new h.ColorDialog,this._apply(),this.addContent(this._button)}updateArgs(e){this._apply()}_apply(){if(!this._button)return;let e=new f.RGBA;e.parse(this.args.rgba)&&(this._button.rgba=e),this._button.dialog.title=this.args.title||``}};S.type_ensure(M.$gtype);const nt={stories:[M]},rt=e(import.meta.url);let N;function load(){return N===void 0&&(N=rt("@gjsify/node-gi/gi").requireGi(`Pango`,`1.0`)),N}var it=new Proxy(Object.create(null),{get(e,t){return load()[t]},has(e,t){return t in load()}});const at={title:`Buttons/Font Dialog Button`,description:`Gtk.FontDialogButton — a button that shows a font and opens a chooser for it. At level family the label is the family alone; from font up it is family plus size, and the size box appears.`,controls:[{name:`fontDesc`,label:`Font`,type:i.TEXT,defaultValue:`Sans Bold 12`},{name:`level`,label:`Level`,type:i.SELECT,options:[{label:`Family`,value:`family`},{label:`Face`,value:`face`},{label:`Font`,value:`font`},{label:`Features`,value:`features`}],defaultValue:`font`},{name:`useFont`,label:`Draw in the font`,type:i.BOOLEAN,defaultValue:!0},{name:`useSize`,label:`Draw in the size`,type:i.BOOLEAN,defaultValue:!0}]};var ot=__exportAll({FontDialogButtonStories:()=>st,FontDialogButtonStory:()=>P}),P=class FontDialogButtonStory extends D{_button=null;static{S.registerClass({GTypeName:`AdwStorybookFontDialogButton`},FontDialogButtonStory)}constructor(){super(D.fromMeta(FontDialogButtonStory.getMetadata(),`Default`))}static getMetadata(){return{...at,component:h.FontDialogButton.$gtype}}initialize(){this._button=new h.FontDialogButton({halign:h.Align.CENTER}),this._button.dialog=new h.FontDialog,this._apply(),this.addContent(this._button)}updateArgs(e){this._apply()}_apply(){if(!this._button)return;this._button.level=this.args.level;let e=it.FontDescription.from_string(this.args.fontDesc);e!==null&&(this._button.fontDesc=e),this._button.useFont=this.args.useFont,this._button.useSize=this.args.useSize}};S.type_ensure(P.$gtype);const st={stories:[P]},ct={title:`Buttons/Link Button`,description:`Gtk.LinkButton — a button that follows a URI. It is a Gtk.Button with a uri and a visited state: clicking launches the URI and marks the link visited, and pointing it somewhere new un-visits it.`,controls:[{name:`label`,label:`Label`,type:i.TEXT,defaultValue:`GNOME`},{name:`uri`,label:`URI`,type:i.TEXT,defaultValue:`https://gnome.org`},{name:`visited`,label:`Visited`,type:i.BOOLEAN,defaultValue:!1}]};var lt=__exportAll({LinkButtonStories:()=>ut,LinkButtonStory:()=>F}),F=class LinkButtonStory extends D{_button=null;static{S.registerClass({GTypeName:`AdwStorybookLinkButton`},LinkButtonStory)}constructor(){super(D.fromMeta(LinkButtonStory.getMetadata(),`Default`))}static getMetadata(){return{...ct,component:h.LinkButton.$gtype}}initialize(){this._button=new h.LinkButton({halign:h.Align.CENTER}),this._apply(),this.addContent(this._button)}updateArgs(e){this._apply()}_apply(){if(!this._button)return;let e=this.args.label;this._button.label=e,this._button.uri=this.args.uri,this._button.visited=this.args.visited}};S.type_ensure(F.$gtype);const ut={stories:[F]},dt=[`Save as…`,`Export`,`Print`],ft={title:`Buttons/Menu Button`,description:`Gtk.MenuButton — a button whose only action is to open a menu. Where a Split Button has a primary action beside its arrow, this one has none: every choice lives in the popover.`,controls:[{name:`iconName`,label:`Icon`,type:i.SELECT,options:[{label:`Hamburger`,value:`open-menu-symbolic`},{label:`More`,value:`view-more-symbolic`},{label:`Open`,value:`document-open-symbolic`}],defaultValue:`open-menu-symbolic`},{name:`menuTitle`,label:`Menu title`,type:i.TEXT,defaultValue:`Document`}]};var pt=__exportAll({MenuButtonStories:()=>mt,MenuButtonStory:()=>I}),I=class MenuButtonStory extends D{_widget=null;static{S.registerClass({GTypeName:`AdwStorybookMenuButton`},MenuButtonStory)}constructor(){super(D.fromMeta(MenuButtonStory.getMetadata(),`Default`))}static getMetadata(){return{...ft,component:h.MenuButton.$gtype}}initialize(){this._widget=new h.MenuButton({halign:h.Align.CENTER}),this._apply(),this.addContent(this._widget)}updateArgs(e){this._apply()}_buildMenu(e){let t=new x.Menu;for(let e of dt)t.append(e,`app.${e.toLowerCase().replace(/[^a-z]+/g,`-`)}`);let n=new x.Menu;return n.append_section(e.length>0?e:null,t),n}_apply(){this._widget&&(this._widget.iconName=this.args.iconName,this._widget.menuModel=this._buildMenu(this.args.menuTitle))}};S.type_ensure(I.$gtype);const mt={stories:[I]},ht=[`audio-volume-muted-symbolic`,`audio-volume-low-symbolic`,`audio-volume-high-symbolic`],gt={title:`Buttons/Scale Button`,description:`Gtk.ScaleButton — a button whose press opens a scale. The icon follows the value: no list draws image-missing, one name is used throughout, two split the range, three put the first at the bottom and the second at the top and share the interior, five spread it.`,controls:[{name:`value`,label:`Value`,type:i.NUMBER,defaultValue:70},{name:`orientation`,label:`Orientation`,type:i.SELECT,options:[{label:`Vertical`,value:`vertical`},{label:`Horizontal`,value:`horizontal`}],defaultValue:`vertical`},{name:`hasFrame`,label:`Has frame`,type:i.BOOLEAN,defaultValue:!1}]};var _t=__exportAll({ScaleButtonStories:()=>vt,ScaleButtonStory:()=>L}),L=class ScaleButtonStory extends D{_button=null;static{S.registerClass({GTypeName:`AdwStorybookScaleButton`},ScaleButtonStory)}constructor(){super(D.fromMeta(ScaleButtonStory.getMetadata(),`Default`))}static getMetadata(){return{...gt,component:h.ScaleButton.$gtype}}initialize(){this._button=new h.ScaleButton({halign:h.Align.CENTER}),this._button.icons=ht,this._apply(),this.addContent(this._button)}updateArgs(e){this._apply()}_apply(){this._button&&(this._button.orientation=this.args.orientation===`horizontal`?h.Orientation.HORIZONTAL:h.Orientation.VERTICAL,this._button.hasFrame=this.args.hasFrame,this._button.value=this.args.value)}};S.type_ensure(L.$gtype);const vt={stories:[L]},yt={title:`Buttons/Split Button`,description:`Adw.SplitButton — a primary action button paired with a dropdown menu of related actions.`,controls:[{name:`label`,label:`Label`,type:i.TEXT,defaultValue:`Save`},{name:`iconName`,label:`Icon`,type:i.SELECT,options:[{label:`None`,value:``},{label:`Save`,value:`document-save-symbolic`},{label:`Send`,value:`mail-send-symbolic`},{label:`Add`,value:`list-add-symbolic`}],defaultValue:`document-save-symbolic`}]},bt={title:`Buttons/Split Button Flat`,description:`Adw.SplitButton with the .flat style class, as used inside header bars and toolbars.`,controls:[{name:`label`,label:`Label`,type:i.TEXT,defaultValue:`Reply`},{name:`iconName`,label:`Icon`,type:i.SELECT,options:[{label:`None`,value:``},{label:`Reply`,value:`mail-reply-sender-symbolic`},{label:`Edit`,value:`document-edit-symbolic`},{label:`Open`,value:`document-open-symbolic`}],defaultValue:`mail-reply-sender-symbolic`}]};var xt=__exportAll({SplitButtonFlatStory:()=>z,SplitButtonStories:()=>St,SplitButtonStory:()=>R});function buildMenu(){let e=new x.Menu;return e.append(`Save as…`,`app.save-as`),e.append(`Export`,`app.export`),e.append(`Print`,`app.print`),e}var R=class SplitButtonStory extends D{_widget=null;static{S.registerClass({GTypeName:`AdwStorybookSplitButton`},SplitButtonStory)}constructor(){super(D.fromMeta(SplitButtonStory.getMetadata(),`Default`))}static getMetadata(){return{...yt,component:w.SplitButton.$gtype}}initialize(){this._widget=new w.SplitButton({label:this.args.label,menuModel:buildMenu()});let e=this.args.iconName;e&&(this._widget.iconName=e),this.addContent(this._widget)}updateArgs(e){if(!this._widget)return;let t=this.args.iconName;t?this._widget.iconName=t:this._widget.label=this.args.label}};S.type_ensure(R.$gtype);var z=class SplitButtonFlatStory extends D{_widget=null;static{S.registerClass({GTypeName:`AdwStorybookSplitButtonFlat`},SplitButtonFlatStory)}constructor(){super(D.fromMeta(SplitButtonFlatStory.getMetadata(),`Default`))}static getMetadata(){return{...bt,component:w.SplitButton.$gtype}}initialize(){this._widget=new w.SplitButton({label:this.args.label,menuModel:buildMenu()}),this._widget.add_css_class(`flat`);let e=this.args.iconName;e&&(this._widget.iconName=e),this.addContent(this._widget)}updateArgs(e){if(!this._widget)return;let t=this.args.iconName;t?this._widget.iconName=t:this._widget.label=this.args.label}};S.type_ensure(z.$gtype);const St={stories:[R,z]},Ct={title:`Buttons/Toggle Button`,description:`Gtk.ToggleButton — a button that stays pressed. It is a Gtk.Button with one more property, active, so every button style class applies; Adw.ToggleGroup is the linked, single-choice form of it.`,controls:[{name:`label`,label:`Label`,type:i.TEXT,defaultValue:`Mute`},{name:`active`,label:`Active`,type:i.BOOLEAN,defaultValue:!1},{name:`flat`,label:`Flat`,type:i.BOOLEAN,defaultValue:!1}]};var wt=__exportAll({ToggleButtonStories:()=>Tt,ToggleButtonStory:()=>B}),B=class ToggleButtonStory extends D{_button=null;static{S.registerClass({GTypeName:`AdwStorybookToggleButton`},ToggleButtonStory)}constructor(){super(D.fromMeta(ToggleButtonStory.getMetadata(),`Default`))}static getMetadata(){return{...Ct,component:h.ToggleButton.$gtype}}initialize(){this._button=new h.ToggleButton({halign:h.Align.CENTER}),this._apply(),this.addContent(this._button)}updateArgs(e){this._apply()}_apply(){this._button&&(this._button.label=this.args.label,this._button.active=this.args.active,this.args.flat?this._button.add_css_class(`flat`):this._button.remove_css_class(`flat`))}};S.type_ensure(B.$gtype);const Tt={stories:[B]},Et={title:`Buttons/Toggle Group`,description:`Adw.ToggleGroup — a linked group of Adw.Toggle buttons where exactly one is active.`,controls:[{name:`active`,label:`Active toggle`,type:i.SELECT,options:[{label:`List`,value:0},{label:`Grid`,value:1},{label:`Columns`,value:2}],defaultValue:0},{name:`style`,label:`Style`,type:i.SELECT,options:[{label:`Default`,value:`default`},{label:`Flat`,value:`flat`},{label:`Round`,value:`round`}],defaultValue:`default`}]};var Dt=__exportAll({ToggleGroupStories:()=>kt,ToggleGroupStory:()=>V});const Ot=[`flat`,`round`];var V=class ToggleGroupStory extends D{_toggleGroup=null;static{S.registerClass({GTypeName:`AdwStorybookToggleGroup`},ToggleGroupStory)}constructor(){super(D.fromMeta(ToggleGroupStory.getMetadata(),`Default`))}static getMetadata(){return{...Et,component:w.ToggleGroup.$gtype}}initialize(){this._toggleGroup=new w.ToggleGroup,this._toggleGroup.add(new w.Toggle({label:`List`,iconName:`view-list-symbolic`})),this._toggleGroup.add(new w.Toggle({label:`Grid`,iconName:`view-grid-symbolic`})),this._toggleGroup.add(new w.Toggle({label:`Columns`,iconName:`view-columns-symbolic`})),this._toggleGroup.active=this.args.active,this._applyStyle(this.args.style),this.addContent(this._toggleGroup)}_applyStyle(e){if(this._toggleGroup){for(let e of Ot)this._toggleGroup.remove_css_class(e);e!=="default"&&this._toggleGroup.add_css_class(e)}}updateArgs(e){this._toggleGroup&&(this._toggleGroup.active=this.args.active,this._applyStyle(this.args.style))}};S.type_ensure(V.$gtype);const kt={stories:[V]},At={title:`Controls/Check Button`,description:`Gtk.CheckButton — a label beside an indicator, with a third "in between" state for a selection that is only partly made. The browser element spells the two states checked and indeterminate, the words the Adwaita stylesheet selects on; the grouped, single-choice form is Adw.Radio.`,controls:[{name:`label`,label:`Label`,type:i.TEXT,defaultValue:`Enable networking`},{name:`checked`,label:`Checked`,type:i.BOOLEAN,defaultValue:!0},{name:`indeterminate`,label:`Indeterminate`,type:i.BOOLEAN,defaultValue:!1},{name:`disabled`,label:`Disabled`,type:i.BOOLEAN,defaultValue:!1}]};var jt=__exportAll({CheckButtonStories:()=>Mt,CheckButtonStory:()=>H}),H=class CheckButtonStory extends D{_box=null;_button=null;static{S.registerClass({GTypeName:`AdwStorybookCheckButton`},CheckButtonStory)}constructor(){super(D.fromMeta(CheckButtonStory.getMetadata(),`Default`))}static getMetadata(){return{...At,component:h.CheckButton.$gtype}}initialize(){this._button=new h.CheckButton,this._box=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12,halign:h.Align.CENTER}),this._box.append(this._button),this._apply(),this.addContent(this._box)}updateArgs(e){this._apply()}_apply(){this._button&&(this._button.label=this.args.label,this._button.active=this.args.checked,this._button.inconsistent=this.args.indeterminate,this._button.sensitive=!this.args.disabled)}};S.type_ensure(H.$gtype);const Mt={stories:[H]},Nt=[`Automatic`,`Always`,`Never`,`When busy`],Pt={title:`Controls/Drop Down`,description:`Gtk.DropDown — pick one value from a list. The button shows the selection; the list opens in a popover. Adw.ComboRow is the same choice presented as a boxed-list row.`,controls:[{name:`selected`,label:`Selected`,type:i.SELECT,options:Nt.map((e,t)=>({label:e,value:t})),defaultValue:0},{name:`enableSearch`,label:`Search field`,type:i.BOOLEAN,defaultValue:!1}]};var Ft=__exportAll({DropDownStories:()=>It,DropDownStory:()=>U}),U=class DropDownStory extends D{_dropDown=null;static{S.registerClass({GTypeName:`AdwStorybookDropDown`},DropDownStory)}constructor(){super(D.fromMeta(DropDownStory.getMetadata(),`Default`))}static getMetadata(){return{...Pt,component:h.DropDown.$gtype}}initialize(){this._dropDown=h.DropDown.new_from_strings([...Nt]),this._dropDown.expression=h.PropertyExpression.new(h.StringObject.$gtype,null,`string`),this._dropDown.halign=h.Align.CENTER,this._apply(),this.addContent(this._dropDown)}updateArgs(e){this._apply()}_apply(){this._dropDown&&(this._dropDown.selected=this.args.selected,this._dropDown.enableSearch=this.args.enableSearch)}};S.type_ensure(U.$gtype);const It={stories:[U]},Lt={title:`Controls/Entry`,description:`Gtk.Entry — a single-line text field. Libadwaita ships no AdwEntry; the Adwaita look is the GTK entry styled by the stylesheet, which is why the row variants (Entry Row, Password Entry Row) are the widgets with an Adw prefix.`,controls:[{name:`text`,label:`Text`,type:i.TEXT,defaultValue:``},{name:`placeholder`,label:`Placeholder`,type:i.TEXT,defaultValue:`Search files…`},{name:`editable`,label:`Editable`,type:i.BOOLEAN,defaultValue:!0}]};var Rt=__exportAll({EntryStories:()=>zt,EntryStory:()=>W}),W=class EntryStory extends D{_entry=null;static{S.registerClass({GTypeName:`AdwStorybookEntry`},EntryStory)}constructor(){super(D.fromMeta(EntryStory.getMetadata(),`Default`))}static getMetadata(){return{...Lt,component:h.Entry.$gtype}}initialize(){this._entry=new h.Entry({widthRequest:280,halign:h.Align.CENTER}),this._apply(),this.addContent(this._entry)}updateArgs(e){this._apply()}_apply(){this._entry&&(this._entry.text=this.args.text,this._entry.placeholderText=this.args.placeholder,this._entry.editable=this.args.editable)}};S.type_ensure(W.$gtype);const zt={stories:[W]},Bt={title:`Controls/Spinner (GTK)`,description:`Gtk.Spinner — GTK's own busy indicator: a faint ring with a quarter arc turning around it, sized by its allocation. Adw.Spinner is the libadwaita replacement and looks different; under reduced motion GTK swaps this one for a static hourglass, which Adw.Spinner deliberately does not do.`,controls:[{name:`size`,label:`Size (px)`,type:i.RANGE,min:16,max:64,step:4,defaultValue:32},{name:`spinning`,label:`Spinning`,type:i.BOOLEAN,defaultValue:!0},{name:`disabled`,label:`Disabled`,type:i.BOOLEAN,defaultValue:!1}]};var Vt=__exportAll({GtkSpinnerStories:()=>Ht,GtkSpinnerStory:()=>G}),G=class GtkSpinnerStory extends D{_spinner=null;static{S.registerClass({GTypeName:`AdwStorybookGtkSpinner`},GtkSpinnerStory)}constructor(){super(D.fromMeta(GtkSpinnerStory.getMetadata(),`Default`))}static getMetadata(){return{...Bt,component:h.Spinner.$gtype}}initialize(){this._spinner=new h.Spinner({halign:h.Align.CENTER,valign:h.Align.CENTER}),this._apply(),this.addContent(this._spinner)}updateArgs(e){this._apply()}_apply(){if(!this._spinner)return;let e=this.args.size;this._spinner.widthRequest=e,this._spinner.heightRequest=e,this.args.spinning?this._spinner.start():this._spinner.stop(),this._spinner.sensitive=!this.args.disabled}};S.type_ensure(G.$gtype);const Ht={stories:[G]},Ut={title:`Controls/Level Bar`,description:"Gtk.LevelBar — how full something is, over an interval that need not be 0…1: a password strength meter, a battery. `mode` decides one filled level or one block per unit, and the block takes a class from the nearest OFFSET (low, high, full by default), which is how libadwaita colours it and how an application adds a colour of its own.",controls:[{name:`value`,label:`Value`,type:i.RANGE,min:0,max:1,step:.05,defaultValue:.8},{name:`maxValue`,label:`Max value`,type:i.RANGE,min:1,max:5,step:1,defaultValue:5},{name:`mode`,label:`Mode`,type:i.SELECT,options:[{label:`Continuous`,value:`continuous`},{label:`Discrete`,value:`discrete`}],defaultValue:`continuous`},{name:`orientation`,label:`Orientation`,type:i.SELECT,options:[{label:`Horizontal`,value:`horizontal`},{label:`Vertical`,value:`vertical`}],defaultValue:`horizontal`},{name:`inverted`,label:`Inverted`,type:i.BOOLEAN,defaultValue:!1}]};var Wt=__exportAll({LevelBarStories:()=>Gt,LevelBarStory:()=>K}),K=class LevelBarStory extends D{_box=null;_bar=null;static{S.registerClass({GTypeName:`AdwStorybookLevelBar`},LevelBarStory)}constructor(){super(D.fromMeta(LevelBarStory.getMetadata(),`Default`))}static getMetadata(){return{...Ut,component:h.LevelBar.$gtype}}initialize(){this._bar=new h.LevelBar,this._box=new h.Box({halign:h.Align.CENTER,valign:h.Align.CENTER}),this._box.append(this._bar),this._apply(),this.addContent(this._box)}updateArgs(e){this._apply()}_apply(){if(!this._bar)return;let e=this.args.orientation===`vertical`;this._bar.orientation=e?h.Orientation.VERTICAL:h.Orientation.HORIZONTAL,this._bar.widthRequest=e?0:200,this._bar.heightRequest=e?120:0,this._bar.max_value=this.args.maxValue,this._bar.mode=this.args.mode===`discrete`?h.LevelBarMode.DISCRETE:h.LevelBarMode.CONTINUOUS,this._bar.value=this.args.value,this._bar.inverted=this.args.inverted}};S.type_ensure(K.$gtype);const Gt={stories:[K]},Kt={title:`Controls/Password Entry`,description:`Gtk.PasswordEntry — a field for a secret: masked, no copy, a Caps Lock warning while it has focus, and show-peek-icon for a button that reveals it for one look. Adw.PasswordEntryRow is the boxed-list row built on it. Press the peek button, or Caps Lock on the keyboard, to see both states.`,controls:[{name:`showPeekIcon`,label:`Show peek icon`,type:i.BOOLEAN,defaultValue:!0},{name:`placeholderText`,label:`Placeholder`,type:i.TEXT,defaultValue:`Password`},{name:`disabled`,label:`Disabled`,type:i.BOOLEAN,defaultValue:!1}]};var qt=__exportAll({PasswordEntryStories:()=>Jt,PasswordEntryStory:()=>q}),q=class PasswordEntryStory extends D{_entry=null;static{S.registerClass({GTypeName:`AdwStorybookPasswordEntry`},PasswordEntryStory)}constructor(){super(D.fromMeta(PasswordEntryStory.getMetadata(),`Default`))}static getMetadata(){return{...Kt,component:h.PasswordEntry.$gtype}}initialize(){this._entry=new h.PasswordEntry({showPeekIcon:!0,widthRequest:240,halign:h.Align.CENTER}),this._apply(),this.addContent(this._entry)}updateArgs(e){this._apply()}_apply(){this._entry&&(this._entry.show_peek_icon=this.args.showPeekIcon,this._entry.placeholder_text=this.args.placeholderText,this._entry.sensitive=!this.args.disabled)}};S.type_ensure(q.$gtype);const Jt={stories:[q]},Yt={title:`Controls/Progress Bar`,description:"Gtk.ProgressBar — how much of a long operation is done. `fraction` is 0…1, `pulsing` is the indeterminate mode where the app knows it is busy but not how far along it is, and `osd` is libadwaita's hairline variant for under a header bar. Adw.Spinner is the size-less sibling.",controls:[{name:`fraction`,label:`Fraction`,type:i.RANGE,min:0,max:1,step:.05,defaultValue:.4},{name:`pulsing`,label:`Pulsing (indeterminate)`,type:i.BOOLEAN,defaultValue:!1},{name:`showText`,label:`Show text`,type:i.BOOLEAN,defaultValue:!0},{name:`inverted`,label:`Inverted`,type:i.BOOLEAN,defaultValue:!1},{name:`osd`,label:`OSD (hairline)`,type:i.BOOLEAN,defaultValue:!1}]};var Xt=__exportAll({ProgressBarStories:()=>Zt,ProgressBarStory:()=>J}),J=class ProgressBarStory extends D{_box=null;_bar=null;static{S.registerClass({GTypeName:`AdwStorybookProgressBar`},ProgressBarStory)}constructor(){super(D.fromMeta(ProgressBarStory.getMetadata(),`Default`))}static getMetadata(){return{...Yt,component:h.ProgressBar.$gtype}}initialize(){this._bar=new h.ProgressBar,this._box=new h.Box({spacing:12,halign:h.Align.CENTER}),this._box.append(this._bar),this._apply(),this.addContent(this._box)}updateArgs(e){this._apply()}_apply(){this._bar&&(this.args.pulsing?this._bar.pulse():this._bar.set_fraction(this.args.fraction),this._bar.show_text=this.args.showText,this._bar.inverted=this.args.inverted,this.args.osd?this._bar.add_css_class(`osd`):this._bar.remove_css_class(`osd`))}};S.type_ensure(J.$gtype);const Zt={stories:[J]},Qt={title:`Controls/Scale`,description:`Gtk.Scale — a slider. Gtk.Scale extends Gtk.Range, which is abstract: the range itself has no tag, its adjustment, value, inverted and fill level are this widget’s properties. draw-value shows the number beside the knob at the value-pos you name, and the .value style class dims it.`,controls:[{name:`orientation`,label:`Orientation`,type:i.SELECT,options:[{label:`Horizontal`,value:`horizontal`},{label:`Vertical`,value:`vertical`}],defaultValue:`horizontal`},{name:`valuePos`,label:`Value position`,type:i.SELECT,options:[{label:`Top`,value:`top`},{label:`Bottom`,value:`bottom`},{label:`Left`,value:`left`},{label:`Right`,value:`right`}],defaultValue:`top`},{name:`drawValue`,label:`Draw value`,type:i.BOOLEAN,defaultValue:!0},{name:`digits`,label:`Digits`,type:i.NUMBER,defaultValue:0},{name:`inverted`,label:`Inverted`,type:i.BOOLEAN,defaultValue:!1},{name:`hasOrigin`,label:`Has origin`,type:i.BOOLEAN,defaultValue:!0},{name:`value`,label:`Value`,type:i.NUMBER,defaultValue:40}]};var $t=__exportAll({ScaleStories:()=>en,ScaleStory:()=>Y}),Y=class ScaleStory extends D{_scale=null;_adjustment=null;static{S.registerClass({GTypeName:`AdwStorybookScale`},ScaleStory)}constructor(){super(D.fromMeta(ScaleStory.getMetadata(),`Default`))}static getMetadata(){return{...Qt,component:h.Scale.$gtype}}initialize(){this._adjustment=new h.Adjustment({value:40,lower:0,upper:100,stepIncrement:1,pageIncrement:10}),this._scale=new h.Scale({adjustment:this._adjustment,digits:0,drawValue:!0,widthRequest:260,valign:h.Align.CENTER}),this._apply(),this.addContent(this._scale)}updateArgs(e){this._apply()}_apply(){if(!this._scale||!this._adjustment)return;this._scale.orientation=this.args.orientation===`vertical`?h.Orientation.VERTICAL:h.Orientation.HORIZONTAL;let e={top:h.PositionType.TOP,bottom:h.PositionType.BOTTOM,left:h.PositionType.LEFT,right:h.PositionType.RIGHT};this._scale.value_pos=e[this.args.valuePos]??h.PositionType.TOP,this._scale.draw_value=this.args.drawValue,this._scale.digits=this.args.digits,this._scale.inverted=this.args.inverted,this._scale.has_origin=this.args.hasOrigin,this._adjustment.set_value(this.args.value)}};S.type_ensure(Y.$gtype);const en={stories:[Y]},tn={title:`Controls/Search Entry`,description:`Gtk.SearchEntry — a field for typing a query. A search glyph leads while it is empty and a clear button follows once it is not, and search-changed waits out search-delay so a filter is not driven by every keystroke. Escape is stop-search, Ctrl+G is next-match.`,controls:[{name:`searchDelay`,label:`Search delay (ms)`,type:i.NUMBER,defaultValue:150},{name:`placeholderText`,label:`Placeholder`,type:i.TEXT,defaultValue:`Search…`},{name:`disabled`,label:`Disabled`,type:i.BOOLEAN,defaultValue:!1}]};var nn=__exportAll({SearchEntryStories:()=>an,SearchEntryStory:()=>rn}),rn=class SearchEntryStory extends D{_entry=null;_label=null;_handler=0;static{S.registerClass({GTypeName:`AdwStorybookSearchEntry`},SearchEntryStory)}constructor(){super(D.fromMeta(SearchEntryStory.getMetadata(),`Default`))}static getMetadata(){return{...tn,component:h.SearchEntry.$gtype}}initialize(){this._entry=new h.SearchEntry({widthRequest:260,halign:h.Align.CENTER}),this._label=new h.Label({label:`search-changed has not fired yet`}),this._handler=this._entry.connect(`search-changed`,()=>{this._label&&(this._label.label=`search-changed: "${this._entry?.text??``}"`)}),this._apply();let e=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12});e.append(this._entry),e.append(this._label),this.addContent(e)}updateArgs(e){this._apply()}_apply(){this._entry&&(this._entry.search_delay=this.args.searchDelay,this._entry.placeholder_text=this.args.placeholderText,this._entry.sensitive=!this.args.disabled)}};S.type_ensure(rn.$gtype);const an={stories:[rn]},on={title:`Controls/Spin Button`,description:`Gtk.SpinButton — a number field with an arrow either side of it. The range is a Gtk.Adjustment, the typed value is clamped into it (or left alone, under update-policy if-valid), and numeric refuses anything that is not a number. Adw.SpinRow is the boxed-list row that wraps this same widget.`,controls:[{name:`orientation`,label:`Orientation`,type:i.SELECT,options:[{label:`Horizontal`,value:`horizontal`},{label:`Vertical`,value:`vertical`}],defaultValue:`horizontal`},{name:`digits`,label:`Digits`,type:i.NUMBER,defaultValue:0},{name:`numeric`,label:`Numeric`,type:i.BOOLEAN,defaultValue:!1},{name:`snapToTicks`,label:`Snap to ticks`,type:i.BOOLEAN,defaultValue:!1},{name:`wrap`,label:`Wrap`,type:i.BOOLEAN,defaultValue:!1},{name:`updatePolicy`,label:`Update policy`,type:i.SELECT,options:[{label:`Always`,value:`always`},{label:`If valid`,value:`if-valid`}],defaultValue:`always`},{name:`value`,label:`Value`,type:i.NUMBER,defaultValue:5}]};var sn=__exportAll({SpinButtonStories:()=>ln,SpinButtonStory:()=>cn}),cn=class SpinButtonStory extends D{_spin=null;_adjustment=null;static{S.registerClass({GTypeName:`AdwStorybookSpinButton`},SpinButtonStory)}constructor(){super(D.fromMeta(SpinButtonStory.getMetadata(),`Default`))}static getMetadata(){return{...on,component:h.SpinButton.$gtype}}initialize(){this._adjustment=new h.Adjustment({value:5,lower:0,upper:10,stepIncrement:1,pageIncrement:2}),this._spin=new h.SpinButton({adjustment:this._adjustment,digits:0,halign:h.Align.CENTER}),this._apply(),this.addContent(this._spin)}updateArgs(e){this._apply()}_apply(){!this._spin||!this._adjustment||(this._spin.orientation=this.args.orientation===`vertical`?h.Orientation.VERTICAL:h.Orientation.HORIZONTAL,this._spin.digits=this.args.digits,this._spin.numeric=this.args.numeric,this._spin.snap_to_ticks=this.args.snapToTicks,this._spin.wrap=this.args.wrap,this._spin.update_policy=this.args.updatePolicy===`if-valid`?h.SpinButtonUpdatePolicy.IF_VALID:h.SpinButtonUpdatePolicy.ALWAYS,this._adjustment.set_value(this.args.value))}};S.type_ensure(cn.$gtype);const ln={stories:[cn]},un={title:`Controls/Switch`,description:`Gtk.Switch — a light switch with two states that are NOT the same thing: active is where the user put it, state is what the switched thing currently is, which is how a change that takes a while looks like a pending one. Adw.SwitchRow is the same control with a title beside it.`,controls:[{name:`active`,label:`Active`,type:i.BOOLEAN,defaultValue:!0},{name:`state`,label:`State (the backend)`,type:i.BOOLEAN,defaultValue:!0},{name:`disabled`,label:`Disabled`,type:i.BOOLEAN,defaultValue:!1}]};var dn=__exportAll({SwitchStories:()=>pn,SwitchStory:()=>fn}),fn=class SwitchStory extends D{_switch=null;static{S.registerClass({GTypeName:`AdwStorybookSwitch`},SwitchStory)}constructor(){super(D.fromMeta(SwitchStory.getMetadata(),`Default`))}static getMetadata(){return{...un,component:h.Switch.$gtype}}initialize(){this._switch=new h.Switch({halign:h.Align.CENTER}),this._apply(),this.addContent(this._switch)}updateArgs(e){this._apply()}_apply(){this._switch&&(this._switch.active=this.args.active,this._switch.state=this.args.state,this._switch.sensitive=!this.args.disabled)}};S.type_ensure(fn.$gtype);const pn={stories:[fn]},mn={title:`Drawing/Drag Icon`,description:"Gtk.DragIcon — the widget that follows the pointer while a drag is in flight, and is destroyed with the drag. No application builds one: `get_for_drag` returns the icon a drag is using, and the drag source sets its child. What it takes as that child is the interesting part, because `create_widget_for_value` answers for six kinds of value and a drag source that offers a string gets a label and one that offers a colour gets a swatch. A drag icon takes no input at all, which is the C's own note: 'drag icons do not allow user input'.",controls:[{name:`value`,label:`Value being dragged`,type:i.SELECT,options:[{label:`A string (a Gtk.Label)`,value:`string`},{label:`A GdkRGBA (a colour swatch)`,value:`rgba`},{label:`A content provider only (no icon)`,value:`none`}],defaultValue:`string`},{name:`actions`,label:`Drag actions`,type:i.SELECT,options:[{label:`Copy`,value:`copy`},{label:`Move`,value:`move`}],defaultValue:`copy`}]};var hn=__exportAll({DragIconStories:()=>_n,DragIconStory:()=>gn}),gn=class DragIconStory extends D{_row=null;_source=null;_hint=null;static{S.registerClass({GTypeName:`AdwStorybookDragIcon`},DragIconStory)}constructor(){super(D.fromMeta(DragIconStory.getMetadata(),`Default`))}static getMetadata(){return{...mn,component:h.DragIcon.$gtype}}initialize(){let e=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12,halign:h.Align.CENTER,valign:h.Align.CENTER});this._hint=new h.Label({label:`Drag the row and watch the pointer`}),this._hint.add_css_class(`dim-label`),this._row=new h.Box({orientation:h.Orientation.HORIZONTAL,spacing:12,cssClasses:[`card`]}),this._row.append(this._buildLabel()),this._source=h.DragSource.new(),this._source.actions=this.args.actions===`move`?f.DragAction.MOVE:f.DragAction.COPY,this._source.connect(`prepare`,()=>this._contentProvider()),this._source.connect(`drag-begin`,(e,t)=>this._setIcon(t)),this._row.add_controller(this._source),this._apply(),e.append(this._hint),e.append(this._row),this.addContent(e)}updateArgs(e){this._source!==null&&(this._source.actions=this.args.actions===`move`?f.DragAction.MOVE:f.DragAction.COPY,this._apply())}_value(){switch(this.args.value){case`rgba`:return{red:.25,green:.55,blue:.95,alpha:1};case`none`:return null;default:return`Report.odt`}}_contentProvider(){let e=this._value();return e===null?null:f.ContentProvider.new_for_value(e)}_setIcon(e){let t=this._value(),n=h.DragIcon.get_for_drag(e),r=t===null?null:h.DragIcon.create_widget_for_value(t);n.set_child(r)}_buildLabel(){return new h.Label({label:`Report.odt`,cssClasses:[`heading`]})}_apply(){this._hint!==null&&(this._hint.label=this.args.value===`none`?`Drag the row — no icon, because the value has no widget to show`:`Drag the row and watch the pointer`)}};S.type_ensure(gn.$gtype);const _n={stories:[gn]},vn={title:`Drawing/Drawing Area`,description:"Gtk.DrawingArea — a blank widget that owns a size and a callback and nothing else: whatever you see is what `set_draw_func` painted. `content-width` and `content-height` are the MINIMUM and natural size at once, so a parent can hand the area more room but never less; at 0 the area has no intrinsic size at all and fills whatever it is given.",controls:[{name:`contentWidth`,label:`Content width`,type:i.RANGE,min:0,max:320,step:16,defaultValue:160},{name:`contentHeight`,label:`Content height`,type:i.RANGE,min:0,max:320,step:16,defaultValue:120},{name:`shape`,label:`Shape`,type:i.SELECT,options:[{label:`Circle`,value:`circle`},{label:`Grid`,value:`grid`},{label:`Crosshair`,value:`crosshair`}],defaultValue:`circle`}]};var yn=__exportAll({DrawingAreaStories:()=>xn,DrawingAreaStory:()=>bn}),bn=class DrawingAreaStory extends D{_box=null;_area=null;static{S.registerClass({GTypeName:`AdwStorybookDrawingArea`},DrawingAreaStory)}constructor(){super(D.fromMeta(DrawingAreaStory.getMetadata(),`Default`))}static getMetadata(){return{...vn,component:h.DrawingArea.$gtype}}initialize(){this._area=new h.DrawingArea,this._area.set_draw_func((e,t,n,r)=>{let i=e.get_color();switch(t.setSourceRGBA(i.red,i.green,i.blue,i.alpha),t.rectangle(0,0,n,r),t.fill(),t.setSourceRGBA(1-i.red,1-i.green,1-i.blue,i.alpha),this.args.shape){case`grid`:for(let e=0;e<n;e+=16)t.rectangle(e,0,8,r),t.fill();break;case`crosshair`:t.rectangle(n/2-1,0,2,r),t.rectangle(0,r/2-1,n,2),t.fill();break;default:t.arc(n/2,r/2,Math.min(n,r)/2,0,2*Math.PI),t.fill();break}}),this._box=new h.Box({halign:h.Align.CENTER,valign:h.Align.CENTER}),this._box.append(this._area),this._apply(),this.addContent(this._box)}updateArgs(e){this._area?.queue_draw(),this._apply()}_apply(){this._area&&(this._area.content_width=this.args.contentWidth,this._area.content_height=this.args.contentHeight)}};S.type_ensure(bn.$gtype);const xn={stories:[bn]},Sn={title:`Drawing/GL Area`,description:"Gtk.GLArea — a widget whose contents are drawn on a GPU. GTK emits `::resize` before the first `::render` and the render flag is cleared AFTER the signal, so a handler may queue another frame with `queue_render()`. Here the replica is a `<canvas>` with a real WebGL context: the browser has no desktop GL, so `api` always reports the ES flavour it was given.",controls:[{name:`autoRender`,label:`Auto render`,type:i.BOOLEAN,defaultValue:!0},{name:`hasDepthBuffer`,label:`Depth buffer`,type:i.BOOLEAN,defaultValue:!1},{name:`allowedApis`,label:`Allowed APIs`,type:i.SELECT,options:[{label:`GL and GLES (default)`,value:`gl gles`},{label:`GLES only`,value:`gles`},{label:`GL only`,value:`gl`}],defaultValue:`gl gles`},{name:`spinning`,label:`Spin the triangle`,type:i.BOOLEAN,defaultValue:!0}]};var Cn=__exportAll({GLAreaStories:()=>Tn,GLAreaStory:()=>wn}),wn=class GLAreaStory extends D{_area=null;_readout=null;_box=null;_tick=0;_renders=0;_viewport=`—`;static{S.registerClass({GTypeName:`AdwStorybookGLArea`},GLAreaStory)}constructor(){super(D.fromMeta(GLAreaStory.getMetadata(),`Default`))}static getMetadata(){return{...Sn,component:h.GLArea.$gtype}}initialize(){this._area=new h.GLArea({widthRequest:240,heightRequest:160}),this._readout=new h.Label({label:`—`}),this._readout.add_css_class(`dimmed`),this._area.connect(`resize`,(e,t,n)=>{this._viewport=`${t} × ${n}`,this._refresh()}),this._area.connect(`render`,()=>{this._renders+=1,this._refresh()}),this._box=new h.Box({orientation:h.Orientation.VERTICAL,spacing:6}),this._box.append(this._area),this._box.append(this._readout),this._apply(),this.addContent(this._box)}updateArgs(e){this._stop(),this._apply(),this._start()}_apply(){this._area&&(this._area.allowed_apis=this.args.allowedApis===`gles`?f.GLAPI.GLES:f.GLAPI.GL|f.GLAPI.GLES,this._area.auto_render=this.args.autoRender,this._area.has_depth_buffer=this.args.hasDepthBuffer)}_start(){!this._area||!this.args.spinning||(this._tick=l.timeout_add(l.PRIORITY_DEFAULT,33,()=>(this._area?.queue_render(),l.SOURCE_CONTINUE)))}_stop(){this._tick!==0&&(l.source_remove(this._tick),this._tick=0)}_refresh(){this._readout&&(this._readout.label=`viewport ${this._viewport} device px · ${this._renders} renders`)}};S.type_ensure(wn.$gtype);const Tn={stories:[wn]},En={title:`Drawing/Graphics Offload`,description:"Gtk.GraphicsOffload — a wrapper that asks the compositor to take its ONE child as it is, which is worth doing for content that changes every frame. `enabled` says whether it is attempted, and `black-background` paints the letterbox bars. The passthrough itself is the platform's: no browser API hands a surface to a compositor, so the replica carries the enum, the black rectangle and the bin layout, and says plainly which part is missing.",controls:[{name:`enabled`,label:`Enabled`,type:i.SELECT,options:[{label:`Enabled (default)`,value:`enabled`},{label:`Disabled`,value:`disabled`}],defaultValue:`enabled`},{name:`blackBackground`,label:`Black background`,type:i.BOOLEAN,defaultValue:!1},{name:`child`,label:`Child`,type:i.SELECT,options:[{label:`Label`,value:`label`},{label:`Image`,value:`image`},{label:`Row of labels`,value:`box`}],defaultValue:`image`}]};var Dn=__exportAll({GraphicsOffloadStories:()=>kn,GraphicsOffloadStory:()=>On}),On=class GraphicsOffloadStory extends D{_offload=null;_box=null;static{S.registerClass({GTypeName:`AdwStorybookGraphicsOffload`},GraphicsOffloadStory)}constructor(){super(D.fromMeta(GraphicsOffloadStory.getMetadata(),`Default`))}static getMetadata(){return{...En,component:h.GraphicsOffload.$gtype}}initialize(){this._offload=new h.GraphicsOffload({widthRequest:280,heightRequest:96}),this._offload.enabled=+(this.args.enabled===`disabled`),this._offload.black_background=this.args.blackBackground,this._box=new h.Box({halign:h.Align.CENTER,valign:h.Align.CENTER}),this._box.append(this._offload),this._applyChild(),this.addContent(this._box)}updateArgs(e){this._offload&&(this._offload.enabled=+(this.args.enabled===`disabled`),this._offload.black_background=this.args.blackBackground,this._applyChild())}_applyChild(){if(!this._offload)return;let e;switch(this.args.child){case`label`:e=new h.Label({label:`The child of an offloaded layer`});break;case`box`:{let t=new h.Box({orientation:h.Orientation.HORIZONTAL,spacing:12});for(let e of[`One`,`Two`,`Three`])t.append(new h.Label({label:e}));e=new h.CenterBox,e.set_center_widget(t);break}default:e=new h.Image({iconName:`camera-photo-symbolic`,pixelSize:48});break}this._offload.child=e}};S.type_ensure(On.$gtype);const kn={stories:[On]},An={title:`Feedback/About Dialog`,description:`Adw.AboutDialog — the standard Adwaita about window with application name, version, credits and license.`,controls:[{name:`applicationName`,label:`Application name`,type:i.TEXT,defaultValue:`Adwaita Storybook`},{name:`version`,label:`Version`,type:i.TEXT,defaultValue:`0.11.0`}]};var jn=__exportAll({AboutDialogStories:()=>Nn,AboutDialogStory:()=>Mn}),Mn=class AboutDialogStory extends D{_button=null;static{S.registerClass({GTypeName:`AdwStorybookAboutDialog`},AboutDialogStory)}constructor(){super(D.fromMeta(AboutDialogStory.getMetadata(),`Default`))}static getMetadata(){return{...An,component:w.AboutDialog.$gtype}}initialize(){this._button=new h.Button({label:`Show dialog`,halign:h.Align.CENTER,valign:h.Align.CENTER}),this._button.add_css_class(`pill`),this._button.add_css_class(`suggested-action`),this._button.connect(`clicked`,()=>this._present()),this.addContent(this._button)}_present(){new w.AboutDialog({applicationName:this.args.applicationName,applicationIcon:`application-x-executable-symbolic`,developerName:`A GJSify Project`,version:this.args.version,comments:`A live catalogue of native GTK and Adwaita widgets, rendered under GJS.`,website:`https://github.com/gjsify/gjsify`,issueUrl:`https://github.com/gjsify/gjsify/issues`,licenseType:h.License.MIT_X11,developers:[`Ada Lovelace`,`Grace Hopper`],designers:[`Margaret Hamilton`],copyright:`© 2026 The GJSify Project`}).present(this)}updateArgs(e){}};S.type_ensure(Mn.$gtype);const Nn={stories:[Mn]},Pn={title:`Feedback/Alert Dialog`,description:`Adw.AlertDialog — a modal dialog with a heading, body text and responses, including a destructive action.`,controls:[{name:`heading`,label:`Heading`,type:i.TEXT,defaultValue:`Delete Project?`},{name:`body`,label:`Body`,type:i.TEXT,defaultValue:`This will permanently remove the project and all of its files. This action cannot be undone.`}]};var Fn=__exportAll({AlertDialogStories:()=>Ln,AlertDialogStory:()=>In}),In=class AlertDialogStory extends D{_button=null;static{S.registerClass({GTypeName:`AdwStorybookAlertDialog`},AlertDialogStory)}constructor(){super(D.fromMeta(AlertDialogStory.getMetadata(),`Default`))}static getMetadata(){return{...Pn,component:w.AlertDialog.$gtype}}initialize(){this._button=new h.Button({label:`Show dialog`,halign:h.Align.CENTER,valign:h.Align.CENTER}),this._button.add_css_class(`pill`),this._button.add_css_class(`suggested-action`),this._button.connect(`clicked`,()=>this._present()),this.addContent(this._button)}_present(){let e=new w.AlertDialog({heading:this.args.heading,body:this.args.body});e.add_response(`cancel`,`Cancel`),e.add_response(`delete`,`Delete`),e.set_response_appearance(`delete`,w.ResponseAppearance.DESTRUCTIVE),e.set_default_response(`cancel`),e.set_close_response(`cancel`),e.present(this)}updateArgs(e){}};S.type_ensure(In.$gtype);const Ln={stories:[In]},Rn={title:`Feedback/Dialog`,description:`Adw.Dialog — the generic dialog: arbitrary content over a scrim, anchored as a floating card on a wide window and as a bottom sheet on a narrow one.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Preferences`},{name:`presentation`,label:`Presentation`,type:i.SELECT,options:[{label:`Auto`,value:`auto`},{label:`Floating`,value:`floating`},{label:`Bottom sheet`,value:`bottom-sheet`}],defaultValue:`auto`}]};var zn=__exportAll({DialogStories:()=>Hn,DialogStory:()=>Vn});const Bn={auto:w.DialogPresentationMode.AUTO,floating:w.DialogPresentationMode.FLOATING,"bottom-sheet":w.DialogPresentationMode.BOTTOM_SHEET};var Vn=class DialogStory extends D{_button=null;static{S.registerClass({GTypeName:`AdwStorybookDialog`},DialogStory)}constructor(){super(D.fromMeta(DialogStory.getMetadata(),`Default`))}static getMetadata(){return{...Rn,component:w.Dialog.$gtype}}initialize(){this._button=new h.Button({label:`Show dialog`,halign:h.Align.CENTER,valign:h.Align.CENTER}),this._button.add_css_class(`pill`),this._button.add_css_class(`suggested-action`),this._button.connect(`clicked`,()=>this._present()),this.addContent(this._button)}_present(){let e=new w.PreferencesGroup({title:`Appearance`});e.add(new w.SwitchRow({title:`Dark style`,subtitle:`Use a dark colour scheme`,active:!0}));let t=new w.PreferencesPage({title:`General`});t.add(e),new w.Dialog({title:this.args.title,child:t,presentation_mode:Bn[this.args.presentation]}).present(this)}updateArgs(e){}};S.type_ensure(Vn.$gtype);const Hn={stories:[Vn]},Un={title:`Feedback/Emoji Chooser`,description:`Gtk.EmojiChooser — the popover a text widget opens to insert an emoji: a search entry over nine named sections, a toolbar that follows the scroll position, and an emoji-picked signal.`,controls:[{name:`search`,label:`Search`,type:i.TEXT,defaultValue:`smile`}]};var Wn=__exportAll({EmojiChooserStories:()=>Kn,EmojiChooserStory:()=>Gn}),Gn=class EmojiChooserStory extends D{_button=null;_entry=null;_chooser=null;static{S.registerClass({GTypeName:`AdwStorybookEmojiChooser`},EmojiChooserStory)}constructor(){super(D.fromMeta(EmojiChooserStory.getMetadata(),`Default`))}static getMetadata(){return{...Un,component:h.EmojiChooser.$gtype}}initialize(){this._entry=new h.Entry({placeholderText:`Type a message…`,halign:h.Align.CENTER}),this._entry.add_css_class(`card`),this._entry.hexpand=!0,this._chooser=h.EmojiChooser.new(),this._chooser.connect(`emoji-picked`,(e,t)=>{this._entry!==null&&this._entry.set_text(this._entry.get_text()+t)}),this._button=new h.Button({iconName:`face-smile-symbolic`,tooltipText:`Insert an emoji`,valign:h.Align.CENTER}),this._button.add_css_class(`flat`),this._button.add_css_class(`circular`),this._chooser.set_parent(this._button);let e=new h.Box({orientation:h.Orientation.HORIZONTAL,spacing:6});e.append(this._button),e.append(this._entry);let t=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12,halign:h.Align.CENTER,valign:h.Align.CENTER});t.append(e),this.addContent(t),this._applySearch(this.args.search)}_searchEntry(){let e=this._chooser?.get_first_child()??null;for(;e!==null;){if(e instanceof h.SearchEntry)return e;e=e.get_first_child()}return null}_applySearch(e){this._searchEntry()?.set_text(e)}updateArgs(e){typeof e.search==`string`&&this._applySearch(e.search)}};S.type_ensure(Gn.$gtype);const Kn={stories:[Gn]},qn={title:`Feedback/GTK About Dialog`,description:`Gtk.AboutDialog — GTK's own about window: a dialog-size logo over the program name, with the Credits, License and System pages behind a stack switcher. NOT Adw.AboutDialog, which is a navigation view of preference rows.`,controls:[{name:`programName`,label:`Program name`,type:i.TEXT,defaultValue:`Calculator`},{name:`version`,label:`Version`,type:i.TEXT,defaultValue:`48.1`},{name:`licenseType`,label:`License type`,type:i.SELECT,options:[{label:`Unknown`,value:`unknown`},{label:`Custom`,value:`custom`},{label:`GPL 3.0`,value:`gpl-3-0`},{label:`MIT`,value:`mit-x11`},{label:`BSD 3-Clause`,value:`bsd-3`},{label:`Apache 2.0`,value:`apache-2-0`},{label:`0BSD`,value:`0bsd`}],defaultValue:`gpl-3-0`},{name:`withCredits`,label:`With credits`,type:i.BOOLEAN,defaultValue:!0}]};var Jn=__exportAll({GtkAboutDialogStories:()=>Zn,GtkAboutDialogStory:()=>Xn});const Yn={unknown:h.License.UNKNOWN,custom:h.License.CUSTOM,"gpl-3-0":h.License.GPL_3_0,"mit-x11":h.License.MIT_X11,"bsd-3":h.License.BSD_3,"apache-2-0":h.License.APACHE_2_0,"0bsd":h.License[`0BSD`]};var Xn=class GtkAboutDialogStory extends D{_button=null;static{S.registerClass({GTypeName:`AdwStorybookGtkAboutDialog`},GtkAboutDialogStory)}constructor(){super(D.fromMeta(GtkAboutDialogStory.getMetadata(),`Default`))}static getMetadata(){return{...qn,component:h.AboutDialog.$gtype}}initialize(){this._button=new h.Button({label:`Show dialog`,halign:h.Align.CENTER,valign:h.Align.CENTER}),this._button.add_css_class(`pill`),this._button.add_css_class(`suggested-action`),this._button.connect(`clicked`,()=>this._present()),this.addContent(this._button)}_present(){let e=new h.AboutDialog({programName:this.args.programName,version:this.args.version,logoIconName:`application-x-executable-symbolic`,comments:`An arithmetic calculator for the GNOME desktop.`,website:`https://gitlab.gnome.org/World/gnome-calculator`,websiteLabel:`GNOME Calculator`,copyright:`© 2026 The GNOME Project`,systemInformation:`GTK 4.24.0
|
|
333
|
+
\n${this._options.css??``}`);let t=f.Display.get_default();if(!t){console.error(`No display found`);return}h.StyleContext.add_provider_for_display(t,e,h.STYLE_PROVIDER_PRIORITY_APPLICATION)}_onActivate(){if(!this._window){this._window=new ze({application:this}),this._options.title&&this._window.set_title(this._options.title);try{this._window.populateSidebar(this._options.stories)}catch(e){console.error(`Failed to create story instances:`,e)}installDevtools(this,{enabled:this._options.devtools||void 0,extend:[storybookDevtoolsExtension(this._window)]}),probeEnabled()&&installStorybookProbe(this,this._window,this._options.probe)}this._window.present()}};S.type_ensure(Be.$gtype);function collectStoryModules(e){return collectStoryModules$1(e)}function buildGtkChrome(e){let t=new w.PreferencesPage,n=new w.PreferencesGroup,r=new h.Box({orientation:h.Orientation.VERTICAL,halign:h.Align.CENTER,valign:h.Align.CENTER,margin_top:12,margin_bottom:12,spacing:12,hexpand:!0});return r.add_css_class(`story-stage`),n.add(r),t.add(n),e.set_child(t),{root:e,hasStage:!0,setStageContent(e){let t=r.get_first_child();for(;t;)t.unparent(),t=r.get_first_child();r.append(e)},setChromeText(e,t){n.set_title(l.markup_escape_text(e,-1)),n.set_description(l.markup_escape_text(t,-1))}}}var StoryCore=class extends StoryViewBase{constructor(e,t,n){super(),this._widget=e,this.initBase(t,n)}createChrome(e){return buildGtkChrome(this._widget)}initialize(){this._widget.initialize()}updateArgs(e){this._widget.updateArgs(e)}teardown(){this._widget.teardown()}emitArgs(e){super.emitArgs(e),this._widget.notify(`args`)}},k=class StoryWidget extends w.Bin{static{S.registerClass({GTypeName:`StoryWidget`,Properties:{meta:S.ParamSpec.object(`meta`,`Meta`,`Story metadata`,S.ParamFlags.READWRITE,S.Object),story:S.ParamSpec.string(`story`,`Story Name`,`Story name`,S.ParamFlags.READWRITE,``),args:S.ParamSpec.object(`args`,`Args`,`Story arguments`,S.ParamFlags.READWRITE,S.Object)}},StoryWidget)}constructor(e,t={}){super(t),this._core=new StoryCore(this,e.meta,e.story)}static fromMeta(e,t){return{meta:e,story:t,args:argsFromControls(e.controls)}}get meta(){return this._core.meta}get story(){return this._core.story}get args(){return this._core.args}set args(e){this._core.args=e}onArgsChanged(e){return this._core.onArgsChanged(e)}setArg(e,t){this._core.setArg(e,t)}initialize(){}updateArgs(e){}teardown(){}addContent(e){this._core.addContent(e)}};S.type_ensure(k.$gtype);const Ve={amp:`&`,lt:`<`,gt:`>`,quot:`"`,apos:`'`};function decodeXmlEntities(e){return e.includes(`&`)?e.replace(/&(#[Xx][0-9A-Fa-f]+|#[0-9]+|[A-Za-z][A-Za-z0-9]*);/g,(e,t)=>{if(t.charAt(0)!==`#`)return Ve[t]??e;let n=t.charAt(1)===`x`||t.charAt(1)===`X`,r=Number.parseInt(n?t.slice(2):t.slice(1),n?16:10);return!Number.isFinite(r)||r<1||r>1114111||r>=55296&&r<=57343?e:String.fromCodePoint(r)}):e}function findTagEnd(e,t){let n=``;for(let r=t+1;r<e.length;r++){let t=e.charAt(r);if(n)t===n&&(n=``);else if(t===`"`||t===`'`)n=t;else if(t===`>`)return r}return-1}const A=/([^\s=/<>]+)\s*=\s*(?:"([^"]*)"|'([^']*)')/g;function parseAttributes(e){let t={};A.lastIndex=0;let n=A.exec(e);for(;n!==null;)n[1]in t||(t[n[1]]=decodeXmlEntities(n[2]??n[3]??``)),n=A.exec(e);return t}function scanXml(e){let t=[],pushText=e=>{t.push({kind:`text`,text:decodeXmlEntities(e)})},n=0;for(;n<e.length;){let r=e.indexOf(`<`,n);if(r<0){pushText(e.slice(n));break}if(r>n&&pushText(e.slice(n,r)),e.startsWith(`<!--`,r)){let t=e.indexOf(`-->`,r+4);n=t<0?e.length:t+3;continue}if(e.startsWith(`<![CDATA[`,r)){let i=e.indexOf(`]]>`,r+9);t.push({kind:`text`,text:e.slice(r+9,i<0?e.length:i)}),n=i<0?e.length:i+3;continue}if(e.startsWith(`<?`,r)){let t=e.indexOf(`?>`,r+2);n=t<0?e.length:t+2;continue}if(e.startsWith(`<!`,r)){let t=e.indexOf(`>`,r+2);n=t<0?e.length:t+1;continue}let i=findTagEnd(e,r);if(i<0){pushText(e.slice(r));break}let a=e.slice(r+1,i);if(n=i+1,a.charAt(0)===`/`){let e=a.slice(1).trim();e!==``&&t.push({kind:`close`,name:e});continue}let o=a,s=!1;o.endsWith(`/`)&&(s=!0,o=o.slice(0,-1));let c=/^([^\s/<>]+)/.exec(o);if(c===null)continue;let l=c[1];t.push({kind:`open`,name:l,attributes:parseAttributes(o.slice(l.length)),selfClosing:s})}return t}const He={applicationId:null,applicationName:null,developerName:null,version:null,website:null,supportUrl:null,issueUrl:null,license:null,releaseNotes:null};function localeScore(e,t){let n=0;for(let r=0;;r++){let i=r<e.length?e.charAt(r):`\0`,a=r<t.length?t.charAt(r):`\0`;if((i===`-`||i===`\0`)&&(a===`-`||a===`\0`)&&n++,i===`\0`||a===`\0`)break;if(i!==a)return 0}return n}function appdataLocale(e,t={}){let n,r=e[0];r!==void 0&&!r.includes(`_`)&&t.LANG!==void 0&&t.LANG.includes(`_`)&&(n=t.LANG),n=n??r??`C`,n.endsWith(`.UTF-8`)&&(n=n.slice(0,-6));let i=``,a=n.indexOf(`@`);if(a>=0){let e=n.slice(a);e.startsWith(`@cyrillic`)?i=`-Cyrl`:e.startsWith(`@devanagari`)?i=`-Deva`:e.startsWith(`@latin`)?i=`-Latn`:e.startsWith(`@shaw`)?i=`-Shaw`:e.startsWith(`@euro`)||(i=`-euro`),n=n.slice(0,a)}return n.replace(/_/g,`-`)+i}function childElements(e,t,n){let r=[],i=t;for(;i<n;){let t=e[i];if(t.kind!==`open`){i+=1;continue}let a=t;if(a.selfClosing){r.push({name:a.name,attributes:a.attributes,start:i+1,end:i+1}),i+=1;continue}let o=1,s=i+1;for(;s<n&&o>0;){let t=e[s];t.kind===`open`?t.selfClosing||(o+=1):t.kind===`close`&&--o,s+=1}let c=o===0?s-1:n;r.push({name:a.name,attributes:a.attributes,start:i+1,end:c}),i=o===0?s:n}return r}function elementText(e,t){let n=0,r=``;for(let i=t.start;i<t.end;i++){let t=e[i];t.kind===`open`?t.selfClosing||(n+=1):t.kind===`close`?--n:n===0&&(r+=t.text)}return r.trim()}const lang=e=>e.attributes[`xml:lang`]??`C`;function considerTranslatable(e,t,n,r){(e.value===null&&lang(t)===`C`||r>e.score)&&(e.score=r,e.value=n)}function escapeMarkup(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/'/g,`'`).replace(/"/g,`"`)}function inlineMarkup(e,t){let n=``,r=!0,i=0,a=0;for(let o=t.start;o<t.end;o++){let t=e[o];if(t.kind===`open`){let e=t,r=!e.selfClosing;if(r&&(a+=1),i>0)continue;e.name===`em`||e.name===`code`?n+=`<${e.name}>`:r&&(i=a)}else if(t.kind===`close`)i>0&&a===i?i=0:i===0&&(t.name===`em`||t.name===`code`)&&(n+=`</${t.name}>`),--a;else if(i===0){let e=``;for(let n of t.text){if(n===`
|
|
334
|
+
`||n===` `||n===` `){if(r)continue;e+=` `,r=!0;continue}e+=n,r=!1}n+=escapeMarkup(e)}}return n}function parseDescription(e,t,n){let r=new Map,bucketFor=(e,t)=>{if(localeScore(n,e)===0&&e!==`C`)return null;let i=r.get(e);return i===void 0&&(i=[],r.set(e,i),t!==void 0&&i.push(`<${t}>\n`)),i};for(let n of childElements(e,t.start,t.end))if(n.name===`p`)bucketFor(lang(n))?.push(`<p>${inlineMarkup(e,n)}</p>\n`);else if(n.name===`ul`||n.name===`ol`){for(let e of r.values())e.push(`<${n.name}>\n`);for(let t of childElements(e,n.start,n.end))t.name===`li`&&bucketFor(lang(t),n.name)?.push(`<li>${inlineMarkup(e,t)}</li>\n`);for(let e of r.values())e.push(`</${n.name}>\n`)}let i=r.get(`C`),a=0;for(let[e,t]of r){let r=localeScore(n,e);r>a&&(a=r,i=t)}return i===void 0?null:i.join(``)}function parseAppdata(e,t={}){let n=t.locale??`C`,r=scanXml(e),i=childElements(r,0,r.length).find(e=>e.name===`component`||e.name===`application`);if(i===void 0)return{...He};let a={...He},o={value:null,score:0},s={value:null,score:0},c=[],l=null;for(let e of childElements(r,i.start,i.end))switch(e.name){case`id`:a.applicationId===null&&(a.applicationId=elementText(r,e));break;case`name`:considerTranslatable(o,e,elementText(r,e),localeScore(n,lang(e)));break;case`developer`:for(let t of childElements(r,e.start,e.end)){if(t.name!==`name`)continue;let e=localeScore(n,lang(t))+1024;e>s.score&&(lang(t)===`C`||e>1024)&&(s.score=e,s.value=elementText(r,t))}break;case`developer_name`:considerTranslatable(s,e,elementText(r,e),localeScore(n,lang(e)));break;case`url`:{let t=elementText(r,e);e.attributes.type===`homepage`?a.website=t:e.attributes.type===`bugtracker`?a.issueUrl=t:e.attributes.type===`help`&&(a.supportUrl=t);break}case`launchable`:e.attributes.type===`desktop-id`&&c.push(elementText(r,e));break;case`project_license`:a.license===null&&(a.license=elementText(r,e));break;case`releases`:l===null&&(l=e);break;default:break}if(a.applicationName=o.value,a.developerName=s.value,l!==null){let e=childElements(r,l.start,l.end).filter(e=>e.name===`release`);a.version=e[0]?.attributes.version??null;let i=t.releaseNotesVersion;if(i!==void 0&&i!==``){let t=e.find(e=>e.attributes.version===i),o=t&&childElements(r,t.start,t.end).find(e=>e.name===`description`);o&&(a.releaseNotes=parseDescription(r,o,n))}}a.applicationId!==null&&a.applicationId.endsWith(`.desktop`)&&(c.includes(`${a.applicationId}.desktop`)||(a.applicationId=a.applicationId.slice(0,-8)));for(let e of Object.keys(a))a[e]===``&&(a[e]=null);return a}const Ue={"GPL-2.0-or-later":h.License.GPL_2_0,"GPL-3.0-or-later":h.License.GPL_3_0,"LGPL-2.1-or-later":h.License.LGPL_2_1,"LGPL-3.0-or-later":h.License.LGPL_3_0,"BSD-2-Clause":h.License.BSD,MIT:h.License.MIT_X11,"Artistic-2.0":h.License.ARTISTIC,"GPL-2.0-only":h.License.GPL_2_0_ONLY,"GPL-3.0-only":h.License.GPL_3_0_ONLY,"LGPL-2.1-only":h.License.LGPL_2_1_ONLY,"LGPL-3.0-only":h.License.LGPL_3_0_ONLY,"AGPL-3.0-or-later":h.License.AGPL_3_0,"AGPL-3.0-only":h.License.AGPL_3_0_ONLY,"BSD-3-Clause":h.License.BSD_3,"Apache-2.0":h.License.APACHE_2_0,"MPL-2.0":h.License.MPL_2_0,"0BSD":h.License[`0BSD`],"GPL-2.0":h.License.GPL_2_0_ONLY,"GPL-3.0":h.License.GPL_3_0_ONLY};function licenseTypeFor(e){return Ue[e]??h.License.CUSTOM}function hasAppdataConstructor(e=w){try{return typeof e?.AboutDialog?.new_from_appdata==`function`}catch{return!1}}function applyAppdataFields(e,t,n){return t.applicationId!==null&&(e.applicationIcon=t.applicationId),t.applicationName!==null&&(e.applicationName=t.applicationName),t.developerName!==null&&(e.developerName=t.developerName),t.website!==null&&(e.website=t.website),t.supportUrl!==null&&(e.supportUrl=t.supportUrl),t.issueUrl!==null&&(e.issueUrl=t.issueUrl),t.license!==null&&(e.licenseType=licenseTypeFor(t.license)),n!==void 0&&n!==``&&(e.releaseNotesVersion=n),t.releaseNotes!==null&&(e.releaseNotes=t.releaseNotes),t.version!==null&&(e.version=t.version),e}function buildAboutDialogFromAppdata(e,t={}){let n=parseAppdata(e,{locale:t.locale??appdataLocale(l.get_language_names(),{LANG:l.getenv(`LANG`)??void 0}),releaseNotesVersion:t.releaseNotesVersion});return applyAppdataFields(new w.AboutDialog,n,t.releaseNotesVersion)}function resourceExists(e){try{return x.resources_get_info(e,x.ResourceLookupFlags.NONE),!0}catch{return!1}}function readResource(e){try{let t=x.resources_lookup_data(e,x.ResourceLookupFlags.NONE);return new TextDecoder().decode(t.toArray())}catch{return null}}function readFile(e){try{let[t,n]=l.file_get_contents(e);return t?new TextDecoder().decode(n):null}catch{return null}}let We=!1;function createAboutDialog(e={}){let{appdataResource:t,appdataPath:n,releaseNotesVersion:r}=e,i=t!==void 0&&resourceExists(t),a;if(!e.forceParsedAppdata&&i&&hasAppdataConstructor())a=w.AboutDialog.new_from_appdata(t,r??``);else{let o=(i?readResource(t):null)??(n===void 0?null:readFile(n));o===null?(console.error(`@gjsify/adwaita-app: no AppStream metainfo found for the About dialog; looked at resource ${t??`(none given)`} and file ${n??`(none given)`}`),a=new w.AboutDialog):(!We&&!e.forceParsedAppdata&&i&&(We=!0,console.log(`@gjsify/adwaita-app: Adw.AboutDialog.new_from_appdata is not in this GTK runtime (expected on Windows — gjsify/gjsify#1662); building the About dialog from the AppStream metainfo directly.`)),a=buildAboutDialogFromAppdata(o,{releaseNotesVersion:r}))}return e.applicationIcon!==void 0&&(a.applicationIcon=e.applicationIcon),e.version!==void 0&&(a.version=e.version),a}`application-x-executable.audio-volume-high.audio-volume-low.audio-volume-medium.audio-volume-muted.avatar-default.camera-photo.contact-new.dialog-error.dialog-warning.document-edit.document-open.document-save.edit-clear.edit-copy.edit-find.emblem-system.emoji-activities.emoji-body.emoji-flags.emoji-food.emoji-nature.emoji-objects.emoji-people.emoji-recent.emoji-symbols.emoji-travel.face-smile.folder.folder-documents.folder-download.folder-music.go-down.go-home.go-next.go-previous.go-up.image-missing.list-add.list-remove.mail-reply-sender.mail-send.mail-unread.media-eject.media-playback-pause.media-playback-start.media-playlist-repeat.network-wireless.open-menu.pan-down.pan-end.pan-end-rtl.preferences-system.printer.send-to.sidebar-show.starred.system-search.user-trash.value-decrease.value-increase.view-conceal.view-grid.view-list.view-more.view-paged.view-refresh.view-reveal.window-close.window-maximize.window-minimize.window-restore`.split(`.`);let j=null;function registerBundledIconResource(){if(j)return j;let e=l.base64_decode(`R1ZhcmlhbnQAAAAAAAAAABgAAACkCQAAAAAAKFcAAAAAAAAAAQAAAAQAAAAFAAAABQAAAAUAAAAGAAAABgAAAAYAAAAIAAAACAAAAAkAAAALAAAACwAAAA0AAAANAAAADwAAAA8AAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGgAAABwAAAAeAAAAHwAAACIAAAAiAAAAIwAAACUAAAAlAAAAJQAAACYAAAAmAAAAJgAAACkAAAAqAAAALAAAACwAAAAtAAAALQAAAC0AAAAuAAAALgAAAC4AAAAvAAAAMQAAADQAAAA1AAAANwAAADkAAAA8AAAAPQAAAD8AAAA/AAAAQQAAAEIAAABDAAAARAAAAEQAAABEAAAARAAAAEUAAABFAAAARgAAAEYAAABGAAAARgAAAEYAAABGAAAARgAAAEcAAABLAAAASwAAAEsAAABLAAAASwAAAE4AAABRAAAAVAAAAFQAAABVAAAAVQAAAFYAAADiMb0uOgAAAKQJAAAUAHYAuAkAAMgKAAAWuDRtOgAAAMgKAAAhAHYA8AoAACcMAAAK8uYjOgAAACcMAAAYAHYAQAwAAF8NAADhERO1BgAAAF8NAAAHAEwAaA0AAHwNAADpf58XOgAAAHwNAAAYAHYAmA0AAMgOAAALfUj0OgAAAMgOAAAVAHYA4A4AAM4PAAC6P2D1KgAAAM4PAAAJAEwA2A8AAPgPAADEQFkHOgAAAPgPAAAZAHYAGBAAADkSAADW7AkKPgAAADkSAAAJAEwARBIAAEgSAAD+9zTNOgAAAEgSAAAZAHYAaBIAAHEUAAAwvzvfOgAAAHEUAAAbAHYAkBQAAEYVAACu2v4DOgAAAEYVAAAYAHYAYBUAAKQWAAC2R65pBgAAAKQWAAAHAEwArBYAALAWAACzaRgEOgAAALAWAAAUAHYAyBYAAIUYAACvR0lrBgAAAIUYAAALAEwAkBgAALwYAACGjnHbOgAAALwYAAAhAHYA4BgAALYZAADvdAR+IgAAALYZAAAUAHYA0BkAAGIbAABqjAJmDgAAAGIbAAAYAHYAgBsAAIkcAAAfXFSuEwAAAIkcAAAaAHYAqBwAAGEiAACuWZOABgAAAGEiAAAIAEwAbCIAAHAiAADvuylmAwAAAHAiAAAcAHYAkCIAAMMjAABNLbTZOgAAAMMjAAAbAHYA4CMAAHgkAADMaSO8DgAAAHgkAAAZAHYAmCQAADgmAADrc+QqDgAAADgmAAAZAHYAWCYAABkoAABeUapXOgAAABkoAAAYAHYAOCgAANEoAACi+bSuOgAAANEoAAAaAHYA8CgAABsqAADR+31tCAAAABsqAAAHAEwAJCoAACgqAACvdsvhOgAAACgqAAAaAHYASCoAAIgrAAC9MZz3KAAAAIgrAAAUAHYAoCsAAKssAAC/IAPHOgAAAKssAAAYAHYAyCwAAA4uAABfI/75IgAAAA4uAAAgAHYAMC4AANMwAAD75Ha4OgAAANMwAAAWAHYA8DAAACYyAADZ3Iz5OgAAACYyAAAaAHYAQDIAAIQzAAB5V4IRDAAAAIQzAAAXAHYAoDMAALk0AACto7SuBgAAALk0AAAHAEwAwDQAAOw0AAChNmB3OgAAAOw0AAAUAHYAADUAABA3AACe1MCfDgAAABA3AAAZAHYAMDcAACc5AADQoZNnOgAAACc5AAAcAHYASDkAAP45AACmlQVxBgAAAP45AAAKAEwACDoAAAw6AAClZu5XOgAAAAw6AAAaAHYAKDoAANk8AAAMR+9aBgAAANk8AAAIAEwA5DwAAPA8AAD7HfhuJgAAAPA8AAAlAHYAGD0AAOREAAAUa9d4KwAAAOREAAAGAEwA7EQAAPBEAABpW3DiGgAAAPBEAAAMAEwA/EQAAABFAACnrxoSIgAAAABFAAAiAHYAKEUAAExHAACdeFffIgAAAExHAAAfAHYAcEcAAANJAAAqdux3AwAAAANJAAATAHYAGEkAAExKAACVSW6dOgAAAExKAAAWAHYAaEoAAEBLAADyjdCQDgAAAEBLAAAdAHYAYEsAAMRNAABYlcnrAwAAAMRNAAAZAHYA4E0AAFxPAAC+aUV4IgAAAFxPAAAeAHYAgE8AAAtSAABZdi7nOgAAAAtSAAAVAHYAIFIAAMVSAAAB+xoYOgAAAMVSAAAWAHYA4FIAAL1UAAC5VGSfKAAAAL1UAAAZAHYA2FQAAINWAABJzq2sAwAAAINWAAAdAHYAoFYAANhXAAAcwCbEAwAAANhXAAAXAHYA8FcAAH1ZAAAB+eAoIgAAAH1ZAAAZAHYAmFkAAFtaAAALgGZ/DgAAAFtaAAAXAHYAeFoAAGtbAAB6uJH3BgAAAGtbAAAIAEwAdFsAABBcAADUtQIA/////xBcAAABAEwAFFwAABhcAABOFkXgOgAAABhcAAAcAHYAOFwAANpcAADxQbgzOgAAANpcAAAeAHYA+FwAAF9eAAA9knh8OwAAAF9eAAADAEwAZF4AAGheAACpUvV3OgAAAGheAAAUAHYAgF4AAJRfAACQwEaVOgAAAJRfAAAXAHYAsF8AADlhAAAvfvfEOgAAADlhAAAZAHYAWGEAAJJiAAA7s1WcOgAAAJJiAAAbAHYAsGIAAFZjAAD1t/trOgAAAFZjAAAWAHYAcGMAAJ9kAAB72HZsOgAAAJ9kAAAWAHYAuGQAAGFlAABQ72BHIgAAAGFlAAAdAHYAgGUAAFFnAAALfe/ZIgAAAFFnAAAbAHYAcGcAAGhoAADiBDnnDgAAAGhoAAAZAHYAiGgAAGNqAACHKdGIOgAAAGNqAAAYAHYAgGoAAJBrAABiOa3iOgAAAJBrAAAWAHYAqGsAAHRsAAAKweIOOgAAAHRsAAAUAHYAiGwAALNtAABv0fw7OgAAALNtAAASAHYAyG0AANVuAABLQp8iOgAAANVuAAAWAHYA8G4AAPtvAAAeqbXCKAAAAPtvAAAdAHYAGHAAAK9yAACA5bXfDgAAAK9yAAAfAHYA0HIAAAF2AABnSs+2DgAAAAF2AAAaAHYAIHYAAIR4AABCkLG/OgAAAIR4AAAZAHYAoHgAAPZ5AADJolhxIgAAAPZ5AAAYAHYAEHoAAF17AADEWMNqIgAAAF17AAAaAHYAeHsAAAF9AABNgDrxIgAAAAF9AAAbAHYAIH0AAHt+AADhPVC8OgAAAHt+AAAXAHYAmH4AAJ+AAAAlBZvyDgAAAJ+AAAAXAHYAuIAAAOiCAACmTAJVDgAAAOiCAAAaAHYACIMAALaEAABnby1kb3duLXN5bWJvbGljLnN2ZywCAAABAAAAeNqdUdFuhCAQfL+v2PAOLihYG/Wh/ZLmzooJnkbpYfr1Xa+c2rRPJSRMJjuzO0s531qwTddaXzFpxoXBrWvCy7BUDAFBGroMQnfx9lGw9O46V8x6Pz4nSQhBhFQMU5soREzIkNUnoFOOb97CpWI9SNBwJjuOQhltlAYUEnVmipXSstCpJEoVqvimcsyRKNKItMBVwDckBao0S/MfVCYzQtTCgX74bODA8Q39w3uVyKdc70/0QpHdi45MjDCvVjHrFpX/rnPADRhqsXfe59vGOlKHyCTlUXsf7PDuO40j8j/2/Ak9+SCD9865ip0/pqm5+tfBDRNL6lO5/mr9BVhGekMAKHV1YXkpbWVkaWEtcGxheWJhY2stc3RhcnQtc3ltYm9saWMuc3ZnAAAAAAAAAAcCAAABAAAAeNptkd1ugzAMhe/7FFbuCc5/MkEvtieZ2q5BglJRBtWefnbYpk4b4uLkOJ85Ns1tOUM+dec8t0L5613A0p3W5/HeCgQE5ekVsHbHOX9fuA/95daKPM/Xp7pe11WuRo7TudaIWFNDsd8BPc31dc5wbMUAGrR0sIBScOCudFBS++SMImGTVjH+42RAqXRMGBiT2npMhgSiSehJ2Bh1VFCR5TBETZZPzLKlgorBQw9JhuRjcFA56VLwzpd21hiXLN/UlpDAsPPasROMNQT8OJRNsyzxqf4VkNlSYJViYapfUCn2UP3JwCMxrmikUOIWWZrTErYYKriwzfc4VvHyxpTl3Mq3tuXhg+Y9f8BAHgp46/q+FYf3aTpd5pexHydR73cN/7D9J0yac7AAKHV1YXkpY29udGFjdC1uZXctc3ltYm9saWMuc3ZnAMwBAAABAAAAeNpNUdlug0AMfM9XWPvO4mO5opCH9kuqhAISBERoiPr1taFE2UvjkT2e3T3dHzU0VVs3c+koHZ8OHm21fAzP0iEgUKrLwdJe52ZPePbd7V66Zp7HYxwvy+IX8cNUx4yIsQq68wF0nMavuYFr6XrIgeACEfk0STlR3UiAvATJEoMC91cosMVi6TsVGRO9VWzrF3pjE8hMnX0omPLc5IOS7BGznHiLbD8A9bzYvTxhYVro8wLNE6+zgVSzIlKg+oqCohWQLzJW+9YJPaVBqwwhFYmsSIRRaOU4kxAMJW+huTUXqHKyN+B/fSPY+sjekF8etovqdzj4bruudJefaapu8+fQDZOLz4eTvfr5D7fdaRkAKHV1YXkpcGxhY2VzLwAANgAAABQAAAAxAAAALgAAADcAAABwYW4tZW5kLXN5bWJvbGljLXJ0bC5zdmcAAAAADgIAAAEAAAB42mWR3W6DMAyF7/sUVu4T7CRAMpVebE8yFVaQ+BOlpdrTzyQt7bYoF5Z1zpdjZ3++nqCumlM9F4Ky8Sbg2lTL+3ArBAICZXwFLE051w/BrWv7cyHqeR7fkmRZFrUYNUynRCNiwkBx2AGf/fg511AWogOntEspZZhWmfeaPLQgjfKU+8yBtHAEicrkzmMeKo+ZTl97pBBzR4ZDcW28TQ0x5DeD5U6vooBw1jhgHz8cWTZASVniKoiQfGp0dEbkhljl2ljzJNzl9CSEIbTV5BwnMSFhCPW3t0XTsCVbZ1vToKEY74XOI/n7TjZxtMuHIdrlv2kIvqHjLaGAr6ZtC3G8TFPVzx9DO0yxJ6dLWxWiulb9UJYiOez2678dfgCc9nfEACh1dWF5KXBhbi1kb3duLXN5bWJvbGljLnN2ZwAAAMcBAAABAAAAeNptUNtuhSAQfD9fsdl3YBWr8UR8aL+kUSomeIlyxPTri2mrND3Aw+xkZnZCtW4dGN13xilM8nlH2HrtX6ddIQFBkoeH4PvWmV/BPthxVWicm+9CeO+5l3xaOpESkQiBWN8gnGp+dwZahQNInpZpmZdQ8IIKkglYyMJtgLgsKU9fLpBwSmUmi5jJkiyg0OewsT8+9j+BXREH/jGvEc9ibRTOzqIniMkLNXHEk8XPF6wRH3U8FZ8whJEQPnprFTaPZdGje5vstHxzbHlYrVBvepzaFkV9q44Pr78AKvhqCAAodXVheSlzY2FsYWJsZS8AOgAAAA4AAAAoAAAAEwAAAAwAAAAmAAAAAwAAACIAAAB2aWV3LWNvbmNlYWwtc3ltYm9saWMuc3ZnAAAAAAAAAFgEAAABAAAAeNp1VM2O2jAQvu9TWLnbjP/G9opwaJ+kylJACgti0w3q03dmbAyXQiTMxP7+ZpLt1/dBHfenw3EZB4vX+6C+T/v1x+U+DqBAWaRrUOvpYzk+NtzP8+fXOByX5fq+2azralZvLrfDxgHAhgCH3Zuiz/b6azmqj3E4K2uity4qMAFzimpW2hpAqrSfWdnA1/wo6H5DO+Ozy9a9rCba5jCiC32jMzbZnALvCgWhBCrFXHLwSgcDJWFMdFCDKTbQEaW9ic4Hn/p9VDoaPkESdTJJ2GpNVhOzeSSeTFbAEmNhvgQJvKWST5aJCTmXQJbZTXAFi/qrzgqbe9/SmEihowOe0BTZNykXFhboK0IBPBUINwMkVgLGBbFGgVKBcwKDpTjSQVhVr4RbmfpiIhALMZASAXEUFZeQkvBcig8qi6nUXQkLW6CjjPM83axp1y6RKt3gBjfNDOmSD4FLWIU2wM7xP6GIYKNAhBoU3ZSWsFeq+KfXp30OWKOxIVSOYoVDxKVImtivjENiNmoK01lTovSOSrF4aQ7I76T6oPQ56WPSp6QPycuMEE18ZCV9c9xa8K1dlsFkONv8kE3H3ax5YMu/r2q86ZFlzJEnjOJtebMnKVRF0PXrl+nS8qC0+eI/QYQ+m+VyfT7Bx5Z9RB6OjtcJOGh6NQzq92mex2H6c7vtP5efl/lyGza7ty2/AXb/ACNb5p4AKHV1YXkpanVtcGxpbmsvAAAaAAAAdmlldy1yZWZyZXNoLXN5bWJvbGljLnN2ZwAAAAAAAAA7BAAAAQAAAHjahVPbjtpADH3fr7DyjvHcZ1aEh/ZLKpYSJFgQpAT16+szCYGtKjWJwDrjyzm2Z3W97ajb7ndd3zYmnu8N3fbb4dvp3jZCQibq19Cw/+i7h8P9ePi8tk3X9+f35XIYBh4cny67pRWRpSZs1m+kz+r8o+/oo22OlNhLtIEMbWghHI2z2ZCwSMrG0sKwdd6lACiX7D2g7FMMUSEbXJGIUMc2qWNWMKcMcBE4hByKJ8c5BB/LC5TY+ihqXMmyzcFousguJpMzffGyQDY05U/P/JETDhNoT/6ZK1Ul48sUpxyTBnp4+SxgIWykVD8za5JHbcUmq/ajCrWwpvJfYmoeP8eA3DPYPCRaNlEgUHmlkYyqkSTO0CKyxgX1CZiChtlpIBiG9wE+ngVSCw6z1TD7igVWAKFSg0utaTjGVNBy/7D+EaHuZmQ2F/NcvFEGKsWLBde/GeoioNuuboT+Y+RIp78R1NFycSNibW3fAQXElOBwioo2TuC4ZrPRoW91iJtxroChDDvpMdUC21S59RrUt6NANxWm64RUdSnVbfz+k+mGZkHhxLLKhGGSukxgtWdjnO60Vzpe7S9Wx3GoumGMYrXVZcZi0camkc7UoWdB7Npj7rVT5uU6PrHfdITshn7uD4e22fy6XLaf/ffT4XRpluu3FS75+g9qKd/oACh1dWF5KXdpbmRvdy1yZXN0b3JlLXN5bWJvbGljLnN2ZwAAAADqAAAAAQAAAHjaRY5LDoMwDET3nMLynvxa0VARFu1JqkJJpECikBLU0zcsANuL0fPYmmZeBtC9GXRUyCu/IiymTw+3KmTAgFd5EJLpot4N62inWaGO0d8pTSmRdCEuDFQwxmh+iG0BuRr/iho6hSNcSS2lkHwTteBSwgIVYZzfuAS9yzrT8sA/GEHk1iDOtTiPygNvzhwW4WOsVfj+htBP8emsC0jbotkytX89PT1SACh1dWF5KXZpZXctcmV2ZWFsLXN5bWJvbGljLnN2ZwAAOwIAAAEAAAB42k2R3W7CMAyF73kKK/dOHSfNz0S52J5kAkYrFYrajqI9/RzYQqvc+IuPz3G6nW4naI/dqZ0bZfz1ruDWHZf34d4oAgLj5ShYusPc/jfcz/1lalQ7z9e3qlqWRS9WD+OpYiKqZKDabUC+7fVzbuHQqDNEYNgDWu1ddDYCaSKbyAN6HS2TNcDaBV97Bgw62MjRgJeuEE2Wkk7GkdxaXXOwzoHTlLIAap2itDMUnZDEJkbRFUcslsURi2VRShwyJpiU0xZPzKbW2QBYXDHbCqpXefEvioEfOMvj5eCs2VDKK4MDo0NMeaLEhwlwVeMfciuKDzzBGjzQa7w0G6qdT1IjyzPF5OrHbnI9vWqGJ+C8VmGYEa5Fz/OcTwq+ur5v1P57HI+X+WPoh1FVu802/+TdL8lufWUAKHV1YXkpZW1vdGVzLwAhAAAAZ28taG9tZS1zeW1ib2xpYy5zdmcAAAAAhwMAAAEAAAB42m2T247iMAyG7+cpotwnteMcR5SL3SdZMSxFKgNiuhTt06+dHuhIC5UIzu8/9ud09/U4qe54PnVDqzHenlo9zsfxx/XZalCgMPKj1Xj+GLpF8Lz0n1+t7obh9t404zjakez1fmocADRsqPdvij+726+hUx+tvqiswFIkl1EdlAEb2NogBzGmEguvrYfoOGwDpIykemW89dFn7xXZ5FwMccpNWIOsLJSCpKLLBbhQ6xOr3CbkZtuHkmRux4og8C95Sab67bi+w7oHHDEvgSHONlM6n15ciTnLyqN4izSj29ZhllO3PZjvTUwCXhCVus3OS2gmsDJ5hf6qi/wDnJsoJULxUpqFKqm7QFIFsxUdyR5iwiIR7wMJdvAxJynwf4zBusBeThYL63U6FNh0E8gJpYQFMCvmkis+lCkjAzZOKIaFYgh+oSgVCcX5qdLDRjNflJcO2SlsddPQDK6nTk7bqRHxZcmVQPZUD56H/WI8d7JhYr5Bgal1IewSVSqQvMPqBt7JPeYDsN5yszKWmTEXrX6f+77Vhz/3+/Fz+Hntr3fd7N928sLs/wGn970GACh1dWF5KWNhdGVnb3JpZXMvMAAAADkAAAARAAAAVQAAABYAAABPAAAARwAAACQAAABWAAAAFwAAAE4AAABtZWRpYS1wbGF5YmFjay1wYXVzZS1zeW1ib2xpYy5zdmcAAADkAQAAAQAAAHjazZFNDoIwEEb3nmIy+9IOgoqhLPQkBrAl4S9YKfH0tqixCw9g00ym+V7eTNL8NivQdaO0kUi7cUGYm9qehkWiAAG0cxfBNpXRH2Dp2v4mURszHjm31kZ2Gw2T4rEQgjshFhtwJ1dwbdpWYnmfpro356Edpne25uPFaKgkdrAFAu1qCSJKU7E/kJ/tHkmSxZS5lmAGij3wRViQM1oVzDtYIGEhxlZuduVlCsAAWaEHdH4U8p/7kvj3hXOuik3uf6N4Au8Fa28AKHV1YXkpc3RhcnJlZC1zeW1ib2xpYy5zdmcAAAAAAACsAgAAAQAAAHjaTVJBbuMwDLz3FYLukUmKkqgizmH7kkWbjQM4TZC6dbCvLym5QA0DpofizGik/cfXyU3H82laRo/59vDu63xc/1wfowcHDrO+3q3nt2X6WfC4zO8fo5+W5fY8DOu6hjWG6/00EAAMSugPT06f/e3vMrm30V+cKNWr20FgqlnsT2tBSg4ClchRDKhcCatCWWKq7Ga3w8Ad5BBjFW4ghyRaR5sBTJlyJ68CnGtDIVbINh6FBKPDQKlYoc0kBBEVat+ojDFktUIhJc5Sum5SSZKEqXTyiJmhqLkKpIaby5KUJVdk1VKnalSnMWBBa83K8GNEuWtsWAxSOam+QmKg0msWAEVIC+2QsUqXU+FmnJw5UluYbcebxY3cjGqx7YSVnZqizXGjL9antvncQo/dg5IIiGVtrcKWtGHmoQWdTa78CrqfSY9gtyW0xY+RtoQZm0njxCa4a2lxrSX9OmhDe3j/3UXvBHj37zzPo3/9vN+P78vLdb7e/XB42tutOnwDp9WT2AAodXVheSllbW9qaS1mbGFncy1zeW1ib2xpYy5zdmcAAAAAAAC8AQAAAQAAAHjaVZDRboQgEEXf9ysmvIMMCMpGfWi/pHGtmOhqXCqmX9+x3VVLJuRyM3PnhOKxtOCbrvWhZGinlcHSNfFtXEsmQQJaKgaxuwX/aliH/v4omQ9huiZJjFFELca5TZSUMqFAVl2ATjF9BA+3kg2gKaoGLoUxMsuRXpwukaZOods0wgJowIMiwfNNCJ2rHBX01JgpZU0G+JqoyUObOetIaG2czkgYNFYZOLaI3KVG4+F4ML+zOwZuUM9Q3EBou91aTrD8DPpXHrg++PgOyE+EfEfkOyPfIf/FPzEP7xsGQpAMPru+L1n9Nc/NPbyP/TizpLoU2y9XP8IhZQgAKHV1YXkpZW1ibGVtLXN5c3RlbS1zeW1ib2xpYy5zdmcAAAAAAF0SAAABAAAAeNp1WNlOHTkQfc9XWPfdTXu3I+Bh5ktGHQaQLgHBHUDz9eNaXLa77yRRZLzUeupUNbcfn4/q6eH58elydzLx7fukPp8fvv54/b47rWpVJtZ/J/X1/Ovy1C58v5x/f9ydni6Xt583N19fX8uXW17fH2/suq43VeDp/oeqf27f/ro8qV93pxeVq6hN6XUJYU3Z1J90/W/xvlhTYG3UZ/3Zumzr6VbP62H02Xt45FIua6xbZbWOtrJdnbHKLKuPOQUSDqeuqlpWUOJwy9sSC2wZk0BVXUUbcKMEZ+mh98HV++tiqkqXqkFNBNwL0XrYqqbVl2BPKC5FdYa18VVexFWVZ1ggvMGr1ogT1QXr5TmexgAW02kG0/GxjWIqWJ8xbs6MVted5K3J4KxJIWVxBANa5Vk4HiO+FDjDLWttDDWxpDVVR9gP0GAKitggHSlBuCEBcIKvLEgia8BAEl4lUXAoDRRqDl2YM+NC3cQtWCUlMsj1qtAlJSmHTGOG61YEcQ4TAdb4kNYaCUyCdXAJpUJYCmONlEI6kgGQQFpzyeiSwT2SxpmOFIJteAFCOAbGgI9qEMH3DSUsYxg5tIMhE7pgVRcJcA6RjC5SqBLIMeThJz5fCUwcxTgXRItJiWshF5OHJQoJviKe4gLGuCbOtbA0j8BHqiYCV6Ly00fXwA4TE5VSaMnEZMFDfH+MJAbkmBqJiB5CUpKYWqVFNWd5U0dYAarYE0YVLCpq3AiqA4qxMkpH8RHE58kwJBpGhbztDnCITQvxVF0oYoIAS5iuswC+jqQB2Ds3xFhiF6xecgiLpBEj4CAjp2B2ibdMc7vT1dbow3SGFIoZw7vjR7bejiTB9FvVJcbOnpAPdC48xBxl8O+HMgNvGWgFn1TR8hSOIxVjZ4UyG6KHRiBso/duEqcKemKFaRrYiVwFHwcAQCdwrJSfcmwxndFBIQ+pmjLFLDzkn0m4hoMMkrS3rM/lIQICeacHCYwzLSIYt5nBMQIXIZMJMmGArT6WgR7IfKLwXdXpY9npXd1NMIV7zOVayByrXA9kDpmvr3wngm1kHOSgjCQcmPiMNWvxnX2QvXyDbmN+loG6O/UzlXfCa+1g7Ctl31e4HDpGtFDhIEkoWQsnM5pXsoTWDG3SscoAwaSvhfWB9Ck/kDKM1qwB4ymMW3aMu+uFvpF2M33oZ3pgfX2IYJ69JSFz8Jn7e1++Er6hHYJDuZuMSUeJreykB+hpjNsPF/rKdKH340Vq8xaZz3Ssr8w0eugHo63DfNRfC0O2ujLNZT0XKhbnNk+G4oiXMNgWc5zyCLWAfJkQeSTotIajWx7GSsiop3m5NzTipz6nzvMW6uFWIp1EBl9hO05E4YAMwzbOuLvkzEliBHSSbeeNyKWl6CvkfqU1cFvR48cE/ftXvdQrHjOVE5JE/Z5ZIozLRgkn2sU50KNkpEbeA19Sa5T2MH74qZlSQc9DCnUN6aNjL5JZPkSm2Qh8COqQvXEWpB3T6s8siASYK3BUsjQmksyPSeGVBd5CUi7c7jNUCsKBe1okeq/xwHrjtk0JngXqvehmC4Zs/IQBxm/pSYEHE59pyqwrSL/rHm1zn+naZM7r1S+DHiVhEyTaboqektWJo6VteMre86QBtgGzpg4KfQ0ngNGA1A4ftNR3jBRogEc2t5pIVPC9evaV0keUTmNyNnzldk/I35kCu7xOgZOj7ZOToQbNQ756EXVIVdILiu90sRuF4v8b0fOERuxf9zd9NUwa2H12htvcgpJ9iiHKsJOH0K8QcnRrU1cUzvqkng/qZgRJRQvPydfsHo9YYvL5njLPR4z9DivB/hjgOS4jfZh5lu0DWGeQ4Z4YLL89EMYJMDZNgIKGnTltbQpfWndnyFqijTJsEbmuJ/X38/l8d9r+eX9/+H358/X8+n66uf9xC78Guv8PUXmVJQAodXVheSllbWJsZW1zLwAAABIAAABmb2xkZXItZG93bmxvYWQtc3ltYm9saWMuc3ZnAAAAAFoCAAABAAAAeNptUstugzAQvOcrVr7brF+AK+DQfklF0oAEAQEF1K/vmhZw1IIFw2hnxqw3G+c7VLf6Xk05k3G/Mpjr2/LarTlDQJAxLQZLfZ2qvWBtm8eYs2qa+pcoWpZFLFp0wz1SiBiRISsuQFfWv08VXHPWQiJcanRiybEEjsJaTFJJX5wewhinpPNYwgypsKl1OoUGuBLKKRe7AG16mZJX8DZGGow92utRJJiglgE3bsnSWe1DJVrzVIhPCdphrGi/OzgpKVBp+hnfHbHlKtqqobuEv7qz+mR+RbjJ+JPuv+QgkB/iMeB5WBuYn007wAz86G/pDY+z4OE5/KwvaIHTABiSKahAKq9XG0/DweCjbpqclZ/DcHtMb13TDSwqLpmfgeIbq4GDywAodXVheSl2YWx1ZS1kZWNyZWFzZS1zeW1ib2xpYy5zdmcAAJ8AAAABAAAAeNo1jEEOgyAUBfee4uXvK19NbNKAi/YkTbVCAmIQgfT0pYu+vMUsJiOPtEIvZtVRUTfuhZDMku++KGIwurGekM0c9V8ozm6HIh3jfhMi59zmofVhFT0zixqkqUGd3J9RY1bkMOAKjY6R0Fe4VPrA1T4T3sZaRa8zhGWLD299IDE18heavpyJLdwAKHV1YXkpZW1vamktbmF0dXJlLXN5bWJvbGljLnN2ZwAAAAAAAAAHAwAAAQAAAHjahVLLjuJADLzPV1h9747d7x4RDrNfsgKWIIUBkUyC5uvH7hAW7WURBHe5XC67sxmmI3SH07EbW0XxelcwnQ7zx+XeKgQEivxVMJ/2Y7cS7uf+c2hVN47X96aZ59nMzlxux8YiYsOCavsG/Nlcf48d7Ft1hmgQXUEWgwG0Y2F+OJgg8BkNeltiATKekgSM2OS8Bws7MQEaTXCBQqwcj9GC5ghtJRmyhMUzl3nRZmmExudscy1NrOUSlzrMgXkMPSIysRRLWdoYMZEzB7WT4yRFbuUEQUzZCj0ihVQVWDJAzxhSCY6qoRRDrJ4X3SIgF0QbGCq5ljCU+Y9kBb2MumxGxzqrJmGWKPP8E0+8xpC8yPbgnnUcLeAE2prwP5WXlsKWAdakNbgsWQZwjv0uu6JqPzz68aKilxS9xC+q0kL79eSh49/wmmYTxKiWKm0fdyzrD4nvC9mWbJsk8wx7eCpqXMEBXKX/9V8vM8smykr6hrPIK/hz6vtW7b5ut8Pn+OvSX26q2b5t5IXd/gDTBqUTACh1dWF5KWVtb2ppLXRyYXZlbC1zeW1ib2xpYy5zdmcAAAAAAAAATgQAAAEAAAB42sVT247aQAx936+w5j0Te26ZrAgP7ZdUu5QghQVBmqB+fW1PSMl7pUZEDMfHx55js7tPR+gPp2M/dobS9WFgOh3mb5dHZxAQKPHHwHz6HPsn4XEevu6d6cfx+l7X8zzb2dvL7Vg7RKxZ0OzfgJ/d9cfYw2dnzuAtom+RxeADKrQhYesb1udzjnyMgNaTiwK0jUsxMdDEJpODASqCUBKR2uiJYyihpJBrfAgMUUKKzQZywVHOMEmC1HdFJaYUUCqglpaa+mgbMbktRJYUmyDYRN5lUUFh5jZrmeB9uQRZjHwfwTbpTtqZ+BifXUi+a55tuuXGcX17UNbKUbDaUOUiLFqR0nPR/+fSa8OrMcU0KkY6Pf21qGKPhJC0EaE8LQ76zQ6pzDbpZTyahNmhpzJwaijLiWRmrnCXTVnGqwtSLRtC60xD4FXRhLiKLCsl40250BboN5xl5bJIO/GzNDzoHoJnpGqtSgtTiitVDbe5/ECdANrE1XTy5b0L/QWrXgJU3F6i1Rq+wxZcA1K95Ur/oSxvioGfp2HozMev2+3wNX6/DJebqfdvO/nf7/8ANfDkPAAodXVheSlsaXN0LXJlbW92ZS1zeW1ib2xpYy5zdmcAAAAAAAAAnwAAAAEAAAB42jWMQQ7CIBQF9z3Fy99boJqaGOhCT2JsLSRQCKX9jacXF768xSwmo9d9hp3cbIsh1aeDsLuJ7/EwJCGh+noCu7HYv3AEv6yGbCnpJgQzt3xuY55FJ6UUNUhDgzqdnsViNBSgcIWFumBHV+FU6YNQ+5Lwdt4bem05T0t5RB8ziaHRv9DwBZ15LeIAKHV1YXkpZG9jdW1lbnQtc2F2ZS1zeW1ib2xpYy5zdmcAAAAAAFMCAAABAAAAeNptUstugzAQvOcrVr7brF8YR8Ch/ZKK0IAEAQEF1K+vTRowarEFw2hmx9p1Os53qMr6Xk0Z4XG/Epjrcnnr1owgIPDYbQJLfZuql2Btm8eYkWqa+msULcvCFsm64R4JRIxcQZJfwD1p/zFVcMtIC4krVQBFpjWahLs/6l5MKSu49ZjDDAnTibYygcYxTFhhYxugzc8To8OvUlxh7NFLj8ygQckDbtySudXSh3LU6iTEU4K0GAsNOzgozlBIJY1vC9tyhTuqdKuAv75DfTC/Jtxs9OT7LzkIpLt5DHgaaoPiR9N2MAPd+1v4gvssaDiH5/6GFqgBrpxNQPUEVGy8uxUEPuumyUjxNQzlY3rvmm4gUX5J/fDzHwMJglUAKHV1YXkpZ2pzaWZ5LwAAKwAAAHN5c3RlbS1zZWFyY2gtc3ltYm9saWMuc3ZnAAAAAAAAPgIAAAEAAAB42lVR226DMAx971dYeU9w7mEqPGxfMrVdQYJSASvVvn5xAqNDXHx8nHNsc5weV2gu7bWZKybd/cng0V6W9+FZMQQE6eLNYGnPc7MVPPvuNlWsmef7W1EsyyIWLYbxWihELKIgqw8Qr+P9c27gXLEenLBR7ARcC+uDVIQ4JZUolQzeZkTPtOecMKXD0kDmVnACKYwqXQhRRAlvdYkOOArjTDAGtAgqWXApVCY70jRWS70FKsqgKK1HLSnQnnrRTsejpGXJBF1WMcR2wKmx5LtHpOKDldZRIXoTOwfypRqdrFZIbeFq/LIH/n8D++sHepovlqttcgSTVoaYpiJg0sb4S26t5Zld0ZQxV+v3hfg7yje9FGR7ZPDVdl3FTt/jeLnNH0M3jKyoD0f6z/Uv6PV9zgAodXVheSlwcmludGVyLXN5bWJvbGljLnN2ZwAAAADFAQAAAQAAAHjaTVHbjoMgEH3vV0x4RwcUC436sPslG+sWE63GsmL263fwsoUMzGTO4XCA8rU8wLbdw7qKiWJaGSxd6z/GtWIICKKgYOC7u7MnYR3656ti1rnplqbe+8RnyTg/UomIKQmy+gI0yunLWbhXbAAFAhrgmCiFVy1ImNOS5LmRwoRawELTgqbMAxcjNo+Ze/zCADyDLKiKRKDJrirskaSqDRZShVqSWr6JvTknLGHHxYGjNjrPCTcChSoOPDhqIpRaPKJwefqNTGyU/1N2yu7ibZXHNvcIV5JQHI+QUeZ6a9I/MPju+r5izc88t0/3OfbjzNL6Uobnrv8AmL5mawAodXVheSltZWRpYS1lamVjdC1zeW1ib2xpYy5zdmcAAAAAAF0CAAABAAAAeNpNUttugzAMfe9XWHlPsHMjVKUP25dMbVeQaKmAlWpfvzhd2kAE5vj4+NhiN9/P0J36c7e0gvztIeDen9aP8dEKBATy8QhY++PSZcLjMlznVnTLcttW1bquajVqnM6VRsQqCor9BuK1u30tHRxbcQGvXHCNCUA5GEBasHAAicrUhI0FDkKDniFXB9I+QiH4mkKCgkajowLZYE3NCqgQDVeQ0t557aJe9Py6OyCEOQYMSoI7P7qijuksbSjWxkBjzT0kqZTXRd+IWbKMJevy5d0Vr/Cv4ymaDkVN0kmDz0m94QLMrt+8F+0XLiBN/mpyPvV0zvqojjwNKmvZPsc8IKWZ3pycLhZyKNK8l4KTd5T38mTJssnzsL3YRsB3PwytOPxM0+m6fI7DOIlqv9nxb7D/A8S3g1wAKHV1YXkpYXVkaW8tdm9sdW1lLW1lZGl1bS1zeW1ib2xpYy5zdmcAAM4FAAABAAAAeNptVF1vIjEMfO+viPZ9g53vVNCHu19S0R4g0YLoXundrz+PkwUqDhBKss7Ynhnv8uNzY7avu812Wg2cjl+D+dy9nn8cvlYDGTKc5DeY8+5l2s4BX2/794/VsJ2m4+NicT6f7dnbw2mzcES0EMDh6cHIZ7kxv3b7/WpY/z6dXt+nn4f94dSf6fPj87Q1L6vhzWTDligXdmZtRrKuppIjVkS+UsIq4nE0ZPEv+5xq9Cx7Hzkmb/Zm9NZ5Cqkab1OgJHFbMzIgBb56QSQzOrlSAjaydObTICehgFJLCPK0MgmicfrdGhboe2S5Yx0DFYuoVZIN1XHBiU/eFVR3U6ZW8Ne8CYh2JfC2FoVtXTuXYmpdKxeyCnLZoSiKJdaAoxRCQ3TkWSvB3cSZK9ipUkLFka89Ln7bIWEp0rdgJjSjrRDP90G87Ge2fZYmwxVY4Fz2wtMalOWAM7ZBFbueeKsNgvBgC/c0I8Sb4ZKSPF4y+qbJbSJt73uhCGwNSCAohpyJIki8bxKdhcCBVBIPwlAj0FS2oGqx3BNHlJvk6xkjq3daehbGMyBGJ2CQ8+ZIjNEs9qGykQNHEhhBTQXKTaRW3gkpvuvqQqK2CinAiVCtSKBXu8NiuSmpxcJIQsew+O9EsbeAkzi2bZhatqpkfBssX1KTHiwWZSE2s0GlXGd7hij1g27fJ/AykVXZaDYUtztltE8J2+LUEs7mRsDlJMlQFZ0SU6wq18ffUwHeJeVsEr7a8j5Rj9ZRIy3/Jrxf78Fzoaz1sdf+RaEEdqBzvkrVpv16FG28yqwJHeJqF/w+sPMu2RpDJXbfxzZyYLY7vzSHziezwvoaHQ/H5/Vu+iPvZRkVSTcLv1xsnh6WeO8+/QOC9jB2ACh1dWF5KWVkaXQtZmluZC1zeW1ib2xpYy5zdmcAAAAAAAAAKwIAAAEAAAB42lVR226DMAx971dYeU9w7jCVPmxfMlEGSFAQsFLt6xenBUqUIB8f5xw7nKd7BXXZVPWcM+mGB4N7Uy6f/SNnCAjShc1gaa5zvRY8uvY25aye5+EjSZZlEYsW/VglChGTIMguJwjrPHzPNVxz1oETNogVwLWwPpWKEKekEpmSqbdPRGfac2uKTgFSGJW5NA1XlfBWZ+iAozCOSrVIVdTlUqhoAS0JGaulXgMVVFBk1qOWFGhPDWinw1WSsuSB7qliiG2BUzfRdo9IxadWWkeF6E1oF8iXanS0ekFqC1/Gb8Pz49j75w86Gi+UK2Eyh5kJ0MR3QowTEzDxmfghx9+IiDeWb/QEx+RGPG2RwU/TtjkrfsexvM1ffduPLLmczvRTL/+4cHnHACh1dWF5KWRvY3VtZW50LWVkaXQtc3ltYm9saWMuc3ZnGwIAAAEAAAB42lVRy27CMBC88xUr3+Ps2o4fiHBov6QCSiIZgkJKUL++uw601Irt0exk9uHN9XaE7tAfu6lV5C93Bbf+ML8N91YhIJDnT8Hc76fuKbif8vnaqm6aLuu6nudZz1YP47E2iFizodqugNfm8jF1sG/VCchoE4J1DlBHa9AS7KBC3YRIpmESkZGFijT5kHxiylh0DJjyiRx6pkJjEwbIUCVIi4MN8rucYhebZKPkiIaNXyjSTjwM3MBCx3vHqsaW5BxE9vVFbwj/6f8sMqesJCvpEFleqi3ISAORu2K508XKSTA+kOM+uWWzVPxUMiIKlASRd8XwlTPOY3Iv3DecSsplkFZ7bGRAWer33Mjj4umEBYVf4hF63uLEr6vgs8+5VbuvcTycp/chD6Oqt6uNPOL2B+J2d3wAKHV1YXkpZmFjZS1zbWlsZS1zeW1ib2xpYy5zdmcAAAAAAK8BAAABAAAAeNptkU1vgzAMhv+KlTvGgZgkEyBNPXPdvaIdINFS0Qwmfv0cqHbZDsnrj1ePY6V8Lh1838b7s1J9CI+3NF3XFdccp7lLMyJKxaFgHS6hr5QuFPTXoevDHtfl4xx6uFSqcaDPFiwQaJJj3o+ESBpbUwC3yOxjGynXaGx+RMf9YVsCMbhEOhnoJFZFkAugRNSYTEQvCfrCnxh4J8htgEHo280A/Y6Ag/+XbXRk72B2/5H9i+xjXdCahN3EnGyL3lsscgsGSVv02oojCnon4yFHR4zEGjiJ5QU5ji6crGPlpbI2mYRfmmO2bydeZzORvbwp+BzGsVLt1zxf7+E0jdOs0rqM/1D/AE/YYeoAKHV1YXkpc3RhdHVzLzIAAABFAAAAHgAAAC0AAABGAAAAOAAAAFMAAABSAAAAUQAAACwAAAAQAAAAc2VuZC10by1zeW1ib2xpYy5zdmfSBAAAAQAAAHjadVTbstowDHw/X6HJuxP5bneAh/ZLOjmUMAMHBlLC9Osry44ThpZbnEUraVeCzf1xgGF/PAzjtpHu+mzgcdxP3y/PbYOAIB29GpiOn+MwBzzPp6/7thnG8fqt66ZpaifdXm6HTiFiRwmb3QfQY3P9OQ7wuW3OEChVDwJbZX2Qiu7obKX0MgK2GL2zTiXMo0ctCVNRRRfhBEK2yjiMBuhgM8DhlgCv0VAUp5ZRGnSQDlHJwNWoliXEGP5qhXhLJBLYltKyPHtY9UgtKq+N4ewqRPSJKQORCdGS25Elp5gPD/CtTSoU3JOD/LzTW8j88QBRIxb+fO1hLSVoG3VSIFHahOjSP3dRbllJyk1WKm10yHX6bLPGYCNrwBBDVmMt+qAWQwQ7svZWVHPXIxA8g2K3TQLqiQ03hqyPnDfPbxnpgv2BMwjdRpckOLqa1FWfkjvHMllIdl63qLM92ktuYUbS1aboBygao6K+WXLKQu7phVIj36gDzSpqXoZCS3Ofw0TJoBdkVVS8VBWVn1iO5hM42s2sVzqbmh3AlQ7ehwyLiqeNsHV0SJOTSRzqebl5ELIa9W9b1jnK76GGijfykHa0OJP2hVZIhyyzSKmFF0j+15xa/IVleB3e6YsJuM7Ii0NCGvh1PJ22Tf/7dtt/jT8up8ut6XYfm/Tfs/sLD379lQAodXVheSllbW9qaS1yZWNlbnQtc3ltYm9saWMuc3ZnAAAAAAAAAFQEAAABAAAAeNplU8tu4zAMvPcrCN2tUG+piHPofsnCzSYBnCZIvXWwX1+SUtwYG+RAjGfI4Ujafn4d4Lg/HY5Tr0y83hV8nfbz2+XeKwQEE+mvYD69T8cH4X4ePz57dZym6+tmM8+znp2+3A4bi4gbaqh2L0C/7fX3dIT3Xp0ha5+9SwFQoynBGQsDdF4bmwtGmtOlB8NpF4KPOT9hXGSbMZMKocnSg1qgESOsFIIMTHc2G0fK1sdAt5JW6EmC4o1VdqE2P9VGt5ZV8B+cOTFdko0hslenMWAiFkLQwYRoA1jtIw/6QVrhZTBJaBa56BrRy3eTTIFuJRFoYH+iCOz6h7qM6dbypkLRVXPLoG5x8t9IL9uRpMJWI0vlFOlIHXO4J9UJnWRNtUGJGNfkkiKTNVrnXRZedqF4hpgWGbJ8VequIy8TW3bxAZlWLsXwNJGrVCgUruiyBWkZ+eJx1UJkjCwkX7UWhcnr0J20Io18B9hJKdaIV8+22asU7hGAKJ571CtMNIMmJP7ksIYR5AHQDhY4Em4eJLLqWUQlogSyIO2AR6ADdVXlsS0h1cKuO8uKDGHh58BL10OqfpO3pjxFz+t7mclizA3znnvXECNX9Yqjgj+ncezV8Pd2239Mvy7j5aY2u5ctv/7dN2xA5U8AKHV1YXkpd2luZG93LW1heGltaXplLXN5bWJvbGljLnN2ZwAAAAAA6gAAAAEAAAB42kWOSw6DMAxE95zC8p78QDRUhEV7kqpQEikQFFKCevqGBWB7MXoeW9Ms6wC6N4MOCnk1bwir6ePDbQoZMOBVGoRouqAPwzbaaVGoQ5jvlMYYSSyI8wMVjDGaHmKbQapmfgUNncIRClJLKSTfRS24lLCCJIzzG5egD1knmp/4ByOI1BrKa11eR/mJd2cKi/Ax1ip8f73vp/B01nmkbdbsmdo/P/A9XAAodXVheSltaW1ldHlwZXMvKQAAAGRvY3VtZW50LW9wZW4tc3ltYm9saWMuc3ZnAAAvBgAAAQAAAHjaVVTbbhpBDH3PV4z2ncGe+0QhD+2XVCTNIpEQEQpRv74+npllC0hY3uNj+9jep6/rm5lfD2/zZTdx+vyezPXwevtx+t5NZMhwkt9kboeXyzwA3+/Hj6/dNF8un4/b7e12szdvT+e3rSOirRBOzw9GPk+fvy6zedlN78YbNnuzYZtCiJ6FeCMu62MMqcL25mqKQCTjwCyPvX5nU2wprrADzBbvyDvFxyzOZDZkAzkfgnGWJLAUuKrPUQNCdikqSshdFE/2oENVnHKVRIJmYoDYFiKhNUc4e6SziRY6Xyk5RYZQHVcQt6fARa1DXEWqlIo3fuTYa50lKFJohpFZnBriqgNww/rcBZBfW5VaHEQCc9dO+okl1gBELFVJeJQifUCx2NOyliAWl5a1UAuFx3erNn3gy4qbUX5Ew170EM5MWbpaWfs15/gPgQOldUe0RC6+v+Zd2nGSw1m04YukWHhXCTrv8tfZF6KFe/HMJohujPLRg4xHZ9aKrYh2OrTmRTMB89XZ6gLKIHuymkruGuqcsLsOS+FWc3G2SX1fHm+bgPuVmDIul7Ec4mGP/RvDIpt8yjJs4QZ127M7uu3PMlrEg1LhnNsGJnTV972M7SbWx9KGa7ORAhlInJivaEda7auAUMeEQWC1VB0V148bUxZcICLXqNlE25eN9TAppNayRsMopXfIriDkqLNQ1Oq60BtqQNvLoTRJaWiLSrLIhHnVmkhLV5ljw3EdZ+lKxHxoyHo/mcUlO7J6uwCgJePSWirZKLxPoCeOsYwrHDjbWsWCtO1TJLa7Wia9VB516i42ya53c+VVVWhIvzzfrMLu9n6xcytJ9fHd7qP/L3pNf7faJdJkfh+Ox920/3M+v35cfp6Op/O0fX54wov9+R+2/UJmACh1dWF5KWRldmljZXMvAAAANQAAAE0AAAAcAAAAYXBwbGljYXRpb24teC1leGVjdXRhYmxlLXN5bWJvbGljLnN2ZwAAAD8YAAABAAAAeNqVWMluHDcQvecriLl3izu7A8uH5EuCjuMRMLYMSZGMfH1Yr4pFcmaAIIYPVA1Zy6u9P72+fzXnL09fz2+PJ5d//DyZ96cvH789/3w8WWONy/X/yXw8/fl2bhd+frt8f308nd/efvz68PDx8bF+hPX55euDt9Y+VIanz7+Y+u/Tjz/ezubPx9M3s63WpeyTse1wmMWuJe8puCpmcWsKu82hXvC73/NuFr867+weK2kryVzMklZr6ZbRw0EvXY70Ug+dFFZbNkdiTVx99G7bKp97bG656FulKAsrTOj3QavjngqdNCizDNosdzlVcNLmbQVnOLk1pIpeIBpB0iESwj/mW0XLWVxy675tfnOVWwW1XguF4PchhmrCGl1Vy9N1V2BUFZP4joeaF+Iawr7FiFvBb541s6Uqv9PJhVzkBK/WgyefepxirkLBZY9EI/XI06VaQ/pZkhihXwAGpFaFpVCcxBxZMoUD9IuZfnFr5eUQQTU811A2QowAZyj8CmASDgwkmVygOMNbL1uwIL0L5FVSjLtYFYvPKUPdUMkEFMHDjy+VVth5eiALIpBth9gpVRgghrqCOrD1FPLAWxSFAEBn2daG9YZTdQ6rDJ1xImbkKbvmHggpxZo/ELFZILyoc0HNmlccThDuckHaWQ7TDL/FQkBMjk6IQYYulRoS78AzwX/neq4E/Zs5byFBnOUUJ8Y5eLjb7k0CO1W5joouqqkYReiYwaZ6kzFR61kwM1TVfdhYqt9UkYDUsi2oLmQA0ZGfkgMMYo1EihAi0gPcEEHNwd1H1nFlW912ReDkeqXLBFFod26uQBWVczH3Fem6Hirfcs2h5Pa2sH0BJHPX4lv4SBq0QYEgXpEvNi+1FFymeEcJ6PHeKa3YEJO47vyinQLEWV9A1DC59LK1iMs81wrGh2qOSKbQRYnw3FBcSyAtYBSTjm6VGqNupdpSqyBCV8jgzGGJHECNqi3KoQwt4iU3pKawvowwi5pEIxFQIXNmXahahST27FxjACpuQoZeXcT27cr2qca2kkh+ydW95ECxjNKEHmUOHNI09CpOtEIpxdVH6hqVOG5EjvmJeriZuWIhYqUzJFHPcdQdLYQ9F4edk9RqvehJr6TEZeKVMyRRmNHF0tL+5iZbcyVZzRmVpOpd7eCoSq26k5JCs5RIzUfkDPR6P3msNhJp2vXAXVhifux2iJhcWqoX76WmZW0u0q/ILUG6rAghsElRPqCDG3syfz1dLo+n4++Xly/f335/vjy/nB5uxqqoLcNtvdu3XkYdpxqQ2RM9cv26I0qqTdJtj6lC9ZoM+Atqwd66kCaW7RW+VzLb5hOd97y2WiUFLuDvpqw7vSjSy3OmK5QmAI5GMHJVuHM409vmUnlZFW0XIoaliUvEBMava95PohFKtfBt45CgWd1VX1T3XvZ5+ul2axkbDO8lYwDNS8TSDMPeF3bqluapONA4QHzT8lyPcBcZRbAs+vcxtH1M2GI8hS/PNAPNNcXfUZx6snQ0JBcnEuHjWyvzA476tFw9RaCMBXYEUVr3yK8/dS3TbJZWNrQMDll6KpjrHJlUWynllPVWfC0kAjU23KyA6htHYMjjW5+eAzcD1kB+oJAewetvO+ZuCNDhNQ7iPR0+I02YMOO9VjDPug58yy3fcMsXUTFky/+PCiRM4snMSQvGUEKzAVVQo6VOp359qpQ5VFttuRiKH5QXgq/OBArG5ITAhZokURwEHoTRUNyYdJxU2DSSCUFmqWOYIWF13nc2QIaJCrzsVrYpiVEFZkWjB1RXZLE3euikoNNQfYLkoB56j80tF32rlKhqChPgv9zjck+rQZll0Ga5y2mR0aHoaUMj2dsOJ6gQULoVCI1rkmvd9Gg9urC/WBgN4oQ1MkRWKtHvgnAgN2itPuZE18VIhnktPcu42soYsugcMpcv+b4g0yn49y8SIlK3PacQCIs+3NRuXlq8wUyZjZ1OBY5D9JgXY51lYQ33Ax63CXKeZfEr3DAiMPcahrF1JV7F9ra7yr1D1ZjLMzYgkHSHT5EWbDR52C44aH7ovYSw0gJHJvnMXxqw4PN05mKUzWfXJoJKQCJkW9eXlVnSLskTnmsbythixw4spdb2Hb73CFaR22uRa+0LgW7D1RSZcFwbfmUbEkeKcn37vvqM4HRys5t+HuGd3PH46TGJA4hj+MqgTMba1VhkzCs0gmbYfBlhknDHh4aYuHMCaZJU2l6bo4R0oZJLlWTqqS2OFUClRHxyGykceIcZxjb5ItOHoOq93HYUtEORNoKokXbMWwFa0LSBy866iIXYXvcsn/6CDvh6OuavEYn7yUBzLb1Q8XUdijx5byh/fDrM9N2qbVdkXMnTjrvH1nyERLUvtYZam3TQEihft+z4iU3xla8cOhGhZrbc1CCRKuqYLW+h7HQngwFDw0FMB8maPhjxXtjTa/qWMxRR7g7HPAAPpbIPbv1rmpYkScDr132I6687x/6aJ7tpKK7JGtvnLqmMrmUUtpoO8yCvBW8X1xaTUZp8f74xdJ+fypY4mdn38NzsKJv0lZLa8iyJQp89rESixM0x85sycpsVudqajnkE1q/pnLlLe6Bh19eOw4ytXb76uLXBy3Hk+bP71in/sYl+og/9n/8FEejGwAAodXVheSlpY29ucy8AAAYAAABhZHdhaXRhLWFwcC8qAAAAbWVkaWEtcGxheWxpc3QtcmVwZWF0LXN5bWJvbGljLnN2ZwAAAAAAAOMEAAABAAAAeNptlN2u2jAMgO/PU1i9T8h/k4lysT3J1MMoUjkgTkfRnn62k4ZMZwiBcf3/2ew/HyeYjufTtAydDrdnB4/zcf1+fQ6dAgU64LuD9fy+TJvB8zJ/fA7dtCy3b7vduq5ytfJ6P+2MUmqHAbvDG+Brf/u5TPA+dBeIoOEBBiYQDkYQRuqUjE6YARVaRqX6qEl2bDdSaql08laDkjaGHo21TMFF516PjMQHsffkIC3JEQWnlfZYOIkOzSw6sK5HDSUy2cFpp4IB0bo6LCuC0JulQ3kzHNlUB/zBkscsliTPpiRx7EajpbU+2YhdidwWqsgGTbFs1Bn6mErfE88J/VX2pypN8IEdlLIJM2Pw3DyacaMWVb3qVVaZ6KnROQfmuaBXrqpILxUO0lhn+1xXaXMmR1Ha5enyN/bhSHJsllNhGB7Al/RtE3/gAiEbG7A5LDfF4ZTWxJZmVkrZEFFcTo/mvoxDVGoVmqjUuIBCrRLnCWRmhMy7kKDyIWDlUdEQsBSdbdaw1EKVmEyM15iIbi1OtDEPaLiJCk5UcqKiq+Res2vIcY7xv8Cq1JBrwGXHQq1Cq8wqsq9Zm+LLEuK10VQjL+cIzcnyTUTlQuxJdv8sdylL1KulQIG3qJ6toLslpGXHskxSTkFIzaZ7HVxI2EUObQ1VT5uF/1Id/DrP89CNv+/348fy4zpf793u8LanP6PDX/hGAKUAKHV1YXkpYXVkaW8tdm9sdW1lLW11dGVkLXN5bWJvbGljLnN2ZwAAAAAAMgQAAAEAAAB42p1T226DMAx931dYeSfYuUGm0oftS6a1g0p0rQor1b5+dkpb1KJpGiBw7PicYzssumMNzXpTN32lKOxPCo6b9fCyO1UKAYECPwqGzapvLhtO2/azq1TT9/vnPB+GQQ9W7w51bhAxZ0C1fAK+FjV8bNq2Uu9fh8P6s3/dtbvDGEvx/VvfwKpSWyiANGJRkoF3yFCbGMrCi4VoIwaxvIQ9oJY3r4sQvSVeW08+WGghs9pYdCGC1cFh4H0NZCSQDB8tIyJkhlNKJws2DRxBOFEElLF0jqORkBHBpLsBYuhHZM7RhgRVDJ9UonbRUCkeG6wpRd1EZlLwDVtmQ5XPNoIQ/NiC4IUGU+k0YhB6ESHVY4HJZSI3K55zRERq0WjcXFydsU60sulISuCq6JJ9NVpp1b3zH9jdxHvbNwZxSp1NuOeoH5l/Re4mCifCsknV2e/c2Rz5XANm4VOvaDy8l69LwfPBPnNcB3jzdX+c9OyI5qv6v5i7U7rI6+XTQv7t5Q+APN9RACh1dWF5KWZvbGRlci1zeW1ib2xpYy5zdmcAACgCAAABAAAAeNpNkdGOgyAQRd/7FRPewQGE6qb6sPslm9YVE62NZdXs1++MWqsQmDB37hnk8hxrCFVTh1gI7R+zgLGpps9+LgQCgvY0BUzNLYaXYO7a+7MQIcbHR5JM06Qmq/qhTgwiJmQoyhPQd3l8xwC3QnRgVO6zswOtEG2OHq4gtfJp6qwmirSUsc6lPufYwggZSQi/asw7bZcRQCMJDhaWDRdNxjFbSL94vEHyCFlnoEW5zOU2g5YFZzzjKt0i6hSV5uYPe5rqlG5BkclNzoa4V+5nf9AR3hDjgNA0COpeJ0uHqJw3DsjXsj9raOF62thAcx8vFWU3JQtHWK+5ZeWekhtq+VM7go/lG7RhqFzAT9O2hbj+DkN1j1992w8iKU8XftHyH2/7eUwAKHV1YXkpdmlldy1ncmlkLXN5bWJvbGljLnN2ZwAAAAAAAMUCAAABAAAAeNrtks0OgjAQhO88xWTvpS1/IYZy0CcxipQEhEClxKe3lShevHuwu4cmO/1m0mwxzTV01dTaKJLZsBDmprL7flEkICAz1wTbnI1+CZauvU6KtDHDjnNrbWjjsB9rHgkhuANSGcCdYjgajbOiDhEkTmAiTNMky3MHZhIiTJI0lpG/S8xInMR5vjWvsXyWXucbQXreW8I8ga2IzYd9eqx9Rwf//IfisNwl+n/PtzjOhXBp2lbR6TaO1dUc+rYfiZdB4detfAACRZZcACh1dWF5KWVtb2ppLWFjdGl2aXRpZXMtc3ltYm9saWMuc3ZnAAAAJAUAAAEAAAB42lVU244aMQx936+I5j0hdu4V8NB+ScVSQIIFwXQH9etrO5kMoBHjOLF9zrEz68f3QR33p8Nx3AwQb89BfZ/208/rczNYZRVEegY1nT7H43zgeTl/PTbDcRxvP1araZrM5Mz1flihtXZFCYfth6Lf+vZ7PKrPzXBRmVLtlPbG24iBFjorZ0JxKbCZ1aMvs6rrrPTi0uzRLxH1+aculAsptTXWFcpNSzKTRyhsiJMMAIcZxJMycIC2xjlOp8BEn73LfCymEgtBccUHh7TlscSclTfRQoiOAsGgdUAkwJCH3mhy4lU7QRxD28ccyMXoBB8t0isomyiRe4Npg6f6HEAYUFhoNDEFQq2i0lHFir2zZZspBbFqIt0J6xfGRFiQKw0mZDJRDmIuNrG2yEUc72LNR0yiLSSMVEyIkfCzxW7PB6OLiSFSiPPSGQJra4+6dhKNLYbwBAbEli8ItM8+hgM1d/dJGgn2wGMjTqnDVq7NIxfAjKHW4NDEUHfvkrQGLJLo3oI330sTdO9Cb4K0gP549GCZqx6EM207z4GnQRN6aFyQU97UjvG7TYioXltqOL5pmUCsRTVnoswZBzRqEizkhGbJWTpP+vOAe87TIJEPEKQPrkFgGjqYItcymlwy68vDUmp3Wmm+C6XyIWKJRiEumhB2FI/EcVv58gkQjnPWc3Win6Q4VLGdYjJy4XYCssHtwmk/X1HdpdNdM7FEMRnt2Oe9zhKNUhtJO5Mm9ixda7Jc1voBsYP6czqfN8Pu7/2+/xp/Xc/X+7Dafqz5a7b9D5W6DKcAKHV1YXkpZm9sZGVyLW11c2ljLXN5bWJvbGljLnN2ZwAAAKcDAAABAAAAeNrFU8lugzAQvecrRr7bePACrkIO7ZdUJA1ISYiAQtSv74xZSk6Veimy0Sxv5s0i77vhDNWpPld9IdDfHwKG+jS+No9CaNCAno6AsT721QJ4XC+3rhBV399fkmQcRzUa1bTnJNVaJ5RQHHZA3/7+3ldwLMQVckAoQaLy1jqDlFgaQGWcsz6wbGAAq4wJubWM1Mq6TBOSpBQtW0kKfpFmJGV0GzVShBTzzEUKchIgyzF1k8a3+7EtJr4lmQNa7VMKNcpymjwScB1pxFAOKsBkjNbMq7UJ2s8yYoZhkZ2n/APITK3gaKLGOF4iTYR+FXDVi49ss5/d/z2Rbur5yRdjtm2tK5XbdU7nC64gLSFD7DGfStLMRqr3PKWoYEy6jq2cRsusMSyd2/Y+rgeXJcgpdl2J3HAsc5hZJhVjV8/G1cHV5hT5e6ndJvEaPjv+REsvTcBHfbkUovxs29Otf2suTSuSw27PD+rwDbMqweYAKHV1YXkpYXVkaW8tdm9sdW1lLWhpZ2gtc3ltYm9saWMuc3ZnAAAAAAAAhQUAAAEAAAB42mVU204jMQx95yuseW9qO4mTrCgPu1+yApap1FJUui3ar1/bSS8AIJTx2MfHxydz/358gfl5/TIfVhPJ28cEx/Xz6efuYzUhIJDo3wSn9dNhPid8bDev76tpPhzefiyXp9MpnGLY7V+WjIhLBZwe7kB/7t9+H2Z4Wk1bKEABsVRieIQFBm5SS7YTYmwodsr2OgMG+6/PRVqOpM8xU5YIG1jEwBGTNIhBEormzbAgg1T4FhURYcFaUpM96JHhCNYTjUBtNSV92wgVEdh/ZyCF/o6sNYHJUO2QnSWG1JiqRaJErsbuhqYz+AdbkJBEK6v16gefmholLJ+njlUKNU3EnKRWFyLX3IwnSWlKyWtTLhhttDjkucjVonV2VY0K66QG7iNQqJxY8TkUVAC6RkQnrj4C1NCSzjB2E7Ea3qWlEbdlqYDnlt8bjWzXAZ3+TfooH8lnouT8KPr8ukAxddRuZ6aLyyquoRy6yO9dATTSmteQo2528T1x6K7dukLVvOTFRN5XicfuxBrZS0fE9qjQyfatXglIg7PBMEuHGab2BSmZ5Iv0+TUkKXVrGDAPMizUF06tcWcQ28jLn54quiOOV0zTGelS73pppPhCtbLkK66i+cVxlUcK6Th2866ReN4KQgqVTPChWd+cb+BiAW2Rypj8axunOczgLnDymmf3xIwr5nCn+WVAd0/yq6Ev+xaUoEiPsK/A/aPXut70fjxjFP8AiHT/8PAAB78Z5SaklsKrgdKwDYdsurgLbzKd+VCjxrFTtpvtpyTJPid+hzXR/VXsO1H6Fp2suUjlmODPerNZTY9/9/vn18Ov3Wa3n5YPd/f2uXz4DzEMIBYAKHV1YXkpbGlzdC1hZGQtc3ltYm9saWMuc3ZnwQAAAAEAAAB42jVO0QqDMBB79yvCvWtrBx0M24ftS8Z0tlCt1M7Kvn430CPchRCS69ZthBv86LKhVi87YfNDucfdkIREqxmE4vvsTsM+hXk15HJebkKUUppyaWIahZJSCg4kW4GnW57ZoTc04YoWGzQcas1EMdGHoPjW+hBqdVp4fTHxB5Lw9iEYen1SGub8iCEmErbq/lX2B8+ONWYAKHV1YXkpbWFpbC1zZW5kLXN5bWJvbGljLnN2ZwAAAAAAvQMAAAEAAAB42lWT25LaMAyG7/cpNL6PkXyI7R3CRfsknSwlzISFgZQwffrKshNSEoysWNKvT2T/eJ5gOJ5Pw9Qpam8vBc/zcf5xfXUKAYFavhXM569pWA68LuP3o1PDNN0+d7t5nvVs9fV+2hlE3HFCdfgA/uxvv6YBvjp1gcipemhQGx8iGd6x7YkCJUCNKbS+NdkXMKAl9plkUptghIY4CGSRTWglig2Ljk9IWkrksIVsJENRKnEdzx7n5NHGEzwHcXO6lqV69bDRx/JMsM5JdhMThhxJkYPZY0nkUM3ZLMYTrPa5AwOPTE+uB38bKssTmvXEO3757WHbSrQ+2dwBIfnssVW/qKhb6STnZozGOhtLnb4gthh9kh4wpli68R5DNG8gjRDZsm1WuAv+slbUPotfLYHtHGNPkrPM7T3Kt+8vXKDxICMj3Trn86QZCPdvvc/12LbMyMEAprCKyGqJhTjdkmXFTDh7Ki1hFPO0vHRKOlmBU/dGhyBUcJuiWXPkgdUStaQr7FaBzVZcuXMjuIQZDozaMl2uMubU+R/IGsxSrWBbpkZVAg8nsmH/c+VCMYuVEoAKfp/HsVP9n/v9+D39vI7Xu9odPvb5NTv8A6gxyHEAKHV1YXkpY2FtZXJhLXBob3RvLXN5bWJvbGljLnN2ZwAA4wMAAAEAAAB42nVT226DMAx931dYeQ/EuRGm0oftS6a2g0r0opaVal8/O9AQrRtEJTk+OXaO09X11kK327fd0Aj057uA2343vp3ujVCgAD0NAeN+O3QPwv3QH6+N6Ibh/FqW4zgWoylOl7bUSqmSBMX6BehZtfC57/tGbL4ul91xeD/1p8sci/Hzx9DBthEH8IWjZBuQqtDeec0rmjusnUFQBSpnfc1QpSoVIV3rmqAeJD7ANOkYVMHVJrAoFt7aKATSEMu4Sc2AgRtURKGDPjgpbOLbAXJhmYRhwcSRLCEnjSWRzJNMI68pL3qZxeNjqFz+tRat8tGY6cCLBwv2DQdyJDI1aEqlC6xIwVOmZ3c2MMunz5wk6T3bTDZQi3in44Bmx3gjBUOgKSYjE0NmYckMdmBuchKRmPFkJC52LryMETlLOem6pNsi03X5zylQovzzGgawXB+5V9caa67BUqagVBWQ5xauy9rCBFjuYcIkQzLfNI0ps453Cbk7IS5VEYIOyG3TvDFbyxnSGSrjuEIOxJ9fB1uV7fplxX/G9Q/Ek86DACh1dWF5KWZvbGRlci1kb2N1bWVudHMtc3ltYm9saWMuc3ZnGwIAAAEAAAB42m1Ry26DQAy85yusvbN4n7BRyKH9kiqhLBIERChE/fraS2lyKA/j9YzHY3G6Lw3Eum3iXAnlx4eApa3Xt+FRCQQE5ekRsLbXOe6ER9/d7pWI8zwe83xdV7kaOUxNrhExJ0FxPgBdp/FjjnCtRA9WBl8WDpRENAE9XCBT0lvrjKIpmSHEOGd94NzAAoEoNH7j6Cds0h2BJV4UDOslSsk5K2SFdEkkQ6m989pxpnCbgtKpwL2MBh22WoEFUq0jBWpO4ZK62PzL11plaYv/ep+1b+hpuiazluyoXzfkVrp02t+Y4gJFwgllHZPGkE5ZUkumKETI/GYnMTSvpv5oRTooXjzsa++8XSjJUNicoYDPtusqcfmapvo2vw/dMIn8fDjxTzz/AFdjdpoAKHV1YXkpdXNlci10cmFzaC1zeW1ib2xpYy5zdmcAzgMAAAEAAAB42s1T226DMAx971dYeU+IwyUwQR+2L5loB0i0VMCg2tfPTrhN2t5HSGTjyzk+EfkwVVBfm6oeC4HJ4ylgaq7za/cshAYNmNArYG4uY70mPG/tfShEPY6PlyCY51nNoer6KjBa64AaivMJ6Mkr+GjathDlZ99f7+Nb13b9EnPxx/tYw6UQN0hUTGAlSFShTTOdkCcNfUSFBnUWeY/3BJrOGmTI+WTH2qbI+XSoKMoMZmwjDLuPbtW0J0ipjgZTSZwYBgij0MYQulVDQtE1pumL3BMIcQKZujYlHJCReWxIkpHlkYp/mbLShrql3IenKB3tdWSyEC2m1g+7H19wo0RDHYzKLHNz+IarQopwK3JJJ2rtnaNOa80RdKk2e51cC53BkA6bNUk31SjEwvB0rAl6oQkkWS7DyyZxS/Gz+wm0CH69fUtrgnhBMNaGUeQoGkPEd1K8B2/uUbmFab59Ot/kZ9aWOayS7QB60/kvlqj/J808qM6nnP+78zc/mcrEACh1dWF5KWRpYWxvZy1lcnJvci1zeW1ib2xpYy5zdmcAAP4AAAABAAAAeNpNT0kOgzAMvPOKke8hCSBCK8KhfUkFlCCxCVKC+vqGoi7WSLZHnrGdL2sDU7eNsZpkOm2Eta3dZdw0CQjI1IPg2sqaz8DWd8OiyVg7nTl3zoUuDse54ZEQgntDKgL4yKebNag09cggUYLFYaakOCXemCnEoYyyk0j3WmH59QoHoXbFl2M7xf5FB57owRKkMH7Nishnlr1Z/wDh3nadpvIxz/Vgr2M3zsSLIN/vLF5pkUBmACh1dWF5KWVtb2ppLWJvZHktc3ltYm9saWMuc3ZnAAAAAAAASQEAAAEAAAB42jVPy26DMBC85ytWvtvs+hUTAYf2S6qEYiQIiLgY9eu7ThNrpZl9zGjcPPYBYj8OMbWC/HoI2Mc+fyxHKxAQyHMJyOMtxffBMU/3RytiSuulqnLOKhu1bEOlEbFiQ9GdgF+zfqUIt1bMQHCGHQJEIIIroLLm7NgeVWCUqEpLIAmmAk7Vvix2kFqhIe2KqNw548j5wix6Hkt6VQRpVKiDNYE98E15+NQqrb3zugiD4ZV9WhjjamakXkaM8T+EtAqtrn3NwX9hLlEFfI/T1Irrz7b19/S5TMsmqu7UlC93fxqFTpwAKHV1YXkpYWN0aW9ucy8AAgAAACAAAAAnAAAAGQAAAFQAAABDAAAAHwAAAAAAAAANAAAAPwAAAEgAAABLAAAAMwAAABgAAAA9AAAANAAAAB0AAAAPAAAAAQAAAEQAAAAFAAAABAAAAEoAAAAjAAAAQQAAABsAAAAVAAAAQgAAAAcAAAAvAAAATAAAAEkAAABAAAAACQAAAAsAAABQAAAAJQAAADwAAAAKAAAALwAAAD4AAAB3aW5kb3ctbWluaW1pemUtc3ltYm9saWMuc3ZnAAAAAKwAAAABAAAAeNo1jUEOgjAURPeeYvL3tr9osBrKQk9iBGmTQkmplHh6y8LJbCZ5edMs6wDbu8EmQ6qeN8Lq+nwPmyEGQ9WlhOy6ZP/ANvppMWRTmm9S5pxFPokQB1kxsyxCag8oaeZnsugMjThDsWC+aFXBQmOFEletK73Po8YXYzljwtt5b+j1ibGf0iP4EEm2h2a3tj/PbTCHACh1dWF5KW1haWwtcmVwbHktc2VuZGVyLXN5bWJvbGljLnN2Z8gCAAABAAAAeNqFUttugzAMfd9XWHlPsHMjmUofti+Z2q4g0VIBK9W+fg7l9lBpBMTRiY997GTX3c9Qnqpz2ReC/O0h4F6dho/mUQgEBPL8ChiqY1/OAY9Lfe0KUfb97T3LhmFQg1FNe840ImacUOzfgJ/d7asv4ViICzjQcACJSnvntePEjB1FZwhQETrrY6JyzHGkdNSRqRqkBfuUmogs1TCjLUcKtbEmT46VJcssa5/SJX4Ba/TKTCKEblNgk1Zu8ko9+1tRCUG54KIJXJIUUU4hsC75DUEH0pDWHUyyxKRzmIfUqrVRUwQaV8ef3HCSWCKfGuZHO2HC1od8nAJiMjyiNL5p1GgcOZ8skmfjJrUQNO8zMiq5ZoMJRY/RbrgS5NJLDS96Pbw4g/+mNlqiyfD8t+PmeC+mGssVWLlfuKSBCfiu6roQh5+2PV37z6ZuWpHt33bpxu3/ABBemDsAKHV1YXkpZXUvAAAIAAAAZ28tbmV4dC1zeW1ib2xpYy5zdmcAAAAAWwIAAAEAAAB42p1SQW6EMAy87yus3AlOSEJZAYf2JdUuBaSwIEg3qK+vYWmgag9Vk0gejTz22Eo+3WtoqrZuXMGEGWYG97byz/1cMAQEYegx8O3VNV8Jc2dvU8Ea54ZzHHvvuU94P9axRMSYCrLyBHTy4dU1cC1YBwokXKhchFwabaQG5AK1MtlCaZHpRBAlM5k9qBRTJIo0PMlwEUQBCY4yUUn6jVJCEaIWFgzdRSieUr2HrTZytaYema3ZtBTcXAVT0c88C9Gjxd5/dxnMHalgbtWshg5xn3qzFv2yiemPG7OgAxmQPeAd/d/MB3Q0DDJ4a60t2OV9HKube+ltP7K4POXLJyg/AZy4g3oAKHV1YXkpdmlldy1wYWdlZC1zeW1ib2xpYy5zdmcAAAAAAEMEAAABAAAAeNrdk01ugzAQhfc5xch7g/+BCrJoTxIlKSAlAREKaU/fsQ3GrVp1X7DQwHx+88Y25X2qoTm3dTNWhJv+QWBqz/Nz96gIAwbc4CAwt6exWYHH9XK7V6QZx/4pTed5TmaZdEOdCsZYioJkvwO8yhpe28ulIse3YTjfxpfu0g1LzuX7w9jAqSJXKEAnGiagHI5YlbJEZJlUykVCGG1spKNHA1Qiu5HMf//KM6fqRTdyRVbC61m5SG2pFKFO8QOuNklca7TrD8d2fMe1SqQqmCDpj+1ZPfTKE6OUltx6lcATqbUyhY0lusycy8CEtHR3AwbzkYK0egGhVoF6ia0OjWv44f2LRQ87ypjkwhbGFyUKk+cY8uAnEDRKU0vgDhi/A0EDv28YddzmauMiwjHWE+doyqtpluXcqyGqCsELj06Qr548Q0N+85T9pXKHaJaflPml1UbosLJKZjosbB5a+F7Yd7k0YQ9G+ssBz//VAS/Ter8r7c++/wREIeTQACh1dWF5KXNpZGViYXItc2hvdy1zeW1ib2xpYy5zdmcAAAAAAABbAgAAAQAAAHjabZLdboQgEIXv9ykm3IP8yepGvWifZONaMdHVuFRtn74D7qptCsQA83HOzMTsMdVgq6a2LifCDAuBqanmt37JCQcOwuAiMDc3Z1/A0rX3R06sc8MliuZ5ZrNi/VhHknMeoSApToAjq+GjaduclJ/jWN3de9/24zMW4sPVWbjlpAN0UTABFRwsUAUlUM7imJ8TgUlQ/DCtUylSvxdIJohgfhvzCoswv6HzURL8aT9cy8Z9YUFM6ZRLEv2bg8KH6CuY0TpWwRevmIpjbVK/V5vvxmxhFaYFLKCEg4TyghtDQ5Grxm5EjybrWguQKOhf/O7KmSsh167gUcvUJEk4iIP4zh2IwHhpDV7ReHTXEzv7p8crQQ/hIIY5ma3Vz55mUV2cMv8TFD9up4WmACh1dWF5KXZhbHVlLWluY3JlYXNlLXN5bWJvbGljLnN2ZwAAAMEAAAABAAAAeNo1TtEKgzAQe/crwr1ray0OhvVh+5IxnS3UVWpnZV+/G+gR7kIIyXXrNsGObrLJUN0uO2FzY76F3ZCERN0yCNkNyZ6Gffbv1ZBNabkKkXOuclOFOAklpRQcSH0Bnm55JIvB0IwLGmzQsCg1E8VEH4LiW+pDKNVp4fXFzB9Iwst5b+j5iXF8p3vwIZLoi+5f1f8AzF41WAAodXVheSllZGl0LWNvcHktc3ltYm9saWMuc3ZnAAAAANoCAAABAAAAeNqtUk1vhCAQve+vmHBHQcTVjXpof0njWjHR1SgV01/fgfWD9LKHViZgeG9m3jzN56UBVbeN0gXhybgSWNravA1rQRgw4AkGAdPetdoJa9895oIorcdbGBpjAiOCYWrCiDEWYkFSXgCffPzQCu4F6bGQgAp3yoMkjqXgwAMhZZxkQAViuCmQSDlwm3FwxJbOAinZNeVAWRDHWcQzwHcsBrM9zlvqrl1HzLkywSOHRlmSphuKoYDapifHKgSfx2FxulzvjbPD3K3qVIV2gSfMqfottPI8YHZu6juB8Q09dpR/tWuXfTCoB7si+/Cv5VhfXtnw1OMZyT3D3ezLs98/fBKrCZUQ+Gy7riDV1zTVD/0+dMNEwvKS23+w/AENapncACh1dWF5KW9wZW4tbWVudS1zeW1ib2xpYy5zdmcAAAAXAQAAAQAAAHjalU/BCsIwFLvvK8K7u7ZTJki7g36JuNkWunV03Tr8euvQo4iPHAJJXoicFg3TWW2iIlGPK2GxXTr7VREHh6gzCMm20XwMa++GSZGJcTwxllIq0770QbOKc87yQ2oK5JMad+ucotscQjfEi3c+vLVNH6/RoFXUQ6CCgThg2cguswf63M+JfQkc/w2IXxWS6aaQrwHNE8laRm4AKHV1YXkpYXVkaW8tdm9sdW1lLWxvdy1zeW1ib2xpYy5zdmcAAGsDAAABAAAAeNptU9GO4jAMfN+vsPre1ImTNDlRHva+5MRyFAkWBD2K9utv7N6ySHuAkDuxxzN2urredjRu97txGhqfz/eGbvvt/Hq6Dw0Tk8/4NTTv36bxM+F+PLxfh2acpvOPrpvn2c3iTpddF5i5A2GzfiF8Vudf00hvQ3Oknrxj7osPtKGWXai59EkjZqmcNUp6nIid/uO5zzWJx7Mkn7LQgVpxQTjmSuJy5Iy8kVqvlKCvAkamNqCkRH1AGOhG2pNVQKklRpxWz2CkYN+RPKi/M6PGBa+sGiRTyS7W4IsikiUUVfck0xR80JGCq6lnoAiK0ZprX1Fdkcre9wgASY1LNfcxLFDKNoWAepMBKEYfrb0I4GBZsgyrZkgsC7ti8Bk5CHxu1PLCCizoeL8QcVKyamCKrjwaiZoo9Oioq4roEK1SFdH/Gv3L7z8VWqOcFyREG5mHV6zlS6pYoY4Hp+2D38O5za4NINOSJwjb8Tb3q41l6Y/EFHGjqrJ8y1wmX2AsPtnR6hz1OqjrgkSxO6d77pfFmFir5tALZLDFyfQucUl2PWzneFsa+r0/HIZm8+dy2b5PP0+H06Xp1i8rfSnWfwHUk7dzACh1dWF5KWF2YXRhci1kZWZhdWx0LXN5bWJvbGljLnN2ZwAAAACFAQAAAQAAAHjaVZDbcoQgDIbv9yky3AMBPO6IF+2TdFwrzujqKBWnT19Sx67lkCE/4UtItW4duLbvnLdMZfPOYOvb8DbtliEgqCwuBqF/eHcG7OPwXC1z3s93KUMIIhgxLZ3UiCgjkNU3iKOaP7yDh2UjFKCgAa5ElmY6jVxuQAmTmDylo4H1zzVw+IbCT4mTwi8vjvUNI6kp5ETXIim1KgrCJ1HUAjEvlD482htgtA39SygsiYWiKJFq0r/TxVKby22U+CWE68jgJ+SVkf/P9TJUYewjg89+GCxrvpalffr3aZgWJutbRe2qfwBhIFliACh1dWF5KWVtb2ppLXBlb3BsZS1zeW1ib2xpYy5zdmcAAAAAAAAAkwQAAAEAAAB42rVUy47bMAy871cQukum3tIizqH9kiKbJgGSTRC766BfX1Lyyl5srg2MQBqKM0NS9mb4OMBxfzocx17ocHsI+Djtpx/XRy8QEHSgR8B0ehuPnwcel/P70IvjON5eu26aJjVZdb0fOoOIHRGK7QvQb3P7NR7hrRcXSES1A+mUQ2Odo51MYJXPMfjA6wTDsk9QgQRyhUmG5DqpPn/hwkZVTuhCJhmrrM2pqASFOnurwagQc0hxQdqCSL9H5dNzS7hlyCcpAzwJPznHzqUhv/OeOoTKe4xJc4foTzmXjc68Ztq211ABzRkNk8XkOqk+rOPqBP4bv/TKJG08OIUhOAxVTWtrWO0TZCiXbFpEH5NhiO6EjZ4gSyNMqaqg9sEwaMK8wNm6sjHlooAqasej1sSRWMkotJ4ygfvqQgmaMhESINYYdCT1FqP+777aa46TzzYWeytx2dSLSW00ZldrIP11NfJrOaYgC+nMIhvzsGJZE88kjbdOsRaJKpvMUamVL3HqhOfrOb8lvCsXHEM14CNabVYnOLNyfuuBXM9oHttiaKm0Oq9TWga31NhKrK8qCvh9Op97sftzv+/fx5/X8/Uuuu3Lhj8e239t5vGpACh1dWF5KWdvLXByZXZpb3VzLXN5bWJvbGljLnN2ZwAAAAAAWwIAAAEAAAB42p2S326DIBTG7/sUJ9wXDyA4FvGie5LFOjXBapQV06cfVkvbrBfLCAlfPs6f3yHk07mGpmrrxhnC1DATOLeVP/SzIQgITIVNwLdH19wC5s6eJkMa54b3JPHeUy9oP9YJR8QkFCTFDsLKh0/XwNGQDhgHDmWot0fKlVRcLoqhTJVelGRaCna91VyvXoYZBq9ctNC45dwUo8hFKrJnL2VpkKGPhb0CtSazt0zCdtw7IE2v0U/W1nOCCBfZfkdZWFtEgCgi3IMT0coHlg3tPvTG9OIdpj+/WJhdRjcqCy/Mf7JcoAuDIIGv1lpDyu9xrE7uo7f9SJJily+foPgBfXeDfAAodXVheSl2aWV3LW1vcmUtc3ltYm9saWMuc3ZnAADQAQAAAQAAAHja3ZDbDoIwDIbveYqm92wdh8kM40KfxAAyEk6B6YhP76Yx+gy2vejffvmbtNzuHZi274zVKOSyI9z71p3mXSMBgZC+EFzfWPMB9nGYNo3G2uXIuXOOuZTNa8cTIuLeEKsIfJTLxRpoNI5wYEpJUpl3rCEWTFCeSeVVnACxQmV5KkKfwPbVyStrCLjIpSe9jH/WccBfgyJLiyDf9YDRs/IvTxHCtR8GjfVtXdvJnudhXpFXURk+Xz0BYqFnigAodXVheSlwYW4tZW5kLXN5bWJvbGljLnN2ZyQCAAABAAAAeNptkU1uhDAMhfdzCiv7BIeEZFIBi/YkFVBA4k8MA6inrwMz0FEbsbC++D3znPg2l1AVdVlNCZNmWBnMdbG892vCEBCkoY/BUudT9WxY26a7JayapuEtCJZlEYsS/VgGISIGZMjSC9CJh8+pgjxhLViQCjJAEZrIhBEZo4iki5QEjkKiJErIosUdhS50xkEDGrjelMqhV/KjOpEUGCqtLNlSraUmTFKuBaLv2S34i8fVWOl+SV/YZqHILjv4dZunH3/8QF5tSU532ySKeY5XzxDqTMP/wuzfSEd1jji9/Trk1fp+6QhRcKG3Ozg2dyzzIN/Q+r0z+KqbJmHZfRyLbvrom37cGR/vTZGwYi66Ps9ZkF5i/5rpD9vZe9gAKHV1YXkpZ28tdXAtc3ltYm9saWMuc3ZnAAAALgIAAAEAAAB42p1RzW6EIBC+71NMuIMDCpZGPbRP0rhWTXQ1ShfTpy+4FmnaUwkJky/z/cxQrPcWuqZvO1MSruaNwL1v7Mu0lQQBgSt3Cdj+arrvhm0cbmtJOmPm5ySx1jKbsmlpE4GIiRMk1QXcKeY308G1JCNw4Bxqp0eRCSWVkICMo8yU9pDkWqbcQUIL/YByzNFBAyigylNZqtHzaKg4Q5Fmaf4DynjmKufkmQ8if8rl+RwWyLK9NUYOz9ULHuFCNvq7r46Mz3ghVQxFqagMU4YqRkPxH/mdsw8avedSj5HpH4v+hNHxkcB7PwwlqT+WpbmZ12mYFpJUl8L/a/UFFl56nQAodXVheSl2aWV3LWxpc3Qtc3ltYm9saWMuc3ZnAAAAAACnAgAAAQAAAHjatZLRboQgEEXf9ysmvIMzCoob9aH9ksa1YqKrcamYfn2xVm2Tbto0KcwDYS73HgjZbarBVE1tbM4oHmYGU1O5h37OGQICxb4YuOZizSaYu/Z6y5mxdjgHgXNOuEj0Yx2EiBh4Q1acwI9seLIGLjnrIASCEjgKpWSstTfmBCikVBGFy5pg8qLSNw7N1qb3adb+4UCL3y7hiwNfLY4c/jljrVfoQH3kGdDrqWWTK5ACScWhussabawkUo0yTndkTDT9FjkNKd2Rvzhtqcl9cvR6GSXq+wv8/Mr/TK7/Qu5BGDw3bZuz8mUcq6t97Nt+ZEFxypYPVbwBYjuTJAAodXVheSluZXR3b3JrLXdpcmVsZXNzLXN5bWJvbGljLnN2Zy4GAAABAAAAeNpVVNuOGjEMfd+viOZ9gnNPVsBD+yXVLF2QhgXBdAf162s7mSRFI2Q5jo/PsZ398/tTnE+Xz/NyGJS/vwbxfTmtP26vwwAChPL4DWK9fCznLeB1nb+eh+G8LPf33W5dV7kaeXt87jQA7DDhcHwT+Nvffy1n8XEYriIKJVPSKkYxiVFLrwLZIEYntYk6KgEyGeOSEWOQKjmjtNAyQiTXLEaQNnlIFuNsBOsTJQJpUrQmYCaJ/wk8BypQDuuWoBAmkQswnUNPOZoonlC1KCkihzuPUV0Cqyx4isn3Z7QcIwSPoZjGSC4wEqfkAhgtonQc3DxKNb45RZdho9AYqIKGDs+3ah2VyPQf35Ygx49bhho/Vua9kmTRTcqHEVytIisGxedWuoAaWeJCmsfQNaf5/oprg7ISgC7lnJySBSytMFJprhukzwaiaGBkBM4qj1kj5yhT7rMKyZOAGd2QS4dgLM+D29hqzyggUYeQZSrAdFa6WwtwW7+Njllwn5NPDacghwZDwCbrnVHQ4QrjijIW4Nhgxg7ZVxIFmsaCu8JOR7JS+WojSQ0ETZaVymMnA7tyH510eGQIC8AQwjZlzurEm0I0qEgmhntIglhdPEZ5C4HLojlrgky9bHU7GCwwxVB0C5rCuANNitap2rytT1RWdmir84Z20re1Lf0kqKh5OHv4dpobUQanFxBFUlqxrKil4WHHwQ11LWJmSkPIFbCP9PA81nWq8xS6Mky8Ypvm2z50z4XLjwLfqRrFQj4bWvLy4PzSM6d5zZ6dt4aVM8DTmqS7PNaI8h5iBbZa3JPEpXL95bHqX5TiY7YCBvH7Ms+HYfrzeJy+lp+3+fYYdse3Pb3rx39QHEC3ACh1dWF5KXByZWZlcmVuY2VzLXN5c3RlbS1zeW1ib2xpYy5zdmcAAMIHAAABAAAAeNqFVctuGzEMvOcrhL3vWu9HEefQfknhpLEBJw4cNw769eWMpN0N0qCGDwQtkkPOkL59fXtU+4fD4/6yHUx8eR/U2+Hh+v30vh200spE+Q7qeri/7PuD96fj8+t22F8uL982m+v1Ol3ddDo/bqzWeiMJh7sbJZ/bl5+XvbrfDk/KuCmH4GORlEc1mim4oqNTZvIuBbVTo558cMYGJYY1WZziqh4zGZ+9y/DYWMQprqSTFkOShSnnmExRYSol6uJrOm1MMlnq0WZUtWuV+siGlI2FZWwWRCwatDjpyy5IOrGyK9nTIpRUo52VYC+ItY858edIn7hMKdIGYwVcTujLGy8lBLKbCrp1yn2AjJlYjxG41j/zwlGcQHEcE94UTMUHjmCHavAGPAzWAR/aQDBjbRFLAnS2EoBQHTLS7RiQnEcTBtDd/GyZlenUoDonJj20FiybQQ81m082hjTTGVGgsBthMUTySzj0JJdttpJNOETvAWyW6DFrYgNMYCMKABUV6C6HWQQgkvGSScBiGI4iQ8Y/6klsGaluuXQuDG8jJ51URspBIOIFEGtLzBwsEECTulbImSSLkSgaQCV3CHa5KaB5IDsjXkr0yDoGBeRFg1+B1AezMZq1XZOFvj0NwLhCQAlTOiSeMyFk+BJXau2bO9sRXs1umvaDsNsoFyNyHIuLNGtL0SB35iaPbWzMjJdzNY7MJNGNpUHfHmOuIjwqO3EQkkQsAGGTtqpvsSj0KkNXRYUK0AKnih7zyvWhxbH3CFm0be0dUcO1zbUTwon9GqQmUAhgbHgtgMfomwL6wZl03yjdd1F3HbfjUzXo62TqtFZov6LyM5GfaUTFmUdw5uUMlZnGxUMWHe8bWGzXGaW1LAFy2LqcqOV5o2rnSAymPsj2n5ZcElc3CrY3qURsgBxJsTL7opUqs6WeE1jSFA9m6Os9L2/bncX1ijPRLwsZSP0ZuGivMOh2r2CYzpnRvW3ebeaYj36s1uIy9dB/oaiwiGcWVF75/nNvZsH6fm2oQCFnUL8Ox+N22P0+nx+eLz9Ox9N52Nzd3OK/9u4vMGmP4wAodXVheSllbW9qaS1vYmplY3RzLXN5bWJvbGljLnN2ZwAAAAAAUwUAAAEAAAB42p1U25LaMAx936/w5D2OZfm6Azy0X7LDUsJMWBg2JbRfX0l2smHapwIznMi6HB0p3nzej6o/nI79uG0gXB+Nup8O07fLY9sYZRQE+jVqOr2P/ezwOA8fn9umH8fra9dN06Qn1JfbsbPGmI4SNrsXRZ/NUf04DcO22f+83Q4f4/fLcLnVMzm/vo29et82ZxV1zhZSoop71Vqd0Bq09NR6bVM2AZVlnCKY7JTTMUZ0jp2N9law1R49+KCMDhmcCcprUyyUMHoVNNoE1quBXIxBSksg5eQwUiZqV3tvYqK62jmPwCDnwBXhC/aK61ZfkLB60i5xwLha74KNLXythoSenUHbbHNICjUyh6Ra1JEM0Qlh6bStpOdWk+hCClUBKMQ4ypJVy6KgpPHS7pfhtzoTTUspoBBBekTNTD2ZWGvijDpDLHwqRe6SVRKv5DNyViIRq3+0NpC6xEYyOe1YSl+oYmDilIEGYEtcjkHG4/82ycAsaUUSMotMMlPeOiWRsNp5UJy+jI0Q91OIRS/ehIKhEijCl8R71jtiYkrsGSBCFh2NcCcUyh9C4N1pV90sKrSLDEStNrGohaUWrkwsPMXMO8T9wbJpLvC+08bw5pOdv71MqZ5Gfv+elwpYCqgDNU33z5cp6CARBKAAGQjkutIC8MlUJ8LEeO9oZwbhsxd3aivOoMxP1FtZomEdKX4oLFdx7VJwbVoKtkvFNcl2yT37umfbqiCPW0alKkizkXq3y/H/Fpi1lrusvVzf9qfxF12OGh29S/MINt1x97Lhy2/3B9NQGXEAKHV1YXkpd2luZG93LWNsb3NlLXN5bWJvbGljLnN2ZwAAANwCAAABAAAAeNp1ktFygyAQRd/zFTu8owsIYifmof2STpJGZ0zMGKuZfn13IZimaVWG62W5HsD1ZTpAs28PzVgL5c5XAVO7n1/7ay0QEJSjR8Dc7sYmFVyP3elSi2Yczy95Ps9zNpusHw65RsScAsVmBXStz+9jA7taHKGguwFFDTM0SlvYktLWVOjYUqpUFQmbhNI+DjlfWurCnA50pj2r1LMThmRyQq6zjj1SBgvHeUVhqY4tdrxPyfIWzXATNZrOAd4q63gQTVBEZrH0KmQyT8nfln/hxNcIoiL8rYs1xGJNFMkoQ8EU9kcyg1zWgKxjPdNUJjLHGRKX7y4oUj97972Rj0zyCWbJTkYgmiIW/gS7w/yTcD8tGTbkL8i4VEVRPrBVv06JAd3DUmXY+y848kEJ+Gi7rhbbz2HYn8a3vusHkW9Wa/4LN9+otpxnACh1dWF5KW1haWwtdW5yZWFkLXN5bWJvbGljLnN2ZwAAOgIAAAEAAAB42lWR0W6DMAxF3/sVVt4JcZyQZCp92L5karsGiZaKMqj29bOh7RhEEJLje2/M9jaeIB+bUx5qhdX1rmBsjtN7d6+VAQNY8VAwNYchP4H7ub3capWH4fpWltM06Yl0159Ka4wpWVDtNsDX9vo5ZDjU6gwEFvZQoK6c84QsXBCgJu9dlWROMELFCDs+mdc2zXcGNAysJEgEX0whEsWi8WdUrE2W8QNnMDoaEyJyrAxRU5rhlrd1wpCqCFZXSJYJjm00BozBcxkui7xEkSf0b0mMYmR/sWDnhwdqawitZ333VCVtgrOYJK6O5BNxHQtEnxwXJJrdHt9Wh0BOiLVE8dIYwWsJzTVyeq4LYiiRnE0SSRrBj8wvs5zogUivVlwxg3OHwCj4atq2Vvvvvj9eho+u7XpV7jZb+ce7XzMafWsAKHV1YXkpaW1hZ2UtbWlzc2luZy1zeW1ib2xpYy5zdmcAPAMAAAEAAAB42m1TW26DMBD87ylW/rfxE0IV8tGeJErSgEQCIhTSnr67NhgrKviBx+vx7IP9Y7pCfWmu9VgxlfdPBlNzmT+6Z8UkSFA5NgZzcx7r1eB5a++PitXj2L9n2TzPYjaiG66ZllJmSMgOb4DPvj+ONZwrdgMrpHK5dqCENArnE3AlcmudUXgLN7hhnLN5Sd8GJlBQY5/QDG0lWStZmsKBFLtSEhXXoGmIdr9wQ0Quh+0GuggS2cZE1isbkf1366KRp/pCI2bu8B70RQrnZLHzvuAgrC21KulbwWNbKwiAohMR4wTx9FBoywWkx666rEeV8R69oNwK8qMNkWlJsyOeBZhQh/Nu0fzaayiC0kLnLic50jjMmd8k/7Zw8h2uQo6ILcYohsj4N0ayDuFMUkiCeJpIrjf6xbmVfDnDk0x5dzxrmtVYTSbJls9UojzWVlIeGBAGX03bVuz0PQyX+/jZtd0QMN71x1Mz/uDvIIwtpWbZ4W1PVX74A1yjtK8AKHV1YXkpZGlhbG9nLXdhcm5pbmctc3ltYm9saWMuc3ZnAAAAAGYCAAABAAAAeNpNktFugzAMRd/3FVbeCXYSAplKH7YvmdquINFSAYNqXz/btB0IgePce7iO2I3zGZpTe26m2lC83Q3M7Wn56O+1QUCgyLeBpT1OzVNwv3TXsTbNNN3e83xZFrt42w/n3CFizkCzfwO+drevqYFjbS5Q2oTRFYAWky8LOECGtnClD0EqlMpXkJFFL0oWuorYwJ0gBrQpVvzuIIuW+0S22JB8QUVUUagYycSgcme92unx3ee6AfKWLU4AbKtYn2Rczuk0FFmKKFCyjgSVPb0awa/hOIVWmsKnSodAG0PgvlQpUMCog+lkOpBG01nF+wuXVz7/OKcZ1mCIJR8DbM8qlC5KLAbwY1zRqvrfzHR3hmylc10qrihEKXPyIoTkKMGDslm/wJvuShxh29CW8PlHMfDddl1tDj/DcLpOn33XDybfv+3kf9j/AdW4hbsAKHV1YXkpZWRpdC1jbGVhci1zeW1ib2xpYy5zdmcAAAAAAABVBQAAAQAAAHjanVTbjtpADH3fr7DyPok996kID9svqVhKkGBBJCVov772JIHQjdpqUSSOPMfHx/Ykq/a6g2a73zVdXZA/3wq47rf96+lWFwgI5PkpoN+/dc1EuB0P721dNF13/lZVfd+XvSlPl12lEbFiwWL9AvxbnX90DbzVxRECaNiAwjIajYZYWFHpXHTJApbGmuBA6VInnXziSIikHbTCst5Ga4BKRJPQC410FMQKKXjnB2XvkRjjFORU7czA01qPoYBB6jNIPnLRnJpPDadmXSMhS2Fw4jwb4YCTPOFE45KJQyI5zd4lMQQBHDKIbF4SDQ2Z90iKUTNoGZL0FKVRwpTBjJWnsYFR3k7yj0mxuJuqPNkKOc0OpeWQxyj9o83N8iCYnSPPc/A5z3uLeQzjBKk0SbQYkBxpmI0+T1tzM7KhsYdha5/W2IDoc4rNaghGNmGcs0xibOAKKluQ+Mh6MJQZnw84AnGCeJWNSY/illKWLQkzH6fmcDJykM4HSAsxdUd56DIpNf7zMC1ZuXU462qQf4Ta/3Ih4nIf82r+BLwjuUpBXrkyl9RsUf3VN31ZOb9YU3giqvsxPpVWs9pqqbj6XPQf8u0sZ0adcRbXs+xqbmARLRb44qrlDvKlK+Dn/nCoi82vy2X73n0/HU6Xolq/rOTzt/4NNNgXzwAodXVheSllbW9qaS1mb29kLXN5bWJvbGljLnN2ZwAAKwYAAAEAAAB42t1U244aMQx936+w5j0zce6pgIftl1QsZZBgQTBl0H597SSTmaKqvJdFWuMcH9vHiVe3+x763WHfD+sG3eXRwP2wG9/Pj3UjQQI6+jYwHj6GfgI8TsfP27rph+HyrevGcWxH3Z6v+05JKTsibDZvQJ/V5cfQw8e6OYFsYzDaWxCylYgeQ4At/7BW+oB0Lvm/sgkRo8JAYNkaJ6P2ITkzAdb4Oxi4zZFkZQSReqMwEtRJtE5RJmIykX10GDONshxGRqFTrUku8mimu3OqQOinSkHgTEc2EtJyClh0U44x/fWQS6gMyHwVIphBZIo5j1jmEBNqURIV7nx0kZEYrU69RO+4YXL5pGBtSpSuUh3OGekTKGtQFRNVsr+4KL1J8VLqKB3H6ywmVxDINmy5XAvXH2l6yRd84IikYyqDI6j4kEc7h1QnlrGSJnPUMk2ac+p7kapmuoNup6Eo77VJMUopkocDKwPdIFF+l1NRj6nhwrJoWbkpJ2ZZGDr1pKIqE/GZbJungyYHZytBzSKIWrZqEcVObkO9fiQv38h/osMXnADV1ODTElE2VTWvguWNQNQqvyeXrjvU8rZ8zUiTLFkxhGotN+nB0APj1tgVOHEA16J2HmO5k5GL/+PVFRfJ5WW50s+uf28KTGvtFeblNkFT14krejgTePp8N7KPrCw9JnUpYwM/D8fjutn+ul53n8P38/F8bbrN24qX+uY3mUI/gQAodXVheSllbW9qaS1zeW1ib2xzLXN5bWJvbGljLnN2ZwAAAAAAAGADAAABAAAAeNptU12PozAMfN9fYeU9wUmcr1Xpw94vOe32SiW6rVpuqe7Xrx2goLtDIDkjz3g8wO7+dYTucDp2Q6tsvD4UfJ0O49vl0SoEBBv5VjCePoZuaXic+897q7phuL42zTiOZvTmcjs2DhEbFlT7F+Brd/05dPDRqjOQCWDhHTQaF1K2jqW5DtYmWwANlhRDFChhQm8ZcsWVWKAH7ZgsT6X7gtEFeBYrZA06Tz6Ja0OWGGT2Sv6XuzJWZCbiTNV/cf/nYDNYbybrDZ9ptgTPey+Vl4qoON5fP7ddA1ixP3CGxFGFanASWwdyTTGnMNfC9RIoirs5Mh9KXRInDYaieCRJmfsnKGPmNoaoRCw0LeBd1aNZKMdkM7fEOIVkMJdMxLFJHjl6l109dPzGIxHvWcNLUVauL8YRq9fls9jKC89KdmEzlaOax9pUYs7VgHik+uXIfqlmONkVQcmoSocamg7LxkmErIn1wEF5NiIBBik93J9HD9PZS/sCaUH0hjHdMoJ/EQW/Tn3fqvfft9vhc/hx6S831exfdvIn7L8BCyq1FQAodXVheSk=`);return j=x.Resource.new_from_data(new l.Bytes(e)),x.resources_register(j),j}function addBundledIconsToTheme(e){registerBundledIconResource(),e.add_resource_path(`/eu/jumplink/gjsify/adwaita-app/icons`)}function installBundledIconTheme(e={}){let t=e.prefer??`fallback`;if(t===`host`)return!1;let n=e.display===void 0?f.Display.get_default():e.display;return n?(addBundledIconsToTheme(h.IconTheme.get_for_display(n)),t===`bundled`&&h.Settings.get_for_display(n).set_property(`gtk-icon-theme-name`,`gjsify-adwaita-bundled`),!0):!1}var Ge=class AdwaitaApp extends w.Application{static{S.registerClass({GTypeName:`GjsifyAdwaitaApp`},AdwaitaApp)}constructor(e){super({application_id:e.applicationId,flags:e.flags??x.ApplicationFlags.DEFAULT_FLAGS}),this._window=null,this._options=e,this._initActions(),this.connect(`startup`,()=>this._onStartup()),this.connect(`activate`,()=>this._onActivate())}_initActions(){if(this._options.quitAction!==!1){let e=new x.SimpleAction({name:`quit`});e.connect(`activate`,()=>this.quit()),this.add_action(e),this.set_accels_for_action(`app.quit`,[`<primary>q`])}if(this._options.about||this._options.aboutAppdata){let e=new x.SimpleAction({name:`about`});e.connect(`activate`,()=>this._showAbout()),this.add_action(e)}}_onStartup(){this._installBundledIcons(),this._options.css&&this._loadCss(this._options.css),this._installDevtools(),this._options.onStartup?.(this)}_installBundledIcons(){let e=this._options.bundledIcons;e!==!1&&installBundledIconTheme(typeof e==`object`?e:{})}_loadCss(e){let t=f.Display.get_default();if(!t){console.error(`@gjsify/adwaita-app: no default display; CSS not applied`);return}let n=new h.CssProvider;n.load_from_string(e),h.StyleContext.add_provider_for_display(t,n,h.STYLE_PROVIDER_PRIORITY_APPLICATION)}_installDevtools(){let e=this._options.devtools;if(e===!1)return;let t=typeof e==`object`?e:{enabled:e||void 0};installDevtools(this,t)}_onActivate(){this._window||=this._options.createWindow(this),this._window.present()}_showAbout(){let e=this._options.aboutAppdata;if(e){createAboutDialog(e).present(this.get_active_window());return}let t=this._options.about;if(!t)return;let n=new w.AboutDialog({application_name:t.applicationName,application_icon:t.applicationIcon??this._options.applicationId});t.version&&(n.version=t.version),t.developerName&&(n.developer_name=t.developerName),t.website&&(n.website=t.website),t.issueUrl&&(n.issue_url=t.issueUrl),t.license&&(n.license=t.license),t.comments&&(n.comments=t.comments),t.copyright&&(n.copyright=t.copyright),t.developers?.length&&n.set_developers(t.developers),n.present(this.get_active_window())}};async function runApplication(e,t){let n=!1;try{e.register(null),n=e.get_is_remote()}catch{n=!1}let r=await e.runAsync(t);return n&&console.error(`${e.applicationId??`This application`} is already running — brought the existing instance to the front instead of opening a second window.`),r}S.type_ensure(Ge.$gtype);var Ke=class LoadingStack extends h.Stack{static{S.registerClass({GTypeName:`GjsifyLoadingStack`},LoadingStack)}constructor(e={}){super(e);let t=new h.Box({orientation:h.Orientation.VERTICAL,halign:h.Align.CENTER,valign:h.Align.CENTER,hexpand:!0,vexpand:!0});t.append(new w.Spinner),this.add_named(t,`loading`),this._content=new w.Bin({hexpand:!0,vexpand:!0}),this.add_named(this._content,`content`),this._error=new w.StatusPage({iconName:`dialog-error-symbolic`,title:`Something went wrong`}),this.add_named(this._error,`error`),this.set_visible_child_name(`loading`)}setContent(e){this._content.set_child(e)}setError(e,t){this._error.set_title(e),this._error.set_description(t??``)}showLoading(){this.set_visible_child_name(`loading`)}showContent(){this.set_visible_child_name(`content`)}showError(){this.set_visible_child_name(`error`)}};S.type_ensure(Ke.$gtype);async function runStorybook(e){return runApplication(new Be(e),[t.programInvocationName,...t.programArgs])}const qe={title:`Buttons/Button Content`,description:`Adw.ButtonContent — pairs a symbolic icon with a label inside a Gtk.Button.`,controls:[{name:`label`,label:`Label`,type:i.TEXT,defaultValue:`Download`},{name:`iconName`,label:`Icon`,type:i.SELECT,options:[{label:`Download`,value:`folder-download-symbolic`},{label:`Add`,value:`list-add-symbolic`},{label:`Send`,value:`mail-send-symbolic`},{label:`Star`,value:`starred-symbolic`}],defaultValue:`folder-download-symbolic`},{name:`canShrink`,label:`Can shrink`,type:i.BOOLEAN,defaultValue:!1}]};var Je=__exportAll({ButtonContentStories:()=>Ye,ButtonContentStory:()=>M}),M=class ButtonContentStory extends k{_content=null;_button=null;static{S.registerClass({GTypeName:`AdwStorybookButtonContent`},ButtonContentStory)}constructor(){super(k.fromMeta(ButtonContentStory.getMetadata(),`Default`))}static getMetadata(){return{...qe,component:w.ButtonContent.$gtype}}initialize(){this._content=new w.ButtonContent({label:this.args.label,iconName:this.args.iconName,canShrink:this.args.canShrink}),this._button=new h.Button({child:this._content}),this._button.add_css_class(`suggested-action`),this._button.add_css_class(`pill`),this.addContent(this._button)}updateArgs(e){this._content&&(this._content.label=this.args.label,this._content.iconName=this.args.iconName,this._content.canShrink=this.args.canShrink)}};S.type_ensure(M.$gtype);const Ye={stories:[M]},Xe={title:`Buttons/Button Styles`,description:`Buttons with Adwaita style classes: .pill, .circular, .suggested-action, .destructive-action, .flat.`,controls:[{name:`label`,label:`Demo label`,type:i.TEXT,defaultValue:`Click me`},{name:`style`,label:`Demo style`,type:i.SELECT,options:[{label:`Pill`,value:`pill`},{label:`Circular (icon)`,value:`circular`},{label:`Suggested`,value:`suggested-action`},{label:`Destructive`,value:`destructive-action`},{label:`Flat`,value:`flat`}],defaultValue:`suggested-action`}]};var Ze=__exportAll({ButtonStylesStories:()=>$e,ButtonStylesStory:()=>N});const Qe=[`pill`,`circular`,`suggested-action`,`destructive-action`,`flat`];var N=class ButtonStylesStory extends k{_demo=null;static{S.registerClass({GTypeName:`AdwStorybookButtonStyles`},ButtonStylesStory)}constructor(){super(k.fromMeta(ButtonStylesStory.getMetadata(),`Default`))}static getMetadata(){return{...Xe,component:h.Button.$gtype}}initialize(){let e=new w.WrapBox({childSpacing:12,lineSpacing:12,halign:h.Align.CENTER}),t=new h.Button({label:`Pill`});t.add_css_class(`pill`),e.append(t);let n=new h.Button({iconName:`list-add-symbolic`});n.add_css_class(`circular`),e.append(n);let r=new h.Button({label:`Suggested`});r.add_css_class(`suggested-action`),e.append(r);let i=new h.Button({label:`Delete`});i.add_css_class(`destructive-action`),e.append(i);let a=new h.Button({label:`Flat`});a.add_css_class(`flat`),e.append(a),this._demo=new h.Button({label:this.args.label}),this._applyStyle(this.args.style),e.append(this._demo),this.addContent(e)}_applyStyle(e){if(this._demo){for(let e of Qe)this._demo.remove_css_class(e);this._demo.add_css_class(e)}}updateArgs(e){this._demo&&(this._demo.label=this.args.label,this._applyStyle(this.args.style))}};S.type_ensure(N.$gtype);const $e={stories:[N]},et={title:`Buttons/Color Dialog Button`,description:`Gtk.ColorDialogButton — a button that shows a colour and opens a chooser for it. It is insensitive until a dialog is set, and the swatch announces the channel percentages.`,controls:[{name:`rgba`,label:`Colour`,type:i.TEXT,defaultValue:`#3584e4`},{name:`title`,label:`Dialog title`,type:i.TEXT,defaultValue:`Choose a colour`}]};var tt=__exportAll({ColorDialogButtonStories:()=>nt,ColorDialogButtonStory:()=>P}),P=class ColorDialogButtonStory extends k{_button=null;static{S.registerClass({GTypeName:`AdwStorybookColorDialogButton`},ColorDialogButtonStory)}constructor(){super(k.fromMeta(ColorDialogButtonStory.getMetadata(),`Default`))}static getMetadata(){return{...et,component:h.ColorDialogButton.$gtype}}initialize(){this._button=new h.ColorDialogButton({halign:h.Align.CENTER}),this._button.dialog=new h.ColorDialog,this._apply(),this.addContent(this._button)}updateArgs(e){this._apply()}_apply(){if(!this._button)return;let e=new f.RGBA;e.parse(this.args.rgba)&&(this._button.rgba=e),this._button.dialog.title=this.args.title||``}};S.type_ensure(P.$gtype);const nt={stories:[P]},rt=e(import.meta.url);let F;function load(){return F===void 0&&(F=rt("@gjsify/node-gi/gi").requireGi(`Pango`,`1.0`)),F}var it=new Proxy(Object.create(null),{get(e,t){return load()[t]},has(e,t){return t in load()}});const at={title:`Buttons/Font Dialog Button`,description:`Gtk.FontDialogButton — a button that shows a font and opens a chooser for it. At level family the label is the family alone; from font up it is family plus size, and the size box appears.`,controls:[{name:`fontDesc`,label:`Font`,type:i.TEXT,defaultValue:`Sans Bold 12`},{name:`level`,label:`Level`,type:i.SELECT,options:[{label:`Family`,value:`family`},{label:`Face`,value:`face`},{label:`Font`,value:`font`},{label:`Features`,value:`features`}],defaultValue:`font`},{name:`useFont`,label:`Draw in the font`,type:i.BOOLEAN,defaultValue:!0},{name:`useSize`,label:`Draw in the size`,type:i.BOOLEAN,defaultValue:!0}]};var ot=__exportAll({FontDialogButtonStories:()=>st,FontDialogButtonStory:()=>I}),I=class FontDialogButtonStory extends k{_button=null;static{S.registerClass({GTypeName:`AdwStorybookFontDialogButton`},FontDialogButtonStory)}constructor(){super(k.fromMeta(FontDialogButtonStory.getMetadata(),`Default`))}static getMetadata(){return{...at,component:h.FontDialogButton.$gtype}}initialize(){this._button=new h.FontDialogButton({halign:h.Align.CENTER}),this._button.dialog=new h.FontDialog,this._apply(),this.addContent(this._button)}updateArgs(e){this._apply()}_apply(){if(!this._button)return;this._button.level=this.args.level;let e=it.FontDescription.from_string(this.args.fontDesc);e!==null&&(this._button.fontDesc=e),this._button.useFont=this.args.useFont,this._button.useSize=this.args.useSize}};S.type_ensure(I.$gtype);const st={stories:[I]},ct={title:`Buttons/Link Button`,description:`Gtk.LinkButton — a button that follows a URI. It is a Gtk.Button with a uri and a visited state: clicking launches the URI and marks the link visited, and pointing it somewhere new un-visits it.`,controls:[{name:`label`,label:`Label`,type:i.TEXT,defaultValue:`GNOME`},{name:`uri`,label:`URI`,type:i.TEXT,defaultValue:`https://gnome.org`},{name:`visited`,label:`Visited`,type:i.BOOLEAN,defaultValue:!1}]};var lt=__exportAll({LinkButtonStories:()=>ut,LinkButtonStory:()=>L}),L=class LinkButtonStory extends k{_button=null;static{S.registerClass({GTypeName:`AdwStorybookLinkButton`},LinkButtonStory)}constructor(){super(k.fromMeta(LinkButtonStory.getMetadata(),`Default`))}static getMetadata(){return{...ct,component:h.LinkButton.$gtype}}initialize(){this._button=new h.LinkButton({halign:h.Align.CENTER}),this._apply(),this.addContent(this._button)}updateArgs(e){this._apply()}_apply(){if(!this._button)return;let e=this.args.label;this._button.label=e,this._button.uri=this.args.uri,this._button.visited=this.args.visited}};S.type_ensure(L.$gtype);const ut={stories:[L]},dt=[`Save as…`,`Export`,`Print`],ft={title:`Buttons/Menu Button`,description:`Gtk.MenuButton — a button whose only action is to open a menu. Where a Split Button has a primary action beside its arrow, this one has none: every choice lives in the popover.`,controls:[{name:`iconName`,label:`Icon`,type:i.SELECT,options:[{label:`Hamburger`,value:`open-menu-symbolic`},{label:`More`,value:`view-more-symbolic`},{label:`Open`,value:`document-open-symbolic`}],defaultValue:`open-menu-symbolic`},{name:`menuTitle`,label:`Menu title`,type:i.TEXT,defaultValue:`Document`}]};var pt=__exportAll({MenuButtonStories:()=>mt,MenuButtonStory:()=>R}),R=class MenuButtonStory extends k{_widget=null;static{S.registerClass({GTypeName:`AdwStorybookMenuButton`},MenuButtonStory)}constructor(){super(k.fromMeta(MenuButtonStory.getMetadata(),`Default`))}static getMetadata(){return{...ft,component:h.MenuButton.$gtype}}initialize(){this._widget=new h.MenuButton({halign:h.Align.CENTER}),this._apply(),this.addContent(this._widget)}updateArgs(e){this._apply()}_buildMenu(e){let t=new x.Menu;for(let e of dt)t.append(e,`app.${e.toLowerCase().replace(/[^a-z]+/g,`-`)}`);let n=new x.Menu;return n.append_section(e.length>0?e:null,t),n}_apply(){this._widget&&(this._widget.iconName=this.args.iconName,this._widget.menuModel=this._buildMenu(this.args.menuTitle))}};S.type_ensure(R.$gtype);const mt={stories:[R]},ht=[`audio-volume-muted-symbolic`,`audio-volume-low-symbolic`,`audio-volume-high-symbolic`],gt={title:`Buttons/Scale Button`,description:`Gtk.ScaleButton — a button whose press opens a scale. The icon follows the value: no list draws image-missing, one name is used throughout, two split the range, three put the first at the bottom and the second at the top and share the interior, five spread it.`,controls:[{name:`value`,label:`Value`,type:i.NUMBER,defaultValue:70},{name:`orientation`,label:`Orientation`,type:i.SELECT,options:[{label:`Vertical`,value:`vertical`},{label:`Horizontal`,value:`horizontal`}],defaultValue:`vertical`},{name:`hasFrame`,label:`Has frame`,type:i.BOOLEAN,defaultValue:!1}]};var _t=__exportAll({ScaleButtonStories:()=>vt,ScaleButtonStory:()=>z}),z=class ScaleButtonStory extends k{_button=null;static{S.registerClass({GTypeName:`AdwStorybookScaleButton`},ScaleButtonStory)}constructor(){super(k.fromMeta(ScaleButtonStory.getMetadata(),`Default`))}static getMetadata(){return{...gt,component:h.ScaleButton.$gtype}}initialize(){this._button=new h.ScaleButton({halign:h.Align.CENTER}),this._button.icons=ht,this._apply(),this.addContent(this._button)}updateArgs(e){this._apply()}_apply(){this._button&&(this._button.orientation=this.args.orientation===`horizontal`?h.Orientation.HORIZONTAL:h.Orientation.VERTICAL,this._button.hasFrame=this.args.hasFrame,this._button.value=this.args.value)}};S.type_ensure(z.$gtype);const vt={stories:[z]},yt={title:`Buttons/Split Button`,description:`Adw.SplitButton — a primary action button paired with a dropdown menu of related actions.`,controls:[{name:`label`,label:`Label`,type:i.TEXT,defaultValue:`Save`},{name:`iconName`,label:`Icon`,type:i.SELECT,options:[{label:`None`,value:``},{label:`Save`,value:`document-save-symbolic`},{label:`Send`,value:`mail-send-symbolic`},{label:`Add`,value:`list-add-symbolic`}],defaultValue:`document-save-symbolic`}]},bt={title:`Buttons/Split Button Flat`,description:`Adw.SplitButton with the .flat style class, as used inside header bars and toolbars.`,controls:[{name:`label`,label:`Label`,type:i.TEXT,defaultValue:`Reply`},{name:`iconName`,label:`Icon`,type:i.SELECT,options:[{label:`None`,value:``},{label:`Reply`,value:`mail-reply-sender-symbolic`},{label:`Edit`,value:`document-edit-symbolic`},{label:`Open`,value:`document-open-symbolic`}],defaultValue:`mail-reply-sender-symbolic`}]};var xt=__exportAll({SplitButtonFlatStory:()=>V,SplitButtonStories:()=>St,SplitButtonStory:()=>B});function buildMenu(){let e=new x.Menu;return e.append(`Save as…`,`app.save-as`),e.append(`Export`,`app.export`),e.append(`Print`,`app.print`),e}var B=class SplitButtonStory extends k{_widget=null;static{S.registerClass({GTypeName:`AdwStorybookSplitButton`},SplitButtonStory)}constructor(){super(k.fromMeta(SplitButtonStory.getMetadata(),`Default`))}static getMetadata(){return{...yt,component:w.SplitButton.$gtype}}initialize(){this._widget=new w.SplitButton({label:this.args.label,menuModel:buildMenu()});let e=this.args.iconName;e&&(this._widget.iconName=e),this.addContent(this._widget)}updateArgs(e){if(!this._widget)return;let t=this.args.iconName;t?this._widget.iconName=t:this._widget.label=this.args.label}};S.type_ensure(B.$gtype);var V=class SplitButtonFlatStory extends k{_widget=null;static{S.registerClass({GTypeName:`AdwStorybookSplitButtonFlat`},SplitButtonFlatStory)}constructor(){super(k.fromMeta(SplitButtonFlatStory.getMetadata(),`Default`))}static getMetadata(){return{...bt,component:w.SplitButton.$gtype}}initialize(){this._widget=new w.SplitButton({label:this.args.label,menuModel:buildMenu()}),this._widget.add_css_class(`flat`);let e=this.args.iconName;e&&(this._widget.iconName=e),this.addContent(this._widget)}updateArgs(e){if(!this._widget)return;let t=this.args.iconName;t?this._widget.iconName=t:this._widget.label=this.args.label}};S.type_ensure(V.$gtype);const St={stories:[B,V]},Ct={title:`Buttons/Toggle Button`,description:`Gtk.ToggleButton — a button that stays pressed. It is a Gtk.Button with one more property, active, so every button style class applies; Adw.ToggleGroup is the linked, single-choice form of it.`,controls:[{name:`label`,label:`Label`,type:i.TEXT,defaultValue:`Mute`},{name:`active`,label:`Active`,type:i.BOOLEAN,defaultValue:!1},{name:`flat`,label:`Flat`,type:i.BOOLEAN,defaultValue:!1}]};var wt=__exportAll({ToggleButtonStories:()=>Tt,ToggleButtonStory:()=>H}),H=class ToggleButtonStory extends k{_button=null;static{S.registerClass({GTypeName:`AdwStorybookToggleButton`},ToggleButtonStory)}constructor(){super(k.fromMeta(ToggleButtonStory.getMetadata(),`Default`))}static getMetadata(){return{...Ct,component:h.ToggleButton.$gtype}}initialize(){this._button=new h.ToggleButton({halign:h.Align.CENTER}),this._apply(),this.addContent(this._button)}updateArgs(e){this._apply()}_apply(){this._button&&(this._button.label=this.args.label,this._button.active=this.args.active,this.args.flat?this._button.add_css_class(`flat`):this._button.remove_css_class(`flat`))}};S.type_ensure(H.$gtype);const Tt={stories:[H]},Et={title:`Buttons/Toggle Group`,description:`Adw.ToggleGroup — a linked group of Adw.Toggle buttons where exactly one is active.`,controls:[{name:`active`,label:`Active toggle`,type:i.SELECT,options:[{label:`List`,value:0},{label:`Grid`,value:1},{label:`Columns`,value:2}],defaultValue:0},{name:`style`,label:`Style`,type:i.SELECT,options:[{label:`Default`,value:`default`},{label:`Flat`,value:`flat`},{label:`Round`,value:`round`}],defaultValue:`default`}]};var Dt=__exportAll({ToggleGroupStories:()=>kt,ToggleGroupStory:()=>U});const Ot=[`flat`,`round`];var U=class ToggleGroupStory extends k{_toggleGroup=null;static{S.registerClass({GTypeName:`AdwStorybookToggleGroup`},ToggleGroupStory)}constructor(){super(k.fromMeta(ToggleGroupStory.getMetadata(),`Default`))}static getMetadata(){return{...Et,component:w.ToggleGroup.$gtype}}initialize(){this._toggleGroup=new w.ToggleGroup,this._toggleGroup.add(new w.Toggle({label:`List`,iconName:`view-list-symbolic`})),this._toggleGroup.add(new w.Toggle({label:`Grid`,iconName:`view-grid-symbolic`})),this._toggleGroup.add(new w.Toggle({label:`Columns`,iconName:`view-columns-symbolic`})),this._toggleGroup.active=this.args.active,this._applyStyle(this.args.style),this.addContent(this._toggleGroup)}_applyStyle(e){if(this._toggleGroup){for(let e of Ot)this._toggleGroup.remove_css_class(e);e!=="default"&&this._toggleGroup.add_css_class(e)}}updateArgs(e){this._toggleGroup&&(this._toggleGroup.active=this.args.active,this._applyStyle(this.args.style))}};S.type_ensure(U.$gtype);const kt={stories:[U]},At={title:`Controls/Check Button`,description:`Gtk.CheckButton — a label beside an indicator, with a third "in between" state for a selection that is only partly made. The browser element spells the two states checked and indeterminate, the words the Adwaita stylesheet selects on; the grouped, single-choice form is Adw.Radio.`,controls:[{name:`label`,label:`Label`,type:i.TEXT,defaultValue:`Enable networking`},{name:`checked`,label:`Checked`,type:i.BOOLEAN,defaultValue:!0},{name:`indeterminate`,label:`Indeterminate`,type:i.BOOLEAN,defaultValue:!1},{name:`disabled`,label:`Disabled`,type:i.BOOLEAN,defaultValue:!1}]};var jt=__exportAll({CheckButtonStories:()=>Mt,CheckButtonStory:()=>W}),W=class CheckButtonStory extends k{_box=null;_button=null;static{S.registerClass({GTypeName:`AdwStorybookCheckButton`},CheckButtonStory)}constructor(){super(k.fromMeta(CheckButtonStory.getMetadata(),`Default`))}static getMetadata(){return{...At,component:h.CheckButton.$gtype}}initialize(){this._button=new h.CheckButton,this._box=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12,halign:h.Align.CENTER}),this._box.append(this._button),this._apply(),this.addContent(this._box)}updateArgs(e){this._apply()}_apply(){this._button&&(this._button.label=this.args.label,this._button.active=this.args.checked,this._button.inconsistent=this.args.indeterminate,this._button.sensitive=!this.args.disabled)}};S.type_ensure(W.$gtype);const Mt={stories:[W]},Nt=[`Automatic`,`Always`,`Never`,`When busy`],Pt={title:`Controls/Drop Down`,description:`Gtk.DropDown — pick one value from a list. The button shows the selection; the list opens in a popover. Adw.ComboRow is the same choice presented as a boxed-list row.`,controls:[{name:`selected`,label:`Selected`,type:i.SELECT,options:Nt.map((e,t)=>({label:e,value:t})),defaultValue:0},{name:`enableSearch`,label:`Search field`,type:i.BOOLEAN,defaultValue:!1}]};var Ft=__exportAll({DropDownStories:()=>It,DropDownStory:()=>G}),G=class DropDownStory extends k{_dropDown=null;static{S.registerClass({GTypeName:`AdwStorybookDropDown`},DropDownStory)}constructor(){super(k.fromMeta(DropDownStory.getMetadata(),`Default`))}static getMetadata(){return{...Pt,component:h.DropDown.$gtype}}initialize(){this._dropDown=h.DropDown.new_from_strings([...Nt]),this._dropDown.expression=h.PropertyExpression.new(h.StringObject.$gtype,null,`string`),this._dropDown.halign=h.Align.CENTER,this._apply(),this.addContent(this._dropDown)}updateArgs(e){this._apply()}_apply(){this._dropDown&&(this._dropDown.selected=this.args.selected,this._dropDown.enableSearch=this.args.enableSearch)}};S.type_ensure(G.$gtype);const It={stories:[G]},Lt={title:`Controls/Entry`,description:`Gtk.Entry — a single-line text field. Libadwaita ships no AdwEntry; the Adwaita look is the GTK entry styled by the stylesheet, which is why the row variants (Entry Row, Password Entry Row) are the widgets with an Adw prefix.`,controls:[{name:`text`,label:`Text`,type:i.TEXT,defaultValue:``},{name:`placeholder`,label:`Placeholder`,type:i.TEXT,defaultValue:`Search files…`},{name:`editable`,label:`Editable`,type:i.BOOLEAN,defaultValue:!0}]};var Rt=__exportAll({EntryStories:()=>zt,EntryStory:()=>K}),K=class EntryStory extends k{_entry=null;static{S.registerClass({GTypeName:`AdwStorybookEntry`},EntryStory)}constructor(){super(k.fromMeta(EntryStory.getMetadata(),`Default`))}static getMetadata(){return{...Lt,component:h.Entry.$gtype}}initialize(){this._entry=new h.Entry({widthRequest:280,halign:h.Align.CENTER}),this._apply(),this.addContent(this._entry)}updateArgs(e){this._apply()}_apply(){this._entry&&(this._entry.text=this.args.text,this._entry.placeholderText=this.args.placeholder,this._entry.editable=this.args.editable)}};S.type_ensure(K.$gtype);const zt={stories:[K]},Bt={title:`Controls/Spinner (GTK)`,description:`Gtk.Spinner — GTK's own busy indicator: a faint ring with a quarter arc turning around it, sized by its allocation. Adw.Spinner is the libadwaita replacement and looks different; under reduced motion GTK swaps this one for a static hourglass, which Adw.Spinner deliberately does not do.`,controls:[{name:`size`,label:`Size (px)`,type:i.RANGE,min:16,max:64,step:4,defaultValue:32},{name:`spinning`,label:`Spinning`,type:i.BOOLEAN,defaultValue:!0},{name:`disabled`,label:`Disabled`,type:i.BOOLEAN,defaultValue:!1}]};var Vt=__exportAll({GtkSpinnerStories:()=>Ht,GtkSpinnerStory:()=>q}),q=class GtkSpinnerStory extends k{_spinner=null;static{S.registerClass({GTypeName:`AdwStorybookGtkSpinner`},GtkSpinnerStory)}constructor(){super(k.fromMeta(GtkSpinnerStory.getMetadata(),`Default`))}static getMetadata(){return{...Bt,component:h.Spinner.$gtype}}initialize(){this._spinner=new h.Spinner({halign:h.Align.CENTER,valign:h.Align.CENTER}),this._apply(),this.addContent(this._spinner)}updateArgs(e){this._apply()}_apply(){if(!this._spinner)return;let e=this.args.size;this._spinner.widthRequest=e,this._spinner.heightRequest=e,this.args.spinning?this._spinner.start():this._spinner.stop(),this._spinner.sensitive=!this.args.disabled}};S.type_ensure(q.$gtype);const Ht={stories:[q]},Ut={title:`Controls/Level Bar`,description:"Gtk.LevelBar — how full something is, over an interval that need not be 0…1: a password strength meter, a battery. `mode` decides one filled level or one block per unit, and the block takes a class from the nearest OFFSET (low, high, full by default), which is how libadwaita colours it and how an application adds a colour of its own.",controls:[{name:`value`,label:`Value`,type:i.RANGE,min:0,max:1,step:.05,defaultValue:.8},{name:`maxValue`,label:`Max value`,type:i.RANGE,min:1,max:5,step:1,defaultValue:5},{name:`mode`,label:`Mode`,type:i.SELECT,options:[{label:`Continuous`,value:`continuous`},{label:`Discrete`,value:`discrete`}],defaultValue:`continuous`},{name:`orientation`,label:`Orientation`,type:i.SELECT,options:[{label:`Horizontal`,value:`horizontal`},{label:`Vertical`,value:`vertical`}],defaultValue:`horizontal`},{name:`inverted`,label:`Inverted`,type:i.BOOLEAN,defaultValue:!1}]};var Wt=__exportAll({LevelBarStories:()=>Gt,LevelBarStory:()=>J}),J=class LevelBarStory extends k{_box=null;_bar=null;static{S.registerClass({GTypeName:`AdwStorybookLevelBar`},LevelBarStory)}constructor(){super(k.fromMeta(LevelBarStory.getMetadata(),`Default`))}static getMetadata(){return{...Ut,component:h.LevelBar.$gtype}}initialize(){this._bar=new h.LevelBar,this._box=new h.Box({halign:h.Align.CENTER,valign:h.Align.CENTER}),this._box.append(this._bar),this._apply(),this.addContent(this._box)}updateArgs(e){this._apply()}_apply(){if(!this._bar)return;let e=this.args.orientation===`vertical`;this._bar.orientation=e?h.Orientation.VERTICAL:h.Orientation.HORIZONTAL,this._bar.widthRequest=e?0:200,this._bar.heightRequest=e?120:0,this._bar.max_value=this.args.maxValue,this._bar.mode=this.args.mode===`discrete`?h.LevelBarMode.DISCRETE:h.LevelBarMode.CONTINUOUS,this._bar.value=this.args.value,this._bar.inverted=this.args.inverted}};S.type_ensure(J.$gtype);const Gt={stories:[J]},Kt={title:`Controls/Password Entry`,description:`Gtk.PasswordEntry — a field for a secret: masked, no copy, a Caps Lock warning while it has focus, and show-peek-icon for a button that reveals it for one look. Adw.PasswordEntryRow is the boxed-list row built on it. Press the peek button, or Caps Lock on the keyboard, to see both states.`,controls:[{name:`showPeekIcon`,label:`Show peek icon`,type:i.BOOLEAN,defaultValue:!0},{name:`placeholderText`,label:`Placeholder`,type:i.TEXT,defaultValue:`Password`},{name:`disabled`,label:`Disabled`,type:i.BOOLEAN,defaultValue:!1}]};var qt=__exportAll({PasswordEntryStories:()=>Jt,PasswordEntryStory:()=>Y}),Y=class PasswordEntryStory extends k{_entry=null;static{S.registerClass({GTypeName:`AdwStorybookPasswordEntry`},PasswordEntryStory)}constructor(){super(k.fromMeta(PasswordEntryStory.getMetadata(),`Default`))}static getMetadata(){return{...Kt,component:h.PasswordEntry.$gtype}}initialize(){this._entry=new h.PasswordEntry({showPeekIcon:!0,widthRequest:240,halign:h.Align.CENTER}),this._apply(),this.addContent(this._entry)}updateArgs(e){this._apply()}_apply(){this._entry&&(this._entry.show_peek_icon=this.args.showPeekIcon,this._entry.placeholder_text=this.args.placeholderText,this._entry.sensitive=!this.args.disabled)}};S.type_ensure(Y.$gtype);const Jt={stories:[Y]},Yt={title:`Controls/Progress Bar`,description:"Gtk.ProgressBar — how much of a long operation is done. `fraction` is 0…1, `pulsing` is the indeterminate mode where the app knows it is busy but not how far along it is, and `osd` is libadwaita's hairline variant for under a header bar. Adw.Spinner is the size-less sibling.",controls:[{name:`fraction`,label:`Fraction`,type:i.RANGE,min:0,max:1,step:.05,defaultValue:.4},{name:`pulsing`,label:`Pulsing (indeterminate)`,type:i.BOOLEAN,defaultValue:!1},{name:`showText`,label:`Show text`,type:i.BOOLEAN,defaultValue:!0},{name:`inverted`,label:`Inverted`,type:i.BOOLEAN,defaultValue:!1},{name:`osd`,label:`OSD (hairline)`,type:i.BOOLEAN,defaultValue:!1}]};var Xt=__exportAll({ProgressBarStories:()=>Qt,ProgressBarStory:()=>Zt}),Zt=class ProgressBarStory extends k{_box=null;_bar=null;static{S.registerClass({GTypeName:`AdwStorybookProgressBar`},ProgressBarStory)}constructor(){super(k.fromMeta(ProgressBarStory.getMetadata(),`Default`))}static getMetadata(){return{...Yt,component:h.ProgressBar.$gtype}}initialize(){this._bar=new h.ProgressBar,this._box=new h.Box({spacing:12,halign:h.Align.CENTER}),this._box.append(this._bar),this._apply(),this.addContent(this._box)}updateArgs(e){this._apply()}_apply(){this._bar&&(this.args.pulsing?this._bar.pulse():this._bar.set_fraction(this.args.fraction),this._bar.show_text=this.args.showText,this._bar.inverted=this.args.inverted,this.args.osd?this._bar.add_css_class(`osd`):this._bar.remove_css_class(`osd`))}};S.type_ensure(Zt.$gtype);const Qt={stories:[Zt]},$t={title:`Controls/Scale`,description:`Gtk.Scale — a slider. Gtk.Scale extends Gtk.Range, which is abstract: the range itself has no tag, its adjustment, value, inverted and fill level are this widget’s properties. draw-value shows the number beside the knob at the value-pos you name, and the .value style class dims it.`,controls:[{name:`orientation`,label:`Orientation`,type:i.SELECT,options:[{label:`Horizontal`,value:`horizontal`},{label:`Vertical`,value:`vertical`}],defaultValue:`horizontal`},{name:`valuePos`,label:`Value position`,type:i.SELECT,options:[{label:`Top`,value:`top`},{label:`Bottom`,value:`bottom`},{label:`Left`,value:`left`},{label:`Right`,value:`right`}],defaultValue:`top`},{name:`drawValue`,label:`Draw value`,type:i.BOOLEAN,defaultValue:!0},{name:`digits`,label:`Digits`,type:i.NUMBER,defaultValue:0},{name:`inverted`,label:`Inverted`,type:i.BOOLEAN,defaultValue:!1},{name:`hasOrigin`,label:`Has origin`,type:i.BOOLEAN,defaultValue:!0},{name:`value`,label:`Value`,type:i.NUMBER,defaultValue:40}]};var en=__exportAll({ScaleStories:()=>nn,ScaleStory:()=>tn}),tn=class ScaleStory extends k{_scale=null;_adjustment=null;static{S.registerClass({GTypeName:`AdwStorybookScale`},ScaleStory)}constructor(){super(k.fromMeta(ScaleStory.getMetadata(),`Default`))}static getMetadata(){return{...$t,component:h.Scale.$gtype}}initialize(){this._adjustment=new h.Adjustment({value:40,lower:0,upper:100,stepIncrement:1,pageIncrement:10}),this._scale=new h.Scale({adjustment:this._adjustment,digits:0,drawValue:!0,widthRequest:260,valign:h.Align.CENTER}),this._apply(),this.addContent(this._scale)}updateArgs(e){this._apply()}_apply(){if(!this._scale||!this._adjustment)return;this._scale.orientation=this.args.orientation===`vertical`?h.Orientation.VERTICAL:h.Orientation.HORIZONTAL;let e={top:h.PositionType.TOP,bottom:h.PositionType.BOTTOM,left:h.PositionType.LEFT,right:h.PositionType.RIGHT};this._scale.value_pos=e[this.args.valuePos]??h.PositionType.TOP,this._scale.draw_value=this.args.drawValue,this._scale.digits=this.args.digits,this._scale.inverted=this.args.inverted,this._scale.has_origin=this.args.hasOrigin,this._adjustment.set_value(this.args.value)}};S.type_ensure(tn.$gtype);const nn={stories:[tn]},rn={title:`Controls/Search Entry`,description:`Gtk.SearchEntry — a field for typing a query. A search glyph leads while it is empty and a clear button follows once it is not, and search-changed waits out search-delay so a filter is not driven by every keystroke. Escape is stop-search, Ctrl+G is next-match.`,controls:[{name:`searchDelay`,label:`Search delay (ms)`,type:i.NUMBER,defaultValue:150},{name:`placeholderText`,label:`Placeholder`,type:i.TEXT,defaultValue:`Search…`},{name:`disabled`,label:`Disabled`,type:i.BOOLEAN,defaultValue:!1}]};var an=__exportAll({SearchEntryStories:()=>sn,SearchEntryStory:()=>on}),on=class SearchEntryStory extends k{_entry=null;_label=null;_handler=0;static{S.registerClass({GTypeName:`AdwStorybookSearchEntry`},SearchEntryStory)}constructor(){super(k.fromMeta(SearchEntryStory.getMetadata(),`Default`))}static getMetadata(){return{...rn,component:h.SearchEntry.$gtype}}initialize(){this._entry=new h.SearchEntry({widthRequest:260,halign:h.Align.CENTER}),this._label=new h.Label({label:`search-changed has not fired yet`}),this._handler=this._entry.connect(`search-changed`,()=>{this._label&&(this._label.label=`search-changed: "${this._entry?.text??``}"`)}),this._apply();let e=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12});e.append(this._entry),e.append(this._label),this.addContent(e)}updateArgs(e){this._apply()}_apply(){this._entry&&(this._entry.search_delay=this.args.searchDelay,this._entry.placeholder_text=this.args.placeholderText,this._entry.sensitive=!this.args.disabled)}};S.type_ensure(on.$gtype);const sn={stories:[on]},cn={title:`Controls/Spin Button`,description:`Gtk.SpinButton — a number field with an arrow either side of it. The range is a Gtk.Adjustment, the typed value is clamped into it (or left alone, under update-policy if-valid), and numeric refuses anything that is not a number. Adw.SpinRow is the boxed-list row that wraps this same widget.`,controls:[{name:`orientation`,label:`Orientation`,type:i.SELECT,options:[{label:`Horizontal`,value:`horizontal`},{label:`Vertical`,value:`vertical`}],defaultValue:`horizontal`},{name:`digits`,label:`Digits`,type:i.NUMBER,defaultValue:0},{name:`numeric`,label:`Numeric`,type:i.BOOLEAN,defaultValue:!1},{name:`snapToTicks`,label:`Snap to ticks`,type:i.BOOLEAN,defaultValue:!1},{name:`wrap`,label:`Wrap`,type:i.BOOLEAN,defaultValue:!1},{name:`updatePolicy`,label:`Update policy`,type:i.SELECT,options:[{label:`Always`,value:`always`},{label:`If valid`,value:`if-valid`}],defaultValue:`always`},{name:`value`,label:`Value`,type:i.NUMBER,defaultValue:5}]};var ln=__exportAll({SpinButtonStories:()=>dn,SpinButtonStory:()=>un}),un=class SpinButtonStory extends k{_spin=null;_adjustment=null;static{S.registerClass({GTypeName:`AdwStorybookSpinButton`},SpinButtonStory)}constructor(){super(k.fromMeta(SpinButtonStory.getMetadata(),`Default`))}static getMetadata(){return{...cn,component:h.SpinButton.$gtype}}initialize(){this._adjustment=new h.Adjustment({value:5,lower:0,upper:10,stepIncrement:1,pageIncrement:2}),this._spin=new h.SpinButton({adjustment:this._adjustment,digits:0,halign:h.Align.CENTER}),this._apply(),this.addContent(this._spin)}updateArgs(e){this._apply()}_apply(){!this._spin||!this._adjustment||(this._spin.orientation=this.args.orientation===`vertical`?h.Orientation.VERTICAL:h.Orientation.HORIZONTAL,this._spin.digits=this.args.digits,this._spin.numeric=this.args.numeric,this._spin.snap_to_ticks=this.args.snapToTicks,this._spin.wrap=this.args.wrap,this._spin.update_policy=this.args.updatePolicy===`if-valid`?h.SpinButtonUpdatePolicy.IF_VALID:h.SpinButtonUpdatePolicy.ALWAYS,this._adjustment.set_value(this.args.value))}};S.type_ensure(un.$gtype);const dn={stories:[un]},fn={title:`Controls/Switch`,description:`Gtk.Switch — a light switch with two states that are NOT the same thing: active is where the user put it, state is what the switched thing currently is, which is how a change that takes a while looks like a pending one. Adw.SwitchRow is the same control with a title beside it.`,controls:[{name:`active`,label:`Active`,type:i.BOOLEAN,defaultValue:!0},{name:`state`,label:`State (the backend)`,type:i.BOOLEAN,defaultValue:!0},{name:`disabled`,label:`Disabled`,type:i.BOOLEAN,defaultValue:!1}]};var pn=__exportAll({SwitchStories:()=>hn,SwitchStory:()=>mn}),mn=class SwitchStory extends k{_switch=null;static{S.registerClass({GTypeName:`AdwStorybookSwitch`},SwitchStory)}constructor(){super(k.fromMeta(SwitchStory.getMetadata(),`Default`))}static getMetadata(){return{...fn,component:h.Switch.$gtype}}initialize(){this._switch=new h.Switch({halign:h.Align.CENTER}),this._apply(),this.addContent(this._switch)}updateArgs(e){this._apply()}_apply(){this._switch&&(this._switch.active=this.args.active,this._switch.state=this.args.state,this._switch.sensitive=!this.args.disabled)}};S.type_ensure(mn.$gtype);const hn={stories:[mn]},gn={title:`Drawing/Drag Icon`,description:"Gtk.DragIcon — the widget that follows the pointer while a drag is in flight, and is destroyed with the drag. No application builds one: `get_for_drag` returns the icon a drag is using, and the drag source sets its child. What it takes as that child is the interesting part, because `create_widget_for_value` answers for six kinds of value and a drag source that offers a string gets a label and one that offers a colour gets a swatch. A drag icon takes no input at all, which is the C's own note: 'drag icons do not allow user input'.",controls:[{name:`value`,label:`Value being dragged`,type:i.SELECT,options:[{label:`A string (a Gtk.Label)`,value:`string`},{label:`A GdkRGBA (a colour swatch)`,value:`rgba`},{label:`A content provider only (no icon)`,value:`none`}],defaultValue:`string`},{name:`actions`,label:`Drag actions`,type:i.SELECT,options:[{label:`Copy`,value:`copy`},{label:`Move`,value:`move`}],defaultValue:`copy`}]};var _n=__exportAll({DragIconStories:()=>yn,DragIconStory:()=>vn}),vn=class DragIconStory extends k{_row=null;_source=null;_hint=null;static{S.registerClass({GTypeName:`AdwStorybookDragIcon`},DragIconStory)}constructor(){super(k.fromMeta(DragIconStory.getMetadata(),`Default`))}static getMetadata(){return{...gn,component:h.DragIcon.$gtype}}initialize(){let e=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12,halign:h.Align.CENTER,valign:h.Align.CENTER});this._hint=new h.Label({label:`Drag the row and watch the pointer`}),this._hint.add_css_class(`dim-label`),this._row=new h.Box({orientation:h.Orientation.HORIZONTAL,spacing:12,cssClasses:[`card`]}),this._row.append(this._buildLabel()),this._source=h.DragSource.new(),this._source.actions=this.args.actions===`move`?f.DragAction.MOVE:f.DragAction.COPY,this._source.connect(`prepare`,()=>this._contentProvider()),this._source.connect(`drag-begin`,(e,t)=>this._setIcon(t)),this._row.add_controller(this._source),this._apply(),e.append(this._hint),e.append(this._row),this.addContent(e)}updateArgs(e){this._source!==null&&(this._source.actions=this.args.actions===`move`?f.DragAction.MOVE:f.DragAction.COPY,this._apply())}_value(){switch(this.args.value){case`rgba`:return{red:.25,green:.55,blue:.95,alpha:1};case`none`:return null;default:return`Report.odt`}}_contentProvider(){let e=this._value();return e===null?null:f.ContentProvider.new_for_value(e)}_setIcon(e){let t=this._value(),n=h.DragIcon.get_for_drag(e),r=t===null?null:h.DragIcon.create_widget_for_value(t);n.set_child(r)}_buildLabel(){return new h.Label({label:`Report.odt`,cssClasses:[`heading`]})}_apply(){this._hint!==null&&(this._hint.label=this.args.value===`none`?`Drag the row — no icon, because the value has no widget to show`:`Drag the row and watch the pointer`)}};S.type_ensure(vn.$gtype);const yn={stories:[vn]},bn={title:`Drawing/Drawing Area`,description:"Gtk.DrawingArea — a blank widget that owns a size and a callback and nothing else: whatever you see is what `set_draw_func` painted. `content-width` and `content-height` are the MINIMUM and natural size at once, so a parent can hand the area more room but never less; at 0 the area has no intrinsic size at all and fills whatever it is given.",controls:[{name:`contentWidth`,label:`Content width`,type:i.RANGE,min:0,max:320,step:16,defaultValue:160},{name:`contentHeight`,label:`Content height`,type:i.RANGE,min:0,max:320,step:16,defaultValue:120},{name:`shape`,label:`Shape`,type:i.SELECT,options:[{label:`Circle`,value:`circle`},{label:`Grid`,value:`grid`},{label:`Crosshair`,value:`crosshair`}],defaultValue:`circle`}]};var xn=__exportAll({DrawingAreaStories:()=>Cn,DrawingAreaStory:()=>Sn}),Sn=class DrawingAreaStory extends k{_box=null;_area=null;static{S.registerClass({GTypeName:`AdwStorybookDrawingArea`},DrawingAreaStory)}constructor(){super(k.fromMeta(DrawingAreaStory.getMetadata(),`Default`))}static getMetadata(){return{...bn,component:h.DrawingArea.$gtype}}initialize(){this._area=new h.DrawingArea,this._area.set_draw_func((e,t,n,r)=>{let i=e.get_color();switch(t.setSourceRGBA(i.red,i.green,i.blue,i.alpha),t.rectangle(0,0,n,r),t.fill(),t.setSourceRGBA(1-i.red,1-i.green,1-i.blue,i.alpha),this.args.shape){case`grid`:for(let e=0;e<n;e+=16)t.rectangle(e,0,8,r),t.fill();break;case`crosshair`:t.rectangle(n/2-1,0,2,r),t.rectangle(0,r/2-1,n,2),t.fill();break;default:t.arc(n/2,r/2,Math.min(n,r)/2,0,2*Math.PI),t.fill();break}}),this._box=new h.Box({halign:h.Align.CENTER,valign:h.Align.CENTER}),this._box.append(this._area),this._apply(),this.addContent(this._box)}updateArgs(e){this._area?.queue_draw(),this._apply()}_apply(){this._area&&(this._area.content_width=this.args.contentWidth,this._area.content_height=this.args.contentHeight)}};S.type_ensure(Sn.$gtype);const Cn={stories:[Sn]},wn={title:`Drawing/GL Area`,description:"Gtk.GLArea — a widget whose contents are drawn on a GPU. GTK emits `::resize` before the first `::render` and the render flag is cleared AFTER the signal, so a handler may queue another frame with `queue_render()`. Here the replica is a `<canvas>` with a real WebGL context: the browser has no desktop GL, so `api` always reports the ES flavour it was given.",controls:[{name:`autoRender`,label:`Auto render`,type:i.BOOLEAN,defaultValue:!0},{name:`hasDepthBuffer`,label:`Depth buffer`,type:i.BOOLEAN,defaultValue:!1},{name:`allowedApis`,label:`Allowed APIs`,type:i.SELECT,options:[{label:`GL and GLES (default)`,value:`gl gles`},{label:`GLES only`,value:`gles`},{label:`GL only`,value:`gl`}],defaultValue:`gl gles`},{name:`spinning`,label:`Spin the triangle`,type:i.BOOLEAN,defaultValue:!0}]};var Tn=__exportAll({GLAreaStories:()=>Dn,GLAreaStory:()=>En}),En=class GLAreaStory extends k{_area=null;_readout=null;_box=null;_tick=0;_renders=0;_viewport=`—`;static{S.registerClass({GTypeName:`AdwStorybookGLArea`},GLAreaStory)}constructor(){super(k.fromMeta(GLAreaStory.getMetadata(),`Default`))}static getMetadata(){return{...wn,component:h.GLArea.$gtype}}initialize(){this._area=new h.GLArea({widthRequest:240,heightRequest:160}),this._readout=new h.Label({label:`—`}),this._readout.add_css_class(`dimmed`),this._area.connect(`resize`,(e,t,n)=>{this._viewport=`${t} × ${n}`,this._refresh()}),this._area.connect(`render`,()=>{this._renders+=1,this._refresh()}),this._box=new h.Box({orientation:h.Orientation.VERTICAL,spacing:6}),this._box.append(this._area),this._box.append(this._readout),this._apply(),this.addContent(this._box)}updateArgs(e){this._stop(),this._apply(),this._start()}_apply(){this._area&&(this._area.allowed_apis=this.args.allowedApis===`gles`?f.GLAPI.GLES:f.GLAPI.GL|f.GLAPI.GLES,this._area.auto_render=this.args.autoRender,this._area.has_depth_buffer=this.args.hasDepthBuffer)}_start(){!this._area||!this.args.spinning||(this._tick=l.timeout_add(l.PRIORITY_DEFAULT,33,()=>(this._area?.queue_render(),l.SOURCE_CONTINUE)))}_stop(){this._tick!==0&&(l.source_remove(this._tick),this._tick=0)}_refresh(){this._readout&&(this._readout.label=`viewport ${this._viewport} device px · ${this._renders} renders`)}};S.type_ensure(En.$gtype);const Dn={stories:[En]},On={title:`Drawing/Graphics Offload`,description:"Gtk.GraphicsOffload — a wrapper that asks the compositor to take its ONE child as it is, which is worth doing for content that changes every frame. `enabled` says whether it is attempted, and `black-background` paints the letterbox bars. The passthrough itself is the platform's: no browser API hands a surface to a compositor, so the replica carries the enum, the black rectangle and the bin layout, and says plainly which part is missing.",controls:[{name:`enabled`,label:`Enabled`,type:i.SELECT,options:[{label:`Enabled (default)`,value:`enabled`},{label:`Disabled`,value:`disabled`}],defaultValue:`enabled`},{name:`blackBackground`,label:`Black background`,type:i.BOOLEAN,defaultValue:!1},{name:`child`,label:`Child`,type:i.SELECT,options:[{label:`Label`,value:`label`},{label:`Image`,value:`image`},{label:`Row of labels`,value:`box`}],defaultValue:`image`}]};var kn=__exportAll({GraphicsOffloadStories:()=>jn,GraphicsOffloadStory:()=>An}),An=class GraphicsOffloadStory extends k{_offload=null;_box=null;static{S.registerClass({GTypeName:`AdwStorybookGraphicsOffload`},GraphicsOffloadStory)}constructor(){super(k.fromMeta(GraphicsOffloadStory.getMetadata(),`Default`))}static getMetadata(){return{...On,component:h.GraphicsOffload.$gtype}}initialize(){this._offload=new h.GraphicsOffload({widthRequest:280,heightRequest:96}),this._offload.enabled=+(this.args.enabled===`disabled`),this._offload.black_background=this.args.blackBackground,this._box=new h.Box({halign:h.Align.CENTER,valign:h.Align.CENTER}),this._box.append(this._offload),this._applyChild(),this.addContent(this._box)}updateArgs(e){this._offload&&(this._offload.enabled=+(this.args.enabled===`disabled`),this._offload.black_background=this.args.blackBackground,this._applyChild())}_applyChild(){if(!this._offload)return;let e;switch(this.args.child){case`label`:e=new h.Label({label:`The child of an offloaded layer`});break;case`box`:{let t=new h.Box({orientation:h.Orientation.HORIZONTAL,spacing:12});for(let e of[`One`,`Two`,`Three`])t.append(new h.Label({label:e}));e=new h.CenterBox,e.set_center_widget(t);break}default:e=new h.Image({iconName:`camera-photo-symbolic`,pixelSize:48});break}this._offload.child=e}};S.type_ensure(An.$gtype);const jn={stories:[An]},Mn={title:`Feedback/About Dialog`,description:`Adw.AboutDialog — the standard Adwaita about window with application name, version, credits and license.`,controls:[{name:`applicationName`,label:`Application name`,type:i.TEXT,defaultValue:`Adwaita Storybook`},{name:`version`,label:`Version`,type:i.TEXT,defaultValue:`0.11.0`}]};var Nn=__exportAll({AboutDialogStories:()=>Fn,AboutDialogStory:()=>Pn}),Pn=class AboutDialogStory extends k{_button=null;static{S.registerClass({GTypeName:`AdwStorybookAboutDialog`},AboutDialogStory)}constructor(){super(k.fromMeta(AboutDialogStory.getMetadata(),`Default`))}static getMetadata(){return{...Mn,component:w.AboutDialog.$gtype}}initialize(){this._button=new h.Button({label:`Show dialog`,halign:h.Align.CENTER,valign:h.Align.CENTER}),this._button.add_css_class(`pill`),this._button.add_css_class(`suggested-action`),this._button.connect(`clicked`,()=>this._present()),this.addContent(this._button)}_present(){new w.AboutDialog({applicationName:this.args.applicationName,applicationIcon:`application-x-executable-symbolic`,developerName:`A GJSify Project`,version:this.args.version,comments:`A live catalogue of native GTK and Adwaita widgets, rendered under GJS.`,website:`https://github.com/gjsify/gjsify`,issueUrl:`https://github.com/gjsify/gjsify/issues`,licenseType:h.License.MIT_X11,developers:[`Ada Lovelace`,`Grace Hopper`],designers:[`Margaret Hamilton`],copyright:`© 2026 The GJSify Project`}).present(this)}updateArgs(e){}};S.type_ensure(Pn.$gtype);const Fn={stories:[Pn]},In={title:`Feedback/Alert Dialog`,description:`Adw.AlertDialog — a modal dialog with a heading, body text and responses, including a destructive action.`,controls:[{name:`heading`,label:`Heading`,type:i.TEXT,defaultValue:`Delete Project?`},{name:`body`,label:`Body`,type:i.TEXT,defaultValue:`This will permanently remove the project and all of its files. This action cannot be undone.`}]};var Ln=__exportAll({AlertDialogStories:()=>zn,AlertDialogStory:()=>Rn}),Rn=class AlertDialogStory extends k{_button=null;static{S.registerClass({GTypeName:`AdwStorybookAlertDialog`},AlertDialogStory)}constructor(){super(k.fromMeta(AlertDialogStory.getMetadata(),`Default`))}static getMetadata(){return{...In,component:w.AlertDialog.$gtype}}initialize(){this._button=new h.Button({label:`Show dialog`,halign:h.Align.CENTER,valign:h.Align.CENTER}),this._button.add_css_class(`pill`),this._button.add_css_class(`suggested-action`),this._button.connect(`clicked`,()=>this._present()),this.addContent(this._button)}_present(){let e=new w.AlertDialog({heading:this.args.heading,body:this.args.body});e.add_response(`cancel`,`Cancel`),e.add_response(`delete`,`Delete`),e.set_response_appearance(`delete`,w.ResponseAppearance.DESTRUCTIVE),e.set_default_response(`cancel`),e.set_close_response(`cancel`),e.present(this)}updateArgs(e){}};S.type_ensure(Rn.$gtype);const zn={stories:[Rn]},Bn={title:`Feedback/Dialog`,description:`Adw.Dialog — the generic dialog: arbitrary content over a scrim, anchored as a floating card on a wide window and as a bottom sheet on a narrow one.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Preferences`},{name:`presentation`,label:`Presentation`,type:i.SELECT,options:[{label:`Auto`,value:`auto`},{label:`Floating`,value:`floating`},{label:`Bottom sheet`,value:`bottom-sheet`}],defaultValue:`auto`}]};var Vn=__exportAll({DialogStories:()=>Wn,DialogStory:()=>Un});const Hn={auto:w.DialogPresentationMode.AUTO,floating:w.DialogPresentationMode.FLOATING,"bottom-sheet":w.DialogPresentationMode.BOTTOM_SHEET};var Un=class DialogStory extends k{_button=null;static{S.registerClass({GTypeName:`AdwStorybookDialog`},DialogStory)}constructor(){super(k.fromMeta(DialogStory.getMetadata(),`Default`))}static getMetadata(){return{...Bn,component:w.Dialog.$gtype}}initialize(){this._button=new h.Button({label:`Show dialog`,halign:h.Align.CENTER,valign:h.Align.CENTER}),this._button.add_css_class(`pill`),this._button.add_css_class(`suggested-action`),this._button.connect(`clicked`,()=>this._present()),this.addContent(this._button)}_present(){let e=new w.PreferencesGroup({title:`Appearance`});e.add(new w.SwitchRow({title:`Dark style`,subtitle:`Use a dark colour scheme`,active:!0}));let t=new w.PreferencesPage({title:`General`});t.add(e),new w.Dialog({title:this.args.title,child:t,presentation_mode:Hn[this.args.presentation]}).present(this)}updateArgs(e){}};S.type_ensure(Un.$gtype);const Wn={stories:[Un]},Gn={title:`Feedback/Emoji Chooser`,description:`Gtk.EmojiChooser — the popover a text widget opens to insert an emoji: a search entry over nine named sections, a toolbar that follows the scroll position, and an emoji-picked signal.`,controls:[{name:`search`,label:`Search`,type:i.TEXT,defaultValue:`smile`}]};var Kn=__exportAll({EmojiChooserStories:()=>Jn,EmojiChooserStory:()=>qn}),qn=class EmojiChooserStory extends k{_button=null;_entry=null;_chooser=null;static{S.registerClass({GTypeName:`AdwStorybookEmojiChooser`},EmojiChooserStory)}constructor(){super(k.fromMeta(EmojiChooserStory.getMetadata(),`Default`))}static getMetadata(){return{...Gn,component:h.EmojiChooser.$gtype}}initialize(){this._entry=new h.Entry({placeholderText:`Type a message…`,halign:h.Align.CENTER}),this._entry.add_css_class(`card`),this._entry.hexpand=!0,this._chooser=h.EmojiChooser.new(),this._chooser.connect(`emoji-picked`,(e,t)=>{this._entry!==null&&this._entry.set_text(this._entry.get_text()+t)}),this._button=new h.Button({iconName:`face-smile-symbolic`,tooltipText:`Insert an emoji`,valign:h.Align.CENTER}),this._button.add_css_class(`flat`),this._button.add_css_class(`circular`),this._chooser.set_parent(this._button);let e=new h.Box({orientation:h.Orientation.HORIZONTAL,spacing:6});e.append(this._button),e.append(this._entry);let t=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12,halign:h.Align.CENTER,valign:h.Align.CENTER});t.append(e),this.addContent(t),this._applySearch(this.args.search)}_searchEntry(){let e=this._chooser?.get_first_child()??null;for(;e!==null;){if(e instanceof h.SearchEntry)return e;e=e.get_first_child()}return null}_applySearch(e){this._searchEntry()?.set_text(e)}updateArgs(e){typeof e.search==`string`&&this._applySearch(e.search)}};S.type_ensure(qn.$gtype);const Jn={stories:[qn]},Yn={title:`Feedback/GTK About Dialog`,description:`Gtk.AboutDialog — GTK's own about window: a dialog-size logo over the program name, with the Credits, License and System pages behind a stack switcher. NOT Adw.AboutDialog, which is a navigation view of preference rows.`,controls:[{name:`programName`,label:`Program name`,type:i.TEXT,defaultValue:`Calculator`},{name:`version`,label:`Version`,type:i.TEXT,defaultValue:`48.1`},{name:`licenseType`,label:`License type`,type:i.SELECT,options:[{label:`Unknown`,value:`unknown`},{label:`Custom`,value:`custom`},{label:`GPL 3.0`,value:`gpl-3-0`},{label:`MIT`,value:`mit-x11`},{label:`BSD 3-Clause`,value:`bsd-3`},{label:`Apache 2.0`,value:`apache-2-0`},{label:`0BSD`,value:`0bsd`}],defaultValue:`gpl-3-0`},{name:`withCredits`,label:`With credits`,type:i.BOOLEAN,defaultValue:!0}]};var Xn=__exportAll({GtkAboutDialogStories:()=>$n,GtkAboutDialogStory:()=>Qn});const Zn={unknown:h.License.UNKNOWN,custom:h.License.CUSTOM,"gpl-3-0":h.License.GPL_3_0,"mit-x11":h.License.MIT_X11,"bsd-3":h.License.BSD_3,"apache-2-0":h.License.APACHE_2_0,"0bsd":h.License[`0BSD`]};var Qn=class GtkAboutDialogStory extends k{_button=null;static{S.registerClass({GTypeName:`AdwStorybookGtkAboutDialog`},GtkAboutDialogStory)}constructor(){super(k.fromMeta(GtkAboutDialogStory.getMetadata(),`Default`))}static getMetadata(){return{...Yn,component:h.AboutDialog.$gtype}}initialize(){this._button=new h.Button({label:`Show dialog`,halign:h.Align.CENTER,valign:h.Align.CENTER}),this._button.add_css_class(`pill`),this._button.add_css_class(`suggested-action`),this._button.connect(`clicked`,()=>this._present()),this.addContent(this._button)}_present(){let e=new h.AboutDialog({programName:this.args.programName,version:this.args.version,logoIconName:`application-x-executable-symbolic`,comments:`An arithmetic calculator for the GNOME desktop.`,website:`https://gitlab.gnome.org/World/gnome-calculator`,websiteLabel:`GNOME Calculator`,copyright:`© 2026 The GNOME Project`,systemInformation:`GTK 4.24.0
|
|
335
335
|
glibc 2.42
|
|
336
|
-
Built with meson 1.6`}),t=
|
|
337
|
-
Katherine Johnson`),e.add_credit_section(`Reviewed by`,[`Tony Hoare <tony@example.org>`])),e.present()}updateArgs(e){}};S.type_ensure(Xn.$gtype);const Zn={stories:[Xn]},Qn={title:`Feedback/Page Setup Dialog`,description:`Gtk.PageSetupUnixDialog — the page setup dialog Unix platforms have instead of a native one: a printer and a paper size, the chosen sheet's size and margins, and four orientation buttons.`,controls:[{name:`paperSize`,label:`Paper size`,type:i.SELECT,options:[{label:`US Letter`,value:`na_letter`},{label:`US Legal`,value:`na_legal`},{label:`A4`,value:`iso_a4`},{label:`A5`,value:`iso_a5`},{label:`B5`,value:`iso_b5`},{label:`A3`,value:`iso_a3`}],defaultValue:`iso_a4`},{name:`orientation`,label:`Orientation`,type:i.SELECT,options:[{label:`Portrait`,value:`portrait`},{label:`Landscape`,value:`landscape`},{label:`Reverse portrait`,value:`reverse-portrait`},{label:`Reverse landscape`,value:`reverse-landscape`}],defaultValue:`landscape`}]};var $n=__exportAll({PageSetupUnixDialogStories:()=>rr,PageSetupUnixDialogStory:()=>tr});const er={portrait:h.PageOrientation.PORTRAIT,landscape:h.PageOrientation.LANDSCAPE,"reverse-portrait":h.PageOrientation.REVERSE_PORTRAIT,"reverse-landscape":h.PageOrientation.REVERSE_LANDSCAPE};var tr=class PageSetupUnixDialogStory extends D{_button=null;static{S.registerClass({GTypeName:`AdwStorybookPageSetupUnixDialog`},PageSetupUnixDialogStory)}constructor(){super(D.fromMeta(PageSetupUnixDialogStory.getMetadata(),`Default`))}static getMetadata(){return{...Qn,component:h.PageSetupUnixDialog.$gtype}}initialize(){this._button=new h.Button({label:`Page Setup…`,halign:h.Align.CENTER,valign:h.Align.CENTER}),this._button.add_css_class(`pill`),this._button.add_css_class(`suggested-action`),this._button.connect(`clicked`,()=>this._present()),this.addContent(this._button)}_present(){let e=h.PageSetupUnixDialog.new(`Page Setup`,null),t=new h.PageSetup;t.set_paper_size_and_default_margins(h.PaperSize.new(this.args.paperSize)),t.set_orientation(er[this.args.orientation]??h.PageOrientation.PORTRAIT),e.set_page_setup(t),e.present()}updateArgs(e){}};const nr=`PageSetupUnixDialog`in h;nr&&S.type_ensure(tr.$gtype);const rr={stories:[tr].filter(()=>nr)},ir={title:`Feedback/Preferences Dialog`,description:`Adw.PreferencesDialog — a preferences window with a page, a group and a handful of boxed-list rows.`,controls:[{name:`pageTitle`,label:`Page title`,type:i.TEXT,defaultValue:`General`},{name:`groupTitle`,label:`Group title`,type:i.TEXT,defaultValue:`Appearance`}]};var ar=__exportAll({PreferencesDialogStories:()=>sr,PreferencesDialogStory:()=>or}),or=class PreferencesDialogStory extends D{_button=null;static{S.registerClass({GTypeName:`AdwStorybookPreferencesDialog`},PreferencesDialogStory)}constructor(){super(D.fromMeta(PreferencesDialogStory.getMetadata(),`Default`))}static getMetadata(){return{...ir,component:w.PreferencesDialog.$gtype}}initialize(){this._button=new h.Button({label:`Show dialog`,halign:h.Align.CENTER,valign:h.Align.CENTER}),this._button.add_css_class(`pill`),this._button.add_css_class(`suggested-action`),this._button.connect(`clicked`,()=>this._present()),this.addContent(this._button)}_present(){let e=new w.PreferencesDialog,t=new w.PreferencesPage({title:this.args.pageTitle,iconName:`preferences-system-symbolic`}),n=new w.PreferencesGroup({title:this.args.groupTitle,description:`Control how the application looks and behaves.`});n.add(new w.SwitchRow({title:`Dark style`,subtitle:`Use a dark colour scheme`,active:!0})),n.add(new w.ComboRow({title:`Accent colour`,model:new h.StringList({strings:[`Blue`,`Teal`,`Green`,`Orange`,`Purple`]}),selected:0})),n.add(new w.SpinRow({title:`Font size`,adjustment:new h.Adjustment({lower:8,upper:24,value:12,stepIncrement:1,pageIncrement:4})})),t.add(n),e.add(t),e.present(this)}updateArgs(e){}};S.type_ensure(or.$gtype);const sr={stories:[or]},cr={title:`Feedback/Print Dialog`,description:`Gtk.PrintUnixDialog — the Unix print dialog: seven notebook pages over a printer list, a Range and a Copies group on General, the sheet preview on Page Setup, and the Preview / Cancel / Print action area.`,controls:[{name:`capabilities`,label:`Capabilities`,type:i.TEXT,defaultValue:`copies|collate|reverse|scale|preview|page-set`},{name:`range`,label:`Range`,type:i.SELECT,options:[{label:`All Pages`,value:`all`},{label:`Current Page`,value:`current`},{label:`Selection`,value:`selection`},{label:`Pages`,value:`pages`}],defaultValue:`all`},{name:`copies`,label:`Copies`,type:i.NUMBER,defaultValue:2}]};var lr=__exportAll({PrintUnixDialogStories:()=>fr,PrintUnixDialogStory:()=>ur});const capabilities=()=>({collate:h.PrintCapabilities.COLLATE,copies:h.PrintCapabilities.COPIES,"generate-pdf":h.PrintCapabilities.GENERATE_PDF,"generate-ps":h.PrintCapabilities.GENERATE_PS,"number-up":h.PrintCapabilities.NUMBER_UP,"number-up-layout":h.PrintCapabilities.NUMBER_UP_LAYOUT,"page-set":h.PrintCapabilities.PAGE_SET,preview:h.PrintCapabilities.PREVIEW,reverse:h.PrintCapabilities.REVERSE,scale:h.PrintCapabilities.SCALE});var ur=class PrintUnixDialogStory extends D{_button=null;static{S.registerClass({GTypeName:`AdwStorybookPrintUnixDialog`},PrintUnixDialogStory)}constructor(){super(D.fromMeta(PrintUnixDialogStory.getMetadata(),`Default`))}static getMetadata(){return{...cr,component:h.PrintUnixDialog.$gtype}}initialize(){this._button=new h.Button({label:`Print…`,halign:h.Align.CENTER,valign:h.Align.CENTER}),this._button.add_css_class(`pill`),this._button.add_css_class(`suggested-action`),this._button.connect(`clicked`,()=>this._present()),this.addContent(this._button)}_present(){let e=h.PrintUnixDialog.new(`Print`,null),t=capabilities(),n=String(this.args.capabilities).split(`|`).map(e=>t[e.trim()]??0).reduce((e,t)=>e|t,0);e.set_manual_capabilities(n),e.set_current_page(2),e.set_support_selection(!0),e.set_has_selection(!0);let r=new h.PrintSettings;r.set_n_copies(Number(this.args.copies)),r.set_collate(this.args.range===`all`),r.set_print_pages(this.args.range===`current`?h.PrintPages.CURRENT:h.PrintPages.ALL),e.set_settings(r),e.present()}updateArgs(e){}};const dr=`PrintUnixDialog`in h;dr&&S.type_ensure(ur.$gtype);const fr={stories:[ur].filter(()=>dr)},pr={title:`Feedback/Shortcuts Dialog`,description:`Adw.ShortcutsDialog — the window that lists an application’s keyboard shortcuts, one titled section at a time.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Keyboard Shortcuts`}]};var mr=__exportAll({ShortcutsDialogStories:()=>gr,ShortcutsDialogStory:()=>hr}),hr=class ShortcutsDialogStory extends D{_button=null;static{S.registerClass({GTypeName:`AdwStorybookShortcutsDialog`},ShortcutsDialogStory)}constructor(){super(D.fromMeta(ShortcutsDialogStory.getMetadata(),`Default`))}static getMetadata(){return{...pr,component:w.ShortcutsDialog.$gtype}}initialize(){this._button=new h.Button({label:`Show dialog`,halign:h.Align.CENTER,valign:h.Align.CENTER}),this._button.add_css_class(`pill`),this._button.add_css_class(`suggested-action`),this._button.connect(`clicked`,()=>this._present()),this.addContent(this._button)}_present(){let e=new w.ShortcutsSection({title:`General`});e.add(new w.ShortcutsItem({title:`Open Menu`,accelerator:`F10`})),e.add(new w.ShortcutsItem({title:`Preferences`,action_name:`app.preferences`})),e.add(new w.ShortcutsItem({title:`Quit`,accelerator:`<Control>q`}));let t=new w.ShortcutsSection;t.add(new w.ShortcutsItem({title:`Move Tab Left`,accelerator:`<Shift><Control>Page_Up`,direction:h.TextDirection.LTR})),t.add(new w.ShortcutsItem({title:`Move Tab Left`,accelerator:`<Shift><Control>Page_Up`,direction:h.TextDirection.RTL}));let n=new w.ShortcutsDialog({title:this.args.title});n.add(e),n.add(t),n.present(this)}updateArgs(e){}};S.type_ensure(hr.$gtype);const gr={stories:[hr]},_r={title:`Feedback/Toast`,description:`Adw.Toast — a transient notification, with an optional action button, shown over an Adw.ToastOverlay.`,controls:[{name:`title`,label:`Toast text`,type:i.TEXT,defaultValue:`File moved to Trash`},{name:`timeout`,label:`Timeout (s)`,type:i.NUMBER,min:0,max:10,step:1,defaultValue:3},{name:`hasButton`,label:`Action button`,type:i.BOOLEAN,defaultValue:!0},{name:`buttonLabel`,label:`Button label`,type:i.TEXT,defaultValue:`Undo`}]};var vr=__exportAll({ToastStories:()=>br,ToastStory:()=>yr}),yr=class ToastStory extends D{_overlay=null;static{S.registerClass({GTypeName:`AdwStorybookToast`},ToastStory)}constructor(){super(D.fromMeta(ToastStory.getMetadata(),`Default`))}static getMetadata(){return{..._r,component:w.Toast.$gtype}}initialize(){let e=new h.Button({label:`Show toast`,halign:h.Align.CENTER,valign:h.Align.CENTER});e.add_css_class(`pill`),e.add_css_class(`suggested-action`),e.connect(`clicked`,()=>this._showToast()),this._overlay=new w.ToastOverlay({child:e,widthRequest:360,heightRequest:220}),this.addContent(this._overlay)}_showToast(){if(!this._overlay)return;let e=new w.Toast({title:this.args.title,timeout:this.args.timeout});this.args.hasButton&&(e.buttonLabel=this.args.buttonLabel),this._overlay.add_toast(e)}updateArgs(e){}};S.type_ensure(yr.$gtype);const br={stories:[yr]},xr={title:`Layout/Application Window`,description:`Adw.ApplicationWindow — an Adw.Window that belongs to a GtkApplication, plus that application’s menubar.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Text Editor`},{name:`subtitle`,label:`Subtitle`,type:i.TEXT,defaultValue:`notes.md`},{name:`showMenubar`,label:`Show menubar`,type:i.BOOLEAN,defaultValue:!0}]};var Sr=__exportAll({ApplicationWindowStories:()=>wr,ApplicationWindowStory:()=>Cr}),Cr=class ApplicationWindowStory extends D{_window=null;_title=null;_toolbarView=null;_menubar=null;static{S.registerClass({GTypeName:`AdwStorybookApplicationWindow`},ApplicationWindowStory)}constructor(){super(D.fromMeta(ApplicationWindowStory.getMetadata(),`Default`))}static getMetadata(){return{...xr,component:w.ApplicationWindow.$gtype}}initialize(){this._title=new w.WindowTitle({title:this.args.title,subtitle:this.args.subtitle});let e=new w.HeaderBar({titleWidget:this._title,widthRequest:460}),t=new h.Button({iconName:`go-previous-symbolic`});t.add_css_class(`flat`),e.pack_start(t),this._toolbarView=new w.ToolbarView,this._toolbarView.add_top_bar(e),this._toolbarView.content=new w.StatusPage({title:`Your Library`,description:`Content sits between the toolbars and scrolls independently of them.`});let n=new x.Menu,r=new x.Menu;r.append(`New Window`,`app.new-window`),r.append(`Quit`,`app.quit`),n.append_section(null,r);let i=new x.Menu;i.append(`Keyboard Shortcuts`,`app.shortcuts`),i.append(`About`,`app.about`),n.append_section(null,i),this._menubar=new h.PopoverMenuBar({menu_model:n}),this.args.showMenubar&&this._toolbarView.add_top_bar(this._menubar),this._window=new w.ApplicationWindow({content:this._toolbarView,show_menubar:this.args.showMenubar}),this._window.set_default_size(460,260),this.addContent(this._window)}updateArgs(e){if(!this._title||!this._window||!this._toolbarView||!this._menubar)return;this._title.title=this.args.title,this._title.subtitle=this.args.subtitle,this._window.show_menubar=this.args.showMenubar;let t=this.args.showMenubar;t&&this._menubar.get_parent()===null&&this._toolbarView.add_top_bar(this._menubar),!t&&this._menubar.get_parent()!==null&&this._toolbarView.remove(this._menubar)}};S.type_ensure(Cr.$gtype);const wr={stories:[Cr]},Tr={title:`Layout/Aspect Frame`,description:`Gtk.AspectFrame — one child, given a width/height ratio and a place in the space left over. obey-child is TRUE by default and takes the ratio from the child itself, so the story starts with it FALSE or the ratio control would be inert.`,controls:[{name:`ratio`,label:`Ratio`,type:i.RANGE,min:.5,max:3,step:.25,defaultValue:2},{name:`xalign`,label:`Xalign`,type:i.RANGE,min:0,max:1,step:.5,defaultValue:.5},{name:`yalign`,label:`Yalign`,type:i.RANGE,min:0,max:1,step:.5,defaultValue:.5},{name:`obeyChild`,label:`Obey child`,type:i.BOOLEAN,defaultValue:!1}]};var Er=__exportAll({AspectFrameStories:()=>Or,AspectFrameStory:()=>Dr}),Dr=class AspectFrameStory extends D{_frame=null;static{S.registerClass({GTypeName:`AdwStorybookAspectFrame`},AspectFrameStory)}constructor(){super(D.fromMeta(AspectFrameStory.getMetadata(),`Default`))}static getMetadata(){return{...Tr,component:h.AspectFrame.$gtype}}initialize(){this._frame=new h.AspectFrame({hexpand:!0,valign:h.Align.CENTER,width_request:320,height_request:180});let e=new h.Label({label:`The frame gives this child the ratio above, and puts it where xalign and yalign say.`});e.set_margin_top(12),e.set_margin_bottom(12),e.set_margin_start(12),e.set_margin_end(12),e.set_vexpand(!0),this._frame.set_child(e),this._apply(),this.addContent(this._frame)}updateArgs(e){this._apply()}_apply(){this._frame&&(this._frame.ratio=this.args.ratio,this._frame.xalign=this.args.xalign,this._frame.yalign=this.args.yalign,this._frame.obeyChild=this.args.obeyChild)}};S.type_ensure(Dr.$gtype);const Or={stories:[Dr]},kr={title:`Layout/Bin`,description:`Adw.Bin — a widget with exactly one child. It draws nothing of its own and gives the child its whole allocation; setting a new child replaces the old one.`,controls:[{name:`label`,label:`Child label`,type:i.TEXT,defaultValue:`The one child of this bin.`},{name:`swap`,label:`Replace the child`,type:i.BOOLEAN,defaultValue:!1}]};var Ar=__exportAll({BinStories:()=>Mr,BinStory:()=>jr}),jr=class BinStory extends D{_bin=null;static{S.registerClass({GTypeName:`AdwStorybookBin`},BinStory)}constructor(){super(D.fromMeta(BinStory.getMetadata(),`Default`))}static getMetadata(){return{...kr,component:w.Bin.$gtype}}initialize(){this._bin=new w.Bin({widthRequest:320}),this._apply(),this.addContent(this._bin)}updateArgs(e){this._apply()}_apply(){if(!this._bin)return;let e=this.args.swap,t=new h.Label({label:e?`The first child was replaced, not stacked.`:this.args.label,wrap:!0,marginTop:18,marginBottom:18,marginStart:18,marginEnd:18}),n=new h.Box;n.add_css_class(`card`),n.append(t),this._bin.child=n}};S.type_ensure(jr.$gtype);const Mr={stories:[jr]},Nr={title:`Layout/Breakpoint Bin`,description:`Adw.BreakpointBin gives breakpoints a home without a window: its one child rearranges itself at a size threshold, and the bin applies the LAST breakpoint whose condition holds. Resize the stage to see it.`,controls:[{name:`condition`,label:`Condition`,type:i.SELECT,options:[{label:`max-width: 480px`,value:`max-width: 480px`},{label:`max-width: 320px`,value:`max-width: 320px`},{label:`max-height: 200px`,value:`max-height: 200px`}],defaultValue:`max-width: 480px`},{name:`narrowLabel`,label:`Narrow label`,type:i.TEXT,defaultValue:`Narrow`},{name:`wideLabel`,label:`Wide label`,type:i.TEXT,defaultValue:`Wide`}]};var Pr=__exportAll({BreakpointBinStories:()=>Ir,BreakpointBinStory:()=>Fr}),Fr=class BreakpointBinStory extends D{_bin=null;_label=null;_breakpoint=null;static{S.registerClass({GTypeName:`AdwStorybookBreakpointBin`},BreakpointBinStory)}constructor(){super(D.fromMeta(BreakpointBinStory.getMetadata(),`Default`))}static getMetadata(){return{...Nr,component:w.BreakpointBin.$gtype}}initialize(){this._label=new h.Label({label:this.args.wideLabel,ellipsize:3}),this._label.add_css_class(`title-1`),this._bin=new w.BreakpointBin,this._bin.set_size_request(150,60),this._bin.set_child(this._label),this._apply(),this.addContent(this._bin)}updateArgs(e){this._apply()}_apply(){if(!this._bin||!this._label)return;let e=w.BreakpointCondition.parse(this.args.condition);e!==null&&(this._breakpoint!==null&&this._bin.remove_breakpoint(this._breakpoint),this._breakpoint=w.Breakpoint.new(e),this._breakpoint.add_setter(this._label,`label`,this.args.narrowLabel),this._bin.add_breakpoint(this._breakpoint),this._label.label=this.args.wideLabel)}};S.type_ensure(Fr.$gtype);const Ir={stories:[Fr]},Lr={title:`Layout/Center Box`,description:`Gtk.CenterBox — three widgets, pinned to the start, the centre and the end, with the space between them going to whichever child can grow. shrink-center-last decides who gives up space first.`,controls:[{name:`shrinkCenterLast`,label:`Shrink center last`,type:i.BOOLEAN,defaultValue:!0},{name:`baselinePosition`,label:`Baseline position`,type:i.SELECT,options:[{label:`Top`,value:`top`},{label:`Center`,value:`center`},{label:`Bottom`,value:`bottom`}],defaultValue:`center`}]};var Rr=__exportAll({CenterBoxStories:()=>Vr,CenterBoxStory:()=>Br});const zr={top:h.BaselinePosition.TOP,center:h.BaselinePosition.CENTER,bottom:h.BaselinePosition.BOTTOM};var Br=class CenterBoxStory extends D{_box=null;static{S.registerClass({GTypeName:`AdwStorybookCenterBox`},CenterBoxStory)}constructor(){super(D.fromMeta(CenterBoxStory.getMetadata(),`Default`))}static getMetadata(){return{...Lr,component:h.CenterBox.$gtype}}initialize(){this._box=new h.CenterBox({margin_top:12,margin_bottom:12,margin_start:12,margin_end:12}),this._box.set_start_widget(new h.Label({label:`Start`,hexpand:!1})),this._box.set_center_widget(new h.Label({label:`Centre`,hexpand:!0})),this._box.set_end_widget(new h.Label({label:`End`,hexpand:!1})),this._apply(),this.addContent(this._box)}updateArgs(e){this._apply()}_apply(){this._box&&(this._box.shrinkCenterLast=this.args.shrinkCenterLast,this._box.baselinePosition=zr[this.args.baselinePosition])}};S.type_ensure(Br.$gtype);const Vr={stories:[Br]},Hr={title:`Layout/Clamp Scrollable`,description:`Adw.ClampScrollable — a clamp whose child scrolls. The scrollbar stays at the edge of the window while the content is held at a maximum width.`,controls:[{name:`maximumSize`,label:`Maximum size`,type:i.RANGE,min:200,max:600,step:10,defaultValue:400},{name:`tighteningThreshold`,label:`Tightening threshold`,type:i.RANGE,min:100,max:600,step:10,defaultValue:300}]};var Ur=__exportAll({ClampScrollableStories:()=>Kr,ClampScrollableStory:()=>Gr});const Wr=Array.from({length:24},(e,t)=>`Line ${t+1}: held at the clamp's width while it scrolls.`);var Gr=class ClampScrollableStory extends D{_clamp=null;static{S.registerClass({GTypeName:`AdwStorybookClampScrollable`},ClampScrollableStory)}constructor(){super(D.fromMeta(ClampScrollableStory.getMetadata(),`Default`))}static getMetadata(){return{...Hr,component:w.ClampScrollable.$gtype}}initialize(){let e=new h.TextView({editable:!1,cursorVisible:!1,topMargin:12,bottomMargin:12});e.buffer.set_text(Wr.join(`
|
|
338
|
-
`),-1),this._clamp=new w.ClampScrollable({maximumSize:this.args.maximumSize,tighteningThreshold:this.args.tighteningThreshold,child:e});let t=new h.ScrolledWindow({child:this._clamp,widthRequest:640,heightRequest:240});this.addContent(t)}updateArgs(e){this._clamp&&(this._clamp.maximumSize=this.args.maximumSize,this._clamp.tighteningThreshold=this.args.tighteningThreshold)}};S.type_ensure(Gr.$gtype);const Kr={stories:[Gr]},qr={title:`Layout/Clamp`,description:`Adw.Clamp limits its child to a maximum width and centres it, tightening the layout as space shrinks.`,controls:[{name:`maximumSize`,label:`Maximum size`,type:i.RANGE,min:200,max:600,step:10,defaultValue:400},{name:`tighteningThreshold`,label:`Tightening threshold`,type:i.RANGE,min:100,max:600,step:10,defaultValue:300}]};var Jr=__exportAll({ClampStories:()=>Xr,ClampStory:()=>Yr}),Yr=class ClampStory extends D{_clamp=null;static{S.registerClass({GTypeName:`AdwStorybookClamp`},ClampStory)}constructor(){super(D.fromMeta(ClampStory.getMetadata(),`Default`))}static getMetadata(){return{...qr,component:w.Clamp.$gtype}}initialize(){let e=new h.Box({orientation:h.Orientation.HORIZONTAL,widthRequest:520});e.add_css_class(`card`);let t=new h.Label({label:`This content is clamped — it stops growing past the maximum size and stays centred.`,wrap:!0,xalign:0,hexpand:!0,marginTop:18,marginBottom:18,marginStart:18,marginEnd:18});e.append(t),this._clamp=new w.Clamp({maximumSize:this.args.maximumSize,tighteningThreshold:this.args.tighteningThreshold,child:e}),this.addContent(this._clamp)}updateArgs(e){this._clamp&&(this._clamp.maximumSize=this.args.maximumSize,this._clamp.tighteningThreshold=this.args.tighteningThreshold)}};S.type_ensure(Yr.$gtype);const Xr={stories:[Yr]},Zr={title:`Layout/Expander`,description:"Gtk.Expander — a title the user clicks to reveal the child below it. The arrow is its own CSS node and `:checked` is set on THAT node, not on the widget, which is what libadwaita's _expanders.scss keys the glyph swap on. `use-underline` marks a mnemonic with `_`, and Alt+that character activates the expander.",controls:[{name:`expanded`,label:`Expanded`,type:i.BOOLEAN,defaultValue:!1},{name:`useUnderline`,label:`Label marks a mnemonic`,type:i.BOOLEAN,defaultValue:!1},{name:`label`,label:`Label`,type:i.TEXT,defaultValue:`_More options`},{name:`resizeToplevel`,label:`Resize the toplevel`,type:i.BOOLEAN,defaultValue:!1}]};var Qr=__exportAll({ExpanderStories:()=>ei,ExpanderStory:()=>$r}),$r=class ExpanderStory extends D{_expander=null;static{S.registerClass({GTypeName:`AdwStorybookExpander`},ExpanderStory)}constructor(){super(D.fromMeta(ExpanderStory.getMetadata(),`Default`))}static getMetadata(){return{...Zr,component:h.Expander.$gtype}}initialize(){let e=new h.Box({orientation:h.Orientation.VERTICAL,spacing:6,margin_top:12,margin_bottom:12,margin_start:12,margin_end:12});for(let t of[`Notifications`,`Sound`,`Network`])e.append(new h.Label({label:t}));this._expander=new h.Expander,this._expander.set_child(e),this._apply(),this.addContent(this._expander)}updateArgs(e){this._apply()}_apply(){this._expander&&(this._expander.use_underline=this.args.useUnderline,this._expander.label=String(this.args.label),this._expander.resize_toplevel=this.args.resizeToplevel,this._expander.expanded=this.args.expanded)}};S.type_ensure($r.$gtype);const ei={stories:[$r]},ti={title:`Layout/Fixed`,description:`Gtk.Fixed — children at pixel positions, which is the whole of its API: it declares no property of its own. The two offsets are the arguments of gtk_fixed_put().`,controls:[{name:`offsetX`,label:`Offset x`,type:i.RANGE,min:0,max:80,step:4,defaultValue:24},{name:`offsetY`,label:`Offset y`,type:i.RANGE,min:0,max:80,step:4,defaultValue:16}]};var ni=__exportAll({FixedStories:()=>ii,FixedStory:()=>ri}),ri=class FixedStory extends D{_fixed=null;_first=null;_second=null;static{S.registerClass({GTypeName:`AdwStorybookFixed`},FixedStory)}constructor(){super(D.fromMeta(FixedStory.getMetadata(),`Default`))}static getMetadata(){return{...ti,component:h.Fixed.$gtype}}initialize(){this._fixed=new h.Fixed,this._first=new h.Label({label:`at (x, y)`}),this._second=new h.Label({label:`at (x + 96, y + 40)`}),this._fixed.put(this._first,0,0),this._fixed.put(this._second,0,0),this._apply(),this.addContent(this._fixed)}updateArgs(e){this._apply()}_apply(){if(!this._fixed||!this._first||!this._second)return;let e=this.args.offsetX,t=this.args.offsetY;this._fixed.move(this._first,e,t),this._fixed.move(this._second,e+96,t+40)}};S.type_ensure(ri.$gtype);const ii={stories:[ri]},ai={title:`Layout/Frame`,description:`Gtk.Frame — a 1px border with a label embedded in its top edge. GTK draws the label as its own widget above the child, and label-xalign says where across the frame it sits.`,controls:[{name:`label`,label:`Label`,type:i.TEXT,defaultValue:`Details`},{name:`labelXalign`,label:`Label xalign`,type:i.RANGE,defaultValue:0,min:0,max:1,step:.5}]};var oi=__exportAll({FrameStories:()=>ci,FrameStory:()=>si}),si=class FrameStory extends D{_frame=null;static{S.registerClass({GTypeName:`AdwStorybookFrame`},FrameStory)}constructor(){super(D.fromMeta(FrameStory.getMetadata(),`Default`))}static getMetadata(){return{...ai,component:h.Frame.$gtype}}initialize(){this._frame=new h.Frame({halign:h.Align.CENTER});let e=new h.Label({label:`A framed region: the label sits in the top edge of the border.`});e.set_margin_top(12),e.set_margin_bottom(12),e.set_margin_start(12),e.set_margin_end(12),this._frame.set_child(e),this._apply(),this.addContent(this._frame)}updateArgs(e){this._apply()}_apply(){this._frame&&(this._frame.label=this.args.label,this._frame.set_label_align(this.args.labelXalign))}};S.type_ensure(si.$gtype);const ci={stories:[si]},li={title:`Layout/Grid`,description:`Gtk.Grid — a table of cells sized by what is in them, filled row by row. The two spacings are the gap between lines, the two homogeneous flags make every line the same, and a vertical grid attaches down the rows instead of across the columns.`,controls:[{name:`columnSpacing`,label:`Column spacing`,type:i.RANGE,min:0,max:36,step:2,defaultValue:12},{name:`rowSpacing`,label:`Row spacing`,type:i.RANGE,min:0,max:36,step:2,defaultValue:12},{name:`columnHomogeneous`,label:`Column homogeneous`,type:i.BOOLEAN,defaultValue:!1},{name:`rowHomogeneous`,label:`Row homogeneous`,type:i.BOOLEAN,defaultValue:!1},{name:`orientation`,label:`Orientation`,type:i.SELECT,options:[{label:`Horizontal`,value:`horizontal`},{label:`Vertical`,value:`vertical`}],defaultValue:`horizontal`}]};var ui=__exportAll({GridStories:()=>fi,GridStory:()=>di}),di=class GridStory extends D{_grid=null;_cells=[];_orientation=null;static{S.registerClass({GTypeName:`AdwStorybookGrid`},GridStory)}constructor(){super(D.fromMeta(GridStory.getMetadata(),`Default`))}static getMetadata(){return{...li,component:h.Grid.$gtype}}initialize(){this._grid=new h.Grid({hexpand:!0,margin_top:12,margin_bottom:12,margin_start:12,margin_end:12});for(let e of[`Name`,`Value`,`Unit`,`editable`]){let t=new h.Label({label:e,hexpand:!0});t.set_margin_top(6),t.set_margin_bottom(6),t.set_margin_start(6),t.set_margin_end(6),this._cells.push(t)}this._attach(),this._apply(),this.addContent(this._grid)}updateArgs(e){this._apply()}_attach(){if(this._grid)for(let e of this._cells)this._grid.attach(e,-1,-1,1,1)}_apply(){if(!this._grid)return;let e=this.args.orientation===`vertical`?h.Orientation.VERTICAL:h.Orientation.HORIZONTAL;if(this._grid.columnSpacing=this.args.columnSpacing,this._grid.rowSpacing=this.args.rowSpacing,this._grid.columnHomogeneous=this.args.columnHomogeneous,this._grid.rowHomogeneous=this.args.rowHomogeneous,this._orientation!==null&&this._orientation!==e){for(let e of this._cells)this._grid.remove(e);this._attach()}this._grid.orientation=e,this._orientation=e}};S.type_ensure(di.$gtype);const fi={stories:[di]},pi={title:`Layout/Header Bar`,description:`Adw.HeaderBar hosts a custom title widget with start and end controls — the standard top chrome of an Adwaita window.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Text Editor`},{name:`subtitle`,label:`Subtitle`,type:i.TEXT,defaultValue:`notes.md`},{name:`showTitle`,label:`Show title`,type:i.BOOLEAN,defaultValue:!0}]};var mi=__exportAll({HeaderBarStories:()=>gi,HeaderBarStory:()=>hi}),hi=class HeaderBarStory extends D{_headerBar=null;_title=null;static{S.registerClass({GTypeName:`AdwStorybookHeaderBar`},HeaderBarStory)}constructor(){super(D.fromMeta(HeaderBarStory.getMetadata(),`Default`))}static getMetadata(){return{...pi,component:w.HeaderBar.$gtype}}initialize(){this._title=new w.WindowTitle({title:this.args.title,subtitle:this.args.subtitle}),this._headerBar=new w.HeaderBar({titleWidget:this._title,showTitle:this.args.showTitle,widthRequest:460});let e=new h.Button({iconName:`go-previous-symbolic`});e.add_css_class(`flat`),this._headerBar.pack_start(e);let t=new x.Menu;t.append(`New Window`,`app.new-window`),t.append(`Preferences`,`app.preferences`),t.append(`About`,`app.about`);let n=new h.MenuButton({iconName:`open-menu-symbolic`,menuModel:t});n.add_css_class(`flat`),this._headerBar.pack_end(n),this.addContent(this._headerBar)}updateArgs(e){!this._headerBar||!this._title||(this._title.title=this.args.title,this._title.subtitle=this.args.subtitle,this._headerBar.showTitle=this.args.showTitle)}};S.type_ensure(hi.$gtype);const gi={stories:[hi]},_i={title:`Layout/Layout Slot`,description:`Adw.LayoutSlot is the named hole a layout of an Adw.MultiLayoutView leaves for a child: it takes the child whose id matches, and its visible property follows that child's. On its own it is a bin, which is what this story shows.`,controls:[{name:`label`,label:`Child title`,type:i.TEXT,defaultValue:`Inbox`},{name:`visible`,label:`Child visible`,type:i.BOOLEAN,defaultValue:!0}]};var vi=__exportAll({LayoutSlotStories:()=>bi,LayoutSlotStory:()=>yi}),yi=class LayoutSlotStory extends D{_view=null;_slot=null;_child=null;static{S.registerClass({GTypeName:`AdwStorybookLayoutSlot`},LayoutSlotStory)}constructor(){super(D.fromMeta(LayoutSlotStory.getMetadata(),`Default`))}static getMetadata(){return{..._i,component:w.LayoutSlot.$gtype}}initialize(){this._slot=w.LayoutSlot.new(`primary`),this._child=new w.NavigationPage({title:this.args.label,tag:`primary`,child:new h.Label({label:`The child the view inserted here.`})}),this._view=new w.MultiLayoutView;let e=w.Layout.new(this._slot);e.name=`only`,this._view.add_layout(e),this._view.set_child(`primary`,this._child),this._apply(),this.addContent(this._view)}updateArgs(e){this._apply()}_apply(){this._child&&(this._child.title=this.args.label,this._child.visible=this.args.visible)}};S.type_ensure(yi.$gtype);const bi={stories:[yi]},xi={title:`Layout/Multi Layout View`,description:`Adw.MultiLayoutView holds one set of children and several arrangements of them: each child has an id, each layout has slots with ids, and switching layouts re-inserts every child into the slot of the SAME id.`,controls:[{name:`layoutName`,label:`Layout`,type:i.SELECT,options:[{label:`wide (split)`,value:`wide`},{label:`narrow (stacked)`,value:`narrow`}],defaultValue:`wide`},{name:`showDetails`,label:`Show the details pane`,type:i.BOOLEAN,defaultValue:!0}]};var Si=__exportAll({MultiLayoutViewStories:()=>Ei,MultiLayoutViewStory:()=>Ti});const Ci=`primary`,wi=`secondary`;function page(e){let t=new h.ListBox({selectionMode:h.SelectionMode.NONE});for(let[n,r]of e)t.append(new w.ActionRow({title:n,subtitle:r}));return t}function slotPage(e){return new w.NavigationPage({title:e,child:w.LayoutSlot.new(e),tag:e})}function arrangement(e){let t=new w.NavigationSplitView({collapsed:e,minSidebarWidth:160});return t.sidebar=slotPage(wi),t.content=slotPage(Ci),t.set_size_request(420,220),t}var Ti=class MultiLayoutViewStory extends D{_view=null;_details=null;static{S.registerClass({GTypeName:`AdwStorybookMultiLayoutView`},MultiLayoutViewStory)}constructor(){super(D.fromMeta(MultiLayoutViewStory.getMetadata(),`Default`))}static getMetadata(){return{...xi,component:w.MultiLayoutView.$gtype}}initialize(){this._details=page([[`From`,`Adwaita List`],[`Subject`,`Resizing the window`]]),this._view=new w.MultiLayoutView;let e=w.Layout.new(arrangement(!1));e.name=`wide`,this._view.add_layout(e);let t=w.Layout.new(arrangement(!0));t.name=`narrow`,this._view.add_layout(t),this._view.set_child(Ci,page([[`General`,`12 unread`],[`Starred`,`3 threads`]])),this._view.set_child(wi,this._details),this._apply(),this.addContent(this._view)}updateArgs(e){this._apply()}_apply(){!this._view||!this._details||(this._details.visible=this.args.showDetails,this._view.layout_name=this.args.layoutName)}};S.type_ensure(Ti.$gtype);const Ei={stories:[Ti]},Di={title:`Layout/Overlay`,description:`Gtk.Overlay — widgets stacked on top of one main child. The main child sizes the overlay; every other child is placed by its own halign/valign, which is what gtk_overlay_get_child_position reads and nothing else. Libadwaita ships no Adw.Overlay and gives the node no rule of its own — the .left/.right/.top/.bottom classes it puts on an edge-aligned child are the whole published contract.`,controls:[{name:`halign`,label:`Overlay halign`,type:i.SELECT,options:[{label:`Fill (the default)`,value:`fill`},{label:`Start`,value:`start`},{label:`Center`,value:`center`},{label:`End`,value:`end`}],defaultValue:`end`},{name:`valign`,label:`Overlay valign`,type:i.SELECT,options:[{label:`Fill (the default)`,value:`fill`},{label:`Start`,value:`start`},{label:`Center`,value:`center`},{label:`End`,value:`end`}],defaultValue:`end`},{name:`showLabel`,label:`Label the overlay`,type:i.BOOLEAN,defaultValue:!0}]};var Oi=__exportAll({OverlayStories:()=>ji,OverlayStory:()=>Ai});const ki={start:h.Align.START,center:h.Align.CENTER,end:h.Align.END};var Ai=class OverlayStory extends D{_overlay=null;_main=null;_badge=null;static{S.registerClass({GTypeName:`AdwStorybookOverlay`},OverlayStory)}constructor(){super(D.fromMeta(OverlayStory.getMetadata(),`Default`))}static getMetadata(){return{...Di,component:h.Overlay.$gtype}}initialize(){this._main=new h.Frame({width_request:260,height_request:160,margin_top:12,margin_bottom:12});let e=new h.Label({label:`Main child — its size is the overlay`});e.add_css_class(`dim-label`),this._main.set_child(e),this._badge=new h.Box({valign:h.Align.END,halign:h.Align.END}),this._badge.set_css_classes([`osd`,`flat`]),this._badge.append(new h.Label({label:`2`})),this._overlay=new h.Overlay,this._overlay.set_child(this._main),this._overlay.add_overlay(this._badge),this._apply(),this.addContent(this._overlay)}updateArgs(e){this._apply()}_apply(){if(!this._badge)return;let e=ki[String(this.args.halign)],t=ki[String(this.args.valign)];e===void 0?this._badge.halign=h.Align.FILL:this._badge.halign=e,t===void 0?this._badge.valign=h.Align.FILL:this._badge.valign=t,this._badge.visible=this.args.showLabel}};S.type_ensure(Ai.$gtype);const ji={stories:[Ai]},Mi={title:`Layout/Paned`,description:"Gtk.Paned — two children either side of a divider the user drags. With both children resizable and no position set, GTK divides the paned in PROPORTION TO THE TWO SIZE REQUESTS rather than in half, and it draws the divider as the `separator` node a GtkPanedHandle carries. Libadwaita styles that node in _paned.scss: 1px, 5px when `wide-handle`, with the rule as an inset shadow rather than a fill.",controls:[{name:`orientation`,label:`Orientation`,type:i.SELECT,options:[{label:`Horizontal`,value:`horizontal`},{label:`Vertical`,value:`vertical`}],defaultValue:`horizontal`},{name:`wideHandle`,label:`Wide handle`,type:i.BOOLEAN,defaultValue:!1},{name:`resizeStartChild`,label:`Resize the first child`,type:i.BOOLEAN,defaultValue:!0},{name:`resizeEndChild`,label:`Resize the second child`,type:i.BOOLEAN,defaultValue:!0},{name:`shrinkStartChild`,label:`The first child may shrink`,type:i.BOOLEAN,defaultValue:!0},{name:`position`,label:`Position (0 = derive)`,type:i.NUMBER,min:-1,max:400,step:1,defaultValue:-1}]};var Ni=__exportAll({PanedStories:()=>Fi,PanedStory:()=>Pi});function pane(e,t){let n=new h.Box({orientation:h.Orientation.VERTICAL,spacing:4,margin_top:12,margin_bottom:12,margin_start:12,margin_end:12});n.append(new h.Label({label:e}));let r=new h.Label({label:`${t}px of size request`});return r.add_css_class(`dim-label`),n.append(r),n}var Pi=class PanedStory extends D{_paned=null;static{S.registerClass({GTypeName:`AdwStorybookPaned`},PanedStory)}constructor(){super(D.fromMeta(PanedStory.getMetadata(),`Default`))}static getMetadata(){return{...Mi,component:h.Paned.$gtype}}initialize(){this._paned=new h.Paned({orientation:h.Orientation.HORIZONTAL}),this._paned.set_start_child(pane(`First child`,100)),this._paned.set_end_child(pane(`Second child`,300)),this._paned.set_size_request(400,140),this._apply(),this.addContent(this._paned)}updateArgs(e){this._apply()}_apply(){this._paned&&(this._paned.orientation=this.args.orientation===`vertical`?h.Orientation.VERTICAL:h.Orientation.HORIZONTAL,this._paned.wide_handle=this.args.wideHandle,this._paned.resize_start_child=this.args.resizeStartChild,this._paned.resize_end_child=this.args.resizeEndChild,this._paned.shrink_start_child=this.args.shrinkStartChild,this._paned.position=Number(this.args.position))}};S.type_ensure(Pi.$gtype);const Fi={stories:[Pi]},Ii=[{label:`Cut`},{label:`Copy`},{label:`Paste`},{label:`Delete`,accel:`<Shift>Delete`}],Li={title:`Layout/Popover Bin`,description:'Gtk.PopoverBin — GTK 4.22’s one-child container with a popover, for the place where "any part of this window can offer a menu" is the answer. `menu-model` builds the popover for you, and `handle-input` is what turns a right click or a long press into a popup — a plain click still reaches the child.',controls:[{name:`handleInput`,label:`Right click / long press opens`,type:i.BOOLEAN,defaultValue:!0}]};var Ri=__exportAll({PopoverBinStories:()=>Bi,PopoverBinStory:()=>zi}),zi=class PopoverBinStory extends D{_bin=null;_list=null;static{S.registerClass({GTypeName:`AdwStorybookPopoverBin`},PopoverBinStory)}constructor(){super(D.fromMeta(PopoverBinStory.getMetadata(),`Default`))}static getMetadata(){return{...Li,component:h.PopoverBin.$gtype}}initialize(){this._list=new h.ListBox({selectionMode:h.SelectionMode.SINGLE});for(let e of[`Documents`,`Downloads`,`Pictures`])this._list.append(new h.ListBoxRow({child:new h.Label({label:e})}));this._bin=new h.PopoverBin({child:this._list}),this._apply(),this.addContent(this._bin)}updateArgs(e){this._apply()}_buildMenu(){let e=new x.Menu;for(let t of Ii)e.append(t.label,`app.${t.label.toLowerCase().replace(/[^a-z0-9]+/g,`-`)}`);return e}_apply(){this._bin&&(this._bin.menuModel=this._buildMenu(),this._bin.handleInput=this.args.handleInput)}};S.type_ensure(zi.$gtype);const Bi={stories:[zi]},Vi=[{label:`New Window`,accel:`<Control>N`},{section:[{label:`Cut`},{label:`Copy`},{label:`Paste`}],label:`Edit`},{label:`Open With`,submenu:[{label:`Text Editor`},{label:`Web Browser`},{label:`Terminal`}]}],Hi={title:`Layout/Popover Menu`,description:"Gtk.PopoverMenu — a Gtk.Popover whose contents are a menu model instead of a child widget. A submenu swaps the page of the ONE surface rather than opening a second popup beside it, which is why the open page is a named one (`visible-submenu`).",controls:[{name:`menuTitle`,label:`Heading`,type:i.TEXT,defaultValue:`Document`},{name:`position`,label:`Position`,type:i.SELECT,options:[{label:`Bottom`,value:`bottom`},{label:`Top`,value:`top`},{label:`Start`,value:`start`},{label:`End`,value:`end`}],defaultValue:`bottom`},{name:`align`,label:`Align`,type:i.SELECT,options:[{label:`Start`,value:`start`},{label:`End`,value:`end`}],defaultValue:`start`},{name:`autohide`,label:`Dismiss on outside click`,type:i.BOOLEAN,defaultValue:!0}]};var Ui=__exportAll({PopoverMenuStories:()=>Gi,PopoverMenuStory:()=>Wi});const actionOf=e=>`app.${e.toLowerCase().replace(/[^a-z0-9]+/g,`-`)}`;var Wi=class PopoverMenuStory extends D{_anchor=null;_popover=null;static{S.registerClass({GTypeName:`AdwStorybookPopoverMenu`},PopoverMenuStory)}constructor(){super(D.fromMeta(PopoverMenuStory.getMetadata(),`Default`))}static getMetadata(){return{...Hi,component:h.PopoverMenu.$gtype}}initialize(){this._anchor=new h.Button({label:`Open menu`,halign:h.Align.CENTER}),this._apply(),this.addContent(this._anchor)}updateArgs(e){this._apply()}_buildMenu(e){let t=new x.Menu,n=[];for(let e of Vi){if(`submenu`in e){let n=new x.Menu;for(let t of e.submenu)n.append(t.label,actionOf(t.label));t.append_submenu(e.label,n);continue}if(`section`in e){let n=new x.Menu;for(let t of e.section)n.append(t.label,actionOf(t.label));t.append_section(`Edit`,n);continue}n.push(e.label)}if(e.length>0){let r=new x.Menu;for(let e of n)r.append(e,actionOf(e));t.append_section(e,r)}else for(let e of n)t.append(e,actionOf(e));return t}_apply(){if(!this._anchor)return;let e=this._popover;this._popover=h.PopoverMenu.new_from_model(this._buildMenu(this.args.menuTitle)),this._popover.set_parent(this._anchor),e?.unparent();let t={bottom:h.PositionType.BOTTOM,top:h.PositionType.TOP,start:h.PositionType.LEFT,end:h.PositionType.RIGHT};this._popover.position=t[this.args.position]??h.PositionType.BOTTOM,this._anchor&&(this._anchor.halign=this.args.align===`end`?h.Align.END:h.Align.START),this._popover.autohide=this.args.autohide}};S.type_ensure(Wi.$gtype);const Gi={stories:[Wi]},Ki={title:`Layout/Popover`,description:"Gtk.Popover — the bubble-like surface. No model and no menu: it holds whatever widget you put in it, and everything here is about WHERE it appears and WHEN it goes away. `autohide` off is entry completion: the list follows the typing and the caret never leaves.",controls:[{name:`position`,label:`Position`,type:i.SELECT,options:[{label:`Bottom`,value:`bottom`},{label:`Top`,value:`top`},{label:`Start`,value:`start`},{label:`End`,value:`end`}],defaultValue:`bottom`},{name:`align`,label:`Align`,type:i.SELECT,options:[{label:`Start`,value:`start`},{label:`End`,value:`end`}],defaultValue:`start`},{name:`autohide`,label:`Dismiss on outside click`,type:i.BOOLEAN,defaultValue:!0}]};var qi=__exportAll({PopoverStories:()=>Yi,PopoverStory:()=>Ji}),Ji=class PopoverStory extends D{_anchor=null;_popover=null;static{S.registerClass({GTypeName:`AdwStorybookPopover`},PopoverStory)}constructor(){super(D.fromMeta(PopoverStory.getMetadata(),`Default`))}static getMetadata(){return{...Ki,component:h.Popover.$gtype}}initialize(){let e=new h.Box({orientation:h.Orientation.VERTICAL,spacing:6});e.append(new h.Label({label:`Anything you like`})),e.append(new h.Label({label:`in here`})),this._anchor=new h.Button({label:`Show popover`,halign:h.Align.CENTER}),this._popover=new h.Popover({child:e}),this._popover.set_parent(this._anchor),this._apply(),this.addContent(this._anchor)}updateArgs(e){this._apply()}_apply(){if(!this._popover)return;let e={bottom:h.PositionType.BOTTOM,top:h.PositionType.TOP,start:h.PositionType.LEFT,end:h.PositionType.RIGHT};this._popover.position=e[this.args.position]??h.PositionType.BOTTOM,this._anchor&&(this._anchor.halign=this.args.align===`end`?h.Align.END:h.Align.START),this._popover.autohide=this.args.autohide}};S.type_ensure(Ji.$gtype);const Yi={stories:[Ji]},Xi={title:`Layout/Revealer`,description:`Gtk.Revealer — shows and hides its child with an animation. The transition is one of fourteen nicks and it is not only an opacity change: a slide scales the box along one axis while allocating the child at its UNSCALED size, and a swing folds it in with sin (π · pos / 2). Libadwaita styles no revealer node of its own, so everything here is GTK behaviour the browser element ports.`,controls:[{name:`transitionType`,label:`Transition`,type:i.SELECT,options:[{label:`Slide down (the default)`,value:`slide-down`},{label:`Slide up`,value:`slide-up`},{label:`Slide left`,value:`slide-left`},{label:`Slide right`,value:`slide-right`},{label:`Crossfade`,value:`crossfade`},{label:`Fade + slide down`,value:`fade-slide-down`},{label:`Swing down (fold)`,value:`swing-down`},{label:`Swing right (fold)`,value:`swing-right`},{label:`None`,value:`none`}],defaultValue:`slide-down`},{name:`transitionDuration`,label:`Duration (ms)`,type:i.RANGE,min:0,max:800,step:50,defaultValue:250},{name:`revealChild`,label:`Reveal`,type:i.BOOLEAN,defaultValue:!0}]};var Zi=__exportAll({RevealerStories:()=>ea,RevealerStory:()=>$i});const Qi={none:h.RevealerTransitionType.NONE,crossfade:h.RevealerTransitionType.CROSSFADE,"slide-right":h.RevealerTransitionType.SLIDE_RIGHT,"slide-left":h.RevealerTransitionType.SLIDE_LEFT,"slide-up":h.RevealerTransitionType.SLIDE_UP,"slide-down":h.RevealerTransitionType.SLIDE_DOWN,"swing-right":h.RevealerTransitionType.SWING_RIGHT,"swing-left":h.RevealerTransitionType.SWING_LEFT,"swing-up":h.RevealerTransitionType.SWING_UP,"swing-down":h.RevealerTransitionType.SWING_DOWN,"fade-slide-right":h.RevealerTransitionType.FADE_SLIDE_RIGHT,"fade-slide-left":h.RevealerTransitionType.FADE_SLIDE_LEFT,"fade-slide-up":h.RevealerTransitionType.FADE_SLIDE_UP,"fade-slide-down":h.RevealerTransitionType.FADE_SLIDE_DOWN};var $i=class RevealerStory extends D{_revealer=null;static{S.registerClass({GTypeName:`AdwStorybookRevealer`},RevealerStory)}constructor(){super(D.fromMeta(RevealerStory.getMetadata(),`Default`))}static getMetadata(){return{...Xi,component:h.Revealer.$gtype}}initialize(){let e=new h.Box({orientation:h.Orientation.VERTICAL,spacing:6,margin_top:12,margin_bottom:12,margin_start:12,margin_end:12});e.append(new h.Label({label:`The revealed child`}));let t=new h.Label({label:`Drag the controls to change the transition`});t.add_css_class(`dim-label`),e.append(t),this._revealer=new h.Revealer,this._revealer.set_child(e),this._apply(),this.addContent(this._revealer)}updateArgs(e){this._apply()}_apply(){this._revealer&&(this._revealer.transition_type=Qi[String(this.args.transitionType)],this._revealer.transition_duration=Number(this.args.transitionDuration),this._revealer.reveal_child=this.args.revealChild)}};S.type_ensure($i.$gtype);const ea={stories:[$i]},ta={title:`Layout/Scrollbar`,description:`Gtk.Scrollbar — a trough and a slider, positioned by a GtkAdjustment. The slider is page_size over the whole range long and sits at the position over the SCROLLABLE range, which is why the two numbers it is made of do not share a denominator.`,controls:[{name:`orientation`,label:`Orientation`,type:i.SELECT,options:[{label:`Horizontal`,value:`horizontal`},{label:`Vertical`,value:`vertical`}],defaultValue:`vertical`},{name:`upper`,label:`Adjustment upper`,type:i.NUMBER,defaultValue:400},{name:`pageSize`,label:`Adjustment page size`,type:i.NUMBER,defaultValue:120},{name:`value`,label:`Adjustment value`,type:i.NUMBER,defaultValue:80}]};var na=__exportAll({ScrollbarStories:()=>ia,ScrollbarStory:()=>ra}),ra=class ScrollbarStory extends D{_scrollbar=null;static{S.registerClass({GTypeName:`AdwStorybookScrollbar`},ScrollbarStory)}constructor(){super(D.fromMeta(ScrollbarStory.getMetadata(),`Default`))}static getMetadata(){return{...ta,component:h.Scrollbar.$gtype}}initialize(){this._scrollbar=new h.Scrollbar({adjustment:new h.Adjustment({step_increment:10,page_increment:80})}),this._apply(),this.addContent(this._scrollbar)}updateArgs(e){this._apply()}_apply(){let e=this._scrollbar;if(!e)return;e.orientation=this.args.orientation===`horizontal`?h.Orientation.HORIZONTAL:h.Orientation.VERTICAL;let t=e.get_adjustment();t&&t.configure(Number(this.args.value),0,Number(this.args.upper),t.step_increment,t.page_increment,Number(this.args.pageSize))}};S.type_ensure(ra.$gtype);const ia={stories:[ra]},aa={title:`Layout/ScrolledWindow`,description:`Gtk.ScrolledWindow — one child, two adjustments, and a scrollbar per edge that can actually scroll. The policies decide whether a bar appears, window-placement which edge it takes, and overlay-scrolling turns the bars into the auto-hiding indicators GNOME draws over the content.`,controls:[{name:`hPolicy`,label:`Horizontal policy`,type:i.SELECT,options:[{label:`Automatic`,value:`automatic`},{label:`Always`,value:`always`},{label:`Never`,value:`never`}],defaultValue:`automatic`},{name:`vPolicy`,label:`Vertical policy`,type:i.SELECT,options:[{label:`Automatic`,value:`automatic`},{label:`Always`,value:`always`},{label:`Never`,value:`never`}],defaultValue:`automatic`},{name:`placement`,label:`Window placement`,type:i.SELECT,options:[{label:`Top left`,value:`top-left`},{label:`Top right`,value:`top-right`},{label:`Bottom left`,value:`bottom-left`},{label:`Bottom right`,value:`bottom-right`}],defaultValue:`top-left`},{name:`frame`,label:`Frame`,type:i.BOOLEAN,defaultValue:!1},{name:`overlayScrolling`,label:`Overlay scrolling`,type:i.BOOLEAN,defaultValue:!0}]};var oa=__exportAll({ScrolledWindowStories:()=>ua,ScrolledWindowStory:()=>la});const sa={automatic:h.PolicyType.AUTOMATIC,always:h.PolicyType.ALWAYS,never:h.PolicyType.NEVER},ca={"top-left":h.CornerType.TOP_LEFT,"top-right":h.CornerType.TOP_RIGHT,"bottom-left":h.CornerType.BOTTOM_LEFT,"bottom-right":h.CornerType.BOTTOM_RIGHT};var la=class ScrolledWindowStory extends D{_window=null;static{S.registerClass({GTypeName:`AdwStorybookScrolledWindow`},ScrolledWindowStory)}constructor(){super(D.fromMeta(ScrolledWindowStory.getMetadata(),`Default`))}static getMetadata(){return{...aa,component:h.ScrolledWindow.$gtype}}initialize(){let e=new h.Box({orientation:h.Orientation.VERTICAL,spacing:8});for(let t=1;t<=16;t++)e.append(new h.Label({label:`Row ${t}`}));this._window=new h.ScrolledWindow({child:e,min_content_height:240,halign:h.Align.CENTER}),this._apply(),this.addContent(this._window)}updateArgs(e){this._apply()}_apply(){let e=this._window;e&&(e.set_policy(sa[this.args.hPolicy]??h.PolicyType.AUTOMATIC,sa[this.args.vPolicy]??h.PolicyType.AUTOMATIC),e.set_placement(ca[this.args.placement]??h.CornerType.TOP_LEFT),e.has_frame=this.args.frame,e.set_overlay_scrolling(this.args.overlayScrolling))}};S.type_ensure(la.$gtype);const ua={stories:[la]},da={title:`Layout/Separator`,description:`Gtk.Separator — a one-pixel rule between two groups of widgets. Libadwaita ships no Adw.Separator; it only styles the GTK one, and the .spacer style class turns the rule into an empty 12px gap.`,controls:[{name:`orientation`,label:`Orientation`,type:i.SELECT,options:[{label:`Horizontal`,value:`horizontal`},{label:`Vertical`,value:`vertical`}],defaultValue:`horizontal`},{name:`spacer`,label:`Spacer (draws nothing)`,type:i.BOOLEAN,defaultValue:!1}]};var fa=__exportAll({SeparatorStories:()=>ma,SeparatorStory:()=>pa}),pa=class SeparatorStory extends D{_box=null;_separator=null;static{S.registerClass({GTypeName:`AdwStorybookSeparator`},SeparatorStory)}constructor(){super(D.fromMeta(SeparatorStory.getMetadata(),`Default`))}static getMetadata(){return{...da,component:h.Separator.$gtype}}initialize(){this._separator=new h.Separator,this._box=new h.Box({spacing:12,halign:h.Align.CENTER}),this._box.append(new h.Label({label:`Above`})),this._box.append(this._separator),this._box.append(new h.Label({label:`Below`})),this._apply(),this.addContent(this._box)}updateArgs(e){this._apply()}_apply(){if(!this._box||!this._separator)return;let e=this.args.orientation===`vertical`;this._separator.orientation=e?h.Orientation.VERTICAL:h.Orientation.HORIZONTAL,this._box.orientation=e?h.Orientation.HORIZONTAL:h.Orientation.VERTICAL,this.args.spacer?this._separator.add_css_class(`spacer`):this._separator.remove_css_class(`spacer`)}};S.type_ensure(pa.$gtype);const ma={stories:[pa]},ha={title:`Layout/Toolbar View`,description:`Adw.ToolbarView pins a top header bar and a bottom toolbar around its content, each independently revealable.`,controls:[{name:`revealTopBars`,label:`Reveal top bars`,type:i.BOOLEAN,defaultValue:!0},{name:`revealBottomBars`,label:`Reveal bottom bars`,type:i.BOOLEAN,defaultValue:!0}]};var ga=__exportAll({ToolbarViewStories:()=>va,ToolbarViewStory:()=>_a}),_a=class ToolbarViewStory extends D{_view=null;static{S.registerClass({GTypeName:`AdwStorybookToolbarView`},ToolbarViewStory)}constructor(){super(D.fromMeta(ToolbarViewStory.getMetadata(),`Default`))}static getMetadata(){return{...ha,component:w.ToolbarView.$gtype}}initialize(){this._view=new w.ToolbarView({widthRequest:460,heightRequest:320,revealTopBars:this.args.revealTopBars,revealBottomBars:this.args.revealBottomBars});let e=new w.HeaderBar({titleWidget:new w.WindowTitle({title:`Documents`,subtitle:`12 items`})});this._view.add_top_bar(e);let t=new w.StatusPage({iconName:`folder-documents-symbolic`,title:`Your library`,description:`Content sits between the toolbars and scrolls independently of them.`});this._view.content=t;let n=new h.ActionBar,r=new h.Button({iconName:`list-add-symbolic`});r.add_css_class(`flat`);let i=new h.Button({iconName:`list-remove-symbolic`});i.add_css_class(`flat`),n.pack_start(r),n.pack_start(i),n.set_center_widget(new h.Label({label:`Selection: none`}));let a=new h.Button({iconName:`send-to-symbolic`});a.add_css_class(`flat`),n.pack_end(a),this._view.add_bottom_bar(n),this.addContent(this._view)}updateArgs(e){this._view&&(this._view.revealTopBars=this.args.revealTopBars,this._view.revealBottomBars=this.args.revealBottomBars)}};S.type_ensure(_a.$gtype);const va={stories:[_a]},ya={title:`Layout/Viewport`,description:`Gtk.Viewport — scrollability for a widget that has none of its own. It has one property, scroll-to-focus: whether a widget that takes the focus is scrolled into view. It is also what a Gtk.ScrolledWindow puts its child in.`,controls:[{name:`scrollToFocus`,label:`Scroll to focus`,type:i.BOOLEAN,defaultValue:!0}]};var ba=__exportAll({ViewportStories:()=>Sa,ViewportStory:()=>xa}),xa=class ViewportStory extends D{_viewport=null;static{S.registerClass({GTypeName:`AdwStorybookViewport`},ViewportStory)}constructor(){super(D.fromMeta(ViewportStory.getMetadata(),`Default`))}static getMetadata(){return{...ya,component:h.Viewport.$gtype}}initialize(){let e=new h.Box({orientation:h.Orientation.VERTICAL,spacing:8});for(let t=1;t<=16;t++)e.append(new h.Label({label:`Row ${t}`}));e.append(new h.Button({label:`Focus me`,halign:h.Align.START})),this._viewport=new h.Viewport({child:e,halign:h.Align.CENTER}),this._apply(),this.addContent(this._viewport)}updateArgs(e){this._apply()}_apply(){this._viewport&&this._viewport.set_scroll_to_focus(this.args.scrollToFocus)}};S.type_ensure(xa.$gtype);const Sa={stories:[xa]},Ca={title:`Layout/Window`,description:`Adw.Window — a freeform window with no titlebar area. Use Adw.ToolbarView with Adw.HeaderBar for the top chrome.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Text Editor`},{name:`subtitle`,label:`Subtitle`,type:i.TEXT,defaultValue:`notes.md`}]};var wa=__exportAll({WindowStories:()=>Ea,WindowStory:()=>Ta}),Ta=class WindowStory extends D{_window=null;_title=null;static{S.registerClass({GTypeName:`AdwStorybookWindow`},WindowStory)}constructor(){super(D.fromMeta(WindowStory.getMetadata(),`Default`))}static getMetadata(){return{...Ca,component:w.Window.$gtype}}initialize(){this._title=new w.WindowTitle({title:this.args.title,subtitle:this.args.subtitle});let e=new w.HeaderBar({titleWidget:this._title,widthRequest:460}),t=new h.Button({iconName:`go-previous-symbolic`});t.add_css_class(`flat`),e.pack_start(t);let n=new h.MenuButton({iconName:`open-menu-symbolic`});n.add_css_class(`flat`),e.pack_end(n);let r=new w.ToolbarView;r.add_top_bar(e),r.content=new w.StatusPage({title:`Your Library`,description:`Content sits between the toolbars and scrolls independently of them.`}),this._window=new w.Window({content:r}),this.addContent(this._window)}updateArgs(e){this._title&&(this._title.title=this.args.title,this._title.subtitle=this.args.subtitle)}};S.type_ensure(Ta.$gtype);const Ea={stories:[Ta]},Da={title:`Layout/Wrap Box`,description:`Adw.WrapBox flows its children horizontally and wraps them onto new lines when they run out of room.`,controls:[{name:`childSpacing`,label:`Child spacing`,type:i.RANGE,min:0,max:36,step:1,defaultValue:8},{name:`lineSpacing`,label:`Line spacing`,type:i.RANGE,min:0,max:36,step:1,defaultValue:8}]};var Oa=__exportAll({WrapBoxStories:()=>Aa,WrapBoxStory:()=>ka}),ka=class WrapBoxStory extends D{_wrap=null;static{S.registerClass({GTypeName:`AdwStorybookWrapBox`},WrapBoxStory)}constructor(){super(D.fromMeta(WrapBoxStory.getMetadata(),`Default`))}static getMetadata(){return{...Da,component:w.WrapBox.$gtype}}initialize(){this._wrap=new w.WrapBox({childSpacing:this.args.childSpacing,lineSpacing:this.args.lineSpacing,widthRequest:460});for(let e of[`Design`,`Adwaita`,`GNOME`,`GTK`,`TypeScript`,`Storybook`,`Wrapping`,`Layout`]){let t=new h.Button({label:e});t.add_css_class(`pill`),this._wrap.append(t)}this.addContent(this._wrap)}updateArgs(e){this._wrap&&(this._wrap.childSpacing=this.args.childSpacing,this._wrap.lineSpacing=this.args.lineSpacing)}};S.type_ensure(ka.$gtype);const Aa={stories:[ka]},ja={title:`Media/Image`,description:`Gtk.Image — a symbolic icon, drawn as a CSS-masked box in the surrounding text colour. It takes a NAME, not a file: a name the icon theme cannot resolve draws the missing-image glyph, which is exactly what GTK draws for it. That is why <gtk-picture> is a separate widget — an icon sized by the theme and an image fitted to a box are two different jobs.`,controls:[{name:`iconName`,label:`Icon name`,type:i.TEXT,defaultValue:`avatar-default-symbolic`},{name:`size`,label:`Size (px)`,type:i.RANGE,min:16,max:96,step:8,defaultValue:48},{name:`disabled`,label:`Disabled`,type:i.BOOLEAN,defaultValue:!1}]};var Ma=__exportAll({ImageStories:()=>Pa,ImageStory:()=>Na}),Na=class ImageStory extends D{_image=null;static{S.registerClass({GTypeName:`AdwStorybookImage`},ImageStory)}constructor(){super(D.fromMeta(ImageStory.getMetadata(),`Default`))}static getMetadata(){return{...ja,component:h.Image.$gtype}}initialize(){this._image=new h.Image({halign:h.Align.CENTER,valign:h.Align.CENTER}),this._apply(),this.addContent(this._image)}updateArgs(e){this._apply()}_apply(){this._image&&(this._image.icon_size=this.args.size,this._image.icon_name=this.args.iconName,this._image.sensitive=!this.args.disabled)}};S.type_ensure(Na.$gtype);const Pa={stories:[Na]},Fa={title:`Media/Inscription`,description:`Gtk.Inscription — text laid out to a size in CHARACTERS and LINES rather than to a size in pixels. It is the widget for text whose extent should be the same everywhere, so it never measures its own content: min-chars/nat-chars and min-lines/nat-lines ARE its size request.`,controls:[{name:`text`,label:`Text`,type:i.TEXT,defaultValue:`Inscription`},{name:`minChars`,label:`Min chars`,type:i.RANGE,min:0,max:40,step:1,defaultValue:3},{name:`natChars`,label:`Nat chars`,type:i.RANGE,min:0,max:40,step:1,defaultValue:0},{name:`minLines`,label:`Min lines`,type:i.RANGE,min:0,max:6,step:1,defaultValue:1},{name:`natLines`,label:`Nat lines`,type:i.RANGE,min:0,max:6,step:1,defaultValue:0},{name:`wrapMode`,label:`Wrap mode`,type:i.SELECT,options:[{label:`Word`,value:`word`},{label:`Char`,value:`char`},{label:`Word-char (default)`,value:`word-char`}],defaultValue:`word-char`},{name:`textOverflow`,label:`Text overflow`,type:i.SELECT,options:[{label:`Clip (default)`,value:`clip`},{label:`Ellipsize start`,value:`ellipsize-start`},{label:`Ellipsize middle`,value:`ellipsize-middle`},{label:`Ellipsize end`,value:`ellipsize-end`}],defaultValue:`clip`},{name:`xalign`,label:`X align`,type:i.RANGE,min:0,max:1,step:.05,defaultValue:0},{name:`yalign`,label:`Y align`,type:i.RANGE,min:0,max:1,step:.05,defaultValue:.5}]};var Ia=__exportAll({InscriptionStories:()=>Ra,InscriptionStory:()=>La}),La=class InscriptionStory extends D{_inscription=null;_frame=null;static{S.registerClass({GTypeName:`AdwStorybookInscription`},InscriptionStory)}constructor(){super(D.fromMeta(InscriptionStory.getMetadata(),`Default`))}static getMetadata(){return{...Fa,component:h.Inscription.$gtype}}initialize(){this._inscription=new h.Inscription,this._frame=new h.Frame({child:this._inscription,halign:h.Align.CENTER}),this._apply(),this.addContent(this._frame)}updateArgs(e){this._apply()}_apply(){!this._inscription||!this._frame||(this._inscription.min_chars=this.args.minChars,this._inscription.nat_chars=this.args.natChars,this._inscription.min_lines=this.args.minLines,this._inscription.nat_lines=this.args.natLines,this._inscription.text=this.args.text,this._inscription.wrap_mode=this.args.wrapMode,this._inscription.text_overflow=this.args.textOverflow,this._inscription.xalign=this.args.xalign,this._inscription.yalign=this.args.yalign,this._frame.width_request=320,this._frame.height_request=160)}};S.type_ensure(La.$gtype);const Ra={stories:[La]},za={title:`Media/Media Controls`,description:"Gtk.MediaControls — the transport bar: play, position, duration, volume. It owns no playback at all (its one property is an object, `media-stream`), and the bar is INSENSITIVE until a stream is attached. Note which label shows what: the position label shows the elapsed time and the one beside it shows what REMAINS, negatively.",controls:[{name:`sensitive`,label:`Sensitive`,type:i.BOOLEAN,defaultValue:!0}]};var Ba=__exportAll({MediaControlsStories:()=>Ha,MediaControlsStory:()=>Va}),Va=class MediaControlsStory extends D{_controls=null;static{S.registerClass({GTypeName:`AdwStorybookMediaControls`},MediaControlsStory)}constructor(){super(D.fromMeta(MediaControlsStory.getMetadata(),`Default`))}static getMetadata(){return{...za,component:h.MediaControls.$gtype}}initialize(){this._controls=new h.MediaControls,this._controls.add_css_class(`osd`),this._controls.add_css_class(`bottom`),this._apply(),this.addContent(this._controls)}updateArgs(e){this._apply()}_apply(){this._controls&&(this._controls.sensitive=this.args.sensitive)}};S.type_ensure(Va.$gtype);const Ha={stories:[Va]},Ua={title:`Media/Picture`,description:"Gtk.Picture — an image fitted to the box it is given, not sized by itself. `content-fit` picks one of the four fit modes (contain, cover, fill, scale-down), `can-shrink` decides whether it may be smaller than its content, and `alternative-text` is what a screen reader hears.",controls:[{name:`contentFit`,label:`Content fit`,type:i.SELECT,options:[{label:`Contain`,value:`contain`},{label:`Cover`,value:`cover`},{label:`Fill`,value:`fill`},{label:`Scale down`,value:`scale-down`}],defaultValue:`contain`},{name:`canShrink`,label:`Can shrink`,type:i.BOOLEAN,defaultValue:!0},{name:`alternativeText`,label:`Alternative text`,type:i.TEXT,defaultValue:`A tangerine`},{name:`isolateContents`,label:`Isolate contents`,type:i.BOOLEAN,defaultValue:!0},{name:`keepAspectRatio`,label:`Keep aspect ratio (deprecated)`,type:i.BOOLEAN,defaultValue:!0},{name:`width`,label:`Width (px)`,type:i.RANGE,min:64,max:320,step:16,defaultValue:240}]};var Wa=__exportAll({PictureStories:()=>Ka,PictureStory:()=>Ga});function makePaintable(){let e=320*4,t=new Uint8Array(e*180);for(let n=0;n<180;n++){let r=n<180/2?48:144;for(let i=0;i<320;i++){let a=n*e+i*4;t[a]=r,t[a+1]=i<320/2?64:192,t[a+2]=160,t[a+3]=255}}return f.MemoryTexture.new(320,180,f.MemoryFormat.R8G8B8A8,l.Bytes.new(t),e)}var Ga=class PictureStory extends D{_picture=null;static{S.registerClass({GTypeName:`AdwStorybookPicture`},PictureStory)}constructor(){super(D.fromMeta(PictureStory.getMetadata(),`Default`))}static getMetadata(){return{...Ua,component:h.Picture.$gtype}}initialize(){this._picture=new h.Picture({paintable:makePaintable(),halign:h.Align.CENTER,valign:h.Align.CENTER}),this._apply(),this.addContent(this._picture)}updateArgs(e){this._apply()}_apply(){if(!this._picture)return;let e=this.args.width;this._picture.set_size_request(e,Math.round(e*2/3)),this.args.keepAspectRatio&&(this._picture.keep_aspect_ratio=!0),this._picture.content_fit=this.args.contentFit,this._picture.can_shrink=this.args.canShrink,this._picture.alternative_text=this.args.alternativeText,this._picture.isolate_contents=this.args.isolateContents}};S.type_ensure(Ga.$gtype);const Ka={stories:[Ga]},qa={title:`Media/Video`,description:`Gtk.Video — a play surface with an overlay icon and a controls bar that hides itself three seconds after you stop moving the pointer. The overlay icon is a four-way choice — no stream, error, ended, or ready — and it is only VISIBLE while the video is stopped; there is no pause glyph over the frames.`,controls:[{name:`autoplay`,label:`Autoplay`,type:i.BOOLEAN,defaultValue:!1},{name:`loop`,label:`Loop`,type:i.BOOLEAN,defaultValue:!0},{name:`graphicsOffload`,label:`Graphics offload`,type:i.BOOLEAN,defaultValue:!1},{name:`width`,label:`Width (px)`,type:i.RANGE,min:160,max:480,step:40,defaultValue:320}]};var Ja=__exportAll({VideoStories:()=>Xa,VideoStory:()=>Ya}),Ya=class VideoStory extends D{_video=null;static{S.registerClass({GTypeName:`AdwStorybookVideo`},VideoStory)}constructor(){super(D.fromMeta(VideoStory.getMetadata(),`Default`))}static getMetadata(){return{...qa,component:h.Video.$gtype}}initialize(){this._video=new h.Video({halign:h.Align.CENTER,valign:h.Align.CENTER}),this._apply(),this.addContent(this._video)}updateArgs(e){this._apply()}_apply(){if(!this._video)return;let e=this.args.width;this._video.set_size_request(e,Math.round(e*9/16)),this._video.autoplay=this.args.autoplay,this._video.loop=this.args.loop,this._video.graphics_offload=this.args.graphicsOffload?h.GraphicsOffloadEnabled.ENABLED:h.GraphicsOffloadEnabled.DISABLED}};S.type_ensure(Ya.$gtype);const Xa={stories:[Ya]},Za={title:`Navigation/Bottom Sheet`,description:`Adw.BottomSheet — a sheet that slides up over the content. Toggle "Open" to reveal it.`,controls:[{name:`open`,label:`Open`,type:i.BOOLEAN,defaultValue:!0},{name:`modal`,label:`Modal`,type:i.BOOLEAN,defaultValue:!0},{name:`canClose`,label:`Can close`,type:i.BOOLEAN,defaultValue:!0}]};var Qa=__exportAll({BottomSheetStories:()=>eo,BottomSheetStory:()=>$a}),$a=class BottomSheetStory extends D{_sheet=null;static{S.registerClass({GTypeName:`AdwStorybookBottomSheet`},BottomSheetStory)}constructor(){super(D.fromMeta(BottomSheetStory.getMetadata(),`Default`))}static getMetadata(){return{...Za,component:w.BottomSheet.$gtype}}buildContent(){let e=new h.Button({label:`Toggle sheet`,halign:h.Align.CENTER,valign:h.Align.CENTER,vexpand:!0});return e.add_css_class(`pill`),e.add_css_class(`suggested-action`),e.connect(`clicked`,()=>{this._sheet&&(this._sheet.open=!this._sheet.open)}),e}buildSheet(){let e=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12,marginTop:18,marginBottom:24,marginStart:18,marginEnd:18});e.append(new h.Label({label:`Share track`,halign:h.Align.START,cssClasses:[`title-2`]}));let t=new w.PreferencesGroup;for(let[e,n]of[[`Copy link`,`edit-copy-symbolic`],[`Send to a friend`,`mail-send-symbolic`],[`Add to playlist`,`list-add-symbolic`]]){let r=new w.ActionRow({title:e});r.add_prefix(new h.Image({iconName:n})),r.activatable=!0,t.add(r)}return e.append(t),e}initialize(){this._sheet=new w.BottomSheet({content:this.buildContent(),sheet:this.buildSheet(),open:this.args.open,modal:this.args.modal,canClose:this.args.canClose,widthRequest:480,heightRequest:340}),this.addContent(this._sheet)}updateArgs(e){this._sheet&&(this._sheet.open=this.args.open,this._sheet.modal=this.args.modal,this._sheet.canClose=this.args.canClose)}};S.type_ensure($a.$gtype);const eo={stories:[$a]},to={title:`Navigation/Navigation Split View`,description:`Adw.NavigationSplitView — a resizable sidebar beside a content pane. When collapsed it folds into a navigation stack.`,controls:[{name:`showContent`,label:`Show content`,type:i.BOOLEAN,defaultValue:!0},{name:`collapsed`,label:`Collapsed`,type:i.BOOLEAN,defaultValue:!1}]};var no=__exportAll({NavigationSplitViewStories:()=>io,NavigationSplitViewStory:()=>ro}),ro=class NavigationSplitViewStory extends D{_view=null;static{S.registerClass({GTypeName:`AdwStorybookNavigationSplitView`},NavigationSplitViewStory)}constructor(){super(D.fromMeta(NavigationSplitViewStory.getMetadata(),`Default`))}static getMetadata(){return{...to,component:w.NavigationSplitView.$gtype}}buildSidebar(){let e=new w.PreferencesGroup;for(let[t,n,r]of[[`All Mail`,`128 messages`,`mail-unread-symbolic`],[`Starred`,`6 messages`,`starred-symbolic`],[`Drafts`,`2 messages`,`document-edit-symbolic`],[`Archive`,`512 messages`,`folder-symbolic`]]){let i=new w.ActionRow({title:t,subtitle:n});i.add_prefix(new h.Image({iconName:r})),i.activatable=!0,e.add(i)}let t=new w.ToolbarView;return t.add_top_bar(new w.HeaderBar),t.content=e,new w.NavigationPage({title:`Mailboxes`,child:t})}buildContent(){let e=new w.StatusPage({iconName:`mail-unread-symbolic`,title:`All Mail`,description:`Select a conversation from the list to read it here.`,vexpand:!0}),t=new w.ToolbarView;return t.add_top_bar(new w.HeaderBar),t.content=e,new w.NavigationPage({title:`All Mail`,child:t})}initialize(){this._view=new w.NavigationSplitView({sidebar:this.buildSidebar(),content:this.buildContent(),showContent:this.args.showContent,collapsed:this.args.collapsed,widthRequest:480,heightRequest:340}),this.addContent(this._view)}updateArgs(e){this._view&&(this._view.showContent=this.args.showContent,this._view.collapsed=this.args.collapsed)}};S.type_ensure(ro.$gtype);const io={stories:[ro]},ao={title:`Navigation/Navigation View`,description:`Adw.NavigationView — a navigation stack. The root page pushes a detail page, which gets an automatic back button.`,controls:[{name:`rootTitle`,label:`Root title`,type:i.TEXT,defaultValue:`Contacts`},{name:`detailTitle`,label:`Detail title`,type:i.TEXT,defaultValue:`Ada Lovelace`},{name:`animateTransitions`,label:`Animate transitions`,type:i.BOOLEAN,defaultValue:!0}]};var oo=__exportAll({NavigationViewStories:()=>co,NavigationViewStory:()=>so}),so=class NavigationViewStory extends D{_view=null;static{S.registerClass({GTypeName:`AdwStorybookNavigationView`},NavigationViewStory)}constructor(){super(D.fromMeta(NavigationViewStory.getMetadata(),`Default`))}static getMetadata(){return{...ao,component:w.NavigationView.$gtype}}buildPage(e,t){let n=new w.ToolbarView;return n.add_top_bar(new w.HeaderBar),n.content=t,new w.NavigationPage({title:e,child:n})}initialize(){this._view=new w.NavigationView({animateTransitions:this.args.animateTransitions,widthRequest:480,heightRequest:340});let e=this.buildPage(this.args.detailTitle,new w.StatusPage({iconName:`avatar-default-symbolic`,title:this.args.detailTitle,description:`Mathematician and writer, the first computer programmer.`,vexpand:!0})),t=new h.Button({label:`Open contact`,halign:h.Align.CENTER,valign:h.Align.CENTER,vexpand:!0});t.add_css_class(`pill`),t.add_css_class(`suggested-action`),t.connect(`clicked`,()=>{this._view?.push(e)});let n=this.buildPage(this.args.rootTitle,t);this._view.add(n),this._view.add(e),this.addContent(this._view)}updateArgs(e){this._view&&(this._view.animateTransitions=this.args.animateTransitions)}};S.type_ensure(so.$gtype);const co={stories:[so]},lo={title:`Navigation/Overlay Split View`,description:`Adw.OverlaySplitView — a sidebar shown beside the content, or overlaid on top of it when collapsed.`,controls:[{name:`showSidebar`,label:`Show sidebar`,type:i.BOOLEAN,defaultValue:!0},{name:`collapsed`,label:`Collapsed`,type:i.BOOLEAN,defaultValue:!1}]};var uo=__exportAll({OverlaySplitViewStories:()=>po,OverlaySplitViewStory:()=>fo}),fo=class OverlaySplitViewStory extends D{_view=null;static{S.registerClass({GTypeName:`AdwStorybookOverlaySplitView`},OverlaySplitViewStory)}constructor(){super(D.fromMeta(OverlaySplitViewStory.getMetadata(),`Default`))}static getMetadata(){return{...lo,component:w.OverlaySplitView.$gtype}}buildSidebar(){let e=new w.PreferencesGroup;for(let[t,n]of[[`Home`,`go-home-symbolic`],[`Discover`,`system-search-symbolic`],[`Library`,`folder-music-symbolic`],[`Settings`,`emblem-system-symbolic`]]){let r=new w.ActionRow({title:t});r.add_prefix(new h.Image({iconName:n})),r.activatable=!0,e.add(r)}let t=new w.ToolbarView;return t.add_top_bar(new w.HeaderBar({showTitle:!1})),t.content=e,t.add_css_class(`sidebar`),t}buildContent(){let e=new w.StatusPage({iconName:`folder-music-symbolic`,title:`Your Library`,description:`Toggle the sidebar to browse sections. Collapse it to overlay the content.`,vexpand:!0}),t=new w.ToolbarView;return t.add_top_bar(new w.HeaderBar),t.content=e,t}initialize(){this._view=new w.OverlaySplitView({sidebar:this.buildSidebar(),content:this.buildContent(),showSidebar:this.args.showSidebar,collapsed:this.args.collapsed,widthRequest:480,heightRequest:340}),this.addContent(this._view)}updateArgs(e){this._view&&(this._view.showSidebar=this.args.showSidebar,this._view.collapsed=this.args.collapsed)}};S.type_ensure(fo.$gtype);const po={stories:[fo]},mo=[{label:`File`,submenu:[{label:`New Window`,accel:`<Control>N`},{label:`New Tab`,accel:`<Control><Shift>N`},{label:`Open…`,accel:`<Control>O`}]},{label:`Edit`,submenu:[{label:`Undo`,accel:`<Control>Z`},{label:`Redo`,accel:`<Control>Y`}]},{label:`View`,submenu:[{label:`Zoom In`,accel:`<Control>plus`},{label:`Zoom Out`}]},{label:`Help`,submenu:[{label:`Keyboard Shortcuts`},{label:`About`}]}],ho={title:`Navigation/Popover Menu Bar`,description:`Gtk.PopoverMenuBar — a horizontal bar of items that pop up menus when clicked. Clicking an item OPENS its menu; hovering only SELECTS, and the item lights up (.active) exactly while its menu is up. Left and Right walk the bar and wrap.`,controls:[{name:`position`,label:`Menu position`,type:i.SELECT,options:[{label:`Below`,value:`bottom`},{label:`Above`,value:`top`}],defaultValue:`bottom`},{name:`showLast`,label:`Include Help`,type:i.BOOLEAN,defaultValue:!0}]};var go=__exportAll({PopoverMenuBarStories:()=>vo,PopoverMenuBarStory:()=>_o}),_o=class PopoverMenuBarStory extends D{_bar=null;static{S.registerClass({GTypeName:`AdwStorybookPopoverMenuBar`},PopoverMenuBarStory)}constructor(){super(D.fromMeta(PopoverMenuBarStory.getMetadata(),`Default`))}static getMetadata(){return{...ho,component:h.PopoverMenuBar.$gtype}}initialize(){this._bar=h.PopoverMenuBar.new_from_model(this._buildMenu()),this._bar.halign=h.Align.START,this._apply(),this.addContent(this._bar)}updateArgs(e){this._apply()}_buildMenu(){let e=new x.Menu,t=this.args.showLast===!1?mo.slice(0,3):mo;for(let n of t){let t=new x.Menu;for(let e of n.submenu)t.append(e.label,`app.${e.label.toLowerCase().replace(/[^a-z0-9]+/g,`-`)}`);e.append_submenu(n.label,t)}return e}_apply(){if(!this._bar)return;let e=this.args.position===`top`;for(let t=this._bar.get_first_child();t!==null;t=t.get_next_sibling())t.get_first_child()?.set_position(e?h.PositionType.TOP:h.PositionType.BOTTOM)}};S.type_ensure(_o.$gtype);const vo={stories:[_o]},yo={title:`Navigation/Sidebar`,description:`Adw.Sidebar — a selectable list of Adw.SidebarItem grouped into sections. Selecting an item updates the content.`,controls:[{name:`mode`,label:`Mode`,type:i.SELECT,options:[{label:`Sidebar`,value:`sidebar`},{label:`Page`,value:`page`}],defaultValue:`sidebar`},{name:`selected`,label:`Selected index`,type:i.NUMBER,min:0,max:3,step:1,defaultValue:0}]};var bo=__exportAll({SidebarStories:()=>So,SidebarStory:()=>xo}),xo=class SidebarStory extends D{_sidebar=null;_status=null;static{S.registerClass({GTypeName:`AdwStorybookSidebar`},SidebarStory)}constructor(){super(D.fromMeta(SidebarStory.getMetadata(),`Default`))}static getMetadata(){return{...yo,component:w.Sidebar.$gtype}}items=[{title:`Inbox`,subtitle:`3 unread`,icon:`mail-unread-symbolic`},{title:`Starred`,subtitle:`Favourites`,icon:`starred-symbolic`},{title:`Sent`,subtitle:`Outgoing mail`,icon:`mail-send-symbolic`},{title:`Archive`,subtitle:`Older mail`,icon:`folder-symbolic`}];modeFromArg(e){return e===`page`?w.SidebarMode.PAGE:w.SidebarMode.SIDEBAR}syncContent(){if(!this._sidebar||!this._status)return;let e=this.items[this._sidebar.selected]??this.items[0];this._status.title=e.title,this._status.iconName=e.icon,this._status.description=e.subtitle}initialize(){let e=new w.SidebarSection({title:`Mailboxes`});for(let t of this.items)e.append(new w.SidebarItem({title:t.title,subtitle:t.subtitle,iconName:t.icon}));this._sidebar=new w.Sidebar({mode:this.modeFromArg(this.args.mode),selected:this.args.selected,widthRequest:220}),this._sidebar.append(e),this._sidebar.connect(`notify::selected`,()=>this.syncContent()),this._status=new w.StatusPage({hexpand:!0,vexpand:!0});let t=new h.Box({orientation:h.Orientation.HORIZONTAL,widthRequest:480,heightRequest:340});t.append(this._sidebar),t.append(new h.Separator({orientation:h.Orientation.VERTICAL})),t.append(this._status),this.syncContent(),this.addContent(t)}updateArgs(e){this._sidebar&&(this._sidebar.mode=this.modeFromArg(this.args.mode),this._sidebar.selected=this.args.selected,this.syncContent())}};S.type_ensure(xo.$gtype);const So={stories:[xo]},Co=[{title:`Sync`,kind:`switch`,active:!0},{title:`Export`,kind:`action`}],wo=[`Blue`,`Teal`,`Green`,`Orange`],X={appearance:`Appearance`,account:`Account`,shortcuts:`Shortcuts`,actions:`Actions`},Z={bannerTitle:`You have unsaved changes`,bannerButton:`Save`,darkMode:`Dark mode`,darkModeSubtitle:`Use the dark Adwaita palette`,notifications:`Notifications`,notificationsSubtitle:`Show toasts for events`,accentColor:`Accent color`,name:`Name`,nameValue:`Ada Lovelace`,email:`Email`,emailValue:`ada@example.com`,devices:`Devices`,advanced:`Advanced`,advancedSubtitle:`More options`,save:`Save changes`,delete:`Delete account`},Q={value:3,lower:1,upper:10,step:1},To=[{title:`Copy`,accelerator:`<Control>C`},{title:`Select all`,accelerator:`<Shift><Control>a`},{title:`Switch tab`,accelerator:`<Alt>1...9`}],Eo={title:`Overview/Widgets`,description:`Many widgets at once, the way an app composes them: a banner, preference groups of rows, an expander, buttons and shortcut labels. Use it to judge spacing, alignment and the theme as a whole rather than one widget in isolation.`,controls:[{name:`revealed`,label:`Show banner`,type:i.BOOLEAN,description:`Adw.Banner:revealed — animates in and out`,defaultValue:!0}]};var Do=__exportAll({OverviewWidgetsStories:()=>ko,OverviewWidgetsStory:()=>Oo}),Oo=class OverviewWidgetsStory extends D{_banner=null;static{S.registerClass({GTypeName:`AdwStorybookOverviewWidgets`},OverviewWidgetsStory)}constructor(){super(D.fromMeta(OverviewWidgetsStory.getMetadata(),`Default`))}static getMetadata(){return Eo}initialize(){let e=new h.Box({orientation:h.Orientation.VERTICAL,hexpand:!0});this._banner=new w.Banner({title:Z.bannerTitle,button_label:Z.bannerButton,revealed:this.args.revealed}),e.append(this._banner);let t=new w.PreferencesPage({hexpand:!0}),n=new w.PreferencesGroup({title:X.appearance});n.add(new w.SwitchRow({title:Z.darkMode,subtitle:Z.darkModeSubtitle,active:!1})),n.add(new w.SwitchRow({title:Z.notifications,subtitle:Z.notificationsSubtitle,active:!0})),n.add(new w.ComboRow({title:Z.accentColor,model:h.StringList.new([...wo]),selected:0})),t.add(n);let r=new w.PreferencesGroup({title:X.account}),i=new w.EntryRow({title:Z.name});i.set_text(Z.nameValue),r.add(i);let a=new w.EntryRow({title:Z.email});a.set_text(Z.emailValue),r.add(a);let o=new w.SpinRow({title:Z.devices,adjustment:new h.Adjustment({value:Q.value,lower:Q.lower,upper:Q.upper,step_increment:Q.step,page_increment:Q.step})});o.set_value(Q.value),r.add(o);let s=new w.ExpanderRow({title:Z.advanced,subtitle:Z.advancedSubtitle,expanded:!0});for(let e of Co)s.add_row(e.kind===`switch`?new w.SwitchRow({title:e.title,active:e.active??!1}):new w.ActionRow({title:e.title}));r.add(s),t.add(r);let c=new w.PreferencesGroup({title:X.shortcuts});for(let e of To){let t=new w.ActionRow({title:e.title});t.add_suffix(new w.ShortcutLabel({accelerator:e.accelerator,valign:h.Align.CENTER})),c.add(t)}t.add(c);let l=new w.PreferencesGroup({title:X.actions}),u=new h.Box({orientation:h.Orientation.HORIZONTAL,spacing:12,homogeneous:!0,margin_top:6,margin_bottom:6}),d=new h.Button({label:Z.save});d.add_css_class(`suggested-action`),u.append(d);let f=new h.Button({label:Z.delete});f.add_css_class(`destructive-action`),u.append(f),l.add(u),t.add(l),e.append(t),this.addContent(e)}updateArgs(e){this._banner?.set_revealed(this.args.revealed)}};S.type_ensure(Oo.$gtype);const ko={stories:[Oo]},Ao={title:`Presentation/Avatar`,description:`A circular avatar that derives initials (and a colour) from a name, or shows a symbolic icon.`,controls:[{name:`text`,label:`Name`,type:i.TEXT,defaultValue:`Ada Lovelace`},{name:`size`,label:`Size`,type:i.RANGE,min:24,max:160,step:8,defaultValue:96},{name:`showInitials`,label:`Show initials`,type:i.BOOLEAN,defaultValue:!0},{name:`iconName`,label:`Fallback icon`,type:i.SELECT,options:[{label:`Person`,value:`avatar-default-symbolic`},{label:`Contact`,value:`contact-new-symbolic`},{label:`Camera`,value:`camera-photo-symbolic`}],defaultValue:`avatar-default-symbolic`}]};var jo=__exportAll({AvatarStories:()=>No,AvatarStory:()=>Mo}),Mo=class AvatarStory extends D{_avatar=null;static{S.registerClass({GTypeName:`AdwStorybookAvatar`},AvatarStory)}constructor(){super(D.fromMeta(AvatarStory.getMetadata(),`Default`))}static getMetadata(){return{...Ao,component:w.Avatar.$gtype}}initialize(){this._avatar=new w.Avatar({size:this.args.size,text:this.args.text,showInitials:this.args.showInitials,iconName:this.args.iconName}),this.addContent(this._avatar)}updateArgs(e){this._avatar&&(this._avatar.size=this.args.size,this._avatar.text=this.args.text,this._avatar.showInitials=this.args.showInitials,this._avatar.iconName=this.args.iconName)}};S.type_ensure(Mo.$gtype);const No={stories:[Mo]},Po={title:`Presentation/Banner`,description:`Adw.Banner — a full-width strip carrying a status message and an optional action button.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Metered connection — updates paused`},{name:`buttonLabel`,label:`Button label`,type:i.TEXT,defaultValue:`Resume`},{name:`revealed`,label:`Revealed`,type:i.BOOLEAN,defaultValue:!0},{name:`useMarkup`,label:`Use markup`,type:i.BOOLEAN,defaultValue:!1}]};var Fo=__exportAll({BannerStories:()=>Lo,BannerStory:()=>Io}),Io=class BannerStory extends D{_banner=null;static{S.registerClass({GTypeName:`AdwStorybookBanner`},BannerStory)}constructor(){super(D.fromMeta(BannerStory.getMetadata(),`Default`))}static getMetadata(){return{...Po,component:w.Banner.$gtype}}initialize(){this._banner=new w.Banner({title:this.args.title,buttonLabel:this.args.buttonLabel,revealed:this.args.revealed,useMarkup:this.args.useMarkup});let e=new h.Box({orientation:h.Orientation.VERTICAL,widthRequest:460});e.append(this._banner),this.addContent(e)}updateArgs(e){this._banner&&(this._banner.title=this.args.title,this._banner.buttonLabel=this.args.buttonLabel,this._banner.revealed=this.args.revealed,this._banner.useMarkup=this.args.useMarkup)}};S.type_ensure(Io.$gtype);const Lo={stories:[Io]},Ro=[14,25],zo={title:`Presentation/Calendar`,description:`Gtk.Calendar — a six-by-seven month grid with four navigation arrows. The arrows clamp the way g_date_time_add_months does, so paging from the 31st lands on the 28th, and a marked day is a day NUMBER of the shown month, so it survives a month that has no such day.`,controls:[{name:`showHeading`,label:`Heading`,type:i.BOOLEAN,defaultValue:!0},{name:`showDayNames`,label:`Day names`,type:i.BOOLEAN,defaultValue:!0},{name:`showWeekNumbers`,label:`Week numbers`,type:i.BOOLEAN,defaultValue:!0}]};var Bo=__exportAll({CalendarStories:()=>Ho,CalendarStory:()=>Vo}),Vo=class CalendarStory extends D{_calendar=null;_marked=!1;static{S.registerClass({GTypeName:`AdwStorybookCalendar`},CalendarStory)}constructor(){super(D.fromMeta(CalendarStory.getMetadata(),`Default`))}static getMetadata(){return{...zo,component:h.Calendar.$gtype}}initialize(){this._calendar=new h.Calendar({hexpand:!1}),this._calendar.date=parseIso(`2026-10-02`),this._apply(),this.addContent(this._calendar)}updateArgs(e){this._apply()}_apply(){if(this._calendar){this._calendar.show_heading=this.args.showHeading,this._calendar.show_day_names=this.args.showDayNames,this._calendar.show_week_numbers=this.args.showWeekNumbers,this._marked&&this._calendar.clear_marks();for(let e of Ro)this._calendar.mark_day(e);this._marked=!0}}};function parseIso(e){let[t,n,r]=e.split(`-`).map(Number);return l.DateTime.new_local(t,n,r,0,0,0)}S.type_ensure(Vo.$gtype);const Ho={stories:[Vo]},Uo=[{value:`de`,label:`German`},{value:`fr`,label:`French`},{value:`nl`,label:`Dutch`},{value:`pt`,label:`Portuguese`}],Wo={title:`Presentation/Column View`,description:`Gtk.ColumnView — a list view with a header and one cell per column. Clicking a sortable header sets the sort and inverts it on the next click; the view itself reorders nothing.`,controls:[{name:`showRowSeparators`,label:`Row separators`,type:i.BOOLEAN,defaultValue:!0},{name:`showColumnSeparators`,label:`Column separators`,type:i.BOOLEAN,defaultValue:!1},{name:`reorderable`,label:`Drag columns to reorder`,type:i.BOOLEAN,defaultValue:!1}]};var Go=__exportAll({ColumnViewStories:()=>qo,ColumnViewStory:()=>Ko}),Ko=class ColumnViewStory extends D{_view=null;static{S.registerClass({GTypeName:`AdwStorybookColumnView`},ColumnViewStory)}constructor(){super(D.fromMeta(ColumnViewStory.getMetadata(),`Default`))}static getMetadata(){return{...Wo,component:h.ColumnView.$gtype}}initialize(){let e=h.StringList.new(Uo.map(e=>e.label));this._view=new h.ColumnView({model:h.SingleSelection.new(e),vexpand:!0}),this._view.append_column(this._column(`Name`,e=>e.label)),this._view.append_column(this._column(`Code`,e=>e.value));let t=new h.ScrolledWindow({child:this._view,heightRequest:200,hexpand:!0});this._apply(),this.addContent(t)}updateArgs(e){this._apply()}_apply(){this._view&&(this._view.showRowSeparators=this.args.showRowSeparators,this._view.showColumnSeparators=this.args.showColumnSeparators,this._view.reorderable=this.args.reorderable)}_column(e,t){let n=new h.SignalListItemFactory;return n.connect(`setup`,(e,t)=>{t.child=new h.Label({xalign:0})}),n.connect(`bind`,(e,n)=>{let r=n,i=r.child,a=r.item.string,o=Uo.find(e=>e.label===a);i.label=o===void 0?a:t(o)}),new h.ColumnViewColumn({title:e,factory:n,expand:!0})}};S.type_ensure(Ko.$gtype);const qo={stories:[Ko]},Jo=[`Red`,`Orange`,`Yellow`,`Green`,`Blue`,`Purple`,`Teal`,`Grey`],Yo={title:`Presentation/Flow Box`,description:`Gtk.FlowBox — the same selectable rows a list box holds, reflowed into as many per line as the width fits. HORIZONTAL is the default here, unlike every GtkOrientable list base; the arrows move by visual position, so the cross-line key lands in the same column of the next line.`,controls:[{name:`selectionMode`,label:`Selection`,type:i.SELECT,options:[{label:`Single`,value:`single`},{label:`Multiple`,value:`multiple`},{label:`Browse`,value:`browse`},{label:`None`,value:`none`}],defaultValue:`multiple`},{name:`orientation`,label:`Orientation`,type:i.SELECT,options:[{label:`Horizontal`,value:`horizontal`},{label:`Vertical`,value:`vertical`}],defaultValue:`horizontal`},{name:`maxChildrenPerLine`,label:`Max children per line`,type:i.NUMBER,defaultValue:3},{name:`homogeneous`,label:`Homogeneous`,type:i.BOOLEAN,defaultValue:!1},{name:`rowSpacing`,label:`Row spacing`,type:i.NUMBER,defaultValue:6}]};var Xo=__exportAll({FlowBoxStories:()=>Qo,FlowBoxStory:()=>Zo}),Zo=class FlowBoxStory extends D{_box=null;static{S.registerClass({GTypeName:`AdwStorybookFlowBox`},FlowBoxStory)}constructor(){super(D.fromMeta(FlowBoxStory.getMetadata(),`Default`))}static getMetadata(){return{...Yo,component:h.FlowBox.$gtype}}initialize(){this._box=new h.FlowBox({hexpand:!0,vexpand:!0});for(let e of Jo)this._box.append(new h.FlowBoxChild({child:new h.Label({label:e})}));this._apply(),this.addContent(this._box)}updateArgs(e){this._apply()}_apply(){this._box&&(this._box.selection_mode=this._selectionMode(),this._box.orientation=this.args.orientation===`vertical`?h.Orientation.VERTICAL:h.Orientation.HORIZONTAL,this._box.max_children_per_line=Math.max(1,Math.trunc(this.args.maxChildrenPerLine)),this._box.homogeneous=this.args.homogeneous,this._box.row_spacing=Math.max(0,Math.trunc(this.args.rowSpacing)))}_selectionMode(){switch(this.args.selectionMode){case`single`:return h.SelectionMode.SINGLE;case`browse`:return h.SelectionMode.BROWSE;case`none`:return h.SelectionMode.NONE;default:return h.SelectionMode.MULTIPLE}}};S.type_ensure(Zo.$gtype);const Qo={stories:[Zo]},$o=[`Documents`,`Downloads`,`Music`,`Pictures`,`Videos`],es=[{label:`Single`,value:`single`},{label:`Multiple`,value:`multiple`},{label:`None`,value:`none`}],ts={title:`Presentation/List View`,description:`Gtk.ListView — one row per item of a list model, each built by a factory. The model is the portable list (ADR 0046); which Gtk.SelectionModel would have wrapped it is the selection mode.`,controls:[{name:`selectionMode`,label:`Selection`,type:i.SELECT,options:es,defaultValue:`single`},{name:`showSeparators`,label:`Separators`,type:i.BOOLEAN,defaultValue:!0},{name:`singleClickActivate`,label:`Activate on single click`,type:i.BOOLEAN,defaultValue:!1}]},ns=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`],rs={title:`Presentation/Grid View`,description:`Gtk.GridView — the same model and factory as a list view, reflowed into as many equal columns as the width fits, between min-columns and max-columns.`,controls:[{name:`maxColumns`,label:`Max columns`,type:i.NUMBER,defaultValue:4},{name:`minColumns`,label:`Min columns`,type:i.NUMBER,defaultValue:1},{name:`selectionMode`,label:`Selection`,type:i.SELECT,options:es,defaultValue:`single`}]};var is=__exportAll({GridViewStories:()=>os,GridViewStory:()=>as}),as=class GridViewStory extends D{_view=null;_model=null;static{S.registerClass({GTypeName:`AdwStorybookGridView`},GridViewStory)}constructor(){super(D.fromMeta(GridViewStory.getMetadata(),`Default`))}static getMetadata(){return{...rs,component:h.GridView.$gtype}}initialize(){this._model=h.StringList.new([...ns]);let e=new h.SignalListItemFactory;e.connect(`setup`,(e,t)=>{t.child=new h.Label({xalign:.5})}),e.connect(`bind`,(e,t)=>{let n=t,r=n.child;r.label=n.item.string}),this._view=new h.GridView({factory:e,vexpand:!0});let t=new h.ScrolledWindow({child:this._view,heightRequest:200,hexpand:!0});this._apply(),this.addContent(t)}updateArgs(e){this._apply()}_apply(){!this._view||!this._model||(this._view.model=this.args.selectionMode===`multiple`?h.MultiSelection.new(this._model):this.args.selectionMode===`none`?h.NoSelection.new(this._model):h.SingleSelection.new(this._model),this._view.minColumns=Math.max(1,this.args.minColumns),this._view.maxColumns=Math.max(this._view.minColumns,this.args.maxColumns))}};S.type_ensure(as.$gtype);const os={stories:[as]},ss=[`Documents`,`Downloads`,`Music`,`Pictures`,`Videos`],cs={title:`Presentation/List Box`,description:`Gtk.ListBox — one row per child you append, with GTK’s four selection modes. Ctrl toggles and Shift extends from the anchor the last Shift-click left behind; activate-on-single-click defaults to TRUE here, unlike Gtk.ListView’s single-click-activate.`,controls:[{name:`selectionMode`,label:`Selection`,type:i.SELECT,options:[{label:`Single`,value:`single`},{label:`Multiple`,value:`multiple`},{label:`Browse`,value:`browse`},{label:`None`,value:`none`}],defaultValue:`single`},{name:`showSeparators`,label:`Separators`,type:i.BOOLEAN,defaultValue:!0},{name:`activateOnSingleClick`,label:`Activate on single click`,type:i.BOOLEAN,defaultValue:!0},{name:`tabBehavior`,label:`Tab behaviour`,type:i.SELECT,options:[{label:`All`,value:`all`},{label:`Item`,value:`item`},{label:`Cell`,value:`cell`}],defaultValue:`all`}]};var ls=__exportAll({ListBoxStories:()=>ds,ListBoxStory:()=>us}),us=class ListBoxStory extends D{_box=null;static{S.registerClass({GTypeName:`AdwStorybookListBox`},ListBoxStory)}constructor(){super(D.fromMeta(ListBoxStory.getMetadata(),`Default`))}static getMetadata(){return{...cs,component:h.ListBox.$gtype}}initialize(){this._box=new h.ListBox({hexpand:!0});for(let e of ss)this._box.append(new h.ListBoxRow({child:new h.Label({label:e,xalign:0})}));this._apply();let e=new h.ScrolledWindow({child:this._box,heightRequest:200});this.addContent(e)}updateArgs(e){this._apply()}_apply(){this._box&&(this._box.selection_mode=this._selectionMode(),this._box.show_separators=this.args.showSeparators,this._box.activate_on_single_click=this.args.activateOnSingleClick,this._box.tab_behavior=this.args.tabBehavior)}_selectionMode(){switch(this.args.selectionMode){case`multiple`:return h.SelectionMode.MULTIPLE;case`browse`:return h.SelectionMode.BROWSE;case`none`:return h.SelectionMode.NONE;default:return h.SelectionMode.SINGLE}}};S.type_ensure(us.$gtype);const ds={stories:[us]};var fs=__exportAll({ListViewStories:()=>ms,ListViewStory:()=>ps}),ps=class ListViewStory extends D{_view=null;_model=null;static{S.registerClass({GTypeName:`AdwStorybookListView`},ListViewStory)}constructor(){super(D.fromMeta(ListViewStory.getMetadata(),`Default`))}static getMetadata(){return{...ts,component:h.ListView.$gtype}}initialize(){this._model=h.StringList.new([...$o]);let e=new h.SignalListItemFactory;e.connect(`setup`,(e,t)=>{t.child=new h.Label({xalign:0})}),e.connect(`bind`,(e,t)=>{let n=t,r=n.child;r.label=n.item.string}),this._view=new h.ListView({factory:e,vexpand:!0});let t=new h.ScrolledWindow({child:this._view,heightRequest:200,hexpand:!0});this._apply(),this.addContent(t)}updateArgs(e){this._apply()}_apply(){!this._view||!this._model||(this._view.model=this._selectionModel(this._model),this._view.showSeparators=this.args.showSeparators,this._view.singleClickActivate=this.args.singleClickActivate)}_selectionModel(e){switch(this.args.selectionMode){case`multiple`:return h.MultiSelection.new(e);case`none`:return h.NoSelection.new(e);default:return h.SingleSelection.new(e)}}};S.type_ensure(ps.$gtype);const ms={stories:[ps]},hs=[{label:`Single`,accelerator:`<Control>C`},{label:`Modifier order`,accelerator:`<Shift><Control>a`},{label:`Alternatives`,accelerator:`<Shift>A Home`},{label:`Range`,accelerator:`<Alt>1...9`},{label:`In sequence`,accelerator:`<Control>C+<Control>X`},{label:`Together`,accelerator:`Control_L&Control_R`},{label:`Nested`,accelerator:`<Alt>1...9 <Alt>0`},{label:`Unset`,accelerator:``}],gs={title:`Presentation/Shortcut Label`,description:`Adw.ShortcutLabel — an accelerator drawn as keycaps. The four grammar levels: alternatives (space), a range (...), pressed in sequence (+), and pressed together (&).`,controls:[{name:`accelerator`,label:`Accelerator`,type:i.SELECT,options:[{label:`Ctrl+C`,value:`<Control>C`},{label:`Modifier order (Shift+Ctrl+A)`,value:`<Shift><Control>a`},{label:`Alternatives (Shift+A / Home)`,value:`<Shift>A Home`},{label:`Range (Alt+1…9)`,value:`<Alt>1...9`},{label:`In sequence (Ctrl+C → Ctrl+X)`,value:`<Control>C+<Control>X`},{label:`Together (Ctrl L + Ctrl R)`,value:`Control_L&Control_R`},{label:`Nested (Alt+1…9 / Alt+0)`,value:`<Alt>1...9 <Alt>0`},{label:`Glyph key (Ctrl+Space)`,value:`<Control>space`},{label:`Arrow key (Left)`,value:`Left`},{label:`Unset — shows the placeholder`,value:``}],defaultValue:`<Control>C`},{name:`disabledText`,label:`Placeholder`,type:i.TEXT,defaultValue:`Disabled`}]},_s={title:`Presentation/Shortcut Label (All Levels)`,description:`Every Adw.ShortcutLabel grammar level at once: alternatives (space), a range (...), pressed in sequence (+), pressed together (&) — plus GTK's fixed keycap order and the disabled placeholder.`,controls:[{name:`disabledText`,label:`Placeholder`,type:i.TEXT,defaultValue:`Disabled`}]};var vs=__exportAll({ShortcutLabelLevelsStory:()=>bs,ShortcutLabelStories:()=>xs,ShortcutLabelStory:()=>ys}),ys=class ShortcutLabelStory extends D{_widget=null;static{S.registerClass({GTypeName:`AdwStorybookShortcutLabel`},ShortcutLabelStory)}constructor(){super(D.fromMeta(ShortcutLabelStory.getMetadata(),`Default`))}static getMetadata(){return{...gs,component:w.ShortcutLabel.$gtype}}initialize(){this._widget=new w.ShortcutLabel({accelerator:this.args.accelerator,disabledText:this.args.disabledText,halign:h.Align.CENTER,valign:h.Align.CENTER}),this.addContent(this._widget)}updateArgs(e){this._widget&&(this._widget.disabledText=this.args.disabledText,this._widget.accelerator=this.args.accelerator)}};S.type_ensure(ys.$gtype);var bs=class ShortcutLabelLevelsStory extends D{_widgets=[];static{S.registerClass({GTypeName:`AdwStorybookShortcutLabelLevels`},ShortcutLabelLevelsStory)}constructor(){super(D.fromMeta(ShortcutLabelLevelsStory.getMetadata(),`Default`))}static getMetadata(){return{..._s,component:w.ShortcutLabel.$gtype}}initialize(){let e=new h.Grid({row_spacing:12,column_spacing:24});for(let[t,n]of hs.entries()){let r=new h.Label({label:n.label,halign:h.Align.START});r.add_css_class(`dimmed`),e.attach(r,0,t,1,1);let i=new w.ShortcutLabel({accelerator:n.accelerator,disabledText:this.args.disabledText,halign:h.Align.END,hexpand:!0});e.attach(i,1,t,1,1),this._widgets.push(i)}this.addContent(e)}updateArgs(e){for(let e of this._widgets)e.disabledText=this.args.disabledText}};S.type_ensure(bs.$gtype);const xs={stories:[ys,bs]},Ss={title:`Presentation/Spinner`,description:`Adw.Spinner — a lightweight loading indicator that spins continuously while visible.`,controls:[{name:`size`,label:`Size`,type:i.RANGE,min:16,max:64,step:4,defaultValue:48}]};var Cs=__exportAll({SpinnerStories:()=>Ts,SpinnerStory:()=>ws}),ws=class SpinnerStory extends D{_spinner=null;static{S.registerClass({GTypeName:`AdwStorybookSpinner`},SpinnerStory)}constructor(){super(D.fromMeta(SpinnerStory.getMetadata(),`Default`))}static getMetadata(){return{...Ss,component:w.Spinner.$gtype}}initialize(){let e=this.args.size;this._spinner=new w.Spinner({widthRequest:e,heightRequest:e,halign:h.Align.CENTER,valign:h.Align.CENTER}),this.addContent(this._spinner)}updateArgs(e){if(!this._spinner)return;let t=this.args.size;this._spinner.widthRequest=t,this._spinner.heightRequest=t}};S.type_ensure(ws.$gtype);const Ts={stories:[ws]},Es={title:`Presentation/Status Page`,description:`Adw.StatusPage — a full-page empty state with an icon, title, description and optional action.`,controls:[{name:`iconName`,label:`Icon`,type:i.SELECT,options:[{label:`Folder`,value:`folder-symbolic`},{label:`Mail`,value:`mail-unread-symbolic`},{label:`Search`,value:`system-search-symbolic`},{label:`Star`,value:`starred-symbolic`}],defaultValue:`folder-symbolic`},{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`No Documents`},{name:`description`,label:`Description`,type:i.TEXT,defaultValue:`Documents you create or open will appear here.`}]};var Ds=__exportAll({StatusPageStories:()=>ks,StatusPageStory:()=>Os}),Os=class StatusPageStory extends D{_statusPage=null;static{S.registerClass({GTypeName:`AdwStorybookStatusPage`},StatusPageStory)}constructor(){super(D.fromMeta(StatusPageStory.getMetadata(),`Default`))}static getMetadata(){return{...Es,component:w.StatusPage.$gtype}}initialize(){let e=new h.Button({label:`New Document`,halign:h.Align.CENTER,cssClasses:[`pill`,`suggested-action`]});this._statusPage=new w.StatusPage({iconName:this.args.iconName,title:this.args.title,description:this.args.description,child:e,widthRequest:460,heightRequest:320}),this.addContent(this._statusPage)}updateArgs(e){this._statusPage&&(this._statusPage.iconName=this.args.iconName,this._statusPage.title=this.args.title,this._statusPage.description=this.args.description)}};S.type_ensure(Os.$gtype);const ks={stories:[Os]},As={Pictures:[`Holiday`,`Screenshots`],Music:[`Albums`],Notes:[]},js={title:`Presentation/Tree Expander`,description:`Gtk.TreeExpander — the indent and the disclosure arrow a tree row wears in front of its contents. A leaf takes one indent in place of the arrow, so its text lines up with its siblings.`,controls:[{name:`expanded`,label:`Expanded`,type:i.BOOLEAN,defaultValue:!0},{name:`hideExpander`,label:`Hide the arrow`,type:i.BOOLEAN,defaultValue:!1},{name:`indentForIcon`,label:`Indent leaves by an arrow`,type:i.BOOLEAN,defaultValue:!0}]};var Ms=__exportAll({TreeExpanderStories:()=>Ps,TreeExpanderStory:()=>Ns}),Ns=class TreeExpanderStory extends D{_view=null;_tree=null;_expanders=new Set;static{S.registerClass({GTypeName:`AdwStorybookTreeExpander`},TreeExpanderStory)}constructor(){super(D.fromMeta(TreeExpanderStory.getMetadata(),`Default`))}static getMetadata(){return{...js,component:h.TreeExpander.$gtype}}initialize(){let e=h.StringList.new(Object.keys(As));this._tree=h.TreeListModel.new(e,!1,!1,e=>{let t=As[e.string]??[];return t.length===0?null:h.StringList.new([...t])});let t=new h.SignalListItemFactory;t.connect(`setup`,(e,t)=>{let n=t;n.focusable=!1;let r=new h.TreeExpander;r.child=new h.Label({xalign:0}),n.child=r,this._expanders.add(r)}),t.connect(`teardown`,(e,t)=>{let n=t.child;n!==null&&this._expanders.delete(n)}),t.connect(`bind`,(e,t)=>{let n=t,r=n.child,i=n.item;r.listRow=i,r.child.label=i.item.string,this._applyTo(r)}),this._view=new h.ListView({model:h.SingleSelection.new(this._tree),factory:t,vexpand:!0});let n=new h.ScrolledWindow({child:this._view,heightRequest:200,hexpand:!0});this.addContent(n),this._apply()}updateArgs(e){this._apply()}_apply(){if(this._tree!==null){for(let e=0;e<this._tree.get_n_items();e++){let t=this._tree.get_row(e);t!==null&&t.depth===0&&(t.expanded=this.args.expanded)}for(let e of this._expanders)this._applyTo(e)}}_applyTo(e){e.hideExpander=this.args.hideExpander,e.indentForIcon=this.args.indentForIcon}};S.type_ensure(Ns.$gtype);const Ps={stories:[Ns]},Fs={title:`Presentation/WindowHandle`,description:`Gtk.WindowHandle — the titlebar strip. Dragging it moves the window; a double click, a middle click and a right click raise the window actions the compositor (or, here, the titlebar settings) names.`,controls:[{name:`action`,label:`Double-click action`,type:i.SELECT,options:[{label:`Toggle maximize`,value:`toggle-maximize`},{label:`Minimize`,value:`minimize`},{label:`Menu`,value:`menu`},{label:`None`,value:`none`}],defaultValue:`toggle-maximize`}]};var Is=__exportAll({WindowHandleStories:()=>Rs,WindowHandleStory:()=>Ls}),Ls=class WindowHandleStory extends D{_handle=null;static{S.registerClass({GTypeName:`AdwStorybookWindowHandle`},WindowHandleStory)}constructor(){super(D.fromMeta(WindowHandleStory.getMetadata(),`Default`))}static getMetadata(){return{...Fs,component:h.WindowHandle.$gtype}}initialize(){let e=new w.HeaderBar;e.set_title_widget(new w.WindowTitle({title:`Notes`})),this._handle=new h.WindowHandle({child:e,halign:h.Align.CENTER}),this._apply(),this.addContent(this._handle)}updateArgs(e){this._apply()}_apply(){this.args.action}};S.type_ensure(Ls.$gtype);const Rs={stories:[Ls]},zs={title:`Presentation/Window Title`,description:`Adw.WindowTitle — a compact title/subtitle widget intended for a window or header bar.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Inbox`},{name:`subtitle`,label:`Subtitle`,type:i.TEXT,defaultValue:`3 unread messages`}]};var Bs=__exportAll({WindowTitleStories:()=>Hs,WindowTitleStory:()=>Vs}),Vs=class WindowTitleStory extends D{_windowTitle=null;static{S.registerClass({GTypeName:`AdwStorybookWindowTitle`},WindowTitleStory)}constructor(){super(D.fromMeta(WindowTitleStory.getMetadata(),`Default`))}static getMetadata(){return{...zs,component:w.WindowTitle.$gtype}}initialize(){this._windowTitle=new w.WindowTitle({title:this.args.title,subtitle:this.args.subtitle}),this.addContent(this._windowTitle)}updateArgs(e){this._windowTitle&&(this._windowTitle.title=this.args.title,this._windowTitle.subtitle=this.args.subtitle)}};S.type_ensure(Vs.$gtype);const Hs={stories:[Vs]},Us={title:`Boxed Lists/Action Row`,description:`Adw.ActionRow — a preferences row with a title/subtitle, a prefix icon and a suffix button, shown inside a boxed list.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Wi-Fi`},{name:`subtitle`,label:`Subtitle`,type:i.TEXT,defaultValue:`Connected to Highgarden 5GHz`},{name:`iconName`,label:`Prefix icon`,type:i.SELECT,options:[{label:`Network`,value:`network-wireless-symbolic`},{label:`Folder`,value:`folder-symbolic`},{label:`Starred`,value:`starred-symbolic`}],defaultValue:`network-wireless-symbolic`},{name:`activatable`,label:`Activatable`,type:i.BOOLEAN,defaultValue:!0}]};var Ws=__exportAll({ActionRowStories:()=>Ks,ActionRowStory:()=>Gs}),Gs=class ActionRowStory extends D{_row=null;_icon=null;_button=null;static{S.registerClass({GTypeName:`AdwStorybookActionRow`},ActionRowStory)}constructor(){super(D.fromMeta(ActionRowStory.getMetadata(),`Default`))}static getMetadata(){return{...Us,component:w.ActionRow.$gtype}}initialize(){this._row=new w.ActionRow({title:this.args.title,subtitle:this.args.subtitle}),this._icon=new h.Image({iconName:this.args.iconName}),this._row.add_prefix(this._icon),this._button=new h.Button({iconName:`go-next-symbolic`,valign:h.Align.CENTER}),this._button.add_css_class(`flat`),this._row.add_suffix(this._button),this._row.activatableWidget=this._button,this._row.activatable=this.args.activatable;let e=new w.PreferencesGroup;e.add(this._row);let t=new w.Clamp({maximumSize:400,child:e});this.addContent(t)}updateArgs(e){!this._row||!this._icon||(this._row.title=this.args.title,this._row.subtitle=this.args.subtitle,this._icon.iconName=this.args.iconName,this._row.activatable=this.args.activatable)}};S.type_ensure(Gs.$gtype);const Ks={stories:[Gs]},qs={title:`Boxed Lists/Button Row`,description:`Adw.ButtonRow — a full-width row that acts as a button, with an optional icon and style class.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Add account`},{name:`startIconName`,label:`Start icon`,type:i.SELECT,options:[{label:`Add`,value:`list-add-symbolic`},{label:`Trash`,value:`user-trash-symbolic`},{label:`None`,value:``}],defaultValue:`list-add-symbolic`},{name:`style`,label:`Style`,type:i.SELECT,options:[{label:`None`,value:`none`},{label:`Suggested`,value:`suggested-action`},{label:`Destructive`,value:`destructive-action`}],defaultValue:`suggested-action`}]};var Js=__exportAll({ButtonRowStories:()=>Zs,ButtonRowStory:()=>Xs});const Ys=[`suggested-action`,`destructive-action`];var Xs=class ButtonRowStory extends D{_row=null;static{S.registerClass({GTypeName:`AdwStorybookButtonRow`},ButtonRowStory)}constructor(){super(D.fromMeta(ButtonRowStory.getMetadata(),`Default`))}static getMetadata(){return{...qs,component:w.ButtonRow.$gtype}}initialize(){this._row=new w.ButtonRow({title:this.args.title,startIconName:this.args.startIconName}),this._applyStyle(this.args.style);let e=new w.PreferencesGroup;e.add(this._row);let t=new w.Clamp({maximumSize:400,child:e});this.addContent(t)}_applyStyle(e){if(this._row){for(let e of Ys)this._row.remove_css_class(e);e!==`none`&&this._row.add_css_class(e)}}updateArgs(e){this._row&&(this._row.title=this.args.title,this._row.startIconName=this.args.startIconName,this._applyStyle(this.args.style))}};S.type_ensure(Xs.$gtype);const Zs={stories:[Xs]},Qs=[`Blue`,`Teal`,`Green`,`Orange`,`Purple`],$s={title:`Boxed Lists/Combo Row`,description:`Adw.ComboRow — a preferences row with an inline drop-down backed by a Gtk.StringList.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Accent colour`},{name:`subtitle`,label:`Subtitle`,type:i.TEXT,defaultValue:`Used to highlight selected items`},{name:`selected`,label:`Selected`,type:i.NUMBER,min:0,max:4,step:1,defaultValue:1}]};var ec=__exportAll({ComboRowStories:()=>nc,ComboRowStory:()=>tc}),tc=class ComboRowStory extends D{_row=null;static{S.registerClass({GTypeName:`AdwStorybookComboRow`},ComboRowStory)}constructor(){super(D.fromMeta(ComboRowStory.getMetadata(),`Default`))}static getMetadata(){return{...$s,component:w.ComboRow.$gtype}}initialize(){this._row=new w.ComboRow({title:this.args.title,subtitle:this.args.subtitle,model:new h.StringList({strings:[...Qs]}),selected:this.args.selected});let e=new w.PreferencesGroup;e.add(this._row);let t=new w.Clamp({maximumSize:400,child:e});this.addContent(t)}updateArgs(e){this._row&&(this._row.title=this.args.title,this._row.subtitle=this.args.subtitle,this._row.selected=this.args.selected)}};S.type_ensure(tc.$gtype);const nc={stories:[tc]},rc={title:`Boxed Lists/Entry Row`,description:`Adw.EntryRow — a preferences row whose title doubles as placeholder text for an inline entry.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Display name`},{name:`text`,label:`Text`,type:i.TEXT,defaultValue:`Ada Lovelace`},{name:`showApplyButton`,label:`Show apply button`,type:i.BOOLEAN,defaultValue:!0}]};var ic=__exportAll({EntryRowStories:()=>oc,EntryRowStory:()=>ac}),ac=class EntryRowStory extends D{_row=null;static{S.registerClass({GTypeName:`AdwStorybookEntryRow`},EntryRowStory)}constructor(){super(D.fromMeta(EntryRowStory.getMetadata(),`Default`))}static getMetadata(){return{...rc,component:w.EntryRow.$gtype}}initialize(){this._row=new w.EntryRow({title:this.args.title,text:this.args.text,showApplyButton:this.args.showApplyButton});let e=new w.PreferencesGroup;e.add(this._row);let t=new w.Clamp({maximumSize:400,child:e});this.addContent(t)}updateArgs(e){this._row&&(this._row.title=this.args.title,this._row.text=this.args.text,this._row.showApplyButton=this.args.showApplyButton)}};S.type_ensure(ac.$gtype);const oc={stories:[ac]},sc={title:`Boxed Lists/Expander Row`,description:`Adw.ExpanderRow — a preferences row that discloses nested rows and can carry an enable switch.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Proxy settings`},{name:`subtitle`,label:`Subtitle`,type:i.TEXT,defaultValue:`Route traffic through a custom proxy`},{name:`expanded`,label:`Expanded`,type:i.BOOLEAN,defaultValue:!0},{name:`showEnableSwitch`,label:`Show enable switch`,type:i.BOOLEAN,defaultValue:!1}]};var cc=__exportAll({ExpanderRowStories:()=>uc,ExpanderRowStory:()=>lc}),lc=class ExpanderRowStory extends D{_row=null;static{S.registerClass({GTypeName:`AdwStorybookExpanderRow`},ExpanderRowStory)}constructor(){super(D.fromMeta(ExpanderRowStory.getMetadata(),`Default`))}static getMetadata(){return{...sc,component:w.ExpanderRow.$gtype}}initialize(){this._row=new w.ExpanderRow({title:this.args.title,subtitle:this.args.subtitle,expanded:this.args.expanded,showEnableSwitch:this.args.showEnableSwitch}),this._row.add_row(new w.EntryRow({title:`Host`,text:`proxy.example.com`})),this._row.add_row(new w.SwitchRow({title:`Use authentication`,active:!1}));let e=new w.PreferencesGroup;e.add(this._row);let t=new w.Clamp({maximumSize:400,child:e});this.addContent(t)}updateArgs(e){this._row&&(this._row.title=this.args.title,this._row.subtitle=this.args.subtitle,this._row.expanded=this.args.expanded,this._row.showEnableSwitch=this.args.showEnableSwitch)}};S.type_ensure(lc.$gtype);const uc={stories:[lc]},dc={title:`Boxed Lists/Password Entry Row`,description:`Adw.PasswordEntryRow — an entry row that masks its contents and shows a peek toggle.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Password`},{name:`text`,label:`Text`,type:i.TEXT,defaultValue:`correct-horse-battery`}]};var fc=__exportAll({PasswordEntryRowStories:()=>mc,PasswordEntryRowStory:()=>pc}),pc=class PasswordEntryRowStory extends D{_row=null;static{S.registerClass({GTypeName:`AdwStorybookPasswordEntryRow`},PasswordEntryRowStory)}constructor(){super(D.fromMeta(PasswordEntryRowStory.getMetadata(),`Default`))}static getMetadata(){return{...dc,component:w.PasswordEntryRow.$gtype}}initialize(){this._row=new w.PasswordEntryRow({title:this.args.title,text:this.args.text});let e=new w.PreferencesGroup;e.add(this._row);let t=new w.Clamp({maximumSize:400,child:e});this.addContent(t)}updateArgs(e){this._row&&(this._row.title=this.args.title,this._row.text=this.args.text)}};S.type_ensure(pc.$gtype);const mc={stories:[pc]},hc={title:`Boxed Lists/Preferences Group`,description:`Adw.PreferencesGroup — the boxed-list container that gathers a title, description, header-suffix widget and rows.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Account`},{name:`description`,label:`Description`,type:i.TEXT,defaultValue:`Manage how this device signs in and syncs.`}]};var gc=__exportAll({PreferencesGroupStories:()=>vc,PreferencesGroupStory:()=>_c}),_c=class PreferencesGroupStory extends D{_prefsGroup=null;static{S.registerClass({GTypeName:`AdwStorybookPreferencesGroup`},PreferencesGroupStory)}constructor(){super(D.fromMeta(PreferencesGroupStory.getMetadata(),`Default`))}static getMetadata(){return{...hc,component:w.PreferencesGroup.$gtype}}initialize(){let e=new h.Button({label:`Sign out`,valign:h.Align.CENTER});e.add_css_class(`flat`),this._prefsGroup=new w.PreferencesGroup({title:this.args.title,description:this.args.description,headerSuffix:e});let t=new w.EntryRow({title:`Display name`,text:`Grace Hopper`});this._prefsGroup.add(t);let n=new w.SwitchRow({title:`Sync over Wi-Fi only`,subtitle:`Avoid using mobile data for backups`,active:!0});this._prefsGroup.add(n);let r=new w.ComboRow({title:`Region`,model:new h.StringList({strings:[`Europe`,`Americas`,`Asia`,`Oceania`]}),selected:0});this._prefsGroup.add(r);let i=new w.Clamp({maximumSize:400,child:this._prefsGroup});this.addContent(i)}updateArgs(e){this._prefsGroup&&(this._prefsGroup.title=this.args.title,this._prefsGroup.description=this.args.description)}};S.type_ensure(_c.$gtype);const vc={stories:[_c]},yc={title:`Boxed Lists/Preferences Row`,description:`Adw.PreferencesRow — the base of every boxed-list row: a list row with a title that the preferences dialog searches. The title can carry Pango markup and be made selectable.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`A <b>plain</b> preferences row`},{name:`useMarkup`,label:`Use markup`,type:i.BOOLEAN,defaultValue:!0},{name:`titleSelectable`,label:`Title selectable`,type:i.BOOLEAN,defaultValue:!1}]};var bc=__exportAll({PreferencesRowStories:()=>Sc,PreferencesRowStory:()=>xc}),xc=class PreferencesRowStory extends D{_row=null;static{S.registerClass({GTypeName:`AdwStorybookPreferencesRow`},PreferencesRowStory)}constructor(){super(D.fromMeta(PreferencesRowStory.getMetadata(),`Default`))}static getMetadata(){return{...yc,component:w.PreferencesRow.$gtype}}initialize(){this._row=new w.PreferencesRow,this._apply();let e=new w.PreferencesGroup;e.add(this._row);let t=new w.Clamp({maximumSize:400,child:e});this.addContent(t)}updateArgs(e){this._apply()}_apply(){this._row&&(this._row.title=this.args.title,this._row.useMarkup=this.args.useMarkup,this._row.titleSelectable=this.args.titleSelectable)}};S.type_ensure(xc.$gtype);const Sc={stories:[xc]},Cc={title:`Boxed Lists/Spin Row`,description:`Adw.SpinRow — a preferences row with an inline spin button over a numeric adjustment.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Font size`},{name:`value`,label:`Value`,type:i.NUMBER,min:0,max:100,step:1,defaultValue:16},{name:`digits`,label:`Digits`,type:i.NUMBER,min:0,max:4,step:1,defaultValue:0}]};var wc=__exportAll({SpinRowStories:()=>Ec,SpinRowStory:()=>Tc}),Tc=class SpinRowStory extends D{_row=null;static{S.registerClass({GTypeName:`AdwStorybookSpinRow`},SpinRowStory)}constructor(){super(D.fromMeta(SpinRowStory.getMetadata(),`Default`))}static getMetadata(){return{...Cc,component:w.SpinRow.$gtype}}initialize(){this._row=new w.SpinRow({title:this.args.title,adjustment:new h.Adjustment({lower:0,upper:100,value:this.args.value,stepIncrement:1,pageIncrement:10}),digits:this.args.digits});let e=new w.PreferencesGroup;e.add(this._row);let t=new w.Clamp({maximumSize:400,child:e});this.addContent(t)}updateArgs(e){this._row&&(this._row.title=this.args.title,this._row.value=this.args.value,this._row.digits=this.args.digits)}};S.type_ensure(Tc.$gtype);const Ec={stories:[Tc]},Dc={title:`Boxed Lists/Switch Row`,description:`Adw.SwitchRow — a preferences row with a trailing switch, shown inside a boxed list.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Automatic updates`},{name:`subtitle`,label:`Subtitle`,type:i.TEXT,defaultValue:`Download and install updates without asking`},{name:`active`,label:`Active`,type:i.BOOLEAN,defaultValue:!0}]};var Oc=__exportAll({SwitchRowStories:()=>Ac,SwitchRowStory:()=>kc}),kc=class SwitchRowStory extends D{_row=null;static{S.registerClass({GTypeName:`AdwStorybookSwitchRow`},SwitchRowStory)}constructor(){super(D.fromMeta(SwitchRowStory.getMetadata(),`Default`))}static getMetadata(){return{...Dc,component:w.SwitchRow.$gtype}}initialize(){this._row=new w.SwitchRow({title:this.args.title,subtitle:this.args.subtitle,active:this.args.active});let e=new w.PreferencesGroup;e.add(this._row);let t=new w.Clamp({maximumSize:400,child:e});this.addContent(t)}updateArgs(e){this._row&&(this._row.title=this.args.title,this._row.subtitle=this.args.subtitle,this._row.active=this.args.active)}};S.type_ensure(kc.$gtype);const Ac={stories:[kc]},jc={title:`Text/Editable Label`,description:`Gtk.EditableLabel — a label you click and edit in place. Enter starts editing, Enter commits, Escape discards, and editable=false leaves it a label; the draft lives in the entry, not in the label.`,controls:[{name:`text`,label:`Text`,type:i.TEXT,defaultValue:`Ada Lovelace`},{name:`editable`,label:`Editable`,type:i.BOOLEAN,defaultValue:!0},{name:`editing`,label:`Editing`,type:i.BOOLEAN,defaultValue:!1}]};var Mc=__exportAll({EditableLabelStories:()=>Pc,EditableLabelStory:()=>Nc}),Nc=class EditableLabelStory extends D{_label=null;static{S.registerClass({GTypeName:`AdwStorybookEditableLabel`},EditableLabelStory)}constructor(){super(D.fromMeta(EditableLabelStory.getMetadata(),`Default`))}static getMetadata(){return{...jc,component:h.EditableLabel.$gtype}}initialize(){this._label=new h.EditableLabel({halign:h.Align.CENTER}),this._apply(),this.addContent(this._label)}updateArgs(e){this._apply()}_apply(){this._label&&(this._label.editing||(this._label.text=this.args.text),this._label.editable=this.args.editable,this._label.editing=this.args.editing)}};S.type_ensure(Nc.$gtype);const Pc={stories:[Nc]},Fc={title:`Text/Search Bar`,description:`Gtk.SearchBar — the strip that reveals a search entry when search starts. The property IS the revealer's reveal-child, so one boolean decides both whether the strip is shown and whether the search is on; hiding it clears the entry.`,controls:[{name:`searchModeEnabled`,label:`Search mode`,type:i.BOOLEAN,defaultValue:!1},{name:`showCloseButton`,label:`Close button`,type:i.BOOLEAN,defaultValue:!0}]};var Ic=__exportAll({SearchBarStories:()=>Rc,SearchBarStory:()=>Lc}),Lc=class SearchBarStory extends D{_bar=null;_entry=null;static{S.registerClass({GTypeName:`AdwStorybookSearchBar`},SearchBarStory)}constructor(){super(D.fromMeta(SearchBarStory.getMetadata(),`Default`))}static getMetadata(){return{...Fc,component:h.SearchBar.$gtype}}initialize(){this._entry=new h.SearchEntry({hexpand:!0}),this._bar=new h.SearchBar({child:this._entry}),this._apply(),this.addContent(this._bar)}updateArgs(e){this._apply()}_apply(){this._bar&&(this._bar.search_mode_enabled=this.args.searchModeEnabled,this._bar.show_close_button=this.args.showCloseButton)}};S.type_ensure(Lc.$gtype);const Rc={stories:[Lc]},zc={title:`Text/Text View`,description:`Gtk.TextView — the multi-line editor. Its text lives in a Gtk.TextBuffer rather than in a property, wrap-mode and justification are Pango's, and accepts-tab defaults to TRUE, which is the opposite of a browser's.`,controls:[{name:`text`,label:`Text`,type:i.TEXT,defaultValue:`A text view holds as many lines as it is given.
|
|
339
|
-
Tab inserts a tab character.`},{name:`wrapMode`,label:`Wrap mode`,type:i.SELECT,options:[{label:`None`,value:`none`},{label:`Char`,value:`char`},{label:`Word`,value:`word`},{label:`Word or char`,value:`word-char`}],defaultValue:`none`},{name:`justification`,label:`Justification`,type:i.SELECT,options:[{label:`Left`,value:`left`},{label:`Right`,value:`right`},{label:`Center`,value:`center`},{label:`Fill`,value:`fill`}],defaultValue:`left`},{name:`monospace`,label:`Monospace`,type:i.BOOLEAN,defaultValue:!1},{name:`acceptsTab`,label:`Tab inserts a tab`,type:i.BOOLEAN,defaultValue:!0},{name:`cursorVisible`,label:`Show cursor`,type:i.BOOLEAN,defaultValue:!0},{name:`topMargin`,label:`Top margin`,type:i.NUMBER,defaultValue:6}]};var Bc=__exportAll({TextViewStories:()=>Hc,TextViewStory:()=>Vc}),Vc=class TextViewStory extends D{_buffer=null;_view=null;static{S.registerClass({GTypeName:`AdwStorybookTextView`},TextViewStory)}constructor(){super(D.fromMeta(TextViewStory.getMetadata(),`Default`))}static getMetadata(){return{...zc,component:h.TextView.$gtype}}initialize(){this._buffer=new h.TextBuffer,this._view=new h.TextView({buffer:this._buffer,hexpand:!0,vexpand:!1,top_margin:6});let e=new h.ScrolledWindow({hscrollbar_policy:h.PolicyType.AUTOMATIC,vscrollbar_policy:h.PolicyType.AUTOMATIC,hexpand:!0,vexpand:!1,child:this._view});e.set_size_request(320,-1),this._apply(),this.addContent(e)}updateArgs(e){this._apply()}_apply(){if(!this._buffer||!this._view)return;let e=this.args.text;this._buffer.text!==e&&(this._buffer.text=e),this._view.wrap_mode=this.args.wrapMode??`none`,this._view.justification=this.args.justification??`left`,this._view.monospace=this.args.monospace,this._view.accepts_tab=this.args.acceptsTab,this._view.cursor_visible=this.args.cursorVisible,this._view.top_margin=Number(this.args.topMargin??0)}};S.type_ensure(Vc.$gtype);const Hc={stories:[Vc]},Uc={title:`Text/Text`,description:`Gtk.Text — the single-line text widget every Gtk.Entry is built on. Standalone it is a field with a placeholder and a length limit; visibility=false masks it, propagate-text-width grows it with its text.`,controls:[{name:`text`,label:`Text`,type:i.TEXT,defaultValue:`Ada Lovelace`},{name:`placeholderText`,label:`Placeholder`,type:i.TEXT,defaultValue:``},{name:`editable`,label:`Editable`,type:i.BOOLEAN,defaultValue:!0},{name:`visibility`,label:`Visible`,type:i.BOOLEAN,defaultValue:!0},{name:`maxLength`,label:`Max length (0 = none)`,type:i.NUMBER,defaultValue:0},{name:`propagateTextWidth`,label:`Grow with text`,type:i.BOOLEAN,defaultValue:!1}]};var Wc=__exportAll({TextStories:()=>Kc,TextStory:()=>Gc}),Gc=class TextStory extends D{_text=null;static{S.registerClass({GTypeName:`AdwStorybookText`},TextStory)}constructor(){super(D.fromMeta(TextStory.getMetadata(),`Default`))}static getMetadata(){return{...Uc,component:h.Text.$gtype}}initialize(){this._text=new h.Text({halign:h.Align.CENTER}),this._apply(),this.addContent(this._text)}updateArgs(e){this._apply()}_apply(){this._text&&(this._text.text=this.args.text,this._text.placeholder_text=this.args.placeholderText,this._text.editable=this.args.editable,this._text.visibility=this.args.visibility,this._text.max_length=Number(this.args.maxLength??0),this._text.propagate_text_width=this.args.propagateTextWidth)}};S.type_ensure(Gc.$gtype);const Kc={stories:[Gc]},qc=[{name:`allowScrollWheel`,label:`Allow scroll wheel`,type:i.BOOLEAN,defaultValue:!0},{name:`allowLongSwipes`,label:`Allow long swipes`,type:i.BOOLEAN,defaultValue:!1}],Jc={title:`View Switching/Carousel (Dots)`,description:`Adw.Carousel — a horizontally swipeable pager with three pages, paired with Adw.CarouselIndicatorDots.`,controls:qc},Yc={title:`View Switching/Carousel (Lines)`,description:`Adw.Carousel — the same swipeable pager paired with Adw.CarouselIndicatorLines instead of dots.`,controls:qc};var Xc=__exportAll({CarouselDotsStory:()=>Qc,CarouselLinesStory:()=>$c,CarouselStories:()=>el});const Zc=[{title:`Welcome`,css:`accent`},{title:`Discover`,css:`success`},{title:`Get started`,css:`warning`}];function buildPage(e,t){let n=new h.Box({orientation:h.Orientation.VERTICAL,halign:h.Align.CENTER,valign:h.Align.CENTER,widthRequest:440,heightRequest:260});n.add_css_class(`card`),n.add_css_class(t);let r=new h.Label({label:e,vexpand:!0,valign:h.Align.CENTER});return r.add_css_class(`title-1`),n.append(r),n}var Qc=class CarouselDotsStory extends D{_carousel=null;static{S.registerClass({GTypeName:`AdwStorybookCarouselDots`},CarouselDotsStory)}constructor(){super(D.fromMeta(CarouselDotsStory.getMetadata(),`Default`))}static getMetadata(){return{...Jc,component:w.Carousel.$gtype}}initialize(){this._carousel=new w.Carousel({allowScrollWheel:this.args.allowScrollWheel,allowLongSwipes:this.args.allowLongSwipes,vexpand:!0});for(let e of Zc)this._carousel.append(buildPage(e.title,e.css));let e=new w.CarouselIndicatorDots({carousel:this._carousel}),t=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12,widthRequest:480,heightRequest:340});t.append(this._carousel),t.append(e),this.addContent(t)}updateArgs(e){this._carousel&&(this._carousel.allowScrollWheel=this.args.allowScrollWheel,this._carousel.allowLongSwipes=this.args.allowLongSwipes)}};S.type_ensure(Qc.$gtype);var $c=class CarouselLinesStory extends D{_carousel=null;static{S.registerClass({GTypeName:`AdwStorybookCarouselLines`},CarouselLinesStory)}constructor(){super(D.fromMeta(CarouselLinesStory.getMetadata(),`Default`))}static getMetadata(){return{...Yc,component:w.Carousel.$gtype}}initialize(){this._carousel=new w.Carousel({allowScrollWheel:this.args.allowScrollWheel,allowLongSwipes:this.args.allowLongSwipes,vexpand:!0});for(let e of Zc)this._carousel.append(buildPage(e.title,e.css));let e=new w.CarouselIndicatorLines({carousel:this._carousel}),t=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12,widthRequest:480,heightRequest:340});t.append(this._carousel),t.append(e),this.addContent(t)}updateArgs(e){this._carousel&&(this._carousel.allowScrollWheel=this.args.allowScrollWheel,this._carousel.allowLongSwipes=this.args.allowLongSwipes)}};S.type_ensure($c.$gtype);const el={stories:[Qc,$c]},tl={title:`View Switching/Inline View Switcher`,description:`Adw.InlineViewSwitcher — a compact inline switcher that can show labels, icons, or both for an Adw.ViewStack.`,controls:[{name:`displayMode`,label:`Display mode`,type:i.SELECT,options:[{label:`Labels`,value:`labels`},{label:`Icons`,value:`icons`},{label:`Both`,value:`both`}],defaultValue:`both`}]};var nl=__exportAll({InlineViewSwitcherStories:()=>il,InlineViewSwitcherStory:()=>rl}),rl=class InlineViewSwitcherStory extends D{_switcher=null;static{S.registerClass({GTypeName:`AdwStorybookInlineViewSwitcher`},InlineViewSwitcherStory)}constructor(){super(D.fromMeta(InlineViewSwitcherStory.getMetadata(),`Default`))}static getMetadata(){return{...tl,component:w.InlineViewSwitcher.$gtype}}buildPage(e,t,n){return new w.StatusPage({iconName:t,title:e,description:n,vexpand:!0})}initialize(){let e=new w.ViewStack({vexpand:!0});e.add_titled_with_icon(this.buildPage(`Overview`,`view-grid-symbolic`,`A quick summary of your project.`),`overview`,`Overview`,`view-grid-symbolic`),e.add_titled_with_icon(this.buildPage(`Activity`,`document-edit-symbolic`,`Recent edits and changes.`),`activity`,`Activity`,`document-edit-symbolic`),e.add_titled_with_icon(this.buildPage(`Settings`,`emblem-system-symbolic`,`Configure how things behave.`),`settings`,`Settings`,`emblem-system-symbolic`),this._switcher=new w.InlineViewSwitcher({stack:e,displayMode:this.modeFromArg(this.args.displayMode),halign:h.Align.CENTER});let t=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12,widthRequest:480,heightRequest:340});t.append(this._switcher),t.append(e),this.addContent(t)}modeFromArg(e){return e===`labels`?w.InlineViewSwitcherDisplayMode.LABELS:e===`icons`?w.InlineViewSwitcherDisplayMode.ICONS:w.InlineViewSwitcherDisplayMode.BOTH}updateArgs(e){this._switcher&&(this._switcher.displayMode=this.modeFromArg(this.args.displayMode))}};S.type_ensure(rl.$gtype);const il={stories:[rl]},al=[{name:`overview`,label:`Overview`,body:`A notebook brings its own tab strip.`},{name:`activity`,label:`Activity`,body:`tab-pos says which edge the strip is on.`},{name:`notes`,label:``,body:`No tab-label: the tab reads "Page 3".`}],ol={title:`View Switching/Notebook`,description:'Gtk.Notebook — the older page container, a stack that brings its own tab bar. `tab-pos` picks the edge (top, bottom, left, right), `show-tabs` takes the strip away, `show-border` is the bevel around the pages — a CSS class in C — and `page` is the current page by INDEX rather than by name. A GtkNotebookPage is a GObject rather than a widget, so its tab-label and friends live on the page itself, and a page without one gets the number "Page N" as its tab text. `enable-popup` puts the pages in a right-click menu.',controls:[{name:`tabPos`,label:`Tab position`,type:i.SELECT,options:[{label:`Top`,value:`top`},{label:`Bottom`,value:`bottom`},{label:`Left`,value:`left`},{label:`Right`,value:`right`}],defaultValue:`top`},{name:`showTabs`,label:`Show tabs`,type:i.BOOLEAN,defaultValue:!0},{name:`showBorder`,label:`Show border`,type:i.BOOLEAN,defaultValue:!0},{name:`enablePopup`,label:`Enable popup (right-click)`,type:i.BOOLEAN,defaultValue:!1}]};var sl=__exportAll({NotebookStories:()=>ul,NotebookStory:()=>ll});const cl={top:h.PositionType.TOP,bottom:h.PositionType.BOTTOM,left:h.PositionType.LEFT,right:h.PositionType.RIGHT};var ll=class NotebookStory extends D{_notebook=null;static{S.registerClass({GTypeName:`AdwStorybookNotebook`},NotebookStory)}constructor(){super(D.fromMeta(NotebookStory.getMetadata(),`Default`))}static getMetadata(){return{...ol,component:h.Notebook.$gtype}}initialize(){this._notebook=new h.Notebook({vexpand:!0,widthRequest:480,heightRequest:320});for(let e of al){let t=new h.Box({orientation:h.Orientation.VERTICAL,halign:h.Align.CENTER,valign:h.Align.CENTER,spacing:6});t.append(new h.Label({label:e.label||e.name,cssClasses:[`title-4`]})),t.append(new h.Label({label:e.body,cssClasses:[`title-2`]}));let n=e.label?new h.Label({label:e.label}):null,r=new h.Label({label:e.label||e.name});this._notebook.append_page_menu(t,n,r)}this._apply(),this.addContent(this._notebook)}updateArgs(e){this._apply()}_apply(){this._notebook&&(this._notebook.tab_pos=cl[this.args.tabPos]??h.PositionType.TOP,this._notebook.show_tabs=this.args.showTabs,this._notebook.enable_popup=this.args.enablePopup,this._notebook.show_border=this.args.showBorder)}};S.type_ensure(ll.$gtype);const ul={stories:[ll]},dl=[{name:`inbox`,title:`Inbox`,icon:`mail-unread-symbolic`,attn:!1,body:`Three unread conversations.`},{name:`starred`,title:`Starred`,icon:`starred-symbolic`,attn:!1,body:`Messages marked important.`},{name:`drafts`,title:`Drafts`,icon:`document-edit-symbolic`,attn:!0,body:`One draft needs attention.`},{name:`settings`,title:``,icon:`preferences-system-symbolic`,attn:!1,body:`No row: a title is the row.`}],fl={title:`View Switching/Stack Sidebar`,description:"Gtk.StackSidebar — a vertical list of a Gtk.Stack's pages, the sidebar counterpart of the stack switcher. A row is made of the page's TITLE alone: `update_row` never reads `icon-name`, so the page with only an icon at the end of this story gets no row at all, where the switcher would show an icon button for it. `needs-attention` puts a dot in front of the label.",controls:[{name:`transitionType`,label:`Transition type`,type:i.SELECT,options:[{label:`None`,value:`none`},{label:`Crossfade`,value:`crossfade`},{label:`Slide left / right`,value:`slide-left-right`}],defaultValue:`slide-left-right`}]};var pl=__exportAll({StackSidebarStories:()=>gl,StackSidebarStory:()=>hl});const ml={none:h.StackTransitionType.NONE,crossfade:h.StackTransitionType.CROSSFADE,"slide-left-right":h.StackTransitionType.SLIDE_LEFT_RIGHT};var hl=class StackSidebarStory extends D{_stack=null;static{S.registerClass({GTypeName:`AdwStorybookStackSidebar`},StackSidebarStory)}constructor(){super(D.fromMeta(StackSidebarStory.getMetadata(),`Default`))}static getMetadata(){return{...fl,component:h.StackSidebar.$gtype}}initialize(){this._stack=new h.Stack({vexpand:!0,transitionDuration:200});for(let e of dl){let t=new h.Label({label:e.body});t.add_css_class(`title-2`);let n=new h.Box({orientation:h.Orientation.VERTICAL,halign:h.Align.CENTER,valign:h.Align.CENTER,spacing:6});n.append(new h.Label({label:e.title||e.name,cssClasses:[`title-4`]})),n.append(t);let r=this._stack.add_titled(n,e.name,e.title);r.icon_name=e.icon,r.needs_attention=e.attn,r.use_underline=!0}let e=new h.StackSidebar({stack:this._stack}),t=new h.Box({orientation:h.Orientation.VERTICAL,spacing:0});t.append(e);let n=new h.Paned({orientation:h.Orientation.HORIZONTAL,widthRequest:480,heightRequest:320});n.set_start_child(t),n.set_end_child(this._stack),n.set_position(180),this._apply(),this.addContent(n)}updateArgs(e){this._apply()}_apply(){this._stack&&(this._stack.transition_type=ml[this.args.transitionType]??h.StackTransitionType.NONE)}};S.type_ensure(hl.$gtype);const gl={stories:[hl]},_l=[{name:`inbox`,title:`Inbox`,icon:`mail-unread-symbolic`,attn:!1,body:`Three unread conversations.`},{name:`starred`,title:`Starred`,icon:`starred-symbolic`,attn:!1,body:`Messages marked important.`},{name:`archive`,title:`Archive`,icon:``,attn:!1,body:`Older conversations kept for reference.`},{name:`drafts`,title:``,icon:`document-edit-symbolic`,attn:!0,body:`One draft needs your attention.`}],vl={title:`View Switching/Stack Switcher`,description:"Gtk.StackSwitcher — a linked row of toggle buttons, one per page of a Gtk.Stack. A page with a title and no icon gets a label button; one with an icon and no title gets an icon button and puts the title on the switcher as a tooltip; a page with NEITHER is left out of the row entirely. `orientation` turns the row vertical, and `needs-attention` on a page puts a dot on its button.",controls:[{name:`orientation`,label:`Orientation`,type:i.SELECT,options:[{label:`Horizontal`,value:`horizontal`},{label:`Vertical`,value:`vertical`}],defaultValue:`horizontal`},{name:`transitionType`,label:`Transition type`,type:i.SELECT,options:[{label:`None`,value:`none`},{label:`Crossfade`,value:`crossfade`},{label:`Slide left / right`,value:`slide-left-right`}],defaultValue:`slide-left-right`}]};var yl=__exportAll({StackSwitcherStories:()=>Sl,StackSwitcherStory:()=>xl});const bl={none:h.StackTransitionType.NONE,crossfade:h.StackTransitionType.CROSSFADE,"slide-left-right":h.StackTransitionType.SLIDE_LEFT_RIGHT};var xl=class StackSwitcherStory extends D{_stack=null;_switcher=null;static{S.registerClass({GTypeName:`AdwStorybookStackSwitcher`},StackSwitcherStory)}constructor(){super(D.fromMeta(StackSwitcherStory.getMetadata(),`Default`))}static getMetadata(){return{...vl,component:h.StackSwitcher.$gtype}}initialize(){this._stack=new h.Stack({vexpand:!0,transitionDuration:200});for(let e of _l){let t=new h.Label({label:e.body});t.add_css_class(`title-2`);let n=new h.Box({orientation:h.Orientation.VERTICAL,halign:h.Align.CENTER,valign:h.Align.CENTER,spacing:6});if(n.append(new h.Label({label:e.title||e.name,cssClasses:[`title-4`]})),n.append(t),e.icon){let t=this._stack.add_titled(n,e.name,e.title);t.icon_name=e.icon,t.needs_attention=e.attn,t.use_underline=!0}else{let t=this._stack.add_titled(n,e.name,e.title);t.needs_attention=e.attn,t.use_underline=!0}}this._switcher=new h.StackSwitcher({stack:this._stack,halign:h.Align.CENTER});let e=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12,widthRequest:480,heightRequest:320});e.append(this._switcher),e.append(this._stack),this._apply(),this.addContent(e)}updateArgs(e){this._apply()}_apply(){!this._stack||!this._switcher||(this._stack.transition_type=bl[this.args.transitionType]??h.StackTransitionType.NONE,this._switcher.orientation=this.args.orientation===`vertical`?h.Orientation.VERTICAL:h.Orientation.HORIZONTAL)}};S.type_ensure(xl.$gtype);const Sl={stories:[xl]},Cl=[{name:`overview`,title:`Overview`,attn:!1,body:`Three pages, one visible at a time.`},{name:`activity`,title:`Activity`,attn:!1,body:`Switching is animated by transition-type.`},{name:`settings`,title:`Settings`,attn:!0,body:`This page wants your attention.`}],wl={title:`View Switching/Stack`,description:"Gtk.Stack — one visible child out of many, with the animated change between them. `transition-type` picks the animation and `transition-duration` its length; `hhomogeneous` and `vhomogeneous` say whether every page is allocated the same size. A Gtk.StackPage is a GObject rather than a widget, so its title, icon and needs-attention live on the page itself.",controls:[{name:`transitionType`,label:`Transition type`,type:i.SELECT,options:[{label:`None`,value:`none`},{label:`Crossfade`,value:`crossfade`},{label:`Slide left / right`,value:`slide-left-right`},{label:`Slide up / down`,value:`slide-up-down`},{label:`Over left / right`,value:`over-left-right`},{label:`Rotate left / right`,value:`rotate-left-right`}],defaultValue:`slide-left-right`},{name:`transitionDuration`,label:`Duration (ms)`,type:i.RANGE,min:0,max:600,step:50,defaultValue:200},{name:`interpolateSize`,label:`Interpolate size`,type:i.BOOLEAN,defaultValue:!1},{name:`hhomogeneous`,label:`HHomogeneous`,type:i.BOOLEAN,defaultValue:!0},{name:`vhomogeneous`,label:`VHomogeneous`,type:i.BOOLEAN,defaultValue:!0}]};var Tl=__exportAll({StackStories:()=>Ol,StackStory:()=>Dl});const El={none:h.StackTransitionType.NONE,crossfade:h.StackTransitionType.CROSSFADE,"slide-left-right":h.StackTransitionType.SLIDE_LEFT_RIGHT,"slide-up-down":h.StackTransitionType.SLIDE_UP_DOWN,"over-left-right":h.StackTransitionType.OVER_LEFT_RIGHT,"rotate-left-right":h.StackTransitionType.ROTATE_LEFT_RIGHT};var Dl=class StackStory extends D{_stack=null;_switcher=null;static{S.registerClass({GTypeName:`AdwStorybookStack`},StackStory)}constructor(){super(D.fromMeta(StackStory.getMetadata(),`Default`))}static getMetadata(){return{...wl,component:h.Stack.$gtype}}initialize(){this._stack=new h.Stack({vexpand:!0,transitionDuration:200});for(let e of Cl){let t=new h.Label({label:e.body,vexpand:!0});t.add_css_class(`title-2`);let n=new h.Box({orientation:h.Orientation.VERTICAL,halign:h.Align.CENTER,valign:h.Align.CENTER,spacing:6});n.append(new h.Label({label:e.title,cssClasses:[`title-4`]})),n.append(t);let r=this._stack.add_titled(n,e.name,e.title);r.needs_attention=e.attn,r.use_underline=!0}this._switcher=new h.StackSwitcher({stack:this._stack,halign:h.Align.CENTER});let e=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12,widthRequest:480,heightRequest:320});e.append(this._switcher),e.append(this._stack),this._apply(),this.addContent(e)}updateArgs(e){this._apply()}_apply(){this._stack&&(this._stack.transition_type=El[this.args.transitionType]??h.StackTransitionType.NONE,this._stack.transition_duration=this.args.transitionDuration,this._stack.interpolate_size=this.args.interpolateSize,this._stack.hhomogeneous=this.args.hhomogeneous,this._stack.vhomogeneous=this.args.vhomogeneous)}};S.type_ensure(Dl.$gtype);const Ol={stories:[Dl]},kl={title:`View Switching/Tab Bar`,description:"Adw.TabBar — the tab bar as a widget of its own, bound to an Adw.TabView through its `view`: one chip per page, an action widget on either side, and a strip that can autohide or expand its chips.",controls:[{name:`autohide`,label:`Autohide`,type:i.BOOLEAN,defaultValue:!1},{name:`expandTabs`,label:`Expand tabs`,type:i.BOOLEAN,defaultValue:!1},{name:`inverted`,label:`Inverted`,type:i.BOOLEAN,defaultValue:!1},{name:`startAction`,label:`Start action`,type:i.BOOLEAN,defaultValue:!0},{name:`endAction`,label:`End action`,type:i.BOOLEAN,defaultValue:!0}]};var Al=__exportAll({TabBarStories:()=>Nl,TabBarStory:()=>Ml});const jl=[{title:`Overview`,body:`A summary of everything at a glance.`},{title:`Details`,body:`The specifics, broken down line by line.`},{title:`History`,body:`A log of every change made so far.`}];var Ml=class TabBarStory extends D{_bar=null;_startAction=null;_endAction=null;static{S.registerClass({GTypeName:`AdwStorybookTabBar`},TabBarStory)}constructor(){super(D.fromMeta(TabBarStory.getMetadata(),`Default`))}static getMetadata(){return{...kl,component:w.TabBar.$gtype}}initialize(){let e=new w.TabView({vexpand:!0});for(let t of jl){let n=e.append(new w.StatusPage({iconName:`view-paged-symbolic`,title:t.title,description:t.body}));n.title=t.title}this._startAction=new h.Button({iconName:`list-add-symbolic`,tooltipText:`New page`,cssClasses:[`flat`]}),this._endAction=new h.Button({iconName:`view-more-symbolic`,tooltipText:`Menu`,cssClasses:[`flat`]});let t=new w.TabBar({view:e});this._bar=t;let n=new h.Box({orientation:h.Orientation.VERTICAL,widthRequest:480,heightRequest:320});n.append(t),n.append(e),this.addContent(n),this._apply()}updateArgs(e){this._apply()}_apply(){let e=this._bar;e!==null&&(e.autohide=this.args.autohide,e.expandTabs=this.args.expandTabs,e.inverted=this.args.inverted,e.startActionWidget=this.args.startAction?this._startAction:null,e.endActionWidget=this.args.endAction?this._endAction:null)}};S.type_ensure(Ml.$gtype);const Nl={stories:[Ml]},Pl={title:`View Switching/Tab Button`,description:`Adw.TabButton — a button that shows how many pages an Adw.TabView holds, and a dot when a page you are not looking at needs attention. From ten pages the number shrinks; at a hundred it becomes a glyph.`,controls:[{name:`pages`,label:`Pages`,type:i.RANGE,min:0,max:100,step:1,defaultValue:3},{name:`needsAttention`,label:`Last page needs attention`,type:i.BOOLEAN,defaultValue:!1}]};var Fl=__exportAll({TabButtonStories:()=>Il,TabButtonStory:()=>$}),$=class TabButtonStory extends D{_view=null;static{S.registerClass({GTypeName:`AdwStorybookTabButton`},TabButtonStory)}constructor(){super(D.fromMeta(TabButtonStory.getMetadata(),`Default`))}static getMetadata(){return{...Pl,component:w.TabButton.$gtype}}initialize(){this._view=new w.TabView;let e=new w.TabButton({view:this._view,halign:h.Align.CENTER});this._apply(),this.addContent(e)}updateArgs(e){this._apply()}_apply(){let e=this._view;if(!e)return;let t=this.args.pages;for(;e.nPages<t;)e.append(new h.Box).title=`Page ${e.nPages}`;for(;e.nPages>t;)e.close_page(e.get_nth_page(e.nPages-1));for(let t=0;t<e.nPages;t++)e.get_nth_page(t).needsAttention=this.args.needsAttention&&t===e.nPages-1}};S.type_ensure($.$gtype);const Il={stories:[$]},Ll={title:`View Switching/Tab Overview`,description:`Adw.TabOverview — a grid of tab thumbnails over an Adw.TabView; open it to see every page at once, search them and close or unpin them.`,controls:[{name:`open`,label:`Open`,type:i.BOOLEAN,defaultValue:!0},{name:`enableSearch`,label:`Enable search`,type:i.BOOLEAN,defaultValue:!0},{name:`enableNewTab`,label:`Enable new tab`,type:i.BOOLEAN,defaultValue:!1},{name:`inverted`,label:`Inverted`,type:i.BOOLEAN,defaultValue:!1}]};var Rl=__exportAll({TabOverviewStories:()=>Vl,TabOverviewStory:()=>Bl});const zl=[{title:`Overview`,body:`A summary of everything at a glance.`},{title:`Details`,body:`The specifics, broken down line by line.`},{title:`History`,body:`A log of every change made so far.`}];var Bl=class TabOverviewStory extends D{_overview=null;static{S.registerClass({GTypeName:`AdwStorybookTabOverview`},TabOverviewStory)}constructor(){super(D.fromMeta(TabOverviewStory.getMetadata(),`Default`))}static getMetadata(){return{...Ll,component:w.TabOverview.$gtype}}initialize(){let e=new w.TabView({vexpand:!0});for(let[t,n]of zl.entries()){let r=new w.StatusPage({iconName:`view-paged-symbolic`,title:n.title,description:n.body,vexpand:!0}),i=e.append(r);i.title=n.title,t===0&&e.set_page_pinned(i,!0)}let t=new w.TabOverview({view:e,child:e,widthRequest:480,heightRequest:340});this._overview=t,t.connect(`create-tab`,()=>{let t=e.append(new w.StatusPage({iconName:`view-paged-symbolic`,title:`New Page`,vexpand:!0}));return t.title=`New Page`,t}),this.addContent(t),this._apply()}updateArgs(e){this._apply()}_apply(){let e=this._overview;e&&(e.enableSearch=this.args.enableSearch,e.enableNewTab=this.args.enableNewTab,e.inverted=this.args.inverted,e.open=this.args.open)}};S.type_ensure(Bl.$gtype);const Vl={stories:[Bl]},Hl={title:`View Switching/Tab View`,description:`Adw.TabView with an Adw.TabBar header — three tabbed pages; the tab bar can auto-hide when only one tab remains.`,controls:[{name:`autohide`,label:`Autohide tab bar`,type:i.BOOLEAN,defaultValue:!1}]};var Ul=__exportAll({TabViewStories:()=>Kl,TabViewStory:()=>Gl});const Wl=[{title:`Overview`,body:`A summary of everything at a glance.`},{title:`Details`,body:`The specifics, broken down line by line.`},{title:`History`,body:`A log of every change made so far.`}];var Gl=class TabViewStory extends D{_tabBar=null;static{S.registerClass({GTypeName:`AdwStorybookTabView`},TabViewStory)}constructor(){super(D.fromMeta(TabViewStory.getMetadata(),`Default`))}static getMetadata(){return{...Hl,component:w.TabView.$gtype}}buildPageBody(e,t){return new w.StatusPage({iconName:`view-paged-symbolic`,title:e,description:t,vexpand:!0})}initialize(){let e=new w.TabView({vexpand:!0});for(let t of Wl){let n=e.append(this.buildPageBody(t.title,t.body));n.title=t.title}this._tabBar=new w.TabBar({view:e,autohide:this.args.autohide});let t=new h.Box({orientation:h.Orientation.VERTICAL,widthRequest:480,heightRequest:340});t.append(this._tabBar),t.append(e),this.addContent(t)}updateArgs(e){this._tabBar&&(this._tabBar.autohide=this.args.autohide)}};S.type_ensure(Gl.$gtype);const Kl={stories:[Gl]},ql=[{name:`inbox`,title:`Inbox`,icon:`mail-unread-symbolic`},{name:`starred`,title:`Starred`,icon:`starred-symbolic`},{name:`archive`,title:`Archive`,icon:`folder-symbolic`}],Jl={title:`View Switching/View Switcher Bar`,description:"Adw.ViewSwitcherBar — the narrow-window switcher, pinned to the bottom of a toolbar view. `reveal` is a REQUEST, not a state: a stack with fewer than two pages stays collapsed however loudly it is asked.",controls:[{name:`reveal`,label:`Reveal`,type:i.BOOLEAN,defaultValue:!0}]};var Yl=__exportAll({ViewSwitcherBarStories:()=>Zl,ViewSwitcherBarStory:()=>Xl}),Xl=class ViewSwitcherBarStory extends D{_bar=null;static{S.registerClass({GTypeName:`AdwStorybookViewSwitcherBar`},ViewSwitcherBarStory)}constructor(){super(D.fromMeta(ViewSwitcherBarStory.getMetadata(),`Default`))}static getMetadata(){return{...Jl,component:w.ViewSwitcherBar.$gtype}}initialize(){let e=new w.ViewStack({vexpand:!0});for(let t of ql){let n=new w.StatusPage({iconName:t.icon,title:t.title,description:`The ${t.title.toLowerCase()} page.`,vexpand:!0});e.add_titled_with_icon(n,t.name,t.title,t.icon)}this._bar=new w.ViewSwitcherBar({stack:e}),this._apply();let t=new w.ToolbarView({content:e,widthRequest:360,heightRequest:360});t.add_bottom_bar(this._bar),this.addContent(t)}updateArgs(e){this._apply()}_apply(){this._bar&&(this._bar.reveal=this.args.reveal)}};S.type_ensure(Xl.$gtype);const Zl={stories:[Xl]},Ql=[{name:`inbox`,title:`Inbox`,icon:`mail-unread-symbolic`,sectionTitle:`Mail`,badgeNumber:3},{name:`starred`,title:`Starred`,icon:`starred-symbolic`},{name:`drafts`,title:`Drafts`,icon:`document-edit-symbolic`},{name:`sent`,title:`Sent`,icon:`mail-send-symbolic`,sectionTitle:`Older`,needsAttention:!0},{name:`archive`,title:`Archive`,icon:`folder-symbolic`},{name:`trash`,title:`Trash`,icon:`user-trash-symbolic`}],$l={title:`View Switching/View Switcher Sidebar`,description:"Adw.ViewSwitcherSidebar — an Adw.Sidebar driven by an Adw.ViewStack, which is the one Adw switcher whose rows can be grouped into sections and carry an unread dot or a badge. `page` collapses it into a page of boxed lists.",controls:[{name:`mode`,label:`Page mode`,type:i.BOOLEAN,defaultValue:!1}]};var eu=__exportAll({ViewSwitcherSidebarStories:()=>nu,ViewSwitcherSidebarStory:()=>tu}),tu=class ViewSwitcherSidebarStory extends D{_switcher=null;static{S.registerClass({GTypeName:`AdwStorybookViewSwitcherSidebar`},ViewSwitcherSidebarStory)}constructor(){super(D.fromMeta(ViewSwitcherSidebarStory.getMetadata(),`Default`))}static getMetadata(){return{...$l,component:w.ViewSwitcherSidebar.$gtype}}initialize(){let e=new w.ViewStack({vexpand:!0});for(let t of Ql){let n=new w.StatusPage({iconName:t.icon,title:t.title,vexpand:!0});e.add_titled(n,t.name,t.title)}let t=e.get_pages();for(let e=0;e<t.get_n_items();e++){let n=t.get_item(e),r=Ql.find(e=>e.name===n.name);r?.sectionTitle&&(n.startsSection=!0,n.sectionTitle=r.sectionTitle,r.badgeNumber&&(n.badgeNumber=r.badgeNumber),r.needsAttention&&(n.needsAttention=!0))}let n=new w.ViewSwitcherSidebar({stack:e});this._switcher=n;let r=new h.Box({orientation:h.Orientation.HORIZONTAL,widthRequest:480,heightRequest:340});r.append(n),r.append(e),this.addContent(r),this._apply()}updateArgs(e){this._apply()}_apply(){this._switcher&&(this._switcher.mode=this.args.mode?w.SidebarMode.PAGE:w.SidebarMode.SIDEBAR)}};S.type_ensure(tu.$gtype);const nu={stories:[tu]},ru={title:`View Switching/View Switcher`,description:`Adw.ViewSwitcher — a segmented switcher whose buttons select pages in a paired Adw.ViewStack.`,controls:[{name:`policy`,label:`Policy`,type:i.SELECT,options:[{label:`Wide`,value:`wide`},{label:`Narrow`,value:`narrow`}],defaultValue:`wide`}]};var iu=__exportAll({ViewSwitcherStories:()=>ou,ViewSwitcherStory:()=>au}),au=class ViewSwitcherStory extends D{_switcher=null;static{S.registerClass({GTypeName:`AdwStorybookViewSwitcher`},ViewSwitcherStory)}constructor(){super(D.fromMeta(ViewSwitcherStory.getMetadata(),`Default`))}static getMetadata(){return{...ru,component:w.ViewSwitcher.$gtype}}buildPage(e,t,n){return new w.StatusPage({iconName:t,title:e,description:n,vexpand:!0})}initialize(){let e=new w.ViewStack({vexpand:!0});e.add_titled_with_icon(this.buildPage(`Inbox`,`mail-unread-symbolic`,`You have three unread conversations.`),`inbox`,`Inbox`,`mail-unread-symbolic`),e.add_titled_with_icon(this.buildPage(`Starred`,`starred-symbolic`,`Messages you have marked as important.`),`starred`,`Starred`,`starred-symbolic`),e.add_titled_with_icon(this.buildPage(`Archive`,`folder-symbolic`,`Older conversations kept for reference.`),`archive`,`Archive`,`folder-symbolic`),this._switcher=new w.ViewSwitcher({stack:e,policy:this.policyFromArg(this.args.policy),halign:h.Align.CENTER});let t=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12,widthRequest:480,heightRequest:340});t.append(this._switcher),t.append(e),this.addContent(t)}policyFromArg(e){return e===`narrow`?w.ViewSwitcherPolicy.NARROW:w.ViewSwitcherPolicy.WIDE}updateArgs(e){this._switcher&&(this._switcher.policy=this.policyFromArg(this.args.policy))}};S.type_ensure(au.$gtype);const ou={stories:[au]},su={title:`Windows/Action Bar`,description:"Gtk.ActionBar — GTK's bottom bar, and the one libadwaita styles but does not own (`actionbar > revealer > box`). `start` appends and `end` PREPENDS, so the first end child sits nearest the edge; `center` is a real placement with no property behind it, because GtkBuilder refuses `center-widget`; and `revealed` slides the whole bar away.",controls:[{name:`revealed`,label:`Revealed`,type:i.BOOLEAN,defaultValue:!0},{name:`center`,label:`Centre`,type:i.SELECT,options:[{label:`A label`,value:`label`},{label:`Nothing`,value:`none`}],defaultValue:`label`}]};var cu=__exportAll({ActionBarStories:()=>uu,ActionBarStory:()=>lu}),lu=class ActionBarStory extends D{_bar=null;_centre=null;static{S.registerClass({GTypeName:`AdwStorybookActionBar`},ActionBarStory)}constructor(){super(D.fromMeta(ActionBarStory.getMetadata(),`Default`))}static getMetadata(){return{...su,component:h.ActionBar.$gtype}}initialize(){this._bar=new h.ActionBar;let e=new h.Button({icon_name:`document-save-symbolic`});e.add_css_class(`flat`),this._bar.pack_end(e);let t=new h.Button({icon_name:`document-open-symbolic`});t.add_css_class(`flat`),this._bar.pack_end(t);let n=new h.Button({icon_name:`document-print-symbolic`});n.add_css_class(`flat`),this._bar.pack_start(n),this._centre=new h.Label({label:`notes.md`});let r=new h.Box({orientation:h.Orientation.VERTICAL,spacing:8});r.append(new h.Label({label:`The bar below is Gtk.ActionBar.`,css_classes:[`dimmed`]})),r.append(this._bar),this.addContent(r),this._apply()}updateArgs(e){this._apply()}_apply(){this._bar&&(this._bar.revealed=this.args.revealed,this._bar.set_center_widget(this.args.center===`label`?this._centre:null))}};S.type_ensure(lu.$gtype);const uu={stories:[lu]},du={title:`Windows/Application Window`,description:"Gtk.ApplicationWindow — a Gtk.Window that also handles an application menubar. The bar shows only when `show-menubar` is set AND the application HAS one: GTK builds it from the GtkApplication's menu model, and reads the item count before deciding (gtkapplicationwindow.c:400-402). Everything else about the window is the base class.",controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Editor`},{name:`showMenubar`,label:`Show menubar`,type:i.BOOLEAN,defaultValue:!0},{name:`hasMenubar`,label:`The application has one`,type:i.BOOLEAN,defaultValue:!0},{name:`deletable`,label:`Deletable`,type:i.BOOLEAN,defaultValue:!0}]};var fu=__exportAll({GtkApplicationWindowStories:()=>mu,GtkApplicationWindowStory:()=>pu});function menubarModel(){let e=new x.Menu,t=new x.Menu;t.append(`_New`,`win.new`),t.append(`_Open…`,`win.open`);let n=new x.Menu;return n.append(`_Copy`,`win.copy`),n.append(`_Paste`,`win.paste`),e.append_section(null,t),e.append_section(null,n),e}var pu=class GtkApplicationWindowStory extends D{_window=null;_application=null;_menubar=null;static{S.registerClass({GTypeName:`AdwStorybookGtkApplicationWindow`},GtkApplicationWindowStory)}constructor(){super(D.fromMeta(GtkApplicationWindowStory.getMetadata(),`Default`))}static getMetadata(){return{...du,component:h.ApplicationWindow.$gtype}}initialize(){this._application=new h.Application({application_id:`eu.jumplink.AdwStorybookGtkApplicationWindow`}),this._menubar=menubarModel(),this._application.set_menubar(this._menubar),this._window=new h.ApplicationWindow({application:this._application,default_width:460,default_height:260}),this._window.set_titlebar(new h.HeaderBar);let e=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12,margin_top:12,margin_start:12});e.append(new h.Label({label:`The bar above is built from the application menu.`,css_classes:[`dimmed`]})),this._window.set_child(e),this.addContent(this._window),this._apply()}updateArgs(e){this._apply()}_apply(){!this._window||!this._application||(this._window.title=this.args.title,this._window.deletable=this.args.deletable,this._application.set_menubar(this.args.hasMenubar?this._menubar:null),this._window.show_menubar=this.args.showMenubar)}};S.type_ensure(pu.$gtype);const mu={stories:[pu]},hu={title:`Windows/Header Bar`,description:"Gtk.HeaderBar — the titlebar widget: children packed at the start and at the end, the window title in the middle, and the window-frame buttons GTK would otherwise ask the window manager for. `end` PREPENDS, so the first end child sits nearest the edge; a `title` child takes the middle away from the derived title label; and `show-title-buttons` CREATES and REMOVES the two control groups rather than hiding them.",controls:[{name:`titleWidget`,label:`Title widget`,type:i.SELECT,options:[{label:`The window title`,value:`none`},{label:`A custom centre widget`,value:`custom`}],defaultValue:`none`},{name:`showTitleButtons`,label:`Title buttons`,type:i.BOOLEAN,defaultValue:!0},{name:`decorationLayout`,label:`Decoration layout`,type:i.SELECT,options:[{label:`GNOME (menu:minimize,maximize,close)`,value:`menu:minimize,maximize,close`},{label:`Close only`,value:`:close`},{label:`macOS (icon:minimize,maximize)`,value:`icon:minimize,maximize`}],defaultValue:`menu:minimize,maximize,close`}]};var gu=__exportAll({GtkHeaderBarStories:()=>vu,GtkHeaderBarStory:()=>_u}),_u=class GtkHeaderBarStory extends D{_bar=null;_titleLabel=null;static{S.registerClass({GTypeName:`AdwStorybookGtkHeaderBar`},GtkHeaderBarStory)}constructor(){super(D.fromMeta(GtkHeaderBarStory.getMetadata(),`Default`))}static getMetadata(){return{...hu,component:h.HeaderBar.$gtype}}initialize(){this._bar=new h.HeaderBar;let e=new h.Button({icon_name:`open-menu-symbolic`});e.add_css_class(`flat`),this._bar.pack_end(e);let t=new h.Button({icon_name:`system-search-symbolic`});t.add_css_class(`flat`),this._bar.pack_end(t);let n=new h.Button({label:`‹`});n.add_css_class(`flat`),this._bar.pack_start(n),this._titleLabel=new h.Label({label:`Mailboxes`,css_classes:[`title`]}),this.addContent(this._bar),this._apply()}updateArgs(e){this._apply()}_apply(){this._bar&&(this._bar.decoration_layout=this.args.decorationLayout,this._bar.show_title_buttons=this.args.showTitleButtons,this.args.titleWidget===`custom`?this._bar.title_widget=this._titleLabel:this._bar.title_widget=null)}};S.type_ensure(_u.$gtype);const vu={stories:[_u]},yu={title:`Windows/Window`,description:"Gtk.Window — a toplevel with a `titlebar` and a `child`, and the properties that decide what its frame shows: `decorated`, `deletable`, `resizable`, `maximized` and `hide-on-close`. The BROWSER replica of this one is an IN-PAGE FRAME, not a toplevel: a browser document has no window to map. The story therefore cancels `close-request`, which is what an application does when it wants to keep the window.",controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Documents`},{name:`decorated`,label:`Decorated`,type:i.BOOLEAN,defaultValue:!0},{name:`deletable`,label:`Deletable`,type:i.BOOLEAN,defaultValue:!0},{name:`resizable`,label:`Resizable`,type:i.BOOLEAN,defaultValue:!0},{name:`maximized`,label:`Maximized`,type:i.BOOLEAN,defaultValue:!1},{name:`modal`,label:`Modal`,type:i.BOOLEAN,defaultValue:!1},{name:`hideOnClose`,label:`Hide on close`,type:i.BOOLEAN,defaultValue:!0}]};var bu=__exportAll({GtkWindowStories:()=>Su,GtkWindowStory:()=>xu}),xu=class GtkWindowStory extends D{_window=null;static{S.registerClass({GTypeName:`AdwStorybookGtkWindow`},GtkWindowStory)}constructor(){super(D.fromMeta(GtkWindowStory.getMetadata(),`Default`))}static getMetadata(){return{...yu,component:h.Window.$gtype}}initialize(){this._window=new h.Window({default_width:460,default_height:280});let e=new h.HeaderBar;this._window.set_titlebar(e);let t=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12,margin_top:12,margin_start:12});t.append(new h.Label({label:`The frame above is a Gtk.HeaderBar.`,css_classes:[`dimmed`]})),this._window.set_child(t),this.addContent(this._window),this._apply()}updateArgs(e){this._apply()}_apply(){this._window&&(this._window.title=this.args.title,this._window.decorated=this.args.decorated,this._window.deletable=this.args.deletable,this._window.resizable=this.args.resizable,this._window.maximized=this.args.maximized,this._window.modal=this.args.modal,this._window.hide_on_close=this.args.hideOnClose)}};S.type_ensure(xu.$gtype);const Su={stories:[xu]},Cu={title:`Windows/Window Controls`,description:"Gtk.WindowControls — one SIDE of the window frame controls, and the decision table behind them. The decoration layout is split on the first colon; each token of the selected half builds one button or none, because `icon` and `minimize` want a SOVEREIGN window, `maximize` wants a resizable one and `close` wants a deletable one. `empty` is the property that says none of them did.",controls:[{name:`side`,label:`Side`,type:i.SELECT,options:[{label:`Start`,value:`start`},{label:`End`,value:`end`}],defaultValue:`start`},{name:`decorationLayout`,label:`Decoration layout`,type:i.SELECT,options:[{label:`GNOME (menu:minimize,maximize,close)`,value:`menu:minimize,maximize,close`},{label:`Windows (icon:minimize,maximize,close)`,value:`icon:minimize,maximize,close`},{label:`Close only`,value:`:close`},{label:`macOS (icon:minimize,maximize)`,value:`icon:minimize,maximize`}],defaultValue:`menu:minimize,maximize,close`},{name:`resizable`,label:`Resizable window`,type:i.BOOLEAN,defaultValue:!0},{name:`maximized`,label:`Maximized window`,type:i.BOOLEAN,defaultValue:!1},{name:`modal`,label:`Modal window`,type:i.BOOLEAN,defaultValue:!1}]};var wu=__exportAll({WindowControlsStories:()=>Eu,WindowControlsStory:()=>Tu}),Tu=class WindowControlsStory extends D{_window=null;_controls=null;static{S.registerClass({GTypeName:`AdwStorybookWindowControls`},WindowControlsStory)}constructor(){super(D.fromMeta(WindowControlsStory.getMetadata(),`Default`))}static getMetadata(){return{...Cu,component:h.WindowControls.$gtype}}initialize(){this._window=new h.Window({title:`Documents`,default_width:420,default_height:220});let e=new h.Box({orientation:h.Orientation.VERTICAL,spacing:8});e.append(new h.Label({label:`The bar draws nothing outside a window.`,css_classes:[`dimmed`]})),this._window.set_child(e),this._controls=new h.WindowControls,this._window.set_titlebar(this._controls),this.addContent(this._window),this._apply()}updateArgs(e){this._apply()}_apply(){if(!this._window||!this._controls)return;let e=this.args.side===`end`?h.PackType.END:h.PackType.START;this._controls.side=e,this._controls.decoration_layout=this.args.decorationLayout,this._window.resizable=this.args.resizable,this._window.maximized=this.args.maximized,this._window.modal=this.args.modal}};S.type_ensure(Tu.$gtype);const Eu={stories:[Tu]};await runStorybook({applicationId:`org.gjsify.AdwaitaStorybook`,title:`Adwaita Storybook`,stories:collectStoryModules([Je,Ze,tt,ot,lt,pt,_t,xt,wt,Dt,jt,Ft,Rt,Vt,Wt,qt,Xt,$t,nn,sn,dn,hn,yn,Cn,Dn,jn,Fn,zn,Wn,Jn,$n,ar,lr,mr,vr,Sr,Er,Ar,Pr,Rr,Ur,Jr,Qr,ni,oi,ui,mi,vi,Si,Oi,Ni,Ri,Ui,qi,Zi,na,oa,fa,ga,ba,wa,Oa,Ma,Ia,Ba,Wa,Ja,Qa,no,oo,uo,go,bo,Do,jo,Fo,Bo,Go,Xo,is,ls,fs,vs,Cs,Ds,Ms,Is,Bs,Ws,Js,ec,ic,cc,fc,gc,bc,wc,Oc,Mc,Ic,Bc,Wc,Xc,nl,sl,pl,yl,Tl,Al,Fl,Rl,Ul,Yl,eu,iu,cu,fu,gu,bu,wu])});export{};
|
|
336
|
+
Built with meson 1.6`}),t=Zn[this.args.licenseType]??h.License.UNKNOWN;t===h.License.CUSTOM&&e.set_license(`Permission is hereby granted, free of charge, to any person obtaining a copy…`),e.set_license_type(t),this.args.withCredits&&(e.set_authors([`Ada Lovelace <ada@example.org>`,`Grace Hopper`]),e.set_documenters([`Barbara Liskov`]),e.set_artists([`Margaret Hamilton`]),e.set_translator_credits(`Alan Turing
|
|
337
|
+
Katherine Johnson`),e.add_credit_section(`Reviewed by`,[`Tony Hoare <tony@example.org>`])),e.present()}updateArgs(e){}};S.type_ensure(Qn.$gtype);const $n={stories:[Qn]},er={title:`Feedback/Page Setup Dialog`,description:`Gtk.PageSetupUnixDialog — the page setup dialog Unix platforms have instead of a native one: a printer and a paper size, the chosen sheet's size and margins, and four orientation buttons.`,controls:[{name:`paperSize`,label:`Paper size`,type:i.SELECT,options:[{label:`US Letter`,value:`na_letter`},{label:`US Legal`,value:`na_legal`},{label:`A4`,value:`iso_a4`},{label:`A5`,value:`iso_a5`},{label:`B5`,value:`iso_b5`},{label:`A3`,value:`iso_a3`}],defaultValue:`iso_a4`},{name:`orientation`,label:`Orientation`,type:i.SELECT,options:[{label:`Portrait`,value:`portrait`},{label:`Landscape`,value:`landscape`},{label:`Reverse portrait`,value:`reverse-portrait`},{label:`Reverse landscape`,value:`reverse-landscape`}],defaultValue:`landscape`}]};var tr=__exportAll({PageSetupUnixDialogStories:()=>ar,PageSetupUnixDialogStory:()=>rr});const nr={portrait:h.PageOrientation.PORTRAIT,landscape:h.PageOrientation.LANDSCAPE,"reverse-portrait":h.PageOrientation.REVERSE_PORTRAIT,"reverse-landscape":h.PageOrientation.REVERSE_LANDSCAPE};var rr=class PageSetupUnixDialogStory extends k{_button=null;static{S.registerClass({GTypeName:`AdwStorybookPageSetupUnixDialog`},PageSetupUnixDialogStory)}constructor(){super(k.fromMeta(PageSetupUnixDialogStory.getMetadata(),`Default`))}static getMetadata(){return{...er,component:h.PageSetupUnixDialog.$gtype}}initialize(){this._button=new h.Button({label:`Page Setup…`,halign:h.Align.CENTER,valign:h.Align.CENTER}),this._button.add_css_class(`pill`),this._button.add_css_class(`suggested-action`),this._button.connect(`clicked`,()=>this._present()),this.addContent(this._button)}_present(){let e=h.PageSetupUnixDialog.new(`Page Setup`,null),t=new h.PageSetup;t.set_paper_size_and_default_margins(h.PaperSize.new(this.args.paperSize)),t.set_orientation(nr[this.args.orientation]??h.PageOrientation.PORTRAIT),e.set_page_setup(t),e.present()}updateArgs(e){}};const ir=`PageSetupUnixDialog`in h;ir&&S.type_ensure(rr.$gtype);const ar={stories:[rr].filter(()=>ir)},or={title:`Feedback/Preferences Dialog`,description:`Adw.PreferencesDialog — a preferences window with a page, a group and a handful of boxed-list rows.`,controls:[{name:`pageTitle`,label:`Page title`,type:i.TEXT,defaultValue:`General`},{name:`groupTitle`,label:`Group title`,type:i.TEXT,defaultValue:`Appearance`}]};var sr=__exportAll({PreferencesDialogStories:()=>lr,PreferencesDialogStory:()=>cr}),cr=class PreferencesDialogStory extends k{_button=null;static{S.registerClass({GTypeName:`AdwStorybookPreferencesDialog`},PreferencesDialogStory)}constructor(){super(k.fromMeta(PreferencesDialogStory.getMetadata(),`Default`))}static getMetadata(){return{...or,component:w.PreferencesDialog.$gtype}}initialize(){this._button=new h.Button({label:`Show dialog`,halign:h.Align.CENTER,valign:h.Align.CENTER}),this._button.add_css_class(`pill`),this._button.add_css_class(`suggested-action`),this._button.connect(`clicked`,()=>this._present()),this.addContent(this._button)}_present(){let e=new w.PreferencesDialog,t=new w.PreferencesPage({title:this.args.pageTitle,iconName:`preferences-system-symbolic`}),n=new w.PreferencesGroup({title:this.args.groupTitle,description:`Control how the application looks and behaves.`});n.add(new w.SwitchRow({title:`Dark style`,subtitle:`Use a dark colour scheme`,active:!0})),n.add(new w.ComboRow({title:`Accent colour`,model:new h.StringList({strings:[`Blue`,`Teal`,`Green`,`Orange`,`Purple`]}),selected:0})),n.add(new w.SpinRow({title:`Font size`,adjustment:new h.Adjustment({lower:8,upper:24,value:12,stepIncrement:1,pageIncrement:4})})),t.add(n),e.add(t),e.present(this)}updateArgs(e){}};S.type_ensure(cr.$gtype);const lr={stories:[cr]},ur={title:`Feedback/Print Dialog`,description:`Gtk.PrintUnixDialog — the Unix print dialog: seven notebook pages over a printer list, a Range and a Copies group on General, the sheet preview on Page Setup, and the Preview / Cancel / Print action area.`,controls:[{name:`capabilities`,label:`Capabilities`,type:i.TEXT,defaultValue:`copies|collate|reverse|scale|preview|page-set`},{name:`range`,label:`Range`,type:i.SELECT,options:[{label:`All Pages`,value:`all`},{label:`Current Page`,value:`current`},{label:`Selection`,value:`selection`},{label:`Pages`,value:`pages`}],defaultValue:`all`},{name:`copies`,label:`Copies`,type:i.NUMBER,defaultValue:2}]};var dr=__exportAll({PrintUnixDialogStories:()=>mr,PrintUnixDialogStory:()=>fr});const capabilities=()=>({collate:h.PrintCapabilities.COLLATE,copies:h.PrintCapabilities.COPIES,"generate-pdf":h.PrintCapabilities.GENERATE_PDF,"generate-ps":h.PrintCapabilities.GENERATE_PS,"number-up":h.PrintCapabilities.NUMBER_UP,"number-up-layout":h.PrintCapabilities.NUMBER_UP_LAYOUT,"page-set":h.PrintCapabilities.PAGE_SET,preview:h.PrintCapabilities.PREVIEW,reverse:h.PrintCapabilities.REVERSE,scale:h.PrintCapabilities.SCALE});var fr=class PrintUnixDialogStory extends k{_button=null;static{S.registerClass({GTypeName:`AdwStorybookPrintUnixDialog`},PrintUnixDialogStory)}constructor(){super(k.fromMeta(PrintUnixDialogStory.getMetadata(),`Default`))}static getMetadata(){return{...ur,component:h.PrintUnixDialog.$gtype}}initialize(){this._button=new h.Button({label:`Print…`,halign:h.Align.CENTER,valign:h.Align.CENTER}),this._button.add_css_class(`pill`),this._button.add_css_class(`suggested-action`),this._button.connect(`clicked`,()=>this._present()),this.addContent(this._button)}_present(){let e=h.PrintUnixDialog.new(`Print`,null),t=capabilities(),n=String(this.args.capabilities).split(`|`).map(e=>t[e.trim()]??0).reduce((e,t)=>e|t,0);e.set_manual_capabilities(n),e.set_current_page(2),e.set_support_selection(!0),e.set_has_selection(!0);let r=new h.PrintSettings;r.set_n_copies(Number(this.args.copies)),r.set_collate(this.args.range===`all`),r.set_print_pages(this.args.range===`current`?h.PrintPages.CURRENT:h.PrintPages.ALL),e.set_settings(r),e.present()}updateArgs(e){}};const pr=`PrintUnixDialog`in h;pr&&S.type_ensure(fr.$gtype);const mr={stories:[fr].filter(()=>pr)},hr={title:`Feedback/Shortcuts Dialog`,description:`Adw.ShortcutsDialog — the window that lists an application’s keyboard shortcuts, one titled section at a time.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Keyboard Shortcuts`}]};var gr=__exportAll({ShortcutsDialogStories:()=>vr,ShortcutsDialogStory:()=>_r}),_r=class ShortcutsDialogStory extends k{_button=null;static{S.registerClass({GTypeName:`AdwStorybookShortcutsDialog`},ShortcutsDialogStory)}constructor(){super(k.fromMeta(ShortcutsDialogStory.getMetadata(),`Default`))}static getMetadata(){return{...hr,component:w.ShortcutsDialog.$gtype}}initialize(){this._button=new h.Button({label:`Show dialog`,halign:h.Align.CENTER,valign:h.Align.CENTER}),this._button.add_css_class(`pill`),this._button.add_css_class(`suggested-action`),this._button.connect(`clicked`,()=>this._present()),this.addContent(this._button)}_present(){let e=new w.ShortcutsSection({title:`General`});e.add(new w.ShortcutsItem({title:`Open Menu`,accelerator:`F10`})),e.add(new w.ShortcutsItem({title:`Preferences`,action_name:`app.preferences`})),e.add(new w.ShortcutsItem({title:`Quit`,accelerator:`<Control>q`}));let t=new w.ShortcutsSection;t.add(new w.ShortcutsItem({title:`Move Tab Left`,accelerator:`<Shift><Control>Page_Up`,direction:h.TextDirection.LTR})),t.add(new w.ShortcutsItem({title:`Move Tab Left`,accelerator:`<Shift><Control>Page_Up`,direction:h.TextDirection.RTL}));let n=new w.ShortcutsDialog({title:this.args.title});n.add(e),n.add(t),n.present(this)}updateArgs(e){}};S.type_ensure(_r.$gtype);const vr={stories:[_r]},yr={title:`Feedback/Toast`,description:`Adw.Toast — a transient notification, with an optional action button, shown over an Adw.ToastOverlay.`,controls:[{name:`title`,label:`Toast text`,type:i.TEXT,defaultValue:`File moved to Trash`},{name:`timeout`,label:`Timeout (s)`,type:i.NUMBER,min:0,max:10,step:1,defaultValue:3},{name:`hasButton`,label:`Action button`,type:i.BOOLEAN,defaultValue:!0},{name:`buttonLabel`,label:`Button label`,type:i.TEXT,defaultValue:`Undo`}]};var br=__exportAll({ToastStories:()=>Sr,ToastStory:()=>xr}),xr=class ToastStory extends k{_overlay=null;static{S.registerClass({GTypeName:`AdwStorybookToast`},ToastStory)}constructor(){super(k.fromMeta(ToastStory.getMetadata(),`Default`))}static getMetadata(){return{...yr,component:w.Toast.$gtype}}initialize(){let e=new h.Button({label:`Show toast`,halign:h.Align.CENTER,valign:h.Align.CENTER});e.add_css_class(`pill`),e.add_css_class(`suggested-action`),e.connect(`clicked`,()=>this._showToast()),this._overlay=new w.ToastOverlay({child:e,widthRequest:360,heightRequest:220}),this.addContent(this._overlay)}_showToast(){if(!this._overlay)return;let e=new w.Toast({title:this.args.title,timeout:this.args.timeout});this.args.hasButton&&(e.buttonLabel=this.args.buttonLabel),this._overlay.add_toast(e)}updateArgs(e){}};S.type_ensure(xr.$gtype);const Sr={stories:[xr]},Cr={title:`Layout/Application Window`,description:`Adw.ApplicationWindow — an Adw.Window that belongs to a GtkApplication, plus that application’s menubar.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Text Editor`},{name:`subtitle`,label:`Subtitle`,type:i.TEXT,defaultValue:`notes.md`},{name:`showMenubar`,label:`Show menubar`,type:i.BOOLEAN,defaultValue:!0}]};var wr=__exportAll({ApplicationWindowStories:()=>Er,ApplicationWindowStory:()=>Tr}),Tr=class ApplicationWindowStory extends k{_window=null;_title=null;_toolbarView=null;_menubar=null;static{S.registerClass({GTypeName:`AdwStorybookApplicationWindow`},ApplicationWindowStory)}constructor(){super(k.fromMeta(ApplicationWindowStory.getMetadata(),`Default`))}static getMetadata(){return{...Cr,component:w.ApplicationWindow.$gtype}}initialize(){this._title=new w.WindowTitle({title:this.args.title,subtitle:this.args.subtitle});let e=new w.HeaderBar({titleWidget:this._title,widthRequest:460}),t=new h.Button({iconName:`go-previous-symbolic`});t.add_css_class(`flat`),e.pack_start(t),this._toolbarView=new w.ToolbarView,this._toolbarView.add_top_bar(e),this._toolbarView.content=new w.StatusPage({title:`Your Library`,description:`Content sits between the toolbars and scrolls independently of them.`});let n=new x.Menu,r=new x.Menu;r.append(`New Window`,`app.new-window`),r.append(`Quit`,`app.quit`),n.append_section(null,r);let i=new x.Menu;i.append(`Keyboard Shortcuts`,`app.shortcuts`),i.append(`About`,`app.about`),n.append_section(null,i),this._menubar=new h.PopoverMenuBar({menu_model:n}),this.args.showMenubar&&this._toolbarView.add_top_bar(this._menubar),this._window=new w.ApplicationWindow({content:this._toolbarView,show_menubar:this.args.showMenubar}),this._window.set_default_size(460,260),this.addContent(this._window)}updateArgs(e){if(!this._title||!this._window||!this._toolbarView||!this._menubar)return;this._title.title=this.args.title,this._title.subtitle=this.args.subtitle,this._window.show_menubar=this.args.showMenubar;let t=this.args.showMenubar;t&&this._menubar.get_parent()===null&&this._toolbarView.add_top_bar(this._menubar),!t&&this._menubar.get_parent()!==null&&this._toolbarView.remove(this._menubar)}};S.type_ensure(Tr.$gtype);const Er={stories:[Tr]},Dr={title:`Layout/Aspect Frame`,description:`Gtk.AspectFrame — one child, given a width/height ratio and a place in the space left over. obey-child is TRUE by default and takes the ratio from the child itself, so the story starts with it FALSE or the ratio control would be inert.`,controls:[{name:`ratio`,label:`Ratio`,type:i.RANGE,min:.5,max:3,step:.25,defaultValue:2},{name:`xalign`,label:`Xalign`,type:i.RANGE,min:0,max:1,step:.5,defaultValue:.5},{name:`yalign`,label:`Yalign`,type:i.RANGE,min:0,max:1,step:.5,defaultValue:.5},{name:`obeyChild`,label:`Obey child`,type:i.BOOLEAN,defaultValue:!1}]};var Or=__exportAll({AspectFrameStories:()=>Ar,AspectFrameStory:()=>kr}),kr=class AspectFrameStory extends k{_frame=null;static{S.registerClass({GTypeName:`AdwStorybookAspectFrame`},AspectFrameStory)}constructor(){super(k.fromMeta(AspectFrameStory.getMetadata(),`Default`))}static getMetadata(){return{...Dr,component:h.AspectFrame.$gtype}}initialize(){this._frame=new h.AspectFrame({hexpand:!0,valign:h.Align.CENTER,width_request:320,height_request:180});let e=new h.Label({label:`The frame gives this child the ratio above, and puts it where xalign and yalign say.`});e.set_margin_top(12),e.set_margin_bottom(12),e.set_margin_start(12),e.set_margin_end(12),e.set_vexpand(!0),this._frame.set_child(e),this._apply(),this.addContent(this._frame)}updateArgs(e){this._apply()}_apply(){this._frame&&(this._frame.ratio=this.args.ratio,this._frame.xalign=this.args.xalign,this._frame.yalign=this.args.yalign,this._frame.obeyChild=this.args.obeyChild)}};S.type_ensure(kr.$gtype);const Ar={stories:[kr]},jr={title:`Layout/Bin`,description:`Adw.Bin — a widget with exactly one child. It draws nothing of its own and gives the child its whole allocation; setting a new child replaces the old one.`,controls:[{name:`label`,label:`Child label`,type:i.TEXT,defaultValue:`The one child of this bin.`},{name:`swap`,label:`Replace the child`,type:i.BOOLEAN,defaultValue:!1}]};var Mr=__exportAll({BinStories:()=>Pr,BinStory:()=>Nr}),Nr=class BinStory extends k{_bin=null;static{S.registerClass({GTypeName:`AdwStorybookBin`},BinStory)}constructor(){super(k.fromMeta(BinStory.getMetadata(),`Default`))}static getMetadata(){return{...jr,component:w.Bin.$gtype}}initialize(){this._bin=new w.Bin({widthRequest:320}),this._apply(),this.addContent(this._bin)}updateArgs(e){this._apply()}_apply(){if(!this._bin)return;let e=this.args.swap,t=new h.Label({label:e?`The first child was replaced, not stacked.`:this.args.label,wrap:!0,marginTop:18,marginBottom:18,marginStart:18,marginEnd:18}),n=new h.Box;n.add_css_class(`card`),n.append(t),this._bin.child=n}};S.type_ensure(Nr.$gtype);const Pr={stories:[Nr]},Fr={title:`Layout/Breakpoint Bin`,description:`Adw.BreakpointBin gives breakpoints a home without a window: its one child rearranges itself at a size threshold, and the bin applies the LAST breakpoint whose condition holds. Resize the stage to see it.`,controls:[{name:`condition`,label:`Condition`,type:i.SELECT,options:[{label:`max-width: 480px`,value:`max-width: 480px`},{label:`max-width: 320px`,value:`max-width: 320px`},{label:`max-height: 200px`,value:`max-height: 200px`}],defaultValue:`max-width: 480px`},{name:`narrowLabel`,label:`Narrow label`,type:i.TEXT,defaultValue:`Narrow`},{name:`wideLabel`,label:`Wide label`,type:i.TEXT,defaultValue:`Wide`}]};var Ir=__exportAll({BreakpointBinStories:()=>Rr,BreakpointBinStory:()=>Lr}),Lr=class BreakpointBinStory extends k{_bin=null;_label=null;_breakpoint=null;static{S.registerClass({GTypeName:`AdwStorybookBreakpointBin`},BreakpointBinStory)}constructor(){super(k.fromMeta(BreakpointBinStory.getMetadata(),`Default`))}static getMetadata(){return{...Fr,component:w.BreakpointBin.$gtype}}initialize(){this._label=new h.Label({label:this.args.wideLabel,ellipsize:3}),this._label.add_css_class(`title-1`),this._bin=new w.BreakpointBin,this._bin.set_size_request(150,60),this._bin.set_child(this._label),this._apply(),this.addContent(this._bin)}updateArgs(e){this._apply()}_apply(){if(!this._bin||!this._label)return;let e=w.BreakpointCondition.parse(this.args.condition);e!==null&&(this._breakpoint!==null&&this._bin.remove_breakpoint(this._breakpoint),this._breakpoint=w.Breakpoint.new(e),this._breakpoint.add_setter(this._label,`label`,this.args.narrowLabel),this._bin.add_breakpoint(this._breakpoint),this._label.label=this.args.wideLabel)}};S.type_ensure(Lr.$gtype);const Rr={stories:[Lr]},zr={title:`Layout/Center Box`,description:`Gtk.CenterBox — three widgets, pinned to the start, the centre and the end, with the space between them going to whichever child can grow. shrink-center-last decides who gives up space first.`,controls:[{name:`shrinkCenterLast`,label:`Shrink center last`,type:i.BOOLEAN,defaultValue:!0},{name:`baselinePosition`,label:`Baseline position`,type:i.SELECT,options:[{label:`Top`,value:`top`},{label:`Center`,value:`center`},{label:`Bottom`,value:`bottom`}],defaultValue:`center`}]};var Br=__exportAll({CenterBoxStories:()=>Ur,CenterBoxStory:()=>Hr});const Vr={top:h.BaselinePosition.TOP,center:h.BaselinePosition.CENTER,bottom:h.BaselinePosition.BOTTOM};var Hr=class CenterBoxStory extends k{_box=null;static{S.registerClass({GTypeName:`AdwStorybookCenterBox`},CenterBoxStory)}constructor(){super(k.fromMeta(CenterBoxStory.getMetadata(),`Default`))}static getMetadata(){return{...zr,component:h.CenterBox.$gtype}}initialize(){this._box=new h.CenterBox({margin_top:12,margin_bottom:12,margin_start:12,margin_end:12}),this._box.set_start_widget(new h.Label({label:`Start`,hexpand:!1})),this._box.set_center_widget(new h.Label({label:`Centre`,hexpand:!0})),this._box.set_end_widget(new h.Label({label:`End`,hexpand:!1})),this._apply(),this.addContent(this._box)}updateArgs(e){this._apply()}_apply(){this._box&&(this._box.shrinkCenterLast=this.args.shrinkCenterLast,this._box.baselinePosition=Vr[this.args.baselinePosition])}};S.type_ensure(Hr.$gtype);const Ur={stories:[Hr]},Wr={title:`Layout/Clamp Scrollable`,description:`Adw.ClampScrollable — a clamp whose child scrolls. The scrollbar stays at the edge of the window while the content is held at a maximum width.`,controls:[{name:`maximumSize`,label:`Maximum size`,type:i.RANGE,min:200,max:600,step:10,defaultValue:400},{name:`tighteningThreshold`,label:`Tightening threshold`,type:i.RANGE,min:100,max:600,step:10,defaultValue:300}]};var Gr=__exportAll({ClampScrollableStories:()=>Jr,ClampScrollableStory:()=>qr});const Kr=Array.from({length:24},(e,t)=>`Line ${t+1}: held at the clamp's width while it scrolls.`);var qr=class ClampScrollableStory extends k{_clamp=null;static{S.registerClass({GTypeName:`AdwStorybookClampScrollable`},ClampScrollableStory)}constructor(){super(k.fromMeta(ClampScrollableStory.getMetadata(),`Default`))}static getMetadata(){return{...Wr,component:w.ClampScrollable.$gtype}}initialize(){let e=new h.TextView({editable:!1,cursorVisible:!1,topMargin:12,bottomMargin:12});e.buffer.set_text(Kr.join(`
|
|
338
|
+
`),-1),this._clamp=new w.ClampScrollable({maximumSize:this.args.maximumSize,tighteningThreshold:this.args.tighteningThreshold,child:e});let t=new h.ScrolledWindow({child:this._clamp,widthRequest:640,heightRequest:240});this.addContent(t)}updateArgs(e){this._clamp&&(this._clamp.maximumSize=this.args.maximumSize,this._clamp.tighteningThreshold=this.args.tighteningThreshold)}};S.type_ensure(qr.$gtype);const Jr={stories:[qr]},Yr={title:`Layout/Clamp`,description:`Adw.Clamp limits its child to a maximum width and centres it, tightening the layout as space shrinks.`,controls:[{name:`maximumSize`,label:`Maximum size`,type:i.RANGE,min:200,max:600,step:10,defaultValue:400},{name:`tighteningThreshold`,label:`Tightening threshold`,type:i.RANGE,min:100,max:600,step:10,defaultValue:300}]};var Xr=__exportAll({ClampStories:()=>Qr,ClampStory:()=>Zr}),Zr=class ClampStory extends k{_clamp=null;static{S.registerClass({GTypeName:`AdwStorybookClamp`},ClampStory)}constructor(){super(k.fromMeta(ClampStory.getMetadata(),`Default`))}static getMetadata(){return{...Yr,component:w.Clamp.$gtype}}initialize(){let e=new h.Box({orientation:h.Orientation.HORIZONTAL,widthRequest:520});e.add_css_class(`card`);let t=new h.Label({label:`This content is clamped — it stops growing past the maximum size and stays centred.`,wrap:!0,xalign:0,hexpand:!0,marginTop:18,marginBottom:18,marginStart:18,marginEnd:18});e.append(t),this._clamp=new w.Clamp({maximumSize:this.args.maximumSize,tighteningThreshold:this.args.tighteningThreshold,child:e}),this.addContent(this._clamp)}updateArgs(e){this._clamp&&(this._clamp.maximumSize=this.args.maximumSize,this._clamp.tighteningThreshold=this.args.tighteningThreshold)}};S.type_ensure(Zr.$gtype);const Qr={stories:[Zr]},$r={title:`Layout/Expander`,description:"Gtk.Expander — a title the user clicks to reveal the child below it. The arrow is its own CSS node and `:checked` is set on THAT node, not on the widget, which is what libadwaita's _expanders.scss keys the glyph swap on. `use-underline` marks a mnemonic with `_`, and Alt+that character activates the expander.",controls:[{name:`expanded`,label:`Expanded`,type:i.BOOLEAN,defaultValue:!1},{name:`useUnderline`,label:`Label marks a mnemonic`,type:i.BOOLEAN,defaultValue:!1},{name:`label`,label:`Label`,type:i.TEXT,defaultValue:`_More options`},{name:`resizeToplevel`,label:`Resize the toplevel`,type:i.BOOLEAN,defaultValue:!1}]};var ei=__exportAll({ExpanderStories:()=>ni,ExpanderStory:()=>ti}),ti=class ExpanderStory extends k{_expander=null;static{S.registerClass({GTypeName:`AdwStorybookExpander`},ExpanderStory)}constructor(){super(k.fromMeta(ExpanderStory.getMetadata(),`Default`))}static getMetadata(){return{...$r,component:h.Expander.$gtype}}initialize(){let e=new h.Box({orientation:h.Orientation.VERTICAL,spacing:6,margin_top:12,margin_bottom:12,margin_start:12,margin_end:12});for(let t of[`Notifications`,`Sound`,`Network`])e.append(new h.Label({label:t}));this._expander=new h.Expander,this._expander.set_child(e),this._apply(),this.addContent(this._expander)}updateArgs(e){this._apply()}_apply(){this._expander&&(this._expander.use_underline=this.args.useUnderline,this._expander.label=String(this.args.label),this._expander.resize_toplevel=this.args.resizeToplevel,this._expander.expanded=this.args.expanded)}};S.type_ensure(ti.$gtype);const ni={stories:[ti]},ri={title:`Layout/Fixed`,description:`Gtk.Fixed — children at pixel positions, which is the whole of its API: it declares no property of its own. The two offsets are the arguments of gtk_fixed_put().`,controls:[{name:`offsetX`,label:`Offset x`,type:i.RANGE,min:0,max:80,step:4,defaultValue:24},{name:`offsetY`,label:`Offset y`,type:i.RANGE,min:0,max:80,step:4,defaultValue:16}]};var ii=__exportAll({FixedStories:()=>oi,FixedStory:()=>ai}),ai=class FixedStory extends k{_fixed=null;_first=null;_second=null;static{S.registerClass({GTypeName:`AdwStorybookFixed`},FixedStory)}constructor(){super(k.fromMeta(FixedStory.getMetadata(),`Default`))}static getMetadata(){return{...ri,component:h.Fixed.$gtype}}initialize(){this._fixed=new h.Fixed,this._first=new h.Label({label:`at (x, y)`}),this._second=new h.Label({label:`at (x + 96, y + 40)`}),this._fixed.put(this._first,0,0),this._fixed.put(this._second,0,0),this._apply(),this.addContent(this._fixed)}updateArgs(e){this._apply()}_apply(){if(!this._fixed||!this._first||!this._second)return;let e=this.args.offsetX,t=this.args.offsetY;this._fixed.move(this._first,e,t),this._fixed.move(this._second,e+96,t+40)}};S.type_ensure(ai.$gtype);const oi={stories:[ai]},si={title:`Layout/Frame`,description:`Gtk.Frame — a 1px border with a label embedded in its top edge. GTK draws the label as its own widget above the child, and label-xalign says where across the frame it sits.`,controls:[{name:`label`,label:`Label`,type:i.TEXT,defaultValue:`Details`},{name:`labelXalign`,label:`Label xalign`,type:i.RANGE,defaultValue:0,min:0,max:1,step:.5}]};var ci=__exportAll({FrameStories:()=>ui,FrameStory:()=>li}),li=class FrameStory extends k{_frame=null;static{S.registerClass({GTypeName:`AdwStorybookFrame`},FrameStory)}constructor(){super(k.fromMeta(FrameStory.getMetadata(),`Default`))}static getMetadata(){return{...si,component:h.Frame.$gtype}}initialize(){this._frame=new h.Frame({halign:h.Align.CENTER});let e=new h.Label({label:`A framed region: the label sits in the top edge of the border.`});e.set_margin_top(12),e.set_margin_bottom(12),e.set_margin_start(12),e.set_margin_end(12),this._frame.set_child(e),this._apply(),this.addContent(this._frame)}updateArgs(e){this._apply()}_apply(){this._frame&&(this._frame.label=this.args.label,this._frame.set_label_align(this.args.labelXalign))}};S.type_ensure(li.$gtype);const ui={stories:[li]},di={title:`Layout/Grid`,description:`Gtk.Grid — a table of cells sized by what is in them, filled row by row. The two spacings are the gap between lines, the two homogeneous flags make every line the same, and a vertical grid attaches down the rows instead of across the columns.`,controls:[{name:`columnSpacing`,label:`Column spacing`,type:i.RANGE,min:0,max:36,step:2,defaultValue:12},{name:`rowSpacing`,label:`Row spacing`,type:i.RANGE,min:0,max:36,step:2,defaultValue:12},{name:`columnHomogeneous`,label:`Column homogeneous`,type:i.BOOLEAN,defaultValue:!1},{name:`rowHomogeneous`,label:`Row homogeneous`,type:i.BOOLEAN,defaultValue:!1},{name:`orientation`,label:`Orientation`,type:i.SELECT,options:[{label:`Horizontal`,value:`horizontal`},{label:`Vertical`,value:`vertical`}],defaultValue:`horizontal`}]};var fi=__exportAll({GridStories:()=>mi,GridStory:()=>pi}),pi=class GridStory extends k{_grid=null;_cells=[];_orientation=null;static{S.registerClass({GTypeName:`AdwStorybookGrid`},GridStory)}constructor(){super(k.fromMeta(GridStory.getMetadata(),`Default`))}static getMetadata(){return{...di,component:h.Grid.$gtype}}initialize(){this._grid=new h.Grid({hexpand:!0,margin_top:12,margin_bottom:12,margin_start:12,margin_end:12});for(let e of[`Name`,`Value`,`Unit`,`editable`]){let t=new h.Label({label:e,hexpand:!0});t.set_margin_top(6),t.set_margin_bottom(6),t.set_margin_start(6),t.set_margin_end(6),this._cells.push(t)}this._attach(),this._apply(),this.addContent(this._grid)}updateArgs(e){this._apply()}_attach(){if(this._grid)for(let e of this._cells)this._grid.attach(e,-1,-1,1,1)}_apply(){if(!this._grid)return;let e=this.args.orientation===`vertical`?h.Orientation.VERTICAL:h.Orientation.HORIZONTAL;if(this._grid.columnSpacing=this.args.columnSpacing,this._grid.rowSpacing=this.args.rowSpacing,this._grid.columnHomogeneous=this.args.columnHomogeneous,this._grid.rowHomogeneous=this.args.rowHomogeneous,this._orientation!==null&&this._orientation!==e){for(let e of this._cells)this._grid.remove(e);this._attach()}this._grid.orientation=e,this._orientation=e}};S.type_ensure(pi.$gtype);const mi={stories:[pi]},hi={title:`Layout/Header Bar`,description:`Adw.HeaderBar hosts a custom title widget with start and end controls — the standard top chrome of an Adwaita window.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Text Editor`},{name:`subtitle`,label:`Subtitle`,type:i.TEXT,defaultValue:`notes.md`},{name:`showTitle`,label:`Show title`,type:i.BOOLEAN,defaultValue:!0}]};var gi=__exportAll({HeaderBarStories:()=>vi,HeaderBarStory:()=>_i}),_i=class HeaderBarStory extends k{_headerBar=null;_title=null;static{S.registerClass({GTypeName:`AdwStorybookHeaderBar`},HeaderBarStory)}constructor(){super(k.fromMeta(HeaderBarStory.getMetadata(),`Default`))}static getMetadata(){return{...hi,component:w.HeaderBar.$gtype}}initialize(){this._title=new w.WindowTitle({title:this.args.title,subtitle:this.args.subtitle}),this._headerBar=new w.HeaderBar({titleWidget:this._title,showTitle:this.args.showTitle,widthRequest:460});let e=new h.Button({iconName:`go-previous-symbolic`});e.add_css_class(`flat`),this._headerBar.pack_start(e);let t=new x.Menu;t.append(`New Window`,`app.new-window`),t.append(`Preferences`,`app.preferences`),t.append(`About`,`app.about`);let n=new h.MenuButton({iconName:`open-menu-symbolic`,menuModel:t});n.add_css_class(`flat`),this._headerBar.pack_end(n),this.addContent(this._headerBar)}updateArgs(e){!this._headerBar||!this._title||(this._title.title=this.args.title,this._title.subtitle=this.args.subtitle,this._headerBar.showTitle=this.args.showTitle)}};S.type_ensure(_i.$gtype);const vi={stories:[_i]},yi={title:`Layout/Layout Slot`,description:`Adw.LayoutSlot is the named hole a layout of an Adw.MultiLayoutView leaves for a child: it takes the child whose id matches, and its visible property follows that child's. On its own it is a bin, which is what this story shows.`,controls:[{name:`label`,label:`Child title`,type:i.TEXT,defaultValue:`Inbox`},{name:`visible`,label:`Child visible`,type:i.BOOLEAN,defaultValue:!0}]};var bi=__exportAll({LayoutSlotStories:()=>Si,LayoutSlotStory:()=>xi}),xi=class LayoutSlotStory extends k{_view=null;_slot=null;_child=null;static{S.registerClass({GTypeName:`AdwStorybookLayoutSlot`},LayoutSlotStory)}constructor(){super(k.fromMeta(LayoutSlotStory.getMetadata(),`Default`))}static getMetadata(){return{...yi,component:w.LayoutSlot.$gtype}}initialize(){this._slot=w.LayoutSlot.new(`primary`),this._child=new w.NavigationPage({title:this.args.label,tag:`primary`,child:new h.Label({label:`The child the view inserted here.`})}),this._view=new w.MultiLayoutView;let e=w.Layout.new(this._slot);e.name=`only`,this._view.add_layout(e),this._view.set_child(`primary`,this._child),this._apply(),this.addContent(this._view)}updateArgs(e){this._apply()}_apply(){this._child&&(this._child.title=this.args.label,this._child.visible=this.args.visible)}};S.type_ensure(xi.$gtype);const Si={stories:[xi]},Ci={title:`Layout/Multi Layout View`,description:`Adw.MultiLayoutView holds one set of children and several arrangements of them: each child has an id, each layout has slots with ids, and switching layouts re-inserts every child into the slot of the SAME id.`,controls:[{name:`layoutName`,label:`Layout`,type:i.SELECT,options:[{label:`wide (split)`,value:`wide`},{label:`narrow (stacked)`,value:`narrow`}],defaultValue:`wide`},{name:`showDetails`,label:`Show the details pane`,type:i.BOOLEAN,defaultValue:!0}]};var wi=__exportAll({MultiLayoutViewStories:()=>Oi,MultiLayoutViewStory:()=>Di});const Ti=`primary`,Ei=`secondary`;function page(e){let t=new h.ListBox({selectionMode:h.SelectionMode.NONE});for(let[n,r]of e)t.append(new w.ActionRow({title:n,subtitle:r}));return t}function slotPage(e){return new w.NavigationPage({title:e,child:w.LayoutSlot.new(e),tag:e})}function arrangement(e){let t=new w.NavigationSplitView({collapsed:e,minSidebarWidth:160});return t.sidebar=slotPage(Ei),t.content=slotPage(Ti),t.set_size_request(420,220),t}var Di=class MultiLayoutViewStory extends k{_view=null;_details=null;static{S.registerClass({GTypeName:`AdwStorybookMultiLayoutView`},MultiLayoutViewStory)}constructor(){super(k.fromMeta(MultiLayoutViewStory.getMetadata(),`Default`))}static getMetadata(){return{...Ci,component:w.MultiLayoutView.$gtype}}initialize(){this._details=page([[`From`,`Adwaita List`],[`Subject`,`Resizing the window`]]),this._view=new w.MultiLayoutView;let e=w.Layout.new(arrangement(!1));e.name=`wide`,this._view.add_layout(e);let t=w.Layout.new(arrangement(!0));t.name=`narrow`,this._view.add_layout(t),this._view.set_child(Ti,page([[`General`,`12 unread`],[`Starred`,`3 threads`]])),this._view.set_child(Ei,this._details),this._apply(),this.addContent(this._view)}updateArgs(e){this._apply()}_apply(){!this._view||!this._details||(this._details.visible=this.args.showDetails,this._view.layout_name=this.args.layoutName)}};S.type_ensure(Di.$gtype);const Oi={stories:[Di]},ki={title:`Layout/Overlay`,description:`Gtk.Overlay — widgets stacked on top of one main child. The main child sizes the overlay; every other child is placed by its own halign/valign, which is what gtk_overlay_get_child_position reads and nothing else. Libadwaita ships no Adw.Overlay and gives the node no rule of its own — the .left/.right/.top/.bottom classes it puts on an edge-aligned child are the whole published contract.`,controls:[{name:`halign`,label:`Overlay halign`,type:i.SELECT,options:[{label:`Fill (the default)`,value:`fill`},{label:`Start`,value:`start`},{label:`Center`,value:`center`},{label:`End`,value:`end`}],defaultValue:`end`},{name:`valign`,label:`Overlay valign`,type:i.SELECT,options:[{label:`Fill (the default)`,value:`fill`},{label:`Start`,value:`start`},{label:`Center`,value:`center`},{label:`End`,value:`end`}],defaultValue:`end`},{name:`showLabel`,label:`Label the overlay`,type:i.BOOLEAN,defaultValue:!0}]};var Ai=__exportAll({OverlayStories:()=>Ni,OverlayStory:()=>Mi});const ji={start:h.Align.START,center:h.Align.CENTER,end:h.Align.END};var Mi=class OverlayStory extends k{_overlay=null;_main=null;_badge=null;static{S.registerClass({GTypeName:`AdwStorybookOverlay`},OverlayStory)}constructor(){super(k.fromMeta(OverlayStory.getMetadata(),`Default`))}static getMetadata(){return{...ki,component:h.Overlay.$gtype}}initialize(){this._main=new h.Frame({width_request:260,height_request:160,margin_top:12,margin_bottom:12});let e=new h.Label({label:`Main child — its size is the overlay`});e.add_css_class(`dim-label`),this._main.set_child(e),this._badge=new h.Box({valign:h.Align.END,halign:h.Align.END}),this._badge.set_css_classes([`osd`,`flat`]),this._badge.append(new h.Label({label:`2`})),this._overlay=new h.Overlay,this._overlay.set_child(this._main),this._overlay.add_overlay(this._badge),this._apply(),this.addContent(this._overlay)}updateArgs(e){this._apply()}_apply(){if(!this._badge)return;let e=ji[String(this.args.halign)],t=ji[String(this.args.valign)];e===void 0?this._badge.halign=h.Align.FILL:this._badge.halign=e,t===void 0?this._badge.valign=h.Align.FILL:this._badge.valign=t,this._badge.visible=this.args.showLabel}};S.type_ensure(Mi.$gtype);const Ni={stories:[Mi]},Pi={title:`Layout/Paned`,description:"Gtk.Paned — two children either side of a divider the user drags. With both children resizable and no position set, GTK divides the paned in PROPORTION TO THE TWO SIZE REQUESTS rather than in half, and it draws the divider as the `separator` node a GtkPanedHandle carries. Libadwaita styles that node in _paned.scss: 1px, 5px when `wide-handle`, with the rule as an inset shadow rather than a fill.",controls:[{name:`orientation`,label:`Orientation`,type:i.SELECT,options:[{label:`Horizontal`,value:`horizontal`},{label:`Vertical`,value:`vertical`}],defaultValue:`horizontal`},{name:`wideHandle`,label:`Wide handle`,type:i.BOOLEAN,defaultValue:!1},{name:`resizeStartChild`,label:`Resize the first child`,type:i.BOOLEAN,defaultValue:!0},{name:`resizeEndChild`,label:`Resize the second child`,type:i.BOOLEAN,defaultValue:!0},{name:`shrinkStartChild`,label:`The first child may shrink`,type:i.BOOLEAN,defaultValue:!0},{name:`position`,label:`Position (0 = derive)`,type:i.NUMBER,min:-1,max:400,step:1,defaultValue:-1}]};var Fi=__exportAll({PanedStories:()=>Li,PanedStory:()=>Ii});function pane(e,t){let n=new h.Box({orientation:h.Orientation.VERTICAL,spacing:4,margin_top:12,margin_bottom:12,margin_start:12,margin_end:12});n.append(new h.Label({label:e}));let r=new h.Label({label:`${t}px of size request`});return r.add_css_class(`dim-label`),n.append(r),n}var Ii=class PanedStory extends k{_paned=null;static{S.registerClass({GTypeName:`AdwStorybookPaned`},PanedStory)}constructor(){super(k.fromMeta(PanedStory.getMetadata(),`Default`))}static getMetadata(){return{...Pi,component:h.Paned.$gtype}}initialize(){this._paned=new h.Paned({orientation:h.Orientation.HORIZONTAL}),this._paned.set_start_child(pane(`First child`,100)),this._paned.set_end_child(pane(`Second child`,300)),this._paned.set_size_request(400,140),this._apply(),this.addContent(this._paned)}updateArgs(e){this._apply()}_apply(){this._paned&&(this._paned.orientation=this.args.orientation===`vertical`?h.Orientation.VERTICAL:h.Orientation.HORIZONTAL,this._paned.wide_handle=this.args.wideHandle,this._paned.resize_start_child=this.args.resizeStartChild,this._paned.resize_end_child=this.args.resizeEndChild,this._paned.shrink_start_child=this.args.shrinkStartChild,this._paned.position=Number(this.args.position))}};S.type_ensure(Ii.$gtype);const Li={stories:[Ii]},Ri=[{label:`Cut`},{label:`Copy`},{label:`Paste`},{label:`Delete`,accel:`<Shift>Delete`}],zi={title:`Layout/Popover Bin`,description:'Gtk.PopoverBin — GTK 4.22’s one-child container with a popover, for the place where "any part of this window can offer a menu" is the answer. `menu-model` builds the popover for you, and `handle-input` is what turns a right click or a long press into a popup — a plain click still reaches the child.',controls:[{name:`handleInput`,label:`Right click / long press opens`,type:i.BOOLEAN,defaultValue:!0}]};var Bi=__exportAll({PopoverBinStories:()=>Hi,PopoverBinStory:()=>Vi}),Vi=class PopoverBinStory extends k{_bin=null;_list=null;static{S.registerClass({GTypeName:`AdwStorybookPopoverBin`},PopoverBinStory)}constructor(){super(k.fromMeta(PopoverBinStory.getMetadata(),`Default`))}static getMetadata(){return{...zi,component:h.PopoverBin.$gtype}}initialize(){this._list=new h.ListBox({selectionMode:h.SelectionMode.SINGLE});for(let e of[`Documents`,`Downloads`,`Pictures`])this._list.append(new h.ListBoxRow({child:new h.Label({label:e})}));this._bin=new h.PopoverBin({child:this._list}),this._apply(),this.addContent(this._bin)}updateArgs(e){this._apply()}_buildMenu(){let e=new x.Menu;for(let t of Ri)e.append(t.label,`app.${t.label.toLowerCase().replace(/[^a-z0-9]+/g,`-`)}`);return e}_apply(){this._bin&&(this._bin.menuModel=this._buildMenu(),this._bin.handleInput=this.args.handleInput)}};S.type_ensure(Vi.$gtype);const Hi={stories:[Vi]},Ui=[{label:`New Window`,accel:`<Control>N`},{section:[{label:`Cut`},{label:`Copy`},{label:`Paste`}],label:`Edit`},{label:`Open With`,submenu:[{label:`Text Editor`},{label:`Web Browser`},{label:`Terminal`}]}],Wi={title:`Layout/Popover Menu`,description:"Gtk.PopoverMenu — a Gtk.Popover whose contents are a menu model instead of a child widget. A submenu swaps the page of the ONE surface rather than opening a second popup beside it, which is why the open page is a named one (`visible-submenu`).",controls:[{name:`menuTitle`,label:`Heading`,type:i.TEXT,defaultValue:`Document`},{name:`position`,label:`Position`,type:i.SELECT,options:[{label:`Bottom`,value:`bottom`},{label:`Top`,value:`top`},{label:`Start`,value:`start`},{label:`End`,value:`end`}],defaultValue:`bottom`},{name:`align`,label:`Align`,type:i.SELECT,options:[{label:`Start`,value:`start`},{label:`End`,value:`end`}],defaultValue:`start`},{name:`autohide`,label:`Dismiss on outside click`,type:i.BOOLEAN,defaultValue:!0}]};var Gi=__exportAll({PopoverMenuStories:()=>qi,PopoverMenuStory:()=>Ki});const actionOf=e=>`app.${e.toLowerCase().replace(/[^a-z0-9]+/g,`-`)}`;var Ki=class PopoverMenuStory extends k{_anchor=null;_popover=null;static{S.registerClass({GTypeName:`AdwStorybookPopoverMenu`},PopoverMenuStory)}constructor(){super(k.fromMeta(PopoverMenuStory.getMetadata(),`Default`))}static getMetadata(){return{...Wi,component:h.PopoverMenu.$gtype}}initialize(){this._anchor=new h.Button({label:`Open menu`,halign:h.Align.CENTER}),this._apply(),this.addContent(this._anchor)}updateArgs(e){this._apply()}_buildMenu(e){let t=new x.Menu,n=[];for(let e of Ui){if(`submenu`in e){let n=new x.Menu;for(let t of e.submenu)n.append(t.label,actionOf(t.label));t.append_submenu(e.label,n);continue}if(`section`in e){let n=new x.Menu;for(let t of e.section)n.append(t.label,actionOf(t.label));t.append_section(`Edit`,n);continue}n.push(e.label)}if(e.length>0){let r=new x.Menu;for(let e of n)r.append(e,actionOf(e));t.append_section(e,r)}else for(let e of n)t.append(e,actionOf(e));return t}_apply(){if(!this._anchor)return;let e=this._popover;this._popover=h.PopoverMenu.new_from_model(this._buildMenu(this.args.menuTitle)),this._popover.set_parent(this._anchor),e?.unparent();let t={bottom:h.PositionType.BOTTOM,top:h.PositionType.TOP,start:h.PositionType.LEFT,end:h.PositionType.RIGHT};this._popover.position=t[this.args.position]??h.PositionType.BOTTOM,this._anchor&&(this._anchor.halign=this.args.align===`end`?h.Align.END:h.Align.START),this._popover.autohide=this.args.autohide}};S.type_ensure(Ki.$gtype);const qi={stories:[Ki]},Ji={title:`Layout/Popover`,description:"Gtk.Popover — the bubble-like surface. No model and no menu: it holds whatever widget you put in it, and everything here is about WHERE it appears and WHEN it goes away. `autohide` off is entry completion: the list follows the typing and the caret never leaves.",controls:[{name:`position`,label:`Position`,type:i.SELECT,options:[{label:`Bottom`,value:`bottom`},{label:`Top`,value:`top`},{label:`Start`,value:`start`},{label:`End`,value:`end`}],defaultValue:`bottom`},{name:`align`,label:`Align`,type:i.SELECT,options:[{label:`Start`,value:`start`},{label:`End`,value:`end`}],defaultValue:`start`},{name:`autohide`,label:`Dismiss on outside click`,type:i.BOOLEAN,defaultValue:!0}]};var Yi=__exportAll({PopoverStories:()=>Zi,PopoverStory:()=>Xi}),Xi=class PopoverStory extends k{_anchor=null;_popover=null;static{S.registerClass({GTypeName:`AdwStorybookPopover`},PopoverStory)}constructor(){super(k.fromMeta(PopoverStory.getMetadata(),`Default`))}static getMetadata(){return{...Ji,component:h.Popover.$gtype}}initialize(){let e=new h.Box({orientation:h.Orientation.VERTICAL,spacing:6});e.append(new h.Label({label:`Anything you like`})),e.append(new h.Label({label:`in here`})),this._anchor=new h.Button({label:`Show popover`,halign:h.Align.CENTER}),this._popover=new h.Popover({child:e}),this._popover.set_parent(this._anchor),this._apply(),this.addContent(this._anchor)}updateArgs(e){this._apply()}_apply(){if(!this._popover)return;let e={bottom:h.PositionType.BOTTOM,top:h.PositionType.TOP,start:h.PositionType.LEFT,end:h.PositionType.RIGHT};this._popover.position=e[this.args.position]??h.PositionType.BOTTOM,this._anchor&&(this._anchor.halign=this.args.align===`end`?h.Align.END:h.Align.START),this._popover.autohide=this.args.autohide}};S.type_ensure(Xi.$gtype);const Zi={stories:[Xi]},Qi={title:`Layout/Revealer`,description:`Gtk.Revealer — shows and hides its child with an animation. The transition is one of fourteen nicks and it is not only an opacity change: a slide scales the box along one axis while allocating the child at its UNSCALED size, and a swing folds it in with sin (π · pos / 2). Libadwaita styles no revealer node of its own, so everything here is GTK behaviour the browser element ports.`,controls:[{name:`transitionType`,label:`Transition`,type:i.SELECT,options:[{label:`Slide down (the default)`,value:`slide-down`},{label:`Slide up`,value:`slide-up`},{label:`Slide left`,value:`slide-left`},{label:`Slide right`,value:`slide-right`},{label:`Crossfade`,value:`crossfade`},{label:`Fade + slide down`,value:`fade-slide-down`},{label:`Swing down (fold)`,value:`swing-down`},{label:`Swing right (fold)`,value:`swing-right`},{label:`None`,value:`none`}],defaultValue:`slide-down`},{name:`transitionDuration`,label:`Duration (ms)`,type:i.RANGE,min:0,max:800,step:50,defaultValue:250},{name:`revealChild`,label:`Reveal`,type:i.BOOLEAN,defaultValue:!0}]};var $i=__exportAll({RevealerStories:()=>na,RevealerStory:()=>ta});const ea={none:h.RevealerTransitionType.NONE,crossfade:h.RevealerTransitionType.CROSSFADE,"slide-right":h.RevealerTransitionType.SLIDE_RIGHT,"slide-left":h.RevealerTransitionType.SLIDE_LEFT,"slide-up":h.RevealerTransitionType.SLIDE_UP,"slide-down":h.RevealerTransitionType.SLIDE_DOWN,"swing-right":h.RevealerTransitionType.SWING_RIGHT,"swing-left":h.RevealerTransitionType.SWING_LEFT,"swing-up":h.RevealerTransitionType.SWING_UP,"swing-down":h.RevealerTransitionType.SWING_DOWN,"fade-slide-right":h.RevealerTransitionType.FADE_SLIDE_RIGHT,"fade-slide-left":h.RevealerTransitionType.FADE_SLIDE_LEFT,"fade-slide-up":h.RevealerTransitionType.FADE_SLIDE_UP,"fade-slide-down":h.RevealerTransitionType.FADE_SLIDE_DOWN};var ta=class RevealerStory extends k{_revealer=null;static{S.registerClass({GTypeName:`AdwStorybookRevealer`},RevealerStory)}constructor(){super(k.fromMeta(RevealerStory.getMetadata(),`Default`))}static getMetadata(){return{...Qi,component:h.Revealer.$gtype}}initialize(){let e=new h.Box({orientation:h.Orientation.VERTICAL,spacing:6,margin_top:12,margin_bottom:12,margin_start:12,margin_end:12});e.append(new h.Label({label:`The revealed child`}));let t=new h.Label({label:`Drag the controls to change the transition`});t.add_css_class(`dim-label`),e.append(t),this._revealer=new h.Revealer,this._revealer.set_child(e),this._apply(),this.addContent(this._revealer)}updateArgs(e){this._apply()}_apply(){this._revealer&&(this._revealer.transition_type=ea[String(this.args.transitionType)],this._revealer.transition_duration=Number(this.args.transitionDuration),this._revealer.reveal_child=this.args.revealChild)}};S.type_ensure(ta.$gtype);const na={stories:[ta]},ra={title:`Layout/Scrollbar`,description:`Gtk.Scrollbar — a trough and a slider, positioned by a GtkAdjustment. The slider is page_size over the whole range long and sits at the position over the SCROLLABLE range, which is why the two numbers it is made of do not share a denominator.`,controls:[{name:`orientation`,label:`Orientation`,type:i.SELECT,options:[{label:`Horizontal`,value:`horizontal`},{label:`Vertical`,value:`vertical`}],defaultValue:`vertical`},{name:`upper`,label:`Adjustment upper`,type:i.NUMBER,defaultValue:400},{name:`pageSize`,label:`Adjustment page size`,type:i.NUMBER,defaultValue:120},{name:`value`,label:`Adjustment value`,type:i.NUMBER,defaultValue:80}]};var ia=__exportAll({ScrollbarStories:()=>oa,ScrollbarStory:()=>aa}),aa=class ScrollbarStory extends k{_scrollbar=null;static{S.registerClass({GTypeName:`AdwStorybookScrollbar`},ScrollbarStory)}constructor(){super(k.fromMeta(ScrollbarStory.getMetadata(),`Default`))}static getMetadata(){return{...ra,component:h.Scrollbar.$gtype}}initialize(){this._scrollbar=new h.Scrollbar({adjustment:new h.Adjustment({step_increment:10,page_increment:80})}),this._apply(),this.addContent(this._scrollbar)}updateArgs(e){this._apply()}_apply(){let e=this._scrollbar;if(!e)return;e.orientation=this.args.orientation===`horizontal`?h.Orientation.HORIZONTAL:h.Orientation.VERTICAL;let t=e.get_adjustment();t&&t.configure(Number(this.args.value),0,Number(this.args.upper),t.step_increment,t.page_increment,Number(this.args.pageSize))}};S.type_ensure(aa.$gtype);const oa={stories:[aa]},sa={title:`Layout/ScrolledWindow`,description:`Gtk.ScrolledWindow — one child, two adjustments, and a scrollbar per edge that can actually scroll. The policies decide whether a bar appears, window-placement which edge it takes, and overlay-scrolling turns the bars into the auto-hiding indicators GNOME draws over the content.`,controls:[{name:`hPolicy`,label:`Horizontal policy`,type:i.SELECT,options:[{label:`Automatic`,value:`automatic`},{label:`Always`,value:`always`},{label:`Never`,value:`never`}],defaultValue:`automatic`},{name:`vPolicy`,label:`Vertical policy`,type:i.SELECT,options:[{label:`Automatic`,value:`automatic`},{label:`Always`,value:`always`},{label:`Never`,value:`never`}],defaultValue:`automatic`},{name:`placement`,label:`Window placement`,type:i.SELECT,options:[{label:`Top left`,value:`top-left`},{label:`Top right`,value:`top-right`},{label:`Bottom left`,value:`bottom-left`},{label:`Bottom right`,value:`bottom-right`}],defaultValue:`top-left`},{name:`frame`,label:`Frame`,type:i.BOOLEAN,defaultValue:!1},{name:`overlayScrolling`,label:`Overlay scrolling`,type:i.BOOLEAN,defaultValue:!0}]};var ca=__exportAll({ScrolledWindowStories:()=>fa,ScrolledWindowStory:()=>da});const la={automatic:h.PolicyType.AUTOMATIC,always:h.PolicyType.ALWAYS,never:h.PolicyType.NEVER},ua={"top-left":h.CornerType.TOP_LEFT,"top-right":h.CornerType.TOP_RIGHT,"bottom-left":h.CornerType.BOTTOM_LEFT,"bottom-right":h.CornerType.BOTTOM_RIGHT};var da=class ScrolledWindowStory extends k{_window=null;static{S.registerClass({GTypeName:`AdwStorybookScrolledWindow`},ScrolledWindowStory)}constructor(){super(k.fromMeta(ScrolledWindowStory.getMetadata(),`Default`))}static getMetadata(){return{...sa,component:h.ScrolledWindow.$gtype}}initialize(){let e=new h.Box({orientation:h.Orientation.VERTICAL,spacing:8});for(let t=1;t<=16;t++)e.append(new h.Label({label:`Row ${t}`}));this._window=new h.ScrolledWindow({child:e,min_content_height:240,halign:h.Align.CENTER}),this._apply(),this.addContent(this._window)}updateArgs(e){this._apply()}_apply(){let e=this._window;e&&(e.set_policy(la[this.args.hPolicy]??h.PolicyType.AUTOMATIC,la[this.args.vPolicy]??h.PolicyType.AUTOMATIC),e.set_placement(ua[this.args.placement]??h.CornerType.TOP_LEFT),e.has_frame=this.args.frame,e.set_overlay_scrolling(this.args.overlayScrolling))}};S.type_ensure(da.$gtype);const fa={stories:[da]},pa={title:`Layout/Separator`,description:`Gtk.Separator — a one-pixel rule between two groups of widgets. Libadwaita ships no Adw.Separator; it only styles the GTK one, and the .spacer style class turns the rule into an empty 12px gap.`,controls:[{name:`orientation`,label:`Orientation`,type:i.SELECT,options:[{label:`Horizontal`,value:`horizontal`},{label:`Vertical`,value:`vertical`}],defaultValue:`horizontal`},{name:`spacer`,label:`Spacer (draws nothing)`,type:i.BOOLEAN,defaultValue:!1}]};var ma=__exportAll({SeparatorStories:()=>ga,SeparatorStory:()=>ha}),ha=class SeparatorStory extends k{_box=null;_separator=null;static{S.registerClass({GTypeName:`AdwStorybookSeparator`},SeparatorStory)}constructor(){super(k.fromMeta(SeparatorStory.getMetadata(),`Default`))}static getMetadata(){return{...pa,component:h.Separator.$gtype}}initialize(){this._separator=new h.Separator,this._box=new h.Box({spacing:12,halign:h.Align.CENTER}),this._box.append(new h.Label({label:`Above`})),this._box.append(this._separator),this._box.append(new h.Label({label:`Below`})),this._apply(),this.addContent(this._box)}updateArgs(e){this._apply()}_apply(){if(!this._box||!this._separator)return;let e=this.args.orientation===`vertical`;this._separator.orientation=e?h.Orientation.VERTICAL:h.Orientation.HORIZONTAL,this._box.orientation=e?h.Orientation.HORIZONTAL:h.Orientation.VERTICAL,this.args.spacer?this._separator.add_css_class(`spacer`):this._separator.remove_css_class(`spacer`)}};S.type_ensure(ha.$gtype);const ga={stories:[ha]},_a={title:`Layout/Toolbar View`,description:`Adw.ToolbarView pins a top header bar and a bottom toolbar around its content, each independently revealable.`,controls:[{name:`revealTopBars`,label:`Reveal top bars`,type:i.BOOLEAN,defaultValue:!0},{name:`revealBottomBars`,label:`Reveal bottom bars`,type:i.BOOLEAN,defaultValue:!0}]};var va=__exportAll({ToolbarViewStories:()=>ba,ToolbarViewStory:()=>ya}),ya=class ToolbarViewStory extends k{_view=null;static{S.registerClass({GTypeName:`AdwStorybookToolbarView`},ToolbarViewStory)}constructor(){super(k.fromMeta(ToolbarViewStory.getMetadata(),`Default`))}static getMetadata(){return{..._a,component:w.ToolbarView.$gtype}}initialize(){this._view=new w.ToolbarView({widthRequest:460,heightRequest:320,revealTopBars:this.args.revealTopBars,revealBottomBars:this.args.revealBottomBars});let e=new w.HeaderBar({titleWidget:new w.WindowTitle({title:`Documents`,subtitle:`12 items`})});this._view.add_top_bar(e);let t=new w.StatusPage({iconName:`folder-documents-symbolic`,title:`Your library`,description:`Content sits between the toolbars and scrolls independently of them.`});this._view.content=t;let n=new h.ActionBar,r=new h.Button({iconName:`list-add-symbolic`});r.add_css_class(`flat`);let i=new h.Button({iconName:`list-remove-symbolic`});i.add_css_class(`flat`),n.pack_start(r),n.pack_start(i),n.set_center_widget(new h.Label({label:`Selection: none`}));let a=new h.Button({iconName:`send-to-symbolic`});a.add_css_class(`flat`),n.pack_end(a),this._view.add_bottom_bar(n),this.addContent(this._view)}updateArgs(e){this._view&&(this._view.revealTopBars=this.args.revealTopBars,this._view.revealBottomBars=this.args.revealBottomBars)}};S.type_ensure(ya.$gtype);const ba={stories:[ya]},xa={title:`Layout/Viewport`,description:`Gtk.Viewport — scrollability for a widget that has none of its own. It has one property, scroll-to-focus: whether a widget that takes the focus is scrolled into view. It is also what a Gtk.ScrolledWindow puts its child in.`,controls:[{name:`scrollToFocus`,label:`Scroll to focus`,type:i.BOOLEAN,defaultValue:!0}]};var Sa=__exportAll({ViewportStories:()=>wa,ViewportStory:()=>Ca}),Ca=class ViewportStory extends k{_viewport=null;static{S.registerClass({GTypeName:`AdwStorybookViewport`},ViewportStory)}constructor(){super(k.fromMeta(ViewportStory.getMetadata(),`Default`))}static getMetadata(){return{...xa,component:h.Viewport.$gtype}}initialize(){let e=new h.Box({orientation:h.Orientation.VERTICAL,spacing:8});for(let t=1;t<=16;t++)e.append(new h.Label({label:`Row ${t}`}));e.append(new h.Button({label:`Focus me`,halign:h.Align.START})),this._viewport=new h.Viewport({child:e,halign:h.Align.CENTER}),this._apply(),this.addContent(this._viewport)}updateArgs(e){this._apply()}_apply(){this._viewport&&this._viewport.set_scroll_to_focus(this.args.scrollToFocus)}};S.type_ensure(Ca.$gtype);const wa={stories:[Ca]},Ta={title:`Layout/Window`,description:`Adw.Window — a freeform window with no titlebar area. Use Adw.ToolbarView with Adw.HeaderBar for the top chrome.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Text Editor`},{name:`subtitle`,label:`Subtitle`,type:i.TEXT,defaultValue:`notes.md`}]};var Ea=__exportAll({WindowStories:()=>Oa,WindowStory:()=>Da}),Da=class WindowStory extends k{_window=null;_title=null;static{S.registerClass({GTypeName:`AdwStorybookWindow`},WindowStory)}constructor(){super(k.fromMeta(WindowStory.getMetadata(),`Default`))}static getMetadata(){return{...Ta,component:w.Window.$gtype}}initialize(){this._title=new w.WindowTitle({title:this.args.title,subtitle:this.args.subtitle});let e=new w.HeaderBar({titleWidget:this._title,widthRequest:460}),t=new h.Button({iconName:`go-previous-symbolic`});t.add_css_class(`flat`),e.pack_start(t);let n=new h.MenuButton({iconName:`open-menu-symbolic`});n.add_css_class(`flat`),e.pack_end(n);let r=new w.ToolbarView;r.add_top_bar(e),r.content=new w.StatusPage({title:`Your Library`,description:`Content sits between the toolbars and scrolls independently of them.`}),this._window=new w.Window({content:r}),this.addContent(this._window)}updateArgs(e){this._title&&(this._title.title=this.args.title,this._title.subtitle=this.args.subtitle)}};S.type_ensure(Da.$gtype);const Oa={stories:[Da]},ka={title:`Layout/Wrap Box`,description:`Adw.WrapBox flows its children horizontally and wraps them onto new lines when they run out of room.`,controls:[{name:`childSpacing`,label:`Child spacing`,type:i.RANGE,min:0,max:36,step:1,defaultValue:8},{name:`lineSpacing`,label:`Line spacing`,type:i.RANGE,min:0,max:36,step:1,defaultValue:8}]};var Aa=__exportAll({WrapBoxStories:()=>Ma,WrapBoxStory:()=>ja}),ja=class WrapBoxStory extends k{_wrap=null;static{S.registerClass({GTypeName:`AdwStorybookWrapBox`},WrapBoxStory)}constructor(){super(k.fromMeta(WrapBoxStory.getMetadata(),`Default`))}static getMetadata(){return{...ka,component:w.WrapBox.$gtype}}initialize(){this._wrap=new w.WrapBox({childSpacing:this.args.childSpacing,lineSpacing:this.args.lineSpacing,widthRequest:460});for(let e of[`Design`,`Adwaita`,`GNOME`,`GTK`,`TypeScript`,`Storybook`,`Wrapping`,`Layout`]){let t=new h.Button({label:e});t.add_css_class(`pill`),this._wrap.append(t)}this.addContent(this._wrap)}updateArgs(e){this._wrap&&(this._wrap.childSpacing=this.args.childSpacing,this._wrap.lineSpacing=this.args.lineSpacing)}};S.type_ensure(ja.$gtype);const Ma={stories:[ja]},Na={title:`Media/Image`,description:`Gtk.Image — a symbolic icon, drawn as a CSS-masked box in the surrounding text colour. It takes a NAME, not a file: a name the icon theme cannot resolve draws the missing-image glyph, which is exactly what GTK draws for it. That is why <gtk-picture> is a separate widget — an icon sized by the theme and an image fitted to a box are two different jobs.`,controls:[{name:`iconName`,label:`Icon name`,type:i.TEXT,defaultValue:`avatar-default-symbolic`},{name:`size`,label:`Size (px)`,type:i.RANGE,min:16,max:96,step:8,defaultValue:48},{name:`disabled`,label:`Disabled`,type:i.BOOLEAN,defaultValue:!1}]};var Pa=__exportAll({ImageStories:()=>Ia,ImageStory:()=>Fa}),Fa=class ImageStory extends k{_image=null;static{S.registerClass({GTypeName:`AdwStorybookImage`},ImageStory)}constructor(){super(k.fromMeta(ImageStory.getMetadata(),`Default`))}static getMetadata(){return{...Na,component:h.Image.$gtype}}initialize(){this._image=new h.Image({halign:h.Align.CENTER,valign:h.Align.CENTER}),this._apply(),this.addContent(this._image)}updateArgs(e){this._apply()}_apply(){this._image&&(this._image.icon_size=this.args.size,this._image.icon_name=this.args.iconName,this._image.sensitive=!this.args.disabled)}};S.type_ensure(Fa.$gtype);const Ia={stories:[Fa]},La={title:`Media/Inscription`,description:`Gtk.Inscription — text laid out to a size in CHARACTERS and LINES rather than to a size in pixels. It is the widget for text whose extent should be the same everywhere, so it never measures its own content: min-chars/nat-chars and min-lines/nat-lines ARE its size request.`,controls:[{name:`text`,label:`Text`,type:i.TEXT,defaultValue:`Inscription`},{name:`minChars`,label:`Min chars`,type:i.RANGE,min:0,max:40,step:1,defaultValue:3},{name:`natChars`,label:`Nat chars`,type:i.RANGE,min:0,max:40,step:1,defaultValue:0},{name:`minLines`,label:`Min lines`,type:i.RANGE,min:0,max:6,step:1,defaultValue:1},{name:`natLines`,label:`Nat lines`,type:i.RANGE,min:0,max:6,step:1,defaultValue:0},{name:`wrapMode`,label:`Wrap mode`,type:i.SELECT,options:[{label:`Word`,value:`word`},{label:`Char`,value:`char`},{label:`Word-char (default)`,value:`word-char`}],defaultValue:`word-char`},{name:`textOverflow`,label:`Text overflow`,type:i.SELECT,options:[{label:`Clip (default)`,value:`clip`},{label:`Ellipsize start`,value:`ellipsize-start`},{label:`Ellipsize middle`,value:`ellipsize-middle`},{label:`Ellipsize end`,value:`ellipsize-end`}],defaultValue:`clip`},{name:`xalign`,label:`X align`,type:i.RANGE,min:0,max:1,step:.05,defaultValue:0},{name:`yalign`,label:`Y align`,type:i.RANGE,min:0,max:1,step:.05,defaultValue:.5}]};var Ra=__exportAll({InscriptionStories:()=>Ba,InscriptionStory:()=>za}),za=class InscriptionStory extends k{_inscription=null;_frame=null;static{S.registerClass({GTypeName:`AdwStorybookInscription`},InscriptionStory)}constructor(){super(k.fromMeta(InscriptionStory.getMetadata(),`Default`))}static getMetadata(){return{...La,component:h.Inscription.$gtype}}initialize(){this._inscription=new h.Inscription,this._frame=new h.Frame({child:this._inscription,halign:h.Align.CENTER}),this._apply(),this.addContent(this._frame)}updateArgs(e){this._apply()}_apply(){!this._inscription||!this._frame||(this._inscription.min_chars=this.args.minChars,this._inscription.nat_chars=this.args.natChars,this._inscription.min_lines=this.args.minLines,this._inscription.nat_lines=this.args.natLines,this._inscription.text=this.args.text,this._inscription.wrap_mode=this.args.wrapMode,this._inscription.text_overflow=this.args.textOverflow,this._inscription.xalign=this.args.xalign,this._inscription.yalign=this.args.yalign,this._frame.width_request=320,this._frame.height_request=160)}};S.type_ensure(za.$gtype);const Ba={stories:[za]},Va={title:`Media/Media Controls`,description:"Gtk.MediaControls — the transport bar: play, position, duration, volume. It owns no playback at all (its one property is an object, `media-stream`), and the bar is INSENSITIVE until a stream is attached. Note which label shows what: the position label shows the elapsed time and the one beside it shows what REMAINS, negatively.",controls:[{name:`sensitive`,label:`Sensitive`,type:i.BOOLEAN,defaultValue:!0}]};var Ha=__exportAll({MediaControlsStories:()=>Wa,MediaControlsStory:()=>Ua}),Ua=class MediaControlsStory extends k{_controls=null;static{S.registerClass({GTypeName:`AdwStorybookMediaControls`},MediaControlsStory)}constructor(){super(k.fromMeta(MediaControlsStory.getMetadata(),`Default`))}static getMetadata(){return{...Va,component:h.MediaControls.$gtype}}initialize(){this._controls=new h.MediaControls,this._controls.add_css_class(`osd`),this._controls.add_css_class(`bottom`),this._apply(),this.addContent(this._controls)}updateArgs(e){this._apply()}_apply(){this._controls&&(this._controls.sensitive=this.args.sensitive)}};S.type_ensure(Ua.$gtype);const Wa={stories:[Ua]},Ga={title:`Media/Picture`,description:"Gtk.Picture — an image fitted to the box it is given, not sized by itself. `content-fit` picks one of the four fit modes (contain, cover, fill, scale-down), `can-shrink` decides whether it may be smaller than its content, and `alternative-text` is what a screen reader hears.",controls:[{name:`contentFit`,label:`Content fit`,type:i.SELECT,options:[{label:`Contain`,value:`contain`},{label:`Cover`,value:`cover`},{label:`Fill`,value:`fill`},{label:`Scale down`,value:`scale-down`}],defaultValue:`contain`},{name:`canShrink`,label:`Can shrink`,type:i.BOOLEAN,defaultValue:!0},{name:`alternativeText`,label:`Alternative text`,type:i.TEXT,defaultValue:`A tangerine`},{name:`isolateContents`,label:`Isolate contents`,type:i.BOOLEAN,defaultValue:!0},{name:`keepAspectRatio`,label:`Keep aspect ratio (deprecated)`,type:i.BOOLEAN,defaultValue:!0},{name:`width`,label:`Width (px)`,type:i.RANGE,min:64,max:320,step:16,defaultValue:240}]};var Ka=__exportAll({PictureStories:()=>Ja,PictureStory:()=>qa});function makePaintable(){let e=320*4,t=new Uint8Array(e*180);for(let n=0;n<180;n++){let r=n<180/2?48:144;for(let i=0;i<320;i++){let a=n*e+i*4;t[a]=r,t[a+1]=i<320/2?64:192,t[a+2]=160,t[a+3]=255}}return f.MemoryTexture.new(320,180,f.MemoryFormat.R8G8B8A8,l.Bytes.new(t),e)}var qa=class PictureStory extends k{_picture=null;static{S.registerClass({GTypeName:`AdwStorybookPicture`},PictureStory)}constructor(){super(k.fromMeta(PictureStory.getMetadata(),`Default`))}static getMetadata(){return{...Ga,component:h.Picture.$gtype}}initialize(){this._picture=new h.Picture({paintable:makePaintable(),halign:h.Align.CENTER,valign:h.Align.CENTER}),this._apply(),this.addContent(this._picture)}updateArgs(e){this._apply()}_apply(){if(!this._picture)return;let e=this.args.width;this._picture.set_size_request(e,Math.round(e*2/3)),this.args.keepAspectRatio&&(this._picture.keep_aspect_ratio=!0),this._picture.content_fit=this.args.contentFit,this._picture.can_shrink=this.args.canShrink,this._picture.alternative_text=this.args.alternativeText,this._picture.isolate_contents=this.args.isolateContents}};S.type_ensure(qa.$gtype);const Ja={stories:[qa]},Ya={title:`Media/Video`,description:`Gtk.Video — a play surface with an overlay icon and a controls bar that hides itself three seconds after you stop moving the pointer. The overlay icon is a four-way choice — no stream, error, ended, or ready — and it is only VISIBLE while the video is stopped; there is no pause glyph over the frames.`,controls:[{name:`autoplay`,label:`Autoplay`,type:i.BOOLEAN,defaultValue:!1},{name:`loop`,label:`Loop`,type:i.BOOLEAN,defaultValue:!0},{name:`graphicsOffload`,label:`Graphics offload`,type:i.BOOLEAN,defaultValue:!1},{name:`width`,label:`Width (px)`,type:i.RANGE,min:160,max:480,step:40,defaultValue:320}]};var Xa=__exportAll({VideoStories:()=>Qa,VideoStory:()=>Za}),Za=class VideoStory extends k{_video=null;static{S.registerClass({GTypeName:`AdwStorybookVideo`},VideoStory)}constructor(){super(k.fromMeta(VideoStory.getMetadata(),`Default`))}static getMetadata(){return{...Ya,component:h.Video.$gtype}}initialize(){this._video=new h.Video({halign:h.Align.CENTER,valign:h.Align.CENTER}),this._apply(),this.addContent(this._video)}updateArgs(e){this._apply()}_apply(){if(!this._video)return;let e=this.args.width;this._video.set_size_request(e,Math.round(e*9/16)),this._video.autoplay=this.args.autoplay,this._video.loop=this.args.loop,this._video.graphics_offload=this.args.graphicsOffload?h.GraphicsOffloadEnabled.ENABLED:h.GraphicsOffloadEnabled.DISABLED}};S.type_ensure(Za.$gtype);const Qa={stories:[Za]},$a={title:`Navigation/Bottom Sheet`,description:`Adw.BottomSheet — a sheet that slides up over the content. Toggle "Open" to reveal it.`,controls:[{name:`open`,label:`Open`,type:i.BOOLEAN,defaultValue:!0},{name:`modal`,label:`Modal`,type:i.BOOLEAN,defaultValue:!0},{name:`canClose`,label:`Can close`,type:i.BOOLEAN,defaultValue:!0}]};var eo=__exportAll({BottomSheetStories:()=>no,BottomSheetStory:()=>to}),to=class BottomSheetStory extends k{_sheet=null;static{S.registerClass({GTypeName:`AdwStorybookBottomSheet`},BottomSheetStory)}constructor(){super(k.fromMeta(BottomSheetStory.getMetadata(),`Default`))}static getMetadata(){return{...$a,component:w.BottomSheet.$gtype}}buildContent(){let e=new h.Button({label:`Toggle sheet`,halign:h.Align.CENTER,valign:h.Align.CENTER,vexpand:!0});return e.add_css_class(`pill`),e.add_css_class(`suggested-action`),e.connect(`clicked`,()=>{this._sheet&&(this._sheet.open=!this._sheet.open)}),e}buildSheet(){let e=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12,marginTop:18,marginBottom:24,marginStart:18,marginEnd:18});e.append(new h.Label({label:`Share track`,halign:h.Align.START,cssClasses:[`title-2`]}));let t=new w.PreferencesGroup;for(let[e,n]of[[`Copy link`,`edit-copy-symbolic`],[`Send to a friend`,`mail-send-symbolic`],[`Add to playlist`,`list-add-symbolic`]]){let r=new w.ActionRow({title:e});r.add_prefix(new h.Image({iconName:n})),r.activatable=!0,t.add(r)}return e.append(t),e}initialize(){this._sheet=new w.BottomSheet({content:this.buildContent(),sheet:this.buildSheet(),open:this.args.open,modal:this.args.modal,canClose:this.args.canClose,widthRequest:480,heightRequest:340}),this.addContent(this._sheet)}updateArgs(e){this._sheet&&(this._sheet.open=this.args.open,this._sheet.modal=this.args.modal,this._sheet.canClose=this.args.canClose)}};S.type_ensure(to.$gtype);const no={stories:[to]},ro={title:`Navigation/Navigation Split View`,description:`Adw.NavigationSplitView — a resizable sidebar beside a content pane. When collapsed it folds into a navigation stack.`,controls:[{name:`showContent`,label:`Show content`,type:i.BOOLEAN,defaultValue:!0},{name:`collapsed`,label:`Collapsed`,type:i.BOOLEAN,defaultValue:!1}]};var io=__exportAll({NavigationSplitViewStories:()=>oo,NavigationSplitViewStory:()=>ao}),ao=class NavigationSplitViewStory extends k{_view=null;static{S.registerClass({GTypeName:`AdwStorybookNavigationSplitView`},NavigationSplitViewStory)}constructor(){super(k.fromMeta(NavigationSplitViewStory.getMetadata(),`Default`))}static getMetadata(){return{...ro,component:w.NavigationSplitView.$gtype}}buildSidebar(){let e=new w.PreferencesGroup;for(let[t,n,r]of[[`All Mail`,`128 messages`,`mail-unread-symbolic`],[`Starred`,`6 messages`,`starred-symbolic`],[`Drafts`,`2 messages`,`document-edit-symbolic`],[`Archive`,`512 messages`,`folder-symbolic`]]){let i=new w.ActionRow({title:t,subtitle:n});i.add_prefix(new h.Image({iconName:r})),i.activatable=!0,e.add(i)}let t=new w.ToolbarView;return t.add_top_bar(new w.HeaderBar),t.content=e,new w.NavigationPage({title:`Mailboxes`,child:t})}buildContent(){let e=new w.StatusPage({iconName:`mail-unread-symbolic`,title:`All Mail`,description:`Select a conversation from the list to read it here.`,vexpand:!0}),t=new w.ToolbarView;return t.add_top_bar(new w.HeaderBar),t.content=e,new w.NavigationPage({title:`All Mail`,child:t})}initialize(){this._view=new w.NavigationSplitView({sidebar:this.buildSidebar(),content:this.buildContent(),showContent:this.args.showContent,collapsed:this.args.collapsed,widthRequest:480,heightRequest:340}),this.addContent(this._view)}updateArgs(e){this._view&&(this._view.showContent=this.args.showContent,this._view.collapsed=this.args.collapsed)}};S.type_ensure(ao.$gtype);const oo={stories:[ao]},so={title:`Navigation/Navigation View`,description:`Adw.NavigationView — a navigation stack. The root page pushes a detail page, which gets an automatic back button.`,controls:[{name:`rootTitle`,label:`Root title`,type:i.TEXT,defaultValue:`Contacts`},{name:`detailTitle`,label:`Detail title`,type:i.TEXT,defaultValue:`Ada Lovelace`},{name:`animateTransitions`,label:`Animate transitions`,type:i.BOOLEAN,defaultValue:!0}]};var co=__exportAll({NavigationViewStories:()=>uo,NavigationViewStory:()=>lo}),lo=class NavigationViewStory extends k{_view=null;static{S.registerClass({GTypeName:`AdwStorybookNavigationView`},NavigationViewStory)}constructor(){super(k.fromMeta(NavigationViewStory.getMetadata(),`Default`))}static getMetadata(){return{...so,component:w.NavigationView.$gtype}}buildPage(e,t){let n=new w.ToolbarView;return n.add_top_bar(new w.HeaderBar),n.content=t,new w.NavigationPage({title:e,child:n})}initialize(){this._view=new w.NavigationView({animateTransitions:this.args.animateTransitions,widthRequest:480,heightRequest:340});let e=this.buildPage(this.args.detailTitle,new w.StatusPage({iconName:`avatar-default-symbolic`,title:this.args.detailTitle,description:`Mathematician and writer, the first computer programmer.`,vexpand:!0})),t=new h.Button({label:`Open contact`,halign:h.Align.CENTER,valign:h.Align.CENTER,vexpand:!0});t.add_css_class(`pill`),t.add_css_class(`suggested-action`),t.connect(`clicked`,()=>{this._view?.push(e)});let n=this.buildPage(this.args.rootTitle,t);this._view.add(n),this._view.add(e),this.addContent(this._view)}updateArgs(e){this._view&&(this._view.animateTransitions=this.args.animateTransitions)}};S.type_ensure(lo.$gtype);const uo={stories:[lo]},fo={title:`Navigation/Overlay Split View`,description:`Adw.OverlaySplitView — a sidebar shown beside the content, or overlaid on top of it when collapsed.`,controls:[{name:`showSidebar`,label:`Show sidebar`,type:i.BOOLEAN,defaultValue:!0},{name:`collapsed`,label:`Collapsed`,type:i.BOOLEAN,defaultValue:!1}]};var po=__exportAll({OverlaySplitViewStories:()=>ho,OverlaySplitViewStory:()=>mo}),mo=class OverlaySplitViewStory extends k{_view=null;static{S.registerClass({GTypeName:`AdwStorybookOverlaySplitView`},OverlaySplitViewStory)}constructor(){super(k.fromMeta(OverlaySplitViewStory.getMetadata(),`Default`))}static getMetadata(){return{...fo,component:w.OverlaySplitView.$gtype}}buildSidebar(){let e=new w.PreferencesGroup;for(let[t,n]of[[`Home`,`go-home-symbolic`],[`Discover`,`system-search-symbolic`],[`Library`,`folder-music-symbolic`],[`Settings`,`emblem-system-symbolic`]]){let r=new w.ActionRow({title:t});r.add_prefix(new h.Image({iconName:n})),r.activatable=!0,e.add(r)}let t=new w.ToolbarView;return t.add_top_bar(new w.HeaderBar({showTitle:!1})),t.content=e,t.add_css_class(`sidebar`),t}buildContent(){let e=new w.StatusPage({iconName:`folder-music-symbolic`,title:`Your Library`,description:`Toggle the sidebar to browse sections. Collapse it to overlay the content.`,vexpand:!0}),t=new w.ToolbarView;return t.add_top_bar(new w.HeaderBar),t.content=e,t}initialize(){this._view=new w.OverlaySplitView({sidebar:this.buildSidebar(),content:this.buildContent(),showSidebar:this.args.showSidebar,collapsed:this.args.collapsed,widthRequest:480,heightRequest:340}),this.addContent(this._view)}updateArgs(e){this._view&&(this._view.showSidebar=this.args.showSidebar,this._view.collapsed=this.args.collapsed)}};S.type_ensure(mo.$gtype);const ho={stories:[mo]},go=[{label:`File`,submenu:[{label:`New Window`,accel:`<Control>N`},{label:`New Tab`,accel:`<Control><Shift>N`},{label:`Open…`,accel:`<Control>O`}]},{label:`Edit`,submenu:[{label:`Undo`,accel:`<Control>Z`},{label:`Redo`,accel:`<Control>Y`}]},{label:`View`,submenu:[{label:`Zoom In`,accel:`<Control>plus`},{label:`Zoom Out`}]},{label:`Help`,submenu:[{label:`Keyboard Shortcuts`},{label:`About`}]}],_o={title:`Navigation/Popover Menu Bar`,description:`Gtk.PopoverMenuBar — a horizontal bar of items that pop up menus when clicked. Clicking an item OPENS its menu; hovering only SELECTS, and the item lights up (.active) exactly while its menu is up. Left and Right walk the bar and wrap.`,controls:[{name:`position`,label:`Menu position`,type:i.SELECT,options:[{label:`Below`,value:`bottom`},{label:`Above`,value:`top`}],defaultValue:`bottom`},{name:`showLast`,label:`Include Help`,type:i.BOOLEAN,defaultValue:!0}]};var vo=__exportAll({PopoverMenuBarStories:()=>bo,PopoverMenuBarStory:()=>yo}),yo=class PopoverMenuBarStory extends k{_bar=null;static{S.registerClass({GTypeName:`AdwStorybookPopoverMenuBar`},PopoverMenuBarStory)}constructor(){super(k.fromMeta(PopoverMenuBarStory.getMetadata(),`Default`))}static getMetadata(){return{..._o,component:h.PopoverMenuBar.$gtype}}initialize(){this._bar=h.PopoverMenuBar.new_from_model(this._buildMenu()),this._bar.halign=h.Align.START,this._apply(),this.addContent(this._bar)}updateArgs(e){this._apply()}_buildMenu(){let e=new x.Menu,t=this.args.showLast===!1?go.slice(0,3):go;for(let n of t){let t=new x.Menu;for(let e of n.submenu)t.append(e.label,`app.${e.label.toLowerCase().replace(/[^a-z0-9]+/g,`-`)}`);e.append_submenu(n.label,t)}return e}_apply(){if(!this._bar)return;let e=this.args.position===`top`;for(let t=this._bar.get_first_child();t!==null;t=t.get_next_sibling())t.get_first_child()?.set_position(e?h.PositionType.TOP:h.PositionType.BOTTOM)}};S.type_ensure(yo.$gtype);const bo={stories:[yo]},xo={title:`Navigation/Sidebar`,description:`Adw.Sidebar — a selectable list of Adw.SidebarItem grouped into sections. Selecting an item updates the content.`,controls:[{name:`mode`,label:`Mode`,type:i.SELECT,options:[{label:`Sidebar`,value:`sidebar`},{label:`Page`,value:`page`}],defaultValue:`sidebar`},{name:`selected`,label:`Selected index`,type:i.NUMBER,min:0,max:3,step:1,defaultValue:0}]};var So=__exportAll({SidebarStories:()=>wo,SidebarStory:()=>Co}),Co=class SidebarStory extends k{_sidebar=null;_status=null;static{S.registerClass({GTypeName:`AdwStorybookSidebar`},SidebarStory)}constructor(){super(k.fromMeta(SidebarStory.getMetadata(),`Default`))}static getMetadata(){return{...xo,component:w.Sidebar.$gtype}}items=[{title:`Inbox`,subtitle:`3 unread`,icon:`mail-unread-symbolic`},{title:`Starred`,subtitle:`Favourites`,icon:`starred-symbolic`},{title:`Sent`,subtitle:`Outgoing mail`,icon:`mail-send-symbolic`},{title:`Archive`,subtitle:`Older mail`,icon:`folder-symbolic`}];modeFromArg(e){return e===`page`?w.SidebarMode.PAGE:w.SidebarMode.SIDEBAR}syncContent(){if(!this._sidebar||!this._status)return;let e=this.items[this._sidebar.selected]??this.items[0];this._status.title=e.title,this._status.iconName=e.icon,this._status.description=e.subtitle}initialize(){let e=new w.SidebarSection({title:`Mailboxes`});for(let t of this.items)e.append(new w.SidebarItem({title:t.title,subtitle:t.subtitle,iconName:t.icon}));this._sidebar=new w.Sidebar({mode:this.modeFromArg(this.args.mode),selected:this.args.selected,widthRequest:220}),this._sidebar.append(e),this._sidebar.connect(`notify::selected`,()=>this.syncContent()),this._status=new w.StatusPage({hexpand:!0,vexpand:!0});let t=new h.Box({orientation:h.Orientation.HORIZONTAL,widthRequest:480,heightRequest:340});t.append(this._sidebar),t.append(new h.Separator({orientation:h.Orientation.VERTICAL})),t.append(this._status),this.syncContent(),this.addContent(t)}updateArgs(e){this._sidebar&&(this._sidebar.mode=this.modeFromArg(this.args.mode),this._sidebar.selected=this.args.selected,this.syncContent())}};S.type_ensure(Co.$gtype);const wo={stories:[Co]},To=[{title:`Sync`,kind:`switch`,active:!0},{title:`Export`,kind:`action`}],Eo=[`Blue`,`Teal`,`Green`,`Orange`],X={appearance:`Appearance`,account:`Account`,shortcuts:`Shortcuts`,actions:`Actions`},Z={bannerTitle:`You have unsaved changes`,bannerButton:`Save`,darkMode:`Dark mode`,darkModeSubtitle:`Use the dark Adwaita palette`,notifications:`Notifications`,notificationsSubtitle:`Show toasts for events`,accentColor:`Accent color`,name:`Name`,nameValue:`Ada Lovelace`,email:`Email`,emailValue:`ada@example.com`,devices:`Devices`,advanced:`Advanced`,advancedSubtitle:`More options`,save:`Save changes`,delete:`Delete account`},Q={value:3,lower:1,upper:10,step:1},Do=[{title:`Copy`,accelerator:`<Control>C`},{title:`Select all`,accelerator:`<Shift><Control>a`},{title:`Switch tab`,accelerator:`<Alt>1...9`}],Oo={title:`Overview/Widgets`,description:`Many widgets at once, the way an app composes them: a banner, preference groups of rows, an expander, buttons and shortcut labels. Use it to judge spacing, alignment and the theme as a whole rather than one widget in isolation.`,controls:[{name:`revealed`,label:`Show banner`,type:i.BOOLEAN,description:`Adw.Banner:revealed — animates in and out`,defaultValue:!0}]};var ko=__exportAll({OverviewWidgetsStories:()=>jo,OverviewWidgetsStory:()=>Ao}),Ao=class OverviewWidgetsStory extends k{_banner=null;static{S.registerClass({GTypeName:`AdwStorybookOverviewWidgets`},OverviewWidgetsStory)}constructor(){super(k.fromMeta(OverviewWidgetsStory.getMetadata(),`Default`))}static getMetadata(){return Oo}initialize(){let e=new h.Box({orientation:h.Orientation.VERTICAL,hexpand:!0});this._banner=new w.Banner({title:Z.bannerTitle,button_label:Z.bannerButton,revealed:this.args.revealed}),e.append(this._banner);let t=new w.PreferencesPage({hexpand:!0}),n=new w.PreferencesGroup({title:X.appearance});n.add(new w.SwitchRow({title:Z.darkMode,subtitle:Z.darkModeSubtitle,active:!1})),n.add(new w.SwitchRow({title:Z.notifications,subtitle:Z.notificationsSubtitle,active:!0})),n.add(new w.ComboRow({title:Z.accentColor,model:h.StringList.new([...Eo]),selected:0})),t.add(n);let r=new w.PreferencesGroup({title:X.account}),i=new w.EntryRow({title:Z.name});i.set_text(Z.nameValue),r.add(i);let a=new w.EntryRow({title:Z.email});a.set_text(Z.emailValue),r.add(a);let o=new w.SpinRow({title:Z.devices,adjustment:new h.Adjustment({value:Q.value,lower:Q.lower,upper:Q.upper,step_increment:Q.step,page_increment:Q.step})});o.set_value(Q.value),r.add(o);let s=new w.ExpanderRow({title:Z.advanced,subtitle:Z.advancedSubtitle,expanded:!0});for(let e of To)s.add_row(e.kind===`switch`?new w.SwitchRow({title:e.title,active:e.active??!1}):new w.ActionRow({title:e.title}));r.add(s),t.add(r);let c=new w.PreferencesGroup({title:X.shortcuts});for(let e of Do){let t=new w.ActionRow({title:e.title});t.add_suffix(new w.ShortcutLabel({accelerator:e.accelerator,valign:h.Align.CENTER})),c.add(t)}t.add(c);let l=new w.PreferencesGroup({title:X.actions}),u=new h.Box({orientation:h.Orientation.HORIZONTAL,spacing:12,homogeneous:!0,margin_top:6,margin_bottom:6}),d=new h.Button({label:Z.save});d.add_css_class(`suggested-action`),u.append(d);let f=new h.Button({label:Z.delete});f.add_css_class(`destructive-action`),u.append(f),l.add(u),t.add(l),e.append(t),this.addContent(e)}updateArgs(e){this._banner?.set_revealed(this.args.revealed)}};S.type_ensure(Ao.$gtype);const jo={stories:[Ao]},Mo={title:`Presentation/Avatar`,description:`A circular avatar that derives initials (and a colour) from a name, or shows a symbolic icon.`,controls:[{name:`text`,label:`Name`,type:i.TEXT,defaultValue:`Ada Lovelace`},{name:`size`,label:`Size`,type:i.RANGE,min:24,max:160,step:8,defaultValue:96},{name:`showInitials`,label:`Show initials`,type:i.BOOLEAN,defaultValue:!0},{name:`iconName`,label:`Fallback icon`,type:i.SELECT,options:[{label:`Person`,value:`avatar-default-symbolic`},{label:`Contact`,value:`contact-new-symbolic`},{label:`Camera`,value:`camera-photo-symbolic`}],defaultValue:`avatar-default-symbolic`}]};var No=__exportAll({AvatarStories:()=>Fo,AvatarStory:()=>Po}),Po=class AvatarStory extends k{_avatar=null;static{S.registerClass({GTypeName:`AdwStorybookAvatar`},AvatarStory)}constructor(){super(k.fromMeta(AvatarStory.getMetadata(),`Default`))}static getMetadata(){return{...Mo,component:w.Avatar.$gtype}}initialize(){this._avatar=new w.Avatar({size:this.args.size,text:this.args.text,showInitials:this.args.showInitials,iconName:this.args.iconName}),this.addContent(this._avatar)}updateArgs(e){this._avatar&&(this._avatar.size=this.args.size,this._avatar.text=this.args.text,this._avatar.showInitials=this.args.showInitials,this._avatar.iconName=this.args.iconName)}};S.type_ensure(Po.$gtype);const Fo={stories:[Po]},Io={title:`Presentation/Banner`,description:`Adw.Banner — a full-width strip carrying a status message and an optional action button.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Metered connection — updates paused`},{name:`buttonLabel`,label:`Button label`,type:i.TEXT,defaultValue:`Resume`},{name:`revealed`,label:`Revealed`,type:i.BOOLEAN,defaultValue:!0},{name:`useMarkup`,label:`Use markup`,type:i.BOOLEAN,defaultValue:!1}]};var Lo=__exportAll({BannerStories:()=>zo,BannerStory:()=>Ro}),Ro=class BannerStory extends k{_banner=null;static{S.registerClass({GTypeName:`AdwStorybookBanner`},BannerStory)}constructor(){super(k.fromMeta(BannerStory.getMetadata(),`Default`))}static getMetadata(){return{...Io,component:w.Banner.$gtype}}initialize(){this._banner=new w.Banner({title:this.args.title,buttonLabel:this.args.buttonLabel,revealed:this.args.revealed,useMarkup:this.args.useMarkup});let e=new h.Box({orientation:h.Orientation.VERTICAL,widthRequest:460});e.append(this._banner),this.addContent(e)}updateArgs(e){this._banner&&(this._banner.title=this.args.title,this._banner.buttonLabel=this.args.buttonLabel,this._banner.revealed=this.args.revealed,this._banner.useMarkup=this.args.useMarkup)}};S.type_ensure(Ro.$gtype);const zo={stories:[Ro]},Bo=[14,25],Vo={title:`Presentation/Calendar`,description:`Gtk.Calendar — a six-by-seven month grid with four navigation arrows. The arrows clamp the way g_date_time_add_months does, so paging from the 31st lands on the 28th, and a marked day is a day NUMBER of the shown month, so it survives a month that has no such day.`,controls:[{name:`showHeading`,label:`Heading`,type:i.BOOLEAN,defaultValue:!0},{name:`showDayNames`,label:`Day names`,type:i.BOOLEAN,defaultValue:!0},{name:`showWeekNumbers`,label:`Week numbers`,type:i.BOOLEAN,defaultValue:!0}]};var Ho=__exportAll({CalendarStories:()=>Wo,CalendarStory:()=>Uo}),Uo=class CalendarStory extends k{_calendar=null;_marked=!1;static{S.registerClass({GTypeName:`AdwStorybookCalendar`},CalendarStory)}constructor(){super(k.fromMeta(CalendarStory.getMetadata(),`Default`))}static getMetadata(){return{...Vo,component:h.Calendar.$gtype}}initialize(){this._calendar=new h.Calendar({hexpand:!1}),this._calendar.date=parseIso(`2026-10-02`),this._apply(),this.addContent(this._calendar)}updateArgs(e){this._apply()}_apply(){if(this._calendar){this._calendar.show_heading=this.args.showHeading,this._calendar.show_day_names=this.args.showDayNames,this._calendar.show_week_numbers=this.args.showWeekNumbers,this._marked&&this._calendar.clear_marks();for(let e of Bo)this._calendar.mark_day(e);this._marked=!0}}};function parseIso(e){let[t,n,r]=e.split(`-`).map(Number);return l.DateTime.new_local(t,n,r,0,0,0)}S.type_ensure(Uo.$gtype);const Wo={stories:[Uo]},Go=[{value:`de`,label:`German`},{value:`fr`,label:`French`},{value:`nl`,label:`Dutch`},{value:`pt`,label:`Portuguese`}],Ko={title:`Presentation/Column View`,description:`Gtk.ColumnView — a list view with a header and one cell per column. Clicking a sortable header sets the sort and inverts it on the next click; the view itself reorders nothing.`,controls:[{name:`showRowSeparators`,label:`Row separators`,type:i.BOOLEAN,defaultValue:!0},{name:`showColumnSeparators`,label:`Column separators`,type:i.BOOLEAN,defaultValue:!1},{name:`reorderable`,label:`Drag columns to reorder`,type:i.BOOLEAN,defaultValue:!1}]};var qo=__exportAll({ColumnViewStories:()=>Yo,ColumnViewStory:()=>Jo}),Jo=class ColumnViewStory extends k{_view=null;static{S.registerClass({GTypeName:`AdwStorybookColumnView`},ColumnViewStory)}constructor(){super(k.fromMeta(ColumnViewStory.getMetadata(),`Default`))}static getMetadata(){return{...Ko,component:h.ColumnView.$gtype}}initialize(){let e=h.StringList.new(Go.map(e=>e.label));this._view=new h.ColumnView({model:h.SingleSelection.new(e),vexpand:!0}),this._view.append_column(this._column(`Name`,e=>e.label)),this._view.append_column(this._column(`Code`,e=>e.value));let t=new h.ScrolledWindow({child:this._view,heightRequest:200,hexpand:!0});this._apply(),this.addContent(t)}updateArgs(e){this._apply()}_apply(){this._view&&(this._view.showRowSeparators=this.args.showRowSeparators,this._view.showColumnSeparators=this.args.showColumnSeparators,this._view.reorderable=this.args.reorderable)}_column(e,t){let n=new h.SignalListItemFactory;return n.connect(`setup`,(e,t)=>{t.child=new h.Label({xalign:0})}),n.connect(`bind`,(e,n)=>{let r=n,i=r.child,a=r.item.string,o=Go.find(e=>e.label===a);i.label=o===void 0?a:t(o)}),new h.ColumnViewColumn({title:e,factory:n,expand:!0})}};S.type_ensure(Jo.$gtype);const Yo={stories:[Jo]},Xo=[`Red`,`Orange`,`Yellow`,`Green`,`Blue`,`Purple`,`Teal`,`Grey`],Zo={title:`Presentation/Flow Box`,description:`Gtk.FlowBox — the same selectable rows a list box holds, reflowed into as many per line as the width fits. HORIZONTAL is the default here, unlike every GtkOrientable list base; the arrows move by visual position, so the cross-line key lands in the same column of the next line.`,controls:[{name:`selectionMode`,label:`Selection`,type:i.SELECT,options:[{label:`Single`,value:`single`},{label:`Multiple`,value:`multiple`},{label:`Browse`,value:`browse`},{label:`None`,value:`none`}],defaultValue:`multiple`},{name:`orientation`,label:`Orientation`,type:i.SELECT,options:[{label:`Horizontal`,value:`horizontal`},{label:`Vertical`,value:`vertical`}],defaultValue:`horizontal`},{name:`maxChildrenPerLine`,label:`Max children per line`,type:i.NUMBER,defaultValue:3},{name:`homogeneous`,label:`Homogeneous`,type:i.BOOLEAN,defaultValue:!1},{name:`rowSpacing`,label:`Row spacing`,type:i.NUMBER,defaultValue:6}]};var Qo=__exportAll({FlowBoxStories:()=>es,FlowBoxStory:()=>$o}),$o=class FlowBoxStory extends k{_box=null;static{S.registerClass({GTypeName:`AdwStorybookFlowBox`},FlowBoxStory)}constructor(){super(k.fromMeta(FlowBoxStory.getMetadata(),`Default`))}static getMetadata(){return{...Zo,component:h.FlowBox.$gtype}}initialize(){this._box=new h.FlowBox({hexpand:!0,vexpand:!0});for(let e of Xo)this._box.append(new h.FlowBoxChild({child:new h.Label({label:e})}));this._apply(),this.addContent(this._box)}updateArgs(e){this._apply()}_apply(){this._box&&(this._box.selection_mode=this._selectionMode(),this._box.orientation=this.args.orientation===`vertical`?h.Orientation.VERTICAL:h.Orientation.HORIZONTAL,this._box.max_children_per_line=Math.max(1,Math.trunc(this.args.maxChildrenPerLine)),this._box.homogeneous=this.args.homogeneous,this._box.row_spacing=Math.max(0,Math.trunc(this.args.rowSpacing)))}_selectionMode(){switch(this.args.selectionMode){case`single`:return h.SelectionMode.SINGLE;case`browse`:return h.SelectionMode.BROWSE;case`none`:return h.SelectionMode.NONE;default:return h.SelectionMode.MULTIPLE}}};S.type_ensure($o.$gtype);const es={stories:[$o]},ts=[`Documents`,`Downloads`,`Music`,`Pictures`,`Videos`],ns=[{label:`Single`,value:`single`},{label:`Multiple`,value:`multiple`},{label:`None`,value:`none`}],rs={title:`Presentation/List View`,description:`Gtk.ListView — one row per item of a list model, each built by a factory. The model is the portable list (ADR 0046); which Gtk.SelectionModel would have wrapped it is the selection mode.`,controls:[{name:`selectionMode`,label:`Selection`,type:i.SELECT,options:ns,defaultValue:`single`},{name:`showSeparators`,label:`Separators`,type:i.BOOLEAN,defaultValue:!0},{name:`singleClickActivate`,label:`Activate on single click`,type:i.BOOLEAN,defaultValue:!1}]},is=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`],as={title:`Presentation/Grid View`,description:`Gtk.GridView — the same model and factory as a list view, reflowed into as many equal columns as the width fits, between min-columns and max-columns.`,controls:[{name:`maxColumns`,label:`Max columns`,type:i.NUMBER,defaultValue:4},{name:`minColumns`,label:`Min columns`,type:i.NUMBER,defaultValue:1},{name:`selectionMode`,label:`Selection`,type:i.SELECT,options:ns,defaultValue:`single`}]};var os=__exportAll({GridViewStories:()=>cs,GridViewStory:()=>ss}),ss=class GridViewStory extends k{_view=null;_model=null;static{S.registerClass({GTypeName:`AdwStorybookGridView`},GridViewStory)}constructor(){super(k.fromMeta(GridViewStory.getMetadata(),`Default`))}static getMetadata(){return{...as,component:h.GridView.$gtype}}initialize(){this._model=h.StringList.new([...is]);let e=new h.SignalListItemFactory;e.connect(`setup`,(e,t)=>{t.child=new h.Label({xalign:.5})}),e.connect(`bind`,(e,t)=>{let n=t,r=n.child;r.label=n.item.string}),this._view=new h.GridView({factory:e,vexpand:!0});let t=new h.ScrolledWindow({child:this._view,heightRequest:200,hexpand:!0});this._apply(),this.addContent(t)}updateArgs(e){this._apply()}_apply(){!this._view||!this._model||(this._view.model=this.args.selectionMode===`multiple`?h.MultiSelection.new(this._model):this.args.selectionMode===`none`?h.NoSelection.new(this._model):h.SingleSelection.new(this._model),this._view.minColumns=Math.max(1,this.args.minColumns),this._view.maxColumns=Math.max(this._view.minColumns,this.args.maxColumns))}};S.type_ensure(ss.$gtype);const cs={stories:[ss]},ls=[`Documents`,`Downloads`,`Music`,`Pictures`,`Videos`],us={title:`Presentation/List Box`,description:`Gtk.ListBox — one row per child you append, with GTK’s four selection modes. Ctrl toggles and Shift extends from the anchor the last Shift-click left behind; activate-on-single-click defaults to TRUE here, unlike Gtk.ListView’s single-click-activate.`,controls:[{name:`selectionMode`,label:`Selection`,type:i.SELECT,options:[{label:`Single`,value:`single`},{label:`Multiple`,value:`multiple`},{label:`Browse`,value:`browse`},{label:`None`,value:`none`}],defaultValue:`single`},{name:`showSeparators`,label:`Separators`,type:i.BOOLEAN,defaultValue:!0},{name:`activateOnSingleClick`,label:`Activate on single click`,type:i.BOOLEAN,defaultValue:!0},{name:`tabBehavior`,label:`Tab behaviour`,type:i.SELECT,options:[{label:`All`,value:`all`},{label:`Item`,value:`item`},{label:`Cell`,value:`cell`}],defaultValue:`all`}]};var ds=__exportAll({ListBoxStories:()=>ps,ListBoxStory:()=>fs}),fs=class ListBoxStory extends k{_box=null;static{S.registerClass({GTypeName:`AdwStorybookListBox`},ListBoxStory)}constructor(){super(k.fromMeta(ListBoxStory.getMetadata(),`Default`))}static getMetadata(){return{...us,component:h.ListBox.$gtype}}initialize(){this._box=new h.ListBox({hexpand:!0});for(let e of ls)this._box.append(new h.ListBoxRow({child:new h.Label({label:e,xalign:0})}));this._apply();let e=new h.ScrolledWindow({child:this._box,heightRequest:200});this.addContent(e)}updateArgs(e){this._apply()}_apply(){this._box&&(this._box.selection_mode=this._selectionMode(),this._box.show_separators=this.args.showSeparators,this._box.activate_on_single_click=this.args.activateOnSingleClick,this._box.tab_behavior=this.args.tabBehavior)}_selectionMode(){switch(this.args.selectionMode){case`multiple`:return h.SelectionMode.MULTIPLE;case`browse`:return h.SelectionMode.BROWSE;case`none`:return h.SelectionMode.NONE;default:return h.SelectionMode.SINGLE}}};S.type_ensure(fs.$gtype);const ps={stories:[fs]};var ms=__exportAll({ListViewStories:()=>gs,ListViewStory:()=>hs}),hs=class ListViewStory extends k{_view=null;_model=null;static{S.registerClass({GTypeName:`AdwStorybookListView`},ListViewStory)}constructor(){super(k.fromMeta(ListViewStory.getMetadata(),`Default`))}static getMetadata(){return{...rs,component:h.ListView.$gtype}}initialize(){this._model=h.StringList.new([...ts]);let e=new h.SignalListItemFactory;e.connect(`setup`,(e,t)=>{t.child=new h.Label({xalign:0})}),e.connect(`bind`,(e,t)=>{let n=t,r=n.child;r.label=n.item.string}),this._view=new h.ListView({factory:e,vexpand:!0});let t=new h.ScrolledWindow({child:this._view,heightRequest:200,hexpand:!0});this._apply(),this.addContent(t)}updateArgs(e){this._apply()}_apply(){!this._view||!this._model||(this._view.model=this._selectionModel(this._model),this._view.showSeparators=this.args.showSeparators,this._view.singleClickActivate=this.args.singleClickActivate)}_selectionModel(e){switch(this.args.selectionMode){case`multiple`:return h.MultiSelection.new(e);case`none`:return h.NoSelection.new(e);default:return h.SingleSelection.new(e)}}};S.type_ensure(hs.$gtype);const gs={stories:[hs]},_s=[{label:`Single`,accelerator:`<Control>C`},{label:`Modifier order`,accelerator:`<Shift><Control>a`},{label:`Alternatives`,accelerator:`<Shift>A Home`},{label:`Range`,accelerator:`<Alt>1...9`},{label:`In sequence`,accelerator:`<Control>C+<Control>X`},{label:`Together`,accelerator:`Control_L&Control_R`},{label:`Nested`,accelerator:`<Alt>1...9 <Alt>0`},{label:`Unset`,accelerator:``}],vs={title:`Presentation/Shortcut Label`,description:`Adw.ShortcutLabel — an accelerator drawn as keycaps. The four grammar levels: alternatives (space), a range (...), pressed in sequence (+), and pressed together (&).`,controls:[{name:`accelerator`,label:`Accelerator`,type:i.SELECT,options:[{label:`Ctrl+C`,value:`<Control>C`},{label:`Modifier order (Shift+Ctrl+A)`,value:`<Shift><Control>a`},{label:`Alternatives (Shift+A / Home)`,value:`<Shift>A Home`},{label:`Range (Alt+1…9)`,value:`<Alt>1...9`},{label:`In sequence (Ctrl+C → Ctrl+X)`,value:`<Control>C+<Control>X`},{label:`Together (Ctrl L + Ctrl R)`,value:`Control_L&Control_R`},{label:`Nested (Alt+1…9 / Alt+0)`,value:`<Alt>1...9 <Alt>0`},{label:`Glyph key (Ctrl+Space)`,value:`<Control>space`},{label:`Arrow key (Left)`,value:`Left`},{label:`Unset — shows the placeholder`,value:``}],defaultValue:`<Control>C`},{name:`disabledText`,label:`Placeholder`,type:i.TEXT,defaultValue:`Disabled`}]},ys={title:`Presentation/Shortcut Label (All Levels)`,description:`Every Adw.ShortcutLabel grammar level at once: alternatives (space), a range (...), pressed in sequence (+), pressed together (&) — plus GTK's fixed keycap order and the disabled placeholder.`,controls:[{name:`disabledText`,label:`Placeholder`,type:i.TEXT,defaultValue:`Disabled`}]};var bs=__exportAll({ShortcutLabelLevelsStory:()=>Ss,ShortcutLabelStories:()=>Cs,ShortcutLabelStory:()=>xs}),xs=class ShortcutLabelStory extends k{_widget=null;static{S.registerClass({GTypeName:`AdwStorybookShortcutLabel`},ShortcutLabelStory)}constructor(){super(k.fromMeta(ShortcutLabelStory.getMetadata(),`Default`))}static getMetadata(){return{...vs,component:w.ShortcutLabel.$gtype}}initialize(){this._widget=new w.ShortcutLabel({accelerator:this.args.accelerator,disabledText:this.args.disabledText,halign:h.Align.CENTER,valign:h.Align.CENTER}),this.addContent(this._widget)}updateArgs(e){this._widget&&(this._widget.disabledText=this.args.disabledText,this._widget.accelerator=this.args.accelerator)}};S.type_ensure(xs.$gtype);var Ss=class ShortcutLabelLevelsStory extends k{_widgets=[];static{S.registerClass({GTypeName:`AdwStorybookShortcutLabelLevels`},ShortcutLabelLevelsStory)}constructor(){super(k.fromMeta(ShortcutLabelLevelsStory.getMetadata(),`Default`))}static getMetadata(){return{...ys,component:w.ShortcutLabel.$gtype}}initialize(){let e=new h.Grid({row_spacing:12,column_spacing:24});for(let[t,n]of _s.entries()){let r=new h.Label({label:n.label,halign:h.Align.START});r.add_css_class(`dimmed`),e.attach(r,0,t,1,1);let i=new w.ShortcutLabel({accelerator:n.accelerator,disabledText:this.args.disabledText,halign:h.Align.END,hexpand:!0});e.attach(i,1,t,1,1),this._widgets.push(i)}this.addContent(e)}updateArgs(e){for(let e of this._widgets)e.disabledText=this.args.disabledText}};S.type_ensure(Ss.$gtype);const Cs={stories:[xs,Ss]},ws={title:`Presentation/Spinner`,description:`Adw.Spinner — a lightweight loading indicator that spins continuously while visible.`,controls:[{name:`size`,label:`Size`,type:i.RANGE,min:16,max:64,step:4,defaultValue:48}]};var Ts=__exportAll({SpinnerStories:()=>Ds,SpinnerStory:()=>Es}),Es=class SpinnerStory extends k{_spinner=null;static{S.registerClass({GTypeName:`AdwStorybookSpinner`},SpinnerStory)}constructor(){super(k.fromMeta(SpinnerStory.getMetadata(),`Default`))}static getMetadata(){return{...ws,component:w.Spinner.$gtype}}initialize(){let e=this.args.size;this._spinner=new w.Spinner({widthRequest:e,heightRequest:e,halign:h.Align.CENTER,valign:h.Align.CENTER}),this.addContent(this._spinner)}updateArgs(e){if(!this._spinner)return;let t=this.args.size;this._spinner.widthRequest=t,this._spinner.heightRequest=t}};S.type_ensure(Es.$gtype);const Ds={stories:[Es]},Os={title:`Presentation/Status Page`,description:`Adw.StatusPage — a full-page empty state with an icon, title, description and optional action.`,controls:[{name:`iconName`,label:`Icon`,type:i.SELECT,options:[{label:`Folder`,value:`folder-symbolic`},{label:`Mail`,value:`mail-unread-symbolic`},{label:`Search`,value:`system-search-symbolic`},{label:`Star`,value:`starred-symbolic`}],defaultValue:`folder-symbolic`},{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`No Documents`},{name:`description`,label:`Description`,type:i.TEXT,defaultValue:`Documents you create or open will appear here.`}]};var ks=__exportAll({StatusPageStories:()=>js,StatusPageStory:()=>As}),As=class StatusPageStory extends k{_statusPage=null;static{S.registerClass({GTypeName:`AdwStorybookStatusPage`},StatusPageStory)}constructor(){super(k.fromMeta(StatusPageStory.getMetadata(),`Default`))}static getMetadata(){return{...Os,component:w.StatusPage.$gtype}}initialize(){let e=new h.Button({label:`New Document`,halign:h.Align.CENTER,cssClasses:[`pill`,`suggested-action`]});this._statusPage=new w.StatusPage({iconName:this.args.iconName,title:this.args.title,description:this.args.description,child:e,widthRequest:460,heightRequest:320}),this.addContent(this._statusPage)}updateArgs(e){this._statusPage&&(this._statusPage.iconName=this.args.iconName,this._statusPage.title=this.args.title,this._statusPage.description=this.args.description)}};S.type_ensure(As.$gtype);const js={stories:[As]},Ms={Pictures:[`Holiday`,`Screenshots`],Music:[`Albums`],Notes:[]},Ns={title:`Presentation/Tree Expander`,description:`Gtk.TreeExpander — the indent and the disclosure arrow a tree row wears in front of its contents. A leaf takes one indent in place of the arrow, so its text lines up with its siblings.`,controls:[{name:`expanded`,label:`Expanded`,type:i.BOOLEAN,defaultValue:!0},{name:`hideExpander`,label:`Hide the arrow`,type:i.BOOLEAN,defaultValue:!1},{name:`indentForIcon`,label:`Indent leaves by an arrow`,type:i.BOOLEAN,defaultValue:!0}]};var Ps=__exportAll({TreeExpanderStories:()=>Is,TreeExpanderStory:()=>Fs}),Fs=class TreeExpanderStory extends k{_view=null;_tree=null;_expanders=new Set;static{S.registerClass({GTypeName:`AdwStorybookTreeExpander`},TreeExpanderStory)}constructor(){super(k.fromMeta(TreeExpanderStory.getMetadata(),`Default`))}static getMetadata(){return{...Ns,component:h.TreeExpander.$gtype}}initialize(){let e=h.StringList.new(Object.keys(Ms));this._tree=h.TreeListModel.new(e,!1,!1,e=>{let t=Ms[e.string]??[];return t.length===0?null:h.StringList.new([...t])});let t=new h.SignalListItemFactory;t.connect(`setup`,(e,t)=>{let n=t;n.focusable=!1;let r=new h.TreeExpander;r.child=new h.Label({xalign:0}),n.child=r,this._expanders.add(r)}),t.connect(`teardown`,(e,t)=>{let n=t.child;n!==null&&this._expanders.delete(n)}),t.connect(`bind`,(e,t)=>{let n=t,r=n.child,i=n.item;r.listRow=i,r.child.label=i.item.string,this._applyTo(r)}),this._view=new h.ListView({model:h.SingleSelection.new(this._tree),factory:t,vexpand:!0});let n=new h.ScrolledWindow({child:this._view,heightRequest:200,hexpand:!0});this.addContent(n),this._apply()}updateArgs(e){this._apply()}_apply(){if(this._tree!==null){for(let e=0;e<this._tree.get_n_items();e++){let t=this._tree.get_row(e);t!==null&&t.depth===0&&(t.expanded=this.args.expanded)}for(let e of this._expanders)this._applyTo(e)}}_applyTo(e){e.hideExpander=this.args.hideExpander,e.indentForIcon=this.args.indentForIcon}};S.type_ensure(Fs.$gtype);const Is={stories:[Fs]},Ls={title:`Presentation/WindowHandle`,description:`Gtk.WindowHandle — the titlebar strip. Dragging it moves the window; a double click, a middle click and a right click raise the window actions the compositor (or, here, the titlebar settings) names.`,controls:[{name:`action`,label:`Double-click action`,type:i.SELECT,options:[{label:`Toggle maximize`,value:`toggle-maximize`},{label:`Minimize`,value:`minimize`},{label:`Menu`,value:`menu`},{label:`None`,value:`none`}],defaultValue:`toggle-maximize`}]};var Rs=__exportAll({WindowHandleStories:()=>Bs,WindowHandleStory:()=>zs}),zs=class WindowHandleStory extends k{_handle=null;static{S.registerClass({GTypeName:`AdwStorybookWindowHandle`},WindowHandleStory)}constructor(){super(k.fromMeta(WindowHandleStory.getMetadata(),`Default`))}static getMetadata(){return{...Ls,component:h.WindowHandle.$gtype}}initialize(){let e=new w.HeaderBar;e.set_title_widget(new w.WindowTitle({title:`Notes`})),this._handle=new h.WindowHandle({child:e,halign:h.Align.CENTER}),this._apply(),this.addContent(this._handle)}updateArgs(e){this._apply()}_apply(){this.args.action}};S.type_ensure(zs.$gtype);const Bs={stories:[zs]},Vs={title:`Presentation/Window Title`,description:`Adw.WindowTitle — a compact title/subtitle widget intended for a window or header bar.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Inbox`},{name:`subtitle`,label:`Subtitle`,type:i.TEXT,defaultValue:`3 unread messages`}]};var Hs=__exportAll({WindowTitleStories:()=>Ws,WindowTitleStory:()=>Us}),Us=class WindowTitleStory extends k{_windowTitle=null;static{S.registerClass({GTypeName:`AdwStorybookWindowTitle`},WindowTitleStory)}constructor(){super(k.fromMeta(WindowTitleStory.getMetadata(),`Default`))}static getMetadata(){return{...Vs,component:w.WindowTitle.$gtype}}initialize(){this._windowTitle=new w.WindowTitle({title:this.args.title,subtitle:this.args.subtitle}),this.addContent(this._windowTitle)}updateArgs(e){this._windowTitle&&(this._windowTitle.title=this.args.title,this._windowTitle.subtitle=this.args.subtitle)}};S.type_ensure(Us.$gtype);const Ws={stories:[Us]},Gs={title:`Boxed Lists/Action Row`,description:`Adw.ActionRow — a preferences row with a title/subtitle, a prefix icon and a suffix button, shown inside a boxed list.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Wi-Fi`},{name:`subtitle`,label:`Subtitle`,type:i.TEXT,defaultValue:`Connected to Highgarden 5GHz`},{name:`iconName`,label:`Prefix icon`,type:i.SELECT,options:[{label:`Network`,value:`network-wireless-symbolic`},{label:`Folder`,value:`folder-symbolic`},{label:`Starred`,value:`starred-symbolic`}],defaultValue:`network-wireless-symbolic`},{name:`activatable`,label:`Activatable`,type:i.BOOLEAN,defaultValue:!0}]};var Ks=__exportAll({ActionRowStories:()=>Js,ActionRowStory:()=>qs}),qs=class ActionRowStory extends k{_row=null;_icon=null;_button=null;static{S.registerClass({GTypeName:`AdwStorybookActionRow`},ActionRowStory)}constructor(){super(k.fromMeta(ActionRowStory.getMetadata(),`Default`))}static getMetadata(){return{...Gs,component:w.ActionRow.$gtype}}initialize(){this._row=new w.ActionRow({title:this.args.title,subtitle:this.args.subtitle}),this._icon=new h.Image({iconName:this.args.iconName}),this._row.add_prefix(this._icon),this._button=new h.Button({iconName:`go-next-symbolic`,valign:h.Align.CENTER}),this._button.add_css_class(`flat`),this._row.add_suffix(this._button),this._row.activatableWidget=this._button,this._row.activatable=this.args.activatable;let e=new w.PreferencesGroup;e.add(this._row);let t=new w.Clamp({maximumSize:400,child:e});this.addContent(t)}updateArgs(e){!this._row||!this._icon||(this._row.title=this.args.title,this._row.subtitle=this.args.subtitle,this._icon.iconName=this.args.iconName,this._row.activatable=this.args.activatable)}};S.type_ensure(qs.$gtype);const Js={stories:[qs]},Ys={title:`Boxed Lists/Button Row`,description:`Adw.ButtonRow — a full-width row that acts as a button, with an optional icon and style class.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Add account`},{name:`startIconName`,label:`Start icon`,type:i.SELECT,options:[{label:`Add`,value:`list-add-symbolic`},{label:`Trash`,value:`user-trash-symbolic`},{label:`None`,value:``}],defaultValue:`list-add-symbolic`},{name:`style`,label:`Style`,type:i.SELECT,options:[{label:`None`,value:`none`},{label:`Suggested`,value:`suggested-action`},{label:`Destructive`,value:`destructive-action`}],defaultValue:`suggested-action`}]};var Xs=__exportAll({ButtonRowStories:()=>$s,ButtonRowStory:()=>Qs});const Zs=[`suggested-action`,`destructive-action`];var Qs=class ButtonRowStory extends k{_row=null;static{S.registerClass({GTypeName:`AdwStorybookButtonRow`},ButtonRowStory)}constructor(){super(k.fromMeta(ButtonRowStory.getMetadata(),`Default`))}static getMetadata(){return{...Ys,component:w.ButtonRow.$gtype}}initialize(){this._row=new w.ButtonRow({title:this.args.title,startIconName:this.args.startIconName}),this._applyStyle(this.args.style);let e=new w.PreferencesGroup;e.add(this._row);let t=new w.Clamp({maximumSize:400,child:e});this.addContent(t)}_applyStyle(e){if(this._row){for(let e of Zs)this._row.remove_css_class(e);e!==`none`&&this._row.add_css_class(e)}}updateArgs(e){this._row&&(this._row.title=this.args.title,this._row.startIconName=this.args.startIconName,this._applyStyle(this.args.style))}};S.type_ensure(Qs.$gtype);const $s={stories:[Qs]},ec=[`Blue`,`Teal`,`Green`,`Orange`,`Purple`],tc={title:`Boxed Lists/Combo Row`,description:`Adw.ComboRow — a preferences row with an inline drop-down backed by a Gtk.StringList.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Accent colour`},{name:`subtitle`,label:`Subtitle`,type:i.TEXT,defaultValue:`Used to highlight selected items`},{name:`selected`,label:`Selected`,type:i.NUMBER,min:0,max:4,step:1,defaultValue:1}]};var nc=__exportAll({ComboRowStories:()=>ic,ComboRowStory:()=>rc}),rc=class ComboRowStory extends k{_row=null;static{S.registerClass({GTypeName:`AdwStorybookComboRow`},ComboRowStory)}constructor(){super(k.fromMeta(ComboRowStory.getMetadata(),`Default`))}static getMetadata(){return{...tc,component:w.ComboRow.$gtype}}initialize(){this._row=new w.ComboRow({title:this.args.title,subtitle:this.args.subtitle,model:new h.StringList({strings:[...ec]}),selected:this.args.selected});let e=new w.PreferencesGroup;e.add(this._row);let t=new w.Clamp({maximumSize:400,child:e});this.addContent(t)}updateArgs(e){this._row&&(this._row.title=this.args.title,this._row.subtitle=this.args.subtitle,this._row.selected=this.args.selected)}};S.type_ensure(rc.$gtype);const ic={stories:[rc]},ac={title:`Boxed Lists/Entry Row`,description:`Adw.EntryRow — a preferences row whose title doubles as placeholder text for an inline entry.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Display name`},{name:`text`,label:`Text`,type:i.TEXT,defaultValue:`Ada Lovelace`},{name:`showApplyButton`,label:`Show apply button`,type:i.BOOLEAN,defaultValue:!0}]};var oc=__exportAll({EntryRowStories:()=>cc,EntryRowStory:()=>sc}),sc=class EntryRowStory extends k{_row=null;static{S.registerClass({GTypeName:`AdwStorybookEntryRow`},EntryRowStory)}constructor(){super(k.fromMeta(EntryRowStory.getMetadata(),`Default`))}static getMetadata(){return{...ac,component:w.EntryRow.$gtype}}initialize(){this._row=new w.EntryRow({title:this.args.title,text:this.args.text,showApplyButton:this.args.showApplyButton});let e=new w.PreferencesGroup;e.add(this._row);let t=new w.Clamp({maximumSize:400,child:e});this.addContent(t)}updateArgs(e){this._row&&(this._row.title=this.args.title,this._row.text=this.args.text,this._row.showApplyButton=this.args.showApplyButton)}};S.type_ensure(sc.$gtype);const cc={stories:[sc]},lc={title:`Boxed Lists/Expander Row`,description:`Adw.ExpanderRow — a preferences row that discloses nested rows and can carry an enable switch.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Proxy settings`},{name:`subtitle`,label:`Subtitle`,type:i.TEXT,defaultValue:`Route traffic through a custom proxy`},{name:`expanded`,label:`Expanded`,type:i.BOOLEAN,defaultValue:!0},{name:`showEnableSwitch`,label:`Show enable switch`,type:i.BOOLEAN,defaultValue:!1}]};var uc=__exportAll({ExpanderRowStories:()=>fc,ExpanderRowStory:()=>dc}),dc=class ExpanderRowStory extends k{_row=null;static{S.registerClass({GTypeName:`AdwStorybookExpanderRow`},ExpanderRowStory)}constructor(){super(k.fromMeta(ExpanderRowStory.getMetadata(),`Default`))}static getMetadata(){return{...lc,component:w.ExpanderRow.$gtype}}initialize(){this._row=new w.ExpanderRow({title:this.args.title,subtitle:this.args.subtitle,expanded:this.args.expanded,showEnableSwitch:this.args.showEnableSwitch}),this._row.add_row(new w.EntryRow({title:`Host`,text:`proxy.example.com`})),this._row.add_row(new w.SwitchRow({title:`Use authentication`,active:!1}));let e=new w.PreferencesGroup;e.add(this._row);let t=new w.Clamp({maximumSize:400,child:e});this.addContent(t)}updateArgs(e){this._row&&(this._row.title=this.args.title,this._row.subtitle=this.args.subtitle,this._row.expanded=this.args.expanded,this._row.showEnableSwitch=this.args.showEnableSwitch)}};S.type_ensure(dc.$gtype);const fc={stories:[dc]},pc={title:`Boxed Lists/Password Entry Row`,description:`Adw.PasswordEntryRow — an entry row that masks its contents and shows a peek toggle.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Password`},{name:`text`,label:`Text`,type:i.TEXT,defaultValue:`correct-horse-battery`}]};var mc=__exportAll({PasswordEntryRowStories:()=>gc,PasswordEntryRowStory:()=>hc}),hc=class PasswordEntryRowStory extends k{_row=null;static{S.registerClass({GTypeName:`AdwStorybookPasswordEntryRow`},PasswordEntryRowStory)}constructor(){super(k.fromMeta(PasswordEntryRowStory.getMetadata(),`Default`))}static getMetadata(){return{...pc,component:w.PasswordEntryRow.$gtype}}initialize(){this._row=new w.PasswordEntryRow({title:this.args.title,text:this.args.text});let e=new w.PreferencesGroup;e.add(this._row);let t=new w.Clamp({maximumSize:400,child:e});this.addContent(t)}updateArgs(e){this._row&&(this._row.title=this.args.title,this._row.text=this.args.text)}};S.type_ensure(hc.$gtype);const gc={stories:[hc]},_c={title:`Boxed Lists/Preferences Group`,description:`Adw.PreferencesGroup — the boxed-list container that gathers a title, description, header-suffix widget and rows.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Account`},{name:`description`,label:`Description`,type:i.TEXT,defaultValue:`Manage how this device signs in and syncs.`}]};var vc=__exportAll({PreferencesGroupStories:()=>bc,PreferencesGroupStory:()=>yc}),yc=class PreferencesGroupStory extends k{_prefsGroup=null;static{S.registerClass({GTypeName:`AdwStorybookPreferencesGroup`},PreferencesGroupStory)}constructor(){super(k.fromMeta(PreferencesGroupStory.getMetadata(),`Default`))}static getMetadata(){return{..._c,component:w.PreferencesGroup.$gtype}}initialize(){let e=new h.Button({label:`Sign out`,valign:h.Align.CENTER});e.add_css_class(`flat`),this._prefsGroup=new w.PreferencesGroup({title:this.args.title,description:this.args.description,headerSuffix:e});let t=new w.EntryRow({title:`Display name`,text:`Grace Hopper`});this._prefsGroup.add(t);let n=new w.SwitchRow({title:`Sync over Wi-Fi only`,subtitle:`Avoid using mobile data for backups`,active:!0});this._prefsGroup.add(n);let r=new w.ComboRow({title:`Region`,model:new h.StringList({strings:[`Europe`,`Americas`,`Asia`,`Oceania`]}),selected:0});this._prefsGroup.add(r);let i=new w.Clamp({maximumSize:400,child:this._prefsGroup});this.addContent(i)}updateArgs(e){this._prefsGroup&&(this._prefsGroup.title=this.args.title,this._prefsGroup.description=this.args.description)}};S.type_ensure(yc.$gtype);const bc={stories:[yc]},xc={title:`Boxed Lists/Preferences Row`,description:`Adw.PreferencesRow — the base of every boxed-list row: a list row with a title that the preferences dialog searches. The title can carry Pango markup and be made selectable.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`A <b>plain</b> preferences row`},{name:`useMarkup`,label:`Use markup`,type:i.BOOLEAN,defaultValue:!0},{name:`titleSelectable`,label:`Title selectable`,type:i.BOOLEAN,defaultValue:!1}]};var Sc=__exportAll({PreferencesRowStories:()=>wc,PreferencesRowStory:()=>Cc}),Cc=class PreferencesRowStory extends k{_row=null;static{S.registerClass({GTypeName:`AdwStorybookPreferencesRow`},PreferencesRowStory)}constructor(){super(k.fromMeta(PreferencesRowStory.getMetadata(),`Default`))}static getMetadata(){return{...xc,component:w.PreferencesRow.$gtype}}initialize(){this._row=new w.PreferencesRow,this._apply();let e=new w.PreferencesGroup;e.add(this._row);let t=new w.Clamp({maximumSize:400,child:e});this.addContent(t)}updateArgs(e){this._apply()}_apply(){this._row&&(this._row.title=this.args.title,this._row.useMarkup=this.args.useMarkup,this._row.titleSelectable=this.args.titleSelectable)}};S.type_ensure(Cc.$gtype);const wc={stories:[Cc]},Tc={title:`Boxed Lists/Spin Row`,description:`Adw.SpinRow — a preferences row with an inline spin button over a numeric adjustment.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Font size`},{name:`value`,label:`Value`,type:i.NUMBER,min:0,max:100,step:1,defaultValue:16},{name:`digits`,label:`Digits`,type:i.NUMBER,min:0,max:4,step:1,defaultValue:0}]};var Ec=__exportAll({SpinRowStories:()=>Oc,SpinRowStory:()=>Dc}),Dc=class SpinRowStory extends k{_row=null;static{S.registerClass({GTypeName:`AdwStorybookSpinRow`},SpinRowStory)}constructor(){super(k.fromMeta(SpinRowStory.getMetadata(),`Default`))}static getMetadata(){return{...Tc,component:w.SpinRow.$gtype}}initialize(){this._row=new w.SpinRow({title:this.args.title,adjustment:new h.Adjustment({lower:0,upper:100,value:this.args.value,stepIncrement:1,pageIncrement:10}),digits:this.args.digits});let e=new w.PreferencesGroup;e.add(this._row);let t=new w.Clamp({maximumSize:400,child:e});this.addContent(t)}updateArgs(e){this._row&&(this._row.title=this.args.title,this._row.value=this.args.value,this._row.digits=this.args.digits)}};S.type_ensure(Dc.$gtype);const Oc={stories:[Dc]},kc={title:`Boxed Lists/Switch Row`,description:`Adw.SwitchRow — a preferences row with a trailing switch, shown inside a boxed list.`,controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Automatic updates`},{name:`subtitle`,label:`Subtitle`,type:i.TEXT,defaultValue:`Download and install updates without asking`},{name:`active`,label:`Active`,type:i.BOOLEAN,defaultValue:!0}]};var Ac=__exportAll({SwitchRowStories:()=>Mc,SwitchRowStory:()=>jc}),jc=class SwitchRowStory extends k{_row=null;static{S.registerClass({GTypeName:`AdwStorybookSwitchRow`},SwitchRowStory)}constructor(){super(k.fromMeta(SwitchRowStory.getMetadata(),`Default`))}static getMetadata(){return{...kc,component:w.SwitchRow.$gtype}}initialize(){this._row=new w.SwitchRow({title:this.args.title,subtitle:this.args.subtitle,active:this.args.active});let e=new w.PreferencesGroup;e.add(this._row);let t=new w.Clamp({maximumSize:400,child:e});this.addContent(t)}updateArgs(e){this._row&&(this._row.title=this.args.title,this._row.subtitle=this.args.subtitle,this._row.active=this.args.active)}};S.type_ensure(jc.$gtype);const Mc={stories:[jc]},Nc={title:`Text/Editable Label`,description:`Gtk.EditableLabel — a label you click and edit in place. Enter starts editing, Enter commits, Escape discards, and editable=false leaves it a label; the draft lives in the entry, not in the label.`,controls:[{name:`text`,label:`Text`,type:i.TEXT,defaultValue:`Ada Lovelace`},{name:`editable`,label:`Editable`,type:i.BOOLEAN,defaultValue:!0},{name:`editing`,label:`Editing`,type:i.BOOLEAN,defaultValue:!1}]};var Pc=__exportAll({EditableLabelStories:()=>Ic,EditableLabelStory:()=>Fc}),Fc=class EditableLabelStory extends k{_label=null;static{S.registerClass({GTypeName:`AdwStorybookEditableLabel`},EditableLabelStory)}constructor(){super(k.fromMeta(EditableLabelStory.getMetadata(),`Default`))}static getMetadata(){return{...Nc,component:h.EditableLabel.$gtype}}initialize(){this._label=new h.EditableLabel({halign:h.Align.CENTER}),this._apply(),this.addContent(this._label)}updateArgs(e){this._apply()}_apply(){this._label&&(this._label.editing||(this._label.text=this.args.text),this._label.editable=this.args.editable,this._label.editing=this.args.editing)}};S.type_ensure(Fc.$gtype);const Ic={stories:[Fc]},Lc={title:`Text/Search Bar`,description:`Gtk.SearchBar — the strip that reveals a search entry when search starts. The property IS the revealer's reveal-child, so one boolean decides both whether the strip is shown and whether the search is on; hiding it clears the entry.`,controls:[{name:`searchModeEnabled`,label:`Search mode`,type:i.BOOLEAN,defaultValue:!1},{name:`showCloseButton`,label:`Close button`,type:i.BOOLEAN,defaultValue:!0}]};var Rc=__exportAll({SearchBarStories:()=>Bc,SearchBarStory:()=>zc}),zc=class SearchBarStory extends k{_bar=null;_entry=null;static{S.registerClass({GTypeName:`AdwStorybookSearchBar`},SearchBarStory)}constructor(){super(k.fromMeta(SearchBarStory.getMetadata(),`Default`))}static getMetadata(){return{...Lc,component:h.SearchBar.$gtype}}initialize(){this._entry=new h.SearchEntry({hexpand:!0}),this._bar=new h.SearchBar({child:this._entry}),this._apply(),this.addContent(this._bar)}updateArgs(e){this._apply()}_apply(){this._bar&&(this._bar.search_mode_enabled=this.args.searchModeEnabled,this._bar.show_close_button=this.args.showCloseButton)}};S.type_ensure(zc.$gtype);const Bc={stories:[zc]},Vc={title:`Text/Text View`,description:`Gtk.TextView — the multi-line editor. Its text lives in a Gtk.TextBuffer rather than in a property, wrap-mode and justification are Pango's, and accepts-tab defaults to TRUE, which is the opposite of a browser's.`,controls:[{name:`text`,label:`Text`,type:i.TEXT,defaultValue:`A text view holds as many lines as it is given.
|
|
339
|
+
Tab inserts a tab character.`},{name:`wrapMode`,label:`Wrap mode`,type:i.SELECT,options:[{label:`None`,value:`none`},{label:`Char`,value:`char`},{label:`Word`,value:`word`},{label:`Word or char`,value:`word-char`}],defaultValue:`none`},{name:`justification`,label:`Justification`,type:i.SELECT,options:[{label:`Left`,value:`left`},{label:`Right`,value:`right`},{label:`Center`,value:`center`},{label:`Fill`,value:`fill`}],defaultValue:`left`},{name:`monospace`,label:`Monospace`,type:i.BOOLEAN,defaultValue:!1},{name:`acceptsTab`,label:`Tab inserts a tab`,type:i.BOOLEAN,defaultValue:!0},{name:`cursorVisible`,label:`Show cursor`,type:i.BOOLEAN,defaultValue:!0},{name:`topMargin`,label:`Top margin`,type:i.NUMBER,defaultValue:6}]};var Hc=__exportAll({TextViewStories:()=>Wc,TextViewStory:()=>Uc}),Uc=class TextViewStory extends k{_buffer=null;_view=null;static{S.registerClass({GTypeName:`AdwStorybookTextView`},TextViewStory)}constructor(){super(k.fromMeta(TextViewStory.getMetadata(),`Default`))}static getMetadata(){return{...Vc,component:h.TextView.$gtype}}initialize(){this._buffer=new h.TextBuffer,this._view=new h.TextView({buffer:this._buffer,hexpand:!0,vexpand:!1,top_margin:6});let e=new h.ScrolledWindow({hscrollbar_policy:h.PolicyType.AUTOMATIC,vscrollbar_policy:h.PolicyType.AUTOMATIC,hexpand:!0,vexpand:!1,child:this._view});e.set_size_request(320,-1),this._apply(),this.addContent(e)}updateArgs(e){this._apply()}_apply(){if(!this._buffer||!this._view)return;let e=this.args.text;this._buffer.text!==e&&(this._buffer.text=e),this._view.wrap_mode=this.args.wrapMode??`none`,this._view.justification=this.args.justification??`left`,this._view.monospace=this.args.monospace,this._view.accepts_tab=this.args.acceptsTab,this._view.cursor_visible=this.args.cursorVisible,this._view.top_margin=Number(this.args.topMargin??0)}};S.type_ensure(Uc.$gtype);const Wc={stories:[Uc]},Gc={title:`Text/Text`,description:`Gtk.Text — the single-line text widget every Gtk.Entry is built on. Standalone it is a field with a placeholder and a length limit; visibility=false masks it, propagate-text-width grows it with its text.`,controls:[{name:`text`,label:`Text`,type:i.TEXT,defaultValue:`Ada Lovelace`},{name:`placeholderText`,label:`Placeholder`,type:i.TEXT,defaultValue:``},{name:`editable`,label:`Editable`,type:i.BOOLEAN,defaultValue:!0},{name:`visibility`,label:`Visible`,type:i.BOOLEAN,defaultValue:!0},{name:`maxLength`,label:`Max length (0 = none)`,type:i.NUMBER,defaultValue:0},{name:`propagateTextWidth`,label:`Grow with text`,type:i.BOOLEAN,defaultValue:!1}]};var Kc=__exportAll({TextStories:()=>Jc,TextStory:()=>qc}),qc=class TextStory extends k{_text=null;static{S.registerClass({GTypeName:`AdwStorybookText`},TextStory)}constructor(){super(k.fromMeta(TextStory.getMetadata(),`Default`))}static getMetadata(){return{...Gc,component:h.Text.$gtype}}initialize(){this._text=new h.Text({halign:h.Align.CENTER}),this._apply(),this.addContent(this._text)}updateArgs(e){this._apply()}_apply(){this._text&&(this._text.text=this.args.text,this._text.placeholder_text=this.args.placeholderText,this._text.editable=this.args.editable,this._text.visibility=this.args.visibility,this._text.max_length=Number(this.args.maxLength??0),this._text.propagate_text_width=this.args.propagateTextWidth)}};S.type_ensure(qc.$gtype);const Jc={stories:[qc]},Yc=[{name:`allowScrollWheel`,label:`Allow scroll wheel`,type:i.BOOLEAN,defaultValue:!0},{name:`allowLongSwipes`,label:`Allow long swipes`,type:i.BOOLEAN,defaultValue:!1}],Xc={title:`View Switching/Carousel (Dots)`,description:`Adw.Carousel — a horizontally swipeable pager with three pages, paired with Adw.CarouselIndicatorDots.`,controls:Yc},Zc={title:`View Switching/Carousel (Lines)`,description:`Adw.Carousel — the same swipeable pager paired with Adw.CarouselIndicatorLines instead of dots.`,controls:Yc};var Qc=__exportAll({CarouselDotsStory:()=>el,CarouselLinesStory:()=>tl,CarouselStories:()=>nl});const $c=[{title:`Welcome`,css:`accent`},{title:`Discover`,css:`success`},{title:`Get started`,css:`warning`}];function buildPage(e,t){let n=new h.Box({orientation:h.Orientation.VERTICAL,halign:h.Align.CENTER,valign:h.Align.CENTER,widthRequest:440,heightRequest:260});n.add_css_class(`card`),n.add_css_class(t);let r=new h.Label({label:e,vexpand:!0,valign:h.Align.CENTER});return r.add_css_class(`title-1`),n.append(r),n}var el=class CarouselDotsStory extends k{_carousel=null;static{S.registerClass({GTypeName:`AdwStorybookCarouselDots`},CarouselDotsStory)}constructor(){super(k.fromMeta(CarouselDotsStory.getMetadata(),`Default`))}static getMetadata(){return{...Xc,component:w.Carousel.$gtype}}initialize(){this._carousel=new w.Carousel({allowScrollWheel:this.args.allowScrollWheel,allowLongSwipes:this.args.allowLongSwipes,vexpand:!0});for(let e of $c)this._carousel.append(buildPage(e.title,e.css));let e=new w.CarouselIndicatorDots({carousel:this._carousel}),t=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12,widthRequest:480,heightRequest:340});t.append(this._carousel),t.append(e),this.addContent(t)}updateArgs(e){this._carousel&&(this._carousel.allowScrollWheel=this.args.allowScrollWheel,this._carousel.allowLongSwipes=this.args.allowLongSwipes)}};S.type_ensure(el.$gtype);var tl=class CarouselLinesStory extends k{_carousel=null;static{S.registerClass({GTypeName:`AdwStorybookCarouselLines`},CarouselLinesStory)}constructor(){super(k.fromMeta(CarouselLinesStory.getMetadata(),`Default`))}static getMetadata(){return{...Zc,component:w.Carousel.$gtype}}initialize(){this._carousel=new w.Carousel({allowScrollWheel:this.args.allowScrollWheel,allowLongSwipes:this.args.allowLongSwipes,vexpand:!0});for(let e of $c)this._carousel.append(buildPage(e.title,e.css));let e=new w.CarouselIndicatorLines({carousel:this._carousel}),t=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12,widthRequest:480,heightRequest:340});t.append(this._carousel),t.append(e),this.addContent(t)}updateArgs(e){this._carousel&&(this._carousel.allowScrollWheel=this.args.allowScrollWheel,this._carousel.allowLongSwipes=this.args.allowLongSwipes)}};S.type_ensure(tl.$gtype);const nl={stories:[el,tl]},rl={title:`View Switching/Inline View Switcher`,description:`Adw.InlineViewSwitcher — a compact inline switcher that can show labels, icons, or both for an Adw.ViewStack.`,controls:[{name:`displayMode`,label:`Display mode`,type:i.SELECT,options:[{label:`Labels`,value:`labels`},{label:`Icons`,value:`icons`},{label:`Both`,value:`both`}],defaultValue:`both`}]};var il=__exportAll({InlineViewSwitcherStories:()=>ol,InlineViewSwitcherStory:()=>al}),al=class InlineViewSwitcherStory extends k{_switcher=null;static{S.registerClass({GTypeName:`AdwStorybookInlineViewSwitcher`},InlineViewSwitcherStory)}constructor(){super(k.fromMeta(InlineViewSwitcherStory.getMetadata(),`Default`))}static getMetadata(){return{...rl,component:w.InlineViewSwitcher.$gtype}}buildPage(e,t,n){return new w.StatusPage({iconName:t,title:e,description:n,vexpand:!0})}initialize(){let e=new w.ViewStack({vexpand:!0});e.add_titled_with_icon(this.buildPage(`Overview`,`view-grid-symbolic`,`A quick summary of your project.`),`overview`,`Overview`,`view-grid-symbolic`),e.add_titled_with_icon(this.buildPage(`Activity`,`document-edit-symbolic`,`Recent edits and changes.`),`activity`,`Activity`,`document-edit-symbolic`),e.add_titled_with_icon(this.buildPage(`Settings`,`emblem-system-symbolic`,`Configure how things behave.`),`settings`,`Settings`,`emblem-system-symbolic`),this._switcher=new w.InlineViewSwitcher({stack:e,displayMode:this.modeFromArg(this.args.displayMode),halign:h.Align.CENTER});let t=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12,widthRequest:480,heightRequest:340});t.append(this._switcher),t.append(e),this.addContent(t)}modeFromArg(e){return e===`labels`?w.InlineViewSwitcherDisplayMode.LABELS:e===`icons`?w.InlineViewSwitcherDisplayMode.ICONS:w.InlineViewSwitcherDisplayMode.BOTH}updateArgs(e){this._switcher&&(this._switcher.displayMode=this.modeFromArg(this.args.displayMode))}};S.type_ensure(al.$gtype);const ol={stories:[al]},sl=[{name:`overview`,label:`Overview`,body:`A notebook brings its own tab strip.`},{name:`activity`,label:`Activity`,body:`tab-pos says which edge the strip is on.`},{name:`notes`,label:``,body:`No tab-label: the tab reads "Page 3".`}],cl={title:`View Switching/Notebook`,description:'Gtk.Notebook — the older page container, a stack that brings its own tab bar. `tab-pos` picks the edge (top, bottom, left, right), `show-tabs` takes the strip away, `show-border` is the bevel around the pages — a CSS class in C — and `page` is the current page by INDEX rather than by name. A GtkNotebookPage is a GObject rather than a widget, so its tab-label and friends live on the page itself, and a page without one gets the number "Page N" as its tab text. `enable-popup` puts the pages in a right-click menu.',controls:[{name:`tabPos`,label:`Tab position`,type:i.SELECT,options:[{label:`Top`,value:`top`},{label:`Bottom`,value:`bottom`},{label:`Left`,value:`left`},{label:`Right`,value:`right`}],defaultValue:`top`},{name:`showTabs`,label:`Show tabs`,type:i.BOOLEAN,defaultValue:!0},{name:`showBorder`,label:`Show border`,type:i.BOOLEAN,defaultValue:!0},{name:`enablePopup`,label:`Enable popup (right-click)`,type:i.BOOLEAN,defaultValue:!1}]};var ll=__exportAll({NotebookStories:()=>fl,NotebookStory:()=>dl});const ul={top:h.PositionType.TOP,bottom:h.PositionType.BOTTOM,left:h.PositionType.LEFT,right:h.PositionType.RIGHT};var dl=class NotebookStory extends k{_notebook=null;static{S.registerClass({GTypeName:`AdwStorybookNotebook`},NotebookStory)}constructor(){super(k.fromMeta(NotebookStory.getMetadata(),`Default`))}static getMetadata(){return{...cl,component:h.Notebook.$gtype}}initialize(){this._notebook=new h.Notebook({vexpand:!0,widthRequest:480,heightRequest:320});for(let e of sl){let t=new h.Box({orientation:h.Orientation.VERTICAL,halign:h.Align.CENTER,valign:h.Align.CENTER,spacing:6});t.append(new h.Label({label:e.label||e.name,cssClasses:[`title-4`]})),t.append(new h.Label({label:e.body,cssClasses:[`title-2`]}));let n=e.label?new h.Label({label:e.label}):null,r=new h.Label({label:e.label||e.name});this._notebook.append_page_menu(t,n,r)}this._apply(),this.addContent(this._notebook)}updateArgs(e){this._apply()}_apply(){this._notebook&&(this._notebook.tab_pos=ul[this.args.tabPos]??h.PositionType.TOP,this._notebook.show_tabs=this.args.showTabs,this._notebook.enable_popup=this.args.enablePopup,this._notebook.show_border=this.args.showBorder)}};S.type_ensure(dl.$gtype);const fl={stories:[dl]},pl=[{name:`inbox`,title:`Inbox`,icon:`mail-unread-symbolic`,attn:!1,body:`Three unread conversations.`},{name:`starred`,title:`Starred`,icon:`starred-symbolic`,attn:!1,body:`Messages marked important.`},{name:`drafts`,title:`Drafts`,icon:`document-edit-symbolic`,attn:!0,body:`One draft needs attention.`},{name:`settings`,title:``,icon:`preferences-system-symbolic`,attn:!1,body:`No row: a title is the row.`}],ml={title:`View Switching/Stack Sidebar`,description:"Gtk.StackSidebar — a vertical list of a Gtk.Stack's pages, the sidebar counterpart of the stack switcher. A row is made of the page's TITLE alone: `update_row` never reads `icon-name`, so the page with only an icon at the end of this story gets no row at all, where the switcher would show an icon button for it. `needs-attention` puts a dot in front of the label.",controls:[{name:`transitionType`,label:`Transition type`,type:i.SELECT,options:[{label:`None`,value:`none`},{label:`Crossfade`,value:`crossfade`},{label:`Slide left / right`,value:`slide-left-right`}],defaultValue:`slide-left-right`}]};var hl=__exportAll({StackSidebarStories:()=>vl,StackSidebarStory:()=>_l});const gl={none:h.StackTransitionType.NONE,crossfade:h.StackTransitionType.CROSSFADE,"slide-left-right":h.StackTransitionType.SLIDE_LEFT_RIGHT};var _l=class StackSidebarStory extends k{_stack=null;static{S.registerClass({GTypeName:`AdwStorybookStackSidebar`},StackSidebarStory)}constructor(){super(k.fromMeta(StackSidebarStory.getMetadata(),`Default`))}static getMetadata(){return{...ml,component:h.StackSidebar.$gtype}}initialize(){this._stack=new h.Stack({vexpand:!0,transitionDuration:200});for(let e of pl){let t=new h.Label({label:e.body});t.add_css_class(`title-2`);let n=new h.Box({orientation:h.Orientation.VERTICAL,halign:h.Align.CENTER,valign:h.Align.CENTER,spacing:6});n.append(new h.Label({label:e.title||e.name,cssClasses:[`title-4`]})),n.append(t);let r=this._stack.add_titled(n,e.name,e.title);r.icon_name=e.icon,r.needs_attention=e.attn,r.use_underline=!0}let e=new h.StackSidebar({stack:this._stack}),t=new h.Box({orientation:h.Orientation.VERTICAL,spacing:0});t.append(e);let n=new h.Paned({orientation:h.Orientation.HORIZONTAL,widthRequest:480,heightRequest:320});n.set_start_child(t),n.set_end_child(this._stack),n.set_position(180),this._apply(),this.addContent(n)}updateArgs(e){this._apply()}_apply(){this._stack&&(this._stack.transition_type=gl[this.args.transitionType]??h.StackTransitionType.NONE)}};S.type_ensure(_l.$gtype);const vl={stories:[_l]},yl=[{name:`inbox`,title:`Inbox`,icon:`mail-unread-symbolic`,attn:!1,body:`Three unread conversations.`},{name:`starred`,title:`Starred`,icon:`starred-symbolic`,attn:!1,body:`Messages marked important.`},{name:`archive`,title:`Archive`,icon:``,attn:!1,body:`Older conversations kept for reference.`},{name:`drafts`,title:``,icon:`document-edit-symbolic`,attn:!0,body:`One draft needs your attention.`}],bl={title:`View Switching/Stack Switcher`,description:"Gtk.StackSwitcher — a linked row of toggle buttons, one per page of a Gtk.Stack. A page with a title and no icon gets a label button; one with an icon and no title gets an icon button and puts the title on the switcher as a tooltip; a page with NEITHER is left out of the row entirely. `orientation` turns the row vertical, and `needs-attention` on a page puts a dot on its button.",controls:[{name:`orientation`,label:`Orientation`,type:i.SELECT,options:[{label:`Horizontal`,value:`horizontal`},{label:`Vertical`,value:`vertical`}],defaultValue:`horizontal`},{name:`transitionType`,label:`Transition type`,type:i.SELECT,options:[{label:`None`,value:`none`},{label:`Crossfade`,value:`crossfade`},{label:`Slide left / right`,value:`slide-left-right`}],defaultValue:`slide-left-right`}]};var xl=__exportAll({StackSwitcherStories:()=>Cl,StackSwitcherStory:()=>$});const Sl={none:h.StackTransitionType.NONE,crossfade:h.StackTransitionType.CROSSFADE,"slide-left-right":h.StackTransitionType.SLIDE_LEFT_RIGHT};var $=class StackSwitcherStory extends k{_stack=null;_switcher=null;static{S.registerClass({GTypeName:`AdwStorybookStackSwitcher`},StackSwitcherStory)}constructor(){super(k.fromMeta(StackSwitcherStory.getMetadata(),`Default`))}static getMetadata(){return{...bl,component:h.StackSwitcher.$gtype}}initialize(){this._stack=new h.Stack({vexpand:!0,transitionDuration:200});for(let e of yl){let t=new h.Label({label:e.body});t.add_css_class(`title-2`);let n=new h.Box({orientation:h.Orientation.VERTICAL,halign:h.Align.CENTER,valign:h.Align.CENTER,spacing:6});if(n.append(new h.Label({label:e.title||e.name,cssClasses:[`title-4`]})),n.append(t),e.icon){let t=this._stack.add_titled(n,e.name,e.title);t.icon_name=e.icon,t.needs_attention=e.attn,t.use_underline=!0}else{let t=this._stack.add_titled(n,e.name,e.title);t.needs_attention=e.attn,t.use_underline=!0}}this._switcher=new h.StackSwitcher({stack:this._stack,halign:h.Align.CENTER});let e=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12,widthRequest:480,heightRequest:320});e.append(this._switcher),e.append(this._stack),this._apply(),this.addContent(e)}updateArgs(e){this._apply()}_apply(){!this._stack||!this._switcher||(this._stack.transition_type=Sl[this.args.transitionType]??h.StackTransitionType.NONE,this._switcher.orientation=this.args.orientation===`vertical`?h.Orientation.VERTICAL:h.Orientation.HORIZONTAL)}};S.type_ensure($.$gtype);const Cl={stories:[$]},wl=[{name:`overview`,title:`Overview`,attn:!1,body:`Three pages, one visible at a time.`},{name:`activity`,title:`Activity`,attn:!1,body:`Switching is animated by transition-type.`},{name:`settings`,title:`Settings`,attn:!0,body:`This page wants your attention.`}],Tl={title:`View Switching/Stack`,description:"Gtk.Stack — one visible child out of many, with the animated change between them. `transition-type` picks the animation and `transition-duration` its length; `hhomogeneous` and `vhomogeneous` say whether every page is allocated the same size. A Gtk.StackPage is a GObject rather than a widget, so its title, icon and needs-attention live on the page itself.",controls:[{name:`transitionType`,label:`Transition type`,type:i.SELECT,options:[{label:`None`,value:`none`},{label:`Crossfade`,value:`crossfade`},{label:`Slide left / right`,value:`slide-left-right`},{label:`Slide up / down`,value:`slide-up-down`},{label:`Over left / right`,value:`over-left-right`},{label:`Rotate left / right`,value:`rotate-left-right`}],defaultValue:`slide-left-right`},{name:`transitionDuration`,label:`Duration (ms)`,type:i.RANGE,min:0,max:600,step:50,defaultValue:200},{name:`interpolateSize`,label:`Interpolate size`,type:i.BOOLEAN,defaultValue:!1},{name:`hhomogeneous`,label:`HHomogeneous`,type:i.BOOLEAN,defaultValue:!0},{name:`vhomogeneous`,label:`VHomogeneous`,type:i.BOOLEAN,defaultValue:!0}]};var El=__exportAll({StackStories:()=>kl,StackStory:()=>Ol});const Dl={none:h.StackTransitionType.NONE,crossfade:h.StackTransitionType.CROSSFADE,"slide-left-right":h.StackTransitionType.SLIDE_LEFT_RIGHT,"slide-up-down":h.StackTransitionType.SLIDE_UP_DOWN,"over-left-right":h.StackTransitionType.OVER_LEFT_RIGHT,"rotate-left-right":h.StackTransitionType.ROTATE_LEFT_RIGHT};var Ol=class StackStory extends k{_stack=null;_switcher=null;static{S.registerClass({GTypeName:`AdwStorybookStack`},StackStory)}constructor(){super(k.fromMeta(StackStory.getMetadata(),`Default`))}static getMetadata(){return{...Tl,component:h.Stack.$gtype}}initialize(){this._stack=new h.Stack({vexpand:!0,transitionDuration:200});for(let e of wl){let t=new h.Label({label:e.body,vexpand:!0});t.add_css_class(`title-2`);let n=new h.Box({orientation:h.Orientation.VERTICAL,halign:h.Align.CENTER,valign:h.Align.CENTER,spacing:6});n.append(new h.Label({label:e.title,cssClasses:[`title-4`]})),n.append(t);let r=this._stack.add_titled(n,e.name,e.title);r.needs_attention=e.attn,r.use_underline=!0}this._switcher=new h.StackSwitcher({stack:this._stack,halign:h.Align.CENTER});let e=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12,widthRequest:480,heightRequest:320});e.append(this._switcher),e.append(this._stack),this._apply(),this.addContent(e)}updateArgs(e){this._apply()}_apply(){this._stack&&(this._stack.transition_type=Dl[this.args.transitionType]??h.StackTransitionType.NONE,this._stack.transition_duration=this.args.transitionDuration,this._stack.interpolate_size=this.args.interpolateSize,this._stack.hhomogeneous=this.args.hhomogeneous,this._stack.vhomogeneous=this.args.vhomogeneous)}};S.type_ensure(Ol.$gtype);const kl={stories:[Ol]},Al={title:`View Switching/Tab Bar`,description:"Adw.TabBar — the tab bar as a widget of its own, bound to an Adw.TabView through its `view`: one chip per page, an action widget on either side, and a strip that can autohide or expand its chips.",controls:[{name:`autohide`,label:`Autohide`,type:i.BOOLEAN,defaultValue:!1},{name:`expandTabs`,label:`Expand tabs`,type:i.BOOLEAN,defaultValue:!1},{name:`inverted`,label:`Inverted`,type:i.BOOLEAN,defaultValue:!1},{name:`startAction`,label:`Start action`,type:i.BOOLEAN,defaultValue:!0},{name:`endAction`,label:`End action`,type:i.BOOLEAN,defaultValue:!0}]};var jl=__exportAll({TabBarStories:()=>Pl,TabBarStory:()=>Nl});const Ml=[{title:`Overview`,body:`A summary of everything at a glance.`},{title:`Details`,body:`The specifics, broken down line by line.`},{title:`History`,body:`A log of every change made so far.`}];var Nl=class TabBarStory extends k{_bar=null;_startAction=null;_endAction=null;static{S.registerClass({GTypeName:`AdwStorybookTabBar`},TabBarStory)}constructor(){super(k.fromMeta(TabBarStory.getMetadata(),`Default`))}static getMetadata(){return{...Al,component:w.TabBar.$gtype}}initialize(){let e=new w.TabView({vexpand:!0});for(let t of Ml){let n=e.append(new w.StatusPage({iconName:`view-paged-symbolic`,title:t.title,description:t.body}));n.title=t.title}this._startAction=new h.Button({iconName:`list-add-symbolic`,tooltipText:`New page`,cssClasses:[`flat`]}),this._endAction=new h.Button({iconName:`view-more-symbolic`,tooltipText:`Menu`,cssClasses:[`flat`]});let t=new w.TabBar({view:e});this._bar=t;let n=new h.Box({orientation:h.Orientation.VERTICAL,widthRequest:480,heightRequest:320});n.append(t),n.append(e),this.addContent(n),this._apply()}updateArgs(e){this._apply()}_apply(){let e=this._bar;e!==null&&(e.autohide=this.args.autohide,e.expandTabs=this.args.expandTabs,e.inverted=this.args.inverted,e.startActionWidget=this.args.startAction?this._startAction:null,e.endActionWidget=this.args.endAction?this._endAction:null)}};S.type_ensure(Nl.$gtype);const Pl={stories:[Nl]},Fl={title:`View Switching/Tab Button`,description:`Adw.TabButton — a button that shows how many pages an Adw.TabView holds, and a dot when a page you are not looking at needs attention. From ten pages the number shrinks; at a hundred it becomes a glyph.`,controls:[{name:`pages`,label:`Pages`,type:i.RANGE,min:0,max:100,step:1,defaultValue:3},{name:`needsAttention`,label:`Last page needs attention`,type:i.BOOLEAN,defaultValue:!1}]};var Il=__exportAll({TabButtonStories:()=>Rl,TabButtonStory:()=>Ll}),Ll=class TabButtonStory extends k{_view=null;static{S.registerClass({GTypeName:`AdwStorybookTabButton`},TabButtonStory)}constructor(){super(k.fromMeta(TabButtonStory.getMetadata(),`Default`))}static getMetadata(){return{...Fl,component:w.TabButton.$gtype}}initialize(){this._view=new w.TabView;let e=new w.TabButton({view:this._view,halign:h.Align.CENTER});this._apply(),this.addContent(e)}updateArgs(e){this._apply()}_apply(){let e=this._view;if(!e)return;let t=this.args.pages;for(;e.nPages<t;)e.append(new h.Box).title=`Page ${e.nPages}`;for(;e.nPages>t;)e.close_page(e.get_nth_page(e.nPages-1));for(let t=0;t<e.nPages;t++)e.get_nth_page(t).needsAttention=this.args.needsAttention&&t===e.nPages-1}};S.type_ensure(Ll.$gtype);const Rl={stories:[Ll]},zl={title:`View Switching/Tab Overview`,description:`Adw.TabOverview — a grid of tab thumbnails over an Adw.TabView; open it to see every page at once, search them and close or unpin them.`,controls:[{name:`open`,label:`Open`,type:i.BOOLEAN,defaultValue:!0},{name:`enableSearch`,label:`Enable search`,type:i.BOOLEAN,defaultValue:!0},{name:`enableNewTab`,label:`Enable new tab`,type:i.BOOLEAN,defaultValue:!1},{name:`inverted`,label:`Inverted`,type:i.BOOLEAN,defaultValue:!1}]};var Bl=__exportAll({TabOverviewStories:()=>Ul,TabOverviewStory:()=>Hl});const Vl=[{title:`Overview`,body:`A summary of everything at a glance.`},{title:`Details`,body:`The specifics, broken down line by line.`},{title:`History`,body:`A log of every change made so far.`}];var Hl=class TabOverviewStory extends k{_overview=null;static{S.registerClass({GTypeName:`AdwStorybookTabOverview`},TabOverviewStory)}constructor(){super(k.fromMeta(TabOverviewStory.getMetadata(),`Default`))}static getMetadata(){return{...zl,component:w.TabOverview.$gtype}}initialize(){let e=new w.TabView({vexpand:!0});for(let[t,n]of Vl.entries()){let r=new w.StatusPage({iconName:`view-paged-symbolic`,title:n.title,description:n.body,vexpand:!0}),i=e.append(r);i.title=n.title,t===0&&e.set_page_pinned(i,!0)}let t=new w.TabOverview({view:e,child:e,widthRequest:480,heightRequest:340});this._overview=t,t.connect(`create-tab`,()=>{let t=e.append(new w.StatusPage({iconName:`view-paged-symbolic`,title:`New Page`,vexpand:!0}));return t.title=`New Page`,t}),this.addContent(t),this._apply()}updateArgs(e){this._apply()}_apply(){let e=this._overview;e&&(e.enableSearch=this.args.enableSearch,e.enableNewTab=this.args.enableNewTab,e.inverted=this.args.inverted,e.open=this.args.open)}};S.type_ensure(Hl.$gtype);const Ul={stories:[Hl]},Wl={title:`View Switching/Tab View`,description:`Adw.TabView with an Adw.TabBar header — three tabbed pages; the tab bar can auto-hide when only one tab remains.`,controls:[{name:`autohide`,label:`Autohide tab bar`,type:i.BOOLEAN,defaultValue:!1}]};var Gl=__exportAll({TabViewStories:()=>Jl,TabViewStory:()=>ql});const Kl=[{title:`Overview`,body:`A summary of everything at a glance.`},{title:`Details`,body:`The specifics, broken down line by line.`},{title:`History`,body:`A log of every change made so far.`}];var ql=class TabViewStory extends k{_tabBar=null;static{S.registerClass({GTypeName:`AdwStorybookTabView`},TabViewStory)}constructor(){super(k.fromMeta(TabViewStory.getMetadata(),`Default`))}static getMetadata(){return{...Wl,component:w.TabView.$gtype}}buildPageBody(e,t){return new w.StatusPage({iconName:`view-paged-symbolic`,title:e,description:t,vexpand:!0})}initialize(){let e=new w.TabView({vexpand:!0});for(let t of Kl){let n=e.append(this.buildPageBody(t.title,t.body));n.title=t.title}this._tabBar=new w.TabBar({view:e,autohide:this.args.autohide});let t=new h.Box({orientation:h.Orientation.VERTICAL,widthRequest:480,heightRequest:340});t.append(this._tabBar),t.append(e),this.addContent(t)}updateArgs(e){this._tabBar&&(this._tabBar.autohide=this.args.autohide)}};S.type_ensure(ql.$gtype);const Jl={stories:[ql]},Yl=[{name:`inbox`,title:`Inbox`,icon:`mail-unread-symbolic`},{name:`starred`,title:`Starred`,icon:`starred-symbolic`},{name:`archive`,title:`Archive`,icon:`folder-symbolic`}],Xl={title:`View Switching/View Switcher Bar`,description:"Adw.ViewSwitcherBar — the narrow-window switcher, pinned to the bottom of a toolbar view. `reveal` is a REQUEST, not a state: a stack with fewer than two pages stays collapsed however loudly it is asked.",controls:[{name:`reveal`,label:`Reveal`,type:i.BOOLEAN,defaultValue:!0}]};var Zl=__exportAll({ViewSwitcherBarStories:()=>$l,ViewSwitcherBarStory:()=>Ql}),Ql=class ViewSwitcherBarStory extends k{_bar=null;static{S.registerClass({GTypeName:`AdwStorybookViewSwitcherBar`},ViewSwitcherBarStory)}constructor(){super(k.fromMeta(ViewSwitcherBarStory.getMetadata(),`Default`))}static getMetadata(){return{...Xl,component:w.ViewSwitcherBar.$gtype}}initialize(){let e=new w.ViewStack({vexpand:!0});for(let t of Yl){let n=new w.StatusPage({iconName:t.icon,title:t.title,description:`The ${t.title.toLowerCase()} page.`,vexpand:!0});e.add_titled_with_icon(n,t.name,t.title,t.icon)}this._bar=new w.ViewSwitcherBar({stack:e}),this._apply();let t=new w.ToolbarView({content:e,widthRequest:360,heightRequest:360});t.add_bottom_bar(this._bar),this.addContent(t)}updateArgs(e){this._apply()}_apply(){this._bar&&(this._bar.reveal=this.args.reveal)}};S.type_ensure(Ql.$gtype);const $l={stories:[Ql]},eu=[{name:`inbox`,title:`Inbox`,icon:`mail-unread-symbolic`,sectionTitle:`Mail`,badgeNumber:3},{name:`starred`,title:`Starred`,icon:`starred-symbolic`},{name:`drafts`,title:`Drafts`,icon:`document-edit-symbolic`},{name:`sent`,title:`Sent`,icon:`mail-send-symbolic`,sectionTitle:`Older`,needsAttention:!0},{name:`archive`,title:`Archive`,icon:`folder-symbolic`},{name:`trash`,title:`Trash`,icon:`user-trash-symbolic`}],tu={title:`View Switching/View Switcher Sidebar`,description:"Adw.ViewSwitcherSidebar — an Adw.Sidebar driven by an Adw.ViewStack, which is the one Adw switcher whose rows can be grouped into sections and carry an unread dot or a badge. `page` collapses it into a page of boxed lists.",controls:[{name:`mode`,label:`Page mode`,type:i.BOOLEAN,defaultValue:!1}]};var nu=__exportAll({ViewSwitcherSidebarStories:()=>iu,ViewSwitcherSidebarStory:()=>ru}),ru=class ViewSwitcherSidebarStory extends k{_switcher=null;static{S.registerClass({GTypeName:`AdwStorybookViewSwitcherSidebar`},ViewSwitcherSidebarStory)}constructor(){super(k.fromMeta(ViewSwitcherSidebarStory.getMetadata(),`Default`))}static getMetadata(){return{...tu,component:w.ViewSwitcherSidebar.$gtype}}initialize(){let e=new w.ViewStack({vexpand:!0});for(let t of eu){let n=new w.StatusPage({iconName:t.icon,title:t.title,vexpand:!0});e.add_titled(n,t.name,t.title)}let t=e.get_pages();for(let e=0;e<t.get_n_items();e++){let n=t.get_item(e),r=eu.find(e=>e.name===n.name);r?.sectionTitle&&(n.startsSection=!0,n.sectionTitle=r.sectionTitle,r.badgeNumber&&(n.badgeNumber=r.badgeNumber),r.needsAttention&&(n.needsAttention=!0))}let n=new w.ViewSwitcherSidebar({stack:e});this._switcher=n;let r=new h.Box({orientation:h.Orientation.HORIZONTAL,widthRequest:480,heightRequest:340});r.append(n),r.append(e),this.addContent(r),this._apply()}updateArgs(e){this._apply()}_apply(){this._switcher&&(this._switcher.mode=this.args.mode?w.SidebarMode.PAGE:w.SidebarMode.SIDEBAR)}};S.type_ensure(ru.$gtype);const iu={stories:[ru]},au={title:`View Switching/View Switcher`,description:`Adw.ViewSwitcher — a segmented switcher whose buttons select pages in a paired Adw.ViewStack.`,controls:[{name:`policy`,label:`Policy`,type:i.SELECT,options:[{label:`Wide`,value:`wide`},{label:`Narrow`,value:`narrow`}],defaultValue:`wide`}]};var ou=__exportAll({ViewSwitcherStories:()=>cu,ViewSwitcherStory:()=>su}),su=class ViewSwitcherStory extends k{_switcher=null;static{S.registerClass({GTypeName:`AdwStorybookViewSwitcher`},ViewSwitcherStory)}constructor(){super(k.fromMeta(ViewSwitcherStory.getMetadata(),`Default`))}static getMetadata(){return{...au,component:w.ViewSwitcher.$gtype}}buildPage(e,t,n){return new w.StatusPage({iconName:t,title:e,description:n,vexpand:!0})}initialize(){let e=new w.ViewStack({vexpand:!0});e.add_titled_with_icon(this.buildPage(`Inbox`,`mail-unread-symbolic`,`You have three unread conversations.`),`inbox`,`Inbox`,`mail-unread-symbolic`),e.add_titled_with_icon(this.buildPage(`Starred`,`starred-symbolic`,`Messages you have marked as important.`),`starred`,`Starred`,`starred-symbolic`),e.add_titled_with_icon(this.buildPage(`Archive`,`folder-symbolic`,`Older conversations kept for reference.`),`archive`,`Archive`,`folder-symbolic`),this._switcher=new w.ViewSwitcher({stack:e,policy:this.policyFromArg(this.args.policy),halign:h.Align.CENTER});let t=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12,widthRequest:480,heightRequest:340});t.append(this._switcher),t.append(e),this.addContent(t)}policyFromArg(e){return e===`narrow`?w.ViewSwitcherPolicy.NARROW:w.ViewSwitcherPolicy.WIDE}updateArgs(e){this._switcher&&(this._switcher.policy=this.policyFromArg(this.args.policy))}};S.type_ensure(su.$gtype);const cu={stories:[su]},lu={title:`Windows/Action Bar`,description:"Gtk.ActionBar — GTK's bottom bar, and the one libadwaita styles but does not own (`actionbar > revealer > box`). `start` appends and `end` PREPENDS, so the first end child sits nearest the edge; `center` is a real placement with no property behind it, because GtkBuilder refuses `center-widget`; and `revealed` slides the whole bar away.",controls:[{name:`revealed`,label:`Revealed`,type:i.BOOLEAN,defaultValue:!0},{name:`center`,label:`Centre`,type:i.SELECT,options:[{label:`A label`,value:`label`},{label:`Nothing`,value:`none`}],defaultValue:`label`}]};var uu=__exportAll({ActionBarStories:()=>fu,ActionBarStory:()=>du}),du=class ActionBarStory extends k{_bar=null;_centre=null;static{S.registerClass({GTypeName:`AdwStorybookActionBar`},ActionBarStory)}constructor(){super(k.fromMeta(ActionBarStory.getMetadata(),`Default`))}static getMetadata(){return{...lu,component:h.ActionBar.$gtype}}initialize(){this._bar=new h.ActionBar;let e=new h.Button({icon_name:`document-save-symbolic`});e.add_css_class(`flat`),this._bar.pack_end(e);let t=new h.Button({icon_name:`document-open-symbolic`});t.add_css_class(`flat`),this._bar.pack_end(t);let n=new h.Button({icon_name:`document-print-symbolic`});n.add_css_class(`flat`),this._bar.pack_start(n),this._centre=new h.Label({label:`notes.md`});let r=new h.Box({orientation:h.Orientation.VERTICAL,spacing:8});r.append(new h.Label({label:`The bar below is Gtk.ActionBar.`,css_classes:[`dimmed`]})),r.append(this._bar),this.addContent(r),this._apply()}updateArgs(e){this._apply()}_apply(){this._bar&&(this._bar.revealed=this.args.revealed,this._bar.set_center_widget(this.args.center===`label`?this._centre:null))}};S.type_ensure(du.$gtype);const fu={stories:[du]},pu={title:`Windows/Application Window`,description:"Gtk.ApplicationWindow — a Gtk.Window that also handles an application menubar. The bar shows only when `show-menubar` is set AND the application HAS one: GTK builds it from the GtkApplication's menu model, and reads the item count before deciding (gtkapplicationwindow.c:400-402). Everything else about the window is the base class.",controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Editor`},{name:`showMenubar`,label:`Show menubar`,type:i.BOOLEAN,defaultValue:!0},{name:`hasMenubar`,label:`The application has one`,type:i.BOOLEAN,defaultValue:!0},{name:`deletable`,label:`Deletable`,type:i.BOOLEAN,defaultValue:!0}]};var mu=__exportAll({GtkApplicationWindowStories:()=>gu,GtkApplicationWindowStory:()=>hu});function menubarModel(){let e=new x.Menu,t=new x.Menu;t.append(`_New`,`win.new`),t.append(`_Open…`,`win.open`);let n=new x.Menu;return n.append(`_Copy`,`win.copy`),n.append(`_Paste`,`win.paste`),e.append_section(null,t),e.append_section(null,n),e}var hu=class GtkApplicationWindowStory extends k{_window=null;_application=null;_menubar=null;static{S.registerClass({GTypeName:`AdwStorybookGtkApplicationWindow`},GtkApplicationWindowStory)}constructor(){super(k.fromMeta(GtkApplicationWindowStory.getMetadata(),`Default`))}static getMetadata(){return{...pu,component:h.ApplicationWindow.$gtype}}initialize(){this._application=new h.Application({application_id:`eu.jumplink.AdwStorybookGtkApplicationWindow`}),this._menubar=menubarModel(),this._application.set_menubar(this._menubar),this._window=new h.ApplicationWindow({application:this._application,default_width:460,default_height:260}),this._window.set_titlebar(new h.HeaderBar);let e=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12,margin_top:12,margin_start:12});e.append(new h.Label({label:`The bar above is built from the application menu.`,css_classes:[`dimmed`]})),this._window.set_child(e),this.addContent(this._window),this._apply()}updateArgs(e){this._apply()}_apply(){!this._window||!this._application||(this._window.title=this.args.title,this._window.deletable=this.args.deletable,this._application.set_menubar(this.args.hasMenubar?this._menubar:null),this._window.show_menubar=this.args.showMenubar)}};S.type_ensure(hu.$gtype);const gu={stories:[hu]},_u={title:`Windows/Header Bar`,description:"Gtk.HeaderBar — the titlebar widget: children packed at the start and at the end, the window title in the middle, and the window-frame buttons GTK would otherwise ask the window manager for. `end` PREPENDS, so the first end child sits nearest the edge; a `title` child takes the middle away from the derived title label; and `show-title-buttons` CREATES and REMOVES the two control groups rather than hiding them.",controls:[{name:`titleWidget`,label:`Title widget`,type:i.SELECT,options:[{label:`The window title`,value:`none`},{label:`A custom centre widget`,value:`custom`}],defaultValue:`none`},{name:`showTitleButtons`,label:`Title buttons`,type:i.BOOLEAN,defaultValue:!0},{name:`decorationLayout`,label:`Decoration layout`,type:i.SELECT,options:[{label:`GNOME (menu:minimize,maximize,close)`,value:`menu:minimize,maximize,close`},{label:`Close only`,value:`:close`},{label:`macOS (icon:minimize,maximize)`,value:`icon:minimize,maximize`}],defaultValue:`menu:minimize,maximize,close`}]};var vu=__exportAll({GtkHeaderBarStories:()=>bu,GtkHeaderBarStory:()=>yu}),yu=class GtkHeaderBarStory extends k{_bar=null;_titleLabel=null;static{S.registerClass({GTypeName:`AdwStorybookGtkHeaderBar`},GtkHeaderBarStory)}constructor(){super(k.fromMeta(GtkHeaderBarStory.getMetadata(),`Default`))}static getMetadata(){return{..._u,component:h.HeaderBar.$gtype}}initialize(){this._bar=new h.HeaderBar;let e=new h.Button({icon_name:`open-menu-symbolic`});e.add_css_class(`flat`),this._bar.pack_end(e);let t=new h.Button({icon_name:`system-search-symbolic`});t.add_css_class(`flat`),this._bar.pack_end(t);let n=new h.Button({label:`‹`});n.add_css_class(`flat`),this._bar.pack_start(n),this._titleLabel=new h.Label({label:`Mailboxes`,css_classes:[`title`]}),this.addContent(this._bar),this._apply()}updateArgs(e){this._apply()}_apply(){this._bar&&(this._bar.decoration_layout=this.args.decorationLayout,this._bar.show_title_buttons=this.args.showTitleButtons,this.args.titleWidget===`custom`?this._bar.title_widget=this._titleLabel:this._bar.title_widget=null)}};S.type_ensure(yu.$gtype);const bu={stories:[yu]},xu={title:`Windows/Window`,description:"Gtk.Window — a toplevel with a `titlebar` and a `child`, and the properties that decide what its frame shows: `decorated`, `deletable`, `resizable`, `maximized` and `hide-on-close`. The BROWSER replica of this one is an IN-PAGE FRAME, not a toplevel: a browser document has no window to map. The story therefore cancels `close-request`, which is what an application does when it wants to keep the window.",controls:[{name:`title`,label:`Title`,type:i.TEXT,defaultValue:`Documents`},{name:`decorated`,label:`Decorated`,type:i.BOOLEAN,defaultValue:!0},{name:`deletable`,label:`Deletable`,type:i.BOOLEAN,defaultValue:!0},{name:`resizable`,label:`Resizable`,type:i.BOOLEAN,defaultValue:!0},{name:`maximized`,label:`Maximized`,type:i.BOOLEAN,defaultValue:!1},{name:`modal`,label:`Modal`,type:i.BOOLEAN,defaultValue:!1},{name:`hideOnClose`,label:`Hide on close`,type:i.BOOLEAN,defaultValue:!0}]};var Su=__exportAll({GtkWindowStories:()=>wu,GtkWindowStory:()=>Cu}),Cu=class GtkWindowStory extends k{_window=null;static{S.registerClass({GTypeName:`AdwStorybookGtkWindow`},GtkWindowStory)}constructor(){super(k.fromMeta(GtkWindowStory.getMetadata(),`Default`))}static getMetadata(){return{...xu,component:h.Window.$gtype}}initialize(){this._window=new h.Window({default_width:460,default_height:280});let e=new h.HeaderBar;this._window.set_titlebar(e);let t=new h.Box({orientation:h.Orientation.VERTICAL,spacing:12,margin_top:12,margin_start:12});t.append(new h.Label({label:`The frame above is a Gtk.HeaderBar.`,css_classes:[`dimmed`]})),this._window.set_child(t),this.addContent(this._window),this._apply()}updateArgs(e){this._apply()}_apply(){this._window&&(this._window.title=this.args.title,this._window.decorated=this.args.decorated,this._window.deletable=this.args.deletable,this._window.resizable=this.args.resizable,this._window.maximized=this.args.maximized,this._window.modal=this.args.modal,this._window.hide_on_close=this.args.hideOnClose)}};S.type_ensure(Cu.$gtype);const wu={stories:[Cu]},Tu={title:`Windows/Window Controls`,description:"Gtk.WindowControls — one SIDE of the window frame controls, and the decision table behind them. The decoration layout is split on the first colon; each token of the selected half builds one button or none, because `icon` and `minimize` want a SOVEREIGN window, `maximize` wants a resizable one and `close` wants a deletable one. `empty` is the property that says none of them did.",controls:[{name:`side`,label:`Side`,type:i.SELECT,options:[{label:`Start`,value:`start`},{label:`End`,value:`end`}],defaultValue:`start`},{name:`decorationLayout`,label:`Decoration layout`,type:i.SELECT,options:[{label:`GNOME (menu:minimize,maximize,close)`,value:`menu:minimize,maximize,close`},{label:`Windows (icon:minimize,maximize,close)`,value:`icon:minimize,maximize,close`},{label:`Close only`,value:`:close`},{label:`macOS (icon:minimize,maximize)`,value:`icon:minimize,maximize`}],defaultValue:`menu:minimize,maximize,close`},{name:`resizable`,label:`Resizable window`,type:i.BOOLEAN,defaultValue:!0},{name:`maximized`,label:`Maximized window`,type:i.BOOLEAN,defaultValue:!1},{name:`modal`,label:`Modal window`,type:i.BOOLEAN,defaultValue:!1}]};var Eu=__exportAll({WindowControlsStories:()=>Ou,WindowControlsStory:()=>Du}),Du=class WindowControlsStory extends k{_window=null;_controls=null;static{S.registerClass({GTypeName:`AdwStorybookWindowControls`},WindowControlsStory)}constructor(){super(k.fromMeta(WindowControlsStory.getMetadata(),`Default`))}static getMetadata(){return{...Tu,component:h.WindowControls.$gtype}}initialize(){this._window=new h.Window({title:`Documents`,default_width:420,default_height:220});let e=new h.Box({orientation:h.Orientation.VERTICAL,spacing:8});e.append(new h.Label({label:`The bar draws nothing outside a window.`,css_classes:[`dimmed`]})),this._window.set_child(e),this._controls=new h.WindowControls,this._window.set_titlebar(this._controls),this.addContent(this._window),this._apply()}updateArgs(e){this._apply()}_apply(){if(!this._window||!this._controls)return;let e=this.args.side===`end`?h.PackType.END:h.PackType.START;this._controls.side=e,this._controls.decoration_layout=this.args.decorationLayout,this._window.resizable=this.args.resizable,this._window.maximized=this.args.maximized,this._window.modal=this.args.modal}};S.type_ensure(Du.$gtype);const Ou={stories:[Du]};await runStorybook({applicationId:`org.gjsify.AdwaitaStorybook`,title:`Adwaita Storybook`,stories:collectStoryModules([Je,Ze,tt,ot,lt,pt,_t,xt,wt,Dt,jt,Ft,Rt,Vt,Wt,qt,Xt,en,an,ln,pn,_n,xn,Tn,kn,Nn,Ln,Vn,Kn,Xn,tr,sr,dr,gr,br,wr,Or,Mr,Ir,Br,Gr,Xr,ei,ii,ci,fi,gi,bi,wi,Ai,Fi,Bi,Gi,Yi,$i,ia,ca,ma,va,Sa,Ea,Aa,Pa,Ra,Ha,Ka,Xa,eo,io,co,po,vo,So,ko,No,Lo,Ho,qo,Qo,os,ds,ms,bs,Ts,ks,Ps,Rs,Hs,Ks,Xs,nc,oc,uc,mc,vc,Sc,Ec,Ac,Pc,Rc,Hc,Kc,Qc,il,ll,hl,xl,El,jl,Il,Bl,Gl,Zl,nu,ou,uu,mu,vu,Su,Eu])});export{};
|