Handling CORS for publicly deployed npm package

I’m developing a npm package intended to be used in FrontEnd web. This package makes an API call to my Backend server. How can I handle CORS in my backend as the package will be used by others in their own domains?. I don’t want to store and whitelist the domains from everyone.

can i get page impression data of particular account using facebook market Ad Account, Insights facebook market api

can i get page based impression data of particular account using this api https://graph.facebook.com/v19.0/act_245199783381840/insights? just like Facebook platform
see following Facebook platform image

when i am using this API i’m getting response but it doesn’t have pages data…i want to see impression data by page wise

enter image description here

Issue with filtering and displaying valid words in word unscrambler

I’m building a Word Unscrambler website using ReactJS with Vite. The project takes a scrambled word as input and displays all possible valid words, sorted by length (longest first).

What’s Ready So Far:
I have a words.json file containing 400,000+ words. However, it only contains words, it does not include meanings, definitions, phonetics, examples, or synonyms.

The app correctly loads and processes this JSON file to generate possible words.

The Issue I’m Facing:
I need to filter out invalid or nonsensical words from the dataset. Some words appearing in the output are either:

Obscure/Uncommon words that are not typically used in English.

Random letter combinations that don’t form meaningful words.

What I’ve Tried So Far:

Basic Filtering (Manual Cleanup):
Manually removing invalid words from words.json, but this isn’t scalable for 400,000+ words.

Regex or Length-Based Filtering:
Tried filtering words based on length and letter patterns, but this removed valid words as well.

Using a Verified Word List:
Checked words against a smaller set of known valid words, but this approach removed too many uncommon (but valid) words.

API-Based Validation:
I explored API-based dictionary validation, but most APIs do not support batch processing of words, making real-time validation inefficient.

I plan to use the Wordnik API in the future, but it does not support checking multiple words at once.

What’s Not Working:
Regex and pattern-based filtering removed too many valid words.

A predefined “verified” list also removed many words that should have been considered valid.

Manual cleanup isn’t practical due to the large dataset.

API validation isn’t feasible yet since batch processing isn’t supported.

My Question:
What’s the best way to filter out nonsensical words efficiently using a large dataset like mine? Are there any local validation techniques I can use until I implement an API-based solution?

Any suggestions or alternative approaches would be greatly appreciated!

can i get page impression data of particular account using this api https://graph.facebook.com/v19.0/act_245199783381840/insights?

can i get page impression data of particular account using this api https://graph.facebook.com/v19.0/act_245199783381840/insights? just like Facebook platform
see following Facebook platform image

when i am using this API i’m getting response but it doesn’t have pages data…i want to see impression data by page wise

enter image description here

Issue with Filtering and Displaying Valid Words in React-Based Word Unscrambler

I’m building a Word Unscrambler website using ReactJS with Vite. The project takes a scrambled word as input and displays all possible valid words, sorted by length (longest first).

What’s Ready So Far:
I have a words.json file containing 400,000+ words. However, it only contains words, it does not include meanings, definitions, phonetics, examples, or synonyms.

The app correctly loads and processes this JSON file to generate possible words.

The Issue I’m Facing:
I need to filter out invalid or nonsensical words from the dataset. Some words appearing in the output are either:

Obscure/Uncommon words that are not typically used in English.

Random letter combinations that don’t form meaningful words.

What I’ve Tried So Far:

Basic Filtering (Manual Cleanup):
Manually removing invalid words from words.json, but this isn’t scalable for 400,000+ words.

Regex or Length-Based Filtering:
Tried filtering words based on length and letter patterns, but this removed valid words as well.

Using a Verified Word List:
Checked words against a smaller set of known valid words, but this approach removed too many uncommon (but valid) words.

API-Based Validation:
I explored API-based dictionary validation, but most APIs do not support batch processing of words, making real-time validation inefficient.

I plan to use the Wordnik API in the future, but it does not support checking multiple words at once.

What’s Not Working:
Regex and pattern-based filtering removed too many valid words.

A predefined “verified” list also removed many words that should have been considered valid.

Manual cleanup isn’t practical due to the large dataset.

API validation isn’t feasible yet since batch processing isn’t supported.

My Question:
What’s the best way to filter out nonsensical words efficiently using a large dataset like mine? Are there any local validation techniques I can use until I implement an API-based solution?

Any suggestions or alternative approaches would be greatly appreciated!

How to get IDE intellisense autocompletion through jsdoc type hints with Typescript packages?

I just noticed that we can get IDE intellisense autocompletion through jsdoc type hints like this ( From vite config documentation).

/** @type {import('vite').UserConfig} */
export default {
  // ...
}

Is the import('vite') type functionality part of JSDoc? I’ve never seen this used before, so just curious how it works.

It seems like we can get autocompletion for any type in a plain javascript project by using @typeannotations like this?

CORS Issue When Using External Service for API Calls in Next.js”

I am encountering an issue with Next.js that I don’t quite understand. I have a service file that I want to use to make API calls faster and more structured. However, when I call the API via this service, I get a CORS error, but everything works when I call the API directly from my component.

My apiService.ts file:

import axios, { AxiosRequestConfig, AxiosResponse } from 'axios';

const apiClient = axios.create({
  baseURL: 'http://localhost:4000',
  headers: {
    'Content-Type': 'application/json',
    'Access-Control-Allow-Origin': '*', // Allow all origins
  },
  withCredentials: true,
});

// Generic function for GET requests
export const get = async <T>(url: string, config?: AxiosRequestConfig): Promise<T> => {
  try {
    const response: AxiosResponse<T> = await apiClient.get(url, config);
    return response.data;
  } catch (error) {
    console.error('GET request error:', error);
    throw error;
  }
};

// Generic function for POST requests
export const post = async <T, R>(url: string, data: T, config?: AxiosRequestConfig): Promise<R> => {
  try {
    const response: AxiosResponse<R> = await apiClient.post(url, data, config);
    return response.data;
  } catch (error) {
    console.error('POST request error:', error);
    throw error;
  }
};

// Generic function for PUT requests
export const put = async <T, R>(url: string, data: T, config?: AxiosRequestConfig): Promise<R> => {
  try {
    const response: AxiosResponse<R> = await apiClient.put(url, data, config);
    return response.data;
  } catch (error) {
    console.error('PUT request error:', error);
    throw error;
  }
};

// Generic function for DELETE requests
export const deleteRequest = async <T>(url: string, config?: AxiosRequestConfig): Promise<T> => {
  try {
    const response: AxiosResponse<T> = await apiClient.delete(url, config);
    return response.data;
  } catch (error) {
    console.error('DELETE request error:', error);
    throw error;
  }
};

In my modal component (ModalCreateExercise.tsx), I call the API like this:

'use client'

import { zodResolver } from "@hookform/resolvers/zod"
import { SubmitHandler, useForm } from "react-hook-form"
import { z } from "zod"
import axios from 'axios';

import { BaseModal } from "@/components/commun/BaseModal"
import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form"
import { Input } from "@/components/ui/input"
import { Button } from "@/components/ui/button"
import { createExercise, getExercises } from "@/services/exerciseService"
import { Exercise } from "@/types/exercise"
import { useEffect, useState } from "react"
import { get, post } from "@/app/services/axiosService";

const formSchema = z.object({
  name: z.string().min(2, {
    message: "Username must be at least 2 characters.",
  }),
})

export function ModalCreateExercise() {
  const [exercises, setExercises] = useState<Exercise[]>([]);

  //it's working
  useEffect(() => {
    const fetchExercises = async () => {
      try {
        // Making the API call with axios directly
        const response = await axios.get<Exercise[]>('http://localhost:4000/exercises');
        console.log('Exercises fetched:', response.data);
      } catch (error) {
        console.error('Error fetching exercises:', error);
      }
    };
  
    fetchExercises();
  }, []);
  
  // don't working
  useEffect(() => {
    const fetchExercises = async () => {
      try {
        const response = await get<Exercise[]>('/exercises');
        console.log('Exercises fetched:', response);
        
      } catch (error) {
        console.error('Error fetching exercises:', error);
      }
    };

    fetchExercises();
  }, []);


  const form = useForm<z.infer<typeof formSchema>>({
    resolver: zodResolver(formSchema),
    defaultValues: {
      name: ""
    },
  })

  const onSubmit = async() => {
    const data: Exercise = {
      userId: 1,
      name: form.getValues().name,
    };
  
 
    try {
      const newExercise = await post<typeof data, Exercise>('/exercises', data);
      console.log('Exercise created:', newExercise);
    } catch (error) {
      console.error('Error creating exercise:', error);
    }
  };

  return (
    <BaseModal className="ml-auto" title="Créer un exercice" description="Créer un exercice pour vos étudiants" buttonTitle="Créer un exercice" saveButtonTitle="Créer">
      <div>
        <Form {...form}>
          <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-8">
            <FormField
              control={form.control}
              name="name"
              render={({ field }) => (
                <FormItem>
                  <FormLabel>Nom de l'exercice</FormLabel>
                  <FormControl>
                    <Input placeholder="Nom" {...field} />
                  </FormControl>
                  <FormMessage />
                </FormItem>
              )}
            />
            <Button type="submit">Submit</Button>
          </form>
        </Form>
      </div>
    </BaseModal>
  )
}

My issue:
When I use the native axios method in the useEffect, everything works fine, and I can fetch the data from the API without any CORS issues. However, as soon as I try to call the API via my service with Axios, I run into a CORS problem.

The backend server (NestJS) is configured to accept CORS requests, but the issue only occurs when I call the API via the service I created. The problem seems to stem from the fact that the API is not recognizing calls coming from this service.

Here’s what I’ve tried:

I verified the CORS configuration on my NestJS server, and it seems correct.
I attempted to add Access-Control-Allow-Origin headers in my service file, but it didn’t resolve the issue.
Do you have any idea why this happens? Perhaps something related to how Axios is configured or how cookies are handled?

Thank you in advance for your help!

Sheetrock.js is not ignoring my first row

I am using a combination of handlebars.js and sheetrock.js to update a webpage with data from a spreadsheet. What I have is working fine on several pages.

Example of it working fine:
https://www.swordplaysummit.com/classes.shtml
https://www.swordplaysummit.com/instructors.shtml

I tried to make another page with the instructor info formatted in a slightly different way. I created an additional sheet that allows for one instructor to have multiple classes without it creating a duplicate entry (as in the above example) but sheetrock.js is displaying the data from the first row as if it’s one of the entries. The release notes state that it’s supposed to assume that the first row is headers (and it does everywhere but on this sheet)

Sheet in question:
https://docs.google.com/spreadsheets/d/19umEyXWTStC4ZNz7yXviygpnerX9BjA_luT9CWovGNY/edit?pli=1&gid=1945126135#gid=1945126135

Here’s the code:

<script>
  // Define spreadsheet URL.
 var mySpreadsheet = "https://docs.google.com/spreadsheets/d/19umEyXWTStC4ZNz7yXviygpnerX9BjA_luT9CWovGNY/edit?pli=1&gid=1945126135#gid=1945126135"

 // Compile the Handlebars template for instructor info.
 var InstTemplate = Handlebars.compile($("#inst-template").html())

 // Load all relevant instructor info.
 $("#inst").sheetrock({
   url: mySpreadsheet,
   query: "select A,B,C,D,E,F,G,H,I",
   fetchSize: 0,
   rowTemplate: InstTemplate,
 })

This is what I’m getting on this new page. I can’t figure out why it’s reading the first row as data instead of labels. Everything after the first entry comes out fine.

This is what I'm getting now

I’m making a visual novel with different pic and inside of that pic is a dialogue box and so fo the different choices for the next scene

so I’m making a visual novel and it has a picture and inside of that picture is a dialogue box in the bottom part

so i have 2 choices and it has a different outcome each outcome had a picture for that particular scene

I’m having a problem in putting different picture a dialogue in my code

i hope that someone can help me about it

im expecting a visual novel with a picture for the scene and has a dialogue box inside of that picture in the bottom part and then when i tried to go to the next scene it had a different picture for the next scene that i had chosen

How to tag documents on client-side for autoopen taskpane?

I have the following Add-in only manifest (React/TypeScript Task pane project made using Yeoman):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<OfficeApp xmlns="http://schemas.microsoft.com/office/appforoffice/1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bt="http://schemas.microsoft.com/office/officeappbasictypes/1.0" xmlns:ov="http://schemas.microsoft.com/office/taskpaneappversionoverrides" xsi:type="TaskPaneApp">
  <Id>...................</Id>
  <Version>1.0.0.0</Version>
  <ProviderName>Contoso</ProviderName>
  <DefaultLocale>en-US</DefaultLocale>
  <DisplayName DefaultValue="............"/>
  <Description DefaultValue="............"/>
  <IconUrl DefaultValue="https://localhost:3000/assets/icon-32.png"/>
  <HighResolutionIconUrl DefaultValue="https://localhost:3000/assets/icon-64.png"/>
  <SupportUrl DefaultValue="https://www.contoso.com/help"/>
  <AppDomains>
    <AppDomain>https://www.contoso.com</AppDomain>
  </AppDomains>
  <Hosts>
    <Host Name="Document"/>
    <Host Name="Workbook"/>
    <Host Name="Presentation"/>
  </Hosts>
  <DefaultSettings>
    <SourceLocation DefaultValue="https://localhost:3000/taskpane.html"/>
  </DefaultSettings>
  <Permissions>ReadWriteDocument</Permissions>
  <VersionOverrides xmlns="http://schemas.microsoft.com/office/taskpaneappversionoverrides" xsi:type="VersionOverridesV1_0">
    <Hosts>
      <Host xsi:type="Document">
        <DesktopFormFactor>
          <FunctionFile resid="Commands.Url"/>
          <ExtensionPoint xsi:type="PrimaryCommandSurface">
            <OfficeTab id="TabHome">
              <Group id="CommandsGroup">
                <Label resid="CommandsGroup.Label"/>
                <Icon>
                  <bt:Image size="16" resid="Icon.16x16"/>
                  <bt:Image size="32" resid="Icon.32x32"/>
                  <bt:Image size="80" resid="Icon.80x80"/>
                </Icon>
                <Control xsi:type="Button" id="TaskpaneButton">
                  <Label resid="TaskpaneButton.Label"/>
                  <Supertip>
                    <Title resid="TaskpaneButton.Label"/>
                    <Description resid="TaskpaneButton.Tooltip"/>
                  </Supertip>
                  <Icon>
                    <bt:Image size="16" resid="Icon.16x16"/>
                    <bt:Image size="32" resid="Icon.32x32"/>
                    <bt:Image size="80" resid="Icon.80x80"/>
                  </Icon>
                  <Action xsi:type="ShowTaskpane">
                    <TaskpaneId>Office.AutoShowTaskpaneWithDocument</TaskpaneId>
                    <SourceLocation resid="Taskpane.Url"/>
                  </Action>
                </Control>
              </Group>
            </OfficeTab>
          </ExtensionPoint>
        </DesktopFormFactor>
      </Host>
      <Host xsi:type="Workbook">
        <DesktopFormFactor>
          <FunctionFile resid="Commands.Url"/>
          <ExtensionPoint xsi:type="PrimaryCommandSurface">
            <OfficeTab id="TabHome">
              <Group id="CommandsGroup">
                <Label resid="CommandsGroup.Label"/>
                <Icon>
                  <bt:Image size="16" resid="Icon.16x16"/>
                  <bt:Image size="32" resid="Icon.32x32"/>
                  <bt:Image size="80" resid="Icon.80x80"/>
                </Icon>
                <Control xsi:type="Button" id="TaskpaneButton">
                  <Label resid="TaskpaneButton.Label"/>
                  <Supertip>
                    <Title resid="TaskpaneButton.Label"/>
                    <Description resid="TaskpaneButton.Tooltip"/>
                  </Supertip>
                  <Icon>
                    <bt:Image size="16" resid="Icon.16x16"/>
                    <bt:Image size="32" resid="Icon.32x32"/>
                    <bt:Image size="80" resid="Icon.80x80"/>
                  </Icon>
                  <Action xsi:type="ShowTaskpane">
                    <TaskpaneId>Office.AutoShowTaskpaneWithDocument</TaskpaneId>
                    <SourceLocation resid="Taskpane.Url"/>
                  </Action>
                </Control>
              </Group>
            </OfficeTab>
          </ExtensionPoint>
        </DesktopFormFactor>
      </Host>
      <Host xsi:type="Presentation">
        <DesktopFormFactor>
          <FunctionFile resid="Commands.Url"/>
          <ExtensionPoint xsi:type="PrimaryCommandSurface">
            <OfficeTab id="TabHome">
              <Group id="CommandsGroup">
                <Label resid="CommandsGroup.Label"/>
                <Icon>
                  <bt:Image size="16" resid="Icon.16x16"/>
                  <bt:Image size="32" resid="Icon.32x32"/>
                  <bt:Image size="80" resid="Icon.80x80"/>
                </Icon>
                <Control xsi:type="Button" id="TaskpaneButton">
                  <Label resid="TaskpaneButton.Label"/>
                  <Supertip>
                    <Title resid="TaskpaneButton.Label"/>
                    <Description resid="TaskpaneButton.Tooltip"/>
                  </Supertip>
                  <Icon>
                    <bt:Image size="16" resid="Icon.16x16"/>
                    <bt:Image size="32" resid="Icon.32x32"/>
                    <bt:Image size="80" resid="Icon.80x80"/>
                  </Icon>
                  <Action xsi:type="ShowTaskpane">
                    <TaskpaneId>Office.AutoShowTaskpaneWithDocument</TaskpaneId>
                    <SourceLocation resid="Taskpane.Url"/>
                  </Action>
                </Control>
              </Group>
            </OfficeTab>
          </ExtensionPoint>
        </DesktopFormFactor>
      </Host>
    </Hosts>
    <Resources>
      <bt:Images>
        <bt:Image id="Icon.16x16" DefaultValue="https://localhost:3000/assets/icon-16.png"/>
        <bt:Image id="Icon.32x32" DefaultValue="https://localhost:3000/assets/icon-32.png"/>
        <bt:Image id="Icon.80x80" DefaultValue="https://localhost:3000/assets/icon-80.png"/>
      </bt:Images>
      <bt:Urls>
        <bt:Url id="Commands.Url" DefaultValue="https://localhost:3000/commands.html"/>
        <bt:Url id="Taskpane.Url" DefaultValue="https://localhost:3000/taskpane.html"/>
      </bt:Urls>
      <bt:ShortStrings>
        <bt:String id="CommandsGroup.Label" DefaultValue="Commands Group"/>
        <bt:String id="TaskpaneButton.Label" DefaultValue="............"/>
      </bt:ShortStrings>
      <bt:LongStrings>
        <bt:String id="TaskpaneButton.Tooltip" DefaultValue="Click to Show a Task Pane"/>
      </bt:LongStrings>
    </Resources>
  </VersionOverrides>
</OfficeApp>

Started out as Word, but I added Host tags on both OfficeApp > Hosts and OfficeApp > VersionOverrides > Hosts for both PowerPoint and Excel. Tried following the following tutorial. But I don’t know where to put the below lines. Tried both on taskpane.ts and commands.ts.

Office.context.document.settings.set("Office.AutoShowTaskpaneWithDocument", true);
Office.context.document.settings.saveAsync();

Where do I put the above lines, and do I need to put them in an Office.onReady or initialize ?

Validating form when I have preventDefault() not working

I am a complete newbie when it comes to javascript. Its a requirement suddenly that I have to do because of using Microsoft power pages.

I mainly use chatgpt or copilot to help me get through stuff but this time it seems like a blocker.

I have a form and I created a function named submitForm(event) which has event.preventDefault()

the problem is that whenever a required field doesnt have an input and the form was submitted , the span should show or the “error label” should show below the field but its currently not. Another problem is that the alert is not showing however when I tested it using the console it sends out alerts so I also dont know whats the problem causing this.

Please see codes below.

function:

function submitForm(event) {
event.preventDefault(); // Prevent the default form submission

// Validate the form
var form = document.querySelector("form");

form.querySelectorAll('input[required], select[required]').forEach(function(input) {
    var errorSpan = input.nextElementSibling;

    if (!input.value) {
        errorSpan.style.display = 'inline';
        valid = false;
    } else {
        errorSpan.style.display = 'none';
    }
});


if (!form.checkValidity()) {
    alert("Please fill out all required fields.");
    return;
}
}

FORM:

<form id="wForm" onsubmit="submitForm(event)">
<label>Do you want to state your name or wish to remain anonymous?</label>
<input type="radio" id="anonymous_yes" name="anonymous" value="yes" onclick="toggleAnonymous()" required> Yes, I want to state my name<br>
<input type="radio" id="anonymous_no" name="anonymous" value="no" onclick="toggleAnonymous()"> No, I wish to remain anonymous<br>

<span class="error" style="color:red; display:none;">This field is required</span>

<div id="full_name" style="display:none;">
    <label>Full Name:</label>
    <input type="text" name="full_name"><br>
</div>

<div id="email" style="display:none;">
    <label>Email:</label>
    <input type="email" name="email"><br>
</div>
<input type="submit" value="Submit" style="margin-top: 20px;">

What seems to be the problem I am having?

CSS transform: Pan overshoots when scale is below 0.5 but works fine above 0.5

I’m implementing a pan-zoom functionality in JavaScript where users can pan and zoom an iframe. The implementation works well when the zoom level is above 0.5 (50%), but when zooming out below 0.5, the panning movement overshoots – meaning the content moves too far relative to the mouse movement.

Here’s my current implementation for updating the panning position:

let translateX = 0;
let translateY = 0;
let scale = 100;
let isPanning = false;
let lastMouseX = 0;
let lastMouseY = 0;

function updatePanning(x, y) {
  if (!isPanning) return;
  
  const scaleValue = scale / 100; // scale is in percentage (e.g., 50 means 0.5)
  const deltaX = x - lastMouseX;
  const deltaY = y - lastMouseY;
  
  // This works fine when scaleValue > 0.5, but overshoots when scaleValue < 0.5
  translateX = translateX + deltaX / scaleValue;
  translateY = translateY + deltaY / scaleValue;
  
  lastMouseX = x;
  lastMouseY = y;
  
  applyTransform();
}

function applyTransform() {
  const scaleValue = scale / 100;
  wrapper.style.transform = `scale(${scaleValue}) translate(${translateX}px, ${translateY}px)`;
}

I’m using the CSS transform property with scale and translate. The panning calculation divides the mouse movement delta by the current scale to compensate for the scaling effect.

Why does this approach work correctly at scales above 0.5 but cause overshooting at lower scales? Is there a different formula I should be using for the coordinate transformation at very low zoom levels?

I’ve created a demo here: Use scrool to zoom and left mouse click to pan
https://jsfiddle.net/wgkptxsn/
or here
https://codepen.io/wisegorilla/pen/WbNKeOR

Any insights on how to make panning consistent across all zoom levels would be greatly appreciated.

How can I see changes to HTML & CSS caused by scripts or navigation events

How to see changes to HTML & CSS caused by scripts or navigation events

I often work with UI templates that I adapt to the framework I am coding with. Often there are UI features that are triggered off of mouse overs, etc… that rely on the position of the pointer. Once the pointer is removed the HTML/CSS reverts back to the original state.

A simple example is a Drop Down Menu triggered by a hover event.

<div>

  <button class="dropdown">Dropdown</button>

  <div class="dropdown-content">

<a href="#">Link 1</a>

<a href="#">Link 2</a>

<a href="#">Link 3</a>

  </div>

</div>

<style>

/* Dropdown Content (Hidden by Default) */

.dropdown-content {

  display: none;

  position: absolute;

  z-index: 1;

}

/* Show the dropdown menu on hover */

.dropdown:hover .dropdown-content {display: block;}

</style>

One can easily find this by using Inspect in developer tools and watching for the change in the CSS of <div class="dropdown-content"> tag when you hover over the <button class="dropdown">Dropdown</button> tag (the css for the hover is selected and appears in the top of the Developer Tools Styles Window).

Unfortunately, many UI features are not this easy to uncover. Hover events can trigger complex unfamiliar JavaScript liberties, etc. with changes that are not easily noticed in the Developer Tools. This can lead to time spend tracing through compressed JavaScript code or frustration with changes disappearing when you move your mouse pointer off of the spot to use the dev tools, etc.

To avoid debugging 3rd party JavaScript (that I am often trying to replace), the rough solution I have found to this has been to dump a copy of the HTML/CSS to a file. Cause the UI change to take place and dump a second file, then Diff the files to see the changes to the HTML and Style that causes the changes.

Is there a tool that will display the diff for me without having to dump files to disk?

As I mentioned, it’s not always easy to spot the changes in the Developer Tools HTML & CSS windows without moving your mouse (losing the changes).