This commit is contained in:
Ben Floyd 2025-10-07 19:41:08 -06:00
parent 444c76264b
commit 0c73691262
7 changed files with 125 additions and 112 deletions

12
main.ts
View file

@ -3,8 +3,8 @@ import { Stream, StreamsSettings } from './src/shared/types';
import { sliceContainer, serviceRegistry, DEFAULT_SETTINGS, ServiceLoader } from './src/shared';
import { StreamsAPI } from './src/slices/api';
import { CreateFileView, CREATE_FILE_VIEW_TYPE } from './src/slices/file-operations/CreateFileView';
import { EncryptedFileView, ENCRYPTED_FILE_VIEW_TYPE } from './src/slices/file-operations/EncryptedFileView';
import { EncryptedCreateFileView, ENCRYPTED_CREATE_FILE_VIEW_TYPE } from './src/slices/file-operations/EncryptedCreateFileView';
import { InstallMeldView, INSTALL_MELD_VIEW_TYPE } from './src/slices/file-operations/InstallMeldView';
import { CreateFileViewEncrypted, CREATE_FILE_VIEW_ENCRYPTED_TYPE } from './src/slices/file-operations/CreateFileViewEncrypted';
export default class StreamsPlugin extends Plugin implements StreamsAPI {
@ -31,8 +31,8 @@ export default class StreamsPlugin extends Plugin implements StreamsAPI {
);
this.registerView(
ENCRYPTED_FILE_VIEW_TYPE,
(leaf) => new EncryptedFileView(leaf, this.app, '', {
INSTALL_MELD_VIEW_TYPE,
(leaf) => new InstallMeldView(leaf, this.app, '', {
id: '',
name: '',
folder: '',
@ -44,8 +44,8 @@ export default class StreamsPlugin extends Plugin implements StreamsAPI {
);
this.registerView(
ENCRYPTED_CREATE_FILE_VIEW_TYPE,
(leaf) => new EncryptedCreateFileView(leaf, this.app, '', {
CREATE_FILE_VIEW_ENCRYPTED_TYPE,
(leaf) => new CreateFileViewEncrypted(leaf, this.app, '', {
id: '',
name: '',
folder: '',

View file

@ -117,6 +117,20 @@ export class CalendarNavigationService extends SettingsAwareSliceService {
this.updateStreamsBarComponent(event.data);
}
});
// Update calendar when install meld view is opened
eventBus.subscribe('install-meld-view-opened', (event) => {
if (event.data) {
this.updateStreamsBarComponent(event.data);
}
});
// Update calendar when create file view encrypted is opened
eventBus.subscribe('create-file-view-encrypted-opened', (event) => {
if (event.data) {
this.updateStreamsBarComponent(event.data);
}
});
}
private registerPluginViews(): void {

View file

@ -17,9 +17,9 @@ interface AppWithPlugins extends App {
};
}
export const ENCRYPTED_CREATE_FILE_VIEW_TYPE = 'streams-encrypted-create-file-view';
export const CREATE_FILE_VIEW_ENCRYPTED_TYPE = 'streams-create-file-view-encrypted';
export class EncryptedCreateFileView extends ItemView {
export class CreateFileViewEncrypted extends ItemView {
private filePath: string;
private stream: Stream;
private dateStateManager: DateStateManager;
@ -39,7 +39,7 @@ export class EncryptedCreateFileView extends ItemView {
}
getViewType(): string {
return ENCRYPTED_CREATE_FILE_VIEW_TYPE;
return CREATE_FILE_VIEW_ENCRYPTED_TYPE;
}
getDisplayText(): string {
@ -97,12 +97,12 @@ export class EncryptedCreateFileView extends ItemView {
// Refresh the view with new state
if (this.contentEl) {
this.contentEl.empty();
this.contentEl.addClass('streams-encrypted-create-file-container');
this.createEncryptedFileViewContent(this.contentEl);
this.contentEl.addClass('streams-create-file-encrypted-container');
this.createFileViewEncryptedContent(this.contentEl);
}
}
} catch (error) {
centralizedLogger.error(`Error in EncryptedCreateFileView setState:`, error);
centralizedLogger.error(`Error in CreateFileViewEncrypted setState:`, error);
// Don't rethrow - just log and continue
}
}
@ -116,8 +116,8 @@ export class EncryptedCreateFileView extends ItemView {
// Refresh the view content
if (this.contentEl) {
this.contentEl.empty();
this.contentEl.addClass('streams-encrypted-create-file-container');
this.createEncryptedFileViewContent(this.contentEl);
this.contentEl.addClass('streams-create-file-encrypted-container');
this.createFileViewEncryptedContent(this.contentEl);
}
}
@ -142,7 +142,7 @@ export class EncryptedCreateFileView extends ItemView {
// Prepare our content element
this.contentEl.empty();
this.contentEl.addClass('streams-encrypted-create-file-container');
this.contentEl.addClass('streams-create-file-encrypted-container');
// Set up the content element styling
this.contentEl.style.height = '100%';
@ -181,8 +181,8 @@ export class EncryptedCreateFileView extends ItemView {
// Store observer for cleanup
(this as any).emptyStateObserver = observer;
// Create our encrypted create file view content
this.createEncryptedFileViewContent(this.contentEl);
// Create our create file view encrypted content
this.createFileViewEncryptedContent(this.contentEl);
}
async onClose(): Promise<void> {
@ -208,37 +208,37 @@ export class EncryptedCreateFileView extends ItemView {
this.leaf = null as any;
}
private createEncryptedFileViewContent(container: HTMLElement): void {
private createFileViewEncryptedContent(container: HTMLElement): void {
// Create the content box
const contentBox = container.createDiv('streams-encrypted-create-file-content');
const contentBox = container.createDiv('streams-create-file-encrypted-content');
// Add icon
const iconContainer = contentBox.createDiv('streams-encrypted-create-file-icon');
const iconContainer = contentBox.createDiv('streams-create-file-encrypted-icon');
setIcon(iconContainer, 'lock');
// Stream info display
const streamContainer = contentBox.createDiv('streams-encrypted-create-file-stream-container');
const streamIcon = streamContainer.createSpan('streams-encrypted-create-file-stream-icon');
const streamContainer = contentBox.createDiv('streams-create-file-encrypted-stream-container');
const streamIcon = streamContainer.createSpan('streams-create-file-encrypted-stream-icon');
setIcon(streamIcon, this.stream.icon || 'book');
const streamName = streamContainer.createSpan('streams-encrypted-create-file-stream');
const streamName = streamContainer.createSpan('streams-create-file-encrypted-stream');
streamName.setText(this.stream.name);
// Encryption indicator
const encryptionIndicator = contentBox.createDiv('streams-encrypted-create-file-encryption-indicator');
const encryptionIndicator = contentBox.createDiv('streams-create-file-encrypted-encryption-indicator');
encryptionIndicator.setText('This stream is encrypted');
// Date display
const dateEl = contentBox.createDiv('streams-encrypted-create-file-date');
const dateEl = contentBox.createDiv('streams-create-file-encrypted-date');
const state = this.dateStateManager.getState();
const formattedDate = this.formatDate(state.currentDate);
dateEl.setText(formattedDate);
// Create button
const buttonContainer = contentBox.createDiv('streams-encrypted-create-file-button-container');
const buttonContainer = contentBox.createDiv('streams-create-file-encrypted-button-container');
const createButton = buttonContainer.createEl('button', {
cls: 'mod-cta streams-encrypted-create-file-button',
cls: 'mod-cta streams-create-file-encrypted-button',
text: 'Create Encrypted File'
});
@ -251,7 +251,7 @@ export class EncryptedCreateFileView extends ItemView {
// Trigger the streams bar component to be added to this view
try {
import('../../shared/event-bus').then(({ eventBus }) => {
eventBus.emit('encrypted-create-file-view-opened', this.leaf);
eventBus.emit('create-file-view-encrypted-opened', this.leaf);
});
} catch (error) {
// Calendar component trigger failed - not critical
@ -303,7 +303,7 @@ export class EncryptedCreateFileView extends ItemView {
const file = await this.createFileNormally();
if (file instanceof TFile) {
// Open the file in the current leaf (this will replace EncryptedCreateFileView)
// Open the file in the current leaf (this will replace CreateFileViewEncrypted)
await this.leaf.openFile(file);
// Trigger encryption after the file is opened
@ -405,4 +405,3 @@ export class EncryptedCreateFileView extends ItemView {
}
}
}

View file

@ -5,7 +5,7 @@ import { OpenStreamDateCommand } from './OpenStreamDateCommand';
import { OpenTodayStreamCommand } from './OpenTodayStreamCommand';
import { OpenTodayCurrentStreamCommand } from './OpenTodayCurrentStreamCommand';
import { CreateFileView, CREATE_FILE_VIEW_TYPE } from './CreateFileView';
import { EncryptedFileView, ENCRYPTED_FILE_VIEW_TYPE } from './EncryptedFileView';
import { InstallMeldView, INSTALL_MELD_VIEW_TYPE } from './InstallMeldView';
import { FileCreationInterface, NormalFileStrategy, MeldEncryptedFileStrategy } from './file-creation-strategies';
import { MeldDetectionService } from '../meld-integration';
import { centralizedLogger } from '../../shared/centralized-logger';

View file

@ -3,9 +3,9 @@ import { Stream } from '../../shared/types';
import { centralizedLogger } from '../../shared/centralized-logger';
import { DateStateManager } from '../../shared/date-state-manager';
export const ENCRYPTED_FILE_VIEW_TYPE = 'streams-encrypted-file-view';
export const INSTALL_MELD_VIEW_TYPE = 'streams-install-meld-view';
export class EncryptedFileView extends ItemView {
export class InstallMeldView extends ItemView {
private filePath: string;
private stream: Stream;
private date: Date;
@ -28,16 +28,16 @@ export class EncryptedFileView extends ItemView {
}
getViewType(): string {
return ENCRYPTED_FILE_VIEW_TYPE;
return INSTALL_MELD_VIEW_TYPE;
}
getDisplayText(): string {
try {
const dateString = this.formatTitleDate(this.date);
return `${dateString} (Encrypted)`;
return `${dateString} (Install Meld)`;
} catch (error) {
centralizedLogger.error('Error formatting display text:', error);
return 'Encrypted File';
return 'Install Meld Plugin';
}
}
@ -76,12 +76,12 @@ export class EncryptedFileView extends ItemView {
// Refresh the view with new state
if (this.contentEl) {
this.contentEl.empty();
this.contentEl.addClass('streams-encrypted-file-container');
this.createEncryptedFileViewContent(this.contentEl);
this.contentEl.addClass('streams-install-meld-container');
this.createInstallMeldViewContent(this.contentEl);
}
}
} catch (error) {
centralizedLogger.error(`Error in EncryptedFileView setState:`, error);
centralizedLogger.error(`Error in InstallMeldView setState:`, error);
}
}
@ -96,7 +96,7 @@ export class EncryptedFileView extends ItemView {
// Prepare our content element
this.contentEl.empty();
this.contentEl.addClass('streams-encrypted-file-container');
this.contentEl.addClass('streams-install-meld-container');
// Set up the content element styling
this.contentEl.style.height = '100%';
@ -108,8 +108,8 @@ export class EncryptedFileView extends ItemView {
// Hide any empty-state elements that might still be present
this.hideEmptyStates();
// Create our encrypted file view content
this.createEncryptedFileViewContent(this.contentEl);
// Create our install meld view content
this.createInstallMeldViewContent(this.contentEl);
}
async onClose(): Promise<void> {
@ -129,31 +129,31 @@ export class EncryptedFileView extends ItemView {
this.leaf = null as any;
}
private createEncryptedFileViewContent(container: HTMLElement): void {
private createInstallMeldViewContent(container: HTMLElement): void {
// Create the content box
const contentBox = container.createDiv('streams-encrypted-file-content');
const contentBox = container.createDiv('streams-install-meld-content');
// Add icon
const iconContainer = contentBox.createDiv('streams-encrypted-file-icon');
const iconContainer = contentBox.createDiv('streams-install-meld-icon');
setIcon(iconContainer, 'lock');
// Stream info display
const streamContainer = contentBox.createDiv('streams-encrypted-file-stream-container');
const streamIcon = streamContainer.createSpan('streams-encrypted-file-stream-icon');
const streamContainer = contentBox.createDiv('streams-install-meld-stream-container');
const streamIcon = streamContainer.createSpan('streams-install-meld-stream-icon');
setIcon(streamIcon, this.stream.icon || 'book');
const streamName = streamContainer.createSpan('streams-encrypted-file-stream');
const streamName = streamContainer.createSpan('streams-install-meld-stream');
streamName.setText(this.stream.name);
// Date display
const dateEl = contentBox.createDiv('streams-encrypted-file-date');
const dateEl = contentBox.createDiv('streams-install-meld-date');
const formattedDate = this.formatDate(this.date);
dateEl.setText(formattedDate);
// Create button
const buttonContainer = contentBox.createDiv('streams-encrypted-file-button-container');
const buttonContainer = contentBox.createDiv('streams-install-meld-button-container');
const createButton = buttonContainer.createEl('button', {
cls: 'mod-cta streams-encrypted-file-button',
cls: 'mod-cta streams-install-meld-button',
text: 'Install Meld Encrypt Plugin'
});
@ -167,7 +167,7 @@ export class EncryptedFileView extends ItemView {
// Trigger the streams bar component to be added to this view
try {
import('../../shared/event-bus').then(({ eventBus }) => {
eventBus.emit('encrypted-file-view-opened', this.leaf);
eventBus.emit('install-meld-view-opened', this.leaf);
});
} catch (error) {
// Calendar component trigger failed - not critical
@ -232,8 +232,8 @@ export class EncryptedFileView extends ItemView {
// Refresh the view content
if (this.contentEl) {
this.contentEl.empty();
this.contentEl.addClass('streams-encrypted-file-container');
this.createEncryptedFileViewContent(this.contentEl);
this.contentEl.addClass('streams-install-meld-container');
this.createInstallMeldViewContent(this.contentEl);
}
}

View file

@ -2,8 +2,8 @@ import { App, TFolder, TFile, MarkdownView, WorkspaceLeaf, normalizePath } from
import { Stream } from '../../shared/types';
import { centralizedLogger } from '../../shared/centralized-logger';
import { CreateFileView, CREATE_FILE_VIEW_TYPE } from './CreateFileView';
import { EncryptedFileView, ENCRYPTED_FILE_VIEW_TYPE } from './EncryptedFileView';
import { EncryptedCreateFileView, ENCRYPTED_CREATE_FILE_VIEW_TYPE } from './EncryptedCreateFileView';
import { InstallMeldView, INSTALL_MELD_VIEW_TYPE } from './InstallMeldView';
import { CreateFileViewEncrypted, CREATE_FILE_VIEW_ENCRYPTED_TYPE } from './CreateFileViewEncrypted';
import { DateStateManager } from '../../shared/date-state-manager';
/**
@ -47,9 +47,9 @@ function isMeldPluginAvailable(app: App): boolean {
}
/**
* Show the EncryptedFileView when Meld is not available
* Show the InstallMeldView when Meld is not available
*/
async function showEncryptedFileView(app: App, file: TFile, stream: Stream, date: Date, reuseCurrentTab: boolean): Promise<void> {
async function showInstallMeldView(app: App, file: TFile, stream: Stream, date: Date, reuseCurrentTab: boolean): Promise<void> {
try {
// Handle leaf selection based on reuseCurrentTab setting
let leaf: WorkspaceLeaf | null = null;
@ -86,7 +86,7 @@ async function showEncryptedFileView(app: App, file: TFile, stream: Stream, date
// Check if leaf is null before proceeding
if (!leaf) {
centralizedLogger.error('Failed to create or find a workspace leaf for EncryptedFileView');
centralizedLogger.error('Failed to create or find a workspace leaf for InstallMeldView');
return;
}
@ -104,7 +104,7 @@ async function showEncryptedFileView(app: App, file: TFile, stream: Stream, date
// Use the proper Obsidian view system instead of direct DOM manipulation
try {
await leaf.setViewState({
type: ENCRYPTED_FILE_VIEW_TYPE,
type: INSTALL_MELD_VIEW_TYPE,
state: {
stream: stream,
date: date.toISOString(),
@ -112,7 +112,7 @@ async function showEncryptedFileView(app: App, file: TFile, stream: Stream, date
}
});
} catch (error) {
centralizedLogger.error(`Error setting view state for EncryptedFileView:`, error);
centralizedLogger.error(`Error setting view state for InstallMeldView:`, error);
// If setViewState fails, we can't proceed
return;
}
@ -121,7 +121,7 @@ async function showEncryptedFileView(app: App, file: TFile, stream: Stream, date
app.workspace.setActiveLeaf(leaf, { focus: true });
} catch (error) {
centralizedLogger.error('Error setting up EncryptedFileView:', error);
centralizedLogger.error('Error setting up InstallMeldView:', error);
return;
}
} catch (error) {
@ -304,7 +304,7 @@ export async function openStreamDate(app: App, stream: Stream, date: Date = new
// Use the proper Obsidian view system instead of direct DOM manipulation
// Choose the appropriate view type based on whether the stream is encrypted
const viewType = stream.encryptThisStream ? ENCRYPTED_CREATE_FILE_VIEW_TYPE : CREATE_FILE_VIEW_TYPE;
const viewType = stream.encryptThisStream ? CREATE_FILE_VIEW_ENCRYPTED_TYPE : CREATE_FILE_VIEW_TYPE;
try {
await leaf.setViewState({
@ -340,8 +340,8 @@ export async function openStreamDate(app: App, stream: Stream, date: Date = new
if (isMdencFile) {
// For .mdenc files, check if Meld is available first
if (!isMeldPluginAvailable(app)) {
// Show the EncryptedFileView instead of just an error
await showEncryptedFileView(app, file, stream, date, reuseCurrentTab);
// Show the InstallMeldView instead of just an error
await showInstallMeldView(app, file, stream, date, reuseCurrentTab);
return;
}

View file

@ -1457,7 +1457,7 @@
/*********************************************************
* ENCRYPTED FILE VIEW STYLES
*********************************************************/
.streams-encrypted-file-container {
.streams-install-meld-container {
display: flex;
justify-content: center;
align-items: center;
@ -1470,7 +1470,7 @@
position: relative;
}
.streams-encrypted-file-content {
.streams-install-meld-content {
display: flex;
flex-direction: column;
align-items: center;
@ -1485,7 +1485,7 @@
position: relative;
}
.streams-encrypted-file-content::before {
.streams-install-meld-content::before {
content: '🔒 ENCRYPTED';
position: absolute;
top: -8px;
@ -1502,11 +1502,11 @@
letter-spacing: 0.5px;
}
.streams-encrypted-file-icon {
.streams-install-meld-icon {
margin-bottom: 24px;
}
.streams-encrypted-file-icon svg {
.streams-install-meld-icon svg {
width: 48px;
height: 48px;
color: var(--text-accent);
@ -1515,7 +1515,7 @@
}
.streams-encrypted-file-title {
.streams-install-meld-title {
font-size: 1.2em;
font-weight: 600;
color: var(--text-muted);
@ -1523,7 +1523,7 @@
line-height: 1.2;
}
.streams-encrypted-file-description {
.streams-install-meld-description {
font-size: 0.9em;
color: var(--text-muted);
margin-bottom: 20px;
@ -1531,31 +1531,31 @@
opacity: 0.8;
}
.streams-encrypted-file-stream-container {
.streams-install-meld-stream-container {
display: flex;
align-items: center;
margin-bottom: 12px;
}
.streams-encrypted-file-stream-icon {
.streams-install-meld-stream-icon {
margin-right: 8px;
display: flex;
align-items: center;
}
.streams-encrypted-file-stream-icon svg {
.streams-install-meld-stream-icon svg {
width: 18px;
height: 18px;
color: var(--text-muted);
}
.streams-encrypted-file-stream {
.streams-install-meld-stream {
font-size: 1em;
font-weight: 600;
color: var(--text-muted);
}
.streams-encrypted-file-date {
.streams-install-meld-date {
font-size: 1.4em;
font-weight: 700;
color: var(--text-normal);
@ -1563,7 +1563,7 @@
line-height: 1.2;
}
.streams-encrypted-file-path {
.streams-install-meld-path {
font-family: var(--font-monospace);
font-size: 0.8em;
color: var(--text-muted);
@ -1575,11 +1575,11 @@
border: 1px solid rgba(var(--background-modifier-border-rgb), 0.3);
}
.streams-encrypted-file-button-container {
.streams-install-meld-button-container {
margin-top: 16px;
}
.streams-encrypted-file-button {
.streams-install-meld-button {
padding: 12px 28px;
font-size: 1em;
border-radius: 8px;
@ -1598,60 +1598,60 @@
box-shadow: 0 4px 12px rgba(var(--interactive-accent-rgb), 0.3);
}
.streams-encrypted-file-button::before {
.streams-install-meld-button::before {
content: '🔓';
font-size: 14px;
}
.streams-encrypted-file-button:hover {
.streams-install-meld-button:hover {
transform: translateY(-2px);
box-shadow: 0 8px 20px rgba(var(--interactive-accent-rgb), 0.4);
background: linear-gradient(135deg, var(--interactive-accent-hover) 0%, var(--interactive-accent) 100%);
}
.streams-encrypted-file-button:active {
.streams-install-meld-button:active {
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(var(--interactive-accent-rgb), 0.3);
}
.streams-encrypted-file-button-text {
.streams-install-meld-button-text {
margin-left: 4px;
}
.streams-encrypted-file-button svg {
.streams-install-meld-button svg {
width: 18px;
height: 18px;
}
/* Mobile responsiveness */
.is-mobile .streams-encrypted-file-content {
.is-mobile .streams-install-meld-content {
width: 100%;
max-width: none;
padding: 30px 20px;
border-radius: 8px;
}
.is-mobile .streams-encrypted-file-container {
.is-mobile .streams-install-meld-container {
padding: 20px;
}
.is-phone .streams-encrypted-file-date {
.is-phone .streams-install-meld-date {
font-size: 1.2em;
}
/*********************************************************
* ENCRYPTED CREATE FILE VIEW STYLES
*********************************************************/
.workspace-leaf-content:has(.streams-encrypted-create-file-container) {
.workspace-leaf-content:has(.streams-create-file-encrypted-container) {
width: 100%;
}
/* Prevent scrollbars on EncryptedCreateFileView */
.workspace-leaf-content:has(.streams-encrypted-create-file-container) .view-content {
.workspace-leaf-content:has(.streams-create-file-encrypted-container) .view-content {
overflow: hidden;
}
.streams-encrypted-create-file-container {
.streams-create-file-encrypted-container {
display: flex;
justify-content: center;
align-items: center;
@ -1665,7 +1665,7 @@
z-index: 1;
}
.streams-encrypted-create-file-content {
.streams-create-file-encrypted-content {
display: flex;
flex-direction: column;
align-items: center;
@ -1684,18 +1684,18 @@
border: 1px solid var(--background-modifier-border);
}
.streams-encrypted-create-file-icon {
.streams-create-file-encrypted-icon {
margin-bottom: 32px;
}
.streams-encrypted-create-file-icon svg {
.streams-create-file-encrypted-icon svg {
width: 48px;
height: 48px;
color: var(--text-accent);
opacity: 0.9;
}
.streams-encrypted-create-file-stream-container {
.streams-create-file-encrypted-stream-container {
display: flex;
align-items: center;
justify-content: center;
@ -1706,25 +1706,25 @@
border: 1px solid var(--background-modifier-border);
}
.streams-encrypted-create-file-stream-icon {
.streams-create-file-encrypted-stream-icon {
margin-right: 8px;
display: flex;
align-items: center;
}
.streams-encrypted-create-file-stream-icon svg {
.streams-create-file-encrypted-stream-icon svg {
width: 18px;
height: 18px;
color: var(--text-muted);
}
.streams-encrypted-create-file-stream {
.streams-create-file-encrypted-stream {
font-size: 1em;
font-weight: 600;
color: var(--text-normal);
}
.streams-encrypted-create-file-encryption-indicator {
.streams-create-file-encrypted-encryption-indicator {
font-size: 0.9em;
font-weight: 500;
color: var(--text-accent);
@ -1740,12 +1740,12 @@
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
.streams-encrypted-create-file-encryption-indicator::before {
.streams-create-file-encrypted-encryption-indicator::before {
content: "🔒";
font-size: 16px;
}
.streams-encrypted-create-file-date {
.streams-create-file-encrypted-date {
font-size: 1.4em;
font-weight: 700;
color: var(--text-normal);
@ -1753,11 +1753,11 @@
line-height: 1.2;
}
.streams-encrypted-create-file-button-container {
.streams-create-file-encrypted-button-container {
margin-top: 16px;
}
.streams-encrypted-create-file-button {
.streams-create-file-encrypted-button {
padding: 12px 28px;
font-size: 1em;
border-radius: 8px;
@ -1770,26 +1770,26 @@
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
.streams-encrypted-create-file-button:hover {
.streams-create-file-encrypted-button:hover {
transform: translateY(-2px);
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.2);
background-color: var(--interactive-accent-hover);
border-color: var(--interactive-accent-hover);
}
.streams-encrypted-create-file-button:active {
.streams-create-file-encrypted-button:active {
transform: translateY(0);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
.streams-encrypted-create-file-button svg {
.streams-create-file-encrypted-button svg {
width: 18px;
height: 18px;
margin-right: 8px;
}
/* Mobile responsiveness for encrypted create file view */
.is-mobile .streams-encrypted-create-file-content {
.is-mobile .streams-create-file-encrypted-content {
width: 100%;
max-width: none;
padding: 36px 24px;
@ -1797,25 +1797,25 @@
margin: 16px;
}
.is-mobile .streams-encrypted-create-file-container {
.is-mobile .streams-create-file-encrypted-container {
padding: 16px;
}
.is-phone .streams-encrypted-create-file-content {
.is-phone .streams-create-file-encrypted-content {
padding: 32px 20px;
margin: 12px;
}
.is-phone .streams-encrypted-create-file-date {
.is-phone .streams-create-file-encrypted-date {
font-size: 1.2em;
}
.is-phone .streams-encrypted-create-file-encryption-indicator {
.is-phone .streams-create-file-encrypted-encryption-indicator {
font-size: 0.85em;
padding: 6px 12px;
}
.is-phone .streams-encrypted-create-file-button {
.is-phone .streams-create-file-encrypted-button {
padding: 10px 24px;
font-size: 0.95em;
}