Skip to content

Commit 2a01134

Browse files
committed
feat: Implement new workspace management, b=no-bug, c=common, workspaces
1 parent 967d0dd commit 2a01134

File tree

14 files changed

+275
-22
lines changed

14 files changed

+275
-22
lines changed

l10n

src/browser/base/content/zen-assets.inc.xhtml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,4 @@
5555
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenGlanceManager.mjs"></script>
5656
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenMediaController.mjs"></script>
5757
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenDownloadAnimation.mjs"></script>
58+
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenEmojiPicker.mjs"></script>

src/browser/base/content/zen-assets.jar.inc.mn

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
content/browser/zen-components/ZenUIMigration.mjs (../../zen/common/ZenUIMigration.mjs)
1313
content/browser/zen-components/ZenCommonUtils.mjs (../../zen/common/ZenCommonUtils.mjs)
1414
content/browser/zen-components/ZenSessionStore.mjs (../../zen/common/ZenSessionStore.mjs)
15+
content/browser/zen-components/ZenEmojisData.min.mjs (../../zen/common/emojis/ZenEmojisData.min.mjs)
16+
content/browser/zen-components/ZenEmojiPicker.mjs (../../zen/common/emojis/ZenEmojiPicker.mjs)
1517

1618
content/browser/zen-styles/zen-theme.css (../../zen/common/styles/zen-theme.css)
1719
content/browser/zen-styles/zen-buttons.css (../../zen/common/styles/zen-buttons.css)

src/browser/base/content/zen-keysets.inc.xhtml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838

3939
<command id="cmd_zenCtxDeleteWorkspace" />
4040
<command id="cmd_zenChangeWorkspaceName" />
41+
<command id="cmd_zenChangeWorkspaceIcon" />
42+
<command id="cmd_zenOpenWorkspacePanel" />
4143

4244
<command id="cmd_zenPinnedTabReset" />
4345
<command id="cmd_zenPinnedTabResetNoTab" />

src/browser/base/content/zen-popupset.inc.xhtml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,17 @@
7777
</panelmultiview>
7878
</panel>
7979

80+
<panel type="arrow" orient="vertical" id="PanelUI-zen-emojis-picker" position="bottomright topright" side="bottom">
81+
<hbox id="PanelUI-zen-emojis-picker-header">
82+
<html:input type="search" id="PanelUI-zen-emojis-picker-search" placeholder="Search emojis" />
83+
<toolbarbutton id="PanelUI-zen-emojis-picker-none" class="toolbarbutton-1" />
84+
</hbox>
85+
<hbox id="PanelUI-zen-emojis-picker-list" />
86+
</panel>
87+
8088
<menupopup id="zenWorkspaceMoreActions">
8189
<menuitem id="context_zenEditWorkspace" data-l10n-id="zen-workspaces-panel-change-name" command="cmd_zenChangeWorkspaceName"/>
90+
<menuitem id="context_zenEditWorkspaceIcon" data-l10n-id="zen-workspaces-panel-change-icon" command="cmd_zenChangeWorkspaceIcon"/>
8291
<menuitem class="zenToolbarThemePicker"
8392
data-l10n-id="zen-workspaces-change-gradient"
8493
command="cmd_zenOpenZenThemePicker"/>
@@ -91,5 +100,7 @@
91100
<menupopup />
92101
</menu>
93102
<menuseparator/>
103+
<menuitem id="context_zenOpenWorkspacePanel" data-l10n-id="zen-workspaces-panel-context-manage" command="cmd_zenOpenWorkspacePanel"/>
104+
<menuseparator/>
94105
<menuitem id="context_zenDeleteWorkspace" data-l10n-id="zen-workspaces-panel-context-delete" command="cmd_zenCtxDeleteWorkspace"/>
95106
</menupopup>

src/browser/themes/shared/zen-icons/icons.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
.close-icon,
4040
#zen-sidebar-web-panel-close,
4141
#zen-glance-sidebar-close,
42+
#PanelUI-zen-emojis-picker-none,
4243
.zen-theme-picker-custom-list-item-remove {
4344
list-style-image: url('close.svg') !important;
4445
}

src/zen/common/ZenUIManager.mjs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1105,15 +1105,17 @@ var gZenVerticalTabsManager = {
11051105
`);
11061106
label.after(container);
11071107
}
1108-
const containerHtml = isTab
1109-
? this._tabEdited.querySelector('.tab-editor-container')
1110-
: this._tabEdited.parentNode;
11111108
const input = document.createElement('input');
11121109
input.id = 'tab-label-input';
11131110
input.value = isTab ? this._tabEdited.label : this._tabEdited.textContent;
11141111
input.addEventListener('keydown', this.renameTabKeydown.bind(this));
11151112

1116-
containerHtml.appendChild(input);
1113+
if (isTab) {
1114+
const containerHtml = this._tabEdited.querySelector('.tab-editor-container');
1115+
containerHtml.appendChild(input);
1116+
} else {
1117+
this._tabEdited.after(input);
1118+
}
11171119
input.focus();
11181120
input.select();
11191121

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
{
2+
class ZenEmojiPicker extends ZenDOMOperatedFeature {
3+
#panel;
4+
5+
#anchor;
6+
7+
#currentPromise = null;
8+
#currentPromiseResolve = null;
9+
#currentPromiseReject = null;
10+
11+
init() {
12+
this.#panel = document.getElementById('PanelUI-zen-emojis-picker');
13+
this.#panel.addEventListener('popupshowing', this);
14+
this.#panel.addEventListener('popuphidden', this);
15+
document.getElementById('PanelUI-zen-emojis-picker-none').addEventListener('command', this);
16+
this.searchInput.addEventListener('input', this);
17+
}
18+
19+
handleEvent(event) {
20+
switch (event.type) {
21+
case 'popupshowing':
22+
this.#onPopupShowing(event);
23+
break;
24+
case 'popuphidden':
25+
this.#onPopupHidden(event);
26+
break;
27+
case 'command':
28+
if (event.target.id === 'PanelUI-zen-emojis-picker-none') {
29+
this.#selectEmoji(null);
30+
}
31+
break;
32+
case 'input':
33+
this.#onSearchInput(event);
34+
break;
35+
}
36+
}
37+
38+
get #emojis() {
39+
if (this._emojis) {
40+
return this._emojis;
41+
}
42+
const lazy = {};
43+
Services.scriptloader.loadSubScript(
44+
'chrome://browser/content/zen-components/ZenEmojisData.min.mjs',
45+
lazy
46+
);
47+
this._emojis = lazy.ZenEmojisData;
48+
return this._emojis;
49+
}
50+
51+
get emojiList() {
52+
return document.getElementById('PanelUI-zen-emojis-picker-list');
53+
}
54+
55+
get searchInput() {
56+
return document.getElementById('PanelUI-zen-emojis-picker-search');
57+
}
58+
59+
#clearEmojis() {
60+
delete this._emojis;
61+
}
62+
63+
#onSearchInput(event) {
64+
const input = event.target;
65+
const value = input.value.trim().toLowerCase();
66+
// search for emojis.tags and order by emojis.order
67+
const filteredEmojis = this.#emojis
68+
.filter((emoji) => {
69+
return emoji.tags.some((tag) => tag.toLowerCase().includes(value));
70+
})
71+
.sort((a, b) => a.order - b.order);
72+
for (const button of this.emojiList.children) {
73+
const buttonEmoji = button.getAttribute('label');
74+
const emojiObject = filteredEmojis.find((emoji) => emoji.emoji === buttonEmoji);
75+
if (emojiObject) {
76+
button.hidden = !emojiObject.tags.some((tag) => tag.toLowerCase().includes(value));
77+
button.style.order = emojiObject.order;
78+
} else {
79+
button.hidden = true;
80+
}
81+
}
82+
}
83+
84+
#onPopupShowing(event) {
85+
if (event.target !== this.#panel) return;
86+
const emojiList = this.emojiList;
87+
for (const emoji of this.#emojis) {
88+
const item = document.createXULElement('toolbarbutton');
89+
item.className = 'toolbarbutton-1 zen-emojis-picker-emoji';
90+
item.setAttribute('label', emoji.emoji);
91+
item.setAttribute('tooltiptext', emoji.annotation);
92+
item.addEventListener('command', () => {
93+
this.#selectEmoji(emoji.emoji);
94+
});
95+
emojiList.appendChild(item);
96+
}
97+
}
98+
99+
#onPopupHidden(event) {
100+
if (event.target !== this.#panel) return;
101+
this.#clearEmojis();
102+
103+
const emojiList = this.emojiList;
104+
emojiList.innerHTML = '';
105+
106+
if (this.#currentPromiseReject) {
107+
this.#currentPromiseReject(new Error('Emoji picker closed without selection'));
108+
}
109+
110+
this.#currentPromise = null;
111+
this.#currentPromiseResolve = null;
112+
this.#currentPromiseReject = null;
113+
114+
this.#anchor.removeAttribute('zen-emoji-open');
115+
this.#anchor = null;
116+
}
117+
118+
#selectEmoji(emoji) {
119+
this.#currentPromiseResolve?.(emoji);
120+
this.#panel.hidePopup();
121+
}
122+
123+
open(anchor) {
124+
if (this.#currentPromise) {
125+
return null;
126+
}
127+
this.#currentPromise = new Promise((resolve, reject) => {
128+
this.#currentPromiseResolve = resolve;
129+
this.#currentPromiseReject = reject;
130+
});
131+
this.#anchor = anchor;
132+
this.#anchor.setAttribute('zen-emoji-open', 'true');
133+
this.#panel.openPopup(anchor, 'after_start', 0, 0, false, false);
134+
return this.#currentPromise;
135+
}
136+
}
137+
138+
window.gZenEmojiPicker = new ZenEmojiPicker();
139+
}

src/zen/common/emojis/ZenEmojisData.min.mjs

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

src/zen/common/styles/zen-single-components.css

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,52 @@ body > #confetti {
3535
#PersonalToolbar:not([collapsed='true']) {
3636
min-height: 30px;
3737
}
38+
39+
/* Emojis picker */
40+
41+
#PanelUI-zen-emojis-picker {
42+
--panel-width: 250px;
43+
--panel-padding: 10px;
44+
45+
&::part(content) {
46+
gap: 15px;
47+
}
48+
49+
#PanelUI-zen-emojis-picker-header {
50+
gap: 10px;
51+
align-items: center;
52+
}
53+
54+
#PanelUI-zen-emojis-picker-none label {
55+
display: none;
56+
}
57+
58+
#PanelUI-zen-emojis-picker-list {
59+
flex-wrap: wrap;
60+
max-height: 265px;
61+
overflow-y: auto;
62+
overflow-x: hidden;
63+
64+
gap: 5px;
65+
display: grid;
66+
grid-template-columns: repeat(auto-fill, minmax(22px, 1fr));
67+
68+
.zen-emojis-picker-emoji {
69+
& image {
70+
display: none;
71+
}
72+
}
73+
}
74+
75+
.zen-emojis-picker-emoji,
76+
#PanelUI-zen-emojis-picker-none {
77+
width: 22px;
78+
height: 22px;
79+
80+
&:hover {
81+
background-color: light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.1));
82+
border-radius: 4px;
83+
cursor: pointer;
84+
}
85+
}
86+
}

0 commit comments

Comments
 (0)