@kerkhoff-ict/solora 2.1.9 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.css CHANGED
@@ -429,8 +429,8 @@
429
429
  }
430
430
  }
431
431
 
432
- /* src/components/dropdown.css */
433
- .dropdown {
432
+ /* src/components/dropdown-style.css */
433
+ .sol-container {
434
434
  position: relative;
435
435
  display: inline-block;
436
436
  font-family:
@@ -438,147 +438,81 @@
438
438
  BlinkMacSystemFont,
439
439
  "Segoe UI",
440
440
  Roboto,
441
- Helvetica,
442
- Arial,
443
441
  sans-serif;
444
442
  cursor: pointer;
445
443
  user-select: none;
446
444
  }
447
- .dropdown-btn {
448
- padding: 0.3rem 0.4rem;
445
+ .sol-btn {
446
+ padding: 0.5rem 0.8rem;
449
447
  border-radius: 12px;
450
448
  border: 1px solid rgba(0, 0, 0, 0.1);
451
449
  background: var(--color-bg, #fefefe);
452
450
  color: var(--color-text-dark, #000);
453
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
451
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
454
452
  transition: all 0.2s ease;
455
453
  display: flex;
456
454
  align-items: center;
457
455
  justify-content: space-between;
458
- white-space: nowrap;
459
- overflow: hidden;
460
- text-overflow: ellipsis;
456
+ gap: 10px;
461
457
  }
462
- .dropdown-btn:hover {
463
- background: var(--color-bg-hover, rgba(0, 0, 0, 0.05));
458
+ .sol-btn:hover {
459
+ background: rgba(0, 0, 0, 0.03);
464
460
  }
465
- .dropdown-btn:after {
461
+ .sol-btn::after {
466
462
  content: "\25be";
467
- margin-left: 0.5rem;
468
- font-size: 0.75rem;
463
+ font-size: 0.8rem;
469
464
  transition: transform 0.2s ease;
470
465
  }
471
- .dropdown.open .dropdown-btn:after {
466
+ .sol-container.open .sol-btn::after {
472
467
  transform: rotate(180deg);
473
468
  }
474
- .dropdown-content {
469
+ .sol-menu {
475
470
  position: absolute;
476
471
  top: 100%;
477
472
  left: 0;
478
- width: 100%;
479
- min-width: 10rem;
480
- border-radius: 12px;
473
+ min-width: 100%;
481
474
  margin-top: 0.5rem;
482
- overflow: hidden;
483
- overflow-y: auto;
484
- background: transparent;
475
+ border-radius: 12px;
476
+ background: rgba(255, 255, 255, 0.7);
485
477
  border: 1px solid rgba(255, 255, 255, 0.3);
486
478
  backdrop-filter: blur(12px);
487
479
  -webkit-backdrop-filter: blur(12px);
488
480
  box-shadow: 0 12px 32px rgba(0, 0, 0, 0.12);
489
- max-height: 15rem;
490
- scrollbar-width: thin;
491
- scrollbar-color: rgba(0, 0, 0, 0.2) transparent;
481
+ z-index: 1000;
492
482
  opacity: 0;
493
483
  transform: translateY(-10px) scale(0.95);
494
484
  pointer-events: none;
495
485
  transition: all 0.25s cubic-bezier(0.25, 0.8, 0.25, 1);
496
- z-index: 1000;
497
- }
498
- .dropdown-content::-webkit-scrollbar {
499
- width: 6px;
500
- }
501
- .dropdown-content::-webkit-scrollbar-thumb {
502
- background: rgba(0, 0, 0, 0.2);
503
- border-radius: 3px;
504
- }
505
- .dropdown-content::-webkit-scrollbar-track {
506
- background: transparent;
486
+ overflow: hidden;
507
487
  }
508
- .dropdown.open .dropdown-content {
488
+ .sol-container.open .sol-menu {
509
489
  opacity: 1;
510
490
  transform: translateY(0) scale(1);
511
491
  pointer-events: auto;
512
492
  }
513
- .dropdown-item {
514
- padding: 0.3rem 0.4rem;
515
- color: var(--color-text-dark, #000);
516
- transition: background 0.2s, color 0.2s;
517
- cursor: pointer;
493
+ .sol-item {
494
+ padding: 0.6rem 0.8rem;
495
+ transition: background 0.2s;
496
+ color: #000;
518
497
  }
519
- .dropdown-item:hover {
498
+ .sol-item:hover {
520
499
  background: rgba(0, 0, 0, 0.05);
521
500
  }
522
- .dropdown-item.active {
523
- font-weight: 600;
524
- background: rgba(0, 0, 0, 0.1);
525
- }
526
- .dropdown-item[aria-disabled=true],
527
- .dropdown-item.placeholder {
528
- color: rgba(0, 0, 0, 0.4);
529
- cursor: default;
530
- pointer-events: none;
531
- }
532
- .dropdown input[type=hidden] {
533
- display: none;
534
- }
535
- .dropdown-divider {
536
- height: 1px;
537
- margin: 0.25rem 0;
538
- background: rgba(0, 0, 0, 0.1);
539
- }
540
- .dropdown-label {
541
- padding: 0.3rem 0.4rem;
501
+ .sol-item.active {
502
+ background: rgba(0, 0, 0, 0.08);
542
503
  font-weight: 600;
543
- color: rgba(0, 0, 0, 0.6);
544
- cursor: default;
545
504
  }
546
- :root.dark .dropdown-btn {
505
+ :root.dark .sol-btn {
547
506
  background: #1c1c1e;
548
- color: #f0f0f0;
549
- border: 1px solid rgba(255, 255, 255, 0.2);
550
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.5);
551
- }
552
- :root.dark .dropdown-btn:hover {
553
- background: rgba(255, 255, 255, 0.05);
554
- }
555
- :root.dark .dropdown-content {
556
- background: transparent;
557
- backdrop-filter: blur(12px);
558
- -webkit-backdrop-filter: blur(12px);
559
- box-shadow: 0 12px 32px rgba(0, 0, 0, 0.6);
560
- }
561
- :root.dark .dropdown-item {
562
- color: #f0f0f0;
563
- }
564
- :root.dark .dropdown-item:hover {
565
- background: rgba(255, 255, 255, 0.08);
566
- }
567
- :root.dark .dropdown-item.active {
568
- background: rgba(255, 255, 255, 0.12);
569
- }
570
- :root.dark .dropdown-divider {
571
- background: rgba(255, 255, 255, 0.2);
572
- }
573
- :root.dark .dropdown-item[aria-disabled=true],
574
- :root.dark .dropdown-item.placeholder {
575
- color: rgba(255, 255, 255, 0.4);
507
+ color: #fff;
508
+ border-color: rgba(255, 255, 255, 0.1);
576
509
  }
577
- :root.dark .dropdown-label {
578
- color: rgba(255, 255, 255, 0.6);
510
+ :root.dark .sol-menu {
511
+ background: rgba(28, 28, 30, 0.7);
512
+ color: #fff;
579
513
  }
580
- :root.dark .dropdown-content::-webkit-scrollbar-thumb {
581
- background: rgba(255, 255, 255, 0.2);
514
+ :root.dark .sol-item {
515
+ color: #fff;
582
516
  }
583
517
 
584
518
  /* src/components/input.css */
package/dist/index.js CHANGED
@@ -1847,77 +1847,6 @@ function initMaximizeButton(block, maximizeBtn) {
1847
1847
  });
1848
1848
  }
1849
1849
 
1850
- // src/components/dropdown.js
1851
- function initDropdowns() {
1852
- if (typeof window === "undefined") return;
1853
- document.querySelectorAll(".dropdown").forEach((drop) => {
1854
- if (drop.dataset.initialized) return;
1855
- drop.dataset.initialized = "true";
1856
- const btn = drop.querySelector(".dropdown-btn");
1857
- const content = drop.querySelector(".dropdown-content");
1858
- if (!btn || !content) return;
1859
- let hiddenInput = drop.querySelector('input[type="hidden"]');
1860
- if (!hiddenInput) {
1861
- hiddenInput = document.createElement("input");
1862
- hiddenInput.type = "hidden";
1863
- hiddenInput.name = drop.dataset.name || "dropdown";
1864
- drop.appendChild(hiddenInput);
1865
- }
1866
- const getItems = () => Array.from(content.querySelectorAll('.dropdown-item:not([aria-disabled="true"])'));
1867
- const setValue = (item) => {
1868
- if (item.getAttribute("aria-disabled") === "true") return;
1869
- btn.innerHTML = item.innerHTML;
1870
- content.querySelectorAll(".dropdown-item").forEach((i) => i.classList.remove("active"));
1871
- item.classList.add("active");
1872
- hiddenInput.value = item.dataset.value ?? item.textContent.trim();
1873
- drop.dispatchEvent(new CustomEvent("change", { detail: hiddenInput.value }));
1874
- };
1875
- const initialItem = content.querySelector(".dropdown-item.active") || content.querySelector('.dropdown-item:not([aria-disabled="true"])');
1876
- if (initialItem) setValue(initialItem);
1877
- const toggle = () => drop.classList.toggle("open");
1878
- const close = () => drop.classList.remove("open");
1879
- btn.addEventListener("click", (e) => {
1880
- e.stopPropagation();
1881
- toggle();
1882
- });
1883
- document.addEventListener("click", (e) => {
1884
- if (!drop.contains(e.target)) close();
1885
- });
1886
- btn.addEventListener("keydown", (e) => {
1887
- if (!["ArrowDown", "ArrowUp", "Enter", "Escape"].includes(e.key)) return;
1888
- const items = getItems();
1889
- let currentIndex = items.findIndex((i) => i.classList.contains("active"));
1890
- e.preventDefault();
1891
- drop.classList.add("open");
1892
- if (e.key === "ArrowDown") {
1893
- currentIndex = (currentIndex + 1) % items.length;
1894
- } else if (e.key === "ArrowUp") {
1895
- currentIndex = (currentIndex - 1 + items.length) % items.length;
1896
- } else if (e.key === "Enter") {
1897
- if (currentIndex >= 0) setValue(items[currentIndex]);
1898
- close();
1899
- return;
1900
- } else if (e.key === "Escape") {
1901
- close();
1902
- return;
1903
- }
1904
- items.forEach((i) => i.classList.remove("active"));
1905
- items[currentIndex].classList.add("active");
1906
- items[currentIndex].scrollIntoView({ block: "nearest" });
1907
- });
1908
- content.addEventListener("click", (e) => {
1909
- const item = e.target.closest(".dropdown-item");
1910
- if (item) {
1911
- setValue(item);
1912
- close();
1913
- }
1914
- });
1915
- btn.setAttribute("tabindex", "0");
1916
- btn.setAttribute("role", "combobox");
1917
- btn.setAttribute("aria-haspopup", "listbox");
1918
- });
1919
- }
1920
-
1921
1850
  // src/components/contextMenu.js
1922
1851
  function initContextMenu() {
1923
1852
  let menu = document.querySelector(".sol-context-menu");
@@ -2268,19 +2197,80 @@ function initThemeToggle(elementSelector = ".sol-theme-toggle") {
2268
2197
  });
2269
2198
  }
2270
2199
 
2200
+ // src/components/sol-core.js
2201
+ function initSolCore() {
2202
+ const elements = document.querySelectorAll('[class*="sol-dropdown-w-["]');
2203
+ elements.forEach((el) => {
2204
+ const classList = Array.from(el.classList);
2205
+ const widthClass = classList.find((c) => c.startsWith("sol-dropdown-w-["));
2206
+ if (widthClass) {
2207
+ const widthValue = widthClass.match(/\[(.*?)\]/)[1];
2208
+ el.style.width = widthValue;
2209
+ const btn = el.querySelector(".sol-btn");
2210
+ if (btn) btn.style.width = "100%";
2211
+ }
2212
+ });
2213
+ }
2214
+
2215
+ // src/components/sol-select.js
2216
+ function initSolSelect() {
2217
+ document.querySelectorAll(".sol-select").forEach((select) => {
2218
+ const btn = select.querySelector(".sol-btn");
2219
+ const items = select.querySelectorAll(".sol-item");
2220
+ const input = select.querySelector('input[type="hidden"]');
2221
+ btn.addEventListener("click", (e) => {
2222
+ e.stopPropagation();
2223
+ select.classList.toggle("open");
2224
+ });
2225
+ items.forEach((item) => {
2226
+ item.addEventListener("click", () => {
2227
+ const val = item.dataset.value || item.innerText;
2228
+ btn.innerText = item.innerText;
2229
+ if (input) input.value = val;
2230
+ items.forEach((i) => i.classList.remove("active"));
2231
+ item.classList.add("active");
2232
+ select.classList.remove("open");
2233
+ });
2234
+ });
2235
+ });
2236
+ }
2237
+
2238
+ // src/components/sol-dropdown.js
2239
+ function initSolDropdown() {
2240
+ document.querySelectorAll(".sol-dropdown").forEach((dropdown) => {
2241
+ const btn = dropdown.querySelector(".sol-btn");
2242
+ btn.addEventListener("click", (e) => {
2243
+ e.stopPropagation();
2244
+ dropdown.classList.toggle("open");
2245
+ });
2246
+ dropdown.querySelectorAll(".sol-item").forEach((item) => {
2247
+ item.addEventListener("click", () => {
2248
+ dropdown.classList.remove("open");
2249
+ });
2250
+ });
2251
+ });
2252
+ document.addEventListener("click", () => {
2253
+ document.querySelectorAll(".sol-container").forEach((el) => el.classList.remove("open"));
2254
+ });
2255
+ }
2256
+
2271
2257
  // src/index.js
2272
2258
  if (typeof window !== "undefined") {
2273
2259
  document.addEventListener("DOMContentLoaded", () => {
2260
+ initSolCore();
2274
2261
  initCodeblocks();
2275
- initDropdowns();
2276
2262
  initContextMenu();
2277
2263
  initThemeToggle();
2264
+ initSolSelect();
2265
+ initSolDropdown();
2278
2266
  });
2279
2267
  }
2280
2268
  export {
2281
2269
  initCodeblocks,
2282
2270
  initContextMenu,
2283
- initDropdowns,
2271
+ initSolCore,
2272
+ initSolDropdown,
2273
+ initSolSelect,
2284
2274
  initThemeToggle
2285
2275
  };
2286
2276
  /*! Bundled license information:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kerkhoff-ict/solora",
3
- "version": "2.1.9",
3
+ "version": "2.2.0",
4
4
  "description": "Simple CSS component library",
5
5
  "main": "dist/index.js",
6
6
  "style": "dist/index.css",