openproject-primer_view_components 0.89.0 → 0.89.2
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 +22 -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/action_bar.css +1 -1
- data/app/components/primer/alpha/action_bar.css.map +1 -1
- data/app/components/primer/alpha/action_list.css +1 -1
- data/app/components/primer/alpha/action_list.css.json +4 -10
- data/app/components/primer/alpha/action_list.css.map +1 -1
- data/app/components/primer/alpha/auto_complete.css +1 -1
- data/app/components/primer/alpha/auto_complete.css.map +1 -1
- data/app/components/primer/alpha/banner.css +1 -1
- data/app/components/primer/alpha/banner.css.map +1 -1
- data/app/components/primer/alpha/button_marketing.css +1 -1
- data/app/components/primer/alpha/button_marketing.css.map +1 -1
- data/app/components/primer/alpha/dialog.css +1 -1
- data/app/components/primer/alpha/dialog.css.json +2 -1
- data/app/components/primer/alpha/dialog.css.map +1 -1
- data/app/components/primer/alpha/dialog.pcss +4 -1
- data/app/components/primer/alpha/dropdown.css +1 -1
- data/app/components/primer/alpha/dropdown.css.map +1 -1
- data/app/components/primer/alpha/layout.css +1 -1
- data/app/components/primer/alpha/layout.css.json +10 -14
- data/app/components/primer/alpha/layout.css.map +1 -1
- data/app/components/primer/alpha/menu.css +1 -1
- data/app/components/primer/alpha/menu.css.map +1 -1
- data/app/components/primer/alpha/overlay.css +1 -1
- data/app/components/primer/alpha/overlay.css.map +1 -1
- data/app/components/primer/alpha/segmented_control.css +1 -1
- data/app/components/primer/alpha/segmented_control.css.json +1 -2
- data/app/components/primer/alpha/segmented_control.css.map +1 -1
- data/app/components/primer/alpha/select_panel.css +1 -1
- data/app/components/primer/alpha/select_panel.css.map +1 -1
- data/app/components/primer/alpha/select_panel_element.ts +1 -1
- data/app/components/primer/alpha/skeleton_box.css +1 -1
- data/app/components/primer/alpha/skeleton_box.css.map +1 -1
- data/app/components/primer/alpha/stack.css +1 -1
- data/app/components/primer/alpha/stack.css.map +1 -1
- data/app/components/primer/alpha/tab_nav.css +1 -1
- data/app/components/primer/alpha/tab_nav.css.map +1 -1
- data/app/components/primer/alpha/text_field.css +1 -1
- data/app/components/primer/alpha/text_field.css.json +1 -2
- data/app/components/primer/alpha/text_field.css.map +1 -1
- data/app/components/primer/alpha/toggle_switch.css +1 -1
- data/app/components/primer/alpha/toggle_switch.css.map +1 -1
- data/app/components/primer/alpha/tree_view/sub_tree_node.rb +1 -1
- data/app/components/primer/alpha/tree_view/tree_view_icon_pair_element.js +1 -1
- data/app/components/primer/alpha/tree_view/tree_view_icon_pair_element.ts +1 -1
- data/app/components/primer/alpha/tree_view/visual.rb +1 -1
- data/app/components/primer/alpha/tree_view.css +1 -1
- data/app/components/primer/alpha/tree_view.css.json +2 -2
- data/app/components/primer/alpha/tree_view.css.map +1 -1
- data/app/components/primer/alpha/underline_nav.css +1 -1
- data/app/components/primer/alpha/underline_nav.css.map +1 -1
- data/app/components/primer/beta/avatar.css +1 -1
- data/app/components/primer/beta/avatar.css.map +1 -1
- data/app/components/primer/beta/avatar_stack.css +1 -1
- data/app/components/primer/beta/avatar_stack.css.map +1 -1
- data/app/components/primer/beta/blankslate.css +1 -1
- data/app/components/primer/beta/blankslate.css.map +1 -1
- data/app/components/primer/beta/border_box.css +1 -1
- data/app/components/primer/beta/border_box.css.map +1 -1
- data/app/components/primer/beta/border_box.rb +18 -7
- data/app/components/primer/beta/breadcrumbs.css +1 -1
- data/app/components/primer/beta/breadcrumbs.css.map +1 -1
- data/app/components/primer/beta/button.css +1 -1
- data/app/components/primer/beta/button.css.map +1 -1
- data/app/components/primer/beta/button_group.css +1 -1
- data/app/components/primer/beta/button_group.css.map +1 -1
- data/app/components/primer/beta/button_group.rb +1 -1
- data/app/components/primer/beta/counter.css +1 -1
- data/app/components/primer/beta/counter.css.map +1 -1
- data/app/components/primer/beta/flash.css +1 -1
- data/app/components/primer/beta/flash.css.map +1 -1
- data/app/components/primer/beta/label.css +1 -1
- data/app/components/primer/beta/label.css.map +1 -1
- data/app/components/primer/beta/link.css +1 -1
- data/app/components/primer/beta/link.css.map +1 -1
- data/app/components/primer/beta/popover.css +1 -1
- data/app/components/primer/beta/popover.css.map +1 -1
- data/app/components/primer/beta/progress_bar.css +1 -1
- data/app/components/primer/beta/progress_bar.css.map +1 -1
- data/app/components/primer/beta/state.css +1 -1
- data/app/components/primer/beta/state.css.map +1 -1
- data/app/components/primer/beta/subhead.css +1 -1
- data/app/components/primer/beta/subhead.css.map +1 -1
- data/app/components/primer/beta/timeline_item.css +1 -1
- data/app/components/primer/beta/timeline_item.css.map +1 -1
- data/app/components/primer/beta/truncate.css +1 -1
- data/app/components/primer/beta/truncate.css.map +1 -1
- data/app/components/primer/dialog_helper.js +10 -1
- data/app/components/primer/dialog_helper.ts +16 -1
- data/app/components/primer/open_project/border_box/collapsible_header.css +1 -1
- data/app/components/primer/open_project/border_box/collapsible_header.css.json +1 -3
- data/app/components/primer/open_project/border_box/collapsible_header.css.map +1 -1
- data/app/components/primer/open_project/border_grid.css +1 -1
- data/app/components/primer/open_project/border_grid.css.map +1 -1
- data/app/components/primer/open_project/drag_handle.css +1 -1
- data/app/components/primer/open_project/drag_handle.css.map +1 -1
- data/app/components/primer/open_project/filterable_tree_view.css +1 -1
- data/app/components/primer/open_project/filterable_tree_view.css.map +1 -1
- data/app/components/primer/open_project/filterable_tree_view.html.erb +9 -5
- data/app/components/primer/open_project/filterable_tree_view.js +28 -2
- data/app/components/primer/open_project/filterable_tree_view.rb +9 -1
- data/app/components/primer/open_project/filterable_tree_view.ts +27 -1
- data/app/components/primer/open_project/inline_message.css +1 -1
- data/app/components/primer/open_project/inline_message.css.map +1 -1
- data/app/components/primer/open_project/page_header/dialog.rb +1 -1
- data/app/components/primer/open_project/page_header/menu.rb +1 -1
- 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/pagination.css +1 -1
- data/app/components/primer/open_project/pagination.css.map +1 -1
- data/app/components/primer/open_project/side_panel/section.css +1 -1
- data/app/components/primer/open_project/side_panel/section.css.map +1 -1
- data/app/components/primer/open_project/sub_header.css +1 -1
- data/app/components/primer/open_project/sub_header.css.map +1 -1
- data/app/lib/primer/forms/acts_as_component.rb +1 -1
- data/app/lib/primer/forms/toggle_switch_form.rb +1 -1
- data/lib/primer/form_components.rb +1 -1
- data/lib/primer/view_components/version.rb +1 -1
- data/previews/primer/alpha/segmented_control_preview.rb +0 -4
- data/previews/primer/beta/border_box_preview.rb +3 -3
- data/previews/primer/open_project/filterable_tree_view_preview/async_custom_loading_indicator.html.erb +9 -0
- data/previews/primer/open_project/filterable_tree_view_preview/default.html.erb +1 -1
- data/previews/primer/open_project/filterable_tree_view_preview.rb +8 -1
- data/static/arguments.json +19 -1
- data/static/info_arch.json +72 -9
- data/static/previews.json +55 -16
- metadata +2 -46
- data/app/assets/javascripts/components/primer/alpha/action_bar_element.d.ts +0 -17
- data/app/assets/javascripts/components/primer/alpha/action_list.d.ts +0 -16
- data/app/assets/javascripts/components/primer/alpha/action_menu/action_menu_element.d.ts +0 -49
- data/app/assets/javascripts/components/primer/alpha/action_menu/action_menu_focus_zone_stack.d.ts +0 -17
- data/app/assets/javascripts/components/primer/alpha/dropdown/menu.d.ts +0 -1
- data/app/assets/javascripts/components/primer/alpha/dropdown.d.ts +0 -1
- data/app/assets/javascripts/components/primer/alpha/modal_dialog.d.ts +0 -18
- data/app/assets/javascripts/components/primer/alpha/segmented_control.d.ts +0 -12
- data/app/assets/javascripts/components/primer/alpha/select_panel_element.d.ts +0 -65
- data/app/assets/javascripts/components/primer/alpha/tab_container.d.ts +0 -1
- data/app/assets/javascripts/components/primer/alpha/toggle_switch.d.ts +0 -34
- data/app/assets/javascripts/components/primer/alpha/tool_tip.d.ts +0 -27
- data/app/assets/javascripts/components/primer/alpha/tree_view/tree_view.d.ts +0 -47
- data/app/assets/javascripts/components/primer/alpha/tree_view/tree_view_icon_pair_element.d.ts +0 -15
- data/app/assets/javascripts/components/primer/alpha/tree_view/tree_view_include_fragment_element.d.ts +0 -9
- data/app/assets/javascripts/components/primer/alpha/tree_view/tree_view_roving_tab_index.d.ts +0 -3
- data/app/assets/javascripts/components/primer/alpha/tree_view/tree_view_sub_tree_node_element.d.ts +0 -47
- data/app/assets/javascripts/components/primer/alpha/x_banner.d.ts +0 -18
- data/app/assets/javascripts/components/primer/anchored_position.d.ts +0 -27
- data/app/assets/javascripts/components/primer/beta/auto_complete/auto_complete.d.ts +0 -1
- data/app/assets/javascripts/components/primer/beta/clipboard_copy.d.ts +0 -1
- data/app/assets/javascripts/components/primer/beta/details_toggle_element.d.ts +0 -40
- data/app/assets/javascripts/components/primer/beta/nav_list.d.ts +0 -20
- data/app/assets/javascripts/components/primer/beta/nav_list_group_element.d.ts +0 -19
- data/app/assets/javascripts/components/primer/beta/relative_time.d.ts +0 -1
- data/app/assets/javascripts/components/primer/dialog_helper.d.ts +0 -15
- data/app/assets/javascripts/components/primer/focus_group.d.ts +0 -19
- data/app/assets/javascripts/components/primer/open_project/avatar_fallback.d.ts +0 -28
- data/app/assets/javascripts/components/primer/open_project/border_box/collapsible_header.d.ts +0 -11
- data/app/assets/javascripts/components/primer/open_project/collapsible.d.ts +0 -13
- data/app/assets/javascripts/components/primer/open_project/collapsible_section.d.ts +0 -10
- data/app/assets/javascripts/components/primer/open_project/danger_dialog_form_helper.d.ts +0 -18
- data/app/assets/javascripts/components/primer/open_project/filterable_tree_view.d.ts +0 -29
- data/app/assets/javascripts/components/primer/open_project/page_header_element.d.ts +0 -9
- data/app/assets/javascripts/components/primer/open_project/sub_header_element.d.ts +0 -17
- data/app/assets/javascripts/components/primer/open_project/zen_mode_button.d.ts +0 -18
- data/app/assets/javascripts/components/primer/primer.d.ts +0 -42
- data/app/assets/javascripts/components/primer/scrollable_region.d.ts +0 -13
- data/app/assets/javascripts/components/primer/shared_events.d.ts +0 -26
- data/app/assets/javascripts/components/primer/utils.d.ts +0 -1
- data/app/assets/javascripts/lib/primer/forms/character_counter.d.ts +0 -41
- data/app/assets/javascripts/lib/primer/forms/primer_multi_input.d.ts +0 -10
- data/app/assets/javascripts/lib/primer/forms/primer_text_area.d.ts +0 -13
- data/app/assets/javascripts/lib/primer/forms/primer_text_field.d.ts +0 -30
- data/app/assets/javascripts/lib/primer/forms/toggle_switch_input.d.ts +0 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
.Truncate{display:inline-flex;
|
|
1
|
+
.Truncate{display:inline-flex;min-width:0;max-width:100%}.Truncate>.Truncate-text{min-width:1ch;max-width:fit-content;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:is(.Truncate>.Truncate-text)+.Truncate-text{margin-left:var(--control-small-gap)}.Truncate-text--primary:is(.Truncate>.Truncate-text){flex-basis:200%}.Truncate-text--expandable:is(.Truncate>.Truncate-text):active,.Truncate-text--expandable:is(.Truncate>.Truncate-text):focus,.Truncate-text--expandable:is(.Truncate>.Truncate-text):hover{max-width:100%!important;flex-shrink:0;cursor:pointer}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["truncate.pcss"],"names":[],"mappings":"AAEA,UACE,mBAAoB,
|
|
1
|
+
{"version":3,"sources":["truncate.pcss"],"names":[],"mappings":"AAEA,UACE,mBAAoB,CACpB,WAAY,CACZ,cA0BF,CAxBE,yBACE,aAAc,CACd,qBAAsB,CACtB,eAAgB,CAChB,sBAAuB,CACvB,kBAkBF,CAhBE,6CAEE,oCACF,CAEA,qDACE,eACF,CAEA,2LAGE,wBAA0B,CAC1B,aAAc,CACd,cACF","file":"truncate.css","sourcesContent":["/* Truncate */\n\n.Truncate {\n display: inline-flex;\n min-width: 0;\n max-width: 100%;\n\n & > .Truncate-text {\n min-width: 1ch;\n max-width: fit-content;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n & + .Truncate-text {\n /* stylelint-disable-next-line primer/spacing */\n margin-left: var(--control-small-gap);\n }\n\n &.Truncate-text--primary {\n flex-basis: 200%;\n }\n\n &.Truncate-text--expandable:hover,\n &.Truncate-text--expandable:focus,\n &.Truncate-text--expandable:active {\n max-width: 100% !important;\n flex-shrink: 0;\n cursor: pointer;\n }\n }\n}\n"]}
|
|
@@ -15,6 +15,10 @@ function setScrollGutter(doc) {
|
|
|
15
15
|
return;
|
|
16
16
|
doc.body.style.setProperty('--dialog-scrollgutter', `${window.innerWidth - doc.body.clientWidth}px`);
|
|
17
17
|
}
|
|
18
|
+
function updateBodyModalClasses(doc) {
|
|
19
|
+
doc.body.classList.toggle('has-modal', Boolean(doc.querySelector('dialog[open]')));
|
|
20
|
+
doc.body.classList.toggle('has-modal-disable-scroll', Boolean(doc.querySelector('dialog[open].Overlay--disableScroll')));
|
|
21
|
+
}
|
|
18
22
|
function dialogInvokerButtonHandler(event) {
|
|
19
23
|
const target = event.target;
|
|
20
24
|
const button = target?.closest('button');
|
|
@@ -75,6 +79,7 @@ function dialogInvokerButtonHandler(event) {
|
|
|
75
79
|
}
|
|
76
80
|
}, { once: true });
|
|
77
81
|
}
|
|
82
|
+
updateBodyModalClasses(dialog.ownerDocument);
|
|
78
83
|
}
|
|
79
84
|
}
|
|
80
85
|
dialogId = button.getAttribute('data-close-dialog-id') || button.getAttribute('data-submit-dialog-id');
|
|
@@ -82,6 +87,7 @@ function dialogInvokerButtonHandler(event) {
|
|
|
82
87
|
const dialog = document.getElementById(dialogId);
|
|
83
88
|
if (dialog instanceof HTMLDialogElement && dialog.open) {
|
|
84
89
|
dialog.close();
|
|
90
|
+
updateBodyModalClasses(dialog.ownerDocument);
|
|
85
91
|
}
|
|
86
92
|
}
|
|
87
93
|
}
|
|
@@ -98,6 +104,7 @@ export class DialogHelperElement extends HTMLElement {
|
|
|
98
104
|
const { signal } = (__classPrivateFieldSet(this, _DialogHelperElement_abortController, new AbortController(), "f"));
|
|
99
105
|
document.addEventListener('click', dialogInvokerButtonHandler, true);
|
|
100
106
|
document.addEventListener('click', this, { signal });
|
|
107
|
+
this.dialog?.addEventListener('close', () => updateBodyModalClasses(this.dialog.ownerDocument), { signal });
|
|
101
108
|
new MutationObserver(records => {
|
|
102
109
|
for (const record of records) {
|
|
103
110
|
if (record.target === this.dialog) {
|
|
@@ -132,14 +139,16 @@ export class DialogHelperElement extends HTMLElement {
|
|
|
132
139
|
_DialogHelperElement_abortController = new WeakMap(), _DialogHelperElement_instances = new WeakSet(), _DialogHelperElement_handleDialogOpenAttribute = function _DialogHelperElement_handleDialogOpenAttribute() {
|
|
133
140
|
if (!this.dialog)
|
|
134
141
|
return;
|
|
142
|
+
const { ownerDocument } = this.dialog;
|
|
135
143
|
// We don't want to show the Dialog component as non-modal
|
|
136
144
|
if (this.dialog.matches('[open]:not(:modal)')) {
|
|
137
145
|
// eslint-disable-next-line no-restricted-syntax
|
|
138
146
|
this.dialog.addEventListener('close', e => e.stopImmediatePropagation(), { once: true });
|
|
139
147
|
this.dialog.close();
|
|
140
|
-
setScrollGutter(
|
|
148
|
+
setScrollGutter(ownerDocument);
|
|
141
149
|
this.dialog.showModal();
|
|
142
150
|
}
|
|
151
|
+
updateBodyModalClasses(ownerDocument);
|
|
143
152
|
};
|
|
144
153
|
if (!window.customElements.get('dialog-helper')) {
|
|
145
154
|
window.DialogHelperElement = DialogHelperElement;
|
|
@@ -3,6 +3,14 @@ function setScrollGutter(doc: Document) {
|
|
|
3
3
|
doc.body.style.setProperty('--dialog-scrollgutter', `${window.innerWidth - doc.body.clientWidth}px`)
|
|
4
4
|
}
|
|
5
5
|
|
|
6
|
+
function updateBodyModalClasses(doc: Document) {
|
|
7
|
+
doc.body.classList.toggle('has-modal', Boolean(doc.querySelector('dialog[open]')))
|
|
8
|
+
doc.body.classList.toggle(
|
|
9
|
+
'has-modal-disable-scroll',
|
|
10
|
+
Boolean(doc.querySelector('dialog[open].Overlay--disableScroll')),
|
|
11
|
+
)
|
|
12
|
+
}
|
|
13
|
+
|
|
6
14
|
function dialogInvokerButtonHandler(event: Event) {
|
|
7
15
|
const target = event.target as HTMLElement
|
|
8
16
|
const button = target?.closest('button')
|
|
@@ -69,6 +77,8 @@ function dialogInvokerButtonHandler(event: Event) {
|
|
|
69
77
|
{once: true},
|
|
70
78
|
)
|
|
71
79
|
}
|
|
80
|
+
|
|
81
|
+
updateBodyModalClasses(dialog.ownerDocument)
|
|
72
82
|
}
|
|
73
83
|
}
|
|
74
84
|
|
|
@@ -77,6 +87,7 @@ function dialogInvokerButtonHandler(event: Event) {
|
|
|
77
87
|
const dialog = document.getElementById(dialogId)
|
|
78
88
|
if (dialog instanceof HTMLDialogElement && dialog.open) {
|
|
79
89
|
dialog.close()
|
|
90
|
+
updateBodyModalClasses(dialog.ownerDocument)
|
|
80
91
|
}
|
|
81
92
|
}
|
|
82
93
|
}
|
|
@@ -91,6 +102,7 @@ export class DialogHelperElement extends HTMLElement {
|
|
|
91
102
|
const {signal} = (this.#abortController = new AbortController())
|
|
92
103
|
document.addEventListener('click', dialogInvokerButtonHandler, true)
|
|
93
104
|
document.addEventListener('click', this, {signal})
|
|
105
|
+
this.dialog?.addEventListener('close', () => updateBodyModalClasses(this.dialog!.ownerDocument), {signal})
|
|
94
106
|
new MutationObserver(records => {
|
|
95
107
|
for (const record of records) {
|
|
96
108
|
if (record.target === this.dialog) {
|
|
@@ -107,14 +119,17 @@ export class DialogHelperElement extends HTMLElement {
|
|
|
107
119
|
|
|
108
120
|
#handleDialogOpenAttribute() {
|
|
109
121
|
if (!this.dialog) return
|
|
122
|
+
const {ownerDocument} = this.dialog
|
|
110
123
|
// We don't want to show the Dialog component as non-modal
|
|
111
124
|
if (this.dialog.matches('[open]:not(:modal)')) {
|
|
112
125
|
// eslint-disable-next-line no-restricted-syntax
|
|
113
126
|
this.dialog.addEventListener('close', e => e.stopImmediatePropagation(), {once: true})
|
|
114
127
|
this.dialog.close()
|
|
115
|
-
setScrollGutter(
|
|
128
|
+
setScrollGutter(ownerDocument)
|
|
116
129
|
this.dialog.showModal()
|
|
117
130
|
}
|
|
131
|
+
|
|
132
|
+
updateBodyModalClasses(ownerDocument)
|
|
118
133
|
}
|
|
119
134
|
|
|
120
135
|
handleEvent(event: MouseEvent) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.CollapsibleHeader{container-name:collapsible-header-container;container-type:inline-size
|
|
1
|
+
.CollapsibleHeader{display:block;container-name:collapsible-header-container;container-type:inline-size}.Box:has(.CollapsibleHeader--collapsed){border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-width:var(--borderWidth-thicker)}.Box:has(.CollapsibleHeader--collapsed) :is(.Box-body,.Box-footer,.Box-list){display:none}.CollapsibleHeader-triggerArea{cursor:pointer;-webkit-user-select:none;user-select:none;display:flex;flex-wrap:nowrap;align-items:center;column-gap:var(--stack-gap-normal);row-gap:var(--base-size-4);overflow:hidden}.CollapsibleHeader>.CollapsibleHeader-triggerArea{flex:1}@container collapsible-header-container (width < 544px){.CollapsibleHeader-triggerArea{flex-direction:column;align-items:flex-start}.CollapsibleHeader[data-collapsed] .CollapsibleHeader-description{display:none}.CollapsibleHeader-description{width:100%}}.CollapsibleHeader--multi-line .CollapsibleHeader-triggerArea{flex-direction:column;align-items:flex-start}.CollapsibleHeader--multi-line.CollapsibleHeader[data-collapsed] .CollapsibleHeader-description{display:none}.CollapsibleHeader--multi-line .CollapsibleHeader-description{overflow:visible;text-overflow:clip;white-space:normal;width:100%}.CollapsibleHeader-title-line{flex-basis:66%;display:flex;align-items:center;gap:var(--stack-gap-condensed);overflow:hidden;max-width:100%}.CollapsibleHeader-description{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-webkit-user-select:text;user-select:text}
|
|
@@ -3,9 +3,7 @@
|
|
|
3
3
|
"selectors": [
|
|
4
4
|
".CollapsibleHeader",
|
|
5
5
|
".Box:has(.CollapsibleHeader--collapsed)",
|
|
6
|
-
".Box:has(.CollapsibleHeader--collapsed) .Box-body",
|
|
7
|
-
".Box:has(.CollapsibleHeader--collapsed) .Box-footer",
|
|
8
|
-
".Box:has(.CollapsibleHeader--collapsed) .Box-list",
|
|
6
|
+
".Box:has(.CollapsibleHeader--collapsed) :is(.Box-body,.Box-footer,.Box-list)",
|
|
9
7
|
".CollapsibleHeader-triggerArea",
|
|
10
8
|
".CollapsibleHeader>.CollapsibleHeader-triggerArea",
|
|
11
9
|
".CollapsibleHeader[data-collapsed] .CollapsibleHeader-description",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["collapsible_header.pcss"],"names":[],"mappings":"AAEA,
|
|
1
|
+
{"version":3,"sources":["collapsible_header.pcss"],"names":[],"mappings":"AAEA,mBACE,aAAc,CACd,2CAA4C,CAC5C,0BACF,CAEA,wCACE,2BAA4B,CAC5B,4BAA6B,CAC7B,8CAOF,CALE,6EAGE,YACF,CAGF,+BACE,cAAe,CACf,wBAAiB,CAAjB,gBAAiB,CACjB,YAAa,CACb,gBAAiB,CACjB,kBAAmB,CACnB,kCAAmC,CACnC,0BAA2B,CAC3B,eAKF,CAHE,kDACE,MACF,CAGF,wDACE,+BACE,qBAAsB,CACtB,sBACF,CAEA,kEACE,YACF,CAEA,+BACE,UACF,CACF,CAGE,8DACE,qBAAsB,CACtB,sBACF,CAEA,gGACE,YACF,CAEA,8DACE,gBAAiB,CACjB,kBAAsB,CACtB,kBAAmB,CACnB,UACF,CAGF,8BACE,cAAe,CACf,YAAa,CACb,kBAAmB,CACnB,8BAA+B,CAC/B,eAAgB,CAChB,cACF,CAEA,+BACE,MAAO,CACP,WAAY,CACZ,eAAgB,CAChB,sBAAuB,CACvB,kBAAmB,CACnB,wBAAiB,CAAjB,gBACF","file":"collapsible_header.css","sourcesContent":["/* CSS for BorderBox::CollapsibleHeader */\n\n.CollapsibleHeader {\n display: block;\n container-name: collapsible-header-container;\n container-type: inline-size;\n}\n\n.Box:has(.CollapsibleHeader--collapsed) {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n border-bottom-width: var(--borderWidth-thicker);\n\n & .Box-list,\n & .Box-body,\n & .Box-footer {\n display: none;\n }\n}\n\n.CollapsibleHeader-triggerArea {\n cursor: pointer;\n user-select: none;\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n column-gap: var(--stack-gap-normal);\n row-gap: var(--base-size-4);\n overflow: hidden;\n\n .CollapsibleHeader > & {\n flex: 1;\n }\n}\n\n@container collapsible-header-container (width < 544px) {\n .CollapsibleHeader-triggerArea {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .CollapsibleHeader[data-collapsed] .CollapsibleHeader-description {\n display: none;\n }\n\n .CollapsibleHeader-description {\n width: 100%;\n }\n}\n\n.CollapsibleHeader--multi-line {\n .CollapsibleHeader-triggerArea {\n flex-direction: column;\n align-items: flex-start;\n }\n\n &.CollapsibleHeader[data-collapsed] .CollapsibleHeader-description {\n display: none;\n }\n\n .CollapsibleHeader-description {\n overflow: visible;\n text-overflow: initial;\n white-space: normal;\n width: 100%;\n }\n}\n\n.CollapsibleHeader-title-line {\n flex-basis: 66%;\n display: flex;\n align-items: center;\n gap: var(--stack-gap-condensed);\n overflow: hidden;\n max-width: 100%;\n}\n\n.CollapsibleHeader-description {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n user-select: text;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.BorderGrid{
|
|
1
|
+
.BorderGrid{display:table;width:100%;margin-top:-16px;margin-bottom:-16px;table-layout:fixed;border-collapse:collapse;border-style:hidden}.BorderGrid .BorderGrid-cell{padding-top:16px;padding-bottom:16px}.BorderGrid--spacious{margin-top:-24px;margin-bottom:-24px}.BorderGrid--spacious .BorderGrid-cell{padding-top:24px;padding-bottom:24px}.BorderGrid-row{display:table-row}.BorderGrid-cell{display:table-cell;border:1px solid var(--borderColor-muted)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["border_grid.pcss"],"names":[],"mappings":"AAEA,
|
|
1
|
+
{"version":3,"sources":["border_grid.pcss"],"names":[],"mappings":"AAEA,YACI,aAAc,CACd,UAAW,CACX,gBAAiB,CACjB,mBAAoB,CACpB,kBAAmB,CACnB,wBAAyB,CACzB,mBACJ,CAEA,6BACI,gBAAiB,CACjB,mBACJ,CAEA,sBACI,gBAAiB,CACjB,mBACJ,CAEA,uCACI,gBAAiB,CACjB,mBACJ,CAEA,gBACI,iBACJ,CAEA,iBACI,kBAAmB,CACnB,yCACJ","file":"border_grid.css","sourcesContent":["/* CSS for BorderGrid */\n\n.BorderGrid {\n display: table;\n width: 100%;\n margin-top: -16px;\n margin-bottom: -16px;\n table-layout: fixed;\n border-collapse: collapse;\n border-style: hidden\n}\n\n.BorderGrid .BorderGrid-cell {\n padding-top: 16px;\n padding-bottom: 16px\n}\n\n.BorderGrid--spacious {\n margin-top: -24px;\n margin-bottom: -24px\n}\n\n.BorderGrid--spacious .BorderGrid-cell {\n padding-top: 24px;\n padding-bottom: 24px\n}\n\n.BorderGrid-row {\n display: table-row\n}\n\n.BorderGrid-cell {\n display: table-cell;\n border: 1px solid var(--borderColor-muted)\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.DragHandle{color:var(--fgColor-muted)
|
|
1
|
+
.DragHandle{cursor:move;color:var(--fgColor-muted)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["drag_handle.pcss"],"names":[],"mappings":"AAEA,
|
|
1
|
+
{"version":3,"sources":["drag_handle.pcss"],"names":[],"mappings":"AAEA,YACI,WAAY,CACZ,0BACJ","file":"drag_handle.css","sourcesContent":["/* CSS for DragHandle */\n\n.DragHandle {\n cursor: move;\n color: var(--fgColor-muted);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
filterable-tree-view{display:flex;flex-direction:column;max-height:inherit
|
|
1
|
+
filterable-tree-view{display:flex;flex-direction:column;overflow:hidden;max-height:inherit}.FilterableTreeViewLayout{flex:1;min-height:0}.FilterableTreeViewTreeContainer{flex:1;min-height:0;overflow-y:auto}::highlight(primer-filterable-tree-view-search-results){background-color:var(--display-yellow-scale-2)}filterable-tree-view mark{background-color:var(--display-yellow-scale-2);color:inherit}.FilterableTreeViewLoadingSkeleton{display:none}filterable-tree-view[data-loading] .FilterableTreeViewLoadingSkeleton{display:block}filterable-tree-view[data-loading] [data-target~="filterable-tree-view.noResultsMessage"],filterable-tree-view[data-loading] tree-view{display:none}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["filterable_tree_view.pcss"],"names":[],"mappings":"AAYA,qBACE,YAAa,CACb,qBAAsB,
|
|
1
|
+
{"version":3,"sources":["filterable_tree_view.pcss"],"names":[],"mappings":"AAYA,qBACE,YAAa,CACb,qBAAsB,CACtB,eAAgB,CAChB,kBACF,CAEA,0BACE,MAAO,CACP,YACF,CAEA,iCACE,MAAO,CACP,YAAa,CACb,eACF,CAGA,wDACE,8CACF,CAIA,0BACE,8CAA+C,CAC/C,aACF,CAGA,mCACE,YACF,CAIA,sEACE,aACF,CAEA,uIAEE,YACF","file":"filterable_tree_view.css","sourcesContent":["/* CSS for FilterableTreeView */\n\n/* Scroll layout\n *\n * The filterable-tree-view element itself acts as a flex column container.\n * The toolbar (input, segmented control, checkbox) is fixed at the top.\n * Only the tree area scrolls. The consumer is responsible for setting a\n * height or max-height on the filterable-tree-view element (or its parent)\n * to activate scrolling.\n */\n\n/* stylelint-disable-next-line selector-max-type */\nfilterable-tree-view {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n max-height: inherit;\n}\n\n.FilterableTreeViewLayout {\n flex: 1;\n min-height: 0;\n}\n\n.FilterableTreeViewTreeContainer {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n}\n\n/* Highlight style for CSS Custom Highlight API */\n::highlight(primer-filterable-tree-view-search-results) {\n background-color: var(--display-yellow-scale-2);\n}\n\n/* Fallback: <mark> elements used when CSS Custom Highlight API is unavailable */\n/* stylelint-disable-next-line selector-max-type */\nfilterable-tree-view mark {\n background-color: var(--display-yellow-scale-2);\n color: inherit;\n}\n\n/* Loading skeleton */\n.FilterableTreeViewLoadingSkeleton {\n display: none;\n}\n\n/* stylelint-disable selector-no-qualifying-type */\n/* stylelint-disable selector-max-type */\nfilterable-tree-view[data-loading] .FilterableTreeViewLoadingSkeleton {\n display: block;\n}\n\nfilterable-tree-view[data-loading] tree-view,\nfilterable-tree-view[data-loading] [data-target~=\"filterable-tree-view.noResultsMessage\"] {\n display: none;\n}\n"]}
|
|
@@ -28,11 +28,15 @@
|
|
|
28
28
|
<% end %>
|
|
29
29
|
<% end %>
|
|
30
30
|
<div class="FilterableTreeViewLoadingSkeleton" aria-hidden="true">
|
|
31
|
-
<%
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
31
|
+
<% if loading_indicator? %>
|
|
32
|
+
<%= loading_indicator %>
|
|
33
|
+
<% else %>
|
|
34
|
+
<% [0, 8, 8, 16, 8, 0, 8, 8].each do |indent| %>
|
|
35
|
+
<span class="TreeViewSkeletonItemContainerStyle" style="padding-left: <%= indent %>px">
|
|
36
|
+
<%= render(Primer::Alpha::SkeletonBox.new(width: "16px")) %>
|
|
37
|
+
<%= render(Primer::Alpha::SkeletonBox.new(classes: "TreeItemSkeletonTextStyles")) %>
|
|
38
|
+
</span>
|
|
39
|
+
<% end %>
|
|
36
40
|
<% end %>
|
|
37
41
|
</div>
|
|
38
42
|
<%= render(@tree_view) %>
|
|
@@ -15,7 +15,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
15
15
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
16
16
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
17
17
|
};
|
|
18
|
-
var _FilterableTreeViewElement_instances, _FilterableTreeViewElement_filterFn, _FilterableTreeViewElement_abortController, _FilterableTreeViewElement_stateMap, _FilterableTreeViewElement_debounceTimer, _FilterableTreeViewElement_fetchAbortController, _FilterableTreeViewElement_expansionSnapshot, _FilterableTreeViewElement_selectedModeSnapshot, _FilterableTreeViewElement_checkedNodeIds, _FilterableTreeViewElement_checkedNodeFormPayloads, _FilterableTreeViewElement_isFiltered, _FilterableTreeViewElement_src_get, _FilterableTreeViewElement_isAsyncMode_get, _FilterableTreeViewElement_clientHighlightsEnabled_get, _FilterableTreeViewElement_handleTreeViewEvent, _FilterableTreeViewElement_updateCheckedNodeIds, _FilterableTreeViewElement_handleTreeViewNodeChecked, _FilterableTreeViewElement_restoreNodeState, _FilterableTreeViewElement_handleFilterModeEvent, _FilterableTreeViewElement_undoClientSideFilter, _FilterableTreeViewElement_handleFilterInputEvent, _FilterableTreeViewElement_handleIncludeSubItemsCheckBoxEvent, _FilterableTreeViewElement_includeSubItems, _FilterableTreeViewElement_includeSubItemsUnder, _FilterableTreeViewElement_restoreAllNodeStates, _FilterableTreeViewElement_scheduleAsyncFetch, _FilterableTreeViewElement_fetchAndReplaceTree, _FilterableTreeViewElement_captureExpansionState, _FilterableTreeViewElement_applyExpansionSnapshot, _FilterableTreeViewElement_snapshotExpansionState, _FilterableTreeViewElement_restoreExpansionState, _FilterableTreeViewElement_restoreSelectionState, _FilterableTreeViewElement_expandAllSubTrees, _FilterableTreeViewElement_applyAsyncHighlights, _FilterableTreeViewElement_updateRetainedSelections, _FilterableTreeViewElement_applyFilterOptions, _FilterableTreeViewElement_applyHighlights, _FilterableTreeViewElement_applyManualHighlights, _FilterableTreeViewElement_removeHighlights;
|
|
18
|
+
var _FilterableTreeViewElement_instances, _FilterableTreeViewElement_filterFn, _FilterableTreeViewElement_abortController, _FilterableTreeViewElement_stateMap, _FilterableTreeViewElement_debounceTimer, _FilterableTreeViewElement_fetchAbortController, _FilterableTreeViewElement_expansionSnapshot, _FilterableTreeViewElement_selectedModeSnapshot, _FilterableTreeViewElement_checkedNodeIds, _FilterableTreeViewElement_checkedNodeFormPayloads, _FilterableTreeViewElement_isFiltered, _FilterableTreeViewElement_src_get, _FilterableTreeViewElement_isAsyncMode_get, _FilterableTreeViewElement_clientHighlightsEnabled_get, _FilterableTreeViewElement_handleTreeViewEvent, _FilterableTreeViewElement_updateCheckedNodeIds, _FilterableTreeViewElement_handleTreeViewNodeChecked, _FilterableTreeViewElement_restoreNodeState, _FilterableTreeViewElement_handleFilterModeEvent, _FilterableTreeViewElement_undoClientSideFilter, _FilterableTreeViewElement_handleFilterInputEvent, _FilterableTreeViewElement_handleFilterInputKeyDown, _FilterableTreeViewElement_handleTreeKeyDown, _FilterableTreeViewElement_handleIncludeSubItemsCheckBoxEvent, _FilterableTreeViewElement_includeSubItems, _FilterableTreeViewElement_includeSubItemsUnder, _FilterableTreeViewElement_restoreAllNodeStates, _FilterableTreeViewElement_scheduleAsyncFetch, _FilterableTreeViewElement_fetchAndReplaceTree, _FilterableTreeViewElement_captureExpansionState, _FilterableTreeViewElement_applyExpansionSnapshot, _FilterableTreeViewElement_snapshotExpansionState, _FilterableTreeViewElement_restoreExpansionState, _FilterableTreeViewElement_restoreSelectionState, _FilterableTreeViewElement_expandAllSubTrees, _FilterableTreeViewElement_applyAsyncHighlights, _FilterableTreeViewElement_updateRetainedSelections, _FilterableTreeViewElement_applyFilterOptions, _FilterableTreeViewElement_applyHighlights, _FilterableTreeViewElement_applyManualHighlights, _FilterableTreeViewElement_removeHighlights;
|
|
19
19
|
import { controller, target } from '@github/catalyst';
|
|
20
20
|
import { TreeViewElement } from '../alpha/tree_view/tree_view';
|
|
21
21
|
import { TreeViewSubTreeNodeElement } from '../alpha/tree_view/tree_view_sub_tree_node_element';
|
|
@@ -57,6 +57,7 @@ let FilterableTreeViewElement = class FilterableTreeViewElement extends HTMLElem
|
|
|
57
57
|
this.addEventListener('treeViewNodeChecked', this, { signal });
|
|
58
58
|
this.addEventListener('itemActivated', this, { signal });
|
|
59
59
|
this.addEventListener('input', this, { signal });
|
|
60
|
+
this.addEventListener('keydown', this, { signal });
|
|
60
61
|
if (__classPrivateFieldGet(this, _FilterableTreeViewElement_instances, "a", _FilterableTreeViewElement_isAsyncMode_get)) {
|
|
61
62
|
void __classPrivateFieldGet(this, _FilterableTreeViewElement_instances, "m", _FilterableTreeViewElement_fetchAndReplaceTree).call(this);
|
|
62
63
|
}
|
|
@@ -72,7 +73,12 @@ let FilterableTreeViewElement = class FilterableTreeViewElement extends HTMLElem
|
|
|
72
73
|
__classPrivateFieldGet(this, _FilterableTreeViewElement_instances, "m", _FilterableTreeViewElement_handleFilterModeEvent).call(this, event);
|
|
73
74
|
}
|
|
74
75
|
else if (event.target === this.filterInput) {
|
|
75
|
-
|
|
76
|
+
if (event.type === 'keydown') {
|
|
77
|
+
__classPrivateFieldGet(this, _FilterableTreeViewElement_instances, "m", _FilterableTreeViewElement_handleFilterInputKeyDown).call(this, event);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
__classPrivateFieldGet(this, _FilterableTreeViewElement_instances, "m", _FilterableTreeViewElement_handleFilterInputEvent).call(this, event);
|
|
81
|
+
}
|
|
76
82
|
}
|
|
77
83
|
else if (event.target === this.includeSubItemsCheckBox) {
|
|
78
84
|
__classPrivateFieldGet(this, _FilterableTreeViewElement_instances, "m", _FilterableTreeViewElement_handleIncludeSubItemsCheckBoxEvent).call(this, event);
|
|
@@ -80,6 +86,9 @@ let FilterableTreeViewElement = class FilterableTreeViewElement extends HTMLElem
|
|
|
80
86
|
else if (event.target instanceof TreeViewElement || event.target instanceof TreeViewSubTreeNodeElement) {
|
|
81
87
|
__classPrivateFieldGet(this, _FilterableTreeViewElement_instances, "m", _FilterableTreeViewElement_handleTreeViewEvent).call(this, event);
|
|
82
88
|
}
|
|
89
|
+
else if (event.type === 'keydown' && this.treeViewList?.contains(event.target)) {
|
|
90
|
+
__classPrivateFieldGet(this, _FilterableTreeViewElement_instances, "m", _FilterableTreeViewElement_handleTreeKeyDown).call(this, event);
|
|
91
|
+
}
|
|
83
92
|
}
|
|
84
93
|
get filterModeControl() {
|
|
85
94
|
return this.filterModeControlList.closest('segmented-control');
|
|
@@ -321,6 +330,23 @@ _FilterableTreeViewElement_handleFilterInputEvent = function _FilterableTreeView
|
|
|
321
330
|
__classPrivateFieldGet(this, _FilterableTreeViewElement_instances, "m", _FilterableTreeViewElement_applyFilterOptions).call(this);
|
|
322
331
|
}
|
|
323
332
|
};
|
|
333
|
+
_FilterableTreeViewElement_handleFilterInputKeyDown = function _FilterableTreeViewElement_handleFilterInputKeyDown(event) {
|
|
334
|
+
if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp')
|
|
335
|
+
return;
|
|
336
|
+
const treeitems = [...(this.treeViewList?.querySelectorAll('[role=treeitem]') ?? [])];
|
|
337
|
+
const visibleItems = treeitems.filter(item => !item.closest('[hidden]'));
|
|
338
|
+
if (visibleItems.length === 0)
|
|
339
|
+
return;
|
|
340
|
+
event.preventDefault();
|
|
341
|
+
const focusTarget = event.key === 'ArrowDown' ? visibleItems[0] : visibleItems[visibleItems.length - 1];
|
|
342
|
+
focusTarget.focus();
|
|
343
|
+
};
|
|
344
|
+
_FilterableTreeViewElement_handleTreeKeyDown = function _FilterableTreeViewElement_handleTreeKeyDown(event) {
|
|
345
|
+
if (event.key !== 'Escape')
|
|
346
|
+
return;
|
|
347
|
+
event.preventDefault();
|
|
348
|
+
this.filterInput.focus();
|
|
349
|
+
};
|
|
324
350
|
_FilterableTreeViewElement_handleIncludeSubItemsCheckBoxEvent = function _FilterableTreeViewElement_handleIncludeSubItemsCheckBoxEvent(event) {
|
|
325
351
|
if (!this.treeView)
|
|
326
352
|
return;
|
|
@@ -133,11 +133,19 @@ module Primer
|
|
|
133
133
|
# ```erb
|
|
134
134
|
# <%= render(Primer::OpenProject::FilterableTreeView.new(
|
|
135
135
|
# src: my_path
|
|
136
|
-
# )) %>
|
|
136
|
+
# )) do |tree_view| %>
|
|
137
|
+
# <% tree_view.with_loading_indicator do %>
|
|
138
|
+
# <%= render(Primer::Beta::Spinner.new) %>
|
|
139
|
+
# <% end %>
|
|
140
|
+
# <% end %>
|
|
137
141
|
# ```
|
|
138
142
|
class FilterableTreeView < Primer::Component
|
|
139
143
|
delegate :with_leaf, :with_sub_tree, to: :@tree_view
|
|
140
144
|
|
|
145
|
+
# An optional loading indicator shown while an async filter request is in progress. When omitted, a skeleton
|
|
146
|
+
# loader is rendered. This slot is only used when `src` is set.
|
|
147
|
+
renders_one :loading_indicator
|
|
148
|
+
|
|
141
149
|
SUPPORTED_SELECT_VARIANTS = %i[multiple single none].freeze
|
|
142
150
|
|
|
143
151
|
DEFAULT_FILTER_INPUT_ARGUMENTS = {
|
|
@@ -49,6 +49,7 @@ export class FilterableTreeViewElement extends HTMLElement {
|
|
|
49
49
|
this.addEventListener('treeViewNodeChecked', this, {signal})
|
|
50
50
|
this.addEventListener('itemActivated', this, {signal})
|
|
51
51
|
this.addEventListener('input', this, {signal})
|
|
52
|
+
this.addEventListener('keydown', this, {signal})
|
|
52
53
|
|
|
53
54
|
if (this.#isAsyncMode) {
|
|
54
55
|
void this.#fetchAndReplaceTree()
|
|
@@ -77,11 +78,17 @@ export class FilterableTreeViewElement extends HTMLElement {
|
|
|
77
78
|
if (event.target === this.filterModeControl) {
|
|
78
79
|
this.#handleFilterModeEvent(event)
|
|
79
80
|
} else if (event.target === this.filterInput) {
|
|
80
|
-
|
|
81
|
+
if (event.type === 'keydown') {
|
|
82
|
+
this.#handleFilterInputKeyDown(event as KeyboardEvent)
|
|
83
|
+
} else {
|
|
84
|
+
this.#handleFilterInputEvent(event)
|
|
85
|
+
}
|
|
81
86
|
} else if (event.target === this.includeSubItemsCheckBox) {
|
|
82
87
|
this.#handleIncludeSubItemsCheckBoxEvent(event)
|
|
83
88
|
} else if (event.target instanceof TreeViewElement || event.target instanceof TreeViewSubTreeNodeElement) {
|
|
84
89
|
this.#handleTreeViewEvent(event)
|
|
90
|
+
} else if (event.type === 'keydown' && this.treeViewList?.contains(event.target as Node)) {
|
|
91
|
+
this.#handleTreeKeyDown(event as KeyboardEvent)
|
|
85
92
|
}
|
|
86
93
|
}
|
|
87
94
|
|
|
@@ -231,6 +238,25 @@ export class FilterableTreeViewElement extends HTMLElement {
|
|
|
231
238
|
}
|
|
232
239
|
}
|
|
233
240
|
|
|
241
|
+
#handleFilterInputKeyDown(event: KeyboardEvent) {
|
|
242
|
+
if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') return
|
|
243
|
+
|
|
244
|
+
const treeitems = [...(this.treeViewList?.querySelectorAll<HTMLElement>('[role=treeitem]') ?? [])]
|
|
245
|
+
const visibleItems = treeitems.filter(item => !item.closest('[hidden]'))
|
|
246
|
+
|
|
247
|
+
if (visibleItems.length === 0) return
|
|
248
|
+
|
|
249
|
+
event.preventDefault()
|
|
250
|
+
const focusTarget = event.key === 'ArrowDown' ? visibleItems[0] : visibleItems[visibleItems.length - 1]
|
|
251
|
+
focusTarget.focus()
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
#handleTreeKeyDown(event: KeyboardEvent) {
|
|
255
|
+
if (event.key !== 'Escape') return
|
|
256
|
+
event.preventDefault()
|
|
257
|
+
this.filterInput.focus()
|
|
258
|
+
}
|
|
259
|
+
|
|
234
260
|
#handleIncludeSubItemsCheckBoxEvent(event: Event) {
|
|
235
261
|
if (!this.treeView) return
|
|
236
262
|
if (event.type !== 'input') return
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.InlineMessage{
|
|
1
|
+
.InlineMessage{display:grid;font-size:var(--inline-message-fontSize);line-height:var(--inline-message-lineHeight);color:var(--inline-message-fgColor);column-gap:.5rem;grid-template-columns:auto 1fr;align-items:start}.InlineMessage[data-size=small]{--inline-message-fontSize:var(--text-body-size-small);--inline-message-lineHeight:var(--text-body-lineHeight-small,1.6666)}.InlineMessage[data-size=medium]{--inline-message-fontSize:var(--text-body-size-medium);--inline-message-lineHeight:var(--text-body-lineHeight-medium,1.4285)}.InlineMessage[data-variant=warning]{--inline-message-fgColor:var(--fgColor-attention)}.InlineMessage[data-variant=critical]{--inline-message-fgColor:var(--fgColor-danger)}.InlineMessage[data-variant=success]{--inline-message-fgColor:var(--fgColor-success)}.InlineMessage[data-variant=unavailable]{--inline-message-fgColor:var(--fgColor-muted)}.InlineMessageIcon{min-height:calc(var(--inline-message-lineHeight)*var(--inline-message-fontSize))}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["inline_message.pcss"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"sources":["inline_message.pcss"],"names":[],"mappings":"AAAA,eACE,YAAa,CAEb,wCAAyC,CAEzC,4CAA6C,CAE7C,mCAAoC,CACpC,gBAAkB,CAClB,8BAA+B,CAC/B,iBA2BF,CAzBE,gCACE,qDAAsD,CACtD,oEACF,CAEA,iCACE,sDAAuD,CACvD,qEACF,CAEA,qCACE,iDACF,CAEA,sCACE,8CACF,CAEA,qCACE,+CACF,CAEA,yCACE,6CACF,CAGF,mBACE,gFACF","file":"inline_message.css","sourcesContent":[".InlineMessage {\n display: grid;\n /* stylelint-disable-next-line primer/typography */\n font-size: var(--inline-message-fontSize);\n /* stylelint-disable-next-line primer/typography */\n line-height: var(--inline-message-lineHeight);\n /* stylelint-disable-next-line primer/colors */\n color: var(--inline-message-fgColor);\n column-gap: 0.5rem;\n grid-template-columns: auto 1fr;\n align-items: start;\n\n &[data-size='small'] {\n --inline-message-fontSize: var(--text-body-size-small);\n --inline-message-lineHeight: var(--text-body-lineHeight-small, 1.6666);\n }\n\n &[data-size='medium'] {\n --inline-message-fontSize: var(--text-body-size-medium);\n --inline-message-lineHeight: var(--text-body-lineHeight-medium, 1.4285);\n }\n\n &[data-variant='warning'] {\n --inline-message-fgColor: var(--fgColor-attention);\n }\n\n &[data-variant='critical'] {\n --inline-message-fgColor: var(--fgColor-danger);\n }\n\n &[data-variant='success'] {\n --inline-message-fgColor: var(--fgColor-success);\n }\n\n &[data-variant='unavailable'] {\n --inline-message-fgColor: var(--fgColor-muted);\n }\n}\n\n.InlineMessageIcon {\n min-height: calc(var(--inline-message-lineHeight) * var(--inline-message-fontSize));\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.PageHeader{
|
|
1
|
+
.PageHeader{display:flex;padding-bottom:var(--base-size-8);margin-bottom:var(--base-size-16);border-bottom:var(--borderWidth-thin) solid var(--borderColor-muted);flex-flow:column}.PageHeader--withTabNav{border-bottom:none;padding-bottom:0;margin-bottom:0}.PageHeader-contextBar{height:var(--control-small-size)}.PageHeader-contextBar,.PageHeader-titleBar{display:flex;flex-flow:row;justify-content:flex-end;align-items:center;margin-bottom:var(--base-size-8)}.PageHeader-title{font-size:var(--text-title-size-medium);flex:1 1 auto}.PageHeader-title--large{font-size:var(--text-title-size-large)}.PageHeader-description{font-size:var(--text-body-size-medium);color:var(--fgColor-muted);flex:1 auto}.PageHeader-description--underlined-links a{-webkit-text-decoration:underline;text-decoration:underline}.PageHeader-tabNavBar{overflow:auto}.PageHeader-tabNavBar .PageHeader-tabNav{min-width:max-content}.PageHeader--withTabNav .PageHeader-description{margin-bottom:var(--base-size-16)}.PageHeader-actions{justify-content:flex-end;display:flex;align-items:center}.PageHeader-breadcrumbs{display:block;width:100%}.PageHeader-leadingAction{margin-top:var(--base-size-2);margin-right:var(--base-size-4)}.PageHeader-parentLink{flex:1 1 auto}@media screen and (min-width:543.98px){.PageHeader--noBreadcrumb .PageHeader-contextBar{display:none}}.PageHeader--noBreadcrumb .PageHeader-titleBar{line-height:var(--control-small-size)}.PageHeader--noBreadcrumb .PageHeader-actions{height:var(--control-small-size)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["page_header.pcss"],"names":[],"mappings":"AAEA,
|
|
1
|
+
{"version":3,"sources":["page_header.pcss"],"names":[],"mappings":"AAEA,YACE,YAAa,CACb,iCAAkC,CAClC,iCAAkC,CAClC,oEAAqE,CACrE,gBACF,CAEA,wBACE,kBAAmB,CACnB,gBAAiB,CACjB,eACF,CAEA,uBAME,gCACF,CAEA,4CARE,YAAa,CACb,aAAc,CACd,wBAAyB,CACzB,kBAAmB,CACnB,gCAUF,CAEA,kBACE,uCAAwC,CACxC,aACF,CAEA,yBACE,sCACF,CAGA,wBACE,sCAAuC,CACvC,0BAA2B,CAC3B,WACF,CAEA,4CAEE,iCAA0B,CAA1B,yBACF,CAEA,sBACE,aACF,CAEA,yCACE,qBACF,CAEA,gDACE,iCACF,CAEA,oBACE,wBAAyB,CACzB,YAAa,CACb,kBACF,CAEA,wBACE,aAAc,CACd,UACF,CAEA,0BACE,6BAA8B,CAC9B,+BACF,CAEA,uBACE,aACF,CAGA,uCACE,iDACE,YACF,CACF,CAIE,+CACE,qCACF,CAEA,8CACE,gCACF","file":"page_header.css","sourcesContent":["/* OP PageHeader */\n\n.PageHeader {\n display: flex;\n padding-bottom: var(--base-size-8);\n margin-bottom: var(--base-size-16);\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 auto;\n}\n\n.PageHeader-description--underlined-links a {\n /* Ensure the accessibility is met, given that the description is written in light grey */\n text-decoration: underline;\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: var(--base-size-2); /* to center align with label */\n margin-right: var(--base-size-4);\n}\n\n.PageHeader-parentLink {\n flex: 1 1 auto;\n}\n\n/* Hide the context bar on desktop when no breadcrumb is visible */\n@media screen and (min-width: 543.98px) {\n .PageHeader--noBreadcrumb .PageHeader-contextBar {\n display: none;\n }\n}\n\n/* Match the title bar and actions height with the toggle menu button for proper vertical alignment */\n.PageHeader--noBreadcrumb {\n & .PageHeader-titleBar {\n line-height: var(--control-small-size);\n }\n\n & .PageHeader-actions {\n height: var(--control-small-size);\n }\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.Page{
|
|
1
|
+
.Page{min-width:var(--base-size-32);height:var(--base-size-32);padding:var(--base-size-8) var(--base-size-6);margin-right:var(--base-size-4);color:var(--fgColor-default);white-space:nowrap;vertical-align:middle;cursor:pointer;border-radius:var(--borderRadius-medium,.375rem);transition:background-color .2s cubic-bezier(.3,0,.5,1);display:inline-flex;align-items:center;justify-content:center}.Page[rel=next]>svg,.Page[rel=prev]>svg{height:var(--base-size-16);width:var(--base-size-16)}.Page[rel=prev]>svg{margin-inline-end:var(--base-size-4)}.Page[rel=next]>svg{margin-inline-start:var(--base-size-4)}.Page:last-child{margin-right:0}.Page:focus,.Page:hover{-webkit-text-decoration:none;text-decoration:none;background-color:var(--control-transparent-bgColor-hover);outline:0;transition-duration:.1s}.Page:focus-visible{outline:2px solid var(--bgColor-accent-emphasis)}.Page:active{border-color:var(--borderColor-muted)}.Page[rel=next],.Page[rel=prev]{color:var(--fgColor-accent)}.Page[aria-current],.Page[aria-current]:hover{color:var(--fgColor-onEmphasis);background-color:var(--bgColor-accent-emphasis);border-color:#0000}.Page[aria-current]:focus-visible{outline:2px solid var(--bgColor-accent-emphasis);box-shadow:inset 0 0 0 var(--base-size-2) var(--fgColor-onEmphasis)}.Page[aria-hidden],.Page[aria-hidden]:hover,.Page[role=presentation],.Page[role=presentation]:hover{color:var(--fgColor-disabled);cursor:default;background-color:initial}.PaginationContainer{margin:var(--base-size-16) 0;text-align:center}@media (max-width:543.98px){.Page:not([rel=prev]):not([rel=next]){display:none}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["pagination.pcss"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"sources":["pagination.pcss"],"names":[],"mappings":"AAAA,MACE,6BAA8B,CAC9B,0BAA2B,CAC3B,6CAA8C,CAC9C,+BAAgC,CAChC,4BAA6B,CAC7B,kBAAmB,CACnB,qBAAsB,CACtB,cAAe,CACf,gDAAiD,CACjD,uDAA8D,CAC9D,mBAAoB,CACpB,kBAAmB,CACnB,sBACF,CAEA,wCAEE,0BAA2B,CAC3B,yBACF,CAEA,oBACE,oCACF,CAEA,oBACE,sCACF,CAEA,iBACE,cACF,CAEA,wBAEE,4BAAqB,CAArB,oBAAqB,CACrB,yDAA0D,CAC1D,SAAU,CACV,uBACF,CAEA,oBACE,gDACF,CAEA,aACE,qCACF,CAEA,gCAEE,2BACF,CAEA,8CAEE,+BAAgC,CAChC,+CAAgD,CAChD,kBACF,CAEA,kCACE,gDAAiD,CACjD,mEACF,CAEA,oGAIE,6BAA8B,CAC9B,cAAe,CACf,wBACF,CAEA,qBACE,4BAA6B,CAC7B,iBACF,CAEA,4BACE,sCACE,YACF,CACF","file":"pagination.css","sourcesContent":[".Page {\n min-width: var(--base-size-32);\n height: var(--base-size-32);\n padding: var(--base-size-8) var(--base-size-6);\n margin-right: var(--base-size-4);\n color: var(--fgColor-default);\n white-space: nowrap;\n vertical-align: middle;\n cursor: pointer;\n border-radius: var(--borderRadius-medium,.375rem);\n transition: background-color 0.2s cubic-bezier(0.3, 0, 0.5, 1);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.Page[rel='prev'] > svg,\n.Page[rel='next'] > svg {\n height: var(--base-size-16);\n width: var(--base-size-16);\n}\n\n.Page[rel='prev'] > svg {\n margin-inline-end: var(--base-size-4);\n}\n\n.Page[rel='next'] > svg {\n margin-inline-start: var(--base-size-4);\n}\n\n.Page:last-child {\n margin-right: 0;\n}\n\n.Page:hover,\n.Page:focus {\n text-decoration: none;\n background-color: var(--control-transparent-bgColor-hover);\n outline: 0;\n transition-duration: 0.1s;\n}\n\n.Page:focus-visible {\n outline: 2px solid var(--bgColor-accent-emphasis);\n}\n\n.Page:active {\n border-color: var(--borderColor-muted);\n}\n\n.Page[rel='prev'],\n.Page[rel='next'] {\n color: var(--fgColor-accent);\n}\n\n.Page[aria-current],\n.Page[aria-current]:hover {\n color: var(--fgColor-onEmphasis);\n background-color: var(--bgColor-accent-emphasis);\n border-color: transparent;\n}\n\n.Page[aria-current]:focus-visible {\n outline: 2px solid var(--bgColor-accent-emphasis);\n box-shadow: inset 0 0 0 var(--base-size-2) var(--fgColor-onEmphasis);\n}\n\n.Page[aria-hidden],\n.Page[aria-hidden]:hover,\n.Page[role='presentation'],\n.Page[role='presentation']:hover {\n color: var(--fgColor-disabled);\n cursor: default;\n background-color: transparent;\n}\n\n.PaginationContainer {\n margin: var(--base-size-16) 0;\n text-align: center;\n}\n\n@media (max-width: 543.98px){\n .Page:not([rel='prev']):not([rel='next']) {\n display: none;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.SidePanel-sectionHeader{align-items:center;
|
|
1
|
+
.SidePanel-sectionHeader{display:flex;align-items:center;height:32px;margin-bottom:8px}.SidePanel-sectionCounter{margin-left:8px}.SidePanel-sectionAction{justify-content:right;flex:1;display:flex}.SidePanel-sectionContent,.SidePanel-sectionDescription{margin-top:0}:is(.SidePanel-sectionContent,.SidePanel-sectionDescription):not(:last-child){margin-bottom:16px}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["section.pcss"],"names":[],"mappings":"AAEA,
|
|
1
|
+
{"version":3,"sources":["section.pcss"],"names":[],"mappings":"AAEA,yBACE,YAAa,CACb,kBAAmB,CACnB,WAAY,CACZ,iBACF,CAEA,0BACE,eACF,CAEA,yBACE,qBAAsB,CACtB,MAAO,CACP,YACF,CAEA,wDAEE,YAKF,CAHE,8EACE,kBACF","file":"section.css","sourcesContent":["/* CSS for OpenProject::SidePanel::Section */\n\n.SidePanel-sectionHeader {\n display: flex;\n align-items: center;\n height: 32px;\n margin-bottom: 8px;\n}\n\n.SidePanel-sectionCounter {\n margin-left: 8px;\n}\n\n.SidePanel-sectionAction {\n justify-content: right;\n flex: 1;\n display: flex;\n}\n\n.SidePanel-sectionContent,\n.SidePanel-sectionDescription {\n margin-top: 0;\n\n &:not(:last-child) {\n margin-bottom: 16px;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.SubHeader{
|
|
1
|
+
.SubHeader{display:grid;grid-template-areas:"left middle right" "bottom bottom bottom";grid-template-columns:auto 1fr auto;align-items:baseline;margin-bottom:var(--base-size-16)}.SubHeader-rightPane{grid-area:right;display:flex;align-items:center;column-gap:12px}.SubHeader-middlePane{grid-area:middle;text-align:center;white-space:nowrap}.SubHeader-bottomPane{grid-area:bottom}.SubHeader-leftPane{grid-area:left;display:flex;align-items:center;flex-wrap:wrap;row-gap:var(--base-size-16);width:100%}:is(.SubHeader-leftPane [class*=FormControl-input-width--]):not(.FormControl-input-width--auto){width:100vw}.SubHeader-filterContainer{display:flex;flex-basis:max-content;width:100%;gap:8px}.SubHeader-filterInput_hiddenClearButton+.FormControl-input-trailingAction{display:none}@media (max-width:767.98px){.SubHeader{grid-template-areas:"left right" "middle middle" "bottom bottom";grid-template-columns:1fr auto}.SubHeader--expandedSearch{grid-template-areas:"left left" "middle middle" "bottom bottom"}.SubHeader--expandedSearch .SubHeader-hiddenOnExpand{display:none!important}.SubHeader--emptyLeftPane{grid-template-areas:"middle middle right" "bottom bottom bottom";grid-template-columns:auto 1fr auto}.SubHeader--emptyLeftPane .SubHeader-middlePane{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.SubHeader-middlePane{text-align:left}.SubHeader-middlePane:has(>*){margin-top:var(--base-size-16)}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["sub_header.pcss"],"names":[],"mappings":"AAEA,
|
|
1
|
+
{"version":3,"sources":["sub_header.pcss"],"names":[],"mappings":"AAEA,WACI,YAAa,CACb,8DAA+D,CAC/D,mCAAoC,CACpC,oBAAqB,CACrB,iCACJ,CAEA,qBACI,eAAgB,CAChB,YAAa,CACb,kBAAmB,CACnB,eACJ,CAEA,sBACI,gBAAiB,CACjB,iBAAkB,CAClB,kBACJ,CAEA,sBACI,gBACJ,CAEA,oBACI,cAAe,CACf,YAAa,CACb,kBAAmB,CACnB,cAAe,CACf,2BAA4B,CAC5B,UASJ,CAJQ,gGACI,WACJ,CAIR,2BACI,YAAa,CACb,sBAAuB,CACvB,UAAW,CACX,OACJ,CAEA,2EACE,YACF,CAEA,4BACI,WACI,gEAAiE,CACjE,8BACJ,CAEA,2BACI,+DACJ,CAEA,qDACI,sBACJ,CAEA,0BACI,gEAAiE,CACjE,mCACJ,CAEA,gDACI,kBAAmB,CACnB,sBAAuB,CACvB,eACJ,CAEA,sBACI,eACJ,CAEA,8BACI,8BACJ,CACJ","file":"sub_header.css","sourcesContent":["/* CSS for SubHeader */\n\n.SubHeader {\n display: grid;\n grid-template-areas: \"left middle right\" \"bottom bottom bottom\";\n grid-template-columns: auto 1fr auto;\n align-items: baseline;\n margin-bottom: var(--base-size-16);\n}\n\n.SubHeader-rightPane {\n grid-area: right;\n display: flex;\n align-items: center;\n column-gap: 12px;\n}\n\n.SubHeader-middlePane {\n grid-area: middle;\n text-align: center;\n white-space: nowrap;\n}\n\n.SubHeader-bottomPane {\n grid-area: bottom;\n}\n\n.SubHeader-leftPane {\n grid-area: left;\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n row-gap: var(--base-size-16);\n width: 100%;\n\n /* Since the container is not full width (due to the grid around it)\n we want it to grow, and then be limited by the max-width of the \"FormControl-input-width--xy\" class */\n & [class*='FormControl-input-width--'] {\n &:not(.FormControl-input-width--auto) {\n width: 100vw;\n }\n }\n}\n\n.SubHeader-filterContainer {\n display: flex;\n flex-basis: max-content;\n width: 100%;\n gap: 8px;\n}\n\n.SubHeader-filterInput_hiddenClearButton + .FormControl-input-trailingAction {\n display: none;\n}\n\n@media (max-width: 767.98px) {\n .SubHeader {\n grid-template-areas: \"left right\" \"middle middle\" \"bottom bottom\";\n grid-template-columns: 1fr auto;\n }\n\n .SubHeader--expandedSearch {\n grid-template-areas: \"left left\" \"middle middle\" \"bottom bottom\";\n }\n\n .SubHeader--expandedSearch .SubHeader-hiddenOnExpand {\n display: none !important;\n }\n\n .SubHeader--emptyLeftPane {\n grid-template-areas: \"middle middle right\" \"bottom bottom bottom\";\n grid-template-columns: auto 1fr auto;\n }\n\n .SubHeader--emptyLeftPane .SubHeader-middlePane {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n .SubHeader-middlePane {\n text-align: left;\n }\n\n .SubHeader-middlePane:has(> *) {\n margin-top: var(--base-size-16);\n }\n}\n"]}
|
|
@@ -10,7 +10,7 @@ module Primer
|
|
|
10
10
|
module InstanceMethods
|
|
11
11
|
delegate :render, :content_tag, :output_buffer, :capture, to: :@view_context
|
|
12
12
|
|
|
13
|
-
def render_in(view_context, &block)
|
|
13
|
+
def render_in(view_context, **_kwargs, &block)
|
|
14
14
|
@view_context = view_context
|
|
15
15
|
before_render
|
|
16
16
|
perform_render(&block)
|
|
@@ -69,7 +69,7 @@ module Primer
|
|
|
69
69
|
# assumes the presence of a builder so we create our own here. A builder
|
|
70
70
|
# cannot be constructed without a corresponding view context, which is why
|
|
71
71
|
# we have to override render_in and can't create it in the initializer.
|
|
72
|
-
def render_in(view_context, &block)
|
|
72
|
+
def render_in(view_context, **_kwargs, &block)
|
|
73
73
|
@builder = Primer::Forms::Builder.new(
|
|
74
74
|
nil, nil, view_context, {}
|
|
75
75
|
)
|
|
@@ -58,7 +58,6 @@ module Primer
|
|
|
58
58
|
# @!endgroup
|
|
59
59
|
|
|
60
60
|
# @!group Icons and text
|
|
61
|
-
# @label Size small
|
|
62
61
|
# @snapshot
|
|
63
62
|
def icons_and_text_small
|
|
64
63
|
render(Primer::Alpha::SegmentedControl.new("aria-label": "File view", size: :small)) do |component|
|
|
@@ -69,7 +68,6 @@ module Primer
|
|
|
69
68
|
end
|
|
70
69
|
|
|
71
70
|
# @label Size medium
|
|
72
|
-
# @snapshot
|
|
73
71
|
def icons_and_text_medium
|
|
74
72
|
render(Primer::Alpha::SegmentedControl.new("aria-label": "File view", size: :medium)) do |component|
|
|
75
73
|
component.with_item(label: "Preview", icon: :eye, selected: true)
|
|
@@ -81,7 +79,6 @@ module Primer
|
|
|
81
79
|
|
|
82
80
|
# @!group Trailing Label
|
|
83
81
|
# @label Size small
|
|
84
|
-
# @snapshot
|
|
85
82
|
def trailing_label_width_small
|
|
86
83
|
render(Primer::Alpha::SegmentedControl.new("aria-label": "Billing duration", size: :small)) do |component|
|
|
87
84
|
component.with_item(label: "Monthly")
|
|
@@ -92,7 +89,6 @@ module Primer
|
|
|
92
89
|
end
|
|
93
90
|
|
|
94
91
|
# @label Size medium
|
|
95
|
-
# @snapshot
|
|
96
92
|
def trailing_label_width_medium
|
|
97
93
|
render(Primer::Alpha::SegmentedControl.new("aria-label": "Billing duration", size: :medium)) do |component|
|
|
98
94
|
component.with_item(label: "Monthly")
|
|
@@ -6,11 +6,11 @@ module Primer
|
|
|
6
6
|
class BorderBoxPreview < ViewComponent::Preview
|
|
7
7
|
# @label Playground
|
|
8
8
|
#
|
|
9
|
+
# @param list_id text
|
|
9
10
|
# @param padding [Symbol] select [default, condensed, spacious]
|
|
10
11
|
# @param scheme [Symbol] select [default, neutral, info, warning]
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
render(Primer::Beta::BorderBox.new(padding: padding, list_id: list_id)) do |component|
|
|
12
|
+
def playground(padding: :default, scheme: :default, list_id: "my-list")
|
|
13
|
+
render(Primer::Beta::BorderBox.new(padding: padding, list_arguments: { id: list_id })) do |component|
|
|
14
14
|
component.with_header { "Header" }
|
|
15
15
|
component.with_body { "Body" }
|
|
16
16
|
component.with_row(scheme: scheme) { "#{scheme.to_s.capitalize} row one" }
|