Graphical PDS migrator for AT Protocol
1@import url("https://fonts.googleapis.com/css2?family=Share+Tech+Mono&display=swap");
2@import url("https://fonts.googleapis.com/css2?family=Share+Tech+Mono&family=Space+Mono:ital,wght@0,400;0,700;1,400;1,700&display=swap");
3
4@font-face {
5 font-family: "Skyfont";
6 src: url("fonts/skyfont.regular.otf") format("opentype");
7 font-weight: normal;
8 font-style: normal;
9}
10
11@font-face {
12 font-family: "F25_Bank_Printer";
13 src: url("fonts/F25_Bank_Printer.ttf") format("truetype");
14 font-weight: normal;
15 font-style: normal;
16}
17
18@tailwind base;
19@tailwind components;
20@tailwind utilities;
21
22@keyframes fadeOut {
23 0% {
24 opacity: 1;
25 }
26 75% {
27 opacity: 1;
28 } /* Hold full opacity for most of the animation */
29 100% {
30 opacity: 0;
31 }
32}
33
34.status-message-fade {
35 animation: fadeOut 2s forwards;
36}
37
38.font-spectral {
39 font-family: "Spectral", serif;
40}
41
42.grow-wrap {
43 /* easy way to plop the elements on top of each other and have them both sized based on the tallest one's height */
44 display: grid;
45}
46.grow-wrap::after {
47 /* Note the weird space! Needed to preventy jumpy behavior */
48 content: attr(data-replicated-value) " ";
49
50 /* This is how textarea text behaves */
51 white-space: pre-wrap;
52
53 /* Hidden from view, clicks, and screen readers */
54 visibility: hidden;
55}
56.grow-wrap > textarea {
57 /* You could leave this, but after a user resizes, then it ruins the auto sizing */
58 resize: none;
59
60 /* Firefox shows scrollbar on growth, you can hide like this. */
61 overflow: hidden;
62}
63.grow-wrap > textarea,
64.grow-wrap::after {
65 /* Identical styling required!! */
66 font: inherit;
67
68 /* Place on top of each other */
69 grid-area: 1 / 1 / 2 / 2;
70}
71
72/* Base styling */
73@layer base {
74 body {
75 @apply bg-gray-50 dark:bg-gray-900 text-gray-900 dark:text-gray-100;
76 font-family: Space Mono;
77 }
78 button {
79 @apply rounded-xl;
80 }
81
82 input {
83 @apply px-4 py-2;
84 }
85
86 h1,
87 h2,
88 h3,
89 h4,
90 h5 {
91 font-family: Share Tech Mono, monospace;
92 }
93}
94
95.ticket {
96 font-family: F25_Bank_Printer, monospace;
97 @apply bg-white dark:bg-gray-800 p-8 relative overflow-hidden;
98 position: relative;
99 /* Angled corners */
100 clip-path: polygon(
101 20px 0,
102 /* Top left corner */ calc(100% - 20px) 0,
103 /* Top right corner */ 100% 20px,
104 /* Top right */ 100% calc(100% - 20px),
105 /* Bottom right */ calc(100% - 20px) 100%,
106 /* Bottom right corner */ 20px 100%,
107 /* Bottom left corner */ 0 calc(100% - 20px),
108 /* Bottom left */ 0 20px /* Back to top left */
109 );
110}
111
112/* Create side perforations using pseudo-elements */
113.ticket::before,
114.ticket::after {
115 content: "";
116 position: absolute;
117 top: 30px;
118 bottom: 30px;
119 width: 1px;
120 background-image: linear-gradient(
121 to bottom,
122 transparent 0%,
123 transparent 40%,
124 currentColor 40%,
125 currentColor 60%,
126 transparent 60%,
127 transparent 100%
128 );
129 background-size: 100% 20px;
130 background-repeat: repeat-y;
131 opacity: 0.2;
132}
133
134.ticket::before {
135 left: 8px;
136}
137
138.ticket::after {
139 right: 8px;
140}
141
142.dark .ticket {
143 background-image:
144 radial-gradient(
145 circle at 10px center,
146 rgb(17 24 39) 4px,
147 transparent 4px
148 ),
149 radial-gradient(
150 circle at calc(100% - 10px) center,
151 rgb(17 24 39) 4px,
152 transparent 4px
153 );
154}
155
156/* Remove the previous background images and corner cuts */
157.ticket::before,
158.ticket::after {
159 display: none;
160}
161
162.boarding-label {
163 @apply absolute top-2 right-2 bg-blue-100 dark:bg-blue-900 px-3 py-1
164 rounded-full text-xs font-bold uppercase tracking-wider;
165 transform: rotate(2deg);
166}
167
168.flight-info {
169 @apply flex justify-between items-center mt-4 pt-4 border-t border-dashed;
170}
171
172.passenger-info {
173 @apply text-sm text-gray-600 dark:text-gray-400 mt-2;
174}
175
176/* Modern Airport Sign Styles */
177.airport-sign {
178 position: relative;
179 transform-origin: top;
180 transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
181 border-radius: 0.5rem;
182 backdrop-filter: blur(8px);
183}
184
185/* Dropdown panel styles */
186.airport-sign + div {
187 border-radius: 0.5rem;
188 backdrop-filter: blur(8px);
189}
190
191/* Remove old texture styles */
192.airport-sign,
193.airport-sign + div {
194 background-blend-mode: overlay;
195}
196
197@keyframes popin {
198 0% {
199 opacity: 0;
200 transform: scale(0.95);
201 }
202 100% {
203 opacity: 1;
204 transform: scale(1);
205 }
206}
207.animate-popin {
208 animation: popin 0.25s cubic-bezier(0.4, 0, 0.2, 1);
209}
210@keyframes bounce-short {
211 0%, 100% {
212 transform: translateY(0);
213 }
214 50% {
215 transform: translateY(-8px);
216 }
217}
218.animate-bounce-short {
219 animation: bounce-short 0.5s;
220}