From e770bf19e31f1118dea66b42a4ee9d10cbc7db28 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Thu, 25 Jul 2024 15:03:44 +0700 Subject: [PATCH 01/14] Add develop to build targets --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a2fef0870d..c9d9ea3d60 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,11 +10,11 @@ concurrency: on: # Triggers the workflow on push or pull request events but only for the main branch push: - branches: [main] + branches: [develop, main] tags: - v* pull_request: - branches: [main] + branches: [develop, main] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: From 14880c6f06b181f25b3713522f24e90551b9c83a Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Thu, 25 Jul 2024 18:13:26 +0700 Subject: [PATCH 02/14] Disable Websocket compression by default --- server/server/src/starter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/server/src/starter.ts b/server/server/src/starter.ts index 8d87611c7f..0faabb2051 100644 --- a/server/server/src/starter.ts +++ b/server/server/src/starter.ts @@ -18,7 +18,7 @@ export interface ServerEnv { export function serverConfigFromEnv (): ServerEnv { const serverPort = parseInt(process.env.SERVER_PORT ?? '3333') - const enableCompression = (process.env.ENABLE_COMPRESSION ?? 'true') === 'true' + const enableCompression = (process.env.ENABLE_COMPRESSION ?? 'false') === 'true' const url = process.env.MONGO_URL if (url === undefined) { From 22fba992368ff013d0dea3e4fc8eb8ac2b79e865 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Thu, 25 Jul 2024 18:51:53 +0700 Subject: [PATCH 03/14] UBERF-7665: Fix OOM in sharp (#6138) Signed-off-by: Andrey Sobolev --- packages/presentation/src/preview.ts | 6 +- .../src/components/viewer/ImageViewer.svelte | 1 - server/front/src/index.ts | 103 ++++++++++++------ 3 files changed, 69 insertions(+), 41 deletions(-) diff --git a/packages/presentation/src/preview.ts b/packages/presentation/src/preview.ts index f97b146c7d..4233c89a2e 100644 --- a/packages/presentation/src/preview.ts +++ b/packages/presentation/src/preview.ts @@ -52,11 +52,7 @@ export function parsePreviewConfig (config?: string): PreviewConfig | undefined if (c === '') { continue // Skip empty lines } - const vars = c.split('|') - let [provider, url, formats, contentTypes] = c.split('|').map((it) => it.trim()) - if (vars.length === 3) { - contentTypes = formats // Backward compatibility, since formats are obsolete - } + const [provider, url, contentTypes] = c.split('|').map((it) => it.trim()) const p: ProviderPreviewConfig = { providerId: provider, previewUrl: url, diff --git a/plugins/view-resources/src/components/viewer/ImageViewer.svelte b/plugins/view-resources/src/components/viewer/ImageViewer.svelte index e0dc9493b5..5c7b510a25 100644 --- a/plugins/view-resources/src/components/viewer/ImageViewer.svelte +++ b/plugins/view-resources/src/components/viewer/ImageViewer.svelte @@ -44,7 +44,6 @@ style:max-width={width} style:max-height={height} src={blobRef.src} - srcset={blobRef.srcset} alt={name} style:height={loading ? '0' : ''} /> diff --git a/server/front/src/index.ts b/server/front/src/index.ts index b630d25891..50c41d0cd2 100644 --- a/server/front/src/index.ts +++ b/server/front/src/index.ts @@ -31,7 +31,9 @@ import sharp from 'sharp' import { v4 as uuid } from 'uuid' import { preConditions } from './utils' -import fs from 'fs' +import fs, { createReadStream, mkdtempSync } from 'fs' +import { rm, writeFile } from 'fs/promises' +import { tmpdir } from 'os' const cacheControlValue = 'public, max-age=365d' const cacheControlNoCache = 'public, no-store, no-cache, must-revalidate, max-age=0' @@ -126,12 +128,11 @@ async function getFileRange ( dataStream.on('error', (err) => { ctx.error('error receive stream', { workspace: workspace.name, uuid, error: err }) Analytics.handleError(err) + res.end() + dataStream.destroy() reject(err) }) - dataStream.on('close', () => { - res.end() - }) }) } catch (err: any) { if (err?.code === 'NoSuchKey' || err?.code === 'NotFound') { @@ -169,7 +170,8 @@ async function getFile ( 'content-type': stat.contentType, etag: stat.etag, 'last-modified': new Date(stat.modifiedOn).toISOString(), - 'cache-control': cacheControlValue + 'cache-control': cacheControlValue, + Connection: 'keep-alive' }) res.end() return @@ -180,7 +182,8 @@ async function getFile ( 'content-type': stat.contentType, etag: stat.etag, 'last-modified': new Date(stat.modifiedOn).toISOString(), - 'cache-control': cacheControlValue + 'cache-control': cacheControlValue, + Connection: 'keep-alive' }) res.end() return @@ -196,7 +199,8 @@ async function getFile ( 'Content-Type': stat.contentType, Etag: stat.etag, 'Last-Modified': new Date(stat.modifiedOn).toISOString(), - 'Cache-Control': cacheControlValue + 'Cache-Control': cacheControlValue, + Connection: 'keep-alive' }) dataStream.pipe(res) @@ -209,6 +213,9 @@ async function getFile ( dataStream.on('error', function (err) { Analytics.handleError(err) ctx.error('error', { err }) + + res.end() + dataStream.destroy() reject(err) }) }) @@ -249,17 +256,21 @@ export function start ( ): () => void { const app = express() + const tempFileDir = mkdtempSync(join(tmpdir(), 'front-')) + let temoFileIndex = 0 + app.use(cors()) app.use( fileUpload({ - useTempFiles: true + useTempFiles: true, + tempFileDir }) ) app.use(bp.json()) app.use(bp.urlencoded({ extended: true })) const childLogger = ctx.logger.childLogger?.('requests', { - enableConsole: 'false' + enableConsole: 'true' }) const requests = ctx.newChild('requests', {}, {}, childLogger) @@ -383,7 +394,7 @@ export function start ( ) if (blobInfo === undefined) { - ctx.error('No such key', { file: uuid, workspace: payload.workspace }) + ctx.error('No such key', { file: uuid, workspace: payload.workspace.name }) res.status(404).send() return } @@ -417,12 +428,14 @@ export function start ( const size = req.query.size !== undefined ? parseInt(req.query.size as string) : undefined const accept = req.headers.accept - if (accept !== undefined && isImage && blobInfo.contentType !== 'image/gif') { + if (accept !== undefined && isImage && blobInfo.contentType !== 'image/gif' && size !== undefined) { blobInfo = await ctx.with( 'resize', {}, async (ctx) => - await getGeneratePreview(ctx, blobInfo as PlatformBlob, size ?? -1, uuid, config, payload, accept) + await getGeneratePreview(ctx, blobInfo as PlatformBlob, size, uuid, config, payload, accept, () => + join(tempFileDir, `${++temoFileIndex}`) + ) ) } @@ -746,7 +759,8 @@ async function getGeneratePreview ( uuid: string, config: { storageAdapter: StorageAdapter }, payload: Token, - accept: string + accept: string, + tempFile: () => string ): Promise { if (size === undefined) { return blob @@ -769,6 +783,14 @@ async function getGeneratePreview ( return blob } + if (size === -1) { + size = 2048 + } + + if (size > 2048) { + size = 2048 + } + const sizeId = uuid + `%preview%${size}${format !== 'jpeg' ? format : ''}` const d = await config.storageAdapter.stat(ctx, payload.workspace, sizeId) @@ -778,54 +800,61 @@ async function getGeneratePreview ( // We have cached small document, let's proceed with it. return d } else { - let data: Buffer + const files: string[] = [] try { // Let's get data and resize it - data = Buffer.concat(await config.storageAdapter.read(ctx, payload.workspace, uuid)) - - let pipeline = sharp(data) + const fname = tempFile() + files.push(fname) + await writeFile(fname, await config.storageAdapter.get(ctx, payload.workspace, uuid)) + let pipeline = sharp(fname) sharp.cache(false) - // const metadata = await pipeline.metadata() - - if (size !== -1) { - pipeline = pipeline.resize({ - width: size, - fit: 'cover', - withoutEnlargement: true - }) - } + pipeline = pipeline.resize({ + width: size, + fit: 'cover', + withoutEnlargement: true + }) let contentType = 'image/jpeg' switch (format) { case 'jpeg': - pipeline = pipeline.jpeg({}) + pipeline = pipeline.jpeg({ + progressive: true + }) contentType = 'image/jpeg' break case 'avif': pipeline = pipeline.avif({ - quality: size !== undefined && size < 128 ? undefined : 85 + lossless: false, + effort: 0 }) contentType = 'image/avif' break case 'heif': pipeline = pipeline.heif({ - quality: size !== undefined && size < 128 ? undefined : 80 + effort: 0 }) contentType = 'image/heif' break case 'webp': - pipeline = pipeline.webp() + pipeline = pipeline.webp({ + effort: 0 + }) contentType = 'image/webp' break case 'png': - pipeline = pipeline.png() + pipeline = pipeline.png({ + effort: 0 + }) contentType = 'image/png' break } - const dataBuff = await pipeline.toBuffer() + const outFile = tempFile() + files.push(outFile) + + const dataBuff = await ctx.with('resize', { contentType }, async () => await pipeline.toFile(outFile)) pipeline.destroy() // Add support of avif as well. @@ -833,14 +862,14 @@ async function getGeneratePreview ( ctx, payload.workspace, sizeId, - dataBuff, + createReadStream(outFile), contentType, - dataBuff.length + dataBuff.size ) return { ...blob, _id: sizeId as Ref, - size: dataBuff.length, + size: dataBuff.size, contentType, etag: upload.etag, storageId: sizeId @@ -858,6 +887,10 @@ async function getGeneratePreview ( // Return original in case of error return blob + } finally { + for (const f of files) { + await rm(f) + } } } } From 75c125cc9abf8fbc0bf179eda9261aa5b4d19934 Mon Sep 17 00:00:00 2001 From: Abigail Dawson <145867967+AbigailDawson@users.noreply.github.com> Date: Thu, 25 Jul 2024 11:13:48 -0400 Subject: [PATCH 04/14] Fix capitalization in en lang strings, fix label for adding an issue to a Milestone (#6142) Signed-off-by: Abigail Dawson --- plugins/document-assets/lang/en.json | 4 +-- plugins/tracker-assets/lang/en.json | 28 +++++++++---------- .../issues/edit/QueryIssuesList.svelte | 2 +- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/plugins/document-assets/lang/en.json b/plugins/document-assets/lang/en.json index a8a2b51890..76c77d4a14 100644 --- a/plugins/document-assets/lang/en.json +++ b/plugins/document-assets/lang/en.json @@ -3,7 +3,7 @@ "Document": "Document", "ParentDocument": "Parent document", "ChildDocument": "Child document", - "CreateDocument": "Create a document", + "CreateDocument": "Create document", "Documents": "Documents", "CreateAnVersion": "Create new version", "DocumentNamePlaceholder": "Untitled", @@ -38,7 +38,7 @@ "Description": "Description", - "CopyDocumentUrl": "Copy Document URL to clipboard", + "CopyDocumentUrl": "Copy document URL to clipboard", "ViewMode": "View", "EditMode": "Edit", diff --git a/plugins/tracker-assets/lang/en.json b/plugins/tracker-assets/lang/en.json index d3980a6ff2..fc09fd1740 100644 --- a/plugins/tracker-assets/lang/en.json +++ b/plugins/tracker-assets/lang/en.json @@ -45,11 +45,11 @@ "UsedInIssueIDs": "Used in issue IDs", "Identifier": "Identifier", "Import": "Import", - "ProjectIdentifier": "Project Identifier", + "ProjectIdentifier": "Project identifier", "IdentifierExists": "Project identifier already exists", "ProjectIdentifierPlaceholder": "PRJCT", "ChooseIcon": "Choose icon", - "AddIssue": "Add Issue", + "AddIssue": "Add issue", "NewIssue": "New issue", "NewIssuePlaceholder": "New", "ResumeDraft": "Resume draft", @@ -103,7 +103,7 @@ "ModificationDate": "Updated {value}", "Project": "Project", "Issue": "Issue", - "SubIssue": "Sub-Issue", + "SubIssue": "Sub-issue", "Document": "", "DocumentIcon": "", "DocumentColor": "", @@ -129,10 +129,10 @@ "All": "All", "PastWeek": "Past week", "PastMonth": "Past month", - "CopyIssueUrl": "Copy Issue URL to clipboard", - "CopyIssueId": "Copy Issue ID to clipboard", + "CopyIssueUrl": "Copy issue URL to clipboard", + "CopyIssueId": "Copy issue ID to clipboard", "CopyIssueBranch": "Copy Git branch name to clipboard", - "CopyIssueTitle": "Copy Issue title to clipboard", + "CopyIssueTitle": "Copy issue title to clipboard", "AssetLabel": "Asset", "AddToComponent": "Add to component\u2026", "MoveToComponent": "Move to component\u2026", @@ -221,12 +221,12 @@ "NewMilestone": "New Milestone", "CreateMilestone": "Create", - "MoveAndDeleteMilestone": "Move Issues to {newMilestone} and Delete {deleteMilestone}", + "MoveAndDeleteMilestone": "Move issues to {newMilestone} and delete {deleteMilestone}", "MoveAndDeleteMilestoneConfirm": "Do you want to delete milestone and move issues to another milestone?", "Estimation": "Estimation", "ReportedTime": "Spent time", - "RemainingTime": "Remaining Time", + "RemainingTime": "Remaining time", "TimeSpendReports": "Time spent reports", "TimeSpendReport": "Time", "TimeSpendReportAdd": "Add time report", @@ -237,8 +237,8 @@ "TimeSpendDays": "{value}d", "TimeSpendHours": "{value}h", "TimeSpendMinutes": "{value}m", - "ChildEstimation": "Subissues Estimation", - "ChildReportedTime": "Subissues Time", + "ChildEstimation": "Sub-issues estimation", + "ChildReportedTime": "Sub-issues time", "CapacityValue": "of {value}d", "NewRelatedIssue": "New related issue", "RelatedIssuesNotFound": "Related issues not found", @@ -249,9 +249,9 @@ "IssueTemplate": "Template", "IssueTemplates": "Templates", - "NewProcess": "New Template", - "SaveProcess": "Save Template", - "NoIssueTemplate": "No Template", + "NewProcess": "New template", + "SaveProcess": "Save template", + "NoIssueTemplate": "No template", "TemplateReplace": "Do you want to apply the new template?", "TemplateReplaceConfirm": "All fields will be overwritten by the new template values", "Apply": "Apply", @@ -284,7 +284,7 @@ "PreviousAssigned": "Previously assigned", "IssueAssigneedToYou": "Assigned to you", "RelatedIssueTargetDescription": "Related issue project target for Class or Space", - "MapRelatedIssues": "Configure Related issue default projects", + "MapRelatedIssues": "Configure related issue default projects", "DefaultIssueStatus": "Default issue status", "IssueStatus": "Status", "Extensions": "Extensions", diff --git a/plugins/tracker-resources/src/components/issues/edit/QueryIssuesList.svelte b/plugins/tracker-resources/src/components/issues/edit/QueryIssuesList.svelte index 562778357c..a9b4a76759 100644 --- a/plugins/tracker-resources/src/components/issues/edit/QueryIssuesList.svelte +++ b/plugins/tracker-resources/src/components/issues/edit/QueryIssuesList.svelte @@ -30,7 +30,7 @@ export let createParams: Record = {} export let viewletId = tracker.viewlet.SubIssues - export let createLabel = tracker.string.CreatedIssue + export let createLabel = tracker.string.AddIssue export let hasSubIssues = false let isCollapsed = false From 1329fb1d7ab74ab655bee71b1a2c2bf702037e96 Mon Sep 17 00:00:00 2001 From: Alexander Platov Date: Thu, 25 Jul 2024 18:16:08 +0300 Subject: [PATCH 05/14] Rebase (#6088) Signed-off-by: Alexander Platov --- models/calendar/src/index.ts | 2 +- models/controlled-documents/src/index.ts | 1 + models/document/src/index.ts | 1 + models/drive/src/index.ts | 4 +- models/lead/src/index.ts | 5 +- models/love/src/index.ts | 1 - models/products/src/index.ts | 2 + models/recruit/src/index.ts | 1 + models/setting/src/index.ts | 3 +- models/time/src/index.ts | 1 - models/tracker/src/index.ts | 4 + packages/panel/src/components/Panel.svelte | 23 ++- .../src/components/SpacesMultiPopup.svelte | 26 +-- packages/theme/styles/_layouts.scss | 15 +- packages/theme/styles/_lumia-colors.scss | 4 + packages/theme/styles/button.scss | 5 +- packages/theme/styles/common.scss | 26 ++- packages/theme/styles/components.scss | 109 +++++++++-- packages/theme/styles/panel.scss | 22 +-- packages/theme/styles/popups.scss | 7 +- packages/ui/src/components/Breadcrumbs.svelte | 18 +- packages/ui/src/components/Button.svelte | 2 + packages/ui/src/components/ButtonBase.svelte | 7 +- packages/ui/src/components/ButtonIcon.svelte | 9 +- packages/ui/src/components/ButtonMenu.svelte | 4 + .../ui/src/components/DropdownLabels.svelte | 8 +- packages/ui/src/components/Header.svelte | 177 +++++++++++++++--- packages/ui/src/components/Modal.svelte | 15 +- .../ui/src/components/ModeSelector.svelte | 27 ++- .../ui/src/components/ModernButton.svelte | 10 + .../ui/src/components/ModernEditbox.svelte | 1 + packages/ui/src/components/NavItem.svelte | 2 +- packages/ui/src/components/Panel.svelte | 98 ++++++---- .../ui/src/components/PanelInstance.svelte | 2 - packages/ui/src/components/SearchInput.svelte | 90 ++++++--- packages/ui/src/components/Switcher.svelte | 55 ++++++ .../ui/src/components/SwitcherBase.svelte | 116 ++++++++++++ packages/ui/src/components/TabList.svelte | 4 +- .../ui/src/components/icons/Filter.svelte | 8 +- packages/ui/src/index.ts | 4 + packages/ui/src/types.ts | 11 +- .../ActivityMessageTemplate.svelte | 2 +- plugins/attachment-assets/lang/en.json | 2 +- plugins/attachment-assets/lang/es.json | 2 +- plugins/attachment-assets/lang/fr.json | 2 +- plugins/attachment-assets/lang/pt.json | 2 +- plugins/attachment-assets/lang/ru.json | 2 +- plugins/attachment-assets/lang/zh.json | 2 +- .../src/components/AttachmentsListView.svelte | 3 +- .../src/components/FileBrowser.svelte | 30 +-- .../src/components/FileBrowserFilters.svelte | 2 +- .../src/components/FileBrowserSortMenu.svelte | 23 +-- plugins/calendar-assets/assets/icons.svg | 3 + plugins/calendar-assets/src/index.ts | 1 + .../src/components/Events.svelte | 36 ++-- plugins/calendar/src/index.ts | 1 + plugins/chunter-assets/assets/icons.svg | 26 ++- plugins/chunter-assets/src/index.ts | 5 +- .../src/components/ChannelHeader.svelte | 55 +++--- .../components/ChannelMessagesFilter.svelte | 10 +- .../src/components/ChannelPanel.svelte | 4 +- .../src/components/ChannelScrollView.svelte | 2 +- .../src/components/ChannelView.svelte | 7 +- .../src/components/Header.svelte | 168 +++++++++-------- .../src/components/PinnedMessages.svelte | 3 +- .../src/components/chat/Chat.svelte | 42 ++++- .../src/components/chat/ChatAside.svelte | 2 +- .../chat/navigator/ChatNavigator.svelte | 2 +- .../chat/specials/ChunterBrowser.svelte | 134 +++++++------ .../chat/specials/MessagesBrowser.svelte | 2 +- .../chat/specials/SavedMessages.svelte | 96 +++++----- .../src/components/chat/utils.ts | 8 +- .../src/components/threads/ThreadView.svelte | 92 +++------ .../src/components/threads/Threads.svelte | 22 +-- plugins/chunter/src/index.ts | 5 +- plugins/contact-assets/assets/icons.svg | 6 + plugins/contact-assets/src/index.ts | 3 +- .../src/components/EmployeeBrowser.svelte | 26 +-- .../src/components/Members.svelte | 2 +- .../src/components/UserInfo.svelte | 2 +- plugins/contact/src/index.ts | 3 +- .../src/components/Categories.svelte | 78 ++++---- .../src/components/DocumentTemplates.svelte | 6 +- .../src/components/Documents.svelte | 5 +- .../src/components/DocumentsContainer.svelte | 5 +- .../src/components/EditDocPanel.svelte | 10 +- .../src/components/MyDocuments.svelte | 1 + .../right-panel/RightPanelTabHeader.svelte | 2 +- .../src/components/EditDoc.svelte | 3 +- plugins/drive-assets/assets/icons.svg | 27 ++- plugins/drive-assets/src/index.ts | 2 + .../src/components/DrivePanel.svelte | 48 ++--- .../src/components/EditFolder.svelte | 2 +- .../src/components/FileHeader.svelte | 2 +- .../src/components/FilePanel.svelte | 3 +- .../src/components/FolderBrowser.svelte | 67 +++++-- .../src/components/FolderPanel.svelte | 47 ++--- .../src/components/Thumbnail.svelte | 2 +- plugins/drive/src/plugin.ts | 2 + .../src/components/Schedule.svelte | 173 ++++++++++++----- .../src/components/ScheduleView.svelte | 7 + .../components/schedule/MonthTableView.svelte | 91 ++------- .../src/components/sidebar/Sidebar.svelte | 3 +- .../src/components/Categories.svelte | 27 ++- plugins/lead-assets/assets/icons.svg | 8 +- plugins/lead-assets/src/index.ts | 1 + .../src/components/MyLeads.svelte | 70 +++---- plugins/lead/src/index.ts | 1 + plugins/love-assets/assets/icons.svg | 20 +- .../src/components/Floor.svelte | 2 +- .../src/components/FloorConfigure.svelte | 2 +- .../src/components/Floors.svelte | 2 +- .../love-resources/src/components/Hall.svelte | 3 +- .../src/components/inbox/Inbox.svelte | 62 +++--- .../inbox/InboxGroupedListView.svelte | 3 + plugins/products-assets/assets/icons.svg | 4 +- .../product-version/EditProductVersion.svelte | 10 +- .../src/components/product/EditProduct.svelte | 1 + .../src/components/Applications.svelte | 2 +- .../src/components/Organizations.svelte | 35 ++-- .../src/components/Vacancies.svelte | 50 ++--- .../src/components/VacancyApplications.svelte | 2 +- .../src/components/Integrations.svelte | 14 +- .../src/components/Owners.svelte | 8 +- .../src/components/CategoryBar.svelte | 87 ++++----- .../src/components/TagsView.svelte | 38 ++-- plugins/task-assets/assets/icons.svg | 8 +- .../src/components/AssignedTasks.svelte | 60 +++--- .../src/components/StatusTableView.svelte | 22 +-- .../src/components/TypeSelector.svelte | 1 + .../src/components/TypesView.svelte | 37 ++-- .../taskTypes/TaskKindSelector.svelte | 10 +- .../src/components/EditToDo.svelte | 15 +- .../src/components/Header.svelte | 79 ++++---- .../src/components/PlanView.svelte | 5 +- .../src/components/PlanningCalendar.svelte | 5 +- .../src/components/ToDos.svelte | 2 +- .../src/components/team/Team.svelte | 77 ++++++-- .../src/components/team/TeamNavigator.svelte | 9 +- .../components/team/calendar/Calendar.svelte | 46 ++--- .../components/ComponentBrowser.svelte | 75 +++----- .../src/components/issues/Issues.svelte | 5 +- .../src/components/issues/IssuesView.svelte | 72 +++---- .../components/issues/edit/EditIssue.svelte | 3 +- .../issues/edit/QueryIssuesList.svelte | 2 +- .../milestones/MilestoneBrowser.svelte | 73 +++----- .../src/components/myissues/MyIssues.svelte | 5 +- .../templates/IssueTemplatesView.svelte | 49 +---- plugins/tracker-resources/src/index.ts | 3 +- .../components/TrainingAttemptPanel.svelte | 11 +- .../src/components/TrainingPanel.svelte | 11 +- .../components/TrainingRequestPanel.svelte | 11 +- plugins/view-assets/assets/icons.svg | 21 +-- .../src/components/SpaceHeader.svelte | 66 ++++--- .../src/components/ViewOptionsButton.svelte | 25 ++- .../src/components/ViewletPanelHeader.svelte | 50 ++--- .../src/components/ViewletSelector.svelte | 7 +- .../components/ViewletSettingButton.svelte | 41 ++-- .../components/ViewletsSettingButton.svelte | 21 ++- .../src/components/filter/FilterBar.svelte | 12 +- .../src/components/filter/FilterButton.svelte | 10 +- .../components/navigator/TreeElement.svelte | 2 + .../src/components/navigator/TreeItem.svelte | 2 + .../src/components/navigator/TreeNode.svelte | 2 + .../src/components/NavHeader.svelte | 3 +- .../src/components/ServerManager.svelte | 2 +- .../src/components/SpaceHeader.svelte | 86 ++++++--- .../src/components/SpecialView.svelte | 59 +++--- .../src/components/Workbench.svelte | 77 ++++---- plugins/workbench/src/index.ts | 1 - .../tests/model/documents/categories-page.ts | 2 +- .../model/documents/category-details-page.ts | 2 +- .../model/documents/document-content-page.ts | 16 +- .../tests/model/documents/templates-page.ts | 2 +- .../sanity/tests/model/left-side-menu-page.ts | 2 +- tests/sanity/tests/model/channel-page.ts | 4 +- .../tests/model/contacts/contract-page.ts | 2 +- .../model/documents/document-content-page.ts | 4 +- .../recruiting/applications-details-page.ts | 4 +- .../model/recruiting/applications-page.ts | 5 +- .../recruiting/common-recruiting-page.ts | 2 +- .../tests/model/recruiting/companies-page.ts | 4 +- .../tests/model/recruiting/talents-page.ts | 6 +- .../tests/model/recruiting/vacancies-page.ts | 2 +- .../model/tracker/common-tracker-page.ts | 18 +- .../model/tracker/issues-details-page.ts | 2 +- .../sanity/tests/model/tracker/issues-page.ts | 16 +- .../tests/model/tracker/milestones-page.ts | 8 +- tests/sanity/tests/tracker/component.spec.ts | 1 + tests/sanity/tests/tracker/issues.spec.ts | 2 + tests/sanity/tests/tracker/tracker.spec.ts | 3 + tests/sanity/tests/tracker/tracker.utils.ts | 20 +- tests/sanity/tests/utils.ts | 1 + 193 files changed, 2392 insertions(+), 1727 deletions(-) create mode 100644 packages/ui/src/components/Switcher.svelte create mode 100644 packages/ui/src/components/SwitcherBase.svelte diff --git a/models/calendar/src/index.ts b/models/calendar/src/index.ts index bc3d01d9ae..39048eee9d 100644 --- a/models/calendar/src/index.ts +++ b/models/calendar/src/index.ts @@ -259,7 +259,7 @@ export function createModel (builder: Builder): void { core.space.Model, { label: calendar.string.Calendar, - icon: calendar.icon.Calendar, + icon: calendar.icon.CalendarView, component: calendar.component.CalendarView }, calendar.viewlet.Calendar diff --git a/models/controlled-documents/src/index.ts b/models/controlled-documents/src/index.ts index d095828e9f..5bac1d3661 100644 --- a/models/controlled-documents/src/index.ts +++ b/models/controlled-documents/src/index.ts @@ -181,6 +181,7 @@ export function createModel (builder: Builder): void { query: { [documents.mixin.DocumentTemplate]: { $exists: false } }, + icon: documents.icon.Library, title: documents.string.Documents, config: [ ['effective', documents.string.Effective, {}], diff --git a/models/document/src/index.ts b/models/document/src/index.ts index 7ffab05254..a3f167cc0e 100644 --- a/models/document/src/index.ts +++ b/models/document/src/index.ts @@ -533,6 +533,7 @@ function defineApplication (builder: Builder): void { component: workbench.component.SpecialView, componentProps: { _class: document.class.Teamspace, + icon: view.icon.List, label: document.string.Teamspaces }, position: 'top' diff --git a/models/drive/src/index.ts b/models/drive/src/index.ts index c7830fcc62..2795f36780 100644 --- a/models/drive/src/index.ts +++ b/models/drive/src/index.ts @@ -657,7 +657,7 @@ function defineApplication (builder: Builder): void { core.space.Model, { label: drive.string.Drive, - icon: drive.icon.Drive, + icon: drive.icon.DriveApplication, alias: driveId, hidden: false, locationResolver: drive.resolver.Location, @@ -667,7 +667,7 @@ function defineApplication (builder: Builder): void { id: 'browser', accessLevel: AccountRole.User, label: drive.string.Drives, - icon: view.icon.List, + icon: drive.icon.Drives, component: workbench.component.SpecialView, componentProps: { _class: drive.class.Drive, diff --git a/models/lead/src/index.ts b/models/lead/src/index.ts index 3dc47ab40a..b1d9057dd0 100644 --- a/models/lead/src/index.ts +++ b/models/lead/src/index.ts @@ -117,7 +117,7 @@ export function createModel (builder: Builder): void { accessLevel: AccountRole.User, componentProps: { _class: lead.mixin.Customer, - icon: lead.icon.Lead, + icon: contact.icon.Person, label: lead.string.Customers }, position: 'top' @@ -125,12 +125,13 @@ export function createModel (builder: Builder): void { { id: 'funnels', component: workbench.component.SpecialView, - icon: view.icon.List, + icon: lead.icon.Funnels, label: lead.string.Funnels, position: 'bottom', accessLevel: AccountRole.User, componentProps: { _class: lead.class.Funnel, + icon: lead.icon.Funnels, label: lead.string.Funnels, createComponent: lead.component.CreateFunnel, createLabel: lead.string.CreateFunnel diff --git a/models/love/src/index.ts b/models/love/src/index.ts index f0752ee818..4732183984 100644 --- a/models/love/src/index.ts +++ b/models/love/src/index.ts @@ -141,7 +141,6 @@ export function createModel (builder: Builder): void { alias: loveId, hidden: false, position: 'top', - modern: true, component: love.component.Main }, love.app.Love diff --git a/models/products/src/index.ts b/models/products/src/index.ts index bb35bd17bd..680b956c73 100644 --- a/models/products/src/index.ts +++ b/models/products/src/index.ts @@ -455,6 +455,7 @@ function defineApplication (builder: Builder): void { component: workbench.component.SpecialView, componentProps: { _class: products.class.Product, + icon: products.icon.Product, label: products.string.Products }, position: 'top' @@ -466,6 +467,7 @@ function defineApplication (builder: Builder): void { component: workbench.component.SpecialView, componentProps: { _class: products.class.ProductVersion, + icon: products.icon.ProductVersion, label: products.string.ProductVersions }, position: 'top' diff --git a/models/recruit/src/index.ts b/models/recruit/src/index.ts index 03100bdb56..50c7823292 100644 --- a/models/recruit/src/index.ts +++ b/models/recruit/src/index.ts @@ -226,6 +226,7 @@ export function createModel (builder: Builder): void { position: 'event', componentProps: { labelTasks: recruit.string.Applications, + icon: recruit.icon.AssignedToMe, _class: recruit.class.Applicant, config: [ ['assigned', view.string.Assigned, {}], diff --git a/models/setting/src/index.ts b/models/setting/src/index.ts index d5b8263868..866d646ec1 100644 --- a/models/setting/src/index.ts +++ b/models/setting/src/index.ts @@ -349,8 +349,7 @@ export function createModel (builder: Builder): void { icon: setting.icon.Setting, alias: settingId, hidden: true, - component: setting.component.Settings, - modern: true + component: setting.component.Settings }, setting.ids.SettingApp ) diff --git a/models/time/src/index.ts b/models/time/src/index.ts index 7eebe98c1c..77ad3f89fa 100644 --- a/models/time/src/index.ts +++ b/models/time/src/index.ts @@ -197,7 +197,6 @@ export function createModel (builder: Builder): void { alias: timeId, hidden: false, position: 'top', - modern: true, component: time.component.Me }, time.app.Me diff --git a/models/tracker/src/index.ts b/models/tracker/src/index.ts index 4c1e404641..b41eb03e95 100644 --- a/models/tracker/src/index.ts +++ b/models/tracker/src/index.ts @@ -324,6 +324,7 @@ function defineApplication ( icon: tracker.icon.MyIssues, component: tracker.component.MyIssues, componentProps: { + icon: tracker.icon.MyIssues, config: [ ['assigned', view.string.Assigned, {}], ['active', tracker.string.Active, {}], @@ -341,6 +342,7 @@ function defineApplication ( component: tracker.component.Issues, componentProps: { space: undefined, + icon: tracker.icon.Issues, title: tracker.string.AllIssues, config: [ ['all', tracker.string.All, {}], @@ -360,6 +362,7 @@ function defineApplication ( spaceClass: tracker.class.Project, componentProps: { _class: tracker.class.Project, + icon: view.icon.List, label: tracker.string.AllProjects } } @@ -380,6 +383,7 @@ function defineApplication ( icon: tracker.icon.Issues, component: tracker.component.Issues, componentProps: { + icon: tracker.icon.Issues, title: tracker.string.Issues, config: [ ['all', tracker.string.All, {}], diff --git a/packages/panel/src/components/Panel.svelte b/packages/panel/src/components/Panel.svelte index 3f75b7fbc2..7498f611fb 100644 --- a/packages/panel/src/components/Panel.svelte +++ b/packages/panel/src/components/Panel.svelte @@ -45,9 +45,14 @@ export let withoutContentScroll: boolean = false export let customAside: ButtonItem[] | undefined = undefined export let selectedAside: string | boolean = customAside ? customAside[0].id : isAside - export let kind: 'default' | 'modern' = 'default' - export let printHeader = true - export let printAside = false + export let printHeader: boolean = true + export let printAside: boolean = false + export let adaptive: 'default' | 'freezeActions' | 'doubleRow' | 'disabled' = 'disabled' + export let hideBefore: boolean = false + export let hideSearch: boolean = true + export let hideActions: boolean = false + export let hideExtra: boolean = false + export let overflowExtra: boolean = false export function getAside (): string | boolean { return panel.getAside() @@ -115,13 +120,18 @@ on:close {allowClose} {embedded} - {kind} {floatAside} bind:useMaxWidth {isFullSize} {customAside} {printHeader} {printAside} + {adaptive} + {hideBefore} + {hideSearch} + {hideActions} + {hideExtra} + {overflowExtra} bind:selectedAside on:select={(result) => { selectedAside = result.detail @@ -144,7 +154,6 @@ {#if isUtils && $$slots.utils} -
{/if} @@ -196,6 +205,10 @@ + + + + diff --git a/packages/presentation/src/components/SpacesMultiPopup.svelte b/packages/presentation/src/components/SpacesMultiPopup.svelte index 986a6a5ad6..3632e15e96 100644 --- a/packages/presentation/src/components/SpacesMultiPopup.svelte +++ b/packages/presentation/src/components/SpacesMultiPopup.svelte @@ -31,7 +31,6 @@ import SpaceInfo from './SpaceInfo.svelte' export let _classes: Ref>[] = [] - export let allowDeselect: boolean = false export let titleDeselect: IntlString | undefined = undefined export let placeholder: IntlString = presentation.string.Search export let placeholderParam: any | undefined = undefined @@ -100,26 +99,21 @@
{#each shownSpaces as space} {/each}
diff --git a/packages/theme/styles/_layouts.scss b/packages/theme/styles/_layouts.scss index fb038966f0..a5542c1bc5 100644 --- a/packages/theme/styles/_layouts.scss +++ b/packages/theme/styles/_layouts.scss @@ -189,7 +189,7 @@ input.search { .inline-flex { display: inline-flex; } .flex-grow { flex-grow: 1; } .flex-no-shrink { flex-shrink: 0; } -.flex-shrink { flex-shrink: 1; } +.flex-shrink { flex-shrink: 1 !important; } .flex-wrap { flex-wrap: wrap !important; } .flex-nowrap { flex-wrap: nowrap !important; } .flex-baseline { @@ -270,7 +270,7 @@ input.search { flex-direction: column; align-items: stretch; } -.justify-between { justify-content: space-between; } +.justify-between { justify-content: space-between !important; } .justify-start { justify-content: flex-start; } .justify-end { justify-content: flex-end !important; } .justify-center { justify-content: center; } @@ -309,6 +309,7 @@ input.search { .icon { color: var(--theme-dark-color); + &.primary { color: var(--button-primary-BackgroundColor); } &.circle { padding: .25rem; background-color: var(--avatar-bg-color); @@ -345,7 +346,11 @@ input.search { margin-left: .75rem; } &:hover { - .icon { color: var(--theme-caption-color); } + .icon { + color: var(--theme-caption-color); + + &.primary { color: var(--button-primary-hover-BackgroundColor); } + } .label { color: var(--theme-caption-color); @@ -483,6 +488,7 @@ input.search { } /* Margins & Paddings */ +.ml-0 { margin-left: 0 !important; } .ml-0-5 { margin-left: .125rem; } .ml-1 { margin-left: .25rem; } .ml-1-5 { margin-left: .375rem; } @@ -508,6 +514,7 @@ input.search { .mr-8 { margin-right: 2rem; } .mr-10 { margin-right: 2.5rem; } .mr-32 { margin-right: 8rem } +.mt--1 { margin-top: -.25rem; } .mt-0-5 { margin-top: .125rem; } .mt-1 { margin-top: .25rem; } .mt-2 { margin-top: .5rem; } @@ -731,6 +738,7 @@ input.search { .min-h-9 { min-height: 2.25rem; } .min-h-11 { min-height: 2.75rem; } .min-h-12 { min-height: 3rem; } +.min-h-13 { min-height: 3.25rem; } .min-h-16 { min-height: 4rem; } .min-h-30 { min-height: 7.5rem; } .min-h-60 { min-height: 15rem; } @@ -958,6 +966,7 @@ a.no-line { &.bordered { border-color: var(--theme-button-border); } } +.overflow-hidden { overflow: hidden; } .overflow-x-auto { overflow-x: auto; } .overflow-y-auto { overflow-y: auto; } .overflow-x-auto, diff --git a/packages/theme/styles/_lumia-colors.scss b/packages/theme/styles/_lumia-colors.scss index f6f2b1ffb7..77fc78e02e 100644 --- a/packages/theme/styles/_lumia-colors.scss +++ b/packages/theme/styles/_lumia-colors.scss @@ -53,6 +53,7 @@ --global-popover-hover-BackgroundColor: #1F2737; --global-popover-BorderColor: #A5BDFF1A; --global-primary-LinkColor: #4D7FF5; + --global-primary-IconColor: #ffffff; --global-primary-TextColor: #FFFFFF; --global-secondary-TextColor: #C1C9D6; --global-tertiary-TextColor: #8E99AF; @@ -66,6 +67,7 @@ --global-higlight-Color: #F76E53; --global-accent-SkyText: #B9D1F5; --global-accent-BackgroundColor: #204DC8; + --global-on-nuance-TextColor: #041d7d; --global-no-priority-PriorityColor: #8E99AF; --global-low-PriorityColor: #6493FF; @@ -147,6 +149,7 @@ --global-popover-hover-BackgroundColor: #1F2737; --global-popover-BorderColor: #A5BDFF26; --global-primary-LinkColor: #3566E2; + --global-primary-IconColor: #0f121a; --global-primary-TextColor: #0F121A; --global-secondary-TextColor: #5A667E; --global-tertiary-TextColor: #7B879E; @@ -160,6 +163,7 @@ --global-higlight-Color: #F76E53; --global-accent-SkyText:#B9D1F5; --global-accent-BackgroundColor: #3566E2; + --global-on-nuance-TextColor: #2553cf; --global-no-priority-PriorityColor: #7B879E; --global-low-PriorityColor: #3566E2; diff --git a/packages/theme/styles/button.scss b/packages/theme/styles/button.scss index a9a40ca47a..4159e78912 100644 --- a/packages/theme/styles/button.scss +++ b/packages/theme/styles/button.scss @@ -84,7 +84,7 @@ &:hover .btn-icon { color: var(--theme-caption-color); } &:not(.no-focus):focus { - &:not(.sh-filter) { box-shadow: 0 0 0 2px var(--primary-button-outline); } + &:not(.sh-filter, .regular) { box-shadow: 0 0 0 2px var(--primary-button-outline); } &.sh-filter { border-color: var(--primary-button-outline); } } @@ -109,7 +109,8 @@ &.pressed:hover { background-color: var(--theme-button-pressed); } &:focus { background-color: var(--theme-button-focused); - border-color: var(--theme-button-focused-border); + outline: 2px solid var(--global-focus-BorderColor); + outline-offset: 2px; } &:disabled { background-color: var(--theme-button-disabled); } &.selected { diff --git a/packages/theme/styles/common.scss b/packages/theme/styles/common.scss index 739840fe65..87c6982bc2 100644 --- a/packages/theme/styles/common.scss +++ b/packages/theme/styles/common.scss @@ -25,12 +25,16 @@ .font-bold-14, .paragraph-regular-14, .heading-medium-16, +.heading-bold-16, +.heading-ui-H2, .heading-medium-20, .heading-bold-20 { font-family: var(--font-family); font-style: normal; - color: var(--global-primary-TextColor); + &:not(.secondary, .tertiary) { color: var(--global-primary-TextColor); } + &.secondary { color: var(--global-secondary-TextColor); } + &.tertiary { color: var(--global-tertiary-TextColor); } &:not(.line-height-auto) { line-height: 1rem; } } .font-regular-11, @@ -63,15 +67,24 @@ .heading-medium-20 { font-weight: 500; } +.heading-ui-H2 { + font-weight: 600; +} .font-bold-12, .font-bold-14, +.heading-bold-16, .heading-bold-20 { font-weight: 700; } -.heading-medium-16 { +.heading-medium-16, +.heading-bold-16 { font-size: 1rem; line-height: 1.125rem; } +.heading-ui-H2 { + font-size: 1.125rem; + line-height: 1.25rem; +} .heading-medium-20, .heading-bold-20 { font-size: 1.25rem; @@ -143,13 +156,8 @@ filter: drop-shadow(2px 0 1px rgba(0, 0, 0, .2)); z-index: 450; - &.portrait { - left: 0; - } - &.landscape { - .modern-app & { left: var(--app-panel-width); } - :not(.modern-app) & { left: calc(var(--app-panel-width) + 1px); } - } + &.portrait { left: 0; } + &.landscape { left: var(--app-panel-width); } } } .antiPanel-component { diff --git a/packages/theme/styles/components.scss b/packages/theme/styles/components.scss index 3865098752..055395b24b 100644 --- a/packages/theme/styles/components.scss +++ b/packages/theme/styles/components.scss @@ -31,6 +31,14 @@ overflow: hidden; background-color: var(--theme-comp-header-color); // var(--global-surface-02-BackgroundColor); } + &.beforeAside { + border-right: none; + border-radius: var(--small-focus-BorderRadius) 0 0 var(--small-focus-BorderRadius); + } + &.aside { + border-left: none; + border-radius: 0 var(--small-focus-BorderRadius) var(--small-focus-BorderRadius) 0; + } } .hulyComponent-content, .hulyComponent-content__container, @@ -44,8 +52,9 @@ min-height: 0; } .hulyComponent-content { - flex-shrink: 0; - + &:not(.noShrink) { + flex-shrink: 0; + } &:not(.withoutMaxWidth) { max-width: 64rem; } @@ -308,15 +317,45 @@ .hulyHeader-container { display: flex; align-items: center; - padding: var(--spacing-1_5) var(--spacing-2); width: 100%; - height: var(--spacing-6_5); + min-width: 0; + min-height: var(--spacing-6_5); + + &:not(.clearPadding) { padding: var(--spacing-1_5) var(--spacing-2); } + &.clearPadding { + padding: 0 var(--spacing-2); + & > .hulyHeader-row { + padding: 0; + min-height: var(--spacing-6_5); + } + } &:not(.hideSeparator) { border-bottom: 1px solid var(--theme-divider-color); // var(--global-surface-02-BorderColor); } - &.topIndent { - margin-top: 1px; + &.topIndent { margin-top: 1px; } + .hulyHeader-row { + display: flex; + align-items: center; + flex-grow: 1; + padding: var(--spacing-1_5) 0; + min-width: 0; + + &:has(.extra.overflow) { padding: 0; } + &:not(.noBorder):first-child { + max-height: var(--spacing-6_5); + border-bottom: 1px solid var(--theme-divider-color); + } + &:nth-child(2) { margin-top: -1px; } + &.between { justify-content: space-between; } + &.reverse { flex-direction: row-reverse; } + &__divider { + margin-top: -1px; + width: 100%; + min-height: 1px; + max-height: 1px; + background-color: var(--theme-divider-color); + } } .hulyHeader-button { display: flex; @@ -347,19 +386,38 @@ .hulyHeader-titleGroup, .hulyHeader-buttonsGroup { display: flex; - align-items: center; min-width: 0; min-height: 0; } .hulyHeader-titleGroup { flex-grow: 1; - gap: var(--spacing-0_5); + + &.withDescription { flex-direction: column; } + &:not(.withDescription) { + align-items: center; + gap: var(--spacing-0_5); + } } .hulyHeader-buttonsGroup { + align-items: center; flex-shrink: 0; - gap: var(--spacing-1); - margin-left: var(--spacing-2); + &.extra { + flex-shrink: 1; + margin-left: var(--spacing-2); + + &.overflow { + overflow-x: auto; + margin: 0 -.25rem 0 1rem; + padding: .25rem; + } + } + &.before { + gap: var(--spacing-0_5); + + &.freezeBefore { min-width: var(--global-small-Size); } + } + &:not(.before) { gap: var(--spacing-1); } &__label { display: flex; flex-direction: column; @@ -368,8 +426,21 @@ color: var(--global-secondary-TextColor); } } - .hulyHotKey-item { - margin-right: .625rem; + .hulyHotKey-item { margin-right: .625rem; } + + &.doubleRow { + flex-direction: column; + align-items: stretch; + flex-shrink: 0; + padding: 0 var(--spacing-2); + + .hulyHeader-row { min-height: var(--spacing-6_5); } + .hulyHeader-buttonsGroup.search { flex-direction: row-reverse; } + .hulyHeader-buttonsGroup.actions { margin-left: 1rem; } + } + &:not(.doubleRow) { + .hulyHeader-buttonsGroup:not(.before) { margin-left: 1rem; } + .hulyHeader-buttonsGroup.search + .hulyHeader-divider + .hulyHeader-buttonsGroup.actions { margin-left: 0; } } } @@ -916,13 +987,13 @@ min-width: 0; .ac-header { - padding: 0.5rem 2.25rem; + padding: var(--spacing-1) var(--spacing-2); // height: 3.5rem; // min-height: 2.5rem; &:not(.withoutBackground) { background-color: var(--theme-comp-header-color); } - &.caption-height { min-height: 3.25rem; } - &.search-start { padding-left: 1.75rem; } + &.caption-height { min-height: 3.5rem; } + &.search-start { padding-left: var(--spacing-3); } &.tabs-start { padding: 0 2.25rem; } &.short { display: flex; @@ -1382,14 +1453,14 @@ &::-webkit-scrollbar-thumb { background-color: var(--scrollbar-bar-color); } &.mask-none { mask-image: none } - &.mask-left { mask-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0, rgba(0, 0, 0, 1) 1rem); } - &.mask-right { mask-image: linear-gradient(to left, rgba(0, 0, 0, 0) 0, rgba(0, 0, 0, 1) 1rem); } + &.mask-left { mask-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0, rgba(0, 0, 0, 1) 2rem); } + &.mask-right { mask-image: linear-gradient(to left, rgba(0, 0, 0, 0) 0, rgba(0, 0, 0, 1) 2rem); } &.mask-both { mask-image: linear-gradient( to right, rgba(0, 0, 0, 0) 0, - rgba(0, 0, 0, 1) 1rem, - rgba(0, 0, 0, 1) calc(100% - 1rem), + rgba(0, 0, 0, 1) 2rem, + rgba(0, 0, 0, 1) calc(100% - 2rem), rgba(0, 0, 0, 0) 100% ); } diff --git a/packages/theme/styles/panel.scss b/packages/theme/styles/panel.scss index d4de278b75..0b0458fd4d 100644 --- a/packages/theme/styles/panel.scss +++ b/packages/theme/styles/panel.scss @@ -61,7 +61,7 @@ min-width: 0; min-height: 0; } - &.small { padding-bottom: .75rem; } + &.small { padding-bottom: var(--spacing-1_5); } } .hulyNavGroup-container { @@ -291,8 +291,13 @@ height: 100%; min-width: 0; min-height: 0; - + border-radius: var(--small-focus-BorderRadius); + &:not(.rowContent) { flex-direction: column; } + .panel-instance & { + background-color: var(--theme-panel-color); + border: 1px solid var(--theme-divider-color); + } .popupPanel-title { display: flex; @@ -300,7 +305,7 @@ justify-content: stretch; align-items: center; min-width: 0; - min-height: 3.25rem; + min-height: 3.5rem; background-color: var(--theme-comp-header-color); border-bottom: 1px solid var(--theme-divider-color); @@ -347,7 +352,7 @@ width: 100%; height: 100%; background-color: var(--theme-panel-color); - border: 1px solid var(--theme-divider-color); + // border: 1px solid var(--theme-divider-color); border-top: none; border-left: none; @@ -555,15 +560,6 @@ visibility: hidden; } - &.modern { - border: 1px solid transparent; - border-radius: var(--small-focus-BorderRadius); - - .popupPanel-title { - min-height: 3.5rem; - } - } - @media print { overflow: visible; } diff --git a/packages/theme/styles/popups.scss b/packages/theme/styles/popups.scss index 4ff0d05c3c..31e5ae1f23 100644 --- a/packages/theme/styles/popups.scss +++ b/packages/theme/styles/popups.scss @@ -223,16 +223,15 @@ margin-right: .5rem; } .icon, - .check { + div.check { width: 1rem; height: 1rem; color: var(--theme-dark-color); } - .check { + div.check { flex-shrink: 0; - margin-left: .5rem; - &.ml-3 { margin-left: .75rem; } + &:not(.ml-0) { margin-left: .5rem; } } .color { width: .875rem; diff --git a/packages/ui/src/components/Breadcrumbs.svelte b/packages/ui/src/components/Breadcrumbs.svelte index 17710e05e8..4f7cc3c84b 100644 --- a/packages/ui/src/components/Breadcrumbs.svelte +++ b/packages/ui/src/components/Breadcrumbs.svelte @@ -15,24 +15,17 @@ @@ -43,13 +36,13 @@ { if (selected !== i) dispatch('select', i) }} /> {/each} - {#if afterLabel || $$slots.afterLabel} + {#if (afterLabel || $$slots.afterLabel) && !hideAfter} {#if afterLabel}