openproject-primer_view_components 0.70.1 → 0.70.3
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/app/assets/javascripts/primer_view_components.js +1 -1
- data/app/assets/javascripts/primer_view_components.js.map +1 -1
- data/app/assets/styles/primer_view_components.css +1 -1
- data/app/assets/styles/primer_view_components.css.map +1 -1
- data/app/components/primer/alpha/tool_tip.js +28 -23
- data/app/components/primer/alpha/tool_tip.ts +30 -24
- data/app/components/primer/open_project/page_header.css +1 -1
- data/app/components/primer/open_project/page_header.css.map +1 -1
- data/app/components/primer/open_project/page_header.pcss +1 -0
- data/app/components/primer/open_project/page_header.rb +8 -3
- data/lib/primer/view_components/version.rb +1 -1
- data/previews/primer/open_project/page_header_preview.rb +10 -0
- data/static/info_arch.json +13 -0
- data/static/previews.json +13 -0
- metadata +2 -2
@@ -9,7 +9,7 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
|
|
9
9
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
10
10
|
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
11
11
|
};
|
12
|
-
var _ToolTipElement_instances, _ToolTipElement_abortController, _ToolTipElement_align, _ToolTipElement_side, _ToolTipElement_allowUpdatePosition, _ToolTipElement_showReason, _ToolTipElement_update, _ToolTipElement_updateControlReference, _ToolTipElement_updateDirection, _ToolTipElement_updatePosition;
|
12
|
+
var _ToolTipElement_instances, _ToolTipElement_abortController, _ToolTipElement_align, _ToolTipElement_side, _ToolTipElement_allowUpdatePosition, _ToolTipElement_showReason, _ToolTipElement_update, _ToolTipElement_updateControl, _ToolTipElement_updateControlReference, _ToolTipElement_updateDirection, _ToolTipElement_updatePosition;
|
13
13
|
import '@oddbird/popover-polyfill';
|
14
14
|
import { getAnchoredPosition } from '@primer/behaviors';
|
15
15
|
const isPopoverOpen = (() => {
|
@@ -233,26 +233,7 @@ class ToolTipElement extends HTMLElement {
|
|
233
233
|
}
|
234
234
|
__classPrivateFieldGet(this, _ToolTipElement_instances, "m", _ToolTipElement_update).call(this, false);
|
235
235
|
__classPrivateFieldSet(this, _ToolTipElement_allowUpdatePosition, true, "f");
|
236
|
-
|
237
|
-
return;
|
238
|
-
this.setAttribute('role', 'tooltip');
|
239
|
-
__classPrivateFieldGet(this, _ToolTipElement_abortController, "f")?.abort();
|
240
|
-
__classPrivateFieldSet(this, _ToolTipElement_abortController, new AbortController(), "f");
|
241
|
-
const { signal } = __classPrivateFieldGet(this, _ToolTipElement_abortController, "f");
|
242
|
-
this.addEventListener('mouseleave', this, { signal });
|
243
|
-
this.addEventListener('toggle', this, { signal });
|
244
|
-
this.control.addEventListener('mouseenter', this, { signal });
|
245
|
-
this.control.addEventListener('mouseleave', this, { signal });
|
246
|
-
this.control.addEventListener('focus', this, { signal });
|
247
|
-
this.control.addEventListener('mousedown', this, { signal });
|
248
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
249
|
-
// @ts-ignore popoverTargetElement is not in the type definition
|
250
|
-
this.control.popoverTargetElement?.addEventListener('beforetoggle', this, {
|
251
|
-
signal,
|
252
|
-
});
|
253
|
-
this.ownerDocument.addEventListener('focusout', focusOutListener);
|
254
|
-
this.ownerDocument.addEventListener('focusin', focusInListener);
|
255
|
-
this.ownerDocument.addEventListener('keydown', this, { signal, capture: true });
|
236
|
+
__classPrivateFieldGet(this, _ToolTipElement_instances, "m", _ToolTipElement_updateControl).call(this);
|
256
237
|
}
|
257
238
|
disconnectedCallback() {
|
258
239
|
tooltips.delete(this);
|
@@ -296,7 +277,10 @@ class ToolTipElement extends HTMLElement {
|
|
296
277
|
attributeChangedCallback(name) {
|
297
278
|
if (!this.isConnected)
|
298
279
|
return;
|
299
|
-
if (name === '
|
280
|
+
if (name === 'for') {
|
281
|
+
__classPrivateFieldGet(this, _ToolTipElement_instances, "m", _ToolTipElement_updateControl).call(this);
|
282
|
+
}
|
283
|
+
else if (name === 'id' || name === 'data-type') {
|
300
284
|
__classPrivateFieldGet(this, _ToolTipElement_instances, "m", _ToolTipElement_updateControlReference).call(this);
|
301
285
|
}
|
302
286
|
else if (name === 'data-direction') {
|
@@ -316,6 +300,27 @@ _ToolTipElement_abortController = new WeakMap(), _ToolTipElement_align = new Wea
|
|
316
300
|
this.classList.remove(...DIRECTION_CLASSES);
|
317
301
|
this.classList.add(TOOLTIP_SR_ONLY_CLASS);
|
318
302
|
}
|
303
|
+
}, _ToolTipElement_updateControl = function _ToolTipElement_updateControl() {
|
304
|
+
if (!this.control)
|
305
|
+
return;
|
306
|
+
this.setAttribute('role', 'tooltip');
|
307
|
+
__classPrivateFieldGet(this, _ToolTipElement_abortController, "f")?.abort();
|
308
|
+
__classPrivateFieldSet(this, _ToolTipElement_abortController, new AbortController(), "f");
|
309
|
+
const { signal } = __classPrivateFieldGet(this, _ToolTipElement_abortController, "f");
|
310
|
+
this.addEventListener('mouseleave', this, { signal });
|
311
|
+
this.addEventListener('toggle', this, { signal });
|
312
|
+
this.control.addEventListener('mouseenter', this, { signal });
|
313
|
+
this.control.addEventListener('mouseleave', this, { signal });
|
314
|
+
this.control.addEventListener('focus', this, { signal });
|
315
|
+
this.control.addEventListener('mousedown', this, { signal });
|
316
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
317
|
+
// @ts-ignore popoverTargetElement is not in the type definition
|
318
|
+
this.control.popoverTargetElement?.addEventListener('beforetoggle', this, {
|
319
|
+
signal,
|
320
|
+
});
|
321
|
+
this.ownerDocument.addEventListener('focusout', focusOutListener);
|
322
|
+
this.ownerDocument.addEventListener('focusin', focusInListener);
|
323
|
+
this.ownerDocument.addEventListener('keydown', this, { signal, capture: true });
|
319
324
|
}, _ToolTipElement_updateControlReference = function _ToolTipElement_updateControlReference() {
|
320
325
|
if (!this.id || !this.control)
|
321
326
|
return;
|
@@ -431,7 +436,7 @@ _ToolTipElement_abortController = new WeakMap(), _ToolTipElement_align = new Wea
|
|
431
436
|
}
|
432
437
|
this.classList.add(`tooltip-${direction}`);
|
433
438
|
};
|
434
|
-
ToolTipElement.observedAttributes = ['data-type', 'data-direction', 'id'];
|
439
|
+
ToolTipElement.observedAttributes = ['data-type', 'data-direction', 'id', 'for'];
|
435
440
|
if (!window.customElements.get('tool-tip')) {
|
436
441
|
window.ToolTipElement = ToolTipElement;
|
437
442
|
window.customElements.define('tool-tip', ToolTipElement);
|
@@ -234,28 +234,7 @@ class ToolTipElement extends HTMLElement {
|
|
234
234
|
this.#update(false)
|
235
235
|
this.#allowUpdatePosition = true
|
236
236
|
|
237
|
-
|
238
|
-
|
239
|
-
this.setAttribute('role', 'tooltip')
|
240
|
-
|
241
|
-
this.#abortController?.abort()
|
242
|
-
this.#abortController = new AbortController()
|
243
|
-
const {signal} = this.#abortController
|
244
|
-
|
245
|
-
this.addEventListener('mouseleave', this, {signal})
|
246
|
-
this.addEventListener('toggle', this, {signal})
|
247
|
-
this.control.addEventListener('mouseenter', this, {signal})
|
248
|
-
this.control.addEventListener('mouseleave', this, {signal})
|
249
|
-
this.control.addEventListener('focus', this, {signal})
|
250
|
-
this.control.addEventListener('mousedown', this, {signal})
|
251
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
252
|
-
// @ts-ignore popoverTargetElement is not in the type definition
|
253
|
-
this.control.popoverTargetElement?.addEventListener('beforetoggle', this, {
|
254
|
-
signal,
|
255
|
-
})
|
256
|
-
this.ownerDocument.addEventListener('focusout', focusOutListener)
|
257
|
-
this.ownerDocument.addEventListener('focusin', focusInListener)
|
258
|
-
this.ownerDocument.addEventListener('keydown', this, {signal, capture: true})
|
237
|
+
this.#updateControl()
|
259
238
|
}
|
260
239
|
|
261
240
|
disconnectedCallback() {
|
@@ -303,7 +282,7 @@ class ToolTipElement extends HTMLElement {
|
|
303
282
|
}
|
304
283
|
}
|
305
284
|
|
306
|
-
static observedAttributes = ['data-type', 'data-direction', 'id']
|
285
|
+
static observedAttributes = ['data-type', 'data-direction', 'id', 'for']
|
307
286
|
|
308
287
|
#update(isOpen: boolean) {
|
309
288
|
if (isOpen) {
|
@@ -321,13 +300,40 @@ class ToolTipElement extends HTMLElement {
|
|
321
300
|
attributeChangedCallback(name: string) {
|
322
301
|
if (!this.isConnected) return
|
323
302
|
|
324
|
-
if (name === '
|
303
|
+
if (name === 'for') {
|
304
|
+
this.#updateControl()
|
305
|
+
} else if (name === 'id' || name === 'data-type') {
|
325
306
|
this.#updateControlReference()
|
326
307
|
} else if (name === 'data-direction') {
|
327
308
|
this.#updateDirection()
|
328
309
|
}
|
329
310
|
}
|
330
311
|
|
312
|
+
#updateControl() {
|
313
|
+
if (!this.control) return
|
314
|
+
|
315
|
+
this.setAttribute('role', 'tooltip')
|
316
|
+
|
317
|
+
this.#abortController?.abort()
|
318
|
+
this.#abortController = new AbortController()
|
319
|
+
const {signal} = this.#abortController
|
320
|
+
|
321
|
+
this.addEventListener('mouseleave', this, {signal})
|
322
|
+
this.addEventListener('toggle', this, {signal})
|
323
|
+
this.control.addEventListener('mouseenter', this, {signal})
|
324
|
+
this.control.addEventListener('mouseleave', this, {signal})
|
325
|
+
this.control.addEventListener('focus', this, {signal})
|
326
|
+
this.control.addEventListener('mousedown', this, {signal})
|
327
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
328
|
+
// @ts-ignore popoverTargetElement is not in the type definition
|
329
|
+
this.control.popoverTargetElement?.addEventListener('beforetoggle', this, {
|
330
|
+
signal,
|
331
|
+
})
|
332
|
+
this.ownerDocument.addEventListener('focusout', focusOutListener)
|
333
|
+
this.ownerDocument.addEventListener('focusin', focusInListener)
|
334
|
+
this.ownerDocument.addEventListener('keydown', this, {signal, capture: true})
|
335
|
+
}
|
336
|
+
|
331
337
|
#updateControlReference() {
|
332
338
|
if (!this.id || !this.control) return
|
333
339
|
if (this.type === 'label') {
|
@@ -1 +1 @@
|
|
1
|
-
.PageHeader{border-bottom:var(--borderWidth-thin) solid var(--borderColor-muted);display:flex;flex-flow:column;margin-bottom:var(--stack-gap-normal);padding-bottom:var(--stack-padding-condensed)}.PageHeader--withTabNav{border-bottom:none;margin-bottom:0;padding-bottom:0}.PageHeader-contextBar,.PageHeader-titleBar{align-items:center;display:flex;flex-flow:row;justify-content:flex-end;margin-bottom:var(--base-size-8)}.PageHeader-title{flex:1 1 auto;font-size:var(--text-title-size-medium)}.PageHeader-title--large{font-size:var(--text-title-size-large)}.PageHeader-description{color:var(--fgColor-muted);flex:1 100%;font-size:var(--text-body-size-medium)}.PageHeader-tabNavBar{overflow:auto}.PageHeader-tabNavBar .PageHeader-tabNav{min-width:max-content}.PageHeader--withTabNav .PageHeader-description{margin-bottom:var(--base-size-16)}.PageHeader-actions{align-items:center;display:flex;justify-content:flex-end}.PageHeader-breadcrumbs{display:block;width:100%}.PageHeader-leadingAction{margin-right:var(--base-size-4);margin-top:2px}.PageHeader-parentLink{flex:1 1 auto}
|
1
|
+
.PageHeader{border-bottom:var(--borderWidth-thin) solid var(--borderColor-muted);display:flex;flex-flow:column;margin-bottom:var(--stack-gap-normal);padding-bottom:var(--stack-padding-condensed)}.PageHeader--withTabNav{border-bottom:none;margin-bottom:0;padding-bottom:0}.PageHeader-contextBar{height:var(--control-small-size)}.PageHeader-contextBar,.PageHeader-titleBar{align-items:center;display:flex;flex-flow:row;justify-content:flex-end;margin-bottom:var(--base-size-8)}.PageHeader-title{flex:1 1 auto;font-size:var(--text-title-size-medium)}.PageHeader-title--large{font-size:var(--text-title-size-large)}.PageHeader-description{color:var(--fgColor-muted);flex:1 100%;font-size:var(--text-body-size-medium)}.PageHeader-tabNavBar{overflow:auto}.PageHeader-tabNavBar .PageHeader-tabNav{min-width:max-content}.PageHeader--withTabNav .PageHeader-description{margin-bottom:var(--base-size-16)}.PageHeader-actions{align-items:center;display:flex;justify-content:flex-end}.PageHeader-breadcrumbs{display:block;width:100%}.PageHeader-leadingAction{margin-right:var(--base-size-4);margin-top:2px}.PageHeader-parentLink{flex:1 1 auto}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["page_header.pcss"],"names":[],"mappings":"AAEA,YAIE,oEAAqE,CAHrE,YAAa,CAIb,gBAAiB,CAFjB,qCAAsC,CADtC,6CAIF,CAEA,wBACE,kBAAmB,CAEnB,eAAgB,CADhB,gBAEF,
|
1
|
+
{"version":3,"sources":["page_header.pcss"],"names":[],"mappings":"AAEA,YAIE,oEAAqE,CAHrE,YAAa,CAIb,gBAAiB,CAFjB,qCAAsC,CADtC,6CAIF,CAEA,wBACE,kBAAmB,CAEnB,eAAgB,CADhB,gBAEF,CAEA,uBAME,gCACF,CAEA,4CALE,kBAAmB,CAHnB,YAAa,CACb,aAAc,CACd,wBAAyB,CAEzB,gCAUF,CAEA,kBAEE,aAAc,CADd,uCAEF,CAEA,yBACE,sCACF,CAGA,wBAEE,0BAA2B,CAC3B,WAAY,CAFZ,sCAGF,CAEA,sBACE,aACF,CAEA,yCACE,qBACF,CAEA,gDACE,iCACF,CAEA,oBAGE,kBAAmB,CADnB,YAAa,CADb,wBAGF,CAEA,wBACE,aAAc,CACd,UACF,CAEA,0BAEE,+BAAgC,CADhC,cAEF,CAEA,uBACE,aACF","file":"page_header.css","sourcesContent":["/* OP PageHeader */\n\n.PageHeader {\n display: flex;\n padding-bottom: var(--stack-padding-condensed);\n margin-bottom: var(--stack-gap-normal);\n border-bottom: var(--borderWidth-thin) solid var(--borderColor-muted);\n flex-flow: column;\n}\n\n.PageHeader--withTabNav {\n border-bottom: none;\n padding-bottom: 0;\n margin-bottom: 0;\n}\n\n.PageHeader-contextBar {\n display: flex;\n flex-flow: row;\n justify-content: flex-end;\n align-items: center;\n margin-bottom: var(--base-size-8);\n height: var(--control-small-size);\n}\n\n.PageHeader-titleBar {\n display: flex;\n flex-flow: row;\n justify-content: flex-end;\n align-items: center; /* Keep back button vertically aligned. */\n margin-bottom: var(--base-size-8);\n}\n\n.PageHeader-title {\n font-size: var(--text-title-size-medium);\n flex: 1 1 auto;\n}\n\n.PageHeader-title--large {\n font-size: var(--text-title-size-large);\n}\n\n/* One-liner of supporting text */\n.PageHeader-description {\n font-size: var(--text-body-size-medium);\n color: var(--fgColor-muted);\n flex: 1 100%;\n}\n\n.PageHeader-tabNavBar {\n overflow: auto;\n}\n\n.PageHeader-tabNavBar .PageHeader-tabNav {\n min-width: max-content;\n}\n\n.PageHeader--withTabNav .PageHeader-description {\n margin-bottom: var(--base-size-16);\n}\n\n.PageHeader-actions {\n justify-content: flex-end;\n display: flex;\n align-items: center;\n}\n\n.PageHeader-breadcrumbs {\n display: block;\n width: 100%;\n}\n\n.PageHeader-leadingAction {\n margin-top: 2px; /* to center align with label */\n margin-right: var(--base-size-4);\n}\n\n.PageHeader-parentLink {\n flex: 1 1 auto;\n}\n"]}
|
@@ -186,11 +186,16 @@ module Primer
|
|
186
186
|
system_arguments[:classes] = class_names(system_arguments[:classes], "PageHeader-breadcrumbs")
|
187
187
|
system_arguments[:display] ||= DEFAULT_BREADCRUMBS_DISPLAY
|
188
188
|
|
189
|
+
parent_item = nil
|
190
|
+
|
189
191
|
# show parent link if there is a parent for current page
|
190
|
-
|
191
|
-
|
192
|
-
|
192
|
+
items.reverse_each do |item|
|
193
|
+
parent_item = item if item.is_a?(Hash) && item[:skip_for_mobile] != true
|
194
|
+
break if parent_item.present?
|
195
|
+
end
|
193
196
|
|
197
|
+
if parent_item.present? && parent_item[:href].present?
|
198
|
+
link_arguments = {}
|
194
199
|
link_arguments[:icon] = fetch_or_fallback(BACK_BUTTON_ICON_OPTIONS, DEFAULT_BACK_BUTTON_ICON)
|
195
200
|
link_arguments[:href] = parent_item[:href]
|
196
201
|
link_arguments[:target] = "_top"
|
@@ -256,6 +256,16 @@ module Primer
|
|
256
256
|
end
|
257
257
|
end
|
258
258
|
end
|
259
|
+
|
260
|
+
# @label With skipable breadcrumb items
|
261
|
+
def skip_breadcrumb_item
|
262
|
+
render(Primer::OpenProject::PageHeader.new) do |component|
|
263
|
+
component.with_title { "Resize me to mobile screen size" }
|
264
|
+
component.with_breadcrumbs([{ href: "/foo", text: "Foo" },
|
265
|
+
{ href: "/bar", text: "Bar", skip_for_mobile: true },
|
266
|
+
"Baz"])
|
267
|
+
end
|
268
|
+
end
|
259
269
|
end
|
260
270
|
end
|
261
271
|
end
|
data/static/info_arch.json
CHANGED
@@ -19122,6 +19122,19 @@
|
|
19122
19122
|
"color-contrast"
|
19123
19123
|
]
|
19124
19124
|
}
|
19125
|
+
},
|
19126
|
+
{
|
19127
|
+
"preview_path": "primer/open_project/page_header/skip_breadcrumb_item",
|
19128
|
+
"name": "skip_breadcrumb_item",
|
19129
|
+
"snapshot": "false",
|
19130
|
+
"skip_rules": {
|
19131
|
+
"wont_fix": [
|
19132
|
+
"region"
|
19133
|
+
],
|
19134
|
+
"will_fix": [
|
19135
|
+
"color-contrast"
|
19136
|
+
]
|
19137
|
+
}
|
19125
19138
|
}
|
19126
19139
|
],
|
19127
19140
|
"subcomponents": []
|
data/static/previews.json
CHANGED
@@ -6109,6 +6109,19 @@
|
|
6109
6109
|
"color-contrast"
|
6110
6110
|
]
|
6111
6111
|
}
|
6112
|
+
},
|
6113
|
+
{
|
6114
|
+
"preview_path": "primer/open_project/page_header/skip_breadcrumb_item",
|
6115
|
+
"name": "skip_breadcrumb_item",
|
6116
|
+
"snapshot": "false",
|
6117
|
+
"skip_rules": {
|
6118
|
+
"wont_fix": [
|
6119
|
+
"region"
|
6120
|
+
],
|
6121
|
+
"will_fix": [
|
6122
|
+
"color-contrast"
|
6123
|
+
]
|
6124
|
+
}
|
6112
6125
|
}
|
6113
6126
|
]
|
6114
6127
|
},
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: openproject-primer_view_components
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.70.
|
4
|
+
version: 0.70.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GitHub Open Source
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2025-
|
12
|
+
date: 2025-07-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: actionview
|