@ossy/app 3.25.0 → 3.26.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ossy/app",
3
- "version": "3.25.0",
3
+ "version": "3.26.0",
4
4
  "description": "",
5
5
  "source": "./src/index.js",
6
6
  "main": "./src/index.js",
@@ -49,22 +49,22 @@
49
49
  "@babel/eslint-parser": "^7.15.8",
50
50
  "@babel/preset-react": "^7.26.3",
51
51
  "@babel/register": "^7.25.9",
52
- "@ossy/authentication": "^3.11.1",
53
- "@ossy/design-system": "^3.25.0",
52
+ "@ossy/authentication": "^3.26.0",
53
+ "@ossy/design-system": "^3.26.0",
54
54
  "@ossy/locale": "^3.4.0",
55
55
  "@ossy/manifest": "^3.24.0",
56
- "@ossy/package-catalog": "^3.25.0",
57
- "@ossy/pages": "^3.0.9",
58
- "@ossy/platform": "^3.25.0",
59
- "@ossy/resources": "^3.25.0",
56
+ "@ossy/package-catalog": "^3.26.0",
57
+ "@ossy/pages": "^3.26.0",
58
+ "@ossy/platform": "^3.26.0",
59
+ "@ossy/resources": "^3.26.0",
60
60
  "@ossy/router": "^3.25.0",
61
61
  "@ossy/router-react": "^3.18.0",
62
62
  "@ossy/schema": "^3.24.0",
63
- "@ossy/sdk": "^3.24.0",
64
- "@ossy/sdk-react": "^3.12.0",
65
- "@ossy/themes": "^3.25.0",
63
+ "@ossy/sdk": "^3.26.0",
64
+ "@ossy/sdk-react": "^3.26.0",
65
+ "@ossy/themes": "^3.26.0",
66
66
  "@ossy/users": "^3.24.1",
67
- "@ossy/workspaces": "^3.25.0",
67
+ "@ossy/workspaces": "^3.26.0",
68
68
  "@rollup/plugin-alias": "^6.0.0",
69
69
  "@rollup/plugin-babel": "^7.1.0",
70
70
  "@rollup/plugin-commonjs": "^29.0.0",
@@ -98,5 +98,5 @@
98
98
  "README.md",
99
99
  "tsconfig.json"
100
100
  ],
101
- "gitHead": "00dd4b51a94de7e0399c9dfa59380a53e58c8523"
101
+ "gitHead": "0df308a330150a890b9dd4d6ffc2e9f28bd31966"
102
102
  }
@@ -5,12 +5,7 @@ import { useApp } from './AppContext.js'
5
5
  import { formatPagePaths, groupPagesByFeature } from './devPagesUtils.js'
6
6
  import { packageNameToSlug } from '@ossy/manifest/build-manifest-summary'
7
7
 
8
- const monoStyle = {
9
- fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',
10
- fontSize: '0.8125rem',
11
- lineHeight: 1.4,
12
- wordBreak: 'break-all',
13
- }
8
+ const monoStyle = { wordBreak: 'break-all' }
14
9
 
15
10
  const currentPageStyles = {
16
11
  padding: 'var(--space-s)',
@@ -65,13 +60,13 @@ export const DevPagesPanel = () => {
65
60
  text="design-system.dev.pagesPanel.currentPage"
66
61
  style={{ marginBottom: 'var(--space-xs)' }}
67
62
  />
68
- <Text style={monoStyle}>
63
+ <Text family="mono" font="xs" leading="l" style={monoStyle}>
69
64
  <strong><Text as="span" text="design-system.dev.pagesPanel.id" />:</strong> {app?.pageId || '—'}
70
65
  </Text>
71
- <Text style={monoStyle}>
66
+ <Text family="mono" font="xs" leading="l" style={monoStyle}>
72
67
  <strong><Text as="span" text="design-system.dev.pagesPanel.path" />:</strong> {currentPathLabel}
73
68
  </Text>
74
- <Text style={monoStyle}>
69
+ <Text family="mono" font="xs" leading="l" style={monoStyle}>
75
70
  <strong><Text as="span" text="design-system.dev.pagesPanel.url" />:</strong> {currentUrl}
76
71
  </Text>
77
72
  {packageDetailHref && currentPage?.package && (
@@ -94,7 +89,7 @@ export const DevPagesPanel = () => {
94
89
 
95
90
  {groups.map(({ key, label, pages: groupPages }) => (
96
91
  <View key={key} gap="xs">
97
- <Text style={{ fontWeight: 700, fontSize: '0.875rem' }}>{label}</Text>
92
+ <Text weight="bold" font="s">{label}</Text>
98
93
  <View gap="xs">
99
94
  {groupPages.map((page) => {
100
95
  const href = router.getHref(page.id)
@@ -115,8 +110,8 @@ export const DevPagesPanel = () => {
115
110
  }}
116
111
  >
117
112
  <View gap="2px" style={{ alignItems: 'flex-start' }}>
118
- <Text style={{ ...monoStyle, fontWeight: 600 }}>{page.id}</Text>
119
- <Text style={{ ...monoStyle, opacity: 0.85 }}>
113
+ <Text family="mono" font="xs" leading="l" weight="bold" style={monoStyle}>{page.id}</Text>
114
+ <Text family="mono" font="xs" leading="l" style={{ ...monoStyle, opacity: 0.85 }}>
120
115
  {formatPagePaths(page.path)}
121
116
  </Text>
122
117
  </View>
@@ -142,8 +142,8 @@ export function MobileShellNav ({
142
142
  display: 'flex',
143
143
  flexDirection: 'column',
144
144
  // Theme primary is glass; over Overlay's dark scrim it reads as a muddy top bar.
145
- // Use solid color.primary so drawer chrome stays opaque and readable.
146
- background: 'var(--color-primary)',
145
+ // Use the opaque primary so drawer chrome stays readable.
146
+ background: 'var(--surface-primary-solid)',
147
147
  backdropFilter: 'none',
148
148
  WebkitBackdropFilter: 'none',
149
149
  })}
@@ -68,22 +68,34 @@ export const ThemeEditor = () => {
68
68
  isEditorOpen && (
69
69
  <Overlay isVisible={true} onClose={onToggle}>
70
70
  <View layout="off-center" data-component="theme-editor-overlay">
71
- <View data-region="content" data-component="theme-editor-panel">
72
- <View surface="primary" roundness="m" gap="m" inset="l">
73
- <DevPagesPanel />
74
- <View as="form" gap="s" onSubmit={onSaveTheme} onChange={onThemeChange}>
75
- {Object.entries(theme).map(([name, value]) => (
76
- <div key={name} data-component="theme-editor-field">
77
- <label>{name}</label>
78
- <input value={value} data-name={name} />
79
- </div>
80
- ))}
81
- <Button type="submit" variant="cta">
82
- Save
83
- </Button>
71
+ <View
72
+ data-region="content"
73
+ data-component="theme-editor-panel"
74
+ surface="primary"
75
+ roundness="m"
76
+ >
77
+ <View data-component="theme-editor-scroll">
78
+ {/* Column views default to min-height 0, which shrinks this panel instead of scrolling. */}
79
+ <View
80
+ gap="m"
81
+ inset="l"
82
+ style={{ flexShrink: 0, minHeight: 'min-content' }}
83
+ >
84
+ <DevPagesPanel />
85
+ <View as="form" gap="s" onSubmit={onSaveTheme} onChange={onThemeChange}>
86
+ {Object.entries(theme).map(([name, value]) => (
87
+ <div key={name} data-component="theme-editor-field">
88
+ <label>{name}</label>
89
+ <input value={value} data-name={name} />
90
+ </div>
91
+ ))}
92
+ <Button type="submit" variant="cta">
93
+ Save
94
+ </Button>
95
+ </View>
96
+ <ThemeSwitcher/>
97
+ <Text>Views: {viewCount}</Text>
84
98
  </View>
85
- <ThemeSwitcher/>
86
- <Text>Views: {viewCount}</Text>
87
99
  </View>
88
100
  </View>
89
101
  </View>
@@ -23,7 +23,7 @@ export { resolvePackageHomePageId }
23
23
 
24
24
  /**
25
25
  * Build entitlement-filtered sidebar navigation — one link per entitled package
26
- * that registers a `{slug}/home` page.
26
+ * that registers a `{slug}/home` page, or `{slug}/overview` when home is absent.
27
27
  *
28
28
  * @param {{
29
29
  * manifestSummary?: { packages?: Array<{ slug?: string, package?: string, pages?: Array<{ id: string, title?: string, path?: string | Record<string, string> }> }> }
@@ -1,6 +1,6 @@
1
1
  /**
2
- * Pick the package home page for sidebar nav.
3
- * Only `{slug}/home` qualifies — no fallback to other pages.
2
+ * Pick the package landing page for sidebar nav.
3
+ * `{slug}/home` wins. `{slug}/overview` is the landing when the package has no home page.
4
4
  *
5
5
  * @param {Array<{ id?: string }> | undefined} pages
6
6
  * @param {string} slug
@@ -8,7 +8,8 @@
8
8
  */
9
9
  export function resolvePackageHomePageId (pages, slug) {
10
10
  if (!slug) return null
11
- const homeId = `${slug}/home`
12
- const match = (pages || []).find((page) => page?.id === homeId)
13
- return match ? homeId : null
11
+ const ids = new Set((pages || []).map((page) => page?.id))
12
+ if (ids.has(`${slug}/home`)) return `${slug}/home`
13
+ if (ids.has(`${slug}/overview`)) return `${slug}/overview`
14
+ return null
14
15
  }
@@ -20,12 +20,36 @@ export const themeEditorStyles = `
20
20
  width: min(720px, 80vw);
21
21
  min-width: min(480px, 100%);
22
22
  max-height: 85vh;
23
- overflow-y: auto;
24
- overflow-x: hidden;
23
+ overflow: hidden;
25
24
  margin: 0 auto;
26
25
  box-shadow: 2px 2px 5px color-mix(in srgb, var(--foreground) 20%, transparent);
27
26
  }
28
27
 
28
+ [data-component="theme-editor-scroll"] {
29
+ min-height: 0;
30
+ flex: 1 1 auto;
31
+ overflow-x: hidden;
32
+ overflow-y: auto;
33
+ margin: var(--space-s);
34
+ scrollbar-width: thin;
35
+ scrollbar-color: color-mix(in srgb, var(--foreground) 45%, transparent) transparent;
36
+ }
37
+
38
+ [data-component="theme-editor-scroll"]::-webkit-scrollbar {
39
+ width: 10px;
40
+ }
41
+
42
+ [data-component="theme-editor-scroll"]::-webkit-scrollbar-track {
43
+ background: transparent;
44
+ }
45
+
46
+ [data-component="theme-editor-scroll"]::-webkit-scrollbar-thumb {
47
+ background: color-mix(in srgb, var(--foreground) 45%, transparent);
48
+ border-radius: 999px;
49
+ border: 3px solid transparent;
50
+ background-clip: padding-box;
51
+ }
52
+
29
53
  [data-component="theme-editor-overlay"] {
30
54
  height: 100%;
31
55
  width: 100%;
@@ -37,7 +61,7 @@ export const themeEditorStyles = `
37
61
 
38
62
  [data-component="theme-editor-field"] label {
39
63
  display: block;
40
- font-family: var(--text-default-font-family, sans-serif);
64
+ font-family: var(--family-sans, sans-serif);
41
65
  margin-bottom: var(--space-xs);
42
66
  font-weight: 700;
43
67
  }