@ash-qw/dsh-theme-prts 2.7.0 → 2.7.1
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/CHANGELOG.md +14 -0
- package/THIRD_PARTY_NOTICES.md +2 -1
- package/THIRD_PARTY_NOTICES.zh-CN.md +2 -1
- package/lib/client.js +53 -17
- package/package.json +1 -1
- package/src/client/composer-glass-surface.js +14 -4
- package/src/client/index.js +8 -3
- package/src/client/sidebar-control-adapter.js +31 -9
- package/src/styles/custom-background.css +2 -2
- package/src/styles/prts.css +7 -2
- package/src/styles/refinement.css +71 -4
package/package.json
CHANGED
|
@@ -13,6 +13,7 @@ export function createComposerGlassSurface({document, window, mount}) {
|
|
|
13
13
|
surfaces.delete(card)
|
|
14
14
|
}
|
|
15
15
|
function sync() {
|
|
16
|
+
if (frame !== undefined) window.cancelAnimationFrame?.(frame)
|
|
16
17
|
frame = undefined
|
|
17
18
|
const cards = new Set(document.querySelectorAll('[data-composer-card], [data-prts-composer-fallback]'))
|
|
18
19
|
for (const [card, entry] of surfaces) if (!cards.has(card)) remove(card, entry)
|
|
@@ -68,12 +69,21 @@ export function createComposerGlassSurface({document, window, mount}) {
|
|
|
68
69
|
if (!mount) return
|
|
69
70
|
document.documentElement.setAttribute('data-prts-composer-enhanced', '')
|
|
70
71
|
if (!observer) {
|
|
71
|
-
resize = new window.ResizeObserver(
|
|
72
|
+
resize = new window.ResizeObserver(entries => {
|
|
73
|
+
if (entries.some(({target}) => !surfaces.has(target)
|
|
74
|
+
&& target.offsetWidth && target.offsetHeight)) sync()
|
|
75
|
+
else queue()
|
|
76
|
+
})
|
|
72
77
|
observer = new window.MutationObserver(records => {
|
|
73
78
|
const selector = '[data-composer-card], [data-prts-composer-fallback]'
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
79
|
+
const containsComposer = node => node.nodeType === 1
|
|
80
|
+
&& (node.matches(selector) || node.querySelector(selector))
|
|
81
|
+
const mounting = records.some(record =>
|
|
82
|
+
(record.type === 'attributes' && record.target.matches(selector) && !surfaces.has(record.target))
|
|
83
|
+
|| [...record.addedNodes].some(containsComposer))
|
|
84
|
+
if (mounting) sync()
|
|
85
|
+
else if (records.some(record => record.type === 'attributes'
|
|
86
|
+
|| [...record.removedNodes].some(containsComposer))) queue()
|
|
77
87
|
})
|
|
78
88
|
observer.observe(document.body, {childList:true, subtree:true, attributes:true, attributeFilter:['data-composer-card','data-prts-composer-fallback']})
|
|
79
89
|
}
|
package/src/client/index.js
CHANGED
|
@@ -440,12 +440,17 @@ export function apply(ctx) {
|
|
|
440
440
|
defineStore,
|
|
441
441
|
mountComposerGlassSurface(container, props) {
|
|
442
442
|
const { createRoot } = require('react-dom/client')
|
|
443
|
+
const materialStyle = { backdropFilter: 'blur(5px) saturate(1)', WebkitBackdropFilter: 'blur(5px) saturate(1)' }
|
|
444
|
+
const placeholder = document.createElement('div')
|
|
445
|
+
placeholder.className = 'glass-surface glass-surface--fallback'
|
|
446
|
+
Object.assign(placeholder.style, { width: '100%', height: '100%', ...materialStyle })
|
|
447
|
+
container.append(placeholder)
|
|
443
448
|
const root = createRoot(container)
|
|
444
449
|
const update = props => root.render(React.createElement(PrtsGlassSurface.default, {
|
|
445
450
|
width: '100%', height: '100%',
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
opacity: 1, backgroundOpacity: 0.5,
|
|
451
|
+
refraction: false,
|
|
452
|
+
style: materialStyle,
|
|
453
|
+
opacity: 1, backgroundOpacity: 0.5,
|
|
449
454
|
...props,
|
|
450
455
|
}))
|
|
451
456
|
update(props)
|
|
@@ -19,6 +19,8 @@ const OWNED_ATTRIBUTES = [
|
|
|
19
19
|
'data-prts-session-menu-anchor',
|
|
20
20
|
'data-prts-session-menu',
|
|
21
21
|
'data-prts-session-time',
|
|
22
|
+
'data-prts-session-resting',
|
|
23
|
+
'data-prts-session-pin',
|
|
22
24
|
'data-prts-session-index',
|
|
23
25
|
'data-prts-session-state',
|
|
24
26
|
'data-prts-selection-target',
|
|
@@ -106,15 +108,16 @@ function markSidebarNode(node, attribute, next) {
|
|
|
106
108
|
}
|
|
107
109
|
|
|
108
110
|
function resolveRowControls(row, kind) {
|
|
109
|
-
const menu = row.querySelector(':scope > span >
|
|
110
|
-
|
|
111
|
+
const menu = row.querySelector(':scope > span > button[type="button"]:is([data-context-menu-trigger], [aria-haspopup="menu"])')
|
|
112
|
+
?? row.querySelector(':scope > span > span > button[type="button"]')
|
|
113
|
+
const anchor = menu?.parentElement?.parentElement === row ? menu : menu?.parentElement
|
|
111
114
|
// Ungrouped workspaces have a create button but no management menu.
|
|
112
115
|
const actions = anchor?.parentElement ?? (kind === 'workspace'
|
|
113
116
|
? Array.from(row.children).find(node => node.matches('span') && node.querySelector(':scope > button[type="button"]'))
|
|
114
117
|
: undefined)
|
|
115
118
|
if (actions?.parentElement !== row) return {}
|
|
116
119
|
const create = kind === 'workspace'
|
|
117
|
-
? actions.
|
|
120
|
+
? Array.from(actions.children).find(child => child !== anchor && child.matches('button[type="button"]'))
|
|
118
121
|
: undefined
|
|
119
122
|
const quickActions = kind === 'session'
|
|
120
123
|
? Array.from(actions.children).filter(child => child !== anchor && child.querySelector('button'))
|
|
@@ -122,6 +125,11 @@ function resolveRowControls(row, kind) {
|
|
|
122
125
|
return { actions, anchor, create, menu, quickActions }
|
|
123
126
|
}
|
|
124
127
|
|
|
128
|
+
function isRowMenuOpen(row, menu) {
|
|
129
|
+
return menu?.getAttribute('aria-expanded') === 'true'
|
|
130
|
+
|| Array.from(row.classList).some(token => token === 'menuOpen' || token.endsWith('_menuOpen'))
|
|
131
|
+
}
|
|
132
|
+
|
|
125
133
|
function resolveRowTitle(row, kind, actions) {
|
|
126
134
|
const candidates = Array.from(row.querySelectorAll(':scope > span')).filter(node => (
|
|
127
135
|
node !== actions
|
|
@@ -158,10 +166,11 @@ function resolveWorkspaceDisclosure(row, title, actions, icon) {
|
|
|
158
166
|
))
|
|
159
167
|
}
|
|
160
168
|
|
|
161
|
-
function resolveSessionTime(row, title, actions) {
|
|
169
|
+
function resolveSessionTime(row, title, actions, pin) {
|
|
162
170
|
const candidates = Array.from(row.querySelectorAll(':scope > span')).filter(node => (
|
|
163
171
|
node !== title
|
|
164
172
|
&& node !== actions
|
|
173
|
+
&& node !== pin
|
|
165
174
|
&& !node.hasAttribute('data-prts-facility-face')
|
|
166
175
|
&& !node.hasAttribute('data-prts-row-projection')
|
|
167
176
|
&& !node.querySelector('button')
|
|
@@ -171,6 +180,18 @@ function resolveSessionTime(row, title, actions) {
|
|
|
171
180
|
?? candidates.filter(node => node.getAttribute('aria-hidden') !== 'true' && !node.querySelector('[data-state]')).at(-1)
|
|
172
181
|
}
|
|
173
182
|
|
|
183
|
+
function resolveSessionTrailing(row, title, actions) {
|
|
184
|
+
const pin = row.querySelector('[class*="_pinIndicator"], [aria-label="Pinned"]')
|
|
185
|
+
const resting = Array.from(row.children).find(node => node !== title && node !== actions && node !== pin && (
|
|
186
|
+
(pin && node.contains(pin))
|
|
187
|
+
|| Array.from(node.classList).some(token => token === 'rowResting' || token.endsWith('_rowResting'))
|
|
188
|
+
))
|
|
189
|
+
const time = resting
|
|
190
|
+
? resting.querySelector('time, [data-session-time], [class*="_timestamp"], [class*="_time"]')
|
|
191
|
+
: resolveSessionTime(row, title, actions, pin)
|
|
192
|
+
return { pin, resting, time }
|
|
193
|
+
}
|
|
194
|
+
|
|
174
195
|
function ensureFacilityFace(document, row, kind, next) {
|
|
175
196
|
let face = row.querySelector(':scope > [data-prts-facility-face]')
|
|
176
197
|
if (!face) {
|
|
@@ -916,8 +937,7 @@ export function createSidebarControlAdapter({ document, window, sessions, worksp
|
|
|
916
937
|
const icon = resolveWorkspaceIcon(row, title, controls.actions)
|
|
917
938
|
markSidebarNode(icon, 'data-prts-workspace-icon', next)
|
|
918
939
|
markSidebarNode(resolveWorkspaceDisclosure(row, title, controls.actions, icon), 'data-prts-workspace-disclosure', next)
|
|
919
|
-
row.toggleAttribute('data-prts-row-menu-open', controls.menu
|
|
920
|
-
|| row.classList.contains('menuOpen'))
|
|
940
|
+
row.toggleAttribute('data-prts-row-menu-open', isRowMenuOpen(row, controls.menu))
|
|
921
941
|
markSidebarNode(controls.actions, 'data-prts-workspace-actions', next)
|
|
922
942
|
markSidebarNode(controls.anchor, 'data-prts-workspace-menu-anchor', next)
|
|
923
943
|
markSidebarNode(controls.menu, 'data-prts-workspace-menu', next)
|
|
@@ -963,10 +983,12 @@ export function createSidebarControlAdapter({ document, window, sessions, worksp
|
|
|
963
983
|
setSidebarAttribute(row, 'data-prts-session-index', sessionIndex)
|
|
964
984
|
const title = resolveRowTitle(row, 'session', controls.actions)
|
|
965
985
|
markSidebarNode(title, 'data-prts-row-title', next)
|
|
966
|
-
|
|
986
|
+
const trailing = resolveSessionTrailing(row, title, controls.actions)
|
|
987
|
+
markSidebarNode(trailing.time, 'data-prts-session-time', next)
|
|
988
|
+
markSidebarNode(trailing.resting, 'data-prts-session-resting', next)
|
|
989
|
+
markSidebarNode(trailing.pin, 'data-prts-session-pin', next)
|
|
967
990
|
if (title) setSidebarAttribute(title, 'data-prts-session-index', sessionIndex)
|
|
968
|
-
row.toggleAttribute('data-prts-row-menu-open', controls.menu
|
|
969
|
-
|| row.classList.contains('menuOpen'))
|
|
991
|
+
row.toggleAttribute('data-prts-row-menu-open', isRowMenuOpen(row, controls.menu))
|
|
970
992
|
markSidebarNode(controls.actions, 'data-prts-session-actions', next)
|
|
971
993
|
for (const action of controls.quickActions ?? []) markSidebarNode(action, 'data-prts-session-quick-actions', next)
|
|
972
994
|
markSidebarNode(controls.anchor, 'data-prts-session-menu-anchor', next)
|
|
@@ -3,8 +3,8 @@ html[data-dsh-prts] { --prts-background-wash: color-mix(in srgb, var(--prts-canv
|
|
|
3
3
|
html[data-dsh-prts][data-prts-background-mode="full"][data-prts-background-full] :is([data-prts-region="frame"], [data-prts-nav-rail]) {
|
|
4
4
|
background: linear-gradient(var(--prts-background-wash), var(--prts-background-wash)), var(--prts-background-full) var(--prts-protected-full-x, 50%) var(--prts-protected-full-y, 50%) / cover fixed;
|
|
5
5
|
}
|
|
6
|
-
html[data-dsh-prts][data-prts-background-mode="full"][data-prts-background-full] :is([data-prts-region="sessions"], [data-prts-region="operation"]) { background: transparent; }
|
|
7
|
-
html[data-dsh-prts][data-prts-background-mode="split"][data-prts-background-sidebar] {
|
|
6
|
+
html[data-dsh-prts][data-dsh-prts][data-prts-background-mode="full"][data-prts-background-full] :is([data-prts-region="sessions"], [data-prts-region="operation"]) { background: transparent; }
|
|
7
|
+
html[data-dsh-prts][data-dsh-prts][data-prts-background-mode="split"][data-prts-background-sidebar] {
|
|
8
8
|
& :is([data-prts-region="sessions"],[data-prts-nav-rail]) {
|
|
9
9
|
--prts-wall-width:var(--prts-protected-sidebar-width,max(calc(var(--prts-sidebar-width,280px) + var(--prts-nav-width)),calc((100dvh - var(--prts-host-top-inset)) * var(--prts-sidebar-image-ratio,1))));
|
|
10
10
|
--prts-wall-x:var(--prts-protected-sidebar-x,calc((var(--prts-sidebar-width,280px) + var(--prts-nav-width) - var(--prts-wall-width)) / 2));
|
package/src/styles/prts.css
CHANGED
|
@@ -996,6 +996,10 @@ html[data-dsh-prts] [data-prts-session-actions] {
|
|
|
996
996
|
transform: translate3d(var(--prts-row-shift), 0, 0);
|
|
997
997
|
}
|
|
998
998
|
|
|
999
|
+
html[data-dsh-prts] :is([data-prts-workspace-row], [data-prts-session-row]):is(:hover, :focus-within, [data-prts-row-menu-open]) :is([data-prts-workspace-actions], [data-prts-session-actions]) {
|
|
1000
|
+
display: inline-flex;
|
|
1001
|
+
}
|
|
1002
|
+
|
|
999
1003
|
html[data-dsh-prts] [data-prts-workspace-actions] {
|
|
1000
1004
|
width: 57px;
|
|
1001
1005
|
}
|
|
@@ -1023,6 +1027,7 @@ html[data-dsh-prts] [data-prts-session-actions] button {
|
|
|
1023
1027
|
min-width: 28px !important;
|
|
1024
1028
|
height: var(--prts-facility-height) !important;
|
|
1025
1029
|
min-height: var(--prts-facility-height) !important;
|
|
1030
|
+
margin: 0 !important;
|
|
1026
1031
|
display: grid !important;
|
|
1027
1032
|
place-items: center;
|
|
1028
1033
|
padding: 0 !important;
|
|
@@ -1046,11 +1051,11 @@ html[data-dsh-prts] [data-prts-session-actions] button:is(:hover, :focus-visible
|
|
|
1046
1051
|
animation: prts-facility-button-dock 520ms both;
|
|
1047
1052
|
}
|
|
1048
1053
|
|
|
1049
|
-
html[data-dsh-prts] [data-prts-workspace-row]:is(:hover, :focus-within, [data-prts-row-menu-open]) [data-prts-workspace-
|
|
1054
|
+
html[data-dsh-prts] [data-prts-workspace-row]:is(:hover, :focus-within, [data-prts-row-menu-open]) [data-prts-workspace-menu] {
|
|
1050
1055
|
animation-delay: 55ms;
|
|
1051
1056
|
}
|
|
1052
1057
|
|
|
1053
|
-
html[data-dsh-prts] [data-prts-workspace-row]:is(:hover, :focus-within, [data-prts-row-menu-open]) [data-prts-workspace-
|
|
1058
|
+
html[data-dsh-prts] [data-prts-workspace-row]:is(:hover, :focus-within, [data-prts-row-menu-open]) [data-prts-workspace-create] {
|
|
1054
1059
|
animation-delay: 125ms;
|
|
1055
1060
|
}
|
|
1056
1061
|
}
|
|
@@ -136,7 +136,12 @@ html[data-dsh-prts] [data-prts-session-actions] button:is(:hover, :focus-visible
|
|
|
136
136
|
background: var(--prts-yellow) !important;
|
|
137
137
|
}
|
|
138
138
|
|
|
139
|
-
html[data-dsh-prts] [data-prts-session-
|
|
139
|
+
html[data-dsh-prts] [data-prts-session-row] > [data-prts-row-title]:last-child {
|
|
140
|
+
margin-right: var(--prts-row-end-reserve);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
html[data-dsh-prts] [data-prts-session-time],
|
|
144
|
+
html[data-dsh-prts] [data-prts-session-resting] {
|
|
140
145
|
position: relative;
|
|
141
146
|
z-index: 3;
|
|
142
147
|
flex: 0 0 auto;
|
|
@@ -146,15 +151,77 @@ html[data-dsh-prts] [data-prts-session-time] {
|
|
|
146
151
|
transition: opacity 120ms ease, transform 220ms var(--prts-ease-spring);
|
|
147
152
|
}
|
|
148
153
|
|
|
149
|
-
|
|
150
|
-
|
|
154
|
+
html[data-dsh-prts] [data-prts-session-resting] {
|
|
155
|
+
align-items: center;
|
|
156
|
+
gap: 8px;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
html[data-dsh-prts] [data-prts-session-resting]:has([data-prts-session-pin]) {
|
|
160
|
+
display: inline-flex !important;
|
|
161
|
+
flex-shrink: 1;
|
|
162
|
+
min-width: 0;
|
|
163
|
+
margin-right: calc(var(--prts-row-end-reserve) + 6px);
|
|
164
|
+
padding-left: 0;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
html[data-dsh-prts] [data-prts-session-row]:has([data-prts-session-pin]) [data-prts-row-title] {
|
|
168
|
+
padding-left: clamp(0px, calc(50% - 60px), 13px);
|
|
169
|
+
padding-right: clamp(0px, calc(50% - 60px), 10px);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
html[data-dsh-prts] [data-prts-session-row]:has([data-prts-session-pin]) [data-prts-session-time] {
|
|
173
|
+
flex-shrink: 1;
|
|
174
|
+
min-width: 0;
|
|
175
|
+
overflow: hidden;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
html[data-dsh-prts] [data-prts-session-resting] [data-prts-session-time] {
|
|
179
|
+
margin: 0;
|
|
180
|
+
padding: 0;
|
|
181
|
+
transform: none;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
html[data-dsh-prts] [data-prts-session-pin] {
|
|
185
|
+
display: inline-flex !important;
|
|
186
|
+
flex: 0 0 16px;
|
|
187
|
+
width: 16px;
|
|
188
|
+
margin-left: 0;
|
|
189
|
+
align-items: center;
|
|
190
|
+
justify-content: center;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
html[data-dsh-prts] [data-prts-session-row] > [data-prts-session-pin] {
|
|
151
194
|
margin-right: calc(var(--prts-row-end-reserve) + 6px);
|
|
152
195
|
}
|
|
153
196
|
|
|
154
|
-
html[data-dsh-prts] [data-prts-session-row]:has(>
|
|
197
|
+
html[data-dsh-prts] [data-prts-session-row]:has(> [data-prts-session-pin]) [data-prts-session-time] {
|
|
155
198
|
margin-right: 8px;
|
|
156
199
|
}
|
|
157
200
|
|
|
201
|
+
html[data-dsh-prts] [data-prts-session-row]:is(:hover, :focus-within, [data-prts-row-menu-open]) [data-prts-session-resting] {
|
|
202
|
+
margin-right: 8px;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
html[data-dsh-prts] [data-prts-session-row]:is(:hover, :focus-within, [data-prts-row-menu-open]) > [data-prts-session-pin] {
|
|
206
|
+
margin-right: 6px;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
html[data-dsh-prts] [data-prts-session-row]:is(:hover, :focus-within, [data-prts-row-menu-open], [data-prts-selection-target="true"], [aria-selected="true"]:not([data-prts-selection-target="false"])):has([data-prts-session-pin]) [data-prts-session-time],
|
|
210
|
+
html[data-dsh-prts] [data-prts-session-row]:is(:hover, :focus-within, [data-prts-row-menu-open]) [data-prts-session-resting]:not(:has([data-prts-session-pin])) {
|
|
211
|
+
display: none !important;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
@media (hover: none) {
|
|
215
|
+
html[data-dsh-prts] [data-prts-session-resting],
|
|
216
|
+
html[data-dsh-prts] [data-prts-session-resting]:has([data-prts-session-pin]) {
|
|
217
|
+
margin-right: 8px;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
html[data-dsh-prts] [data-prts-session-row] > [data-prts-session-pin] {
|
|
221
|
+
margin-right: 6px;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
158
225
|
html[data-dsh-prts] [data-prts-session-row]:hover [data-prts-session-time] {
|
|
159
226
|
opacity: 0;
|
|
160
227
|
}
|