Untitled

 avatar
unknown
plain_text
a year ago
3.7 kB
5
Indexable
<script lang="ts">
  // Define types
  type Brand = 'intel' | 'amd';
  type Socket = { value: string; name: string };
  type Model = { value: string; name: string };
  type CpuData = {
    [brand in Brand]: {
      sockets: Socket[];
      models: {
        [socket: string]: Model[];
      };
    };
  };

  // Define CPU data
  const cpuData: CpuData = {
    intel: {
      sockets: [
        { value: 'lga1700', name: 'LGA 1700' },
        { value: 'lga1200', name: 'LGA 1200' }
      ],
      models: {
        lga1700: [
          { value: 'intel_i9_14900k', name: 'Intel Core i9-14900K' },
          { value: 'intel_i7_14700k', name: 'Intel Core i7-14700K' }
        ],
        lga1200: [
          { value: 'intel_i9_11900k', name: 'Intel Core i9-11900K' },
          { value: 'intel_i7_11700k', name: 'Intel Core i7-11700K' }
        ]
      }
    },
    amd: {
      sockets: [
        { value: 'am4', name: 'AM4' },
        { value: 'am5', name: 'AM5' }
      ],
      models: {
        am5: [
          { value: 'ryzen9_7950x3d', name: 'Ryzen 9 7950X3D' },
          { value: 'ryzen7_7800x3d', name: 'Ryzen 7 7800X3D' }
        ],
        am4: [
          { value: 'ryzen9_5950x', name: 'Ryzen 9 5950X' },
          { value: 'ryzen7_5800x3d', name: 'Ryzen 7 5800X3D' }
        ]
      }
    }
  };

  // State variables
  let selectedBrand: Brand | '' = '';
  let selectedSocket = '';
  let selectedModel = '';

  // Derived values
  $: brands = Object.keys(cpuData) as Brand[];
  $: availableSockets = selectedBrand ? cpuData[selectedBrand].sockets : [];
  $: availableModels = selectedBrand && selectedSocket
    ? cpuData[selectedBrand].models[selectedSocket] || []
    : [];

  // Reset dependent selections when a parent selection changes
  $: if (selectedBrand) {
    selectedSocket = '';
    selectedModel = '';
  }

  $: if (selectedSocket) {
    selectedModel = '';
  }
</script>

<style>
  .cpu-selector-card {
    background-color: rgba(255, 255, 255, 0.1);
    border-radius: 1rem;
    padding: 2rem;
    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
  }
  .select-container {
    display: flex;
    flex-direction: column;
    align-items: center;
  }
  .select {
    width: 200px;
  }
</style>

<div class="flex justify-center items-center min-h-screen py-8">
  <div class="cpu-selector-card max-w-md">
    <header>
      <h2 class="text-2xl font-bold mb-6 text-center">CPU Selector</h2>
    </header>
    <section class="space-y-4 select-container">
      <label class="label">
        <span>CPU Brand</span>
        <select class="select" bind:value={selectedBrand}>
          <option value="">Select a brand</option>
          {#each brands as brand}
            <option value={brand.value}>{brand.name}</option>
          {/each}
        </select>
      </label>

      <label class="label">
        <span>CPU Socket</span>
        <select class="select" bind:value={selectedSocket} disabled={!selectedBrand}>
          <option value="">Select a socket</option>
          {#each availableSockets as socket}
            <option value={socket.value}>{socket.name}</option>
          {/each}
        </select>
      </label>

      <label class="label">
        <span>CPU Model</span>
        <select class="select" bind:value={selectedModel} disabled={!selectedSocket}>
          <option value="">Select a model</option>
          {#each availableModels as model}
            <option value={model.value}>{model.name}</option>
          {/each}
        </select>
      </label>
    </section>
  </div>
</div>
Editor is loading...
Leave a Comment