@gjsify/adwaita-app 0.45.0 → 0.47.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/README.md CHANGED
@@ -21,7 +21,7 @@ gjsify install @gjsify/adwaita-app
21
21
  ## Quick start
22
22
 
23
23
  ```ts
24
- import Adw from '@girs/adw-1';
24
+ import Adw from 'gi://Adw?version=1';
25
25
  import { runAdwaitaApp, createNavShell, type NavItem } from '@gjsify/adwaita-app';
26
26
 
27
27
  const NAV: NavItem[] = [
@@ -1 +1 @@
1
- import"./_virtual/_rolldown/runtime.js";import e from"@girs/adw-1";import t from"@girs/gdk-4.0";import n from"@girs/gio-2.0";import r from"@girs/gobject-2.0";import i from"@girs/gtk-4.0";import a from"system";import{installDevtools as o}from"@gjsify/devtools";var s=class AdwaitaApp extends e.Application{static{r.registerClass({GTypeName:`GjsifyAdwaitaApp`},AdwaitaApp)}constructor(e){super({application_id:e.applicationId,flags:e.flags??n.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 n.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){let e=new n.SimpleAction({name:`about`});e.connect(`activate`,()=>this._showAbout()),this.add_action(e)}}_onStartup(){this._options.css&&this._loadCss(this._options.css),this._installDevtools(),this._options.onStartup?.(this)}_loadCss(e){let n=t.Display.get_default();if(!n){console.error(`@gjsify/adwaita-app: no default display; CSS not applied`);return}let r=new i.CssProvider;r.load_from_string(e),i.StyleContext.add_provider_for_display(n,r,i.STYLE_PROVIDER_PRIORITY_APPLICATION)}_installDevtools(){let e=this._options.devtools;if(e===!1)return;let t=typeof e==`object`?e:{enabled:e||void 0};o(this,t)}_onActivate(){this._window||=this._options.createWindow(this),this._window.present()}_showAbout(){let t=this._options.about;if(!t)return;let n=new e.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 runAdwaitaApp(e){return runApplication(new s(e),[a.programInvocationName,...a.programArgs])}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}r.type_ensure(s.$gtype);export{s as AdwaitaApp,runAdwaitaApp,runApplication};
1
+ import"./_virtual/_rolldown/runtime.js";import e from"gi://Adw?version=1";import t from"gi://Gdk?version=4.0";import n from"gi://Gio?version=2.0";import r from"gi://GObject?version=2.0";import i from"gi://Gtk?version=4.0";import a from"system";import{installDevtools as o}from"@gjsify/devtools";var s=class AdwaitaApp extends e.Application{static{r.registerClass({GTypeName:`GjsifyAdwaitaApp`},AdwaitaApp)}constructor(e){super({application_id:e.applicationId,flags:e.flags??n.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 n.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){let e=new n.SimpleAction({name:`about`});e.connect(`activate`,()=>this._showAbout()),this.add_action(e)}}_onStartup(){this._options.css&&this._loadCss(this._options.css),this._installDevtools(),this._options.onStartup?.(this)}_loadCss(e){let n=t.Display.get_default();if(!n){console.error(`@gjsify/adwaita-app: no default display; CSS not applied`);return}let r=new i.CssProvider;r.load_from_string(e),i.StyleContext.add_provider_for_display(n,r,i.STYLE_PROVIDER_PRIORITY_APPLICATION)}_installDevtools(){let e=this._options.devtools;if(e===!1)return;let t=typeof e==`object`?e:{enabled:e||void 0};o(this,t)}_onActivate(){this._window||=this._options.createWindow(this),this._window.present()}_showAbout(){let t=this._options.about;if(!t)return;let n=new e.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 runAdwaitaApp(e){return runApplication(new s(e),[a.programInvocationName,...a.programArgs])}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}r.type_ensure(s.$gtype);export{s as AdwaitaApp,runAdwaitaApp,runApplication};
@@ -1 +1 @@
1
- import"./_virtual/_rolldown/runtime.js";import{resolveDefaultResponse as e}from"./dialog-model.js";import t from"@girs/adw-1";function confirmDialog(n,r){let i=e(r.defaultResponse);return new Promise(e=>{let a=new t.AlertDialog({heading:r.heading,body:r.body??``});a.add_response(`cancel`,r.cancelLabel??`Cancel`),a.add_response(`confirm`,r.confirmLabel??`OK`),a.set_response_appearance(`confirm`,r.destructive?t.ResponseAppearance.DESTRUCTIVE:t.ResponseAppearance.SUGGESTED),a.set_default_response(i),a.set_close_response(`cancel`),a.connect(`response`,(t,n)=>e(n===`confirm`)),a.present(n)})}function errorDialog(e,n,r,i){return new Promise(a=>{let o=new t.AlertDialog({heading:n,body:r??``});o.add_response(`ok`,i??`OK`),o.set_default_response(`ok`),o.set_close_response(`ok`),o.connect(`response`,()=>a()),o.present(e)})}export{confirmDialog,errorDialog};
1
+ import"./_virtual/_rolldown/runtime.js";import{resolveDefaultResponse as e}from"./dialog-model.js";import t from"gi://Adw?version=1";function confirmDialog(n,r){let i=e(r.defaultResponse);return new Promise(e=>{let a=new t.AlertDialog({heading:r.heading,body:r.body??``});a.add_response(`cancel`,r.cancelLabel??`Cancel`),a.add_response(`confirm`,r.confirmLabel??`OK`),a.set_response_appearance(`confirm`,r.destructive?t.ResponseAppearance.DESTRUCTIVE:t.ResponseAppearance.SUGGESTED),a.set_default_response(i),a.set_close_response(`cancel`),a.connect(`response`,(t,n)=>e(n===`confirm`)),a.present(n)})}function errorDialog(e,n,r,i){return new Promise(a=>{let o=new t.AlertDialog({heading:n,body:r??``});o.add_response(`ok`,i??`OK`),o.set_default_response(`ok`),o.set_close_response(`ok`),o.connect(`response`,()=>a()),o.present(e)})}export{confirmDialog,errorDialog};
@@ -1 +1 @@
1
- import"./_virtual/_rolldown/runtime.js";import e from"@girs/gio-2.0";import t from"@girs/gtk-4.0";function buildFilters(n){if(!n?.length)return;let r=new e.ListStore({itemType:t.FileFilter.$gtype});for(let e of n){let n=new t.FileFilter;n.set_name(e.name);for(let t of e.patterns??[])n.add_pattern(t);for(let t of e.mimeTypes??[])n.add_mime_type(t);r.append(n)}return r}function pickFile(e,n={}){return new Promise(r=>{let i=new t.FileDialog({title:n.title??`Open File`}),a=buildFilters(n.filters);a&&i.set_filters(a),i.open(e,null,(e,t)=>{try{r(i.open_finish(t)?.get_path()??null)}catch{r(null)}})})}function saveFile(e,n={}){return new Promise(r=>{let i=new t.FileDialog({title:n.title??`Save File`});n.initialName&&i.set_initial_name(n.initialName);let a=buildFilters(n.filters);a&&i.set_filters(a),i.save(e,null,(e,t)=>{try{r(i.save_finish(t)?.get_path()??null)}catch{r(null)}})})}export{pickFile,saveFile};
1
+ import"./_virtual/_rolldown/runtime.js";import e from"gi://Gio?version=2.0";import t from"gi://Gtk?version=4.0";function buildFilters(n){if(!n?.length)return;let r=new e.ListStore({itemType:t.FileFilter.$gtype});for(let e of n){let n=new t.FileFilter;n.set_name(e.name);for(let t of e.patterns??[])n.add_pattern(t);for(let t of e.mimeTypes??[])n.add_mime_type(t);r.append(n)}return r}function pickFile(e,n={}){return new Promise(r=>{let i=new t.FileDialog({title:n.title??`Open File`}),a=buildFilters(n.filters);a&&i.set_filters(a),i.open(e,null,(e,t)=>{try{r(i.open_finish(t)?.get_path()??null)}catch{r(null)}})})}function saveFile(e,n={}){return new Promise(r=>{let i=new t.FileDialog({title:n.title??`Save File`});n.initialName&&i.set_initial_name(n.initialName);let a=buildFilters(n.filters);a&&i.set_filters(a),i.save(e,null,(e,t)=>{try{r(i.save_finish(t)?.get_path()??null)}catch{r(null)}})})}export{pickFile,saveFile};
@@ -1 +1 @@
1
- import"./_virtual/_rolldown/runtime.js";import e from"@girs/adw-1";import t from"@girs/gobject-2.0";import n from"@girs/gtk-4.0";var r=class LoadingStack extends n.Stack{static{t.registerClass({GTypeName:`GjsifyLoadingStack`},LoadingStack)}constructor(t={}){super(t);let r=new n.Box({orientation:n.Orientation.VERTICAL,halign:n.Align.CENTER,valign:n.Align.CENTER,hexpand:!0,vexpand:!0});r.append(new e.Spinner),this.add_named(r,`loading`),this._content=new e.Bin({hexpand:!0,vexpand:!0}),this.add_named(this._content,`content`),this._error=new e.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`)}};t.type_ensure(r.$gtype);export{r as LoadingStack};
1
+ import"./_virtual/_rolldown/runtime.js";import e from"gi://Adw?version=1";import t from"gi://GObject?version=2.0";import n from"gi://Gtk?version=4.0";var r=class LoadingStack extends n.Stack{static{t.registerClass({GTypeName:`GjsifyLoadingStack`},LoadingStack)}constructor(t={}){super(t);let r=new n.Box({orientation:n.Orientation.VERTICAL,halign:n.Align.CENTER,valign:n.Align.CENTER,hexpand:!0,vexpand:!0});r.append(new e.Spinner),this.add_named(r,`loading`),this._content=new e.Bin({hexpand:!0,vexpand:!0}),this.add_named(this._content,`content`),this._error=new e.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`)}};t.type_ensure(r.$gtype);export{r as LoadingStack};
package/lib/esm/locale.js CHANGED
@@ -1 +1 @@
1
- import"./_virtual/_rolldown/runtime.js";import{resolveLocaleDir as e}from"./locale-dir.js";import t from"@girs/glib-2.0";import n from"gettext";function initLocale(r,i={}){let a=e({...i,env:{GJSIFY_LOCALE_DIR:t.getenv(`GJSIFY_LOCALE_DIR`)??void 0}});return n.setlocale(n.LocaleCategory.ALL,``),n.bindtextdomain(r,a),n.textdomain(r),Object.assign(e=>n.dgettext(r,e),{plural:(e,t,i)=>n.dngettext(r,e,t,i),context:(e,t)=>n.dpgettext(r,e,t),localeDir:a,domain:r})}export{initLocale};
1
+ import"./_virtual/_rolldown/runtime.js";import{resolveLocaleDir as e}from"./locale-dir.js";import t from"gi://GLib?version=2.0";import n from"gettext";function initLocale(r,i={}){let a=e({...i,env:{GJSIFY_LOCALE_DIR:t.getenv(`GJSIFY_LOCALE_DIR`)??void 0}});return n.setlocale(n.LocaleCategory.ALL,``),n.bindtextdomain(r,a),n.textdomain(r),Object.assign(e=>n.dgettext(r,e),{plural:(e,t,i)=>n.dngettext(r,e,t,i),context:(e,t)=>n.dpgettext(r,e,t),localeDir:a,domain:r})}export{initLocale};
@@ -1 +1 @@
1
- import"./_virtual/_rolldown/runtime.js";import e from"@girs/adw-1";import t from"@girs/gtk-4.0";function buildNavRow(e){let n=new t.ListBoxRow,r=new t.Box({orientation:t.Orientation.HORIZONTAL,spacing:12,marginTop:8,marginBottom:8,marginStart:12,marginEnd:12});e.icon&&r.append(new t.Image({iconName:e.icon}));let i=new t.Box({orientation:t.Orientation.VERTICAL,hexpand:!0});return i.append(new t.Label({label:e.label,xalign:0})),e.subtitle&&i.append(new t.Label({label:e.subtitle,xalign:0,cssClasses:[`dim-label`,`caption`]})),r.append(i),n.set_child(r),n}function createNavShell(n,r){let i=new e.NavigationSplitView,a=new t.Stack({transitionType:t.StackTransitionType.CROSSFADE,hexpand:!0,vexpand:!0}),o=new t.ListBox({cssClasses:[`navigation-sidebar`]}),s=new e.HeaderBar,c=new e.HeaderBar;r.sidebarTitle&&c.set_title_widget(new e.WindowTitle({title:r.sidebarTitle,subtitle:``})),r.sidebarHeaderStart&&c.pack_start(r.sidebarHeaderStart),r.sidebarHeaderEnd&&c.pack_end(r.sidebarHeaderEnd);let l=new e.ToolbarView;l.add_top_bar(c),l.set_content(o),i.set_sidebar(new e.NavigationPage({title:r.sidebarTitle??`Menu`,child:l}));let u=new e.ToolbarView;u.add_top_bar(s),u.set_content(a),i.set_content(new e.NavigationPage({title:r.sidebarTitle??``,child:u}));for(let e of r.items)o.append(buildNavRow(e));o.connect(`row-selected`,(e,t)=>{if(!t)return;let n=t.get_index(),a=r.items[n];a&&(r.onSelect(a,n),i.get_collapsed()&&i.set_show_content(!0))});let d=r.collapseWidth??720,f=e.BreakpointCondition.parse(`max-width: ${d}px`);if(f){let t=new e.Breakpoint({condition:f});t.add_setter(i,`collapsed`,!0),n.add_breakpoint(t)}let selectByIndex=e=>{let t=o.get_row_at_index(e);t&&o.select_row(t)};return{widget:i,stack:a,contentHeader:s,selectByIndex,selectById(e){let t=r.items.findIndex(t=>t.id===e);selectByIndex(t>=0?t:0)}}}export{createNavShell};
1
+ import"./_virtual/_rolldown/runtime.js";import e from"gi://Adw?version=1";import t from"gi://Gtk?version=4.0";function buildNavRow(e){let n=new t.ListBoxRow,r=new t.Box({orientation:t.Orientation.HORIZONTAL,spacing:12,marginTop:8,marginBottom:8,marginStart:12,marginEnd:12});e.icon&&r.append(new t.Image({iconName:e.icon}));let i=new t.Box({orientation:t.Orientation.VERTICAL,hexpand:!0});return i.append(new t.Label({label:e.label,xalign:0})),e.subtitle&&i.append(new t.Label({label:e.subtitle,xalign:0,cssClasses:[`dim-label`,`caption`]})),r.append(i),n.set_child(r),n}function createNavShell(n,r){let i=new e.NavigationSplitView,a=new t.Stack({transitionType:t.StackTransitionType.CROSSFADE,hexpand:!0,vexpand:!0}),o=new t.ListBox({cssClasses:[`navigation-sidebar`]}),s=new e.HeaderBar,c=new e.HeaderBar;r.sidebarTitle&&c.set_title_widget(new e.WindowTitle({title:r.sidebarTitle,subtitle:``})),r.sidebarHeaderStart&&c.pack_start(r.sidebarHeaderStart),r.sidebarHeaderEnd&&c.pack_end(r.sidebarHeaderEnd);let l=new e.ToolbarView;l.add_top_bar(c),l.set_content(o),i.set_sidebar(new e.NavigationPage({title:r.sidebarTitle??`Menu`,child:l}));let u=new e.ToolbarView;u.add_top_bar(s),u.set_content(a),i.set_content(new e.NavigationPage({title:r.sidebarTitle??``,child:u}));for(let e of r.items)o.append(buildNavRow(e));o.connect(`row-selected`,(e,t)=>{if(!t)return;let n=t.get_index(),a=r.items[n];a&&(r.onSelect(a,n),i.get_collapsed()&&i.set_show_content(!0))});let d=r.collapseWidth??720,f=e.BreakpointCondition.parse(`max-width: ${d}px`);if(f){let t=new e.Breakpoint({condition:f});t.add_setter(i,`collapsed`,!0),n.add_breakpoint(t)}let selectByIndex=e=>{let t=o.get_row_at_index(e);t&&o.select_row(t)};return{widget:i,stack:a,contentHeader:s,selectByIndex,selectById(e){let t=r.items.findIndex(t=>t.id===e);selectByIndex(t>=0?t:0)}}}export{createNavShell};
package/lib/esm/toast.js CHANGED
@@ -1 +1 @@
1
- import"./_virtual/_rolldown/runtime.js";import e from"@girs/adw-1";let t=null;function registerToastOverlay(e){t=e}function showToast(n,r=3){if(!t){console.warn(`@gjsify/adwaita-app: showToast() before registerToastOverlay()`);return}t.add_toast(new e.Toast({title:n,timeout:r}))}export{registerToastOverlay,showToast};
1
+ import"./_virtual/_rolldown/runtime.js";import e from"gi://Adw?version=1";let t=null;function registerToastOverlay(e){t=e}function showToast(n,r=3){if(!t){console.warn(`@gjsify/adwaita-app: showToast() before registerToastOverlay()`);return}t.add_toast(new e.Toast({title:n,timeout:r}))}export{registerToastOverlay,showToast};
@@ -1,6 +1,6 @@
1
- import Adw from '@girs/adw-1';
2
- import Gio from '@girs/gio-2.0';
3
- import Gtk from '@girs/gtk-4.0';
1
+ import Adw from 'gi://Adw?version=1';
2
+ import Gio from 'gi://Gio?version=2.0';
3
+ import Gtk from 'gi://Gtk?version=4.0';
4
4
  import { type InstallDevtoolsOptions } from '@gjsify/devtools';
5
5
  import type { AboutInfo } from './types.js';
6
6
  /** Options for {@link AdwaitaApp} / {@link runAdwaitaApp}. */
@@ -1,4 +1,4 @@
1
- import type Gtk from '@girs/gtk-4.0';
1
+ import type Gtk from 'gi://Gtk?version=4.0';
2
2
  import type { ConfirmResponse } from './types.js';
3
3
  /** Options for {@link confirmDialog}. */
4
4
  export interface ConfirmOptions {
@@ -1,4 +1,4 @@
1
- import Gtk from '@girs/gtk-4.0';
1
+ import Gtk from 'gi://Gtk?version=4.0';
2
2
  /** A named file filter (glob patterns and/or MIME types). */
3
3
  export interface FileFilterSpec {
4
4
  /** Human-readable filter name. */
@@ -1,4 +1,4 @@
1
- import Gtk from '@girs/gtk-4.0';
1
+ import Gtk from 'gi://Gtk?version=4.0';
2
2
  /**
3
3
  * A `Gtk.Stack` pre-wired with the three named pages {@link loadIntoStack}
4
4
  * switches between: `loading` (a centered `Adw.Spinner`), `content` (a settable
@@ -1,5 +1,5 @@
1
- import Adw from '@girs/adw-1';
2
- import Gtk from '@girs/gtk-4.0';
1
+ import Adw from 'gi://Adw?version=1';
2
+ import Gtk from 'gi://Gtk?version=4.0';
3
3
  import type { NavItem } from './types.js';
4
4
  /** Options for {@link createNavShell}. */
5
5
  export interface NavShellOptions {
@@ -1,4 +1,4 @@
1
- import Adw from '@girs/adw-1';
1
+ import Adw from 'gi://Adw?version=1';
2
2
  /** Register the active window's toast overlay. Call once, at window build. */
3
3
  export declare function registerToastOverlay(toastOverlay: Adw.ToastOverlay): void;
4
4
  /**
@@ -1,4 +1,4 @@
1
- import type Gtk from '@girs/gtk-4.0';
1
+ import type Gtk from 'gi://Gtk?version=4.0';
2
2
  /**
3
3
  * Monotonic counter guarding against stale async reloads: each load takes a
4
4
  * `next()` ticket and only applies its result while it is still `current`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gjsify/adwaita-app",
3
- "version": "0.45.0",
3
+ "version": "0.47.0",
4
4
  "description": "Native Adwaita application shell for GJS/GTK apps — Adw.Application lifecycle (runAsync + devtools + CSS), a data-driven NavigationSplitView nav shell, an async-view mounter, and promise dialog/toast/file helpers",
5
5
  "type": "module",
6
6
  "module": "lib/esm/index.js",
@@ -39,19 +39,19 @@
39
39
  "framework"
40
40
  ],
41
41
  "dependencies": {
42
- "@girs/adw-1": "^4.1.0",
43
- "@girs/gdk-4.0": "^4.1.0",
44
- "@girs/gio-2.0": "^4.1.0",
45
- "@girs/gjs": "^4.1.0",
46
- "@girs/glib-2.0": "^4.1.0",
47
- "@girs/gobject-2.0": "^4.1.0",
48
- "@girs/gtk-4.0": "^4.1.0",
49
- "@gjsify/devtools": "^0.45.0"
42
+ "@girs/adw-1": "4.6.0",
43
+ "@girs/gdk-4.0": "4.6.0",
44
+ "@girs/gio-2.0": "4.6.0",
45
+ "@girs/gjs": "4.6.0",
46
+ "@girs/glib-2.0": "4.6.0",
47
+ "@girs/gobject-2.0": "4.6.0",
48
+ "@girs/gtk-4.0": "4.6.0",
49
+ "@gjsify/devtools": "^0.47.0"
50
50
  },
51
51
  "devDependencies": {
52
- "@gjsify/cli": "^0.45.0",
53
- "@gjsify/storybook": "^0.45.0",
54
- "@gjsify/unit": "^0.45.0",
52
+ "@gjsify/cli": "^0.47.0",
53
+ "@gjsify/storybook": "^0.47.0",
54
+ "@gjsify/unit": "^0.47.0",
55
55
  "@types/node": "^25.9.2",
56
56
  "typescript": "^6.0.3"
57
57
  },