Skip to content

feat: Figma integration#11044

Merged
tommoor merged 15 commits into
mainfrom
hmacr/10967-figma-integration
Jan 16, 2026
Merged

feat: Figma integration#11044
tommoor merged 15 commits into
mainfrom
hmacr/10967-figma-integration

Conversation

@hmacr

@hmacr hmacr commented Jan 2, 2026

Copy link
Copy Markdown
Collaborator

Closes #10967

This PR adds the ability to connect Figma account through OAuth to fetch file metadata for mentions.

We'll need to create a public oauth app and submit it for approval before releasing this PR.

Required scopes:

  • current_user:read - Store user name to denote which account is connected.
  • file_metadata:read - Read file name, thumbnail_url, etc. for mention node.

@hmacr hmacr marked this pull request as ready for review January 2, 2026 18:57
@auto-assign auto-assign Bot requested a review from tommoor January 2, 2026 18:57
Comment thread app/editor/components/PasteMenu.tsx
Comment thread plugins/figma/server/index.ts
Comment thread plugins/iframely/server/iframely.ts

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🧹 Nitpick comments (7)
plugins/figma/client/Settings.tsx (1)

74-76: Consider defensive handling when figmaAccount is undefined.

If linkedAccountIntegration exists but figmaAccount is undefined (e.g., due to a data inconsistency), the title will render as undefined (undefined). Consider adding a fallback:

-                title={`${figmaAccount?.name} (${figmaAccount?.email})`}
+                title={figmaAccount ? `${figmaAccount.name} (${figmaAccount.email})` : t("Connected account")}
plugins/figma/shared/FigmaUtils.ts (1)

27-29: Consider URL-encoding the error parameter.

If error contains special characters, the resulting URL could be malformed.

🔎 Proposed fix
   static errorUrl(error: string) {
-    return `${this.settingsUrl}?error=${error}`;
+    return `${this.settingsUrl}?error=${encodeURIComponent(error)}`;
   }
plugins/figma/server/figma.ts (1)

159-171: Consider validating the file metadata response structure.

The code accesses data.file.name, data.file.creator.handle, and data.file.thumbnail_url without validation. If Figma's API response changes or returns unexpected data, this could throw. Consider using a Zod schema similar to other responses.

plugins/figma/server/index.ts (1)

8-8: Simplify the enabled flag.

The double negation is unnecessary since the logical AND already coerces to boolean.

🔎 Proposed simplification
-const enabled = !!env.FIGMA_CLIENT_ID && !!env.FIGMA_CLIENT_SECRET;
+const enabled = Boolean(env.FIGMA_CLIENT_ID && env.FIGMA_CLIENT_SECRET);
server/queues/tasks/UploadIntegrationLogoTask.ts (1)

55-70: Consider coupling the switch cases to the SupportedIntegrations array.

The default branch provides a safety net, but if a new service is added to SupportedIntegrations (line 8-11) without a corresponding case here, it will throw at runtime. Consider adding a comment or using TypeScript's exhaustive check pattern to catch this at compile time.

🔎 Suggested pattern for exhaustive checking
       case IntegrationService.Figma:
         (
           integration as Integration<IntegrationType.LinkedAccount>
         ).settings.figma!.account.avatarUrl = attachment.url;
         break;
       default:
+        // Compile-time exhaustive check - add new cases above when extending SupportedIntegrations
+        const _exhaustiveCheck: never = integration.service;
         throw new Error(
-          `Unsupported integration service: ${integration.service}`
+          `Unsupported integration service: ${_exhaustiveCheck}`
         ); // This should never happen
     }

Note: This pattern requires removing the early return guard or adjusting the type narrowing for it to work properly. Alternatively, a code comment reminder is sufficient given the defensive throw.

shared/types.ts (1)

227-246: Consider documenting the fallback union variants.

The else branch is a complex union serving as a catch-all for integration types not explicitly handled. A brief comment explaining when this branch applies would improve maintainability.

+            // Fallback for untyped or legacy integration settings
             :
                 | { url: string }
                 | {
plugins/figma/server/api/figma.ts (1)

49-60: addSeconds correctly accepts numeric timestamps in date-fns v3; this pattern is used consistently throughout the codebase.

Date-fns v3 explicitly supports both Date objects and millisecond timestamps (numbers) as the first argument to addSeconds. The current usage of Date.now() is correct and aligns with the same pattern used in server/models/IntegrationAuthentication.ts, server/commands/accountProvisioner.ts, and plugins/linear/server/api/linear.ts. Using new Date() instead is a stylistic choice, not a functional improvement.

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Cache: Disabled due to data retention organization setting

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between e801985 and 2e6c466.

📒 Files selected for processing (26)
  • .env.sample
  • app/editor/components/PasteMenu.tsx
  • app/editor/extensions/PasteHandler.tsx
  • plugins/figma/client/Icon.tsx
  • plugins/figma/client/Settings.tsx
  • plugins/figma/client/components/FigmaButton.tsx
  • plugins/figma/client/index.tsx
  • plugins/figma/plugin.json
  • plugins/figma/server/api/figma.ts
  • plugins/figma/server/api/schema.ts
  • plugins/figma/server/env.ts
  • plugins/figma/server/figma.ts
  • plugins/figma/server/index.ts
  • plugins/figma/shared/FigmaUtils.ts
  • plugins/iframely/server/iframely.ts
  • plugins/linear/server/api/linear.ts
  • plugins/linear/server/index.ts
  • plugins/slack/server/auth/slack.ts
  • server/presenters/unfurl.ts
  • server/queues/tasks/UploadIntegrationLogoTask.ts
  • server/types.ts
  • shared/editor/components/Mentions.tsx
  • shared/editor/lib/embeds.ts
  • shared/editor/nodes/Embed.tsx
  • shared/i18n/locales/en_US/translation.json
  • shared/types.ts
🧰 Additional context used
🧬 Code graph analysis (13)
server/presenters/unfurl.ts (1)
shared/types.ts (1)
  • UnfurlResponse (439-542)
plugins/linear/server/api/linear.ts (1)
server/queues/tasks/UploadIntegrationLogoTask.ts (1)
  • UploadIntegrationLogoTask (24-82)
plugins/figma/server/api/schema.ts (1)
server/routes/api/schema.ts (1)
  • BaseSchema (8-12)
plugins/figma/client/components/FigmaButton.tsx (3)
app/editor/components/ComponentView.tsx (1)
  • props (152-161)
app/utils/urls.ts (1)
  • redirectTo (45-47)
plugins/figma/shared/FigmaUtils.ts (1)
  • FigmaUtils (9-52)
plugins/figma/shared/FigmaUtils.ts (1)
shared/utils/routeHelpers.ts (1)
  • integrationSettingsPath (9-11)
server/types.ts (1)
shared/types.ts (1)
  • UnfurlResponse (439-542)
shared/editor/components/Mentions.tsx (3)
plugins/github/shared/GitHubUtils.ts (1)
  • url (8-10)
shared/types.ts (1)
  • UnfurlResponse (439-542)
shared/utils/urls.ts (2)
  • toDisplayUrl (240-247)
  • cdnPath (12-14)
plugins/figma/server/figma.ts (4)
plugins/figma/shared/FigmaUtils.ts (1)
  • FigmaUtils (9-52)
server/types.ts (1)
  • UnfurlSignature (576-579)
shared/utils/time.ts (1)
  • Minute (6-11)
shared/utils/urls.ts (1)
  • cdnPath (12-14)
plugins/linear/server/index.ts (1)
server/queues/tasks/UploadIntegrationLogoTask.ts (1)
  • UploadIntegrationLogoTask (24-82)
plugins/figma/server/index.ts (2)
plugins/figma/server/figma.ts (1)
  • Figma (36-208)
shared/utils/time.ts (1)
  • Minute (6-11)
plugins/figma/server/env.ts (3)
server/env.ts (1)
  • Environment (32-867)
server/utils/decorators/Public.ts (1)
  • Public (10-18)
server/utils/validators.ts (1)
  • CannotUseWithout (108-131)
app/editor/components/PasteMenu.tsx (1)
shared/editor/lib/embeds.ts (1)
  • getMatchingEmbed (5-17)
plugins/iframely/server/iframely.ts (2)
server/types.ts (1)
  • UnfurlError (574-574)
shared/utils/urls.ts (1)
  • cdnPath (12-14)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
  • GitHub Check: test-server (1)
  • GitHub Check: test-server (3)
  • GitHub Check: test-server (4)
  • GitHub Check: test-server (2)
  • GitHub Check: types
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (40)
shared/i18n/locales/en_US/translation.json (1)

1353-1353: Well-structured integration messages.

The Figma integration translations follow the established patterns from existing integrations (GitHub, Linear, Slack) and maintain consistent tone and structure throughout. The permission prompts, error messages, and status labels align well with the application's existing UX patterns.

Also applies to: 1355-1355, 1357-1360

.env.sample (1)

221-224: LGTM! Figma OAuth configuration follows existing patterns.

The new environment variables are correctly structured and consistent with other OAuth integrations (GitHub, Linear).

shared/editor/lib/embeds.ts (1)

19-27: LGTM! List iteration logic is correct.

The function properly iterates through list nodes and aggregates transformation results.

plugins/figma/client/components/FigmaButton.tsx (1)

8-23: LGTM! OAuth button implementation follows best practices.

The component correctly:

  • Builds the OAuth authorization URL with appropriate state parameter (team ID)
  • Uses the redirectTo utility for navigation
  • Forwards all button props for flexibility
  • Implements internationalization with t("Connect")
plugins/linear/server/index.ts (1)

7-7: Backward compatibility confirmed for the generic UploadIntegrationLogoTask.

The refactoring from UploadLinearWorkspaceLogoTask to the generic UploadIntegrationLogoTask successfully consolidates duplicate code. The new task properly handles Linear (and Figma) integrations, with explicit support in the SupportedIntegrations list. No lingering references to the old task remain, and the Hook registration is correct. Linear integrations continue to work with the same interface and will not be affected.

app/editor/components/PasteMenu.tsx (3)

76-106: LGTM!

Clean refactor using getMatchingEmbed for single-paste embed detection. The visibility and attribute handling for the embed menu item is correct.


134-157: Clean implementation for embed list detection.

The logic correctly tracks whether all pasted links are convertible to embeds and determines the appropriate icon based on whether they're all the same type or mixed.


173-179: LGTM!

The new embed_list menu item is properly structured with visibility, icon, and attrs matching the existing mention_list pattern.

shared/editor/components/Mentions.tsx (2)

196-230: Good fallback handling for missing unfurl data.

The restructured logic properly handles the case when no server unfurl is available by either using existing attrs.unfurl or creating a minimal fallback with title and favicon. This prevents unnecessary re-fetches while ensuring the mention always renders something meaningful.


237-237: Verify the node dependency is necessary.

Adding node to the dependency array could trigger re-fetches when the node object reference changes even if the underlying URL hasn't changed. If node is reconstructed frequently (e.g., during editor operations), this might cause unnecessary network requests.

Consider whether url alone (derived from node.attrs.href) is sufficient for re-triggering the effect.

plugins/figma/client/Settings.tsx (2)

36-63: LGTM on error handling.

The error handling for OAuth flow failures is comprehensive, covering access denial, authentication issues, and unknown errors with appropriate user-facing messages.


96-102: No action needed. The delete method is properly bound.

The method is defined as an arrow function property on the Model base class (line 181), which automatically binds it to the instance. Arrow function properties maintain the correct this context when passed as callbacks, so there is no binding issue when passing linkedAccountIntegration.delete to onClick.

Likely an incorrect or invalid review comment.

shared/editor/nodes/Embed.tsx (2)

144-182: The embed_list command implementation looks correct.

The flow properly:

  1. Validates cursor position and list context
  2. Finds the parent list node
  3. Transforms list items to embed nodes
  4. Replaces the list range with the new embeds

One minor observation: the _attrs parameter is unused. If it's intentionally ignored, consider documenting why or using a more explicit ignore pattern.


134-143: LGTM!

The embed command is a clean, straightforward implementation for single embed insertion.

app/editor/extensions/PasteHandler.tsx (2)

450-467: LGTM!

The insertEmbedList method follows the established pattern from insertMentionList, maintaining consistency in how the paste menu handles multi-item operations.


569-573: LGTM!

The embed_list case properly integrates with the existing switch statement pattern.

plugins/figma/shared/FigmaUtils.ts (1)

42-50: LGTM!

The OAuth authorization URL construction is correct, properly using query-string for URL parameter encoding and including all required OAuth parameters.

plugins/figma/server/figma.ts (2)

52-77: LGTM on OAuth token exchange.

The implementation correctly uses Basic auth with proper headers and validates the response with Zod schema.


143-178: Good resilience pattern for multi-account unfurling.

The loop through integrations with per-integration error handling ensures that a failure with one account doesn't prevent trying others. The fallback to undefined (triggering iframely unfurl) is appropriate.

plugins/figma/plugin.json (1)

1-7: LGTM!

The plugin manifest is well-structured with appropriate metadata. The priority and loading order (after Linear) are clearly defined.

server/types.ts (1)

557-572: LGTM! Temporary migration pattern is sound.

The UnfurlURL type with the transformedUnfurl flag provides type-safe backward compatibility during the unfurl response migration. This aligns well with the temporary handling in server/presenters/unfurl.ts (lines 34-37).

plugins/figma/client/index.tsx (1)

1-18: LGTM!

The plugin registration follows best practices with lazy loading for the Settings component and a clear, user-friendly description. The integration with PluginManager is standard and correct.

server/presenters/unfurl.ts (1)

30-47: LGTM! Backward compatibility handled correctly.

The two-path approach gracefully handles both transformed and legacy unfurl data. The safe navigation with optional chaining and fallback values ensures robustness. The TODO comment (line 33) appropriately notes the temporary nature of this compatibility layer.

plugins/linear/server/api/linear.ts (1)

11-11: LGTM! Good refactoring to generic integration task.

The migration from UploadLinearWorkspaceLogoTask to UploadIntegrationLogoTask consolidates logo upload logic across multiple integrations. The generic task correctly handles Linear (and Figma) via service-specific branches.

Also applies to: 89-89

plugins/figma/client/Icon.tsx (1)

1-26: LGTM!

The icon component is well-structured with clear prop types, sensible defaults, and proper TypeScript typing.

plugins/figma/server/index.ts (1)

10-21: LGTM!

The conditional plugin registration pattern is clean, and the 10-minute cache expiry appropriately accounts for Figma's rate limits.

plugins/iframely/server/iframely.ts (1)

48-59: Well-structured unfurl transformation.

The explicit unfurl object structure with typed fields improves maintainability and aligns with the broader unfurl type system. The cdnPath usage for Figma favicons addresses the sizing inconsistency issue noted in the previous review.

plugins/slack/server/auth/slack.ts (1)

191-191: LGTM!

The explicit generic type parameters improve type safety without any behavioral changes. This enhances IDE support and compile-time type checking.

Also applies to: 229-229, 249-249

plugins/figma/server/env.ts (1)

7-23: LGTM!

The environment configuration follows established patterns and correctly:

  • Exposes FIGMA_CLIENT_ID as public (appropriate for OAuth client IDs)
  • Keeps FIGMA_CLIENT_SECRET private (proper secret handling)
  • Enforces the dependency that FIGMA_CLIENT_SECRET requires FIGMA_CLIENT_ID

The validation logic with @IsOptional and @CannotUseWithout correctly handles all credential combinations.

server/queues/tasks/UploadIntegrationLogoTask.ts (3)

8-11: LGTM!

Clean approach using a constant array for supported integrations, making it easy to extend for future services.


26-31: LGTM!

The early return for unsupported integrations is a good guard. Combined with the withAuthentication scope, this ensures the authentication token is available for the subsequent attachment fetch.


72-73: LGTM!

Correct usage of changed("settings", true) to signal Sequelize that the nested settings object was mutated, ensuring the save persists the changes.

plugins/figma/server/api/figma.ts (6)

1-15: LGTM!

Imports are well-organized, including necessary middleware, models, and utilities for the OAuth callback flow.


18-31: LGTM!

The middleware chain correctly handles authentication, validation, subdomain redirection, and transaction management, consistent with other OAuth callback implementations in the codebase.


33-39: LGTM!

Good placement of the error check after subdomain redirection, ensuring users see error messages on the correct domain. The comment clearly explains the reasoning.


61-82: LGTM!

The integration record correctly captures Figma account metadata. The settings structure aligns with the IntegrationSettings<IntegrationType.LinkedAccount> type definition.


84-89: LGTM!

Using afterCommit ensures the integration record is persisted before the logo upload task executes, preventing race conditions.


92-95: LGTM!

Error handling logs the failure for debugging while showing a generic error to users, which is appropriate for OAuth flows where detailed error messages could leak sensitive information.

shared/types.ts (2)

132-132: LGTM!

Clean addition of Figma to the IntegrationService enum, following the established naming pattern.


215-226: LGTM!

The LinkedAccount type branch cleanly separates account-linked integrations (Slack, Figma) with their respective settings shapes. The figma.account structure matches the data stored during OAuth callback.

Comment thread plugins/figma/server/api/schema.ts
Comment thread plugins/figma/server/figma.ts
Comment thread plugins/figma/server/figma.ts Outdated
Comment thread plugins/figma/shared/FigmaUtils.ts
Comment thread plugins/iframely/server/iframely.ts
Comment thread shared/editor/lib/embeds.ts
Comment thread shared/i18n/locales/en_US/translation.json Outdated
@outline outline deleted a comment from coderabbitai Bot Jan 5, 2026
@tommoor tommoor merged commit 5584089 into main Jan 16, 2026
15 checks passed
@tommoor tommoor deleted the hmacr/10967-figma-integration branch January 16, 2026 01:27
alexlebens pushed a commit to alexlebens/infrastructure that referenced this pull request Jan 28, 2026
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [outline/outline](https://github.com/outline/outline) | minor | `1.3.0` → `1.4.0` |

---

### Release Notes

<details>
<summary>outline/outline (outline/outline)</summary>

### [`v1.4.0`](https://github.com/outline/outline/releases/tag/v1.4.0)

[Compare Source](outline/outline@v1.3.0...v1.4.0)

#### What's Changed

##### Highlights

- New **"Toggle blocks"** allow creating content that is collapsed by default in [#&#8203;8317](outline/outline#8317)
- Table cells can now have a custom background color set in [#&#8203;10930](outline/outline#10930)
- Search results are now highlighted in the document when navigating from search in [#&#8203;11262](outline/outline#11262)

##### Other improvements

- A new Figma integration allows unfurling information about Figma links in documents by [@&#8203;hmacr](https://github.com/hmacr) in [#&#8203;11044](outline/outline#11044)
- Added support for sorting dates in table columns by [@&#8203;lucawimmer](https://github.com/lucawimmer) in [#&#8203;11198](outline/outline#11198)
- Document changes made through the API are now synced to clients in realtime in [#&#8203;11186](outline/outline#11186)
- The rate limiter now prefers user ID over ip address for logged in sessions, prevents issues on larger office networks in [#&#8203;11215](outline/outline#11215)
- The markdown importer now supports more file layouts in [#&#8203;11278](outline/outline#11278)

##### Fixes

- Fixed some typos comments and messages by [@&#8203;NAM-MAN](https://github.com/NAM-MAN) in [#&#8203;11203](outline/outline#11203)
- Fixed an issue where mentions would sometimes break when using drag and drop in a list in [#&#8203;11208](outline/outline#11208)
- The edit diagram control no longer appears in read-only mode in [#&#8203;11207](outline/outline#11207)
- Infinite recursion in `dd-trace` dependency causes memory issues in [#&#8203;11211](outline/outline#11211)
- Imported content now gracefully handles HTTP links in [#&#8203;11210](outline/outline#11210)
- Editor suggestions on mobile now uses a drawer in [#&#8203;11213](outline/outline#11213)
- When importing markdown checkboxes are now supported in table cells in [#&#8203;11217](outline/outline#11217)
- GCS uniform bucket-level access now supported by [@&#8203;maycuatroi1](https://github.com/maycuatroi1) in [#&#8203;11222](outline/outline#11222)
- Fixed a hanging read stream handle causing excessive memory usage on export in [#&#8203;11237](outline/outline#11237)
- Fixed mermaid diagrams do not render when pasting markdown in [#&#8203;11243](outline/outline#11243)
- Remote edits no longer exit Mermaid editing state in [#&#8203;11244](outline/outline#11244)
- Table row is now inserted correctly with merged first column cells in [#&#8203;11245](outline/outline#11245)
- Allow http\:// loopback redirect URIs for native OAuth apps (RFC 8252) in [#&#8203;11255](outline/outline#11255)
- "Split cell" option now works without accurate selection in [#&#8203;11256](outline/outline#11256)
- Adding text below images is now easier as trailing paragraph is enforcedd by [@&#8203;RudraPrasad001](https://github.com/RudraPrasad001) in [#&#8203;11257](outline/outline#11257)
- Tooltip in editor toolbar with submenu is now hidden when submenu is open in [#&#8203;11263](outline/outline#11263)
- Non-platform passkeys such as Yubikey and mobile QRcode are now allowed in [#&#8203;11265](outline/outline#11265)
- diagrams.net theme now matches editor theme by [@&#8203;Twometer](https://github.com/Twometer) in [#&#8203;11267](outline/outline#11267)
- Custom emoji characters are now displayed correctly in TOC in [#&#8203;11275](outline/outline#11275)
- Fixed an issue where the policy for documents restore was too broad in [#&#8203;11279](outline/outline#11279)
- Passkey setup is now available to non-admin users by [@&#8203;Raphmatt](https://github.com/Raphmatt) in [#&#8203;11286](outline/outline#11286)

#### New Contributors

- [@&#8203;NAM-MAN](https://github.com/NAM-MAN) made their first contribution in [#&#8203;11203](outline/outline#11203)
- [@&#8203;lucawimmer](https://github.com/lucawimmer) made their first contribution in [#&#8203;11198](outline/outline#11198)
- [@&#8203;maycuatroi1](https://github.com/maycuatroi1) made their first contribution in [#&#8203;11222](outline/outline#11222)
- [@&#8203;RudraPrasad001](https://github.com/RudraPrasad001) made their first contribution in [#&#8203;11257](outline/outline#11257)
- [@&#8203;Twometer](https://github.com/Twometer) made their first contribution in [#&#8203;11267](outline/outline#11267)
- [@&#8203;Raphmatt](https://github.com/Raphmatt) made their first contribution in [#&#8203;11286](outline/outline#11286)

**Full Changelog**: <outline/outline@v1.3.0...v1.4.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42OS4yIiwidXBkYXRlZEluVmVyIjoiNDIuNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiaW1hZ2UiXX0=-->

Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/3546
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
alexlebens pushed a commit to alexlebens/infrastructure that referenced this pull request Jan 28, 2026
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [outlinewiki/outline](https://github.com/outline/outline) | minor | `1.3.0` → `1.4.0` |

---

### Release Notes

<details>
<summary>outline/outline (outlinewiki/outline)</summary>

### [`v1.4.0`](https://github.com/outline/outline/releases/tag/v1.4.0)

[Compare Source](outline/outline@v1.3.0...v1.4.0)

##### What's Changed

##### Highlights

- New **"Toggle blocks"** allow creating content that is collapsed by default in [#&#8203;8317](outline/outline#8317)
- Table cells can now have a custom background color set in [#&#8203;10930](outline/outline#10930)
- Search results are now highlighted in the document when navigating from search in [#&#8203;11262](outline/outline#11262)

##### Other improvements

- A new Figma integration allows unfurling information about Figma links in documents by [@&#8203;hmacr](https://github.com/hmacr) in [#&#8203;11044](outline/outline#11044)
- Added support for sorting dates in table columns by [@&#8203;lucawimmer](https://github.com/lucawimmer) in [#&#8203;11198](outline/outline#11198)
- Document changes made through the API are now synced to clients in realtime in [#&#8203;11186](outline/outline#11186)
- The rate limiter now prefers user ID over ip address for logged in sessions, prevents issues on larger office networks in [#&#8203;11215](outline/outline#11215)
- The markdown importer now supports more file layouts in [#&#8203;11278](outline/outline#11278)

##### Fixes

- Fixed some typos comments and messages by [@&#8203;NAM-MAN](https://github.com/NAM-MAN) in [#&#8203;11203](outline/outline#11203)
- Fixed an issue where mentions would sometimes break when using drag and drop in a list in [#&#8203;11208](outline/outline#11208)
- The edit diagram control no longer appears in read-only mode in [#&#8203;11207](outline/outline#11207)
- Infinite recursion in `dd-trace` dependency causes memory issues in [#&#8203;11211](outline/outline#11211)
- Imported content now gracefully handles HTTP links in [#&#8203;11210](outline/outline#11210)
- Editor suggestions on mobile now uses a drawer in [#&#8203;11213](outline/outline#11213)
- When importing markdown checkboxes are now supported in table cells in [#&#8203;11217](outline/outline#11217)
- GCS uniform bucket-level access now supported by [@&#8203;maycuatroi1](https://github.com/maycuatroi1) in [#&#8203;11222](outline/outline#11222)
- Fixed a hanging read stream handle causing excessive memory usage on export in [#&#8203;11237](outline/outline#11237)
- Fixed mermaid diagrams do not render when pasting markdown in [#&#8203;11243](outline/outline#11243)
- Remote edits no longer exit Mermaid editing state in [#&#8203;11244](outline/outline#11244)
- Table row is now inserted correctly with merged first column cells in [#&#8203;11245](outline/outline#11245)
- Allow http\:// loopback redirect URIs for native OAuth apps (RFC 8252) in [#&#8203;11255](outline/outline#11255)
- "Split cell" option now works without accurate selection in [#&#8203;11256](outline/outline#11256)
- Adding text below images is now easier as trailing paragraph is enforcedd by [@&#8203;RudraPrasad001](https://github.com/RudraPrasad001) in [#&#8203;11257](outline/outline#11257)
- Tooltip in editor toolbar with submenu is now hidden when submenu is open in [#&#8203;11263](outline/outline#11263)
- Non-platform passkeys such as Yubikey and mobile QRcode are now allowed in [#&#8203;11265](outline/outline#11265)
- diagrams.net theme now matches editor theme by [@&#8203;Twometer](https://github.com/Twometer) in [#&#8203;11267](outline/outline#11267)
- Custom emoji characters are now displayed correctly in TOC in [#&#8203;11275](outline/outline#11275)
- Fixed an issue where the policy for documents restore was too broad in [#&#8203;11279](outline/outline#11279)
- Passkey setup is now available to non-admin users by [@&#8203;Raphmatt](https://github.com/Raphmatt) in [#&#8203;11286](outline/outline#11286)

##### New Contributors

- [@&#8203;NAM-MAN](https://github.com/NAM-MAN) made their first contribution in [#&#8203;11203](outline/outline#11203)
- [@&#8203;lucawimmer](https://github.com/lucawimmer) made their first contribution in [#&#8203;11198](outline/outline#11198)
- [@&#8203;maycuatroi1](https://github.com/maycuatroi1) made their first contribution in [#&#8203;11222](outline/outline#11222)
- [@&#8203;RudraPrasad001](https://github.com/RudraPrasad001) made their first contribution in [#&#8203;11257](outline/outline#11257)
- [@&#8203;Twometer](https://github.com/Twometer) made their first contribution in [#&#8203;11267](outline/outline#11267)
- [@&#8203;Raphmatt](https://github.com/Raphmatt) made their first contribution in [#&#8203;11286](outline/outline#11286)

**Full Changelog**: <outline/outline@v1.3.0...v1.4.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42OS4yIiwidXBkYXRlZEluVmVyIjoiNDIuNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiaW1hZ2UiXX0=-->

Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/3547
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Figma integration

2 participants