@motion-proto/live-tokens 0.1.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.
Files changed (68) hide show
  1. package/README.md +41 -0
  2. package/dist-plugin/index.cjs +444 -0
  3. package/dist-plugin/index.d.cts +12 -0
  4. package/dist-plugin/index.d.ts +12 -0
  5. package/dist-plugin/index.js +407 -0
  6. package/package.json +86 -0
  7. package/src/components/Badge.svelte +82 -0
  8. package/src/components/Button.svelte +333 -0
  9. package/src/components/Card.svelte +83 -0
  10. package/src/components/CollapsibleSection.svelte +82 -0
  11. package/src/components/DetailNav.svelte +78 -0
  12. package/src/components/Dialog.svelte +269 -0
  13. package/src/components/InlineEditActions.svelte +73 -0
  14. package/src/components/Notification.svelte +308 -0
  15. package/src/components/ProgressBar.svelte +99 -0
  16. package/src/components/RadioButton.svelte +87 -0
  17. package/src/components/SectionDivider.svelte +121 -0
  18. package/src/components/TabBar.svelte +92 -0
  19. package/src/components/Toggle.svelte +86 -0
  20. package/src/components/Tooltip.svelte +64 -0
  21. package/src/lib/ColumnsOverlay.svelte +120 -0
  22. package/src/lib/LiveEditorOverlay.svelte +467 -0
  23. package/src/lib/columnsOverlay.ts +26 -0
  24. package/src/lib/cssVarSync.ts +72 -0
  25. package/src/lib/editorConfig.ts +9 -0
  26. package/src/lib/editorConfigStore.ts +14 -0
  27. package/src/lib/index.ts +51 -0
  28. package/src/lib/oklch.ts +129 -0
  29. package/src/lib/pageSource.ts +6 -0
  30. package/src/lib/tokenInit.ts +29 -0
  31. package/src/lib/tokenService.ts +144 -0
  32. package/src/lib/tokenTypes.ts +45 -0
  33. package/src/pages/Admin.svelte +100 -0
  34. package/src/pages/ShowcasePage.svelte +146 -0
  35. package/src/showcase/BackupBrowser.svelte +617 -0
  36. package/src/showcase/BezierCurveEditor.svelte +648 -0
  37. package/src/showcase/ColorEditPanel.svelte +498 -0
  38. package/src/showcase/ComponentsTab.svelte +107 -0
  39. package/src/showcase/EditorDialog.svelte +137 -0
  40. package/src/showcase/PaletteEditor.svelte +2579 -0
  41. package/src/showcase/PaletteSelector.svelte +627 -0
  42. package/src/showcase/SurfacesTab.svelte +409 -0
  43. package/src/showcase/TextTab.svelte +205 -0
  44. package/src/showcase/TokenFileManager.svelte +683 -0
  45. package/src/showcase/TokenMap.svelte +54 -0
  46. package/src/showcase/VariablesTab.svelte +2657 -0
  47. package/src/showcase/VisualsTab.svelte +233 -0
  48. package/src/showcase/curveEngine.ts +190 -0
  49. package/src/showcase/demos/BadgeDemo.svelte +58 -0
  50. package/src/showcase/demos/CardDemo.svelte +52 -0
  51. package/src/showcase/demos/ChoiceButtonsDemo.svelte +194 -0
  52. package/src/showcase/demos/CollapsibleSectionDemo.svelte +56 -0
  53. package/src/showcase/demos/DialogDemo.svelte +42 -0
  54. package/src/showcase/demos/InlineEditActionsDemo.svelte +27 -0
  55. package/src/showcase/demos/NotificationDemo.svelte +149 -0
  56. package/src/showcase/demos/ProgressBarDemo.svelte +56 -0
  57. package/src/showcase/demos/RadioButtonDemo.svelte +58 -0
  58. package/src/showcase/demos/SectionDividerDemo.svelte +79 -0
  59. package/src/showcase/demos/StandardButtonsDemo.svelte +457 -0
  60. package/src/showcase/demos/TabBarDemo.svelte +60 -0
  61. package/src/showcase/demos/TooltipDemo.svelte +54 -0
  62. package/src/showcase/editor.css +93 -0
  63. package/src/showcase/index.ts +17 -0
  64. package/src/styles/fonts/Domine/Domine-VariableFont_wght.ttf +0 -0
  65. package/src/styles/fonts/Domine/OFL.txt +97 -0
  66. package/src/styles/fonts/Domine/README.txt +66 -0
  67. package/src/styles/fonts.css +18 -0
  68. package/src/styles/form-controls.css +190 -0
@@ -0,0 +1,99 @@
1
+ <script lang="ts">
2
+ export let value: number = 0;
3
+ export let label: string = '';
4
+ export let variant: 'primary' | 'success' | 'warning' | 'danger' | 'info' = 'primary';
5
+ export let size: 'default' | 'compact' = 'default';
6
+ export let showIcon: boolean = true;
7
+
8
+ $: clampedValue = Math.min(100, Math.max(0, value));
9
+ $: isComplete = clampedValue >= 100;
10
+ </script>
11
+
12
+ <div class="progress" class:compact={size === 'compact'}>
13
+ {#if label}
14
+ <div class="progress-label">
15
+ <span>{label}</span>
16
+ <span class="progress-value">{clampedValue}%</span>
17
+ </div>
18
+ {/if}
19
+ <div class="progress-track">
20
+ <div
21
+ class="progress-fill {variant}"
22
+ style="width: {clampedValue}%;"
23
+ ></div>
24
+ </div>
25
+ {#if showIcon && isComplete}
26
+ <div class="progress-icon">
27
+ <i class="fas fa-check-circle"></i>
28
+ </div>
29
+ {/if}
30
+ </div>
31
+
32
+ <style>
33
+ .progress {
34
+ display: flex;
35
+ flex-direction: column;
36
+ gap: var(--space-6);
37
+ width: 100%;
38
+ }
39
+
40
+ .progress-label {
41
+ display: flex;
42
+ justify-content: space-between;
43
+ align-items: center;
44
+ font-size: var(--font-sm);
45
+ color: var(--text-secondary);
46
+ font-weight: var(--font-weight-medium);
47
+ }
48
+
49
+ .progress-value {
50
+ font-size: var(--font-xs);
51
+ color: var(--text-tertiary);
52
+ font-family: 'Courier New', monospace;
53
+ }
54
+
55
+ .progress-track {
56
+ width: 100%;
57
+ height: 8px;
58
+ background: var(--surface-neutral-low);
59
+ border-radius: var(--radius-full);
60
+ overflow: hidden;
61
+ border: 1px solid var(--border-neutral-faint);
62
+ }
63
+
64
+ .compact .progress-track {
65
+ height: 4px;
66
+ }
67
+
68
+ .progress-fill {
69
+ height: 100%;
70
+ border-radius: var(--radius-full);
71
+ transition: width 0.4s ease;
72
+ }
73
+
74
+ .progress-fill.primary {
75
+ background: var(--gradient-progress);
76
+ }
77
+
78
+ .progress-fill.success {
79
+ background: var(--border-success);
80
+ }
81
+
82
+ .progress-fill.warning {
83
+ background: var(--border-warning);
84
+ }
85
+
86
+ .progress-fill.danger {
87
+ background: var(--border-danger);
88
+ }
89
+
90
+ .progress-fill.info {
91
+ background: var(--border-info);
92
+ }
93
+
94
+ .progress-icon {
95
+ color: var(--text-success);
96
+ font-size: var(--font-md);
97
+ text-align: right;
98
+ }
99
+ </style>
@@ -0,0 +1,87 @@
1
+ <script lang="ts">
2
+ import { createEventDispatcher } from 'svelte';
3
+
4
+ export let active: boolean = false;
5
+ export let icon: string;
6
+ export let label: string;
7
+ export let color: string = 'var(--text-secondary)';
8
+
9
+ const dispatch = createEventDispatcher();
10
+ </script>
11
+
12
+ <button
13
+ class="radio-button"
14
+ class:active
15
+ style="--radio-color: {color};"
16
+ on:click={() => dispatch('click')}
17
+ >
18
+ <span class="radio-dot" class:filled={active}></span>
19
+ <i class={icon + ' fa-fw radio-icon'}></i>
20
+ <span class="radio-label">{label}</span>
21
+ </button>
22
+
23
+ <style lang="scss">
24
+ .radio-button {
25
+ display: inline-flex;
26
+ align-items: center;
27
+ justify-content: flex-start;
28
+ gap: var(--space-4);
29
+ width: 120px;
30
+ height: 1rem;
31
+ padding: 0 var(--space-4);
32
+ background: transparent;
33
+ border: none;
34
+ border-radius: var(--radius-lg);
35
+ cursor: pointer;
36
+ transition: all 0.2s ease;
37
+ line-height: 1;
38
+
39
+ &:hover {
40
+ background: linear-gradient(
41
+ 135deg,
42
+ color-mix(in srgb, var(--radio-color) 12%, var(--surface-neutral-lowest)),
43
+ var(--surface-neutral-lowest)
44
+ );
45
+ }
46
+
47
+ &.active {
48
+ background: linear-gradient(
49
+ 135deg,
50
+ color-mix(in srgb, var(--radio-color) 15%, var(--surface-neutral-lowest)),
51
+ color-mix(in srgb, var(--radio-color) 5%, var(--surface-neutral-lowest))
52
+ );
53
+ }
54
+ }
55
+
56
+ .radio-dot {
57
+ width: 0.75rem;
58
+ height: 0.75rem;
59
+ border-radius: 50%;
60
+ border: 2px solid var(--border-neutral-default);
61
+ flex-shrink: 0;
62
+ transition: all 0.2s ease;
63
+
64
+ .radio-button:hover & {
65
+ border-color: var(--radio-color);
66
+ }
67
+
68
+ &.filled {
69
+ border-color: var(--radio-color);
70
+ background: var(--radio-color);
71
+ box-shadow: inset 0 0 0 2px var(--surface-neutral-lowest);
72
+ }
73
+ }
74
+
75
+ .radio-icon {
76
+ font-size: var(--font-lg);
77
+ color: var(--radio-color);
78
+ line-height: 1;
79
+ }
80
+
81
+ .radio-label {
82
+ font-size: var(--font-md);
83
+ font-weight: var(--font-weight-bold);
84
+ color: var(--text-primary);
85
+ line-height: 1;
86
+ }
87
+ </style>
@@ -0,0 +1,121 @@
1
+ <script lang="ts">
2
+ export let title: string;
3
+ export let description: string | undefined = undefined;
4
+ export let variant: 'bg' | 'neutral' | 'alternate' | 'primary' | 'accent' | 'special' = 'bg';
5
+ </script>
6
+
7
+ <div class="section-divider variant-{variant}">
8
+ <span class="divider-label">{title}</span>
9
+ {#if description}
10
+ <p class="divider-description">{description}</p>
11
+ {/if}
12
+ </div>
13
+
14
+ <style>
15
+ .section-divider {
16
+ margin: var(--space-24) 0;
17
+ padding: var(--space-16) var(--space-24);
18
+ border-radius: var(--radius-lg);
19
+ background: linear-gradient(135deg,
20
+ var(--_divider-1) 0%,
21
+ var(--_divider-2) 30%,
22
+ var(--_divider-3) 60%,
23
+ var(--_divider-4) 100%
24
+ );
25
+ }
26
+
27
+ /* Variant palette mappings */
28
+ .variant-bg {
29
+ --_divider-1: var(--surface-bg-highest);
30
+ --_divider-2: var(--surface-bg-higher);
31
+ --_divider-3: var(--surface-bg-high);
32
+ --_divider-4: var(--surface-bg);
33
+ --_divider-stroke: var(--surface-bg-lowest);
34
+ }
35
+
36
+ .variant-neutral {
37
+ --_divider-1: var(--surface-neutral-highest);
38
+ --_divider-2: var(--surface-neutral-higher);
39
+ --_divider-3: var(--surface-neutral-high);
40
+ --_divider-4: var(--surface-neutral);
41
+ --_divider-stroke: var(--surface-neutral-lowest);
42
+ }
43
+
44
+ .variant-alternate {
45
+ --_divider-1: var(--surface-alternate-highest);
46
+ --_divider-2: var(--surface-alternate-higher);
47
+ --_divider-3: var(--surface-alternate-high);
48
+ --_divider-4: var(--surface-alternate);
49
+ --_divider-stroke: var(--surface-alternate-lowest);
50
+ }
51
+
52
+ .variant-primary {
53
+ --_divider-1: var(--surface-primary-highest);
54
+ --_divider-2: var(--surface-primary-higher);
55
+ --_divider-3: var(--surface-primary-high);
56
+ --_divider-4: var(--surface-primary);
57
+ --_divider-stroke: var(--surface-primary-lowest);
58
+ }
59
+
60
+ .variant-accent {
61
+ --_divider-1: var(--surface-accent-highest);
62
+ --_divider-2: var(--surface-accent-higher);
63
+ --_divider-3: var(--surface-accent-high);
64
+ --_divider-4: var(--surface-accent);
65
+ --_divider-stroke: var(--surface-accent-lowest);
66
+ }
67
+
68
+ .variant-special {
69
+ --_divider-1: var(--surface-special-highest);
70
+ --_divider-2: var(--surface-special-higher);
71
+ --_divider-3: var(--surface-special-high);
72
+ --_divider-4: var(--surface-special);
73
+ --_divider-stroke: var(--surface-special-lowest);
74
+ }
75
+
76
+ .divider-label {
77
+ display: block;
78
+ font-family: var(--font-display);
79
+ font-size: var(--font-5xl);
80
+ line-height: 1.05;
81
+ color: #fff;
82
+ overflow-wrap: break-word;
83
+ word-wrap: break-word;
84
+ hyphens: auto;
85
+ text-shadow:
86
+ -4px -4px 0 var(--_divider-stroke),
87
+ 4px -4px 0 var(--_divider-stroke),
88
+ -4px 4px 0 var(--_divider-stroke),
89
+ 4px 4px 0 var(--_divider-stroke),
90
+ 0 -4px 0 var(--_divider-stroke),
91
+ 0 4px 0 var(--_divider-stroke),
92
+ -4px 0 0 var(--_divider-stroke),
93
+ 4px 0 0 var(--_divider-stroke);
94
+ }
95
+
96
+ .divider-description {
97
+ margin: var(--space-4) 0 0;
98
+ font-family: var(--font-sans);
99
+ font-size: var(--font-md);
100
+ color: rgba(255, 255, 255, 0.8);
101
+ line-height: var(--line-height-normal);
102
+ }
103
+
104
+ @media (max-width: 600px) {
105
+ .section-divider {
106
+ padding: var(--space-12) var(--space-16);
107
+ }
108
+
109
+ .divider-label {
110
+ text-shadow:
111
+ -2px -2px 0 var(--_divider-stroke),
112
+ 2px -2px 0 var(--_divider-stroke),
113
+ -2px 2px 0 var(--_divider-stroke),
114
+ 2px 2px 0 var(--_divider-stroke),
115
+ 0 -2px 0 var(--_divider-stroke),
116
+ 0 2px 0 var(--_divider-stroke),
117
+ -2px 0 0 var(--_divider-stroke),
118
+ 2px 0 0 var(--_divider-stroke);
119
+ }
120
+ }
121
+ </style>
@@ -0,0 +1,92 @@
1
+ <script lang="ts">
2
+ import { createEventDispatcher } from 'svelte';
3
+
4
+ interface Tab {
5
+ id: string;
6
+ label: string;
7
+ icon?: string;
8
+ disabled?: boolean;
9
+ }
10
+
11
+ export let tabs: Tab[] = [];
12
+ export let selectedTab: string = '';
13
+ export let iconOnly: boolean = false;
14
+
15
+ const dispatch = createEventDispatcher<{
16
+ tabChange: string;
17
+ }>();
18
+
19
+ function selectTab(tab: Tab) {
20
+ if (!tab.disabled) {
21
+ dispatch('tabChange', tab.id);
22
+ }
23
+ }
24
+ </script>
25
+
26
+ <div class="tab-bar">
27
+ {#each tabs as tab}
28
+ <button
29
+ class="tab"
30
+ class:active={selectedTab === tab.id}
31
+ class:icon-only={iconOnly}
32
+ disabled={tab.disabled}
33
+ on:click={() => selectTab(tab)}
34
+ >
35
+ {#if tab.icon}
36
+ <i class={tab.icon}></i>
37
+ {/if}
38
+ {#if !iconOnly}
39
+ <span>{tab.label}</span>
40
+ {/if}
41
+ </button>
42
+ {/each}
43
+ </div>
44
+
45
+ <style>
46
+ .tab-bar {
47
+ display: flex;
48
+ gap: var(--space-2);
49
+ border-bottom: 1px solid var(--border-neutral-subtle);
50
+ padding: 0 var(--space-8);
51
+ }
52
+
53
+ .tab {
54
+ display: inline-flex;
55
+ align-items: center;
56
+ gap: var(--space-6);
57
+ padding: var(--space-8) var(--space-16);
58
+ background: transparent;
59
+ border: none;
60
+ border-bottom: 2px solid transparent;
61
+ color: var(--text-tertiary);
62
+ font-size: var(--font-md);
63
+ font-weight: var(--font-weight-medium);
64
+ cursor: pointer;
65
+ transition: all var(--transition-fast);
66
+ position: relative;
67
+ }
68
+
69
+ .tab:hover:not(:disabled):not(.active) {
70
+ color: var(--text-secondary);
71
+ background: var(--hover-low);
72
+ }
73
+
74
+ .tab.active {
75
+ color: var(--text-primary);
76
+ border-bottom-color: var(--color-primary-500);
77
+ background: linear-gradient(to bottom, transparent, var(--overlay-lowest));
78
+ }
79
+
80
+ .tab:disabled {
81
+ opacity: var(--opacity-disabled);
82
+ cursor: not-allowed;
83
+ }
84
+
85
+ .tab.icon-only {
86
+ padding: var(--space-8) var(--space-12);
87
+ }
88
+
89
+ .tab i {
90
+ font-size: var(--font-md);
91
+ }
92
+ </style>
@@ -0,0 +1,86 @@
1
+ <script lang="ts">
2
+ export let checked: boolean = false;
3
+ export let disabled: boolean = false;
4
+ export let label: string = '';
5
+ </script>
6
+
7
+ <label class="toggle" class:disabled>
8
+ <button
9
+ type="button"
10
+ role="switch"
11
+ aria-checked={checked}
12
+ {disabled}
13
+ class="toggle-track"
14
+ class:on={checked}
15
+ on:click={() => { if (!disabled) checked = !checked; }}
16
+ >
17
+ <span class="toggle-thumb" />
18
+ </button>
19
+ {#if label}
20
+ <span class="toggle-label">{label}</span>
21
+ {/if}
22
+ </label>
23
+
24
+ <style lang="scss">
25
+ .toggle {
26
+ display: inline-flex;
27
+ align-items: center;
28
+ gap: var(--space-8);
29
+ cursor: pointer;
30
+ user-select: none;
31
+
32
+ &.disabled {
33
+ opacity: var(--opacity-disabled);
34
+ cursor: not-allowed;
35
+ }
36
+ }
37
+
38
+ .toggle-track {
39
+ position: relative;
40
+ width: 2.25rem;
41
+ height: 1.25rem;
42
+ border-radius: 0.625rem;
43
+ border: 1px solid var(--ui-border-default);
44
+ background: var(--ui-surface-low);
45
+ padding: 0;
46
+ cursor: inherit;
47
+ transition: background var(--transition-fast), border-color var(--transition-fast);
48
+ flex-shrink: 0;
49
+
50
+ &.on {
51
+ background: var(--ui-toggle);
52
+ border-color: var(--ui-border-medium);
53
+ }
54
+
55
+ &:hover:not(:disabled) {
56
+ border-color: var(--ui-border-medium);
57
+ }
58
+
59
+ &:focus-visible {
60
+ outline: 2px solid var(--border-primary);
61
+ outline-offset: 2px;
62
+ }
63
+ }
64
+
65
+ .toggle-thumb {
66
+ position: absolute;
67
+ top: 2px;
68
+ left: 2px;
69
+ width: 0.875rem;
70
+ height: 0.875rem;
71
+ border-radius: 50%;
72
+ background: var(--ui-text-secondary);
73
+ transition: transform var(--transition-fast), background var(--transition-fast);
74
+
75
+ .on & {
76
+ transform: translateX(1rem);
77
+ background: var(--text-primary);
78
+ }
79
+ }
80
+
81
+ .toggle-label {
82
+ font-size: var(--font-md);
83
+ color: var(--ui-text-secondary);
84
+ line-height: 1;
85
+ }
86
+ </style>
@@ -0,0 +1,64 @@
1
+ <script lang="ts">
2
+ export let text: string = '';
3
+ export let position: 'top' | 'bottom' = 'top';
4
+ </script>
5
+
6
+ <div class="tooltip-wrapper">
7
+ <slot />
8
+ {#if text}
9
+ <div class="tooltip" class:bottom={position === 'bottom'}>
10
+ {text}
11
+ </div>
12
+ {/if}
13
+ </div>
14
+
15
+ <style>
16
+ .tooltip-wrapper {
17
+ position: relative;
18
+ display: inline-block;
19
+ }
20
+
21
+ .tooltip {
22
+ position: absolute;
23
+ bottom: calc(100% + 8px);
24
+ left: 50%;
25
+ transform: translateX(-50%);
26
+ background: var(--surface-neutral-highest);
27
+ color: var(--text-primary);
28
+ padding: var(--space-6) var(--space-12);
29
+ border-radius: var(--radius-md);
30
+ font-size: var(--font-sm);
31
+ white-space: nowrap;
32
+ pointer-events: none;
33
+ opacity: 0;
34
+ transition: opacity var(--transition-fast);
35
+ z-index: var(--z-tooltip);
36
+ box-shadow: var(--shadow-md);
37
+ }
38
+
39
+ .tooltip::after {
40
+ content: '';
41
+ position: absolute;
42
+ top: 100%;
43
+ left: 50%;
44
+ transform: translateX(-50%);
45
+ border: 5px solid transparent;
46
+ border-top-color: var(--surface-neutral-highest);
47
+ }
48
+
49
+ .tooltip.bottom {
50
+ bottom: auto;
51
+ top: calc(100% + 8px);
52
+ }
53
+
54
+ .tooltip.bottom::after {
55
+ top: auto;
56
+ bottom: 100%;
57
+ border-top-color: transparent;
58
+ border-bottom-color: var(--surface-neutral-highest);
59
+ }
60
+
61
+ .tooltip-wrapper:hover .tooltip {
62
+ opacity: 1;
63
+ }
64
+ </style>
@@ -0,0 +1,120 @@
1
+ <script lang="ts">
2
+ import { onMount } from 'svelte';
3
+ import { columnsVisible } from './columnsOverlay';
4
+
5
+ let count = 12;
6
+ let gutter = '';
7
+ let margin = '';
8
+
9
+ function readTokens() {
10
+ const cs = getComputedStyle(document.documentElement);
11
+ const rawCount = cs.getPropertyValue('--columns-count').trim();
12
+ const parsed = parseInt(rawCount, 10);
13
+ if (!Number.isNaN(parsed) && parsed > 0) count = parsed;
14
+ gutter = cs.getPropertyValue('--columns-gutter').trim();
15
+ margin = cs.getPropertyValue('--columns-margin').trim();
16
+ }
17
+
18
+ onMount(() => {
19
+ readTokens();
20
+ const onResize = () => readTokens();
21
+ window.addEventListener('resize', onResize);
22
+
23
+ const observer = new MutationObserver(readTokens);
24
+ observer.observe(document.documentElement, {
25
+ attributes: true,
26
+ attributeFilter: ['style'],
27
+ });
28
+
29
+ return () => {
30
+ window.removeEventListener('resize', onResize);
31
+ observer.disconnect();
32
+ };
33
+ });
34
+ </script>
35
+
36
+ {#if $columnsVisible}
37
+ <div class="columns-overlay" aria-hidden="true">
38
+ <div class="columns-overlay__inner">
39
+ {#each Array(count) as _, i}
40
+ <div class="columns-overlay__col">
41
+ <span class="columns-overlay__num">{i + 1}</span>
42
+ </div>
43
+ {/each}
44
+ </div>
45
+ <div class="columns-overlay__info">
46
+ <i class="fas fa-grip-lines-vertical"></i>
47
+ <span>{count} col</span>
48
+ <span class="sep">·</span>
49
+ <span>gutter {gutter || 'var(--columns-gutter)'}</span>
50
+ <span class="sep">·</span>
51
+ <span>margin {margin || 'var(--columns-margin)'}</span>
52
+ </div>
53
+ </div>
54
+ {/if}
55
+
56
+ <style>
57
+ .columns-overlay {
58
+ position: fixed;
59
+ inset: 0;
60
+ pointer-events: none;
61
+ z-index: 1500;
62
+ padding-inline: var(--columns-margin);
63
+ display: flex;
64
+ justify-content: center;
65
+ }
66
+
67
+ .columns-overlay__inner {
68
+ width: 100%;
69
+ max-width: var(--columns-max-width);
70
+ height: 100%;
71
+ display: grid;
72
+ grid-template-columns: repeat(var(--columns-count, 12), 1fr);
73
+ gap: var(--columns-gutter);
74
+ }
75
+
76
+ .columns-overlay__col {
77
+ background: rgba(239, 68, 68, 0.04);
78
+ border-left: 1px dashed rgba(239, 68, 68, 0.22);
79
+ border-right: 1px dashed rgba(239, 68, 68, 0.22);
80
+ }
81
+
82
+ .columns-overlay__num {
83
+ display: block;
84
+ font-family: var(--font-mono);
85
+ font-size: 9px;
86
+ line-height: 1;
87
+ color: rgba(255, 255, 255, 0.4);
88
+ text-align: center;
89
+ padding-top: 3px;
90
+ }
91
+
92
+ .columns-overlay__info {
93
+ position: fixed;
94
+ left: 12px;
95
+ bottom: 12px;
96
+ display: inline-flex;
97
+ align-items: center;
98
+ gap: 6px;
99
+ padding: 5px 9px;
100
+ background: rgba(0, 0, 0, 0.72);
101
+ backdrop-filter: blur(6px);
102
+ -webkit-backdrop-filter: blur(6px);
103
+ border: 1px solid rgba(255, 255, 255, 0.1);
104
+ border-radius: 4px;
105
+ font-family: var(--font-mono);
106
+ font-size: 10px;
107
+ color: rgba(255, 255, 255, 0.75);
108
+ letter-spacing: 0.02em;
109
+ white-space: nowrap;
110
+ }
111
+
112
+ .columns-overlay__info i {
113
+ font-size: 9px;
114
+ opacity: 0.7;
115
+ }
116
+
117
+ .columns-overlay__info .sep {
118
+ opacity: 0.4;
119
+ }
120
+ </style>